"Ctrl+;"で起動するクリップボード履歴が表示されることに気づき、調べたがわからなかったので検索したところ、以下のページで記述があった。
https://qiita.com/daisuke0604/items/29e3143555677c61d4d0
Fcitxのアドオンでクリップボード履歴を扱うって、Input Methodとしてどうなんと思う。
"Ctrl+;"で起動するクリップボード履歴が表示されることに気づき、調べたがわからなかったので検索したところ、以下のページで記述があった。
https://qiita.com/daisuke0604/items/29e3143555677c61d4d0
Fcitxのアドオンでクリップボード履歴を扱うって、Input Methodとしてどうなんと思う。
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の拡張もインストールした。
とりあえず、一切、手を動かすことせずに一通りを読んでみた。例外のないC++11とRubyとHaskellを3身合体させた言語と思ったのが、第一印象だ。LISPの雰囲気は感じられない。
C++11や(POSIX)UNIXプログラミングの知識がない状態から、Rustを学び始めるのは少し難しいかもしれませんが、それでも、C++11よりはRustの方が簡単だと思う。
まだ理解が曖昧なので、コードを書く段階にはまだ至っていません。
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に聞いてもよくわからなかった。
関数のライフタイム注釈については、まあそういうものかなと納得できる。
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'
面倒で行わなかった、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
Zenburnを使っていたが、今の流行りを調べたらSolarizedが見つかったので試してみることにした。
Solarized Lightは30年前に行っていた自己流の設定に近い感じで気に入っている。
本当はカスタマイズなどしない方が良いのだけど、長年使い続けた結果としてxmonad.hsが少し大きくなってしまった。
Haskellは勉強したけど、考え方が根本的に違っているのか頭に入ってこない。勉強した動機が、xmonadのためだけ*1なので、みようみまねで誤魔化している。
カスタマイズのポイントは、
import System.Exit import XMonad import XMonad.Hooks.EwmhDesktops import XMonad.Hooks.ManageDocks import XMonad.Hooks.SetWMName import qualified XMonad.StackSet as W import XMonad.Util.EZConfig import XMonad.Util.Run import XMonad.Util.SpawnOnce main = do xmonad $ ewmh $ docks $ def { terminal = "urxvt", modMask = myMod, borderWidth = 3, workspaces = myWorkspaces, startupHook = myStartupHook, manageHook = myManageHookFloat <+> manageHook def <+> manageDocks, layoutHook = avoidStruts $ layoutHook def } `removeKeysP` ["M-S-q"] `additionalKeysP` myKeys myKeys = [ ("M-S-p", spawn "xfce4-appfinder"), ("M-S-b", sendMessage ToggleStruts), ("M-C-M1-q", io (exitWith ExitSuccess)), -- ディスプレイ0にワークスペース1を出力し,ディスプレイ1にワークスペース2を出力 ( "M-S-r", do screenWorkspace 0 >>= flip whenJust (windows . W.view) (windows . W.greedyView) "1" screenWorkspace 1 >>= flip whenJust (windows . W.view) (windows . W.greedyView) "2" ) ] myMod = mod4Mask myWorkspaces = ["1", "2", "3"] myStartupHook = do spawnOnce "tint2" spawnOnce "copyq" spawnOnce "fcitx5" spawnOnce "pasystray" sendMessage $ SetStruts [] [minBound .. maxBound] myManageHookFloat = composeAll [ className =? "Gimp" --> doFloat, className =? "xfce4-appfinder" --> doFloat, className =? "Pomodoro" --> doFloat ]
*1:Emacs Lispを勉強したときと同じ動機だ
Emacsを捨てることを求め続けて、コーディングに関してはVisual Studio Codeに移行済みとなった*1。それでもEmacsは主にワープロソフトとして使用しており、Org Modeとhowmを組み合わせて、全ての文章を管理しています。文章はhowm上でOrg Modeの記法で書かれ、必要に応じてodt形式からWord文書やはてな記法に変換させています。全ての文章がhowm上にあるため、ポケット一つ原則と相性が良いです。
ポケット一つ原則で文章をクラウド上に管理する人もいますが、外部サービスの信頼性に疑問を抱いているため、そのような方法は真似しません。メールはローカルで管理する必要がないため、消えても問題ありません。
Emacsから使えるChatGPTクライアントはかなり乱立しているようなので、しばらくは状況を見守ることにする。UNIXにみる世代間の断絶にかかれた「枯れた技術しか使わない」「新しい技術には懐疑的」なので。
*1:Emacs Lispをイジるときを除く