<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	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/"
	>

<channel>
	<title>小惡魔 - 電腦技術 - 生活日記 - 美食介紹 - AppleBOY &#187; Linux</title>
	<atom:link href="http://blog.wu-boy.com/category/%e9%9b%bb%e8%85%a6%e6%8a%80%e8%a1%93/linux/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.wu-boy.com</link>
	<description>介紹一堆美食日記，生活日記，電腦筆記</description>
	<lastBuildDate>Tue, 27 Jul 2010 14:04:30 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>[Kernel Driver] 撰寫簡易 Timer 機制</title>
		<link>http://blog.wu-boy.com/2010/07/27/2303/</link>
		<comments>http://blog.wu-boy.com/2010/07/27/2303/#comments</comments>
		<pubDate>Tue, 27 Jul 2010 14:04:30 +0000</pubDate>
		<dc:creator>appleboy</dc:creator>
				<category><![CDATA[Driver]]></category>
		<category><![CDATA[Kernel]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[Linux Kernel]]></category>

		<guid isPermaLink="false">http://blog.wu-boy.com/?p=2303</guid>
		<description><![CDATA[在底層 Linux Kernel 提供了時序(timing)機制，方便驅動程式設計者所使用，核心是依據硬體發出的『計時器中斷』來追蹤時間的流動狀況。我們可以依據 HZ 的值來設計 Delay 機制，讓驅動程式可以每隔固定一段時間啟動或者是發出訊號，也可以利用 Timer 來讓 LED 閃爍變化，在介紹 Timer API 之前，可以先參考 Linux Kernel: 簡介HZ, tick and jiffies 這篇文章，瞭解一些相關名詞，舉例：如果想知道一秒後的 jiffies 時間，可以寫成底下：
<span class="readmore"><a href="http://blog.wu-boy.com/2010/07/27/2303/" title="[Kernel Driver] 撰寫簡易 Timer 機制" target="_blank">...詳全文（共1659字）</a></span>]]></description>
			<content:encoded><![CDATA[<p>在底層 Linux Kernel 提供了時序(timing)機制，方便驅動程式設計者所使用，核心是依據硬體發出的『計時器中斷』來追蹤時間的流動狀況。我們可以依據 HZ 的值來設計 Delay 機制，讓驅動程式可以每隔固定一段時間啟動或者是發出訊號，也可以利用 Timer 來讓 LED 閃爍變化，在介紹 Timer API 之前，可以先參考 <a href="http://adrianhuang.blogspot.com/2007/10/linux-kernel-hz-tick-and-jiffies.html">Linux Kernel: 簡介HZ, tick and jiffies</a> 這篇文章，瞭解一些相關名詞，舉例：如果想知道一秒後的 jiffies 時間，可以寫成底下：</p>
<div class="codecolorer-container c " style="overflow:auto;white-space:nowrap;width:580px"><div class="c codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="co2">#ifdef CONFIG_BMA150_TIMER</span><br />
<span class="co2">#include &lt;linux/timer.h&gt;</span><br />
<span class="co2">#endif</span><br />
j <span class="sy0">=</span> jiffies<span class="sy0">;</span><br />
<span class="coMULTI">/* 一秒之後 */</span><br />
stamp_1 <span class="sy0">=</span> j <span class="sy0">+</span> HZ<span class="sy0">;</span><br />
<span class="coMULTI">/* 半秒之後 */</span><br />
stamp_1 <span class="sy0">=</span> j <span class="sy0">+</span> HZ<span class="sy0">/</span><span class="nu0">2</span><span class="sy0">;</span> <br />
<span class="coMULTI">/* 20秒之後 */</span><br />
stamp_1 <span class="sy0">=</span> j <span class="sy0">+</span> <span class="nu0">20</span><span class="sy0">*</span>HZ<span class="sy0">;</span></div></div>
<h3>Timer API 用法</h3>
<p>筆記一下自己在寫 BOSCH Sensortec 三軸加速偵測器(BMA150 Sensor) Driver 的時候，遇到底層要回報 input event X,Y,Z 到 <a href="http://code.google.com/intl/zh-TW/android/">Android</a> HAL(<a href="http://en.wikipedia.org/wiki/Hardware_abstraction_layer">Hardware abstraction layer</a>)，所以利用 Timer 的機制定時 report 給 Android。</p>
<p>首先宣告：</p>
<div class="codecolorer-container c " style="overflow:auto;white-space:nowrap;width:580px"><div class="c codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="co2">#ifdef CONFIG_BMA150_TIMER</span><br />
<span class="co2">#include &lt;linux/timer.h&gt;</span><br />
<span class="co2">#endif</span><br />
<span class="coMULTI">/* 定義 timer_list struct */</span><br />
<span class="co2">#ifdef CONFIG_BMA150_TIMER</span><br />
<span class="kw4">struct</span> timer_list bma150_report_timer<span class="sy0">;</span><br />
<span class="co2">#endif</span></div></div>
<p>在 Driver 內的 bma150_probe 裡面 call function:</p>
<div class="codecolorer-container c " style="overflow:auto;white-space:nowrap;width:580px"><div class="c codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="co2">#ifdef CONFIG_BMA150_TIMER</span><br />
&nbsp; bma150_init_timer<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="co2">#endif</span></div></div>
<p>撰寫 bma150_init_timer 函式：</p>
<div class="codecolorer-container c " style="overflow:auto;white-space:nowrap;width:580px"><div class="c codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="co2">#ifdef CONFIG_BMA150_TIMER</span><br />
<span class="kw4">static</span> <span class="kw4">void</span> bma150_init_timer<span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span><br />
<span class="br0">&#123;</span> &nbsp;<br />
&nbsp; D<span class="br0">&#40;</span><span class="st0">&quot;BMA150 init_timer start<span class="es1">\n</span>&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <span class="coMULTI">/* Timer 初始化 */</span><br />
&nbsp; init_timer<span class="br0">&#40;</span><span class="sy0">&amp;</span>bma150_report_timer<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <span class="coMULTI">/* 定義 timer 所執行之函式 */</span><br />
&nbsp; bma150_report_timer.<span class="kw2">function</span> <span class="sy0">=</span> bma150_report<span class="sy0">;</span><br />
&nbsp; <span class="coMULTI">/* 定義 timer 傳入函式之 Data */</span><br />
&nbsp; bma150_report_timer.<span class="me1">data</span> <span class="sy0">=</span> <span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw4">unsigned</span> <span class="kw4">long</span><span class="br0">&#41;</span> <span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <span class="coMULTI">/* 定義 timer Delay 時間 */</span><br />
&nbsp; bma150_report_timer.<span class="me1">expires</span> <span class="sy0">=</span> jiffies <span class="sy0">+</span> BMA150_REPORT_DELAY_1<span class="sy0">;</span><br />
&nbsp; <span class="coMULTI">/* 啟動 Timer*/</span><br />
&nbsp; add_timer<span class="br0">&#40;</span><span class="sy0">&amp;</span>bma150_report_timer<span class="br0">&#41;</span><span class="sy0">;</span> <br />
<span class="br0">&#125;</span><br />
<span class="co2">#endif</span></div></div>
<p>上述 add_timer 執行之後，會在一秒後執行 bma150_report 函式，執行之後就會停止，所以如果要一直產生迴圈，就必須在 bma150_report 裡面繼續加入 add_timer，改寫如下：</p>
<div class="codecolorer-container c " style="overflow:auto;white-space:nowrap;width:580px"><div class="c codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw4">static</span> <span class="kw4">int</span> bma150_report<span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; D<span class="br0">&#40;</span><span class="st0">&quot;appleboy: test timer. <span class="es1">\n</span>&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="co2">#ifdef CONFIG_BMA150_TIMER</span><br />
&nbsp; bma150_report_timer.<span class="me1">expires</span> <span class="sy0">=</span> jiffies <span class="sy0">+</span> BMA150_REPORT_DELAY_2<span class="sy0">;</span><br />
&nbsp; add_timer<span class="br0">&#40;</span><span class="sy0">&amp;</span>bma150_report_timer<span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="co2">#endif </span><br />
&nbsp; <span class="kw1">return</span> <span class="nu0">0</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span></div></div>
<p>我們可以重新定義 expires 時間 <span style="color:green">jiffies + BMA150_REPORT_DELAY_2</span>，就可以一直循環了，要離開 Timer 可以在最後加入 <span style="color:green">deltimer(&#038;bma150_report_timer)</span>，最後就完成簡易的 Timer 功能。</p>
<p>參考：<br />
<a href="http://dragli.blogspot.com/2008/12/addtimer.html">add_timer的使用方法</a><br />
<a href="http://adrianhuang.blogspot.com/2007/10/linux-kernel-hz-tick-and-jiffies.html">Linux Kernel: 簡介HZ, tick and jiffies</a></p>
<h3>Related View</h3><ul class="related_post"><li><a href="http://blog.wu-boy.com/2010/05/28/2165/" title="[Linux Kernel] built-in vs. module">[Linux Kernel] built-in vs. module (3)</a></li><li><a href="http://blog.wu-boy.com/2010/07/25/2296/" title="[Linux Kernel] 簡單 hello world: License and Module 介紹(part 3)">[Linux Kernel] 簡單 hello world: License and Module 介紹(part 3) (0)</a></li><li><a href="http://blog.wu-boy.com/2010/07/21/2280/" title="[Linux Kernel] 撰寫 Hello, World module: The __init and __exit Macros (part 2).">[Linux Kernel] 撰寫 Hello, World module: The __init and __exit Macros (part 2). (1)</a></li><li><a href="http://blog.wu-boy.com/2010/06/21/2231/" title="[Linux Kernel] 撰寫簡單 Hello, World module (part 1).">[Linux Kernel] 撰寫簡單 Hello, World module (part 1). (0)</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://blog.wu-boy.com/2010/07/27/2303/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[Linux Kernel] 簡單 hello world: License and Module 介紹(part 3)</title>
		<link>http://blog.wu-boy.com/2010/07/25/2296/</link>
		<comments>http://blog.wu-boy.com/2010/07/25/2296/#comments</comments>
		<pubDate>Sun, 25 Jul 2010 08:17:52 +0000</pubDate>
		<dc:creator>appleboy</dc:creator>
				<category><![CDATA[Kernel]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[Driver]]></category>
		<category><![CDATA[Linux Kernel]]></category>

		<guid isPermaLink="false">http://blog.wu-boy.com/?p=2296</guid>
		<description><![CDATA[在 Kernel 2.4 或以上版本，在編譯模組完成，要進行 load module 之前，你會發現底下訊息：
# insmod hello-3.o
Warning: loading hello-3.o will taint the kernel: no license
<span class="readmore"><a href="http://blog.wu-boy.com/2010/07/25/2296/" title="[Linux Kernel] 簡單 hello world: License and Module 介紹(part 3)" target="_blank">...詳全文（共2142字）</a></span>]]></description>
			<content:encoded><![CDATA[<p>在 Kernel 2.4 或以上版本，在編譯模組完成，要進行 load module 之前，你會發現底下訊息：</p>
<div class="codecolorer-container bash " style="overflow:auto;white-space:nowrap;width:580px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="co0"># insmod hello-3.o</span><br />
Warning: loading hello-3.o will taint the kernel: no license<br />
&nbsp; See http:<span class="sy0">//</span>www.tux.org<span class="sy0">/</span>lkml<span class="sy0">/</span><span class="co0">#export-tainted for information about tainted modules</span></div></div>
<p>很顯然這訊息是要您在 kernel module 裡面加上版權宣告，例如：&#8221;GPL&#8221;，&#8221;GPL v2&#8243;…等來宣告您的 module 並非 open source，利用 <strong><span style="color:green">MODULE_LICENSE()</span></strong> 巨集來宣告程式 License，同樣的，可以用 <strong><span style="color:green">MODULE_DESCRIPTION()</span></strong> 來描述此模組或者是 Driver 的功用跟簡介，以及用 <strong><span style="color:green">MODULE_AUTHOR()</span></strong> 來定義此模組作者，這些巨集都可以在 <span style="color:red">linux/module.h</span> 裡找到，但是這些並非用於 Kernel 本身，如果大家想看範例程式，可以到 <span style="color:red">drivers</span>/ 資料夾底下觀看每一個 Driver 程式，底下是簡單 hello world 範例：</p>
<div class="codecolorer-container c " style="overflow:auto;white-space:nowrap;width:580px"><div class="c codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="co2">#include &lt;linux/kernel.h&gt; /* pr_info所需 include 檔案*/</span><br />
<span class="co2">#include &lt;linux/init.h&gt;</span><br />
<span class="co2">#include &lt;linux/module.h&gt; /* 所有 module 巨集需要檔案*/</span><br />
<span class="co2">#include &lt;linux/version.h&gt;</span><br />
<br />
<span class="kw4">static</span> <span class="kw4">int</span> __init hello_init<span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; pr_info<span class="br0">&#40;</span><span class="st0">&quot;Hello, world appleboy<span class="es1">\n</span>&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; pr_info<span class="br0">&#40;</span><span class="st0">&quot;The process is <span class="es1">\&quot;</span>%s<span class="es1">\&quot;</span> (pid %i)<span class="es1">\n</span>&quot;</span><span class="sy0">,</span> current<span class="sy0">-&gt;</span>comm<span class="sy0">,</span> current<span class="sy0">-&gt;</span>pid<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">0</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="kw4">static</span> <span class="kw4">void</span> __exit hello_exit<span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; printk<span class="br0">&#40;</span>KERN_INFO <span class="st0">&quot;Goodbye<span class="es1">\n</span>&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
MODULE_DESCRIPTION<span class="br0">&#40;</span><span class="st0">&quot;Hello World !!&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><span class="coMULTI">/* 此程式介紹與描述*/</span><br />
MODULE_AUTHOR<span class="br0">&#40;</span><span class="st0">&quot;Bo-Yi Wu &lt;appleboy.tw AT gmail.com&gt;&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><span class="coMULTI">/* 此程式作者*/</span><br />
MODULE_LICENSE<span class="br0">&#40;</span><span class="st0">&quot;GPL&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><span class="coMULTI">/* 程式 License*/</span><br />
module_init<span class="br0">&#40;</span>hello_init<span class="br0">&#41;</span><span class="sy0">;</span><br />
module_exit<span class="br0">&#40;</span>hello_exit<span class="br0">&#41;</span><span class="sy0">;</span></div></div>
<p>在 linux/module.h 裡頭，可以找到 MODULE_LICENSE 可定義的 License</p>
<div class="codecolorer-container c " style="overflow:auto;white-space:nowrap;width:580px"><div class="c codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="coMULTI">/*<br />
&nbsp;* The following license idents are currently accepted as indicating free<br />
&nbsp;* software modules<br />
&nbsp;*<br />
&nbsp;*&nbsp; &quot;GPL&quot; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [GNU Public License v2 or later]<br />
&nbsp;*&nbsp; &quot;GPL v2&quot;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [GNU Public License v2]<br />
&nbsp;*&nbsp; &quot;GPL and additional rights&quot; [GNU Public License v2 rights and more]<br />
&nbsp;*&nbsp; &quot;Dual BSD/GPL&quot;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [GNU Public License v2<br />
&nbsp;*&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;or BSD license choice]<br />
&nbsp;*&nbsp; &quot;Dual MIT/GPL&quot;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [GNU Public License v2<br />
&nbsp;*&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;or MIT license choice]<br />
&nbsp;*&nbsp; &quot;Dual MPL/GPL&quot;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [GNU Public License v2<br />
&nbsp;*&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;or Mozilla license choice]<br />
&nbsp;*<br />
&nbsp;* The following other idents are available<br />
&nbsp;*<br />
&nbsp;*&nbsp; &quot;Proprietary&quot; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [Non free products]<br />
&nbsp;*<br />
&nbsp;* There are dual licensed components, but when running with Linux it is the<br />
&nbsp;* GPL that is relevant so this is a non issue. Similarly LGPL linked with GPL<br />
&nbsp;* is a GPL combined work.<br />
&nbsp;*<br />
&nbsp;* This exists for several reasons<br />
&nbsp;* 1. &nbsp; So modinfo can show license info for users wanting to vet their setup <br />
&nbsp;*&nbsp; is free<br />
&nbsp;* 2. &nbsp; So the community can ignore bug reports including proprietary modules<br />
&nbsp;* 3. &nbsp; So vendors can do likewise based on their own policies<br />
&nbsp;*/</span></div></div>
<p>巨集 define:</p>
<div class="codecolorer-container c " style="overflow:auto;white-space:nowrap;width:580px"><div class="c codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="co2">#define MODULE_LICENSE(_license) MODULE_INFO(license, _license)</span><br />
<br />
<span class="coMULTI">/*<br />
&nbsp;* Author(s), use &quot;Name &lt;email&gt;&quot; or just &quot;Name&quot;, for multiple<br />
&nbsp;* authors use multiple MODULE_AUTHOR() statements/lines.<br />
&nbsp;*/</span><br />
<span class="co2">#define MODULE_AUTHOR(_author) MODULE_INFO(author, _author)</span><br />
<br />
<span class="coMULTI">/* What your module does. */</span><br />
<span class="co2">#define MODULE_DESCRIPTION(_description) MODULE_INFO(description, _description)</span></div></div>
<h3>Related View</h3><ul class="related_post"><li><a href="http://blog.wu-boy.com/2010/07/27/2303/" title="[Kernel Driver] 撰寫簡易 Timer 機制">[Kernel Driver] 撰寫簡易 Timer 機制 (1)</a></li><li><a href="http://blog.wu-boy.com/2010/07/21/2280/" title="[Linux Kernel] 撰寫 Hello, World module: The __init and __exit Macros (part 2).">[Linux Kernel] 撰寫 Hello, World module: The __init and __exit Macros (part 2). (1)</a></li><li><a href="http://blog.wu-boy.com/2010/06/21/2231/" title="[Linux Kernel] 撰寫簡單 Hello, World module (part 1).">[Linux Kernel] 撰寫簡單 Hello, World module (part 1). (0)</a></li><li><a href="http://blog.wu-boy.com/2010/05/28/2165/" title="[Linux Kernel] built-in vs. module">[Linux Kernel] built-in vs. module (3)</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://blog.wu-boy.com/2010/07/25/2296/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Linux Kernel] 撰寫 Hello, World module: The __init and __exit Macros (part 2).</title>
		<link>http://blog.wu-boy.com/2010/07/21/2280/</link>
		<comments>http://blog.wu-boy.com/2010/07/21/2280/#comments</comments>
		<pubDate>Tue, 20 Jul 2010 16:04:16 +0000</pubDate>
		<dc:creator>appleboy</dc:creator>
				<category><![CDATA[Kernel]]></category>
		<category><![CDATA[Driver]]></category>
		<category><![CDATA[Linux Kernel]]></category>

		<guid isPermaLink="false">http://blog.wu-boy.com/?p=2280</guid>
		<description><![CDATA[再看此篇之前，可以先閱讀作者先前寫的：『[Linux Kernel Driver] 撰寫簡單 Hello, World module (part 1).』，今天要介紹 Driver 的 init module 區別，在 Kernel 2.4 版本，您可以自行定義 init 跟 cleanup 函式，他們不再被個別稱為 init_module() 和 cleanup_module()，現在都使用 module_init() 和 module_exit() 兩大巨集，這兩函式被定義在 linux/init.h 檔案裡面，所以在寫程式務必將其 include 喔，另外一個核心模組(MODULE_LICENSE)，用於讓核心知道此模組遵守自由授權條款，若沒這項宣告，核心會跟您抱怨的喔，底下為範例：
<span class="readmore"><a href="http://blog.wu-boy.com/2010/07/21/2280/" title="[Linux Kernel] 撰寫 Hello, World module: The __init and __exit Macros (part 2)." target="_blank">...詳全文（共1766字）</a></span>]]></description>
			<content:encoded><![CDATA[<p>再看此篇之前，可以先閱讀作者先前寫的：『[<a href="http://blog.wu-boy.com/2010/06/21/2231/">Linux Kernel Driver] 撰寫簡單 Hello, World module (part 1).</a>』，今天要介紹 Driver 的 init module 區別，在 Kernel 2.4 版本，您可以自行定義 init 跟 cleanup 函式，他們不再被個別稱為 <span style="color:green">init_module()</span> 和 <span style="color:green">cleanup_module()</span>，現在都使用 <span style="color:green"><strong>module_init()</strong></span> 和 <span style="color:green"><strong>module_exit()</strong></span> 兩大巨集，這兩函式被定義在 <span style="color:red">linux/init.h</span> 檔案裡面，所以在寫程式務必將其 include 喔，另外一個核心模組(MODULE_LICENSE)，用於讓核心知道此模組遵守自由授權條款，若沒這項宣告，核心會跟您抱怨的喔，底下為範例：</p>
<div class="codecolorer-container c " style="overflow:auto;white-space:nowrap;width:580px"><div class="c codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="co2">#include &lt;linux/kernel.h&gt; /* pr_info所需 include 檔案*/</span><br />
<span class="co2">#include &lt;linux/init.h&gt;</span><br />
<span class="co2">#include &lt;linux/module.h&gt; /* 所有 module 需要檔案*/</span><br />
<span class="co2">#include &lt;linux/version.h&gt;</span><br />
<br />
MODULE_DESCRIPTION<span class="br0">&#40;</span><span class="st0">&quot;Hello World !!&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
MODULE_AUTHOR<span class="br0">&#40;</span><span class="st0">&quot;Bo-Yi Wu &lt;appleboy.tw AT gmail.com&gt;&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
MODULE_LICENSE<span class="br0">&#40;</span><span class="st0">&quot;GPL&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<span class="kw4">static</span> <span class="kw4">int</span> __init hello_init<span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; pr_info<span class="br0">&#40;</span><span class="st0">&quot;Hello, world appleboy<span class="es1">\n</span>&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; pr_info<span class="br0">&#40;</span><span class="st0">&quot;The process is <span class="es1">\&quot;</span>%s<span class="es1">\&quot;</span> (pid %i)<span class="es1">\n</span>&quot;</span><span class="sy0">,</span> current<span class="sy0">-&gt;</span>comm<span class="sy0">,</span> current<span class="sy0">-&gt;</span>pid<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">0</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="kw4">static</span> <span class="kw4">void</span> __exit hello_exit<span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; printk<span class="br0">&#40;</span>KERN_INFO <span class="st0">&quot;Goodbye<span class="es1">\n</span>&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
module_init<span class="br0">&#40;</span>hello_init<span class="br0">&#41;</span><span class="sy0">;</span><br />
module_exit<span class="br0">&#40;</span>hello_exit<span class="br0">&#41;</span><span class="sy0">;</span></div></div>
<p>編譯過程，可以自行修改 Makefile，可以打開 <span style="color:green">kernel/android-2.6.29/drivers/i2c/chips/Makefile</span> 參考範例，您會發現很多類似底下寫法：</p>
<div class="codecolorer-container bash " style="overflow:auto;white-space:nowrap;width:580px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace">obj-$<span class="br0">&#40;</span>CONFIG_TWL4030_POWEROFF<span class="br0">&#41;</span> &nbsp;+= twl4030-poweroff.o<br />
obj-$<span class="br0">&#40;</span>CONFIG_TWL4030_MADC<span class="br0">&#41;</span> &nbsp;+= twl4030-madc.o<br />
obj-$<span class="br0">&#40;</span>CONFIG_RTC_X1205_I2C<span class="br0">&#41;</span> += x1205.o<br />
obj-$<span class="br0">&#40;</span>CONFIG_SENSORS_BOSCH_BMA150<span class="br0">&#41;</span> &nbsp;+= bma150.o</div></div>
<p>如果要編譯成 module 可以設定成 <span style="color:green">obj-m += bma150.o</span>，編譯到 Kernel image，則會寫成 <span style="color:green">obj-y += bma150.o</span>，然而 $(CONFIG_SENSORS_BOSCH_BMA150) 是從 <strong>make menuconfig</strong> 設定，當然為什麼 menuconfig 會出現此設定，那就要從 <span style="color:green">kernel/android-2.6.29/drivers/i2c/chips/Kconfig</span> 裡面加入 <span style="color:green">CONFIG_SENSORS_BOSCH_BMA150</span> 設定， 選好之後，觀看 Kernel 資料夾底下的 .config 內容，看到 <span style="color:green"><strong>CONFIG_SENSORS_BOSCH_BMA150=y</strong></span>，這樣就正確了。</p>
<h3>What is different of <strong>__init</strong> and <strong>__exit</strong>?</h3>
<p>在寫 G-Senser Driver 時候，您會發現 static int <span style="color:red">__init</span> BMA150_init(void) 跟 static void <span style="color:red">__exit</span> BMA150_exit(void)，跟平常寫 C 語言宣告函式不一樣吧，這兩個巨集分別有不同意義喔，當然也可以將 span style=&#8221;color:red&#8221;>__init</span> 跟 <span style="color:red">__exit</span> 拿掉，這不會影響 Driver 的編譯，但是會影響記憶體的優化，Driver 啟動時會呼叫 BMA150_init 函式，如果有加上 <span style="color:red">__init</span>，當此 init function 執行完，會將記憶體 Release 給系統，這是針對 built-in 的方式才適用，如果是編譯成模組方式，則不會有此功能，然而 <span style="color:red">__exit</span> 是 Driver 結束後會呼叫的 function，但是跟 __init 剛好功能相反，在 built-in 的 Kernel 映像檔並不會執行到 __exit，編譯成模組才會有釋放記憶體效果，這兩巨集可以參考 <span style="color:green">linux/init.h</span> 檔案。</p>
<h3>Related View</h3><ul class="related_post"><li><a href="http://blog.wu-boy.com/2010/07/27/2303/" title="[Kernel Driver] 撰寫簡易 Timer 機制">[Kernel Driver] 撰寫簡易 Timer 機制 (1)</a></li><li><a href="http://blog.wu-boy.com/2010/07/25/2296/" title="[Linux Kernel] 簡單 hello world: License and Module 介紹(part 3)">[Linux Kernel] 簡單 hello world: License and Module 介紹(part 3) (0)</a></li><li><a href="http://blog.wu-boy.com/2010/06/21/2231/" title="[Linux Kernel] 撰寫簡單 Hello, World module (part 1).">[Linux Kernel] 撰寫簡單 Hello, World module (part 1). (0)</a></li><li><a href="http://blog.wu-boy.com/2010/05/28/2165/" title="[Linux Kernel] built-in vs. module">[Linux Kernel] built-in vs. module (3)</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://blog.wu-boy.com/2010/07/21/2280/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>ProFTPD UseEncoding 繁體中文亂碼解決 Localization</title>
		<link>http://blog.wu-boy.com/2010/07/07/2276/</link>
		<comments>http://blog.wu-boy.com/2010/07/07/2276/#comments</comments>
		<pubDate>Wed, 07 Jul 2010 08:07:13 +0000</pubDate>
		<dc:creator>appleboy</dc:creator>
				<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[proftpd]]></category>

		<guid isPermaLink="false">http://blog.wu-boy.com/?p=2276</guid>
		<description><![CDATA[ProFTPD 一直都是我最喜歡使用的 FTP 伺服器，設定方式簡單淺顯易懂，最近在用 PSPad 寫程式，發現使用內建 FTP 功能時候，連不上 FreeBSD 架設的 ProFTPD，連線過程出現許多亂碼，所以造成 PSPad 斷線出現錯誤，解決方式就是利用 mod_lang 模組，設定 UseEncoding 讓系統可以顯示 Big5 中文編碼，FreeBSD Ports 請勾選
<span class="readmore"><a href="http://blog.wu-boy.com/2010/07/07/2276/" title="ProFTPD UseEncoding 繁體中文亂碼解決 Localization" target="_blank">...詳全文（共618字）</a></span>]]></description>
			<content:encoded><![CDATA[<p><img src="http://farm5.static.flickr.com/4096/4770121725_6a997912c6_o.png" alt="Proftpd" /><br />
<a href="http://www.proftpd.org/">ProFTPD</a> 一直都是我最喜歡使用的 FTP 伺服器，設定方式簡單淺顯易懂，最近在用 <a href="http://www.pspad.com/">PSPad</a> 寫程式，發現使用內建 FTP 功能時候，連不上 <a href="http://www.freebsd.org">FreeBSD</a> 架設的 ProFTPD，連線過程出現許多亂碼，所以造成 PSPad 斷線出現錯誤，解決方式就是利用 <a href="http://www.proftpd.org/docs/modules/mod_lang.html">mod_lang</a> 模組，設定 <a href="http://www.proftpd.org/docs/modules/mod_lang.html#UseEncoding">UseEncoding</a> 讓系統可以顯示 Big5 中文編碼，FreeBSD Ports 請勾選</p>
<div class="codecolorer-container bash " style="overflow:auto;white-space:nowrap;width:580px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="br0">&#91;</span>X<span class="br0">&#93;</span> NLSUOTA Use nls <span class="br0">&#40;</span>builds mod_lang<span class="br0">&#41;</span></div></div>
<p>自行編譯請按照底下步驟</p>
<div class="codecolorer-container bash " style="overflow:auto;white-space:nowrap;width:580px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace">.<span class="sy0">/</span>configure <span class="re5">--enable-nls</span><br />
<span class="kw2">make</span><br />
<span class="kw2">make</span> <span class="kw2">install</span></div></div>
<h3>UseEncoding 設定</h3>
<div class="codecolorer-container bash " style="overflow:auto;white-space:nowrap;width:580px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace">Syntax: UseEncoding on<span class="sy0">|</span>off<span class="sy0">|</span>local-charset client-charset<br />
Default: None<br />
Context: <span class="st0">&quot;server config&quot;</span>, <span class="sy0">&lt;</span>VirtualHost<span class="sy0">&gt;</span>, <span class="sy0">&lt;</span>Global<span class="sy0">&gt;</span><br />
Module: mod_lang<br />
Compatibility: 1.3.2rc1</div></div>
<p>在 1.3.2rc1 版本之後才有支援，請複製底下設定，貼到 proftpd.conf</p>
<div class="codecolorer-container bash " style="overflow:auto;white-space:nowrap;width:580px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="co0"># 简体中文環境</span><br />
UseEncoding UTF-<span class="nu0">8</span> GBK<br />
<span class="co0"># 繁体中文環境</span><br />
UseEncoding UTF-<span class="nu0">8</span> Big5</div></div>
<p>Reference:<br />
<a href="http://www.proftpd.org/docs/modules/mod_lang.html">ProFTPD module mod_lang</a><br />
<a href="http://wanglq.blog.51cto.com/783560/340741">centos上解決proftp中文亂碼問題</a></p>
<h3>Related View</h3><ul class="related_post"><li><a href="http://blog.wu-boy.com/2010/06/23/2240/" title="[FreeBSD] update apache -> 2.2.15, PHP -> 5.3.2, and MySQL downgrade to 5.1.9">[FreeBSD] update apache -> 2.2.15, PHP -> 5.3.2, and MySQL downgrade to 5.1.9 (0)</a></li><li><a href="http://blog.wu-boy.com/2010/03/26/2087/" title="Apache 取得透過 Reverse Proxy (Varnish) 的 Client 真正 IP (mod_rpaf)">Apache 取得透過 Reverse Proxy (Varnish) 的 Client 真正 IP (mod_rpaf) (0)</a></li><li><a href="http://blog.wu-boy.com/2010/03/16/2050/" title="[Vim] 想套用 *.php syntax 顏色於 *.ros">[Vim] 想套用 *.php syntax 顏色於 *.ros (0)</a></li><li><a href="http://blog.wu-boy.com/2010/03/11/2041/" title="[FreeBSD] DenyHosts 設定在 hosts.allow 注意事項">[FreeBSD] DenyHosts 設定在 hosts.allow 注意事項 (0)</a></li><li><a href="http://blog.wu-boy.com/2010/01/08/1950/" title="[FreeBSD] Fanout and Fanterm Tool to run commands on multiple machines">[FreeBSD] Fanout and Fanterm Tool to run commands on multiple machines (0)</a></li><li><a href="http://blog.wu-boy.com/2009/12/29/1918/" title="[Git] how to remove file and commit from history(如何移除 commit 歷史紀錄)">[Git] how to remove file and commit from history(如何移除 commit 歷史紀錄) (0)</a></li><li><a href="http://blog.wu-boy.com/2009/12/12/1901/" title="[UNIX] Vim 命令圖解說明">[UNIX] Vim 命令圖解說明 (0)</a></li><li><a href="http://blog.wu-boy.com/2009/12/10/1894/" title="[FreeBSD] freebsd kernel: fxp0: link state changed to DOWN / UP">[FreeBSD] freebsd kernel: fxp0: link state changed to DOWN / UP (0)</a></li><li><a href="http://blog.wu-boy.com/2009/11/18/1843/" title="[FreeBSD] port committer 快速建立 pkg-plist">[FreeBSD] port committer 快速建立 pkg-plist (1)</a></li><li><a href="http://blog.wu-boy.com/2009/11/03/1781/" title="[Perl&#038;PHP] time() and Class::Date 日期轉換運算">[Perl&#038;PHP] time() and Class::Date 日期轉換運算 (1)</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://blog.wu-boy.com/2010/07/07/2276/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Linux Kernel] 撰寫簡單 Hello, World module (part 1).</title>
		<link>http://blog.wu-boy.com/2010/06/21/2231/</link>
		<comments>http://blog.wu-boy.com/2010/06/21/2231/#comments</comments>
		<pubDate>Mon, 21 Jun 2010 09:36:10 +0000</pubDate>
		<dc:creator>appleboy</dc:creator>
				<category><![CDATA[Kernel]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Driver]]></category>
		<category><![CDATA[Linux Kernel]]></category>

		<guid isPermaLink="false">http://blog.wu-boy.com/?p=2231</guid>
		<description><![CDATA[來筆記如何在 Kernel 撰寫 hello world! module，在 Ubuntu Kernel 2.6.31-14 環境下撰寫，其實不難啦，首先先進入 Kernel 目錄，請在 /usr/src 底下看自己的系統版本，或者是利用 uname -r 來知道 Kernel 版本，底下是在 Ubuntu Kernel 2.6.31-14 Kernel 實做：
<span class="readmore"><a href="http://blog.wu-boy.com/2010/06/21/2231/" title="[Linux Kernel] 撰寫簡單 Hello, World module (part 1)." target="_blank">...詳全文（共1118字）</a></span>]]></description>
			<content:encoded><![CDATA[<p>來筆記如何在 Kernel 撰寫 hello world! module，在 Ubuntu Kernel 2.6.31-14 環境下撰寫，其實不難啦，首先先進入 Kernel 目錄，請在 <span style="color:green">/usr/src</span> 底下看自己的系統版本，或者是利用 <span style="color:green">uname -r</span> 來知道 Kernel 版本，底下是在 Ubuntu Kernel 2.6.31-14 Kernel 實做：</p>
<h3>進入 Kernel 目錄</h3>
<div class="codecolorer-container bash " style="overflow:auto;white-space:nowrap;width:580px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="co0">#</span><br />
<span class="co0"># cd Kernel directory</span><br />
<span class="co0">#</span><br />
<span class="kw3">cd</span> <span class="sy0">/</span>usr<span class="sy0">/</span>src<span class="sy0">/</span>linux-headers-2.6.31-<span class="nu0">14</span>-generic-pae</div></div>
<h3>建立 hello 目錄</h3>
<div class="codecolorer-container bash " style="overflow:auto;white-space:nowrap;width:580px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="co0">#</span><br />
<span class="co0"># mkdir directory</span><br />
<span class="co0">#</span><br />
<span class="kw2">mkdir</span> hello</div></div>
<h3>建立 Makfile 以及 hello.c</h3>
<p>hello.c:</p>
<div class="codecolorer-container c " style="overflow:auto;white-space:nowrap;width:580px"><div class="c codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="co2">#include &lt;linux/kernel.h&gt; /* pr_info 所需 include 檔案*/</span><br />
<span class="co2">#include &lt;linux/init.h&gt;</span><br />
<span class="co2">#include &lt;linux/module.h&gt; /* 所有 module 需要檔案*/</span><br />
<span class="co2">#include &lt;linux/version.h&gt;</span><br />
<br />
MODULE_DESCRIPTION<span class="br0">&#40;</span><span class="st0">&quot;Hello World !!&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
MODULE_AUTHOR<span class="br0">&#40;</span><span class="st0">&quot;Bo-Yi Wu &lt;appleboy.tw AT gmail.com&gt;&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
MODULE_LICENSE<span class="br0">&#40;</span><span class="st0">&quot;GPL&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<span class="kw4">static</span> <span class="kw4">int</span> __init hello_init<span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; pr_info<span class="br0">&#40;</span><span class="st0">&quot;Hello, world<span class="es1">\n</span>&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; pr_info<span class="br0">&#40;</span><span class="st0">&quot;The process is <span class="es1">\&quot;</span>%s<span class="es1">\&quot;</span> (pid %i)<span class="es1">\n</span>&quot;</span><span class="sy0">,</span> current<span class="sy0">-&gt;</span>comm<span class="sy0">,</span> current<span class="sy0">-&gt;</span>pid<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">0</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="kw4">static</span> <span class="kw4">void</span> __exit hello_exit<span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; printk<span class="br0">&#40;</span>KERN_INFO <span class="st0">&quot;Goodbye<span class="es1">\n</span>&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
module_init<span class="br0">&#40;</span>hello_init<span class="br0">&#41;</span><span class="sy0">;</span><br />
module_exit<span class="br0">&#40;</span>hello_exit<span class="br0">&#41;</span><span class="sy0">;</span></div></div>
<p>Makefile:</p>
<div class="codecolorer-container bash " style="overflow:auto;white-space:nowrap;width:580px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="co0">#</span><br />
<span class="co0"># Makefile by appleboy &lt;appleboy.tw AT gmail.com&gt;</span><br />
<span class="co0">#</span><br />
obj-m &nbsp; &nbsp; &nbsp; += hello.o<br />
KVERSION := $<span class="br0">&#40;</span>shell <span class="kw2">uname</span> -r<span class="br0">&#41;</span><br />
<br />
all:<br />
&nbsp; &nbsp; $<span class="br0">&#40;</span>MAKE<span class="br0">&#41;</span> <span class="re5">-C</span> <span class="sy0">/</span>lib<span class="sy0">/</span>modules<span class="sy0">/</span>$<span class="br0">&#40;</span>KVERSION<span class="br0">&#41;</span><span class="sy0">/</span>build <span class="re2">M</span>=$<span class="br0">&#40;</span>PWD<span class="br0">&#41;</span> modules<br />
<br />
clean:<br />
&nbsp; &nbsp; $<span class="br0">&#40;</span>MAKE<span class="br0">&#41;</span> <span class="re5">-C</span> <span class="sy0">/</span>lib<span class="sy0">/</span>modules<span class="sy0">/</span>$<span class="br0">&#40;</span>KVERSION<span class="br0">&#41;</span><span class="sy0">/</span>build <span class="re2">M</span>=$<span class="br0">&#40;</span>PWD<span class="br0">&#41;</span> clean</div></div>
<p>之後只要切換到 hello 目錄，直接打 make 就可以產生出 hello.ko 檔案，直接載入 hello.ko 方式：</p>
<div class="codecolorer-container bash " style="overflow:auto;white-space:nowrap;width:580px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace">insmod .<span class="sy0">/</span>hello.ko</div></div>
<p>移除 hello.ko</p>
<div class="codecolorer-container bash " style="overflow:auto;white-space:nowrap;width:580px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace">rmmod .<span class="sy0">/</span>hello.ko</div></div>
<p>之後到 /var/log/message 底下就可以看到訊息：<br />
<a href="http://www.flickr.com/photos/appleboy/4719816041/" title="Flickr 上 appleboy46 的 Kernel Hello World"><img src="http://farm5.static.flickr.com/4068/4719816041_ffa47ac6d5.jpg" width="500" height="136" alt="Kernel Hello World" /></a></p>
<h3>Related View</h3><ul class="related_post"><li><a href="http://blog.wu-boy.com/2010/07/27/2303/" title="[Kernel Driver] 撰寫簡易 Timer 機制">[Kernel Driver] 撰寫簡易 Timer 機制 (1)</a></li><li><a href="http://blog.wu-boy.com/2010/07/25/2296/" title="[Linux Kernel] 簡單 hello world: License and Module 介紹(part 3)">[Linux Kernel] 簡單 hello world: License and Module 介紹(part 3) (0)</a></li><li><a href="http://blog.wu-boy.com/2010/07/21/2280/" title="[Linux Kernel] 撰寫 Hello, World module: The __init and __exit Macros (part 2).">[Linux Kernel] 撰寫 Hello, World module: The __init and __exit Macros (part 2). (1)</a></li><li><a href="http://blog.wu-boy.com/2010/05/28/2165/" title="[Linux Kernel] built-in vs. module">[Linux Kernel] built-in vs. module (3)</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://blog.wu-boy.com/2010/06/21/2231/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Linux Kernel] built-in vs. module</title>
		<link>http://blog.wu-boy.com/2010/05/28/2165/</link>
		<comments>http://blog.wu-boy.com/2010/05/28/2165/#comments</comments>
		<pubDate>Fri, 28 May 2010 14:36:43 +0000</pubDate>
		<dc:creator>appleboy</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Kernel]]></category>
		<category><![CDATA[Driver]]></category>
		<category><![CDATA[Linux Kernel]]></category>

		<guid isPermaLink="false">http://blog.wu-boy.com/?p=2165</guid>
		<description><![CDATA[在編譯 Android Linux Kernel 2.6.29 Driver，常常遇到該把 Driver 用 built-in 或者是編譯成 module 呢？這其實看人習慣，就跟問你編輯器是用 Vim 或者是 emacs 是同樣意思，這兩者是有很大的差異，built-in 用在開機自動讀取載入，所以直接編譯成 uImage 檔案給嵌入式系統，像是 SCSI 或者是 SATA Driver 都建議編譯成 built-in 的方式，反而是一些音效驅動程式，可以編譯成 module，NTFS 就是可以編譯成 module，等您需要的時候在動態載入就可以，這樣可以減少 Kernel Image 的使用空間。
<span class="readmore"><a href="http://blog.wu-boy.com/2010/05/28/2165/" title="[Linux Kernel] built-in vs. module" target="_blank">...詳全文（共462字）</a></span>]]></description>
			<content:encoded><![CDATA[<p>在編譯 <a href="http://code.google.com/android/">Android</a> Linux Kernel 2.6.29 Driver，常常遇到該把 Driver 用 built-in 或者是編譯成 module 呢？這其實看人習慣，就跟問你編輯器是用 <a href="http://www.vim.org/">Vim</a> 或者是 <a href="http://www.gnu.org/software/emacs/">emacs</a> 是同樣意思，這兩者是有很大的差異，built-in 用在開機自動讀取載入，所以直接編譯成 uImage 檔案給嵌入式系統，像是 SCSI 或者是 SATA Driver 都建議編譯成 built-in 的方式，反而是一些音效驅動程式，可以編譯成 module，NTFS 就是可以編譯成 module，等您需要的時候在動態載入就可以，這樣可以減少 Kernel Image 的使用空間。</p>
<p>如果不想用 built-in 編譯，開機又需要驅動程式，那就需要透過 initrd 方式來啟動。底下整理兩者差異：</p>
<h3>built-in：</h3>
<blockquote><p>開機自動載入，不可移除<br />
Linux Kernel Image 大<br />
需要重新 Compile</p></blockquote>
<h3>module：</h3>
<blockquote><p>可動態載入<br />
Linux Kernel Image 小<br />
不需要重新 Compile</p></blockquote>
<p>reference:<br />
<a href="http://www.mail-archive.com/gentoo-user@gentoo.org/msg09418.html">[gentoo-user] kernel: built-in vs. module</a></p>
<h3>Related View</h3><ul class="related_post"><li><a href="http://blog.wu-boy.com/2010/07/27/2303/" title="[Kernel Driver] 撰寫簡易 Timer 機制">[Kernel Driver] 撰寫簡易 Timer 機制 (1)</a></li><li><a href="http://blog.wu-boy.com/2010/07/25/2296/" title="[Linux Kernel] 簡單 hello world: License and Module 介紹(part 3)">[Linux Kernel] 簡單 hello world: License and Module 介紹(part 3) (0)</a></li><li><a href="http://blog.wu-boy.com/2010/07/21/2280/" title="[Linux Kernel] 撰寫 Hello, World module: The __init and __exit Macros (part 2).">[Linux Kernel] 撰寫 Hello, World module: The __init and __exit Macros (part 2). (1)</a></li><li><a href="http://blog.wu-boy.com/2010/06/21/2231/" title="[Linux Kernel] 撰寫簡單 Hello, World module (part 1).">[Linux Kernel] 撰寫簡單 Hello, World module (part 1). (0)</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://blog.wu-boy.com/2010/05/28/2165/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Apache 取得透過 Reverse Proxy (Varnish) 的 Client 真正 IP (mod_rpaf)</title>
		<link>http://blog.wu-boy.com/2010/03/26/2087/</link>
		<comments>http://blog.wu-boy.com/2010/03/26/2087/#comments</comments>
		<pubDate>Thu, 25 Mar 2010 17:21:51 +0000</pubDate>
		<dc:creator>appleboy</dc:creator>
				<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[mod_rpaf]]></category>
		<category><![CDATA[Varnish]]></category>

		<guid isPermaLink="false">http://blog.wu-boy.com/?p=2087</guid>
		<description><![CDATA[之前介紹 [FreeBSD]high performance caching reverse proxy: Varnish (安裝架設篇) 來當 Web 前端 Reverse Proxy，也有 load balance 的功能，不過碰到這樣的環境，後端 Apache Server 只會抓到 Reverse Proxy IP 來當作 log 紀錄，而無法正確取得 Client 端 IP，Varnish 官網 FAQ 有提到 log 檔案得的解決方法，不過在程式方面，要大量的修改，假設今天 Apache 跑10個 Virtual Host ，不就要去改10個網站程式，背後或許是一些大型 open source 的 Project，改起來相當不容易，也很費工夫。Darkhero 提供了 reverse proxy add forward module for Apache (mod_rpaf) 模組，只要裝上這模組，Apache 就不必動到其它設定就可以正確紀錄 log 檔案，且程式都不必修改，就可以得到正確 IP 了。
<span class="readmore"><a href="http://blog.wu-boy.com/2010/03/26/2087/" title="Apache 取得透過 Reverse Proxy (Varnish) 的 Client 真正 IP (mod_rpaf)" target="_blank">...詳全文（共740字）</a></span>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.flickr.com/photos/appleboy/4462939520/" title="Flickr 上 appleboy46 的 feather"><img src="http://farm3.static.flickr.com/2705/4462939520_26be3f6fa9_o.gif" width="356" height="107" alt="feather" /></a><br />
之前介紹 <a href="http://blog.wu-boy.com/2010/03/21/2054/">[FreeBSD]high performance caching reverse proxy: Varnish (安裝架設篇)</a> 來當 Web 前端 <a href="http://en.wikipedia.org/wiki/Reverse_proxy">Reverse Proxy</a>，也有 <a href="http://en.wikipedia.org/wiki/Load_balancing_(computing)">load balance</a> 的功能，不過碰到這樣的環境，後端 <a href="http://www.apache.org/">Apache</a> Server 只會抓到 Reverse Proxy IP 來當作 log 紀錄，而無法正確取得 Client 端 IP，<a href="http://varnish-cache.org/">Varnish</a> 官網 <a href="http://varnish-cache.org/wiki/FAQ">FAQ</a> 有提到 log 檔案得的解決方法，不過在程式方面，要大量的修改，假設今天 Apache 跑10個 <a href="http://httpd.apache.org/docs/2.0/vhosts/examples.html">Virtual Host</a> ，不就要去改10個網站程式，背後或許是一些大型 open source 的 Project，改起來相當不容易，也很費工夫。<a href="http://blog.darkhero.net/">Darkhero</a> 提供了 <a href="http://stderr.net/apache/rpaf/">reverse proxy add forward module for Apache (mod_rpaf)</a> 模組，只要裝上這模組，Apache 就不必動到其它設定就可以正確紀錄 log 檔案，且程式都不必修改，就可以得到正確 IP 了。</p>
<p>FreeBSD Ports 安裝方式：</p>
<div class="codecolorer-container bash " style="overflow:auto;white-space:nowrap;width:580px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw3">cd</span> <span class="sy0">/</span>usr<span class="sy0">/</span>ports<span class="sy0">/</span>www<span class="sy0">/</span>mod_rpaf2<span class="sy0">/</span><br />
<span class="kw2">make</span> <span class="kw2">install</span> clean</div></div>
<p>修改 httpd.conf (FreeBSD: /usr/local/etc/apache22/httpd.conf)</p>
<div class="codecolorer-container bash " style="overflow:auto;white-space:nowrap;width:580px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace">LoadModule rpaf_module &nbsp; &nbsp; &nbsp; &nbsp;libexec<span class="sy0">/</span>apache22<span class="sy0">/</span>mod_rpaf.so</div></div>
<p>將上面 unmask，最後面加上：</p>
<div class="codecolorer-container bash " style="overflow:auto;white-space:nowrap;width:580px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace">RPAFenable On<br />
RPAFsethostname On<br />
RPAFproxy_ips xxx.xxx.xxx.xxx 127.0.0.1<br />
RPAFheader X-Forwarded-For</div></div>
<h3>Related View</h3><ul class="related_post"><li><a href="http://blog.wu-boy.com/2010/06/23/2240/" title="[FreeBSD] update apache -> 2.2.15, PHP -> 5.3.2, and MySQL downgrade to 5.1.9">[FreeBSD] update apache -> 2.2.15, PHP -> 5.3.2, and MySQL downgrade to 5.1.9 (0)</a></li><li><a href="http://blog.wu-boy.com/2010/03/21/2054/" title="[FreeBSD]high performance caching reverse proxy: Varnish (安裝架設篇)">[FreeBSD]high performance caching reverse proxy: Varnish (安裝架設篇) (8)</a></li><li><a href="http://blog.wu-boy.com/2008/09/13/388/" title="[FreeBSD]安裝 apache2 (worker) + PHP5.2.6 + mod_fastcgi + php5-fcgi">[FreeBSD]安裝 apache2 (worker) + PHP5.2.6 + mod_fastcgi + php5-fcgi (3)</a></li><li><a href="http://blog.wu-boy.com/2008/07/10/291/" title="[FreeBSD] Lighttpd + PHP + mod_proxy + FastCGI">[FreeBSD] Lighttpd + PHP + mod_proxy + FastCGI (1)</a></li><li><a href="http://blog.wu-boy.com/2008/07/01/286/" title="[FreeBSD]Apache 噴出 signal Segmentation fault (11)">[FreeBSD]Apache 噴出 signal Segmentation fault (11) (1)</a></li><li><a href="http://blog.wu-boy.com/2008/06/23/283/" title="[FreeBSD &#038; Linux]網站分流：簡易架設 HAProxy 伺服器">[FreeBSD &#038; Linux]網站分流：簡易架設 HAProxy 伺服器 (1)</a></li><li><a href="http://blog.wu-boy.com/2008/06/05/275/" title="[FreeBSD] 安裝 PHP APC 加速網頁速度">[FreeBSD] 安裝 PHP APC 加速網頁速度 (2)</a></li><li><a href="http://blog.wu-boy.com/2007/01/22/64/" title="[apache] mod cband 頻寬限制">[apache] mod cband 頻寬限制 (3)</a></li><li><a href="http://blog.wu-boy.com/2010/07/07/2276/" title="ProFTPD UseEncoding 繁體中文亂碼解決 Localization">ProFTPD UseEncoding 繁體中文亂碼解決 Localization (0)</a></li><li><a href="http://blog.wu-boy.com/2010/03/16/2050/" title="[Vim] 想套用 *.php syntax 顏色於 *.ros">[Vim] 想套用 *.php syntax 顏色於 *.ros (0)</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://blog.wu-boy.com/2010/03/26/2087/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[FreeBSD]high performance caching reverse proxy: Varnish (安裝架設篇)</title>
		<link>http://blog.wu-boy.com/2010/03/21/2054/</link>
		<comments>http://blog.wu-boy.com/2010/03/21/2054/#comments</comments>
		<pubDate>Sat, 20 Mar 2010 16:12:44 +0000</pubDate>
		<dc:creator>appleboy</dc:creator>
				<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Network]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[www]]></category>
		<category><![CDATA[生活日記]]></category>
		<category><![CDATA[HAProxy]]></category>
		<category><![CDATA[Squid]]></category>
		<category><![CDATA[Varnish]]></category>

		<guid isPermaLink="false">http://blog.wu-boy.com/?p=2054</guid>
		<description><![CDATA[在上禮拜跟 DarkHero 兄聊到 How To Build a Scalable Web Site (3/6) 的上課講義，互相討論了 MySQL Load balance 以及 http reverse proxy 的方式，以前自己有用 HAProxy 當作 Web 平衡負載，順便紀錄了 HAProxy FreeBSD 安裝方式，這次要來介紹今天重點：Varnish Cache Server，在近幾年流行的 Caching 機制，大家會想到 Squid，只要您設定良好的 Squid 參數，它一定運作的非常穩定，然而它的核心依然是 forward proxy，要架設成 Reverse Proxy 還必需要設定一些參數才可以達到，是有一定的困難性，然而 Varnish Cache Server 底層就是高效能 caching reverse proxy，也因為 Squid 是 1980 年發展出來的，程式架構過於老舊，可以參考 ArchitectNotes 瞭解這部份詳情。也許您會問到 Varnish 可以架設成  forward proxy 嗎？答案是可以的，但是您也許不會這麼做，因為它需要 DNS 技術，以及需要一個非常大且複雜的 Varnish VCL(Varnish Configuration Language) file。
<span class="readmore"><a href="http://blog.wu-boy.com/2010/03/21/2054/" title="[FreeBSD]high performance caching reverse proxy: Varnish (安裝架設篇)" target="_blank">...詳全文（共3029字）</a></span>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.flickr.com/photos/appleboy/4445679996/" title="Flickr 上 appleboy46 的 varnish-logo-red-64"><img src="http://farm3.static.flickr.com/2695/4445679996_0a9d597a94_o.gif" width="235" height="64" alt="varnish-logo-red-64" /></a><br />
在上禮拜跟 <a href="http://blog.darkhero.net">DarkHero</a> 兄聊到 <a href="http://blog.darkhero.net/?p=391">How To Build a Scalable Web Site (3/6)</a> 的上課講義，互相討論了 MySQL Load balance 以及 http <a href="http://en.wikipedia.org/wiki/Reverse_proxy">reverse proxy</a> 的方式，以前自己有用 <a href="http://haproxy.1wt.eu/">HAProxy</a> 當作 Web 平衡負載，順便紀錄了 <a href="http://blog.wu-boy.com/2008/06/23/283/">HAProxy FreeBSD 安裝方式</a>，這次要來介紹今天重點：<a href="http://varnish-cache.org/">Varnish Cache Server</a>，在近幾年流行的 Caching 機制，大家會想到 Squid，只要您設定良好的 Squid 參數，它一定運作的非常穩定，然而它的核心依然是 forward proxy，要架設成 Reverse Proxy 還必需要設定一些參數才可以達到，是有一定的困難性，然而 Varnish Cache Server 底層就是高效能 caching reverse proxy，也因為 Squid 是 1980 年發展出來的，程式架構過於老舊，可以參考 <a href="http://varnish-cache.org/wiki/ArchitectNotes">ArchitectNotes</a> 瞭解這部份詳情。也許您會問到 Varnish 可以架設成  forward proxy 嗎？答案是可以的，但是您也許不會這麼做，因為它需要 DNS 技術，以及需要一個非常大且複雜的 Varnish VCL(Varnish Configuration Language) file。</p>
<p>1. 今天要介紹如何在 FreeBSD 系統安裝，在介紹之前，系統必須先安裝好 apache，這樣才可以正確啟動，利用 ports 安裝：</p>
<div class="codecolorer-container bash " style="overflow:auto;white-space:nowrap;width:580px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw3">cd</span> <span class="sy0">/</span>usr<span class="sy0">/</span>ports<span class="sy0">/</span>www<span class="sy0">/</span>varnish<span class="sy0">/</span><br />
<span class="kw2">make</span> <span class="kw2">install</span> clean</div></div>
<p>2. 修改 /etc/rc.conf</p>
<div class="codecolorer-container bash " style="overflow:auto;white-space:nowrap;width:580px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="co0"># varnishd</span><br />
<span class="re2">varnishd_enable</span>=<span class="st0">&quot;YES&quot;</span><br />
<span class="re2">varnishd_listen</span>=<span class="st0">&quot;:80&quot;</span><br />
<span class="re2">varnishd_admin</span>=<span class="st0">&quot;:81&quot;</span><br />
<span class="re2">varnishd_backend</span>=<span class="st0">&quot;:5566&quot;</span><br />
<span class="re2">varnishd_config</span>=<span class="st0">&quot;/usr/local/etc/varnish/default.vcl&quot;</span></div></div>
<p>上面設定意思是說 Varnish listen on port 80，傳送 traffic 到後端 5566 port，管理連接埠是 81，也可以使用指令方式：</p>
<div class="codecolorer-container bash " style="overflow:auto;white-space:nowrap;width:580px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace">varnishd <span class="re5">-a</span> :<span class="nu0">80</span> <span class="re5">-b</span> localhost:<span class="nu0">8080</span> <span class="re5">-T</span> localhost:<span class="nu0">6082</span></div></div>
<blockquote><p>Varnishd listen on port 80，and forwarding traffic to a web server listen on localhost port 8080. It also turns on the management interface on port 6082.</p></blockquote>
<p>3. 修改 default.vcl (Varnish Configuration Language)<br />
VCL 檔案告訴 Varnishd 正確的處理每個 request processing，包含在接受到 request 之前所處理的行為 vcl_recv()，另外還有 vcl_hit()、vcl_miss() 等&#8230;，都是用來處理 cache 如果存在或者是不存在時的情境 request。FreeBSD 預設放在 <span style="color:green">/usr/local/etc/varnish/default.vcl</span>。打開此檔案，您會看到：</p>
<div class="codecolorer-container bash " style="overflow:auto;white-space:nowrap;width:580px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace">backend default <span class="br0">&#123;</span><br />
&nbsp; &nbsp;.host = <span class="st0">&quot;127.0.0.1&quot;</span>;<br />
&nbsp; &nbsp;.port = <span class="st0">&quot;80&quot;</span>;<br />
<span class="br0">&#125;</span></div></div>
<p>您只要把 host = &#8220;127.0.0.1&#8243; 改成你後端要連接的 ip 或者是 host，這樣 Varnish 會 forward traffic 到您的 web server。接下來只要啟動 apache 跟 Varnish 就算是初步架設完成。</p>
<div class="codecolorer-container bash " style="overflow:auto;white-space:nowrap;width:580px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="sy0">/</span>usr<span class="sy0">/</span><span class="kw3">local</span><span class="sy0">/</span>etc<span class="sy0">/</span>rc.d<span class="sy0">/</span>apache22 restart<br />
<span class="sy0">/</span>usr<span class="sy0">/</span><span class="kw3">local</span><span class="sy0">/</span>etc<span class="sy0">/</span>rc.d<span class="sy0">/</span>varnishd restart</div></div>
<p><a href="http://www.flickr.com/photos/appleboy/4448204616/" title="Flickr 上 appleboy46 的 Varnish_01"><img src="http://farm3.static.flickr.com/2726/4448204616_8668e2d8b3.jpg" width="500" height="170" alt="Varnish_01" /></a><br />
大家可以看到 61.*.*.* 連到本機 80 port，接下來 Varnish 在開啟隨機 57475 port 連接到 Web Server 5566 port。</p>
<p><strong>Q:如何讓 apache 紀錄正確的 Client IP 到 log 檔案呢？</strong><br />
1. 打開 Vcl config 檔案，寫入<br />
Varnish configuration:</p>
<div class="codecolorer-container bash " style="overflow:auto;white-space:nowrap;width:580px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace">sub vcl_recv <span class="br0">&#123;</span><br />
&nbsp; <span class="co0"># Add a unique header containing the client address</span><br />
&nbsp; remove req.http.X-Forwarded-For;<br />
&nbsp; <span class="kw1">set</span> &nbsp; &nbsp;req.http.X-Forwarded-For = client.ip;<br />
&nbsp; <span class="co0"># [...]</span><br />
<span class="br0">&#125;</span></div></div>
<p>2. 開啟 apache httpd.conf 加入此行：</p>
<div class="codecolorer-container bash " style="overflow:auto;white-space:nowrap;width:580px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace">LogFormat <span class="st0">&quot;%{X-Forwarded-For}i %l %u %t <span class="es1">\&quot;</span>%r<span class="es1">\&quot;</span> %&gt;s %b <span class="es1">\&quot;</span>%{Referer}i<span class="es1">\&quot;</span> <span class="es1">\&quot;</span>%{User-Agent}i<span class="es1">\&quot;</span>&quot;</span> varnishcombined</div></div>
<p><a href="http://www.flickr.com/photos/appleboy/4448227216/" title="Flickr 上 appleboy46 的 Varnish_02"><img src="http://farm3.static.flickr.com/2694/4448227216_99663d5959.jpg" width="500" height="156" alt="Varnish_02" /></a></p>
<p><strong>Q:如何讓 PHP 程式紀錄正確的 Client IP？</strong><br />
可以參考底下程式碼就可以完全抓到 Proxy 後面真正使用者IP，否則您的 Web 只會抓到 Reverse Proxy 的 IP Address。</p>
<div class="codecolorer-container php " style="overflow:auto;white-space:nowrap;width:580px"><div class="php codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw2">function</span> getIP<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>validip<span class="br0">&#40;</span><span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st0">&quot;HTTP_CLIENT_IP&quot;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> <span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st0">&quot;HTTP_CLIENT_IP&quot;</span><span class="br0">&#93;</span><span class="sy0">;</span><br />
&nbsp; <span class="br0">&#125;</span><br />
&nbsp; <span class="kw1">foreach</span><span class="br0">&#40;</span><a href="http://www.php.net/explode"><span class="kw3">explode</span></a><span class="br0">&#40;</span><span class="st0">&quot;,&quot;</span><span class="sy0">,</span><span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st0">&quot;HTTP_X_FORWARDED_FOR&quot;</span><span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="kw1">as</span> <span class="re0">$ip</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>validip<span class="br0">&#40;</span><a href="http://www.php.net/trim"><span class="kw3">trim</span></a><span class="br0">&#40;</span><span class="re0">$ip</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><span class="kw1">return</span> <span class="re0">$ip</span><span class="sy0">;</span><span class="br0">&#125;</span><br />
&nbsp; <span class="br0">&#125;</span><br />
&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>validip<span class="br0">&#40;</span><span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st0">&quot;HTTP_X_FORWARDED&quot;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <br />
&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> <span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st0">&quot;HTTP_X_FORWARDED&quot;</span><span class="br0">&#93;</span><span class="sy0">;</span><br />
&nbsp; <span class="br0">&#125;</span><br />
&nbsp; <span class="kw1">else</span> <span class="kw1">if</span> <span class="br0">&#40;</span>validip<span class="br0">&#40;</span><span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st0">&quot;HTTP_FORWARDED_FOR&quot;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <br />
&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> <span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st0">&quot;HTTP_FORWARDED_FOR&quot;</span><span class="br0">&#93;</span><span class="sy0">;</span><br />
&nbsp; <span class="br0">&#125;</span> <br />
&nbsp; <span class="kw1">else</span> <span class="kw1">if</span> <span class="br0">&#40;</span>validip<span class="br0">&#40;</span><span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st0">&quot;HTTP_FORWARDED&quot;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <br />
&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> <span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st0">&quot;HTTP_FORWARDED&quot;</span><span class="br0">&#93;</span><span class="sy0">;</span><br />
&nbsp; <span class="br0">&#125;</span> <br />
&nbsp; <span class="kw1">else</span> <span class="kw1">if</span> <span class="br0">&#40;</span>validip<span class="br0">&#40;</span><span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st0">&quot;HTTP_X_FORWARDED&quot;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <br />
&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> <span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st0">&quot;HTTP_X_FORWARDED&quot;</span><span class="br0">&#93;</span><span class="sy0">;</span><br />
&nbsp; <span class="br0">&#125;</span> <br />
&nbsp; <span class="kw1">else</span> <br />
&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> <span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st0">&quot;REMOTE_ADDR&quot;</span><span class="br0">&#93;</span><span class="sy0">;</span><br />
&nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="kw2">function</span> validip<span class="br0">&#40;</span><span class="re0">$ip</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><a href="http://www.php.net/empty"><span class="kw3">empty</span></a><span class="br0">&#40;</span><span class="re0">$ip</span><span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span> <a href="http://www.php.net/ip2long"><span class="kw3">ip2long</span></a><span class="br0">&#40;</span><span class="re0">$ip</span><span class="br0">&#41;</span><span class="sy0">!=-</span><span class="nu0">1</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="re0">$reserved_ips</span> <span class="sy0">=</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a> <span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st_h">'10.0.0.0'</span><span class="sy0">,</span><span class="st_h">'10.255.255.255'</span><span class="br0">&#41;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st_h">'127.0.0.0'</span><span class="sy0">,</span><span class="st_h">'127.255.255.255'</span><span class="br0">&#41;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st_h">'169.254.0.0'</span><span class="sy0">,</span><span class="st_h">'169.254.255.255'</span><span class="br0">&#41;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st_h">'172.16.0.0'</span><span class="sy0">,</span><span class="st_h">'172.31.255.255'</span><span class="br0">&#41;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st_h">'192.168.0.0'</span><span class="sy0">,</span><span class="st_h">'192.168.255.255'</span><span class="br0">&#41;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="re0">$reserved_ips</span> <span class="kw1">as</span> <span class="re0">$r</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span class="re0">$min</span> <span class="sy0">=</span> <a href="http://www.php.net/ip2long"><span class="kw3">ip2long</span></a><span class="br0">&#40;</span><span class="re0">$r</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <span class="re0">$max</span> <span class="sy0">=</span> <a href="http://www.php.net/ip2long"><span class="kw3">ip2long</span></a><span class="br0">&#40;</span><span class="re0">$r</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="br0">&#40;</span><a href="http://www.php.net/ip2long"><span class="kw3">ip2long</span></a><span class="br0">&#40;</span><span class="re0">$ip</span><span class="br0">&#41;</span> <span class="sy0">&gt;=</span> <span class="re0">$min</span><span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span> <span class="br0">&#40;</span><a href="http://www.php.net/ip2long"><span class="kw3">ip2long</span></a><span class="br0">&#40;</span><span class="re0">$ip</span><span class="br0">&#41;</span> <span class="sy0">&lt;=</span> <span class="re0">$max</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="kw1">return</span> <span class="kw2">false</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">true</span><span class="sy0">;</span><br />
&nbsp; <span class="br0">&#125;</span> <br />
&nbsp; <span class="kw1">else</span> <br />
&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">false</span><span class="sy0">;</span><br />
&nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></div></div>
<p><strong>Q:rotate Varnish log file every day？</strong><br />
打開 /etc/newsyslog.conf，加入底下兩行</p>
<div class="codecolorer-container bash " style="overflow:auto;white-space:nowrap;width:580px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="sy0">/</span>var<span class="sy0">/</span>log<span class="sy0">/</span>varnish.log &nbsp; &nbsp; &nbsp; &nbsp;<span class="nu0">640</span> &nbsp; &nbsp; <span class="nu0">7</span> &nbsp; <span class="sy0">*</span> &nbsp; <span class="sy0">@</span>T00 &nbsp; &nbsp;JB &nbsp;<span class="sy0">/</span>var<span class="sy0">/</span>run<span class="sy0">/</span>varnishlog.pid<br />
<span class="sy0">/</span>var<span class="sy0">/</span>log<span class="sy0">/</span>varnishncsa.log &nbsp; &nbsp;<span class="nu0">640</span> &nbsp; &nbsp; <span class="nu0">7</span> &nbsp; <span class="sy0">*</span> &nbsp; <span class="sy0">@</span>T00 &nbsp; &nbsp;JB &nbsp;<span class="sy0">/</span>var<span class="sy0">/</span>run<span class="sy0">/</span>varnishncsa.pid</div></div>
<p>每天12點進行 log 備份，使用 gzip 壓縮 log 檔案。</p>
<h3>Related View</h3><ul class="related_post"><li><a href="http://blog.wu-boy.com/2010/06/23/2240/" title="[FreeBSD] update apache -> 2.2.15, PHP -> 5.3.2, and MySQL downgrade to 5.1.9">[FreeBSD] update apache -> 2.2.15, PHP -> 5.3.2, and MySQL downgrade to 5.1.9 (0)</a></li><li><a href="http://blog.wu-boy.com/2010/03/26/2087/" title="Apache 取得透過 Reverse Proxy (Varnish) 的 Client 真正 IP (mod_rpaf)">Apache 取得透過 Reverse Proxy (Varnish) 的 Client 真正 IP (mod_rpaf) (0)</a></li><li><a href="http://blog.wu-boy.com/2008/09/13/388/" title="[FreeBSD]安裝 apache2 (worker) + PHP5.2.6 + mod_fastcgi + php5-fcgi">[FreeBSD]安裝 apache2 (worker) + PHP5.2.6 + mod_fastcgi + php5-fcgi (3)</a></li><li><a href="http://blog.wu-boy.com/2008/07/22/297/" title="[Linux] CentOS 5.1 安裝 Lighttpd + PHP5 + FastCgi + eaccelerator">[Linux] CentOS 5.1 安裝 Lighttpd + PHP5 + FastCgi + eaccelerator (3)</a></li><li><a href="http://blog.wu-boy.com/2008/07/10/293/" title="[轉貼] RoR：Ruby on Rails的部署方案選擇">[轉貼] RoR：Ruby on Rails的部署方案選擇 (0)</a></li><li><a href="http://blog.wu-boy.com/2008/07/03/287/" title="[FreeBSD]Lighttpd + php5 + 解決 wordpress Permalinks mod_write">[FreeBSD]Lighttpd + php5 + 解決 wordpress Permalinks mod_write (1)</a></li><li><a href="http://blog.wu-boy.com/2008/07/01/286/" title="[FreeBSD]Apache 噴出 signal Segmentation fault (11)">[FreeBSD]Apache 噴出 signal Segmentation fault (11) (1)</a></li><li><a href="http://blog.wu-boy.com/2008/06/23/283/" title="[FreeBSD &#038; Linux]網站分流：簡易架設 HAProxy 伺服器">[FreeBSD &#038; Linux]網站分流：簡易架設 HAProxy 伺服器 (1)</a></li><li><a href="http://blog.wu-boy.com/2008/06/18/281/" title="基本優化 tuning apache 跟 tuning mysql 跟 php 效能 ">基本優化 tuning apache 跟 tuning mysql 跟 php 效能  (5)</a></li><li><a href="http://blog.wu-boy.com/2008/06/05/275/" title="[FreeBSD] 安裝 PHP APC 加速網頁速度">[FreeBSD] 安裝 PHP APC 加速網頁速度 (2)</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://blog.wu-boy.com/2010/03/21/2054/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>[Vim] 想套用 *.php syntax 顏色於 *.ros</title>
		<link>http://blog.wu-boy.com/2010/03/16/2050/</link>
		<comments>http://blog.wu-boy.com/2010/03/16/2050/#comments</comments>
		<pubDate>Tue, 16 Mar 2010 05:38:43 +0000</pubDate>
		<dc:creator>appleboy</dc:creator>
				<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Vim]]></category>

		<guid isPermaLink="false">http://blog.wu-boy.com/?p=2050</guid>
		<description><![CDATA[Vim 是一套強大的編輯器，它分佈於各大 UNIX systems，安裝好一套 UNIX 系統，預設就是 Vi 編輯器(FreeBSD 預設是 ee)，相當好用，他也支援各種語言的 syntax，讓您在編輯檔案能夠看到各種不同顏色，在 FreeBSD 底下可以去看 /usr/local/share/vim/vim64/syntax/ 該資料夾支援各種語言，例如 PHP、Ruby、css、html、java、C/C++…等，假設今天我們想要 .ros 的副檔名需要用 php.vim syntax 來開啟，就必須做底下設定：
<span class="readmore"><a href="http://blog.wu-boy.com/2010/03/16/2050/" title="[Vim] 想套用 *.php syntax 顏色於 *.ros" target="_blank">...詳全文（共548字）</a></span>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.flickr.com/photos/appleboy/4436671479/" title="Flickr 上 appleboy46 的 vim_header"><img src="http://farm5.static.flickr.com/4018/4436671479_0596c469d4_o.gif" width="180" height="45" alt="vim_header" /></a><br />
<a href="http://www.vim.org/">Vim</a> 是一套強大的編輯器，它分佈於各大 UNIX systems，安裝好一套 UNIX 系統，預設就是 Vi 編輯器(<a href="http://www.freebsd.org">FreeBSD</a> 預設是 ee)，相當好用，他也支援各種語言的 syntax，讓您在編輯檔案能夠看到各種不同顏色，在 FreeBSD 底下可以去看 /usr/local/share/vim/vim64/syntax/ 該資料夾支援各種語言，例如 PHP、Ruby、css、html、java、C/C++…等，假設今天我們想要 .ros 的副檔名需要用 php.vim syntax 來開啟，就必須做底下設定：</p>
<p>執行底下：</p>
<div class="codecolorer-container bash " style="overflow:auto;white-space:nowrap;width:580px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace">mkdri ~<span class="sy0">/</span>.vim<br />
<span class="kw2">vi</span> ~<span class="sy0">/</span>.vim<span class="sy0">/</span>filetype.vim</div></div>
<p>寫入 filetype.vim 資訊</p>
<div class="codecolorer-container vim " style="overflow:auto;white-space:nowrap;width:580px"><div class="vim codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw1">if</span> version <span class="sy0">&lt;</span> <span class="nu0">600</span><br />
&nbsp; syntax clear<br />
<span class="kw1">elseif</span> <span class="kw3">exists</span><span class="br0">&#40;</span><span class="st0">&quot;b:current_syntax&quot;</span><span class="br0">&#41;</span><br />
&nbsp; finish<br />
<span class="kw1">endif</span><br />
augroup filetypedetect<br />
&nbsp; &nbsp; au<span class="sy0">!</span> BufRead,BufNewFile <span class="sy0">*.</span>ros setfiletype php<br />
augroup END</div></div>
<p>ps. on freebsd 7.1-RELEASE-p11 vim version 6.4.9</p>
<p>reference:<br />
<a href="http://fourdollars.blogspot.com/2009/05/vim-markdown-syntax.html">Vim 套用 Markdown syntax</a><br />
<a href="http://blog.longwin.com.tw/archives/000021.html">vi 設定</a></p>
<h3>Related View</h3><ul class="related_post"><li><a href="http://blog.wu-boy.com/2009/12/12/1901/" title="[UNIX] Vim 命令圖解說明">[UNIX] Vim 命令圖解說明 (0)</a></li><li><a href="http://blog.wu-boy.com/2010/03/11/2041/" title="[FreeBSD] DenyHosts 設定在 hosts.allow 注意事項">[FreeBSD] DenyHosts 設定在 hosts.allow 注意事項 (0)</a></li><li><a href="http://blog.wu-boy.com/2009/12/29/1918/" title="[Git] how to remove file and commit from history(如何移除 commit 歷史紀錄)">[Git] how to remove file and commit from history(如何移除 commit 歷史紀錄) (0)</a></li><li><a href="http://blog.wu-boy.com/2009/06/11/1386/" title="[網站] 好站連結 (三)">[網站] 好站連結 (三) (0)</a></li><li><a href="http://blog.wu-boy.com/2009/03/10/958/" title="Linux or FreeBSD screen 指令介紹使用">Linux or FreeBSD screen 指令介紹使用 (0)</a></li><li><a href="http://blog.wu-boy.com/2009/03/09/948/" title="mydumper 取代 mysqldump 效能">mydumper 取代 mysqldump 效能 (1)</a></li><li><a href="http://blog.wu-boy.com/2009/03/07/940/" title=" Google App Engine SDK：python 基本教學安裝"> Google App Engine SDK：python 基本教學安裝 (0)</a></li><li><a href="http://blog.wu-boy.com/2009/02/24/834/" title="如何在 console 端使用 Tail (View) Multiple Files on UNIX / Linux Console">如何在 console 端使用 Tail (View) Multiple Files on UNIX / Linux Console (3)</a></li><li><a href="http://blog.wu-boy.com/2009/02/23/829/" title="[FreeBSD] 利用 portmaster 升級 PHP 5.26 -> 5.28">[FreeBSD] 利用 portmaster 升級 PHP 5.26 -> 5.28 (2)</a></li><li><a href="http://blog.wu-boy.com/2009/01/13/712/" title="[Linux&#038;FreeBSD] Find 指令用法教學">[Linux&#038;FreeBSD] Find 指令用法教學 (1)</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://blog.wu-boy.com/2010/03/16/2050/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[FreeBSD] DenyHosts 設定在 hosts.allow 注意事項</title>
		<link>http://blog.wu-boy.com/2010/03/11/2041/</link>
		<comments>http://blog.wu-boy.com/2010/03/11/2041/#comments</comments>
		<pubDate>Thu, 11 Mar 2010 10:13:29 +0000</pubDate>
		<dc:creator>appleboy</dc:creator>
				<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[DenyHost]]></category>
		<category><![CDATA[SSH]]></category>

		<guid isPermaLink="false">http://blog.wu-boy.com/?p=2041</guid>
		<description><![CDATA[DenyHosts 是一套用 Python 跟 shell script 寫出來的 open source base on Linux or FreeBSD (/var/log/secure on Redhat, /var/log/auth.log on Mandrake, FreeBSD, etc&#8230;)，用來阻擋 SSH Server 被攻擊，之前寫一篇 FreeBSD 安裝設定教學，有一點沒有注意到，就是打開 /etc/hosts.allow，注意要把 ALL : ALL : allow 放到最後一行，跟 iptables 設定原理是一樣的，會從第一條規則開始比對，如果比對成功，下面的 rule 就會略過比對了，參考英文說明：
<span class="readmore"><a href="http://blog.wu-boy.com/2010/03/11/2041/" title="[FreeBSD] DenyHosts 設定在 hosts.allow 注意事項" target="_blank">...詳全文（共781字）</a></span>]]></description>
			<content:encoded><![CDATA[<p><a title="Flickr 上 appleboy46 的 denyhosts" href="http://www.flickr.com/photos/appleboy/4424616360/"><img src="http://farm5.static.flickr.com/4062/4424616360_8f2af7881e_o.png" alt="denyhosts" width="347" height="73" /></a><br />
<a href="http://denyhosts.sourceforge.net/">DenyHosts</a> 是一套用 <a href="http://www.python.org/">Python</a> 跟 shell script 寫出來的 open source base on Linux or FreeBSD (/var/log/secure on Redhat, /var/log/auth.log on Mandrake, FreeBSD, etc&#8230;)，用來阻擋 SSH Server 被攻擊，之前寫一篇 <a href="http://blog.wu-boy.com/2008/12/26/663/" alt="[FreeBSD]利用 DenyHosts 軟體擋掉暴力破解 ssh 的使用者">FreeBSD 安裝設定教學</a>，有一點沒有注意到，就是打開 /etc/hosts.allow，注意要把 ALL : ALL : allow 放到最後一行，跟 iptables 設定原理是一樣的，會從第一條規則開始比對，如果比對成功，下面的 rule 就會略過比對了，參考英文說明：</p>
<blockquote><p>Start by allowing everything (this prevents the rest of the file from working, so remove it when you need protection). The rules here work on a &#8220;First match wins&#8221; basis.</p></blockquote>
<p>/etc/hosts.deny 已經被 FreeBSD 棄用，所以必須把 allow 跟 deny 的 rule 都寫到 hosts.allow 檔案裡面才是正確的</p>
<div class="codecolorer-container bash " style="overflow:auto;white-space:nowrap;width:580px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="co0">#</span><br />
<span class="co0"># DenyHosts file: /etc/hosts.deniedssh</span><br />
sshd : <span class="sy0">/</span>etc<span class="sy0">/</span>hosts.deniedssh : deny<br />
sshd : ALL : allow<br />
<br />
<span class="co0"># Start by allowing everything (this prevents the rest of the file</span><br />
<span class="co0"># from working, so remove it when you need protection).</span><br />
<span class="co0"># The rules here work on a &quot;First match wins&quot; basis.</span><br />
<span class="co0"># move bottom by appleboy 2010.03.11</span><br />
ALL : ALL : allow</div></div>
<h3>Related View</h3><ul class="related_post"><li><a href="http://blog.wu-boy.com/2008/12/26/663/" title="[FreeBSD]利用 DenyHosts 軟體擋掉暴力破解 ssh 的使用者">[FreeBSD]利用 DenyHosts 軟體擋掉暴力破解 ssh 的使用者 (2)</a></li><li><a href="http://blog.wu-boy.com/2008/04/16/176/" title="[SSHFS] 好用的 SSH Filesystem fusefs-sshfs in FreeBSD or Linux">[SSHFS] 好用的 SSH Filesystem fusefs-sshfs in FreeBSD or Linux (0)</a></li><li><a href="http://blog.wu-boy.com/2008/03/19/155/" title="[筆記] ssh Tunnel 運用在 Linux and Windows FireFox">[筆記] ssh Tunnel 運用在 Linux and Windows FireFox (1)</a></li><li><a href="http://blog.wu-boy.com/2006/11/26/43/" title="[Linux,FreeBSD] scp 上傳跟下載">[Linux,FreeBSD] scp 上傳跟下載 (0)</a></li><li><a href="http://blog.wu-boy.com/2010/03/16/2050/" title="[Vim] 想套用 *.php syntax 顏色於 *.ros">[Vim] 想套用 *.php syntax 顏色於 *.ros (0)</a></li><li><a href="http://blog.wu-boy.com/2009/12/29/1918/" title="[Git] how to remove file and commit from history(如何移除 commit 歷史紀錄)">[Git] how to remove file and commit from history(如何移除 commit 歷史紀錄) (0)</a></li><li><a href="http://blog.wu-boy.com/2009/12/12/1901/" title="[UNIX] Vim 命令圖解說明">[UNIX] Vim 命令圖解說明 (0)</a></li><li><a href="http://blog.wu-boy.com/2009/06/11/1386/" title="[網站] 好站連結 (三)">[網站] 好站連結 (三) (0)</a></li><li><a href="http://blog.wu-boy.com/2009/03/10/958/" title="Linux or FreeBSD screen 指令介紹使用">Linux or FreeBSD screen 指令介紹使用 (0)</a></li><li><a href="http://blog.wu-boy.com/2009/03/09/948/" title="mydumper 取代 mysqldump 效能">mydumper 取代 mysqldump 效能 (1)</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://blog.wu-boy.com/2010/03/11/2041/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
