• 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

Scalaを使って関数のASTにアクセスするには、以下のようにすればいいらしい。

   1  scala> def f = print("hello")
   2  f: Unit
   3  
   4  scala> scala.reflect.Code.lift(f).tree     
   5  res3: scala.reflect.Tree = Select(Select(Select(Ident(Field(line4$object,PrefixedType(ThisType(RootSymbol),Class(line4$object)))),Field($iw,PrefixedType(ThisType(Class(line4$object)),Class($iw)))),Field($iw,PrefixedType(ThisType(Class($iw)),Class($iw)))),Method(f,PolyType(List(),List(),PrefixedType(ThisType(Class(scala)),Class(scala.Unit)))))

posted by Png genki on Wed 28 Apr 2010 at 06:59

長いこと不安定だったので一時期 mod_proxy_balancer + mongrel_cluster に逃げていましたが、 @yuumi3 から2.2.11で直ったよという情報をいただいたので passengerに戻してみました。

今のところは安定している感じです。

posted by Png genki on Wed 28 Apr 2010 at 02:16

普段のコミットログから作業日報的なものを生成したい場合、 以下のようなコマンドでそれらしいものが出力できます。

   1  % git log --author=takiuchi --format="%ad %s" --date=short

posted by Png genki on Wed 21 Apr 2010 at 08:47

git svnを使っていると、何度conflictを解決しても SVNに "Your file or directory '*' is probably out-of-date" と冷たく拒まれることがあります。 これを解決するには、XXXXにSVNのHEADに相当するコミットハッシュを指定して以下を実行します。

   1  % git checkout -b merging
   2  % git checkout trunk
   3  % git reset --hard <XXXX>
   4  % git svn fetch
   5  % git rebase trunk merging  # コンフリクトするので解決してコミット
   6  % git checkout -b merging2
   7  % git checkout trunk 
   8  % git merge merging2
   9  % git svn dcommit

結構面倒です。git-svnが賢くなってくれることに期待します。

posted by Png genki on Thu 15 Apr 2010 at 03:24

git svn rebaseを行って conflict が発生した場合、 (no branch) になってしまいます。

この場合、手動でconflictを解決してcommitしたあと、

   1  % git log -1 --pretty=oneline

でコミットのハッシュを確認し、git checkoutでmerge先のブランチに 移動してから git merge <commit hash> すればokのようです。

posted by Png genki on Wed 14 Apr 2010 at 08:19 with 2 comments

厳守してるわけじゃないですが、なんとなくこんなリズムでコードを書くようにしています。

  • 朝はデバッグ
  • 午後はテスト、ドキュメントを書く
  • 夜は新しいコードを書く

朝は脳が冴えていて、前日仕込んだバグが嘘のようによく取れます。

午後は眠くなるので、あまり脳を使わないテストやドキュメントを書きます。 単調な作業への反動でいいアイディアをひらめいたりします。Yakです。

夜は創造の時間です。新しいことに取り組みます。行き止まりだと思っていたところに道が開けます。

posted by Png genki on Mon 12 Apr 2010 at 18:41

Valgrindを使うとメモリリークの検出などを行うことができて便利ですが、 OSやライブラリに起因するメモリリークのレポートが大量に出てくると邪魔なため、backtraceのパターンを指定して抑制(suppress)することができます。

例)valgrind.supp

   1  {
   2     <insert_a_suppression_name_here>
   3     Memcheck:Leak
   4     fun:malloc
   5     fun:_nc_table_insert_n
   6     fun:token_table_add
   7     fun:notify_register_check
   8     fun:notify_register_tz
   9     fun:tzsetwall_basic
  10     fun:localtime
  11     fun:ctime
  12  }

funはbacktrace上の関数名を示しますが、全体をマッチさせる場合、 呼び出し経路ごとに異なったパターンになるため、 沢山登録する必要が出てきてしまいます。

最新のValgrind(valgrind-3.6.0.SVNで確認)では、 "..." 記法によって中間のパターン指定を省略することが できるようになりました。 これを使用すると、先程の例は以下のように書き直せます。

   1  {
   2     <insert_a_suppression_name_here>
   3     Memcheck:Leak
   4     fun:malloc
   5     ...
   6     fun:localtime
   7  }

localtime関数を呼び出したあとに、内部のmalloc呼び出しで 発生したメモリリークを全部一括で抑制できます。便利ですね。

posted by Png genki on Mon 5 Apr 2010 at 14:42

残念ながら現時点のSVNのtrunkを使っても、SnowLeopardにValgrindをインストールしようとすると configure時にエラーが出ますが、以下のパッチをあてることでインストールできるようになるようです。

方法:

   1  % svn co svn://svn.valgrind.org/valgrind/trunk -r 11100 valgrind
   2  % cd valgrind
   3  % wget "http://bugsfiles.kde.org/attachment.cgi?id=36999" -O thepatch
   4  % cat thepatch | patch -p0
   5  % ./autogen.sh
   6  % ./configure
   7  % make
   8  # make install

これでokです。

posted by Png genki on Mon 5 Apr 2010 at 10:25

このブログシステムは長いことapache2/passengerで運用してきましたが、 頻繁にrubyプロセスが暴走してアクセスできなくなるということが発生していたので、apache2/mod_proxy_balancer/mongrel_clusterの構成に変えてみました。

しばらく様子見です。

posted by Png genki on Sat 3 Apr 2010 at 21:38

CUDA 3.0がリリースされましたが、今回からOpenCL SDKも同梱されて /Developer/GPU Computing/OpenCL にインストールされるようになりました。

CUDA ("C"ディレクトリの中身)はmakeでsampleが普通にビルドできたのですが、OpenCLの方は以下のようなエラーが出ます。

   1  src/oclUtils.cpp: In function ‘void oclPrintDevInfo(int, _cl_device_id*)’:
   2  src/oclUtils.cpp:282: error: ‘CL_DEVICE_COMPUTE_CAPABILITY_MAJOR_NV’ was not declared in this scope
   3  src/oclUtils.cpp:283: error: ‘CL_DEVICE_COMPUTE_CAPABILITY_MINOR_NV’ was not declared in this scope
   4  src/oclUtils.cpp:290: error: ‘CL_DEVICE_REGISTERS_PER_BLOCK_NV’ was not declared in this scope
   5  src/oclUtils.cpp:294: error: ‘CL_DEVICE_WARP_SIZE_NV’ was not declared in this scope
   6  src/oclUtils.cpp:298: error: ‘CL_DEVICE_GPU_OVERLAP_NV’ was not declared in this scope
   7  src/oclUtils.cpp:302: error: ‘CL_DEVICE_KERNEL_EXEC_TIMEOUT_NV’ was not declared in this scope
   8  src/oclUtils.cpp:306: error: ‘CL_DEVICE_INTEGRATED_MEMORY_NV’ was not declared in this scope
   9  make: *** [obj/release/oclUtils.cpp.o] Error 1

これらの定数はSDK同梱のcommon/inc/cl_ext.h の中で定義されているのですが、どうやら /System/Library/Frameworks/OpenCL.framework/Headers の方を参照してしまっているようで、こちらには定数が定義されていないようです。

posted by Png genki on Fri 2 Apr 2010 at 04:16