2022 年度、開発環境の振り返り＆困りごと

毎日、毎回、使う度に便利だと噛み締めている当者比で少しマイナーなもの紹介

[KWC Advent Calendar 2022](https://qiita.com/advent-calendar/2022/kwc) の参加記事ですが、困りごとを解決した方はどなたでも教えてください

## 環境共通化

Ubuntu をメインとし、iOS、macOS、WSL、Windows、Android を利用しているため、共通した使い勝手を目指しています

- Homebrew ... 便利コマンド系は Ubuntu と WSL でも brew 優先。apt にはなかったり、古いことが多いため
- GNU/Linux 化 ... Mac は [xargs や grep を GNU/Linux に](https://qiita.com/eumesy/items/3bb39fc783c8d4863c5f)
- Evernote ... オフラインと複数デバイスで使えるように課金済み。ここ数年重く UI やタスクが邪魔で Notion うろうろ中
  - 使い捨てのメモやリマインダは Siri や Google アシスタントを音声で
- Authy ... 機種変更が楽

困りごと: Android のブラウザでワンタップで一番上に戻る方法がほしい。iPhone なら画面上部タップ、ブラウザは Vimium で gg

## Windows 11 & macOS

Win + s に気づくまで Alfred 代替を探していた

|| Windows 11 | macOS | 備考
-|-|-|-
クリップボード履歴 | Win + v | Clipy
プレーンなペースト | Ctrl + Shift + v | Command + Shift + v | Mac 標準は Option + Shift + Command + v で指つるので [Karabiner で変更](https://ke-complex-modifications.pqrs.org/?q=without%20formatting)
スクリーンショット | Shift + Win + s | Shift + Command + 4 | 指が覚えているのでこのまま。Shift + Command + 5 便利
スリープ | Win + x u s | Macbook 閉じる
Google 検索 | Win + s | Alfred | Windows は [MSEdgeRedirect](https://github.com/rcmaehl/MSEdgeRedirect) と [Chrometana](https://chrome.google.com/webstore/detail/chrometana-redirect-bing/kaicbfmipfpfpjmlbpejaoaflfdnabnc) 導入<br>Chrome がアクティブなら Ctrl + l
アプリ起動 | Win + s | Alfred
アプリ切り替え | Alt + Tab | AltTab
ウィンドウサイズ | Win + 矢印キー | ShiftIt
クイックルック | [QuickLook](https://apps.microsoft.com/store/detail/quicklook/9NV4BS3L1H4S) | Preview | 困りごと: QuickLook 起動遅いときある
解凍 | NanaZip | The Unarchiver
タスクバーを結合させない | ExplorerPatcher | |
X-Mouse | X-Mouse Controls | | 困りごと: Mac での実現。タップせず Chrome で Ctrl + l や Vimium で gi したい

以前は Macbook に DisplayLink で複数ディスプレイにしていたけど、スリープからの復帰時にウィンドウ位置のずれや、ケーブルが邪魔なので今は [barrier](https://github.com/debauchee/barrier) で Windows に繋げています

- 困りごと: Windows でスクリーンショット画像加工に Skitch 代替がほしい。要件は赤枠、矢印、テキスト、モザイクが簡単なこと。ペイント 3D 使っているけど[モザイクが Skitch に比べて手間](https://www.guidingtech.com/blur-part-of-picture-in-paint-3d/)
- 困りごと: Windows でスクリーンショットしたら Snipping Tool ではなくペイント 3D 起動してほしい
- 困りごと: Google 日本語入力の辞書同期。ATOK かな

## alias

環境を変更できない仕事サーバ先でも便利な alias が使いたい

cx, g, gv, pg, tf, v はよく使うし、いつか crontab -r する前に ce 必須

ということで .alias ファイルを用意し、接続先サーバで source .alias しています

自分の環境は .zshrc 内で source ~/.alias している

```shell
$ cat .alias
alias ..='cd ..'
alias ...='cd ../..'
alias api='sudo apt install -y'
alias aps='apt search --names-only'
alias bi='brew install'
alias bfo='brew info'
alias bs='brew search'
alias ce='crontab -e'
alias cl='crontab -l'
alias cx='chmod +x'
alias df='df -h'
alias g='grep --color=auto'
alias ga='git add'
alias gc='git commit -v'
alias gd='git diff'
alias gs='git status'
alias gv='grep -v --color=auto'
alias lS='\ls -lSr --color'
alias la='ls -al'
alias less='less -R'
alias lh='ls -lh'
alias ll='ls -l'
alias ls='ls -CF --color'
alias lt='\ls -ltr --color'
alias pg='\ps aux | grep'
alias sjis='nkf -s -Lw'
alias t='tail'
alias tf='tail -f'
alias tree='tree --charset=jis'
alias v='vim'

if [ "$USER" = 'oooooooo' ]; then
  alias csvmd='csview --style markdown'
  alias csv='csvlens'
  alias cut='choose'
  alias df='duf'
  alias du='dust'
  alias la='exa -Fl'
  alias lh='exa -Flh'
  alias ll='exa -Fl'
  alias ls='exa -F'
  # sudo chown -h root $(which mtr-packet)
  # sudo chmod 4755 $(which mtr-packet)
  alias ping='mtr'
  alias ps='procs'
  alias top='procs -w'
  alias traceroute='asn'
  alias v='nvim'
fi

if [[ -v ZSH_VERSION ]]; then
  alias -g G='| grep --color=auto'
  alias -g GV='| grep -v --color=auto'
  alias -g L='| less -R'
fi

if [[ -v WSL_INTEROP ]]; then
  alias open='explorer.exe'
  alias pbcopy='clip.exe'
  alias pbpaste='powershell.exe Get-Clipboard | sed "s/\r//"'
fi
```

Rust 製ツールが増えたな

top は htop や glances などあるけど、procs は CPU や MEM のソート方法が画面上部に出ているという理由で採択

困りごと: WSL も Mac みたいに open で関連付けたアプリを開きたい。とはいえ開く拡張子が csv や pdf などほぼ決まっているのでシェルスクリプト書くかな。現在は open . してエクスプローラ開いてダブルクリックしている

困りごと: bash 環境でパイプを入力するの面倒。仕事サーバの bash 環境でパイプ入れずに楽したい

```shell
# bash
g foo log |g bar |gv baz
# zsh
g foo log G bar GV baz
```

## Shell

bat, fd, fzf, rg, skim は紹介するまでもないので割愛

- asdf
  - 今まで pyenv や rbenv、n を使っていたけど asdf に統一
  - 困りごと: [asdf reshim を自動でやりたい](https://github.com/asdf-community/asdf-python/issues/37)
- [choose](https://github.com/theryangeary/choose)
  - cut ではできない後ろから n 番目が choose -3:-1 と簡単
  - UTF-8 の CSV は Windows の Excel で文字化けするけど、BOM 付き UTF-8 にすればよかった。Python なら utf_8_sig、Ruby なら \uFEFF を最初に付加。CP932 に変換していた。これで choose や csvlens が使える
- diff-so-fancy から delta に乗り換えた。diff-so-fancy って Perl 製だったんだね
  - git では tig、gh も愛用
  - diff でいうと vimdiff も好き
- jq ではなく gron だと多段 grep で絞り込めて頭使わなくてありがたい
  - Chrome 拡張機能の [JSON Viewer](https://chrome.google.com/webstore/detail/json-viewer/gbmdgpbipfallnflgajpaliibnhdgobh) も便利
- ssh で ProxyCommand 使っているなら ProxyJump が簡単
- tldr ではなく [tealdeer](https://dbrgn.github.io/tealdeer/) 利用
  - [自分でページを作れるのと、tldr の既存ページに気軽に追記できる](https://dbrgn.github.io/tealdeer/usage_custom_pages.html)。以前は ~/.memo に書いてた
- [zoxide](https://github.com/ajeetdsouza/zoxide)
  - 長らく rupa/z を使っていたけど、zi で候補見られ、zr で path 削除できるのと、気持ち速いのがよい
- あらゆるものに lint
  - eslint や rubocop、hadolint、textlint 以外に [shellcheck](https://github.com/koalaman/shellcheck)、[markdownlint](https://github.com/DavidAnson/markdownlint) 導入。昔書いたシェルスクリプトや Markdown がボコボコにされる

こんな function を用意してコマンドたちを更新している

```shell
update ()
{
    sudo apt update -y && sudo apt upgrade -y && sudo apt autoremove -y;
    brew update && brew upgrade
    asdf plugin update --all;
    pip install --upgrade pip;
    npm install -g npm@latest;
    ncu -gu;
    gem cleanup;
    tldr --update;
    cargo install-update -a
}
```

ディレクトリなら ls、ファイルなら less する l は便利。glob にも対応させたい

```shell
l ()
{
    PAGER=${PAGER:=less};
    if [ -z $1 ]; then
        ls -CF --color --color=auto -CF;
    else
        if [ -d $1 ]; then
            ls -CF --color --color=auto -CF $1;
        else
            $PAGER $1;
        fi;
    fi
}
```

## Chrome 拡張機能

AutoPagerize、Bitwarden、Octotree、Vimium  は今年も大変お世話になりましたが、紹介記事が多いので割愛。毎日多用しているけど周囲で利用者の少ない拡張機能はこちら

- [Google Search by date - horizontal bar](https://chrome.google.com/webstore/detail/google-search-by-date-hor/mchncdgncchoolmnjicpddhkmgebjopg) ... Google の検索結果を簡単に 1 時間以内、7 日以内、半年以内に絞り込める。古い情報をふるい落とせる
- [Google Chromeのスーパードラッグ](https://chrome.google.com/webstore/detail/super-drag-for-google-chr/dlknjglebgomjjfaijjnebecgjbfjihk) ... 検索したい単語を選択してちょっとドラッグするだけで Google してくれる

Lighthouse の Performance は Chrome 拡張機能があると正しく計測できない。のでボタン一つで全拡張機能を ON/OFF

- [Disable Extensions Temporarily](https://chrome.google.com/webstore/detail/disable-extensions-tempor/lcfdefmogcogicollfebhgjiiakbjdje)

## Chrome サイト内検索

Google でウェブ全体を検索するとノイズが多いので[サイト内検索](chrome://settings/searchEngines)を活用しています

### 検索機能がある場合

Chrome のアドレスバーに gh と入力して TAB すると GitHub 内を検索できる仕組み

設定方法こちら

- [Google Chromeの「検索エンジンの管理」でキーワードショートカットを設定すると捗る件](https://zenn.dev/ttskch/articles/2c776ee3578d5b)
- [検索エンジンはカスタマイズしてほしいです](https://zenn.dev/eetann/articles/2020-12-09-custom-search-engine)

### ドメイン全体検索

site:go.dev や、site:docs.ruby-lang.org/ja/latest/ と site:guides.rubyonrails.org をまとめて検索したい場合は [Programmable Search Engine](https://programmablesearchengine.google.com/controlpanel/all) を使います

検索するサイトは ```*.go.dev/*``` や ```*.qiita.com/*``` しています

発行された URL に &q=%s すれば利用可能。Dash や Zeal の代わりに使っています

```text
https://cse.google.com/cse?cx=xxxxxxxx&q=%s
```

Qiita と Zenn をまとめるのも便利

設定方法はこちら

- [Googleのカスタム検索をもうちょっとだけ便利にするためにやっていること3種｜mathme｜note](https://note.com/mathme/n/n772cb1139664)

## Userscript

コピーを便利に。Violentmonkey 使ってる

- C-c でタイトルと URL をコピー
  - Amazon の商品 URL はシンプルに変換
- C-m で Markdown 形式のリンクをコピー
- C-q で選択範囲を > で引用コピー

```javascript
// ==UserScript==
// @name         Swiss Army Copy
// @namespace    https://oooooooo.example.com/
// @version      0.1
// @description  All your text are belong to us
// @author       oooooooo
// @match        http://*/*
// @match        https://*/*
// @grant        none
// ==/UserScript==
(() => {
  'use strict'

  const copy = (text) => {
    if (window.getSelection().toString() === '') {
      const textarea = document.createElement('textarea')
      document.body.appendChild(textarea)
      textarea.value = text
      textarea.select()
      document.execCommand('copy')
      textarea.style.display = 'none'
    }
  }

  const quote = (selection) => {
    let text = ''
    selection.split('\n').forEach((line) => {
      text = text + '> ' + line + '\n'
    })
    return text
  }

  window.addEventListener('keydown', (event) => {
    // location.href を消す方式は Amazon Prime などで誤作動する
    let url = ''
    const match = document.URL.match(/(https:\/\/.+?amazon.+?\/).*?(dp\/[A-Z0-9]+)/)
    if (match === null) {
      url = document.URL
    } else {
      url = match[1] + match[2]
    }

    if (event.ctrlKey && event.key === 'c') {
      copy(document.title + '\n' + url)
    } else if (event.ctrlKey && event.key === 'm') {
      copy('[' + document.title + '](' + url + ')')
    } else if (event.ctrlKey && event.key === 'q') {
      const selection = window.getSelection().toString()
      window.getSelection().removeAllRanges()
      copy(quote(selection))
    }
  })
})()
```

## ガジェット

一日何度も使うものは値段を 365*2 日で割って価値あるか自分に問うて買っている

### Windows Hello 対応カメラ [Kaysuda CA20](https://www.kaysuda.com/webcam/windows-hello/1080p-windows-hello-camera.html)

顔認証で Windows ログインが便利すぎる

画質は悪い。以前はロジクールの C920n を使っていたけど、音声はそんなに悪くない模様

本当はエレコムの UCAM-CF20FBBK がほしかったけど、ずっと品切れ

画質が悪いので勧めづらいけど顔認証ログインは本当に快適

### 骨伝導マイク付き [Shokz OpenComm](https://jp.shokz.com/products/bone-conduction-headphone-opencomm)

rebuild.fm で知って数年使っていた Aeropex をカバンに放り込んでいたら壊れてしまい、仕事 Zoom にも使おうとマイク付きを購入

マイクが耳に触れて不快で後悔。マイクはカメラでいいし

さらに追い打ちは [OpenRun Pro](https://jp.shokz.com/products/openrun-pro) ならアプリでデバイスを切り替えられること

困りごと: Macbook にペアリングした後に iPhone に切り替えたい場合は Macbook の bluetooth を切る、が必要。切り替え野良アプリとかないものか

### YubiKey 5 NFC

Passkey が気になり購入

Chrome 108 から対応したし、不要になるかも

スマホが代替になるなら YubiKey の紛失・破損リスクを減らせる

HHKB の USB に繋げている。TOTP の面倒な PIN 入力が U2F ならタッチだけ。フィッシングの心配もない

とはいえ対応サイトが現状少なすぎる。今後期待

### SlimBlade Trackball

ロジクール M570 → M575 と長く親指トラックボール派

無線は年に何度かある電池切れ時の動きの悪さが嫌で有線にしようと思う

前から気になっていた SlimBlade に

数ヶ月利用して theHunter を遊ぶくらいには慣れたけど

- 親指に比べてトラックボールが重い
- ホイールのキリキリ音が気になる
- ホイールやスクロールの加速が悪くて TrackballWorks で設定するけど、移動量がすぐにマックスになる。同じ症状の人がいてアンインストール
- ほこりが溜まったときの感触が気持ち悪い
- 横幅がでかい。その分、手のキーボードからの移動距離が遠い
- 初期不良かもだけど左上ボタンがプラスチック？をガリッと噛む

書き出すといろいろあるけど最後のガリッ以外は気にならなくなっている。だけど次回は親指トラックボールに戻りそう

### Siri と Google アシスタント

- iPhone のサイドボタン長押しで Siri を呼び出して「○時○分にアラームを鳴らして」ではなく「☓☓で○時○分にアラームを鳴らして」とすると、アラームと一緒に「☓☓」が出る。なんの予定だっけ？がなくなった
- iPhone のリマインダーは 1 時間に 2 回以上の設定ができないけど、Google アシスタントならその制限がない
  - Google アシスタントの設定から「メモとリスト」の保存場所を Keep に変更できる

困りごと: Google Discover に限らずアプリを開いたときに面白そうなニュースと思ったら秒で更新されて消えるのどうかならないか。すぐにクリックすれば見られるけど、二件名以降消えるのでタイトル覚えてググる運用やめたい

困りごと: Android は大丈夫だけど、iPhone の Google Discover は Brave で開き、戻ると必ず更新される。というか、最初から Brave で見たい

## おわりに

年末年始にいろんなアドベントカレンダーを眺めるのが習慣になりました

[KWC Advent Calendar 2022](https://qiita.com/advent-calendar/2022/kwc) を眺めると Preact をやめた理由（やめた理由ってすごく役立つ。もっと前向き失敗談記事増えてほしい）や Astro（結局 deno の lume にしたけど気になり続けている）、KeePassX（Bitwarden に課金を検討しているので）、それに明日は六曜！？など気になる記事がたくさん

知っている人は知っているけど、知らない人は知らない、そんな知見がどっと出るきっかけとしてアドベントカレンダーはいいですね