2010/10/06

Test::Fixture::DBI::Console

作成の動機

Test::Fixture::DBIには既存のDBからテーブル定義と中身をdumpするツールが付属しています.

これを使うとさくっとテスト用のfixtureが生成できます.

生成したFixureを書き換えて使ってもいいのですが,yamlだと量が増えたときに閲覧性が低いと感じました.


そこで使い慣れたmysqlのconsoleっぽく見れると便利なんじゃないかと思い,Test::Fixutre::DBI::Consoleを作成しました.


追記
これは内部でTest::mysqldを使ってfixutre作成専門のmysqldを立ち上げます.


配布場所

現在はgithubのみです.PAUSE IDが貰えたらCPANも考えます.

Test::Fixutre::DBI::Console 

使い方

Test::Fixture::DBI::Consoleをinstallすると"test_fixture_console"コマンドもinstallされます.

このコマンドでshellに入ります.


まずはテーブル定義とデータを生成します.
yoshi@mb yoshi% test_fixture_console mysql
fixture> create table hoge (id int primary key auto_increment); 
Affected 0 rows
fixture> show tables;
+----------------+
| Tables_in_test |
+----------------+
| hoge           |
+----------------+
Affected 1 rows
fixture> insert hoge (id) values (1),(2),(3);
Affected 3 rows
fixture> select * from hoge;
+----+
| id |
+----+
| 1  |
| 2  |
| 3  |
+----+
Affected 3 rows

# DBと中身をyamlに書き出し
fixture> make_database test1.yaml
Create database schema file: test1.yaml
fixture> make_fixture test1_fixture.yaml
Create fixture file: test1_fixture.yaml


先ほど書き出したyamlの中身
yoshi@mb yoshi% cat test1.yaml
---
- 
  data: "CREATE TABLE `hoge` (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  PRIMARY KEY (`id`)\n) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=latin1"
  schema: hoge
yoshi@mb yoshi% cat test1_fixture.yaml
---
- 
  data:
    id: 1
  name: 1
  schema: hoge
- 
  data:
    id: 2
  name: 2
  schema: hoge
- 
  data:
    id: 3
  name: 3
  schema: hoge

test1.yamlとtest1_fixture.yamlをloadしてみます.
yoshi@mb yoshi% test_fixture_console mysql
fixture> show tables;
+----------------+
| Tables_in_test |
+----------------+
+----------------+
Affected 0 rows
fixture> construct_database test1.yaml
Load database schema from test1.yaml
fixture> show tables;
+----------------+
| Tables_in_test |
+----------------+
| hoge           |
+----------------+
Affected 1 rows
fixture> construct_fixture test1_fixture.yaml
Load fixture from test1_fixture.yaml
fixture> select * from hoge;
+----+
| id |
+----+
| 1  |
| 2  |
| 3  |
+----+
Affected 3 rows

TODO

  • テスト足りなすぎ
  • PODもちゃんと書く
  • SQLiteでも動かしたい
  • モジュール名はこれでいいのか
  • 明らかにリファクタリングが必要

2010/10/03

Hokkaido.pm #2

関係者の皆様,昨日はお疲れ様でした.

今回は初めてスピーカーをやらせて頂いて大変勉強になりました.
需要があるかわかりませんが,一応slideshareにアップロードしましたので
興味のある方はご覧ください.

2010/09/09

SQLiteのデータをCSVで出力する

sqliteで管理しているデータをCSVで出力する必要があったので,sqlite3にmysqlの-eオプションみたいなのが無いのか確認したところ,下記の方法で出力先と出力方法を変更できた.

sqlite> .mode csv
sqlite> .output hoge.csv

後は普通にselectを発行するとSTDOUTじゃなくてhoge.csvにデータが書き込まれる

他のmode等は.helpで確認可能.

2010/09/08

Iterator::ToArray

Iterator::ToArrayを作成した。
名前の通りIteratorをArrayに変換する。

作成の動機はHTML::Template::Proに直接IteratorやORMのrow objectを渡せないのでiteratorをarray(ref)?に変換したかったから。

use HTML::Template::Pro;
use MyDB; # using DBIx::Skinny
use Iterator::ToArray qw/to_array/;

my $db = MyDB->new(...);
my $iter = $db->search(
    'hige_tbl',
    { length >= 30 }
);

my @array = to_array $iter, sub {
    +{ id => $_->id, 'length' => $_->length }
};

my $html = HTML::Template::Pro->new(
    filename => $file
);
$html->param( hige_loop => \@array );

毎回↓みたいにwhileで$iter->next()を呼ぶのにいい加減あきた。
my @array;
while ( defined ( my $row = $iter->next() ) {
    push @array, {
        id     => $row->id,
        length => $row->length,
    };
}

2010/08/24

HTTP::Request::AsCGIでCGIのテスト

HTTP::Request::AsCGIとHTTP::Requestを使うとCGIのテスト時に環境変数等をよしなにセットアップしてくれる。
前に使ったことがあったはずなのに、モジュール名が全然思い出せなかったのでメモ。

以下、使い方
use strict;
use warnings;
use HTTP::Request::AsCGI;
use HTTP::Request::Common;
use CGI;
use Test::More;
{
    my $req = POST 'http://example.com/',
        Content_Type => 'form-data',
        Content      => [ file => ['t/test.gif'] ];
    my $c = HTTP::Request::AsCGI->new($req)->setup;
    my $q = CGI->new;
    my $filename = $q->param('file');
    is( $filename, 't/test.gif', 'filename ok' );
}

done_testing;

2010/08/08

Hokkaido.pm #1

昨日のHokkaido.pm #1のメモ

非同期プログラミング
--------------------
講演者: 牧さん

複数URLにたいしてリクエスト
- LWPで順にリクエスト 
- 遅い場所があると詰まる
- read(2)でブロック

イベント駆動
- イベントループ
- callbackを登録
- socketの読み込み可能とかで発火

AnyEvent
- POE, Danga::Socket, IO::Async,
- ↑互換性なし
- 汎用API
- バックエンドを選べる
- Standard API++
- 新規ならAnyEvent
- AnyEvent vs AE
- 牧さんはAE派

Watcher
- IO watcher + callback等
- Timer
- signal
- idle 待機状態
- AnyEventで注意すること
- guardオブジェクトを利用している
my $timer;
$timer = AE::timer 0, 1, sub {
    # callback無いで必要なくなったらオブジェクトを削除する
    # そのために先に$timerを宣言しないとcallback内から呼べない
    undef $timer;
};

コンディション変数
- $cv = AE::cv {};
- $cv->recvでイベントループに入り,$cv->sendをwatcherのcallbackから呼ぶ
- 複数のwatcherに対応するためには$cv->begin, $cv->endを使う
- $cv->send(@args)でAE::cvのcallbackの引数に値を渡せる

AnyEvent::\*の名前空間にいろいろ入ってる

サーバサイドだとTwiggy
- plackup -s Twiggy
- longpoll
- ブラウザゲームのイベントサーバ

非同期の注意
- 「やりたいから」だと失敗する
- 「必要がある」ときだけ使う
- リアルタイム性
- I/O待ちが多い
- コードが複雑になるから,必要なときだけにしよう


LAPPによるWebアプリケーション
-----------------------------
ここは諸事情によりカット
Imager::DTPは意外と使えるのかも


Perl6 Pattern Match
-------------------
講演者: 山川さん

Perlの正規表現の問題
- なぞの記号
- /xとか←個人的によく使う
- 使用頻度と記号の長さが適当
- ?? ?;とかわからん
- /gとかで動作がかわりすぎ
- ネストしたパターンが困難
- 変数展開がめんどい,サブルール
- 正規表現からPerlを簡単に呼べない
- バックトラッキングの制御がない

Perl6の挑戦
- マッチ演算子が ~~ に
- スペースは常にトークンの区切り文字 /xがデフォルト
- コメント #
- [...]が文字クラスではなく(?:...)に相当
- 文字クラスは<[...]>, 否定 <-[...]>
- 足し引きができる <[a..z]-[aeiou]>
- \**n で {n}, \**n..mで{n,m}
- :s :i //s //i
- 変数キャプチャ $/にマッチ結果 $/[0]でアクセス
- 名前つき正規表現 regexで作成
- 置換がs/からrx/
- /eがなくなった m/pat/{ code }/
- マッチ条件にコードを使える
- 構文解析
- PEG Parserが使える
- 再帰下降パーサ+memo化
- Perl6っぽくする Regexp::Grammer


Perlロギング
------------
講演者: keroyonnさん
- ゆとり系プログラマー
- twitterのクローラとか

前提知識
- print debug
- debugger lvalueにバグあるらしい
- Data::Dumperはちょっと不便
- YAML::Syckだとdumpも読みやすい
- 時間もほしい Time::Pieceが5.10からコア入り
- warn, carp
- exit 1; die, croak
- dieはステータス 255固定
- $!に自分で入れられる

Log::Dispatch
- newしてaddでOutputのサブクラスを追加していく
- Log::Dispatch::Config
- 書式設定とかできる
- Log::WarnDie
- warn, dieをLog::Dispatch等に送る

Log::Dispatch::Outputのサブクラス
- Email系が多すぎ.日本語も通らない
- Email::EmailSender
- エンコード指定できる
- githubにあり
- http://search.cpan.org/~keroyon/Log-Dispatch-Email-EmailSender-0.03/README.pod

Log::Dispatch::Config::Watcher
- L::D::Configを継承してるから使い方は一緒
- 拡張パラメータはWatchに詰め込む
- functionsで監視するファンクションを指定できる
- main::test1とか
- Hook::LexWrapでメソッドの起動,終了をフック


DB処理におけるFixtureの勧め
---------------------------
講演者: ZIGOROuさん

Test::mysqld
- DBIx::Connector
- SQL::SplitStatement
- レプリケーションもできる

MySQLを使ったFixture
- Test::Fixture::DBI - 生DBI用のFixture
- triggerの例
- デモ
- Test::Fixture::DBIにはmake\_database\_yaml.plとかのツールが付属していて,Fixtureデータ等を簡単に作成できるようにしてる


----------------------------------
ここからLT

はじめてのしー・じー・あい
--------------------------
講演者: hotwatermorning

- バグ票→Perl+CGIで作ろう
- まとめて見られない→バグ表だった
- 課題 DB
- プログラミングの魔道書 今回はC++
- PDF版が1000円

画像のモノクロ変換の高速化
--------------------------
- 割り算をビットシフトに
- 早くならない
- 手数を減らす
- for を map
- 配列をscalarに
- 最初からビットシフトしておく
- 一行にまとめた
- 最適化 = ロマン

2010/08/06

Webテクノロジーセミナー

今日はWebテクノロジーセミナー行ってきました!

ZIGOROuさんの公園が一番エンジニア向けの内容で楽しめました。
客層がエンジニアメインじゃなかったのかあまりウケはよろしくなさそうだったけども……。
今日とったメモを一応載せておく。

後、Six apertさんからWe ♡ blogって書いてあるエコバッグ?っぽいノベルティ頂いた!
あざーっす!

--------------------------------------------------------
ここからメモ
--------------------------------------------------------


Webテクノロジーセミナー
=======================

- MovableTypeで作るスマートフォン対応サイトのセッションは中止
- 質疑応答を伸ばす

開催理由
--------
- スカイアーク紹介
- solanowa
- MT CMS
- 7年目

- 4187億円 北海道ITの売上高
- 食品,鉄鋼,石油・石炭,紙,IT
- ニアショアで道外の仕事が増えている
 - 88.7% 札幌の売り上げ
- 札幌に一極集中はどうなの?
- 北海道のITを盛り上げる会 東京でやってみた
 - 北海道に戻れない理由
- 地元にIT企業が少ない
  - 技術レベルが下がりそう

- 盛り上げるきっかけとしてセミナー開催
- CSS3でドラえもん
- JPA 牧さん
- DeNA 山口さん
- Six apart 金子さん


ビジネスでPerlを使うために知っておくべきPerlの現在と未来
--------------------------------------------------------
講演者 牧さん

2000年代に暗黒期
- 活動が表に見えなかった
- クレーム
- Perl6ぐだぐだ
- 5.8から5.10が5年!!
- FUDがいっぱい

ここ一二年はいい感じ
PerlMongersも一杯
Perl5開発体制が刷新
- 機能ベースから時限ベース
- 安定版を毎年
- 開発版を毎月
- リリース担当が毎回かわる等の変化
- commitもコンスタントにある

Perl6 Rakudo 1.0
- 基本的には姉妹言語
- 別言語なので別にアップグレードの必要はない
- gfxのコメントを引用

情報発信
- blogサイト立ち上げ
- perl.orgとかも刷新
- マーケティングに力を入れたい
- http://bit.ly/cUyzVa

団体・法人
- OSSでも団体が必要
- 会社の上司「サポートされてんの?」に対抗
- YAPC
- The Perl Foundation 権利関係とかをアメリカでやっている
- ヨーロッパでも団体ができた
- 日本ではJPA(社団法人)
- 有料だけど研修もやってるよ!!
- perlを使う企業を増やしたい

今後の話し
- Perl5はまだまだ活発なんで安心

Perlを続ける理由

メリット
- 楽ができるからで終了
- Perl 10年
- 現実,いいコードの再利用,様々な用途に使える,テスト
- 言語は表現のためのツール
- 拡張 => モジュール化
- 問題を解けなきゃはじまらない

デメリット
- CPANがないと大変
- エンジニア側がルールを作る必要性がある
- ツールでカバー(cpanm, perltidy, perlbrew)

CPAN
- hackerのコードを再利用して楽ができる
- 生態系
- author -> upload -> test -> feedback -> author
- 自浄作用,多様性

テスト文化が強い
- Test::
- テスト方式がある
- 簡単にテストできる
- Free QA
- CPAN Testers
- いろんなOSとPerl Version



モバゲーオープンプラットフォームとPerl
--------------------------------------
講演者: 山口さん(ZIGOROu)

OpenSocail?
- ソーシャルデータを利用
- mixiapp

Gadget
- XML
- HTML+JavaScript+CSS, Flash
- gadget server -> Apache Shinding(Java or PHP)

JavaScript API
- SocalDataにアクセス
- 裏ではJSON-RPC API

Spec
- 決まってるからサイトで見れる

mbga OpenPlatform
- mobile向け

JSON-RPC 2.0
- request, responseにvesionとか入ってる
- batchリクエスト idをつけて送れば,idがついてかえってくる

JSON-RPC -> Perl実装
- Chariot RESTful API
- Chariot2 JSON-RPC

設計方針
- 速い・軽い
- 富豪的なモジュールは避ける
- メンテナンスしやすい
- テストもしっかり.テストしやすいインターフェイスで
- frontend lighttpd
- backend Plack + Starman

モジュールの選択
- WAFはいらない
- POPO Class::Accessor::Fastは使ってる
- viewいらん
- PSGIにすれば柔軟に後で変更できる
- Dispatcher Router::Simple
- O/R mapperは小中規模まで
- SQL::Abstractを使ってる
- DBIx::Connector 接続のリトライ等
- Time::Piece
- データ構造は生にHashref等
- Object::Container
- データチェック Data::Util 速い is_array_ref($data)
- Config Loader
- 環境が4つ
- sandbox, sandbox stage, service, service stage
- Config::Any, Hash::Merge::Simple
- Object::Contener
- 遅延実行でsingleton
- 設定ファイルはperl形式. coderefを渡せるから
- preload機能

未来の話
- memcachedは厄介
- cacheのexpire, updateがめんどくさい
- handler socket plugin
- SQLを使わずに直接MySQLのstrage apiをたたける
- gearman
- 並列に処理
- mysqlとの接続を維持できる

まとめ
- 軽く速いのを使う.作る
- 基本を意識 CoW,テスト
- CPANから探そう


Movable TypeとPerl
------------------
ブログ,twitter, cmsなにがいいの?

- 全部やれ
ブログは継続して書かないと成果がいまいち
コンテンツ・テンプレートの更新履歴機能
- バージョン管理して,すぐ過去のバージョンに戻せる
管理画面にコンテンツ絞込みのフィルタ機能が5.1で入る
- フィルタは保存可能
FogBugzでバグトラッキング
Glo-bish 1500語程度の簡易英語