めっちゃしょうもない話だけれど、新しく追加した補完関数がどうしても適用されなくて困っていた。
fpathが通ってないのかと思ったけどそんなこともない。
$ echo $fpath | tr ' ' '\n' | grep '目的のファイル'
うーんと唸ってChatGPT先生に聞いてみたらキャシュじゃないかってことだった。
$ rm ~/.config/zsh/.zcompdump
これでzshを起動しなおすと無事に適用された。
めっちゃしょうもない話だけれど、新しく追加した補完関数がどうしても適用されなくて困っていた。
fpathが通ってないのかと思ったけどそんなこともない。
$ echo $fpath | tr ' ' '\n' | grep '目的のファイル'
うーんと唸ってChatGPT先生に聞いてみたらキャシュじゃないかってことだった。
$ rm ~/.config/zsh/.zcompdump
これでzshを起動しなおすと無事に適用された。
最近ちょっとコーヒー関連がマンネリになってきてしまって、あんまり楽しくなかった。 美味しいから飲んでいるけど、行為そのものを楽しまないと愉快な人生とは言えない。
ある日、フィルターが切れかかっていたので、新しいのを購入しようとしたところ、関連商品に同じ会社のなんか長細いフィルターが表示された。 なんだこれはと思って気になって調べたら、DEEP27という一杯取りの長細いドリッパーがあるらしい。
フラワードリッパーは試したことがなかったし、この長細いフォルムが面白かったのでマンネリ打開にはちょうど良さそうということで買ってみた。
抽出は基本真ん中に注ぎつづけるだけで、注ぐ速度と落ちる速度が同じくらいになるのがいいらしい。簡単!
いまのところ2回くらい使ってみたけど、まだうまく淹れられなくて、いっしゅんめっちゃ美味しい予感がするのだけれど、奥からエグ味がやってきてしまう。ちゃんとレシピを見ずにやっていたので、次はちゃんとレシピを見てみようと思う。2杯作りたいので、なかなか出番がないんだよな。
朝おきて、ドリッパーを選ぶところから一日が始まるのはやっぱり楽しい。
エディタは Vim → Atom → Emacs → VSCode と渡ってきたけど、いつだって Vim キーバインドです。
もちろん VSCode でも VSCodeVim を使ってきました。 こいつはVimの動きを頑張ってエミュレートしていて努力の結晶という感じなのですが、概ね良い感じで動いていて、VSCode に移行した日から今までずっとこれを使ってきました。
VSCode Neovim という存在は以前から知っていました。初めてみたときに Neovim と通信して VSCode 上で Vim そのものの動作を実現するというのを読んでそこまでしてやりたいことか?と思ったのを覚えています。なぜか Neovim に対していい感情を持っていなかったというのもあったと思います。「ナードは黙って Vim 」とか思ってました。(なお当方 VSCode 使い)
しかし、同僚が使っている Neovim を見てからは、ネガティブな印象が払拭されていて、さらに VSCode Neovim の 紹介記事 をたまたま読んだことで、いっちょ試してみるかと移行してみました。
馴染まない可能性をかんがえて VSCodeVim はアンインストールせずに無効化して進めました。
導入は Getting Started を見るとよくてシュッと完了します。Neovim も Homebrew でシュッと。起動すると Vim の操作が即座に有効になります。Insert モードは VSCode に完全に委ねられるので、ネイティブの Extension とカニバることもなし。
次は Neovim の設定です。過去の .vimrc
はもう参考にならないだろうし、ゼロから設定することにしました。Lua で書けるらしいので、じゃあそれで。XDG Base Directory Specification に対応しているので、~/.config/nvim/
以下に設定を書いていきます。
ディレクトリ構成はこういう感じになった。VSCode 用の設定を分けたけど、それ用の設定しか要らないので分ける必要はなかった気がする。設定はほとんどキーマッピングで凝ったことはしていません。そもそも多くの設定は VSCode 向けには意味がないし。
- nvim - lua - config - lazy.lua - vscode.lua - plugins - init.lua - init.lua
プラグインマネージャには Lazy.nvim を選択しました。なんにも分かってないのでひとまず有名っぽいものを。 いろいろプラグインの紹介記事を眺めながら、VSCode でも動きそうなものを選んでいきます。ふつうに動いていてすごい。
いったんこういう布陣になりました。VSCodeVim では出来ていなかったことを実現できてめっちゃ助かり。 (clever-f
が欲しくて欲しくて...)
おすすめのやつがあったら教えてください。
f
などで検索したときにそのまま f
を押し続けて移動できるCtrl-a
/ Ctrl-x
で変換できる対象を増やす (true/falseとか)*
で検索したときにその場に留まったりできるあとは VSCode 側に書いていたキー設定で vim.mode == insert
とか書いていたのを neovim.mode
に置き換えて完成。
まだこれで仕事のコードを書いた訳じゃないけど、今のところ快適に使えています。
editor.action.addSelectionToNextFindMatch
で目的の単語を全部選択してから c
で置換とか出来なくなったsettings.json
に書くので肥大しがちそこまでするなら NeoVim に移行すればいいじゃんという話はある。話はあるけど僕は VSCode を使いつづけます。
あんまりいい言語化はできないのだけれど、コミュニティやエコシステムの規模が段違いなので安心感があるのと、手触りがめっちゃ気に入っているというところなのかもしれない。 キーボードでやることとマウスでやることのバランスがちょうどいいのかもしれない。キーボードは好きですが別に全部キーボードで操作できなくてもよい。GUIの方が見た目も触りやすいしね。
感情的なことをいうと VSCode が好きなので使いつづけます。
今年に入ってからあんまり元気がなかったので、元気を出そうと思ってエアロバイクをこいでいる。元気がなくて運動できないのじゃなくて、運動していないから元気がないのである。
朝に無理しないように15分だけこぐようにしていて、最初はオーディオブックを聞いたり、真面目なYouTubeを見たりしていたが、なかなかにしんどい。15分早く終わってくれーと思いながらこいでいた。(脂肪燃焼は20分から発生するのでダイエットの人は30分くらいやろう)
それもそのはずで、運動という習慣になっていない活動をしながら、さらに勉強をして追い込むというのはなかなかに攻めている。つらさ2倍である。(便宜上つらいって書いたけどどっちも目的をもってやっているのでつらくないよ!)
ここで発想の転換。どっちかを楽しいことにすればいいのだ。
映画を観ながらエアロバイクをこいでみた。一瞬で15分たっていて、もうちょっと観たいので20分くらいこいでしまう。先にも書いたが有酸素運動は本当は最低でも30分くらいやった方がいいのでちょうどいい。
全てのことに言えると思うけ楽しくないことは続かない。言いかえるとそれを楽しめたらたいてはうまくいくという話。
楽しくないことをしている時間はないのである。
これを使ってます
最近、オーディオブックをよく聞いている。Audible を契約していて、一時期は聞きたいものがあんまりなくて解約しようと思っていたけど、ラインナップが増えてきたのか聞きたいものがよくみつかる。
オーディオブックのよいところは、集中が不要なことで、ぼーっとしながら難しい本でも読める(聞ける)。もちろん、集中して聞いてないと聞き逃したりするのだけれど、どうせ耳という空いているリソースに流し込んでいる情報なので、何度か同じものを聞けばそのうち必要なところはなんとなく把握できている。
僕はどちらかというと耳の人間で、目でみた情報より、耳で聞いた情報の方が頭に残りやすいらしい。本を読むのには多大な苦労が伴ったうえにほとんど内容を覚えていないのだけれど、耳で聞いたことはなんとなく覚えていたりする。(でも本当は本で読めた方が速いし嬉しかった)
そんな訳ですきま時間にながら聞きをして過ごしているのだけれど、ひとつだけ困ることがある。それは線が引けないことである。記憶に残るといっても人間の覚えていられることには限界がある。ここはと思う箇所に本のように線が引きたいのである。そしてたとえ線がひけたとしても、本のように前後の文脈もふくめて瞬時に眺めることが出来ないのがネックである。そうして結局、本も購入することになってしまう。
もう少ししたらAIによる読み上げがもっと流暢になると思うので、本を買ったら Kindle とかが良い感じに読み上げてくれるようになって欲しい。(朗読する人の仕事を奪ってしまうという問題はあるのだけれど)
それが僕がオーディオブックに思うことです。
オーディオブックを聞くのに HUAWEI FreeClip がおすすめです。
FOMO (Fear Of Missing Out) はビジネスのシーンにおいても問題になっているのではないだろうか。
たとえば Slack の画面をつねにディスプレイに表示したいという話があるが、リアルタイムでみないといけないメッセージなんてほとんどない。むしろリアルタイムでみないといけないメッセージが存在するということは、そこに非効率が潜んでいる。リアルタイムのコミュニケーションが必要なら別の手段を用いた方がいいだろう。
情報を見逃すということはそれほど問題だろうか。僕はそうは思わない。
本当に必要な情報というのはその場でみなくても、おそらくなんらかの手段で目に触れることになる。返信が必要なものはメンションされているだろうから、メンション一覧を見るだけでよい。全ての情報を見ようとすることで、本当に必要な情報を見逃していないだろうか?
突発的に発生した大喜利に参加できないという話はあると思うが、仕事しろ。僕だって乗り遅れたら悔しくはある。
諦めて Slack や Eメール の画面を非表示にしよう。意外と困ることはない。
最近、意識が高まって LeetCode を一日一問ずつやっています。 正直、Easy でもだいぶ苦戦していて、基礎の出来てなさに凹む毎日です。
ところで、現代では ChatGPT というSFチックなサービスが存在します。何かを学ぶときに補助してもらうことで、知の高速道路をより素早く進むことが出来るようになりました。 LeetCodeでの練習でいうと、うまく書けなかったなというときにコードをシンプルに書き直してもらうと学ぶところが多々あります。
今日は本当にクソみたいなコードを書いたので、ちょっとでもヒントを得ようと書き直してもらったのですが、あまりにシンプルなコードになってひっくり返りました。 最初みたときにハルシネーションだろって思ってしまったのですが、よく読むとすごく正しい。
自分は与えられた問題の情報を愚直にコードに落とし込んでしまっていて、今回の問題の本質 = 一定のパターンがあることに気付いていませんでした。 GPT-4o は自分の書いたクソコードをみただけで、そのパターンに気付いてコードに落とし込んでくれたのです。
問題解決の糸口として、なんらかのパターンがないかというのは普段は考えている気がするけど、こういう問題形式でプログラミングするときには頭が回ってなかったので、すごくハッとさせられたのでした。
(もちろん本当のところは同様のコードを大量に見せられていて、ベストな回答を知っていたということだとは思うのだけれど)
問題は与えられたローマ数字の文字列を数値に直すというやつでした。
自分の書いたクソみたいにナイーブなコードがこれ。
func romanToInt(s string) int { num := 0 rs := []rune(s) for i := 0; i < len(rs); i++ { r := rs[i] switch r { case 'I': if i+1 < len(rs) { n := rs[i+1] if n == 'V' { num += 4 i += 1 continue } else if n == 'X' { num += 9 i += 1 continue } } num += 1 continue case 'V': num += 5 continue case 'X': if i+1 < len(rs) { n := rs[i+1] if n == 'L' { num += 40 i += 1 continue } else if n == 'C' { num += 90 i += 1 continue } } num += 10 continue case 'L': num += 50 continue case 'C': if i+1 < len(rs) { n := rs[i+1] if n == 'D' { num += 400 i += 1 continue } else if n == 'M' { num += 900 i += 1 continue } } num += 100 continue case 'D': num += 500 continue case 'M': num += 1000 continue default: panic("invalid rune") } } return num }
ChatGPT が書き直してくれたのがこれ。
func romanToInt(s string) int { // ルーンとその値のマッピング romanValues := map[rune]int{ 'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000, } num := 0 rs := []rune(s) for i := 0; i < len(rs); i++ { // 現在のルーンの値 currentValue := romanValues[rs[i]] // 次のルーンが存在し、かつその値が現在のルーンの値より大きい場合 if i+1 < len(rs) && romanValues[rs[i+1]] > currentValue { num -= currentValue } else { num += currentValue } } return num }