Perl

Ankiレビュー数の増加

Ankiはフラッシュカードシステム。復習間隔をスケジューリングしてくれる。気になるのは復習するカードが膨大になるんじゃないかということ。そこで、レビュー数(復習+追加)がどうなるかプログラムでチェック。数式でモデリングできそうだけど、数学は頭が錆…

screen の backtick をいつか使う(mkfifo使用)

screen の backtick をいつか使う - l1o0の日記 でファイルの変更を読み取るのに、周期的にファイルを監視していたが、kazuhoのメモ置き場 を参考に、mkfifoを使えば簡単にプロセス間通信を実現できることがわかった。 mkfifo mkfifoを使えばファイルをI/Fと…

Coro で Thread-Specific Storage パターン

増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編 を参考に Coro で Thread-Specific Storage パターンを実装。Thread-Specific Storage パターンは、スレッドごとのコインロッカー。 スレッドがコインロッカーを初めて使うときは、そのスレ…

Coro で Two-Phase Termination パターン

増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編 を参考に Coro で Two-Phase Termination パターンを実装。Two-Phase Termination パターンは別スレッドに止まれと命令して、別スレッドに終了処理させる。終了処理が終ってスレッドが終了…

Coro で Future パターン

増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編 を参考に Coro で Future パターンを実装。Future パターンは別スレッドに仕事を投げて、戻りにID (引き換え券)を貰う。あとで引き換え券を渡して結果を確認する。 #!/usr/bin/perl use str…

Coro で Worker-Thread パターン

増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編 を参考に Coro で Worker-Thread パターンを実装。Worker-Thread パターンはワーカースレッドが依頼を待ち、依頼が来たら処理する。 #!/usr/bin/perl use strict; use warnings; package Cl…

Coro で Thread-Per-Message パターン

増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編 を参考に Coro で Thread-Per-Message パターンを実装。Thread-Per-Message パターン は メッセージを送ると新しく一つのスレッドが割り当てられて、そのスレッドが処理を行なう。 #!/usr/b…

Coro で Read-Write Lock パターン

増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編 を参考に Coro で Read-Write Lock パターンを実装。Read-Write Lockは、 スレッドが読んている間は、別のスレッドも読める スレッドが書いている間は、別のスレッドは読めない スレッドが…

Coro で Producer-Consumer パターン

増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編 を参考に Coro で Producer-Consumer パターンを実装。Producer-Consumer パターン は メッセージキューだが、キューが一杯のときはキューに入れようとする待たされる。キューが空のときキ…

Coro で Balking パターン

増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編 を参考に Coro で Balking パターンを実装。Balking パターン途中で止めること(Balkする=途中で止める)。この例だと「保存しようとしたけど、既に保存されていたらやめちゃおう。」 use str…

Coro で Guarded-Suspension パターン (Coro::Signal使用)

増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編 の Guarded-Suspension パターンを Coro で実装。前回は Coro::Channelを使ったが、Coro::Channelを使うとキューが一杯になると、ブロックしてしまう。 use strict; use warnings; use Coro…

Coro で Guarded-Suspension パターン (Coro::Channel使用)

増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編 の Guarded-Suspension パターンを Coro で実装。Guarded-Suspension パターンは要するにメッセージ送受信。Coro::Channel を使ったが、 Coro::Channel を使うと厳密には、Producer-Consume…

screen の backtick をいつか使う

screen には backtick というのがあって、プログラムの出力を caption か hardstusに表示できる。screen の設定で backtick 0 0 0 プログラム プラグラム引数とすると %0` の値がプログラムの最後の出力になる。例えば、 hardstatus alwayslastline "%{=b}%0…

emacs での perldoc 環境整備

以下を参考に perl ドキュメント環境を強化 unwind-protect:emacs の中から perldoc -m perl開発に便利なemacs設定 - hakutoitoi’s blog EmacsでPerl開発する上で必須な設定 #3 - perldoc-m - Kentaro Kuribayashi's blog Perlマニュアルの歩き方 - モダンな…

かっこなし会場

本当にLispはカッコが多い? - 八発白中かっこは 0 個。ファイル自身を呼び出しているのでかなり遅い。言語のベンチマークとしてはおもしろい。 #!/usr/bin/perl use strict; use warnings; my $end = shift; my $current = shift || 1; my $factorial = shi…

プロセスの終了状態を得る

C と同じだった。 #!/usr/bin/perl use strict; use warnings; use POSIX; # http://www.linux.or.jp/JM/html/LDP_man-pages/man2/wait.2.html print '--- exit(5)', $/; check_exit_macro( sub { exit 5 } ); # 子プロセスが自分自身にシグナル INT print $…

Convert::Binary::C で 詰まった C 共用体をバイナリ変換 (うまくいかない)

C の共用体のサイズは、サイズの大きいメンバが基準になってしまう。ネットワークで C の共用体のような使い方をしたいときがあるけど、データが詰まった状態になって欲しい。つまり、 struct packet_t { struct ip_hdr_t ip_hdr; union { struct tcp_hdr_t …

Convert::Binary::C で C 構造体をバイナリ変換 (可変長配列)

C の可変長配列をバイナリ変換する。tag で dimension (配列長)を指定する。 ヘッダファイル variable_array.h typedef unsigned char u_char; typedef unsigned short u_short; typedef unsigned int u_int; typedef unsigned long u_long; #pragma pack(1)…

Convert::Binary::C で C 構造体をバイナリ変換 (固定長配列)

C の固定長配列をバイナリ変換する。 ヘッダファイル fixed_array.h #ifndef _FIXED_ARRAY_H_ #define _FIXED_ARRAY_H_ typedef unsigned char u_char; typedef unsigned short u_short; typedef unsigned int u_int; typedef unsigned long u_long; #pragma…

Convert::Binary::C で C 構造体をバイナリ変換 (共用体)

C 共用体をバイナリ変換する。 ヘッダファイル union.h #ifndef _UNION_H_ #define _UNION_H_ typedef unsigned char u_char; typedef unsigned short u_short; typedef unsigned int u_int; typedef unsigned long u_long; #pragma pack(1) struct top_t { …

Convert::Binary::C で C 構造体をバイナリ変換 (入れ子になった構造体)

入れ子になった C 構造体をバイナリ変換する。 ヘッダファイル sub_struct.h #ifndef SUB_STRUCT_H #define SUB_STRUCT_H typedef unsigned char u_char; typedef unsigned short u_short; typedef unsigned int u_int; typedef unsigned long u_long; #prag…

Convert::Binary::C で C 構造体をバイナリ変換 (基本)

C の構造体の書き方で、バイナリ変換したい。組込み関数の pack と unpack でもできるけど直感的でない。 Convert::Binary::C を使うと C の構造体にハッシュをつっこんでバイナリ変換できる。 ヘッダファイル 以下のようなヘッダファイルにある構造体を使う…

evalでcode reference

evalでcode referenceも作れる。 #!/usr/bin/perl use strict; use warnings; my $code = << 'END_CODE'; my $arg = shift || "World"; print "Hello $arg\n"; return; END_CODE eval $code; # Hello World my $func_ref = eval "sub { $code }"; $func_ref-…

tieしたSTDOUTでのprint

tieを利用してSTDOUTの出力を弄る http://d.hatena.ne.jp/sugyan/20090715/1247613596を見て、STDOUTをtieしたあと、tieする前のSTDOUTにprintするにはどうしたらいいんだろうと思った。STDOUTをtieする前にdupしておくとかでいいのかな? #!/usr/bin/perl u…

NetSNMP::agent

PerlでSNMPエージェントを簡単に動かせないかなぁと思ってたら、それらしいモジュール NetSNMP::agent があった。だけど動かなかった。色々試した結果、net-snmpの設定ファイルを作る必要があるのね。とりあえずセキュリティはザルで動いた。hello.conf com2…