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: サーバ側と連携
- TryRuby
- 今は知りませんが、前見たときはサーバ側でevalする方式だった
- https://github.com/Sophrinix/TryRuby
- Redom
- https://twitter.com/_ko1/status/341077440036212736
- サーバ側のRubyから、クライアントサイドのオブジェクトを触れる、というものらしい
- あとRailsのRJSもこれに近いかな(Rails4で無くなりましたが…)
作戦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に変換
- webruby
- mrubyのソースをemscriptenでJSコードに変換
- 作者が来てた http://www.ustream.tv/recorded/33563781
- この方式だと、Array#eachなどの組み込みライブラリがタダで手に入る(JSで再実装しなくて良い)というメリットが
- デモ:http://joshnuss.github.io/mruby-web-irb/
- emscripted-ruby
- MRI 1.8をLLVMでLLVM-ILにコンパイルし、それをemscriptenでJSコードに変換
- デモ:http://repl.it/languages/Ruby
作戦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など有名なものに関してはすでにバインディングがあります。)