新しいblogに移行しました

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

2010-12-27

[Perl]キリル文字→ローマ字の翻字をするには

以前にも挑戦してうまくいかなかったキリル文字の翻字。
一時はモジュールの自作も検討しましたが、CPANにそれを実現してくれるモジュールがありました。

その名も、Lingua::Translit

Lingua::Translitの使い方。


使い方はPODにも書いてある通り。簡単です。

use warnings;
use strict;
use Lingua::Translit;

my $lt = Lingua::Translit->new( 'GOST 7.79 RUS' );
my $text_tr = $lt->translit( 'Этот модуль завершила моё предназначение.' );
print $text_tr. "\n"; 

結果。
$ perl translit.pl 
E`tot modul` zavershila moyo prednaznachenie.

友人に教わったキーワードのおかげで発見できた

このモジュールはおそらく、自力のみでは見つけられなかったと思います。

僕はロシア人の友人と時折オンラインでやり取りするのですが、ある日彼に、「キリル文字を翻字するモジュールを自作したいんだけど、参考文献ってある?」と訊いたところ、「ГОСТ(GOST)という翻字の仕様があるよ!」と教えてもらいました。

「GOSTかぁ、なるほど。もう一度CPANで引っ張ってみよう。」
新たなキーワードを元に「Cyrillic GOST」でサーチしてみると、もうこのディストリビューションしかマッチしない状態に。
こうして、目的のモジュールをようやく発見することができました。

学ぶのならば、とにかくわかる人に訊こう

Perlハッカーの皆さんに訊けば、もっと早く発見できたでしょう。
今回訊いた友人もプログラマではありますが、Perlには精通していないよう(彼の専門はJavaおよびProlog)でした。
しかし、より広い知識を得るという意味で、ロシア人にロシア語のことを訊いたのは正解だと思っています。

Спасибо, Firegurafiku!

2010-12-24

[Perl]VEコンテナにperlbrewインストールすると「whichが使えない」と叫ぶ

# perlbrew list
Can't exec "which": No such file or directory at ./perlbrew line 522.
Use of uninitialized value in substitution (s///) at ./perlbrew line 523.
  /usr/bin/perl (5.8.8)
こうなったときは、
# yum -y install which
するといいです。

[Linux]コマンド名からrpmを探す

メモ。

あるプログラムが含まれているRPMパッケージを探すには

たとえば which を探す場合。
# whereis which
which: /usr/bin/which /usr/share/man/man1/which.1.gz
# rpm -qf /usr/bin/which
which-2.16-7

とすれば見つかる。

2010-12-15

[OpenVZ]メモリリソースの割り当て

割り当て

例えば、ID300のコンテナにメモリリソースを割り当てる際、最低確保するメモリを64M、最大メモリを256Mに設定する場合。
# vzctl set 300 --privvmpages 64M --vmguarpages 256M --save
で設定できます。

確認

まだコンテナを起動していない場合は、コンテナを起動する必要がありますので、起動しておきます。
# vzctl start 300
コンテナを起動したら、
# vzctl exec 300 free -m
で、メモリが確保されていることを確認しましょう。
# vzctl exec 300 free -m
             total       used       free     shared    buffers     cached
Mem:            64          8         55          0          0          0
-/+ buffers/cache:          8         55
Swap:            0          0          0

[OpenVZ]CPUリソースの管理と割り当て

CPUリソースの管理

vzcpucheckコマンドで、現在割り当てられているCPUリソースと、ハードウェア全体におけるCPUリソースが把握できます。
# vzcpucheck
Current CPU utilization: 7000
Power of the node: 600010

コンテナに割り当てるCPUリソースを変更する

例えば、ID300のコンテナに割り当てるCPUリソースを変更するとして、最低限確保されるCPUリソースを2000、最大CPUリソースを6000にする場合は、
# vzctl set 300 --cpuunits 2000 --cpulimit 6000 --save
とすればOKです。

2010-12-13

[Perl]Hachioji.pmに参加しました

uzulla氏主催のもと、12/11(土)に八王子にて開催された(東京西部、多摩地域).pm #0に参加してきました。

八王子のアクセスの良さはぁァァァァ、西東京一いぃィィィィッッッ!!!

まず、会場となった八王子は中央線、京王線、横浜線をカバーし、アクセスが非常に良いです。
しかも!八王子の駅がめっちゃキレイ!!で、バカでかいビッ○カメラがあったりして、機材調達にも事欠きません!

Hachioji.pmとTakao.mtが名前の候補に。

Takao.mtは高尾山青空ハッカソンのイベント名に譲ることにして、Hachioji.pmを正式名称とすることに決定。
こういうアウトドアなイベントはいいですね!ただ、回線が届くかどうかが心配ではありますが。。。

八王子は立川と仲が悪いらしい?

西八王子の某氏曰く「いけ好かねえ感じ」だそうで。。。
Hachioji.pmに名前が決まったことで、「立川にpmないの?マジ?プギャーm9 (^Д^) 9m」できるんだとか何とか。。。
まあそんな事気にせず、立川の皆さんもぜひHachioji.pmを盛り上げていただければ幸いです!

意外とインフラエンジニアの方が多かった

業務でSolarisつかってます!という方が多かったですね。
あと、メール周りでIPv6関連に手を出している方がいたのも、非常に興味深かったです。
今後の勉強会等では、渋谷・横浜とは違った方向性の発表があるかもしれませんね。
WebアプリやクローラーだけがPerlじゃない!というところをもっとアピールしていきたいです。

活動スケジュールについてはちょっと独特

基本的に渋谷や横浜は平日開催だったりするようなのですが、Hachioji.pmは今後、土日開催の方針だそうです。
業界的に、業務が夜間まで及ぶケースが多い人間にとって、これは本当にありがたい話ですね。

普段のコミュニケーションの舞台はTwitter

ハッシュタグは#hachiojipm。IRCメインじゃ無いところが今風ですね。
IRCのチャンネルも用意する方向だそうです。

サイトはどうする?活動報告はどこでやるの?

活動報告を、Acme::Hachiojiのような名前のモジュールにしてCPANにアップするとかいうネタ発言があったのですが(charsbar氏によると、Barcelona.pmで似たような試みがあるそうです)、これは本当にやるんでしょうか?
やるとしたら、PODに活動報告を書くことになるんでしょうか。。。

次回は新年会!

次回は新年1月に開催する見込みのようです。

2010-12-07

[Perl]perlbrew + cpanmで任意のディレクトリにperl環境を構築する

perlbrew+cpanmでPerl環境を丸ごとホームに置く - nabnabの日記の通りに進めたところ、問題なく構築できましたというお話。

ログ等を取りそびれたので、後日ちゃんとログ付きで記事を起こしなおします。。。

[Perl]明示的なハッシュリファレンスの指定について知った

ハッシュリファレンスを書くとき、
my $a = { hoge => 'fuga' };
のように書くわけですが、とあるPerlコードを覗いていたとき、
my $a = +{ hoge => 'fuga' };
のような記述を見かけたわけです。
ぱっと見て、'+'が何なのかよく解らなかったので、Twitterで聞いてみたところ、
  • 明示的にハッシュリファレンスを渡している
  • 単項の+はNOPなのでB::Deparseで同一になるはず
とご教示いただきました。ありがとうございます。

実際に確認してみました。
スクリプトは以下のように記述。
use warnings;
use strict;
use Data::Dumper;

my $a = { hoge => 'fuga' };
my $b = +{ hoge => 'fuga' };

B::Deparseに通してみたところ。
$ perl -MO=Deparse ./hoge.pl
use Data::Dumper;
use warnings;
use strict 'refs';
my $a = {'hoge', 'fuga'};
my $b = {'hoge', 'fuga'};

たしかに同一ですね。syntax-sugarと思ってOKそうです。

2010-11-16

[Perl]リファレンスをそのままintしたらどうなった


hironorism
hironorism: int([])とかint({})とかリファレンスをint評価したときに取れる数字これなあに? #perl11:52am, Nov 16 from Twit for Windows
ytnobody
ytnobody@hironorism なにそれこわい><11:52am, Nov 16 from HootSuite

ということがあったので、検証。

use Data::Dumper;

my $a = {};
print $a."\n";
print Dumper( int $a );
print Dumper( sprintf '%08lx', int $a );

結果こちら。

HASH(0x85e7818)
$VAR1 = 140408856;
$VAR1 = '085e7818';

[生活]ついに30歳になりました

去る11/13、とうとう30歳の誕生日を迎えました。

今年は全般的に多忙なせいか、去年のような絨毯爆撃は喰らっていませんw

2010-11-09

[Perl]LWP::UserAgentとかでファイルアップロードしたい

HTTP::Request::Commonのドキュメントに書いてあるんですけど、思いのほかうまく探せませんでした。

use warnings;
use strict;
use HTTP::Request::Common;
use LWP::UserAgent;

my $req = POST( 
    'http://upload.er/uploader.cgi',
    Content_Type => 'form-data',
    Content => {
        data => [ "file.txt" ],
    } 
);

my $ua = LWP::UserAgent->new;
$ua->request( $request );

これでfile.txtをうpしてくれます。

2010-10-27

[Perl]遂にYAPC::Asia 2010へ参加してきました!!

いまさらなエントリです。はい。

既にYAPC::Asia 2010 2日目ライブレポートにある通り、去る10/15(金)~10/16(土)に開催された、念願のYAPC::Asia 2010に参加してきました!
イベントそのものについては公式サイトに譲るとして、僕自身の感想を残しておきます。

著名なPerlハッカーと話せる!

例えばdankogaiさんやlestrratさん、Yappoさん等、国内の著名Perlハッカーと話すことができます!
他愛もない話から、Perlに関するまあまあディープな話題まで、彼らは気さくに応じてくれました!
dankogaiさんとYappoさんに至っては初対面にも関わらず、です。
miyagawaさんは基調講演で、「Perlは人と人をつなぐグルー言語」という様な事を仰ってましたが、正にこれを体現した出来事でしょう。
そして、Perlの作者であるLarry Wallさんにも会うことができました!!

自分とは別の視野を直に吸収できる

当たり前なんですけど、各トークではそれぞれスピーカーの視点に則って発表されます。
ただ、普段周りにPerl使う人が少ない環境に置かれているせいか、これはかえって新鮮に感じました。

Perl Mongersの有り様について、考えを改めた

PMグループディスカッションを見て、考えが変わりました。
現在、国内にはShibuya.pmを筆頭にいくつかのPerlのユーザーグループがあって、それらは「Perl Mongers(略してPM)」と呼ばれたりします。
それまで僕はこれを「技術的にハイレベルじゃないといけない」という概念を持って見ていたわけですが、Tokyo.pmの前田さんが「活動当初は月1回の飲み会が目的だった。」「人と人とのつながりが大事」という様な事を仰るのを聞き、僕の中で、えらく敷居の低い身近なものへと姿を変えていきました。
要するに、「Perl使い同士で呑んだりダベったりする会」だよね?って。そういう気楽なものの方が長続きするだろうし、いいなあ、なんて思ったり。

相模大野/町田あたりでもこう言うのやれれば良いんですがねえ。。。

Perlで笑える

ライトニングトーク(LT)はとにかく小ネタの連続でした(gihyo.jpさんのコチラの記事が秀逸)。例えば…
・dameningenさんの「草植系」言語実装Werl
・nipotanさんの縛り付きシャッフル地獄「There are so many ways to shuffle it」
等など。無論、真面目なLTもありました。
しかし、爆笑系LTに共通して言えるのは、ハイレベルな技術に裏打ちされている内容だと言うこと。
Perlで笑わせるには、それ相応のPerl習熟度と、突飛もない感性が必要に思えます。

運営さんが素敵

参加者のマナーが良いこともあるのでしょうが、会場にゴミが落ちてない!
受付は滞り無く処理され、各種案内もしっかりしていました!
lestrratさんをはじめとするJPAスタッフの皆さま、本当にありがとうございました!!

Larry Wallと間近で会食!

閉会後、後夜祭に参加したのですが、すぐ近くにJim PickさんとLarry Wallさんが!!!
これはすげえや!!!

…ということで

初参加のYAPC::Asiaでしたが、誰かと連れ立って行った訳でもないのに十二分に楽しめました!

2010-10-16

[Perl]YAPC::Asia 2010 2日目ライブレポート

聞いた事そのままです。
感想とか後でまとめたいなー。

How Xslate works - gfx

電車遅延のため10分送らせてスタート。
The next generation template engine

gfx loves perl internal;)

Template engine for perl5
xsで書かれてる。
MakamakaさんがPurePerl版をかいてる
なぜ今更テンプレートエンジンか?すでに様々なテンプレートエンジンがあるのに。
→それぞれ一長一短。完璧なものがない。

Template::Text
なんでもできる。
プラグインもある。
だが遅い。
複雑。
XSSを産みやすい。

HTML::Template
早い。
機能が絞り込まれていて、良い。
Perlのインターフェースが使いにくい。
機能が貧弱。
XSSをとてもうみやすい。

Text::MicroTemplate
早い。簡単にインストールできる。PurePerlなので。
XSSに強い。
Perlのシンタックスなので、非Perlな人には辛い。

今のところ最高のものがない。XslateはCPANでは最速。

コロンで行を始めると、コードになる。
CUIではxslateコマンドを提供。
-TTerseオプションを指定すると、TTライクなテンプレート構文になる。

Cacheがあれば、最速。by Sam Graham

XSS対策

従来のテンプレートエンジンは全てエスケープ。
Text::micfoTemplate譲り。
アンエスケープ機能もあるけど、使うなw

テンプレート構文
Kolon デフォルト。
TTerse tokuhiromからの強い要請。パフォーマンス低下はない。
Clevery Smarty的なやつ。

拡張可能。

テンプレート継承
Kolonでのみ使える。
TTのラッパーのすごいやつ。

実行プロセス
まずテンプレート構文をプリプロセス。
中間コードをパースし 、ヴァーチャルマシンに食わせる。

Top Down Operator Precedence

Data::MessagePackをバイトコード保存に使用。

テンプレートエンジンは、HTML escapingがボトルネックになる。

WAFにも組み込んで見て!
お金ないから投票よろしく!w

質疑
こばやしさん
q なぜVMを実装することにしたのか?
A Perlそのものでは余計な処理が入るので。

dankogai
perl6でvmじっそうすれば?

他の言語向けのバインディングは?
>考えてません。

Ajax Application Testing - Yappo

Ficiaという写真共有サービスで使った、JSTAPdというツールの話
JavaScriptのテストツールはいろいろある。

各種ブラウザのjavascriptエンジンを使ってテストしたい。
Ajax のテストをしたい。
Cliのツールがいい。

ユーザが使うかもしれないブラウザでの自動テストが重要。

インストール
cpanm jstapd

テストコードはjavascriptでかく。
が、Test::More的なシンタックス。というか、まんまTest::MoreをJavaScriptに持ってきた感じ。
01test.tにjquery_jstapd.plという文字列リファレンスを食わせると、テストコード内でjQueryが使える。
tファイルには、JSTAPd::Suiteをuse.

conf.pl内にブラウザ起動のシステム構文>cliで自動テスト!

*.tファイルにはサーバサイドのテストコード。
*.jsにajaxのテストコード。
jstapDeferred使わないと、非同期な処理ではテストにならないので注意。

PSGI+Plack+Twiggyで構築。

質疑応答
刺身さん非Ajaxなテストはどう書けばいいの?
>普通に書いてください。

Perlで任意精度計算 - Daisuke Maki

普通は、整数部3桁、小数部7桁までしか表現出来ない。
本当に正確な値を求めたい場合に問題。
誤差から生じるエラー幅がどんどん桁が膨れ上がる。

任意精度計算とは任意のデータ量で任意のデータ幅を計算する。

旧暦について
地球から観測した月と太陽の緯度で決まる。
昔の人はこれをちゃんと計算してた。
月の満ち欠け 29.5日周期。
太陽周期 365.2日周期
これらを計算しないと旧暦を求められない。
高精度を要求される。これをPerlでやりたい。

print 1/86400;
これでは小数点以下18桁しか求められない。
正解は小数点以下59桁

Math::BigIntの問題点
文字列としてデータを渡さないといけない。
1value = 1objectなので、非常に遅い。
plainなperlと比較しても、600~700倍の時間がかかる

じゃあどうする? > goodbye perl!
Cでやらせます。→MPFRというライブラリを使う。

DateTime::Astroとしてあげ直した。
結果、Math::BigBit比54倍の処理速度。

perlからは文字列でデータを渡す。鉄則。
Perlでやらない方がいいものもある。
旧暦計算は楽しい。

XSからPPへ - Makamaka

xsをpureperlにする話。

XSをPPにすると
ポータビリティ向上。
xsの知識が得られる。
暇つぶしになる。

でも
遅い。
最高に車輪の再発明。
遅い。

テストは重要。動作を合わせるうえで。
エラーテストがあるとなお嬉しい。

ノウハウは、モダンPerl入門の8章に載ってます><

dankogai
Perl5をPP化してくださいw

Unix programming with perl - Kazuho Oku

テストが通るのと、コードが正しいかとは別。

Errno
use Errno;
$! is dualvar.

どうやってerrnoの一覧とその意味を?
man 2 mkdir

可搬性を重視なら、opengroupの資料を参照。

Fork
Dbiの場合、子プロセスにてInacfiveDesfroy変数を立ててからDisconnect。
親プロセスで開けたファイルハンドルは親プロセスで閉じておく。

Unix signals
ネットアプリケーションが止まる場合、SIGPIPEの処理がないからだったりする。
$SIG{PIPE} = IGNORE
タイムアウト時の処理をSIGALRMで。
$SIG{ALRM} = sub{ ... };
Gearman::Worker等で使われているノウハウ。

この辺の話は、Web+DB Pressでも。

Inside mbga platform - Toru Yamaguchi

途中からききました。

OpenSocial container 俗に言うYahooモバゲーの内部設計
Apache shindig を使用したOpenSocialコンテナ。

Inside Social API 
軽くてシンプルなのが要求される。
余分な機能は不要。
既存のWAFを使わず、Plackでおk。
Webserver ligttpd 
Routing Route::Simple
Config pl

Model
APIのロジックを記述。
原則的にやりとりするデータはscalar, array ref, hash ref.
軽量化の為、無駄なインスタンスを作らない。(オブジェクトにしない)
Object::Containerにモデルを突っ込んでおく。

接続情報はmemcachedにあるというモバゲーの流儀。
Object::Container++

DBI::DBHResolver
複数のデータソースへの接続を一元管理。

DBIx::Connector
DBIの薄いラッパー。

SQL::Abstract::*
SQL書くのはたいていこれで。
JOINする場合は、直接ヒアドキュメントで。

MySQL
日時によるパーティショニング
Triggerの積極利用。
Trigger+Q4Mでテーブルを動的に変更。 検証中。

Db接続のラウンドロビンは、負荷の不均衡を招くかも。
 

2010-10-05

[Perl]PlackのSyntax Sugar "Flea"を試してみた

最近ご無沙汰だったPlackに触るべく、何かネタがないかなー、とCPANをフラフラと彷徨っていたところ、Fleaというモジュールが目につきました。
面白そうだったので、さっそく試してみましたという記録です。
あくまで、Synopsisをなぞった程度なんですけどもねー。

※Flea = "ノミ"の意だそうで、podみててもノミを思わせるジョークがちらほらと見受けられます。

まず、トップに表示するhtmlをこさえます。

index.html

<html>
<head>
  <title>Flea ノミのように小さなPlack Syntax Sugar</title>
</head>
<body>
  <h1>Flea ノミのように小さなPlack Syntax Sugar</h1>
  <p>工事中</p>
</body>
</html>

で、psgiファイルを用意します。

flea.psgi

use Flea;
my $app = bite {
    get '^/$' {
        file 'index.html';
    }
    get '^/api$' {
        json {
            name => 'Flea',
            ja => 'ノミ',
        };
    }
};
通常のpsgiではちょっとあり得ないほどシンプルになってます。特にルーティングまわり。
podによると、このあたりはDancer譲りのようです。Dancer使ったことないので、よくわかってませんけど。

手元の環境は上位にロードバランサーがいるので、とりあえずそこからtcp4000番にバランシングするように予め設定しておきました。
で、起動ですね。今回はServer::Starter + Starmanで起こしてみました。(最速セットアップ案内 Catalyst on Starmanを参照。)
[root@nethard myflea]# start_server --port 4000 -- starman --worker 8 ./flea.psgi 
start_server (pid:901) starting now...
starting new worker 902
Setting gid to "0 0 10 6 4 3 2 1 0"

ではブラウザでアクセスしてみます。
ちなみに、/psgi以下に今回のアプリを組み込みました。
まず、'/psgi/'にアクセス。


おお!当たり前ですが、うまくできてしまいました!!
さて次は、'/psgi/api'にアクセス。JSONが出ればOKです。


こちらもうまくいきました!
小さなサービスを作るときの手段としては、悪くないかも。

2010-09-27

[Linux]vimで文字化けする場合の対処

~/.vimrcに以下の記述を加えると良いそうで。
set encoding=utf8
set fileencodings=iso-2022-jp,sjis,utf8

2010-08-24

[Linux]Apacheがセマフォテーブルを食いつぶしたときの対処方法

さっき突然Apacheが寝ちゃって、その上error_logに
[emerg]: (28)No space left on device
などという血文字を残していた。

とりあえずググってみると、
httpdが起動しない! - 専用サーバーならプラスアルファレンタルサーバーの専用サーバー
というページを発見。

vi /etc/httpd/logs/error_logで (ここで最後の50行表示して確認)

○エラー: No space left on device: mod_rewrite: could not create rewrite_log_lock
○エラー: No space left on device: Cannot create SSLMutex Configuration Failed

このようなログが残っていたら以下のコマンドでセマフォテーブルをクリアする。↓

# ipcs -s | grep apache | perl -e 'while () { @a=split(/\s+/); print `ipcrm sem $a[1]`}'

2010-08-13

[Perl]Data-Model-0.00006のインストールで嘆いていたら

とあるXen環境で、Data-Model-0.00006のインストールに失敗して、原因を調べていたのですが、テストこけた箇所しか解らない状態ではまってしまいました。
「もうダメだ、とりあえずこのやるせなさを吐き出そう」と思い、つぶやいてみたところ、事態は思わぬ方向に。

ytnobody
ytnobody: Data::Modelはいんない>< t/010_core/iterator.t:76で、'empty is undef'のはずが ''を返してきてる~>< #perl7:52pm, Aug 13 from Web
Yappo
Yappo@ytnobody 環境おしえてくださいー><7:58pm, Aug 13 from Echofon
ytnobody
ytnobody@Yappo uname -r で 2.6.18-164.10.1.el5xen なCentOS5.4です;;8:02pm, Aug 13 from HootSuite
Yappo
Yappo@ytnobody あざっす!perlのバージョンとかはどうでしょう? あと cpan のです? githubのとかどうでしょ? http://github.com/yappo/p5-Data-Model8:06pm, Aug 13 from Echofon
ytnobody
ytnobody@Yappo CPANの0.00006です。githubの試してみます!ありがとうございます!8:08pm, Aug 13 from HootSuite
Yappo
Yappo@ytnobody Test::Builderが新しいとテストがこけるようです。とりあえず、そこだけこける分には問題無いと思います。あとでData::Modelの方なおしときます><8:11pm, Aug 13 from Echofon
ytnobody
ytnobody@Yappo ありがとうございます!とりあえず実務系環境なので、gitバージョンは別のXen環境で検証します!8:15pm, Aug 13 from HootSuite
Yappo
Yappo@ytnobody githubのでもTest::Simpleが0.96だと、そこのテストこけること確認しました><すいませんすいません。8:17pm, Aug 13 from Echofon
ytnobody
ytnobody@Yappo わざわざありがとうございます>< 状況把握です!8:23pm, Aug 13 from HootSuite

作者登場ですよ!ちょっくらビビりつつも、非常に困っていたので、遠慮なく環境を伝えました。
Test-Simple-0.96だとtestこけるらしいので、改めて手元の環境を確認してみると、
# perl -MTest::Simple -le 'print $Test::Simple::VERSION;'
0.96

あー、ばっちり該当してるんですね~、とりあえず報告っと。。。


ytnobody
ytnobody: 手元の環境、Test::Simple-0.96でした8:27pm, Aug 13 from HootSuite
Yappo
Yappo@ytnobody あざっす!晩飯おわってからやります><8:29pm, Aug 13 from Echofon
ytnobody
ytnobody@Yappo ありがとうございます><8:31pm, Aug 13 from HootSuite


どうやら対応してくれる模様です!感謝!><

9/9追記
Data-Model-0.00007がリリースされました!

2010-08-08

[ネットライフ]ロシア語学習ブログをはじめました

「ブログを書かないと覚えない」ということが最近わかってきたので、思い切ってロシア語学習ブログЗолотые заклинание ~金色の呪文~をオープンしました。

2010-08-02

[Linux]TokyoTyrantの相互レプリケーション

今更なタイトルですが、忘れっぽいオイラ自身のためのメモですので、「出遅れすぎ」とかいうツッコミは全力スルーさせていただきますw

要するに、ttserverのオプションに -ulog、-mhost、-mport、-sid を渡してあげれば良いんです。

ノード1(192.168.1.1)

# mkdir /var/ttserver/ulog
# ttserver -port 1978 -sid 1 -mhost 192.168.1.2 -mport 1978 -ulog /var/ttserver/ulog casket-1.tch

ノード2(192.168.1.2)

# mkdir /var/ttserver/ulog
# ttserver -port 1978 -sid 2 -mhost 192.168.1.1 -mport 1978 -ulog /var/ttserver/ulog casket-1.tch

これだけで、相互レプリケーションなKVSをセットアップ出来ちゃうんですねー。素晴らしいです。

2010-8-27 追記
Xen環境だと、以下のエラーが出ました。
そもそもレプリケーション出来ない模様です。
do_repl: tculrdnew failed

2010-07-28

[JavaScript]ただ単純にTwitterのTLを自動リロードするだけのブックマークレット

タイトルのまんまです。
とりあえずJimbezameという仮の名前をつけておきます。
javascript:(
  function(e){
    setInterval(
      function(){
        if(parseInt($('#new_results_notification').css('height'))>0){
          $('#results_update').trigger('click');
        }
      },3000
    );
    alert('Jimbezame, ready ok.');
  }
)(document)

2012/6/16 追記
新しいTwitter webに対応したバージョンです。
javascript:(
  function(e){
    setInterval(
      function(){
        if($('div.new-tweets-bar')){
          $('div.new-tweets-bar').click();
        }
      },3000
    );
    alert('Jimbezame, ready ok.');
  }
)(document)

2010-07-27

[JavaScript]今見てるページをTwitterにPOSTするブックマークレット

ChromeやFirefoxなんか使ってWebを色々見てるときに、ふと
「このページ、TwitterにPOSTしとこ!」
とか思い立ったりするんですけど、これ、まともにやると意外と手間なんですよねえ。
ページのタイトルコピーして、新しいタブ開いて、Twitterにアクセスして、タイトルをペースト。
まだまだ!さらにもいっちょ新規タブ開けてbit.lyにアクセス!でもって元ページのURLコピってbit.lyにペーストしてshortenボタンクリックして、出てきたURLコピって、Twitterのタブ開けてペーストして、ようやくつぶやける。非常に面倒です。

あ、それHootなんたらでとかいう野暮はナシでお願いします。

さて、こんな面倒なもんやってられっけー!という向きには、ブックマークレットを用意しましたので、使ってやってください。
但し!使う前に、若干手間をかけてもらいます。

bit.lyにアカウントを作る

bit.lyにアクセスして、アカウントを作って下さい。

bit.ly API Keyを取得する

bit.lyのアカウントを作ったら、your bit.ly API Keyにアクセスして、loginとAPI Keyをコピーします。

ブックマークレットのソースを書き換える

以下、ブックマークレットのソースです。適当にコピーしてエディタとかに貼り付けて下さい。
javascript:(
  function(e){
    var login="your_account";
    var apiKey="********";
    var bitlyURL='http://api.bit.ly/shorten?version=2.0.1&format=json&callback=cb&login='+login+'&apiKey='+apiKey+'&longUrl=';
    var cbfunc = e.createElement('script');
    cbfunc.type = 'text/javascript';
    cbfunc.innerText = 'function cb (res){var jumpURL="http://twitter.com/home?status="+encodeURIComponent(document.title+" "+res.results[location.href]["shortUrl"]);location.href=jumpURL;};';
    e.body.appendChild(cbfunc);
    var script = e.createElement('script');
    script.type = 'text/javascript';
    script.src = bitlyURL+encodeURIComponent(location.href);
    e.body.appendChild(script);
  }
)(document)

このソースコードのうち、この部分の値
var login="your_account";
    var apiKey="********";
を、先ほど取得したbit.lyのアカウント(login)とAPI Keyに置き換えて下さい。

書き換えたソースをブックマークレットとして登録する

あとは、ブラウザのブックマークの管理等を開き、新しいブックマーク(名前はご自由にどうぞ)として、出来上がったソースをアドレス部分にペーストして登録します。これがブックマークレットとなります。

使い方

・まず、TwitterにPOSTしたいと思ってるページにアクセス。
・次に、先ほど作成したブックマークレットをクリック。
・Twitterにアカウントがあってログイン状態なら、そのままtweetできる状態となっています。

注意!!

絶対に自分や他人のAPIKeyやloginが含まれた状態でこのブックマークレットを公開したり配布しないように!
最悪の場合、bit.ly APIにアクセス出来なくなって、結果的にTwitterへのPOSTが上手くいかなくなる恐れがあります。

2010-07-08

[Perl]Catalystのフィルタプラグインを書く

フィルタプラグイン

ここで云う「フィルタプラグイン」ってのは、従来の出力結果を書き換えるプラグインのことです。まんまですね。
で、肝となるのは以下3点。

1. Pluginなのでuse Moose::Role
2. フィルタなのでfinalizeで色々するけど、基本はoverride finalize
3. finalizeは$c->next::method( @_ )をreturnする

例えば、水を汁に置き換える

但し、body内のデータはUTF-8であることが前提です。
package WaterToJuice;
use Moose::Role;

override finalize => sub {
    my $c = shift;
    $c->res->{ body } =~ s/水/汁/g;
    return $c->next::method( @_ );
};

1;
__END__

2010-06-30

[Perl/テスト]Cache-Memcached-Fast-0.19/0.18

環境

Perl5.8.8でテスト通りませんでした。念のため、環境。
# perl -V
Summary of my perl5 (revision 5 version 8 subversion 8) configuration:
  Platform:
    osname=linux, osvers=2.6.18-53.el5, archname=x86_64-linux-thread-multi
    uname='linux builder10.centos.org 2.6.18-53.el5 #1 smp mon nov 12 02:14:55 est 2007 x86_64 x86_64 x86_64 gnulinux '
    config_args='-des -Doptimize=-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -Dversion=5.8.8 -Dmyhostname=localhost -Dperladmin=root@localhost -Dcc=gcc -Dcf_by=Red Hat, Inc. -Dinstallprefix=/usr -Dprefix=/usr -Dlibpth=/usr/local/lib64 /lib64 /usr/lib64 -Dprivlib=/usr/lib/perl5/5.8.8 -Dsitelib=/usr/lib/perl5/site_perl/5.8.8 -Dvendorlib=/usr/lib/perl5/vendor_perl/5.8.8 -Darchlib=/usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi -Dsitearch=/usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi -Dvendorarch=/usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi -Darchname=x86_64-linux -Dvendorprefix=/usr -Dsiteprefix=/usr -Duseshrplib -Dusethreads -Duseithreads -Duselargefiles -Dd_dosuid -Dd_semctl_semun -Di_db -Ui_ndbm -Di_gdbm -Di_shadow -Di_syslog -Dman3ext=3pm -Duseperlio -Dinstallusrbinperl=n -Ubincompat5005 -Uversiononly -Dpager=/usr/bin/less -isr -Dd_gethostent_r_proto -Ud_endhostent_r_proto -Ud_sethostent_r_proto -Ud_endprotoent_r_proto -Ud_setprotoent_r_proto -Ud_endservent_r_proto -Ud_setservent_r_proto -Dinc_version_list=5.8.7 5.8.6 5.8.5 -Dscriptdir=/usr/bin'
    hint=recommended, useposix=true, d_sigaction=define
    usethreads=define use5005threads=undef useithreads=define usemultiplicity=define
    useperlio=define d_sfio=undef uselargefiles=define usesocks=undef
    use64bitint=define use64bitall=define uselongdouble=undef
    usemymalloc=n, bincompat5005=undef
  Compiler:
    cc='gcc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -fno-strict-aliasing -pipe -Wdeclaration-after-statement -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I/usr/include/gdbm',
    optimize='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic',
    cppflags='-D_REENTRANT -D_GNU_SOURCE -fno-strict-aliasing -pipe -Wdeclaration-after-statement -I/usr/local/include -I/usr/include/gdbm'
    ccversion='', gccversion='4.1.2 20071124 (Red Hat 4.1.2-42)', gccosandvers=''
    intsize=4, longsize=8, ptrsize=8, doublesize=8, byteorder=12345678
    d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=16
    ivtype='long', ivsize=8, nvtype='double', nvsize=8, Off_t='off_t', lseeksize=8
    alignbytes=8, prototype=define
  Linker and Libraries:
    ld='gcc', ldflags =''
    libpth=/usr/local/lib64 /lib64 /usr/lib64
    libs=-lresolv -lnsl -lgdbm -ldb -ldl -lm -lcrypt -lutil -lpthread -lc
    perllibs=-lresolv -lnsl -ldl -lm -lcrypt -lutil -lpthread -lc
    libc=, so=so, useshrplib=true, libperl=libperl.so
    gnulibc_version='2.5'
  Dynamic Linking:
    dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E -Wl,-rpath,/usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi/CORE'
    cccdlflags='-fPIC', lddlflags='-shared -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic'
手っ取り早く言うならば、Cent5.3の標準Perlですね。

0.19をテスト

まずは、現時点で最新バージョンである0.19から。
# cpanm Cache::Memcached::Fast
Fetching http://search.cpan.org/CPAN/authors/id/K/KR/KROKI/Cache-Memcached-Fast-0.19.tar.gz ... OK
Configuring Cache-Memcached-Fast-0.19 ... OK
Building and testing Cache-Memcached-Fast-0.19 for Cache::Memcached::Fast ... FAIL
! Installing Cache::Memcached::Fast failed. See /root/.cpanm/build.log for details.
build.logを見てみます。
# Testing Cache::Memcached::Fast 0.19, Perl 5.008008, /usr/bin/perl
t/00-load.t ....... ok
# Connected to 2 memcached servers, lowest version 1.4.5
t/01-connect.t .... ok
t/02-isa.t ........ ok
t/big_value.t ..... ok
t/commands.t ...... ok
t/key_ref.t ....... ok

#   Failed test at t/magic.t line 52.

#   Failed test at t/magic.t line 53.
# Looks like you failed 2 tests of 9.
t/magic.t ......... 
Dubious, test returned 2 (wstat 512, 0x200)
Failed 2/9 subtests 
 (less 3 skipped subtests: 4 okay)
t/namespace.t ..... ok
t/noreply.t ....... ok
t/nowait.t ........ ok
t/pod-coverage.t .. skipped: Test::Pod::Coverage 1.08 required for testing POD coverage
t/pod.t ........... ok
t/serialize.t ..... ok
t/threads.t ....... ok
t/utf8.t .......... ok

Test Summary Report
-------------------
t/magic.t       (Wstat: 512 Tests: 9 Failed: 2)
  Failed tests:  5-6
  Non-zero exit status: 2
Files=15, Tests=133,  7 wallclock secs ( 0.30 usr  0.06 sys +  5.13 cusr  0.77 csys =  6.26 CPU)
Result: FAIL
Failed 1/15 test programs. 2/133 subtests failed.
t/magic.tがこけてます。

0.18ならどうだ

こちらも試します。
# cpanm K/KR/KROKI/Cache-Memcached-Fast-0.18.tar.gz
Fetching http://search.cpan.org/CPAN/authors/id/K/KR/KROKI/Cache-Memcached-Fast-0.18.tar.gz ... OK
Configuring Cache-Memcached-Fast-0.18 ... OK
Building and testing Cache-Memcached-Fast-0.18 for K/KR/KROKI/Cache-Memcached-Fast-0.18.tar.gz ... FAIL
! Installing K/KR/KROKI/Cache-Memcached-Fast-0.18.tar.gz failed. See /root/.cpanm/build.log for details.
やはりダメ。build.logの中身はこんな感じ。
# Testing Cache::Memcached::Fast 0.18, Perl 5.008008, /usr/bin/perl
t/00-load.t ....... ok
# Connected to 2 memcached servers, lowest version 1.4.5
t/01-connect.t .... ok
t/02-isa.t ........ ok
t/big_value.t ..... ok
t/commands.t ...... ok
t/key_ref.t ....... ok

#   Failed test at t/magic.t line 52.

#   Failed test at t/magic.t line 53.
# Looks like you failed 2 tests of 9.
t/magic.t ......... 
Dubious, test returned 2 (wstat 512, 0x200)
Failed 2/9 subtests 
 (less 3 skipped subtests: 4 okay)
t/namespace.t ..... ok
t/noreply.t ....... ok
t/nowait.t ........ ok
t/pod-coverage.t .. skipped: Test::Pod::Coverage 1.08 required for testing POD coverage
t/pod.t ........... ok
t/serialize.t ..... ok
t/threads.t ....... ok
t/utf8.t .......... ok

Test Summary Report
-------------------
t/magic.t       (Wstat: 512 Tests: 9 Failed: 2)
  Failed tests:  5-6
  Non-zero exit status: 2
Files=15, Tests=133,  6 wallclock secs ( 0.30 usr  0.05 sys +  5.16 cusr  0.76 csys =  6.27 CPU)
Result: FAIL
Failed 1/15 test programs. 2/133 subtests failed.
make: *** [test_dynamic] エラー 255
-> FAIL Installing K/KR/KROKI/Cache-Memcached-Fast-0.18.tar.gz failed. See /root/.cpanm/build.log for details.
一部違わず同じ箇所でこけてますねえ。

0.17なら無事入りました

0.17も試して見たところ、こちらは無事にインストール出来ました。

問題のmagic.tとは?

しかし、magic.tのテスト内容が気になる所。とりあえず問題の箇所をクローズアップしてみます。
package MyScalar;
use base 'Tie::StdScalar';

sub FETCH {
    "Другой.ключ"
}

package main;

tie my $scalar2, 'MyScalar';

ok($memd->set($scalar2, $scalar2));
ok(exists $memd->get_multi($scalar2)->{$scalar2});

SKIP: {
    eval { require Readonly };
    skip "Skipping Readonly tests because the module is not present", 3
      if $@;

    # 'require Readonly' as above can be used to test if the module is
どうやら、tie関連のテストのようです。
0.18以降でこのテストが追加されているのを見ると、おそらくChangesにも何かしら記載があるはずです。
では、Changesを見てみます。
0.18  2010-04-06
        - make module thread-safe, and fix several bugs.  No need to
        upgrade unless you experienced limitations mentioned below.

        Changes since 0.17:

        Fix RT#56142: handle Perl magic.  Tied scalars, arrays and
        hashes are supported now, as well as Readonly variables and
        other magic stuff.

        Fix t/command.t failure on some Solaris distributions.

        Make module thread-safe with Perl >= 5.7.2.
僕のグダグダ英語スキルによると、以下のように理解できます。
「Perl magicに対応。tieされたスカラや配列、ハッシュは、従来どおり、読み取り専用変数やその他のmagic同様にサポートされるようになった。」
どうやらこれは、RT上でチケットが発行されていた問題らしく、こちらでそのやりとりを確認できます。

今回の問題もRTで既にチケット発行済だった

そして今回の問題も、RT#57150としてチケットが発行されており、既にステータスが「着手」となっておりました。さすが。
おそらく、次期リリースのタイミングでこの問題は解消することでしょう。それまでは、特段差し支え無ければ0.17を使うなり、0.19をforceインストールしたりして凌ぐことになります。

2010-9-22 追記
現在進行形で現象が発生しています。
# cpanm Cache::Memcached::Fast
Fetching http://search.cpan.org/CPAN/authors/id/K/KR/KROKI/Cache-Memcached-Fast-0.19.tar.gz ... OK
Configuring Cache-Memcached-Fast-0.19 ... OK
Building and testing Cache-Memcached-Fast-0.19 for Cache::Memcached::Fast ... FAIL
! Installing Cache::Memcached::Fast failed. See /root/.cpanm/build.log for details.
# cpanm K/KR/KROKI/Cache-Memcached-Fast-0.18.tar.gz
Fetching http://search.cpan.org/CPAN/authors/id/K/KR/KROKI/Cache-Memcached-Fast-0.18.tar.gz ... OK
Configuring Cache-Memcached-Fast-0.18 ... OK
Building and testing Cache-Memcached-Fast-0.18 for K/KR/KROKI/Cache-Memcached-Fast-0.18.tar.gz ... FAIL
! Installing K/KR/KROKI/Cache-Memcached-Fast-0.18.tar.gz failed. See /root/.cpanm/build.log for details.
# cpanm K/KR/KROKI/Cache-Memcached-Fast-0.17.tar.gz
Fetching http://search.cpan.org/CPAN/authors/id/K/KR/KROKI/Cache-Memcached-Fast-0.17.tar.gz ... OK
Configuring Cache-Memcached-Fast-0.17 ... OK
Building and testing Cache-Memcached-Fast-0.17 for K/KR/KROKI/Cache-Memcached-Fast-0.17.tar.gz ... OK
Successfully installed Cache-Memcached-Fast-0.17

2010-06-28

[Perl]Catalystアプリ配下のロジックを叩きたい

逃げ口上


この記事は、所謂「モダンperl」とは全くもって相反するものと思われます。しかしながら、ユースケースとして記録しておくこと自体に意義の有ることと判断し、ここに掲載する次第です。
この手法を使わざるを得ない時は、設計がぐちゃぐちゃな状態であるか、単に「モダンな」設計ではないものと思われます。今一度、よく設計を見直すことを考慮すべきでしょう。


…この記事があるということは、現に僕自身がぐちゃぐちゃな設計で作ったcatalystアプリケーションを世に出してしまい、そのためにこんな妙な解決策 - バッドノウハウ - を使う必要に迫られたのだということです。これについては、過去の自分を叱咤するとともに、現在の自分の糧とすべしと肝に命じております。
無論、この方法自体はバッドノウハウとはいえ、より研ぎ澄ませば、まさに「モダンな」ノウハウとなり得るものかもしれませんが、僕自身にはそのようなユースケースは思いつきませんでした。

バッドノウハウ?上等!

さて、逃げ口上はこの辺にしときます。色々とキリがないので^^;

このノウハウ自体は、えらくあっさりとしたものです。
例えば、バッチスクリプト./script/batch.plで、アプリケーションMyApp配下のパス/ugly/batch_targetを、引数付きで定期的に叩きたい場合。
./script/batch.plは以下のようになります。
use warnings;
use strict;
use MyApp;
use Catalyst::Stats;
my $app = MyApp->new( stats => Catayst::Stats->new );
my $res = $app->forward( '/ugly/batch_target', [ time() ] );
print $res;

これだけです。あとはこのスクリプトをcronに食わせるなりするだけで、定期的に/ugly/batch_targetをぶっ叩いてくれます。
ちなみに、今回は引数をtime()としました。あくまでサンプルなので。
ポイントは、Catalyst::StatsオブジェクトをMyApp->statsに食わせる所です。

なぜ僕はこの方法を「モダン」じゃないと主張するのか

さっきから勿体ぶった書き方をしてきましたが、そもそもこの方法が「モダン」ではないと僕が主張するのは、

ロジックとコントローラの分離が為されていない故のノウハウである

という、香箱を組む猫すら青ざめる(?)、えらく間接的な理由からです。
コントローラ配下のロジックを叩くということはつまり、「コントローラ」配下に「ロジック」が実装されていることに他ならない。これはこのあたりのスライドにもあるように、コントローラをぐちゃぐちゃにする最短ルートといえます。

2010-06-16

[Perl]Module::Install::Bundle::LocalLibを試すだけよ

Module::Install::Bundle::LocalLibを試しました。ただそれだけ。
ここからどう派生させるのかがいまいち不明。

~/script/perl/Bundle-Oreore:$ cat Makefile.PL 
use inc::Module::Install;
name 'Bundle-Oreore';
all_from 'lib/Bundle/Oreore.pm';
test_requires 'Test::More' => 0.32;
requires 'Email::Sender';

bundle_local_lib;

WriteAll;

~/script/perl/Bundle-Oreore:$ perl Makefile.PL 
include /home/yt/script/perl/Bundle-Oreore/inc/Module/Install.pm
include inc/Module/Install/Metadata.pm
include inc/Module/Install/Base.pm
include inc/Module/Install/Makefile.pm
Cannot determine perl version info from lib/Bundle/Oreore.pm
Cannot determine license info from lib/Bundle/Oreore.pm
include inc/Module/Install/Bundle/LocalLib.pm
include inc/Module/Install/WriteAll.pm
include inc/Module/Install/Win32.pm
include inc/Module/Install/Can.pm
include inc/Module/Install/Fetch.pm
Warning: prerequisite Email::Sender 0 not found.
Writing Makefile for Bundle::Oreore
Writing META.yml
No license specified, setting license = 'unknown'

~/script/perl/Bundle-Oreore:$ make bundle_local_lib
Attempting to create directory /home/yt/script/perl/Bundle-Oreore/extlib
Attempting to create file /home/yt/script/perl/Bundle-Oreore/extlib/.modulebuildrc
Fetching http://search.cpan.org/CPAN/authors/id/R/RJ/RJBS/Email-Sender-0.100460.tar.gz ... OK
Configuring Email-Sender-0.100460 ... OK
Building Email-Sender-0.100460 for Email::Sender ... OK
Successfully installed Email-Sender-0.100460
Fetching http://search.cpan.org/CPAN/authors/id/M/MS/MSCHWERN/ExtUtils-MakeMaker-6.56.tar.gz ... OK
Configuring ExtUtils-MakeMaker-6.56 ... OK
Building ExtUtils-MakeMaker-6.56 for ExtUtils::MakeMaker ... OK
Successfully installed ExtUtils-MakeMaker-6.56 (upgraded from 6.52)
Fetching http://search.cpan.org/CPAN/authors/id/M/MS/MSCHWERN/Test-Simple-0.94.tar.gz ... OK
Test::More is up to date. (0.94)

~/script/perl/Bundle-Oreore:$ find extlib/lib/perl5/
extlib/lib/perl5/
extlib/lib/perl5/ExtUtils
extlib/lib/perl5/ExtUtils/MakeMaker.pm
extlib/lib/perl5/ExtUtils/Command
extlib/lib/perl5/ExtUtils/Command/MM.pm
extlib/lib/perl5/ExtUtils/MM_UWIN.pm
extlib/lib/perl5/ExtUtils/testlib.pm
extlib/lib/perl5/ExtUtils/MM_Cygwin.pm
extlib/lib/perl5/ExtUtils/MakeMaker
extlib/lib/perl5/ExtUtils/MakeMaker/FAQ.pod
extlib/lib/perl5/ExtUtils/MakeMaker/Tutorial.pod
extlib/lib/perl5/ExtUtils/MakeMaker/Config.pm
extlib/lib/perl5/ExtUtils/MM_OS2.pm
extlib/lib/perl5/ExtUtils/MM_MacOS.pm
extlib/lib/perl5/ExtUtils/Liblist
extlib/lib/perl5/ExtUtils/Liblist/Kid.pm
extlib/lib/perl5/ExtUtils/Liblist.pm
extlib/lib/perl5/ExtUtils/MM_NW5.pm
extlib/lib/perl5/ExtUtils/MM_Win32.pm
extlib/lib/perl5/ExtUtils/MM_VOS.pm
extlib/lib/perl5/ExtUtils/MM_Unix.pm
extlib/lib/perl5/ExtUtils/MM_QNX.pm
extlib/lib/perl5/ExtUtils/MM_VMS.pm
extlib/lib/perl5/ExtUtils/Mkbootstrap.pm
extlib/lib/perl5/ExtUtils/MM_AIX.pm
extlib/lib/perl5/ExtUtils/MM_Darwin.pm
extlib/lib/perl5/ExtUtils/MM_BeOS.pm
extlib/lib/perl5/ExtUtils/MM.pm
extlib/lib/perl5/ExtUtils/Mksymlists.pm
extlib/lib/perl5/ExtUtils/MM_Win95.pm
extlib/lib/perl5/ExtUtils/MY.pm
extlib/lib/perl5/ExtUtils/MM_DOS.pm
extlib/lib/perl5/ExtUtils/MM_Any.pm
extlib/lib/perl5/i486-linux-gnu-thread-multi
extlib/lib/perl5/i486-linux-gnu-thread-multi/auto
extlib/lib/perl5/i486-linux-gnu-thread-multi/auto/ExtUtils
extlib/lib/perl5/i486-linux-gnu-thread-multi/auto/ExtUtils/MakeMaker
extlib/lib/perl5/i486-linux-gnu-thread-multi/auto/ExtUtils/MakeMaker/.packlist
extlib/lib/perl5/i486-linux-gnu-thread-multi/auto/Email
extlib/lib/perl5/i486-linux-gnu-thread-multi/auto/Email/Sender
extlib/lib/perl5/i486-linux-gnu-thread-multi/auto/Email/Sender/.packlist
extlib/lib/perl5/i486-linux-gnu-thread-multi/perllocal.pod
extlib/lib/perl5/Email
extlib/lib/perl5/Email/Sender.pm
extlib/lib/perl5/Email/Sender
extlib/lib/perl5/Email/Sender/Role
extlib/lib/perl5/Email/Sender/Role/HasMessage.pm
extlib/lib/perl5/Email/Sender/Role/CommonSending.pm
extlib/lib/perl5/Email/Sender/Failure.pm
extlib/lib/perl5/Email/Sender/Transport.pm
extlib/lib/perl5/Email/Sender/Failure
extlib/lib/perl5/Email/Sender/Failure/Multi.pm
extlib/lib/perl5/Email/Sender/Failure/Permanent.pm
extlib/lib/perl5/Email/Sender/Failure/Temporary.pm
extlib/lib/perl5/Email/Sender/Manual
extlib/lib/perl5/Email/Sender/Manual/QuickStart.pm
extlib/lib/perl5/Email/Sender/Success.pm
extlib/lib/perl5/Email/Sender/Manual.pm
extlib/lib/perl5/Email/Sender/Transport
extlib/lib/perl5/Email/Sender/Transport/DevNull.pm
extlib/lib/perl5/Email/Sender/Transport/Maildir.pm
extlib/lib/perl5/Email/Sender/Transport/SMTP.pm
extlib/lib/perl5/Email/Sender/Transport/Sendmail.pm
extlib/lib/perl5/Email/Sender/Transport/Failable.pm
extlib/lib/perl5/Email/Sender/Transport/Print.pm
extlib/lib/perl5/Email/Sender/Transport/Test.pm
extlib/lib/perl5/Email/Sender/Transport/Mbox.pm
extlib/lib/perl5/Email/Sender/Transport/Wrapper.pm
extlib/lib/perl5/Email/Sender/Transport/SMTP
extlib/lib/perl5/Email/Sender/Transport/SMTP/Persistent.pm
extlib/lib/perl5/Email/Sender/Success
extlib/lib/perl5/Email/Sender/Success/Partial.pm
extlib/lib/perl5/Email/Sender/Simple.pm
extlib/lib/perl5/Email/Sender/Util.pm

2010-06-14

[Perl]最速セットアップ案内 Catalyst on Starman

さすがにタイトルの「最速」は言い過ぎ感たっぷりなんですが、僕でもそのくらい安直にセットアップができたという事です。
ちなみに僕はPlack/PSGIをまともに触ったことがありません。「バカでもわかるPlack/PSGI - JPerl Advent Calendar 2009」を読んで、
「へえ、そういうものがあるんだねえ(棒読み)」
などと曰う程度にしか知らないという状態です。
まあでも今のところ、オレオレWAFをこさえるつもりなど毛頭ありません。
よって、この辺は概念だけ知ってれば良いかな、と高を括っている訳です。

前提条件

これ以降は以下のソフトウェアがインストール済みである前提で書いていきます。

また、既にCatalyst 5.8.xに対応したCatalystアプリが用意できているものとします。
もしなければ、今すぐ作って下さい。NOW!!
# catalyst.pl YellowCat
以降、このCatalystアプリの事をYellowCatと呼びます。

モジュールのインストール

cpanmで以下のモジュールをインストールします。
# cpanm Module::Install::ReadmeMarkdownFromPod Plack Catalyst::Engine::PSGI Starman Server::Starter Net::Server::SS::PreFork
これらのインストールができればOKです。

2010/11/1 追記
Module::Install::ReadmeMarkdownFromPodも必要になった(か、元々必要だった?)様ですね。
一緒にインストールしないと、Starmanのインストール時にコケてしまいます。
Fetching http://search.cpan.org/CPAN/authors/id/M/MI/MIYAGAWA/Starman-0.2007.tar.gz ... OK
Configuring Starman-0.2007 ... OK
==> Found dependencies: HTTP::Parser::XS
Fetching http://search.cpan.org/CPAN/authors/id/K/KA/KAZUHO/HTTP-Parser-XS-0.10.tar.gz ... OK
Configuring HTTP-Parser-XS-0.10 ... N/A
! Configure failed for HTTP-Parser-XS-0.10. See /root/.cpanm/build.log for details.
! Bailing out the installation for Starman-0.2007. Retry with --prompt or --force.

起動ファイル「./script/yellowcat.psgi」を作る

いきなりpsgiという拡張子のファイルが出てきますが、これはPSGI用の起動ファイルというところでしょうか。
まあ今はあまり気にせず、「起動に必要なファイル」とだけ覚えておけば良いと思います。
# cd YellowCat
# ./script/yellowcat_create.pl PSGI
これで./script/yellowcat.psgiができました。

YellowCatをStarmanで起動する

Server::Starterに付属のスクリプトstart_serverを使ってstarmanを起動します。
起動には、「./script/yellowcat.psgi」が必要になります。
# start_server --port 4000 -- starman --workers 8 ./script/yellowcat.psgi

あとはブラウザで4000番ポートにアクセスすれば、YellowCatからのレスポンスを得ることができます。

2010-07-05 追記 うまく動かない時

こんなエラーが出てうまく起動出来ない場合があるようでして。
Error while loading ./script/myapp.psgi: Can't locate YellowCat.pm in @INC (@INC contains: /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/site_perl/5.8.8 /usr/lib/perl5/site_perl /usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.8 /usr/lib/perl5/vendor_perl /usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/5.8.8 .) at ./script/yellowcat.psgi line 4.
BEGIN failed--compilation aborted at ./script/yellowcat.psgi line 4.
要するに、目の前にあるYellowCat.pmが見つけられない、そんなド近眼系女子のような振る舞いをしているんですね。
そんな時は一手間かけて./script/yellowcat.psgiを編集し、YellowCat.pmの在り処を教えてあげましょう。
#!/usr/bin/env perl
use strict;
use warnings;
use lib ( "/path/to/YellowCat/lib" );
use YellowCat;

YellowCat->setup_engine('PSGI');
my $app = sub { YellowCat->run(@_) };
ちなみに、FindBinを使って以下の様に書こうとしたところ、FindBinに怒られました。
#!/usr/bin/env perl
use strict;
use warnings;
use FindBin;
use lib ( "$FindBin::Bin/../lib" );
use YellowCat;

YellowCat->setup_engine('PSGI');
my $app = sub { YellowCat->run(@_) };
たぶん、指定先パスが異なるためと思われますが、深くツッこんで調べていないので、今のところ原因は不明です。

2010-05-25

[Perl]Net-OpenSocial-Client-0.01_05を使う際の注意

まず、Makefile.PLを見てください。
require Any::Mooseなので、Any::Mooseがバージョン要件を満たしていればmakeできます。

しかし、ソースを見てみると、4行めに

use Any::Moose 'X::AttributeHelpers';

と書かれています。これは、Mooseが入っていてMooseX::AttributeHelpersが入っていない場合だと、この4行目で怒られます。

Couldn't load class (MooseX::AttributeHelpers::Trait::Base) because: has '+attr' is not supported in roles at /usr/local/lib/perl/5.8.8/Moose/Meta/Role.pm line 198
Moose::Meta::Role::add_attribute('Moose::Meta::Role=HASH(0x8a92db8)', '+default', 'required', 1, 'definition_context', 'HASH(0x8a75564)') called at /usr/local/lib/perl/5.8.8/Moose/Role.pm line 47
:
:
中略
:
:
Compilation failed in require at /usr/local/share/perl/5.8.8/MooseX/AttributeHelpers.pm line 13.
BEGIN failed--compilation aborted at /usr/local/share/perl/5.8.8/MooseX/AttributeHelpers.pm line 13.
Compilation failed in require at /usr/local/share/perl/5.8.8/Any/Moose.pm line 98.
BEGIN failed--compilation aborted at /usr/local/share/perl/5.8.8/Net/OpenSocial/Client.pm line 4.
:
:


なので、Mooseが入っている環境では、MooseX::AttributeHelpersを入れてからNet::OpenSocial::Clientを入れる必要があります。

2010-05-03

[Linux]request_module: runaway loop modprobe binfmt-464c

request_module: runaway loop modprobe binfmt-464cって言われた。

  • 64bitカーネルを動かすべきところで32bitカーネルを動かした場合


に出るらしい。

[Linux]MEPIS Linux 8.5 LiveCDでGUIが起動しなくて困ったとき

ゴールデンウィーク真っ只中に、自宅サーバのUbuntuがすっ飛んじゃって涙目のytnobodyです。みなさん、楽しいゴールデンウィークをお過ごしでしょうか?オイラはサーバの中身が空っぽになっちゃって、ちょっぴりブルーです><

さて、そんなブルーなオイラにぴったりのブルーなディストリ「MEPIS Linux 8.5」を、自宅サーバの新しいOSに選定しました。しかし、こういう状況の時こそ更なる試練は待ち構えているものです。インストールをするためにMEPIS LinuxのLive-CDをブートしてみたものの、Xorgが立ち上がってこない・・・><

そんな時!このページDoes not boot to graphical login (kdm)という項目を確認してみましょう。。。

* Boot using the Safeboot option on the opening menu (GRUB)
* Reboot, highlight the kernel you want to use (usually the most recent), and add at the bottom where the cursor is blinking vga=normal and xdrvr=vesa
* Try adding at the bottom acpi=force or acpi=off
* If you continue to have problems, use the MEPIS X Windows Assistant (Section 5.3.4) to copy a working configuration to your computer.


つまり、起動オプションを与えてやれば、うまくXorgが起き上がる望みがあるわけです!
諦めるな!デキルデキル!!!

2010-04-28

[Perl]Data::Modelの継承クラス使ってて"extra bytes"言われたら

例えば、

my $model = MyDataModel->new;
my $name = $model->lookup( member => $member_id );

みたいなコードがあったとして、lookupメソッドが走るときに"extra bytes"ってエラーが出ることがあります。
そんな時は、テーブルに格納されているデータを疑ってみてください。もしかすると、decodeされっぱなしのデータが格納されているかもしれません。

2010-04-16

[Perl]Data::ModelをインターフェースとしてTokyoTyrantへデータの出し入れをする際にハマった

YappoLogs: KVSでORマッパーを使うという事を参考に、スキーマクラスを構築して、データの出し入れをしました…が、

Can't use string ("k… ÎKÇ
» Ú") as a HASH ref while "strict refs" in use at /usr/lib/perl5/site_perl/5.8.8/Data/Model/Driver/Memcached.pm line 188.

というエラーを吐いてしまい、データの出し入れどころじゃない状態になってしまいました。どうやらデータのシリアライズ処理に問題が発生しているようです…
で、念のためData::Modelのテストコード[t/060_driver/memcached/serializer.t]を読んでみたわけですが、シリアライズ処理のテストの冒頭で、テスト数が分岐していました。条件は、$Data::MessagePack::VERSIONが0.05以上か否か。0.05未満ならテスト数は20…。 ええ?Data::MessagePackってrequiredじゃないん?
もしや…早速このテストコードを実行。

# perl t/060_driver/memcached/serializer.t
1..20
ok 1
ok 2
ok 3
:
(中略)
:
ok 18
ok 19
ok 20

はわわわ…やはりData::MessagePackが(0.05未満|入っていない)って事ですねorz
んじゃ、とっとと入れましょうかということで

# cpanm Data::MessagePack
Fetching http://search.cpan.org/CPAN/authors/id/T/TO/TOKUHIROM/Data-MessagePack-0.10.tar.gz ... OK
Configuring Data-MessagePack-0.10 ... OK
Building and testing Data-MessagePack-0.10 for Data::MessagePack ... OK
Successfully installed Data-MessagePack-0.10

はい、Data::MessagePack 0.10が入りました!

では気を取り直して、再度テストコードを実行します。

# perl t/060_driver/memcached/serializer.t
1..100
ok 1
ok 2 - pack
ok 3 - unpack
ok 4
ok 5 - NOT INT: pack with Data::MessagePack
:
(中略)
:
ok 99
ok 100 - INT: pack with Data::MessagePack

おほー!来たよ来たわよ来ましたよ!!
この後、TokyoTyrantのデータをvanishしてから、データの出し入れが可能になりました!

2010-06-01 追記
当たり前といえばそれまでですが、TokyoTyrantをデータストアとして扱う場合、Data::Model::Driver::Memcachedのインスタンス生成時には、以下のように必ずSerializerを"Default"に設定する必要があります。

my $tokyo_tyrant = Data::Model::Driver::Memcached->new(
memcached => Cache::Memcached::Fast->new( {
servers => [qw/ 127.0.0.1:1978 /],
} ),
serializer => 'Default',
);

2010-04-15

[OpenVZ]centos-5-x86_64-default なVEコンテナでttservctl走らせる時の注意

TokyoTyrantをインストールすると、/usr/local/sbin/ttservctlと/usr/local/bin/ttserverができます。
普通だと

# ttservctl start
Starting the server of Tokyo Tyrant
Executing: ttserver -port 1978 -dmn -pid /var/ttserver/pid
Done

となるところ、centos-5-x86_64-default なVEコンテナでは

# ttservctl start
Starting the server of Tokyo Tyrant
Executing: ttserver -port 1978 -dmn -pid /var/ttserver/pid
/usr/local/sbin/ttservctl: line 72: ttserver: command not found
The server could not started

となってしまい、起動できません。
これは/usr/local/binにパスが通っていないのが原因なので、ここにパスを通すか、

# ln -s /usr/local/bin/ttserver /usr/bin/

とすれば、詮なく起動できるようになります。

[TokyoCabinet]CentOS5へのインストールメモ

しょっちゅう忘れるのでメモ。

・TCのconfigureにはlibbz.hが必須。

だから

# yum -y install zlib2-devel

と言う風にしなさい、なんですよ。

[OpenVZ]VEコンテナ内でGearman-1.11をインストールする際の注意

テスト時に、コンテナに対してメモリが最低512MBは割り当てられていないと、Out of memory になります。

コンテナに対してのメモリの割り当て方法は

# vzctl set [VEID] --privvmpages 512M --vmguarpages 512M --save

となります。

2010-04-13

[ネットライフ]to.というURI短縮サービスについてdig叩いてみたよ

非常に興味深い。

$ dig to.

; <<>> DiG 9.4.2-P2.1 <<>> to.
;; global options: printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 42625
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 5, ADDITIONAL: 0

;; QUESTION SECTION:
;to. IN A

;; ANSWER SECTION:
to. 86342 IN A 216.74.32.107

;; AUTHORITY SECTION:
to. 86342 IN NS ns1.iafrica.com.
to. 86342 IN NS tonic.to.
to. 86342 IN NS colo.to.
to. 86342 IN NS ns-to.ripe.net.
to. 86342 IN NS auth02.ns.uu.net.

;; Query time: 1 msec
;; SERVER: 192.168.1.241#53(192.168.1.241)
;; WHEN: Tue Apr 13 16:42:57 2010
;; MSG SIZE rcvd: 159



で、この記事の短縮URLがこれ。
http://to./3meg

[jQuery]IEがXHRをキャッシュするという厄介な事象を叩き潰すために

jQuery使う上での基本なのかもしれないけれど、覚えたての身としては知らないことだったのでメモ。

IEがajaxキャッシュするのを抑制 - はらぐろブログラマン にて知りました。

スクリプトの頭の方で

$.ajaxSetup({ cache: false });

とすればいいらしいです。

2010-04-06

[Perl]大抵のPerlerに恩恵を与えるcpanminus

cpanが使いにくいと嘆くアナタ!そんなアナタにこそ使ってほしいモノがある!あるんです!
それがcpanminus

使ってみようと思い立ち、実際に使ってみて、その素晴らしさに感激しました。

インストール


ここはさすがにcpanを使います。しばしの辛抱を…とはいっても、なんとcpanminusは依存モジュールがありません!!!依存モジュールはかなり少ないです。
# cpan App::cpanminus

これだけ。あっという間にcpanminusのインストールが終わります。

2010-11-10 追記
こちらの記事によると、以下の様なインストール方法もあるそうです。
$ mkdir bin && cd ~/bin
$ wget http://xrl.us/cpanm
$ chmod +x cpanm

さらに追記
$ wget http://xrl.us/cpanm

$ wget http://xrl.us/cpanm --no-check-certificate
としなければダメな環境もあるようです。

使ってみる


これも簡単。cpanmコマンドがほぼcpanと同じ役割を果たします。
今回はこのcpanmを使って、大ブレイク中のPSGI実装Plackをインストールしてみました。
root@nephos:/home/yt# cpanm Plack
Fetching http://search.cpan.org/CPAN/authors/id/M/MI/MIYAGAWA/Plack-0.9929.tar.gz ... OK
Configuring Plack-0.9929 ... OK
==> Found dependencies: Hash::MultiValue, HTTP::Body, Filesys::Notify::Simple, Devel::StackTrace::AsHTML
Fetching http://search.cpan.org/CPAN/authors/id/M/MI/MIYAGAWA/Hash-MultiValue-0.08.tar.gz ... OK
Configuring Hash-MultiValue-0.08 ... OK
Building and testing Hash-MultiValue-0.08 for Hash::MultiValue ... OK
Successfully installed Hash-MultiValue-0.08
Fetching http://search.cpan.org/CPAN/authors/id/M/MR/MRAMBERG/HTTP-Body-1.07.tar.gz ... OK
Configuring HTTP-Body-1.07 ... OK
Building and testing HTTP-Body-1.07 for HTTP::Body ... OK
Successfully installed HTTP-Body-1.07 (upgraded from 1.05)
Fetching http://search.cpan.org/CPAN/authors/id/M/MI/MIYAGAWA/Filesys-Notify-Simple-0.06.tar.gz ... OK
Configuring Filesys-Notify-Simple-0.06 ... OK
Building and testing Filesys-Notify-Simple-0.06 for Filesys::Notify::Simple ... OK
Successfully installed Filesys-Notify-Simple-0.06
Fetching http://search.cpan.org/CPAN/authors/id/M/MI/MIYAGAWA/Devel-StackTrace-AsHTML-0.09.tar.gz ... OK
Configuring Devel-StackTrace-AsHTML-0.09 ... OK
Building and testing Devel-StackTrace-AsHTML-0.09 for Devel::StackTrace::AsHTML ... OK
Successfully installed Devel-StackTrace-AsHTML-0.09
Building and testing Plack-0.9929 for Plack ... OK
Successfully installed Plack-0.9929

インストールログが短くて見やすいですね。これなら何が依存解決のためにインストールされたのか、一目で判ります。
しかも、依存モジュールのインストールは全自動!これならわざわざEnterキーを押したり、小賢しい真似をする必要もありませんね!^^;

2010-04-01

[Security]"Shareaholic for Firefox" leaks your online activity.

ShareaholicというFirefox pluginがあります。
これは、今見ているページをTwitterやtumblrに簡単にpostできるというものです。
しかし、勝手に情報を http://dcs.consumerinput.com/ に漏らしちゃうんですね。

詳細は暇を見て追記します。

4/4 追記
面倒ではない範囲で検証しました。

環境


まず、手元の環境を晒しますね。

  • OS:Ubuntu 9.10

  • ブラウザ:Firefox 3.5.8



準備


検証のために、こちらのテストページ(http://yellowstore.dip.jp/test.html)を用意しました。


また、通信中のHTTPヘッダを記録するツールとして、Live HTTP Headersというプラグインを使用しました。

手順


以下の手順を、それぞれShareaholicが有効である場合と、無効である場合の両方で実施しました。

  1. まず、Live HTTP Headersを起動します。

  2. 次に、テストページにアクセスします。

  3. Live HTTP Headersに記録されたHTTPヘッダをテキストファイル等に保存します。



結果


以下のような結果となりました。

Shareaholic無効


Shareaholicは無効です。

その結果、Live HTTP Headersに記録されていた内容は以下のとおりでした。

http://yellowstore.dip.jp/test.html



GET /test.html HTTP/1.1

Host: yellowstore.dip.jp

User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; ja; rv:1.9.1.8) Gecko/20100214 Ubuntu/9.10 (karmic) Firefox/3.5.8

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language: ja,en-us;q=0.7,en;q=0.3

Accept-Encoding: gzip,deflate

Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7

Keep-Alive: 300

Connection: keep-alive

If-Modified-Since: Sun, 04 Apr 2010 06:02:04 GMT

If-None-Match: "325e8f-85-48362f3a97e2f"

Cache-Control: max-age=0



HTTP/1.1 304 Not Modified

Date: Sun, 04 Apr 2010 06:02:42 GMT

Server: Apache/2.2.12 (Ubuntu)

Connection: Keep-Alive

Keep-Alive: timeout=15, max=100

Etag: "325e8f-85-48362f3a97e2f"

Vary: Accept-Encoding

----------------------------------------------------------



何度かリロードしてた為ステータス304が返されていますが、特に何も変哲はありません。

Shareaholic有効


では、Shareaholicを有効にしてみましょう。


その結果、記録されていた内容ですが…

http://yellowstore.dip.jp/test.html



GET /test.html HTTP/1.1

Host: yellowstore.dip.jp

User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; ja; rv:1.9.1.8) Gecko/20100214 Ubuntu/9.10 (karmic) Firefox/3.5.8

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language: ja,en-us;q=0.7,en;q=0.3

Accept-Encoding: gzip,deflate

Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7

Keep-Alive: 300

Connection: keep-alive

If-Modified-Since: Sun, 04 Apr 2010 06:02:04 GMT

If-None-Match: "325e8f-85-48362f3a97e2f"

Cache-Control: max-age=0



HTTP/1.1 304 Not Modified

Date: Sun, 04 Apr 2010 06:06:55 GMT

Server: Apache/2.2.12 (Ubuntu)

Connection: Keep-Alive

Keep-Alive: timeout=15, max=100

Etag: "325e8f-85-48362f3a97e2f"

Vary: Accept-Encoding

----------------------------------------------------------

http://dcs.consumerinput.com/fast-cgi/MI?ver=3ss&userid=30789874083664180®istrar=shr&d=http%3A%2F%2Fyellowstore.dip.jp%2Ftest.html



GET /fast-cgi/MI?ver=3ss&userid=30789874083664180®istrar=shr&d=http%3A%2F%2Fyellowstore.dip.jp%2Ftest.html HTTP/1.1

Host: dcs.consumerinput.com

User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; ja; rv:1.9.1.8) Gecko/20100214 Ubuntu/9.10 (karmic) Firefox/3.5.8

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language: ja,en-us;q=0.7,en;q=0.3

Accept-Encoding: gzip,deflate

Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7

Keep-Alive: 300

Connection: keep-alive



HTTP/1.1 200 OK

Date: Sun, 04 Apr 2010 06:06:56 GMT

Server: Apache/2.2.3 (Debian) mod_python/3.3.1 Python/2.5.1 mod_ssl/2.2.3 OpenSSL/0.9.8c

Keep-Alive: timeout=5, max=500

Connection: Keep-Alive

Transfer-Encoding: chunked

Content-Type: text/xml

----------------------------------------------------------



ギョギョギョーッ!!!ななな、何か変なリクエストヘッダが吐かれてる~ッ!!!!
…っと、あまりの事にハコフグ帽子をかぶったオネエ系キャラっぽくなりましたが、要するにこの部分こそShareaholicのマズいところなんですね。

所見など


実際のところ、dcs.consumerinput.comに送られる情報については詳しく確認していませんが、リクエストのたびに、そのURLを付加して別のホストにリクエストを送るなんて事は、そもそもユーザーのオンラインでの行動を追跡する以外には考えにくいと思います。
それから、今回はLive HTTP Headersというプラグインを使用しての検証としましたが、もっと厳密に確認するなら、tcpdumpなどのパケット解析ツールを用いるべきでしょう。面倒なのでやりませんけどね。
とりあえずShareaholic使うのは危険なので止めといた方が無難ですね。

2010-03-24

[russkii] Здравствуйте!

lang-8.comというwebサービスに登録したので、ロシア語で簡単な自己紹介文を書いてみた。

Здравствуйте! [Lang-8]

「簡単な」とは言うものの、オイラには非常に難しい内容でしたっと。
うう。もう少し集中して勉強しないとね。

2010-03-23

[Perl]cpanでのモジュールインストールを手っ取り早く自動化したい

単純に目的のCPANモジュールをインストールしたいけど、依存モジュールのインストールで[Yes/no]を聞いてくるのってありますよね。
依存モジュールが少ないうちはまあ、enter押したりして対応するんですけど、これが沢山になると、ぶっちゃけイヤになります。
# 特にCatalystとか。
そんな時には、

# echo | cpan Any::Module

としてあげると、勝手にデフォルトの選択肢を選びつつ、取り急ぎインストールまで漕ぎ着けてくれます。
# あ。Any::Module は、インストールしたいモジュール名に置き換えて下さいね?

ああ!これで一安心。

…でも、手放しでマシンに任せっ切りでは、うまくインストールできなかった時に心配ですよね。どの選択肢が選ばれたのか。どんな原因でうまくインストールできなかったのか。etc...

そしたら、こうするといんでないかい?

# echo | cpan Any::Module 2>&1 | tee cpan_install.log


インストールのログが、cpan_install.logに送りこまれます。これで大分インストールで楽できますね。

4/6 追記
同じ目的なら、cpanminusを使った方がより近代的です。
こちらの記事も見てくださいね。

2010-03-03

[Perl]Data::ModelでPrimary Keyが複数あるテーブルにレコードを追加したい

これでOK


my $model = MyModel->new;
$model->set( 'multiple_prikey_table' => {
prikey1 => 'ID-A-001',
prikey2 => 'ID-B-002',
data1 => 1234,
} );

2010-03-02

[Perl]Encode.pm使ってメールの件名に日本語を使う場合のメモ

ど忘れしてたので、メモ。

use Encode;
my $subject = encode(
'MIME-Header-ISO_2022_JP',
decode( 'utf8', 'ヤムチャの目にも涙:意味)ヤムチャは死ぬ。' )
);


# ヤバいくらいに脳が退化してる気がする。。。

2010-02-25

[Python]TurboGears2 悔悟録

えーと、基本的なインストール方法は前回の記事のとおりで問題無いですが、念のためおさらいです。


概ねの手順はHow to install TurboGears 2 ー TG2 v2.0 documentationの通り…なんだけど、オイラは途中から違う方法でインストールしました。

ザクリと手順となるコマンドだけを抜き出すと、以下のような具合です。
wget http://peak.telecommunity.com/dist/ez_setup.py
sudo python ez_setup.py
sudo aptitude install libsqlite3-dev sqlite3 python-dev build-essential
sudo easy_install virtualenv
### ここまではほぼ公式ドキュメントどおり。以下、easy_installに頼りまくる。
sudo easy_install TurboGears
sudo easy_install TurboGears2


これで入った次第。



で、問題はプロジェクトの作成でごっそりエラーを吐いていた箇所。
事実、あのままではエラーが出てしまい、開発どころではない状態となりましたorz
腑に落ちないので調べてみると、 Loose Agilist: TurboGears 2 (2) というサイトにて paster というヘルパーを使った方法が紹介されていました。

というか、これが正しい方法なんだよね!?tg-adminってなんなのさ、ねえ!?

…と、ここまで書いて気がついたのですが、

・turbogears : ヘルパープログラム = tg-admin
・turbogears2 : ヘルパープログラム = paster

という事なんだよね…orz
つまりインストールだって下手をしなくても、Ubuntuなら
sudo aptitude install python-turbogears2

でOKだったのでは???

2010-11-14 追記
sudo aptitiudeとなっていたのをsudo aptitudeに修正しました。
ご指摘ありがとうございます。

2010-02-22

[Python]TurboGears2への逆襲 - TurboGears2インストールメモ

ついにUbuntu9.10にインストールできました!

概ねの手順はHow to install TurboGears 2 — TG2 v2.0 documentationの通り…なんだけど、オイラは途中から違う方法でインストールしました。

ザクリと手順となるコマンドだけを抜き出すと、以下のような具合です。

wget http://peak.telecommunity.com/dist/ez_setup.py
sudo python ez_setup.py
sudo aptitude install libsqlite3-dev sqlite3 python-dev build-essential
sudo easy_install virtualenv
### ここまではほぼ公式ドキュメントどおり。以下、easy_installに頼りまくる。
sudo easy_install TurboGears
sudo easy_install TurboGears2


これで入った次第。
試しにtg-adminを実行します。


yt@nephos:~/turbogears$ tg-admin quickstart
/usr/local/lib/python2.6/dist-packages/CherryPy-2.3.0-py2.6.egg/cherrypy/lib/cptools.py:3: DeprecationWarning: the md5 module is deprecated; use hashlib instead
import md5
/usr/local/lib/python2.6/dist-packages/CherryPy-2.3.0-py2.6.egg/cherrypy/lib/profiler.py:54: UserWarning: Your installation of Python doesn't have a profile module. If you're on Debian, you can apt-get python2.4-profiler from non-free in a separate step. See http://www.cherrypy.org/wiki/ProfilingOnDebian for details.
warnings.warn(msg)
/usr/local/lib/python2.6/dist-packages/CherryPy-2.3.0-py2.6.egg/cherrypy/filters/sessionfilter.py:33: DeprecationWarning: the sha module is deprecated; use the hashlib module instead
import sha
/usr/local/lib/python2.6/dist-packages/PEAK_Rules-0.5a1.dev_r2582-py2.6.egg/peak/rules/indexing.py:220: DeprecationWarning: object.__new__() takes no parameters
/usr/local/lib/python2.6/dist-packages/ToscaWidgets-0.9.4-py2.6.egg/tw/core/view.py:202: DeprecationWarning: object.__new__() takes no parameters
obj = object.__new__(cls, *args, **kw)
Enter project name: DrunkenStein
Enter package name [drunkenstein]:
Do you need Identity (usernames/passwords) in this project? [no]
Selected and implied templates:
TurboGears#tgbase tg base template
TurboGears#turbogears web framework

Variables:
egg: DrunkenStein
elixir: False
identity: none
package: drunkenstein
project: DrunkenStein
sqlalchemy: True
sqlalchemyversion: SQLAlchemy>=0.4.3
sqlobject: False
Creating template tgbase
Creating directory ./DrunkenStein
Recursing into +einame+.egg-info
Creating ./DrunkenStein/DrunkenStein.egg-info/
Copying PKG-INFO to ./DrunkenStein/DrunkenStein.egg-info/PKG-INFO
/usr/local/lib/python2.6/dist-packages/Cheetah-2.4.2-py2.6.egg/Cheetah/Compiler.py:1509: UserWarning:
You don't have the C version of NameMapper installed! I'm disabling Cheetah's useStackFrames option as it is painfully slow with the Python version of NameMapper. You should get a copy of Cheetah with the compiled C version of NameMapper.
"\nYou don't have the C version of NameMapper installed! "
Skipping file /usr/local/lib/python2.6/dist-packages/TurboGears-1.1-py2.6.egg/turbogears/qstemplates/qsbase/+einame+.egg-info/sqlobject.txt_tmpl
Recursing into +package+
Creating ./DrunkenStein/drunkenstein/
Copying __init__.py to ./DrunkenStein/drunkenstein/__init__.py
Copying release.py_tmpl to ./DrunkenStein/drunkenstein/release.py
Recursing into static
Creating ./DrunkenStein/drunkenstein/static/
Recursing into css
Creating ./DrunkenStein/drunkenstein/static/css/
Skipping file /usr/local/lib/python2.6/dist-packages/TurboGears-1.1-py2.6.egg/turbogears/qstemplates/qsbase/+package+/static/css/empty_tmpl
Recursing into images
Creating ./DrunkenStein/drunkenstein/static/images/
Copying favicon.ico to ./DrunkenStein/drunkenstein/static/images/favicon.ico
Copying tg_under_the_hood.png to ./DrunkenStein/drunkenstein/static/images/tg_under_the_hood.png
Copying under_the_hood_blue.png to ./DrunkenStein/drunkenstein/static/images/under_the_hood_blue.png
Recursing into javascript
Creating ./DrunkenStein/drunkenstein/static/javascript/
Skipping file /usr/local/lib/python2.6/dist-packages/TurboGears-1.1-py2.6.egg/turbogears/qstemplates/qsbase/+package+/static/javascript/empty_tmpl
Recursing into templates
Creating ./DrunkenStein/drunkenstein/templates/
Copying __init__.py to ./DrunkenStein/drunkenstein/templates/__init__.py
Copying MANIFEST.in_tmpl to ./DrunkenStein/MANIFEST.in
Creating template turbogears
Recursing into +package+
Copying command.py_tmpl to ./DrunkenStein/drunkenstein/command.py
Recursing into config
Creating ./DrunkenStein/drunkenstein/config/
Copying __init__.py to ./DrunkenStein/drunkenstein/config/__init__.py
Copying app.cfg_tmpl to ./DrunkenStein/drunkenstein/config/app.cfg
Copying log.cfg_tmpl to ./DrunkenStein/drunkenstein/config/log.cfg
Copying controllers.py_tmpl to ./DrunkenStein/drunkenstein/controllers.py
Copying json.py_tmpl to ./DrunkenStein/drunkenstein/json.py
Copying model.py_tmpl to ./DrunkenStein/drunkenstein/model.py
Recursing into static
Recursing into css
Skipping file /usr/local/lib/python2.6/dist-packages/TurboGears-1.1-py2.6.egg/turbogears/qstemplates/quickstart/+package+/static/css/login.css_tmpl
Copying style.css to ./DrunkenStein/drunkenstein/static/css/style.css
Recursing into images
Copying contentbg.png to ./DrunkenStein/drunkenstein/static/images/contentbg.png
Copying error.png to ./DrunkenStein/drunkenstein/static/images/error.png
Replace 1081 bytes with 3638 bytes (4/4 lines changed; 14 lines added)
Copying favicon.ico to ./DrunkenStein/drunkenstein/static/images/favicon.ico
Copying header_inner2.png to ./DrunkenStein/drunkenstein/static/images/header_inner2.png
Copying headerbg.png to ./DrunkenStein/drunkenstein/static/images/headerbg.png
Copying info.png to ./DrunkenStein/drunkenstein/static/images/info.png
Copying inputbg.png to ./DrunkenStein/drunkenstein/static/images/inputbg.png
Copying loginbg.png to ./DrunkenStein/drunkenstein/static/images/loginbg.png
Copying loginbottombg.png to ./DrunkenStein/drunkenstein/static/images/loginbottombg.png
Copying loginheader-left.png to ./DrunkenStein/drunkenstein/static/images/loginheader-left.png
Copying loginheader-right.png to ./DrunkenStein/drunkenstein/static/images/loginheader-right.png
Copying menu-item-actibg-first.png to ./DrunkenStein/drunkenstein/static/images/menu-item-actibg-first.png
Copying menu-item-actibg.png to ./DrunkenStein/drunkenstein/static/images/menu-item-actibg.png
Copying menu-item-border.png to ./DrunkenStein/drunkenstein/static/images/menu-item-border.png
Copying menubg.png to ./DrunkenStein/drunkenstein/static/images/menubg.png
Copying ok.png to ./DrunkenStein/drunkenstein/static/images/ok.png
Copying pagebg.png to ./DrunkenStein/drunkenstein/static/images/pagebg.png
Copying star.png to ./DrunkenStein/drunkenstein/static/images/star.png
Copying strype2.png to ./DrunkenStein/drunkenstein/static/images/strype2.png
./DrunkenStein/drunkenstein/static/images/tg_under_the_hood.png already exists (same content)
./DrunkenStein/drunkenstein/static/images/under_the_hood_blue.png already exists (same content)
Copying warning.png to ./DrunkenStein/drunkenstein/static/images/warning.png
Recursing into templates
Skipping file /usr/local/lib/python2.6/dist-packages/TurboGears-1.1-py2.6.egg/turbogears/qstemplates/quickstart/+package+/templates/login.html_tmpl
Copying master.html to ./DrunkenStein/drunkenstein/templates/master.html
Copying welcome.html to ./DrunkenStein/drunkenstein/templates/welcome.html
Recursing into tests
Creating ./DrunkenStein/drunkenstein/tests/
Copying __init__.py to ./DrunkenStein/drunkenstein/tests/__init__.py
Copying test_controllers.py_tmpl to ./DrunkenStein/drunkenstein/tests/test_controllers.py
Copying test_json.py_tmpl to ./DrunkenStein/drunkenstein/tests/test_json.py
Copying test_model.py_tmpl to ./DrunkenStein/drunkenstein/tests/test_model.py
Copying README.txt_tmpl to ./DrunkenStein/README.txt
Copying dev.cfg_tmpl to ./DrunkenStein/dev.cfg
Copying sample-prod.cfg_tmpl to ./DrunkenStein/sample-prod.cfg
Copying setup.py_tmpl to ./DrunkenStein/setup.py
Copying start-+package+.py_tmpl to ./DrunkenStein/start-drunkenstein.py
Copying test.cfg_tmpl to ./DrunkenStein/test.cfg
Running /usr/bin/python setup.py egg_info
running egg_info
writing requirements to DrunkenStein.egg-info/requires.txt
writing DrunkenStein.egg-info/PKG-INFO
writing top-level names to DrunkenStein.egg-info/top_level.txt
writing dependency_links to DrunkenStein.egg-info/dependency_links.txt
writing entry points to DrunkenStein.egg-info/entry_points.txt
writing paster_plugins to DrunkenStein.egg-info/paster_plugins.txt
reading manifest file 'DrunkenStein.egg-info/SOURCES.txt'
reading manifest template 'MANIFEST.in'
warning: no files found matching '*.kid' under directory 'drunkenstein/templates'
writing manifest file 'DrunkenStein.egg-info/SOURCES.txt'


おほっふぉおおっ!!