ThinkPad T490を処分した

4年ほど酷使していたのだけど, 最近ディスクエラーが増えまくって強制終了せざるを得ないことが増えてきたので新しいラップトップを買った. それにともない不要になった ThinkPad T490を処分することにしたのでその記録.

ディスクの消去

scrapbox.io

自分でやるの久しぶりだったので, dd if=/dev/zero of=/dev/hoge でいいんじゃねって思っていたけど, 調べると SSDはそうじゃないとのことだった. NVMeタイプだったので Linuxだと nvme-cli でいけるとのこと. bootable USBメモリを作って必要なソフトをインストールして試してみたのだが, ThinkPadではうまく機能しなかった. (各所で見られる一度 suspendしてからなども試したが無理であった)

github.com

NVME Admin command error:ACCESS_DENIED: Access to the namespace and/or LBA range is denied due to lack of access rights(4286)

上記のリンクのようにこのエラーが出てどうしようもなかったので, 上記の issueに書いていた Thinkpad Drive Erase Utilityを使って消去することにした.

Thinkpad Drive Erase Utility

support.lenovo.com

ここから自分の機種にあったツールの isoを取得し, USBメモリに焼いた

dd if=thinkpad_drive_erase_utility.iso of=/dev/sda bs=1M

この USBメモリからブートして指示に従い消去作業を進めたところエラーがでることなく, ディスクの消去が問題なく行えた.

PCの処分

住んでいる区と連携している リネットジャパンに申し込んだ. 箱だけ用意すればその他費用は不要であった. 宅配便の人が受け取りに来るのでそれまでに箱の梱包を済ませた.

eglotで一部 LSPの機能を無効化する

たまに Emacsでコード書いているときに, eglotが自動フォーマットするのがうざいとので方法を調べた。基本はフォーマッタ使って整形しているのでエディタで意図せぬタイミングで整形をされるとイラッとするので、無効化しておいた。

(setq eglot-ignored-server-capabilities '(:documentFormattingProvider
                                          :documentOnTypeFormattingProvider
                                          :documentRangeFormattingProvider))

上記のように eglot-ignored-server-capabilities に無効化したい機能をリストで列挙すればよい。docstringにサポートしている機能がすべて列挙されているのでそれを見て自分が不要と思う機能をリストに追加することで無効化できます. これで編集中に勝手に整形されることはなくなる.

zshでポータブルな statコマンドを使う

ほとんどの人は知る必要はないと思いますが、zshの補完を書いていて環境に応じて statコマンドでファイル更新日時を取得する必要があったのですが, GNU系と BSD系でコマンド体系が違うくて何かいい方法がないかと調べたところ zshの stat moduleを使えばいいということがわかった.

モジュールのロード

zmodload -F zsh/stat b:zstat 2> /dev/null # 補完スクリプトだと複数回実行されることがあるため, エラー表示は捨てる

これで zstatというコマンドが使えるようになります.

使い方 例

# ファイル更新日時を表示
zstat +mtime README.md

# 結果を表示せず指定した配列変数に格納する
zstat -A array_var README.md

詳しくは https://zsh.sourceforge.io/Doc/Release/Zsh-Modules.html を参照してください. 補完も当然効くのでそれでもだいたいわかります.

ウインドウサイズが小さすぎると VSCodeで F#コードを REPLに送るとエラーが出る

ただのメモです. VSCodeで F#を書いていて, FSI: Send File などのコードを REPLに送って評価する処理がこのエラーで全然機能しないことがあって原因も全然わかっていなかったんですけど, VScodeのウインドウサイズが小さすぎると出てしまうみたいで, ウインドウサイズを大きくするとエラーが解消されました. 謎.

モニタのサイズなどにもよるのかもしれないですが, 以下のものだとエラーが出て

以下ぐらいにするとエラーが解消されます

issueを見てみたのですがそれっぽいものが見当たらず. 時間があるときにちゃんと探してみます.

html/templateで key=val を出力する際は template.HTMLAttr型を使う

すごい久しぶりに goコードを書いたらいろいろと忘れていたのでメモ

templateに任意の属性を出力するようなコードを書きたかったが,

package main

import (
        "html/template"
        "log"
        "os"
)

var htmlTemplate = `
<p {{.Attr}}>
`

type Data struct {
        Attr string
}

func main() {
        t, err := template.New("test").Parse(htmlTemplate)
        if err != nil {
                log.Fatal(err)
        }

        d := Data{
                Attr: `class="foo"`,
        }

        if err := t.Execute(os.Stdout, &d); err != nil {
                log.Fatal(err)
        }
}

string と宣言してしまうと下記のようになってしまう

<p ZgotmplZ>

どうするだと思って調べたところ template.HTMLAttr 型を使えばよかった

package main

import (
    "html/template"
    "log"
    "os"
)

var htmlTemplate = `
<p {{.Attr}}>
`

type Data struct {
    Attr template.HTMLAttr
}

func main() {
    t, err := template.New("test").Parse(htmlTemplate)
    if err != nil {
        log.Fatal(err)
    }

    d := Data{
        Attr: `class="foo"`,
    }

    if err := t.Execute(os.Stdout, &d); err != nil {
        log.Fatal(err)
    }
}

出力は以下のようになる

<p class="foo">

ドキュメントにあるように信頼できる入力に対してのみ使うべきで何でも使うべきではないので利用の際は注意が必要

use-packageで :vcキーワードが使えるようになった

github.com

開発版だけど, use-packageで :vc キーワードがサポートされ標準のパッケージマネージャだけでも gitなどで管理されているパッケージも管理できるようになった. この機能がなかったため, やむおえず ここに書いたような設定を追加していたが:vc キーワードサポートにより不要になった. 以下のように書けば ok. 詳しくは最新版を入れて info use-package を参照してください.

(use-package editutil
  :vc (:url "https://github.com/syohex/emacs-editutil.git" :rev :newest)
  :config
  (editutil-default-setup)
  (set-face-attribute 'editutil-clean-space nil
                      :foreground "purple")
  (set-face-attribute 'editutil-vc-branch nil
                      :foreground "color-202"
                      :weight 'extra-bold))

Ubuntu 23.04にアップデートしたら clangdが動かなくなった問題の対応

先日 Ubuntu 23.04にアップデートしたら clangdが動かなくなり, Emacsの eglotや VScodeC++の補完等が一切効かなくなってしまった. その修正方法のメモ.

問題

clang, clang++が標準ヘッダファイルを見つけることができずファイルを解析できなくなってしまっていた.

原因

clang, clang++の include search pathが GCC 13のものになっており, GCC13がインストールされていないことが原因であった. clang++ -v で確かめてみると, GCC13のヘッダファイルを見ていることが確認できる.

% clang++ -v test.cpp

#include <...> search starts here:
 /usr/bin/../lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13
 /usr/bin/../lib/gcc/x86_64-linux-gnu/13/../../../../include/x86_64-linux-gnu/c++/13
 /usr/bin/../lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/backward
 /usr/lib/llvm-15/lib/clang/15.0.7/include
 /usr/local/include
 /usr/include/x86_64-linux-gnu
 /usr/include

なので gcc-13をインストールすることで問題は解消した

# gcc-13も入るので, g++を入れておく
sudo apt install g++-13

しかし Ubuntu 23.04の標準の gccは 12だし, gcc 13はそもそもインストールしていなかったのにその場所を見るというのも変である.

自分の環境による問題かは不明だが, これで問題は解消し, eglotも VSCodeも問題はなくなった.