2024
はじまり
- 記事の目的
この記事の目的
zennのscrapsはかなり便利なのだけれど、不要なscrapを立ち上げてすぐに辞めるみたいな作業をしがち、そんなわけで一覧部分にはタイトルだけに近いようなメモの残骸が並んでSN比が悪くなる。
(これはgithub issuesも同様の問題)
github issuesより良いところは
- リンクを貼るとcard UIで良い感じにOGP的な情報を展開して表示してくれる
- github discussionsと同様に複数の枝を持たせて各枝毎にコメントを書くことができる
そしてChangeLogメモのように一箇所にまとめるという意味で一箇所に集約してみると良いのでは?という感じになった。というわけで2024年版をここに書くようにする。
ついでに、作ったscrapsのメモをここに載せていくようにしてあげれば大きな意味でのmeta scrapsに使える気もした。
2024-04-26
- mermaidのDFDを直線直角を使って描きたい
- apiと一対一のdocはあんまり嬉しくない?
- スマホだけで扱える範囲
- preタグの内容をクリップボードにコピーしたい
mermaidのDFDを直線直角を使って描きたい
このスクラップにある通りにDFD (data flow diagrams)を描いてみたいとおもうようになった。
元々の動機としてはスマホでの入力をいい感じにやって遊べないかということだった。
そしてスマホのフリック入力(全角)で表せる言語(DSL)を使って何かできないか?ということを考えていた。
そして、テキストで表現できる物を探してmermaidで記述できる方法を調べてみていた。
そしてどうやら直角直線で矢印を描く方法が存在していないっぽいことがわかった。
というわけで以下の作業が必要
- mermaidの描画部分の実装を把握する (d3?)
- mermaidの直角直線の矢印の方法を調べる
apiと一対一のdocはあんまり嬉しくない?
(これは以前に書いたもののメモではある)
もう一段回上の階層のなにかがほしい
スマホだけで扱える範囲
元々スマホだけで作業したいと思った理由を以前スマホだけで書いていたのを思い出したのでここにメモしておく。
- スマホだけで何らかの生産がしたい|podhmo
- スマホでできるのは思いつきの記録か断片の出力程度かもしれない|podhmo
- スマホだけでシリーズの続き、対話の価値あるいは対話によって明らかになる朧げな輪郭を記録したいことについて|podhmo
- 書き散らしたメモのような断片を入力として利用したいという足掻き|podhmo
色々考えてた
Ubuntuの24.4が出るのかWSLの方も更新したいかも。
たぶんいきなりscrapsを作らずに、しばらくここでテキトーに始めるのが良いような気がする。
preタグの内容をクリップボードにコピーしたい
jsとか書かずに対応できないのかな?
とりあえず、jsを書いても良いので調べておこう
preタグの中でのcodeタグとか実は理解してないかも?
元々インラインのコードを表すcodeに対して複数行のものを表すときにpreタグの中で書くみたいなあれなのか。
https://developer.mozilla.org/ja/docs/Web/HTML/Element/code#補足
複数行のコードを表すには、 <code> 要素を <pre> 要素の中に入れてください。 <code> 要素自身は、コードの単一のフレーズや 1 行のみを表します。
💭 これ長くなりすぎたときのローディングが気になるかも?
2024-04-27
- スマホで入力する図
- emacsclientでfind-file-other-tabを呼びたい
スマホで入力する図
昨日のやつは文芸的プログラミングとまでは言わないけれど仕様的なものをgist上に追記した。書くならdenoあたりが良い気がしてる。S式からは遠いものになった。
あー、あと意外とPCでは入力し辛い部分があった(「…」とか)。
図で表現したいと思ったときに何を得たかったのかをもう一度整理したい気がした。基本的には関係性の説明。
アウトラインエディタとか考えてみたりしたけれど順序の変更はけっこう必須な感じもする。
あと図はそれ単体では機能せずにそれを参照しての利用に意味がある。そういう意味では例えばこの記事内みたいな文章的なものが欲しくなる。
bskyのコピペのやつはパスワードを間違えたときのメッセージが不親切だった。
あと、なぜかデフォルト値から変わらなくなったりした。
emacsclientでfind-file-other-tabを呼びたい (buggy)
というか単純に新しいタブとして開きたい。server.elを読んでみると普通にfind-file-no-selectをしてset-bufferを呼んでいる。単純にswitch-to-buffer-tabを使うtimerを実行してみると現在開いていたバッファも書き換わってしまう(timer無しだとたしかtab-barを開いてくれない)。
(tab-bar-mode 1)
(tab-bar-history-mode 1)
(defun my:find-file-with-tab-bar--server-visit-hook ()
(run-with-timer
0.1 nil
(lambda (buf)
(message "## new-tab %s" buf)
(switch-to-buffer-other-tab buf)
(tab-bar-history-back)
(tab-bar-move-tab -1)
(tab-bar-switch-to-next-tab)
)
(current-buffer)
)
)
(add-hook 'server-visit-hook 'my:find-file-with-tab-bar--server-visit-hook)
tab-bar-history-backとかをうまく使えば済むかも。tab-bar-history-modeを有効にして元のtabを戻してあげると良さそう。
(追記:⚠️ これは壊れている。こちらで解決した。 https://zenn.dev/link/comments/79a09301ca909b )
おおきなトピックにもならない呟きはタイトルもつけずに呟いてるけれど、UI上は連続してるもののように感じてしまうかも?
2024-04-28
- 今のEmacs環境の細かな課題
今のEmacs環境の細かな課題
Emacsで現在気になるところは2つある
- skkを使い始めたらctrl-jが衝突するようになった
- ctrl-kでのkill-bufferとtab-barの使い分けが面倒
後者は常にタブ毎消したい訳でもない。
調整したいこと
- diredでの up/downを「[]」でしたい
- viewer-modeの設定をしたい
後者は元々プロジェクト跨ぎのメモ環境(サブエディタ)としてEmacsを使い始めたので自然な気がする。
ところで、bskyのスレッドコピーのやつの調整をやるためにvscodeを立ち上げるのが面倒でhtmlをEmacsで開いて調整しようとした。補完がないのとフォーマットが無いので少し苦労した。
そういえば、スイカゲームでもやろうとしてswitchを充電したけれど、購入したりする以前に触らず放置してしまった
買ったヘッドホンは電源をいれるとノイズキャンセルされるということがわかった。
なんとなくヘッドホンをつけたままお出かけすることにしてみて気づいた。尚ポッドキャスト的なものを外で聞くのは耳へのダメージ的に無理だった。
2024/05/01
そういえば、図による運用が便利な一例に生物学や医学的なものの文章を読むときの関係性の把握があるかも。xxxの機序みたいなやつ。
💭ところでこれは図が便利な話であって頭の中の図を片手で出力できると便利な話ではないな。
emacsの調整
- diredでの登り降りを"[,]"でできるようにした
- kill-bufferをラッピングして
C-u C-x k
のときにはtabも消すようにした - skkのsticky-shiftを利用するようにしてshiftキーを節約するようにしてみる
skkのsticky-shiftは変換のはじまりを大文字の英数字ではなく特定のキーでの入力にできるようにしたもの。たとえば「魔法」と変換したいときに今までは"Mahou"と入力する必要があったがそれが";mahou"などで良くなる。左手の負担を削減してくれるのでは?という期待がある。
(setq skk-sticky-key ";") ; sticky-shiftを使ってshiftキーの節約する
kill-bufferの方は以下のようなすごい雑な定義のもの
(defun my:kill-buffer-with-tab-close-if-need (&optional kill-tab-bar-p)
"C-u C-x C-kの場合にはtabも閉じる"
(interactive (list current-prefix-arg))
(kill-buffer (current-buffer))
(when (not (null kill-tab-bar-p))
(tab-close)
))
(global-set-key (kbd "C-x k") 'my:kill-buffer-with-tab-close-if-need)
そして、自分のinit.elでは設定のグループ毎にprognでくくることをやっていたのだけれど、これは移動せずに設定のグループ全体をevalし直したいからだったんだなー。あんまり徹底できてはいない。
2024/05/02
- 直角直線矢印
- emacsの調整
直角直線矢印
スマホからだと、ファイル名のフルパスが見えなくてテストコードとそれ以外を区別できなくて困った。
emacsの調整
- 現在のタブの表示がわかりづらい
- [bug] emacsclientで新しいタブで開く
現在のタブがわかりづらい
M-x cutomize-group tab-bar-faces
memo.txtが現在のタブ
macはemacs29でmodus-vivendiのthemeを使っているから混乱するのかもしれない。
custom.elが現在のタブ
modus-themeのせいっぽい
M-x list-faces-display
例えば、以下のような感じで変えられるけれど、themeによって変わってきてしまうかも?
(custom-set-faces '(tab-bar-tab-inactive ((t (:inherit tab-bar-tab :background "grey45" :slant italic)))))
bug タブで開くがうまくいかない
emacsclientでタブで開く方法はこれだけだとどうやら現在開いているバッファの位置を吹っ飛ばすかも? add historyの動きが期待した動作じゃない気がする。(未解決)
No more tab back history
が出ることがありそう。
関係ありそうなのはこの辺の関数。
/mnt/wslg/
とかにwslgのログが出るんだな
$ sudo find /mnt/wslg -mmin -30 -not -path '/mnt/wslg/distro
/mnt/wslg/weston.log
/mnt/wslg/runtime-dir
/mnt/wslg/runtime-dir/emacs
ブラウザのタブのピンと同様のことをエディタ上でもやりたい。
2024/05/04
- 打鍵速度 (5 kps (keys per seconds)程度あれば良い)
- Emacsの話
- WSL Ubuntu24.04
Emacsの話
結局、昨日のEmacsのアクティブなタブが分かりにくいというやつは非アクティブなタブに取り消し線を付けることにした( こんな感じ )
Emacsでtheme毎にfontのfaceの扱いが違ってそうだった。この辺どうやると良いのか整理されてない(とはいえWSLの方のEmacsのバージョンを上げれば良いだけでは?)
💭 tab-barのカスタマイズが期待しない挙動になっていてそれでもマージしちゃって使っちゃうし、不完全な設定と付き合ってく感じなんだなーと思ったりした。
そういえば、mermaidのコードとかをスマホからブラウザで読んでるけれど、こういうのをEmacsから読んでも良いのかもな。そしてgo to definitionがしたいとなればlanguage serverが立ち上がって欲しいという気持ちは分かる。
でも常に動いて動作が重たくなってほしくはない。
あと、BPFの本を読みたいと思って読めてないな。あと効率的なgoのやつ。
WSL Ubuntu24.04
private
WSL Ubuntu24.04 · Issue #168 · podhmo/dot-files
やっていることはだいたい
- screen,emacs,make,fonts-noto,golangあたりを入れる
- sshでkeygenしたものをgithubに登録
- ghqを入れる
go install github.com/x-motemen/ghq@latest
- ghq経由でdot-filesのリポジトリをcloneしてきてコピー (
ghq get -p <repo>
)
.bashrc に .bashrc_wslを読み込む行を追加
. ~/.bashrc_wsl
.bashrc_wslは
export PATH=~/go/bin:$PATH
function clip() {
/mnt/c/Windows/system32/clip.exe $@
}
wslの古いやつはしばらく維持しておくか。
> wsl --list
Linux 用 Windows サブシステム ディストリビューション:
Ubuntu-24.04 (既定)
Ubuntu
docker-desktop-data
[!TIP]
ちなみに、インストール可能なdistributionを一覧で表示するのは
wsl --list --online
browse-urlでewwが動いてしまうのが面倒だな。executable-findで見つからないからか。。
テキトーにsymlinkを追加しておく.
$ ln -s $(type -p firefox.exe) ~/.local/bin/firefox
clipも同様の形でやった方が良い?
.localである必要はない気もする
emacsのinit.elのチューニング
Emacs の起動時間を”“詰める”” | Emacs JP
profilerを使ったり eary-init.el に移動したりすると良いのかな?
diff --git a/tiny/init.el b/tiny/init.el
index 650a377..eae973f 100644
--- a/tiny/init.el
+++ b/tiny/init.el
@@ -1,5 +1,7 @@
;;; -*- coding: utf-8; lexical-binding: t -*-
+(require 'profiler)
+(profiler-start 'cpu)
(setq debug-on-error t) ;; enable for debugging
(defun current-directory ()
@@ -458,3 +460,5 @@
;; (package-install 'writeroom-mode) ; -> zen-mode in vscode
;; (package-install 'ddskk-postframe); skk縺ョ螟画鋤蛟呵」懊r濶ッ縺・°繧薙§縺ォ陦ィ遉コ縺励※縺上k
+(profiler-report)
+(profiler-stop)
2024/05/05
- emacsの設定 (dired,view-mode)
emacsの設定 (dired,view-mode)
- view-mode
- text-mode, emacs-lisp-mode以外のときにはview-modeで開くことにした
- view-mode時にはhjklで移動できるようにしたJKでscroll-up/scroll-down
- view-mode時に[でディレクトリをdiredで開くようにした
- view-modeのときにはhl-line-modeが有効になる
- read-onlyのときにはview-modeで開く (e.g.
C-x C-q
)
- dired
- "M-n","M-p" で別windowに開いたバッファをスクロールできるようにした
- ("]"でファイルをother-windowで開く)
- help-mode
- "[", "]" で戻る/進むを使えるようにした
typescript-ts-mode
tree-sitterを使おうとするとエラーが出るかも?
⛔ Warning (treesit): Cannot activate tree-sitter, because language grammar for typescript is unavailable (not-found): (libtree-sitter-typescript libtree-sitter-typescript.0 libtree-sitter-typescript.0.0 libtree-sitter-typescript.so libtree-sitter-typescript.so.0 libtree-sitter-typescript.so.0.0) No such file or directory
⛔ Warning (treesit): Cannot activate tree-sitter, because language grammar for tsx is unavailable (not-found): (libtree-sitter-tsx libtree-sitter-tsx.0 libtree-sitter-tsx.0.0 libtree-sitter-tsx.so libtree-sitter-tsx.so.0 libtree-sitter-tsx.so.0.0) No such file or directory
⛔ Warning (treesit): Cannot activate tree-sitter, because language grammar for typescript is unavailable (not-found): (libtree-sitter-typescript libtree-sitter-typescript.0 libtree-sitter-typescript.0.0 libtree-sitter-typescript.so libtree-sitter-typescript.so.0 libtree-sitter-typescript.so.0.0) No such file or directory
以下のようにすれば良さそう
(push '(typescript "https://github.com/tree-sitter/tree-sitter-typescript" "master" "typescript/src") treesit-language-source-alist)
;; generate tree-sitter/libtree-sitter-typescript.so
(treesit-install-language-grammar 'typescript)
こうすると M-x typescript-ts-mode
が動く
詳細
この辺を見ていくっぽい?
C-h n
でnewsを覗くと以下のようなことが書かれている
Emacs can be built with the tree-sitter parsing library.
This library, together with separate grammar libraries for each
language, provides incremental parsing capabilities for several
popular programming languages and other formatted files. Emacs built
with this library offers major modes, described elsewhere in this
file, that are based on the tree-sitter's parsers. If you have the
tree-sitter library installed, the configure script will automatically
include it in the build; use '--without-tree-sitter' at configure time
to disable that.Emacs modes based on the tree-sitter library require an additional
grammar library for each mode. These grammar libraries provide the
tree-sitter library with language-specific lexical analysis and
parsing capabilities, and are developed separately from the
tree-sitter library itself. If you don't have a grammar library
required by some Emacs major mode, and your distro doesn't provide it
as an installable package, you can compile and install such a library
yourself. Many libraries can be downloaded from the tree-sitter site:https://github.com/tree-sitter
Emacs provides a user command, 'treesit-install-language-grammar',
that automates the download and build process of a grammar library.
It prompts for the language, the URL of the language grammar's VCS
repository, and then uses the installed C/C++ compiler to build the
library and install it.You can also do this manually. To compile such a library after
cloning its Git repository, compile the files "scanner.c" and
"parser.c" (sometimes named "scanner.cc" and "parser.cc") in the "src"
subdirectory of the library's source tree using the C or C++ compiler,
then link these two files into a shared library named
"libtree-sitter-LANG.so" ("libtree-sitter-LANG.dll" on MS-Windows,
"libtree-sitter-LANG.dylib" on macOS), where LANG is the name of the
language supported by the grammar as it is expected by the Emacs major
mode (for example, "c" for 'c-ts-mode', "cpp" for 'c++-ts-mode',
"python" for 'python-ts-mode', etc.). Then place the shared library
you've built in the same directory where you keep the other shared
libraries used by Emacs, or in the "tree-sitter" subdirectory of your
'user-emacs-directory', or in a directory mentioned in the variable
'treesit-extra-load-path'.You only need to install language grammar libraries required by the
Emacs modes you will use, as Emacs loads these libraries only when the
corresponding mode is turned on in some buffer for the first time in
an Emacs session.We generally recommend to use the latest versions of grammar libraries
available from their sites, as these libraries are in constant
development and occasionally add features and fix important bugs to
follow the advances in the programming languages they support.
2024-05-08
- トラックボール型のマウスを買った
トラックボール型のマウスを買った
ノートPCのタッチパネルを無効にしてみた。トラックボールマウスを買ってみた(無線のものにしたけれどbluetoothのほうが良かったかもしれない)左手用のもののほうが置き場所的には邪魔にならなそうだったけれど右手用のものしかなかった。まぁいいか。
元々、エディタなどで文字を入力している時に誤ってタッチパネルを触ってしまいカーソル移動や右クリックが発生してしまっていた。これがなくなると良い気がする。設定でタッチパネルをオフにしてみた。無線が動かないタイミングではマウスが動かなくなるんだろうか?
Mastering Emacsという本があるらしい
気になること
- emojiの入力をできるようにする
- emacsclient経由でタブで開くemacs29対応
- skkのsticky inputになれる
2024-05-11
- x/twitterの内容をclipboardに保存したい
💭 トラックボール型のマウスにしてノートPCのタッチパネルを無効にした弊害として仮想ディスプレイの移動などにも問題がでるみたい。
x/twitterの内容をclipboardに保存したい
スレッドの場合はこんな感じで良さそう
let text = Array.from($$("main article [data-testid=tweetText]")).map((x) => x.textContent).join("\n\n"); copy(text)
- https://twitter.com/podhmo/ のようなユーザーTLは対応できてなかった
-
copy()
ではなくnavigator.clipboard.writeText()
を利用した方が良さそう - :though_balloon: 本当はスマホでも利用したい
- :memo: 長いスレッドには非対応 (virtual list的な形でDOMには格納されているため)
深さとかを気にせずやるにはこんな感じか。
buf = []; $$("main section[role=region] article").forEach((x) => { let tmp = []; Array.from( x.querySelectorAll("[data-testid=tweetText]")).forEach((e) => { e.style.backgroundColor = "green"; tmp.push(e.textContent);}); buf.push(tmp)}); text = buf.map((xs) => xs.map((x) => "> ".concat(x.split("\n").join("\n> ")))).join("\n\n-----\n\n"); copy(text);
どこまでのコピーかわからないのが不便かも。ということで色を付けた。引用があると面倒。
順序を反転
buf = []; $$("main section[role=region] article").forEach((x) => { let tmp = []; Array.from( x.querySelectorAll("[data-testid=tweetText]")).forEach((e) => { e.style.backgroundColor = "green"; tmp.push(e.textContent);}); buf.push(tmp)}); text = buf.toReversed().map((xs) => xs.toReversed().map((x) => "> ".concat(x.split("\n").join("\n> ")))).join("\n\n-----\n\n"); copy(text);
bookmarklet
途中までしか取れないけれど、スマホでも使いたい場合があるかも?。ブックマークレットにしたら動くんだろうか。
なんかうまくリンクにできないや。。
javascript:var buf=[];document.querySelectorAll("main section[role=region] article").forEach((x)=>{let tmp=[];Array.from(x.querySelectorAll("[data-testid=tweetText]")).forEach((e)=>{e.style.backgroundColor="green";tmp.push(e.textContent);});buf.push(tmp)});text=buf.map((xs)=> xs.map((x)=> "> ".concat(x.split("\n").join("\n> ")))).join("\n\n-----\n\n");navigator.clipboard.writeText(text);
bookmarkletがわかっていないかもしれない
<details>
javascript:alert("hello");
これでクリップボードにコピーできる。
javascript:navigator.clipboard.writeText("hello");
letだとおこられるのか。varにしておく。
javascript:var text = document.querySelector("main section[role=region] article [data-testid=tweetText]").textContent; alert(text);
$$()
をdocument.querySelectorAllにしないとだめか。
javascript:var buf=[];document.querySelectorAll("main section[role=region] article").forEach((x)=>{let tmp=[];Array.from(x.querySelectorAll("[data-testid=tweetText]")).forEach((e)=>{e.style.backgroundColor="green";tmp.push(e.textContent);});buf.push(tmp)});text=buf.map((xs)=> xs.map((x)=> "> ".concat(x.split("\n").join("\n> ")))).join("\n\n-----\n\n");alert(text);
[bookmarkletに](javascript:var buf=[];document.querySelectorAll("main section[role=region] article").forEach((x)=>{let tmp=[];Array.from(x.querySelectorAll("[data-testid=tweetText]")).forEach((e)=>{e.style.backgroundColor="green";tmp.push(e.textContent);});buf.push(tmp)});text=buf.map((xs)=> xs.map((x)=> "> ".concat(x.split("\n").join("\n> ")))).join("\n\n-----\n\n");navigator.clipboard.writeText(text);)
</details>
なんか無名関数をうまくbookmarklet上で動かせなくなったりしてめんどくさくなってた。別にワンライナーで書く必要もないのだけれど。。
スマホでは無理だった。悲しい。。
拡張にしたり何なりとかはもはやパッケージングと配布の範囲でめんどくさい。。
2024-05-12
- emacs skk経由でemojiが入力できるようにする
- ubuntu python pipxが利用できるようにする
- skkの辞書をUTF-8にする
- emacs emacsclientでtab-barのタブで開く
emacs skk emoji
↑のようなページを利用して雑に登録できるようにする。辞書を作っても良いのかもしれない。
文字 | 入力 |
---|---|
💭 | /thought |
📝 | /memo |
📝 euc-jpの辞書でも問題なく保存できるのか memo / /
(追記:これは嘘だった。emacsを再起動したら壊れた模様)
追記
辞書を用意してくれている人もいるみたい
追記
テキトーに一覧を作った
ubuntu python
systemのpython的なものをインストールしてとりあえずpipxだけ使えるようにしたい。ubuntuはなんかパッケージが特殊だった気がする。
$ sudo apt install python3 python3-venv
$ sudo apt install --no-install-recommends python3-pip
余分なパッケージもインストールされそうだったので --no-install-recommends
を付けて作業することにする。
この辺が入る
$ apt depends python3-pip
python3-pip
Depends: ca-certificates
Depends: python3-setuptools
Depends: python3-wheel
Depends: <python3:any>
python3
Breaks: <python-pip>
Recommends: build-essential
Recommends: python3-dev (>= 3.2)
Replaces: <python-pip>
危険そうだけどpipxだけはやっちゃって良いか。
$ python3 -m pip install --user pipx --break-system-packages
$ which pipx
/home/po/.local/bin/pipx
ubuntu deno
snapを使うのが楽なんだろうか?
$ sudo snap install deno
$ which deno
/snap/bin/deno
$ deno --version
deno 1.40.3 (release, x86_64-unknown-linux-gnu)
v8 12.1.285.6
typescript 5.3.3
skk辞書をUTF-8にする
手元の個人用辞書を変換する
$ cp .skk-jisyo{,.bak}
$ iconv -f EUC-JP -t UTF-8 -o .skk-jisyo.utf-8 .skk-jisyo
$ file .skk-jisyo.utf-8
.skk-jisyo.utf-8: Unicode text, UTF-8 text
$ mv .skk-jisyo{.utf-8,}
# $ rm .skk-jisyo.utf-8
encodingを変えとく。
(setq skk-jisyo-code "utf-8")
(未解決) ubuntuのaptでいれたddskkの辞書も変える
あと既存の辞書を変更しておく。設定ファイルの在処がわからなかった。
$ dpkg-query --listfiles ddskk | grep /etc
/etc/emacs/site-start.d/50ddskk.el
50ddskk.elがインストールされることで起動時にskkが使えるようになっているみたい。
/usr/share/skk/SKK-JISYO.cdb
をきにするかんじのもよう。
;;; 50ddskk.el --- Debian ddskk startup file -*-mode: emacs-lisp;-*-
;;; Code:
(let* ((flavor-name (if (boundp 'debian-emacs-flavor)
(symbol-name debian-emacs-flavor)
"emacs"))
(lispdir (concat "/usr/share/" flavor-name "/site-lisp/ddskk")))
(when (and (featurep 'mule) (file-exists-p (concat lispdir "/skk.elc")))
(if (fboundp 'debian-pkg-add-load-path-item)
(debian-pkg-add-load-path-item lispdir)
(setq load-path (cons lispdir load-path)))
;; Load ddskk's skk-autoloads instead of the others.
(load (concat lispdir "/skk-autoloads.elc") 'noerror 'nomessage)
(require 'skk-setup)
(add-hook 'minibuffer-setup-hook
(function (lambda ()
(and (boundp 'skk-henkan-okuri-strictly)
skk-henkan-okuri-strictly
(not (eq last-command 'skk-purge-jisyo))
(put 'skk-henkan-okuri-strictly 'temporary-nil t)
(setq skk-henkan-okuri-strictly nil)))))
(add-hook 'minibuffer-exit-hook
(function (lambda ()
(and (get 'skk-henkan-okuri-strictly 'temporary-nil)
(setq skk-henkan-okuri-strictly t)
(put 'skk-henkan-okuri-strictly 'temporary-nil nil)))))
(defalias 'skk-toggle-kana 'skk-toggle-characters)
(setq skk-server-host (or (getenv "SKKSERVER") "127.0.0.1"))
(if (file-exists-p "/usr/share/skk/SKK-JISYO.cdb")
(setq skk-cdb-large-jisyo "/usr/share/skk/SKK-JISYO.cdb"))
;;(setq skk-large-jisyo "/usr/share/skk/SKK-JISYO")
(setq skk-tut-file "/usr/share/skk/SKK.tut")
;;
))
;;; 50ddskk.el ends here
どうも/usr/share以下にあるみたい。どうやってつくられてるんだろ?
$ dpkg-query --listfiles skkdic-cdb | grep /usr/share/skk
/usr/share/skk
/usr/share/skk/SKK-JISYO.L.cdb
なんか特に変える必要はなかった
/usr/share/skk/SKK-JISYO.L.cdb
emacsclientでtab-barのタブで開く
tab-bar-history-modeで登録されるhistoryが個々のタブ毎に別なようだった。
まだ時折現在のタブが消える場合がある?
;; emacsclientでは常にnew-tabでファイルを開く
(tab-bar-history-mode 1)
(defun my:find-file-with-tab-bar--server-visit-hook ()
(run-with-timer
0.1 nil
(lambda (buf)
(message "## new-tab %s" buf)
(tab-bar-history-back)
(switch-to-buffer-other-tab buf)
)
(current-buffer)
)
)
(add-hook 'server-visit-hook 'my:find-file-with-tab-bar--server-visit-hook)
こういうの眺める習慣はないな
全体を何となく眺めてみたらEmacsのことばかりな気がする。やっぱり過去の形跡に現在が引きづられるんだろうか?
2024-05-13
充電したswitchを20日かけてようやく起動した(気力ガチャ)
- スイカゲーム
- マイクラ
それぞれ少しだけやった(日記)
「寝転ぶ、座る、立つ、運動」の辛さが普通の人より1段階左にズレていそう。歩くより立ち続けてる方が疲れるかもしれない。
2024-05-14
- Emacs TypeScript
Emacs TypeScript
- treesitterの設定が不足しているかも?
- auto-mode-alistへの登録
- 上手くonlyでview-modeに切り替わらない
- view-mode中の場合ctr-jが機能しない
- go-to-definition/go-to-referenceが欲しくなる
- global-tab-line-modeを有効にしたほうが便利かも?
- 特にファイルが少ないときは
- new-frameを上手く使っていく?
- やっぱりemacscientでの起動がうまくできない
- terminalと遷移が連動してない
2024-05-15
- Emacsの設定を調整
実はtab-bar-modeは現状の使い方では不要でtab-line-modeだけあれば良いのかもしれない。
(new-frameして分けられたらそれで良い)
細々とした調整
- ✅ view-modeでもctrl-jをつかえるようにする
- ✅ skk-modeの最中にctrl-jの代わりにctrl-JやM-jが使えるようにする
tab-line-modeを使ってみる
tab-line-modeを使ってみると良いかもしれない。ファイルの移動自体は以下のような感じでできそう。
(defun my:tab-line-tabs-window-buffers ()
"fileを持つものだけを対象にしたbufferを集める"
(sort
(seq-remove (lambda (b) (null (buffer-file-name b)))
(buffer-list))
(lambda (x y) (string< (buffer-name x) (buffer-name y)))))
(setq tab-line-tabs-function 'my:tab-line-tabs-window-buffers)
(setq my:tab-line-switch-to-buffer-function 'switch-to-buffer)
(defun my:tab-line-next-tab ()
"tab-lineの表示にしたがった場合の次のタブに移動"
(interactive)
(funcall my:tab-line-switch-to-buffer-function
(buffer-name
(cl-block :b
(let ((current-buf (current-buffer))
(buffers (funcall tab-line-tabs-function))
(foundp nil))
(cl-dolist (b buffers)
(when foundp
(cl-return-from :b b))
(when (equal current-buf b)
(setq foundp t)))
(cl-return-from :b (car buffers)))))))
(defun my:tab-line-prev-tab ()
"tab-lineの表示にしたがった場合の前のタブに移動"
(interactive)
(funcall my:tab-line-switch-to-buffer-function
(buffer-name
(cl-block :b
(let ((current-buf (current-buffer))
(buffers (funcall tab-line-tabs-function))
(prev-buf nil))
(cl-dolist (b buffers)
(when (equal current-buf b)
(cl-return-from :b
(or prev-buf (car (last buffers)))))
(setq prev-buf b)))))))
やっぱりtab-bar- modeですすめたい
tab-barでうまく行っていない理由はframe毎にhistoryを持つせいのようだ。
- tab-bar-history-modeはtab毎にhistoryを持っている(?)
- tab-bar-history-modeはtabの変更時だけではなくwindow configurationの変更時にもhistoryを更新する
この辺の挙動が期待とは異なっているみたい
2024-05-16
- なんとなくしたいあるいはした方が良いこと
- emacs frameの利用
そういえば、git grep
したファイルを開きたくなったりしたのだった。
ターミナル上でやるとURLはクリック可能だけれどファイルが無理。
とはいえすべてをエディタでやるのは苦痛なのだった(エディタ上でのターミナルは苦手)
なんとなくしたいあるいはした方が良いこと
- kamidanaの環境をモダンなかんじに更新(+昨今のpythonのツールチェインの学習)
- reflect-shapeを直す(+goのバイナリレイアウトを知りたい)
- mermaidの図で直角直線を使えるようにする (d3あたりの情報把握 + PR?)
- マルチプロジェクト用のサブエディタとしてのEmacsの環境調整 (現在これがメインで進んでいそう)
- (dictknife with deno)
- (openaAPI simplifer)
💭ただなんとなく「役に立たないこと」をやったほうが良いきがする。あと楽しさがあったほうが良いかんじ。
例えば「スイカゲーム」をやるとか「マイクラの整地」とかそういうもの?
💭脳死で作業できるようなものがあると良いきがしている
📝現状ではゲームの起動も成功できたら嬉しいみたいな状態(精神的なコストが重め)
スマホ、タブレット、PCでできることとできないことを整理していたりしていた。
なんとなくopenAPIとかapi docがバカバカしくなったのはIDLみたいなのものを用意するのではなく直接コードが存在すれば良いじゃんみたいな感じのことを思ったりしがちだったので (tsならRSCとかc#ならmagiconionとか)あとdoc stringが親切でもあんまり嬉しくないとか。
というわけで一旦そういう作業から離れてみると良いのかもと思ったのだった。
cloudflare workerとか?何らかのuiだとかcreative coding的なことだとか
💭なんかどうでも良いことをつぶやく場所になってしまった。今日の内容必要?
emacs frameの利用
tab-barに固執しない方針。
-
C-x 5 2
でmake-frame-command - frameを分けてその中で作業をすると良いかもしれない(プロジェクトごとに開く)
- ファイルはそれほど開かないのだからtab-line-modeで十分
まだこれの利用に踏ん切りがついていない。あとプロジェクト毎に開くならvscodeと見た目はおんなじになる?まぁ起動が重たいからマルチプロジェクトが嫌という意味合いはあった。ui的な意味でも混ぜて表示したいということはあるんだろうか?
github issueとの連携は M-x browse-github-url
とかが便利だった(自作)。
あと、テーブルの作成用にdictknifeを使った(別プロセスに選択範囲を渡す)がそもそもuiがあれば良いという話はある例えばorg-modeを利用だとかの場合はそうなる。
2024-05-18
- mermaidの図ではなくmermaidの図を埋め込んだドキュメントを手軽に作りたい
- スマホから少しずつ部分的に作っていきたい
mermaidの図ではなくmermaidの図を埋め込んだドキュメントを手軽に作りたい
Emacs上でもmermaidの図が表示したくなった。
- org-mode + exporter
- markdown-modeを拡張する
- 別途markdownのviewerを動かす + HMR
最後が一番キレイな気がした。最初の方もEmacsに振り切るならありなのかもしれない。
ローカルで動くいい感じのviewerが欲しい。
でもローカルでなんとなく覗いたときに画像として表示されてて欲しい気がする
あるいはvscodeでやる
HMRというかファイル監視とブラウザリロードで良いんだろうか?
ファイル監視が勝手に動くと面倒な気もする。
フォーマッターの設定と同様に
- 自動でファイルは更新される
- C-x C-sにbuild and reloadをバインドする
- (↑の実行は無駄なシグナルが省略されて動く)
というか、こういう操作を抽象化したdaemonが欲しい気がする…
あるいはobsidianで良い気もする
スマホから少しずつ部分的に作っていきたい
mermaidの図をここに載せるあるいはgithub issueに載せるではなんでだめなんだろうか?
PCを常に開ければテキストエディタ上でやるのが一番良い。
書くときにはスマホで断片を出力していきたい(例えばこのscrapsのuiのように)。
Emacsでのmermaidの表示は見るときの話な気がする。書くときにはスマホからも触れると良い。
- 見るとき
- 書くとき
そしてmermaidのコードはさすがにスマホからでは記述し辛い。
それ専用のuiを作るには作りたい図が明確ではない。
このスマホ用の文法を作るというのに戻ってくるのか…
図を作るときはchatgpt的とは言わないけれど、jupyper notebook的と言っても良いかもだけど、複数の入力と応答が連なって表示されるようなuiの方が嬉しそう。見比べたい。
でもデプロイが必要なアプリは作りたくないな。
2024-05-20
- dartにマクロが
dartにマクロが
v3.4で入ったらしい
用例としてdataclassが挙げられてる。宣言的ではなく命令的なマクロらしい。
まだ実験的。
Macros are still under development, so that's as much detail we can go into for now. If you're curious, or would like to try it yourself behind an experimental flag, the best guidance is to take a look at the implementation of exisiting macros:
- Check out the definition of the JsonCodable macro,
- Or any of the examples available in the language repo.
どう使うかはexamplesとかをみると良さそう。
JSON
こういうのが多い
macro class DataClass implements ClassDeclarationsMacro, ClassDefinitionMacro {
const DataClass();
以下が分かってない
- class declaration
- class definition
dataclassのtostring部分の定義を見ると分かりそう。普通にシンボルの定義と本体の定義っぽい。まんま宣言と定義でなるほどという感じ。
なんか取り出してallFieldsとかやってるし感覚的にはPythonでのメタクラスやクラスデコレータでの作業の静的版がユースケースそう。いわゆるlispのマクロみたいに実行コードを膨らませる感じのマクロではなく定義を膨らませる感じそう(後者もlispにあるけれど)
実行結果の確認とか手軽にやる方法があるんだろうか?
ちなみにreadmeとかはないに等しかった(Comming soon!だけ)。
JSON中の表示
- "\n\t" が混ざったJSONを読みやすく変換したいかも?
2024-05-22
- 気になる本
2024-05-23
- スマホでメモ
スマホでメモ
失敗したテストを集めたい (go)
github actionsで
# github actions
function go_failed(){ # need <run id>
# https://github.com/<org>/<project>/actions/runs/<run id>/job/<job id>?pr=<pr id>
gh run view $1 --log-failed | grep FAIL | ruby -ne 'puts $_.sub(/^.*FAIL/, "FAIL")'
}
パッケージだけ知りたい場合には
$ go_failed <run id> | grep -v "FAIL:"
2024-05-26
- windowsでカーソル移動が遅い
windowsでカーソル移動が遅い
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Control Panel\Accessibility\Keyboard Response]
"AutoRepeatDelay"="200"
"AutoRepeatRate"="6"
"DelayBeforeAcceptance"="0"
"Flags"="27"
このflagsってどういう意味なんだろうな?
これのflagsの説明はそれっぽいけれどどこにそのことが書かれているかはわからない
Windowsでキーボードのリピート速度を調整するためのレジストリキー HKEY_CURRENT_USER\Control Panel\Accessibility\Keyboard Response
には、キーボードの応答性に関する設定が含まれています。各設定の意味は以下の通りです。
主なレジストリキーとその意味
-
AutoRepeatDelay
- 意味: キーを押してからリピートが始まるまでの待機時間をミリ秒単位で設定します。例えば、この値が 500 に設定されている場合、キーを押してから0.5秒後にキーのリピートが開始されます。
- 値の範囲: 通常は 0 から 1000 ミリ秒の範囲で設定します。
-
AutoRepeatRate
- 意味: リピートが始まった後のリピート速度をミリ秒単位で設定します。例えば、この値が 50 に設定されている場合、キーが 50 ミリ秒ごとにリピートされます。
- 値の範囲: 通常は 0 から 100 ミリ秒の範囲で設定します。
-
BounceTime
- 意味: キーが押されたと認識される間隔をミリ秒単位で設定します。この設定は、キーが跳ね返る(bounce)ことによって誤って複数回認識されるのを防ぐためのものです。
- 値の範囲: 通常は 0 から 1000 ミリ秒の範囲で設定します。
-
DelayBeforeAcceptance
- 意味: キー入力を受け入れる前に待つ時間をミリ秒単位で設定します。この設定は、キーが意図せずに押された場合に入力を防ぐためのものです。
- 値の範囲: 通常は 0 から 1000 ミリ秒の範囲で設定します。
-
Flags
-
意味: キーボードの応答性に関する設定を有効または無効にするためのビットフラグです。各ビットの意味は以下の通りです。
- Bit 0 (1): AutoRepeat を有効にする
- Bit 1 (2): Delay Before Acceptance を有効にする
- Bit 2 (4): Bounce Keys を有効にする
- Bit 3 (8): Sticky Keys を有効にする
- Bit 4 (16): Mouse Keys を有効にする
- Bit 5 (32): Toggle Keys を有効にする
例えば、
Flags
の値が3
の場合、これは AutoRepeat(ビット0)と Delay Before Acceptance(ビット1)が有効になっていることを意味します。 -
意味: キーボードの応答性に関する設定を有効または無効にするためのビットフラグです。各ビットの意味は以下の通りです。
設定の例
以下はキーボードのリピート速度を早くするための設定例です。
[HKEY_CURRENT_USER\Control Panel\Accessibility\Keyboard Response]
"AutoRepeatDelay"="250"
"AutoRepeatRate"="20"
"BounceTime"="0"
"DelayBeforeAcceptance"="0"
"Flags"="1"
この設定では、キーを押してから 250 ミリ秒後にリピートが開始され、20 ミリ秒ごとにリピートされます。また、BounceTime と DelayBeforeAcceptance は無効に設定されており、AutoRepeat が有効になっています。
これらの設定を変更することで、キーボードの応答性を自分の好みに合わせて調整することができます。設定を変更した後、システムを再起動するか、ログオフして再ログインすることで変更が反映されます。
2024/05/29
emacs
実は /tmp は常に保存される方が嬉しいのかもしれない。
ファイルを開いた時にサイズが大きい時には保存されない方が嬉しいかもしれない。
一行目が長い場合にはfundamendal modeで開いた方が嬉しいのかもしれない。
kill-ringを複数保存してそれを利用するというような機能をそういえばhelm/anything経由で使っていた。
goのstack traceを楽に読みやすく
emacsなどからクリップボードに入れたい。
vscode
vscodeのbiomeのextensionを特定のプロジェクトのときだけ動かしたいとかができてない気がする(たぶん自分の設定の問題)
追記: extensionにdisable workspaceってあるな。これでいけるかも?
なんか~/.vscode/extensionsを削除したらdisable workspaceを選べなくなった。
.code-workspace というのがわからない。
open folderし直したらいけた。
2024-05-30
- vscode key bindings
- emacs
M-|
shell-command-on-region
vscode keybord shortcutsが全部吹っ飛んだ
~/.vscode/extensions消しただけで吹っ飛ぶ?
後でほしいものを書く
ctrl + s => find
(findのダイアログが開いた状態で) ctrl + s => find next
(findのダイアログが開いた状態で) ctrl + r => find previous
ctrl + v => scroll down
ctrl + y => yank (clipboardと同期)
ctrl + SPC => region active
普通にkey map extensionを入れ忘れてただけだった
M-|
shell-command-on-region
defaultでは *Messages*
bufferに送信される。これを clipboardにコピーしたい。
cl-letfが使えるかもしれない。
;; cl-letfを利用すれば内部の関数の呼び出しをすげかえる
(defun my:hello ()
(message "hello %s" "world"))
;; これは単に *Messages* bufferに出力するだけ
(my:hello)
;; これは kill-ring に追加もしてくれる
(cl-letf ((original-message (symbol-function 'message))
((symbol-function 'message)
(lambda (x &rest args)
(let ((text (apply 'format (cons x args))))
(funcall original-message text)
(kill-new text)
text))))
(my:hello))
こんな感じ?
(setq my:original-message-function (symbol-function 'message))
(defun my:shell-command-on-region-with-kill-new (start end command &optional output-buffer replace error-buffer display-error-buffer region-noncontiguous-p)
"`shell-command-on-region'のkill-ringに追加する版"
;; ここはshell-command-on-regionのinteractiveのコードそのまま
(interactive (let (string)
(unless (mark)
(user-error "The mark is not set now, so there is no region"))
(setq string (read-shell-command "Shell command on region: "))
(list (region-beginning) (region-end) string current-prefix-arg current-prefix-arg shell-command-default-error-buffer t (region-noncontiguous-p))))
;; message関数をすげかえるhack
(cl-letf (((symbol-function 'message)
(lambda (x &rest args)
(let ((text (apply 'format (cons x args))))
(apply my:original-message-function (cons x args))
(kill-new text)))))
(shell-command-on-region start end command output-buffer replace error-buffer display-error-buffer region-noncontiguous-p)))
なぜかこういうメッセージが出たので外側でsetq
let: Symbol’s value as variable is void: original-message
いや、一番外側でletで囲めば良いだけか。
(let ((original-message ...))
(defun my:... () ...))
追記 (2024-06-12)
↑の実装では以下の問題があった
-
C-u M-|
時の置換のときにあまり嬉しくない - 長い出力のときに適切に出力結果がkill-ringに入らない
2024-06-05
2024-06-09
- ネストに強い出力用の記述が欲しい
ネストに強い出力用の記述が欲しい
何かを入力として受け取りネストに強い出力をしたい。結局テキストのテンプレートエンジンだとかゆいところに手が届かない。ついでにシングルバイナリにできると嬉しい。
昔pythonでライブラリを書いていたのだけど似たような物が欲しい(こちらはwith構文を多用していたが高階関数でも構わない)。
goは無名関数の型が省略できないのであんまり嬉しくない。
無名関数の引数の型を省略できて(推論されて)生成されたバイナリの起動速度が早い言語を探してたのだった。後で探そう。
言語の書き味としてはKotlinが良さそうではある
(あとたしかKotlin Nativeとかあった記憶。コンパイル速度も速い方が良い)
可能ならast-grepというかtree-sitterと手軽に連携できると嬉しい。
候補
- kotlin
- dart
- rust
- scala
いやもっと単純に以下でも良い気がする
- c#
- typescript (with deno bun)
もちろんocamlとかそういうのでも良いのだけど。こうなってくるとポータビリティ的な意味での手軽さの方が大切かも。
もう少し用途を詰めたほうが良いかも。
(あと楽しさ)
2024-06-09
- Emacsで気になること
2024-06-12
- emacs
- 最初の1行が長いファイルを開いたときに固まる
-
M-|
の挙動がうまきいっていなかった
- WSL上でのbashの補完が遅い
emacsで巨大な1行のJSONファイルを開く
普通に開くとsyntax highlightで死ぬ。fundamental modeかtext-modeで開きたい。
いや、それ以外のところで時間がかかっているかも?
どうもline-modeくさい(ウソ)
候補
- skk
- line-mode
- json-mode
- advice (next-line)
うーん emacs -q
で起動しても重いな。
📝vimでも重い
import json
doc = d = {}
for i in range(1000):
k = str(i)
d[k] = {}
d = d[k]
print(json.dumps(doc))
たかだか C-x l
でPage has 131 lines (0 + 131) であっても遅い。
emacs M-| での整形後の出力をkill-ringに追加
↑の以前の方法では出力が長くなった場合には上手くいかないらしい。
*Shell Command Output*
の方に出力される shell-command-buffer-name
bun (js)
どちらが良いんだろうな
snap install bun-js
curl -fsSL https://bun.sh/install | bash -ux
後者はbunのサイトに載っている方法で ~/.bun/bin/bun
という感じにインストールされるらしい。
WSL上のbashの補完が遅い
$PATH
に /mnt
から始まるパスが含まれているせいかも。
windows側にアクセスしようとすると極端に遅くなる。scoopなどでインストールしてたりする部分があるからかもしれない?
こんな感じの.bashrc的なものを書いてあげると良いかも?
# windows側を補完でみると遅いので
WIN_PATH="$(echo $PATH | tr : "\n" | grep "^/mnt" | tr "\n" ":")"
export PATH="$(echo $PATH | sed "s@$WIN_PATH@@")"
export WIN_PATH=${WIN_PATH%:}
windows側のコマンドを利用している部分
clipとかは ln -s しているのだっけ? .local/bin/pbcopy -> /mnt/c/WINDOWS/system32/clip.exe
この辺で type -p
を使っている。
それ用にパスを探したい場合にはこんな感じで探す
$ PATH=$PATH:$WIN_PATH bash -c "type -p notepad.exe"
/mnt/c/WINDOWS/system32/notepad.exe
適切なやり方はwsl.confで設定する感じっぽい。
[interop]
appendWindowsPath = false
でもたまにWIN_PATHを利用したくなるしな…
Emacs上での補完も早くなる?
e.g. M-| などでのread-shell-stringとか
2024-06-17
久しぶりに.bashrc_wslを触ったらvimの操作を忘れてた範囲選択をしてインデントがしたかったが手が動かなかった。
操作 | 説明 |
---|---|
範囲選択してインデント | shift + v した後jjなどして > |
undo | u |
redo | ctrl + r |
emacs上ならもちろん覚えていて範囲選択しctrl + u 2, ctrl + x ,ctrl + i みたいな感じ
2024-06-19
考えてみると、vscodeでswitch to buffer的なことはどうすれば良いんだろう。
開いてるタブに限らずfuzzy findで探すみたいなことはしてる
2024-06-26
- goのiterを真面目に考える
- シリアライズとループと再開から…
- go pluginsとか使ってreplつくれない?
go/iter
ちょっと自分でも真面目に考えてみたい。
💭 Seqは概ねlinqでより強く言えばmap。実質ほとんどSeq2になるのでは?感がある。
雑な箇条書きのメモ
- 内部イテレーター/外部イテレーター
- 高階関数とRubyのblock
- 無名関数亡き頃scheme
- GoFのは外部イテレーター
- 高階関数とRubyのblock
- iterがない頃
- slicesかchannel
- メモリーが問題
- channelは難しい
- slicesかchannel
- いわゆるpythonのジェネレーター
- send抜き
- SeqとSeq2
- Seqはほとんどmap
- エラーハンドリングのためのSeq2
- mapに対するk,vとかは誤差
- パニックは?
- (スキップしたい場合も)
- 内部イテレーター
- 後片付けを忘れずにできる
- 中断はできるが再開ができない
- 高階関数では合成できない
- PullとPull2
- 外部イテレーターに変換
- 再開ができる
- 利用例
- merge cat
- 複数のイテレーターを比較しつつ先頭から取り出す
- merge cat
- channelと組み合わせる
- errgroupに値を持たせる
- slicesで受け取ると嬉しくない
- ループで受け取れる終了をまたずに次に行ける
- キャンセル対応は?
- ループで受け取れる終了をまたずに次に行ける
- channelでも良いのでは?
- そうかな?そうかも…
- 例えば、クロウラーのようなもので力を発揮
- 無名関数を使うとシリアライズできない
- slicesで受け取ると嬉しくない
- タスクを追加するようなタスクはどうする?
- 単に2重ループにすれば良いだけそう
- errgroupに値を持たせる
説明は丁寧で一次情報へのリンクがあるので便利な記事
(もっと使用感によった記事を書きたい)
シリアライズとループと再開
無名関数を使うとシリアライズできない
gobか何かにして保存したり。
そもそもメッセージキューにしたり.
goのrepl
既存のやつは再コンパイルとかされて辛い。状態を持ちたい。importとか自由にしたい。
LinuxとMacだけで動けば十分な気がする。
go pluginsはどちら側で実行されるんだろ?
docstringとかも触りたい
ネストした場合とかどうなるんだろ?
ライブラリ単位で分割する必要がある?(ビルドキャッシュとか使えないんだろうか?)
$ go build -a -gcflags="-dynlink" std cmd
追記
dlopenしてる
追記
現状抱えてる疑問
- 状態というか複雑な値をプラグインに渡して壊れないか?
- 複数のプラグインから使われてるライブラリが同じバイナリを共有してくれるか?(ネスト)
- replから動的な実行を考えたときにastパースしないとダメかもそれはそう。
- goのbuild cacheを上手く使えないか?
これはgoのものをc経由で他の言語に公開するもの
こういうのたまに集めるけど結局読まないよな
2024-07-07
2024/07/11
- goのmethodの情報が欲しい
- gomacro
methodの情報
😩 go:linkname が使えなくなった。つまりruntime/symtab.goの内容が覗けなくなった。
file:<autogenerated>
rv: 0xeb66ce0, ptr: eb66ce0, entry: eb66ce0, rfunc: main.Hello, file:/Users/me/_sandbox/pick/main.go
Hello
rv: 0xeb66d40, ptr: eb66d40, entry: eb66d40, rfunc: main.(*O).Hello-fm, file:<autogenerated>
Hello
package main
import (
"fmt"
"reflect"
"runtime"
)
func main() {
{
fn := Hello
rv := reflect.ValueOf(fn)
ptr := rv.Pointer()
rfunc := runtime.FuncForPC(ptr)
filename, _ := rfunc.FileLine(rfunc.Entry())
fmt.Printf("rv: %+v, ptr: %x, entry: %x, rfunc: %+v, file:%v\n", rv, ptr, rfunc.Entry(), rfunc.Name(), filename)
fn()
}
{
fn := (&O{}).Hello
rv := reflect.ValueOf(fn)
ptr := rv.Pointer()
rfunc := runtime.FuncForPC(ptr)
filename, _ := rfunc.FileLine(rfunc.Entry())
fmt.Printf("rv: %+v, ptr: %x, entry: %x, rfunc: %+v, file:%v\n", rv, ptr, rfunc.Entry(), rfunc.Name(), filename)
fn()
}
}
func Hello() {
fmt.Println("Hello")
}
type O struct{}
func (o *O) Hello() {
fmt.Println("Hello")
}
go tool nm
, go tool objdump
あたりを覗いていく必要がある?
現在実行中のバイナリを知ることってできたっけ?
$ go tool nm /tmp/gobin/xxx | grep main
113f880 D go:main.inittasks
108ed40 T main.(*O).Hello-fm
108ece0 T main.Hello
108e7e0 T main.main
1034ae0 T runtime.main
105d000 T runtime.main.func1
1034f00 T runtime.main.func2
10cf368 R runtime.mainPC
11a83f1 B runtime.mainStarted
1148830 B runtime.main_init_done
go tool objdump -S -s main /tmp/gobin/xxx
とかは省略
$ go tool objdump -s main\. /tmp/gobin/xxx | grep '^TEXT'
TEXT runtime.main.func2(SB) /usr/local/Cellar/go/1.22.1/libexec/src/runtime/proc.go
TEXT runtime.main.func1(SB) /usr/local/Cellar/go/1.22.1/libexec/src/runtime/proc.go
TEXT main.main(SB) /Users/me/go/src/_sandbox/pick/main.go
TEXT main.Hello(SB) /Users/me/go/src/_sandbox/pick/main.go
TEXT main.(*O).Hello-fm(SB) <autogenerated>
どちらも cmd/internal/objfile に依存していた
最悪debug.gosymとかで開き直す?
ここで
- __gosymtab -- goのsymbol table
- __gopclntab -- goのPC/line table
$ objdump --section-headers /tmp/gobin/xxx
/tmp/gobin/xxx: file format mach-o 64-bit x86-64
Sections:
Idx Name Size VMA Type
0 __text 0008ddb9 0000000001001000 TEXT
1 __symbol_stub1 00000126 000000000108edc0 TEXT
2 __rodata 000232d6 000000000108ef00 DATA
3 __rodata 0001d820 00000000010b3000 DATA
4 __typelink 00000608 00000000010d0820 DATA
5 __itablink 00000070 00000000010d0e40 DATA
6 __gosymtab 00000000 00000000010d0eb0 DATA
7 __gopclntab 0006d6f8 00000000010d0ec0 DATA
8 __go_buildinfo 00000200 000000000113f000 DATA
9 __nl_symbol_ptr 00000188 000000000113f200 DATA
10 __noptrdata 000054e0 000000000113f3a0 DATA
11 __data 00003f10 0000000001144880 DATA
12 __bss 0005fc30 00000000011487a0 BSS
13 __noptrbss 00003440 00000000011a83e0 BSS
14 __zdebug_abbrev 0000012b 00000000011ac000 DATA, DEBUG
15 __zdebug_line 00021c4d 00000000011ac12b DATA, DEBUG
16 __zdebug_frame 000069a5 00000000011cdd78 DATA, DEBUG
17 __debug_gdb_scri 00000040 00000000011d471d DATA, DEBUG
18 __zdebug_info 000409f3 00000000011d475d DATA, DEBUG
19 __zdebug_loc 0001d633 0000000001215150 DATA, DEBUG
20 __zdebug_ranges 0000a1d4 0000000001232783 DATA, DEBUG
そういえば、このgcはgenerate codeとかの略だったのだった。
(追記 gcはgo compilerの意味 https://github.com/golang/go/tree/master/src/cmd/compile )
そういえば、gdbを使って読んだりしたことはないな。。
gomacro
以前のこういう発言への対応
go pluginsとか使ってreplつくれない?
go install github.com/cosmos72/gomacro@latest
2024-07-13
- goでast経由で書き換え
- zennのscrapsのurlの展開
2024-07-14
2024-07-24
- github actionsの各ジョブの実行時間が知りたい
github actionsの各ジョブの実行時間が知りたい
gh run list
より一段深い値が欲しい。gh run view
を個別に呼んでいくのはさすがにつらい。
標準ライブラリのみの範囲でやりたかった。
(argparseの書き方とか久しぶりに使うと忘れてしまうな)
gh auth token
とかをそのまま渡したりすれば良いという気もする
散布図とかを手軽に用意できれば良いのかも。ライブラリとかに依存しないとなるととりあえずvegaとかvega-liteの形式で出力しておく?結局スクショが必要になるのか。
(この例とは異なりxをjobのあれで固定してyだけをいじる)
2024-07-25
- go vetのanalyzer optionを列挙したい
2024-07-30
- net/http graceful shutdown と go vet
net/http graceful shutdown
http serverで言えばrequestを処理してる途中でバッサリ切断されると困るので穏やかにコネクションが空になるかtimeoutになるまで待ってからシャットダウンする感じの挙動のこと(のはず)。
net/httpの所にもコード例が存在する。
func main() {
var srv http.Server
idleConnsClosed := make(chan struct{})
go func() {
sigint := make(chan os.Signal, 1)
signal.Notify(sigint, os.Interrupt)
<-sigint
// We received an interrupt signal, shut down.
if err := srv.Shutdown(context.Background()); err != nil {
// Error from closing listeners, or context timeout:
log.Printf("HTTP server Shutdown: %v", err)
}
close(idleConnsClosed)
}()
if err := srv.ListenAndServe(); err != http.ErrServerClosed {
// Error starting or closing listener:
log.Fatalf("HTTP server ListenAndServe: %v", err)
}
<-idleConnsClosed
}
-sigchanyzer
go vet ところでこれを繋げるglueコードが go vetの -sigchanyzer
で怒られていた(channelがbufferingされてない状態のコード)
📝 補足事項: 歴史的な経緯により https://github.com/braintree/manners が使われていた。
// ServeGracefuly : サーバーを
func ServeGracefuly(handler http.Handler, addr string) error {
signalChan := make(chan os.Signal) // <- unbuffered channel
signal.Notify(signalChan, syscall.SIGTERM)
go func() {
for {
s := <-signalChan
if s == syscall.SIGTERM {
fmt.Printf("Receive sigterm\n")
manners.Close()
}
}
}()
return manners.ListenAndServe(addr, handler)
}
- buffered channelに機械的に直せば良い?
- そもそもfor loopいる?
- 元のライブラリの実装とServer.Shutdown()の実装ってなんか違ったっけ?
signal.Notify() と unbuffered channel
signalChanへのsendがブロックされるという話だけどこれはsignal.Notifyの話?
↑はgoroutine回りっぱなしかも。
あと受信のところに行く前にSIGTERMが送信されるとmanners.Closeが呼ばれる前に終わることがある(?)
signal.Notifyの時点でbufferred channelにしてと書かれてるし取り逃がすと書かれてる。
普通に考えると、go routineの中でチャネルを待ち受けるまでの間にシグナルが送出されたときに取りこぼす感じそう。
package main
import (
"fmt"
"os"
"os/signal"
"syscall"
"time"
)
func main() {
// unbufferedなチャネルを作成
c := make(chan os.Signal)
// c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt, syscall.SIGTERM)
fmt.Println("Press Ctrl+C to exit...")
time.Sleep(1 * time.Second) // ここの間はsignalを取りこぼす (気持ちとしては...)
fmt.Println("ok")
// シグナルを受信
sig := <-c
fmt.Println("Received signal:", sig)
}
2024-08-10
- goのインタプリタが欲しい
minigo
goのインタプリタが欲しい
理由
- go/packagesが遅い
- packageに対する操作(メソッド)が持てない
機能
- 遅い
- channelとgoroutineの実装は要らない
- importを可能な限り遅延したい
- vm的なものをdumpしたい
- エントリーポイントを変えたい(main)
- docstringに対してmarkerを付けたい
more
- replみたいなものが欲しい
- time.Nowを実行したい
- FFI?
📝考えてみると、goとしてもvalidであるためにはreflectで記述する必要がある?(せめてmapであれば)
作った
気になること
- 事後にパッケージをインポートして呼べる?(plugins?)
- go listの中身
go pluginパッケージ
試してみたけど値を渡すのは直接できないね。。それはそう。。
seriealize/deserializeしろみたいな話はそれはそうみたいな感じはする(wrapperを書きたくない)。
こういう感じにネストした場合はどうなるんだろ?別のバイナリになる気はするx.init()はバグりそう
実際のところはこう?
追記:
試してみたらinit()は一度きりになってくれるみたい
gistを更新した。
package x
import "fmt"
var V = 10
func init() {
V++
fmt.Println("on init, V is", V)
}
というxをplugin_aでもplugin_bでもimportしても一度きりみたい(どうしてだか理解はまだしていない)。
そういえばdebug buildって何を持つんだろ?delveとかみるとgcflagsを追加しているだけなのか。
(gcflagsのgcはgo compiler -gcflags: arguments to pass on each go tool compile invocation.
)
gcflagsのオプション
go tool compile -help
でみられる
(buildmodeの情報は go help buildmode
)
<details>
$ go tool compile -help
usage: compile [options] file.go...
-% debug non-static initializers
-+ compiling runtime
-B disable bounds checking
-C disable printing of columns in error messages
-D path
set relative path for local imports
-E debug symbol export
-I directory
add directory to import search path
-K debug missing line numbers
-L also show actual source file names in error messages for positions affected by //line directives
-N disable optimizations
-S print assembly listing
-V print version and exit
-W debug parse tree after type checking
-asan
build code compatible with C/C++ address sanitizer
-asmhdr file
write assembly header to file
-bench file
append benchmark times to file
-blockprofile file
write block profile to file
-buildid id
record id as the build id in the export metadata
-c int
concurrency during compilation (1 means no concurrency) (default 4)
-clobberdead
clobber dead stack slots (for debugging)
-clobberdeadreg
clobber dead registers (for debugging)
-complete
compiling complete package (no C or assembly)
-coveragecfg file
read coverage configuration from file
-cpuprofile file
write cpu profile to file
-d value
enable debugging settings; try -d help
-dwarf
generate DWARF symbols (default true)
-dwarfbasentries
use base address selection entries in DWARF
-dwarflocationlists
add location lists to DWARF in optimized mode (default true)
-dynlink
support references to Go symbols defined in other shared libraries
-e no limit on number of errors reported
-embedcfg file
read go:embed configuration from file
-env definition
add definition of the form key=value to environment
-errorurl
print explanatory URL with error message if applicable
-gendwarfinl int
generate DWARF inline info records (default 2)
-goversion string
required version of the runtime
-h halt on error
-importcfg file
read import configuration from file
-installsuffix suffix
set pkg directory suffix
-j debug runtime-initialized variables
-json string
version,file for JSON compiler/optimizer detail output
-l disable inlining
-lang string
Go language version source code expects
-linkobj file
write linker-specific object to file
-linkshared
generate code that will be linked against Go shared libraries
-live
debug liveness analysis
-m print optimization decisions
-memprofile file
write memory profile to file
-memprofilerate rate
set runtime.MemProfileRate to rate
-msan
build code compatible with C/C++ memory sanitizer
-mutexprofile file
write mutex profile to file
-nolocalimports
reject local (relative) imports
-o file
write output to file
-p path
set expected package import path
-pack
write to file.a instead of file.o
-pgoprofile file
read profile from file
-r debug generated wrappers
-race
enable race detector
-shared
generate code that can be linked into a shared library
-smallframes
reduce the size limit for stack allocated objects
-spectre list
enable spectre mitigations in list (all, index, ret)
-std
compiling standard library
-symabis file
read symbol ABIs from file
-t enable tracing for debugging the compiler
-traceprofile file
write an execution trace to file
-trimpath prefix
remove prefix from recorded source file paths
-v increase debug verbosity
-w debug type checking
-wb
enable write barrier (default true)
</details>
ビルドキャッシュもオブジェクトレイアウトもわかってなさそう
2024-08-28
気になる
- dave/dstでコードのinjectができるか調べる
- 改行が含まれたコメントとコードでastだとバグる例
2024-09-03
- goのiter関数のインライン化(?)
- generic alias types
- ループ時の変数を省略できる
2024-09-05
- go iterator function
go iterator function
遊ぶというよりも調べるみたいな感じになった。issue用のリンク集代わりに使えるので長持ちするscrapになったかも
2024-09-06
ast-grep
結構ハマりやすいというかcontextとselectorがわからないと厳しいね。。
# YAML Rule is more powerful!
# https://ast-grep.github.io/guide/rule-config.html#rule
rule:
any:
- pattern:
context: func t() { !bson.IsValidObjectID($$$A) }
selector: unary_expression
- pattern:
context: func t() { bson.IsValidObjectID($$$A) }
selector: call_expression
fix:
_, err := bson.ObjecIDFromHex($$$A); err != nil
2024-09-13
- githubでのPRでのannotationの追加
2024-09-16
- tree .gitignore
- typespec custom decorator
tree .gitignore
tree --gitignore
を利用する。再帰的に親を探してくれないので真面目にlocalのgitiignoreを書いておくと良さそう。treeのmanを見ると $GIT_DIR/info/exclude
を見るようだ。そして一般的にはgit的にはdefaultの設定として $HOME/.config/git/ignore
を書くがここは見てくれない。
最終的に--gitfile
で直接指定することにした。コードを読んだところこちらを指定すれば--gitignore
は不要そう。 (--gitfile=<path>
が上手く読み込んでくれなくてハマってた)
~/.bashrc
alias tree="tree --gitfile ~/.config/git/ignore"
.gitignore
node_modules
node_modulesとかが邪魔
特定のディレクトリに移動したときに環境変数を設定するみたいなフックがほしい?
💭 treeコマンドも個別にaptで入れる感じではあるし、そもそも別の便利コマンドを使うべきみたいな話はあるかも?(grepに対するrgみたいな感じ)
typespecで独自のオプションの追加
独自のオプションの追加とかできるんだろうか?複数のopenapi.yamllを生成したときに共有するschemaに対してx-common: true
みたいな属性をつけたくなる事がある。
- .tsp側の変更
- compiler側の変更
custom decorators?
2024-09-22
- vscode goto-definition/back
vscode goto-definition/back
M-.
と M-*
で
{
"key": "ctrl+oem_4 oem_period",
"command": "editor.action.revealDefinition",
"when": "editorHasDefinitionProvider && editorTextFocus"
},
{
"key": "ctrl+oem_4 shift+oem_1",
"command": "workbench.action.navigateBack",
"when": "editorHasDefinitionProvider && editorTextFocus"
},
2024-09-24
‐minigoを作り始めた
minigoを作り始めた
余暇に久々にコードを書けたけれど進捗は芳しくなかった。感想部分にコメントを追記しながら作業するのは良い。
2024-09-28
‐inline script metadata
inline script metadata
‐dependencies
‐requires_python
が指定可能
shebangがこう書ける
#!/usr/bin/env hatch run
オプショナルで tool.*.*
敵なToolセクションも設定可能みたい
スクリプト単位で環境が作られるならtyperとかclickとかが使われても配布に全然困らなくなるみたいな話。
ritchとかでも使えて便利。
あとhttpxだとかが使えるのも便利か
これができるとpyproject.tomlとかも含めて管理しなくて済むし楽に1ファイルにするためにバンドルみたいな面倒な一手間が不要になる。
まぁでも拡張ライブラリが必要になる感じだと怠そうとかはあるかも?(含めたくない)
あとprivateなPackage Repositoryは使えるんだろうか?
ネットワークへのアクセス無しで実行したいときもあるしinline script metadataの部分を見てzipappを作るやつとか欲しいかもしれない(pure_python_only=Trueみたいなオプションも欲しいかも)。
2024-09-30
- emacs ansi code sequenceを除去したい (from github action)
消すのと色を付けるのとどちらが良いだろう?
(defun my:strip-ansi-color ()
"for github action's log .etc"
(interactive)
(save-excursion
(while (re-search-forward "\\\\[[0-9]*m" nil t 1)
(replace-match ""))))
(autoload 'ansi-color-apply-on-region "ansi-color")
(defun my:highlight-ansi-color ()
(interactive)
(let ((inhibit-read-only t))
(ansi-color-apply-on-region (point-min) (point-max))))
)
2024-10-02
-
npx @biomejs/biome lint --write --only lint/style/useImportType **/*.ts
してほしい - npxで実行されるコマンドのバージョンを更新するのってどうするんだろ?
直接バージョンを指定して実行するとそれが使われる。あるいはキャッシュを消す。まじ? @latest
みたいなのないの?
2024-10-03
- WSLからclip.exeに渡すと文字化けする
- 色々なブラウザ周りのイベントを把握したい
WSLからclip.exeに渡すと文字化けする
こういうのが嫌。
clip.exeはcp932を期待しているっぽい?
🍣とかの絵文字にcp932は対応していないしtreeとかが文字化けしてて辛い。
.
笏懌楳笏 clipboard
笏つツ 笏披楳笏 index.html
笏懌楳笏 event
笏つツ 笏懌楳笏 README.md
笏つツ 笏懌楳笏 app.js
笏つツ 笏懌楳笏 click.html
笏つツ 笏披楳笏 loaded.html
笏懌楳笏 layout
笏つツ 笏披楳笏 README.md
笏懌楳笏 scaffold
笏つツ 笏懌楳笏 readme.md
笏つツ 笏披楳笏 simple
笏つツ 笏披楳笏 index.html
笏懌楳笏 tree.out
笏披楳笏 tree2.out
6 directories, 10 files
utf-16あたりにするとどうにかなる
$ tree | iconv -t utf-16 | clip
xselを使っても良いかも?
$ sudo apt install xsel
$ tree | xsel -bi
ブラウザのイベント周りの例を作った
色々覚えていない
スマホでも確認できるようにconsole.logをラップした。画像のクリップボードの対応だけは難しい。
せっかく作ってもスマホだと以下のような状況で悲しい
- console.logの出力が見られない
- クリップボードに画像を入れておくことができない?
ついでにコードのコピペとかの例も作った
github copilotがdocument.getBoundingClientRect()を使った例とかを出してくれて便利だった。
あと、右上にアイコンを表示してくれたりなど。
2024-10-08
- setCrushOutput
- goでoneOf対応
2024-10-09
‐Python 3.13のTypeIsとTypeGuard
Python 3.13のTypeIsとTypeGuard
PythonというかmypyのTypeIsとTypeGuardとかはそういえば説明を読んだだけで使ってないな。
(説明だとisinstanceだけど変えても良いのかな?例えばhasattrとか)
現状の理解だと
‐ TypeIs[x]でx|y|zをxとy|zに分解できる
‐ TypeGuard[x]は通った範囲ではxであることだけを示してelseはx|y|zのまま
ただしTypeIsに指定できるのは入力された型のmroのどれかだけになる。これは例を見るまで気づかなかった。
これは A > Bのとき、TypeIs[A]にB|Cをあてると、BとCに分解できる(ドキュメントの例ではA,B = Parent, Child)。
PEP647とPEP742なのか
PEP読んでたらそれぞれの述語部分の実装は実装者の責任で型を合わせるっぽい
PEP742を読んだ感じTypeIsの方を先に見当するべきなんだな
Callableを引数として渡す部分の例に悩んだりした
Callable[[object], TypeIs[int]]の場所にCallable[[object], TypeIs[bool]]を渡せない。ここでbool < intだからそのままか。反変ではなく共変か。int以上を要求するけれどboolはサブタイプと言うだけの話か。
2024/10/10
- deno v2
- jsrのstd/collectionsをlodashなどの代わりに使える?
deno v2
jsrのstd/collectionsをlodashの代わりに
Deno Standard Library module npm package
@std/testing jest @std/expect chai @std/cli minimist @std/collections lodash @std/fmt chalk @std/net get-port @std/encoding rfc4648
For a complete list of available packages visit https://jsr.io/@std.
らしい
個別にimportしてそれだけが切り出せたら勝ちという話か
(あとは実装の好みの問題)
ふつうに個別にファイルが分かれてるから行けるのでは?
これはchunks
viteの例もある(試したりなどはしていない)
2024-10-11
- ginからgin-minusを作ってみる
- go mod graphからグラフを可視化できない?
ginからgin-minusを作ってみる
ginは安定しているしいろいろなところで使われている。
一方で不要な依存とかもあるような気がする。例えばprotobufとかは使わない。
go.workやgo.modでreplaceすること前提のパッケージを作って使ってみる事はできるんだろうか?
(これを仮にgin-minusとしてみる)
そういえば、x/twitterでgrpcと言っていたけれど、protobufの勘違いだった。
ところでprotobufへの直接の依存を仮に取り除いてgo mod tidyをしても間接的な参照が残っているのかindirect dependenciesのところに残ってしまう。これを調べる方法ってあったっけ?
go mod why
とかで行ける?
$ go mod why -m google.golang.org/protobuf
# google.golang.org/protobuf
github.com/gin-gonic/gin
github.com/quic-go/quic-go/http3
github.com/quic-go/qpack
github.com/onsi/ginkgo/v2/ginkgo
github.com/onsi/ginkgo/v2/types
github.com/onsi/ginkgo/v2/types.test
github.com/onsi/gomega/ghttp
github.com/golang/protobuf/proto
google.golang.org/protobuf/encoding/prototext
quic-goを消したら消せた (代わりにhttp3のサポートが消えるけれど)
とりあえず自分のフォーク先のところにPRを作ってみる。
こういう依存の除去が機械的にできればやっても良い気もする(とはいえvendorじゃない場合はあまり気にしないものかもしれない)
こちらは例を追加した方のPR(a.diffがgo.modの変わった差分)。
PRのbaseの方は手動で依存するパッケージを減らしたバージョン。これを機械的にやれないか?みたいな気持ちがあった。
optional dependenciesとかがあれば十分なものなような気もする。
exportされたstructのmethodになっているとDCO(dead code elimination)とかも効かなそうな気がする。つまるところtree-shakingができない。
go mod graphからグラフ
go mod graph | awk '{print $1 " --> " $2}' | sed '1i\graph TD' > mod_dependency.mmd
名前が変数名として使えないと厳しい
結局辛かったのでpythonのスクリプトを書いた。testifyとか取り除くべきかも。
gistとかでのmermaidのpreviewも限界感あるかも。単なるsvgになりそうな気がするしうまくスマホからも触れるような無限に拡大できる何かが欲しい。
まぁでも複雑になるとグラフで可視化するのは限界がありそう。
2024-10-15
- 連鎖したPRを図示したい
- mermaidでのescape
- vscodeでよく使うキーボードショートカット
- 連鎖したPRのsquash merge
連鎖したPRを図示したい
branchが連鎖している時にmermaidでいい感じに表示する君。結局pythonで雑に書いた。
mermaidでのescape
どうやら :#
で #
をescapeできるらしい
vscodeでよく使うキーボードショートカット
一番よく使うのは
- cmd + shift + p での
>
(Show All Commands) - cmd + shift + o での
@
(Go to Symbol)
かもしれない
そしてprimary sidebarとpanelのcloseもよく使う
連鎖したPRのsquash merge
連鎖したsquash mergeをgit glogをつかってみるとrebaseの開始地点がわからなくなる。
これを例えば tmp-<branch name>
のようなブランチをつくっておきrebaseしていくことで見やすくなるかもしれない。
git glog = log --graph --decorate --oneline
[alias]
br = branch
co = checkout
st = status
log-graph = log --graph --date=short --pretty=format:'%Cgreen%h%Creset %cd %Cblue%cn %Creset%s'
ls = ls-files
glog = log --graph --decorate --oneline
2024-10-18
- N月刊ラムダノートを見てADTが羨ましくなった
- enumのlinter
- ちょっと気になる
enumのlinter
貧者のパターンマッチ。これどうやって使うんだろ?
特にコメントで管理するのではなく所定の書き方を期待してる感じっぽい
package eco
type Biome int
const (
Tundra Biome = 1
Savanna Biome = 2
Desert Biome = 3
)
そして型を見て管理してるみたい。
パッケージ内なら定数の箇所をパッケージ外ならexportされたものを見る。診断をswitchで開始する部分があんまりわかってない。
一応genericsのbasic kindが同じものをみてくれるみたい。unionで繋げると合成できる。
あと一応analyzerを実装してる
enumのfactを追加してて、inspect.Analyzerを要求してる。
go/typesとかはデフォルトで手に入るから単にwalkしてるだけか(頑張り)
exportFactでenumを集めてswitchに対してcheckerを走らせる感じ
findEnum自体も全てのNameを取り出してinfo.Defs経由で取り出してる感じか
順序を維持してjsoncを読み込みたい
順序を維持してjsoncを読み込むのはこんな感じになるんだろうか? denoの @std/jsonc
のコードを弄って解決するしかない?
📝 ついでに、npmのものをdenoは直接importすることはできないようだ
こういうのは無理だった
import { parse } from "npm:jsonc-parser@3.3.1/impl/parser.ts"
TypeScript files are not supported in npm packages: file:///~/deno/npm/registry.npmjs.org/jsonc-parser/3.3.1/impl/parser.ts
コメントも保持して欲しいと思ったがjsonc-parserもどちらもコメントは取り除いてしまうようだった(もちろんscannerから自分で頑張れば保持できる)。
rustだけどdprintは自作しているのか。
2024-10-22
denoでtypespec
- denoでnpxの代わりができるか
- 少なくともcompilerは動かしたい
- lspか何かのvscode extentionを動かせるか
- カスタムのcompilerを作れるか
- カスタムのデコレーターを付けられるか
compilerはこの辺
cmdはこの辺
2024-10-22
- case insensitive completion in bash
2024-10-23
- denoしたくなった
- github copilotの回答をそのまま貼りたい
2024-10-24
- macのkittyでvscodeからxslxを開きたいときに死ぬ
- denoやtsでの型を推論した結果をクリップボードにコピーしたい
- denoでのcommand line arguments parserのライブラリ悩み
2024/10/26
-
@std/cli.parse-args
の型パズルを理解したい - emacs auto-save-visited-modeを有効にした時、エディタのバッファ上に残ったファイルの保存を聞かれてしまう
- ディレクトリを削除した後にこれが起きるとmini bufferの入力が奪われる
@std/cli.parse-args
の型パズルを理解したい
全然関係ないけれど、doc stringの書き方とかを理解していないかも?
/**
* Take a set of command line arguments, optionally with a set of options, and
* return an object representing the flags found in the passed arguments.
*
* By default, any arguments starting with `-` or `--` are considered boolean
* flags. If the argument name is followed by an equal sign (`=`) it is
* considered a key-value pair. Any arguments which could not be parsed are
* available in the `_` property of the returned object.
*
* By default, this module tries to determine the type of all arguments
* automatically and the return type of this function will have an index
* signature with `any` as value (`{ [x: string]: any }`).
*
* If the `string`, `boolean` or `collect` option is set, the return value of
* this function will be fully typed and the index signature of the return
* type will change to `{ [x: string]: unknown }`.
*
* Any arguments after `'--'` will not be parsed and will end up in `parsedArgs._`.
*
* Numeric-looking arguments will be returned as numbers unless `options.string`
* or `options.boolean` is set for that argument name.
*
* @param args An array of command line arguments.
* @param options Options for the parse function.
*
* @typeParam TArgs Type of result.
* @typeParam TDoubleDash Used by `TArgs` for the result.
* @typeParam TBooleans Used by `TArgs` for the result.
* @typeParam TStrings Used by `TArgs` for the result.
* @typeParam TCollectable Used by `TArgs` for the result.
* @typeParam TNegatable Used by `TArgs` for the result.
* @typeParam TDefaults Used by `TArgs` for the result.
* @typeParam TAliases Used by `TArgs` for the result.
* @typeParam TAliasArgNames Used by `TArgs` for the result.
* @typeParam TAliasNames Used by `TArgs` for the result.
*
* @return The parsed arguments.
*
* @example Usage
* ```ts
* import { parseArgs } from "@std/cli/parse-args";
* import { assertEquals } from "@std/assert";
*
* // For proper use, one should use `parseArgs(Deno.args)`
* assertEquals(parseArgs(["--foo", "--bar=baz", "./quux.txt"]), {
* foo: true,
* bar: "baz",
* _: ["./quux.txt"],
* });
* ```
*/
2024-10-28
- deno用のcli option parserを書き始めた
2024-10-30
- typescriptの型パズル続き
typescriptの型パズルの続き
前回作り始めたやつは一度型のことを考えずに動作だけを担保するようにしてみた。型の方の実装をしなくてはいけない。とはいえ今までの型パズルは一つの関数に対する型だったので複数の関数の引数だったり戻り値の型として再利用するような型の定義の仕方がわかっていなかった。
とりあえずコマンドライン引数パーサーのミニ版をベースに考えてみることにした。
2024-11-02
- jsrに
@podhmo/with-help
を公開した- 不要なファイルもjsrに上がってるかも?
- 地味に型チェックのテストが欲しくなった
- vscodeのFormat documentとdeno fmtのフォーマットが異なっていそう?
- vscodeでworkspace毎にextensionを無効にできるのは良いのだけれど
-n
で開くたびに設定し直すのが辛い- denoを書いているときpythonやgoなどのextensionは要らない
srcとdstに分けるのが自然なのかな?
vscodeの設定
vscodeのFormat documentとdeno fmtのフォーマットが異なっていそう?
‐https://docs.deno.com/runtime/reference/vscode/#formatting
‐"editor.defaultFormatter": "denoland.vscode-deno"
でも設定増えるのやだな
初回importが無い問題
deno cacheとか実行していたけれどvscode上からも対応できる?
‐https://docs.deno.com/runtime/reference/vscode/#caching-remote-modules
‐quick fix
‐Deno: Cache Dependencies
2024-11-04
- jsrにアップロードしたパッケージをesmとして使う
- コマンドラインオプションの不備について考える
- 自前のdeno bundleを作る
- 英語を書く練習したい
jsrにアップロードしたパッケージをesmとして使う
どうやらesm.shが対応してるみたい
- readmeに書かれてる
- https://github.com/esm-dev/esm.sh#supported-registries
- テキトーにcodepenで例を作る
- https://codepen.io/podhmo-the-animator/pen/rNXryZd
import {chunk} from "https://esm.sh/jsr/@std/collections@1.0.9/chunk"
コマンドラインオプションの不備について考える
hello worldをベースに考えた
- 関数で覆えばundefinedを除外はできる
- console.logとか許容するものにそのまま渡してると突き進んでしまう
- デフォルト値を雑に加えると不備を埋め込む
- EitherとかMaybe(Option)を使っててもこれは同様かも?
- Optionalなパラメーターとデフォルト値のセットがやばい
そういえばyaml-language-serverとかdenoで動かせるのかな?
自前のdeno-bundleを作る
英語を書く練習したい
言葉がスッと出てこない
prompt的な物のアイデア
- 私は第二言語として英語を使う人です
- 日: から始まる日本語と英:から始まる英語を受け取ってください
- 受け取った日本語はなるべく流暢な特にネイティブが使うとされる簡単な単語を使った慣用表現をを使わずに学部レベルの英語に翻訳してください
- 受け取った英語に対して以下2つのアドバイスをください
-
- 文法的により適切な形に変換するためのアドバイス
- 受け取った英語と日本語の意味の差異を埋めるためのアドバイス
2024-11-05
- pyproject.tomlを使う最小構成を知りたい
- vendoringするような形でのパッケージの取り込みの方法を知りたい
- tsxをいい感じにtranspileする方法を探したい
- 環境を報告するためのenvinfo
pyproject.tomlを使う最小構成を知りたい
これはテキトーに説明をして貰えばできるのだけれど、editable installがうまくいかない
[project]
name = "foo"
version = "1.2.3"
description = "A simple example package"
authors = [
{ name="Your Name", email="your.email@example.com" }
]
license = { text = "MIT" }
dependencies = [
"jinja2",
{ path = "./vendor/bar", develop = true } # これをeditable installしたい
]
こういうやつ。もしかしてpep660ってまだ対応していないんだろうか?
いや、pep660自体にはpipも対応している。
そもそも{ path = "./vendor/bar", develop = true}
という記法が対応しているか分からない。
bar @ file://<full path>/vendor/bar
みたいな設定は可能だけれど、これはローカルファイルからのインストールでsite-packages以下にコピーするもの(後たぶん絶対パスじゃないとだめそう)。
この話はeditable installしたときのsite-packages内の <package>-<version>.dist-info/direct_url.json
の表現の話か。。
When url refers to a local directory, the dir_info key MUST be present as a dictionary with the following key:
- editable (type: boolean): true if the distribution was/is to be installed in editable mode, false otherwise. If absent, default to false.
When url refers to a local directory, it MUST have the file scheme and be compliant with RFC 8089. In particular, the path component must be absolute. Symbolic links SHOULD be preserved when making relative paths absolute.
tsxをいい感じにtranspileする方法を探したい
この辺で調べたりなどしてた
とりあえずの成果としてはdeno-language-serverと協調しつつpreactのcomponentを書いてるときに怒られがない状況を作る方法がわかって良かった。
transpileが期待したものにならない?感じはしてて調べたりなどしてた
- deno/emit
- swc
- deno/graph
- deno/import_map
環境を報告するためのenvinfo
2024-11-06
- 1ファイルでのdeno.jsonについて
- コマンドライン引数パーサーに
literal union
での絞り込みを追加したい
1ファイルでのdeno.jsonについて
import mapを弄るのが面倒くさい。
1ファイルで収まるならコード上に直接書いちゃうべきかも。
auto importの類はできたら最高だけどあまり信じてない。ただgoで考えるならgoimportsか。@std/*
の範囲だけ補完してくれるようなものがあればそれで十分かも?
なんかvscodeの拡張辺りに設定が紛れ込んでいそう?
literal union
での絞り込みを追加したい
コマンドライン引数パーサーに
そういえば as constのオブジェクトからtypeof keyofでつくる人もいるんだな
2024/11/07
- const type parameterとかas const satisfiesとかデフォルト型引数とか
- https://zenn.dev/tonkotsuboy_com/articles/typescript-as-const-satisfies
- https://qiita.com/suin/items/c2a46cf8e6dd7e9c889a
- https://typescriptbook.jp/reference/generics/default-type-parameter
const type parameterを使えばasが不要にできる。
ただし省略されてできたundefinedと明示的な[]が存在するのでensureLiteralArrayは消せなかった。
ようやく戦いに勝利した
literal unionがいい感じに渡された時だけうまくいく場合を調べた
📝 型レベルの分岐を調べるときには {<key name>: T}
みたいな形で書いてあげるとわかりやすい
ok,widen1,widen2というタグをつけて調べてる。
ちなみに結果がokの型でも引数の制約に引っかかってエラーになっている(T ⊂ G)
function X<
const T extends readonly string[],
const G extends readonly string[]
>(
options: { xs?: T extends G ? T : never, ys?: G } // T ⊂ G
): readonly [] extends T ? { widen1: never } : (string extends T[number] ? { widen2: never } : { ok: T[number] }) {
return options as any
}
const ys = ["x", "y", "z"] as const
let _: never = X({ ys }) // { widen1: never; }
let _: never = X({ ys, xs: [] }) // { widen1: never; }
let _: never = X({ ys, xs: undefined }) // { widen1: never; }
let _: never = X({ ys, xs: ["x"] }) // { ok: "x"; }
let _: never = X({ ys, xs: ["a", "b"] }) // { ok: "a" | "b"; }
let _: never = X({ ys, xs: ["a", "b", "c"] }) // { ok: "a" | "b" | "c"; }
const xs: string[] = ["x"];
let _: never = X({ ys, xs }) // { widen2: never; }
2024/11/08
- with-help
- as constを消せた
- 昨日の↑のアイデアだけだと、型エラーの表示があんまり嬉しくなかった
- 結局srcレイアウトをやめた。jsrのFilesから見たときにsrcが余分に見えたので。
- as constを消せた
- なぜ自分がChatGPTに問いかけたものは信用がおけると思ってしまうのか?みたいな文章を書いた
2024-11-10
- TypeScriptのNoInfer
- deno fmtをvscode側でも有効にしたい
- 雑にYoutubeのAPIをdenoから呼びたい
TypeScriptのNoInfer
function include2<T extends string>(xs: readonly T[], x: NoInfer<T>): x is T{
return xs.includes(x);
}
これは型の推論というか推測の対応ということを頭に入れておけば良い。xsとxのTを同等に扱おうとした結果wideningがおきてしまいstringとして扱われてしまう。
当然include2<string>(xs, "up")
みたいなコードを書いて自分でstringを指定してしまえば型エラーにならなくなる(逆に今まではinclude<Direction>(xs, "up")
のような記述をしなくてはいけなかった)
deno fmtをvscode側でも有効にしたい
こんなのを書かないとだめなのかな?
{
"deno.enable": true,
"[typescript]": {
"editor.defaultFormatter": "denoland.vscode-deno",
"editor.formatOnSave": true
},
"[javascript]": {
"editor.defaultFormatter": "denoland.vscode-deno",
"editor.formatOnSave": true
}
}
雑にYoutubeのAPIをdenoから呼びたい
型情報が取れないのが不便だった。@types/youtube
ってそれ用の型ではないのか?
- https://gist.github.com/podhmo/e119d8382d0ea6c682576066fccd07a1
- API KEYを取得する方法を忘れてた(だるい)
- forEachとかasyn/awaitのためには邪魔かもしれない
REST APIはすなおにfetchで良さそうだけれど、graphqlとかはどうなんだろ?
あと、pagination的なものを呼んでいるときにprogres barを作る方法はどうすると良いんだろう?
2024-11-11
- deno .gitignore
deno .gitignore
denoの.gitignoreって特に必要ないような気がする?(githubでrepositoryを作るときにdenoの選択肢が存在しないので気付いた)
なんかPRはできているみたいなのだけれどパッとしない感じではあった
vscode
そういえば.vscode/settings.jsonあたりはcommitしてしまって良いのだっけ?
良さそうに見える
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
!.vscode/*.code-snippets
# Local History for Visual Studio Code
.history/
# Built Visual Studio Code Extensions
*.vsix
youtubeの直近の動画を集める
前回の続き
- https://gist.github.com/podhmo/e119d8382d0ea6c682576066fccd07a1
- 📝どうやらURLにchannel idが含まれない場合もあるらしい
- だんだん探索的なコードだからなのか、responseの型がどうでも良くなってきている
.jsoncはコメントが書けるのが便利かもしれない。
2024-11-12
- 日中寝込んでた
- 型を詳細化したときのtsのコードの書き方がよくわかってなかった
-
Deno.*
の類はどのくらいあるんだろう?
型を詳細化したときのtsのコードの書き方がよくわかっていないかった
- https://gist.github.com/podhmo/9faa241f2d3173de57328fda7bb9f6c0
- 簡単なコード例ならearly returnと型ガードが上手くいく
- ブロックによるシャドーイングはそもそもjsの意味論で無理?
- CPS用の補助関数を書いてあげると同じ問題に遭遇する
Deno.*
の類はどのくらいあるんだろう?
- https://docs.deno.com/api/deno/
- 普通にいっぱいある?
TypeScriptのUtility Typesはどのくらいあるんだろう?
- Awaited<Type>
- Partial<Type>
- Required<Type>
- Readonly<Type>
- Record<Keys, Type>
- Pick<Type, Keys>
- Omit<Type, Keys>
- Exclude<UnionType, ExcludedMembers>
- Extract<Type, Union>
- NonNullable<Type>
- Parameters<Type>
- ConstructorParameters<Type>
- ReturnType<Type>
- InstanceType<Type>
- NoInfer<Type>
- ThisParameterType<Type>
- OmitThisParameter<Type>
- ThisType<Type>
- Intrinsic String Manipulation Types
react/preactでhtmlを生成してみる
- https://gist.github.com/podhmo/41580702ce448710dcbcc6e06dbec548
- 文字列で返ってくるコードは嬉しくないかも?
- どちらかといえば日常的にはサーバーとして動き、SSG的な感じで動いてくれると嬉しい
- SSGで生成されたHTMLはそれ単体で読める感じだと嬉しい
2024-11-13
- deno jsoncファイルの読み込み
- markdownからjsx経由でhtmlを生成してみる
- dax覚えても良いかも?
deno jsoncファイルの読み込み
JSON.stringifyとJSON.parseを経由するのは果たして正解なのか?
markdownからjsx経由でhtmlを生成してみる
- https://gist.github.com/podhmo/945247efabed9e7a1616fc8129b411e3#file-readme-md
- react-markdownを使っている
- syntax-highlightなどは自分で登録しないとだめらしい
- preactを使うよりはreactを使う方が安全?
- lumeとかを覗いて見ると正解がわかるんだろうか?
分かんないこと
- dist以下をimportするのがキモい(dark)
- 調べたりした
@jsx
とかのコメントが効いてない気がする
📝
~/.cache/deno/npm/registry.npm.org/
にnpmのキャッシュが保管されるみたい
2024-11-15
- with-helpでliteral unionでの絞り込みを追加したい
with-helpでliteral unionでの絞り込みを追加したい
restrictionみたいなオブジェクトを導入することにした。つまり二段階ある感じにする。
- parsing phase (minimistのスーパーセットとして機能。string,booleanだけ対応)
- restriction phase (型を制限したカラフル?な表現に変換。ここでliteral unionなどに制限する)
ヘルプメッセージを表示したいので設定を保持しないとだめかも?
// In actual code, you don't need to write such types, you can leave it to inference.
type WantType = { name: string; direction: "north" | "south" | "east" | "west" };
type GotType = { name: string; direction: string };
// parse arguments
const args: GotType = parseArgs(Deno.args, options);
// restrict to desired type
const restriction = new Restriction(options);
const args2: WantType = { ...args, direction: restriction.choices(args.direction, directions) };
int,floatのようなものも増やしたい?どうだろう。。
オブジェクトとしてスプレッドすると型の表現が見やすくなるのも相まって良い感じかも。
2024-11-16
- WSL上でgh auth loginでブラウザが立ち上がらない
- esbuild + esbuild-deno-loaderを試してみる
WSL上でgh auth loginでブラウザが立ち上がらない
Try using
BROWSER=/mnt/c/Windows/explorer.exe gh auth login
. Pasting the code directly athttps://github.com/login/device
didn’t work for me, asgh
was still stuck waiting. But theBROWSER
flag opened the browser and fixed it.
なんかBROWSERを指定して起動してもファイルが見つからなくてforkで失敗していた。同じ感じ?
とりあえず↓とかで立ち上げて https://github.com/login/device
に直接URLで飛んで作業したら大丈夫そうだった
gh auth login -p ssh -w
だめだった。諦めてPATを作って gh auth login -p ssh --with-token < /tmp/token.txt
とかした。
esbuild + esbuild-deno-loaderを試してみる
- https://gist.github.com/podhmo/49739ebce9dd3a4a27e4637257797d2c
- とりあえず、esbuild-deno-loaderを使ってみた
- 雑に
@std/collections/chunk
を使ったものをbundle -
@podhmo/with-help
をそのままbundleしてesmを作ってみる- うまく動作はした。が、.d.tsが欲しくなった。
- 雑に
- 最終的にやりたいのはesbuildのplugin作成のような気がした
2024-11-17
- (昨日の続き) deno用のファイルをブラウザで実行できる感じに変換する
- direnvどうなってるの?
(昨日の続き) deno用のファイルをブラウザで実行できる感じに変換する
- 昨日の続き https://zenn.dev/link/comments/fa3e1d5c78c68f
- import pathを変換する
- HTML用のimport mapを生成する
- https://gist.github.com/podhmo/be654d37700e1c3c6590769540f38abc
🐾npm:preactでのcomponentをesmに変換することはできた(preact自体はesm.shにおまかせ)
結局esbuildのpluginだけで十分かも?
tree-shakingまで踏み込むと辛い(import文自体に触る方法がなさそう)
依存の依存までを管理できない
追記:
🐾htmlとpreactのファイルだけをまとめたgistを別途作った。↑のgistはすべてを含んでいるのでごちゃごちゃしていて見にくい。
direnvどうなってるの?
そういえばたまたま副次的に気づいたことだけれど、例えばdirenvのここに対応するシェルが存在してないなら環境故のエラーは自分が尖り過ぎた設定のための自己責任みたいな切り分けはできそう(あるいはコントリビューションチャンス)
2024/11/19
‐ 欲しいもの
欲しいもの bsky投稿ツール
文章を入力するとそれをbskyに投稿するdenoのスクリプトが欲しい。
それをEmacsから呼び出したい。指定するのはgistで十分なはず。メール送信的なuiで呼び出したい。
文章を投稿するときに、例えば、chatgptのapi経由で日英の翻訳結果を含めて欲しい。さらにその翻訳結果を英日に変換した結果を含めて欲しい。さらに幾つかの構文的なトピックを挙げて欲しい。
可能ならその状態から始まるチャットを始めるURLを添付して欲しい。
さらに今までのことを行うPWAが欲しい。ここでは一切バックエンドの実装をせずにフロントエンド上でbsky及びchatgptのキーを入力させ利用する形にして欲しい。
可能ならそれを投稿した時のイベントの送信をするような機能を付けて欲しい。利用したブラウザ自身が渡したURLに所定のフォーマットでデータを送信する(web hook)。
欲しいもの2 index.html生成スクリプト
シンプルにgithub pages用のlsに変わるようなindex.htmlを生成するスクリプトが欲しい。github上のURLにも飛べると嬉しい。
対象は同じディレクトリ内の以下のファイル
- .md は github上へのリンク
- .htmlは github 上へのリンク
- (生成日時/更新日時は欲しい?)
これらを再帰的に良い感じに呼び出してほしい(これは何らかのタスクファイルを生成する形にしても良い)
出力されるindex.htmlの見た目の基本はよくあるくみこみのファイルサーバー例えばpython -m http.serverのディレクトリ箇所へのアクセスと同様のもので良いがスマホで見やすい形にしてして欲しい。具体的にはviewportを指定して欲しい。
欲しいもの3 良い感じのbundler
良い感じに出力最小のmini bundler。
可能ならフォーマットオプションでhtmlとして出力できて欲しい。
import mapもいい感じに作られて欲しい
プロトタイプ
2024-11-21
- jqの表示を良い感じにしたい
jqの表示を良い感じにしたい
- N文字で切り捨てしつつ空白でパディング
- 複数のフィールドの表示
- JSONのオブジェクトとして出力
- 配列にした後tsvに変換
- (一つの文字列に合体)
# 20文字で切り取って空白でパディングする
tail results.jsonl | jq -r '.["@logStream"]'
tail results.jsonl | jq -r '(.["@logStream"] | split("/")[1])'
tail results.jsonl | jq -r '((.["@logStream"] | split("/")[1] | .[:20]) as $service | $service)'
tail results.jsonl | jq -r '((.["@logStream"] | split("/")[1]) as $service | $service + (" " * 20) | .[:20])'
# JSONで {service, messae} として返す
tail results.jsonl | jq -r '{service: ((.["@logStream"] | split("/")[1]) as $service | $service + (" " * 20) | .[:20]), message: .["@message"] }'
# 配列にしてtsvに変換して返す
cat results.jsonl | jq -r '[(.["@logStream"] | split("/")[1]), .["@message"] ]| @tsv'