投稿

2012の投稿を表示しています

Rubyのyieldがようやくわかった

不勉強ゆえに「なんだかよく分からない」状態が長く続いていたが、ようやく「とりあえず使える」程度には理解できた。
class Demo   def initialize     @arr = (0..9).to_a   end   def eachLambda fn     @arr.each do |i|       fn.call(i)     end   end   def eachYield(*arg,&block)     @arr.each do |i|       yield i,*arg       #block.call(i,*arg)     end   end end Demo.new.eachLambda lambda {|i|   puts i*i } Demo.new.eachYield do |i,n|   puts i*i end Demo.new.eachYield(2) do |i,n|   puts i**n end 最近"hoge.each {|i| Foo.new(i) {|i| ... } }"のようなコードを頻繁に書いていて、だんだんコピペが億劫になってきていた。外側のブロック部分は変わらず、中身の"..."の部分だけが違うだけだというのに、すべてを記述しなければならなかった・・・自分の理解不足ゆえに。

ちょっと工夫してみようということで、すぐに思いついたのは「"..."部分をlambdaで渡そう」ということだった。そうして出来たのが、上の例にある"eachLambda"だ。呼び出し時のlambdaが浮いてる感じがする点や、いかにもブロックでありそうなところを"{}"で書かなければならない点を除けば、概ね満足できるものだった。

しかし、これを人に使ってもらう段階になって「やっぱりブロックで渡したいよね」ということになり、「yield、何やってるかよく分からない」状態から再入門することになった。

そうしてようやく、上の例にあるeachYieldのようなものが書けるようになった。もうyieldはこわくない。"block.call()"の方が分かりやすい気がするけど、もう気にしない。…

ECJをJenkinsに食わせてみた

EclipseのJavaコンパイラであるECJをAntで呼べるようにして、Jenkinsでビルドできるようにしたというお話。もっといい方法があるという方、是非ご一報くださいますようお願い致します。

Javaの開発環境としてEclipseを採用しているところは多いだろうけれど、Jenkinsと連携しようとすると困ることがある。Jenkinsで使うJavaコンパイラをOracleから持ってくると、途端にビルドできなくなってしまうからだ。

この原因は単純にEclipseで使っているJavaコンパイラとOracleで配布されているJavaコンパイラの挙動が異なるからである。

ならば、Eclipseのコンパイラを使うようにJenkinsを設定出来れば(ここではAntを使う)問題は解決できるはずである。

EclipseのコンパイラECJを使う話はググるとたくさんでてくるけれど、同様にbuild.xmlを記述してもうまくビルドできない。入れ子になっているjarファイルを引っこ抜いて、CLASSPATHに追加しなければAntでビルドすることはできない。逆にいうと、CLASSPATHの設定さえできれば、あとはJenkinsでもうまくビルドできるということである。

ぼちぼち編集して詳しく解説していく予定です

StringBuilderって速いの?

結論:ちょっぱや


import java.io.*;classStringAppend{publicstaticvoidmain(String[] args){for(int i=0; i<50; i+=5){long start = System.currentTimeMillis();String str="";for(int j=0; j<100*(i+1); j++){ str +="aa";} System.out.println(""+i+" "+(System.currentTimeMillis()-start));} System.out.println("");for(int i=0; i<50; i+=5){long start = System.currentTimeMillis();StringBuilder str=newStringBuilder();for(int j=0; j<100*(i+1); j++){ str.append("aa");} System.out.println(""+i+" "+(System.currentTimeMillis()-start));}}}

継承は慣れないでござる

ちょっと不安になったのでメモ


import java.io.*;

class HaveInt {
  private int i=0;
  public void set(int i) {
    this.i = i;
  }
  public int get() {
    return i;
  }
}

class A extends HaveInt {
}

class B extends HaveInt {
}

class Main {
  public static void main(String[] args) {
    A a = new A();
    B b = new B();
    a.set(1);
    b.set(3);
    System.out.println(a.get());
    System.out.println(b.get());
  }
}

AirSRM が C++/C# をサポート

AirSRM on github

AirSRMがついに C++/C# のコードを吐けるようになりました。

最近はpractice roomの方はだいぶ調子がよくなってきて、期を逸した感が強いですが、ようやく仕上げることが出来ました。

使い方は Java とほぼ同じですが、設定ファイル AirSRM.config を編集する必要があります。たとえば、C++であれば、
language = cpp C# であれば、
language = cs のように設定します。

後は以下のように問題のダウンロードとシステムテスト用コードの生成などを行います。SRM 525 Div 2 Easy を C++ で解こうとした場合は、
% ruby AirSRM.rb --srm=525 --division=2 --level=1 % emacs RainyRoad.cpp % g++ RainyRoad.cpp % ./a.out % ruby AirSRM.rb --srm=525 --division=2 --level=1 --systemtest % g++ TestRainyRoad.cpp % ./a.out C# であれば、 % ruby AirSRM.rb --srm=525 --division=2 --level=1 % emacs RainyRoad.cs % mcs RainyRoad.cs % mono RainyRoad.exe % ruby AirSRM.rb --srm=525 --division=2 --level=1 --systemtest % mcs -main:TestRainyRoad TestRainyRoad.cs RainyRoad.cs % mono TestRainyRoad.exe となります。

米国大使館に行ってみた

用事があったのは領事館の方なんですが、またいくことになるかも知れないのでメモっておきます。

身分証

必要になるのは、入館時と手続き時の 2 つです。パスポートがあれば問題ありませんが、忘れてしまっても中に入ることはできます。最悪身分証が1つもなくても中に入れてもらえます。ただ、手続きの際に内容に応じて身分証が必要になるため、やはり無いと何もできません。

入館

入館時には手荷物検査などを受けます。まず、ゲートに向かって右の離れた場所、ガードレールの終わりから入って行きます。ここで、立証している警察官から「どちらへ?どのような要件で?」と聞かれます。その後「では列に並んでください」と案内されますが、素直に並んではいけません。手荷物検査はビザ関係か、その他かで別々に並ばされるので、どの列に並ぶべきか奥のほうまで行ってみて確認してください。途中にある看板に「Visa」や「other visitor」などと書いてあるはずです。

館内に持ち込めないものは、ペットボトル等の容器と電子機器です。どちらも検査所で一時保管してもらうことになります。電子機器に関しては一人ひとりケースに入れられ保管してもらえますが、ペットボトル等に関しては大きなボックスに全員分を入れるので他人のと間違えないよう注意してください。

内部

検査所を出てすぐ手前が領事館で、奥が大使館になっています。領事館に入ってすぐに受付があり、受付を抜けると待合室があります。向かって正面に窓口が並び、左奥側の部屋にも窓口があります(左前方ではなく左)。また、すぐ左には入金窓口があります。受付では「左奥の7番窓口に行ってください」のように向かう窓口を教えてもらえますが、正面に並ぶ窓口と左奥の窓口は同じ番号が振られているので注意してください。

退館

検査所で預かり物を受け取って終わりです。