<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feed.yk55.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" version="2.0">

<channel>
	<title>Yoichi Kawasaki's blog</title>
	
	<link>http://yk55.com/blog</link>
	<description>the place to organize and record my ideas ...</description>
	<lastBuildDate>Sun, 28 Feb 2010 10:46:40 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feed.yk55.com/yokawasa/syndication" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="yokawasa/syndication" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><geo:lat>35.7094911</geo:lat><geo:long>139.7829511</geo:long><item>
		<title>Google Reader CacheからItemを削除する方法</title>
		<link>http://yk55.com/blog/2010/02/27/google-reader-cache-item-removal/</link>
		<comments>http://yk55.com/blog/2010/02/27/google-reader-cache-item-removal/#comments</comments>
		<pubDate>Sat, 27 Feb 2010 14:55:05 +0000</pubDate>
		<dc:creator>yoichi</dc:creator>
				<category><![CDATA[google]]></category>
		<category><![CDATA[random]]></category>
		<category><![CDATA[feed]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://yk55.com/blog/?p=206</guid>
		<description><![CDATA[一度誤った投稿をしてしまいそれがGoogle Reader Cacheに保存されてしまうと削除は難しいようだ（参照 Google Reader FAQ: Deleted posts in my blog&#8217;s feed）。仮にその記事を削除したとしても同じ。というわけでいきなりこの記事のタイトル「Google Reader CacheからItemを削除する方法」はできないということになる。ただ、FAQでコメントされているように、どうしてもCacheから削除したい場合、削除はできないがアップデートはできるという特性を活かしダミー記事Itemでリプレースするという方法がある。Itemはguidをキーとして認識する。よって同一guidのダミーItemを用意しそいつでリプレースをかけることで何とか取り繕うことができる。



まずは誤って投稿した記事ItemがCacheされてしまった様子。タイトル・コンテンツともに空にもかかわらずキャッシュされてしまっている。仮にこのItemのguidがhttp://yk55.com/blog/?p=200とする。この誤ってキャッシュされてしまったItemを別の何かでリプレースするためのダミー記事を用意する。もちろんその記事には同一guidを指定してやる。
&#60;item&#62;
&#160; &#160; &#60;title&#62;[dummy] Google Reader CacheからItemを削除する方法&#60;/title&#62;
&#160; &#160; &#60;link&#62;http://yk55.com/blog/2010/02/27/google-reader-cache-item-removal/&#60;/link&#62;
&#160; &#160; &#60;comments&#62;http://yk55.com/blog/2010/02/27/google-reader-cache-item-removal/#comments&#60;/comments&#62;
&#160; &#160; &#60;pubDate&#62;Sat, 27 Feb 2010 14:55:05 +0000&#60;/pubDate&#62;
&#160; &#160; &#60;dc:creator&#62;yoichi&#60;/dc:creator&#62;
&#160; &#160; &#60;category&#62;&#60;![CDATA[Uncategorized]]&#62;&#60;/category&#62;
&#160; &#160; &#60;category&#60;/category&#62;
&#160; &#160; &#60;guid isPermaLink=&#34;false&#34;&#62;http://yk55.com/blog/?p=200&#60;/guid&#62;
&#160; &#160; &#60;description&#62;~略~&#60;/description&#62;
&#160; &#160; &#60;content:encoded&#62;~略~&#60;/content:encoded&#62;
&#160; &#160; &#60;wfw:commentRss&#62;http://yk55.com/blog/2010/02/27/google-reader-cache-item-removal/feed/&#60;/wfw:commentRss&#62;
&#160; &#160; &#60;slash:comments&#62;0&#60;/slash:comments&#62;
&#60;/item&#62;
これを追加したRSSフィードを公開することで時間がたてばフィードがクローリングされ、さきほどの間違ったItemがダミーItemでリプレースされる。以下が見事にリプレースされた結果。



あまりにもべたなやり方だけど、どうしてもなんとかしたい場合にはこの方法で。おわり。
]]></description>
			<content:encoded><![CDATA[<p>一度誤った投稿をしてしまいそれがGoogle Reader Cacheに保存されてしまうと削除は難しいようだ（参照 Google Reader FAQ: <a href="http://www.google.com/support/forum/p/reader/thread?tid=677bcc4ae33bb7c8&#038;hl=en">Deleted posts in my blog&#8217;s feed</a>）。仮にその記事を削除したとしても同じ。というわけでいきなりこの記事のタイトル「Google Reader CacheからItemを削除する方法」はできないということになる。ただ、<a href="http://www.google.com/support/forum/p/reader/thread?tid=677bcc4ae33bb7c8&#038;hl=en">FAQ</a>でコメントされているように、どうしてもCacheから削除したい場合、削除はできないがアップデートはできるという特性を活かしダミー記事Itemでリプレースするという方法がある。Itemはguidをキーとして認識する。よって同一guidのダミーItemを用意しそいつでリプレースをかけることで何とか取り繕うことができる。</p>
<p style="text-align: center;">
<a title="Google Reader Cached Item - Wrong Item by yoichi*, on Flickr" href="http://www.flickr.com/photos/yk55/4392541160/"><img class="aligncenter" src="http://farm5.static.flickr.com/4062/4392541160_82b9c3a86a.jpg" alt="Google Reader Cached Item - Wrong Item" width="500" height="185" /></a>
</p>
<p>まずは誤って投稿した記事ItemがCacheされてしまった様子。タイトル・コンテンツともに空にもかかわらずキャッシュされてしまっている。仮にこのItemのguidがhttp://yk55.com/blog/?p=200とする。この誤ってキャッシュされてしまったItemを別の何かでリプレースするためのダミー記事を用意する。もちろんその記事には同一guidを指定してやる。</p>
<div class="codecolorer-container xml default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:650px;"><div class="xml codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;item<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;title<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>[dummy] Google Reader CacheからItemを削除する方法<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/title<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;link<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>http://yk55.com/blog/2010/02/27/google-reader-cache-item-removal/<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/link<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;comments<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>http://yk55.com/blog/2010/02/27/google-reader-cache-item-removal/#comments<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/comments<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;pubDate<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Sat, 27 Feb 2010 14:55:05 +0000<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/pubDate<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;dc:creator<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>yoichi<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/dc:creator<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;category<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><span style="color: #339933;">&lt;![CDATA[Uncategorized]]&gt;</span><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/category<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;category</span><span style="color: #000000; font-weight: bold;">&lt;/category<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;guid</span> <span style="color: #000066;">isPermaLink</span>=<span style="color: #ff0000;">&quot;false&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>http://yk55.com/blog/?p=200<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/guid<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;description<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>~略~<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/description<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;content:encoded<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>~略~<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/content:encoded<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;wfw:commentRss<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>http://yk55.com/blog/2010/02/27/google-reader-cache-item-removal/feed/<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/wfw:commentRss<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;slash:comments<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>0<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/slash:comments<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/item<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></div></div>
<p>これを追加したRSSフィードを公開することで時間がたてばフィードがクローリングされ、さきほどの間違ったItemがダミーItemでリプレースされる。以下が見事にリプレースされた結果。</p>
<p style="text-align: center;">
<a href="http://www.flickr.com/photos/yk55/4392541220/" title="Google Reader Cached Item - Replaced Item by yoichi*, on Flickr"><img src="http://farm5.static.flickr.com/4044/4392541220_a3f858ff77.jpg" width="500" height="226" alt="Google Reader Cached Item - Replaced Item" /></a>
</p>
<p>あまりにもべたなやり方だけど、どうしてもなんとかしたい場合にはこの方法で。おわり。</p>
<div class="feedflare">
<a href="http://feed.yk55.com/~ff/yokawasa/syndication?a=VuaiMlxJnKo:ZgnZZFG69z4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/yokawasa/syndication?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feed.yk55.com/~ff/yokawasa/syndication?a=VuaiMlxJnKo:ZgnZZFG69z4:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/yokawasa/syndication?d=7Q72WNTAKBA" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://yk55.com/blog/2010/02/27/google-reader-cache-item-removal/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dynamic Binding &amp; VTable Concept in C++</title>
		<link>http://yk55.com/blog/2010/02/27/dynamic-binding-vtable-concept/</link>
		<comments>http://yk55.com/blog/2010/02/27/dynamic-binding-vtable-concept/#comments</comments>
		<pubDate>Sat, 27 Feb 2010 10:32:11 +0000</pubDate>
		<dc:creator>yoichi</dc:creator>
				<category><![CDATA[cplusplus]]></category>
		<category><![CDATA[gcc]]></category>
		<category><![CDATA[polymorphism]]></category>
		<category><![CDATA[vpointer]]></category>
		<category><![CDATA[vtable]]></category>

		<guid isPermaLink="false">http://yk55.com/blog/?p=197</guid>
		<description><![CDATA[たまにc++コードのコンパイル時にエラー文言でvtableというキーワードを見たことはないだろうか？Polymorphismという有名なワードに対しこのvtableはあまりにも目立たない存在だ。とはいえPolymorphismを実現するためになくてはならない（最）重要なポジションを占めているのがvtable。別にvtableを理解しなくともPolymorphismの理解はできる。 ただし、骨太になりたいのならばPolymorphismを実現するためにどのようにvtableが使われているのかを理解しておくべきである。
UPCASTING
Virtual関数との比較のためにVirtual関数を持たないクラス継承を説明する。以下のようにvirtual関数を持たないSuperClassをSubClassが継承する。 SuperClassを継承したSubClassの参照をSuperClassポインタ変数に入れた場合は、子クラスへの参照がUPCASTされ親クラスへの参照として扱われる。実行結果はSuperClassへの参照へとUPCASTされるのでSuperClassの関数の内容が表示される。
#include &#60;iostream&#62;
using std::cout;
using std::endl;
class SuperClass &#123;
public:
&#160; &#160; void func&#40;&#41; &#123; cout &#60; &#34;SuperClass::func()&#34; &#60; endl; &#125;
&#125;;
class SubClass : public SuperClass &#123;
public:
&#160; &#160; void func&#40;&#41; &#123; cout &#60; &#34;SubClass::func()&#34; &#60; endl; &#125;
&#125;;
int main&#40;int argc, char **argv &#41; &#123;
&#160; &#160; &#160;SubClass sub;
&#160; &#160; &#160;SuperClass *super =&#38;sub; 
&#160; &#160; &#160;super-&#62;func&#40;&#41;;
&#160; &#160; &#160;return 0;
&#125;
[実行結果]
SuperClass::func()
VIRTUAL FUNCTION, VTABLE, and [...]]]></description>
			<content:encoded><![CDATA[<p>たまにc++コードのコンパイル時にエラー文言でvtableというキーワードを見たことはないだろうか？Polymorphismという有名なワードに対しこのvtableはあまりにも目立たない存在だ。とはいえPolymorphismを実現するためになくてはならない（最）重要なポジションを占めているのがvtable。別にvtableを理解しなくともPolymorphismの理解はできる。 ただし、骨太になりたいのならばPolymorphismを実現するためにどのようにvtableが使われているのかを理解しておくべきである。</p>
<h2>UPCASTING</h2>
<p>Virtual関数との比較のためにVirtual関数を持たないクラス継承を説明する。以下のようにvirtual関数を持たないSuperClassをSubClassが継承する。 SuperClassを継承したSubClassの参照をSuperClassポインタ変数に入れた場合は、子クラスへの参照がUPCASTされ親クラスへの参照として扱われる。実行結果はSuperClassへの参照へとUPCASTされるのでSuperClassの関数の内容が表示される。</p>
<div class="codecolorer-container c default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:650px;"><div class="c codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #339933;">#include &lt;iostream&gt;</span><br />
using std<span style="color: #339933;">::</span><a href="http://www.opengroup.org/onlinepubs/009695399/functions/cout.html"><span style="color: #000066;">cout</span></a><span style="color: #339933;">;</span><br />
using std<span style="color: #339933;">::</span><span style="color: #202020;">endl</span><span style="color: #339933;">;</span><br />
class SuperClass <span style="color: #009900;">&#123;</span><br />
public<span style="color: #339933;">:</span><br />
&nbsp; &nbsp; <span style="color: #993333;">void</span> func<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <a href="http://www.opengroup.org/onlinepubs/009695399/functions/cout.html"><span style="color: #000066;">cout</span></a> <span style="color: #339933;">&lt;</span> <span style="color: #ff0000;">&quot;SuperClass::func()&quot;</span> <span style="color: #339933;">&lt;</span> endl<span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span><br />
class SubClass <span style="color: #339933;">:</span> public SuperClass <span style="color: #009900;">&#123;</span><br />
public<span style="color: #339933;">:</span><br />
&nbsp; &nbsp; <span style="color: #993333;">void</span> func<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <a href="http://www.opengroup.org/onlinepubs/009695399/functions/cout.html"><span style="color: #000066;">cout</span></a> <span style="color: #339933;">&lt;</span> <span style="color: #ff0000;">&quot;SubClass::func()&quot;</span> <span style="color: #339933;">&lt;</span> endl<span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span><br />
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> argc<span style="color: #339933;">,</span> <span style="color: #993333;">char</span> <span style="color: #339933;">**</span>argv <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp;SubClass sub<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp;SuperClass <span style="color: #339933;">*</span>super <span style="color: #339933;">=&amp;</span>sub<span style="color: #339933;">;</span> <br />
&nbsp; &nbsp; &nbsp;super<span style="color: #339933;">-&gt;</span>func<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></div>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">[実行結果]<br />
SuperClass::func()</div></div>
<p><h2>VIRTUAL FUNCTION, VTABLE, and VPOINTER</h2>
<p>次にVirtual関数の例を説明する。さきほどの例ではUPCASTによりSubClassクラスではなくSuperClassクラスのfunc関数がcallされた。ここではSuperClassの関数にvirtualをつけた場合のfunc関数の振る舞いを確かめてみる。virtual関数func1、func2をもつSuperClassを継承した3つのSubClassを用意する。これら3つはそれぞれfunc1、func2両方とも、func1のみ、func2のみをoverrideしている。 実行結果はSubClassでvirtual関数をoverrideした場合はその内容が、そうでない場合はSuperClassの内容が表示される。</p>
<div class="codecolorer-container c default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:650px;"><div class="c codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #339933;">#include &lt;iostream&gt;</span><br />
using std<span style="color: #339933;">::</span><a href="http://www.opengroup.org/onlinepubs/009695399/functions/cout.html"><span style="color: #000066;">cout</span></a><span style="color: #339933;">;</span><br />
using std<span style="color: #339933;">::</span><span style="color: #202020;">endl</span><span style="color: #339933;">;</span><br />
class SuperClass <span style="color: #009900;">&#123;</span><br />
public<span style="color: #339933;">:</span><br />
&nbsp; &nbsp; virtual <span style="color: #993333;">void</span> funcA<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <a href="http://www.opengroup.org/onlinepubs/009695399/functions/cout.html"><span style="color: #000066;">cout</span></a> <span style="color: #339933;">&lt;&lt;</span> <span style="color: #ff0000;">&quot;SuperClass::funcA()&quot;</span> <span style="color: #339933;">&lt;&lt;</span> endl<span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; virtual <span style="color: #993333;">void</span> funcB<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <a href="http://www.opengroup.org/onlinepubs/009695399/functions/cout.html"><span style="color: #000066;">cout</span></a> <span style="color: #339933;">&lt;&lt;</span> <span style="color: #ff0000;">&quot;SuperClass::funcB()&quot;</span> <span style="color: #339933;">&lt;&lt;</span> endl<span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span><br />
class SubClass1 <span style="color: #339933;">:</span> public SuperClass <span style="color: #009900;">&#123;</span><br />
public<span style="color: #339933;">:</span><br />
&nbsp; &nbsp; <span style="color: #993333;">void</span> funcA<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <a href="http://www.opengroup.org/onlinepubs/009695399/functions/cout.html"><span style="color: #000066;">cout</span></a> <span style="color: #339933;">&lt;&lt;</span> <span style="color: #ff0000;">&quot;SubClass1::funcA()&quot;</span> <span style="color: #339933;">&lt;&lt;</span> endl<span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #993333;">void</span> funcB<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <a href="http://www.opengroup.org/onlinepubs/009695399/functions/cout.html"><span style="color: #000066;">cout</span></a> <span style="color: #339933;">&lt;&lt;</span> <span style="color: #ff0000;">&quot;SubClass1::funcB()&quot;</span> <span style="color: #339933;">&lt;&lt;</span> endl<span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span><br />
class SubClass2 <span style="color: #339933;">:</span> public SuperClass <span style="color: #009900;">&#123;</span><br />
public<span style="color: #339933;">:</span><br />
&nbsp; &nbsp; <span style="color: #993333;">void</span> funcA<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <a href="http://www.opengroup.org/onlinepubs/009695399/functions/cout.html"><span style="color: #000066;">cout</span></a> <span style="color: #339933;">&lt;&lt;</span> <span style="color: #ff0000;">&quot;SubClass2::funcA()&quot;</span> <span style="color: #339933;">&lt;&lt;</span> endl<span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span><br />
class SubClass3 <span style="color: #339933;">:</span> public SuperClass <span style="color: #009900;">&#123;</span><br />
public<span style="color: #339933;">:</span><br />
&nbsp; &nbsp; <span style="color: #993333;">void</span> funcB<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <a href="http://www.opengroup.org/onlinepubs/009695399/functions/cout.html"><span style="color: #000066;">cout</span></a> <span style="color: #339933;">&lt;&lt;</span> <span style="color: #ff0000;">&quot;SubClass2::funcB()&quot;</span> <span style="color: #339933;">&lt;&lt;</span> endl<span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span><br />
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> argc<span style="color: #339933;">,</span> <span style="color: #993333;">char</span> <span style="color: #339933;">**</span>argv <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; SubClass1 sub1<span style="color: #339933;">;</span> SubClass2 sub2<span style="color: #339933;">;</span> SubClass3 sub3<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/cout.html"><span style="color: #000066;">cout</span></a> <span style="color: #339933;">&lt;&lt;</span> &nbsp;<span style="color: #ff0000;">&quot;***************SubClass1***************&quot;</span> <span style="color: #339933;">&lt;&lt;</span> &nbsp;endl<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; SuperClass <span style="color: #339933;">*</span>super <span style="color: #339933;">=&amp;</span>sub1<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; super<span style="color: #339933;">-&gt;</span>funcA<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> super<span style="color: #339933;">-&gt;</span>funcB<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/cout.html"><span style="color: #000066;">cout</span></a> <span style="color: #339933;">&lt;&lt;</span> <span style="color: #ff0000;">&quot;***************SubClass2***************&quot;</span> <span style="color: #339933;">&lt;&lt;</span> endl<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; super <span style="color: #339933;">=&amp;</span>sub2<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; super<span style="color: #339933;">-&gt;</span>funcA<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> super<span style="color: #339933;">-&gt;</span>funcB<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/cout.html"><span style="color: #000066;">cout</span></a> <span style="color: #339933;">&lt;&lt;</span> <span style="color: #ff0000;">&quot;***************SubClass3***************&quot;</span> <span style="color: #339933;">&lt;&lt;</span> endl<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; super <span style="color: #339933;">=&amp;</span>sub3<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; super<span style="color: #339933;">-&gt;</span>funcA<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>super<span style="color: #339933;">-&gt;</span>funcB<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></div>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">[実行結果]<br />
***************SubClass1***************<br />
SubClass1::funcA()<br />
SubClass1::funcB()<br />
***************SubClass2***************<br />
SubClass2::funcA()<br />
SuperClass::funcB()<br />
***************SubClass3***************<br />
SuperClass::funcA()<br />
SubClass2::funcB()</div></div>
<p>virtualな関数の場合はコンパイラは型ではなくてオブジェクトのポインタを見ていて実行時にどのfuncが実行されるべきかを判断する。非virtual関数の時と違いコンパイラーはコンパイル時にはどのfuncが呼ばれるのか判別できない。この実行時にどのfuncが呼ばれるのか決定することを<a href="http://en.wikipedia.org/wiki/Dynamic_binding_%28computer_science%29">Dynamic Binding</a>と呼ぶ。そしてこのDynamic Bindingは<a href="http://en.wikipedia.org/wiki/Virtual_method_table">Virtual Function table(Vtable)</a>と呼ばれるメカニズムによって実現される。ようやく本題。</p>
<p>Vtableとはvirtual関数を持っているクラスや親クラスで定義されているvirtual関数をoverrideしたクラスに対してコンパイラーが作成する（その名のとおり）仮想テーブルである。コンパイラーはvirtual関数を持っている/virtaul関数をoverrideしているクラスにのみクラスごとのVtableを作成してその中にbindすべき関数ポインターを持っている。<br />
またこのVtableを指すポインタのことをvpointerと呼ぶ。コンパイラはVtableを持っているクラスに対してvpointerを隠しメンバー変数として追加する。さらにコンストラクタにそのvpointer変数の初期化を行うコードを追加する。よってオブジェクトが作成されるとき隠しメンバー変数vpointerは対応するVtableアドレスで初期化され、実行時の実行関数の決定は内部でvpointerを通じてVtableをlookupすることで実現される。　（参照: <a href="http://en.wikipedia.org/wiki/Virtual_method_table#Implementation">wikipedia:vtable implementation</a>）</p>
<p>Vtableに作成される関数ポインターは、そのクラスで持っているvirtual関数のポインター、親クラスで定義されているvirtaul関数をoverrideした関数のポインター、また親クラスでvirtual定義されている関数をoverrideしない場合はその親のvirtual関数ポインタが含まれることになる。上記サンプルにあるSuperClass, SubClass[1-3]に対するオブジェクトとvpointer、vtableとそのvtableに含まれる関数ポインターの関係を図にすると以下のようになる。</p>
<p style="text-align: center;">
<a href="http://www.flickr.com/photos/yk55/4391268309/" title="vtable - Virtual Function Table by yoichi*, on Flickr"><img src="http://farm3.static.flickr.com/2686/4391268309_149d8808ba_o.png" width="589" height="467" alt="vtable - Virtual Function Table" /></a></p>
<p>上図を元にサンプル中のSubClass1::funcAのDynamic Bindingイメージを式化してみると次のような感じになる・ vptr1はSubClass1のvpointerとする。 あくまでイメージであり(vptr->)は実際は見えません。</p>
<div class="codecolorer-container c default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:650px;"><div class="c codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">SubClass1 sub1<span style="color: #339933;">;</span><br />
SuperClass <span style="color: #339933;">*</span>super <span style="color: #339933;">=&amp;</span>sub1<span style="color: #339933;">;</span><br />
super<span style="color: #339933;">-&gt;</span>vptr<span style="color: #339933;">-&gt;</span>funcA<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">// SubClass1::funcA(),</span></div></div>
<p><h2>g++ -fdump-class-hierarchのダンプ結果</h2>
<p>最後にg++の-fdump-class-hierarchオプションによるVtableのダンプ結果を見てみる。上記サンプルファイルをvtable.cppとして次のようにコンパイルを行う。　（参考: <a href="http://gcc.gnu.org/onlinedocs/gcc-4.4.3/gcc/Debugging-Options.html#Debugging-Options">Options for Debugging Your Program or GCC</a>）</p>
<pre>
 g++ -fdump-class-hierarchy vtable.cc -o vtable
</pre>
<p>これでコンパイルが終わりvtable実行ファイルができあがる。また同一ディレクトリにvtable.cpp.002t.classという名前のファイルが出来上がる。このファイルにVtableのダンプ結果が出力されている。各クラスのVtable中を見るといまいち意味のわからないものはあるが上図のとおりの関数が含まれており、また各クラスにはvptrを見つけることができる。</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Vtable for SubClass1<br />
SubClass1::_ZTV9SubClass1: 4u entries<br />
0 &nbsp; &nbsp; (int (*)(...))0<br />
4 &nbsp; &nbsp; (int (*)(...))(&amp; _ZTI9SubClass1)<br />
8 &nbsp; &nbsp; SubClass1::funcA<br />
12 &nbsp; &nbsp;SubClass1::funcB<br />
<br />
Class SubClass1<br />
&nbsp; &nbsp;size=4 align=4<br />
&nbsp; &nbsp;base size=4 base align=4<br />
SubClass1 (0xb7254a80) 0 nearly-empty<br />
&nbsp; &nbsp; vptr=((&amp; SubClass1::_ZTV9SubClass1) + 8u)<br />
&nbsp; SuperClass (0xb707c1e0) 0 nearly-empty<br />
&nbsp; &nbsp; &nbsp; primary-for SubClass1 (0xb7254a80)<br />
<br />
Vtable for SubClass2<br />
SubClass2::_ZTV9SubClass2: 4u entries<br />
0 &nbsp; &nbsp; (int (*)(...))0<br />
4 &nbsp; &nbsp; (int (*)(...))(&amp; _ZTI9SubClass2)<br />
8 &nbsp; &nbsp; SubClass2::funcA<br />
12 &nbsp; &nbsp;SuperClass::funcB<br />
<br />
Class SubClass2<br />
&nbsp; &nbsp;size=4 align=4<br />
&nbsp; &nbsp;base size=4 base align=4<br />
SubClass2 (0xb7254b80) 0 nearly-empty<br />
&nbsp; &nbsp; vptr=((&amp; SubClass2::_ZTV9SubClass2) + 8u)<br />
&nbsp; SuperClass (0xb707c3c0) 0 nearly-empty<br />
&nbsp; &nbsp; &nbsp; primary-for SubClass2 (0xb7254b80)<br />
<br />
Vtable for SubClass3<br />
SubClass3::_ZTV9SubClass3: 4u entries<br />
0 &nbsp; &nbsp; (int (*)(...))0<br />
4 &nbsp; &nbsp; (int (*)(...))(&amp; _ZTI9SubClass3)<br />
8 &nbsp; &nbsp; SuperClass::funcA<br />
12 &nbsp; &nbsp;SubClass3::funcB<br />
<br />
Class SubClass3<br />
&nbsp; &nbsp;size=4 align=4<br />
&nbsp; &nbsp;base size=4 base align=4<br />
SubClass3 (0xb7254c40) 0 nearly-empty<br />
&nbsp; &nbsp; vptr=((&amp; SubClass3::_ZTV9SubClass3) + 8u)<br />
&nbsp; SuperClass (0xb707c528) 0 nearly-empty<br />
&nbsp; &nbsp; &nbsp; primary-for SubClass3 (0xb7254c40)</div></div>
<p>おわり</p>
<div class="feedflare">
<a href="http://feed.yk55.com/~ff/yokawasa/syndication?a=l1bW96WjUys:OmZdpeFF8Vo:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/yokawasa/syndication?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feed.yk55.com/~ff/yokawasa/syndication?a=l1bW96WjUys:OmZdpeFF8Vo:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/yokawasa/syndication?d=7Q72WNTAKBA" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://yk55.com/blog/2010/02/27/dynamic-binding-vtable-concept/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Feedburner公開用フィードの実体を新しい方に変更しました</title>
		<link>http://yk55.com/blog/2010/01/31/register_newfeed_on_feedburner_feedaddress/</link>
		<comments>http://yk55.com/blog/2010/01/31/register_newfeed_on_feedburner_feedaddress/#comments</comments>
		<pubDate>Sun, 31 Jan 2010 06:26:46 +0000</pubDate>
		<dc:creator>yoichi</dc:creator>
				<category><![CDATA[random]]></category>
		<category><![CDATA[feedburner]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[rss]]></category>

		<guid isPermaLink="false">http://yk55.com/blog/?p=112</guid>
		<description><![CDATA[新ブログに移行してから約二十日が過ぎ、ようやくこれまで旧ブログのフィードを指していたFeedburnerのフィードアドレスを新ブログのフィードに付け直した。公開アドレスはそのままで実体だけが入れ替っただけなのでこれまでの公開アドレスでRSS登録していただいた方には特に設定変更することなく新しい方のがフィードされてくるようになります。
公開用フィードアドレス (これをRSSリーダーに登録しておけばOK!)

http://feed.yk55.com/yokawasa/syndication
※上記はFeedburnerマイ・ブランド設定されたもので実際は以下のアドレスへのCNAMEです。
http://feeds.feedburner.com/yokawasa/syndication

マイ ブランドの概要とFAQ
公開アドレスへの紐付け変更内容

(以前)
Original Feed:  http://blog.yk55.com/rss/atom.xml
Feed Address:   http://feeds.feedburner.com/yokawasa/syndication
↓
(以後)
Original Feed:  http://yk55.com/blog/feed/
Feed Address:   http://feeds.feedburner.com/yokawasa/syndication

というわけで上記のようにfeedburnerのフィードアドレス設定をしてそれで公開しておくと今回のようなドメイン、パスが変更になった場合にフィード登録者に手を煩わせることがないので便利です。
]]></description>
			<content:encoded><![CDATA[<p>新ブログに移行してから約二十日が過ぎ、ようやくこれまで旧ブログのフィードを指していた<a href="http://feedburner.google.com">Feedburner</a>のフィードアドレスを新ブログのフィードに付け直した。公開アドレスはそのままで実体だけが入れ替っただけなのでこれまでの公開アドレスでRSS登録していただいた方には特に設定変更することなく新しい方のがフィードされてくるようになります。</p>
<p><span style="text-decoration: underline;">公開用フィードアドレス (これをRSSリーダーに登録しておけばOK!)</span></p>
<pre>
http://feed.yk55.com/yokawasa/syndication
※上記はFeedburnerマイ・ブランド設定されたもので実際は以下のアドレスへのCNAMEです。
http://feeds.feedburner.com/yokawasa/syndication
</pre>
<p><a href="https://www.google.com/support/feedburner/bin/answer.py?hl=jp&#038;answer=79590">マイ ブランドの概要とFAQ</a><br />
<span style="text-decoration: underline;">公開アドレスへの紐付け変更内容</span></p>
<pre>
(以前)
Original Feed:  http://blog.yk55.com/rss/atom.xml
Feed Address:   http://feeds.feedburner.com/yokawasa/syndication
↓
(以後)
Original Feed:  http://yk55.com/blog/feed/
Feed Address:   http://feeds.feedburner.com/yokawasa/syndication
</pre>
<p>というわけで上記のようにfeedburnerのフィードアドレス設定をしてそれで公開しておくと今回のようなドメイン、パスが変更になった場合にフィード登録者に手を煩わせることがないので便利です。</p>
<div class="feedflare">
<a href="http://feed.yk55.com/~ff/yokawasa/syndication?a=foDVLdFO8Ro:FvuwSuRI1ss:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/yokawasa/syndication?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feed.yk55.com/~ff/yokawasa/syndication?a=foDVLdFO8Ro:FvuwSuRI1ss:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/yokawasa/syndication?d=7Q72WNTAKBA" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://yk55.com/blog/2010/01/31/register_newfeed_on_feedburner_feedaddress/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Scatter/Gather I/O(readv/writev)の実装</title>
		<link>http://yk55.com/blog/2010/01/31/readv_writev_implementation/</link>
		<comments>http://yk55.com/blog/2010/01/31/readv_writev_implementation/#comments</comments>
		<pubDate>Sun, 31 Jan 2010 02:03:15 +0000</pubDate>
		<dc:creator>yoichi</dc:creator>
				<category><![CDATA[kernel]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://yk55.com/blog/?p=86</guid>
		<description><![CDATA[readv、writevは複数バッファをまとめて読み書きするシステムコールです。 writevはiovec 構造体の配列に書き込みたいものを突っ込んでまとめてその複数バッファーを書き込み、readvは指定した個数分の複数バッファーをiovec 構造体の配列に格納します。例えばwritevによる複数バッファの書き込みはこんな感じです。
#include &#60;stdio.h&#62;
#include &#60;unistd.h&#62;
#include &#60;fcntl.h&#62; 
#include &#60;string.h&#62;
#include &#60;sys/uio.h&#62;
int 
&#160;main&#40; int argc, char** argv &#41; &#123;
&#160; &#160; int fd = 0;
&#160; &#160; ssize_t written;
&#160; &#160; struct iovec iov&#91;3&#93;;
&#160; &#160; char *buffer0, *buffer1, *buffer2;
&#160; &#160; char *file = argv&#91;1&#93;;
&#160; &#160; fd = open&#40; file, &#160;O_RDWR&#124;O_CREAT&#124;O_EXCL, 0666 &#41;;
&#160; &#160; if &#40; fd &#60; 0 &#41; &#123;
&#160; [...]]]></description>
			<content:encoded><![CDATA[<p>readv、writevは複数バッファをまとめて読み書きするシステムコールです。 writevはiovec 構造体の配列に書き込みたいものを突っ込んでまとめてその複数バッファーを書き込み、readvは指定した個数分の複数バッファーをiovec 構造体の配列に格納します。例えばwritevによる複数バッファの書き込みはこんな感じです。</p>
<div class="codecolorer-container c default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:650px;"><div class="c codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #339933;">#include &lt;stdio.h&gt;</span><br />
<span style="color: #339933;">#include &lt;unistd.h&gt;</span><br />
<span style="color: #339933;">#include &lt;fcntl.h&gt; </span><br />
<span style="color: #339933;">#include &lt;string.h&gt;</span><br />
<span style="color: #339933;">#include &lt;sys/uio.h&gt;</span><br />
<span style="color: #993333;">int</span> <br />
&nbsp;main<span style="color: #009900;">&#40;</span> <span style="color: #993333;">int</span> argc<span style="color: #339933;">,</span> <span style="color: #993333;">char</span><span style="color: #339933;">**</span> argv <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #993333;">int</span> fd <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; ssize_t written<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #993333;">struct</span> iovec iov<span style="color: #009900;">&#91;</span>3<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>buffer0<span style="color: #339933;">,</span> <span style="color: #339933;">*</span>buffer1<span style="color: #339933;">,</span> <span style="color: #339933;">*</span>buffer2<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>file <span style="color: #339933;">=</span> argv<span style="color: #009900;">&#91;</span>1<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; fd <span style="color: #339933;">=</span> open<span style="color: #009900;">&#40;</span> file<span style="color: #339933;">,</span> &nbsp;O_RDWR<span style="color: #339933;">|</span>O_CREAT<span style="color: #339933;">|</span>O_EXCL<span style="color: #339933;">,</span> 0666 <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> fd <span style="color: #339933;">&lt;</span> 0 <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;cannot open file:%s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> file<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">return</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; buffer0 <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;buffer0 string&quot;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; buffer1 <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;buffer1 string&quot;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; buffer2 <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;buffer2 string&quot;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; iov<span style="color: #009900;">&#91;</span>0<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">iov_base</span> <span style="color: #339933;">=</span> buffer0<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; iov<span style="color: #009900;">&#91;</span>0<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">iov_len</span> <span style="color: #339933;">=</span> strlen<span style="color: #009900;">&#40;</span>buffer0<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; iov<span style="color: #009900;">&#91;</span>1<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">iov_base</span> <span style="color: #339933;">=</span> buffer1<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; iov<span style="color: #009900;">&#91;</span>1<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">iov_len</span> <span style="color: #339933;">=</span> strlen<span style="color: #009900;">&#40;</span>buffer1<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; iov<span style="color: #009900;">&#91;</span>2<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">iov_base</span> <span style="color: #339933;">=</span> buffer2<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; iov<span style="color: #009900;">&#91;</span>2<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">iov_len</span> <span style="color: #339933;">=</span> strlen<span style="color: #009900;">&#40;</span>buffer2<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; written <span style="color: #339933;">=</span> writev<span style="color: #009900;">&#40;</span>fd<span style="color: #339933;">,</span> iov<span style="color: #339933;">,</span> 3<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; close<span style="color: #009900;">&#40;</span>fd<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></div>
<p><span style="text-decoration: underline;">※iovec 構造体の定義 </span></p>
<div class="codecolorer-container c default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:650px;"><div class="c codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #808080; font-style: italic;">/* Structure for scatter/gather I/O. &nbsp;*/</span><br />
<span style="color: #993333;">struct</span> iovec<br />
<span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp;<span style="color: #993333;">void</span> <span style="color: #339933;">*</span>iov_base<span style="color: #339933;">;</span> <span style="color: #808080; font-style: italic;">/* Pointer to data. &nbsp;*/</span><br />
&nbsp; &nbsp;size_t iov_len<span style="color: #339933;">;</span> <span style="color: #808080; font-style: italic;">/* Length of data. &nbsp;*/</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></div></div>
<p><a href="http://www.linux.or.jp/JM/html/LDP_man-pages/man2/readv.2.html">man</a>によると基本的にはこのシステムコールの特徴は次の2つです。</p>
<ol>
<li>1.  readv、writevともに複数のバッファにデータを読み込む点を除いてそれぞれread(2)、write(2)と全く同様の動作を行う。</li>
<li>2.  readvと writevともにatomic。writevによるデータ書き込み中に他のスレッド、プロセスのwrite による割り込みが入らない。readvも同様にファイルから連続するデータブロックが読み出すことを保証。 </li>
</ol>
<p>本当にこのシステムコールが上記のような実装になっているのか確かめるために実際にソースコードを覗いてみます。readv、writevでは内部で次のdo_readv_writev関数がコールされます。</p>
<p><span style="text-decoration: underline;">do_readv_writev @ linux-2.6.12.1/fs/read_write.c</span></p>
<div class="codecolorer-container c default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:650px;"><div class="c codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333;">static</span> ssize_t do_readv_writev<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> type<span style="color: #339933;">,</span> <span style="color: #993333;">struct</span> file <span style="color: #339933;">*</span>file<span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #993333;">const</span> <span style="color: #993333;">struct</span> iovec __user <span style="color: #339933;">*</span> uvector<span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #993333;">unsigned</span> <span style="color: #993333;">long</span> nr_segs<span style="color: #339933;">,</span> loff_t <span style="color: #339933;">*</span>pos<span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; ...<br />
&nbsp; &nbsp; <span style="color: #202020;">ret</span> <span style="color: #339933;">=</span> rw_verify_area<span style="color: #009900;">&#40;</span>type<span style="color: #339933;">,</span> file<span style="color: #339933;">,</span> pos<span style="color: #339933;">,</span> tot_len<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ret<span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">goto</span> out<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; fnv <span style="color: #339933;">=</span> NULL<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>type <span style="color: #339933;">==</span> READ<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; fn <span style="color: #339933;">=</span> file<span style="color: #339933;">-&gt;</span>f_op<span style="color: #339933;">-&gt;</span>read<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; fnv <span style="color: #339933;">=</span> file<span style="color: #339933;">-&gt;</span>f_op<span style="color: #339933;">-&gt;</span>readv<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; fn <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>io_fn_t<span style="color: #009900;">&#41;</span>file<span style="color: #339933;">-&gt;</span>f_op<span style="color: #339933;">-&gt;</span>write<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; fnv <span style="color: #339933;">=</span> file<span style="color: #339933;">-&gt;</span>f_op<span style="color: #339933;">-&gt;</span>writev<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>fnv<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; ret <span style="color: #339933;">=</span> fnv<span style="color: #009900;">&#40;</span>file<span style="color: #339933;">,</span> iov<span style="color: #339933;">,</span> nr_segs<span style="color: #339933;">,</span> pos<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">goto</span> out<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;">/* Do it by hand, with file-ops */</span><br />
&nbsp; &nbsp; ret <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; vector <span style="color: #339933;">=</span> iov<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span>nr_segs <span style="color: #339933;">&gt;</span> 0<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #993333;">void</span> __user <span style="color: #339933;">*</span> base<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; size_t len<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; ssize_t nr<span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; base <span style="color: #339933;">=</span> vector<span style="color: #339933;">-&gt;</span>iov_base<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; len <span style="color: #339933;">=</span> vector<span style="color: #339933;">-&gt;</span>iov_len<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; vector<span style="color: #339933;">++;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; nr_segs<span style="color: #339933;">--;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; nr <span style="color: #339933;">=</span> fn<span style="color: #009900;">&#40;</span>file<span style="color: #339933;">,</span> base<span style="color: #339933;">,</span> len<span style="color: #339933;">,</span> pos<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>nr <span style="color: #339933;">&lt;</span> 0<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>ret<span style="color: #009900;">&#41;</span> ret <span style="color: #339933;">=</span> nr<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; ret <span style="color: #339933;">+=</span> nr<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>nr <span style="color: #339933;">!=</span> len<span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; ...<br />
<span style="color: #009900;">&#125;</span></div></div>
<p>後半のwhileブロックを見るとたしかにreadv、writevのときそれぞれ内部でread、writeがループで繰り返されています。 想像を超えたシンプルさでした。次にatomicを保障している箇所ですがREADかWRITEのtypeチェックを行う前のrw_verify_areaがそれっぽい。ということでrw_verify_areaを覗いてみます。</p>
<p><span style="text-decoration: underline;">rw_verify_area @ linux-2.6.12.1/fs/read_write.c</span></p>
<div class="codecolorer-container c default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:650px;"><div class="c codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333;">int</span> rw_verify_area<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> read_write<span style="color: #339933;">,</span> <span style="color: #993333;">struct</span> file <span style="color: #339933;">*</span>file<span style="color: #339933;">,</span> loff_t <span style="color: #339933;">*</span>ppos<span style="color: #339933;">,</span> size_t count<span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #993333;">struct</span> inode <span style="color: #339933;">*</span>inode<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; loff_t pos<span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>unlikely<span style="color: #009900;">&#40;</span>count <span style="color: #339933;">&gt;</span> file<span style="color: #339933;">-&gt;</span>f_maxcount<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">goto</span> Einval<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; pos <span style="color: #339933;">=</span> <span style="color: #339933;">*</span>ppos<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>unlikely<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>pos <span style="color: #339933;">&lt;</span> 0<span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #009900;">&#40;</span>loff_t<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#40;</span>pos <span style="color: #339933;">+</span> count<span style="color: #009900;">&#41;</span> <span style="color: #339933;">&lt;</span> 0<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">goto</span> Einval<span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; inode <span style="color: #339933;">=</span> file<span style="color: #339933;">-&gt;</span>f_dentry<span style="color: #339933;">-&gt;</span>d_inode<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>inode<span style="color: #339933;">-&gt;</span>i_flock <span style="color: #339933;">&amp;&amp;</span> MANDATORY_LOCK<span style="color: #009900;">&#40;</span>inode<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">return</span> locks_mandatory_area<span style="color: #009900;">&#40;</span>read_write <span style="color: #339933;">==</span> READ <span style="color: #339933;">?</span> FLOCK_VERIFY_READ <span style="color: #339933;">:</span> FLOCK_VERIFY_WRITE<span style="color: #339933;">,</span> inode<span style="color: #339933;">,</span> file<span style="color: #339933;">,</span> pos<span style="color: #339933;">,</span> count<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span><br />
<br />
Einval<span style="color: #339933;">:</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">return</span> <span style="color: #339933;">-</span>EINVAL<span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></div>
<p>ここではファイルの読み込み・書き込みエリアのバリデーションチェックとlocks_mandatory_areaで排他チェックを行っています。念のためlocks_mandatory_areaを覗いてみます。</p>
<p><span style="text-decoration: underline;">locks_mandatory_area @ linux-2.6.12.1/fs/locks.c</span></p>
<div class="codecolorer-container c default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:650px;height:400px;"><div class="c codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #808080; font-style: italic;">/**<br />
&nbsp;* locks_mandatory_area - Check for a conflicting lock<br />
&nbsp;* @read_write: %FLOCK_VERIFY_WRITE for exclusive access, %FLOCK_VERIFY_READ<br />
&nbsp;* &nbsp; &nbsp; &nbsp;for shared<br />
&nbsp;* @inode: &nbsp; &nbsp; &nbsp;the file to check<br />
&nbsp;* @filp: &nbsp; &nbsp; &nbsp; how the file was opened (if it was)<br />
&nbsp;* @offset: &nbsp; &nbsp; start of area to check<br />
&nbsp;* @count: &nbsp; &nbsp; &nbsp;length of area to check<br />
&nbsp;*<br />
&nbsp;* Searches the inode's list of locks to find any POSIX locks which conflict.<br />
&nbsp;* This function is called from rw_verify_area() and<br />
&nbsp;* locks_verify_truncate().<br />
&nbsp;*/</span><br />
<span style="color: #993333;">int</span> locks_mandatory_area<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> read_write<span style="color: #339933;">,</span> <span style="color: #993333;">struct</span> inode <span style="color: #339933;">*</span>inode<span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #993333;">struct</span> file <span style="color: #339933;">*</span>filp<span style="color: #339933;">,</span> loff_t offset<span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;size_t count<span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #993333;">struct</span> file_lock fl<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #993333;">int</span> error<span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; locks_init_lock<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>fl<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; fl.<span style="color: #202020;">fl_owner</span> <span style="color: #339933;">=</span> current<span style="color: #339933;">-&gt;</span>files<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; fl.<span style="color: #202020;">fl_pid</span> <span style="color: #339933;">=</span> current<span style="color: #339933;">-&gt;</span>tgid<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; fl.<span style="color: #202020;">fl_file</span> <span style="color: #339933;">=</span> filp<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; fl.<span style="color: #202020;">fl_flags</span> <span style="color: #339933;">=</span> FL_POSIX <span style="color: #339933;">|</span> FL_ACCESS<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>filp <span style="color: #339933;">&amp;&amp;</span> <span style="color: #339933;">!</span><span style="color: #009900;">&#40;</span>filp<span style="color: #339933;">-&gt;</span>f_flags <span style="color: #339933;">&amp;</span> O_NONBLOCK<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; fl.<span style="color: #202020;">fl_flags</span> <span style="color: #339933;">|=</span> FL_SLEEP<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; fl.<span style="color: #202020;">fl_type</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>read_write <span style="color: #339933;">==</span> FLOCK_VERIFY_WRITE<span style="color: #009900;">&#41;</span> <span style="color: #339933;">?</span> F_WRLCK <span style="color: #339933;">:</span> F_RDLCK<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; fl.<span style="color: #202020;">fl_start</span> <span style="color: #339933;">=</span> offset<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; fl.<span style="color: #202020;">fl_end</span> <span style="color: #339933;">=</span> offset <span style="color: #339933;">+</span> count <span style="color: #339933;">-</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">;;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; error <span style="color: #339933;">=</span> __posix_lock_file<span style="color: #009900;">&#40;</span>inode<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>fl<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>error <span style="color: #339933;">!=</span> <span style="color: #339933;">-</span>EAGAIN<span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #009900;">&#40;</span>fl.<span style="color: #202020;">fl_flags</span> <span style="color: #339933;">&amp;</span> FL_SLEEP<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; error <span style="color: #339933;">=</span> wait_event_interruptible<span style="color: #009900;">&#40;</span>fl.<span style="color: #202020;">fl_wait</span><span style="color: #339933;">,</span> <span style="color: #339933;">!</span>fl.<span style="color: #202020;">fl_next</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>error<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">/*<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* If we've been sleeping someone might have<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* changed the permissions behind our back.<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>inode<span style="color: #339933;">-&gt;</span>i_mode <span style="color: #339933;">&amp;</span> <span style="color: #009900;">&#40;</span>S_ISGID <span style="color: #339933;">|</span> S_IXGRP<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> S_ISGID<span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">continue</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; locks_delete_block<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>fl<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #b1b100;">return</span> error<span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></div>
<p><span style="text-decoration: underline;">※ kernelソースコード<a href="http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.12.1.tar.gz">linux-2.6.12.1</a></span> </p>
<p>以上、簡単ではありますがreadv、writevの実装でした。 このシステムコールはこれまで何度か業務で利用していておなじみな物のではありましたが特に内部の実装を気にすることなく使ってました。実際に見てみると単純な複数バッファ分のread, writeの繰り返しではありますがその処理間に排他制御がしっかりされているのでパフォーマンスはさておき安心して使えると思います。その辺の自分で実装するのは面倒ですから。</p>
<div class="feedflare">
<a href="http://feed.yk55.com/~ff/yokawasa/syndication?a=_QtSqv8Gxws:nkxC_ccdiQU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/yokawasa/syndication?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feed.yk55.com/~ff/yokawasa/syndication?a=_QtSqv8Gxws:nkxC_ccdiQU:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/yokawasa/syndication?d=7Q72WNTAKBA" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://yk55.com/blog/2010/01/31/readv_writev_implementation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C++：typeidとdemangleで実行時クラス名取得</title>
		<link>http://yk55.com/blog/2010/01/20/get_cpp_classname_by_typeid_and_demangle/</link>
		<comments>http://yk55.com/blog/2010/01/20/get_cpp_classname_by_typeid_and_demangle/#comments</comments>
		<pubDate>Tue, 19 Jan 2010 20:27:20 +0000</pubDate>
		<dc:creator>yoichi</dc:creator>
				<category><![CDATA[cplusplus]]></category>
		<category><![CDATA[gcc]]></category>
		<category><![CDATA[rtti]]></category>

		<guid isPermaLink="false">http://yk55.com/blog/?p=59</guid>
		<description><![CDATA[Javaでは普通に行われている実行時の型情報取得（ Object.getClass(), Class.getName()とかinstanceOfとかね ）ですが、CではできないのだからどうせC++でもできないのだろうなと思っていたら予想に反しRunＴime Type Identification (RTTI)という実行時の型情報取得機能がばっちり用意されてました。 確かにdynamic_castができているわけだし、まあそういうことだよねと納得。 ということでC++で実行時クラス名の取得を試みました。
実行時型情報取得はtypeid演算子を使います。typeid演算子はtype_info型クラスの参照を返し、そのtype_infoのメンバname()より型情報の文字列が取得できます。 それでは次のコードで型情報を取得してみます。
#include &#60;iostream&#62;
#include &#60;typeinfo&#62;
using std::cout;
using std::endl;
using std::type_info;

class Parent&#123;
public:
&#160; virtual void x&#40;&#41;&#123;&#125;
&#125;;
class Child : public Parent &#123;&#125;;

main&#40;&#41;&#123;
&#160; &#160; Parent* p;
&#160; &#160; p = new Parent&#40;&#41;;
&#160; &#160; const type_info &#38; id_p = typeid&#40;*p&#41;;
&#160; &#160; cout &#60;&#60; id_p.name&#40;&#41; &#60;&#60; endl;
&#160; &#160; p = new Child&#40;&#41;;
&#160; &#160; const type_info &#38; id_c [...]]]></description>
			<content:encoded><![CDATA[<p>Javaでは普通に行われている実行時の型情報取得（ Object.getClass(), Class.getName()とかinstanceOfとかね ）ですが、CではできないのだからどうせC++でもできないのだろうなと思っていたら予想に反し<a href="http://en.wikipedia.org/wiki/Run-time_type_information">RunＴime Type Identification (RTTI)</a>という実行時の型情報取得機能がばっちり用意されてました。 確かにdynamic_castができているわけだし、まあそういうことだよねと納得。 ということでC++で実行時クラス名の取得を試みました。</p>
<p>実行時型情報取得は<a href="http://en.wikipedia.org/wiki/Typeid">typeid</a>演算子を使います。typeid演算子は<a href="http://www.cplusplus.com/reference/std/typeinfo/type_info/">type_info</a>型クラスの参照を返し、そのtype_infoのメンバname()より型情報の文字列が取得できます。 それでは次のコードで型情報を取得してみます。</p>
<div class="codecolorer-container cpp default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:650px;"><div class="cpp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #339900;">#include &lt;iostream&gt;</span><br />
<span style="color: #339900;">#include &lt;typeinfo&gt;</span><br />
<span style="color: #0000ff;">using</span> std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span><span style="color: #008080;">;</span><br />
<span style="color: #0000ff;">using</span> std<span style="color: #008080;">::</span><span style="color: #007788;">endl</span><span style="color: #008080;">;</span><br />
<span style="color: #0000ff;">using</span> std<span style="color: #008080;">::</span><span style="color: #007788;">type_info</span><span style="color: #008080;">;</span><br />
<br />
<span style="color: #0000ff;">class</span> Parent<span style="color: #008000;">&#123;</span><br />
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span><br />
&nbsp; <span style="color: #0000ff;">virtual</span> <span style="color: #0000ff;">void</span> x<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span><br />
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span><br />
<span style="color: #0000ff;">class</span> Child <span style="color: #008080;">:</span> <span style="color: #0000ff;">public</span> Parent <span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span><br />
<br />
main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; Parent<span style="color: #000040;">*</span> p<span style="color: #008080;">;</span><br />
&nbsp; &nbsp; p <span style="color: #000080;">=</span> <span style="color: #0000dd;">new</span> Parent<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><br />
&nbsp; &nbsp; <span style="color: #0000ff;">const</span> type_info <span style="color: #000040;">&amp;</span> id_p <span style="color: #000080;">=</span> <span style="color: #0000ff;">typeid</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>p<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><br />
&nbsp; &nbsp; <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> id_p.<span style="color: #007788;">name</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span><br />
&nbsp; &nbsp; p <span style="color: #000080;">=</span> <span style="color: #0000dd;">new</span> Child<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><br />
&nbsp; &nbsp; <span style="color: #0000ff;">const</span> type_info <span style="color: #000040;">&amp;</span> id_c <span style="color: #000080;">=</span> <span style="color: #0000ff;">typeid</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>p<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><br />
&nbsp; &nbsp; <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> id_c.<span style="color: #007788;">name</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span><br />
<span style="color: #008000;">&#125;</span></div></div>
<p>これをコンパイル(gcc 4.3.2)後に実行した結果は次のとおり。</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">6Parent<br />
5Child</div></div>
<p>ParentクラスとChildクラスそれぞれの結果は確かにそれっぽいものが得られましたがなぜかクラス名の前に文字数がくっついてます。 どうしたもんだと思ってググってみるとまさに<a href="http://ml.tietew.jp/cppll/cppll/thread_articles/8646">ピンポイントなMLでの議論</a>を発見。 クラスの前の数字がゴミに見えて気づかなかったのですがこれは<a href="http://en.wikipedia.org/wiki/Name_mangling">マングリング</a>された文字列でした。 というわけで問題はデマングリングで解決します。上記MLではその法についても紹介されていたのでそれを参考にデマングリングを試みます。</p>
<p>デマングリングにはcxxabi.hに定義されている__cxa_demangle()関数を使用します。まずはヘッダを覗いてみます。</p>
<p><u>__cxa_demangle() @ /usr/include/c++/4.1.3/cxxabi.h</u></p>
<div class="codecolorer-container cpp default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:650px;"><div class="cpp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #339900;">#ifdef __cplusplus</span><br />
<span style="color: #0000ff;">namespace</span> __cxxabiv1<br />
<span style="color: #008000;">&#123;</span><br />
&nbsp; <span style="color: #0000ff;">extern</span> <span style="color: #FF0000;">&quot;C&quot;</span><br />
&nbsp; <span style="color: #008000;">&#123;</span><br />
<span style="color: #339900;">#endif</span><br />
...略...<br />
&nbsp; <span style="color: #666666;">// Demangling routines.</span><br />
&nbsp; <span style="color: #0000ff;">char</span><span style="color: #000040;">*</span><br />
&nbsp; __cxa_demangle<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> <span style="color: #0000ff;">char</span><span style="color: #000040;">*</span> __mangled_name, <span style="color: #0000ff;">char</span><span style="color: #000040;">*</span> __output_buffer,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #0000ff;">size_t</span><span style="color: #000040;">*</span> __length, <span style="color: #0000ff;">int</span><span style="color: #000040;">*</span> __status<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><br />
<span style="color: #339900;">#ifdef __cplusplus</span><br />
&nbsp; <span style="color: #008000;">&#125;</span><br />
<span style="color: #008000;">&#125;</span> <span style="color: #666666;">// namespace __cxxabiv1</span><br />
<span style="color: #339900;">#endif</span><br />
...略...<br />
<span style="color: #666666;">// User programs should use the alias `abi'.</span><br />
<span style="color: #0000ff;">namespace</span> abi <span style="color: #000080;">=</span> __cxxabiv1<span style="color: #008080;">;</span></div></div>
<p>次にこの__cxa_demangle()を使って先のマングルされた文字列をデマングルしてみます。</p>
<div class="codecolorer-container cpp default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:650px;"><div class="cpp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #339900;">#include &lt;iostream&gt;</span><br />
<span style="color: #339900;">#include &lt;typeinfo&gt;</span><br />
<span style="color: #339900;">#include &lt;cxxabi.h&gt;</span><br />
<span style="color: #0000ff;">using</span> std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span><span style="color: #008080;">;</span><br />
<span style="color: #0000ff;">using</span> std<span style="color: #008080;">::</span><span style="color: #007788;">endl</span><span style="color: #008080;">;</span><br />
<span style="color: #0000ff;">using</span> std<span style="color: #008080;">::</span><span style="color: #007788;">type_info</span><span style="color: #008080;">;</span><br />
<br />
<span style="color: #0000ff;">class</span> Parent<span style="color: #008000;">&#123;</span><br />
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span><br />
&nbsp; <span style="color: #0000ff;">virtual</span> <span style="color: #0000ff;">void</span> x<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span> &nbsp;<span style="color: #666666;">// 1. 仮想メソッド宣言</span><br />
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span><br />
<span style="color: #0000ff;">class</span> Child <span style="color: #008080;">:</span> <span style="color: #0000ff;">public</span> Parent <span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span><br />
<br />
main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; Parent<span style="color: #000040;">*</span> p<span style="color: #008080;">;</span><br />
&nbsp; &nbsp; <span style="color: #0000ff;">int</span> status<span style="color: #008080;">;</span><br />
&nbsp; &nbsp; p <span style="color: #000080;">=</span> <span style="color: #0000dd;">new</span> Parent<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><br />
&nbsp; &nbsp; <span style="color: #0000ff;">const</span> type_info <span style="color: #000040;">&amp;</span> id_p <span style="color: #000080;">=</span> <span style="color: #0000ff;">typeid</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>p<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><br />
&nbsp; &nbsp; <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> abi<span style="color: #008080;">::</span>__cxa_demangle<span style="color: #008000;">&#40;</span>id_p.<span style="color: #007788;">name</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, 0, 0, <span style="color: #000040;">&amp;</span>status<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span><br />
&nbsp; &nbsp; p <span style="color: #000080;">=</span> <span style="color: #0000dd;">new</span> Child<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><br />
&nbsp; &nbsp; <span style="color: #0000ff;">const</span> type_info <span style="color: #000040;">&amp;</span> id_c <span style="color: #000080;">=</span> <span style="color: #0000ff;">typeid</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>p<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><br />
&nbsp; &nbsp; <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> abi<span style="color: #008080;">::</span>__cxa_demangle<span style="color: #008000;">&#40;</span>id_c.<span style="color: #007788;">name</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, 0, 0, <span style="color: #000040;">&amp;</span>status<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span><br />
<span style="color: #008000;">&#125;</span></div></div>
<p>デマングル版コードをコンパイル(gcc 4.3.2)後に実行してみると無事クラス名が出力。 ということで見事実行時クラス名の取得に成功しました。</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Parent<br />
Child</div></div>
<p>おわり</p>
<div class="feedflare">
<a href="http://feed.yk55.com/~ff/yokawasa/syndication?a=UuF3vR_QkJs:kcdZAOCEPl4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/yokawasa/syndication?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feed.yk55.com/~ff/yokawasa/syndication?a=UuF3vR_QkJs:kcdZAOCEPl4:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/yokawasa/syndication?d=7Q72WNTAKBA" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://yk55.com/blog/2010/01/20/get_cpp_classname_by_typeid_and_demangle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>さくらインターネット移行 + ブログ新設</title>
		<link>http://yk55.com/blog/2010/01/12/moving-to-sakura-internet-and-wordpress/</link>
		<comments>http://yk55.com/blog/2010/01/12/moving-to-sakura-internet-and-wordpress/#comments</comments>
		<pubDate>Mon, 11 Jan 2010 16:58:53 +0000</pubDate>
		<dc:creator>yoichi</dc:creator>
				<category><![CDATA[random]]></category>
		<category><![CDATA[sakura]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://yk55.com/blog/?p=12</guid>
		<description><![CDATA[これまで自宅の寝室でLinuxルーター/Webサーバ/その他いろいろ兼として動いていたPCが、もはやいつ落ちても、火を噴いてもおかしくないくらい老朽化が進んでしまったので昨年末にリニューアルすることを決めた。決めたといっても年末年始は仕事もプライベートも忙しい時。ずるずると時間が過ぎてしまい今日この成人の日にようやく作業を進めることが出来た。
今日手をつけたのはWebサーバ。Web公開ファイル達は「さくらインターネット」レンタルサーバに移行した。さくらに決めた理由は特別あるわけではない。安くて最低限の自由度さえあれば何でもよく、そのサービス概要をみて特に問題なさそうだったので即決した。「さくらのレンタルサーバスタンダード」プランにした。容量～3Gでマルチドメイン対応（独自ドメインが使える）、MySQLとPHPが使えるのでLAMPなブログソフトも動く、そして費用は年間で6000円程度、月当たり500円と安い。とりあえず一年間だけ申し込んでみた。
また移行ついでにブログも新しくWordpressで新設した。既存のブログはいろいろな面で古くどうしようもなく時間もないのでとりあえずディテクトリごと新サーバにコピーしてDNSの向き先だけ変えてやりそのまま放置することにした。今後はこちらに新しい記事を書いていきます。もし私のブログを読んでいただけるという方はこちらのフィード登録よろしくです。
以下今回の移行で行なった主な作業一覧：

GMO→さくらにgTLDドメイン移行
wordpressインストール＋設定 (theme CSS WITH COLOUR)
ドメインレコードの変更
%dig yk55.com NS
...
;; ANSWER SECTION:
yk55.com.               3600    IN      NS      ns2.dns.ne.jp.
yk55.com.               3600 [...]]]></description>
			<content:encoded><![CDATA[<p>これまで自宅の寝室でLinuxルーター/Webサーバ/その他いろいろ兼として動いていたPCが、もはやいつ落ちても、火を噴いてもおかしくないくらい老朽化が進んでしまったので昨年末にリニューアルすることを決めた。決めたといっても年末年始は仕事もプライベートも忙しい時。ずるずると時間が過ぎてしまい今日この成人の日にようやく作業を進めることが出来た。</p>
<p>今日手をつけたのはWebサーバ。Web公開ファイル達は「<a title="さくらインターネット" href="http://www.sakura.ad.jp/">さくらインターネット</a>」レンタルサーバに移行した。さくらに決めた理由は特別あるわけではない。安くて最低限の自由度さえあれば何でもよく、そのサービス概要をみて特に問題なさそうだったので即決した。「<a title="さくらインターネットスタンダードプラン" href="http://www.sakura.ne.jp/rentalserver/standard/index.html">さくらのレンタルサーバスタンダード</a>」プランにした。容量～3Gでマルチドメイン対応（独自ドメインが使える）、MySQLとPHPが使えるのでLAMPなブログソフトも動く、そして費用は年間で6000円程度、月当たり500円と安い。とりあえず一年間だけ申し込んでみた。</p>
<p>また移行ついでにブログも新しく<a title="wordpress" href="http://wordpress.org/">Wordpress</a>で新設した。<a title="old blog" href="http://blog.yk55.com">既存のブログ</a>はいろいろな面で古くどうしようもなく時間もないのでとりあえずディテクトリごと新サーバにコピーしてDNSの向き先だけ変えてやりそのまま放置することにした。今後はこちらに新しい記事を書いていきます。もし私のブログを読んでいただけるという方は<a title="blog feed" href="http://yk55.com/blog/feed/">こちらのフィード</a>登録よろしくです。</p>
<p>以下今回の移行で行なった主な作業一覧：</p>
<ul>
<li>GMO→さくらに<a href="http://support.sakura.ad.jp/support/manual/domain/index2.shtml">gTLDドメイン移行</a></li>
<li>wordpressインストール＋設定 (theme <a title="CSS WITH COLOUR: PSD to HTML" href="http://www.csswithcolour.com/">CSS WITH COLOUR</a>)</li>
<li>ドメインレコードの変更</li>
<pre>%dig yk55.com NS
...
;; ANSWER SECTION:
yk55.com.               3600    IN      NS      ns2.dns.ne.jp.
yk55.com.               3600    IN      NS      ns1.dns.ne.jp.</pre>
<li>DNS設定変更</li>
<pre> @  	 NS  	 ns1.dns.ne.jp.
         NS 	 ns2.dns.ne.jp.
         A 	 112.78.112.204
 www 	 CNAME 	 @
 blog 	 CNAME 	 @
 feed 	 CNAME 	 ytmyxs.feedproxy.ghs.google.com.</pre>
</ul>
<div class="feedflare">
<a href="http://feed.yk55.com/~ff/yokawasa/syndication?a=dfy2FUSXOks:s6mWEIn20YE:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/yokawasa/syndication?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feed.yk55.com/~ff/yokawasa/syndication?a=dfy2FUSXOks:s6mWEIn20YE:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/yokawasa/syndication?d=7Q72WNTAKBA" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://yk55.com/blog/2010/01/12/moving-to-sakura-internet-and-wordpress/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
