投稿

git-svnでFILE was not found in commit HASH

いつものようにgit-svnで更新していたところ、以下のようなエラーに遭遇した。 $ git svn fetch FILE was not found in commit HASH (REVISION) (FILE, HASH, REVISIONは伏せ字) どうも無視しているディレクトリの中身にコミットがあったらしく、変更を適用しようとしてエラーになっている。 そのファイルを仮に、 hoge/foo.c としておく。 エラーの根本原因となっていたのは .gitignoreで、もともとは hoge と書いていたのだが、 hoge/ とスラッシュまで含めて書くのが正しかったようである。 上記の修正ができない場合でも、 $ git svn fetch --ignore-path hoge のようにオプション指定すればエラーは回避できる。

あと一手

もう数年前のこととなってしまったが、チェス上級者をあと一手まで追い詰めたことがある。 まだ大学院の学生だった頃の話で、たまたま同じ研究会に参加していたイギリス人がチェスに精通しているということでリクリエーションでその力を披露していた。  私が観戦していた一局では既に彼のイギリス人は巧者だということが判明しており、挑戦者は諦め模様であった。 それまでの数局を見てチェスでの駒運びをいくらか覚えた私は、単純な好奇心から横槍を入れてしまった。 ナイト、ポーン、ビショップ、クイーンとたった一つ空いた穴を攻め立てて、あと一手でチェックメイトのところまで攻め立てることができた。 無論、彼の上級者を落とすまでには至らず、私の攻めは徒労に終わってしまった。私と同じく観戦していた研究者等がその手もあるのかと感嘆してくれたのは嬉しかったし、次の対戦者に私を指名してくれたのも誇らしかった。 しかし、次の対局では全く話にならず惨敗してしまった。 なんのことはない。彼はこれまでの対局で手を抜いていただけだった。 私の何気ない一手に対して、熟考に熟考を重ねた上で無難な手を打つという戦略をとったのである。一方の私は数局前までは素人で彼の攻め方を真似ただけであったのだ。 結果は言うまでもないが、どうもこのあたりができる人間とできない人間の差のように思えてならない。

evalのthisを指定したい

var code = 'this.hello = function() { console.log("hello"); };'; var obj = {}; eval.call(obj, code); obj.hello() 的なことしたいなぁ〜。できないのかなぁ〜。

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、何やってるかよく分からない」状態から再入門することになった。 そうしてようやく、上の...

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 .*; class StringAppend { public static void main ( 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 = new StringBuilder (); 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());   } }