Hatena::Groupsubtech

名称未設定♥

|

2009-03-08

Perlで、占有しているメモリ量をpackage毎に知る方法

23:37 |  Perlで、占有しているメモリ量をpackage毎に知る方法 - 名称未設定♥ を含むブックマーク はてなブックマーク -  Perlで、占有しているメモリ量をpackage毎に知る方法 - 名称未設定♥

Apache2::Status では、条件が揃えば package 毎に喰ってるメモリ量を知ることができます。

StatusTerseSizeMainSummary

With this option On and the B::TerseSize module installed, a "Memory Usage" will be added to the Apache2::Status main menu. This option is disabled by default, as it can be rather cpu intensive to summarize memory usage for the entire server. It is strongly suggested that this option only be used with a development server running in -X mode, as the results will be cached.

mod_perl: Apache2::Status - Embedded interpreter status information

mod_perl環境、普通のスクリプトとか、Perlで書いたdaemonでも使えるといいなと思ったので、ソースみてコピペってみました。

use B::TerseSize;
use Devel::Symdump;

my $stab = Devel::Symdump->rnew("main");
my %size;
for my $package ("main", $stab->packages) {
    my($subs, $opcount, $opsize) = B::TerseSize::package_size($package);
    $size{$package} = $opsize;
}
for my $package (sort {$size{$b}<=>$size{$a}} keys %size) {
    printf "%-24s %8d [KB]\n", $package, $size{$package}/1024;
}

ENDブロックでくるんでスクリプトが終了するときにサマリを出力するようにしたり、シグナルハンドラで出力するようにするといいんじゃないかと思います。

see also

トラックバック - http://subtech.g.hatena.ne.jp/hirose31/20090308

2008-06-17

Erlangのナベアツ#2 - ちょっと分解

| 17:31 |  Erlangのナベアツ#2 - ちょっと分解 - 名称未設定♥ を含むブックマーク はてなブックマーク -  Erlangのナベアツ#2 - ちょっと分解 - 名称未設定♥

アホだけでなくて犬のこともあるので、Mの倍数の判定とMを含むかどうかの判定の関数を外だししてみました。

-module(nabe_atzz3).
-export([start/0, nabe_atzz/0, nabe_atzz/1]).

aho_nano_ka(N) ->
    case multiple(N, 3) orelse contain(N, 3) of
        true ->
            true;
        _ ->
            false
    end.

multiple(N, M) ->
    N rem M =:= 0.

contain(N, M) ->
    case lists:filter(fun(Nch) -> Nch =:= M + 16#30 end,
                      integer_to_list(N)) of
        [] ->
            false;
        _ ->
            true
    end.

contain_(N, M) ->
    case string:chr(integer_to_list(N), M + 16#30) of
        0 ->
            false;
        _ ->
            true
    end.

%% 以下同文

contain()ではlists:filterとfun(無名関数的なもの?)を使ってみたかったので使ってますが、contain_()のようにstring:chr使った方がいいかもしれませぬ。

トラックバック - http://subtech.g.hatena.ne.jp/hirose31/20080617

2008-06-16

Erlangのナベアツ#1 - まずはベタに

| 04:07 |  Erlangのナベアツ#1 - まずはベタに - 名称未設定♥ を含むブックマーク はてなブックマーク -  Erlangのナベアツ#1 - まずはベタに - 名称未設定♥

まずはベタに実装してみました。

  • nabe_atzz1.erl
-module(nabe_atzz1).
-export([start/0, nabe_atzz/0, nabe_atzz/1]).

aho_nano_ka(N) ->
    N rem 3 =:= 0 orelse aho_nano_ka($3, integer_to_list(N)).

aho_nano_ka(X, [X|_]) ->
    true;
aho_nano_ka(X, [_|T]) ->
    aho_nano_ka(X, T);
aho_nano_ka(_, []) ->
    false.

nabe_atzz() ->
    nabe_atzz(40).

nabe_atzz(CountTo) ->
    nabe_atzz(1, CountTo + 1).

nabe_atzz(CountTo, CountTo) ->
    io:format("\nfinished\n",[]);
nabe_atzz(Counter, CountTo) ->
    case aho_nano_ka(Counter) of
        true ->
            io:format("~p! ", [Counter]);
        false ->
            io:format("~p ", [Counter])
    end,
    nabe_atzz(Counter + 1, CountTo).

start() ->
    nabe_atzz().

実行の仕方はこんな感じ:

対話的に実行する場合は、erlの中で、c(nabe_atzz1)でコンパイルして、エントリポイントであるnabe_atzz1:start()を実行してます。

$ erl
Erlang (BEAM) emulator version 5.5.2 [source] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.5.2  (abort with ^G)
1> c(nabe_atzz1).
{ok,nabe_atzz1}
2> nabe_atzz1:start().
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! 31! 32! 33! 34! 35! 36! 37! 38! 39! 40
finished
ok

コマンドラインでバッチで実行する場合は、erlcでコンパイルして、成功したらerlコマンドで実行します。-sオプションは、指定された関数をその順番で実行します。なので、この例だとnabe_atzz1:start()を実行して、次にinit:stop()を実行してるのと同じです。

$ erlc nabe_atzz1.erl && erl -noshell -s nabe_atzz1 start -s init stop
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! 31! 32! 33! 34! 35! 36! 37! 38! 39! 40
finished

細かいこと破棄にせずざっくり説明すると、

nabe_atzz()関数は引数の数(arityというそうです)が異なる(0,1,2個)のを3つ定義します。

引数0個のはデフォルト値で引数1個のを呼ぶだけ。

引数1個のは引数2個の呼ぶだけ。

引数2個のが本体。んで、引数の数(二度目ですが、arityというそうです)が同じでも、引数のパターンマッチ具合いによって複数の定義が書けます。nabe_atzz(CountTo, CountTo)は、カウンタが「なんぼまで数えろ」数と同じになった場合の引数を表現してます。で、これが終了条件になるので、その旨、印字しておわり。ほんで、そうじゃないほうのnabe_atzz(Counter, CountTo)が実のある方で、aho_nano_ka(Counter)でアホになるかどうかの判定をして結果を印字して、最後にカウンタを増やして再帰呼び出しします。

次、aho-nano_ka()。

1引数のaho_nano_ka()では、まず3の倍数かチェックして、そうでなければ(orelseはore-lse[おれ-えるせ]ではなくor-else[おあ-えるす]です)、2引数のaho_nano_ka()で3を含むか判定してます。

$3は、Cでのprintf("%d\n", '3')と同じです。

integer_to_list(N)は数値をリストにばらします。例えばinteger_to_list(13)は、[$1,$3]な感じのリストになります。ちなみにErlangでは文字列はリストなので、リスト[$1,$3]は文字列"13"と同じらしいです。

2引数のaho_nano_ka()は3つあります。

aho_nano_ka(X, [X|_])は、aho_nano_ka($3, [$3, なにか])というケースで、これは3を含んでいるってことになるのでtrueを返しておわりです。

aho_nano_ka(X, [_|T])は、aho_nano_ka($3, [3以外のなにか,なにか])というケースで、まだ3を含むかわからないので、2つめの引数のリストの最初の要素を削って、再帰的にaho_nano_ka($3, なにか)を呼んでます。

aho_nano_ka(_, [])が終了条件で、2つめの引数がからのリストになったらfalseを返しておしまいです。

今回の厨ポイント

  • 同名の関数でも、
    • arityが違う
    • または、arityが同じでも、パターンが違う
  • と、複数定義できます。
  • 特に、リストの先っちょを削って再帰ィィってあたりにグっときました。

Erlangのナベアツ#0 - ゴールはこれ

| 04:07 |  Erlangのナベアツ#0 - ゴールはこれ - 名称未設定♥ を含むブックマーク はてなブックマーク -  Erlangのナベアツ#0 - ゴールはこれ - 名称未設定♥

こんにちは。Erlang厨です。

Hello, Worldに続く「言語覚えたらまずはこれ書け!org」との呼び声が高いNabeAtzzですが、「世界の」と関するわりには未だinternationalなルールが存在しません(と思う)。

なので今回は wikipedia:世界のナベアツ を参考にして、当面は

  • 「3の倍数と3が付く数字のときだけアホになります」

を、余力があれば

  • 「3の倍数と3が付く数字だけアホになり、5の倍数だけ犬っぽくなります」

も実装したいと思います。Erlangで。

なんでErlangかというと、入門書を読んでいたく感動し、なにかコードを書きたくなったからです。小二ですね。小二万歳。

BuffyBuffy2011/12/12 21:23I want to send you an award for most helpful internet wiertr.

awktcjawktcj2011/12/13 18:16gWw7Hy <a href="http://lywunpkiyklh.com/">lywunpkiyklh</a>

bjhjxhcrbjhjxhcr2011/12/14 17:45KGA7Td , [url=http://nqwnzvsamtwf.com/]nqwnzvsamtwf[/url], [link=http://xizticthbmmq.com/]xizticthbmmq[/link], http://ipkoykpajzwp.com/

axzyuakksaaxzyuakksa2011/12/15 03:09t04hQK <a href="http://gwmrggupgtfa.com/">gwmrggupgtfa</a>

abwhgbymtabwhgbymt2011/12/15 21:03uKeLVA , [url=http://awpvssmmuugu.com/]awpvssmmuugu[/url], [link=http://bououjnlxqxd.com/]bououjnlxqxd[/link], http://lxsnzteidcnx.com/

AgathaAgatha2016/05/02 06:44Stands back from the keyboard in ameztmane! Thanks!

トラックバック - http://subtech.g.hatena.ne.jp/hirose31/20080616

2008-06-12

依存モジュールの指定漏れを防ぐ方法

| 20:44 |  依存モジュールの指定漏れを防ぐ方法 - 名称未設定♥ を含むブックマーク はてなブックマーク -  依存モジュールの指定漏れを防ぐ方法 - 名称未設定♥

CPANモジュールの場合、Makefile.PLで依存モジュールの指定ができるわけなんですが結構指定し忘れちゃいます。ぼくも何度か指定し忘れてCPAN Testersでエラーになって初めて気がついたり、ほかの人のモジュールに漏れ輝夫と指摘したこともあります。

理由を考えてみると、コード書いてるときにuseするたんびにMakefile.PLにいって追記するのはめんどいんで後で書けばいいかーと思ってると、開発している環境にはモジュールがMORIMORI入ってるんでperl Makefile.PL && make時にエラーにならず漏れに気がつかないのでそのままshipitということになるんではないかなーと思います。ぼくはそうです。

というようなことを#codereposでつぶやいたらいい解決法を教えてもらいました。

たとえば、自作のモジュールMoyan::Daisukiがあるとします。

ディレクトリMoyan-Daisuki/t/の下にはテストスクリプトがあると思うのですが、そこにx97-dependencies.tという名前でファイルを作ります。中身はこんな感じ:

use Test::Dependencies
    exclude => [qw(Test::Dependencies Test::Base Test::Perl::Critic
                   Mouyan::Daisuki)],
    style   => 'light';
ok_dependencies();

ほんで、make testやprove -lv t/x97-dependencies.tを実行すると、lib/Moyan/Daisuki.pmとかがuseしているにも関わらず、Makefile.PLにその指定がないモジュール(ただし、excludeで列挙したものは除く)がある場合はテストに失敗します。

ecludeには自分自身のモジュール名と、リリースパッケージでは必要のないモジュール(例えば、プライベートテストで使うモジュールとか)を列挙します。

styleを'heavy'にすると、B::PerlReqなどを使ってより厳密にチェックを行うんですが、反面、テストに結構時間がかかるようになりますのでお好みでどうぞ。

あと、このテスト(x97-dependencies.t)は、モジュールをパッケージングする人には必要ですが、モジュールを使う人には不要なものなので、ぼくはMANIFEST.SKIPに

^t/x\d+.*\.t

と書いて、リリースパッケージには含めないようにしています。

まとめ

漏れるとかっこわるいので漏らさないようにしましょう。

ConyersConyers2011/12/14 12:32Gee whiz, and I tuhoght this would be hard to find out.

yasxtcuhyasxtcuh2011/12/14 21:33xV5hWq <a href="http://jyylydkgdxux.com/">jyylydkgdxux</a>

hnndxgxshekhnndxgxshek2011/12/15 22:23flznsB , [url=http://afolbulpfopx.com/]afolbulpfopx[/url], [link=http://lqsqmnzqmkbo.com/]lqsqmnzqmkbo[/link], http://dqcizgfodidd.com/

bymppdgzxzbymppdgzxz2011/12/16 20:14LmBzN4 <a href="http://dpzyuqonqjvi.com/">dpzyuqonqjvi</a>

2008-05-27

はじめてのXS #7 - Perlバージョン毎のAPIの差異を吸収するにはppport.hを使えばおk

| 15:20 |  はじめてのXS #7 - Perlバージョン毎のAPIの差異を吸収するにはppport.hを使えばおk - 名称未設定♥ を含むブックマーク はてなブックマーク -  はじめてのXS #7 - Perlバージョン毎のAPIの差異を吸収するにはppport.hを使えばおk - 名称未設定♥

前回「NewxzがPerl 5.8.4で使えなかったのでNewzにしました。(#ifで分岐させたいけどPerlのバージョンが入ってるmakeの変数がわからなす[あとで調べる])」と書いたところ、id:lestrrat さん(お世話になりっぱなしです><)から「Perlバージョン毎の互換性はDevel::PPPortで確保ですよ!」と啓示を賜ったので、さっそくみてみました。

っていうか、前からXS.xsではinclude "ppport.h"していた(h2xs -A -n MODULENAMEかなんかで雛形作ったからかも)んですが、入っていたDevel-PPPortのバージョンが古かったというオチ。

$ cpan install Devel::PPPort
$ perl -MDevel::PPPort -e 'Devel::PPPort::WriteFile()'

でナウいppport.hができます。これで前はNewxzエラった環境でビルドしてもOKになりました!

このへんの「めんどうくささ」を省くモノをだれかが作ってくれてるってのがさすがPerlだなって思います。


あと、全然関係ないっすけど、anything.el便利すなぁ

トラックバック - http://subtech.g.hatena.ne.jp/hirose31/20080527
|