<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>るなぽブログ</title>
    <link rel="alternate" type="text/html" href="http://www.lunaport.net/blog/" />
    <link rel="self" type="application/atom+xml" href="http://www.lunaport.net/blog/atom.xml" />
    <id>tag:www.lunaport.net,2009-11-29:/blog//6</id>
    <updated>2011-12-18T16:30:32Z</updated>
    
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type 5.06</generator>

<entry>
    <title>Windowsのファイルマネージャーの検索バーみたいな半透明エディットボックスが欲しい！！</title>
    <link rel="alternate" type="text/html" href="http://www.lunaport.net/blog/2011/12/windows.html" />
    <id>tag:www.lunaport.net,2011:/blog//6.35</id>

    <published>2011-12-18T15:43:42Z</published>
    <updated>2011-12-18T16:30:32Z</updated>

    <summary>カーネル / VM Advent Calendar (2011年度) の参加記事...</summary>
    <author>
        <name>どようび</name>
        
    </author>
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.lunaport.net/blog/">
        <![CDATA[<p>カーネル / VM Advent Calendar (2011年度) の参加記事です。<br />
メインの内容はWindowsのDLLで遅延読み込みされるAPIを、Delay IATを書き換える方法でフックです。なんかぐぐっても見つからないので情報共有的な意味でも。</p>

<p><a href="#main_content">--- どうでもいいところを飛ばす ---</a></p>

<p>下記のような、Windowsのファイルマネージャーの検索バーみたいな半透明エディットボックスが欲しい！！<br />
<img alt="1.png" src="http://www.lunaport.net/blog/2011/12/19/1.png" width="500" height="233" class="mt-image-none" style="" /></p>

<p>普通に、ウィンドウのガラス領域にエディットボックスをCreateWindowで作ってみたら、次のようになってしまって若干おかしい・・・・</p>

<p><img alt="2.png" src="http://www.lunaport.net/blog/2011/12/19/2.png" width="627" height="314" class="mt-image-none" style="" /></p>

<p>いろいろぐぐってみたら、下記サイトに情報があった<br />
<a href="http://weblogs.asp.net/kennykerr/archive/2007/01/23/controls-and-the-desktop-window-manager.aspx"><br />
http://weblogs.asp.net/kennykerr/archive/2007/01/23/controls-and-the-desktop-window-manager.aspx<br />
</a></p>

<p>情報のとおりにやってみたら、綺麗に描画できるようになった</p>

<p><img alt="3.png" src="http://www.lunaport.net/blog/2011/12/19/3.png" width="616" height="225" class="mt-image-none" style="" /></p>

<p>しかし・・・</p>

<p><img alt="4.png" src="http://www.lunaport.net/blog/2011/12/19/4.png" width="616" height="269" class="mt-image-none" style="" /></p>

<p>原因を調べると、次のようなことがわかった。</p>

<p><img alt="5.png" src="http://www.lunaport.net/blog/2011/12/19/5.png" width="432" height="392" class="mt-image-none" style="" /></p>

<p>なので、良くあるWindowsのAPIフックを使い、再描画のタイミングを制御するためのコードを注入した。<br />
自分は、<a href="http://ruffnex.oc.to/kenji/text/api_hook/">http://ruffnex.oc.to/kenji/text/api_hook/ </a>を参考にさせてもらった。</p>

<p><img alt="6.png" src="http://www.lunaport.net/blog/2011/12/19/6.png" width="406" height="422" class="mt-image-none" style="" /></p>

<p>ただし、comctl32.dll からの DrawThemeBackground() APIの呼び出しは、dllの遅延インポート領域にかいてあるらしく、<br />
直接フックはできないので、遅延インポート領域を初期化するのに使われるGetProcAddress() APIをフックして、そいつ経由で<br />
コードを注入した</p>

<p><img alt="7.png" src="http://www.lunaport.net/blog/2011/12/19/7.png" width="490" height="338" class="mt-image-none" style="" /></p>

<p>しかし、Windows Vista/7 はこの方法でいけたのだが、なぜかWindows8ではDrawThemeBackground() APIのフックに失敗する・・・・。</p>

<p><img alt="11.png" src="http://www.lunaport.net/blog/2011/12/19/11.png" width="685" height="302" class="mt-image-none" style="" /></p>

<p>調べてみると、なんとDrawThemeBackground() APIを遅延インポートするのに、GetProcAddress() APIが使われていない・・・</p>

<p><img alt="9.png" src="http://www.lunaport.net/blog/2011/12/19/9.png" width="486" height="345" class="mt-image-none" style="" /></p>

<p>誰だよ！勝手にアドレス書いたのは！！....orz</p>

<p><img alt="8.png" src="http://www.lunaport.net/blog/2011/12/19/8.png" width="830" height="469" class="mt-image-none" style="" /></p>

<p>・・・ということで、こんどはきっちりメモリにはりついている、上図参照のqword ptr [__imp_DrawThemeBackground] を書き換えることにする。</p>

<p><img alt="10.png" src="http://www.lunaport.net/blog/2011/12/19/10.png" width="409" height="346" class="mt-image-none" style="" /></p>

<p><a name="main_content">&nbsp;</a><br />
なぜかネットにぜんぜん情報が無かったので、しょーがなくスタックオーバーフローの記事<br />
<a href="http://stackoverflow.com/questions/3430718/thunk-table-in-import-address-table">http://stackoverflow.com/questions/3430718/thunk-table-in-import-address-table</a>とかそこにのってるリンク先とか色々見ながら自前で実装した</p>

<p>delay import address tableのベースアドレスをゲットできれば、あとは伝統的なIAT書き換えフックと要領は同じだった</p>

<p><img alt="13.png" src="http://www.lunaport.net/blog/2011/12/19/13.png"  class="mt-image-none" style="" /></p>

<p><a href="http://svn.coderepos.org/share/lang/objective-cplusplus/i3/trunk/tmp/dwmedit/ApiHook.cc">ちゃんと動く（と思う）ソースはこちら</a></p>

<p>これで実装してみたら、<br />
<img alt="14.png" src="http://www.lunaport.net/blog/2011/12/19/14.png" width="678" height="433" class="mt-image-none" style="" /></p>

<p><a href="http://svn.coderepos.org/share/lang/objective-cplusplus/i3/trunk/tmp/dwmedit/">VCのプロジェクトはこれです</a></p>

<p><br />
&nbsp;</p>]]>
        
    </content>
</entry>

<entry>
    <title>static_assertとdynamic_assert(仮)</title>
    <link rel="alternate" type="text/html" href="http://www.lunaport.net/blog/2011/12/h1-static-assertdynamic-assert-c11-advent-calendar-h2-static-assert-send-foo-plain.html" />
    <id>tag:www.lunaport.net,2011:/blog//6.34</id>

    <published>2011-12-15T22:06:21Z</published>
    <updated>2011-12-16T03:51:19Z</updated>

    <summary>C++11 Advent Calendarの参加記事です。 static_ass...</summary>
    <author>
        <name>どようび</name>
        
    </author>
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.lunaport.net/blog/">
        <![CDATA[<p>C++11 Advent Calendarの参加記事です。</p>

<p>static_assertの利用例とdynamic_assert(仮)についてを記述します。</p>

<h2>1 static_assert利用例</h2>

<p>次のような仕様の"send_foo()"関数を作ることにする。</p>

<ol>
<li>任意のPlain Old Data型変数を引数として受けとる</li>
<li>sizeof(引数)の値が2の10乗を超えたらエラー</li>
<li>sizeof(引数)の値を、2の<b style="color: red;">N</b>乗かを計算し、すでに存在する関数send_foo_<b style="color: red;">N</b>()を実行</li>
</ol>

<p>上記仕様をできるだけstatic_assertでチェックしてみる。</p>

<h3>1.1 「sizeof(引数)の値が2の10乗を超えたらエラー」のstatic_assert</h3>

<p>次のようにする</p>



<pre>
template &lt;class T&gt;
void send_foo(T t) {
	static_assert(sizeof(t) &lt;= (2 &lt;&lt; (10 - 1)), &quot;sizeof(t) is too big&quot;);
}
</pre>



<p>ただ、シフト演算よりもpow(2, 10)と書くほうがベターではある。<br />
しかし、標準のpow関数の戻り値はstatic_assertには渡せないので、そうやりたい場合は<br />
いまのところ標準にはそういうモノがなさそうなので自前で定義することになる。</p>

<h4>1.1.1 テストとpower関数の自作</h4>

<p>power関数の仕様は以下</p>

<ol>
<li>引数1を引数2乗した結果を返す</li>
<li>引数、戻り値はint、ただし負の数を与えた場合と0の0乗は未定義</li>
<li>結果が符号あり32ビット整数の最大値を超えたら結果は未定義</li>
</ol>



<pre>
static_assert(power(0, 1) == 0, &quot;0の1乗&quot;);
static_assert(power(0, 2) == 0, &quot;0の2乗&quot;);

static_assert(power(1, 0) == 1, &quot;1の0乗&quot;);
static_assert(power(1, 1) == 1, &quot;1の1乗&quot;);
static_assert(power(1, 2) == 1, &quot;1の2乗&quot;);

static_assert(power(2, 0) == 1, &quot;2の0乗&quot;);
static_assert(power(2, 1) == 2, &quot;2の1乗&quot;);
static_assert(power(2, 2) == 4, &quot;2の2乗&quot;);

// 最大値付近のチェックは略
</pre>



<p>実装を書く</p>



<pre>
constexpr int power(int x, int y) {
    return y &lt;= 1 ? x : x * power(x, y - 1);
}
</pre>



<p>コンパイルしてもエラーが出ないことを確認して、元のsend_foo()関数を書き換える</p>



<pre>
template &lt;class T&gt;
void send_foo(T t) {
	static_assert(sizeof(t) &lt;= power(2, 10), &quot;sizeof(t) is too big&quot;);
}
</pre>



<p>結果はこちら<br />
<img alt="1.png" src="http://www.lunaport.net/blog/1.png" width="704" height="507" class="mt-image-none" style="" /></p>

<p>実際にはpower関数は車輪なので、<a href="https://github.com/bolero-MURAKAMI/Sprout">Sprout C++ Library</a>などを使わせてもらう。</p>

<h3>1.2 「任意のPlain Old Data型変数を引数として受けとる」のstatic_assert</h3>

<p>type_traitsヘッダ内に、型を引数にとって、型の特性を教えてくれる機能いっぱいある。<br />
これはstatic_assertでも使用することができる。<br />
「Plain Old Dataかどうかを調べる」機能を呼び出すにはis_podを使う。</p>

<p>is_podはメタ関数と呼ばれていて、普通の関数とは違い下記のようにして結果を取得</p>



<pre>
bool PODか判定結果 = is_pod&lt;PODかどうか調べたい型&gt;::value;
</pre>



<p>ぜんぜん直観的ではないが、判定結果はstatic_assertに渡すことができる。</p>



<pre>
#include &lt;type_traits&gt;
template &lt;class T&gt;
void send_foo(T t) {
	static_assert(std::is_pod&lt;T&gt;::value, &quot;t is not POD&quot;);
}
</pre>



<p>最初は嫌だったけど、自分自身が似たようなテクニックを使わざるを得ない状況に陥ると<br />
だんだん作った人の気持ちがわかり、この表記も許せるようになった。</p>

<p>いちおうマクロを定義すれば、直観的な関数呼び出しの書き方が使えるけどあんましおすすめしない。</p>



<pre>
#define IS_POD(arg) is_pod&lt;decltype(arg)&gt;::value
template &lt;class T&gt;
void send_foo(T t) {
	static_assert(IS_POD(t), &quot;T is not POD&quot;);
}
</pre>



<p>type_traitsについては、このサイトがめっちゃ詳しいです。<br />
<a href="https://sites.google.com/site/cpprefjp/reference/type_traits"><br />
https://sites.google.com/site/cpprefjp/reference/type_traits<br />
</a></p>

<p>結果はこちら<br />
<img alt="2.png" src="http://www.lunaport.net/blog/2.png" width="704" height="507" class="mt-image-none" style="" /></p>

<h3>1.3 「sizeof(引数)の値を、2の<b style="color: red;">N</b>乗かを計算し、すでに存在する関数send_foo_<b style="color: red;">N</b>()を実行」 のstatic_assert</h3>

<p>外部の関数実行のテストはやりずらい。そのため、<br />
まず実行するべき関数を配列に入れておき、<br />
どれを実行するかを選ぶ新たな関数を作り、そいつに対してテストを行う。</p>



<pre>
template &lt;class T&gt;
void send_foo(T t) {
	static_assert(sizeof(t) &lt;= power(2, 10), &quot;sizeof(t) is too big&quot;);
	static_assert(std::is_pod&lt;T&gt;::value, &quot;t is not POD&quot;);
    // 実行すべき関数
    std::function&lt;void(void*)&gt; functions[] = {
        send_foo_0,
        send_foo_1,
        send_foo_2,
        send_foo_3
        // TODO ここにいっぱい関数が増える。
    };
    // どれを実行するか選ぶ関数
    constexpr int index = get_index_by_size(sizeof(t));
    static_assert(index &gt;= 0 &amp;&amp; index &lt; _countof(functions), &quot;array index out of bounds&quot;);
    // 実行
    functions[index](reinterpret_cast&lt;void*&gt;(&amp;t));
}
</pre>



<p>get_index_by_size()関数で、実行するべき関数のを選ぶ。仕様は次のとおり。</p>

<ol>
<li>引数が、2のN乗かを計算し、Nは小数点値切捨てて結果として返す。(power(floor(log2(引数)), 2))</li>
<li>結果が符号あり32ビット整数の最大値を超えたら結果は未定義</li>
</ol>



<pre>
static_assert(get_index_by_size(1) == 0, &quot;&quot;);
static_assert(get_index_by_size(2) == 1, &quot;&quot;);
static_assert(get_index_by_size(3) == 1, &quot;&quot;);
static_assert(get_index_by_size(4) == 2, &quot;&quot;);
static_assert(get_index_by_size(1023) == 9, &quot;&quot;);
static_assert(get_index_by_size(1024) == 10, &quot;&quot;);
// 最大値判定は略
</pre>



<p>実装を記述する。この実装にたどり着くまで30回くらいトライ＆エラーをやった。<br />
再帰関数は、正直人類には難しすぎる知恵だと思う。</p>



<pre>
constexpr int get_index_by_size(int size, int depth = 0) {
    return (size &lt; power(2, depth)) ?
        depth : get_index_by_size(size, depth + 1);
}
</pre>



<p>そして、完成した時を見計らって、引数としてstd::vectorを渡し、計算で使ってたPODのサイズを<br />
size()メソッドを使って計算するように仕様が変更される。無情な世の中である。</p>

<h2>dynamic_assert（仮）について</h2>

<p>vectorなどを使われてしまうと、static_assertができない。その場合boost::testなどを使った通常のテストを行う必要がある。</p>

<p>しかし、static_assertと比べ、通常のテストには以下のような弱点がある</p>

<ol>
<li>テスト結果を、IDEと連携して表示するツールがなぜか高価</li>
<li>ソースを書いて保存しても自動でテストは走らない<br />
(最近のIDEはソース執筆中に自動で文法エラーとか簡単なstatic_assert結果を表示してくれる)</li>
</ol>

<p><img alt="4.png" src="http://www.lunaport.net/blog/4.png" width="581" height="450" class="mt-image-none" style="" /></p>

<p>そのため、上記機能を実現するVisual Studioのアドインを開発中。dynamic_assert(仮)とした。<br />
<a href="http://www.lunaport.net/blog/DynamicAssertAddin.zip">ソースとバイナリのダウンロードはこちら: DynamicAssertAddin.zip</a></p>

<p>アドインをVisual Studioに正常に追加できている場合、ツールメニューに「Dynamic Assertの開始」と<br />
表示される。プロジェクトを開いてからそのメニューを選択すると、次のようになる。</p>

<ol>
<li>裏で勝手にテストが走る</li>
<li>エラー一覧に結果が表示される</li>
</ol>

<p><img alt="5.png" src="http://www.lunaport.net/blog/5.png" width="590" height="585" class="mt-image-none" style="" /></p>

<p>現在はプロジェクト実行時にboost::testが走るVC++のプロジェクトのみ対応しています。「裏で走らせる」機能を、Jenkinsみたいな別のサーバーにやらせることができれば、大規模開発にも耐えると思う。</p>

<p>要するに、<a href="http://infinitest.github.com/">infinitest</a>のパクリ。</p>

<p>以上です</p>]]>
        
    </content>
</entry>

<entry>
    <title>テーブル名に、data/info/mst はつけないで欲しい...orz</title>
    <link rel="alternate" type="text/html" href="http://www.lunaport.net/blog/2011/09/datainfomst-orz.html" />
    <id>tag:www.lunaport.net,2011:/blog//6.33</id>

    <published>2011-09-03T12:15:54Z</published>
    <updated>2011-09-03T12:32:01Z</updated>

    <summary>companyだったかcompany_dataだったかcompany_infoだ...</summary>
    <author>
        <name>どようび</name>
        
    </author>
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.lunaport.net/blog/">
        <![CDATA[<p>companyだったかcompany_dataだったかcompany_infoだったかcompany_mstだったか思い出せなくてその都度IDEに怒られたり(静的言語)カンペを見たり(動的言語)してると集中力もってかれるんですよ！！！！！！！！！！！！orz</p>

<p>いや、プロジェクトで接尾語の明確な定義が決まってるんだったらいいんだけどさ.....<br />
</p>]]>
        
    </content>
</entry>

<entry>
    <title>Emacsの*Completions*バッファに出るヘルプ表示を消す方法</title>
    <link rel="alternate" type="text/html" href="http://www.lunaport.net/blog/2011/04/emacscompletions.html" />
    <id>tag:www.lunaport.net,2011:/blog//6.32</id>

    <published>2011-04-29T14:55:33Z</published>
    <updated>2011-05-06T07:16:22Z</updated>

    <summary>Emacsでファイル名とかを補完しようとすると*Completions*バッファ...</summary>
    <author>
        <name>どようび</name>
        
    </author>
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.lunaport.net/blog/">
        <![CDATA[<p>Emacsでファイル名とかを補完しようとすると*Completions*バッファが出るんだけど、そこには下記のようなヘルプメッセージが出る</p>
<pre>Click &lt;mouse-2&gt; on a completion to select it.
In this buffer, type RET to select the completion near point.</pre>
<p>何度か見たら不要になる。下記の設定で消す/非表示/出さない(検索用)ようにできる。</p>
<pre>(setq completion-show-help nil)</pre>
]]>
        
    </content>
</entry>

<entry>
    <title>近況とお詫び</title>
    <link rel="alternate" type="text/html" href="http://www.lunaport.net/blog/2011/01/post-13.html" />
    <id>tag:www.lunaport.net,2011:/blog//6.30</id>

    <published>2011-01-26T07:02:51Z</published>
    <updated>2011-01-26T07:38:50Z</updated>

    <summary>ブログのデザインいじってたら、どうもmixiとかRSSの新着に更新してもいないの...</summary>
    <author>
        <name>どようび</name>
        
    </author>
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.lunaport.net/blog/">
        <![CDATA[<p>ブログのデザインいじってたら、どうもmixiとかRSSの新着に更新してもいないのに記事が乱立しちゃってました。すみません。</p>

<p>それだけではあれなので、近況報告します。今は相変わらずカスな日常を送っています。プログラミングの勉強会とかに出席し、前でプレゼンしている人に質問し、であとでustreamでの勉強会の動画をみて自分の声の予想外のキモさに悶えたりしています。</p>

<p>今春から、再度プログラマー的な仕事をすることになりますが、分野はローレイヤーからハイレイヤーに鞍替えすることになります。マイコンいじり(Webで操作できる自動風呂沸かし機とか、安く作りたい)はじめたりカーネルいじりは続行したいと思っていますが、余裕があるかは謎です。さしあたり流行りのIT技術を勉強＆思い出す感じです。ちなみに俺情報工学科のくせにクラウド関連技術をまともに接触したこともないんです氏にたい。(Gmailとかは使うけど...)</p>]]>
        
    </content>
</entry>

<entry>
    <title>LinuxのカーネルモジュールをC++で書く</title>
    <link rel="alternate" type="text/html" href="http://www.lunaport.net/blog/2010/12/linuxc.html" />
    <id>tag:www.lunaport.net,2010:/blog//6.29</id>

    <published>2010-12-31T14:21:56Z</published>
    <updated>2011-01-23T02:59:57Z</updated>

    <summary>C++ Advent Calendar 参加記事です。 Linuxのカーネルモジ...</summary>
    <author>
        <name>どようび</name>
        
    </author>
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.lunaport.net/blog/">
        <![CDATA[<a href="http://atnd.org/events/10573">C++ Advent Calendar</a> 参加記事です。
<br /><br />
LinuxのカーネルモジュールをC++で書く　 ～C言語er(アンチC++)との仁義なき戦い（と敗北）～
<br /><br />
注：この記事はどようびが日ごろのうっぷんを晴らすべく心赴くまま書きなぐったモノです。理不尽なDISりとか投げやりな実装とか多数含まれますが、笑って許してください...m(__)m ... お願いします....
<br /><br />

<h2>* はじめに</h2>
<p>研究室でLinuxのソースを触ることになったのだが、そこには生粋の<strike>VB厨</strike>C++厨であるどようびにとっては信じられない世界が広まっていた！</p>
<p>既に絶滅したかに思われていたさまざまなコードがどようびを襲う！</p>
<p>そして、カーネルいじりでもC++使えたらなぁ～。と思いぐぐってみたら次の記事が引っかかった！</p>
<p><a href="http://kerneltrap.org/node/2067">Linux: C++ In The Kernel? | KernelTrap</a><br /></p>
<p>Linus曰く<br />The fact is, C++ compilers are not trustworthy. They were even worse in 1992, but some fundamental facts haven't changed: </p>
<ol>
  <li>the whole C++ exception handling thing is fundamentally broken. It's _especially_ broken for kernels. <br /><b>例外が嫌</b></li>
  <li>any compiler or language that likes to hide things like memory allocations behind your back just isn't a good choice for a kernel.<br /><b>メモリ確保勝手するのが嫌</b></li>
  <li>you can write object-oriented code (useful for filesystems etc) in C, _without_ the crap that is C++.<br /><b>OOはCでもできる</b></li>
</ol>
<p>つまり、<font style="font-size: 1em;"><b>例外とnew/deleteを使わなければ良い</b></font>んじゃね？良いよね！！！！new,deleteも自前で定義すればいいよね！</p><br />

]]>
        <![CDATA[<h2>* 既存のコードに対する不満点など</h2>
<h3>** 継承</h3>
<p>
次のLinuxカーネルのコードを見てくれ！<br />
<u>(include/linux/device.h)</u>
</p>
<blockquote>
struct device {<br />
	　　struct device		*parent;<br />
	　　struct device_private	*p;<br />
    　　(略)<br />
	　　<b>void		*platform_data;	/* Platform specific data, device</b><br />
    　　(略)<br />
};
</blockquote>
<p>任意のデータをvoid*で受けるのはC++erとしてはあんましやりたくない。というか型エラーの<br />
チェックはできるだけ全てコンパイラにやらせたいのがC++erの真理だと思う。(void*)にキャスト<br />
しちゃうと目でチェックするしかない。<br />
で、この場合platform_dataの子クラスのみ格納できるようにしたい。<br />
実際にデバイスドライバ側で件のデータを使うときは、『platform_data ⇒ その子クラス』ダウンキャストになるが、<br />
polymorphic_downcast という神キャストが存在するのでそれを使うべし！</p>
<p>デバッグ時とリリース時で違う動きするなだと！？、両方で使えるテストを書こう！！！</p>

<h3>** 継承２</h3>
<p>もう継承でやっちゃえよ！直したいー！！</p><p><u>(include/linux/fs.h)</u><br /></p>
<blockquote>
struct file_operations {<br />　　struct module *owner;<br />　　loff_t (*llseek) (struct file *, loff_t, int);<br />　　ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);<br />　　ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);<br />　　ssize_t (*aio_read) (struct kiocb *, const struct iovec *, unsigned long, loff_t);<br />
	　　ssize_t (*aio_write) (struct kiocb *, const struct iovec *, unsigned long, loff_t);<br />
	　　int (*readdir) (struct file *, void *, filldir_t);<br />
	　　unsigned int (*poll) (struct file *, struct poll_table_struct *);<br />
    　　(略)<br />
};<br /></blockquote><p>
↓直したい！！！<br /></p><blockquote>
class file_operations {<br />
	　　module *owner;<br />
    　　virtual loff_t llseek(file *, loff_t, int) {<br />
        　　　　....<br />
    　　}<br />
    　　(略)<br />
};</blockquote><p></p><p><br /></p>

<h3>** RAII</h3><p><br />
次のコードを見てくれ......<br />
<u>(kernel/sched.c)</u><br /></p><blockquote>
static void migrate_nr_uninterruptible(struct rq *rq_src)<br />
{<br />
	　　struct rq *rq_dest = cpu_rq(cpumask_any(cpu_active_mask));<br />
	　　unsigned long flags;<p>	<b>　　local_irq_save(flags);<br />
	　　double_rq_lock(rq_src, rq_dest);<br />
	</b>　　rq_dest-&gt;nr_uninterruptible += rq_src-&gt;nr_uninterruptible;<br />
	　　rq_src-&gt;nr_uninterruptible = 0;<br />
	<b>　　double_rq_unlock(rq_src, rq_dest);<br />
	　　local_irq_restore(flags);<br />
</b>}</p></blockquote>


<p>次の関数が対応し、割り込み無効化/有効化、ロック/アンロックを行う<br />
  local_irq_save/local_irq_restore<br />
  double_rq_lock/double_rq_unlock<br />
こういうセットで使う関数は、C++erとしては、RAII化せざるを得ない。<br />
コードのメンテ時に、片方の位置を変えたらもう片方の位置も変える、とかめっちゃめんどくさい</p>

<h3>** goto文</h3>
<p>
RAIIの続きになるが、件の対応する関数があると、どうしてもgoto文に頼らざるを得なくなる<br />
<u>(kernel/sched.c)<br />
</u></p><blockquote>static int init_rootdomain(struct root_domain *rd, bool bootmem)<br />
{<br />
	　　gfp_t gfp = GFP_KERNEL;<br />
	　　memset(rd, 0, sizeof(*rd));<br />
	　　if (bootmem)<br />
		　　　　gfp = GFP_NOWAIT;<p>	　　if (!alloc_cpumask_var(&amp;rd-&gt;span, gfp))<br />
		　　　　goto out;<br />
	　　if (!alloc_cpumask_var(&amp;rd-&gt;online, gfp))<br />
		　　　　goto free_span;<br />
	　　if (!alloc_cpumask_var(&amp;rd-&gt;rto_mask, gfp))<br />　　　　goto free_online;</p><p>	　　if (cpupri_init(&amp;rd-&gt;cpupri, bootmem) != 0)<br />
		　　　　goto free_rto_mask;<br />
	　　return 0;</p><p>free_rto_mask:<br />
	　　free_cpumask_var(rd-&gt;rto_mask);<br />
free_online:<br />
	　　free_cpumask_var(rd-&gt;online);<br />
free_span:<br />
	　　free_cpumask_var(rd-&gt;span);<br />
out:<br />
	　　return -ENOMEM;<br />
}</p></blockquote>


<p>やっぱしC++erとしてはgoto文を使わないで、RAIIやscope_exitで固めた状態で<br />
途中returnだよね！！！goto文に比べて、コードを目で追っかける量が減るよ！</p>

<h3>** for each</h3><p>
みんな待ってたforeach、GCC4.6で遂に実装！wktk,カーネル内には以下のような<br />
foreachがあったけど、できれば標準のを使いたいよね！<br />
<u>(mm/page_alloc.c)<br />
</u></p><blockquote>static void drain_pages(unsigned int cpu)<br />
{<br />
	　　unsigned long flags;<br />
	　　struct zone *zone;<p>	　　<b>for_each_populated_zone(zone)</b> {<br />
		　　　　struct per_cpu_pageset *pset;<br />
		　　　　struct per_cpu_pages *pcp;</p><p>　　　　local_irq_save(flags);<br />
		　　　　pset = per_cpu_ptr(zone-&gt;pageset, cpu);</p>		　　　　pcp = &amp;pset-&gt;pcp;<br />
		　　　　free_pcppages_bulk(zone, pcp-&gt;count, pcp);<br />
		　　　　pcp-&gt;count = 0;<br />
		　　　　local_irq_restore(flags);<br />
	　　}<br />
}<br /></blockquote>

<p>
他にも<br />
for_each_migratetype_order(order, ...)<br />
list_for_each(curr, ...)<br />
for_each_zone_zonelist_nodemask(zone, ...)<br />
とか。</p>

<h3>** static_assert</h3><p>
こんなコードがあった</p><p><u>(mm/slab.c)<br />
</u></p><blockquote>static __always_inline int index_of(const size_t size)<br />
{<br />　　extern void __bad_size(void);<p>	　　if (__builtin_constant_p(size)) {<br />
		　　　　int i = 0;<br />
        　　　　if (size &lt;= 32) return i;<br />
        　　　　i++;<br />
        　　　　if (size &lt;= 64) return i;<br />
        　　　　i++;<br />
        　　　　if (size &lt;= 128) return i;<br />　　　　i++;<br />
        　　　　(略)<br />
        　　　　if (size &lt;= 131072) return i;<br />
        　　　　i++;</p><p>		　　　　__bad_size();<br />　　} else {</p><p>　　　　__bad_size();</p><p>　　}<br /></p><p>　　return 0;<br />
}</p></blockquote>


<p>1. 最適化オプションをつけてコンパイル</p><p>2. __bad_size関数をわざと定義しないでおく</p><p>上記の条件を満たし、かつsizeが定数でないか131072より大きい場合は</p><p>__bad_sizeがundefined refereceとなるリンク時エラーが起きる。という関数。</p><p>当然のことながら、訓練されたC++erとしては、static_assertを使わざるを得ない</p>

<p><br />
</p><h2>* 実装 ～そして敗北へ～</h2>
<p>
とりあえずは、カーネルモジュールのキャラクタデバイスを作ってみます。<br />
具体的には、<br />
   　　cat /dev/hellocxx<br />
コマンドを打つと、<br />
   　　Hello, C++<br />
と表示させるものを。</p>

<p><br />
</p><h3>** 準備1 Makefile</h3><p>
とりあえずカーネルモジュールを作る準備をしなければいけませんね！<br />
hellocxx.c がカーネルモジュール向けにコンパイルされるMakefileになります！</p>

<blockquote><p>KERNEL_DIR = /root/linux<br />
VERBOSE = 0<br />
ARCH = x86</p><p>EXTRA_CFLAGS := -isystem $(KERNEL_DIR)/include -isystem $(KERNEL_DIR)/arch/$(ARCH)/include</p><p>obj-m := hellocxx.o<br />
CFLAGS_hellocxx.o := -x c++ -std=gnu++0x -fno-operator-names -fno-rtti -fpermissive -fno-exceptions</p><p>all:<br />
	make -C $(KERNEL_DIR) M=$(PWD) V=$(VERBOSE) modules</p></blockquote>


<p><br /></p><p>ダウンロードはこちら&gt;&gt; <a href="https://gist.github.com/760992">https://gist.github.com/760992</a></p>

<p>基本事項はぐぐってください！詳しいサイトがいっぱいあります！<br />
重要なオプション解説</p>

<p><u>*** -fpermissive</u><br />
Linuxのヘッダ内に、C++では許されないポインタ同士の変換がいっぱいあるため、<br />
そいつがエラーにならないようにするオプション。正直いきなりくじけそうだッ</p>

<p><u>*** -fno-operator-names</u><br />
andとかがC++の予約語とかぶるので、それを抑制</p>

<p><u>*** -isystem</u><br />
warningがうざすぎるので、linuxのヘッダのものに関しては全部抑制</p>

<p><u>*** -fno-exception</u><br />
例外を使おうとするとC++ランタイムが必要になるっぽくてめんどくさそうなので使わないように</p>

<p><u>*** -fno-rtti</u><br />
rttiもめんどくさそうなので切る</p>

<p><u>*** -x c++</u><br />
このソースはC++だッ</p>

<p><u>*** -std=gnu++0x</u><br />
C++0xに、gnuの拡張を入れたやつだと思う</p><p><br /></p>

<h3>** 準備2　マクロとかで置換</h3><p>
C言語用に書かれたヘッダファイルをC++で読もうとすると、いろいろ不都合があるよね！<br />
1. 予約語が.....<br />
2. 名前の修飾が.....</p>

<p>ということで、とりあえず以下のようになる</p>

<blockquote><p>extern "C" {</p><p>#define alignof alignof_REPLACED<br />
#define bool bool_REPLACED<br />
#define catch catch_REPLACED<br />
.....</p><p>#include &lt;linux/kernel.h&gt;<br /></p><p>#undef alignof<br />
#undef bool<br />
#undef catch<br />
......</p><p>}</p></blockquote>









<p>これは基本だね！</p><p>とくに凶悪だったコードはこちら</p><p><u>(include/linux/kernel.h)</u><br /></p><blockquote>/* Force a compilation error if condition is true, but also produce a<br />&nbsp;result (of value 0 and type size_t), so the expression can be used <br />e.g. in a structure initializer (or where-ever else comma expressions<br />&nbsp;aren't permitted). */<br />#define BUILD_BUG_ON_ZERO(e) (sizeof(struct { int:-!!(e); }))<br />#define BUILD_BUG_ON_NULL(e) ((void *)sizeof(struct { int:-!!(e); }))<br /></blockquote><br />コードが読めない...コメントにものすごい助けられました。で、こんな感じに適当に定義しなおす<br /><br /><blockquote>#define BUILD_BUG_ON_ZERO(e) ((size_t)0)<br />#define BUILD_BUG_ON_NULL(e) ((void*)NULL)<br /></blockquote><br />完成したファイルはこちら<br />&gt;&gt; <a href="https://gist.github.com/760993">https://gist.github.com/760993</a><br />

<p><br />
</p>


<p><br />
</p><h3>** 準備3　Linuxソース書き換え</h3><p>

</p><p>しかし、マクロ置換だけでは対応できない個所が多々あることが解ってしまった。<br />
とくに多かったのがこういうやつ</p>

<blockquote>static inline foo(int ret) <br />{
　　return (pte_t) { .pte = ret };<br />
}<br />
</blockquote>

<p>中カッコを使って構造体の右辺値を、メンバの値を設定しつつ作る奴。<br />
この書き方はC++でも採用して欲しかったなぁ。</p>

<p>そこでなんだが、どおおおおおしても僕の実力では対応しきれないため、カーネルソースの<font style="font-size: 1em;"><b><br /></b></font></p><p><font style="font-size: 1em;"><b>static inlineな関数の中身を変えるだけなら、今動いているカーネルを変更しなくてもいいはず！</b></font><br /></p><p>と踏み、書き換えに走ることにした。だいたいもうすでに#define文でlinuxのヘッダの内容はだいぶかわっちゃってるしね</p><p>まぁ、仕方がないと自分を納得させる。</p>

<p>手元のカーネルのバージョンは2.6.32、おおむね以下のような書き換えになりました</p><blockquote>-&nbsp;&nbsp; &nbsp;return (pte_t) { .pte = ret };<br />+&nbsp;&nbsp;&nbsp; {<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pte_t r = {0};<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; r.pte = ret;<br />+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return r;<br />+&nbsp;&nbsp;&nbsp; }<br /><br /></blockquote><p>まぁ、修正前と後は処理内容的には同じです。<br />
変更内容全体はこちら&gt;&gt; <a href="https://gist.github.com/761000">https://gist.github.com/761000</a><br />
</p>
<p>しかし、<u>カーネルのソースいじくった時点でもう負けているのだあおあいaoidsjjkfks('A`)......</u></p><p><br />
</p>


<p><b><u>** カーネルモジュール書きます！</u></b><br />
さっき書いたヘッダファイル、さすがにひどくてあんまり見たくないので stdafx.h (なにかとトラウマなヘッダファイル名) として分離<br />
そして、カーネルモジュール本体を書き始める。キモは次の関数</p>

<blockquote><p>static ssize_t hellocxx_read(struct file* f, char* buf, size_t count, loff_t* pos)<br />
{<br />　　if (*pos != 0) {<br />
        　　　　return 0;<br />
    　　}<br />　　char message[] = "Hello, C++\n";<br />
    　　ssize_t copy_count =<br />
        　　count &lt; sizeof(message) ? count : sizeof(message);<br />
    　　copy_to_user(buf, message, copy_count);<br />
    　　*pos += copy_count;<br />
    　　return copy_count;<br />
}</p></blockquote>

<p>ユーザーから読み込みのリクエストがあったら、"Hello, C++"という文字列を返す<br />
全体はこちら&gt;&gt; <a href="https://gist.github.com/761004">https://gist.github.com/761004</a><br />
</p>
<p><br />
</p>


<h3>* 動作確認</h3><p>
ドライバのメジャー番号は適当に204にしました。</p>



<p>おおっ、予想通り今動いてるカーネルも変更なしで動いた！</p><img alt="result.png" src="http://www.lunaport.net/blog/2010/12/31/result.png" class="mt-image-none" style="" width="730" height="256" />

<p><br />
</p>
<p><br />
</p><h3>* そして.....</h3><p>platform_device化も行けそうです！ひどいコードばかりだし、カーネルのコード変えちゃったけど、まぁ動いたから良しとしましょう。</p><p>ここまで読んでいただき、ありがとうございました！<br /></p><p>これらのファイルをまとめたモノはこちら &gt;&gt; <a href="http://dl.dropbox.com/u/458517/20101231/hellocxx.zip">http://dl.dropbox.com/u/458517/20101231/hellocxx.zip</a><br /></p>

]]>
    </content>
</entry>

<entry>
    <title>C言語ポインタの構文ェ・・・・</title>
    <link rel="alternate" type="text/html" href="http://www.lunaport.net/blog/2010/11/c-2.html" />
    <id>tag:www.lunaport.net,2010:/blog//6.28</id>

    <published>2010-11-10T08:40:25Z</published>
    <updated>2010-11-21T01:19:31Z</updated>

    <summary>最近はてなで話題になったポインタの解説を見ていて思い出した....      i...</summary>
    <author>
        <name>どようび</name>
        
    </author>
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.lunaport.net/blog/">
        <![CDATA[最近はてなで話題になったポインタの解説を見ていて思い出した....<br />

    <pre>
<span style="color: #228b22;">int</span> <span style="color: #b8860b;">a</span>;
<span style="color: #228b22;">int</span> *<span style="color: #b8860b;">b</span> = &amp;a;

<span style="color: #b22222;">/* </span><span style="color: #b22222;">&#12464;&#12525;&#12540;&#12496;&#12523;&#22793;&#25968;a&#12395;100&#12434;&#20195;&#20837; </span><span style="color: #b22222;">*/</span>
<span style="color: #228b22;">void</span> <span style="color: #0000ff;">function1</span>(<span style="color: #228b22;">void</span>) {
  a = 100;
}

<span style="color: #b22222;">/* </span><span style="color: #b22222;">&#12525;&#12540;&#12459;&#12523;&#22793;&#25968;a&#12395;100&#12434;&#20195;&#20837; </span><span style="color: #b22222;">*/</span>
<span style="color: #228b22;">void</span> <span style="color: #0000ff;">function2</span>(<span style="color: #228b22;">void</span>) {
  <span style="color: #228b22;">int</span> <span style="color: #b8860b;">a</span> = 100;
}

<span style="color: #b22222;">/* </span><span style="color: #b22222;">&#12464;&#12525;&#12540;&#12496;&#12523;&#22793;&#25968;b&#12398;&#31034;&#12377;&#20808;&#12395;100&#12434;&#20195;&#20837; </span><span style="color: #b22222;">*/</span>
<span style="color: #228b22;">void</span> <span style="color: #0000ff;">function3</span>(<span style="color: #228b22;">void</span>) {
  *b = 100;
}

<span style="color: #b22222;">/* </span><span style="color: #b22222;">&#12525;&#12540;&#12459;&#12523;&#22793;&#25968;b&#12398;&#31034;&#12377;&#20808;&#12395;100&#12434;&#20195;&#12539;&#12539;&#12539;&#20837;&#12539;&#12539;&#12539;&#65281;&#65311; </span><span style="color: #b22222;">*/</span>
<span style="color: #228b22;">void</span> <span style="color: #0000ff;">function4</span>(<span style="color: #228b22;">void</span>) {
  <span style="color: #228b22;">int</span> *<span style="color: #b8860b;">b</span> = 100;
}
</pre>

「int *b;」の書き方は、「*bはint型」という意味である、という解説がなされる<br />
しかしそれだとfunction3の「*b = 100」では逆参照が起こり、function4の「int *b = 100;」では逆参照が起きない動作には納得できない。<br />
上記解説を文字通りとれば、「int *b = 100;」は「bを逆参照したいがそれは不可能」という理由でコンパイルエラーになるべきだと思う。<br />
<br />
それに対し、「int *b;」と書いてあったら「int* b;」と脳内変換して、「bはint*型」と考える回避策がある<br />
しかしそうなると「int* a, b, c;」 みたいな宣言の説明がうまくできない。<br />
<br />
どっちに転んでもなんか変。<br />
<br />
とりあえず、完全に言いがかりだけど前者の考え方が頭がいい人達の自己満足みたいに見えて嫌なので僕は後者の書き方をいつもしてます<br />
「int* a, b, c;」の書き方は、宣言と同時の初期化ができないのでやらない<br />
<br />

<!--
なんか<a href="http://d.hatena.ne.jp/mktx/20101108">件のエントリ</a>をむきになって批判している人が数名いる・・・・<br />
ショートカットの例は正しい理解と矛盾しないし、だいたい本当に厳密にポインタ理解するには、例えばWindowsのポインタの場合、タネンバウムあたりの本と、IntelのMMUの仕様と、それとWindows Internals読んで理解してね★となってしまう。
-->
]]>
        
    </content>
</entry>

<entry>
    <title>実行ファイルの特定のセクションのエンディアンを変更する方法</title>
    <link rel="alternate" type="text/html" href="http://www.lunaport.net/blog/2010/05/post-12.html" />
    <id>tag:www.lunaport.net,2010:/blog//6.26</id>

    <published>2010-05-27T14:24:27Z</published>
    <updated>2010-05-27T14:30:25Z</updated>

    <summary> (一部フィクションです) そんなわけで、実行ファイルのグローバル変数とかが格納...</summary>
    <author>
        <name>どようび</name>
        
    </author>
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.lunaport.net/blog/">
        <![CDATA[<p><img alt="endian.gif" src="http://www.lunaport.net/blog/2010/05/27/endian.gif" width="712" height="300" class="mt-image-none" style="" /><br />
(一部フィクションです)</p>

<p>そんなわけで、実行ファイルのグローバル変数とかが格納されている、.dataセクション、.rdataセクションのエンディアンを変更したい！<br />
perlとかでがんばって書き変えるかめんどくせぇとか思ってたら、<br />
objcopyコマンドで簡単にできてしまったのでメモ<br />
<pre>gcc -c test.c -o test.o<br />
objcopy -R .data -R .rdata test.o no-data.o<br />
objcopy -R .text -R .bss --reverse-bytes=4 test.o reversed-data.o<br />
gcc reversed-data.o no-data.o -o test.exe<br />
</pre></p>

<p>test.cの内容は次のような感じであります<br />
<pre>const char test_data[] = "ABCDEFGHIJKLMN";</p>

<p>int main() {<br />
    return 0;<br />
}<br />
</pre></p>

<p>普通にコンパイルしたのと、エンディアン変換したのの比較をすると次のような具合です</p>

<p><img alt="diff.gif" src="http://www.lunaport.net/blog/2010/05/27/diff.gif" width="675" height="333" class="mt-image-none" style="" /></p>

<p><br />
え、このバイナリちゃんと実行できるのかって！？</p>

<p>実行してないからわかんないです！！！</p>

<p>件のハードウェアでは<u><strong>60%</strong></u>くらいは上手くいってます。</p>

<p><br />
今の僕にまじめに検証してる時間と精神力なんてないんです....................  orz .......<br />
.... 関係者の方々本当すんません  ..........<br />
</p>]]>
        
    </content>
</entry>

<entry>
    <title>『従来のAJAX』</title>
    <link rel="alternate" type="text/html" href="http://www.lunaport.net/blog/2010/04/ajax.html" />
    <id>tag:www.lunaport.net,2010:/blog//6.25</id>

    <published>2010-04-23T12:11:36Z</published>
    <updated>2010-04-23T12:13:49Z</updated>

    <summary>・歳をとったなと思う時 某研究会で、『従来のAJAX』なる見出しのスライドが出現...</summary>
    <author>
        <name>どようび</name>
        
    </author>
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.lunaport.net/blog/">
        <![CDATA[<p>・歳をとったなと思う時</p>

<p>某研究会で、『従来のAJAX』なる見出しのスライドが出現したとき。</p>]]>
        
    </content>
</entry>

<entry>
    <title>UNIXシェルで安全に色つき出力をする方法(追記有)</title>
    <link rel="alternate" type="text/html" href="http://www.lunaport.net/blog/2010/04/unix.html" />
    <id>tag:www.lunaport.net,2010:/blog//6.24</id>

    <published>2010-04-10T23:05:54Z</published>
    <updated>2010-08-28T10:19:51Z</updated>

    <summary>エスケープシーケンス使うとUNIXシェルからの出力に色を付けることができる でも...</summary>
    <author>
        <name>どようび</name>
        
    </author>
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.lunaport.net/blog/">
        <![CDATA[<p>エスケープシーケンス使うとUNIXシェルからの出力に色を付けることができる</p>

<p><img alt="escape_echo.PNG" src="http://www.lunaport.net/blog/2010/04/10/escape_echo.PNG" width="338" height="94" class="mt-image-none" style="" /></p>

<p>でも、こいつをファイルにリダイレクトすると、ゴミが入ってしまう</p>

<p><strong>(追記開始)</strong><br />
コメ欄より：</p>

<p>test -t 1 コマンドで、出力先が端末かそれ以外かの判断ができるので、その結果を用いてエスケープシーケンス出力の有無を判断すれば良い。</p>

<p>----- 終了 --------------------------------------------</p>

<p><strong>(追記終了)</strong></p>

<p><img alt="escape_echo_editor.PNG" src="http://www.lunaport.net/blog/2010/04/10/escape_echo_editor.PNG" width="352" height="172" class="mt-image-none" style="" /></p>

<p>で、まぁシェルスクリプトからisatty()なんて呼べねーよなーとか思ってて放置してたんだけど、GNU版grepが、パターンにマッチした文字列に色を付ける機能を持っていることが判明。--color=autoと指定すると、grepが内部で端末への出力の場合エスケープシーケンスで色を付けて、ファイルへの出力では色をつけないように設定してくれるようです。</p>

<p>bashの関数にするとこんな感じです<br />
<pre><br />
function super_echo { <br />
    echo $* | GREP_COLOR='01' grep --color=auto '.' 2> /dev/null<br />
    if [ $? -ne 0 ]; then<br />
        echo $*<br />
    fi<br />
}</p>

<p>super_echo Hello, World!<br />
</pre></p>

<p>実行結果はこんな感じです<br />
<img alt="superecho1.PNG" src="http://www.lunaport.net/blog/2010/04/10/superecho1.PNG" width="513" height="198" class="mt-image-none" style="" /></p>

<p></p>

<p>autoconfを使う場合はこんな感じです。autoconfで使う場合、どんなシェルでも動くようにしなければならないためbashの関数機能は使えないです。代わりにマクロを利用します。あと、if文でよく使う[]が、m4マクロ的な理由で使えないです。<br />
<pre><br />
AC_DEFUN([SUPER_ECHO], [<br />
    echo $1 | GREP_COLOR='01' grep --color=auto '.' 2> /dev/null<br />
    if test $? -ne 0; then<br />
        echo $1<br />
    fi<br />
])<br />
SUPER_ECHO([Hello, World!])<br />
</pre></p>

<p>実行結果はこんな感じです</p>

<p><img alt="superecho2.PNG" src="http://www.lunaport.net/blog/2010/04/10/superecho2.PNG" width="534" height="328" class="mt-image-none" style="" /></p>

<p><br />
enjoy!</p>

<p>--------<br />
autoconf 2.65（最新版）でconfigureスクリプト作った。<br />
最新版minixで実行したら、「grepが長いラインを処理できいか-eオプションが複数つかなくてnot acceptable」とかで停止した。<br />
minix...(´；ω；｀)ﾌﾞﾜｯ... パッケージisoにGNU版grepがあったので入れたら通った。</p>

<p><br />
</p>]]>
        
    </content>
</entry>

<entry>
    <title>GNUstepは地獄だぜ！フゥハハハーハァー</title>
    <link rel="alternate" type="text/html" href="http://www.lunaport.net/blog/2010/02/gnustep.html" />
    <id>tag:www.lunaport.net,2010:/blog//6.23</id>

    <published>2010-02-17T01:35:12Z</published>
    <updated>2010-02-17T01:58:10Z</updated>

    <summary>続・CocoaでN対N通信がしたい！ OSX 10.5以降なら,NSObject...</summary>
    <author>
        <name>どようび</name>
        
    </author>
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.lunaport.net/blog/">
        <![CDATA[<p>続・CocoaでN対N通信がしたい！</p>

<p>OSX 10.5以降なら,NSObjectのPerformSelector onThreadを使えばお手軽にできる.<br />
しかしGNUstepだと定義はあるんだけど動かない.</p>

<p>結局,NSPortを各スレッドで,PerformSelectorOnMainThreadでメインスレッド経由で交換してNSProxyを使って通信するに落ち着く.でもこの方法はコードが複雑になるうえに,NSProxyを経由して通信すると,通信するデータがNSDistantObjectなるものに化けるため,前者のものより若干コストがかかる気がする.</p>

<p>どうやらGNUstepのNSDistantObjectの扱いがOSXと違うか不具合があるらしい.動かない.......OSX10.3と10.5だと起きない.</p>

<p>慣れない言語の不具合報告は疲れる......<br />
<a href="http://www.lunaport.net/blog/2010/02/17/test.tar.gz">200行くらいの再現コード</a>書いて力尽きる俺......orz.....</p>]]>
        
    </content>
</entry>

<entry>
    <title>Windowsでも手軽にflymake elisp（修正版）</title>
    <link rel="alternate" type="text/html" href="http://www.lunaport.net/blog/2010/02/windowsflymake-elisp-1.html" />
    <id>tag:www.lunaport.net,2010:/blog//6.22</id>

    <published>2010-02-04T05:55:24Z</published>
    <updated>2011-05-28T14:03:04Z</updated>

    <summary>1日経過し, 昨日の記事 http://www.lunaport.net/blo...</summary>
    <author>
        <name>どようび</name>
        
    </author>
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.lunaport.net/blog/">
        <![CDATA[<p>1日経過し, 昨日の記事<br />
<a href="http://www.lunaport.net/blog/2010/02/windowsflymake-elisp.html">http://www.lunaport.net/blog/2010/02/windowsflymake-elisp.html</a><br />
がだいぶ若さゆえのあやまちだと判明してしまったので、書き直ししました.</p>

<p>1ファイルで完結して,Windows用のMeadowとかNTEmacsでも動く<br />
emacs lisp用のFlymake-modeの設定です.<br />
行っている処理は<a href="http://www.cx4a.org/blog/2009/02/flymake-for-emacs-lisp.html">本家</a>と同じです</p>

<p><font color="red">(byte-compile-file)とかやるとなんかエラーになるの修正。あと<a href="http://www.emacswiki.org/emacs/FlymakeElisp">EmacsWiki</a>に載せました<br /><br />
2011-04-29  EmacsWikiで行った変更をこっちに反映し忘れてたので反映<br /><br />
2011-05-28  コメント欄での指摘バグ修正(<a href="http://d.hatena.ne.jp/uk-ar/20110424/1303622124">http://d.hatena.ne.jp/uk-ar/20110424/1303622124</a>)<br /><br />
</font></p>

<pre>(defun flymake-elisp-init ()
  (unless (string-match "^ " (buffer-name))
    (let* ((temp-file   (flymake-init-create-temp-buffer-copy
                         'flymake-create-temp-inplace))
           (local-file  (file-relative-name
                         temp-file
                         (file-name-directory buffer-file-name))))
      (list
       (expand-file-name invocation-name invocation-directory)
       (list
        "-Q" "--batch" "--eval"
        (prin1-to-string
         (quote
          (dolist (file command-line-args-left)
            (with-temp-buffer
              (insert-file-contents file)
              (emacs-lisp-mode)
              (let ((parse-sexp-ignore-comments t))
                (condition-case data
                    (scan-sexps (point-min) (point-max))
                  (scan-error
                   (goto-char(nth 2 data))
                   (princ (format "%s:%s: error: Unmatched bracket or quote\n"
                                  file (line-number-at-pos))))))))
          )
         )
        local-file)))))
(push '("\\.el$" flymake-elisp-init) flymake-allowed-file-name-masks)
(push '("\\.emacs$" flymake-elisp-init) flymake-allowed-file-name-masks)
(add-hook 'emacs-lisp-mode-hook
          ;; workaround for (eq buffer-file-name nil)
          (function (lambda () (if buffer-file-name (flymake-mode)))))</pre>

<p>上手くいけば,次のような実行結果になります<br />
<img alt="elisplint.png" src="http://www.lunaport.net/blog/2010/02/03/elisplint.png" width="502" height="276" class="mt-image-none" style="" /></p>

<p><br />
僕がいつも使ってる設定ファイルは<a href="http://dl.dropbox.com/u/458517/.emacs">これ</a>です</p>

<p>安定してきたらemacs wikiに書く<br />
大佐は当時20歳だったことを知った.驚き.</p>]]>
        
    </content>
</entry>

<entry>
    <title>Windowsでも手軽にflymake elispを使う方法</title>
    <link rel="alternate" type="text/html" href="http://www.lunaport.net/blog/2010/02/windowsflymake-elisp.html" />
    <id>tag:www.lunaport.net,2010:/blog//6.21</id>

    <published>2010-02-03T01:13:49Z</published>
    <updated>2010-05-10T04:02:59Z</updated>

    <summary>修正版掲載しました⇒http://www.lunaport.net/blog/2...</summary>
    <author>
        <name>どようび</name>
        
    </author>
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.lunaport.net/blog/">
        <![CDATA[<p><font color="red"><b>修正版掲載しました⇒</b></font><a href="http://www.lunaport.net/blog/2010/02/windowsflymake-elisp-1.html">http://www.lunaport.net/blog/2010/02/windowsflymake-elisp-1.html</a></p>

<p><br />
----------</p>

<p></p>

<p>こちら(<a href="http://www.cx4a.org/blog/2009/02/flymake-for-emacs-lisp.html">http://www.cx4a.org/blog/2009/02/flymake-for-emacs-lisp.html</a>)に<br />
emacsのflymake-modeをemacs lispで使う方法が載っていたのですが,</p>

<p>・WindowsでMeadowだNTEmacsだを使ってるとシェルスクリプト書いたり若干設定がめんどい<br />
・全部設定まとめちゃいたい派なのでその他のファイルを作りたくない</p>

<p>なので,設定ファイルを書き加えるだけで動くようにしました.</p>

<p>やり方</p>

<p>まず、設定ファイルの先頭付近に次の行を加える.これはemacs起動時に特殊な引数を与えると,<br />
渡されたファイルの文法チェックを行うようにする設定.内容は本家そのままです.<br />
<pre>(setq elisp-lint-file-name load-file-name)<br />
(when (and<br />
       (boundp 'run-elisp-lint)<br />
       (symbol-value 'run-elisp-lint))<br />
  (dolist (file command-line-args-left)<br />
    (with-temp-buffer<br />
      (insert-file-contents file)<br />
      (condition-case data<br />
          (scan-sexps (point-min) (point-max))<br />
        (scan-error<br />
         (goto-char(nth 2 data))<br />
         (princ (format "%s:%s: error: Unmatched bracket or quote\n"<br />
                        file (line-number-at-pos))))<br />
        )<br />
      )<br />
    )<br />
  (kill-emacs)<br />
  )<br />
</pre></p>

<p><br />
次に,設定ファイルの適当な場所に次の行を加える.お好みで<br />
設定変更してください.<br />
<pre>(defun flymake-elisp-init ()<br />
  (let* ((temp-file   (flymake-init-create-temp-buffer-copy<br />
                       'flymake-create-temp-inplace))<br />
         (local-file  (file-relative-name<br />
                       temp-file<br />
                       (file-name-directory buffer-file-name))))<br />
    (list (car command-line-args)<br />
          (list<br />
           "-Q"<br />
           "--batch"<br />
           "--eval" "(setq run-elisp-lint t)"<br />
           "--load" elisp-lint-file-name<br />
           local-file)))<br />
  )<br />
(push '("\\.el$" flymake-elisp-init) flymake-allowed-file-name-masks)<br />
(push '("\\.emacs$" flymake-elisp-init) flymake-allowed-file-name-masks)<br />
(add-hook 'emacs-lisp-mode-hook 'flymake-mode)<br />
</pre></p>

<p>上手くいけば,次のような実行結果になります<br />
<img alt="elisplint.png" src="http://www.lunaport.net/blog/2010/02/03/elisplint.png" width="502" height="276" class="mt-image-none" style="" /></p>

<p><br />
とりあえず上記が動くようになってる設定ファイルは<a href="http://www.lunaport.net/blog/2010/02/03/dot.emacs">これ</a>です<br />
僕がいつも使ってる設定ファイルは<a href="http://dl.dropbox.com/u/458517/.emacs">これ</a>です</p>

<p>安定してきたらemacs wikiにも書く</p>]]>
        
    </content>
</entry>

<entry>
    <title>ソースがゴミのようだ！</title>
    <link rel="alternate" type="text/html" href="http://www.lunaport.net/blog/2010/01/post-11.html" />
    <id>tag:www.lunaport.net,2010:/blog//6.20</id>

    <published>2010-01-27T19:41:54Z</published>
    <updated>2011-01-22T04:30:04Z</updated>

    <summary>諸般の事情により、特定の条件でmfc0という命令をマクロで置換することになった ...</summary>
    <author>
        <name>どようび</name>
        
    </author>
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.lunaport.net/blog/">
        <![CDATA[<p>諸般の事情により、特定の条件でmfc0という命令をマクロで置換することになった<br />
<br />
<strong>置換前</strong><br />
</p><pre>mfc0 $26 $6
</pre>
<strong>置換後</strong><br />
<pre>.set push
.set noreorder
lui  $26, 0xb004
lw   $26, 0($26)
nop
sll	$26, 3
bltz $26, 1f
nop
mfc0 $26, $6
nop
b 2f
nop
1:     
mfc0 $26, $6
nop
nor  $26, $26, $0
sll  $26, $26, 4
srl  $26, $26, 4
nor  $26, $26, $0
sll  $26, $26, 3
srl  $26, $26, 3
2:     
.set pop
</pre>
<br />
ハハハ、ソースがｇ（ｒｙ<br />
・・・・・さっさとデータ取ろう........<br />
<br />
]]>
        
    </content>
</entry>

<entry>
    <title>IEのアドレスバーみたいなエディットボックスを作る(仮)</title>
    <link rel="alternate" type="text/html" href="http://www.lunaport.net/blog/2010/01/ie.html" />
    <id>tag:www.lunaport.net,2010:/blog//6.19</id>

    <published>2010-01-23T09:10:19Z</published>
    <updated>2010-01-23T10:03:11Z</updated>

    <summary>なんか最近氏ぬほど忙しいんだけど、息抜きは大事だよね！。 ということで、息抜きが...</summary>
    <author>
        <name>どようび</name>
        
    </author>
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.lunaport.net/blog/">
        <![CDATA[<p>なんか最近氏ぬほど忙しいんだけど、息抜きは大事だよね！。</p>

<p>ということで、息抜きがてらVista以降のInternet Explorerのアドレスバーや検索ボックスみたいな<br />
エディットボックスがごまかしまくりだができたのでメモ残しておきます。<br />
いま趣味でやってるプログラムに必要な気がするので、多分三月の半ばごろにもっとまともなものに仕上げると思う..................</p>

<p><img alt="vistaedit.png" src="http://www.lunaport.net/blog/2010/01/23/vistaedit.png" width="356" height="377" class="mt-image-none" style="" /></p>

<p>IEのアドレスバー/検索ボックスは<br />
・フォーカスが無い時はものすごい透明<br />
・カーソルがエディットボックス内にあるときは透明度が下がる<br />
・フォーカスがあるときは不透明<br />
・作る方法を昔MSDNフォーラムで聞いたけど、一発で作る方法はなさそうな雰囲気だった</p>

<p>tips<br />
・DwmEnableBlurBehindWindow状態のウィンドウのDCに普通に何か描くと勝手に透明度が決定されるっぽい<br />
・Vistaで追加されたBufferedPaintSetAlpha() APIを使うとその機能を無視できるっぽい<br />
<small>・↑の関数はメモリデバイスコンテキスト的な機能のただのラッパーらしいけどその辺の検証をする精神的余裕が無い</small><br />
・テーマAPIだとエディットボックスの周りの装飾は描画できない。多分テーマファイルからリソースを読み込んで自前で描画ということになると思う。今回はウルトラCでごまかした<br />
・WM_PRINTCLIENTを使ってるので、同じ方法でRicheditは使えない。やりたい場合はDisplayBandとかFormatRange調べるといいらしい。</p>

<p>不具合<br />
・テキスト選択時にちらつく</p>

<p>ソースはこちら<br />
<a href="http://www.lunaport.net/blog/2010/01/23/dwmtest.zip">dwmtest.zip</a></p>

<p>参考URL<br />
<a href="http://d.hatena.ne.jp/setuna-kanata/20090112/1231777971">http://d.hatena.ne.jp/setuna-kanata/20090112/1231777971</a><br />
<a href="http://weblogs.asp.net/kennykerr/archive/2007/01/23/controls-and-the-desktop-window-manager.aspx">http://weblogs.asp.net/kennykerr/archive/2007/01/23/controls-and-the-desktop-window-manager.aspx</a></p>

<p>ActiveBasicで作ってる記事を発見<br />
でもページにつながらないのであとで参考にする<br />
<a href="http://74.125.153.132/search?q=cache:jzqi8qRds8QJ:dev.activebasic.com/egtra/%3Fcat%3D21+ab+ie+%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E3%83%90%E3%83%BC+%E3%82%A8%E3%83%87%E3%82%A3%E3%83%83%E3%83%88&cd=1&hl=ja&ct=clnk&gl=jp">http://74.125.153.132/search?q=cache:jzqi8qRds8QJ:dev.activebasic.com/egtra/%3Fcat%3D21+ab+ie+%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E3%83%90%E3%83%BC+%E3%82%A8%E3%83%87%E3%82%A3%E3%83%83%E3%83%88&cd=1&hl=ja&ct=clnk&gl=jp</a><br />
</p>]]>
        
    </content>
</entry>

</feed>

