kiwamu日記 このページをアンテナに追加 RSSフィード

2009-10-08

JJUG CCC 2009 fall に行ってきました

スーパー台風が直撃し、山手線をはじめ主要交通機関が全面的にストップするなか、CCC は午前中 30 分遅れになったものの、基本的につつがなく進行。すごいよ。

頓知・の井口さんの基調講演に何とか滑り込み、セカイカメラの野望を聞きながら、会場にペタっとエアタグを貼ったりしていました。 :-p


午後のセッション最初の、日経BP社 / 日経コンピュータの中田敦さんのお話が個人的にはとても楽しかったので、少し詳しめにメモを残しておきます。

# 聞き間違いや勘違いがあるかもしれないので、ご容赦ください。


データセンター視点で比較したクラウドの内側

  • Google の先進性
    • 2006年に Project Black Box を Sun が発表したとき誰が使うの?と思ったが、
    • 実は 2005年 11月から Googleはすでに運用していた!?
    • 去年の今頃には、潮力発電の水上型データセンター特許をとっている...
    • もうできつつあるのかもしれない
  • 電力利用効率
    • PUE
    • 冷却コストが高いほど値が大きくなってしまう
    • Google は 1.2 を実現
    • 日本の標準的なデータセンターは PUE 2.3 - 2.5 とか
    • IBM の最新鋭で 1.8、日立の最新鋭で 1.6
    • でもこれは計画値であり、データセンターが満床にならないとだめ
    • Google はすでに実測値なのがすごい
  • Amazon
    • データが公開されてないので規模を推測してみた
    • Rackable System (現 SGI)のサーバ売上 2億5千万ドルのうち 35% が Amazon
    • 1年で 2万5千台くらい調達しているはず
    • となるとデータセンター的には 7-10万台くらいあるはず
    • 最近は Amazon も自作をはじめたという噂がでている
  • MSシカゴデータセンター
    • コンテナ 112台 (当初は 200台の予定だった)
    • サーバ 22万4000台 (予定は 50万?)
    • コンテナ型をつかう理由
      • 冷却効率がいい
      • ラックにマウントするコストがばかにならない
      • 年間何十万台もデプロイできない
      • どーんと駐車場のような広い場所にコンテナを並べるだけ
    • 第四世代データセンター構想
      • 建物もつくらずにコンテナを野晒しでおくだけ
    • HP, DELL, IBMGoogle を 3年遅れくらいでおいかけてるのが現状
  • The Data Center as a Computer
    • 今回のネタ本w
    • 日経BP社から翻訳決定、年明けくらいにでる
    • 原著の訳に加えて、MapReduce とかの論文も入れたいそうな
    • ちなみに原著の PDF 版は無料で公開
  • チラーレス
    • Googleベルギーのデータセンタはチラータワーがない
    • 高いとこに水を運んで落とすことで気化熱で冷ます、これがチラータワー
    • ベルギーみたく水が豊富なとこではそれが不要
    • 川から水をひいてあっためたまま返すのかな? (^^;
    • さらに、寒いとこにデータセンターつくることで冷却コストなしにしようとしてる
  • Google にとっての障害 (上から順に重い)
    • 喪失、データが再生成できない
    • 未到達、サービスがダウン
    • 劣化、サービスは使えているが劣化している状態
    • 隠蔽、S/W H/W で問題をカバーできてる状態
  • スループット指向とレスポンス指向
    • 両立できないといけない
    • MapReduce がうまくいくのは数千台が連携しながらもうまくいける対障害性

From SQL way to Bigtable way by ひがやすをさん

  • Bigtable 使ったことあるのは会場の 3割くらい
  • Bigtable の制限にどう対応していくか
    • Join 使えないよとか文句言ってると、それ RDBMS
    • atomic put や atomic get の話
    • index や table の話
    • 複雑なクエリAPI で取得して、オンメモリでがちゃがちゃ

クラウドにおけるスケールアウト設計を掘り下げる by 萩原正義さん


クラウドアプリケーションのつくり方



最後はライブコーディングを少し覗きつつ、引きあげてきましたー。slim3wicket のライブコーディングが見れたのは面白かったです。

スタッフの皆様、講演者の皆様、おつかれさまでした。

2009-10-01

入籍二周年

早いもので入籍してから 2年がたちました。二人がはじめて出会ってからはちょうど 7年です。


2558 日。

たまに喧嘩もしましたが、仲良く元気にやっています。 (^^)v


f:id:kiwamu:20091001004148j:image



今夜は花束を買って帰ろう。


入籍日一周年

2009-09-02

Redmine で添付ファイルはデータベースに格納しないの?

先日の記事でもちょっと書いていましたが、Redmine ではチケットへの添付ファイルや文書の登録、また Wiki に貼り付けた画像やその他の添付ファイルは、REDMINE_ROOT 以下の files フォルダに格納されます。

チケットへの添付ファイルの追加

  • (snip)
  • 添付ファイルは REDMINE_HOME のfiles 以下にファイル名に prefix をつけて格納される
    • これは文書やそれ以外での添付のときでも同じ

改めて考えてみると、添付ファイル等だけがディスクで管理されるのは、以下の問題があるようにも思えてきます。


データベースだけでなく files 以下も忘れずにバックアップしないといけないのは微妙に面倒ですし、クラスタを組んだ場合にローカルディスク管理の添付ファイルをほかのインスタンスからどう参照するか? といった問題もついてまわります。


Redmine.JP で「Apache上でRuby on Railsアプリケーションを動かす/Passenger(mod_rails for Apache)の利用」なんて記事も見かけましたが、複数インスタンスを並列稼働させることによるレスポンスの改善には言及されているものの、添付ファイルまわりの解決についてはとくに触れられてなかったりします。


で、こんなことはすでに誰かが考えてるだろうと思って、Web を漁ってたらフォーラムで次の投稿を見かけました。

Adding the attachments to the database means one entity to backup, one entity to restore (or migrate). Also allows redmine to be proxied across machines in a cluster for load balancing without doing special filesystem sharing.



2008年の4月頃に起票されて、すでにクローズとなっているチケットです。 (^^;

上記のとおり、添付ファイルもデータベースに格納できるようにしてほしい、といった要望なのですが、


... ここから抜粋 & 適当訳 ...

The idea of storing files in the db may have some merit, but this is clearly a design decision and not a defect.

添付ファイルをディスクに管理するようにしたのは、設計上の判断。


This would make an excellent feature as a configurable option for the reasons Carl mentioned.

設定オプションで切り替えられるってのはいいね。


Storing standalone files in databases is just totally missing the point of what filesystems are made for. I admit one might like the idea of a single-point, network-enabled, access to all the data. But putting blobs in the DB is a poor design, really. Jean Philippe was right in his design.

If you want single-point access to the data, accessible through network, do not put blobs in the DB, this will not be the correct design. Better write an abstraction client/server layer, let's call this a proxy, between RedMine data access and actual data storage. You might find inspiration from the ZEO / ZODB design for Zope, although I would not recommend to mimic it entirely.

DBblob でただつっこむってのはイケてない設計だよ。

ネットワーク越しにアクセスできるようにしたいなら、blob につっこむのは正しい設計じゃない。クライアント/サーバーな抽象化層を挟んだほうがよいよ。Redmine のデータアクセスと実際のデータストレージ間のプロキシと呼べるもの。この発想は Zope の ZEO / ZODB からも得られるよ。ただ真似するってのはおすすめじゃないけどね。


I can think of a lot of good reasons to not toss files into the database:

  1. It balloons the db size, making backups take longer.
  2. It puts extra work on the db, which has plenty to do as is.
  3. It means files would have to be serialized through rails (because there is no file for the webserver to point to) -- which means that rails process will block incoming web requests while the file is being downloaded. There are ways around this, but they are really hackish, or don't lend well to simple deployments.
  4. There are a ton of database "gotchas" that ActiveRecord can't abstract away when dealing with blobs.

Plus, backing up files is exceedingly easy. Just rsync them to another box. I admit it might not be blatantly obvious that you need to do it, but I think that's a point for documentation rather than creating a ton of work with little real-world benefit.

If you need single-point access to the data over a network, just use a NFS/SMB share. It is plenty fast for attachments.

ファイルをデータベースに格納しないほうがよい理由がたくさん思いつくよ。

DB のサイズも増えるし、その分バックアップ時間もかかる。余計な仕事を DB にさせたくない。ファイルは Railsシリアライズされることになるし、ファイルがダウンロードされてる間は Rails プロセスもブロックされる。ARblob を抽象的に扱えない、とかね。

ファイルをバックアップするのはずっと簡単。別筐体に rsync すればいい。複数インスタンスをたてた場合は、NFS や SMB で共有すればいいじゃん。速いしね。


If it's a bad idea, then I suggest dropping the feature. If so, I'll file feature request for configurable storage location and a backup script that backs up the db, attachment files, and configuration to some specified location.

格納場所を設定可能するとか、DB / 添付ファイル / 設定ファイルなどをバックアップするスクリプトがほしいよ。


I've added a few words about this at the end of RedmineInstall guide.

(そんな感じのスクリプトを) Redmine インストールガイドの最後にちょっと追記しといた。


... ここまで ...


ってな感じでチケットはクローズしています。

実際、インストールガイドを見てみると、こんな感じ。

Installing Redmine

Backups

Redmine backups should include:

  • data (stored in your redmine database)
  • attachments (stored in the files directory of your Redmine install)

Here is a simple shell script that can be used for daily backups (assuming you're using a mysql database):

# Database

/usr/bin/mysqldump -u <username> -p<password> <redmine_database> | gzip > /path/to/backup/db/redmine_`date +%y_%m_%d`.gz

# Attachments

rsync -a /path/to/redmine/files /path/to/backup/files

2009-08-28

我が家に iPhone がやってきました

RubyKaigi2009 の懇親会で散々 Bump してる姿を見せつけられた結果、やっぱり欲しくなって稟議を通してしまいました。 (^^;


f:id:kiwamu:20090826191305j:image


ケースはひとしきり悩んだ結果、シンプルなところに落ち着きました。で、...


  • ケースとフィルムの装着
  • iPhone の OS バージョンアップ
  • Wifi の設定
  • Gmail のアカウント設定
  • 電話帳のコピー
  • 必要そうなアプリをどどっとインストール
  • アプリの並び替え (今デフォを含めて 80 個くらい)
  • 怖くなってパスコード導入..
  • twitter が楽しくなってきた
  • iPhone SDK 導入
  • 何かつくってみたくなってきた ← いまここ

な感じです。

# SnowLeopard もほしいな...


SHIELD iShell for iPhone 3G/3GS シェルカバー マット・レッド

SHIELD iShell for iPhone 3G/3GS シェルカバー マット・レッド

パワーサポート アンチグレアフィルムセット for iPhone 3G PPC-02

パワーサポート アンチグレアフィルムセット for iPhone 3G PPC-02



  • あとでやる
    • 契約プランの変更
    • キャンペーン特典の適用

2009-08-25

9arrows を (MySQLで) 試してみました

本家から 9arrows の最新版を落とし、対応するバージョンの Rails も入れておきます。データベースには PostgreSQL を使用するみたいですが、今回は MySQL で強引に動かしてみます。

% svn co http://9arrows.googlecode.com/svn/trunk/ 9arrows
% gem install rails -v 2.1.0

早速、database.yml を書き替えて、rake コマンドをたたきます。あ、その前に MySQLデータベースも用意しないといけないですね。

development:
  adapter: mysql
  database: 9arrows_development
  username: root
  password: 
  host: 127.0.0.1
(snip)
% mysql -u root -p

mysql> create database 9arrows_development;
mysql> create database 9arrows_production;
mysql> create database 9arrows_test;
mysql> exit;

% cd 9arrows
% rake db:schema:load

rake コマンドの結果を見るに、テーブルの作成はうまくいってますが、初期データの登録で失敗しているっぽいです。そこで、schema.rb の中で execute で呼ばれている中身を手動インサートすることにします。ちなみに、datetime のフォーマットが PostgreSQL と微妙に違うのか、そのままだとインサートできなかったで、ちょこっとだけ手を加えてました。

-INSERT INTO mst_messages VALUES (2, 'project_name', 1, 'プロジェクト名', 'プロジェクト名', 'プロジェクト名', 'プロジェクト名', 1, NULL, '2007-07-08 19:32:00+09', NULL, '2007-07-08 19:39:20.984+09');
+INSERT INTO mst_messages VALUES (2, 'project_name', 1, 'プロジェクト名', 'プロジェクト名', 'プロジェクト名', 'プロジェクト名', 1, NULL, '2007-07-08 19:32:00', NULL, '2007-07-08 19:39:20.984');

作成したデータベースに流し込みます。

% rake db:schema:load > insert.sql
(上述のようにちょっといじって...)

% mysql -u root -p

mysql> use 9arrows_developemt;
mysql> charset utf8;
mysql> source insert.sql;
mysql> exit;

"ERROR 1366 (HY000): Incorrect string value" あたりのエラーがでて、うまく行かなにようなら文字コードの確認を。

mysql> show variables like 'character%';
+--------------------------+--------------------
| Variable_name            | Value
+--------------------------+--------------------
| character_set_client     | utf8
| character_set_connection | utf8
| character_set_database   | utf8
| character_set_filesystem | binary
| character_set_results    | utf8
| character_set_server     | utf8
| character_set_system     | utf8

さて、このままだと auto increment な id が増えていないと思うので、sequence の current 値を変更しようと setval あたりを呼びたいなぁと思ったのですが、そんな関数はないと怒られます。

mysql> SELECT setval('mst_messages_id_seq', max(id)) FROM mst_messages;
ERROR 1305 (42000): FUNCTION 9arrows_development.setval does not exist

あれれっ?と思い、ひとしきり調べてみましたが、どうやら MySQL では扱えないようです。どうしようかなぁ..と思うものの、show table status で確認してみると、ちゃんと auto increment されているではないですか!?

MySQL では、あえて弄らんでもよかったらしいです。 (^^;


mysql> show table status;
+-------------------+------+----------------+-------------+----------------+
| Name              | Rows | Avg_row_length | Data_length | Auto_increment |
+-------------------+------+----------------+-------------+----------------+
| dat_calls         |    0 |              0 |       16384 |              1 |
| dat_callusers     |    0 |              0 |       16384 |              1 |
| dat_eventfiles    |    0 |              0 |       16384 |              1 |
| dat_events        |    0 |              0 |       16384 |              1 |
| dat_eventusers    |    0 |              0 |       16384 |              1 |
| dat_milestones    |    0 |              0 |       16384 |              1 |
| dat_mylogcmts     |    0 |              0 |       16384 |              1 |
| dat_mylogs        |    0 |              0 |       16384 |              1 |
| dat_projectcomps  |    0 |              0 |       16384 |              1 |
| dat_projectlogs   |    0 |              0 |       16384 |              1 |
| dat_projects      |    0 |              0 |       16384 |              1 |
| dat_projectusers  |    0 |              0 |       16384 |              1 |
| dat_taskcmts      |    0 |              0 |       16384 |              1 |
| dat_taskfiles     |    0 |              0 |       16384 |              1 |
| dat_taskhistories |    0 |              0 |       16384 |              1 |
| dat_tasks         |    0 |              0 |       16384 |              1 |
| dat_taskusers     |    0 |              0 |       16384 |              1 |
| mst_compositions  |   29 |            564 |       16384 |             30 |
| mst_messages      |  175 |            374 |       65536 |            198 |
| mst_templates     |    2 |           8192 |       16384 |              3 |
| mst_tpevents      |    3 |           5461 |       16384 |              4 |
| mst_tpmilestones  |    4 |           4096 |       16384 |              5 |
| mst_tptasks       |   22 |            744 |       16384 |             23 |
| mst_users         |    1 |          16384 |       16384 |              2 |
+-------------------+------+----------------+-------------+----------------+
24 rows in set (0.02 sec)

ということで、問題ないようなので気を取り直して起動してみます。

# 必要があれば、test、production 環境も同様に設定を。今回は development だけで進めます。


% ruby script/server
=> Booting Mongrel (use 'script/server webrick' to force WEBrick)
=> Rails 2.1.0 application starting on http://0.0.0.0:3000
...
DEPRECATION WARNING: config.action_view.cache_template_extensions option has been deprecated and has no affect. Please remove it from your config files.  See http://www.rubyonrails.org/deprecation for details. (called from send at c:/ruby/ruby-186-25/lib/ruby/gems/1.8/gems/rails-2.1.0/lib/initialize
r.rb:455)

なんてログが出てきますが、とりあえず無事起動したようです。


http://localhost:3000/ にアクセスすると、ログインID/パスワードを指定してログインするか、新規ユーザーを登録することになります。新規にユーザーを登録するにはメールサーバの設定とかもしておかないといけなさそうなので、ひとまず初期設定されているログインID で逃げます。

# mst_users テーブルの login_id を見て、パスワードは勘で。

ninearrows/ninearrows


ログインするとプロジェクト作成画面になります。まぁ、プロジェクト管理アプリでプロジェクトがなかったら意味がないのでそりゃそうかって感じです。プロジェクトのテンプレートは「システム開発系」と「WEB製作系」の2つから選べます。前者を選んでおきます。


プロジェクトを作成すると、Todo、Event、Information、Member で 4分割された画面が開きます。これが DashBoard のようですね。同列のメニューには、WBS、Gantt、Calendar、File が並びます。それらの上でプロジェクトがタブ形式で複数並べられるようになっているので、マルチプロジェクト管理ができるんでしょう。(完全に見た目だけから機能を追っています)


DashBoard の画面は参照オンリー。


WBS 画面には先ほど選択したテンプレートWBS がすでに描かれています。項目は、タスク、担当者、期限、状況、依頼者。ドラッグ & ドロップで列の並びは入れ替えられます。タスクの項目には、マイルストーンとイベント、そしてただのタスクが追加できます。また親タスクをクリックすることで子タスクがトグルできます。


Gantt の画面は、WBS の画面と同じ縦軸で横軸が時間になります。Gantt からでも WBS からでも同様に担当者や期限の編集はできそう。逆に両方を並べて見たいとなるとつらいのかな。


Calendar はそのまんま。タスクやマイルストーンの追加はここからでもできます。ただし、Google Calendar ほどの操作性はないみたい。


Files の画面では、ファイルを管理できます。フォルダ構造もとれるのはいいが、SCM と連携しているわけではないです。ちなみにフォルダはつくれましたが、なぜかアップロードはうまくいきませんでした。アップロードしたファイルは 9arrows_home/public/files にはいるはず。素直に SCM と連携してリポジトリブラウザみたいな画面にしちゃえばよかったのにと思うのですが..。


ざっとこんなところだと思うので、最後に ERD も眺めてみます。

  • 9arrows's ERD

9arrows’s ERD

テーブル数はそれほど多くないですね。ひとまず今日はここまで。


# 9arrows は GPLv3 なんだよなぁ... (^^;


参考