KRAZY感情TEXTYLE

"くれいじー かんじよう てきしたいる" と読みます

inkwellにPR投げてマージされた

inkwellって何

RustのLLVMバインディングです、IRをいい感じに吐き出すと思います。*1

該当のPR

Refactor: use matches! in is_xxx functions instead of if-let expression. by Krout0n · Pull Request #232 · TheDan64/inkwell · GitHub

*1: まだ使ったことなくて、調べごとでコードリーディングをしたら見つけた

続きを読む

また serde-rs/json にPR投げてmergeされたので Value::pointer / Iterator::try_fold のおすすめメソッド2選についてメモ

また?

前回のです serde-rs/json にPR投げてmergeされた - KRAZY感情STYLE

今回のPR

github.com

Value::pointer とは

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を使っていました、偉い。

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してくれるっぽいです。

総括

ドキュメントにこんな乱文よりいい感じの説明があるので読みましょう

serde-rs/json にPR投げてmergeされた

serde-rs/jsonって何

Rustで言うJSONを扱うライブラリの中で一番勢いあるやつ

実際のPR

一発mergeされて嬉しかった github.com

経緯

  • RFC 6902 - JavaScript Object Notation (JSON) Patch を読んで実装したくなる
  • 中のMapがEntryをサポートしてることに気づく
  • 標準ライブラリではEntry::and_modify がサポートされてるがserde-rs/jsonでは無い事に気づく
  • いきなりPR投げてmergeされる
  • RFC6902の実装がめんどくなる <- イマココ!!

所感

OSSにPR投げる時ってギョームで「こういうutil関数あったら便利じゃん!」って言って気軽に投げるノリで投げて良さそう、てかギョームじゃん

VSCode commit欄 日本語入力できない 解決方法 2021年2月 【今すぐアプデ】

追記: 2021/2/5 15:20

今朝アップデートが来て、version 1.53.0 にてこのバグが修正されました。下に示した部分からアップデートを行うと良さそうです。 f:id:Krouton:20210205152451p:plain f:id:Krouton:20210205152152p:plain

どんな症状?

https://user-images.githubusercontent.com/9622730/102298257-27c71400-3f94-11eb-8626-17671a78d07c.gif

このようにCJK Characters*1を打つと固まる

github.com

この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. らしいです知らなかった

ReactのContextを使ってログイン/ログアウトするだけのSPAを作った

昨日の記事なんですけもう少しContextのありがたみをがありそうな題材としてログインする例を考えた。 krazy.tokinia.me

ソースコードとか所感

github.com

gyazo.com

こんな感じに動く。ここからアプリが大きくなるとこのContextでやってるありがたみが大きくなるんだろうなぁ、みつを。

実装してて思ったんですけど useUserContextUserProvider って別に定義して分けた方が良さそうとか思ったのでやったけど実際筋いいんですかね、わからない...。まあでも .tsx ってついてたら「ああ、君はきっとコンポーネントとそのPropsの型が入ってるんだろうなぁ」となるしそれだけであってほしい気もするから実装者1人のオリチャーということでここは1つ。

参考にした

雰囲気でReactのContextをstateを使っていじるやつを実装した

ReactのContext周りで何もわからんとなったので手元でシュッと作った、本当はNetlifyとかでデプロイしたかったけど $ yarn build で怒られて直すのも面倒だったのでもういいや

gyazo.com

> Build error occurred
Error: Build optimization failed: found pages without a React Component as default export in 
pages/context/colorMode
pages/components/Layout

以下のライブラリを雰囲気で使った

  • React
  • Next.js
  • TypeScript

github.com

参考にした

なんか動く目的物ができたのでこれから自分が作ったもののソースコードを読んでいきたいと思います。

30日でできる! OS自作入門 を読むために nasm_of_nask というコンパイラを作った話

この記事は はてなエンジニア Advent Calendar 2020の22日目の記事です。 昨日はid:motemen さんの PCを離れたらマイク音量を下げるmacOSアプリを作った - 詩と創作・思索のひろば でした!

qiita.com

経緯

とこぼしたところ、著者の 川合秀実 (@hkawai3) | Twitter さん*1 を始めとした各種大先生に目をつけられて*2しまい、やらなければ肉体が低レイヤから順に消されると思い読み始めました。

30日でできる! OS自作入門

30日でできる! OS自作入門

しかし、この本の初版は2006年であり時代はフロッピィ〜〜〜〜〜〜から†SSD†なわけで、macOS上で動かすための環境構築はqemuを使ったり、本の中で使われているツールのmacOS版を用意する必要があります。

github.com

このように、以前までは有志が用意をしてくれていたので何とかなっていました。あのOSが出るまでは。

macOS Catalina

macOS Catalinaからついに32ビットアップリが使えなくなりました。これの影響で上記のリポジトリで提供されているnaskを使おうとするとbad CPU type in executableするわけです。

代替手段としてのNASM

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 にコンパイルするだけのめちゃくちゃ簡単なコンパイラ」」」を書けばいいんじゃないか?と思って用意したものがこちらになります。

nasm_of_nask

github.com

最近は趣味でocamllexとmenhirばっか書いてたし、OCamlと仲良くなりたかったので実装言語に選びました。本質っぽいところはここでそれ以外はまんまを吐き出す本当にやるだけのコンパイラです。命名規則OCaml の型変換関数 *6 をリスペクト*7しました!ℒℴѵℯ...

対応状況

対応してる共通部

  • DB
  • DW
  • DD
  • RESB
  • 16進数
  • 10進数
  • 文字列(エスケープ無し)
  • セミコロンを使ったコメント

naskとNASMの差分

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( _ を削除) ×

Future work

  • 対応増やす
  • CIとかでいい感じにバイナリをビルドする
    • これから始める全人類がnaskの代わりにこれとnasmを使うコバンザメ戦法したい

締め

気づいた方は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つあるのに気づいてそっちをやらないと本当にまずい