00:00
こんばんは、2024-09-02の夜です。
もう9月になってしまいましたね。
日中の暑さも、前よりは和らいできたかなというふうに思います。
今日は月曜日なんですけど、この土日はですね、
何の予定もなくて、しかも家に私一人しかいないという感じでですね。
で、まあ雨も結構、台風も近づいてたんで雨も降ってて、
まあ暇だったんですよね。
気分転換に、ひたすらコードでも書くかと思って、
2日間連続でバーってなんか趣味でやるみたいなのが最近、
1日でやるみたいなのがあんま最近なかったんですけど、
久々にそんな時間を過ごしていました。
前からちょっとJavaScriptの実行エンジン、V8のガキになっててですね、
V8アイソリッドっていう機能なんですかね、そういうのがあって、
いわゆるクラウドフレアワーカーズとかがやってるような、
サーバーサイトでのJavaScriptの実行っていうのに、
他の環境っていうのを信頼しないでも実行できるような、
例えばVMとか、コンテナーとかがやってるような、
環境の分離みたいなことをできる、
JavaScriptのコードを分離された環境で実行できる機能ってのがあって、
それが結構気になったんで、ちょっと手を動かしてみたいなと思っていて、
手を動かしてみていました。
なんかそのJavaScriptの分離環境のワーカーみたいなのを作ってみました。
作ったアプリケーションは、いくつかのプロセスというかコンポーネントで構成されてて、
HTTPのリクエストを受け付けるようなものなんですけど、
前段にGatewayっていう名前にしたんですけど、
HTTPのリクエストを受け付けるウェブサーバーっていうのがあって、
一回外部のAPIみたいなデータを取りに行くと、
それはとりあえずブループリントっていうふうに呼んでるんですけど、
HTTP1リクエストに対して一回データをフィッチするみたいなことをやり、
そのデータをベースに今度はワーカーのプロセスに通信して、
03:03
ワーカーのプロセス上でJavaScriptを実行するみたいな、
そんな構成を取りました。
その実行結果を基にHTTPリスポンスをGatewayが返す、
そういう構成を考えて実装してみました。
なんでこんな構成にしてるのかっていうと、
一つはワーカーで実行されるスクリプトってのは信頼できないので、
あまり自己権限を持たないような別の環境に分離させたいってことで、
プロセスを分けてるっていうのと、
もう一つは、
いわゆるクラウドフルワーカーとかは、
起動がめちゃくちゃ早いみたいなのがあったって、
確かにV8のアイソレート自体は起動が早いんですけど、
スクリプトをどうやってそこに渡していくのかとか考えるとちょっと難しいんですよね。
例えばスクリプトをストレージからフェッチして、
起動させてみたいなやると多分スクリプトの大きさによるんでしょうけど、
それに若干時間かかるというのもあるので、
それを並列で他のことできるといいかもなというふうに思って、
そういう構成にしてみたというのもありました。
そういう構成を考えると、
ワーカーとの通信っていうのはGRPCとか使ってみるといいのかなみたいに思って、
GRPC使いやすいのはGoだろうということで、
GoとGoのV8のバインディングがあるんですよね。
それを試しに使ってみてみました。
調べたところといくつかV8バインディングがあって、
もともとC++で書かれてると思うんですけど、
メジャーなのは一つはRustのバインディングですかね。
これはクラウドフラワーカーとか、
あとDenoのDenoDeployとかもRustのバインディング使ってるみたいですけど、
そういうのとか。
あとはPHPのバインディングとかもあって、
Node.jsのバインディングとかもあって、
いろいろあったんですけど、今回はGoのやつを使ってみるので、
V8Goっていう名前だったかなというのを使ってみていました。
動かすのはすごい簡単で、
たぶん色積みのバイナリーをくっつけてくれてるんだと思うんですけど、
ただいわゆるV8が提供してるのはあれなんですよね。
06:07
いわゆる普通のJavaScriptの実行はできるんだけど、
各種APIみたいなのが入ってなくて、
Webブラウザーとか、あとはNode.jsとか、
他の実行関係でもいいんですけど、
そういうところに入っているような、
例えばFetchっていうメソッドが使えなかったりとか、
いろんなメソッドが使えないと。
ただ、JavaScriptの1たす1イコール2とか、
あとはPromiseとか、
そういうのはいろいろ書ける感じになっています。
バインディングを書かなきゃいけなくて、
そのバインディングはGoで書いて、
オブジェクトを作って、それを入れ子にして、
みたいなのをGoで書いてくるんですけど、
たぶんそんなに、
どこまでV8Goが使われているのかよく分からないですけど、
私はあんまり分かっていないだけなのかな。
あれを作れない、
オブジェクトとか文字列とか、
数字とかそういうのを作れる、
ファンクションも作れるんですけど、
あれの作り方がよく分からなかったですね。
こんな感じで作れるんだみたいなのを試して、
外部とのスクリプトの実行に使えるAPIみたいなのを
適当に生やしてみたいなことをやってみました。
スクリプトの実行自体はすぐ動いて、
あとは他のプロセスと通信するみたいなところをやってみたり、
JRPC初めて使ってみたんですけど、
こんな感じかみたいな感じで、
とりあえず動くものができたというのが運地でした。
たぶんこれやっていくとして、
結構たぶんWebのAPI、
例えばフェッチAPIだったりとか、
ストリームのAPIだったりとか、
そういうの作るの結構大変そうだなって、
突然止まってしまいましたね。
太い道路の結構車が多いところって
うるさかったんで止めてしまったんですけど、
バインニング実装していくの、
Web APIそこそこあるし、
これ大変そうだなというふうに思いました。
私は単純なHTTPリクエストをJavaScriptで処理するっていうプラスアルファで、
他の事前にAPIにリクエスト投げてみたいな、
そういうのを考えたんで自分で実装したんですけど、
いくつかのそういうランタイムがOSSで公開されてるんで、
例えばヨロフラワーカーズはWorkDっていうのかな、
そんな感じの名前で多分公開されてるんで、
そういうのを動かしてみるみたいなのはちょっと面白いかもしれないですね。
09:02
これ結構ごめんなさい、周りの音がすごいうるさいかもしれないです。
そんなんでやって動いた動いたなったんですけど、
一旦動いたらまあいいかみたいな感じになって、
ちょっと次はJavaScript以外っていう意味で、
バスムをいろいろ試してみたいかもしれないなという気持ちになりました。
また時間取れたときにいつになるかどうかわからないんですけど、
そういうホスティングサービスじゃないですけど、
そういうのをちょっと考えてみたいなというふうに思いました。
JavaScriptの実行みたいなのは結構なんて言うんですかね、
APIを使うようなものじゃなければ結構温かみのある感じで、
文字列を自分でスクリプトを繋げるみたいな感じで、
独点ライブラリとかで出力したコードとかを、
パイプラインみたいなの作ってもいいんでしょうけど、
とりあえずSpikeの実装なんで、
シェルスクリプトで繋げてみたいな感じにして、
スクリプトを生成したりして動かしてみるみたいなのをやって、
多分バスムとかだともうちょっとバスムの構成みたいなのを
ちゃんと理解しなきゃいけないんですけど、
JavaScriptは単なる文字列のプログラムなんで、
すごい簡単だなというふうに思ってやっていました。
こんなところかな。
何か話そうと思ったけど忘れてしまったな。
そうだな。
いわゆるLLMで結構コード生成をするみたいなのをやってたんですけど、
CursorというUSコードをフォークしたエディターかな。
LLMにコードを生成させてバンバン書いてみたいなのをやったんですけど、
今回は本格的に自分で長く使うソフトウェアを作るというよりは、
新しい技術を試してみる。
ある種Spikeみたいな実装だっていうところもあって、
とりあえず動けばいいみたいな感じで書いていったんで、
Goだから結構単純なコードの行数みたいなのを参考にならないときも結構ありますけど、
そこそこの行を自分が書いたというよりもコード生成して直して動いたみたいな感じですけど、
なんかこれはこういうSpikeにはめちゃくちゃ向いてるというか、
12:06
これなかったらもっと時間かかってただろうなみたいな感じは結構ありますね。
やっぱそのちゃんとっていうとあれですけど、
長く使われるソフトウェアを作るときはなんかもっと細かいことを気にして、
今はコードを書いたりしているので、
それがどこまで今後変わっていくのか、
うまくできるようになるのかみたいなのはちょっとまだあんまり感覚がないところかもしれないですね。
じゃあそんなところで今日は終わりにしたいと思います。
あ、そうそう。
いや、そうそう。
なんかその…
その…
そうですね。
いや何でもないわ。
はい、終わりにします。
じゃあまた。