無駄と文化

実用的ブログ

2024-01-01から1年間の記事一覧

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…

Tsify には予約された型名がある

tsify-next を使っていると特定の型名に対して想定していない型情報が生成されることがあります。 例えば Path, Range, Cow などがそうです。 // Rust pub struct Path { b: bool, s: String, } #[derive(Tsify)] pub struct Range<T> { _t: T, b: bool, s: Str</t>…

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…

めっちゃ歩く旅【福岡市西区→佐賀県唐津市】

9月末に福岡市の九大学研都市駅から佐賀県の唐津駅まで徒歩で移動する旅行をしました。ここに書き記します。 道のり ざっくり 福岡市→糸島市→唐津市 をまたぐ道のりです。 全長36.7kmと表示されていますが、実際には42kmほどあります。(騙された) 九大学研都…

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

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

OpenID Connect で GitHub Actions から AWS のリソースにアクセスする

GitHub Actions から AWS などのリソースに安全にアクセスするためには OIDC (OpenID Connect) という仕組みを利用します。 ...ということを見聞きしてさらっと知ってはいたのですが、自分で一通りの設定をなぞってやったことはなかったのでやってみます。 …

"酸素が見えるようになる" ことについて

"酸素" という物質が在る。 大気中に21%ほど含まれていて、無色透明で無味無臭。直接見たり嗅いだりできない。 ほとんどの成人は身の回りに酸素が在ることを知っているだろう。 呼吸ができるのも火が燃えるのも酸素が在るおかげだと知っている。 目や鼻で直…

PHPカンファレンス福岡2024にスタッフとして参加してきました

6月22日に開催された PHP カンファレンス福岡2024にスタッフとして参加していました。(1年ぶり2回目) 3行まとめ 私の地元福岡で無事にカンファレンスが開催され、参加者が喜んでくれて嬉しいです PHP カンファレンス福岡2024とは phpcon.fukuoka.jp 基本は P…

WordPress でピクロスを作問・投稿できるカスタムブロックを作った

ピクロスというパズルをご存知でしょうか。お絵描きロジック, ののぐらむ などとも呼ばれる、縦横に並んだ数字をヒントにドット絵を完成させるパズルゲームです。 WordPress でピクロスを作問・投稿するためのカスタムブロック wp-block-nonogram を作成した…

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

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

毎年3日間だけ花粉症に罹っている【定点観測】

ここ数年、春先に鼻炎になる。「花粉症か」「自分にもついに来たか」と思って薬を飲むのだが3日ほどすると治っている。そんなことが続くので冗談めかして「毎年3日間だけ花粉症になるんです」などと言っていた。 2024年、今年も花粉症の季節がやってきた。 …

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

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

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

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

二重数を使って2階微分を計算する方法 と 超二重数への発展

二重数という数があります。「その数自体は0でないのに2乗すると0になる数」のことを二重数と呼びます。 実数の範囲で を満たす は のみなので、 でかつ となるような数があるならばそれは 実数ではない ということになります。 そのような実数ではない数 の…

ラムダ式に含まれる全ての部分式に一意かつ列挙可能なタグを付与する方法

ラムダ式に含まれる全ての部分式に一意かつ列挙可能なタグを付与する方法について考察する。 導入 例として次のラムダ式について考える。 ````ABC``DEF`GH この式を二分木で書くと以下のようになる。 graph TB; a1((app))---a2((app)) a2((app))---a3((app))…