xargsの使い方

投稿者 nanki 2010-01-30 19: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「よくぞたどりついた」


llvmruby llvm2.6対応パッチ(未完成)

投稿者 nanki 2010-01-03 20:59:00 GMT

macportsで入れたllvmは2.6なのでllvmrubyがコンパイルできないのでパッチを書いた。 まだテストが全部通るわけではなくて、test_basic.rbの一カ所で落ち、test_ruby_vm.rbが全て失敗する。

基本的には、LLVMContextが必要な所で、全てgetGlobalContext()を渡すように変更した。 あとよくわからないけど、ofstreamのflushを呼び出しているところで落ちていたので、llvmで用意されているrawfdostreamというのを使うように変えた。

参考:

今日のLLVM - フィボナッチ数列

投稿者 nanki 2009-12-25 10: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 (i8*, ...) @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


termtterのパスワードにMacのキーチェーンを使う

投稿者 nanki 2009-12-19 18:15:00 GMT

termtter では、パスワードをファイルに保存したくない、という理由から?デフォルトでは毎回パスワードを聞くようになっている。

Macではsecurityコマンドというのでキーチェーンにアクセスできるそうなので、それを使ってみる。

標準エラー出力にパスワードを吐くのでpopen3を使う。

# ~/.termtter/config
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)
参考:

Try maglev!

投稿者 nanki 2009-11-25 21: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 は動かない><

参考: