<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>O&apos;Reilly Japan Community Blog</title>
        <link>http://www.oreilly.co.jp/community/blog/</link>
        <description>このblogには、オライリーWebサイト協力者からの寄稿記事や、独自のインタビュー、レポート記事などを掲載します。</description>
        <language>ja</language>
        <copyright>Copyright 2012</copyright>
        <lastBuildDate>Fri, 03 Feb 2012 14:30:00 +0900</lastBuildDate>
        <generator>http://www.sixapart.com/movabletype/</generator>
        <docs>http://www.rssboard.org/rss-specification</docs>
        
        <item>
            <title>Webサービスにおける外部APIの使用(その1) - キャッシュ</title>
            <description><![CDATA[<p class="lead">ここ最近のWebサービスでは、Googleを始めとする他のサービスが提供するAPIを使用して、そのデータを活用するというのが当たり前になってきており、また、そのためのライブラリ等の基盤も整っています。今回はそうしたライブラリの使い方からちょっとだけ先に進んで、外部APIのアクセス数制限を回避するためのキャッシュについて説明します。</p>
<div class="section" id="introduction">
<h1>はじめに</h1>
<p>はじめまして。Retty株式会社の鹿島と申します。今回からこのblogに記事を書かせていただくことになりました。今後、読者の皆さんのご意見なども取り入れつつ、何か役に立つような内容を書いていければと思っていますので、よろしくお願いします。</p>
<p>この記事の内容ですが、我々が開発しているRettyというWebサービスでの実例を通じて、教科書にはあまり載っていないtips、落とし穴等を紹介したいと思います。対象読者として以下のような方を想定しています。</p>
<ul class="simple">
<li>Webサービス開発に興味がある人</li>
<li>これからはじめようと思っている人（比較的初心者の方）</li>
</ul>
<p>具体的には以下のような経験があることを前提としています。</p>
<ul class="simple">
<li>（言語を問わず）プログラミングの経験</li>
<li>Facebook等のWebサービスの使用経験</li>
</ul>
<p>このサイトに来ている方の大多数は、この前提をクリアしているだろうと思います。</p>
</div>
<div class="section" id="retty">
<h1>Rettyのサービス概要</h1>
<div class="figure">
<img alt="Rettyのサービスページ" src="./retty-01.png" style="width: 300px;">
<p class="caption">Rettyのサービスページ</p>
</div>
<p>まずは、我々が開発しているRettyというサービスについて少し紹介させて下さい。<a class="reference external" href="http://retty.me/">Retty</a>は「行ったお店を共有する、記録するソーシャルグルメサイト」です。具体的な機能は以下のようになります。</p>
<ul class="simple">
<li>行ったお店のレビューを投稿する</li>
<li>「友達」や「嗜好の合う人」をフォローして、その人達の投稿をタイムライン（TL）上で閲覧する</li>
<li>行きたい店があった場合には、行きたいリストに追加する</li>
<li>スマートフォンで、現在地付近の人気のお店、行きたいリストに追加したお店を検索する</li>
</ul>
<p>サービスはWeb、iPhone、Androidのマルチプラットフォームで展開していますが、以下のように使い分けている方が多いようです。</p>
<ul class="simple">
<li>TLの閲覧やお店の行きたいリストへの追加 → Web</li>
<li>現在地付近のお店検索                   → スマートフォン</li>
<li>投稿                                   → Web、スマートフォン両方</li>
</ul>
</div>]]></description>
            <link>http://www.oreilly.co.jp/community/blog/2012/02/using-api-on-web-service-part1.html</link>
            <guid>http://www.oreilly.co.jp/community/blog/2012/02/using-api-on-web-service-part1.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">Contributors Post</category>
            
            
            <pubDate>Fri, 03 Feb 2012 14:30:00 +0900</pubDate>
        </item>
        
        <item>
            <title>オライリー・ジャパンのePUBフォーマットを支える制作システム</title>
            <description><![CDATA[<p class="lead">オライリー・ジャパンから先日発表されたプレスリリース「<a class="reference external" href="http://www.oreilly.co.jp/sales/2012/01/ebook-only-title-coming-up-soon.html">ePUBフォーマットによる電子書籍のラインナップを開始します</a>」にあるとおり、弊社トップスタジオはオライリー・ジャパンとの共同事業として、ePUBフォーマットでの電子書籍の制作を開始しました。
トップスタジオではこのePUBフォーマット電子書籍の出版候補の選定、翻訳、編集、そしてePUB制作までに関わっています。本稿では、このePUBの制作プロセスを支えるシステムにフォーカスを当て、その仕組みについて紹介します。</p>

<div class="section" id="id2">
<h1>フリーソフトウェア/オープンソースソフトウェアの集合体としてのシステム</h1>
<p>ePUBの作成にはいろいろな手法がありますが、制作を支えるシステムを構築する上で最も重視したのは、できる限り自動化し、手作業による調整を最小限にするということでした。そのため、このシステムでは原稿を常に最新マスターデータとしてそこから一方向にePUBを作成するバッチ型としており、たとえばSigilなどでePUBを後で細かに手直しする、といった手法は採用していません。</p>
<p>また、将来にわたって保守・改良が制作関係者自身の手でできるよう、中核部分をフリーソフトウェア/オープンソースソフトウェアで構成し、原稿の形式もオープンなものであることも当然の前提です。</p>
<p>さらに、訳者や編集者など制作にかかわる人たち（このシステムのユーザ）は、文章についてはプロフェッショナルであるもののソフトウェアについてはそうではありません（逆もまた真なり、ですね）。新しくツールを導入したことでそれに振り回されないように、ユーザ側から見て新しく導入するものを最小限にし、面倒な部分はできるだけシステムの内部に置くとともに、原稿の文法エラーチェックなどを自動化し、原稿更新に合わせて即座にePUBやHTMLのプレビューもできるようにする必要もありました。</p>
<p>こうした背景からできあがったのが、次の図に示すシステムです。</p>
<div class="figure align-center">

<a class="reference external image-reference" href="./system-desc.png"><img alt="オライリー・ジャパンのePUBを制作しているシステム" src="./system-desc.png" style="width: 550px;" /></a>

<p class="caption">オライリー・ジャパンのePUBを制作しているシステム</p>

</div>
<p>このシステムで採用している技術やソフトウェアの概要をまとめてみます。</p>
</div>]]></description>
            <link>http://www.oreilly.co.jp/community/blog/2012/01/free-opensouce-softwares-support-orj-epub-titles.html</link>
            <guid>http://www.oreilly.co.jp/community/blog/2012/01/free-opensouce-softwares-support-orj-epub-titles.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">Contributors Post</category>
            
            
            <pubDate>Tue, 31 Jan 2012 11:30:00 +0900</pubDate>
        </item>
        
        <item>
            <title>Python の名前空間とスコープ</title>
            <description><![CDATA[<div class="lead">
<p>プログラムのロジックを考え、実装を行う上で、変数の名前空間やスコープはとても重要です。
これらはロジックを組み立てる上での複雑さに直結し、ソースコードの読みやすさにダイレクトに関係してくるためです。
この記事では、私が Python で開発をする上で気をつけるようにしている名前空間やスコープに関するお話をします。</p>
</div>
<div class="section" id="id1">
<h3>対象環境</h3>
<p>この記事では、 Python 2.7.2 でソースコードを実行して確認しています。</p>
</div>
<div class="section" id="id2">
<h3>コーディングスタイルについて</h3>
<p>名前空間やスコープの前に、まずは基本的なコーディングスタイルについて軽くお話しします。</p>
<p>Python のコーディングスタイルというと、 <a class="reference external" href="http://www.python.org/dev/peps/pep-0008/">PEP 8 &#8211; Style Guide for Python Code</a> (日本語訳は <a class="reference external" href="http://oldriver.org/python/pep-0008j.html">こちら</a> )が有名です。
これは、 Python でプログラムを書く上で守っておくとよいお作法について書かれており、 Python のコーディングスタイルとしてはデファクトスタンダードといえるでしょう。</p>
<p>この PEP8、例えば以下のようなことが書かれています。</p>
<ul class="simple">
<li>インデントは 4 スペースで</li>
<li>タブとスペースを混ぜて使わない</li>
</ul>
<p>といったような Python らしいインデントの話から</p>
<ul class="simple">
<li>演算子の前後にスペースを入れる</li>
<li>代入演算子を縦にそろえるためスペースを入れることはしない</li>
<li>モジュール・クラス・変数・関数などの名規則</li>
<li>推奨される例外処理方法</li>
</ul>
<p>などの書き方に関することまで広範に及びます。</p>
<p>Python で開発をするのであれば一読しておくことをオススメします。
また、このスタイルを守ると多くの Pythonista にとって読みやすいソースコードになるのではないでしょうか。</p>
</div>
]]></description>
            <link>http://www.oreilly.co.jp/community/blog/2011/11/namespace-and-scope-in-python.html</link>
            <guid>http://www.oreilly.co.jp/community/blog/2011/11/namespace-and-scope-in-python.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">Contributors Post</category>
            
            
            <pubDate>Mon, 21 Nov 2011 11:30:00 +0900</pubDate>
        </item>
        
        <item>
            <title>git-flow によるブランチの管理</title>
            <description><![CDATA[<p class="lead">今回は分散バージョン管理システムgitと共に用いる「ブランチモデル」について紹介していただきます。gitを使ってみて、その高機能さをどう使えば良いか悩まれた方は、ぜひ本稿をご一読ください。gitそのものの使い方については解説していませんので、その際には『 <a class="reference external" href="http://www.oreilly.co.jp/books/9784873114408/">実用git</a> 』などの書籍を参考にしてください。</p>
<p>git-flow は Vincent Driessen 氏によって書かれた
<a class="reference external" href="http://nvie.com/posts/a-successful-git-branching-model/">A successful Git branching model</a> (<a class="reference external" href="http://keijinsonyaban.blogspot.com/2010/10/successful-git-branching-model.html">O-Show 氏による日本語訳</a>) というブランチモデルを補助するための git 拡張です。
git-flow を利用する前には、まずこの文章を一読することをおすすめします。
その骨子については、 <a class="reference external" href="http://d.hatena.ne.jp/Voluntas/20101223/1293111549">Voluntas 氏のブログ</a> が参考になります。</p>
<p>git を使うメリットの 1 つは、そのブランチモデルです。しかし gitを使っていると、その高い柔軟性から各開発者ごとにブランチが <strong>分散</strong> しがちであったり、最新バージョンが把握しにくいといった不便を感じることがあります。</p>
<p>このツールを導入することで、git の長所を損なわずに、</p>
<ul class="simple">
<li>分散型バージョンコントロールシステムである git に集中型 (Subversion 等) の長所を取り入れることができる</li>
<li>チーム内でブランチモデルを共通化できる</li>
</ul>
<p>などの利点を得ることが可能です。</p>
<p>分散型に対する集中型の長所は、</p>
<ul class="simple">
<li>リポジトリが 1 つのため、管理が簡単</li>
<li>マスターが 1 つのため、最新バージョンが把握しやすい</li>
<li>コミットすべきリポジトリがわかりやすい。</li>
</ul>
<p>と言われています。これは、リポジトリが 1 箇所にあることの長所であり、短所です。
git-flow では、中央と <strong>みなす</strong> リポジトリ <tt class="docutils literal">origin</tt> を作成することで、この長所を取り入れています。</p>
<blockquote>
<div class="figure">
<img alt="centr-decentr.png" src="http://www.oreilly.co.jp/community/blog/2011/11/images/centr-decentr.png" />
</div>
<p>Git ブランチモデル（ <a class="reference external" href="http://nvie.com/posts/a-successful-git-branching-model/">A successful Git branching model</a> より。Creative Commons BY-SA ライセンス）</p>
</blockquote>
<p>git-flow のブランチモデルを要約すると、</p>
<p><tt class="docutils literal">origin</tt> には <tt class="docutils literal">master</tt>, <tt class="docutils literal">develop</tt> という 2 つの <strong>メインブランチ</strong> を保持します。</p>
<ul class="simple">
<li>master: リリースブランチ。プロダクトとしてリリースするためのブランチ。リリースしたらタグ付けする。集中型でいう trunk、tag。</li>
<li>develop: 開発ブランチ。コードが安定し、リリース準備ができたら master へマージする。リリース前はこのブランチが最新バージョンとなる。</li>
</ul>
<p>各開発者は <tt class="docutils literal">master</tt>, <tt class="docutils literal">develop</tt> の他に、フィーチャーブランチ、リリースブランチ、ホットフィックスブランチという <strong>サポートブランチ</strong> を利用し分散開発します。このブランチは最終的には破棄されます。各ブランチの目的は</p>
<ul class="simple">
<li>フィーチャーブランチ: 機能の追加。 <tt class="docutils literal">develop</tt> から分岐し、 <tt class="docutils literal">develop</tt> にマージする。</li>
<li>リリースブランチ: プロダクトリリースの準備。
機能の追加やマイナーなバグフィックスとは独立させることで、
リリース時に含めるコードを綺麗な状態に保つ（機能追加中で未使用のコードなどを含まないようにする）ことができる。
<tt class="docutils literal">develop</tt> ブランチにリリース予定の機能やバグフィックスがほぼ反映した状態で <tt class="docutils literal">develop</tt> から分岐する。
リリース準備が整ったら, <tt class="docutils literal">master</tt> にマージし、タグをつける。次に <tt class="docutils literal">develop</tt> にマージする。</li>
<li>ホットフィックスブランチ: リリース後のクリティカルなバグフィックスなど、
現在のプロダクトのバージョンに対する変更用。 <tt class="docutils literal">master</tt> から分岐し、
<tt class="docutils literal">master</tt> にマージし、タグをつける。次に <tt class="docutils literal">develop</tt> にマージする。</li>
</ul>
<p>となります。このサポートブランチにより、マージ、コミットすべきブランチを明確化することができます。</p>
]]></description>
            <link>http://www.oreilly.co.jp/community/blog/2011/11/branch-model-with-git-flow.html</link>
            <guid>http://www.oreilly.co.jp/community/blog/2011/11/branch-model-with-git-flow.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">Contributors Post</category>
            
            
            <pubDate>Mon, 07 Nov 2011 09:30:00 +0900</pubDate>
        </item>
        
        <item>
            <title>番外編: LiveCDのファイルシステム（2）</title>
            <description><![CDATA[<div class="section" id="id7">
<p class="lead">今回は、前回取り上げた<tt class="docutils literal">squashfs</tt>,<tt class="docutils literal">aufs</tt>,<tt class="docutils literal">cloop</tt>,<tt class="docutils literal"><span class="pre">dm-snapshot</span></tt>の各機能を用いた、LiveCDに必要な機能を実現するための組合せを考えてみます。
なお、本記事は<a class="reference external" href="http://sourceforge.net/mailarchive/forum.php?thread_name=20986.1293537718%40jrobl&amp;forum_name=aufs-users">http://sourceforge.net/mailarchive/forum.php?thread_name=20986.1293537718%40jrobl&amp;forum_name=aufs-users</a>を元にしています。</p>
<h1>方式ごとの性能比較</h1>
<p>ここまで、<tt class="docutils literal">squashfs</tt>,<tt class="docutils literal">aufs</tt>,<tt class="docutils literal">cloop</tt>,<tt class="docutils literal"><span class="pre">dm-snapshot</span></tt>の各機能を簡単に紹介しました。次にLiveCDに必要な機能を実現するための組合せを考えてみます。組合せ要素には圧縮された読み取り専用下位レイヤ、書き込み可能上位レイヤ、両レイヤの結合方法の三種類がありますが、前述のようにdm-snapshotの場合にはファイルシステム種類に条件が加わるため、次のようになります（<a class="reference internal" href="#id8">表1</a>）。</p>
</div>
]]></description>
            <link>http://www.oreilly.co.jp/community/blog/2011/02/filesystems-livecd-using-part2.html</link>
            <guid>http://www.oreilly.co.jp/community/blog/2011/02/filesystems-livecd-using-part2.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">Programmer&apos;s High</category>
            
            
            <pubDate>Mon, 28 Feb 2011 10:00:00 +0900</pubDate>
        </item>
        
        <item>
            <title>番外編: LiveCDのファイルシステム（1）</title>
            <description><![CDATA[<img src="http://www.oreilly.co.jp/community/blog/images/union/pg_high_logo.png" alt="http://www.oreilly.co.jp/community/blog/images/union/pg_high_logo.png" />

<p class="lead">Linuxをハードディスクへインストールせずに使用するLiveCD/DVDも広く利用されるようになり、多くのディストリビューションが従来のインストール媒体／方法に加え、LiveCDをリリースしています。ほとんどのLiveCDではsquashfs、tmpfs、更にAUFSを用い、ハードディスクへインストールしない形態を実現していますが、本記事ではその他の方法も取り上げ、考察します。
なお、本記事は<a class="reference external" href="http://sourceforge.net/mailarchive/forum.php?thread_name=20986.1293537718%40jrobl&amp;forum_name=aufs-users">http://sourceforge.net/mailarchive/forum.php?thread_name=20986.1293537718%40jrobl&amp;forum_name=aufs-users</a>を元にしています。</p>
<div class="section" id="id1">
<h1>古代の構成</h1>
<p>一般的にLinux LiveCDではシステムをインストールした状態のファイルシステムを圧縮し、読み取り専用ファイルシステムイメージとして収納してあります。この際に用いられるのがsquashfsなどのファイルシステムですが、ここからそのままシステムを起動しても読み取り専用ですから、使用できない部分が生まれます。</p>
<p class="footnote">圧縮の反対動作を指す言葉は伸長とも表現されますが、本記事では展開と表現します。</p>
<p>例えば、システムを起動すれば各種ログファイルや<tt class="docutils literal">/var/wtmp</tt>ファイルに対する書き込みが発生しますし、ファイルシステムをマウントすれば<tt class="docutils literal">/etc/mtab</tt>というファイルも更新されます。デーモンが起動されればサービスに必要な各種ファイルなども作成されます。それぞれを一つづつ調査し、書き込みが発生しないように対処して行くことも不可能ではないかもしれませんが、もちろん手間がかかります。そもそもLinux（UNIX）システムは書き込み可能ファイルシステム上で動作することを前提としているのですから、この努力は有意義とは言えないでしょう。</p>

<p>かつてはシャドウディレクトリ方式で対応しようという時代もありました。シャドウディレクトリとはやや古い呼び方かもしれませんが、X.Org/XFree86以前のX11 Window Systemのビルドなどにも用いられていた（と思うけど、記憶に自信がなくなってきた ）形態です。例えば、ソースファイルが置かれた<tt class="docutils literal">src/</tt>下でそのままビルドすると、他のアーキテクチャ用にビルドする際には全オブジェクトファイルを削除しなければなりません。そうすると、先のアーキテクチャ用のリビルド時にはまた初めからすべてをコンパイルしなければならず、この手間暇を節約するための方策として、<tt class="docutils literal">obj/</tt>を別に用意し、全てのソースファイルのシンボリックリンクを<tt class="docutils literal">obj/</tt>下に作成する方法が採られました。この形態がシャドウディレクトリで、ビルドされるオブジェクトファイルは<tt class="docutils literal">obj/</tt>下に作成され、ソースファイルを書く場合にもディレクトリの差異を気にする必要もありません。<tt class="docutils literal">lndir(1)</tt>を用いると、子ディレクトリ、孫ディレクトリも含んだシャドウディレクトリを作成できます。</p>
</div>
]]></description>
            <link>http://www.oreilly.co.jp/community/blog/2011/02/filesystems-livecd-using-part1.html</link>
            <guid>http://www.oreilly.co.jp/community/blog/2011/02/filesystems-livecd-using-part1.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">Programmer&apos;s High</category>
            
            
            <pubDate>Wed, 09 Feb 2011 13:00:00 +0900</pubDate>
        </item>
        
        <item>
            <title>その1：ログ処理編-CDBを利用した簡易KVS</title>
            <description><![CDATA[<div class="section" id="id1">
<p class="lead">大量のリクエストを捌くWebサイトを構築するには、さまざまなノウハウがあります。例えばオライリーの書籍『ハイパフォーマンスWebサイト』では、クライアントに配信するコンテンツを最適化することでパフォーマンスの向上を図っています。今回は、Pythonを使って月間10億を超える（！）リクエストを捌いている、株式会社クロスリスティングの方に、そのノウハウの一部を寄稿していただきました。<br />また、本記事の内容は<a href="http://atnd.org/events/2906">Python Hack-a-thon 2010.07</a>でのプレゼンテーションを元にしています</p>
</div>
<div class="section" id="id2">
<h2>自己紹介</h2>
<p>現在、私はクロスリスティングという会社で、広告配信システムとか、その周辺の新規商品関連の研究開発をやっています。メインのプログラミング言語はPythonです。自社でのシステム開発は基本的に全てPythonを使っています。自分は研究開発的なポジションですが、技術チームが開発しているプロダクションシステムもほぼ100% Pythonで開発されています。</p>
<p>「Pythonはバイトコードインタプリタのランタイムで動作するので、（JITを含めて）ネイティブコードにコンパイルする言語に比べて、実効速度の点で不利でありハイトラフィックなWebサービスの実装言語として向かないのではないか」という話を良く聞きます。今回は、Pythonで構築されているWeb広告配信サーバと、その周辺ツールについて、すこし紹介できればと思っています。</p>
</div>]]></description>
            <link>http://www.oreilly.co.jp/community/blog/2011/01/processing-log-with-python.html</link>
            <guid>http://www.oreilly.co.jp/community/blog/2011/01/processing-log-with-python.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">1ヶ月10億超のリクエストを処理するPythonベースの広告配信システムの中身をちょっとだけ</category>
            
            
            <pubDate>Tue, 18 Jan 2011 10:00:00 +0900</pubDate>
        </item>
        
        <item>
            <title>Python 3 のオブジェクト文字列表現</title>
            <description><![CDATA[<p class="lead">2008年にリリースされたPython 3。さまざまな機能が追加、更新されている中に私たち日本人にとっては嬉しい機能が追加されています。今回はその機能を提案・設計したご本人に解説をご寄稿いただきました。<br />また、本記事の内容は<a href="http://atnd.org/events/2906">Python Hack-a-thon 2010.07</a>でのプレゼンテーションを元にしています</p>
<div class="section" id="python-2-x">
<h1>Python 2.x までのオブジェクト文字列表現</h1>
<p>Pythonを使ってプログラムを開発していると、デバッグ中などにこんな感じの文字列をよく目にします。</p>
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%"><span style="color: #666666">&gt;&gt;&gt;</span> <span style="color: #BA2121">&quot;abc</span><span style="color: #BB6622; font-weight: bold">\t</span><span style="color: #BA2121">def&quot;</span>
<span style="color: #BA2121">&#39;abc</span><span style="color: #BB6622; font-weight: bold">\t</span><span style="color: #BA2121">def&#39;</span>
<span style="color: #666666">&gt;&gt;&gt;</span> datetime<span style="color: #666666">.</span>datetime<span style="color: #666666">.</span>now()
datetime<span style="color: #666666">.</span>datetime(<span style="color: #666666">2010</span>, <span style="color: #666666">7</span>, <span style="color: #666666">9</span>, <span style="color: #666666">13</span>, <span style="color: #666666">37</span>, <span style="color: #666666">49</span>, <span style="color: #666666">107000</span>)

</pre></div>
<p><tt class="docutils literal">&quot;abc\tdef&quot;</tt>や<tt class="docutils literal">datetime.datetime.now()</tt>という式を評価した結果が、<tt class="docutils literal">'abc\tdef'</tt>と<tt class="docutils literal">datetime.datetime(2010, 7, 9, 13, 37, 49, 107000)</tt>のように表示されています。このような、Pythonの値をデバッグ用に読みやすく整形した文字列を「オブジェクトの文字列表現」と言います。</p></div>]]></description>
            <link>http://www.oreilly.co.jp/community/blog/2010/12/string-reprensation-in-python3.html</link>
            <guid>http://www.oreilly.co.jp/community/blog/2010/12/string-reprensation-in-python3.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">Contributors Post</category>
            
            
            <pubDate>Wed, 08 Dec 2010 15:00:00 +0900</pubDate>
        </item>
        
        <item>
            <title>JSON形式による書誌情報の提供をはじめました</title>
            <description><![CDATA[<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://www.oreilly.co.jp/community/blog/renamed_ebook1.html" onclick="window.open('http://www.oreilly.co.jp/community/blog/renamed_ebook1.html','popup','width=400,height=400,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://www.oreilly.co.jp/community/blog/assets_c/2010/10/renamed_ebook-thumb-200x200.jpg" width="200" height="200" alt="renamed_ebook.jpg" class="mt-image-left" style="float: left; margin: 0 20px 20px 0;" /></a></span><p>「<a href="http://www.oreilly.co.jp/ebook/">O'Reilly Japan Ebook Store</a>」サイトのオープンからもうすぐ2年経過します。販売タイトルも、当初はわずか20タイトルほどだったのですが、現在では160タイトルほどになり、カタログに掲載されている書籍の半分弱くらいになっています。</p>
<p>ところでこのEbook、ご購入後にサイトからダウンロードしていただくと、ファイル名が「&lt;16進数の羅列&gt;-&lt;書籍のISBN&gt;.pdf」という形式になっています。もちろん変更はできるのですが、そのまま電子書籍リーダーなどに読み込むと、画面が英数字の羅列だらけになってしまいます。</p>
<p>かく言う私たちも、イベント出展にサンプルのEbookを持って行くことがあるのですが、イベント会場でISBNだけがズラ―っと並んだ画面をお見せするのをとても心苦しく思っていました。</p>
<p>以前は手作業でファイル名を変更していたのですが、100タイトルを超えた辺りで心が折れました。Amazon APIを使って書名を取得すればいいことは分かっていたのですが、発行元がそれをしてしまったら負けな気がします。</p>
<p>そこでWebサイトの書誌情報を以下のようなURLで取得できるように、テンプレートを1つ追加しました。ファイル名をご覧いただくと分かるように、簡単な書誌情報をJSON形式でご提供しています。</p>
<p><a class="reference external" href="http://www.oreilly.co.jp/books/9784873114569/biblio.json">http://www.oreilly.co.jp/books/9784873114569/biblio.json</a></p>]]></description>
            <link>http://www.oreilly.co.jp/community/blog/2010/11/bibliographical-info-in-json.html</link>
            <guid>http://www.oreilly.co.jp/community/blog/2010/11/bibliographical-info-in-json.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">Inside O&apos;Reilly</category>
            
            
            <pubDate>Wed, 24 Nov 2010 18:00:00 +0900</pubDate>
        </item>
        
        <item>
            <title>バッファキャッシュとAIO（4）</title>
            <description><![CDATA[<img alt="http://www.oreilly.co.jp/community/blog/images/union/pg_high_logo.png" src="http://www.oreilly.co.jp/community/blog/images/union/pg_high_logo.png" />
<p class="lead">前回はPOSIX AIOとLinuxカーネルのAIOサポートについて解説しました。今回は、このAIOの使い勝手を良くするため、POSIX AIOインタフェース準拠のライブラリを作成しています。</p>
<div class="section" id="linuxaioliblaio">
<h2>LinuxネイティブAIOライブラリliblaioの試作</h2>
<p>Linux AIOを使用する場合、現在では前述のlibaioの利用が第一候補になりますが、やや使い勝手が悪いため、本記事でPOSIX AIOインタフェース準拠のライブラリを試作してみます。Linux AIOでは<tt class="docutils literal">O_DIRECT</tt>が前提となるため、この点もやや使い勝手が悪いのですが、SSDなどメモリベースのファイルシステムもありますし、動作は非同期になりませんが<tt class="docutils literal">io_submit(2)</tt>は<tt class="docutils literal">O_DIRECT</tt>がなくとも使用可能ですから、まぁ試しにやってみましょう。</p>
<p>ライブラリ設計要点を挙げます。</p>
<div class="section" id="linux-aioposix-aio">
<h3>Linux AIOにPOSIX AIOインタフェースをかぶせる</h3>
<p>簡単に対応をとってみると<a class="reference internal" href="#id20">表3</a>の様になります。</p>
<p><span class="target" id="id20">表3</span> Linux AIOシステムコールとPOSIX AIOインタフェースの対応</p>
<table border="1" class="docutils">
<colgroup>
<col width="50%" />
<col width="50%" />
</colgroup>
<thead valign="bottom">
<tr><th class="head">POSIX AIOインタフェース</th>
<th class="head">Linux AIOシステムコール</th>
</tr>
</thead>
<tbody valign="top">
<tr><td>aio_read</td>
<td rowspan="4">io_submit</td>
</tr>
<tr><td>aio_write</td>
</tr>
<tr><td>aio_fsync</td>
</tr>
<tr><td>lio_listio</td>
</tr>
<tr><td>aio_suspend</td>
<td rowspan="3">io_getevents</td>
</tr>
<tr><td>aio_return</td>
</tr>
<tr><td>aio_error</td>
</tr>
<tr><td>aio_cancel</td>
<td>io_cancel</td>
</tr>
</tbody>
</table>
<p><tt class="docutils literal">io_setup(2)</tt>などの前処理はライブラリ内で自動的に行いますが、プログラマが同時AIO数を拡張するなどの場合も考えられます。このため、Glibc拡張である<tt class="docutils literal">aio_init(3)</tt>を流用／対応すると同時に、<tt class="docutils literal">laio_fin()</tt>も新設し<tt class="docutils literal">io_destroy(2)</tt>に対応します。</p>
</div></div>]]></description>
            <link>http://www.oreilly.co.jp/community/blog/2010/10/buffer-cache-and-aio-part4.html</link>
            <guid>http://www.oreilly.co.jp/community/blog/2010/10/buffer-cache-and-aio-part4.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">Programmer&apos;s High</category>
            
            
            <pubDate>Tue, 26 Oct 2010 11:00:00 +0900</pubDate>
        </item>
        
        <item>
            <title>バッファキャッシュとAIO（3）</title>
            <description><![CDATA[<img alt="http://www.oreilly.co.jp/community/blog/images/union/pg_high_logo.png" src="http://www.oreilly.co.jp/community/blog/images/union/pg_high_logo.png" />
<p class="lead">前回までファイル I/O 全般について簡単に振り返りました。いよいよ本題のAIOに取り掛かります。今回は、POSIXのAIOインタフェースと、LinuxカーネルのAIOサポートについて紹介します。</p>
<h2>POSIX AIO インタフェース</h2>
<p>バッファキャッシュにより緩和されるとはいえ、ファイル I/Oの最終到達地点はディスクですから、同期的なI/Oはやはりその時間が問題視されることがあります。まだバッファキャッシュに存在しないデータを読み取る場合には遅いディスク必ず待たなければなりません。この動作を非同期に行い、待っている間に他の処理を進められるようにするのが非同期 I/O、AIO（Asynchoronous I/O）です。POSIXでは<tt class="docutils literal">aio_read(3)</tt>、<tt class="docutils literal">aio_write(3)</tt>、<tt class="docutils literal">aio_suspend(3)</tt>、<tt class="docutils literal">aio_fsync(3)</tt>、<tt class="docutils literal">aio_return(3)</tt>、<tt class="docutils literal">aio_cancel(3)</tt>、<tt class="docutils literal">aio_error(3)</tt>、<tt class="docutils literal">lio_listio(3)</tt>を定義しています。例えば<tt class="docutils literal">read(2)</tt>に対応するAIOインタフェースは次のように定義されています。</p>
<p>aio_read(3)</p>
<div class="highlight"><pre><span style="color: #BC7A00"># include &lt;aio.h&gt;</span>

<span style="color: #B00040">int</span> aio_read(<span style="color: #008000; font-weight: bold">struct</span> aiocb <span style="color: #666666">*</span>);

<span style="color: #008000; font-weight: bold">struct</span> aiocb {
    <span style="color: #B00040">int</span>             aio_fildes;     <span style="color: #408080; font-style: italic">/*ファイルディスクリプタ */</span>
    <span style="color: #B00040">off_t</span>           aio_offset;     <span style="color: #408080; font-style: italic">/* オフセット */</span>
    <span style="color: #008000; font-weight: bold">volatile</span> <span style="color: #B00040">void</span>   <span style="color: #666666">*</span>aio_buf;       <span style="color: #408080; font-style: italic">/* バッファ */</span>
    <span style="color: #B00040">size_t</span>          aio_nbytes;     <span style="color: #408080; font-style: italic">/* バイト数 */</span>
    <span style="color: #B00040">int</span>             aio_reqprio;    <span style="color: #408080; font-style: italic">/* 相対優先度 */</span>
    <span style="color: #008000; font-weight: bold">struct</span> sigevent aio_sigevent;   <span style="color: #408080; font-style: italic">/* 通知方法 後述 */</span>
    <span style="color: #B00040">int</span>             aio_lio_opcode; <span style="color: #408080; font-style: italic">/* I/O種類 */</span>
};

<span style="color: #BC7A00"># include &lt;signal.h&gt;</span>
<span style="color: #008000; font-weight: bold">struct</span> sigevent {
    <span style="color: #B00040">int</span>             sigev_notify;      <span style="color: #408080; font-style: italic">/* 通知方法 */</span>
    <span style="color: #B00040">int</span>             sigev_signo;       <span style="color: #408080; font-style: italic">/* シグナル番号 */</span>
    <span style="color: #008000; font-weight: bold">union</span> sigval    sigev_value;       <span style="color: #408080; font-style: italic">/* ユーザデータ */</span>
    <span style="color: #B00040">void</span>(<span style="color: #666666">*</span>sigev_notify_function)(<span style="color: #008000; font-weight: bold">union</span> sigval);   <span style="color: #408080; font-style: italic">/* スレッド関数 */</span>
    pthread_attr_t  <span style="color: #666666">*</span>sigev_notify_attributes;     <span style="color: #408080; font-style: italic">/* スレッド属性 */</span>
};
</pre></div>]]></description>
            <link>http://www.oreilly.co.jp/community/blog/2010/09/buffer-cache-and-aio-part3.html</link>
            <guid>http://www.oreilly.co.jp/community/blog/2010/09/buffer-cache-and-aio-part3.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">Programmer&apos;s High</category>
            
            
            <pubDate>Mon, 20 Sep 2010 16:00:00 +0900</pubDate>
        </item>
        
        <item>
            <title>バッファキャッシュとAIO（2）</title>
            <description><![CDATA[<img alt="http://www.oreilly.co.jp/community/blog/images/union/pg_high_logo.png" src="http://www.oreilly.co.jp/community/blog/images/union/pg_high_logo.png" />
<p class="lead">プロセスがブロックする要因の一つにファイルI/Oがあります。これを同期I/Oと言いますが、POSIXではAIO（非同期 I/O、Asynchronous I/O）も定義しており、I/O中でもプロセスがブロックせず他の処理を進められるようになります。
今回は、バッファキャッシュを意識したさまざまなファイルI/Oについて解説します。</p>
<div class="section" id="id12">
<h2>メモリマップ I/O</h2>
<p>ファイルI/Oの一種にメモリマップI/O、<tt class="docutils literal">mmap(2)</tt>があります。<tt class="docutils literal">mmap(2)</tt>（および<tt class="docutils literal">mmap2(2)</tt>）はオープンされたファイルをプロセスアドレス空間へマッピングするもので、例えばアプリケーション内に領域を用意し、ファイルを読み取る動作は次のようにも実装できます。</p>
<p>3mmap.c 要約</p>
<div class="highlight"><pre>{
    <span style="color: #B00040">char</span> a[N];

    fd <span style="color: #666666">=</span> open(path, O_RDONLY);
    read(fd, a, N)
    printf(<span style="color: #BA2121">&quot;%.*s</span><span style="color: #BB6622; font-weight: bold">\n</span><span style="color: #BA2121">&quot;</span>, N, a);
}

{
    <span style="color: #B00040">char</span> <span style="color: #666666">*</span>p;

    fd <span style="color: #666666">=</span> open(path, O_RDONLY);
    p <span style="color: #666666">=</span> mmap(<span style="color: #008000">NULL</span>, sysconf(_SC_PAGESIZE), PROT_READ, MAP_SHARED, fd, <span style="color: #666666">0</span>);
    printf(<span style="color: #BA2121">&quot;%.*s</span><span style="color: #BB6622; font-weight: bold">\n</span><span style="color: #BA2121">&quot;</span>, N, p);
}
</pre></div>
<p>上記2つの関数は同じ内容を表示します。<tt class="docutils literal">read(2)</tt>を用いる場合は、通常静的に宣言した文字配列や<tt class="docutils literal">malloc(3)</tt>により割り当てたメモリ領域を事前に用意しますが、<tt class="docutils literal">mmap(2)</tt>を用いると用意した領域がそのままファイルの内容になります。このためメモリ間のコピー（上の例ではバッファキャッシュからアプリケーション内の配列aへのコピー）を削減できます。対象ファイルがまだ読み取られておらず、バッファキャッシュに存在しない場合は、<tt class="docutils literal">mmap(2)</tt>が返したメモリ領域を参照すると、システム側でディクスから自動的に読み取ります。</p>
<p>上の例では読み取りしか行っていませんが、書き込みも同様に可能です。<tt class="docutils literal">open(2)</tt>、<tt class="docutils literal">mmap(2)</tt>のパラメータを書き込み用に変え、得られたメモリ領域内を変更すると、ファイル書き込みと同等の動作となります。この場合、メモリ領域がディスクへ書き戻す必要があることを通知するのは<tt class="docutils literal">msync(2)</tt>です。<tt class="docutils literal">MS_ASYNC</tt>を指定すると、通知するだけでシステムコールは終了します。<tt class="docutils literal">MS_SYNC</tt>を指定すると、通知に加え、内部で<tt class="docutils literal">fsync(2)</tt>相当の処理も行われ、ディスクにまで書き戻します。</p>
<p><tt class="docutils literal">mmap(2)</tt>したメモリ領域は、アプリケーション終了時に自動的に<tt class="docutils literal">munmap(2)</tt>され、また<tt class="docutils literal">munmap(2)</tt>は<tt class="docutils literal">msync(2)</tt>を包含するため、<tt class="docutils literal">mmap(2)</tt>したメモリ領域を更新後にアプリケーションが終了するならば、明示的な<tt class="docutils literal">msync(2)</tt>は省略可能です。しかし、メモリ更新から<tt class="docutils literal">munmap(2)</tt>まで時間があく可能性がある、またはすぐにデータをディスクにまで保存したいなどの場合には<tt class="docutils literal">msync(2)</tt>を発行します。<tt class="docutils literal">mmap(2)</tt>のパラメータに<tt class="docutils literal">MAP_SHARED</tt>を指定すると、アドレスこそ変換されますがこの領域の参照はシステムが管理するバッファキャッシュの直接参照に相当します。</p>
<p>さらに、ファイルポジションを移動する<tt class="docutils literal">lseek(2)</tt>もユーザ空間だけで解決するアドレス演算で代替でき（上の例では<tt class="docutils literal">p+1</tt>すればファイル内の2バイト目が参照できる）、発行システムコール数を削減できます。</p>
<p><tt class="docutils literal">mmap(2)</tt>は効率的なI/Oに大きく貢献しますが、若干の注意点があります。</p>
<ul class="simple">
<li>システムのメモリ管理に近付くという性質上、パラメータの<tt class="docutils literal">address</tt>、<tt class="docutils literal">length</tt>、<tt class="docutils literal">offset</tt>はメモリページサイズの倍数でなければならない（<tt class="docutils literal">length</tt>にアラインメントを必要としないシステムもある）。</li>
<li>ファイルサイズが小さい場合はプロセスアドレス空間が無駄になる。例えばページサイズが4,096バイトの場合にサイズが1バイトしかないファイルを<tt class="docutils literal">mmap(2)</tt>すると、内容があるのは1バイトだけであり、残り4,095バイトはゼロで埋められ、プロセスアドレス空間を無駄に消費する。</li>
<li>現代では32ビットアドレス空間は不足する場合もある。
上述の無駄に加え、フラグメンテーションが発生する恐れもあり、大きな空き領域が必要な場合に連続した領域が得られなくなることが考えられる。</li>
</ul>
<p>このため、一般的にはある程度のサイズ（少なくともメモリページサイズ以上）を持つファイルでなければ、<tt class="docutils literal">mmap(2)</tt>の効果は薄れると考えられます。やはりLinux固有のシステムコールですが、<tt class="docutils literal">remap_file_pages(2)</tt>というのもあり、同じファイルに対し<tt class="docutils literal">mmap(2)</tt>を複数回発行する場合、2回目以降は<tt class="docutils literal">remap_file_pages(2)</tt>を用いた方が効率向上が期待できます。<tt class="docutils literal">mmap(2)</tt>を発行すると、システム内部ではメモリ管理用の構造体を新たに作成しますが、<tt class="docutils literal">remap_file_pages(2)</tt>を用いると既存の内部構造体を用いるためです。</p>
</div>]]></description>
            <link>http://www.oreilly.co.jp/community/blog/2010/09/buffer-cache-and-aio-part2.html</link>
            <guid>http://www.oreilly.co.jp/community/blog/2010/09/buffer-cache-and-aio-part2.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">Programmer&apos;s High</category>
            
            
            <pubDate>Thu, 02 Sep 2010 16:00:00 +0900</pubDate>
        </item>
        
        <item>
            <title>バッファキャッシュとAIO（1）</title>
            <description><![CDATA[<img alt="http://www.oreilly.co.jp/community/blog/images/union/pg_high_logo.png" src="http://www.oreilly.co.jp/community/blog/images/union/pg_high_logo.png" />
<p class="lead">プロセスがブロックする要因の一つにファイルI/Oがあります。これを同期I/Oと言いますが、POSIXではAIO（非同期 I/O、Asynchronous I/O）も定義しており、I/O中でもプロセスがブロックせず他の処理を進められるようになります。
本記事ではバッファキャッシュからファイル I/Oを解説し、Linuxの<tt class="docutils literal">io_submit(2)</tt>を用いたPOSIX準拠のAIOライブラリを試作してみます。</p>
<h2>ファイルI/Oとバッファキャッシュ</h2>
<p><tt class="docutils literal">io_submit(2)</tt>ではDirect I/Oを用いますが、ライブラリの試作へ進む前にまずファイルI/Oのバッファ（バッファキャッシュ）について整理します。実は単にバッファと言ってしまうと誤解される場面が多くあり、例えばプログラミング入門一般としてファイルI/Oを取り上げる際には、</p>
<ul class="simple">
<li>CPUの動作は速い。ディスクの動作は遅い。</li>
<li>両者の間に速度差を緩和する緩衝地帯を設けないと、CPUの速度が犠牲にされてしまう。</li>
<li>このため、ファイルバッファを用いる。</li>
</ul>
<p>といった説明があり、よく以下のようなサンプルコードが提示されます。</p>
<p>ファイルI/Oサンプルコード</p>
<div class="highlight"><pre>main()
{
<span style="color: #BC7A00">    # define SZ 16</span>
    <span style="color: #B00040">int</span> fd;
    <span style="color: #B00040">char</span> buffer[SZ];

    fd <span style="color: #666666">=</span> open(argv[<span style="color: #666666">1</span>], O_WRONLY <span style="color: #666666">|</span> O_CREAT <span style="color: #666666">|</span> O_TRUNC, <span style="color: #666666">0644</span>);

    memset(buffer, <span style="color: #BA2121">&#39;a&#39;</span>, SZ);
    write(fd, buffer, SZ);
}
</pre></div>
<p>先ほどの説明の後で<tt class="docutils literal">buffer</tt>という名前の配列を見ると、これがCPUとディスクの速度差を緩和する緩衝体（バッファ）の役割をするもなのかと思ってしまいそうです。しかし現代の一般的な環境では、この<tt class="docutils literal">buffer</tt>にはあまりそのような意味合いはなく、単なる作業用のメモリ領域に過ぎません。細部を説明する前に、あと2つサンプルコードを挙げます。以降のサンプルコードは付属のソースファイル一式に含まれているので、詳細はそちらを参照してください。</p>
]]></description>
            <link>http://www.oreilly.co.jp/community/blog/2010/08/buffer-cache-and-aio-part1.html</link>
            <guid>http://www.oreilly.co.jp/community/blog/2010/08/buffer-cache-and-aio-part1.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">Programmer&apos;s High</category>
            
            
            <pubDate>Wed, 18 Aug 2010 10:00:00 +0900</pubDate>
        </item>
        
        <item>
            <title>epollインタフェースとsignalfd（2）</title>
            <description><![CDATA[<img alt="http://www.oreilly.co.jp/community/blog/images/union/pg_high_logo.png" src="http://www.oreilly.co.jp/community/blog/images/union/pg_high_logo.png" />
<p class="lead">&gt;&gt;<a href="http://www.oreilly.co.jp/community/blog/2010/05/epoll-interface-and-signalfd-part1.html"> (1)よりつづく</a></p>
<p class="footnote docutils">
本記事のサンプルコードは、以下のリンクよりダウンロードすることができます。記事と合わせてご参照ください。<br />
[ <a class="reference external" href="http://www.oreilly.co.jp/pub/pg_high/ph20100223.tar.bz2">サンプルコード</a> ]</p>
<h2>子プロセスの同期/非同期</h2>
<p>4epoll、5epoll-multiへのダミー処理追加には、いくつかの注意点があります。1baseと同じように、epollによるイベントループがその場で子プロセスの終了を待つようにすると、1つのダミー処理の終了を他のセッションが待つことになってしまいます。
これはepollによる、イベントループのI/Oの多重性を損なう大きな問題です（ <a class="reference internal" href="#id16">図1.9</a> ）。</p>
<p><span class="target" id="id16">図1.9</span> epoll の多重性を損ねるダミー処理追加</p>
<img alt="epoll2-fig9.png" src="http://www.oreilly.co.jp/community/blog/2010/06/fig/epoll2-fig9.png" />
<p>（セッションCは割愛）</p>
]]></description>
            <link>http://www.oreilly.co.jp/community/blog/2010/06/epoll-interface-and-signalfd-part2.html</link>
            <guid>http://www.oreilly.co.jp/community/blog/2010/06/epoll-interface-and-signalfd-part2.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">Programmer&apos;s High</category>
            
            
            <pubDate>Tue, 15 Jun 2010 15:32:21 +0900</pubDate>
        </item>
        
        <item>
            <title>epollインタフェースとsignalfd（1）</title>
            <description><![CDATA[<img alt="http://www.oreilly.co.jp/community/blog/images/union/pg_high_logo.png" src="http://www.oreilly.co.jp/community/blog/images/union/pg_high_logo.png" />
<p class="lead">「インターネットサーバでのPthreadとepoll」の記事（以下、前記事と呼びます）を書いた時点では、手元の環境がプアなためマルチプロセス/マルチスレッドを採用したサンプルプログラムの真価を発揮させられず、適切に比較できませんでしたが、その後デュアルコアマシンを借りることができたので、改めて比較してみました。
また、比較の際にサンプルプログラムに追加したダミー処理ではシグナルも使用したので、やはりLinuxに追加された <tt class="docutils literal">signalfd(2)</tt> もepollによるイベントループで処理してみました。</p>
<p class="footnote docutils">
本記事のサンプルコードは、以下のリンクよりダウンロードすることができます。記事と合わせてご参照ください。<br />
[ <a class="reference external" href="http://www.oreilly.co.jp/pub/pg_high/ph20100223.tar.bz2">サンプルコード</a> ]</p>
<h2>前記事のサンプルプログラム</h2>
<p><a class="reference external" href="http://www.oreilly.co.jp/community/blog/2010/03/pthread-epoll-inet-server-part1.html">前記事</a> ではHTTPサーバを例に並列性/多重性のサンプル実装を5種類提示しました。簡単に振り返ります。サンプルプログラムがデュアルコアシステム上で動作しており、HTTPリクエストがほぼ同時に3件届いた場合のインタリーブ例を挙げてみます。毎回必ずこの通りにインタリーブされるわけではなく、あくまでもそれぞれの動作の違いを示すための一例です（ <a class="reference internal" href="#id4">図1.1</a> から <a class="reference internal" href="#id8">図1.5</a> ）。
また、5epoll-multiはCPU数-1個の4epoll（相当）を子プロセスとして起動しますが、デュアルコアシステムでは子プロセスの4epollを1つしか起動せず、4epollとの比較がしにくくなるため、今回は測定用にCPU数分の4epollの子プロセスを起動することにします。</p>]]></description>
            <link>http://www.oreilly.co.jp/community/blog/2010/05/epoll-interface-and-signalfd-part1.html</link>
            <guid>http://www.oreilly.co.jp/community/blog/2010/05/epoll-interface-and-signalfd-part1.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">Programmer&apos;s High</category>
            
            
            <pubDate>Mon, 17 May 2010 15:19:29 +0900</pubDate>
        </item>
        
    </channel>
</rss>

