Perl の勉強をしていて、うぇっぶサービスを手作りするのをやってみた。実は仕事以外でまともに動くものを作ったのは初めてで、こんなことでこの先生き残れるのか不安だ。
概要
Amazon のほしいものリストを管理するやつで、趣味としていろんなものを送りつけているのだけれど、公式のやつが名前出てない人がいたりして、これまでテキストファイルでリストを管理していた。けっこうめんどくさいのと、誕生日を覚えてなくてミスることがあったので、ミスらないように自動でやってくれるようにした。
URL を入れてエンターを押すと、タイトル、名前、説明、誕生日を勝手に取得してくれる。リストは誕生日が近い順で並んでいて、10日以内だと10日後
みたいなのを出してくれるようにした。これでミスらない。開発中に明日が誕生日の人を発見したので送っておいた。
また、UI としてどうかという問題があるけれど、テキストフィールドを2つ用意するのが微妙だったので、URL 入れるところに検索ワードをを入れるとインクリメンタルサーチが出来る。これで誕生日以外のめでたい時にも対応出来る。
リストを公開したいという話もありそうだけれど、ほしいものリストの情報はセンシティブ*1だと思うので、自分のものだけしか見えなくした。ただし、僕には見えるので、隠したい場合はローカルか自分の Heroku で動かして欲しい。
開発
構成ははてなのインターン研修用のものを参考にさせていただいた。生の Plack とその他モジュールを組み合わせて手作りしていく。WAF しか使ったことがなかったので勉強になった。
シンプルなものなので最初は二日くらいで出来る見積もりだったけれど、丸三日かかってしまった。初日で基本的な枠組み。二日目で認証と React.js を使った UI 周り。三日目で仕上げとデプロイという内訳だった。
JS の監視とコンパイルは Gulp を使ってみて、あー、これがういうくんが言っていたやつかと感動していた。Browserify と Reactify で JSX のコンパイルとがっちゃんこ、Uglify でミニファイをやっている。
この記事が参考になった。
plackup
の自動リロード機能と Gulp があればエディタで書いてすぐに確認出来るのでべんり。
$ plackup app.psgi -r -Rlib
デプロイ
http://www.songmu.jp/riji/archives/2013/05/perlwebheroku3.html
songmu さんの記事をとっかかりに、試行錯誤してなんとかなった。
Buildpack だけれど、Miyagawa さんのものをフォークして、今回のディレクトリ構成に合うようにした。ロートディレクトリに app.psgi
がある想定だったのを、script/app.psgi
に変更した。Rails でも config.ru
はルートディレクトリなので、今度からはルートディレクトリに置くようにしよう。
必要なモジュールは cpanfile
にまとめておく必要があるのだけれど、Carton とかを使いこなせていなくて、use
を grep して作ったら、Plack のミドルウェアが抜けていた。あと、LWP::UserAgent で SSL 通信するのに、LWP::Protocol::https
が必要だった。
あと、ログも最初は File::RotateLogs
と Plack::Middleware::AxsLog
を使って普通にファイルに出力していたけれど、Heroku だと標準出力に出す必要があってハマった。
感想
仕組みを知らないといいものは作れないが、仕組みを知らなくてもそれなりのものが出来る Rails すごいし、関係者の皆様方への感謝の気持ちが強くなった。あと Rails の API はやっぱりかっこいい。
Perl はシンプルなものを組み合わせて作っていくというのが、レゴブロックのようでそれはそれでおもしろい。問題が起きたときにそれぞれがシンプルなので対応しやすいのも良さそう。ただ、かっこいい API は作りにくいイメージ。(Perl 力が足りない)
みなさんのほしいものリスト教えてください。
追記
「テストは?」「あっ、はい。」
一応ここでデモが動いてる。 https://iwai.herokuapp.com/
*1:リストに無いものも送れるので嫌がらせにも使える。