Tech

new と malloc(3) を混在させていいのか

という議論が ここ にあったけど(2007 年……古い……!),malloc(3) で取ってきたメモリを delete(もしくは delete[])に渡してはいけないとか,new で取ってきた メモリを free(3) に渡してはいけないのに malloc(3) を読んだり new したり しても問題ないってのはなんか奇妙な話な気がしてきた。 (普通に C++ 書いていれば malloc には用がないけど)。 なぜかというと,どちらのメモリも malloc(3) が管理していないと, 同じ領域が別の用途で使われてしまうということになるので。 で,new で取ってきたのも malloc が管理しているんだったら, delete しても free(3) に渡されるだけだから, デストラクタとかがなければ問題にならない気がする。 と思って gdb でアタッチして試したら実際に malloc が呼ばれてるっぽい。 まあ仕様上未定義ってだけだよね。

rootfs に NTFS を使う?

しかも ArchLinux でやってる。エモい。 https://github.com/nikp123/ntfs-rootfs/wiki 正気か?POSIX のパーミッションをサポートしてないので無理な気がしたけど 非公式のサポートがあるらしい。誰得なんだろ。 安定しているの? シャットダウンできないことを除けばとても安定している。 :thinking_face: パーミッション周りをゴニョゴニョやってるせいでパフォーマンスは悪いらしい。

GNOME 端末 と Sixel

GNOME 端末,というか GNOME 端末が使っている vte に Sixel が入ってほしいな, と思っていたけど,これ を見た感じ入る日は来なさそうだな,と思った。 この issue は重複する issue を上げるな,というところから, sixel のプロトコルがレガシーでパレットベースで,view/model を分けるのが困難 という説明までしている。 bugzilla の方もパッチはあるけどそのパッチが入る雰囲気はゼロだった。 2021/8/10 追記 そういえばこれ入ってました。

ls --hyperlink の Feature Request を見つけた

https://lists.gnu.org/archive/html/coreutils/2017-05/msg00000.html こんな変なものも割と簡単に受け入れられるんだな,と思った。 で,ここにパッチとかも入ってるメール。 https://lists.gnu.org/archive/html/coreutils/2017-08/msg00038.html

チャンクアップデートの最小幅を使ってパフォーマンスチューニングした

Minecraft で読み込まれるチャンクの半径は 3–16 の間で選べるのだそうだ。 ということは,5 チャンク飛ばして更新されているか確認していけば 3 チャンクだったとしても どこかのチャンクにはぶつかるということだ。 というわけで,1 チャンク見て,間の 5 チャンクは更新されているかの確認もせずに 飛ばして,更新されていたら間のチャンクがアップデートされているか確認する ということにすると,何も更新がない場合の生成がかなり速くなった。 やっぱりやることを減らすと簡単にかなり速くなる。

Emacs の glasses-mode

camel case を snake case で表示してくれるやつ。 僕は camel case より snake case や chain case の方が好きなので, ………と思ったけど表示とデータが違うって実際に書くときに使える訳ないじゃん。 そういや C# で推奨されてるメソッド名を大文字で始めるってやつ好きくない。。。。。(言葉がおかしい) (setq glasses-mode-uncapitalize-p t) ってしとくと,アンダースコア直後のアルファベットが小文字に変換されて表示される。 まあ実用性はないです。 実用性ないといえば,M-x zone とかけっこう好き。特に drip 系のエフェクトが秀逸。 という訳で,glasses-mode は好きじゃないスタイルのソースコードを眺めるときに便利だよ, という話でした。(ほんまか)

xterm でクリックできるっていうのでいうと

xterm だと何らかのコントロールシーケンスでマウスのクリックを 取れるとかいうのがあったな。そんなコントロールシーケンス使ったことないので 説明はできないが。 working example でいうと,w3m とか。w3m 素敵だよね。 こんにちの Web には対応不可能感が漂いすぎてるけど。 あと Emacs だと M-x xterm-mouse-mode でマウスで カーソルを動かしたりできるようになる。

ハイパーリンクのエスケープシーケンス

端末エミュレータで URL に飛ぶといえば,たいていのものについている URL の自動検出機能 を使うというのがまあ普通の答えになる気がするんですが,任意のテキストに URL を割り当てる エスケープシーケンスというのが世の中には存在するという話。(今日知った) TL;DR ハイパーリンクは次のようなエスケープシーケンスで実現できる。1 "\e]8;;${URL}\a${LABEL}\e]8;;\a" 例えば,http://example.com に飛ぶ 「Click here」というリンクを作りたかったら, 下のようにする。 "\e]8;;http://example.com/\aClick here\e]8;;\a" 経緯 これを知ったきっかけというのは, $ coredumpctl --help というコマンドを実行したことだった。ヘルプの下の方に coredumpctl(1) man page という点線のついた文字が表示されていて,右クリックのメニューからリンクをたどってみると, マニュアルページのウィンドウが表示されて驚いた。僕は plain-old な man コマンドでの 表示の方が好きなので,HTML 変換されたものが表示されたのには納得がいかなかったが。 まあそんなことはさておき……。

簡単なテキストエディタを作る(その1)

前のポストでテキストエディタ自作の知見のことを思い出したので,書いておこうかなと。 この記事では,端末で動く簡単なテキストエディタを作ります(ただし, そんなにまとまっていないかつサンプルコードとかも限りなく少なくなると思うので, 断片的な情報にすぎない気がする)。 この記事では GNU/Linux のシステムを前提としますが,macOS や BSD 系の OS など Unix 系の OS であればほとんどの内容は通用すると思われます。 また,Windows Subsystem for Linux (WSL) でもおそらく動作しますが, テストはしていません。 また,端末エミュレータは xterm 互換である必要があります。 GNOME 端末,Konsole,mlterm など主要な端末エミュレータ(端末)であれば問題ありません。 WSL を使っている場合で,Windows Terminal を使っている場合, 細かい部分で非互換が発生することがあります。 なお,筆者は ArchLinux 上の GNOME 端末で開発を行いました。

Linux From Scratch

有名すぎて今更感あるけど(でも実際にやった人はあまりいないと思われ)やってみたい。 grub のコマンドを編集すると bash を init ってことにして 立ち上げたりできるので(シングルユーザーモードで起動するみたいな話), 特定の処理専用の Linux を作れるよな,と思ったところから, Linux From Scratch したいみたいな発想になってしまった。 http://lfsbookja.osdn.jp/7.10/ 翻訳のバージョンはちょっと古そうだが,英語を読むという辛さがないし, 参考にしながら腕試しがてらやってみるのもいいかな,という気持ちになった (持てる知識だけで新しい構成にしつつ起動するところまでいけるのかは微妙)。 そもそもこれは systemd じゃなさそうだし,systemd にするにはいろいろ変える必要がありそう。 まあ僕は systemd 便利でいわゆるきれいな設計なんだろうなとは思うけどあまり賛成派ではない。