vim-jpでセマフォについて教えて貰った。
セマフォは一度の接続数に制限のあるリソースに対して制限をかける機構で、 これを使うことで分割ダウンロードとかの同時接続数に制限のある処理を書く時にリソースを良い感じに分配できる。
セマフォの実装にはasyncutilがVenryらしい。
今日やったこと
Common Lisp
自分が実装した署名関数が無効な署名をする理由が、BIP340に定められた方法に則ってないからだと気付いたので、BIP340で策定されているシュノア署名を実装していた。
詳しく書くと、secp256k1では通常noneっていうシード値のようなものをランダムに定義してそれを元に署名を行っている。 しかし、BIP340に定義されている署名方法ではこのnonceが仕様として定義されている。
それをCommon Lispで実装したのがbip340っていうライブラリになる。
実装の最中に見つけたので始めはちょっとビックリした。
これで署名が正しいことが確認できればやっとNIP-01の署名部分は実装終わりそう...次はREQとかそのあたりの実装になる。
そもそも今書いてる実装はRSSの更新情報をNostrに流すBot実装の一部になっている。 なので一度ライブラリとして切り出す作業が必要になってくる。
更に、そのライブラリを使ってNostrリレーを作って運用する所までが卒業制作のゴールなので先はまだ長い...
ダメそうだったら卒業制作はRustとTSでなんとかする予定。(これ自体はCommon Lispで実装しようと考えていた時に決めていた)
Emacs
VimのC-a/C-xみたいな操作を再現してみた。 「カーソル上の任意の文字列を任意の方法に置き換える仕組み」を関数として切り出したので、 色々拡張できそう。
ゆくゆくはdial.nvimみたいな挙動を実現したい。
;; カーソル上の任意の文字列を任意の方法に置き換える仕組み
(defun replace-at-point (callback)
(interactive)
(let ((word (thing-at-point 'word t))
(word-at (bounds-of-thing-at-point 'word)))
(delete-region (car word-at) (cdr word-at))
(insert (funcall callback word))))
;; インクリメント
(defun incr-point ()
(interactive)
(replace-at-point (lambda (word)
(number-to-string (+ (string-to-number word) 1)))))
;; デクリメント
(defun decr-point ()
(interactive)
(replace-at-point (lambda (word)
(let* ((num (string-to-number word))
(incr-num (- num 1)))
(if (> 0 incr-num)
word
(number-to-string incr-num))))))
明日以降やりたいこと
署名部分を実装して、実際にNostrへ投稿できるところまで実装できたら良いなと思う。