inkwellって何
RustのLLVMバインディングです、IRをいい感じに吐き出すと思います。*1
該当のPR
*1: まだ使ったことなくて、調べごとでコードリーディングをしたら見つけた
前回のです serde-rs/json にPR投げてmergeされた - KRAZY感情STYLE
pointer を使わずに obj[x][y]
を取ってくる例を考えてみます
use serde_json::{Value, json}; let obj = json!({"x": {"y": 1}}); let value = if let Value::Object(obj) = obj { let x = obj.get("x"); if let Some(Value::Object(child_obj)) = x { child_obj.get("y") } else { None } } else { None }; assert_eq!(value, Some(json!(1)));
こんな感じにわざわざ enum のvariantを剥がす処理を何度も書きます、地獄ですね。Value::pointer を使うと
use serde_json::{Value, json}; let obj = json!({"x": {"y": 1}}); assert_eq!(obj.pointer("/x/y"), Some(json!(1)));
このようにネストしたオブジェクトでもシュッと取ってこれます。前回PRを投げるきっかけになったRFC*1で記述されているpathと同じ記法*2で取ってくることができます。便利。 このメソッドに気づかずに自作しようと思ったのですが、上手く実装できなかったので同様のRFCを実装しているリポジトリ*3 を見たらこのValue::pointerを使っていました、偉い。
自作できなかったのは心に来たので実装を読みました。最初実装に失敗した時は Iterator::fold を使おうとして失敗してたのですがforループで実装されていたので「ア〜〜〜〜」となりました。でもfold でもできそうな気がしたのでやったらできました、高階関数?関数型?に圧倒的感謝! しかし、fold だと /a/b/c/d/e/f/g/h/i
みたいなケースで /a
がなくても /b/c
などを見に行きます、これが1万個のネストしたキーとかだったら辛いですね。 そこでIterator::try_fold
を使うといい感じにearly-returnしてくれるっぽいです。
ドキュメントにこんな乱文よりいい感じの説明があるので読みましょう
Rustで言うJSONを扱うライブラリの中で一番勢いあるやつ
一発mergeされて嬉しかった github.com
Entry::and_modify
がサポートされてるがserde-rs/jsonでは無い事に気づくOSSにPR投げる時ってギョームで「こういうutil関数あったら便利じゃん!」って言って気軽に投げるノリで投げて良さそう、てかギョームじゃん
今朝アップデートが来て、version 1.53.0 にてこのバグが修正されました。下に示した部分からアップデートを行うと良さそうです。
このようにCJK Characters*1を打つと固まる
このIssueからGIFを拝借してきました
Insiders 向けの Download Visual Studio Code Insiders VSCodeでは治ってるっぽいのでそれを使う。
It will become available in VS Code Stable at the beginning of February.
と書かれているので2月頭まで待ちましょう。
https://github.com/microsoft/vscode/issues/112621#issuecomment-759538081
*1: In internationalization, CJK characters is a collective term for the Chinese, Japanese, and Korean languages, all of which include Chinese characters and derivatives in their writing systems, sometimes paired with other scripts. らしいです知らなかった
昨日の記事なんですけもう少しContextのありがたみをがありそうな題材としてログインする例を考えた。 krazy.tokinia.me
こんな感じに動く。ここからアプリが大きくなるとこのContextでやってるありがたみが大きくなるんだろうなぁ、みつを。
実装してて思ったんですけど useUserContext
と UserProvider
って別に定義して分けた方が良さそうとか思ったのでやったけど実際筋いいんですかね、わからない...。まあでも .tsx
ってついてたら「ああ、君はきっとコンポーネントとそのPropsの型が入ってるんだろうなぁ」となるしそれだけであってほしい気もするから実装者1人のオリチャーということでここは1つ。
ReactのContext周りで何もわからんとなったので手元でシュッと作った、本当はNetlifyとかでデプロイしたかったけど $ yarn build
で怒られて直すのも面倒だったのでもういいや
> Build error occurred Error: Build optimization failed: found pages without a React Component as default export in pages/context/colorMode pages/components/Layout
以下のライブラリを雰囲気で使った
なんか動く目的物ができたのでこれから自分が作ったもののソースコードを読んでいきたいと思います。
この記事は はてなエンジニア Advent Calendar 2020の22日目の記事です。 昨日はid:motemen さんの PCを離れたらマイク音量を下げるmacOSアプリを作った - 詩と創作・思索のひろば でした!
とこぼしたところ、著者の 川合秀実 (@hkawai3) | Twitter さん*1 を始めとした各種大先生に目をつけられて*2しまい、やらなければ肉体が低レイヤから順に消されると思い読み始めました。一ヶ月に一回、自分の知的好奇心を満たすのは自作OSなんじゃないかなって思う時があるんですけど最近その頻度が早まってきた
— この人生が裏目りやすい!2021 (@Krout0n) 2020年12月17日
しかし、この本の初版は2006年であり時代はフロッピィ〜〜〜〜〜〜から†SSD†なわけで、macOS上で動かすための環境構築はqemuを使ったり、本の中で使われているツールのmacOS版を用意する必要があります。
このように、以前までは有志が用意をしてくれていたので何とかなっていました。あのOSが出るまでは。
macOS Catalinaからついに32ビットアップリが使えなくなりました。これの影響で上記のリポジトリで提供されているnaskを使おうとするとbad CPU type in executableするわけです。
naskの代替手段としてはNASMを使ったりすると良いらしいです。しかし、naskとNASMはコンパチではないのでいくつかサンプルコードを修正する必要があります。
『30日でできる!OS自作入門』を macOS Catalina で実行する - Qiita から修正する表を引用したものがこちらです。
nask | NASM |
---|---|
RESB 18 | TIMES 18 DB 0 |
RESB 0x7dfe-$ | TIMES 0x1fe-(−−$) DB 0 |
ALIGNB 16 | ALIGN 16, DB 0 |
[FORMAT "WCOFF"] | この行削除 |
[INSTRSET "i486p"] | この行削除 |
[FILE "naskfunc.nas"] | この行削除 |
[FORMAT "WCOFF"] | この行削除 |
JMP entry | JMP SHORT entry |
_io_hlt( _ の付くもの) | io_hlt( _ を削除) |
な〜〜〜んだこれだけなんだ!簡単ですね!!!
この表を一々頭に覚えるのはめんどくさい、めんどくさいですよね?*3いっそのことnaskを作り直すのもいい*4が、多分その時間でこの本読み切れるな、という葛藤がありました。そこで僕なりのアプローチとして 「「「nask のコンパイリ*5を受け取って NASM にコンパイルするだけのめちゃくちゃ簡単なコンパイラ」」」を書けばいいんじゃないか?と思って用意したものがこちらになります。
最近は趣味でocamllexとmenhirばっか書いてたし、OCamlと仲良くなりたかったので実装言語に選びました。本質っぽいところはここでそれ以外はまんまを吐き出す本当にやるだけのコンパイラです。命名規則は OCaml の型変換関数 *6 をリスペクト*7しました!ℒℴѵℯ...
nask | NASM | 対応してる? |
---|---|---|
RESB 18 | TIMES 18 DB 0 | ○ |
RESB 0x7dfe-$ | TIMES 0x1fe-(−−$) DB 0 | ○ |
ALIGNB 16 | ALIGN 16, DB 0 | × |
[FORMAT "WCOFF"] | この行削除 | × |
[INSTRSET "i486p"] | この行削除 | × |
[FILE "naskfunc.nas"] | この行削除 | × |
[FORMAT "WCOFF"] | この行削除 | × |
JMP entry | JMP SHORT entry | × |
_io_hlt( _ の付くもの) | io_hlt( _ を削除) | × |
気づいた方は5000人ぐらいいらっしゃるとは思いますが、id:Krouton は1日目で出てくる差分しかやっていません。何故かと言えばまだ1日目しか読んでない*8からです!ガハハ!
オチもついたところで解散とします!明日の担当はid:pokutunaさんです!!
*1: 川合さんへ: 1年以上関わりがあるのにずっと読む読む詐欺しててすみません!!!!!
*2: ふぁぼられただけです、所でふぁぼって死語ですか?
*3: この記事書いてから気づいたんですけど、そんなに多くないな...
*4: DB命令だけ使えるnaskなら書けそう
*5: この人生が裏目りやすい!2021 on Twitter: "caller-callee-callの関係を考えればコンパイラ-コンパイリ-コンパイルの関係も自明"
*6:OCamlプリミティブな型変換関数は to_of_from といった命名規則が多い。例えば int から char だったら char_of_int みたいな
*7: 世の中にはOCaml から JSを吐く処理系もある GitHub - ocsigen/js_of_ocaml: Compiler from OCaml to Javascript.
*8: 参加してる読書会が2つあるのに気づいてそっちをやらないと本当にまずい