日記 2023-11
公開
2023-11-30 15:54

急に寒くなったからかけーくんが1時間に1回ぐらい甘えに来て、その度に10分ぐらい身体の上で寝てるから作業が度々中断される
でも幸せなのでオッケーです


体調に悪みを感じたので奥義・午前爆睡をかました。
完全復活



ビラノア飲むのやめたらすぐに肌荒れたので飲んだ、うんち


なんか変な気がするからビラノア飲むのちょっとやめてみる。
肌荒れだしたら再開する。



SQL(Sqlite)の練習も兼ねてmicrobの内部コードをどんどんViewやTriggerに移していってる。
今までかなり無駄なコード書いてたんだなあと後悔しつつある。


microbの画像データをsqliteファイルに入れてしまうか迷っている。

利点はバックアップとロジックがかなり簡単になること。
1ファイルをコピーするだけで全てのバックアップが完了する。
コメントやユーザデータなどの削除時に、そのまま画像データも削除できる。
といっても今の時点でそこまで困ってないけど。

問題はファイルサイズとスピード。
現時点で画像ファイルは282MB、データベースファイルは21MB。
合計300MBなので、まあコピーは重くなる。
それからnginxなどにストレージ部分を任せられず、DBのReadが入るので、どれぐらい影響が出るかわらかない。

画像ファイルに関しては、縮小してるのもあってか思ったより全然余裕がある。
ファイルサイズを大きくするよりも、画像の量を増やした方が楽しいかな。
ただ日記機能作って画像許可すると、ずっと残しておかないといけないので、いつかはパンクする問題がある。



けーくんが甘えに来て、そのまま身体の上で寝てしまったので、30分ぐらい何もせずに過ごしていた。
何かが回復した。
スマホとか見ずにぼーっとする時間増やしたほうがいいよなあ多分。


ひなちゃんは顎が外れたわけではなかったっぽい。多分。
歯石が邪魔なのかも、らしいが……



microbのロジックを、中途半端なORM感あるコードからSQLに移していっている。
DELETE関連はTRIGGERでかなりスッキリした。
最終的にモデルだけの型は全部消したい。
その後コード公開かな。



うーん、ひなちゃんの口またおかしいので動物病院につれていく。



Ring、とりあえずLinear Scan Register Allocation終了。
実装したのはLet/If/Int/Returnだけだけど、KNormalからx64アセンブリまで基本のアルゴリズムはわかった。

ただやっぱり速度は厳しい。
現在のRingはスタックマシン的なアセンブリコードを出力し、データはInt以外全てコンスセルなんだけど、このどちらもスピードに大きいペナルティがある。
そのミニマルな処理系から、型推論・最適化で一気に使える処理系を作れないかと思ったけど、ビルド時間がかなり厳しそう。
もし完全にブートストラップしていくなら、まずミニマルな処理系の上にアセンブラを実装して、そのアセンブラでCopyGCのO(1)アクセス可能配列がある処理系を実装して、その上で上記の最適化に挑むという手順を踏んだ方が良い。

まあそれはかなり面倒で、もう良いかな……
実際にそういうことやるハメになったら(文明崩壊でもした?)、Forthをハンドアセンブルし、その上で他の処理系を作る方がマシかもしれない。



けーくんがずっと甘えてくるので横になったり縦になったりを繰り返している。
急に寒くなったからかな。



ひなちゃんのアゴがちょっと外れたっぽくてカコカコ言ってた。
病院に連れて行こうと準備してる間にハマったっぽい。


RingのKnormal変換から仮想アセンブリ出力までのコード、やっぱりオブジェクト使いまくるとコードがスッキリして良い。
S式のおかげでテストも書きやすい。

ただまあこうして見ると読みやすいかは別だな……
非常に小さいコアと単純な仕組みから、自己拡張だけでここまでできるのはやっぱりLispの好きな点。
しかしウン十年コード書いてて未だにS式が単純に読み辛いと感じるのは、ここが限界なのかな。



けーくんの最近の甘えルーティン、椅子に座ってる人間に正面から抱きついて、ひたすら頭を人間の顔に擦り付け、満足したら膝などの上で丸まって寝る。
頑張って背伸びして顔擦り付けてくるのが可愛すぎ幸せすぎ


Ring、KNormalとVirtualAssemblyの変換を少しずつ進めている。


wapp使ってTclでログイン処理まで書いてみた。
まあsqliteなど簡単に使えるのは楽。SQLをそのまま書けるのも良い。

ただやっぱりユーザーの少なさからライブラリも少なくて、ここから真剣に書いていくにはTclにある程度骨を埋める覚悟が必要。
自動Webテストなどはかなりの労力が必要になる。
うーん、そこまで熱意は無いかなあ……



Ringのレジスタ割り当て実験、KNormalへの変換を書いてる
このコード何度も何度も書きすぎてちょっと嫌になってきたわね……


XInput2を使ってXP-Penのタブレット情報取得してみた。
しばらくペン触ってないとスリープになってデバイス情報に現れないっぽくて、かなり戸惑った。



RingでLinear Scan Register Allocationを実験している
Cons Cellしかないのでだいぶん汚くかつO(n^2)が発生しまくるコードになってる。まあ仕方ない。
分岐ではどうするのかな、と思ったけどSSAでの論文見ると単純に直列として考えて処理している。
インターバルにかなりの穴が空く、つまり無駄なspillが増えるけど、経験則的に許容してるのかな。
生成後のコードの速さより、JITなどコンパイル速度を重視してるアルゴリズムだし。


ついにmicrob開設から(確実に)1年が経った。光陰矢のごとし。

去年の今頃はけーくんを保護して忙しかった。
最近は猫たちと戯れるのが当たり前すぎてあまり書かなくなったけど、読み返すとなんでもない記述が微笑ましいのでできれば書いておきたい。
300円均一みたいなとこで買ったややオシャレな猫じゃらしをごうくんとけーくんが取り合っている。
基本的に遊ぶとけーくんがはしゃぎまわるんだけど、終わったらごうくんがベッドに持っていって抱きしめて寝ている。



Ringに循環リスト対応のequal?とマージソートを追加。
どっちも確かアルゴリズムはこうだった……記憶が……と古い記憶を引っ張り出しながら実装した。
まあテストが合ってるのでテストは合ってるでしょう……


EasyTab使ってCでペイントソフト作ろう……と思ったけどスタイラス情報取得できず。
ソース読んでxinputで調べたらタブレットがstylusとしては認識されてなかった。
幸いAzPainterの人の解説があったのでXInput2で自分で取得してみよう。


A Quick Introduction to Register Allocation
ようやくLinear Scan Register Allocationの概要が掴めた。

まずIRなどを頭からスキャンする。
現在の位置をインクリメントしつつ、変数の生存期間を記録していく。
まず最初の出現時にstartとendを現在位置とする。例: var-x: start2 end2
で、参照時にその位置でendを更新する。例: var-x: star2 end4

次に、変数のリストを使ってレジスタを割り当てて行く。
位置を再び0からインクリメントして、出現した変数をactiveとして保持、endが超えると削除していく。
activeへの追加時にレジスタ割り当て。余ってるレジスタがあればそれを変数のレジスタに記録。例: var-x: start2 end4 rax

レジスタが足りなければ、スタック領域へspillする。
経験則によるとactiveの中で最後に出現する(endが一番大きい)ものをspillするといいらしい。
activeをendの降順でソートして、先頭が新しい変数であればそのままspill。例: var-x: star2 end4 stack:4
既に使われているものであれば、spillして、設定してあったレジスタを新しいものに割り当てる。

うーんシンプル。endでソートすればいいからSSAやKNormalじゃなくてもいいのかな?
まあでもアルゴリズムが簡単になるしKNormalにしといたほうが良さそう。



Tcl/TkとSqlite3で簡単なツールいくつか作ってるんだけど、やっぱり記述が楽すぎて全部これになって……になる。
しかしTclの性質上、ツリーなど複雑なデータ構造の扱いがかなり面倒で、プログラムが大きくなると厳しくなる。
うーむ、誰かどうにかして。



日記見返すと、6/1からずっと6時起き固定してるのか。
おかげで自律神経完全に整ったっぽくて、日々めっちゃ健康に過ごしている。


Ring公開用のfossilをアップデートした。
apt-getで入るバージョンがかなり古いから公式からビルドするか〜と思ったんだけど、バイナリ落として起動するだけで良かった。
他のソフト全部見習って??


彼方のアストラ全巻買って読んだ。
面白いらしい、とだけの前情報で読んだからめっちゃ感動した。
こういう短くまとまった、映画のような読後の作品好きだな。七夕の国とかピンポンとか。


軟骨の唐揚げ食べて、やたら硬いところあるなと思って気合入れたら奥歯が欠けた。
人生初の歯欠け……許せん……



Ringをfossilに移行して公開してみた。
SCGI+nginxだと設定に3行書いて終わりなの楽過ぎて涙が出る。



久々にRingをいじった。Stoneコンパイラの最適化。
シンボルをアセンブラ用のラベルに変換する処理がキャッシュしていなかったので、シンボルのプロパティにキャッシュ。
セルフホスティング全体が5.1sから4.4sに0.5s速くなった。


絶好調!!!ってバリバリ動いてたら突然体調悪くなった。
誰や


RoRR、どうもエンジニアだと落ちるっぽい



Risk of Rain Returnsがアップデート後Linuxで落ちるようになってしまった。
次のアップデートで復活することを祈る……Windows起動したくないじょ



なんかLisp in Small Pieces進めてても「何やってんだろう……」的な感覚がある。
うーんなんか、なんだろうこれは


Lisp in Small PiecesのChapter2完了。
ちまちまと進めている。
次は継続だからかなりスローペースになりそう。


ペンタブレットのドライバアップデートしたら設定とんだ、画面エリア設定し直すのダル
2304*1440


microbの内部設計にいろいろ変更を加えた。
ただ、メソッドを使ってオブジェクト指向のようにエンティティを表現してたけど、Goにおいては間違いな気がする。
様々な場面でその場にあった型を定義しやすいので、循環参照が不可能なモジュールは足かせにしかならない。
結局RailsのActiveRecordのできそこないみたいなものになる。
Id、またはIdを保持するだけの型を定義して、SQLをガンガン書いていった方がいいかもしれない。
Fossilの設計を見てると強くそう思う。


絵描いてる最中に割と強めに眼が痛くなってしまった。
多少休憩しよ……


emacs、popperでいろいろポップアップにした。便利。


重い腰上げて、普段ちょっとどうにかしたいと思ってるemacsの問題をChatGPT(3.5)君と解決しまくった。
めっちゃ便利になった。サンキューChatGPT(3.5)君


えち絵師ちゃんのこの漫画また見たすぎて気が狂いそうになってた
ここにもメモっておく
画像も保存してVPSとバックアップサーバーにもアップした


お絵描きウォームアップしてて気付いたけど、カフェイン摂ってからしばらくは、丁寧な作業がちょっと苦手になってる気がする。
興奮状態なのかもしれない。
逆に新しいことに取り組むパワが溢れてる感があるので、気になってること調べたり、アイディア出しなどをすると良さそう。



お自律神経が終焉を迎えているので起床時間固定で整えていく。
今日は6:00に起きた。
言及