ギークバーに行ってきた

今回は,JVM について調べていた.

hello.j


.class public hello
.super java/lang/Object

.method public <init>()V
aload_0
invokenonvirtual java/lang/Object/<init>()V
return
.end method

.method public static main([Ljava/lang/String;)V
.limit stack 2
getstatic java/lang/System/out Ljava/io/PrintStream;
ldc "Hello, World!"
invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V
return
.end method

ちょっと真面目に書くとこんな感じ

public class hello extends java.lang.Object {
    public void hello() {
        super();
    }

    public static void main(java.lang.String[] args) {
        java.io.PrintStream p = java.lang.System.out;
        java.lang.String s = "Hello, World!";
        p.println(s);
    }
}
続きを読む

名古屋ギークバーに行ってきた

麻雀回でした

とりあえず,Perl6 のNagoya.pm でやってた続きをする.
必要な機能は,テストから調べる.ことはわかったので
普通のプログラミングで必要なことを考える.

今は遅いのをなんとかしたいので,プロファイラかな.ぐぐる

docs/dev/profiling.pod - Profiling Parrot

# Copyright (C) 2001-2005, Parrot Foundation.

=head1 NAME

docs/dev/profiling.pod - Profiling Parrot

=head1 DESCRIPTION

このファイルは,Parrot のプロファイリング実行部分の使用方法について記述している.

=head2 Summary

プロファイル実行環境は,Parrot の一部として作られており,PIRコードのボトルネックを発見できるように設計されています.HLL(?)プロファイルをサポートするために実装されていますが,現在では制限があります.C<parrot>バイナリィに C<-Rprofiling> や C<--runcore profiling>を渡すことで,コードはプロファイリング実行環境下で実行されます.出力ファイルの位置とフォーマットは,次に記述されるように環境変数によって決定されます.プロファイリング実行環境が関連する環境変数を発見できない場合は,次で書かれるようなデフォルト値を使います.

=head2 環境変数

=over 4

=item C<PARROT_PROFILING_FILENAME>

もしあれば,出力が書かれるファイルの完全な名前を決定します.Parrot は,書くために開く前にファイル名が存在するかどうかをチェックをせず,以前のプロファイルが含む既存のファイルを偶然にも上書きしてしまうでしょう.

値が設定されていなければ,Parrot はファイルをC<parrot.pprof.X> に書き出します.ここで,X はParrot プロセスのPID です.プロファイリング実行部分が存在する場合,プロファイルが書かれるときにアナウンスするメッセージを出力します.

この変数は,C<stdout> や C<stderr> という特殊な値を持つこともできます.それらの値のどちらかが(大文字小文字に関係無く) 見つかった場合,Parrot はプロファイリングの結果をstdout か stderr に出力します.

=item C<PARROT_PROFILING_OUTPUT>

これは,プロファイルを含む出力のタイプを決定します.現在のオプションは,C<pprof> と C<none>です.C<pprof> は,デフォルトであり,ASCII 文字であるため,人間が読めるような形式です.これは,tools/dev/pprof2cg.pl によって後処理して,Callgrind 互換のフォーマットに変換できます.C<none> は,結果ファイルを書き出しません.これは,主にプロファイリングの実行部分自身のテストや最適化にとって有用です.これは,PIR とHLL コードをプロファイルしたいユーザにとってあまり意味がないことを期待されています.

=item C<PARROT_PROFILING_ANNOTATIONS>

これは,PIR アノテーションがプロファイルの一部として記録されるように設定します.アノテーションは,HLL コードをプロファイリングするのに必要ですが,プロファイリングの実行部分をより遅くします.デフォルトでは,それらは無効です.それらを有効にするために,この値を設定します.

=item C<PARROT_PROFILING_CANONICAL_OUPUT>

これが設定されている場合,プロファイリングの実行部分は,全てのアドレスを1つの定数値として,全ての時刻を1として記録します.このオプションは,与えられたコードの部分が常に同じプロファイルを正確に生成することを保証する方法があると便利な場所,主にテスト用に便利です.この機能を有効にしたい場合,多分ランダムなハッシュシードに起因する非決定的な振舞いを避けるために C<--hash-seed 1324> を使ってParrot に特定のハッシュシードも渡したいと思うでしょう.

この変数はテストやプロファイリングの実行部分から離れては有用ではありません.そしてユーザのコードのホットスポットを見つけるために殆ど確実に助けにもなりません.

=back

=cut

つまり,Cバイナリィに C<-Rprofiling> や C<--runcore profiling> を渡すということですね.

で,よく見ると /rakudo-star-2011.07/parrot-3.6.0/tools/dev/pprof2cg.pl に,pod もあった.

$ parrot -Rprofiling <workdir>/rakudo-star-2011.07/install/lib/parrot/3.6.0/languages/perl6/perl6.pbc <scriptname>
$ perl <workdir>/rakudo-star-2011.07/install/lib/parrot/3.6.0/tools/dev/pprof2cg.pl parrot.pprof.XX

pprof2cg.pl は,Callgrind-compatible 互換ファイルを出力するらしいので
valgrind をインストールしたけど,そもそもcallgrind のファイル見るのは,
kcachegrind だった…

$ sudo brew install --HEAD valgrind     # Lion だとhead しか対応してなかった
$ sudo brew install qt --with-qt3support
$ rehash
$ wget http://kcachegrind.sourceforge.net/kcachegrind-0.7.0.tar.gz
$ tar xf kcachegrind-0.7.0.tar.gz
$ cd kcachegrind-0.7.0/qcachegrind
$ qmake
$ make
$ ./qcachegrind.app/Contents/MacOS/qcachegrind

これで parrot.out.$PID ファイルが読めます.

ご参考

で見てみたんだけど,

これは,Perl6;Perl6Role;ACCEPTS(Role.pir) に時間がかかってるんですよね?

次はpir を読む流れ?

PEG を見よというおつげを頂いた

  • 10/22 valgrand の辺を追記

DevQuiz 回答さらし - webgame

基本スライドパズルをさらすことはわかってるけど,
あえてwebgame にしてみる.

無駄にjQuery を使ってます.
ようは,回答が書いてあるからそれを使った感じです.

body から取れればrequest が減るので速くなるかもな〜
ということで,誰か教えてください.

Nagoya.pm #01 をやりました

ニューキャストさんとこで,
Nagoya.pm#01 を開催しました.
なるべく質問しやすいようにしたいと思ってやってみたけど
どうだったかな?

開催してみれば,2人でしか居ないかもと思いきや,
意外にも遠方から来てくださる方もいたし,
時間も余っちゃうんじゃないかと思ってたのですけど,
飛び入りもあったりして,参加者のみなさまに感謝です.


で,今後なんですけど,11月に第2回を開催したい感じです.
あと発表者も募集中なので,何かあれば連絡してください.


次回は,Apache の設定の話がいいとか,Git の話がいいとか言われてます.
Nagoya.pm の明日はどっちだ?

symfony 1系でカバレッジをだす

このエントリは忘備録的な感じです.
本当は違うところの調査がしたかったのだった.


symfony 1系では,テストのカバレッジを出すタスクがあるんだけど,
Jenkins で見れるフォーマットじゃない感じ.


rsPHPUnitLimePlugin ってのがあってよしなにしてくれるらしい.


とりあえず入れてみる*1

$ git submodule add https://github.com/digitalkaoz/rsPHPUnitLimePlugin.git plugins/rsPHPUnitLimePlugin
$ vi config/ProjectConfiguration.class.php
$ git diff
diff --git a/config/ProjectConfiguration.class.php b/config/ProjectConfiguration.class.php
index 24e9ec0..d1cf7e5 100644
--- a/config/ProjectConfiguration.class.php
+++ b/config/ProjectConfiguration.class.php
@@ -8,5 +8,6 @@ class ProjectConfiguration extends sfProjectConfiguration
   public function setup()
   {
     $this->enablePlugins('sfDoctrinePlugin');
+    $this->enablePlugins('rsPHPUnitLimePlugin');
   }
 }


PHP_CodeCoverage が要求されるので入れる.
けどPHP 5.2.6 を使ってたら面倒だった.*2
PHP_CodeCoverage とかのplugin が5.2.7 を要求してきたので
手動で入れたらとりあえず動いてるみたい.
あとclass redefine とか言われたので修正

$ pear channel-discover pear.phpunit.de
$ cd ~/work
$ git clone https://github.com/sebastianbergmann/php-code-coverage.git
$ git clone https://github.com/sebastianbergmann/php-token-stream.git
$ cd /usr/lib/php
$ mkdir PHP
$ cd PHP
$ ln -s ~/work/php-code-coverage/PHP/* .
$ ln -s ~/work/php-token-stream/PHP/* .
$ pear install phpunit/File_Iterator
$ pear install phpunit/PHP_TokenStream
$ pear install phpunit/PHPUnit
$ pear install phpunit/Text_Template
$ cp PHPUnit/Framework.php{,.org}
$ vi PHPUnit/Frameworkk.php
$ diff PHPUnit/Framework.php{.org,}
61c61
< require 'PHPUnit/Framework/TestListener.php';
---
> require_once 'PHPUnit/Framework/TestListener.php';


これでJenkins のCloverPHP plugin から見れるようになった.


これだとrsPHPUnitLimePlugin のcoverage が出ちゃって面白くないので無効にしたいところ.

2011-08-13 追記

lib/test/LimeCodeCoverage.php の$blackList を編集すればいいんだけど
config とかで定義できるようにしておきたい気もするけどまだやってない感じ.

*1:普通にplugin:install でいいです

*2:5.2.7以降の人はpear installすればいいと思う.試してない