mieki256's diary



2026/02/01() [n年前の日記]

#1 [lazarus] Lazarusで外部プログラムを実行したい

Lazarus 4.4 を勉強中。環境は Windows11 x64 25H2。

Lazarus から外部プログラムを実行をしたい。実行したら自身は終了する。

TProcess とやらを使うのが一般的らしい。uses に process を追加すれば使えるようになる。コンソールアプリとして書いて動かしてみた。 *1

_LauncherTest1.lpr
program LauncherTest1;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}
  cthreads,
  {$ENDIF}
  Classes,
  SysUtils,
  process;

var
  ExternalApp: string;
  Params: TStringList;
  AProcess: TProcess;

begin
  ExternalApp := 'notepad';

  AProcess := TProcess.Create(nil);
  Params := TStringList.Create;
  try
    Params.Add('LauncherTest1.lpr');

    AProcess.Executable := ExternalApp;
    AProcess.Parameters.AddStrings(Params);
    AProcess.Options := [poNoConsole];

    try
      WriteLn('Starting: ', ExternalApp);
      AProcess.Execute;
      WriteLn('Success. Closing launcher...');
    except
      on E: Exception do
      begin
        WriteLn('Error: ', E.Message);
      end;
    end;
  finally
    Params.Free;
    AProcess.Free;
  end;
  Sleep(1000);
end.

notepad.exe (メモ帳)を起動して、自身はそのまま終了する。

以下、参考ページ。

_Executing External Programs - Free Pascal wiki
_Executing External Programs/ja - Free Pascal wiki
_Lazarusで別のプロセスを呼び出す - 高見知英の技術ログ
_外部プログラムの呼び出し(Executing External Programs): 天晴の小部屋


ちなみに、先日 Delphi で同じことをした時は ShellExecute() を使った。Lazarus でも同じ方法が使えるらしいけど、TProcess を使えばクロスプラットフォーム対応になるらしい。
*1: Lazarus で新規プロジェクトを選ぶ際に「プログラム」を選ぶ。「コンソールアプリケーション」を選んでしまうとちょっと記述が増えてしまう。

#2 [prog][neta] 本物のプログラマはPascalを使わない、らしい

Delphi や Lazarus 関係の情報をググってたら遭遇した。フレーズはどこかで目にしていた気もするのだけど、中身をちゃんと読んだことはなくて…。

_本物のプログラマはPascalを使わない - Wikipedia
_本物のプログラマはPASCALを使わない | iPentec
_本物のプログラマはPascalを使わない | SEの良心
_Real Programmers Don't Use Pascal
_Pascalが私の好きな言語でない理由 | taro-nishinoの日記 | スラド
_Why Pascal is Not My Favorite Programming Language
_本物のプログラマ - Archiva

「本物のプログラマ」の定義が…なんというか…。そこだけ抽出して列挙したら面白そう。

まあ、本物のプログラマじゃなくても全然余裕で使えるほどに Pascal はとっても分かりやすいプログラミング言語ですよ、という話でもあるのだろう…。教育用言語としての採用事例も多かったらしいし…。

と思ったけれど、今の Delphi や Lazarus (Free Pascal) は元々の Pascal から全然違うものになってるそうで…。本物のPascalを触ってみないとなんとも言えないか…。

_標準 Pascal 範囲内での Delphi 入門 - Qiita

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

#1 [lazarus] Lazarusでアプリの設定ファイルを保存したい

Lazarus 4.4 で、アプリの設定ファイルを保存したい。環境は Windows11 x64 25H2。

設定ファイルを保存する場所として、C:\Users\(USERNAME)\AppData\Roaming\ を取得して、その下にアプリ名でディレクトリ(フォルダ)を作成して、その中に .json 等を保存したい。

Windows11の場合、件のディレクトリは環境変数 %APPDATA% で指定されているはずなのだけど…。

Lazarus ではどうやってそのディレクトリパスを取得するのか少しググってみたら、GetAppConfigDir() というものがあるそうで、これを使えば設定を保存しても良さそうなディレクトリを提示してくれる、らしいのだけど…。

_Multiplatform Programming Guide/ja - Lazarus wiki

試してみたら、AppData/Roaming ではなくて、AppData/Local を返してきた。Roaming のほうを取得したいのだけどな…。

結局、こうなった。

function GetConfigDir: string;
var
  dirpath: string;
begin
  dirpath := GetEnvironmentVariable('APPDATA');
  if dirpath = '' then
  begin
    dirpath := ConcatPaths([GetUserDir, 'AppData', 'Roaming']);
  end;

  Result := ConcatPaths([dirpath, CONFIG_DIR]);
end;


ConcatPaths() は、配列?に入った文字列を結合してファイルパスを作ってくれるらしい。

ただ、それぞれのフォルダの違いを確認してみたところ…。もしかするとこの場合、Local フォルダに入れたほうがいいのだろうか…?

_AppData 直下の「Local」「LocalLow」「Roaming」フォルダの違い|ことりと
_AppDataの下にあるLocal,Roaming,LocalLowの3つはどんな違いがある? - おねーさんブログ
_ユーザーフォルダの「Roaming」「Local」「LocalLow」の違いについて | おのでらの創作日記 in ソーサリーフォース
_猫科研究所 - Roaming, Local, LocalLow

#2 [nitijyou] 近所の池がまた埋め立てられるらしい

愚痴(?)です。

近所には元々2つの池があって、上池、下池と呼ばれてたのだけど、上池は少し前に埋め立てられてしまった。残念だなと思っていたら、今日、回覧板で、下池まで埋め立てられることを知った。

市の予算が無いとか騒いでおきながら、なんでそういうやらんでもいいことをまた始めるかなあ…。実は予算が余ってたりするのだろうか。

下の池まで無くなったら、水の流れ的にバッファになるところが完全に無くなって、周囲の高台からゴウゴウと流れてきた水はそのまま下流に凄い勢いで流れていきそうだけど、大丈夫なのかな。埋め立てを計画した人達は雨の日にこのあたりがどういうことになってるのか視察したことがあるのだろうか。地図だけ眺めてテキトーに計画を立ててそうで怖い…。

上の池も…。埋め立てたのはいいけれど(いや良くない)、そこで予算が尽きたのか放置状態になっていて…。風が強い日は埋め立てに使った土が砂埃を上げてまるで西部劇のような光景に。風下を歩く時は砂塵の中を突き進まないといけない。WBから脱走して砂漠を歩くアムロ状態ですよ。てめえらは車でスイスイ走り抜けるから気づかないんだろうけど池を埋め立てたせいでこの近辺ちょっと大変なことになってんだよ…。

埋め立ててから結構時間が立ってるのに、あの広い面積に草一本生えてないのもおかしい。工事した連中は除草剤でも撒いたのだろうか。一面に雑草でも生えていればあそこまで砂埃も舞い上がらないだろうに。あの場所、これからどうするつもりなんだろう。

もっとも、須賀川市は東日本大震災で藤沼湖(ダム湖)の堤防が決壊してかなりの犠牲者が出てしまったので、その事故がトラウマになってるのかなと邪推してるのだけど…。とにかく池の類は埋めちまえ潰しちまえモードになってるのだろう…。

山寺池公園のように、まずは池を縮小することから始めればいいのではと思うのだけど、どうしていきなり全部埋め立てるかな…。しかも水の流れをちゃんと調べないままテキトーに埋め立てるから周囲から水が流れ込んで埋め立てに使った土が下流に流されて…。上池跡の端のほうなんて豪雨が降るたびにごっそりと土が流れて無くなって、無くなったからまたそこだけ埋め立て直して、雨が降ったらまた流されてを繰り返しているうちにとうとう放置モードに入ってそのままに。土遊びしてる幼児のほうがまだ上手に水の流れを作れるわ…。

わざわざ税金使って、どうしてこんな杜撰な工事ばかり…。いや、そもそも計画内容がおかしいのだろうけど。水の流れを全然考えない計画というか…。もっとも、釈迦堂川が氾濫したらここら辺は水没するよとハザードマップで示してあった場所にスーパーシティ? スマートシティ? 構想と称して公共施設を建てて見事水没させたぐらいに頭が悪い市だから期待しても無駄なのだろうか。

愚痴でした。

2026/02/03(火) [n年前の日記]

#1 [lazarus] Lazarusでスクリーンセーバを作りたくて実験中

Lazarus 4.4 でWindows用のスクリーンセーバを作りたい。環境は Windows11 x64 25H2。

「スクリーンセーバーの変更」ウインドウ上で、リストからLazarus製スクリーンセーバを選択すると、WindowsのタスクバーにLazarus製アプリのアイコンが表示されてしまう状況が気になってきた。ちゃんとしたスクリーンセーバならタスクバーにアイコンが表示されたりしないわけで…。

Delphi なら、フォームの ParentWindowプロパティに親ウインドウのHWND(ウインドウハンドル)を代入するだけで色々とイイ感じに処理してくれるっぽいのだけど、Lazarus はクロスプラットフォーム対応を重視しているせいか、Delphi ほどイイ感じにはしてくれないらしい。

それでも、AI(Google Gemini)と何度かやり取りして実験しているうちに、アイコンが表示されない状態になる記述の仕方に辿り着いた。

以下はプレビュー画面モードだけを ―― コマンドラインオプションで「/p HWND」が指定された時の処理だけを行ってるサンプル。「/s」「/c:HWND」等は何もしないで終了する。

_SSPreviewTest1.lpr (メインプログラム)
program SSPreviewTest1;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}
  cthreads,
  {$ENDIF}
  {$IFDEF HASAMIGA}
  athreads,
  {$ENDIF}
  Interfaces, // this includes the LCL widgetset
  SysUtils,
  Windows,
  Controls,
  Forms,
  Unit1 { you can add units after this };

  {$R *.res}

var
  ParentHWND: HWND = 0;
begin
  RequireDerivedFormResource := True;
  Application.Scaled := True;
  Application.Initialize;

  if (ParamCount >= 2) and (SameText(ParamStr(1), '/p')) then
  begin
    ParentHWND := StrToIntDef(ParamStr(2), 0);
  end;

  // プレビューモード以外(/s や /c)は何もしないで終了
  if ParentHWND = 0 then Exit;

  Application.CreateForm(TForm1, Form1);

  {$PUSH}
  {$WARN 5044 OFF}
  // タスクバー完全抑制処理
  // メインフォームをタスクバーと連動させない
  Application.MainFormOnTaskbar := False;
  {$POP}

  {$PUSH}
  {$WARN SYMBOL_PLATFORM OFF}
  // Application(隠し窓)にツールウィンドウ属性を与えてタスクバーから隠す
  SetWindowLong(Application.Handle, GWL_EXSTYLE,
    GetWindowLong(Application.Handle, GWL_EXSTYLE) or WS_EX_TOOLWINDOW);
  {$POP}

  // プレビューの実行
  Form1.PreparePreview(ParentHWND);

  Application.Run;
end.

フォーム側のコードは以下。TFormの上に、TTimer (TimerMonitor) を置いてある。

_Unit1.pas
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls,
  Windows, Variants;

type

  { TForm1 }

  TForm1 = class(TForm)
    Label1: TLabel;
    StaticText1: TStaticText;
    TimerMonitor: TTimer;
    procedure TimerMonitorTimer(Sender: TObject);
  private
    FParentHWND: HWND;
  public
    procedure PreparePreview(AParent: HWND);
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

procedure TForm1.PreparePreview(AParent: HWND);
var
  R: TRect;
begin
  FParentHWND := AParent;

  // フォームの拡張スタイルから「タスクバー表示フラグ」を除去して
  // 「ツールウィンドウ」属性を付与
  SetWindowLong(Handle, GWL_EXSTYLE,
    (GetWindowLong(Handle, GWL_EXSTYLE) and not WS_EX_APPWINDOW) or WS_EX_TOOLWINDOW);

  // フォームのスタイルを「子ウィンドウ」化してタイトルバーなどを除去
  SetWindowLong(Handle, GWL_STYLE,
    (GetWindowLong(Handle, GWL_STYLE) or WS_CHILD) and not
    (WS_POPUP or WS_CAPTION or WS_THICKFRAME));

  // 親ウィンドウをプレビュー枠に設定
  Windows.SetParent(Handle, FParentHWND);

  // サイズ合わせ
  Windows.GetClientRect(FParentHWND, @R);
  SetBounds(0, 0, R.Right, R.Bottom);

  // 表示。これでLCLの描画サイクルが正常に回る
  Self.Visible := True;

  TimerMonitor.Enabled := True;
end;

procedure TForm1.TimerMonitorTimer(Sender: TObject);
begin
  // 親ウィンドウが消滅(設定画面が閉じられた)したらアプリ終了
  if (FParentHWND <> 0) and (not IsWindow(FParentHWND)) then
    Application.Terminate;
end;

end.

_Unit1.lfm (フォームデザイン用ファイル)

もしかすると予想を外しているかもしれないけれど…。Lazarus の場合、ParentWindow にHWNDを代入してしまうとよろしくない状態になるような気がしている。何か色々と処理をしてくれるのだろうけど、それが今回は裏目に出ていたのかもしれないなと…。

ParentWindow を使った場合も、親ウインドウと子ウインドウの関係は一応実現できているようではある。親ウインドウの位置を移動すれば子ウインドウ扱いになっているはずのフォームも一緒になって動くので…。ただ、今回のような場面では、ParentWindow を使わずに、WindowsのAPIを逐一呼んで処理したほうが間違いないのかもしれない。

悩ましいのは、どうやってフォームを閉じる/終了させるタイミングを知ればいいのか…。今回は TTimerを使って、一定時間毎に親ウインドウが消滅しているかチェックして、親が居なくなっていたら自身も終了する処理を入れてある。コレが無いと「スクリーンセーバーの変更」ウインドウ上でリスト選択を切り替えた時にプロセスが残り続けてしまう。

ただ、以前試した際は、自身が非表示にされたかどうかまでチェックして終了させていた。今回はそのチェックをしなくても終了できているので、親子の繋がり方が以前とは何か違っているのかもしれない。

余談。AIに尋ねていたら、フォーム上のパネルを切り離して、そのパネルを親ウインドウの子ウインドウにする方法まで提示してきた。試してみても、フォームまで表示されたり、パネル上のラベルが表示されなかったり、背景色変更すらできなかったりしたので諦めてしまったけれど、そういう発想もあるんだなあ、と…。

#2 [lazarus] Lazarusでクラス名をリネームしたい。その2

Lazarus 4.4 で、クラス名をリネームしたい。環境は Windows11 x64 25H2。

ソースコード(.pas、.lpr)上では、リネームしたい場所にカーソルを置いてF2キーを押せばリネーム用のダイアログが表示されてリネームできるけど…。フォームデザイン用ファイルの .lfm 側は修正されないままなので、仕方なくテキストエディタで .lfm を開いて手作業で書き換えていた。

_Lazarusでクラス名変更ができなくてハマった - mieki256's diary

ただ、今回触っていたら、フォームのプロパティの Name を書き換えるだけで、クラス名をコード側の記述で置き換えてくれることに気づいた。

これなら簡単にリネーム作業ができそう…。

#3 [lazarus] Lazarusのデバッガの使い方を少しだけメモ

Windows11 x64 25H2 + Lazarus 4.4 でデバッガの使い方を少し調べた。

ソースコード中の一時停止したい場所にカーソルを合わせて、行番号の少し前のあたりをクリックすると、丸くて赤い「?」アイコンがついて、ブレークポイントを設定できる。

実行(F9)をすると、ブレークポイントの場所で一時停止できる。


これだけでも、期待通りに処理が進んでいるか確認ぐらいはできる。

変数の値を確認 :

表示 → デバッグウインドウ → ローカル変数 (Ctrl + Alt + L)、を選べば、その時のローカル変数が全て表示されるウインドウが開く。

あるいは、ソースコード内の監視したい変数名の上で右クリック → デバッグ → 監視追加(Ctrl+F5)。これで Watchesウインドウに、監視したい変数が追加されていく。

#4 [nitijyou] ワイヤーその他を購入

ダイソーリオンドール須賀川店で、ワイヤー(針金)その他を購入したことをメモ。


郵便受けを外壁に針金で引っ掛けているけれど、頻繁に外れてしまうらしいので、直径3mmの針金を買ってきた。これで置き換えてみて改善すればいいけれど…。

台所の椅子のキャップが外れてしまっていたので、代替品を購入。サイズはちょうどイイ感じだったけど、装着したら何故か椅子がグラグラする…。何度かつけたり外したりしたけど改善せず。底面に貼ってあるフェルトの厚みにばらつきがあるのだろうか…?

CanDoイオンタウン須賀川店でおにぎりケースを購入。


この手のおにぎりを作るグッズはケースに直接ごはんを入れる使い方を推奨していて洗うのが面倒で結局使わなくなってしまったのだけど、ラップを引いてから使えるよと謳ってたので気になって買ってしまった…。

2026/02/04(水) [n年前の日記]

#1 [delphi][lazarus] スクリーンセーバーのラッパーをgithubにアップロードしておいた

Windows11 x64 25H2上で、Delphi 12、Lazarus 4.4 を使って、フルスクリーン表示する外部プログラムをWindows用スクリーンセーバとして呼び出せるようにするスクリーンセーバのラッパーを作成してみたので、githubにアップロードしておいた。

_mieki256/SSWrapDp (Delphiで作成した版)
_mieki256/SSWrapLz (Lazarusで作成した版)

ついでにC#で作った版も再掲(?)しておく。

_mieki256/CsSSWrap (C#で作成した版)

以前も似た動作をするスクリーンセーバのラッパーをHSPで作成したことはあるのだけど。

_mieki256/scrsavwr: Screensaver wrapper on Windows

HSP版と比べたら、GUIで指定できる分、まだ簡単に使えるのではないかなあ、と…。

余談 :

スクリーンセーバという今では誰も使わないジャンルのプログラムを、Delphiという今ではほとんど使われてない開発環境で作成するという…。これってプログラミング的に二重苦なのでは?

でも仕方ない。「ひょっとしてこういうプログラムを作れるのではないかな」と思いついちゃったので。作れそうなら作ってみないと気分がスッキリしない…。

最初は C# で作ってみたけれど、生成されたexeが100MBを超えて、githubから「こんなファイルサイズ、アップロードさせねえぞ!」と怒られてしまって。

AI君(Google Gemini)に「Windows用のGUIアプリを作った時に生成exeが小さくなるプログラミング言語って無いのかねえ」と尋ねてみたら「だったらDelphiがオススメっスよ!」と言われて、「Delphiかあ…。触ったことないんだよなあ…。せっかくだからちょっと触れてみるか」と試用を始めてみたところ…。

生成されたexeはたったの数MB、コンパイル爆速、GUIのレイアウトデザインはめっちゃ簡単で、「これいいじゃん! スゴイ!」と感動して C#版とほぼ同じプログラムを作成してみたものの。

Delphiのお値段を調べてみたら何十万円もすると知り、「無償利用可能な Community Edition が今後消滅したらコンパイルすらできない状況に追い込まれるよなあ…」と怖くなってきて、オープンソースの Lazarus も試用してみる気分になってきて。

しかし Lazarus は Delphi ほど色々イイ感じに処理してくれるわけでもなく、「Delphi でやってたコレは、Lazarus はでどうやるんだ?」と何度かハマってこんなに時間がかかってしまった…。

.NETって必要なのかな :

そもそも C# で作ったexeのファイルサイズが大き過ぎるのがいかんのや。

いやまあ、.NETのランタイムまで含めているからそのサイズになってしまうので、ランタイムを含めなければ数MBで収まるけれど。しかしその場合、動かしたい環境に .NETのランタイムを別途インストールしないといけない。そんなの面倒臭い。OSが最初から持っている機能を呼び出すだけで同じことができるならそれでいいじゃん…。.NETって本当に必要なの…?

でも、その昔、Visual Basic でアプリを作成していた頃も、Visual Basic のランタイムを別途インストールするのは当たり前だったよな…。そう考えると、.NET のランタイムをそれぞれインストールしてくださいとユーザ(?)にお願いするのも、実はさほどおかしなことではないのかもしれない…?

#2 [cg_tools][windows] 画像の順番を並び替えしたい

Windows11 x64 25H2上で、画像の順番を並び替えたい。ファイル名が "00001-xxxxxxx.png" みたいな感じになってる複数の画像ファイルを対象にする。


こんなことができるソフトはあるのだろうか…。

XnView MP ならできるらしい。


一括名前変換ウインドウ内で以下を指定する。
「^」が行頭にマッチ。「\d{5}」は5桁の数字になる。「(」「)」で囲むとその範囲が一時記憶されて、\1、\2、\3等で後から参照できるようになる。

これで目的は果たせた。ありがたや。リネーム時に元ファイル名を指定できたり、正規表現で置換できるのが便利だなと…。

#3 [cg_tools] Adobe Animate(Flash)が消滅するらしい

思考メモ。

ネット上のニュースを眺めてたら、Adobe Animate (旧名 Adobe Flash)が消滅するという話を見かけた。

_アドビ、「Adobe Animate」の提供を終了へ 〜ダウンロード済みならしばらくは利用可能 - 窓の杜
_「Adobe Animate」提供&サポート終了へ
_Amazing Flash: Animate 廃止!

ひでえ…。それはひどすぎる…。アニメ業界ではまだまだFlash使って2Dアニメを作ってる人達が居るのに…。「異世界かるてっと」とかFlashで作ってるのに…。「羅小黒戦記(ロシャオヘイせんき)」もFlashで作ってそうだけど。本編映像の中に出てきたビルの看板に「I love FLASH」という文字を見た記憶が…。欧米の2DアニメもFlash無しでは成り立たんのでは…。

アニメーターさん達から道具を奪い取るつもりか…。Adobeは鬼か…。血も涙もねえ…。

いや、前々からAdobeってちょっと怪しい企業だなとは思ってたけど。クリエーター側のことを考えてない節があるよな…。だからこういうことを平気でやれるんだろう…。

これからはもう販売しないというなら、いっそオープンソースにしてほしいけど…。後はどうしても必要だと思ってる連中が自分達でメンテナンスしろや、これでウチの責任は果たしたからな、今後はウチに文句を言うな、みたいな。まあ、そうはならんのだろうけど。今後この製品では儲けが出ないと判断してるからこういうことをするのだろうし、だったらオープンソースにしたところでダメージは何もないはずだけどな…。

などと憤慨していたら。

_「Adobe Animate」のサポート終了が撤回、“アクセスの中止や削除の予定はない" - 窓の杜
_Adobe、「Adobe Animate」のサポート終了宣言をまさかの撤回。新機能の追加はしないけど販売&サポートは継続へ - AUTOMATON
_米Adobeが「Adobe Animate」終了を撤回 「アクセスを停止、削除することはない」 - ITmedia NEWS
_Amazing Flash: Animateはメンテナンスモード

こういう内容を慌てて発表するぐらいに苦情が入ったのかな…。自分達の製品がどこでどういう使われ方をしてるのか全然把握していないのでは…?

でも、代替ソフトを今のうちから探して移行しておかないとマズいのだろう…。今後Adobeが何をしてくるか分かったもんじゃないし…。

代替ソフトについてもやもやと考える :

代替ソフトって何があるんだろう…。

とりあえず自分は Moho を触って、「アニメ制作ならこっちのほうが全然いいじゃん。カメラも用意されてるし」とは思ったけれど。Webブラウザ上でいかにリッチな体験をさせるかに注力しちゃってた Flash と違って、あくまでアニメ制作に特化したソフトとして開発されてきた点は安心できる。

ただ、Moho も開発会社の先行きがちょっと…。インターネット経由でアクティベーションしないと使えないソフトだから開発会社が潰れるとソフトも使えなくなっちゃう。それでなくても少し前に権利元の会社が変わってアクティベーション用サーバも変わったから新版のバイナリをインストールしないと使えない状態になってたし。生殺与奪の権を他人に握られてるという点では Adobe Animate とこれっぽっちも違いが無い。

かつてFlashを使って仕事をしてた有名アニメーターのりょーちも氏は Adobe の姿勢に見切りをつけて blender に移行していたはずなので、blender がどの程度 Flash の代わりになるのか知見を持ってそう…。そのあたりどこかで呟いてくれないものか…。

OpenToonzも、ベクター線で描画したり自動中割したりできるんだよな…。カット単位での作業範囲なら代替になりそうな気もする…。そもそもスタジオジブリが使ってたソフトの延長線上にあるソフトだから実績もあるし。

blender も OpenToonz も、金銭的な導入コストがかからないし、アクティベーションが不要だからローカルにインストール済みなら確実に使い続けられるので、その2点は魅力的に思える。

Toon Boom というのもあるらしいけど触ったことがないから分からない…。お値段もめっちゃ高いらしい…。

1枚1枚ガシガシ描くやり方でいいなら CLIP STUDIO PAINT があったか…。あのソフトもベクター線で描けるから、後から線の調整ができそうな…。でも自動中割は無かったはず。

自動中割と言えば CACANi だけど、描画ツールの手触り(?)はどうだったかな…。以前少し試用した記憶はあるけれど、忘れた…。

そもそも Adobe Animate のどのあたりが他のソフトと比べて優れているのか、そこが自分は分からないので、それぞれ代替になるのかどうか…。部分的には代わりになっても、全部このソフト一本で、というわけにはいかない気もする。もっとも、全部できます系のソフトって、各部分は痒い所に手が届かなかったりしそうでもある…。餅は餅屋で、それぞれの強みを組み合わせていくほうが良かったりしないか…。

ただ、「そろそろ Adobe Animate は消しますよ?」とAdobeが予告してきたわけだから、これからもずっと使い続けることができるぞ安心安心、とは思わないほうがいいよな…。「なんでいきなり消すんだ!」「えっ。この前終了するってほのめかしたじゃん? アンタ今まで何してたの?」と言われかねない…。

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

#4 [nitijyou][neta] カラスって頭がいいのだな

犬の散歩をしていたら、交差点でカラスがクルミっぽいものを上から落として割ろうとしている光景を目撃した。

仙台のカラスはクルミを道路に落として車に轢かせて割って中身を食べる、というニュースを目にした記憶があるのだけど。このあたりのカラスもそういう技を会得しつつあるということかな…。カラスって頭いいなあ…。

もっとも、今日目撃したカラスはまだそこまで分かってない感じだった。車が走る軌道を意識して車の前に落としてたわけではなく、交差点の真ん中に何度も落としてただけなので…。交差点にクルミを落とすと何故かクルミが割れることがある、ぐらいの認識はありそうだけど、車のタイヤがクルミを割る道具として使える、という気づきまでは得られてない段階なのかもしれない。

何にせよ、カラスの頭の良さには期待してしまう。人類が滅亡した後、地球を支配するのはおそらくカラスではなかろうか…。そういう異世界モノはどうだろう。いや、キャラの区別がつかないか…。皆真っ黒だろうし…。いやいや、頭の一部の羽に色をつけるのがオシャレとされている、みたいな設定を持ち込めばどうにか…。

2026/02/05(木) [n年前の日記]

#1 [opentoonz] OpenToonz 1.8プレリリース版を試用

無料で利用できるアニメ制作ソフト OpenToonz のベクター描画機能が気になって、安定版であろう OpenToonz 1.7.1 を少し触っていたのだけど。ググっているうちに 1.8 プレリリース版があると知った。

_Releases - opentoonz/opentoonz

1.7.1 は2023/05/10に公開されたけど、プレリリース版は 2025/11/23 に公開されている。2年分のパッチが当たっているそうで…。

せっかくだから試用してみることにした。環境は Windows11 x64 25H2。

前述のページ内の、Assets と書いてあるところをクリックするとファイル一覧が表示される。OpenToonzPortable.zip をクリックしてダウンロード。解凍して任意の場所に置いて、中に入っている OpenToonz.exe を実行すれば起動する。

少し触ってみた程度だけど…。ブラシツールの挙動が改善されている、ような? 1.7.1では平滑化の数値を上げるとマウスカーソル位置から遅延というか、カーソル位置を追いかけて描画される様子が表示されていたけれど、1.8プレリリース版ではカーソル位置と描画位置が合ってるように見えるので、描いていてまだ感覚的にしっくりくる。

メニューのウインドウをクリックして選べる種類も増えていた。と思ったけれど、1.7.1 でもワークスペースの初期化を選んだら、1.8プレリリース版と同じ表示になった…。どうやら自分の環境は古いOpenToonzを使っていた頃の設定がずっと残っていて、本来出てくるべき項目が出てこない状態になっていただけかもしれない…。

何にせよ、2年分のパッチが当たってると言うことはバグもそれだけ取れているはずだろうから、プレリリース版を使ったほうがいいのかもしれないなと…。今後はプレリリース版で作業していくことにする。

とりあえず、自動中割について再勉強中。

_mieki256's diary - OpenToonzの自動中割り関係の操作方法を調べていたり

OpenToonzのプロジェクトの保存先を変更 :

自分の環境では、OpenToonzのプロジェクト保存先が以下になっていた。

D:\OpenToonz stuff\projects\

通常は C:\OpenToonz stuff\projects になっているらしいので、インストール時に場所を指定したのかもしれない。

ただ、今後は以下の場所にしたいわけで…。

D:\home2\Pictures\_work\opentoonz_proj\

以下の手順でプロジェクトの保存先を追加できるらしい。

  1. ファイル → 環境設定 → 一般 → Project Rootの追加 → カスタム、にチェックを入れる。
  2. 「追加する Project Root パス:」に任意のフォルダのパスを指定。

これで新規プロジェクト作成時に、デフォルトの場所と追加場所のどちらを使うかを選べる。

#2 [lazarus] Lazarusのコードを分岐したい

Lazarus用のソースコード内で、分岐をしたい。

_動作 OS に合わせてコードの分岐を行う Pascal - Qiita
_$IF - Lazarus wiki

C言語と似た感じで、コンパイラ? プリプロセッサ? に指示を出せるらしい。

{$define HOGE}

{$ifdef HOGE}

{$else}

{$endif}

ちなみにC言語なら…。

#define HOGE 1

#ifdef HOGE

#else

#endif

_C言語基礎知識12(#ifとは:条件付きコンパイル) - Project_OKI's diary

昔、C言語を使ってた頃は、#if 0 - #endif をちょくちょく使ってたような…。一度書いてはみたけど結局使わなくて、だけど後でまた必要になるかもしれない処理をごっそりコメントアウトできて便利だった気がする。

2026/02/06(金) [n年前の日記]

#1 [opentoonz] OpenToonzの自動中割機能がなんだか妙

Adobe Animateが終了するという話をキッカケにして代替ソフトになりそうなものはあるのかどうか少し調べ始めたのだけど、OpenToonz 1.8プレリリース版で自動中割を試していたらなんだかちょっと妙な動作をすることに気が付いたのでメモ。

以下のようなテストをしてたのだけど…。





直線で描いてたものが曲線になってしまうのでは、直線で描かれたメカの自動中割は無理っぽいな…。もっとも今時のアニメってメカは3DCGで描いちゃう(?)場合がほとんどだから、あえて手描きでメカを描いて、しかも自動中割で処理する場面なんてまず無さそうだけど。

他のソフトで試してみた :

自動中割機能を持っている他のソフトで試してみた。そちらでも似たような結果になるなら OpenToonz の処理結果も妥当となるけれど…。

Moho 13.5.5 (有償ソフト)の場合。期待した通りの中割になった。




Blender 4.2.9 LTSの場合。これも期待通り。

_Blender - The Free and Open Source 3D Creation Software - blender.org
_Download - Blender




enve 9/25/2022版。これも期待通り。

_enve | Open-source 2D animation software
_MaurycyLiebner/enve: Flexible, user expandable 2D animation software for Linux and Windows.




Friction 1.0.0-rc3。これも期待通り。

_Friction
_friction2d/friction: Friction Graphics




Flash (Adobe Animate) や Cacani ではどうなるんだろうか…。

何にせよ、他のソフトではそうならないわけだから、OpenToonz の自動中割機能はやっぱりなんだかちょっとおかしい動作になっている気がする。回避策でもあればいいのだけど。

余談 :

「自動中割なんてフツー使わねえよ」と言い出す人が出てきそう…。使い方次第だと思うけどな…。「サイエンスSARU flash」でググれ。

「どうせそのうちAIが中割してくれる」と言い出す人も出てきそう…。Adobeの中の人もそう思ってて Adobe Animate を終わらせると言い出したのかもしれない…。早くそんな時代が来てほしい。実写映像ならかなりイイ感じになってきてるし、あちこちでアニメの中割ができないか研究開発されてるけど…。

2026/02/07() [n年前の日記]

#1 [opentoonz] OpenToonzの自動中割機能がやっぱりよくわからない

OpenToonz 1.8プレリリース版の自動中割機能の挙動がよく分からなくて色々線を引いて試してたのだけど…。やっぱりよく分からない…。

1フレーム目をコピーして、最終フレームに貼り付けて、そこから制御点を移動すればおかしくならないのではと試してみたけれど、やっぱり変な軌道を描くように中割りされてしまう…。

図形描画の折れ線を使って描けば、直線が曲線で中割されてしまう状況を避けられるのではないかと試してみたけれど、それでも曲線になってしまう時がある…。必ずそうなるわけでもないけど、必ず回避できるわけでもない。わけがわからないよ。

2026/02/08追記 :

キャプチャ画像を撮ってみた。

OpenToonz 1.8プレリリース版。こんな簡単な図形なのに何故か上に行ってから下に戻ってくる…。

openntoonz18pre_nakawari_ss.png


Moho 13.5.5。まあこうなってくれるよなという感じで中割してくれる。

moho_nakawari_test2_ss01.png

2026/02/08() [n年前の日記]

#1 [nitijyou] 選挙に行ってきた

衆議院選挙の投票日だったので、近所の公会堂まで電動アシスト自転車で行ってきて投票してきた。

自分以外の家族は期日前投票をしていたのだけど、もしかしてそういうスタイルのほうが流行ってるのだろうか…。投票所にはほとんど人が来てなかった。いや、外の気温が氷点下だったせいもあるのだろうか。こんな時期に選挙するなや、とチラリと思ったりもする。

2026/02/09(月) [n年前の日記]

#1 [dtm] ゲーム音楽と電子音楽云々

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

たまたま何かの拍子に以下のような言説やエピソードをネット上で目にして、なんだか色々考えてしまったのでメモ。思考メモ。

自分は音楽関係の歴史も知識も全くないのでたぶん頓珍漢なことを書いてると思う…。

日本初の電子音楽を作った方 :

見かけたのは以下のような話で…。

「1990年代当時、ゲーム音楽は電子音楽として評価されてなかった」
「1990年頃、『題名のない音楽会』で、司会の黛敏郎(まゆずみとしろう)氏がドラクエ4の音楽をdisってた」

後者については以下のページでその発言内容が読める模様。けちょんけちょんですな…。音楽のみならずストーリーまでボッコボコ…。

_メモ:題名のない音楽会でのドラクエ批判|ムゲンホンダナ:漫画を100年読んでみた

恥ずかしながら自分は知らなかったのだけど、黛敏郎氏は日本で初めて電子音楽を作った方だそうで。1955年にNHK電子音楽スタジオで3つの曲を作っていて、それが日本初の電子音楽とされているのだとか。

_黛敏郎 - Wikipedia

個人的に興味深いと思ったのが、その際に作った3つの曲のタイトル。

  • 素数の比系列による正弦波の音楽
  • 素数の比系列による変調波の音楽
  • 矩形波と鋸歯状波のインヴェンション

ファミコンの音源チップの仕様を知ってる方なら「おっ?」と思うはず。正弦波、矩形波、ノコギリ波 ―― それってファミコンの音源チップが出せる音色そのものじゃないですか…! *1

_ファミコン音源のスペック - MCK Wiki*
_矩形波?パルス波?三角波とは?ファミコン風の音色をめちゃくちゃ簡単に説明してみた(動画) | さまようけんばん

ドラクエ4が発売されたのが1990年。そして黛敏郎氏が日本初の電子音楽を作ったのが1955年。

つまり、ドラクエ4から35年も前に、ファミコンとほぼ同じ音色を使って、日本で初めて電子音楽を作った方が居て、その方がドラクエ4の音楽をけちょんけちょんに批判していたと、そういう状況なのですな…。

それは新しい音楽なのか :

じゃあ、黛氏が作った曲って一体どういう曲なのよ?

気になってググって少しだけ聴いてみたのだけど、正直「お、おう…」って感想に…。いやー、現代音楽ってなんというか…難しそうな世界なんですね…。

ただ、聴いているうちになんとなく想像したのだけど、これはもしかして、黛氏は新しい音楽を作ろうとしていたのではないのかなと。

電子音という、自然界にはおそらく存在しない新しい音を出せる楽器が目の前にあったとして、その新しい楽器で奏でるべき音楽とは一体どんな音楽なのか? それはもちろん今まで世の中に存在しなかった新しい音楽だろう。そうじゃないと許されないのではないか。作曲家を名乗る以上ここで新しい音楽を提示できなかったら、これはもう恥ずかしいことだぞ…。

そんなことを思いながら、件の3曲を作っていたのではないのかなあ、と…。

さて、そういう思いを持ちながら電子音楽に挑んだ方が、35年後に登場したファミコンの音楽を聴いた時、一体どういう感想を持つのだろうと想像してしまうわけでして。

まず…。「35年も経ってるのに俺が出してた音とコレほとんど同じじゃねえか!? お前達今頃何をやっとるんじゃ?」と呆れそうではあるかなと…。

加えて、「出てくるフレーズはクラシックのxxxxやxxxxの借り物ばかり…。俺は新しい音楽を作ろうとあんなに苦労してたのに…。お前らそれでいいのか? そんな志の低いことやっとってええんか?」という気持ちもあったのではないのかなあと。

もちろん、NHKのスタジオでしか使えなかった、おそらく高額な機材と同等レベルの楽器が、楽器とは一切名乗ることなく日本中の各御家庭に入り込んじゃって、しかも子供達がそれらの音に触れて楽しんでるというその状況自体、今まで世の中になかった全く新しい状況なわけで…。全体を眺めると間違いなく新しさはそこにある。いやはや凄い時代になったな…と思えてきそうなものだけど。

ただ、実際にそこで鳴ってる音楽だけを、あるいは再生されてるストーリーだけを取り出すと…。そりゃまあ低評価になるのもやむなしかなと…。だって、新しさがないもの。どこかで聴いたフレーズ、どこかで見たストーリー、そんなのばかりだもの。

実際のところはどうだったのか分からないのだけど、もし、「新しい道具が手に入ったんだからお前らもっと新しいもの作れや!」という志向性を持ちながら創作活動に勤しんでいた人物なのであれば、ファミコンのアレコレって低評価にもなるよなと…。同時に、こんな借り物だらけのものを食べずに元ネタを食べなさい、オリジナル版に触れなさい、という気持ちも出てくるかもしれないなと…。

要するに、「お前らガンダムSEED見て喜んでるんじゃねえよ1stガンダムを見ろ1stを」おじさんの音楽版、みたいなところがあったのかなあと…。知らんけど。

それはともかく。「新しい道具が手に入ったのだからお前ら新しいもの作れ!」という思想が仮にあったのであれば…。そこだけは今の時代でも聞き入れたほうが良いのかもしれんよなと…。

「おうおう黛先生よ随分言ってくれたじゃねえか。俺達だってそのうちなんかしら新しいもの作ってやるわい。草葉の陰からしっかり見とけやいつかぎゃふんと言わせたるで」ぐらいの気持ちをこっち側が持っていても損はないよな…。

お手本の有無 :

ただ、新しい楽器が手に入ったのだから新しい音楽を作らねばと模索してたのはおそらく少数派で…。世間の大勢としては、この新しい楽器で既に存在するフツーの音楽にどうやって近づけていくか、という志向があったような気もするなと…。

自分は8bit PCの時代からPCを触っているので、PCやゲーム機の音源の変化も一応ざっくり知ってるけれど…。

  1. 鳴ってるか鳴ってないか、それしかないブザー音。(PC-8001)
  2. 周波数を指定できるようになった矩形波単音。(MZシリーズ)
  3. 矩形波を3音も鳴らせる上に音量指定までできるPSG。(PC-6001等)
  4. 波形を変化させられるFM音源。(PC-8801mkIISR等)
  5. 楽器の音を録音再生できるADPCM/DPCM/PCM音源。(X68K等)

このあたり、「どうやったらフツーの音楽をPC/ゲーム機でも鳴らせるようにできるかなあ」と模索してきた末の進歩だったなと…。既にどこかにお手本があって、そのお手本にどうやって近づけるか。そんな流れでコンピュータ関係の音源って発展してきたよなと。

そして、各音源で鳴らす音楽も、既存の音楽にどうやって近づけるか、という志向で作られていって…。すぎやまこういち氏がドラクエにクラシック音楽的な構成を盛り込んだのもそうだろうし、古代祐三氏がベアナックルシリーズにああいう曲調を盛り込んだのもそうだろうし。

そう考えると、電子音楽には派閥が2つあったのではないかと。
  • 新しい楽器なんだから新しい音楽を作らねばなるまいよと、お手本が無いまま試行錯誤していた派。
  • 新しい楽器で既存の音楽にどこまで近づけられるかなと、お手本をチラ見しながら試行錯誤していた派。

ゲーム音楽は圧倒的に後者。そりゃ前者から見たらこんなの評価に値しないと一刀両断されて当然の流れ、だったのかもしれんなと…。

しかし、世間にウケるのはどちらかというと、これは後者だろうなと。前者はちょっと理解するのが難しい…。

このあたり、ダウンダウンの松本氏が昔語ってたらしい話を ―― 「笑いの肝は飛躍」という説が思い浮かんだりもするのです。

落語家や漫才師が喋ってる内容に飛躍があった時に笑いは生じるけれど、あまりに飛躍し過ぎると客がついてこれなくて笑いが取れない。かといって飛躍が足りないとこれも笑いが取れない。前後とちゃんと繋がっていて、たしかに客側でも予測はできるんだけど、フツーはそんなところに繋げないよ、といういい塩梅で飛躍できた時に笑いが取れるんだ、という話らしいのですが。

音楽も同じかもしれない。黛氏の作った3曲は明らかに飛躍があってスゴイのだけど、あまりに飛躍し過ぎていて大衆はちょっとついていけない感じがする。だけどすぎやまこういち氏は既存の音楽の延長線上を感じさせていくれる実にいいバランスの飛躍に留めていたから大衆に受け入れられた。そんな状況だったりしないかと…。

斬新過ぎたらウケない。けれど新規性が何もなかったらそれもやっぱりウケない。新しいけど新しくない。新しくないけど新しい。そのバランスが大事なのかもしれんなあ、みたいな。

でもまあ、こういうのって「商品として作るなら」という話に過ぎないけれど…。これはあくまで作品なんや、商品としては全然考えてない、ウケるとかウケないとか関係ない、ということならいくらでも飛躍しちゃっていいよな…。

余談。CGも同じ部分がありそう。CG創成期は「フラクタル理論を用いてこんな映像を作ってみました」とカラフルなスライムもどきがウネウネと動く感じの斬新な映像が発表されたりしていたけれど、今現在は映画のVFXに代表されるように、現実世界にありそうな風景をここまで再現できるようになりましたよ、という流れが主流で…。どちらも現実世界には存在しない光景を描いているけれど、お手本がどこにもない映像と、お手本が既にある映像と、一体どっちを目指すのか、みたいな。

お手本が無いとどこを目指せばいいのかそもそも分からないし、お手本があったらあったで成果物との差異が気になって仕方ない。どっちもそれなりに苦労があるのは同じだし、どちらが正解というわけでもないですが。

翻訳作業も大事 :

あっちの畑では既に山ほどあるけれどこっちの畑にはまだ全然無いな、ちょっとこっちにも持ってきてみよう、さてどうなるかな、という事例って結構あるように思っていて、自分はそれを「翻訳作業」と呼んでたりするのですが…。

  • 漫画に悲劇を持ち込んだ手塚治虫先生。
  • 漫画に詩的表現を持ち込んだ石ノ森章太郎先生。
  • 児童漫画にSFを持ち込んだ藤子不二雄F先生。
  • ロボットアニメにリアリティを持ち込んだ富野監督。

他にも色々あるけれど、別の畑にあった何かしらをこっちの畑でも使えるように翻訳することで、こっちの畑の幅が広がるというか、豊かになるというか。そのうちあっちもこっちから何か持っていったりして、そうやって色んな畑がどんどん豊かになっていく…。

口の悪い人なら「なんだソレ只のパクリじゃん」と言い出すだろうけど。ソレ、ちょっと違うんだよな…。まず、「あっちの畑にはあるけどこっちにはねえな?」と気づけないとそもそもパクることすらできない。そして気づくためには、あっちの畑のこともそこそこ知ってないといけない。こっちの畑のことだけ知っててもダメなのです。

手塚先生が「漫画家になりたいならジャンルを問わず色んな作品に触れなさい」と言ってたのもそうだろうし、富野監督が「アニメばかり見るな!」と言ってるのもそうだろうけど。あっちの畑のことも少しは知らないと、そもそも何を翻訳できそうなのか気づくことすらできない。こっちの畑で延々とコピーを繰り返していても、歪さだけがどんどん育ってしまう…。

そしてゲーム音楽って、いや、音楽に限らずゲーム自体がとにかく翻訳しまくりで…。

  • アニメみたいな映像をPCゲームでも再現できないものかとスクウェアは「クルーズチェイサー ブラスティー」を作ったりしていたし。
  • PCゲームとして流行ってたRPGをファミコンに持ち込めないものかと「ドラクエ」「FF」が作られたし。
  • 少年漫画内で発生する異性との各種イベントを疑似体験できないものかと「ときメモ」が作られたし。

ゲームに詳しい人ならいくらでもそういう事例をリストアップできるだろうけど、そうこうしてるうちにゲームで表現できる幅がどんどん広がっていったところはあるよなと…。

黛敏郎氏は、ゲームという畑のことを何も知らなかったのかもしれない、という気はする…。当時、小説や漫画や映画にはあるけれどゲームにはまだ無かったものがたくさんあって、ドラクエのストーリーも、ドラクエの音楽も、ゲームという畑に翻訳してきたわけだけど。ゲームの世界にはまだそれがないということを知らずに「こんなもの、あっちの畑にもうあるじゃねえか」と言ってただけ、かもしれんなと…。

いや、自分だって氏がどんな人物だったのかほとんど知らないので、これまた頓珍漢なことを邪推してる可能性も高いのだけど。あっちの畑(現代音楽畑/電子音楽畑)の視点からなら納得の発言なのかなあ。自分はあっちの畑のことを全然知らないから…。そのへん解説できるのは、電子音楽とゲーム音楽、両方の畑に詳しい人じゃないと難しいのだろうな。

ゲーム音楽って電子音楽なんだろうか :

さておき。ゲーム音楽って、電子音楽なんだろうか…?

電子技術の塊から音が鳴ってるから当然電子音楽だろと言われそうだけど、個人的にはあまり意識した記憶が無い…。PCにしろ、ゲーム機にしろ、楽器の一種と呼べなくもないかなあ、とは思うけど…。

そもそも今現在、クラシックをやってる方や生楽器を演奏してる方は別にして、大半の音楽はコンピュータや電子楽器で作ってるのだから、世の中にある大半の音楽は電子音楽になってしまっているのではないか…。こんな状態で、これは電子音楽、これは電子音楽ではないと分類する行為に意味はあるんだろうか。いや、1990年頃なら意味があったかもしれんけど…。

このあたり、SF作品に含まれていた要素が色んなジャンルに浸透していって、もはやSFというジャンルが空気のようになったソレと近いものを感じる。新海誠監督作品やガルパンを見て「ああ、SFアニメだなあ」と思う人なんてほとんど居ないんじゃないかと思うけど、電子音楽というジャンル分けも似たようなものだったりしないか。

それとも、特撮とVFXは違うよ、全然違うよ、みたいな感じで、電子音楽の定義は非常に狭いものになってたりするんだろうか…。よくわからん…。

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

*1: 正確には、ファミコンの音源は正弦波とノコギリ波を出せないのだけど、三角波が出せるから、まあ似たようなものと思ってしまってもいいんじゃないかと…。いや、微妙に音の感じは違うし、今現在の「微妙」って当時なら「劇的」な違いなのだけど、それはさておき。

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

#1 [lazarus] LazarusでWebView2を使いたい

Lazarus 4.4 で作成したGUIアプリのフォーム上に、HTML + JavaScript を表示できるコンポーネント? コントロール? を置きたい。

一般的には、Webブラウザのコンポーネントというか、レンダリングエンジンを利用することになるのだろうけど…。

環境は Windows11 x64 25H2。

パッケージの選択 :

JavaScriptを使わずに、HTMLを表示したいだけなら、Lazarus は TIpHtmlPanel や THtmlViewer というコントロールを持ってるらしい。

_TIpHtmlPanel - Free Pascal wiki
_LazarusでHTMLをレンダリングする - 高見知英の技術ログ
_BerndGabriel/HtmlViewer
_Webbrowser - Free Pascal wiki

ちなみに Delphi の場合は TWebBrowser があるらしい。IEのコンポーネントを利用するのだとか。

_Delphi/400 VCLのTWebBrowserを最新バージョンのIEとして実行し続ける | Migaro. Tips
_サンプル: "TWebBrowserを使ってみる"

今回は JavaScript も動かしたいと思っているので、上記以外を使いたい。

ググってみたら、以下の3つのパッケージが良さそうだなと…。

  • WebView4Delphi : Windows専用。WebView2が利用できる。DelphiとついているけれどLazarusでも使える。
  • fpwebview : クロスプラットフォーム対応。Windows, Linux, Mac で使える。各OSの標準ブラウザのコンポーネントを利用できるようにしてくれる。らしい。
  • CEF4Delphi : クロスプラットフォーム対応。Chromiumベースのブラウザががっつり入ってる。どのOS上でもChromiumベースが使えるけれど、その分ファイル数やファイルサイズが大きくなって100-200MBぐらいは使うらしい。

_WebView4Delphi - Lazarus wiki
_salvadordf/WebView4Delphi
_fpwebview - Lazarus wiki
_PierceNg/fpwebview
_salvadordf/CEF4Delphi

今回は Windows11上で動けばいいと考えているので、WebView4Delphi が良さそうかなと…。

ちなみに WebView2 というのは…。Webブラウザ Microsoft Edge (Chromiumベース)のレンダリングエンジンをアプリに組み込むためのコンポーネント、とAIが言っている。

Windows11は標準ブラウザが Edge だから、WebView2 を別途インストールする必要は無い…はず。

ただ、Lazarus側から WebView2 を利用するためには、橋渡しをする WebView2Loader.dll が必要になるらしい。その WebView2Loader.dll は WebView4Delphi の配布ファイルの中に入っていて、アプリ(.exe)と同じフォルダに置いておく必要がある模様。

WebView4Delphiをインストール :

Lazarus 4.4 の場合、オンラインパッケージマネージャからインストールできる。

  1. パッケージ → Online Package Manager。
  2. 開いたウインドウの検索欄に「webview」と打ち込めば「WebView4Delphi」がリストアップされる。
  3. チェックをつけて「Install」をクリック。
  4. ダウンロード後、Lazarus IDEがビルドされる。数分待たされる。
  5. ビルドが終わると Lazarus IDEが再起動する。

今回は、1.0.1823.32 がインストールされた。

パッケージのダウンロード先は、Online Package Manager の Options → Folders で確認できる。Windowsの場合、デフォルトでは以下になるのかな…。

C:\Users\(USERNAME)\AppData\Local\lazarus\onlinepackagemanager\packages\

WebView2Loader.dll をダウンロード先からコピーして、プロジェクトフォルダに入れないといけない。以下のどちらかを使う。作るアプリが32bit版なら bin32/*.dll を、64bit版なら bin64/*.dll を選ぶ。

C:\Users\(USERNAME)\AppData\Local\lazarus\onlinepackagemanager\packages\WebView4Delphi\bin64\WebView2Loader.dll
C:\Users\(USERNAME)\AppData\Local\lazarus\onlinepackagemanager\packages\WebView4Delphi\bin32\WebView2Loader.dll


github からダウンロードして、パッケージの参照先として設定してインストールする方法もあるらしいけど、そっちは試してない…。

使い方 :

WebView4Delphi のインストールができると、以下の2つのコントロールが利用できるようになる。

  • TWVWindowParent : 表示を担当。
  • TWVBrowser : 制御を担当。フォーム上のどこに置いてもいい。

Lazarus IDE の上のほうに「WebView4Delphi」というタブが増えて、そこから選ぶこともできるし、コンポーネント一覧ウインドウの検索欄に「twv」と言って絞り込むこともできる。

この2つのコンポーネントは両方共フォーム上に必要。表示だけでは制御ができないし、制御だけでは表示ができない。

TWVWindowParent (WVWindowParent1) をフォーム上に置いたら、プロパティの Browser には TWVBrowser (WVBrowser1) を指定しておく必要がある。

ソースコードは、demos/Lazarus/SimpleBrowser/uSimpleBrowser.pas が参考になりそう。

_WebView4Delphi/demos/Lazarus/SimpleBrowser/uSimpleBrowser.pas at main - salvadordf/WebView4Delphi

  • .pas の最後のほうで initialization を記述して初期化。
  • フォームの OnFormShow で GlobalWebView2Loader.Initialized を呼んで初期化する。
  • 初期化に成功したら WVBrowser1.CreateBrowser(WVWindowParent1.Handle) でブラウザを作る、のかな。
  • このソースは TTimer も置いて、初期化に失敗したらタイマーを起動して少し時間が経ってから初期化のリトライをしている模様。WebView2 の初期化はLazarusアプリの処理と非同期で行われるからソースコードの順序通りに動くとは限らないので、こういう処理が必要、とドキュメントに書いてあった気がする。

手元で実験していたけれど、ハマった点としては…。

TWVBrowser の AfterCreated 内で TWVWindowParent#UpdateSize を呼ばないと何も表示されない。UpdateSize を呼ばないとブラウザ部分の表示サイズが小さいままになるっぽい。


また、起動直後にフルスクリーン表示になるようにしてみたのだけど。

  // フォームの全画面表示
  BorderStyle := bsNone;
  WindowState := wsMaximized;

フォームの背景色その他を黒にしていても、数秒ほど灰色のウインドウが表示されてしまう。WebView2 の初期化で時間がかかってるのかな…?

AIに尋ねたら、最前面に黒いパネルを置いて、その時が来るまでフォーム全体をパネルで隠しておいて、TWVBrowser の NavigationCompleted が呼ばれるタイミングでパネルを非表示にする方法を提案された。試してみたところ上手く誤魔化せた。

ちなみに、TWVWindowParent も TPanel も、Align に alClient を指定すればフォーム全体を覆う見た目になる。


ローカルに保存されてるHTMLファイルを開く時は以下。

    WVBrowser1.Navigate(UTF8Decode('file:///' + HTMLPath)):

また、HTMLファイルの内容に相当する文字列を指定する場合は、.NavigateToString() が使える。

2026/02/11(水) [n年前の日記]

#1 [lazarus] LazarusでWebView2を使いたい。その2

Lazarus 4.4 で作成したGUIアプリのフォーム上に、HTML + JavaScript を表示できるコンポーネントを置きたい。

_昨日、WebView4Delphi をインストール して動作確認してみたけれどイイ感じに動いてくれてるようなので、フルスクリーン表示にしたり、キーの押し下げ、マウスボタンの押し下げ、マウスカーソル移動で終了する処理を入れたり、多重起動禁止処理を入れたりしていた。


ここまでやったらスクリーンセーバっぽい動作になった。

さて、ここからどうしよう…。 _先日作成したスクリーンセーバのラッパー っぽくまとめてしまえば、HTML + JavaScript を書くだけでWindows用のスクリーンセーバが作れますよ、という状況が実現できそうな気がしているけれど…。いっそのこと、そこまでやってしまおうか…。

2026/02/12(木) [n年前の日記]

#1 [lazarus] LazarusでWebView2を使いたい。その3

Lazarus 4.4 + WebView4Delphi を使って Windows用のスクリーンセーバを作成しているところ。

リソースファイルにHTMLを含めて使いたい :

リソースファイル内にHTMLファイルを含めて、その内容を文字列として取得したい。AI(Google Gemini)に尋ねたら、以下のような記述を提示された。

まずはリソースファイル。

myresources.rc
MY_HTML_FILE RCDATA "index.html"

STRINGTABLE PRELOAD DISCARDABLE
BEGIN
 1 "SSaver Wrapper JavaScript"
END
  • MY_HTML_FILE が識別名。RCDATA はデータの種類。その直後に埋め込みたいファイル名を記述。
  • STRINGTABLE 部分はスクリーンセーバ名を記述してる。


読み出しには以下の関数を提示された。

{ リソースファイル内のファイルから文字列を取り出す }
function TFullScrnForm.GetHtmlFromResource(ResName: String): String;
var
  ResStream: TResourceStream;
  StringStream: TStringStream;
begin
  Result := '';
  try
    // リソース名と型(RT_RCDATA)を指定してストリームを作成
    ResStream := TResourceStream.Create(HInstance, ResName, RT_RCDATA);
    try
      StringStream := TStringStream.Create('');
      try
        // リソースの内容をStringStreamにコピー
        StringStream.CopyFrom(ResStream, ResStream.Size);
        Result := StringStream.DataString;
      finally
        StringStream.Free;
      end;
    finally
      ResStream.Free;
    end;
  except
    on E: Exception do
      // リソースが見つからない
      ShowMessage('Error loading resource: ' + E.Message);
  end;
end;


上記の関数の呼び出し方は以下。

  // リソースからHTML内の文字列を取得
  HtmlContent := GetHtmlFromResource('MY_HTML_FILE');

  // ブラウザ部分にHTMLの内容を送る
  WVBrowser1.NavigateToString(UTF8Decode(HtmlContent));

#2 [anime] 「ゴジュウジャー」最終回を視聴

録画していた「ゴジュウジャー」の最終回を視聴。

これで戦隊シリーズも終わりか…。なんだかちょっとしんみり…。スタッフの方々お疲れさまでした、と言ってもギャバンを作らないといかんから休んでる暇なんて無いのだろうなあ…。

タイトルからして50作目なのかなと思い込んでいたけれど、ググってみたら49作目だったそうで。ルパンレンジャーとパトレンジャーを2戦隊とカウントしてるから50番目の戦隊、ということだったらしい…。今頃知った…。

50周年というから半世紀ほど継続して作り続けていたのかなと思い込んでいたけれど、「ゴレンジャー」「ジャッカー電撃隊」を作ったけれど「ジャッカー」の人気が出なくて打ち切りになって、そこからしばらくは戦隊モノを作ってなくて、「バトルフィーバーJ」から毎年作るようになったと知り…。継続して作ってなかった時期があるのだから、そのうち戦隊シリーズが復活する可能性も全然あるんだろうなと思えてきた。前例としてはもうあるわけだし。

さておき、ゴジュウジャー最終回については…。個人的には、声優の 関智一さんアカレンジャーに変身するシーンで「ワオ。これはサプライズ!」と喜んでしまった。「夢が叶った!」の台詞はアドリブだろうか…。 ボイスラッガーがとうとう本家のキャラに変身…。これは目頭が熱く…。

#3 [nitijyou] 下池の水が抜かれてた

近所の下池の水が抜かれていた…。真っ白で大きい鳥が泥の中に一羽だけ立っていた…。水があった頃はカモの群れも浮かんでいたのだけど…。鳥達のオアシス(?)がどんどん無くなっていく…。

水を抜かれた状態だと、池の底が浅くなってたことが分かりやすかった。アレはもしかして、上池の埋め立てで使ったけれど、下流に流されてしまった土だったりしないだろうか…。もしそうだとすれば、下池を埋め立てた場合も、土が下流にごっそり流れていきそうだなあ…。マズいことにならないか…。

2026/02/13(金) [n年前の日記]

#1 [lazarus] LazarusでWebView2を使いたい。その4

Lazarus 4.4 + WebView4Delphi を使って Windows用のスクリーンセーバを作成しているところ。

キーの押し下げが取得できない :

WebView2部分をマウスクリックしてフォーカスを移すと、フォーム側の OnKeyDownイベントが取得できなくなることに気づいた。KeyPreveiwプロパティを True にしていてもダメか…。

TTimer で一定時間毎にマウスの状態を監視して、ボタンが押されたか、マウスカーソルが動いたかを検出していたので、似たような方法でESCキーの押し下げだけは取得できたのだけど…。

uses
  Windows,

  //...

{ タイマーを使って一定時間毎に終了条件を満たしているか調べる }
procedure TFullScrnForm.MouseCheckTimerTimer(Sender: TObject);
begin
  // ESCキーが押されてるかチェック
  if (Windows.GetAsyncKeyState(VK_ESCAPE) and $8000) <> 0 then
  begin
    Application.Terminate;
    Exit;
  end;

ただ、何かしらのキーが押されたかどうかをこの方法でチェックしようとしたら、起動直後にアプリが終了してしまって…。

そこで、以下のページで紹介されている、SetWindowsHookEx() を使ってみることにした。

_[Windows] 令和のスクリーンセーバーの作り方 #初心者 - Qiita

AI(Google Gemini)によると、SetWindowsHookEx(WH_KEYBOARD, KeyHookProc, 0, GetCurrentThreadID); という書き方は、自身のスレッドを対象にしている時は動くけれど、WebView2 は Delphi/Lazarusのフォームと別スレッドで動いてしまうから効かないそうで…。以下のような書き方になった。

uses
  Windows,

// ...

const
  WH_KEYBOARD_LL = 13;

var
  hhkLowLevelKybd: HHOOK;
  keyDownFg: boolean;

// キーボードフック時に呼ばれるコールバック関数
function LowLevelKbdProc(nCode: integer; wParam: WPARAM; lParam: LPARAM): LRESULT;
  stdcall;
begin
  // nCodeが0以上の場合、有効なキーイベント
  if nCode = HC_ACTION then
  begin
    if (wParam = WM_KEYDOWN) or (wParam = WM_SYSKEYDOWN) then
    begin
      // キーが押された
      keyDownFg := True;
    end;
  end;

  // 次のフックへ処理を渡す
  Result := CallNextHookEx(hhkLowLevelKybd, nCode, wParam, lParam);
end;

{ フォームが表示される時の処理 }
procedure TFullScrnForm.FormShow(Sender: TObject);
begin
  // ...

  // キーボードフックを設定。
  // WebView2にフォーカスが当たってると
  // フォームのOnKeyDownイベントが取得できなくなるのでこうして処理する
  hhkLowLevelKybd := SetWindowsHookEx(WH_KEYBOARD_LL, @LowLevelKbdProc, HInstance, 0);
  keyDownFg := False;

  if hhkLowLevelKybd = 0 then
  begin
    ShowMessage('Error: Initializing keyboard hook.');
  end;
end;

{ タイマーを使って一定時間毎に終了条件を満たしているか調べる }
procedure TFullScrnForm.MouseCheckTimerTimer(Sender: TObject);
begin
  MouseCheckTimer.Enabled := False;

  // ESCキーが押されてるかチェック
  if (Windows.GetAsyncKeyState(VK_ESCAPE) and $8000) <> 0 then
  begin
    Application.Terminate;
    Exit;
  end;

  // ...

  // 何かキーが押されてたら終了
  if (FChkKeyDown) and (keyDownFg) then
  begin
    Application.Terminate;
    Exit;
  end;

  MouseCheckTimer.Enabled := True;
end;

{ フォームを破棄する際の処理 }
procedure TFullScrnForm.FormDestroy(Sender: TObject);
begin
  // ...

  // キーボードフックを解除
  if hhkLowLevelKybd <> 0 then
    UnhookWindowsHookEx(hhkLowLevelKybd);
end;

Delphi なら WH_KEYBOARD_LL が定義されているけれど、Lazarus では定義されていないのでコンパイルエラーが出てしまった。仕方なく、自前で定義することになった。

ちなみに、WH_KEYBOARD より WH_KEYBOARD_LL のほうが低レベルな扱いらしくて、システム全体に絡んでくるから気をつけろ、とAIが言っている。また、フォームを閉じるときに必ずフックを解除しないといけないから気をつけろ、ともAIが言っている。今回は OnDestroy イベントの中に入れておいた。

WH_KEYBOARD_LL は JwaWindows の中で定義されているので、それを uses に追加すれば未定義エラーは出なくなるけれど、試したところ GetCursorPos() でコンパイルエラーが出るようになってしまって…。AIに尋ねたら、uses に書く順番を気を付ければ、GetCursorPos() が後から別の何かで上書き定義されてエラーを解消できると言ってきた。試したら、たしかに記述する順番によってコンパイルエラーは出なくなった。

uses
  JwaWindows,
  Windows,
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs,
  StdCtrls,
  ExtCtrls,
  LazFileUtils,
  LCLType,
  ComCtrls,
  uWVWindowParent, uWVBrowser,
  uWVLoader, uWVBrowserBase,
  uWVTypes,
  uWVTypeLibrary,
  ConfigData;

ただ、WH_KEYBOARD_LL という定義1つのために uses の記述順まで意識しなきゃいけないのはどうかと…。今回は JwaWindows をコメントアウトして、自前で WH_KEYBOARD_LL だけを定義することにした。

#2 [anime] 「銀魂 THE FINAL」を視聴

BSテレ東で放送されていた版を録画していたので視聴。漫画原作をアニメ化した「銀魂」の劇場版、なのだろうか。

単独で見れる作りなのかなと思いながら眺め始めたのだけど、どうやらTVアニメ版か別の劇場版の続きだったようで何が何やら…。いや、一応冒頭でこれまでのあらすじと称して長々と説明してたのだけど、全編が DBZのパロディになっていたものだからさっぱり頭の中に入ってこない。というか本編で「こんなんじゃわかんねえよ!」的ツッコミ入れてて「ホントだよ…わかんねえよ…」と思った…。前作視聴済みを前提にして作ってあるのだろうな。というか、あらすじと言ってるけどコレ全部嘘話でしたというギャグなのかなあ? と思いながら眺めてたんで、ますます設定が分からない…。

本編も延々とバトルシーンが続いて…。銀魂にそういうのは求めてないんだけどなあ…。

もしかして銀魂もキン肉マンみたいな状態になってるんだろうか。キン肉マンも最初の頃はパロディギャグ漫画だった気がするけどいつの間にかプロレス漫画になってたし…。考えてみたらDBもそうか。西遊記のパロディ漫画っぽく始まったのに天下一武道会あたりから妙なことになった感が…。

でも、このあたりは銀八先生のコーナーで「先生この漫画ギャグ漫画だったのに最近バトルばっかりなんですが」「ジャンプ漫画だからこうなるのは当たり前です諦めてくださいキン肉マンもDBもそうだったでしょジャンプの宿命なんです仕方ないんです」とか平気で言ってそうでもある…。

とりあえず、一応視聴はした、とだけメモしておこう…。

もっとも自分のことだからどうせ見たことを忘れてしまってそのうち何かの拍子に目にして「アレ? なんかコレ見たような気がするぞ?」と首を捻ったりするんだろうなあ…。今期も再放送のTVアニメを数本見て「アレ? もしかしてこのアニメ見たことあるのでは…?」と困惑してたりするので…。

2026/02/14() [n年前の日記]

#1 [lazarus] HTML+JavaScriptをスクリーンセーバにするラッパーを作成してみた

Windows11 x64 25H2 + Lazarus 4.4 + WebView4Delphi (WebView2) で、HTML + JavaScript をWindows用のスクリーンセーバーにするラッパーを作成してみた。githubにアップロードしておいた。

_mieki256/SSWrapJs
_Releases - mieki256/SSWrapJs

WebView2(Microsoft Edge)が必要だけど、Windows11なら標準でインストールされているらしいので動くのではなかろうか。

Windows10の場合は別途 Edgeのインストールが必要なのかもしれないけれど、Windwos10はもうサポートが終了してるはずだから考慮しなくていいかな…。

もっとも、今の御時世にスクリーンセーバを動かそうとする人自体がそもそもそんなに居ないだろうから、こんなものを今更作ること自体がアレで…。その割に色々と悩むところが出てきて何度かハマったけど…。

とりあえず、Delphi/Lazarus で試したかったことはこれで一通りやれた気がする。

似たようなプロジェクトは既にあった :

AI(Google Gemini)に尋ねてみたら、HTML + JavaScript をWindows用のスクリーンセーバにできるプロジェクトは既に昔からいくつかあったらしい。

_ChayoteJarocho/WebPageScreensaver: Display a web page as your screensaver
_janemiceli/web-page-screensaver-windows: Display a web page as your screensaver on Windows. A page such as https://janemiceli.github.io/matrix.
_cwc/web-page-screensaver: Display a web page as your screensaver
_EnhancedJax/IdleWebview: Custom webview screensaver for Windows 10+

ただ、.NETを利用して作成されてるせいか、実行バイナリが100MBを超えると書いてあるように見える。ファイルサイズが大き過ぎてgithubには置けないから自分でソースからビルドせよ、とも書いてあるような…。

今回作成したラッパーは3MBぐらいのファイルサイズで収まってるので、そのあたりはメリットかもしれない。

ファイルサイズが小さい実行バイナリ(.exe)を生成したい時は、Delphi/Lazarus という選択肢は魅力的だなと…。Pascal というプログラミング言語も、昔は教育用として使われていただけあって分かりやすいし。いや、あちこちで Free() を呼ばないといけないのは面倒だけど…。GC(ガベージコレクション)が欲しい…。

サンプルのHTML+JavaScript :

サンプルになりそうな HTML + JavaScript は AI(Google Gemini)に作成してもらった。一発で作成できたわけではないけれど、何度かやり取りしていたらそれっぽくなった。

_sample1.html
_sample3.html


昔作成した以下のページも、URIをコピーして指定すれば利用できる…はず。

_roadmake4.html
_roadmake4_night.html
_mieki256's diary - three.jsで一本道を延々と走るソレ


以下の記事で紹介されているサイトもイイ感じかもしれない…。

_スクリーンセーバーっぽいサイト
_番外編

#2 [nitijyou] 体調が悪い

深夜04:00頃に急に眼がおかしくなって…。右目と左目が全然別のほうを向いちゃってる感じで、見える風景がおかしくなって…。これはマズいと布団に入って目を瞑って休んだけれど、起きてからずっと頭痛が…。

少しググった感じでは、脳梗塞の症状の中にそういう状態もあるようで、小脳が梗塞するとそうなるとかなんとか…。もしそうだとしたら、参ったな…。何せ親父さんが脳梗塞を起こしてるから、遺伝的に自分もそうなる可能性はありそうだし…。

2026/02/15() [n年前の日記]

#1 [golang] Go言語 1.26をインストールしたけど問題発生

Windows11 x64 25H2上で、msiセットアップ版のGo言語(golang) 1.26 をインストールした。

_All releases - The Go Programming Language

go1.26.0.windows-amd64.msi を入手して実行。今回は D:\Dev\Go\ にインストールした。

> which go
"D:\Dev\Go\bin\go.exe"

> where go
D:\Dev\Go\bin\go.exe

> go version
go version go1.26.0 windows/amd64

ただ、ちょっと問題が…。

Go 1.25.7 にダウングレードした :

Go 1.26 ではGUIライブラリの Walk (Windows用のGUIアプリを作成できるライブラリ)が使えない…。Panic を起こす…。

_lxn/walk: A Windows GUI toolkit for the Go Programming Language

Walkの更新は止まっていて、今現在の Go には対応できてないという話を見かけた。

試しに、Go 1.25.7 にバージョンを落としてみることにした。Go 1.26 をアンインストールしてから、go1.25.7.windows-amd64.msi を入手して実行してインストール。D:\Dev\Go\ にインストールしておいた。

でも、Go 1.25.7 でもおそらく Walk は動かない、と Microsoft Copilot が言っている。

_Is this project maintained? - Issue #835 - lxn/walk

Walkは2021年から更新されてないらしい。

_tailscale/walk: A Windows GUI toolkit for the Go Programming Language

Go 1.21 に対応させたfork版はあるらしいけど…。

AI(Google Gemini)に、Win32 API を叩いてウインドウを表示するGo言語サンプルを提示してもらって、一応動作確認はできたけれど…。記述がやたらと長くなって、これではC/C++で作るのとノリがさほど変わらない気がしてきた。Go言語でGUIは、ちょっと諦めたほうが良さそうだな…。

2026/02/16追記 :

Go 1.25 では Walk が使えないというのは Microsoft Copilot が出してきた嘘情報だった…。

公式ページの README.md に記述されているサンプルを Windows11 x64 25H2 + Go 1.25.7 64bit で試したら、ビルドエラーも出なかったし、生成されたexeを実行したらウインドウも表示された。Go 1.25.7 でも Walk は使えた。少なくとも Hello World レベルであれば使える模様。

いきなり Copilot に質問して、Copilot が提示してきたサンプルをそのままビルドしようとして、そのソースコードが元々おかしくて問題が発生していただけだった…。しかも Go のガベージコレクションの仕様が変わって Walk は追従できてないだの実にもっともらしい理由を並べ立てて Go 1.19以降は Walk が使えないと断言してきて…。アイツ、平気で嘘ばかりつきやがる…。

#2 [synfig] Synfig Studio 1.5.4 をインストールした

Windows11 x64 25H2上で、アニメ制作ソフト Synfig Studio 1.5.4 64bit をインストールしてみた。

_Synfig - Free and open-source animation software
_Releases - synfig/synfig

Synfig Studio の安定版は 1.4.5 ということになっているけれど、バグが多くて何かの拍子によく落ちる。開発版のほうがまだ落ちにくい印象があるので、1.5.4 を入手して試用してみることにした。

SynfigStudio-1.5.4-2026.01.18-win64-79417.zip を入手して解凍。任意のフォルダに置く。今回は D:\Prog\SynfigStudio-1.5.4-2026.01.18-win64-79417_portable\ に置いてみた。

中に入っている synfigstudio.bat を実行すれば起動する。

ただ、初回起動時は何かを検索しているのかめちゃくちゃ時間がかかって応答無し状態になる…。数分放置しておいたらそのうちウインドウが正常に表示される状態になった。一度正常表示されたら、2回目からはすんなり起動する状態になった。

使い方を忘れてる…。復習しないと…。

2026/02/16(月) [n年前の日記]

#1 [golang] Go言語について勉強中

Windows11 x64 25H2上で、Go (golang) 1.25.7 64bit を使いながら勉強中。

異なるバージョンを共存 :

Windows11 x64 25H2上で Go 1.25.7 64bitをインストール済みだけど、Go 1.18 も共存できるようにインストールしてみたい。Go言語はそういうこともできるらしい…。

_最新 Go を捨てずに古い Go を支える ― 新旧Go環境共存術

go install golang.org/dl/go1.18.10@latest
go1.18.10 download

利用する際は、go と打つ代わりに go1.18.10 と打つ。

> which go1.18.10
"C:\Users\mieki256\go\bin\go1.18.10.exe"

> go1.18.10 version
go version go1.18.10 windows/amd64

> go version
go version go1.25.7 windows/amd64

おお…。別バージョンもインストールできた…。

Go 1.25.7でWalkを試用 :

Go言語で Windows用のGUIアプリを作成できるライブラリ、Walk を使ってみたい。

_lxn/walk: A Windows GUI toolkit for the Go Programming Language

  • github の README.md にサンプルのソースコードが載っているので、コピペして test.go として保存。
  • Manifest も載っているので、コピペして test.manifest として保存。.manifest はBOM無しのUTF-8で保存せよ、ということになっているらしい?

# アプリ名を指定しつつ go mod init で依存関係を列挙する go.mod を作成。
go mod init my-walk-app

# ソースコードに基づいて必要なパッケージを列挙してもらう
go mod tidy

# Manifestを変換するためのツール、rsrc.exe を入手
go get github.com/akavel/rsrc

# Manifest を .syso に変換
rsrc -manifest main.manifest -o rsrc.syso

# Goでビルド
go build .

# 生成されたアプリを実行して動作確認
my-walk-app.exe

以下のような出力になった。
> go version
go version go1.25.7 windows/amd64

> go mod init my-walk-app
go: creating new go.mod: module my-walk-app
go: to add module requirements and sums:
        go mod tidy

> go mod tidy
go: finding module for package github.com/lxn/walk/declarative
go: found github.com/lxn/walk/declarative in github.com/lxn/walk v0.0.0-20210112085537-c389da54e794
go: finding module for package golang.org/x/sys/windows
go: finding module for package github.com/lxn/win
go: finding module for package gopkg.in/Knetic/govaluate.v3
go: downloading golang.org/x/sys v0.41.0
go: found github.com/lxn/win in github.com/lxn/win v0.0.0-20210218163916-a377121e959e
go: found gopkg.in/Knetic/govaluate.v3 in gopkg.in/Knetic/govaluate.v3 v3.0.0
go: found golang.org/x/sys/windows in golang.org/x/sys v0.41.0

> go get github.com/akavel/rsrc
go: added github.com/akavel/rsrc v0.10.2

> rsrc -manifest main.manifest -o rsrc.syso

> go build .

> my-walk-app.exe

#2 [golang] Microsoft Copilotに色々と騙された

愚痴です。

Windows11 x64 25H2 + Go 1.25.7 64bit で Walk を使おうとしたのだけど、ついついモノグサをして、Microsoft Copilot に「Go + Walk のサンプルコードを見せて」と質問したら…。ちょっと地獄を見ました…。

まず、提示してきたサンプルコードが間違ってて…。後から分かったけれど、初っ端から嘘…。

ビルドエラーは出なかったけど実行してもウインドウが出ないから尋ねてみたら「Go 1.25でWalkは使えない。Go 1.16〜1.18ぐらいがWalkが動くバージョン」と言ってきて…。これも後で分かったけど真っ赤な嘘…。

Go の古いバージョンは共存できないのかと尋ねたら「それは簡単」と言ってきて、一応そこは正しかったけど…。

「Go 1.18.10 で動く Walk はこのバージョンなのでインストールしてください」と、存在しないタグでのインストールを4回ぐらい提示してきて…。しかも「これで絶対インストールできますよ!」と再三言ってくる…。お前は一体何回嘘を(以下略

もしかしてmanifestが必要なのではないか? なくてもいいの? と尋ねてみたら「そんなものは要らない」「クラッシュの原因とは絶対に無関係」と言い張って…。後で分かったけど必須じゃんよ…。また嘘…。

試しにmanifestをつけてみたら動作が変わったのでやっぱり必要じゃないのですか動作が変わりましたよと尋ねたら「そうなんです! manifestが必要です」と言ってきて…。お前さっき「絶対に要らねえ」って言ってたじゃねえか…。

しかしそこで出してきたmanifestではサイドバイサイドの構成が正しくないとエラーが出てコレ間違ってないですかと尋ねたら「rsrc.exeのバグですね。rsrc.exeはバグが多いことで有名なんです」と清々しいほどの責任転嫁…。後で分かったけどお前が出したmanifestがおかしかったんだよrsrcはちゃんと仕事してたよrsrcへの風評被害やめろや…。

「rsrcの代わりにgo-winresを使ってみましょう」と言い出したけど、これまた存在しない指定オプションを3回ぐらい出してきて…。でもまあ、そういうツールが存在すると知れた点は良かった。こんな便利なツールもあったんやな…。

go-winresについてググって調べてひょっとしてこの指定をするんじゃねと尋ねたら「ああ、その指定もできますね」と抜かしてきやがる…。

ここまできてようやく実行時にpanic内容が出てくるようになって、エラーメッセージをそのまま渡してみたら「ああ、これはソースコードが間違ってますね。レイアウトの指定がありませんよ?」と言い出して…。お前が出してきたコードだよ! 最初から間違ってたんじゃねえか!

一応ウインドウが出るようになって、いやはやこれでなんとかなったかなあ、と思ったけれど。そこでふと、ソースコードとmanifestが間違ってただけなら、実は Go 1.25.7 でも動いたりしないか? と…。

試してみたらすんなり動いてしまって…。「Go 1.2x でWalkは使えません」ってお前そこからして嘘かよ! と…。

いやはや騙された騙された。延々と騙された…。AIがあればプログラマーは要らない、なんて寝ぼけたこと言ってんじゃねえぞと思いました。こんな嘘つき野郎にコード作らせたら絶対にいつか重大事故起きるわ…。

ちなみに、Google Gemini に「Go 1.25.7 で Walk は使えるのか」と尋ねてみたら、「基本的には使えるはず」「WalkはGoが公式にメンテンナンスしてるWindows用のライブラリを経由してWin32 APIを操作しているだけなのでGo内部の仕様変更の影響は少ない」「ただし開発が停滞しているので将来も使えるかどうかは不明」とそれっぽいことを言ってきた…。Geminiのほうがまだちょっとあてになりそう…。

ただ、Gemini にサンプルコードを出してくれとお願いしたら、ID指定を間違えてる manifest を出してきて、これまたエラーが…。お前もかよ…。それでも Copilot と比べたらはるかに少ないやり取りでウインドウが表示されるところまで辿り着けた気がする…。Gemini のほうがまだ優秀なのでは…?

まあ、そもそも公式のドキュメントをちゃんと読め、公式のサンプルを眺めろ、って話ですな…。モノグサしちゃいけない…。

2026/02/17(火) [n年前の日記]

#1 [golang] Ebitengineについて勉強中

せっかくGo言語(golang)について触り始めたので、2Dゲーム制作に特化してると謳うライブラリ Ebitengine (旧称: Ebiten) の使い方を少し調べ始めているところ。環境は Windows11 x64 25H2 + Go 1.25.7 64bit。

_Ebitengine - A dead simple 2D game engine for Go

フルスクリーン表示ができるのかどうかがちょっと気になっていて…。おそらく以下でできそうかな…。

    // 最前面表示になることを期待
    ebiten.SetWindowFloating(true)

    // フルスクリーン表示を指定
    ebiten.SetFullscreen(true)

    // マウスカーソルを非表示にする
    ebiten.SetCursorMode(ebiten.CursorModeHidden)

AI(Google Gemini)に尋ねながらそれっぽいサンプルを書いて動作確認しているけれど、表示してる画像がなんだかちょっと気になってきた…。

Go言語公式マスコットキャラの「Go gopher」の画像を使っていたけれど、なんというか…。もうちょっと可愛い感じの画像のほうが多少はテンションが上がるというか…。

_Gopherくん(再)入門|kogu
_The Go Gopher - The Go Programming Language
_私のGopherコレクション2014 #golang #gopher - Qiita
_golang-samples/gopher-vector: Vector data of gopher

2026/02/18(水) [n年前の日記]

#1 [golang] Task/Taskfileを導入

Windows11 x64 25H2上でGo言語(golang)を勉強中だけど、アプリによって go build と打ってビルドしたり、go build -ldflags="-H windowsgui" と打ってビルドするのがなんだか面倒臭い。C/C++だったら make だけで済むのに…。

「Taskfile を使うとそのへん楽になるかもよ」とAI(Google Gemini)が言っている。ググってみたらGo言語で作成されたツールらしい。試用してみようか…。

インストール :

単体でインストールする場合は色々方法があるらしいけれど。

_Installation | Task

自分の環境では Go言語が導入済みなので、go install でインストールしてしまうのが簡単かもしれない。以下を打ってみた。

go install github.com/go-task/task/v3/cmd/task@latest

予想以上に色んなパッケージがインストールされた…。

> which task
"C:\Users\USERNAME\go\bin\task.exe"

> task --version
3.48.0

インストールはされたっぽい。

使い方 :

プロジェクトディレクトリ内に、Taskfile.yml というファイルを作成する。Makefile に相当するのだろう。

今回は以下を書いてみた。

version: '3'

tasks:
  default:
    cmds:
      - task --list

  res:
    desc: Make resource .syso
    cmds:
      - go-winres make

  build:
    desc: Build GUI version
    deps: [res]
    cmds:
      - go build -ldflags="-H windowsgui"

  run:
    desc: Development
    cmds:
      - go run .

  clean:
    desc: remove *.exe and *.syso
    cmds:
      - rm -f *.exe
      - rm -f *.syso

task と打てば default で指定されたコマンドが実行される。上記の設定の場合、task xxxx で指定できる一覧が表示される。

task build と打てば、上記の設定なら go でビルドが行われる。deps: で [res] に依存している旨を指定してあるので、go-winres make が実行されてからビルドされる。

clean で rm を指定してあるけれど…。Taskfile.yml 内で rm と書いてあれば、AI(Google Gemini)曰く、OSに関係なくファイル削除処理をしてくれるらしい。最初、Windows環境だから del と書かないとダメかなーと書いてみたら「そんなファイルは無い」と怒られてしまった。cmd.exe の内部コマンドだもんな…。

とりあえずコレで、task buikd とさえ打ち込めば、事前に指定したコマンドを実行できるようになった。

batファイルでもいいんじゃね、という気もするけど…。task を使っておけばおそらくクロスプラットフォーム対応もしやすいのではないかなあ…。まあ、今回はクロスプラットフォーム対応はしないのだけど。

#2 [windows][prog] GNU MakeをWindows11にインストールした

Windows11 x64 25H2上で GNU Make を使いたい。使えるものであれば使ってみたい。

一応 MSYS2 を導入してあるから、ソレを使えなくもないけれど…。MSYS2 の bash を起動するのがちょっと面倒な気もしていて…。

_ベストなWindowsへのMakeのインストール方法は? Windows - Qiita
_make:Windows環境にインストールして簡単なビルドをしてみる - massie's programming
_Make for Windows

Make for Windows をインストールするという方法もあるらしいけれど、バージョンが 3.81 とかなり古い。


Chocolatey経由でインストールすれば比較的新しい版がインストールされるらしい。たしかにバージョンが 4.4.1。

_Chocolatey Software | GNU make 4.4.1

MSYS2版の make も 4.4.1 だった。Chocolatey 経由でインストールしておけば同じバージョンが使えそう。


_Chocolateyの導入方法

Chocolatey はインストール済みだったので、管理者権限で PowerShell 7 を開いて以下を打った。

choco install make

> which make
"C:\ProgramData\chocolatey\bin\make.exe"

> where make
C:\ProgramData\chocolatey\bin\make.exe
D:\Program Files (x86)\Embarcadero\Studio\23.0\bin\make.exe

> make --version
GNU Make 4.4.1
Built for Windows32
Copyright (C) 1988-2023 Free Software Foundation, Inc.
...

GNU Make 4.4.1 がインストールされた。

ただ、Delphi 12 Community のインストールフォルダにも make.exe があるのがちょっと気になるけど…。Delphi側の動作に問題が起きたりしないか…。どうなんだろうなあ…。

#3 [golang] Go言語で使っているパッケージのバージョンを知りたい

Go言語(golang)で現在使っているパッケージのバージョンを知りたい。

例えば、現在利用している Ebitengine のバージョンを知りたいなら…。go.mod ファイルを眺めればバージョンも書いてある。たぶんそれが一番簡単な確認方法かなと…。

あるいはコマンドプロンプトで以下を打つ。

go list -m github.com/hajimehoshi/ebiten/v2

> go list -m github.com/hajimehoshi/ebiten/v2
github.com/hajimehoshi/ebiten/v2 v2.9.8

最新版に上げたい時は以下でいいらしい。

go get github.com/hajimehoshi/ebiten/v2@latest
go mod tidy

#4 [golang][cg_tools] 画像生成サービスでスプライトシートを作成してもらった

Go + Ebitengine でフルスクリーン表示をするサンプルを書いて、 _Go言語公式マスコットキャラクター「Go Gopher」 画像を表示して動作確認していたけれど。表示している画像がどうも気になる。もっと可愛い感じの画像が欲しい…。

一応自分も Inkscape 1.4 x64 を使ってスプライトシート状の画像を作成してみたけれど、可愛さが足りない。全然足りない。

試しにAIに作ってもらうことにした。Microsoft Copilot と Google Gemini (NanoBanana) に以下を要望。
比較的イイ感じの画像が出てきた。

そのままだとスプライトシートとして利用できなかったので、GIMP 2.10.38 Portable を使って背景を透明にしたり、配置を変えたり、縮小したりして最終画像を作成した。

ライセンス面 :

ライセンスが気になったけど、Google Gemini (NanoBanana) の場合は条件を満たせば商用利用も可能らしい。サービスを利用したユーザに権利が帰属するらしいけど、画像検索などを使って既存画像にそっくりなものが無いか確認した上で使うよう注意せよ、とAIが言っている。

Microsoft Copilotの場合は、Copilot曰く商用利用しなければOKと返してきた。ただ、細かい規約を書いてあるはずのURLも提示してきたものの、何度質問しても404のURLしか出てこない…。あげく、「今現在規約ページはネット上に存在しない」とCopilotが断言してきた…。たぶんコレも嘘なんだろうなあ…。

まあ、サンプルプログラムで使うだけなので、このくらいはいいんじゃないか…。一応画像検索をして、クリソツの画像が無いことは確認したし…。

成果物 :

github にアップロードしておいた。

_mieki256/ebiten_fullscreen_sample: Ebitengineでフルスクリーン表示をするサンプル

先日作成したスクリーンセーバラッパーから呼び出せばスクリーンセーバになるんじゃないかなと…。

_mieki256/SSWrapLz
_mieki256/SSWrapDp

2026/02/19(木) [n年前の日記]

#1 [prog][windows] Windows上でgzipを使いたい

Windows11 x64 25H2上でgzipを使いたい。利用できる版はあるのだろうか。

gzip for Windowsを使う :

gzip for Windows というものがあるらしい。

_Gzip for Windows

バージョンは 1.3.12。古い…。

Binaries の zip、gzip-1.3.12-1-bin.zip を入手して解凍したら bin/ の中に gzip.exe が入ってた。これを使えるのかな…。

> gzip --version
gzip 1.3.12
Copyright (C) 2007 Free Software Foundation, Inc.
Copyright (C) 1993 Jean-loup Gailly.
This is free software.  You may redistribute copies of it under the terms of
the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.
There is NO WARRANTY, to the extent permitted by law.

Written by Jean-loup Gailly.

バージョン表示はできた。

GnuWin32について :

先ほどの gzip は、GnuWin32 のパッケージの中の一つ、という扱いらしい。GnuWin32 というのは UNIX系OS(Linux等)で利用できる一般的なコマンドを Windows に移植した版、という説明でいいのかな。

_GnuWin32
_GetGnuWin32 - Maintaining a Gnuwin32 Package archive
_GnuWin32 - Browse Files at SourceForge.net

GnuWin32 は、2024/01/29 の時点で15年前に開発が完全に終了しているそうで…。GetGnuWin32_legacy_install_archive.zip を入手して解凍して、bin/ にパスを通しておけば利用できる、ということになっているらしい。

一応入手して、今回は D:\Dev\GnuWin32\ に置いておいた。解凍すると433MBほどになる。

注意点として、GnuWin32 の bin/ を環境変数PATHに追加して常に利用する場合は、PATHの最後のあたりに追加せよ、ということになっているらしい。いくつかはWindowsが標準で持っているコマンド名と衝突しているので、最初のあたりに追加してしまうとWindowsの動作が怪しくなる可能性があるのだろう…。

自分の場合はbatファイルを用意して、GnuWin32 を使いたくなったら、そのbatファイルを実行してから使うことにした。

gnuwin32_enable.bat
@echo off
set GNUWINPATH=D:\Dev\GnuWin32\bin
set PATH=%GNUWINPATH%;%PATH%
echo GnuWin32 enable. [%GNUWINPATH%]

自分が GnuWin32 を使いたいと思った時は、Windows標準の各コマンドより GnuWin32 を優先して使いたいと思うはずなので、このbatファイルではPATHの最初のあたりに追加してしまうことにした。

Chocolateyでインストール :

パッケージ管理ツールの Chocolatey経由でも gzip はインストールできる。

_Chocolatey Software | gzip 1.3.12

これもバージョンは 1.3.12。

一応インストールしてみることにした。管理者権限で PowerShell 7 を開いて、以下を打ってインストール。
choco install gzip

インストール場所は以下になっている。
C:\ProgramData\chocolatey\bin\gzip.exe

PATHの並びの関係で、先ほどインストールした GnuWin32版の gzip よりも優先して使われる状態になった…。まあ、バージョンは同じなのだからどちらを使ってもいいよな…。

MSYS2上のgzipを使う :

MSYS2をインストールしてある環境なら gzip も使える。

_Package: gzip - MSYS2 Packages

インストールは以下。
pacman -S gzip

$ pacman -Ss gzip | grep "gzip 1"
msys/gzip 1.14-1 (compression) [インストール済み]

$ gzip --version
gzip 1.14
Copyright (C) 2025 Free Software Foundation, Inc.
Copyright (C) 1993 Jean-loup Gailly.
This is free software.  You may redistribute copies of it under the terms of
the GNU General Public License <https://www.gnu.org/licenses/gpl.html>.
There is NO WARRANTY, to the extent permitted by law.

Written by Jean-loup Gailly.

バージョンは 1.14。これが一番新しい。

ただ、MSYS2 って起動するのがなんだか面倒で…。自分の場合は Chocolatey でインストールした版を使うことになっていきそうな気がする。

#2 [golang] Go言語で作成したアプリをブラウザ上で動かしたい

Windows11 x64 25H2 + Go 1.25.7 64bit + Ebitengine で作成したアプリを、Webブラウザ上で動かしてみたい。

以下のページが参考になった。ありがたや。

_WebAssembly - Ebitengine

先日作成した Ebitengine のサンプル相当を wasm に変換してアップロードしてみた。Firefox 147.0.4 64bit、Google Chrome 145.0.7632.110 64bit上では動いてくれた。

_img/_2026/20260219_golang_wasm/index.html

golang って凄いな…。こんなにサクッとブラウザ上で動かせてしまうのか…。さすが Googleが作ったプログラミング言語…。Web上での利用についても抜かりが無い…。

動作確認のみをしたい :

動作確認をするだけなら、wasmserve というGo言語製のツールが便利らしい。インストールは以下。Go言語がインストール済みであること。

go install github.com/hajimehoshi/wasmserve@latest

> which wasmserve
"C:\Users\USERNAME\go\bin\wasmserve.exe"


利用時は、プロジェクトフォルダをカレントディレクトリにして以下を打つ。終了は Ctrl + C。
wasmserve .

8080番ポートで待ち受けるので、Webブラウザで _http://localhost:8080/ を開けばいい。

Windows特有の処理を入れてないプロジェクトなら、すんなりブラウザ上で動いてくれた。

最初、多重起動禁止処理用にWin32 APIのMutexを使っているプロジェクトで試したら、DLL がどうとか言われてエラーが出てしまった…。どのOSでも動きそうな作りに留めておかないとダメっぽい。

wasmを生成 :

wasmファイルを作成してWebサーバ上に関連ファイルを置くことで、ブラウザ上でも動作するようになるらしい。

とにもかくにも、まずは wasmファイルを作らないと話にならない。見た感じでは、以下を行ってからビルドすると wasm を作れるようだなと…。

  • 環境変数 GOOS に "js" を指定。
  • 環境変数 GOARCH に "wasm" を指定。
  • この状態でビルドをすると wasmファイルが作成される。出力ファイル名の指定(-o hoge.wasm)も必要。

PowerShellなら以下。
$Env:GOOS = 'js'
$Env:GOARCH = 'wasm'
go build -o game.wasm main.go
Remove-Item Env:GOOS
Remove-Item Env:GOARCH

コマンドプロンプトなら以下。
set GOOS=js
set GOARCH=wasm
go build -o game.wasm main.go


この wasmファイルを動作させるには、wasm_exec.js も必要になるらしい。Go言語(golang)に同梱されているので、プロジェクトフォルダにコピーする。Go 1.24以降と1.23以前で場所が違うらしいので注意。

  • Go 1.24以降 : (Goインストール場所)\lib\wasm\wasm_exec.js
  • Go 1.23以前 : (Goインストール場所)\misc\wasm\wasm_exec.js

ちなみに、Goのインストール場所は、go env GOROOT で得られる。go env xxxxxx で、Goに関する環境変数が確認できる模様。

PowerShell なら以下。
# Go 1.24以降
$goroot = go env GOROOT
cp $goroot\lib\wasm\wasm_exec.js .

# Go 1.23以前
$goroot = go env GOROOT
cp $goroot\misc\wasm\wasm_exec.js .

今回は、プロジェクトフォルダ内に該当ファイルをコピーしてくるbatファイル、get_wasm_js.bat を作成して対応してみた。AI(Google Gemini)に作成してもらった。

get_wasm_js.bat
@echo off
setlocal enabledelayedexpansion

echo [INFO] Searching for Go's wasm_exec.js...

:: Get GOROOT path from Go environment
for /f "tokens=*" %%i in ('go env GOROOT') do set "GOROOT_PATH=%%i"

:: Define possible paths (New in Go 1.24+ and Old in Go 1.23-)
set "NEW_PATH=%GOROOT_PATH%\lib\wasm\wasm_exec.js"
set "OLD_PATH=%GOROOT_PATH%\misc\wasm\wasm_exec.js"

:: Check New Path
if exist "%NEW_PATH%" (
    copy "%NEW_PATH%" .
    echo [SUCCESS] Copied wasm_exec.js from Go 1.24+ location.
    goto :end
)

:: Check Old Path
if exist "%OLD_PATH%" (
    copy "%OLD_PATH%" .
    echo [SUCCESS] Copied wasm_exec.js from legacy Go location.
    goto :end
)

:: Error handling
echo [ERROR] could not find wasm_exec.js in Go distribution.
echo [DEBUG] Tried: 
echo   1: %NEW_PATH%
echo   2: %OLD_PATH%

:end
echo [DONE] Execution finished.


配布時は以下が必要になる。

  • index.html
  • wasm_exec.js
  • game.wasm

index.html は前述のページの内容をコピペして利用させてもらった。game.wasm のところを、自分で生成した wasmファイル名に修正しておくこと。

index.html
<!DOCTYPE html>
<script src="wasm_exec.js"></script>
<script>
const go = new Go();
WebAssembly.instantiateStreaming(fetch("game.wasm"), go.importObject).then(result => {
    go.run(result.instance);
});
</script>


プロジェクトフォルダ内でローカルサーバ(Webサーバ)を立ち上げて、Webブラウザでアクセスして動作確認してみる。

Python 3.x が入っている環境なら、以下を打てば簡易ローカルサーバを立ち上げられる。終了は Ctrl + C。
python -m http.server 8080

_http://localhost:8080/ を開いて動けば成功。

taskfileに手順を書いておく :

毎回ビルドするたびに環境変数を指定するのも面倒だなと…。batファイルで対応してもいいけれど、先日 Task(taskfile)というツールをインストールしたことだし、そちらで対応してみよう…。

Taskfile.yml
version: '3'

tasks:
  default:
    cmds:
      - task --list

  res:
    desc: Make resource .syso
    env:
      GOOS: windows
      GOARCH: amd64
    cmds:
      - go-winres make

  build:
    desc: Build GUI version
    deps: [res]
    env:
      GOOS: windows
      GOARCH: amd64
    cmds:
      - go build -ldflags="-H windowsgui"

  run:
    desc: Development
    cmds:
      - go run .

  clean:
    desc: remove *.exe and *.syso
    cmds:
      - rm -f *.exe
      - rm -f *.syso

  build-wasm:
    desc: Build the Ebitengine game for WebAssembly
    env:
      GOOS: js
      GOARCH: wasm
    cmds:
      - go build -o game.wasm main.go      
    sources:
      - ./main.go
    generates:
      - ./game.wasm

  serve:
    desc: Run a local server to test the WASM build
    cmds:
      - wasmserve .

  chkenv:
    desc: Check OS env
    cmds:
      - echo GOOS is %GOOS%
      - go env GOOS

task build-wasm と打てば wasm がビルドできる。

  • env: を指定することで、環境変数を一時的に変更することが可能らしい。
  • sources: と generates: の指定で、どのファイルを使ってどのファイルを作成するのか指定できる。main.go と game.wasm を指定してるから、main.go と game.wasm のタイムスタンプを見て、main.go のタイムスタンプが game.wasm より新しい時だけビルドが行われるようになる。

ただ、この項目を指定したら、exeを作るためのビルド時に「GOOS, GOARCHがおかしい」と言われてエラーになった…。res: や build: の設定項目内に env: を用意して、GOOS=windows, GOARCH=amd64 を指定することで対応することにしてみた。

2026/02/20(金) [n年前の日記]

#1 [windows][prog] PowerShellの起動方法

コマンドプロンプト上で PowerShell を起動したい。正確には、2画面ファイラーのあふwから、開いてるフォルダをカレントフォルダにしてPowerShellを起動したい。環境は Windows11 x64 25H2。

powershell と打ち込めば起動するのかなと思ったけれど、これだと古いバージョンが起動してしまう…。以下の場所から呼び出されてるようだけど…。

> where powershell
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe

バージョンの確認方法は、以下を打つ。
$PSVersionTable.PSVersion

> $PSVersionTable.PSVersion

Major  Minor  Build  Revision
-----  -----  -----  --------
5      1      26100  7705

PowerShell 5.1 なのだな。古い…。

PowerShell7 はどうすれば起動するのか。ググってみたら pwsh を実行すればいいらしい。
> where pwsh
C:\Program Files\PowerShell\7\pwsh.exe

> $PSVersionTable.PSVersion

Major  Minor  Patch  PreReleaseLabel BuildLabel
-----  -----  -----  --------------- ----------
7      5      4

7.5.4 だった。バージョンが新しい。

カレントディレクトリを指定しながら起動するには、-WorkingDirectory を指定する模様。
pwsh -WorkingDirectory "C:\hoge\fuga\piyo"

#2 [ruby] Rubyスクリプトを修正中

2画面ファイラーあふwから呼び出して使うRubyスクリプトがいつの間にか動かなくなっていたので修正しようと試みているのだけど、Microsoft Visual Studio Code で編集しようとしたらなんだかちょっと妙な感じで…。

Rubyに対する支援機能を追加できる拡張があるわけだけど、どうやら今まで使ってた拡張が非推奨になって、ruby-lsp なる拡張しか利用できなくなっているようで…。しかしエラーメッセージが次々に出てくる…。

Ruby 3.2.2 という古いバージョンを入れて使ってるせいだろうか。現行バージョンは 4.0.1 で、1つ前のバージョンですら 3.4.8 のようだし…。

Ruby 3.2.2 のままだけど、とりあえず以下の gem をインストールしてみた。
rubocop
rubyfmt
syntax_tree
rufo
ruby-lsp

#3 [movie] 「ゴールデンカムイ」実写映画版を視聴

金曜ロードショー?で「ゴールデンカムイ」実写映画版が放送されていたので視聴。初見。

世間様の評判がかなり高い映画だったので気になっていたのだけど、視聴してみて納得。これは高評価になるわな…。各シーンで原作へのリスペクトがしっかりと感じられる…。役者さん達が本気で取り組んでることも分かる…。 冬の川にザブザブと入っていったり、馬車に実際に引き摺られたり、見るからに、これは役者さん達もかなり大変だったろうなと…。

キャスティングもイイ感じというか、原作キャラのイメージを比較的再現できてる気がした。特に白石と土方。白石はもう白石にしか見えない…。土方のカッコよさも匂ってくる…。

熊や狼がCGだったらしいけど、日本もこんな映像を作れるぐらいになったのだなと…。これなら犬ばかり出てくるあのジャンプ漫画の実写化も不可能じゃないな…。まあ、物心がついた時にはハリウッドのVFXを当たり前のように目にしてた世代は「ショボッ」と思うんだろうけど、CGがそもそも無かった頃から眺めていて、しかも世間様が「CGなんて使えねえ」と叩いてた時期も知ってる側にとっては、随分と進歩したもんだなと思うわけで…。

2026/02/21() [n年前の日記]

#1 [ruby] Ruby 3.4.8 x64をWindows11にインストール

Windows11 x64 25H2上で、Ruby 3.4.8 64bit(x64) をインストールした。Rubyinstaller版を利用させてもらうことにする。

今までは DXRuby を動かしたくて x86版を選んでたけど、ちょっとそのあたりの事情が変わってきそうなので今回は素直にx64版を選んでみた。

_RubyInstaller for Windows
_Downloads

rubyinstaller-devkit-3.4.8-1-x64.exe を入手して実行。

最初のダイアログで、2つの選択肢が出てくる。


後者を選ぶと、管理者権限で開いたコマンドプロンプト上じゃなければ gem install 等ができなくなる…。ここは前者を選んだほうがいい…。最初、後者を選んでしまって、gem がさっぱりインストールできないと悩んでしまった…。

今回は D:\Ruby\Ruby34-x64\ にインストールした。

一通りインストールが終わるとMSYS2関係のインストールだか初期設定だかが実行されるけれど、特に数値を選ばなくてもEnterキーを叩いていくだけで最低限のインストールはされるらしい。

gemをインストール :

Microsoft Visual Studio Code (VSCode)で ruby-lsp なる拡張を利用すると、Rubyに対する支援機能が使えるらしいので、以下の gem をインストールしておいた。
rubocop
syntax_tree
rufo
rubyfmt
ruby-lsp

_Ruby LSP - Visual Studio Marketplace

たぶん要らないものも入ってる。何を入れたら ruby-lsp が動くのか分からなかったので…。本来なら自動でインストールしてくれるらしいのだけど、よく分からないエラーメッセージが次々に表示されてしまって…。あらかじめ手動でインストールしておいたほうがいいのかなと…。

VSCode で.rb を開くと、右下のほうに「{ } Ruby」と表示されるけど、「{ }」の部分をクリックすると現在の状態が表示されて、LSPとやらが実際に動いてるかどうかが分かるっぽい。

しばらく待ってると動き始める感じもするけれど、もし動いてなかったら、VSCodeのコマンドパレット(Ctrl + Shift + P)で、「Ruby LSP: Start」や「Ruby LSP: Restart」をしないといけないかもしれない。このあたり使い方がよく分かってない…。

余談。この ruby-lsp を提供してる Shopify って、RubyGems乗っ取り事件で名前が出てきたところだろうか…?

閑話休題。ちなみに…。
  • どんな gem が入っているかは gem list で見れる。
  • ">" を使えばファイルに保存することもできる。
  • Perlを使ってバージョン表記無しのリストを保存することもできる。…これ Ruby でもできないか?

gem list
gem list | perl -pe "s/ \(.+\)//"

gem list > 20260220_ruby348.txt
gem list | perl -pe "s/ \(.+\)//" > 20260220_ruby348_no_versions.txt

rubygems のアップデートは以下。

gem update --system

pikとuruに登録 :

異なるバージョンのRubyを切り替えて利用できる pik と uru にも登録しておいた。

_vertiginous/pik: Ruby version manager for Windows
_jonforums / uru - Bitbucket

pik add D:\Ruby\Ruby34-x64\bin

uru admin add D:\Ruby\Ruby34-x64\bin --tag 348

今確認してみたら、pik の実行バイナリを配布してたページが404になってるな…。uru を使えということなんだろう…。

irbでエラーが出る :

Windows11 x64 25H2 + Ruby 3.4.8 x64 上で irb を実行しようとしたらエラーが出た。

> irb
Error loading RC file 'D:\home2\mieki256/.irbrc':
<internal:D:/Ruby/Ruby34-x64/lib/ruby/site_ruby/3.4.0/rubygems/core_ext/kernel_require.rb>:139:in 'Kernel#require': cannot load such file -- irb/ext/save-history (LoadError)

"~/.irbrc" の記述が問題だった…。以下が書かれてた。

require "irb/ext/save-history"

_Ruby 3.2と3.3のirb historyの扱いの違いと対処方法 (2025-02-11) | あーありがち

Rubyのバージョンによって、件のファイルはその場所に存在してなかったりするらしい。

以下のように書き換えてみた。

begin
  require "irb/ext/save-history"
rescue LoadError
end

IRB.conf[:SAVE_HISTORY] = 1000

これでエラーが出なくなった。

AI(Google Gemini)によると、今のirbは昔と違って補完機能も色付け機能もデフォルトで有効になってるらしい。昔の ~/.irbrc はそのまま使わないほうがいいのかもしれないな…。

#2 [ruby] DXRuby 64bit版があるらしい

DXRuby という、Windows上でRubyを使って2Dゲームを作れるライブラリがあるのだけど、64bit版Rubyに対応させた DXRuby (DXRuby64)があるらしいと知った。

_dxruby64 | RubyGems.org | コミュニティのgemホスティングサービス
_spoolkitamura/dxruby64
_dxruby64/README-ja.md at main - spoolkitamura/dxruby64
_DXRubyの64bit対応版|rbCanvas
_MP3の再生もできるようになったDXRuby64の Soundクラス|rbCanvas
_DXRuby64でOGGファイルの再生にも対応|rbCanvas

素晴らしい…。Windows11 x64 25H2 + Ruby 3.4.8 x64(64bit) 上でインストールしてみた。

gem install dxruby64

DXRuby の動作には d3dx9_40.dll が必要になる。入手方法と置き場所は以下のページで解説されている。

_dxruby64/README-ja.md at main - spoolkitamura/dxruby64

Ruby 3.4.8 x64上で動いてくれた。素晴らしい…。

サウンド関係は仕様が変わっているらしいのでそのあたりのチェックはしていないけれど、表示関係は手元のスクリプトがそのまま動いてくれた。

#3 [ruby] ruby-gtk4/ruby-gtk3をRuby 3.4.8 x64にインストール

Windows11 x64 25H2 + Ruby 3.4.8 x64 (Rubyinstaller版)で、gtk4 (ruby-gtk4) がインストールできそうか試してみた。

_gtk4 | RubyGems.org | コミュニティのgemホスティングサービス
_ruby-gnome/ruby-gnome: A set of bindings for the GNOME libraries to use from Ruby.

Ruby 2.3.8 x64にインストール :

gtk4 は、以下のパッケージが必要になる模様。

> gem install gtk4

Fetching gobject-introspection-4.3.5.gem
Fetching glib2-4.3.5.gem
Fetching graphene1-4.3.5.gem
Fetching cairo-1.18.4.gem
Fetching gdk_pixbuf2-4.3.5.gem
Fetching gio2-4.3.5.gem
Fetching cairo-gobject-4.3.5.gem
Fetching pango-4.3.5.gem
Fetching atk-4.3.5.gem
Fetching gtk4-4.3.5.gem
Fetching gdk4-4.3.5.gem
Fetching gsk4-4.3.5.gem
...

Done installing documentation for glib2, gobject-introspection, graphene1, cairo, cairo-gobject, pango, gio2, gdk_pixbuf2, gdk4, gsk4, atk, gtk4 after 7 seconds
12 gems installed

gtk4 4.3.5 をインストールできたっぽい?

サンプル :

ruby-gtk4 を使ったサンプルをAI(Google Gemini)に提示して貰った。Hello World と表示しつつ、ボタンをクリックしたらメッセージダイアログを表示する。動いてくれた。

01_hello_gtk4.rb
require "gtk4"

application = Gtk::Application.new("jp.example.hello", :default_flags)

application.signal_connect "activate" do |app|
  window = Gtk::ApplicationWindow.new(app)
  window.set_title("Ruby GTK4 Sample")
  window.set_default_size(300, 200)

  box = Gtk::Box.new(:vertical, 10)
  box.set_margin_top(20)
  box.set_margin_bottom(20)
  box.set_margin_start(20)
  box.set_margin_end(20)

  label = Gtk::Label.new("Hello World")
  box.append(label)

  label2 = Gtk::Label.new("Use : ruby-gtk4")
  box.append(label2)

  button = Gtk::Button.new(label: "Push me")
  button.signal_connect "clicked" do
    dialog = Gtk::MessageDialog.new(
      parent: window,
      flags: :modal,
      type: :info,
      buttons: :ok,
      message: "Hello",
    )
    dialog.signal_connect("response") { dialog.destroy }
    dialog.show
  end
  box.append(button)

  window.set_child(box)
  window.present
end

puts "Starting GTK4 Application..."
application.run([$0] + ARGV)

rub-gtk3のインストール :

Windows11 x64 25H2 + Ruby 3.4.8 x64 (Rubyinstaller版)に、ruby-gtk3 (gtk3) をインストールしてみた。

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

gtk4 をインストールしてから、直後に gtk3 をインストールした。必要なパッケージは gtk4 の段階でインストールされたように見える。

> gem install gtk4

> gem install gtk3

Fetching gtk3-4.3.5.gem
Fetching gdk3-4.3.5.gem
Temporarily enhancing PATH for MSYS/MINGW...
Installing required msys2 packages: mingw-w64-ucrt-x86_64-gtk3
Building native extensions. This could take a while...
Successfully installed gdk3-4.3.5
Building native extensions. This could take a while...
Successfully installed gtk3-4.3.5
Parsing documentation for gdk3-4.3.5
Installing ri documentation for gdk3-4.3.5
Parsing documentation for gtk3-4.3.5
Installing ri documentation for gtk3-4.3.5
Done installing documentation for gdk3, gtk3 after 1 seconds
2 gems installed

gtk3 4.3.5 がインストールされた。手元にあったサンプルも動いてくれた。

ただ、Ruby 3.4.8 x64 (64bit版)ではなく、Ruby 3.4.8 x86 (32bit版) でインストールを試した時はエラーが出まくった…。x64版なら上手く行くのかもしれない。

#4 [ruby] ruby-tkをRuby 3.4.8にインストール

Windows11 x64 25H2 + Ruby 3.4.8 x64 (Rubyinstaller版) に、tk (ruby-tk) をインストールしてみた。

結論を先に書いておくけど、以下でインストールすればいいかもしれない。

gem install tk -- --with-cflags="--std=c17"

インストールで試行錯誤 :

まずは素直に以下を打ってみたけれど。

> gem install tk

Fetching tk-0.5.1.gem
Temporarily enhancing PATH for MSYS/MINGW...
Using msys2 packages: mingw-w64-ucrt-x86_64-tk
Building native extensions. This could take a while...
ERROR:  Error installing tk:
        ERROR: Failed to build gem native extension.

    current directory: D:/Ruby/Ruby34-x64/lib/ruby/gems/3.4.0/gems/tk-0.5.1/ext/tk
...
make: *** [Makefile:252: tcltklib.o] エラー 1

make failed, exit code 2

Gem files will remain installed in D:/Ruby/Ruby34-x64/lib/ruby/gems/3.4.0/gems/tk-0.5.1 for inspection.
Results logged to D:/Ruby/Ruby34-x64/lib/ruby/gems/3.4.0/extensions/x64-mingw-ucrt/3.4.0/tk-0.5.1/gem_make.out

ビルド時にエラーが出てしまってダメだった…。tcltklib.o を作れないと言ってるな…。


_tcltklib.c build issue with Windows 11 + MSYS2 (RubyInstaller) - Issue #72 - ruby/tk

Ruby 3.4.5 の時点でもエラーが出てビルドできなかったっぽい。

試しに MSYS2上で Ruby 3.4.8 をインストールして gem install tk をしてみたけど、別のエラーが出てビルドできなかった。MSYS2上ですらインストールできないのか…。


Cコンパイラに、CFLAGS="--std=c17" を渡してやれ、という話があるな…。

_Compatibility issues with Ruby 3.4.7 - Issue #74 - ruby/tk

gem install tk -- --with-cflags="--std=c17"

むむ? これならビルドが通ったっぽい?

手元にあったサンプルを動かしてみたら、Hello World的なサンプルなら動いてくれた。

余談。RubyでGUIアプリは鬼門 :

一応インストールできたけど…。Ruby/Tk で何かを作るということは、自分の場合はまず無いのだよな…。

Tkを使って何かしらを作りたいなら Python + tkinter で作るほうが良い。絶対にPythonを選んだほうが良い。

Python は tkinter が標準で同梱されてるから、Rubyのようにこんな初っ端で無意味に悩まなくて済む。しかも Python ならユーザ数も解説記事も圧倒的に多いからググってコピペしてれば大体なんとかなる。

Ruby/Tkに限らず、Ruby でGUIアプリを作ろうとすると軽く地獄を見るから止めたほうがいい…。遊びや暇潰しなら止めないけど…。

  • 今動いたとしてもRuby本体のバージョンアップが早いので、サードパーティ製GUIライブラリがRuby本体のバージョンアップに対応できず、下手すると1年後にはそのRubyスクリプトが現行バージョンで動かなくなる。
  • ruby-gtk3/gtk4 はexe化できないので、作ったGUIアプリを他のPCに持っていって使うことが難しい。
  • 他のPCでもそのGUIアプリを動かせるように RubyInstaller + gtk3/gtk4をインストールすると、全部で2.76GBほどになる。

特にストレージの圧迫具合がちょっと…。

  • Delphi や LazarusでGUIアプリを作れば数MBのexeで済む。
  • golang で作ったexeでも十数MBで済む。
  • C#で作って.NETランタイム込みにしたとしてもせいぜい100MBを超えるぐらい。

それらと比べると、Ruby製GUIアプリを動作させるための2.76GBというファイルサイズは桁違いに大き過ぎる。

そもそもRubyInstallerに同梱されてるMSYS2(DevKit)の中には Python が入ってるので…。だったら最初からPython使えよ!

そんなわけで、LL(Lightweight Language、軽量プログラミング言語)でちょっとしたGUIアプリを作りたいなら Python + tkinter のほうが絶対に良いです。exe化もできるし。

まあ、これはあくまで Windows上の話で…。gtk等があらかじめ入っていて各アプリが共用してるLinux上ならこんなギャグレベルの状態にはならないのだろうなと…。

Ruby で Qt を使えるようにした方も「もうRubyなんて使わずにPythonを使いましょうね」って言っちゃってるし…。

_ryanmelt/qtbindings: An easy to install gem version of the Ruby bindings to Qt

2026/02/22() [n年前の日記]

#1 [golang] 非MSYS2環境でFyneを使おうとして失敗

Windows11 x64 25H2 + Go 1.25.7 64bit で、GUIアプリを作成できるライブラリの Fyne を使おうとしたのだけど…。

_fyne-io/fyne: Cross platform GUI toolkit in Go inspired by Material Design

ビルドには gcc が必要になるらしいのでそのあたり試してたのだけどちょっと失敗。

結論を先に書く。MSYS2 UCRT64 の gcc を使うか、WinLibs の gcc を導入すればいい。

w64devkitを使おうとして失敗 :

w64devkit なるものを導入すれば gcc が使えるようになると知ったので試用してみた。

_skeeto/w64devkit: Portable C and C++ Development Kit for x64 (and x86) Windows

w64devkit-x64-2.5.0.7z.exe を入手して実行すると展開場所を尋ねられる。任意の場所に展開。bin/ にPATHを通して利用する。

しかし、fyne_demo をビルドしようとしたら、エラーが出てしまう。

> go install fyne.io/fyne/v2/cmd/fyne_demo@latest
go: downloading fyne.io/fyne/v2 v2.7.3
go: downloading fyne.io/fyne v1.4.3
go: downloading github.com/go-text/typesetting v0.3.3
go: downloading github.com/yuin/goldmark v1.7.8
go: downloading golang.org/x/image v0.24.0
go: downloading golang.org/x/sys v0.30.0
go: downloading fyne.io/systray v1.12.0
go: downloading github.com/fyne-io/image v0.1.1
go: downloading github.com/go-gl/glfw/v3.3/glfw v0.0.0-20240506104042-037f3cc74f2a
go: downloading github.com/fredbi/uri v1.1.1
go: downloading github.com/jeandeaual/go-locale v0.0.0-20250612000132-0ef82f21eade
go: downloading github.com/nicksnyder/go-i18n/v2 v2.5.1
go: downloading golang.org/x/text v0.22.0
go: downloading github.com/fyne-io/oksvg v0.2.0
go: downloading github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef
go: downloading github.com/go-text/render v0.2.0
go: downloading github.com/go-gl/gl v0.0.0-20231021071112-07e5d0ea2e71
go: downloading github.com/godbus/dbus/v5 v5.1.0
go: downloading github.com/jsummers/gobmp v0.0.0-20230614200233-a9de23ed2e25
go: downloading golang.org/x/net v0.35.0
go: downloading github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c
go: downloading github.com/davecgh/go-spew v1.1.1
go: downloading github.com/pmezard/go-difflib v1.0.0
# github.com/go-gl/gl/v2.1/gl
cgo: cannot parse gcc output $WORK\b311\\_cgo_.o as ELF, Mach-O, PE, XCOFF object
# github.com/go-gl/glfw/v3.3/glfw
cgo: cannot parse gcc output $WORK\b320\\_cgo_.o as ELF, Mach-O, PE, XCOFF object

ググったところ、w64devkit の gcc は BigObj なる形式のオブジェクトファイルを出力するようで、これが Go言語の cgo ―― Go言語からC言語の関数やライブラリを呼び出すための仕組みと相性が悪いというか、Go言語側が BigObj を扱えないらしい。

_debug/pe: big-obj is not supported - Issue #24341 - golang/go
_cmd/cgo: `cannot parse _cgo_.o as ELF, Mach-O, PE or XCOFF` on Windows - Issue #62236 - golang/go
_Cgo: cannot parse gcc output - Getting Help - Go Forum
_error when compiling a Go program with cgo on a 64-bit Windows 7 (v6.1 SP1) system - Issue #290 - skeeto/w64devkit

これじゃ使えないな…。w64devkit をインストールしておく意味はない…。展開場所をまるっと削除してアンインストールしておいた。

MSYS2上でビルド :

MSYS2 UCRT64上で golang をインストールして fyne_demo をビルドしてみた。その環境ならビルドも通って、動作もした。

pacman -S mingw-w64-ucrt-x86_64-go
pacman -S mingw-w64-ucrt-x86_64-toolchain

go install fyne.io/fyne/v2/cmd/fyne_demo@latest
fyne_demo

WinLibs版でビルド :

WinLibs なるものを導入することでも gcc が使えるらしい。zipを解凍して、PATHを通すだけで使える。

_WinLibs - GCC+MinGW-w64 compiler for Windows
_C言語 | MinGW-w64(WinLibs版)のダウンロードとインストール

winlibs-x86_64-posix-seh-gcc-15.2.0-mingw-w64ucrt-13.0.0-r5.zip を入手して任意の場所に解凍。今回は D:\Dev\winlibs\ucrt\mingw64\ に置いた。

bin/ にPATHを通せばgccが使えるようになるけれど、今回は winlibs_enable.bat というbatファイルを作成して、このbatファイルを実行すればPATHが通るようにしておいた。

winlibs_enable.bat
@echo off
set WINLIBSPATH=D:\Dev\winlibs\ucrt\mingw64\bin
set PATH=%WINLIBSPATH%;%PATH%
echo WinLibs (ucrt) enabled. [%WINLIBSPATH%]

この WinLibs版のgccを使ったら、fyne_demo をビルドすることができた。

go install fyne.io/fyne/v2/cmd/fyne_demo@latest
fyne_demo

依存しているDLLを調べたい :

生成したexeは、どんなDLLに依存しているのか気になった。例えば MSYS2 UCRT64上の Go でビルドして作ったexeは、MSYS2 の何か(DLL)が必要だったりしないか。そうなると、他のPCに持っていって動作させるのが面倒になる。

依存してるDLLを調べないといけない。

MSYS2上であれば、ldd が使える。

ldd ./hoge.exe


Windows上でネイティブ(?)に使えるツールは無いものだろうか…。

Dependencies というツールが使えるらしい。

_lucasg/Dependencies: A rewrite of the old legacy software "depends.exe" in C# for Windows devs to troubleshoot dll load dependencies issues.
_覚書 : Dependency Walkerはもう古い! Windows 10ならDependenciesを使え! | FRONTL1NE Community
_windows 10 では dependency walker じゃなくて dependencies を使う - いろいろ備忘録日記
_Windows10以降で.exeや.dllの依存関係を調べる方法( Dependencies ) - 放浪猫
_Dependencies: 対象DLLの変化を即座に反映する (バイナリキャッシュを無効にする方法)

Dependencies_x64_Release.zip を入手して解凍。今回は D:\Dev\Dependencies\Dependencies_x64_Release\ に置いておいた。中に入っている DependenciesGui.exe を実行すると起動する。

ウインドウに .exe をドラッグアンドドロップすれば、依存しているDLLの一覧が表示される。

とりあえず、今回ビルドした Fyne を使ってるexeは、MSYS2 関係のDLLを参照しないで、Windows11に入ってるDLLだけを参照しているように見えた。たぶんこれなら大丈夫そうかな…。

#2 [ruby] gem listからバージョン情報を除去したい

Ruby の gem を使ってインストールしたパッケージ一覧は gem list で得られる。

gem list

ただ、この一覧は、「パッケージ名 (バージョン番号)」という形で出力される。

> gem list

*** LOCAL GEMS ***

abbrev (0.1.2)
ast (2.4.3)
atk (4.3.5)
base64 (0.2.0)
benchmark (default: 0.4.0)
bigdecimal (3.1.8)
bundler (default: 4.0.6)
cairo (1.18.4)
cairo-gobject (4.3.5)
...

バージョン情報を除去したい。

以前は Perl を使ってやってたけれど、Ruby でもできそうだよなと…。AI (Google Gemini)に尋ねてみたら色々な書き方を提示されて、「やり方は色々あるんだなあ…」と感心(?)したのでメモ。

gem list | perl -pe "s/ \(.*\)//"

gem list | ruby -pe '$_.sub!(/\s.*/, "")'
gem list | ruby -ane 'puts $F[0]'
gem list | ruby -ne 'puts $_.split(" ").first'


パッケージ名とバージョン番号は空白文字で区切られているので、空白文字で分割して最初の要素だけ取り出すのが簡単ですよ、とAIが言っている。なるほどたしかにその通りかも。

#3 [prog][golang] MSYS2上でパスを変換

Windows11 x64 25H2 + MSYS2 UCRT64上で、Goでビルドして作ったはずのツールが ―― task.exe が呼び出せなくて悩んでいた。~/.bashrc の中に以下を追加してあるのだけどなあ…。どうして呼び出せないのか…。

export PATH=$PATH:$GOPATH/bin


確認してみたら、GOPATH の中身が以下のようになっていた。

$ echo $(go env GOPATH)/bin
C:\Users\USERNAME\go/bin

これはダメな気がする。最初の文字が C:\ から始まってるし、\ と / が混在してしまっている。MSYS2 上では、/c/Users/USERNAME/go/bin になっていないといけないのでは?

AI(Google Gemini)に、こういうのを変換できる何かはないのと尋ねてみたら、「cygpathというコマンドがあるよ」と言ってきた。

$ cygpath -u $(go env GOPATH)/bin
/c/Users/USERNAME/go/bin

ほほう。これは良い。良いではないか。

~/.bashrc の中に以下を書いた。

export PATH="$PATH:$(cygpath -u $(go env GOPATH))/bin"

これで、MSYS2上でも $GOPATH/bin が正しくPATHに追加される状態になった。

#4 [prog][zatta][neta] task.exeという命名はマズイ

思考メモ。

先日、Go言語製のタスクランナー task をインストールしたけれど。task という名前はマズイなと…。

MSYS2 の場合、Taskwarrior というTODO管理ツールのパッケージが存在していて、このパッケージが task.exe を提供しちゃっている…。

_Package: task - MSYS2 Packages

Go言語製タスクランナー task.exe と名前が衝突してしまう…。どうしてどいつもこいつも一般的な単語を使った安易な命名をしてしまうのか…。一体何度やらかせば気が済むのか…。でもまあ、そんなことを言い出したら、make なんて最悪のネーミング、という話にもなるのかな…。

少しググってみたら…。 go-task のほうが後からやってきて名前を衝突させたように見える。

taskに似ていて衝突しない名前は無いのかなとググってみたけど…。gtask, gotask, task555, taskmake, taske, taskete…。ダメだ。自分如きが思いつく文字列は全部使われてる。

この手のコマンドは打鍵数が極力少ないワードにしたいはずだし、そうなると衝突しない名前を見つけるのは難しそう。大体は使われちゃってるよなあ…。

妄想 :

もしかすると、こういうのって非英語圏のワードを使って命名したほうがいいのかもしれないな…。ガイナックスのガイナとか、スタジオジブリのジブリとか、特定の地域でしか使われてないワードを当てるノリ。ジブリはちょっと違うか。ジブリだと思ってたらジブリじゃなかったらしいし。アレはわざと変えてみたのか、それとも偶然なのか、どっちなんだろう。

でも、非英語圏のワードを使うと呪文っぽくなりそうな気もする。いっそのこと呪文らしいワードにしたほうが良かったりして。プログラマーのウイザード感も出るし。

日本のアニメが好きな作者さんが「cano」「pample」「pimple」「pampopum」というコマンド名を命名するのもアリだろうか…。ググったら「cano.exe」はもうあった。しかもマルウェア…。

#5 [golang] Chocolatey経由でgo-taskをインストール - 2026/02/22

MSYS2 UCRT64上で go-task がインストールできなくてアレコレしているうちに、Chocolatey 経由で go-task をインストールしてしまった。一応メモしておく。

管理者権限で PowerShell 7 を開いて以下を打った。
choco install go-task

> where task
C:\ProgramData\chocolatey\bin\task.exe
C:\Users\mieki256\go\bin\task.exe

> task --version
3.46.4

2ヶ所に入ってしまっているけれど…。まあいいか…。とりあえず現状では Chocolatey版が使われる。Go言語でインストールした版より、ほんのちょっとだけ古い模様。

2026/02/23(月) [n年前の日記]

#1 [ruby] libuiとglimmer-dsl-libuiをRuby 3.4.8 x64にインストール

せっかく Windows11 x64 25H2上に Ruby 3.4.8 x64 (RubyInstaller版) をインストールしたので、各ライブラリの動作確認中。

libuiをインストール :

RubyでGUIアプリを作れるライブラリ、libui をインストールしてみた。.dll が同梱されているので gem install 時にビルド処理をせず、すぐ使える。らしい。

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

インストールは以下。
gem install libui

> gem list | grep libui
glimmer-dsl-libui (0.13.1)
libui (0.2.0 x64-mingw-ucrt)

examples/ 内のほとんどはすんなり動いてくれた。ただ、以下のスクリプトは正常動作しなかった。

  • basic_table_image.rb は何も表示されなかった。
  • spectrum.rb は ffi-portaudio が cannot load such file とエラーが出た。
  • turing_pattern.rb は numo/narray が cannot load such file とエラーが出た。


Ruby 32bit版で試した時は .dll の差し替えが必要だったけれど、Ruby 64bit版ならすんなり動いてくれるっぽい。

glimmer-dsl-libuiをRuby 3.4.8 x64にインストール :

Windows11 x64 25H2 + Ruby 3.4.8 x64上で glimmer-dsl-libui をインストールしてみた。RubyでGUIアプリを作成できる libui を更に使いやすくしてくれるライブラリらしい。

_glimmer-dsl-libui | RubyGems.org | コミュニティのgemホスティングサービス
_AndyObtiva/glimmer-dsl-libui: Glimmer DSL for LibUI

gem install glimmer-dsl-libui

> gem list | grep glimmer-dsl-libui
glimmer-dsl-libui (0.13.1)

githubのリポジトリを git clone で入手して examples/ 以下でそれぞれ実行してみたら色々と動作してくれた。

git clone https://github.com/AndyObtiva/glimmer-dsl-libui.git
cd examples
ruby basic_area.rb

後で知ったけれど、そもそも以下を動かせばサンプルを選び放題だった…。
glimmer examples

利用してるlibuiのバージョンについて :

2026/02/23現在、libuiの現行バージョンは 0.2.0 だけど、glimmer-dsl-libui が要求する libui は 0.1.2 だった。

> gem install glimmer-dsl-libui
Fetching libui-0.1.2-x64-mingw.gem
Successfully installed libui-0.1.2-x64-mingw
Successfully installed glimmer-dsl-libui-0.13.1
Parsing documentation for libui-0.1.2-x64-mingw
Installing ri documentation for libui-0.1.2-x64-mingw
Parsing documentation for glimmer-dsl-libui-0.13.1
Done installing documentation for libui, glimmer-dsl-libui after 3 seconds
2 gems installed

> gem list | grep libui
glimmer-dsl-libui (0.13.1)
libui (0.2.0 x64-mingw-ucrt, 0.1.2 x64-mingw)

libui 0.2.0 だけがインストールされてる状態では、glimmer-dsl-libui はエラーを出して動作しなかった。

exe化は難ありかもしれない :

glimmer-dsl-libui 関連ページを眺めていたら、おそらくは作者さんが「パッケージングまで視野に入れているなら glimmer-dsl-libui はおススメしない。その場合は glimmer-dsl-SWT がおススメ」と言及していた…。

_AndyObtiva/glimmer-dsl-swt

JRuby上で使えるGUIライブラリだろうか。JavaのSWTを呼び出して使えるのかな…。

glimmer-dsl-libui は動作に必要なファイル群が既にインストールされてる状況で使うことを想定して作ってる、との言及もどこかで目にしたような…。つまりexe化して利用することは想定外ということかもしれない…。

#2 [ruby] 日付とRubyバージョンでファイル名を作って保存

Ruby の gem list を、日付とRUbyバージョンでファイル名を作ってテキスト保存するスクリプトをAI(Google Gemini)に作成してもらったのでメモ。

savegemlist.rb
dnum = Time.now.strftime('%Y%m%d')
vnum = RUBY_VERSION.delete('.')
filename = "#{dnum}_Ruby#{vnum}.txt"
filename_nover = "#{dnum}_Ruby#{vnum}_no-versions.txt"

File.write(filename, `gem list`)

gem_list_clean = `gem list`.gsub(/\s\(.*\)/, "")
File.write(filename_nover, gem_list_clean)

puts "Save : #{filename}"
puts "Save : #{filename_nover}"

このくらいのスクリプトならさっくり作成してもらえるなんて凄い時代になってきた…。しかも「コメントをつけて」とお願いすると細かく説明してくれる…。

# 1. 現在の日付を「YYYYMMDD」形式(例:20260224)で取得して変数dnumに代入
dnum = Time.now.strftime('%Y%m%d')

# 2. 実行中のRubyのバージョン(例:3.2.1)から「.」を取り除き(例:321)、変数vnumに代入
vnum = RUBY_VERSION.delete('.')

# 3. 保存するファイル名を生成(例:20260224_Ruby321.txt)
filename = "#{dnum}_Ruby#{vnum}.txt"

# 4. バージョン番号を含まない保存用ファイル名を生成(例:20260224_Ruby321_no-versions.txt)
filename_nover = "#{dnum}_Ruby#{vnum}_no-versions.txt"

# 5. バッククォート「` `」でシェルコマンド `gem list` を実行し、
#    その標準出力を filename に指定したファイルへ書き込む
File.write(filename, `gem list`)

# 6. `gem list` の結果から、正規表現を用いて「 (1.2.3)」のようなバージョン表記部分を
#    空文字に置換(削除)し、変数 gem_list_clean に代入
#    ※ \s は空白、\(.*\) は括弧で囲まれた任意の文字列にマッチ
gem_list_clean = `gem list`.gsub(/\s\(.*\)/, "")

# 7. 加工したクリーンなリストを filename_nover に指定したファイルへ書き込む
File.write(filename_nover, gem_list_clean)

# 8. 完了メッセージをコンソールに表示
puts "Save : #{filename}"
puts "Save : #{filename_nover}"

#3 [movie] 「この動画は再生できません THE MOVIE」を視聴

昨日BS12で放送されていた版を録画していたので視聴。実写映画。TVドラマの映画版。ホラー作品、いや、ミステリー作品だろうか…。探偵モノでもあるのだろうか…?

面白かった。TVドラマ版と変わらぬ安定したクオリティ。

BS12で日曜日にアニメ映画が放送されたすぐ後にTVドラマ版が放送されていて、たまたまチャンネルをそのままにしていたら設定や脚本の優秀さに唸ってしまったわけで…。前半でネット配信動画やビデオ作品の類を流すのだけど、見ていて気付かない部分に実は奇妙なものがしっかり撮影されていて、後半で謎解きをしていく構成で…。「えー。そこにそんなものが映ってたんかい。これは気づかなかった…」と何度も驚かされたというか…。見るからに低予算っぽいのだけど脚本の上手さで見れてしまうシリーズだなと…。

映画版も基本的にはTVドラマ版と同様の構成で、 一見すると全く関係なさそうな各エピソードがラストに近づくにつれて一気に収束していく、その脚本の作りにこれまた唸ってしまった。しかも、 そこに映画への情熱があったが故に、という展開を映画作品の中で見せているわけで…。映画をテーマにした映画と言えば「ニュー・シネマ・パラダイス」あたりを思い出すのだけど、ああいった作品のベクトルを180度回してみせたような映画だなと…。

ところどころで出てくる映像編集業界事情っぽい話も聞いていて面白いけれど、デジタル撮影機器やスマホにまつわる技術的な話が事件に絡んでくるあたりは上手いなと…。携帯電話の登場で、もう脚本なんて書けないと言い出した脚本家さん達が居たらしいのだけど、そういう方々とは真逆に、現代のデジタル機器を上手に取り込んで話を作り上げていくその手管には感心することしきり。

主演の二人はお笑いコンビの方らしいのだけど、どこか抜けてる感じのやり取りがこれまたイイ感じで…。正真正銘のコントになってるというか…。

何にせよ、この作りは上手いなあと…。映画版も感心させられました。上手い。実に上手い。

書き忘れてた。 16:9と4:3を利用した謎には「これはやられた…」と…。アニメなどで過去回想を 4:3で流すシーンを目にして感心した記憶があるのだけど、まさかこんな使い方までできるとは…。この発想は無かった…。脱帽です…。

2026/02/24(火) [n年前の日記]

#1 [nim] Nimをインストールして試用してみた

Pythonと似た感じでソースコードを書けて、一発で exe を作ってくれる、Nim というプログラミング言語があるらしい。

_Nim Programming Language

ちょっと気になる。少し試用してみようかなと…。環境は Windows11 x64 25H2。

choosenimを使ってインストール :

Nimのバージョンを管理できる choosenim というツールがあるらしい。最初はそちらを使ってインストールを試みた。

注意点。インストールする前に、%USERPROFILE%\.nimble\bin\ (通常は C:\Users\ユーザ名\.nimble\bin\) というフォルダを作っておいたほうが良さそう。インストール時、該当フォルダに.dllをコピーするのだけど、最初はそのフォルダが無いから「コピーできない」とエラーになる…。事前に作っておけばそのエラーは出なくなりそう。

_nim-lang/choosenim: Official tool for easily installing and managing multiple versions of the Nim programming language.
_Releases - nim-lang/choosenim
_Nim の環境構築・アップデート・削除 〜Windows 編〜 - akagma

choosenim-installer-0.8.4_windows_amd64-download-this-not-the-exe.zip を入手して解凍。今回は、D:\Dev\nim\choosenim\ というフォルダを作成して、その中にファイル群を入れた。

runme.bat というファイルがあるのでコマンドプロンプト上で実行。管理者権限は要らない…と思う。

%USERPROFILE%\.nimble\bin\ に色々なファイルがコピーされた。

環境変数PATHに、%USERPROFILE%\.nimble\bin を追加しておく。

> which choosenim
"C:\Users\USERNAME\.nimble\bin\choosenim.exe"

> which nim
"C:\Users\USERNAME\.nimble\bin\nim.exe"

> which nimble
"C:\Users\USERNAME\.nimble\bin\nimble.exe"

> choosenim show
  Selected: 2.2.8
   Channel: stable
      Path: C:\Users\USERNAME\.choosenim\toolchains\nim-2.2.8

> nim --version
Nim Compiler Version 2.2.8 [Windows: amd64]
Compiled at 2026-02-23
Copyright (c) 2006-2026 by Andreas Rumpf

active boot switches: -d:release

インストールできたっぽい。choosenim 自体も、%USERPROFILE%\.nimble\bin\ の中にコピーされていた。

公式バイナリをインストールし直し :

公式サイトを眺めていたら、MinGW(MinGW64)が必要と書いてあった。先ほど試した choosenim によるインストールでは、MinGW64 はインストールされていない気がする…。公式版でインストールし直してみるか…。

_Windows installation - Nim Programming Language

nim-2.2.6_x64.zip を入手して解凍。今回は、D:\Dev\nim\nim-2.2.6_x64\ に中身を置いておいた。

中に finish.exe が入っているのでコマンドプロンプト上で実行。

  • D:\Dev\nim\nim-2.2.6_x64\bin と %USERPROFILE%\.nimble\bin をPATHに追加するかと尋ねてくるので「y」を入力。
  • MinGW をインストールするかと尋ねてきたので「y」。D:\Dev\nim\nim-2.2.6_x64\dist\mingw64\ 以下に MinGW64 がインストールされたように見えた。
  • スタートメニューに項目を追加するかと尋ねてきたので「y」。

これでインストールされたらしい。

MinGW64がインストールされている場所、D:\Dev\nim\nim-2.2.8_x64\dist\mingw64\bin にPATHを通しておかないとダメっぽい…。普段 gcc にはパスを通したくないんだけどなあ…。

batファイルを作って対応することにした。

nim_enable.bat
@echo off
@rem Nim enable. Add PATH.

set NIMDIR=D:\Dev\nim\nim-2.2.8_x64
@rem set NIMDIR=D:\Dev\nim\nim-2.2.6_x64

set NIMLOCALBIN=%USERPROFILE%\.nimble\bin
set NIMBINPATH=%NIMDIR%\bin
set MINGW64PATH=%NIMDIR%\dist\mingw64\bin
set NIMALLPATH=%NIMLOCALBIN%;%NIMBINPATH%;%MINGW64PATH%

set PATH=%NIMALLPATH%;%PATH%

@rem PerlのPATHだけ除外。自分の環境はPerl内にもgccが入ってしまっているので…
call %HOMEBIN%\rmperl.bat

echo Nim enable. Add Path [%NIMALLPATH%]

ここまで作業して気づいたけれど、ダウンロードページの下のほうに Nim 2.2.8 があるではないか…。

_Download - Nim Programming Language

Nim 2.2.6 をインストールしてしまった…。Nim 2.2.8 をインストールし直した。nim-2.2.8-windows_x64.zip をダウンロードして解凍してここまでの作業を繰り返し。

Hello World :

hello.nim というテキストファイルを作成して以下の内容で保存。

echo "Hello, World !"


コンパイルは以下。

nim compile hello.nim
or
nim c hello

  • 「compile」は「c」だけで済ませられる。
  • 拡張子が無かったら「.nim」を追加して処理してくれる。

hello.exe が作成された。実行すると「Hello, World !」が表示された。

コンパイルした直後に実行することもできる模様。

nim c --run hello
or
nim c -r hello

wNimをインストール :

Nim言語でWindows用のGUIアプリを作成できる、wNim というライブラリがあるらしい。インストールしてみる。

_khchen/wNim: Nim's Windows GUI Framework
_NimのGUIでいい感じの「wNim」 | Nな人のWeb示録

環境は Windows11 x64 25H2 + Nim 2.2.8。

> nimble install wnim

Downloading Official package list
    Success Package list downloaded.
Downloading https://github.com/khchen/wNim using git
Downloading https://github.com/khchen/winim using git
Downloading https://github.com/zevv/npeg using git
Downloading https://github.com/khchen/memlib using git
   Warning: The package has no tagged releases, downloading HEAD instead.
Downloading https://github.com/khchen/minhook using git
Downloading https://github.com/zevv/npeg using git
Downloading https://github.com/khchen/winim using git
Downloading https://github.com/khchen/memlib using git

しかし、ただウインドウを表示するだけのサンプルですらコンパイルエラーが出る。

hellonim.nim
import wNim/[wApp, wFrame]

let app = App()
let frame = Frame(title="Hello World", size=(400, 300))

frame.center()
frame.show()
app.mainLoop()

nim c hellonim.nim

fatal.nim(62)            sysFatal
Error: unhandled exception: field 'floatVal' is not accessible for type 'TFullReg' using 'kind = rkInt' [FieldDefect]

wnim の githubページのサンプルファイル群すらコンパイルエラーになる…。Nim 2.2.6、Nim 2.2.8 のどちらを使ってもダメ。

「Nim 1.6.20 なら動くんじゃね? ユー、choosenim を使っちゃいなよ」、とAI(Google Gemini)が言っている。

choosenim は Nim のバージョンを切り替えることができるツール、らしい。

choosenim 1.6.20

> nim -v
Nim Compiler Version 1.6.20 [Windows: amd64]
Compiled at 2024-04-07
Copyright (c) 2006-2023 by Andreas Rumpf

active boot switches: -d:release

これで Nim 1.6.20 が使えるようになった。

nimble uninstall wnim
nimble install wnim

nim c hellonim.nim

コンパイルが通ってexeが生成できた。実行もできたし、ウインドウも表示された。

choosenim 2.0.0 と打って Nim 2.0.0 もインストールしてみた。Nim 2.0.0 でもコンパイルは通った。

Nim 2.0.6 で wnim が動いてるという記事も見かけた。choosenim 2.0.6 で Nim 2.0.6 もインストールしてみた。Nim 2.0.6 でもコンパイルは通った。


他の方法として、「--mm:refc」をつけて試せ、とAI(Google Gemini)が言っている。Nim 2.2.8 で試してみよう…。

_Nim's Memory Management

> nim -v
Nim Compiler Version 2.2.8 [Windows: amd64]
Compiled at 2026-02-23
Copyright (c) 2006-2026 by Andreas Rumpf

active boot switches: -d:release

> nim compile --mm:refc hellonim.nim
Hint: used config file 'C:\Users\USERNAME\.choosenim\toolchains\nim-2.2.8\config\nim.cfg' [Conf]
Hint: used config file 'C:\Users\USERNAME\.choosenim\toolchains\nim-2.2.8\config\config.nims' [Conf]
..............................................................................................................................fatal.nim(62)            sysFatal
Error: unhandled exception: field 'floatVal' is not accessible for type 'TFullReg' using 'kind = rkInt' [FieldDefect]

これはダメっぽい。


現状で wnim を使うには、Nim のバージョンを 1.6.20、2.0.0、2.0.6 に落とすぐらいしか手は無さそう。

なんだか Ruby と同じ臭いがしてきた…。本体のバージョンアップに外部ライブラリが追従できてない状況がありそうな気がする…。

VSCodeをNimに対応させたい :

VSCode(Visual Studio Code)でNimに対応させたい。環境は Windows11 x64 25H2。

_nim-lang.org - Visual Studio Marketplace
_Nim - Visual Studio Marketplace

後者のほうがDL数は多いけど、最終更新日が古い。前者のほうがまだ最終更新日が新しい。ただ、nimlangserver なるものが必要らしくて…。

nimlangserver とは以下のことだろうか。

_nim-lang/langserver: The Nim language server implementation (based on nimsuggest)

本来なら以下でインストールできるらしいのだけど…。
nimble install nimlangserver

2026/02/24の時点ではエラーが出る。Nimのバージョンを 2.2.8、2.0.6、1.6.20 にしてもダメ。
> nimble install nimlangserver
Downloading https://github.com/nim-lang/Nim.git using git
       Tip: 5 messages have been suppressed, use --verbose to show them.
nimble.nim(797)          downloadDependency

    Error:  Downloaded package checksum does not correspond to that in the lock file:
        ...   Package:           nim@v.2.0.8@r.5935c3bfa9fec6505394867b23510eb5cbab3dbf
        ...   Checksum:          efb469b3ca8c4ec85c5829fa18997508672f9740
        ...   Expected checksum: 46333e8f4bda41dd6d3852a3f5fa4975b96b66a2

どうしたものかと nimlangserver のページを眺めていたら Releasesページにバイナリがあるように見えた。

_Releases - nim-lang/langserver

nimlangserver-windows-amd64.zip をDLして解凍すると、中に nimlangserver.exe がある。これを使ってみようか…。C:\Users\USERNAME\.nimble\bin\ 以下にコピーしておいた。

VSCode を起動して拡張機能をインストール。

_nim-lang.org - Visual Studio Marketplace

少なくとも .nim を開いた時に色付け表示はされた。

ただ、VSCode 使用時に、環境変数PATHに Nim関係のパスを含めておかないといけない…。常に Nim を使いたいわけではないのだよな…。どうしたものか…。色分け表示してくれるぐらいでも十分なんだけどなあ…。

Notepad++のNim言語設定ファイル :

テキストエディタ NotePad++用のNim言語定義ファイルは無いのかなとググってみた。

_nim notepad++ - Pastebin.com
_Nim Notepad++ language definition - Pastebin.com
_Nim support for Notepad ++ - Nim forum

どれかしらをダウンロードして、Notepad++の、言語 → ユーザー定義 → 言語の定義。インポートをクリックして取り込めば設定が保存される…のだろうか? 設定ダイアログを一旦閉じてまた開けば、Nimの設定が選べるようになった。

しかし、設定した後で以下の投稿を目にした。

_Updated Nim support in Notepad++ - Nim forum

Notepad++ 8.9.1 から、Nim に公式対応したらしい。せっかくだから NotePad++ をアップデートしておくか…。

32bit ポータブル版の npp.8.9.2.portable.zip をダウンロードして解凍して、今まで利用していた版に上書きインストールしておいた。ユーザー定義した Nim の設定は削除。


余談。Notepad++ は中国から敵視されている模様…。あの国は異常…。

_Notepad++ v8.9.2 release - Double?Lock Update Security | Notepad++
_Important Clarification: Notepad++ Security Incident | Notepad++
_Notepad++ Hijacked by State-Sponsored Hackers | Notepad++
_人気テキストエディター「Notepad++」が検索エンジンBingをブロック、その理由が波紋呼ぶ【やじうまWatch】 - INTERNET Watch
_Notepad++が国家支援ハッカーにハイジャックされマルウェア入りインストーラーを配布していたことが判明 - GIGAZINE

Mery用のNim言語構文ファイル :

テキストエディタ Mery用のNim言語構文ファイルがあるらしい。

_Mery用構文ファイル(Nim)
_構文ファイル - MeryWiki

Meryを起動して、表示 → 編集モード → 編集モードの設定。新規作成 → Nimと入力 → プロパティ → インポート → .msy を選択。

.nim を開いたら色がついた表示になった。

2026/02/25(水) [n年前の日記]

#1 [nim] wNimについて勉強中

Nim言語でWindows用のGUIアプリを作成できるライブラリ、wNim について勉強中。

環境は Windows11 x64 25H2 + Nim 2.0.6 x64。

wNimが利用できるNimのバージョンについて :

wNim が Nim 2.2.6 や 2.2.8 で動かなくて、Nim 2.0.6 なら動くのは分かったけれど。Nim 2.0.x にはどんなバージョンがあるのか確認してみたら、2.0.6 以降は 2.0.8, 2.0.10, 2.0.12, 2.0.14, 2.0.16 がある模様。

2.0.16 でも wNim が利用できないものか。choosenim 2.0.xx と打って試してみた。

  • Nim 2.0.8 までなら wNim を使ってもコンパイルエラーが出なかったし動いてくれた。
  • Nim 2.0.10, 2.0.12, 2.0.14, 2.0.16 はコンパイルエラーが出て動かなかった。

2026/02/25現在、wNim を使いたいなら Nim 2.0.8 までに留めておくしかなさそう…。

wNim利用時のコンパイル指定 :

今のところ以下の指定をしてコンパイルしてる。

nim c -d:release -d:strip --opt:size --app:gui hellownim2.nim

  • -d:release はリリース用ビルド。Cコンパイラに最適化オプションを渡すので、出来上がった実行形式バイナリの処理速度が速くなる。これをつけないと処理速度がめっちゃ遅くなる。と言われてる。
  • -d:strip は、デバッグ情報の削除。ファイルサイズが小さくなってくれる。
  • --opt:size は、実行速度よりもファイルサイズ削減を優先せよ、という指定。
  • --app:gui は、GUIアプリを作成せよ、という指定。エクスプローラ等でダブルクリックして実行した際にコマンドプロンプトが出なくなる

以下の記事の解説が参考になった。ありがたや。

_Nim 最適化の方法と--optオプション (改訂版) Nim - Qiita

wNimのレイアウトについて :

wNim の部品レイアウトには、VFL (Visual Format Language) なる記述フォーマットを使うらしい。Apple が提案したやり方…なのだろうか? 違うのかな?

_Auto Layout Guide: Visual Format Language
_VFLを使ってみよう
_autolayout

wNim はそのやり方にインスパイアされて、似たような感じの記述方法を盛り込んでみた、ということらしい。一応分かった範囲でメモしておく。

wNim の場合、基本的には「H:」で横方向の配置指定をして、「V:」で縦方向の配置指定をしていく。

「H:」と「V:」を別々に記述する場合、
「横方向については、この部品はココに配置される」
「縦方向については、この部品はココに配置される」
という書き方になるので、部品名が二度出現することになる。

例えば以下のサンプルの場合、ラベル1、ラベル2、ボタンが、ずらりと縦方向に並ぶ配置になるわけだけど…。

hellownim2_ss01.png


_hellownim2.nim
import wNim

# アプリケーションの基盤準備

let app = App() # wNimアプリケーションのインスタンス作成
let frame = Frame(title = "Hello wNim") # メインウィンドウ(枠)の作成
let panel = Panel(frame) # ウィンドウ上の土台となるパネルを作成

# コントロール(部品)の作成

let sText1 = StaticText(panel, label = "Hello World")

# フォント設定: サイズ28, サンセリフ体(Swiss), 太字(Bold)
sText1.font = Font(28, family = wFontFamilySwiss, weight = wFontWeightBold)

# テキストの内容に合わせてコントロール自体のサイズを自動調整
sText1.fit()

let sText2 = StaticText(panel, label = "Hello wNim")
sText2.font = Font(16, family = wFontFamilySwiss, weight = wFontWeightBold)
sText2.fit()

let btn = Button(panel, label = "Click Me!")

# レイアウト定義(AutoLayout)
proc layout() =
  # autolayout: 文字列で相対的な位置関係を記述する機能
  # | : 親要素(panel)の端
  # ~ : 柔軟なスペース(スプリングのようなもの)
  # [element] : 配置するコントロール
  # (n) : サイズ指定(ピクセル)
  panel.autolayout """
    H:|~[sText1]~|      # 水平方向(H): 左右に伸縮空間を入れ、テキストを中央寄せ
    H:|~[sText2]~|
    H:|~[btn(200)]~|    # 水平方向(H): ボタン幅を200固定にし、左右に空間を入れて中央寄せ
    V:|~[sText1]~[sText2]~[btn(50)]~| # 垂直方向(V): 上下と間に空間を入れ、ボタン高さを50に固定
  """

# イベントハンドラ(動作)の定義

# パネルのサイズが変更された時にレイアウトを再計算する
panel.wEvent_Size do():
  layout()

# ボタンがクリックされた時の処理
btn.wEvent_Button do():
  # メッセージダイアログを生成して表示(.display() はモーダル表示)
  MessageDialog(frame, "Hello", caption = "MessageDialog").display()

# 5. アプリの起動準備
layout() # 初回起動時の配置計算
frame.center() # 画面の中央にウィンドウを表示
frame.show() # ウィンドウを可視化
app.mainLoop() # イベントループ開始(終了まで待機)


レイアウトを指定しているのは、proc layout() = のあたり。

proc layout() =
  panel.autolayout """
    H:|~[sText1]~|
    H:|~[sText2]~|
    H:|~[btn(200)]~|
    V:|~[sText1]~[sText2]~[btn(50)]~|
  """

コメント付きなら以下。AI(Google Gemini)にコメントをつけてもらった。

# レイアウト定義(AutoLayout)
proc layout() =
  # autolayout: 文字列で相対的な位置関係を記述する機能
  # | : 親要素(panel)の端
  # ~ : 柔軟なスペース(スプリングのようなもの)
  # [element] : 配置するコントロール
  # (n) : サイズ指定(ピクセル)
  panel.autolayout """
    H:|~[sText1]~|      # 水平方向(H): 左右に伸縮空間を入れ、テキストを中央寄せ
    H:|~[sText2]~|
    H:|~[btn(200)]~|    # 水平方向(H): ボタン幅を200固定にし、左右に空間を入れて中央寄せ
    V:|~[sText1]~[sText2]~[btn(50)]~| # 垂直方向(V): 上下と間に空間を入れ、ボタン高さを50に固定
  """


  • 部品間に隙間を入れたい場合は「-」か「~」が使える。「-」は固定スペース。「~」は伸縮スペース。
  • 「|」は、親ウインドウの境界の端を示している。例えば、「H:|-[部品A]」と書いてあれば、「横方向の指定 : 親ウインドウの左端から、固定スペースが入って、部品Aが配置される」という意味になる。
  • 「[部品名]」という記述が出現するけれど、「[ ]」は列相当になるのかな…。その列の中にはこの部品が入るぞ、という指定だと思われる。
  • その列(or 行)の中に複数の部品が入る時は、「[部品A,部品B]」という記述になる時もある。
  • 部品名のすぐ後ろに「[部品A(100)]」等、括弧と数値が付く時がある。これは横幅、もしくは縦幅を指定してる。単位はドット。「H:」の指定行で書けば横幅の指定になり、「V:」の指定行で書けば縦幅の指定になる。数値の代わりに部品名を書いてもいい。例えば「[部品A(部品B)]」と書けば、部品Aの幅は部品Bの幅と同じにする、という意味になる。


wNim の examples/ の中の autolayoutEditor.nim をコンパイルして、autolayoutEditor.exe を作って実行すると、こういうVFLの記述をすればこういうレイアウトになる、というサンプルがいくつか見れるようになるので、多少は参考になりそう。

autolayoutEditor_ss01.png

余談。VFLは分かりづらい気がする :

PySimpleGUI あたりを触ってしまった後では、VFL って分かりづらいなと…。最初に目にしたときはチンプンカンプンだった…。

PySimpleGUI のように、二次元配列で部品名を記述してテーブルレイアウトで済ませてはダメなのだろうか? いやまあ、部品同士がずれるような配置はテーブルレイアウトだとちょっとややこしくなるけれど、ほとんどのGUIアプリはテーブルレイアウトで対応できそうな気も…。

どんな文書もExcelで作ってしまう人が出現してしまうぐらいに、テーブルレイアウトって初心者でも分かりやすい上に意外と万能、なのではないかなあ…。GUI部品のレイアウトって再利用しない系の情報だろうから、万が一ネ申Excelっぽくなっても問題無さそうな…。

余談その2。AIは頼りにならない :

wNim関係の質問をAIにしてみると嘘ばかり返ってくる…。妙な部分を逐一指摘していったら、とうとうAIが「サンプルソースを確認するのが確実です」と言ってきた…。たしかにその通りだけど、AIまで匙を投げたか…。ドキュメントやソースコードの量がまだ全然少なくて学習が不十分ということなんだろう…。

#2 [nim] NiGuiを試用

Nim言語でGUIアプリを作成できるライブラリとして、NiGui というものがあるらしい。

wNim はWindows専用だったけど、この NiGui はクロスプラットフォーム対応 ―― Windows/Linux/Mac でも使えるのだとか。

_simonkrauter/NiGui: Cross-platform desktop GUI toolkit written in Nim

気になったので試用してみることにした。環境は Windows11 x64 25H2 + Nim 2.2.8 x64。

インストール :

nimble install nigui

使ってみた :

wNim は Nim のバージョンを 1.6.20、2.0.0、2.0.6、2.0.8 等に落とさないと使えなかったけれど、NiGui は Nim 2.2.8 でもあっさり使えてしまった。

サンプルは以下。

_hellonigui.nim
import nigui

app.init()
let win = newWindow("Hello NiGui")
win.width = 400.scaleToDpi
win.height = 300.scaleToDpi

win.iconPath = "example_01_basic_app.png"

let con = newLayoutContainer(Layout_Vertical)
win.add(con)

let lbl = newLabel("Hello NiGui.")
lbl.fontSize = 28
lbl.fontFamily = "Consolas"
lbl.width = 350
lbl.height = 100
con.add(lbl)

let btn = newButton("Button 1")
con.add(btn)

let exitBtn = newButton("Quit")
con.add(exitBtn)

btn.onClick = proc(event: ClickEvent) =
  win.alert("Hello. This is a simple message box.")

exitBtn.onClick = proc(event: ClickEvent) =
  app.quit()

win.show()
app.run()

コンパイルは以下。
nim c -d:release -d:strip --opt:size --app:gui hellonigui.nim

hellonigui.exe が生成された。実行もできた。

hellonigui_s01.png

雑感 :

wNim に比べると圧倒的に分かりやすい気がする…。しかも、現行版 Nim 2.2.8 でもコンパイルエラーを出さずに使えるし。さらにクロスプラットフォーム対応。もうこれでいいんじゃないか…?

ただ、シンプルな仕様にした分、制限もあるようで…。

「ボタンの背景色を変えることなどはできない」
「見た目を変えたいならカスタムコントロールを作れ。自前で描画処理を書くのが面倒だけど」
「そういう時は別のGUIライブラリを検討したほうがいい」

といった言及を公式サイト上で見かけた。

見た目にはこだわらず、質実剛健、シンプルイズベストで作るなら、このライブラリは実にイイ感じかもしれない。

というか、wNim を触って、やれコンパイルができないだの、レイアウト方法が分からないだので悩んでいたわけだけど、NiGui を触ったらどれもサクサクと動作確認ができて、wNim を試用していたことがちょっと馬鹿らしくなってきて…。ひとまず何かしら動いてくれないと話にならないわけで、動かせる状態にするだけでもスンナリ行かないライブラリはちょっとなあ…。

気になる点 :

ラベルを表示してみたら、ウインドウが表示されてからラベルが表示されるまで、ワンテンポ遅れる感じが…。何か計算してるのだろうか…。それともリトライ処理でもしてるのだろうか…。

#3 [anime] 「シン・エヴァンゲリオン劇場版」が地上波放送されていたらしい

録画していたTVアニメを消化していたら「シンエヴァを明日放送するよ!」と番宣映像が…。知らなかった。もう放送日過ぎちゃってるがな…。完全に見逃した…。ショック…。

ま、いっか。どうしても見たかったらお金を払ってでも見るよな…。自分の中でそこまでする気はないということは、心のどこかでこれは見なくてもいい作品とうっすら思ってるのかもしれない…。いや、たまたま何かの拍子に偶然目にして「この映画…すげえ…とんでもねえな…」と思う時も結構あるのだけど…。期待度と作品の出来不出来は全く別と言うか…。

個人的にエヴァ新劇場版は、もう何をやってるのかさっぱりわからない印象で…。1作目はTV版を踏襲してたからまだ流れがうっすら理解できたけど、2作目、3作目は頭の中が「???」だらけに…。ついていけない…。いや、考えてみたら旧劇場版も「???」だった気がしてきた。「映像凄いな…。でも状況がさっぱり分からん…」と…。凄い映像を見れてるんだから自分は損をしてないはずだ、と必死に思い込もうとしていたような気もする…。

新作が出てくるらしいけど、きっとそれも自分が見たら何が何だかさっぱり分からないのだろう…。ファンの人達は凄い…。色々なメディアから補足情報を探してきて、どうにか補完して理解してるんだろう…。根気が要る作業だろうなあ…。

#4 [nitijyou] 親父さんが入院

詳細はGRPでメモ。

2026/02/26(木) [n年前の日記]

#1 [golang] Go言語でスクリーンセーバを作れないか実験中

Go言語(golang)でWindows用のスクリーンセーバを作れそうかどうか実験しているところ。環境は Windows11 x64 25H2 + Go 1.25.7 64bit。

Windows用スクリーンセーバには3つのモードがある。コマンドラインオプションに応じて動作を変えないといけない。


今回は以下のような処理にする。
たぶんこの構成(?)で実現できるのではないかなあと思っているのだけど…。

プレビュー画面モードだけがちょっと面倒臭い。HWND(ウインドウハンドル)を利用して子ウインドウを作成するというのがちょっと…。このあたりの処理をするだけでも、結構ソースが長くなってしまう…。

リソースファイル作成で悩んだ :

リソースファイルにはアイコンやファイルバージョン等を含めることができるけれど、Windows用スクリーンセーバを作る場合、リソースファイルに STRINGTABLE なる種類のデータを用意して、そこでスクリーンセーバ名を記述しないといけない。

_第128章 スクリーンセーバー その2
_スクリーンセーバーを作ったが、名前を設定できずにファイル名になってしまう
_よしいずの雑記帳 スクリーンセーバーの作り方

また、今回作ろうとしているスクリーンセーバは、プレビュー画面モード用にbmp画像を内包しないといけないので、そのあたりもリソースファイルに記述したい。

MinGW等に付属している windres を使えばそういった記述が可能なのだけど…。今回、go-winres というツールを使って済ませられないかと思ってしまって、そこから悩み始めてしまった。書き方が分からない…。

_tc-hib/go-winres: Command line tool for adding Windows resources to executable files

go-winres は windres と違って、winres.json というjsonファイルにリソースについて記述していくのだけど…。

bmp画像については、おそらく "RT_BITMAP" という指定でいいのかなと…。github上のサンプル(?)にもそういう記述が見えるし…。

_go-winres/_testdata/test.json at main - tc-hib/go-winres

ただ、STRINGTABLE はどう書けばいいのか分からない…。いくらググっても使用事例が見つからない…。AI(Google Gemini)に尋ねてもエラーが出る書き方ばかり提示してくる。学習元となる情報がおそらく存在しないから嘘を言ってくるのだろう…。

解決策が見つからなくて、結局 MinGW の windres を使ってリソースを書くことにしてしまった。しかしこれだと、ビルド時には go.exe 以外にも MinGW が必要になってしまう…。

Ebitengineの動作が怪しい :

一応、Go言語でWindows用スクリーンセーバを作れたような感じになってきたのだけど、動作確認をしてみたら Ebitengine を利用してフルスクリーン表示をしているあたりで問題が発生した。

  • 1回目の起動時はそれっぽく動いてくれた。
  • 2回目の起動時はスプライト群が表示されたもののピクリとも動かない。画面が固まっている…。
  • 3回目の起動時は真っ暗な画面しか出てこない…。Win + Ctrl + Shift + B を叩いてGPUをリセットしないとデスクトップ画面が出てこなかった。

GPUリセットをしないと画面が出てこないスクリーンセーバなんて致命的過ぎる…。

キーを押したら、デスクトップ画面が表示されたり、マウスカーソルが表示された。つまり、プログラムの終了条件チェック処理は動いている。

ということは、Ebitengine の update() はちゃんと呼ばれ続けている。update() の中でキー入力チェックやマウス関係のチェックをしてプログラムを終了するようにしてあるので、もし update() が呼ばれていない状態に陥っていたら終了することすらできないはず。

となると、Ebitengine が描画関連で不具合を発生させていた、ということになりそうだけど…。

AI(Google Gemini)に尋ねたら、フルスクリーン表示を指定するあたりが怪しいと言い出した。ebiten.SetFullscreen(true) を呼んで済ませずに、ebiten.SetWindowDecorated(false) を呼んでウインドウの枠無しをあえて指定して、ウインドウサイズをディスプレイの解像度に設定してみたらどうか、と言い出したので、ダメ元でそういう処理にしてみた。これって効果あるのかなあ…。

Ebitengine の issue を眺めていたら、クラッシュ報告が結構多いことにも気づいた。Windowsの場合はDirectX12を使おうとしてそこで不具合が発生するからDirectX11にした、という話も見かけたし、DirectX より OpenGL のほうがパフォーマンスも安定性も高いというユーザ報告も見かけた。

OpenGLの使用を強制してみようか…。os.Setenv("EBITENGINE_GRAPHICS_LIBRARY", "opengl") を呼んで、環境変数 EBITENGINE_GRAPHICS_LIBRARY に opengl を設定。本来ここは auto になっていて、OSに応じて適切なものを選んでくれるらしいけど…。

テクスチャの解放もしてなかったので、プログラム終了時にそのあたりも処理するようにした。Go言語には defer という命令があって、これを使うとその関数から抜ける際にその処理をしてくれるらしいので、テクスチャの解放処理を defer で指定しておけばいい。便利だな…。

_Go言語のdeferを正しく理解する | How defer in Golang works #初心者 - Qiita

ただ、os.exit() で強制終了したり、log.Fatal() で処理を打ち切った時は defer で指定した処理は行われないから注意しないといけない。らしい。

_log.Fatalは使わないようにしよう
_【Go】log.Fatalは気軽に使わない #ログ - Qiita
_Go言語のエラーハンドリングについて 〜panic編〜 #Go - Qiita

2026/02/27(金) [n年前の日記]

#1 [golang] Go言語でスクリーンセーバを作れないか実験中。その2

Go言語(golang)でWindows用のスクリーンセーバを作れそうかどうか実験しているところ。環境は Windows11 x64 25H2 + Go 1.25.7 64bit。

フルスクリーン表示時の不具合について :

昨日の時点ではフルスクリーン表示になった時に表示が固まったり暗い画面しか出てこなかったりしたけれど、Ebitengine利用時に以下の対策を入れてみたら改善した…。ような気がする。

  • ebiten.SetFullscreen(true) を呼ばずにフルスクリーン表示するようにした。
  • OpenGLを利用するように強制した。os.Setenv("EBITENGINE_GRAPHICS_LIBRARY", "opengl") を追加。
  • テクスチャの解放をするようにした。
  • ebiten.SetWindowFloating(true) を呼ばないようにした。最前面表示を指定するAPIらしい。

この修正をしたら、10回ぐらいスクリーンセーバを起動させてもおかしな状態にはならなかった。どの修正が効いてくれたのか分からないけれど、それっぽく動いてるから、まあええやろ…。

Windows APIの操作 :

昨日の段階では golang.org/x/sys/windows だけを使って Windows API を操作していたのだけど。

_windows package - golang.org/x/sys/windows - Go Packages

ウインドウ生成その他をするために API の定義をしないといけなくて、このあたり何かしらのライブラリでまとめてあったりしないのかなと思えてきた。

AI(Google Gemini)に尋ねてみたらいくつかライブラリを提案されたけれど、github.com/lxn/win が良さそうだなと…。

_win package - github.com/lxn/win - Go Packages
_lxn/win: A Windows API wrapper package for the Go Programming Language

"github.com/lxn/win" を import したら、win.* という記述でAPIや定数が利用できるようになった。大量に並んでいた独自定義部分をごっそり削除することができた。

#2 [movie] 「ゴールデンカムイ 北海道刺青囚人争奪編」特別編集版を視聴

金曜ロードショーで放送されていたので視聴。漫画を原作とする実写ドラマの総集編らしい。1話につき60分、全9話を、2時間の尺に編集。

9時間を2時間にするわけだからダイジェストになるのは必然で、原作やアニメ版を見ている人ならともかく、初見でこの版だけを視聴しても話の流れがさっぱり分からないだろうとは感じたけれど。それでも色々と本気で作ってることは伝わってくる映像だった。原作リスペクト感がスゴイ…。台詞にしろ構図にしろ、そこまで再現するか…。

2026/02/28() [n年前の日記]

#1 [golang] Go言語でスクリーンセーバを作れた

Go言語(golang)でWindows用のスクリーンセーバを作れたような気がする。環境は Windows11 x64 25H2 + Go 1.25.7 64bit。

githubにアップロードしておいた。

_mieki256/ssgolang: Go言語(golang)製のWindows用スクリーンセーバサンプル

これで一応、Go言語(golang)を使ってもWindows用のスクリーンセーバを作れることが分かった。

もっとも、今の御時世にスクリーンセーバなんて作ってどうするんだと言われそうではあるけれど…。省電力云々を考えたらPCをスリープさせるか、ディスプレイをスタンバイモードにするほうがいいし…。

ただ、今回作業してみて、Go言語について色々勉強することはできた。


お勉強のための課題として、スクリーンセーバ作成というネタはそんなに悪くない気もする。まあ、作ってみても実用性はゼロなのだけど…。

余談 :

自分がどうしてスクリーンセーバの作り方についてアレコレ調べてるかというと、それはおそらくスクリーンセーバというジャンルが盛況だった頃に作り方を全然知らないまま過ごしてしまったからだろうなと…。「こういうのってどうやって作るんだろう?」と疑問を持ったままここまで来てしまったので、そのあたりがずっと引っ掛かっていて…。子供の頃に○○を買ってもらえなかったので大人になってから爆買いするようになった、みたいな状態に近い…?

当時、Windows用の何かしらを作るためには、開発環境を揃えるだけでもそれなりのお金が必要だった気がする…。Windows上で利用できるCコンパイラは有償製品ばかりだったし…。何をどうしたら作れるのかさっぱり分かっていないのに、いきなり有償製品を買うというのも、ちょっと勇気が…。ネットも普及してなかったから情報は書籍経由で入手するしかなかったし…。

今は無料で色々な開発環境が入手できるから、気になったらすぐに試用を始められるし、ググれば何かしらの情報に辿り着けるから、いい時代になったなと…。求められるのは、やる気だけ。いや、時間も必要か…。

どうせそのうちAIにお願いすればソースコードが数秒で出てくる時代になりそうでもあるけど。

#2 [nitijyou] 犬用のワイヤーを購入

車庫の横に設置してある犬用のワイヤーが千切れかかっていたので、DCMホーマックでワイヤーを購入。


鎖のほうがいいのかなと思ったけれど、ワイヤーより鎖のほうが高かった…。

#3 [nitijyou] 電気カミソリが分解できなくて困ってる

愚痴です。

台所に置いてある、不燃ごみが入ってるダンボール箱の中身を目にしたら、電気カミソリが入っていた。親父さんがそのまま捨てたらしい。型番は National ES8046。充電式。Panasonic じゃなくて National なのか…。

この手の電気カミソリを捨てる際は、分解して、中に入ってるバッテリーを取り出した状態で捨てないといけない。廃棄時の分解の仕方は取扱説明書にちゃんと書いてあるし、「必ずバッテリーを取り出してから捨てるように」とも書いてある。今回の親父さんの行為は完全にアウト。こういう捨て方をしちゃいけない。

てなあたりを親父さんに注意したけれど、もうボケちゃってるから何がいけないのか全然ピンと来てない様子。仕方ない。自分が分解してバッテリーを取り出すしかないな…。

しかし確認してみたら、ネジ穴が潰れちゃっていて、ネジが外せず分解できない。あの糞オヤジ…。さては自分で分解して修理しようとしてサイズの合わないドライバーでグリグリやって潰しやがったな…。LR44とLR1130の違いすら分からない状態だから平気でそういうことをやらかす…。これじゃ分解できないし、バッテリーも取り出せないだろ…。

中に入ってるバッテリーはリチウムイオン充電池。あかん。衝撃や高熱で火を噴いたり爆発するタイプやん。これは絶対に取り出さないと。しかし本来の手順では分解できない。どうしたもんか。

ネジ穴が潰れたネジを取り外す方法をググってみたけれど、ガムテープを使ったり、瞬間接着剤を使う方法を試してもダメだった。専用工具が必要かな…。しかしそれだって5分以上延々トライしてようやく、といった状態になるらしい。購入しても本当に役立つのかどうか…。

ノコギリで部分的に切ってどうにかできないものか…。尻のパーツさえ外せたら他のパーツも外せるはずなんだけど…。なんでこんな設計にしたんだ、って防水も売りにしてる製品だからか。参ったなあ…。

こういうのって市販のニッケル水素充電池で動くように作れないものかな…。そうすればバッテリーの取り外しで悩まなくても済むのに…。電池ケースの蓋のあたりを防水にするのが難しいのだろうか。でも、タミヤの水中モータだって一応防水は実現できてるよな…。だけどアレも気づいたら中に水が入っちゃったりしてたか…。

リチウムイオン充電池が入ってるから、容易にケースを開けられる設計ではマズイ。しかし廃棄時は分解できないと困るから、それなりに分解しやすい設計じゃないとマズい。相反する仕様を求められる。設計するのは面倒臭いだろうなあ…。

とにかく困った。どうしよう。

#4 [nitijyou] 親父さんが退院

詳細はGRPでメモ。

以上、28 日分です。

過去ログ表示

Prev - 2026/02 -
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

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project