...ing logging 4.0

はてなブログに移行しました。D言語の話とかいろいろ。

DFLのビルド方法

この記事はD言語 Advent Calendar 2022の6日目の記事です。

 

・はじめに

先日、DFLdmd 2.101.0でビルドできるように修正しました。

とうの昔にPhobosのstd.streamが廃止になっているので、代わりにundeaDライブラリのundead.streamを使いましたが、DFLをビルドするためにundeaDライブラリも必要になってしまいました。

そこでこの記事では、ふと遊んでみたくなった人向けに、DFLのビルド方法を説明します。

なお、今のところDUBには対応していません。

 

コンパイラのインストール

dmddmcは、公式サイトからダウンロードしてインストールしてください。

@outlandkarasuさんが今年も「D言語環境構築」の記事を書かれているので、そちらを参考にしてください。

この記事を書いている時点では2022年版がまだ公開されていないので2020年版のリンクを張っておきます。

qiita.com

自分はWindowsインストーラー(MSI)でインストールしましたが、dmcを追加選択した後は、特に問題なくインストールできて簡単でした。

インストールできたら、dmd.exeにパスが通っているか確認しましょう。

 

Windowsキー+Pauseキーで「詳細情報」を開きます。

右にある関連設定の「システムの詳細設定」をクリックして「システムのプロパティ」を表示し、「環境変数」ボタンをクリックして、環境変数Pathにdmd.exeの場所が登録されているか確認してください。

私の場合は、dmd.exeがc:\d\dmd2\windows\binにインストールされているので下図の設定になっていますが、ここは自分の環境に合わせてください。

 

ついでに、後でDFLをビルドするために必要になる環境変数も追加してしまいましょう。

dmc_pathとして、dmcのbinフォルダの場所を指定します(dmc.exeの場所ではないです)。私の場合はc:\dmc\dmです。

また、dmd_pathとして、dmdのbinフォルダの場所を指定します(dmd.exeの場所ではないです)。私の場合はc:\d\dmd2\windowsです。

 

・undeaDライブラリのビルド

DFLをビルドするために、まずはundeaDライブラリが必要です。

Git for Windowsをインストールしてgitを使ってもいいのですが、ここは簡単に、緑色のCodeボタンをクリックして「Download ZIP」からZIP形式でダウンロードしてきます。

ZIPファイルを展開したら、コマンドプロンプトを開いて、展開したフォルダに移動します。

後でDFL同梱のmakelib.batを使うために、OMF形式のlibファイルにするために-aオプションを付けて、

dub -a=x86_omf

を実行します。

dub.exeはdmd.exeと同じ場所にありますので、ここまでの作業ができていれば実行できるはずです。

うまくいけばundeaDのbinフォルダの中にundead.libができるので、これをdmdをインストールしたフォルダにあるlibフォルダにコピーします。自分の場合は、C:\d\dmd2\windows\libです。

 

dubの-aオプションにx86_omfが指定できることは、@mono_shooさんと@shitsyndromeさんに教えてもらいました。ありがとうざいました。

qiita.com

 

・DFLライブラリのダウンロード

続いて、DFLをダウンロードします。こちらも緑色のCodeボタンから、ZIP形式でダウンロードします。

ZIPファイルを展開したら、次はコンパイラの設定をします。

 

コンパイラの設定

DFLとundeaDのZIPファイルを展開した場所をdmdに知らせます。

dmdのbinフォルダにコンパイラの設定ファイルsc.iniがあるので、[Environment]のDFLAGSの末尾にDFLとundeaDのパスを追記します。

下記は私の環境のパスなので、自分の環境に合わせて修正します。

「 -Ic:\d\gitproj\dfl\win32 -Ic:\d\gitproj\undead\src」

[Environment]
DFLAGS="-I%@P%\..\..\src\phobos" "-I%@P%\..\..\src\druntime\import" -Ic:\d\gitproj\dfl\win32 -Ic:\d\gitproj\undead\src

これでDFLをビルドするための準備は完了です。

 

・DFLライブラリのビルド

DFLのZIPファイルを展開したフォルダの中にある\win32\dflをエクスプローラーで開き、そこにある"go32omf.bat"をダブルクリックして実行します。

うまくいけば、3つのlibファイル(dfl.lib、dfl_debug.lib、dfl_build.lib)が作成されます。(2022/12/06 14:39 # dfl_build.libは作成されなくなりました。)

途中でキー入力を求められるので、適当なキーを押すと、先ほどのundead.libの移動先と同じフォルダに3つのlibファイルが移動されます。

これで、DFLのビルドができました。

 

・サンプルコードの動作確認

DFLの\win32\examples\hello_dflに、サンプルコードhello_dfl.dを置いてあるので、これを動かしてみます。

やり方は簡単で、build.batをダブルクリックして実行すると、ビルドして実行されます。

shell.batの方は、私のPC環境のパスに設定されているので、必要に応じて修正してください。このフォルダでコマンドプロンプトを表示するためだけのものなので、触らなくても大丈夫です。

 

DFLで作成したアプリケーションのexeを実行したときにコンソールウィンドウが開かないようにするためのdmd.exeのオプションは、こちらの記事を参考にしました。

qiita.com

従来、32bitでコンパイルする場合でGUIツールを作るときには、コマンド画面が出ないよう、dmdに -L/exet:nt/su:windows:4.0 としてリンカオプションを指定する方法が知られている

 

・今後の課題

dmdがCOFF形式のオブジェクトファイルを想定するようになったようで、dmdに-m32omfオブションを付けないとリンクがうまくいきません。

数年前からDFLを64bitで動かしている方々がおられますが、当時自分でやってみてもどうもうまくいかず、自分の環境ではそれっきり試せていません。

implib.exeでdmdやDFLに同梱されているlibファイルをOMF形式からCOFF形式に変換すればいいのかなと思っていましたが、今ならdmdのlibフォルダにCOFF形式のlibファイルが用意されているので、想像しているより簡単にできるのかもしれません。

 

以前から、DFL同梱のmakelib.batを使っていて、今回も慣れている方法でやったので、BUDには対応していません。

 

これまで、度々、最新のdmdでビルドできるようにDFLを更新してきましたが、機能の追加はできていません。

まあ、もう数年放置されているライブラリですし、ユーザーがいないので、ちょっとしたツールを作るとか、おもちゃにして遊ぶくらいでしょう。

 

・おわりに

今回、久しぶりに、DFLを最新のdmdでビルドできようにしました。

DFLには、ドキュメントらしいドキュメントがほとんどなく、私が使っていたときもDFL本体のソースを見ながらGUIアプリケーションを書いていましたが、.NETのWindows Formsの使用感に近いので、C#を使った経験でなんとなく使えていました。

私自身、DFLに実装されているすべての機能を使ってみたことがないので、未知のバグがあるかもしれませんが、必要になって動かしておかしかったときに直したらいいや、という軽い気持ちなので、次のアップデートがいつになるかは神のみぞ知るところです。

DFLをdmd 2.101.0で動くようにしたのとライセンスについて

この記事はD言語 Advent Calendar 2022の5日目の記事です。

 

DFLは、D言語GUIアプリケーションを書けるライブラリであり、.NET の Windows Formsライブラリに似た使用感を持っています。

本家DFLの更新が止まっていたので、そこからforkして非公式のリポジトリを作って、しばらくの間は最新のdmdで使えるように更新していました。

私のforkにプルリクエストをもらうこともありましたが、英語がよく分からなかったりテスト環境がうまく作れなかったりしている中、忙しくなって全然触れなくなり、日常ではちょっとしたツールをD言語PowerShellで書くくらいで、プログラミング自体をあまりしていませんでした。

DFLは、2015年に自分がGitHubに最後のコミットをした後、さらに別のfork先のリポジトリで2018年まで更新されていましたが、最後のコミットメッセージで「Deprecate」と打ち込まれてそこで終わっていました。

 

時間ができたので、今のD言語の練習がてら、数年ぶりにDFLを触ってみています。

なんとか、最新のdmd 2.101.0でビルドして、サンプルコードを動作させられました。

D言語の標準ライブラリPhobosのstd.streamはとっくの昔に廃止されているので、undeaDライブラリに入っているundead.stream.dを代わりに使いました。

今後DFLをビルドするためには、undeaDライブラリをビルドして得られるundead.libファイルが必要です。

修正したDFLのコードはこちら。

github.com

 

undeaDライブラリを教えてもらいました。ありがとうざいました。

 

さて、DFLのライセンスが不明と書かれているサイトがあったので調べていたら、2014年にDFLの原作者Christopher E. Miller氏から本家サイトにコメントが出ていたみたいです。

www.dprogramming.com

Final Update
Sat, 01 Nov 2014 15:30:00 -0700
Hi, I'm writing this to make it official, dprogramming.com will no longer have any updates. I'll be archiving the content and leaving it up as long as possible for historical reasons.
dprogramming.com was the home of some of my D projects. It was started so long ago when the web was a different place and I was still fairly new to the game.
D was once an obsession and pleasure of mine, but I've since moved on. The D community is very smart and I wish them the best. I certainly have learned a lot from them. Since I'm no longer using D, the languages that have my interest at the moment are Lua and Rust.
To make it clear and allow code forking, I hereby release DFL and Entice Designer source code under dual licenses: boost and/or zlib/libpng, for the versions which were released on dprogramming.com. Please see the GUI Libraries wiki page for DFL forks.
Thank you,
- Christopher E. Miller

いくつかあるfork版DFLについてもご存じのようですね。

リポジトリには原作者が書いたlicense.txtも入っていますが、サイトには「dual licenses: boost and/or zlib/libpng」と書いてありましたので、簡単に紹介しておきます。

 

次の記事では、DFLのビルド方法について説明します。

Gitリポジトリにrmできないファイルがあって困った(解決)

Gitのリポジトリにrmできないファイルが登録されています。

ファイル名の日本語が文字化けしたまま登録されているようです。

5602▒▒▒▒101022_unsorted.csv

haru@haru90 MINGW64 ~/Desktop/HogeLog (master)
$ git ls-tree HEAD
100644 blob 25b7b9224949fcd83c1481544dc99dff11d588a0    5602▒▒▒▒101022_unsorted.csv
100644 blob 8f488375ff1b2a635ca9b9cae6c2960fae802d24    5605log.csv
100644 blob c698d1f2ddd89c98d7bdc3477f08e2d2537a5ee4    5606.csv
100644 blob 99ba79c5a780215f6116e2555b9697b750dab152    build.bat
100644 blob c96fc9a3e1a6413befccbd0f00e671745ba6d489    ddbg.exe
100644 blob 3d7a94bbfeea0a85c0a317456aec2369b5f2afb2    ddbg_gdb.bat
100644 blob 9f9882425bfbab1776b7ea5ae918ddaa70300a52    full5605log.csv
100644 blob 49f6adde9c069db5ece2897e95ef2a97e43372d0    go.bat
100644 blob 9055d7a385e4c894ad5bab57168e33145f443ea2    main.d
100644 blob 61db5a9781b1e3822c9536b41b22f2fab03ad345    main.exe.manifest
100644 blob f743a04e64275dc7905cef7abe6359573d2bea51    main_debug.def
100644 blob a3a61fe6f9d525d710f1af512bdbe794d32d2bee    main_release.def
100644 blob 2ee670abb92837809162198e6570c4f4e9ce1410    release.bat
100644 blob edee8482c4ae789cd755d0645b4ac732d397ab25    run.bat
100644 blob 9d35dfe2bef5df0103381aeb6f8eba61c06293cb    shell.bat
100644 blob aa909e5af286121a1f740d8338b4d33f890aa7ca    typetuple2.d

haru@haru90 MINGW64 ~/Desktop/HogeLog (master)
$ git show 25b7b9224949fcd83c1481544dc99dff11d588a0
<93><FA><8E><9E>,<D3><C6><C0><8E><ED><95><CA>,F1 F2 F3 F4 F5 F6,F7 F8 F9 FA FB FC,TG(<91><AC><93>x),TG(<8B><97><97><A3>),<8E><ED><95><CA>,<BD>ð<C0><BD>1,<BD>ð<C0><BD>2,<8E>ԑ<AC>,<8E><F3><90>M<DA><CD>
<DE><D9>
 10/10/22 20:17:22,A0h,C9 0A 00 00 00 02,00 00 00 00 41 13,0000h,0000h,21h,A3h,00h
 10/10/22 20:17:22,12h,CA 0A 00 00 00 02,48 B6 00 00 00 00,0000h,0000h,21h,A3h,00h
 10/10/22 20:17:22,A1h,09 1A 00 00 18 12,00 00 00 00 41 13,0000h,0000h,21h,A3h,00h
 10/10/22 20:17:23,A0h,C9 0E 00 00 00 12,00 00 00 00 41 13,0000h,0000h,21h,A3h,00h
 10/10/22 20:17:23,A1h,09 1A 00 00 18 92,00 00 00 00 41 13,0000h,0000h,21h,A3h,00h
 10/10/22 20:17:23,12h,CA 0E 00 00 00 12,D9 8B 00 00 00 00,0000h,0000h,21h,A3h,00h
 10/10/22 20:17:23,FFh,0A 00 4F 00 00 03,1E 5C 13 01 00 00,0000h,0000h,21h,A3h,00h
 10/10/22 20:17:24,A0h,C5 06 02 10 38 12,00 00 00 00 41 13,0000h,0000h,21h,A3h,00h
 10/10/22 20:17:24,A1h,09 19 00 00 18 92,00 00 00 00 41 13,0000h,0000h,21h,A3h,00h
 10/10/22 20:17:24,12h,C6 06 02 10 38 12,8C 24 00 00 00 00,0000h,0000h,21h,A3h,00h
 10/10/22 20:17:26,A1h,09 19 00 00 28 92,00 00 00 00 41 13,0000h,0000h,21h,A3h,00h
 10/10/22 20:17:29,A0h,C5 06 02 10 38 12,00 00 00 00 41 12,0000h,0000h,21h,A3h,00h
 10/10/22 20:17:29,A1h,09 19 00 00 28 92,00 00 00 00 41 12,0000h,0000h,21h,A3h,00h
 10/10/22 20:17:30,FFh,0A 00 4F 00 00 13,1E 5C 10 01 00 00,0000h,0000h,21h,A3h,00h
 10/10/22 20:17:30,A0h,C5 04 02 10 38 12,00 00 00 00 41 12,0000h,0000h,21h,A3h,00h
 10/10/22 20:17:30,12h,C6 04 02 10 38 12,04 32 00 00 00 00,0000h,0000h,21h,A3h,00h
 10/10/22 20:17:32,  ,  ,  ,0000h,0000h,23h,ABh,00h
 10/10/22 20:17:32,FFh,0A 00 4F 00 00 10,1E 54 10 01 00 00,0000h,0000h,21h,ABh,00h
 10/10/22 20:19:18,  ,  ,  ,0000h,0000h,23h,A3h,00h
 10/10/22 20:19:18,FFh,0A 00 4F 00 00 10,1E 5C 10 01 00 00,0000h,0000h,21h,A3h,00h
 10/10/22 20:19:20,A0h,C5 05 02 10 38 12,00 00 00 00 41 13,0000h,0000h,21h,A3h,00h
 10/10/22 20:19:20,A1h,05 14 71 00 28 82,00 00 00 00 41 13,0000h,0000h,21h,A3h,00h
 10/10/22 20:19:20,12h,C6 05 02 10 38 12,40 39 00 00 00 00,0000h,0000h,21h,A3h,00h
 10/10/22 20:19:20,A1h,05 14 71 00 28 A2,00 00 00 00 41 13,0000h,0000h,21h,A3h,00h
 10/10/22 20:19:20,A0h,C5 06 02 10 38 12,00 00 00 00 41 13,0000h,0000h,21h,A3h,00h
 10/10/22 20:19:20,A1h,09 19 00 00 28 A2,00 00 00 00 41 13,0000h,0000h,21h,A3h,00h
 10/10/22 20:19:20,12h,C6 06 02 10 38 12,8C 24 00 00 00 00,0000h,0000h,21h,A3h,00h
 10/10/22 20:19:20,A1h,09 19 00 00 28 92,00 00 00 00 41 13,0000h,0000h,21h,A3h,00h
 10/10/22 20:19:22,FFh,0A 00 4F 00 00 10,1E 5C 13 01 00 00,0000h,0000h,21h,A3h,00h
 10/10/22 20:19:22,A0h,C9 0A 00 00 00 92,00 00 00 00 41 13,0000h,0000h,21h,A3h,00h
 10/10/22 20:19:22,12h,CA 0A 00 00 00 92,C1 22 00 00 00 00,0000h,0000h,21h,A3h,00h

haru@haru90 MINGW64 ~/Desktop/HogeLog (master)
$ git rm 25b7b9224949fcd83c1481544dc99dff11d588a0
fatal: pathspec '25b7b9224949fcd83c1481544dc99dff11d588a0' did not match any files

sha-1でファイルを指定する方法は分かりましたが、showはできるのにrmはできません。そういうもの?

 

$ git config --global core.quotepath false

これは設定しているので、git statusしたら化けているファイル1つ以外は、日本語が化けないで表示されます。

・git rm $(git ls-files --deleted) もダメ

Git rmメモ(Hishidama's Git rm Memo)

「git rm」に拠らずに削除されたファイル(UNIXrmコマンドや、エディターの削除機能等で削除したファイル)は、ファイル名の補完が効かないので、指定するのが面倒。

削除されたファイル一覧は「git status」で表示されるので、それをコピーして「git rm」の引数に指定し直せばいいのだが、数が多いと面倒。

「git ls-files --delete」あるいは「git ls-files -d」を使うと(git管理下から)削除されたファイル一覧を表示することが出来るので、それを「git rm」の引数に指定すれば楽。

$ git rm $(git ls-files --deleted)

参考: あっきぃさんの『削除したファイルをコミットする Git

やってみる。

haru@haru90 MINGW64 ~/Desktop/HogeLog (master)
$ git ls-files
5602▒▒▒▒101022_unsorted.csv
5605log.csv
5606.csv
build.bat
ddbg.exe
ddbg_gdb.bat
full5605log.csv
go.bat
main.d
main.exe.manifest
main_debug.def
main_release.def
release.bat
run.bat
shell.bat
typetuple2.d

haru@haru90 MINGW64 ~/Desktop/HogeLog (master)
$ git ls-files --deleted
5602▒▒▒▒101022_unsorted.csv

haru@haru90 MINGW64 ~/Desktop/HogeLog (master)
$ git rm $(git ls-files --deleted)
fatal: pathspec '5602Ô101022_unsorted.csv' did not match any files

ダメだった。

・git diff --name-only --diff-filter=D -z | xargs -0 git rm --cached もダメ

git rm | Atlassian Git Tutorial

ファイルシステムに存在しないファイルを削除する方法
「rm ではなく git rm を使う理由」で説明したとおり、git rm は標準シェル rm と git add を結合して作業ディレクトリからファイルを削除し、削除結果をステージング インデックスにプロモートするのに便利なコマンドです。標準のシェル rm コマンドだけを使って複数のファイルを削除すると、リポジトリの中が散らかってしまいます。

次のコミットの一環として明示的に削除したすべてのファイルを記録する場合は、次のコミットの準備として git commit -a を実行してすべての削除イベントをステージング インデックスに追加します。

ただし、シェル rm で削除したファイルを完全に削除する場合は、以下のコマンドを使用します。

git diff --name-only --diff-filter=D -z | xargs -0 git rm --cached
このコマンドでは作業ディレクトリから削除したファイルのリストを生成し、そのリストを git rm --cached にパイプしてステージング インデックスを更新します。

やってみた。

haru@haru90 MINGW64 ~/Desktop/HogeLog (master)
$ git diff --name-only --diff-filter=D -z | xargs -0 git rm --cached
fatal: pathspec '5602Ô101022_unsorted.csv' did not match any files

ダメだった。

・git reset --hard でおかしくなった

haru@haru90 MINGW64 ~/Desktop/HogeLog (master)
$ git reset --hard
HEAD is now at e6352be Update to dmd 2.101.0

haru@haru90 MINGW64 ~/Desktop/HogeLog (master)
$ git status
On branch master
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        deleted:    5602▒▒▒▒101022_unsorted.csv

Untracked files:
  (use "git add <file>..." to include in what will be committed)

...

        56028d868eÔ101022_unsorted.csv

...

        main.exe
        main.obj
        sort/
        svn_ver/

no changes added to commit (use "git add" and/or "git commit -a")

56028d868eÔ101022_unsorted.csv というファイルが復活してきました。

TortoiseGitでは、それとは別に、まだ文字化けしているファイルが行方不明だと言われていますが・・・。

TortoiseGitで「56028d868eÔ101022_unsorted.csv」を「追加」すると、文字化けしたファイルが行方不明だとは表示されなくなりました。

そのままコミットしてみると、TortoiseGit上では行方不明のファイルはなくなりましたが、git bashでgit statusすると、やっぱり文字化けした方がdeletedって出ます。

なんだかややこしいことになりました。

$ git ls-tree HEAD
100644 blob 25b7b9224949fcd83c1481544dc99dff11d588a0    56028d868eÔ101022_unsorted.csv
100644 blob 25b7b9224949fcd83c1481544dc99dff11d588a0    5602▒▒▒▒101022_unsorted.csv

ハッシュ値が同じだけど、それっていいのだろうか。ファイルの内容だけで決まる?

brobはファイルの内容だけで、indexはファイルパスと内容で決まるそうです。

じゃあ、indexを編集すればいいかも。

・rm .git/index

Gitリポジトリのインデックスが壊れたら - Eyes, JAPAN Blog

$ rm .git/index
$ git reset

エクスプローラーで.git/indexを削除してみます。

削除した後に、まずは git status で状態を見てみます。

haru@haru90 MINGW64 ~/Desktop/HogeLog (master)
$ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        deleted:    5602▒▒▒▒101022_unsorted.csv
        deleted:    5605log.csv
        deleted:    5606.csv
        deleted:    build.bat
        deleted:    ddbg.exe
        deleted:    ddbg_gdb.bat
        deleted:    full5605log.csv
        deleted:    go.bat
        deleted:    main.d
        deleted:    main.exe.manifest
        deleted:    main_debug.def
        deleted:    main_release.def
        deleted:    release.bat
        deleted:    run.bat
        deleted:    shell.bat
        deleted:    typetuple2.d

...

TortoiseGitでは、文字化けしたファイルが行方不明でなく削除と認識されました。

このままだと、必要なファイルまでdeletedになってしまうので、これは差分として認めません。

文字化けしたファイル以外について、TortoiseGitで「変更の取り消し」をします。

それから、コミット。成功しました。

git bashで見てみると、

haru@haru90 MINGW64 ~/Desktop/HogeLog (master)
$ git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

...

ちゃんと削除できているようです。

やったね!

オーバーレイアイコンの優先順位(Dropbox VS TortoiseGit)

Windowsでは、最大15種類までらしい。

MSさん何とかしてください。

とりあえず、よく使いそうなものが先になるように並べ替えた。

冒頭にスペースが多いほど、優先順位が高くなるらしく、各社でスペース大戦争をしているそうな(何だそりゃ)。

 

追記:

TortoiseGitの設定で、オーバーレイハンドラーの項目に「レジストリエディターを起動する」ボタンがあるので、これをクリックすると、上のレジストリエディタの画面が表示される。

 

ふと、DropboxよりもTortoiseGitの方が優先度高いよなと思い、順序を見直した。



フレキシブルアームクリップ PG-FXASD01BK

スマホで動画を見たりビデオ通話するときに不便だったので先月買った。

伸ばしすぎなければしっかり保持してくれるので便利になった。

 

Adobe Acrobat Reader DCで手のひらツールをデフォルトにする方法

qiita.com

wnkhs.net

 

レジストリをいじらないとできないらしい。

書いてあるキーを編集してみたけど、反映されなかったので別のキーを検索してみたら、

コンピューター\HKEY_USERS\S-1-5-21-2727554755-1954124979-3275100530-1001\SOFTWARE\Adobe\Adobe Acrobat\DC\Selection

うちの場合はこっちだった。

追記:

上記のキーの値をHandにすればOK。