昼休憩カルボナーラの現在地

折に触れてカルボナーラを作ってみたところ、炒り卵パスタが完成したことがある。火を通しすぎていたらしい。

 

それ以来、昼休憩でヒマな時にはカルボナーラを作りまくり、安定した味が出せるようになってきたので、作り方をここにメモしておく。

 

ワンパンカルボナーラ(2人前)

 

1. 仕入れ

スーパーで短めのパスタと細切れベーコンを買ってくる。ベーコンは予め切っておいたものを使うのが圧倒的に楽。

 

 

 

2.茹でる

26cmのフライパンに水を500mL入れ、ひとつまみの塩とそこそこのオリーブオイルを入れて加熱。沸騰したらパスタを入れて3分半茹でる。

 

3. 炒める

ゆで汁が多すぎたら少し捨て、若干水気が残っているくらいにして、皿に避けておく。

ボウルに卵2つ、牛乳70mL、パルメザンチーズ大さじ2を入れて混ぜ、卵液を作っておく。

 

追加でそこそこのオリーブオイルを熱し、チューブにんにくを炒める。香りが出たらパスタをゆで汁ごと戻し、炒める。

 

4. 完成

パスタが温まったら火を止め、卵液を流し込む。卵が大人しくなるまで混ぜたら盛り付け、マジックソルトを結構な量かける。

卵液に牛乳が混ざっているので、卵に火が通るのに時間がかかるようになっている。焦らずゆっくり作業してOK。

 

 

最近はこのレシピで安定している。面倒がらずに茹でたパスタを皿に避けておくのと、オリーブオイルを多めに入れておくのがミソ。

パスタは表面張力ですごい量の卵液をとどめておけるので、親子丼のように卵に火を入れる必要は一切ない、ということに気付けてからは上達が早かった。

へんな自意識が、鎌首をもたげている。

コーディングして作りたいものが、今の自分にとれる作業の時間を大幅に超えていて、身動きが取れていない。キューがハケないまま、どんどん後続が積まれている感じ。

そうなればAIの手を借りてサッサと作るべきだし、そうした方がアイデアたちも救われるはずなのだが、「ここは手書きで書きたい」という欲望たちが渦巻いていて、書き始められない。AIによるコーディングは仕事で沢山やっているから、たまにはAI抜きの、オーガニックなプログラミングをしたいという欲があるのかもしれない。

かれらは知恵の習得をさまたげる蛇だと思う。蛇だから、鎌首をもたげている。

高い牛乳のほうがラテは美味い

nakataki.hatenablog.com

この記事を書いたのち、食材宅配サービスのOisixを試した。5日分のレシピとそれに必要な食材がセットで届くのだが、その中におまけで、ちょっとお高い牛乳が混ざり込んでいた。

この牛乳を飲んでみたところ、明らかに普段の牛乳(スーパーで219円の安いやつ)とは世界が違った。そこで、コーヒーをこの牛乳で割ってみたところ、恐ろしいことに、違いが実感できてしまった。 高いコーヒーはラテにしていいし、ラテは高い牛乳のほうが美味い。

飲みきった翌日、ふと気がついたらスーパーでちょっと良い牛乳に手を伸ばしていた。こうやって少しずつお金が減っていくのか?

買ってよかったもの2025

逐次追加。大小いっぱい買ったな~!

ノートとペン

もともとは佐藤雅彦の講演会に参加するために板書用として買ったものだが、その後じんわり生活に馴染んでいる。ペンも出しっぱなしでも色が薄くならなくていい感じ。 謎解きのアイデア出しや、毎日のToDoの管理、収納サイズのメモ、パズルのメモ用紙と獅子奮迅の活躍をしている。いい紙といいペンに出会えた。

スリコのツールボックス(ミニ)

www.palcloset.jp

開けるとガバっと出てくるタイプのツールボックス。仕切り付き。調べるとニトリとTHREEPPYでも同じものを売っているようだが、色に統一感を出したくてスリコで揃えている。 この収納容量にドハマリした結果、現在は4つ購入していて、それぞれ薬・お香グッズ・名刺&カード類・イヤホン用に活躍している。まだ買い足すつもり。

マステカッター

上記のツールボックスが4つあるので、識別する必要が出てきた。テプラのようなテーププリンターを使おうか迷ったが、マステ+手書きで十分じゃないかと思い至った。 ワンプッシュで2cm、n∈ℕプッシュでn*2cm出るので、小さいものから大きいものまでなんでもラベリングできる。お菓子ボックスに意味もなく「お菓子」と貼ったりしている。

HARIOのフレンチプレス

かっこよくコーヒーを抽出できる道具。カフェで「時間が経ったら押しこんでください」と言われ、砂時計と一緒に出されたのが出会い。ギミックの面白さに一目惚れしてその日に購入。コーヒーを入れる分には片付けと粗挽き豆の準備が大変でなかなか淹れるモチベにならず、ドジャース移籍直後の佐々木朗希くらい持て余していたが、のちに2人分の紅茶を淹れるのに最適な道具であることが判明。現在はポストシーズンの佐々木朗希くらい大活躍している。

最高の財布 millefoglie P25

[rakuten:coolcat:10004291:detail]

高校から使っていた財布がいよいよ限界だったので、長く使える財布を求めて選んだのがこれ。(色は違う) 財布にありがちなファスナーやスナップボタンではなく、ギボシというパーツで固定しているのが特徴。ギボシは遊びがあるので、中身の量に合わせて柔軟に形を変えてくれるのが嬉しい。紙幣を出すときの「ばるんッ」という感覚は唯一無二で、これを味わいたいためだけに現金を取り出す回数が増えた。数年後に色合いが変わっていくのも楽しみだ。 厳密には買っていなくて、パートナーにクリスマスプレゼントでもらったもの。2人で選んだからセーフとする。

耳栓 Loop Switch2

クイズ大会に参加すると、たいてい準決勝くらいまででバテる。音がデカいのが悪いのかと思い、オススメしてもらったこれを衝動買いした。クイズイベントはもちろん、元気がないのに新宿駅や池袋駅を通る必要がある時などにつけている。ノイキャンをつけたくらいには音が減るし、圧迫感・疲労感もないので大変たのもしい。

hp Pavilion Aero 13

個人開発/副業用に購入。数年前のhpマシンではお馴染みの、Enterの右側にPgUp/PgDnを置く激ヤバキー配列は改善されているし、1kg切りで軽いしで、今のところ一切の不満がない。

イヤーカフ型イヤホン

音楽を流す・流さないにかかわらず、基本的に常時つけっぱなしにしている。ものすごく軽いので、ずっとつけていても一切負担を感じない。会議用にもう1本買おうかな…

HUAWEIのスマートウォッチ

これも常時つけっぱなしにしている。時刻がわかって、睡眠と心拍数のデータを取れればそれで良いのだが、アルミボディなので見た目がやや格好よく、気分が上がる。

マイクアーム

余らせていたマイクをつけたところ、PC通話の音質が格段に向上した。マイクの性能うんぬんではなく、口元にマイクを近づけられるのが良いらしい。

PortalのGLaDOSみたいでかわいい。

Öoo

おもろすぎ。個人的GOTY。ちなみに「Ö」の入力ができない環境では、「Oeoo」と検索すると同じ結果が得られるぞ。

嘘喰い

おもろすぎ。

選外: Slay The Spire

おもろすぎ!!!7月から遊び始めて、1年で263時間が溶けた。本当に良くないタイプの面白さをしている。

インタフェースは多義語。3つの役割がありそう

インタフェースを読み書きする機会が増えた、と思う。で、自分なりにコードリーディングを頑張っていると、インタフェースは(TypeScriptにおけるtypeも含めて)以下の3種類に整理できるのかな、というイメージが湧いたのでメモしてみる。

ポリモーフィズムの明示

ポリモーフィズムを実現するには、共通の契約が必要。

たとえば、以下のようなUserクラスがあったとして、継承による実現なら抽象クラスが使われるが…

class VipUser extends User {
  badge(): string {
    return "VIP"
  }

  canPost(): boolean {
    return true
  }
}

class TrialUser extends User {
  badge(): string {
    return "TRIAL"
  }

  canPost(): boolean {
  // ドメインモデルが現在時刻に依存してるのは良くない気がするが、一旦忘れてください...
    return new Date() > this.trialEndsAt 
  }
}

コンポジションによって行われるなら、かれらが共通のイデアを持つということは、それぞれの実装が共通のインタフェースに依存する、という形で示される。

//コンポジション風味
interface UserIdentity {
 id: UserId
}
interface UserTier {
  badge(): string
}
interface PostPermission {
  canPost(): boolean
}

// これをみんなで実装する
interface UserRole extends HasUserId, UserTier, PostPermission {}
// 具体的な実装
class VipUserRole implements UserRole {
  constructor(public readonly id: string) {}

  badge(): string {
    return "VIP"
  }

  canPost(): boolean {
    return true
  }
}

class TrialUserRole implements UserRole {
  constructor(
    public readonly id: string,
    private readonly trialEndsAt: Date
  ) {}

  badge(): string {
    return "TRIAL"
  }

  canPost(): boolean {
    return new Date() > this.trialEndsAt
  }
}

レイヤー間の依存関係の明示

依存性逆転の法則を実装するのに使う。これは往々にしてレイヤー間の処理に使われて、インタフェースがどちらで定義されているかでレイヤー間の依存性がわかる。

無論これは非常に単純化した話で、それだけで依存性がわかるほどシンプルなコードは少ないとはいえ、誰のワガママが表現されているのか(フロントかバックか?DomainかRepositoryか?)を読み取れるとコードリーディングがスムーズになりそうだ。

// application/usecases/GetPostUseCase.ts
export interface GetPostResult  {
  postId: string
  body: string
  authorId: string
}
export class GetPostUseCase {
  ...
}
// presentation/api/mappers/toPostResponse.ts
// こういうコードがあったら、Presentation層の事情にuseCaseが合わせているんだな、とわかる
import type { GetPostResult } from "../../../application/usecases/GetPostUseCase"

export function toPostResponse(input: {
  post: GetPostResult
  authorDisplayName: string
}): PostResponse {
  return {
    id: input.post.postId,
    body: input.post.body,
    authorDisplayName: input.authorDisplayName,
  }
}

抽象に依存させよ(https://speakerdeck.com/akinoriakatsuka/ditutenandakanan-sii-yi-cun-toiugai-nian-wo-shi-ushi-wareru-toiuyan-xie-dezheng-li-siyou)

命名による責任の明示

PythonのdataClassなど。上2つとは少し毛色が違う。上記2つは「抽象的である(=具体的な実装を持たない)」という性質を利用しているのに対し、こちらは「名前を持っている」という性質を利用している。

interface NotificationPayload {
  userId: string
  title: string
  body: string
}

function sendNotification(payload: NotificationPayload) {
  // ...
}

データや処理のまとまりに名前をつけたいときに、無名オブジェクトや位置引数の代わりに、ラベルシールを貼るような気持ちでinterfaceを導入するときがあるということ。(Classもこの用法で使われることが少なくないだろう) TypeScriptはinterfaceとtypeのどちらもこの用法が用いられる印象がある。

【何?】z.aiのGLM Coding PlanでClaude Codeのバックエンドを差し替えてみよう

3ヶ月8ドルの謎のAI、GLM-4.7を契約した。

z.ai

オープンウエイトモデルとしてはかなり頑張っていて、公式によれば一部ベンチではClaude Sonnet 4.5 を超えているそうだ。実際に使ってみても、日常的なコードライティングや資料整理には十分使える性能をしていると思う。対話型モードだとたまに中国語を喋ってしまうのが玉にキズだが、まあコーディング専門と割り切ったらよい。

現在はお試しキャンペーン中なのか、OpenCodeから無料で利用できるが、公式APIを契約すればClaude Codeのバックエンドとして使える(!?)という記述があったので、契約して試してみる。 繰り返しになるが、今なら割引が効いて3ヶ月8.1ドル。割引なしでも月6ドルだ。Rate LimitもClaude Codeの5倍あるというので安心。安すぎないか?

やってみる

参考にするのは以下のドキュメント。

Claude Code - Overview - Z.AI DEVELOPER DOCUMENT

専用のCLI・Coding Helperが公開されているので、これを使う。

npx @z_ai/coding-helper

もろもろの設定が済むとメニュー画面に行ける。

APIキーなどを入力した後の、Coding Helperの画面

ここでCoding Tool→Claude Codeを選択。Apply Configuration を選ぶ。

Claude Codeを選択したときのメニュー

この状態でClaude Codeを選択し、/statusをしてみると、なんとAntropic Base URL が z.ai のものに差し替わっている!怖…

z.aiに接続したClaude Codeの画面

この状態のClaude Code(中身はz.ai)にモデル名を聞くと、私は Claude Sonnet 4.5 です と返ってくる。通常のAPI利用ではGLM-4.7を名乗るにもかかわらずだ。ここが一番怖い。(Claude用に何らかの追加プロンプトがなされているのだろうが、モデルの自我まで書き換えるのはすごい徹底ぶりだ)

しくみ

何が起こっているのかというと、~/.claude/settings.jsonを書き換えて、ANTHROPIC_BASE_URLを変更している。(coding-helperを使わず、直接設定を変更する方法も紹介されていた) ここのAPIスキーマさえあっていれば、Claude Codeそのもののエンドポイントでなくても動作する、ということなのだろう。調べてみるとClaude Code Routerという形でオープンソース化されているようだった。

最近では、OpenRouterもClaude Code形式のAPIに対応したので、世の大抵のモデルがClaude Codeで動かせる状態になっている。

感想

全体的に不気味だし、お行儀が良くない気もするが、ともかく動くものは動く。VSCode拡張も動作しているようで、少し対話してからZ.aiのUsageを見るとしっかり加算されていた。だいぶ酷使しているが、いっこうにRate Limitに到達する気配はない。

Claude Codeと併用できないので、仮にz.aiの利用許可が降りたとしても業務では利用しないだろうが、コストの安さから個人開発用途としては非常に良さそう。

1ヶ月6ドル、3ヶ月では8.1ドルのセール中なので、CodexやCursorは高いなと感じている人はぜひ使ってみてほしい。

(以下のリンクは招待リンクです) z.ai

指定回数の連打で反応するReactカスタムフックを作って、npmに公開した

謎解きイベントでタブレットが渡されたとき、そのアプリには、たいていスタッフ専用画面というやつがある。そしてそれは、画面のどこかしらを連打することで開く。 指定した条件を満たしたり、バグって変になったときに、ゲーム体験を損なわずに管理画面を開けるようにするくふうだ。

これを実装したいときがあったが、ちょうどいいユーティリティがなかったので作った。既存のプロジェクト用に作成していたものを、単一のモジュールとして切り出した感じ。さらに勢いでnpmにリリースしたぞ!

https://www.npmjs.com/package/use-mashing

バンドラはtsup。なんとシンプルで便利なことか!仕事で使っていたバンドラなのに、便利さには自分が使ってみるまで気づけないものだ。 一方package.jsonのなんと複雑なことか!どのフィールドが必要でどれが不要なのか、まだ全然わかっていない。

作成やリリースに当たっては、以下の記事がすごく参考になった。一度やっただけでは流石に覚えられないので、これからも何度も参照することになりそう。(1.0.0をリリースしてから読んだので、0.1.0から始めるべしという教えを守れなかった。無念)

qiita.com qiita.com

npmパッケージって気軽にリリースできるんだ。人生の実績を解除したような嬉しさがある。