新しいblogに移行しました

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

2011-12-04

[perl]Hachioji.pm #11 で幹事やってみた

毎度おなじみHachioji.pmに参加してきました。

今回は町田で開催ということもあって、近くに住んでいることもあり、幹事をやらせてもらったのですが、24名の参加者が集まる賑やかなpmとなりました。雨にもかかわらず来てくださった皆さん、本当にありがとう!


LTのテーマは「○○道」ということだったのですが、みなさん思い思いの「道」に関するネタを発表されていました。

ちなみにぼくは「幹事道」と題し、perl関係ない内容の話をさせてもらいました(資料こちら)。

幹事の経験が実はあまり無いので、主に時間周りでご不便をかけてしまったところもあったのですが(本当に申し訳ない!)、そういったところもフォローしていただいたりした結果、非常に意義深く、楽しい集まりになったんだと思っています。

Hachioji.pmは、参加者全員の協力のもとに成り立っているのです。

※名言:「Perlはコンピュータとお話をするための自然言語」

[perl]今年のadvent calendarの記事を書いたので宣伝

Casual Track 3日目の記事を書きました。

Crypt::SaltedHash - パスワードを安全に保存するための一手段 - Perl Advent Calendar Japan 2011 Casual Track

テーマは割りとディープなものですが、5分以内で読める非常にライトな内容ですので、まあ読んでやってください。

それと、記事を書く人も募集中だそうですよー!

2011-11-18

[perl]Yokohama.pm #8に参加したのでメモをあげてみる

bonnuさん - orepanとcpanmを使ったcpan module の部分ミラーの運用管理


Cartonの話ではありません!

kazeburoさんの11/2月時点のブログ記事が元ネタ。

CPANミラーをローカルに作る理由
本家CPANの更新の影響を受けずにモジュールをインストールしたい。
 アプリケーションが依存するモジュールの挙動を保障するためにバージョンを固定する必要がある。
アプリケーションをネットに依存せずに確実にインストールしたい
 search.cpan.orgやそのミラーは作者による取り下げも反映されてしまう。
 CPANネットワークがあがっている保障はない。
複数代をセットアップする際に外部ネットワークに接続したくない。
 数十大規模になればなおさら。セットアップをすばやく行うためにも重要。
 企業によっては外部ネットワークへの接続ポリシーに縛られる。
社内パッケージをCPANモジュールと同様に扱いたい。

ミラーを作り、維持するために必要な道具
 cpanm
 orepan
 pm-uninstall

手順
 cpanmをセットアップする
 OrePANをセットアップする
 orepan.pl、orepan_index.plにパスを通す

ローカルミラーを作る
 モジュールのダウンロード
  アプリケーションのMakefile.PLから依存モジュールをDLする。(requiresに依存モジュールを書いておく)
  cpanm のオプション --save-dists=cpan-mirror をつけておくと、tarballにモジュールを保存してくれる。
 ダウンロードしたファイルの確認
 インデックスの作成
  orepan_index.plを利用してインデックスを作成する。
  作成したインデックスファイルの確認
   ここまででローカルミラーが完成。
 バージョン管理システムへの登録
  GITなどに。

ローカルミラーを利用してのデプロイ
 デプロイしたいサーバ上でプロジェクトをチェックアウト。
 プロジェクトに含まれるミラーをつかってcpanmを実行。(cpanm --mirror=hogehoge --mirror-only)

ローカルミラーを運用
 モジュールを追加する
  Makefile.PLに依存モジュールの記述を追加
  cpanmを実行
  orepan_index.plを実行。

 オリジナルモジュールを追加
  orepan.plを利用してミラーに追加。

チラ裏
 Carton
 minicpan_webserver.pl

まとめ
 ミラーを運用することでサービスを簡単に設置できる状態を整える。
  プロジェクトに関連付けてtarballにまとめておくだけです。
 3年後、今のCPANモジュールをベースにして書かれたアプリケーションを楽にセットアップできるように
  CatMoose以前のプロジェクトをすんなり動かすのは難しい
  APIが変更されるモジュールもままある
  野良リポジトリのモジュールなどはリポジトリがなくなってることも。


masartzさん - Mixiの大規模案件の話


大規模案件とは
 mixiページ作ったときの話。

名前空間、モジュール設計
 1つのレポジトリで世界が構成されている場合
 名前空間の衝突は気をつけるべき問題
 命名規則もトップレベルはサービスを表現できるように
 配下の構成は周りと整合性があるように
 意識あわせとタスク分担のために結構がっちり決めた
 そんなんやってもだいたいは仕様追加・変更で思い通りにならない
 最初にがっちり決めるものではない

単体テスト
 レイヤーごとに適切なテストがある。
 今回はController/Model・DB-Accessそれぞれで書きわけ・方針決めた
 開発人数がおおかったので、誰がどの修正をしたのかわかるように

 DBAccessクラスのテスト
 DBとの接続
  ORM使ってない

 Select系はis_deeplyで取得結果全体チェック
 Insert系もInsert行をSelectしてis_deeplyで全体チェック
 これらの実現のために社内製Fixtureモジュールを指定
 最近ではDBIx::DataFactoryも使い始めている

 Controllerのテスト
 社内の一番の泣き所
 Plack::Test::test_psgi使った
 すごく便利
 今後はどこまでやるかの境界線も考えたい。

CI(Jenkins)
 Perl5の開発にも使われている
 test書く→ブランチにコミットする→自動テスト
 テスト結果をIRCで通知
 scoreboard
 コミットのスコアを計算してくれる
  テスト落とすと-10点
  テストを10個書くと+10点
 一番最後のリリースのとき
 プロジェクトメンバー全員が数ヶ月必死にテストを書いた

プロジェクトを通じて個人的な振り返り
 コードをあまりかけなかったので、もっと書きたかった
 先のフェーズを見て、必要なことをする
  約束事をきめたり、環境構築周りをごにょごにょしたり。
 プランチコントロール、リリースフローの調整
 忙しさのピークな時も仕事を拾えない
 運用トークをもっと聞きたい。
 Yokohama.pmだし。
 リーダーやマネージャーさんのマネジメントな話も聞きたい

まとめ
 大規模開発にはそれなりの大変さ
  スピード感ではぜんぜん遅い
  サービス品質もまだまだなところもある
 CIツールはとっても便利なので導入するといいとおもいます。
 コード書いてる人意外の話も聞きたいです。


Yappoさん - はかどる話2


ITSのはかどった話

 before
  Cat-based
  Moose
  mod_perl
  直したいけどメンテやってる人にやらせようと思った

 After
  Amon2 based
  cpanmで簡単に開発環境をつくれる

  コードの見通しが良くなった
  開発者が3倍くらいになった
  業務がはかどる拡張がすごい増えた
  Tracから乗り換える開発プロジェクトも

  タイトルの抽出
  記法の追加
   PRE記法、SUPER-PRE記法
   TODO記法
   社内GyazoURLをインライン表示
  変更があったらIRCに通知

  喜びの声
   TODO便利
   マイルストーンとは?
   ikachanもほめられた

 まとめ
  社内ツールは小さく作って新規参入しやすいようにしておくと捗る。

IRC関連
 ツイッターのURLから内容を取ってくるスクリプトを書いた
 ITSのURL張られたときに内容をとってくる
 #数字でIRCのチャンネルに該当するITSのイッシューを持ってくる
 コミットメッセージの内容もはいたり
 CloudForecastとかYabitzとの連携

グラフ
 書くためのツールがなかったので、昨夜いらっとして書いた。
  →ClothForest
  kazeburo先生が本気だし始めたので、今後は正座して見守る

IRCBot捗らせたい話
 Kuragepo
  サーバ・クライアントモデル
  クライアントのつくりが簡単。依存少ない。
  gearmand動かしてるけどkuragepo -S ircserverってするだけでOK


ikasam_aさん - Brownie


YAPC::AsiaでPerlのテストと他のテストの比較をした。

Perlのテストの足りないライブラリ
 Mock
 ブラウザインテグレーション周り

Capybara
 実際のユーザがブラウザで操作を行うのをエミュレーション/テストするもの
 DSL
 ドライバ
  RackTest
  Selenium
  HtmlUnit
  WebKit(QtWebKit)
  Envjs
  Zombie.js

Brownie
 今作ってる
 Capybaraをインスパイア
 統一的なAPIを提供し、ブラウザ操作をエミュレーションできるようにした

ドライバ
 Selenium
 Mechanize
 HtmlUnit

今後
 Mechanizeドライバを完成させる
 Scoping
 Seleniumサーバを内臓する
 HtmlUnitドライバを作ってみたい



shin1roseiさん - カヤック流ソーシャルアプリの作り方 アプリ編


「ぼくらの甲子園!」「ぼくらの甲子園!熱闘編」を作っている

サイトの規模間
 mobageランキングに入るくらい(最高6位)

開発環境
 条件
  ローカルで開発できること
  本番環境に極力近いこと
  Perl・ライブラリのバージョン
  Gadgetサーバ
  APIへのアクセス

 APIClientの切り替え
 Moxy+OpenSocialPlugin
  Mobage対応。

利用ライブラリ
 WAF=Ark
 Template=Text::MicroTemplate
 ORM=DBIC

 DB関連
  ORMはDBIC、場合によってはDBI
  Shardingはしない
  Paritioningを駆使する

 DBIx::Class::Schema::Versioned
  SQL::Translatorでバージョン間のDiffを取れる

 DBIx::Class::Storage::DBI::Replicated
  透過的にMasterとSlaveの振り分け
  Moose依存
  DBIx::Class::Schema::Versionedとの併用はできない

 DBIx::Class::ResultSetのchain

 DBICを導入してみて
  SQLとORMの一元管理は必要
  情報が多い
  ソースがでかい
  SQLの発行タイミングを意識する必要がある

まとめ
 Perl初心者でもPerlでソーシャルアプリは作れる
 そこそこの規模であればDBICは十分使える
 Master-Slaveの透過的な振り分けなどを充実させて次はTengも挑戦したい
 Perlに慣れてきたのでいろいろやりたい



gfxさん - From Template-Toolkit2 to Xslate


3行で
 Xslateを開発
 TTからの違いはWikiに書きます。
 irc.perl.orgの#xslateへjoin!

テンプレートエンジン
 要するにでっかいsprintf

早速使いたい
 cpanmでOK


TT2 -> TTerse
 INCLUDEが裸のワードを受け付けない
  INCLUDE foo.ttの挙動
  意図的にやってます。

 FOREACH item = listが構文エラー
  むやみやたらにエイリアスを作らない。

 INCLUDE file WITH param1 = value ... でWITHが必須。
  省略は良しとしない方向で。

 関数・メソッドでスカラーコンテキスト強制

 マクロがレキシカルスコープ
  INCLUDEでマクロを取り込みたい
   優先順位高めで実装予定

 WRAPPERの微妙な違い
  未確認。

 エンコーディング関係
  stashにはdecoded-UTF8で渡すべき。

 エスケープ関連
  mark_law()を使えばエスケープしない。
   危ないところにしるしをつける意味が。
   多用はオススメできません

Kolonもあります
 Perl6ライクな構文。
 オススメ

日本語ドキュメント
 wikiで編集中

まとめ
 わからないところがあったらMLにPOST!
  日本語でOK

LT


sugyanさん - 記号PerlでFizzBuzz


FizzBuzz
 "FizzBuzz"の形をしたFizzBuzz

1分でわかる記号プログラミング
 拡張正規表現
 XOR(排他的論理和)
 use Acme::EyeDrops

32種類記号がある
 もっと少ない種類の記号では?
  いくつかは表現できない。
 "1"があれば全部表現できる
   HelloWorldも7種類の記号だけで!
    Acme::HeptaSymbolizeというモジュールにまとめた
    鋭意開発中

xaicronさん - いまつくったモジュールの紹介


ツイッターとかで マジレス -> mjrs
 Acme::Mjrs?じゃなくてAcme::Shiin

Yokohama.pmではIRCで何かするのがきまりらしい
 IRCにBOTを放流

本当はmjrs->マジレスにしたかった

nekokakさん - DBIx::Handler


DBIx::Handlerをつくった
 DBIx::Connetorに無駄が多かったので自前実装。
 txn()
 txn_scope()
 result_class()
 trace_query(1)

思うところ
 ORM使う場合はDBコネクション周り等の面倒見てくれる

Teng
 開発再開
 アドベントカレンダーやります

Spring_MTさん - Anaを開発してみました


毎回
 Getopt::Longの使い方を調べたりしてる

そこでAna
 毎回スクリプトにoptionハンドリングをかかないようにする

使い方
 ana test.pl --test

まとめ
 Input Outputのバリエーションを増やしたい
 テストがまだたりない

clouderさん Plack on SL4A


Scripting Layer for Android
 AndroidでPerlを動かせる

今回はPlackをいれてみた
 
Android SDKをつかってapkをインストール。
 Interpretersを選ぶ
 Perlをインストール
 Perlが動く
 hello_world.plを動かす→トーストが表示される

Plackを入れる
 Android端末のSDカードをPCにマウントして、関連モジュールのみをインストール

Android端末にスクリプトを転送する

Start Server for run
 起動できた!

まとめ
 XS系はmake大変
 キャリアの制限でグローバルに出れない
 Perlで動くのが魅力

ikebeさん - Titaniumで色々捗るぞ


Titaniumを使ってアプリを作った話

AKB48の話w

AKBまとめというiPhoneアプリ

仕組み
 サーバでクローラーが収集
 本文から画像URLを取得
 JSONにして再配信

サーバサイド
 せいぜい100ブログくらいをクロール
 Coro::Select+Furlで皿tt

Titanium
 APIたたく系には強い
 XHRとJSON
 SQLiteもさくっと。
 Androidまでカバーする夢は見ないほうが。

まとめ
 Titanium使えばWeb脳でもアプリ作れますよ!

bayashiさん - Detect User-Agent


UserAgent
 クライアントについて色々わかる
 偽装できる

使ってますよね
 集計とか
 ある程度信頼できる

UAの管理は大変

どんどん変化する
 一様にParseできない
 出たとこ勝負

俺たちにはCPANがある!

Detect側も変化に対応しなければいけない
 常にアクセスを受け付けて状況を把握するためのサイト
 モジュールの構成やテストを複数人で維持

HTTP::UADetector
 明日くらいにPush

typesterさん - Perl道場の紹介


Perl道場
 オンラインでPerlの問題を受けられる
 ソースがgithubで公開されている
 良問・難問ランキングが見れる

2011-11-16

[perl]perlbrewな環境下でImage::Magickを使いたくなったのでセットアップしたというお話

「Imagerじゃないとかマジウケるんですけどw」的なツッコミは予測済みですが、Webサービスに組み込む機能として、PDF→JPEGな変換を行うのに、もっともスマートな方法としてImage::Magick(=PerlMagick)しか見つけられなかったのです。もっといい方法あったら教えてください!

まずはimagemagickをインストール

で、PerlMagick使うためにはホストにimagemagickが入ってないといけないんですけど、これをroot権限で入れるのは別に難しくない。のですが、perlbrewな環境となると、root権限?何それおいしいの?状態なので、今回は$HOME/local 以下にimagemagickをインストールする方法をとります。

$ mkdir $HOME/local
$ mkdir $HOME/src
$ cd $HOME/src
$ wget ftp://ftp.kddlabs.co.jp/graphics/ImageMagick/ImageMagick-6.7.3-6.tar.gz
$ tar zxvf ImageMagick-6.7.3-6.tar.gz
$ cd ImageMagick-6.7.3-6
### prefixは必須、そのほかお好みでオプションつけてください
$ ./configure --prefix $HOME/local/imagemagick 
$ make
$ make install

ここまでできれば、$HOME/local/imagemagick/bin 以下にconvertなどのimagemagickのコマンド群が配置され、
$ $HOME/local/imagemagick/bin/convert foo.pdf bar-%03d.jpg
みたいにPDF→JPEG変換ができるようになると思います。

PerlMagickのインストール


本当ならここで、
$ cpanm Image::Magick

とかできればいいんですけど、これやってみたらここに書いてあるような現象に見舞われました。
なので、ソースディレクトリの下にあるPerlMagickをインストールすることにします。
$ cd ./PerlMagick
$ perl Makefile.PL
$ make 
$ make test
$ make install

最後のmake installの時に
Files found in blib/arch: installing files in blib/lib into architecture dependent library tree
Installing /home/ytnobody/perl5/perlbrew/perls/perl-5.12.3/lib/site_perl/5.12.3/x86_64-linux/auto/Image/Magick/Magick.so
Installing /home/ytnobody/perl5/perlbrew/perls/perl-5.12.3/lib/site_perl/5.12.3/x86_64-linux/auto/Image/Magick/Magick.bs
Installing /home/ytnobody/perl5/perlbrew/perls/perl-5.12.3/lib/site_perl/5.12.3/x86_64-linux/auto/Image/Magick/autosplit.ix
Installing /home/ytnobody/perl5/perlbrew/perls/perl-5.12.3/lib/site_perl/5.12.3/x86_64-linux/Image/Magick.pm
Installing /home/ytnobody/perl5/perlbrew/perls/perl-5.12.3/man/man3/Image::Magick.3
Appending installation info to /home/ytnobody/perl5/perlbrew/perls/perl-5.12.3/lib/5.12.3/x86_64-linux/perllocal.pod
みたいに出てくれば、インストール完了です。

PerlでPDF→JPEG変換してみよう

とりあえず小さく書いてみました。
use strict;
use Image::Magick;

my $i = Image::Magick->new;

$i->Read( $ARGV[0] );
$i->Write( 'output-%03d.jpg' );

で、実際にPDFをJPEGにするときは、
$ perl ./imager.pl hachiojipm_10_LT_ytnobody.pdf
とかすると、こんな具合に
$ ls -l *.jpg
-rw-rw-r-- 1 ytnobody ytnobody 17787 11月 16 15:31 output-000.jpg
-rw-rw-r-- 1 ytnobody ytnobody  3362 11月 16 15:31 output-001.jpg
-rw-rw-r-- 1 ytnobody ytnobody  5223 11月 16 15:31 output-002.jpg
-rw-rw-r-- 1 ytnobody ytnobody 12139 11月 16 15:31 output-003.jpg
-rw-rw-r-- 1 ytnobody ytnobody 13849 11月 16 15:31 output-004.jpg
-rw-rw-r-- 1 ytnobody ytnobody 32502 11月 16 15:31 output-005.jpg
-rw-rw-r-- 1 ytnobody ytnobody 39353 11月 16 15:31 output-006.jpg
-rw-rw-r-- 1 ytnobody ytnobody 14955 11月 16 15:31 output-007.jpg
-rw-rw-r-- 1 ytnobody ytnobody 46003 11月 16 15:31 output-008.jpg
-rw-rw-r-- 1 ytnobody ytnobody 34576 11月 16 15:31 output-009.jpg
-rw-rw-r-- 1 ytnobody ytnobody  5327 11月 16 15:31 output-010.jpg
-rw-rw-r-- 1 ytnobody ytnobody 15200 11月 16 15:31 output-011.jpg
-rw-rw-r-- 1 ytnobody ytnobody 10807 11月 16 15:31 output-012.jpg
-rw-rw-r-- 1 ytnobody ytnobody  7135 11月 16 15:31 output-013.jpg
-rw-rw-r-- 1 ytnobody ytnobody 12210 11月 16 15:31 output-014.jpg
-rw-rw-r-- 1 ytnobody ytnobody  7920 11月 16 15:31 output-015.jpg
-rw-rw-r-- 1 ytnobody ytnobody  7375 11月 16 15:31 output-016.jpg
-rw-rw-r-- 1 ytnobody ytnobody  8818 11月 16 15:31 output-017.jpg
-rw-rw-r-- 1 ytnobody ytnobody  8524 11月 16 15:31 output-018.jpg
-rw-rw-r-- 1 ytnobody ytnobody  7237 11月 16 15:31 output-019.jpg
-rw-rw-r-- 1 ytnobody ytnobody 11853 11月 16 15:31 output-020.jpg
-rw-rw-r-- 1 ytnobody ytnobody  6681 11月 16 15:31 output-021.jpg
-rw-rw-r-- 1 ytnobody ytnobody  6142 11月 16 15:31 output-022.jpg
-rw-rw-r-- 1 ytnobody ytnobody  6012 11月 16 15:31 output-023.jpg
-rw-rw-r-- 1 ytnobody ytnobody 44886 11月 16 15:31 output-024.jpg
-rw-rw-r-- 1 ytnobody ytnobody  5473 11月 16 15:31 output-025.jpg
-rw-rw-r-- 1 ytnobody ytnobody  3592 11月 16 15:31 output-026.jpg
-rw-rw-r-- 1 ytnobody ytnobody  3880 11月 16 15:31 output-027.jpg
-rw-rw-r-- 1 ytnobody ytnobody 27537 11月 16 15:31 output-028.jpg
-rw-rw-r-- 1 ytnobody ytnobody  9094 11月 16 15:31 output-029.jpg
-rw-rw-r-- 1 ytnobody ytnobody 13211 11月 16 15:31 output-030.jpg
-rw-rw-r-- 1 ytnobody ytnobody 45757 11月 16 15:31 output-031.jpg
-rw-rw-r-- 1 ytnobody ytnobody  7093 11月 16 15:31 output-032.jpg
-rw-rw-r-- 1 ytnobody ytnobody 49141 11月 16 15:31 output-033.jpg
-rw-rw-r-- 1 ytnobody ytnobody 35089 11月 16 15:31 output-034.jpg
画像ファイルがボコボコ出来上がります。まあ当たり前ですねw

2011-10-30

[Perl]Hachioji.pm #10

10/29(土)、11回目の開催となるHachioji.pmに参加してきました。


初参加の方がたくさん!


会場となったペルー料理専門店MISKYは Hachioji.pm では2回目の利用。こちらのお店では、ソーセージやらパスタやらチキンステーキやらを心行くまで堪能できます。また、テーブルに配られる3種類のディップソースがあるのですが、これがまたスパイシーでおいしいです!

今回は初参加の方が多かったので、まずは自己紹介から始まり、その後飲んだ食ったをしながら技術的な話やら世間話で場の雰囲気をほぐしていく流れとなりました。まあこういう所はHachioji.pm式ですね。そして、ご近所トークで盛り上がったり出来るところもまた、地方pm(?)ならではの醍醐味でしょう。個人的に@ktatさん(こちらの記事の著者)とお話できたのは非常に感慨深かったです。

LT


で、いい感じにアルコールが回ってきたところでLT。テーマは「ぼくがかんがえたさいきょうの○○」でした。参加人数が16名ということもあり、もうこれはまともにまとめるのは無理だろうと判断し、完全に聞き&質問に徹していました。その中で「ささった」内容をピックアップ。

- @hondallicaさん作Hachioji.pmのAndroid-app。「Titanium mobileで3時間くらいかけて作った」そうですが、そんなに短時間で出来るものなのか!と素直に感心しました。@ktatさんのandroid端末で動作する様子を拝見しましたが、過去の参加者一覧が手軽に見れるのはなかなかいいかも。でもなんでIDEOSではマーケットで検索しても出てこないのかしら><

- @uzullaさんはATND的イベントサービスの発表をしていましたが、「正直ATNDは楽しくない」とのこと。参加者も主催も楽しくなれる、そんなサービスに期待。

- @hide_o_55さんの作ったさいきょうのAcmeモジュール。
Acme::ChuckNorrisExceptions(って名前であってたかしら?w)。
「例外を投げる?否、チャック・ノリスがお前を投げる!」
ソヴィエトロシア的倒置法が効いていて楽しそう!

- @yellow844さんのブラック経歴トークでの名言。
あるSE曰く「うちAjaxできませんよtomcatはいってませんから」
- @maka2_donzokoさんのかんがえたさいきょうのLT


紙の強度的に最強だそうで。。。「どうぞ今のうちに撮影してください!」って、気分はもはやモデルですか?w

自分のLTはYAPCでイベントレポーターしてきたよって話を交えて、最強のレポーターについて高橋メソッドで発表してきました。(資料こちら
あんまり技術的なトークするのが得意じゃないので、次回はもう少し技術よりのお話にしたいなとか思ってたりしてます。

次回

12/3(土) 18:00より町田で開催します!(ATNDこちら
残り参加枠がかなり少ないですが、参加したいという方はぜひお越しください。

2011-10-16

[Perl]YAPC::Asiaにレポーターとして参加してきたよ!

去る10/14(金)と10/15(土)の2日間、東京工業大学大岡山キャンパスにてYAPC::Asia 2011が開催されました。

既に前回の記事でおさわり程度には書いたのですが、今年はgihyo.jpのレポーターとして参加してきました。

gihyo.jpスペシャルレポート

そんなわけで、今年は当ブログでは去年のようなライブレポートはやりません。

その代わりに、レポーターとして参加した感想を少々。。。

レポーター楽しいです

騙してるように見えるかもしれませんが、間違いなく面白い。というのも、やはり人様のサイトに載せる原稿を(アルバイトとして)提供するわけですから、是が非でもメモをとる事になります。そうなると、漫然とトークを聞くのと比較して、鮮烈に記憶に残るのです。

レポーター大変です

ただ、大変なのも事実でして、以下のような流れで原稿を投稿することになるのですが、

  1. トークを聞きながらメモを取る
  2. メモをとりあえずアップする
  3. トークの合間を縫ってメモを清書する

このうち、1のメモ取りが大変だと思われがちですが、実はそうでもなくて、3の清書がなかなか大変。

清書が大変とはどういうことか

それは、書いたメモの内容を、トークの雰囲気が引き立つように圧縮する必要があるからです。
実際、メモのほうが細々とデティールを記録してあるのですが、それだと雰囲気を伝えるための記事としてはNGです。

レポーターをやるメリット

まず、レポーター枠で入場できますので、スピーカー同様チケットを買うことなくYAPCを楽しむことが出来ます。
そして、gihyo.jpを通して自分を売り込むことが出来ます。レポートの質が高ければ、すばらしい実績を残した事になりますよ!
最後に、アルバイトなのでお小遣いがもらえます。まあ、このあたりは正直あまり気にしなくてもチケット代が浮くのでそれで十分だとは思いますが。

来年のYAPC::Asiaレポーターは?

今年は僕と@hirataraさんの2名でレポートを行いました。正直2名は大変ですね!
そこで!「来年のレポーターやってもいいよ!」という方がいましたら、@ytnobodyまでご一報ください。たぶん僕以外にもう2名ほど集まってくれたら、来年も引き続きレポーターをやるかもしれません。もちろん、gihyo.jpさんがOKといってくれればですけどね!

2011-10-14

[Perl]YAPC::Asia開催!

10/14(金)と10/15(土)の2日間、東京工業大学大岡山キャンパスにてYAPC::Asia 2011が開催されます!

僕はgihyo.jpのレポーターとして参加していますので、派手なレギンスでノートPCに向かってるおっちゃんを見つけたら、声かけてください。もしかすると、飲み物をせがむかもしれません!


2011-10-04

[Perl]Hachioji.pm #9


ついに通算10回目を迎えたHachioji.pmに行ってきました。会場はHachioji.pmの聖地ことタイラーンナーさん。

今回の参加人数は10名。到着した人からシンハービールを頼み、手酌の気取らないスタイルでさくさくっと呑んでいました。
@elecineさんが当日飛び入りで参加。ご本人曰くDJしたりMarkupしたりだそうです。

Lightning Talk

Hachioji.pmのLTは銅鑼(=時間制限)なし・A4用紙1枚程度の非常にカジュアルなものです。
そんな超軽量LTではありますが、各々が持ち寄る内容は毎回よく出来たものだと関心してしまいます。

  • uzullaさん
    GroongaをSQLite的に使っているお話
    位置情報の使いでのよさ
    黙って起動に失敗するニクイやつ
    なんでかDB破損。
    色々とオフレコなお話
    オフレコ過ぎて詳細を忘れたw


  • _takeR14さん
    phpdoc
    perldoc for php
    perl製!Amon2使ってるらしい。
    オフラインかつCUIでphpのドキュメントを読みたい向きに


  • hide_o_55さん
    最近作ったもの2点
    node-murmurhash3
    ShipItJS
    • ShipIt for Node.js


  • umeyukiさん
    近況報告など
    転職活動をしているそうです


  • ytnobody
    こんなコミットメッセージを書いてほしい
    実は「こんなコミットメッセージは嫌だ」
    公私共に今まで色々なコミットログを見てきたけど、半分以上ガチであった話が元ネタ(全部じゃないよ)。
    資料こちら


  • ono_pmさん
    YAPC::Asia 2011タイムテーブル Chrome Extention
    chrome上でYAPC::Asiaのタイムテーブルを表示。
    レポジトリこちら


  • norry_gogoさん
    Hachioji.pmの円滑な運営のための提案
    幹事持ち回り制度
    会場の選定とLTテーマの設定が大変
    uzullaさん曰く「奥さんの一声がないと開催も怪しい」!?



  • equinox79さん
    perlbrew + cpanm + OrePAN
    cpanm --save-distsの偉大さ
    OrePANによるDarkPAN管理
    perlbrewによる特定バージョンのperlインストール
    ポータブルなアプリケーションの実現


  • maka2_donzokoさん
    Perl Monger Training Card Game - Parumon
    CPAN Modulesを駆使し、迫りくる納期と戦うデスマーチ開発者体験カードゲーム
    YAPC::Asia 2011で発売
    プロトタイプで遊びました!
    Try::Tiny, DBI, Test::More, OrePANが偉い! ペアプロ超重要! 新入りは大抵納期に押しつぶされるのが生々しいです><




ご満悦のumeyukiさん

主催のuzullaさん、ご多忙な中でのセッティング本当にお疲れ様でした。

Hachioji.pm in machida !?

解散して少ししてから、こんなつぶやきが。。。


hirataraいつか町田で  やらないかなあ。

それを聞いて我らが主催の一言。


uzullahachiojipm 町田で「やればいいじゃない!」
なんと!町田でや ら な い か ですって><
うひょー!

2011-09-03

[Perl]dotcloudにPSGIアプリを上げてみた

しばらく放置気味だったブログも久々に更新。

さて、夏バテ気味の僕もついにあのdotcloudに入門してみました。

作業するための環境を用意する

今回は作業環境にさくらVPS(CentOS5.5)を使うことにしました。理由は聞かないで。

python2.6とeazy_install, pipを入れる必要があるらしい

こちらの記事を参考に、素直にrootでpython2.6などをビルド&インストールしました。

補足としては、先のブログの「インストール」のところにあるコードスニペットの7行目
zlib zlibmodule.c -I$(prefix)/include -L$(exec_prefix)/lib -lz
ここは、「こういう行が Modules/Setup の中でコメントアウトされているから、それをコメントインしなさいね」の意であるようです。

ちなみにこのステップをpythonbrewを使って楽することも出来るってすごい人から教えてもらいました。すげー!

dotcloud コマンドラインツールをインストール

どう見ても
# easy_install-2.6 dotcloud
これだけでした。本当にありがとうございました。

一般ユーザ権限でpython2.6を使えるように設定

先のブログにも書いてますけど、$HOME/.bashrcに以下を追記すればOKです。
PATH=$PATH:/usr/local/python/bin
alias python='python2.6'

アプリケーションをdotcloudに登録する

デプロイの準備としてアプリケーション名をdotcloudに教える必要があるので、アプリケーション登録をします。
$ dotcloud create [App-Name]
[App-Name]には半角英字4文字以上でアプリケーション名を入れてあげましょう。
初回起動時に限り、dotcloudのapi-keyを聞かれますので、このあたりでコピーし、ターミナルに貼り付けてやればいいです。

PSGIアプリをこさえてUPする

このあたりにグッドでナイスなドキュメントがありますが、重要なのはdotcloud.ymlという設定ファイルと、アプリのファイル構造です。
とはいえ、本当にスッカスカの状態のアプリを作って上げないことには基本がわかりにくい気もするので、スッカスカアプリ(ハローワールド)を仕立てていきます。

アプリのディレクトリを作る

そのまんまです。好きな名前のディレクトリ名でいいでしょう。
$ mkdir myhello

アプリのルートディレクトリを作る

approotと呼ばれるディレクトリを用意する必要があります。さっき作ったディレクトリの直下に置くということさえ守れば、ディレクトリ名はなんでもOKです。
$ mkdir myhello/oreapp

dotcloud.ymlを書く

dotcloudにアプリを上げて適正に動作させるためには、dotcloud.ymlが不可欠です。とはいえ、非常にシンプルなので臆せずに。viなどのエディタで、先に作成したアプリのディレクトリ直下(approotと同列)にdotcloud.ymlを作りましょう。
www:
    type: perl
    approot: oreapp

app.psgiを書く

取り急ぎ以下のようなアプリを書いて、oreapp/app.psgi として保存します。
sub {
    [ 200, [ 'Contents-type' => 'text/html' ], [ 'All your vase are belong to ass' ] ]
}

デプロイする

dotcloudにアプリをデプロイします。
$ dotcloud push myhello ./myhello/

すると、rsyncで同期しているような表示がでてきて、ちょっとまっていると
2011-09-02 15:31:08 [api] All the services are ready. Beginning the build.
2011-09-02 15:31:08 [www.0] The build started
2011-09-02 15:31:09 [www.0] Fetched code revision rsync-1314977467.1
2011-09-02 15:31:11 [www.0] Reloading nginx configuration: nginx.
2011-09-02 15:31:13 [www.0] uwsgi: started
2011-09-02 15:31:14 [www.0] The build finished successfully
2011-09-02 15:31:14 [api] Deploy finished

Deployment finished. Your application is available at the following URLs
www: http://ytnobody-myhello.dotcloud.com/
みたいな感じの表示が出てきます。これでデプロイ終了です。
最後に表示されたURLにアクセスして、
All your vase are belong to ass
と表示されていれば無事にアプリが稼動しています。

perl on dotcloud に関するもっと良い情報

hachioji.pm常連のすごい人がまとめてるPerl on DotCloud まとめがいい感じです。

さいごに

途中から書くのだるくなっちゃって、テキトーな感じになりましたが、意外とdotcloudは難しくないぞ、ということを言いたかったのであります。

ついでに

こうなったらどうすればいいのでしょうか。どなたか教えてください><
Deployment for "ytnobody" triggered. Will be available in a few seconds.
2011-09-02 16:31:15 [api] Deploy ytnobody scheduled for revision=latest
2011-09-02 16:31:15 [api] Waiting for the build. (It may take a few minutes)
2011-09-02 16:31:15 [api] All the services are ready. Beginning the build.
2011-09-02 16:31:15 [www.0] The build started
2011-09-02 16:31:16 [www.0] Fetched code revision rsync-1314981073.92
2011-09-02 16:31:17 [www.0] --> Working on .
2011-09-02 16:31:17 [www.0] Configuring Ytnobody-Hello-0.01 ... OK
2011-09-02 16:31:17 [www.0] ==> Found dependencies: Pickles
2011-09-02 16:31:18 [www.0] --> Working on Pickles
2011-09-02 16:31:18 [www.0] Fetching http://search.cpan.org/CPAN/authors/id/D/DM/DMAKI/Pickles-0.08.tar.gz ... OK
2011-09-02 16:31:18 [www.0] Configuring Pickles-0.08 ... N/A
2011-09-02 16:31:18 [www.0] ! Configure failed for Pickles-0.08. See /home/dotcloud/.cpanm/build.log for details.
2011-09-02 16:31:18 [www.0] ! Bailing out the installation for Ytnobody-Hello-0.01. Retry with --prompt or --force.
2011-09-02 16:31:20 [www.0] Reloading nginx configuration: nginx.
2011-09-02 16:31:24 [www.0] uwsgi: stopped
2011-09-02 16:31:24 [www.0] uwsgi: ERROR (abnormal termination)
2011-09-02 16:31:24 [www.0] The build finished successfully
2011-09-02 16:31:24 [api] Deploy finished

調査の仕方というかsshログインの仕方がわかったのでメモ。
$ dotcloud ssh [appname].[servicename]

で、$HOME/.cpanm/build.logを漁ってみたところ、疑問は氷解。

    * Module::Install::AuthorTests;
    * Module::Install::TestTarget;

こいつらが足りなかったので、

$ cpanm Module::Install::AuthorTests Module::Install::TestTarget

としてから再度PicklesベースのアプリをデプロイしてやればOKでした。

2011-07-23

[Perl?]takao.mtにいってきた

正直へとへとなので

まともに記事を書く気力がありません!
そのかわり、こちらでアルバムを公開しておきました。
今回に関しては、レポートにならないですね><

感想だけ

山ビールうめえ!
まかまかさんへ
酔ーツごちそうさまでした!!!!

ちなみにこちらがhachioji.pmの記事。

2011-07-10

[Perl]Shibuya Perl Mongersテクニカルトーク#16 に行ってきた

7月6日(水)にmixiさんで開催されたShibuya Perl Mongersテクニカルトーク#16に参加してきました。

テーマは正規↑表現↓・・・///

__gfx__サンの発表で、正規表現が正規↑表現↓と発音されていたのを機に、休憩時間のあいだに「正規表現の正しい発音とは何か?」のような議論がアツく繰り広げられていました(おもに弾さんとか)。一歩間違えばgenital expressionsとも捉えられかねないです><!

さて、一応ではありますが、各発表ごとに概要と感想が入り混じったようなものをまとめてみました。
  • Dan the (Irr|R)egular Expressionist [by @dankogai]
    • 「まどか☆マギカ」ネタが随所に散りばめてあった
      • 原作見てないからほんのりとしかわからなかった;;アニメとかあまり見ないので。。。
      • 「すべての魔女を消し去りたい」?なら「s/魔女//g;」!命かけずにコードかけ!
        • これが言いたかっただけじゃないかと・・・w
    • 正規表現の使いすぎに注意
      • /(foo|bar)/は無駄。
        • /(a|b|c|d)/にかかるコストは/[abcd]/の4倍以上
          • ここで言うコストはCPUコストのことでOK?
      • 素手で変態的な正規表現書くくらいなら・・・
        • Regexp::Common使いましょう。
    • Regexp::Assembleをつかうと、複数パターンのRegexのうちどれにマッチしたか検出可能。
      • なんか色々多機能っぽいモジュールなので、PODを熟読すべし
    • 正規表現についてはPerlがルール。
      • つまりperlを通して身につけた正規表現の技は他言語でもだいたい通用する!

  • スペシャルゲスト「正規表現メモ」 [by 木村浩一さん]
    • 「正規表現メモ」は黒歴史。
      • 出版社から過去数度お声がかかったらしいが、結構ボツになった原稿も多数あったのだそう。
        • 当該サイトは初見だったけど、非常によくまとめられており、regexを深く掘り下げるに十分な教科書となり得ると思います。
    • [=e=]って何にマッチするか知ってますか?
      • "e"のほか、ёなどにもマッチ。
        • tclの正規表現です!
          • マイナーすぎてわからんとです!><
    • JPerl5.6
      • 幻?!
        • Perl5.6で追加された戻り読みによって、JPerl5.6は幻の存在となった。
    • 3種類の正規表現

  • Hello, re::engine! [by __gfx__]
    • この人のイントネーション「正規↑表現↓」が後々いろんなところに影響をもたらす。
    • Perlの正規↑表現↓エンジンはpluggable
    • 素数判定の正規↑表現↓
    • そしてトーク中にcommit
      • git commit -m "Update"
      • ちょ、お行儀www
      • 一同爆笑w
    • re::engine::OnigurumaはバックトラックしてもSEGVが発生しない
    • re::engine::boostは遅すぎて使いもんにならない
      • 正規表現のデバッグになら使えそうという声も。

  • 正規表現の限界 [by sinya8282]
    • 正規表現愛
    • いろいろなものを正規表現であらわしたい癖がある
    • 魔女ネタに憧れ・・・
    • とある否定の正規表現
      • 正規表現の否定は難しい
        • というか変態的
      • DFAにしてしまえば否定も簡単ですよ!
        • DFAの状態遷移図をスライドに載せまくり
          • DFA祭りではないですねw
          • 「皆さんは正規表現がみたいんですよね?」
        • regex->NFA->DFA->否定のDFA->GNFA->否定の正規表現
          • not /abc/ = /((a?|ab)|((([^a]|a[^b])|ab[^c])|abc.).*)/
            • ここでdankogaiによるキャプチャ使用についてのツッコミ。
    • とある再帰の正規表現
      • \Rをつかった再帰処理
        • 140文字以内の四則演算
          • 69回が再帰上限。
          • 約40ゼタ文字に相当。。。
            • あたまいたいです><
    そしてLT。
    • 僕の考えた最強の正規表現エンジン [by sinya8282]
      • とにかく速度重視!
      • 正規表現ジェネレータRegen
        • Xbyakで動的に最適化されたコードを生成

    • Plaggerで覚えたPerlの正規表現 [by yusukebe]
      • ヘアースタイル(モヒカン)は某有名人のオマージュ
      • エロサイト収集用YAMLの数々に正規表現
        • そういえばいまどきYAMLは無しだよなあと思いながら聞いていた。
          • Plaggerって5年くらい前のプロダクトだし仕方ない

    • Regexp::Assembleで正規表現を作るとか [by yappo]
      • 正規↑表現↓のイントネーションに苦戦した結果、本題に入る前に銅鑼。
        • ホントはGroongaの話をするつもりだったらしい。。。
        • 正規↑表現↓の被害を露骨に食らった例

    • 再帰的正規表現 [by takesako]
      • 再帰的正規表現を駆使してJSON Validatorを実装。
        • (?R)や?(DEFINE)がでてきた
        • 今回のLTでもっとも正統派???

    • 僕と契約して、自己言及コードになってよ! [by sugyan]
      • quine(自分のソースそのものを出力するだけのプログラム)がQBを出力し、それをさらにPerlにくわせてやるとQBがいろいろ喋り捲るというもの
        • 厳密に言うと出力->入力ごとに異なる結果が出力されるので、quineとはいえない。
      • もともとRubyで実装されたものをPerlに移植。

    • いろいろなものを正規に表現してみよう [by nipotan]
      • RegEx
        • 正規表現共有サイト
          • 非常にすばらしいコンセプト。
          • しかし、残念な正規表現が多い
      • 郵便番号、電話番号に*正しく*マッチングする正規表現
        • 電話番号についてはNumber::Phone::JPで
          • 正規表現そのものではえらく長大なものになる
          • 素手で書くのは狂気の沙汰なので、モジュール化
        • 郵便番号向けにNumber::ZipCode::JPをshipped
          • この辺のソースを見ればわかると思いますが、まさに正規↑表現↓の狂気に取り憑かれたようなコード。
          • MySQLに郵便番号マスタを持たせるより多少早いですよ!!

    ちなみに、直ぐ隣の大きい部屋でmixiさんのご好意で開かれた懇親会では、jcode.pl開発者の歌代和正氏による乾杯のご発声がありました。(かなり豪華な食事が出ました!mixi++)
    そして、なぜか同じテーブルに集うHachioji.pmの面々。ここまでくればある種、異様な集団ですねw


    歌代氏。あのjcode.pl開発者がついにEncode.pmを使って一言。
    「いいですねぇ、あれ。使いやすいです!」

    閉会後、会場に入れなかったmakamakaさんがビルの前で途方にくれていた(正しくはAcme大全2011を販売していた)ので、Hachioji.pmのメンバーが拍手で労ったのでした。
    最後にはmakamakaさんの胃袋を満たすべく、ミニHachioji.pmを急遽開催(といっても、ただ飲み食いしに行っただけですけど)。1日に2つのpmに参加するという無茶苦茶をやってのけたのでした。たのしかったー!!

    mixiうちわについて

    すでにshinpei_cmykさんが当日のうちに解説記事をかいてくれています。
    こういう書き方もできるのがperlの面白いところだと僕は思います。

    2011-06-26

    [Perl]Hachioji.pm #6

    先日開催のHachioji.pm #6に参加してきました。
    思い出したかのようにトイデジで写真を撮っておいたのですが、よくわからない状態のものばかりとなってしまいました。すみませんすみません><

    カレー食べながらネタトーク


    さて、今回のお店はカレー&ダイニング Very wellさん。
    夏バテ克服にカレーはもってこいのチョイスですね!

    今回はキャンセル5名ということもあって貸切下限の15名に届かず、急遽貸切をキャンセルせざるを得ない状況となってしまいました。それにも関わらず大いに盛り上がったのは、開始時刻前から到着したメンバーから順に早々と出来上がっていたところが大きいと思います。このいい感じのアバウトさ加減こそHachioji.pmメソッドですよ!


    定員を割りましたが、非常に盛り上がりました!

    各自、各々の近況やネタトーク(主にGANC教祖によるGANCネタ)で盛り上がっているところ、おもむろに(というより遅れて)makamakaさんの登場。
    皆で拍手で迎えるという当会合の恒例行事もきっちりと執り行われました。
    ちなみに彼はATNDで


    1. makamaka_at_donzokomakamaka_at_donzoko : 遅刻しない自信があります!
    などと宣言しているのですが、これは折るべくして作られたフラグなのでしょう。


    これがGANC神だ!!!!!! (by @shinpei_cmykさん)

    ちなみにネタトークで盛り上がっていて、すっかりカレーの写真を撮り忘れてしまいました><


    そしてこちらがGANC教祖の方


    二次会場へ移動

    すっかり酒の入りきった十数名の男たちが、これまたすっかり「聖地」となりつつある名店「タイラーンナー」の前で数分ほど待つことに。この日はお店がいつも以上の混雑振りだったようで、席が開くまで時間がかかったのです。


    ピンぼけちゃったけど、「聖地」巡礼を待つ男たちw

    タイ料理屋でLT



    おなじみの光景。みんなMac持ってますね

    今回のテーマは「省エネ・エコ」。非常に難しいテーマでした。
    LTのざくっとした内容を覚えている限り列挙します。

    umeyukiさん:東電の「おとくなナイト」について
    夜行性のあなたに。趣味のコーディング等は大抵夜間なので効果的か。

    mgikenさん:はじめてのGANCアプリ
    GANCでブログアプリを作ったというお話。
    投稿画面は未着手のため、記事作成はCouchDBの管理画面から行うという破天荒っぷり。

    ytnobody:バッドノウハウはエコの母
    2011年のエコなperl=正規表現!?タイトルと内容がかみ合っていない!
    (資料はこちら。※PDF注意)

    nekoyaさん:URI::Escape::XSでエコライフ
    おなじみURI::Escape。しかし意外と重い。そこでURI::Escape::XS!
    Mouseは比較的エコ。しかしMoose、テメーはだめだ

    okamuuuさん:knockout.js
    JavascriptのMVVMフレームワーク
    コード品質の画一化のためにもフレームワークは有用

    shinpei_cmykさん:運用に省コストを強いられる例
    ホスティングで困ること:ローカルネットワークに後からサーバ増設できない
    DBサーバのお引越しはどうしてるの?
    >リモートでレプリケーションをしましたよ!(by nekoyaさん)

    hide_o_55さん:PerlでGroongaをごにょごにょ
    GroongaのHTML-APIはローカルI/Fをバインドしているので、Perlでproxyっぽいことをするモジュール作った

    norry_gogoさん:バージョン管理・テスト自動化などでエコを目指す
    プログラマはすべからくエコである

    uzullaさん:UPSと車のバッテリで停電対策/cloud9でファミレスコーディング
    家にUPSが4つもある!
    ブラウザさえあればエディタ・gitレポジトリ操作が可能。デプロイもできるようになる予定。

    makamakaさん:ハイブリッド・エコLT
    物理的エコ→紙のLT資料を薄く・軽く・小さくする
    謎の紙片「さっきまでA4だった」LT資料???配布。
    LT資料じゃなくて「くじ」!
    「あたり」を引いた人にそれぞれ「エコ」「高尾山の天狗」についてLTしてもらうという無茶振りメソッドだった!

    次回は"Takao.mt"!

    次回のHachioji.pmは高尾山登山イベント"Takao.mt"です!ハッカソンやりたい人は各自企画してくださいとのことですので、そのつもりで!
    現地はWiMAXおよびEMobileが絶望的に使えないようです。もしかすると僕がcpanレポジトリのミラーを用意するかもしれません。気が向けば、ですが!
    7/23(土) 11:0014:00 京王線高尾山口駅前に集合です。

    2011-06-16

    [リアルライフ]ライブドアに入社しました

    2011/6/15をもちまして、株式会社ライブドアへ入社いたしました。
    これまで苦楽をともに歩んできた元同僚・上司へ、この場を借りて、改めてお礼申し上げます。

    今後も皆様より、従来と変わらぬご愛顧・ご指導を頂けますと大変幸甚でございます。

    どうぞ、よろしくお願いいたします。

    2011-05-31

    [Perl]Hachioji.pm #5

    5/28(土)に開催されたHachioji.pm #5に参加してきました。

    いつものことですが、このレポートは他の方に比べ24時間ほど出遅れています。
    ま、そんな事どうでもいいんですよ!そもそもレポートになってるか怪しいんだから!!

    なお、公式の開催レポートはこちら

    $stuff[0]->say( seat( expire => 7200 ) );

    開始直後、お店の方から「2時間制限」といわれたので、uzullaさん、急遽二次会をセッティング。
    まあ、こういうアクシデントもたまにはあるのでしょうけど、そこは八王子。すんなりと会場の確保ができた模様です。
    そんなわけでA4-LTは二次会で行うこととなりました。ほどなく、参加者全員が完全に「呑むぞ食うぞモード」に突入したのは言うまでもありません。


    「キャモーン!」「なにそのカメラww」

    一つ言える事としては、とにかく肉がうまかった!
    というのがあげられます!


    「まだ撮ってんのwww」「酒も肉もうまいっすー♪」

    いいじゃない、PICKみたいなトイデジカメだって!


    「なになに、撮るの?」「肉うまかったー♪」

    このころ僕はビール*3、まんこい(黒糖焼酎)ロック*3を飲み干しており、ただのヨッパライと化していました。


    この装置(煙吸い込むやつ)があるせいか、WiMAXをはじめモバイルの電波が弱かったです

    酩酊の靄の中で

    二次会は「タイラーンナー」でした。
    ※Hachioji.pm #3でお世話になったお店です。


    LT準備の光景。もはやApple信者の集まりにしか見えません。。。

    各々のLTのレポートはこちらこちらこちらなどでご確認いただけます。
    というのも酔っ払ってて、詳細を記憶できていないのです。。。

    個人的には、nekoyaさんのcobbler使ったサーバ管理(というか構築)のお話がフックしました。
    takeR14aさんのLTにあった「ALIX board」というPCも楽しそうでした。アプライアンス向けでしょうか。
    あと、らくがきライブってアプリを使うとJKとおともだちになれるかもしれないそうですね!

    ちなみに僕のLTですが、こちら(PDF)に資料をあげておきました。
    まあ内容がほとんどないのですけど。。。

    次回とか

    6/25(土)開催の予定だそうです。
    それから、mgikenさんは素敵なGANC教祖ですね!素敵すぎてツッコミがとまりませんでした><

    2011-05-26

    [Scala]Scala勉強会in秋葉原#35に行ってきた

    HelloWorldとxhtmlのパーシングあたりで止まってるScalaについてもう少し掘り下げるべく、Scala勉強会にお邪魔してきました。

    勉強会第35回 - Scala勉強会 in 渋谷

    発表について

    当日の発表はよしださんによる Scala2.9.0の新機能についての説明でした(資料)
    まあ僕は初学者ということもあって、正直なところ発表内容を深く理解できていない部分があるのですが、それでも基礎的な部分についてはおおむね理解できたつもりではあります。
    特にJavaプリミティブ型からScalaの各種型への自動的な変換(Auto-Unboxing for Java Boxed valuesのスライドのあたり)なんかは、「今までなかったのかよw」と心の中でツッコんでしまいました。

    質問タイム

    カリー化されたメソッドのオーバーライドについて、第2引数の型が異なるメソッドのオーバーライドを定義できるにも拘らず、メソッドのコール時に例外コンパイルエラーが発生してしまうのはなぜ?という質問があがりました。

    実際に試してみました。
    たとえば、こんな状態。
    scala> object X {
         |   def a( x:String )( y:String ){}
         |   def a( x:String )( y:Int ){}
         | }
    defined module X
    

    この状態でメソッドX.aをコールすると、例外コンパイルエラーが発生するということですが・・・
    scala> X.a( "hoge" )( 1 )
    :9: error: ambiguous reference to overloaded definition,
    both method a in object X of type (x: String)(y: Int)Unit
    and  method a in object X of type (x: String)(y: String)Unit
    match argument types (java.lang.String)
           X.a( "hoge" )( 1 )
             ^
    
    scala> X.a( "hoge" )( "fuga" )
    :9: error: ambiguous reference to overloaded definition,
    both method a in object X of type (x: String)(y: Int)Unit
    and  method a in object X of type (x: String)(y: String)Unit
    match argument types (java.lang.String)
           X.a( "hoge" )( "fuga" )
             ^
    
    たしかに例外コンパイルエラーが発生しました。しかも第2引数にInt、Stringの何れを与えてもこの現象が発生します。

    質疑応答の中での回答では、「Odersky曰く『仕様です』」とのことでした。


    xhtml関連の質問をしました

    じつは開会前に「xhtmlのパース/置き換えをするにはどうしたらよいか」という質問をしました。
    皆さんのご意見を聞く限りでは、どうやらjerichoというライブラリを使用するのがベターとのことでした。

    感想とか

    scala初学者でも十分に参考となる内容でした。ぼくの他にも数名初学者の方がいらしたのですが、むしろ初学者の方ほどこの勉強会に参加するメリットがあると思います。
    また、近々yuroyoroさん共著のscala本が出版されるそうです。こういった情報に関するアンテナを広げるという意味でも、今回の参加は意義深いものでした。

    2011/05/27 追記

    例外と表記されている箇所ですが、よしださんより「例外発生というより、あれはコンパイルエラーですね」とツッコミをいただき、「コンパイルエラー」と表記を改めました。

    2011-05-19

    [Linux]CentOS5.5にText::MeCabを入れるときのコツ

    原因

    mecabとmecab-ipadicを入れてるのに、
    /root/.cpanm/work/1294395897.25225/Text-MeCab-0.20011/assertlibeiKR8srG: error while loading shared libraries: libmecab.so.1: cannot open shared object file: No such file or directory
    /root/.cpanm/work/1294395897.25225/Text-MeCab-0.20011/assertlibEejMJieF: error while loading shared libraries: libmecab.so.1: cannot open shared object file: No such file or directory
    wrong result: 'mecab', 'mecab'
    
    とか言われてしまうことがあります。

    これについてはこちらの記事にわかりやすく書いてありますが、CentOSは初期設定だと/usr/local/libをライブラリの置き場所として認識していないためです。

    対処

    以下のコマンドを実行後、cpanmでText::MeCabを入れるといいです。
     # echo '/usr/local/lib' >> /etc/ld.so.conf
     # ldconfig
    

    2011-05-17

    [Linux]JS/Linuxでcronを動かす

    巷で話題のJS/Linuxですが、そのままではcrondが動いてないから、cronエントリを書いてもまともに動きません。

    だから、
    # crond -b
    
    などとしてcrondを動かしてやり、
    # crontab -e 
    
    でcronエントリを追加すると、正常に動作します。

    2011-05-10

    [Perl]Data::Model::Driver::MongoDBというものをかいた

    MongoDBをData::ModelのDriverとして使うためのモジュールをかいたので、githubにあげました。
    http://github.com/ytnobody/Data-Model-Driver-MongoDB

    使い方

    githubにも書いてる通りですけど、こんな感じで使います。
    use Data::Model::Driver::MongoDB;
    my $mongo_db = Data::Model::Driver::MongoDB->new(
      host => 'localhost',
      db => 'my_database',
    );
    my $schema = Oreore::Schema->new;
    $schema->set_base_driver( $mongo_db );
    
    これでData::Modelのインターフェースに則ってデータの差し込みや更新、読み込み等が出来るようになります。

    普通のドライバと異なる箇所

    ほとんどMongoDBの仕様(?)に由来するものばかりです。
    まず、setするときに自分で主キー値(idとかそういうの)を設定する必要がなくかつ、主キー値の変更ができません。
    また、D::Mではデータを取得するget()において、絞り込み条件設定に"where"をつかうのですが、D::M::D::MongoDBでは、
    my @rows = $schema->get( book => {
      where => [
        price => { '<' => 1000 },
      ],
    );
    
    などのような、不等号などを用いた範囲検索ができません。

    2011-04-28

    [Linux]ユーザ権限でsvscanbootを立ち上げて色々exportする手間を省く

    何が嬉しいか

    僕がやっている限りですが、perlbrew環境でもdaemontoolsのrunファイルで色々exportしなくても意図した通りにアプリケーションが動作してくれる、という点が挙げられます。

    設定

    例えば$HOME/service/myappとかつくって、PSGI-appをdaemontoolsで常駐させたい場合。

    $HOME/.bashrcに1個exportを追記する

    以下の行を追記しておく。
    export PATH=$HOME/bin:$PATH
    
    書いたら、一旦ログインし直す。

    $HOME/以下に必要なディレクトリを用意する

    ~$ mkdir -p ~/service ~/bin ~/myapp/log
    

    ユーザ用のsvscanbootを作る


    $HOME/bin/svscanboot

    #!/bin/sh
    
    svscan $HOME/service 2>&1 | \
      readproctitle $HOME/service errors: ................................................................................................................................................................................................................................................................................................................................................................................................................ 
    

    runファイルを作る


    $HOME/service/myapp/run

    #!/bin/sh
    exec 2>&1
    start_server --port=6000 -- plackup -L Shotgun -s Starlet ~/psgi/myapp/myapp.psgi
    

    $HOME/service/myapp/log/run

    #!/bin/sh
    exec 2>&1
    exec multilog t ~/myapp/log
    

    サービスをdaemontoolsに登録する

    ~$ mv ~/myapp ~/service/ -v
    

    svscanbootを起動する

    ~$ svscanboot &
    [1] 13787
    
    プロセス番号(ここでは13787)を控えておき、これをdisownする。
    ~$ disown 13787
    

    ps axfhでプロセスを見ると、大体こんな感じになってると思います。

    ~$ ps axfh
      :
      :
     省略
      :
      :
    13787 ?        S      0:00 /bin/sh /home/ytnobody/bin/svscanboot
    13788 ?        S      0:00  \_ svscan /home/ytnobody/service
    17896 ?        S      0:00  |   \_ supervise api
    19351 ?        S      0:00  |   |   \_ /bin/sh ./run
    19352 ?        S      0:00  |   |       \_ /home/ytnobody/perl5/perlbrew/perls/perl-5.12.3/bin/perl /home/ytnobody/perl5/perlbrew/perls/current/bin/start_server --port=6000 -- plackup -L Shotgun -s Starl
    19353 ?        S      0:00  |   |           \_ /home/ytnobody/perl5/perlbrew/perls/perl-5.12.3/bin/perl /home/ytnobody/perl5/perlbrew/perls/current/bin/plackup -L Shotgun -s Starlet /home/ytnobody/myapp
    19354 ?        S      0:00  |   |               \_ /home/ytnobody/perl5/perlbrew/perls/perl-5.12.3/bin/perl /home/ytnobody/perl5/perlbrew/perls/current/bin/plackup -L Shotgun -s Starlet /home/ytnobody/my
    19355 ?        S      0:00  |   |               \_ /home/ytnobody/perl5/perlbrew/perls/perl-5.12.3/bin/perl /home/ytnobody/perl5/perlbrew/perls/current/bin/plackup -L Shotgun -s Starlet /home/ytnobody/my
    19356 ?        S      0:00  |   |               \_ /home/ytnobody/perl5/perlbrew/perls/perl-5.12.3/bin/perl /home/ytnobody/perl5/perlbrew/perls/current/bin/plackup -L Shotgun -s Starlet /home/ytnobody/my
    19357 ?        S      0:00  |   |               \_ /home/ytnobody/perl5/perlbrew/perls/perl-5.12.3/bin/perl /home/ytnobody/perl5/perlbrew/perls/current/bin/plackup -L Shotgun -s Starlet /home/ytnobody/my
    19358 ?        S      0:00  |   |               \_ /home/ytnobody/perl5/perlbrew/perls/perl-5.12.3/bin/perl /home/ytnobody/perl5/perlbrew/perls/current/bin/plackup -L Shotgun -s Starlet /home/ytnobody/my
    19359 ?        S      0:00  |   |               \_ /home/ytnobody/perl5/perlbrew/perls/perl-5.12.3/bin/perl /home/ytnobody/perl5/perlbrew/perls/current/bin/plackup -L Shotgun -s Starlet /home/ytnobody/my
    19360 ?        S      0:00  |   |               \_ /home/ytnobody/perl5/perlbrew/perls/perl-5.12.3/bin/perl /home/ytnobody/perl5/perlbrew/perls/current/bin/plackup -L Shotgun -s Starlet /home/ytnobody/my
    19361 ?        S      0:00  |   |               \_ /home/ytnobody/perl5/perlbrew/perls/perl-5.12.3/bin/perl /home/ytnobody/perl5/perlbrew/perls/current/bin/plackup -L Shotgun -s Starlet /home/ytnobody/my
    19362 ?        S      0:00  |   |               \_ /home/ytnobody/perl5/perlbrew/perls/perl-5.12.3/bin/perl /home/ytnobody/perl5/perlbrew/perls/current/bin/plackup -L Shotgun -s Starlet /home/ytnobody/my
    19363 ?        S      0:00  |   |               \_ /home/ytnobody/perl5/perlbrew/perls/perl-5.12.3/bin/perl /home/ytnobody/perl5/perlbrew/perls/current/bin/plackup -L Shotgun -s Starlet /home/ytnobody/my
    17897 ?        S      0:00  |   \_ supervise log
    17900 ?        S      0:00  |       \_ multilog t /home/ytnobody/myapp/log
    /home/ytnobody/src/mongodb/data/db --nohttpinterface
      :
      :
     省略
      :
      :
    

    2011-04-27

    [Nginx]フォワードプロキシを構築する

    ここを参考に、俗に言う串をNginxで構築しました。

    nginx.conf

    http {
    
        ### google DNS
        resolver 8.8.8.8;
    
        server {
            listen 80;
            server_name proxy.mydomain.net;
            location / {
                proxy_pass $scheme://$http_host$request_uri;
            }
        }
    
    }
    

    schemeとhttp_host,requet_uriを使いまわすのがポイントですね。

    2011/5/16 追記
    httpsについては、このフォワードプロキシを通すことで、まともにアクセスできなくなる可能性があります。

    2011-04-26

    [Perl]Hachioji.pm #4

    4/23(土)に開催されたHachioji.pm #4に参加してきました!

    ぼくが記事を書く頃には大体いつも、皆さんきっちりと記事を書いてくれてますので、僕は雰囲気を伝える方向に専念できます><

    ひどい雨にもかかわらず・・・

    当日はかなりどしゃ降りの雨だったのですが、なんとATNDで参加表明していた13名が全員参加。さすがHachioji.pm、毎度のことながら出席率の高さがハンパ無いです。

    Hachioji.pm =~ Gourmet.pm ???

    さて、これまでのHachioji.pm開催会場となったお店を振り返ってみますと・・・(※以下、ATNDへのリンク)
    #0 会場 八王子駅南口 あじこ家(沖縄料理)
    #1 会場 魚米 八王子店(海鮮料理)
    #2 会場 八王子北口 多熱食房(中華料理)
    #3 会場 タイ料理レストラン タイラーンナー(タイ料理)
    ・・・と、かなりグルメな選定となっています。uzullaさんのチョイスが光っているのが良くわかりますね!
    そして、今回の会場は南米ペルー料理 MISKY(ペルー料理)。もう八王子だけで世界の料理が堪能できそうな勢いですね!

    「makamakaさんが登場したら拍手で迎えてください!」

    これはHachioji.pmでの恒例儀式のようなものですね!makamakaさんはお仕事の都合もあって遅刻せざるを得ないのですが、そんな彼を労うべく(?)皆で大きな拍手で迎えましたw
    「到着おめでとうございます!」
    雨ということもあって、心なしかmakamakaさんの顔に疲れの表情が見え隠れしていたようにも見えましたけどね!><

    ustreamもリアルタイムつぶやきもない

    そりゃあそうです。だって、みんな呑んで食ってしてるんですものw

    まったりした空気の中で恒例のA4-LT

    飲み食いしてるので、みなさんそりゃあもうまったりしてました。そんな中LTが執り行われたわけですが、掻い摘んで印象に残ったものについて取りあげます。
    今回のテーマは「最近作ったもの or GW中につくりたい物」です。

    GANCってなんだーーーーー!!!

    まず印象に残ったのがmgikenさんの「LAMPではなくGANC」のお話でした。Gentoo(Linux), Arc(関数型プログラミング言語), Nginx(Webサーバ), CouchDB(NOSQLデータストア)の頭文字を取って「GANC(がんく)」だそうです。
    Gentoo、Arcあたりの話をすると、たいていの人はその先の話を聞いてくれなくなるそうなので、今回はCouchDBのViewサーバをArcでつくったよ!という話に的を絞ってました。

    Dropboxでblogを管理

    su_askaさんの「Dropboxでblog/wikiを管理する」お話。「Perl MongerなのにPukiwikiやWordPress使ってるのはおかしいだろう」という信念から、DropboxにMarkdownファイルを置いてblogとwikiを更新するようにしたというのですが、管理ツールいらずという謳い文句が琴線に触れるものがあります。

    ハリセンメソッド

    サブタイトル見ただけで誰のLTなのかある程度想像できる人もいると思いますが、「期待を裏切らない男」makamakaさんによる斬新なプレゼン手法です!


    これはequinox79さんによる撮影ですが、これを見てLTの資料だと思う人はそう多くはないでしょう。

    最近作ったサービスについて発表しました

    ぼくの発表では、個人的な欲求に則って作ったサービス「dossug」について話しました。
    LT資料はこちら

    2011-04-22

    [Perl]Test-WWW-Mechanize-1.30のテストがこける

    こんな風にこけました@perl-5.12.3
    ~/$ cpanm Test::WWW::Mechanize
    --> Working on Test::WWW::Mechanize
    Fetching http://search.cpan.org/CPAN/authors/id/P/PE/PETDANCE/Test-WWW-Mechanize-1.30.tar.gz ... OK
    Configuring Test-WWW-Mechanize-1.30 ... OK
    ==> Found dependencies: Test::LongString, WWW::Mechanize, HTML::TreeBuilder, HTTP::Server::Simple, Carp::Assert::More, HTTP::Server::Simple::CGI
    --> Working on Test::LongString
    Fetching http://search.cpan.org/CPAN/authors/id/R/RG/RGARCIA/Test-LongString-0.15.tar.gz ... OK
    Configuring Test-LongString-0.15 ... OK
    Building and testing Test-LongString-0.15 ... OK
    Successfully installed Test-LongString-0.15
    --> Working on WWW::Mechanize
    Fetching http://search.cpan.org/CPAN/authors/id/J/JE/JESSE/WWW-Mechanize-1.68.tar.gz ... OK
    Configuring WWW-Mechanize-1.68 ... OK
    ==> Found dependencies: HTML::TreeBuilder, HTTP::Server::Simple, HTTP::Server::Simple::CGI
    --> Working on HTML::TreeBuilder
    Fetching http://search.cpan.org/CPAN/authors/id/J/JF/JFEARN/HTML-Tree-4.2.tar.gz ... OK
    Configuring HTML-Tree-4.2 ... OK
    Building and testing HTML-Tree-4.2 ... OK
    Successfully installed HTML-Tree-4.2
    --> Working on HTTP::Server::Simple
    Fetching http://search.cpan.org/CPAN/authors/id/J/JE/JESSE/HTTP-Server-Simple-0.44.tar.gz ... OK
    Configuring HTTP-Server-Simple-0.44 ... OK
    Building and testing HTTP-Server-Simple-0.44 ... OK
    Successfully installed HTTP-Server-Simple-0.44
    Building and testing WWW-Mechanize-1.68 ... OK
    Successfully installed WWW-Mechanize-1.68
    --> Working on Carp::Assert::More
    Fetching http://search.cpan.org/CPAN/authors/id/P/PE/PETDANCE/Carp-Assert-More-1.12.tar.gz ... OK
    Configuring Carp-Assert-More-1.12 ... OK
    Building and testing Carp-Assert-More-1.12 ... OK
    Successfully installed Carp-Assert-More-1.12
    Building and testing Test-WWW-Mechanize-1.30 ... FAIL
    ! Installing Test::WWW::Mechanize failed. See /home/ytnobody/.cpanm/build.log for details.
    

    で、ここ見る限り、Test-LongString-0.15がダメっぽいので、Test-LongString-0.14をいれてからT::W::Mech入れればいいっぽいです。

    ~/$ cpanm http://search.cpan.org/CPAN/authors/id/R/RG/RGARCIA/Test-LongString-0.14.tar.gz
    --> Working on http://search.cpan.org/CPAN/authors/id/R/RG/RGARCIA/Test-LongString-0.14.tar.gz
    Fetching http://search.cpan.org/CPAN/authors/id/R/RG/RGARCIA/Test-LongString-0.14.tar.gz ... OK
    Configuring Test-LongString-0.14 ... OK
    Building and testing Test-LongString-0.14 ... OK
    Successfully installed Test-LongString-0.14
    ~/$ cpanm Test::WWW::Mechanize
    --> Working on Test::WWW::Mechanize
    Fetching http://search.cpan.org/CPAN/authors/id/P/PE/PETDANCE/Test-WWW-Mechanize-1.30.tar.gz ... OK
    Configuring Test-WWW-Mechanize-1.30 ... OK
    Building and testing Test-WWW-Mechanize-1.30 ... OK
    Successfully installed Test-WWW-Mechanize-1.30
    

    追記
    どうやら、これ以外の原因でコケる場合もある模様。
    とりあえずCPANRTではなくgoogle codeにて不具合等を管理しているようなので、そちらもご参照を。

    2011-04-19

    [Linux]Titanium Mobile 1.2.2をUbuntu10.10-i386に入れた

    基本的な手順としては、こちらのサイトの通りに進めました。
    しかし、Titanium Developerの起動時の手順で問題が発生。以下の様な手順で問題を回避しました。

    Titanium Developerのディレクトリのリネーム

    これをやらないと、まともに起動できません。
    ~$ mv Titanium\ Developer-1.2.2/ ~/.titanium
    

    runtime以下に各種同梱ライブラリ群を移動

    次に、ライブラリ群を$HOME/.titanium/runtime/linux/1.0.0/ から $HOME/.titanium/runtime/ へと移動させてしまいます。
    ~$ mv ~/.titanium/runtime/linux/1.0.0/* ~/.titanium/runtime/
    

    ちなみにこれでもまだ
    ~$ ~/.titanium/Titanium\ Developer 
    /home/ytnobody/.titanium/Titanium Developer: symbol lookup error: /usr/lib/libgtk-x11-2.0.so.0: undefined symbol: g_malloc_n
    

    といわれ、起動できません。Titanium + Ubuntuのマリアージュまでの道のりは、なかなか険しいですな。

    衝突している同梱ライブラリを削除する

    前述のエラーでググれば情報が出てくるのですが、要するに$HOME/.titanium/runtime/配下にあるライブラリのうち、
    • libgobject2.0
    • libglib2.0
    • libgio2.0
    • libgthread2.0
    この4種のライブラリが衝突しているから起動できないのだそうです。コイツらを削除してやることで、無事にTitanium Developerを起動する事ができました。
    ~$ rm ~/.titanium/runtime/libgobject-2.0.* -f
    ~$ rm ~/.titanium/runtime/libglib-2.0.* -f
    ~$ rm ~/.titanium/runtime/libgio-2.0.* -f
    ~$ rm ~/.titanium/runtime/libgthread-2.0.* -f
    ~$ ~/.titanium/Titanium\ Developer 
    

    ちなみに起動時に
    icedteanp plugin error: Failed to run /etc/alternatives/../../bin/java. For more detail rerun "firefox -g" in a terminal window.
    といわれます。今のところ正常に動作しているようなのであまり気にしていないのですが、これは大丈夫なのでしょうかねえ。。。

    追記

    android-sdkのパスを指定してもエラーが出てプロジェクトが作れない時の対処

    いざ、新規プロジェクトを立ち上げようとして、プロジェクト種別「Mobile」を選択した際、「android-sdkの場所を教えてくんな」と言ってきます。この時、正常なandroid-sdkのパスを指定しても
    Couldn't find adb or android in your SDK's "tools" directory. You may need to install a newer version of the SDK tools.
    とか言われてしまいました。そんな時は、
    ~$ ln -s ~/android-sdk-linux_x86/platform-tools/adb ./android-sdk-linux_x86/tools/
    
    とすればOKでした。

    2011-04-15

    [Forth]perlでいうところのrequireをしたい

    include hoge.fth
    
    のように、includeを使うか、
    s" ./lib/hoge.fth" included
    
    のように、includedワードでスタック内の文字列に該当するソースファイルを指定するかの2方式を選べるみたいです。
    どちらの場合も、プログラムが置かれているディレクトリを元にソースファイルの場所を指定する必要があります。

    追記
    Ubuntu 10.04 LTSの場合、/usr/share/gforth 配下にgforthのモジュール群があったので、これもrequireできるみたいです。
    従って、libパスは ./ および /usr/share/gforth ということになります。

    [Forth]gforthをCGIとして動かす場合のshebangの書き方

    こちらのフォーラムの情報をもとに試したところ、
    #! /usr/bin/env gforth
    
    としてやればOKです。

    [Forth]スタックに乗ってる文字列を複製してみる

    えーとforthについてはほぼ初心者の域をでないのですが、時折触ってみては「いつかは使いこなしたい」と思っている言語のひとつです。

    そんなforth学習の一環として、手始めに
    ・ワード定義
    ・スタック操作
    ・文字列操作(?)
    あたりを一気にやってみたので、メモを残しておきます。
    : ddup ( a b -- a b a b )
        over over
    ;
    
    s" ほげ" ddup
    type type cr
    bye
    

    $ gforth hoge.fth 
    ほげほげ
    

    2011-04-14

    [Linux]さくらVPSにてMongoDBを一般ユーザ権限で動かす

    MongoDBにすこし興味が出たので、このページを参考に、さくらVPS(CentOS 5.5)で動かしてみました。root無くても動かせそうだったので、ユーザ権限で動かすことにしました。

    ユーザ権限で動かすので、その用意。

    $HOMEにいろいろどっ散らかるのはイヤなので、$HOME/srcを作って、そこにMongoDBを置くことにしました。
    ~ $ mkdir ~/src
    

    MongoDBの入手

    こちらのサイトにLinux 64-bit向けのtarボールがあるので、おすすめ(recommended)と書かれてるバージョンのをwgetで引っ張ってきます。
    ~ $ wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-1.8.1.tgz
    

    インストール

    $HOME/srcにtarボールを移動して、そこで解凍します。
    ~ $ mv mongodb-linux-x86_64-1.8.1.tgz ~/src/
    ~ $ cd ~/src
    ~/src $ tar zxvf mongodb-linux-x86_64-1.8.1.tgz
    ~/src $ ln -s ~/src/mongodb-linux-x86_64-1.8.1.tgz ./mongodb
    
    以上でインストール自体は完了です。なまら簡単だべ?

    データストアの置き場所を用意する

    MongoDBでは、デーモンプログラム"mongod"の起動オプション"--dbpath"で、データストアのパスを設定できます。
    今回は、$HOME/src/mongodb/data/db をデータストアにします。
    ~ $ mkdir ~/src/mongodb/data/db -p
    
    これだけです。

    mongodを起こす

    ではmongodを起こします。
    ~ $ ~/src/mongodb/bin/mongod --dbpath ~/src/mongodb/data/db
    
    フォアグラウンドで起き上がってきて、ログをだくだく吐き出したら、無事に起動できています。止めるときはCtrl+Cすれば止まります。

    mongod起こした状態でweb管理インターフェースを見てみる

    mongodを起こすと、ログの中に
    Thu Apr 14 11:14:40 [websvr] web admin interface listening on port 28017
    
    のような記述が見受けられます。見ての通り、「Web管理インターフェースがポート28017で待ち受けている」ということです。試しにブラウザでVPSの28017番ポートにアクセスしてみると、以下のようなページを見ることが出来ます。
    セキュリティ的にはこんなのを外部から見れるようにしておきたくないので、mongod起動時のオプション"--nohttpinterface"を付加して、この機能を止めておきましょう。
    あとはdaemontools経由で起こすなりしてやれば良いというわけですね。

    2011-04-13

    [Perl]Plack::Middleware::*を作ってみる

    いい加減Plackが当たり前のこの頃ですが、いまだにPlack::Middleware::*を作ったことが無かったので、練習してみました。
    なお、あまり気にせずに書いていたら、内容がほとんどPlack::Middlewareのドキュメントと似たものになってしまいました。

    基本型

    以下が、だいたい定型となるコードです。
    package Plack::Middleware::OreOre;
    use strict;
    use warnings;
    use parent qw/ Plack::Middleware /;
    
    ### enableでオプションを受け取る時に使用
    # use Plack::Util::Accessor qw/ oreore watewate soregashisoregashi /;
    
    our $VERSION = '0.01';
    
    sub call {
        my ( $self, $env ) = @_;
    
        ### ここに処理をかく ###
    
        $self->app->( $env );
    }
    
    1;
    __END__
    
    Plack::Middleware::*を作るには、Plack::Middlewareを継承する必要があります。
    で、callというメソッドですが、ここに実際の処理を書いてあげて、最後に$self->app->( $env )としてappを実行するようにします。もしHTTPレスポンスを返したい場合は、途中でPlack::Response形式のarrayrefをreturnしてあげればOKです。
    もしenableするときにオプション値を取りたい(enable "OreOre", foo => 'bar'; とか)場合は、Plack::Util::Accessorを使う必要があります。
    多分、これだけあれば大抵の機能をPlackに組み込むことができそうです。

    ごく単純な例

    ある特定パスにアクセスされた時に、他のページにリダイレクトする、というだけの単純なPlack::Middleware::Hogehogeをつくってみました。
    package Plack::Middleware::Hogehoge;
    use strict;
    use warnings;
    use parent qw/ Plack::Middleware /;
    use Plack::Util::Accessor qw/ jump_url listen_path /;
    our $VERSION = '0.01';
    
    sub call {
        my ( $self, $env ) = @_;
        return [ 301, [ 'Location', $self->jump_url ], [''] ] if $env->{ PATH_INFO } eq $self->listen_path;
        $self->app->( $env );
    }
    
    1;
    __END__
    
    この場合、実際に使うときは以下の様なpsgiになります。
    use Plack::Builder;
    
    my $app = sub { [ 200, [ 'Content-Type', 'text/html' ], ['<h1>hoge!</h1>'] ] };
    
    builder {
        enable "Hogehoge", listen_path => '/yahoo', jump_url => 'http://www.yahoo.co.jp/';
        $app;
    };
    
    これをplackupすると、/yahooにアクセスしたときだけYahoo!Japanにリダイレクトされ、それ以外は"hoge!"とかかれたページが表示されます。

    ようやく少しはPlackの使い方に慣れてきました!

    2011-04-07

    [Perl]WebService::Simpleでレスポンスが文字化けしたら

    XML::Simpleのパフォーマンスの話

    WebService::Simpleは内部的にXML::Simpleを使っている。古い話だけど、XML::Simpleといえばこちらにもあるように「遅い」と評されることがあって、それはここに原因と対策がまとめられていて、掻い摘んで説明すると

    ・XML::SimpleはデフォルトでXML::SAX::PurePerlを内部的にパーサとして使用している。
    ・XML::SAX::PurePerl*が*遅いのであって、XML::Parserを使えば速度が改善される。

    ということになる。そのためには
    $XML::Simple::PREFERRED_PARSER = 'XML::Parser';
    
    という具合に、XML::Simpleが内部的に使用するパーサにXML::Parserを指定すれば良い。

    本題

    のっけから脱線したけど、これはWebService::Simpleのparse_response()の結果が文字化けを起こすという現象にも、同様の事が言える模様。

    use WebService::Simple;
    
    my $ws = WebService::Simple->new(
        base_url => 'http://example.com/api',
        param => { api_key => '***' },
    );
    
    my $res = $ws->get( 'hoge/fuga', { q => 'piyo' } );
    my $xml = $res->parse_response;
    

    例えば、こんな具合で生成されたWebService::Simpleのオブジェクトがあって、parse_responseの戻り値が文字化けしていたとする。そんな時はまず、

    use WebService::Simple;
    use WebService::Simple::Parser::XML::Simple;
    
    $XML::Simple::PREFERRED_PARSER = 'XML::Parser';
    
    my $ws = WebService::Simple->new(
        base_url => 'http://example.com/api',
        param => { api_key => '***' },
        response_parser => WebService::Simple::Parser::XML::Simple->new( xs => $xs ),
    );
    
    my $res = $ws->get( 'hoge/fuga', { q => 'piyo' } );
    my $xml = $res->parse_response;
    
    この様な具合でresponse_parserを食わせてみると、文字化けが治ったりするかもしれない。

    2011-03-28

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

    公式にもレポートがあがってます通り、3/26(土)にHachioji.pm #3が開催されました。

    Hachioji.pm #3 開催いたしました! - hachioji.pm

    詳細ついては、こことかこちらとかを参照のこと。

    じつはかなり酔っ払っていて、あまり細かいことは覚えていないのです。でもまあ、概ね以下のような話題でがやがやと話していたとおもいます(本当に記憶が薄れてるので、覚えてるとこだけ箇条書きでw)

    地震と計画停電

    ・八王子は駅前付近も含めて、ちょくちょく停電が実施されている模様。
    ・停電のせいで仕事にならない人も。
    ・今、インフラ系の人は大変ですよね。。。
    ・データセンターでも、一部では発動機用の燃料を確保するのに大変。
    ・さくらは大阪なのでさくらVPSはたぶん大丈夫。
    ・東京23区にお住まいの方はあまり実感がないらしく、「たいへんそうですねー」とコメント。
    ・八王子はあまりゆれないらしい。uzullaさんのTL見てると「ゆれてなーい」とか言っててうける。
    ・今回のHachioji.pm開催に際して「不謹慎」等のツッコミが一切なかった。

    毎度おなじみ

    makamakaさんが遅れて到着(予め遅れるという話はいつもの事)した時に、全員で大きな拍手を持って迎えられてました。

    バッドノウハウ

    LTで扱った話題とも重複するのですが、「これってバッドノウハウだよねー」というものがいくつかありました。
    ※決してFUDではないです。

    ・MySQL
     データベース操作とかチューニングとかレプリケーションとか・・・

    ・Q4M
     成り立ちからしてバッドノウハウだという意見も。
     >つまりグッドラッパー???

    ・Apache
     XMLもどきなconfファイルがそもそもバッドノウハウ。
     >名前からして"a patchy"をもじってるので、バッドノウハウの権化といえるのかも。
     ちなみに、いまならnginxでほぼ代替可能でしょう。

    ・PHP
     多くを語らずとも皆さんが「これはバッドノウハウ」という認識のようでした。。。
     これもapacheと同じで、バッドノウハウの権化となるべくしてなってる感が強いです。
     
    ・ガラケー向けノウハウ全般
     絵文字周りのノウハウとかは特にバッドノウハウの塊といえるでしょう。
     それに対するグッドラッパーがPerlにもPHPにも豊富なのですが。

    ・SJIS-win
     PHPで扱うことの出来る文字コードのひとつ。なぜCP932じゃないんだ。。。
     ちなみにPHPにはCP932をまっとうに扱えるライブラリ類が無いんだそうで。

    ・IE6
     「IE6とガラケー向けノウハウが無くなれば、8割のバッドノウハウは消え失せる」といわれるほどのバッドノウハウの総合商社っぷり。
     これについてはそのままFUDとして受け取ってもらっても構わないでしょうw

    しかしuzullaさんも言っていたように、バッドノウハウをうまく利用する/ラップする仕事というのは、大抵お金的においしい仕事だったりします。
    バッドノウハウをDISったりするのは、ぶっちゃけ素人でもできるわけです。単にバッドノウハウを忌み嫌うのではなく、バッドノウハウとうまくお付き合いするという考え方は、実はギークの態度として非常に大切なものではないでしょうか。

    今後おいしくなる仕事とは何だろう

    ・バッドノウハウを要する仕事はおいしい
    ・ソーシャルアプリは100万人単位の登録数がないとあまりおいしくなさそう。
    ・震災復興特需に期待か。具体的には土木・建築・電力系に関連したお仕事等。

    2011-03-24

    [Linux]nginxをさくらVPSのCentOS5.5に入れてみた

    最近借りた「さくらのVPS(CentOS5.5)」にnginx-0.8.54をインストールしてみました。

    nginxとは

    nginx - Wikipedia

    ダウンロード

    http://wiki.nginx.org/InstallJaからダウンロードできます。
    CentOSにはrpmforge含めyumパッケージが無いので、ソースからインストールします。
    今回は「安定版」とされている0.8系を選択しました。

    インストール

    僕が試した限り、以下のyumパッケージを予めインストールしておく必要がありました。
    • pcre-devel
    • openssl-devel
    その後はtarballを復元し、configure, make, make installの順に実行してあげればOKでした。
    コマンドをまとめると、以下の様になるはずです。
    # yum -y install pcre-devel openssl-devel
     # tar zxvf ./nginx-0.8.54.tar.gz
     # cd ./nginx-0.8.54
     # ./configure && make && make install
    
    /usr/local/nginxにいろいろ入っていればインストール成功です。

    nginxを起動する

    では、httpサーバとしてnginxを起動してみます。
    # /usr/local/nginx/sbin/nginx
    
    これだけです。

    nginxを停止する

    停止する場合は
    # /usr/local/nginx/sbin/nginx -s stop
    
    と実行するだけです。

    ネームバーチャルを設定する

    ドメイン毎にドキュメントルートを変えたりしたかったので、ネームバーチャルを設定しました。
    設定ファイルは /usr/local/nginx/conf/nginx.conf です。
    server {
            listen 80;
            server_name alpha.ytnobody.net;
            location / {
                root vhosts/alpha;
                index index.html;
            }
        }
    
        server {
            listen 80;
            server_name beta.ytnobody.net;
            location / {
                root vhosts/beta;
                index index.html;
            }
        }
    
    こんな感じの記述を http { ... } の中に書いてやります。

    プロキシとして動作させる

    バックエンドでstarmanとか動かしたいので、プロキシとして動作させてみました。
    nginx.confに以下のようなネームバーチャルを追加し、ネームバーチャルをまるごとプロキシとしました。
    server {
            listen 80;
            server_name lab.ytnobody.net;
            location / {
                proxy_pass http://127.0.0.1:5000;
            }
        }
    

    で、急ごしらえの動確用PSGIアプリを
    sub {
        [ 200, 
          [ 'Content-Type' => 'text/html' ], 
          [ '<html><head><title>PLACK</title></head><body>PLACK!</body></html>' ] 
        ];
    };
    
    こんな感じででっち上げて、plackupで起こしてやります。
    $ plackup ./hoge.pl
    
    これで、lab.ytnobody.netにアクセスすると、PSGIアプリにリクエストが流れます。

    ロードバランシングさせる

    さきほどのlab.ytnobody.netを改造して、ロードバランサとして設定してみます。
    upstream mybalancer {
            server www.google.com:80;
            server www.cpan.org:80;
            server www.yahoo.co.jp:80;
        }
    
        server {
            listen 80;
            server_name lab.ytnobody.net;
            location / {
                proxy_pass http://mybalancer;
            }
        }
    
    これだけで、upstreamのserver達にリクエストがバランシングされます。

    フォアグラウンドで走らせて、daemontoolsに食わせやすくする

    nginxをフォアグラウンドで動かすには、
    # /usr/local/nginx/sbin/nginx -g 'daemon off;'
    
    のように、グローバル指定子"daemon off;"を指定する必要があります。
    しかし、これだけだとログがローテートされません。放っておくと、アホみたいなサイズになってしまいます。
    これもdaemontoolsに任せてしまいたいので、どうにかログを標準出力に吐いておきたいところ。
    そこで、/dev/stdoutにログを吐いてやるように設定したところ、期待通りの動作となりました。
    server {
            listen 80;
            server_name lab.ytnobody.net;
            access_log /dev/stdout;
            location / {
                proxy_pass http://mybalancer;
            }
        }
    

    さいごに

    いままでnginx使ってなかった理由がわからない!!!!というほど、簡単に導入できました!!
    さようならapache!もう君には(よほどの事がない限り)世話にならないだろう!

    2011-03-13

    [地震]東京電力より輪番停電のおしらせ

    PDF版 https://docs.google.com/viewer?a=v&pid=explorer&chrome=true&srcid=0BwapBcGA1141Y2FkNmU4YWItYTA3My00ODY5LTk0ZTEtYzU4MWI1MjRmN2Nl&hl=ja&pli=1

    毎日.jpによるHTML版

    第1グループ 6:20~10:00 の時間帯のうち3時間程度
    第1グループ 16:50~20:30 の時間帯のうち3時間程度

    第2グループ 9:20~13:00 の時間帯のうち3時間程度
    第2グループ 18:20~22:00 の時間帯のうち3時間程度

    第3グループ 12:20~16:00 の時間帯のうち3時間程度

    第4グループ 13:50~17:30 の時間帯のうち3時間程度

    第5グループ 15:20~19:00 の時間帯のうち3時間程度

    2011-03-04

    [Perl]plackアプリとAttribute::Handlersの相性は悪い

    先日作ったRouter::Simple::Attributeを使ってPlackベースのWAFを作ろうとしたのですが、どういうわけかrouterの中身がカラッポになってしまい、ちっともまともに動作してくれませんでしたorz

    で、よくよく調べてみると、どうやらPlack::SandboxとAttribute::Handlersの相性がよろしくない模様でした。

    検証用コード - eg/sample.pl

    まあ幾つかツッコミどころが有りますけど、問題の本質とは関連がないものばかりの筈なのでスルー。
    use warnings;
    use strict;
    use lib qw( ../lib ./lib );
    use Attribute::Handlers;
    use Router::Simple;
    use Data::Dumper;
    
    my $router;
    
    BEGIN {
        $router = Router::Simple->new();
    }
    
    sub Path :ATTR {
        warn Dumper( @_ );
        my $path = $_[4];
        my $code = $_[2];
        $router->connect( $path, { code => $code } );
    }
    
    sub myapp : Path(/) { 
        warn Dumper( @_ );
        [ 200, ['text/html'], ['Hello, world!'] ];
    }
    
    warn Dumper( $router, __PACKAGE__ );
    
    sub {
        my $env = shift;
        if ( my $p = $router->match( $env ) ) {
            $p->{ code }->( $p );
        }
        else {
            [404, [], ['no']];
        }
    };
    

    perlコマンドから直接実行して見た場合

    $ perl eg/sample.pl 
    Useless use of reference constructor in void context at eg/sample.pl line 35.
    $VAR1 = 'main';
    $VAR2 = \*::myapp;
    $VAR3 = sub { "DUMMY" };
    $VAR4 = 'Path';
    $VAR5 = '/';
    $VAR6 = 'CHECK';
    $VAR7 = 'eg/sample.pl';
    $VAR8 = 24;
    $VAR1 = bless( {
                     'routes' => [
                                   bless( {
                                            'pattern_re' => qr/(?-xism:^\\/$)/,
                                            'pattern' => '/',
                                            'capture' => [],
                                            'dest' => {
                                                        'code' => sub { "DUMMY" }
                                                      },
                                            'name' => undef,
                                            'on_match' => undef
                                          }, 'Router::Simple::Route' )
                                 ]
                   }, 'Router::Simple' );
    $VAR2 = 'main';
    
    一応、Pathアトリビュートのトリガが引かれていることが確認できてます。

    plackupした場合

    では、今度はeg/sample.plをplackupで起こしてみます。
    $ plackup eg/sample.pl 
    $VAR1 = bless( {
                     'routes' => []
                   }, 'Router::Simple' );
    $VAR2 = 'Plack::Sandbox::eg_2fsample_2epl';
    HTTP::Server::PSGI: Accepting connections at http://0:5000/
    
    こんな感じで、Pathアトリビュートのトリガが引かれません。

    誰かおしえてください

    そんなわけで、plackupからでも問題なく使用できるメソッドアトリビュートハンドラを探しています。
    どなたかご存知の方、教えてください。よろしくお願いしますm(_ _)m


    教えていただきました!

    Twitterで、色々な方にご教示頂きました!この場を借りて、改めて御礼申し上げます。
    まとめると、僕は「Attribute病」:) に罹患していたらしく、

    ・PSGIアプリではINIT/CHECKなどが呼ばれないため、アトリビュートはほぼ動かない。
    ・アトリビュート使うと、第3者からみて「何してるかわからないコード」になってしまい、おすすめできない。
    ・Attr::Handlers sucks, and Perl5 attribute sucks too. で FA。

    ということらしいです。従って結論は

    アトリビュートを使うのはお止しなさい

    2011-03-03

    [Perl]Router::Simple::Attributeというものをつくったものの、筋が悪い物だった

    最近、そろそろ自前のWAFが欲しいと思い始めているのですが、いかんせん設計がまとめきれていないので、作っては棄てを繰り返しています。
    そんな中、Router::Simpleを弄っていて、「毎度newするの面倒だなあ。connectって毎度書くのも億劫だしぃ。。。」とか思っちゃって、じゃあAttributeにパス書けるようにしたらどうだろうということで、Router::Simple::Attributeなるものをつくってみました。

    使い方

    use MyApp;
      use Router::Simple::Attribute;
      
      sub root : Path(/) {
          return 'root';
      }
      
      sub home : Path(/home/:myname) {
          return 'ok, '. shift->{ myname }. '!';
      }
      
      router->do( '/' );              # >>> 'root'
      router->do( '/home/ytnobody' ); # >>> 'ok, ytnobody!'
    

    podをコピってきただけなんですけど、とりあえず簡単に説明。

    Pathアトリビュートのついたサブルーチンを作ると、Router::Simple->connect相当のことをやってくれます。アトリビュートオプションには、Router::Simple流のパス文字列を渡してやるといいです。

    それから、router()という関数が使えるようになります。こいつはRouter::Simpleのインスタンスを返しますが、これにはdoというメソッドが追加されています。

    doメソッドは、Router::Simple::match()の返り値(=HashRef)の要素{code}をコードリファレンスとして実行するものです。
    素のRouter::Simpleの場合、
    $router->connect( '/path/:user', { code => sub { ... } } )
    
    ...
    
    if ( my $p = $router->match( $env ) ) {
        $p->{code}->( ... );
    }
    else {
        ...
    }
    
    こんなふうに { code => sub { ... } } のところとか if文のくだりが若干冗長に感じますが、R::S::Attributeなら、
    sub user :Path(/path/:user) { ... }
    
    ...
    
    return router->do( $env ) || [ 404, [], ['not-found'] ];
    
    みたいな書き方が可能です。

    但し書き

    当然ですが、Router::Simpleに処理を追加しているモジュールなので、Router::Simpleより遅いです。
    あと、例によってテストが少なく、自分でもまだ実戦投入できていないものなので、信頼性については「?」という具合です。とはいえ、R::S::Attribute自体のコード量は非常に少なく、Router::Simpleが安定しているので、何か問題があったとしても、トレースはしやすいとおもいます。

    2011-3-4 追記
    どうやら、Plack::Sandbox::*とAttribute::Handlersの相性が悪いらしく、plackupからうまく利用できませんでした。
    この辺を調査した時の記録は、こちらの記事に書きました。
    一つ言えるのは、Attribute::Handlers や Perl5のアトリビュートを使うのは筋がよろしくないということです。

    2011-02-21

    [Perl]Hachioji.pm #2

    去る2/19(土)に開催されたHachioji.pm #2に参加しました。

    既にあるレポート等

    hondallicaさんのHachioji.pm参加者まとめ
    hide_o_55さんのレポート
    uzullaさんのレポート
    maka2_donzokoさんのレポート
    norry_gogoさんのレポート
    equinox79さんのレポート(#1含む)
    bisque33さんのレポート

    そもそもHachioji.pmとは

    ATNDにあるuzullaさんのご説明によると、
    本イベントは主に東京西部、神奈川西部のエンジニアの交流を目的としたものです。
    普段エンジニア交流会は都心部、平日に多くおこなわれており、それらの補完を目指しています。

    pmとついている様に、Perlユーザーが多くいますが、話題はPerlに限定されているわけではありませんし、私を始め、PHPやJS、HTML等をPerlよりも使っている人多くいます。
    エンジニアであれば、お気軽に参加いただければと思います。
    とのこと。

    手っ取り早く言うと、「八王子周辺のIT技術者の飲み会」で間違いないと思います。
    たぶん首都圏のpmの中では最も敷居の低いpmでしょう。
    ご興味のあるあなた!ぜひとも参加してみてください!
    次回は3/26(土) 18:00スタート予定です! → Hachioji.pm #3

    IRC #hachiojipm (freenode)
    Twitter @hachiojipm #hachiojipm

    Hachioji.pm 恒例 A4ライトニングトーク

    今回のお題は
    「Perl以外」
    でした。

    MacでDTraceを使って見る - ono_pmさん

    Mac上でDTraceを使い、Tatsumaki/eg/chatをトレースしてみたレポート。
    >perlならDevel::NYTProfがあるけど…
    >>もっとローレベルな情報取得をする場合(デバイスドライバの開発など)には重宝するとのこと。

    haXeでさぼる。 - sKSKeさん

    このLTでhaXeという言語を初めて知りました。
    JavaScript,PHP,ActionScript等に変換できるのが強みだそうです。

    タスク管理について - bisque33さん

    GTDとよばれるワークフローの管理方法に、TwitterとRemember the Milkを取り入れるタスク管理手法の紹介。
    ご本人も当日より始めたばかりだそうです。

    プロトタイプベースOOPへの誘い - ytnobody

    はい、Plass紹介したかっただけです><
    LT資料はこちら(スライドが8枚ありますが、実際はA4用紙1枚に印刷しました)。

    モバイルのキャリア課金に関するお話 - hondallicaさん

    キャリア側の対応状況やノウハウを披露してくださいました。
    ただし、内容が内容なので、詳細は非公開です。

    モバイル端末の位置情報まとめ - hatakさん

    モバイルにおけるGPSと一般的に呼ばれているのは、A-GPS方式で、
    測地系一つとっても日本測地系と世界測地系で400~500mも差がでてしまうというお話。
    実際、OpenSocialコンテナによっても、採用している測地系が異なるので、苦戦を強いられます。
    ちなみに、Geo::Coordinates::Converterを使えば、測地系毎の変換ができます。(その際に生じる誤差がどうなるかは解りませんが。。。)

    Hachioji.pmとは何だったのか - maka2_donzokoさん

    前日にTwitterで、
    鉄拳メソッドでやればいいんじゃないんですか?」
    なあんて、軽い気持ちでボケていたのですが、それがどうやら図星だったらしく、鉄拳風紙芝居/もんたハイブリッドメソッドというとてつもない手法でLTを敢行してました。
    hachioji自体にもなんか尊大な意味があったり、PMには某大物チェンバロ奏者があてがわれていたりと、お馴染みのまかまか節が炸裂していたのでした。
    LT資料

    node.jsでperl - hide_o_55さん

    node.jsで何か作りたい→addonはC++で作れる→つまりCのライブラリも使える→perlインタプリタもCだから組み込める!
    というのを思いつき、実際にやってしまうのが彼にとって自然な流れらしいですw
    そのうち、CPANモジュールをnode.jsに食わせたりするのではないのでしょうか。

    IIS5.0→IIS7.0に変わってハマったこと - usaymanさん

    閉域網で活躍するクライアント証明書認証付きのHTTP-GWサーバのIISバージョンアップ時の苦労話。
    IISと聞くだけでも「ご苦労様です!」と言わざるを得ないのに、バージョンアップに伴う仕様変更に相当泣かされている模様でした。
    そしてそれぞれの解決方法もWindowsならではのパワープレイが効いており、改めて「IISコワー><」と実感した次第です。

    OAuth/xAuth on mobile sucks - uzullaさん

    いつぞやのTwitterの偉い人曰く「モバイルにも力入れマース!」→OAuthだとモバイル環境で文字化けてたりして使い物にならない。→あれはリップサービスだったんだねー。→xauthも面倒。じゃあどうしようか。→WWW::Mechanizeでいいじゃないか→WWW::Mechanizeマンセー!!!
    いや、僕が大分昔にSourceforgeにあげていたCUIツイッタークライアント「Cuitter」もそんな実装してますんでw

    uzullaさん「んじゃうごかしまーす」<ポチっ>
    ...
    uzullaさん「うごかねーw」<ぎょわははははは>
    ネタとテクノロジーに関する話題が程よくミックスされた、面白いLTでした!

    最近作った2つのtwitter-botについて - equinox79さん

    自社サービス「いつもNAVI」関連のツイッターbot[@itsumolabot]の紹介と、amazonの特価情報を垂れ流す[@amzn_off_bot]の紹介。
    いつもNAVIはサービスとして非常によくできていますね!

    Cassandraを使って複数台のMTAでNGアドレスを共有とか - norry_gogoさん

    PHPで作られたMTA(!!!)がNGアドレスを溜め込んだり、MXにつなげる前に予めNGアドレスの場合はエラーで返したりするメール配信周りのバックエンドのお話。
    Cassandraでデータ分散させるも、分散自体が偏ったりして結構苦戦している模様です。
    それもそうですが、PHPのMTAというのが非常に興味深いですね!

    SQLのEXPLAINについて - takeR14aさん

    SQLでEXPLAIN使ってクエリ自体のパフォーマンスをチェックしましょうというお話。EXPLAIN重要ですよ!
    MySQLとPostgreSQLとでEXPLAINの出方が全然違ったりするので、この辺はできるなら統一してほしいかも…

    2011-02-17

    [Scala]scala.xmlつかってxhtml書き換えたいけどやり方が分からなくてこまったの巻

    以下のようなmigo.scalaを書いているのですが、
    import scala.io._
    import scala.xml._
    
    object migo {
    
        val xml = <html><head><title>abc</title></head><body><h1>hoge</h1><p class="piyo">ahoahoman</p><p><a href="#">yayaya</a>shotes</p></body></html>
    
        def main ( args: Array[String] ) {
             val targets = xml \\ "p"
             targets.map( _.text ).foreach( println )
        }
    
    }
    
    targets.map(_.text)してるところで、_.textの内容を"おっぺけぺー"に書き換えたい場合、どうすればいいんでしょう。。。
    text()って引数Stringじゃないし、アクセッサではないようなので。。。orz
    だれかおしえてください!!!!><

    2011-02-14

    [daemontools]dtinstallというのを用意しました

    わざわざ大仰に言うほどのものじゃないんですけど。

    かなり前に書いた記事で、daemontoolsのインストールをするスクリプトをこさえました。
    もうあれから1年半ほど経過したわけですが、僕自身が未だにこのスクリプトに助けられています。
    で、いっそのことネットからもっと取りやすい位置に置いておけばいいんじゃないかと思い、gist + URL短縮でサクッと取得しやすいURLにしてみました。

    gist: 825704 - daemontools installer script- GitHub

    入手はこちら→http://xrl.us/dtinstall

    こちらが最新版です。 http://is.gd/dtinstall

    $ curl -L http://is.gd/dtinstall | sh
    

    とすれば、daemontoolsのインストールが始まります。

    ※2014/01/03 記事を一部修正しました。

    2011-02-01

    [Perl]インスタンスベースOOPを少し楽に書けるPlassってモジュールを書いた

    インスタンスベースOOPって聞いたことありますか?ぶっちゃけ、僕もついこの前までこの用語を知らなかったです!(ちなみに「プロトタイプベース」っていう用語としてなら、それなりに普及しているっぽいんですけど。。。)

    要するに、JavaScriptにおけるOOPみたいなものだと思ってもらえれば良いみたいです。
    で、Perlでもそういうことを簡単にやってのけるような実装が無いわけじゃないみたいですが(インスタンスベースOOPで必要な機能を部分的にカバーするモジュールなら幾つかある)、あくまで「インスタンスベースOOPの面倒をみてやるぜー」的なモジュールとなると、そういうのは見つけられなかったです。
    また、Perlの言語レベルである程度カバーできる箇所もあるんですけど、それってキモチワルい見た目のソースを書くことにつながったりするので、そういうのはナシって方向で考えると、

    「あれ、PerlでインスタンスベースOOP実現するのって、なんかすっきりしたやり方が無い様な。。。」

    という結果に行き着いてしまいました。。。
    そんなわけで、インスタンスベースOOPの面倒を見るモジュールとしてPlassというのを作ってみました!

    こんな感じで使えます

    ちなみに以下のソースは、Cyanというインスタンスベースな言語のドキュメントの一部にあったサンプルソースです。
    Human = Object.child()
    Human.walk = ^(self, dir){
      say(self.name + " walked " + dir + ".")
    }
    
    Superman = Human.child()
    Superman.fly = ^(self, dir){
      say(self.name + " flew " + dir + ".")
    }
    
    human = Human.child()
    human.name = "John"
    human.walk("east")  #=> John walked east.
    
    superman = Superman.child()
    superman.name = "Clark"
    superman.fly("north")  #=> Clark flew north.
    superman.walk("west")  #=> Clark walked west.
    

    これをPerlでPlassを使って書き換えると、以下の様になります。
    use warnings;
    use strict;
    use Plass;
    
    # plassコマンドでPlassオブジェクトのクローンを作成
    my $Human = plass; 
    
    # Humanインスタンスにwalkメソッドを追加
    $Human->method( walk => sub {
        my ( $self, $dir ) = @_;
        print $self->name. " walked ". $dir. ".\n";
    } );
    
    # SupermanインスタンスはHumanインスタンスのクローン
    my $Superman = $Human->plass;
    
    # Supermanインスタンスにflyメソッドを追加
    $Superman->method( fly => sub {
        my ( $self, $dir ) = @_;
        print $self->name. " flew ". $dir. ".\n";
    } );
    
    # humanインスタンスはHumanインスタンスのクローン
    my $human = $Human->plass;
    
    # humanインスタンスのname値を設定
    $human->name( "John" );
    
    # Humanインスタンスから継承したwalkメソッドを実行
    $human->walk( "east" );
    
    # supermanインスタンスはSupermanインスタンスのクローン
    my $superman = $Superman->plass;
    
    # supermanインスタンスのname値を設定
    $superman->name( "Clark" );
    
    # Supermanインスタンスから継承したflyメソッドとwalkメソッドを実行
    $superman->fly( "north" );
    $superman->walk( "west" );
    

    出力結果は
    John walked east.
    Clark flew north.
    Clark walked west.
    
    となり、Cyanのそれと同じ出力(Cyanのドキュメントによると、ですが^^;)になっていることがわかります。

    Plassではインスタンス継承時にメンバ変数やメソッドを一気に被せることもできますので、上のコードは以下のように書くことが可能です。
    use warnings;
    use strict;
    use Plass;
    
    # Humanインスタンスの定義
    my $Human = plass(
      walk => sub {
        my ( $self, $dir ) = @_;
        print $self->name. " walked ". $dir. ".\n";
      }
    );
    
    # Supermanインスタンスの定義
    my $Superman = $Human->plass(
      fly => sub {
        my ( $self, $dir ) = @_;
        print $self->name. " flew ". $dir. ".\n";
      }
    );
    
    # humanインスタンスの定義
    my $human = $Human->plass( name => "John" );
    
    # humanインスタンスのwalkメソッドを実行
    $human->walk( "east" );
    
    # supermanインスタンスの定義
    my $superman = $Superman->plass( name => "Clark" );
    
    # supermanインスタンスのflyメソッドおよびwalkメソッドを実行
    $superman->fly( "north" );
    $superman->walk( "west" );
    

    出力結果は
    John walked east.
    Clark flew north.
    Clark walked west.
    
    先ほどと同様ですね。

    もし興味を持っていただけたら


    ytnobody/Plass - GitHub

    にアップしてありますので、お気軽にダウンロードしていただければ幸いです!
    但し現在のところ、圧倒的にテストが不足してますので、そこんとこは予めご了承ください。

    ちなみに僕はインスタンスベースOOP言語は今までJavaScriptしか触ったことが無いです(と思います)。

    もし「真のインスタンスベースとはここが違うじゃねえか!」などというツッコミとか「こうした方が使いやすいんじゃないか」などのご提案、「これをこう使うと変になる!」みたいなバグ報告などなどございましたら、@ytnobodyまでご連絡ください!

    余談ですが


    Cyan言語の開発者はなんと、高校生の頃にCyanを開発したそうですよ!猛者ですね!Cyan言語についても興味がでてきました!