i386 architectureのパッケージをすべて削除する

昨日メイン PCとサーバを Ubuntu 22.10に上げたけど改めて考えると i386パッケージいらないだろってことで消してみた. 複数あることでアップデートなんかも遅くなるので.

パッケージを削除する

下記のコマンドなどで i386パッケージを一覧を得て, :i386 が末尾についているパッケージを削除していく. 一応依存を確認したりしながら行ったが, 基本的には全部いらないと思う.

## 一覧表示
% dpkg -l  |grep ':i386'

## パッケージ削除
% sudo apt purge some_package:i386

## 依存関係を見る
% apt rdepends --installed some_package:i386

22.04で i386環境がある場合, おそらく以下のパッケージが削除できない

  • gcc-12-base
  • libc6
  • libcrypt1
  • libgcc-s1

これらのパッケージは下記のコマンドで強制的に削除する

sudo dpkg --purge --force-remove-protected {gcc-12-base,libc6,libcrypt1,libgcc-s1}:i386

アーキテクチャリストから i386を削除する

依存パッケージをすべて削除したら, 下記のコマンドで i386アーキテクチャリストから削除する

% sudo dpkg --remove-architecture i386

最後に i386が削除されたことを確認する. 何も表示されなければ OK

% dpkg --print-foreign-architectures

特定のプログラミング言語でショートカットキーを有効化する

[
    {
        "key": "f1",
        "command": "rust-analyzer.openDocs",
        "when": "editorLangId == rust"
    },
]

when プロパティに editorLangId の条件を追加してやればよい.

リファレンス - https://code.visualstudio.com/api/references/when-clause-contexts - https://code.visualstudio.com/docs/languages/identifiers

flutterの zsh補完を version 3対応した

github.com

古いままだぞという指摘されたので対応した. もっとちゃんとしない部分はあるけど基本は元のままにオプション等をひとまず version 3対応した.

bash補完は公式で提供されるのが, flutterコマンドを実行して補完リストを使っているので遅い. コードは少なくて済むのだけど. zshは現状手でちまちま書いており, メンテナンスは大変だが, bash版に比べるとだいぶ早く実用的にも問題ないと思うのでまあいいかという感じ. Cとか Rustとかで書かれていれば, コマンド実行して補完リスト使ってていうのも選択肢には入ると思うのだが, Dartのせいなのかまだ無理かなと感じた.

ダウンロードした tar.gzをファイルに書き出さずに展開する

諸事情で Perlを書いていてやり方がわからなかったので調べた. ローカルファイルの tar.gzを展開みたいなのはそれなりにあったけど, オンメモリのまま処理する方法が皆無だった.

#!/usr/bin/env perl
use strict;
use warnings;

use HTTP::Tiny;
use Encode;
use Archive::Tar;
use IO::Uncompress::Gunzip qw(:all);

my $dest = shift;
my $url = 'https://www.cpan.org/src/5.0/perl-5.36.0.tar.gz';

my $res = HTTP::Tiny->new->get($url);
unless ($res->{success}) {
    die "$res->{status} $res->{reason}";
}

my $tar_buf;
gunzip \$res->{content}, \$tar_buf or die "gunzip failed: $GunzipError\n"; 

open my $fh, '<', \$tar_buf or die "Can't open tar content as a file handle: $!";

my $tar = Archive::Tar->new;
$tar->read($fh);

if (defined $dest) {
    $tar->setcwd($dest);
}

$tar->extract;

close $fh;

Perl Navigator を使って書いたけど, 他言語に比べるとだいぶ貧弱だが, 幾分補完やエラーチェックも効き Emacs等で書くよりはだいぶ楽に書けた気がする. 何も補完が効かないとかさすがにもう書けなくなってしまったのでありがたい存在でした.

git-credential-manager-coreのインストール場所が Git for Windows 2.36.1で変更されていた

WSL2の git認証の手間を省くために git-credential-manager-coreを使っているが, Git for Windows 2.36.1でインストールパスが変わっており, pushや pullをしたりしようとすると file not found と出るようになってしまった. パスは次のように変わっていました.

C:/Program Files/Git/mingw64/libexec/git-core/git-credential-manager-core.exe

から

C:/Program Files/Git/mingw64/bin/git-credential-manager-core.exe

に変わっていた. 古い記事を参照しようとするとハマるので注意.

変更が行われた PRはこれ.

github.com

WSL2内の .gitconfigを下記のように変更しておいた.

[credential]
helper = "/mnt/c/Program\\ Files/Git/mingw64/bin/git-credential-manager-core.exe"

emacs 28.1で導入された repeat-modeに関する調査

はじめに

最近まともに追っていなかったから存在さえ知らなかったのだけど、markdown-modeの issueでそういう機能があってどういうものかと使い方を調べてみた.

機能

特定のコマンドのグループを連続でお手軽に実行するための仕組み. 例えば移動系コマンドで次に移動が C-c n , 前に移動が C-c p みたいな場合毎回 C-c n, C-c pと叩くの面倒くさい。一方的に進む、戻るのであれば数値プレフィックスがあるが Vimのように数だけ押せばいいとわけじゃないし、進んだり戻ったりと繰り返したい場合などは使えない。そこで使えるのが repeat-moderepeat-modeを使って初回実行だけは C-c nだが以降は n, pでそれぞれ移動するということが実現できる.

myuheさんが作られた smartrep.elに近い.

sheephead.homelinux.org

使い方

  1. repeat-mode を有効にする
  2. キーマップを定義する
  3. 起点となるコマンドの repeat-map 属性に定義した keymapを設定する

repeat-mode を有効にする

;; global minor modeです
(repeat-mode +1)

グループで使いたいコマンド郡のキーマップを定義する

(defvar git-gutter-repeat-map
  (let ((map (make-sparse-keymap)))
    (define-key map (kbd "n") 'git-gutter:next-hunk)
    (define-key map (kbd "p") 'git-gutter:previous-hunk)
    map))

コマンドの repeat-map属性を設定する

(put 'git-gutter:next-hunk 'repeat-map 'git-gutter-repeat-map)
(put 'git-gutter:previous-hunk 'repeat-map 'git-gutter-repeat-map)

実行例

repeat-mode起点となるコマンドを実行すると minibufferにRepeat with` と表示され, 該当するキーマップが有効になる.

おわりに

導入されたばかりということもあってか標準パッケージではほとんど使われておらずごく一部のモードで使われていませんでした。標準ライブラリで汎用的な機能を提供してくれるのはありがたいけど、どのコマンドをグルーピングするかとかは好みによるところもありそうなのでライブラリ側で設定すべきなのか個人で設定すべきなのかまだよくわかっていない。個人で設定する場合は smartrepなどに比べるとコード量が多くそれほど良いものではないのかなという気もしている。今後の使われ方を見て markdown-modeでどうするかなというのを考えていきたいかな。

LinkedIn Learningの Rust Code Challenges をやった

www.linkedin.com

課題がいくつかあって解いて解説を見てという感じのコース。コードの雛形は githubに用意されているので, 足りていないところ埋めてテストが通れば OKという感じ.

かっちりしたコースではなく解説はわりとグダっていたり雛形のコードに微妙に問題があったりというケースがあったのでクオリティが高いものとは決して言えなかった. でもまあ 3rd partyライブラリを使ったり, そこそこ実用的なものもあり Rustで何を書いたらいいかわからんという自分には少しプラスになったかなとは思った. Rustの基本を習得してその後何か少し発展的なものを書いてみたいという人にちょうどいいぐらいかなと思った。