2008年05月01日

(速報)SWF SpecificationがOpenになりました

register to: はてなブックマークに登録 | del.icio.usに登録 | この記事をクリップ!

以前、「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


@methane

klab_gijutsu2 at 15:37
この記事のURLComments(0)TrackBack(1)flash 
2008年04月11日

repcached-2.0リリースのお知らせと、超簡単なサンプルコード

register to: はてなブックマークに登録 | del.icio.usに登録 | この記事をクリップ!

repcached-2.0(memcached-1.2.5ベース) をリリースしましたのでお知らせします。

今回の目玉はマルチマスタ構成のサポートです。
以前のバージョンはマスタ/スレーブ構成だったので、必ずマスタへ書き込まなければいけませんでした。そのため、接続先のサーバがマスタなのかどうかをクライアントが判別しなければいけなかったり、keepalivedなどと併用するなどの工夫が必要でしたが、今回のバージョンではその必要がなくなります。両方のサーバに対してデータを書き込むことができるようになったので、かなり使いやすくなったと感じています。

repcachedはパフォーマンスを最重視しているため、レプリケーションは非同期で処理しています。したがって、setと同時にレプリケーションが完了する保証はありません。つまり、サーバAにsetした直後にサーバBからgetした場合、正しい値が返ってこない可能性があります。

しかし、memcachedのクライアントライブラリは負荷分散機能を持っていて、複数のサーバがある場合、キーのハッシュ値を元にして接続先のサーバが選択されます。そのため、同一のキーに対する操作は必ず同じサーバで処理されます。これを図にすると以下のような感じになります。

rep.png

つまり、クライアントライブラリの負荷分散機能を利用すると、データを格納したサーバと同じサーバが参照されるので、非同期処理に起因するデータの不整合は発生しません。そして、すべてのデータは両方のサーバへ格納されているので、片方のサーバがダウンしてもすべてのデータが保持されます。

down.png

ただし、参照しようとしたサーバがダウンしていた時に、自動的にもう片方のサーバへ参照しにいくかどうかは、クライアントライブラリの実装に依存します。例えば、PHP の memcached extension で提供される Memcache::set 関数の場合は、Version3.0.0以上ならば自動的に再接続してくれますが、Version2.2.3ではエラーになってしまいます。そのような場合は、自分で再試行するなどの処理を実装する必要があるかもしれません。セッションハンドラ(session.save_handler="memcache")を利用する場合は、バージョン2.2.3でも再接続してくれます。
※この例は後ほどご紹介します。

ダウンしていたサーバが復旧して最初にやることは、既存のサーバの全てのデータを複製(以下、まるごとこぴー)することです。その間、復旧中のサーバはクライアントからの接続を受け付けないので、誤って中途半端な状態のデータを取得してしまうことはありません。また、まることこぴーの最中でも、コピー元のサーバに対しては正常にアクセスできるので、サービスが停止してしまう心配もありません。

marugoto.png

まるごとこぴーが完了次第、レプリケーションを再開し、両方のサーバへアクセスできるようになります。まるごとこぴーの所要時間は、ギガビットイーサの環境で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と比べると若干パフォーマンスは落ちますが、それでも実用には支障のないレベルに仕上がっていると思いますので、もしよろしければご利用下さいませ。


klab_gijutsu2 at 07:00
この記事のURLComments(0)TrackBack(1)repcached  | 冗長構成
2008年04月04日

Erlang Webフレームワークでデータベースを分散させる

register to: はてなブックマークに登録 | del.icio.usに登録 | この記事をクリップ!

ErlangのWebフレームワークであるErlyWebの 紹介を始めて今回が最終回になります。

これまでの記事をまとめると

  1. ErlyWeb:Erlangで書かれたWebフレームワーク
    ErlangのWebフレームワークであるErlyWebの紹介と、Windowsにインストールする手順を紹介
  2. ErlyWeb(その2):テンプレートシステム
    ErlyWebのテンプレートシステムを使用した例を紹介
  3. ErlyWeb:ErlyWebでmnesiaを使う
    Erlangの分散データベースであるMnesiaを、ErlyWebのORマッパ機能(ErlyDB)で使用する手順を紹介
  4. Yawsで分散データベースMnesiaを使う
    ErlyWebで使用されるWebアプリケーションのYawsで、Mnesiaをテストが容易な同一ホスト中で分散データベースとして設定する手順を紹介
  5. (この記事)Erlang Webフレームワークでデータベースを分散させる
    異なるホストでMnesiaを分散させて使用するための手順を紹介

前回、同一ホスト内で分散データベースを作る練習をしてみました。
異なるホスト間でデータベースを分散させる設定をするには、Windows版の 起動スクリプトの修正や、MnesiaをErlyWebで使用するための前準備、データベースのデータの移行の問題などがあり、 分散データベースの設定を前回と今回の2回に分けました。

分散したデータベースの構成変更については、ホストの構成にかかわらず同じですので、前回の記事を参考にしてみてください。

続きを読む

klab_gijutsu2 at 17:59
この記事のURLComments(0)TrackBack(0)
2008年04月01日

WindowsでPython Scriptの起動用exeを用意する

register to: はてなブックマークに登録 | del.icio.usに登録 | この記事をクリップ!

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種類があり、以下のような動作をします。

  1. 起動対象スクリプトのパスを、GetModuleFileName()の結果から求めます。
    パスから拡張子(.exe)を取り除いた後、Windowアプリ用なら"-script.pyw"を、コマンドライン用なら"-script.py"をつけたものが、起動対象のスクリプトになります。
  2. 起動対象スクリプトを開き、先頭に"#!"があるかどうかを調べます。"#!"があれば、続きを起動するPythonインタプリタとして扱い、"#!"が無ければ"python.exe"をPythonインタプリタとします。
  3. 引数を渡して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ライフが少し楽しくなればと思います。


@methane

klab_gijutsu2 at 17:12
この記事のURLComments(3)TrackBack(0)Python 
2008年03月31日

KLab勉強会#4の資料を公開します

register to: はてなブックマークに登録 | del.icio.usに登録 | この記事をクリップ!

3/28に開催した、第4回KLab勉強会の資料を公開します。

『DSASのやりくり - MATRIXの秘密と効率的なシステム管理の関係』
  〜 ひろせまさあき (KLab株式会社)
『オープンソースなシステム管理フレームワーク Func』
  〜 宮下 剛輔(株式会社paperboy&co.)

たくさんの方にお越しいただきありがとうございました。
おかげさまで、懇親会も含め盛況のうちに終わり、とても楽しい時間を過ごすことができました。

近いうちに第5回も開催したいと思っています。
勉強会の内容や参加募集など、決まり次第このブログでアナウンスしますので、今後も購読していただければと思います。


klab_gijutsu2 at 17:00
この記事のURLComments(0)TrackBack(0)KLab勉強会 
2008年03月25日

KLab勉強会#4 ストリーミング配信のお知らせ

register to: はてなブックマークに登録 | del.icio.usに登録 | この記事をクリップ!

今週金曜日に開催予定のKLab勉強会#4を、Ustream.tvでストリーミング配信したいと思います。

当日(3/28)、19:00前ぐらいから下記のURLで配信する予定ですので、申し込めなかった方や遠方の方など、ご覧いただければと思います。


(ひ)
klab_gijutsu2 at 15:18
この記事のURLComments(0)TrackBack(0)KLab勉強会 
2008年03月18日

Yawsで分散データベースMnesiaを使う

register to: はてなブックマークに登録 | del.icio.usに登録 | この記事をクリップ!
ErlangはMnesiaというデータベースマネージメントシステム(DBMS)をサポートしています。 Mnesiaを使用すると、データベースのレプリケーションによって分散データベースを構築し、簡単にデータベースの冗長化を実現できます。
前回まで紹介してきたErlyWebのORマッパはMnesiaに対応していて Mnesiaを使用した分散データベース上でErlyWebのORマッパを使ってWebアプリケーションを作ることができるようになります。

今回は、前回説明したYawsで設定したMnesiaのデータベースを、同一ホスト内で複数のノードで使用したり、データベースを複製する手順を説明します。 異なるホスト間でのMnesiaの複製を行おうとすると、今回の環境では別の問題が発生します。これについては次回に説明する予定です。
今回は、同一ホスト内で接続と複製だけ行ってみます。

続きを読む

(セ)
klab_gijutsu2 at 18:22
この記事のURLComments(0)TrackBack(0)Erlang 
2008年03月17日

KLab勉強会#4 開催のお知らせ

register to: はてなブックマークに登録 | del.icio.usに登録 | この記事をクリップ!

第4回 KLab勉強会のお知らせです。
(過去の勉強会の資料はクラブラボのKLab勉強会まとめページにあります)

今回は『システム管理』をテーマに、ゲストスピーカとして株式会社paperboy&co.の宮下氏をお迎えして、Funcというオープンソースのシステム管理フレームワークについてお話ししていただきます。

また弊社からは、DSASで実践している、効率的なシステム管理のための工夫についてお話をします。

みなさんのご参加、お待ちしております!

開催要項

日時
2008/3/28 (金) 19:00-20:00 (18:30受付開始)
場所
KLab株式会社 第3会議室
東京都港区六本木6-10-1 六本木ヒルズ森タワー20F (アクセス方法)
参加費
無料
人数
30名程度
(定員になり次第、参加登録を締め切らせていただきます)

※終了後に懇親会(会費制)を予定しています

セッション

  1. タイトル
    『オープンソースなシステム管理フレームワーク Func』
    講師
    宮下 剛輔(株式会社paperboy&co.)
    概要

    Func(Fedora Unified Network Controller)というPython製のシステム管理フレームワークについて、

    • そもそも一体どういうものなのか?
    • 具体的にどのようにシステム管理に利用するのか?

    といったことをお話したいと思います。

  2. タイトル
    『DSASのやりくり - MATRIXの秘密と効率的なシステム管理の関係』
    講師
    ひろせまさあき (KLab株式会社)
    概要

    システム管理をする上で、特にサーバ台数が増え始めると大きな問題になってくることがらについて、DSASではどのように解決し、運用の効率化を果たしているか、その事例を紹介したいと思います。

参加方法

参加希望者が定員に達したため、申し込みを終了しました。たくさんのご応募ありがとうございました。
参加希望のメールをいただいた方には、後日、当日のご案内をメールでお送りいたします。
万一、参加登録後に都合が悪くなってしまった場合は、当日でもかまいませんのでregister-study-20080328@klab.orgまでご連絡いただけると助かります。

また、申し込み終了後に参加希望のメールをいただいた方には、定員超過の旨、メールでご連絡いたします。今回は参加いただけませんが、次回の参加をお待ちしております。


klab_gijutsu2 at 07:30
この記事のURLComments(0)TrackBack(0)KLab勉強会 
2008年03月13日

ErlyWeb:ErlyWebでmnesiaを使う

register to: はてなブックマークに登録 | del.icio.usに登録 | この記事をクリップ!
ErlyWebErlangで書かれたウェブのフレームワークです。ErlyWebErlangのウェブアプリケーションであるYaws上で動作します。
今回は前回の続きの3回目でErlyWebでmnesiaを使ってみます。
第1回:ErlyWebのインストール
Windowsへのインストール手順を紹介します。
第2回:ErlyWebのテンプレートを使ってみる
ErlyWebのテンプレートシステムを使って見ます。
第3回:ErlyWebでmnesiaを使う
Erlangのデータベース mnesia を使ってサンプルを動作させて見ます。
mnesiaを使うと、簡単にデータベースのレプリケーション機能を使用することができます。まずは、ErlyWebのコンポーネントでモデルを使ってErlyDBのORマッパ機能などの紹介をします。 mnesiaについてはDSAS開発者の部屋に他の記事もあるので参考にしてみてください。 続きを読む
(セ)
klab_gijutsu2 at 19:02
この記事のURLComments(0)TrackBack(0)Erlang 
2008年03月12日

repcached-1.2をリリースしました

register to: はてなブックマークに登録 | del.icio.usに登録 | この記事をクリップ!

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を開発中です。実装のほうはほとんど終わっていまして、今はコードを見直しながらストレステストの準備をしています。早ければ今月中、遅くとも来月の頭にはリリースできると思いますのでご期待下さいませ!



(や)


klab_gijutsu2 at 03:12
この記事のURLComments(0)TrackBack(0)repcached 
最新記事
Archives
このブログについて
DSASとは、KLab が構築し運用しているコンテンツサービス用のLinuxベースのインフラです。現在3ヶ所のデータセンタにて構築し、運用していますが、我々はDSASをより使いやすく、より安全に、そしてより省力で運用できることを目指して、日々改良に勤しんでいます。
このブログでは、そんな DSAS で使っている技術の紹介や、実験してみた結果の報告、トラブルに巻き込まれた時の経験談など、広く深く、色々な話題を織りまぜて紹介していきたいと思います。

また、わたしたちが開発したソフトウエアやノウハウ、実験的なサービスを公開している、

もあわせてご覧いただければと思います。(DSASブログのエントリをシリーズ別に整理した「DSASブログまとめ」もあります)
KLabについて
KLab株式会社は、携帯電話の基盤技術から各種ソリューション、コンテンツ企画など多くのサービスを提供している会社です。
Blog内検索
QRコード
QRコード
最新コメント
最新トラックバック
Syndicate this site