新しいblogに移行しました

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

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