タグ

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

  • ハッシュに値を振り分ける時のコード - D-6 [相変わらず根無し]

    ハッシュに値を振り分ける時のコード 例えばCSVなファイルを読み込んで、それをハッシュの中に展開、格納と言った感じの動作をPerlで行いたかったとします。例えば 1,2,3 と言った行を my %hash = ( 'col1' => 1, 'col2' => 2, 'col3' => 3 ); のようなハッシュに展開する関数が欲しいわけです。皆さんはこれをどういう風に実装しますか?ぱっと思いつくのはforループですよね my @colums = ('a', 'b', 'c'); my @values = (1, 2, 3); # もちろん実際にはsplit(/,/, $line)とか、CSVパーサーを使う my %h; for (0..$#columns) { $h{ $columns[$_] } = $values[$_]; } 実はこのようなCっぽい書き方はPerlでは大概遅いです。D

    kamipo
    kamipo 2008/08/28
  • minamlistic dev environment - D-6 [相変わらず根無し]

    minamlistic dev environment 開発環境の話をよく振られます。 「牧さん何使ってるの?」って言われて、なんかすごい装備を使ってるんじゃないかという期待の目を見てしまうとちょっと申し訳なくなってしまい、ちょっと言葉が出なくなってしまうのですが、「え・・・vim」としか言えません。 理由はシンプルです。大学時代はずっとラボにあったSPARC II状でXEmacs使ってました。で、その後某NetAppに入社したとき、XEmacsがインストールされてなかったんですね。っていうか、それ以前にあちこちのマシンでvi/vimはあるけどemacsはねぇ、的なマシンがあったりして、いちいちそのたびに新しいやり方を覚えなくてはいけなくなって、もういやになったのです。 結論としては「特定の環境に依存するようだと面倒くさい」という結果に落ち着きました。UNIXに依存はちょっとどうやってもは

  • Mooseにおけるメソッドレゾリューションの落とし穴 - D-6 [相変わらず根無し]

    Mooseにおけるメソッドレゾリューションの落とし穴 MooseでRoleを作ります package Role; use Moose::Role; requires 'foo'; no Moose; で、このRoleをChildで実装しますが、こいつに親クラスParentがあると仮定します。こんな感じ。 # Parent package Parent; use Moose; has 'foo' => ( is => 'rw', isa => 'Int' ); no Moose; # Child package Child; use Moose; extends 'Parent'; with 'Role'; no Moose; で、foo()ってattributeがついているんだから、当然Roleのrequiresも満たしてると思いますよね? 満たしてません。 実はMoose::Roleのr

  • Introducing Data::Valve - D-6 [相変わらず根無し]

    Introducing Data::Valve 昨日から思い立ってData::Valveというものを書いてみました。XS混じりのスロットリング用モジュールです。 Data::Throttlerでも同じような事ができるわけですが、こっちは内部が非常にごつい。しかも拡張しにくい事この上ない。アクセッサーとか全くないんだぜ? ってことでData::Throttlerとほぼ同等のAPIを持って、内部構成を完全に書き直しました。 Data::Valveは内部の基スロットリングロジックはものすごく簡単なCで書いてます。単純にスロットリング判定が行われた時間を保存したリンクドリストを格納しておいて、その数と現在時刻からのインターバルを持って計算するだけです。 ただ、キモはこの計算を行うデータ構造体をシリアライズ・デシリアライズすることによって、外部媒体にこのデータを保存して、複数プロセスどころか複数ホ

  • Shibuya.pm #9 で話してきました - D-6 [相変わらず根無し]

    Shibuya.pm #9 で話してきました Shibuya.pm #9, a.k.a. XS Niteで話してきました。スライドはPDFで公開してます。 その後今日もう一つプレゼンをやって、これでやっと先月から続いてた怒濤のプレゼン5連チャンが終わった。id:takesakoさんじゃないんだから、こんなにしゃべるのつれぇw 今度は原稿を書かないといけない。 カテゴリ 日常 2008年6月27日 14:07 D | ブログ記事のURL | コメント(0) | トラックバック(0) |

  • YAuthスペック - D-6 [相変わらず根無し]

    YAuthスペック Yauthとは"Yome(嫁) Auth"の事で主に男性が婚姻関係、もしくは親密な関係にある女性に対しての認証を得るために使われるプロトコルです。トランスポートレイヤーは電話やメールが使われる事が多いですが、スペック上の規定は特になく、プラッガブルな実装を可能にしています。 プロトコルに参加するのはPeer (同僚・友達)、Client (認証を得たい人物), End Point (嫁)の三者です。プロトコルが発動する前に、PeerよりClientにProbe (お誘い)メッセージが送信されます。この時点ですでにキャッシュされたEnd PointよりのレスポンスをClientが持っている場合はただちにClientからPeerへ返答が返ります。 キャッシュされたレスポンスがない場合はClientよりEnd Pointに実装依存のトランスポートレイヤーに乗せてクエリーが投げ

  • CatalystをPARデプロイする際のハック - D-6 [相変わらず根無し]

    CatalystをPARデプロイする際のハック Catalystにはデフォルトでcatalyst_parというディレクティブが備え付けられていて、Makefile.PLで ... catalyst_par; ... WriteAll; とすると後のmake時にPAR形式のファイルを作れるようになる機能があります。このPARファイルを作成するには make catalyst_par とするわけですが、アプリケーションができあがって、「さあPARでも作るか!」と言った皆さんはおおむね以下のような意味の分からないエラーに悩まされてきたのではないでしょうか: Writing PAR "wifigadgets-control.par" make: *** [catalyst_par] Error 25 この訳の分からない動作不具合、根的な問題は二つあります。一つにはこのcatalyst_parでP

  • MooseX::Daemonizeがセクシーすぎる件について - D-6 [相変わらず根無し]

    MooseX::Daemonizeがセクシーすぎる件について さて、すっかりMoose厨となりつつある私ですが、この度デーモンスクリプトを書くことになりましたのでMooseでこれをするのは何がいいかなと考えていたわけです。したらなんでもありますな、CPANは。MooseX::Daemonizeですよ、奥さん。 考え方としては、スクリプトの書式をコントロールするオブジェクトをまず作ります。 package MyDaemon; use Moose; with 'MooseX::Daemonize'; コマンドラインから受け取るオプション等はこのオブジェクトの属性として指定します。 has 'option1' => ( is => 'rw', isa => 'Str', required => 1 ); has 'option2' => ( is => 'rw', isa => 'Bool',

  • CoroでFlickrにアクセスする - D-6 [相変わらず根無し]

    CoroでFlickrにアクセスする もうずいぶん前からCoroを使いたくて使いたくてしょうがなかったのだが、やっときたよ。Flickr APIを叩いて、非同期I/OしながらCoroで写真の情報をダウンロードするよ! まず某sukebeさん作のWebService::Simpleを使ってみるよ(当に使ったコードは違うフレームワーク用にいろいろついてたので、あまり利便性とか考えずに説明用のコードだけ書きだします) package MyFlickrModel; use strict; use WebService::Simple; my $webservice = WebService::Simple->new( \%必要な引数 ); # 写真のIDを渡すとinfo, context, sizes, permsを全部ひっぱってくる sub find_photo { my $class =

  • MVCのモデルはDBじゃなくてもいいんだよ - D-6 [相変わらず根無し]

    MVCのモデルはDBじゃなくてもいいんだよ id:charsbarさんが、先ほど書いたエントリに関して 後半その通りなわけですが、CatalystはModel::DBIC系のせいでMVCが誤解されてるのよねー と言っておられる。たしかにその通り。「モデルってDBでしょ?」みたいな印象が一般的にあると思う。 そういう印象を持ってる人に説明すると、「モデルを作る」って何かというと、DBのようなストレージにあるものをどうこうする、ではなくて「データに対する操作を抽象化したものを作る」ということです。例えば、ブログを作ると、Blog、BlogEntry、BlogUserみたいなモデルを作ります。そしてその操作方法はこんな感じ: # ブログを登録するみたいなAPI MyApp::Model::Blog->create({ user => $blog_user, title => $title, .

  • バグ見つけた→それってどんなテスト?もしくは、なんでMVCなんて使うの? - D-6 [相変わらず根無し]

    バグ見つけた→それってどんなテスト?もしくは、なんでMVCなんて使うの? 最近ソフトウェアエンジニアリングに置ける開発手法に関して考えている。 ぶっちゃけ言ってしまうと「やっぱりTDDっぽいのがいいな」というところに落ち着きつつあるのだが、厳密にTDDをしたほうがよい、と思ってるわけではない。TDDとかExtremeプログラミング、Agileプログラミングにしても理想はいいんだけど、原理主義っぽい使い方は現実にそぐわないと思ってるからだ。 前置きはこれくらいにしておいて・・・重要だと思うのは以下の点: 開発サイクルに自動テストツールを組み込むエンジニアによるバグ/不具合発見時には「動かない」は許可しない。必ず再現コードを提出してもらうテストを自動テストツールを組み込む(=次回リリース前にはかならずテストを実行できる状態にする)テストが通るまで修正を続けるという開発サイクルを取るべきだ、とい

  • Perlのmakeフェーズの挙動 - D-6 [相変わらず根無し]

    Perlのmakeフェーズの挙動 いわゆるCPANモジュール形式で展開されているモジュールに対して一般的に行う以下の手順: perl Makefile.PL make make test make install # 以下はモジュール作成者のみが気にするであろう make clean make disttest make dist make manifest これがそれぞれ何をしているのかって案外しられてないのかもしれない。 perl Makefile.PL - これはMakefile.PLを単純に実行している。この中では一般的にExtUtils::MakeMaker、Module::Build、Module::Install等のモジュールが使用され、インストールに使うMakefileというファイルを作る。これはmakeコマンドが自動的に検知して、使用してくれる。ちなみにmod_perl

  • 才能の無い人がやれる事 - D-6 [相変わらず根無し]

    才能の無い人がやれる事 色んなところで自分の今までの経歴を話す時に話してるけど、俺は基的に落ちこぼれです。大学は工学部でComputer Scienceを専攻したけど、イマイチぱっとせず、基中の基みたいなコースも落とした事あるし、授業なんて(アメリカの大学なのに)全然出てなかった。自分の専攻のクラスはさすがに退学にされたくなかったんで出てたけど、それ以外の数学、経済、化学、物理、ことごとく出席日数は50%以下だ。物理なんて全行程を通して2回しか出てない。 特に創造力があるわけでもない。若かりし頃、高校生とかその頃は漫画家を目指してみたり、ミュージシャンを目指してみてレスポールを膝くらいの位置に吊って弾いてたりしてみたけど、結局そういうシナプスがばりばり音を立てて何かをゼロから生み出すような事もたいしてうまくなかった。 だから正直大学卒業間際は相当焦ってた。卒業後紆余曲折あって、2年後

  • Re: cache::memcached::fast とか ::XS とかとのベンチはどれくらい? - D-6 [相変わらず根無し]

    Re: cache::memcached::fast とか ::XS とかとのベンチはどれくらい? 追記:get()だけじゃなくてset()もベンチとってみた。Cache::Memcachedと比べてget()はざっくり6倍から9倍、set()は2倍から4倍速いみたい。 追記2:一番最後のset()ベンチだけは::Fastが速かった事に今更気づいた。レポート読み間違え。なんとなーーーく俺のベンチでは圧縮が行われてない気がする。誰か知ってたら教えてください。 id:miyagawaさんがLibMemcached.pmに関して「cache::memcached::fast とか ::XS とかとのベンチはどれくらい?」と言っていたので、やってみた。 ベンチ対象はCache::Memcached, Cache::Memcached::Fast,それにCache::Memcached::LibMe