新しいblogに移行しました

新ブログ "All Yout Bugs Are Belong To Ass" に移行しました!

2008-12-17

[Perl]Email-Simple-2.004はちゃんとFromヘッダ処理できてた

過去の記事で、Email::Simpleである条件下においてFromヘッダをうまく取得できないようなことを書きましたが、数日前に再度動作を確認したところ、問題なく処理できることが判明しました。誤爆してスミマセンデシタ。

ちなみに実証コードを挙げてある方(Email::Filter)は、まだあれから確認していません。
近々に確認したいと思います。

2009-01-01 追記
再度確認したところ、Email::Filterについても当方の誤認でした。申し訳ありませんでした。
こちらで実証もしました(´・ω・`)

2008-12-14

[ネットライフ]45% Geekだそうな。

GIGAZINEに載っていたので、やってみた。

I am 45% Geek.
Geek? Yes, but at least I got social skills.
You probably work in computers, or a history deptartment at a college. You never really fit in with the "normal" crowd. But you have friends, and this is a good thing.

オイラ、45% Geekなんだって。

# どうでもいいけど、ネットライフのことをネットワイフと打ち間違えることが多いorz

2008-12-08

[Perl]コンストラクタを拡張する場合の書き方

よく忘れるし、調べてもそのものズバリな例がなかったので、メモ。

例えば、WWW::Mechanizeを継承したChildというクラスで、newした時点で必ずagentを'Mojimoji/1.0'にしたい場合。


### lib/Child.pm

package Child;
use warnings;
use strict;
use base qw/ WWW::Mechanize /;
use SUPER;

sub new {
my $class = shift;
my $self = $class->SUPER::new( @_ );
$self->agent( 'Mojimoji/1.0' );
$self;
}

1;


で、実際に使うときには

#!/usr/bin/perl

use lib qw( ./lib );
use Child;
use Data::Dumper;

my $c = Child->new;

print Dumper $c;


これを実行すると、


$VAR1 = bless( {
'headers' => {},
'forms' => [],
'page_stack' => [],
'requests_redirectable' => [
'GET',
'HEAD',
'POST'
],
'from' => undef,
'timeout' => 180,
'onerror' => sub { "DUMMY" },
'parse_head' => 1,
'_extracted_images' => 0,
'links' => [],
'max_redirect' => 7,
'quiet' => 0,
'images' => [],
'_extracted_links' => 0,
'stack_depth' => 8675309,
'protocols_forbidden' => undef,
'no_proxy' => [],
'onwarn' => sub { "DUMMY" },
'protocols_allowed' => undef,
'use_eval' => 1,
'autocheck' => 0,
'agent' => 'Mojimoji/1.0',
'def_headers' => undef,
'cookie_jar' => bless( {
'COOKIES' => {}
}, 'HTTP::Cookies' ),
'proxy' => {},
'max_size' => undef
}, 'Child' );

2008-12-05

[OpenVZ]仮想環境のダークホース

OpenVZ+Ubuntuがすごすぎてわけわからん状態の今日この頃。

唐突にVEをライブクローン(ライブマイグレートではない)するツールを書いたので、貼り付ける。


#!/bin/sh

src=$1
dst=$2
confdir=/etc/vz/conf
imgdir=/var/lib/vz/private
rootdir=/var/lib/vz/root
if [ $src ] && [ $dst ]; then
echo 'copying config...'
cp $confdir/$src.conf $confdir/$dst.conf
echo 'copying image...'
rsync -az $imgdir/$src/* $imgdir/$dst
echo 'copying root...'
mkdir $rootdir/$dst
chmod 755 $rootdir/$dst
echo 'clone complete.'
else
echo 'usage:'
echo 'vzclone [Source-VEID] [Destination-VEID]'
fi

2008-11-04

「ポジティブ」だけが要素じゃない。

http://d.hatena.ne.jp/tokuhirom/20081103/1225670242

これはものすごく共感できるし、現実にそういう状況にしょっちゅう出くわす。
成果を出したいという思いだけでは、成果は出ないのです。
悲観的な情報も考慮し、それに対処していく必要も出てくる。
これに感情的な反論を加えられる事もよくありますけど、それは悲観的要素から目を背けているに過ぎないし、そういう情報の提供者を攻撃すること自体もそもそも間違い。

2008-10-24

[Perl]Email::FilterとかEmail::Simpleでheaderメソッド使ってFromを取得するときの注意

2009-01-01 追記
この記事は盛大に誤爆しております。実際には、Email::FilterもEmail::SimpleもきちんとFromヘッダを取り回してくれますので、ご安心ください。
詳細は、この記事および、この実証記事をご確認ください。m(_ _)m


メールに自動返信するプログラムを書く際、Email::Filter-1.032Email::Simple-2.004を使ったりするんだけど、こいつらではうまく取得できないFrom値が存在するみたい。

例えば、SoftBankの705SHから送信されたメールのFrom欄。

<****************@softbank.ne.jp>


こういう風に、<〜>で囲われていて、かつ表示名称(※)が無いものは、これらのモジュールだとうまく取得できない。

以下、実証コード。


#!/usr/bin/perl
use Email::Filter;
use Data:Dumper;
my $email = Email::Filter->new;
my $log = '/tmp/email_filter.log';
open my $LOG, '>>', $log;
print $LOG Dumper $email->header( 'From' );
close $LOG;


これをpostfixで受けれるように、/etc/aliasesを編集。
test: "|/path/to/script.pl"


で、実際にメールを食わせてログ見てみると、
$VAR1 = '';


あまり暇が無いので、取り敢えずメモに止めておく。

※表示名称ってのはこういうのです。
山田 三郎 <****************@softbank.ne.jp>

(正式名称じゃないです。きっと。)

2008-10-16

[Linux]VMware Management InterfaceにSSHトンネル経由でアクセスできたよ!

遠隔地にVMware Server2がインストールされているマシンがあって、そこで稼働しているVMware Management Interfaceにアクセスしたい場合のメモ。

VMware Server2をデフォルトでセットアップしている場合であれば、80/TCP, 902/TCP, 8333/TCPの、3つのTCPポートをトンネリングする必要があります。

つまり。ターミナルを3つ開く必要があるみたいですね。
例えば、以下のAAみたいな状況。
[VMwareServer]
| 192.168.10.200
|
| 192.168.10.254
[Router]
| 123.45.67.89
==+=========
| Internet
==+=========
| xxx.xxx.xxx.xxx(Global-IP)
[Router]
| 192.168.0.254
|
| 192.168.0.100
[MyLinuxBox]


MyLinuxBoxから、
# ssh -L 80:192.168.10.200:80 user@123.45.67.89

# ssh -L 902:192.168.10.200:902 user@123.45.67.89

# ssh -L 8333:192.168.10.200:8333 user@123.45.67.89

の3つを実行してやって、https://127.0.0.1:8333/にブラウザでアクセスしてやると、VMware Infrastructure Web Accessのログイン画面になる。はず。(少なくともFirefox3ではそうなった)

追記
3つのコンソールを開かなくとも、以下のコマンドで代用可能。
※このコマンドではうまくつながらないです。この下に追記されているコマンドを試してください。
# ssh -N -f \
-L 80:192.168.10.200:80 \
-L 902:192.168.10.200:902 \
-L 8333:192.168.10.200:8333 \
user@123.45.67.89
後はLAN接続時と同様にVMの新規作成なりconsole開いてみるなり、ご自由にどうぞ。

2011-01-11 追記
上記コマンドではうまくつながらない模様。8222ポートが不足していた様です。以下のコマンドで接続できました。
# ssh -N -f \
-L 80:192.168.10.200:80 \
-L 902:192.168.10.200:902 \
-L 8222:192.168.10.200:8222 \
-L 8333:192.168.10.200:8333 \
user@123.45.67.89
が、認証が通らない模様。。。ぐぬぬ。。。

2008-10-09

[Perl]WWWクライアントなモジュールの使い分け

最近電波ばかり垂れ流していたので、たまにはPerlの話もしますよ><

WWWクライアントっちうても幅が広すぎるので、ここではいわゆる「Webスパイダー」の機能を実装するために使われるPerlモジュールの話題に限りますね。

まあ個人的には以下のように認識しておりますし、そういう使い分けをしています。
無論CPANには、これらのモジュール以外にも素晴らしいモジュールがたくさん登録されているので、使わない手は無いですね!

WWW::Mechanize


ある特定サイトに特化した自動化処理を実装するのに使う。
例:basic認証を通過して、その先のフォームに何かを入力してSubmitさせるとか。

Test::WWW::Mechanize


ある特定サイトを定常的に監視し、状態変化を検出するのに使う。
例:自宅鯖で運営しているwebサイトが死んでいないかを監視させたり。

Web::Scraper


サイト内の情報を定型化し、他の形式に変換する。
例:Yahoo!の天気予報の情報を抜き出して、JSONやらRSSやらxlsやらに変換。

本当はこれ以外にもあるのですが、良く使うのはこの辺ですね。
特にWeb::Scraperは楽チン。素晴らしいモジュールです。

2008-10-02

[電波]メールのsignatureに書いてあるURLが間違っていて涙目

うあああああああぁああっぁあああ><

http://yellowstore.blogspot.net/ て何だよオイラ。
http://yellowstore.blogspot.com/ だろjk><

2008-09-19

[電波]クレーマーの法則発見か?

それなりにこの業界(IT)に身を置いているが、最近感じたこと。

 ケチほど精神論

よくあるのが、報酬(お金に限りません)を出す気配もないのに、つい熱くなっちゃって「技術者としての意地を見せてください!」とか言うパターン。

報酬+αくらいはこなしますが、それ以上を求めるのは如何かと。

個人間ベースで言われるのは結構なことだけど、ビジネスパートナーとしてこれ言われると、ちょっと距離おきますね。。。

そりゃオイラは技術者だし、意地もあります。でも、はっきり言ってこういうのは、根っこが強請りと同一だと思う。

で、こんな事言うと、むしろオイラがケチといわれるオチがwww

2008-09-12

[電波]野暮なヤツばかりだ。

今更話。
http://d.hatena.ne.jp/pha/20071118/p1
野暮なコメントの何と多いことか。自分もこうありたいとか、微塵も思わないのだろうか。
優雅さに楯突くとか、個人的にはありえないと感じた。

2008-09-11

[Windows]IgScopeというVNCの対抗馬

http://www.vector.co.jp/magazine/softnews/060420/n0604201.html

クライアントでは、DirectXを使った描画エンジンを採用しているとの事。
リモートPCのDirectX必須ゲェムとかを操作できるって話も。

じゃあ、ゲェムを各種VM上で動作させて見たらどうなるんだろうね。

2008-09-10

[読書]コーカサス国際関係の十字路

コーカサス国際関係の十字路 廣瀬陽子:著

グルジア紛争のニュースをきっかけに、読んでみた。
コーカサス(ロシア語では「カフカス」と読むらしい)地方の国際情勢を把握するにはうってつけ。知識ゼロかつ低学歴のオイラが読んでも、「大体理解したふう」くらいにはなれる。
表層的ではあるかもしれないが、それが故に応用的にとらえることもできる。
グルジア紛争におけるロシア政府のポジショニングとかよくわからん、と言う人におすすめ。

[Lua]Luaに可能性を見出した

http://luaforge.net/を見て、Luaに可能性を見出した。
http://class.luaforge.net/とか、美しい。
日本ではメジャーではないスクリプト言語だが、やがて化けるように思う。
実はLua版のModule::Pluggable的なライブラリを作りたいと思っているが、Luaの習熟度が今ひとつ。必死こいて学ばないと。。。

2008-09-07

[生活]ハーブウォッカを作ってみる

プランターで育てていたハーブが大量に収穫できたので、料理用にハーブウォッカをこさえてみた。
我が家のスイートバジル。所々虫に食われているのはご愛嬌。

*材料
 スピリタス だいたい160mlくらい
 スイートバジル だいだい20枚くらい
 ローズマリー 適宜

今回使ったウォッカ「スピリタス」。何と度数96パーセント!
何でこんなものあるかって?そりゃあもう、面白そうだからですよ!

スピリタス

密閉できるビンにバジルとローズマリーを放り込み、スピリタスに漬け込んで、ふたをした。
1~2週間くらい漬けておけば、香りがスピリタスに移るはず。

パスタソースやムニエルなどに使う予定。

ハーブウォッカ

2008-09-02

[Linux]Ubuntuに乗り換えて1日が経ちました。

驚いた。全くと言っていいほど躓く箇所がない。唯一、IPMsgの導入で若干躓いた程度だ。

・ネットワークの設定:static-addressで設定。難なく適用できた。
・メールの設定:evolutionを使った。悩む箇所がない。
・デスクトップのカスタマイズ:ほぼデフォルトに近い状態で満足。
・アップデート:これには驚いた。Windowsが赤子にみえる。ほぼ自動でアップデートできた。

2008-09-01

[Linux]Ubuntuでg2ipmsgを使いたい。

http://d.hatena.ne.jp/Ubuntu/20080404/1207269424
ここを参考にした。
追加で、あらかじめ

sudo apt-get install gettext

とする必要があった。

起動時にSegmentation Faultが発生。
http://www.ipmsg.org/bbs/bbs-ipmsg-b.cgi?id=&md=set&tn=0916
によれば、--prefix=/usrを追加すれば問題なさそうとのことだが、実際やってみると、やはり同様のエラー。ううう。

2008-09-02 12:12 追記。
結局Java版IPMsgをインストールして、事なきを得たのであった><

[Linux]Ubuntu8.03に乗り換えた

すげえ><
なにこの簡単さ?お手軽過ぎて半ば狂喜してました。

2008-08-29

[Linux]subversionをconfigureする際に「no suitable neon」と言われたときの対策

例えばneon-0.28.3を使ってsubversionをconfigureする際、

no suitable neon

と言われるケースがある。

この場合、Your own riskではあるけど、./conigureのNEON_ALLOWED_LISTに0.28.3を追加すればconfigureが通る。

2008-08-23

[生活]最悪の休日

なんつうかコレでもかという程に、細かくバッドケースだらけの一日だった><

・買ってきたCPU切替器が使い物にならなかった(別に不良品ではない)
・ネトゲ専用機のグラボが死んだ。
・別のマシンのグラボのドライバが消失した。
・自転車のライトの電池が切れた。
・スーパーのレジ担当のお姉さんが、むちゃくちゃ機嫌悪そうに応対してくれた。
・雨にあてられた。
・何か家の中で異臭がすると思ったら、野菜だったものがあった。
・嫁が鼻風邪ひいてて機嫌悪い。
・部屋の掃除をしていたら、PCのパーツが何故か子供のおもちゃ箱に入っていた。
・レッドブル買い忘れた。
・雷で宅鯖のファイルが一部やられてた。
・微妙に頭痛。
・自分の土俵で無力を実感させられた。
・willcom-03がフリーズした。
・近所のお祭りに行けなかった。
・子供にやられた耳の傷が2ヶ月経っても癒えないどころか、若干膿んできた。

さすがに凹んでいます。。。

2008-08-22

[Linux]デフォでkernel-sourceがないCentOS

2. If you really need the full kernel source
クズOSだろコレ。

...こりゃマジでDebianとかArchとかに乗り換えた方がいいな。。。

[Linux]とーーーーっても古い環境でFUSEをコンパイルする時のメモ

RHL7.3にFUSE2.4.2をインストールしたときに軽くつまづいたので、メモ。
# 今時RHL7.3かよ!とか言うツッコミはごもっともだが、そこはヌルーさせていただく><

まず、以下のrpmをftp.riken.go.jp辺りでゲット&インストール。
- binutils-2.11.93.0.2-11.i386.rpm
- cpp-2.96-110.i386.rpm
- gcc-2.96-110.i386.rpm
- glibc-devel-2.2.5-34.i386.rpm
- glibc-kernheaders-2.4-7.14.i386.rpm
- kernel-source-2.4.18-3.i386.rpm

で、fuse2.4.2をインストール。

# ./configure
# make

でもこける。

inode.c:597: unknown field `alloc_inode' specified in initializer
inode.c:597: warning: initialization from incompatible pointer type
inode.c:598: unknown field `destroy_inode' specified in initializer
inode.c:598: warning: initialization from incompatible pointer type
inode.c:599: field `read_inode' already initialized
inode.c: In function `fuse_inode_init_once':
inode.c:702: warning: implicit declaration of function `inode_init_once'
make[1]: *** [inode.o] エラー 1
make[1]: 出ます ディレクトリ `/root/fuse-2.4.2/kernel'
make: *** [all-recursive] エラー 1

見るも無惨><

いろいろググって、http://wl500g.info/showthread.php?t=2036&page=9という記事を見つけた。

それによると、./kernel/inode.cの597行近辺を直すと良いとのこと。

static struct super_operations fuse_super_operations = {
// .alloc_inode = fuse_alloc_inode,
// .destroy_inode = fuse_destroy_inode,
.read_inode = fuse_read_inode,
.clear_inode = fuse_clear_inode,
.put_super = fuse_put_super,
.statfs = fuse_statfs,
.show_options = fuse_show_options,
};


で、再度make。

# 前略

make[2]: 出ます ディレクトリ `/root/fuse-2.4.2/util'
make[1]: 出ます ディレクトリ `/root/fuse-2.4.2/util'
Making install in example
make[1]: 入ります ディレクトリ `/root/fuse-2.4.2/example'
make[2]: 入ります ディレクトリ `/root/fuse-2.4.2/example'
make[2]: `install-exec-am' に対して行うべき事はありません。
make[2]: `install-data-am' に対して行うべき事はありません。
make[2]: 出ます ディレクトリ `/root/fuse-2.4.2/example'
make[1]: 出ます ディレクトリ `/root/fuse-2.4.2/example'
make[1]: 入ります ディレクトリ `/root/fuse-2.4.2'
make[2]: 入ります ディレクトリ `/root/fuse-2.4.2'
make[2]: `install-exec-am' に対して行うべき事はありません。
test -z "/usr/local/lib/pkgconfig" || mkdir -p -- "/usr/local/lib/pkgconfig"
/usr/bin/install -c -m 644 'fuse.pc' '/usr/local/lib/pkgconfig/fuse.pc'
make[2]: 出ます ディレクトリ `/root/fuse-2.4.2'
make[1]: 出ます ディレクトリ `/root/fuse-2.4.2'


ヌメっと入ってくれた。気持ちいいッ!!><

2008-08-21

[/.j]「誰?」ってコメントが多くて吹いた

Shibuya.pm2代目リーダー竹迫良範氏のインタビューが公開

非「Perl使い」な方からすれば、まあしょうがないのかも。
でも、LLな人なら知っててもおかしくないハズ。

...まあでも「総長」はないよなあ><
せめて「議長」とか「幹事長」とか、もっと有りそうなものだと思います。

[電波]マジなめんな

http://blog.livedoor.jp/dqnplus/archives/1168033.html

世の子育て世代を愚弄しやがって

2008-08-19

[Linux]特定ディレクトリ以下のPerlスクリプトを動かす上で不足しているモジュールをリストアップする技

awk/find/grep/sort/uniqを駆使。

find /path/to/dir |
awk '{print("perl -wc "$1);}' |
sh 2>&1 |
grep "Can't locate" |
awk '{ gsub(/\//,"::",$3);sub(/\.pm/,"",$3);print($3); }' |
sort |
uniq


見やすくするため改行してるけど、実際は「一行野郎」。
環境ややり方次第では、勝手にcpan使ってインストールもできます。

2008-07-24

[モバイル]今さらWillcom03をゲット

巷ではiPhoneとやらがもてはやされているけど、そんなのガン無視でWillcom03ゲットー!!!
色?もちろんピンクトーンですよ!奥さん!

で、ザクッと使用感。

キーボード。すごく使い易い!本当にモバイルかと思わせるほど、違和感の無い使い心地!

電話として見た場合。
あまり使い易くないです。まあでも、着信専用みたいな扱いなら、気にならない。
イルミネーションキーは以外と操作性が良い。でも、真夏の関東圏ではボタン自体が見えないことも。。。

ネット端末としてみた場合。
まずまず快活に動作するブラウザ。スタイラスをつかって、ページを掴むようにしてスクロールできる。これがなかなか便利。

メーラー。いわゆるPCのそれとほぼ酷似。何の取り柄もなく、使用感を書くまでもないレベル。動作はまずまず快活。

その他導入したソフトウェア。
・EasyDial: PPPダイヤラー。必須。単機能ながら、非常に重宝。
・PocketPuTTY: 日本語版をゲット。SSHコンソールをバリバリ使えるのは素晴らしいね!
・vncviewer: ネタです><

総評:★★★☆☆
やっぱりモバイルでSSHコンソールって最強ですわ。
電話とメールの使いにくさがもう少し緩和されていれば。。。。><

[Perl]今さらながら、Gearmanを学ぶ。

Gearmanというのは、Perlでかかれたジョブサーバー。
dangaという会社がリリースしているらしい。

log4ZIGOROu - Gearmanを使ってみたを参考に、Gearmanを触ってみた。
まだインストールしたばかりだから、コードは書いていないんだけど、ややつまずいた箇所をメモ。

先の参考ページでは

インストール
gearmand, GearmanをそれぞれCPANから入れるだけです。

と書かれている。

しかし、元記事が書かれてから1年以上(!)経過しているせいか、若干差異があった(これは仕方無い)。

現在のところだと、

# cpan Gearman::Worker
# cpan Gearman::Server

とすれば、インストールできる模様。

それ以外の差は多分なさそうなので、参考にさせていただくことに。

2008-07-16

[Perl]変数からだとModule::Pluggableのsearch_pathを指定できないらしい。

前回の苦悩を解決すべく、調べてみた。

ダサくて泥臭いけど、直接Module/Pluggable.pmのimportメソッドにwarnを仕込んで確認した。
この際、背に腹は変えられない。

Module/Pluggable.pm


### 前略

sub import {
my $class = shift;
my %opts = @_;
use Data::Dumper;
warn Dumper \%opts;


my ($pkg, $file) = caller;
# the default name for the method is 'plugins'
my $sub = $opts{'sub_name'} || 'plugins';
# get our package
my ($package) = $opts{'package'} || $pkg;
$opts{filename} = $file;
$opts{package} = $package;

warn $opts{package};

my $finder = Module::Pluggable::Object->new(%opts);

### 後略


で、以下のようなパターンで実行。
lib/Parent.pm


### 前略

### パターン1
sub import {
use Module::Pluggable search_path => $_[0].'::Component', sub_name => 'components';
}

### パターン2
sub import {
use Module::Pluggable package => $_[0], search_path => $_[0].'::Component', sub_name => 'components';
}

### パターン3
sub import {
use Module::Pluggable search_path => 'Child::Component', sub_name => 'components';
}

### パターン4
sub import {
use Module::Pluggable package => 'Child', search_path => 'Child::Component', sub_name => 'components';
}

### パターン5
sub import {
use Module::Pluggable package => 'Child', search_path => $_[0].'::Component', sub_name => 'components';
}

### 後略


で、その結果。

### パターン1
Use of uninitialized value in concatenation (.) or string at ../lib/Parent.pm line 16.
$VAR1 = {
'require' => 1,
'search_path' => '::Component',
'sub_name' => 'components',
'package' => undef
};
Parent at /usr/lib/perl5/site_perl/5.8.8/Module/Pluggable.pm line 28.

### パターン2
Use of uninitialized value in concatenation (.) or string at ../lib/Parent.pm line 16.
$VAR1 = {
'require' => 1,
'search_path' => '::Component',
'sub_name' => 'components',
'package' => undef
};
Parent at /usr/lib/perl5/site_perl/5.8.8/Module/Pluggable.pm line 28.

### パターン3
$VAR1 = {
'require' => 1,
'search_path' => 'Child::Component',
'sub_name' => 'components',
'package' => undef
};
Parent at /usr/lib/perl5/site_perl/5.8.8/Module/Pluggable.pm line 28.

### パターン4
$VAR1 = {
'require' => 1,
'search_path' => 'Child::Component',
'sub_name' => 'components',
'package' => 'Child'
};
Parent at /usr/lib/perl5/site_perl/5.8.8/Module/Pluggable.pm line 28.

### パターン5
Use of uninitialized value in concatenation (.) or string at ../lib/Parent.pm line 16.
$VAR1 = {
'require' => 1,
'search_path' => '::Component',
'sub_name' => 'components',
'package' => 'Child'
};
Parent at /usr/lib/perl5/site_perl/5.8.8/Module/Pluggable.pm line 28.


よく見ると、変数で指定している箇所が根こそぎundefinedな扱いになっている。
つまり、「Module::Pluggableのsearch_pathには変数使えません」ということっぽいorz

多分、Module::Pluggableがimportでとりまわしている箇所だからとか、そういう理由なのかもしれない。もう少し掘り下げて調べねば。。。

Module::Pluggable::Objectを直接扱えとか、そういう感じではないかと勝手に憶測してみたり。。。

2008-07-15

[Perl]Module::Pluggableのsearch_pathをうまく指定できず、悩む。

困った。
lib/Parent.pm


package Parent;
use warnings;
use strict;

sub import {
use Module::Pluggable search_path => $_[0].'::Component', sub_name => 'components';
}

sub new {
my ( $self, $opts ) = @_;
my $c = bless { option => $opts }, $self;
$c->{component}->{"$_"} = $_ for $c->components;
$c;
}
1;


lib/Child.pm


package Child;
use warnings;
use strict;
use base 'Parent';
1;


hoge.pl


use lib qw(./lib);
use Child;
my $child = Child->new;


で、hoge.plを実行。

$ perl hoge.pl
Use of uninitialized value in concatenation (.) or string at ./lib/Parent.pm line 6.


なぜだ。。。orz

2008-07-13

[Perl]オレオレなWebフレームワークをこさえてみる。

オイラ自身のPerlやらモジュールやらに対する理解を深める目的で、BreezyというMVCなWebフレームワークをこさえてる今日この頃。
とはいえ実のところ、HTTP::Server::Brickに乗っかりまくりなのですけど^^;

ぶっちゃけおいらは、開発速度とか速いほうではないです。
さらに、相変わらずテストとは微妙な距離を置いているので、出来は悪いかもですが、そのうちレポジトリを後悔・・・いやいや、公開しようかと思ってます。

基本構成は、
・Module::PluggableでMVC各コンポーネントおよびその継承クラスをロード。
・Dispatcherが各Controllerクラスからアクセスパスを割り当てる。
・HTTP::Server::Brick様にてサーブ。

という具合を目論んでいるけど。。。
はて、このクソ暑くてクソ忙しい状況下で、実際何処まで出来ることか。。。;;

大まかな思想としては、とにかくユーザ(Breezy利用者)のコーディング量の減少。コレ。
合言葉は「easy breezy!(超簡単!)」
# むしろ超テキトー!のほうがあってるかも・・・><

2008-06-14

[Perl]HTTP::Server::Brickがエロい

こんな汚いソースでもきちっとサーブしてくれる、献身的なHTTP::Server::Brickタソに、オイラゾッコンですよ。



use warnings;
use strict;

use HTTP::Server::Brick;

my $server = HTTP::Server::Brick->new( port => 7777 );

my $html = << ''
<html>
<head>
<title>コレはテストです!</title>
<head>
<body>
<h1>HTTP::Server::Brickはすげえ!</h1>
<hr>
<p>いやまじんこすげえ!</p>
</body>
</html>

$server->mount('/' => {
handler => sub {
my ( $req, $res ) = @_;
$res->header('content_type','text/html; charset=euc-jp');
$res->add_content($html);
1;
},
wildcard => 1
});

$server->start;


で、見ると、

こんな感じになる。
あたりまえの事をそつ無くこなすところとか、依存パッケージが馬鹿に少ないところとか、とにかくシンプルなところとか、mod_perlに載せやすいとか、色々萌え要素が多すぎて、いろんな意味で成人指定な感じがしましたよお兄さん!

2008-05-29

[Perl]テスト

テストを書くのは非効率的・・・そう思っていた時期が僕にもありました。。。orz

たしかにTest::Moreは効率的では無いかもしれない。
けど、それってつまり、テストコードの自動生成とか、あまり当てにならないからなんだよね。
自動生成では、細やかな注文に答えきれなかったりする。
だから、どうしても自力で億劫なテストを書かなきゃいけない。

ようするに、自力で書いたテストコードが一番信頼できるということ。

それでもやっぱり、かなり効率悪く見える。
しかし、それは自分の書いたソースに信頼性を持たせる数少ない方法の1つ(もしくは唯一の方法?)なわけだ。

ソースが信頼を得るには、それ相応の手間をかける必要があって、それを怠ると、そのソースはどんどん見放され、忘れられていく。
非常に手厚いサポート体制があったり、メンテナンスが非常に活発ならば、幾分救いようがあるかもしれない。
もっとも、そもそもそんな状態なら、テストの自動化が為されているはずだが。

そんなわけで、Test::Moreを使ったテスト駆動開発というものに、ようやく最近取り組み始めた。
まだまだ先は長い。。。

2008-05-26

[ネットライフ]Opera for Linuxに乗り換え

最近Firefoxの調子が悪く、頻繁にクラッシュする。
いっそのことと思い、ブラウザをOperaに切り替えてみた。

まず、速くて軽い。当然安定している。
半面、フォントなどのデフォルト設定のままでは非常に見苦しい。

RSSリーダーも標準搭載。メーラーの様な感覚で扱える。

心配していたJavaScriptの解釈もバッチリ。iGoogleも支障無く利用できた。

そして何より驚いたのが、ウィジェットの存在とスピードダイアルのすばらしさ。

ウィジェット自体はリッチクライアントなアプリを提供する機能。
まだまだ玉石混在という風情で、とりあえず実装したという感じを受けたが、
ウィジェット次第、利用方法次第で、利便性に大きくプラスとなるだろう。

スピードダイアル。こいつのお蔭で、異常なまでに操作性が高くなっている。
良く訪問するサイトを登録しておき、Ctrl+[1〜9]で呼び出せる。
こいつはとにかく便利。早速SEARCH.CPAN.ORG他、数サイトを登録した。

総評としては、デフォルトの見た目(特にフォント)が悪い為、ライトユーザー受けはしないだろう。
だが、拡張性・操作性・安定性のどれをとってもピカイチ。
十分満足の行くレベルだ。

[Catalyst]5.7013おかしくね?

beginメソッド使ったら、

********************************************************************************
Invalid CODE attribute: Private at /foo/bar/HogeHoge/lib/HogeHoge.pm line 52
BEGIN failed--compilation aborted at /foo/bar/HogeHoge/lib/HogeHoge.pm line 84, line 855.
Compilation failed in require at (eval 171) line 1, line 855.
********************************************************************************

と言われた。
アプリケーションクラスを見てみたら、

use parent qw/Catalyst/;

our $VERSION = '0.01';

__PACKAGE__->config( name => 'HogeHoge' );

__PACKAGE__->setup(qw/-Debug ConfigLoader Static::Simple/);


とかになってる。
どういうことだ?先週の金曜日にセットアップしたのだが。バージョンアップでもしたか?

と思い、cpanみてみたら、17日に更新されてる。
うは。Ver.5.7013涙目。

しょうがないので、5.7012と同じように

### use parent qw/Catalyst/;
use Catalyst qw/-Debug ConfigLoader Static::Simple/;

our $VERSION = '0.01';

__PACKAGE__->config( name => 'HogeHoge' );

### __PACKAGE__->setup(qw/-Debug ConfigLoader Static::Simple/);
__PACKAGE__->setup;

としてエラーを回避。

どうやらその後、5.7014がリリースされているようだけど、まだ試していない。

2008-05-22

[Perl]TPF-J構想という話。

TPF-J構想
実に素晴らしい発想。
既にPerl Hackerとして活躍されている人は、普及活動をすることで資金提供を受けられるっぽい。
逆にPerl初学者にとっては、学びやすい環境が整備されていくわけで。

流石です。

2008-05-16

[ネットライフ]ついったーランキングのお手伝い。

ikkoさんが

ついったーランキングの開発を手伝ってくれる方いませんか?もう一人じゃキツい
- http://twitter.com/ikko/statuses/812668409



などと悲鳴をあげておられたので、僭越ながら衝動8割で協力を申し出出来るか、聞いてみました。

はて、どこまで力になれるのやら。

5/19 23:56 追記。
既に今回の募集人数(?)である5人に達してしまったらしい。残念。

2008-05-10

2008-05-09

[Perl]CatalystでPOST値を取得できない件

タイトルまんまですが、致命的過ぎる問題です;;
で、色々調べてみたのですが、過去にも同様の現象に遭った方がいるようです。

・ Catalyst+POST+multipart/form-dataだと空値が取れねい
・ [Catalyst][Perl]Catalystでフォームの値が、ある条件化において正確に取れない件

で、bokutinさんが言うには、HTTP::Bodyを0.9にバージョンアップすれば直るとのこと。
...どれどれ。オイラの所はバージョンいくつかな。


# perl -MHTTP::Body -e 'print $HTTP::Body::VERSION."\n"'
0.9


         ____
      /::::::─三三─\ えっ....
    /:::::::: ( ○)三(○)\
    |::::::::::::::::::::(__人__)::::  | ________
     \:::::::::   |r┬-|  / | |          |
    ノ::::::::::::  `ー'´   \ | |          |

なんで〜!?

14:08追記。
HTTP::Bodyを1.03にアップグレードしても、現象変わらず。
こ れ は  ひ ど い

2008-05-07

[Perl]Catalystの素朴な疑問

どうしようもない程イカレポンチな疑問なんですが、Catalystで作られたアプリを継承して、拡張する際のやりかたがわからない。。。orz

例えば、


### Catアプリ
package MyApp;


としておいて、


package MyNewApp;
use base 'MyApp';


みたいにすると、MyAppのアクションが全て継承されるってことはないんだろうなあ。
そもそもそんなことは前提に無いのかな。。。

コレできるとありがたいんですが、ご存じの方教えてください><

2008-04-30

[Perl]テストを書く?自動生成でいいんじゃないの?

YellowTurtle = テスト書くのが苦手な子 です。orz

オイラは別にCPAN Authorでもないし(というか英語力が神がかっている所為で、なれなかったw)、一介のPerlコーダーでしかないのですが、それでもテストを書く必要が有ったりして、毎度その度に涙目(笑)になっている。

で、そのオイラが思うこと。

Test::Simpleだとか、Test::More等の素晴らしいモジュールのお蔭で、確かにテストコードは書きやすい。

でもちょっと待て。これらはオイラの様な中級者にとって、やさしい物だろうか。NO。
テストコードを書くという退屈な作業から、perlコーダーを開放してくれるだろうか。NO。

尤も、そもそも中級者程度がpmなんて作るんじゃねえという向きもあるだろう。CPANやperlコミュニティから見た場合、そのような意見は決しておかしなものではないだろうし。

とはいえ、これでは如何にもテスト書けないヤツはゴミ以下といわれているようなものだ(ああ、そう言っているのか、グヘヘ)し、とにかく楽をするというHackerの態度とは相反するじゃないか。

別にテストを貶しているわけじゃない。テストの重要性は涙目になるほど承知しているつもりだ。
言いたいのは、何で仕様書からテストコードの自動生成をしないのか、ということだ。
なぜTest::Moreばかりがもてはやされるのよ?Test::LectroTestではダメなんかい?

そんなわけで、今日もTest::LectroTestのドキュメントとにらめっこのオイラなのであった。

[無電源遊戯装置]ソードワールド2.0

無事入手。
じっくり読んだ上で、以前との違いを追記していく予定。

2008-04-22

[Linux]自宅サーバへのSSH Bruteforce-Attackの統計を取りました

Powered by K6-II 400MHz なマシンを自宅サーバとして公開しているんだけど、例のごとくSSHdへのBruteforce-Attackが多い。
実は半年くらい前に、SSH-Bruteforce-Attack対策ツールを仕掛けておいたんだけど、このツールのIPリストをちょくちょく見てる。
で、さっきそいつの統計を取ってみた。期間はだいたい6ヶ月(2007-11-01〜2008-04-22)。
統計の基準となる物といっても、アクセス元IPから国を割り出すくらいの事しかしていない。


攻撃回数 ccTLD
348 CN (中国)
143 KR (韓国)
138 US (アメリカ)
59 IN (インド)
50 TW (台湾)
33 JP (日本)
25 HK (香港)
22 DE (ドイツ)
21 FR (フランス)
18 BR (ブラジル)
14 TH (タイ)
12 RU (ロシア)
12 PL (ポーランド)
12 IT (イタリア)
11 MY (マレーシア)
11 CO (コロンビア)
9 CL (チリ)
9 CA (カナダ)
9 AU (オーストラリア)
9 AR (アルゼンチン)
8 GB (グレートブリティン)
7 TR (トルコ)
5 PH (フィリピン)
5 ID (インドネシア)
5 ES (スペイン)
4 ZA (南アフリカ)
4 VE (ベネズエラ)
3 SG (シンガポール)
3 SE (スウェーデン)
3 RO (ルーマニア)
3 PK (パキスタン)
3 NL (オランダ)
3 MX (メキシコ)
3 MA (モロッコ)
3 DK (デンマーク)
3 CZ (チェコ)
3 BD (バングラデシュ)
3 AT (オーストリア)
2 YU (ユーゴスラビア(現在未使用のはずなのに!?))
2 TG (トーゴ)
2 PE (ペルー)
2 IR (イラン)
2 IL (イスラエル)
2 HU (ハンガリー)
2 GT (グアテマラ)
2 EE (エストニア)
2 CH (スイス)
1 VN (ベトナム)
1 UA (ウクライナ)
1 SK (スロバキア)
1 SI (スロベニア)
1 PT (ポルトガル)
1 PS (パレスチナ)
1 NG (ナイジェリア)
1 NA (ナミビア)
1 MU (モーリシャス)
1 LT (リトアニア)
1 LK (スリランカ)
1 LA (ラオス)
1 KH (カンボジア)
1 GR (ギリシャ)
1 GE (グルジア)
1 FI (フィンランド)
1 EC (エクアドル)
1 CR (コスタリカ)
1 CM (カメルーン)
1 BG (ブルガリア)
1 BE (ベルギー)
1 AP (アジア太平洋地域)
1 AE (アラブ首長国連邦)


う〜ん。あえてコメントする価値も無いね。

2008-04-15

[Perl]Crypt::SSLeayのテストで不思議に思った

t/01connect.tの10行目のくだり。

eval {
$sock = Net::SSL->new(
PeerAddr => '127.0.0.1',
PeerPort => 443,
Timeout => 3,
);
};

なんで自分自身がHTTPSポートを開放してることが前提?
Windowsならどうすんの?そもそもHTTPSDやらない子は?

[Linux]CentOS5のopenssl-develでちょっとハマった

吉野家コピペ風に。

そんな事より1よ、ちょいと聞いてくれよ。スレとあんま関係ないけどさ。
昨日、近所のCentOS5にCrypt::SSLeayをつっこんだんです。CentOS5。
そしたらなんかMakefile.PLが

========================================================================
No installed SSL libraries found in any of the following places.
/local
/local/ssl
/opt/ssl
/usr
/usr/local
/usr/local/ssl
/usr/local/openssl
You will have to either specify a directory location at the following
prompt, or rerun the Makefile.PL program and use the --lib switch
to specify the path. If the path in question is considered standard
on your platform, please consider filing a bug report in order to
have it taken into account in a subsequent version of Crypt::SSLeay.

Which SSL install path do you want to use?


とか言ってインストールできないんです。
で、よく見たらなんかopensslのライブラリの場所がわからない、とか書いてあるんです。
もうね、アホかと。馬鹿かと。
お前らな、無償如きで普段使ってないCentOS使ってんじゃねーよ、ボケが。
無償だよ、無償。
なんか親子連れとかもいるし。一家4人でCentOSか。おめでてーな。
よーしパパnamazuをソースからビルドしちゃうぞー、とか言ってるの。もう見てらんない。
お前らな、openssl-develパッケージつっこんでやるからCrypt::SSLeay使わせろと。

# yum -y install openssl-devel

CentOSってのはな、もっと殺伐としてるべきなんだよ。
ググる気の無い奴といつ喧嘩が始まってもおかしくない、
刺すか刺されるか、そんな雰囲気がいいんじゃねーか。OS議論好きは、すっこんでろ。
で、やっとyumを実行できたかと思ったら、yumの奴が、

Transaction Check Error:
file /etc/krb5.conf from install of krb5-libs-1.6.1-17.el5_1.1 conflicts with file from package krb5-libs-1.5-17
file /usr/kerberos/man/man5/krb5.conf.5.gz from install of krb5-libs-1.6.1-17.el5_1.1 conflicts with file from package krb5-workstation-1.5-17
file /usr/share/man/man1/asn1parse.1ssl.gz from install of openssl-0.9.8b-8.3.el5_0.2 conflicts with file from package openssl-0.9.8b-8.3.el5
file /usr/share/man/man1/nseq.1ssl.gz from install of openssl-0.9.8b-8.3.el5_0.2 conflicts with file from package openssl-0.9.8b-8.3.el5
file /usr/share/man/man1/ocsp.1ssl.gz from install of openssl-0.9.8b-8.3.el5_0.2 conflicts with file from package openssl-0.9.8b-8.3.el5
file /usr/share/man/man1/smime.1ssl.gz from install of openssl-0.9.8b-8.3.el5_0.2 conflicts with file from package openssl-0.9.8b-8.3.el5
file /usr/share/man/man8/avcstat.8.gz from install of libselinux-1.33.4-4.el5 conflicts with file from package libselinux-1.33.4-2.el5
file /usr/share/man/man8/getenforce.8.gz from install of libselinux-1.33.4-4.el5 conflicts with file from package libselinux-1.33.4-2.el5
file /usr/share/man/man8/getsebool.8.gz from install of libselinux-1.33.4-4.el5 conflicts with file from package libselinux-1.33.4-2.el5
file /usr/share/man/man8/matchpathcon.8.gz from install of libselinux-1.33.4-4.el5 conflicts with file from package libselinux-1.33.4-2.el5
file /usr/share/man/man8/selinuxenabled.8.gz from install of libselinux-1.33.4-4.el5 conflicts with file from package libselinux-1.33.4-2.el5
file /usr/share/man/man8/setenforce.8.gz from install of libselinux-1.33.4-4.el5 conflicts with file from package libselinux-1.33.4-2.el5
file /usr/share/man/man8/togglesebool.8.gz from install of libselinux-1.33.4-4.el5 conflicts with file from package libselinux-1.33.4-2.el5

とか言ってるんです。
そこでまたぶち切れですよ。
あのな、依存パッケージの手動解決なんてきょうび流行んねーんだよ。ボケが。
得意げな顔して何が、conflicts、だ。
お前は本当に依存関係の解決をしたいのかと問いたい。問い詰めたい。小1時間問い詰めたい。
お前、conflictsって言いたいだけちゃうんかと。
CentOS通の俺から言わせてもらえば今、CentOS通の間での最新流行はやっぱり、
yum -y upgrade、これだね。

yum -y upgrade openssl libselinux krb5-libs

これが通のアップグレードのしかた。
yum -y upgradeってのは、このコマンドだけで、依存パッケージまで勝手にインストールやらアップグレードしてくれる。そん代わり細かいコンパイルオプションの指定が出来ない。これ。
で、それに指定するパッケージがopenssl libselinux krb5-libs。これ最強。
しかもこれを頼むと次からyum -y install openssl-develが出来るという、一石二鳥。
素人にもお薦めできる。
まあこのネタがわからないお前らは、平文で通信してなさいってこった。

2008-04-14

[生活]鼻づまりがひどい

オイラはもともと花粉症を患っていて、年々症状が酷くなっている気がするんだけど、自分の生活スタイルに問題があるからだと思っている。今日も風邪をひいたらしく、無茶苦茶鼻水が出まくる。

ここいらで、生活習慣を見直そうと思う。

オイラの平日の一般的な行動パターンは概ね以下の通り。

 1:起床は割とおそい方だと思う。(8:00頃)
 2:朝食は必ず食べるが、ジャンクフードと自炊飯が半々位の割合。
 3:通勤は自転車のみ。電車やバスには乗らず、徒歩での移動もほとんどない。
 4:昼食は主に炭水化物多めのメニュー。
 5:おやつ大好きだから、ジャンク菓子を食べることが多い。
 6:職業柄、体を動かす機会が少ない。
 7:夕食は食べたり食べなかったり。しかも食うときはものすごく変な時間。(23:00とか)
 8:立場的に、夜遅くまで仕事することが多い。(帰宅1:00くらいとかザラ)
 9:仕事関係で、イラッっとする経験がしばしばある。
 10:コンピュータヲタクの御多分に漏れず、寝るのが遅い。(2:00とか)
 11:酒好きだが、以前より呑めなくなってきた。最近は普段から控えている。
 12:オイラ自身はタバコ吸わないけど、職場で隣の席のやつがすげえヘヴィスモーカー。
 13:その上、職場は「全く!」分煙されていない。

はい、フラグ立ちまくりですね。><

で、「鼻炎 生活習慣」あたりでぐぐる

いやいや、色々ヒットしますねえ。
楽○ショップはおいといて、以下、サイトごとに思い当たる所を抜粋。

横浜の薬屋のおやじのひとりごと
 ・長引く鼻炎症状の改善に・自律神経を乱さない生活習慣を!(2)
しかし、ストレスや不規則な生活習慣によって自律神経のバランスが乱れると、鼻の機能にも悪影響を及ぼし、鼻炎症状を引き起こしやすくなります。

  1、7、8、9、10が該当。
  いかん、順当にフラグが立っているではないか。。。

 ・長引く鼻炎症状の改善に・自律神経を乱さない生活習慣を!(3)
精神的なストレスを受け続けると、自律神経のバランスが崩れ、鼻粘膜からの鼻汁の分泌が低下してしてしまいます。このような状態が続くと、鼻の粘膜の表面が乾燥してしまい、花粉などの異物が粘膜の中に簡単に侵入するようになり、鼻炎を起こしやすくなります。

  やべえ、図星だ。

 ・長引く鼻炎症状の改善に・自律神経を乱さない生活習慣を!(4)
ところが、睡眠不足になると、身体に備わっている体内時計のリズムが乱れ、交感神経と副交感神経のバランスが崩れやすくなります。

  なんか全部オイラのことじゃんよ〜><

 ・長引く鼻炎症状の改善に・自律神経を乱さない生活習慣を!(6)
胃腸の働きは、自律神経によって調節されているので、逆に胃腸機能に負担がかかると、自律神経も影響を受けてバランスを崩しかねません。

  2、4、5、7が該当。
  不本意ながらジャンクフードに頼っている現状に、NOが突きつけられている。。。

マクロビオティックのレシピ〜キッチンで作る健康
 ・生活習慣と鼻炎(マクロビの考え)

ここで、彼女の体質や生活を例にとります。
まず、遺伝からくる肉毒が根っこの部分にあります。

朝食は食が進まず、保育園の給食をその分バカ食いするようです。
ごはんは、ウチから持っていく雑穀米ですが、おかずは保育園から出ます。
園のおかずは、肉類が毎日必ず入っているし、こどもが食べやすいように甘く味をつけてあります。
これを良く噛んでいただけばいいのですが、ウチでの食べ方を見ても丸のみ。
そして、食事のときに残す率の高いのが味噌汁。      

これが、鼻炎になりやすい人の生活です。

  オイラ、食が細いわけでは無いけど、いわゆるバカ喰いはしない。
  肉毒という言葉があるんだね。でも、肉は好きだしなあ。
  味噌汁は残さない派。昆布だけで取った出汁は口にあわないが、
  昆布+鰹なら全然無問題。

慢性鼻炎:健康マニュアル!食事療法による鼻づまり解消♪:
■食べてはいけないもの
1.腸・肝臓・腎臓・牌臓・リンパ系に負担をかけるもの

精製糖類…白砂糖、氷砂糖、ザラメ、ブドウ糖、果糖、乳糖、オリゴ糖
果物…バナナ、パイナップル、メロン、マンゴー、オレンジ、ブドウ、柿、梨
香辛料
アルコール飲料
清涼飲料…ジュース、コーラ、スポーツ飲料、ドリンク剤
動物食品…肉、牛乳、魚、卵、練り製品(ハム、ソーセージ、かまばこ等)
油脂…バター、マーガリン、ラード、ヘット

  ぎゃぁぁあああああああっ!!!><
  全部オイラの好きな物ばかり・・・
  オイラ涙目・・・

・・・こりゃ、想像以上に酷い生活スタイルらしい。
早速改善せねば。。。むむむ。。。

2008-04-12

[生活]タコライスもどき

2〜3日ほど前に作ったタコライスもどき。
こいつが我がファミリーに非常に好評だったので、メモメモ。

タコライスもどき 2人前



* 材料
・ご飯 お茶椀2膳分
 ・トマト 1個
 ・レタス 2枚
 ・スライスチーズ 3枚
 ・マヨネーズ 大さじ2
 ・塩 少々
 ・コショウ 少々
 ・挽肉 ご飯の1/6くらい。有ってもなくても良い。
 ・オリーブオイル 少々。挽肉炒める用。

* 下拵え
 ・ご飯 お皿に平に盛り付ける。
 ・トマト 1.5cm角程度のダイスカットに。
 ・レタス 太い目の千切りに。
 ・スライスチーズ 各々半分に切り、それを5mm幅程度の短冊切りに。
 ・挽肉 オリーブオイルと共に炒めておく。

* 調理
 ・レタスをご飯の上に敷く。
 ・その上に挽肉をのせる(あれば)。
 ・その上にトマトをのせる。
 ・その上にスライスチーズをのせる。
 ・その上から塩、コショウを振りかける。
 ・その上に、マヨネーズをかける。

* 食べるときに。
 良く混ぜてから食べると(゚д゚)ウマー

2008-04-11

[Perl]Tritonn(MySQL5.0.45)のmysqlhotcopyのおかしな挙動


[root@hackathon backupdir]# mysqlhotcopy hogedb ./
Invalid db.table name 'hogedb.hogedb`.`some_table' at /usr/local/bin/mysqlhotcopy line 855.


あ〜、これじゃあmysqlhotcopyできないよ〜><

mysqlhotcopyは前からbugだらけなのは知っていたけど、オイラもついに被害者に。
/(^o^)\ナンテコッタイ

とりあえずPerlで書かれているので、/usr/local/bin/mysqlhotcopyをHacking。

書き換えた箇所は、以下の通り。

336c337,343
< my @hc_tables = map { quote_names("$db.$_") } @dbh_tables;
---
>
> ### hacked by yellowturtle
> ### my @hc_tables = map { quote_names("$db.$_") } @dbh_tables;
>
> my @hc_tables = map { quote_names("$_") } @dbh_tables;
> ### /hacked by yellowturtle
>

837a861,863
> ### hacked by yellowturtle
>
> $name =~ s/\`\.\`/./g;



で、改めて実行。

[root@hackathon backupdir]# mysqlhotcopy hogedb ./

    (中略)

Copying 192 files...
Copying indices for 0 files...
Unlocked tables.
mysqlhotcopy copied 57 tables (192 files) in 16 seconds (16 seconds overall).


バッチリhotcopy完了!

たぶんTritonnじゃなく、MySQL側の問題なんだろうね。

2008-04-08

[生活]ジュニア1号、新一年生に。

うちのジュニア1号が小学校へ入学。
記念撮影のときに寝たふりをするとか、激しく協調性のなさを露呈していた。。。orz

まあ、返事をするときの声のデカさだけは一番だったけど。

[Perl]YAPCチケット追加販売

らしいんだけど、大真面目に予定がバッティング><

[Perl]近頃Class::ComponentとHTTP::MobileAttributeがアツい

HTTP::MobileAttributeというモジュールがClass::Component使ってるらしく、それぞれのauthorが本気モードでパフォーマンスのチューニングにあたっているようだ。

今のところ、一介の利用者であるオイラは傍目から状況を伺っているわけなんだけど(というか、所謂 Perl Hacker の手際よさに腰を抜かしている状態...><)、どんどんバージョンアップしてゆくClass::Componentは今後、プラガブルなモジュールのベースとして、間違い無く本命になる予感がする。

そして、HTTP::MobileAttributeの存在。
今までHTTP::MobileAgentを使っていたんだけど、こいつにはプラグインの概念がないので、なんか新しい枠組が追加された場合(新キャリア登場!とか、第X世代端末登場!とか)の対処方法に乏しい感がある。
しかし、HTTP::MobileAttributeにはプラグインの概念がある。それも当然。Class::Componentを使ってるんだから。
オイラはまだHTTP::MobileAttributeを弄っていないけど、HTTP::ReplacePictogramMobileJpあたりと組み合わせれば、携帯向けWebアプリフレームワークとかできそう。author同じだし。
Catalystベースのメタ環境ってことにすれば、ご機嫌になれそう。

2008-04-02

[Perl]Class::Component0.11リリース

YappoLogsにて、Class::Component0.11リリースとの発表があった模様。

今まで苦手分野だった引数の扱いを、大幅に強化したらしい。

また、MyApp::Plugin::HogeHogeの扱いを、MyApp::Pluginの継承クラスとして扱うことを推奨。素直に喜ばしいポリシー変更です。なぜなら、オイラは0.10の頃からMyApp::Pluginをbaseにしてたからね。

[ネットライフ]はてな

近頃身の回りで、はてなが便利だという話を聞く。アカウントもとってみたい気もする。
ただ、マイペースなオイラが使っても、果たして荒らしとか言われないものだろうか。

まあ、そもそもネット全体に言えることだけど、粘着とか自作自演とか、単一視点からの意見の強要とか、そういうのが多々あるのはまあわかる。
でも、そういうのがあまりに目についちゃって、ちょっと大人気ないなあコイツラって思い始めると、途端に引いちゃうんだよね。なんていうのか、そのコミュニティにいること自体を拒絶しちゃう。

で、いまのはてなのコミュニティを散見する限り、非生産的な、大人気ない軋轢のようなものが垣間見えて、オイラのヌーディーな心臓にはちょっと堪える感じがする。得られる情報や学ぶべき姿勢なども多いだけに、なんか悔しい。

もう少し自分に冷静になれたら、はてなアカウントを作っても大丈夫なのかもしれないけど。

2008-03-17

[Perl]Class::ComponentのHookの使いどころについて

run_hookを呼べば、Hookアトリビュートのついたメソッドを根こそぎ実行し、それぞれの結果を配列で返すみたいだが、いまいちどういうシーンで使うのか。。。

真っ先に思いついたのは、Plaggerのrunメソッドみたいな感じの使い方。
でも、わざわざ各PluginのメソッドにHookアトリビュートを付けるのは、いかにも面倒な感じがする。

......あ。
podを良く見てみたら、register_hookとかいうメソッドがあるんだね><

で、Waspってpmをでっち上げて、register_hook使ってみた。どうやら、予想通りの使いかたができそうだ。


### lib/Wasp.pm
package Wasp;

use strict;
use 5.8.1;
our $VERSION = '0.01';
use Class::Component;
Class::Component->load_components(qw/Autocall::Autoload/);

1;

### eg/test.pl
use lib qw(../lib ./lib);
use strict;
use warnings;
use Wasp;
use Data::Dumper;

my $c = Wasp->new;

$c->load_plugins(qw/Name Age Area Sex Favorite/);

$c->register_hook(say => { plugin => 'Wasp::Plugin::Name',method => 'say'});
$c->register_hook(say => { plugin => 'Wasp::Plugin::Area',method => 'say'});
$c->register_hook(say => { plugin => 'Wasp::Plugin::Favorite',method => 'say'});
$c->register_hook(say => { plugin => 'Wasp::Plugin::Age',method => 'say'});
$c->register_hook(say => { plugin => 'Wasp::Plugin::Sex',method => 'say'});

print Dumper $c->run_hook(say=>undef);


で、結果。

$VAR1 = [
'Name: YellowTurtle',
'Area: Earth',
'Favorite: Pasta, Olive, Coffee',
'Age: 27',
'Sex: I lovin\' it ;-)'
];


これってWebアプリのウィジェットの配置順序とか、カードゲームのデッキとか、そういう物の表現に向いてそうな感じもする。
だけど、run_hookした先が沢山ある場合、register_hookを何度も呼び出す必要がある。正直、これは結構面倒だ。

例えば、各プラグインの同名メソッドにフックポイントを置きたい場合(上記の例がまさにそう)がある。そんな時には、

$c->register_hook(say => {
plugin => [
'Wasp::Plugin::Area',
'Wasp::Plugin::Name',
'Wasp::Plugin::Favorite',
'Wasp::Plugin::Age',
'Wasp::Plugin::Sex'
],
method => 'say'
});

みたいに書けるとありがたいんだけどなあ。

2008-03-16

[視点]サービスを提供するということ

サービスを提供する上で不可欠な事柄として、以下のものが挙げられよう。
・企画
 サービスの根幹となる発想や決まり事、利用者からの要望を取り入れたアイデア等を用意する。
・開発
 企画から挙げられたアイデアや決まり事を形にする。
・広報
 サービスの存在や特長を宣伝する。
・運営
 利用者からの要望、質問、クレーム等の窓口となる。
・運用
 サービスを安定稼働させる。

大抵は、これらの他に会計が加えられるのだろうが、会計はサービスに直接関与しないので、割愛する。
これらの内、どれか1つでもおざなりにしてしまう様では、サービスにとって致命的な問題となる。以下、想定される状況を挙げてみた。

・企画がダメな場合。
 ・よくわからないサービスになる。
 ・使いづらいサービスになる。

・開発がダメな場合。
 ・使いづらいサービスになる。
 ・サービスの質が悪くなる(レスポンスが悪い、見た目が酷い等)。

・広報がダメな場合。
 ・利用者数が伸びない=流行らない。
 ・何故か悪評が付き、悪評だけが独り歩きしだす。

・運営がダメな場合。
 ・利用者からのクレームが殺到。最終的に利用者が激減する。
 ・よくわからないサービスになる。
 ・悪評が付き、他に運営しているサービスにも悪影響を及ぼす。

・運用がダメな場合。
 ・不安定なサービスになる。
 ・サービスの質が悪くなる(レスポンスが悪い、見た目が酷い等)。

最近よく見かけるパターンは、運営と運用がよろしくないというものだ。
というのも、(ここで会計が絡んでくるのだが)経営サイドが運営や運用にあまり投資したがらないのが大きな理由の1つのようだ。
実際、運営や運用というのは、一見生産性が無いように見える。しかし、これらはサービスを維持する上で致命的な役割を担っているのだ。いわば、運営・運用している時点で、失う予定の利益を確保しているわけだ。

是非サービスを提供する側の方々には、骨太な運営・運用を検討していただきたいものだ。

2008-03-13

[ニュース]朝日の「サンゴの敵、大量発生 沖縄で駆除作戦」という話

元記事

20年越しのビッグなギャグだぜ!さすが世界のアサヒ様!やることが桁外れ!

・・・いや、逆に考えるんだ!朝日には20年先まで予知できるような奴がいるって事だ!(笑)

参考
http://www.google.co.jp/search?q=%E7%8F%8A%E7%91%9A+KY
http://d.hatena.ne.jp/keyword/KY

2008-03-12

[JavaScript]Aptana Jaxerというヤツに出くわす

最近では様々なjsやらpmやらincやらが出回り、Ajax黎明期の頃からすれば、大分楽にはなった。それでも、Ajaxバリバリのアプリを書くのはまだ、割と手間がかかる。

で、何日か前にオンラインの友達と「Ajaxサーバとかあったらいいのにな(笑)」みたいな話になったのを思い出し、ふとぐぐってみたら、トンでもなさそうなヤツに出くわした。

名を、「Aptena Jaxer」という。こやつこそ、所謂う「Ajaxサーバ」なのだそうな。なんとキッカイな!
で、こいつなら、サーバサイドの処理もJavaScriptで可能という。ますます面妖なヤツだ。
しかもオープンソースらしい。。。嵐の予感がする。。。!

ややや、gihyo.jpも連載組んでおったとは!

これは是非触れておかなくては!

[ネットライフ]Amazon.co.jpの個人情報収集サービス?

ぼくはまちちゃん!の記事より。

おいらも早速ためしてみたよ!

うーん。一言で言うと・・・
これはひどい

本名つきのメールを送信しようとする辺りが凶悪でス・テ・キ!

3/13 12:20 追記
引数submitにsubmitって渡しても、とりあえず送られないようにしたみたい。
「Eメールを送信」ってボタン押して、ようやくメールが送られるんだ。フヒヒw

2008-03-07

[無電源遊戯装置]ガイギャックス氏、天に召される。。。

/.jの記事。

ついにアバタールになられたのか。。。!
D&Dに直接の思い入れはないものの、その後影響を受けたものを存分に遊んできたわけで。
やはり感慨深い。。。。

[ネットライフ]OpenIDとったど!

それだけ!
使用感は追って書いていきますよ。

2008-03-05

[Perl]名前空間指定のサブルーチン定義

今更ながら学習したのでメモ。

例えば、My::Moduleというモジュールを作ったとして。
そのモジュールをuseしたら、newとかしないでいきなりメソッドをコールできるようにする方法。ようするにWeb::Scraperとかみたいな感じ。


package My::Module;
use strict;
use warnings;

*{"main\::hoge"} = sub {
print "ヨロレイヒー!\n";
};

1;


このモジュールをuseするスクリプトは、以下のようにすることができる。

use My::Module;
hoge();
exit;


実行結果はこんな感じ。

ヨロレイヒー!


使いかた次第では、ちょっとしたフレームワークの軸にもなりそうかも?

2008-02-27

[生活]そろそろ花粉の厳しい時期になってきた

いつも思うのだけど、花粉症って公害なんだよね?
対策品の購入費用の補填とかないのか~?

2008-02-26

[Perl]Class::Component プラグインロード直後からインスタンスを生成できた

initを使えばできる模様。
プラグイン側はだいたいこんな感じ。

package Class::Component::Plugin::DBIS;
use strict;
use warnings;
use base 'Class::Component::Plugin';
use DBIx::Simple;
use SQL::Abstract;

sub init : Method {
my ($self, $c, $args) = @_;
$c->{DBIS} = DBIx::Class->connect(
@{$self->{config}->{connect_info}}
);
$c->{DBIS}->abstract = SQL::Abstract->new;
}


で、スクリプト側で、

my @members = $c->{DBIS}->select(
'member',
['*'],
{id=>$id}
);

みたいにできる。これは便利。

2008-02-24

[生活]中掃除&部屋の模様替えをした

我が家のチビ共のおもちゃ箱の中が紙くずだらけになっていた。。。

ざっとゴミ袋1つ分くらい。ありえな~い><

[CPAN]ん~、パスワード発行してくれよ~

Who is Whoに名前とメアドが掲載された模様。
あれ、メアド!あってるじゃん!!オイラtypoしてねー!
じゃあ何でオイラにはパスワードが送られてこないんだ?

Forgot Password?に自分のCPANアカウント突っ込んでもErrorにはならないし、
「今メールでパスワード変更用チケットアドレスおくったよ!届かなかったら連絡plz!」(チョー訳)
とか言ってくれるんだが、その癖に肝心のメールは来ない(12時間待った)し、この場合の連絡先が何処なのかってのも言及が無い模様。。。
これまた困った。。。。

[Perl]Class::ComponentのPluginって

もしかして、MyClass::Plugin::FooBar というプラグインを汎用化しようと思ったら、Class::Component::Plugin::FooBar て名前にしなきゃアカンのかな。。。

なんとなくDBIx::Simpleとかプラグインにしておこうかと思ったから、気になっただけなんだけど。

たとえば、こんな感じ?

package Class::Component::Plugin::DBIS;
use strict;
use warnings;
use base 'Class::Component::Plugin';
use DBIx::Simple;
use SQL::Abstract;

sub dbis_connect : Method {
my($self, $c, $args) = @_;
my $DBIS = DBIx::Simple->connect(
@{$self->{config}->{connect_info}}
);
$DBIS->abstract = SQL::Abstract->new;
return $DBIS;
}

1;


で、これを元にMyClass用プラグインをつくったら、こうなるのかな?

package MyClass::Plugin::DBIS;
use strict;
use warnings;
usr base 'Class::Component::Plugin::DBIS';
1;


試してないけど、どうなんだろう。
もう今日は眠いから、明日試すか。。。

2/24 22:33 追記。
ばっちりうまく動いた。
でも、このソースはオススメできない。

確かに、プラグインは下記のやり方でロードできた。

use MyClass;
my $c = MyClass->new({
config => {
DBIS => {
connect_info => [qw[
dbi:mysql:myapp:mydbsv
mydbuser
mydbpass
]]
}
}
load_plugins => [qw/DBIS/]
});

でも、実際にDBからselectする場合、

my $DBIS = $c->dbis_connect;
my @members = $DBIS->select(
'member',
[qw[id name mail]],
{age=>{'>=',18}}
)->hashes;

のように、いちいちdbis_connectメソッドを呼び出してDBISインスタンスを生成しなきゃならん。これはいかにも面倒だ。しかも、毎回毎回connectしてたんじゃ、オーバーヘッドがハンパ無いことに。

オイラは、

$c->plugin('DBIS')->select(
'member',
[qw[id name mail]],
{age=>{'>=',18}}
)->hashes;

としたいのに。困った。。。

もう少しソースコード追ってみるか。。。

2008-02-22

[ニュース]MS社API公開で、朝日アサヒる?

このコメントからすると、またアサヒったのかという印象しか受けない罠。



ま、実際アサヒったんだろうが。

[CPAN]問い合わせたら、Johan Vromansからレスポンスが!

昨日ついに痺れを切らし、問い合わせをした。
もちろん、オイラ式の最強の英語でね!w

親愛なるPAUSE管理者殿へ。

オイラ、パスワードが必要なんだ。
でも、そんなもんない。:-(

オイラどうすりゃいいの?
サポートしておくれ〜。



で、今日返事があった。
なんと返してきたのは、Getopt::Longやら「Perl5デスクトップリファレンス」で有名なJohan Vromans(ヨハン・ブロマンス)氏。
氏曰く、

お前のパスワードはリセットしておく。新しいパスワードを俺のプライベート・メールアドレスに送ってくれ。新規パスワードをお前のメールアドレスに送ったぞ。


いやはや、見事な読み間違い。。。orz

オイラみたいな困ったチャン相手に、御丁寧にありがとう!Vromans!

---

2/23 0:49 追記

その後もVromansと2度ほどやりとりをするものの(途中オイラの勘違いがあったりして、Vromansに呆れられたりorz)、結局登録メールアドレスがおかしいらしい事が判明。

しかたがないので、他のメアドで再挑戦ですよ><

# Thanks, Vromans!

2008-02-19

[/.j] 「詐欺的DNSサーバ」が増加中

/.jのタレコミ

信頼に足らぬDNSが増えてきたというお話。

そもそも、DNSという仕組み自体が性善説に則っているんだから、困りもの。

とりあえず先祖がえりでhostsファイル配布なんていうネタまで飛び交う始末。。。

もっとも、碌に登録者の身辺情報も探らずにポンポンとドメイン発行しちまうレジストラが一番の問題なんだがねぇ。。。

2008-02-15

[科学]廃熱を音に変換し、冷却装置を実現

WIREDVISIONの記事。

基礎は200年前の技術らしいが、ここまで昇華させると、むしろ未来的にすら見える。
砂漠のような場所では、太陽熱を利用して薬品用冷蔵庫すら実現できるらしい。

音や熱を、効率よく電気エネルギーに変換できれば、さらに面白いことになりそうだ。

[Perl]autoboxとかいうpmがあるらしい。

autobox
忘れないうちにメモ。
レビューはそのうち追記予定。

3/5 23:05 追記
オイラ的にはあまりうれしくなさそうなモジュールだった。
要するに、unblessedな配列やらスカラーに対していろいろメソッド的に標準関数を呼べるようにする代物らしい。そう、unblessedじゃないと全く意味を為さない!
rubyっぽく書きたい人向けなんだね。これ。

[ツール]Sageを使ってみた

Firefoxのプラグインとして提供されているRSSリーダー「Sage」を使ってみた。

そもそもオイラ、Sageを使うまでは、RSSリーダーを使い込んだことが無く、せいぜいRSSに関する触り程度の知識しか持ち合わせていなかった。

そんなオイラでもSageを使えば、サクッと簡単にニュースやブログの巡回が出来ちゃう。

今ではメーラーとともに手放せないソフトの仲間入りですよ。

2008-02-13

[CPAN]返事を待つこと12日

いい加減返事きても良いんじゃないかと。

少なくともメールアドレス間違いのような初歩的なミスはしていないはず。
オイラが抜けてるのであれば、ツッコミくだされ><。

2008-02-08

[CPAN]なぜオイラにPAUSEからの返事がこないのか。

最近、某Perlハッカーな方と仕事をするようになったオイラ。
その方は、オイラのような半人前相手でも嫌な顔ひとつせず(仕事だからでしょうけど)懇切丁寧な対応をしてくださる。
おかげで非常に助かっております。

で、その方とCPANがらみのお話になった際の一幕。

オイラ「実はPAUSEアカウント取得しようとしてるんですよ。」
相手「おお、それはすばらしい。」
オイラ「ただ、もう7日間くらい待たされてまして。。。」
相手「まあ、人力なんで仕方ないですね。ところで、どんなモジュールをあげる予定何ですか?」
オイラ「この前みてもらった、Math::SexagesimalDate::XDateです。」
相手「Dateかあ。。。そりゃちょっと戦う覚悟したほうが良いかもしれませんよ。」
オイラ「ほえ?そうなんですか?」
相手「Date系はDate::FormatとかDate::Calcあたりがデファクトだから...Perlハッカーは車輪の再発明を病的に嫌う傾向にあるんで、下手にコミットすると叩かれますよ。
オイラ「え?ほんまですか?!」

もしかして、オイラがPAUSEに干されてるのって、Date::XDateのせいかな?(;゚皿゚)
Perlハッカーのみなさん!ぜひジェントリィにたのみますよ!><

2008-02-06

[CPAN]へんじがない。ただのしk(ry

もう5日も過ぎてるのに、まだメールが戻ってこない。
さすがに待たせ過ぎじゃないの?:-(

2008-02-01

[PHP]PHP Attack という話

rubyでおなじみのMatz氏のブログで、Attacking PHPなる記事が引用されている。

要するにPHPはダメな子だと言っているわけだ。
IT業界に入って最初に習得した言語がPHPであるオイラから見ても、実に的確なツッコミであると思える。

んじゃ、例えばPerlならこのツッコミにどう対応しているんだろ?
PHPの反論?も交え、両者?にコメントしていただきましょう。

> * いろんなものがfalseだったりするせいで、新たな比較演算子「===」が必要
PHP:明示的に型比較できるんだよ?いいじゃないよー!
Perl:型比較ならref()でおk。こういうところこそ関数で片付けなよ。

> * hashやlistがobjectが区別できない
PHP:foreachがしっかりしてるから、区別する必要自体ないんだから。ていうか、いちいち区別すること自体面倒じゃないのよー!
Perl:やっぱりref()でおk。でもsigilがころころ変わるのはちょっとだるいか。。。

> * オブジェクト指向機能が壊れている
PHP:何を指して壊れてるって言ってんのよー!ていうか、PHP6で良くするから勘弁してー><
Perl:一応真っ当なOOですが。権限設定機能無いのはご愛嬌><

> * lambda(無名関数)がない。create_functionはlambdaじゃない
PHP:必要なら別途ファンクション切って、それをコールすれば良いじゃない。
Perl:sub {}; でおk。てかPHP、お前なんでそんな面倒な事強要するんだよ。。。

> * short_open_tagsやらsafe_modeやらregister_globalsがonになってるかもしれない
PHP:onじゃないと使えない機能とかあるんだから、仕方ないじゃない!
Perl:そんな環境設定無いが、何か?それにしてもPHP、その格好はどうにかならんのか。目のやり場に困る。。。

> * 一貫性のない名前(str_replace,strlen,parse_strとか)
PHP:そっ、そこはらめぇ
Perl:お前涙目wwwwww

> * 引数の順番がわかりにくい(in_arrayとかstrposとか)
PHP:ちょっとー!個人の主観だけで文句いわないでよー!ちゃんと統一すべきところはしてるつもりなんだからー!in_arrayとstrstrは同じような順番で受け付けてるじゃないのよ!
Perl:まあ、こいつはポリシーとかその辺の問題じゃないか?目くじら立て過ぎだろ。

> * strpos('abcd','a')は0を返すが、0は偽である
PHP:そんなこと言うなら、=== 使えばいいじゃない!ホラ、つかいなさいよ!
Perl:indexとか、俺涙目;;ref()マンセー!!

> * PHPで書かれたたくさんのアプリがあるがどれもHTMLとロジックが分離されてない(本当?)
PHP:それは書き手が悪いのよ!アタシのせいじゃないんだから!
Perl:ある意味、これは俺も同じ問題抱えてるかもな。。。

> * 「PHPは初心者に学びやすい」と言われる。確かにそうかもしれないが、 おかげでどれだけのSQLインジェクションやらXSS脆弱性やら、 ひどいコードが放置されていることか
PHP:だーかーらー!アタシのせいじゃないんだってばー!
Perl:そうでもないんじゃないか?まあ、書き手にも問題はあるんだけどな。

* グローバル。使うんじゃないってば。
PHP:だめ〜?
Perl:だめだっての!

[CPAN]PAUSEに登録申請

CPANにPerlModuleを登録したいので、メンバー登録申請をしてみた。
ページは全部英語だし、登録内容も全部英語で書かないとダメらしい。

ま、オイラの実力をもってすれば英語なんて余裕なんだけど。
(・∀・)スンスンス-ン♪

2008-01-11

開設

YellowTurtleでぃ〜っす。

オペンしましたが、取り立ててテーマがある訳じゃないです。
まあ強いて言うならば、興味あること以外は書きません。当然ですが。
ともあれ、概ね
  • IT関連(個人興味レベルに留めますが。)
    • Perl
    • PHP
    • Lua
    • Linux
    • IPネットワーク
  • 生活一般
    • 自炊メシ
  • アバウトかつわかりにくい思いつき等。。。
あたりの話題を主に扱うのではなかろうかと。このように考えております。。。
コンセプトは生きた証!!!
まあせいぜいそんな程度ですよ。。。

そもそもトラックバックとか殆どようわかりません。そんなんで良いのかと。。。