トップ «前の日記(2013-06-27) 最新 次の日記(2013-10-17)» 編集

Route 477



2013-07-05

[git] git grepの検索結果から長すぎる行を省くコマンドを作った

git grepはgitリポジトリ内のソースコードを高速に検索してくれる便利なやつですが、「git grep Date」とかしたときに、 jquery.min.jsなど圧縮された(=1行が異常に長い)ファイルが検索結果に含まれてしまい、非常にウザい感じになります。

で、ふと解決策を思いついたのですが、git grepの出力をパースして長い行をたたんでやればいいんじゃないでしょうか。 以下のコードをgit-grep-nolongのようなファイルに保存し、パスの通った場所に置いてchmod +xしておきます。

#!/usr/bin/env ruby
require 'open3'

stdin, stdout, stderr = *Open3.popen3('git', 'grep', *ARGV)

LIMIT = 200

stdout.each do |line|
   if line.size > LIMIT
     puts line[0, LIMIT] + "..."
   else
     puts line
   end
end

$stderr.write stderr.read

あとは「git grep-nolong Date」みたいな感じで検索を実行すると、長い行が省略されるようになります。

[ruby][altjs] Quick servey on 'Ruby on Browser'

RubyKaigi 2013の翌日に行われたRubyHiroba 2013でのLTです。

内容は、「Rubyをブラウザで動かすn個の方法」みたいな話です。

作戦1: サーバ側と連携

作戦2: YARV ILのインタプリタを書く

  • HotRuby (2008)
    • YARV中間言語のインタプリタをJSで実装したもの。事前にスクリプトをYARV中間言語に変換し、それをJSで実行する
    • この方式では、組み込みライブラリをJSで再実装する必要がある
  • ColdRuby (10 months ago)
    • HotRubyと同方式?

作戦3: JSのライブラリとして実装

  • RubyJS
    • Ruby風のメソッドをJSに実装したもの
    • 作者が来てた http://www.ustream.tv/recorded/33526011
    • JSのライブラリなので速度やサイズ的には一番有利 (その代わり文法はRubyでない)

作戦4: emscriptenを使って、Rubyインタプリタを丸ごとJSに変換

作戦5: ブラウザ拡張などを使う

  • JsMruby
    • Firefox/Chrome拡張
  • Native Client (Ruby 2.0~)
    • サンドボックス内でバイナリを実行
    • Chromeのオプションを有効にして再起動する必要がある
  • Decaf
    • WebKitに手を入れて、Ruby実行をサポートw
    • Mac用バイナリがダウンロードできる

作成6: JSでRubyを実装する

  • JSRuby (2008)
    • パーサと、組み込みライブラリの一部を実装
  • Opal
    • 「Rubyにとても良く似た言語」のJS実装
    • 文字列をimmutableにするなど、性能とのバランスを考えて、一部の仕様がRubyから変更されている
    • 組み込みライブラリのかなりの部分が実装済み

Opalはまだ安定はしてないんだけど、使ってみるとまさに「Rubyのコードを書いたらそれがそのままブラウザで動いた」という感じで、理想のプロジェクトに近く、非常に期待しています。 で、Opalのサンプルとしてパズル&ルビーストというゲーム風のデモを作りました(笑)。まとめてたくさん消すとRubyistが出てきます(クリアとかは無いです)。

ソースはこんな感じで、(ちょっとハイライトが残念なことになってますが) ほとんどRubyそのまま、というのが分かってもらえるかと思います。特に、クラス作って定数やインスタンス変数を定義して、内部用のメソッドはprivateにして…という「いつもの感じ」でコードが書けるのは想像以上に楽でした。

(10/17追記:Opalの弱点としては、JSのライブラリを使うのにOpal用バインディングが要るところでしょうか。 Enchant.js用のバインディングは無かったので、ソースのこのへんで定義しています。 jQueryなど有名なものに関してはすでにバインディングがあります。)