タグ

ブックマーク / frsyuki.hatenablog.com (17)

  • Ruby で MessagePack-RPC - Blog by Sadayuki Furuhashi

    高速なオブジェクトシリアライズ形式 MessagePack をプロトコルに採用したRPCライブラリをリリースしました。 Ruby を使って簡単にRPCサーバーやクライアントを実装できます。 msgpack-rpc MessagePack-RPC プロトコルは既にkumofsやクラスタ管理ツール「clx」などで利用しており、高速なサーバーの実装にも便利ツールの実装にも、幅広く使えるシンプルなプロトコル仕様になっています。 clxを使うと複数のサーバーをグループに分けて、同じグループに属するサーバーに対して同じコマンドを実行できます。コマンドは並列して実行されるので、ファイル転送(rsync)のような時間のかかるコマンドでも快適に使えます。 clxのコアは汎用的なRPCサーバーで、RPC以外の機能はすべてモジュールとして実装されています。モジュールは起動時に登録できるほか、実行中でも追加でき、

    Ruby で MessagePack-RPC - Blog by Sadayuki Furuhashi
    kanbayashi
    kanbayashi 2009/12/08
    MessagePackって、こういう風に使えるのね。 <- MessagePackとMessagePack-RPCを混同してた
  • 54行で分散KVSを実装する(レプリケーション機能付き) - Blog by Sadayuki Furuhashi

    Ruby と MessagePack-RPC があれば、簡単なkey-valueストレージは簡単に作れます。54行で書けます(レプリケーションと負荷分散機能付き。サーバー38行、クライアント16行)。 簡単なKVSをベースにして、ログ集計や遠隔デプロイ、遠隔管理機能などの機能を追加していけば、ちょっと便利なサーバープログラムをサクサク自作できるハズ。 この分散KVSは、(keyのハッシュ値 % サーバーの台数)番目のサーバーにkeyを保存します。また、サーバーの名前順でソートしたときの「次のサーバー」と「次の次のサーバー」にデータをレプリケーションします。 すべてのサーバーで同じ設定ファイルを使います。サーバーごとの設定は引数を自分のホスト名に書き換えるだけなので、デプロイが容易です。 MessagePack-RPC for Ruby を使うと、分散しないkey-valueストレージ*1は

    54行で分散KVSを実装する(レプリケーション機能付き) - Blog by Sadayuki Furuhashi
    kanbayashi
    kanbayashi 2009/12/08
    Message Packって、こういう風に使えるのね。
  • 分散システムのテストを自動化する - Blog by Sadayuki Furuhashi

    複数のプロセスが相互に連携して動くシステムのテストを自動化したい。 普通に書くとプロセスを起動したあと終了するまで待ってしまうので、複数のプロセスを同時に起動できなくて困ります。&を付けてバックグラウンドで起動させると、後で終了させたとき、まず ps aux | grepしてPIDを調べて、シグナルを飛ばして、しばらくポーリングして当に終了するまで待つ、なんてことになって面倒です。 それから起動してからしばらくは初期化処理が走っているので、標準出力に「started」と表示されるまで待ちたかったりします。 そのあたりをうまく扱うためのライブラリを書いてみました。↓こんな感じで自動化できます。 #!/usr/bin/env ruby require 'chukan' include Chukan srv = spawn("server -arg1 -arg2") # 'server' コマ

    分散システムのテストを自動化する - Blog by Sadayuki Furuhashi
  • Blog by Sadayuki Furuhashi

    MessagePackフォーマット仕様のPull Request #209をマージし、MessagePackにTimestamp型を追加しました。 ※この記事の英語版は XXX にあります(翻訳中) Extension型の型コード -1 として定義されているため、後方互換性が維持されています。つまり、既にExtension型に対応しているデシリアライザであれば、Timestamp型を使用して作成されたデータを、Timestamp型に対応していない古いデシリアライズで読み出すことができます。 新しいTimestamp型には timestamp 32、timestamp 64、timestamp 96 の3つのフォーマットがあり、よく使う値をより少ないバイト数で保存できるようになっています。例えば、1970年〜2106年までの時刻で、秒までの精度しか持たない時刻であれば、合計6バイトで保存でき

    Blog by Sadayuki Furuhashi
    kanbayashi
    kanbayashi 2008/09/17
    実際にI/Oがボトルネックになるようなアプリケーションで評価してもらいたいなぁとか思う. アイデアは面白いと思うのだけど,実際のとこどうなんでしょ.
  • memcachedプロトコルのストリームパーサ - Blog by Sadayuki Furuhashi

    memcachedクライアントはほとんどの言語で実装されており、key-valueベースの何かを作るときにはmemcacheプロトコルをサポートしておくと、クライアントを実装する手間が省けるのでイケてます。 しかしmemcachedのテキストプロトコルのような「行」が主体となっているプロトコルは、スレッドを使った実装では比較的簡単に処理できるのですが(fgets(3)を使うなど)、selectやepollなどを使ったイベント駆動型の実装では非常に面倒なことになります。(一度パースしてみて、どうも全部データが到着していないようなら一度状態を変数に保存して、次にデータが到着したら変数から状態を復元して…) イベント駆動型の実装では、データを次々に投げ込んでいくと内部の状態が遷移していき、ゴールの状態にたどり着くとパース完了、という状態遷移型のパーサが必要になります。そこで、Ragel Stat

    memcachedプロトコルのストリームパーサ - Blog by Sadayuki Furuhashi
  • Aerial(エアリアル) - Ajax/Cometの次を行く リアルタイム双方向RPC - Blog by Sadayuki Furuhashi

    JavaScript - サーバー間で双方向のRPC通信を行う技術は「Aerial」(エアリアル)という名前になりました*1。アイディアを出していただいた皆様、ありがとうございましたm(_ _)m Aerialは、通信にFlashを使い、JavaScriptとサーバープログラムとの間で双方向のRPC呼び出しを行う技術です。つまり、サーバー側からJavaScriptのメソッドを呼び出したり、逆にJavaScriptからサーバー側のプログラムを呼び出したりします。 サーバーから直接JavaScriptのコードを呼び出したり、逆にJavaScriptからサーバー側のメソッドを呼び出したりできるので、通信の内容を意識する必要がなく、バグの混入を抑えます。RPC成分入り! ライブラリを開発するときも、HTTPやブラウザ間の実装の違いを意識する必要も無く、ごく普通のTCP接続で通信を行うので、Come

    Aerial(エアリアル) - Ajax/Cometの次を行く リアルタイム双方向RPC - Blog by Sadayuki Furuhashi
  • Comet/Ajaxの上を行く技術 - Blog by Sadayuki Furuhashi

    上を行くかどうかは知りませんが :-p Ajaxはクライアントの都合でサーバーに通信を仕掛けるpull型の通信ができ、Cometはサーバーが好きなタイミングでクライアントへデータを送りつけるpush型の通信ができるわけですが、新たに双方向の通信ができる技術を開発しました。 具体的には、JavaScriptとサーバーの間で双方向のRPCができます。すなわち、サーバーからクライアント側のJavaScriptのメソッドが呼べるし、逆にクライアント側からサーバー側のメソッドを呼ぶこともできます。 サーバー側で call("addMessage", "Hello!") とやると、JavaScript側の function addMessage(msg) { ... } という関数が呼ばれたりします。 この技術を使って、試しにチャットシステムを作ってみました > デモ (ソースコード)*1 リアルタイ

    Comet/Ajaxの上を行く技術 - Blog by Sadayuki Furuhashi
  • P2P分散ストレージ「Cagra」 - Blog by Sadayuki Furuhashi

    id:nyaxt氏との共同開発の分散ストレージ「Cagra」(かぐら)のアルファ版をリリースしました。 cagra α3リリース cagra テクニカルデモ α2リリース 分散ストレージエンジンテクニカルデモ α版リリース cagraのα版試してみたよ - takumalog Cagraは以下のような特徴を持った(目指した)P2P分散ストレージです。 Zeroconf マルチマスタでレプリケーションするWrite 高速な分散Read オプションで高速な非同期Write インターネットレベルよりもLANレベルのマシン台数に特化 巨大データサポート 高速イベント駆動システムコール+軽量スレッド 超アジャ〜イルな開発体制 まだα版で全部が実装されているわけではないですが、とりあえず動きます。 Zeroconf UDPマルチキャストでノードを自動的に発見するので、一切設定ファイルを書かずに動作せる

    P2P分散ストレージ「Cagra」 - Blog by Sadayuki Furuhashi
  • initramfs - VIVERの技術 - Blog by Sadayuki Furuhashi

    今その価値が見直されようとしているかもしれないinitramfs。initramfs内ではほとんど何もできないかと思いきや、試してみると実は「何でもできる」ことが分かります。 そうなると、いろいろやりたくなるわけですが、initramfs内でやることと言えば大体決まっていて(ブートパラメータの解釈、ハードウェア認識、カーネルモジュールのロード、デバイスノードの作成、ネットワークの起動、HDDのマウント、tmpfsのマウントと引き継ぎファイルの避難、switch_rootなどなど)、そのあたりをVIVERの中からinitramfs内のコードを取り出してライブラリ風に使えるようにしようというアイディア(VIVER CORE)があって、ちまちまと作っています。が、WikiFormeなどなどに手を出しているうちに、素晴らしい記事が。 initramfs (initrd) の init を busy

    initramfs - VIVERの技術 - Blog by Sadayuki Furuhashi
  • 余ったホームページを活用するアイディア - Blog by Sadayuki Furuhashi

    Webブラウザを起動したときに最初に出てくるページの方のホームページ。 今時、検索エンジンは右上にあるし、ポータルサイトのトップページはごちゃごちゃして目障りだし、ニュースサイトはRSSリーダがあるし、実は皆さんホームページが余っているじゃなかろうか。(自分だけだったりして) そこで、「ホームページ作成ツール」があったらおもしろいんじゃないか。 たとえば、ブラウザを起動すると、左上にカレンダーとTODOリスト、上にデジタル時計+ファジー時計、というのは普通だけど、左にファイラ、下にメーラ、右にmixiのトップページ(の欲しいところだけ)とか。さらに真ん中に空きスペースがあって、周囲にあるアイコンをドラッグして持ってくると、うにうにとアニメーションした上で、他のサイト(の一部)や、他のモジュールが表示されたりする。 ブラウザとメーラを両方起動しておくというのは、何か時代遅れ感が漂う。どうせブ

    余ったホームページを活用するアイディア - Blog by Sadayuki Furuhashi
  • 分散ファイルシステム/ブロックデバイスをまとめる - Blog by Sadayuki Furuhashi

    昨日KLab勉強会#2の資料を公開しましたが、その中で動的な分散ファイルシステムを設計していると書きました。分散ファイルシステムというのは既にいろいろ存在しているわけですが、情報が分散していてサッパリ分からないので、このあたりでまとめてみたいと思います。 間違っていたり古かったりするに違いないので、正確な情報は家の情報を参照してください。 ファイルシステムレイヤー NFS GFS(Global File System) OCFS GlusterFS Lustre 下位レイヤー Filesystem Block Device Block Device Filesystem Block Device 読み込み ○ ○ ○ ○ ○ 書き込み ○ ○ ○ ○ ○ アクセスの冗長化 × ○ ○ ○(負荷分散と排他) × データの冗長化 下位レイヤーに依存 下位レイヤーに依存 下位レイヤーに依存 ○

    分散ファイルシステム/ブロックデバイスをまとめる - Blog by Sadayuki Furuhashi
  • IPAX2007の資料を公開します - Blog by Sadayuki Furuhashi

    6月28日から29日に行われたIPAX 2007に出展しました。その際の資料を公開します。 ポスター(PDF 3.1MB) PDFプレゼンテーション(PDF 3.1MB) 対話型プレゼンテーション 高解像度版(QuickTime 11.2MB) 対話型プレゼンテーション 通常版(QuickTime 1.6MB) VIVERの表面的な動作のみ紹介しています。詳しく踏み込んだ内容については、KLab#2勉強会の資料と説明(KLab勉強会#2の資料を公開します - DSAS開発者の部屋)をご覧ください。

    IPAX2007の資料を公開します - Blog by Sadayuki Furuhashi
  • WikiForme - 自分用Wiki記法パーサ - Blog by Sadayuki Furuhashi

    はてな記法、PukiWiki記法、tDiary記法などなど、世の中「なんとか記法」が溢れているわけですが、往々にして「自分にぴったり合う記法なんてどこにも無い!」という結論に達する場合が多く、結果として「なんとか記法」の乱立を生んでいるのではないでしょうか。 というわけで、自分専用のWiki記法を簡単に作れるカスタマイザブルパーサ WikiForme を作ってみました。乱立乱立! 記法を統一しようなんてムリですよね。もはや宗教論争です。自分専用の記法があればいいんです。 ※2007/09/23: バージョン 0.3をリリースしました > WikiForme 0.3 リリース! - 構造化Wiki記法パーサ ※2007/09/13: バージョン 0.2をリリースしました > WikiForme 0.2 - 構造化Wiki記法パーサ ※2007/08/08: バージョン 0.1をリリースしまし

    WikiForme - 自分用Wiki記法パーサ - Blog by Sadayuki Furuhashi
  • みんなでターミナル Partty! 0.1リリース! - Blog by Sadayuki Furuhashi

    1つのターミナルを複数の人で同時に操作できるソフトウェア Partty のバージョン0.1をリリースしました! 万が一Parttyをご存じない方は、こちらをご覧ください。 ダウンロード: partty-0.1.tar.gz コンパイル LinuxMac OS Xで動作することを確認しています。LinuxではMakefileを以下のように修正してください。 # for Linux -#LDFLAGS += -lutil +LDFLAGS += -lutil そしてmakeしてください。 $ makeうまくいけばparttyという名前のバイナリができます。うまくいかなかったら、いろいろいじってみてください。 使い方 * Partty Host (create new session) [listen on TCP ]$ partty host # use default port [2577

    みんなでターミナル Partty! 0.1リリース! - Blog by Sadayuki Furuhashi
  • NBD + Device Mapper + OCFS2 + 動的にノードを追加 - Blog by Sadayuki Furuhashi

    最近のトレンドであるクラスタファイルシステムの一つ「OCFS2」を、4+1台のPCで動かしてみました。(1台は後から追加) ディスクの共有には今流行の「iSCSI」ではなく、Linuxの知られざる古参機能「NBD」(Network Block Device)を使用。NBDを4台のマシンで動かして、それをDevice Mapperを使ってRAID 0アレイにして、それをOCFS2で共有します。(mdadm RAID1はうまくいかず) NBDはiSCSIと似た感じのもので、サーバーにあるファイルやブロックデバイスをクライアント側でブロックデバイスとして認識できます。V-FIELDを開発する前はVIVERで使っていました。RAID 0にするには素直にmdadmを使えばいいのですが、普通だと普通なので。 ディストリビューションはMandriva Linux 2007.1、カーネルはディストリビュー

    NBD + Device Mapper + OCFS2 + 動的にノードを追加 - Blog by Sadayuki Furuhashi
  • typoでも動くbash alias - Blog by Sadayuki Furuhashi

    前回に引き続きCUIなネタを。 シェルでコマンドを打つとき、長いコマンドは補完を使うので打ち間違えないのですが、「vi」や「ls」などの短いコマンドは補完を使わないのでよく打ち間違えます。特に入力に右手と左手を両方を使うコマンドは、両手の連携が必要になるので、毎回正確に入力するのは非常に困難です。 そこで、たとえ「sl」だろうと「lls」だろうと「lss」だろうと、「ls」を起動してくれるように設定しています。これで毎日のストレスを数%削減できます。 ということで、まずはls。slは当然lsのaliasですよね。汽車が走り出した上にSIGINTも無視するなんて、ネタであってマジではないですよね。 alias sl="ls" alias lls="ls" alias lss="ls" alias l="ls" alias ll="ls -l" alias lll="ll" alias lll

    typoでも動くbash alias - Blog by Sadayuki Furuhashi
  • vimしか使えない - Blog by Sadayuki Furuhashi

    vimを使おう - ウノウラボ vimerとしては、こういう記事を見つけてしまうと黙っていられないわけです。vimerと言っても、私はhjklがどうしても慣れずに矢印キーを使ってしまう軟弱vimerですが。 そんなわけで、私もちょっとしたvimのtipsを紹介したいと思います。 私が使っているvimのバージョンはvim 7.0なので、vim 6.xでは動かない機能があるかもしれません(特に補完のあたり)。そう言う場合は、vim 7.0をコンパイルして入れましょう。(そのときはvimshellのパッチを是非…vimshellはvim>7.0-0には当たらないので注意) バックアップファイルの保存先 まずは地味なところから。 vimでファイルを編集すると、そのファイルと同じディレクトリに「~」が末尾に付いたバックアップファイルと、同じように「.swp」が付いたファイルが作られますが、これがなか

    vimしか使えない - Blog by Sadayuki Furuhashi
    kanbayashi
    kanbayashi 2007/06/13
    vimはrubyで拡張可能
  • 1