コンピュータシステムの現場というのは実に色々あって、エンジニアの飲み会なんかでは"弊社の酷い環境"なんて話題がよく酒の肴になります。

  • 前任者のスパゲッティコード
  • テストが無く、デグレしまくるコード
  • バージョン管理されていないコード
  • バックアップされていないデータ
  • sshでログインできないレンタルサーバ
  • 穴だらけのセキュリティ
  • 実際の仕様とは乖離して久しいドキュメントの更新作業
  • プロプライエタリなOS
  • 古くさい言語
  • 貧弱な処理系

web上や技術雑誌、書籍にある様な最新でスマートな技術、歴史があり学術的裏付けもしっかりした環境。勉強熱心でそうした情報に詳しいエンジニア程、理想と現実の乖離にストレスを感じることでしょう。

こんな泥臭い環境では俺/私の洗練された

「Mavenを使った統一されたプロジェクト管理とビルドプロセス」

とか

「言語内DSLを使ったスマートなメタプログラミング」

が生かせない。ここは自分の働く場所ではない。

しかし、そんな理想的な環境は滅多にありません。

「とんでもない貧民街に生まれついてしまった。」と嘆いたところで、実際"地上の大半は砂漠で、地表の7割は海である。"みたいなのが現実だったりしないでしょうか?

しかし、むしろそんな環境こそ、プログラミングやオープンソースの力を使って劇的に環境を改善できる腕の見せ所であり、とっても楽しい作業なのかもしれません。

そんな時に頭に思い浮かべるのが、レガシー改善の鉄則、

「1回のBestよりBetterの積み重ね」

「つまらない・面倒な仕事は技術的問題にすり替えると楽しい」

という二つの言葉です。

地道な改善

web系ベンチャーに絞って言うととりあえず、

  • バックアップされてない
  • バージョン管理されてない
  • テストされてない

というところに入って行って何とかしなければいけないという場面が多い気がします。優先順位から考えるとバージョン管理システムの種類とかプログラム言語の種類は変更の手間の割に重要で無く、兎に角、何人月・何人年も書けてきたコードやデータの消失や不具合に起因する障害が一番の問題だと思います。

rsyncを使ったバックアップ

幸運にもsshアクセスが可能なレンタルサーバーでサイトが稼働している場合はrsyncを使ったバックアップがとても手軽です。下記の様なスクリプトを用意し、cronで1日1回バックアップを取ります。(鍵を登録して置いて)

backup.sh:

#!/bin/sh

if [ ! $1 ] || [ ! $2 ]
then
echo "Usage: backup.sh REMOTE_DIR BACKUP_DIR"
echo "Example: backup.sh foo@example.com:/home/foo/public_html /var/backups"
exit 1
fi

REMOTE_DIR=$1
BACKUP_DIR=$2
TODAY=`/bin/date '+%Y%m%d'`
YESTERDAY=`/bin/date --date='1 day ago' '+%Y%m%d'`

[ -f $BACKUP_DIR/$YESTERDAY ] || mkdir -p $BACKUP_DIR/$YESTERDAY
[ -f $BACKUP_DIR/$TODAY ] || mkdir -p $BACKUP_DIR/$TODAY
cd $BACKUP_DIR/$TODAY && rsync -atrzv --delete --link-dest=../$YESTERDAY $REMOTE_DIR .

UNIXイズムの継承者から言わせれば、「GNUのやり方に汚染された節操のないオプション」という感じかもしれませんが、最近のrsyncにはPlan9のdumpfsみたいなハードリンクを使った差分バックアップができるオプションがあるそうです。(via g:id:g000001)

$ rsync --link-dest=ハードリンク元 コピー元 コピー先

という様に指定するとリモートのディレクトリをハードリンク元を参照しながら差分だけバックアップしていくことができます。(変更の無いファイルはハードリンクが作成される。)

さくらインターネットの500円プランを使っているfjord.jpの例で行くと下記の様な感じになります。

0 5 * * * /usr/local/bin/backup.sh fjord@fjord.jp:/home/fjord/www /var/backups/fjord.jp

このオプションの実装は結構最近の事らしいのでベテランのrsyncユーザーは逆に意外と知らないかもしれません。

ftpしかアクセス方法が無い環境では、lftpで一度ローカルに持ってきてから同じ事をすれば大丈夫だと思います。(lftpにはftpプロトコルでrsyncのようにディレクトリを簡単にmirrorするコマンドがあります。)

fjord,llcではベンチャー勝ち組セットのサーバーにバックアップして、sambaでリードオンリーでLAN内に公開しています。これならデザイナーさんでも使い易いと思います。

XREAのsshアクセス

XREAは無料or格安でWordPressが使えるレンタルサーバーとしてホビーユースやデザイナーの方にも人気のあるレンタルサーバーです。ここ最近のXREAは有料ユーザーを含めて、障害に対する対応や安定性にかなり問題があるので仕事で使うなら別のレンタルサーバーへの引っ越しをおすすめしますが、「そんなことが出来る立場なら苦労しねぇんだよ!」という方も多いと思いますのでXREAでのバックアップ方法を。

XREAではsshアクセスするのに"30日に1度、管理画面からリモートアドレスを登録する必要がある"という面倒な制限があります。Mechanizeを使うのもどうにも面倒です。この管理画面の登録フォームは非sslな上にGETメソッドを許容するのでwget等でアクセスするだけで事足りてしまいます。(via g:id:g000001)

(リンクを辿っていく通常の管理画面は非sslだけど、ssl経由でもアクセスできる。)

0 5 1 * 1 wget "http://www.sサーバー番号.xrea.com/jp/admin.cgi?id=ユーザーID&pass=パスワード&remote_host=アクセスするホストのアドレス&ssh2=on" -O /dev/null
0 5 1 * 1 wget "https://ss2.xrea.com/www.sサーバー番号.xrea.com/jp/admin.cgi?id=ユーザーID&pass=パスワード&remote_host=アクセスするホストのアドレス&ssh2=on" -O /dev/null

上記の様な感じで念のため週に1回アクセスする様にすればあとはさくらと同じ様にバックアップできます。

データベースのバックアップ

DBはほとんどの環境でmysqldumpが使えるので普通にバックアップできます。そうでないところはphpMyAdmin等のwebインターフェースがあるのでそこからのバックアップを自動化します。

水面下で進める

これらの作業は職場で発言権が無い時はメインの業務をこなしつつ同時に水面下で進める必要があります。(それまで基本的なことを行ってこなかった職場でその作業の必要性を説くのは非常に困難です。データ消失などの事件があったときに颯爽とリカバリーして見せた後なら簡単に有効性を理解してもらえるでしょう。)

メイン業務の合間にやるので最小限の手間で最大限の効果を得る必要があります。そこがパズル的でもあり、面白いところだと思い込んでやると楽しいと思います。

関連

参照

kawaduに言われてNAS上に固めてあったplnet.jpのソースを引っ張り出してきてgithubにアップした。

昔のソースは恥ずかしいけど、当時の俺のPHP4愛が注がれたコードを読んでみた。

何か、コードのテンションが全然違くて、兎に角書く!という感じ。

最近の俺は、ちょうどいいライブラリが無いだの、良い設計が思い浮かばないから実装しないだの、日和ってるなと。

「ライブラリが無いなら書けばいいじゃない。パンが無いなら(略」

「書くの?書かないの?書かないとしたら何時書くの?」

と当時の自分に劇詰めされてる気分になった。コーディング瞬発力が落ちてる。

元々俺は、ある種のトラウマから独自実装を病的に嫌う傾向があるんですが、それと怠惰が合わさり最強に見える。暗黒が持つと頭がおかしくなって死ぬ。

もっとガリガリガリガリ書くようにしよう!

参照:

アクトインディ株式会社のwebデザイナー募集のお知らせ | マチダの秘密ノート

webデザイナーの方を激しく募集しています。当ブログの様な腐ったサイトをごらんの方はどうしようもない鬱病のエンジニアばっかりだと思うので、僕はwebデザイナーへの接点がありません。まるで地球上からwebデザイナーが死滅してしまったかの様に。このままでは弊社社員を占める割合でCommon Lisperの方がwebデザイナーより多くなってしまうという未曾有の危機を迎えています。

ごらんの皆様方のお知り合いなどでwebデザイナーの方がいらっしゃったら何卒、何卒・・・。

夜猫

ビニール袋の音で誘き寄せてパシャリ。

ごめん、この中には蒼天航路11巻しか入ってないんだよ。

ニコ厨の俺歓喜。ついげきの貼り付けでダメージは加速した。

GAEOでルート('/')へのroutingを指定したい場合。(デフォルトはWellcome#index)

# main.py
def initRoutes():
    r = router.Router()
    r.connect('/', controller='top', action='index')
    r.connect('/:controller/:action/:id')
    r.connect('/:controller/:action/:id.:format')

railsノリでこう書いても駄目。(GAEO 0.3の話)

# main.py
def initRoutes():
    r = router.Router()
    r.root(controller='top', action='index')
    r.connect('/:controller/:action/:id')
    r.connect('/:controller/:action/:id.:format')

こう書かなきゃ駄目。(railsの場合はどっちでもOKなのでちょっとハマッた)

GAEOのroutingは200行程度なのでgaeo/dispatch/router.pyを読めばすぐわかりますな。

Google App Engine の一般的質問 - Google App Engine - Google Code

SSL(HTTPS)を Google Apps ドメインの App Engine で使用できますか

Google App Engine のすべてのセキュアなトラフィックは、appspot.com ドメイン(https://your-app-id.appspot.com)から提供される必要があります。アプリケーションを Google Apps ドメイン以外から提供している場合、すべてのセキュアなトラフィックをアプリケーションの appspot ドメイン経由で転送する必要があります。

なんと。

独自ドメインでSSL使えないんだったら殆どの仕事で使えなくない?

要は、"セキュアな通信が簡単に行える環境"が無いのであれば使えないよねえ。

改善か代替案が提供される予定が無いんだとしたらやっても意味ないからどうなる予定なのか気になるなあ。

どなたかご存じでしょうかー。

2009/11/03 追記

Issue 792 - googleappengine - SSL/HTTPS Support on Google Apps domains - Project Hosting on Google Code

Per Issue #15 , SSL/HTTPS is available on *.appspot domains.

We also need it on arbitrary Google Apps domains.

とっくにAcknowledgedなIssueが上がってるんですね。

技術的にはSNI使えば楽なんじゃないかってことでこれがStartedになることはありえそうですね。(みんなでStar押そうぜ!)

現状ではEC2をproxyにして使ってる野郎どももいるみたいですが、こりゃ面倒ですな。

% dev_appserver.py .
INFO     2009-11-01 17:55:28,394 appengine_rpc.py:157] Server: appengine.google.com
INFO     2009-11-01 17:55:28,401 appcfg.py:348] Checking for updates to the SDK.
INFO     2009-11-01 17:55:28,959 appcfg.py:362] The SDK is up to date.
WARNING  2009-11-01 17:55:28,960 datastore_file_stub.py:443] Could not read datastore data from /var/folders/GS/GSaHrqM6HwiPHzeXj3bhL++++TI/-Tmp-/dev_appserver.datastore
WARNING  2009-11-01 17:55:28,966 dev_appserver.py:3370] Could not initialize images API; you are likely missing the Python "PIL" module. ImportError: No module named _imaging
INFO     2009-11-01 17:55:28,971 dev_appserver_main.py:478] Running application docs on port 8080: http://localhost:8080

GAEをローカルで立ち上げる時にいつも出てるPILが無いとかいうエラー。「なんぞこれ」ということでググったらImages系の機能は本番上にあるのでローカルでは動かないのだとか。PILというライブラリを入れればローカルでも動くらしいので入れた。

% sudo port install py25-pil
% dev_appserver.py .
INFO     2009-11-01 18:01:04,527 appengine_rpc.py:157] Server: appengine.google.com
INFO     2009-11-01 18:01:04,534 appcfg.py:348] Checking for updates to the SDK.
INFO     2009-11-01 18:01:04,906 appcfg.py:362] The SDK is up to date.
WARNING  2009-11-01 18:01:04,906 datastore_file_stub.py:443] Could not read datastore data from /var/folders/GS/GSaHrqM6HwiPHzeXj3bhL++++TI/-Tmp-/dev_appserver.datastore
INFO     2009-11-01 18:01:04,974 dev_appserver_main.py:478] Running application docs on port 8080: http://localhost:8080

ひゃっほい

しかし意味はわかるけどdatastoreが無いってのも何とかならないのかな?

多言語、多フレームワークを見ていると、Webアプリ開発に欲しい機能の本質がわかりますな。

  • Packagingシステム
  • ORM
  • Routing
  • Templateのパーツだけでなく、枠を共有する機能
  • Deployツール
  • Migration
  • TestSuite
  • Plugin機構

僕にもSyntaxの好き嫌いはありますが、まずは上記の機能をもってるかどうか。中でもMigrationは結構贅沢な部類ですな。