Memo plus Alpha

メモにプラスアルファを加えて価値ある情報に。

matplotlibとnetworkxで日本語を表示する

はじめに

matplotlibとnetworkxはデフォルトでは日本語を表示できず豆腐(□のダミー記号)になります。

f:id:semanticist:20211102174444p:plain

networkxの日本語の文字化け

これを避けるための方法をメモしておきます(ハマって1日が溶けたので…)。

日本語フォントのダウンロード

いくつか手法があるようですが、「日本語のフォントをダウンロード」→「それをmatplotlibに登録」→「描画時に指定」というのが一番簡単でした。

IPA Font ダウンロード | 一般社団法人 文字情報技術促進協議会

上記のサイトからフォントをダウンロードし、ipaexg.ttfをpythonスクリプトと同じフォルダに置きます。その後、以下のコードを実行すればOKなはずです。

import matplotlib
from matplotlib import font_manager
import networkx as nx
import matplotlib.pyplot as plt
 
#ここでフォントを追加しています
font_manager.fontManager.addfont("ipaexg.ttf")
matplotlib.rc('font', family="IPAexGothic")
 
#成功すれば['IPAexGothic']と表示されます
print(matplotlib.rcParams['font.family'])
 
#ここは実験用のグラフです
G = nx.Graph()
G.add_node("あ")
G.add_node("い")
G.add_node("う")
G.add_node("え")
G.add_node("お")
G.add_edges_from([("あ", "お"), ("あ", "い"),  ("え", "い"),  ("え", "う"),  ("あ", "う")])
 
#ここで描画時にフォントを指定します
nx.draw_networkx(G, font_family="IPAexGothic")
plt.show()

f:id:semanticist:20211102174936p:plain

networkxの日本語の文字化け解消

【参考】

【Python】matplotlib3.2の日本語フォント設定方法【公式遵守】 - Qiita

 

Unityで作ったアプリをGoogle Playで公開するときにつまずいたポイント

はじめに

Unityでアプリを作ったらほぼ終わり!と思っていましたが、甘かった…。Google Playストアで公開するまでに幾多の難所がありました。以下、箇条書きですが、自分のメモ用に残しておきます。

 

AdMobの設定

自分のGoogleアカウントでAdMobを申請したところ、2日後くらいに「もう持っているよ!」というメールが。実は別のアカウントでAdSenseを利用していたのですが、これが重複とみなされたようです。つまり、Googleアカウントを2つ持っていて、AdSense, AdMobを分けて持つことはできないようです(Googleはアカウントの重複を特定するアルゴリズムを持っているようですね)。

 

アイコンの設定で手間取る

アイコンを作ってこれでOK!と思っていたのですが、Unityの設定では「前景」と「背景」を別に指定する必要がありました。ただし、Default Iconでは完成版(前景と背景をあわせたもの)も必要でした。アイコンのサイズは432*432で、前景はPNGで透過設定したものが必要です。

 

一方、Google Playで提出するアイコンは512*512のサイズですので、それぞれ用意する必要がありそうです。

 

【参考】

deve-cat.com

 

それとiPhoneユーザーなので知らなかったのですが、Androidのアイコンは丸いのですね…。これに合うようにアイコンをデザインしたほうがよさそうです。

 

キーの発行で手間取る

アプリをauthorizeするために、電子署名をする必要があります。Unityの中でキーストアを発行する機能がありますので、これを利用します。詳細は以下のページ。

 

light11.hatenadiary.com

 

パスワードを設定するのですが、Unityを再起動するたびにPlayer Settingsで再入力する必要があるようです。

 

APIレベルで怒られる

ビルドが完了するとapkファイルが生成され、それを提出すればOK!というはずだったのですが、アップロードしたらAPIレベルが低すぎる、とGoogleに怒られました。2020年の8月からAPIレベルを29以上にすることが求められたとのこと。Unityの2019.4バージョンでは、デフォルトが28になっています。したがってこのレベルを上げる必要があります。

 

手順が若干ややこしく、簡単に書くと「preferencesからSDKのパスをコピーし、そのパスからさらにtools/binというフォルダに移動し、コマンドラインから新しいプラットフォームをインストールするコマンドを打つ」ということになります。コマンドプロンプトは管理者権限で起動してください。

 

(1)管理者権限でコマンドプロンプトを起動

(2)SDKのパス+tools/binに移動 (cd PATH/tools/bin)

(3)sdkmanager.bat "platforms;android-29"を実行

 

詳細は以下を参照させて頂きました。

Unityで Android API level 29 のビルド | 工藤ゲーム製作所

仮眠プログラマーのつぶやき : 【Unity】Android BuildでAPIレベル29以降にする方法

 

実は私の環境では、上記でファイルのインストールまではできるものの、ビルドしたときにAPI29がないよ、というエラーが出ました。これはWindowsのアカウントの権限の問題だったようで、アカウントを「標準」から「管理者」に変更すればOKでした(Unity自体を管理者で実行すればできるかもしれません)。

 

なお、Minimum API levelを高くしすぎると対応デバイスがかなり少なくなるので、26とかある程度下に設定したほうが良さそうです(低すぎると怒られる)。

 

64ビット対応じゃないと怒られる

まだ怒られます笑 ストアにアップロードしたら64ビットに対応していないよ(「このリリースはGoogle Playの64 ビット要件に準拠していません。」)、と。

 

Preferences->Player->Other Settings->Scripting BackendをL2CPPに変更

同じくTarget ArchitecturesをARM64にチェックを入れる

 

参考

qiita.com

 

バージョンコードで怒られる

以上をやったあと、ファイルをアップロードすると:

 

「バージョン コード 1 の APK または Android App Bundle がすでに存在するため、別のバージョン コードを使用する必要があります。」

 

と怒られました。どうやら一度でもファイルをアップロードすると、それが一つのバージョンとみなされ、同じバージョンでファイルをアップロードできないようです。

 

Build Settings->Player Settings->Player (Preferencesから辿っても同じです)でBundle Version Codeの数字を一つ上げる、という対応でできました。

 

スクショで怒られる

やっとファイルはOKをもらいました(さらに審査が待っていますが…)。次はアプリの説明のところです。ここではいくつか画像を提出する必要があります。

 

フィーチャーグラフィック(1024*500)とスクリーンショット(最低2枚)ですが、これも比率が結構厳しく、ちゃんとサイズをあわせないと通してくれません。

 

スクリーンショットは横画面を推奨していますが、縦アプリの場合は、縦のスクショだけでも問題なさそうでした。なお、スクリーンショットのサイズですが、ストアで他のアプリのものをみると、527*937となっていましたので、この比率を保ちつつ少し小さくして、398*675としたのですが、これで無事通りました。

 

総括

長かった…。iOSのほうもやってみようと思っていますが、さらに手間がかかりそうです…。

 

ちなみに作ったアプリはこちら(実は子供が作ってそれを私が一生懸命調べながら公開した、という形です)。初作なのでまだまだですが、一つ出せた、というのは大きな一歩です。

play.google.com

追記

 実際にAdMobを表示するにはもう1ステップあるようです。AdMob→アプリの設定→アプリストアで自分のアプリを検索して紐付ける必要があるそうです。

f:id:semanticist:20210109104549p:plain

Admobのリンク設定

 

Modern UI PackのModal Windowで日本語を表示する

はじめに

UnityのUIはデフォルトではあまり洗練されていませんが、アセットストアからUIを導入すればだいぶ見た目がよくなります。今回は、Modern UI Pack($20)というものを導入してみましたが、日本語が表示されないという問題がありました。

準備

Modern UI PackはText Mesh Proに依存しているため、これをインストールする必要があります。これはUnityにデフォルトで入っていますが、次の操作で有効にする必要があります。

 

Window->Package Manger->Text Mesh Pro

 

また、日本語のフォントを準備する必要があります。「日本語 フリーフォント」などで検索し、TTF形式のファイルを入手します。

UnityはTTF形式のファイルをそのまま使うことができるのですが、Text Mesh Proでは形式を変換する必要があります。

Window->TextMeshPro - Font Asset Creatorから、サンプリングサイズや使う文字など(例えばhttps://gist.github.com/kgsi/ed2f1c5696a2211c1fd1e1e198c96ee4からコピペします)を指定してgenerateします。そのファイルを、Modern UI PackのFontsフォルダに保存します。詳細は以下のページを参照してください。

 

qiita.com

 

これで日本語が表示されるはずですが、■が表示される場合は、サンプリングサイズに問題がある可能性があります。私はサイズを40、Resolutionを4096*4096にすれば解決しました。

Modern UI Packの設定

ここまできたら、あとはModern UI Packの設定をすればOKです。ただし、Game ObjectからボタンなどのTextまで辿って直接編集する方法だと、設定が反映されません。

Projectsの中のModern UI Pack->Resources->Modern UI Manager

でUI Managerを起動し、その中にあるModal Windowのところでフォントを指定すればOKです(あるいはUIの部品からこのコンポーネントをオフにすればTextを直接編集できます)。

なお、プロジェクトを起動した後にModern UI Pack Managerが読み込まれるようですが、立ち上がるタイミングがどうもStart関数よりも後になることがあるようです。Start関数の中でボタン等のテキストを変更する場合、一瞬写った後にUI Managerで設定した値に上書きされることがあります。

これを防ぐにはComponentの接続を切るか、少し待ってから関数を呼び出すなどの処置が必要かもしれません。

TreeTaggerErrorの対処(TreeTaggerWrapper)

TreeTaggerWrapper

PythonのモジュールでTreeTaggerWrapperというものがあり、これを用いるとシームレスにTreeTaggerの解析結果を利用できます(PCにTreeTaggerがインストールされていることが前提)。

モジュールのインストール

pip install TreeTaggerWrapper

エラー

import treetaggerwrapper as ttw

text="This is a pen."

tagged = ttw.TreeTagger(TAGLANG="en", TAGDIR="C:\TreeTagger").tag_text(text)

 

という形で解析でいるのですが:

 

raise TreeTaggerError("TreeTagger binary invalid: " + self.tagbin)

 

というエラーが出ることがあります。これは「TreeTaggerの場所がわからない」という意味のことのようです。このモジュールは一般的なインストール先を自動的に探す設定になっているようですので、そのパターン外の場合にエラーが出ます。

対処法

tagged = ttw.TreeTagger(TAGLANG="en", TAGDIR="C:\TreeTagger").tag_text(text)

のようにTAGDIRにインストール先を与えればOKです(cmd, bin, libなどが入っているフォルダを指定します)。

 

GPUを使った深層学習を自分の環境で実行する(tensorflowの場合)

はじめに

GPUを使うと、ディープラーニングの処理が速くなります。しかしながら、GPUを使うには、1手間かかります。その方法を自分用のメモとして残しておきます。

前提として、Windows PCであること(私の場合はWin 10)、NVIDIAGPUを搭載していること(同じくGeForce GTX 1080)、ですので、ご注意ください。

なお、これらの設定を行わずにtensorflow-GPUを使おうとすると、use_multiprocessing=use_multiprocessingというエラーがでます。

f:id:semanticist:20200418224846p:plain

Anacondaのインストール

環境設定にAnacondaを使います。使わなくてもできますが、便利なので。まず、environmentsからCreateで、tensorflowが対応しているpythonのバージョンを入れた環境を構築します(私はPython3.6)。

その後、ターミナルを開いてtensorflow-GPUをインストールします。

 

f:id:semanticist:20200418223459p:plain

 

conda install tensorflow-gpuをターミナルで実行

 

しばらくすると、インストールが完了します。tensorflow-gpuのバージョンを確認しておきます。2.1.0とありますので、

f:id:semanticist:20200418224435p:plain

 

2.1.0とありますので、次のページでCUDAの対応バージョンを確認しておきます(10.1とありました)。

https://www.tensorflow.org/install/source?hl=ja#linux

 

GPU周りを整える

最新のドライバのインストールと、ツールキットをインストールします(以下を参照)。

【参考】GPU support  |  TensorFlow

ドライバの確認・更新

ドライバは418.xよりも新しいものである必要があるので、まずはドライバのバージョンを確認します。

 

デスクトップで右クリック→NVIDIAのコントロールパネル→ヘルプ→システム情報

 

もし古いようであれば、NVIDIA GeForce Experienceからアップデートしましょう。Windowsキーを押して「Ge」と入れればプログラムが出てくるはずなので、それを選択します。アップデートにはアカウントが必要なので作成します。ドライバの更新というボタンがあるはずなので、それで更新して、PCを再起動します。

 

CUDAツールキット

ツールキットをインストールします。バージョンに注意(私は10.1で構築)。

 

https://developer.nvidia.com/cuda-toolkit-archive

 

ここまで成功していれば、コマンドプロンプトからnvcc -Vと打てば下のようなバージョン情報などが表示されます。

f:id:semanticist:20200418224819p:plain

 

【参考】Installation Guide Windows :: CUDA Toolkit Documentation

 

cuDNN SDK

NVIDIAのページから、SDKを入手します。これはスクリプト集のようなものなのでインストールは不要です。ただし、このフォルダまでのパスを通す必要があるので、適切なフォルダ(Cドライブのトップなど)を選びましょう。ここではC:\cudaに解凍したファイル群を置きます。

f:id:semanticist:20200418225053p:plain

 

パスを通す

次の3つのパスを通します。
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin
#これはツールキットのインストールで自動的に追加されています。
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\extras\CUPTI\lib64

#手動で通します(システムの環境変数から)。

C:\cuda\bin
#cuDNN SDKを置いたフォルダのbinまでパスを通します。

【参考】https://www.tensorflow.org/install/source_windows?hl=ja

 

その後、PCを再起動します。

 

プログラムで動くか確認

Anaconda navigatorから、tensorflow-GPUをインストールした環境で、Jupyter notebookを起動します。

f:id:semanticist:20200418225410p:plain

以下のコードを打ち込んで実行します。

 

import tensorflow
from tensorflow import keras
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()
model = keras.models.Sequential([
keras.layers.Flatten(),
keras.layers.Dense(600, activation='relu'),
keras.layers.Dropout(0.1),
keras.layers.Dense(10, activation='softmax')
])
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.fit(x_train, y_train, epochs=3)

 

成功すれば以下のような画面になります!

f:id:semanticist:20200418225453p:plain



※なお、ブラウザのタブを閉じてプログラムを終了すると、GPUのメモリ上にデータが残ってしまいます。カーネルをシャットダウンして終わるか、そうなった場合はPCをを再起動します。


CUDA runtime implicit initialization on GPU:0 failed. Status: out of memory

 

これがそれが起きたときのエラーメッセージです(一番下に出ます)。