詩と創作・思索のひろば

ドキドキギュンギュンダイアリーです!!!

Fork me on GitHub

sbt で Vim のスワップファイルが watch されるのを抑制する

Scala の話。sbt~compile とかしてるときに Vim で新しいファイルを編集しはじめるとコンパイルが始まってなんだこりゃとなることがある。いまいちまとまった情報がないのでここに記しておく。

こういう場合 watchSources というキーに変更を加えてやるとよい。

グローバルに適用するために、~/.sbt/0.13/global.sbt などのファイルに以下のように記述する:

watchSources ~= {
  _.filterNot {
    f =>
      f.isDirectory ||
        """^\..*\.sw.$""".r.findFirstIn(f.getName).isDefined
  }
}

場合によっては ~/.sbt/0.13.9 以下に配置する必要があるかもしれない。

~=

どういう訳かはわからないけれど 0.13.x 系のドキュメントには ~= の説明がない。0.12.x 系には載っている。

More Kinds of Setting — sbt Documentation

参考

2015年に作ったもの20点(セルフレビューつき)

いちおう振り返っておかないと 2016 年を迎えられないという心持ちになったので、全部ではないけど列挙する。また、作ってブログに書いたけど自分では使ってません、というのも無責任なので、現在自分で利用中かどうかも添える。

go-typeswitch-gen (Go、コマンドラインツール)

Go で reflect パッケージを使わずにジェネリックな関数を実現する - 詩と創作・思索のひろば

ステータス: 便利に使用中

tsgen というコマンドを含んでいる。知られてないと思うけどこれは非常に便利なツールで、tsgen scaffold で空の type switch を展開できる。つまり:

// node は interface go/ast.Node の変数
switch node := node.(type) {
}

の case 文を全てフィルインしてくれる。go/ast ユーザである自分には必需品。使い方に癖があるのでこの機能だけ切り出して別ツールにしたい。

Pocket Expose(Go、ウェブサービス)

Pocket の未読フィードを秘密の URL で公開するウェブサービスを作った - 詩と創作・思索のひろば

ステータス: 使っていない

Pocket の未読を他サービスと連携するために専用のURLでRSSを配信する。現在とくに連携したいものがないので使っていない、はず(知らないうちに使っているかもしれない)。アクセスログを見たところ他の人が使っているような感じもある。

gore(Go、コマンドラインツール)

コード補完もできる Go の REPL「gore」を作った - 詩と創作・思索のひろば

ステータス: 便利に使っている

Go のちょっとしたコードを試したいときに大変よい。とにかく便利。

goquickfix(Go、コマンドラインツール)

Go でコードを書く時のかゆいところに手が届く goquickfix というのを書いた - 詩と創作・思索のひろば

ステータス: 使っている

gore のスピンオフ。たまに使うが日常的にではない。使ってないのはエディタ連携してないからって気がする。goquickfix はソースコードを変更する際、後から戻せるような変更しか行わないのだけど、取り消し不可な変更を導入するオプションがあってもいいかも(使ってない変数を消すとか)。

lgtm.sh(シェルスクリプト)

秒速でLGTMするコマンド - 詩と創作・思索のひろば

ステータス: 便利に使っている

このエントリを書きはじめたときにはまったく意識にのぼってなかったけど、これ一番使っている気がする。lgtm -c -m がシェルのヒストリに大量にある。-c でクリップボードにコピーできるようになりました。OSX 限定。Pull Request お待ちしております。

hub-pr(Go、コマンドラインツール)

オレ流 Pull Request 作業フロー - 詩と創作・思索のひろば

ステータス: ときどき使っている

hub-pr checkout の補完が微妙に遅い気がするのでなんとかなりたいけど zsh の補完はよくわからない。

go-cli(Go、ライブラリ)

go-cli: ドキュメントとともにコマンドラインツールを作る - 詩と創作・思索のひろば

ステータス: あまり使っていない

そもそもサブコマンドがある CLI ツールをあんまり書いてないからってのもある。

google-apps-script.d.ts(TypeScript、型定義ファイル)

Google Apps Script の TypeScript 型定義ファイルを作った - 詩と創作・思索のひろば

ステータス: 使っている

DefinitelyTyped にマージされた。Google Apps Script を書くときはこれがないとやってられない。

Mackerel API でホスト名を補完(いろいろ)

Mackerel + peco + zsh でコマンドラインにホスト名を補完する - 詩と創作・思索のひろば

ステータス: 使っている

仕事でかなり使っている。自分と環境が違う人にとって利用しやすい形になっていないので俺得ってかんじだった。

gobump(Go、コマンドラインツール)

gobump で Go プロジェクトのバージョニングをおこなう - 詩と創作・思索のひろば

ステータス: 使っている

ghq のプルリクエストをマージしたら自動でバージョンが上がってすげー、と思った。仕組みは以下の記事をご覧ください:

Go プロジェクトのバージョニングとリリースを CI で自動化する - 詩と創作・思索のひろば

Goの簡易ベンダリングシェルスクリプト(シェルスクリプト)

シェルスクリプトで Go の簡易ベンダリング - 詩と創作・思索のひろば

ステータス: 使っていない

Godep を使いたくなくて書いただけのやつ。最近 gb を使って気に入ってるので vendoring が公式サポートされるまでは gb でいいかなとか思ってる。

go-sqlf(Go、ライブラリ)

Go のシンプルかつ明快な SQL クエリビルダ go-sqlf - 詩と創作・思索のひろば

ステータス: 使っている

まあ SQL が発行される箇所は明快になっているのがよい。速度があまり出ないのがネックではある。jmoiron/sqlx でも良いかな? って最近は思っているけど試せていない。

go-readrows(Go、ライブラリ)

https://github.com/motemen/go-readrows:embd

motemen/go-readrows · GitHub

ステータス: あまり使っていない

go-sqlf と組み合わせて、SQL で引いてきたカラムを struct にマッピングする。あまり複雑なウェブアプリケーションを書かないので出番はそんなにない。

adsense-report-menubar(Electron)

Electron で AdSense のレポートをメニューバーから確認できるアプリを書いた - 詩と創作・思索のひろば

ステータス: 使っている

ログイン時に起動されるようにしてるので自然と使っている。Dimension と Metric の組み合わせを登録できたら便利そう。

Kak(Electron)

motemen/Kak · GitHub

ステータス: たまに使っている

Electron 製のシンプルなテキストエディタ。アプリ化せずに npm start で使っている……。日本語を書くときに利用してる。このエントリもこれで書いている。単に游ゴシックで日本語が書きたかっただけ。縦書きも対応したいのだけど表示がおかしくなるので止まってる。

gas-slack-log-spreadsheet(Google Apps Script)

Slack のログを自動で Google Spreadsheet に保存する - 詩と創作・思索のひろば

ステータス: 使っている

自動起動されるようになってるので全然触ってはいない。ときどきエラーが起こるようだけどパーマネントなものではないようなので放置している。

goreadme(Go、コマンドラインツール)

motemen/goreadme · GitHub

ステータス: たまに使っている

Go のパッケージから README ファイルを生成するツール。ドキュメントからいい感じに作ってくれるのでドキュメントを書くモチベーションにもなるはず。go-sqlf の README とかこれで生成した気がする。ライブラリじゃなく実行可能ファイル向けの README をどうするかがうまく決められていなくて停滞中。すべてをカバーするのは難しそうにもおもう。

gompatible(Go、コマンドラインツール)

motemen/gompatible · GitHub

ステータス: あまり使っていない

ほんとに使い出がでてくるのはウェブサービス化してからかなと思っている。このあいだの GoCon で発表したので紹介エントリを書きます。

goiferr(Go、コマンドラインツール)

goiferr で Go のエラー処理コードを自動挿入する - 詩と創作・思索のひろば

ステータス: たまに使っている

これも goquickfix と同様エディタ連携してないのがいけないな。ファイル全体を書き換えるのではなく「この行に続くコードを生成」というモードがあるとより良さそう。

humr(node、コマンドラインツール)

任意の入力を human-readable にする humr ってツールを書いた - 詩と創作・思索のひろば

ステータス: たまに使っている

たまにしか使ってないのはログを tail する機会がないだけだから!これはとても便利なはずなので機会が増えたらカスタマイズしつつ使っていきたい。


だんだん面倒になってコメントが雑になってしまった。見栄をはっているだけかもしれないが、予想していたより使い続けているものが多くてまあまあ実りある一年だったようにも思う。他人に使われているものがどれだけあるかはわからないけど……。

分かってはいたけど Go ばっかり、ツールばっかりの一年だった。2016 年は分野を広げ・深めていきたい。

任意の入力を human-readable にする humr ってツールを書いた

Web サーバのアクセスログを tail してながめている時にパーセントエンコーディングされた文字列をデコードしたり、コマンドラインで数字を sort -n したあとにでかい数字を丸めて表示したり("1234567" を "1.2M" に、とか)したくなることが多かったので、その辺を汎用的におこなってくれる humr というツールを書きました。

npm でインストールできます:

npm install -g humr

簡単に動きを確認するには、以下のコマンドを試してみてください:

% echo '/search?q=%E6%97%A5%E6%9C%AC%E8%AA%9E 1234567' | humr

f:id:motemen:20151225104506p:plain

入力のうち読みづらいところが色付きで変換されて出力されたことが分かります。冒頭に書いたようにログなどの入力をパイプしてご利用ください。

仕組み

humr は入力を

  1. Parser によって各行ごとにフィールドに分解し、さらに
  2. 各フィールドを Formatter によって人間向けの表現にする、

ということを行っています。Parser は1つしか指定できませんが Formatter は複数存在しえて、可能なものを順番に試していってフィールドを解釈できた場合、その結果に色付けされて出力されます。解釈できなかった場合は入力そのまま。

それぞれ、

  • Parser
    • regexp: 行を正規表現(デフォルトでは s+)で区切られたフィールドの列とみなす
    • ltsv: 入力を LTSV として解析し、それぞれの値をフィールドとする
    • apache 入力を Apache Common Log フォーマットのログとみなす
  • Formatter
    • si: SI 接頭辞(k、M など)で数値を略記する
    • url: 文字列中のパーセントエンコーディングをデコードする
    • date: 日付っぽい文字列を解釈して現在のロケールに合わせて表現する
    • emoji: :+1: みたいな文字列を絵文字に変換する

ってのを同梱して提供しています。

オプション

オプションなしだと Parser には regexp、Formatter には上記すべてが利用されるのですが、もちろんオプションでこれを変更できます。

humr -p <parser>[=<arg>] -f [<label>:]<formatter>

-p は Parser を指定します。例えば -p ltsv とすると入力は LTSV として解釈され、

size:1234567[tab]path:/search?q=%E6%97%A5%E6%9C%AC%E8%AA%9E

な入力のうち、"1234567" と "/search?..." がフォーマット対象となります。

-f で Formatter を指定できます(複数指定可)。基本的にすべてのフィールドにすべての Formatter が試みられますが、<label> を指定することで Formatter を特定のフィールドのみに適用できます。上の例だと

humr -p ltsv -f size:si -f path:url

とすることができます。またフィールドの指定は LTSV のように名前か、単純に1オリジンのインデックスを使えます。

humr -p ltsv -f 1:si -f 2:url

カスタマイズ

humr は起動時に ~/.config/humr/*.js にあるスクリプトを評価するようになっているので、自前の Parser/Formatter を定義できます。

+function () {
  'use strict';

  let formatters = require('humr/formatter').registry;

  class JapaneseNumbersFormatter {
    format (text, hl) {
      const NUMBERS = '〇一二三四五六七八九';
      return text.replace(/[0-9]/g, (n) => hl(NUMBERS[n]));
    }
  }

  formatters.register('japanese_numbers', JapaneseNumbersFormatter);
} ();

以上のような内容のファイルを ~/.config/humr/japanese_numbers.js (ファイル名は .js で終わっていればなんでもよいです)として配置しておけば、Formatter として "japanese_numbers" を利用できます。

humr -p ltsv -f size:japanese_numbers

Parser, Formatter としてどんなクラスが期待されているかはそれぞれの定義を見るのが手っ取り早いです: ParserFormatter

Parser としては行を受け取り、フィールドを { label?: string; text: string } に、それ以外の文字列を string に分解する parse メソッドを持ったクラスを登録します。

Formatter としてはフィールドの文字列とハイライト関数を受け取り、フォーマット可能であればフォーマットした文字列をハイライト関数に渡したうえで文字列を返す format メソッドを持ったクラスを登録します。

以上

昔 Ruby で書いてたやつなんだけど、拡張のしやすさ考えると JavaScript で書きたいなってことで Node で書きなおした。役立ててくださいね。日付の解釈に moment を使ってるのが良い選択だったか気になってます。

はてなで一緒に働きませんか?