end0tknr's kipple - web写経開発

太宰府天満宮の狛犬って、妙にカワイイ

perlとjavascriptのメトリクス計測

perl メトリクス」「javascript メトリクス」でググると、同じ方のidがトップに表示されたので、参考...というか写経。
Perlのメトリクス計測 - WebService::Blog->new( user => ’hide_o_55’ )
JavaScriptコードのメトリクス測定 - WebService::Blog->new( user => ’hide_o_55’ )

perlであればPerl::Metrics::Simple

Perl-Metrics-Simple-0.18 - Count packages, subs, lines, etc. of many files. - metacpan.org

$ wget http://search.cpan.org/CPAN/authors/id/M/MA/MATISSE/Perl-Metrics-Simple-0.15.tar.gz
$ tar -zxvf Perl-Metrics-Simple-0.15.tar.gz
$ cd Perl-Metrics-Simple-0.15
$ /usr/local/bin/perl Makefile.PL
$ make
$ make test
$ su
# make install

↑このようにbuild & install すると、countperl というコマンドラインツールが /usr/local/bin/countperl にinstallされるので、次のように実行すると、McCabe Complexity (= cyclomatic complexity)という複雑度が表示されます。

$ /usr/local/bin/countperl TestTarget.pm

Perl files found:                1

Counts
------
total code lines:        620
lines of non-sub code:   12
packages found:          1
subs/methods:            30

Subroutine/Method Size
----------------------
min:                  5 lines
max:                  65 lines
mean:                 20.27 lines
std. deviation:       13.61
median:               17.00

McCabe Complexity
-----------------
Code not in any subroutine::
min:                  1
max                   1
mean:                 1.00
std. deviation:       0.00
median:               1.00

Subroutines/Methods:
min:                  1
max:                  16
mean:                 4.97
std. deviation:       4.38
median:               3.00

Tab-delimited list of subroutines, with most complex at top
-----------------------------------------------------------
complexity	sub		path		size
16	select_cloth_meisais	./TestTarget.pm	65
14	init_cloth_shade_h	./TestTarget.pm	40
13	calc_win_id		./TestTarget.pm	40
13	init_clothes		./TestTarget.pm	45
13	init_cloth_shade_v	./TestTarget.pm	44
9	last_win_id_strs	./TestTarget.pm	16
7	init_sews		./TestTarget.pm	30
6	get_cloth		./TestTarget.pm	20
6	dist_win_id		./TestTarget.pm	27
5	add_clothes		./TestTarget.pm	14
<略>

javascriptであればjsmeter

jsmeterは nodejsを必要とする為、今回は nodejs や jsmeter を /Users/endo/local 以下に install しています。

まずは、nodejs

$ wget http://nodejs.org/dist/v0.8.12/node-v0.8.12.tar.gz
$ tar -zxvf node-v0.8.12.tar.gz
$ cd node-v0.8.12
$ ./configure --prefix=/Users/endo/local/node
$ make
$ make install

http://nodejs.org/
https://github.com/joyent/node/wiki/Installation

nodejsへのパスを追加.

$vi /Users/endo/.bash_profile
old) export PATH=/usr/local/bin:$PATH
new) export PATH=/Users/endo/local/node/bin:/usr/local/bin:$PATH

次に jsmeter.

$ cd /Users/endo/local
$ /Users/endo/local/node/bin/npm install jsmeter@1.0.0
npm http GET https://registry.npmjs.org/jsmeter/1.0.0
npm http 200 https://registry.npmjs.org/jsmeter/1.0.0
npm http GET https://registry.npmjs.org/jsmeter/-/jsmeter-1.0.0.tgz
npm http 200 https://registry.npmjs.org/jsmeter/-/jsmeter-1.0.0.tgz
npm WARN package.json jsmeter@1.0.0 No README.md file found!
jsmeter@1.0.0 node_modules/jsmeter

※ver.1.0.1にはバグがあるらしくver.1.0.0を使用しています
wget http://jsmeter.googlecode.com/files/jsmeter.tgz してから
 npm install ./jsmeter.tgz のようにローカルにあるfileをinstallできないの?

http://code.google.com/p/jsmeter/
https://npmjs.org/

これで準備が完了したので、次のように実行すると、メトリクスが表示されます。
※M.I. や (Anonymous1) って何?

$ node ~/local/node_modules/jsmeter/jsmeter.js ./TestTarget.js 
./TestTarget.js 
 line start: 1
 lines:      706
 statements: 471
 comments:   34
 complexity: 1
 M.I.:       95.286
./TestTarget.js (Anonymous1)
 line start: 1
 lines:      706
 statements: 470
 comments:   34
 complexity: 31
 M.I.:       60.301
./TestTarget.js (Anonymous1).TestTarget
 line start: 2
 lines:      1
 statements: 0
 comments:   0
 complexity: 1
 M.I.:       NaN
./TestTarget.js (Anonymous1).act_del
 line start: 7
 lines:      24
 statements: 17
 comments:   1
 complexity: 2
 M.I.:       100.37
./TestTarget.js (Anonymous1).get_input_clothes
 line start: 115
 lines:      13
 statements: 10
 comments:   0
 complexity: 2
 M.I.:       116.01
./TestTarget.js (Anonymous1).get_input_clothes.(Anonymous1)
 line start: 117
 lines:      7
 statements: 6
 comments:   0
 complexity: 1
 M.I.:       123.23
./TestTarget.js (Anonymous1).get_input_clothes.(Anonymous1).(Anonymous1)
 line start: 121
 lines:      3
 statements: 1
 comments:   0
 complexity: 1
 M.I.:       138.24
<略>

nodejsやnpmは初めて触りましたが、このノリでいいの?

jsmeterはweb serviceとしても公開されているようです

http://jsmeter.info/