Denoばた会議 Monthly 第18回
2023年3月31日開催。
connpassリンク。
今月のアップデートを追う
Denoのアップデートを追っていくLT。
そのあとの雑談込みでザックリと箇条書き。
Deno v1.32
WebGPU APIの一時的な削除
- surveyの結果、WebGPU APIの使用者が少ないことがわかった
- Denoの起動時間やバイナリサイズに少なからず影響を与えていた
- 2ミリ秒のオーバーヘッドがあった
- 10メガバイトくらいのバイナリサイズがあった
- PRに色々と説明がある
- 数ヶ月後にまた実装される予定
- レイジーにすることで上記の問題は解決されるはず
--unstable
の機能だったので、SemVer的には問題ない
KVストア (Deno.Kv
)
- Deno本体にSQLiteベースのキーバリューストアが実装されている
const kv = await Deno.openKv()
で利用可能kv.get(["key"])
で取得、kv.set(["key"], "value")
ができるなど- リリースノートでは触れられていない
--unstable
で入っている- uki00aさんやayame113さんなど、ユーザーサイドが注目している
- ayame113さんのツイートをRyanさんが社内チャットに貼ってて、不満点は対応されるかも
- 配列は5種類くらい許されている
Uint8Array
string
number
bigint
boolean
- IndexedDBなどWeb標準APIではなく完全な独自実装で、Denoの立ち位置としては少し意外に感じた
- バージョンスタンプという概念がIndexedDBにはない
- より正確にデータストアをやりたいというモチベーションなのでは
- トランザクションも入っている
- 作成した人がデータベースオタクなので、データベースとして必要なものへのこだわりが詰め込まれた内容なのかな、と
- Deno Deployを見据えたもので、同じAPIが入る前提でCLIに互換機能として入っている
- Deno DeployのはSQLiteベースではなく、分散データベースの上に同じようなKVを載せる形
- Cloudflare D1はSQLite互換でDurable Objectsに突っ込む形で、これはあまり望ましくない性質だった
- この性質を避けようと実装した
- 実装者はByteDanceにいた方
- ByteDanceにはデータベースオタクがグループを作っていて、論文を書いたりと切磋琢磨している
deno compile
でdynamic importとWeb Workerがサポート
- dynamic importやWeb Workerの読み込み先を動的に作成している場合は、
--include
の指定が必要 - フォールバックとして
--include
が入った(動的に解決されるファイルもバイナリに含めてくれるから動く) - Aleph.jsもコンパイルできるようになるかもしれない
TypeScript v5.0.2
- Deno本体に組み込まれているTypeScriptがv5.0.2へアップデート
- サイズが小さくなった
- TypeScriptのコード自体がESモジュールになった
const type
パラメータとか
- ES Decoratorsのサポートについては現時点では除外されている
- フラグでオフにしてる
- 将来的に入れる予定
- V8にも入ると思うので、そうしたら流石に入れるしかない
- SWCがレガシーなデコレータをコンパイルしてしまう
- そこをどうにかしないと追加できないのかも
deno_std v0.180.0
std/encoding
のcsv
/front_matter
/json(c)
/toml
/yaml
がトップレベルのモジュールへ変更- 2〜3ヶ月くらい揉めてた
- 最初は
std/csv.ts
とstd/csv/*.ts
が存在するのが許せないという勢力がいた csv/
に集約しないとcsvモジュールが他にあるのに気づかないだろ、という理論- 言語系モジュールが分散している状況が許せない
- 勢力がネストをゴリゴリ深くしていこうという話でコミュニティが傾いてきた
- ネストが長くなるとURLが長くなってしまう
- ネストがあるものをトップレベルに持っていくという提案をしたところ、合意が得られた
Denoでpackage.jsonやnpmパッケージのサポートが入った理由について
- Why We Added package.json Support to Denoという記事が公開された
- 以下のモチベーションについて書かれてる
- 依存関係の重複問題を解決したい
- 既存のリモートモジュール管理(
deps.ts
, Import maps)の課題を解決したい - esm.shなどで一部のnpmパッケージが利用できない問題を解消したい
- 記事のタイトルの説明が本文中でできていないのでは? という話が記事を出すときに出ていた
- ちゃんとした説明になっていないという主張も社内にある
- 「これ答えてる?」「答えてないと思う」「答えてると思うけどなぁ」で記事リリース
deno:
の話を少しして記事終わり- v2はもうすぐくるかもという話
- 予定してた時期よりは伸びている
- 昔からのファンには嫌われている機能なので、本当にこれでいいのかという確信がない
- Node.jsは普及による影響範囲やチーム分権体制のため、Denoのように根本からデザインを変えるというのは難しいよね
Cicada
- 内部的にDenoを使っているCI/CDパイプライン
- アーリーアクセス中
- GitHub Actionsは高機能すぎて移行するという気は起きない
- だけど部分的に置き換えるというならありかも
- 需要はありそう
- Denoは.github配下にあるci.generate.tsがGitHub ActionsのYAMLを作るようになっている
- 条件分岐が多すぎてYAMLとしては管理しきれなかった
- RyanさんはTypeScriptを挟むことに反対していたが、何人かリファクタに関わっているうちにYAMLに比べてメンテがしやすいということになり、Ryanさんも折れた
- なので、こういったサービスの力を借りるのも良いかも
質問共有コーナー
SQLiteが内部的に使われてるlocalStorage
とDeno.Kv
ってDeno社的に、どう使い分けて欲しい感じなんでしょうか? 結果的に両方キーバリューの形式なので、RDBの形式で出てこなかったのでちょっと困惑しているというか、別途RDBもホストすることはあるんでしょうか?
- ローカルストレージは同期的だし前方一致でリストとかできないので、本当にキーとバリューだけ
Deno.Kv
はリストしたりできる- keyのprefixを前方一致でリストにできる
- namespaceを設定できる
- ローカルストレージよりは高度なものになっているはず
- Kvのほうがヘビーに使えるはず
- Kvはデプロイのほうにも入る前提
- RDBもロードマップの先にはある
- KVSの次はRDBもやろう! とはなっている
fresh-compornentsをよく使わせていただくんですが、freshのモジュール群を一部Deno社で持つことってあるんでしょうか。知人で、セキュリティにかかわるようなモジュールは、公式ないし準公式なお墨付きあると安心できるという話をしていて
- UIコンポーネントのこと?
- 公式です
- プルリクいただければ追加できる
- メンテナンスは公式でやってる
- 追加されそうなのもある(スライドショーとか)
- Pluginという仕組みがあるけど、現状は
style
やscript
の差し込みのみ- Middlewareを生やせるようにしたいとは考えている
- いつになるかわからないがPluginからMiddlewareを生やすというのはしたいらしい
- 認証プラグインなど?
- 持たないとユーザーが増えていかないよな、と思っている
- ちょっと人手が足りてない
- Lucaさんの手が空いたら、という感じになりそう
- 公式でSaaSを始めるためのFreshテンプレートを作ろうという動きがある
- これにをフォークして認証系を作ってくれ、という流れは近々アナウンスされるかも
- Stripe連携が使われているので、課金とか色々やりようはある
- テンプレートの形で認証やAPI連携のところをやりやすくすることを実施している
- とりあえずここから始めていただければ
- 本体に
plugin/
という場所ができれば、Freshのモジュール群をDeno社で持ちやすいし、ホイホイ入れていきたい- 自然とmonorepoになっていて、指定したプラグインがあっても使わなければ影響が出ないから
- ともかくLucaさんの余裕ができてから話が始まる
- アイコンもFreshの中に組み込まれている
import
というかコピペ(www配下に入っている)
ChatGPT、仕事で使ってますか?
- uki00aさんは既に使っている
- 無料でも結構使える
- わからないことあったら会話形式で聞けるので良い
- 課金すると3.5と4の使い分けが難しい
- 4は結構もっさりしてる
- 課金した3.5は生成速度がめちゃ早い
- モデルというドロップダウンがあって、スピードとか選べる
- 4と3.5レガシーのスピード表記は同じ
- 4は文章生成を待ってるとトイレに行けるくらい長い
- フリーズしちゃってAPIエラーって出た
- ちょっとまって「もう一度聞く」ってやったらサラッと返答をくれたけど
- kt3kさんが課金したきっかけ
- Davidさんが社内チャットで推してたからつられて
- 今週はこれで数時間節約できた
- Davidさんの兄弟が弁護士なんだけど、その人もこれで時間を節約してる
- LucaさんはTypeScriptでわからないことをDavidさんに聞いていたが、ChatGPTに聞くようになった
- 擬似コードを使うと回答精度が上がる
- 表現を良くする疑似関数を使う
- 質問力が問われる
- 何らかのルールに沿ったルームを構築して、最初にいかに調教するかが鍵
社員さんが3人増えた
- Lucaさん
- 低レイヤーの人
- Deno Deployで、再デプロイをしないでも機能のオンオフができたりするものを作っている
- Feature Flagを動的にいじる
- Leventeさん
- 超低レイヤーの人
- GitHubに載っている経歴がすごい
- 超低レイヤーのスペシャリストは今までいなかった
- Mattさん
- リリースももう回してる
- Profile-guided OptimizationでDenoをビルドするときにこれを実施してパフォーマンス改善してる
- パフォーマンス専門
- 経歴が違う人たちがきている
- 強い人が入ってきているイメージ
- Ryanさんは採用面接ばっかりしてるので、相当落としているのでは
- コントリビュータを採用プロセスに載せるけどだいたい面接で落ちる
- 採用を抜けてきたということは相当に強いんでしょうね
- 採用でほとんどの時間を使っている
- プロリクルータのアンドリューさんはその何倍も面接してて、1日ずっと面接しているのでは
- 面接するだけ応募がきてる
- アンドリューさんはリクルータとして自分から行っている
- 腕がいい人のところに行って面接したりしている
Profile-guided OptimizationとLink Time Optimizationについて
- Link Time OptimizationのほうがProfile-guided Optimizationより一般的かも
- LTOとコンフリクトするからLTOをオフにするしかないから、単純に改善されるわけではないのでは、という話もある
- Snapshotを軽く走らせてからやると、初動がよくなる?
- Denoが何も犠牲にせず早くなることができるかも
ゴリラさんの連載の話
- 第2回まで出てきた
- 今第3回を書いている
- 来月に出る
- APIの話
uki00aさんのブログを読もう
- deno_std v0.180.0でServer Send Eventsが入った
- 循環依存のある
peerDependencies
解決の改善 - Fresh v1.1.4のリリース
- Twind v1向けのプラグインが追加されている
- 1.1.5を出せという話
- PR出したけどCanary版で落ちる
- CI環境をWindowsやmacOSやLinux上で、Denoのv1.32.1とCanary版でやってるがまぁCanary版がよく落ちる
- この落ち方は初めてなので、ちょっと時間かかるかも
- タイムアウトが無意味に長い
- その後で無事にリリースされました
- DenoDBのリリース頻度が下がる
- DenoのORMだった
- Prismaの影響もあるかも
- oakが久しぶりにリリースされた
- 今はHonoがアツい
- 最近v3がリリースされた
- tRPCに絡めたRPCモードがあるので、良さそう
参考資料
上記をまとめる際に眺め、かつ箇条書きの中に含められなかった資料です。
名前だけ掠ってて関係ない資料もあるかと思いますが、まとめる作業の可視化として残しています。
読まなくて大丈夫です。
- Cloudflare Workers の Durable Objects について
- Workers Durable Objects Beta: A New Approach to Stateful Serverless
- Cloudflare Workers それは Frontend / Node.js が CDN Edge Side まで拡張されるもの - mizdev
- CloudflareのDurable Objectsをかる〜くご紹介 - Qiita
- Cloudflare Workers 面白い - ゆーすけべー日記
- Cloudflare D1 がヤバい
- UPDATE Supercloud SET status = 'open alpha' WHERE product = 'D1';
- D1を発表:当社初のSQLデータベース
- Cloudflare D1を使ってみる | DevelopersIO