日記 2023-01
公開
2023-01-31 22:34

ランタンフェスティバルを見に行って、海鮮丼食べてコメダでアイス食べてきた。
なかなか良い気分転換になった。



uxnというFantasyConsole・VirtualMachineがある。
世界中をヨットで旅しながら暮らしているDevine Lu Linvega氏が、自分の作品を発表するためのプラットフォームとして作ったもの。
氏の作品ではオートマトンで曲を作る環境のOrcaが特に有名。

ヨットの上の電力・インターネット環境だと、Macの開発環境をアップデートしたり、そもそもMacを動かすのも難しいことが多いらしい。
Pythonみたいな動的環境も実行時に電力をバカ食いするし、C++やRustのコンパイルなんて論外。
そのため省電力で、すなわち少ないメモリ・低速度CPUを仮定したVMを作っている。
NintendoDSやGameBoyAdvanceなどで動く実装も作られている

仕様はかなり簡単な16bitアドレッシングのスタックマシンで、またソフトもシンプルな専用のアセンブラで書かれている。
言ってみれば機能が限定的なForthで、面白いけどこれでグラフィカルなものを作るのは厳しいのでは……と思っていた。
静的型チェックや動的型どころか、型がそもそもない。すべてが数値。

ところがかなり早い段階で、ペイントソフトテキストエディタとアセンブラ描き込めるカレンダーOSのようなランチャグラフィカルなデバッガマリオペイントみたいな作曲ツール、そしてクオータービューのゲームまで作り始めている。

凄いとしか言いようがないが、同時に結構考えさせられる。
Lisp処理系Ringを作ってるときもたまに感じるが、ある機能Aを作るために、もしくは作ったらBという問題が生まれて、そのBを解決するためにCが……と、どんどん高機能になっていってるのに、問題は増える一方な気がする。
一方でシンプルな言語・環境を使えば、根性は必要なんだけど、作りたいものにだけ集中できて、結果的に早く目的にたどり着いたりする。
HSPで書かれた箱庭えくすぷろーらーやアセンブラで書かれたSFCゲームの数々を見ているとそう思えて仕方がない。

高機能なプログラミング言語・環境を作りたいなら今のままでもいいんだろうけど、そうではないので、ちょっと落ち着いて自分が何をやりたいのか考える必要がある。



IronRingのREPLで、エラーだと単にメッセージ表示して落ちるようにしているが、これを続行できるようにしたい。
そうなるとできればStoneRing側に例外機構が欲しい。

StoneRingに簡単な例外を取り入れるのは、まあそんなに面倒ではない。
functionではないものにapplyしようとしたりとか、そういったもののケアもできる。

ただコードにそこそこ大きめの追加が入る。
セルフホスティングできるギリギリのミニマル仕様として現在のものを残しておきたい。
別リポジトリに分けるか、同リポジトリの別ディレクトリに分けるか迷う。
まあいろいろ管理するの面倒だから同リポジトリかな。



寒すぎるッピ!



バミちとTerrariaやCreature Creatorをやってみた。楽しかった!!
イヤ~~~Hardcoreぐらい余裕でしょ~~と思ったけど2回やって2回とも自分が最序盤で死にました。うんち

しかしスタンドが低いマイクに向かって喋ってたせいか首がめちゃくちゃ痛くなってしまった。
次やるときはマイクスタンド買わなきゃだな。



寝床でLisp触りたい。
思えばプログラミングかなり上達するきっかけになったのは、寝床でLinuxZaurus使って夜な夜なコード書いた経験が大きい。
中古で探してどうにかWifi繋げて、EmacsでひたすらArmのアセンブリを書いてForthを作ってた。楽しかったな~
しかしやっぱり目が悪くなりそうだからボツ案だな。
まあ気合入れるとAndroidのスマホ中古で買って……いやしかし……



WAM、思ったよりかなり高速な実行向けで、ヒープの表現まで決められている。
全てがコンスセルのIronRingだとO(n)やO(n^2)になるか、読みながら別の実装にしていく必要があって、結構面倒。
O(1)のデータ構造が扱える処理系に進んでから実装だな〜



今月やったことまとめ
- Skebやってみた。開設して即依頼来たの本当にありがたい。1/8から1/21までで5件。仕事と絵の日々だった
- Ringを作り始めた。1/3から始めて1/7まで、1/22から1/29までなので2週間程度で
  - Stoneコンパイラ
  - Ironインタプリタ
  - Ironで動くStoneコンパイラ(セルフホスティング達成!)
  - オブジェクトシステム(クラスベース・プロトタイプベース)
  - MicroKanren+α
  までできた。なかなか速いのでは。
- 何気に結構楽器の練習を続けている。錆びついていた指が少しずつ動くようになってきた
なかなか充実していた。この調子で来月もやっていきたい。


Prologっぽい論理型埋め込み言語として有名なminiKanrenのミニマル版、microKanrenRingで実装してみた。
わかりやすい解説があったので助かった。
わずか数十行で基本の推論エンジンができるのは面白い。

若干bindの実装にバグがあるが、これは参考実装のScheme版がnilと#fを分けている一方、Ringがnilを偽としても扱っていることに起因すると思う。多分。

入れ子のリストのパターンマッチを簡単にかけるのはやっぱり便利。
ただminiKanrenはかなり関数を返す関数を多用してて、goalとしてステートを受け取る関数を返し、それをlazy evaluationのため関数に包み、さらにそれらを関数に……となるともうわけがわからなくなる。
デバッグ時に関数に包まれた値がまったく見えないので厳しい。

というわけでできればWAMとかのVM系、そうじゃなくてもできればわかりやすいインタプリタでPrologを実装したい。
マクロ多用して継続渡しにする、みたいなのも避けたい。



……やっぱクラスに相当するものが決められてた方がいいね!(手のひらクルッ



とりあえずLispWorksとかSmalltalkがクラスベースでようやっとるからクラスベースで行く、という日和見的な結論でいく。
ただPicoLispのProlog+OOPという謎の存在を解明してからだな。



朝起きてパパッとRingのクラスベースオブジェクトシステムを完成させた。
プロトタイプベースとどっち使うか迷うなあ


Ringにクラスベースのオブジェクトシステムもある程度実装。
サブクラスのインスタンス変数拡張が面倒なので今日は終わり。
ただな〜メタクラス階層とか触ってるとあんまり綺麗に思えないというか……
Smalltalkという抜群の成功例があるから強くは言えないけど、Selfみたいにプロトタイプベースの方が動的な性質は全然上なんじゃないかなと感じる。
どちらかというとプロトタイプベースの特殊化・最適化されたものに思える。



Ringにプロトタイプベースのオブジェクトシステムを実装。
こういうのサクッとできるのがLispのいいところ。
TinyCLOSのコードでも読んでCLOS系も一度実装してみてもいいかもしれない。



Bidirectional Type Checker少し書いてたけど、結構なmatchや返り値のラップが必要になる。
関数的にやるのもいいんだけど、先を見越すとやっぱりオブジェクトシステムが欲しくなる。
というわけで先にオブジェクトシステムを簡単に作ってみる。
PicoLispがPrologとオブジェクトシステムを混ぜてるの面白そうだから一度実装してみてもいいかもしれない。


Ringのリファクタリングがあらかた終わったので型検査に着手。
どうもUnify使うHM推論はBidirectional Type Checkerの特殊系?らしくいろいろ上手く扱えない場合があるんだとか。
というわけでBTCの論文を読んでどうにか書いてみる。
ただ型理論の数式の記号全くわからんからそこから調べないとだなあ



そろそろ『魔術』の練習でもするか、ということで厚塗りやってみた。
ラフからいきなり色置いていった。レイヤー1枚で。
まあまあ楽しいけど、気をしっかり保たないと魔術の暗黒面に落ちて立体がまったく把握できなくなる。



超風強いなか、前から気になってた海沿いにあるピザ屋に行ってみた。
海が見れると評判だけど波高すぎて笑った。
エメラルドグリーンの海なんだけど、家の高さぐらいの波を見ると綺麗というよりコワ~~~……だった。
料理はめちゃめちゃ美味しかったからまた風が無い日にでも行きたい。



初めてけーくんごうくんがじゃれあいからの喧嘩。
お互い猫パンチでちょっかい出してたのがヒートアップ!
でも二匹とも優しいからか、けーくんはしがみつくだけ、ごうくんはソフトタッチの猫パンチだけで喧嘩してた。

途中でごうくんが圧され始め、けーくんは黙って詰め寄るだけなのにごうくんは威嚇して下がる。
ごうくん……弱いぞ!!身体は一番大きいのに。
威嚇されるとけーくんは下がるんだけど、ごうくんが立ち直るとまた詰め寄る、の繰り返し。

大喧嘩にならないか見張ってたけど全然大丈夫そう。
今は2匹とも疲れて同じベッドで寝てる。仲良しだな!



Ringセルフホスティング成功した!
1. Scheme(Gauche)でLispサブセット(StoneRing)のコンパイラを書く
2. StoneRingでLisp(IronRing)インタープリタを書く
3. IronRingでStoneRingのコンパイラを書く
4. IronRingで書いたStoneRingのコンパイラで2を動かす
5. 2-4までの輪が閉じたので自己拡張できるようになった
これで依存しているものがnasmとldだけになった。

次はelf64バイナリを直接出力して完全に依存をLinuxAPIだけにするか、StoneRing側の強化版(GoldRing)を作ってIronRingの強化版(DiamondRing)まで突き進むか。
とりあえずそこらへんは置いといてScheme版のStoneRingコンパイラを整理しよう。
CでIronRingのインタプリタを書いて、Stone/Ironどちら側からでもブートストラップ可能にしても面白いかもしれない。



金沢出る時は、もう雪の後に氷で覆われた道路見ることも無いんだろうな、と思ってたけどいきなり目にしたわね。
温暖化によって寒暖差が激しくなるとは知ってたけどここまでとは……


Ringのセルフホスト挑戦中。
コンパイラ大事な部分は結構できてきた。

思ったよりメモリ使わなくて結構驚いてる。
1文字に24バイト使うのに、300KiBいかないぐらい。
10MiBもあれば割といろんなことできるな〜
意外とRib形式も悪くないのかもしれない。



けーくんごうくんがベッドで寝てるな〜、と思ったらひなちゃんも布団の中に居た。
けーくんに慣れてきたかな?



散歩したら近所の家の水道管破裂してた。
かわいそ……



↓とか言いつつずっと拡張してた
もうセルフホスティングまでやってしまうか〜?



Ring、ある程度ちゃんとLispインタープリタとして動いたので一旦完了。
ここからIronRingでStoneRingのコンパイラを書いてセルフホスト達成するのはただの移植……なはず。

どれぐらいシンプルにセルフホストできるか、というチャレンジだったけど、
- Schemeで書いたStoneRingコンパイラ 599行
- StoneRingで書いたIronRingインタプリタ 1386行 (テストコード200行ぐらい)
- IronRingのコアライブラリ 513行
というわけでなかなか短く、見通しも良く書けたのでは。

ここから実用する……となるとIronRingのConsセルという形のみでは厳しい。
特に文字列が1文字24バイトも使ってしまうのと、O(1)でアクセスできるデータ構造が無いのはかなりの制限になる。
uLispとかPicoLispとか、そういった制限の中でいろいろ面白いことやってるものもあるけど。
やっぱり音とか画像を扱いたい。

そのために、次はもうちょっとマシな処理系を書きたくなる。StackVM+GenerationalGCとか。
そうなるとStoneRingじゃ辛いので、IronRingでまずC+αの言語処理系を作る(GoldRing)。
型チェックするだけでなく、Genericsや型推論、多値も欲しい。
で、GoldRingで気合が入ったLisp処理系(DiamondRing)を作ると幸せになれるかもしれない。

ただそこまでしてLispで音や画像のプログラミングしたいかと言うと……ウーン……
やっぱGoとかCでガリガリ書くのが一番捗るんだよな……
アルゴリズム作曲系がやりたいわけでは無いし……

というわけでこれ以降は思い出した時に息抜きでやろう。
Minecraftで昔作ったワールドの続きやるみたいな。
久々にマイクラやりたくなってきたな、今どうなってるんだっけ?Java版消滅?じゃTerrariaでいいか



久々にグランドピアノがっつり弾くと腕がだるい!!
ずっと軽い鍵盤のキーボード弾いてたから最後まで押し込めないことが多い。
修行じゃな



風が強すぎて家が飛んで行った



ウィッチャー3、80%引きなので購入。
なんとかプレイ時間をひねり出したいンゴねぇ……



FreePascalLazarus、はぇ〜まだPascal使ってる人おるんやな〜ぐらいにしか思ってなかったけど、思ったよりライブラリ多くて活発で面白い。
Delphiから移った人結構多いのかな。
こういうフォームデザイナ系のIDE(なんて言えばいいんだろ)、あんまり詳しくないから触っておいても楽しいかもしれない。



税関係の仕事してる人には申し訳ないけど、確定申告とかその他全部完全に自動化されて欲しい。もちろん無料で。
つまり正直に言うと、彼らが仕事を失う状況が好ましい。
そこで「税理士になることを諦めないで」「書類を手で書く楽しさを知って」「ここで努力できないと何やっても上手くいかない」とか言われても、ハァ?となると思う。
必要だからやってるだけで、努力したい分野は別なんだよね。

AI絵でやっていってる人々に、描くことが大事・楽しいという前提で諭しているのを結構見かける。
しかし絵を名声やお金を得るための結果としか捉えてない人には、上記と同じように全く通じずコミュニケーション失敗しているように見える。
彼らは現在のSNSで一番注目を集めやすい絵や写真を利用したいだけで、本当にやりたいこと・好きなことは別にあるのかもしれない。
音楽を結構がんばってやっていた頃、評価どころかそもそも再生すらされなかったので気持ちはわかる。視覚は強い。

AI絵関係の人に、絵描きに敬意が無いと怒り散らしている一方で、クリスタのバージョンアップ料金にはグチグチ言ってる人も何人も見た。
自分の努力と技術は尊重して欲しいのに、プログラマの努力と技術には敬意を払わないのだろうか?と、職業プログラマとしては納得いかない。
AI「なんかに」人間様が負けない、というような、絵以外のAI技術者もまとめて小馬鹿にするような言い草も見かける。彼らは人間を超えることを必死に目指してるのに!
明らかに違法にライトノベルなどを学習している文章系AIは、嬉々として使っている絵描きもたくさん見た。

かくいう自分も税関係の仕事には全く敬意を払っていない。人のことは言えない。

つまりこの問題の根っこはAIなど関係なく、人々は、自分が持たない技術・努力の全てに敬意を払うことは難しい、ということだとずっと思っている。
だから我々天使族が人類を管理し、一度『救済』してあげる必要があるんですね



けーくんがずっと布団の上で寝てくれているので、朝起きたら斜めになってて腰がちょっと痛い。
幸せ痛……とのんきに構えてられないのでストレッチと筋トレを増やす。
けーくんをどかす選択肢は無いッッ



Ringでコマンドライン引数のパース、オプションで渡されたファイルをevalなど整備していってる。
言語処理系いろいろ作ってきたけど、こういった時間が一番楽しいかもしれない。育てゲーっぽくて。
まあ特に難しくなく経験だけが必要で、サクッと書けるというのもあるけど。



ここのSSL証明書、Let's Encryptの更新上手くいかないな〜〜と思って四苦八苦してたけど、よくよく見たら/etc/letsencrypt/renewal/のconfのwebroot_pathの最後に謎のカンマついてた。見逃してた。
時間を返してェ!



RingのGCを、人の手による温かみのあるTracingGCから、コールスタック舐めるだけのConservativeGCに変えた。
これでインタープリタ+TCOで必要になる、面倒なオブジェクトの保護から解放された。
その分GCのアルゴリズムが複雑になるかと思ったけど、StoneRingのコンパイラに変数へのポインタ記法を足して、Conservativeにオブジェクトかどうか判定するだけで済んだ。
Ribなのでオブジェクト開始位置が決定してるのが大きい。ハッシュやビットマップなど使わずに済んだ。
むしろ一時スタック関連のコードが減った分見通しがよくなった。



An unexpected benefit of unit tests

> TDD commonly gets mischaracterized as a two-step process of writing a suite of tests upfront, then writing some implementation to make them all pass. It's actually much closer to what is described as TLD in the post. You write a failing test, do the bare minimum to make it pass, refactor if appropriate and start the cycle again. It's a development process that will (in theory) produce a high quality implementation and suite of tests at the end.
TDDたまにこれ知らずに批判してる人いてぐんにょりする

テストをわざと失敗した状態でやめると次に取り掛かりやすいという話も。よくやる。


けーくんごうくんが交代で追いかけっこしてた。仲良くなってる……!!!
仕事部屋に遊びに来たけーくんを追いかけてごうくんも来たり。

寝室のドアに穴を開けて猫ドアを作るDIY工作中。といっても力仕事以外全部嫁さんに任せてるけど。
ドアを半開きにしてると階下の音、特に洗濯機がうるさかったんだけど、穴が開いてる状態でもドアを閉じると80%ぐらい聞こえなくなる。不思議。



xfce4の動作軽快でテラキモチヨスやな



Manjaro i3 editionをしばらく使っていたけど、お絵描き用にデュアルディスプレイにしたらとにかく相性が悪い。
というわけでxfce4に変えた



仕方なくWindowsのChocolatey+GitBashなどで2時間かけて環境構築をした。
バージョン互換性の違いで苦しんだ。

で、ふと気になってWindowsのコードサイニング証明書について調べたら年間2万ぐらいが最低ラインっぽい。
VSCodeもまだめちゃくちゃ使いづらいし慣れるのに時間かけないといけない。

うーんちっ!
全てがうんち、ウェッブの方がマシとは……
とりあえずクライアントと相談してみる。



けーくん、夜一緒に寝てくれるかな……少なくとも仕事部屋の暖かいとこで寝て欲しいけど……
と心配してたけど、寝るときは足の間(布団の上)に、起きたら身体の横で寝てた。
頭に布団など被るの嫌いみたいで中には入ってこないけど、身体は毛布に入れて頭だけ出してた。
かわいすぎ生物よ……
𝐇𝐚𝐩𝐩𝐲 𝐍𝐞𝐰 𝐘𝐞𝐚𝐫...


ちなみになんでwsl2にこだわるかというと、WindowsのファイルシステムはパーミッションがLinux他と互換性が無く、rsyncやscpで簡単に転送しようとすると全部755か777になって面倒なんだよね。
まあ1アプリの開発に限ればすべてをgit push/pullでやればイイカンジにしてくれるけど。
絵のバックアップ用シェルスクリプトなど全部wsl2に置いてるからwindows側のGitBashとかに二重に環境作りたくない……。



WindowsでElectron+Sqlite3をwsl2でビルドしようとして
発 エラーを
狂 吐かずに
し 落ちるせ
そ いで

でございます

もうウェッブでやるわペッ



お絵描き再開して1年経った比較
ちょっとだけほんの少し……幼めになってるねぇ!!

2018 いつか絵を趣味にしたいと思ってたけど……始めるなら今さッ!! → 10か月ぐらいで仕事激忙しくなって中断
2019 描いてない
2020 1か月だけ描いた。ここらへんあんま覚えてない
2021 1か月だけ描いた。ウマ2期見た衝動。しかし仕事が激変してまたすぐやめる

で、2022。
最初は謎の掲示板(あに〇ん)にらくがき投稿して反応もらったのが楽しくて続いてた。
若干雰囲気が合わんな~となってたとこで、あ〇まんに居たてるちを発見したのでTwitterに移動。
バミちやくりちとの交流のおかげで引っ越したあともなんとか継続。
最近やめよっかなと思ってたのも、皆さんとの交流も楽しいしなんとか趣味として続けたいな、と思い直した。

というわけで皆さんのおかげで続きました。
𝐁𝐈𝐆感謝───



Web版ツイッターが読み込む度に「おすすめ」に切り替わったり、サードパーティーのクライアントを無告知で締め出したりかなりうんちムーブしとるな



けーくんの去勢手術は無事終了。
先生に「大変素直ないい子」と褒められた。
でしょう!
しばらく部屋に居させて、落ち着いてきたところで扉を開けた。
早速楽しそうに家を探検している。




多分明日で怒涛のSkebDays終わり。
で、怒涛の溜まった仕事Daysが始まる……



けーくんロス!!
いつもおしゃべりで、誰か来るたびにニャオニャオ言ってたので、けーくんが居ないとものすごく静かに感じる。
手術無事に成功しててくれ~~~~



明らかに線画描くの速くなってる。
1日5~10時間を10日程度でこうなんだからそりゃコミケ毎に同人誌出したり本業の作家とかは鬼みたいに速いよなあ。
夢があるなあ(やるとは言ってない)。



今日はけーくんの去勢手術。明日お迎え。
無事に済むように祈る。



今日もごうくんけーくんに会わせたら、ごうくんはお腹を出して服従のポーズ?をした。
そしてけーくんはごうくんのおでこをペロペロ舐めて毛づくろいしてあげた。
ごうくん!?君の方が年上じゃないのかい!?
けーくんは面倒見いいのかもしれない。
ごうくんも威嚇はしなくなった。

明日はけーくんの去勢手術。
猫エイズのワクチンはみんなに打ったけど、交尾やマーキングの可能性があるから、今までけーくんの行動範囲は基本的に仕事部屋だけに制限していた。
明後日帰って来てからは制限せず、一緒に寝れる。楽しみ。




喫茶店デートという設定なんだけどせっかくフクちゃんにフリフリ着せるから全身も描きたい!どうすれば!!
うおおおおおおおおおおおおおおおおおおおおおお
2枚描いて合わせて1枚にするか~~




隙間時間でSkeb練り。
Twitterにあげたやつのフリル3割増しぐらいで行く。
フリル適当に描いてきたから向き合う時が来たわね……




朝からSkeb絵練り。
次は背景必須だから緊張感がある。



くしくし
へけっ
へろ~ん
頭痛で何もできな太郎なのだ




やっつけたあたりから頭痛が凄い。
緊張性かな~?
線画のときめちゃくちゃ肩に力入ってる気がする。




SkebやっつけたのでSkebやるぞお




絵、こだわらなくていい細かさまでこだわってしまう。
バランス8細部2ぐらいの時間配分でいきたいけど、バランス4細部6ぐらいになってる。
おーん



腰がヤバすぎるッピ!!




Kim Jung Giの動画
後で見る




ウマ娘のラバーマグネットガチャやったら柴犬が出てきた。
柴犬が出てきた。

すいません!!ウマ娘のガチャーがおかしいのですが!!って叫んでたら店員がすっ飛んできて好きなの選ばせてくれた。
マチタンゲットだぜ。ありがて……



久々にWindows使ってるんだけど、Explorerやファイルダイアログを開くと若干フリーズする。
とりあえず最近普段は消しているファイルサーバーにPing打ってるるのでは、ということでクイックアクセスから外しておく。



緊急のまあまあ割が良い仕事が割り込んだのでしばらく討伐クエスト。
時間はあるけど、2日程度かけてある程度見通し立つところまで手を付けておく。
半日ぐらいはSkebやりつつ……

ただ条件的にElectron使わざるを得ないなあ~
保守費用は別ですよ、と契約書で念を押す。




朝起きて、仕事部屋のけーくんに会いに行くと飛んできてくれる。
癒しよ……

あと4日で去勢手術。
その後は一緒に寝れるから楽しみ。



絵が上手くなることと、上手い絵を描くことは、似て非なる取り組み方になる。
絵に限ったことではなくて、プログラミングや音楽など創作系の活動は全部言える……と思う。

ここを取り違えて苦しんでいる人が結構多いように見える。
変にマジメな人が多いというか……上手くならないと上手い物は作れない、と信じ込んでいる。
まず本で勉強してから、資格を取ってから、数か月かけて練習してから、とか。

まあかくいう自分もそうだったんだけど。
プログラミングの本たくさん読んでも、全く何も作れない期間が5年はあった。
ある日必要に迫られてスクリプトを書いて、知り合いからシステムを作れないか相談されて取り組んでみて、突然どんどん書けるようになった。
それまでのお勉強が役に立ったかというと、ゼロではないけど……3%ぐらいかな。
本には書いてないけど必要な知識と経験が97%ぐらいを占める。

ということを最近Skeb受けたり、ある知り合いの近況を(人づてに)聞いて考えている。
何らかの(何の?)システムを作りたいらしいが、そのためにRustの勉強を始めたらしい。
本を数冊読み込んでWeb系の本も読むとの意気込み。
情報系の学科出てるのに。
数年前から何かを作りたいと聞いているが……そのときはGo言語だったような……うーん




思い込みじゃない……?と疑っていたけど、やっぱり低気圧のとき頭ボーっとする。
気圧入れるか……




マットに寝てるけーくんの近くに横たわると、体勢を変えて顔を擦り付けてきた。
かわえええ~~~

避妊手術の準備に、病院から渡されたノミダニ駆除薬をもう一度塗ったんだけど、塗ったところ(首の後ろ)も擦り付けて来ようとしたので慌てて避けた。
服とかにつくとしばらく臭い取れないんだよね



Skeb一旦停止。
𝐵𝑖𝑔 𝐾𝑎𝑛𝑠ℎ𝑎...



RingにGCのバグ。
evalのifなど結構stackに積んでないの多いことに気付いた。
やっぱり全GCテストは書いておいたほうが楽だな〜

で、これの解決策はまあ簡単に怪しいものを片っ端からstackに積んでおけばいい。
……のだけど、正確さは置いておいても、とにかく面倒。
何故ならTCOのためにループにしているので、with-stackマクロを使って単純にpushというわけにはいかない。
with-stack内でループするとスタックがどんどん溜まっていくので、with-stackから外に次の式と環境を渡さないといけない。

うーん、ここでごちゃごちゃやるぐらいなら、やっぱりSECDマシンにしてコンパイラに投げたほうが楽かなあ。
SECDマシンだとTailIf命令やTailApply命令は単にDUMPに積まないだけ。
Step用の関数を用意してwith-stackで包んでやればいい。

しかしもう一つ抽象化レイヤ(IronRing->SECDコンパイラ)挟むのもなあ。

別の解決策はConservativeGCにしてしまうこと。
StoneRingはアセンブリ直接書いてるので、インタプリタ側コールスタックの構造は決め打ちで良い。



けーくんは結構寝相がダイナミックで、徐々にではなくいきなり大きく寝返りをうつので、たまに畳んだマットや机の上に置いたベッドから落ちる。
その度にビックリして、可愛いけどちょっとかわいそうなので、今日はトレーニング用のマットを敷きっぱなしにして猫ベッドを置いておいた。
快適みたいでいろんな場所に転がって寝ている。



どう考えてもそろそろでしょう、みたいな状態から持ち直したらしいので帰宅。
ただまあ準備はしておかないとだな~




祖母が危篤らしいので病院に向かう。
90代後半で、そろそろ……と身内全員覚悟していたので特に動揺は無い。




Skeb納品。
今回(全年齢・公開)は納品した瞬間に処理終わった。
そういうことやね。おーん




今日は朝から猫のワクチン接種。
なので昨晩は気合で寝て早起きしてSkeb絵やっていた。
レイヤーマスク使いまくってるけどあんまり使わないやり方に変えたいなあ。



けーくんごうくんの進展。
毎日会わせてると、ごうくんはしばらく威嚇しなくなってきた。
しばらく匂いを嗅ぎあったり、離れて様子を伺ったり。
ごうくんはけーくんのトイレをチェックしてみたり。

慣れてきたけーくんが遊んで欲しいモードになって、猫ハウスの周りをうろうろしてるごうくんに急いで近づいてみると、さすがにビックリしたのかごうくんは威嚇。
けーくんはちょっと後ずさりして、フニャフニャ言いながら距離を取って待機モードになった。
なんだよ~、と言ってるように聞こえる。



Skeb、初納品で・非公開で・NSFWで・受けてから納品まで速いから、なんらかを疑われたのでは的なむにゃむにゃ



Skebやっと納品された、こんなに遅いの!?



Skebまだ処理中、何……?
不具合なのか多忙なのかわからないのは困るなあ。
まあ問い合わせ手段が無いので待つしかない。次のリクエストをこなしましゅ……



求められてないのに勝手にアドバイス罪(大罪、国によっては死刑)ですが、テストを書くのが初めてなら、1つとにかく厳守を薦めたいのが「まず失敗するようにテストを書く」です。

これをやらないと、テストそのものが間違ってる事に気付かず時間を大幅に無駄にする、というミスを必ず何度もやります。
テストがそもそも実行されてないのに成功と勘違いするとか、条件が間違っててバグがあっても成功するとか、そういう原因です。
a == f(x)が成功条件なら、まずa != f(x)と書いて失敗することを確認します。

初級者からある程度上級者まで一緒に仕事しましたが、みんな1度以上はやってました。自分より凄い人でもこの間抜けなミスで時間を無駄にするのを見ました。
私はこれを厳守するので若干トータルの作業速度は速いと思います(自慢)。




DesignDoll使ってみた。
確かに便利でポーズ作りやすいんだけど、どちらかというと3Dモデルである程度人体を完成させたい人向けだなあ。
アタリを破綻しない程度に作ったあとそれ以降の調整は絵でやるからClipStudioの方で良いかな。



Ringのマクロ展開、最初はmacroオブジェクトを作って評価時に展開するようにした。
しかしマクロ書くときに展開時の重さを気にするようになって精神的によろしくないので、evalのtoplevelで全部展開するようにした。
するとその展開アルゴリズムをどこに書くかが問題になる。

まずほぼBCPLみたいなStoneRingでGCを気にしながら書きたくはない。
現状IronRingは全てがconsセルなので、マクロテーブルは連想リストぐらいしか手段が無く、展開がO(n^2)になる。
RBツリーをマクロ無い状態で実装するのも面倒。

というわけでsyntaxオブジェクトも作って、グローバルのシンボル値として登録することにした。
で、展開はmacro or syntaxオブジェクトが持つfnに投げる。
まあまあシンプルに書けたし、スピードもある程度ある。IronRingはこれで良いでしょう。



Skebの納品処理が開始されて15時間経過―――
何!?なんなの!?怖いよォ!!



チコちゃんひなちゃん2回めのワクチン接種。
留守番してるんだけど、今日は外壁塗装の高圧洗浄で機能よりも更に音が凄い。
とてもじゃないけど集中できそうにないな……
ごうくんは布団に潜り込むからいいけど、けーくんの退避場所がないので、猫ハウスに毛布をかぶせてそこに潜り込んでもらう。



今日の日記
筋絵絵絵絵
筋絵絵絵絵
筋絵絵絵絵




外壁工事の音に、ごうくんひなちゃんはビビり散らかして布団に潜り込んでいる。

けーくんは至近距離でドンドンしてるときは流石に警戒していたけど、それ以外はちょっと迷惑そうにするぐらいで寝ている。

チコちゃんはいつも追いかけてくるごうくんが居ないからか、楽しそうに散歩している。



今日から外壁工事。うるさそ……




Skeb絵やって息抜きにパソコソカタカタしてギター弾いとる
ハァハァ……



Ring、MacroやシンプルなQuasiquoteの展開まで作ってなかなかちゃんとしたLispになってきた。
しかしなんというかこう、思ったより全体のシステムがシンプルに収まらない。
というか……なんというかこう……
便利に使うために抽象化の層を重ねて、その抽象化の層で生まれた問題を解決するために別の抽象化の層を重ねて、それによって生まれた……という無限の労働、永遠に終わらないYak Shavingに踏み出してる気がしてならない。

例えばCだったら、まあ気合でがんばるしかないんだけど、逆に言えばやる気・時間・集中力やその他を解決すべき問題だけに集中できるから、進みは多少遅くてもYak Shavingによる精神的な疲労をある程度避けられる。

うーん



一通りクリスタの機能動くことを確認したので依頼を受けた。
しかしめっっっっっちゃ便利だなこれ……Kritaくん、今までありがとう…………



skebの受付を開始してみた
なんか勘違いしてて、リクエスト放置したらイカン……!と思ってたけどイカンくは無いか。
まあ仕事がハチャメチャじゃない限りは受けたい。

で、最初の依頼を頂いたが、かなりチャレンジングだ……描き方調べまくらないと。
縦書き必要だしClipStudio環境が動作可能なことを確認したら受ける予定。



絵を挟みたい、とか言って結局パソコンカタカタしてたからいい加減頭がアレですぞ!
絵を描きますぞ!



若干昼起きになりつつあるから朝型に戻したいッピね……



Ring、完全に愚直なスタックマシンとして実装していたけど、下記のバグを生む原因にもなるし別にわかりやすくない。
というわけで式の値を全てpushしていたのを、raxレジスタで返す規約にした。短くなったしわかりやすくなった……と思う。



バグ解決した!やはりスタックに値が残っていた。
(let binds . body)のbindsは(set! local-ref value)のリストに変換されたあとコンパイルされるんだけど、set!の結果(value)を全てスタックに残してしまっていた。
中間値を捨てるコードを挿入するbeginで囲んで、beginが残す最後の式の値をpopして修正。
無事((fn (f) (f f)) (fn (f) (f f)))が無限ループになった。ループ成功!



RingをTCOに書き換えたけど、どうもコールスタックを食いつぶして落ちている。
一つはコンパイラ側のバグで、PseudoNamedLetの引数がスタックに残ったままだった。
おそらく同じ様にスタックに何かを残したままか、evalに意図していない再帰が発生してるかのどちらかだと思う。
う〜んめんどい。

で、evalのコールレベルを調べてみた。
ちゃんとループになってた。
犯人はコンパイラ側だ!ギョエエ



作ってるLisp処理系、Ringのページ作った。
ファイルアップロードもWikiできるようにしたいンゴねぇ……



今日もひたすらパソコソカタカタ……は若干脳が疲れてきたので絵も挟みたい。



ピアノの鍵盤が一つおかしかったので調律師さんに見てもらった。
他の猫たちはピアノの音と知らない人にビビって部屋に籠もってる中、けーくんだけは元気そうだったので部屋から出してみた。
フニャフニャ言いながら楽しそうに探索。
音が鳴っても気にせず調律師さんの足元に寄ってみたりしてた。
調律師さんも猫好きなので、鳴くけーくんに楽しそうに返事してた。



整数・リスト・シンボルのreadまでできた
あと文字列をreadできるようになったらeval書いて終わりかな!
しかし今から激・疲れそうな外食なので滅入っている。
今日は終わりだ終わり!



ひたすらパソコンカタカタしている。
Mark&SweepGCができたのでreadに取り掛かり中。
もう何回も書いたから難しいところはあまりなくて、ひたすら根性というところ。
若干モチベーションを保つのに苦労する。



ギター弾きながらプログラミングで絵を描きたいッピ



久々に熱中して夜中までコード書いてしまった!
思ったより早くLispインタープリタの実装に取りかかれそう。

メモリ表現はCopyingGCと迷ったけどRibbitSchemeと似たような1オブジェクト3セルのMark&Sweepでいく。
CopyingGCはアルゴリズム自体は単純なんだけど、オブジェクトアドレスが移動するので処理系側でその対応をするのがとにかく面倒。
せっかくS式だからマクロ使って対応するって手もあるけど、保存だけでなく追跡が必要なので、多分簡単にはいかない。
がんばってそこらへんの対応をするぐらいなら、mallocとConservativeGCを書いてしまったほうが楽そうでもある。
まあそういうのは後々……今は動かすことだけ考える。



おしょうがつの楽しい自由研究としてScheme(Gauche)でLispからアセンブリへのコンパイラを書いている
maruをもっとシンプルにできないかな〜と思って取り組んでる。
今のところ自動テストを自分で書ける程度になった。
まあ型無しのCというかBCPLみたいなものなんだけど……



ギターのルーパー(BossのRC-10R)届いたので身体くたくたになるまで弾いてた。
たまらねェ〜〜〜



久々に見たくなった
きゅうじゅきゅ、きゅうじゅきゅ、きゅうじゅきゅ、



明日ギターのルーパー(楽しすぎ装置)が届くので音信不通になったら、ごめん



嫁さんと散歩しつつ会話してたんだけど、拙者がお高いソフト使ってても100000%不満点が出てくるから自分で全部作ったほうがいいんじゃね、という結論に落ち着いた。
やるか〜



久々にクリスタ使おうかな〜と思いつつWindows起動するのが嫌すぎて延期を繰り返しておる



ほかほかフクちゃ描いた

今回ちょっと変わった描き方をした。激上手人(げきうまんちゅ)が面白い描き方をしてたので真似。

まず太い線でラフを描いて、バランス決まったら少し太めの線でスケッチ。ここまでは普通。
で、こっからいきなり色を置いて、スケッチの線を薄くしていって1枚のレイヤーで色で形を取る。
色だけじゃわからなくなったところで上から線画を描いて、線画に合わせるように色も修正。
そしてここまで顔のパーツは描かない。全体の線画とベースカラーが出来た時点でやっと顔。

ここまで描いたのに顔がまったく描けなかったらどうしよう……と思ってたけど、案外上手くいった気がする。
何よりレイヤーが数枚で行くのが軽くて良い。次も同じ描き方してみる。



オッ



近所の神社に初詣行ってきた。
割と手入れや準備されてはいるけど、Omikujiが無かったのが残念。



Kritaはクリスタみたいにレイヤーカラー無いから、グループで色レイヤを上に作ってαロックするか、フィルターレイヤーをレイヤ内に足して調整するかだから面倒だな〜
と思ってたけど、fill layerを作って全部消して、白で書いていけば良いっぽい。
明度が透明度に変換されて、白が不透明、黒が透明みたい。直感的には逆だけど……



新年初首痛でクオリティ・オブ・ライフが激下がりしておる。
寝違えたかな〜



サボニウス風車作り……のプロトタイプ作りの続きを久々に。
コイルを1000回ぐらい巻く必要があり、そんなの手でやってらんねえYO笑い止まんねえYOということで風車を利用して巻こうとアレコレしてたが失敗。
風車や巻く部分は厚紙にバーベキュー串の軸を刺してるだけなので、回しているうちに摩擦で穴が広がって、やがて別々に動いてしまう。
軸に巻く部分を固定しないといけない。テープを毎回切り貼りすると効率が悪いので、クリップか洗濯バサミなどを使えるようにする。

あとYouTubeの動画見ながらやってたけど、同じように箱を使うと試行錯誤の効率が悪い。
修正の度に開け閉めしないといけないし、位置の調節が難しい。
板に柱の方が良いよなあ、というわけでそっちも変更する。

100均とホームセンターが営業開始してから続きをやる。



めったに酒飲まないんだけど、誕生日と大晦日だけは少し飲むことにしている。
で、耐性がまったくないので梅酒をグラス半分飲んだだけで激ネムになってしまった。
ほなみなさん良いお年を、𝐆𝐨𝐨𝐝 𝐍𝐢𝐠𝐡𝐭...



へっへっへ、あけましておめでとうございやす
言及