Born Too Late

Yuya's old tech blog.

jq 風に Ruby で JSON をフィルタするツール jr を作った

2014-10-03 03:41:37

最近はログを行指向の JSON として保存するケースが増えていると思います。
今どきは大体どの言語にも標準で JSON のライブラリが入っており、構造化データをログに残す手段として非常に手軽です。
Fluentd の in_tail で吸い上げるために JSON で残しているケースもあるでしょう。

そういった JSON ログをフィルタするツールとしては jq が有名だと思います。
私も日々使っています。

jq は非常に便利なのですが、複雑なフィルタをやろうと思うと、JavaScript 風の jq 独自のシンタックスでいろいろと書く必要があり面倒です。
特に、集計に reduce を使おうとした場合、どうやって書けばいいのかを思い出すのに時間がかかるので、ほとんど使いません。

これが Ruby で書ければ楽なのに...
ということで作りました。

jr: command-line JSON processor for Rubyists

GitHub: yuya-takeyama/jr

jr は JSON をフィルタ・集計するためのコマンドラインツールで、Ruby で記述できます。

実際にフィルタしたり集計したりする例は GitHub の README を参照してください。
GitHub API でリポジトリ一覧から必要な情報だけ抜き出したり、言語ごとにリポジトリ数を集計したりしています。

昼休みに思いついて、プロトタイプとして作った reduce-json というツールを元にしています。

JSON のストリームを Ruby で reduce するコマンド書いた

元々は reduce メソッドだけを実行できるものでしたが、せっかくだから map や find_all なんかもできた方がいいよね、ということで今の形になりました。

インストール方法

gem にしているので以下のようにインストールできます。

gem install jr-cli

jr の良いところ

jr は、jq がそうであるように、他のツールと組み合わせて使うことを目指しています。
UNIX 標準のツールと組み合わせるには、CSV 等の行指向のフォーマットに変換できる必要があって、それは未対応ですが、そのうちできればと思ってます。
jq と組み合わせることもできます。

とても便利なツールなので、是非日常の作業に使ってみてください。
欲しい機能などあれば、プルリクエストもお待ちしています。

GitHub で旧リポジトリから新リポジトリにリダイレクトさせる

2014-07-05 15:44:23

TL;DR

GitHub ではリポジトリを Transfer ownership すると、旧リポジトリへのアクセス時に新リポジトリにリダイレクトするようになる。

GitHub リポジトリにアクセスするとリダイレクトすることがある

気づいてる人も多いと思うんですけど、たまにあるんです。

https://github.com/defunkt/hub -> https://github.com/github/hub
https://github.com/lestrrat/peco -> https://github.com/peco/peco

yuya-takeyama/woothee-php も woothee/woothee-php にリダイレクトさせたいと思って、リポジトリの Setting を探してもそれらしき設定はなし。
代わりに、yuya-takeyama/woothee-php に moved ブランチを作って、README.md に「引っ越しました」的なリンクだけ置いていました。
それも woothee/woothee-php からわざわざ fork した上で。

ところがさっき Twitter で教えてもらった情報によると、そんなことする必要なかったんですね。

@yuya_takeyama Transfer ownershipだったと思う。

— ながしまきょう (@hail2u_) 2014, 7月 5

まぁいま確認したら、Transfer repository するときに、しっかりその旨書かれてるんですが。

[caption id="attachment_2520" align="aligncenter" width="446" caption="Transfer repository するところ"]Transfer repository するところ[/caption]

というわけで、fork して作った yuya-takeyama/woothee-php を削除して、再度アクセスしたところ、見事に woothee/woothee-php にリダイレクトされるようになりました。
めでたしめでたし。
もちろん 301 Moved permanently ですね。

で、試しに git clone https://github.com/yuya-takeyama/woothee-php とかすると、見事に woothee/woothee-php の HEAD が clone されました。
ついでに git remote show origin すると Fetch URL とか Push URL とかは yuya-takeyama/woothee-php になっていて、せっかくだから woothee/woothee-php にしてくれてた方がよかったんですけど、ここは git clone のリダイレクトの扱いの問題ですね。
ちなみに SSH からの git clone でも同様でした。

しかし、これなら Transfer ownership したら Gemfile とかで GitHub からインストールしていた gem がいきなりインストールできなくなった!なんてことは起こらないわけですね。
無意識にやってくれて親切。

あと、リダイレクト先の URL なりリポジトリなりを自分で設定できるような仕様もあり得たとは思うんですけど、まったく関係ないリポジトリとかにリダイレクトさせないようにこういう仕様なんでしょうね。

あわせて読みたい

How to transfer a repository

Woothee を PHP に移植した (2014-02-18 追記あり)

2014-02-17 00:27:11

TL;DR

Woothee とは

Woothee というのは @tagomoris さんが作った User Agent 判定器プロジェクトです。
Perl, Java, JavaScript, Python と、複数の言語に実装が用意されていて、元になるデータセットや、テスト用のデータセットは YAML 形式で公開されています。

詳しくは以下のブログ記事を読むのが良いでしょう。

Woothee PHP とは

PHP 実装がなかったようなので、勝手に作りました。

yuya-takeyama/woothee-php

ほぼ woothee-java を移植しただけです。
ただし、判定処理を行うファサードとなる Classifier クラスは、woothee-java が静的メソッドを呼び出して使うのに対して、woothee-php はインスタンスメソッドを呼び出して使うようにしてます。
その方が DI できていいよね、という感じです。

とりあえずテスト用のデータセットは全てパスしてるつもりです。
ユニットテスト通しただけで実際のプロジェクトへの投入とかはできてないので、ものすごいポカミスとかあるかもしれません。

Packagist への登録について

PHP ライブラリ作ったら 4 秒で Packagist に登録するのが PHP モダニストの流儀だとは思うのですが、せっかくならベンダー名として woothee 使いたいところで、そうなると一応 @tagomoris さんにも一言聞いておいたほうがいいだろうということで、後回しにしてます。 (まだ聞いてない)
(2014-02-18 追記 前述のとおり Packagist 登録済み)

あとせっかくなので、GitHub の woothee organization 入りもできるといいですね。
(2014-02-18 追記 woothee organization 入りし、woothee/woothee-php に移動しました)

Woothee のいいと思うところ

似たような機能のライブラリは無くはないと思うのですが、(ちょうど今 @chobie さんにも教えていただきました) Woothee のいいところはもっと別のところにあると思うんです。

コミュニティとしてメンテナンスを続けていければ、極論 @tagomoris さん自身が飽きてしまっても問題ないわけです。

まとめ

とりあえず作りましたので、興味のある方はお試しください。
前述の通り、こちらでは本番投入できておりませんので、その辺はお察しください。