tag:blogger.com,1999:blog-71921015996138415702024-03-14T03:32:10.612+09:00atton.blogattonhttp://www.blogger.com/profile/08720809750045983794noreply@blogger.comBlogger209125tag:blogger.com,1999:blog-7192101599613841570.post-61874278465739510632020-11-07T16:54:00.001+09:002020-11-07T16:56:56.778+09:00tmux 3.1c の window 分割線を ascii character にする2020/10/30(Fri) に
<a href="https://github.com/tmux/tmux/releases/tag/3.1c" target="_blank">tmux 3.1c がリリースされました</a>。
<div>
という事で、恒例の EastAsianAmbiguous を ascii
に変更したバージョンを作成します。<br />
過去の作業履歴は
<a href="https://attonblog.blogspot.com/2020/05/tmux-31b.html" target="_blank">3.1b</a>
や <a href="https://attonblog.blogspot.com/2019/12/tmux-30a-window-ascii-character.html" target="_blank">3.0a</a> や <a href="https://attonblog.blogspot.com/2019/08/tmux-29a.html" target="_blank">2.9a</a> に、そもそもの問題については<a href="https://attonblog.blogspot.com/2017/11/tmux-pull-request.html" target="_blank">この記事</a>にまとめています。<br />
<div><br /></div>
<div><br /></div>
<h4 style="text-align: left;">環境</h4>
<div>
<ul style="text-align: left;">
<li>OS: macOS Mojave 10.14.6</li>
<li>
tmux: 3.1c-border-ascii <a href="https://github.com/atton/tmux/commit/7e7a923b7cd2e7cc8d2450e8a8e20838ded13298" target="_blank">7e7a923b7cd2e7cc8d2450e8a8e20838ded13298</a>
</li>
<li>Homebrew: 2.5.8-118-g2ac5cff</li>
<ul>
<li>
Homebrew/homebrew-core (git revision ce1b1; last commit 2020-11-06)
</li>
</ul>
<li>Font: Ricty 4.1.1</li>
</ul>
<div><br /></div>
<div><br /></div>
<h4 style="text-align: left;">インストール方法</h4>
<div>
<ul style="text-align: left;">
<li>$ brew install --HEAD atton/customs/tmux</li>
</ul>
</div>
<div>でインストールできます。</div>
<div><br /></div>
<div><br /></div>
<h4 style="text-align: left;">今回の作業</h4>
<div>
3.1b と 3.1c の違いは<a href="https://github.com/tmux/tmux/compare/3.1b...tmux:3.1c" target="_blank">ほぼ無いようなもの</a>なので、 cherry-pick で対応できました。
</div>
<div></div>
</div>
</div>
attonhttp://www.blogger.com/profile/08720809750045983794noreply@blogger.com0tag:blogger.com,1999:blog-7192101599613841570.post-27736066238109960422020-08-16T09:09:00.000+09:002020-08-16T09:09:16.054+09:00PS4 の Prime Video の「次に観る」リストから消した作品を再度表示させる私は Prime Video を観る際、大体 Play Station 4 を使っています。
<div>
Prime Video
は「次に観る」というリストが視聴履歴から自動的に作成される為、放送中の作品を追うのに便利です。
</div>
<div>
観終わった作品をリストから削除していると、誤ってまだ観ていない作品を削除してしまいました。
</div>
<div>
すると、ウォッチリストに追加している作品にも関わらず、リストに表示されなくなりました。それを解決したお話です。
</div>
<div><br /></div>
<div><br /></div>
<h4 style="text-align: left;">環境</h4>
<div>
<ul style="text-align: left;">
<li>Play Station 4 システムソフトウェア: 7.51</li>
<li>Prime Video: 3.13</li>
</ul>
<div><br /></div>
</div>
<div><br /></div>
<h4 style="text-align: left;">元に戻す方法</h4>
<div>作品を「次に観る」リストに再度表示させるには</div>
<div>
<ul style="text-align: left;">
<li><a href="https://www.amazon.co.jp">Amazon.co.jp</a> にログイン</li>
<li>
[マイストア] -> [おすすめ作品を正確にする] -> [興味が無い商品]
を表示
</li>
<li>再度表示させたい作品の「興味がありません」のチェックを外す</li>
</ul>
<div>事で解決します。</div>
<div><br /></div>
<div><br /></div>
<h4 style="text-align: left;">余談: 「次に観る」に表示されなくなる条件</h4>
<div>非表示になる条件は以下の2つがあります。</div>
<div>
<ul style="text-align: left;">
<li>
<a href="https://nrbm-music.com/5550">観ていた作品を視聴履歴から削除する</a>
</li>
<li>「興味が無い商品」として登録する</li>
</ul>
<div>
特に後者の場合、ウォッチリストに追加していても表示されません(前者は未確認)。
</div><div><br /></div>
</div>
<div>
PS4 の Prime Video
で「リストから削除」を実行すると「興味が無い商品」に登録される、後者の挙動を取ります。
</div>
<div>Web の Prime Video
では「このシーズンを表示にする」という名前に変わっていますが、こちらも後者の挙動を取ります。
</div>
<div>
なので「興味が無い商品」の登録から作品を削除すると、リストに再度表示されるようになります。</div>
<div><br /></div>
<div><br /></div>
<h4 style="text-align: left;">参考</h4>
<ul style="text-align: left;">
<li>
<a href="https://www.amazon.co.jp">Amazon | 本, ファッション, 家電から食品まで | アマゾン</a><br />
</li>
<li>
<a href="https://www.amazon.co.jp/Prime-Video/b?ie=UTF8&node=3535604051">Amazon.co.jp: プライム・ビデオ: Prime Video</a>
</li>
<li>
<a href="https://nrbm-music.com/5550">Amazon プライムビデオの”次に観る”から消す『視聴履歴を確認』</a>
</li>
</ul>
</div>
attonhttp://www.blogger.com/profile/08720809750045983794noreply@blogger.com0tag:blogger.com,1999:blog-7192101599613841570.post-45528465590043891172020-07-19T11:58:00.001+09:002020-07-19T12:01:12.650+09:00GitHub へ push した際に Docker Hub で docker image を自動 build する過去に「<a href="https://attonblog.blogspot.com/2020/06/github-actions-dockerfile-build.html">GitHub Actions で複数の Dockerfile の build と DockerHub への push を自動化した</a>」という記事を書きました。<div>前回は image の build を GitHub で行なっていましたが、今回は Docker Hub で build するように変更したお話です。</div><div><br /></div><div><br /></div><div><h4 style="text-align: left;">Docker Hub で docker image を build する</h4><div>GitHub と連携した <a href="https://docs.docker.com/docker-hub/builds">automated build</a> という機能を利用しました(設定方法はドキュメント参照)。</div><div>前回同様、GitHub に push すると自動的に Docker Hub に image が更新されます。</div><div><br /></div><div><br /></div><div>これまた前回同様、以降は作業ログ等です。</div><div><br /></div><div><br /></div><h4 style="text-align: left;">何故構成を変更したのか</h4><div>image を更新する為に Docker Hub を触っていた時、 GitHub 連携の存在に気付いた為です。</div><div>ちなみに、更新していた image は <a href="https://hub.docker.com/r/atton/latex-make">latex-make</a> というもので、MacTeX をインストールせずに LaTeX を実行できる image です。</div><div>更新内容は TeX Live 2019 から TeX Live 2020 へのアップデートでした。</div><div><br /></div><div><br /></div><h4 style="text-align: left;">GitHub Actions 作成時に気にしていた3つの条件のゆくえ</h4><div><a href="https://attonblog.blogspot.com/2020/06/github-actions-dockerfile-build.html">過去の記事</a>では以下の3つの条件を気にしていました。</div><div><div><ul style="text-align: left;"><li>Dockerfile が増えた場合も自動で対応する</li><li>Dockerfile や関連ファイルに更新が無い Image は Push しない</li><li>GitHub Actions だけでなく、ローカルの環境でも build できる</li></ul></div></div><div>第1条件と第2条件は、 Repository を分割して解決としました(<a href="https://github.com/atton/dockerfile-latex-make">latex-make</a>, <a href="https://github.com/atton/dockerfile-webpage-title">webpage-title</a>)。</div><div>第3条件はビルドスクリプトをローカルマシンに残す事で解決としました。</div><div><br /></div><div><br /></div><h4 style="text-align: left;">構成を変更して良かった点</h4><div><ul style="text-align: left;"><li>他の image の README を参考にした結果、 README が整備された</li><ul><li>latex-make には使用例が無かったので追記した</li><li><a href="https://shields.io">shields.io</a> を利用して image のサイズ等のバッジを追加</li><li>GitHub/Docker Hub の README を(手動で)統一</li></ul><li>Docker Hub に automated build のログが残るようになった</li><ul><li>前回は「push したユーザは atton, push 時刻」程度の情報しか無かった</li></ul><li>ログイン情報を書くが必要無い</li><ul><li>連携時に Docker Hub から GitHub へ権限を要求しているので docker login を実行する必要は無い</li><li>具体的に言うと GitHub Actions ではログインパスワードを Secrets に書いていた</li><ul><li>なので、Docker Hub のログインパスワードを変更後、Secrets を更新しないと docker login に失敗する</li></ul></ul></ul><div><br /></div></div></div><div><br /></div><h4 style="text-align: left;">構成を変更して良くなかった点</h4><div><ul style="text-align: left;"><li>移行作業が手作業だった</li><ul><li>対象となる docker image が2つのみだったので、手作業で移行を行なった</li><li>仮に docker image が多かった場合、移行スクリプト等を書く必要があったかもしれない</li></ul><li>第2条件が若干緩くなった</li><ul><li>master が更新された際に build が行なわれるので、 README だけの変更 commit でも build が発生する</li><li>git の tag をトリガーにして build する、等の設定で修正可能</li><li>しかし現状の image の tag は latest しか無いので放置中</li></ul></ul></div>attonhttp://www.blogger.com/profile/08720809750045983794noreply@blogger.com0tag:blogger.com,1999:blog-7192101599613841570.post-13480224489151630222020-06-09T11:20:00.000+09:002020-06-09T11:38:22.318+09:00GitHub Actions で複数の Dockerfile の build と DockerHub への push を自動化した私は作成した <a href="https://github.com/atton/dockerfiles">Dockerfile を GitHub で公開</a>しています(<a href="https://attonblog.blogspot.com/2020/06/get-title-using-chromium-browser.html">前回の記事の atton/webpage-title</a> も含む)。<br />
Docker Image を手動で管理するのは面倒なので、何らかの形で自動化する事にしました。<br />
最終的に、 Dockerfile が更新された際に build して <a href="https://hub.docker.com/u/atton">DockerHub</a> に push する GitHub Actions を作成しました。<br />
<br />
<br />
<h4>
GitHub Actions を作成する際に考慮した条件</h4>
<div>
<ul>
<li>Dockerfile が増えた場合も自動で対応する(現時点では2つ)</li>
<li>Dockerfile や関連ファイルに更新が無い Image は Push しない</li>
<li>GitHub Actions だけでなく、ローカルの環境でも build できる</li>
</ul>
</div>
<br />
<br />
<h4>
具体的な GitHub Actions の内容</h4>
<div>
作成した .github/workflows/build-and-push.yml とbuild.sh は以下です(commit: <a href="https://github.com/atton/dockerfiles/commit/427f143fb2c5624a0a8480f700241946e9585b7c">427f143</a>)。
</div>
<script src="https://gist.github.com/atton/ca0a242f60fd4e65bb0b315454e73e93.js"></script>
<br />
<div>
自動化できたので手動 push の必要は無くなりました。べんり。<br />
<br />
これ以降は作業ログなどを書いておきますが、かなり長いです。</div>
<br />
<div>
<br /></div>
<h4>
第一条件: Dockerfile が増えた場合も自動で対応する</h4>
<div>
この条件については、特定の構成をしているディレクトリを build 対象にする事で対応しました。具体的には<br />
<ul>
<li>ディレクトリ名は任意</li>
<ul>
<li>ls と [ -d ] で確認</li>
</ul>
<li>ディレクトリの直下に Dockerfile が存在する</li>
<ul>
<li>ls と [ -f ] で確認</li>
</ul>
</ul>
<div>
<div>
といったディレクトリです。なお、ディレクトリ名は Docker Image の tag を決める際に使っています。</div>
</div>
<div>
<br />
<br />
<h4>
第二条件: Dockerfile や関連ファイルに更新が無い Image は Push しない</h4>
</div>
<div>
Docker Image を自動 build する際、最初は <a href="https://github.com/marketplace/actions/publish-docker">elgohr/Publish-Docker-Github-Action@master</a> を<a href="https://github.com/atton/dockerfiles/commit/6781d4e29a67850998df45dbba25e138bde83658">使っていました</a>。</div>
<div>
<br /></div>
<div>
ここで問題が発生。README.md を変更しただけの commit でも Docker Image の更新が行なわれました。</div>
<div>
幸い、<a href="https://help.github.com/en/actions/reference/workflow-syntax-for-github-actions#jobsjob_idif">GitHub Actions の step では if </a>が使えるようなので試してみましたが改善せず。</div>
<div>
<a href="https://github.com/elgohr/Publish-Docker-Github-Action/tree/5d8ac991f54837cdbd0b34fc627e9e83c500fa43">elgohr/Publish-Docker-Github-Action@master</a> のソースを確認すると、 <a href="https://github.com/elgohr/Publish-Docker-Github-Action/blob/5d8ac991f54837cdbd0b34fc627e9e83c500fa43/action.yml">action.yml に if はありませんでした。</a></div>
<div>
なので elgohr/Publish-Docker-Github-Action@master は利用しない方針に変更。<br />
使わない事になりましたが、 <a href="https://github.com/elgohr/Publish-Docker-Github-Action/blob/5d8ac991f54837cdbd0b34fc627e9e83c500fa43/entrypoint.sh">entrypoint.sh</a> に書かれた(docker login/logout など)内容は参考にできそうです。</div>
<div>
<br /></div>
<div>
さて、次は「Dockerfile や関連ファイルに更新が無い」事を判定をできれば解決しそうです。ググってみると</div>
<div>
<ul>
<li><a href="https://www.blogger.com/"></a><a href="https://github.community/t/find-what-files-changed-in-a-pushed-commit/17037">$ git diff-tree --no-commit-id --name-only -r ${{ github.sha }}</a></li>
</ul>
<div>
で確認できるとの事。ではこれを grep して exit code で判定すれば解決、しませんでした。</div>
<div>
更新の有無に関わらず、全ての grep の exit code が 1 になっていました。<br />
加えて、ローカル環境では想定通りの exit code が得られるので、どうやら原因は実行環境固有のようです。</div>
</div>
<div>
<br /></div>
<div>
「ローカルでは動くが、別環境では動かない」という悲しい事態なので、 printf debug で少しずつ状態を確認していきます。</div>
<div>
<ul>
<li>git は存在するか</li>
<li>git の version は何か</li>
<li>git は実行できるか</li>
<li>remote origin は存在するか</li>
<li>commit log は辿る事ができるか</li>
<li>grep の version は何か</li>
<li>...</li>
</ul>
</div>
<div>
結果、「<a href="https://github.com/marketplace/actions/checkout">actions/checkout@master</a> を使うと repository の情報が消える(?)」事が判明しました。具体的には</div>
<div>
<ul>
<li>git コマンドは実行できる</li>
<li>git show を行なうと、全ファイルが新規作成扱いになっている</li>
<li>origin を fetch しても commit が取得できない</li>
</ul>
<div>
という謎の状態でした。その為、 actions/checkout@master は利用せずに直接 git clone を実行。<br />
clone した repository では diff-tree が実行可能で、更新の有無が判定可能になりました。</div>
</div>
<div>
<br /></div>
<div>
<br /></div>
<h4>
余談: 第二条件の部分を書いている時に思った事</h4>
<div>
<ul>
<li>elgohr/Publish-Docker-Github-Action@master のソースを確認すると、 action.yml に if はありませんでした。</li>
<ul>
<li>Pull Request を作成して提案する手がある</li>
</ul>
<li>「ローカルでは動くが、別環境では動かない」</li>
<ul>
<li>GitHub で動作 Image を提供している可能性がある</li>
</ul>
<li>「actions/checkout@master を使うと repository の情報が消える(?)」</li>
<ul>
<li>今は git clone で対応できるが、 branch の指定といったオプションに対応できない</li>
</ul>
</ul>
</div>
<div>
<br />
<br />
<h4>
第三条件: GitHub Actions だけでなく、ローカルの環境でも build できる</h4>
<div>
この条件は「ローカル環境でも Docker Image を作成可能」にする為につけました。メリットとしては</div>
</div>
</div>
<div>
<ul>
<li>問題発生時の再現に使用できる</li>
<li>commit 前の Dockerfile も試しに build できる</li>
<li>新しい Image 作成時の build が楽</li>
</ul>
<div>
等があります。なお、この条件は build.sh に与える引数の有無で解決しました。</div>
</div>
<div>
<br />
<br />
<h4>
まとめ</h4>
</div>
<div>
結構な文量になりました。debug の説明を含めると長くなりますね。</div>
<div>
結果的に「uses を排除して自前の run で記述する」というオレオレ GtiHub Actions で解決。</div>
<div>
前回も書いた気がしますが、「個人的には十分満足しているので良しとします。」</div>
<div>
<br /></div>
<br />
<h4>
参考文献や関連した文献など</h4>
<div>
<ul>
<li><a href="https://github.com/atton/dockerfiles">GitHub - atton/dockerfiles: Dockerfiles of published my docker images</a></li>
<li><a href="https://attonblog.blogspot.com/2020/06/get-title-using-chromium-browser.html">atton.blog: chromium-browser を使って記事のタイトルを取得する</a></li>
<li><a href="https://hub.docker.com/u/atton">atton's Profile - Docker Hub</a></li>
<li><a href="https://github.com/atton/dockerfiles/commit/427f143fb2c5624a0a8480f700241946e9585b7c">Set TZ in "latex-make" image · atton/dockerfiles@427f143 · GitHub</a></li>
<li><a href="https://github.com/marketplace/actions/publish-docker">Publish Docker · Actions · GitHub Marketplace · GitHub</a></li>
<li><a href="https://github.com/atton/dockerfiles/commit/6781d4e29a67850998df45dbba25e138bde83658">Setup GitHub Actions for publish atton/webpage-title · atton/dockerfiles@6781d4e · GitHub</a></li>
<li><a href="https://help.github.com/en/actions/reference/workflow-syntax-for-github-actions#jobsjob_idif">Workflow syntax for GitHub Actions - GitHub Help</a></li>
<li><a href="https://github.com/elgohr/Publish-Docker-Github-Action/tree/5d8ac991f54837cdbd0b34fc627e9e83c500fa43">GitHub - elgohr/Publish-Docker-Github-Action at 5d8ac991f54837cdbd0b34fc627e9e83c500fa43</a></li>
<li><a href="https://github.com/elgohr/Publish-Docker-Github-Action/blob/5d8ac991f54837cdbd0b34fc627e9e83c500fa43/action.yml">Publish-Docker-Github-Action/action.yml at 5d8ac991f54837cdbd0b34fc627e9e83c500fa43 · elgohr/Publish-Docker-Github-Action · GitHub</a></li>
<li><a href="https://github.com/elgohr/Publish-Docker-Github-Action/blob/5d8ac991f54837cdbd0b34fc627e9e83c500fa43/entrypoint.sh">Publish-Docker-Github-Action/entrypoint.sh at 5d8ac991f54837cdbd0b34fc627e9e83c500fa43 · elgohr/Publish-Docker-Github-Action · GitHub</a></li>
<li><a href="https://github.community/t/find-what-files-changed-in-a-pushed-commit/17037">Find what files changed in a pushed commit? - GitHub Actions - GitHub Support Community</a></li>
<li><a href="https://github.com/marketplace/actions/checkout">Checkout · Actions · GitHub Marketplace · GitHub</a></li>
</ul>
</div>
attonhttp://www.blogger.com/profile/08720809750045983794noreply@blogger.com0tag:blogger.com,1999:blog-7192101599613841570.post-68513494100678690562020-06-01T16:36:00.000+09:002020-06-01T16:36:03.494+09:00chromium-browser を使って記事のタイトルを取得する私はブログに記事を引用する際、 URL だけ書く事はあまりしません。<br />
何かの文字列に関連付けたり、記事のタイトルに関連付けます。特に後者は参考文献の場合によく行ないます。<br />
これが結構面倒なので、タイトルを取得する Docker Image を作りました、というログです。<br />
<br />
<br />
<h4>
環境</h4>
<div>
<ul>
<li>OS: macOS Mojave 10.14.6</li>
<li>Docker for Mac: version 19.03.8, build afacb8b</li>
</ul>
<div>
<br /></div>
</div>
<div>
<br /></div>
<div>
<h4>
実行例</h4>
</div>
<div>
<ul>
<li>$ docker run --rm atton/webpage-title 'https://attonblog.blogspot.com/2020/04/upgrade-awscli-with-linked-python38.html'</li>
<li>=> atton.blog: Homebrew で awscli を upgrade して、依存の keg-only python@3.8 を link する</li>
<ul>
<li>'、' は curl で取得すると escape されて &#12289; になる事についても問題無し。</li>
</ul>
</ul>
<div>
<br /></div>
</div>
<div>
<br /></div>
<div>
<h4>
作成した経緯</h4>
</div>
<div>
最初は curl に grep で title タグを取得する、くらいの shellscript を使っていました。</div>
<div>
それが次第にタグの attributes を考慮したり、sed を挟んだり、と色々拡張する事に。</div>
<div>
最終的に『header に title は無く、JavaScript で後から設定する』サイトに遭遇。これは curl では厳しい。<br />
<br />
この際ブラウザを動した方が色々と問題解決できるのでは、という事で chromium を headless で動かす事にしました。<br />
DockerHub の repository は <a href="https://hub.docker.com/r/atton/webpage-title">atton/webpage-title</a> で、<a href="https://github.com/atton/dockerfiles">Dockerfile は GitHub に置いてあります</a>。<br />
<br />
記事のタイトルを取得する為だけに大仰なのでは、という感もあります。<br />
ですが、現状タイトルの取得に失敗した事が無いので、個人的には十分満足しています。</div>
attonhttp://www.blogger.com/profile/08720809750045983794noreply@blogger.com0tag:blogger.com,1999:blog-7192101599613841570.post-33147596323622157752020-05-05T09:29:00.001+09:002020-06-08T08:00:53.062+09:00tmux 3.1b の window 分割線を ascii character にする2020/05/04(Mon) に <a href="https://github.com/tmux/tmux/releases/tag/3.1b">tmux 3.1b がリリースされました</a>。<br />
という事で、いつも通り EastAsianAmbiguous を ascii に変更するバージョンを作成します。<br />
過去の作業履歴は <a href="https://attonblog.blogspot.com/2019/12/tmux-30a-window-ascii-character.html">3.0a</a> や <a href="https://attonblog.blogspot.com/2019/08/tmux-29a.html">2.9a</a> や <a href="https://attonblog.blogspot.com/2018/10/tmux-2-8.html" target="_blank">2.8</a> に、そもそもの問題についてはこの<a href="https://attonblog.blogspot.com/2017/11/tmux-pull-request.html" target="_blank">このポスト</a>にまとめています。<br />
<br />
<br />
<h4>
環境</h4>
<div>
<ul>
<li>OS: macOS Mojave 10.14.6</li>
<li>tmux: 3.1b-border-ascii <a href="https://github.com/atton/tmux/commit/526f000f29abadeef9f804bb9aea5291b913a312">526f000f29abadeef9f804bb9aea5291b913a312</a></li>
<li>Homebrew: 2.2.15-2-gb06a7af<ul>
<li>Homebrew/homebrew-core (git revision 0058c; last commit 2020-05-04)</li>
</ul>
</li>
<li>Font: Ricty 3.2.2</li>
</ul>
<div>
<br /></div>
<div>
<br /></div>
<div>
<h4>
インストール方法</h4>
<div>
<ul>
<li>$ brew install --HEAD atton/customs/tmux</li>
</ul>
<div>
でインストールできます。</div>
</div>
</div>
<ul>
<div>
</div>
</ul>
<div>
<br /></div>
</div>
<div>
<br /></div>
<h4>
本家との diff : utf8proc を使わない</h4>
<div>
homebrew-core にある<a href="https://github.com/Homebrew/homebrew-core/blob/0058caaa5159082c9ec689983925dd79c5b21639/Formula/tmux.rb">本家 tmux は再度 utf8proc を採用しました</a>。</div>
<div>
しかし、 utf8proc は現時点の最新バージョンである 2.5.0 でも EastAsianAmbiguous 対応はされていません。</div>
<div>
前回(<a href="https://attonblog.blogspot.com/2019/06/utf8proc-2-3.html">2.3</a>, <a href="https://attonblog.blogspot.com/2019/01/utf8proc-2-2-0.html">2.2.0</a>)のように utf8proc を変更する選択肢もありました。</div>
<div>
ですが、 tmux のソースを読むと <a href="https://github.com/atton/tmux/blob/526f000f29abadeef9f804bb9aea5291b913a312/utf8.c#L113-L117">utf8proc が無い場合 wcwidth を使う</a>ようなので、変更しない選択肢もありそうです。</div>
<div>
試しに utf8proc を抜いてビルドした tmux を軽く触っても、特段違和感は無し。</div>
<div>
とりあえず YAGNI の精神で、今回は utf8proc を使わない事にしました。</div>
<div>
<br /></div>
<div>
<br /></div>
<h4>
前回との diff : atton/tmux の default branch を master から border-ascii に変更</h4>
<div>
これは tmux へパッチを当てる運用方法の変更です。</div>
<div>
<br /></div>
<div>
ローカルで設定している remote repository は以下の2つ。</div>
<div>
<ul>
<li>origin: atton/tmux</li>
<li>upstream: tmux/tmux</li>
</ul>
<div>
upstream を fetch して origin に反映させつつ、リリースがあれば対応するパッチを当てる、という運用でした。</div>
<div>
<br /></div>
</div>
<div>
ここで面倒だったのが、両方の master の使い分け。</div>
<div>
例えば upstream/master の変更を origin/master に適用する時は</div>
<div>
<ul>
<li>$ git fetch upstream</li>
<li>$ git checkout origin/master</li>
<li>$ git rebase upstream/master</li>
</ul>
<div>
と、prefix を指定する必要があります。それに加えて、紛らわしいのも改善したい。</div>
</div>
<div>
<br /></div>
<div>
そこで、atton/tmux の master は削除して <a href="https://github.com/atton/tmux/branches">default branch を border-ascii に変更</a>。</div>
<div>
そしてローカルの tmux は master の remote tracking branch を upstrem/master に指定。具体的には以下のような感じ</div>
<div>
<ul>
<li>$ git checkout master</li>
<li>$ git branch -u upstream/master</li>
</ul>
<div>
これにより master は tmux/tmux に追従し、他のブランチは atton/tmux に反映される、という状態にできました。</div>
</div>
<div>
<br /></div>
<div>
<br /></div>
<h4>
前回との diff : GitHub Actions の追加</h4>
<div>
GitHub Actions を2ヶ所で利用しています。</div>
<div>
<br /></div>
<div>
1ヶ所目は atton/tmux で、<a href="https://github.com/atton/tmux/blob/526f000f29abadeef9f804bb9aea5291b913a312/.github/workflows/build.yml">centos 環境で make 可能かチェック</a>しています。</div>
<div>
2ヶ所目は atton/homebrew-customs で、<a href="https://github.com/atton/homebrew-customs/blob/master/.github/workflows/all.yml#L18-L23">macOS 環境で make 可能かチェック</a>しています。</div>
<div>
<br /></div>
<div>
GitHub Actions では mac と docker が使えるので、様々な環境下でテストできる点が良いですね。</div>
attonhttp://www.blogger.com/profile/08720809750045983794noreply@blogger.com0tag:blogger.com,1999:blog-7192101599613841570.post-79285513457819744782020-04-19T14:01:00.000+09:002020-04-19T14:03:48.008+09:00Homebrew で awscli を upgrade して、依存の keg-only python@3.8 を link するHomebrew が提供する awscli が 2.0 になる前辺り、<a href="https://github.com/Homebrew/homebrew-core/commit/29be81fca715db0e4bf21328bfaa3f3b41623561#diff-030ed7c304a0ae6b4669344a183c29cd">必要な python が python@3.8 になりました</a>。<br />
awscli を upgrade する際、 python を消して python@3.8 を使うようにしたログです。<br />
<br />
<br />
<h4>
環境(ブログ作成時)</h4>
<div>
<ul>
<li>OS: macOS Mojave 10.14.6</li>
<li>Homebrew: 2.2.13-74-gecea0e5</li>
<ul>
<li>homebrew-core (git revision eb6d; last commit 2020-04-19)</li>
<li>python: Python3.7.7</li>
<li>python@3.8: Python 3.8.2</li>
</ul>
<li>awscli: aws-cli/2.0.8 Python/3.8.2 Darwin/18.7.0 botocore/2.0.0dev12</li>
</ul>
<div>
<br /></div>
</div>
<div>
<br /></div>
<h4>
keg-only formula と Homebrew の install 事情</h4>
<div>
<div>
Homebrew は元々、 /usr/local/bin へ直接 formula を install しません。</div>
<div>
/usr/local/Cellar などの PATH に install して、そこから symlink を貼ります。</div>
</div>
<div>
<br /></div>
<div>
その中で <a href="https://docs.brew.sh/FAQ#what-does-keg-only-mean">key-only formula</a> は「install しても /usr/local/bin に link しない」 formula です。</div>
<div>
今回は python@3.8 が keg-only に指定されています。理由として executable の衝突回避が挙げられます。<br />
<ul>
<li>前提として、現時点で Homebrew が提供している python は 3.7 系列</li>
<li>python が存在する環境に python@3.8 も installすると /usr/local/bin/python3 が重複する</li>
<li>/usr/local/bin/python3 を 3.7 系列に譲るために、 3.8 は keg-only として link しない</li>
</ul>
<div>
<div>
という感じかと思われます。</div>
</div>
<div>
<br /></div>
<div>
<br /></div>
<h4>
keg-only formula を link する前の確認</h4>
<div>
link の前に、念の為 python が使われていないか、以下のコマンドでチェックします。<br />
<ul>
<li>$ brew uses --installed python</li>
</ul>
<div>
何も出力されない場合は install 済みの formulas 全てにおいて python を使っていません。<br />
出力がある場合、その formula は python を使っています。 3.8 の link は止めた方が良いでしょう。<br />
<br />
<br />
<h4>
python@3.8 を /usr/local/bin に link する</h4>
上記のチェック時、私の環境では出力が無かった為 python@3.8 を link する事にしました。<br />
なお、 keg-only formula を link する場合は --force が必要です。<br />
<ul>
<li>$ brew upgrade awscli</li>
<ul>
<li>依存関係で python@3.8 が install される</li>
</ul>
<li>$ brew link --force python@3.8</li>
<li>$ which python3 aws<ul>
<li>/usr/local/bin/python3</li>
<li>/usr/local/bin/aws</li>
</ul>
</li>
<li>$ python3 -V</li>
<ul>
<li>Python 3.8.2</li>
</ul>
<li>$ aws --version</li>
<ul>
<li>aws-cli/2.0.8 Python/3.8.2 Darwin/18.7.0 botocore/2.0.0dev12</li>
</ul>
</ul>
これで python3 と awscli が upgrade できました。良し良し。<br />
ちなみに <a href="https://github.com/homebrew/homebrew-bundle">homebrew-bundle</a> では、 <a href="https://github.com/atton/dot_files/commit/5996e42b197dcd46d6e1c63dec343806e96ee5c2">link: true を付けると link してくれます</a>。<br />
<div>
<br /></div>
</div>
</div>
</div>
attonhttp://www.blogger.com/profile/08720809750045983794noreply@blogger.com0tag:blogger.com,1999:blog-7192101599613841570.post-88800925100679356112020-03-29T13:44:00.001+09:002020-03-29T14:18:10.938+09:00pry 0.13.0 で後方互換性を保ちつつ history file の path を設定するpry が 0.13.0 になった際、実行履歴ファイルの指定方法が変更になった事への対応。加えて後方互換もつけたログ。<br />
<br />
<br />
<h4>
pry の警告(ruby 2.7.0 + pry 0.12.2)</h4>
ruby 2.7.0 で pry 0.12.2 を起動すると、以下のような警告が出ていました。<br />
<script src="https://gist.github.com/atton/9ac15fafb66fc0cc9971784f0afc9bc8.js?file=warning.txt"></script>
私は怠惰なエンジニアなので、問題が発生するまでは様子見をする事にしました。<br />
<br />
<br />
<h4>
pry 0.13.0 Released</h4>
そして、<a href="https://github.com/pry/pry/releases/tag/v0.13.0" target="">2020/03/21 に pry の version 0.13.0 がリリース</a>されました。<br />
素晴らしい事に起動時に例の警告が出ません。 pry の開発陣に感謝ですね。<br />
しかし、これでハッピーエンド、という訳にはいきませんでした。<br />
<br />
<br />
<h4>
Pry.config の変更</h4>
<div>
私は pry の history file の path を指定していました。具体的な設定は以下。</div>
<script src="https://gist.github.com/atton/9ac15fafb66fc0cc9971784f0afc9bc8.js?file=old_config.rb"></script>
0.12.2 はこの設定方法で問題ありませんでした。<br />
しかし、 0.13.0 では設定方法が変わったようで、以下のように NoMethodError が発生します。
<br />
<script src="https://gist.github.com/atton/9ac15fafb66fc0cc9971784f0afc9bc8.js?file=error.txt"></script>
という事で設定方法を調べてみます。<br />
<br />
<br />
<h4>
設定方法探し</h4>
<div>
さて、指針も無く彷徨っても仕方が無いので、まずはそれらしい場所にあたりをつけます。</div>
<div>
設定時、 Pry.config と書くので、 Config class か module あたりが無いか探します。</div>
<div>
<ul>
<li>$ git grep Config</li>
</ul>
<div>
すると <a href="https://github.com/pry/pry/blob/2208ed30f246b4dbeb512745021e00052781ece6/lib/pry/config.rb#L5" target="">lib/pry/config.rb に Config class</a> がありました。</div>
</div>
<div>
流し読みしつつ、 history で検索します。そうすると <a href="https://github.com/pry/pry/blob/2208ed30f246b4dbeb512745021e00052781ece6/lib/pry/config.rb#L90-L103" target="">history に関連するコードの集まり</a>を見付けました。</div>
<div>
さらに言えば history_file なる attribute がありますね。とてもとても怪しい。</div>
<div>
<br /></div>
<div>
Pry.config.history_file の値を pry で確認すると、今書き込まれている history の path でした。</div>
<div>
変数が特定できたので、まずは path を代入してみます。 弾かれないか心配でしたが特に問題無し。</div>
<div>
pryrc で Pry.config.history_file を設定すると、指定した path に history が書き込まれました。これで解決。</div>
<div>
<br /></div>
<div>
なお、<a href="https://github.com/pry/pry/commit/e5556a2be8627ec3fe594c738f10422d5a1f5d43">history_file 辺りを blame して commit を確認する</a>と<br />
<blockquote class="tr_bq">
`Pry.config.history.file` becomes `Pry.config.history_file`</blockquote>
とありました。なので調べた結論で正しそうです。</div>
<div>
<br /></div>
<div>
<br /></div>
<h4>
0.13.0 以前の history との互換性</h4>
<div>
さて、 pry 0.13.0 で history file の path を指定できました。</div>
<div>
<br /></div>
<div>
しかし bundler で gem を管理していると、バージョンが異なる pry が複数、なんてケースもあると思います。</div>
<div>
幸い history file の中身は plain text なので、バージョン毎の違いは恐らくありません。<br />
各 pry で同じ history の path を指定する事で、今まで通りバージョンに関わらず共通の history を参照できるはずです。<br />
ということでバージョンが低い pry も考慮に入れた pryrc が以下。</div>
<script src="https://gist.github.com/atton/9ac15fafb66fc0cc9971784f0afc9bc8.js?file=new_config.rb"></script>
<br />
<ul>
<li>respond_to? でバージョン確認</li>
<li>path は instance variable で一時的に定義して最後は消す</li>
</ul>
といった感じにしました。今の所は問題無く動作しています。attonhttp://www.blogger.com/profile/08720809750045983794noreply@blogger.com0tag:blogger.com,1999:blog-7192101599613841570.post-71388659090336486962020-02-09T11:21:00.000+09:002020-02-09T11:42:16.971+09:00neovim + deoplete で kebab-case の補完をするkebab-case(単語をハイフンで区切る) は snake_case や camelCase に比べ、比較的使われていないと思います。<br />
ですが、 apt-get や docker-compose を打っていると少し利点を感じました。<br />
<ul>
<li>「Shift Key を押さなくて良い」</li>
</ul>
<div>
怠惰な私にとって採用理由として十分。なので zsh で使う function は kebab-case で<a href="https://github.com/atton/dot_files/blob/980593d6467304ec52b5f0a0f8cb46d7cc21c1c9/dot_files/.config/zsh/zprofile.util">記述しています</a>。<br />
<br />
さて、ここで小さな問題が発生しました。<br />
neovim で利用している補完プラグインの <a href="https://github.com/Shougo/deoplete.nvim">deoplete</a> が、default の設定では kebab-case を補完してくれない。<br />
と、いうことで kebab-case も補完対象にするように設定したログです。<br />
<br />
<br />
<h4>
環境</h4>
</div>
<div>
<ul>
<li>OS: macOS Mojave 10.14.6</li>
<li>zsh: 5.7.1 (x86_64-apple-darwin18.2.0)</li>
<li>neovim: v0.4.3</li>
<li>deoplete: master(記事執筆時 <a href="https://github.com/Shougo/deoplete.nvim/tree/6e01000280edc9c9c56ef7b1d59977fc93e3bf4c">6e01000280</a>)</li>
<li>Python: 3.7.6</li>
<li>pynvim: 0.4.1</li>
</ul>
<div>
<br /></div>
</div>
<div>
<br /></div>
<h4>
補完の設定</h4>
<div>
まず、補完の対象を設定する変数などが無いか、:help deoplete で探します。</div>
<div>
ありました。<a href="https://github.com/Shougo/deoplete.nvim/blob/6e01000280edc9c9c56ef7b1d59977fc93e3bf4c/doc/deoplete.txt#L172-L184">keyword_patterns で filetype 別に正規表現を指定</a>すれば良さそうです。<br />
というか ruby の補完サンプルもありますね。末尾の ! や ? に対応している。便利そう。<br />
<br />
話が逸れました。まず、kebab-case にマッチしそうな正規表現として<br />
<ul>
<li>最初の文字は alphabet と '_'</li>
<li>それ以降は alpabet と '_' と '-' が0回以上繰り返される</li>
</ul>
<div>
とします。これを具体的な正規表現にすると</div>
<div>
<ul>
<li>[a-zA-Z_][a-zA-Z_-]*</li>
</ul>
<div>
で良さそうです。これを filetype zsh の補完に設定します。<br />
何故 sh でなく zsh かと言うと、 sh では kebab-case のfunction が定義できない為です。<br />
<br />
設定後、きちんと補完されるようになりました。良し良し。<br />
<br />
<a href="http://1.bp.blogspot.com/-P8l79wDa-0w/Xj9cngI9muI/AAAAAAAAAH0/Ikb5jsRaKwUlNeivqdU_QZiEUAX1O0xagCK4BGAYYCw/s1600/zsh-kebab-case.png" imageanchor="1"><img border="0" height="358" src="https://1.bp.blogspot.com/-P8l79wDa-0w/Xj9cngI9muI/AAAAAAAAAH0/Ikb5jsRaKwUlNeivqdU_QZiEUAX1O0xagCK4BGAYYCw/s640/zsh-kebab-case.png" width="640" /></a><br />
<br />
<br />
<h4>
おまけ(他の定義とか)</h4>
</div>
</div>
</div>
<div>
これで deoplete の補完対象の設定ができるようになりました。<br />
zsh 以外の普段良く使う filetype の補完設定もしておきます。<br />
<ul>
<li>ruby: 先程発見した ruby の補完設定で、先頭に '@' を加えたもの</li>
<li>text: 英数字も含めて補完対象を広めにしたもの</li>
<li>_: help にあった定義をそのまま利用。なお、この設定は全 filetype に適用されます</li>
</ul>
<div>
これらを鑑みて設定した、私用の具体的な keyword_patterns の設定は<a href="https://github.com/atton/dot_files/blob/980593d6467304ec52b5f0a0f8cb46d7cc21c1c9/dot_files/.config/nvim/plugins.vim#L63-L68">こんな感じ</a>。以下抜粋。</div>
</div>
<br />
<script src="https://gist.github.com/atton/4d584c0e11fac70d7f004b750ef7fb71.js"></script>
attonhttp://www.blogger.com/profile/08720809750045983794noreply@blogger.com0tag:blogger.com,1999:blog-7192101599613841570.post-4631024857313647772020-01-30T19:06:00.000+09:002020-01-30T19:06:41.917+09:00python2 に依存した Vim plugin が無いか確認と修正対応をしたお話2020/01/01(Wed) に <a href="https://www.python.org/doc/sunset-python-2">python2 のサポートが終了</a>しました。が、今の所私の周辺で問題は発生していません。<br />
<br />
Neovim で :checkhealth を実行していると、まだ python2 provider が有効な事にふと気付きました。<br />
「いつか python2 provider も消えるのだろうな」と悠長に考えたのが1つ目の感想。<br />
「python2 に依存した plugin があったらマズいのでは」と思って焦ったのが2つ目の感想。<br />
「問題は発生していない」と思っているけれど、本当にそうなのか念のために確認+対応したログです。<br />
<br />
<br />
<h4>
環境</h4>
<div>
<ul>
<li>OS: macOS Mojave 10.14.6</li>
<li>Neovim: 0.4.3</li>
<li>Python2: 2.7.16 (system builtin)</li>
<li>Python3: 3.7.6 (installed by homebrew)</li>
</ul>
<div>
<br /></div>
</div>
<div>
<br /></div>
<h4>
has('python') している plugin が無いか確認</h4>
<div>
私は Neovim の plugin management に <a href="https://github.com/Shougo/dein.vim">dein</a> を使っています。</div>
<div>
そして、plugin の install 先は ~/.config/nvim/dein を指定しているので、その先に cd して grep をかけてみます。</div>
<div>
<ul>
<li>$ cd ~/.config/nvim/dein/repos/github.com</li>
<li>$ egrep 'has\(.python.\)' -R .</li>
</ul>
<div>
egrep のオプションの -R は、指定したディレクトリを起点に recursive に探索してくれます。</div>
</div>
<div>
そして、渡しているディレクトリは '.' なので、 カレントディレクトリ以下の全てのファイルを対象にできます。<br />
<br /></div>
<div>
egrep で指定した正規表現は 'has\(.python.\)' です。これは<br />
<ul>
<li>まず、 vim/neovim で特定の feature が有効か確認する方法として 'has' function があります。</li>
<li>そして python2 provider が有効かどうかは has('python') の実行結果で分かります。</li>
<li>加えて考慮する事として、python を括る文字が ' と " のどちらかの問題があります。</li>
<ul>
<li>これは面倒なので . にしました。 ['"] 2つなどでもOKです。</li>
</ul>
<li>最後に、'()' は egrep パターンマッチに使う記号なので \ でエスケープします。</li>
</ul>
<div>
<br /></div>
</div>
<div>
さて、実行結果は以下のようになりました。</div>
<div>
<script src="https://gist.github.com/atton/e0f13f8a675b2a16742b7633062e2521.js"></script></div>
<div>
前後のソースを読んではいないので、 現段階では対応が必要かもしれない plugin 一覧とします。</div>
<div>
<br /></div>
<div>
<br /></div>
<h4>
一時的に python2 provider を無効にする</h4>
<div>
Neovim で :help provider とすると、各 provider の説明が確認できます。<br />
その中には provider を無効化する方法も存在しており、 python2 の場合は</div>
<div>
<ul>
<li>let g:loaded_python_provider = 0</li>
</ul>
<div>
と ~/.config/nvim/init.vim に書くと無効化できます。<br />
<br /></div>
</div>
<div>
なお、この状態で :checkhealth を実行すると</div>
<div>
<ul>
<li>- INFO: Disabled (g:loaded_python_provider=0).</li>
</ul>
<div>
と表示されます。</div>
</div>
<div>
<br /></div>
<div>
さて、これで仮に python2 provider が消えた時状態を再現できました。</div>
<div>
先程 egrep で見付けたプラグインの動作確認を行なった結果、</div>
<div>
<ul>
<li><a href="https://github.com/gregsexton/VimCalc">gregsexton/VimCalc</a></li>
<li><a href="https://github.com/atton/gundo.vim">atton/gundo.vim</a></li>
</ul>
<div>
が動作しませんでした。</div>
<div>
<br /></div>
</div>
<div>
<br /></div>
<h4>
VimCalc 対応: VimCalc -> VimCalc3</h4>
<div>
安直に「VimCalc python3」で検索をかけてみます。</div>
<div>
そうすると、<a href="https://github.com/fedorenchik/VimCalc3">fedorenchik/VimCalc3</a> が見付かりました。なお、 fork 元は本家の <a href="https://github.com/gregsexton/VimCalc"><span id="goog_668265568"></span>gregsexton/VimCalc</a> です。</div>
<div>
お試しでインストールすると、ほぼ同じ動作。ということで VimCalc3 に乗り換えます。</div>
<div>
<br /></div>
<div>
<br /></div>
<h4>
gundo.vim 対応: let g:gundo_prefer_python3 = 1</h4>
<div>
さて、二度目も安直に「gundo.vim python3」でググります。</div>
<div>
そうすると bitbucket の<a href="https://bitbucket.org/sjl/gundo.vim/issues/42/about-python3-support"> issue のページがヒット</a>しました。どうやら既に対応済みだったらしく</div>
<div>
<ul>
<li>let g:gundo_prefer_python3 = 1</li>
</ul>
</div>
<div>
と書くことで python3 を利用するようです。動作確認もできたので、 gundo.vim はそのまま使う事にします。</div>
<div>
<br /></div>
<div>
<br /></div>
<h4>
まとめ</h4>
<div>
これで Neovim がいつ python2 provider を消しても大丈夫になりました。</div>
<div>
<br /></div>
<div>
蛇足ですが、対応した2つのプラグインは利用頻度が低く、 LazyLoad していました。</div>
<div>
なので、仮に Neovim が python2 provider を消したとしても、気付くのに時間がかかった可能性は十分にあります。</div>
<div>
それを排除できたので、備えあれば何とやら、ですね。</div>
attonhttp://www.blogger.com/profile/08720809750045983794noreply@blogger.com0tag:blogger.com,1999:blog-7192101599613841570.post-23811113784042167682019-12-21T11:56:00.000+09:002019-12-21T11:56:26.737+09:00tmux 3.0a の window 分割線を ascii character にする<a href="https://github.com/tmux/tmux/releases/tag/3.0a" target="_blank">2019/12/01 に tmux の version 3.0a がリリースされました</a>。<br />
いつも通りに分割線を multibyte character から ascii にする作業をします。<br />
過去の作業ログは <a href="https://attonblog.blogspot.com/2019/08/tmux-29a.html" target="_blank">2.9a</a> や <a href="https://attonblog.blogspot.com/2018/10/tmux-2-8.html" target="_blank">2.8</a> や <a href="https://attonblog.blogspot.com/2018/04/tmux-27.html" target="_blank">2.7</a> など。そもそもの問題については<a href="https://attonblog.blogspot.com/2017/11/tmux-pull-request.html" target="_blank">この記事</a>にあります。<br />
<br />
<br />
<h4>
環境</h4>
<div>
<ul>
<li>OS: macOS Mojave 10.14.6</li>
<li>tmux: <a href="https://github.com/atton/tmux/tree/3.0a-border-ascii">3.0a-border-ascii ( 9664700184f23ec828768c8aceac248dc2efffdc )</a></li>
<li>Homebrew: 2.2.1-76-gaf98c15</li>
<li>Homebrew/homebrew-core: (git revision d0305; last commit 2019-12-20)</li>
<li>Font: Ricty 3.2.2</li>
</ul>
<div>
<br /></div>
</div>
<div>
<br /></div>
<h4>
インストール方法</h4>
<div>
<ul>
<li>$ brew install --HEAD atton/customs/tmux</li>
</ul>
<div>
でインストールできます。</div>
</div>
<div>
<br /></div>
<div>
<br /></div>
<h4>
今回の変更</h4>
<div>
tmux は window や pane を表示するための文字情報を <a href="https://github.com/tmux/tmux/blob/745233d6a1ccb548a9807993ee4330baadec46bb/tty-acs.c">tty-acs.c</a> に持っています。</div>
<div>
なので、毎度この定義を修正する事で対応しています。</div>
<div>
2.9a の時等は tty-acs.c に変更が無かった為、過去の commit の cherry-pick のみで目的が達成できました。</div>
<div>
が、今回は修正が入っているので cherry-pick をすると conflict します。<br />
conflict を解消する形で対応しても良いのですが、今回は新しく修正用の commit を作ることにしました。</div>
<div>
<br /></div>
<div>
<a href="https://github.com/atton/tmux/commit/f976aed943f322a3652f51846b0fe472534ab6d6">過去のパッチ</a> を参考にすると、置換が必要な文字とその対応関係は</div>
<div>
<ul>
<li>j,k,l,m,n,t,u,v,w が "+"</li>
<li>x が "|"</li>
<li>q が "-"</li>
<li>~ が "*"</li>
</ul>
<div>
のようです。これらを元に tty-acs.c を修正。make すると今まで通り動きました。<br />
もちろん後から何か踏む可能性はありますが、今の所問題は発生していません。<br />
ということで tmux のソースコードの更新は以上。<br />
あとは branch 名を homebrew の <a href="https://github.com/atton/homebrew-customs">atton/customs</a> 用に付けてあげればおしまいです。<br />
<br />
formula の更新は本家 tmux の --HEAD 版の定義を借りて、<a href="https://github.com/atton/homebrew-customs/commit/6e888f08956c61855c67568705636c9a9f38b328">branch 名を指定すれば</a>OK。<br />
<br />
と、いうことで tmux 3.0a-border-ascii の更新ログでした。<br />
<br />
<br />
<h4>
おまけ</h4>
<div>
分割線の定義を間違えると、分割した瞬間に tmux が crash します。こわい。</div>
<div>
きちんと定義できれば以下のように割りたい放題しても動きます。</div>
<div>
<br /></div>
<div>
<a href="http://2.bp.blogspot.com/-inNbBFTtCzg/Xf2HdF6OVyI/AAAAAAAAAG4/7sK9CHKnYRoTLEbbmGgpidtIIDRPUkgFwCK4BGAYYCw/s1600/tmux-3.0a-border-ascii.png" imageanchor="1"><img border="0" height="366" src="https://2.bp.blogspot.com/-inNbBFTtCzg/Xf2HdF6OVyI/AAAAAAAAAG4/7sK9CHKnYRoTLEbbmGgpidtIIDRPUkgFwCK4BGAYYCw/s640/tmux-3.0a-border-ascii.png" width="640" /></a></div>
<br /></div>
</div>
attonhttp://www.blogger.com/profile/08720809750045983794noreply@blogger.com0tag:blogger.com,1999:blog-7192101599613841570.post-35519862945622476832019-12-15T11:29:00.000+09:002019-12-15T11:29:20.370+09:00AquaSKK で Sticky Shift を使う私は普段、mac で日本語入力をする時は <a href="http://aquaskk.osdn.jp/" target="_blank">AquaSKK</a> を使っています。<br />
AquaSKK は <a href="https://github.com/codefirst/aquaskk/releases/tag/4.7.0" target="_blank">version 4.7.0 から Stickey Shift が実装された</a>ようなので設定してみました。<br />
<br />
<br />
<h4>
環境</h4>
<div>
<ul>
<li>OS: macOS Mojave 10.14.6</li>
<li>Homebrew: 2.1.15-63-g090259b</li>
<li>Homebrew/homebrew-cask: (git revision ec6b9; last commit 2019-10-26)</li>
<li>AquaSKK: 4.7.0</li>
<li>neovim: 0.4.2</li>
<li>eskk.vim: <a href="https://github.com/tyru/eskk.vim/tree/207d05cd50d126a84271aca7f02b3f839dab27c3" target="_blank">207d05cd</a></li>
</ul>
<div>
<br />
<br />
<h4>
AquaSKK の install</h4>
</div>
</div>
<div>
homebrew-cask に formula があるので<br />
<ul>
<li>$ brew cask install aquaskk</li>
</ul>
<div>
で Install できます。</div>
</div>
<div>
<br />
<br /></div>
<h4>
SKK とは</h4>
<div>
日本語のかな漢字変換プログラムの一つです。</div>
<div>
形態素解析を行なわず、漢字に変換、もしくは送り仮名付きの漢字の変換箇所をユーザが指定して入力します。</div>
<div>
何を言っているのかさっぱりな感じもあるので、具体的な例を見ていきましょう。<br />
<br />
<br />
<h4>
漢字変換</h4>
</div>
<div>
例えば『漢字』と入力したい場合、「ことえり」や「Google 日本語入力」では</div>
<div>
<ul>
<li>kanzi<space> または kanji<space></li>
</ul>
<div>
と入力します。</div>
</div>
<div>
そして SKK では、変換を開始する入力を大文字のアルファベットで指定します。よって</div>
<div>
<ul>
<li>Kanzi<space> または Kanji<space></li>
</ul>
<div>
と入力します。</div>
</div>
<div>
<br /></div>
<div>
<br /></div>
<h4>
送り仮名付き漢字変換</h4>
<div>
さて、次は『感じ』と入力したい場合を想定します。</div>
<div>
「ことえり」や「Google 日本語入力」では変わらずに</div>
<div>
<ul>
<li>kanzi<space> または kanji<space></li>
</ul>
<div>
と入力します。また、その時の変換候補に『漢字』が出ることもあるでしょう。</div>
</div>
<div>
SKK では送り仮名付きの漢字変換の時の変換箇所も大文字アルファベットで指定します。つまり</div>
<div>
<ul>
<li>KanZi<space> または KanJi<space></li>
</ul>
<div>
と入力します。そうすると、「感じ」「観じ」といった送り仮名付きの変換候補しか出ません。<br />
<br /></div>
</div>
<div>
さらに言えば、先程の『漢字』の入力について</div>
<div>
<ul>
<li>Kanzi<space> または Kanji<space></li>
</ul>
<div>
と入力した場合の変換候補は「漢字」「幹事」「監事」といった、送り仮名無しの候補しか出ません。</div>
</div>
<div>
これが結構便利で、「送り仮名あり、送り仮名無し」の入力に関しては誤字が少なくなります。</div>
<div>
<br /></div>
<div>
<br /></div>
<h4>
横道: 形態素解析をしない、ということ</h4>
<div>
例に上げたように、漢字入力の際や送り仮名付きの漢字入力では SKK にはメリットがあります。</div>
<div>
しかし、変換のポイントを自分で指定するため</div>
<div>
<ul>
<li>これは漢字の入力のテストです</li>
</ul>
<div>
といった入力は一度にはできません。<br />
<br /></div>
</div>
<div>
「ことえり」や「Google 日本語入力」では全てのアルファベットを入力した後、先頭から少しずつ変換することができます。</div>
<div>
なので、それぞれ得手不得手がある、と思った方が良いかと思われます。</div>
<div>
<br /></div>
<div>
<br /></div>
<h4>
Sticky Shift とは</h4>
<div>
さて、ここまで来ると Sticky Shift のお話ができます。</div>
<div>
Sticky Shift とは、変換の指定ポイントを大文字のアルファベットでは無く、特定の文字で指定する方法です。<br />
<br /></div>
<div>
例えば、';' を設定した場合、先程の「漢字と感じ」は</div>
<div>
<ul>
<li>;kanji<space>to;kan;ji</li>
</ul>
<div>
と入力できます。</div>
</div>
<div>
一見冗長ですが、慣れると便利です。<br />
<br /></div>
<div>
加えて、大文字入力が必要無いので Shift Key を使わずに入力を完結させることができます。<br />
なお、eskk.vim では default で ';' Key が Sticky Shift 用の文字として<a href="https://github.com/tyru/eskk.vim/blob/207d05cd50d126a84271aca7f02b3f839dab27c3/autoload/eskk.vim#L414" target="_blank">実装されています</a>。</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<h4>
Sticky Shift の設定</h4>
</div>
<div>
<a href="https://github.com/codefirst/aquaskk/wiki/StickyShift" target="_blank">keymap.conf を編集する、と github の wiki に記述</a>されています。</div>
<div>
そして<a href="https://osdn.net/projects/aquaskk/wiki/keymap.conf%E3%81%AE%E6%96%87%E6%B3%95" target="_blank">keymap.conf については AquaSKK の wiki に記述</a>があります。</div>
<div>
ので設定してみましょう。大元の設定をコピーして追記します。</div>
<div>
<br /></div>
<div>
なお、コピー先の ~/Library/Application\ Support/AquaSKK については、AquaSKK を install した時に作られています。</div>
<div>
なので<br />
<ul>
<li><span style="font-size: x-small;">$ cp /Library/Input\ Methods/AquaSKK.app/Contents/Resources/keymap.conf ~/Library/Application\ Support/AquaSKK</span></li>
</ul>
を実行してコピー。<br />
<br />
そして ~/Library/Application\ Support/AquaSKK/keymap.conf に<br />
<ul>
<li>StickyKey ;</li>
</ul>
</div>
<div>
<a href="https://github.com/atton/dot_files/blob/b5673040a3447f71e17d36b6d12f55607cddd63c/macOS/keymap.conf#L53-L57" target="_blank">を追記します</a>。</div>
<div>
<br /></div>
<div>
その後、AquaSKK のプロセスを殺すか、reboot 等で AquaSKK が再起動すれば、Sticky Shift が有効になっているはずです。</div>
<div>
めでたしめでたし。</div>
<div>
<br />
<br /></div>
<h4>
参考</h4>
<div>
<ul>
<li><a href="http://aquaskk.osdn.jp/" target="_blank">AquaSKK - 日本語を快適に</a></li>
<li><a href="https://github.com/codefirst/aquaskk/releases/tag/4.7.0" target="_blank">Release Sticky Shift · codefirst/aquaskk · GitHub</a></li>
<li><a href="https://github.com/tyru/eskk.vim" target="_blank">GitHub - tyru/eskk.vim: eskk is pure Vim script implementation of input method engine SKK</a></li>
<li><a href="https://github.com/tyru/eskk.vim/blob/207d05cd50d126a84271aca7f02b3f839dab27c3/autoload/eskk.vim#L414" target="_blank">eskk.vim/eskk.vim at 207d05cd50d126a84271aca7f02b3f839dab27c3 · tyru/eskk.vim · GitHub</a></li>
<li><a href="https://github.com/codefirst/aquaskk/wiki/StickyShift" target="_blank">StickyShift · codefirst/aquaskk Wiki · GitHub</a></li>
<li><a href="http://keymap.confの文法 - AquaSKK Wiki - AquaSKK - OSDN" target="_blank">keymap.confの文法 - AquaSKK Wiki - AquaSKK - OSDN</a></li>
</ul>
</div>
attonhttp://www.blogger.com/profile/08720809750045983794noreply@blogger.com0tag:blogger.com,1999:blog-7192101599613841570.post-48507200879258727292019-11-17T15:44:00.000+09:002019-11-17T15:46:32.767+09:00Disable Text Replacement on Safari in MojaveiOS で文字入力をする際、入力が億劫な定型文とかを登録してみる。<br />
<ul>
<li>General > Keyboard > Text Replacement </li>
</ul>
<div>
で追加できます。<br />
<br /></div>
<div>
そこそこ快適になったと思ったら、iCloud 経由で自動的に Mac にも sync される様子。</div>
<div>
基本的には無害なのですが、一度 GitHub の sha1 の末尾が置換対象と認識されて誤爆しかけた。ので無効化させる事に。</div>
<div>
以下、 iOS では Text Replacement を有効にしつつ、Mac では無効化したログ。意外と大冒険だった。</div>
<div>
<br /></div>
<div>
<br /></div>
<h4>
環境</h4>
<div>
<ul>
<li>OS: macOS Mojave 10.14.6</li>
<li>Saferi: Version 13.0.3 (14608.3.10.10.1)</li>
<li>iOS: 12.3.2 and 13.2.2</li>
</ul>
<div>
<br /></div>
</div>
<div>
<br /></div>
<h4>
結論から言うと</h4>
<div>
以下のコマンドを実行すると Mac の Text Replacement 設定を全て削除できます。</div>
<div>
<ul>
<li>$ echo 'delete from ZTEXTREPLACEMENTENTRY;' | sqlite3 ~/Library/KeyboardServices/TextReplacements.db</li>
<li>$ defaults delete -g NSUserDictionaryReplacementItems</li>
</ul>
<div>
これで macOS では Text Replacement が発生しなくなります。</div>
</div>
<div>
あくまで delete なので、iOS 側で設定を追加すると、同期された設定を再度削除する必要があります。<br />
<br />
<br />
<h4>
設定が存在しないか探す</h4>
<div>
iCloud の設定等、怪しい部分を探すも、それらしきものを発見できず。</div>
<br />
<br />
<h4>
$ defaults write -g WebAutomaticTextReplacementEnabled -bool false</h4>
</div>
<div>
ググると<a href="https://superuser.com/questions/1331581/turn-off-text-replacement-on-macos" target="_blank">同じ考えの人</a>はいて、</div>
<div>
<ul>
<li>$ defaults write -g WebAutomaticTextReplacementEnabled -bool false</li>
</ul>
</div>
<div>
すると良い、とのことで実行。しかし変化無し。<br />
<br />
きちんと設定されているか分からないのでまずは設定を表示させる。<br />
<a href="https://ss64.com/osx/defaults.html" target="_blank">man defaults</a> すると read があるので実行してみる。<br />
<ul>
<li>$ defaults read -g WebAutomaticTextReplacementEnabled</li>
<ul>
<li>=> 0</li>
</ul>
</ul>
<div>
0なので一応 false になってる、という事なのだろうか。</div>
<div>
delete もあるので実行する。</div>
<div>
<ul>
<li>$ defaults delete -g WebAutomaticTextReplacementEnabled</li>
<li>$ defaults read -g WebAutomaticTextReplacementEnabled</li>
<ul>
<li>=> The domain/default pair of (kCFPreferencesAnyApplication, WebAutomaticTextReplacementEnabled) does not exist</li>
</ul>
</ul>
</div>
<div>
delete した場合は 0 すら返らないので、設定できていたことになる。<br />
しかし効果は表れなかったので、この方法では無理そう。</div>
<div>
<br />
<br />
<h4>
$ defaults find TextReplacement</h4>
</div>
<div>
defaults には find 機能もあるようだったので、</div>
<div>
<ul>
<li>$ defaults find TextReplacement</li>
</ul>
<div>
とすると大量の設定が返ってくる。<br />
<br /></div>
</div>
<div>
defaults は多分 <a href="https://developer.apple.com/documentation/foundation/nsuserdefaults" target="_blank">NSUserDefauts</a> を macOS 側からいじる用のコマンドだと思われる。</div>
<div>
Application 毎に設定があるし、Application 側で値を変更したら defaults で見られる情報に変化があった。</div>
<div>
具体的には 'com.apple.iWork.Keynote' の 'TSWPAutomaticTextReplacement' の値とか。</div>
<div>
Keynote で Text Replacement を disable にすると 'TSWPAutomaticTextReplacement' の値が 0 になる。</div>
<div>
<br /></div>
<div>
ちなみに -g は global option らしい。</div>
<div>
Safari だけに効くよう、以下のように domain を指定して設定してみる。</div>
<div>
<ul>
<li>$ defaults write com.apple.Safari TSWPAutomaticTextReplacement -bool false</li>
</ul>
<div>
しかし無効化できず。うーん。</div>
</div>
<div>
<br /></div>
<div>
<br /></div>
<h4>
$ defaults write -g WebAutomaticTextReplacementEnabled -bool true</h4>
<div>
逆に 0 でなく 1 を設定してみる。そうすると </div>
<div>
<ul>
<li>Menu bar(Safari) > Edit > Substitutions</li>
</ul>
<div>
が select できるようになる。</div>
</div>
<div>
その中の 'Text Replacement' を disable にすると置換が止まった。</div>
<div>
後はこれを defaults のどこに書くのか調べると良さそう。</div>
<div>
<br /></div>
<div>
と、思ったがそうは問屋が卸さなかった。defaults を使っても設定が見付けられない。</div>
<div>
その上、 Saferi で 新規 Window を開くと 'Text Replacement' が Enabled な Window が増える。</div>
<div>
あと、mac を reboot したら Text Replacement がまた有効になる。</div>
<div>
どこかに設定があるからそれに辿りつけば良いんだけれど、対症療法ではどうも分が悪そう。</div>
<div>
<br /></div>
<div>
<br /></div>
<h4>
$ defaults write -g NSUserDictionaryReplacementItems <dictionary></h4>
<div>
設定の場所を特定するためにわざと 'hoge' とかを TextReplacement に追加する。</div>
<div>
そして</div>
<div>
<ul>
<li>$ defaults find hoge</li>
</ul>
</div>
<div>
で調べると、NSUserDictionaryReplacementItems という Dictionary に格納されている。<br />
<br /></div>
<div>
NSUserDictionaryReplacementItems をググると少ないが<a href="https://www.jamf.com/jamf-nation/discussions/5847/k12-disable-spell-check-for-writing-test" target="_blank">記事はある</a>。</div>
<div>
それを辿ると ~/Library/Preferences/.GlobalPreferences.plist というファイルの存在が示唆されている。</div>
<div>
<ul>
<li>$ ls ~/Library/Preferences/.GlobalPreferences.plist</li>
</ul>
<div>
すると一応存在している。<br />
<ul>
<li>$ open -a XCode.app ~/Library/Preferences/.GlobalPreferences.plist</li>
</ul>
内容は defaults read -g と同じっぽい。のでこれをいじっても defaults とやっている事は変わらない筈。</div>
</div>
<div>
<br /></div>
<div>
またググって引っかかった<a href="https://www.oipapio.com/question-9746947" target="_blank">記事</a>によれば<br />
<ul>
<li>NSUserReplacementItems は 10.8 より前のバージョンで使われている</li>
<li>NSUserDictionaryReplacementItems は 10.9 で使われてる</li>
</ul>
<div>
とのことで。NSUserDictionaryReplacementItems をいじることにする。</div>
<div>
<br /></div>
<div>
元の値を一度取り出して</div>
<div>
<ul>
<li>$ defaults read -g NSUserDictionaryReplacementItems </li>
<ul>
<li>=> '( { on = 1; replace = hoge; with = "hogefugapiyo"; } )'</li>
</ul>
</ul>
<div>
on を 0 にして、書き込む</div>
</div>
</div>
<div>
<ul>
<li>$ defaults write -g NSUserDictionaryReplacementItems '( { on = 0; replace = hoge; with = "hogefugapiyo"; } )'</li>
</ul>
<div>
しかし Text Replacement は発生してしまう。</div>
<div>
が、 Safari を起動すると、Text Replacement が発生しなくなった。ということでコレで良さそうだ。</div>
</div>
<div>
その後、 macOS を再起動しても on flag は 0 のままだった。これで解決かな。</div>
<div>
<br />
<br />
<h4>
復活する NSUserDictionaryReplacementItems</h4>
<div>
解決かと思ったがそうでも無かった。しばらくすると on flag が 1 になっていた。</div>
<div>
iCloud から sync した時に 1 になるなら理解できるが、特に編集せずとも 1 になる時がある。</div>
<div>
<br /></div>
<div>
ググると <a href="https://apple.stackexchange.com/questions/110776/writing-to-nsuserdictionaryreplacementitems-with-defaults" target="_blank">DB に格納されている</a>、という記事が。</div>
<div>
<ul>
<li>$ ls /Library/Dictionaries/CoreDataUbiquitySupport/atton~*/UserDictionary/local/store/UserDictionary.db</li>
</ul>
</div>
<div>
確かにある。sqlite3 で中身を覗いてみるとデータが無い。</div>
<div>
というか ls -l したら 0B だった。のでここでは無い。<br />
<br />
<br />
ちなみに、 on flag が 1 になる再現条件の一つは<br />
<ul>
<li>System Preferences > Keyboard > Text を見る</li>
</ul>
でした。とりあえず確認に使えるので再現方法が1つ見付かっただけありがたい。</div>
<div>
<br />
<br />
<h4>
echo 'delete from ZTEXTREPLACEMENTENTRY;' | sqlite3 ~/Library/KeyboardServices/TextReplacements.db</h4>
<div>
Dictionary の save 先が無いかなー、とかググっていると <a href="https://www.macworld.co.uk/how-to/mac/how-edit-your-macs-dictionary-3642910/" target="_blank">~/Library/Spelling</a> に text edit の auto correction の情報がある、という記事にぶつかる。</div>
<div>
<br /></div>
<div>
~/Library をいろいろ見ると</div>
<div>
<ul>
<li>$ ls ~/Library/KeyboardServices/TextReplacements.db</li>
</ul>
</div>
という怪しい物体を発見。早速中を見る。<br />
<ul>
<li>$ file KeyboardServices/TextReplacements.db</li>
<ul>
<li>=> KeyboardServices/TextReplacements.db: SQLite 3.x database, last written using SQLite version 3016000</li>
</ul>
<li>$ sqlite3 ~/Library/KeyboardServices/TextReplacements.db</li>
<ul>
<li>sqlite> .schema</li>
<ul>
<li>CREATE TABLE ZTEXTREPLACEMENTENTRY</li>
<li>CREATE TABLE ZTRCLOUDKITSYNCSTATE </li>
<li>CREATE INDEX ...</li>
<li>CREATE TABLE Z_PRIMARYKEY</li>
<li>CREATE TABLE Z_METADATA</li>
<li>CREATE TABLE Z_MODELCACHE</li>
</ul>
<li>sqlite> select * from ZTEXTREPLACEMENTENTRY limit 1;</li>
<ul>
<li>4|1|1|0|0|582166527.750349|三度寝|さんどね|C561DE44-D3D9-4F37-95E6-5916FF62C390|bplist00=>X$versionX$objectsY$archiverT$top</li>
</ul>
</ul>
</ul>
<div>
システム設定が参照しているかはともかく、コイツが Text Replacement のデータを保存しているのは間違いなさそう。<br />
<br /></div>
<div>
とりあえずバックアップを取って消してみる。<br />
<ul>
<li>sqlite> delete from ZTEXTREPLACEMENTENTRY;</li>
<li>sqlite> select * from ZTEXTREPLACEMENTENTRY;</li>
<ul>
<li>消えてるので record は無い</li>
</ul>
</ul>
</div>
System Preferences > Keyboard > Text を開くと見事に消えている。<br />
ので NSUserDictionaryReplacementItems が復活する事も無さそう。<br />
ということで defaults で NSUserDictionaryReplacementItems を消す。<br />
<ul>
<li>$ defaults delete -g NSUserDictionaryReplacementItems</li>
</ul>
<div>
これにて一段落。これらを調べた結果が最初に書いた例の2行です。</div>
<div>
<br /></div>
<div>
<br /></div>
<br /></div>
<h4>
余談: WebKit の shallow clone とか</h4>
<div>
ソース読むかー、ということで WebKit を落とそうとするも時間がかかりすぎる。</div>
<div>
ので <a href="https://qiita.com/usamik26/items/7bfa61b31344206077fb" target="_blank">shallow-clone する</a>。</div>
<div>
<ul>
<li>$ git clone --depth 1 git://git.webkit.org/WebKit.git WebKit</li>
</ul>
</div>
<div>
何かないかと git grep -i replacementした結果</div>
<div>
<ul>
<li>NSUserDictionaryReplacementItems</li>
<li>ContextMenuItemTagTextReplacement</li>
<li>WebMenuItemTagTextReplacement</li>
<li>kWKContextMenuItemTagTextReplacement</li>
</ul>
</div>
<div>
等があって更に混乱した。それと対応してなのか<br />
<ul>
<li>ContextMenuItemTagSmartCopyPaste</li>
<li>WebMenuItemTagSmartCopyPaste</li>
<li>kWKContextMenuItemTagSmartCopyPaste</li>
</ul>
等もあり迷宮じみてる感じ。ちなみに depth 1 でも 4.5GB というトンデモサイズです。</div>
<br />
<br /></div>
</div>
<h4>
参考</h4>
<div>
<ul>
<li><a href="https://superuser.com/questions/1331581/turn-off-text-replacement-on-macos" target="_blank">sync - Turn off text replacement on macOS - Super User</a></li>
<li><a href="https://ss64.com/osx/defaults.html" target="_blank">man defaults</a></li>
<li><a href="https://developer.apple.com/documentation/foundation/nsuserdefaults" target="_blank">NSUserDefaults - Foundation | Apple Developer Documentation API Collection</a></li>
<li><a href="https://apple.stackexchange.com/questions/231336/how-can-i-globally-disable-text-replacement" target="_blank">macos - How can I globally disable 'Text Replacement'? - Ask Different</a></li>
<li><a href="https://discussions.apple.com/thread/8626388?answerId=34154277022#34154277022" target="_blank">Text replacement not working in Mojave - Apple Community</a></li>
<li><a href="https://github.com/matthewmueller/dots/blob/master/os/osx/defaults.sh#L360" target="_blank">dots/defaults.sh at master · matthewmueller/dots · GitHub</a></li>
<li><a href="https://webkit.org/getting-the-code/" target="_blank">Getting the Code | WebKit</a></li>
<li><a href="https://www.jamf.com/jamf-nation/discussions/5847/k12-disable-spell-check-for-writing-test" target="_blank">#K12 Disable spell check for writing test | Jamf Nation</a></li>
<li><a href="https://apple.stackexchange.com/questions/110776/writing-to-nsuserdictionaryreplacementitems-with-defaults" target="_blank">terminal - Writing to NSUserDictionaryReplacementItems with defaults - Ask Different</a></li>
<li><a href="https://www.reddit.com/r/MacOS/comments/ap7c6h/is_there_any_way_to_get_rid_of_the_check_spelling/" target="_blank">reddit: the front page of the internet</a></li>
<li><a href="https://gist.github.com/Angles/d387d940a41b085d7efb" target="_blank">iOS so-call (text) keyboard shorts which is text expansion can be a pain · GitHub</a></li>
<li><a href="https://qiita.com/usamik26/items/7bfa61b31344206077fb" target="_blank">git リポジトリの最新の履歴だけを取得する shallow clone - Qiita Qiita</a></li>
<li><a href="https://github.com/minoki/InputSourceSelector/issues/2" target="_blank">入力ソースにGoogle日本語入力を選択した場合、即座に切り替わらない · Issue #2 · minoki/InputSourceSelector · GitHub</a></li>
<li><a href="https://www.macworld.co.uk/how-to/mac/how-edit-your-macs-dictionary-3642910/" target="_blank">How to edit your Mac's dictionary - Macworld UK</a></li>
<li><a href="https://stackoverflow.com/questions/947215/how-to-get-a-list-of-column-names-on-sqlite3-database" target="_blank">iphone - How to get a list of column names on Sqlite3 database? - Stack Overflow</a></li>
</ul>
</div>
attonhttp://www.blogger.com/profile/08720809750045983794noreply@blogger.com1tag:blogger.com,1999:blog-7192101599613841570.post-8128183610199851492019-11-10T13:26:00.000+09:002019-11-10T13:26:29.808+09:00zle を使って特定の条件下のコマンドを実行する際、自動で丸括弧でくくる<a href="https://attonblog.blogspot.com/2019/11/peep-mac-tmux.html" target="_blank">前回の記事</a>では peep コマンドを使ってプロセスの終了時に通知を行ないました。<br />
また、<a href="https://github.com/atton/dot_files/blob/5e77c5c1a8a4d40b5a3abf2eacc617c47f8ec474/dot_files/.zprofile.mac#L51-L62" target="_blank">peep-mac-tmux</a> というコマンドを作って pid の指定を省略しました。<br />
<br />
ですが、 peep-mac-tmux を使う際、上手く動いてくれないパターンがいくつか出てきました。<br />
具体的には以下のようなパターンです。<br />
<br />
<ul>
<li>'&&' で繋がれたコマンド</li>
<ul>
<li>peep するのは実行中のコマンドなので、途中のコマンドが終了すると通知してしまう</li>
</ul>
<li>`xargs -L1` のように何度も子プロセスを生成するコマンド</li>
<ul>
<li>1つの子プロセスが終わった時に通知してしまう</li>
</ul>
</ul>
<div>
<br />
そこで、zsh の機能である <a href="http://zsh.sourceforge.net/Doc/Release/Zsh-Line-Editor.html" target="_blank">zle</a> を使い、これらのパターンの時に括弧で括って実行するようにしました。<br />
丸括弧で括ってあると subshell 内部でコマンドが実行されます。<br />
なので、peep は subshell の pid を peep する事で適切に動作させる狙いです。</div>
<div>
<br /></div>
<div>
<br /></div>
<h4>
環境</h4>
<div>
<ul>
<li>OS: macOS Mojave 10.14.6</li>
<li>Homebrew: 2.1.16-38-ge2c76cc</li>
<li>Homebrew/homebrew-core: (git revision 0f36; last commit 2019-11-09)</li>
<li>zsh: 5.7.1 (x86_64-apple-darwin18.2.0)</li>
</ul>
</div>
<div>
<br />
<br />
<h4>
zle とは</h4>
<div>
zsh command line editor という機能で、man zshzle すると詳細が見られます。</div>
<div>
<a href="https://stackoverflow.com/questions/28099966/use-preexec-to-evaluate-entered-command" target="_blank">コマンドを実行する際に編集したい、という要望は既に存在していて</a>、そこで使われていたのが zle でした。</div>
<div>
<br /></div>
<div>
今回の場合、'&&' が含まれる or '|' が含まれる、という時に括弧を追加することにします。</div>
<div>
そうして作成したのが以下の call-subshell です。<br />
<br /></div>
<script src="https://gist.github.com/atton/53a9789e57c76e539e5eb91ed8fbcc46.js?file=call-subshell.zsh"></script>
<br />
<div>
安直に、egrep で特定の pattern がある時、 BUFFER という vairable を編集する事で追加します。<br />
これで peep-mac-tmux の指定もやりやすくなりました。<br />
<br />
<br />
<h4>
無限に増える括弧</h4>
</div>
</div>
<div>
さて、peep-mac-tmux しやすくなりました、万歳、とはいかないようです。</div>
<div>
この定義ではパターンが含まれるコマンドに、() を追加するので、後のコマンドにもパターンが含まれる。</div>
<div>
なので、履歴からコマンドを呼び出すと括弧が増え続けます。これは困る。<br />
<br />
そこで括弧が重複しないようにしたのが以下の call-subshell です。<br />
<br /></div>
<script src="https://gist.github.com/atton/53a9789e57c76e539e5eb91ed8fbcc46.js?file=call-subshell-without-duplicate.zsh"></script>
<br />
<div>
一応、前後に空白があった場合にも対応しています。<br />
これで良し。</div>
<div>
<br />
<br />
<h4>
まとめ</h4>
</div>
<div>
zle を使うとコマンドを編集できて便利、というお話でした。</div>
<div>
<br /></div>
<div>
ちなみにオチとしては、</div>
<div>
<ul>
<li>peep が上手くいくメリット < () がある事で誤爆したりするデメリット</li>
</ul>
<div>
と感じたので、作成して2ヶ月くらいで<a href="https://github.com/atton/dot_files/commit/cc9c84c451f1d3f4834bc06c6547c87a45bd604e" target="_blank">消してしまいました</a>。</div>
</div>
<div>
<br /></div>
<div>
<br /></div>
<h4>
参考</h4>
<div>
<ul>
<li><a href="https://stackoverflow.com/questions/28099966/use-preexec-to-evaluate-entered-command" target="_blank">zsh - Use preexec() to evaluate entered command - Stack Overflow</a></li>
<li><a href="http://zsh.sourceforge.net/Doc/Release/Zsh-Line-Editor.html" target="_blank">zsh: 18 Zsh Line Editor</a></li>
<li><a href="https://github.com/atton/dot_files/commit/cc9c84c451f1d3f4834bc06c6547c87a45bd604e" target="_blank">Delete call-subshell · atton/dot_files@cc9c84c · GitHub</a></li>
<li>man zshall</li>
<li>man zshzle</li>
</ul>
</div>
attonhttp://www.blogger.com/profile/08720809750045983794noreply@blogger.com0tag:blogger.com,1999:blog-7192101599613841570.post-20833584863883082622019-11-02T13:46:00.000+09:002019-11-02T13:46:17.800+09:00peep を使って、プロセス終了時に Notification Center へ音付きで通知をする<a href="https://songmu.jp/riji/entry/2019-01-01-peep.html" target="_blank">peep</a> というコマンドがあります。pid を指定することで、そのプロセスが終了した際に通知等が行なえます。<br />
この記事は peep コマンドを macOS 上で使ったり、自前 function を作ったりしたログです。<br />
<br />
<br />
<h4>
環境</h4>
<div>
<ul>
<li>OS: macOS Mojave 10.14.6</li>
<li>Homebrew: 2.1.15-63-g090259b</li>
<li>Homebrew/homebrew-core (git revision 51ba; last commit 2019-10-25)</li>
<li>peep: 0.1.2 (rev: f770419/go1.11.4)</li>
<li>terminal-notifier: 2.0.0</li>
<li>tmux: <a href="https://attonblog.blogspot.com/2019/08/tmux-29a.html" target="_blank">2.9a(border-ascii)</a></li>
</ul>
<div>
<br /></div>
</div>
<div>
<br /></div>
<h4>
peep の install</h4>
<div>
Homebrew を使ってインストールしてみます。<a href="https://songmu.jp/riji/entry/2019-01-01-peep.html" target="_blank">作成者の Songmu さんの記事</a> の通り</div>
<div>
<ul>
<li>$ brew install Songmu/tap/peep</li>
</ul>
</div>
<div>
で install できます。</div>
<div>
<br /></div>
<div>
<br /></div>
<h4>
peep-mac: peep + terminal-notifier</h4>
<div>
peep を install すると peep-notify というコマンドも一緒に install されます。</div>
<div>
peep-notify コマンドは Slack に通知したり、macOS の notification center に通知したりできます。</div>
<div>
<br /></div>
<div>
ただ、notification center への通知は音が鳴らずにメッセージだけ表示されます。</div>
<div>
軽く読んでみたところ、peep-notify は内部で <a href="https://github.com/Songmu/peep/blob/v0.1.2/peepnotifier/mac_darwin.go#L6" target="_blank">gosx-notifier を使っていて</a>、<a href="https://github.com/Songmu/peep/blob/v0.1.2/peepnotifier/mac_darwin.go#L15-L18" target="_blank">Title と Messge のみ</a>設定されています。</div>
<div>
(なお、<a href="https://github.com/deckarep/gosx-notifier" target="_blank">gosx-notifier 自体は通知の音の設定もできる</a>ようです。)</div>
<div>
<br /></div>
<div>
peep 自体は pid を監視するコマンドなので、通知に必ずしも peep-notify を使う必要はありません。</div>
<div>
そこで、 macOS で音付きで通知できるものは無いかと探す事にしました。<br />
いくつか試したのですが、 <a href="https://github.com/julienXX/terminal-notifier" target="_blank">terminal-notifier</a> が良さそうです。<br />
<br /></div>
<div>
terminal-notifier は homebrew に取り込まれているので</div>
<div>
<ul>
<li>$ brew install terminal-notifier</li>
</ul>
</div>
<div>
で Install できます。</div>
<div>
<br /></div>
<div>
peep + terminal-notifier を使って <a href="https://github.com/atton/dot_files/blob/5e77c5c1a8a4d40b5a3abf2eacc617c47f8ec474/dot_files/.zprofile.mac#L37-L45" target="_blank">peep-mac</a> function を作ってみました。 zsh で動きます。</div>
<div>
<ul>
<li>$ peep-mac <PID></li>
</ul>
<div>
とすると、その pid のコマンド名を表示。</div>
<div>
その後、プロセス終了時に terminal-notifier で通知が生成されて "Glass" が鳴ります。便利。</div>
</div>
<div>
<br /></div>
<div>
<br /></div>
<h4>
peep-mac-tmux: peep + terminal-notifier + tmux</h4>
<div>
さて、peep-mac を作ったことで、長いプロセスの実行時、音が鳴るまで別の事ができるようになりました。</div>
<div>
しかし、 peep-mac を使っていて思ったのです。「pid 調べるのが面倒」と。</div>
<div>
<br /></div>
<div>
そこで作成したのが <a href="https://github.com/atton/dot_files/blob/5e77c5c1a8a4d40b5a3abf2eacc617c47f8ec474/dot_files/.zprofile.mac#L51-L62" target="_blank">peep-mac-tmux</a> function です。</div>
<div>
tmux 環境下 + 使い方次第では pid の指定をせずに peep-mac が動きます。<br />
<br /></div>
<div>
具体的には</div>
<div>
<ul>
<li>長いプロセスが実行中の window に pane を追加。</li>
<li>追加した pane 上で peep-mac-tmux を実行。</li>
</ul>
<div>
すると良いです。ここまで来ると完全に自分専用感もありますね。</div>
</div>
<div>
<br /></div>
<div>
peep-mac-tmux の実装に関しては</div>
<div>
<ul>
<li>pane は 2 つであること</li>
<ul>
<li>長い process を実行している pane と</li>
<li>それをこれから監視しようとする pane</li>
</ul>
<li>active な pane を tmux list-panes から特定する</li>
<li>そこで実行されている zsh の pid を取得</li>
<li>ps -o <ZSH_PID> で zsh が parent になっている process 一覧を取得</li>
<li>pid を sort -r して、一番上のものを peep-mac に投げる</li>
</ul>
<div>
みたいな感じです。大体良い感じに peep してくれます。</div>
</div>
<div>
<br /></div>
<div>
ただ、sort -r で監視対象の pid 取得をするので、pidが 一巡してる時には、上手く指定できない事も。</div>
<div>
そういう事態はあまり発生しないので、現状はこの実装で運用してます。何か良い解決策無いかな。</div>
<div>
<br /></div>
<div>
と、いうことで、『実行時間長いから終わったら呼んで』みたいな事ができるので便利、みたいなお話でした。</div>
<div>
<br />
<br /></div>
<h4>
参考</h4>
<div>
<ul>
<li><a href="https://songmu.jp/riji/entry/2019-01-01-peep.html" target="_blank">実行中のプロセスの終了を検知して通知をするpeepというのを作った | おそらくはそれさえも平凡な日々</a></li>
<li><a href="https://github.com/Songmu/peep" target="_blank">GitHub - Songmu/peep: Watch a process and execute specified command for notification when finished</a></li>
<li><a href="https://github.com/deckarep/gosx-notifier" target="_blank">GitHub - deckarep/gosx-notifier: gosx-notifier is a Go framework for sending desktop notifications to OSX 10.8 or higher</a></li>
<li><a href="https://github.com/julienXX/terminal-notifier" target="_blank">GitHub - julienXX/terminal-notifier: Send User Notifications on macOS from the command-line.</a></li>
<li><a href="https://github.com/tmux/tmux" target="_blank">GitHub - tmux/tmux: tmux source code</a></li>
<li>man tmux</li>
</ul>
</div>
attonhttp://www.blogger.com/profile/08720809750045983794noreply@blogger.com0tag:blogger.com,1999:blog-7192101599613841570.post-16974767845315741492019-10-20T08:17:00.000+09:002019-10-20T08:17:05.231+09:00DefaultKeyBinding.dict を編集して ^; を入力しても beep が鳴らないようにする私が作業する時は Terminal.app + tmux + neovim の時が多いです。<br />
beep 音はあまり鳴って欲しくないので neovim と Terminal の beep setting は全て off 。<br />
それでも稀に beep 音が鳴ってしまう。しかし、稀すぎて再現できず。<br />
が、最近再現できたので、それに対処したログを残しておきます。<br />
<br />
<br />
<h4>
環境</h4>
<div>
<ul>
<li>OS: macOS Mojave 10.14.6</li>
</ul>
<div>
<br /></div>
</div>
<div>
<br /></div>
<h4>
beep が鳴る原因</h4>
<div>
『^;(control + ';')』を入力した際に beep が鳴ることを見付けました。</div>
<div>
Terminal.app に限らず Safari といった他の Application でも鳴るので、macOS 側の設定のようです。</div>
<div>
<br /></div>
<div>
<br /></div>
<h4>
対応: DefaultKeybinding.dict</h4>
<div>
OSX 時代から DefaultKeybinding.dict という物があって、それで keymap を設定できるようです。<br />
参考のリンクで一番古いのは<a href="https://zariganitosh.hatenablog.jp/entry/20101026/text_key_binding" target="_blank">2010年とか</a>。そのくらい前から存在しているらしい。<br />
最終的には ~/Library/KeyBindings/DefaultKeyBinding.dict に<br />
<div>
<br /></div>
<script src="https://gist.github.com/atton/fda2d8e14f37a5e25ceb0e210b784418.js"></script>
だけ記述。<br />
一度 Application を落として ^; を入力しても何も鳴らない。よし。<br />
<br />
<br />
<h4>
寄り道</h4>
<div>
<ul>
<li>'noop:' を設定してはダメなのか</li>
<ul>
<li>設定してみたこともあります。が、どうも『noop: だから beep が鳴る』みたいです。</li>
<li>DefaultKeyBinding.dict 自体始めて触るので、まず map ができているか怪しかった。</li>
<li>一度「<a href="http://xahlee.info/kbd/osx_keybinding.html" target="_blank">特定の文字を insert する</a>」ように map して、DefaultKeyBinding.dict が有効な事を確認。</li>
<li>それから「空の文字列を insert する」ことで beep を抑えている状態です。</li>
</ul>
<li>他の組み合せでは beep は鳴らないのか</li>
<ul>
<li>'noop:' の物は基本鳴ります。</li>
<li>なので control + 記号 とかは beep 祭りです。</li>
<li>全組み合せを設定しても良いのですが、特に鳴りまくる物を見付けたら設定していこうかと。</li>
<li>Keyboard 側の Setting でそもそも beep が鳴らないようにするのがベストな気がします。</li>
<ul>
<li>が、Input Method "ASCII" には 設定項目が存在せず、 AquaSKK にも無い。</li>
</ul>
<li>ので keymap でアドホックに回避してる状態です。</li>
</ul>
<li>macOS 側の KeyBinding と衝突した場合はどうなるのか</li>
<ul>
<li>macOS 側の設定が優先されました。</li>
</ul>
<li><a href="https://zariganitosh.hatenablog.jp/entry/20101026/text_key_binding" target="_blank">system-wide の key binding</a> とか参考にならなかったのか</li>
<ul>
<li>/System/Library/Frameworks/AppKit.framework/Resources/StandardKeyBinding.dict ですね。</li>
<li>Property List Editor で開けると記述されているが、そんな Application は存在せず。</li>
<li>.plist を開ける XCode で開こうと試す。</li>
<li>追加コンポーネントをダウンロードし始めたので、開けるかも、と期待。</li>
<li>で、ダウンロードしても開けず。えー。</li>
</ul>
<li>最終的に<a href="https://github.com/atton/dot_files/tree/b52ca15301f36e9df211f48ee5a12d513db98986" target="_blank">私自身の dot_files に入れる</a>ことにしました。</li>
<ul>
<li>.config/nvim/init.vim といったファイルは symlink で設定を配置しています。</li>
<li>が、DefaultKeyBinding.dict は symlink を follow してくれない。</li>
<li>ので cp することで対応しています。</li>
</ul>
</ul>
</div>
<br /></div>
<div>
<br /></div>
<h4>
参考</h4>
<div>
<ul>
<li><a href="https://github.com/adobe/brackets/issues/2419#issuecomment-186619537" target="_blank">Mac: Bonk/beep sound when pressing CMD-Ctrl-Down in an editor · Issue #2419 · adobe/brackets · GitHub</a></li>
<li><a href="https://qiita.com/See_Ku/items/4bd8cfc6a7c4266f9bb6" target="_blank">DefaultKeyBinding.dictを使って、macOSのキーバインドを変更 - Qiita</a></li>
<li><a href="https://zariganitosh.hatenablog.jp/entry/20101026/text_key_binding" target="_blank">テキスト編集のキー操作を自在にコントロールする - ザリガニが見ていた...。</a></li>
<li><a href="https://eastmanreference.com/complete-list-of-applescript-key-codes" target="_blank">Complete list of Applescript key codes</a></li>
<li><a href="http://xahlee.info/kbd/osx_keybinding.html" target="_blank">Mac: How to Change Keybinding</a></li>
</ul>
</div>
attonhttp://www.blogger.com/profile/08720809750045983794noreply@blogger.com0tag:blogger.com,1999:blog-7192101599613841570.post-8112176736143049722019-10-12T12:50:00.000+09:002019-10-12T12:50:38.038+09:00.dockerignore を記述して Docker の image build を高速化するdocker image の build が作業をする毎に重くなる時があります。<br />
今回のケースはカレントディレクトリのサイズが作業ごとに大きくなっていく場合。<br />
その場合は .dockerignore を記述することで解決できます。<br />
<br />
<br />
<h4>
環境</h4>
<div>
<ul>
<li>OS: macOS Mojave 10.14.6</li>
<li>Docker: version 19.03.2, build 6a30dfc</li>
</ul>
<div>
<br /></div>
</div>
<div>
<br /></div>
<h4>
具体例</h4>
<div>
例えば、以下のように image の build を実行したとします。</div>
<div>
<ul>
<li>$ docker build -t hoge .</li>
</ul>
<div>
その際、`Sending build context to Docker daemon ...` と長く表示されることがあります。</div>
</div>
<div>
<br /></div>
<div>
Docker は image の build 時、指定された directory (今回は ".") のファイルを serialize して daemon に送ります。</div>
<div>
このコマンドだと . のサイズが大きいと送信に時間がかかってしまいます。</div>
<div>
<br /></div>
<div>
確かこの時の curerent directory のサイズは2GB程度で、ビルド時間は 100 秒ほどでした。</div>
<div>
<br /></div>
<div>
<br /></div>
<h4>
.dockerignore を記述する</h4>
<div>
.gitignore のように .dockerignore を directory に配置します。</div>
<div>
そして build に関係無いファイルを .dockerignore に記述すると、daemon に送る context から外すことが可能です。</div>
<div>
例えば .git など、 docker image に含めることは無さそうなファイルやディレクトリを記述します。</div>
<div>
また、git clean などで不要なファイルを<a href="https://attonblog.blogspot.com/2019/09/git-clean.html" target="_blank">消してしまう</a>のも選択肢に入ります。</div>
<div>
<br /></div>
<div>
私の例では.dokerignore を記述した結果 context のサイズが 100MB 以下になり、ビルド時間も20秒以下になりました。</div>
<div>
めでたしめでたし。</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<h4>
参考</h4>
<div>
<ul>
<li><a href="https://docs.docker.com/engine/reference/builder/#dockerignore-file" target="_blank">| Docker Documentation</a></li>
<li><a href="https://qiita.com/xyx/items/67842fbf3a25a996c2a0#%E9%81%85%E3%81%84%E8%A6%81%E5%9B%A0-%E5%B7%A8%E5%A4%A7%E3%81%AAbuild-context" target="_blank">Docker利用時に短ターンアラウンドタイムでデバッグする方法 - Qiita</a></li>
<li><a href="https://qiita.com/munisystem/items/b0f08b28e8cc26132212" target="_blank">.dockerignore アンチパターン - Qiita</a></li>
</ul>
</div>
attonhttp://www.blogger.com/profile/08720809750045983794noreply@blogger.com0tag:blogger.com,1999:blog-7192101599613841570.post-10101260632772821252019-10-06T12:06:00.000+09:002019-10-06T12:06:58.832+09:00q を使って CSV ファイルに SQL を発行する"<a href="https://github.com/harelba/q" target="_blank">q</a>" という、CSV や TSV に SQL をに発行できるコマンドがあります。<br />
便利なのですが、名前がググりづらいことこの上無い感じですね。<br />
<br />
<br />
<h4>
環境</h4>
<div>
<ul>
<li>OS: macOS Mojave 10.14.6</li>
<li>Homebrew: 2.1.12-8-gfd9a09e</li>
<ul>
<li>homebrew-core: (git revision 5b99; last commit 2019-10-05)</li>
</ul>
<li>q: 1.7.4</li>
</ul>
</div>
<br />
<br />
<h4>
インストール方法</h4>
<div>
Homebrew で <a href="https://github.com/Homebrew/homebrew-core/blob/5b99558fc0f77b7e578ef39e016a3390ea3416c4/Formula/q.rb" target="_blank">fomula が用意されている</a>ので</div>
<div>
<ul>
<li>$ brew install q</li>
</ul>
</div>
でインストールできます。<br />
<br />
<br />
<h4>
実行例</h4>
<div>
例えば、以下のような "servant.csv" があったとして</div>
<script src="https://gist.github.com/atton/75604af73ad5b738b08f71cf30add355.js"></script>
<br />
<div>
<br /></div>
<div>
以下のように SQL が発行できます。<br />
<ul>
<li>select</li>
<ul>
<li>$ q -d, -H 'select * from servant.csv ;'</li>
<ul>
<li>1,Altria Pendragon,saver,5</li>
<li>2,Altria Pendragon (alter),saver,4</li>
<li>3,Altria Pendragon,archer,5</li>
<li>4,Altria Pendragon,lancer,5</li>
<li>5,Altria Pendragon (alter),lancer,4</li>
</ul>
</ul>
<li>count</li>
<ul>
<li>$ q -d, -H 'select count(*) from servant.csv ;'</li>
<ul>
<li>5</li>
</ul>
</ul>
<li>limit</li>
<ul>
<li>$ q -d, -H 'select * from servant.csv limit 2;'</li>
<ul>
<li> 1,Altria Pendragon,saver,5</li>
<li> 2,Altria Pendragon (alter),saver,4</li>
</ul>
</ul>
<li>distinct</li>
<ul>
<li>$ q -d, -H 'select distinct(name) from servant.csv ;'</li>
<ul>
<li> Altria Pendragon</li>
<li> Altria Pendragon (alter)</li>
</ul>
</ul>
<li>where</li>
<ul>
<li> $ q -d, -H 'select id,name,class from servant.csv where rarity = 5;'</li>
<ul>
<li> 1,Altria Pendragon,saver</li>
<li> 3,Altria Pendragon,archer</li>
<li> 4,Altria Pendragon,lancer</li>
</ul>
</ul>
<li>order </li>
<ul>
<li>$ q -d, -H 'select * from servant.csv order by rarity;'</li>
<ul>
<li> 2,Altria Pendragon (alter),saver,4</li>
<li> 5,Altria Pendragon (alter),lancer,4</li>
<li> 1,Altria Pendragon,saver,5</li>
<li> 3,Altria Pendragon,archer,5</li>
<li> 4,Altria Pendragon,lancer,5</li>
</ul>
</ul>
<li>distinct + count</li>
<ul>
<li> $ q -d, -H 'select count(distinct(name)) from servant.csv ;'</li>
<ul>
<li> 2</li>
</ul>
</ul>
</ul>
<div>
なお、付けているオプションは<br />
<ul>
<li>-d (--delimiter) 今回は csv なので ',' が delimiter です。</li>
<li>-H (--skip-header) 今回は一行目に header があるので、それは値としてみなしません。</li>
<ul>
<li>と、いうことは header が無い場合も想定していると思われます(やったこと無し)。</li>
</ul>
</ul>
<div>
です。--help は貴重な情報源。<br />
<br />
<br />
<h4>
まとめ</h4>
<div>
と、いう感じで、"q" を使うと CSV を色々いじったりできて便利です。</div>
ちなみに、 Office で開くと重かったり止まったりするサイズの csv でも捌いてくれます。つよい。</div>
</div>
<div>
<br />
<br /></div>
</div>
<h4>
参考</h4>
<div>
<ul>
<li><a href="https://github.com/harelba/q" target="_blank">GitHub - harelba/q: q - Run SQL directly on CSV or TSV files</a></li>
<li><a href="https://github.com/Homebrew/homebrew-core/blob/5b99558fc0f77b7e578ef39e016a3390ea3416c4/Formula/q.rb" target="_blank">homebrew-core/q.rb at 5b99558fc0f77b7e578ef39e016a3390ea3416c4 · Homebrew/homebrew-core · GitHub </a></li>
</ul>
</div>
attonhttp://www.blogger.com/profile/08720809750045983794noreply@blogger.com0tag:blogger.com,1999:blog-7192101599613841570.post-17962402461741309522019-09-21T13:51:00.000+09:002019-09-21T13:51:08.852+09:00git clean を使って untracked なファイルを削除するMercurial には <a href="https://www.mercurial-scm.org/wiki/PurgeExtension" target="_blank">hg purge</a> というコマンドがあって、 hg で control していないファイルを一括削除できます。<br />
具体的には add してないファイルとか、.c から作った .o とか、間違って作った Rails の migration とか。<br />
それを Git でもできないかなー、と調べたメモ。<br />
<br />
<br />
<h4>
環境</h4>
<div>
<ul>
<li>OS: macOS Mojave 10.14.6</li>
<li>Git: 2.23.0</li>
</ul>
<div>
<br /></div>
</div>
<div>
<br /></div>
<h4>
git clean</h4>
<div>
hg purge のようなコマンドは Git にも default でも存在していて、<a href="https://stackoverflow.com/questions/18805842/git-equivalent-of-hg-purge" target="_blank">git clean だそうです。</a></div>
<div>
<br /></div>
<div>
untracked なファイルを消す際は</div>
<div>
<ul>
<li>$ git clean -fd</li>
</ul>
<div>
とかすると add してないファイルが消えます。</div>
</div>
<div>
<br /></div>
<div>
あとは、すぐに消すのではなく、消す対象が何かを教えてくれる -n (--dry-run) option が便利です。</div>
<div>
<ul>
<li>$ git clean -fdn</li>
</ul>
<div>
で削除対象一覧を出してくれます。ちなみに</div>
<div>
<ul>
<li>git clean -f -d -n</li>
</ul>
<div>
と書いても良いみたいです。</div>
</div>
<div>
<br /></div>
<div>
他には </div>
<div>
<ul>
<li>-X option: .gitignore で指定されたファイルのみを消す</li>
<ul>
<li>.o とかが消えてくれる。</li>
<li>あと untracked なファイルは消えない</li>
<li>新規にファイルを作った上で rebuild したい時に便利だよ、とのこと</li>
<ul>
<li>上で書いた 3つは全部 <a href="https://git-scm.com/docs/git-clean/2.23.0#Documentation/git-clean.txt--X" target="_blank">man git-clean の受け売り</a>。</li>
</ul>
</ul>
<li>-x option: .gitignore で指定されたファイルも削除対象 + untracked のファイルも削除対象</li>
<ul>
<li>かなり危険なので事前に dry-run を付けた方が良いです</li>
<li>git clean -fdx とかすると clone 直後くらい綺麗な状態になります</li>
</ul>
</ul>
</div>
</div>
<div>
とかですかね。<br />
さらに詳細を知りたい場合は <a href="https://git-scm.com/docs/git-clean/2.23.0#Documentation/git-clean.txt" target="_blank">man git-clean</a> を読んで頂ければ。</div>
<br />
<br />
<h4>
参考</h4>
<div>
<ul>
<li><a href="https://www.mercurial-scm.org/wiki/PurgeExtension" target="_blank">PurgeExtension - Mercurial</a></li>
<li><a href="https://stackoverflow.com/questions/18805842/git-equivalent-of-hg-purge" target="_blank">mercurial - Git equivalent of hg purge - Stack Overflow</a></li>
<li><a href="https://git-scm.com/docs/git-clean/2.23.0" target="_blank">man git-clean</a></li>
</ul>
</div>
attonhttp://www.blogger.com/profile/08720809750045983794noreply@blogger.com0tag:blogger.com,1999:blog-7192101599613841570.post-51537746489633627742019-09-16T09:13:00.000+09:002019-09-16T09:13:03.459+09:00Terminal.app を使って mac を sleep させるTerminal から mac を sleep させる方法無いかなー、と思ったのでそのメモ。<br />
<br />
<br />
<h4>
経緯</h4>
私は普段 MacBookPro + Display + Keyboard で作業をしています。<br />
この状態からそのまま MBP を閉じると clamshell mode になってしまいます。<br />
なので MBP を sleep -> MBP を閉める という流れで全体を sleep させています。<br />
MBP を sleep させるには Shift + Control + 電源ボタン の shortcut を使うことが多いです。<br />
<br />
しかし、たまに MBP を sleep させずに閉じてしまう時があります。<br />
外付け keyboard には電源ボタンが無い。ので sleep させられない。<br />
そのせいで一旦閉じた MBP を再度開いて sleep させて閉じる、とかやっていたのですがちょっと面倒。<br />
<br />
ということで、外付け Keyboard だけで clamshell mode の MBP を sleep させる方法た無いかな、と思って調べました。<br />
<br />
<br />
<h4>
環境</h4>
<div>
<ul>
<li>OS: macOS mojave 10.14.6 Version (18G95)</li>
</ul>
<div>
<br /></div>
</div>
<div>
<br /></div>
<h4>
コマンド</h4>
<div>
<ul>
<li>$ pmset sleepnow</li>
</ul>
<div>
で <a href="http://osxdaily.com/2012/07/22/sleep-a-mac-from-the-command-line/" target="_blank">sleep させることができます</a>。思ったより楽だった。</div>
</div>
<div>
<br /></div>
<div>
<br /></div>
attonhttp://www.blogger.com/profile/08720809750045983794noreply@blogger.com0tag:blogger.com,1999:blog-7192101599613841570.post-29016876132766750932019-09-01T12:08:00.000+09:002019-09-01T12:08:28.798+09:00neovim で plugin を利用せずに sudo を使うroot 権限が必要なファイルを neovim や vim で編集する事があると思います。<br />
その際、 sudoers で許可されているユーザならば<br />
<ul>
<li>:write ! sudo tee % > /dev/null</li>
</ul>
<div>
で sudo を使って root として書き込むことができます。<br />
<br /></div>
<div>
ですが、 neovim では</div>
<div>
<ul>
<li>:write ! sudo tee % > /dev/null</li>
<ul>
<li>sudo: no tty present and no askpass program specified</li>
<li>shell returned 1</li>
</ul>
</ul>
<div>
と言われて sudo が使えません。<br />
<br />
<br />
<h4>
解決策</h4>
以下のようなコマンドを定義することで対応できます。
<script src="https://gist.github.com/atton/db007474075b47f6917933cc2aee924a.js?file=sudo_write_current_buffer.vim"></script>
このコマンドは vim と neovim の両方で利用できます。<br />
<br /></div>
</div>
vim で利用する場合は ~/.vimrc に追記します。<br />
neovim で利用する場合は ~/.cofig/nvim/init.vim に追記します。<br />
<br />
<br />
<h4>
使い方</h4>
<div>
<ul>
<li>$ nvim /etc/hosts</li>
<ul>
<li>root 権限が必要なファイルを開いて編集します。保存の際は</li>
</ul>
<li>:SudoWriteCurrentBuffer</li>
<ul>
<li>を実行します。</li>
<li>パスワードを入力すれば root で書き込む事ができます。</li>
</ul>
</ul>
</div>
<div>
<br />
<br /></div>
<h4>
動作確認をした環境</h4>
<div>
大元の環境(vim と neovim で動作確認済)</div>
<div>
<ul>
<li>OS: macOS Mojave 10.14.6 (18G95)</li>
<li>Homebrew: 2.1.11</li>
<ul>
<li>Homebrew/homebrew-core: (git revision 883ee; last commit 2019-09-01)</li>
</ul>
<li>neovim: v0.3.8</li>
<li>vim: 8.0.1365</li>
<li>sudo: version 1.8.17p1</li>
<ul>
<li>Sudoers policy plugin version 1.8.17p1</li>
<li>Sudoers file grammar version 45</li>
<li>Sudoers I/O plugin version 1.8.17p1</li>
</ul>
<li>docker: 19.03.1, build 74b1e89<ul></ul>
</li>
</ul>
<div>
<br /></div>
<div>
docker を使っていくつかの distribution でも動作を確認</div>
<ul>
<li>Alpine linux: 3.10.2</li>
<ul>
<li>neovim: v0.3.7</li>
<li>vim: 8.1.1365</li>
<li>sudo: version 1.8.27</li>
<ul>
<li>Sudoers policy plugin version 1.8.27</li>
<li>Sudoers file grammar version 46</li>
<li>Sudoers I/O plugin version 1.8.27</li>
</ul>
</ul>
<li>CentOS: release 7.6.1810 (Core)</li>
<ul>
<li>vim: 7.4.1099</li>
<li>sudo: version 1.8.23</li>
<ul>
<li>Sudoers policy plugin version 1.8.23</li>
<li>Sudoers file grammar version 46</li>
<li>Sudoers I/O plugin version 1.8.23</li>
</ul>
</ul>
<li>Fedora: release 30</li>
<ul>
<li>vim: 8.1.1912</li>
<li>sudo: version 1.8.27</li>
<ul>
<li>Sudoers policy plugin version 1.8.27</li>
<li>Sudoers file grammar version 46</li>
<li>Sudoers I/O plugin version 1.8.27</li>
</ul>
</ul>
<li>Ubuntu: 18.04.3</li>
<ul>
<li>vim: 8.0.1453</li>
<li>sudo: version 1.8.21p2</li>
<ul>
<li>Sudoers policy plugin version 1.8.21p2</li>
<li>Sudoers file grammar version 46</li>
<li>Sudoers I/O plugin version 1.8.21p2</li>
</ul>
</ul>
<li>Debian: 10.0 (buster-20190812)</li>
<ul>
<li>vim: 8.1.1401</li>
<li>sudo: version 1.8.27</li>
<ul>
<li>Sudoers policy plugin version 1.8.27</li>
<li>Sudoers file grammar version 46</li>
<li>Sudoers I/O plugin version 1.8.27</li>
</ul>
</ul>
</ul>
<div>
<br /></div>
</div>
<div>
<br /></div>
<h4>
何故 neovim では sudo が使えないのか</h4>
<div>
ここから先は先程の Vimscript を作るに至った経緯を書きます。</div>
<div>
興味のある方はご覧ください。</div>
<div>
<br /></div>
<div>
まず sudo の error message</div>
<div>
<ul>
<li>sudo: no tty present and no askpass program specified</li>
</ul>
<div>
を見ると、 tty と askpass が無いと言っています。</div>
</div>
<div>
<br />
<br />
<h4>
tty と askpass</h4>
</div>
<div>
実際、vim では</div>
<div>
<ul>
<li>: ! tty</li>
<ul>
<li>/dev/ttys004 </li>
</ul>
</ul>
<div>
などが得られますが、 neovim では</div>
</div>
<div>
<ul>
<li>: ! tty</li>
<ul>
<li>not a tty</li>
<li>shell returned 1</li>
</ul>
</ul>
</div>
<div>
と言われてしまいます。</div>
<div>
<br />
askpass は使ったことが無いのですが、fedora の container で dnf search すると<br />
<script src="https://gist.github.com/atton/db007474075b47f6917933cc2aee924a.js?file=fedora-askpass.txt"></script>
の様に、いくつかの askpass が確認できます。のでちょっと試してみます。<br />
<ul>
<li> x11-ssh-askpass </li>
<script src="https://gist.github.com/atton/db007474075b47f6917933cc2aee924a.js?file=fedora-x11-ssh-askpass.txt"></script>
<li> openssh-askpass </li>
<script src="https://gist.github.com/atton/db007474075b47f6917933cc2aee924a.js?file=fedora-openssh-askpass.txt"></script>
<li> ksshaskpass </li>
<script src="https://gist.github.com/atton/db007474075b47f6917933cc2aee924a.js?file=fedora-ksshaskpass.txt"></script></ul>
</div>
という感じで全然起動してくれません。<br />
ですがエラーの内容的に display を開こうとしているのが分かります。<br />
なので、おそらく GUI で password を聞くような物だと思われます。<br />
<br />
<br />
<h4>
askpass を作る</h4>
<div>
askpass について調べていると、どうやら<br />
<ul>
<li>password を stdout に出力するもの</li>
</ul>
<div>
であることが<a href="https://t-cyrill.hatenablog.jp/entry/2018/02/09/205930" target="_blank">分かりました</a>。</div>
<div>
<br /></div>
<div>
よって</div>
<div>
<ul>
<li>neovim 内で password を取得</li>
<li>password を stdout に出力する</li>
<li>password の履歴はどこにも残さない</li>
</ul>
</div>
<div>
ようなものを作れば解決できそうです。</div>
<div>
<br /></div>
<div>
それで完成したのが /tmp/askpass を作るこの Vimscript です。<br />
<br /></div>
<div>
本当はファイル名は固定でなく tempfile 的な物で対応するなど、改善点はいくつも存在するかと思います。</div>
<div>
ですが私は Vimscript に明るくないので、"3つの条件を満たして動けばOK" という条件で作成しました。</div>
<div>
他により良い対応方法があればご指摘頂けると幸いです。</div>
</div>
<div>
<br /></div>
<div>
<br /></div>
<h4>
その他の解決策</h4>
<div>
<div>
調べた結果、 <a href="https://github.com/lambdalisue/suda.vim" target="_blank">suda.vim</a> というプラグインがあるようです。<br />
また、他にも <a href="https://github.com/vim-scripts/sudo.vim" target="_blank">sudo.vim</a> など、似たようなプラグインはいくつかあるらしいです。</div>
</div>
<div>
<br /></div>
<div>
これを使わなかった理由としては<br />
<ul>
<li>docker のコンテナ内で作業をする事が多々ある</li>
<li>init.vim を配置するスクリプトは既にある</li>
<li>plugin を install するスクリプトはまだ無い</li>
<li>全コンテナに plugin を入れるのも面倒だし結構サイズがある</li>
<ul>
<li>$ du -sh ~/.config/nvim/repos</li>
<ul>
<li>100M /Users/atton/.config/nvim/repos</li>
</ul>
</ul>
</ul>
</div>
<div>
などがあります。<br />
<br />
また、"sudo が使えるならこの際 root になってしまう" という解決策もあるのですが<br />
<ul>
<li>前述した理由の後半3つ</li>
<li>複数人数のユーザが使う環境だと、 /root 配下に自分専用の設定を置くことになる</li>
</ul>
</div>
<div>
のでこちらも無しで。<br />
<br />
他には、 "sudoers で NOPASSWD を設定する" という解決策もあります。<br />
が、sudo を no password でガンガン使えば実質 root で作業しているのと変わらず、危険すぎるのでこちらも無し。<br />
<br />
ということでこの Vimscript を書くに至った、という訳なのです。<br />
<br />
<br />
<h4>
おまけ: 環境変数の unlet</h4>
</div>
<div>
スクリプト内部では askpass の場所を示す SUDO_ASKPASS を設定している部分があります。<br />
具体的には</div>
<div>
<ul>
<li>let $SUDO_ASKPASS = s:askpass_path</li>
</ul>
<div>
ですね。<br />
<br />
この環境変数を定義していると、 sudo -A した際に指定したファイルが実行されます。</div>
</div>
<div>
一応、 :SudoWriteCurrentBuffer の実行後にはなるべく元の環境に戻すために</div>
<div>
<ul>
<li>unlet $SUDO_ASKPASS</li>
</ul>
<div>
を書いていた時もありました。<br />
<br />
ですが動作確認中、 Vim 8.0.1365 で unlet 時にエラーが出てしまいました。</div>
</div>
<div>
また 、-A を指定しなければ sudo の動作は変わらないので 、残っていても無害と判断して unlet しない形になりました。</div>
<div>
<br /></div>
<div>
<br /></div>
<h4>
おまけ: shebang を指定しないとどうなるのか</h4>
<div>
ちなみに askpass の shebang を消すと</div>
<div>
<ul>
<li>sudo: unable to run /tmp/askpass: Exec format error</li>
<li>sudo: no password was provided</li>
</ul>
</div>
<div>
と言われる為、きちんと書いておく必要があります。<br />
<br />
<br />
<h4>
おまけ: x flag を付けないとどうなるのか</h4>
setfperm(s:askpass_path, "rwxr-xr-x") をせずに 644 のままだと<br />
<ul>
<li>sudo: unable to run /tmp/askpass: Permission denied</li>
<ul></ul>
<li>sudo: no password was provided</li>
</ul>
<div>
と言われるので、こちらもきちんと指定しておく必要があります。</div>
<br />
<br /></div>
<h4>
参考</h4>
<div>
<ul>
<li><a href="https://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x721.html" target="_blank">Checking the Current TTY</a></li>
<li><a href="https://github.com/neovim/neovim/issues/8527" target="_blank">sudo: no tty present and no askpass program specified · Issue #8527 · neovim/neovim · GitHub</a></li>
<li><a href="https://github.com/lambdalisue/suda.vim" target="_blank">GitHub - lambdalisue/suda.vim: An alternative sudo.vim for Vim and Neovim, limited support sudo in Windows</a></li>
<li><a href="https://github.com/vim-scripts/sudo.vim" target="_blank">GitHub - vim-scripts/sudo.vim: Allows one to edit a file with prevledges from an unprivledged session.</a></li>
<li><a href="https://t-cyrill.hatenablog.jp/entry/2018/02/09/205930" target="_blank">askpassのことを書いておく - なんかかきたい</a></li>
<li>man sudo</li>
<li>neovim :help</li>
<li><a href="https://vim.fandom.com/wiki/User_input_from_a_script" target="_blank">User input from a script | Vim Tips Wiki | FANDOM powered by Wikia</a></li>
<li><a href="http://vimdoc.sourceforge.net/htmldoc/eval.html#input" target="_blank">Vim documentation: eval</a></li>
</ul>
</div>
attonhttp://www.blogger.com/profile/08720809750045983794noreply@blogger.com0tag:blogger.com,1999:blog-7192101599613841570.post-45653265509170846982019-08-29T13:39:00.000+09:002019-08-29T13:44:55.159+09:00tmux 2.9a の window 分割線を ascii character にする<a href="https://github.com/tmux/tmux/releases/tag/2.9a" target="_blank">2019/05/01 に tmux 2.9a がリリースされていました</a>。<br />
<div>
残念ながら 2.9 は見逃がしてしまいました。<br />
<div>
<div>
ということで恒例の分割線を EastAsianAmbiguous から ascii の線に変更するバージョンを作成。</div>
</div>
<div>
<a href="https://attonblog.blogspot.com/2018/10/tmux-2-8.html" target="_blank">2.8の時</a>とか<a href="https://attonblog.blogspot.com/2018/04/tmux-27.html" target="_blank">2.7 の時</a>とかの作業履歴とかもまとめてあります。<br />
<div>
<div style="margin: 0px;">
そもそもどういう問題なのかは<a href="https://attonblog.blogspot.com/2017/11/tmux-pull-request.html" target="_blank">この記事</a>で。</div>
<div style="margin: 0px;">
<br /></div>
<div style="margin: 0px;">
<br /></div>
<h4>
環境</h4>
</div>
</div>
</div>
<div>
<ul>
<li>OS: macOS mojave 10.14.6 (18G95)</li>
<li>tmux: <a href="https://github.com/atton/tmux/tree/2.9a-border-ascii" target="_blank">2.9a-border-ascii</a> ( f976aed943f322a3652f51846b0fe472534ab6d6 )</li>
<li>Homebrew: 2.1.11</li>
<li>Homebrew/homebrew-core: (git revision 269c; last commit 2019-08-29)</li>
<li>Font: Ricty: 3.2.2(no option)</li>
</ul>
<div>
<br /></div>
</div>
<div>
<br /></div>
<h4>
作業</h4>
<div>
今回も割とあっさりできました。cherry-pick して tag 更新して終わり。</div>
<div>
<ul>
<li>$ git pull upstream</li>
<li>$ git checkout 2.9a</li>
<li>$ git cherry-pick border-ascii</li>
<li>$ git checkout -b 2.9a-border-ascii</li>
</ul>
<div>
<div style="margin: 0px;">
make できるかの確認は</div>
<ul>
<li>$ sh autogen.sh</li>
<li>$ ./configure </li>
<li>$ make</li>
</ul>
<div>
<div style="margin: 0px;">
で。</div>
<div style="margin: 0px;">
<br /></div>
<div style="margin: 0px;">
ちなみに brew edit tmux して本家のビルド手順を参考にしてます。</div>
<div style="margin: 0px;">
あと、 dependencies から utf8proc が消えて ncurses が追加。</div>
<div style="margin: 0px;">
<br /></div>
</div>
<div>
<div style="margin: 0px;">
make すると current directory に tmux command ができるので、動作確認も可能。</div>
</div>
<div>
<ul>
<li>$ ./tmux -V</li>
<ul>
<li>tmux 2.9a</li>
</ul>
<li>$ ./tmux</li>
<ul>
<li>border-ascii 版の tmux が起動します。</li>
</ul>
</ul>
<div>
<div style="margin: 0px;">
あとは<a href="https://github.com/atton/homebrew-customs/commit/fb6462b3480af9a227d82b8c86ab721270e1c427" target="_blank">自分用の tap に反映</a>しておしまい。</div>
</div>
</div>
<div>
<div style="margin: 0px;">
<br /></div>
</div>
<div>
<div style="margin: 0px;">
<br /></div>
</div>
<h4>
インストール方法</h4>
<div>
<div style="margin: 0px;">
1からインストールする場合のコマンドは</div>
</div>
<div>
<ul>
<li>$ brew install --HEAD atton/customs/tmux</li>
</ul>
<div>
<div style="margin: 0px;">
でいけます。</div>
<div style="margin: 0px;">
必要あらば自動で atton/cusoms を tap してくれるようになってました。便利。</div>
</div>
</div>
</div>
</div>
attonhttp://www.blogger.com/profile/08720809750045983794noreply@blogger.com0tag:blogger.com,1999:blog-7192101599613841570.post-32970255869207927812019-08-20T21:09:00.001+09:002019-08-20T21:09:24.427+09:00hub コマンドの user 設定を変更する<a href="https://hub.github.com/">hub</a> というコマンドがあります。<br />
GitHub に関連したコマンドが追加された git の wrapper です。<br />
例えば<br />
<ul>
<li>$ hub clone neovim/neovim</li>
</ul>
<div>
とすると</div>
<div>
<ul>
<li>$ git clone git@github.com:neovim/neovim.git</li>
</ul>
<div>
相当の事をしてくれます。</div>
</div>
<div>
git の wrapper になってるので、 hub だけで全てを済ませる派の人がいるかもしれません。</div>
<div>
<br /></div>
<div>
<br /></div>
<h4>
環境</h4>
<div>
<ul>
<li>OS: macOS Mojave 10.14.6</li>
<li>Homebrew: 2.1.10</li>
<li>Homebrew/homebrew-core: (git revision ea34; last commit 2019-08-20)</li>
<li>hub: version 2.12.3</li>
<li>git: version 2.23.0</li>
</ul>
<div>
<br /></div>
</div>
<div>
<br /></div>
<h4>
設定を変更するきっかけ</h4>
<div>
<ul>
<li>$ hub browse tmux/tmux</li>
<ul>
<li>とすると <a href="https://github.com/tmux/tmux">tmux/tmux</a> をブラウザで開いてくれます。</li>
</ul>
<li>$ hub browse hoge</li>
<ul>
<li>とすると atton-/hoge が開かれました。</li>
<li>私の GitHub Account は 'atton-' で取得して <a href="https://attonblog.blogspot.com/2017/08/github-name-atton.html">'atton' に変更した経緯があります</a>。</li>
<li>なのでどこかに古い設定が残っている筈。</li>
</ul>
<li>$ git config --list</li>
<ul>
<li>で git の設定を確認しても 'atton-' は存在しない。</li>
<li>むしろ github.user=atton になってるくらい。</li>
<li>hub が git の wrapper になってる事のデメリットがちょっとあって</li>
</ul>
<li>$ hub config --list</li>
<ul>
<li>としても git config --list の時と同じ内容が出てくる。</li>
<li>つまり hub 経由で config を update しても git の config が変更されそう。</li>
</ul>
</ul>
<div>
ということで 'atton-' を設定している部分を探してみる。</div>
</div>
<div>
<br /></div>
<div>
<br /></div>
<h4>
設定箇所探し + 設定</h4>
<div>
<ul>
<li>$ hub --help</li>
<ul>
<li>hub と git の help が出る</li>
<li>hub 部分に config とか setting とかの項目は無い</li>
</ul>
<li>$ man hub</li>
<ul>
<li>config で search する<a href="https://github.com/github/hub/blob/1787dd9de10f7de819b80cfa1af36a0ed5ccb4a0/share/man/man1/hub.1.md#configuration">とありました</a>。 </li>
<li>どうやら $HOME/.config/hub に書かれているようです。</li>
<li>編集すると 'user: atton-' になっていたので 'user: atton' に修正。</li>
</ul>
<li>$ hub browse dot_files</li>
<ul>
<li>とかすると<a href="https://github.com/atton/dot_files">私の dot_files が開かれる</a>ようになりました。良し良し。</li>
</ul>
</ul>
<div>
<br /></div>
</div>
<div>
<br /></div>
<h4>
おまけ</h4>
<div>
ちなみに私が良く使うコマンドは</div>
<div>
<ul>
<li>$ hub browse</li>
</ul>
<div>
です。</div>
<div>
current directory の repository の github ページがブラウザで開きます。</div>
</div>
<div>
あとは hub clone くらい……?<br />
<br /></div>
<div>
実際 hub をあまり使わないのは</div>
<div>
<ul>
<li>hub が無い環境で作業することもある</li>
<li>wrapper が隠してくれているオプションとかに「気付かずに助けられている」のは勘弁</li>
</ul>
<div>
とかの理由があります。<br />
<br /></div>
<div>
なので、個人的にはなるべく git を使うようにしています。</div>
</div>
<div>
もちろん hub の方が便利な時は hub を使います。</div>
attonhttp://www.blogger.com/profile/08720809750045983794noreply@blogger.com0tag:blogger.com,1999:blog-7192101599613841570.post-7565003167378810722019-08-13T21:54:00.000+09:002019-08-13T21:56:26.259+09:00nodenv を使って複数のバージョンの Node.js を管理するプロジェクト毎に指定の Node.js のバージョンがあったり、常に最新の Node.js を使いたかったりすると、Homebrew だけで管理するのは面倒になってきます。<br />
<br />
今回は nodenv を使って Node.js の環境を作ろうと思います。<br />
ちなみに私は Ruby では rvm より rbenv 派。<br />
なので nvm よりは nodenv かな、と。<br />
<br />
<h4>
環境</h4>
<div>
<ul>
<li>OS: macOS Mojave 10.14.6</li>
<li>zsh: 5.7.1</li>
<li>Homebrew: 2.1.9</li>
<li>Homebrew/homebrew-core (git revision 2548c; last commit 2019-08-11)</li>
<li>nodenv: 1.3.0</li>
<li>node-build: 4.6.3</li>
</ul>
<div>
<br /></div>
</div>
<div>
<br /></div>
<h4>
インストール</h4>
<div>
<ul>
<li>$ brew install nodenv</li>
<li>$ nodenv init</li>
<ul>
<li>eval "$(nodenv init -)"</li>
<li>を .zshrc に追加せよ、と言ってきますので追記</li>
</ul>
<li>$ nodenv install 12.8.0</li>
<ul>
<li>とかで好きなバージョンを指定</li>
</ul>
<li>$ nodenv global 12.8.0</li>
<ul>
<li>とかで通常使用するバージョンを指定できます。</li>
</ul>
<li>$ nodenv local 12.7.0</li>
<ul>
<li>とかで特定ディレクトリの下で使用するバージョンを指定します。</li>
<li>具体的には .node-version というファイルが作られて、そこにバージョンが書かれる。</li>
</ul>
</ul>
<div>
<br /></div>
</div>
<div>
<br /></div>
<h4>
nodenv init をちょっと追ってみる</h4>
<div>
ちなみに zsh 上で</div>
<div>
<ul>
<li>$ nodenv init -</li>
</ul>
<div>
とすると</div>
</div>
<script src="https://gist.github.com/atton/b8a2fa9871bfe28eba2c47fdc9b9b3f5.js?file=nodenv.sh"></script>
<br />
<div>
<br /></div>
<div>
のような設定がされることが分かります。つまり、</div>
<div>
<ul>
<li>executables がある PATH を追加する</li>
<li>NODENV_SHELL の設定</li>
<li>補完スクリプトを source</li>
<li>nodenv rehash (executables の再配置)</li>
<li>nodenv の wrapper</li>
<ul>
<li>rehash と shell の両コマンドは特別扱い(eval する感じ)みたいですね</li>
<li>興味がある人はさらに読んでみても良いかと思います。</li>
</ul>
</ul>
<div>
<br /></div>
</div>
<h4>
nodenv init と shell 指定</h4>
<div>
rbenv を設定していた時に見つけたのですが、特定の shell であることを指定することもできます。</div>
<div>
具体的には $SHELL が zsh の状態でも</div>
<div>
<ul>
<li>$ nodenv init - bash</li>
</ul>
<div>
とすると</div>
</div>
<script src="https://gist.github.com/atton/b8a2fa9871bfe28eba2c47fdc9b9b3f5.js?file=nodenv-bash.sh"></script>
<br />
<div>
のような、bash 向けの設定が生成されます。<br />
nodenv init - zsh と具体的に違うのは NODENV_SHELL と補完スクリプトの場所くらい。<br />
zsh で bash の設定を読み込むなんてことはほぼ無いと思うので、 nodenv init - で問題無いと思います。<br />
<br />
<br />
<h4>
nodenv rehash</h4>
</div>
<div>
ちなみに zshrc に nodenv init - が記述される訳ですから、シェルを立ち上げる度に nodenv init - が実行されます。</div>
<div>
気持ち程度の問題だとは思いますが、 rehash を省略するオプションがあって</div>
<div>
<ul>
<li>$ nodenv init - --no-rehash zsh</li>
</ul>
<div>
<div>
とすると nodenv rehash が実行されません。</div>
<script src="https://gist.github.com/atton/b8a2fa9871bfe28eba2c47fdc9b9b3f5.js?file=nodenv-no-rehash-zsh.sh"></script>
<br />
<div>
とはいえ普通はこのオプションのある無しで実行時間はほとんど変わらないです。</div>
<div>
大量に package を入れたバージョンから新バージョンに上がった直後とかなら rehash にコストがかかるかも? 程度<br />
<br />
とりあえず、私は <a href="https://github.com/atton/dot_files/blob/c6bb4524abdaf4470808ae3dbfad0a8fda34ee69/dot_files/.zprofile#L140">.zprofile には rehash 無し</a>の init script を書いてます。</div>
<div>
それで、npm install -g とかしたら手で nodenv rehash を打つ、という運用をしています。</div>
</div>
</div>
attonhttp://www.blogger.com/profile/08720809750045983794noreply@blogger.com0tag:blogger.com,1999:blog-7192101599613841570.post-40376123924408620292019-06-03T16:06:00.002+09:002019-06-03T16:07:40.084+09:00utf8proc が 2.3 から East Asian Ambiguous の文字幅を 2 と判定するようになったHomebrew でインストールできる <a href="https://github.com/Homebrew/homebrew-core/blob/master/Formula/tmux.rb">tmux</a> は文字幅判定の方法をいくつか持っています。<br />
その中に utf8proc というソフトウェアに任せる、という方法があります。<br />
しかし、その utf8proc は East Asian Ambiguous の幅を固定で 1 にするよう実装していました。<br />
なので、自分用に patch を当てた <a href="https://attonblog.blogspot.com/2019/01/utf8proc-2-2-0.html">formula を作ったり</a>して対応していました。<br />
<br />
ですが、<a href="https://github.com/JuliaStrings/utf8proc/blob/master/NEWS.md#version-23">utf8proc 2.3</a> から East Asian Ambiguous を 2 と判定する用になりました。<br />
とりあえず自分が使っている patched 2.8 な tmux では問題無さそうなので公式の utf8proc を使うようにします。<br />
<br />
蛇足<br />
本当は LC_CTYPE を見て動的に判定する、という実装が理想っぽいですが流石にそこまではしてもらえないようです。<br />
<br />attonhttp://www.blogger.com/profile/08720809750045983794noreply@blogger.com0