2022年8月の日記

Unknown programmer's programming note.

2022年8月31日 (水)


アクションゲーム アニメーションをやった

アニメーション。
思ったよりうまくいった。
raylibのExamplesが大変助けになった。

Pascalはここで一旦中断することにした。
一週間程使ってきて、どうもUnitの便利さに頼りきって、Unitをクラスのように扱ってしまっている。
おそらく、良いPascalのコーディングスタイルとはいえなさそうな気がしている。
こんな書き方をするなら、Object Pascalの方に移行してしまった方が良いだろう。
FP IDEはなかなか気に入っていて、離れるのは少しなごり惜しい気もする。
と、こんなことごちゃごちゃ考えずに、とにかく完成させてしまった方が良いのだろう。
しかし、どうにもじわじわと倦怠感がたまってきているようだ。
新しい環境で気分をリフレッシュして、すっきりしたところでまた再開することとする。

2022年8月30日 (火)


Pascalを一週間程使ってみて

言語はとても書きやすい。
大文字と小文字のどちらを使うかという決まりが特になく、今回はptopツールの書式に合わせて、先頭文字を全部大文字にしてみた。
ぱっとみBASICのような見た目になっている。
見た目はBASICのような親しみやすさを維持しながら、Cと同じようにコンピュータに近いところでプログラミングしている感覚も残っている。
そのバランスの良さはなかなか他では味わえないかもしれない。
型の先頭にTのプレフィックスを付けるのは、慣れるとそんなに違和感を感じなくなった。
Unitの仕組みが良くできていて、依存するユニットをコンパイラが調べて自動で解決してくれるのがとても楽だ。

2022年8月29日 (月)


アクションゲーム 重力とジャンプとカメラを一応やった

つぎはぎしたような感じになってしまったが、一応動作するようになった。
スペースでジャンプにした。
どうも、反応がいまいち。
原因はIsKeyDownではなく、IsKeyPressedで取っていることだと思われる。
またカメラはCamera2Dを使っているのだが、画面の部分的に1ピクセルのずれが発生している。
これを直すのはなかなか苦戦しそうだ。

今日のPacktビデオ

  • Linux Fundamentals

セクション3を見終えた。
続けて見ようとすると、セクション4から再生できなくなった。
いつものことだ。

2022年8月28日 (日)


raylibビデオ 第12回をアップした

衝突応答。
応答といってもたいしたことない。
単にぶつかっていたら、押し戻し、それ以上その先には進めないようにするだけ。
ポイントは横の移動と縦の移動を別々に処理すること。
こうすれば、考え方が単純になる。
今回は結構うまくいったような気がする。

Pascalメモ3、4をアップした

またメモ。

  • 3. 変数のアドレスやポインタの値を確認する方法
  • 4. FP IDEのノート

今日は3本アップすることができた。

2022年8月27日 (土)

曇り

今日のPacktビデオ視聴

昨日見れなかったやつの続き。

セクション2まで見た。

2022年8月26日 (金)

曇り

raylibビデオ第11回をアップした

衝突判定のみ。
プレイヤーを自由に動き回れるようにして、ステージ上のオブジェクトとの衝突を検出するというもの。
ただ検出するのみで、応答はしない。
ぶつかっても素通りできる。
ただ、テキスト「HIT!」とだけ表示して、正しく検出できていることを分かるようにしただけ。
工夫したところは、プレイヤー周囲の9x9のタイルをタイルマップから引き出してくるというところ。
これで、衝突しているかどうかテストする回数を大幅に削減できる。
何も工夫しなければ、180x15で2700回のテストが必要になってしまう。
撮影中、間違って保存ボタンを押してしまって、途中で切れてしまった。
結構進んだところだったので、録り直す気にもなれず、2つに分けてしまうことにした。
次は、衝突応答、つまり、ぶつかっていたらそこには進めなくする、という処理をやる。
あとジャンプを加えてやればだいたい骨格は完成だ。

今日のPacktビデオ視聴

  • Linux Fundamentals

Introductionの後、続けて次を見ようとしたら、またもや再生できず。

2022年8月25日 (木)

曇り

今日のPacktビデオ視聴

暫く間が空いてしまった。
今日からまた、1日1時間を目標に継続していくことにする。

1時間ちょっとの短いビデオ。
最初の3つ程のセクションの後、また見れなくなった。
今日中に見てしまいたいのだが、後で見れるようになるだろうか。

見れた。
初歩的な内容だったけど、ちょうど良かった。

Pascalで気になったこと

関数からレコード値を戻す場合、コピーが発生するのかどうか
コピーは発生しないらしい

ポインタの値、つまり、アドレスを表示させるにはどうするか

x :Integer;
p : ^Integer;
pp : ^Word;

x := 42;
p := @x;
pp := @p; { pp := addr(p) }
writeln(pp^);

2022年8月24日 (水)


raylibを使ってみるビデオ9と10をアップした

以前このサイトで書いていた記事の、SFMLとC++で作ったやつを、raylibとPascalで書き直した。
思ったより簡単な仕事だった。

2022年8月23日 (火)


raylibとPascalでゲームを作り始めた

何をやるべきかネタがなかった。
もう一度pongを作っても、Pascalの練習にはなるけど、raylibの面白いところが出てこない。
テトリスとかにしても一緒だろう。
もうちょっとステップアップしたい。
そこで、以前このサイトの記事のために作っていて、放置していたマリオのコピーを作ることにした。
今ある残骸は、SFMLとC++で書いてある。
まずは、これをraylibとPascalで現状まで巻き戻す。
そこから先は少し時間がかかるかもしれない。
目標はステージ1-1をプレイできる状態まで持っていくことだ。
1週間くらいを目処に完成させたい。

Pascalのメモ2をアップした

2点、記録しておいた。

  • レコード型の値を手軽に生成する
  • 多次元配列のLowとHigh

これだけのために40分弱の動画になってしまった。
本編をアップできないから、何かやっておこうと、お茶を濁したようなものだ。

2022年8月22日 (月)


raylibビデオのPascal編を始めた

fpcやFP IDEをいじって、少し慣れたところで、録画を始めた。
またHello World的なものを作って終了。
この先何をやっていくべきか迷っている。
あまりネタがない。
raylibのexamplesをPascalに書きしていくところを記録するというのも考えた。
勝手にソースを映してしまうのはあまり良くないだろうと思い直して、やめるておいた。

2022年8月21日 (日)

曇り

「ちらつき」を英語でいうと

「tearing」や「stuttering」、あるいは「juddering」などと言うようだ。
ティアリングは日本語でも言うことがある。
なぜこんなことを書いているかというと、raylibの画面のちらつきの原因を探っていた。
検索語が必要だった。
確信はもてないが、ひとつ有効そうなものが見つかった。

SetWindowState(FLAG_VSYNC_HINT);

今のところ大丈夫そうだけど、不安は拭い切れない。

fpcでPascalのコードからCのライブラリの関数を呼び出す

foo.c

void foo1() { puts("foo1"); }
void foo2() { puts("foo2"); }

スタティックライブラリの作成

$ gcc -c foo.c
$ ar rcs libfoo.a foo.o

hellofoo.pas

program hellofoo;

procedure foo1(); cdecl; external;

procedure foo2(); cdecl; external;

{$linklib c}
{$linklib foo}

begin
    foo1;
    foo2;
end.

ディレクティブ {$linklib} は、リンクするライブラリの名前を指定する。
どうも、このソースファイル全体で有効になるようだ。
ライブラリを検索するパスは、fpcのオプション -Fl で追加できる。
ディレクティブではおそらくできない。
ソースがあるディレクトリは、明示的に指定しなくても含まれる。
fpcが何をやっているデバッグしたい場合、fpcに -va を付けてやれば詳細な情報が表示される。

もし {$linklib} を使わないでコンパイラのオプションで指定したい場合は、注意がある。
プロシージャや関数の宣言を次のようにしないといけない。

procedure foo1(); cdecl; external 'foo';

どういう効果があるのか、いまいち飲み込めないが、externalの後ろにライブラリの名前を追加しないといけない。
そうしないと、リンクエラーになる。
このことに気付くのには時間がかかった。

参考にしたページ:

もし、実戦でCのコードを使いたいとなったら、次のチュートリアルが役に立つかもしれない。

fpcのメモを動画にしておいた

上に書いたことを記録する目的で動画を作った。

2022年8月20日 (土)


raylibを使ってみるビデオ pongを撮り終えた

昨日、日中はずっと寝ていた。
夜から朝にかけて、pongを無事完成させるところまで撮り終えることができた。

やっと終わったという感じだ。
やってる最中は、早く別の言語にスイッチしたい気持ちを押えながらやっていた。

2022年8月19日 (金)


日課をさぼっている

Packtのビデオを1日1時間くらい見るという日課。
動画撮影を始めてから停滞している。
Real World Haskellも月曜で止っている。
動画のアップロードも継続したい。
あと、ドラゴンズドグマもやらないといけない。
うまく時間配分する必要がある。

raylibを使ってみる 第3回

アップした。

2022年8月18日 (木)

雨のち晴

raylibを使う動画の第2回をアップした

第2回をアップした
pongを作る動画にした。
先にだいたい完成したものを作っておいた。
それを念頭に置きながら、もう一度作り直す様子を記録していく。
4回に分ける予定。
今回は、ボールと壁とラケットを表示させるだけという回。
46分くらいになった。
まだ長い。

2022年8月17日 (水)

小雨

免許更新に行ってきた

連休は昨日で終わりなので、有給を使って行ってきた。
割と早く終わった。

raylibを使う動画をアップした

第1回をアップした
2回没になって、3回目で採用にした。
以前やっていたジャンク動画に比べると、音声がだいぶましになった気がする。
撮影中は、スピーカーの出力をゼロにする。
モニタリングするには、ヘッドフォンを使うようにする。
そうすれば、マイクのヴォリュームを上げてもハウリングしない。
ということで、少しだけだが、音声が聞き取りやすくなった。
内容は、raylibをインストールするだけ。
それだけなのに、1時間弱になってしまった。
長すぎる。
なのに、まだしゃべり足りない感じがしている。
思うに、しゃべりたいことを全部しゃべっていたら切りがない。
割り切って必要でないことはスルーしていくことも必要だろう。
これからは、練習だと思って、短くなることを意識していく。

2022年8月16日 (火)

小雨

raylibをつかってみる

Haskellを学習中で、練習のためにゲームを作れないか考えていた。
それで、以前から気になっていた、raylibというゲーム向けのライブラリのことを思い出した。
raylibは、大体適当に言うと、SDLやSFMLのようなものと考えてよい。
最も注目するところは、非常に数多くのCとC++以外の言語のバインディングが作られているという点だ。
ライブラリのインターフェイスがストレートな設計で、バインディングを作りやすくなっているからだろうと思っている。
Haskellのバインディングはどうかというと、存在はしているが、かなり古い。
Haskellでraylibを使おうという気持ちはちょっと薄れた。
それよりも、別の全く使ったことのない言語でやってみたいという気になってきた。

動画(スクリーンキャスト)を撮っていた

raylibを使うのを動画にしたくなった。
1年ほど前に、ゲームを作る過程を垂れ流す動画、ジャンク動画を撮っていた。
途中で、非常に中途半端な状態で中断してしまった。
YouTubeにアップロードしてあるのだけど、再生回数はどれも10とか、おそらく自分で見た分だけ。
タイトルが「junk1」とかそんなのだから、検索もされないし、見る気にもならないだろう。
マイクとオーディオインターフェイスの調整の仕方を全く分かってなくて、声が小さ過ぎるし、ノイズも多い。
半年前にアーム式のマイクスタンド(ポップガード付き)を買った。
まだ未開封のままだったのを、ようやく開けた。
設置してみたら、とてもいい感じだ。
マイクの音量の調整も少し良い感じにできた。
一応は聞き取れるし、ノイズも少くなった。
そんな感じで撮り始めた。
まずは、raylibをインストールして、ウィンドウを表示させるだけのプログラムを書くというのにした。
ちゃんとした解説動画にするつもりはまるでなく、だらだらと垂れ流す動画にしたかった。
LibreOfficeのImpressという、PowerPointのようなやつで、簡単な資料を作った。
今回はいけそうだ、と思って始めると、やはりなかなか難しい。
しゃべり始めると、すぐに時間が経ってしまい、1時間を越えてしまう。
いくらだらだらやりたいからといっても、ただインストールして最小のプログラムを動かすだけで、1時間は長過ぎる。
2回やっている。
1回目は、1時間近く経過した時点で、問題、というかどうしても解決したい疑問が発生して、脱線しまくってしまったので没にした。
2回目は、最後まで撮り終えたのだけど、なんとマイクがミュートになっていた。
結果、ほぼ丸1日かけて、でき上がったものはなにもなかった。
しかし、無駄だったというわけでもなかった。
しゃべりながら色々やっていると、疑問点を発見することができた。
なかなかいい訓練になる。
没になった2本も、今になって思えば、とても満足のいくできではなかった。
結果オーライってところだ。

sharedライブラリの検索パス

1本目の動画を撮っている途中で遭遇した問題は、sharedライブラリの検索パスに関わることだ。

raylibを /usr/local にインストールしたのだが、実行時にロードできないというのが始まりだった。
それに関連して、色々と疑問が沸いてきた。
新たに学んだことを整理しておく。

  • GCCがコンパイル・リンク時に使用するライブラリの検索パスと、実行時にsharedライブラリをロードする検索パスは別物。
  • GCCでは -L オプションで、ライブラリの検索パスを指定できる。
  • プログラム実行時に、そのプログラムが必要としているsharedライブラリの検索パスは /etc/ld.so.conf でカスタマイズできる。
  • 他にも環境変数で設定する方法がある。
    • LIBRARY_PATH は、コンパイル・ビルドするときに使用されるパス
    • LD_LIBRARY_PATH は、実行時に使用されるパス

この記事が参考になった。

Solusの場合

  • /usr/local/lib64 及び /usr/local/lib は、リンク時のライブラリ検索パスに含まれない。
    動的リンクだけでなく、静的リンクの場合も、明示的に指定しなければ、ここに配置されたライブラリを検索することはない。
  • 一方 /usr/local/include はヘッダーの検索パスに含まれる。
  • /usr/local/lib64 及び /usr/local/lib は、実行時のsharedライブラリ検索パスに含まれない。
  • /etc/ld.so.conf は使われないし、ここに書いても効果はない。
    代わりに /usr/share/defaults/etc/ld.so.conf が使われ、ここに書けば効果がある。
  • CMakeは /usr/local 以下の find_package に使われる設定ファイルを見つけてくれる。
  • pkg-configは /usr/local 以下を検索パスに含めていない。

CodeLite、KDevelop、QtCreator

動画でSpacemacsを使うと、見る側は何をしているのか分からなくなる恐れがあるため、IDEを使うことにした。
本当ならGeanyを使いたいところだ。
しかし、raylibには関数が大量にあるため、calltipやコード補完が欲しい。
いくつか試したことと、分かったこと:

  • CodeLite にはいくつかバグがある。
    ソースフォーマッタが壊れて、実行するとクラッシュする。
    他にも、リファクタリング機能の一部でクラッシュする。
    ダイアログのテキストボックスがおかしい。
    テキスト削除したり、カーソルを移動したりできない。
    これは ~/.xprofile にfcitxの設定をしてやることで解決した。
  • KDevelop は基本的には悪くない。
    複雑なプログジェクトを扱おうとするとクラッシュする。
    例えば、raylibのソースをKDevelopのプロジェクトとしてインポートしようとするとクラッシュする。
  • Qt Create は頑丈だ。
    raylibのプロジェクトを開いて、ビルドするのも問題ない。
    ひとつだけ気に入らない点がある。
    ダッシュボードにサンプルの一覧が表示されない。
    /usr/share/doc/qt6/examples にインストールされているのは間違いない。

KDevelopは、ちょっと使い方が分かりづらいところがある。
プロジェクトの作成で、Emptyのテンプレートから作成した場合、そのままではどうやってもビルドできない。
これをMakefileやCMakeのプロジェクトに変換する必要がある。
その方法が分からず、もやもやしていた。
*.kdevファイルを直接書き直すことはできるが、まともな方法ではない。
なんとか発見した。
一度プロジェクトをクローズして、インポートし直せば、そのときにプロジェクトのタイプを選択し直せる。
これが正式な方法なのかどうかは微妙だし、ちょっと不恰好な感じもする。
メニューの「Build Selection」は、ちょっと誤解を招く。
Selectionというのは、プロジェクトのリストでマウスで選択しているプロジェクトのことではない。
リストの下に表示されている、Build Sequenceのところに入っているもののことを指している。
これは、Buildsetとも呼ぶようだ。
分かりづらいのだが、「+」と「-」のボタンがあるので、これをクリックしてBuild Sequenceqから除外したり追加したりすることができる。
Build Selectionを実行したときは、ここに入っているのが、その順番で全部ビルドされる。

2022年8月15日 (月)

曇り、小雨

今日のPacktビデオ

Fundamentals of Practical Haskell Programming

2時間59分 4章構成。
本当に基礎の基礎といった感じだった。
一昨日、昨日とさぼってしまったので、今日はもう一つ見よう。

Spacemacs Haskellレイヤーのバックエンドをdanteにした

新しいHaskellレイヤーのドキュメントはこちらになる。

今まで古いドキュメントを見ていた。
そのドキュメントに従って、ghciをバックエンドとしていた。

(haskell :variables
         haskell-completion-backend 'ghci

これはもはや良い選択肢ではない。
いちいちバッファを , s b でGHCiに送らないと、オンザフライのエラーチェックが更新されない。
developでは、haskell-completion-backendの選択肢は、danteとlspの2つとなっている。
デフォルトではdanteになっていて、これは別途にインストールが不要で手軽で良い。
lspには、実際にLSPの処理を受け持つプログラムのインストールが必要で、その選択肢がまた2つある。
hiehlsだ。
hlsはGHCupを使っているなら、簡単にインストールできる。
hieはちょっと面倒だ。
lspを使う場合、hieとhlsのどちらを使用するのかが気になった。
これは、lsp-haskell-server-pathに設定すれば良いようだ。
もっとも、当面はdanteを使うので、別に知っておかなくても良い。

全体としては、最初ここを参考に設定した。
バックエンド以外にも、developではもはや不要な設定がある。
今まではこうなっていた。

(haskell :variables
       haskell-completion-backend 'ghci
       haskell-enable-hindent t
       haskell-enable-hindent-style "fundamental" ;ignored
       haskell-indent-spaces 4                    ;ignored
       haskell-process-args-ghci "ghci"           ;ignored
       haskell-process-path-ghci "stack"          ;ignored
       haskell-process-args-stack-ghci '("-v")    ;no idea of helpful args
       haskell-process-type 'stack-ghci ;not necessary, automatically detected stack ghci by default
       haskell-stylish-on-save 't
       haskell-compile-cabal-build-command "stack build"
       haskell-process-path-stack "~/.local/bin/stack")

クリーンアップした。

(haskell :variables
       haskell-completion-backend 'dante
       haskell-enable-hindent t
       haskell-stylish-on-save 't
       haskell-compile-cabal-build-command "stack build"
       haskell-process-path-stack "~/.local/bin/stack")

あと、danteによる補完を有効にするためには、global-company-modeを有効にしておかないといけないようだ。
haskellでだけ有効にしたいのだが、やり方が分からなかった。
なのでSpacemacs全体で有効にしてしまうことにした。
これは、user-configに書くと良いようだ。

今日2本目のPacktビデオ

Writing Haskell Programs

2時間43分 3章構成

とても良かった。
今日見た、Fandamentals…と同じ著者だった。
言語そのものよりも、Haskellプログラミングを取り巻く環境に焦点を絞っている。

Real World Haskell 9章を読み終えた

かなり難解だった。
持ち上げ(lift)がよく分からない。
具体的には、concat2の定義のところ。

2022年8月14日 (日)

曇り、雨

Real World Haskell 6、7、8章を読み終えた

重要なトピックばかりだ。

  • 型クラス
  • IOモナド
  • ファイル処理

まだまだついていけてると思う。

2022年8月13日 (土)

晴、一時雨

Spacemacs C++のinclude補完を無効にする

LSPというか、clangdの機能のようだ。
トップレベルのヘッダで十分な場合でも、内部的に直接定義がされているヘッダを探して追加してしまう。
例えば detail.hpp のようなヘッダを追加しようとする。
便利さよりも、煩わしさの方が勝るので、ずっと無効にしいと思っていた。
lsp-clients-clangd-args に –header-insertion=never を加えてやると良いようだ。
名前が示すように、clangdというプログラムヘの引数となる。
いつも .dir-locals.el でこの変数を設定していた。
なので、ここでセットするように自前のスクリプトを修正した。
次のようなファイルを生成するようにした。

((nil . ((lsp-clients-clangd-args . ("--header-insertion=never"
                                     "--compile-commands-dir=build"
                                     "--pch-storage=memory"
                                     "--background-index"
                                     "-j=4"))
         (eval . (setq
                  projectile-project-test-cmd #'helm-ctest
                  projectile-project-compilation-cmd #'helm-make-projectile
                  projectile-project-compilation-dir "build"
                  helm-make-build-dir (projectile-compilation-dir)
                  helm-ctest-dir (projectile-compilation-dir)
                  ))
         (projectile-project-name . "cxx1")
         (projectile-project-run-cmd . "./run.sh")
         (projectile-project-configure-cmd . "cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_EXPORT_COMPILE_COMMANDS=ON ..")
         (helm-make-arguments . "-j4"))))

これでうまくいった。
ちなみに、初期値は ("–header-insertion-decorators=0") となっている。
clangd –help でこのオプションの意味を確認できるけど、良く分からない。

2022年8月12日 (金)

晴、曇り

今日のPacktビデオ

Learning Haskell Programming 3、4章 (完)

めっちゃ良かった。
単語探しゲームは面白そうだ。
Haskellそのもの解説はほどほどに、プログラミングのサイクルを確認できるところが良かった。

Haskell with Spacemacs

Haskellレイヤーは正直微妙。
あまり機能は多くない。
stackに対するサポートもそれほど充実していない。
ビルドとstack-ghciくらいしか使えない。
バックエンドにghci、intero、ghc-modが選択できるのだが、このうちinteroとghc-modはもう開発が停止していて、stackでのインストールも失敗する。
と、書いていて知ったのだが、どうも古いドキュメントを見ていたようだ。
developのドキュメントでは、lspやdanteというバックエンドが使えるようになっている。
もう一度セットアップし直そう。
もっとも、Haskellのプログラミングでは、それほど高度なIDEのような機能は不要かもしれない。
インデントとGHCiとの連携ができればそれで良いようにも思える。

2022年8月11日 (木)

たぶん晴

Real World Haskell 4章、5章を読み終えた

5章はJSONを扱うライブラリを作成するという章。
以前読んだときには難しいと感じた記憶がある。
今読んでも、やはり苦戦させられた。

今日のPacktビデオ

Learning Haskell Programming 3章の途中

単語探しゲームを作るという内容。
すごく分かりやすい。

2022年8月10日 (水)


Packtビデオが見れなかった

昨日の Learning Haskell Programming の続きを見ようとしていたら、またもや再生できなかった。
時間を置いて何度もためしたがだめだった。
困ったものだ。

Real World Haskell 4章途中まで読んだ

昨日から読み始めた。
練習問題は一応目を通してはいるものの、だいたいスキップしている。
簡単なのから少し時間かかりそうなのまである。
先が長いので、きっちりやっていると、疲弊して最後まで到達できない可能性がでてくる。
付箋を貼っておいて、余裕ができたらまとめてやることにする。

GHC static linking

GHCでビルドしようとするとエラーになった。

❯ ghc --make foo.hs
[1 of 1] Compiling Main             ( foo.hs, foo.o )
Linking foo ...
/usr/bin/ld.bfd: -lHSbase-4.12.0.0 が見つかりません: そのようなファイルやディレクトリはありません
/usr/bin/ld.bfd: -lHSinteger-gmp-1.0.2.0 が見つかりません: そのようなファイルやディレクトリはありません
/usr/bin/ld.bfd: -lHSghc-prim-0.5.3 が見つかりません: そのようなファイルやディレクトリはありません
/usr/bin/ld.bfd: -lHSrts が見つかりません: そのようなファイルやディレクトリはありません
/usr/bin/ld.bfd: -lCffi が見つかりません: そのようなファイルやディレクトリはありません
collect2: エラー: ld はステータス 1 で終了しました
`x86_64-solus-linux-gcc' failed in phase `Linker'. (Exit code: 1)

英語だと次のようになる。

❯ LANG=C ghc --make foo.hs
Linking foo ...
/usr/bin/ld.bfd: cannot find -lHSbase-4.12.0.0: No such file or directory
/usr/bin/ld.bfd: cannot find -lHSinteger-gmp-1.0.2.0: No such file or directory
/usr/bin/ld.bfd: cannot find -lHSghc-prim-0.5.3: No such file or directory
/usr/bin/ld.bfd: cannot find -lHSrts: No such file or directory
/usr/bin/ld.bfd: cannot find -lCffi: No such file or directory
collect2: error: ld returned 1 exit status
`x86_64-solus-linux-gcc' failed in phase `Linker'. (Exit code: 1)

どうも、SolusのパッケージマネージャーでインストールしたGHCでは、スタティックリンクでビルドできないようになっているようだ。
問題のライブラリは、例えば -lHSbase-4.12.0.0 に必要らしきものは見つかる。

❯ find /usr/lib64/ -name "libHSbase-4.12.0.0*"
/usr/lib64/ghc-8.6.5/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so

Arch LinuxのWikiだが、次のように書かれている。

Since version 8.0.2-1, the Arch ghc package and all haskell-* packages in community provide only dynamically linked libraries.

SolusはArchベースのパッケージを使ってはいない。
だけど、おそらくSolusの場合もそうなっているのだろう、と推測する。
GHCのオプションで、動的リンクをするように指定すれば、リンクもパスする。

❯ ghc -dynamic foo.hs
[1 of 1] Compiling Main             ( foo.hs, foo.o )
Linking foo ...

別にこれでもいいのだが、StackのGHCを使えば静的リンクも動的リンクもできる。
Stackは、Solusのパッケージリポジトリにもある。

❯ sudo eopkg install haskell-stack
大量の依存する haskell-* パッケージもインストールされる...

StackからGHCをインストールするには stack ghc とタイプすれば良い。
最新のGHCが、システム全体ではなく、ユーザー環境にインストールされる。
このGHCを使ってコンパイルするには、次のようにする。

❯ stack ghc foo.hs


[1 of 1] Compiling Main             ( foo.hs, foo.o )
Linking foo ...

今度は、デフォルトの静的リンクされる。
そのため、ファイルサイズが数MBとかなりでかくなる。
-dynamic オプションを付けることで、もちろん動的リンクにするともできる。

❯ stack ghc -- -dynamic foo.hs
[1 of 1] Compiling Main             ( foo.hs, foo.o )
Linking foo ...

GHCに直接渡したいオプションの前に -- を挟んでやる必要がある。

2022年8月9日 (火)

晴、曇り

変な本を買った

「ゲームコンソール 2.0」という、ゲーム機の写真集みたいなのを買った。
本屋に置いてあったのを見て、つい買ってしまった。
他にもブックオブで3冊買った。
「3DCG日和 (2)」というのがあって、ちょっと気になったのだけど、メタセコイアを使っているので、あまり参考にならないだろうと思い、がまんしておいた。

Haskellがやりたい

図書館で小説を読んでいる最中、急にHaskellをやりたくなってきた。
理由は分からない。

Real World Haskell を読み始めた

もう何年も前に買った本。
途中からついていけなくなって、放置していたままだった。
今ならたぶん読破できる。
最初から読み直すことにした。

今日のPacktビデオ

Haskellがやりたい、ということで、今日はHaskellのビデオにした。

Learning Haskell Programming 2章まで見終えた

4章構成で4時間10分。
最初の2章で基礎をやって、残りの2章はデモプロジェクトとなっている。
最初の2章はコンパクトにまとめてあって、リハビリにもとても良い。

2022年8月8日 (月)


今日のPacktビデオ

Docker - A Beginner’s Hands-On Guide 16章から25章(最後)まで

Docker自体に対する内容はそんなに悪くなかった。
けれど、タイプミスが多すぎる。
なんで docker とタイプするのすら毎回ミスするのか分からない。
あと、「Okey」とか「Simple」を連呼するのが鬱陶しい。
そのせいで もし評価をつけるとしたら、星2つ半くらい。
そうはいっても、内容は悪くなく、ちゃんと見終えたことによって、基礎が少し強化されたと思う。
内容は Docker Fundamentals for Beginners と重複しているところが多かった。
これは、復習になったのでかえって良かった。

2022年8月7日 (日)


ドラゴンズドグマ エヴァーフォールの探索

何をすればいいのかよく分からない。
とりあえずはこのダンジョンを攻略していけばいいのだろうけど、敵が微妙に強い。
無理ではないものの、ぎりぎりの戦いになる。
これまでの戦闘が楽勝すぎて、それに慣れ切っているため、なかなか気分が上がらず停滞している。

Packtビデオが見れない

昨日もだった。
どのビデオを開いても、チャプター1だけは再生できて、チャプター2からは固まってしまう。
昨日は、しばらく時間を置いてから開いたら見れるようになった。
おそらく今日もそうなるのだろう。
今できることは何もない。

サスペンドから復帰できないときがある

暫く大丈夫だったところ、また頻発するようになった。
つらい。

SFML Blueprints を読み終えた

といっても後半は流し読みだった。

  • 5. Playing with User Interfaces
  • 6. Boost Your Code Using Multithreading
  • 7. Building a Real-time Tower Defence Game from Scratch - Part 1
  • 8. Building a Real-time Tower Defence Game from Scratch - Part 2, Networking

この本で構築したパーツは、SFML-utilsというフレームワークにまとめられている。
この本のサンプルコードにも付属している。
7と8では、そのフレームワークを利用しているのだが、SFML-utilsがビルドできなくて、流してしまった。
最後の8は、マルチプレイヤーに対応するという野心的なプロジェクトで、難易度が高い。
いずれ自分で作るようになったら参考になるだおろう。
記憶だけしておく。

今日のPacktビデオ

見れるようになった。

Docker - A Beginner’s Hands-On Guide

25章中、15章まで見終えた。
全体は2時間52分ある。
各章は短く、さくさく進む。
発音が悪くて、聞き取りにくい。
ローカルマシンではなく、クラウドのサーバーにログインして、そこで実験するというやり方。
Dockerのホスティングサービスについて調べてみた。
AWSのEC2以外にもいくつか選択肢があるようだ。
ただ、やっぱりそこそこの費用がかかる。
今の段階で考えなくても良いだろう。

2022年8月6日 (土)

今日のPacktビデオ

Docker Fundamentals for Beginners

最後まで見終えた。
なかなか良かった。
DockerはNode.jsのWebアプリケーションと相性が良さそうだ。
こうやってビギナー向けのビデオで流行のスキルを回収していくのは効率が良いかもしれない。
実際に使っていかないと、すぐに忘れてしまうだろうけど、 引出しの奥に入れておくと、いざやらないといけないとなったときの助けになる。
選択肢の幅も増える。

2022年8月5日 (金)

雨、晴

今日のPacktビデオ

Docker Fundamentals for Beginners

最初は別のビギナー向けのを見ようとしていたのだけど、あまりに聞き取りづらかったので、こちらにした。
こちらは聞き取りやすい。
5時間30分と、中程度の長さなので、何回かに分けることにする。
3章まで見終えた。

ドラゴンズドグマ 結末を迎える

一応、エンディングっぽいのを迎える。
ネタバレになるので書かないけど、納得のいかないものだった。
エンディングのようなものになったけど、まだまだやることが残っている。
というより、ここからが本番といった感じだ。
ダークアリズンのダンジョンも全く攻略していない。

2022年8月4日 (木)


強烈な雨

一時、激しい雨になった。
川の水位がかなり上っていた。

皮膚科が終わった

ようやく疣の治療が完了した。
半年以上かかった。

今日のPacktビデオ

Bootstrap 5 Course: Build Responsive Websites Like a Pro

1時間54分の短いビデオ。
1時間をオーバーしてしまったけど、短いので全部見ておいた。
Bootstrapは全く触ったことない。
大体どんな感じか分かって良かった。
しゃべり方に癖がある。
このくらいの方が聞き取りやすいかもしれない。

2022年8月3日 (水)


本を購入

Interfaceを確認しに本屋に寄って帰った。
微妙な感じだったので、買うのは保留しておいた。
気になっていた芥川賞受賞作の「おいしいごはんが食べられますように」があったので購入した。
また、Kindleでホームズのコンプリートコレクションも買った。
買ったといっても0円だけど。
7月に出たばかりのようだ。
なぜ0円なのかは分からない。

今日のPacktビデオ

50 Projects in 50 Days - HTML, CSS, and JavaScript というのを見始めた。

1日1つでは2ヶ月もかかってしまう。
2つでちょうど1時間くらいになる。
もうちょっと早く終わらせたいので、3つくらい見ていきたい。

2022年8月2日 (火)


ドラゴンズドグマ 長城

メインストーリーで襲われたので応援に行くことになった。
一箇所、回収できなかった場所がある。
地下にも救出に行ってくれと言われたのだが、地下への道が見つからなかった。
扉もこちらからは開けられないとなっていて、入れなかったところがある。
クリアしたら、通路が埋まってしまって通れなくなってしまった。
諦めるしかない。
それにしても、十分にレベルが上がっているためか、楽勝だった。
次のクエストの名前が「決戦」となっているが、まさかこれでクリアということではないだろうと思いたい。

Packtのビデオを1日1時間くらい見る

ドラゴンエイジはボイスが英語なのだけど、あまり聞きとれない。
英語の耳はあまり良くないようだ。
少し強化するために、毎日のトレーニングに組込むことにした。
何をするかだけど、あまり活用していない、Packtのビデオを毎日見ることにした。
会話の耳を鍛えるには、効果はどうか微妙なところだが、何もしないよりはマシだろう。

2022年8月1日 (月)


ドラゴンズドグマ 腐りかけの幻の肉

クエストで5つ必要になるので貯めていた。
あまり消費アイテムに気を使っていなかったので気づかなかったのだけど、生もののアイテムは時間経つと腐っていくようだ。
奇妙なことに、通常のものよりも、腐りかけ、という状態の方が性能が良い。
完全に腐ってしまうとダメになってしまう。
なので、腐りかけの状態で密閉瓶と調合して、保存しておくのが良い。
このシステムは面白くて好きだ。
クエストで5つ必要になるのは、保存された腐りかけの幻の肉だ。
新たに一つ入手して5つ貯まったと思って密閉しようとしたら、全部腐っていた。
完全に腐ったつは、密閉してから、癒しの泉の水で通常の状態に戻せる。
しかし、密閉してしまうともう腐っていかないので、腐りかけにすることはできない。
残念ながら、集めなおしになった。
また、新たにクエストで密閉されていない状態の腐りかけの幻の肉が必要となった。
これまで集めたのは、意識して集めたものではなく、道中でたまたま拾ったものばかり。
いざ必要となると、どこを探したらいいのか分からない。
ウシやシカなどが落すようだが、あまり数がいないし、しばらく狩ってみても、落す気配がない。
調べてみると、石刈り場の真ん中辺りの木箱から一つ取れるようだ。
ということで、そこで一つ回収して新たなクエストの分として使用した。
また、5つ必要な分は、贋作でも良いみたいだ。
肉の贋作っていうのが面白い。
その発想はなかった。

Created: 2024-02-07 水 06:50

Emacs 29.1 (Org mode 9.6.6)

Validate