mieki256's diary



2023/10/01() [n年前の日記]

#1 [hsp] 疑似3D道路その23

_先日 の続き。HSP 3.6 を使って、疑似3D道路が作れないか試しているところ。環境は Windows10 x64 22H2。

ログハウスの画像を作って、ビルボード種類として増やしてみた。ただ、画面に出してみたら見た目がおかしいというか、パースがおかしいというか…。とにかく不自然なので試行錯誤中。

透視投影と平行投影 :

最初に作ったログハウス画像は、blenderで透視投影にしてレンダリングして作ったのだけど、画面に出してみると不自然極まりなくて…。結局、平行投影でレンダリングした画像を使うことにした。下の図で言えば、最初に作ったダメバージョンが D に近いもので、最終版が Bタイプ。

about_billboard_ss01.png

実際に画像を見たほうが分かりやすいのだろうか…。ダメな版が以下。透視投影。

render007.png


まだマシに見えたのが以下。平行投影。

render009.png

ちなみに、モデルデータはどちらも同じもの。透視投影と平行投影で、これだけ見た目が違ってくる。


ビルボード用の画像を透視投影で作ると、斜めの線が入ってしまう。その斜めの線が一点透視の消失点の位置を想像させるわけだけど、道路の消失点と建物の消失点がずれてしまって不自然に見えるのだろうなと…。

about_billboard_ss01.png


その点、平行投影で画像を作れば、消失点が感じられない見た目になるので、画面内にたくさん並べても、見ているこちらは、そのビルボードの大きさだけで奥行きを推測している状態になって、まだマシに見えるのだろう。その代わり、ビルボード一つ一つは、その一枚だけを見ても奥行きが感じられない見た目だから、画面全体的には、なんだかどことなく奥行き感が乏しくなる気もする。

about_billboard_ss02.png

基準点をどこにするか :

ビルボードの基準点をどこにするかで、見た目の不自然さが変わってくるのではないかと疑ったりもする。

今現在、ビルボード画像の底辺上に基準点があることにしているので、動かすと建物の斜め部分が宙に浮いてる感じになって不自然さが増したのではないかなと。本来、その人工物の、見た目の中央に基準点を設定するのが正しいのではないか、それなら動いた時に少しは自然に見えないか。

下の図で言えば、一番下の赤い十字が今現在の基準点だけど、本当はその上の赤い十字が妥当な基準点なのではないかなあ、と…。いやまあ、試してないから本当にそうなるのか分からないけど。

about_crosspoint_ss01.png

2023/10/02(月) [n年前の日記]

#1 [hsp] 疑似3D道路その24

_昨日 の続き。HSP 3.6 を使って、疑似3D道路が作れないか試しているところ。環境は Windows10 x64 22H2。

近所の道路をウロウロすると、道路脇の斜面をコンクリートっぽい何かで覆ってる場所に遭遇したりするのだけど。アレをビルボードで表現できないものかなと思いついて、そのあたりを試してみた。

法面保護工事 :

あのコンクリートっぽい何かはどう呼ばれているのか分からなくて、まずはそこから調べてみた。

どうやら、「法面(のりめん)保護工事」と呼ぶらしい。更に、その工事にはいくつか種類があって、自分が気にしていたソレは、「吹付枠工」「吹付法枠工」「フリーフレーム工法」と呼ばれるものらしい。

_工法紹介|五建工業株式会社
_吹付枠工|事業案内|グリーン工業株式会社|エコな安全とクリーンな環境作りで熊本をもっと素敵に|法面保護工事・土木一式工事・造園工

しかし、参考になりそうな写真画像がなかなか見つからない。いや、件の単語でググればそれっぽい画像は出てくるけれど、工事中の写真がほとんどだし、「こういうものですよ」と分かればOKだから画像サイズも小さかったりで。完成後の、「その場所に馴染んだ風景としてはこうなりますよ」みたいな写真は皆無で…。

車やバイクを走らせている人達なら散々アレを目にしているはずだけど、アレに格別思い入れを持って、それぞれを紹介してる人なんて居るはずもなく。誰も意識的にアレにのみ注目して写真を撮ったりしないし、撮影してないのだからネットにアップされるはずもなく。ドライブ中の撮影動画の中にチラリと出てくることはあるけれど、何かの呼称をつけて紹介してるわけでもないから、画がテキスト情報と紐づけられてない。故にググっても全く出てこない。

ちゃんと表現したいなら、現地に行って自分で写真を撮って観察しないと ―― ロケハンが必要になるのかもしれんなあ、と思えてきた。

角度が合わなくて悩んだ :

とりあえず、blender 3.6.4 x64 LTS を使って、アレっぽいモデルを作って、レンダリングしてビルボード用の画像にしてみたけれど。HSPのプログラムで表示してみると、不自然極まりない…。

昨日作ってたログハウスは平行投影で誤魔化したけど、今回のソレは、そういうわけにもいかず。地面と設置してる側面部分を斜めの線にしないと雰囲気が出なくて、しかし画面に出して動かしてみると盛大におかしくなって、どうしたものかと…。

  • ビルボード画像内に含まれている斜め線は、拡大縮小しても、見た目の角度は変わらないはず。
  • 一点透視の消失点から伸びる直線上を、基準点が移動していく限りは、ビルボード内の斜め線も奇麗に揃ってくれるはず。
そう考えて、ビルボード用画像内の、斜め線の一端が基準点になるような画像を作成すれば ―― 下の図で言えば斜め線の端の部分が基準点なら上手くいくのではないかな、と予想したのだけど。実際やってみると、上手く行かない…。カメラに近づいて拡大描画されると、斜め線の部分が盛大にずれてくる…。

render0003_about_refpoint_01.png

赤い線の上を、基準点が移動して、その状態で拡大縮小する分には、ビルボードの斜め線の部分は赤い線と一致しそうな気もするのだけどなあ…。

もしかして、拡大縮小描画が正確にできていないのではなかろうか…。今回、画面内に描画される領域を求めて、その範囲だけを描画するように指定してるつもりだけど、その計算が間違ってたりする可能性もあるのだろうか…。

斜め部分を減らしてみた :

当初、斜め部分のマス目を8x10ぐらいにしていたけど、奥行き方向が短ければ多少は誤魔化せるのではないかと、4x10、3x10、2x10と短くして試してみた。結局、2x10 にして、短くなった分ビルボードの枚数を増やしてやることで、不自然さが多少改善された感じになってきた。

具体的には以下のような画像になった。前述の画像のソレと比べると、側面というか、斜め部分がかなり少なくなって、画像サイズも 1024x512 から 512x512 に減ってくれた。

render0003_c_512x512.png


実際に画面に出すと、以下のような感じ。

road09.hsp.ss01.png

まあ、悪くないのではないかと…。奥のほうで、木の影がチラッと出ちゃってるのがアレだけど…。地面の色が一色なら、斜め線の下のあたりを塗り潰すように何か埋めておくのも手だろうか。今回、地面の色は2色あるから、そういう手は使えないけど。

ちなみに、件のソレを描画する際、一番手前には森っぽい感じの横長ビルボードも置いてみた。結構ソレだけでも見た目は誤魔化せるなと…。

ソース :

現状のソースと画像は以下。

_road09.hsp
_trees.png
_bg_2560x1440.jpg

2023/10/03(火) [n年前の日記]

#1 [web] Evernoteアプリ版をアップデートしてガッカリ

Windows10 x64 22H2上で、ローカルにインストールしてある Evernoteアプリ(Evernote for Windows)を起動したら、「このバージョンは古いのでもうサポートしない。アップデートしろ」と表示されてしまった。仕方ないのでアップデートしてみたのだけど…。

アップデートインストールの処理中に Windows10 がブルースクリーン(BSOD)になった。なんてことをしてくれるんだ。まあ、それはいい。自分の環境は、この手の処理をしようとすると時々ブルースクリーンになる状態になってしまっているので…。

ただ、アップデートしたEvernoteアプリ(Evernote for Windows)の画面を見て困惑。フォントが見辛い…。なんだコレ…。フォント種類が好みではないし、文字色も薄い。

少し試用してみたけれど、どうやらローカルにインストールされているフォントを指定できない仕様のようだなと。せめてデフォルトフォントだけでも変更できればいいのだけど、そんな機能すらない。

古い版ではできていたことが、現行版ではできなくなってる。現行版の利用を強制しておきながら、このヘボさ…。ガッカリ。

でもまあ、どうしてこうなったかは、なんとなく分からないでもないような。Webブラウザ上でのサービス利用時とほとんど同じ使用感にすることを目標としてアプリ版を作ったのではないかな…。おそらく、Web版を単にウインドウ内に表示しているだけのアプリなのでは。そして、Web版では、ローカルにインストールされてるフォントを指定できないのだろうから、その制限がアプリ版にもついて回っている、ということではないかと。

でも、Webブラウザって、デフォルトフォントを指定できるものだよな…。しかし、Evernoteアプリ版はソレができない…。これでは只のクソアプリではないか…。いやまあ、「アプリ版なんて使うな」「Webブラウザ経由で利用しろ」と強制したい意思があるのかもしれんけど。

cssを弄って少しフォントを変えた :

文字すら読めないサービスでは、今後積極的に使うのは厳しくなるなと。結構メモを溜めてしまったのに…。どうにかならんか。

ググってみたら、cssを弄ることで、ちょっとだけどうにかできる方法もあるらしい。

_Evernote WebのデフォルトフォントをCSSでメイリオに変更する - nu notebook
_Evernote for Windows(アプリ版)のデフォルトフォントをCSSでメイリオに変更する - nu notebook

とりあえず、Webブラウザ経由でアクセスした時ぐらいはメイリオフォントにしたい。Stylus という拡張機能を Google Chrome、Firefox、Vivaldi にインストールして、Webブラウザで evernote.com を開いた時だけ、デフォルトフォントだけでも変更されるように設定してみた。

@-moz-document domain("evernote.com") {
    body en-note.peso {
        color: black;
        font-size: 18px;
        font-family: "Meiryo, Source Sans Pro,-apple-system,system-ui,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif" !important;
    }
}

Stylus のアイコンをクリック → 管理 → 新スタイルを作成 → 前述のコードを貼り付け → スタイルを上書き → 名前を付けて保存をクリック。

古い版に戻した :

アプリ版でもデフォルトフォントを変更できないものかと試していたけれど、これがなかなか面倒で…。関連情報を調べていたら、まだ一応、古いアプリ版、Evernote Legacy を使えなくもないと知ったので、そちらをインストールし直すことにした。Evernote_6.25.3.9348.exe を入手して実行。インストール時の詳細設定で、すべてのユーザ、ではなく、このユーザのみ、を選んでインストールしておいた。

#2 [cg_tools] Fooocus-MREをインストール

SDXL に対応した画像生成AIツール、Fooocus-MRE 2.0.78.5 を、Windows10 x64 22H2 + 16GB RAM + NVIDIA GeForce GTX 1060 6GB 上でインストールしてみた。

元々、Fooocus という、SDXL対応のツールがあったけど、そのツールは細かい機能や設定をごっそり削除した作りで…。何せ、画像の中に、画像生成時のパラメータを同梱することすらしていなくて。それでは画像生成AIで生成した画像ということも分からなくなるよなと…。

そこで、Fooocus をフォークして、各種機能を追加した Fooocus-MRE というツールが作られたそうで。せっかくだから少し試用してみようかなと。

_GitHub - MoonRide303/Fooocus-MRE: Focus on prompting and generating

Fooocus-MRE-v2.0.78.5.7z を入手して解凍。中に入っている run-mre.bat を実行すると、初回起動時のみ、sd_xl_base_1.0_0.9vae.safetensors、sd_xl_refiner_1.0_0.9vae.safetensors、その他をダウンロードする。その後、自動でWebブラウザが開かれて利用できるようになる。

各ファイルのサイズはかなり大きいので、今回はDドライブのHDD上にインストールした。
使えるようになるまで10分ぐらいかかる。自分の環境は RAM 16GB しか積んでないから、おそらくメモリが足りなくて、CドライブのSSD上に仮想メモリを作ってどうにか動いてる状態じゃないかなと…。

#3 [anime] 「ルパン三世 風魔一族の陰謀」を視聴

BS12で放送されていたソレを録画していたので視聴。初見。

ルパン三世アニメ版におけるルパンの声と言えば、山田康雄さん、もしくはクリカンさんなわけだけど。この作品は、ルパンを古川登志夫さんが演じているという変わり種。ルパン一味も、銭形警部も、普段とは違う方々が演じてる。どんな印象になるのかなとワクワクしながら見始めたけど、これは全然アリだなと…。さすが声優さん達。皆さんフツーに上手いな…。あっという間に慣れてしまった。違和感無し。 *1

作画面は凄かった。とにかく動く。ひたすら動く。動きまくる。ここまで動かしてしまうのかと怖くなってくるぐらいに動きまくり。「カリ城」を作ったテレコムが制作を担当してるし、「カリ城」の作画監督だった大塚康生さんが監修してるし、作監は「カリ城」のカーチェイスシーンを担当してた友永和秀さんだしで、作画面は文句のつけようがない出来になってたなと…。

あちこちに、「カリ城」やTVシリーズのオマージュやパロディが入ってたあたりも面白かった。「そこに俺の服があるから着替えな」と言われて ヒロインが赤ジャケットを着てしまうあたりとか。 幻覚を見るシーンで代々のTVシリーズのキャラデザが次々に出てくるあたりとか。こういうお遊びは好き。

忍者が出てくる設定なだけあって、からくり屋敷っぽいアイデアが山のように投入されていて、そのあたりも好印象。よくまあこんなにアイデアを思いつくものだなと…。

しかし、話と言うか、全体の印象は、「カリ城」の劣化コピーな感じがして…。終わり方も「えっ? これで終わり?」という印象が…。全然締まらないなと…。作画スタッフは似たようなソレでも、宮崎駿監督が居るか居ないかで、こんなにも印象が違ってくるものかと痛感してしまった。

でも、盛り込まれてるアイデアの量は尋常じゃないんだよな…。実は宮崎駿監督がアイデア出し関係で多少手伝ってたりはしないのかなと思ったけど、「ナウシカ」アニメ版が1984年、「ラピュタ」が1986年、この作品が1987年、「トトロ」が1988年だから、手伝ってる余裕はないよな。たぶん。

とりあえず、作画面は見所満載だし、声優陣がまるっと違うのも新鮮なので、悪くない作品に思えた。これを黒歴史にするのは、あまりにももったいない。
*1: もっとも、原作者にも山田康雄さんにも話を通さずにキャスティングしてしまって、山田康雄さんが大激怒して、それ以来声優さんを変えることが難しくなったという話をどこかで見かけた記憶も…。そのせいで、山田さんが亡くなったら物真似路線でクリカンさんが選ばれるわ、TVSPの頃には中の人達が御歳を召してフガフガ状態になっても変えるわけにもいかないわ、みたいな展開になってしまったわけで…。この作品で流れが決まってしまったよなと…。もしも当時、プロデューサーがちゃんと話を通しつつ、このキャスティングを成立させていたらと考えてしまう…。でもまあ、今現在は代替わりできてるから、今更な話ではあるか…。

2023/10/04(水) [n年前の日記]

#1 [cg_tools] 画像生成AIを試用中

SDXLに対応している Fooocus-MRE をせっかくインストールしたので、ちょっと触り始めたのだけど。PCのスペックが足りなくて、重い…。使えるようになるまで10分かかるのはキツイ。モデルデータを切り替えると、そこからずっと待たされるし。これは厳しい…。

やはり SDXL を自分の環境で使うのは難しいな、SD1.5 までが限界だよなと思えてきたので、Stable Diffusion web UI を再度触り始めた。ググっていて、いくつか見かけた学習モデルデータを入手して、どんな具合か確認しているところ。

#2 [anime] アニメの本数が多過ぎる気がする

思考メモ。

新番組のTVアニメ群を、HDDレコーダ TOSHIBA RD-BZ710 上でポチポチと録画予約してたのだけど。予約録画最大数を使い切って「予約が一杯です」と言われてしまった。うーん。

自分は田舎に住んでいるので、地上波でアニメが放映されることは稀だから、ほとんどのTVアニメはBS放送で視聴しているのだけど。都市圏と比べたらはるかに本数が少ないはずなのに、それでもこの状態。うーん。

日本のアニメの制作本数、ちょっと多過ぎるんじゃないですかねえ…。同じ時間帯に放送してお互い潰し合うアニメがどんどん増えてきたなと感じてはいたけど…。

ネットで見かけた、制作進行・制作管理の方へのインタビュー記事の中で、「昨今は仕事を発注したくて100人のアニメーターさんに連絡しても99人に断られてしまう」という話が出ていたけれど。この本数ではそりゃ断られますわな…。誰だって何かしらの企画に関わっていて忙しいはずだし…。

やっぱり作り過ぎなんじゃないかな…。「裾野が広くないと山は高くならない」とは言うけれど、もうそんな悠長なことを言っていられる状況ではないのでは…。

全部見れるわけがない :

そもそも、放送されてるアニメは全部見なくては、などと強迫観念っぽいものを持ってしまっている自分が一番異常なのだけど。

世に出た小説、もしくは漫画に対して、その全てに目を通すのは不可能だし。世に出た音楽を全て聴くのもやはり不可能だし。TVゲームも同様で、全てをプレイするのは不可能なわけで。映画だってそうだよな。全ての映画を視聴するなんて不可能。そして、TVアニメも当の昔にそうなってる。それだけの話だよな…。

このあたり、自分の場合は、田舎に戻ってきて地上波しか見れなかった時期の反動なんだろうなと…。何せ田舎の地上波ではアニメなんてほとんど放送されてないので、その飢餓感からアンパンマンを食い入るように見ていたという…。BSチューナーが手に入って、一気に視聴できるアニメの本数が増えて、せっかくだから放送されてるアニメは極力目を通しておきたい、みたいな気持ちになっちゃって、それがずっと続いてる気がする。

それはともかく、どうしたもんか。いやまあ、何作品かは最初から視聴を諦めるしかないのだけど。一体何を基準にして切っていくべきなのか…。

アレかな。タイトルに「異世界」や「転生」が入ってる作品は問答無用で切る、というのもアリだろうか。それだけでもごっそり本数を減らせそう。あるいは、「悪役令嬢」と入ってるものを切るのもアリかも。いくつか見てきたけど、どれも似たり寄ったりだったから、しばらくは新規性を持った作品は出てこないだろう。公式サイトでイケメンキャラがずらりと並んでる作品も切っていいかも。男性アイドルモノをおじさんが楽しめるわけないし。などと思ったけれど、どのジャンルも稀にちゃんと面白い作品があったりするから、やっぱり悩む…。

再放送されてるアニメは…これも悩む…。続編の放送に先駆けて再放送してる場合が多いので、復習しておかないと続編が楽しめなかったりするし…。TV放送が2倍速再生できればいいのにな…。いや、それ、ひょっとしてネット配信ならできるのでは。実はネットで見るのが一番効率が良かったりしないか。と言っても、TV放送されてる作品を消化するだけで精一杯なのに、ネット配信まで見ている余裕は無いのだけど…。

なんだかファスト映画ならぬファストTVアニメが求められてる気がしてきた。いや待て。そもそも今のTVアニメが無駄に長過ぎるのではないか。最初から30分のTVアニメじゃなくて15分のTVアニメとして作ってしまえば、スタッフも視聴者も、皆が幸せになるのでは。と思ったけれど、たぶん尺を減らした分、作品数が倍になりそう。ダメじゃん。意味ないじゃん。

思考メモです。オチは無いです。

2023/10/05(木) [n年前の日記]

#1 [cg_tools] 画像生成AIをまだ試用中

Stable Diffusion web UI を試用中。入手した学習モデルデータの様子を確認している感じ。

余談。ガチャは怖い :

久しぶりに触ってみたけど、画像生成AIってヤバイなと…。イマイチな画像が生成されても、「次こそはイイ感じな画像を生成してくれるのでは?」と期待してしまって、ついつい何度も、まるで猿にでもなったかのように生成ボタンをクリックしてしまう…。終わらない…。自分はパチンコパチスロはやってないけど、ああいったものにハマってる方々も、おそらく近いものがあるんだろうなと。「次こそは当たりが出るのでは…?」みたいな。いやまあ、画像生成AIも巷では「ガチャ」と言われてるぐらいなので、結局「ガチャ」ってそういうものなんだろうけど。

2023/10/06(金) [n年前の日記]

#1 [cg_tools] 画像生成AIをまだまだ試用中

Stable Diffusion web UI を試用中。環境は Windows10 x64 22H2。

Stable Diffusion web UIをアップデートした :

今まで Stable Diffusion web UI 1.5.1 を使っていたけど、1.6.0 にアップデートしてみた。Stable Diffusion web UI がインストールされてるフォルダをエクスプローラで開いて、右クリック → Git Bash Here を選ぶと、Git インストール時に一緒にインストールされた bash が起動するので、そこで git pull と入力。今回はすんなりとアップデートできた、ような気がする。

ADetailerを試用 :

Stable Diffusion web UI は、生成画像内の人物の顔の部分が小さくなると崩れてしまいがちなのだけど、ADetailer という拡張を使うと顔だけを解像度を高くして生成できるらしいので導入してみた。

_GitHub - Bing-su/adetailer: Auto detecting, masking and inpainting with detection model.

たしかに崩れていた顔の部分はそれなりにまともな見た目になった。コレは良いな。と思ったけれど、何回か使ってみたら、かえって妙な生成結果になることも多いように思えてきた。

今までは、生成結果を一旦 img2img に転送して、inpaint で顔の部分だけマスクを作って数パターン生成してみて一番良さそうなものを選ぶ、ということをしていたのだけど。ADetailer を使った場合、元の生成画像と同じseed値を使って生成し直すようで、数パターンほど生成してみるといったことはできないようだなと。

2023/10/07() [n年前の日記]

#1 [cg_tools] 画像生成AIをもうちょっと試用中

Stable Diffusion web UI を試用中。環境は Windows10 x64 22H2。

img2imgが受け入れられる画像種類がありそう :

ADetailer という拡張を使えば、面積が小さくて崩れてしまった人物の顔も修正できると知ったので、導入して、何度か生成して様子を見ているのだけど。その ADetailer を経由させた生成画像を、img2img に転送して、そこから更に顔を修正しようとしたら、とんでもなく崩れた顔になることに気づいた。

ADetailer は、ある程度の大きさで生成した顔だけの画像を縮小して元の部分に重ねていると思うのだけど。おそらく、拡大縮小して合成された画像を img2img に渡すと、そこに描かれている情報を正しく読み取れなくなって、おかしな画像を生成してくるのではないだろうか。

と言うのも、以前、GIMP か何かを使って、各レイヤーを存分に拡大縮小して作ったコラージュ画像を img2img に渡して処理したら、その時もとんでもない生成結果になった記憶があって。今回もその事例と同じ状態に陥ったのではないかなと…。

学習時はまた別 :

ただ、この問題は、img2img を使う時だけ発生する問題で、学習元画像として各画像を与える際には、画像の縮小処理はさほど影響を与えないのだろうとも思えてきた。

何故そう思うかと言えば、画像生成AIが学習する際に用いているのであろう、Web上で公開されている画像ファイル群は、その大半が、元画像から何かしら縮小された画像のはずなので…。縮小処理を加えた画像では学習できなくなるとしたら、ほとんど何一つ学習できない状況に追い込まれるはずだけど、実際にはそうなっていないのだから、縮小画像も学習に使える、ということなのだろう。

そもそも、SD1.5 のように、512x512 の画像群で学習させたと言っている学習モデルデータもあるわけだし。大きな画像も512x512に縮小して渡してやらないと、そういった学習はできないよなと。

なので、「画像を縮小さえしておけば学習に使われずに済む」という単純な話では無さそうで、そこはなんだか残念(?)だなと。

ただ、img2img のソレを見る限り、画像生成AIの動作がおかしくなる学習元画像だって存在してそうな気配がする。まあ、生成AIの生成結果を学習元データとして投入し続けると、生成AI(の学習モデルデータ)が壊れていくというレポートもあるらしいし。画像全体に妙なノイズを載せることで学習元データにされずに済む、と謳っているツールのニュースも見た記憶があるし。そのうちそういったツールが普及するのかもしれないなと…。

2023/10/08() [n年前の日記]

#1 [movie] 「キングコング対ゴジラ」「メカゴジラの逆襲」を視聴

BS12で放送されていたので視聴。「キングコング対ゴジラ」は途中から見始めた。1962年の映画。「メカゴジラの逆襲」は最初から最後まで見た。1975年の映画。どちらも初見。

子供の頃から、「勝手にキングコングを登場させちゃっていいのかよ…」と思っていたけど、ググってみたらちゃんと許諾を貰って作った映画だったらしい。まあ、そりゃそうだよな…。いくら昔の日本人はそのへんの意識がアレだったと言っても…。タイトル内でキングコングのほうが先になってるあたりも、お客様扱いという感じなのかなと…。

しかしコレ、アメリカではどういう感想を持たれたんだろうか…。元々「キングコング」はコマ撮りで動かしてた気もするけれど、着ぐるみで動いてるキングコングは、あちらの人達にとってアリだったのかナシだったのか…。

「メカゴジラの逆襲」は、ここで一旦シリーズが休止になった映画だそうで。怪獣がなかなか出てこないな、ずっと人間ドラマパートだな、子供さん達飽きちゃうんじゃないかと思ってたけど、オイルショックのせいで制作予算も厳しくなっていた時期らしくて、予算の少なさでそうなっていたのかなと邪推してしまった。

マッドサイエンティストと、 サイボーグ化された娘さんが出てくるけれど、この設定だけで別作品を作れそうだなとも…。いやまあ、「ミラクル少女リミットちゃん」を思い出したりもするけれど。ちなみに「リミットちゃん」は未見。どういう話になってたのか少し気になる。

トラックに轢かれて昨今ありがちな異世界転生、と思いきや父親がマッドサイエンティストだったおかげで、そのまま現世で サイボーグとしてヒロイン復活、みたいな設定はどうだろうと…。

2023/10/09(月) [n年前の日記]

#1 [pc][web][hns] このWeb日記のURLが汚染されてしまった

たまたま Google検索していたら、自分が書いてる、このWeb日記の1ページがリストアップされたのだけど、URLを目にして「?」となった。

url_spam.png

なんか変な文字列が入ってる…。ナニコレ…?

気になってググってみたけれど、Google にしろ、Bing にしろ、このWeb日記ページへのURLの大半が、この妙な文字列で汚染されていた。これもいわゆるスパムの類なのだろうか…? しかも何故か、このWeb日記だけがリストアップされる…。狙い撃ちされてるんだろうか…?

開けてしまう原因 :

この妙なURLでも、cssや画像へのアクセスはできないものの、テキストページ自体は表示できてしまって、どうしてこんなURLで開けるのかと悩んでしまったけれど。Apache2 の mod_rewrite の指定に隙(?)があったようだなと…。URLの最後に YYYYMMDD.html の記述さえあれば、その前にどんな文字列が含まれていても、YYYYMMDD.html が開けてしまう指定になっていた。

元々の指定ではそうなってなかったのだけど、何かしら理由があってそういう指定に変えたような気も…。でも、理由を忘れた…。

対策してみた :

とりあえず、このWeb日記と一切何の関係もない文字列がくっついてくるのは非常に気持ち悪いので、本来の 〜/~mieki256/diary/YYYYMMDD.html でしかページを開けないように RewriteRule を変更しておいた。具体的には、数字を判定する前に「^」をつけただけ。
RewriteRule ([0-9][0-9][0-9][0-9])([0-9][0-9])([0-9][0-9])\.html$ index.cgi?$1$2$3 [NE,T=application/x-httpd-cgi,L]
↓
RewriteRule ^([0-9][0-9][0-9][0-9])([0-9][0-9])([0-9][0-9])\.html$ index.cgi?$1$2$3 [NE,T=application/x-httpd-cgi,L]

しばらくの間、Google や Bing から、件の妙なURLでは飛んでこれなくなるだろうけど、そのうちクローリングされて今回の修正が反映されるといいなと…。反映されるのかな…。どうなることやら…。

それにしても、件の文字列からして中国人の仕業なのだろうけど、つくづく中国人はろくなことをしない…。以下のページを参考にして、試しにその手の文字列でも書いてみようか…。

_無断転載除け
_pixivごと転載する中華サイト「vpixiv」に対して絵師が”魔法の言葉”を発動させて撃退 - Togetter

まあ、効果があるのかどうかは分からんけど…。目にして気分がいいものでもないだろうから、もんたメソッドで隠しておく…。

六四天安門事件 The Tiananmen Square protests of 1989 天安門大屠殺 The Tiananmen Square Massacre 反右派鬥爭 The Anti-Rightist Struggle 大躍進政策 The Great Leap Forward 文化大革命 The Great Proletarian Cultural Revolution
人權 Human Rights 民運 Democratization 自由 Freedom 獨立 Independence 多黨制 Multi-party system 台灣 臺灣 Taiwan Formosa 中華民國 Republic of China
西藏 土伯特 唐古 特 Tibet 達喇嘛 Dalai Lama 新疆維吾爾自治區 The Xinjiang Uyghur Autonomous Region 東突厥斯坦 East Turkestan 内蒙古自治區 The Inner Mongolia Autonomous Region 南蒙古 South Mongolia

2023/10/10(火) [n年前の日記]

#1 [nitijyou] コロナワクチンを打ってきた

コロナワクチンを打ってきた。4回目。無料で接種できるのは今回までらしい…。

今まではファイザーを打ってた記憶があるけれど、今回はモデルナしか選択肢が無かった。モデルナを打つのは初めて、かもしれない。

場所は須賀川市役所。11:45に予約を入れていたので、電動アシスト自転車に乗って、11:30頃に到着。市役所入り口で、非接触体温計で体温測定。予約時間になるまで1階のフロアで待って、名前が呼ばれたら3階に。ワクチン接種して、体調が悪くならないか少し様子を見て、市役所を出たのは11:56頃。

須賀川市役所は、東日本大震災の時に建物自体が大きく歪んでしまって、その後全部建て直しになったのだけど、新しくなった建物内に入ったのは初めてのような気がする。というか、前の建物に入った記憶がそもそも無いな…。市役所に入ること自体が初めてかも…。中は随分と広くて、全面ガラス張りで明るいなと。またあのクラスの地震が来た時にどうなるかを想像すると不安だけど、さすがに何かしら対策した上で建ててるんだろう…。

帰りにザ・ビッグによって夜食を購入。

帰宅した頃から、体のあちこちが痛くなってきた。特に首の周りが痛い。副反応だろうな…。21:00頃になったら37度ぐらいの熱が出てきた、と思ったけれど、予測測定じゃなくて10分かけて実測したら36.5度ぐらいだった。今のところ熱は出てないようだな…。

2023/10/11(水) [n年前の日記]

#1 [nitijyou] コロナワクチンの副反応が出てる

昨日、モデルナのコロナワクチンを接種してきたけれど、今日の03:00頃から昼ぐらいまで、38.5度の発熱。一日中寝てた。夕方頃になったら37.1度まで下がってきた。

体のあちこちが痛いのもなかなかツライ。特に目の周りが痛いのだけど…。指で顔のあたりをギューギュー押して誤魔化してる状態。

改めてググってみたら、モデルナの場合、打った翌日あたりが副反応のピークになるそうで。また、外国人が接種した場合は1〜2割の人しか発熱しないけど、日本人が接種すると何故か7〜8割が発熱するという話もあるようで。お医者さんが、「外国人と日本人でここまで差が出るのはなんでだろ」と首を捻ってる感じの発言も見かけた。

2023/10/12(木) [n年前の日記]

#1 [prog][ruby] ゲームエンジンの定義がよく分からない

ネットを眺めてたら、以下の記事が目に入った。

_130種以上のゲームエンジンを「価格」「言語」「プラットフォーム」などで絞り込んで検索できる「Game Engines Database」 - GIGAZINE
_Game Engines Database

この手の情報がまとめてあるのは良いことだなと思いながら件のサイトを眺めつつ。そういえばRubyのソレはどのくらいあるのかなと選んでみたら、DXRuby どころか Gosu すら登録されてなくて。うーん。

_Project DXRuby
_Hello - Gosu

Ruby界隈は死んでるというか、すっかり不人気だなあ、言語本体だけがいくら頑張ってもサードバーティ(?)を大事にしないとこういう状況になるのだろうな、という気分に。

でもまあ、DXRuby や Gosu は、ゲームエンジンというより2Dゲーム制作ライブラリだろうし、ゲームエンジンとして載ってなくても別におかしくはないか…。

と思ったのだけど、件のサイトに Python の PyGame が載っていて首を捻った。あれこそ正しく、只の2Dゲーム制作ライブラリで、ゲームエンジンでは無いのでは…? PyGame が載ってるなら DXRuby や Gosu が載っていてもおかしくないよな…。さらに、PyGame が載ってるなら HSP だって載っていてもいいんじゃないかとも思えてきた。もっともそれぞれ、英語圏の方々が使える状況になっているのかと考えると悩んでしまうけど。Gosu はともかく DXRuby と HSP は、ドキュメント関係を鑑みると日本人専用っぽいところがあるし。

何にせよ、ゲームエンジンの定義がよく分からなくなってきた。一般的には何を満たしてたらゲームエンジン扱いされるのやら。

それはさておき、件のサイトの「Suggest」から、「こういうゲームエンジンもあるよ」と投稿できるっぽい。この際投稿してみるかと思ったのだけど、自分、英語が全然ダメなので、Gosu や DXRuby や HSP の説明文をどう書けばいいのかで悩んでしまって…。いや、そもそも日本語で説明文を書こうとしても悩んでしまうか…。それぞれの特徴って何だろう…。

2023/10/18追記 :

今確認してみたら、Ruby使用のゲームエンジンとして Gosu が追加されていた。良かった。さすがに Gosu を無視するのはおかしいもんな…。

2023/10/13(金) [n年前の日記]

#1 [prog][windows] CUIファイラー lf を試用

lf という、ターミナルで動作する(CUI/CLIで動く)ファイラーを、Windows10 x64 22H2 上で試用してみた。Windows上では、DOS窓(cmd.exe)、もしくは、Powershell上で動く。昔、NEC PC-9801を触っていた人であれば、FD や FILMTN みたいなソフトと伝えればジャンルが分かりそう。

_GitHub - gokcehan/lf: Terminal file manager

Go言語で書かれたファイラーらしい。Ranger という、Python で書かれたCUI(CLI)ファイラーから影響を受けている。

以前もインストールしてたっぽいのだけど、使い方どころかインストールしたことすら忘れてたので、今回メモしておくことにした。

インストール :

github から入手。

_Releases - gokcehan/lf - GitHub

リリース版の r31 を入手。Windowsの場合、lf-windows-386.zip と lf-windows-amd64.zip の2つがある。今回は32bit版(386版)を使ってみた。

解凍すると、中に lf.exe だけが入っている。パスが通っているどこかしらにコピーして、インストールは終了。

使い方 :

DOS窓(cmd.exe)を開いて lf と打ち込めば起動する。
  • カーソルキーの上下で、同階層の中で移動。
  • カーソルキーの右で、現在カーソルがあるフォルダ内に入る。
  • カーソルキーの左で、親フォルダに移動。
  • qキーで終了。
  • $キーで、一番下にシェル(Windowsの場合、cmd.exe)が開く。例えば $ を打った直後に ruby hoge.rb 等、DOS窓上でコマンドやプログラム名を打ち込むのと同様の入力をして実行したりできる。

lfcd.cmd を導入 :

qキーを押して終了すると、起動時に居たディレクトリ(フォルダ)に戻ってしまう。開いていたディレクトリをカレントディレクトリにしつつ終了するようにしたい。そんな時は lfcd.cmd を使える。

_lf/etc at master - gokcehan/lf - GitHub

lfcd.cmd を入手して、パスの通ってる場所に置いてから、lfcd と打って実行すると、lf の終了時に開いていたディレクトリをカレントディレクトリにしながら終了できる。

ちなみに、DOS窓(cmd.exe)ではなく Powershell上で使う場合、おそらく lfcd.ps1 が使えそうな気がする。

設定ファイルの在り処 :

設定ファイル lfrc を編集することで、キーに何を割り当てるかを変更できたりするらしい。

_lf command - github.com/gokcehan/lf - Go Packages

上記ページによると、設定ファイル lfrc は、Windows の場合、C:\Users\<user>\AppData\Local\lf\lfrc にあることになっているらしい。

例えば、デフォルトでは eキーを叩くとエディタ(vim)が開く設定になっているけれど、以下のように書き換えればメモ帳が起動するようになる。はず。
# map e $vim %f%
map e $notepad %f%

プロセスが残り続ける :

DOS窓(cmd.exe)上で lf を使っていると、時々何かの拍子にDOS窓自体が落ちてしまった。実際には cmd.exe の下にぶら下がった状態で lf.exe のプロセスが残り続けて、しかしデスクトップ上には出てこない状態になる。

例えば lf を実行中、任意のテキストファイルの上で e キーを押すと、本来ならエディタとして vim が開くはずだけど、出てこない。DOS窓が消えて、プロセスだけが残り続ける。ちなみに残り続けるプロセスには -server のオプションがつけられている状態。

Windwosターミナル上で lf を実行してみたところ、そちらなら eキーを押してもエディタが開くし、エディタを閉じてもWindowsターミナルに戻ってきた。また、PowerShell 7.3.8上で lf を実行してみたところ、そちらも同様に落ちなかった。

どうやら cmd.exe 上で動かすと正常動作してくれないようだなと…。いや、Windowsターミナルから cmd.exe を呼んで動かす分には正常動作するわけで…。よくわからん…。

その後も試用していたら、qキーを押して終了したつもりが、その後も lf.exe のプロセスが残り続けることに気づいた。これは、DOS窓でも、Windowsターミナルでも、PowerShellでも、どこで動かしても同じようにプロセスが残る。

謎のプロセスが残り続けるのは気味が悪い。そもそも、cmd.exe 上で使えることを期待して試用してみたのに、正常動作しないのでは…。

関連情報を探していたら、わざとサーバ的なプロセスを残しているらしいと分かってきた。何故にそんなことをするのか…。いやまあ、なんか理由があるっぽいけど。

_'q' quit backgrounds the process on windows, lf.exe remains running - Issue #106 - gokcehan/lf - GitHub
_lf -server doesn't quit automatically - Issue #177 - gokcehan/lf - GitHub
_lf command - github.com/gokcehan/lf - Go Packages

とりあえず、サーバを落としたかったら以下のどちらかを打て、とのこと。
lf -remote "quit"
lf -remote "quit!"

打ってみたら、たしかに残ってたプロセスが終了してくれた。"quit" では消えなかったプロセスも、"quit!" なら消えてくれた。"quit!" は、接続してるクライアントにも "quit" を送ってから、サーバも "quit" する模様。

#2 [prog][windows] CUIファイラー vifm を試用

vifm というCUI(CLI)ファイラーが気になったので、Windows10 x64 22H2上で試用してみた。DOS窓の中で動かすことができる。

インストール :

_Vifm
_Vifm - Downloads

vifm-w32-se-0.13-binary.zip を入手して解凍。

今回は D:\home\bin\vifm\ に入れておいた。D:\home\bin\vifm.bat で、PATH の先頭に件のディレクトリを追加して vifm.exe が起動するようにしておいた。

vifm.bat
@set VIFMDIR=D:\home\bin\vifm
@set PATH=%PATH%;%VIFMDIR%
@echo add path %VIFMDIR%
vifm.exe

使い方 :

以下を参考にして試用。

_ターミナルで動くviライクなファイルマネージャーvifmの便利な利用方法 [インフラエンジニアのPC環境]

基本的には vi(vim) と似たようなショートカットキーで使えるらしい。vim はコマンドを打つ時に「:」を打って、その直後にコマンド名を打ったりするけれど、vifm もそんな感じで、「:」を打ってからコマンド名を打つっぽい。ちなみに vi と言えばお馴染みの hjklキーによるカーソル移動も使える。

自分がよく使いそうなところだけ引用させてもらってメモしておこう…。
:q終了
ESC / C-c動作キャンセル
:sh現在開いているディレクトリをカレントディレクトリとしてシェルを開く
Up / Down / j / kカーソル上下移動
Left / h親ディレクトリへ移動
Right / l / Enterディレクトリに入る or ファイル実行
gg一番上へ移動
G / :$一番下へ移動
Space / TAB反対側のペインに移動
:cd入力したディレクトリに移動。パスの区切り文字は「\」ではなく「/」であること。
/検索
:marksブックマーク表示
mキー → 任意のキーブックマーク登録
「'」(Shift+7) → 登録されているキーブックマーク呼び出し

作業の流れとしては以下のような感じで使えそう。
  1. 目標のディレクトリまでカーソルキーを使って移動して、
  2. :sh を打って、そのディレクトリでシェル(cmd.exe)を開いて、
  3. いつもの調子で何か作業して、
  4. exit でシェル(cmd.exe)を抜けると vifm に戻ってくる。
  5. 作業が終わったら :q で終了。

設定ファイルの在り処 :

C:\Users\(USERNAME)\AppData\Roaming\Vifm\ の中にあった。以下がそれっぽい。
vifminfo.json
vifmrc

#3 [prog][windows] CUIファイラー jFD2 を試用

CUI(CLI)ファイラーを探していたら、jFD2 というファイラーの情報を見かけた。Java で書かれたFDクローンらしい。Windows10 x64 22H2上で試用してみた。

_jFD2 for Windowsの詳細情報 : Vector ソフトを探す!

jfd2_beta19.zip を入手して解凍。中に入っていた jfd2.exe を実行。

DOS窓(cmd.exe)とは異なるウインドウが新規に開かれて、その中に FD っぽい情報が表示された…。DOS窓の中で動くファイラーではなかったのだな…。

まあ、FDに慣れていて、FDから離れられない人には便利なのかもしれない。自分の場合はDOS窓の中で動くファイラーが欲しかったので、希望とはズレていた。アンインストールしておいた。

#4 [prog][windows] CUIファイラー goful を試用

CUI(CLI)ファイラー goful を Windows10 x64 22H2上でインストールしてみた。というか昔インストールしてたっぽいけど、インストールしていたことすら忘れてたのでこの際メモしておく。

インストール :

_GitHub - anmitsu/goful: Goful is a CUI file manager written in Go.
_Releases - anmitsu/goful - GitHub

リリースページから、以下のどちらかを入手。
goful_windows_i386.zip
goful_windows_x86_64.zip

今回は64bit版の、goful_windows_x86_64.zip を入手して解凍。中には以下の3つのファイルが入っていた。
 goful.exe
 LICENSE
 README.md

パスの通った任意の場所にコピー。DOS窓上で、goful と打てば起動する。

使い方 :

使い方と言うか、ショートカットキーは、README.md を眺めれば分かるかなと…。

_goful/README.md at master - anmitsu/goful - GitHub

他のCUIファイラーと違うのは、カーソルキーの左右で、左ペイン、右ペインにカーソルが移動すること。カーソルキーの左右で、親ディレクトリに移動したり、ディレクトリに入ったりするわけではない。
  • 親ディレクトリへの移動は Backspace か uキー
  • ディレクトリに入るのは Enterキー

他に使いそうなのは…。
~ホームディレクトリに移動
\ルートディレクトリに移動、のはずだけど日本語Windows環境では反応しなかった
d移動したいディレクトリパスを入力できる
;シェルを開ける
C-gキャンセル
q終了

; でシェルを開いた際は、TABキーでファイル名補完が使える。例えば、; でシェルを開いて、「ruby 」と打ってからTABキーを叩くと、今開いてるディレクトリ内の一覧が表示されるので、カーソルキーでファイル名を選んでEnterを叩けば、選んだファイル名が入力されて「ruby hoge.rb」になる。

カスタマイズができないっぽい :

「このファイラーは設定ファイルが存在しない」
「カスタマイズしたい時は main.go を書き換えろ」

と書いてあるように見えた。

豪快過ぎる…。ブックマークの登録すらできないのか…。いや、ソースファイルを書き換えてビルドしなおせということだろうけど。豪快だなあ…。

終了時に変なプロセスが残ったりしないあたりは良い感じだなと思ったけれど、よく使うディレクトリを気軽に登録できないのはさすがに厳しい気がする。いやまあ、「そんなのはビルドし直せ」と言われて終わるんだろうけど。豪快だ…。

#5 [prog][linux][windows] CUIファイラーについて少しまとめ

今回、Windows10 x64 22H2上で以下のCUI(CLI)ファイラーを試したけれど。
_GitHub - gokcehan/lf: Terminal file manager
_Vifm
_GitHub - anmitsu/goful: Goful is a CUI file manager written in Go.

普段、Linuxのターミナル上では、Ranger というPythonで実装されたファイラーを使ってたりする、とメモ。

_GitHub - ranger/ranger: A VIM-inspired filemanager for the console

この ranger が Windows上でも使えれば話は早いのだけど、使えないのだよな…。あくまで *NIX用のファイラーだそうで…。まあ、Windows上でも、WSL2 や MSYS2上なら使えるのかもしれんけど…。

さておき。lf は cmd.exe 上で動作が怪しいし、goful はカスタイマイズができないしで、今のところ vifm 一択かなという印象。

あふでもいいのかもしれない :

考えてみたら、自分のやりたかったことは…。
  1. pik か uru で Ruby のバージョンを変更して、
  2. 色んなフォルダに入ってる .rb を、ruby hoge.rb で実行して動作確認。

この程度の作業だったので、普段使ってるあふ(afxw.exe)でも済むのかもしれない。

  1. pik か uru で Ruby のバージョンを変更して、
  2. あふ(afxw.exe)の場所を PATH に追加して、
  3. DOS窓からあふ(afxw.exe)を実行して、
  4. あふで色んなフォルダを覗いて、
  5. .rb を ruby "$P\$F" で実行。
これでいいんじゃないかな…。

もっとも、DOS窓上で何か表示してすぐ終了するRubyスクリプトの場合、実行するとDOS窓が一瞬開いてすぐ閉じてしまうので、結果が見えないか…。また、エラーメッセージが出ていてもDOS窓が閉じてしまうからメッセージ内容が分からない問題もあるか…。でもまあ、確実に動作することが分かってるスクリプトであれば、これでも問題無いか…。

2023/10/14追記 :

Windows上で動作する、Far Manager というCUI(CLI)ファイラーも見かけた。後で試用してみるつもり。

_Far Manager Official Site : main

#6 [ruby][windows] Windows10 + Ruby 3.2.2 x86上で Gosu をインストールした

Windows10 x64 22H2 + Ruby 3.2.2 x86 (RubyInstaller2 DevKit付き) 上で、2Dゲーム制作ライブラリ Gosu がインストールできるのか試してみた。

Ruby 3.2.2 をインストール :

Windows上での Rubyインストールには、RubyInstaller2 を使った。

_RubyInstaller for Windows
_Downloads

一般的には、64bit OS上なら 64bit版 Ruby をインストールするものだろうけど、ゲーム制作の場合、使用する DLL が32bitだったりすることもあるので、今回は32bit版(x86版)をインストールしておいた。

rubyinstaller-devkit-3.2.2-1-x86.exe を入手してインストール。最後に、DOS窓が開いて MSYS2 (DevKit) のインストールもされる。「数字を入力せよ」っぽい感じのメッセージが出てくるけれど、とりあえず Enter を叩いておけばいいらしい。

全部で1GB以上になるファイルがインストールされた。Ruby のバージョンを確認。
> ruby --version
ruby 3.2.2 (2023-03-30 revision e51014f9c0) [i386-mingw32]

Gosuをインストール :

gem を使って、Gosu をインストール。
gem install gosu
> gem install gosu
Fetching gosu-1.4.6.gem
Temporarily enhancing PATH for MSYS/MINGW...
Building native extensions. This could take a while...
Successfully installed gosu-1.4.6
Parsing documentation for gosu-1.4.6
Installing ri documentation for gosu-1.4.6
Done installing documentation for gosu after 0 seconds
1 gem installed

gosu 1.4.6 がインストールされた。

Gosu は、DevKit (MSYS2) を使って、バイナリをビルドする形でインストールされる。DXRuby と違って、どのバージョンの Ruby でも Gosu が動作するのは、インストール時に、その Ruby のバージョンに合わせたバイナリをわざわざビルドしているから、なのだろう…。

以前書いた Gosu用のサンプルがあるので、ソレを使って動作確認した。

_GitHub - mieki256/gosu_examples_mieki256: Ruby + Gosu examples by mieki256.

少なくとも表示関係のサンプルは動いてくれた。

OpneGL関係のパッケージもインストール :

以下は gosu + OpenGL を動かす場合に必要になるパッケージだけど、この3つを入れずに opengl-bindings をインストールしたほうが良い。が、一応メモしておく。
gem install opengl
gem install glu
gem install glut
> gem install opengl
Fetching opengl-0.10.0.gem
Temporarily enhancing PATH for MSYS/MINGW...
Building native extensions. This could take a while...
Successfully installed opengl-0.10.0
Parsing documentation for opengl-0.10.0
Installing ri documentation for opengl-0.10.0
Done installing documentation for opengl after 0 seconds
1 gem installed
> gem install glu
Fetching glu-8.3.0.gem
Temporarily enhancing PATH for MSYS/MINGW...
Building native extensions. This could take a while...
Successfully installed glu-8.3.0
Parsing documentation for glu-8.3.0
Installing ri documentation for glu-8.3.0
Done installing documentation for glu after 0 seconds
1 gem installed

opengl, glu まではインストールできた。しかし、glut はインストールに失敗した。エラーが出る。

> gem install glut
Fetching glut-8.3.0.gem
Temporarily enhancing PATH for MSYS/MINGW...
Building native extensions. This could take a while...
ERROR:  Error installing glut:
        ERROR: Failed to build gem native extension.

    current directory: D:/Ruby/Ruby32-x86/lib/ruby/gems/3.2.0/gems/glut-8.3.0/ext/glut
D:/Ruby/Ruby32-x86/bin/ruby.exe extconf.rb
checking for glVertex3d() in -lopengl32.lib... no
checking for -lopengl32... yes
checking for -lglut... yes
checking for GL/freeglut.h... no
checking for GL/glut.h... no
checking for GLUT/glut.h... no
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
        --with-opt-dir
        --without-opt-dir
        --with-opt-include
        --without-opt-include=${opt-dir}/include
        --with-opt-lib
        --without-opt-lib=${opt-dir}/lib
        --with-make-prog
        --without-make-prog
        --srcdir=.
        --curdir
        --ruby=D:/Ruby/Ruby32-x86/bin/$(RUBY_BASE_NAME)
        --enable-win32-cross
        --disable-win32-cross
        --with-opengl32.lib-dir
        --without-opengl32.lib-dir
        --with-opengl32.lib-include
        --without-opengl32.lib-include=${opengl32.lib-dir}/include
        --with-opengl32.lib-lib
        --without-opengl32.lib-lib=${opengl32.lib-dir}/lib
        --with-opengl32.liblib
        --without-opengl32.liblib
        --with-opengl32-dir
        --without-opengl32-dir
        --with-opengl32-include
        --without-opengl32-include=${opengl32-dir}/include
        --with-opengl32-lib
        --without-opengl32-lib=${opengl32-dir}/lib
        --with-opengl32lib
        --without-opengl32lib
        --with-glut-dir
        --without-glut-dir
        --with-glut-include
        --without-glut-include=${glut-dir}/include
        --with-glut-lib
        --without-glut-lib=${glut-dir}/lib
        --with-glutlib
        --without-glutlib
        --with-GL-dir
        --without-GL-dir
        --with-GL-include
        --without-GL-include=${GL-dir}/include
        --with-GL-lib
        --without-GL-lib=${GL-dir}/lib
        --with-GLUT-dir
        --without-GLUT-dir
        --with-GLUT-include
        --without-GLUT-include=${GLUT-dir}/include
        --with-GLUT-lib
        --without-GLUT-lib=${GLUT-dir}/lib

To see why this extension failed to compile, please check the mkmf.log which can be found here:

  D:/Ruby/Ruby32-x86/lib/ruby/gems/3.2.0/extensions/x86-mingw32/3.2.0/glut-8.3.0/mkmf.log

extconf failed, exit code 1

Gem files will remain installed in D:/Ruby/Ruby32-x86/lib/ruby/gems/3.2.0/gems/glut-8.3.0 for inspection.
Results logged to D:/Ruby/Ruby32-x86/lib/ruby/gems/3.2.0/extensions/x86-mingw32/3.2.0/glut-8.3.0/gem_make.out

mkmf.log に色々記載されてるらしいので眺めてみたけど何が何やら。

ここで、昔書いた手元のメモを眺めたら、opengl-bindings をインストールすれば opengl, glu, glut をインストールしなくてもよい、みたいなことが書いてあった。そちらを入れてみる。

> gem uninstall glu
> gem uninstall opengl
> gem install opengl-bindings
Fetching opengl-bindings-1.6.13.gem
Successfully installed opengl-bindings-1.6.13
Parsing documentation for opengl-bindings-1.6.13
Installing ri documentation for opengl-bindings-1.6.13
Done installing documentation for opengl-bindings after 7 seconds
1 gem installed

opengl-bindings 1.6.13 がインストールされた。

昔書いた、gosu + OpenGL関係のサンプルで動作確認。

_gosu_examples_mieki256/opengl at master - mieki256/gosu_examples_mieki256 - GitHub

opengl-bindings を使った場合は、01 - 18 まで動作してくれた。ちなみに、opengl, glu をインストールした場合は、01 - 15 までしか動作しなかったので、どうやら opengl-bindings を使ったほうが良さそうだなと…。

2023/10/14() [n年前の日記]

#1 [prog][windows] CUIファイラー Far Manager を試用

Windows上で動作する、Far Manager というCUI(CLI)ファイラーがあるらしい。Windows10 x64 22H2上で試用してみた。

_Far Manager Official Site : main
_FAR Manager - Wikipedia
_Far Manager Introduction

Wikipedia のページでは、Norton Commander クローンの一つ、と書いてある。それはつまり、Linux上で動作する Norton Commander クローンの mc (Midnight Commander) みたいな感じということだろうか。であれば操作方法も参考になるのかな?

_Midnight Commander - Wikipedia
_Midnight Commander (mc) 使い方 基本コマンド10選+ | バイオインフォ 道場 [bioinfo-Dojo]

インストール :

_Far Manager Official Site : download

Far30b6161.x86.20230609.7z (バージョン 3.0.6161.0 x86)を入手して解凍。任意の場所にコピー。中に入っている Far.exe を、DOS窓(cmd.exe)上で実行すると起動する。左右2つのペインが開く。

ショートカットキー :

分かった範囲でメモ。

F10終了
TAB反対側のペインに移動
F9メニューを開く
F1ヘルプを開く(英文ヘルプ)
Alt+F12ディレクトリ履歴を表示。カーソルキーで選択してEnterで、過去に開いたディレクトリを開ける。
F3ビューア。テキストファイル等の中身を見れる。F3キーでビューア終了。
F4エディタ。F4キーでエディタ終了。
F5コピー
F6リネーム/移動
F7ディレクトリ作成
F8ファイルやディレクトリの削除
Home一番上に移動
End一番下に移動
Ctrl+oファイラー画面とシェル画面の切り替え

F9キーでメニューを開ける。上のほうに Left とか File とか表示されるので、カーソルキーの上下左右でそれぞれのメニューを開ける。

常に下のほうにコマンドライン入力欄が出ているので、その入力欄で、例えば cd D:\hoge と打てば、D:\hoge\ にカレントディレクトリを変更、かつ、Far の上のほうの表示もその場所に変わる。

あるいは、例えば hoge.rb ファイルの上にカーソルを移動しておいて、下のコマンドライン入力欄で「ruby 」とだけ打ってから Ctrl + Enter を叩くと、カーソルがある場所のファイル名(hoge.rb)がコマンドライン入力欄に挿入されて「ruby hoge.rb」という表示になる。その状態で Enter キーを押せば、ruby hoge.rb を実行できる。

印象 :

Windows用として作られているだけあって、表示が崩れることもなく好印象。vifm, lf 等は表示が崩れてしまう時があるので…。

ただ、ヘルプが全部英文なので、操作方法がよく分からない…。もっとも、フォルダ階層を辿って、何かしらのファイルを選んで実行するぐらいなら問題無く使えそう。

2023/10/15() [n年前の日記]

#1 [prog][windows] CUIファイラー Midnight Commander fo Windowsを試用

CUI(CLI)ファイラー Far Manager関連の情報をググっていたら、Midnight Commander の Windowsバージョンもあると知った。Linux上でたまに使っているソレを Windows上でも利用できるなら便利なのではと思えてきたので試用してみることにした。環境は Windows10 x64 22H2 + ConEmu 200713 {64}。

_Midnight Commander for Windows download | SourceForge.net
_Midnight Commander

インストール :

mcwin32-build228-setup.exe を入手して実行。デフォルトでは C:\Program Files (x86)\ 以下にフォルダを作成してその中にインストールされるように見えた。今回は D:\home\bin\mc\ にインストールしてみることにした。

起動の仕方 :

インストールしたフォルダにパスが通っている状態なら、DOS窓上で mc と打ち込むだけで起動する。

今回は、インストールしたフォルダをパス(環境変数 PATH)に含めず、mc.bat を書いておいて、mc と打ったら実行できるようにした。

mc.bat
@set MCPATH=D:\home\bin\mc
@set PATH=%MCPATH%;%PATH%
@echo Add Path : %MCPATH%
mc.exe %1 %2 %3 %4 %5 %6 %7 %8 %9
一見すると雑な batファイルだけど…。
  • mc.exe にパスが通ってない状態で mc と打って実行すると mc.bat が実行されて、その際 PATH の先頭に、Midnight Commander インストールディレクトリが追加(挿入)されて、その直後に mc.exe を実行する。
  • 2度目の mc 入力時は、PATH に Midnight Commander インストールディレクトリが追加済みなので、その中の mc.exe が最初から呼ばれて起動する。
  • DOS窓を閉じれば PATH も元に戻る。

ショートカットキー :

F10終了
F9メニュー表示
Up / Down / Left/ Rightカーソル移動
Home一番上にカーソルを移動
End一番下にカーソルを移動
TAB / Ctrl+i反対側のペインに移動
Enterディレクトリの中に入る
Cirl+omcパネル表示とシェル表示を切り替え
F3ビューワ表示。テキストファイルの中身を表示できる。F3で抜ける
F4簡易エディタ起動。F10で抜ける
Ctrl+Enterカーソル位置のファイル名をコマンドライン入力欄に挿入
Ctrl+Shift+Enterカーソル位置のファイル名をパス付でコマンドライン入力欄に挿入
Ctrl+x h現在開いてるディレクトリをホットリストに登録
Ctrl+\ホットリストを表示。登録してあるディレクトリに移動できる
Alt+cディレクトリパスを直接入力して移動
Alt+tファイル一覧表示の種類を変更
Ctrl+u左右ペインの入替
Alt+oディレクトリ選択中なら反対側のペインに内容を表示
Ins / Ctrl+tファイル/フォルダをマーク
\マーク全解除

一番下にコマンドライン入力欄が常時表示されているので、そこに何かしら打ち込んで実行すれば、コマンドライン上でできることは大体できる。例えば、cd C:\hoge\ と打ち込めば、カレントディレクトリを C:\hoge\ にできるし、mcの表示もそのディレクトリになる。

あらかじめ mc 上で hoge.rb にカーソルを合わせておいてから、コマンドライン入力欄で、「ruby 」と打って、Ctrl + Enter を叩けば、現在カーソルがある位置のファイル名、hoge.rb が挿入されて、「ruby hoge.rb」という記述になる。その状態で Enter を叩けば、ruby で hoge.rb を実行できる。

問題点その1 :

これは ConEmu + cmd.exe 上で実行しているせいだと思うけれど、ところどころに日本語文字列(全角文字)が入っているせいか、横方向の表示が崩れてしまう…。本来なら縦に一直線になる部分がガタガタしてしまう。ちなみに使用フォントは Meiryoke_Gothic。ただ、フォントを HackGen 等にしても問題は解消しなかった。

Windowsターミナル上で動かしたところ、ConEmu のように横方向の表示が崩れたりはしなかった。その代わり、こっちはこっちで罫線が見えなくなった。表示してるつもりが表示されてないのか、そもそも表示してないのかは分からないけど…。

DOS窓(cmd.exe)上で表示したところ、ちゃんとした表示になった。DOS窓に特化して作られてるっぽいなと…。

問題点その2 :

Linux上で使う分には各種補完を M-TAB (Alt + TAB)で利用できるらしいのだけど、Windows上で M-TAB を叩くと、Windows自体が機能として持っている、ウインドウ切り替えが呼び出されてしまう。Esc + TAB で代用できないかと思ったけれど、それも無理なようで、単に TAB だけが受け付けられてしまう。Windows + mc で、代わりに使えるキーは無いのだろうか…?

#2 [prog][windows] Windows10上で動くCUIファイラーのスクリーンショットをメモ

せっかく Windows10 x64 22H2 + cmd.exe(DOS窓)上で動くCUI(CLI)ファイラーを色々試用してみたので、ついでにスクリーンショットもメモしておく。

lf :

ss_lf.png

_GitHub - gokcehan/lf: Terminal file manager

Python で実装された Ranger というCUIファイラーから影響を受けている1画面ファイラー。カーソルキーでフォルダ階層を移動できる。

vifm :

ss_vifm.png

_Vifm

vi(vim)と似たショートカットキーで利用できる2画面CUIファイラー。

goful :

ss_goful.png

_GitHub - anmitsu/goful: Goful is a CUI file manager written in Go.

Go言語で実装されている2画面CUIファイラー。

Far manager :

ss_far_manager.png

_Far Manager Official Site : main

Norton Commander クローン。2画面CUIファイラー。

Midnight Commander for Windows :

#3 [ruby] Gosuのキーボード関連定数が少し変わっていた

Windows10 x64 22H2 + Ruby 2.6.10 x86 + Gosu 1.4.3 を使って、昔書いたサンプルを動かしていたら、警告が出ていることに気づいた。

>ruby 06_gosu_fps_test.rb
06_gosu_fps_test.rb:205: warning: constant Gosu::KbEscape is deprecated

「Gosu::KbEscape は廃止された」と出ている…。

そのあたりの変更内容についてググってみたけど全然出てこない。なんだか Google の検索精度がどんどん悪化してる気がする…。

それはさておき、何を代わりに使うことになったのやら。

KbEscape は KB_ESCAPEになっていた :

_Module: Gosu - Documentation for gosu (1.4.6)

「KB_ESCAPE」という定数が目に入った。コレにしろということだろうか。


_Ruby Tutorial - gosu/gosu Wiki - GitHub

サンプルソースの中に Gosu::KB_ESCAPE という記述があった。やはりコレに変えないといかんらしい。


どの時点で変わったのか少し調べてみたけれど。

_Comparing v1.0.3...v1.0.4 - gosu/gosu-examples - GitHub

Gosu ではなくて、gosu-examples の変更点だけど、1.0.3 から 1.0.4 になる時に KbEscape から KB_ESCAPE に変更されてる。その時期より前にGosu側で変更されていたということだろうな…。2017年頃に修正されてるから、随分昔に仕様が変わっていたらしい。


_Gosu examples: available keys? - Issue #576 - gosu/gosu - GitHub

上記のやり取りによると、Gosu::KbSpace も Gosu::KB_SPACE になってる模様。

他の定義も無くなっていた :

別のスクリプトについても動作確認していたら、他にも定義が無くなっていたものが多数あった。
> ruby 07_input_test.rb
07_input_test.rb:43: warning: constant Gosu::KbLeft is deprecated
07_input_test.rb:43: warning: constant Gosu::GpLeft is deprecated
07_input_test.rb:48: warning: constant Gosu::KbRight is deprecated
07_input_test.rb:48: warning: constant Gosu::GpRight is deprecated
07_input_test.rb:53: warning: constant Gosu::KbUp is deprecated
07_input_test.rb:53: warning: constant Gosu::GpUp is deprecated
07_input_test.rb:58: warning: constant Gosu::KbDown is deprecated
07_input_test.rb:58: warning: constant Gosu::GpDown is deprecated
07_input_test.rb:63: warning: constant Gosu::KbZ is deprecated
07_input_test.rb:63: warning: constant Gosu::GpButton0 is deprecated

Gosu::KbLeft は Gosu::KB_LEFT に、Gosu::KbRight は Gosu::KB_RIGHT に、他もそんな感じで修正しないといかんようだなと…。要するに、Gosu::Kb* という記述があったら、Gosu::KB_* にして、かつ、KB_ 以降を大文字にしないといけない模様。

手元のスクリプトを修正 :

せっかくだから、GitHub にアップロードしてあった Gosu のサンプル群も修正しておいた。

_GitHub - mieki256/gosu_examples_mieki256: Ruby + Gosu examples by mieki256.

#4 [windows] Windows10のセーフモードでアプリをアンインストールしたい

Windows10 x64 22H2 のセーフモード上で、セットアップファイルが msi で提供されてるアプリのアンインストール作業をしたい。

経緯 :

Windows10 x64 22H2上で TortoiseGit を使おうとしたら「バージョンが古いぞ」「アップデート版があるぞ」と表示されたので、現行版の TortoiseGit-2.15.0.0-64bit.msi を入手してインストールしようとしたのだけど、インストーラを実行したら Windows10 がブルースクリーン(BSOD)になってしまった。

随分前から手元の環境では、システム全体に関わる何かをインストール/アンインストールしようとするとBSODになることが多いので、今回もなるんじゃないかと予想はしてたけど…。やっぱりか…。

一旦 TortoiseGit をアンインストールしてから作業したほうがいいだろうか、もしかしてセーフモードで行えばBSODにならずに済むだろうかと、セーフモードで起動して、コントロールパネルから TortoiseGit のアンインストールを試みたのだけど、「そんなことはできない」と言われてしまった。

調べたところ、セーフモードでは msi 関連のサービスも動いてない状態になるので、アプリのセットアップファイルが msi で提供されている場合、インストールもアンインストールもできないそうで。

一応、セーフモードで上でもそれらのサービスを動かして作業する方法があるらしいので試してみた。引用してメモ。

作業の流れ :

Windows10をセーフモードで起動。cmd.exe を管理者権限で開く。

以下を打ってレジストリにキーを追加。セーフモードのみなら Minimal のほう。セーフモード+ネットワークなら Network のほう。
REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\SafeBoot\Minimal\MSIServer" /VE /T REG_SZ /F /D "Service"
REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\SafeBoot\Network\MSIServer" /VE /T REG_SZ /F /D "Service"

msiserver を起動。
net start msiserver
または、コンピュータの管理 → サービスとアプリケーション → サービス → Windows Installer を右クリック → 開始、を選ぶ。

アプリをアンインストールする。コントロールパネル → プログラムの管理、だっただろうか…。

アンインストール作業が終わったら、msiserver を停止。
net stop msiserver

レジストリからキーを削除。
REG DELETE "HKLM\SYSTEM\CurrentControlSet\Control\SafeBoot\Minimal\MSIServer" /F
REG DELETE "HKLM\SYSTEM\CurrentControlSet\Control\SafeBoot\Network\MSIServer" /F

余談 :

セーフモード上でアンインストール作業を行ったら、BSOD にはならなかった。ということは…? 少なくとも、ハードウェア側で問題が起きているわけではなさそうな気配がとても濃厚になってきた気がする。一体どのプログラムが悪さをしているんだ…?

参考ページ :

#5 [movie] 「ゴジラvsビオランテ」を視聴

BS12で放送されていたので視聴。初見。

あんなに有名な映画なのに、恥ずかしながら今まで見たことが無く。おかげで基本的には楽しく見れました。なるほど。「ビオランテ」ってこういう映画だったのか。

先週は「メカゴジラの逆襲」を放送していて、少しだけチラチラと横目で見ていたのだけど、その映像と比べると「ビオランテ」の映像はグンとレベルが上がってるように思えた。日本の特撮って、着実にレベルが上がっていたんだなと改めて認識した次第。ハリウッドのSFX/VFXの進歩の速度と比べてしまうから、停滞していた印象になってたのかもしれないなと反省。このあたり、シリーズ作品を一つ一つ順に見てしまうと進んでいることが分かりづらいというのもありそう。

最後のあたりに1カットだけ出てくる 沢口靖子さんの顔で、なんだか全てが台無しになった気分に。いや、あの方は全然悪くない。あんな構図で、あんな入れ方をした監督が悪い。なぜこのタイミングでアレを入れようと思ったのか。なんか変だなーとは思わなかったのだろうか。いや待て。実はわざとやってた可能性もありそうか。「こんな えいが に まじに なっちゃって どうするの」的な。などと邪推せずにいられないぐらいにパワーを持ったカットだった気がする。

その後のアクションシーンも、なんというか…。当時、アクション監督という役職はなかったのだろうかと疑問を持ってしまった…。何が起きてるかは最低限伝わるのだけど、ハラハラドキドキ感は皆無で、アクションシーンとはどうあるべきかについて悩み始めてしまった。あのへんのくだりは無くてもいいよな…。

超能力関連の設定も要らなかったなと。なんであんな要素を入れたんだろう。当時流行ってたんだろうか。まあ、そのあたり、平成ガメラシリーズでも似たような印象を持っていたりするのだけど。

そんな感じで、「コレ、要る?」と首を捻るところは多々あったのだけど。特撮シーンがイイ感じだったので、まあいいか的な気分に。おそらくはワイヤーで吊って動かしているのであろう、ビオランテのうねうね感は良かった…。見えないところでかなりの数のスタッフが操演(?)していて、先輩が若手に怒号を浴びせたり腹や背中に蹴りを入れながら撮影してたのでは、などと想像してしまったりして…。スタッフの呼吸を合わせて「せーの」で動かすあたりはドラマにならんかな…。「せーの」じゃなくて「アクション!」でカチンコかな。分からんけど。

CGシーンの作り方にはヒントがありそう :

ワイヤーフレームのCGカットが何カットも出てきたのだけど、線が妙に滑らかで、このCGってどうやって作ってたんだろうと疑問が湧いた。当時のブラウン管でここまで奇麗に出せるものかな、不思議だなと。いや、当時であればベクタースキャンで描けそうでもあるし、ビットマップ、と言うかラスタースキャンよりは線が滑らかだろうけど、それにしても…。

_ベクタースキャン - Wikipedia
_ラスタースキャン - Wikipedia

気になったので、Wikipediaの該当ページを眺めたのだけど、作り方を知って驚いた。

_ゴジラvsビオランテ - Wikipedia

プロッタで紙に描いて光学合成とな。ソレ手描きアニメじゃん!? いや、手描きではないのだよな。たしかに間違いなくCGアニメ。でも出力がアナログ。CGアニメなのにアナログなアニメ。なんかすげえ…。もしかして当時はそういう作り方が当たり前だったのだろうか。山やゴジラが異なる色で描かれていたので、それぞれを別の紙に出力して、フィルムカメラでコマ撮りして、後からフィルムを光学合成で重ねてたんだろうな…。大変だ…。

改めてググってみたら、件のCGカットの作り方は有名なエピソードのようで、Twitterで紹介してる方が何人も居たし、動画サイトでも話題になってた模様。知らなかった…。勉強になった。

「レンズマン」のCGカットの話をちょっと思い出した。アレも、当時のCGマシンは半透明が使えなかったから、何回かレンダリングしてフィルム撮影して、後から光学合成して半透明にしていたそうで。

こういった作り方は、今でも使えそうな気がしてくる…。一旦、あえて、アナログ的な何かとしてCGを出力して、それをまた撮影してアニメにすることで、不思議な映像にならないかな…。いやまあ、今ならそのアナログの何かをコンピュータの中でシミュレーションして、最初から最後までコンピュータの中でやってしまいそうでもあるけれど。それでも、変わった表現をする上で、発想のヒントになりそうな気がする。「オレのカレーは仕上げに この変な虫を入れるのさ!」 *1 みたいな。いや、それとはちょっと違うか…。 *2

*1: _嵐馬破天荒の世界/ミスター味皇1
*2: もっとも、今のCGも、最後にわざとノイズを加えて実写素材と馴染ませたり、紙のテクスチャを載せてアナログ感を付加したり等、アナログな何かを付加する試みは当たり前のようにやってるわけで。「オレのカレーは仕上げに」的に、そこで一体何を入れるのか、工夫する余地はまだあるのだろうなとも。あるいは、3Dプリンターで出力したパーツを人形のコマ撮りアニメに利用した例も見かけたし、それはまさしく一旦アナログにしてみる手管と言えそうだなと。

2023/10/16(月) [n年前の日記]

#1 [dxruby] Ruby 3.2.2 x86 上で DXRuby を動かせるか試してみた

Windows10 x64 22H2上で、Ruby 3.2.2 x86 (RubyInstaller2, DevKit付き)をインストールしたけれど。その後、gem を使ってインストールした2Dゲーム制作ライブラリ DXRuby が動かなかった。

> ruby --version
ruby 3.2.2 (2023-03-30 revision e51014f9c0) [i386-mingw32]

> gem install dxruby
Fetching dxruby-1.4.7.gem
Successfully installed dxruby-1.4.7
Parsing documentation for dxruby-1.4.7
Installing ri documentation for dxruby-1.4.7
Done installing documentation for dxruby after 0 seconds
1 gem installed

今現在、gem でインストールできる DXRuby 1.4.7 は Ruby 2.5 - 3.0 x86 までの対応なので ―― Ruby 2.5 - 3.0 x86 の dxuby.so は同梱されているけれど、Ruby 3.2.2 x86 用の dxruby.so は同梱されていないから動かないのは当たり前なのだけど、手元の環境で Ruby 3.2.2 x86 用の DXRuby をビルドしたら動くのだろうかと気になったので、ビルドできるか試してみることにした。

ビルド手順 :

ビルド方法は、公式配布サイトの README.md で説明されてる。

_GitHub - mirichi/dxruby: gem作成用。ソースもここで管理しております。

説明に従って作業してみた。

まず、コンパイラ込み(DevKit付き)の RubyInstaller2 をインストール。これはもうインストール済み。

作業用に、任意のディレクトリを作成して、その中に入る。今回は、D:\Ruby\builds\dxruby\ というディレクトリを作って、その中に入れることにした。
mkdir D:\Ruby\builds\dxruby
cd /d D:\Ruby\builds\dxruby

git がインストール済みで使える環境なら、git clone で dxruby のリポジトリを入手。
git clone https://github.com/mirichi/dxruby.git

もしくは、github から dxruby のリポジトリを zip でダウンロードして解凍してもいい。右上の「Code」というボタンをクリックすれば、「Download ZIP」というリンクがあるので、それをクリックすれば dxruby-master.zip が入手できる。

ソース、というか extconf.rb があるディレクトリに移動する。ext\dxruby\ が対象のディレクトリ。
cd dxruby\ext\dxruby

コンパイラを使える状態にする。以下を入力。大量に色々表示されるけどキニシナイ。
ridk enable

Makefile を自動で生成する。Makefile は、ビルド処理手順が書かれているファイルのこと。
ruby extconf.rb
> ruby extconf.rb
checking for -ldxguid... yes
checking for -ld3d9... yes
checking for -ld3dx9_40... yes
checking for -ldinput8... yes
checking for -ldsound... yes
checking for -lgdi32... yes
checking for -lole32... yes
checking for -luser32... yes
checking for -lkernel32... yes
checking for -lcomdlg32... yes
checking for -lwinmm... yes
checking for -luuid... yes
checking for -limm32... yes
checking for d3dx9.h... yes
checking for dinput.h... yes
checking for rb_enc_str_new()... yes
creating Makefile

「creating Makefile (Makefile を作ったよ)」と言っているので、make と打ってビルドする。
make
色々な警告が表示されるけど、あくまで警告で、エラーではないのでキニシナイ。

ビルドが成功すれば、カレントディレクトリ直下に dxruby.so が生成される。
> dir *.so /b
dxruby.so

Ruby 3.2.2 x86 に DXRuby (dxruby.so) をインストールする。(しかるべき場所にコピーする)
make install
> make install
/usr/bin/install -c -m 0755 dxruby.so /D/Ruby/Ruby32-x86/lib/ruby/site_ruby/3.2.0/i386-msvcrt

dxruby.so が、(Ruby 3.2.2 x86インストールフォルダ)\lib\ruby\site_ruby\3.2.0\i386-msvcrt\ 以下にコピーされた。
> dir D:\Ruby\Ruby32-x86\lib\ruby\site_ruby\3.2.0\i386-msvcrt\*.so /b
dxruby.so

この状態で、手元にある DXRuby のサンプルを動かしてみたところ、大半のサンプルは動いてくれた。

ということで、Windows10 x64 22H2 + Ruby 3.2.2 x86 (RubyInstaller2, DevKitつき) 上でも、自分でビルドすれば DXRuby が動きそうだと分かった。

注意点 :

Windows10 は DirectX 9.0 が標準で入ってないので、そのままでは DXRuby も動かないそうで。別途 d3dx9_40.dll を入手して、しかるべき場所にコピーしないといかんらしい。そのあたりの手順は以下で解説されているので参考に。

_Windows10では、DXRubyを動かすのに d3dx9_40.dllが必要 - Issue #3 - mirichi/dxruby - GitHub

あるいは、以下から入手できそう。

_DXRubyの実行環境構築 - EastBack Archives
_Ruby実行環境のダウンロード - EastBack Archives

#2 [ruby] Ruby/Tk+Tk拡張を動かそうとしてハマった

久々に Ruby を触ったことだし、せっかくだからと、HDD内で眠ってた昔のスクリプトの動作確認をしていたのだけど。cairo + Tk + Tk拡張を使ったスクリプトを動かそうとしてハマってしまった。環境は Windows10 x64 22H2。

cairo について :

cairo を使うと、アンチエイリアスがかかった奇麗な図形描写が簡単にできる。

_cairo: 2 次元画像描画ライブラリ

とりあえず手元の環境では、以下の組み合わせで動いてくれた。
  • Ruby 1.9.3 p551 i386-mingw32 (RubyInstaller) + cairo 1.12.4 x86-mingw32
  • Ruby 2.3.3 p222 i386-mingw32 (RubyInstaller) + cairo 1.15.9 x86-mingw32
  • Ruby 2.6.10 p210 i386-mingw32 (RubyInstaller2) + cairo 1.17.12
  • Ruby 3.0.4 p208 i386-mingw32 (RubyInstaller2) + cairo 1.17.12
  • Ruby 3.2.2 i386-mingw32 (RubyInstaller2) + cairo 1.17.12

Ruby 2.x 以降、かつ、DevKit がインストール済みの環境なら、基本的には以下でインストールできる。その Ruby のバージョン専用のバイナリを、DevKit を使ってビルドしてからインストールされる。
gem install cairo

Ruby 1.9.x は注意が必要。cairo 1.12.4 以前のバージョンしか動かないので、バージョンとプラットフォーム(x86-mingw32、x64-mingw32等)を指定してインストールすることになる。
gem install cairo --platform x86-mingw32 -v=1.12.4

_mieki256's diary - cairo + Ruby Windows版が使えない

こんな具合なので、Ruby + cairo については今でも全然使えそうだなと感じたのだけど。

Ruby/TkをWindows上で使いたい :

cairo + DXRuby を使うスクリプトについては、どのバージョンの Ruby でもスンナリ動いてくれたのだけど、cairo + Tk(Ruby/Tk) + Tk拡張を使ったスクリプトが動かなくて困った。

Windows上の Ruby/Tk は状況が面倒臭くて…。
  • Ruby 2.4 の時点で、標準ライブラリから Tk が外されてしまった。Ruby 2.4 以降は、gem install tk でインストールしないといけない。
  • Ruby 2.3 までは、Windows の場合、RubyInstaller(RubyInstaller2ではない) をインストールすれば Tk も使えていた、らしい。インストール時に「Tcl/Tkも一緒にインストールする」的な指定項目があるので、そこにチェックを入れてインストールすれば Ruby/Tk が使えたのだとか。
  • ただ、RubyInstaller に同梱されている Tk は、基本的な機能しか持っていない。Tk拡張を使ったスクリプトは動かない。
  • Ruby 2.4 以降は、RubyInstaller ではなく RubyInstaller2 になったので、Tcl/Tk を一緒にインストールしてくれなくなった。Windows の場合、別途 ActiveTcl のインストールが必要になるのだとか。
  • しかし ActiveTcl は有償になってしまった(らしい)。また、64bit版はあるけれど、32bit版はなくなった。Ruby 32bit版では Tk が使えない。
  • Rub 1.9.x だけは、Tk拡張を含めた tcltklib.so が存在するので、その tcltklib.so と、元々入っていた tcltklib.so を交換するだけでTk拡張が使える。

そんなわけで、Ruby + Tk + Tk拡張を使いたいと思ったら、Ruby 1.9.x を利用するしかない状況で…。

これがもし、標準的な Tk の機能しか使わないなら、Ruby 2.3 までのどれかを選べば ―― RubyInstaller (RubyInstaller2ではない) をインストールすればそれで済むのだけど…。

Ruby 2.4 以降で Ruby/Tk を使いたい場合は、これはもう一体何をどうしたらいいのかさっぱり不明。昔だったら、ActiveTcl もインストールして、とかやれたんだろうけど。

ちなみに、これが Python なら状況が全然違う。Python をインストールする際に Tk(tkinter)も一緒にインストールできるから、標準で Tk (tkinter) が使えるも同然なので…。そのせいもあるのか、もっと簡単に Tk を扱えるラッパーライブラリも登場していたりして、簡単なGUIアプリならすぐに作れる状態。

_Tkinterを使うのであればPySimpleGUIを使ってみたらという話 #Python - Qiita
_【PySimpleGUI】PythonでカンタンにGUIを作ろう! #Python - Qiita

Ruby が地獄だとしたら Python は天国。

余談。RubyはGUIが鬼門 :

ポエムです。

昔から「RubyはGUIが鬼門」と言われてたりするのだけど、少なくとも Ruby/Tk に関してはこんな感じで、というかどう見ても死んでるけれど。他のGUIライブラリも軒並み開発が止まって死んでるわけで…。

だから、「RubyでGUIアプリを作ってみたい」と言い出す人が居たら、

「それは絶対に、絶対にやめておいたほうがいい」
「今は動いていても Ruby のバージョンが上がったらそのアプリは十中八九動かなくなるよ」
「そもそもライブラリが入手できなくなるから」

とアドバイスしたくなるというか…。いやまあ、さすがにこの状況で「RubyでGUIを」と言い出す人はそもそも居ないか。「今からCOBOL勉強します」と言い出すようなものかも。

もっとも、このあたりは Windows の場合の話で、Linux上ではまたちょっと違うらしいのだけど…。Linux の場合、システムに Tk や GTK が入ってくるので、「どうやって Tk を入れたらいいんだ」と悩まずに済むから Ruby/Tk や Ruby/GTK も比較的スンナリ使えるのかもしれない。

でもまあ、何にせよ、Windows上で動くちょっとしたGUIアプリを今から作りたいなら、Ruby より Python を選んだほうがいいですわな。Python ならGUIライブラリも選び放題だし。

Ruby 1.8 の頃は良かったな…。vruby とか良さそうに見えたっけ。言語本体だけがいくら頑張ってみてもダメなんだよなあ…。考えてみたら Tcl/Tk 自体がそうか。言語部分の Tcl はアレだけど Tk は使われ続けてたりするし。

ポエムです。

#3 [ruby] gemの表示が妙なことになってしまった

Windows10 x64 22H2 + Ruby 2.3.3 p222 i386-mingw32 (RubyInstaller) で動作確認していたら、gem の表示がおかしいことに気づいた。

gem -v でバージョンを確認できるらしいのだけど…。
> gem -v
D:/Ruby/Ruby23-x86/lib/ruby/site_ruby/2.3.0/rubygems.rb:11: warning: already initialized constant Gem::VERSION
C:/Ruby/Ruby23-x86/lib/ruby/site_ruby/2.3.0/rubygems.rb:11: warning: previous definition of VERSION was here
D:/Ruby/Ruby23-x86/lib/ruby/site_ruby/2.3.0/rubygems.rb:115: warning: already initialized constant Gem::RUBYGEMS_DIR
C:/Ruby/Ruby23-x86/lib/ruby/site_ruby/2.3.0/rubygems.rb:115: warning: previous definition of RUBYGEMS_DIR was here
D:/Ruby/Ruby23-x86/lib/ruby/site_ruby/2.3.0/rubygems.rb:120: warning: already initialized constant Gem::UNTAINT
C:/Ruby/Ruby23-x86/lib/ruby/site_ruby/2.3.0/rubygems.rb:120: warning: previous definition of UNTAINT was here
D:/Ruby/Ruby23-x86/lib/ruby/site_ruby/2.3.0/rubygems.rb:123: warning: already initialized constant Gem::KERNEL_WARN_IGNORES_INTERNAL_ENTRIES
C:/Ruby/Ruby23-x86/lib/ruby/site_ruby/2.3.0/rubygems.rb:123: warning: previous definition of KERNEL_WARN_IGNORES_INTERNAL_ENTRIES was here
D:/Ruby/Ruby23-x86/lib/ruby/site_ruby/2.3.0/rubygems.rb:129: warning: already initialized constant Gem::WIN_PATTERNS
C:/Ruby/Ruby23-x86/lib/ruby/site_ruby/2.3.0/rubygems.rb:129: warning: previous definition of WIN_PATTERNS was here
D:/Ruby/Ruby23-x86/lib/ruby/site_ruby/2.3.0/rubygems.rb:138: warning: already initialized constant Gem::GEM_DEP_FILES
C:/Ruby/Ruby23-x86/lib/ruby/site_ruby/2.3.0/rubygems.rb:138: warning: previous definition of GEM_DEP_FILES was here
D:/Ruby/Ruby23-x86/lib/ruby/site_ruby/2.3.0/rubygems.rb:148: warning: already initialized constant Gem::REPOSITORY_SUBDIRECTORIES C:/Ruby/Ruby23-x86/lib/ruby/site_ruby/2.3.0/rubygems.rb:148: warning: previous definition of REPOSITORY_SUBDIRECTORIES was here
D:/Ruby/Ruby23-x86/lib/ruby/site_ruby/2.3.0/rubygems.rb:161: warning: already initialized constant Gem::REPOSITORY_DEFAULT_GEM_SUBDIRECTORIES
C:/Ruby/Ruby23-x86/lib/ruby/site_ruby/2.3.0/rubygems.rb:161: warning: previous definition of REPOSITORY_DEFAULT_GEM_SUBDIRECTORIES was here
D:/Ruby/Ruby23-x86/lib/ruby/site_ruby/2.3.0/rubygems.rb:171: warning: already initialized constant Gem::LOADED_SPECS_MUTEX
C:/Ruby/Ruby23-x86/lib/ruby/site_ruby/2.3.0/rubygems.rb:171: warning: previous definition of LOADED_SPECS_MUTEX was here
D:/Ruby/Ruby23-x86/lib/ruby/site_ruby/2.3.0/rubygems.rb:1294: warning: already initialized constant Gem::MARSHAL_SPEC_DIR
C:/Ruby/Ruby23-x86/lib/ruby/site_ruby/2.3.0/rubygems.rb:1294: warning: previous definition of MARSHAL_SPEC_DIR was here
3.3.26

Ruby 2.3.3 + gem 3.3.26 だとこんなことになってしまう…。ちなみに、gem 3.3.19 もこんな感じ。

アレ? C: と D: が混在してる。なんだコレ。元々Cドライブに入っていたものをDドライブに移動して、Cドライブにはシンボリックリンクを置いたのだけど、そのせいだろうか…。

それはともかく、gem (rubygems) を更新するには、2つ方法があるようで。
zip の入手先は以下。現行版のzipのURLから類推してみた。

_RubyGemsをダウンロード | RubyGems.org | コミュニティのgemホスティングサービス

_https://rubygems.org/rubygems/rubygems-3.2.25.zip
_https://rubygems.org/rubygems/rubygems-3.2.26.zip
_https://rubygems.org/rubygems/rubygems-3.2.27.zip
_https://rubygems.org/rubygems/rubygems-3.2.28.zip
_https://rubygems.org/rubygems/rubygems-3.2.29.zip
_https://rubygems.org/rubygems/rubygems-3.2.30.zip
_https://rubygems.org/rubygems/rubygems-3.2.33.zip
_https://rubygems.org/rubygems/rubygems-3.2.34.zip
_https://rubygems.org/rubygems/rubygems-3.3.19.zip
_https://rubygems.org/rubygems/rubygems-3.3.26.zip

また、以下の記事によると、3.1.x は問題があるらしいので、3.2.0以降にしておかないといけない模様。

_業務の中で出会った default gem のアップグレードによる CVE 対応と rubygems 3.2.0 未満の不具合の話 - STORES Product Blog

とりあえず色々なバージョンを試してみたけど、gem 3.2.26 が一番メッセージ表示が少なくて済むようだなと…。
> gem -v
D:/Ruby/Ruby23-x86/lib/ruby/site_ruby/2.3.0/rubygems/user_interaction.rb:546: warning: already initialized constant Gem::StreamUI::ThreadedDownloadReporter::MUTEX
C:/Ruby/Ruby23-x86/lib/ruby/site_ruby/2.3.0/rubygems/user_interaction.rb:546: warning: previous definition of MUTEX was here
3.2.26

シンボリックリンクがマズいっぽい :

Rubyのバージョンを切り替えられるツール、pik で、C:\Ruby\Ruby23-x86\bin を登録していたけど、実際にRuby関連ファイル群が入っている D:\Ruby\Ruby23-x86\bin を登録し直してみた。これなら変なメッセージが出てこないな…。

とりあえず、pik や uru の設定ファイルを書き換えて、C:/ や C:\\ を D:/ や D:\\ にしておこう…。

pik や uru の設定ファイルの場所は以下。
C:\Users\(USERNAME)\.pik\config.yml
C:\Users\(USERNAME)\.uru\rubies.json

2023/10/17(火) [n年前の日記]

#1 [ruby] LibUIというGUIライブラリを試用

昨日、「RubyでGUIアプリなんて書くものじゃない」と書いてしまったけれど、自分は天邪鬼なので、随分前から気になっていたGUIライブラリ、LibUI を試用してみることにした。

_インストールが簡単なRuby用のGUIライブラリlibuiのバインディングを作った話 #Ruby - Qiita
_GitHub - kojix2/LibUI: A portable GUI library for Ruby
_libui | RubyGems.org | コミュニティのgemホスティングサービス
_WindowsでRubyで作ったGUIのEXEを配布するときにlibuiを使う場合のメモ #Ruby - Qiita
_RubyでWindowsのGUIアプリを作る #Ruby - Qiita

画像表示に難有りという話があったので様子見してたのだけど、画像を表示しない用途なら使えるのではないかと思えてきたので…。バイナリのサイズが小さいからexe化する際に有利であろう点は魅力的。

環境は、Windows10 x64 22H2 + Ruby 3.2.2 x86。

インストール :

LibUI は、gem でインストールすることができる。
gem install libui

これでインストールできるはずなのだけど、動かない…。
> ruby 01_hello_libui.rb
D:/Ruby/Ruby32-x86/lib/ruby/3.2.0/fiddle.rb:62:in `initialize': Exec format error (Fiddle::DLError)
        from D:/Ruby/Ruby32-x86/lib/ruby/3.2.0/fiddle.rb:62:in `new'
        from D:/Ruby/Ruby32-x86/lib/ruby/3.2.0/fiddle.rb:62:in `dlopen'
        from D:/Ruby/Ruby32-x86/lib/ruby/3.2.0/fiddle/import.rb:86:in `block in dlload'
        from D:/Ruby/Ruby32-x86/lib/ruby/3.2.0/fiddle/import.rb:77:in `collect'
        from D:/Ruby/Ruby32-x86/lib/ruby/3.2.0/fiddle/import.rb:77:in `dlload'
        from D:/Ruby/Ruby32-x86/lib/ruby/gems/3.2.0/gems/libui-0.0.15/lib/libui/ffi.rb:10:in `<module:FFI>'
        from D:/Ruby/Ruby32-x86/lib/ruby/gems/3.2.0/gems/libui-0.0.15/lib/libui/ffi.rb:5:in `<module:LibUI>'
        from D:/Ruby/Ruby32-x86/lib/ruby/gems/3.2.0/gems/libui-0.0.15/lib/libui/ffi.rb:4:in `<top (required)>'
        from D:/Ruby/Ruby32-x86/lib/ruby/gems/3.2.0/gems/libui-0.0.15/lib/libui.rb:20:in `require_relative'
        from D:/Ruby/Ruby32-x86/lib/ruby/gems/3.2.0/gems/libui-0.0.15/lib/libui.rb:20:in `<module:LibUI>'
        from D:/Ruby/Ruby32-x86/lib/ruby/gems/3.2.0/gems/libui-0.0.15/lib/libui.rb:5:in `<top (required)>'
        from <internal:D:/Ruby/Ruby32-x86/lib/ruby/site_ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:160:in `require'
        from <internal:D:/Ruby/Ruby32-x86/lib/ruby/site_ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:160:in `rescue in require'

        from <internal:D:/Ruby/Ruby32-x86/lib/ruby/site_ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:40:in `require'
        from 01_hello_libui.rb:7:in `<main>'
<internal:D:/Ruby/Ruby32-x86/lib/ruby/site_ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:86:in `require': cannot load such file -- libui (LoadError)
        from <internal:D:/Ruby/Ruby32-x86/lib/ruby/site_ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:86:in `require'
        from 01_hello_libui.rb:7:in `<main>'

おそらくだけど、gem でインストールされるのは Ruby x64(64bit版)のバイナリで、そのままでは Ruby x86 (32bit)上で動かないというオチなのではないか、という気がする…。

github上のページで、「32bit (x86) 版のDLLが欲しかったら」云々の記述があったので試してみる。何の作業をしてるのかさっぱりわからんけど…。
git clone https://github.com/kojix2/libui
cd libui
bundle install
bundle exec rake vendor:kojix2:windows_x86
bundle exec rake test
rake vendor:kojix2:windows_x86

上記のコマンドを打ち込んでいったら、git clone したフォルダ内の vendor というフォルダの中に libui.dll というファイルが作られた。作られたというか、もしかしてダウンロードされたのだろうか。途中で、[Rake] Downloading Win-x86-shared-release.zip と表示されていたし…。

とりあえず、その libui.dll を、gem でインストールしたフォルダにコピーしてみる。以下のフォルダを開く。
(Ruby 3.2.2 x86インストールフォルダ)\lib\ruby\gems\3.2.0\gems\libui-0.0.15\vendor\

この中に、libui.dll があるので、libui.dll.orig にリネームして一応バックアップ。そして、先ほど入手した libui.dll を件のフォルダにコピーする。

この状態にしたら、サンプルが動いてくれた。

どうやら Ruby x86 (32bit版) を使っているときは、libui.dll を差し替えないといけないようだなと…。その差し替え作業がこれで合ってるのかどうかわからんけど…。

ちなみに、こうして得られた libui.dll を、Ruby 2.6.10 p210 i386-mingw32 に対しても使ってみたら、libui を使ったサンプルが動いてくれた。どうやら、libui.dll 自体は、Ruby x86 と x64 で別のモノが必要になるけれど、Rubyのバージョンとは関係なく利用できる模様。

余談。gem内の.dllや.soの入れ方について :

これは余談だけど。Rubyのバージョンを問わずに、x64 と x86 だけで libui.dll を使い分けるのであれば、gem に両方同梱しておいてくれても良さそうな気もするのだけどな…。

いや、そもそも、x86-mingw32 と x64-mingw32 で別々の gem にしておくのが一般的だろうか。昔はそういう構成にしてあるパッケージがほとんどだった気がする。各パッケージの履歴にも、x86-mingw32 と x64-mingw32 の文字列が並んでいることが多かった。

_fxrubyの全バージョン履歴 | RubyGems.org | コミュニティのgemホスティングサービス
_cairoの全バージョン履歴 | RubyGems.org | コミュニティのgemホスティングサービス

ただ、昨今は分けなくなったパッケージが多い印象もある。なんでだろ。そのあたり、誰かが何かを提唱してたりするのかしらん。

もっとも、DXRuby のように、Rubyのバージョン別、x86, x64別で、全部の .so を1つのgemに入れて対処する場合もあるか…。
> tree /f dxruby-1.4.7
...
D:\RUBY\RUBY26-X86\LIB\RUBY\GEMS\2.6.0\GEMS\DXRUBY-1.4.7
└─lib
    │  dxruby.rb
    │
    ├─2.5
    │      dxruby.so
    │
    ├─2.6
    │      dxruby.so
    │
    ├─2.6_x64
    │      dxruby.so
    │
    ├─2.7
    │      dxruby.so
    │
    ├─2.7_x64
    │      dxruby.so
    │
    ├─3.0
    │      dxruby.so
    │
    └─3.0_x64
            dxruby.so

動作確認 :

github 上にサンプルファイル群があるので、ダウンロードして動作確認してみるのもよさそう。

_LibUI/examples at main - kojix2/LibUI - GitHub

大半のサンプルは動いてくれたけど、一部で問題もあった。

basic_table_image.rb を実行してみたところ、ウインドウが表示されるまで結構待たされた上に、ウインドウ上には画像らしきものが一切表示されなかった。やはり画像表示ができないGUIライブラリのようだなと…。

ただ、histogram.rb を実行したらグラフが表示されたので、自分で何か図形を描画する分には問題無く使えるのかもしれない。

と思ったが、turing_pattern.rb を実行しても、何も変化が起きない…。やはり現状では、視覚情報を表示する何かには使えないGUIライブラリと思っておいたほうがよいのだろう…。

glimmer-dsl-libuiというライブラリもあるらしい :

LibUI を呼び出して使いつつ、記述が簡単になったライブラリ(フレームワーク?)もあるらしい。

_glimmer-dsl-libui の話 #Ruby - Qiita

ただ、画像表示に関しては、やはり難有りらしい…。Linux上で使う分には表示されるけど、Windowsでは表示されないと書いてある。

libui.dll入手時に表示されたメッセージのログ :

libui.dll を入手した際に表示されたメッセージを一応メモしておく。
> git clone https://github.com/kojix2/libui
Cloning into 'libui'...
remote: Enumerating objects: 2146, done.
remote: Counting objects: 100% (369/369), done.
remote: Compressing objects: 100% (164/164), done.
Receiving objects:  99% (2125/2146)sed 255 (delta 201), pack-reused 1777
Receiving objects: 100% (2146/2146), 434.38 KiB | 5.30 MiB/s, done.
Resolving deltas: 100% (1359/1359), done.
> bundle install
Fetching gem metadata from https://rubygems.org/.
Resolving dependencies...
Fetching chunky_png 1.4.0
Fetching minitest 5.20.0
Fetching numo-narray 0.9.2.1
Fetching rubyzip 2.3.2
Installing minitest 5.20.0
Installing rubyzip 2.3.2
Installing numo-narray 0.9.2.1 with native extensions
Installing chunky_png 1.4.0
Bundle complete! 6 Gemfile dependencies, 7 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.
Post-install message from rubyzip:
RubyZip 3.0 is coming!
**********************

The public API of some Rubyzip classes has been modernized to use named
parameters for optional arguments. Please check your usage of the
following classes:
  * `Zip::File`
  * `Zip::Entry`
  * `Zip::InputStream`
  * `Zip::OutputStream`

Please ensure that your Gemfiles and .gemspecs are suitably restrictive
to avoid an unexpected breakage when 3.0 is released (e.g. ~> 2.3.0).
See https://github.com/rubyzip/rubyzip for details. The Changelog also
lists other enhancements and bugfixes that have been implemented since
version 2.3.0.
> bundle exec rake vendor:default
rake aborted!
Don't know how to build task 'vendor:default' (See the list of available tasks with `rake --tasks`)
Did you mean?  vendor:kojix2:auto

(See full trace by running task with --trace)
> bundle exec rake vendor:kojix2:windows_x86
[Rake] Downloading Win-x86-shared-release.zip
[Rake] Extracting Win-x86-shared-release.zip
[Rake] Skip sha256sum check (development build)
[Rake] Copying builddir/meson-out/libui.dll to D:/home/prg/ruby/_work_sample/libui/libui/libui/vendor/libui.dll
> bundle exec rake test
Run options: --seed 17615

# Running:

******

Fabulous run in 0.045116s, 132.9917 runs/s, 288.1487 assertions/s.

6 runs, 13 assertions, 0 failures, 0 errors, 0 skips
> rake vendor:kojix2:windows_x86
[Rake] D:/home/prg/ruby/_work_sample/libui/libui/libui/vendor/libui.dll already exist.
[Rake] Download the file and replace it.
[Rake] Downloading Win-x86-shared-release.zip
[Rake] Extracting Win-x86-shared-release.zip
[Rake] Skip sha256sum check (development build)
[Rake] Copying builddir/meson-out/libui.dll to D:/home/prg/ruby/_work_sample/libui/libui/libui/vendor/libui.dll

自分、bundle とか rake とか一体ソレは何ですか? という知識状態なので、おそらく無駄な作業をしているような気がする。

#2 [linux] 日記ページのアーカイブ閲覧時のIDとパスワードを追加しておいた

ちょっとタイトルが間違ってる気もするけど…。アーカイブと言うか、外部ページのキャッシュだよな…。

このWeb日記ページは、ページ内の各リンクの先頭の「_」をクリックすると、外部サイトをキャッシュしたページが表示されるのだけど、一応、Webサーバ(Apache2)のBASIC認証を有効にして、IDとパスワードの入力を求めるようにしてある。

その際、ヒントとして、以下のメッセージが表示されるように設定してあった。
Cache Archive ID: Future Boy ***** PASS:***** Kopanda
宮崎アニメに詳しい人ならすぐ分かるはず。もっとも、全部小文字だったり、koじゃなくてcoになってる点がハマりそうではあるけど…。

しかし、いつの頃からか、各ブラウザがこの手のメッセージを表示しない仕様に変わってしまった。IDとパスワードのヒントが一切出ないので、今となってはキャッシュページを閲覧できる人は居ないだろうなと…。それどころか、このヒントメッセージが出なくなったことで、設定したはずの自分自身すらIDとパスワードを忘れてしまって、キャッシュが見れなくて毎回メモを探して右往左往している状態で…。ちょっと面倒臭くなってきた。

そんなわけで、今回、自分も忘れにくいように、ID:guest, PASS:guest を追加しておいた。とメモ。 *1

設定手順をメモ :

パスワードファイルは以下。念のために、ファイル名はちょっと変えておく。
/home/(USERNAME)/.htpasswd_axxxxxx

このパスワードファイルを使う旨は、以下のファイルで指定してある。
/home/(USERNAME)/public_html/archive/.htaccess_cxxxxx
AuthType Basic
AuthName "Cache Archive ID: Future Boy ***** PASS:***** Kopanda"
AuthUserFile /home/(USERNAME)/.htpasswd_axxxxxx
AuthGroupFile /dev/null
<Limit GET POST>
require valid-user
</Limit>

Debian Linux系の場合、パスワードファイルの作成や追加には htpasswd というプログラムを使う。これは apache2-utils というパッケージに入っている。インストールは以下。
sudo apt install apache2-utils

パスワードファイルを新規作成する場合は以下。一番最後に、初期ユーザ名を指定してることに注意。実行すると、設定すべきパスワードの入力を求められる。
htpasswd -c -B /home/(USERNAME)/.htpasswd_axxxxxx USERNAME

ID(USERNAME)とパスワードを追加する場合は以下。
htpasswd -B /home/(USERNAME)/.htpasswd_axxxxxx USERNAME

*1: って、こんなところにそんな情報書いちゃっていいの? いやまあ、どうせ誰も見てないWeb日記だし…。このWeb日記、未だにhttpsに対応してないせいか、Googleでも滅多にリストアップされなくなってきているので…。それにそもそも、リンク先の元ページがちゃんと生きてたらキャッシュを見る必要も無いのだから、キャッシュを見るためのIDとパスワードなんてそれほど重要な情報ではないよなと…。それに、今はWebArchiveがあるし。あっちはIDやパスワードなんて無くても見れるし。そういったことを考えると、ここにコレを書いたからと言ってソレが何なの、という気分になってきたわけで。

#3 [nitijyou] 日記ページをアップロード

2023/08/10を最後に日記をアップロードしてなかったのでアップロード。

2023/10/18(水) [n年前の日記]

#1 [ruby] FXRubyをWindows10上で試用

Windows10 x64 22H2上で、FXRuby を試用してみた。

_GitHub - larskanis/fxruby: FXRuby is an extension module for Ruby that provides an interface to the FOX GUI toolkit.
_fxruby | RubyGems.org | コミュニティのgemホスティングサービス
_File: README - Documentation for fxruby (1.6.46)

FXRubyは、Rubyから利用できるGUIライブラリ。 _FOX Toolkit というGUIライブラリをRubyから利用できるようにしたもの。かなり昔からあるけれど、他のRuby用GUIライブラリが軒並み開発停止になっている中、今でも開発が続いているあたり、かなり貴重なライブラリなのではないかと。

以下の環境で動作確認してみた。
ちなみに、自分、以前少しだけ試用してみたことがあるっぽい。

_mieki256's diary - FXRubyを勉強中

インストール :

gem install fxruby

Windowsの場合は、これだけでインストールできる。今回は fxruby 1.6.46 x86-mingw32 がインストールされた。

サンプルファイルで動作確認 :

以下のディレクトリにサンプルファイル群が入っている。
(Rubyインストールフォルダ)\lib\ruby\gems\2.6.0\gems\fxruby-1.6.46-x86-mingw32\examples\

examples\ を別の場所にまるっとコピーして、その中で一通り動かしてみたけれど、FXRuby だけを使っているサンプルについては大体動かせた。他のライブラリまで要求するサンプルについては動作確認していない。

ただ、一見動いているようでも、一部のスクリプトは終了時に Segmentation fault を吐く。例えば dctest.rb は、Ruby 2.6.10 x86、Ruby 3.2.2 x86、どちらも Segmentation fault を吐いた。

更に、一部のスクリプトは、終了時に以下のメッセージを吐く。
../../../../ext/fox16_c/FXRuby.cpp(164): FXASSERT(SWIG_CheckConvert(rbObj, ty)) failed.
例えば image.rb がこういうメッセージを吐いたりする。しかし、Ruby 2.6.10 x86 では吐くけれど、Ruby 3.2.2 x86 では吐かない。Ruby のバージョンによって問題が起きたり起きなかったりするっぽい。

問題点 :

少し触っているうちに、ふと気づいた。コレ、日本語入力ができないのでは…? scintilla-test.rb を動かして試した感じでは、IMEが無反応だった。

加えて、Alt + F4 でウインドウを閉じられない点も少し気になった。Windowsの作法に従ってないっぽい。でもまあ、他のアプリでもそういうのはあるから、そこらへんはまあいいか。

何にせよ、日本語入力ができない点は、日本語文化圏では結構痛い気がする。道理で日本国内では関連記事を全く見かけないわけで…。日本語入力を一切しないGUIアプリなら使えなくもない、みたいな話になるのだろうか。


以下の記事によると、入力はともかく、日本語表示はできるらしい。

_Rubyはじめました: rubyでGUIアプリ FxRubyのインストールとHello World!


更にググっていたら、大昔、2002年頃なら、パッチをあてることで入力できなくもない状態になってた時期もあるようで…。ただ、今ではパッチ関連のページすら消滅してる状況なので、もう誰も FOX Toolkit に日本語入力なんて期待していないということなのだろう…。

_Takahiro's inside out - fox-unicode (WebArchive)
_FOX Unicode 化 (WebArchive)
_Ruby de GUI

#2 [ruby] Ruby/GTK3を試用

Windows10 x64 22H2 + Ruby で使えるGUIライブラリ FXRuby を試用してみたものの、日本語入力できない点が気になるわけで。ruby-gtk3 ならそのあたりはどうなのかなと気になったので、試用してみることにした。

_gtk3 | RubyGems.org | コミュニティのgemホスティングサービス
_The source of https://ruby-gnome.github.io/ | ruby-gnome.github.io
_GitHub - ruby-gnome/ruby-gnome: A set of bindings for the GNOME libraries to use from Ruby.
_File: README - Documentation for gtk3 (4.2.0)

2023年になっても更新されている。今でもちゃんと開発が続いてるGUIライブラリらしい。

ところで、名称がよく分からんのだけど…。Ruby/GTK3、ruby-gtk3、Ruby-GNOME2 GTK3モジュール、どの名称が正しいのだろう?

環境は以下。

インストール :

gem install gtk3

以下が追加でインストールされた。
gobject-introspection-4.2.0.gem
glib2-4.2.0.gem
pkg-config-1.5.5.gem
cairo-gobject-4.2.0.gem
pango-4.2.0.gem
gio2-4.2.0.gem
gdk_pixbuf2-4.2.0.gem
gdk3-4.2.0.gem
gtk3-4.2.0.gem
atk-4.2.0.gem

ほとんどのパッケージはビルドされてからインストールされた。つまり、Windows上で Ruby + gtk3 を使うにあたっては、ビルドするための環境が ―― DevKitが必須になる模様。

サンプルを動かして動作確認 :

以前書いたままHDDに残ってたサンプルファイル群はそのまま動いてくれた。

また、以下のページ紹介されているサンプルも動かしてみた。

_noanoa 日々の日記 : Ruby/GTK2,GTK3 プログラミング Tips(6)- テキスト入力
_noanoa 日々の日記 : Ruby/GTK2,GTK3 プログラミング Tips(4)- 画像、アニメーション

  • テキスト入力欄(Entry)を使うサンプルを動かしてみたら、FXRuby と違って日本語入力も受け付けてくれた。
  • 画像表示するサンプルが動いたので、LibUI と違って Windows上でも画像表示可能らしい。

ただ、ウインドウが表示されるまでちょっと待たされる感じがする。自分が使ってる環境、AMD Ryzen 5 5600X ですら数秒待たされるので、もっとスペックが低いPCで動かしたらどうなることやら。起動時のもっさり感は尋常じゃない印象。

それでも、日本語入力ができるし、画像表示もできるし、何より開発停止になってないしで、Windows上のRubyでGUIアプリを作るなら、現状では ruby-gtk3 一択かもしれないと思えてきた。もっとも、まだexe化は試してないので、そのあたりは不安だけど…。exe化できるんかな…。

参考になりそうなページ :


2023/10/19(木) [n年前の日記]

#1 [ruby] Ruby/GTK3を使ってるスクリプトをexe化したかったけどできなかった

Windows10 x64 22H2上で、gtk3 (Ruby/GTK3, ruby-gtk3) を使っているRubyスクリプトをexe化できるのか気になったので試してみた。

結論を先に書くと、gtk3 を使ったRubyスクリプトは、exe化できなかった。ちなみに、FXRuby や LibUI を使ったRubyスクリプトならexe化できた。

RubyバージョンGUIライブラリ日本語入力画像表示exe化exe化ツール
Ruby 2.6.10 x86LibUI 0.0.15YesNoYesocra 1.3.11
Ruby 3.2.2 x86LibUI 0.0.15YesNoYesocran 1.3.14
Ruby 2.6.10 x86FXRuby 1.6.46 x86-mingw32NoYesYesocra 1.3.11
Ruby 3.2.2 x86FXRuby 1.6.46 x86-mingw32NoYesYesocran 1.3.14
Ruby 2.6.10 x86gtk3 4.2.0YesYesNoocra 1.3.11
Ruby 3.2.2 x86gtk3 4.2.0YesYesNoocran 1.3.14

「Windows上でRubyを使ってGUIアプリを作りたいなら ruby-gtk3 一択かもしれない」と書いてしまったけれど、それは間違いだった模様。exe化できないのではなあ…。

_GitHub - kojix2/LibUI: A portable GUI library for Ruby
_libui | RubyGems.org | コミュニティのgemホスティングサービス

_GitHub - larskanis/fxruby: FXRuby is an extension module for Ruby that provides an interface to the FOX GUI toolkit.
_fxruby | RubyGems.org | コミュニティのgemホスティングサービス

_gtk3 | RubyGems.org | コミュニティのgemホスティングサービス
_The source of https://ruby-gnome.github.io/ | ruby-gnome.github.io

Ruby 3.2.2 x86 の場合 :

Ruby 3.2.2 x86 (RubyInstaller2) を使って試してみた。ocra を使えばexe化できるかなと思ったけれど…。
> ruby --version
ruby 3.2.2 (2023-03-30 revision e51014f9c0) [i386-mingw32]

> ocra 08_image2.rb
=== Loading script to check dependencies
=== Attempting to trigger autoload of Matrix::EigenvalueDecomposition
=== Attempting to trigger autoload of Matrix::LUPDecomposition
=== Detected gem error_highlight-0.5.1 (loaded, files)
===     0 files, 0 bytes
=== Detected gem did_you_mean-1.6.3 (loaded, files)
===     0 files, 0 bytes
=== Detected gem syntax_suggest-1.0.2 (loaded, files)
===     0 files, 0 bytes
=== Detected gem ocra-1.3.11 (loaded, files)
===     5 files, 271800 bytes
=== Detected gem pkg-config-1.5.5 (loaded, files)
===     3 files, 34908 bytes
=== Detected gem native-package-installer-1.1.8 (loaded, files)
===     0 files, 0 bytes
=== Detected gem glib2-4.2.0 (loaded, files)
===     21 files, 858833 bytes
=== Detected gem atk-4.2.0 (loaded, files)
===     5 files, 31420 bytes
=== Detected gem matrix-0.4.2 (loaded, files)
===     4 files, 92057 bytes
=== Detected gem red-colors-0.3.0 (loaded, files)
===     44 files, 295060 bytes
=== Detected gem cairo-1.17.12 (loaded, files)
===     27 files, 759830 bytes
=== Detected gem cairo-gobject-4.2.0 (loaded, files)
===     6 files, 76283 bytes
=== Detected gem gobject-introspection-4.2.0 (loaded, files)
===     22 files, 360545 bytes
=== Detected gem pango-4.2.0 (loaded, files)
===     24 files, 119909 bytes
=== Detected gem fiddle-1.1.1 (loaded, files)
===     0 files, 0 bytes
=== Detected gem gio2-4.2.0 (loaded, files)
===     28 files, 111052 bytes
=== Detected gem gdk_pixbuf2-4.2.0 (loaded, files)
===     12 files, 63139 bytes
=== Detected gem gdk3-4.2.0 (loaded, files)
===     19 files, 73561 bytes
=== Detected gem gtk3-4.2.0 (loaded, files)
===     254 files, 1427401 bytes
=== Detected gem pathname-0.2.1 (loaded, files)
===     0 files, 0 bytes
=== Detected gem english-0.7.2 (loaded, files)
===     0 files, 0 bytes
=== Detected gem date-3.3.3 (loaded, files)
===     0 files, 0 bytes
=== Detected gem time-0.2.2 (loaded, files)
===     0 files, 0 bytes
=== Detected gem json-2.6.3 (loaded, files)
===     0 files, 0 bytes
=== Detected gem ostruct-0.5.5 (loaded, files)
===     0 files, 0 bytes
=== Detected gem forwardable-1.3.3 (loaded, files)
===     0 files, 0 bytes
=== Including 61 encoding support files (3706880 bytes, use --no-enc to exclude)
=== Building 08_image2.exe
=== Adding user-supplied source files
D:/Ruby/Ruby32-x86/lib/ruby/gems/3.2.0/gems/ocra-1.3.11/bin/ocra:1188:in `initialize': No such file or directory @ rb_sysopen - D:/home/prg/ruby/_work_sample/gtk3/fiber.so (Errno::ENOENT)
        from D:/Ruby/Ruby32-x86/lib/ruby/gems/3.2.0/gems/ocra-1.3.11/bin/ocra:1188:in `open'
        from D:/Ruby/Ruby32-x86/lib/ruby/gems/3.2.0/gems/ocra-1.3.11/bin/ocra:1188:in `createfile'
        from D:/Ruby/Ruby32-x86/lib/ruby/gems/3.2.0/gems/ocra-1.3.11/bin/ocra:898:in `block (2 levels) in build_exe'
        from D:/Ruby/Ruby32-x86/lib/ruby/gems/3.2.0/gems/ocra-1.3.11/bin/ocra:882:in `each'
        from D:/Ruby/Ruby32-x86/lib/ruby/gems/3.2.0/gems/ocra-1.3.11/bin/ocra:882:in `block in build_exe'
        from D:/Ruby/Ruby32-x86/lib/ruby/gems/3.2.0/gems/ocra-1.3.11/bin/ocra:1087:in `block in initialize'
        from D:/Ruby/Ruby32-x86/lib/ruby/gems/3.2.0/gems/ocra-1.3.11/bin/ocra:1071:in `open'
        from D:/Ruby/Ruby32-x86/lib/ruby/gems/3.2.0/gems/ocra-1.3.11/bin/ocra:1071:in `initialize'
        from D:/Ruby/Ruby32-x86/lib/ruby/gems/3.2.0/gems/ocra-1.3.11/bin/ocra:879:in `new'
        from D:/Ruby/Ruby32-x86/lib/ruby/gems/3.2.0/gems/ocra-1.3.11/bin/ocra:879:in `build_exe'
        from D:/Ruby/Ruby32-x86/lib/ruby/gems/3.2.0/gems/ocra-1.3.11/bin/ocra:1231:in `block in <top (required)>'

エラーが出てしまった。fiber.so が見つからないと言っているのだろうか。fiber って何だろう。"ruby fiber" でググってみたら組み込みライブラリと出てきたけど…。

Ruby 2.6.10 x86 の場合 :

Ruby 2.6.10 x86 で試してみた。これも ocra でexe化できないか試した。
> ruby --version
ruby 2.6.10p210 (2022-04-12 revision 67958) [i386-mingw32]

> ocra 08_image2.rb images
=== Loading script to check dependencies
=== Attempting to trigger autoload of Matrix::EigenvalueDecomposition
=== Attempting to trigger autoload of Matrix::LUPDecomposition
=== Detected gem did_you_mean-1.5.0 (loaded, files)
===     25 files, 31813 bytes
=== Detected gem ocra-1.3.11 (loaded, files)
===     5 files, 271800 bytes
=== Detected gem pkg-config-1.5.5 (loaded, files)
===     3 files, 34908 bytes
=== Detected gem native-package-installer-1.1.5 (loaded, files)
===     0 files, 0 bytes
=== Detected gem glib2-4.2.0 (loaded, files)
===     21 files, 887505 bytes
=== Detected gem atk-4.2.0 (loaded, files)
===     5 files, 31420 bytes
=== Detected gem red-colors-0.3.0 (loaded, files)
===     44 files, 295060 bytes
=== Detected gem cairo-1.17.12 (loaded, files)
===     27 files, 759830 bytes
=== Detected gem cairo-gobject-4.2.0 (loaded, files)
===     6 files, 75259 bytes
=== Detected gem gobject-introspection-4.2.0 (loaded, files)
===     22 files, 361569 bytes
=== Detected gem pango-4.2.0 (loaded, files)
===     24 files, 117861 bytes
=== Detected gem gio2-4.2.0 (loaded, files)
===     28 files, 109004 bytes
=== Detected gem gdk_pixbuf2-4.2.0 (loaded, files)
===     12 files, 63139 bytes
=== Detected gem gdk3-4.2.0 (loaded, files)
===     19 files, 73561 bytes
=== Detected gem gtk3-4.2.0 (loaded, files)
===     254 files, 1428425 bytes
=== Detected gem date-3.1.1 (loaded, files)
===     4 files, 481268 bytes
=== Detected gem matrix-0.4.2 (loaded, files)
===     5 files, 92981 bytes
=== Detected gem json-2.5.1 (loaded, files)
===     14 files, 208760 bytes
=== Detected gem ostruct-0.4.0 (loaded, files)
===     6 files, 15432 bytes
=== Detected gem forwardable-1.3.2 (loaded, files)
===     3 files, 10555 bytes
=== Detected gem fiddle-1.0.9 (loaded, files)
===     8 files, 165712 bytes
=== Including 59 encoding support files (3672064 bytes, use --no-enc to exclude)
=== Building 08_image2.exe
=== Adding user-supplied source files
=== Adding ruby executable ruby.exe
=== Adding detected DLL D:/Ruby/Ruby26-x86/bin/ruby_builtin_dlls/libssp-0.dll
=== Adding detected DLL D:/Ruby/Ruby26-x86/bin/ruby_builtin_dlls/libgmp-10.dll
=== Adding detected DLL D:/Ruby/Ruby26-x86/bin/ruby_builtin_dlls/libgcc_s_dw2-1.dll
=== Adding detected DLL D:/Ruby/Ruby26-x86/bin/ruby_builtin_dlls/libwinpthread-1.dll
=== Adding detected DLL D:/Ruby/Ruby26-x86/bin/ruby_builtin_dlls/libintl-8.dll
=== Adding detected DLL D:/Ruby/Ruby26-x86/msys32/mingw32/bin/libgobject-2.0-0.dll
=== Adding detected DLL D:/Ruby/Ruby26-x86/bin/ruby_builtin_dlls/libiconv-2.dll
=== Adding detected DLL D:/Ruby/Ruby26-x86/msys32/mingw32/bin/libglib-2.0-0.dll
=== Adding detected DLL D:/Ruby/Ruby26-x86/bin/ruby_builtin_dlls/libffi-7.dll
=== Adding detected DLL D:/Ruby/Ruby26-x86/msys32/mingw32/bin/libpcre-1.dll
=== Adding detected DLL D:/Ruby/Ruby26-x86/msys32/mingw32/bin/libgirepository-1.0-1.dll
=== Adding detected DLL D:/Ruby/Ruby26-x86/msys32/mingw32/bin/libgmodule-2.0-0.dll
=== Adding detected DLL D:/Ruby/Ruby26-x86/msys32/mingw32/bin/libgio-2.0-0.dll
=== Adding detected DLL D:/Ruby/Ruby26-x86/bin/ruby_builtin_dlls/zlib1.dll
=== Adding detected DLL D:/Ruby/Ruby26-x86/msys32/mingw32/bin/libatk-1.0-0.dll
=== Adding detected DLL D:/Ruby/Ruby26-x86/msys32/mingw32/bin/libfreetype-6.dll
=== Adding detected DLL D:/Ruby/Ruby26-x86/msys32/mingw32/bin/libcairo-2.dll
=== Adding detected DLL D:/Ruby/Ruby26-x86/msys32/mingw32/bin/libbz2-1.dll
=== Adding detected DLL D:/Ruby/Ruby26-x86/msys32/mingw32/bin/libbrotlidec.dll
=== Adding detected DLL D:/Ruby/Ruby26-x86/msys32/mingw32/bin/libharfbuzz-0.dll
=== Adding detected DLL D:/Ruby/Ruby26-x86/msys32/mingw32/bin/libpng16-16.dll
=== Adding detected DLL D:/Ruby/Ruby26-x86/msys32/mingw32/bin/libstdc++-6.dll
=== Adding detected DLL D:/Ruby/Ruby26-x86/msys32/mingw32/bin/libfontconfig-1.dll
=== Adding detected DLL D:/Ruby/Ruby26-x86/msys32/mingw32/bin/libpixman-1-0.dll
=== Adding detected DLL D:/Ruby/Ruby26-x86/msys32/mingw32/bin/libbrotlicommon.dll
=== Adding detected DLL D:/Ruby/Ruby26-x86/msys32/mingw32/bin/libgraphite2.dll
=== Adding detected DLL D:/Ruby/Ruby26-x86/msys32/mingw32/bin/libexpat-1.dll
=== Adding detected DLL D:/Ruby/Ruby26-x86/msys32/mingw32/bin/libcairo-gobject-2.dll
=== Adding detected DLL D:/Ruby/Ruby26-x86/msys32/mingw32/bin/libpango-1.0-0.dll
=== Adding detected DLL D:/Ruby/Ruby26-x86/msys32/mingw32/bin/libthai-0.dll
=== Adding detected DLL D:/Ruby/Ruby26-x86/msys32/mingw32/bin/libfribidi-0.dll
=== Adding detected DLL D:/Ruby/Ruby26-x86/msys32/mingw32/bin/libdatrie-1.dll
=== Adding detected DLL D:/Ruby/Ruby26-x86/msys32/mingw32/bin/libpangocairo-1.0-0.dll
=== Adding detected DLL D:/Ruby/Ruby26-x86/msys32/mingw32/bin/libpangoft2-1.0-0.dll
=== Adding detected DLL D:/Ruby/Ruby26-x86/msys32/mingw32/bin/libpangowin32-1.0-0.dll
=== Adding detected DLL D:/Ruby/Ruby26-x86/msys32/mingw32/bin/libgdk_pixbuf-2.0-0.dll
=== Adding detected DLL D:/Ruby/Ruby26-x86/msys32/mingw32/bin/libgdk-3-0.dll
=== Adding detected DLL D:/Ruby/Ruby26-x86/msys32/mingw32/bin/libepoxy-0.dll
=== Adding detected DLL D:/Ruby/Ruby26-x86/msys32/mingw32/bin/libgtk-3-0.dll
=== Adding detected DLL D:/Ruby/Ruby26-x86/msys32/mingw32/lib/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-png.dll
=== Adding external manifest D:/Ruby/Ruby26-x86/bin/ruby_builtin_dlls/ruby_builtin_dlls.manifest
=== Adding external manifest D:/Ruby/Ruby26-x86/msys32/mingw32/bin/mako-render.exe.manifest
=== Adding external manifest D:/Ruby/Ruby26-x86/msys32/mingw32/bin/update-mime-database.exe.manifest
=== Adding library files
=== Compressing 41277968 bytes

LZMA 19.00 (x86) : Igor Pavlov : Public domain : 2019-02-21

Input size:  41277968 (39 MiB)
Output size: 10519402 (10 MiB)
=== Finished building 08_image2.exe (10570110 bytes)

一見すると exe が作れたように見えたけれど、実行してみると動作しない。
> 08_image2.exe
C:/Users/(USERNAME)/AppData/Local/Temp/ocrA5C9.tmp/lib/ruby/site_ruby/2.6.0/rubygems/core_ext/kernel_require.rb:85:in `require': 126: 指定されたモジュールが見つかりません。   - C:/Users/(USERNAME)/AppData/Local/Temp/ocrA5C9.tmp/lib/ruby/gems/2.6.0/gems/gobject-int
rospection-4.2.0/lib/gobject_introspection.so (LoadError)
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocrA5C9.tmp/lib/ruby/site_ruby/2.6.0/rubygems/core_ext/kernel_require.rb:85:in `require'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocrA5C9.tmp/lib/ruby/gems/2.6.0/gems/gobject-introspection-4.2.0/lib/gobject-introspection.rb:34:in `<top (required)>'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocrA5C9.tmp/lib/ruby/site_ruby/2.6.0/rubygems/core_ext/kernel_require.rb:85:in `require'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocrA5C9.tmp/lib/ruby/site_ruby/2.6.0/rubygems/core_ext/kernel_require.rb:85:in `require'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocrA5C9.tmp/lib/ruby/gems/2.6.0/gems/atk-4.2.0/lib/atk.rb:17:in `<top (required)>'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocrA5C9.tmp/lib/ruby/site_ruby/2.6.0/rubygems/core_ext/kernel_require.rb:85:in `require'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocrA5C9.tmp/lib/ruby/site_ruby/2.6.0/rubygems/core_ext/kernel_require.rb:85:in `require'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocrA5C9.tmp/lib/ruby/gems/2.6.0/gems/gtk3-4.2.0/lib/gtk3.rb:17:in `<top (required)>'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocrA5C9.tmp/lib/ruby/site_ruby/2.6.0/rubygems/core_ext/kernel_require.rb:160:in `require'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocrA5C9.tmp/lib/ruby/site_ruby/2.6.0/rubygems/core_ext/kernel_require.rb:160:in `rescue in require'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocrA5C9.tmp/lib/ruby/site_ruby/2.6.0/rubygems/core_ext/kernel_require.rb:149:in `require'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocrA5C9.tmp/src/08_image2.rb:14:in `<main>'
C:/Users/(USERNAME)/AppData/Local/Temp/ocrA5C9.tmp/lib/ruby/site_ruby/2.6.0/rubygems/core_ext/kernel_require.rb:85:in `require': cannot load such file -- gtk3 (LoadError)
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocrA5C9.tmp/lib/ruby/site_ruby/2.6.0/rubygems/core_ext/kernel_require.rb:85:in `require'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocrA5C9.tmp/src/08_image2.rb:14:in `<main>'

gobject_introspection.so が見つからないし、gtk3 もロードできないと言っているように見える。

Ruby 3.0.4 x86 の場合 :

Ruby 3.0.4 x86 + ocra で試してみた。

.exe は作成できたけど、実行してみるとエラーになった。エラーメッセージの量からすると、Ruby 2.6.10 x86 より酷い状態になった…。
> 08_image2.exe
C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems/specification.rb:1406:in `rescue in block in activate_dependencies': Could not find 'pkg-config' (>= 1.3.5) among 23 total gem(s) (Gem::MissingSpecError)
Checked in 'GEM_PATH=C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/gemhome;C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/gems/3.0.0' at: C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/gems/3.0.0/specifications/glib2-4.2.0.gemspec, execute `gem env` for more information
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems/specification.rb:1403:in `block in activate_dependencies'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems/specification.rb:1392:in `each'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems/specification.rb:1392:in `activate_dependencies'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems/specification.rb:1374:in `activate'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems/specification.rb:1410:in `block in activate_dependencies'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems/specification.rb:1392:in `each'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems/specification.rb:1392:in `activate_dependencies'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems/specification.rb:1374:in `activate'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems/specification.rb:1410:in `block in activate_dependencies'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems/specification.rb:1392:in `each'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems/specification.rb:1392:in `activate_dependencies'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems/specification.rb:1374:in `activate'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems.rb:221:in `rescue in try_activate'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems.rb:214:in `try_activate'
        from <internal:C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems/core_ext/kernel_require.rb>:153:in `rescue in require'
        from <internal:C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems/core_ext/kernel_require.rb>:149:in `require'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/src/08_image2.rb:14:in `<main>'
C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems/dependency.rb:311:in `to_specs': Could not find 'pkg-config' (>= 1.3.5) among 23 total gem(s) (Gem::MissingSpecError)
Checked in 'GEM_PATH=C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/gemhome;C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/gems/3.0.0' , execute `gem env` for more information
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems/specification.rb:1404:in `block in activate_dependencies'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems/specification.rb:1392:in `each'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems/specification.rb:1392:in `activate_dependencies'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems/specification.rb:1374:in `activate'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems/specification.rb:1410:in `block in activate_dependencies'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems/specification.rb:1392:in `each'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems/specification.rb:1392:in `activate_dependencies'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems/specification.rb:1374:in `activate'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems/specification.rb:1410:in `block in activate_dependencies'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems/specification.rb:1392:in `each'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems/specification.rb:1392:in `activate_dependencies'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems/specification.rb:1374:in `activate'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems.rb:221:in `rescue in try_activate'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems.rb:214:in `try_activate'
        from <internal:C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems/core_ext/kernel_require.rb>:153:in `rescue in require'
        from <internal:C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems/core_ext/kernel_require.rb>:149:in `require'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/src/08_image2.rb:14:in `<main>'
C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems/specification.rb:1406:in `rescue in block in activate_dependencies': Could not find 'pkg-config' (>= 1.3.5) among 23 total gem(s) (Gem::MissingSpecError)
Checked in 'GEM_PATH=C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/gemhome;C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/gems/3.0.0' at: C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/gems/3.0.0/specifications/glib2-4.2.0.gemspec, execute `gem env` for more information
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems/specification.rb:1403:in `block in activate_dependencies'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems/specification.rb:1392:in `each'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems/specification.rb:1392:in `activate_dependencies'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems/specification.rb:1374:in `activate'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems/specification.rb:1410:in `block in activate_dependencies'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems/specification.rb:1392:in `each'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems/specification.rb:1392:in `activate_dependencies'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems/specification.rb:1374:in `activate'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems/specification.rb:1410:in `block in activate_dependencies'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems/specification.rb:1392:in `each'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems/specification.rb:1392:in `activate_dependencies'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems/specification.rb:1374:in `activate'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems.rb:215:in `try_activate'
        from <internal:C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems/core_ext/kernel_require.rb>:153:in `rescue in require'
        from <internal:C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems/core_ext/kernel_require.rb>:149:in `require'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/src/08_image2.rb:14:in `<main>'
C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems/dependency.rb:311:in `to_specs': Could not find 'pkg-config' (>= 1.3.5) among 23 total gem(s) (Gem::MissingSpecError)
Checked in 'GEM_PATH=C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/gemhome;C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/gems/3.0.0' , execute `gem env` for more information
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems/specification.rb:1404:in `block in activate_dependencies'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems/specification.rb:1392:in `each'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems/specification.rb:1392:in `activate_dependencies'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems/specification.rb:1374:in `activate'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems/specification.rb:1410:in `block in activate_dependencies'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems/specification.rb:1392:in `each'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems/specification.rb:1392:in `activate_dependencies'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems/specification.rb:1374:in `activate'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems/specification.rb:1410:in `block in activate_dependencies'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems/specification.rb:1392:in `each'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems/specification.rb:1392:in `activate_dependencies'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems/specification.rb:1374:in `activate'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems.rb:215:in `try_activate'
        from <internal:C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems/core_ext/kernel_require.rb>:153:in `rescue in require'
        from <internal:C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems/core_ext/kernel_require.rb>:149:in `require'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/src/08_image2.rb:14:in `<main>'
<internal:C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems/core_ext/kernel_require.rb>:85:in `require': cannot load such file -- gtk3 (LoadError)
        from <internal:C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/lib/ruby/3.0.0/rubygems/core_ext/kernel_require.rb>:85:in `require'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocr5D57.tmp/src/08_image2.rb:14:in `<main>'

ocraのバグらしい :

fiber.so が見つからないと言ってくる件は、Ruby 3.1 以降の仕様変更によるもので、ocra が対応できてない状態らしい。

_Ruby 3.1 doesn't bring fiber.so and crashes Ocra - Issue #179 - larsch/ocra - GitHub
_Possible error: No such file or directory @ rb_sysopen - C:/home/x/programming/ruby/src/roebe/bin/fiber.so (Errno::ENOENT) - Issue #186 - larsch/ocra - GitHub


パッチはあるらしいけど反映されてないっぽい。

_Ignore fiber.so by sk757a - Pull Request #189 - larsch/ocra - GitHub


上記の修正を、Ruby 3.2.2 x86 にインストールした ocra に対してやってみた。以下のファイルを修正する。
(Ruby 3.2.2 x86インストールフォルダ)\lib\ruby\gems\3.2.0\gems\ocra-1.3.11\bin\ocra

fiber.so 云々のエラーは出なくなって exe も生成できるようになった。しかし、出来上がった exe を実行するとエラーになる。
> 08_image2.exe
C:/Users/(USERNAME)/AppData/Local/Temp/ocrDFB4.tmp/lib/ruby/site_ruby/3.2.0/rubygems.rb:1366:in `read': No such file or directory @ rb_sysopen - C:/Users/(USERNAME)/AppData/Local/Temp/ocrDFB4.tmp/lib/ruby/site_ruby/3.2.0/rubygems/core_ext/kernel_require.rb (Errno::ENOENT)
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocrDFB4.tmp/lib/ruby/site_ruby/3.2.0/rubygems.rb:1366:in `<top (required)>'
        from <internal:gem_prelude>:2:in `require'
        from <internal:gem_prelude>:2:in `<internal:gem_prelude>'

ruby-gtk3以外で試してみた :

ruby-gtk3 で試してるからいかんのだろうか。別のGUIライブラリならどうなるのだろう。

まず、Ruby 2.6.10 x86 + ocra 1.3.11 を使って試してみる。
  • libui 0.0.15 を使ってるRubyスクリプトは、exe も生成できたし、exe を実行することもできた。
  • fxruby 1.6.46 x86-mingw32 を使ってるRubyスクリプトも、exe を生成できたし、exe を実行することもできた。

次に、Ruby 3.2.2 x86 + ocra 1.3.11 を使って試してみた。尚、ocra は、fiber.so を除外するように修正した版を使用。

libui 0.0.15 を使ってるRubyスクリプトをexe化してみた。exe は生成できたけど、実行するとエラーになる。
> 01_hello_libui.exe
C:/Users/(USERNAME)/AppData/Local/Temp/ocr92BE.tmp/lib/ruby/site_ruby/3.2.0/rubygems.rb:1366:in `read': No such file or directory @ rb_sysopen - C:/Users/(USERNAME)/AppData/Local/Temp/ocr92BE.tmp/lib/ruby/site_ruby/3.2.0/rubygems/core_ext/kernel_require.rb (Errno::ENOENT)
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocr92BE.tmp/lib/ruby/site_ruby/3.2.0/rubygems.rb:1366:in `<top (required)>'
        from <internal:gem_prelude>:2:in `require'
        from <internal:gem_prelude>:2:in `<internal:gem_prelude>'

gtk3 ではなく、LibUI を使っているにも関わらず、gtk3 を利用したスクリプトをexe化した場合と同じエラーが出ているように見える。

どうやら、「ocra は Ruby 3.x 以降に対応していない」と思っておいたほうがいいのかもしれない。

ocraのfork版のocranを導入してみる :

Ruby 3.x 以降で ocra が使えない問題は、一応、issue で報告済みではある模様。放置されてるようにも見えるけど…。

_Executable created with Ocra and Ruby 3.2.2 throw an error - Issue #193 - larsch/ocra - GitHub

そして、この報告に関するやり取りの中で、このあたりのバグを修正した、ocran というfork版が存在すると知った。

_GitHub - Largo/ocran: One-Click Ruby Application Builder
_ocran | RubyGems.org | コミュニティのgemホスティングサービス

ちなみに、過去には ocra2 という fork版もあったらしいけど、それは消滅したらしい。

_ocra2 | RubyGems.org | コミュニティのgemホスティングサービス

ocran なら違った結果になるのだろうか? ocran を Ruby 3.2.2 x86 でインストールしてみた。
gem install ocran
ocran 1.3.14 がインストールされた。

LibUI を使った Rubyスクリプトを ocran でexe化してみた。
ocran 01_hello_libui.rb
01_hello_libui.exe が生成できた。実行したところ動いてくれた。

FXRuby を使った Rubyスクリプトはどうだろう。
ocran 01_hellofxruby.rb
これもexeが生成できたし、実行することもできた。

つまり、LibUI、FXRuby に関しては、ocran を使うことで、Ruby 3.2.2 x86 でもexe化できると分かった。

では、gtk3 を使ったRubyスクリプトはどうだろう。試してみた。
ocran 08_image2.rb images

exeは生成できたが…。
> 08_image2.exe
<internal:C:/Users/(USERNAME)/AppData/Local/Temp/ocrC540.tmp/lib/ruby/site_ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:86:in `require': 126: 指定されたモジュールが見つかりません。   - C:/Users/(USERNAME)/AppData/Local/Temp/ocrC540.tmp/lib/ruby/gems/3.2.0/gems/
glib2-4.2.0/lib/glib2.so (LoadError)
        from <internal:C:/Users/(USERNAME)/AppData/Local/Temp/ocrC540.tmp/lib/ruby/site_ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:86:in `require'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocrC540.tmp/lib/ruby/gems/3.2.0/gems/glib2-4.2.0/lib/glib2.rb:117:in `<top (required)>'
        from <internal:C:/Users/(USERNAME)/AppData/Local/Temp/ocrC540.tmp/lib/ruby/site_ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:86:in `require'
        from <internal:C:/Users/(USERNAME)/AppData/Local/Temp/ocrC540.tmp/lib/ruby/site_ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:86:in `require'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocrC540.tmp/lib/ruby/gems/3.2.0/gems/gobject-introspection-4.2.0/lib/gobject-introspection.rb:17:in `<top (required)>'
        from <internal:C:/Users/(USERNAME)/AppData/Local/Temp/ocrC540.tmp/lib/ruby/site_ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:86:in `require'
        from <internal:C:/Users/(USERNAME)/AppData/Local/Temp/ocrC540.tmp/lib/ruby/site_ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:86:in `require'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocrC540.tmp/lib/ruby/gems/3.2.0/gems/atk-4.2.0/lib/atk.rb:17:in `<top (required)>'
        from <internal:C:/Users/(USERNAME)/AppData/Local/Temp/ocrC540.tmp/lib/ruby/site_ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:86:in `require'
        from <internal:C:/Users/(USERNAME)/AppData/Local/Temp/ocrC540.tmp/lib/ruby/site_ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:86:in `require'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocrC540.tmp/lib/ruby/gems/3.2.0/gems/gtk3-4.2.0/lib/gtk3.rb:17:in `<top (required)>'
        from <internal:C:/Users/(USERNAME)/AppData/Local/Temp/ocrC540.tmp/lib/ruby/site_ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:160:in `require'
        from <internal:C:/Users/(USERNAME)/AppData/Local/Temp/ocrC540.tmp/lib/ruby/site_ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:160:in `rescue in require'
        from <internal:C:/Users/(USERNAME)/AppData/Local/Temp/ocrC540.tmp/lib/ruby/site_ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:40:in `require'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocrC540.tmp/src/08_image2.rb:14:in `<main>'
<internal:C:/Users/(USERNAME)/AppData/Local/Temp/ocrC540.tmp/lib/ruby/site_ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:86:in `require': cannot load such file -- gtk3 (LoadError)
        from <internal:C:/Users/(USERNAME)/AppData/Local/Temp/ocrC540.tmp/lib/ruby/site_ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:86:in `require'
        from C:/Users/(USERNAME)/AppData/Local/Temp/ocrC540.tmp/src/08_image2.rb:14:in `<main>'

glib2.so が見つからないし gtk3 も使えないと言ってきた。残念。

それでも、Ruby 3.x 以降は、ocra ではなく fork版の ocran を使えばexe化できる可能性があると分かった。

ただし、ocran を使えばあらゆるRubyスクリプトがexe化できるわけでもなく…。FXRuby や LibUI を使ったスクリプトはexe化できても、gtk3 を使ったスクリプトはexe化できない、ということも分かった。

結論としては…。Ruby なんて窓から投げ捨てろ。Python 使おうぜ。いや、日本語とオサラバさえすれば Ruby + FXRuby が使えると思うし、画像表示を諦めれば Ruby + LibUI も使えると思うけど…。

Ruby が Tk を切り捨ててしまったのが結構痛い気がする。もっとも、Windows上で Ruby + Tk が動くようにするのって一苦労だし。というか現状ではもう動かし方すら分らんし。

2023/10/20追記 :

現状の Ruby + Windows で Ruby/Tk を動かす方法が分からないと書いてしまったけど、DevKit付のRubyをインストールしてあるなら、gem install tk で利用できるようになるらしいと分かった。そのあたりは別記事でメモ。

#2 [ruby] Ruby 1.9.3 x86 でruby-gtk2を動かしてみたい

Windows10 x64 22H2上の Ruby 1.9.3 x86 で、gtk2(Ruby/GTK2, ruby-gtk2) を動かせるのか気になったので、動作するバージョンがどれなのか試して確認してみた。

手元で試した限りでは、Windows10 x64 22H2 + Ruby 1.9.3 x86 で利用できる gtk2関連パッケージの最終バージョンは 2.0.0 以下に見えた。これより上のバージョンでは動かない。また、インストールする順番も重要。cairo, glib2, pango, atk, gdk_pixbuf2, gtk2 の順でインストールすること。


> gem list | grep -E "cairo|atk|glib2|pango|gdk_pixbuf2|gtk2"
atk (2.0.0 x86-mingw32)
cairo (1.12.4 x86-mingw32)
gdk_pixbuf2 (2.0.0 x86-mingw32)
glib2 (2.0.0 x86-mingw32)
gtk2 (2.0.0 x86-mingw32)
pango (2.0.0 x86-mingw32)

Ruby 1.9.3 x86上では、cairo 1.12.4 までは動くが、cairo 1.12.5以上は動かないので、そのことで他のパッケージの依存関係的に制限が出てきて、gtk2 2.0.0 より上のバージョンは選べなくなる。

_mieki256's diary - cairo + Ruby Windows版が使えない

更に、gem を使ってネットワーク経由でインストールすると、最後の gtk2 のインストール時に、--platform=x86-mingw32 を指定していても、何故かソース(?)をダウンロードしてビルドが始まってしまう。
gem install gtk2 -v=2.0.0 --platform=x86-mingw32

ビルドを回避するには、必要になる gemファイルを全部Webブラウザ等で別途ダウンロードして、ローカルからインストールしたほうが良さそう。
gem install -l cairo-1.12.4-x86-mingw32.gem
gem install -l glib2-2.0.0-x86-mingw32.gem
gem install -l pango-2.0.0-x86-mingw32.gem
gem install -l atk-2.0.0-x86-mingw32.gem
gem install -l gdk_pixbuf2-2.0.0-x86-mingw32.gem
gem install -l gtk2-2.0.0-x86-mingw32.gem

ちなみに、Rubygemsサイトの各ページの、「ダウンロード」をクリックすれば、.gem がダウンロードできる。

_glib2 | RubyGems.org | コミュニティのgemホスティングサービス
_pango | RubyGems.org | コミュニティのgemホスティングサービス
_atk | RubyGems.org | コミュニティのgemホスティングサービス
_gdk_pixbuf2 | RubyGems.org | コミュニティのgemホスティングサービス
_gtk2 | RubyGems.org | コミュニティのgemホスティングサービス

余談。各パッケージのバージョンが 1.2.6 でも動くことを確認した。2.x.x 以降は対応する Ruby のバージョンが引き上げられたりしていたので、gtk2関連パッケージの内部でも何か大きな変化があったのかもしれない。だとすると、1.2.x系を利用したほうがまだ安定して動く可能性もある…?

ただ、glib2 1.2.2 は gem内の構成がバグっていて、修正した 1.2.3 を出したという話もあったので、1.2.3 以降を利用したほうがいいのかもしれない。

_Thread: [ruby-gnome2-devel-ja] Windowsへのinstallでエラー | Ruby-GNOME 2

exe化について :

Ruby 1.9.3 x86上では、ocra 1.3.10 なら使える。ocra 1.3.11 はエラーを出して動かない。
gem install ocra -v=1.3.10
ocra 01_hellogtk2.rb

ruby-gtk2 を使ったRubyスクリプトも、ocra 1.3.10 を使えばexe化できるが、スクリプト内に日本語文字列(UTF-8文字列)が入っていると、そこでエラーが出て処理が止まってしまった。ただ、ファイルの最初のあたりに以下の指定があればexe化できる時もある模様。
# -*- mode: ruby; coding: utf-8 -*-

とりあえず、Ruby 1.9.3 x86 + ruby-gtk2 2.0.0 を使えば exe化できる可能性もある、と分かった。とはいえ、Ruby 1.9 まで戻って使うというのも…。なんだかな。

#3 [python] Pythonで使えるGUIライブラリについて

Python で使えるGUIライブラリってどのくらいあるのかなとググってみたら…。

_GuiProgramming - Python Wiki

改めて、選び放題だなと感心してしまった。

個人的には、tkinter のラッパーの PySimpleGUI がイイ感じに思えた記憶がある。配列(?)を使ってウィジェット(部品)を配置していくあたりが分かりやすかった。日本ではなんでもかんでもExcelを使って表を埋めるように文書を作ってしまう文化があるらしいけど、PySimpleGUI も表を埋めていく形で配置するので日本人にピンとくる仕様なのではないかと。 *1

あるいは、RaspberryPi上で動かすことを念頭に置いて、初心者の学習用を意識したらしい guizero もイイ感じに思えた記憶がある。これなら子供さんでも全然使えそうだなと…。
*1: もっとも、表っぽく配置するレイアウト機能は、大体どのGUIライブラリもサポートしてたりするのだけど。それをどれだけ簡単に指定できるようにするか、という部分が PySimpleGUI はよく出来ている気がする。

#4 [ruby] Rubyというプログラミング言語に対する個人的な印象

ポエムです。感想には個人差があります。

Ruby が Tk を殺さなければ、いや、別に Tk に拘らなくてもいいのだけど、標準状態で何かしらのGUIライブラリが使える状態が実現していれば、Python の PySimpleGUI のように、ラッパーを書いて簡単にGUIアプリを作れるようにする試みが出てきていたのかなと夢想しないでもない…。標準でソレが使えるか使えないかは大きいよなあ…。 *1

もっとも、GUIライブラリはプログラミング言語本体とは明らかに別部分だから、言語本体の開発者にとって、そんな”どうでもいい”部分にリソースを割くより言語本体に集中を、と考えるのは至極当然な気もする。

結局、言語本体だけに注目して開発リソースの配分をするか、それとも言語を取り巻く全体を眺めてリソース配分するか、視点の違いの話なのだろうか。極端なことを言えば、言語を芸術品の類として見ているのか、それとも言語を道具として見ているのか、その違いかもしれない。

Rubyは元々、便利な道具が欲しくて作られたわけではなく、美しいプログラミング言語とはどうあるべきか、その探求心から誕生した言語と聞いているので、出自からして道具としてはなんだかイマイチになってしまう点は避けられなかったのかもしれないなと。

喩えるなら、毎日食卓に並べて使われる食器の類ではなく、床の間に飾ってある焼き物のような、そんなポジションなのだろうか。そして床の間で、ゆっくりと埃をかぶっていくのだろう…。しかし、日常的に使われる食器を作ってる人達は、その焼き物の美しさに魅かれて、せめてこの部分だけでもウチの製品に取り込めないかと試みてみたり…。色んな言語がRubyから影響を受けたと言及していたりするあたり、お手本になる部分が多いのだろう。でも、お手本にはなるけれどソレ自体は道具にならない。Ruby はそういう言語、だったのかもしれない(過去形)。

などと書いたところで思い出した。名前からして宝石だもんな…。宝石は奇麗だけど実用性は無いもんな…。自分達は宝石を、火打石や石刀として使えないものかと苦心してる状態なのでは…?

ポエムです。感想には個人差があります。
*1: でも、どうしてそういうアプローチが、元々の Tcl/Tk で出てこなかったのだろうという疑問も…。利用ユーザ数の違いが関係してるのだろうか。それとも言語仕様によるところが大きいのか。

2023/10/20(金) [n年前の日記]

#1 [ruby][python] Ruby/TkをWindows10上で試用

Windows10 x64 22H2上で Ruby/Tk を動かしてみたい。

Ruby 1.9.3 x86 であればTk拡張まで含めた Ruby/Tk を動かせることは分かったのだけど…。以前試した際の作業メモが残ってた。

_mieki256's diary - Ruby/Tkで拡張Tkを使えるようにするために少し試したり


Ruby 2.x.x 以降で、ActiveTcl を導入せずに Ruby/Tk を動かす方法はないのかなとググっていたら、気になる話を見かけた。

_イマドキ(2018)のWindows版のRubyでrequire 'tk'してエラーにならないようにするには #Ruby - Qiita

Windows環境でもtkパッケージをインストーするだけで動いたとの話。マジ?

自分も試しに、以下の環境で Tk をインストールしてみた。
gem install tk
> ruby --version
ruby 2.6.10p210 (2022-04-12 revision 67958) [i386-mingw32]

> gem install tk
Fetching tk-0.4.0.gem
Temporarily enhancing PATH for MSYS/MINGW...
Using msys2 packages: mingw-w64-i686-tk
Building native extensions. This could take a while...
Successfully installed tk-0.4.0
Parsing documentation for tk-0.4.0
Installing ri documentation for tk-0.4.0
Done installing documentation for tk after 12 seconds
1 gem installed

ビルドが走って、tk 0.4.0 がインストールされた。

この状態で、hello world系の簡単なRuby/Tk使用スクリプトを実行してみたところ、本当に動いてしまった…。ActiveTcl はインストールしてない環境なのに…。おそらく基本機能だけなら動くということだろうけど、まさかこんなにも簡単にインストールできる状態になっていたとは…。もっと面倒臭い作業が必要なのかと思い込んでた…。

ただ、Ruby 2.6.10 x86、3.0.4 x86 + Tk 0.4.0 については特に問題無く動いたけれど、Ruby 3.2.2 x86 + Tk 0.4.0 は実行する度に以下の警告メッセージが表示される。何だろうなコレは…。
> ruby calc.rb
D:/Ruby/Ruby32-x86/lib/ruby/gems/3.2.0/gems/tk-0.4.0/lib/tkutil.so: warning: undefining the allocator of T_DATA class TkUtil::CallbackSubst::Info


さておき。どこらへんに Tcl/Tk 関係が入ってるのか少し調べてみたけれど、Ruby を DevKit付でインストールしたことで、Rubyインストールディレクトリ内に msys32 というディレクトリがあって、そこに MSYS2 関係のファイルが入っていた。その中に、tcl や tk 関連らしいディレクトリやファイルも入っているように見えた。

(Rubyインストールディレクトリ)\msys32\mingw32\bin\tcl86.dll
(Rubyインストールディレクトリ)\msys32\mingw32\bin\tk86.dll
(Rubyインストールディレクトリ)\msys32\mingw32\lib\tcl8.6
(Rubyインストールディレクトリ)\msys32\mingw32\lib\tk8.6
(Rubyインストールディレクトリ)\msys32\usr\lib\tcl8.6

また、以下の場所に、tcltklib.so や tkutil.so もあった。
(Rubyインストールディレクトリ)\lib\ruby\gems\2.6.0\gems\tk-0.4.0\lib\tcltklib.so
(Rubyインストールディレクトリ)\lib\ruby\gems\2.6.0\gems\tk-0.4.0\lib\tkutil.so

MSYS2 が Tcl/Tk関係のファイルを用意してくれるようになって、Ruby/Tk が Windowsでも使えるようになった、という認識でいいのだろうか。

exe化を試した :

ocra を使って exe化できるか試した。ちなみに、Ruby の各バージョンで使える ocra or ocran は以下の通り。
  • Ruby 1.9.3 x86 : ocra 1.3.10
  • Ruby 2.6.10 x86 : ocra 1.3.11
  • Ruby 3.0.4 x86 : ocra 1.3.11
  • Ruby 3.2.2 x86 : ocran 1.3.14 (ocra の fork版。ocra は Ruby 3.1.x 以降で正常動作しない。)

Ruby 1.9.3 x86 の場合は、(Ruby 1.9.3 x86インストールディレクトリ)\lib\tcltk を含めて指定する必要がある。
ocra 03_hello_tk.rb D:\Ruby\Ruby193-x86\lib\tcltk --no-autoload --add-all-core

Ruby 2.6.10 x86, 3.0.4 x86, 3.2.2 x86 は、以下で指定してみた。
ocra 03_hello_tk.rb --no-autoload --add-all-core

exeが生成できて、実行もできた。

出来上がった exe を、他のPCにコピーして、動くかどうか確認してみた。スペックは、CPU Athlon 5350 Quad-Core (2GHz, 4core, TDP 25W)、RAM 4GB、Cドライブ SSD。OS は Windows10 x64 22H2。

Ruby 1.9.3 x86 で生成したexeは、一応動いてくれた。ただ、Hello World 系の、ウインドウとメッセージを表示するだけのプログラムなのに、ウインドウが表示されるまで1分かかった。

Ruby 2.6.10 x86 で生成したexeは、tcltklib.so が見つからないとエラーが出て、実行することはできなかった。しかもそのエラーが出てくるまで、1分10秒かかった。

Ruby 2.6.10 x86 で生成したexeも動くようにしたい。以下の記事が参考になった。

_Ruby ocraでtkを用いたGUIプログラムを実行ファイル化したが、上手く起動できない。
_Problems with tk gem on windows - Issue #131 - larsch/ocra - GitHub

ocra 03_hello_tk.rb D:\Ruby\Ruby26-x86\msys32\usr\bin\msys-2.0.dll D:\Ruby\Ruby26-x86\msys32\mingw32\lib\tcl8.6 D:\Ruby\Ruby26-x86\msys32\lib\tk8.6 --no-autoload --add-all-core --no-lzma --gem-all

要するに、ocra に以下の指定も追加する模様。
(Rubyインストールディレクトリ)\msys32\usr\bin\msys-2.0.dll
(Rubyインストールディレクトリ)\msys32\mingw32\lib\tcl8.6
(Rubyインストールディレクトリ)\msys32\lib\tk8.6
--no-autoload
--add-all-core
--no-lzma
--gem-all

  • --no-lzma をつけてexeを作ると、無圧縮状態でexeを生成するので、展開時間が早くなるはず。実際、Ruby 1.9.3 x86 を使ってexe化したソレは、ウインドウが表示されるまでの待ち時間が、1分から34秒まで短くなった。
  • Ruby 2.6.10 x86 で生成した exe も実行できるようになった。おそらく --gem-all が効いてくれた気がする。しかし、--no-lzma をつけても、ウインドウが表示されるまで1分10秒かかった。

まあ、なんというか、こんなに待たされてしまうとなると、実用的ではないなと…。

余談。Pythonで試してみた :

Python 3.10.10 + tkinter を使っている、Hello World系の、ウインドウとメッセージのみを表示をするPythonスクリプトを、pyinstaller 6.1.0 を使ってexe化して、Ruby/Tk と同様に別PCにコピーして動作確認してみた。

pyinstaller 01_helloworld_tkinter.py

pyinstaller で exe化されたソレは、tkinter のウインドウが表示されるまで、1秒もかからなかった…。

Ruby/Tk なら34秒。Python + tkinter なら1秒…。うーん。

もっとも、pyinstaller はオプションを付けずに実行すると、動作に必要なファイルを展開してある状態で exe を生成するので、おそらくそのあたりがかなり効いているのではなかろうか。これは比較として全くフェアじゃないだろう。

であればと、1つのexeファイルにする --onefile オプションをつけてexe化してみた。
pyinstaller 01_helloworld_tkinter.py --onefile

しかしこの場合も、最初の実行時は10秒、2回目の実行時は5秒ほどで、tkinter のウインドウが表示された。

ローカルで動くGUIアプリをこの手の _LL で作ってexe化して配布するなら、Ruby よりも Python を選んだほうがいいのだなと再認識してしまった…。

ちなみに、メインPC、CPU AMD Ryzen 5 5600X(3.7 - 4.6GHz, 6core), RAM 16GB の環境で Ruby/Tk のソレを動かすと、ウインドウが表示されるまで6〜3秒ぐらいかかる。Python + tkinter は1秒もかからず起動するので、Ruby/Tk を exe化したソレが数倍遅いのは間違いなさそう。

Rubyのソレは、ひょっとするとファイル展開時にCPUパワーを必要としているのだろうか…? であれば、事前にファイルを展開した状態で exe を作れるなら、実用的な起動時間になる可能性がある…? そういうexe化ツールは無いのかな?

実験に使ったスクリプト :


2023/10/21() [n年前の日記]

#1 [ruby] Rubyスクリプトをexe化できるneriを試用

Rubyスクリプトをexe化できるツールとしては ocra が一番メジャーかなと思うのだけど、ocra は必要になるファイルを1つのファイルにまとめて、exeを実行する度にテンポラリフォルダに展開するので起動が遅い。

あらかじめファイルを展開した状態にしてexe化できるツールはないのかなとググっていたら、neri というツールがあると知った。試しに使ってみることにした。

_neri | RubyGems.org | コミュニティのgemホスティングサービス
_GitHub - nodai2hITC/neri: One-Click Ruby Application Builder
_neri/README.ja.md at main - nodai2hITC/neri - GitHub
_Neri を使って Ruby スクリプトを実行ファイル(.exe)に変換して配布する #Ruby - Qiita

環境は Windows10 x64 22H2 + Ruby 2.6.10 p210 x86 (+ DevKit)。

インストール :

gem install neri

使い方 :

動作させるには DevKit が必要になるらしい。

基本的には以下のような感じで呼び出せばいいらしい。
ridk enable

neri hoge.rb
事前に ridk enable を実行しておくことに注意。

hoge.exe と、動作に必要なファイルをまとめてある systemフォルダが出来上がる。

今回は Ruby/Tk を使ったスクリプトをexe化してみたかったので、以下の指定をしてみた。
ridk enable

neri 03_hello_tk.rb D:\Ruby\Ruby26-x86\msys32\usr\bin\msys-2.0.dll D:\Ruby\Ruby26-x86\msys32\mingw32\lib\tcl8.6 D:\Ruby\Ruby26-x86\msys32\mingw32\lib\tk8.6 --gem tk --enable-gems
> neri 03_hello_tk.rb         D:\Ruby\Ruby26-x86\msys32\usr\bin\msys-2.0.dll D:\Ruby\Ruby26-x86\msys32\mingw32\lib\tcl8.6 D:\Ruby\Ruby26-x86\msys32\mingw32\lib\tk8.6 --gem tk --enable-gems
=== Running script '03_hello_tk.rb' to check dependencies.
=== Script '03_hello_tk.rb' end.
=== 576 files, 14769110 bytes dependencies.
=== Copying dependencies.
=== Creating datafile './system/03_hello_tk.dat'.
=== virtual_directory: D:/home/prg/ruby/_work_sample/tk/hello_tk
=== Creating exe_file '.\03_hello_tk.exe'.
=== Neri Finished.

exe化を試みたスクリプトは以下。

_03_hello_tk.rb

しかし、出来上がったexeを実行してみると、以下のエラーが出る。
> 03_hello_tk.exe
Ignoring fiddle-1.0.9 because its extensions are not built. Try: gem pristine fiddle --version 1.0.9
D:/home/prg/ruby/_work_sample/tk/hello_tk/exe_by_neri/03_hello_tk/system/lib/ruby/gems/2.6.0/gems/neri-1.1.0/lib/neri/runtime.rb:162:in `force_encoding': unknown encoding name - utf-8; (ArgumentError)
        from D:/home/prg/ruby/_work_sample/tk/hello_tk/exe_by_neri/03_hello_tk/system/lib/ruby/gems/2.6.0/gems/neri-1.1.0/lib/neri/runtime.rb:162:in `load_code'
        from D:/home/prg/ruby/_work_sample/tk/hello_tk/exe_by_neri/03_hello_tk/system/lib/ruby/gems/2.6.0/gems/neri-1.1.0/lib/neri/runtime.rb:84:in `load'
        from D:/home/prg/ruby/_work_sample/tk/hello_tk/exe_by_neri/03_hello_tk/system/lib/ruby/gems/2.6.0/gems/neri-1.1.0/lib/neri/runtime.rb:20:in `load'
        from -e:2:in `<main>'

「unknown encoding name - utf-8; (ArgumentError)」とな…。

エンコード関係の .so が足りてないのだろうかと思ったけれど、system\lib\ruby\2.6.0\i386-mingw32\enc\ 以下に、大量にソレっぽい .so が入っていた。これだけじゃダメなのかな…。

色々試してたら、元のスクリプトの最初のあたりに以下の行があるかないかでエラーメッセージが違ってくることに気づいた。この行があると、utf-8 云々のエラーが出る…。これってエディタにファイルの文字コードを知らせるためだけの行じゃないの…?
# -*- mode: ruby; coding: utf-8; encoding: utf-8 -*-

> 03_hello_tk.exe
Ignoring fiddle-1.0.9 because its extensions are not built. Try: gem pristine fiddle --version 1.0.9
Ignoring tk-0.4.0 because its extensions are not built. Try: gem pristine tk --version 0.4.0
D:/home/prg/ruby/_work_sample/tk/hello_tk/exe_by_neri/03_hello_tk/system/lib/ruby/site_ruby/2.6.0/rubygems/core_ext/kernel_require.rb:85:in `require': cannot load such file -- tk (LoadError)
        from D:/home/prg/ruby/_work_sample/tk/hello_tk/exe_by_neri/03_hello_tk/system/lib/ruby/site_ruby/2.6.0/rubygems/core_ext/kernel_require.rb:85:in `require'
        from D:/home/prg/ruby/_work_sample/tk/hello_tk/exe_by_neri/03_hello_tk/system/lib/ruby/gems/2.6.0/gems/neri-1.1.0/lib/neri/runtime.rb:68:in `require'
        from D:/home/prg/ruby/_work_sample/tk/hello_tk/exe_by_neri/03_hello_tk/system/lib/ruby/gems/2.6.0/gems/neri-1.1.0/lib/neri/runtime.rb:16:in `require'
        from D:/home/prg/ruby/_work_sample/tk/hello_tk/exe_by_neri/03_hello_tk/03_hello_tk.rb:11:in `<main>'
        from D:/home/prg/ruby/_work_sample/tk/hello_tk/exe_by_neri/03_hello_tk/system/lib/ruby/gems/2.6.0/gems/neri-1.1.0/lib/neri/runtime.rb:88:in `eval'
        from D:/home/prg/ruby/_work_sample/tk/hello_tk/exe_by_neri/03_hello_tk/system/lib/ruby/gems/2.6.0/gems/neri-1.1.0/lib/neri/runtime.rb:88:in `load'
        from D:/home/prg/ruby/_work_sample/tk/hello_tk/exe_by_neri/03_hello_tk/system/lib/ruby/gems/2.6.0/gems/neri-1.1.0/lib/neri/runtime.rb:20:in `load'
        from -e:2:in `<main>'

今度は「tkが無い」と言い出した…。そもそも「fiddle と tk は無視する」と言ってるあたりも気になる…。systemフォルダ内には、tk86.dll とか tcltklib.so 等があるように見えるのだけど…。これだけじゃ足りないのかな…。

neri に、--enable-gems --gem tk --gem fiddle をつけてみたり、msys32以下のディレクトリの指定を無くしたり等してみたけれど、問題は解決せず。ハードルが高いツールだなと…。

雑感 :

サクッとexe化できるなら Python + tkinter + pyinstaller と比較できるかなと思ったけれど、全然サクッといかない感じなので…。

exe化の容易さ、exe化したモノの起動速度、外部ライブラリが将来的にも維持されそうか等々、そういった点を考えると、Python ではなく Ruby を使うメリットは皆無と言うか、むしろ Ruby を選択するのはデメリットだらけなのではないかと思えてきた…。まあ、あくまで、ローカルで動くGUIアプリを作ろうとするなら、という前提の話だけど。

Ruby から Qt を使えるようにする _qtbindings というライブラリの作者様も、「こんなの使うより Python 使いましょう」と README.md にわざわざ書いていたけど。妥当な発言だよなと…。

#2 [hsp] HSPの配列について勉強中

プログラミング言語 HSP の配列の仕様について確認中。

HSPにおける配列は、最初に何個必要になるか要素数を宣言しておかないといけないのだけど、その最大個数を超えて要素を追加できないものかなと。要は、動的に配列の要素数を変更していきたい。Python なら append() でそういうことができた気がする。Ruby なら push() だっただろうか。

環境は Windows10 x64 22H2 + HSP 3.6。

あちこちの解説記事を見ると、大きいインデックス値を指定すれば自動で配列がそこまで増える、という記述も見かけたのだけど。実際試してみるとエラーになる。

_array_add.hsp
; 一度確保した配列に要素を追加できるか確認
; 要素の追加は無理っぽい。エラーになる

    onkey goto *jobend

    dim a, 5, 4
    repeat 5
        a(cnt, 0) = cnt
        a(cnt, 1) = cnt
        a(cnt, 2) = cnt
        a(cnt, 3) = cnt
    loop

    ; エラーになる
    ; a(5, 0) = 5

    repeat length(a)
        pos 4, cnt * 24
        mes "a(" + cnt + ", 0)=" + a(cnt, 0)
    loop
    stop
    
*jobend
    end

やはり、最初に用意した要素数を超えて、要素を増やすことはできないようだなと…。

となると…。一度、仮で、十分に要素数が多い配列を用意して、そこに値を入れていって、必要な要素数が判明した時点で別の配列を確保して、必要な分だけ値をコピーする…。そんな感じの処理しか思いつかない。もっと上手い方法はないのだろうか。

2023/10/22() [n年前の日記]

#1 疑似3D道路その25

随分と日が経ってしまったけれど、 _前回の作業 の続き。HSP 3.6 を使って疑似3D道路が作れないか試しているところ。環境は Windows10 x64 22H2。

コースと言うか、道路のセグメントデータを、疑似乱数で自動生成するようにしてみた。コースを2周したら、またセグメントデータを生成し直して、別コースを走り始めるようにもしてみた。

フレームレートや仮想画面解像度を、.iniファイルから読み込んで設定するようにした。別PCで動かした際、処理落ちしないフレームレートや仮想画面解像度を探して設定し直さないといけなくなるだろうし…。.ini をメモ帳か何かで編集すれば、起動時のデフォルト値を変更できるようになったから、これで最低限のカスタマイズはできるだろう…。

そろそろある程度動くようになってきたので、ウインドウ表示ではなく、フルスクリーン表示をするように変更した。

コースデータの自動生成について :

コースデータと言うか、道路のセグメントデータは、以下の4つの値を並べていくことで生成される。
  • そのセグメントが何個続くかを示すカウント数
  • カーブ量(横方向の曲がり具合)
  • ピッチ量(縦方向の曲がり具合)
  • ビルボードの種類

また、乱数で急カーブが出現したら、そのカーブの直前に、カーブを示す道路標識のビルボードが出るようにもしておいた。

急カーブが出現すると、道路標識ビルボードを示すセグメントが増えるので、最初からセグメントデータの総数を決めておくわけにもいかなくて…。一旦セグメントデータを作ってみてから、全部でいくつになりました、と把握して、その個数分、新たに配列を作ってコピーし直す、という処理になった。そのあたりは、 _昨日の記事にメモ しておいた。

iniファイルの読み込み :

HSPでiniファイルの読み込みをするあたりは、以前使ったソースからコピペして対応。

_mieki256's diary - HSPでiniファイルの読み込み

フルスクリーン表示 :

HSPでフルスクリーン表示をするにはどうしたらいいのかググってみたけど、どうやら bgscr を使うのが一般的なようだなと…。

_OHDL - bgscr

この bgscr を使うと「枠無し」のウインドウを作れる。また、HSPが既に作ったウインドウを「枠無し」で再設定することもできるので、その「枠無し」ウインドウのサイズをデスクトップサイズと同じにすればフルスクリーン表示になるよね、ということらしい。

デスクトップサイズは、ginfo_dispx, ginfo_dispy で取得できる。

_OHDL - ginfo_dispx
_OHDL - ginfo_dispy

HSPは起動時に、ウインドウID=0のウインドウを生成するので、bgscr でウインドウID=0に対してサイズや表示位置を指定すればフルスクリーン表示になる。ということで、ソースの該当部分は以下のようになった。

    if FULLSCR_ENABLE {
        ; fullscreen
        screen_w = ginfo_dispx
        screen_h = ginfo_dispy
        bgscr 0, screen_w, screen_h, , 0, 0
        gsel 0
        cls 4
    } else {
        ; windows display
        ; get windows size
        screen 0, SCR_W, SCR_H, 0
        gsel 0
        screen_w = ginfo_winx
        screen_h = ginfo_winy
        cls 4
    }

ソース :

現状のソースは以下。

_road11.hsp
_road11.ini
_trees.png
_bg_2560x1440.jpg

2023/10/23(月) [n年前の日記]

#1 [hsp] HSPのnoteselについて勉強中

今まで書いてたテストサンプルをそろそろスクリーンセーバにしたい。そのためには、設定値をiniファイルから読んだり、設定画面で変更した値をiniファイルに保存しないといけない。そこで、HSP3.6を使ってiniファイルを ―― テキストファイルの類を読み書きする方法について調べているところ。

HSP 3.6 でテキストファイルの読み書きをするなら、notesel, noteadd, notesave, noteload を使うのが一般的らしいのだけど。

_OHDL - notesel
_OHDL - noteadd
_OHDL - notesave
_OHDL - noteload
_HSP3.0-メモリノートパッド命令
_note〜命令 (テキストファイルを扱うメモリノートパッド) - Let's HSP!
_noteselの初期化について - HSPTV!掲示板

notesel に指定する変数の種類がよく分からなくて…。文字列変数でいいのかなと指定してみたらエラーが出たので、文字列配列にしたら上手く行ったのだけど、しかし巷の解説記事を眺めたらやはり文字列変数でOKらしくて、おかしいな、変だなと…。

どうやら noteadd を呼ぶあたりで何か間違った記述をしていただけらしい。最低限の処理だけ別ソースで書いて動作確認してみたら、notesel に指定する変数は文字列変数で問題無かった。

2023/10/24追記 :

せっかくだから、notesel, noteload, notesave を使った動作確認用のサンプルも置いておく。.ini ファイルを noteload で読み込んで、変数の値を取得して、また .ini に notesave で書き戻す処理をしている。

_notesel_test.hsp
; notesel, noteload, notesave のテスト
; .ini を読んで、値を少し変えて、また .ini に書き戻してみる

; #uselib "kernel32"
; #func GetModuleFileName "GetModuleFileNameA" int, int, int

#define INI_FILE    "notesel_test.ini"
#packopt name       "notesel_test"  ; exe filename
#packopt type       0               ; generate ".exe"

; ----------------------------------------
; load ini file

ini_filepath = INI_FILE
mes "Load " + ini_filepath + "\n"

buf = ""
notesel buf

exist ini_filepath      ; ファイル存在チェック
if strsize = -1 {
    ; not found ini file
    dialog "Not found " + ini_filepath, 0
    end
} else {
    ; iniファイルを読み込む
    noteload ini_filepath
    mes buf

    ; 1行ずつ内容を解析して記録
    sdim ld, 512
    repeat notemax
        noteget ld, cnt     ; 1行分を取得
        
        if instr(ld, 0, "test1=") >= 0 {
            split ld, "=", kind, cmd
            test1 = int(cmd)
        }
        if instr(ld, 0, "test2=") >= 0 {
            split ld, "=", kind, cmd
            test2 = int(cmd)
        }
    loop
}

noteunsel

mes "test1=" + test1
mes "test2=" + test2

; ----------------------------------------
; change value

wait 100

test1 += 1
test2 += 1

mes "\nAdd +1"
mes "test1=" + test1
mes "test2=" + test2

wait 100

; ----------------------------------------
; save ini file

buf = ""
notesel buf
noteadd "test1=" + test1
noteadd "test2=" + test2
notesave ini_filepath

dialog "Save " + ini_filepath, 0
mes "\nSave " + ini_filepath

wait 200
end

_notesel_test.ini
test1=17
test2=25

#2 [movie] 「ゴジラvsデストロイア」を視聴

昨日視聴したことをメモするのを忘れてたのでメモ。BS12で放送されていたものを視聴。初見。1995年の映画で、平成ガメラ2作目と同じ年の作品らしい。

なんというか、着ぐるみとミニチュア(=スタジオ内撮影)の限界を見てしまった気がした。あのデザインは…無いわ…。ゴジラにエリマキ、じゃなくて翼くっつけてイガイガトゲトゲ増やしただけじゃん、みたいな印象。着ぐるみで動かすことが前提となるとああいうシルエットにするしかないのだろうかと邪推してしまったりして。ラドンの翼の大きさ、モスラの羽の大きさを考えたら、あのデザインで空を飛ぶのはちょっとなあ…。まあ、過去にはゴジラが空を飛んでるから今更そんなの気にしても状態だったのかもしれんけど。

「メカゴジラの逆襲」の次に「ビオランテ」を見た時は、特撮のレベルが上がってるなと思ってしまったけれど、「デストロイア」を見て、アレ? また下がった? と思ってしまった…。日本の特撮って、実は作り方が大体ずっと同じで、大して進歩してなかったのだろうか…。一気に変わるのはCG導入が進んでからなのかな…。

CGと言えば、「ビオランテ」と違って、ビットマップと言うかラスタースキャンで表現したCGカットがたくさん出てきて、そこは着実に進歩してたんだなと。ググってみたら、この映画の3年後の1998年に、ハリウッド版ゴジラ(GODZILLA)が公開されていたらしい。たった3年でそこまで行くか…。

Wikipediaを眺めてたら、赤く光るゴジラを実現するために860個も電球を使ったと書いてあって驚愕。各種ギミックのせいで中の人が4回も酸欠で卒倒したとか…。無茶をする…。

_ゴジラvsデストロイア - Wikipedia
_デストロイア - Wikipedia

特技監督の川北監督は、当初デストロイア相当をCGか操演で動かすことを望んでいたけど着ぐるみにすることを命令されて、という話も気になった。やはり着ぐるみでは限界があると現場の監督さん自身も熟知してたのだろうな…。部分的にCGを使ってるカットもあると書いてあるし、色々と変わり始めていた時期だったのだろうか。

2023/10/24(火) [n年前の日記]

#1 [windows] Windows10のフォント種類が少なくなっていた

Windows上で標準で入ってるフォント種類について調べていたら、今頃になって気が付いた。Windows XPの頃には標準で入っていたフォントのいくつかが、Windows10では入ってない…。これはどういうことだ…。何かの拍子に消えてしまったのか…?

ググってみたら理由が分かった。Windows10は、基本的に英語用のフォントしかインストールしないことになっていて、それ以外の言語のフォントは、標準ではインストールされない仕様に変わっていたのだな…。

_Windows10にWindows定番の外国語フォントがない? - InDesignerの悪あがき
_Windows クライアントにアップグレードした後、不足しているフォントをインストールする方法 - Windows Deployment | Microsoft Learn
アラビア語スクリプト補助フォント: Aldhabi, Andalus, Arabic Typesetting, Microsoft Uighur, Sakkal Majalla, Simplified Arabic, Traditional Arabic, Urdu Typesetting
Bangla スクリプト補助フォント: Shonar Bangla, Vrinda
カナダ先住民の音節補足フォント: Euphemia
チェロキー補助フォント: Plantagenet Cherokee
中国語 (簡体字) 補助フォント: DengXian, FangSong, KaiTi, SimHei
中国語 (繁体字) 補助フォント: DFKai-SB, MingLiU, MingLiU_HKSCS, PMingLiU
Devanagari 補助フォント: Aparajita, Kokila, Mangal, Sanskrit Text, Utsaah
Ethiopic 補助フォント: Nyala
グジャラート語補足フォント: Shruti
Gurmukhi 補助フォント: Raavi
ヘブライ語補助フォント: Aharoni Bold, David, FrankRuehl, Gisha, Levanim MT, Miriam, Miriam Fixed, Narkism, Rod
日本語補助フォント: Meiryo, Meiryo UI, MS Gothic, MS PGothic, MS UI Gothic, MS Mincho, MS PMincho, Yu Mincho
カンナダ補助フォント: Tunga
クメール語補足フォント: DaunPenh, Khmer UI, MoolBoran
韓国語補助フォント: Batang, BatangChe, Dotum, DotumChe, Gulim, GulimChe, Gungsuh, GungsuhChe
ラオス補足フォント: DokChampa, Lao UI
マラヤーラム語補足フォント: Karthika
Odia 補助フォント: Kalinga
Pan-European補助フォント: Arial Nova, Georgia Pro, Gill Sans Nova, Neue Haas Grotesk, Rockwell Nova, Verdana Pro
シンハラ語補足フォント: Iskoola Pota
シリア語補足フォント: Estrangelo Edessa
Tamil 補助フォント: Latha, Vijaya
Telugu 補助フォント: Gautami, Vani
タイ語補足フォント: Angsana New, AngsanaUPC, Browallia New, BrowalliaUPC, Cordia New, CordiaUPC, DilleniaUPC, EucrosiaUPC, FreesiaUPC, IrisUPC, JasmineUPC, KodchiangUPC, Leelawadee, LilyUPC

Windows クライアントにアップグレードした後、不足しているフォントをインストールする方法 - Windows Deployment | Microsoft Learn より


「ここに列挙されているフォントは標準でインストールされてないから必要になったら追加でインストールせよ」と書いてあった。

まあ、以下のフォントは標準で入っているようだから、何かしらのアプリを作る際は、そのあたりを指定しておけばいいか…。

#2 [hsp] HSPでスクリーンセーバを作る方法を再勉強

HSP 3.6を使ってスクリーンセーバを作る方法について再勉強中。

HSPに同梱されているサンプルの中に、sample\ssaver\arusave.hsp があって、コレがスクリーンセーバのサンプルになっている。

_OHDL - arusave.hsp

コメントもたくさん書いてあるので、とても参考になる。ありがたや。

ただ、以前作った時の体験では、プレビュー処理は要注意で…。

ソース内のコメントでは、「プレビュー内でも実際のスクリーンセーバ処理を書いたほうが良いでしょう」とされているけれど。実際そのように作ったら、プレビュー画面が閉じられたり、設定画面を呼び出すたびに、Windowsのイベントビューアにエラーが残る、動作が怪しいスクリーンセーバになってしまって…。 *1 故に、サンプルと同様、文字か画像を表示した直後、stop する処理にしておいたほうが無難だろうなと。

ちなみに、プレビュー処理の最後を stop ではなく end にしたら、プレビュー画面に何も表示されないスクリーンセーバになってしまった。stop にするとスクリーンセーバの設定ウインドウが閉じられるまでプロセスが残り続けるのだけど、あえてそうしないと期待した動作にならないようだなと…。別の言語でスクリーンセーバを書いた時も、与えられたプレビュー用のウインドウハンドルに対して、一定時間は描画し続けないと反映されなかったりしたので、1回描画してすぐ終了、といった感じでは正しく表示されないのかもしれない。

HSP 3.7βになったら、HSPエディタからスクリーンセーバを生成するためのメニュー項目(ツール → レガシーツール → スクリーンセーバ作成)が無くなるらしい。その場合、ソース内に #packopt type 2 を記述しておくことで、実行ファイル生成時に .scr を生成できるという話を見かけた。

_HSP3.7bata でスクリーンセーバー作成 - HSPTV!掲示板
*1: もしかすると、プレビュー画面の処理内で、ウインドウの初期化処理等をしている可能性がありそう。その手のウインドウ初期化処理をしてしまうと、プロセスが残り続ける・溜まり続けるという不具合報告も見かけたし…。

2023/10/25(水) [n年前の日記]

#1 [hsp] 疑似3D道路その26。スクリーンセーバを作った

ここのところ、HSPを使って疑似3D道路のプログラムを作っていたけのだけど。

_TAG:HSP - 2023

ようやくスクリーンセーバっぽい感じで動かせたので、github にアップロードしてみた。

_mieki256/p3drdscr: pseudo 3D road screensaver on Windows.

せっかくだから、OBS Studio 29.1.3 で画面をキャプチャして、Youtube にアップロード。大体こんな感じのスクリーンセーバです。




昔から謎だった疑似3D道路の処理をそれらしく書けたので、やっとようやく宿題を終えた気分。もっとも、「今時スクリーンセーバ、しかも、疑似3d道路って、お前…」と言われそうな気も…。仕方ないじゃん…。「ゆるキャン2」のOP映像の1カットを目にして「こういう感じのスクリーンセーバがあったら面白いのでは」とつい妄想していたらなんだか作りたくなってしまったので…。でも、結果的に全然似てないソレになっちゃったな…。いや、似てたら逆にマズいか…。

処理速度について :

このプログラムは、仮想画面解像度とフレームレートを変更できるようにしてあるので、動かしているPCのスペックに合わせて、処理落ちしないイイ感じの設定値を探してくれれば、と思っているわけだけど。

手元のメインPCとサブPCで動かしてみたところ、安定して動く仮想画面解像度とフレームレートは以下のような結果になった。
  • AMD Ryzen 5 5600X (3.7 - 4.6GHz, 6C/12T, 65W) : 1280x720,30FPS or 1920x1080,20FPS, zoom=2
  • AMD Athlon 5350 (2.0GHz, 4C, 25W) : 480x270, 15FPS, zoom=2

拡大縮小描画処理をおそらくはCPUのみで処理しているせいか、CPUパワーがモロに関係してくるようで…。省電力重視のCPUでは、QVGA+α の解像度にしても15FPSしか出ないのは、ちょっと参ったなと…。まあ、非力なCPUですら今時はここまでの描画ができるのね、という驚きもあるけれど。いや。今時のCPUではないよな。Windows11にはアップグレードできないぐらい古いCPUだし…。

課題 :

一応ここまでは作ってみたものの、いくつか課題が残ってるなと…。

課題その1。遠景の上下スクロールが不自然。もっと自然な感じに見せるにはどういう処理を書いたらいいのやら。道路データ(セグメントデータ)の1つ1つが、1つ前のセグメントよりどれだけ上下にずれるか、という値を持っているので、その値を上手く使えばそれっぽくなるのではないか、とは思うのだけど…。

課題その2。車の挙動が変。カーブに差し掛かっているのに速度を上げていくのはいかがなものか。そこはゆっくり速度を落としながら走るものでは…。カーブの有無を判別して、速度を変更する処理を考えるのが面倒臭くて、こんなありえない動きに…。

課題その3。拡大描画時のプルプルが気になる。gzoom + gcopy を使って描画する時はまだマシだけど、grotate や gsquare を使って描画するとプルプルプルプルと震える…。grotate や gsquare は、処理が速い代わりに精度は粗いとの話なので、トレードオフではあるのだろうけど。でも、自分の書いた処理/計算の仕方が間違ってるのではないかという気も…。

課題その4。車のビルボード感が強過ぎ。本来なら、道路に沿って車体の向きが変わったり、カーブに入ったらスクーターの角度が変わってくれないと…。でも、画像を作るのが面倒臭い。やるとしたら3Dモデルを作ってレンダリングして角度の違う画像を何パターンか作ることになるのだろうけど、想像しただけでもシンドイ。

課題その5。何より、処理が重い。重過ぎる。CPUのみで描画処理をしないで、DirectX や OpenGL を使えれば、このくらいの描画なら軽々とこなせるのではないかと想像するのだけど、HSP でスクリーンセーバを作る際に DirectX や OpenGL が使えるのかどうかが分からなくて…。どこかにサンプルは無いものかとググってみたけど、そもそも今時スクリーンセーバを作ろうとする人なんて居ないわけで、そんなサンプルがあるはずも無く。

参考ページ :

github の README.md にも載せておいたけど、以下のページが大変参考になりました。ありがたや。

_Creating a pseudo 3D racer
_Creating a pseudo 3D racer - part 2
_Creating a pseudo 3D racer - part 3
_How to build a racing game | Code inComplete
_How to build a racing game - straight roads | Code inComplete
_How to build a racing game - curves | Code inComplete
_How to build a racing game - hills | Code inComplete
_How to build a racing game - conclusion | Code inComplete
_Javascript Racer - v4 (final)
_Lou's Pseudo 3d Page
_疑似3Dに関するメモ - サイバーグノーシス

特に、PICO-8 を使ったチュートリアル記事がめちゃくちゃ分かり易くてグッドでした。マジありがたや。最初のあたりにある、カーブしていくセグメントデータを上から見た図、を出力するサンプル(Pseudo 3D racer tutorial 1)に目ウロコ。「そういうことか! カーブの表現ってそれだけで良かったのか!」と…。更に、まずはセグメントだけを透視変換して、線のみを表示して仕組みを考えていくあたりもグッドだなと。塗り潰しは後にして、まずは骨だけにして考えてみよう。みたいな。分かりやすい…。

#2 [hsp] HSPのバージョンを間違えていた

ここ最近、 HSPでスクリーンセーバを作れないか実験していたわけだけど。

ここに来て、結構重大な勘違いをしていたことに気づいた。この日記には「HSP 3.6 で」とメモしていたけど、それは間違いだった。ずっと HSP 3.7beta で動作確認していました…。申し訳ない…。

バージョンを間違えていた :

HSPエディタ(hsed3.exe)のバージョン毎の違いを確認していたところ、自分が普段利用しているHSPエディタには、本来あるはずのメニュー項目が無いことに気づいて、そこでようやく気が付いた。

今まで使っていたのは HSP 3.6 ではなく、HSP 3.7beta のHSPエディタだった…。

あふというファイラーに、3.7beta版のHSPエディタのパスを登録したことを忘れていて、そこからずっと変更していなかったので、HSP 3.6 を使っているものとすっかり思い込んでいた…。自分、もうダメだ。

HSP3.6のエディタでファイルが開けない :

これまで書いていたソースを HSP 3.6 のHSPエディタで開こうとしたら、そもそも開けない…。開こうとすると HSPエディタが落ちる…。ナニソレ怖い。自分は一体どんな奇怪なソースを書いてしまったのか。

これが、テキストエディタ Mery と、HSP 3.7beta のHSPエディタなら、すんなり開けるのだけど…。

しかし、幸い、HSPエディタの設定が保存されている custom.ini を削除したところ、ソースが開けるようになった。おそらく何かの拍子に変な値が設定されてしまって、異常動作する状態になったのだろう…。たぶん。

今後また HSPエディタの動作がおかしくなったら、custom.ini を削除して設定を初期化してみるべし。とメモ。

生成した実行ファイルがエラーを出す :

HSP 3.6 のHSPエディタでファイルを開いてexe実行ファイルを作ってみたところ、これが動かない…。「内部エラー13が発生」と出てくる…。

ググってみたら、picload で画像を開けなかった時に「内部エラー13」が発生するらしい。

_HSPエラーと対処 - 内部エラー13「画像ファイルがありません」

何故今回画像が開けなかったかというと、生成される実行ファイルに画像ファイル等を同梱する、PACKFILE機能の制限に引っ掛かっていた。同梱するファイルのファイル名は、11文字以内(拡張子も含めたら15文字以内)でなければならない、という罠を踏んでいた。画像ファイル名を短くしたら件のエラーは出ない状態になった。

つまり、今までこのWeb日記にアップロードしていたファイルは、HSP3.6 で動かそうとしても動かない状態になっていた。いやまあ、HSPエディタで開いて、F5キーで動作確認する分には動くのだけど…。実行ファイルを作成すると、そちらは動かないという…。

それにしても、HSP 3.7beta では何故エラーが出なかったのか。そのあたりの文字数制限が緩和されたのかな。しかし、doclib/history.txt を眺めても、それらしい記述が無いのだよな…。

何にせよ、同梱ファイルのファイル名は、昔の MS-DOS並の 8.3形式にしておいたほうが良さそう。数日後には忘れてしまいそうな予感もあるけれど…。

_8.3形式 - Wikipedia

余談。サポートしている画像について :

画像を読み込む picload について解説してるページを眺めていたら、「pngは対応してないよ」と書いてあって…。ありゃ。自分、png を読み込ませちゃってるよ…。でも開けてるよ…。なんで?

HSP 3.6の doclib/history.txt を確認したところ、HSP 3.31β1 の時点で機能追加されてたらしい。
2012/06/14 3.31β1
...
読み込み可能な画像フォーマットにPNG、TGA、PSD形式を追加

HSP 3.6 の Docs Library にも対応形式が書いてあった。

_OHDL - picload

良かった。PNGだけではなく、TGA や PSD にも対応してたのだな。安心して png を読み込ませることができそう。

#3 [hsp] HSPで生成したプログラムのアイコンを変えてみたかった

せっかくだから、HSPで生成した .exe や .scr のアイコンを変更してみたいと思い立った。環境は Windows10 x64 22H2。

HSP 3.6 や HSP 3.7beta では、ソース内で以下の記述をしておくことでアイコンを変更できるらしい。
#packopt icon "icon.ico"

しかし、上手く行かない…。

アイコンファイル作成 :

とりあえず、アイコンファイル(.ico)を作成。今回は、ToYcon 0.9 を使って、256x256、32bitカラーの1枚の画像からアイコンを作ってみた。

_ToYcon のダウンロードと使い方 - k本的に無料ソフト・フリーソフト

アイコンの種類は WindowsXPタイプにしてみた。32bit, 8bit, 4bitカラー で、48x48, 32x32, 16x16 のサイズを内包。全部で9個のアイコン画像が入ってるマルチアイコンファイル。

生成された .ico を、IcoFX Portable 1.6.4 Rev 3 で開いて確認してみたけれど、それらしいファイルになっているように見えた。

_IcoFX Portable (icon editor) | PortableApps.com

アイコンの変更ができない :

HSP 3.7beta、及び、HSP 3.6 のHSPエディタで目的のファイルを開いて、以下を記述してから Ctrl + F9 で実行ファイルを生成してみたのだけど、ダメだった…。

#packopt icon "icon.ico"

HSPバージョン生成ファイル結果
HSP 3.7beta7.exe生成Failure. ファイルは生成されるがアイコンは変わってない
HSP 3.7beta7.scr生成Failure. ファイルは生成されるがアイコンは変わってない
HSP 3.6.exe生成Success. ファイルも生成できて、アイコンも変わった
HSP 3.6.scr生成Failure. 途中でエラーが出る

アイコンが変更できた場合も、エクスプローラ上で見るとアイコンが変わってるようには見えない。ただ、Resource Hacker 5.1.8 を使って .exe の状態を確認すると、たしかに Icon Group が変わっていることが確認できた。

エラーが出る時は、DOS窓が開いて以下が表示された。
iconins.exe v1.00
Basic program has been created by Kpan.
Modified by inovia.

[ERROR] No.10
実行ファイルが見つかりません
Enterキーを押してください

iconinsについて :

HSP が #packopt の指定でアイコンを変更する場合、HSP に同梱されている iconins.exe というツールを使ってアイコンを変更しているらしい。

ただ、この iconins.exe を呼び出す別のプログラムが、実行ファイル名を "〜.exe" に決め打ちして iconins.exe を呼んでいるそうで…。故に、.exe を生成した場合はアイコン変更ができるけど、.scr を生成した場合はアイコン変更できない、という話を見かけた。

_HSP3.7bata でスクリーンセーバー作成 - HSPTV!掲示板

別途 iconins.exe を呼び出すことでアイコン変更できる時もあるらしい。何のオプションもつけずに iconins を実行すると以下のヘルプが表示される。
> iconins
iconins.exe v1.00
Basic program has been created by Kpan.
Modified by inovia.

使用法:
iconins -e"実行ファイルパス" -i"アイコンファイルパス" -v"バージョンファイルパス" -l"言語ID(オプション)" -u"UPX(オプション)" -m
"manifest(オプション)"

実行ファイルのパスや、アイコンファイルのパスは、絶対パス(C:\hoge\fuga\piyo.exe)じゃないとダメらしい。ファイル名のみ(piyo.exe)だけを指定してもエラーが出て動かなかった。

HSP 3.6 で生成した .exe や .scr は、後から別途 iconins.exe を呼び出すことでアイコン変更ができたけど。HSP 3.7beta で生成した .exe, .scr には反映されなかった。何故。

Let's HSPIC! を試してみた :

iconins.exe を使うことで上手く行かないなら、別のツールを使ったら上手くいくのだろうか? ググったところ、Let's HSPIC! なるツールがあるらしい。試用してみた。

_HSP補助ツール - Let's HSP!

lhspic10.zip を入手。バージョンは 1.0。解凍して任意のフォルダに置いた。

動作には Resource Hacker 3.4.0 日本語版 (rh_japanese.zip) が必要らしい。Internet Archive を探して入手。

_Resource Hacker (WebArchive)

zip を解凍して、これも任意の場所に置いた。

Let's HSPIC! (lhspic.exe) を起動して、ウインドウを右クリック。リソースエディタのパス、を選んで、ResHacker.exe を指定。

.exe と .ico をそれぞれウインドウの入力欄にドラッグアンドドロップすれば、入力ファイルとして指定できる。その状態で「Change!」ボタンをクリックすれば反映されるはず。

だったのだけど。「無効なファイルです。(1)」とエラーダイアログが表示されて、処理されなかった。

更に、Let's HSPIC! を閉じようとすると、Microsoft Visual C++ Runtime Library がエラーを出す。2009年頃のソフトのせいか、現状では動作に問題があるということだろうか…。

_Let's HSPIC! 追加インフォメーション

上記ページによると、hsp3mt.hrt を使用しているファイルに対してはエラーが出るそうで。hsp3mt.hrt はHSPをマルチスレッド対応にするためのファイルらしいけど、たしか HSP 3.6 や HSP 3.7beta では標準でマルチスレッドが有効になっている、という話を見かけた気がする…。

_HSP3.6 新機能ハイライト
また、これに伴って、HSP3.51まで用意されていたマルチスレッド版ランタイム(hsp3mt)の同梱を終了しました。 hsp3mtを使用していたユーザーは、引き続き標準のHSP3ランタイムをご使用ください。

HSP3.6 新機能ハイライト より


HSPの現行バージョンはランタイムが以前と変わってしまったので、Let's HSPIC! は使えない、ということかもしれないなと…。

2023/10/26追記 :

その後も実験していたら、HDP 3.7beta7 の場合も、後から iconins.exe を呼ぶことでアイコン変更できていることが分かった。

エクスプローラ上で見るとアイコンが変わってないので反映されていないものと思い込んでしまったけれど、Resource Hacker で exe や scr を開いてみると、Icon Group の項目内で、ちゃんとマルチアイコンが登録されていた。

また、作業ディレクトリ内の exe や scr をデスクトップにコピーしてみたところ、デスクトップ上ではちゃんとアイコンが変わった状態で表示された。

しかし、ソース内に #packopt icon "icon.ico" と書いてしまうと、HSP 3.6利用時に、スクリーンセーバとして scr を生成した際にエラーが出てしまう。そこで、iconin.exe を呼び出すbatファイルを書いて、exe や scr ができた後、手動でbatファイルを実行してアイコン変更するようにしてみた。

changeicon.bat
@rem @set ICONINSPATH=C:\Prog\hsp36\iconins.exe
@set ICONINSPATH=C:\Prog\hsp37beta\iconins.exe
@set CURDIR=%~dp0
%ICONINSPATH% -e"%CURDIR%p3drdscr.exe" -i"%CURDIR%icon.ico"
%ICONINSPATH% -e"%CURDIR%p3drdscr.scr" -i"%CURDIR%icon.ico"

現状では、このやり方が一番問題が少なそうな気もする。いやまあ、batファイル内の iconins.exe のパスを環境毎に変更しないといけない面倒臭さはあるのだけど…。

2023/10/26(木) [n年前の日記]

#1 [gimp] GIMPを使ってWindows用のマルチアイコンファイルを作ってみたい

GIMPを使って、Windows用のマルチアイコンファイルを作ってみたい。環境は、Windows10 x64 22H2 + GIMP 2.10.34 Portable。

マルチアイコンファイルというのは、1つの .ico ファイルの中に、複数のサイズ、複数のカラーモードのアイコンが入っているアイコンファイルのこと。

Windowsの場合、一般的には…。 このサイズ/カラーモードのアイコンを含める場合が多いらしい。かつ、Windows Vista 以降は、256x256, 32bitカラーの画像を含めることもできるそうで。つまり、9種類+1種類、計10種類のアイコンが、1つの icoファイルに入っているとイイ感じ。らしい。たぶん。

専用のスクリプトを導入 :

GIMPでそんな作業はできるのかなと調べてみたら、1枚の画像を元にして自動で縮小してマルチアイコンファイル用の画像を作ってくれる Script-Fu もあると知った。iconify2_1.scm というのがソレ。

_registry.gimp.org_static/registry.gimp.org/files/iconify2_1.scm at master - pixlsus/registry.gimp.org_static

上記ページの「Raw」と書かれたリンクを右クリックして保存すれば入手できる。

導入すると、Script-Fu → Utils → Iconify という項目が増える。

何か1枚画像を用意して、このスクリプトを実行すれば、自動で縮小して、16x16, 32x32, 48x48 のサイズになったレイヤーを作成してくれる。また、256色、16色(15色) に減色したレイヤーも作ってくれる。

ただ、処理をする前に、AutoCrop (内容で切り抜き) も実行してしまうので、元画像の周辺から必要な部分まで勝手に削除されてしまう時がある。61行目近辺の、plug-in-autocrop-layer と書かれた行をコメントアウトしておいたほうがいいと思う。

; Autocrop the layer
(plug-in-autocrop-layer 1 new-img work-layer)

↓

; Autocrop the layer
; (plug-in-autocrop-layer 1 new-img work-layer)

試してみる :

まずは 256x256、32bitカラーの画像を用意する。

gimp_iconify_ss01.png


Script-Fu → Utils → Iconify を選択して実行。

gimp_iconify_ss02.png


画像サイズが異なっているレイヤーが複数作られた。48x48, 32x32, 16x16 のサイズで、32bitカラー, 8bitカラー(256色), 4bitカラー(15色) が作られている。

gimp_iconify_ss03.png


icoファイルとして保存する。ファイル → 名前をつけてエクスポート。

gimp_iconify_ss04.png


ファイル名の拡張子を「.ico」にしてエクスポート。

gimp_iconify_ss05.png


icoファイルに同梱したいサイズ/カラーモードを選択して保存できるので、これでマルチアイコンファイルが作れる。

gimp_iconify_ss06.png

実は使わないほうがいい :

ここまで書いておいてなんだけど。実は、GIMP を使ってマルチアイコンファイルを保存するのはおススメしない…。

というのも、おそらくは GIMP の減色処理の品質が悪くて、縮小して作られた画像のうち、減色された画像群の結果が妙なことになってたりするので…。以下のスクリーンショットを見れば、なんとなく分かるだろうか…。

gimp_iconify_ss08.png

ところどころに謎の透明なドットが入ってしまっている。どうしてこんなことになるのやら。

オススメのツール :

GIMP を使ってマルチアイコンファイルを作ると、前述のようにちょっとよろしくない結果の画像が作られてしまうので、アイコン作成に特化したツールを使ったほうがいいだろうなと。Windows用なら以下のツールが個人的にはオススメ。

_IcoFX Portable (icon editor) | PortableApps.com

_「Greenfish Icon Editor Pro」多機能なアイコン・カーソル作成ソフト - 窓の杜
_Greenfish Icon Editor Pro 4.2 - Official Website

どちらも、1枚の画像(256x256, 32bitカラー)から、自動でマルチアイコンファイルを作れるし、GIMP のようにおかしなドットが入ってしまうこともない。

  • IcoFX Portable の場合、ウインドウ内に元画像をドラッグアンドドロップで読み込ませてから、アイコン → イメージからWindowsアイコンを作成、を選ぶ。
  • Greenfish Icon Editor Pro の場合、256x256, 32bitカラーの画像を1枚描いてから、アイコン → イメージからWindows用のアイコンを作成、を選ぶ。
後は、作りたいアイコンサイズ/カラーを選べば自動生成ができる。

あるいは以下のまとめが参考になりそう。

_おすすめのアイコン作成ソフト - k本的に無料ソフト・フリーソフト

ToYcon を試用してみたけれど、そちらもイイ感じだった。ただ、4bitカラー(16色)のアイコンが、Windowsのアイコン仕様に合ってない気も…。たしか4bitカラー利用時は、使える色が決め打ちされていたはず。

_MICROSOFT VGA Palette

ToYcon で4bitカラーのアイコンを作らせると、見た目は奇麗だけど独自のパレット色になってしまっていたので、実際には4bitカラーモードで使えないアイコンファイルが作られてしまっている可能性が高そう。もっとも、今時そんなカラーモードでWindowsを使う場面は無さそうだし、実用上は問題無いのかもしれない。

#2 [hsp] mp3しかサポートしてないゲーム制作ライブラリはよろしくない

HSP の hsp3dish のドキュメントを眺めていたら、サウンド再生については「wav と mp3 のみ対応」と書いてあって、「いやー、それはよろしくないなあ…」と思ってしまった。

wav と ogg にしか対応してないというなら全然分かる。でも、mp3 は良くない。

もっとも、そのあたり調べてみたら…。 そういった状況らしいので、なんだかホッとしたわけですが。まあ、それが妥当だよなあ…。

_HSP3備忘録
_oggファイルの読み込み - HSPTV!掲示板
_HSP3.7 新機能ハイライト

mp3は良くない :

せっかくだから、mp3が良くない理由もメモ。と言っても、mp3はギャップレス再生が難しいという、ただそれだけの話なのだけど。

mp3 って、元々は映像の音声部分を担当させるために作られた規格/音声フォーマットなので、映像のフレーム単位で時間情報が記録されているそうで。音声の長さがフレーム単位でキリのいい長さになってない場合、最初や最後にギャップ(無音部分)が入ってしまうので、ループ再生したり、再生終了と同時に別のmp3を再生したりすると、境目で「ブツッ」とノイズが入る。規格からしてそうなってるので仕方ない話なのだけど、ループしたり、曲が切り替わるたびに「ブツッ」とノイズが入ったら…ねえ…。かなり萎えますわな…。

だから、ゲーム制作ライブラリの類で「圧縮音声フォーマットはmp3のみ対応」なんて言われちゃうと困ってしまう。ギャップレス再生ができないファイル形式しか使えませんとかなんだソレ、どんな糞仕様だよ、という話に…。

その点、ogg なら、最初からちゃんと音声フォーマットとして規格が作られているので、サンプル数もちゃんと記録されてるし、再生処理がしっかり作ってあるならギャップレス再生だってできるわけで。

と言っても、Ruby + Gosu のようにoggすらちゃんとループ再生できない糞みたいなゲーム制作ライブラリも稀に存在するけれど…。アレは SDL が腐ってるんだろうか? まあ、Gosuの件は横に置いておくとして…。

そんなわけで、ogg はサポートしてるけど mp3 はサポートしてません、ということなら納得できるのだけど。逆はダメだよなと…。

mp3でギャップレス再生できる事例 :

ちなみに、さすがにこれだけ mp3 が普及してしまうと、ギャップレス再生できないのはさすがにあかんやろ、ということで解決策も出てきて…。

mp3に変換するエンコーダ側で本来の音声の長さを mp3ファイルのどこかに独自情報として埋め込んでおいて、対応してるデコーダ側はその情報を読み取ってギャップレス再生させる、といったことも可能だそうで。mp3エンコーダとしてメジャーな LAME はそういう情報を埋め込んであると聞いた記憶が…。mp3をギャップレス再生できるソフトウェアは、そういった一手間を加えた実装になってるわけで。

もっとも、どのエンコーダが、どういう情報を、どこに記録してるのかが分からなければ、デコーダ側だって対応のしようがないし。

あるいは、エンコーダとデコーダが一体になってるアプリなら、「このアプリを使った時だけギャップレス再生ができます。他は知らんがな」となっちゃうし。 *1

だから、「mp3の再生に対応」と言われても、「それってどこまで対応してるの?」と不安になってしまう。そんなわけで、個人的には mp3 って嫌いなのでした。いやまあ、昔、mp3をループ再生させることになって苦労したからなのだけど…。

まあ、ループ再生できないならできないで、その旨最初からどこかに書いてあれば、それはそれでOKかなとも思うのですが。

例えば昔のPCエンジンのCD-ROMゲームはCD-DAでBGMを流したりしていたけれど、当時は奇麗に繋がるループ再生なんてできなかったから、曲の最初と最後が全然繋がってないBGMを作って済ませてた。状況さえ分かってれば、そのように逃げ道(?)はあるので…。できそうな感じで期待させておいて実はできないというパターンが一番困る…。できないなら「できない」と書いておいてほしい…。

*1: 昔の Adobe Flash がそんな感じの実装だった。LAME でエンコードしたmp3を再生させるとギャップレス再生できないけれど、Flash自身にwavを渡してmp3に変換、かつ .swf に内包して再生させると、ちゃんとギャップレス再生ができた。「このアプリで全部やる分には、ソレってできますよ。え? 他のソフトが変換したmp3? そんなもん知るか」みたいな。もっとも、後に LAME でエンコードしたmp3もギャップレス再生できるようになった記憶もあるけれど。アレは Flashプラグイン側が対応したのか、それとも LAME側が対応したのか、どっちなんだろう。

2023/10/27(金) [n年前の日記]

#1 [nitijyou] 市の健康診断に行ってきた

須賀川市の健康診断に行ってきた。会場は須賀川市民スポーツ会館。釈迦堂川と阿武隈川の合流地点にある施設。電動アシスト自転車で行ってきた。受付時間は10:20-11:00だったので、10:20頃到着。ただ、とにかく待たされて…。色んなとところで待たされたけど、特にお医者さんの診察のところで40人ぐらい並んでて、そこで30分以上待たされた。終わったのは12:05頃。

体育館(?)の中が半分以上空いていたのに、待たせるための椅子が密集して配置されていて、かなりの密状態。コロナやインフルエンザが流行ってる時期なのに、関係者は危機意識が無さ過ぎなのでは…? 「扉を開けて換気してます」と案内文書に書いてあったけど、待ってる間にわざわざ密にしてしまったら意味が無いだろう…。一体何を考えているんだか…。いや、何も考えてないのか…。

#2 [nitijyou] 某所に行ってきた

詳細はGRPでメモ。

健康診断が終わったらそのまま行くと伝えていたけど、予想より時間がかかってしまったので、13:30-14:00頃に行く旨電話で連絡し直した。が、そろそろ出かけようと思ったら、雷に加えて結構激しい雨が降り始めて…。連絡しちゃったから、行かざるをえない。雨合羽を着て、電動アシスト自転車で行ってきた。自分の日頃の行いが悪いのかな…。

2023/10/28() [n年前の日記]

#1 [hsp] hsp3dishについて勉強中

HSP は色々な描画プラグインが同梱されているけれど、その中の hsp3dish が気になったので試用してみることにした。OpenGL か DirectX を使って描画するらしいので、高速に描画できるのではないかと期待。

環境は Windows10 x64 22H2 + HSP 3.7 beta7。

Hello Wrold :

まずは Hello World。

_01_hello_hsp3dish.hsp
    ; hsp3dish hello world

    #include "hsp3dish.as"          ; use hsp3dish

    #packopt name   "01_hello_hsp3dish"
    #packopt type   0
    
    #define KB_ESC      $00080
    
    ; set font
    font "Tahoma", 32, font_bold
    
*mainloop
    stick k, 0                      ; check keyboard
    if k & KB_ESC : goto *job_end   ; ESC key to exit
    
    redraw 0            ; draw start
    
    color 0, 100, 200
    boxf                ; clear screen
    
    ; draw text
    color 255, 255, 255
    pos 10, 10
    mes "Hello World"
    
    redraw 1            ; draw end. screen refresh.
    
    await (1000 / 60)   ; wait 1/60 sec
    ;await 12
    
    goto *mainloop
    
*job_end
    end

以下のような感じになった。

01_hello_hsp3dish_ss.png


  • hsp3dish を使う時は、最初のほうに #include "hsp3dish.as" を書く。
  • HSPの標準機能では複数の表示ウインドウを持つことが可能だけど、hsp3dish の利用時は、実際に表示できるウインドウとしてウインドウID 0 の1枚のみを持つ。らしい。
  • 描画を開始する前に redraw 0 を呼び、描画が終わったら redraw 1 を呼ぶ。そうすることでウインドウに描画内容が反映される。

画像を描画 :

画像を描画してみる。せっかくだから、ファンタジーコンソール TIC-80 起動時の初期サンプルと同様に、カーソルキーで画像を移動できるようにしてみた。

_02_hello_hsp3dish_with_image.hsp
    ; hsp3dish hello world. display image.

    #include "hsp3dish.as"  ; use hsp3dish
    
    #packopt name   "02_hello_hsp3dish_with_image"
    #packopt type 0 ; generate ".exe"

    #pack "chara.png"
    
    #define KB_ESC      $00080
    #define KB_LEFT     $00001
    #define KB_UP       $00002
    #define KB_RIGHT    $00004
    #define KB_DOWN     $00008
    #define KB_CURSOR   (KB_LEFT | KB_UP | KB_RIGHT | KB_DOWN)
    
    title "Hello world - hsp3dish"  ; set window title
    
    ; set window size
    ; hsp3dish は表示ウインドウとしてウインドウID 0しか使えない点に注意
    screen 0, 800, 600, 0
    
    ; load image
    #define IMGID   3
    celload "chara.png", IMGID
    celdiv IMGID, 16, 16, 8, 8  ; 16x16ドットで分割して管理。基準点は(8,8)に

    ; set font kind
    font "Tahoma", 24, 1

    ; get window size
    wdwx = ginfo_winx
    wdwy = ginfo_winy
    
    x = wdwx / 2
    y = wdwy / 2
    i = 0
    count = 0
    
; ----------------------------------------
*mainloop
    stick k, KB_CURSOR              ; check keyboard
    if k & KB_ESC : goto *job_end   ; ESC key to exit
    
    ; cursor key to move
    spd = 4
    if k & KB_LEFT  : x -= spd
    if k & KB_RIGHT : x += spd
    if k & KB_UP    : y -= spd
    if k & KB_DOWN  : y += spd
    
    redraw 0                ; draw start
    
    ; clear screen
    color 0, 100, 200
    boxf
    
    gfilter FILTER_NONE
    ; gfilter FILTER_LINEAR
    ; gfilter FILTER_LINEAR2

    ; draw image
    gmode gmode_rgb0, IMGW, IMGH
    pos x, y
    idx = (count / 15) & 1
    scale = 6.0
    angle = 0.0
    celput IMGID, idx, scale, scale, angle

    ; draw text
    color 255, 255, 255
    pos 10, 10
    mes "Hello World - hsp3dish, Push cursor key"
    
    redraw 1                ; draw end. screen refresh.
    
    await (1000 / 60)       ; wait 1/60 sec
    ;await 12
    
    count++
    goto *mainloop
    
*job_end
    end

使用画像は以下。

_chara.png


以下のような感じになった。

02_hello_hsp3dish_with_image_ss.gif


  • screen命令でウインドウサイズを変更できる。この機能については、HSP 3.6 から対応、とドキュメントに書いてあった。以前のバージョンでは別ファイルでウインドウサイズを指定して、そのサイズに固定しておかないといけなかったらしい。
  • screen命令等、ウインドウの初期化をする命令を呼ぶと、それまで読み込んでいた画像等は消滅するらしい。ウインドウの初期化が終わってから画像を読み込むこと。
  • 画像を読み込む命令として picload 等も使えるらしいけど、今回は celload を使ってみた。celload, celdiv, celput を使うと、読み込んだ画像を指定サイズで分割して、n番目の領域を拡大縮小回転しながら描画することができる。
  • celput は、等倍表示の時は gcopy、等倍表示ではない時は grotate 相当の描画をする命令なのだとか。

この時点で、ちょっと気づいたことがある。

問題その1。文字を描画するとゴミが出る。上記のスクリーンショットでは、「-」の右下に変なドットが出ている。

問題その2。画像の周囲に1ドットのゴミが出る。必ずいつでも出るわけではなく、拡大描画をした際に、拡大率によっては出たり出なかったりするらしい。

もしかすると、どちらの問題も、隣のドットまで拾ってきて描画しちゃってるのかもしれない。

_celputの拡大縮小回転表示 - HSP Dishでスマホのゲームを制作、販売してニート脱出を試みる
_hsp3dishのcelputで、表示倍率マイナス指定時に1ドットずれる - HSPTV!掲示板
_celputの動作について - HSPTV!掲示板
_hsp3dishにおけるgfilter 1での拡大時の輪郭のノイズ - HSPTV!掲示板

回避策としては…。あらかじめ画像側で、描画したい領域の周辺を1〜2ドットほど透明にしておく、とか。ただ、タイルBGのようにギッシリ詰まってる系の画像では、そういうことはできないよな…。

拡大縮小描画をしてみる :

せっかく celput で描画したので、拡大縮小描画を試してみる。

_celput_zoom.hsp
    ; hsp3dish + celput で拡大縮小描画を試す
    ;
    ; Windows10 x64 22H2 + HSP 3.7beta7

    ; 次の行をコメントアウトすれば hsp3dish を使わずに描画
    #define HSP3DISH_ENABLE
    
#ifdef HSP3DISH_ENABLE
    #include "hsp3dish.as"
#endif

    #packopt name "celput_zoom"
    #packopt type 0
    #packopt xsize 1024
    #packopt ysize 768
    
    #define TEX_FILE    "texa.png"
    #pack   TEX_FILE
    
    #define KB_ESC  $000080
    
    ; init window ID 0
    screen 0, 1024, 768, 0
    title "cellput zoom test - hsp3dish"
    
    wdw_w = ginfo_winx
    wdw_h = ginfo_winy

    ; load image
    imgid = 3
    celload TEX_FILE, imgid

    ; 512x512 で画像を分割。基準点は(256, 512)
    celdiv imgid, 512, 512, 256, 512

    ; 描画先を指定。ウインドウID=0 を指定
    gsel 0, 1

#ifdef HSP3DISH_ENABLE
    ; redraw 0 を呼んだ時の画面クリア設定
    ; 0 or 1, 色指定($000000 - $ffffff)
    setcls CLSMODE_SOLID, $4080c0
#endif
    
    scale = 0.1
    idx = 0

*mainloop
    ; ESC key to exit
    stick key, 0
    if key & KB_ESC : goto *jobend

    redraw 0            ; draw start
    gmode gmode_rgb0    ; αチャンネル有効、半透明無効でコピーを指定
    
#ifndef HSP3DISH_ENABLE
    ; clear screen
    color 64, 128, 192
    boxf
#endif

    x = int(double(wdw_w) * 0.25)
    y = int(double(wdw_h) * 0.90)
    
    ; draw image by crlput
    pos x, y
    celput imgid, idx, scale, scale, 0.0
    
    ; draw text
    color 255, 255, 255
    pos 10, 10
    mes "scale = " + scale

    redraw 1            ; draw end. screen refersh

    scale += 0.01
    if scale >= 8.0 {
        scale = 0.1
        idx = (idx + 1) \ 4
    }
    
    await (1000 / 60)
    goto *mainloop

*jobend:
    end

使用画像は以下。

_texa.png


せっかくだから、hsp3dish + celput と、HSP標準機能の celput で結果を比較してみたところ、ちょっと興味深い結果になった。動画でキャプチャしてみたけれど、前半が hsp3dish + celput、後半(01:00-)が HSP標準の celput。HSP 3.7 beta7 で動作確認。




hsp3dish + celput は、比較的滑らかに拡大表示されている。しかし、HSP標準の celput は、途中からプルプルと震え始めて、最後のあたりはもうガックンガックン状態…。

HSP標準の celput は、等倍表示は gcopy、等倍表示ではない場合は grotate を使っているという話なので、celput ではなく grotate を使ってもおそらくこんな感じの結果になるのだろうなと予想。

先日作成したスクリーンセーバで、見た目がプルプルしてしまう点について自分の書いた部分がバグってるのではないかと疑ったけど、grotate や gsquare を使うとそうなってしまうのは仕方ない、ということなのだろう…。たぶん。

hsp3dishでフルスクリーン表示をしてみたい :

hsp3dishでフルスクリーン表示をしてみたい。HSP 3.6 からはウインドウサイズをソース(スクリプト?)内から変更できるようになったとのことなので、そのあたりを試してみる。

HSP標準機能を使いつつ、フルスクリーン表示をするには、以下の考え方で実現できるらしい。
  1. デスクトップのサイズを取得して、
  2. bgscr で枠無しウインドウを指定、かつ、デスクトップサイズと同じにして、(0, 0) の位置に表示。
この方法を、hsp3dish でも使えるのかどうか…?

_fullscreen_hsp3dish.hsp
    ; hsp3dish + fullscreen test
    ;
    ; Windows10 x64 22H2 + HSP 3.7beta7
    
    #include "hsp3dish.as"
    #include "d3m.hsp"
    
    #packopt name "fullscreen_hsp3dish"
    #packopt type 0
    
    #define TEX_FILE    "texa2.png"
    #pack   TEX_FILE
    
    #define KB_ESC  $000080
    #define FRAMERATE   60
    
    ; get desktop size
    dispx = ginfo_dispx
    dispy = ginfo_dispy
    
    ; initialize window without frame
    bgscr 0, dispx, dispy, 0
    
    ; load image
    imgid = 3
    celload TEX_FILE, imgid

    ; split image, set orign.
    celdiv imgid, 512, 512, 256, 256

    ; Set the buffer to draw from. Windows ID 0
    gsel 0, 1
    
    ; Set screen clear color to be performed when redraw 0 is called.
    ; 0 or 1, color ($000000 - $ffffff)
    setcls CLSMODE_SOLID, $4080c0
    
    font "Tahoma", 24, 1
    
    angle = 0.0
    
    time_start = d3timer()
    
*mainloop
    ; ESC key to exit
    stick key, 0
    if key & KB_ESC : goto *jobend
    
    tm = d3timer() - time_start
    fps = d3getfps()
    
    angle += 0.5
    
    redraw 0            ; draw start
    
    ; clear screen
    ; color 64, 128, 192
    ; boxf
    
    objmax = 64
    repeat objmax
        r = double(dispy) * 0.5
        a = angle + (270.0 / double(objmax)) * double(cnt)
        x = int(r * cos(deg2rad(a))) + (dispx / 2)
        y = int(r * sin(deg2rad(a))) + (dispy / 2)
        d = double(cnt) / double(objmax)
        
        ; draw image by crlput
        gmode gmode_rgb0    ; alpha channel enabled. Semi transparency disabled.
        pos x, y
        
        scale = 8.0 - (7.5 * d)
        idx = (cnt \ 4)
        rot = deg2rad(angle * 2.0 + 360.0 * d)
        celput imgid, idx, scale, scale, rot
    loop

    color 255, 255, 255
    pos 10, 10
    mes strf("[%dx%d] %d/%dFPS", dispx, dispy, fps, FRAMERATE)
    
    redraw 1            ; draw end. screen refersh
    
    await (1000 / FRAMERATE)
    ; await 12
    goto *mainloop
    
*jobend:
    end

使用画像は以下。

_texa2.png


実行したら以下のような感じになった。縮小してるので見辛いけど、雰囲気だけは伝わるかと。




一応、フルスクリーン表示ができているように見える。しかもこれだけの面積を描画しているのに60FPS出てる。素晴らしい。


ただ、「bgscrは使うべきじゃない」というやり取りも見かけてしまって…。

_HSP3dishでWindows用のフルスクリーンゲームを作るには? - HSPTV!掲示板
bgscrはwindows版と非互換なのであまり使わない方がいいと思います。

HSP3dishでWindows用のフルスクリーンゲームを作るには? - HSPTV!掲示板 より


何を言わんとしているのか、よく分からない…。非互換? どういうこと?

「Linux や Android で bgscr を使ったスクリプトは違う動作になるかもしれないから色んな環境で動かすことを考えたら使わないほうが良い」という話なのだろうか? でも、それはつまり、逆に考えれば、「Windows上で動かすことだけを念頭に置いているなら使っても良い」ということ…? ただ、件のやり取りは、WindowsAPI を叩きまくってフルスクリーン表示を実現できるかどうか、という話のようで…。そもそも最初から「Windows上でやれるのか?」というお題だから、Linux や Android のことは考えなくてもいいのでは…。

上記のソレは2016年頃のやり取りだから、今はまた状況が違っているのだろうか?

doclib\history.txt を確認したところ、以下の記述があった。
2020/07/09 3.6 beta3
...
[HSP3Dish][Linux] bgscr,screen命令による表示サイズ変更、及びフルスクリーン化に対応
...

2020/01/14 3.6 beta2
...
[HSP3Dish][Windows] bgscr,screen命令による表示サイズ変更、及びフルスクリーン化に対応
...

2016年から4年後にこういった機能が盛り込まれたわけだから、現状の HSP 3.6 や HSP 3.7beta では bgscr でフルスクリーン表示できるよ、と捉えてしまってもいいのだろうか。実際動いてるようにも見えるし…。

2023/10/29() [n年前の日記]

#1 [hsp] hsp3dishの動作確認中

Windows10 x64 22H2 + HSP 3.7 beta7 で、hsp3dish の動作確認中。

動作確認に使っているPCのスペックは以下。
_昨日、hsp3dish を使ってフルスクリーン表示をするプログラムを書いた のですが。これをメインPC上で動かしたら、あっさり60FPSが出て喜んだものの。

サブPCで動かしてみたら 12 - 17FPSしか出なくて…。そんな速度しか出ないのかよ。ガッカリ。

そこで、ふと、もしかして、サブPC上では GPU を使って描画できていないのでは? と不安になってきて、そのあたりを検証せねばなるまい、と…。

HSPの標準機能だけで描画してみる :

とりあえず、HSPの標準機能の描画だけを使って試してみた。ソースは以下。hsp3dish関係の命令をコメントアウトしただけですが。

_fullscreen_normal.hsp
    ; HSP normal + fullscreen test. not use hsp3dish
    ;
    ; Windows10 x64 22H2 + HSP 3.7beta7
    
    ; #include "hsp3dish.as"
    #include "d3m.hsp"
    
    #packopt name "fullscreen_normal"
    #packopt type 0
    
    #define TEX_FILE    "texa2.png"
    #pack   TEX_FILE
    
    #define KB_ESC  $000080
    #define FRAMERATE   60
    
    ; get desktop size
    dispx = ginfo_dispx
    dispy = ginfo_dispy
    
    ; initialize window without frame
    bgscr 0, dispx, dispy, 0, 0, 0
    
    ; load image
    imgid = 3
    celload TEX_FILE, imgid

    ; split image, set orign.
    celdiv imgid, 512, 512, 256, 256

    ; Set the buffer to draw from. Windows ID 0
    gsel 0, 1
    
    ; Set screen clear color to be performed when redraw 0 is called.
    ; 0 or 1, color ($000000 - $ffffff)
    ; setcls CLSMODE_SOLID, $4080c0
    
    font "Tahoma", 24, 1
    
    angle = 0.0
    
    time_start = d3timer()
    
*mainloop
    ; ESC key to exit
    stick key, 0
    if key & KB_ESC : goto *jobend
    
    tm = d3timer() - time_start
    fps = d3getfps()
    
    angle += 0.5
    
    redraw 0            ; draw start
    
    ; clear screen
    ; color 64, 128, 192
    ; boxf
    
    objmax = 64
    repeat objmax
        r = double(dispy) * 0.5
        a = angle + (270.0 / double(objmax)) * double(cnt)
        x = int(r * cos(deg2rad(a))) + (dispx / 2)
        y = int(r * sin(deg2rad(a))) + (dispy / 2)
        d = double(cnt) / double(objmax)
        
        ; draw image by crlput
        gmode gmode_rgb0    ; alpha channel enabled. Semi transparency disabled.
        pos x, y
        
        scale = 8.0 - (7.5 * d)
        idx = (cnt \ 4)
        rot = deg2rad(angle * 2.0 + 360.0 * d)
        celput imgid, idx, scale, scale, rot
    loop

    color 255, 255, 255
    pos 10, 10
    mes strf("[%dx%d] %d/%dFPS", dispx, dispy, fps, FRAMERATE)
    
    redraw 1            ; draw end. screen refersh
    
    await (1000 / FRAMERATE)
    ; await 12
    goto *mainloop
    
*jobend:
    end

使用画像は以下。

_texa2.png


動かしてみたところ…。
  • メインPC : 7FPS
  • サブPC : 1FPS。数値では1FPSと出てるけど、実際は1FPSすら出ていない感じ。

60FPS が 7FPS に、12FPS が 1FPS に落ちてしまったわけだから、hsp3dish はちゃんとGPUを使って高速描画してくれていたようだなと…。単にサブPCのオンボードGPUが非力すぎるのだろうなあ…。

OpenGL と DirectX のどちらを使うか :

hsp3dish の利用時、OpenGL を使っているのか、DirectX を使っているのか、そのあたりが気になり始めた。

サブPCのオンボードGPUは Radeon R3 だけど、AMD/ATI製GPU の OpenGL周りは色々と不具合があって何かと弱かった記憶があるので、もし hsp3dish が OpenGL を使っているのだとしたら、DircetX を使うように変更することで速度が改善したりしないか、と…。

ただ、hsp3dish で、「OpenGL じゃなくて DirectX を使え」と指示する方法が分からない…。setreq や getreq を使うのだろうか…?

_HSP3Dish プログラミングマニュアル・基本仕様ガイド

スクリーンの初期化をする bgscr の周辺に挿入してみたけれど、これで本当に DirectX が使われているのかどうか…? HGIMG3 の場合は hgini とやらを呼んで初期化が必要になるらしいけど、hsp3dish では該当する命令が見つからない…。

    ; get desktop size
    dispx = ginfo_dispx
    dispy = ginfo_dispy
    
    ; initialize window without frame
    bgscr 0, dispx, dispy, 0, 0, 0
    
    ; DirectX mode enable
    setreq SYSREQ_DXWIDTH, dispx
    setreq SYSREQ_DXHEIGHT, dispy
    setreq SYSREQ_DXMODE, 1
    cls 4
    
    getreq dxmode, SYSREQ_DXMODE
    getreq devlost, SYSREQ_DEVLOST
    getreq dxresult, SYSREQ_RESULT

確実に DirectX を使いそうな HGIMG3 を利用して動作確認してみるべきだろうか…。

#2 [movie] 「ゴジラ2000 ミレニアム」を視聴

BS12で放送されていたので視聴。初見。ゴジラとUFOが戦う映画、らしい。

2000とついているけれど、公開されたのは1999年。Wikipediaの記述によると、1年前の1998年にハリウッド版ゴジラが公開されたものの、日本国内から「こんなのゴジラじゃねえ」と不満の声が上がったのを見て、ゴジラ新作の需要があると踏んで企画されたそうで…。当時のゴジラシリーズとしては最高額の予算をかけて作ったのだとか。

_ゴジラ2000 ミレニアム - Wikipedia

感想としては…。うん…。ハリウッドの映像制作技術は凄いなと…。圧倒的な差をつけられちゃったなと…。 *1

実写の空撮映像に着ぐるみのゴジラを合成するカットは興味深かった。どういう映像にしたかったのかは全然分かるし、そういう映像を作ろうとした姿勢は称賛されるべきと思ったのだけど。しかし、実写の空撮映像はカメラが動いて映像がブレるわけで、ゴジラの位置合わせはずれてるわ、色調その他の調整もイマイチだわで、強烈な「合成してまーす」感が…。今なら実写映像から特徴点を見つけてトラッキングして、位置合わせぐらいならキッチリできるんだろうけど、当時の日本には本当に技術/ノウハウが無かったんだなあ、と…。考えてみたら「シンゴジラ」は空撮シーンの都市景観すらCGで作ってたんだっけ。日本のVFXって随分と進歩したんだなと再認識。

特撮監督は川北監督から変わって、川北監督の元で助監督をしていた鈴木健二監督になったそうで。

_鈴木健二 (特撮監督) - Wikipedia

そのせいか、大胆な構図のカットがいくつかあったような印象も受けた。もっともそのあたりはコンテを描いた方の功績なのだろうか。でも、コンテにOKを出すのは、やはり監督さんのような気もするし。

ラストのあたりは、ちょっとビックリ。なんだか平成ガメラ3のソレを思い出したりもしたけれど…。海にのそのそと帰っていくゴジラの後ろ姿をボヘーッと眺めつつ人間がとってつけたようなそれっぽいことを突然喋り始める、みたいな定番のラストではなかったあたりは好印象。いやまあ、なんかそれっぽいことはやっぱり喋ってたけど…。

怪獣映画の終わり方って、他にはどういう手があるんだろう、などと少し考え込んでしまった。ゴジラが海に帰っていくのは、海に囲まれている日本という国で育った人達が作っているから、だよな…。なんでもかんでも海に流してしまえばなんか一応問題解決したような錯覚をしちゃう国民性があるからで…。もし、海が無い国で育った人が怪獣映画を作ったら、一体どういうラストにするんだろう…? ゴジラ、どうやって片付ける…?
*1: そのカットを実現するためには何をどうしたらいいのか、その都度分析したり、研究したり、リハーサルをしたりしてノウハウを蓄積していくあちらさんと、「昔からこうやってるんだから」で思考停止して手癖で片付けちゃう日本では、ここまで差がつくのだろうな、みたいなことも思ってしまった。まあ、「STAR WARSから学ぶものは何も無い」と言い切っちゃうのが邦画界だから仕方ないのかも。あちらさんが何を持っていて、自分達が何を持ってないか、それすら気づけないと進歩する可能性もゼロなわけで…。あちらの方々は日本の映画も結構褒めるけど、いつかそれを自分達も獲得してみせるぞという、学ぶ意欲に満ちているからこそガンガン褒めるのだろう、と思うのだよな…。何かを見て、褒める部分を見つけられない人/組織/業界は、もはや成長する見込みが無い…。って自分にとってもブーメランだなコレ…。

2023/10/30(月) [n年前の日記]

#1 [hsp][python] HGIMG3とビットマップフォント画像の作り方を勉強中

Windows10 x64 22H2 + HSP 3.7 beta7 で、HGIMG3 について勉強中。

HGIMG3 というのは、DirectX8 を使って画面描画をするプラグイン、という説明でいいのだろうか。

昨日は hsp3dish という描画プラグインを使って色々試してたけど、OpenGL と DircetX のどちらを使って描画してるのか分からなくて…。HGIMG3 なら間違いなく DirectX を使ってくれるのではないかなと思えてきたので試用してみることにした。

ビットマップフォント画像を作りたい :

HGIMG3 プラグインで文字表示をするためには、ビットマップフォントがずらりと並んだ画像が必要になるらしい。

一応、HSP に同梱されている素材集、hsptv\ の中に、fontchr.png というビットマップフォント画像があるので、コレを使わせてもらえばビットマットフォントの描画/表示はできる。それで済ませてしまってもいいのだけど。

でも、せっかくだから、自分でフォント画像を作りたいよなと。そのあたりの作業を試してみた。

まずは自由に使えるビットマップフォント画像を入手しないといけない。

幸い、昔、MZ-700 に似た感じのフォントを自分で作ったことがあるので、まずはそれを使ってみることにした。自分で1ドットずつ打って作った画像だからライセンス面は問題無いはず。CC0 / Public Domain ってことで。使えそうなら自由に使ってください。

pet2015.png
_pet2015.png (8x8 bitmap font)

このままだと小さいので、ドットエディタ EDGE2 で開いて、2倍に拡大して16x16のフォントにした。更に、不要な文字は削除して、文字の配置を変えてみた。

pet2015_orig_16x16.png
_pet2015_orig_16x16.png (16x16 bitmap font)


せっかくビットマップフォントを使うので、縁取りをしたい。そのためには各文字の周辺に隙間が必要。でも、1文字ずつ手作業でずらしていく作業なんてやってられないので、Python スクリプト + Pillow を使って自動化する。16x16個の文字が並んでるはずの画像を読み込んで、各文字の間に指定したドット数で隙間を入れる処理を書いてみた。動作環境は Windows10 x64 22H2 + Python 3.10.10 + Pillow 10.1.0。

_fontpadding.py
"""
Load font image and padding.

Usage : fontpadding.py INFILE OUTFILE PADDINGX PADDINGY

Windows10 x64 22H2 + Python 3.10.10 64bit
"""

import sys
from PIL import Image


def main():
    if len(sys.argv) != 5:
        print("Usage : fontpadding.py INFILE OUTFILE PADDINGX PADDINGY")
        sys.exit()

    infile = sys.argv[1]
    outfile = sys.argv[2]
    padx = int(sys.argv[3])
    pady = int(sys.argv[4])
    print(f"infile  : {infile}")
    print(f"outfile : {outfile}")
    print(f"padding : {padx}, {pady}")

    im = Image.open(infile).convert("RGB")
    iw, ih = im.size
    print(im.format, iw, ih, im.mode)

    fw = iw / 16
    fh = ih / 16
    dw = iw + 16 * padx
    dh = ih + 16 * pady

    nim = Image.new("RGB", (dw, dh))

    buf = []
    for y in range(16):
        for x in range(16):
            x0 = x * fw
            y0 = y * fh
            im2 = im.crop((x0, y0, x0 + fw, y0 + fh))

            tx = int(x * (fw + padx) + (padx / 2))
            ty = int(y * (fh + pady) + (pady / 2))
            nim.paste(im2, (tx, ty))

    nim.save(outfile)


if __name__ == '__main__':
    main()

使い方は以下。
python fontpadding.py INFILE OUTFILE n m

example:
 python fontpadding.py in.png out.png 4 4


以下のような画像になった。

pet2015_new_20x20.png

元画像と比べれば隙間が空いてることがわかる。

pet2015_orig_16x16.png


ドットエディタ EDGE2 を使って文字の周りに縁取りをする。イメージ → 効果 → 指定色に縁を加える、を選ぶ。更に、上下左右が繋がりそうな文字はドット修正。背景色は透過色扱いにする。

こんな感じになった。

pet2015_border_20x20.png
_pet2015_border_20x20.png (20x20 bitmap font)

再度書くけど、CC0 / Public Domain ってことで。使えそうなら自由に使ってください。

ビットマップフォント画像を作りたい。その2 :

上記のビットマップフォントを使って済ませてもいいのだけど、もうちょっとオシャレな感じのフォントが欲しくなってきた。ゲーム用素材が公開されている OpenGameArt で、ビットマップフォントが公開されていたりしないかな…。

_OpenGameArt.org

「bitimap font」で検索しつつ、ライセンスは CC0 で絞ってみたら、イイ感じのフォントがいくつかあるようで…。以下のフォントがなんだか良さそう。ライセンスも CC0 なので改変も自由だし、コレを使わせてもらおうか…。ありがたや。

_Boxy Bold Font | OpenGameArt.org

EDGE2 で開いて、文字の配置をASCIIコードに合わせた感じにしてみた。また、小文字が無かったので、ドットを打ってテキトーに追加。せっかくだから置いておきます。元画像と同様に CC0 ってことで。

boxy_bold_font_relayout_20x20.png
_boxy_bold_font_relayout_20x20.png (20x20 bitmap font)

「%」「&」「M」のあたりは横幅が大きくて、そこに合わせたら全体的に横長の画像に…。

ビットマップフォント画像を作りたい。その3 :

他にもイイ感じのビットマップフォントはないものだろうか。そこでふと、BDFフォントの存在を思い出した。

BDFフォントと言うのは、昔の *NIX界隈で使われていたビットマップフォントのフォーマット。テキストファイルでドットの有無が記述されている。

_itouh: BDFについて

色んなBDFフォントがあるけれど、ググっているうちに東雲フォントが良さそうな気がしてきた。ライセンスは Public Domain とのことなので、画像にして使っても問題無いだろう…。ありがたや。

_東雲フォント - Wikipedia
_shinonome font family

shinonome-0.9.11p1.tar.bz2 を入手して解凍。bdf\ の中に、色々なサイズのbdfフォントが入っている。今回は、7x14ドットのフォントを使わせてもらおうかな…。

このbdfフォントを、一旦画像化しないといけない。ググったら、Webアプリとして BDF Font viewer というツールが公開されていたので利用させてもらうことにした。ありがたや。

_MRz-NET.org

BDF Font Viewer に、shnm7x14a.bdf を渡したところ、それらしいフォントが表示された。左下の「Glyph columns」を16にして、「Export PNG」をクリック。1文字7x14ドットのビットマップフォント画像が得られた。ただ、配置がちょっとおかしい。そこはEDGE2を使って適当に並び替えた。

前述の、各文字の間に隙間を入れる Pythonスクリプトを使って、隙間を入れておく。EDGE2 で縁取り。かつ、2倍に拡大。以下のような感じになった。

shnm7x14ascii_border_18x32.png
_shnm7x14ascii_border_18x32.png (18x32 bitmap font)

元のbdfフォントが Public Domain なので、コレも Public Domain ということで。

ここまで書いてから思い出したけど、bdf2bmp というツールを使えば、bdf から画像化できたのでは…? BDFフォントを扱うのは久しぶりだから、関連ツールのことをすっかり忘れていた…。

_bdf2bmp
_bdf2bmpの詳細情報 : Vector ソフトを探す!
_bmp2bdfの詳細情報 : Vector ソフトを探す!

HGIMG3でHello World :

ビットマップフォント画像が作れたので、HGIMG3 で文字表示をしてみたい。とりあえず、Hello World と表示するだけのソースを書いてみる。

_02_helloworld_hgimg3.hsp
    ; hgimg3 Hello world
    
    #include "hgimg3.as"
    
    #packopt name   "02_helloworld_hgimg3"  ; file name
    #packopt type   0   ; generate ".exe"
    
    hgini                   ; initialize hgimg3
    
    ; initialize custom bitmap font
    setfont 20, 20, 18, 1   ; 20x20 font
    ; setfont 18, 32, 16, 1   ; 18x32 font
    
    ; load bitmap font image
    ; * texload : RGB=(0,0,0) is transparent. alpha channel not support.
    ; * texload2 : alpha channel support.
    texload "font.png"
    ; texload "font2.png"
    ; texload "font3.png"
    
    clscolor $4080c0        ; set clear color
    
*mainloop
    ; ESC to exit
    stick k
    if k & 128 : goto *job_end
    
    hgdraw          ; draw start
    
    ; draw text
    x = 100
    y = 50
    fprt "Hello World (HGIMG3)", x, y
    
    hgsync 15       ; draw end and wait
    
    goto *mainloop

*job_end
    hgbye       ; release HGIMG3 plugin
    end

使用画像は以下。どれかしら1つで良い。

_font.png
_font2.png
_font3.png

以下のような画面になった。

02_helloworld_hgimg3_ss01.png


せっかくだから、フォント画像を変更した際の画面も載せておく。印象が結構変わる。

02_helloworld_hgimg3_ss02.png

02_helloworld_hgimg3_ss03.png


  • HGIMG3 を使う時は、ソースの最初のほうで #include "hgimg3.as" と書く。
  • hgini を呼んで、HGIMG3 を初期化する。
  • hgdraw と hgsync を書いて、その間で描画処理を書く。
  • hgsync N で、N ミリ秒ほど時間待ちをする。
  • setfont で、ビットマップフォントの1文字あたりのサイズや、1文字書くたびに何ドット右に移動するか、抜き色の無し/有りを設定する。
  • setfont を呼んだ直後に、textload もしくは texload2 でビットマップフォント画像を読み込む。
  • fprt でビットマップフォントを使って文字を描画。

文字色については、ビットマップフォント画像上で固定されているので、color命令を使って文字色を変えることはできない。

フォント用画像内の RGB=(0,0,0) を透明色として扱っているのか、それとも、フォント用画像にアルファチャンネルも含めてあるのかで、テクスチャ読み込み用の命令が違ってくるらしい。
  • texlaod : RGB=(0, 0, 0) を透明色として扱う。アルファチャンネルは無視する
  • texload2 : アルファチャンネルが反映される

画像を描画 :

画像を描画してみる。せっかくだから、TIC-80起動時に読み込まれているサンプルと同様に、カーソルキーでキャラを移動できるプログラムにしてみる。

_03_image_draw.hsp
    ; hgimg3 image draw (hgrotate) sample.
    
    #include "hgimg3.as"
    #include "d3m.hsp"
    
    #packopt name   "03_image_draw"  ; file name
    #packopt type   0   ; generate ".exe"
    
    #define TEXFILE     "chara.png"
    #define FONTFILE    "font.png"
    
    #pack   TEXFILE
    #pack   FONTFILE
    
    #define KB_ESC      $00080
    #define KB_LEFT     $00001
    #define KB_UP       $00002
    #define KB_RIGHT    $00004
    #define KB_DOWN     $00008
    #define KB_CURSOR   (KB_LEFT | KB_UP | KB_RIGHT | KB_DOWN)
    
    screen 0, 512, 288, 0       ; initialize screen
    wdw_w = ginfo_winx          ; get window size
    wdw_h = ginfo_winy
    hgini                       ; initialize hgimg3
    
    ; load texture
    ; * texload : alpha channel not support
    ; * texload2 : alpha channel support
    texload2 TEXFILE
    texid = stat            ; get texture ID
    texw = 16
    texh = 16
    
    ; init bimap font, load font texture
    setfont 20, 20, 18, 1   ; 20x20 font
    texload FONTFILE
    
    clscolor $4080c0        ; set clear color
    
    x = wdw_w / 2
    y = wdw_h / 2
    count = 0
    
    time_start = d3timer()
    
*mainloop
    ; get FPS
    tm = d3timer() - time_start
    fps = d3getfps()
    
    stick k, KB_CURSOR              ; check keyboard
    if k & KB_ESC : goto *job_end   ; ESC key to exit
    
    ; cursor key to move
    spd = 4
    if k & KB_LEFT  : x -= spd
    if k & KB_RIGHT : x += spd
    if k & KB_UP    : y -= spd
    if k & KB_DOWN  : y += spd
    
    ; ----------------------------------------
    ; draw start
    hgdraw
    
    ; draw image
    gmode gmode_rgb0, texw, texh    ; set src size
    pos x, y                        ; set position
    
    idx = (count / 15) & 1
    src_x = texw * idx
    src_y = 0
    scale = 4.0
    rot = 0.0
    dst_w = int(double(texw) * scale)
    dst_h = int(double(texh) * scale)
    
    hgrotate texid, src_x, src_y, rot, dst_w, dst_h   ; draw texture

    ; draw text
    gmode gmode_rgb0
    tx = (wdw_w / 2) - 20 * 9
    ty = 12
    fprt strf("[%dx%d] %d/60FPS", wdw_w, wdw_h, fps), tx, ty
    
    hgsync 15       ; draw end and wait
    
    count++
    goto *mainloop

*job_end
    hgbye       ; release HGIMG3 plugin
    end

使用画像は以下。

_chara.png
_font.png

実行すると以下のような感じ。

03_image_draw_ss01.gif


HGIMG3 で画像を描画するには、hgrotate を使うらしい。拡大縮小回転描画ができる。

尚、描画時には、どのテクスチャを使うのかテクスチャIDを渡さないといけない。texload か texload2 を使って画像を読み込んだ直後、stat という変数に割り当てられたテクスチャIDが入っているそうなので、その値(テクスチャID)を別の変数に保存しておく。

2023/10/31(火) [n年前の日記]

#1 [hsp] HGIMG3でフルスクリーン表示ができるのか試してみた

Windows10 x64 22H2 + HSP 3.7 beta7 で、HGIMG3 について勉強中。

HGIMG3 でフルスクリーンっぽい表示が出来そうかどうか試してみた。今までと同じやり方が ―― bgscr を使って、枠無し、かつ、デスクトップサイズのウインドウを作って、画面の左上に表示位置を設定すればフルスクリーン表示に見える、というやり方が通用するのかどうかを確認する。

DirectXに「フルスクリーン表示にせよ」と指定する処理は、今回はやらない。ソレをするとデスクトップ上のアイコン配置がグチャグチャになってしまった記憶があるので…。あくまで、「ウインドウ表示なんだけどフルスクリーン表示っぽく見えてる状態」にできるかどうかを試す。

もし、DircetXにフルスクリーン表示を指定したいなら、HSP同梱のサンプル、sample\hgimg3\fullscr.hsp が参考になるかと。

_OHDL - fullscr.hsp

ソース :

_04_fullscreen_hgimg3.hsp
    ; hgimg3 fullscreen sample.
    
    #include "hgimg3.as"
    #include "d3m.hsp"
    
    #packopt name   "04_fullscreen_hgimg3"  ; file name
    #packopt type   0   ; generate ".exe"
    
    #define TEXFILE     "tex.png"
    #define FONTFILE    "font.png"
    
    #pack   TEXFILE
    #pack   FONTFILE
    
    #define KB_ESC      $00080
    #define FRAMERATE   60
    
    ; get desktop size
    dispx = ginfo_dispx
    dispy = ginfo_dispy
    
    ; initialize window without frame
    bgscr 0, dispx, dispy, 0, 0, 0
    
    hgini                       ; initialize hgimg3
    
    ; init bimap font, load font texture
    setfont 20, 20, 18, 1   ; 20x20 font
    texload FONTFILE
    
    ; load texture
    texload2 TEXFILE
    texid = stat            ; get texture ID
    texw = 512
    texh = 512
    
    ; Set the buffer to draw from. Windows ID 0
    gsel 0, 1
    
    clscolor $4080c0        ; set clear color
    
    angle = 0.0
    
    time_start = d3timer()
    
*mainloop
    ; get FPS
    tm = d3timer() - time_start
    fps = d3getfps()
    
    ; ESC key to exit
    stick k, 0
    if k & KB_ESC : goto *job_end
    
    angle += 0.5
    
    ; ----------------------------------------
    ; draw start
    hgdraw
    
    objmax = 64
    repeat objmax
        r = double(dispy) * 0.5
        a = angle + (270.0 / double(objmax)) * double(cnt)
        x = int(r * cos(deg2rad(a))) + (dispx / 2)
        y = int(r * sin(deg2rad(a))) + (dispy / 2)
        d = double(cnt) / double(objmax)
        
        ; draw image by crlput
        gmode gmode_rgb0, texw, texh
        pos x, y
        
        src_x = (idx \ 2) * texw
        src_y = ((idx / 2) \2) * texh
        idx = (cnt \ 4)
        rot = deg2rad(angle * 2.0 + 360.0 * d)
        scale = 8.0 - (7.5 * d)
        dst_w = int(double(texw) * scale)
        dst_h = int(double(texh) * scale)
        
        ; draw texture
        hgrotate texid, src_x, src_y, rot, dst_w, dst_h
    loop

    ; draw text
    gmode gmode_rgb0
    fprt strf("[%dx%d] %d/%dFPS", dispx, dispy, fps, FRAMERATE), 10, 10
    
    hgsync (1000 / FRAMERATE) - 1   ; draw end and wait
    
    goto *mainloop

*job_end
    hgbye       ; release HGIMG3 plugin
    end

使用画像は以下。

_font.png
_tex.png

表示結果は、hsp3dish のソレと大体同じなので省略。

動作結果 :

以下の環境で動作確認。
  • メインPC : CPU AMD Ryzen 5 5600X + GPU NVIDIA GeForce GTX 1060 6GB + RAM 16GB, 画面解像度 1920x1080
  • サブPC : CPU AMD Athlon 5350 + オンボードGPU Radeon R3 + RAM 4GB, 画面解像度 1920x1080

メインPC上では60FPS前後のFPSが出た。これは予想通り。hgsync に与えているwait値が正確な1/60秒になってないので誤差が大きく出ていた気もするけれど、大体似たようなFPSになってれば、まあいいかと。

問題はサブPC。12 - 17FPS しか出ない。hsp3dish を使った時と似たようなFPSになった。

サブPCの Radeon R3 で OpenGL を使うと遅いのではないか、DircetX を使えばもう少し速く処理してくれるのではないかと、淡い期待を持ちつつ実験してみたのだけど、そんなことはなかった。おそらく、OpenGL も DirectX も、どちらも遅い。単にスペックがショボいGPUでした、というオチだなと…。

今後の方針 :

でもまあ、どうにかして DircetX を使わないと描画が速くならないという状態ではなさそうなので、今後は安心して(?) hsp3dish を選択できそう。OpenGL と DircetX のどちらが使われているかなんて一切気にしなくていい。どうせサブPC上で動かしたらどちらも遅いから…。トホホ。

しかし、困った。この状態で高速化するにはどうすればいいのだろう。

描画面積を減らしていけば目に見えてFPSが改善するのだろうか。だとしたら、やはり小さな仮想画面を作っておいて、そこに全部描画してから最後にデスクトップサイズに拡大描画、というやり方が有効だろうけど…。hsp3dish でそんなことはできるのだろうか。必ず、最初に生成したウインドウに描画しないといけない、仮想画面に描画なんて無理、みたいな制限があったりしないか…?

その前に、hsp3dish でスクリーンセーバが作れるのかどうか実験してみないと…。

スクリーンセーバにできるかどうかは、今回重要。最終的にスクリーンセーバにしてみたいから、あえてわざわざ HSP というアレなソレを選んでいるわけで…。

スクリーンセーバにしなくていいなら、言語仕様が至極真っ当な、Love2D (Lua)、DXRuby (Ruby)、PyGame (Python)、Processing 等を使ってデモプログラムを書いたほうが、はるかに楽だし分かりやすいよなと…。

Radeon R3の性能について調べた :

AMD Radeon R3 ってどの程度の性能のGPUなんだろう。ベンチマークの類を調べてみた。

何か比較対象があったほうが分かりやすいだろう…。今も売ってる増設ビデオカードの中で比較的低価格なものとなると…。NVIDIA GT 710、GT 1030 あたりと比べてみればいいのかな。

_UserBenchmark: AMD Radeon R3 Graphics vs Nvidia GeForce GT 710
_Radeon R3 Graphics IGP (APU A6-6200) vs GeForce GT 710

_UserBenchmark: AMD Radeon R3 Graphics vs Nvidia GT 1030
_GeForce GT 1030 vs Radeon R3 Graphics IGP (APU A6-6200)

絶句。Radeon R3 ってこんなに性能低いのか…。GT 710 の 1/2 - 1/3、GT 1030 の 1/6 の性能だろうか。増設ビデオカードって、このランクでも結構凄いんだな…。

でも、Intel の内蔵GPUと比べたらどうだろう。例えば Core i5-2500 に入ってる Intel HD 2000 あたりと比べたら…。

_UserBenchmark: AMD Radeon R3 Graphics vs Intel HD 2000 (Desktop 1.1 GHz)
_HD Graphics 2000 (Sandy Bridge GT1) vs Radeon R3 Graphics IGP (APU A6-6200)

さらに絶句。昔の Intel製オンボードビデオと比べたら、まだ Radeon R3 のほうがマシだったとは…。と言っても 1.5 - 2.0倍ぐらいだけど。

ちなみに、Intel Skylake世代(6xxx番台) に内蔵されてる Intel HD 510 あたりと比べたら、さすがに Intel HD 510 のほうが Radeon R3 より 1.5倍ぐらい性能が良かった。Intel製の内蔵GPUは、世代が変わるたびにグングン性能を上げていたんだなと。

_UserBenchmark: AMD Radeon R3 Graphics vs Intel HD 510 (Desktop Skylake)
_HD Graphics 510 (Skylake GT1) vs Radeon R3 Graphics IGP (APU A6-6200)

何にせよ、オンボードビデオのPC上でも動かすことを考えたら、描画に関して贅沢な作りは一切できない気がする。1920x1080なら10FPS前後で動くだけでも「スゴイね!」という話なのかも…。

Windows11になったら状況が変わるかどうか :

Radeon R3 の遅さにガックリきているけれど、Windows10のサポートが終了して、Windows11だけになったら、動かせるCPUの最低ランクが Intel の第8世代以上になるはずで、内蔵GPUもそのランクが最低ランクになるだろうから、状況がガラリと変わるのではないかと思えてきた。

Windows11が動かせる最低ランクのCPU、最低ランクのGPUって、どのあたりになるんだろうか…? そこが分かれば、どの程度の描画をしてもいいのか大体把握できるのでは。

ググっても分らなかったので、試しにAIさん(Bing Chat)に尋ねてみたら「Celeron J4005はどうでしょう」と言ってきた。調べたところ、たしかに Windows11 の対応CPUに入ってる。内蔵GPUは Intel UHD 600。ベンチマーク結果を確認したところ…。

_UserBenchmark: AMD Radeon R3 Graphics vs Intel UHD 600

どんぐりの背比べではあるけれど、Radeon R3 のほうが、まだマシだった…。Windows11 になったからと言ってGPUの最低スペックまで劇的に上がるわけではない、ということだな…。やっぱり贅沢な描画は無理っぽい。

#2 [digital] Google翻訳に感動

「今頃知ったのかよ」と馬鹿にされそうだけど、あまりにも感動してしまったのでメモ。思考メモ。

台所の棚の中に、数年間、手を付けてなかった謎の液体があって。頂き物らしいのだけど、ラベルが全部イタリア語で書かれているから、一体何の液体なのか家族全員分からなくて。コレ、調味料…だよな? まさか洗剤じゃないよね? みたいな。

夕食時に、その液体の話題が出て、「Google翻訳でどうにかならんか」という話に。妹が、「アレってスマホのカメラで撮影しただけで翻訳してくれるんじゃないの?」と言い出した。マジか。Google翻訳ってそんなことまでできるんか。

自分の手持ちのスマホに、Google Play(Playストア)経由でGoogle翻訳をインストールして試用してみたところ…。ホントだ…。「カメラ」のアイコンがある…。カメラを起動して謎液体のラベルを撮影してみたら…。えっ。コレって画像の上に翻訳結果を表示してくれるんか。すげえ。これもう魔法の域じゃん。異世界転生なろう系アニメでこういうシーンを見たような。異世界の文字がスーッと日本語に変わっていくヤツ。アレじゃん。もしかしてコレをアニメが取り込んでたのかな。

まあ、最初は「英語→日本語」設定のまま使ったので、単語が全部カタカナ言葉になって「こんなの分かるか!」と家族で爆笑したのだけど。「イタリア語→日本語」にしたら、「調味料」「どこそこで収穫」「砂糖なし」「スープ、肉に使える」「あなたの貧しい食事を〜」と出てきて…。「貧しい食事」でまた爆笑。言い方ァ! いや、言いたいことは分かるけど。要は「美味しくなるよ!」ってことですね。分かります。

マイクのアイコンを選んだら、音声入力した結果を英語に翻訳して、しかもそこからスピーカのアイコンを叩くと音声合成で英語を喋ってくれるし…。いやはや、スゴイ時代になってたんですねと(今頃になって)感動してしまったので、こうしてメモ。

ちなみに謎液体はプルーンみたいな味でした。結構美味しいな…。Google翻訳のおかげで安心して味見できました。ありがとう、Google。

カメラとマイクの功績 :

スマホを使っていると、しみじみ思ってしまうのだけど。スマホと呼ばれるパーソナルコンピュータに、「カメラ」と「マイク」という「目」と「耳」がついたことで、やれることが一気に増えたよなと…。

自分はスマホよりPCが好きな人種なのだけど。なんだかちょっと悔しさを感じる。もし、PCにも、最初からカメラとマイクがついていたら、スマホでやれるアレコレは、まず最初にPC上で実現できていたはずなのに、と…。本当ならできていたはずのことが、特定の入力デバイスが標準ではついてなかったことで、なかなかできないと思われていたのが、なんだか悔しい。スマホという別種のコンピュータに全部持っていかれてしまった。 *1

キーボードとマウスと言う入力デバイス“しか”ついてなかったことが、何十年もPCの足枷になっていたのだろうなと。パーソナルコンピュータって、本当はもっと色んな事ができる子だった。でも、自分達はそれが分からなかった。カメラとマイクがオプション扱いだったという、ただそれだけのことで…。その製品ジャンルに、標準状態で何の入力デバイスをつけておくのか。そのことが、ここまで重要だったとは。製品ジャンルの命運を分けてしまうとは。

そう考えると、今後、また違った何かしらの入力デバイスが、スマホに、あるいはPCにつくのが当たり前になった時、更にもう一段、やれることが増えるのかもしれない。その入力デバイスが一体何なのかは、自分は未来人じゃないからイメージが湧かないのだけど。

数十年後、「なんであの頃のコンピュータにコレをつけてなかったのかねえ。こんなに便利になるのに。誰も気づいてなかったの? コレってあの頃にはもうあったよね?」と、その時代の人達は首を捻っているのかもしれないよなと…。

*1: いやまあ、クラウドサービスとセットにすればできるよ、という状況なので、スマホだけで実現できてるわけではないのだけれど。スマホ“だけ”を異世界に持っていったら無双できるわけでは…ない…。

#3 [anime] 「薬屋のひとりごと」の1話を視聴

BSで放送が始まったので視聴。話題になっているTVアニメらしい。

どういう作品なのか情報を全く仕入れずに見てみたけれど。これ、「チャングム」だな…。ちゃんと面白くなりそうな感じにアニメ化されたチャングムというか…。

チャングムは、韓国のアニメスタジオで一度アニメ化されていた記憶があるのだけど、何故か幼女キャラにされてしまった上に、脚本と演出がかなり子供さん向きで、作画面はちゃんとしていたのに、それ以外はなんともビミョーなアニメになってしまった印象で…。当時の韓国では「アニメ=子供向け」という意識が強くてそうなってしまったのか、それとも大人向けの需要はドラマ版で満たせているから子供さん達にアピールするためにあえてそういう設定にしたのか…。そういうアレンジも妥当ではあるのかもしれんけど…。

何にせよ、真っ当なチャングムアニメ版が出てきた感じで、個人的には期待大。かもしれない。

というか、薬や毒を扱う作品って、大体は面白くなりそうな印象もあるなと…。いやまあ、ちゃんと調べて作ってあればという前提付きですけど。例えば「薬」を「ポーション」と呼んでるアニメなどは、そのほとんどは見る価値が…。いや、これは余計な一言ですな。口が滑りましたゴメンナサイ。

#4 [anime][neta] 「薬屋のひとりごと」を見ていて考えたこと

「薬屋のひとりごと」というTVアニメを見ているうちに、なんだかちょっと色々考え始めてしまったのでメモ。思考メモ。

少女じゃないと価値はないのか :

「薬屋〜」を見ていて、ヒロインが少女キャラな点がちょっと気になったりもした。と言うのも、チャングムアニメ版は幼女がヒロインだったので…。幼女ヒロインよりは少女ヒロインのほうがまだ見れる感じがするな、みたいなことを考え始めてしまって…。

コレ、お姉さんキャラではウケが悪いんだろうか…? いっそおばさんキャラ、お婆さんキャラではどうか…。お婆さんが名探偵として活躍する作品も世の中にはあった気もするし、ヒロインをそういう年齢設定にするだけでも、右も左も美少女キャラだらけの日本国内に限定すれば、他作品との差別化ができたりしないか。

などと書いたところで「ハウルの動く城」がソレじゃん、と今頃思い出したりもして。

そう考えると、御歳を召した宮崎駿監督のほうが、頭が柔らかいはずの若い作り手達よりも、アニメにおける新規性をはるかに多く提示してきた面がありそうだなと…。いや、ジブリというブランドが確立したからこそ冒険できる面もあるのかな。若い頃の宮崎駿監督が似たような企画を出しても十中八九通らなかっただろうし…。

「スカート」は妥当か否か :

「薬屋〜」を見ていたら「スカート」という単語が出てきて、そこがなんだか気になった。

中国/韓国っぽい世界観からして外来語(?)が使われるのは不自然な感じもしたのだけど、おそらく件の台詞は、読者視聴者の理解のしやすさを考慮して、あえてわざわざ使った可能性が高そうだよなと…。ツッコミを入れるヤツは絶対に居るだろうけど、どう考えてもこのほうが瞬時に話が分かるやろ、ココは分かりやすさを優先じゃい、みたいな。

このあたり、聞いた瞬間に視聴者が「?」になってしまう、考証面で正しい単語/用語を披露するのは、娯楽コンテンツとして本当に正しいことなのでしょうか、という問題があるよなと…。

そこで生活している登場人物達にとっては常識であっても、見ているこちら側には異界の文化や用語なわけで。何の説明もなくポンと出てきても見ている側は「?」としかならない。そんなところで引っ掛かりを作ってみたところで意味はあるのか。とは言え、こちらとは違う世界と感じさせる「香りづけ」は大なり小なり必要でもあろうし。結局はバランス感覚の話になるのかもしれないけれど。

「フォース」は「フォース」で本当にいいのか? 「理力」のほうがまだ通じませんか? いっそ「超能力」と言っちゃったらダメ? さすがにそこまでやっちゃったら色々と台無しですか? 「ジェダイ忍法」は…もちろんダメですよね。そりゃそうだ。みたいな。

昨今、中国で作られた、仙人っぽいキャラが出てくるアニメが放送されていたりするけれど。あちらの人達、あの手のジャンルでは常識であろう専門用語(?)がポンポン出てきて、自分などは設定すら把握できずに困ってるわけで…。「もう中国のアニメは見なくていい。どうせ基本設定すら分からんし、アイツラが一体何の話をしているのかさっぱり分らん」と切って捨ててもいいかもな、とすら思い始めているぐらいで…。アレはなんとかしたほうがいいのでは。あんなに豪勢な映像を作っておいて、実にもったいない…。

でも、このあたり、おそらくガンダムシリーズを初めて見た人も同じ感覚になるのかもしれんと不安になったりもする。そりゃおじさんしか見ないコンテンツになっていくわな、と…。

ガンダムに限った話でもない。日本の学園を舞台にしたアニメは、海外の人達は理解できるのだろうか。「生徒会長」って通じるのか? 「部活動」は分かるのか? どこまで通じるものなんだろう。

もっとも、ある程度はテクニックで解決できるのではないか、とも思うのだよな…。「スカート」と意訳して言わせてもいいし、何か分からない単語を口にした直後にヒロインがスカートを隠す動作を見せて「ああ、スカートのことか」と察してもらってもいい。件のアニメでは両方やってて至れり尽くせりだったけど…。伝わりさえすれば、なんでもOk。どれも正解。花丸二重丸。

ただ、「これ、お客さん分かるかな?」「これ、海外の人は理解できるんだろうか?」と疑問を持ちながら作らないと、テクニックが駆使されることもないわけで。

昔何かの番組で見たけれど。ピクサーに在籍していた頃のジョン・ラセター監督が、若いスタッフに「これ、お客さんは分かるかな?」と“笑顔”で質問していた光景を思い出したりもする。世界中で通用するヒット作を生み出す人達は、常に、その問いを、あらゆるカットにぶつけながら作ってるのだなー、大変だなー、でも、まるでなんでもないことのように笑って優しく後進達に尋ねる風を装って諭していくのだなー、テクニシャンだなー、と感心したわけで…。 *1

閑話休題。まあ、こういうのって、細かいところだけど結構難しい問題だよなと…。そんなことを、「スカート」という単語一つから思ってしまいました。とメモ。思考メモです。

*1: などと書いたけど本当に笑顔だったか自信が無くなってきた。自分、脳内で理想の映像を捏造してないか…? でも、あくまで自然体で尋ねていて、けして高圧的な感じでやり取りしていたわけではなかったはず。そこは間違いない。これがもし宮崎駿監督だったら、若いスタッフを怒鳴りつけてる光景が目に浮かぶ…。実際、「これのどこが鳥に見えるんだ!」と原画マンを怒鳴っていた映像も覚えてるし…。いや、普段はもうちょっと優しく言ってるのかもしれんけど。何にせよ、後世に残るのは、スタッフに優しく接して諭していくラセター監督の映像と、スタッフを怒鳴りつけてる宮崎駿監督の映像という…。ラセター監督の「MIYAZAKI-SANは天才だから僕達一人一人では敵わない。だけどその代わり、僕達は皆でアイデア出し合ってアニメを作っていく。10人20人の知恵を集めればMIYAZAKI-SAN並みになれるんじゃないか」という発言と照らし合わせると、なかなか興味深い違いがそこにあるような気もする。

以上、31 日分です。

過去ログ表示

Prev - 2023/10 - Next
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project