(速報)SWF SpecificationがOpenになりました
以前、「SWFファイルフォーマットとライセンス 」で、SWFのファイルフォーマット仕様書の利用許諾に、SWFファイルを読み込むプログラムを作成してはいけないと書かれていることを紹介しました。
今日、Adobeから「Adobe and Industry Leaders Establish Open Screen Project」というプレスリリースがあり、その中に以下の一文がありました。
- Removing restrictions on use of the SWF and FLV/F4V specifications
ということで、SWFの仕様書を制限無しに読むことが可能になったようです。
他にも、Flash Playerの移植レイヤが公開され、Flash Playerを移植してもライセンス料が取られなくなる等が発表されているようです。私もまだ流し読みしかしていないのですが、とても大きなニュースなのでとりいそぎ紹介させていただきました。
追記:
SWFとFLVの仕様書がこちらからダウンロードできるようになっています。
Open Screen Project / For developers
repcached-2.0リリースのお知らせと、超簡単なサンプルコード
repcached-2.0(memcached-1.2.5ベース) をリリースしましたのでお知らせします。
今回の目玉はマルチマスタ構成のサポートです。
以前のバージョンはマスタ/スレーブ構成だったので、必ずマスタへ書き込まなければいけませんでした。そのため、接続先のサーバがマスタなのかどうかをクライアントが判別しなければいけなかったり、keepalivedなどと併用するなどの工夫が必要でしたが、今回のバージョンではその必要がなくなります。両方のサーバに対してデータを書き込むことができるようになったので、かなり使いやすくなったと感じています。
repcachedはパフォーマンスを最重視しているため、レプリケーションは非同期で処理しています。したがって、setと同時にレプリケーションが完了する保証はありません。つまり、サーバAにsetした直後にサーバBからgetした場合、正しい値が返ってこない可能性があります。
しかし、memcachedのクライアントライブラリは負荷分散機能を持っていて、複数のサーバがある場合、キーのハッシュ値を元にして接続先のサーバが選択されます。そのため、同一のキーに対する操作は必ず同じサーバで処理されます。これを図にすると以下のような感じになります。
つまり、クライアントライブラリの負荷分散機能を利用すると、データを格納したサーバと同じサーバが参照されるので、非同期処理に起因するデータの不整合は発生しません。そして、すべてのデータは両方のサーバへ格納されているので、片方のサーバがダウンしてもすべてのデータが保持されます。
ただし、参照しようとしたサーバがダウンしていた時に、自動的にもう片方のサーバへ参照しにいくかどうかは、クライアントライブラリの実装に依存します。例えば、PHP の memcached extension で提供される Memcache::set 関数の場合は、Version3.0.0以上ならば自動的に再接続してくれますが、Version2.2.3ではエラーになってしまいます。そのような場合は、自分で再試行するなどの処理を実装する必要があるかもしれません。セッションハンドラ(session.save_handler="memcache")を利用する場合は、バージョン2.2.3でも再接続してくれます。
※この例は後ほどご紹介します。
ダウンしていたサーバが復旧して最初にやることは、既存のサーバの全てのデータを複製(以下、まるごとこぴー)することです。その間、復旧中のサーバはクライアントからの接続を受け付けないので、誤って中途半端な状態のデータを取得してしまうことはありません。また、まることこぴーの最中でも、コピー元のサーバに対しては正常にアクセスできるので、サービスが停止してしまう心配もありません。
まるごとこぴーが完了次第、レプリケーションを再開し、両方のサーバへアクセスできるようになります。まるごとこぴーの所要時間は、ギガビットイーサの環境で10万件で3秒程度、100万件で30秒程度でした。
簡単な使用例
簡単な使用例として以下のコードを紹介します。セッション変数を利用して、リロードするたびにカウンタが増えていくPHPです。 セッションハンドラとしてmemcacheを使い、データの保存先にrcd1とrcd2というサーバを指定しています。rcd1とrcd2ではrepcachedを起動しておきます。
[count.php]<?PHP
$rcd1="tcp://rcd1?persistent=1&weight=1&timeout=1&retry_interval=15";
$rcd2="tcp://rcd2?persistent=1&weight=1&timeout=1&retry_interval=15";
$session_save_path = "$rcd1,$rcd2";
ini_set('session.save_handler', 'memcache');
ini_set('session.save_path', $session_save_path);
session_start();
if(empty($_SESSION['count'])){
$_SESSION['count']=1;
} else {
$_SESSION['count']++;
}
echo "count=".$_SESSION['count']."\n";
?>
※PHP-5.2.5 + memcache-2.2.3で動作確認
ブラウザでこのページへアクセスすると、リロードする度にカウンタが増えていきます。 rcd1,rcd2のどちらかが動いている限りカウンタは増え続け、両方停止するとリセットします。
このように、repcached-2.0はmemcachedを2台で負荷分散するのと同じ感覚で利用できます。 すでにmemcachedを2台構成で運用しているシステムであれば、repcached-2.0に置き換えるだけで冗長構成になるかもしれません。 さすがにオリジナルのmemcachedと比べると若干パフォーマンスは落ちますが、それでも実用には支障のないレベルに仕上がっていると思いますので、もしよろしければご利用下さいませ。
Erlang Webフレームワークでデータベースを分散させる
ErlangのWebフレームワークであるErlyWebの 紹介を始めて今回が最終回になります。
これまでの記事をまとめると
- ErlyWeb:Erlangで書かれたWebフレームワーク
ErlangのWebフレームワークであるErlyWebの紹介と、Windowsにインストールする手順を紹介
- ErlyWeb(その2):テンプレートシステム
ErlyWebのテンプレートシステムを使用した例を紹介
- ErlyWeb:ErlyWebでmnesiaを使う
Erlangの分散データベースであるMnesiaを、ErlyWebのORマッパ機能(ErlyDB)で使用する手順を紹介
- Yawsで分散データベースMnesiaを使う
ErlyWebで使用されるWebアプリケーションのYawsで、Mnesiaをテストが容易な同一ホスト中で分散データベースとして設定する手順を紹介
- (この記事)Erlang Webフレームワークでデータベースを分散させる
異なるホストでMnesiaを分散させて使用するための手順を紹介
前回、同一ホスト内で分散データベースを作る練習をしてみました。
異なるホスト間でデータベースを分散させる設定をするには、Windows版の
起動スクリプトの修正や、MnesiaをErlyWebで使用するための前準備、データベースのデータの移行の問題などがあり、
分散データベースの設定を前回と今回の2回に分けました。
分散したデータベースの構成変更については、ホストの構成にかかわらず同じですので、前回の記事を参考にしてみてください。
続きを読むWindowsでPython Scriptの起動用exeを用意する
MercurialやTaskCoachといったPython製ツールをWindows上で使うとき、py2exeでビルドして配布されているパッケージを利用するとインストールはとても簡単なのですが、アプリ毎にpython25.dllといったdllやPythonモジュール群が大量にインストールされるのが欠点です。
普段からPythonを利用している人にとっては、distutilsを利用したインストール(easy_installやsetup.py install)の方がメモリ効率の面でも起動速度等の面でも有利な筈です。僕はできるだけこちらの方法を使っていて、起動速度・最小化解除のレスポンス共に向上することが体感できます。(プラシーボ効果かもしれませんが)
ただし、Mercurialをeasy_installしたところ、hg.exeが生成されず、Pythonをインストールしたディレクトリの下のScriptsディレクトリに"#!"(shebang)を利用した起動スクリプトであるhgが生成されただけでした。また、TaskCoachも、taskcoach.pyとtaskcoach.pywがあるだけでした。もちろんこのままでも利用はできます。でも、例えばNetBeansでMercurialを利用しようとするとhg.exeの場所を指定しないといけなかったりするので、やはり起動用の実行ファイルがあったほうが便利です。
そこで、easy_install.exeのような起動用実行ファイルを作るにはどうしたら良いのだろうと、distutilsを拡張するモジュールであるsetuptoolsを調べてみました。これを使えば、非常に簡単にPythonスクリプトをexeから起動できるようになります。
起動用実行ファイルは、コマンドプロンプトを開かないWindowアプリ用とコマンドプロンプトを開くコマンドライン用の2種類があり、以下のような動作をします。
- 起動対象スクリプトのパスを、GetModuleFileName()の結果から求めます。
パスから拡張子(.exe)を取り除いた後、Windowアプリ用なら"-script.pyw"を、コマンドライン用なら"-script.py"をつけたものが、起動対象のスクリプトになります。 - 起動対象スクリプトを開き、先頭に"#!"があるかどうかを調べます。"#!"があれば、続きを起動するPythonインタプリタとして扱い、"#!"が無ければ"python.exe"をPythonインタプリタとします。
- 引数を渡してsapwn()します。
setuptoolsをインストールしてあれば、この起動用実行ファイルが、Lib/site-packages/setuptools/の中にgui.exeとcli.exeの名前で入っています。名前から判るように、gui.exeがWindowアプリ用、cli.exeがコマンドラインアプリ用です。例えば、次のようにすれば、hg.exeとtaskcoach.exeを用意することができます。
C:\python\Scripts>copy hg hg-script.py C:\python\Scripts>copy ..\Lib\site-packages\setuptools\cli.exe hg.exe C:\python\Scripts>copy taskcoach.pyw taskcoach-script.pyw C:\python\Scripts>vim taskcoach-script.pyw (先頭に #!C:\python\pythonw.exe を追加) C:\python\Scripts>copy ..\Lib\site-packages\setuptools\gui.exe taskcoach.exe
同じ方法で、自作のスクリプトでもお手軽にexe化できます。これでWindowsユーザーのPythonライフが少し楽しくなればと思います。
KLab勉強会#4の資料を公開します
3/28に開催した、第4回KLab勉強会の資料を公開します。
- 『DSASのやりくり - MATRIXの秘密と効率的なシステム管理の関係』
〜 ひろせまさあき (KLab株式会社) - 『オープンソースなシステム管理フレームワーク Func』
〜 宮下 剛輔(株式会社paperboy&co.)
たくさんの方にお越しいただきありがとうございました。
おかげさまで、懇親会も含め盛況のうちに終わり、とても楽しい時間を過ごすことができました。
近いうちに第5回も開催したいと思っています。
勉強会の内容や参加募集など、決まり次第このブログでアナウンスしますので、今後も購読していただければと思います。
KLab勉強会#4 ストリーミング配信のお知らせ
今週金曜日に開催予定のKLab勉強会#4を、Ustream.tvでストリーミング配信したいと思います。
当日(3/28)、19:00前ぐらいから下記のURLで配信する予定ですので、申し込めなかった方や遠方の方など、ご覧いただければと思います。
(ひ)
Yawsで分散データベースMnesiaを使う
前回まで紹介してきたErlyWebのORマッパはMnesiaに対応していて Mnesiaを使用した分散データベース上でErlyWebのORマッパを使ってWebアプリケーションを作ることができるようになります。
今回は、前回説明したYawsで設定したMnesiaのデータベースを、同一ホスト内で複数のノードで使用したり、データベースを複製する手順を説明します。 異なるホスト間でのMnesiaの複製を行おうとすると、今回の環境では別の問題が発生します。これについては次回に説明する予定です。
今回は、同一ホスト内で接続と複製だけ行ってみます。
(セ)
KLab勉強会#4 開催のお知らせ
第4回 KLab勉強会のお知らせです。
(過去の勉強会の資料はクラブラボのKLab勉強会まとめページにあります)
今回は『システム管理』をテーマに、ゲストスピーカとして株式会社paperboy&co.の宮下氏をお迎えして、Funcというオープンソースのシステム管理フレームワークについてお話ししていただきます。
また弊社からは、DSASで実践している、効率的なシステム管理のための工夫についてお話をします。
みなさんのご参加、お待ちしております!
開催要項
- 日時
- 2008/3/28 (金) 19:00-20:00 (18:30受付開始)
- 場所
- KLab株式会社 第3会議室
東京都港区六本木6-10-1 六本木ヒルズ森タワー20F (アクセス方法) - 参加費
- 無料
- 人数
- 30名程度
(定員になり次第、参加登録を締め切らせていただきます)
※終了後に懇親会(会費制)を予定しています
セッション
-
- タイトル
- 『オープンソースなシステム管理フレームワーク Func』
- 講師
- 宮下 剛輔(株式会社paperboy&co.)
- 概要
-
Func(Fedora Unified Network Controller)というPython製のシステム管理フレームワークについて、
- そもそも一体どういうものなのか?
- 具体的にどのようにシステム管理に利用するのか?
といったことをお話したいと思います。
-
- タイトル
- 『DSASのやりくり - MATRIXの秘密と効率的なシステム管理の関係』
- 講師
- ひろせまさあき (KLab株式会社)
- 概要
-
システム管理をする上で、特にサーバ台数が増え始めると大きな問題になってくることがらについて、DSASではどのように解決し、運用の効率化を果たしているか、その事例を紹介したいと思います。
参加方法
参加希望者が定員に達したため、申し込みを終了しました。たくさんのご応募ありがとうございました。
参加希望のメールをいただいた方には、後日、当日のご案内をメールでお送りいたします。
万一、参加登録後に都合が悪くなってしまった場合は、当日でもかまいませんのでregister-study-20080328@klab.orgまでご連絡いただけると助かります。
また、申し込み終了後に参加希望のメールをいただいた方には、定員超過の旨、メールでご連絡いたします。今回は参加いただけませんが、次回の参加をお待ちしております。
ErlyWeb:ErlyWebでmnesiaを使う
今回は前回の続きの3回目でErlyWebでmnesiaを使ってみます。
- 第1回:ErlyWebのインストール
- Windowsへのインストール手順を紹介します。
- 第2回:ErlyWebのテンプレートを使ってみる
- ErlyWebのテンプレートシステムを使って見ます。
- 第3回:ErlyWebでmnesiaを使う
- Erlangのデータベース mnesia を使ってサンプルを動作させて見ます。
(セ)
repcached-1.2をリリースしました
repcached-1.2 (memcached-1.2.4ベース) を公開しましたのでお知らせします。
今回のバージョンアップは以下の2件の不具合修正になります。
- flush_allのレプリケーション時にマスタでメモリリークする可能性があったのを修正しました
- flagsパラメータがレプリケーションされていなかったのを修正しました
ダウンロードやインストール方法などの詳しい情報は、プロジェクトページをご覧ください
flagsパラメータがレプリケーションされない不具合の詳細
memcachedプロトコルでは更新系コマンドにflagsというパラメータがあります。
set key 0 0 5
↑これ
本来であれば、このパラメータもレプリケーションすべきですが、以前のバージョンではバックアップで常に0をセットしてしまっていました。
master: set key 1 0 5 ← Masterはflags=1なのに backup: set key 0 0 5 ← backupはflags=0になっちゃってる
flagsパラメータを利用していないアプリケーションには影響ありませんが、PHPのMemcache::set関数などを使ってオブジェクトを格納しているようなアプリケーションでは致命的な問題となります。例えば、以下のようなコードです。
※環境は php-5.2.5 + memcache-2.2.3.tgz です。
#!/usr/bin/php
<?PHP
$memcacheM = new Memcache;
$memcacheB = new Memcache;
$memcacheM->connect('master', 11211) or die ("connect errorM\n");
$memcacheB->connect('backup', 11211) or die ("connect errorB\n");
$tmp_object = new stdClass;
$tmp_object->str_attr = 'test';
$tmp_object->int_attr = 123;
$memcacheM->set('key', $tmp_object, false, 10) or die ("set error\n");
$get_resultM = $memcacheM->get('key');
echo "Master\n";
var_dump($get_resultM);
echo "\n";
$get_resultB = $memcacheB->get('key');
echo "Backup\n";
var_dump($get_resultB);
?>
実行結果は以下のようになります。
【実行結果】
Master
object(stdClass)#5 (2) {
["str_attr"]=>
string(4) "test"
["int_attr"]=>
int(123)
}
Backup
string(66) "O:8:"stdClass":2:{s:8:"str_attr";s:4:"test";s:8:"int_attr";i:123;}"
なんと、Masterからgetした場合はオブジェクトとして扱われているのに対し、Backupでgetすると文字列として扱われてしまっています。PHPのMemcache関数は、データをシリアライズして格納しているかどうかを判断するためにflagsを利用しているようです。もしかすると他のライブラリでも同様の問題があるかもしれませんのでご注意下さい。
repcached-2.0の近況
現在、memcached-1.2.5をベースにしたrepcached-2.0を開発中です。実装のほうはほとんど終わっていまして、今はコードを見直しながらストレステストの準備をしています。早ければ今月中、遅くとも来月の頭にはリリースできると思いますのでご期待下さいませ!
(や)

