近況
家庭しまくっていて全然書いていない。
春は基本的に毎年子が新環境へデプロイされるので障害対応で忙しい。 夏は夏で子の夏季休業があり育児に対し家事労働力を配分せねばならず忙しい。旅行に行くと基本的には育児以外の家事の大部分をアウトソース出来るのでみんな旅行に行くんだな、というのが実感を持ってわかるようになった。 子も育ち、家庭の資源を子が自分で利用出来るようになってきた。一方今まである程度親で占有出来ていた資源をめぐり子との衝突が増えてもいる。 基本的に協議してルールを作って対応をしたり、衝突を避けるよう環境を改善している。 ルールについては実効性がないものを取りやめたり作り直したりしている。 すごくかんたんなルールにしないと守れない。 覚えきれないような複雑なルールの場合、文書として残すようにしている。 電子化しているが、子へのアクセシビリティが低いのでもう少し読み書きが出来るようになれば改めたい。 基本的に大人と同じように子ども個人のものを少しずつ増やしていっている。 最近だと子どものGoogleアカウントを作った。一緒にはんこ屋へ行きはんこを作ったり、銀行口座を作ったり、財布を持たせたり、💰の教育を少しずつだけどはじめた。
カンファレンスに顔を出す機会が9月、10月と続いた(聞くだけ)。 Web Componentsの話を聞いたりHypermediaの話を聞く機会があったので雑に試したりしていた。 Cloudflareのplaygroundまじで便利で なるほどという感じ。 template要素だとslotで要素をスポっとできても属性をスポっとできないのでJSXと比べるとそこがまだまだ便利そうな感じ。JSONをいい感じにスポっと入れる規約みたいなのがあればいけるかもしれない。
オブジェクトに対応した枠がある、全部返すけど関係のある枠の中身だけ書き換える、的な感じに見えてOOUI的なデザインしないとうまくハマらないんだろうな、オブジェクト見つけ力というかリソース名付け力というかそういうのが必要そうだな〜とHandbook読んでいて思った。 turbo.hotwired.dev
はい
文科省学校コードRailsでバリデーションをするgem書いた
文科省学校コードをRailsアプリケーションでバリデーションするときに便利なmext_school_code_validator gemを作った。
使い方はこう
class School include ActiveModel::API attr_accessor :mext_school_code validates :mext_school_code, mext_school_code: true end
はい。
春、近況
いかがおすごしでしょうか
Okinawa.rb参加
久しぶりに参加した。
第224回 Okinawa.rb Meetup @ CODEBASE OKINAWA 宜野湾 - Okinawa Ruby User Group (Okinawa.rb) | Doorkeeper
たのしかった (語彙)
コミュニティ活動
かなりサボっているのでそろそろまた気合...
コロナ、あと子を言い訳にしてやらないがちだったのでやっていきたい
Turnip 4.4.0でシナリオアウトラインにタグをつけていても空になってしまう
仕事で踏んだので凄く雑に修正PRを投げた
Turnip 4.3.0メモリ食いすぎissue
パース後のデータをコピーするためだけにMarshal.dump
してMarshal.load
しているんだけど破壊的変更を行わないのであればそもそもコピー不要そうなのと、コピーするにしても必要なデータのみに絞れば減りそうな気はするが、実験できていない
wasmでbitclust
アイデアを出して雑にファイルシステムに既存のものを梱包するところまでは行って、そこから先をやっていない><
やはり書き込み先があるとよさそうなんだけどどうするといいんだろうな
File.read / File.writeやIO周りの諸々を期待する動作が行えるまでstubしていくといいんだろうか どのメソッドからWASIのABIで埋められてない部分を呼ぶのか確認して雑にFile.readとかをRuby界でワイルドに上書きしてもよさそうだな〜とおもった(小並感)
Markdown化の話を全く追えておらず何か影響あるか考えていたが
- MarkdownであればJavaScriptからも取り扱えそう
- でもまあMarkdown -> Rubyのオブジェクト、という感じならMarkdownを変換したRubyのオブジェクト <-> JavaScriptと繋げられれば便利そうなのはかわらないかな
みたいな感想
とはいえ
週5で朝の支度や送りをしつつ帰宅後のお風呂やらご飯の用意やら土日に子と過ごすのをやっていると時間、無限に👋される (それはそれで子が親をこんなにかかわらせてくれるのは今のうちかな、と思って甘受している)
学校に行く前に公園に行きたい・お天道様の下でピクニックしながら朝食をとりたい、みたいな要求を満たして買食いして公園で食うみたいなのを週に数回ぐらいやっているがそういうところかもしれない
楽しいではある
近況
コード実行
前回: ✅ 雑にスクリプトを書くと動くことを確認できた
「サンプルコードをブラウザ上で試せるようにしたい」のようなissueをたてろ、という感じですが
- WASM版のバージョンとRubyのバージョンの対応がわからない
- まだRuby 3.2出てないので対応つけるもなにもない
- ブラウザで動くのはある時点のheadという感じ
- npmのパッケージの番号をlatest指定すればよさそうではある
- 3.1のサンプルコードに実行ボタンみたいなものをつけると3.2で挙動が変わるような3.1のコードを実行したときに意図しない結果が返るかもしれない
- ストーリーとしてはサンプルコード試してみたあと、書き換えてみてどうなるか試したい、という使い方があると思う
- このへんを全部ぽいっと丸投げするためにTry Ruby上にコードを渡すみたいな感じが出来ればいいんじゃないか...?
- Copy URLするとURLがコピー出来る
- このURLを生成しているコードをよんでいた
- Try Rubyに丸投げであればバージョン云々の気配りをしなくてもよくなるかもしれない
- issueたて...たて
るりま
めちゃくちゃPRマージされていてznzさん凄い
ちょっと最近出来ていないので、何が出来るかな〜と考えていてこのissueを眺めていた
雑な理解をまとめると
- 見出しにはアンカーを書くための記法が用意されている
- 例:
===[a:a] あ
で見出し「あ」のid属性にa
を指定
- 例:
[[ref:d:glossary#a]]
のような形で「あ」という見出しの用語集へのリンクを書ける- rdのソースコードからこの見出しのアンカーを抜き出してくる処理は
RefsDatabase
が行っている - 用語集は用語の音の見出しの直後にdlistで用語が定義されている
- dlistの記法では見出しと違ってdtにidを振る記法はない
どうするといいのかな。
- 同一のrdの中で同じ用語について別の説明をつけることはない
- ユーザーはHTML5に対応しているブラウザを利用している
というのを前提条件にして用語から空白をgsubした値をid属性に勝手に設定してやってもいいかもしれない
RefsDatabase#extract
と RDCompiler#dt
あたりを更新したらできそうなので今晩やってみるか〜
近況: RubyのWASM対応べんりそうなので、るりまにRUNボタンつける実装を試していた
何があると便利かな〜?と思って考えたけど思いつかなかったので一番手頃そうな、るりまにRUNボタンをくっつけるのを週末試していた。
RubyのWASM対応便利そう...✨💎✨
— 🐝 (@hanachin_) 2022年7月3日
るりまにRUNボタン...💡(お試し🔧)https://t.co/QcwUP6IcbB pic.twitter.com/AmBlgopUwn
Pull Request出すかは未定。
あったら便利な気がするけども...?
latestバージョン様限定機能みたいな感じならいいかも、しらんけど。
近況
登園準備
保育園に持っていくお着替え2セットとその日着る服と歯磨き用品、朝身支度をする間に用意するのは自分には難しいので
以下3点を5つ作り置きすることにした。
- お着替え2セットが入った袋
- 歯磨き用品が入った袋
- その日着る服
これによって朝行うのが
- 持っていくお洋服を2セット用意する
- シャツを用意する
- ズボンを用意する
- 靴下を1組用意する
- なお前日に着替えていない洋服がある場合は足りないぶんを補充するため確認する
- 歯磨き用品を用意する
- 前日使ったコップがあれば出して洗う
- 歯ブラシも洗う
- 歯磨き粉を洗う
- 前日使ったであろう歯ブラシを学校に忘れてきた場合、コップ・歯ブラシ・歯磨き粉を1セット用意する
- その日着る服を持っていくお洋服同様用意する
- 水筒を用意する
から
- その曜日のお洋服セットを入れる
- その曜日の歯磨き用品を入れる
- その曜日の着る洋服セットを取り出す
- 水筒を用意する
に減る
前日の残りを考慮する部分と、歯ブラシの衛生を保つ部分と、靴下を1組用意する部分は特に難しいのでこれを考慮しないでよくなった。 他、水筒についても替えの水筒を前日に用意する、用意されていなければ朝用意する、という感じでだいぶ難しいので5セット用意したほうがいいかもしれない。 リュックサックを5セットはやらない予定でいたが、やったほうが災害時に逃げ出す際に便利かもしれない。(平日であれば子供のリュックサックを何個か持つだけで子どものぶんの衣料は秒で確保できる)
「この袋はいつの袋だっけ?」が発生すると思うので曜日がわかりやすくなるような工夫をする。
靴下に関してはたとえ朝だろうが前日だろうが週末だろうが、組を用意する際に柄合わせをすると大変なので、無印良品で1日3足想定で、計15足を用意した。 使っててたりなくなったぶんぐらいは探してもいいかなあ(3足ぐらいかけたら多分補充する) 西松屋などに行くと可愛い靴下があるけど、15足揃えようとすると店舗に15足も同じ靴下があることはまれなので、供給が安定していて家から買い足しに行きやすい無印良品で揃えることにした。
歯磨き用品のコップを何にしようか迷っている
- 食洗機可能は必要
- プラスチック(割れない)
- かけたりなくしたりするのを織り込んで同じ形の製品が手軽に入手できる必要がある
- スタック可能だとよい
- 取っ手がついているとなおよい
- 子供が扱いやすいサイズだとよい
スケーターあたりの食洗機対応にすると、子供向けの図柄が載っていて、交換の部品もたくさんあって、便利そう。スタックできなさそう以外は完璧。 スタックのことを考えると大人の食事用のコップになるが、スタック可能かつ取っ手がついているかつ樹脂製かつ子供が扱いやすいサイズ、あんまりなさそう。 探して買う。
寄付
log4j2の件もあったしApache Software Fundationに寄付をした
log4j2の件もあったしApache Software Fundationにone-time Donationした✌https://t.co/O368F87mhw
— 🐝 (@hanachin_) December 14, 2021
今年Ruby Associationに💴し忘れていたのでそちらも申し込みをした
るりまのRDファイルをJSONに変換する
前回
bitclust server
コマンドにオプションを追加し、GraphQLの口を作った
https://github.com/hanachin/bitclust/tree/graphql
こう --graphql
オプションを渡すとGraphQLが生える
% bundle exec bitclust server --debug --port=4567 --auto --baseurl=http://localhost:4567/ --graphql
GraphiQL
前回のブランチではGraphQLの口を作った。以下のようなファイルを用意してGraphiQL経由で動作が確認できるようになった、べんり
RDファイルをJSONに変換する
るりまでは RDCompiler
を利用してRDファイルをHTMLに変換している。
RDCompiler
ではパースとHTMLの出力を同時に行っている。
HTMLを出力せずにJSONに変換するため、以下のようなステップで書き換えを行った。
結果
今日時点での最新コミットだとDocEntryのRDファイルをパースした結果がJSONで取れるようになった🎉
以下のようなクエリを投げると
query { methodDatabase(version: "3.0.0") { doc(id: "index") { id, title, body } } }
以下のようなレスポンスが返ってくる
{ "data": { "methodDatabase": { "doc": { "id": "index", "title": "オブジェクト指向スクリプト言語 Ruby リファレンスマニュアル", "body": [ { "level": 1, "name": "ul", "children": [ { "level": 1, "name": "li", "children": [ "Ruby オフィシャルサイト ", { "name": "bracket_link", "type": "url", "arg": "https://www.ruby-lang.org/ja/" } ] }, { "level": 1, "name": "li", "children": [ "開発版対応リファレンス" ] }, { "level": 1, "name": "li", "children": [ "原著:まつもとゆきひろ" ] }, { "level": 1, "name": "li", "children": [ "最新版URL: ", { "name": "bracket_link", "type": "url", "arg": "https://www.ruby-lang.org/ja/documentation/" } ] } ] }, { "name": "headline", "label": "使用上の注意", "level": 2, "fragment": null }, { "name": "paragraph", "children": [ "組込みクラスのリファレンスはほぼ揃っています。標準添付ライブラリのリファレンスは一部未完成です。それ以外のドキュメントについては、まだまだ書き直しが必要です。\n" ] }, { "name": "headline", "label": "目次", "level": 2, "fragment": null }, { "level": 1, "name": "ul", "children": [ { "level": 1, "name": "li", "children": [ { "name": "bracket_link", "type": "d", "arg": "spec/intro" } ] }, { "level": 1, "name": "li", "children": [ { "name": "bracket_link", "type": "d", "arg": "spec/commands" } ] }, { "level": 1, "name": "li", "children": [ { "name": "bracket_link", "type": "d", "arg": "spec/rubycmd" } ] }, { "level": 1, "name": "li", "children": [ { "name": "bracket_link", "type": "d", "arg": "spec/envvars" } ] } ] }, { "name": "headline", "label": "Ruby 言語仕様", "level": 3, "fragment": null }, { "name": "paragraph", "children": [ "Ruby でのオブジェクト:\n" ] }, { "level": 2, "name": "ul", "children": [ { "level": 2, "name": "li", "children": [ { "name": "bracket_link", "type": "d", "arg": "spec/object" } ] }, { "level": 2, "name": "li", "children": [ { "name": "bracket_link", "type": "d", "arg": "spec/class" } ] } ] }, { "name": "paragraph", "children": [ "プロセスの実行:\n" ] }, { "level": 2, "name": "ul", "children": [ { "level": 2, "name": "li", "children": [ { "name": "bracket_link", "type": "d", "arg": "spec/eval" } ] }, { "level": 2, "name": "li", "children": [ { "name": "bracket_link", "type": "d", "arg": "spec/terminate" } ] }, { "level": 2, "name": "li", "children": [ { "name": "bracket_link", "type": "d", "arg": "spec/thread" } ] }, { "level": 2, "name": "li", "children": [ { "name": "bracket_link", "type": "d", "arg": "spec/safelevel" } ] } ] }, { "name": "paragraph", "children": [ "Ruby の文法:\n" ] }, { "level": 2, "name": "ul", "children": [ { "level": 2, "name": "li", "children": [ { "name": "bracket_link", "type": "d", "arg": "spec/lexical" } ] }, { "level": 2, "name": "li", "children": [ { "name": "bracket_link", "type": "d", "arg": "spec/program" } ] }, { "level": 2, "name": "li", "children": [ { "name": "bracket_link", "type": "d", "arg": "spec/variables" } ] }, { "level": 2, "name": "li", "children": [ { "name": "bracket_link", "type": "d", "arg": "spec/literal" } ] }, { "level": 2, "name": "li", "children": [ { "name": "bracket_link", "type": "d", "arg": "spec/operator" } ] }, { "level": 2, "name": "li", "children": [ { "name": "bracket_link", "type": "d", "arg": "spec/control" } ] }, { "level": 2, "name": "li", "children": [ { "name": "bracket_link", "type": "d", "arg": "spec/call" } ] }, { "level": 2, "name": "li", "children": [ { "name": "bracket_link", "type": "d", "arg": "spec/def" } ] } ] }, { "name": "paragraph", "children": [ "その他:\n" ] }, { "level": 2, "name": "ul", "children": [ { "level": 2, "name": "li", "children": [ { "name": "bracket_link", "type": "d", "arg": "spec/m17n" } ] }, { "level": 2, "name": "li", "children": [ { "name": "bracket_link", "type": "d", "arg": "spec/regexp" } ] }, { "level": 2, "name": "li", "children": [ { "name": "bracket_link", "type": "d", "arg": "spec/lambda_proc" } ] } ] }, { "name": "headline", "label": "組み込みライブラリ", "level": 3, "fragment": null }, { "level": 2, "name": "ul", "children": [ { "level": 2, "name": "li", "children": [ { "name": "bracket_link", "type": "lib", "arg": "_builtin" } ] } ] }, { "name": "headline", "label": "標準添付ライブラリ", "level": 3, "fragment": null }, { "level": 2, "name": "ul", "children": [ { "level": 2, "name": "li", "children": [ { "name": "bracket_link", "type": "lib", "arg": "/" } ] } ] }, { "name": "headline", "label": "C API", "level": 3, "fragment": null }, { "level": 2, "name": "ul", "children": [ { "level": 2, "name": "li", "children": [ { "name": "bracket_link", "type": "f", "arg": "/" } ] } ] }, { "name": "headline", "label": "その他", "level": 3, "fragment": null }, { "level": 2, "name": "ul", "children": [ { "level": 2, "name": "li", "children": [ { "name": "bracket_link", "type": "d", "arg": "news/index" } ] }, { "level": 2, "name": "li", "children": [ { "name": "bracket_link", "type": "d", "arg": "pack_template" } ] }, { "level": 2, "name": "li", "children": [ { "name": "bracket_link", "type": "d", "arg": "print_format" } ] }, { "level": 2, "name": "li", "children": [ { "name": "bracket_link", "type": "d", "arg": "glossary" } ] }, { "level": 2, "name": "li", "children": [ { "name": "bracket_link", "type": "d", "arg": "symref" } ] }, { "level": 2, "name": "li", "children": [ { "name": "bracket_link", "type": "d", "arg": "marshal_format" } ] }, { "level": 2, "name": "li", "children": [ { "name": "bracket_link", "type": "d", "arg": "license" } ] }, { "level": 2, "name": "li", "children": [ { "name": "bracket_link", "type": "d", "arg": "help" } ] } ] } ] } } } }
次試したいこと
ひとまず、ひき続きRDからJSONに変換できる対象を拡大していきたい。 組み込みクラスあたりまでJSONで出せるようになったらフロントエンドの実装をしてみる。
JSONへ変換する試みをしている最中にリスト処理のバグを見つけたので報告した。
こっちのバグも直しておきたい。(なおGraphQLお試しブランチでは直っている)