日記

日本語の勉強のためのブログ

【GF】勇気炭酸のレパートリーについて

はじめに

ガールフレンド(仮)(以下、GFと表記)には、特定のイベントで使用可能なアイテムとして「勇気炭酸」というものが存在する。
このアイテムはイベントごとに名称が異なり、「勇気炭酸グレープ」、「勇気炭酸ライチ」のようなオーソドックスなものから、「勇気炭酸マヨネーズ」、「勇気炭酸チーズ」といった変わり種まで、様々なフレーバーが登場している。

図1. 代表的なゲテモノ・勇気炭酸チーズ

軽く調べた程度ではこの炭酸名をまとめたサイトは見つからなかったため、自分で調べることにした。

(1) 公式ブログに載っている分だけ

GF公式ブログ*1で「勇気炭酸」と検索し、さまざまな勇気炭酸を見つける。
ヒットした記事は全364件であり、(当たり前だが)記事検索には正規表現が使えないため、普通ならここからは人力で確認する必要がある。

しかし面倒なのでBeautifulSoupを使ってスクレイピングし、正規表現で炭酸名のみ取り出す。
検索にヒットした記事のタイトルや概要はdocument.querySelectorAll(".PcEntryListItem_Entry").innerText()(javascript)で確認できると分かったので、このセレクタを使う。
(注: 以下は「勇気炭酸(ひらがなorカタカナ)」を探すコードであり、「勇気炭酸黒糖」など漢字を含む炭酸はヒットしないことに注意)

pages_len = 37
find_tansan_set = set()
for page in range(2, pages_len+1):
    url = f"https://search.ameba.jp/search/entry/勇気炭酸.html?aid=girlfriend-kari&p={page}"
    res = requests.get(url)
    time.sleep(5)
    soup = BeautifulSoup(res.text, "html.parser")
    find_tansan_list = [re.findall("勇気炭酸[ぁ-ゔァ-ヴー]+", find.get_text()) for find in soup.find_all("div", {"class": "PcEntryListItem_Entry"})]
    find_tansan_set |= set(sum(find_tansan_list, []))

print(find_tansan_set)

出力↓

{'勇気炭酸ラムネが', '勇気炭酸ホワイト', '勇気炭酸がついてきます', '勇気炭酸ラムネ', '勇気炭酸グレープ', '勇気炭酸ブルーハワイが', '勇気炭酸イチゴ', '勇気炭酸ユズ', '勇気炭酸ブラック', '勇気炭酸バナナ', '勇気炭酸アップル', '勇気炭酸も', '勇気炭酸オレンジ', '勇気炭酸ブルー', '勇気炭酸グリーン', '勇気炭酸レッド', '勇気炭酸マンゴー', '勇気炭酸ブルーハワイ', '勇気炭酸ミックス', '勇気炭酸ジンジャー', '勇気炭酸ライム', '勇気炭酸アセロラ', '勇気炭酸マスカット', '勇気炭酸コーラ', '勇気炭酸が', '勇気炭酸ピーチ', '勇気炭酸レモン', '勇気炭酸グリーンアップルも', '勇気炭酸ローズ', '勇気炭酸サイダー', '勇気炭酸チェリー', '勇気炭酸メロン', '勇気炭酸ピンク', '勇気炭酸サクラ', '勇気炭酸キャラメル', '勇気炭酸ブラウン', '勇気炭酸パープル', '勇気炭酸グリーンアップル', '勇気炭酸ココナッツ', '勇気炭酸ライチ', '勇気炭酸アサイー', '勇気炭酸ネイビー', '勇気炭酸を', '勇気炭酸キウイ'}

ヒットした炭酸に「勇気炭酸(ひらがな)」という名前のものは存在しなかったため、「勇気炭酸(カタカナ)」のみ表示する。

print(set(sum([re.findall("勇気炭酸[ァ-ヴー]+", word) for word in find_tansan_set], [])))

出力↓

{'勇気炭酸ホワイト', '勇気炭酸グレープ', '勇気炭酸ラムネ', '勇気炭酸イチゴ', '勇気炭酸ブラック', '勇気炭酸ユズ', '勇気炭酸アップル', '勇気炭酸バナナ', '勇気炭酸オレンジ', '勇気炭酸ブルー', '勇気炭酸グリーン', '勇気炭酸レッド', '勇気炭酸キウイ', '勇気炭酸マンゴー', '勇気炭酸ブルーハワイ', '勇気炭酸ミックス', '勇気炭酸ジンジャー', '勇気炭酸ライム', '勇気炭酸マスカット', '勇気炭酸コーラ', '勇気炭酸ピーチ', '勇気炭酸レモン', '勇気炭酸ローズ', '勇気炭酸サイダー', '勇気炭酸チェリー', '勇気炭酸メロン', '勇気炭酸ピンク', '勇気炭酸サクラ', '勇気炭酸キャラメル', '勇気炭酸ブラウン', '勇気炭酸パープル', '勇気炭酸グリーンアップル', '勇気炭酸ココナッツ', '勇気炭酸ライチ', '勇気炭酸アサイー', '勇気炭酸ネイビー', '勇気炭酸アセロラ'}

この方法の問題点

  • 上記コードでは、前述した「勇気炭酸黒糖」など、漢字混じりの炭酸を見つけることができない
    • (追記)英字ひらカナを除外検索したところ「勇気炭酸小豆」を見つけることができたが、これ以外にも存在するかは不明
  • GF公式ブログが勇気炭酸に言及したのは2016年08月10日*2(勇気炭酸グリーンアップル)がおそらく最後で、それ以降の炭酸については不明

(2) 個人サイトから収集

上記問題を解決するため、より長い期間記録を取っているサイトを探した。
幸いなことに、現在に至るまでGFのキュピ(いわゆるガチャ)情報をまとめてくださっているサイトを発見した。

tsukataga.blog54.fc2.com

キュピ情報には、キュピを引くことにより得られるアイテムが記載されているため、ここから多くの炭酸名を見つけることができる。
上記と同様に「勇気炭酸」で検索+スクレイピングを行った際のコードと結果を以下に示す。

def flatten(lstlst: list[list[Any]]):
    return sum(lstlst, [])

# 最初に検索結果画面のデータを全部取得
pages_len = 36
res_list = []
for page in range(pages_len):
    url = f"http://tsukataga.blog54.fc2.com/blog-entry-3566.html?q=勇気炭酸&page={page}"
    res_list.append(requests.get(url))
    time.sleep(10) # サーバに負荷をかけないように10秒待機

# 記事の投稿日と、記事概要に含まれている勇気炭酸名を取得
tansans = [] ; dates = []
for res in res_list:
    soup = BeautifulSoup(res.text, "html.parser")
    dates += flatten([_.get_text().split() for _ in soup.select("#titlelist > tr > td:nth-child(2)")])    # 記事投稿日
    abstracts = [find.attrs["title"] for find in soup.select("#titlelist > tr > td:nth-child(4) > a")] # 記事概要
    tansans += [re.findall("勇気炭酸[^a-zA-Z0-9付」×.]+", abst) for abst in abstracts]
 
# 重複の除外
result = {}
for t, d in zip(tansans, dates):
    if not t:
        continue # 炭酸名が記事概要になければスキップ
    result[t[0]] = d # 順序を保持しながら重複を除外 辞書の上書きを利用(最も早い投稿日が記録される)
result = list(result.items()) # タプルのリストに戻す

# 出力
for t, d in result:
    print(f"{t} ({d})")

出力↓

勇気炭酸チーズ (2023/01/05)
勇気炭酸練乳 (2022/12/13)
勇気炭酸黒糖 (2022/11/07)
勇気炭酸キャロット (2022/10/08)
勇気炭酸ブドウ (2022/09/02)
勇気炭酸えだ豆 (2022/08/02)
勇気炭酸ハチミツ (2022/07/06)
勇気炭酸ハスカップ (2022/06/06)
勇気炭酸バジル (2022/05/03)
勇気炭酸ハイビスカス (2022/04/10)
勇気炭酸マヨネーズ (2022/03/04)
勇気炭酸コケモモ (2022/02/06)
勇気炭酸ビワ (2022/01/05)
勇気炭酸ナタデココ (2021/12/13)
勇気炭酸ティー (2021/11/07)
勇気炭酸シソ (2021/10/08)
勇気炭酸紫イモ (2021/09/02)
勇気炭酸ケール (2021/08/02)
勇気炭酸ポンカン (2021/07/06)
勇気炭酸アクア (2021/06/06)
勇気炭酸カボス (2021/05/03)
勇気炭酸イチゴミルク (2021/04/10)
勇気炭酸スダチ (2021/03/04)
勇気炭酸カスタード (2021/01/05)
勇気炭酸ミルク (2020/12/13)
勇気炭酸アイスティー (2020/11/07)
勇気炭酸ネクタリン (2020/10/08)
勇気炭酸スモモ (2020/09/02)
勇気炭酸オリーブ (2020/08/02)
勇気炭酸ドリアン (2020/07/06)
勇気炭酸アケビ (2020/06/06)
勇気炭酸ピスタチオ (2020/05/03)
勇気炭酸カリン (2020/03/04)
勇気炭酸グレープフルーツ (2020/01/05)
勇気炭酸マンゴスチン (2019/12/13)
勇気炭酸カフェオレ (2019/11/08)
勇気炭酸クランベリー (2019/10/08)
勇気炭酸パッションフルーツ (2019/09/02)
勇気炭酸スターフルーツ (2019/08/02)
勇気炭酸パンプキン (2019/07/06)
勇気炭酸イオン (2019/06/06)
勇気炭酸アボカド (2019/05/03)
勇気炭酸ベリー (2019/04/13)
勇気炭酸グァバ (2019/03/04)
勇気炭酸梨 (2019/01/05)
勇気炭酸ソイ (2018/12/13)
勇気炭酸チョコ (2018/11/07)
勇気炭酸トマト (2018/10/08)
勇気炭酸ブルーベリー (2018/09/02)
勇気炭酸スウィーティー (2018/08/02)
勇気炭酸プリン (2018/07/06)
勇気炭酸スカイ (2018/06/06)
勇気炭酸抹茶 (2018/05/03)
勇気炭酸梅 (2018/04/13)
勇気炭酸シークワーサー (2018/03/04)
勇気炭酸パパイヤ (2018/01/05)
勇気炭酸ヨーグルト (2017/12/13)
勇気炭酸チャイ (2017/11/07)
勇気炭酸ラズベリー (2017/10/08)
勇気炭酸プルーン (2017/09/02)
勇気炭酸シーソルト (2017/06/06)
勇気炭酸ストロベリー (2017/04/13)
勇気炭酸グリーンアップル (2016/08/02)
勇気炭酸マンゴー (2016/07/02)
勇気炭酸ブルーハワイ (2016/06/03)
勇気炭酸マスカット (2016/05/02)
勇気炭酸サクラ (2016/04/02)
勇気炭酸小豆 (2016/03/02)
勇気炭酸ミックス (2016/02/02)
勇気炭酸アセロラ (2016/01/02)
勇気炭酸ココナッツ (2015/12/06)
勇気炭酸キャラメル (2015/11/03)
勇気炭酸メロン (2015/10/03)

今後の課題

  • おそらく漏れがある
    • 参考までに、2022年末までのマイヒーローの開始日を示しておく

マイヒーロー開始日。ここを押して展開

// https://gfkari.gamedbs.jp/event からDevTool(javascript)で取得した
[
    "2023/1/14",
    "2022/12/14",
    "2022/11/14",
    "2022/10/14",
    "2022/9/14",
    "2022/8/14",
    "2022/7/14",
    "2022/6/14",
    "2022/5/14",
    "2022/4/14",
    "2022/3/14",
    "2022/2/11",
    "2022/1/14",
    "2021/12/14",
    "2021/11/14",
    "2021/10/14",
    "2021/9/13",
    "2021/8/14",
    "2021/7/14",
    "2021/6/14",
    "2021/5/14",
    "2021/4/14",
    "2021/3/14",
    "2021/2/11",
    "2021/1/13",
    "2020/12/14",
    "2020/11/14",
    "2020/10/14",
    "2020/9/13",
    "2020/8/14",
    "2020/7/14",
    "2020/6/13",
    "2020/5/14",
    "2020/4/12",
    "2020/3/14",
    "2020/2/13",
    "2020/1/14",
    "2019/12/14",
    "2019/11/14",
    "2019/10/14",
    "2019/9/14",
    "2019/8/14",
    "2019/7/14",
    "2019/6/14",
    "2019/5/14",
    "2019/4/14",
    "2019/3/14",
    "2019/2/10",
    "2019/1/13",
    "2018/12/14",
    "2018/11/13",
    "2018/10/13",
    "2018/9/14",
    "2018/8/14",
    "2018/7/14",
    "2018/6/14",
    "2018/5/13",
    "2018/4/14",
    "2018/3/14",
    "2018/2/11",
    "2018/1/14",
    "2017/12/14",
    "2017/11/12",
    "2017/10/14",
    "2017/9/13",
    "2017/8/13",
    "2017/7/14",
    "2017/6/13",
    "2017/5/13",
    "2017/4/14",
    "2017/3/12",
    "2017/2/10",
    "2017/1/14",
    "2016/12/13",
    "2016/11/13",
    "2016/10/13",
    "2016/9/13",
    "2016/8/11",
    "2016/7/14",
    "2016/6/14",
    "2016/5/14",
    "2016/4/13",
    "2016/3/13",
    "2016/2/13",
    "2016/1/15",
    "2015/12/14",
    "2015/11/14",
    "2015/10/14",
    "2015/9/13",
    "2015/8/15"
]

念のため取得に使ったコードも載せる。

res = []
document.querySelectorAll("li[t='raid']").forEach((e)=>{
    m = e.innerText.match(/マイヒーロー/)
    if (m) res.push(m.input.match(/[0-9]+\/[0-9]+\/[0-9]+/g)[1])
})
res

参考文献

【Vivaldi】uBlock OriginでWebページのフォントを強制変更する

1. はじめに

ブラウザのフォント設定をお気に入りのフォントに統一しているのだが、たまにWebページ側でフォントが指定されている場合がある。
普段はそれほど気になるものでもないが、頻繁に利用しているサイトではどうしても気になってしまうため、好きなフォントに変更したい。

表示フォントを変更する拡張機能としてはStylus*1がよく知られている。
自分も今まで利用していたが、最近uBlock Originのフィルタ記法について調べていたところ、uBlock Originでもフォント強制ができるらしいと知った。
というわけで、今回はuBlock OriginでStylusの真似事をしてみようと思う。

2. 環境

3. 準備

3.1 Action operators

この記事*2を読んで知ったが、フィルタ作成時に"Action operators"というものを用いることで、特定の要素をDOMから削除したり(非表示ではなく)、スタイルを変更したりすることができるそうだ。
詳しくはuBlock wiki*3に載っている。

今回はフォントを強制変更したいので、スタイルを変更するためのAction operatorである:style()を用いる。
以下のようにフィルタを記述することで、 カッコ内のスタイルを指定要素に適用させることができる。

ドメイン名##要素:style(ここにCSS記法でスタイルを記述)

4. フィルタ作成例

例として、ニコニコ動画(www.nicovideo.jp)のフォントを強制変更するためのフィルタを作成する。
なお、ここではページ全体(<body>タグ内)のフォントをsans-serifに強制変更することとする。

上記に従いフィルタを作成すると、以下のようになる。

www.nicovideo.jp##body:style(font-family: sans-serif)

これをuBlock Originの「オプション」→「マイフィルター」に追記し、「変更を適用」をクリックする。

しかし、このままではフォントは変更されていない。これは後で読み込まれたCSSファイルによってスタイルが上書きされているためである。
そのため、スタイルに!importantを付与する*4

www.nicovideo.jp##body:style(font-family: sans-serif !important)

このフィルタを適用したところ、期待通りの動作が確認できた。

追記

上記フィルタを使用した場合、ほとんどの箇所のフォントは変更できるが、ヘッダ(サイト上側の動画、静画、などと書かれた部分)については変更できなかった。
自分はこれで満足なのでこれ以上は求めないが、気になる場合はフィルタのさらなる改造が必要である(と思われる)。

参考文献

ZapWorksにVRM形式モデルを取り込んで表示させた際の備忘録

注意: なぐり書きのメモなので読みにくいです

やりたいこと

ZapWorksを使って、人型3DモデルをARで表示させたい。あわよくばそのモデルを動かしたい。

やったことリスト(雑多)

ZapWorksの基本(ブラウザで動作するZapWorks Designerを使用するのが楽)
https://zenn.dev/alea12/articles/05a6ff557166ff#zapper-%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E4%BD%9C%E6%88%90

ZapWorksはGLB, glTF, Embedded glTFに対応しているが、こういった拡張子の人形モデルは少ない。そのため、glTFを拡張したVRMモデルを用いる。
VRoid Hubニコニ立体に多く上がっている。
DL不可能なモデルもあるため注意。また、モデルのサイズ制限にも注意が必要である(20MB以下だったはず)。

VRMモデルは、拡張子を.vrmから.glbにするだけで、GLBファイルとして扱うことができる。ただし、VRMはアニメーションデータが含まれない構造となっている(対応していない)らしい。 https://www.crossroad-tech.com/entry/vrm_animation_export

そのため、アニメーションをつけたい場合は自作する必要がある。簡単なアニメーションについてはBlender等を用いれば作成可能。以下ページを参照。
https://jp.renderpool.net/blog/blender%E3%81%AE%E3%82%A2%E3%83%8B%E3%83%A1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3/

補足: MMDモデルを取り込めるかどうか

実はBlenderMMDモデルをインポートするための拡張機能が存在する。
https://kemarii.com/blog/cg/blender-mmd-import/
https://3d.nicovideo.jp/works/td84359

そのため、「BlenderMMDモデルをインポート→GLB形式でエクスポートしてZapWorksで使用」ということが一見可能のように思える。しかし実際に試したところ、GLBで出力した際に色のデータが失われてしまったり、モデルの形が一部おかしくなったりといった問題が生じたため、少なくとも素人には難しいと思われる。
その点、VRMモデルを用いる手法であれば簡単なので、自分みたいな素人にもおすすめである。

【JupyterNotebook】Kerasでpredictを繰り返すとメモリリーク

発生した問題

ループやリスト内包表記で繰り返しpredictを行わせると、メモリ使用量が40% -> 100%になってしまう。
(注)PCに搭載しているメモリは32GBのため、メモリが貧弱というわけではない。

環境

  • Windows 11 Pro
    • バージョン: 22H2
    • OSビルド: 22621.963
    • 機械学習GPUは使わない(非対応なので)
  • Python 3.10.5
  • Keras
  • Jupyter Notebook
    • jupyter --versionの実行結果は次の通り。
Selected Jupyter core packages...
IPython          : 8.5.0
ipykernel        : 6.16.0
ipywidgets       : 8.0.3
jupyter_client   : 7.4.2
jupyter_core     : 4.11.1
jupyter_server   : not installed
jupyterlab       : not installed
nbclient         : 0.7.0
nbconvert        : 7.2.1
nbformat         : 5.7.0
notebook         : 6.4.12
qtconsole        : not installed
traitlets        : 5.4.0

行った対処

【python】pythonでメモリ不足になったときにすること - 静かなる名辞 を見て変数を積極的にdel -> gc.collect()したが駄目。

解決

predict後にkeras.backend.clear_session()を実行したら解決した。
-ε-いつかのブログ-з- : [Python] Keras の fit や predict がループでメモリリークする
kerasで繰り返し学習するとメモリ使用量が増えちゃう問題を対策した - Qiita
tf.keras.backend.clear_session  |  TensorFlow v2.11.0

付録: pythonのメモリ使用状況を調べる

(前提として、pip install memory_profilerでmemory_profilerをインストールしておく)
%load_ext memory_profiler を実行しておき、 メモリ状況を知りたい場所で %memit を書くと勝手に出力してくれる。

参考: https://ja.stackoverflow.com/questions/49825/jupyter-notebook%E3%81%A7%E3%81%AE%E3%83%A1%E3%83%A2%E3%83%AA%E3%82%A8%E3%83%A9%E3%83%BC

蛇足

JupyterNotebookでは実行したセルの結果などが変数に格納され、後で使えるように設計されている(jupyterというよりはIPythonの仕様らしい)。
これは便利な半面、例えば非常に長いログを出力してしまうと、それによってメモリが圧迫されることも想定されるため、注意が必要である。

【Windows】VSCode+pLaTeX(+LuaLaTeX)環境を構築した

pLaTeXが必要になったのでメモ。

環境

  • Windows 11 Pro (version: 22H2)
  • Visual Stusio Code (version: 1.74.1)
  • LaTeX Workshop (v9.1.1)
  • TeXLive 2022

手順

まず次の記事を読んで基本的なLaTeX環境を構築した。 https://qiita.com/passive-radio/items/623c9a35e86b6666b89e

しかしこのままではpLaTeX文書をコンパイルすることができない。
※ビルドレシピにpLaTeXの記述があるため可能のように思われるが、このレシピでビルドしたところ、自分の環境では無限ループに陥ってしまった。

そのため、この記事を読み、pLaTeX用のビルドレシピを追加した。
具体的には、settings.jsonlatex-workshop.latex.tools

{
  "name": "pLaTeX",
  "command": "platex",
  "args": [
    "%DOC%"
  ],
  "env": {}
},
{
  "name": "dvipdfmx",
  "command": "dvipdfmx",
  "args": [
    "-V 4",
    "%DOC%"
  ]
},

を追加し、
latex-workshop.latex.recipes

{
  "name": "pLaTeX + dvipdfmx",
  "tools": [
    "pLaTeX", // 相互参照のために2回コンパイルする
    "pLaTeX",
    "dvipdfmx"
  ]
},

を追加した。

2023/01/29 追記

pdf形式の図を追加してコンパイルすると、dvipdfmx:warning: Trying to include PDF file with version (1.7), which is newer than current output PDF setting (1.4).という警告が出た。
これは上記コードでdvipdfmxについて記載している部分が問題である。argsにPDFファイルのバージョンとして-V 4が指定されているが、これを-V 7などに変更すれば警告は消える。修正後のコードを以下に示す。

{
  "name": "dvipdfmx",
  "command": "dvipdfmx",
  "args": [
    "-V 7", // 変更部分
    "%DOC%"
  ]
},

参考: LaTeXのPDFバージョン · Issue #62 · kaityo256/lab_startup · GitHub

付録: BibLaTeXを使えるようにする

まずTexLiveでbiberbiblatex、そして使いたいスタイル(例: biblatex-ieee)をインストールする。

その後setting.jsonの"latex-workshop.latex.tools"に以下を追記し、

{
  "name": "Biber",
  "command": "biber",
  "args": [
    "%DOCFILE%"
  ]
}

"latex-workshop.latex.recipes"に以下を追記する。

{
  "name": "pLaTeX + Biber + dvipdfmx",
  "tools": [
    "pLaTeX",
    "Biber",
    "pLaTeX",
    "pLaTeX",
    "dvipdfmx"
  ]
},

これで使えるようになるはず。

基本の使い方

ファイルの先頭などに↓を書いておき、

\usepackage[backend=biber, bibstyle=ieee]{biblatex} % bibstyleは使いたいスタイルによって変える
\addbibresource{ref.bib} % ここに使用するbibファイルを渡す

参考文献を表示する部分で↓を書く。

\printbibliography[title=参考文献]

なお、上記の\usepackage[]{biblatex}にはbibstyle以外にもパラメータを渡すことができ、例えばURLを表示したくないならurl=false、doi情報を非表示にするならdoi=falseなどと柔軟に変更することが可能である。
参考: https://qiita.com/shiro_takeda/items/fac1351495f32c224a28

その他わかりやすかったサイトを載せておく。