2022/08/15(月) [n年前の日記]
#1 [ruby][windows] Ruby/SDLでスクリーンセーバを作れないものか
Python + pygame を使ってWindows用スクリーンセーバを作れそうなことは分かったけれど。
_pygameでWindows用スクリーンセーバを作る
Ruby/SDL でも似たようなことができないものかと疑問が湧いた。
Ruby/SDL も SDL1.x を使っていた記憶があるし、ドキュメントを眺めると SDL_WINDOWID という環境変数名が書かれていたので、コマンドラインオプション経由で得られたウインドウハンドルを使って、そのウインドウに Ruby/SDL のウインドウを埋め込むことができそうだなと。
_Ruby/SDL Reference Manual (2.x)
そんなわけで関連情報を色々ググって調べてた。
余談。Ruby/SDL 2.x のリファレンスマニュアルは Unicode (UTF-8) で書かれているっぽいのだけど、何故かhtmlソースの最初で euc-jp が指定されていて文字化けしてしまう…。Google Chrome なら「テキストエンコーディング」という拡張機能をインストールすれば文字コードを手動で選べる。
_Chromeでサイトを見ると文字化けするときの対処法 | シゴトハカドル
Firefox なら、Altキーを押して、表示 → テキストエンコーディングを修復、で文字化けが直ると思う。たぶん。
_pygameでWindows用スクリーンセーバを作る
Ruby/SDL でも似たようなことができないものかと疑問が湧いた。
Ruby/SDL も SDL1.x を使っていた記憶があるし、ドキュメントを眺めると SDL_WINDOWID という環境変数名が書かれていたので、コマンドラインオプション経由で得られたウインドウハンドルを使って、そのウインドウに Ruby/SDL のウインドウを埋め込むことができそうだなと。
_Ruby/SDL Reference Manual (2.x)
そんなわけで関連情報を色々ググって調べてた。
余談。Ruby/SDL 2.x のリファレンスマニュアルは Unicode (UTF-8) で書かれているっぽいのだけど、何故かhtmlソースの最初で euc-jp が指定されていて文字化けしてしまう…。Google Chrome なら「テキストエンコーディング」という拡張機能をインストールすれば文字コードを手動で選べる。
_Chromeでサイトを見ると文字化けするときの対処法 | シゴトハカドル
Firefox なら、Altキーを押して、表示 → テキストエンコーディングを修復、で文字化けが直ると思う。たぶん。
◎ Rubyのバージョン。 :
まず、Windows上で Ruby/SDL を使えるRubyのバージョンを調べた。Ruby 1.8 とRuby 1.9 なら動きそう。手元の環境、Windows10 x64 21H2上では、以下の2つが利用できた。
_Download Archives
どちらも32bit版であること。
どちらも32bit版であること。
大事なことなので2回言いました。Ruby/SDL のセットアップ用ファイルに含まれている各種バイナリが32bit版なので、64bit版 Ruby と組み合わせて動かそうとしてもダメだったはず。
ちなみに、Windows上でRubyのバージョンを切り替えたい時は、pik 0.2.8 もしくは uru 0.8.5 というツールが使える。
_vertiginous/pik: Ruby version manager for Windows
_jonforums / uru - Bitbucket
_uruでRubyを切り替えできるようにする - Qiita
_WindowsのRubyのバージョンをuruで切り替える方法 | TechAcademyマガジン
- ActiveScriptRuby 1.8.7 p330 i386-mswin32 (ActiveRuby.msi)
- Ruby 1.9.3 p551 i386-mingw32 (rubyinstaller-1.9.3-p551.exe)
_Download Archives
どちらも32bit版であること。
どちらも32bit版であること。
大事なことなので2回言いました。Ruby/SDL のセットアップ用ファイルに含まれている各種バイナリが32bit版なので、64bit版 Ruby と組み合わせて動かそうとしてもダメだったはず。
ちなみに、Windows上でRubyのバージョンを切り替えたい時は、pik 0.2.8 もしくは uru 0.8.5 というツールが使える。
_vertiginous/pik: Ruby version manager for Windows
_jonforums / uru - Bitbucket
_uruでRubyを切り替えできるようにする - Qiita
_WindowsのRubyのバージョンをuruで切り替える方法 | TechAcademyマガジン
◎ Ruby/SDLの入手。 :
◎ GetWindowRect や CreateMutex について。 :
スクリーンセーバを作るには、ウインドウサイズを取得したり、多重起動を抑止したりしないといけない。
となると、Ruby から .dll を使う何かしらが必要になるわけだけど…。ググったところ、win32api とか、DL とか、fiddle とか、ffi とか、そのあたりを使うことになりそうだなと分かった。
ただ、Ruby 1.8時代は win32api が使われていたけれど、Ruby 1.9 になると DL を使うことになって、Ruby 2.0以降は fiddle を使うことになっているようで…。
_DLとWin32APIとFiddle - mirichiの日記
win32api も DL も fiddle も互換性が無いそうで、Ruby 1.8 + win32api を勉強しても、Ruby 1.9 + DL を勉強しても、後々一切何の役にも立たないあたりがちょっともやもやする。
もしかして、ffi を使えば、互換性云々で悩まなくて済んだりしないのでは…? Ruby 1.9.3 p551 で使える ffi のバージョンは… ffi 1.9.14 が最終版だろうか。
_ffi | RubyGems.org
一応、上記の指定で、ffi-1.9.14-x86-mingw32.gem が落ちてきてインストールはできた。実際に動くかどうかは試してないけど…。
ただ、Ruby 1.8.7 p330 i386-mswin32版で同じことをしたら、cl.exe が無いと言われてビルドに失敗した。x86-mingw32 のバイナリを利用するわけにはいかないのかな…。
以下を打ったらインストールできたように見えるけど、果たして使えるのかどうか。
- ウインドウハンドルを元にしてウインドウサイズを取得するなら、USER32.DLL の GetWindowRect() を使えばいい。
- 多重起動を抑止するためには、KERNEL32.DLL の CreateMutex() を使えばいい。
となると、Ruby から .dll を使う何かしらが必要になるわけだけど…。ググったところ、win32api とか、DL とか、fiddle とか、ffi とか、そのあたりを使うことになりそうだなと分かった。
ただ、Ruby 1.8時代は win32api が使われていたけれど、Ruby 1.9 になると DL を使うことになって、Ruby 2.0以降は fiddle を使うことになっているようで…。
_DLとWin32APIとFiddle - mirichiの日記
win32api も DL も fiddle も互換性が無いそうで、Ruby 1.8 + win32api を勉強しても、Ruby 1.9 + DL を勉強しても、後々一切何の役にも立たないあたりがちょっともやもやする。
もしかして、ffi を使えば、互換性云々で悩まなくて済んだりしないのでは…? Ruby 1.9.3 p551 で使える ffi のバージョンは… ffi 1.9.14 が最終版だろうか。
_ffi | RubyGems.org
gem install ffi -v "1.9.14"
一応、上記の指定で、ffi-1.9.14-x86-mingw32.gem が落ちてきてインストールはできた。実際に動くかどうかは試してないけど…。
ただ、Ruby 1.8.7 p330 i386-mswin32版で同じことをしたら、cl.exe が無いと言われてビルドに失敗した。x86-mingw32 のバイナリを利用するわけにはいかないのかな…。
以下を打ったらインストールできたように見えるけど、果たして使えるのかどうか。
gem install ffi -v "1.9.14" --platform x86-mingw32
◎ exe化について。 :
exe化は、ocra を使うことになるだろうか。Ruby 1.8.7 や Ruby 1.9.3 で使えるのかどうか疑問だったけど、調べた感じでは使えそうな感じだった。Ruby 1.8 / 1.9 のどちらも、以下でインストールができた。
Ruby 1.8 限定だけど、exerb も使えるかもしれない。ただ、画像ファイルや *.so 等を1つの .exe にまとめる方法がよく分からなかった…。
※ 2022/08/19追記。Ruby 1.8.7 は ocra 1.3.1 が、Ruby 1.9.3 は ocra 1.3.10 が利用できる最終版の模様。
gem install ocra
Ruby 1.8 限定だけど、exerb も使えるかもしれない。ただ、画像ファイルや *.so 等を1つの .exe にまとめる方法がよく分からなかった…。
※ 2022/08/19追記。Ruby 1.8.7 は ocra 1.3.1 が、Ruby 1.9.3 は ocra 1.3.10 が利用できる最終版の模様。
◎ 余談。gemについて。 :
Ruby 1.8 / 1.9 は、インストールした直後から gem が使える状態になっていたのかどうか、ちょっと記憶が怪しい…。
Ruby 2.3.3 の時は、Rubygems をアップデートしないと gem が使えなかった、とメモしてあったので、ひょっとすると昔の自分は、何かそのへんやっていたかもしれないなと。
_Windows10上で Ruby 2.3.3 をインストールしようとして少しハマった
_Download RubyGems | RubyGems.org
ただ、手元の環境では gem のバージョンが古くても一応使えているように見える…。gem -v と打ってバージョンを確認したところ以下が入っていた。
まあ、gem を使って何かしらをインストールしようとしてエラーが出たら、その時に Rubygems のアップデートを検討すればいいだけの話かも。
Ruby 2.3.3 の時は、Rubygems をアップデートしないと gem が使えなかった、とメモしてあったので、ひょっとすると昔の自分は、何かそのへんやっていたかもしれないなと。
_Windows10上で Ruby 2.3.3 をインストールしようとして少しハマった
_Download RubyGems | RubyGems.org
ただ、手元の環境では gem のバージョンが古くても一応使えているように見える…。gem -v と打ってバージョンを確認したところ以下が入っていた。
- ActiveScriptRuby 1.8.7 (2010-12-23 patchlevel 330) [i386-mswin32] : gem 1.3.7
- Ruby 1.9.3 p551 (2014-11-13) [i386-mingw32] : gem 1.8.29
まあ、gem を使って何かしらをインストールしようとしてエラーが出たら、その時に Rubygems のアップデートを検討すればいいだけの話かも。
◎ 余談。Ruby 2.x.x + Ruby/SDL について。 :
Windows10 + Ruby 2.x.x 上で Ruby/SDL をインストールする方法は自分も分からないです。
たしかどこかで、DevKit(MSYS2)内にSDL関連パッケージ群を事前にインストールした上で作業すればビルドできるかも、みたいな話を見かけた記憶もあるけど。それどうやってインストールするんや…てな状態で。一応、以下のようなパッケージがあるらしいけど…。
_Base Package: mingw-w64-SDL - MSYS2 Packages
_Base Package: mingw-w64-SDL_image - MSYS2 Packages
_Base Package: mingw-w64-SDL_gfx - MSYS2 Packages
_Base Package: mingw-w64-SDL_net - MSYS2 Packages
_Base Package: mingw-w64-SDL_ttf - MSYS2 Packages
_Base Package: mingw-w64-SDL_mixer - MSYS2 Packages
これが Debian Linux や Ubuntu Linux なら、ruby-sdl というパッケージが用意されているので、sudo apt install ruby-sdl であっさりインストールできるのだけど。
_Ubuntu - jammy の ruby-sdl パッケージに関する詳細
_Debian -- bullseye の ruby-sdl パッケージに関する詳細
ちなみに、gosu という、これまた SDL を使ったゲーム制作用ライブラリは、Windows10 x64 21H2 + Ruby 2.6.10 p210 i386-mingw32 (32bit) 上でも、gem install gosu で gosu-1.4.3.gem が落ちてきて、ビルドしてインストールできてるのですが…。
たしかどこかで、DevKit(MSYS2)内にSDL関連パッケージ群を事前にインストールした上で作業すればビルドできるかも、みたいな話を見かけた記憶もあるけど。それどうやってインストールするんや…てな状態で。一応、以下のようなパッケージがあるらしいけど…。
_Base Package: mingw-w64-SDL - MSYS2 Packages
_Base Package: mingw-w64-SDL_image - MSYS2 Packages
_Base Package: mingw-w64-SDL_gfx - MSYS2 Packages
_Base Package: mingw-w64-SDL_net - MSYS2 Packages
_Base Package: mingw-w64-SDL_ttf - MSYS2 Packages
_Base Package: mingw-w64-SDL_mixer - MSYS2 Packages
これが Debian Linux や Ubuntu Linux なら、ruby-sdl というパッケージが用意されているので、sudo apt install ruby-sdl であっさりインストールできるのだけど。
_Ubuntu - jammy の ruby-sdl パッケージに関する詳細
_Debian -- bullseye の ruby-sdl パッケージに関する詳細
ちなみに、gosu という、これまた SDL を使ったゲーム制作用ライブラリは、Windows10 x64 21H2 + Ruby 2.6.10 p210 i386-mingw32 (32bit) 上でも、gem install gosu で gosu-1.4.3.gem が落ちてきて、ビルドしてインストールできてるのですが…。
[ ツッコむ ]
以上です。