タグ

ブックマーク / mt.endeworks.jp (54)

  • YAPC::Asia Tokyo 2011 1日目・・・ - D-6 [相変わらず根無し]

    YAPC::Asia Tokyo 2011 1日目・・・ 2011年10月15日 04:05 D | ブログ記事のURL | コメント(0) | トラックバック(0) 運営者として3回目のYAPC::Asia Tokyo 2011。おっさんになってきたと感じる。 前夜祭の時点からすでに腰痛。1日目に大岡山に向かう時大井町線のラッシュに巻き込まれ、途中でタクシーで移動しなかった自分を呪ったり。昼間忙しく仕事してたら腰痛は大分よくなったけど、毎年恒例の講堂の階段を何もダッシュであがったりおりたりを繰り返していたら腰、ケツ、足がパンパン。 家に帰ってきて嫁にグリグリとマッサージしてもらったら少し緩和された感じ・・・ なんて、おっさんは肉体のクォリティがどんどん落ちてるからこういうことを言う物の、今年のYAPCはとにかくボランティアスタッフの数が多くて多分スタッフとして参加していた2006, 2

  • 某オブジェクトストレージでデータをお引っ越し中な話 - D-6 [相変わらず根無し]

    某オブジェクトストレージでデータをお引っ越し中な話 2011年9月30日 09:25 D | ブログ記事のURL | コメント(0) | トラックバック(0) 目的:オブジェクトストレージの旧ストレージサーバーから新ストレージサーバーにデータを引っ越しすること。rsyncやディスクを単純に交換するという方法も考えたが、ついでにデータのリバランスを行いたいので、ツールで移行する方法を採る。 概要:オブジェクトとは、ユーザーから見る「1ファイル」で、この1オブジェクトに付き、1個かそれ以上の実体(entity)が存在する。1ストレージには任意のオブジェクトの実体が最大1個保存される。この実体が複数あることによって、ストレージがダウンしたとしてもオブジェクト自体は生き残る事ができる。複数の実体がある場合は必ず複数のストレージサーバーに実体のコピーが保存されている。これを1ストレージサーバーずつ、

    kamipo
    kamipo 2011/10/03
    LIMIT 5000,1 じゃなくて LIMIT 5000 OFFSET 0 なのでは!
  • White Camel Awards 2011 - D-6 [相変わらず根無し]

    White Camel Awards 2011 2011年8月18日 10:51 D | ブログ記事のURL | コメント(0) | トラックバック(0) 昨日の夜、ビールの缶のプルトップをぷしゅっ!とあけてぐびぐびと一番うまい最初の一口を飲んで、ベッドの上からツイッターに発泡酒よかビールのほうがうまい、とか書いてたらtwitterで今年のWhite Camel Awardをもらったということを聞いた。ちなみに以前の受賞者には@miyagawaさんとかがいます。 人いないところでやるのはどうなのよ、とは思いつつも(まぁしょうがないっすよね!)、大変ありがたい話です。White Camel Awardが何か知らない人に説明すると、要はPerl技術とかそういうところでの貢献ではなくて、コミュニティであったりイベントであったりマーケティングとかそういうところでPerlに貢献した人を表彰してく

    kamipo
    kamipo 2011/08/18
    おめでとうございます!
  • YAPC::Asia 2011で話してくれッ! - D-6 [相変わらず根無し]

    YAPC::Asia 2011で話してくれッ! 2011年7月27日 16:37 D | ブログ記事のURL | コメント(0) | トラックバック(0) これは自分がYAPCの運営に関わっている人でなかったとしても言える:「カンファレンスで喋る(喋った経験のある)エンジニアはその後チャンスが広がる」。あとさらに言うと、カンファレンスで喋れないとか言ってる人はひとつ大事な事を見逃している。今喋っているあの人達だっていつかは初心者だったんだ。最初に必要なのはまず応募してみる勇気だ。みんなスタートラインは一緒! YAPC::Asia Tokyo 2006だか2007で俺は初めて人前で喋った。300人入る講堂の中で喋った。何をどう喋ったか覚えてないけど、俺は目立ちたかった。俺は俺という人間がPerlを使える人であることをアピールしたかった。俺はその後のキャリアで仕事に困りたくないから実績が欲しか

  • Brahman: a supervisor clone in Perl (under development) - D-6 [相変わらず根無し]

    Brahman: a supervisor clone in Perl (under development) 2011年6月13日 15:57 D | ブログ記事のURL | コメント(0) | トラックバック(0) 週末にsupervisorっていうものについて話してる人がいたので、特に理由なくPerlでクローンを書いてみようと思った。というわけで当に基の部分まで書いた。名前はBrahman。神様の名前にしたかったのはプロセスの生死を管理するから。 繰り返すけど、特に理由はない。書きたかったから。ちなみに内部的には多分家と全然互換性はない。設定ファイルがだいたいクローンできればいいや、というくらい。 今のところできることは、例えば今daemontoolsで管理してるplakupサーバーがあったとして、こんな感じの設定を書くと立ち上がってstdout/stderrを一緒のログに保存

    kamipo
    kamipo 2011/06/13
  • dotCloud でPSGI Hello World - D-6 [相変わらず根無し]

    dotCloud でPSGI Hello World 2011年4月30日 16:32 D | ブログ記事のURL | コメント(0) | トラックバック(0) 最近PSGI/Perlをサポートし始めたdotCloudのinvite codeをもらったのでとりあえずHello World的なアプリを作った。 作り方だが、まずdotcloud用のツール類をインストールする必要がある。自分のマシンでpythonを動かした事がなかったのでそこから。まず自分のpythonは homebrew経由で入っているヤツで、全てユーザー権限で入っているのでsudoとか使ってないのに注意。 easy_install dotcloud docloudではまず"deploy"というものを作る。deployは複数の"service"の集合体。"service"はそれぞれが一個のアプリなり、データベースなりを指す(

  • Perlでシグナル処理(DBIを黙らせる編) - D-6 [相変わらず根無し]

    Perlでシグナル処理(DBIを黙らせる編) 2011年4月27日 01:42 D | ブログ記事のURL | コメント(0) | トラックバック(0) なんかふと気づいたら最近以前書いたPerlでシグナル処理の記事にブクマがついていたので続き的な感じで書いてみた。 例えば 以下のように、ワーカーとかでずーーーーっとDBにクエリを投げてその結果を使って処理をする、というような処理を書くとする while ( $loop ) { my $sth = $dbh->prepare( .... ); $sth->execute(); while ( $sth->fetchrow_arrayref ) { .... } } 以前書いた%SIGを用いたPerlの普通のシグナル処理では、もしexecute()でブロックしていた場合など(例:Q4Mでqueue_waitしてる)ではいくらSIGINTとかを

  • Perlシグナル処理 - D-6 [相変わらず根無し]

    Perlシグナル処理 思い立ったので適当に書いてみる Perlのシグナルハンドラは%SIGグローバル変数にシグナル毎のハンドラを設定することで実現できる。例えばCtrl-CはSIGINTを発生させるので、INT用のハンドラを設定する: $SIG{ INT } = sub { warn "got SIGINT!" }; %SIGに限った事ではないのだけれども、ここでまず注意しなくてはいけないのが、%SIGはグローバル変数であること。ある関数foo()内で%SIGをいじったあとにreturnすると、foo()を呼び出したスコープでもその値は有効になってしまう。これだと自分はよくても他のモジュール等に影響を与える可能性がある。そこでまず癖としてlocal修飾子を使う癖をつけてほしい local $SIG{INT} = sub { warn "got SIGINT (OUTSIDE)" }; su

  • Text::Xslateが素敵すぎる(Markdown編) - D-6 [相変わらず根無し]

    Text::Xslateが素敵すぎる(Markdown編) 2011年2月17日 10:13 D | ブログ記事のURL | コメント(0) | トラックバック(0) おいおい、Text::Xslate素敵すぎるだろ。 今日Markdownを使いたいと思ってちょっと考えたら、これだけで終了した: use strict; use Text::Xslate; my $xslate = Text::Xslate->new( .... module => [ 'Text::Markdown' => [ 'markdown' ] ] ); print $xslate->render_string( <<EOT, { text => $some_markdown_text ); [% text | markdown | mark_raw %] EOT 素敵!gfx 先生になら抱かれてもいい。 俺もXS

  • slow query logとかをTest::mysqldで出す - D-6 [相変わらず根無し]

    slow query logとかをTest::mysqldで出す 以前ここで書いたTest::mysqldの仕組み、すこーしずつ毎回変えながら使ってる。今は継承はしてないが、まぁやってることはだいたい一緒。 で、テーブルのインデックスとか使ってるクエリとかを確認したいなーと思って、slow query logと general log をぼこっと出せるようにした。 if (! $ENV{ TEST_DSN }) { my %my_cnf = ( 'skip_networking' => '', ); if ( $ENV{SLOW_QUERY_LOG} ) { $my_cnf{ slow_query_log } = 1; $my_cnf{ slow_query_log_file } = $ENV{SLOW_QUERY_LOG}; $my_cnf{ long_query_time } = $

  • Test::mysqldとかでテスト走らせる時に際行ったいろんな事。 - D-6 [相変わらず根無し]

    Test::mysqldとかでテスト走らせる時に際行ったいろんな事。 Test::mysqldを使うとクールにMySQLを起動させられるので、それを使おうとしたんだ。でもおいらのローカルにあるmysqlMacPortsのmysqlで、ファイルレイアウトがメタメタなんだ。だからまずこんな感じで、Test::mysqldを継承するMyApp::Test::mysqldを書いたわけさ! 必要とあればMacPortsとかの環境じゃなくてもMYSQL_INSTALL_DBMYSQLDを設定すればテスト時にTest::mysqldが見るバイナリを変更できるのがミソだね! さて、これを使っても、何個もテストスクリプトがある時に一回一回mysqlを立ち上げ直してちゃ意味がない。遅いし、毎回DBの設定をしなくちゃいけないじゃないか! だもんで、まずmake testが走るときに前もってTest::mys

  • Plack + Markdown - D-6 [相変わらず根無し]

    Plack + MarkdownMarkdownで紙用の原稿書いているんだけど・・・ Markdownって楽だけど、実際にフォーマッティングがどんな感じになるかを見るには1回パースして処理する必要があるじゃないですか。いちいちMarkdown.pl呼び出すのも面倒くさいからPlackでディレクトリ直下のファイルをパースしてはき出すようにした。 Plackはなにげにこういう使い方が異常に便利な気がする。まさにSwiss Army Knifeって感じ。 use strict; use File::Spec; use Text::MultiMarkdown 'markdown'; sub { my $env = shift; my $file = File::Spec->catfile( File::Spec->curdir, $env->{PATH_INFO}); open my $fh,

    kamipo
    kamipo 2010/03/30
  • Plack + Router::Simpleで簡単なジョブキュー書いてみた - D-6 [相変わらず根無し]

    Plack + Router::Simpleで簡単なジョブキュー書いてみた まだちゃんと使ってないから問題点とかわからないけど、とりあえずStarmanを使うとかで結構スケールできる気がする。そのあたりを自由に変えられるのもPlack++だね。 使用想定としては、これをplackupしておいて、クライアント AnyEvent::HTTPで http_postして非同期で応答待ちする感じ。 package Lyra::Server::Worker; use Moose; use Router::Simple; use JSON::XS; use namespace::autoclean; use constant NO_SUCH_WORKER => [ 404, [ "Content-Type" => "application/json" ], [ q|{ "status" => 0, "

  • CGIをPlackで開発 - D-6 [相変わらず根無し]

    CGIをPlackで開発 ちょっと案件で簡単なCGIスクリプトをを開発することになった。StarmanとかTwiggyでほとんど全て書いているのに今更CGIとかそういう突っ込みはとりあえずおいておいて・・・環境を作るのも面倒くさいし、簡単にサーバーを立ち上げたり落としたりしたい。 そこでPlackです!具体的にはplackupとCGI::Emulate::PSGIを使います。 何も考えずにとりあえず開発したいので、以下のようにapp.psgiにコードを書いていく。 use strict; use CGI::Emulate::PSGI; return CGI::Emulate::PSGI->handler(sub { CGI::initialize_globals(); # 重要 # ここから #!/usr/bin/env perl use strict; use warnings; use

  • Guard vs Scope::Guard - D-6 [相変わらず根無し]

    Guard vs Scope::Guard perl 5.8.8 で GuardとScope::Guardを比較してみた。関数が終了したタイミングでコールバックが走るようにした状態で比較。Guardはスコープ終了時に走るscope_guard()とダイナミックガードであるguard()両方で試してみた。 use strict; use Benchmark qw(cmpthese); use Scope::Guard; use Guard; cmpthese(500_000, { scope_guard => sub { my $guard = Scope::Guard->new(sub { 1 }); }, guard_dynamic => sub { my $guard = guard { 1 }; }, guard => sub { scope_guard { 1 }; } }); 結

  • Plack/Starman Daemontools Run File With Complete Deploy Bundle - D-6 [相変わらず根無し]

    Plack/Starman Daemontools Run File With Complete Deploy Bundle 注1:まだ番にはデプロイしてませんが、テストでは使いました。 注2:以下スクリプトは開発者の労力を減らすためのスクリプトで、万全なデプロイ方法だとか言うわけではありません。 注3:正直シェルスクリプトは素人です。 ここ最近のアプリケーションのバンドル・デプロイについてちょっと固まりつつあるので、書いてみる まず アプリケーションと、その依存関係。デプロイ側のサーバーにはlocal::libと必要なModule::Install系のモジュール、それにModule::Install::Bundle::LocalLibがインストールされている前提です。アプリケーションの依存関係は全部Makefile.PLに書きます。 use inc::Module::Install;

  • $. と <> と for と while - D-6 [相変わらず根無し]

    $. と <> と for と while forでは$.はカウントされない ちょっと違うので横から。 これはforの動作というより、式の評価コンテキストの問題。 forはその性質上、捜査対象は配列になる: for (<>) { .... } # 上記はこれと同等 my @lines = <>; for(@lines) { .... } なので、<>も配列として評価されるべく*まず最初に*<>を最後まで読み切って、行区切りの配列を作ってからforに渡す。このときファイルハンドルを読み切っているので、当然 $.はファイル全体の行数になる。 これに対して、whiileは対象を毎ループ評価するので、1行ずつの読み込みになる。だから$.は行毎の値になる。B::Deparseを使うとちょっとわかるかも。 # こっちはちょっと正直わかりにくいとは思うけど・・・ daisuke@beefcake $ p

    kamipo
    kamipo 2010/02/23
  • q4mのconditional subscriptionにびびった件 - D-6 [相変わらず根無し]

    q4mのconditional subscriptionにびびった件 Mvalveをリリースして、色々機能改善をする前にベンチマークを書こうと思いました。なのでまずQueue::Q4Mにてベンチマークですよ。 Queue::Q4M 0.00007のmiscディレクトリ内にベンチマークがあります。ってことで、以下の条件でベンチマーク走らせてみました ストレートに1000件入力してから1000件全部conditional無しで抽出する1000件+その約50倍のダミーデータの中から、conditionalにマッチする1000件を全部抽出するという2パターンで実験した結果が以下の通り >> executing default + Start Tue Jul 8 01:54:44 2008 + End Tue Jul 8 01:54:53 2008 + Processed 1000 message

    kamipo
    kamipo 2010/01/29
  • Repeated dispatch with AnyEvent - D-6 [相変わらず根無し]

    Repeated dispatch with AnyEvent 例えば、AnyEvent::DBIで Q4Mを使って、*常に*なんらかのイベントをqueue_wait()する状態にしたいとする。するとexec()が終わったらまた同じexec()を呼ぶ事になるので、例えばこんなコードを書くかもしれない。 use strict; use AnyEvent::DBI; my $sql = "SELECT .... FROM queue_table WHERE queue_wait('queue_table', 10)"; my $dispatch; $dispatch = sub { $dbh->exec( $sql, sub { # 返ってきた値でなんかする $dispatch->(); }); }; $dispatch->(); # まぁ他の事してるプログラムで使うだろうから、来はいらな

  • AnyEventでの簡単なFIFOキューの作り方 - D-6 [相変わらず根無し]

    AnyEventでの簡単なFIFOキューの作り方 まぁ考えてみれば単純な話ですけど、いわゆるGuardを使うとよいです。参考はAnyEvent::HTTP コールバック$cbの最初の引数をguard変数にしておき、キューの1スロットを使用している間はこのguard変数をundefしないようにしておく感じです。 use strict; use AnyEvent; use AnyEvent::Util; my @q; # 実際にコールバックを入れておくところ my $ACTIVE = 0; # 現在の使用中スロット my $MAX_ACTIVE = 1; # 最大何個のコールバックを「同時」に行うか(もちろん当に同時じゃないよ!) sub drain_queue { while ( @q && $ACTIVE < $MAX_ACTIVE ) { if (my $cb = shift @q)