プログラミング

Java21のパターンマッチは醜いと思う

JDK だか Java だか知らねーけど開いた口がふさがらなくて口腔内が砂漠化したのでヘイト記事を通して膿を出す。 Java (¬ JVM) がそれなりにひどいのはわざわざ表明する必要もないんだけど、JEP 441: Pattern Matching for switch で提案されているパターン…

nix + cabal の環境で libz.so.1 が見つからなくてコンパイルエラーになるやつの解決法

事象 nix-shell に入った状態で zlib に依存したパッケージを含んだコンパイルをすると libz.so.1: cannot open shared object file: No such file or directory とかでてコンパイルが失敗することがある。本当に結構ある。 ghc 9.4.6, cabal 3.10.1.0 で発…

Functor 深い

Haskell の Functor について調べてたらこんなのを見つけた。 stackoverflow.com ここで挙げられているエクササイズを見てみると Functor の深さにめまいがしてちょっとだけウンコを漏らした。 2問目 Functor の composition をデータ型で定義しろという問題…

非NixOS の Linux ディストリで nixpkgs を使ってるけど今のところはこれでいいかとなってる

WSL2 上で Ubuntu を使っていたけど Arch Linux に乗り換えて数か月が経った。WSL2 なので正直システムがどんなけ汚れようが構わないんだけどなんとなくユーザーランドで汚染の範囲をとどめたかったので Ubuntu の時代からかれこれ1年くらい nixpkgs を使い…

リーダブルなテストコードの書き方って記事についての雑感

テストの書き方を人と話していたとき logmi.jp の記事を権威付けのために出された。 読んでみてなんかウッとなったところがないでもないので、今後この手の記事を同じようなシチュエーションで出された時の自分の立場を明確にすべくこの機会に言語化しておく…

良いコード

なんか良いコードと悪いコードがなんちゃらみたいな本がしばらく前に話題になっていて、随分と主観的なタイトルだなと思って近づかないようにしてるんだけど、別に主観的で良いじゃんと思ったので自分が現時点で思う良いコード(否、設計)の条件を挙げてみる…

elmで頑張ってValueObjectを定義したけどやっぱ型クラスないと無理矢理感が否めない

Haskellっぽいでおなじみのelmにはtypeclassがない。これによりMaybe.andThenを使わざるを得ない局面などにぶつかることが多々ある。 これ自体はelmの設計方針だったりするので特に文句を言う筋合いもないので気に入らなければpurescriptやfp-tsでも使えば終…

モナドわかった気になりたくてRustで試してみたけどなんだかわからないまま終わった

Haskellは楽しいことが分かったが、圏論のことを1ミリも知らないので数学上の定義とプログラムの対応がよくわからないままLYHGG読んでなんかわかったようなわかんねえような状態になっていた。 要は同じcontext同士で演算できてその結果もcontextですよって…

Clean Architecture 読んだ

人生を豊かにするためにかの有名なRobert C. Martinの Clean Architecture を遅ればせながら読んだ。 Clean Architecture: A Craftsman's Guide to Software Structure and Design (Robert C. Martin Series) (English Edition)作者:C., Martin Robert発売日…

子クラスの __repr__ を親クラスで拡張する

たとえば継承していることを警告したい場合とかに使える。 実装はこのようになる。 class C: def __init_subclass__(cls, *args, **kwargs): super().__init_subclass__(*args, **kwargs) original = cls.__repr__ def extended_repr(self): return f'{origi…

Rust で brainfuck を書いてみての感じ

Rust は完全に趣味で型のある言語触っておくかというモチベーションでやっているだけのものなので極めたいとかは全くないのだけど動くものをつくらないとダサいという思いがあるので入門に最適な brainfuck を書いた。 https://github.com/mtwtkman/bf/blob/…

pytest が柔軟すぎてなかなか扱いが難しい(ときがある)という話

個人的には RSpec の手法が好きで緩い BDD で書くことが習慣化している。 具体的にはテスト対象でディレクトリを切って文脈ごとにスコープを切るという RSpec を普通に使う場合の方法だ。property based testing や generative testing や golden data testi…

type hints 迷い中

静的型付けの言語の経験がそれほどないというのと、動的型付けである python においてどれほど型に厳格であるべきかという悩みが個人的にはそれなりにある。特に type hints においては単なる静的チェックでしかなく実行時の強制力はない。そのため型のゆる…

diesel の test_transaction を使ってテストを多少まともな感じに書く

test_transaction を使ってテストを書く際、形式的な記述が必要になった。 use diesel::prelude::*; use diesel::result::Error; use create::db::establish_testdb_connection; let conn = establish_testdb_connection(); &conn.test_transaction::<_, Error, _>(|| { /</_,>…

diesel 使ってるアプリのテスト環境どうするか

基本的には test_transaction を使えばよいが、そんなことはドキュメント読めば自明ではある。 それよりもテスト DB のマイグレーションをどうすんじゃということに関心があって、是非はともかくとしてとりあえず腹落ちした方法としては DBの作成 -> マイグ…

enum を動的に作る

辞書から enum への変換とも言い換えられるが現時点では標準機能としては存在していない。ソースコードを読むと enum._EnumDict の __setitem__ で値を設定すれば可能であることが読み取れる。 import enum xs = {'a': 1, 'b': 2} d = enum._EnumDict() for …