なっく日報

技術やら生活やらのメモ

MacのVimでESCまたは<C-[>押した際に日本語入力をOFFにしたい(JISキーボード編)

自分向けのメモです。

MacVimあるいはターミナル上のVimでESCAPEまたは<C-[> を押した際に日本語入力をOFFにする方法です。

Karabiner-Elementsを使う

いろいろ調べましたがこれしかなさそう。

brew cask install karabiner-elements

でインストールします。

設定ファイル作成

qiita.com

の記事を参考にさせていただきました。

とてもわかり易くてGOOD!

ただし、JISキーボード使っている人やiTerm2使っている人だと動かないので注意が必要です。

自分の場合

~/.config/karabiner/assets/complex_modifications/FromEscapeToJapanese_eisuu.json

を以下の内容で作成しました。

{
  "title": "ESCまたは^[でIMEをOFF",
  "rules": [
    {
      "description": "VimでESCまたは^[を押したときにIMEをOFFにする",
      "manipulators": [
        {
          "type": "basic",
          "from": { "key_code": "escape", "modifiers": { "optional": [ "any" ] } },
          "to": [ { "key_code": "lang2" }, { "key_code": "escape" } ],
          "conditions": [ { "type": "frontmost_application_if", "bundle_identifiers": [
            "^com\\.apple\\.Terminal$", "^org\\.vim\\.", "^com\\.googlecode\\.iterm2$" ] } ]
        },
        {
          "type": "basic",
          "from": { "key_code": "close_bracket", "modifiers": { "mandatory": ["left_control"] } },
          "to": [ { "key_code": "lang2" }, { "key_code": "escape" } ],
          "conditions": [ { "type": "frontmost_application_if", "bundle_identifiers": [
            "^com\\.apple\\.Terminal$", "^org\\.vim\\.", "^com\\.googlecode\\.iterm2$" ] } ]
        }
      ]
    }
  ]
}

あとは、PreferencesのComplex ModificationsからAdd ruleするだけです。

ハマりどころ

Karabiner-ElementsのPreferencesより、Virtual Keyboardを45にしないと入力が変になります(USキーボード扱いされている?)

忘れずに変更しておきましょう。

最後に

なお、GitHubにも設定ファイル上げておきました。

https://github.com/yukidarake/dotfiles/blob/master/.config/karabiner/assets/complex_modifications/FromEscapeToJapanese_eisuu.json

CSVファイルの特定の列を空文字にするコマンド

c0,c1,c2,c3,c4
c0,c1,c2,c3,c4
c0,c1,c2,c3,c4
c0,c1,c2,c3,c4
c0,c1,c2,c3,c4

の列の数を変えずにc1だけ消して、↓のようにするにはどうするか?

c0,,c2,c3,c4
c0,,c2,c3,c4
c0,,c2,c3,c4
c0,,c2,c3,c4
c0,,c2,c3,c4

cutコマンドを使うと

cut -d, -f 1,3- a.csv

c0,c2,c3,c4
c0,c2,c3,c4
c0,c2,c3,c4
c0,c2,c3,c4
c0,c2,c3,c4

cutだけに列自体消えてしまいます。

自分が思いついた方法はこう

perl -F, -lape '$F[1]="";$_=join(",",@F)' a.csv

結果、↓のようになります。

c0,,c2,c3,c4
c0,,c2,c3,c4
c0,,c2,c3,c4
c0,,c2,c3,c4
c0,,c2,c3,c4

awkでもいいかもですが一旦これで。

ちなみにperlのオプションは以下の通り

❯ perl -h

Usage: perl [switches] [--] [programfile] [arguments]
  -a                autosplit mode with -n or -p (splits $_ into @F)
  -e program        one line of program (several -e's allowed, omit programfile)
  -F/pattern/       split() pattern for -a switch (//'s are optional)
  -l[octal]         enable line ending processing, specifies line terminator
  -p                assume loop like -n but print line also, like sed

Digg Readerの代替RSS Reader

2018/03/26で愛用していたDigg Readerが終了してしまうとのこと。

で、使用感の似ている代わりのRSS Readerを探したのですが、なかなか見つからず。。

alternative.me

medium.com

らへんの記事を見たのですが、FeedlyとかInoreaderとかは使用感がちょっと合わず(思えば、Google Readerが終了した際にも試して、しっくりこないで諦めたのでした・・・)

で、もうこうなったら書かれているのをしらみつぶしに試していこうと思い、見ていった結果、移転先は・・・

theoldreader.com

になりました。

決め手は

  • スマホのブラウザで見られること(iPhoneChromeで見たい。アプリは嫌)
  • リスト表示に対応していること(サムネイルとかは不要。タイトルのみでいい)
  • できればキーボードショートカットに対応していること(たまにPCで見たときにいい)

らへん。今のところいい感じに使えています。

【オレオレ】ターミナル環境2017変更点

こんにちは!こんにちは!

2018年ですが、2017年に書きかけだった記事をアップしておきます。

昨年久々にターミナル上で、とあるシステムの開発をした際に得られた知見です。

※ リモートのLinuxサーバにSSHでアクセスして開発してました。普段は手元のPCでIntelliJJavaやらJavaScriptやらで開発しています。この時の言語はPHPだったのですが諸事情によりこのスタイルで開発せざるを得ず。。

大方針

極力設定が少ないモノを使う。さらに極力デフォルトの設定を使う。

シェル

相変わらずfish推しです。fish いいですよ fish。

Vim

Syntastic → ale

github.com

Asynchronous Lint Engine との略とのことで、シンタックスチェックが非同期でできます(SyntasticはLintのトリガーとして保存が必要でした)

Syntasticより快適。

NeoBundle → vim-plug

github.com

パッケージマネージャはよりシンプルなものに。

Unite.vim → fzf.vim

github.com

Unite.vimと機能的に同一ではないですが - プロジェクト内のファイルをファジーな感じで探す - 全ファイルの全行から単語検索 みたいな一番やりたいことは実現できるので乗り換えました。

vim-plug使い始めた+fishシェルに乗り換えてfzfを使い始めたという理由もあります(作者が同じ。fzfはpecoと同じようなツール)

The Silever Searcher(ag) → ripgrep(rg)

grepの代替ツールとして。

github.com

速いので乗り換えました。本当に速い。

fzf.vim との連携は

https://github.com/junegunn/fzf.vim#advanced-customization

公式に設定例があります。

その他

Tmuxも相変わらず使ってますが、2.5に上げると設定ファイルの書き方が変わっていて嵌りました。

https://github.com/tmux/tmux/issues/754#issuecomment-297452143

コチラ参考になりました。

急に動かなくなるので気をつけましょう。

まとめ

と、いろいろ書いてきましたが、IntelliJに一度慣れてしまった今、IntelliJの方が開発しやすいと思える身体になってしまいました。

言語や作るシステムの規模にもよりますが、ターミナル環境を整えたりバージョンアップに追従する時間のコストを考えると、 どうにもコスパが・・・

とはいえ、必要な場面もまだまだあるので、なるべくデフォルト設定に身体を最適化させる方針でちょいちょい整えていこうかと思います。

Windowsでシェルスクリプト書きたいときはShellJSが使える

久々のブログ更新となります。

シェルスクリプトWindows用に移植したい・・・という場面でShellJSが便利だったというお話です。

ShellJSとは?

github.com

ヤツです。

採用実績

YeomanとかZeptoとかJS界隈の有名どころで使われています。
GitHubスター数も5,835(2017/05/03現在)なので結構人気あるライブラリと言ってよいのではないでしょうか。 自分は ESLintで使われていて知りました。

何で必要になった?

当初JSファイルをcatして結合するだけの単純なスクリプトシェルスクリプトで書いてました(LinuxWindows(MSYS2)だけで動けばよい)
ところが、Windowsコマンドプロンプト使っている人が・・・
コマンドプロンプト用にバッチファイル書いて二重管理とかアレだなぁと思っていたところ、ふと存在を思い出しました。

イメージ

https://github.com/shelljs/shelljs の例そのままですが、↓のようなノリで書けます。

var shell = require('shelljs');

if (!shell.which('git')) {
  shell.echo('Sorry, this script requires git');
  shell.exit(1);
}

// Copy files to release dir
shell.rm('-rf', 'out/Release');
shell.cp('-R', 'stuff/', 'out/Release');

// Replace macros in each .js file
shell.cd('lib');
shell.ls('*.js').forEach(function (file) {
  shell.sed('-i', 'BUILD_VERSION', 'v0.1.2', file);
  shell.sed('-i', /^.*REMOVE_THIS_LINE.*$/, '', file);
  shell.sed('-i', /.*REPLACE_LINE_WITH_MACRO.*\n/, shell.cat('macro.js'), file);
});
shell.cd('..');

// Run external tool synchronously
if (shell.exec('git commit -am "Auto-commit"').code !== 0) {
  shell.echo('Error: Git commit failed');
  shell.exit(1);
}

自分の場合

catして結合したテキストをgrep -vして書き出すスクリプトがこう変わりました。

シェルスクリプト

cat src/*.js | grep -vE '^\s*//.+' > target/bundle.js

ShellJS版

npm install shelljs でインストールしておく。この辺のNode.jsの説明は省略。

const shell = require('shelljs');
shell.cat('src/*.js').grep('-v', '^\s*//.+').to('target/bundle.js');

パイプもいい感じに書けます。

まとめ

Windowsシェルスクリプトが書きたい→ShellJS お試しください。

fishシェルはじめました

これは(ターミナル開発環境のメンテに疲れた|zshの設定に挫折した)人向けにfishシェルをオススメする記事です。

自分がzshで手放せなかった機能達

  • プラグインマネージャ・・・zgenを使っていました
  • テーマ・・・pureというシンプルなテーマを使っていました
  • ディレクトリ移動・・・zで、一度cdしたディレクトリを記録して、次からはファジーな感じで移動できるようにしていました
  • 補完・・・zshの補完機能 + auto-fuで、いい感じに勝手に補完してくれるようにしていました
  • Ctrl + R で履歴検索・・・peco + 設定ファイルを書いて使っていました
  • Ctrl + Gでリポジトリにジャンプ・・・peco + ghq + 設定ファイルを書いて使っていました。

これらを、なるべく設定せずにfishシェルで使えるようにしてみます。

zshだと、この辺のツールの導入はちょっと手間ですが、fishなら瞬殺です!

もろもろインストール&開発環境構築

実は、以下3つのコマンドを打てば設定なしでも上記の機能が一通り動きます。

# fishシェルとfzfを入れる
brew install fish fzf
# プラグインマネージャのfishermanを入れる
curl -Lo ~/.config/fish/functions/fisher.fish --create-dirs git.io/fisher
# fishermanでもろもろプラグインを入れる
fisher install z fzf decors/fish-ghq rafaelrinaldi/pure

なんということでしょう。

これなら、休日の疲れた状態(今の私)でも問題なく環境構築できますね!

上記でインストールしたモノの補足

プラグインマネージャ

fishermanというfishシェル用のプラグインマネージャを入れました。

ちょっと前まではoh-my-fishがオススメという記事もありますが、最近はコチラを推奨している記事が多い気がします。

テーマ

https://github.com/fisherman とか oh-my-fish/Themes.md at master · oh-my-fish/oh-my-fish · GitHub を探せばいっぱいあります。

自分はzshのときと合わせてpureにしました。

ディレクトリ移動

zがfisherman公式リポジトリにあったので、そのまま入れました。

なお、後述しますが、zsh時代の設定に合わせるために、自分の場合は設定ファイルに2つほど記述を足しました。

set -U Z_CMD "j"
set -U Z_DATA "$HOME/.z/.z"

補完

補完系はfishのデフォルトで十分便利なので、auto-fuはやめました。

Ctrl + R で履歴検索

pecoにこだわりはなかったので、全く設定なしで動くという理由でpeco同等のfzfにしました。

fisher install fzfだけで使えるようになります。

Ctrl + Gでリポジトリを検索&ジャンプ

fisher install decors/fish-ghqだけで、使えるようになります。

その他補足

~/.zshrc的な設定ファイルは?

~/.config/fish/config.fish に設定します。

fishの文法がbash/zshと全然違う!

そうなんです。

ちょっと独特。

Shell Translation Dictionary · fish-shell/fish-shell Wiki · GitHub

bashの文法との対比表があるので、見比べながら書いたらよいかも。

↓設定に必要なものだけ書いておきます。

PATHの設定

export PATH=/usr/local/bin:$PATHをどうするか?ですが、

set -x PATH /usr/local/bin $PATHで大丈夫そう。

aliasの設定

alias rm='rm -i'alias rm 'rm -i'みたいな感じでいけます。

最終的な ~/.config/fish/config.fish

あってるか自信ないですが、いちおう動いたので、一旦これで。 https://github.com/yukidarake/dotfiles/blob/master/.config/fish/config.fish

あとがき

私は、これまでzsh + tmux + vimという感じで開発してきて、zshとかターミナル開発環境の知見をコツコツ蓄えてきました。

が、今はWindowsでジャヴァジャヴァしている関係でzshとかターミナル開発環境を整備する意欲がなくなってしまいました。

そんな折、Windows/MSYS2環境でbashが非力で辛いし、zshちゃんと動かんし、じゃあfishどうだろう?と導入してみたところ、えらく気に入ってしまったので、家のMacにも入れました。

この記事を読んでピンと来た人、ぜひ一度fishをお試しください。

(またconfig.fishの書き方に自信がないので、経験者の方、アドバイスあれば、ぜひ教えてください)

静的ファイルを配信する場合にはパスにバージョンを含めるのがいいんじゃなかろうか

最近、思っていることを。

なお、バージョンとは言ってますが、Gitのコミットハッシュ値でもUnixタイムスタンプでも何でもいいです

静的ファイル配信パターン

WEBアプリで静的ファイルを配信するパターンは以下3つあるんじゃないかとなんとなく思っています。

1. パスに特になにもつけない

<link rel="stylesheet" type="text/css" href="/static/css/hoge.css" />
<img src="/static/img/hoge.png" />
<script src="/static/js/hoge.js"></script>

2. パスにクエリストリングでバージョンを付ける

<link rel="stylesheet" type="text/css" href="/static/css/hoge.css?v=1" />
<img src="/static/img/hoge.png?v=1" />
<script src="/static/js/hoge.js?v=1"></script>

3. パスにバージョンを含める

<link rel="stylesheet" type="text/css" href="/static/v1/css/hoge.css" />
<img src="/static/v1/img/hoge.png" />
<script src="/static/v1/js/hoge.js"></script>

この中でどれがいい?

1はいろいろ辛そうなのでなしとして、2よりも自分は3がいいと考えています。

以下、その理由をば。

任意のタイミングで確実にリリースできる

これは2のパターンでも当てはまるので、3だけではないですが。

リリースしたタイミングで新しいファイルとしてロードされます。

クライアントのキャッシュを気にしないでも大丈夫。

新旧のバージョンが混在できる

LBから切り離して、アプリサーバを1台ずつローリングアップデートするパターンなんかでも問題なく。

古いアプリサーバにアクセスしたクライアントは古いバージョンのファイルを見て、新しいアプリサーバにアクセスしたクライアントは新しいバージョンのファイルを見て、動作します。

2だと(初めてアクセスした|キャッシュの期限が切れた)クライアントがサーバ側が古い状態で、最新の静的ファイルにアクセスしてしまう可能性があるかと(ブルーグリーンデプロイメントしているなら問題ないかもしれませんが)

事前にリリースできる

現在動作しているアプリには影響を与えず、安心安全に本番環境に事前にリリースできます。

これは2だと無理ではないでしょうか。

補足

ディレクトリではなく、ファイルにバージョンを含めるパターンはどうか?

<script src="/static/js/bundle-abcdefg1234xxxxxxxx.js"></script>

的な。CSS/JSはいいですが、画像のことを考えるとディレクトリにバージョンを含めたほうがいいんじゃないかと思います。

まとめ

久しぶりにブログを書きました。

もし違うよとかもっといい方法があるよということであれば、コメントしていただければ幸いです。

ではでは。