技術メモ: 2007年9月アーカイブ

あんまり初歩的な話を書くのも恥ずかしいのですが。
なーに、いつかすごいプログラマと呼ばれた頃には、「あのもぎゃさんにもこんな頃があったのね!」って感動される材料になるのさ♪

while true
  foo ||= 0; foo += 1; puts foo; break if foo > 99
end

foo ||= 0 ってなに?そんな演算子はないよね?

...そうすると、これがパーサー(仮想マシン?Rubyの中の人^^;)からどう見えるかというと、たぶん、まず||が評価される。

fooは未定義なので、ここでのfooはfalse。orだから、falseだったら次を評価するはずで。
つぎって、"=0"。 orで評価している途中ですが、そこに0を代入。どこに代入???

と思ってリファレンスマニュアルをみていたら、書いてあった。
Rubyリファレンスマニュアル - 演算子式
foo += 12       # foo = foo + 12
a ||= 1         # a が偽か未定義ならば1を代入。初期化時のイディオムの一種。

ああ。なるほど。
つまり、foo ||= 0は
foo = foo || 0
こう評価されて、fooが未定義の場合、評価したらfalseだから、後ろが評価された0をfooに代入する。次にループで回ってきたときはfooが定義されているから、foo=fooとなって、実質何もしない。結果として変数の初期化ができる、と。

おお。ナルホド。勉強になりました。


本日はITpro Challenge!でライトニングトークをさせていただきました。

pdfファイル
HumanDate.pdf

HumanDate.rbのgemファイル。
HumanDate-0.0.1.gem


あと、プレゼンで紹介した、HumanDateをつかって携帯電話(というか電子メール)からGoogleカレンダーに登録するスクリプトはこちら。
pop3togcal.rb

このスクリプトを
cronで定期的に呼び出すようにすることで、
設定したメールアドレスのメールをチェックしにいって、
該当するメールがあればgoogle calendar apiをつかってGoogleカレンダーに登録するようになっています。

なお、このスクリプトは
zorioの日記 - メールからGoogle Calendarに登録するサンプル
を元にさせていただきました。素敵なコード、どうもありがとうございます。

(追記 2007-09-08 08:28:27)
maeda.na@はてな - ITpro Challenge!のメモとか

古川氏のカレンダライブラリはいいと思う。

いえぇ~っ!そうそうたるメンバーに囲まれてどうしようかと思っていたのですが、このお言葉はうれしいです。
ライトニングトーク中毒になってしまいそうだ(笑)



pukiwikiのファイル名について attachの中の余分なファイルを消したいと思っているのですが、

CBE2CBA1B7BFBCEDBEEC_A5DEA5B8A5C3A5AFA5A2A5EDA1BCB3CEBBA62E786C73

↑のようなファイル名ばかりなのでどれが不要でどれが必要なのかわからなくて困っています。
こういったよくわからない文字の羅列を普通のファイル名に戻すといったことはできないでしょうか?


ということで、perlのコードが紹介されている。

自分も変換する必要に迫られたので、rubyのコードを書いてみた。

require 'kconv'
Dir.foreach("./euc/") {|inputFileName|
  if File.file?("./euc/"+inputFileName)
    #出力ファイル名(デコードしておく)
    outputFileName = inputFileName.scan(/([0-9A-F]{2})/).map{|a| a[0].hex.chr}.flatten.join("").gsub(/\//,'_')+".txt"
    File::open("./euc/"+inputFileName) {|inputFile|
      File::open("./sjis/"+outputFileName,'w'){|outputFile|
        inputFile.each {|line| 
          #ついでに、文字コードをsjisに変換
          outputFile.print line.kconv(Kconv::SJIS,  Kconv::EUC)
          outputFile.print "\n"
        }
      }
    }
  end
}

日本語のファイル名がうまく戻せていないのは、linuxマシン上のファイルシステムの問題かこのコードの問題かちょっとわからない。