2026/03/04(水) [n年前の日記]
#1 [nim] Nimの勉強中。その2
プログラミング言語 Nim について勉強中。環境は Windows11 x64 25H2 + Nim 2.2.8 64bit。
◎ スクリーンセーバを作ってみた :
Nim 2.2.8 64bit を使ってWindows用のスクリーンセーバを作ってみた。
_mieki256/ssnimsample: Nim言語製のWindows用スクリーンセーバのサンプル
ほとんどの部分をAI(Google Gemini)に作ってもらったような気もするけれど、途中で嘘を言い出すから不具合の原因を調べて修正するのが大変だった…。
_ssnimsample.nim 内の render() を書き換えれば独自のスクリーンセーバを作れるかなと…。
スクリーンセーバ名は、 _resource.rc 内で指定しているので記述を変更すればOK。
とりあえずNim言語を使ってもWindows用のスクリーンセーバを作れそうだと分かった。
_mieki256/ssnimsample: Nim言語製のWindows用スクリーンセーバのサンプル
ほとんどの部分をAI(Google Gemini)に作ってもらったような気もするけれど、途中で嘘を言い出すから不具合の原因を調べて修正するのが大変だった…。
- ウインドウの生成には winim を使用。
- フルスクリーン表示、プレビュー画面表示は OpenGL を使用。
_ssnimsample.nim 内の render() を書き換えれば独自のスクリーンセーバを作れるかなと…。
スクリーンセーバ名は、 _resource.rc 内で指定しているので記述を変更すればOK。
とりあえずNim言語を使ってもWindows用のスクリーンセーバを作れそうだと分かった。
◎ nim.cfgについて :
Nimでコンパイルする際、一々コンパイルオプションをつけて作業するのが面倒臭い。
batファイルを作って対応してたけど、もうちょっといい方法はないか。
nim.cfg なるものがあるらしい。コンパイルオプションを nim.cfg に列挙しておけば、nim c hoge.nim と打つだけで、そのコンパイルオプションを利用してくれるのだとか。
今回は以下のような nim.cfg になった。
nim.cfg
nim c hoge.nim と打ったら反映された。
nim c -d:release -d:strip --opt:size --passL:"resource.res" --app:gui main.nim
batファイルを作って対応してたけど、もうちょっといい方法はないか。
nim.cfg なるものがあるらしい。コンパイルオプションを nim.cfg に列挙しておけば、nim c hoge.nim と打つだけで、そのコンパイルオプションを利用してくれるのだとか。
今回は以下のような nim.cfg になった。
nim.cfg
--app:gui -d:release -d:strip --opt:size --passL:"resource.res"
- --app:gui ... GUIアプリを作るための指定。実行時にコンソールが出ない。
- -d:release ... デバッグ情報を削除したり、最適化したりする。
- -d:strip ... デバッグシンボル情報を削除する指定
- --opt:size ... ファイルサイズが小さくなるように指定。
- --passL:"resource.res" ... リンカへの指定。この場合リソースファイル resource.res もリンクせよと指示してる。
nim c hoge.nim と打ったら反映された。
[ ツッコむ ]
#2 [nim] nimble build について
Nim には nimble というパッケージ管理ツール?があるけれど、これを使ってビルドの指示もできるらしい。
_NimWorld | パッケージ
_Nimble入門 #入門 - Qiita
_NimWorld | パッケージ
_Nimble入門 #入門 - Qiita
- nimble init と打つと、カレントディレクトリ名をパッケージ名にしつつ、設定ファイル *.nimble が作成される。
- この状態で nimble build と打つだけでビルドができる。
- デフォルトでは src/ ディレクトリの中にソースコード(.nim)を入れる構成になる。srcDir = "src" という記述で指定してる。その行を削除すれば .nimble と同階層にソースコードがあるものとして処理される。
- exe の出力先を別ディレクトリにすることもできる。binDir = "bin" と記述しておけば、bin/ を作成してその中に .exe が生成される。
- nimble build の実行時、nim.cfg も参照してコンパイルをしている模様。
- nimble --verbose build と打てば、どのファイルを参照しながら処理をしているか表示してくれる。
◎ 使用ライブラリを指定 :
.nimble には、そのアプリが利用するライブラリも記述しておかないといけない。
今回は以下のような記述にした。
今回は以下のような記述にした。
# Dependencies requires "nim >= 2.2.8" requires "winim" requires "opengl"
- winim と opengl を利用してるので、requires "xxxx" といった形で列挙していく。
- バージョン指定もできる。上記の例では、nim は 2.2.8 以上が必要、という記述になっている。
◎ コンパイル前後の処理を指定 :
コンパイルをする前と、した後に、何かしらの処理をさせることもできる。before build: もしくは after build: という指定を使う。
今回は以下のような記述になった。コンパイルする前にリソースファイルの変換を行い、コンパイルした後に .exe を .scr としてコピーしてる。
この状態で nimble build と打ったら、リソースファイルを作ってから、コンパイルをして .exe ができて、その .exe が .scr としてコピーされた。
今回は以下のような記述になった。コンパイルする前にリソースファイルの変換を行い、コンパイルした後に .exe を .scr としてコピーしてる。
before build:
echo "--- [Task] Compiling Resource File ---"
exec "windres resource.rc -O coff -o resource.res"
after build:
echo "--- [Task] Creating Screensaver File ---"
cpFile("ssnimsample.exe", "ssnimsample.scr")
echo "Done: 'ssnimsample.scr' has been updated successfully."
- echo "hoge" でコンソールにメッセージ "hoge" を出せる。
- exec "hoge.exe" で処理を実行する。上記の例では windres を使って、リソースファイル .rc を .res に変換している。
- cpFile("SOURCE.exe", "DIST.scr") でファイルのコピーができる。
この状態で nimble build と打ったら、リソースファイルを作ってから、コンパイルをして .exe ができて、その .exe が .scr としてコピーされた。
◎ 特定の処理を指定 :
.nimble は、タスクと呼ばれる一連の処理を記述していくこともできる。
例えば、以下の記述をすると…。
nimble tasks で、利用できるタスクの一覧が表示される。
nimble hello と打ってみると…。メッセージが表示された。task hello で指定した処理が行われている。
生成ファイルを全消去するタスクを用意してみる。いわゆる make clean。
ここでちょっと注意。Makefile に慣れていると、タスク名として clean を記述したくなるけれど、clean というタスク名は既に予約されているので別のタスク名にしないといけない。今回は distclean としてみた。
nimble distclean と打つと、.scr, .exe, .res が削除された。
例えば、以下の記述をすると…。
task hello, "Debug test": echo "Hello! Nimble is reading this task correctly."
nimble tasks で、利用できるタスクの一覧が表示される。
> nimble tasks hello Debug test
nimble hello と打ってみると…。メッセージが表示された。task hello で指定した処理が行われている。
> nimble hello Executing task hello in D:\home2\prg\nim\_public\ssnimsample\ssnimsample\ssnimsample.nimble Hello! Nimble is reading this task correctly.
生成ファイルを全消去するタスクを用意してみる。いわゆる make clean。
ここでちょっと注意。Makefile に慣れていると、タスク名として clean を記述したくなるけれど、clean というタスク名は既に予約されているので別のタスク名にしないといけない。今回は distclean としてみた。
task distclean, "Remove intermediate files and generated .scr":
echo "Cleaning project..."
if fileExists("ssnimsample.scr"):
rmFile("ssnimsample.scr")
echo "Deleted: ssnimsample.scr"
if fileExists("ssnimsample.exe"):
rmFile("ssnimsample.exe")
echo "Deleted: ssnimsample.exe"
if fileExists("resource.res"):
rmFile("resource.res")
echo "Deleted: resource.res"
if dirExists("nimcache"):
rmDir("nimcache")
echo "Deleted: nimcache directory"
echo "Clean up process completed."
- if fileExists("hoge.exe"): で、hoge.exe が存在していたら、という指定になる。
- rmFile() でファイル削除。
- rmDir() でディレクトリ削除。
nimble distclean と打つと、.scr, .exe, .res が削除された。
> nimble distclean Executing task distclean in D:\home2\prg\nim\_public\ssnimsample\ssnimsample\ssnimsample.nimble Cleaning project... Deleted: ssnimsample.scr Deleted: ssnimsample.exe Deleted: resource.res Clean up process completed.
[ ツッコむ ]
#3 [nim] Nimでnglfwを使う
OpenGLを利用する際はウインドウの生成その他の処理を別の何かで行うけれど、GLUT、freeglut、GLFW 等を利用する場合が多い。ただ、それらの .dll が別途必要になると言われることも多く…。
NimでGLFWを使いつつ、exeファイル1つの中に GLFW まで含めてしまうことができる、nglfw というライブラリがあるらしい。
_RowDaBoat/nglfw: Statically linked GLFW 3.x for Nim
GLFWのソース自体を一緒にビルドしてしまうことで、DLLの添付を不要にするらしい。気になったので試用してみた。環境は Windows11 x64 25H2 + Nim 2.2. 64bit。
NimでGLFWを使いつつ、exeファイル1つの中に GLFW まで含めてしまうことができる、nglfw というライブラリがあるらしい。
_RowDaBoat/nglfw: Statically linked GLFW 3.x for Nim
GLFWのソース自体を一緒にビルドしてしまうことで、DLLの添付を不要にするらしい。気になったので試用してみた。環境は Windows11 x64 25H2 + Nim 2.2. 64bit。
◎ インストール :
インストールは以下だろうか。githubのURLを指定すればインストールできる模様。
ちなみに、git clone や zip のダウンロードでは、nglfw/src/glfw の中身が空になってしまうので、利用するにはもう一手間が必要。
_nglfw/src at master - RowDaBoat/nglfw
件のディレクトリは github上の特定のプロジェクト ―― この場合はGLFWのリポジトリへのリンクを示す機能を使っているので、ただダウンロードしただけでは中身が空になってしまうらしい。nimble install ならリンクを辿って入手してくれるっぽい。
nimble install https://github.com/RowDaBoat/nglfw
ちなみに、git clone や zip のダウンロードでは、nglfw/src/glfw の中身が空になってしまうので、利用するにはもう一手間が必要。
_nglfw/src at master - RowDaBoat/nglfw
件のディレクトリは github上の特定のプロジェクト ―― この場合はGLFWのリポジトリへのリンクを示す機能を使っているので、ただダウンロードしただけでは中身が空になってしまうらしい。nimble install ならリンクを辿って入手してくれるっぽい。
◎ サンプルをビルド :
以下にサンプルがある。
_nglfw/examples at master - RowDaBoat/nglfw
helloclear_OpenGL.nim をビルドしてみた。
_nglfw/examples/helloclear_OpenGL.nim at master - RowDaBoat/nglfw
生成された helloclear_OpenGL.exe を実行してみたら真っ赤なウインドウが表示された。ESCキーで終了することもできた。
ファイルサイズは585KB。小さ過ぎないか…? DLLが別途必要なのでは…?
Dependencies 1.11.1 x64 で .exe を調べてみたら、GLFW.dll 等は要求されていなかった。
_lucasg/Dependencies: A rewrite of the old legacy software "depends.exe" in C# for Windows devs to troubleshoot dll load dependencies issues.
たしかに、GLFWを使いつつ、exeファイル1つで済みそう。
_nglfw/examples at master - RowDaBoat/nglfw
helloclear_OpenGL.nim をビルドしてみた。
_nglfw/examples/helloclear_OpenGL.nim at master - RowDaBoat/nglfw
nim c -d:release helloclear_OpenGL.nim
生成された helloclear_OpenGL.exe を実行してみたら真っ赤なウインドウが表示された。ESCキーで終了することもできた。
ファイルサイズは585KB。小さ過ぎないか…? DLLが別途必要なのでは…?
Dependencies 1.11.1 x64 で .exe を調べてみたら、GLFW.dll 等は要求されていなかった。
_lucasg/Dependencies: A rewrite of the old legacy software "depends.exe" in C# for Windows devs to troubleshoot dll load dependencies issues.
たしかに、GLFWを使いつつ、exeファイル1つで済みそう。
[ ツッコむ ]
#4 [nitijyou] 電気カミソリの分解で四苦八苦
親父さんが捨てようとしていた電気カミソリ、National ES8046 を分解して、内蔵されているリチウムイオンバッテリーを取り出さないといけない。
_取扱説明書 の「製品を廃棄するときのお願い」ページには分解方法が書いてあるけれど、親父さんがネジ穴を潰してしまったので、最初のパーツを取り外すことすらできない。
そこで、専用工具、「ANEX なめた精密ネジはずし No. 3610-N」をヨドバシカメラから購入した。これで外せたらいいのだけど…。
ダメだった。ネジ穴が更に削れていくだけで、ネジが回っていきそうな気配が無い。20分ぐらいチャレンジしたけど、ダメだった。この工具、使えねえなあ…。めっちゃ期待してたんだけどなあ…。
_取扱説明書 の「製品を廃棄するときのお願い」ページには分解方法が書いてあるけれど、親父さんがネジ穴を潰してしまったので、最初のパーツを取り外すことすらできない。
そこで、専用工具、「ANEX なめた精密ネジはずし No. 3610-N」をヨドバシカメラから購入した。これで外せたらいいのだけど…。
ダメだった。ネジ穴が更に削れていくだけで、ネジが回っていきそうな気配が無い。20分ぐらいチャレンジしたけど、ダメだった。この工具、使えねえなあ…。めっちゃ期待してたんだけどなあ…。
◎ 作戦変更 :
作戦を変えることにした。ネジ穴の周辺に穴を開けて、ネジの頭が、パーツを抑え込まない状態にする。もし修理するつもりで分解するならそんなことしちゃダメだけど、コレは捨てる予定の製品だからボロボロになってもいいだろう…。
数十分かけて、ネジの両脇に2ヶ所穴を開けて、どうにかパーツを取り外せた。
ネジの一部が露出したのでラジオペンチで回そうとしたけれど全然回ってくれない。この固さでは専用工具があっても無理だわな…。ニッパーで少しずつネジの周辺を削り取って、ようやくネジも外すことができた。
しかし、そこからが更に大変。グリップ部分のカバーを外すと4本のネジが見えてくるので、そのネジを外してカバーを取らないといかんのだけど、3本は外せたものの、残り1本が外せない。再度「なめた精密ネジはずし」を投入してみたけれど、やっぱりネジ穴が削れていくだけ。外せそうな予感は皆無。
この工具、マジで全然使えねえ…。何かコツでもあるのだろうか。いや、ネジがガッチリ固まり過ぎた状態では役に立たないということかな…。
また作戦変更。要はネジの頭が抑えてるプラスチック部分さえ無くなってしまえばパーツを外せるはず。ニッパーで少しずつ削っていって、どうにかカバーを外せた。
これでどうにかリチウムイオンバッテリーを取り外せた。なんだかんだで2時間ぐらいかかった。疲労困憊。
数十分かけて、ネジの両脇に2ヶ所穴を開けて、どうにかパーツを取り外せた。
ネジの一部が露出したのでラジオペンチで回そうとしたけれど全然回ってくれない。この固さでは専用工具があっても無理だわな…。ニッパーで少しずつネジの周辺を削り取って、ようやくネジも外すことができた。
しかし、そこからが更に大変。グリップ部分のカバーを外すと4本のネジが見えてくるので、そのネジを外してカバーを取らないといかんのだけど、3本は外せたものの、残り1本が外せない。再度「なめた精密ネジはずし」を投入してみたけれど、やっぱりネジ穴が削れていくだけ。外せそうな予感は皆無。
この工具、マジで全然使えねえ…。何かコツでもあるのだろうか。いや、ネジがガッチリ固まり過ぎた状態では役に立たないということかな…。
また作戦変更。要はネジの頭が抑えてるプラスチック部分さえ無くなってしまえばパーツを外せるはず。ニッパーで少しずつ削っていって、どうにかカバーを外せた。
これでどうにかリチウムイオンバッテリーを取り外せた。なんだかんだで2時間ぐらいかかった。疲労困憊。
◎ Panasonicの設計がマズイ :
Panasonicのこの手の製品の設計がマズイ気がする。この電気カミソリの、元々の持ち主の親父さんは、こんな分解作業を絶対にできないだろう…。
今回、自分が居たからどうにか分解できたけど、もし親父さんが独り身で暮らしてる高齢者だったりしたら、こんな作業をできるはずがない…。
するとどうなるか。本体にリチウムイオンバッテリーが入ったままの状態で、不燃ごみとして出す以外に無い。それってゴミを収集する業者さん的にはどうなの? アリなの? ナシだよと言われても困る。だって高齢者に分解作業は無理だし、分解できないのだからバッテリーを取り出せるわけがない。
じゃあどうしたらいいのか…。
とメモしたところで気が付いた。そういえば、小型家電リサイクルというワードを目にした記憶があるなあ…。
_シェーバーの捨て方|無料回収から安全対策まで徹底解説!正しい処分方法を総まとめ - ヤマダ家電情報サイト
自治体や家電店で回収できる仕組みがある程度用意されてる場合もあるのだな…。分解/バッテリーの取り外しが無理そうだったら、そういう仕組みを利用できないか検討すればいいだけ、なのかも。もっとも、地域によってこのあたりの対応には差がありそうな気もするけれど…。
それはともかく。乾電池式シェーバーが気になってきた…。そういうタイプならこういう苦労をしなくても済むよな…。でも電池交換が面倒か。であれば、必ずコンセントかACアダプタを繋いで使うタイプはないのだろうか。ググったけどちょっと見当たらなかった。コードがあると邪魔だと感じる人が多いのだろうか。
こういうのって、スマホで使われたりするモバイルバッテリーの類を活用できないものだろうか…。外部に電源があれば楽になりそうだよな…。持ち運びが不便と言われそうでもあるけど…。いやまあ、そこは素直に乾電池式を選べや、という話になっちゃうか…。
- ボケてしまっているから、ネジ穴に合うドライバーを選ぶことすらできない。
- 脳梗塞を起こして半身麻痺状態なので、片腕に力が入らない。両手でしっかり持ってグリグリする系の作業は無理。
今回、自分が居たからどうにか分解できたけど、もし親父さんが独り身で暮らしてる高齢者だったりしたら、こんな作業をできるはずがない…。
するとどうなるか。本体にリチウムイオンバッテリーが入ったままの状態で、不燃ごみとして出す以外に無い。それってゴミを収集する業者さん的にはどうなの? アリなの? ナシだよと言われても困る。だって高齢者に分解作業は無理だし、分解できないのだからバッテリーを取り出せるわけがない。
じゃあどうしたらいいのか…。
- A. 設計を見直す。廃棄時はもっと簡単にバッテリーを取り出せる設計にする。
- B. リチウムイオンバッテリーを使わない。製品購入後に市販のニッケル水素充電池をユーザ自身が入れて利用できる製品にする。
- C. そもそも高齢者には分解作業を要求しない。電器店経由でメーカが製品本体ごと回収する仕組みを普及させるとか…。
とメモしたところで気が付いた。そういえば、小型家電リサイクルというワードを目にした記憶があるなあ…。
_シェーバーの捨て方|無料回収から安全対策まで徹底解説!正しい処分方法を総まとめ - ヤマダ家電情報サイト
自治体や家電店で回収できる仕組みがある程度用意されてる場合もあるのだな…。分解/バッテリーの取り外しが無理そうだったら、そういう仕組みを利用できないか検討すればいいだけ、なのかも。もっとも、地域によってこのあたりの対応には差がありそうな気もするけれど…。
それはともかく。乾電池式シェーバーが気になってきた…。そういうタイプならこういう苦労をしなくても済むよな…。でも電池交換が面倒か。であれば、必ずコンセントかACアダプタを繋いで使うタイプはないのだろうか。ググったけどちょっと見当たらなかった。コードがあると邪魔だと感じる人が多いのだろうか。
こういうのって、スマホで使われたりするモバイルバッテリーの類を活用できないものだろうか…。外部に電源があれば楽になりそうだよな…。持ち運びが不便と言われそうでもあるけど…。いやまあ、そこは素直に乾電池式を選べや、という話になっちゃうか…。
[ ツッコむ ]
以上、1 日分です。