2024-2

2024-11-30
- 気になる言語
- borgo
- shplait
- zenn scrapsが上限を超えてコメントできなくなった (2024)
- Chat AIというかLLMのAPI関係
- chatgptのAPIは無料枠が無さそう (切れた)
- geminiはありそう (TODO: link)
- denoでweb APIを呼ぶときのコードについて考えた (クラス不要説)

上限を超えてコメントできなくなった
なるほど400

denoでweb APIを呼ぶときのコードについて考えた(クラス不要説)
denoでwebAPIを呼ぶときのコードを考えてみた。
ポイントとしては
- debugし辛いコードは避けたい -> traceしたい
- 環境変数などでいい感じにapikeyを読み込みたい
- 個別のケース用のfetchを作りたい
- クラスは本当に必要?

たぶん最終的にはこんなコードを書くかも? APIDoc的なinterfaceをやるかはわかんない。
request/responseの形状はどっかから拝借してくるかも?

- streamingへの対応はどうするんだろう?
- geminiのapiの方はどうなるんだろう?
- deno経由ではなくブラウザ経由で呼び出せるようにするにはどうするんだろう?

意外と考える事が多いのでscrapにした

2024-12-01
- 昨日のやつをGeminiでも試す
- with-helpでchoicesで補完を効かせたい

with-helpでchoicesで補完を効かせたい
// parseArgs()の引数ではないので補完が効かない。
const options = {
"boolean": ["verbose"]
} as const;
const args = parseArgs(Deno.args, options);
// ここでoptionsを渡したくなる
const restricition = new Restriction(options);
とはいえ安易に値にメソッドを生やしたくない気もする。

結局無理やり値を埋め込んでしまった。まぁでも大体使うのはchoicesくらいなので const choices = mostStrict(args)
してしまえばrestrictionというオブジェクトが現れるよりマシかも?

昨日のやつをGeminiでも試す
denoでのweb API呼び出しのGemini版
(実際にはこれによってmoreStrict()のchoicesのやつを直そうと思ったのだった)

ついでにサブコマンドを自前で定義してみた
- switchで分岐する?if-elseで分岐する? (breakの代わりにreturnを使えば1行)
- 同一のコマンドオプションをbase側のコマンドで吸収するべきか?(繰り返しになる)

対応した

2024-12-02

2024-12-02
- bskyへpostしてみる
- this is undefinedのbindの対応
- webでもcosole.logを

bskyへpostしてみる
単に投稿するだけでなく改変した結果をpostしたい。例えば翻訳した結果を併記するだとか。
しかしふつうにやると文字数制限に引っかかる。例えばgistなどの別の場所に追加の内容を投稿してそれへのリンクを付与するとかの方が良いかも?
🔑 パスワードはマスクした感じで表示したくなった。
あと1ファイルに収めるにはnamespaceが便利。

this is undefinedのbindの対応
これをTypeScriptの型チェックをすり抜ける。eslintの出番とかだとやだな…
対応方法
- constructorでbindする
- メソッドをアロー関数で定義する

webでもconsole.logを

2024-12-03
- mac + kitty + screen で改行を含んだ文字列のクリップボードからのペーストが効かない
- denoでgistに投稿してみる

mac + kitty + screen で改行を含んだ文字列のクリップボードからのペーストが効かない
かなり特殊な事例かも。。
homebrewで諸々updateしてから「改行を含んだコピペ」がうまくできないっぽい。
kittyかscreenの問題そう。。なんだろ。copy modeと認識されてしまう(screen)
.screenrcでCtrl+jをエスケープキーにしてたせいっぽい。
# エスケープキー
escape ^Jj
ブラケットペーストモードを無効(off)にする – イー・フロンティア・システムズ
.inputrcでbracketed-pasteを無効にして、kittyのpaste anywayを使えばまぁ動きそう。
echo "set enable-bracketed-paste off" >> ~/.inputrc
bracketed paste の制御文字はコピーの開始と終了用の \e[200~
と \e[201~
で囲むやつ。

denoでgistに投稿してみる
方法は2つあるかも?
- subprocess経由で
gh gist create
を呼ぶ -
gh auth token
で渡してweb APIを直接叩く
.envに入れておけば使えるし、後者のほうが嬉しいかもしれない(main2.ts)
💭こうやって前提条件が増えてくると自分用のdoctor
的なコマンドが欲しくなるかもしれない。
あとはいろんな環境変数が見えるのも微妙なのでやっぱりマスクしたくなるかも?

💫関係ないけれどsnapでインストールしてたghが古くてgh auth tokenが存在しなくてびっくりしてた。結局雑にghqでcli/cliをcloneしてきてビルドしてしまった。go installで入れても良かったのでは?と思ったりもした。

2024/12/04
- fetch()のbuild helperを作りたくなった
- denoで試したいもの

2024-12-11
- console.dirの代替

2024-12-12
- githubのissueのsub issueを集めたい
- bsky用のサブコマンドを作ろうとしてみる

githubのissueのsub issueを集めたい
こんなbashの関数を書いておく?
# $1: repo, $2: issue number
function gh-linked-issues() {
gh api -X GET --paginate /repos/$1/issues/$2/comments -f per_page=100 --jq '.[] | .body' | ggrep -Po "https://github.com/$1/issues[^\n >'\"\)]+" | sed 's/^/- /g' | sort -u
}
- 📝逆参照の自動で付与されたリンクには対応していない
- ghコマンドの
--paginate
がうまく機能しているかわからない

bsky用のサブコマンドを作ろうとしてみる
書き心地を確かめることの一貫。
思ったことは
- めんどくさくはあるけれどサブコマンドも実装できる
- API Keyがヘルプメッセージにデフォルトとして表示されると邪魔 (with-help)
- booleanのdefaultが上手く表示されていない (with-help)
- 雑にclientのコードを書いていたらfetch周りで型チェックが効かなくなった (auth無しfetchを渡せる)
- 直接fetch()に渡すbodyのところで
reply
をrepl
とタイポしてた - ある程度肥大化するとnamespaceでも邪魔になる
機能面というか知識面では
- bskyはfacetsの対応をしないとURLがリンクとして機能しない
- facetsの対応をしてもPWAなどで挿入されるサムネイル画像などは付与されない

2024-12-13
- bskyのコードをchatgptに書いてもらう
- ts-expect-error

blueskyのコードをchatgptに書いてもらう
昨日自分で手書きしてみたものをchatgptにお願いして書いてもらうことにした。
- 投稿
- accessJwtのキャッシュ
- refleshJwtでのリフレッシュ
- スレッドとしての投稿
- facetsの算出(リンク)
- ogpを取得してサムネイル付きで投稿

↑の内容を個別にお願いしていきボトムアップに作ったコードがこれ。

これを一発で出力するプロンプトを最後に提案してもらった。
プロンプト例:
Bluesky API (`atproto`)を使って、以下の要件を満たすTypeScriptコードを作成してください。
1. **Blueskyに投稿**: `atproto`を使ってBlueskyに投稿できる機能。
2. **Facetsの送信**: 投稿に`RichText`を使用し、自動的にfacetsを計算して送信。
3. **リンクのOGP情報を取得してサムネイル付きで投稿**: 投稿内のリンクに対して、OGPデータ(タイトル、説明、サムネイル)を自動的に取得し、投稿に添付。
4. **`fetch`を使用**: `axios`ではなく、`fetch`を使ってOGPデータを取得。
5. **スレッド投稿**: 投稿内容が文字列の配列として渡された場合、リプライを繋げてスレッドとして投稿する。
6. **`did`と`accessJwt`をキャッシュ**: 一度ログインして取得した`did`と`accessJwt`をキャッシュし、再利用する機能。
7. **`refreshJwt`を保持し、`accessJwt`の期限が切れた場合に自動的に更新**: `refreshJwt`を使って`accessJwt`が期限切れの場合に自動的に更新。
8. **全ての提案を含んだコード**: 上記の全要件を満たすTypeScriptコードを一貫して書いてください。
注意:`accessJwt`が期限切れになった場合に自動で更新し、リンクにOGPデータを付けて投稿することが重要です。スレッドの投稿は、配列のメッセージをリプライとして繋げる形にしてください。

今度は回答してもらったプロンプトをいきなり投げてコードを書いてもらった。いわばトップダウン的な利用方法。
結果としては紆余曲折があった。
- atprotoの利用が消えていた
- すべての箇所でfetchを利用しようとした
- ogpのサムネイルと投稿するメソッドとスレッドとして投稿するメソッドが分かれてしまった
[!NOTE]
途中でモデルがダウングレードされたせいもあるかもしれない。
課金してない

同様のことをgeminiにもやってもらった

たぶんこちらはgpt-4oでの回答。いい感じになっているかも?
ここから始めて真面目に動かしてみた

TSで型エラーのテスト
わざとおかしくして @ts-expect-error
で潰すというのはありかも?
{ // ok
const args = parseArgs(["--value", "123"], options, handler);
const coerce = moreStrict(args).integer;
const args_ = { ...args, value: coerce(args.value) }; // string -> number
// @ts-expect-error "foo" is not an integer
assertFalse(args_.value === "foo");
}
``

自分用のbsky client
- スレッドで投稿
- gist経由で投稿
- 投稿しない
他にある?
英訳とか?これは投稿の形態ではなさそう
どこから投稿するか
- コマンド(cli)
- エディタ
- スマホ(PWA?)

2024-12-14
- 昨日の
@atproto/api
を使ったbskyのCLIに型などを付ける - ogpカードをいい感じに表示したい

@atproto/api
を使ったbskyのCLIに型などを付ける
昨日の- fetchをオプションで受け取れた
- package.jsonを見るとtypesにdist/index.d.tsが含まれていた
どうやら名前空間としてimportしているような感じでキモい。
(なるべくimport typeを使いたいがdist以下のpathを参照したくない)
あと普通に型定義が壊れてた 🙄

ogpカードをいい感じに表示したい
bskyではウェブカード用の表示のサムネイル画像をクライアント側が自分でアップロードするひつようがある。というわけでogpを読んでいい感じにやってくれる何かが欲しくなった。
amazonとかは無理なのだけどそれこそURLの中を覗いてtitle,descriptionだけ取っちゃえば良いか。。ちなみにfacetsの自動計算とamazonの長いURLの相性が悪い。

💫何故か朝から不毛なことをしてしまっていて、facetsをいじってのフィッシングみたいなことをやってみて警告を表示してくれるか確認したりなどをしていた。
あと地味にamazonのサムネイル画像取得とかを頑張ろうとブラウザの通信のharを撮りhtmlやjsを覗いてみたりなどしてしまった。

2024-12-15
- ogpを集めたい

2024-12-17
- ogpをブラウザベースで取得する方法が無理だった

ogpをブラウザベースで取得する方法が無理だった
apiサーバーを立ち上げないとだめそう。honoあたりで立ち上げる?
denoのhandlerを用意するのとどっちが良いんだろう?
とりあえずdeno serveで配信してみることを考えてみた。
手元で動かす分にはこれで良さそうだけれどクライアントサイドのreactをどうするかが悩みどころかもしれない。

2024-12-18
- honoで楽をする

honoで楽をする
昨日の作業にhonoで楽をしたかった。
routerとしてhonoを使うのは楽そう。そこから先はちょっと微妙そう。

2024-12-19
- viteをdenoから使ってみる (未実施)
- rolldownを試す

viteをdenoから使ってみる
一昨日はdeno単体で触ってみて昨日はhonoを触ってみて、routingが必要になったタイミングでhonoが便利だと感じたのだけれど、クライアントサイドを先に書いていきたい場合にはあんまりhonoが便利に機能しなそうな印象を受けた。
クライアントサイドでのコンポーネント作成にはviteが安牌だと思っているのでviteを試してみるということをしても良いかもしれない。

starter templateはこの辺にある。暇なときに中を読んで置くと良いかもしれない。
その他ドキュメント
- https://docs.deno.com/examples/create_react_tutorial/
- https://docs.deno.com/examples/react_tutorial/
あんまりこの辺のドキュメントに意味はなく deno run -A npm:vite
が動くように調整できれば良いという話かもしれない。

starter templateやdocumentではoakが使われているが、これはhonoで良いのではないか?
そういえば一般的にはbundleの部分にgetElementById()をしてcreateRoot()とかをするコードを書いてしまうんだな。
deno run -A npm:create-vite@latest
が動くかだけ確認しておきたいところ。

何ができてほしいかの整理
- 開発時のHMRとincremental build
- 開発時のCORS的な設定
- デプロイ前のビルド
- (ルーティング)

package.json以下に色々現れるとnode_modules/.bin以下のコマンドが自由に使える用になるのが便利ではある。
- viteとvite previewの違いが分かっていない
- vitejs/plugin-reactが必要なのを忘れそう
開発時のHMRもCORSも全部viteのdev serverがやってくれそう。。
そうなるとvite.config.tsの記述とプラグインの設定が重要になるのかも?
📝記憶が確かならindex.htmlの位置がデフォルトの設定としては重要だった記憶。

まだ上手くいっていないこと
- 各種型の情報を取ってくる方法
- import部分の取り扱いをdeno仕様にする方法
npm:react
ではなくreact
で取得できないと困る

このへん使う?
これをreact pluginに認識させるにはどうすれば良いんだろう?

2024/12/23
- deno init
--npm
- deno + hono + reactを無理やり動かす

deno init --npm
使ったことがなかった。

対話的な操作がうるさい人感じることもある。

deno init --serve は便利かも。deno init派使わなくなった。

deno + hono + reactを無理やり動かす
最終的にesbuildのpluginを手元で動かすことでそれっぽく機能するようにはなった。
クライアント側のコードを書いているときに補完さえ効いてくれればこれで十分なのだけれど
- viteを使っていない
- honoのclient sideのjsxを使っていない
- deno serveで動かしている

究極的にはviteをどこで動かすか?みたいな話になるし、実はdenoあんまり関係ないのでは?

あとesbuildの--serve
で良くない?

2024-12-24
- jotai v2?

2024-12-26
- deno-glue

2024-12-28
- esm.shへのリクエストをキャッシュする機構を作っておきたい

esm.shへのリクエストをキャッシュする機構を作っておきたい
関係ないけれど謎の秘孔をついてしまったかもしれない。

2024-12-29
- podhmo/deno-glueにserveを追加する

deno-glueにserveコマンドを追加する
昨日の続き。色々考えた結果 { fetch:(...) => Response }
をdefaultでexportしていると動くようにすることにした deno serve
と似たような機能を作る。

とりあえず動くようにはした。HMRが欲しくなった。ウィンドウのカーソル移動がめんどくさいのだなー。

denoの環境変数
今まで jsr:@std/dotenv/load
を使っていたけれど deno run --env
を使う方が自然なんだろうか?

フロントエンド用の便利機能
見た目を整えるための整形の処理のときに
- 変更した後にブラウザにフォーカスを当ててF5
- browsersyncみたいに何らかの手段でブラウザリロード
- viteとかでよくあるようにHMR (hot module replacement)
で現状は一番上になっていて悲しい。viteを頑張るのをふつうの人には勧める。
denoの --watch-hmr
をどのように使えば良いのか分かっていない。