5月
13

 

Casualを含めて今回3度目の参加でした。今回はWEBアプリ再入門がテーマということで、WAF(ウェブアプリケーションフレームワーク)のお話が中心でした。WAFは選択肢豊富で迷いそうだけど、一方で、どれも大差ないようにも感じました。いずれにしても今、Perlが熱い。

Amon2(akiymさん)

高校生にあんな立派な発表されたら敵いません。KENT WEBの掲示板を移植していたのが面白かった。ああいうのをサクっと作れちゃうのは素晴らしい。スライドもう一度みたいなあ。あがってた

http://akiym.com/slides/20120512-hokkaidopm7-amon2/index.html

Dancer(aloelightさん)

Dancerは、ルーターに渡すコールバックでレスポンス用の文字列をreturnしていた点に、Mojoliciousとの設計の違いを感じました。あと、プラグイン数の比較がためになりました。

http://www.slideshare.net/aloelight/using-dancer

Mojolicious(jamadam)

MojoliciousでPHPライクなことをするお話をしました。

http://www.slideshare.net/jamadam/mojolicious-12907706

Ops Tools with Perl(riywoさん)

カバンがかっこよかったです。運用のお話は僕にはちょっと難しかったですが、cron blueprintのあたりは楽しげでした。あとDSLの作り方も興味深かった。

http://www.slideshare.net/riywo/ops-tools-with-perl-20120512-hokkaidopm

LTではお二方が音系のお話をされていたり、この日、一番の爆笑をとったapache依存のWAFのお話など、充実の内容でした。

懇親会では多くの方とお話しできて幸せでした。perlの次バージョンはuse strictがデフォになると初めて知りました。古くて危険なスクリプトがやっと淘汰されていくのかな。

昼につけ麺、夜にラーメンは反省点でした。腹壊しました。

4月
29

 

Mojoliciousアプリの出力するDOMを詳細にテストするやつ。

https://github.com/jamadam/Test-Mojo-DOM

Test::Mojoだけだと、domのチェックはelement_exitsとelement_exits_notしかできないので、詳細なテストはcontent_*でやるか、DOMを取り出してからTest::Moreを使う。

$t->get_ok('/');
my $dom = $t->tx->res->dom;
is $dom->at('#hoge')->attrs('href'), 'http://example.com', 'right URL';

Test::Mojoと似た流れでDOMのテストもやりたい!

ということで、Test::Mojo::DOMを使うと下記のようにできるよ。APIは変わるかもだよ。

  use Test::Mojo::DOM;
  use Test::More tests => 35;

  my $t = Test::Mojo::DOM->new(MyApp->new);
  $t->get_ok('/')
      ->status_is(200)
      ->dom_inspector(sub {
          my $t = shift;
          $t->at('a')
              ->attr_is('href', '../')
              ->attr_isnt('href', './')
              ->attr_like('href', qr'\.\./')
              ->attr_unlike('href', qr'\.\./a')
              ->text_is('some link')
              ->text_isnt('some link2')
              ->text_like(qr'some')
              ->text_unlike(qr'some2')
              ->has_attr('href')
              ->has_attr('empty')
              ->has_attr_not('not_exists');
          $t->at('a')->get(1)
              ->text_is('some link2');
          $t->at('a:nth-child(2)')
              ->text_is('some link2');
          $t->at('a')->each(sub {
              my $t = shift;
              $t->text_like(qr{.});
              $t->text_unlike(qr{a});
              $t->attr_like('href', qr{.});
              $t->attr_unlike('href', qr{a});
          });
          $t->at('a')->parent->attr_is('id', 'some_p');
          $t->at('a')->parent->parent->attr_is('id', 'wrapper');
          $t->at('#some_p')->has_child('a');
          $t->at('#some_p2')->has_child_not('a');

          $t->at('#some_img')->has_class('class1');
          $t->at('#some_img')->has_class('class2');
          $t->at('#some_img')->has_class('class3');
          $t->at('#some_img')->has_class_not('class4');
      });
4月
08

 

 

Mojolicious v2.76

4月
07

 

mojoの最新版をmojo-legacyにマージする自分用メモ。

 

mojoリポジトリのクローンで作業開始。

$ cd mojo
$ git checkout master
$ git pull upstream master
$ git pull upstream master --tags
$ git checkout mojo-legacy
$ git merge v2.82

…コンフリクトを直す。ついでにChangesも追記

… qr/( ~~ | // | //= )/で検索するなどして、新たなperl-5.10.x依存を排除。正規表現も注意。

その後、テスト。

$ perlbrew use perl-5.8.7
$ export TEST_HYPNOTOAD=1
$ export TEST_TLS=1
$ export TEST_MORBO=1
$ export TEST_EV=1
$ export TEST_ONLINE=1
$ export TEST_CACHING=1
$ prove -r t

…mojo-legacyリポジトリを差し換え

その後、コミット。

$ cd mojo-legacy
$ git add .
$ git add -u
$ git commit -m 'rebased on Mojolicious v2.82'
2月
18

PogoPlugを無事、ハックできたので、次はウェブサーバーを立ち上げてみた。最終的にはフォトギャラリーを身内と共有したいんだけど、とりあえずは、指定のディレクトリ以下を手軽に公開する。ただし、apacheとか大げさなものは使わず、自作のMojoX::Tusuっていう何かを使う。Mojoliciousプラグインなんだけど、apacheみたいにファイルをサーブする何か。

このブログにやたらと登場するMojoX::Tusuですが、ただ自分が好きで使ってるだけです。危険なのであまり真似しないほうがいいと思います。

 

root権限でcpanmのインストール。

$ perlbrew install-cpanm

前回インストールしたPerlに切り替え。

$ perlbrew switch perl-5.14.2

MojoX-Tusuっていう何かを入れる。最近、cpanmでgithubから直接インストールできなくなった。githubがSSLになったせいか、リダイレクトの関係か、不明。しょうがないのでwgetしてからcpanm。

$ cd ~
$ wget https://github.com/jamadam/MojoX-Tusu/tarball/v0.38
$ cpanm v0.38
$ rm v0.38

依存先のMojoliciousも入ったはずなので、tusu_appってものをジェネレートする。

$ mojo generate tusu_app Public

~/public/lib/Public.pmにindexesオプションを追記。これでapacheのauto indexみたいな動作。

        encoding                => ['Shift_JIS', 'utf8'],
        document_root           => $self->home->rel_dir('public_html'),
+       indexes => 1,
    });

アプリを起動する。

$ hypnotoad ~/public/script/public

以上で~/public/public_htmlがドキュメントルートになったので、8080ポートで見られる。あとは、public_html以下にファイルを突っ込めばハローワールド。身内用には別のtusu_appを乱立してhypnotoad.confでポートを割り当ててく。Mojolicious::Plugin::PlackMiddlewareとかでベーシック認証でもかけておけば良いんじゃないかと思う。

 

とりあえず、テキトーにMojo::Tusuのソースをアップしてみたけど、そのうち消す。

2月
14

昨年暮れに、自宅サーバーのHDDがぶっ壊れて、部屋に静けさが戻った。httpサーバーは、さくらのVPSに引越しした。けど、大容量ストレージがないと何かと不便なので、復活させることにした。

デスクトップマシンだとデカイしファンがうるさいので、流行のPogoplugをハックすることにした。

Pogoplugのラインナップがよく理解できなかったので、テキトーにAmazonで最安値だった中古のPOGO-P01を購入。4,800円也。合わせて、システム用にBUFFALOのUSBメモリー(8GB)を982円で購入。こちらは新品。以前のサーバーに外付けしていた1TBのUSB HDDを復活させる。宅内からはsambaで、外出先からはscpとhttpでデータ出し入れ、という予定。

ここを参考にしてdebian化。と思ったら、Pogoplug P01(Pro)はハックの対象外だった。気付くのに2日かかった。USBメモリにシステムをインストールまではできたんだけど、ubootの書き換えができず。しょうがないので、Arch Linux ARMというものを入れた。公式のドキュメントのとおりに進めたら、ものの30分で終わった。その後、下記の手順で追加の設定等。

データ用の1TBハードディスクを接続し、マウントする。/homeにまるごと当てがっちゃう。

# echo '/dev/sdb    /home   ext2    defaults    0 2' >> /etc/fstab
# mount -a

debianでいうaptはpacman。パッケージマネージャ、略してパックマンか。

pacman -Syuでエラーがでるので、下記に従う。

念のためバックアップ。

# cp /etc/mtab /home
# mv /etc/profile.d/locale.sh /home

上記の記事どおり。

# pacman -S filesystem --force
# rm /etc/profile.d/locale.sh

パッケージの更新。

pacman -Sy
pacman -Syu

viをvimのエイリアスに。

# alias vi='vim'
# export EDITOR=vim

ユーザー作成。

# adduser ore
# adduser yome
# adduser familyname
# groupadd familyname
# usermod -g familyname ore
# usermod -g familyname yome

ルートログイン禁止。

$ vi /etc/ssh/sshd_config
PermitRootLogin no

タイムゾーンの設定。

$ ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

samba入れる。公式ドキュメントに従ってnmbdとプリンター共有も停止。

# pacman -S samba

ddnsの設定。value domainのCGIを15分おきに叩く。本当はローカルにIPを保存しておいて変化を検出してから更新したほうがいいけど、とりあえず手軽に。

# crontab -e
*/15 * * * * wget -O - 'http://dyn.value-domain.com/cgi-bin/dyn.fcg?d=jamadam.com&p=XXXXXXXXXXX&h=home' > /dev/null 2>&1

固定IP

interface=eth0
address=192.168.11.2
netmask=255.255.255.0
gateway=192.168.11.1

perlbrew入れようと思ったらmakeコマンドがなかったので、base-develをインストール。

pacman -S base-devel

perlbrew自体をインストール

その後、perlbrew install perl-5.14.2しようと思ったらメモリー足りず。公式ドキュメントを参考に1GBのswapfileを作成。

# dd if=/dev/zero of=/swapfile.img bs=1M count=1024
# mkswap /swapfile.img
# swapon /swapfile.img
# echo '/swapfile.img none swap sw 0 0' >> /etc/fstab

non-rootユーザーでperl-5.14.2をインストール。2時間半かかった。普段は20分で終わるんだけど、やっぱりマシンが非力なせいかな。

$ perlbrew install perl-5.14.2

 

続く

2月
02

mojo-down-monitorっていうものを作った。Mojoliciousの自習と自作プラグインのテストを目的に作ったので、あまり人に勧められるものではありませんが。

自分のサイトがダウンしたことに気づかずに半日放置とかまずいので、以前はSite Alertというサービスを利用していましたが、いい自作ネタだと思ったので作ってみた次第です。

ブラウザ上のフォームでサイトのURLを登録し、URL毎に期待するステータスコードやContent-Type、コンテンツの内容などを設定します。アプリは定期的にサイトをGETし、指定された条件を全て満たしているかチェックします。異常があればサイト毎に指定したメアドに通知します。

Mojoliciousと、ビューの構築用の自作プラグイン「MojoX::Tusu」を使っています。あと、最近流行りのpjaxを真似た仕組みの画面遷移を試してみたりとか、あくまでExperimental。

アプリは下記のように起動。

$ hypnotoad ./script/mojo_down_monitor
Server available at http://127.0.0.1:8010.

停止。

$ hypnotoad ./script/mojo_down_monitor --stop

半月ほど前から、プライベートや仕事で作ったサイトに対して、1分毎にチェックを走らせてみてますが、正常に監視されてるようです。時間帯によって10秒のタイムアウトが頻発するサイトがいくつか見つかったり。

Linuxでは正常に動いてますが、Macの場合はメールが送られないようです。Postfixを有効にする的なひと手間が必要ぽいですが、あまり詳しく調べてません。

12月
16

 

最近の変更点。

  • html-validateオプションが追加され、html自体の構文チェックができるようになった。また、validator-nuとvalidateor-nu-urlオプションにより、validator.nuまたはローカルコピーを利用してhtml5のバリデーションができるようになった。
  • depthオプションが追加され、深度でクロールを制限できるようになった。
  • URLのマッチングオプションが増えて、細かな条件で動作させることができるようになった。
  • レポートが、ページのサイズやmime-typeも報告するようになった。
11月
19

 

mojo-checkbotがHTMLの構文エラーも報告するようになった。XML::LibXMLを事前にインストールすると–html-validateオプションが有効になります。挙動が若干微妙だけど。

11月
19

 

CSSセレクタでgrepするxml-grepっての作った。Mojo::DOMとFile::Findで50行でできた。行番号出したいけど出せない。