花京院の続き。

"プログラマーとして困る"というのはみみっちい話だけど2点ある。(両方個人的な話で、「俺は関係無いな」という人も沢山いると思う。)

プログラマーの価値が下がる

超大雑把に言うと、IT業界のエンタープライズ系・コンシューマ系は、

  1. 垂直統合型の時代
  2. 水平分業型の時代
  3. オープンソースの時代
  4. Googleの時代

って感じだと思う。1、2の時代はある程度鉄板ソリューションがあったんだけど、オープンソースが仕事にも使える様になってきて、プログラマにコーディングだけじゃなく、カオスな中からソリューション自体を選ぶ目利き的な事も期待されるようになった。

それが全部Googleでいいんでしょ?ということになるとIDEやフレームワーク、ミドルウェアなどもGAEに特化してきて今よりプログラマーの差異は小さくなる。(カオスな中をHackして一刀両断に問題解決するのが醍醐味だったわけだ)

多様性が減るとつまらない

プログラムは仕事と同時に趣味でもあるわけだけど、オープンソースが上手い具合にGoogleに誘導・操作されると多様性が無くなってつまらない。

同じジャンルに沢山のプレーヤーがひしめいて、パクりパクられ、鎬を削って、時には"誰得"的なものもあって、煮詰まりつつじりじりと全体のレベルが上がってきてある時、ポンッ!みたいのが面白い。

わがまま

要は業界が成熟してきたっつーことなんでしょう。黎明期を回顧する典型的おっさんなんですが、オープンソースでその成熟が思い切り予想外の方向にすっ飛んでいったのを見ると軌道修正されてGoogleに集約されずに行く方向は何か無いのかなあと思っちゃうわけです。

真面目に考えると、インフラをどうにかしないと変わりそうにないですな。SETIやFONみたいにP2Pか相互幇助なハードウェアリソースの上で動くレイヤーを開発する?難しそうだなー・・・。

関連:

Hpricotで良いなと思ってたのが、"クラス名と同名の関数にデフォルト動作をさせる"というやつ。

class Foo
  def initialize
    puts "new"
    # code...
  end

  def fetch
    puts "fetch"
    # code...
  end

  def send
    puts "send"
    # code...
  end
end

def Foo
  foo = Foo.new
  foo.fetch
  foo.send
end

こんな感じでFooクラスにFoo関数を作っておく。

% irb -r foo
>> Foo()
new
fetch
send
=> nil

普通こういう場合Foo.run!とかを用意するけど、クラス名をとりあえず実行してみればいいというのは楽。変数と関数の2値を持てるところを利用してるんだけどシンプルで好きだ。

このパターンの名前みたいのあるのかな?

Life is yak shaving: GAEOに関するレポートを公開しました

Twiiterの知り合いでkomagata氏に、GAEO(Google AppEngine Oil)の調査をご依頼いただいたので、調査してましたがGoogle Codeにそのレポートと簡単なサンプルを載せてありますので、ご興味のある方は見てください。

gae-reports - Project Hosting on Google Code

Python迷子のkomagataです。

GAEで利用できるフレームワーク調査とGAEOのサンプル作成をnaokitsさんにお願いしてたんですが、とても分かり易くまとまっているのでGAEやPythonの大海原で溺れている情報弱者の俺の様な人はとても参考になると思います。特にGAEOは何か日本語情報少ないですからね。

フレームワークといってもdjangoなどのハードなのとは違ってwebappとかDatastoreとかをちょろっと薄皮かぶせた様なもんで、行数自体少ないのでソースを全部読むのもそれほど苦じゃない感じです。(pythonは特に他人のコード見易いですし、railsなんかより全然小さい。)

お仕事依頼したのは人助けみたいなものだけじゃなくて、

  • python歴1週間未満だったジャパン価格の人日単価の俺が調査するよりiPhoneやGAE, Pythonに習熟しているnaokitsさんにお願いした方が遙かに合理的。
  • 海外の方にtwitterのみで依頼するというスタイルは今後のためにも以前から試したかった。
  • 会ったこと無いひとにリモートでの仕事依頼は何度もやってるのでリスクは感じなかった。
  • プログラマーというだけで無条件で好きなのでそういう人の助けになりたい。
  • 盗難にあったnaokitsさんも助かる、GAE, Pythonに詳しい人に調査してもらえて僕も助かる。という状態なのでやらない理由が見つからない。

ということでtwitterのTLでみた3分後ぐらいに依頼しました。正直、会ったこと無い人に何回も仕事依頼してますが、コード見れば一発で素晴らしい仕事をしてくれるかどうかはほぼ100%わかるし、今のところその通りになってます。逆に履歴書・職務経歴書は12%ぐらいしか参考にならない。

実際に依頼する手順としては依頼内容と金額と口座を聞いてネットバンクから振り込むだけ。まったく手間かかりません。

naokitsさんの仕事は上記の内容で確認して頂けると思います。それ系の仕事依頼したい人はiPhoneもOKなのでtwitterで気軽に依頼してみてはどうでしょうか。(naokitsさんのtwitterアカウント:naokits (naokits) on Twitter

参照:

% sudo gem install holiday_jp -s http://gemcutter.org
% irb -r holiday_jp
>> pp HolidayJp.between(Date.new(2009, 1, 1), Date.new(2009, 2, 1))
[{:name_en=>"New Year's Day",
:week=>"木",
:date=>#<Date: 4909665/2,0,2299161>,
:name=>"元日"},
{:name_en=>"Coming of Age Day",
:week=>"月",
:date=>#<Date: 4909687/2,0,2299161>,
:name=>"成人の日"}]

日本の国民の祝日を返すgem作りました。ベタです。

参照

瀬戸内海の漁師の続き。

GAEが出た時、

「スケールするつってもそんな大量のアクセスこないしなぁ。月100万PVぐらいまでならさくらの7800円(専用サーバー)で行けるんじゃないのかな?」

なんて思ってた。そんな風に考えてて触ってすらなかった。花京院風に言えばコチコチのクソ石頭の持ち主だった。ところが一年半近く遅れて最近触ってみたところ、なんかスゲー簡単だし、ほとんどのWebサイトは無料で行けるぐらい無料ゾーンが広い。

どうやらGoogle様の意図は俺の思ってたのとは違うらしい。

高性能な分散環境にばかり注目していたが、GAEはある意味、"無料サーバー"なのだ。GAEには"0円"から"格安専用サーバー1台程度"までを全てリプレイスできちゃうような無料レンタルサーバーサービスという側面がある。"WordPressが動く広告も無い無料レンタルサーバー"があったらみんな使うだろう?MySQLとSQLiteの区別が付かない人がWordPressとPython製のGAE対応CMSの違いを気にするだろうか?

前提知識をゼロとすると、FTPと会社毎に違うコンパネ画面を使うよりGAEの方がよっぽど簡単じゃない?GAE上のオープンソースソフトに中国製が多い気がするんだけど、その辺りにメリットを感じてるんじゃないのかな。GAEは激安(無料)、超高品質(安定+無限にスケール)、簡単。安い・美味い・速いを冗談じゃなくて提供してる。

Google様は"際限なくスケールする必要のある大手サービス"だけでなく、儲からない"個人・中小企業のサイトや小さいサービス"も全てGAE上に乗せようとしている。何故そんなことをするんだろうか。(Amazon EC2はロリポユーザーをターゲットにしてないでしょ?)

"大手と個人・中小を全部カバーする"

要はmixiとアメブロとさくらとロリポのインフラがGAEになったら殆どのユーザーはGoogleにアクセスしてることになる。

何が起こるかっつーと、Googleはクロールとかまどろっこしいことしないでも自分とこのデータを解析すれば格段に高品質の検索サービスや広告配信サービスを提供できるようになる。

殆どのサイトがGoogle上にあったら他の検索エンジン勝てるわけないよねぇ・・・。同じ事やろうったってソフトはできても世界一安価なデータセンターはすぐには真似できない。出たばっかのころのGoogle Appsを会社のメインに導入するのって結構チャレンジャーって感じだったけど、今やITベンチャーでは使わないところには特別な理由が必要な感すらある。そんなノリで会社のページをGAE上に作るのに何の抵抗も無いって状態すぐに来そうじゃない?だって無料なんだし。

GmailとかGoogle Appsって何であんなにふとっぱらに使わせてくれるのかなとか思ってたけど、"ネット上の全サイトGoogle移行計画"の途中で出来た単なる副産物だったとしたら恐ろしいよねぇ。(そこまで最初っから決まってたとは思わないけど、80%ルールで、頭良い人ばっかりの会社で延々とプレゼン大会状態が何年か続いたら自然とそんな野望が出てきそうな気はするw)

「グループウェアだけじゃなく、会社のウェブサイトも無料でできちゃうのかー、そりゃいいね!」

って感じで大体の人には良いお話だと思う。しかし、プログラマーの俺としては困る部分もある。

つづく・・・

関連:

RubyのTimeはデフォルトで現在時刻を返すんだけど、Dateはデフォルトでユリウス暦元日を返すんですな。

% irb --simple-prompt -r date
>> Time.new
=> Mon Nov 16 21:34:22 +0900 2009
>> Date.new
=> Mon, 01 Jan -4712

俺の中では現代からいきなりスリーハンドレッドのレオニダスみたいなマッチョが剣と盾持って暴れてる世界に飛ばされたイメージ。

俺「紀元前4712年なんて随分昔ですよねえ?」

レオニダス「あ”ぁぁあ”あ”ぁぁぁあぁぁぁ”あ”ぁ”ぁぁぁ!!!!???」

俺「Date#todayというメソッドを作って、デフォルトは今日の日付を返してくれると便利だと思いませんか?」

レオニダス「うぃおあえをfなdfす;あsぢfばあlwfなうぇおうfないうぇbふぃうやwふぇやsdfb!!!!!!!!!」

300〈スリーハンドレッド〉 [DVD]
  • 300〈スリーハンドレッド〉 [DVD]
  • ワーナー・ホーム・ビデオ
  • ワーナー・ホーム・ビデオ
  • (原著)フランク・ミラー
  • (その他)フランク・ミラー
  • 定価:¥ 1,500
  • 新品価格:¥ 1,198
  • 中古価格:¥ 419
  • ASIN:B001ALQXEK
Coffee

おわかり・・・いただけただろうか・・・。

画面中央にはっきりと写った、霊の姿を。

未開封の缶コーヒーの怨念が写り込んだとでも、言うのだろうか・・・。

デザイナーのmachidaさんと話していて、"エンジニアによってスキル・給料・モチベーションがバラバラで分かりづらい"的な話しを聞きました。

というよりもっとはっきり言うと、

「高い金取ってポンコツシステム作ってくスーツの奴は何なんだ。」

という事っぽい。

これは耳が痛い話ですが、下記のようにプログラマーには3種類居ると考えてはどうかと話した。

  • 土日にコードを書く人:ホビイスト
  • 平日にコードを書く人:インダストリアルプログラマー
  • 365日コードを書く人:ハッカー

また、プログラミングには産業的な側面と文芸的な側面の両方があるので分かりづらい。

産業的な側面からみて土日も勉強しているのはとても熱心な人だということになるけど、文芸的な側面、例えば音楽をやってる人にすれば土日練習するのなんて当たり前。

僕らは現状のスキルが無くてもホビイストを探してる。求人市場にはスキルの高いインダストリアルプログラマーが沢山いる。

machidaさんを混乱させているものと従来の求人方法が上手く行かない原因は同じところにあるのかもしれません。

Wakame 1.0開発者の募集を締め切りました。 | やむにやまれず

Wakame 1.0ではデータセンタで供給すべきスケールアウトのためのインフラからユーザアプリケーションまで垂直に提供できるようになる予定です。

すべての開発者に、開発時から使えるプログラマブルなデータセンタと、運用を楽にするシステムオートメーションを。

クラウドっつってもAmazon EC2みたいのじゃなくてGoogle App Engineみたいに自動でスケールしないと意味無いですよね。要するにどんな規模になってもインフラ専属エンジニアが一人もいらない環境じゃないと意味無いと思うんです。(インフラエンジニアはユーザー企業側ではなく、クラウド提供側に移る)

専用サーバーが定額から従量性に変わっただけの現状の国産主要メーカーのサービスは意味が無い。国産主要メーカーがGAEみたいなのを提供するには、現実的にはパッケージが必要で、Wakame以外に僕は聞いたこと無いんですが、こういうパッケージは絶対必要だと思います。

その上でビル型のデータセンターでコンテナ型データセンターにコスト的に対抗しなきゃいけない。インフラに関わる人は、ソフト面、ハード面でこれに勝つ方法を必死に考えるか、瀬戸内海で漁師をやるか、ある程度真面目に考えないといけない。

僕らプログラマも今までの技術の大半をポイッと捨てて、色々覚えないといけないかもしれない。

来年か再来年の4月頃のWeb+DB Press恒例の新人特集はGAEさえ覚えればLAMPとか覚えなくていいよって事になってたら面白いですね。

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

  • 前任者のスパゲッティコード
  • テストが無く、デグレしまくるコード
  • バージョン管理されていないコード
  • バックアップされていないデータ
  • 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インターフェースがあるのでそこからのバックアップを自動化します。

水面下で進める

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

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

関連

参照