2013年12月3日火曜日

Perl関連のサイトのメモ

最近、見始めたサイトです。英語圏のPerl関連のニュースがまとまってていい感じです。

advent calendar 2013も始まりました。

野田さんが可愛かったので

新人女子プログラマの書いたコードを直すだけの簡単なお仕事です!|paizaオンラインハッカソンVol.1を、やってみました。

E判定

hirontさん、ある意味凄いコードですね。新人の私でもそうそうこんなコードかけませんよ。。

E判定より
S判定

hirontさん、凄いコードですねっ!!私にはこんな効率のいいコード書けませんっ!

S判定より

野田s……涙拭いてもいいですか。

2013年12月1日日曜日

Perlでwithな感じ

あなたがLispを無視することができない理由より、Perlでは構文解析が必要とのことだったので、素のPerlで書けるか試してみる。

use 5.016;
use warnings;

package _Alias;

sub TIESCALAR { bless \(my $dmy = \($_[1])), $_[0] }
sub FETCH { ${${$_[0]}} }
sub STORE { ${${$_[0]}} = $_[1] }

package main;

sub args {
    my @list = map{ \$_ } @_;
    return sub {
        foreach(@list){
            tie ${$_}, '_Alias' => shift();
        }
    };
}

sub with {
    my ($methods, $hash, $f) = @_;
    sub{
        foreach(@{$methods}){
            tie $_[@_], '_Alias' => $hash->{$_};
        }
        goto $f;
    }->();
}

my $me = { name => "foobar", age => 26 };

with([qw(age)] => $me, sub{
    args(my $age)->(@_);
    $age++;
});

with([qw(name age)] => $me, sub{
    args(my ($name, $age))->(@_);
    printf("I'm %s. %d years old.\n", $name, $age);
});

書けない事はないけど……という感じです。

2013年11月22日金曜日

feedlyのマガジン表示のスタイルを少し変更

feedlyをマガジンタイプで表示しているとき、Skipが押しにくかったので、Stylishで改善してみる。

@namespace url(http://www.w3.org/1999/xhtml);

@-moz-document domain("feedly.com") {
    div.metadata {
        overflow: visible !important;
    }
    span.wikiBar {
        display: block;
        visibility: visible !important;
        font-weight: bolder;
        font-size: 120%;
    }
    span.wikiBar > span {
        display: inline-block;
        padding: 0.2em;
    }
}

2013年11月17日日曜日

UDP echo server with Perl

Socket

use Socket;

my $port = 50001;
my $servaddr = sockaddr_in($port, INADDR_ANY);
my $proto = getprotobyname('udp');
socket(my $sock, AF_INET, SOCK_DGRAM, $proto) or die $!;
bind($sock, $servaddr) or die $!;

my $max_line = 4096;

while(1){
    my $cliaddr = recv($sock, my $message, $max_line, 0) or die $!;
    (my $mesg = $message) =~ s/\r?\n//;
    send($sock, qq{You said:"$mesg"\n}, 0, $cliaddr) or die $!;
}

参照: W. Richard Stevens,1998,UNIX NETWORK PROGRAMMING Volume1 SecondEdition,Prentice Hall,W・リチャード・スティーブンス 篠田 陽一(訳),1999,UNIXネットワークプログラミング第2版 Vol.1,ピアソン・エデュケーション,p.208

Net::Server

package _MyServer;
use parent 'Net::Server';

sub process_request {
    my $self = shift;
    my $prop = $self->{server};
    (my $message = $prop->{udp_data}) =~ s/\r?\n//;
    $prop->{client}->send(qq{You said:"$message"\n}, 0);
}

package main;

_MyServer->new->run(port => ":50001/udp");

参照: http://cpansearch.perl.org/src/RHANDOM/Net-Server-2.007/examples/udp_server.pl

IO::Socket::Inet

use IO::Socket::INET;

my $server = IO::Socket::INET->new(
    LocalPort => 50001,
    Proto     => 'udp',
) or die $!;

my $max_line = 4096;
while($server->recv(my $message, $max_line, 0)){
    (my $mesg = $message) =~ s/\r?\n//;
    $server->send(qq{You said:"$mesg"\n}) or die $!;
}

参照: Tom Christiansen and Nathan Torkington,1998,Perl Cookbook,O'Reilly,トム・クリスチャンセン ネイザン・トーキントン 田和 勝(訳),2001,Perlクックブック,オライリージャパン,p.629

AnyEvent::Handle::UDP

use AnyEvent;
use AnyEvent::Handle::UDP;

my $udp_server = AnyEvent::Handle::UDP->new(
    bind => ['0.0.0.0', 50001],
    on_recv => sub{
        my ($message, $ae_handle, $cliaddr) = @_;
        (my $mesg = $message) =~ s/\r?\n//;
        $ae_handle->push_send(qq{You said:"$mesg"\n}, $cliaddr);
    }
);

my $condvar = AnyEvent->condvar;
$condvar->recv;

参照: http://cpansearch.perl.org/src/LEONT/AnyEvent-Handle-UDP-0.043/examples/anyevent-udp-server.pl

2013年5月23日木曜日

jumanを使ってみた

Windows8でJUMAN7.0をサーバで使ってみたのですが、quitで抜ける段階でサーバがクラッシュする模様。とりあえず、裏(virtualBOX)で動いてるDebianで使うことにしたのですが、バージョンが若干古くて、しょんぼり。
jumanサーバの使い方を大雑把に。
  1. コネクトすると、ステータスコード200と共にバージョン情報が送られてくる
  2. コマンドループに入るので、"run"を送る
  3. ステータスコード200が返ってくる
  4.  解析したい文字列を送る
  5. 解析結果が返ってくる
  6. 解析を終えるには、Ctrl-K(\x0b)を送る
  7. "\x0b"が返ってくる
  8. コマンドループに入るので、"quit"を送る
  9. ステータスコード205が返ってくる
エラーの場合、ステータスコードは500が出るようです。詳しくは、付属のPDFのマニュアルの「D JUMANサーバのプロトコルの概要」を参照のこと。文字セットについては、Windows版はCP932になるようです。

2013年5月4日土曜日

Firefoxの終了時に謎のプロセスが走る

Firefoxの終了時に謎のコマンドプロンプトが起動するようになった。プロセスはadb.exeで、アンドロイドOSのデバッグブリッジとか、よくわからない物だった。原因はFirefox OS Simulator Add Onで、アンインストールして再起動で問題解決。

2013年4月28日日曜日

Windows8がネットワークに繋がらない

Windows8が突如ネットワークに繋がらなくなり焦りました。
 原因はネットワークモニタ3のようでした。
 アンインストール後、安定してつながるようになりました。

2013年4月25日木曜日

Flyway コマンドラインWindows版

日本語環境では、mode con が返す結果が日本語にローカライズされていて動作しなかったので、修正してみました。牛刀をもって鶏を割く嫌いがありますが。

...

@REM Save current character set
for /F "usebackq tokens=2 delims=:" %%C in (`chcp`) do set CHAR_SET=%%C
chcp 437

@REM Detect the width of the console
for /F "usebackq tokens=2* delims=: " %%W in (`mode con ^| findstr Columns`) do set CONSOLE_WIDTH=%%W

@REM Restore current character set
chcp %CHAR_SET% > NUL

...

2013年4月23日火曜日

CODE COMPLETE 下を読んで

読了しました。とても読みやすかったです。

quote1

エンジニアリングの一つの定義は、だれでも1ドルでできることを、10セントで行うことである。反復を後の段階まで先延ばしすることは、だれでも1ドルでできることを、2ドルで行うことである。Fred Brooksは「1つ捨てるつもりで。どうせ捨てることになるのだから」とアドバイスしている(Brooks 1995)。ソフトウェアエンジニアリングの秘訣は、使い捨てになる部分をできるだけ時間をかけずに安価に作成することである。それが、早い段階での反復のポイントなのだ。

CODE COMPLETE 第二版 下,p467より引用

私がPerlを使う理由の一つです。

2013年4月17日水曜日

CODE COMPLETE 2nd 上でちょっと気になったところ

CODE COMPLETE 第二版の上を読了。ツッコミたい所もそこそこあったりして、そこも含めて完璧な本です。たぶん。2005年の本なので、参考資料は2004年の資料が最後になるのはしょうがないかな……。
参考資料はAmazonで探して、こんな本も買っていますリンクを辿ると良さそうです。

時代に合わないと思った点をひとつだけ。
『階乗やフィボナッチ数列に再帰を使用しない』から。
int Factorial( int number ) {
    if ( number == 1 ) {
        return 1;
    }
    else {
        return number * Factorial( number - 1 );
    }
}
この再帰を使ったルーチンは、実行が低速で実行時に消費されるメモリを予測できないだけでなく、リスト17-9に示す繰り返し構造を使ったルーチンよりも理解するのが難しい。
Code Complete 第二版上,p486-487より引用
 果たして、そうでしょうか。理解するのが難しいという点は、主観的なものだと思う(少なくとも私は難しいと思わない)ので、実行が低速で実行時に消費されるメモリを予測できないという点を考えてみて、Cの二つの処理系で調べてみました。
gcc 4.7.2 (mingw版)で-O2オプション付きでコンパイルした結果
 .file "factorial.c"
 .text
 .p2align 4,,15
 .globl factorial
 .def factorial; .scl 2; .type 32; .endef
 .seh_proc factorial
factorial:
 .seh_endprologue
 movl $1, %eax
 cmpl $1, %ecx
 je .L4
 .p2align 4,,10
.L3:
 imull %ecx, %eax
 subl $1, %ecx
 cmpl $1, %ecx
 jne .L3
 rep
 ret
.L4:
 .p2align 4,,2
 rep
 ret
 .seh_endproc
pcc 1.1.0 (win32版) -O2オプション付きでコンパイルした結果
 .text
 .align 4
 .globl _factorial
_factorial:
 pushl %ebp
 movl %esp,%ebp
 subl $4,%esp
 movl %ebx,-4(%ebp)
L11:
 movl 8(%ebp),%ebx
L13:
 cmpl $1,%ebx
 jne L14
 movl $1,%ebx
 jmp L12
L14:
 leal -1(%ebx),%edx
 pushl %edx
 call _factorial
 addl $4, %esp
 imull %eax,%ebx
L12:
 movl %ebx,%eax
 movl -4(%ebp),%ebx
 leave
 ret
gccの場合、最適化で再帰をループに展開しているので、実行に関してはループで実装した場合と変わらないでしょう。pccの場合、ループに展開されないので、実行にnumber回だけcall/retを含むためにループするよりも遅くなるでしょうし、スタックフレームも作られるため、メモリも消費されるでしょう。
ここから、再帰が遅いかどうかは、言語・処理系(付加するオプション)に依存することが分かります。

2013年4月15日月曜日

某スレッドにツッコミ

image/gifにキャラクターエンコーディングは無かろうて。

巻キ添エ規制中ニツキ戦時板ニ居リマス 。

2013年4月14日日曜日

CODE COMPLETE 第二版

今日はCODE COMPLETEの第二版上下巻をゲット。初版を持っていたので、これを更新。
下巻は、Amazonやヨドバシで売っていますが、書店では入手しにくくなっているようです。書店に無かったので、e-honで取り寄せました。

さらっと見た感じ、あまり変わってないかな?文章は読みやすくなった感じかな。コードサンプルはC++とJavaになったみたい。
プログラミングについて全方位で掘り下げた本は中々無いので、プログラミング歴の浅い方にはお勧めな本です。深く掘り下げたくなったときは、参考資料をあたれば問題無く先へ進めます(お高い本がゴロゴロ並んでますが)。

うん、いま読んでも耳(目?)が痛い話があったりして。
まあ、本を読むだけで、2年から3年分のプログラミング経験に相当する知識を得られます(眉唾。

はじまりはじまり。

tumblerをカスタマイズしようと努力したのですが、挫けました。
 だめだー。
blogger.comは使ったことが無かったので、適当に使ってみる。

むう、文字サイズはpx指定なのか。