forループでイテレータ into_iter() が所有権を奪う

for x in vec と書くと暗黙的に、into_iter()が呼ばれてvecは所有権を失ってしまう。forで暗黙的に呼ぶのなら、所有権を奪わないiter()の方が良かったんじゃないと思い、AI先生に理由を聞いた。どうも、into_iter()が効率がよく、所有権の管理が明確になるという2点がポイントだそうだ。
AI先生は嘘つきだから、どうせ誰かが検証しているだろうと検索してみた。https://dawn.hateblo.jp/entry/2017/07/24/165933によると、確かに、iter()のほうが誤差程度で遅いらしい。大きなデータ構造ではもう少し差がでるのだろう。

let vec = vec![1, 2, 3];
let vec_iter = vec.iter();
for x in vec_iter {
    println!("{}", x);
}
// まだvecは有効
println!("{:?}", vec);

let vec = vec![1, 2, 3];
for x in vec {
    // vec.into_iter()が呼ばれた
    println!("{}", x);
    //println!("{:?}", vec); 当然、使えない
}
// ここでvecは使えなくなる
//println!("{:?}", vec);

PRIMERGY TX1310 M1のメモリを16GBへ拡大

メモリが4GBの状態でデスクトップクライアントとして使用していると、油断した際にメモリ不足で固まることがあった。この問題に耐えてきましたが、ついに我慢できなくなり、Non-ECCメモリを追加して16GBに増設しました。価格を見ると、DDR3 PC3-12800 8GB 2枚組が3000円以下で手に入ることも理由の一つでした。

メモリを交換した後、Manjaro Linuxに付属しているMemtest86+で確認を行いました。放っておいて気づいたら4周をPASSしていたので、これで問題ないと判断した。

Firefoxのタブを多数開いても特に問題は発生しないので、普通に使えるようになった。

Manjaro Linuxで"Ctrl+;"で起動するクリップボード履歴は何のアプリ

"Ctrl+;"で起動するクリップボード履歴が表示されることに気づき、調べたがわからなかったので検索したところ、以下のページで記述があった。

https://qiita.com/daisuke0604/items/29e3143555677c61d4d0

Fcitxのアドオンでクリップボード履歴を扱うって、Input Methodとしてどうなんと思う。

Rustの勉強を始めた

Rustの勉強をはじめました。もう何年も話題になっているRustに興味を持ったのは、GCCでRustのサポートが進んでいると聞いたからです。

環境設定

mozcのAURではRustが使われているようで、すでに rustup default stable まで実行済みだった。
https://wiki.archlinux.org/title/rustに書かれているIDE関連のツール群もインストールした。

rustup component add rust-analyzer
rustup component add rust-src
rustup component add clippy
rustup component add rustfmt

また、Visual Studio Codeにはrust-analyzerの拡張もインストールした。

勉強開始

The Rust Programming Language 日本語版

とりあえず、一切、手を動かすことせずに一通りを読んでみた。例外のないC++11とRubyHaskellを3身合体させた言語と思ったのが、第一印象だ。LISPの雰囲気は感じられない。

C++11や(POSIX)UNIXプログラミングの知識がない状態から、Rustを学び始めるのは少し難しいかもしれませんが、それでも、C++11よりはRustの方が簡単だと思う。

まだ理解が曖昧なので、コードを書く段階にはまだ至っていません。

Rustの最初のステップ − Training

https://learn.microsoft.com/ja-jp/training/modules/rust-introduction/ MicrosoftによるRustの解説です。トピックが絞られているので、こちらを先に読むとよかったかもしれない。演習も実際にビルドしてみて、自分の理解度を確認しました。まだ理解が不十分だなと感じたので、再度The Rust Programming Languageを読み直して、確認コードを書いていくことにした。

疑問に思ったこと

自分でサンプルコードなどを書いて、確認しないと正確に理解できないハズ。

なぜ&が必要

下のコードでは、なぜ「&"coconut"」のように & が必要なのかわからず、ChatGPT先生に聞いたが、よく理解できませんでした。その後、Microsoft Copilot先生に聞いたところ、だいたい理解できましたが、まだ正確な理解には至っていない。テストコードを書いて確認していく予定です。

let fruits = vec!["banana", "apple", "coconut", "orange", "strawberry"];
for &index in [0, 2, 99].iter() {
    match fruits.get(index) {
        Some(&"coconut") => println!("Coconuts are awesome!!!"),
        Some(fruit_name) => println!("It's a delicious {}!", fruit_name),
        None => println!("There is no fruit! :("),
    }
}

理解できなかったポイントは、get メソッドの戻り値が以下のようになっていることでした。

pub fn get<I>(&self, index: I) -> Option<&<I as SliceIndex<[T]>>::Output> 

fruits.get(index) は Option<&&str> を返している。そのため、Some("coconut") のようにすると、Option<&str> と一致しない。そのため、Some(&"coconut") のように & を付ける必要がある。

まだ疑問点はあるが、長くなりそうなので、別途調査してみます。

構造体定義のライフタイム注釈の必要性

構造体にライフタイム注釈をつけないと、確かにビルドエラーになるが、コンパイラがライフタイムを省略すればいいのではないかと思ってしまった。構造体のフィールドの参照先が必ず長生きしなければならないのは明らかですし、複数のフィールドがあっても同じです。何か理由があるはずですが、各種AIに聞いてもよくわからなかった。

関数のライフタイム注釈については、まあそういうものかなと納得できる。

yayの実行中に優先度を下げたい

Linuxデスクトップ上で、yayを使ってビルドを実行するときに、他の作業がカクつくことがある。そのため、yayの実行時に優先度を下げたいと考えた。ChatGPT先生に相談したところ、yayの設定ファイルを編集して、デフォルトでniceを適用することができると教えてもらった。

先生はよく嘘をつくから、自分で調べたらやっぱり間違っている。yayにnice levelを設定する機能はない。

bashのaliasに下記を書くことで誤魔化せるか試すことにした。
#+begin_example
alias makepkg='nice -n 19 makepkg'
#+end_example

makepkgにエリアスを行っても、yayからのビルドでnice levelは設定されなかった。yay以降で実行される全てのプロセスにniceすることにした。流石に意図した動作となった。

alias yay='nice -n 19 yay'

LinuxでELECOMのトラックボール HUGE にボタンを割り当てる

面倒で行わなかった、ELECOMのトラックボール HUGEのボタンにソートカットキーを割り当てることにした。

ボタンの割当を調べた結果

参考サイトのDEFT PROと同じ割当だった。

button[1]: [L]
button[2]: ホイールクリック
button[3]: [R]
button[4]:
button[5]:
button[6]:
button[7]:
button[8]: 戻る
button[9]: 進む
button[10]: [Fn1]
button[11]: [Fn2]
button[12]: [Fn3]

ボタンにショートカットキーを割り当てる

~/.xbindkeysrcに下記を書いた。
個人的に必要だったのは、[進む]に""を割り当ててWebブラウザのタブを閉じたかっただけだ。

# Mouse Buttons
#Fn1
"xvkbd -xsendevent -text "\S\[Insert]""
m:0x0 + b:10
#Fn2
"xvkbd -xsendevent -text "\C\[Insert]""
m:0x0 + b:11
#Fn3は何に使うか流動的
##"xvkbd -xsendevent -text "\[Home]""
##m:0x0 + b:12
#[進む]
"xvkbd -xsendevent -text "\Cw""
m:0x0 + b:9

xbindkeysの自動実行

xmonadからxbindkeysを自動起動させるため追記した。

myStartupHook = do
  spawnOnce "tint2"
  spawnOnce "copyq"
  spawnOnce "fcitx5"
  spawnOnce "xbindkeys"
  spawnOnce "pasystray"
  sendMessage $ SetStruts [] [minBound .. maxBound]

Solarizedと言うカラースキームがあるのを知った

Zenburnを使っていたが、今の流行りを調べたらSolarizedが見つかったので試してみることにした。
Solarized Lightは30年前に行っていた自己流の設定に近い感じで気に入っている。

Solarized Lightを適用したEmacsとurxvt