Posted by nanki
Sat, 30 Jan 2010 10:28:00 GMT
便利なxargs
UNIX系OSにはxargsというコマンドがあり、
$ cmd arg1
$ cmd arg2
$ cmd arg3
…
という処理を、次のように自動化してくれる。
$ cat args
arg1
arg2
arg3
…
$ cat args | xargs -n 1 cmd
very venry!
疑惑
便利なxargsではあるが、オプショナルな引数をとるような処理を自動化しようとしたら、なかなか思う通りにいかなかった。
以下、Mac OSX 10.6.2 での話。
調査
$ cat args
arg1 opt
arg2
arg3
$ cat args | xargs ... ruby -e "p ARGV" ...
上のような入力をxargsに渡し、単純にコマンドライン引数をpするRubyプログラムを使って行う。
☷ cat args | xargs -n 2 ruby -e "p ARGV"
["arg1", "opt"]
["arg2", "arg3"]
xargs「神は空白と改行を平等におつくりになられた」
☷ cat args | xargs -I% ruby -e "p ARGV" %
["arg1 opt"]
["arg2"]
["arg3"]
惜しい。空白がエスケープされているので $ cmd "arg1 opt" と同じ。
☷ cat args | xargs -J% ruby -e "p ARGV" %
["arg1", "opt", "arg2", "arg3"]
それは困ります…。
☷ cat args | xargs -E% ruby -e "p ARGV"
["arg1", "opt", "arg2", "arg3"]
ですよね〜。
☷ cat args | xargs -L 1 -J% ruby -e "p ARGV" %
["arg1", "opt"]
["arg2"]
["arg3"]
これだ!Lは世界を救う!
☷ cat args | xargs -L 1 ruby -e "p ARGV"
["arg1", "opt"]
["arg2"]
["arg3"]
xargs「よくぞたどりついた」
Posted in noise | no comments | no trackbacks
Posted by nanki
Sun, 03 Jan 2010 11:59:00 GMT
macportsで入れたllvmは2.6なのでllvmrubyがコンパイルできないのでパッチを書いた。
まだテストが全部通るわけではなくて、test_basic.rbの一カ所で落ち、test_ruby_vm.rbが全て失敗する。
基本的には、LLVMContextが必要な所で、全てgetGlobalContext()を渡すように変更した。
あとよくわからないけど、ofstreamのflushを呼び出しているところで落ちていたので、llvmで用意されているraw_fd_ostreamというのを使うように変えた。
参考:
Posted in tech | Tags llvm | no comments | no trackbacks
Posted by nanki
Fri, 25 Dec 2009 01:35:00 GMT
LLVM言語にて、フィボナッチ数列。
@str = internal constant [4 x i8] c"%d\0A\00"
define void @main() nounwind {
init:
br label %loop
loop:
%i = phi i32 [0, %init], [%i.next, %loop]
%fib = call i32 @fib(i32 %i)
call i32 @printf( i8* getelementptr ([4 x i8]* @str, i32 0,i32 0), i32 %fib)
%i.next = add i32 %i, 1
%cond = icmp ult i32 %i.next, 30
br i1 %cond, label %loop, label %exit
exit:
ret void
}
define i32 @fib(i32 %n) nounwind {
%cond = icmp ult i32 %n, 2
br i1 %cond, label %c1, label %c2
c1:
ret i32 1
c2:
%n1 = sub i32 %n, 1
%n2 = sub i32 %n, 2
%fib1 = call i32 @fib(i32 %n1)
%fib2 = call i32 @fib(i32 %n2)
%r = add i32 %fib1, %fib2
ret i32 %r
}
declare i32 @printf(i8*, ...) nounwind
𐄡 llvm-as fib.ll -o - | lli
1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
10946
17711
28657
46368
75025
121393
196418
317811
514229
832040
便利。
Posted in tech | Tags llvm | no comments | no trackbacks
Posted by nanki
Sat, 19 Dec 2009 09:15:00 GMT
termtter では、パスワードをファイルに保存したくない、という理由から?デフォルトでは毎回パスワードを聞くようになっている。
Macではsecurityコマンドというのでキーチェーンにアクセスできるそうなので、それを使ってみる。
標準エラー出力にパスワードを吐くのでpopen3を使う。
def password_from_keychain(user)
require 'open3'
_, _, err = Open3.popen3("/usr/bin/security find-internet-password -s twitter.com -a #{user} -r http -g")
if /^password: "(.*)"$/ === err.gets
$1
else
nil
end
end
config.user_name = 'your_account'
config.password = password_from_keychain(config.user_name)
参考:
Posted in ruby | Tags termtter | no comments | no trackbacks
Posted by nanki
Wed, 25 Nov 2009 12:42:00 GMT
噂のMagLevを試してみた。以下 Mac OS X 10.5.8 での話。
⍟ git clone git://github.com/MagLev/maglev.git # clone repository
⍟ cd maglev
⍟ ./instsall.sh # download and install GemStone
⍟ vim .zshrc
export MAGLEV_HOME=/PATH_TO/maglev
export PATH=$MAGLEV_HOME/bin:$PATH
⍟ rake maglev:start
⍟ maglev-ruby -e "p 1 + 1"
2
⍟ maglev-irb
error , Expected nil to be a Boolean.,
during /..../maglev/bin/maglev-irb
ERROR 2085, Expected nil to be a Boolean. (RuntimeError)
maglev-irb は動かない><
参考:
Posted in tech, ruby | Tags ruby | 3 comments | no trackbacks
Posted by nanki
Wed, 28 Oct 2009 21:18:00 GMT
憧れシリーズ第二弾。
Scalaの勉強でもしようかな、と思ってScalaの本を開いたら、Scalaでは無名関数を_(アンダースコア)を使って定義できるらしい。
Rubyにおけるそれの実現可能性に考えが行ってしまって、Scalaの本を読むのはそれでおしまいになったのだ…
Rubyでも、
とか書きたいよね。
Rubyにはもともと、mapなどのブロックを取るメソッドに無名関数(Proc)を引数として渡すことができる
この例では、:to_s は Symbol だが、Proc を返すSymbol#to_proc を定義しておくと、それが呼ばれてよしなにしてくれる。Symbol#to_proc はActiveSupport などで定義されているので、Rails使いにはおなじみだろう。
この仕組みを利用して、 _ に対して送られるメッセージを保存しておいて、to_proc される時に適当なProcを返すような何かを作ればよい。
module Scala
class LazyCall
instance_methods.each do |v|
undef_method(v) unless %w(__id__ __send__).include?(v)
end
def initialize(v = nil)
@v = v
@msgs = []
end
def method_missing(*args, &block)
@msgs << [args, block] unless args == [:respond_to?, :to_proc]
self
end
def to_proc
proc do |v|
@msgs.inject(@v||v) do |r, m|
r.__send__(*m[0].map{|a|LazyCall === a ? a.to_proc[v] : a}, &m[1])
end
end
end
end
def _(v = nil)
LazyCall.new v
end
(0...3).each do |i|
define_method("_#{i}"){LazyCall.new[i]}
end
end
include Scala
そうしてできたのがこれ。
これを使うと…
%w(a b c d).map(&_ * _.to_i(16))
[[1, 2], [2, 3]].map(&_0 + _1)
_(Math).sqrt(_0 ** 2 + _1 ** 2).to_proc[[3, 4]]
& の後に括弧が要ると思っていたがそんなことはなかったぜ。
メッセージをフックする関係上、直接 Math.sqrt(_0 ** 2 + _1 ** 2) とは書けないけど、そう書きたい人はブロック使ってください。
以下簡単な説明
- _ は
LazyCallのインスタンスを返し、受け取ったメッセージを引数と共に保存。
[:respond_to?, :to_proc] をはじいているのは、引数として渡される時にこの問い合わせが発生するので、それを無視するため。(副作用として、無名関数では.respond_to? :to_proc が使えなくなると思う)
to_proc内で、保存したメッセージを、procの引数に送り直している。
- 保存された引数の中に、LazyCallのインスタンスがある場合は、call してその結果と置き換えている。これによって、
_ * _ のような表記が可能になる。
_0は、_.[0]のエイリアス
二夜にわたるProxyObject特集、いかがでしたでしょうか。さて、来週からは…
追記:2009/10/30
Scalaの _ (プレースホルダ構文と呼ぶらしい) は _ + _と書いたとき、二つの _ が同じものを意味しないそうです。
と、閉じた本の続きに書いてあった。
あと、_0 などを使うと、20倍くらい遅い。どうしたものか。
Posted in tech, ruby, noise | Tags ruby, scala | no comments | no trackbacks
Posted by nanki
Wed, 28 Oct 2009 05:25:00 GMT
HaskellにはMaybeモナドというのがあって、エラー処理をかなり適当な感じに書けてとても便利そう。
一方、多くのプログラミング言語では、
request.mobile && request.mobile.docomo?
File.open('example.txt').read rescue nil # これはすこし横着
こういった記述を頻繁に使う必要があり、なんとかしたい。
そこで、
class Never
instance_methods.each do |v|
undef_method(v) unless %w(__id__ __send__).include?(v)
end
def method_missing(*args)
self
end
def end
nil
end
end
class Maybe < Never
def initialize(value)
@value = value
end
def method_missing(*args, &block)
Maybe.new @value.__send__(*args, &block)
rescue Exception
Never.new
end
def end
@value
end
end
class Object
def maybe
Maybe.new(block_given? ? yield : self)
rescue Exception
Never.new
end
end
上のようなコードを実行すると、
request.mobile.maybe.docomo?.end # => true/false or nil
File.maybe.open("file_does_not_exist.txt").read.end # => nil
こういう風に書く事ができるようになって幸せ。
途中のどこかで失敗すると、単にnilが返る。
このように、包んだオブジェクトのフリをするオブジェクトを使う手法はRailsでは多用されていて、読んでみると割と楽しい。ProxyObjectとか呼ぶらしい。
class Maybe < Never のあたりが、
子「お父さん、運動会絶対見に来てね」
父「絶対行くぞ」
一週間後
子「お父さん、運動会絶対見に来てね」
父「たぶん…」
というような会話を想像してしまって、とても人間的。
参考:
Posted in tech, ruby, haskell | Tags haskell, ruby | no comments | no trackbacks
Posted by nanki
Tue, 27 Oct 2009 11:22:00 GMT
選択した文字列もしくは現在のURLをQRコードにするbookmarklet
javascript:s=document.getSelection().toString();s=s.length?s:location;open("http://chart.apis.google.com/chart?cht=qr&chs=200x200&choe=UTF-8&chl="+encodeURIComponent(s),'_blank')
Safariでしか試してない。
Google Chart API 便利。
参考:
Posted in javascript | Tags venry | no comments | no trackbacks
Posted by nanki
Mon, 14 Sep 2009 06:02:00 GMT
月に一度のgolf. というか、人がやっているのを目にすると、手を出したくなってくる。
たぶん、子供がプラモデル組み立てているのを見て「ちょっとお父さんにかしてみなさい」というタイプ。
結局、前回の最短は23Bだったらしい。変数名まで同じだった :)
文字数を削るという共通の目的が、変数名から意味すら奪うのだろうか。
20Bという噂はなんだったんだろう…
反省を生かして、今回は、27Bまで縮んだところで寝かせておく。
続きにあるのはお気に入りの答えだが、パー。
追記: 2009/09/17
いくつかの方針で使っている方法を組み合わせたら23Bになった。驚き。
参考:
Read more...
Posted in tech, ruby, noise, life | Tags golf, ruby | no comments | no trackbacks
Posted by nanki
Wed, 12 Aug 2009 13:40:00 GMT

InternetExplorerのテスト用に飼っている、VMWare上のWindowsに新たな使命が課せられた。
携帯シミュレータでのテストだ。
ただ、シミュレータは3キャリア分あって、操作方法も全部違うので、これからげんなりすることを思うとげんなりする。
そこで、とりあえず、一発でreloadができるようにならないか方法を探してみた。
ページのリロード
EventGhost というのがあるらしいので、ダウンロードする。
ページのリロードは、指定した名前のウィンドウを探して、F5キーを押すことで実現。これを、3キャリア分設定。(ソフトによってキーは違う)
あっさりとできてしまった。
キャプチャ
それだけだと面白くないので、リロードした後、画像をキャプチャするようにした。
IrfanViewには、起動オプションでアクティブなウィンドウの内容をキャプチャする機能があるらしいので、それを使う。
起動オプションこんな感じ。
i_view32.exe /capture=3 /convert="\\.host\Shared Folders\Public\softbank.png"
ウェブサーバ
さらに、プラグインを見てみると、WebServerというのがある。
このプラグインを追加すると、指定したポートでHTTPサーバが起動し、指定したフォルダの内容が見られるようになる。
さらに、クエリーストリングに、HTTP.reload という文字列をつけてGETなどすると、同じ名前のイベントが発生して、アクションをトリガーできるようになるらしい。
そんなわけで、最終的にスクリーンショットのような構成になり、Safariから、http://192.168.1.1/?HTTP.reload などとすると、リロードしてスクリーンショットが見られるようになった。
(スクリーンショットが撮られるまでにはタイムラグがあるので、javascriptで定期的に画像をリロードする)
ウェブサーバ機能はかなり便利。
問題点
- リロードの終了を検知できないので、2秒待つ、みたいなことをしないといけない。
- アクティブなウィンドウをキャプチャするので、排他的にしか処理できない。
参考:
Posted in tech, web | Tags windows | no comments | no trackbacks