ちなみに

火曜日の空は僕を押しつぶした。

フラワードリッパーDEEP27を導入した

最近ちょっとコーヒー関連がマンネリになってきてしまって、あんまり楽しくなかった。 美味しいから飲んでいるけど、行為そのものを楽しまないと愉快な人生とは言えない。

ある日、フィルターが切れかかっていたので、新しいのを購入しようとしたところ、関連商品に同じ会社のなんか長細いフィルターが表示された。 なんだこれはと思って気になって調べたら、DEEP27という一杯取りの長細いドリッパーがあるらしい。

フラワードリッパーは試したことがなかったし、この長細いフォルムが面白かったのでマンネリ打開にはちょうど良さそうということで買ってみた。

抽出は基本真ん中に注ぎつづけるだけで、注ぐ速度と落ちる速度が同じくらいになるのがいいらしい。簡単!

いまのところ2回くらい使ってみたけど、まだうまく淹れられなくて、いっしゅんめっちゃ美味しい予感がするのだけれど、奥からエグ味がやってきてしまう。ちゃんとレシピを見ずにやっていたので、次はちゃんとレシピを見てみようと思う。2杯作りたいので、なかなか出番がないんだよな。

朝おきて、ドリッパーを選ぶところから一日が始まるのはやっぱり楽しい。

cafec.shop

VSCode Neovim に移行した

きっかけ

産まれてからずっと Vim キーバインドで生きてきました。

エディタは VimAtomEmacsVSCode と渡ってきたけど、いつだって Vim キーバインドです。

もちろん VSCode でも VSCodeVim を使ってきました。 こいつはVimの動きを頑張ってエミュレートしていて努力の結晶という感じなのですが、概ね良い感じで動いていて、VSCode に移行した日から今までずっとこれを使ってきました。

VSCode Neovim という存在は以前から知っていました。初めてみたときに Neovim と通信して VSCode 上で Vim そのものの動作を実現するというのを読んでそこまでしてやりたいことか?と思ったのを覚えています。なぜか Neovim に対していい感情を持っていなかったというのもあったと思います。「ナードは黙って Vim 」とか思ってました。(なお当方 VSCode 使い)

しかし、同僚が使っている Neovim を見てからは、ネガティブな印象が払拭されていて、さらに VSCode Neovim紹介記事 をたまたま読んだことで、いっちょ試してみるかと移行してみました。

移行作業

馴染まない可能性をかんがえて VSCodeVim はアンインストールせずに無効化して進めました。

導入は Getting Started を見るとよくてシュッと完了します。NeovimHomebrew でシュッと。起動すると 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 が欲しくて欲しくて...) おすすめのやつがあったら教えてください。

あとは VSCode 側に書いていたキー設定で vim.mode == insert とか書いていたのを neovim.mode に置き換えて完成。

まだこれで仕事のコードを書いた訳じゃないけど、今のところ快適に使えています。

よしあし

VSCode Neovim

  • pros
    • 速い (ひっかかりを感じなくて快適)
    • 各種プラグインが動く
  • cons
    • 別途 Neovim のインストールが必要 (依存が増えてリスクも増える)
    • 設定ファイルの資産がないとゼロから書かないといけない
    • マルチカーソル関係が弱い (特に VSCode 側の選択位置との連携ができないところ)
      • editor.action.addSelectionToNextFindMatch で目的の単語を全部選択してから c で置換とか出来なくなった

VSCodeVim

  • pros
    • 入れたら即使える
    • 困ることがほぼない (いっかい undo が爆発したけど)
  • cons
    • 動作がじゃっかんもっさりする
    • 設定ファイルを settings.json に書くので肥大しがち
    • エミュレートしているので若干本家と動きが違う
    • プラグインを足せない

それでもVSCodeにこだわる

そこまでするなら NeoVim に移行すればいいじゃんという話はある。話はあるけど僕は VSCode を使いつづけます。

あんまりいい言語化はできないのだけれど、コミュニティやエコシステムの規模が段違いなので安心感があるのと、手触りがめっちゃ気に入っているというところなのかもしれない。 キーボードでやることとマウスでやることのバランスがちょうどいいのかもしれない。キーボードは好きですが別に全部キーボードで操作できなくてもよい。GUIの方が見た目も触りやすいしね。

感情的なことをいうと VSCode が好きなので使いつづけます。

楽しみながら続ける

今年に入ってからあんまり元気がなかったので、元気を出そうと思ってエアロバイクをこいでいる。元気がなくて運動できないのじゃなくて、運動していないから元気がないのである。

朝に無理しないように15分だけこぐようにしていて、最初はオーディオブックを聞いたり、真面目なYouTubeを見たりしていたが、なかなかにしんどい。15分早く終わってくれーと思いながらこいでいた。(脂肪燃焼は20分から発生するのでダイエットの人は30分くらいやろう)

それもそのはずで、運動という習慣になっていない活動をしながら、さらに勉強をして追い込むというのはなかなかに攻めている。つらさ2倍である。(便宜上つらいって書いたけどどっちも目的をもってやっているのでつらくないよ!)

ここで発想の転換。どっちかを楽しいことにすればいいのだ。

映画を観ながらエアロバイクをこいでみた。一瞬で15分たっていて、もうちょっと観たいので20分くらいこいでしまう。先にも書いたが有酸素運動は本当は最低でも30分くらいやった方がいいのでちょうどいい。

全てのことに言えると思うけ楽しくないことは続かない。言いかえるとそれを楽しめたらたいてはうまくいくという話。

楽しくないことをしている時間はないのである。


これを使ってます

オーディオブックに思うこと

最近、オーディオブックをよく聞いている。Audible を契約していて、一時期は聞きたいものがあんまりなくて解約しようと思っていたけど、ラインナップが増えてきたのか聞きたいものがよくみつかる。

オーディオブックのよいところは、集中が不要なことで、ぼーっとしながら難しい本でも読める(聞ける)。もちろん、集中して聞いてないと聞き逃したりするのだけれど、どうせ耳という空いているリソースに流し込んでいる情報なので、何度か同じものを聞けばそのうち必要なところはなんとなく把握できている。

僕はどちらかというと耳の人間で、目でみた情報より、耳で聞いた情報の方が頭に残りやすいらしい。本を読むのには多大な苦労が伴ったうえにほとんど内容を覚えていないのだけれど、耳で聞いたことはなんとなく覚えていたりする。(でも本当は本で読めた方が速いし嬉しかった)

そんな訳ですきま時間にながら聞きをして過ごしているのだけれど、ひとつだけ困ることがある。それは線が引けないことである。記憶に残るといっても人間の覚えていられることには限界がある。ここはと思う箇所に本のように線が引きたいのである。そしてたとえ線がひけたとしても、本のように前後の文脈もふくめて瞬時に眺めることが出来ないのがネックである。そうして結局、本も購入することになってしまう。

もう少ししたらAIによる読み上げがもっと流暢になると思うので、本を買ったら Kindle とかが良い感じに読み上げてくれるようになって欲しい。(朗読する人の仕事を奪ってしまうという問題はあるのだけれど)

それが僕がオーディオブックに思うことです。


オーディオブックを聞くのに HUAWEI FreeClip がおすすめです。

blog.nishimu.land

Fear Of Missing Out in Business

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
}

Hyper Key べんり

最近、Hyper Key という概念を知った。

概要

masOS だと Control+Alt+Shift+CommandWindows だとControl+Alt+Shift+Win を同時に押すことを言うようです。 現代では失われた物理的な Hyper Key に代替しようということだと思ったけど経緯はあんまり分かっていない。

これの何が便利かというと、システムやアプリケーションのショートカットキーと被りにくいのである。 グローバルなショートカットキーを設定するときに、被らないように悩まなくて済むのが嬉しい。

もちろん本当に同時押しするのは馬鹿げているので、特定の1キーを押すことで済むようにする。 人気なのは Capslock を置き換える方法で、合理的だけれどちょっとかわいそう。

やりかた

macOS だと Karabiner-Elements を使うのが簡単でしょう。

karabiner-elements.pqrs.org

Hyper Key っていうずばりの名前のアプリもあるけど、Karabiner-Elements がすでに入っている場合はわざわざ単体のアプリを入れるまでもないでしょう。

Windowsはよく分かってません。

用途

自分の場合はよく使うアプリケーションを呼び出すショートカットキーとして Hyper Key を使っています。 元々はそれぞれ被らないように適当なキーを当てていたけど、全部置き換えてしまった。

アプリケーションの頭文字にすると覚えやすい。一例としては以下の感じで Hyper Key を で表現した。

アプリケーション キー
VSCode +V
Arc +A
Slack ✦+S
iTerm2 +T
Obsidian ✦+O

さらに自分の場合はキーボードのレイヤ3に配置することで指の動きを最低減にしている。

余談

アプリケーションを呼び出すショートカットは Raycast で設定している。 一度押すとそのアプリケーションがアクティブになって、もう一度押すと非アクティブになって画面から消えてくれる。 もちろん起動していない場合は起動してくれます。 現在の状態を把握してなくてもとにかく最悪2回押せば手前に来てくれるのでとてもべんりです。

設定の Advanced に Hyper Key の表示に関する設定があるのでこれを有効にしておくと見やすくなる。

www.raycast.com