あけましておめでとうございます。本年もよろしくお願い致します。
僕は年末から正月にかけて、実家に引きこもっていました。
冬休みの自由研究
引きこもってる間、何か出来ることはないかと考えていました。
普段はAndroidアプリばかり作ってるし、かと言って執筆とかミスをできない仕事をする気にもなれず、なにか気軽に、新しいことをしようと思い、久しぶりにWebシステムに手を出してみました。
そうして作ったのが**「有山家の買い物メモ」**です。
機能
このシステムは、事前に登録したAmazonの商品を定期的に確認。価格が変動して、かつ所定の金額以下(または以上)になれば、メールで知らせます。
その名の通り、我が家の家族(主に母)に向けて作ったシステムなので、他の人が使うことを想定していませんが、せっかくなので公開します。
もちろん、何か不都合があればすぐに公開を止めます。あっさりです。
開発動機
僕の実家では結構な数の犬猫と暮らしていて、彼らのためにトイレ用品やご飯などを定期的に購入する必要があります。分かる人はわかると思いますが、猫砂や犬のご飯は、かさばる上に結構な重さになります。
僕としてはAmazonで購入すれば送料無料だったり、労力や時間の節約になると思うのですが、母は、近所のスーパーの特売がAmazonの価格より安いと言って買い出しに行っています。
このシステムを使って、Amazonの価格が近所のスーパーの特売価格より安い時にメールで知らせるように設定すれば、安いタイミングを逃すことはなくなると思います。
システムの利用にはAmazonアカウントを使います。なぜAmazonアカウントなのかというと、母はAmazonアカウントは持っているからです(新しいIDとパスワードを覚えてもらうのは大変です)。
開発の構成
今回のシステム開発にあたって言語はPythonを使い、Djangoフレームワークで開発しました。
Pythonを本格的に使うのは初めてだったのですが「みんなのPython」を読みながら勉強しました。インデントの世界もなかなかいいものです。
Djangoは非常に良く出来たフレームワークだと思います。ただ、日本語での情報が少ない上に、バージョンアップで少しずつ仕様が変わる。検索すると古い情報が引っかかる。というAndroid現象が起きているのが残念です。
Amazonとの連携はpython-social-authを使いました。対応プロバイダーが多いのが素敵ですね。
今回のシステムも、GoogleアカウントやTwitter, Facebookアカウントでもログインができるようにできたのですが、まずは母の持っているAmazonアカウントに限定しました。
そしてAmazonアカウントで認証する際のRedirect URLが、localhostのときはHTTPでいいのですが、本番運用のアドレスを指定するとHTTPSのアドレスしか受け付けてくれず、泣く泣くSSL証明書を取得したりしました(本当は、自己署名の証明書でも問題なく認証できるのですが、アクセスするときにブラウザが警告を出すのは、さすがにみっともないので)。
Amazon APIから取得するXMLはBeautiful Soup 4を使ってパースしました。このライブラリは直感的に使えてとても便利です。
ただ、SQLiteでテストしていたときは良かったのですが、MySQLにつなぎ替えたら突然UnicodeDecodeErrorが発生したりしました。
マルチバイト文字の時に正しくUnicode型として返さないとかで、結局、Beautiful Soup 4からマルチバイト文字を取得する部分でunicode()を使うことで解決したのですが、この方法で良かったのかは未だに不明です。
デザインはBootstrapを使ってあっさり仕上げました。
サーバーは、商品などのデータをJSONで返すようにしてあります。このJSONをHTMLに整形するテンプレートエンジンとしてHandlebarsを使いました。
ページの挙動はBootstrapと一緒にインポートしたjQueryを使い、スクリプトはすべてCoffeescriptでコーディングしました。
おわりに
久しぶりにWebで、のびのびシステムを開発しました。
PerlでCGIを作っていた頃、と、比べるのは少しやり過ぎかもしれませんが、数年前、Cake PHPでシステム開発をした頃と比べても、作りたいものがある程度形になるまでの時間は格段に短くなっていますね。
もちろん、ある程度形になったものを「きちんとする」には、やはりそれなりの時間がかかるものですが、、、今回の場合、メインターゲットが母なので、母からの要望を受けて改良をしていくのが一番かなと思っています。
人間万事塞翁が馬。本年もよろしくお願い致します。