arveltのソフトウェア技術メモ

Arvelt's software technology memo

SIerのシステムエンジニアがWebサービスをリリースするときに知るべき4つのこと

Webアプリ もうもうおうちかえる! をリリースしました。
http://go-back-home-now.heroku.com/


ソースはgithubで公開しています。
https://github.com/arvelt/go-back-home-now


もうもうおうちかえる!は時間を記録することができるサービスです。
開始時間と終了時間を1日1回押すことができます。
タイムカードとして使えます。作業時間の記録などにもどうぞ。


私はSIerシステムエンジニアとして客先常駐で受託開発をしています。
業務ではサーバークライアントシステムの保守開発などしています。画面がJavaアプレットでできていて、オンライン処理はJ2EE、業務データは夜間にCOBOLバッチで処理されるという、至ってよくあるレガシーなシステムです。


普段の開発に技術的素養など求められません。業務知識の名のもとにifとforを使ってデータを加工する処理を書くだけです。
自分のスキルは身につきません。業務知識が身につく?それは人様のビジネスであり、自分たちのものではありません。
このまま月日がすぎることに恐怖と危機感を抱き。自分で勉強をするようにしています。まずは技術素養から。あと転職したい。Webとかに。



そんな私がWebアプリを開発するまでにやったこと。

1.webを知る。
2.Rubyを知る。
3.Railsを知る。
4.Herokuを知る。


つまり、Railsで作れたよやったねというお話です。
期間は1週間で10時間分くらいずつかけて、5ヶ月くらいだと思います。週末にコツコツ、、、ということはなく、週末はやる気がでずに手につかなかったので、平日の忙しい時に寝る間を削ってやっていた感じです。
参考書のリンクはまとめて下におきました。


1.Webを知る。

Webを支える技術を読みました。


クラサバの開発がメインだったので、Webの考え方を知るところから始めました。
以前にASP.NETの開発をやったとき、Webのことがわからない+ASP.NETがわからないというはさみうちを受けたせいで大爆発した覚えがあります。今回はそもそものところを理解したいなという心積もりでした。
Webサーバーはリクエストにレスポンスを返すだけ。つまり、ステートレスであること、がWebで最も重要なファクターであると認識しました。
セッション管理をしたいという発想自体が実はイレギュラーなんだなぁというのは新発見。
HTTPメソッドは7つしかないからシンプルですごい!でも使うのは2つだけという現実。
RESTfulという理想が現実を侵食するのはいつになるのでしょうか。



2.Rubyを知る。
Webといったらスクリプト言語が熱い。Perl,PHP,Python,Rubyの中からRubyでやってみることにしました。Ruby on Railsというのが凄いらしいというのは私も目にしていましたので。
そこでまずRubyの勉強から。


最初はWindowsにRubyを入れて色々と動かそうとしていましたが、どうにもWindows環境は相手にされていないらしく何をするにも一々引っかかるので断念。初めてLinuxを使って見ることになりました。業務ではSoralisサーバーを使用していましたが、コンパイルやデプロイは決まった手順を繰り返すだけなので理解していなくても使えてしまうのです。
Ubuntuというディストリビューションが初心者向きだという情報を目にしたので、秋葉原で中古ノートPCを買ってきて、そこにUbuntuを入れることにしました。すげえWindowsと全然違う!ターミナルを黒画面に緑文字にしてcdとlsをタカタカタカターンと連打することでスーパーハッカー気分を味わうことができます。

しかしLinuxLinuxで大変でした。apt-getでさくっとインストールができるのはいいものの。なにげなく入れたRubyは1.8。ならばソースからと思いましたが、まず「./」の意味がわからない。なるほど、カレントディレクトリ。しかもコンパイルはできない、あれがないとか、これがないとか。
他にもreadlineがないとかopensslがないとかzlibがないとか。そんな有名どこ以外にも、エラーは出続けました。解決できないまま1週間調べ続けたとかもわりとありました。
あるときRVMというものに気づいて入れてみたりしました。Rubyのいろんなバージョンを切り替えながら使える!すごい!
とまあ、そんな困難をいきつつLinuxでどうにか環境を作りました。Linux使いはこういうのを平気でこなすんですか?怖いです。


Ruby自体については初めてのRubyを読みました。
型宣言しなくてもいいんだなーとか思いながら読みます。ブロック変数とかなかなかわかりづらいです。今もよくわかってないです。
でも型宣言がないせいでわけがわからなくなることも多かったです。あるメソッドをto_sしても動かない、実はそのクラスにto_sはないとか、戻り値は単数っぽい名前だけど、実はリストで返ってくるメソッドとか。そんなんコンパイルした時点で教えろよ!みたいな。え?コンパイルはない?ソウデスカ、ソウデスネ。みたいな気分になったりしました。


手始めにTwitterBotなどを作ったりしました。20行くらいでできたので驚くことしきり。動く擬似コードとはよく言ったものです。
Rubyで書いたCOBOLになってしまわないように、今後はその言語らしい書き方っていうのを学びたいと思います。



3.Railsを知る
Ruby on Rails3 アプリケーションプログラミングを読みました。


いよいよRailsをやっていきます。
本を読みながらコントロールの役割、モデルの役割、ビューの役割、を理解していきます。
scalfordでできる雛形をみて、どの部分が何をしていくかを確認します。
戻り値がリストのときとリストじゃないときがごちゃまぜになり、 NoMethodErrorを死ぬほど見ました。動的型付け怖い。
あとrailsはDBの抽象化が凄いです。テーブルの変更で直接SQLを発行せずに schemeファイルを書き換えるだけとか凄い。さらには、DBのsqliteからPostgreSQLに切り替えてもDb:migrateで元通りとか凄い。このへんは感動しました。
ところでRailsってビューに<% %>タグがいっぱい入ってくるのがなんか気持ち悪いです。
ビューにロジックが入らないようなフレームワークはあるんでしょうか。JSPも不思議なタグばかり増えて結局よくわからないとかになりがちでしたし。


なんとなくRailsがイメージできたら仕様を起こします。
そして実装。テストは手動。テストコードというのがよくわかっていません。
自動テストと継続的インテグレーションについてはこれから要勉強。プロセスの改善が一番大事なのに、実務でも一番おざなりにされちゃうところですね。


設計書はこんな感じ。
https://docs.google.com/document/d/1GSoh7_C-Tc3i24Y8tVsXfP3zemFSQBpJlaakGxSDzMk/edit
ER図はこんな感じ。
https://cacoo.com/diagrams/AMA1akPwYuAjk1gh
テスト仕様はこんな感じ。
https://docs.google.com/spreadsheet/ccc?key=0Ah1Ig-8wiHGzdHMxSV9QaGlfNmxtNndKZzEyblZDUnc


4.Herokuを知る。

完成したアプリを公開します。
選んだのはHeroku。最初はさくらのVPSに載せようとしていました。
apacheいれてpassenger入れれば確かに動きます。
しかし最初の設定は楽しくても、運用保守を考えると面倒になる。ということに気づきました。
アプリケーションは作っておしまいではなく、使い続けてもらうことに価値があります。
このアプリがそれほど大上段な価値を提供できるか、という問題はおいておいて。ちなみにvpsはvpsで結局借りて、apache入れてみたりして遊んでいます。



Herokuは参考書などは特に無いので、公式のチュートリアルを見たり、ぐぐったりしてトライエラーでやっていきました。
HerokuにRailsを載せるさいに気をつけたことはすでに記事したのでポイントを。
RailsのデフォルトはSQLiteだけどHerokuはPostgreSQLなので要設定。
・Production環境ではCSSのプリコンパイルが必要な場合がある。
・HerokuはGitのリポジトリをPushすると公開されるので、Gitによる管理が必要。


ちなみに、ソースをgithubに乗せたので、oauth認証のIDなんかは環境変数から取り出すようにしています。
最初はtwitter認証もできていたのですが、最近の変更でよくわからないことになったようなので、twitter認証は外しました。変わりにfacebook認証でもつけようかなー。



Webアプリを作るまではとりあえずこんな感じでした。
やってみると自分が知らないところがたくさんあることに気づきました。文学部出身で会社に入ってからプログラミングを覚えたので、なかなかうまくできるようになりません。もっと息をするように勉強できるようにならなくてはいけませんね。他の作ったものはこのへんのpruductにおいてあります。


企画から設計開発保守までを独力できるような人を目指してこれからもがんばります。


Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)


初めてのRuby

初めてのRuby


Ruby on Rails 3 アプリケーションプログラミング

Ruby on Rails 3 アプリケーションプログラミング