無駄と文化

実用的ブログ

プログラミング

やってみよう!メモリリーク

メリークリスマス! この記事は はてなエンジニア Advent Calendar 2025 の3日目の記事です。 大遅刻ですね。すごいことですよこれは。 さて、Rust ネタです。 ご存知の通り Rust には GC がありません。代わりに所有権システムがあり、所有権を持つ変数がス…

Grass言語でHello,world!に挑戦

Grass 言語というプログラミング言語があります。 esolangs.org オリジナルの製作者 (UENO Katsuhiro さん) のサイトが2025年1月頃を最後に消えているので参照先が海外の Wiki しかない... 今回は Grass 言語に入門してみます。まずは Hello,world! を表示す…

Hono GraphQL Server Middleware のサンプルコード

Web アプリケーションフレームワークの Hono にはさまざまなミドルウェアが提供されています。その一つが Hono GraphQL Server Middleware で、Hono をベースとした GraphQL サーバーを構築できます。 www.npmjs.com 「よし Hono で GraphQL サーバー書くぞ…

AIエージェントにコードを書かせてみた感想:AIエージェントが訳分からなくならないために人間が訳分かっておく必要がある

先週 に引き続いて AI エージェントにコードを書かせてみた。 テーマとしてとてもとても典型的で既存のコード例がインターネットに溢れていそうな「テトリス」を選定した。 (選定したというか、職場の id:koudenpa さんが「テトリスでも作らせてみなはれ」と…

ココピーからChatGPTを呼んで文章生成させる

ココピー (cocopy) というブラウザ拡張機能がある。 chromewebstore.google.com Webページを見ていて URL やページタイトルなどをコピー&ペーストしたくなったとき、ココピーを使うと思い思いの形式でクリップボードへのコピーができて便利だ。 ココピーに…

色記法を雑に正規化する (#000 とか rgb() とか hsl() とか)

CSS では様々な色記法が認められています。 例えば私が好きなコーンフラワーブルーは、 cornflowerblue #6495ed rgb(100, 149, 237) hsl(218.54, 79%, 66%) hwb(218.54 39% 7%) lab(61.2% 2.4% -40.2%) これらどの記法でも同じ色が表示されます。 ぜんぶ同じ…

要素を入れ替えたときにスクロール位置が追従することがあるみたい

JavaScript を使って画面上の要素を入れ替えたとき、スクロール位置が勝手に動いて画面がカクつくという現象に遭遇しました。調査して分かったことをまとめます。 まずはデモをご覧ください todays-mitsui.github.io カラフルな <div> が並んでいて、右上のボタン</div>…

JavaScript から wasm に文字列を渡す with TinyGo

JavaScript から wasm の関数に文字列を渡して呼び出す方法を書き残します。 この記事は二本立てです 後編はこちら。 blog.mudatobunka.org 前後編のコードを全部まとめたリポジトリがここにあります。 github.com 前提知識 wasm に文字列型は無い wasm で扱…

wasm から JavaScript に文字列を受け取る with TinyGo

JavaScript から wasm の関数を呼び出して結果の文字列を受け取る方法を書き残します。 この記事は二本立てです 前編はこちら。 blog.mudatobunka.org 前後編のコードを全部まとめたリポジトリがここにあります。 github.com 前提知識 まずは 前の記事 にも…

React のリアクティブと SolidJS のリアクティブ

React と SolidJS のリアクティブシステムがそれぞれ対照的で面白い。React は冪等性を前提にしていて SolidJS は副作用を前提にしている。真逆だ。詳しく見てみよう。 3行まとめ React は冪等で純粋なコンポーネントをベースにしている、副作用はバーチャル…

wasm-bindgen で「この型が欲しいときはこう書く」集

この記事は Rust Advent Calendar 2024 の 8日目の記事です。 wasm-bindgen で wasm に型を付ける Rust は wasm にコンパイルできるよう意図された言語でもあります。Rust コードを wasm にコンパイルしてしまえば、ブラウザをはじめとした wasm ランタイム…

不動点コンビネータで無名再帰を作る流れをおさらい with JavaScript

この記事は はてなエンジニア Advent Calendar 2024 の 2 日目の記事です。 昨日は id:hogashi さんの「querySelectorAllの結果をmapしたいときはArray.fromすると良い」でした。 どうも、趣味で関数型言語をやっている者です。 長らく関数型言語をやってな…

Array.prototype.includes と Set.prototype.has の速さ比べ

配列がとある要素を含むかどうか調べるには Array.prototype.includes を使います。 const arr = [1, 2, 4, 8, 16]; arr.includes(4); // => true arr.includes(7); // => false ところで、JavaScript には Set というデータ型があり、同じように Set.protot…

Vitest を使って wasm のテストを書く

wasm-bindgen で生成したコードに対してテストを書くときの話題です。 Rust からコンパイルした wasm に対してテストを書くとき wasm-bindgen-test がおすすめされがちです。 wasm-bindgen-test は Rust でテストを書き wasm にコンパイルして実行します。た…

wasm-bindgen で Record<Keys, Type> 型を取り扱う

wasm-bindgen を使うと Rust の構造体から TypeScript の型情報を生成して wasm で受け渡しできるようになる。 やるべきことは #[wasm_bindgen] 属性をつけるだけで、wasm-bindgen がよしなにしてくれる。 // Rust use wasm_bindgen::prelude::*; #[wasm_bin…

wasm-bindgen の型情報を Tsify でもっと良い感じにする

wasm-bindgen では Rust に組み込みの型だけでなくユーザーが定義した型を関数の引数・返り値に使うことができます。 例えば下記のように User 構造体を定義して、 // Rust #[wasm_bindgen(getter_with_clone)] pub struct User { pub name: String, pub age…

【wasm-bindgen】いろいろな型注釈による wasm の挙動の違いを調べよう

Rust で wasm を書くときの話題です。 Rust で書いたプログラムは wasm にコンパイルすることが可能です。さらに wasm-bindgen を使うと JavaScript から呼び出しやすいインターフェースを自動生成してくれます。 例えば下記のようなコードを書くと、 // Rus…

JavaScript で Hello,world! に挑戦 (ただし記号だけを使って)

どうも、趣味で JavaScript を書いている三井です。 先日、 JavaScript つまみ食い LT 会 というイベントを主催しまして。 そのメインの LT 会後の懇親会で「懇親会 LT」と銘打ったゆるゆる LT をやりました。 私も参加して「JavaScript で Hello,world! に…

指定したキーだけを省略可能にするユーティリティタイプを書く

TypeScript は便利だ。型検査で値が保証されるのはとても頼もしい。 とはいえ場合によっては型検査を通すために不必要にタイプ量が増えてしまうことがある。 例えば下記のような型が 外部ライブラリによって生成される としよう。 type User = { __typename:…

型無しラムダ計算学習用ステップ評価器 skiMogul を作っている話

みなさま ラムダ計算 をご存知でしょうか。 ラムダ計算はある種の関数型プログラミング言語の体系で、変数と関数, そして関数適用というミニマルな構成要素だけでチューリング完全な表現力を持っています。 この記事では、ラムダ計算の中でも特に単純な 型無…

Rust はコストのかかるコードを書くのが苦痛になるようにデザインされている(?)

Rust は「コストのかかるコードは書くのが苦痛であるべき」という思想のもとデザインされている気がする。 というのも Rust を書いていると「意図的にショートカットが用意されていない」と思える場面があるからだ。 いくつか例を挙げてみようと思う。 文字…

Perl と Rust

どうも id:todays_mitsui です。この記事は はてなエンジニア Advent Calendar 2023 の23日目の記事です。 昨日は id:cateiru さん、明日は id:motemen さんです。 『達人プログラマー』という有名な書籍があって、そのなかで毎年少なくとも一つの言語を学習…

JavaScript で関数とクラスを見分ける

JavaScript においては typeof や constructor を参照するだけでは関数と class を見分けることができません。 // ただの関数 function myFunction() {} // class class MyClass {} // typeof では見分けられない typeof myFunction; // => 'function' typeo…

substr のマジカルな挙動を再現したい

Perl に substr という関数があります。文字列を部分的に切り出したり、部分的に置換できる関数です。 典型的な使い方はこんな感じ、 my $s = 'The black cat climbed the green tree'; # 4文字読み飛ばしてから5文字取り出す my $color = substr $s, 4, 5; …

JavaScript実行済みのDOMをHTMLファイルとして保存するブックマークレット

スクレイピングネタです。 クローリング+スクレイピングするにあたってパスワード認証の掛かったページから情報を取得するのはなかなかに厄介な課題ですよね。 今回は、いま表示しているページをHTMLとして保存するスクリプトをブックマークレットにしてみま…