Open381

2024

podhmopodhmo

はじまり

  • 記事の目的

この記事の目的

zennのscrapsはかなり便利なのだけれど、不要なscrapを立ち上げてすぐに辞めるみたいな作業をしがち、そんなわけで一覧部分にはタイトルだけに近いようなメモの残骸が並んでSN比が悪くなる。
(これはgithub issuesも同様の問題)

github issuesより良いところは

  • リンクを貼るとcard UIで良い感じにOGP的な情報を展開して表示してくれる
  • github discussionsと同様に複数の枝を持たせて各枝毎にコメントを書くことができる

そしてChangeLogメモのように一箇所にまとめるという意味で一箇所に集約してみると良いのでは?という感じになった。というわけで2024年版をここに書くようにする。

ついでに、作ったscrapsのメモをここに載せていくようにしてあげれば大きな意味でのmeta scrapsに使える気もした。

podhmopodhmo

2024-04-26

  • mermaidのDFDを直線直角を使って描きたい
  • apiと一対一のdocはあんまり嬉しくない?
  • スマホだけで扱える範囲
  • preタグの内容をクリップボードにコピーしたい
podhmopodhmo

mermaidのDFDを直線直角を使って描きたい

このスクラップにある通りにDFD (data flow diagrams)を描いてみたいとおもうようになった。

https://zenn.dev/podhmo/scraps/5d0e312c84a91a

元々の動機としてはスマホでの入力をいい感じにやって遊べないかということだった。
そしてスマホのフリック入力(全角)で表せる言語(DSL)を使って何かできないか?ということを考えていた。

そして、テキストで表現できる物を探してmermaidで記述できる方法を調べてみていた。
そしてどうやら直角直線で矢印を描く方法が存在していないっぽいことがわかった。

というわけで以下の作業が必要

  • mermaidの描画部分の実装を把握する (d3?)
  • mermaidの直角直線の矢印の方法を調べる
podhmopodhmo
podhmopodhmo

Ubuntuの24.4が出るのかWSLの方も更新したいかも。

podhmopodhmo

たぶんいきなりscrapsを作らずに、しばらくここでテキトーに始めるのが良いような気がする。

podhmopodhmo

preタグの内容をクリップボードにコピーしたい

jsとか書かずに対応できないのかな?

とりあえず、jsを書いても良いので調べておこう

https://junges.dev/2-how-to-add-github-copy-to-clipboard-button-on-your-docsblog


preタグの中でのcodeタグとか実は理解してないかも?

元々インラインのコードを表すcodeに対して複数行のものを表すときにpreタグの中で書くみたいなあれなのか。

https://developer.mozilla.org/ja/docs/Web/HTML/Element/code#補足
複数行のコードを表すには、 <code> 要素を <pre> 要素の中に入れてください。 <code> 要素自身は、コードの単一のフレーズや 1 行のみを表します。

podhmopodhmo

💭 これ長くなりすぎたときのローディングが気になるかも?

podhmopodhmo

2024-04-27

  • スマホで入力する図
  • emacsclientでfind-file-other-tabを呼びたい
podhmopodhmo

スマホで入力する図

昨日のやつは文芸的プログラミングとまでは言わないけれど仕様的なものをgist上に追記した。書くならdenoあたりが良い気がしてる。S式からは遠いものになった。

あー、あと意外とPCでは入力し辛い部分があった(「…」とか)。

図で表現したいと思ったときに何を得たかったのかをもう一度整理したい気がした。基本的には関係性の説明。

podhmopodhmo

アウトラインエディタとか考えてみたりしたけれど順序の変更はけっこう必須な感じもする。

あと図はそれ単体では機能せずにそれを参照しての利用に意味がある。そういう意味では例えばこの記事内みたいな文章的なものが欲しくなる。

podhmopodhmo

bskyのコピペのやつはパスワードを間違えたときのメッセージが不親切だった。
あと、なぜかデフォルト値から変わらなくなったりした。

podhmopodhmo

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 )

podhmopodhmo

おおきなトピックにもならない呟きはタイトルもつけずに呟いてるけれど、UI上は連続してるもののように感じてしまうかも?

podhmopodhmo

2024-04-28

  • 今のEmacs環境の細かな課題
podhmopodhmo

今のEmacs環境の細かな課題

Emacsで現在気になるところは2つある

  • skkを使い始めたらctrl-jが衝突するようになった
  • ctrl-kでのkill-bufferとtab-barの使い分けが面倒

後者は常にタブ毎消したい訳でもない。

調整したいこと

  • diredでの up/downを「[]」でしたい
  • viewer-modeの設定をしたい

後者は元々プロジェクト跨ぎのメモ環境(サブエディタ)としてEmacsを使い始めたので自然な気がする。

ところで、bskyのスレッドコピーのやつの調整をやるためにvscodeを立ち上げるのが面倒でhtmlをEmacsで開いて調整しようとした。補完がないのとフォーマットが無いので少し苦労した。

podhmopodhmo

そういえば、スイカゲームでもやろうとしてswitchを充電したけれど、購入したりする以前に触らず放置してしまった

podhmopodhmo

買ったヘッドホンは電源をいれるとノイズキャンセルされるということがわかった。

なんとなくヘッドホンをつけたままお出かけすることにしてみて気づいた。尚ポッドキャスト的なものを外で聞くのは耳へのダメージ的に無理だった。

podhmopodhmo

2024/05/01

podhmopodhmo

そういえば、図による運用が便利な一例に生物学や医学的なものの文章を読むときの関係性の把握があるかも。xxxの機序みたいなやつ。

https://bookclub.kodansha.co.jp/product?item=0000385169

💭ところでこれは図が便利な話であって頭の中の図を片手で出力できると便利な話ではないな。

podhmopodhmo

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)
podhmopodhmo

そして、自分のinit.elでは設定のグループ毎にprognでくくることをやっていたのだけれど、これは移動せずに設定のグループ全体をevalし直したいからだったんだなー。あんまり徹底できてはいない。

podhmopodhmo

2024/05/02

  • 直角直線矢印
  • emacsの調整
podhmopodhmo

スマホからだと、ファイル名のフルパスが見えなくてテストコードとそれ以外を区別できなくて困った。

podhmopodhmo

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 が出ることがありそう。

関係ありそうなのはこの辺の関数。

https://github.com/emacs-mirror/emacs/blob/0e0fe20040413d682f8078a2ddfb8f502cb89fb8/lisp/server.el#L1432

https://github.com/emacs-mirror/emacs/blob/0e0fe20040413d682f8078a2ddfb8f502cb89fb8/lisp/server.el#L1536

podhmopodhmo

/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
podhmopodhmo

ブラウザのタブのピンと同様のことをエディタ上でもやりたい。

podhmopodhmo

2024/05/04

  • 打鍵速度 (5 kps (keys per seconds)程度あれば良い)
  • Emacsの話
  • WSL Ubuntu24.04
podhmopodhmo

Emacsの話

結局、昨日のEmacsのアクティブなタブが分かりにくいというやつは非アクティブなタブに取り消し線を付けることにした( こんな感じ

Emacsでtheme毎にfontのfaceの扱いが違ってそうだった。この辺どうやると良いのか整理されてない(とはいえWSLの方のEmacsのバージョンを上げれば良いだけでは?)

💭 tab-barのカスタマイズが期待しない挙動になっていてそれでもマージしちゃって使っちゃうし、不完全な設定と付き合ってく感じなんだなーと思ったりした。

podhmopodhmo

そういえば、mermaidのコードとかをスマホからブラウザで読んでるけれど、こういうのをEmacsから読んでも良いのかもな。そしてgo to definitionがしたいとなればlanguage serverが立ち上がって欲しいという気持ちは分かる。

でも常に動いて動作が重たくなってほしくはない。

podhmopodhmo

あと、BPFの本を読みたいと思って読めてないな。あと効率的なgoのやつ。

podhmopodhmo

WSL Ubuntu24.04

private
WSL Ubuntu24.04 · Issue #168 · podhmo/dot-files

やっていることはだいたい

  1. screen,emacs,make,fonts-noto,golangあたりを入れる
  2. sshでkeygenしたものをgithubに登録
  3. ghqを入れる go install github.com/x-motemen/ghq@latest
  4. 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 $@
}
podhmopodhmo

wslの古いやつはしばらく維持しておくか。

> wsl --list
Linux 用 Windows サブシステム ディストリビューション:
Ubuntu-24.04 (既定)
Ubuntu
docker-desktop-data

[!TIP]
ちなみに、インストール可能なdistributionを一覧で表示するのは
wsl --list --online

podhmopodhmo

browse-urlでewwが動いてしまうのが面倒だな。executable-findで見つからないからか。。

テキトーにsymlinkを追加しておく.

$ ln -s $(type -p firefox.exe) ~/.local/bin/firefox

clipも同様の形でやった方が良い?

podhmopodhmo

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)
podhmopodhmo

2024/05/05

  • emacsの設定 (dired,view-mode)
podhmopodhmo

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
    • "[", "]" で戻る/進むを使えるようにした
podhmopodhmo

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 が動く

詳細

この辺を見ていくっぽい?
https://www.masteringemacs.org/article/how-to-get-started-tree-sitter

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.

podhmopodhmo

2024-05-08

  • トラックボール型のマウスを買った
podhmopodhmo

トラックボール型のマウスを買った

ノートPCのタッチパネルを無効にしてみた。トラックボールマウスを買ってみた(無線のものにしたけれどbluetoothのほうが良かったかもしれない)左手用のもののほうが置き場所的には邪魔にならなそうだったけれど右手用のものしかなかった。まぁいいか。

元々、エディタなどで文字を入力している時に誤ってタッチパネルを触ってしまいカーソル移動や右クリックが発生してしまっていた。これがなくなると良い気がする。設定でタッチパネルをオフにしてみた。無線が動かないタイミングではマウスが動かなくなるんだろうか?

podhmopodhmo

気になること

  • emojiの入力をできるようにする
  • emacsclient経由でタブで開くemacs29対応
  • skkのsticky inputになれる
podhmopodhmo

2024-05-11

  • x/twitterの内容をclipboardに保存したい
podhmopodhmo

💭 トラックボール型のマウスにしてノートPCのタッチパネルを無効にした弊害として仮想ディスプレイの移動などにも問題がでるみたい。

podhmopodhmo

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);
podhmopodhmo

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>

podhmopodhmo

なんか無名関数をうまくbookmarklet上で動かせなくなったりしてめんどくさくなってた。別にワンライナーで書く必要もないのだけれど。。

podhmopodhmo

拡張にしたり何なりとかはもはやパッケージングと配布の範囲でめんどくさい。。

podhmopodhmo

2024-05-12

  • emacs skk経由でemojiが入力できるようにする
  • ubuntu python pipxが利用できるようにする
  • skkの辞書をUTF-8にする
  • emacs emacsclientでtab-barのタブで開く
podhmopodhmo

emacs skk emoji

全ての絵文字 – コピペできる絵文字一覧

↑のようなページを利用して雑に登録できるようにする。辞書を作っても良いのかもしれない。

文字 入力
💭 /thought
📝 /memo

📝 euc-jpの辞書でも問題なく保存できるのか memo / /
(追記:これは嘘だった。emacsを再起動したら壊れた模様)

追記

辞書を用意してくれている人もいるみたい

https://github.com/uasi/skk-emoji-jisyo

追記

テキトーに一覧を作った

https://github.com/podhmo/podhmo.github.io/tree/master/list/emoji-list

podhmopodhmo

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
podhmopodhmo

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
podhmopodhmo

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") 
podhmopodhmo

(未解決) 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
podhmopodhmo

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)
podhmopodhmo

全体を何となく眺めてみたらEmacsのことばかりな気がする。やっぱり過去の形跡に現在が引きづられるんだろうか?

podhmopodhmo

2024-05-13

podhmopodhmo

充電したswitchを20日かけてようやく起動した(気力ガチャ)

  • スイカゲーム
  • マイクラ

それぞれ少しだけやった(日記)

「寝転ぶ、座る、立つ、運動」の辛さが普通の人より1段階左にズレていそう。歩くより立ち続けてる方が疲れるかもしれない。

podhmopodhmo

2024-05-14

  • Emacs TypeScript
podhmopodhmo

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と遷移が連動してない
podhmopodhmo

2024-05-15

  • Emacsの設定を調整
podhmopodhmo

実はtab-bar-modeは現状の使い方では不要でtab-line-modeだけあれば良いのかもしれない。
(new-frameして分けられたらそれで良い)

podhmopodhmo

細々とした調整

  • ✅ view-modeでもctrl-jをつかえるようにする
  • ✅ skk-modeの最中にctrl-jの代わりにctrl-JやM-jが使えるようにする
podhmopodhmo

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)))))))
podhmopodhmo

やっぱりtab-bar- modeですすめたい

tab-barでうまく行っていない理由はframe毎にhistoryを持つせいのようだ。

  • tab-bar-history-modeはtab毎にhistoryを持っている(?)
  • tab-bar-history-modeはtabの変更時だけではなくwindow configurationの変更時にもhistoryを更新する

この辺の挙動が期待とは異なっているみたい

podhmopodhmo

2024-05-16

  • なんとなくしたいあるいはした方が良いこと
  • emacs frameの利用
podhmopodhmo

そういえば、git grepしたファイルを開きたくなったりしたのだった。
ターミナル上でやるとURLはクリック可能だけれどファイルが無理。
とはいえすべてをエディタでやるのは苦痛なのだった(エディタ上でのターミナルは苦手)

podhmopodhmo

なんとなくしたいあるいはした方が良いこと

  • kamidanaの環境をモダンなかんじに更新(+昨今のpythonのツールチェインの学習)
  • reflect-shapeを直す(+goのバイナリレイアウトを知りたい)
  • mermaidの図で直角直線を使えるようにする (d3あたりの情報把握 + PR?)
  • マルチプロジェクト用のサブエディタとしてのEmacsの環境調整 (現在これがメインで進んでいそう)
  • (dictknife with deno)
  • (openaAPI simplifer)

💭ただなんとなく「役に立たないこと」をやったほうが良いきがする。あと楽しさがあったほうが良いかんじ。

podhmopodhmo

例えば「スイカゲーム」をやるとか「マイクラの整地」とかそういうもの?
💭脳死で作業できるようなものがあると良いきがしている
📝現状ではゲームの起動も成功できたら嬉しいみたいな状態(精神的なコストが重め)

スマホ、タブレット、PCでできることとできないことを整理していたりしていた。

podhmopodhmo

なんとなくopenAPIとかapi docがバカバカしくなったのはIDLみたいなのものを用意するのではなく直接コードが存在すれば良いじゃんみたいな感じのことを思ったりしがちだったので (tsならRSCとかc#ならmagiconionとか)あとdoc stringが親切でもあんまり嬉しくないとか。

というわけで一旦そういう作業から離れてみると良いのかもと思ったのだった。
cloudflare workerとか?何らかのuiだとかcreative coding的なことだとか

💭なんかどうでも良いことをつぶやく場所になってしまった。今日の内容必要?

podhmopodhmo

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を利用だとかの場合はそうなる。

podhmopodhmo

2024-05-18

  • mermaidの図ではなくmermaidの図を埋め込んだドキュメントを手軽に作りたい
  • スマホから少しずつ部分的に作っていきたい
podhmopodhmo

mermaidの図ではなくmermaidの図を埋め込んだドキュメントを手軽に作りたい

Emacs上でもmermaidの図が表示したくなった。

  • org-mode + exporter
  • markdown-modeを拡張する
  • 別途markdownのviewerを動かす + HMR

最後が一番キレイな気がした。最初の方もEmacsに振り切るならありなのかもしれない。

ローカルで動くいい感じのviewerが欲しい。

でもローカルでなんとなく覗いたときに画像として表示されてて欲しい気がする

podhmopodhmo

HMRというかファイル監視とブラウザリロードで良いんだろうか?
ファイル監視が勝手に動くと面倒な気もする。

フォーマッターの設定と同様に

  • 自動でファイルは更新される
  • C-x C-sにbuild and reloadをバインドする
  • (↑の実行は無駄なシグナルが省略されて動く)
podhmopodhmo

というか、こういう操作を抽象化したdaemonが欲しい気がする…

podhmopodhmo

スマホから少しずつ部分的に作っていきたい

mermaidの図をここに載せるあるいはgithub issueに載せるではなんでだめなんだろうか?

PCを常に開ければテキストエディタ上でやるのが一番良い。

書くときにはスマホで断片を出力していきたい(例えばこのscrapsのuiのように)。

Emacsでのmermaidの表示は見るときの話な気がする。書くときにはスマホからも触れると良い。

  • 見るとき
  • 書くとき

そしてmermaidのコードはさすがにスマホからでは記述し辛い。
それ専用のuiを作るには作りたい図が明確ではない。

podhmopodhmo

図を作るときはchatgpt的とは言わないけれど、jupyper notebook的と言っても良いかもだけど、複数の入力と応答が連なって表示されるようなuiの方が嬉しそう。見比べたい。

でもデプロイが必要なアプリは作りたくないな。

podhmopodhmo

2024-05-20

  • dartにマクロが
podhmopodhmo

まだ実験的。

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とかをみると良さそう。

https://github.com/dart-lang/language/tree/main/working/macros/example

JSON

https://github.com/dart-lang/sdk/blob/master/pkg/json/lib/json.dart

podhmopodhmo

こういうのが多い

macro class DataClass implements ClassDeclarationsMacro, ClassDefinitionMacro {
  const DataClass();

以下が分かってない

  • class declaration
  • class definition

dataclassのtostring部分の定義を見ると分かりそう。普通にシンボルの定義と本体の定義っぽい。まんま宣言と定義でなるほどという感じ。

https://github.com/dart-lang/language/blob/482288aa005a6d9f8e200a203b8ebeca49bae80d/working/macros/example/lib/data_class.dart#L257

なんか取り出してallFieldsとかやってるし感覚的にはPythonでのメタクラスやクラスデコレータでの作業の静的版がユースケースそう。いわゆるlispのマクロみたいに実行コードを膨らませる感じのマクロではなく定義を膨らませる感じそう(後者もlispにあるけれど)

実行結果の確認とか手軽にやる方法があるんだろうか?

podhmopodhmo

JSON中の表示

  • "\n\t" が混ざったJSONを読みやすく変換したいかも?
podhmopodhmo

2024-05-23

  • スマホでメモ
podhmopodhmo

失敗したテストを集めたい (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:"
podhmopodhmo

2024-05-26

  • windowsでカーソル移動が遅い
podhmopodhmo

これのflagsの説明はそれっぽいけれどどこにそのことが書かれているかはわからない
https://chatgpt.com/share/63fbf6f3-1644-4ed4-bdf8-0f7c1061aeb0

Windowsでキーボードのリピート速度を調整するためのレジストリキー HKEY_CURRENT_USER\Control Panel\Accessibility\Keyboard Response には、キーボードの応答性に関する設定が含まれています。各設定の意味は以下の通りです。

主なレジストリキーとその意味

  1. AutoRepeatDelay

    • 意味: キーを押してからリピートが始まるまでの待機時間をミリ秒単位で設定します。例えば、この値が 500 に設定されている場合、キーを押してから0.5秒後にキーのリピートが開始されます。
    • 値の範囲: 通常は 0 から 1000 ミリ秒の範囲で設定します。
  2. AutoRepeatRate

    • 意味: リピートが始まった後のリピート速度をミリ秒単位で設定します。例えば、この値が 50 に設定されている場合、キーが 50 ミリ秒ごとにリピートされます。
    • 値の範囲: 通常は 0 から 100 ミリ秒の範囲で設定します。
  3. BounceTime

    • 意味: キーが押されたと認識される間隔をミリ秒単位で設定します。この設定は、キーが跳ね返る(bounce)ことによって誤って複数回認識されるのを防ぐためのものです。
    • 値の範囲: 通常は 0 から 1000 ミリ秒の範囲で設定します。
  4. DelayBeforeAcceptance

    • 意味: キー入力を受け入れる前に待つ時間をミリ秒単位で設定します。この設定は、キーが意図せずに押された場合に入力を防ぐためのものです。
    • 値の範囲: 通常は 0 から 1000 ミリ秒の範囲で設定します。
  5. 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 が有効になっています。

これらの設定を変更することで、キーボードの応答性を自分の好みに合わせて調整することができます。設定を変更した後、システムを再起動するか、ログオフして再ログインすることで変更が反映されます。

podhmopodhmo

2024/05/29

podhmopodhmo

emacs

実は /tmp は常に保存される方が嬉しいのかもしれない。
ファイルを開いた時にサイズが大きい時には保存されない方が嬉しいかもしれない。
一行目が長い場合にはfundamendal modeで開いた方が嬉しいのかもしれない。

kill-ringを複数保存してそれを利用するというような機能をそういえばhelm/anything経由で使っていた。

podhmopodhmo

vscode

vscodeのbiomeのextensionを特定のプロジェクトのときだけ動かしたいとかができてない気がする(たぶん自分の設定の問題)

追記: extensionにdisable workspaceってあるな。これでいけるかも?

podhmopodhmo

なんか~/.vscode/extensionsを削除したらdisable workspaceを選べなくなった。
.code-workspace というのがわからない。

open folderし直したらいけた。

podhmopodhmo

2024-05-30

  • vscode key bindings
  • emacs M-| shell-command-on-region
podhmopodhmo

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
podhmopodhmo

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))
podhmopodhmo

こんな感じ?

(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

podhmopodhmo

いや、一番外側でletで囲めば良いだけか。

(let ((original-message ...))
  (defun my:... () ...))
podhmopodhmo

2024-06-09

  • ネストに強い出力用の記述が欲しい
podhmopodhmo

ネストに強い出力用の記述が欲しい

何かを入力として受け取りネストに強い出力をしたい。結局テキストのテンプレートエンジンだとかゆいところに手が届かない。ついでにシングルバイナリにできると嬉しい。

昔pythonでライブラリを書いていたのだけど似たような物が欲しい(こちらはwith構文を多用していたが高階関数でも構わない)。

https://github.com/podhmo/prestring

goは無名関数の型が省略できないのであんまり嬉しくない。

無名関数の引数の型を省略できて(推論されて)生成されたバイナリの起動速度が早い言語を探してたのだった。後で探そう。

言語の書き味としてはKotlinが良さそうではある

https://kotlinlang.org/docs/lambdas.html

(あとたしかKotlin Nativeとかあった記憶。コンパイル速度も速い方が良い)

https://kotlinlang.org/docs/native-overview.html

podhmopodhmo

可能ならast-grepというかtree-sitterと手軽に連携できると嬉しい。

podhmopodhmo

候補

  • kotlin
  • dart
  • rust
  • scala

いやもっと単純に以下でも良い気がする

  • c#
  • typescript (with deno bun)

もちろんocamlとかそういうのでも良いのだけど。こうなってくるとポータビリティ的な意味での手軽さの方が大切かも。

podhmopodhmo

もう少し用途を詰めたほうが良いかも。
(あと楽しさ)

podhmopodhmo

2024-06-09

  • Emacsで気になること
podhmopodhmo

Emacsで気になること

  • tree-sitterを利用したモードの作成方法
    • mermaid用のsyntax highlight
    • 拡張子に寄らない有効
  • 複数のモードを併用する方法
    • markdownの中でのコードブロック
podhmopodhmo

2024-06-12

  • emacs
    • 最初の1行が長いファイルを開いたときに固まる
    • M-| の挙動がうまきいっていなかった
  • WSL上でのbashの補完が遅い
podhmopodhmo

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) であっても遅い。

podhmopodhmo

bun (js)

どちらが良いんだろうな

  • snap install bun-js
  • curl -fsSL https://bun.sh/install | bash -ux

後者はbunのサイトに載っている方法で ~/.bun/bin/bun という感じにインストールされるらしい。

podhmopodhmo

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 を使っている。

https://zenn.dev/link/comments/8f765fa257b9a0

それ用にパスを探したい場合にはこんな感じで探す

$ PATH=$PATH:$WIN_PATH bash -c "type -p notepad.exe"
/mnt/c/WINDOWS/system32/notepad.exe
podhmopodhmo

Emacs上での補完も早くなる?

e.g. M-| などでのread-shell-stringとか

podhmopodhmo

2024-06-17

podhmopodhmo

久しぶりに.bashrc_wslを触ったらvimの操作を忘れてた範囲選択をしてインデントがしたかったが手が動かなかった。

操作 説明
範囲選択してインデント shift + v した後jjなどして >
undo u
redo ctrl + r

emacs上ならもちろん覚えていて範囲選択しctrl + u 2, ctrl + x ,ctrl + i みたいな感じ

podhmopodhmo

2024-06-19

podhmopodhmo

考えてみると、vscodeでswitch to buffer的なことはどうすれば良いんだろう。

開いてるタブに限らずfuzzy findで探すみたいなことはしてる

podhmopodhmo

2024-06-26

  • goのiterを真面目に考える
    • シリアライズとループと再開から…
  • go pluginsとか使ってreplつくれない?
podhmopodhmo

go/iter

ちょっと自分でも真面目に考えてみたい。

💭 Seqは概ねlinqでより強く言えばmap。実質ほとんどSeq2になるのでは?感がある。

雑な箇条書きのメモ

  • 内部イテレーター/外部イテレーター
    • 高階関数とRubyのblock
      • 無名関数亡き頃scheme
    • GoFのは外部イテレーター
  • iterがない頃
    • slicesかchannel
      • メモリーが問題
      • channelは難しい
  • いわゆるpythonのジェネレーター
    • send抜き
  • SeqとSeq2
    • Seqはほとんどmap
    • エラーハンドリングのためのSeq2
      • mapに対するk,vとかは誤差
      • パニックは?
        • (スキップしたい場合も)
    • 内部イテレーター
      • 後片付けを忘れずにできる
      • 中断はできるが再開ができない
      • 高階関数では合成できない
  • PullとPull2
    • 外部イテレーターに変換
    • 再開ができる
    • 利用例
      • merge cat
        • 複数のイテレーターを比較しつつ先頭から取り出す
  • channelと組み合わせる
    • errgroupに値を持たせる
      • slicesで受け取ると嬉しくない
        • ループで受け取れる終了をまたずに次に行ける
          • キャンセル対応は?
      • channelでも良いのでは?
        • そうかな?そうかも…
      • 例えば、クロウラーのようなもので力を発揮
        • 無名関数を使うとシリアライズできない
    • タスクを追加するようなタスクはどうする?
      • 単に2重ループにすれば良いだけそう
podhmopodhmo

シリアライズとループと再開

無名関数を使うとシリアライズできない

gobか何かにして保存したり。
そもそもメッセージキューにしたり.

podhmopodhmo

goのrepl

既存のやつは再コンパイルとかされて辛い。状態を持ちたい。importとか自由にしたい。

LinuxとMacだけで動けば十分な気がする。

go pluginsはどちら側で実行されるんだろ?

docstringとかも触りたい

ネストした場合とかどうなるんだろ?

ライブラリ単位で分割する必要がある?(ビルドキャッシュとか使えないんだろうか?)

$ go build -a -gcflags="-dynlink" std cmd

追記

dlopenしてる
https://cs.opensource.google/go/go/+/refs/tags/go1.22.4:src/plugin/plugin_dlopen.go;l=19

追記

現状抱えてる疑問

  • 状態というか複雑な値をプラグインに渡して壊れないか?
  • 複数のプラグインから使われてるライブラリが同じバイナリを共有してくれるか?(ネスト)
  • replから動的な実行を考えたときにastパースしないとダメかもそれはそう。
  • goのbuild cacheを上手く使えないか?
podhmopodhmo

2024-07-07

podhmopodhmo

2024-07-08

podhmopodhmo

goのツールをオンラインで実行したい。デプロイしたくない。e.g. oapi-codegen

podhmopodhmo

2024/07/11

  • goのmethodの情報が欲しい
  • gomacro
podhmopodhmo

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 あたりを覗いていく必要がある?
現在実行中のバイナリを知ることってできたっけ?

podhmopodhmo
$ 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>

https://github.com/golang/go/blob/master/src/cmd/objdump/main.go
https://github.com/golang/go/blob/master/src/cmd/nm/nm.go

podhmopodhmo

最悪debug.gosymとかで開き直す?

https://pkg.go.dev/debug/gosym

https://gist.github.com/methane/7085859

ここで

  • __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
podhmopodhmo

2024-07-13

  • goでast経由で書き換え
  • zennのscrapsのurlの展開
podhmopodhmo

goでast経由で書き換え

自前で頑張らずともast-grepのrewriteの代わりとして使えたりするのかな

podhmopodhmo

zennのscrapsのurlの展開

(全然関係ないけれどzennで"_"2つを使った名前のリンクが上手くいかないみたい
https://qiita.com/_ken_/items/0ee4e9a98b923a79418f

追記:

faqだった

カード型のリンクとして表示したい場合は
@[card](ここにURL)という書き方をしてください
podhmopodhmo

2024-07-14

podhmopodhmo

2024-07-24

  • github actionsの各ジョブの実行時間が知りたい
podhmopodhmo

(argparseの書き方とか久しぶりに使うと忘れてしまうな)

podhmopodhmo

gh auth token とかをそのまま渡したりすれば良いという気もする

podhmopodhmo

2024-07-25

  • go vetのanalyzer optionを列挙したい
podhmopodhmo

go vetのanalyzer optionを列挙したい

go vetで利用できるオプションを調べるには go tool vet help
(-vettool=で変更したものを追加するのはどうすれば良いんだろう?)

https://pkg.go.dev/cmd/vet

podhmopodhmo
$  go tool vet -flags | jq '.[] | [(.Name + " "*20)[:20], .Usage] | join("\t")' -r | sort
podhmopodhmo

2024-07-30

  • net/http graceful shutdown と go vet
podhmopodhmo

net/http graceful shutdown

http serverで言えばrequestを処理してる途中でバッサリ切断されると困るので穏やかにコネクションが空になるかtimeoutになるまで待ってからシャットダウンする感じの挙動のこと(のはず)。

net/httpの所にもコード例が存在する。

https://pkg.go.dev/net/http#Server.Shutdown

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
}

go vet -sigchanyzer

ところでこれを繋げるglueコードが go vetの -sigchanyzer で怒られていた(channelがbufferingされてない状態のコード)

https://pkg.go.dev/golang.org/x/tools@v0.23.0/go/analysis/passes/sigchanyzer

podhmopodhmo

📝 補足事項: 歴史的な経緯により 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()の実装ってなんか違ったっけ?
podhmopodhmo

signal.Notify() と unbuffered channel

signalChanへのsendがブロックされるという話だけどこれはsignal.Notifyの話?

↑はgoroutine回りっぱなしかも。
あと受信のところに行く前にSIGTERMが送信されるとmanners.Closeが呼ばれる前に終わることがある(?)

podhmopodhmo

普通に考えると、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)
}
podhmopodhmo

2024-08-10

  • goのインタプリタが欲しい
podhmopodhmo

minigo

goのインタプリタが欲しい

理由

  • go/packagesが遅い
  • packageに対する操作(メソッド)が持てない

機能

  • 遅い
  • channelとgoroutineの実装は要らない
  • importを可能な限り遅延したい
  • vm的なものをdumpしたい
  • エントリーポイントを変えたい(main)
  • docstringに対してmarkerを付けたい

more

  • replみたいなものが欲しい
  • time.Nowを実行したい
  • FFI?

📝考えてみると、goとしてもvalidであるためにはreflectで記述する必要がある?(せめてmapであれば)

作った

https://zenn.dev/podhmo/scraps/5df9409602a845

podhmopodhmo

気になること

  • 事後にパッケージをインポートして呼べる?(plugins?)
  • go listの中身
podhmopodhmo

こういう感じにネストした場合はどうなるんだろ?別のバイナリになる気はする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しても一度きりみたい(どうしてだか理解はまだしていない)。

podhmopodhmo

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>

podhmopodhmo

ビルドキャッシュもオブジェクトレイアウトもわかってなさそう

podhmopodhmo

2024-08-28

気になる

  • dave/dstでコードのinjectができるか調べる
    • 改行が含まれたコメントとコードでastだとバグる例
podhmopodhmo

2024-09-03

  • goのiter関数のインライン化(?)
  • generic alias types
  • ループ時の変数を省略できる
podhmopodhmo

2024-09-06

podhmopodhmo

ast-grep

結構ハマりやすいというかcontextとselectorがわからないと厳しいね。。

https://ast-grep.github.io/catalog/go/#match-function-call-in-golang
https://ast-grep.github.io/playground.html

# 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
podhmopodhmo

2024-09-16

  • tree .gitignore
  • typespec custom decorator
podhmopodhmo

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

https://stackoverflow.com/questions/5724455/can-i-make-a-user-specific-gitignore-file
http://oldmanprogrammer.net/source.php?dir=projects/tree/tree.c

podhmopodhmo

特定のディレクトリに移動したときに環境変数を設定するみたいなフックがほしい?

💭 treeコマンドも個別にaptで入れる感じではあるし、そもそも別の便利コマンドを使うべきみたいな話はあるかも?(grepに対するrgみたいな感じ)

podhmopodhmo

2024-09-22

  • vscode goto-definition/back
podhmopodhmo

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"
    },
podhmopodhmo

2024-09-28

‐inline script metadata

podhmopodhmo

スクリプト単位で環境が作られるならtyperとかclickとかが使われても配布に全然困らなくなるみたいな話。

ritchとかでも使えて便利。

あとhttpxだとかが使えるのも便利か

これができるとpyproject.tomlとかも含めて管理しなくて済むし楽に1ファイルにするためにバンドルみたいな面倒な一手間が不要になる。

podhmopodhmo

まぁでも拡張ライブラリが必要になる感じだと怠そうとかはあるかも?(含めたくない)

あとprivateなPackage Repositoryは使えるんだろうか?

podhmopodhmo

ネットワークへのアクセス無しで実行したいときもあるしinline script metadataの部分を見てzipappを作るやつとか欲しいかもしれない(pure_python_only=Trueみたいなオプションも欲しいかも)。

podhmopodhmo

2024-09-30

  • emacs ansi code sequenceを除去したい (from github action)
podhmopodhmo

消すのと色を付けるのとどちらが良いだろう?

  (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))))
  )
podhmopodhmo

2024-10-02

podhmopodhmo

直接バージョンを指定して実行するとそれが使われる。あるいはキャッシュを消す。まじ? @latest みたいなのないの?

podhmopodhmo

2024-10-03

  • WSLからclip.exeに渡すと文字化けする
  • 色々なブラウザ周りのイベントを把握したい
podhmopodhmo

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
podhmopodhmo

xselを使っても良いかも?

$ sudo apt install xsel
$ tree | xsel -bi
podhmopodhmo

せっかく作ってもスマホだと以下のような状況で悲しい

  • console.logの出力が見られない
  • クリップボードに画像を入れておくことができない?
podhmopodhmo

2024-10-09

‐Python 3.13のTypeIsとTypeGuard

podhmopodhmo

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)。

podhmopodhmo

PEP読んでたらそれぞれの述語部分の実装は実装者の責任で型を合わせるっぽい

podhmopodhmo

PEP742を読んだ感じTypeIsの方を先に見当するべきなんだな

Callableを引数として渡す部分の例に悩んだりした

Callable[[object], TypeIs[int]]の場所にCallable[[object], TypeIs[bool]]を渡せない。ここでbool < intだからそのままか。反変ではなく共変か。int以上を要求するけれどboolはサブタイプと言うだけの話か。

podhmopodhmo

2024/10/10

  • deno v2
  • jsrのstd/collectionsをlodashなどの代わりに使える?
podhmopodhmo

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してそれだけが切り出せたら勝ちという話か
(あとは実装の好みの問題)

podhmopodhmo

2024-10-11

  • ginからgin-minusを作ってみる
  • go mod graphからグラフを可視化できない?
podhmopodhmo

ginからgin-minusを作ってみる

ginは安定しているしいろいろなところで使われている。
一方で不要な依存とかもあるような気がする。例えばprotobufとかは使わない。

go.workやgo.modでreplaceすること前提のパッケージを作って使ってみる事はできるんだろうか?
(これを仮にgin-minusとしてみる)

podhmopodhmo

そういえば、x/twitterでgrpcと言っていたけれど、protobufの勘違いだった。
ところでprotobufへの直接の依存を仮に取り除いてgo mod tidyをしても間接的な参照が残っているのかindirect dependenciesのところに残ってしまう。これを調べる方法ってあったっけ?

podhmopodhmo

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
podhmopodhmo

quic-goを消したら消せた (代わりにhttp3のサポートが消えるけれど)

podhmopodhmo

とりあえず自分のフォーク先のところにPRを作ってみる。
こういう依存の除去が機械的にできればやっても良い気もする(とはいえvendorじゃない場合はあまり気にしないものかもしれない)

こちらは例を追加した方のPR(a.diffがgo.modの変わった差分)。
PRのbaseの方は手動で依存するパッケージを減らしたバージョン。これを機械的にやれないか?みたいな気持ちがあった。

https://github.com/podhmo/gin/pull/2

podhmopodhmo

optional dependenciesとかがあれば十分なものなような気もする。

exportされたstructのmethodになっているとDCO(dead code elimination)とかも効かなそうな気がする。つまるところtree-shakingができない。

podhmopodhmo

go mod graphからグラフ

go mod graph | awk '{print $1 " --> " $2}' | sed '1i\graph TD' > mod_dependency.mmd

名前が変数名として使えないと厳しい

podhmopodhmo

gistとかでのmermaidのpreviewも限界感あるかも。単なるsvgになりそうな気がするしうまくスマホからも触れるような無限に拡大できる何かが欲しい。

まぁでも複雑になるとグラフで可視化するのは限界がありそう。

podhmopodhmo

2024-10-15

  • 連鎖したPRを図示したい
  • mermaidでのescape
  • vscodeでよく使うキーボードショートカット
  • 連鎖したPRのsquash merge
podhmopodhmo

vscodeでよく使うキーボードショートカット

一番よく使うのは

  • cmd + shift + p での > (Show All Commands)
  • cmd + shift + o での @ (Go to Symbol)

かもしれない

そしてprimary sidebarとpanelのcloseもよく使う

podhmopodhmo

連鎖したPRのsquash merge

連鎖したsquash mergeをgit glogをつかってみるとrebaseの開始地点がわからなくなる。

これを例えば tmp-<branch name> のようなブランチをつくっておきrebaseしていくことで見やすくなるかもしれない。

podhmopodhmo

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
podhmopodhmo

2024-10-18

  • N月刊ラムダノートを見てADTが羨ましくなった
    • enumのlinter
  • ちょっと気になる
podhmopodhmo

特にコメントで管理するのではなく所定の書き方を期待してる感じっぽい

https://pkg.go.dev/github.com/nishanths/exhaustive#hdr-Definition_of_enum

package eco

type Biome int

const (
	Tundra  Biome = 1
	Savanna Biome = 2
	Desert  Biome = 3
)

そして型を見て管理してるみたい。

パッケージ内なら定数の箇所をパッケージ外ならexportされたものを見る。診断をswitchで開始する部分があんまりわかってない。

一応genericsのbasic kindが同じものをみてくれるみたい。unionで繋げると合成できる。

podhmopodhmo

exportFactでenumを集めてswitchに対してcheckerを走らせる感じ

podhmopodhmo

📝 ついでに、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

podhmopodhmo

2024-10-23

  • denoしたくなった
  • github copilotの回答をそのまま貼りたい
podhmopodhmo

jsrをCDNのようにして使う方法あるんだろうか?

tsを保持してるので厳しそう

podhmopodhmo

github copilotの回答をそのまま貼りたい

なんか謎のリンクが入る。これを除去したい。

podhmopodhmo

2024-10-24

  • macのkittyでvscodeからxslxを開きたいときに死ぬ
  • denoやtsでの型を推論した結果をクリップボードにコピーしたい
  • denoでのcommand line arguments parserのライブラリ悩み
podhmopodhmo

denoやtsでの型を推論した結果をクリップボードにコピーしたい

こういうやつ

podhmopodhmo

この辺も微妙

  • yargs -- デフォルトがstrictじゃない
  • commander -- 大袈裟感ある (argparseが許せるなら良いか?)
podhmopodhmo

📝minimistのunknown optionの存在に後で気づいた

podhmopodhmo

2024/10/26

  • @std/cli.parse-args の型パズルを理解したい
  • emacs auto-save-visited-modeを有効にした時、エディタのバッファ上に残ったファイルの保存を聞かれてしまう
    • ディレクトリを削除した後にこれが起きるとmini bufferの入力が奪われる
podhmopodhmo

全然関係ないけれど、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"],
 * });
 * ```
 */
podhmopodhmo

2024-10-28

  • deno用のcli option parserを書き始めた
podhmopodhmo

あとで公開した

https://jsr.io/@podhmo/with-help

deno.lock無しで安定させるという意味だと1ファイルでも標準ライブラリに依存するだけのライブラリならバージョンを固定してimportすることで対応できる。

podhmopodhmo

2024-10-30

  • typescriptの型パズル続き
podhmopodhmo

typescriptの型パズルの続き

前回作り始めたやつは一度型のことを考えずに動作だけを担保するようにしてみた。型の方の実装をしなくてはいけない。とはいえ今までの型パズルは一つの関数に対する型だったので複数の関数の引数だったり戻り値の型として再利用するような型の定義の仕方がわかっていなかった。

とりあえずコマンドライン引数パーサーのミニ版をベースに考えてみることにした。

https://gist.github.com/podhmo/7b9eed807e6aa2f3e46671c94f8ab4a0

podhmopodhmo

2024-11-02

  • jsrに@podhmo/with-helpを公開した
    • 不要なファイルもjsrに上がってるかも?
    • 地味に型チェックのテストが欲しくなった
  • vscodeのFormat documentとdeno fmtのフォーマットが異なっていそう?
  • vscodeでworkspace毎にextensionを無効にできるのは良いのだけれど -n で開くたびに設定し直すのが辛い
    • denoを書いているときpythonやgoなどのextensionは要らない
podhmopodhmo

2024-11-04

  • jsrにアップロードしたパッケージをesmとして使う
  • コマンドラインオプションの不備について考える
  • 自前のdeno bundleを作る
  • 英語を書く練習したい
podhmopodhmo

コマンドラインオプションの不備について考える

hello worldをベースに考えた

https://gist.github.com/podhmo/da9d13b7a72fea8baf8678cda4105320

  • 関数で覆えばundefinedを除外はできる
    • console.logとか許容するものにそのまま渡してると突き進んでしまう
  • デフォルト値を雑に加えると不備を埋め込む
    • EitherとかMaybe(Option)を使っててもこれは同様かも?
    • Optionalなパラメーターとデフォルト値のセットがやばい
podhmopodhmo

そういえばyaml-language-serverとかdenoで動かせるのかな?

podhmopodhmo

英語を書く練習したい

言葉がスッと出てこない

prompt的な物のアイデア

  • 私は第二言語として英語を使う人です
  • 日: から始まる日本語と英:から始まる英語を受け取ってください
  • 受け取った日本語はなるべく流暢な特にネイティブが使うとされる簡単な単語を使った慣用表現をを使わずに学部レベルの英語に翻訳してください
  • 受け取った英語に対して以下2つのアドバイスをください
    1. 文法的により適切な形に変換するためのアドバイス
    2. 受け取った英語と日本語の意味の差異を埋めるためのアドバイス
podhmopodhmo

2024-11-05

  • pyproject.tomlを使う最小構成を知りたい
  • vendoringするような形でのパッケージの取り込みの方法を知りたい
  • tsxをいい感じにtranspileする方法を探したい
  • 環境を報告するためのenvinfo
podhmopodhmo

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ってまだ対応していないんだろうか?

podhmopodhmo

いや、pep660自体にはpipも対応している。
そもそも{ path = "./vendor/bar", develop = true} という記法が対応しているか分からない。
bar @ file://<full path>/vendor/bar みたいな設定は可能だけれど、これはローカルファイルからのインストールでsite-packages以下にコピーするもの(後たぶん絶対パスじゃないとだめそう)。

podhmopodhmo

この話は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.

podhmopodhmo

tsxをいい感じにtranspileする方法を探したい

この辺で調べたりなどしてた

とりあえずの成果としてはdeno-language-serverと協調しつつpreactのcomponentを書いてるときに怒られがない状況を作る方法がわかって良かった。

transpileが期待したものにならない?感じはしてて調べたりなどしてた

  • deno/emit
  • swc
  • deno/graph
  • deno/import_map
podhmopodhmo

2024-11-06

  • 1ファイルでのdeno.jsonについて
  • コマンドライン引数パーサーにliteral unionでの絞り込みを追加したい
podhmopodhmo

1ファイルでのdeno.jsonについて

import mapを弄るのが面倒くさい。
1ファイルで収まるならコード上に直接書いちゃうべきかも。

auto importの類はできたら最高だけどあまり信じてない。ただgoで考えるならgoimportsか。@std/*の範囲だけ補完してくれるようなものがあればそれで十分かも?

なんかvscodeの拡張辺りに設定が紛れ込んでいそう?

podhmopodhmo

そういえば as constのオブジェクトからtypeof keyofでつくる人もいるんだな

podhmopodhmo
podhmopodhmo

ようやく戦いに勝利した

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; }
podhmopodhmo

2024/11/08

  • with-help
    • as constを消せた
      • 昨日の↑のアイデアだけだと、型エラーの表示があんまり嬉しくなかった
    • 結局srcレイアウトをやめた。jsrのFilesから見たときにsrcが余分に見えたので。
  • なぜ自分がChatGPTに問いかけたものは信用がおけると思ってしまうのか?みたいな文章を書いた
podhmopodhmo

2024-11-10

  • TypeScriptのNoInfer
  • deno fmtをvscode側でも有効にしたい
  • 雑にYoutubeのAPIをdenoから呼びたい
podhmopodhmo

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")のような記述をしなくてはいけなかった)

podhmopodhmo

deno fmtをvscode側でも有効にしたい

こんなのを書かないとだめなのかな?

{
    "deno.enable": true,
    "[typescript]": {
        "editor.defaultFormatter": "denoland.vscode-deno",
        "editor.formatOnSave": true
    },
    "[javascript]": {
        "editor.defaultFormatter": "denoland.vscode-deno",
        "editor.formatOnSave": true
    }
}
podhmopodhmo

雑にYoutubeのAPIをdenoから呼びたい

型情報が取れないのが不便だった。@types/youtubeってそれ用の型ではないのか?

REST APIはすなおにfetchで良さそうだけれど、graphqlとかはどうなんだろ?

podhmopodhmo

あと、pagination的なものを呼んでいるときにprogres barを作る方法はどうすると良いんだろう?

podhmopodhmo

2024-11-11

  • deno .gitignore
podhmopodhmo

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
podhmopodhmo

.jsoncはコメントが書けるのが便利かもしれない。

podhmopodhmo

2024-11-12

  • 日中寝込んでた
  • 型を詳細化したときのtsのコードの書き方がよくわかってなかった
  • Deno.* の類はどのくらいあるんだろう?
podhmopodhmo

型を詳細化したときのtsのコードの書き方がよくわかっていないかった

podhmopodhmo
podhmopodhmo

2024-11-13

  • deno jsoncファイルの読み込み
  • markdownからjsx経由でhtmlを生成してみる
  • dax覚えても良いかも?
podhmopodhmo

markdownからjsx経由でhtmlを生成してみる

分かんないこと

  • dist以下をimportするのがキモい(dark)
  • 調べたりした @jsx とかのコメントが効いてない気がする
podhmopodhmo

📝
~/.cache/deno/npm/registry.npm.org/ にnpmのキャッシュが保管されるみたい

podhmopodhmo

2024-11-15

  • with-helpでliteral unionでの絞り込みを追加したい
podhmopodhmo

with-helpでliteral unionでの絞り込みを追加したい

restrictionみたいなオブジェクトを導入することにした。つまり二段階ある感じにする。

  1. parsing phase (minimistのスーパーセットとして機能。string,booleanだけ対応)
  2. 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) };
podhmopodhmo

int,floatのようなものも増やしたい?どうだろう。。
オブジェクトとしてスプレッドすると型の表現が見やすくなるのも相まって良い感じかも。

podhmopodhmo

2024-11-16

  • WSL上でgh auth loginでブラウザが立ち上がらない
  • esbuild + esbuild-deno-loaderを試してみる
podhmopodhmo

WSL上でgh auth loginでブラウザが立ち上がらない

Try using BROWSER=/mnt/c/Windows/explorer.exe gh auth login. Pasting the code directly at https://github.com/login/device didn’t work for me, as gh was still stuck waiting. But the BROWSER flag opened the browser and fixed it.

なんかBROWSERを指定して起動してもファイルが見つからなくてforkで失敗していた。同じ感じ?

podhmopodhmo

とりあえず↓とかで立ち上げて https://github.com/login/device に直接URLで飛んで作業したら大丈夫そうだった

gh auth login -p ssh -w
podhmopodhmo

だめだった。諦めてPATを作って gh auth login -p ssh --with-token < /tmp/token.txt とかした。

podhmopodhmo

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作成のような気がした
podhmopodhmo

2024-11-17

  • (昨日の続き) deno用のファイルをブラウザで実行できる感じに変換する
  • direnvどうなってるの?
podhmopodhmo

🐾npm:preactでのcomponentをesmに変換することはできた(preact自体はesm.shにおまかせ)

結局esbuildのpluginだけで十分かも?
tree-shakingまで踏み込むと辛い(import文自体に触る方法がなさそう)
依存の依存までを管理できない

追記:

🐾htmlとpreactのファイルだけをまとめたgistを別途作った。↑のgistはすべてを含んでいるのでごちゃごちゃしていて見にくい。

podhmopodhmo

direnvどうなってるの?

そういえばたまたま副次的に気づいたことだけれど、例えばdirenvのここに対応するシェルが存在してないなら環境故のエラーは自分が尖り過ぎた設定のための自己責任みたいな切り分けはできそう(あるいはコントリビューションチャンス)

podhmopodhmo

2024/11/19

‐ 欲しいもの

podhmopodhmo

欲しいもの bsky投稿ツール

文章を入力するとそれをbskyに投稿するdenoのスクリプトが欲しい。

それをEmacsから呼び出したい。指定するのはgistで十分なはず。メール送信的なuiで呼び出したい。

文章を投稿するときに、例えば、chatgptのapi経由で日英の翻訳結果を含めて欲しい。さらにその翻訳結果を英日に変換した結果を含めて欲しい。さらに幾つかの構文的なトピックを挙げて欲しい。

可能ならその状態から始まるチャットを始めるURLを添付して欲しい。

さらに今までのことを行うPWAが欲しい。ここでは一切バックエンドの実装をせずにフロントエンド上でbsky及びchatgptのキーを入力させ利用する形にして欲しい。

可能ならそれを投稿した時のイベントの送信をするような機能を付けて欲しい。利用したブラウザ自身が渡したURLに所定のフォーマットでデータを送信する(web hook)。

podhmopodhmo

欲しいもの2 index.html生成スクリプト

シンプルにgithub pages用のlsに変わるようなindex.htmlを生成するスクリプトが欲しい。github上のURLにも飛べると嬉しい。

対象は同じディレクトリ内の以下のファイル

  • .md は github上へのリンク
  • .htmlは github 上へのリンク
  • (生成日時/更新日時は欲しい?)

これらを再帰的に良い感じに呼び出してほしい(これは何らかのタスクファイルを生成する形にしても良い)

出力されるindex.htmlの見た目の基本はよくあるくみこみのファイルサーバー例えばpython -m http.serverのディレクトリ箇所へのアクセスと同様のもので良いがスマホで見やすい形にしてして欲しい。具体的にはviewportを指定して欲しい。

podhmopodhmo

2024-11-21

  • jqの表示を良い感じにしたい
podhmopodhmo

jqの表示を良い感じにしたい

  • N文字で切り捨てしつつ空白でパディング
  • 複数のフィールドの表示
    • JSONのオブジェクトとして出力
    • 配列にした後tsvに変換
    • (一つの文字列に合体)
podhmopodhmo
# 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'