2010年03月03日

Apache 2.3/2.4系の新機能を見てみよう その3 〜MPMの動的ロード〜

register to: はてなブックマークに登録 はてなブックマーク | del.icio.usに登録 | この記事をクリップ!
Apache 2.3の特長を探る <p> さて、Apache 2.3探索シリーズの第3回になります今回、MPM(Multi-Processing Modules)に話題を移します。 </p> <p> 従来Apache 2.0/2.2ではMPMはconfigureでのオプション指定によって選択し、ビルドでスタティックリンクされます。そのため、もしMPMを変える場合はconfigureでの指定を変えてビルドする所からやり直しになります。2.3/2.4からはこれがApacheモジュールと同じようにLoadModuleディレクティブで実行時に選ぶことができるようになるそうです。 </p> <p> この仕組みを利用する為には、<a href="http://dsas.blog.klab.org/archives/51659859.html">前回</a>のビルドでのconfigureオプションに項目を1つ追加する必要があります。--enable-mpms-sharedオプションを追加し、引数にallを与えてもう一度ビルド&インストールしてみましょう。 </p> <pre class="prog"> $ configure --help ... --enable-mpms-shared=MPM-LIST Space-separated list of MPM modules to enable for dynamic loading. MPM-LIST=list | "all" ... </pre> <pre class="prog"> $ ./configure --enable-mpms-shared=all --enable-mods-shared=all \ --with-included-apr --prefix=/usr/local/app/apache-2.3.5 \ --with-mysql </pre> <p> なお、httpd本体にスタティックリンクされたモジュールは-lオプション指定での起動で確認することができますね。 </p> <pre class="prog"> $ /usr/local/app/apache-2.3.5/bin/httpd -l Compiled in modules: core.c mod_so.c http_core.c event.c ← MPM </pre> <p> たとえば、前回のビルド版のhttpdでは上記のような結果になりますが、これを今回新たに--enable-mpms-sharedオプションを追加したビルド版ですと、event MPMがスタティックリンクから外れます。 </p> <pre class="prog"> $ /usr/local/app/apache-2.3.5/bin/httpd -l Compiled in modules: core.c mod_so.c http_core.c </pre> <p> 起動にはMPMの指定が必要ですが、LoadModuleディレクティブを以下のように追加して行います。 </p> <pre class="prog"> LoadModule mpm_event_module modules/mod_mpm_event.so </pre> <p> さてこのMPM周り、どう変わったのでしょうか。2.2.14と2.3.5-alphaの間でhttpdのmain()を持つserver/main.cのdiffを取ってMPMを呼び出す箇所を検証してみましょう。 </p> <pre class="prog"> *************** *** 737,743 **** ap_run_optional_fn_retrieve(); ! if (ap_mpm_run(pconf, plog, server_conf)) break; apr_pool_lock(pconf, 0); --- 766,772 ---- ap_run_optional_fn_retrieve(); ! if (ap_run_mpm(pconf, plog, ap_server_conf) != OK) break; apr_pool_lock(pconf, 0); </pre> <p> ap_mpm_run()からap_run_mpm()へと関数名が変わったようです。 </p> <p> 2.2系ではap_mpm_run()関数が各MPMにて実装されていて、これをスタティックリンクすることでserver/main.cからMPMの処理へと移行させていました。 </p> <div>server/mpm/prefork/prefork.c (v2.2.14)</div> <pre class="prog"> 912 /***************************************************************** 913 * Executive routines. 914 */ 915 916 int ap_mpm_run(apr_pool_t *_pconf, apr_pool_t *plog, server_rec *s) 917 { 918 int index; 919 int remaining_children_to_start; 920 apr_status_t rv; 921 922 ap_log_pid(pconf, ap_pid_fname); 923 924 first_server_limit = server_limit; 925 if (changed_limit_at_restart) { 926 ap_log_error(APLOG_MARK, APLOG_WARNING, 0, s, 927 "WARNING: Attempt to change ServerLimit " 928 "ignored during restart"); 929 changed_limit_at_restart = 0; 930 } ... 1258 1259 return 0; 1260 } </pre> <p> それが2.3系ではap_run_mpm()関数に名前が変わっています。この関数名でgrepで全ソースを検索してみてもどこにも見当たりません。実は、ap_run_mpm()という関数はマクロによって生成されているので、その関数名のままではソース上から見つけることはできません。 </p> <div>include/ap_mpm.h (v2.3.5-alpha)</div> <pre class="prog"> 82 /** 83 * Pass control to the MPM for steady-state processing. It is responsible 84 * for controlling the parent and child processes. It will run until a 85 * restart/shutdown is indicated. 86 * @param pconf the configuration pool, reset before the config file is read 87 * @param plog the log pool, reset after the config file is read 88 * @param server_conf the global server config. 89 * @return DONE for shutdown OK otherwise. 90 */ 91 AP_DECLARE_HOOK(int, mpm, (apr_pool_t *pconf, apr_pool_t *plog, server_rec *server_conf)) </pre> <p> このマクロを展開するとap_run_mpm()関数と一緒にap_hook_mpm()関数も用意されます。ap_hook_...という関数名はApacheモジュールの開発経験があれば一度は目にしたことのある方ばかりかと思います。 </p> <p> お分かりのように、ap_hook_xxx()関数は各イベントフックにイベントハンドラを登録する関数です。一方ap_run_xxx()関数は、同じxxxの名前を持つイベントフックを起動する役割を持ちます。つまり、2.3系からは直接MPM内の関数をリンクしての呼び出しではなく、イベントフックの仕組みに基づいて"mpm"イベントフックを定義し、このイベントハンドラとしてMPMの処理に委譲する形をとるようになったのです。 </p> <div>server/mpm/event/event.c (v2.3.5-alpha)</div> <pre class="prog"> 2718 static void event_hooks(apr_pool_t * p) 2719 { 2720 /* Our open_logs hook function must run before the core's, or stderr 2721 * will be redirected to a file, and the messages won't print to the 2722 * console. 2723 */ 2724 static const char *const aszSucc[] = { "core.c", NULL }; 2725 one_process = 0; 2726 2727 ap_hook_open_logs(event_open_logs, NULL, aszSucc, APR_HOOK_REALLY_FIRST); 2728 /* we need to set the MPM state before other pre-config hooks use MPM query 2729 * to retrieve it, so register as REALLY_FIRST 2730 */ 2731 ap_hook_pre_config(event_pre_config, NULL, NULL, APR_HOOK_REALLY_FIRST); 2732 ap_hook_check_config(event_check_config, NULL, NULL, APR_HOOK_MIDDLE); 2733 ap_hook_mpm(event_run, NULL, NULL, APR_HOOK_MIDDLE); 2734 ap_hook_mpm_query(event_query, NULL, NULL, APR_HOOK_MIDDLE); 2735 ap_hook_mpm_note_child_killed(event_note_child_killed, NULL, NULL, APR_HOOK_MIDDLE); 2736 ap_hook_mpm_register_timed_callback(event_register_timed_callback, NULL, NULL, 2737 APR_HOOK_MIDDLE); 2738 ap_hook_mpm_get_name(event_get_name, NULL, NULL, APR_HOOK_MIDDLE); 2739 } ... 2844 module AP_MODULE_DECLARE_DATA mpm_event_module = { 2845 MPM20_MODULE_STUFF, 2846 NULL, /* hook to run before apache parses args */ 2847 NULL, /* create per-directory config structure */ 2848 NULL, /* merge per-directory config structures */ 2849 NULL, /* create per-server config structure */ 2850 NULL, /* merge per-server config structures */ 2851 event_cmds, /* command apr_table_t */ 2852 event_hooks /* register_hooks */ 2853 }; </pre> <p> event MPMの内容を見ると、AP_MODULE_DECLARE_DATA構造体mpm_event_moduleで、当モジュールが読み込まれたときに呼び出されるコールバック関数event_hooks()関数を登録しています。このevent_hooks()中で、他のApacheモジュールでも見受けられたようにap_hook_xxx()関数によってイベントフックを設定しています。その中にap_hook_mpm()関数の呼び出しもあります。 </p> <p> LoadModuleディレクティブによってこのモジュールがロードされると、即座にこのevent_hooks()関数が呼び出されます。そこでap_hook_mpm()関数によりevent_run()関数がハンドラとして登録され、ap_run_mpm()関数が呼び出された際に起動されるのです。 </p> <p> ではこのイベントフックの仕組みと言うのは、そもそもどのような実装になっているのでしょう。次回は番外編として、イベントフックの実装詳細を確認し、現行の2.2系も含めたApacheイベントフックの仕組みそのものをおさらいしていきたいと思います。上に出たap_hook_mpm()/ap_run_mpm()両関数を生成するAP_DECLARE_HOOKマクロについて、その展開の仕組みを追う所から入ります。 </p><br clear="all"></div> <a name="more"></a><div id="ad2"></div> <div class="posted">klab_gijutsu2 at 03:42│<a href="#comments">Comments(0)</a>│<a href="#trackback">TrackBack(0)</a></div> <div class="bookmarklet"> register to: <a href="http://b.hatena.ne.jp/entry/http://dsas.blog.klab.org/archives/51674138.html"><img src="http://livedoor.blogimg.jp/klab_gijutsu2/imgs/4/3/4394e58c.gif" width="16" height="12" style="border: none;" alt="はてなブックマークに登録" title="はてなブックマークに登録" /></a> | <a href="javascript:location.href='http://del.icio.us/post?v=4;url='+encodeURIComponent('http://dsas.blog.klab.org/archives/51674138.html')+';title='+encodeURIComponent('Apache 2.3/2.4系の新機能を見てみよう その3 〜MPMの動的ロード〜')"><img src="http://livedoor.blogimg.jp/klab_gijutsu2/imgs/e/f/efbd6d38.gif" style="border: none;" alt="del.icio.usに登録" title="del.icio.usに登録" width="12" height="12"></a> | <a href="http://clip.livedoor.com/redirect?link=http://dsas.blog.klab.org/archives/51674138.html&title=DSAS%B3%AB%C8%AF%BC%D4%A4%CE%C9%F4%B2%B0%20-%20Apache%202.3%2F2.4%B7%CF%A4%CE%BF%B7%B5%A1%C7%BD%A4%F2%B8%AB%A4%C6%A4%DF%A4%E8%A4%A6%20%A4%BD%A4%CE3%20%A1%C1MPM%A4%CE%C6%B0%C5%AA%A5%ED%A1%BC%A5%C9%A1%C1&ie=euc" class="ldclip-redirect" title="この記事をクリップ!"><img src="http://parts.blog.livedoor.jp/img/cmn/clip_16_16_w.gif" width="16" height="16" alt="この記事をクリップ!" style="border: none;vertical-align: top;" /></a> </div> <div class="menu"><a href="http://dsas.blog.klab.org/">このBlogのトップへ</a>│<a href="http://dsas.blog.klab.org/archives/51673435.html">前の記事</a>│<a href="http://dsas.blog.klab.org/archives/51674293.html">次の記事</a></div> </div> <div class="comblogbodybottom"></div> <div class="trackbackurltop"></div> <div class="trackbackurlbody"> <h3 class="trackbackurlttl">トラックバックURL</h3> <div class="trackbackurl"> <table cellspacing="0" cellspacing="5" border="0"> <tr> <td width="99%"><input type="text" value="http://trackback.blogsys.jp/livedoor/klab_gijutsu2/51674138" class="trackbackbox"></td> <td width="1%" align="right"><input type="button" value="クイック" onClick="quickTrackBack('http://dsas.blog.klab.org/archives/51674138.html'); return false;"></td> </tr> </table> </div> </div> <div class="trackbackurlbottom"></div> <a name="trackback"></a> <a name="comments"></a> <div class="formbodytop"></div> <div id="takecomment"> <h3 class="takecommenthead">この記事にコメントする</h3> <div id="takecommentbody"> </div> </div> <div id="formbody"> <table cellpadding="0" cellspacing="0" border="0" class="form"> <form action="http://app.blog.livedoor.jp/klab_gijutsu2/comment.cgi/51674138#errors" method="POST" name="comment_form" onSubmit="javacript:setCommentAuthor(this); return submitOnce(this.button);"> <tr> <th nowrap class="auther">名前: </th> <td colspan="3"><input id="author" name="author"></td> </tr> <tr> <th nowrap class="email">メール: </th> <td colspan="3"><input id="email" name="email" /></td> </tr> <tr> <th nowrap class="url">URL: </th> <td colspan="3"><input id="url" name="url" /></td> </tr> <tr> <td nowrap> </td> <td nowrap>情報を記憶: <input id="bake" type="checkbox" name="cookie" style="padding:0;margin:0px;" /></td> <td align="right" nowrap>評価: <select id="rank" name="rating"> <option value="">--</option> <option value="1">1(最低)</option> <option value="2">2</option> <option value="3">3</option> <option value="4">4</option> <option value="5">5(最高)</option> </select></td> <td align="right" nowrap><input type="radio" id="radio" value="face" name="rating_icon"> 顔    <input type="radio" id="radio" value="star" name="rating_icon"> 星</td> </tr> <tr> <td nowrap> </td> <td colspan="3"><a href="javascript:void(0);" id="emojiLink1" onClick="showEmojiPanel(this.id, 'text')"><img src="http://parts.blog.livedoor.jp/img/usr/cmn/tool.gif" id="tool" width="18" height="18" border="0"></a></td> </tr> <tr> <td nowrap> </td> <td colspan="3"><textarea id="text" name="body" rows="10" cols="50"></textarea><div id="emoji" style="position:absolute; background-color:#FFFFFF; left: 30px; border:1 solid #000000; margin:0 0 0 0; padding:0 0 0 0; display:none;"></div></td> </tr> <tr> <td nowrap> </td> <td colspan="3" align="center"><input type="submit" value=" 投稿する " class="button" name="button" /></td> </tr> </form> </table> </div> <div class="formbodybottom"></div> </div> <div id="articlebottom"></div> </div> <div id="blogcommentbottom"></div> </div> <div id="contentcommentbottom"></div> <!--プラグインA(左)ここから--> <div id="left"> <div id="lefttop"></div> <div id="leftbody"> <div class="plugin-recent_articles sidewrapper"> <div class="sidetitlebody"> <div class="sidetitle">最新記事</div> </div> <div class="sidetop"></div> <div class="side"> <div class="sidebody"><a href="http://dsas.blog.klab.org/archives/51776813.html">Pythonのプロファイル結果をGUIで解析する</a></div> <div class="sidebody"><a href="http://dsas.blog.klab.org/archives/51752824.html">Windows実行形式のMachineタイプを判別する方法</a></div> <div class="sidebody"><a href="http://dsas.blog.klab.org/archives/51751183.html">Twisted vs Tornado vs Go で非同期Webサーバー対決</a></div> <div class="sidebody"><a href="http://dsas.blog.klab.org/archives/51750885.html">並列1000コネクションに耐える! Ruby のイベント駆動ライブラリ Rev と EventMachine の HTTPクライアント</a></div> <div class="sidebody"><a href="http://dsas.blog.klab.org/archives/51750386.html">Windows用フリーウェア「HookDate」をバージョンアップしました</a></div> <div class="sidebody"><a href="http://dsas.blog.klab.org/archives/51742727.html">Pythonの内包表記はなぜ速い?</a></div> <div class="sidebody"><a href="http://dsas.blog.klab.org/archives/51741768.html">Apache MPMをめぐる冒険 〜eventとpreforkを比べてみるよ〜</a></div> <div class="sidebody"><a href="http://dsas.blog.klab.org/archives/51741063.html">Windows仮想プリンタプログラムを作ってみる</a></div> </div> <div class="sidebottom"></div> </div><!-- // plugin-recent_articles --> <div class="plugin-monthly sidewrapper"> <div class="sidetitlebody"> <div class="sidetitle">Archives</div> </div> <div class="sidetop"></div> <div class="side"> <div align="center"><form style="margin:0px;padding:0px;"> <select name="u" onChange="JavaScript:location.href=this.value;return false;"> <option value="http://dsas.blog.klab.org/archives/2010-08.html">2010年08月</option> <option value="http://dsas.blog.klab.org/archives/2010-06.html">2010年06月</option> <option value="http://dsas.blog.klab.org/archives/2010-05.html">2010年05月</option> <option value="http://dsas.blog.klab.org/archives/2010-04.html">2010年04月</option> <option value="http://dsas.blog.klab.org/archives/2010-03.html">2010年03月</option> <option value="http://dsas.blog.klab.org/archives/2010-02.html">2010年02月</option> <option value="http://dsas.blog.klab.org/archives/2009-12.html">2009年12月</option> <option value="http://dsas.blog.klab.org/archives/2009-10.html">2009年10月</option> <option value="http://dsas.blog.klab.org/archives/2009-09.html">2009年09月</option> <option value="http://dsas.blog.klab.org/archives/2009-08.html">2009年08月</option> <option value="http://dsas.blog.klab.org/archives/2009-07.html">2009年07月</option> <option value="http://dsas.blog.klab.org/archives/2009-06.html">2009年06月</option> <option value="http://dsas.blog.klab.org/archives/2009-05.html">2009年05月</option> <option value="http://dsas.blog.klab.org/archives/2009-03.html">2009年03月</option> <option value="http://dsas.blog.klab.org/archives/2009-02.html">2009年02月</option> <option value="http://dsas.blog.klab.org/archives/2009-01.html">2009年01月</option> <option value="http://dsas.blog.klab.org/archives/2008-12.html">2008年12月</option> <option value="http://dsas.blog.klab.org/archives/2008-11.html">2008年11月</option> <option value="http://dsas.blog.klab.org/archives/2008-10.html">2008年10月</option> <option value="http://dsas.blog.klab.org/archives/2008-09.html">2008年09月</option> <option value="http://dsas.blog.klab.org/archives/2008-08.html">2008年08月</option> <option value="http://dsas.blog.klab.org/archives/2008-07.html">2008年07月</option> <option value="http://dsas.blog.klab.org/archives/2008-06.html">2008年06月</option> <option value="http://dsas.blog.klab.org/archives/2008-05.html">2008年05月</option> <option value="http://dsas.blog.klab.org/archives/2008-04.html">2008年04月</option> <option value="http://dsas.blog.klab.org/archives/2008-03.html">2008年03月</option> <option value="http://dsas.blog.klab.org/archives/2008-02.html">2008年02月</option> <option value="http://dsas.blog.klab.org/archives/2008-01.html">2008年01月</option> <option value="http://dsas.blog.klab.org/archives/2007-12.html">2007年12月</option> <option value="http://dsas.blog.klab.org/archives/2007-11.html">2007年11月</option> <option value="http://dsas.blog.klab.org/archives/2007-10.html">2007年10月</option> <option value="http://dsas.blog.klab.org/archives/2007-09.html">2007年09月</option> <option value="http://dsas.blog.klab.org/archives/2007-08.html">2007年08月</option> <option value="http://dsas.blog.klab.org/archives/2007-07.html">2007年07月</option> <option value="http://dsas.blog.klab.org/archives/2007-06.html">2007年06月</option> <option value="http://dsas.blog.klab.org/archives/2007-05.html">2007年05月</option> <option value="http://dsas.blog.klab.org/archives/2007-04.html">2007年04月</option> <option value="http://dsas.blog.klab.org/archives/2007-03.html">2007年03月</option> <option value="http://dsas.blog.klab.org/archives/2007-02.html">2007年02月</option> <option value="http://dsas.blog.klab.org/archives/2007-01.html">2007年01月</option> <option value="http://dsas.blog.klab.org/archives/2006-12.html">2006年12月</option> <option value="http://dsas.blog.klab.org/archives/2006-11.html">2006年11月</option> <option value="http://dsas.blog.klab.org/archives/2006-10.html">2006年10月</option> <option value="http://dsas.blog.klab.org/archives/2006-09.html">2006年09月</option> <option value="http://dsas.blog.klab.org/archives/2006-08.html">2006年08月</option> <option value="http://dsas.blog.klab.org/archives/2006-07.html">2006年07月</option> <option value="http://dsas.blog.klab.org/archives/2006-06.html">2006年06月</option> <option value="http://dsas.blog.klab.org/archives/2006-05.html">2006年05月</option> <option value="http://dsas.blog.klab.org/archives/2006-04.html">2006年04月</option> <option value="http://dsas.blog.klab.org/archives/2006-03.html">2006年03月</option> </select> <input type="BUTTON" value="GO" onClick="JavaScript: location.href=this.form.u.value; return false;" /> </form></div> </div> <div class="sidebottom"></div> </div><!-- // plugin-monthly --> <div class="plugin-memo sidewrapper"> <div class="sidetitlebody"> <div class="sidetitle">このブログについて</div> </div> <div class="sidetop"></div> <div class="side"> <STRONG><a href="http://www.klab.jp/dsas/">DSAS</a></STRONG>とは、<STRONG>KLab</STRONG> が構築し運用しているコンテンツサービス用の<STRONG>Linux</STRONG>ベースのインフラです。現在4ヶ所のデータセンタにて構築し、運用していますが、我々は<STRONG><a href="http://www.klab.jp/dsas/">DSAS</a></STRONG>をより使いやすく、より安全に、そしてより省力で運用できることを目指して、日々改良に勤しんでいます。<br> このブログでは、そんな <STRONG><a href="http://www.klab.jp/dsas/">DSAS</a></STRONG> で使っている技術の紹介や、実験してみた結果の報告、トラブルに巻き込まれた時の経験談など、広く深く、色々な話題を織りまぜて紹介していきたいと思います。<br> <br> また、わたしたちが開発したソフトウエアやノウハウ、実験的なサービスを公開している、<br> <ul><li><strong><a href="http://lab.klab.org/" title="lab.klab.org - KLab技術者サイト">lab.klab.org - KLab技術者サイト</a></strong></li></ul><br> もあわせてご覧いただければと思います。(DSASブログのエントリをシリーズ別に整理した「<a href="http://lab.klab.org/modules/mediawiki/index.php/DSAS%E3%83%96%E3%83%AD%E3%82%B0%E3%81%BE%E3%81%A8%E3%82%81" title="DSASブログまとめ">DSASブログまとめ</a>」もあります)<br> </div> <div class="sidebottom"></div> </div><!-- // plugin-memo --> <div class="plugin-memo sidewrapper"> <div class="sidetitlebody"> <div class="sidetitle">KLabについて</div> </div> <div class="sidetop"></div> <div class="side"> <a href="http://www.klab.jp">KLab株式会社</a>は、携帯電話の基盤技術から各種ソリューション、コンテンツ企画など多くのサービスを提供している会社です。 <div class="sidebody"><a href="http://www.klab.jp/am/">携帯メール配信<br> [アクセルメール] </a></div> <div class="sidebody"><a href="http://www.klab.jp/p-pointer/">個人情報検出<br> [P-Pointer] </a></div> <div class="sidebody"><a href="http://www.klab.jp/qb/">携帯サイト構築<br> [Quick Builder] </a></div> <div class="sidebody"><a href="http://www.klabcareer.jp/">転職支援サービス<br> [KLabキャリア]</a></div> </div> <div class="sidebottom"></div> </div><!-- // plugin-memo --> <div class="plugin-memo sidewrapper"> <div class="sidetitlebody"> <div class="sidetitle">Blog内検索</div> </div> <div class="sidetop"></div> <div class="side"> <form id="Ssearchbox_002636582608723695274:hwhy4wacmbm" action="http://www.google.com/cse" style="margin: 0px; padding: 0pt; width: 100%;"> <input type="hidden" name="cx" value="002636582608723695274:hwhy4wacmbm" /> <input name="q" type="text" style="width: 100%;" tabindex="3"/> <input name="qenc" type="hidden" value="_"/> <input type="submit" name="sa" value="Search" tabindex="4"/> <input type="hidden" name="cof" value="FORID:0" /> <input type="hidden" name="ie" value="euc-jp" /> <input type="hidden" name="oe" value="euc-jp" /> </form> <script type="text/javascript" src="http://www.google.com/coop/cse/brand?form=Ssearchbox_002636582608723695274%3Ahwhy4wacmbm"></script> </div> <div class="sidebottom"></div> </div><!-- // plugin-memo --> <script type="text/javascript" src="http://parts.blog.livedoor.jp/plugin/ldblog_rss_plugin.js"></script> <div class="plugin-rss sidewrapper"> <div class="sidetitlebody"> <div class="sidetitle"><a href="#" id="ldb-rss-154344-title" target="_blank"> </a></div> </div> <div class="sidetop"></div> <div class="side" id="ldb-rss-154344-body"> </div> <div class="sidebottom"></div> </div> <script type="text/javascript">new ldBlogRssPlugin('http://sengoku.blog.klab.org/index.rdf', '3', '_blank', 'ldb-rss-154344');</script> <!-- // plugin-rss --> <div class="plugin-qr_code sidewrapper"> <div class="sidetitlebody"> <div class="sidetitle">QRコード</div> </div> <div class="sidetop"></div> <div class="side"> <div align="center"> <img src="http://chart.apis.google.com/chart?cht=qr&chs=123x123&chl=http%3A%2F%2Fblog.m.livedoor.jp%2Fklab_gijutsu2%2F&chld=M" width="123" height="123" border="0" alt="QRコード" /> </div> </div> <div class="sidebottom"></div> </div><!-- // plugin-qr_code --> <div class="plugin-recent_comments sidewrapper"> <div class="sidetitlebody"> <div class="sidetitle">最新コメント</div> </div> <div class="sidetop"></div> <div class="side"> <div class="sidebody"><a href="http://dsas.blog.klab.org/archives/51174693.html#comments">swfmillでFlash Lite 1のswfを扱えるようにしてみた</a> (Mon)</div> <div class="sidebody"><a href="http://dsas.blog.klab.org/archives/51741063.html#comments">Windows仮想プリンタプログラムを作ってみる</a> (tanabe)</div> <div class="sidebody"><a href="http://dsas.blog.klab.org/archives/51741063.html#comments">Windows仮想プリンタプログラムを作ってみる</a> (black)</div> <div class="sidebody"><a href="http://dsas.blog.klab.org/archives/51741063.html#comments">Windows仮想プリンタプログラムを作ってみる</a> (tanabe)</div> <div class="sidebody"><a href="http://dsas.blog.klab.org/archives/51741063.html#comments">Windows仮想プリンタプログラムを作ってみる</a> (zono)</div> <div class="sidebody"><a href="http://dsas.blog.klab.org/archives/51741063.html#comments">Windows仮想プリンタプログラムを作ってみる</a> (tanabe)</div> <div class="sidebody"><a href="http://dsas.blog.klab.org/archives/51741063.html#comments">Windows仮想プリンタプログラムを作ってみる</a> (zono)</div> <div class="sidebody"><a href="http://dsas.blog.klab.org/archives/51741063.html#comments">Windows仮想プリンタプログラムを作ってみる</a> (tanabe)</div> <div class="sidebody"><a href="http://dsas.blog.klab.org/archives/51741063.html#comments">Windows仮想プリンタプログラムを作ってみる</a> (zono)</div> <div class="sidebody"><a href="http://dsas.blog.klab.org/archives/51750885.html#comments">並列1000コネクションに耐える! Ruby のイベント駆動ライブラリ Rev と EventMachine の HTTPクライアント</a> (takada-at)</div> </div> <div class="sidebottom"></div> </div><!-- // plugin-recent_comments --> <div class="plugin-recent_track_backs sidewrapper"> <div class="sidetitlebody"> <div class="sidetitle">最新トラックバック</div> </div> <div class="sidetop"></div> <div class="side"><div class="sidebody"><a href="http://d.hatena.ne.jp/k_yamamot/20100823/1282498466" target="_blank">[MySQL]MySQLにおける10の最適化設計</a> (憂鬱なプログラマの形而上学) <br /><a href="http://dsas.blog.klab.org/archives/50860867.html">5分でできる、MySQLのメモリ関係のチューニング!</a></div><div class="sidebody"><a href="http://blog.flatlabs.net/20100727_212649/" target="_blank">MySQLの「innodb_buffer_pool_size」と「innodb_log_file_size」の設定</a> (FlatLabs Blog) <br /><a href="http://dsas.blog.klab.org/archives/50860867.html">5分でできる、MySQLのメモリ関係のチューニング!</a></div><div class="sidebody"><a href="http://www.gcd.org/blog/2010/07/609/" target="_blank">Nexus One の近接センサ/環境光センサは、どこにあるのか?調べてみた</a> (仙石浩明の日記) <br /><a href="http://dsas.blog.klab.org/archives/51165740.html">Ant とテキストエディタではじめる Android</a></div><div class="sidebody"><a href="http://life.ponpoko.tv/?p=912" target="_blank">エキスパートPythonプログラミング</a> (ぽんぽこ日記) <br /><a href="http://dsas.blog.klab.org/archives/51739566.html">「エキスパートPythonプログラミング」を翻訳しました</a></div><div class="sidebody"><a href="http://www.freia.jp/taka/blog/717" target="_blank">エキスパートPythonプログラミング</a> (清水川記) <br /><a href="http://dsas.blog.klab.org/archives/51739566.html">「エキスパートPythonプログラミング」を翻訳しました</a></div><div class="sidebody"><a href="http://hamamuratakuo.blog61.fc2.com/blog-entry-489.html" target="_blank">エキスパートPythonプログラミング</a> (浜村拓夫の世界) <br /><a href="http://dsas.blog.klab.org/archives/51739566.html">「エキスパートPythonプログラミング」を翻訳しました</a></div><div class="sidebody"><a href="http://edgeof.ddo.jp/pligg/story.php?id=189" target="_blank">こんなに簡単! Linuxでロードバランサ</a> (pligg.com) <br /><a href="http://dsas.blog.klab.org/archives/50664843.html">こんなに簡単! Linuxでロードバランサ (1)</a></div><div class="sidebody"><a href="http://www.starplatinum.jp/work/datacenter/evaluation_part2/" target="_blank">よいデータセンターとは? Part2</a> (StarPlatinum.jp) <br /><a href="http://dsas.blog.klab.org/archives/51320254.html">低温環境でのHDDの動作</a></div><div class="sidebody"><a href="http://www.starplatinum.jp/work/datacenter/evaluation_part2/" target="_blank">よいデータセンターとは? Part2</a> (StarPlatinum.jp) <br /><a href="http://dsas.blog.klab.org/archives/51320254.html">低温環境でのHDDの動作</a></div><div class="sidebody"><a href="http://www.greedy.jp/blog/nowhereman/200808/15/092005" target="_blank">「[24時間365日] サーバ/インフラを支える技術」読み終わった</a> (Greedy) <br /><a href="http://dsas.blog.klab.org/archives/51299954.html">サーバ/インフラTech Meetingの報告+資料を公開します</a></div> </div> <div class="sidebottom"></div> </div><!-- // plugin-recent_track_backs --> </div> <div id="leftbottom"></div> </div> <br clear="all"> <!--プラグインA(左)ここまで--> </div><!-- End of wrapper--> <!--プラグインB(右)ここから--> <div id="right"> <div id="righttop"></div> <div id="rightbody"> <div class="elsehead"></div> <div class="elsebottom"></div> </div> <div id="rightbottom"></div> </div> <br clear="all"> </div> <div id="footer"></div> </div> <div id="outfooter"></div> <script type="text/javascript" language="javascript"> <!-- loadCommentAuthor(document.comment_form); //--> </script> </body> </html>