<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4272939767197667332</id><updated>2012-01-03T13:39:38.575+08:00</updated><category term='pand'/><category term='debug'/><category term='Selftest'/><category term='Chat'/><category term='bluetooth'/><category term='screen tip'/><category term='android'/><category term='陶韻 DIY'/><category term='icecc distributed compiler'/><category term='git svn migration clone repository'/><category term='eclair'/><category term='Taipei App Engine Sprint 2009'/><category term='Unit test'/><category term='0xlab'/><category term='libgralloc'/><category term='0xdroid'/><category term='Linux 2.6.21 s3c2440 tty console printf printk'/><category term='beagleboard'/><category term='Tin Whistle'/><category term='bnep0'/><category term='beagleboard hacking note'/><category term='c++'/><category term='deadlock'/><category term='ipkg opkg ipk'/><title type='text'>Linux &amp; Ocarina</title><subtitle type='html'>Tick's personal blog. According what he saw, what he was thinking about, and some geek stuff. 

Articles may be written in English or Chinese. 

Have fun. :)</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://linuxocarina.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://linuxocarina.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Tick</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://lh3.google.com/ticktock35/RxbHkGdUPGI/AAAAAAAAAE0/IFbLByIbaj8/s144/tux_ocarina.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>58</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4272939767197667332.post-7609464500856779473</id><published>2010-11-29T12:16:00.000+08:00</published><updated>2010-11-29T12:16:09.243+08:00</updated><title type='text'>有感</title><content type='html'>每當靜下心來好好的寫程式…就能感受到在邏輯的殿堂中自己意志力以及知識的力量，意志力經由手指的敲打化為真實的程式，就像是魔法師一般。看它順利的完成任務，心裏總是開心的滿足的。這單純的喜悅正是為什麼如此著迷於設計並實作軟體，即便是其它人不容易感受到內心的喜悅。&lt;br /&gt;然而…如果想要改善台灣軟體環境的現況，我需要學會的…真的遠遠超過把軟體寫好的能力。夜深人靜時，總是不停的思索這個問題…好像看得到未來的方向，又好虛無飄渺。嗯，我必需學會另一種高度…&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4272939767197667332-7609464500856779473?l=linuxocarina.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/7609464500856779473'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/7609464500856779473'/><link rel='alternate' type='text/html' href='http://linuxocarina.blogspot.com/2010/11/blog-post.html' title='有感'/><author><name>Tick</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://lh3.google.com/ticktock35/RxbHkGdUPGI/AAAAAAAAAE0/IFbLByIbaj8/s144/tux_ocarina.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4272939767197667332.post-1466910094907380095</id><published>2010-06-09T16:23:00.006+08:00</published><updated>2010-06-10T09:50:15.524+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='libgralloc'/><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><category scheme='http://www.blogger.com/atom/ns#' term='deadlock'/><category scheme='http://www.blogger.com/atom/ns#' term='eclair'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><category scheme='http://www.blogger.com/atom/ns#' term='beagleboard'/><title type='text'>Eclair Libgralloc Deadlock Problem</title><content type='html'>As we are developing &lt;a href="http://gitorious.org/0xdroid"&gt;0xdroid&lt;/a&gt; beagle-eclair branch, we&amp;nbsp;occasionally encounter screen flipping issue. This issue rarely happens however it bothers the user experience very much when running some resource eating applications. Last week in the Computex Taipei 2010 show, we demoed 0xdroid beagle-eclair connecting wireless modules and played games. I noticed that this issue happens very often while playing a game called "&lt;a href="http://www.frozen-bubble.org/"&gt;Frozen Bubble&lt;/a&gt;". (It's a good game, we all love this game a lot, and spent a lot of time on it. ;-) ) It's kind of embarrassing when the screen keeps flipping on the show. Therefore I decided to dig out this issue.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;object height="385" width="480"&gt;&lt;param name="movie" value="http://www.youtube.com/v/AO_A7AnLpvY&amp;hl=zh_TW&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/AO_A7AnLpvY&amp;hl=zh_TW&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Beside of 0xdroid on &lt;a href="http://beagleboard.org/"&gt;beagleboard&lt;/a&gt; and &lt;a href="http://www.timll.com/"&gt;Devkit8000&lt;/a&gt;, I tested some other platforms and find out&amp;nbsp;actually&amp;nbsp;almost all of them having this problem. Therefore I suspected it's not a hardware related problem. Maybe a framework or HAL issue. We noticed that when the screen is flipping, the logcat message will complain as following&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre class="prettyprint"&gt;E/SurfaceFlinger(  768): eglSwapBuffers: EGL error 0x3002 (EGL_BAD_ACCESS)&lt;br /&gt;E/gralloc (  768): handle 0x13f8c0 not locked&lt;br /&gt;~E/gralloc (  768): handle 0x13f8c0 already locked for write&lt;br /&gt;E/libagl  (  768): eglSwapBuffers() failed to lock buffer 0x1368e0 (640x480)&lt;br /&gt;E/SurfaceFlinger(  768): eglSwapBuffers: EGL error 0x3002 (EGL_BAD_ACCESS)&lt;br /&gt;E/gralloc (  768): handle 0x13f8c0 not locked&lt;br /&gt;E/gralloc (  768): handle 0x13f8c0 already locked for write&lt;br /&gt;E/libagl  (  768): eglSwapBuffers() failed to lock buffer 0x1368e0 (640x480)&lt;br /&gt;E/SurfaceFlinger(  768): eglSwapBuffers: EGL error 0x3002 (EGL_BAD_ACCESS)&lt;br /&gt;E/gralloc (  768): handle 0x13f8c0 not locked&lt;br /&gt;E/gralloc (  768): handle 0x13f8c0 already locked for write&lt;br /&gt;E/libagl  (  768): eglSwapBuffers() failed to lock buffer 0x1368e0 (640x480)&lt;br /&gt;E/SurfaceFlinger(  768): eglSwapBuffers: EGL error 0x3002 (EGL_BAD_ACCESS)&lt;br /&gt;E/gralloc (  768): handle 0x13f8c0 not locked&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div&gt;Therefore I checked the libgralloc and adding some debug message. The libgralloc plugin 0xdroid used is branched from original eclair source tree. I took few hours created the omap3/libgralloc at the first day when I got eclair source code months ago. Since it works well for the most of time, I didn't pay too much attention to it, until I found the deadlock issue goes crazy on frozen bubble.&lt;br /&gt;After noticing the lock log and swap error, I took a close look of the gralloc_lock and gralloc_unlock in hardware/omap3/libgralloc/mapper.c&lt;/div&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;int gralloc_lock(gralloc_module_t const* module,&lt;br /&gt;        buffer_handle_t handle, int usage,&lt;br /&gt;        int l, int t, int w, int h,&lt;br /&gt;        void** vaddr)&lt;br /&gt;{&lt;br /&gt;    if (private_handle_t::validate(handle) &amp;lt; 0)&lt;br /&gt;        return -EINVAL;&lt;br /&gt;&lt;br /&gt;    int err = 0;&lt;br /&gt;    private_handle_t* hnd = (private_handle_t*)handle;&lt;br /&gt;    int32_t current_value, new_value;&lt;br /&gt;    int retry;&lt;br /&gt;&lt;br /&gt;    do {&lt;br /&gt;        current_value = hnd-&amp;gt;lockState;&lt;br /&gt;        new_value = current_value;&lt;br /&gt;&lt;br /&gt;        if (current_value &amp;amp; private_handle_t::LOCK_STATE_WRITE) {&lt;br /&gt;            // already locked for write &lt;br /&gt;            LOGE("handle %p already locked for write", handle);&lt;br /&gt;            return -EBUSY;&lt;br /&gt;        } else if (current_value &amp;amp; private_handle_t::LOCK_STATE_READ_MASK) {&lt;br /&gt;            // already locked for read&lt;br /&gt;            if (usage &amp;amp; (GRALLOC_USAGE_SW_WRITE_MASK | GRALLOC_USAGE_HW_RENDER)) {&lt;br /&gt;                LOGE("handle %p already locked for read", handle);&lt;br /&gt;                return -EBUSY;&lt;br /&gt;            } else {&lt;br /&gt;                // this is not an error&lt;br /&gt;                //LOGD("%p already locked for read... count = %d", &lt;br /&gt;                //        handle, (current_value &amp;amp; ~(1&amp;lt;&amp;lt;31)));&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        // not currently locked&lt;br /&gt;        if (usage &amp;amp; (GRALLOC_USAGE_SW_WRITE_MASK | GRALLOC_USAGE_HW_RENDER)) {&lt;br /&gt;            // locking for write&lt;br /&gt;            new_value |= private_handle_t::LOCK_STATE_WRITE;&lt;br /&gt;        }&lt;br /&gt;        new_value++;&lt;br /&gt;&lt;br /&gt;        retry = &lt;b&gt;android_atomic_cmpxchg&lt;/b&gt;(current_value, new_value, &lt;br /&gt;    } while (retry);&lt;br /&gt;&lt;br /&gt;    if (new_value &amp;amp; private_handle_t::LOCK_STATE_WRITE) {&lt;br /&gt;        // locking for write, store the tid&lt;br /&gt;        hnd-&amp;gt;writeOwner = gettid();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    if (usage &amp;amp; (GRALLOC_USAGE_SW_READ_MASK | GRALLOC_USAGE_SW_WRITE_MASK)) {&lt;br /&gt;        if (!(current_value &amp;amp; private_handle_t::LOCK_STATE_MAPPED)) {&lt;br /&gt;            // we need to map for real&lt;br /&gt;            pthread_mutex_t* const lock = &amp;amp;sMapLock;&lt;br /&gt;            pthread_mutex_lock(lock);&lt;br /&gt;            if (!(hnd-&amp;gt;lockState &amp;amp; private_handle_t::LOCK_STATE_MAPPED)) {&lt;br /&gt;                err = gralloc_map(module, handle, vaddr);&lt;br /&gt;                if (err == 0) {&lt;br /&gt;                    android_atomic_or(private_handle_t::LOCK_STATE_MAPPED,&lt;br /&gt;                            (volatile int32_t*)&amp;amp;(hnd-&amp;gt;lockState));&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            pthread_mutex_unlock(lock);&lt;br /&gt;        }&lt;br /&gt;        *vaddr = (void*)hnd-&amp;gt;base;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return err;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int gralloc_unlock(gralloc_module_t const* module, &lt;br /&gt;        buffer_handle_t handle)&lt;br /&gt;{&lt;br /&gt;    if (private_handle_t::validate(handle) &amp;lt; 0)&lt;br /&gt;        return -EINVAL;&lt;br /&gt;&lt;br /&gt;    private_handle_t* hnd = (private_handle_t*)handle;&lt;br /&gt;    int32_t current_value, new_value;&lt;br /&gt;&lt;br /&gt;    do {&lt;br /&gt;        current_value = hnd-&amp;gt;lockState;&lt;br /&gt;        new_value = current_value;&lt;br /&gt;&lt;br /&gt;        if (current_value &amp;amp; private_handle_t::LOCK_STATE_WRITE) {&lt;br /&gt;            // locked for write&lt;br /&gt;            &lt;b&gt;if (hnd-&amp;gt;writeOwner == gettid()) {&lt;br /&gt;                hnd-&amp;gt;writeOwner = 0;&lt;br /&gt;                new_value &amp;amp;= ~private_handle_t::LOCK_STATE_WRITE;&lt;br /&gt;            }&lt;/b&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        if ((new_value &amp;amp; private_handle_t::LOCK_STATE_READ_MASK) == 0) {&lt;br /&gt;            LOGE("handle %p not locked", handle);&lt;br /&gt;            return -EINVAL;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        new_value--;&lt;br /&gt;&lt;br /&gt;    } while (&lt;b&gt;android_atomic_cmpxchg&lt;/b&gt;(current_value, new_value, &lt;br /&gt;            (volatile int32_t*)&amp;amp;hnd-&amp;gt;lockState));&lt;br /&gt;&lt;br /&gt;    return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div&gt;The code looks reasonably for the first look. Lock and unlock pair looks good. However there is a very tricky part "&lt;b&gt;android_atomic_cmpxchg may fail&lt;/b&gt;". Understanding this, it is not hard to see there is a potential bug in gralloc_unlock. &amp;nbsp;If&amp;nbsp;android_atomic_cmpxchg fails, it will run the do while loop for more than once. However for the first run, the&amp;nbsp;&lt;b&gt;hnd-&amp;gt;writeOwner will be changed to 0&lt;/b&gt;. &amp;nbsp;And then the new_value will not be changed anymore. This lock will goes crazy here after.&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://www.gitorious.org/0xdroid/hardware_omap3_libgralloc/commit/2741d2b66221750bb27c692cf6615e2d42499690"&gt;patch&lt;/a&gt;&amp;nbsp;solves this problem.&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;diff --git a/mapper.cpp b/mapper.cpp&lt;br /&gt;index 16ebcc2..1f3e722 100644&lt;br /&gt;--- a/mapper.cpp&lt;br /&gt;+++ b/mapper.cpp&lt;br /&gt;@@ -267,13 +267,13 @@ int gralloc_unlock(gralloc_module_t const* module,&lt;br /&gt;         if (current_value &amp;amp; private_handle_t::LOCK_STATE_WRITE) {&lt;br /&gt;             // locked for write&lt;br /&gt;             if (hnd-&amp;gt;writeOwner == gettid()) {&lt;br /&gt;-                hnd-&amp;gt;writeOwner = 0;&lt;br /&gt;                 new_value &amp;amp;= ~private_handle_t::LOCK_STATE_WRITE;&lt;br /&gt;             }&lt;br /&gt;         }&lt;br /&gt; &lt;br /&gt;         if ((new_value &amp;amp; private_handle_t::LOCK_STATE_READ_MASK) == 0) {&lt;br /&gt;             LOGE("handle %p not locked", handle);&lt;br /&gt;+            hnd-&amp;gt;writeOwner = 0;&lt;br /&gt;             return -EINVAL;&lt;br /&gt;         }&lt;br /&gt; &lt;br /&gt;@@ -282,5 +282,6 @@ int gralloc_unlock(gralloc_module_t const* module,&lt;br /&gt;     } while (android_atomic_cmpxchg(current_value, new_value, &lt;br /&gt;             (volatile int32_t*)&amp;amp;hnd-&amp;gt;lockState));&lt;br /&gt; &lt;br /&gt;+    hnd-&amp;gt;writeOwner = 0;&lt;br /&gt;     return 0;&lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It make sure the value hnd-&amp;gt;writeOwner is the same as the first loop, if&amp;nbsp;android_atomic_cmpxchg fails. &lt;br /&gt;&lt;br /&gt;This issue comes from the original eclair source tree, and it is still&lt;a href="http://android.git.kernel.org/?p=platform/hardware/libhardware.git;a=blob;f=modules/gralloc/mapper.cpp;h=e2caf79e73b9c7e2d9cf3a7980df16156e703813;hb=HEAD#l266"&gt; there&lt;/a&gt;, and had been inherited to many different platforms. &amp;nbsp;If you encounter two frames&amp;nbsp;crazily flipping and having the lock message, you may try to take a look of your libgralloc.&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4272939767197667332-1466910094907380095?l=linuxocarina.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/1466910094907380095'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/1466910094907380095'/><link rel='alternate' type='text/html' href='http://linuxocarina.blogspot.com/2010/06/ecliar-libgralloc-deadlock-problem.html' title='Eclair Libgralloc Deadlock Problem'/><author><name>Tick</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://lh3.google.com/ticktock35/RxbHkGdUPGI/AAAAAAAAAE0/IFbLByIbaj8/s144/tux_ocarina.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4272939767197667332.post-1960690710764066725</id><published>2009-12-14T15:03:00.000+08:00</published><updated>2009-12-14T15:03:13.561+08:00</updated><title type='text'>[備忘] RGB565 To PNG/JPEG</title><content type='html'>竟然忘掉了… 寫在這備忘&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;ffmpeg -vcodec rawvideo -f rawvideo -pix_fmt rgb565 -s 1024x720 -i input.raw -f image2 -vcodec png output.png&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4272939767197667332-1960690710764066725?l=linuxocarina.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/1960690710764066725'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/1960690710764066725'/><link rel='alternate' type='text/html' href='http://linuxocarina.blogspot.com/2009/12/rgb565-to-pngjpeg.html' title='[備忘] RGB565 To PNG/JPEG'/><author><name>Tick</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://lh3.google.com/ticktock35/RxbHkGdUPGI/AAAAAAAAAE0/IFbLByIbaj8/s144/tux_ocarina.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4272939767197667332.post-5905887092653454255</id><published>2009-10-13T14:05:00.013+08:00</published><updated>2009-10-28T00:27:28.598+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='0xdroid'/><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><category scheme='http://www.blogger.com/atom/ns#' term='beagleboard'/><title type='text'>Oprofile 0xdroid Android on Beagleboard</title><content type='html'>Android supports oprofile actually. And you can play happily with that with some oprofile knowledge on G1. However the external/oprofile in Android does not support ARM_V7 for now. To play with it patch the following type and trigger support of ARM_V7&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;diff --git a/libop/op_cpu_type.c b/libop/op_cpu_type.c&lt;br /&gt;index b9d13de..737f63e 100644&lt;br /&gt;--- a/libop/op_cpu_type.c&lt;br /&gt;+++ b/libop/op_cpu_type.c&lt;br /&gt;@@ -74,6 +74,7 @@ static struct cpu_descr const cpu_descrs[MAX_CPU_TYPE] = {&lt;br /&gt;  { "ppc64 POWER5++", "ppc64/power5++", CPU_PPC64_POWER5pp, 6 },&lt;br /&gt;  { "e300", "ppc/e300", CPU_PPC_E300, 4 },&lt;br /&gt;  { "AVR32", "avr32", CPU_AVR32, 3 },&lt;br /&gt;+ { "ARM V7 PMNC", "arm/armv7", CPU_ARM_V7, 5}, &lt;br /&gt; };&lt;br /&gt;  &lt;br /&gt; static size_t const nr_cpu_descrs = sizeof(cpu_descrs) / sizeof(struct cpu_descr);&lt;br /&gt;diff --git a/libop/op_cpu_type.h b/libop/op_cpu_type.h&lt;br /&gt;index be95ae2..f4db260 100644&lt;br /&gt;--- a/libop/op_cpu_type.h&lt;br /&gt;+++ b/libop/op_cpu_type.h&lt;br /&gt;@@ -72,6 +72,7 @@ typedef enum {&lt;br /&gt;  CPU_PPC64_POWER5pp,  /**&amp;lt; ppc64 Power5++ family */&lt;br /&gt;  CPU_PPC_E300, /**&amp;lt; e300 */&lt;br /&gt;  CPU_AVR32, /**&amp;lt; AVR32 */&lt;br /&gt;+ CPU_ARM_V7, /**&amp;lt; ARM V7 */&lt;br /&gt;  MAX_CPU_TYPE&lt;br /&gt; } op_cpu;&lt;br /&gt; &lt;br /&gt;diff --git a/libop/op_events.c b/libop/op_events.c&lt;br /&gt;index b4a10e7..7f0ed25 100644&lt;br /&gt;--- a/libop/op_events.c&lt;br /&gt;+++ b/libop/op_events.c&lt;br /&gt;@@ -793,6 +793,7 @@ void op_default_event(op_cpu cpu_type, struct op_default_event_descr * descr)&lt;br /&gt;   case CPU_ARM_XSCALE2:&lt;br /&gt;   case CPU_ARM_MPCORE:&lt;br /&gt;   case CPU_ARM_V6:&lt;br /&gt;+  case CPU_ARM_V7:&lt;br /&gt;   case CPU_AVR32:&lt;br /&gt;    descr-&amp;gt;name = "CPU_CYCLES";&lt;br /&gt;    break;&lt;br /&gt;diff --git a/opimport_pull b/opimport_pull&lt;br /&gt;index 7dbac4a..bf1f19a 100755&lt;br /&gt;--- a/opimport_pull&lt;br /&gt;+++ b/opimport_pull&lt;br /&gt;@@ -1,4 +1,4 @@&lt;br /&gt;-#!/usr/bin/python2.4 -E&lt;br /&gt;+#!/usr/bin/python -E&lt;br /&gt; &lt;br /&gt; import os&lt;br /&gt; import re&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And adding event tables for ARMv7&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;commit f129bca975b1704c06e07df7710d29de13a1e922&lt;br /&gt;Author: Tick Chen &amp;lt;tick@0xlab.org&amp;gt;&lt;br /&gt;Date:   Sat Sep 26 22:56:44 2009 +0800&lt;br /&gt;&lt;br /&gt;[oprofile] adding metadata of armv7&lt;br /&gt;&lt;br /&gt;diff --git a/linux-x86/oprofile/arm/armv7/events b/linux-x86/oprofile/arm/armv7/events&lt;br /&gt;new file mode 100644&lt;br /&gt;index 0000000..2550e41&lt;br /&gt;--- /dev/null&lt;br /&gt;+++ b/linux-x86/oprofile/arm/armv7/events&lt;br /&gt;@@ -0,0 +1,53 @@&lt;br /&gt;+# ARM V7 events&lt;br /&gt;+# From Cortex A8 DDI (ARM DDI 0344B, revision r1p1)&lt;br /&gt;+#&lt;br /&gt;+event:0x00 counters:1,2,3,4 um:zero minimum:500 name:PMNC_SW_INCR : Software increment of PMNC registers&lt;br /&gt;+event:0x01 counters:1,2,3,4 um:zero minimum:500 name:IFETCH_MISS : Instruction fetch misses from cache or normal cacheable memory&lt;br /&gt;+event:0x02 counters:1,2,3,4 um:zero minimum:500 name:ITLB_MISS : Instruction fetch misses from TLB&lt;br /&gt;+event:0x03 counters:1,2,3,4 um:zero minimum:500 name:DCACHE_REFILL : Data R/W operation that causes a refill from cache or normal cacheable memory&lt;br /&gt;+event:0x04 counters:1,2,3,4 um:zero minimum:500 name:DCACHE_ACCESS : Data R/W from cache&lt;br /&gt;+event:0x05 counters:1,2,3,4 um:zero minimum:500 name:DTLB_REFILL : Data R/W that causes a TLB refill&lt;br /&gt;+event:0x06 counters:1,2,3,4 um:zero minimum:500 name:DREAD : Data read architecturally executed (note: architecturally executed = for instructions that are unconditional or that pass the condition code)&lt;br /&gt;+event:0x07 counters:1,2,3,4 um:zero minimum:500 name:DWRITE : Data write architecturally executed&lt;br /&gt;+event:0x08 counters:1,2,3,4 um:zero minimum:500 name:INSTR_EXECUTED : All executed instructions&lt;br /&gt;+event:0x09 counters:1,2,3,4 um:zero minimum:500 name:EXC_TAKEN : Exception taken&lt;br /&gt;+event:0x0A counters:1,2,3,4 um:zero minimum:500 name:EXC_EXECUTED : Exception return architecturally executed&lt;br /&gt;+event:0x0B counters:1,2,3,4 um:zero minimum:500 name:CID_WRITE : Instruction that writes to the Context ID Register architecturally executed&lt;br /&gt;+event:0x0C counters:1,2,3,4 um:zero minimum:500 name:PC_WRITE : SW change of PC, architecturally executed (not by exceptions)&lt;br /&gt;+event:0x0D counters:1,2,3,4 um:zero minimum:500 name:PC_IMM_BRANCH : Immediate branch instruction executed (taken or not)&lt;br /&gt;+event:0x0E counters:1,2,3,4 um:zero minimum:500 name:PC_PROC_RETURN : Procedure return architecturally executed (not by exceptions)&lt;br /&gt;+event:0x0F counters:1,2,3,4 um:zero minimum:500 name:UNALIGNED_ACCESS : Unaligned access architecturally executed&lt;br /&gt;+event:0x10 counters:1,2,3,4 um:zero minimum:500 name:PC_BRANCH_MIS_PRED : Branch mispredicted or not predicted. Counts pipeline flushes because of misprediction&lt;br /&gt;+event:0x12 counters:1,2,3,4 um:zero minimum:500 name:PC_BRANCH_MIS_USED : Branch or change in program flow that could have been predicted&lt;br /&gt;+event:0x40 counters:1,2,3,4 um:zero minimum:500 name:WRITE_BUFFER_FULL : Any write buffer full cycle&lt;br /&gt;+event:0x41 counters:1,2,3,4 um:zero minimum:500 name:L2_STORE_MERGED : Any store that is merged in L2 cache&lt;br /&gt;+event:0x42 counters:1,2,3,4 um:zero minimum:500 name:L2_STORE_BUFF : Any bufferable store from load/store to L2 cache&lt;br /&gt;+event:0x43 counters:1,2,3,4 um:zero minimum:500 name:L2_ACCESS : Any access to L2 cache&lt;br /&gt;+event:0x44 counters:1,2,3,4 um:zero minimum:500 name:L2_CACH_MISS : Any cacheable miss in L2 cache&lt;br /&gt;+event:0x45 counters:1,2,3,4 um:zero minimum:500 name:AXI_READ_CYCLES : Number of cycles for an active AXI read&lt;br /&gt;+event:0x46 counters:1,2,3,4 um:zero minimum:500 name:AXI_WRITE_CYCLES : Number of cycles for an active AXI write&lt;br /&gt;+event:0x47 counters:1,2,3,4 um:zero minimum:500 name:MEMORY_REPLAY : Any replay event in the memory subsystem&lt;br /&gt;+event:0x48 counters:1,2,3,4 um:zero minimum:500 name:UNALIGNED_ACCESS_REPLAY : Unaligned access that causes a replay&lt;br /&gt;+event:0x49 counters:1,2,3,4 um:zero minimum:500 name:L1_DATA_MISS : L1 data cache miss as a result of the hashing algorithm&lt;br /&gt;+event:0x4A counters:1,2,3,4 um:zero minimum:500 name:L1_INST_MISS : L1 instruction cache miss as a result of the hashing algorithm&lt;br /&gt;+event:0x4B counters:1,2,3,4 um:zero minimum:500 name:L1_DATA_COLORING : L1 data access in which a page coloring alias occurs&lt;br /&gt;+event:0x4C counters:1,2,3,4 um:zero minimum:500 name:L1_NEON_DATA : NEON data access that hits L1 cache&lt;br /&gt;+event:0x4D counters:1,2,3,4 um:zero minimum:500 name:L1_NEON_CACH_DATA : NEON cacheable data access that hits L1 cache&lt;br /&gt;+event:0x4E counters:1,2,3,4 um:zero minimum:500 name:L2_NEON : L2 access as a result of NEON memory access&lt;br /&gt;+event:0x4F counters:1,2,3,4 um:zero minimum:500 name:L2_NEON_HIT : Any NEON hit in L2 cache&lt;br /&gt;+event:0x50 counters:1,2,3,4 um:zero minimum:500 name:L1_INST : Any L1 instruction cache access, excluding CP15 cache accesses&lt;br /&gt;+event:0x51 counters:1,2,3,4 um:zero minimum:500 name:PC_RETURN_MIS_PRED : Return stack misprediction at return stack pop (incorrect target address)&lt;br /&gt;+event:0x52 counters:1,2,3,4 um:zero minimum:500 name:PC_BRANCH_FAILED : Branch prediction misprediction&lt;br /&gt;+event:0x53 counters:1,2,3,4 um:zero minimum:500 name:PC_BRANCH_TAKEN : Any predicted branch that is taken&lt;br /&gt;+event:0x54 counters:1,2,3,4 um:zero minimum:500 name:PC_BRANCH_EXECUTED : Any taken branch that is executed&lt;br /&gt;+event:0x55 counters:1,2,3,4 um:zero minimum:500 name:OP_EXECUTED : Number of operations executed (in instruction or mutli-cycle instruction)&lt;br /&gt;+event:0x56 counters:1,2,3,4 um:zero minimum:500 name:CYCLES_INST_STALL : Cycles where no instruction available&lt;br /&gt;+event:0x57 counters:1,2,3,4 um:zero minimum:500 name:CYCLES_INST : Number of instructions issued in a cycle&lt;br /&gt;+event:0x58 counters:1,2,3,4 um:zero minimum:500 name:CYCLES_NEON_DATA_STALL : Number of cycles the processor waits on MRC data from NEON&lt;br /&gt;+event:0x59 counters:1,2,3,4 um:zero minimum:500 name:CYCLES_NEON_INST_STALL : Number of cycles the processor waits on NEON instruction queue or NEON load queue&lt;br /&gt;+event:0x5A counters:1,2,3,4 um:zero minimum:500 name:NEON_CYCLES : Number of cycles NEON and integer processors are not idle&lt;br /&gt;+event:0x70 counters:1,2,3,4 um:zero minimum:500 name:PMU0_EVENTS : Number of events from external input source PMUEXTIN[0]&lt;br /&gt;+event:0x71 counters:1,2,3,4 um:zero minimum:500 name:PMU1_EVENTS : Number of events from external input source PMUEXTIN[1]&lt;br /&gt;+event:0x72 counters:1,2,3,4 um:zero minimum:500 name:PMU_EVENTS : Number of events from both external input sources PMUEXTIN[0] and PMUEXTIN[1]&lt;br /&gt;+event:0xFF counters:0 um:zero minimum:500 name:CPU_CYCLES : Number of CPU cycles&lt;br /&gt;+&lt;br /&gt;diff --git a/linux-x86/oprofile/arm/armv7/unit_masks b/linux-x86/oprofile/arm/armv7/unit_masks&lt;br /&gt;new file mode 100644&lt;br /&gt;index 0000000..02464a3&lt;br /&gt;--- /dev/null&lt;br /&gt;+++ b/linux-x86/oprofile/arm/armv7/unit_masks&lt;br /&gt;@@ -0,0 +1,4 @@&lt;br /&gt;+# ARM V7 PMNC possible unit masks&lt;br /&gt;+#&lt;br /&gt;+name:zero type:mandatory default:0x00&lt;br /&gt;+    0x00 No unit mask&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This way we can play oprofile on beagleboard already. But you cannot analysis it yet.&lt;br /&gt;Because of that prebuild opreport does not supports ARM_v7. Therefore I downloaded and compile the oprofile 0.9.5. Replace those in prebuild, then we can analysis the data happily.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;All of these stuff had been done in 0xdroid, therefore you can play directly with 0xdroid.&lt;br /&gt;The default kernel released in http://downloads.0xlab.org/ currently does not set oprofile flags up therefore you will need to set them up and recompile it.&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;+ CONFIG_OPROFILE_ARMV7=y&lt;br /&gt;+ CONFIG_OPROFILE=y&lt;br /&gt;+ CONFIG_PROFILING=y&lt;br /&gt;+ CONFIG_HAVE_OPROFILE=y&lt;br /&gt;+ CONFIG_TRACEPOINTS=y&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;You can throw the vmlinux into a usb storage or SD card with VFAT partition as the first partition.&lt;br /&gt;&lt;br /&gt;After booting up 0xdroid beagle-cupcake or beagle-donut, you can run&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;opcontrol —setup —event=CPU_CYCLES:15000:::1:1 \&lt;br /&gt;—vmlinux=/sdcard/vmlinux \&lt;br /&gt;—kernel-range=0xc0008000,0xcfffffff&lt;br /&gt;echo 16 &gt; /dev/oprofile/backtrace_depth&lt;span style="font-family:Georgia,serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;That will setup the oprofiled to trigger sampling for every 15000 clock cycles. The smaller CPU_CYCLES the more heavy loading of profiling and getting more details. The larger CPU_CYCLES the less detail we get and lower profiling loading.&lt;br /&gt;When I am profiling the overhead of camera preview I found one interesting phenomenon. When I use 150000 as sampling CPU_CYCLES, it's about sampling 30 times per second. I cannot get anything meaningful with the sampling rate. This confused me for a while before I realize it's just about the same frame rate with camera. I always sampled at the same point. Therefore even if we samples a lot, the grid of sampling period should be much smaller than what you want to profile. We always may be blind to some samples. We should be aware of that, and we may need to change various CPU_CYCLES profiling the same topic to get more confidence of the result.&lt;br /&gt;&lt;br /&gt;When you are ready to profile just enter&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;opcontrol --start&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;And then do whatever you want to profile.&lt;br /&gt;Stop oprofile with&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;opcontrol --stop&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;After stopping oprofile, you can use a mini usb cable to download all the samples to the host machine, and analysis them.&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;On device:&lt;br /&gt;1. plug in usb line between laptop and beagleboard (OTG port)&lt;br /&gt;2. netcfg usb0 up&lt;br /&gt;3. ifconfig usb0 192.168.0.202&lt;br /&gt;On you host:&lt;br /&gt;1. sudo ifconfig usb0 192.168.0.200 # beware nm-applet may breaks it, you can set it up.&lt;br /&gt;2. export ADBHOST=192.168.0.202&lt;br /&gt;3. export PATH={Where you put 0xdroid}/out/host/linux-x86/bin:$PATH&lt;br /&gt;4. pkill adb&lt;br /&gt;5. adb devices  # If you can see the device then you can do next step, or you may need to checkout what’s wrong.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Then:&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;cd {Where you put 0xdroid}&lt;br /&gt;. build/envsetup.sh&lt;br /&gt;setpaths&lt;br /&gt;export OPROFILE_EVENTS_DIR=${PWD}/linux-x86/oprofile/&lt;br /&gt;cd external/oprofile&lt;br /&gt;./opimport_pull /tmp/0xdroid-oprofile&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Copy your vmlinux to ${OUT}/symbols&lt;br /&gt;&lt;br /&gt;Then you can analysis the whole symbols with&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;${OPROFILE_EVENTS_DIR}/bin/opreport --session-dir=/tmp/0xdroid-oprofile -p ${OUT}/symbols&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;After analyzing, we can use ooffice, graphvis, gnuplot, or whatever you like to rework the data. For example:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_uSgEb50CjDE/SucO2cYTmjI/AAAAAAAABDg/JSpVYiyXyuI/s1600-h/Screenshot.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px; height: 150px;" src="http://2.bp.blogspot.com/_uSgEb50CjDE/SucO2cYTmjI/AAAAAAAABDg/JSpVYiyXyuI/s320/Screenshot.png" alt="" id="BLOGGER_PHOTO_ID_5397299006920694322" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Happy profiling. :-)&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4272939767197667332-5905887092653454255?l=linuxocarina.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/5905887092653454255'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/5905887092653454255'/><link rel='alternate' type='text/html' href='http://linuxocarina.blogspot.com/2009/10/oprofile-0xdroid-android-on-beagleboard.html' title='Oprofile 0xdroid Android on Beagleboard'/><author><name>Tick</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://lh3.google.com/ticktock35/RxbHkGdUPGI/AAAAAAAAAE0/IFbLByIbaj8/s144/tux_ocarina.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_uSgEb50CjDE/SucO2cYTmjI/AAAAAAAABDg/JSpVYiyXyuI/s72-c/Screenshot.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-4272939767197667332.post-3889895788629451760</id><published>2009-08-31T10:23:00.002+08:00</published><updated>2009-08-31T11:39:24.043+08:00</updated><title type='text'>murmur</title><content type='html'>沒什麼，太久沒寫文章，發個聲，証明自已還活著。&lt;br /&gt;&lt;br /&gt;今年是一個充滿挑戰的一年，從籌備到成立 0xlab，接受各式各樣的挑戰，同時面對各方面的問題。和一群優秀的人一起工作，做一堆沒人做過的事，真是刺激極了。&lt;br /&gt;&lt;br /&gt;這幾個月的目標是建立一個大家可以一同工作的平台，從設備到開發流程的建立。在大家的努力之下，慢慢的把一些東西建立了起來。對內做了相當多的實驗，對外則是提出了一個可以和大家一同工作的軟體平台。第一次的 code drop 之中，把 beagle-cupcake 調到可以玩，可以快速共同開發，容易整合。準備把心中的 item 慢慢一個一個完成。&lt;br /&gt;&lt;br /&gt;把基礎打好了，真正的挑戰才要開始。給自已加油，也為大家加油。&lt;br /&gt;&lt;br /&gt;這幾個月中之，發現到自已體力上的極限。刻意的放慢自已的腳步，我們是要做長做久的，不可以一下子就把自已燒掉。小心小心切記切記。對於自已一些 FOSS 的案子，真是對使用者感到抱歉，只要有時間和體力，我就會回來看的。 XD&lt;br /&gt;&lt;br /&gt;在 lab 進入軌道後，接下來最重要的目標反而是調整好自已：管理好自已的情緒，讓自已更快樂、給自已更多時間，早點下班，多運動，讓自已更健康、訓練自已的表達能力，讓自已更能夠清楚的表達出想法。&lt;br /&gt;&lt;br /&gt;希望能給大家和自已一個更好的 Tick. XD&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4272939767197667332-3889895788629451760?l=linuxocarina.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/3889895788629451760'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/3889895788629451760'/><link rel='alternate' type='text/html' href='http://linuxocarina.blogspot.com/2009/08/murmur.html' title='murmur'/><author><name>Tick</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://lh3.google.com/ticktock35/RxbHkGdUPGI/AAAAAAAAAE0/IFbLByIbaj8/s144/tux_ocarina.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4272939767197667332.post-8470945855957481252</id><published>2009-04-27T00:28:00.004+08:00</published><updated>2009-04-27T01:17:47.334+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><title type='text'>0xlab is opening</title><content type='html'>0xlab looks very like 0x'1'ab and 0x1ab is 427. Therefore we choose this day to announce our lab. :)&lt;br /&gt;&lt;a href="http://0xlab.org/"&gt;http://0xlab.org&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;We are a group of software engineers who have strong passion in Free Open Source Software. We believe the power of knowledge and creativity, and we think we can do something very interesting and valuable.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4272939767197667332-8470945855957481252?l=linuxocarina.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://0xlab.org' title='0xlab is opening'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/8470945855957481252'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/8470945855957481252'/><link rel='alternate' type='text/html' href='http://linuxocarina.blogspot.com/2009/04/0xlab-is-opening.html' title='0xlab is opening'/><author><name>Tick</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://lh3.google.com/ticktock35/RxbHkGdUPGI/AAAAAAAAAE0/IFbLByIbaj8/s144/tux_ocarina.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-4272939767197667332.post-4293628312903793666</id><published>2009-03-29T23:51:00.003+08:00</published><updated>2009-04-24T03:08:00.331+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><category scheme='http://www.blogger.com/atom/ns#' term='beagleboard'/><title type='text'>Beagleboard demo</title><content type='html'>Demo for the last four days developement.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/kca4bj4KLAU&amp;amp;hl=zh_TW&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/kca4bj4KLAU&amp;amp;hl=zh_TW&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="344" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/yAEdaj7LjgU&amp;amp;hl=zh_TW&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/yAEdaj7LjgU&amp;amp;hl=zh_TW&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="344" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4272939767197667332-4293628312903793666?l=linuxocarina.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linuxocarina.blogspot.com/feeds/4293628312903793666/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4272939767197667332&amp;postID=4293628312903793666' title='7 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/4293628312903793666'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/4293628312903793666'/><link rel='alternate' type='text/html' href='http://linuxocarina.blogspot.com/2009/03/beagleboard-demo.html' title='Beagleboard demo'/><author><name>Tick</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://lh3.google.com/ticktock35/RxbHkGdUPGI/AAAAAAAAAE0/IFbLByIbaj8/s144/tux_ocarina.png'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4272939767197667332.post-4152917356762777198</id><published>2009-03-29T03:14:00.005+08:00</published><updated>2009-03-29T18:10:19.453+08:00</updated><title type='text'>[beagleboard hacking note] HDMI monitor</title><content type='html'>I tried to use my LG TV as the monitor of beagleboard for three days, after some turning it works fine with Angstrom distribution. However, not in Android.&lt;br /&gt;I tried to hacked around the driver/video/omap/lcd_omap3beagle.c but without successful. Just cannot see the Android screenshot. :(&lt;br /&gt;After a long try, I almost sure every setting in my kernel is correct.And by checking the log, Android run very well. I thought it may be a problem from my TV, therefore I bring my beagle board to a 3C market and ask for testing a new HDMI monitor. It worked like a charm!!  Oh my god, the LG TV waste a lot of my time. :(  I bought that monitor without second though immediately.&lt;br /&gt;&lt;br /&gt;Finally, I can play Android with my beagleboard. ：－）&lt;br /&gt;&lt;table style="width: auto;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/AZuZsfTJ7rHKd9wJ19-yrg?feat=embedwebsite"&gt;&lt;img src="http://lh5.ggpht.com/_uSgEb50CjDE/Sc50Umfs1-I/AAAAAAAAAl0/zpjqAGTpspc/s144/DSCF0403.JPG" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-family: arial,sans-serif; font-size: 11px; text-align: right;"&gt;From &lt;a href="http://picasaweb.google.com/ticktock35/Beagleboard?feat=embedwebsite"&gt;beagleboard&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;But it seem need some other hack to simulate the touch panel events. I am considering write a fake device and sending touch panel event to kernel. (Is that a good idea? I doubt. Any Idea?)&lt;br /&gt;&lt;br /&gt;A tiny program read signal from rs232, and translate message to positions and write to a device, and that device triggers input event report of touch panel. XD Hmm.... It's a pure dirty hack.  Any suggestion?  I don't want to buy another touch panel. I already bought too many stuff. Orz...&lt;br /&gt;&lt;br /&gt;murmuring&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4272939767197667332-4152917356762777198?l=linuxocarina.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linuxocarina.blogspot.com/feeds/4152917356762777198/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4272939767197667332&amp;postID=4152917356762777198' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/4152917356762777198'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/4152917356762777198'/><link rel='alternate' type='text/html' href='http://linuxocarina.blogspot.com/2009/03/beagleboard-hacking-note-hdmi-monitor.html' title='[beagleboard hacking note] HDMI monitor'/><author><name>Tick</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://lh3.google.com/ticktock35/RxbHkGdUPGI/AAAAAAAAAE0/IFbLByIbaj8/s144/tux_ocarina.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_uSgEb50CjDE/Sc50Umfs1-I/AAAAAAAAAl0/zpjqAGTpspc/s72-c/DSCF0403.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4272939767197667332.post-4004068275130828704</id><published>2009-03-28T05:09:00.006+08:00</published><updated>2009-04-24T03:09:14.158+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><category scheme='http://www.blogger.com/atom/ns#' term='beagleboard'/><title type='text'>[beagleboard hacking note] OE references</title><content type='html'>OE: &lt;a href="http://oe.linuxtogo.org/"&gt;openembedded&lt;/a&gt; a very powerful and complex build system.&lt;br /&gt;&lt;a href="http://code.google.com/p/beagleboard/"&gt;beagleboard google code&lt;/a&gt; beagleboard info and download center.&lt;br /&gt;&lt;a href="http://code.google.com/p/beagleboard/wiki/HowToGetAngstromRunning"&gt;Angstrom Distribution&lt;/a&gt; a good embedded distribution maintained by Koen, and that is what I am mainly used, and hacking on.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://groups.google.com/group/beagleboard/browse_thread/thread/115867f718b52e4b/4c64b2c614622053"&gt;DSS reference&lt;/a&gt; a very good document to control the omap fbs&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;my local.conf of building beagleboard demo image&lt;br /&gt;&lt;br /&gt;Filename: local.conf&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;MACHINE = "beagleboard"&lt;br /&gt;DISTRO = "angstrom-2008.1"&lt;br /&gt;BUILD_ARCH = "x86_64"&lt;br /&gt;#INHERIT += "rm_work"&lt;br /&gt;PARALLEL_MAKE = "-j 3"&lt;br /&gt;BB_NUMBER_THREADS = "1"&lt;br /&gt;TMPDIR = "/home/tick/OE/build/tmp"&lt;br /&gt;BBFILES := "/home/tick/OE/openembedded/recipes/*/*.bb"&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&gt; bitbake beagleboard-demo-image&lt;br /&gt;and have fun&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4272939767197667332-4004068275130828704?l=linuxocarina.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linuxocarina.blogspot.com/feeds/4004068275130828704/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4272939767197667332&amp;postID=4004068275130828704' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/4004068275130828704'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/4004068275130828704'/><link rel='alternate' type='text/html' href='http://linuxocarina.blogspot.com/2009/03/beagleboard-hacking-note-oe-references.html' title='[beagleboard hacking note] OE references'/><author><name>Tick</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://lh3.google.com/ticktock35/RxbHkGdUPGI/AAAAAAAAAE0/IFbLByIbaj8/s144/tux_ocarina.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4272939767197667332.post-6378876824400777779</id><published>2009-03-28T04:42:00.004+08:00</published><updated>2009-04-24T03:09:47.490+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='beagleboard hacking note'/><category scheme='http://www.blogger.com/atom/ns#' term='bluetooth'/><category scheme='http://www.blogger.com/atom/ns#' term='pand'/><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><category scheme='http://www.blogger.com/atom/ns#' term='bnep0'/><title type='text'>[beagleboard hacking note] Bluetooth network</title><content type='html'>Because of using USB OTG mode, connecting beagleboard with keyboard and mouse. I cannot use usb0 as ethernet card. Therefore, I can use bluetooth dongle to simulate ethernet card.&lt;br /&gt;&lt;br /&gt;1. modify the kernel configure, to allow usb bluetooth dongle works.&lt;br /&gt;@@ -455,7 +455,7 @@ CONFIG_BT_HIDP=y&lt;br /&gt;#&lt;br /&gt;# Bluetooth device drivers&lt;br /&gt;#&lt;br /&gt;-# CONFIG_BT_HCIBTUSB is not set&lt;br /&gt;+CONFIG_BT_HCIBTUSB=y&lt;br /&gt;CONFIG_BT_HCIBTSDIO=y&lt;br /&gt;# CONFIG_BT_HCIUART is not set&lt;br /&gt;CONFIG_BT_HCIBCM203X=y&lt;br /&gt;&lt;br /&gt;2. After boot, plug the dongle.&lt;br /&gt;  determin if bluetooth device detected or not.&lt;br /&gt;  &gt; hcitool dev&lt;br /&gt;  scan surrounding bluetooth devices&lt;br /&gt;  &gt; hcitool scan&lt;br /&gt;If everything goes fine, we can try to connect bluetooth devices (e.g. mouse)&lt;br /&gt;&lt;br /&gt;3. make your laptop a network access point (NAP) &lt;a href="http://bluez.sourceforge.net/contrib/HOWTO-PAN"&gt; a very good document you should check&lt;/a&gt;&lt;br /&gt; On your laptop with bluetooth RF on&lt;br /&gt;   a. turn off /etc/init.d/bluetooth&lt;br /&gt;      &gt; /etc/init.d/bluetooth stop&lt;br /&gt;   b. modprobe bnep&lt;br /&gt;   c. pand -s -r NAP&lt;br /&gt; On beagleboard:&lt;br /&gt;  a. finding the baddr of your laptop&lt;br /&gt;   &gt; hcitool scan&lt;br /&gt;  b.connect to your laptop&lt;br /&gt;   &gt;pand -c XX:XX:XX:XX:XX:XX:XX&lt;br /&gt;  c. Setup your beagleboard network&lt;br /&gt;     &gt; ifconfig bnep0 192.168.0.202&lt;br /&gt;     &gt; route add default gw 192.168.0.200&lt;br /&gt;  d. On your laptop set, let your laptop becomes an NAT gateway:&lt;br /&gt;     &gt; ifconfig bnep0 192.168.0.200&lt;br /&gt;     &gt; echo 1 &gt; /proc/sys/net/ipv4/ip_forward&lt;br /&gt;     &gt; iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE&lt;br /&gt;Enjoy the wireless network :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4272939767197667332-6378876824400777779?l=linuxocarina.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linuxocarina.blogspot.com/feeds/6378876824400777779/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4272939767197667332&amp;postID=6378876824400777779' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/6378876824400777779'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/6378876824400777779'/><link rel='alternate' type='text/html' href='http://linuxocarina.blogspot.com/2009/03/beagleboard-hacking-note-bluetooth.html' title='[beagleboard hacking note] Bluetooth network'/><author><name>Tick</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://lh3.google.com/ticktock35/RxbHkGdUPGI/AAAAAAAAAE0/IFbLByIbaj8/s144/tux_ocarina.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4272939767197667332.post-2395466132884507730</id><published>2009-03-28T04:31:00.003+08:00</published><updated>2009-04-24T03:10:25.519+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><category scheme='http://www.blogger.com/atom/ns#' term='beagleboard'/><title type='text'>[beagleboard hacking note] USB OTG line</title><content type='html'>Beagleboard supports &lt;a href="http://www.usb.org/developers/onthego/"&gt;USB OTG mode&lt;/a&gt;, however beagleboard cannot run OTG mode with normal 5 pin mini USB lines.&lt;br /&gt;&lt;br /&gt;It needs to short pin 4 and 5. and so that you can play with OTG mode. Therefore I bought a B type mini usb line and remove the cover and short pin 4 and 5, and I can play with OTG mode happily.&lt;br /&gt;&lt;br /&gt;&lt;table style="width: auto;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/oiOHhf-eiD47gfHC9xAQkg?feat=embedwebsite"&gt;&lt;img src="http://lh6.ggpht.com/_uSgEb50CjDE/Sc02CoGaQUI/AAAAAAAAAhg/4OuIhrbQIgY/s144/DSCF0393.JPG" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-family: arial,sans-serif; font-size: 11px; text-align: right;"&gt;From &lt;a href="http://picasaweb.google.com/ticktock35/Beagleboard?feat=embedwebsite"&gt;beagleboard&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;table style="width: auto;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/XcP6AX7inMODMikXiUEYfA?feat=embedwebsite"&gt;&lt;img src="http://lh3.ggpht.com/_uSgEb50CjDE/Sc02E4VimfI/AAAAAAAAAhw/goNvg7DKcOg/s144/DSCF0395.JPG" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-family: arial,sans-serif; font-size: 11px; text-align: right;"&gt;From &lt;a href="http://picasaweb.google.com/ticktock35/Beagleboard?feat=embedwebsite"&gt;beagleboard&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;BTW, beagleboard can play as client with normal mini usb to USB A line as ethernet card. (USB0)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4272939767197667332-2395466132884507730?l=linuxocarina.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linuxocarina.blogspot.com/feeds/2395466132884507730/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4272939767197667332&amp;postID=2395466132884507730' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/2395466132884507730'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/2395466132884507730'/><link rel='alternate' type='text/html' href='http://linuxocarina.blogspot.com/2009/03/beagleboard-hacking-note-usb-otg-line.html' title='[beagleboard hacking note] USB OTG line'/><author><name>Tick</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://lh3.google.com/ticktock35/RxbHkGdUPGI/AAAAAAAAAE0/IFbLByIbaj8/s144/tux_ocarina.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_uSgEb50CjDE/Sc02CoGaQUI/AAAAAAAAAhg/4OuIhrbQIgY/s72-c/DSCF0393.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4272939767197667332.post-2431979034159928856</id><published>2009-03-28T03:49:00.005+08:00</published><updated>2009-04-24T03:10:57.214+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><category scheme='http://www.blogger.com/atom/ns#' term='beagleboard'/><title type='text'>[beagleboard hacking note] Null modem</title><content type='html'>The first step of hacking beagleboard. You need to connect to beagleboard first.&lt;br /&gt;．You will need a &lt;a href="http://en.wikipedia.org/wiki/Null_modem"&gt;null modem&lt;/a&gt; line to connect &lt;a href="http://picasaweb.google.com/lh/photo/r9FA9BxgOKXZoaN5LmohBw?feat=directlink"&gt;beagleboard RS232 port&lt;/a&gt; and your PC.&lt;br /&gt;&lt;br /&gt;My way is very straight forward: just buy a USB to RS232 line, three thin wires, one 2.5mm 5x2 pin slot, and a RS232 female head.&lt;br /&gt;&lt;br /&gt;&lt;table style="width: auto;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/m4xp2JZKPEgrDnQXnF0SPg?feat=embedwebsite"&gt;&lt;img src="http://lh5.ggpht.com/_uSgEb50CjDE/Sc02IkVpXdI/AAAAAAAAAig/Zltfd6WlqJU/s144/DSCF0401.JPG" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-family: arial,sans-serif; font-size: 11px; text-align: right;"&gt;From &lt;a href="http://picasaweb.google.com/ticktock35/Beagleboard?feat=embedwebsite"&gt;beagleboard&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Actually you only need to connect three wires, pin2 pin3 and pin5, and remember switch pin 2 and 3. &lt;a href="http://elinux.org/upload/2/2c/Flyswatter-ti-uart.pdf"&gt; Check here!&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;After made the line for beagleboard, you can use cu , minicom, or even screen to connect beagleboard. Baud rate is 115200n8.&lt;br /&gt;&lt;br /&gt;&lt;table style="width: auto;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/LeGifTEJz3szGKLgwqzwwg?feat=embedwebsite"&gt;&lt;img src="http://lh3.ggpht.com/_uSgEb50CjDE/Sc02B4yubFI/AAAAAAAAAhY/qzn7XEFcbyg/s144/DSCF0392.JPG" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-family: arial,sans-serif; font-size: 11px; text-align: right;"&gt;From &lt;a href="http://picasaweb.google.com/ticktock35/Beagleboard?feat=embedwebsite"&gt;beagleboard&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Therefore you can access the beagleboard u-boot and console.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4272939767197667332-2431979034159928856?l=linuxocarina.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linuxocarina.blogspot.com/feeds/2431979034159928856/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4272939767197667332&amp;postID=2431979034159928856' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/2431979034159928856'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/2431979034159928856'/><link rel='alternate' type='text/html' href='http://linuxocarina.blogspot.com/2009/03/beagleboard-hacking-note-null-modem.html' title='[beagleboard hacking note] Null modem'/><author><name>Tick</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://lh3.google.com/ticktock35/RxbHkGdUPGI/AAAAAAAAAE0/IFbLByIbaj8/s144/tux_ocarina.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_uSgEb50CjDE/Sc02IkVpXdI/AAAAAAAAAig/Zltfd6WlqJU/s72-c/DSCF0401.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4272939767197667332.post-3219539809730520151</id><published>2009-03-15T13:04:00.010+08:00</published><updated>2009-03-16T08:44:09.891+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Taipei App Engine Sprint 2009'/><title type='text'>Taipei App Engine Sprint 2009</title><content type='html'>感謝 Ping 的邀請，我們團隊的其中&lt;a href="http://picasaweb.google.com/lh/photo/90wTf3IT3QGeEiqOwQMAUQ?feat=directlink"&gt;三人&lt;/a&gt;昨天去 &lt;a href="http://picasaweb.google.com/lh/photo/3ha4KY1yifqK1khuTWDwuQ?feat=directlink"&gt;Google&lt;/a&gt; 玩了一整天。&lt;br /&gt;也做了一個&lt;a href="http://sighthistory.appspot.com/"&gt;小玩具&lt;/a&gt; （我就知道大家會把它拿來找正妹）和大家分享。&lt;br /&gt;享受了腦力激盪、高速開發及實踐想像力的快感。&lt;br /&gt;當然，也吃了過量的 Hogan Doz，和鼎泰豐。&lt;br /&gt;感謝 Google Taipei 舉辦這個好玩的活動。&lt;br /&gt;對我們來說是一次非常好的經驗。&lt;br /&gt;&lt;br /&gt;感謝大家的欣賞我們的作品和團員之間的無間合作，很高興得到了比賽的第一名。&lt;br /&gt;特別感謝昨日加入我們的 Denial ，補足了我們在於 Web design 經驗上的不足。&lt;br /&gt;畢竟，一群做 Linux Embedded System 的人突然跑來玩 Web，缺乏相當多的 domain knowledge。&lt;br /&gt;&lt;br /&gt;昨天不只一次被問到：你們是如何做到一天之內衝出一個網站的？  你們是如何分工的？&lt;br /&gt;&lt;br /&gt;其實這也道出了相當多人的相同問題。&lt;br /&gt;這個問題回家想了很後，其實我的答案還是：團隊合作。&lt;br /&gt;&lt;br /&gt;事實上大家都知道團隊合作的重要性，可是不知道如何做到。&lt;br /&gt;其實，我個人認為這是沒有標準答案的。&lt;br /&gt;&lt;br /&gt;試著把自已的想法寫下來，供自已分析和與大家分享。&lt;br /&gt;&lt;br /&gt;人最重要：&lt;br /&gt;當初決定留在台灣，就是抱著一個願望：在台灣，打造出一個有國際一流水準的軟體團隊。&lt;br /&gt;我個人對於自已的 career path 的許多重大決定也是為了完成這個夢想。&lt;br /&gt;很幸運的，在多年的尋覓之後，我們找到了一些有共同想法的伙伴，一群想追求一流而且真的很努力的 FOSS developer 找到了彼此，組成團隊。&lt;br /&gt;&lt;br /&gt;事實上，我們之中的任何一個人，都是可以獨當一面的軟體工程師，技術能力也和歐美 hackers 同步。但我們也相當了解，在現在的軟體世界中，要和世界一流的團隊比，我們每個人的時間體力和專長真的不夠多。要真的做出什麼，我們必需互相信賴。&lt;br /&gt;每一個人的專長都不相同，興趣領域也不同，不過都有所專精。&lt;br /&gt;最重要的，信任和分享是我們相當大的特色。&lt;br /&gt;&lt;br /&gt;John 特色擅長於洞悉情勢，有相當驚人的觀察力，對問題提出精確的看法&lt;br /&gt;Tick 擅長結構性的思考，演算法選用，軟體系統架構分析和軟體風險估計及開發&lt;br /&gt;Olv  對於新技術的理解能力一流，對於面對的技術可以快速的確實掌握&lt;br /&gt;Erin 擅長提出破壞性思考，提供大家不同面向的思考和刺激&lt;br /&gt;Jeremy 擅長把任務完成，面對問題可提出相當好的分析和實作&lt;br /&gt;Julian 擅長於感性的思考，為技術帶來來自外太空的創意和美感&lt;br /&gt;&lt;br /&gt;昨天是 Olv, Erin 和我三人受邀參加活動。面對這個題目，三人對於 App engine 各自 survey 結束後，我們開了一次的 brain storm meeting。我可以對不同題目所需要的技術可以快速的提供 scope 和風險分析，而 Erin 提出了相當多很有意思的想法和 Idea，Olv 很快速的理解問題的核心並提出更進一步的看法。當 Erin 說出 "依時間搜尋照片" 七個字時，我和 Olv 兩人都突然不說話了，思考著這個 idea 的可能性。害 Erin 以為這個 idea 不好。我和 Olv異口同聲的說出，“不，這個 idea 很棒。” 是的，這個題目的可能性很高，還不知有人做過，資料相依性應該很高，也是我們能力所及的。&lt;br /&gt;再來就依著這個題目開始做了各種可能性的 brain storm。這是一個我們三個人一天可以做完的題目，我列出這個題目及各種可能性所需的所有技術項目，針對各個項目提出可選擇的技術和風險分析，Olv 針對著這題目提出許多更進一步的看法，和可能性。我們最大的風險是，我們沒有 html 和 javascript 的專長。&lt;br /&gt;題目和項目決定後，我提出一個可以從很小很小的結構開始長大的軟體架構提出 API，把所有問題切成小塊小塊的，並立刻把 framework 實作出來。一個小時後， Olv 和 Erin 就可以進入開發，大約在兩個小時內，我們已經進入遞迴開發的階段，我維持軟體架構的彈性，Olv 神快的把每個小問題解掉，並找出我沒有想清楚的地方提出漂亮的修正。&lt;br /&gt;很幸運的，昨天在活動中找到了一位 web 的開發者 Denial 加入我們的開發，對於 html 及javascript 的風險立刻變得相當的低。活動開始後，我們立刻把開發環境架好，開始把針對 web 這方面開始開發。並提出每個項目完成優先順續，和重要性，並把工作分配下去。在開發中，我們快速的交換各自分配到的 topic 所學到的 infomation。提出問題，和分享自已所了解的東西。其中&lt;a href="http://picasaweb.google.com/lh/photo/msLUx7GRlf-oH7SNKAru1w?feat=directlink"&gt;“腦力激盪、分析、尋找答案、提出想法、實作”&lt;/a&gt;是不停的約以一個小時為週期巡迴發生。開始兩個多小時後我分配到的部份就做完了，過沒多久 Olv 的部份也實作完成，再來就開始把 nice to have 的部份一一補上，測試，美化以及互相 support。幫忙把沒做完的地方做出來。&lt;br /&gt;因為得到了 Denial 的技術支援，和 Google Jeff 的 information sharing，我們做出來的比&lt;br /&gt;本來估三人個可以做到的部份還要多。還把本來列為 nice to have 的地理資訊部份實作了出來。Olv 在完成工作後，也開始發揮幽默，把我們本來很工程師的形式的網頁改寫成山寨 Google theme。最後兩小時，大家全力衝刺收尾和 javascript 的部份。&lt;br /&gt;&lt;br /&gt;這也是我們團隊成員第一次一起參加這種限時的軟體比賽，証明了我們的團隊能力，對於我們團隊有相當大鼓舞作用，也一再的讓我們深深的體會到，雖然每個人的能力都很不錯，如果能團隊運作起來威力是加乘的。&lt;br /&gt;&lt;br /&gt;最後，感謝 Google 舉辦這個活動，和大家的欣賞。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4272939767197667332-3219539809730520151?l=linuxocarina.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linuxocarina.blogspot.com/feeds/3219539809730520151/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4272939767197667332&amp;postID=3219539809730520151' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/3219539809730520151'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/3219539809730520151'/><link rel='alternate' type='text/html' href='http://linuxocarina.blogspot.com/2009/03/taipei-app-engine-sprint-2009.html' title='Taipei App Engine Sprint 2009'/><author><name>Tick</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://lh3.google.com/ticktock35/RxbHkGdUPGI/AAAAAAAAAE0/IFbLByIbaj8/s144/tux_ocarina.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4272939767197667332.post-1982858342315410178</id><published>2009-01-12T16:41:00.006+08:00</published><updated>2009-01-13T01:04:57.845+08:00</updated><title type='text'>Eagle outside my window!</title><content type='html'>When I was thinking about an algorithm of project at home. I heard some noise just outside the window. All my cats were rushing around like crazy. After some while, the noise does not stop, and I decide to take a look about that. I was stunned by what I saw. An eagle is just standing out side my window, eating a dove!! I live in Taipei, a mega-city without eagle for a long long time. When I was a boy, I live in the suburb of a small city, Chai-Yi, there were always eagle on the sky. I have not seen eagle in nature for a long time since I move to Taipei.&lt;br /&gt;Suddenly, a eagle is standing out side my window. I am so surprised about this. Maybe the environment is getting better gradually.&lt;br /&gt;It eyes are so beautiful, I have never observe an eagle so closely, less the 1 meteor. But while it's eating, it remind me it's a hunter. It can kill my cats easily with it's claw. This point made me a little bit nervous. Anyway beside of this, I am very happy to see an eagle out side the window.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_uSgEb50CjDE/SWsPhdlk8LI/AAAAAAAAAQY/OfoLCeBLvWo/s1600-h/DSC00470.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 240px; height: 320px;" src="http://3.bp.blogspot.com/_uSgEb50CjDE/SWsPhdlk8LI/AAAAAAAAAQY/OfoLCeBLvWo/s320/DSC00470.JPG" alt="" id="BLOGGER_PHOTO_ID_5290339254829117618" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_uSgEb50CjDE/SWsPZvfGvoI/AAAAAAAAAQQ/nmi8vhVYlV8/s1600-h/DSC00472.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 167px; height: 203px;" src="http://2.bp.blogspot.com/_uSgEb50CjDE/SWsPZvfGvoI/AAAAAAAAAQQ/nmi8vhVYlV8/s320/DSC00472.JPG" alt="" id="BLOGGER_PHOTO_ID_5290339122194857602" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_uSgEb50CjDE/SWsPR2mAR-I/AAAAAAAAAQI/AWnVr_6IquU/s1600-h/DSC00452.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px; height: 240px;" src="http://1.bp.blogspot.com/_uSgEb50CjDE/SWsPR2mAR-I/AAAAAAAAAQI/AWnVr_6IquU/s320/DSC00452.JPG" alt="" id="BLOGGER_PHOTO_ID_5290338986663888866" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4272939767197667332-1982858342315410178?l=linuxocarina.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linuxocarina.blogspot.com/feeds/1982858342315410178/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4272939767197667332&amp;postID=1982858342315410178' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/1982858342315410178'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/1982858342315410178'/><link rel='alternate' type='text/html' href='http://linuxocarina.blogspot.com/2009/01/eagle-outside-my-widow.html' title='Eagle outside my window!'/><author><name>Tick</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://lh3.google.com/ticktock35/RxbHkGdUPGI/AAAAAAAAAE0/IFbLByIbaj8/s144/tux_ocarina.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_uSgEb50CjDE/SWsPhdlk8LI/AAAAAAAAAQY/OfoLCeBLvWo/s72-c/DSC00470.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4272939767197667332.post-1367962874389829877</id><published>2009-01-02T14:38:00.001+08:00</published><updated>2009-01-02T14:40:26.080+08:00</updated><title type='text'>My color</title><content type='html'>&lt;div style="width:300px; background:white; color:black; padding: 10px;text-align:center; border: 1px solid #333333;"&gt;Your rainbow is shaded&lt;b&gt; blue.&lt;/b&gt;&lt;br&gt;&lt;br&gt;&lt;div style="background: #804d80"&gt;&amp;nbsp;&lt;/div&gt;&lt;div style="background: #80a280"&gt;&amp;nbsp;&lt;/div&gt;&lt;div style="background: #80cc80"&gt;&amp;nbsp;&lt;/div&gt;&lt;div style="background: #00bb80"&gt;&amp;nbsp;&lt;/div&gt;&lt;div style="background: #0099ff"&gt;&amp;nbsp;&lt;/div&gt;&lt;div style="background: #004dff"&gt;&amp;nbsp;&lt;/div&gt;&lt;div style="background: #554dff"&gt;&amp;nbsp;&lt;/div&gt;&lt;br&gt;What is says about you: You are a tranquil person. You appreciate friends who get along with one another. You share hobbies with friends and like trying to fit into their routines.&lt;br&gt;&lt;br&gt;&lt;a href="http://spacefem.com/quizzes/rainbow"&gt;Find the colors of your rainbow at spacefem.com.&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;還蠻妙的~&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4272939767197667332-1367962874389829877?l=linuxocarina.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linuxocarina.blogspot.com/feeds/1367962874389829877/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4272939767197667332&amp;postID=1367962874389829877' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/1367962874389829877'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/1367962874389829877'/><link rel='alternate' type='text/html' href='http://linuxocarina.blogspot.com/2009/01/your-rainbow-is-shaded-blue.html' title='My color'/><author><name>Tick</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://lh3.google.com/ticktock35/RxbHkGdUPGI/AAAAAAAAAE0/IFbLByIbaj8/s144/tux_ocarina.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4272939767197667332.post-3531562843068169036</id><published>2008-12-27T20:47:00.008+08:00</published><updated>2008-12-27T23:19:52.519+08:00</updated><title type='text'>墨子</title><content type='html'>近來看到了一些事。感謝友人介紹墨子給我。以古鑒今，讀得我汗流直下…不得不佩服古人的智慧，真的是真知灼見。歷史果然是以不同的面貌一再重演。今日看著一些人花了大把大把的銀子，得到的卻是一個謊言。雖然花了很多工夫來說服自己，這些是別人的錢，而且這也不在手臂範圍內，在自己的範圍內對得起自己，對得起投資人。投資人也不是笨蛋，如果事態這麼明顯了還看不出來，他們自己就要承受風險。看著台灣投資人的錢就這樣的被糟蹋，揮霍，心裏相當的難過。&lt;br /&gt;一場大卡司的真實戲碼在眼前上映著，一面難過著一個看似美好的機會在眼前破滅, 也一面慶興著自己在年輕之時就可以上到這麼昂貴的一課，學到相當寶貴的經驗。更加了解在夢想這條路上有那些陷阱，和風險。在這場大卡司的戲碼中，看著一個有理想有才華的人被小人包圍，看著他的恐懼、看著他逃避、封閉自我、在精神上吸毒、不停的欺騙、最後沉淪，變得和他身旁的人沒兩樣。我們雖然被一些人欺騙、惡搞、看似受害者，雖然我們幫不上什麼忙，在這恐怖的經驗之中替他感到痛心，替投資時間、金錢於他的人感到可惜，也學得深刻的教訓，也許能保持自我且依然年輕的我們才是最大的受益者。&lt;br /&gt;&lt;br /&gt;這讓我想起了第一份工作的公司所標榜的企業精神："&lt;span style="font-weight: bold;"&gt;誠信正直&lt;/span&gt;"。真的說得很好。&lt;br /&gt;&lt;br /&gt;夢想讓我們充滿熱情、創意讓我們與眾不同、技術讓我們拿到門票、運氣讓我們得以進入門檻，而要真正的成功：“誠信正直” 真的很重要。&lt;br /&gt;&lt;br /&gt;這真的很難，也很重要。我想…成功的人那麼少，也許就是要真正落實實在太難了吧，不然也不用拿出來標榜。&lt;br /&gt;修鍊、修鍊…&lt;br /&gt;&lt;br /&gt;國高中時，完全不讀不下去的古文。沒想到在經歷了一些事之後，讀起來卻是異常的深刻…熟悉…&lt;br /&gt;念書、念書…&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;墨子、卷一&lt;/h2&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;親士&lt;/span&gt;&lt;br /&gt;入國而不存其士，則亡國矣。見賢而不急，則緩其君矣。非賢無急，非士無與慮國，緩賢忘士而能以其國存者，未曾有也。&lt;br /&gt;&lt;br /&gt;昔者文公出走而正天下，桓公去國而霸諸侯，越王句踐遇吳王之醜，而尚攝中國之賢君。三子之能達名成功於天下也，皆於其國抑而大醜也。太上無敗，其次敗而有以成，此之謂用民。&lt;br /&gt;&lt;br /&gt;吾聞之曰：“非無安居也，我無安心也。非無足財也，我無足心也。”是故君子自難而易彼，眾人自易而難彼，君子進不敗其志，內究其情，雖雜庸民，終無怨心， 彼有自信者也。是故為其所難者，必得其所欲焉，未聞為其所欲，而免其所惡者也。是故偪臣傷君，諂下傷上。君必有弗弗之臣，上必有詻詻之下。分議者延延，而 支苟者詻詻，焉可以長生保國。&lt;br /&gt;&lt;br /&gt;臣下重其爵位而不言，近臣則喑，遠臣則唫，怨結於民心，諂諛在側，善議障塞，則國危矣。桀紂不以其無天下之士邪？殺其身而喪天下。故曰：“歸國寶，不若獻賢而進士。&lt;br /&gt;&lt;br /&gt;今有五錐，此其銛，銛者必先挫。有五刀，此其錯，錯者必先靡，是以甘井近竭，招木近伐，靈龜近灼，神蛇近暴。是故比干之殪，其抗也；孟賁之殺，其勇也；西施之沈，其美也；吳起之裂，其事也。故彼人者，寡不死其所長，故曰：“太盛難守也。”&lt;br /&gt;&lt;br /&gt;故雖有賢君，不愛無功之臣；雖有慈父，不愛無益之子。是故不勝其任而處其位，非此位之人也；不勝其爵而處其祿，非此祿之主也。良弓難張，然可以及高入深； 良馬難乘，然可以任重致遠；良才難令，然可以致君見尊。是故江河不惡小谷之滿己也，故能大。聖人者，事無辭也，物無違也，故能為天下器。是故江河之水，非 一水之源也。千鎰之裘，非一狐之白也。夫惡有同方取不取同而已者乎？蓋非兼王之道也。是故天地不昭昭，大水不潦潦，大火不燎燎，王德不堯堯者，乃千人之長也。&lt;br /&gt;&lt;br /&gt;其直如矢，其平如砥，不足以覆萬物，是故溪陝者速涸，逝淺者速竭，墝埆者其地不育。王者淳澤不出宮中，則不能流國矣。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;修身&lt;/span&gt;&lt;br /&gt;君子戰雖有陳，而勇為本焉。喪雖有禮，而哀為本焉。士雖有學，而行為本焉。是故置本不安者，無務豐末。近者不親，無務來遠。親戚不附，無務外交。事無終始，無務多業。舉物而闇，無務博聞。&lt;br /&gt;&lt;br /&gt;是故先王之治天下也，必察邇來遠，君子察邇而邇脩者也。見不脩行，見毀，而反之身者也，此以怨省而行脩矣。譖慝之言，無入之耳，批扞之聲，無出之口，殺傷人之孩，無存之心，雖有詆訐之民，無所依矣。&lt;br /&gt;&lt;br /&gt;是故君子力事日彊，願欲日逾，設壯日盛。君子之道也，貧則見廉，富則見義，生則見愛，死則見哀。四行者不可虛假，反之身者也。藏於心者，無以竭愛。動於心者，無以竭恭。出於口者，無以竭馴。暢之四支，接之肌膚，華髮隳顛，而猶弗舍者，其唯聖人乎！&lt;br /&gt;&lt;br /&gt;志不彊者智不達，言不信者行不果。據財不能以分人者，不足與友。守道不篤，偏物不博，辯是非不察者，不足與游。本不固者末必幾，雄而不脩者，其後必惰，源濁者流不清，行不信者名必秏。 名不徒生而譽不自長，功成名遂，名譽不可虛假，反之身者也。務言而緩行，雖辯必不聽。多力而伐功，雖勞必不圖。慧者心辯而不繁說，多力而不伐功，此以名譽 揚天下。言無務多而務為智，無務為文而務為察。故彼智無察，在身而情，反其路者也。善無主於心者不留，行莫辯於身者不立。名不可簡而成也，譽不可巧而立 也，君子以身戴行者也。思利尋焉，忘名忽焉，可以為士於天下者，未嘗有也。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;所染&lt;/span&gt;&lt;br /&gt;子墨子言見染絲者而嘆曰：“染於蒼則蒼，染於黃則黃。所入者變，其色亦變。五入必而已，則為五色矣。故染不可不慎也。”&lt;br /&gt;&lt;br /&gt;非獨染絲然也，國亦有染。舜染於許由、伯陽、禹染於皋陶、伯益，湯染於伊尹、仲虺，武王染於太公、周公。此四王者所染當，故王天下，立為天子，功名蔽天地。舉天下之仁義顯人，必稱此四王者。&lt;br /&gt;&lt;br /&gt;夏桀染於干辛、推哆，殷紂染於崇侯、惡來，厲王染於厲公長父、榮夷終，幽王染於傅公夷、蔡公穀。此四王者所染不當，故國殘身死，為天下僇。舉天下不義辱人，必稱此四王者。&lt;br /&gt;&lt;br /&gt;齊桓染於管仲、鮑叔，晉文染於舅犯、高偃，楚莊染於孫叔、沈尹，吳闔閭染於伍員、文義，越句踐染於范蠡大夫種。此五君者所染當，故霸諸侯，功名傅於後世。&lt;br /&gt;&lt;br /&gt;范吉射染於長柳朔、王胜，中行寅染於籍秦、高彊，吳夫差染於王孫雒、太宰嚭，智伯搖染於智國、張武，中山尚染於魏義、偃長，宋康染於唐鞅、佃不禮。此六君者所染不當，故國家殘亡，身為刑戮，宗廟破滅，絕無後類，君臣離散，民人流亡。舉天下之貪暴苛擾者，必稱此六君也。&lt;br /&gt;&lt;br /&gt;凡君之所以安者，何也？以其行理也，行理性於染當。故善為君者，勞於論人，而佚於治官。不能為君者，傷形費神，愁心勞意，然國逾危，身逾辱。此六君者，非不重其國，愛其身也，以不知要故也。不知要者，所染不當也。&lt;br /&gt;&lt;br /&gt;非獨國有染也，士亦有染。其友皆好仁義，淳謹畏令，則家日益，身日安，名日榮，處官得其理矣，則段干木、禽子、傅說之徒是也。其友皆好矜奮，創作比周，則家日損，身日危，名日辱，處官失其理矣，則子西、易牙、豎刀之徒是也。《詩》曰：“必擇所堪。”必謹所堪者，此之謂也。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;法儀&lt;/span&gt;&lt;br /&gt;子墨子曰：“天下從事者，不可以無法儀，無法儀而其事能成者無有也。雖至士之為將相者，皆有法，雖至百工從事者，亦皆有法。百工為方以矩，為圓以規，衡以水，直以繩，正以縣。無巧工、不巧工，皆以此五者為法。巧者能中之，不巧者雖不能中，放依以從事，猶逾己。故百工從事，皆有法所度。”&lt;br /&gt;&lt;br /&gt;今大者治天下，其次治大國，而無法所度，此不若百工辯也。然則奚以為治法而可？當皆法其父母，奚若？天下為 父母者眾，而仁者寡，若皆法其父母，此法不仁也。法不仁不可以為法，當皆法其學，奚若？天下之為學者眾，而仁者寡，若皆法其學，此法不仁也。法不仁不可以 為法，當皆法其君，奚若？天下之為君者眾，而仁者寡，若皆法其君，此法不仁也。法不仁不可以為法。故父母、學、君三者，莫可以為治法。&lt;br /&gt;&lt;br /&gt;然則奚以為治法而可？故曰莫若法天。天之行廣而無私，其施厚而不德，其明久而不衰，故聖王法之。既以天為法，動作有為，必度於天，天之所欲則為之，天所不 欲則止。然而天何欲何惡者也？天必欲人之相愛相利，而不欲人之相惡相賊也。奚以知天之欲人之相愛相利，而不欲人之相惡相賊也？以其兼而愛之，兼而利之也。 奚以知天兼而愛之，兼而利之也？以其兼而有之，兼而食之也。&lt;br /&gt;&lt;br /&gt;今天下無大小國，皆天之邑也。人無幼長貴賤，皆天之臣也。此以莫不犓羊牛、豢犬豬，絜為酒醴粢盛，以敬事天，此不為兼而有之，兼而食之邪？天苟兼而有食之，夫奚說以不欲人之相愛相利也？故曰：“愛人利人者，天必福之，惡人賊人者，天必禍之。”曰：“殺不辜者，得不祥焉。夫奚說人為其相殺而天與禍乎？是以知天欲人相愛相利，而不欲人相惡相賊也。”&lt;br /&gt;&lt;br /&gt;昔之聖王禹、湯、文、武，兼愛天下之百姓，率以尊天事鬼，其利人多，故天福之，使立為天子，天下諸侯皆賓事之。暴王桀、紂、幽、厲，兼惡天下之百姓，率以詬天侮鬼。其賊人多，故天禍之，使遂失其國家，身死為僇於天下。後世子孫毀之，至今不息。故為不善以得禍者，桀、紂、幽、厲是也。愛人利人以得福者，禹、湯、文、武是也。愛人利人以得福者有矣，惡人賊人以得禍者亦有矣！&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;七患&lt;/span&gt;&lt;br /&gt;子墨子曰：國有七患。七患者何？城郭溝池不可守而治宮室，一患也。邊國至境四鄰莫救，二患也。先盡民力無用之功，賞賜無能之人，民力盡於無用，財寶虛於待客，三患也。仕者持祿，游者愛佼，君脩法討臣，臣懾雨不敢拂，四患也。君自以為聖智而不問事，自以為安彊而無守備，四鄰謀之不知戒，五患也。所信不忠，所忠不信，六患也。畜種菽粟不足以食之，大臣不足以事之，賞賜不能喜，誅罰不能威，七患也。以七患居國，必無社稷；以七患守城，敵至國傾。七患之所當，國必有殃。&lt;br /&gt;&lt;br /&gt;凡五穀者，民之所仰也，君之所以為養也。故民無仰則君無養，民無食則不可事。故食不可不務也，地不可不力也，用不可不節也。五穀盡收，則五味盡御於主，不 盡收則不盡御。一穀不收謂之饉，二穀不收謂之旱，三穀不收謂之凶，四穀不收謂之餽，五穀不收謂之饑。歲饉，則仕者大夫以下皆損祿五分之一。旱，則損五分之 二。凶則損五分之三。餽，則損五分之四。饑，則盡無祿，稟食而已矣。故凶饑存乎國，人君徹鼎食五分之三，大夫徹縣，士不入學，君朝之衣不革制，諸侯之客，四鄰之使，雍飧而不盛，徹驂騑，塗不芸，馬不食粟，婢妾不衣帛，此告不足之至也。&lt;br /&gt;&lt;br /&gt;今有負其子而汲者，隊其子於井中，其母必從而道之。今歲凶，民饑道餓，重其子此疚於隊，其可無察邪？故時年歲善，則民仁且良；時年歲凶，則民吝且惡。夫民 何常此之有？為者疾，食者眾，則歲無豐。故曰：“財不足則反之時，食不足則反之用。”故先民以時生財，固本而用財，則財足。故雖上世之聖王，豈能使五穀常 收而旱水不至哉？然而無凍餓之民者，何也？其力時急而自養儉也。故《夏書》曰：“禹七年水。”《殷書》曰：“湯五年旱。”此其離凶餓甚矣。然而民不凍餓者，何也？其生財密，其用之節也。&lt;br /&gt;&lt;br /&gt;故倉無備粟，不可以待凶饑；庫無備兵，雖有義不能征無義；城郭不備全，不可以自守；心無備 慮，不可以應卒。是若慶忌無去之心，不能輕出。夫桀無待湯之備，故放；紂無待武之備，故殺。桀、紂貴為天子，富有天下，然而皆滅亡於百里之君者，何也？有 富貴而不為備也。故備者，國之重也；食者，國之寶也；兵者，國之爪也。城者所以自守也。此三者國之具也。&lt;br /&gt;&lt;br /&gt;故曰：以其極賞，以賜無功，虛其府庫，以備車馬、衣裘、奇怪，苦其役徒，以治宮室觀樂；死又厚為棺槨，多為衣裘。生時治臺榭，死又脩墳墓。故民苦於外，府庫單於內，上不厭其樂，下不堪其苦。故國離寇敵則傷，民見凶饑則亡，此皆備不具之罪也。且夫食者，聖人之所寶也。故《周書》曰：“國無三年之食者，國非其國也；家無三年之食者，子非其子也。”此之謂國備。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;辭過&lt;/span&gt;&lt;br /&gt;子墨子曰：古之民，未知為宮室時，就陵阜而居，穴而處，下潤濕傷民，故聖王作為宮室。為宮室之法，曰：室高足以辟潤濕，邊足以圉風寒，上足以待雪霜雨露，宮牆之高，足以別男女之禮，謹此則止。凡費財勞力，不加利者，不為也。役，脩其城郭，則民勞而不傷；以其常正，收其租稅，則民費而不病。民所苦者非此也，苦於厚作斂於百姓。是故聖王作為宮室，便於生，不以為觀樂也。作為衣服帶履，便於身，不以為辟怪也，故節於身，誨於民，是以天下之民可得而治，財用可得而足。&lt;br /&gt;&lt;br /&gt;當今之主，其為宮室則與此異矣。必厚作斂於百姓，暴奪民衣食之財，以為宮室，臺榭曲直之望，青黃刻鏤之飾。為宮室若此，故左右皆法象之，是以其財不足以待凶饑、振孤寡，故國貧而民難治也。君實欲天下之治，而惡其亂也，當為宮室不可不節。&lt;br /&gt;&lt;br /&gt;古之民，未知為衣服時，衣皮帶茭，冬則不輕而溫，夏則不輕而凊。聖王以為不中人之情，故作誨婦人治絲麻，梱布絹，以為民衣。為衣服之法：冬則練帛之中，足以為輕且暖；夏則絺綌之中，足以為輕且凊，謹此則止。故聖人之為衣服，適身體和肌膚而足矣。非榮耳目而觀愚民也。當是之時，堅車良馬不知貴也，刻鏤文采，不知喜也。何則？其所道之然。故民衣食 之財，家足以待旱水凶饑者，何也？得其所以自養之情，而不感於外也。是以其民儉而易治，其君用財節而易贍也。府庫實滿，足以待不然。兵革不頓，士民不勞， 足以征不服。故霸王之業，可行於天下矣。&lt;br /&gt;&lt;br /&gt;當今之主，其為衣服則與此異矣，冬則輕煥，夏則輕凊，皆已具矣。必厚作斂於百姓，暴奪民衣食之財，以為錦繡文采靡曼之衣，鑄金以為鉤，珠玉以為珮，女工作文采，男工作刻鏤，以為身服，此非云益煥之情也。單財勞力，畢歸之於無用也，以此觀之，其為衣服非為身體，皆為觀好，是以其民淫僻而難治，其君奢侈而難諫也。夫以奢侈之君，御妤淫僻之民，欲國無亂，不可得也。君實欲天下之治而惡其亂，當為衣服不可不節。&lt;br /&gt;&lt;br /&gt;古之民未知為飲食時，素食而分處，故聖人作誨男耕稼樹藝，以為民食。其為食也，足以增氣充虛，彊體適腹而巳矣。故其用財節，其自養儉，民富國治。今則不 然，厚作斂於百姓，以為美食芻豢，蒸炙魚鱉，大國累百器，小國累十器，前方丈，目不能遍視，手不能遍操，口不能遍味，冬則凍冰，夏則餲饐，人君為飲食如此，故左右象之。是以富貴者奢侈，孤寡者凍餒，雖欲無亂，不可得也。君實欲天下治而惡其亂，當為食飲，不可不節。&lt;br /&gt;&lt;br /&gt;古之民未知為舟車時，重任不移，遠道不至，故聖王作為舟車，以便民之事。其為舟車也，完固輕利，可以任重致遠，其為用財少，而為利多，是以民樂而利之。故法令不急而行，民不勞而上足用，故民歸之。&lt;br /&gt;&lt;br /&gt;當今之主，其為舟車與此異矣。完固輕利皆已具，必厚作斂於百姓，以飾舟車。飾車以文采，飾舟以刻鏤，女子廢其紡織而脩文采，故民寒。男子離其耕稼而脩刻鏤，故民饑。人君為舟車若此，故左右象之，是以其民饑寒並至，故為姦邪。姦邪多則刑罰深，刑罰深則國亂。君實欲天下治而惡其亂，當為舟車，不可不節。&lt;br /&gt;&lt;br /&gt;凡回於天地之間，包於四海之內，天壤之情，陰陽之和，莫不有也，雖至聖不能更也。何以知其然？聖人有傳：天地也，則曰上下；四時也，則曰陰陽；人情也，則 曰男女；禽獸也，則曰牡牝雄雌也。真天壤之情，雖有先王不能更也。雖上世至聖，必蓄私，不以傷行，故民無怨。宮無拘女，故天下無寡夫。內無拘女，外無寡 夫，故天下之民眾。當今之君，其蓄私也，大國拘女累千，小國累百，是以天下之男多寡無妻，女多拘無夫，男女失時，故民少。君實欲民之眾而惡其寡，當蓄私不可不節。&lt;br /&gt;&lt;br /&gt;凡此五者，聖人之所儉節也，小人之所淫佚也。儉節則昌，淫佚則亡，此五者不可不節。夫婦節而天地和，風雨節而五穀孰，衣服節而肌膚和。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;三辯&lt;/span&gt;&lt;br /&gt;程繁問於子墨子曰：“夫子曰：‘聖王不為樂’，昔諸侯倦於聽治，息於鐘鼓之樂；士大夫倦於聽治，息於竽瑟之樂；農夫春耕、夏耘、秋斂、冬藏，息於瓴缶之樂。今夫子曰：‘聖王不為樂’，此譬之猶馬駕而不稅，弓張而不弛，無乃非有血氣者之所不能至邪？”&lt;br /&gt;&lt;br /&gt;子墨子曰：“昔者堯舜有茅茨者，且以為禮，且以為樂。湯放桀於大水，環天下自立以為王，事成功立，無大後患，因先王之樂，又自作樂，命曰《護》，又脩《九招》。武王勝殷殺紂，環天下自立以為王，事成功立，無大後患，因先王之樂，又自作樂，命曰《象》。周成王因先王又自作樂，命曰《騶虞》。周成王之治天下也，不若武王。武王之治天下也，不若成湯。成湯之治天下也，不若堯舜。故其樂逾繁者，其治逾寡。自此觀之，樂非所以治天下也。”&lt;br /&gt;&lt;br /&gt;程繁曰：“子曰：‘聖王無樂’。此亦樂已，若之何其謂聖王無樂也？”子墨子曰：“聖王之命也，多寡之。食之利也，以知饑而食之者智也，因為無智矣。今聖有樂而少，此亦無也。”&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4272939767197667332-3531562843068169036?l=linuxocarina.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linuxocarina.blogspot.com/feeds/3531562843068169036/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4272939767197667332&amp;postID=3531562843068169036' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/3531562843068169036'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/3531562843068169036'/><link rel='alternate' type='text/html' href='http://linuxocarina.blogspot.com/2008/12/blog-post.html' title='墨子'/><author><name>Tick</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://lh3.google.com/ticktock35/RxbHkGdUPGI/AAAAAAAAAE0/IFbLByIbaj8/s144/tux_ocarina.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4272939767197667332.post-2839175068160631087</id><published>2008-12-14T22:39:00.014+08:00</published><updated>2008-12-26T01:38:59.296+08:00</updated><title type='text'>迷人的 git</title><content type='html'>如果你常常寫 code，一定會遇到一種情況：寫改目前會動的 code，又怕會改壞…這時，就是 SCM (Source Code Management)  程式的時候了。&lt;br /&gt;&lt;br /&gt;前一陣子，不知怎麼的，好幾個朋友問我，他們公司/專案要選 SCM，要選用那一個呢？&lt;br /&gt;&lt;br /&gt;SCM 百百種… CVS SVN SVK Monotone bitkeeper git etc. etc.&lt;br /&gt;要用那一個比較好呢？&lt;br /&gt;&lt;br /&gt;在過去…我會說 SVN， SVN 比 CVS 方便多了，流水號的機制讓開發過程相當的清晰。&lt;br /&gt;現在我強烈推薦 git&lt;br /&gt;自從用了 git 之後～我已經離不開 git 了…&lt;br /&gt;&lt;br /&gt;為什麼呢？&lt;br /&gt;1. 因為我用 notebook 寫 code， 這表示我可能會在辦公室寫，在家寫，睡不著時在床上寫，在無聊的會議中寫，在坐車時寫，在山林中寫… 而且我寫的東西大多要merge 回 upstream。可是很多地方是沒有網路的。或是網路不好…如果我用SVN 的話…就必需開始用 quilt寫 patch 了…管理 Code 變得相當的麻煩。&lt;br /&gt;Git 是一個分散式的 SCM，也就是在你目前工作的環境下，就是一個完整的 source code repository. 當你從網路上用 git 抓下 code 的同時，你已經把完整的開發 tree 抓回來，放在你的電腦之中了…而 commit code 時也是 commit 到你 local 端之中。所以你就可以一直寫，到處寫，直到你有網路之時再一次 push 回去…&lt;br /&gt;2. 我很愛改 Code，而 git 的版本管理是用 patch 做出來的，也就是說 branch 會變得相當的容易。當我想做任何風險較大的變動時，可以先開一個 branch 出來，在裏面惡搞一翻。如果結果不錯的話，就 merge 回主要的 branch。&lt;br /&gt;3. git 超級快，因為 git 把所有的 patch 都抓回來了，要做 diff ，翻 log 就變成超級快速而且穩定的事。&lt;br /&gt;4. 支援 SVN 和 CVS，git-svn 可以把 svn 之中的所有 commit 變成 git 之中的一個 branch。&lt;br /&gt;也就是不管upstream 用的是 SVN or CVS ，我都可以用 git 來管理。事實上，還有一些更好玩的&lt;a href="http://linuxocarina.blogspot.com/2008/07/using-git-svn-migrate-svn-repository.html"&gt;玩法&lt;/a&gt;。&lt;br /&gt;5. SHA1-hash 的版本管理方式，讓 git 跳脫 SVN 之類強烈線性的版本管理…可以 rebase, cherry-pick ...&lt;br /&gt;6. 開始一個 repository 超級方便，git init 就好了&lt;br /&gt;&lt;br /&gt;Anyway 說了這麼多好處…怎麼用呢？就先給 link 嘍…&lt;br /&gt;&lt;a href="http://blog.linux.org.tw/%7Ejserv/archives/002019.html"&gt;戒色夫 "我愛 Git"&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.kernel.org/pub/software/scm/git/docs/user-manual.html"&gt; Git User manual&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;我不打算在這寫另一個 manual 就寫幾個個人覺得很實用的 use cases.&lt;br /&gt;1．做實驗&lt;br /&gt; 當你的 master branch 可以 run，但你想要對某個演算法大修時…&lt;br /&gt; a. git checkout -b test_xxxx&lt;br /&gt; b. 大修你的演算法…且 做細部的 commit，直到完成&lt;br /&gt; c. git checkout master 回到本來的 master&lt;br /&gt; d. git pull  把再新的 master 拉回來&lt;br /&gt; e. git checkout test_xxxx&lt;br /&gt; f. git rebase master 把再新的 master commit rebase 上去…可能會要解 conflict &lt;br /&gt;(c, d, e, f, 可變成 git fetch origin/master; git rebase -i origin/master)&lt;br /&gt; g. git checkout master&lt;br /&gt; h.1 git rebase test_xxxx 把 test_xxxx 的東西再 rebase 過來&lt;br /&gt; h.2 git cherry-pick xxxxxx 把某個 patch 挑過來&lt;br /&gt; i. git push 把修改送回main stream&lt;br /&gt;&lt;br /&gt;2．用 git-svn 搬 SVN repository&lt;br /&gt; 如 project P 要從 repository A 搬到 B 玩法如下&lt;br /&gt; a. mkdir A_svn; pushd A_svn; git svn init http://A/trunk/ ;git svn fetch; popd&lt;br /&gt; b  git clone file://`pwd`/A_svn B_svn&lt;br /&gt; c. cd B_svn; git svn init http://B/trunk/&lt;br /&gt; d. git checkout -b master_tmp&lt;br /&gt; e. git svn init http://B/trunk/ ; git svn fetch&lt;br /&gt; f. git checkout -b svn --track git-svn&lt;br /&gt; g. git checkout master; git rebase svn&lt;br /&gt; h. git-rev-list master_tmp   (suppose the last line is 532d2f35aa73331d409475efa84c00a1afa0e1a0)&lt;br /&gt; i. git svn set-tree 532d2f35aa73331d409475efa84c00a1afa0e1a0&lt;br /&gt; j. git rebase master_tmp; git svn dcommit&lt;br /&gt;&lt;br /&gt;3. 粉飾太平&lt;br /&gt; 當 git commit 了一些笨笨的 code&lt;br /&gt; 可以用 git rebase -i xxxx 來拿掉/合並 一些 commit&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4272939767197667332-2839175068160631087?l=linuxocarina.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linuxocarina.blogspot.com/feeds/2839175068160631087/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4272939767197667332&amp;postID=2839175068160631087' title='3 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/2839175068160631087'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/2839175068160631087'/><link rel='alternate' type='text/html' href='http://linuxocarina.blogspot.com/2008/12/git.html' title='迷人的 git'/><author><name>Tick</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://lh3.google.com/ticktock35/RxbHkGdUPGI/AAAAAAAAAE0/IFbLByIbaj8/s144/tux_ocarina.png'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4272939767197667332.post-1825685993560880126</id><published>2008-11-03T17:06:00.006+08:00</published><updated>2008-12-08T11:37:24.387+08:00</updated><title type='text'>心目中的 Linux development 課程建議</title><content type='html'>早上讀了一封某國立大學資訊系教授的信，百感交集。也不想評論些什麼…&lt;br /&gt;就說說自已的想法罷了&lt;br /&gt;我個人覺得，一個活在 AC 2008 Embedded GNU/Linux Software Developer 要會以下一些東西。&lt;br /&gt;我認為…這只是基礎。這些會了，再來談創意…&lt;br /&gt;光是空想，手上沒有工具，或是有工具不會用…只是白搭。&lt;br /&gt;&lt;br /&gt;技術方面&lt;br /&gt;* C programming&lt;br /&gt;-- study forever...&lt;br /&gt;-- Learning how to tracing code - Learning from the master&lt;br /&gt;&lt;br /&gt;* Shell programming&lt;br /&gt;-- Bash &amp;amp; awk &amp;amp; sed &amp;amp; grep &amp;amp; diff &amp;amp; patch&lt;br /&gt;-- Python | Perl | Ruby&lt;br /&gt;&lt;br /&gt;* Software testing&lt;br /&gt;-- smoke test&lt;br /&gt;-- boundary test&lt;br /&gt;-- stress test&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;* cross toolchain.&lt;br /&gt;-- Static link &amp;amp; Share Library&lt;br /&gt;-- ABI&lt;br /&gt;-- Dependency tree&lt;br /&gt;-- How kernel execute programs &amp;amp; ELF study&lt;br /&gt;&lt;br /&gt;* SCM&lt;br /&gt;-- git&lt;br /&gt;-- svn&lt;br /&gt;-- cvs&lt;br /&gt;-- patch&lt;br /&gt;  ---- quilt&lt;br /&gt;&lt;br /&gt;* Distribution structure&lt;br /&gt;-- How system boots&lt;br /&gt;-- Build a distribution from scratch&lt;br /&gt;&lt;br /&gt;* Misc tools&lt;br /&gt;-- gdb&lt;br /&gt;-- valgrind&lt;br /&gt;-- gprof&lt;br /&gt;-- gcov&lt;br /&gt;-- doxygen&lt;br /&gt;-- autotools&lt;br /&gt;&lt;br /&gt;文化方面&lt;br /&gt;* Mailing List&lt;br /&gt;* Bugzilla&lt;br /&gt;* Hacker ethics&lt;br /&gt;* IRC&lt;br /&gt;* English&lt;br /&gt;* Eat your dog food&lt;br /&gt;* Coding style&lt;br /&gt;* Knowledge management skill - search &amp;amp; skip&lt;br /&gt;&lt;br /&gt;很明顯以上不是一門課就可以上完的，不過可以分散在幾門課之中。&lt;br /&gt;0. 計概&lt;br /&gt;1. OS&lt;br /&gt;2. C programming&lt;br /&gt;3. System programming&lt;br /&gt;4. XXX 專題&lt;br /&gt;&lt;br /&gt;作為：&lt;br /&gt;. 老師自已開始始用 GNU/Linux or any Unix like system 把自已丟進 FOSS 的世界…會更有 fu&lt;br /&gt;&lt;br /&gt;. 鼓勵學生在大一時，就學習用 GNU/Linux，以及使用公開格式文件。&lt;br /&gt;學校為什麼要為 MS 做免費的廣告呢？&lt;br /&gt;要求學生使用不是每個人都買得起的東西，使用不公開格式的文件…&lt;br /&gt;這是不道德也不經濟的。&lt;br /&gt;學生也可以真正的體會 FOSS 的文化，有興趣的人還可以真正深入了解系統的運作。&lt;br /&gt;&lt;br /&gt;. 要求學生使用 gpg keys 以及使用 ssh key&lt;br /&gt;&lt;br /&gt;. 作業用 git+ssh 繳交…&lt;br /&gt;&lt;br /&gt;. 教導學生使用 Unix 下的一些超級工具&lt;br /&gt;-- 一旦學會了…一輩子受益。可惜…很多老師自已不會，學一下吧。 ~&gt;_&lt;~&lt;br /&gt;&lt;br /&gt;. 要求學生加入有名的 open source 的專案，成為期中作業。（以 commit log 為準）&lt;br /&gt;&lt;br /&gt;. OS 課程之中，指派學生 Trace Linux kernel code ，對照 textbook 內容，且 present 給大家，作為作業。&lt;br /&gt;&lt;br /&gt;. Algorithm 課程中，指派學生 Trace glibc | stdc | stdc++ | java library code ，使用，且學習用它們的 API 自已 cleanroom 一個出來，用  test framwork 來測。&lt;br /&gt;&lt;br /&gt;. C programming 中，學生的每個程式作業，都要擺出 autotools 的架式，以及使用 doxygen 產生文件 (或不同工具)&lt;br /&gt;&lt;br /&gt;. RTFM, 選一些重要的 manual 叫學生讀，學會讀文件和學會讀 code 是一樣重要的。&lt;br /&gt;&lt;br /&gt;. 出幾題如 pythonchallenge 之類的上機作業給學生…&lt;br /&gt;&lt;br /&gt;. 要求程式作業要先交 .h 檔，先上 git&lt;br /&gt;&lt;br /&gt;. 鼓勵學生訂 mailing list, 為課程開 mailing list，在上面討論課程和作業&lt;br /&gt;&lt;br /&gt;. 老師也要學習新把戲 ;-) 如果您在教 GNU/Linux development 而上面的任何 Item 不清楚的話，或不了解怎麼做的話…也許要再 update 一下您的 knowledge 了。&lt;br /&gt;&lt;br /&gt;基礎很重要。手中有工具，才能玩遊戲。&lt;br /&gt;&lt;br /&gt;小弟其實懂得不多，每天也還忙著學新東西，不過看完了某教授的信後，心裏是這麼想的。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4272939767197667332-1825685993560880126?l=linuxocarina.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linuxocarina.blogspot.com/feeds/1825685993560880126/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4272939767197667332&amp;postID=1825685993560880126' title='3 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/1825685993560880126'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/1825685993560880126'/><link rel='alternate' type='text/html' href='http://linuxocarina.blogspot.com/2008/11/linux-development.html' title='心目中的 Linux development 課程建議'/><author><name>Tick</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://lh3.google.com/ticktock35/RxbHkGdUPGI/AAAAAAAAAE0/IFbLByIbaj8/s144/tux_ocarina.png'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4272939767197667332.post-6180648068513026878</id><published>2008-10-30T21:57:00.005+08:00</published><updated>2008-10-30T23:12:58.789+08:00</updated><title type='text'>Neo 機器人</title><content type='html'>月初從朋友那拿了一個控制 servo 的 &lt;a href="http://www.lattebox.com/"&gt;LSC chip&lt;/a&gt;，以及一雙由 servo 組成的腳…&lt;br /&gt;就在想，能不能拿 Neo 來做機器人呢？&lt;br /&gt;&lt;br /&gt;Neo 上有兩個 g-sensor ,GPS chip，2.5G GSM chip， bluetooth，還有 wifi…&lt;br /&gt;如果它能動…那會有多可怕… 拿它來開船、開飛機。可用 bluetooth wifi 和 GSM 來遙控…&lt;br /&gt;應該會是一個很好玩的東西…&lt;br /&gt;&lt;br /&gt;為了可以在 Neo 上能快快樂樂的玩 servo ，我開了個小案子：&lt;a href="http://code.google.com/p/lscd/"&gt;LSCD&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;把 servo 的 driver 寫好，再寫一個 python-binding... 就可以快快樂樂的玩了&lt;br /&gt;&lt;br /&gt;liblscd 是控制 chip 的 API 可讀寫每個servo 的角度和速度。&lt;br /&gt;pylsc 是 liblscd 的 python binding&lt;br /&gt;在 tests 中還有一個 robot.py ，可以用來控制由 servo 組合而成的 robot...&lt;br /&gt;未來想把 pylsc 寫成 &lt;a href="http://www.freesmartphone.org/index.php/Main_Page"&gt; freesmartphone&lt;/a&gt; 的一個 service 如此就可以和 phone event manager 整合在一起… (感覺起來可以做很多壞事 :P )&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;怎麼玩呢？&lt;br /&gt;1. kernel 要有 HIDDEV drvier (Debian default 有，Ubuntu 沒有), Neo 從今天開始的 stable kernel 就會有 :P&lt;br /&gt;&lt;br /&gt;2.1 在 laptop 上玩:&lt;br /&gt;a. 安裝 gcc python cython pyrex python2.5-dev intltool libgettextpo-dev libtool automake autoconf make subversion&lt;br /&gt;b. &lt;tt&gt;&gt; svn checkout &lt;strong&gt;&lt;em&gt;http&lt;/em&gt;&lt;/strong&gt;://lscd.googlecode.com/svn/trunk/ lscd&lt;br /&gt;c. &gt; cd lscd&lt;br /&gt;  &gt; ./autogen.sh&lt;br /&gt;  &gt; make&lt;br /&gt;  &gt; sudo make install&lt;br /&gt;d. 接上 LSC device, sudo chmod 777 /dev/usb/hiddev0&lt;br /&gt;e. 就可以進 test 來玩 robot.py 了&lt;br /&gt;2.2 在 Neo 上玩&lt;br /&gt;a. wget http://lscd.googlecode.com/files/liblscd0_armv4t.opk&lt;br /&gt;b. opkg install &lt;/tt&gt;&lt;tt&gt;liblscd0_armv4t.opk&lt;br /&gt;c. 用 wifi or bluetooth 連進Neo&lt;br /&gt;   &lt;/tt&gt;&lt;tt&gt;&lt;a href="http://wiki.openmoko.org/wiki/Wifi"&gt;http://wiki.openmoko.org/wiki/Wifi&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;   &lt;a href="http://wiki.openmoko.org/wiki/Manually_using_Bluetooth#Bluetooth_networking_with_a_Linux_system"&gt;http://wiki.openmoko.org/wiki/Manually_using_Bluetooth#Bluetooth_networking_with_a_Linux_system&lt;/a&gt;&lt;br /&gt;&lt;/tt&gt;&lt;tt&gt;d. 把 usb 切到 host mode &lt;a href="http://wiki.openmoko.org/wiki/USB_host#Selecting_USB_host_modes"&gt; &lt;/a&gt;&lt;/tt&gt;&lt;a href="http://wiki.openmoko.org/wiki/USB_host#Selecting_USB_host_modes"&gt;http://wiki.openmoko.org/wiki/USB_host#Selecting_USB_host_modes&lt;/a&gt;&lt;br /&gt;&lt;tt&gt;  e. 接上 LSC device  (要有一個 mini 公 &lt;----&gt; USB B公的線, 可以用組合的)&lt;br /&gt;  example:&lt;br /&gt;      (mini公 ＜－－＞ A 公 | A 母 &lt;--&gt; A 母 | A公＜－－＞B 公)&lt;br /&gt;f. 就可以玩了 ^_^&lt;br /&gt;&lt;br /&gt;除了接線外…一切都可寫成 script :P&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/SG3fAHFNs2c&amp;amp;hl=zh_TW&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/SG3fAHFNs2c&amp;amp;hl=zh_TW&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;/tt&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4272939767197667332-6180648068513026878?l=linuxocarina.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linuxocarina.blogspot.com/feeds/6180648068513026878/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4272939767197667332&amp;postID=6180648068513026878' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/6180648068513026878'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/6180648068513026878'/><link rel='alternate' type='text/html' href='http://linuxocarina.blogspot.com/2008/10/neo.html' title='Neo 機器人'/><author><name>Tick</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://lh3.google.com/ticktock35/RxbHkGdUPGI/AAAAAAAAAE0/IFbLByIbaj8/s144/tux_ocarina.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4272939767197667332.post-848869226995877583</id><published>2008-10-23T14:55:00.001+08:00</published><updated>2008-10-23T14:57:16.083+08:00</updated><title type='text'>kernel indent 備忘</title><content type='html'>indent -kr -i8 -ts8 -sob -l80 -ss -bs -ps1&lt;br /&gt;&lt;br /&gt;也可以看 scripts/Lindent&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4272939767197667332-848869226995877583?l=linuxocarina.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linuxocarina.blogspot.com/feeds/848869226995877583/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4272939767197667332&amp;postID=848869226995877583' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/848869226995877583'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/848869226995877583'/><link rel='alternate' type='text/html' href='http://linuxocarina.blogspot.com/2008/10/kernel-indent.html' title='kernel indent 備忘'/><author><name>Tick</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://lh3.google.com/ticktock35/RxbHkGdUPGI/AAAAAAAAAE0/IFbLByIbaj8/s144/tux_ocarina.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4272939767197667332.post-7094816027967014249</id><published>2008-09-10T14:12:00.004+08:00</published><updated>2008-09-10T14:19:54.260+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='screen tip'/><title type='text'>Share Screen 備忘</title><content type='html'>Screen 是一個很古老又好用的工具，雖然自已不是很常用…不過有時在幫別人做一些事情時，我們可以用 screen 的 share 功能，多人同時使用同一個 screen。在 demo，教學上實在蠻方便的。&lt;br /&gt;很久之前有在用，不過一陣子沒用後就忘了，寫下來以免自已又忘掉。&lt;br /&gt;&lt;br /&gt;1．  sudo chmod u+s /usr/bin/screen&lt;br /&gt;2． sudo chmod 755 /var/run/screen&lt;br /&gt;3． screen&lt;br /&gt;4．在另一個 terminal 上 screen -x&lt;br /&gt;&lt;br /&gt;如要多人 share&lt;br /&gt;&lt;br /&gt;1. ^a + :multiuser on&lt;br /&gt;2. ^a + :acladd &lt;username&gt;&lt;br /&gt;&lt;br /&gt;3. 另一個人就可以 screen -x &lt;screen_owner&gt;/[pid] 連上去&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4272939767197667332-7094816027967014249?l=linuxocarina.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linuxocarina.blogspot.com/feeds/7094816027967014249/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4272939767197667332&amp;postID=7094816027967014249' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/7094816027967014249'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/7094816027967014249'/><link rel='alternate' type='text/html' href='http://linuxocarina.blogspot.com/2008/09/share-screen.html' title='Share Screen 備忘'/><author><name>Tick</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://lh3.google.com/ticktock35/RxbHkGdUPGI/AAAAAAAAAE0/IFbLByIbaj8/s144/tux_ocarina.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4272939767197667332.post-4253277352572355854</id><published>2008-07-30T00:54:00.009+08:00</published><updated>2008-12-15T12:25:51.957+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='git svn migration clone repository'/><title type='text'>Using git-svn migrate svn repository server</title><content type='html'>Suppose we create a project on one SVN repository server say A, however that server is going to close and disappear. And we still want to develop that project. So we found another repository server say B as our new host. However if we cannot use svnadmin commit on server B.(if you can you can use &lt;a href="http://www.techiecorner.com/175/how-to-migrate-svn-repository/"&gt;this&lt;/a&gt;) How do we migrate?&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.kernel.org/pub/software/scm/git/docs/git-svn.html"&gt;git-svn&lt;/a&gt; gives us a chance to do such thing.&lt;br /&gt;&lt;br /&gt;Now we have server A and want to migrate project to server B.&lt;br /&gt;&lt;br /&gt;support you are in /tmp&lt;br /&gt;1. git-svn clone svn://server_A/my_project my_project_from_A&lt;br /&gt;2. git clone file:///tmp/my_project_from_A my_project_sent_to_B&lt;br /&gt;3. cd my_project_sent_to_B&lt;br /&gt;4. git-svn init svn+ssh://whoyouare@server_B/my_project&lt;br /&gt;(Here svn://server_B/my_project should be empty, make sure you can commit)&lt;br /&gt;5. git-svn fetch&lt;br /&gt;6. git-svn set-tree [the very first one commit in master]&lt;br /&gt;&lt;span style="font-style: italic;"&gt;note:1 &lt;/span&gt;&lt;br /&gt;7. git-svn dcommit&lt;br /&gt;Done, Happy hacking...&lt;br /&gt;&lt;br /&gt;Step 1: clone the svn log from old repository (let it read only)&lt;br /&gt;Step 2: does not clone the svn infomation in server_A, so that we will have a clean space to do the hack&lt;br /&gt;Step 4, 5: get the information from Server_B and get the initial point&lt;br /&gt;&lt;br /&gt;Step 6: push the very first one commit in master to server B svn&lt;br /&gt;Step 7: commit the whole tree to server B&lt;br /&gt;&lt;br /&gt;Combining these skills actually you can migrate/convert/clone many kinds of SCM.&lt;br /&gt;&lt;br /&gt;extension reading:&lt;a href="http://www.reonsoft.com/%7Ejohn/blog/2008/06/05/git-first-git-svn-later/"&gt;GIT first SVN later&lt;/a&gt;&lt;br /&gt;Note 1:If you meet&lt;br /&gt;CONFLICT (delete/modify): XXXX deleted in HEAD and modified in adding License declare. Version adding License declare or XXXX left in tree.&lt;br /&gt;&lt;br /&gt;you can&lt;br /&gt;git status&lt;br /&gt;then&lt;br /&gt;git add (those unmerged files/directories)&lt;br /&gt;git rebase --continue&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4272939767197667332-4253277352572355854?l=linuxocarina.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linuxocarina.blogspot.com/feeds/4253277352572355854/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4272939767197667332&amp;postID=4253277352572355854' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/4253277352572355854'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/4253277352572355854'/><link rel='alternate' type='text/html' href='http://linuxocarina.blogspot.com/2008/07/using-git-svn-migrate-svn-repository.html' title='Using git-svn migrate svn repository server'/><author><name>Tick</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://lh3.google.com/ticktock35/RxbHkGdUPGI/AAAAAAAAAE0/IFbLByIbaj8/s144/tux_ocarina.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4272939767197667332.post-1049236400985021929</id><published>2008-07-17T16:14:00.004+08:00</published><updated>2008-08-20T10:55:39.123+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ipkg opkg ipk'/><title type='text'>Easy Sample to create ipk files</title><content type='html'>step 1. ceate 2 new temp dirs  say "_ipkg_temp" "_ipkg_tar"&lt;br /&gt;step 2. use _ipkg_temp as root directory put your stuff there:&lt;br /&gt; for example:&lt;br /&gt;   usr/bin/lala.sh&lt;br /&gt;step 3. pushd _ipkg_temp; tar -czf ../ipkg_tar/data.tar.gz .; rm -rf * ; popd&lt;br /&gt;step 4. create control file in _ipkg_temp&lt;br /&gt;     fill the following fields: (CONTROL="control")&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;span class="str"&gt;        echo "&lt;/span&gt;&lt;span class="typ"&gt;Package&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; Your_package_name&lt;/span&gt;&lt;span class="str"&gt;"   &gt;  ${CONTROL}&lt;br /&gt;&lt;/span&gt;&lt;span class="str"&gt;        echo "&lt;/span&gt;&lt;span class="typ"&gt;Version&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="lit"&gt;0.1&lt;/span&gt;&lt;span class="str"&gt;"             &gt;&gt; ${CONTROL}&lt;br /&gt;&lt;/span&gt;&lt;span class="str"&gt;        echo "&lt;/span&gt;&lt;span class="typ"&gt;Description&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; your_descriptions&lt;/span&gt;&lt;span class="str"&gt;"&gt;&gt; ${CONTROL}&lt;br /&gt;&lt;/span&gt;&lt;span class="str"&gt;        echo "&lt;/span&gt;&lt;span class="typ"&gt;Section&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; base&lt;/span&gt;&lt;span class="str"&gt;"            &gt;&gt; ${CONTROL}&lt;br /&gt;&lt;/span&gt;&lt;span class="str"&gt;        echo "&lt;/span&gt;&lt;span class="typ"&gt;Priority&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; optional&lt;/span&gt;&lt;span class="str"&gt;"       &gt;&gt; ${CONTROL}&lt;br /&gt;&lt;/span&gt;&lt;span class="str"&gt;        echo "&lt;/span&gt;&lt;span class="typ"&gt;Maintainer&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; Noname&lt;/span&gt;&lt;span class="str"&gt;"      &gt;&gt; ${CONTROL}&lt;br /&gt;&lt;/span&gt;&lt;span class="str"&gt;        echo "&lt;/span&gt;&lt;span class="typ"&gt;Architecture&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; all&lt;/span&gt;&lt;span class="str"&gt;"        &gt;&gt; ${CONTROL}&lt;/span&gt;&lt;span class="str"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="str"&gt;        echo "&lt;/span&gt;&lt;span class="typ"&gt;Homepage&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; http&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="com"&gt;//ooo.xxx.vvv/svn/trunk"       &gt;&gt;  ${CONTROL}&lt;/span&gt;&lt;span class="pln"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="pln"&gt;        echo &lt;/span&gt;&lt;span class="str"&gt;"Tags: group::unknown"&lt;/span&gt;&lt;span class="pln"&gt;       &lt;/span&gt;&lt;span class="pun"&gt;&gt;&gt;&lt;/span&gt;&lt;span class="pln"&gt; $&lt;/span&gt;&lt;span class="pun"&gt;{&lt;/span&gt;&lt;span class="pln"&gt;CONTROL&lt;/span&gt;&lt;span class="pun"&gt;}&lt;/span&gt;&lt;span class="pln"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="pln"&gt;        echo &lt;/span&gt;&lt;span class="str"&gt;"Depends: ooxxooxx"&lt;/span&gt;&lt;span class="pln"&gt;    &lt;/span&gt;&lt;span class="pun"&gt;&gt;&gt;&lt;/span&gt;&lt;span class="pln"&gt; $&lt;/span&gt;&lt;span class="pun"&gt;{&lt;/span&gt;&lt;span class="pln"&gt;CONTROL&lt;/span&gt;&lt;span class="pun"&gt;}&lt;/span&gt;&lt;span class="pln"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="pln"&gt;        echo &lt;/span&gt;&lt;span class="str"&gt;"Source: http://ooxxooxx.ooxx.vvvoo/"&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;&gt;&gt;&lt;/span&gt;&lt;span class="pln"&gt;  $&lt;/span&gt;&lt;span class="pun"&gt;{&lt;/span&gt;&lt;span class="pln"&gt;CONTROL&lt;/span&gt;&lt;span class="pun"&gt;}&lt;/span&gt;&lt;span class="pln"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;then tar -czf ../_ipkg_tar/control.tar.gz  .&lt;br /&gt;step 5. in _ipkg_tar create debian-binary file contents 2.0&lt;br /&gt;  echo "2.0" &gt; debian-binary&lt;br /&gt;step 6. in _ipkg_tar ar the ipkg file&lt;br /&gt;  ar -crf ooxx_0.1_arm.ipkg debian-binary data.tar.gz control.tar.gz&lt;br /&gt;&lt;br /&gt;Done :-)&lt;br /&gt;&lt;br /&gt;reference http://code.google.com/p/comic-reader/source/browse/trunk/packer/pack_eet2ipk.sh&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4272939767197667332-1049236400985021929?l=linuxocarina.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linuxocarina.blogspot.com/feeds/1049236400985021929/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4272939767197667332&amp;postID=1049236400985021929' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/1049236400985021929'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/1049236400985021929'/><link rel='alternate' type='text/html' href='http://linuxocarina.blogspot.com/2008/07/easy-sample-to-create-ipk-files.html' title='Easy Sample to create ipk files'/><author><name>Tick</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://lh3.google.com/ticktock35/RxbHkGdUPGI/AAAAAAAAAE0/IFbLByIbaj8/s144/tux_ocarina.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4272939767197667332.post-7660861023671793889</id><published>2008-07-03T23:40:00.006+08:00</published><updated>2008-07-03T23:58:51.081+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='icecc distributed compiler'/><title type='text'>Icescream</title><content type='html'>和大家分享一個好物： &lt;a href="http://en.opensuse.org/Icecream"&gt;ICE SCREAM&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;它是一個分散式的 compiler 架構…&lt;br /&gt;在Debian 和 Ubuntu 下相當好安裝…  只要&lt;br /&gt;sudo aptitude install icecc icecc-monitor&lt;br /&gt;然後&lt;br /&gt;export PATH=/usr/lib/icecc/bin:$PATH&lt;br /&gt;就好了&lt;br /&gt;&lt;br /&gt;在同一個網域下，把一台機器設成 scheduler (一台就好)&lt;br /&gt;cat /etc/default/icecc&lt;br /&gt;# Defaults for icecc initscript&lt;br /&gt;# sourced by /etc/init.d/icecc&lt;br /&gt;START_ICECC="true"&lt;br /&gt;START_ICECC_SCHEDULER="false"&lt;br /&gt;&lt;br /&gt;把 false 改成 true&lt;br /&gt;sudo /etc/init.d/icecc restart&lt;br /&gt;一切就搞定了…&lt;br /&gt;&lt;br /&gt;今天下午用了 10 台 4 CPU 的機器玩了一下 compile qtopia&lt;br /&gt;make -j 20&lt;br /&gt;本來要一個 CPU 要compile 快兩個小時的東西，十幾分鐘就搞定了。&lt;br /&gt;&lt;br /&gt;^_^&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4272939767197667332-7660861023671793889?l=linuxocarina.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://en.opensuse.org/Icecream' title='Icescream'/><link rel='replies' type='application/atom+xml' href='http://linuxocarina.blogspot.com/feeds/7660861023671793889/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4272939767197667332&amp;postID=7660861023671793889' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/7660861023671793889'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/7660861023671793889'/><link rel='alternate' type='text/html' href='http://linuxocarina.blogspot.com/2008/07/icescream.html' title='Icescream'/><author><name>Tick</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://lh3.google.com/ticktock35/RxbHkGdUPGI/AAAAAAAAAE0/IFbLByIbaj8/s144/tux_ocarina.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4272939767197667332.post-8807095099069964515</id><published>2008-06-25T23:39:00.005+08:00</published><updated>2008-12-11T14:17:29.471+08:00</updated><title type='text'>sudoku solver partII</title><content type='html'>Sudoku Solver 比賽順利結束了，這個比賽相當看重速度，所以在加速和結構上做了相當大的取捨，也對於 python 這個語言的特性有一些更深入的了解。（這是小弟的第二支 python 程式）&lt;br /&gt;和大家分享一下小弟的加速過程…&lt;br /&gt;&lt;br /&gt;1. 第一步當然是先寫 Test Framework&lt;br /&gt;Filename: testcase.py&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;#!/usr/bin/python&lt;br /&gt;&lt;br /&gt;import sys&lt;br /&gt;import tick_solver&lt;br /&gt;&lt;br /&gt;if sys.argv.__len__() &amp;gt;= 2 and sys.argv[1] :&lt;br /&gt;    name = sys.argv[1]&lt;br /&gt;else:&lt;br /&gt;    name = "case_01.txt"&lt;br /&gt;&lt;br /&gt;bb = tick_solver.Board()&lt;br /&gt;bb.file_read(name)&lt;br /&gt;&lt;br /&gt;def TC_Board_group_get(bb):&lt;br /&gt;    if bb.group_get(0, 0) == 0 and \&lt;br /&gt;            bb.group_get(2, 2) == 0 and \&lt;br /&gt;            bb.group_get(2, 3) == 1 and \&lt;br /&gt;            bb.group_get(8, 8) == 8 and \&lt;br /&gt;            bb.group_get(5, 7) == 5 and \&lt;br /&gt;            bb.group_get(6, 7) == 8 and \&lt;br /&gt;            bb.group_get(3, 10) == -1 and \&lt;br /&gt;            bb.group_get(3, 0) == 3:&lt;br /&gt;                print "group_get passed!!"&lt;br /&gt;    else:&lt;br /&gt;        print "group_get failed!!"&lt;br /&gt;&lt;br /&gt;def TC_Board_data_print(bb):&lt;br /&gt;    bb.data_print()&lt;br /&gt;    bb.pretty_print()&lt;br /&gt;&lt;br /&gt;def TC_Board_group_print(bb):&lt;br /&gt;    for i in range(0,9):&lt;br /&gt;        print "Rows["+str(i)+ "]=" + str(bb.Rows[i].left)&lt;br /&gt;        print "Columns["+str(i)+ "]=" + str(bb.Columns[i].left)&lt;br /&gt;        print "Groups["+str(i)+ "]=" + str(bb.Groups[i].left)&lt;br /&gt;&lt;br /&gt;def TC_Board_possible_value_get(bb):&lt;br /&gt;    for x in range(0,9):&lt;br /&gt;        for y in range(0,9):&lt;br /&gt;            print "("+str(x)+","+str(y)+") = "+str(bb.possible_value_get(x,y))&lt;br /&gt;            &lt;br /&gt;def TC_Board_puzzle_solving(bb):&lt;br /&gt;    bb.puzzle_solving()&lt;br /&gt;    bb.pretty_print()&lt;br /&gt;&lt;br /&gt;import cProfile&lt;br /&gt;def _TC_Board_profileing():&lt;br /&gt;    BB.run(LALA)&lt;br /&gt;&lt;br /&gt;def TC_Board_profileing():&lt;br /&gt;    cProfile.run('BB.run(LALA)')&lt;br /&gt;&lt;br /&gt;LALA = bb.data[:]&lt;br /&gt;TC_Board_group_get(bb)&lt;br /&gt;TC_Board_data_print(bb)&lt;br /&gt;TC_Board_group_print(bb)&lt;br /&gt;TC_Board_possible_value_get(bb)&lt;br /&gt;bb.pretty_print()&lt;br /&gt;BB = tick_solver.Board()&lt;br /&gt;TC_Board_profileing()&lt;br /&gt;BB.pretty_print()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;再開始實做… （小弟習慣先寫 test case 再來寫實做，testcase 會和程式一同成長）&lt;br /&gt;2. 決定演算法&lt;br /&gt;  從google 上找出sudoku 的rule &lt;br /&gt;  a. 每個 raw 的九個數字都不同&lt;br /&gt;  b. 每個 column 的九個數字都不同&lt;br /&gt;  c. 每個 group 的九個數字都不同&lt;br /&gt;  依這三條 rule 找出 candidates , 再從candidate 最少的 cell 猜起。&lt;br /&gt;  trace 的路徑是走迷宮的方式。&lt;br /&gt;&lt;br /&gt;3. 開出 functions 實作每個 function , 先不管速度，先正確了再說&lt;br /&gt;&lt;br /&gt;Filename: tick_solver.py&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;&lt;br /&gt;ROWS=9&lt;br /&gt;COLUMNS=9&lt;br /&gt;TOTAL_ELEMENTS=81&lt;br /&gt;&lt;br /&gt;class Group:&lt;br /&gt;    def __init__(self):&lt;br /&gt;        self.left = range(1, COLUMNS+1)&lt;br /&gt;    def set(self, x):&lt;br /&gt;        if self.left.__contains__(x):&lt;br /&gt;            self.left.remove(x)&lt;br /&gt;            return True&lt;br /&gt;        return False&lt;br /&gt;    def unset(self, x):&lt;br /&gt;        if not self.left.__contains__(x):&lt;br /&gt;            self.left.append(x)&lt;br /&gt;            return True&lt;br /&gt;        return False&lt;br /&gt;    def candidate(self):&lt;br /&gt;        return self.left&lt;br /&gt;&lt;br /&gt;class Cmd_Node:&lt;br /&gt;    def __init__(self, x, y, v, Data):&lt;br /&gt;        self.x = x&lt;br /&gt;        self.y = y&lt;br /&gt;        self.v = v&lt;br /&gt;        self.D = []&lt;br /&gt;        self.tried = []&lt;br /&gt;        for d in Data:&lt;br /&gt;            if d != v:&lt;br /&gt;                self.D.append(d)&lt;br /&gt;        self.tried.append(v)&lt;br /&gt;&lt;br /&gt;    def retry(self):&lt;br /&gt;        v=self.D.pop()&lt;br /&gt;        self.tried.append(v)&lt;br /&gt;        self.v = v;&lt;br /&gt;        return v;&lt;br /&gt;    def pretty_print(self):&lt;br /&gt;        print "x="+str(self.x)+"  y="+str(self.y)+"  v="+str(self.v)+"  D="+str(self.D)+ "  Tried="+str(self.tried)&lt;br /&gt;&lt;br /&gt;class Board:&lt;br /&gt; def __init__(self, name="case_01.txt"):&lt;br /&gt;            self.num_rest=TOTAL_ELEMENTS&lt;br /&gt;            self.trace = []&lt;br /&gt;            self.DATA = []&lt;br /&gt;            self.data = []&lt;br /&gt;            self.Rows = []&lt;br /&gt;            self.Columns = []&lt;br /&gt;            self.Groups  = []&lt;br /&gt;            self.name = name&lt;br /&gt;            for i in range(0, ROWS):&lt;br /&gt;                self.Rows.append(Group())&lt;br /&gt;                self.Columns.append(Group())&lt;br /&gt;                self.Groups.append(Group())&lt;br /&gt;            for i in range(0, ROWS):&lt;br /&gt;                self.data.append([0, 0, 0, 0, 0, 0, 0, 0, 0])&lt;br /&gt;                self.DATA.append([[], [], [], [], [], [], [], [], []])&lt;br /&gt;            if not self.file_read(self.name):&lt;br /&gt;                print "Warning: Bad sudoku!!"&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;        # index from 0 - 8&lt;br /&gt; def value_set(self, x, y, v):&lt;br /&gt;            if (v==0):&lt;br /&gt;                return True&lt;br /&gt;            if self.Columns[y].candidate().__contains__(v) and \&lt;br /&gt;                    self.Rows[x].candidate().__contains__(v) and \&lt;br /&gt;                    self.Groups[self.group_get(x,y)].candidate().__contains__(v):&lt;br /&gt;                self.data[x][y]  = v&lt;br /&gt;                self.Columns[y].set(v)&lt;br /&gt;                self.Rows[x].set(v)&lt;br /&gt;                self.Groups[self.group_get(x,y)].set(v)&lt;br /&gt;                self.num_rest = self.num_rest - 1;    &lt;br /&gt;                return True&lt;br /&gt;            return False&lt;br /&gt;&lt;br /&gt;        def value_unset(self, x, y):&lt;br /&gt;            v = self.data[x][y]&lt;br /&gt;            self.data[x][y] = 0&lt;br /&gt;            self.Columns[y].unset(v)&lt;br /&gt;            self.Rows[x].unset(v)&lt;br /&gt;            self.Groups[self.group_get(x,y)].unset(v)&lt;br /&gt;            self.num_rest = self.num_rest + 1;&lt;br /&gt;            for x in range(0,9):&lt;br /&gt;                for y in range(0,9):&lt;br /&gt;                    self.DATA[x][y] = self.possible_value_get(x,y)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        def group_get(self, x, y):&lt;br /&gt;            #if (x &amp;lt; 0 or x &amp;gt; 8 or y &amp;lt; 0 or y &amp;gt; 8):&lt;br /&gt;            #    return -1&lt;br /&gt;            return int(x/3)*3 + int(y/3) &lt;br /&gt;&lt;br /&gt;        def data_print(self):&lt;br /&gt;            print self.data&lt;br /&gt;&lt;br /&gt;        def pretty_print(self):&lt;br /&gt;            for i in range(0,ROWS):&lt;br /&gt;                print self.data[i]&lt;br /&gt;&lt;br /&gt;        def file_read(self, name):&lt;br /&gt;            f = open(name, "r")&lt;br /&gt;            for x in range(0,9):&lt;br /&gt;                for y in range(0,9):&lt;br /&gt;                    if not self.value_set(x,y,int(f.read(2))):&lt;br /&gt;                        print "Bad sudoku!!"&lt;br /&gt;                        return False&lt;br /&gt;            return True&lt;br /&gt;&lt;br /&gt;        def possible_value_get(self, x, y):&lt;br /&gt;            if (self.data[x][y] != 0):&lt;br /&gt;                return&lt;br /&gt;            ans = [];&lt;br /&gt;            Group = self.Groups[self.group_get(x, y)].candidate()&lt;br /&gt;            Row   = self.Rows[x].candidate()&lt;br /&gt;            Column= self.Columns[y].candidate()&lt;br /&gt;            for i in Group:&lt;br /&gt;                if i in Row and i in Column:&lt;br /&gt;                    ans.append(i);&lt;br /&gt;            return ans;&lt;br /&gt;&lt;br /&gt;        def puzzle_solving_iterate(self):&lt;br /&gt;            min_x = 0&lt;br /&gt;            min_y = 0&lt;br /&gt;            min=10&lt;br /&gt;            for x in range(0,9):&lt;br /&gt;                for y in range(0,9):&lt;br /&gt;                    pos = self.possible_value_get(x,y)&lt;br /&gt;                    self.DATA[x][y] = pos&lt;br /&gt;                    if pos == None:&lt;br /&gt;                        continue&lt;br /&gt;                    if len(pos) == 1:&lt;br /&gt;                        v = pos[0]&lt;br /&gt;                        self.value_set(x,y,v)&lt;br /&gt;                        self.trace.append(Cmd_Node(x,y,v, pos))&lt;br /&gt;                    if pos.__len__() &amp;lt; min:&lt;br /&gt;                        min_x = x&lt;br /&gt;                        min_y = y&lt;br /&gt;                        min = pos.__len__()&lt;br /&gt;            if min == 1:&lt;br /&gt;                return True&lt;br /&gt;            #guess has to be made&lt;br /&gt;            if self.DATA[min_x][min_y].__len__() &amp;gt; 0:&lt;br /&gt;                guess = self.DATA[min_x][min_y][0]&lt;br /&gt;                self.trace.append(Cmd_Node(min_x, min_y, guess, self.DATA[min_x][min_y]))&lt;br /&gt;                return self.value_set(min_x, min_y,guess)&lt;br /&gt;            return False&lt;br /&gt;&lt;br /&gt;        def puzzle_solving(self):&lt;br /&gt;            while self.num_rest &amp;gt; 0:&lt;br /&gt;                if self.puzzle_solving_iterate():&lt;br /&gt;                    continue&lt;br /&gt;                continue_flag=True&lt;br /&gt;                while continue_flag:&lt;br /&gt;                    cmd = self.trace.pop()&lt;br /&gt;                    if cmd.D.__len__()==0:&lt;br /&gt;                        self.value_unset(cmd.x, cmd.y)&lt;br /&gt;                        continue&lt;br /&gt;                    self.value_unset(cmd.x, cmd.y)&lt;br /&gt;                    for x in range(0,9):&lt;br /&gt;                        for y in range(0,9):&lt;br /&gt;                            pos = self.possible_value_get(x,y)&lt;br /&gt;                            self.DATA[x][y] = pos&lt;br /&gt;                    while cmd.D.__len__() &amp;gt; 0:&lt;br /&gt;                        v = cmd.retry()&lt;br /&gt;                        if self.DATA[cmd.x][cmd.y].__contains__(v):&lt;br /&gt;                            self.value_set(cmd.x, cmd.y, v)&lt;br /&gt;                            self.trace.append(cmd)&lt;br /&gt;                            continue_flag = False&lt;br /&gt;                            break&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;4. run a lot of test cases to check out the bottleneck &lt;br /&gt;&lt;br /&gt;如 case &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;0 7 8 1 0 0 5 0 0&lt;br /&gt;0 0 6 0 0 0 0 0 0&lt;br /&gt;5 0 0 0 4 0 0 0 0&lt;br /&gt;0 1 0 0 0 0 0 0 0&lt;br /&gt;0 0 4 8 0 0 0 0 0&lt;br /&gt;0 0 0 0 0 9 2 0 3&lt;br /&gt;0 0 1 0 0 2 0 0 8&lt;br /&gt;9 6 3 0 0 0 0 5 0&lt;br /&gt;0 0 0 4 0 0 3 0 9&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;以下是test case 分析出來的結果&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;         172502 function calls in 0.651 CPU seconds&lt;br /&gt;&lt;br /&gt;   Ordered by: standard name&lt;br /&gt;&lt;br /&gt;   ncalls  tottime  percall  cumtime  percall filename:lineno(function)&lt;br /&gt;        1    0.000    0.000    0.651    0.651 &lt;string&gt;:1(&lt;module&gt;)&lt;br /&gt;        1    0.000    0.000    0.651    0.651 testcase.py:45(_TC_Board_profileing)&lt;br /&gt;        1    0.000    0.000    0.002    0.002 tick_solver.py:102(file_read)&lt;br /&gt;    34101    0.318    0.000    0.507    0.000 tick_solver.py:111(possible_value_get)&lt;br /&gt;       98    0.033    0.000    0.188    0.002 tick_solver.py:123(puzzle_solving_iterate)&lt;br /&gt;      909    0.004    0.000    0.005    0.000 tick_solver.py:14(unset)&lt;br /&gt;        1    0.006    0.006    0.649    0.649 tick_solver.py:150(puzzle_solving)&lt;br /&gt;    53544    0.079    0.000    0.079    0.000 tick_solver.py:19(candidate)&lt;br /&gt;      341    0.002    0.000    0.002    0.000 tick_solver.py:23(__init__)&lt;br /&gt;       20    0.000    0.000    0.000    0.000 tick_solver.py:34(retry)&lt;br /&gt;        1    0.000    0.000    0.002    0.002 tick_solver.py:43(__init__)&lt;br /&gt;      442    0.007    0.000    0.017    0.000 tick_solver.py:64(value_set)&lt;br /&gt;       27    0.000    0.000    0.000    0.000 tick_solver.py:7(__init__)&lt;br /&gt;      303    0.064    0.000    0.424    0.001 tick_solver.py:78(value_unset)&lt;br /&gt;     1152    0.004    0.000    0.006    0.000 tick_solver.py:9(set)&lt;br /&gt;    18535    0.044    0.000    0.044    0.000 tick_solver.py:90(group_get)&lt;br /&gt;     4397    0.006    0.000    0.006    0.000 {len}&lt;br /&gt;    52821    0.073    0.000    0.073    0.000 {method 'append' of 'list' objects}&lt;br /&gt;        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}&lt;br /&gt;      323    0.001    0.000    0.001    0.000 {method 'pop' of 'list' objects}&lt;br /&gt;       81    0.000    0.000    0.000    0.000 {method 'read' of 'file' objects}&lt;br /&gt;     1152    0.002    0.000    0.002    0.000 {method 'remove' of 'list' objects}&lt;br /&gt;        1    0.000    0.000    0.000    0.000 {open}&lt;br /&gt;     4249    0.008    0.000    0.008    0.000 {range}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;我們會發現&lt;br /&gt;possible_value_get被  call 了 34101 次，花了 0.318 秒&lt;br /&gt;candidate 被 call 了 53544 次…花了 0.079 秒&lt;br /&gt;list 的 append 被 call 了 52821 次 花了 0.073 秒&lt;br /&gt;&lt;br /&gt;種種的數據告訴我 possible_value_get 是最大的 bottleneck&lt;br /&gt;array 的 operation 過於 大量且昂貴&lt;br /&gt;而在這，我選擇的方式是…改變 Group 存數字的方式：用 binary operations&lt;br /&gt;所以 Group 就變成了&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;class Group:&lt;br /&gt;    def __init__(self, value=0x1ff):&lt;br /&gt;        self.left = value&lt;br /&gt;    def set(self, x):&lt;br /&gt;        if self.left &amp;amp; (1 &amp;lt;&amp;lt; (x-1)):&lt;br /&gt;            self.left &amp;amp;= (~(1&amp;lt;&amp;lt; (x-1)))&lt;br /&gt;            return True&lt;br /&gt;        return False&lt;br /&gt;    def unset(self, x):&lt;br /&gt;        if not self.left &amp;amp; (1 &amp;lt;&amp;lt; (x-1)):&lt;br /&gt;            self.left |= (1 &amp;lt;&amp;lt; (x-1))&lt;br /&gt;            return True&lt;br /&gt;        return False&lt;br /&gt;    def contains(self, x):&lt;br /&gt;        return not not self.left &amp;amp; (1 &amp;lt;&amp;lt; (x-1))&lt;br /&gt;    def len(self):&lt;br /&gt;        ans = 0&lt;br /&gt;        v = self.left;&lt;br /&gt;        while v:&lt;br /&gt;            v &amp;amp;= v -1&lt;br /&gt;            ans += 1&lt;br /&gt;        return ans&lt;br /&gt;&lt;br /&gt;def len(v):&lt;br /&gt;    ans=0&lt;br /&gt;    while v:&lt;br /&gt;        v &amp;amp;= v - 1&lt;br /&gt;        ans += 1&lt;br /&gt;    return ans&lt;br /&gt;&lt;br /&gt;def min_value(V):&lt;br /&gt;    v=1&lt;br /&gt;    while not V &amp;amp; 1:&lt;br /&gt;        V = V &amp;gt;&amp;gt; 1&lt;br /&gt;        v+=1&lt;br /&gt;    return v&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;而 possible_value_get 變成了&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;        def possible_value_get(self, x, y):&lt;br /&gt;            return self.Groups[(int(x/3)*3 + int(y/3))].left &amp;amp; self.Rows[x].left &amp;amp; self.Columns[y].left&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;沒錯…就變成了兩個 operations&lt;br /&gt;而時間從 變成 0.651&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;27546 function calls in 0.126 CPU seconds&lt;br /&gt;   Ordered by: standard name&lt;br /&gt;&lt;br /&gt;   ncalls  tottime  percall  cumtime  percall filename:lineno(function)&lt;br /&gt;        1    0.000    0.000    0.126    0.126 &lt;string&gt;:1(&lt;module&gt;)&lt;br /&gt;        1    0.000    0.000    0.126    0.126 testcase.py:45(_TC_Board_profileing)&lt;br /&gt;        1    0.001    0.001    0.002    0.002 tick_solver.py:114(file_read)&lt;br /&gt;     7280    0.024    0.000    0.024    0.000 tick_solver.py:127(possible_value_get)&lt;br /&gt;      128    0.042    0.000    0.104    0.001 tick_solver.py:136(puzzle_solving_iterate)&lt;br /&gt;     1161    0.002    0.000    0.002    0.000 tick_solver.py:14(unset)&lt;br /&gt;        1    0.007    0.007    0.124    0.124 tick_solver.py:172(puzzle_solving)&lt;br /&gt;     1404    0.002    0.000    0.002    0.000 tick_solver.py:19(contains)&lt;br /&gt;    12148    0.028    0.000    0.028    0.000 tick_solver.py:29(len)&lt;br /&gt;      415    0.001    0.000    0.001    0.000 tick_solver.py:37(__init__)&lt;br /&gt;       30    0.000    0.000    0.000    0.000 tick_solver.py:44(retry)&lt;br /&gt;        1    0.000    0.000    0.002    0.002 tick_solver.py:56(__init__)&lt;br /&gt;       27    0.000    0.000    0.000    0.000 tick_solver.py:7(__init__)&lt;br /&gt;      526    0.007    0.000    0.013    0.000 tick_solver.py:76(value_set)&lt;br /&gt;     1404    0.003    0.000    0.003    0.000 tick_solver.py:9(set)&lt;br /&gt;      387    0.003    0.000    0.006    0.000 tick_solver.py:90(value_unset)&lt;br /&gt;      490    0.001    0.000    0.001    0.000 {method 'append' of 'list' objects}&lt;br /&gt;        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}&lt;br /&gt;      387    0.001    0.000    0.001    0.000 {method 'pop' of 'list' objects}&lt;br /&gt;      161    0.000    0.000    0.000    0.000 {method 'read' of 'file' objects}&lt;br /&gt;        1    0.000    0.000    0.000    0.000 {open}&lt;br /&gt;     1591    0.003    0.000    0.003    0.000 {range}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;從快的我們會發現 bottleneck 變成了&lt;br /&gt;12148    0.028    0.000    0.028    0.000 tick_solver.py:29(len)&lt;br /&gt;7280    0.024    0.000    0.024    0.000 tick_solver.py:127(possible_value_get)&lt;br /&gt;由於我是用 binary operation 算 len 變成一個 cost 相當高的事。而小弟覺得用查表法實在不夠好玩… 就是不肯用，所以就找出 len 的使用點，只做最必要的計算。(其實還可以用其它變數去存…這也會比較快)&lt;br /&gt;而possible_value_get 其實已經很快了…可是因為被 call 的次數很多，所以太花時間 （大多在 type checking 和 stack jump） 所以就直接 inline 到被 call 的地方&lt;br /&gt;&lt;br /&gt;如此一直找 bottleneck 的位置，不停的 "反" refactoring &lt;br /&gt;最後變成&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;         2655 function calls in 0.039 CPU seconds&lt;br /&gt;&lt;br /&gt;   Ordered by: standard name&lt;br /&gt;&lt;br /&gt;   ncalls  tottime  percall  cumtime  percall filename:lineno(function)&lt;br /&gt;        1    0.000    0.000    0.039    0.039 &lt;string&gt;:1(&lt;module&gt;)&lt;br /&gt;      387    0.002    0.000    0.002    0.000 tick_solver.py:107(value_unset)&lt;br /&gt;        1    0.000    0.000    0.000    0.000 tick_solver.py:137(array_get)&lt;br /&gt;        1    0.031    0.031    0.038    0.038 tick_solver.py:149(puzzle_solving)&lt;br /&gt;      387    0.001    0.000    0.001    0.000 tick_solver.py:29(len)&lt;br /&gt;      415    0.001    0.000    0.001    0.000 tick_solver.py:44(__init__)&lt;br /&gt;       30    0.000    0.000    0.000    0.000 tick_solver.py:51(retry)&lt;br /&gt;        1    0.000    0.000    0.000    0.000 tick_solver.py:68(reinit)&lt;br /&gt;       27    0.000    0.000    0.000    0.000 tick_solver.py:7(__init__)&lt;br /&gt;        1    0.000    0.000    0.039    0.039 tick_solver.py:84(run)&lt;br /&gt;      526    0.003    0.000    0.003    0.000 tick_solver.py:92(value_set)&lt;br /&gt;      490    0.001    0.000    0.001    0.000 {method 'append' of 'list' objects}&lt;br /&gt;        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}&lt;br /&gt;      387    0.001    0.000    0.001    0.000 {method 'pop' of 'list' objects&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;又快了三倍 ^_^&lt;br /&gt;&lt;br /&gt;然而在高興之餘卻發現到有一些 test case 會跑非常的久&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;tick@tock:~/work/sudoku&gt;./testcase.py case_09.txt &lt;br /&gt;[0, 0, 0, 0, 0, 0, 0, 0, 0]&lt;br /&gt;[0, 0, 0, 0, 0, 0, 9, 0, 0]&lt;br /&gt;[0, 0, 0, 0, 6, 0, 1, 0, 0]&lt;br /&gt;[0, 0, 0, 0, 1, 0, 0, 0, 0]&lt;br /&gt;[0, 0, 0, 0, 9, 0, 0, 0, 0]&lt;br /&gt;[0, 0, 0, 0, 0, 0, 0, 5, 0]&lt;br /&gt;[0, 0, 0, 0, 0, 0, 8, 0, 0]&lt;br /&gt;[0, 9, 0, 0, 0, 0, 0, 3, 0]&lt;br /&gt;[0, 0, 0, 7, 0, 0, 0, 0, 0]&lt;br /&gt;         3838777 function calls in 47.685 CPU seconds&lt;br /&gt;&lt;br /&gt;   Ordered by: standard name&lt;br /&gt;&lt;br /&gt;   ncalls  tottime  percall  cumtime  percall filename:lineno(function)&lt;br /&gt;        1    0.000    0.000   47.685   47.685 &lt;string&gt;:1(&lt;module&gt;)&lt;br /&gt;        1    0.000    0.000   47.685   47.685 testcase.py:47(_TC_Board_profileing)&lt;br /&gt;        1    0.000    0.000    0.001    0.001 tick_solver.py:134(array_get)&lt;br /&gt;        1   36.462   36.462   47.684   47.684 tick_solver.py:181(puzzle_solving)&lt;br /&gt;   639734    1.038    0.000    1.038    0.000 tick_solver.py:29(len)&lt;br /&gt;   568664    1.425    0.000    1.425    0.000 tick_solver.py:37(__init__)&lt;br /&gt;    71141    0.297    0.000    0.297    0.000 tick_solver.py:44(retry)&lt;br /&gt;        1    0.000    0.000    0.000    0.000 tick_solver.py:61(reinit)&lt;br /&gt;       27    0.000    0.000    0.000    0.000 tick_solver.py:7(__init__)&lt;br /&gt;        1    0.000    0.000   47.685   47.685 tick_solver.py:77(run)&lt;br /&gt;   639886    3.827    0.000    3.827    0.000 tick_solver.py:85(value_set)&lt;br /&gt;   639734    2.801    0.000    2.801    0.000 tick_solver.py:99(value_unset)&lt;br /&gt;   639850    0.893    0.000    0.893    0.000 {method 'append' of 'list' objects}&lt;br /&gt;        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}&lt;br /&gt;   639734    0.942    0.000    0.942    0.000 {method 'pop' of 'list' objects}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[7, 6, 9, 1, 2, 8, 3, 4, 5]&lt;br /&gt;[1, 2, 8, 3, 4, 5, 9, 6, 7]&lt;br /&gt;[3, 4, 5, 9, 6, 7, 1, 2, 8]&lt;br /&gt;[6, 5, 7, 2, 1, 3, 4, 8, 9]&lt;br /&gt;[2, 8, 3, 5, 9, 4, 6, 7, 1]&lt;br /&gt;[9, 1, 4, 8, 7, 6, 2, 5, 3]&lt;br /&gt;[5, 7, 2, 4, 3, 1, 8, 9, 6]&lt;br /&gt;[8, 9, 1, 6, 5, 2, 7, 3, 4]&lt;br /&gt;[4, 3, 6, 7, 8, 9, 5, 1, 2]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;這是因為我走迷宮時用相當簡單的 guess ，找出最小的 candidate&lt;br /&gt;而很不幸，在一些迷宮中…（尤其是那些只有唯一解的）一但走錯… cost 就會走很遠，再走回來…這是我在演算法上的miss。所以就再加上了一些演算法來做相當複雜的 guess。而演算法的選擇也是很出現機率最高的來選擇… 只為 hard guess 相當的花時間…所以我只有在題目相當困難時 (最少candidate 的cell 依然有超過三個選擇時) (關鍵少數) 才去做。其它的，就交給暴力走迷宮法。&lt;br /&gt;&lt;br /&gt;而 hard guess 也很成功的減少了 retry 的次數… ^^;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;tick@tock:~/work/sudoku&gt;./testcase.py case_09.txt &lt;br /&gt;[0, 0, 0, 0, 0, 0, 0, 0, 0]&lt;br /&gt;[0, 0, 0, 0, 0, 0, 9, 0, 0]&lt;br /&gt;[0, 0, 0, 0, 6, 0, 1, 0, 0]&lt;br /&gt;[0, 0, 0, 0, 1, 0, 0, 0, 0]&lt;br /&gt;[0, 0, 0, 0, 9, 0, 0, 0, 0]&lt;br /&gt;[0, 0, 0, 0, 0, 0, 0, 5, 0]&lt;br /&gt;[0, 0, 0, 0, 0, 0, 8, 0, 0]&lt;br /&gt;[0, 9, 0, 0, 0, 0, 0, 3, 0]&lt;br /&gt;[0, 0, 0, 7, 0, 0, 0, 0, 0]&lt;br /&gt;         372 function calls in 0.028 CPU seconds&lt;br /&gt;&lt;br /&gt;   Ordered by: standard name&lt;br /&gt;&lt;br /&gt;   ncalls  tottime  percall  cumtime  percall filename:lineno(function)&lt;br /&gt;        1    0.000    0.000    0.028    0.028 &lt;string&gt;:1(&lt;module&gt;)&lt;br /&gt;        1    0.000    0.000    0.001    0.001 tick_solver.py:137(array_get)&lt;br /&gt;        1    0.025    0.025    0.027    0.027 tick_solver.py:149(puzzle_solving)&lt;br /&gt;       71    0.000    0.000    0.000    0.000 tick_solver.py:44(__init__)&lt;br /&gt;        1    0.000    0.000    0.000    0.000 tick_solver.py:68(reinit)&lt;br /&gt;       27    0.000    0.000    0.000    0.000 tick_solver.py:7(__init__)&lt;br /&gt;        1    0.000    0.000    0.028    0.028 tick_solver.py:84(run)&lt;br /&gt;      152    0.001    0.000    0.001    0.000 tick_solver.py:92(value_set)&lt;br /&gt;      116    0.000    0.000    0.000    0.000 {method 'append' of 'list' objects}&lt;br /&gt;        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[8, 2, 5, 1, 7, 9, 3, 4, 6]&lt;br /&gt;[4, 1, 6, 3, 2, 5, 9, 7, 8]&lt;br /&gt;[9, 3, 7, 4, 6, 8, 1, 2, 5]&lt;br /&gt;[7, 5, 9, 2, 1, 6, 4, 8, 3]&lt;br /&gt;[3, 4, 8, 5, 9, 7, 6, 1, 2]&lt;br /&gt;[1, 6, 2, 8, 4, 3, 7, 5, 9]&lt;br /&gt;[5, 7, 1, 9, 3, 2, 8, 6, 4]&lt;br /&gt;[2, 9, 4, 6, 8, 1, 5, 3, 7]&lt;br /&gt;[6, 8, 3, 7, 5, 4, 2, 9, 1]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;有些地方被 inline 掉了 :P&lt;br /&gt;&lt;br /&gt;以下是目前的 source code, 蠻髒的，不過也蠻好玩的&lt;br /&gt;&lt;br /&gt;Filename: tick_solver.py&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;&lt;br /&gt;ROWS=9&lt;br /&gt;COLUMNS=9&lt;br /&gt;TOTAL_ELEMENTS=81&lt;br /&gt;&lt;br /&gt;class Group:&lt;br /&gt;    def __init__(self, value=0x1ff):&lt;br /&gt;        self.left = value&lt;br /&gt;    def set(self, x):&lt;br /&gt;        if self.left &amp;amp; (1 &amp;lt;&amp;lt; (x-1)):&lt;br /&gt;            self.left &amp;amp;= (~(1&amp;lt;&amp;lt; (x-1)))&lt;br /&gt;            return True&lt;br /&gt;        return False&lt;br /&gt;    def unset(self, x):&lt;br /&gt;        if not self.left &amp;amp; (1 &amp;lt;&amp;lt; (x-1)):&lt;br /&gt;            self.left |= (1 &amp;lt;&amp;lt; (x-1))&lt;br /&gt;            return True&lt;br /&gt;        return False&lt;br /&gt;    def contains(self, x):&lt;br /&gt;        return not not self.left &amp;amp; (1 &amp;lt;&amp;lt; (x-1))&lt;br /&gt;    def len(self):&lt;br /&gt;        ans = 0&lt;br /&gt;        v = self.left;&lt;br /&gt;        while v:&lt;br /&gt;            v &amp;amp;= v -1&lt;br /&gt;            ans += 1&lt;br /&gt;        return ans&lt;br /&gt;&lt;br /&gt;def len(v):&lt;br /&gt;    ans=0&lt;br /&gt;    while v:&lt;br /&gt;        v &amp;amp;= v - 1&lt;br /&gt;        ans += 1&lt;br /&gt;    return ans&lt;br /&gt;&lt;br /&gt;def min_value(V):&lt;br /&gt;    v=1&lt;br /&gt;    while not V &amp;amp; 1:&lt;br /&gt;        V = V &amp;gt;&amp;gt; 1&lt;br /&gt;        v+=1&lt;br /&gt;    return v&lt;br /&gt;&lt;br /&gt;class Cmd_Node:&lt;br /&gt;    def __init__(self, x, y, v, Data):&lt;br /&gt;        self.x = x&lt;br /&gt;        self.y = y&lt;br /&gt;        self.v = v&lt;br /&gt;        self.D = Data&lt;br /&gt;        self.D &amp;amp;= ~( 1 &amp;lt;&amp;lt; (v-1) )&lt;br /&gt;&lt;br /&gt;    def retry(self):&lt;br /&gt;        v=0&lt;br /&gt;        while not self.D &amp;amp; (1 &amp;lt;&amp;lt; v):&lt;br /&gt;            v+=1&lt;br /&gt;        self.D &amp;amp;= ~(1 &amp;lt;&amp;lt; v);&lt;br /&gt;        v+=1&lt;br /&gt;        self.v = v;&lt;br /&gt;        return v;&lt;br /&gt;    def pretty_print(self):&lt;br /&gt;        print "x="+str(self.x)+"  y="+str(self.y)+"  v="+str(self.v)+"  D="+str(self.D)&lt;br /&gt;&lt;br /&gt;from test_module import *&lt;br /&gt;&lt;br /&gt;class Board(TestModule):&lt;br /&gt; def __init__(self):&lt;br /&gt;            self.reinit()&lt;br /&gt;&lt;br /&gt;        def reinit(self):&lt;br /&gt;            self.num_rest=TOTAL_ELEMENTS&lt;br /&gt;            self.trace = []&lt;br /&gt;            self.DATA = []&lt;br /&gt;            self.data = []&lt;br /&gt;            self.Rows = []&lt;br /&gt;            self.Columns = []&lt;br /&gt;            self.Groups  = []&lt;br /&gt;            for i in  xrange(0,9):&lt;br /&gt;                self.Rows.append(Group())&lt;br /&gt;                self.Columns.append(Group())&lt;br /&gt;                self.Groups.append(Group())&lt;br /&gt;                self.data.append([0, 0, 0, 0, 0, 0, 0, 0, 0])&lt;br /&gt;                self.DATA.append([ 0, 0, 0, 0, 0, 0, 0, 0, 0])&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        def run(self, array):&lt;br /&gt;            self.reinit()&lt;br /&gt;            self.array_get(array)&lt;br /&gt;            self.puzzle_solving()&lt;br /&gt;            return self.data&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;        # index from 0 - 8&lt;br /&gt; def value_set(self, x, y, v):&lt;br /&gt;            if (v==0):&lt;br /&gt;                return True&lt;br /&gt;            mask = (1&amp;lt;&amp;lt; (v-1))&lt;br /&gt;            if mask &amp;amp; self.Columns[y].left &amp;amp; self.Rows[x].left &amp;amp; self.Groups[(int(x/3)*3 + int(y/3))].left:&lt;br /&gt;                self.data[x][y]  = v&lt;br /&gt;                mask = ~mask&lt;br /&gt;                self.Columns[y].left &amp;amp;= mask&lt;br /&gt;                self.Rows[x].left &amp;amp;= mask&lt;br /&gt;                self.Groups[(int(x/3)*3 + int(y/3))].left &amp;amp;= mask&lt;br /&gt;                self.num_rest = self.num_rest - 1;    &lt;br /&gt;                return True&lt;br /&gt;            print "Set ("+str(x)+", "+str(y)+")="+str(v) +" Failed!!!"&lt;br /&gt;            return False&lt;br /&gt;&lt;br /&gt;        def value_unset(self, x, y):&lt;br /&gt;            v = self.data[x][y]&lt;br /&gt;            self.data[x][y] = 0&lt;br /&gt;            mask = (1 &amp;lt;&amp;lt; (v-1))&lt;br /&gt;            self.Columns[y].left |= mask&lt;br /&gt;            self.Rows[x].left |= mask&lt;br /&gt;            self.Groups[(int(x/3)*3 + int(y/3))].left |= mask&lt;br /&gt;            self.num_rest = self.num_rest + 1;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        def data_print(self):&lt;br /&gt;            print self.data&lt;br /&gt;&lt;br /&gt;        def pretty_print(self):&lt;br /&gt;            for i in xrange(0,9):&lt;br /&gt;                print self.data[i]&lt;br /&gt;&lt;br /&gt;        def file_read(self, name):&lt;br /&gt;            f = open(name, "r")&lt;br /&gt;            for x in  xrange(0,9):&lt;br /&gt;                for y in  xrange(0,9):&lt;br /&gt;                    while True:&lt;br /&gt;                        v = f.read(1)&lt;br /&gt;                        if v &amp;gt;= '0' and v &amp;lt;= '9':&lt;br /&gt;                            break;&lt;br /&gt;                    if not self.value_set(x,y,int(v)):&lt;br /&gt;                        print "Bad sudoku!!"&lt;br /&gt;                        return False&lt;br /&gt;            return True&lt;br /&gt;&lt;br /&gt;        def array_get(self, array):&lt;br /&gt;            for x in xrange(0,9):&lt;br /&gt;                for y in xrange(0,9):&lt;br /&gt;                    if not self.value_set(x,y,array[x][y]):&lt;br /&gt;                        print "Bad sudoku!!"&lt;br /&gt;                        return False&lt;br /&gt;            return True&lt;br /&gt;&lt;br /&gt;        def possible_value_get(self, x, y):&lt;br /&gt;            return self.Groups[(int(x/3)*3 + int(y/3))].left &amp;amp; self.Rows[x].left &amp;amp; self.Columns[y].left&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        def puzzle_solving(self):&lt;br /&gt;            while self.num_rest &amp;gt; 0:&lt;br /&gt;                min=10&lt;br /&gt;                for x in  xrange(0,9):&lt;br /&gt;                    for y in  xrange(0,9):&lt;br /&gt;                        if self.data[x][y]:&lt;br /&gt;                            continue&lt;br /&gt;                        pos = self.Groups[(int(x/3)*3 + int(y/3))].left &amp;amp; self.Rows[x].left &amp;amp; self.Columns[y].left&lt;br /&gt;                        self.DATA[x][y] = pos&lt;br /&gt;                        if pos == None:&lt;br /&gt;                            continue&lt;br /&gt;                        lentmp = 0&lt;br /&gt;                        v = pos;&lt;br /&gt;                        while v:&lt;br /&gt;                            v &amp;amp;= v -1&lt;br /&gt;                            lentmp += 1&lt;br /&gt;&lt;br /&gt;                        if lentmp == 1:&lt;br /&gt;                            v = 0&lt;br /&gt;                            while not (pos &amp;amp; 1 &amp;lt;&amp;lt; v):&lt;br /&gt;                                v += 1&lt;br /&gt;                            v += 1&lt;br /&gt;                            self.value_set(x,y,v)&lt;br /&gt;                            self.trace.append(Cmd_Node(x,y,v, pos))&lt;br /&gt;                        if lentmp &amp;lt; min:&lt;br /&gt;                            min_x = x&lt;br /&gt;                            min_y = y&lt;br /&gt;                            min = lentmp&lt;br /&gt;                if min == 1:&lt;br /&gt;                    continue&lt;br /&gt;                #guess has to be made&lt;br /&gt;                if min &amp;gt; 0:&lt;br /&gt;                    guess = 0&lt;br /&gt;                    if min == 2:&lt;br /&gt;                        while not (self.DATA[min_x][min_y] &amp;amp;  1 &amp;lt;&amp;lt; guess):&lt;br /&gt;                            guess += 1&lt;br /&gt;                        guess += 1&lt;br /&gt;                    else: # give a better guess here&lt;br /&gt;                        Row = min_x % 3&lt;br /&gt;                        R_base = min_x/3&lt;br /&gt;                        Column = min_y % 3&lt;br /&gt;                        C_base = min_y/3&lt;br /&gt;                        V = self.DATA[min_x][min_y]&lt;br /&gt;                        # remove hidden &lt;br /&gt;                        while V:&lt;br /&gt;                            a = V &amp;amp; 1&lt;br /&gt;                            V = V &amp;gt;&amp;gt; 1&lt;br /&gt;                            guess += 1&lt;br /&gt;                            if not a:&lt;br /&gt;                                continue&lt;br /&gt;                            row_single_check = 0&lt;br /&gt;                            column_single_check = 0&lt;br /&gt;                            mask = (1 &amp;lt;&amp;lt; (guess-1))&lt;br /&gt;                            for i in [0, 1, 2]:&lt;br /&gt;                                if Row != i and (self.Rows[R_base + i].left &amp;amp; mask):&lt;br /&gt;                                        row_single_check += 1&lt;br /&gt;                                if Column != i and (self.Columns[C_base + i].left &amp;amp; mask):&lt;br /&gt;                                        column_single_check += 1&lt;br /&gt;                            if row_single_check == 2  or column_single_check == 2:  # guess first&lt;br /&gt;                                break&lt;br /&gt;                        #guess = self.hard_guess_find(min_x, min_y, self.DATA[min_x][min_y])&lt;br /&gt;                    self.trace.append(Cmd_Node(min_x, min_y, guess, self.DATA[min_x][min_y]))&lt;br /&gt;                    if self.value_set(min_x, min_y,guess):&lt;br /&gt;                        continue&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;                continue_flag=True&lt;br /&gt;                while continue_flag:&lt;br /&gt;                    cmd = self.trace.pop()&lt;br /&gt;                    lentmp = len(cmd.D)&lt;br /&gt;                    if lentmp==0:&lt;br /&gt;                        self.value_unset(cmd.x, cmd.y)&lt;br /&gt;                        continue&lt;br /&gt;                    self.value_unset(cmd.x, cmd.y)&lt;br /&gt;                    for x in xrange(0,9):&lt;br /&gt;                        for y in  xrange(0,9):&lt;br /&gt;                            if self.data[x][y]:&lt;br /&gt;                                continue&lt;br /&gt;                            self.DATA[x][y] = self.Groups[(int(x/3)*3 + int(y/3))].left &amp;amp; self.Rows[x].left &amp;amp; self.Columns[y].left&lt;br /&gt;                    while lentmp &amp;gt; 0:&lt;br /&gt;                        if lentmp==1:&lt;br /&gt;                            v = cmd.retry()&lt;br /&gt;                            if self.DATA[cmd.x][cmd.y] &amp;amp; (1&amp;lt;&amp;lt; (v-1)):&lt;br /&gt;                                self.value_set(cmd.x, cmd.y, v)&lt;br /&gt;                                self.trace.append(cmd)&lt;br /&gt;                                continue_flag = False&lt;br /&gt;                                break&lt;br /&gt;                        else:  # when there are more than one candidates, may be we can take long time to find out a better guess&lt;br /&gt;                            v = self.hard_guess_find(cmd.x, cmd.y, cmd.D)&lt;br /&gt;                            if self.DATA[cmd.x][cmd.y] &amp;amp; (1&amp;lt;&amp;lt; (v-1)):&lt;br /&gt;                                cmd.D &amp;amp;= ~ (1&amp;lt;&amp;lt;(v-1))&lt;br /&gt;                                self.value_set(cmd.x, cmd.y, v)&lt;br /&gt;                                self.trace.append(cmd)&lt;br /&gt;                                continue_flag = False&lt;br /&gt;                                break&lt;br /&gt;                        lentmp = len(cmd.D)&lt;br /&gt;&lt;br /&gt;        def hard_guess_find(self, x, y, V):&lt;br /&gt;            Row = x % 3&lt;br /&gt;            R_base = x/3&lt;br /&gt;            Column = y % 3&lt;br /&gt;            C_base = y/3&lt;br /&gt;            v = 0&lt;br /&gt;            # remove hidden &lt;br /&gt;            while V:&lt;br /&gt;                a = V &amp;amp; 1&lt;br /&gt;                V = V &amp;gt;&amp;gt; 1&lt;br /&gt;                v += 1&lt;br /&gt;                if not a:&lt;br /&gt;                    continue&lt;br /&gt;                row_single_check = 0&lt;br /&gt;                column_single_check = 0&lt;br /&gt;                mask = (1 &amp;lt;&amp;lt; (v-1))&lt;br /&gt;                for i in xrange(0,3):&lt;br /&gt;                    if Row != i and (self.Rows[R_base + i].left &amp;amp; mask):&lt;br /&gt;                            row_single_check += 1&lt;br /&gt;                    if Column != i and (self.Columns[C_base + i].left &amp;amp; mask):&lt;br /&gt;                            column_single_check += 1&lt;br /&gt;                if row_single_check == 2  or column_single_check == 2:  # guess first&lt;br /&gt;                    return v&lt;br /&gt;            return v&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;以下是跑 1000 個 test case 的分析圖 (用 octave 畫的)&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_uSgEb50CjDE/SGJ9QzTOPsI/AAAAAAAAAHw/410khbvQUw0/s1600-h/Screenshot.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_uSgEb50CjDE/SGJ9QzTOPsI/AAAAAAAAAHw/410khbvQUw0/s400/Screenshot.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5215869046050668226" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;可以看得出來其實大多數的 test case 都在 0.01 秒做完，而比較久的也在 0.02 秒內做完. 中位數在 0.003 秒&lt;br /&gt;其實還有相當多地方可以改進… 如查表，pattern map等等…&lt;br /&gt;不過…我個人覺得以一個小比賽來說…可以了… ^_^;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4272939767197667332-8807095099069964515?l=linuxocarina.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linuxocarina.blogspot.com/feeds/8807095099069964515/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4272939767197667332&amp;postID=8807095099069964515' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/8807095099069964515'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/8807095099069964515'/><link rel='alternate' type='text/html' href='http://linuxocarina.blogspot.com/2008/06/sudoku-solver-partii.html' title='sudoku solver partII'/><author><name>Tick</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://lh3.google.com/ticktock35/RxbHkGdUPGI/AAAAAAAAAE0/IFbLByIbaj8/s144/tux_ocarina.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_uSgEb50CjDE/SGJ9QzTOPsI/AAAAAAAAAHw/410khbvQUw0/s72-c/Screenshot.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4272939767197667332.post-7991103508895925348</id><published>2008-06-19T00:37:00.003+08:00</published><updated>2008-06-19T00:49:10.851+08:00</updated><title type='text'>Sudoku solver</title><content type='html'>在公司內辦了一場 Python Sudoku solver 比賽&lt;br /&gt;下星期二才會正式跑 benchmark ^^&lt;br /&gt;今早寫了一下，加上一些 turning&lt;br /&gt;就看著 code 是如何的一步一步的加速…&lt;br /&gt;從開始到現在，竟然已經加速了 1000 多倍了…&lt;br /&gt;可是 code 也越來越噁心…簡直就是 反refactoring&lt;br /&gt;為了讓比賽更好玩… 先把 code post 出來了 ^_^&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;反正…  just for fun :)&lt;br /&gt;&lt;br /&gt;Filename: tick_solver.py&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;&lt;br /&gt;ROWS=9&lt;br /&gt;COLUMNS=9&lt;br /&gt;TOTAL_ELEMENTS=81&lt;br /&gt;&lt;br /&gt;class Group:&lt;br /&gt;   def __init__(self, value=0x1ff):&lt;br /&gt;       self.left = value&lt;br /&gt;   def set(self, x):&lt;br /&gt;       if self.left &amp;amp; (1 &amp;lt;&amp;lt; (x-1)):&lt;br /&gt;           self.left &amp;amp;= (~(1&amp;lt;&amp;lt; (x-1)))&lt;br /&gt;           return True&lt;br /&gt;       return False&lt;br /&gt;   def unset(self, x):&lt;br /&gt;       if not self.left &amp;amp; (1 &amp;lt;&amp;lt; (x-1)):&lt;br /&gt;           self.left |= (1 &amp;lt;&amp;lt; (x-1))&lt;br /&gt;           return True&lt;br /&gt;       return False&lt;br /&gt;   def contains(self, x):&lt;br /&gt;       return not not self.left &amp;amp; (1 &amp;lt;&amp;lt; (x-1))&lt;br /&gt;   def len(self):&lt;br /&gt;       ans = 0&lt;br /&gt;       v = self.left;&lt;br /&gt;       while v:&lt;br /&gt;           v &amp;amp;= v -1&lt;br /&gt;           ans += 1&lt;br /&gt;       return ans&lt;br /&gt;&lt;br /&gt;def len(v):&lt;br /&gt;   ans=0&lt;br /&gt;   while v:&lt;br /&gt;       v &amp;amp;= v - 1&lt;br /&gt;       ans += 1&lt;br /&gt;   return ans&lt;br /&gt;&lt;br /&gt;class Cmd_Node:&lt;br /&gt;   def __init__(self, x, y, v, Data):&lt;br /&gt;       self.x = x&lt;br /&gt;       self.y = y&lt;br /&gt;       self.v = v&lt;br /&gt;       self.D = Data&lt;br /&gt;       self.D &amp;amp;= ~( 1 &amp;lt;&amp;lt; (v-1) )&lt;br /&gt;&lt;br /&gt;   def retry(self):&lt;br /&gt;       v=0&lt;br /&gt;       while not self.D &amp;amp; (1 &amp;lt;&amp;lt; v):&lt;br /&gt;           v+=1&lt;br /&gt;       self.D &amp;amp;= ~(1 &amp;lt;&amp;lt; v);&lt;br /&gt;       v+=1&lt;br /&gt;       self.v = v;&lt;br /&gt;       return v;&lt;br /&gt;   def pretty_print(self):&lt;br /&gt;       print "x="+str(self.x)+"  y="+str(self.y)+"  v="+str(self.v)+"  D="+str(self.D)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class Board():&lt;br /&gt; def __init__(self):&lt;br /&gt;           self.num_rest=TOTAL_ELEMENTS&lt;br /&gt;           self.trace = []&lt;br /&gt;           self.DATA = []&lt;br /&gt;           self.data = []&lt;br /&gt;           self.Rows = []&lt;br /&gt;           self.Columns = []&lt;br /&gt;           self.Groups  = []&lt;br /&gt;           for i in range(0, ROWS):&lt;br /&gt;               self.Rows.append(Group())&lt;br /&gt;               self.Columns.append(Group())&lt;br /&gt;               self.Groups.append(Group())&lt;br /&gt;               self.data.append([0, 0, 0, 0, 0, 0, 0, 0, 0])&lt;br /&gt;               self.DATA.append([ 0, 0, 0, 0, 0, 0, 0, 0, 0])&lt;br /&gt;&lt;br /&gt;       def run(self, array):&lt;br /&gt;           self.array_get(array)&lt;br /&gt;           self.puzzle_solving()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       # index from 0 - 8&lt;br /&gt; def value_set(self, x, y, v):&lt;br /&gt;           if (v==0):&lt;br /&gt;               return True&lt;br /&gt;           if self.Columns[y].contains(v) and \&lt;br /&gt;                   self.Rows[x].contains(v) and \&lt;br /&gt;                   self.Groups[(int(x/3)*3 + int(y/3))].contains(v):&lt;br /&gt;               self.data[x][y]  = v&lt;br /&gt;               self.Columns[y].set(v)&lt;br /&gt;               self.Rows[x].set(v)&lt;br /&gt;               self.Groups[(int(x/3)*3 + int(y/3))].set(v)&lt;br /&gt;               self.num_rest = self.num_rest - 1;   &lt;br /&gt;               return True&lt;br /&gt;           return False&lt;br /&gt;&lt;br /&gt;       def value_unset(self, x, y):&lt;br /&gt;           v = self.data[x][y]&lt;br /&gt;           self.data[x][y] = 0&lt;br /&gt;           self.Columns[y].unset(v)&lt;br /&gt;           self.Rows[x].unset(v)&lt;br /&gt;           self.Groups[(int(x/3)*3 + int(y/3))].unset(v)&lt;br /&gt;           self.num_rest = self.num_rest + 1;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       def group_get(self, x, y):&lt;br /&gt;           if (x &amp;lt; 0 or x &amp;gt; 8 or y &amp;lt; 0 or y &amp;gt; 8):&lt;br /&gt;               return -1&lt;br /&gt;           return int(x/3)*3 + int(y/3)&lt;br /&gt;&lt;br /&gt;       def data_print(self):&lt;br /&gt;           print self.data&lt;br /&gt;&lt;br /&gt;       def pretty_print(self):&lt;br /&gt;           for i in range(0,ROWS):&lt;br /&gt;               print self.data[i]&lt;br /&gt;&lt;br /&gt;       def file_read(self, name):&lt;br /&gt;           f = open(name, "r")&lt;br /&gt;           for x in range(0,9):&lt;br /&gt;               for y in range(0,9):&lt;br /&gt;                   while True:&lt;br /&gt;                       v = f.read(1)&lt;br /&gt;                       if v &amp;gt;= '0' and v &amp;lt;= '9':&lt;br /&gt;                           break;&lt;br /&gt;                   if not self.value_set(x,y,int(v)):&lt;br /&gt;                       print "Bad sudoku!!"&lt;br /&gt;                       return False&lt;br /&gt;           return True&lt;br /&gt;&lt;br /&gt;       def array_get(self, array):&lt;br /&gt;           for x in [0, 1, 2, 3, 4, 5, 6, 7, 8]:&lt;br /&gt;               for y in [0, 1, 2, 3, 4, 5, 6, 7, 8]:&lt;br /&gt;                   if not self.value_set(x,y,array[x][y]):&lt;br /&gt;                       print "Bad sudoku!!"&lt;br /&gt;                       return False&lt;br /&gt;           return True&lt;br /&gt;&lt;br /&gt;       def possible_value_get(self, x, y):&lt;br /&gt;           return self.Groups[(int(x/3)*3 + int(y/3))].left &amp;amp; self.Rows[x].left &amp;amp; self.Columns[y].left&lt;br /&gt;&lt;br /&gt;       def puzzle_solving_iterate(self):&lt;br /&gt;           min_x = 0&lt;br /&gt;           min_y = 0&lt;br /&gt;           min=10&lt;br /&gt;           for x in range(0,9):&lt;br /&gt;               for y in range(0,9):&lt;br /&gt;                   if self.data[x][y]:&lt;br /&gt;                       continue&lt;br /&gt;                   pos = self.Groups[(int(x/3)*3 + int(y/3))].left &amp;amp; self.Rows[x].left &amp;amp; self.Columns[y].left&lt;br /&gt;                   self.DATA[x][y] = pos&lt;br /&gt;                   if pos == None:&lt;br /&gt;                       continue&lt;br /&gt;                   lentmp = len(pos)&lt;br /&gt;                   if lentmp == 1:&lt;br /&gt;                       v = 0&lt;br /&gt;                       while not (pos &amp;amp; 1 &amp;lt;&amp;lt; v):&lt;br /&gt;                           v += 1&lt;br /&gt;                       v += 1&lt;br /&gt;                       self.value_set(x,y,v)&lt;br /&gt;                       self.trace.append(Cmd_Node(x,y,v, pos))&lt;br /&gt;                   if lentmp &amp;lt; min:&lt;br /&gt;                       min_x = x&lt;br /&gt;                       min_y = y&lt;br /&gt;                       min = lentmp&lt;br /&gt;           if min == 1:&lt;br /&gt;               return True&lt;br /&gt;           #guess has to be made&lt;br /&gt;           if min &amp;gt; 0:&lt;br /&gt;               guess = 0&lt;br /&gt;               while not (self.DATA[min_x][min_y] &amp;amp;  1 &amp;lt;&amp;lt; guess):&lt;br /&gt;                   guess += 1&lt;br /&gt;               guess += 1&lt;br /&gt;               self.trace.append(Cmd_Node(min_x, min_y, guess, self.DATA[min_x][min_y]))&lt;br /&gt;               return self.value_set(min_x, min_y,guess)&lt;br /&gt;           return False&lt;br /&gt;&lt;br /&gt;       def puzzle_solving(self):&lt;br /&gt;           while self.num_rest &amp;gt; 0:&lt;br /&gt;               if self.puzzle_solving_iterate():&lt;br /&gt;                   continue&lt;br /&gt;               continue_flag=True&lt;br /&gt;               while continue_flag:&lt;br /&gt;                   cmd = self.trace.pop()&lt;br /&gt;                   lentmp = len(cmd.D)&lt;br /&gt;                   if lentmp==0:&lt;br /&gt;                       self.value_unset(cmd.x, cmd.y)&lt;br /&gt;                       continue&lt;br /&gt;                   self.value_unset(cmd.x, cmd.y)&lt;br /&gt;                   for x in range(0,9):&lt;br /&gt;                       for y in range(0,9):&lt;br /&gt;                           if self.data[x][y]:&lt;br /&gt;                               continue&lt;br /&gt;                           self.DATA[x][y] = self.Groups[(int(x/3)*3 + int(y/3))].left &amp;amp; self.Rows[x].left &amp;amp; self.Columns[y].left&lt;br /&gt;                   while lentmp &amp;gt; 0:&lt;br /&gt;                       v = cmd.retry()&lt;br /&gt;                       if self.DATA[cmd.x][cmd.y] &amp;amp; (1&amp;lt;&amp;lt; (v-1)):&lt;br /&gt;                           self.value_set(cmd.x, cmd.y, v)&lt;br /&gt;                           self.trace.append(cmd)&lt;br /&gt;                           continue_flag = False&lt;br /&gt;                           break&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4272939767197667332-7991103508895925348?l=linuxocarina.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linuxocarina.blogspot.com/feeds/7991103508895925348/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4272939767197667332&amp;postID=7991103508895925348' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/7991103508895925348'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/7991103508895925348'/><link rel='alternate' type='text/html' href='http://linuxocarina.blogspot.com/2008/06/sudoku-solver.html' title='Sudoku solver'/><author><name>Tick</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://lh3.google.com/ticktock35/RxbHkGdUPGI/AAAAAAAAAE0/IFbLByIbaj8/s144/tux_ocarina.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4272939767197667332.post-8336016550523433428</id><published>2008-06-14T06:27:00.002+08:00</published><updated>2008-06-14T06:32:31.029+08:00</updated><title type='text'>邪惡的小案子</title><content type='html'>提升大家宅度的邪惡計畫：&lt;br /&gt;http://code.google.com/p/comic-reader/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4272939767197667332-8336016550523433428?l=linuxocarina.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linuxocarina.blogspot.com/feeds/8336016550523433428/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4272939767197667332&amp;postID=8336016550523433428' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/8336016550523433428'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/8336016550523433428'/><link rel='alternate' type='text/html' href='http://linuxocarina.blogspot.com/2008/06/blog-post.html' title='邪惡的小案子'/><author><name>Tick</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://lh3.google.com/ticktock35/RxbHkGdUPGI/AAAAAAAAAE0/IFbLByIbaj8/s144/tux_ocarina.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4272939767197667332.post-3687670773679106502</id><published>2008-02-13T16:04:00.004+08:00</published><updated>2009-04-24T03:11:59.980+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><title type='text'>Integrate Ecore_main_loop into gMainLoop</title><content type='html'>If we want to write a program with two kinds of event driven GUI libraries, we have to run each event processing function. There are some ways to do that.&lt;br /&gt;&lt;br /&gt;When I was writing a program with EFL and glib, I met this problem.&lt;br /&gt;&lt;br /&gt;There are two ways come up to me:&lt;br /&gt;1. Write a multi thread program and each runs a main loop.&lt;br /&gt;2. Put one main loop into another.&lt;br /&gt;&lt;br /&gt;When I tried first one by writing two threads to dealing this problem, it works well, but I am very worry about the entropy of this program. It's too high, and complicated. I have to write spin lock to protect data.&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;static gpointer  pk_thread(gpointer data) {&lt;br /&gt;     PConnect * pc = (PConnect *)data;&lt;br /&gt;     pc-&amp;gt;loop =  g_main_loop_new (NULL, FALSE);&lt;br /&gt;     debug("g_main_loop_run starts\n");&lt;br /&gt;     g_main_loop_run(pc-&amp;gt;loop);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;PConnect *  pconnect_initial() {&lt;br /&gt;     PConnect * pc  = (PConnect *)malloc (sizeof(PConnect));&lt;br /&gt;     memset(pc, 0, sizeof(PConnect));&lt;br /&gt;     if (! g_thread_supported ()) {&lt;br /&gt;             g_thread_init (NULL);&lt;br /&gt;     }&lt;br /&gt;     dbus_g_thread_init();&lt;br /&gt;     g_type_init ();&lt;br /&gt;     pc-&amp;gt;thread = g_thread_create(pk_thread, (gpointer)pc, FALSE, &amp;amp;pc-&amp;gt;error);&lt;br /&gt;     return pk_dbus_initial(pc);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The IPC becomes a nightmare.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;After thinking for a while, I tried to merge ecore main loop into glib main loop.&lt;br /&gt;Learning from &lt;a href="http://developer.kde.org/documentation/tutorials/qtgtk/main.html"&gt;Integrating QT/GTK&lt;/a&gt;&lt;br /&gt;Both Ecore and  Glib provides iterator event processing, so that I can wrap the ecore_main_loop_iterate into a GSource.&lt;br /&gt;&lt;br /&gt;Make GMainLoop do a ecore_main_loop_iterate() once at each event processing by making preparing and checking always returns true.&lt;br /&gt;&lt;br /&gt;Filename: mainlooptesting.c&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;glib.h&amp;gt;&lt;br /&gt;#include &amp;lt;Ecore.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;static gboolean GEvas_prepare (GSource *source, gint *timeout_) {&lt;br /&gt;     return TRUE;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;static gboolean GEvas_check(GSource *source) {&lt;br /&gt;     return TRUE;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;static gboolean GEvas_dispatch (GSource *source, GSourceFunc  callback, gpointer user_data) {&lt;br /&gt;     ecore_main_loop_iterate ();&lt;br /&gt;     return TRUE;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;static GSourceFuncs  Iterator_funcs = {&lt;br /&gt;     GEvas_prepare,&lt;br /&gt;     GEvas_check,&lt;br /&gt;     GEvas_dispatch,&lt;br /&gt;     NULL,&lt;br /&gt;     NULL,&lt;br /&gt;     NULL&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;int evas_timer(void *data) {&lt;br /&gt;     printf("evas_timer ran!!!\n");&lt;br /&gt;     return 1;&lt;br /&gt;}&lt;br /&gt;gboolean  glib_timer(gpointer data) {&lt;br /&gt;     printf("glib_timer ran!!!\n");&lt;br /&gt;     return TRUE;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int main (void) {&lt;br /&gt;     GMainContext *context = g_main_context_default();&lt;br /&gt;     GSource *source = g_source_new(&amp;amp;Iterator_funcs,sizeof(GSource));&lt;br /&gt;     GMainLoop *loop = g_main_loop_new (context,FALSE);&lt;br /&gt;     g_source_attach((GSource *)source, context);&lt;br /&gt;&lt;br /&gt;     ecore_timer_add(1.0f,evas_timer,NULL);&lt;br /&gt;     g_timeout_add(500,glib_timer,NULL);&lt;br /&gt;&lt;br /&gt;     g_main_run(loop);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I test each main loop by adding a timer event, and the following are results.&lt;br /&gt;./a.out&lt;br /&gt;glib_timer ran!!!&lt;br /&gt;glib_timer ran!!!&lt;br /&gt;evas_timer ran!!!&lt;br /&gt;glib_timer ran!!!&lt;br /&gt;glib_timer ran!!!&lt;br /&gt;evas_timer ran!!!&lt;br /&gt;glib_timer ran!!!&lt;br /&gt;glib_timer ran!!!&lt;br /&gt;evas_timer ran!!!&lt;br /&gt;glib_timer ran!!!&lt;br /&gt;glib_timer ran!!!&lt;br /&gt;evas_timer ran!!!&lt;br /&gt;^C&lt;br /&gt;&lt;br /&gt;Works \^_^/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4272939767197667332-3687670773679106502?l=linuxocarina.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linuxocarina.blogspot.com/feeds/3687670773679106502/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4272939767197667332&amp;postID=3687670773679106502' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/3687670773679106502'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/3687670773679106502'/><link rel='alternate' type='text/html' href='http://linuxocarina.blogspot.com/2008/02/integrate-ecoremainloop-into-gmainloop.html' title='Integrate Ecore_main_loop into gMainLoop'/><author><name>Tick</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://lh3.google.com/ticktock35/RxbHkGdUPGI/AAAAAAAAAE0/IFbLByIbaj8/s144/tux_ocarina.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4272939767197667332.post-7795342299189302611</id><published>2008-01-14T08:48:00.000+08:00</published><updated>2008-12-11T14:17:29.730+08:00</updated><title type='text'>宅男遇上 Wii remote</title><content type='html'>前幾天看到同事分享 &lt;a href="http://www.cs.cmu.edu/%7Ejohnny/projects/wii/"&gt;Johnny Lee&lt;/a&gt;的影片。心中有蠻大的震憾。一直認為 Wii Remote 已經很神奇了…沒想到還有那麼多的玩法…果然厲害。就開始想在自己的機器上玩玩 Wii Remote.&lt;br /&gt;&lt;br /&gt;沒想到一切都是如此的美好： Ubuntu 已經有了 &lt;a href="http://www.wiili.org/index.php/CWiid"&gt;CWiid&lt;/a&gt; 的 package.&lt;br /&gt;直接安裝後，把 bluetooth 打開，就可以玩了&lt;br /&gt;&lt;br /&gt;身為一名陽光宅男…當然好好的研究一下這個好玩的東西…&lt;br /&gt;也就寫了一支小小的程式…可以依 Wii remote 的水平改變小 Icon 的位置。&lt;br /&gt;&lt;br /&gt;Filename: wii_toy.c&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;#include &amp;lt;wiimote.h&amp;gt;&lt;br /&gt;#include &amp;lt;wiimote_api.h&amp;gt;&lt;br /&gt;#include &amp;lt;Ecore_Evas.h&amp;gt;&lt;br /&gt;#include &amp;lt;Ecore.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;math.h&amp;gt;&lt;br /&gt;&lt;br /&gt;#define WIDTH 800&lt;br /&gt;#define HEIGHT 600&lt;br /&gt;&lt;br /&gt;Ecore_Evas  *   ee;&lt;br /&gt;Evas        *   evas;&lt;br /&gt;&lt;br /&gt;struct remoter {&lt;br /&gt;     Evas_Object *   o;&lt;br /&gt;     wiimote_t *wii;&lt;br /&gt;     double x,y,size;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;inline void set_wiiremote(wiimote_t *wii) {&lt;br /&gt;     wii-&amp;gt;led.one  = 1;&lt;br /&gt;     wii-&amp;gt;mode.ir = 1;&lt;br /&gt;     wii-&amp;gt;mode.acc =1;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;inline void change_position(struct remoter *handle) {&lt;br /&gt;     if ( abs(handle-&amp;gt;wii-&amp;gt;tilt.x) &amp;lt;= 90 &amp;amp;&amp;amp;&lt;br /&gt;                     abs (handle-&amp;gt;wii-&amp;gt;tilt.y) &amp;lt;= 90) {&lt;br /&gt;&lt;br /&gt;             handle-&amp;gt;x += (double)handle-&amp;gt;wii-&amp;gt;tilt.x/10.0f;&lt;br /&gt;             handle-&amp;gt;y += (double)handle-&amp;gt;wii-&amp;gt;tilt.y/10.0f;&lt;br /&gt;     }&lt;br /&gt;     handle-&amp;gt;x = handle-&amp;gt;x &amp;lt;= 0 ? 0 : handle-&amp;gt;x &amp;gt;= WIDTH - handle-&amp;gt;size?  WIDTH-handle-&amp;gt;size :  handle-&amp;gt;x;&lt;br /&gt;     handle-&amp;gt;y = handle-&amp;gt;y &amp;lt;= 0 ? 0 : handle-&amp;gt;y &amp;gt;= HEIGHT - handle-&amp;gt;size? HEIGHT-handle-&amp;gt;size : handle-&amp;gt;y;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//      fprintf(stderr, "remote: x=%3.3f y=%3.3f\n",handle-&amp;gt;x,handle-&amp;gt;y);&lt;br /&gt;     evas_object_move(handle-&amp;gt;o, handle-&amp;gt;x,handle-&amp;gt;y);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;inline void show_status(wiimote_t *wii) {&lt;br /&gt;     fprintf(stderr, "AXIS x=%03d y=%03d z=%03d\n",&lt;br /&gt;             wii-&amp;gt;axis.x,&lt;br /&gt;             wii-&amp;gt;axis.y,&lt;br /&gt;             wii-&amp;gt;axis.z);&lt;br /&gt;     fprintf(stderr, "TILT x=%.3f y=%.3f z=%.3f\n",&lt;br /&gt;             wii-&amp;gt;tilt.x,&lt;br /&gt;             wii-&amp;gt;tilt.y,&lt;br /&gt;             wii-&amp;gt;tilt.z);&lt;br /&gt;     fprintf(stderr, "FORCE x=%.3f y=%.3f z=%.3f\n",&lt;br /&gt;             wii-&amp;gt;force.x,&lt;br /&gt;             wii-&amp;gt;force.y,&lt;br /&gt;             wii-&amp;gt;force.z);&lt;br /&gt;     fprintf(stderr,"\n");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int scan_wii_event(void *data) {&lt;br /&gt;     struct remoter *handle=(struct remoter *)data;&lt;br /&gt;     if (wiimote_is_open(handle-&amp;gt;wii))  {&lt;br /&gt;             if (wiimote_update(handle-&amp;gt;wii) &amp;lt; 0) {&lt;br /&gt;                     printf("Update Failed!! Exit!!\n");&lt;br /&gt;                     wiimote_disconnect(handle-&amp;gt;wii);&lt;br /&gt;                     exit(1);&lt;br /&gt;             }&lt;br /&gt;             if (handle-&amp;gt;wii-&amp;gt;keys.home) {&lt;br /&gt;                     printf("Home pressed!! Exit!!\n");&lt;br /&gt;                     wiimote_disconnect(handle-&amp;gt;wii);&lt;br /&gt;                     exit(1);&lt;br /&gt;             }&lt;br /&gt;             change_position(handle);&lt;br /&gt;             //show_status(handle-&amp;gt;wii);&lt;br /&gt;     }&lt;br /&gt;     return 1;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int main(int argc,char **argv) {&lt;br /&gt;     struct remoter handle;&lt;br /&gt;     if (argc &amp;lt; 2) {&lt;br /&gt;             fprintf(stderr, "Usage: test1 BDADDR\n");&lt;br /&gt;             exit(1);&lt;br /&gt;     }&lt;br /&gt;     Evas_Object *   background;&lt;br /&gt;     ecore_evas_init();&lt;br /&gt;&lt;br /&gt;     ee = ecore_evas_software_x11_new(NULL, 0,  0, 0, WIDTH, HEIGHT);&lt;br /&gt;     ecore_evas_title_set(ee, "Tick's Wii Toy");&lt;br /&gt;//      ecore_evas_borderless_set(ee, 1);  // borderless&lt;br /&gt;     ecore_evas_borderless_set(ee, 0);  // border&lt;br /&gt;     ecore_evas_show(ee);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     evas = ecore_evas_get(ee);&lt;br /&gt;     evas_font_path_append(evas, "fonts/");&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     background = evas_object_rectangle_add(evas);&lt;br /&gt;     evas_object_color_set(background,30,30,30,255);&lt;br /&gt;     evas_object_resize(background, WIDTH, HEIGHT);&lt;br /&gt;     evas_object_move( background,0 ,0 );&lt;br /&gt;     evas_object_focus_set(background, 1);&lt;br /&gt;     evas_object_show( background);&lt;br /&gt;&lt;br /&gt;     handle.size = 64;&lt;br /&gt;     handle.x=(WIDTH-handle.size)/2;&lt;br /&gt;     handle.y=(HEIGHT-handle.size)/2;&lt;br /&gt;     handle.o = evas_object_image_add(evas);&lt;br /&gt;     evas_object_image_file_set (handle.o, "/home/tick/work/e17/icon.png" ,NULL);&lt;br /&gt;     if (evas_object_image_load_error_get(handle.o)) {&lt;br /&gt;             printf("Evas can't load PNG files. Check Evas has PNG\n");&lt;br /&gt;             return 1;&lt;br /&gt;     }&lt;br /&gt;     evas_object_color_set(handle.o,255,255,255,128);&lt;br /&gt;     evas_object_move(handle.o, handle.x,handle.y);&lt;br /&gt;     evas_object_resize(handle.o,handle.size,handle.size);&lt;br /&gt;     evas_object_image_fill_set(handle.o, 0, 0, handle.size, handle.size);&lt;br /&gt;     evas_object_show(handle.o);&lt;br /&gt;&lt;br /&gt;     printf("Please press 1+2 to connect Wii remote!!\n");&lt;br /&gt;     handle.wii = wiimote_open(argv[1]);&lt;br /&gt;     if (!handle.wii) {&lt;br /&gt;             fprintf(stderr, "unable to open wiimote:\n");&lt;br /&gt;             exit(1);&lt;br /&gt;     }&lt;br /&gt;     printf("Connecting.......\n");&lt;br /&gt;     set_wiiremote(handle.wii);&lt;br /&gt;     ecore_timer_add(.01,scan_wii_event, &amp;amp;handle);&lt;br /&gt;     ecore_main_loop_begin();&lt;br /&gt;&lt;br /&gt;     return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;使用:&lt;br /&gt;1．先下  /etc/init.d/bluetooth start 打開bluetooth&lt;br /&gt;2．按下 Wii remote 的 1+2 鍵&lt;br /&gt;3．當 Wii remote 的Led 還在閃時，做 hcitool scan 找出你的 remote bdaddr&lt;br /&gt;4． compile 完程式後，打 ./wii_toy 00:1A:E9:3B:CA:49   &lt;--- 每個人的 wii remote 不一樣   就可以玩了 &lt;pre class="prettyprint"&gt;&lt;br /&gt;tick@tock:~/work/e17&gt;hcitool scan&lt;br /&gt;Scanning ...&lt;br /&gt;     00:1A:E9:3B:CA:49       Nintendo RVL-CNT-01&lt;br /&gt;tick@tock:~/work/e17&gt;gcc `pkg-config --libs ecore-evas evas` -I/usr/local/include/libcwiimote-0.4.0/libcwiimote/ -lcwiimote -lbluetooth -Wall -pipe -D_ENABLE_TILT -D_ENABLE_FORCE  -g2 -o wii_toy wii_toy.c&lt;br /&gt;tick@tock:~/work/e17&gt;./wii_toy 00:1A:E9:3B:CA:49&lt;br /&gt;Please press 1+2 to connect Wii remote!!&lt;br /&gt;Connecting.......&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;有圖有真象&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_uSgEb50CjDE/R4q2jEU_nNI/AAAAAAAAAGs/NbYKa_I2AkA/s1600-h/wii_toy.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_uSgEb50CjDE/R4q2jEU_nNI/AAAAAAAAAGs/NbYKa_I2AkA/s400/wii_toy.png" alt="" id="BLOGGER_PHOTO_ID_5155133437052427474" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4272939767197667332-7795342299189302611?l=linuxocarina.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linuxocarina.blogspot.com/feeds/7795342299189302611/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4272939767197667332&amp;postID=7795342299189302611' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/7795342299189302611'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/7795342299189302611'/><link rel='alternate' type='text/html' href='http://linuxocarina.blogspot.com/2008/01/wii-remote.html' title='宅男遇上 Wii remote'/><author><name>Tick</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://lh3.google.com/ticktock35/RxbHkGdUPGI/AAAAAAAAAE0/IFbLByIbaj8/s144/tux_ocarina.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_uSgEb50CjDE/R4q2jEU_nNI/AAAAAAAAAGs/NbYKa_I2AkA/s72-c/wii_toy.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4272939767197667332.post-2724865418746548649</id><published>2008-01-13T14:05:00.000+08:00</published><updated>2008-01-13T14:48:59.184+08:00</updated><title type='text'>學習 Evas</title><content type='html'>這陣子開始需要用 &lt;a href=http://www.enlightenment.org/p.php?p=index&amp;l=en&gt;Evas&lt;/a&gt; 寫一些東西…&lt;br /&gt;個人覺得學一個 library 最快的方法就是去真的拿它去寫程式。&lt;br /&gt;如我的一個好友常說的：學中作，作中學 ^^&lt;br /&gt;所以就寫了支小小的玩具… 和大家分享…&lt;br /&gt;&lt;a href="http://picasaweb.google.com/ticktock35/UntitledAlbum/photo#5154838072151481538"&gt;&lt;img src="http://lh3.google.com/ticktock35/R4mp6kU_nMI/AAAAAAAAAGk/CHCTacgTCIY/s288/Evas_study.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;亂畫一個方塊，設定一個重力場，和一個 boundary反彈機制. ( 和一些阻泥 (mark 掉了))  加上一個色彩空間的旋轉。就玩起來了 ^^&lt;br /&gt;&lt;br /&gt;程式:&lt;br /&gt;&lt;br /&gt;Filename: toy.c&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;#include &amp;lt;Ecore_Evas.h&amp;gt;&lt;br /&gt;#include &amp;lt;Ecore.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;math.h&amp;gt;&lt;br /&gt;&lt;br /&gt;#define WIDTH 400&lt;br /&gt;#define HEIGHT 400&lt;br /&gt;&lt;br /&gt;Ecore_Evas  *   ee;&lt;br /&gt;Evas        *   evas;&lt;br /&gt;Evas_Object *   base_rect;&lt;br /&gt;&lt;br /&gt;double rotation[3][3] = { {0 , 0 , 1},&lt;br /&gt;                          {1, 0, 0}, &lt;br /&gt;                          {0   , 1, 0}&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;struct bouncer {&lt;br /&gt;        Evas_Object *o;&lt;br /&gt;        int w,h;&lt;br /&gt;        double xs,ys;&lt;br /&gt;        double x,y;&lt;br /&gt;        double color[3];&lt;br /&gt;}; &lt;br /&gt;&lt;br /&gt;inline void change_color(struct bouncer *bounce) {&lt;br /&gt;        double X[3];&lt;br /&gt;        int i,j;&lt;br /&gt;        int R,G,B;&lt;br /&gt;        for (i=0;i&amp;lt;3;i++) {&lt;br /&gt;                X[i]=bounce-&amp;gt;color[i];&lt;br /&gt;                bounce-&amp;gt;color[i]=0;&lt;br /&gt;        }&lt;br /&gt;        for (i=0;i&amp;lt;3;i++) {&lt;br /&gt;                for (j=0;j&amp;lt;3;j++) {&lt;br /&gt;                        bounce-&amp;gt;color[i] += rotation[i][j]*X[j];&lt;br /&gt;                }&lt;br /&gt;        }&lt;br /&gt;        R=bounce-&amp;gt;color[0] &amp;lt; 0 ? bounce-&amp;gt;color[0] + 255: bounce-&amp;gt;color[0];&lt;br /&gt;        G=bounce-&amp;gt;color[1] &amp;lt; 0 ? bounce-&amp;gt;color[1] + 255: bounce-&amp;gt;color[1];&lt;br /&gt;        B=bounce-&amp;gt;color[2] &amp;lt; 0 ? bounce-&amp;gt;color[2] + 255: bounce-&amp;gt;color[2];&lt;br /&gt;        evas_object_color_set( bounce-&amp;gt;o , R, G, B, 255);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;inline void center(struct bouncer *bounce,double *x,double *y) {&lt;br /&gt;        *x = bounce-&amp;gt;x + bounce-&amp;gt;w/2;&lt;br /&gt;        *y = bounce-&amp;gt;y + bounce-&amp;gt;h/2;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;inline void grav(struct bouncer *bounce) {&lt;br /&gt;        const double G=300;&lt;br /&gt;        double Gx,Gy,Gs;&lt;br /&gt;        double x,y;&lt;br /&gt;        double dist;&lt;br /&gt;        center(bounce,&amp;amp;x,&amp;amp;y);&lt;br /&gt;&lt;br /&gt;        dist = pow(pow(WIDTH/2-x,2) + pow(HEIGHT/2-y,2),0.5);&lt;br /&gt;        Gs = G/pow(dist,2);&lt;br /&gt;        Gx = (WIDTH/2 - x)/dist;&lt;br /&gt;        Gy = (HEIGHT/2 -y)/dist;&lt;br /&gt;        Gx = Gx * Gs;&lt;br /&gt;        Gy = Gy * Gs;&lt;br /&gt;&lt;br /&gt;        bounce-&amp;gt;xs += Gx;&lt;br /&gt;        bounce-&amp;gt;ys += Gy;&lt;br /&gt;&lt;br /&gt;        // Slow down~~&lt;br /&gt;        //bounce-&amp;gt;xs = abs(bounce-&amp;gt;xs) &amp;gt; 13 ? bounce-&amp;gt;xs *(1/ pow(bounce-&amp;gt;xs-10,2)): bounce-&amp;gt;xs;&lt;br /&gt;        //bounce-&amp;gt;ys = abs(bounce-&amp;gt;ys) &amp;gt; 13 ? bounce-&amp;gt;ys *(1/ pow(bounce-&amp;gt;ys-10,2)): bounce-&amp;gt;ys;&lt;br /&gt;        printf ("x=%2.2f y=%2.2f dist=%4.2f Gs=%2.2f Gx=%2.2f Gy=%2.2f xs=%2.2f ys=%2.2f\n",x,y,dist,Gs,Gx,Gy,bounce-&amp;gt;xs,bounce-&amp;gt;ys);&lt;br /&gt;}&lt;br /&gt;inline void calculate_pos(struct bouncer *bounce) {&lt;br /&gt;        grav(bounce);&lt;br /&gt;        bounce-&amp;gt;x += bounce-&amp;gt;xs;&lt;br /&gt;        bounce-&amp;gt;y += bounce-&amp;gt;ys;&lt;br /&gt;&lt;br /&gt;        // bounce &lt;br /&gt;        bounce-&amp;gt;xs = bounce-&amp;gt;x &amp;gt;=0 ?  bounce-&amp;gt;x + bounce-&amp;gt;w &amp;lt;= WIDTH ? bounce-&amp;gt;xs : -bounce-&amp;gt;xs : -bounce-&amp;gt;xs; &lt;br /&gt;        bounce-&amp;gt;ys = bounce-&amp;gt;y &amp;gt;=0 ? bounce-&amp;gt;y + bounce-&amp;gt;h &amp;lt;= HEIGHT? bounce-&amp;gt;ys : - bounce-&amp;gt;ys : - bounce-&amp;gt;ys;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int move(void *data) {&lt;br /&gt;        struct bouncer *bounce =(struct bouncer *)data;&lt;br /&gt;        calculate_pos(bounce);&lt;br /&gt;        evas_object_move(bounce-&amp;gt;o,bounce-&amp;gt;x,bounce-&amp;gt;y);&lt;br /&gt;        change_color(bounce);&lt;br /&gt;        return 1;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int main() {&lt;br /&gt;        struct bouncer bounce;&lt;br /&gt;        ecore_evas_init();&lt;br /&gt;&lt;br /&gt;        ee = ecore_evas_software_x11_new(NULL, 0,  0, 0, WIDTH, HEIGHT);&lt;br /&gt;        ecore_evas_title_set(ee, "Tick's Evas Study");&lt;br /&gt;//      ecore_evas_borderless_set(ee, 1);  // borderless&lt;br /&gt;        ecore_evas_borderless_set(ee, 0);  // border&lt;br /&gt;        ecore_evas_show(ee);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        evas = ecore_evas_get(ee);&lt;br /&gt;        evas_font_path_append(evas, "fonts/");&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        bounce.o = evas_object_rectangle_add(evas);&lt;br /&gt;        bounce.w=bounce.h= (double)WIDTH/4;&lt;br /&gt;        bounce.x=(double)(WIDTH - bounce.w)/3;&lt;br /&gt;        bounce.y=(double)(HEIGHT-  bounce.h)/6;&lt;br /&gt;        bounce.xs=-1.1; bounce.ys=1.1;&lt;br /&gt;        bounce.color[0]=128;&lt;br /&gt;        bounce.color[1]=64;&lt;br /&gt;        bounce.color[2]=255;&lt;br /&gt;        change_color(&amp;amp;bounce);&lt;br /&gt;        evas_object_resize( bounce.o,  bounce.w,  bounce.h);&lt;br /&gt;        evas_object_move( bounce.o,bounce.x,bounce.y);&lt;br /&gt;        evas_object_show( bounce.o);&lt;br /&gt;&lt;br /&gt;        ecore_timer_add((double)0.01,move,&amp;amp;bounce);&lt;br /&gt;&lt;br /&gt;        ecore_main_loop_begin();&lt;br /&gt;&lt;br /&gt;        return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4272939767197667332-2724865418746548649?l=linuxocarina.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linuxocarina.blogspot.com/feeds/2724865418746548649/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4272939767197667332&amp;postID=2724865418746548649' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/2724865418746548649'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/2724865418746548649'/><link rel='alternate' type='text/html' href='http://linuxocarina.blogspot.com/2008/01/evas.html' title='學習 Evas'/><author><name>Tick</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://lh3.google.com/ticktock35/RxbHkGdUPGI/AAAAAAAAAE0/IFbLByIbaj8/s144/tux_ocarina.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4272939767197667332.post-8610940678194497109</id><published>2008-01-09T15:53:00.000+08:00</published><updated>2008-01-13T14:23:28.760+08:00</updated><title type='text'>codecovert</title><content type='html'>Covert C code to Google prettyprint format&lt;br /&gt;&lt;br /&gt;Filename: /usr/local/bin/codecovert&lt;br /&gt;&lt;pre class="code"&gt;&lt;br /&gt;#!/bin/bash&lt;br /&gt;for FF in $@;&lt;br /&gt;do&lt;br /&gt;      if [ -e $FF ];then&lt;br /&gt;              echo Filename: $FF&lt;br /&gt;              echo "&amp;lt;pre class=\"prettyprint\"&amp;gt;"&lt;br /&gt;              sed    -e 's/&amp;amp;/\&amp;amp;amp;/g'  -e 's/&amp;lt;/\&amp;amp;lt;/g' -e 's/&amp;gt;/\&amp;amp;gt;/g'   $FF&lt;br /&gt;              echo "&amp;lt;/pre&amp;gt;"&lt;br /&gt;      fi&lt;br /&gt;      echo&lt;br /&gt;done&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4272939767197667332-8610940678194497109?l=linuxocarina.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linuxocarina.blogspot.com/feeds/8610940678194497109/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4272939767197667332&amp;postID=8610940678194497109' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/8610940678194497109'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/8610940678194497109'/><link rel='alternate' type='text/html' href='http://linuxocarina.blogspot.com/2008/01/codecovert.html' title='codecovert'/><author><name>Tick</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://lh3.google.com/ticktock35/RxbHkGdUPGI/AAAAAAAAAE0/IFbLByIbaj8/s144/tux_ocarina.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4272939767197667332.post-3341452042356070517</id><published>2008-01-09T15:26:00.000+08:00</published><updated>2008-01-09T15:27:07.063+08:00</updated><title type='text'>Hello world</title><content type='html'>&lt;pre class="prettyprint"&gt;&lt;br /&gt;BITS 32&lt;br /&gt;&lt;br /&gt;;section .text&lt;br /&gt;;global _start&lt;br /&gt;;_start:&lt;br /&gt;jmp short two&lt;br /&gt;&lt;br /&gt;one:&lt;br /&gt;pop ecx  ; using the db&lt;br /&gt;; write&lt;br /&gt;xor eax,eax&lt;br /&gt;mov al, 4&lt;br /&gt;xor ebx,ebx&lt;br /&gt;mov bl, 1&lt;br /&gt;xor edx, edx&lt;br /&gt;mov dl, 13&lt;br /&gt;int 0x80&lt;br /&gt;&lt;br /&gt;;exit&lt;br /&gt;xor eax,eax&lt;br /&gt;mov al, 1&lt;br /&gt;xor ebx, ebx&lt;br /&gt;int 0x80&lt;br /&gt;&lt;br /&gt;two:&lt;br /&gt;call one&lt;br /&gt;db      "Hello_World!!"&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4272939767197667332-3341452042356070517?l=linuxocarina.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linuxocarina.blogspot.com/feeds/3341452042356070517/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4272939767197667332&amp;postID=3341452042356070517' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/3341452042356070517'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/3341452042356070517'/><link rel='alternate' type='text/html' href='http://linuxocarina.blogspot.com/2008/01/hello-world.html' title='Hello world'/><author><name>Tick</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://lh3.google.com/ticktock35/RxbHkGdUPGI/AAAAAAAAAE0/IFbLByIbaj8/s144/tux_ocarina.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4272939767197667332.post-120941588118859777</id><published>2008-01-09T14:33:00.001+08:00</published><updated>2009-04-24T03:13:12.273+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><title type='text'>Warning of "system" and "pipe"</title><content type='html'>I chatted with my friend about some security issues days before. I had mentioned about the function call "system" and "pipe" shall be avoid in many cases. It's very simple idea, but as I know many programmers even do not know it's very dangerous.&lt;br /&gt;Please NEVER NEVER NEVER use this function to important programs.&lt;br /&gt;NEVER allow user to touch the args, or PATH.&lt;br /&gt;Please~~~&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;#include &amp;lt;string.h&amp;gt;&lt;br /&gt;void fake_ls(int args,char **argv) {&lt;br /&gt;     char buf[50];&lt;br /&gt;     char *ptr=buf;&lt;br /&gt;     int i;&lt;br /&gt;     sprintf(buf,"ls");&lt;br /&gt;     for (i=1;i&amp;lt;args;i++) {&lt;br /&gt;             ptr = buf + strlen(buf);&lt;br /&gt;             sprintf(ptr," %s",argv[i]);&lt;br /&gt;     }&lt;br /&gt;     printf("The command you send is: '%s'\n",buf);&lt;br /&gt;     system(buf);&lt;br /&gt;}&lt;br /&gt;int main (int args,char **argv) {&lt;br /&gt;     printf("argv=%p\n",argv);&lt;br /&gt;     fake_ls(args,argv);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;you can use the following argument to execute&lt;br /&gt;extra command:  "-al\;cat /etc/passwd"&lt;br /&gt;It's very easy to see how terrible it is. :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4272939767197667332-120941588118859777?l=linuxocarina.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linuxocarina.blogspot.com/feeds/120941588118859777/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4272939767197667332&amp;postID=120941588118859777' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/120941588118859777'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/120941588118859777'/><link rel='alternate' type='text/html' href='http://linuxocarina.blogspot.com/2008/01/warning-of-system-and-pipe.html' title='Warning of &quot;system&quot; and &quot;pipe&quot;'/><author><name>Tick</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://lh3.google.com/ticktock35/RxbHkGdUPGI/AAAAAAAAAE0/IFbLByIbaj8/s144/tux_ocarina.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4272939767197667332.post-5115229884771899661</id><published>2007-12-30T21:26:00.000+08:00</published><updated>2007-12-30T21:27:43.056+08:00</updated><title type='text'>新年快樂</title><content type='html'>2007 年再 26.5 小時後就結束了…&lt;br /&gt;發生了好多事。&lt;br /&gt;&lt;br /&gt;希望 2008 年是會大好年。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4272939767197667332-5115229884771899661?l=linuxocarina.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linuxocarina.blogspot.com/feeds/5115229884771899661/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4272939767197667332&amp;postID=5115229884771899661' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/5115229884771899661'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/5115229884771899661'/><link rel='alternate' type='text/html' href='http://linuxocarina.blogspot.com/2007/12/blog-post.html' title='新年快樂'/><author><name>Tick</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://lh3.google.com/ticktock35/RxbHkGdUPGI/AAAAAAAAAE0/IFbLByIbaj8/s144/tux_ocarina.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4272939767197667332.post-6103848636458395392</id><published>2007-11-03T13:13:00.000+08:00</published><updated>2007-11-03T18:34:32.150+08:00</updated><title type='text'>Quilt － Patches 整合 Script</title><content type='html'>在社群中開發程式往往是用 patch 來做來開發工具。&lt;br /&gt;Developer 會在 mail list 上發 patch 出來，而 Maintainer 會把這些  patches 整合起&lt;br /&gt;個，做好 review 再一個一個 commit 上 mainstream 之中。而當 Patch 的量很大，而又&gt;有相依性之時…&lt;br /&gt;一個 Open Source Project 的 Maintainer 要如何管理這些 Patch 呢？&lt;br /&gt;&lt;br /&gt;&lt;a href="http://savannah.nongnu.org/projects/quilt"&gt;[Quilt]&lt;/a&gt;就是這樣的一個好用的工具。&lt;br /&gt;&lt;br /&gt;假設今天你在 maintain 一個案子，叫 ”mypro“  放在 /work/mypro 底下而你拿到了 5 個&lt;br /&gt;patches&lt;br /&gt;001_ooxx.patch&lt;br /&gt;002_lalal.patch&lt;br /&gt;003_lele.patch&lt;br /&gt;004_bad.patch&lt;br /&gt;005_conflict.patch&lt;br /&gt;&lt;br /&gt;你可以在 /work/mypro/ 下建立一個 patches 的目錄 （如果想自已指定請 export QUILT_PATCHES="...."）&lt;br /&gt;把 patches 放在 /work/mypro/patches 之中&lt;br /&gt;再建一個檔案 /work/mypro/patches/series 把這五個patches 依序寫入 series 中，一行一個 patch, 如果有base 目錄不同的問題 (quilt default 是打  patch -p1) 可在後面加上 -p&lt;n&gt;.&lt;br /&gt;假設  003_lele.patch 這個 patch 是在 /work/mypro 下用 svn diff &gt; 003_lele.patch 做出來的, 那在 series 之中就要寫成：&lt;br /&gt; 003_lele.patch -p0 &lt;br /&gt;&lt;br /&gt;所以 series 就會變成&lt;br /&gt;---------------------&lt;br /&gt;&lt;/n&gt;001_ooxx.patch&lt;br /&gt;002_lalal.patch&lt;br /&gt;003_lele.patch -p0&lt;br /&gt;004_bad.patch&lt;br /&gt;005_conflict.patch&lt;br /&gt;---------------------&lt;br /&gt;&lt;br /&gt;如此設好之後，就可以用 "quilt push"  打 patch  ，用  "quilt pop " 退回上層…&lt;br /&gt;如果要一次打完所有 patch 可以用 quilt push -a 一次打完…想退回 code base 時，就用 quilt pop -a 一路退到底。&lt;br /&gt;&lt;br /&gt;可以用 quilt top 看你上一個打的 patch 是那個 patch ，用  quilt next 看下一個是那個 patch&lt;br /&gt;如果發現 patch 有些地方需要修改，可以用quilt edit &lt;檔案&gt; 做修改…修改好了之後，可以用 quilt refresh 把修改寫入 "上一個打的 patch" ，也就是 quilt top 看得到的那個。&lt;br /&gt;&lt;br /&gt;如果要寫新的 patch 可以用 quilt new &lt;patch&gt; ，加上 quilt edit &lt;要修改的檔名&gt;，做完後用 quilt refresh 把 diff 寫入  patch。&lt;br /&gt;&lt;br /&gt;&lt;n&gt;因為你打了多個 patch 之後 svn diff 就會混合了多個 patch ，如果只想看上個打的 patch 的影響可用 quilt diff 來看。&lt;br /&gt;&lt;br /&gt;一般來說，如果你要手動修改你的 series 檔。可先  quilt pop -a 退回 code base 再做修改…如手動 mark 掉一些patch 或加上註解，註解是由 '#' 做為開頭。&lt;br /&gt;&lt;br /&gt;如果code base 改變了…可 quilt pop -a 退回開頭，再 svn update (cvs )，再把一些已被 commit 的 patch remove 掉（這個要檢查一下，一般來說有 commit 都會說明 commit 了那些 patch ），再一個一個 push 回來&lt;br /&gt;&lt;br /&gt;而如果你想 commit code 時，也可一面 push 一面 commit 。等 commit 完了，再把 series 裏已 push 且 commit 的 patch mark 掉，然後直接砍掉 /work/mypro/.pc 這個目錄…這是 quilt 管理 diff 的目錄…如此就可以直接可 upstream 同步。 (如果你是 maintainer )&lt;br /&gt;&lt;br /&gt;當你要 release patch 到 mail list 前，可以把你的 code base 的版號（最好是 HEAD），和你之前相依的 patch （如果有的話），一起 release 出來。如果 release 的 patch 多於兩個。最好也把  series release 出來。&lt;br /&gt;&lt;br /&gt;--&lt;br /&gt;Reference:&lt;br /&gt;&lt;a href="http://www.suse.de/%7Eagruen/quilt.pdf"&gt;How To Survive With Many Patches or Introduction to Quilt&lt;/a&gt;&lt;/n&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4272939767197667332-6103848636458395392?l=linuxocarina.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://savannah.nongnu.org/projects/quilt' title='Quilt － Patches 整合 Script'/><link rel='replies' type='application/atom+xml' href='http://linuxocarina.blogspot.com/feeds/6103848636458395392/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4272939767197667332&amp;postID=6103848636458395392' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/6103848636458395392'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/6103848636458395392'/><link rel='alternate' type='text/html' href='http://linuxocarina.blogspot.com/2007/11/quilt-patches-script.html' title='Quilt － Patches 整合 Script'/><author><name>Tick</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://lh3.google.com/ticktock35/RxbHkGdUPGI/AAAAAAAAAE0/IFbLByIbaj8/s144/tux_ocarina.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4272939767197667332.post-4851523616569403536</id><published>2007-10-28T22:12:00.000+08:00</published><updated>2007-10-28T22:23:13.262+08:00</updated><title type='text'>十年</title><content type='html'>人總是在失去後才覺得珍貴。&lt;br /&gt;&lt;br /&gt;這幾天正好是我們認識十週年，雖然分手好一段時間了，而我們又各自有了新的戀情。&lt;br /&gt;聽到這首歌，份外有感覺。&lt;br /&gt;&lt;br /&gt;對不起，我們錯過了…&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;十年 - 陳奕迅     曲︰陳小霞   詞︰林夕    編︰陳輝陽&lt;br /&gt;   如果那兩個字沒有顫抖&lt;br /&gt;   我不會發現我難受&lt;br /&gt;   怎麼說出口　也不過是分手&lt;br /&gt;   如果對於明天沒有要求&lt;br /&gt;   牽牽手就像旅遊　成千上萬個門口&lt;br /&gt;   總有一個人要先走&lt;br /&gt;&lt;br /&gt; 懷抱既然不能逗留　何不在離開的時候&lt;br /&gt;   一邊享受　一邊淚流&lt;br /&gt;&lt;br /&gt; 十年之前　我不認識你&lt;br /&gt;   你不屬於我　我們還是一樣&lt;br /&gt;   陪在一個陌生人左右&lt;br /&gt;   走過漸漸熟悉的街頭&lt;br /&gt;&lt;br /&gt; 十年之後　我們是朋友&lt;br /&gt;   還可以問候　只是那種溫柔&lt;br /&gt;   再也找不到擁抱的理由&lt;br /&gt;   情人最後難免淪為朋友&lt;br /&gt;&lt;br /&gt;   直到和你做了多年朋友&lt;br /&gt;   才明白我的眼淚　不是為你而流&lt;br /&gt;   也為別人而流&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4272939767197667332-4851523616569403536?l=linuxocarina.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linuxocarina.blogspot.com/feeds/4851523616569403536/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4272939767197667332&amp;postID=4851523616569403536' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/4851523616569403536'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/4851523616569403536'/><link rel='alternate' type='text/html' href='http://linuxocarina.blogspot.com/2007/10/blog-post.html' title='十年'/><author><name>Tick</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://lh3.google.com/ticktock35/RxbHkGdUPGI/AAAAAAAAAE0/IFbLByIbaj8/s144/tux_ocarina.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4272939767197667332.post-4130386129797589624</id><published>2007-10-22T23:46:00.001+08:00</published><updated>2009-04-24T03:12:31.020+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><title type='text'>Stack Dump Debug Tip</title><content type='html'>In developing embedded system, developer may encounter an ambiguous condition that the system so limited that cannot run gdb, and the network is also too unstable to run gdb-server.  And the rootfs is too small that core dump is not available.  In such miserable condition  there is  still a powerful debug skill: stack dump.&lt;br /&gt;&lt;br /&gt;Before using this skill, we have to know how a program runs. The stack's bottom is at higher address in memory, and it growth toward lower address.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_uSgEb50CjDE/Rx4YLWdUPLI/AAAAAAAAAFU/F3R5lNO0iI4/s1600-h/stack.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_uSgEb50CjDE/Rx4YLWdUPLI/AAAAAAAAAFU/F3R5lNO0iI4/s400/stack.png" alt="" id="BLOGGER_PHOTO_ID_5124560009280371890" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;And program accesses memory  from low to high. That is we can use printf("%x %x"); to print out the data in stack.&lt;br /&gt;&lt;br /&gt;Another important tip is CFLAGS += -finstrument-functions. This flag make us can insert code when entering and exiting a function. This way, we can construct our own stack dump without the help of gdb. If you turn the flag -finstrument-functions on, you should implements the following two functions:&lt;br /&gt;void __cyg_profile_func_enter(void *func,void *caller) __attribute__((__no_instrument_function__));&lt;br /&gt;void __cyg_profile_func_exit(void *func,void *caller) __attribute__((__no_instrument_function__));&lt;br /&gt;&lt;br /&gt;These functions are designed for profiling and analysing code  performance and coverage.  In this case use use it to create a function stack.&lt;br /&gt;&lt;br /&gt;We can use signal() to set the signal handler to dump the stack when a signal received.&lt;br /&gt;&lt;br /&gt;Here are the demo codes:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;----------------------------------------------------------------&lt;br /&gt;### File: Makefile&lt;br /&gt;CFLAGS=-finstrument-functions -g2&lt;br /&gt;CC=gcc&lt;br /&gt;&lt;br /&gt;all:&lt;br /&gt; gcc $(CFLAGS) -o stackdemo stackdemo.c stack_util.c&lt;br /&gt;----------------------------------------------------------------&lt;br /&gt;&lt;span style="color: rgb(68, 68, 68);"&gt;&lt;i&gt;/** @file stack_util.h&lt;br /&gt;*  @auther Tick&lt;br /&gt;*  @License GPL&lt;br /&gt;*/&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#ifndef __TICK_DEMO_STACK___&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#define __TICK_DEMO_STACK___&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;setSignalHandler&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;SignalHandler&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;strong&gt;int&lt;/strong&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;__attribute__&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;__no_instrument_function__&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;DumpStack&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;strong&gt;int&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;sig&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;__attribute__&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;__no_instrument_function__&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;__cyg_profile_func_enter&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;strong&gt;void&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;func&lt;/span&gt;,&lt;strong&gt;void&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;caller&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;__attribute__&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;__no_instrument_function__&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;__cyg_profile_func_exit&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;strong&gt;void&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;func&lt;/span&gt;,&lt;strong&gt;void&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;caller&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;__attribute__&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;__no_instrument_function__&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#endif&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;----------------------------------------------------------------&lt;br /&gt;&lt;span style="color: rgb(68, 68, 68);"&gt;&lt;i&gt;/** @file stack_util.c&lt;br /&gt;*  @auther Tick&lt;br /&gt;*  @License GPL&lt;br /&gt;*/&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#include &lt;span style="color: rgb(0, 128, 0);"&gt;"stack_util.h"&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#include &lt;span style="color: rgb(0, 128, 0);"&gt;&amp;lt;signal.h&amp;gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#include &lt;span style="color: rgb(0, 128, 0);"&gt;&amp;lt;unistd.h&amp;gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#include &lt;span style="color: rgb(0, 128, 0);"&gt;&amp;lt;errno.h&amp;gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#include &lt;span style="color: rgb(0, 128, 0);"&gt;&amp;lt;string.h&amp;gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#include &lt;span style="color: rgb(0, 128, 0);"&gt;&amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#include &lt;span style="color: rgb(0, 128, 0);"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#include &lt;span style="color: rgb(0, 128, 0);"&gt;&amp;lt;fcntl.h&amp;gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#include &lt;span style="color: rgb(0, 128, 0);"&gt;&amp;lt;sys/stat.h&amp;gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#include &lt;span style="color: rgb(0, 128, 0);"&gt;&amp;lt;sys/types.h&amp;gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#include &lt;span style="color: rgb(0, 128, 0);"&gt;&amp;lt;sys/ioctl.h&amp;gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#define _STACK_BUFFER_SIZE 4096&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;__stack_buffer_&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;_STACK_BUFFER_SIZE&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;]&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;__stack_pid_buffer&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;_STACK_BUFFER_SIZE&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;]&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;__stack_buffer_index__private__&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;volatile&lt;/strong&gt; &lt;strong&gt;int&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;__stack_spin_lock__&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;inline&lt;/span&gt; &lt;strong&gt;void&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;dumpstack&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;i&lt;/span&gt;,&lt;span style="color: rgb(32, 64, 160);"&gt;max&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;__stack_buffer_index__private__&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;printf&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;"Stack Trace:&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;"&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;for&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;i&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;i&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;__stack_buffer_index__private__&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;i&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;+&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;+&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;printf&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;"[%3d] pid:[%3d]   0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;"&lt;/span&gt;,&lt;span style="color: rgb(32, 64, 160);"&gt;i&lt;/span&gt;,&lt;span style="color: rgb(32, 64, 160);"&gt;__stack_pid_buffer&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;i&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;]&lt;/span&gt;,&lt;span style="color: rgb(32, 64, 160);"&gt;__stack_buffer_&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;i&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;]&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;setSignalHandler&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;ans&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;struct&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;sigaction&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;act&lt;/span&gt;,&lt;span style="color: rgb(32, 64, 160);"&gt;oldact&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;act&lt;/span&gt;.&lt;span style="color: rgb(32, 64, 160);"&gt;sa_handler&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;DumpStack&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;act&lt;/span&gt;.&lt;span style="color: rgb(32, 64, 160);"&gt;sa_flags&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;SA_ONESHOT&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;SA_NOMASK&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;//&lt;span style="color: rgb(32, 64, 160);"&gt;act&lt;/span&gt;.&lt;span style="color: rgb(32, 64, 160);"&gt;sa_flags&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;SA_RESETHAND&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;ans&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;sigaction&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;SIGUSR1&lt;/span&gt;,&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;act&lt;/span&gt;,&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;oldact&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;if&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;ans&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;printf&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;"Set SIGUSR1 Failed!!!!!&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;"&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;printf&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;"ErrorNumber: %d&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;"&lt;/span&gt;,&lt;span style="color: rgb(32, 64, 160);"&gt;errno&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;strong&gt;else&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;printf&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;"Set SIGUSR1 OK!!!!!&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;"&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;signal&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;SIGHUP&lt;/span&gt;,&lt;span style="color: rgb(32, 64, 160);"&gt;SignalHandler&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;signal&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;SIGINT&lt;/span&gt;,&lt;span style="color: rgb(32, 64, 160);"&gt;SignalHandler&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;signal&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;SIGQUIT&lt;/span&gt;,&lt;span style="color: rgb(32, 64, 160);"&gt;SignalHandler&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;signal&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;SIGILL&lt;/span&gt;,&lt;span style="color: rgb(32, 64, 160);"&gt;SignalHandler&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;signal&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;SIGKILL&lt;/span&gt;,&lt;span style="color: rgb(32, 64, 160);"&gt;SignalHandler&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;signal&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;SIGSEGV&lt;/span&gt;,&lt;span style="color: rgb(32, 64, 160);"&gt;SignalHandler&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;signal&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;SIGTERM&lt;/span&gt;,&lt;span style="color: rgb(32, 64, 160);"&gt;SignalHandler&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;signal&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;SIGPWR&lt;/span&gt;,&lt;span style="color: rgb(32, 64, 160);"&gt;SignalHandler&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;DumpStack&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;strong&gt;int&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;sig&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;struct&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;sigaction&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;act&lt;/span&gt;,&lt;span style="color: rgb(32, 64, 160);"&gt;oldact&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;act&lt;/span&gt;.&lt;span style="color: rgb(32, 64, 160);"&gt;sa_handler&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;DumpStack&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;act&lt;/span&gt;.&lt;span style="color: rgb(32, 64, 160);"&gt;sa_flags&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;SA_ONESHOT&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;SA_NOMASK&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;sigaction&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;SIGUSR1&lt;/span&gt;,&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;act&lt;/span&gt;,&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;oldact&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;printf&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;"Stack:&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;"&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;printf&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;"Signal Type: %d&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;"&lt;/span&gt;,&lt;span style="color: rgb(32, 64, 160);"&gt;sig&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;printf&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;"ErrorNumber: %d&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;"&lt;/span&gt;,&lt;span style="color: rgb(32, 64, 160);"&gt;errno&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;printf&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;"PID: %d&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;"&lt;/span&gt;,&lt;span style="color: rgb(32, 64, 160);"&gt;getpid&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;dumpstack&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;SignalHandler&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;strong&gt;int&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;sig&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;if&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;sig&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;SIGTERM&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;sig&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;SIGKILL&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; //&lt;span style="color: rgb(32, 64, 160);"&gt;close&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;device&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;here&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;if&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;sig&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;SIGTERM&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;printf&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;"Signal Type: %d&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;"&lt;/span&gt;,&lt;span style="color: rgb(32, 64, 160);"&gt;sig&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;printf&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;"PID: %d goes die&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;"&lt;/span&gt;,&lt;span style="color: rgb(32, 64, 160);"&gt;getpid&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;fflush&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;stdout&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;fflush&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;stderr&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;sleep&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;exit&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;printf&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;"Stack:&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;"&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;printf&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;"Signal Type: %d&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;"&lt;/span&gt;,&lt;span style="color: rgb(32, 64, 160);"&gt;sig&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;printf&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;"ErrorNumber: %d&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;"&lt;/span&gt;,&lt;span style="color: rgb(32, 64, 160);"&gt;errno&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;printf&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;"PID: %d&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;"&lt;/span&gt;,&lt;span style="color: rgb(32, 64, 160);"&gt;getpid&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;printf&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;"&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;"&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;dumpstack&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;fflush&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;stdout&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;fflush&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;stderr&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;if&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;sig&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;SIGSEGV&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;sig&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;SIGILL&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt; //&lt;span style="color: rgb(32, 64, 160);"&gt;exit&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;EXIT_FAILURE&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt; // &lt;span style="color: rgb(32, 64, 160);"&gt;If&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;you&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;want&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;to&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;kill&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;whole&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;tick&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;when&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;page&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;fault&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;happens&lt;/span&gt;&lt;br /&gt; // &lt;span style="color: rgb(32, 64, 160);"&gt;please&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;USE&lt;/span&gt; &lt;span style="color: rgb(0, 128, 0);"&gt;"exit(EXIT_FAILURE);"&lt;/span&gt;&lt;br /&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;_exit&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;129&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;__cyg_profile_func_enter&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;strong&gt;void&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;func&lt;/span&gt;,&lt;strong&gt;void&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;caller&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;while&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;__stack_spin_lock__&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;__stack_spin_lock__&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;if&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;__stack_buffer_index__private__&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;_STACK_BUFFER_SIZE&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;__stack_buffer_&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;__stack_buffer_index__private__&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;]&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;func&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;__stack_pid_buffer&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;__stack_buffer_index__private__&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;]&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;getpid&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;__stack_buffer_index__private__&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;+&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;+&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;__stack_spin_lock__&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;__cyg_profile_func_exit&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;strong&gt;void&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;func&lt;/span&gt;,&lt;strong&gt;void&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;caller&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;while&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;__stack_spin_lock__&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;__stack_spin_lock__&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;i&lt;/span&gt;,&lt;span style="color: rgb(32, 64, 160);"&gt;pid&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;getpid&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;if&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;__stack_buffer_index__private__&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt; &lt;strong&gt;for&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;i&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;__stack_buffer_index__private__&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;i&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;i&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;     &lt;strong&gt;if&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;__stack_pid_buffer&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;i&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;]&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;pid&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;         &lt;strong&gt;break&lt;/strong&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;     &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt; &lt;strong&gt;for&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;i&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;__stack_buffer_index__private__&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;i&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;+&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;+&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;     &lt;span style="color: rgb(32, 64, 160);"&gt;__stack_buffer_&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;i&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;]&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;__stack_buffer_&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;i&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;+&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;]&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;     &lt;span style="color: rgb(32, 64, 160);"&gt;__stack_pid_buffer&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;i&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;]&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;__stack_pid_buffer&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;i&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;+&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;]&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;__stack_buffer_index__private__&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;__stack_spin_lock__&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;----------------------------------------------------------------&lt;br /&gt;&lt;span style="color: rgb(68, 68, 68);"&gt;&lt;i&gt;/**&lt;br /&gt;* @file stackdemo.c&lt;br /&gt;* @author Tick&lt;br /&gt;* @license GPL&lt;br /&gt;*/&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#include &lt;span style="color: rgb(0, 128, 0);"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#include &lt;span style="color: rgb(0, 128, 0);"&gt;&amp;lt;string.h&amp;gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#include &lt;span style="color: rgb(0, 128, 0);"&gt;&amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#include &lt;span style="color: rgb(0, 128, 0);"&gt;&amp;lt;errno.h&amp;gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#include &lt;span style="color: rgb(0, 128, 0);"&gt;&amp;lt;ctype.h&amp;gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#include &lt;span style="color: rgb(0, 128, 0);"&gt;"stack_util.h"&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;struct&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;LALA&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;data&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;lala&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;run_me_will_crash_null_point&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;struct&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;LALA&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;lala&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;NULL&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;lala&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;lala&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;+&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;+&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;run_me_will_crash_divid_zero&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;a&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;b&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;200&lt;/span&gt;/ &lt;span style="color: rgb(68, 68, 255);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;a&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;run_me_will_crash_buffer_overflow&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;char&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;buf&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;4&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;]&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;char&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;src&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;src&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;strong&gt;char&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;malloc&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;64&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;memset&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;src&lt;/span&gt;,&lt;span style="color: rgb(0, 128, 0);"&gt;'A'&lt;/span&gt;,&lt;span style="color: rgb(255, 0, 0);"&gt;64&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;memcpy&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;buf&lt;/span&gt;,&lt;span style="color: rgb(32, 64, 160);"&gt;src&lt;/span&gt;,&lt;span style="color: rgb(255, 0, 0);"&gt;64&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;prompt&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;printf&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;"What way do you want to die?&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;"&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;printf&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;"1. segment fault&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;"&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;printf&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;"2. divid zero&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;"&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;printf&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;"3. buffer overflow&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;"&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;printf&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;"&amp;gt; "&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;do_die&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;char&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;buf&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;128&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;]&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;while&lt;/strong&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;prompt&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;fgets&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;buf&lt;/span&gt;,&lt;strong&gt;sizeof&lt;/strong&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;buf&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;,&lt;span style="color: rgb(32, 64, 160);"&gt;stdin&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt; &lt;strong&gt;if&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;isdigit&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;buf&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;]&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;     &lt;strong&gt;switch&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;buf&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;]&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;         &lt;strong&gt;case&lt;/strong&gt; &lt;span style="color: rgb(0, 128, 0);"&gt;'1'&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;br /&gt;             &lt;span style="color: rgb(32, 64, 160);"&gt;run_me_will_crash_null_point&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;             &lt;strong&gt;break&lt;/strong&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;         &lt;strong&gt;case&lt;/strong&gt; &lt;span style="color: rgb(0, 128, 0);"&gt;'2'&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;br /&gt;             &lt;span style="color: rgb(32, 64, 160);"&gt;run_me_will_crash_divid_zero&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;             &lt;strong&gt;break&lt;/strong&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;         &lt;strong&gt;case&lt;/strong&gt; &lt;span style="color: rgb(0, 128, 0);"&gt;'3'&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;br /&gt;             &lt;span style="color: rgb(32, 64, 160);"&gt;run_me_will_crash_buffer_overflow&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;             &lt;strong&gt;break&lt;/strong&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;         &lt;strong&gt;default&lt;/strong&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;br /&gt;             &lt;strong&gt;continue&lt;/strong&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;     &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;showmaps&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;char&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;buf&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;128&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;]&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;sprintf&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;buf&lt;/span&gt;,&lt;span style="color: rgb(0, 128, 0);"&gt;"cat /proc/%d/maps"&lt;/span&gt;,&lt;span style="color: rgb(32, 64, 160);"&gt;getpid&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;system&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;buf&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;function_D&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;do_die&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;function_C&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;function_D&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;function_B&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;function_C&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;function_A&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;function_B&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;main&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;strong&gt;void&lt;/strong&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;setSignalHandler&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;showmaps&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;function_A&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;----------------------------------------------------------------&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The following is the execution result:&lt;br /&gt;&lt;br /&gt;----------------------------------------------------------------&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;tick@tock:~/work/demo&gt;./stackdemo&lt;br /&gt;Set SIGUSR1 OK!!!!!&lt;br /&gt;08048000-0804a000 r-xp 00000000 08:03 127325     /home/tick/work/demo/stackdemo&lt;br /&gt;0804a000-0804b000 rw-p 00001000 08:03 127325     /home/tick/work/demo/stackdemo&lt;br /&gt;0804b000-08053000 rw-p 0804b000 00:00 0          [heap]&lt;br /&gt;b7dc7000-b7dc8000 rw-p b7dc7000 00:00 0&lt;br /&gt;b7dc8000-b7f0c000 r-xp 00000000 08:03 121895     /lib/tls/i686/cmov/libc-2.6.1.so&lt;br /&gt;b7f0c000-b7f0d000 r--p 00143000 08:03 121895     /lib/tls/i686/cmov/libc-2.6.1.so&lt;br /&gt;b7f0d000-b7f0f000 rw-p 00144000 08:03 121895     /lib/tls/i686/cmov/libc-2.6.1.so&lt;br /&gt;b7f0f000-b7f12000 rw-p b7f0f000 00:00 0&lt;br /&gt;b7f25000-b7f28000 rw-p b7f25000 00:00 0&lt;br /&gt;b7f28000-b7f42000 r-xp 00000000 08:03 121912     /lib/ld-2.6.1.so&lt;br /&gt;b7f42000-b7f44000 rw-p 00019000 08:03 121912     /lib/ld-2.6.1.so&lt;br /&gt;bfc0f000-bfc24000 rw-p bfc0f000 00:00 0          [stack]&lt;br /&gt;ffffe000-fffff000 r-xp 00000000 00:00 0          [vdso]&lt;br /&gt;What way do you want to die?&lt;br /&gt;1. segment fault&lt;br /&gt;2. divid zero&lt;br /&gt;3. buffer overflow&lt;br /&gt;&gt; 1&lt;br /&gt;Stack:&lt;br /&gt;0x00000001 0xbfc22948 0xffffe420 0x0000000b 0x00000033 0xc02f0000 0x0000007b 0x0000007b&lt;br /&gt;0x00000000 0xb7f42ce0 0xbfc22948 0xbfc22920 0xb7f0dff4 0x00000000 0xb7f0dff4 0x00000000&lt;br /&gt;0x0000000e 0x00000004 0x08048837 0x00000073 0x00210286 0xbfc22920 0x0000007b 0x00000000&lt;br /&gt;0x00000000 0x00000004 0xb7f38068 0x00000011 0x00000008 0xb7f42ff4 0xb7f28468 0xb7f28000&lt;br /&gt;0xbfc226e8 0xbfc22704 0x00000000 0xbfc22800 0xbfc226dc 0xbfc22768 0xb7df2b5a 0xbfc22818&lt;br /&gt;0xbfc226e8 0x00000080 0x00000000 0x00000000 0xb6d55b68 0x00000000 0x00000000 0x00000000&lt;br /&gt;0x00000000 0xb7f27db4 0xb7f303e2 0xb7f12000 0x00013425 0xb7f42ff4 0xbfc22aa4 0xb7f2b22b&lt;br /&gt;0xb7f432a0 0xb7f43820 0x00000000 0x00000000 0x00000000 0x00000000 0xbfc2286c 0x00000000&lt;br /&gt;0xbfc227d4 0xb7df2b13 0xbfc227e0 0xb7f0ef64 0x00000080 0x08048ec0 0x10000000 0xb7f27b38&lt;br /&gt;0x00000004 0x080484f4 0x0d696910 0xb7f27b38 0xbfc2279c 0xb7f30c0b 0xb7dd9df6 0x080484ea&lt;br /&gt;0xb7f43941 0x080484ea 0x0d696913 0xb7f27b48 0xbfc227bc 0xb7f30c0b 0xb7dd9e74 0x080484e0&lt;br /&gt;0xb7f43941 0xb7f43934 0xb7dd0dac 0xbfc2000d 0xb7f35c99 0x080483e8 0xb7f43940 0xb7f42ff4&lt;br /&gt;0xbfc22800 0xb7f27b0c 0xbfc22834 0xb7f30fc0 0xb7e2e0d4 0xb7e983b8 0xb7f0e440 0xb7f0dff4&lt;br /&gt;0xb7f3efbc 0xbfc22800 0xbfc228e4 0x22494966 0x00000003 0xb7dcbc4c 0xb7dcada0 0xffffffff&lt;br /&gt;0x22494966 0x0000000b 0xbfc22828 0x00000000 0x00000000 0x00000001 0x00000516 0xb7f27b48&lt;br /&gt;0xb7f27858 0x08048467 0xb7dd485c 0x08048308 0x00000001 0xb7f42ff4 0xb7f43820 0xbfc228d8&lt;br /&gt;0xbfc228f4 0xb7f31166 0x08048308 0xbfc228d8 0xb7f437c4 0x00000001 0xb7f27b48 0x00000001&lt;br /&gt;0x00000000 0x00000001 0xffffffff 0xbfc22884 0xb7e2c179 0xb7f0e4e0 0xb7f25000 0x00000002&lt;br /&gt;0xbfc228a4 0xbfc228e4 0xbfc22920 0xb7f43668 0x08048467 0x22494966 0x00000000 0x00000000&lt;br /&gt;0x00000400 0xb7f0dff4 0xb7f0e440 0x00000000 0xbfc228b4 0xb7e2d50b 0xb7f0e440 0xb7f0e440&lt;br /&gt;0xbfc228cc 0xb7e2e8d4 0xb7f0e440 0xb7e2b86f 0xb7f0dff4 0xb7f24001 0x00000001 0xb7e2206d&lt;br /&gt;0xbfc22975 0xb7dd0dac 0xb7f27858 0x00000001 0xffffffff 0xb7f42ff4 0x08048308 0xb7f43668&lt;br /&gt;0xbfc22930 0xb7f34e73 0xb7f43820 0xb7f27b48 0x00000001 0x00000001 0x00000000 0x0077b858&lt;br /&gt;0x80cd0000 0xbfc22948 0x0804882d 0x08048814 0x08048ac2 0xb7f42ce0 0x00000000 0xbfc229f8&lt;br /&gt;0xb7f3a660 0xb7f0f0c4 0xbfc22974 0xb7dec4d0 0x00000000 0xbfc229f8 0x08048ac2 0xbfc22974&lt;br /&gt;0x00000080 0xb7f0e440 0xb7f27858 0x00000000 0x00000031 0xb7f42ff4 0x08048298 0xb7f43668&lt;br /&gt;0xbf000a31 0xb7f34e73 0xb7f43820 0xb7f27b38 0x00000001 0x00000001 0x00000000 0x0804847c&lt;br /&gt;0x00000006 0x00000000 0x0804acc4 0xb7dd106c 0xb7dff940 0xbfc229b4 0x08049039 0xbfc22a78&lt;br /&gt;0x0000188d 0x00000000 0xb7f0dff4 0x00000001 0x0000188c 0xbfc22a78 0x08048b3f 0x08048ad8&lt;br /&gt;0x08048c4c 0x0000188c 0x0d696910 0x00000000 0x080f0d30 0x08048e34 0x08048ff7 0xbfc22a98&lt;br /&gt;0xff0a0000 0xbfc22a18 0x08048b70 0x08048b52 0x08048ba3 0xb7f42ff4 0x08048ff7 0xb7f43668&lt;br /&gt;0xb7f0dff4 0xbfc22a38 0x08048ba3 0x08048b85 0x08048bd6 0x00000001 0x08048ff7 0x0804843b&lt;br /&gt;0xb7f0dff4 0xbfc22a58 0x08048bd6 0x08048bb8 0x08048c09 0xb7f42ce0 0x08048ff7 0xbfc22a78&lt;br /&gt;0xb7f0dff4 0xbfc22a78 0x08048c09 0x08048beb 0x08048c51 0xb7e5bc08 0xc0000000 0xb7ed2939&lt;br /&gt;0xff0a0000 0xbfc22a98 0x08048c51 0x08048c1e 0xb7dde050 0xbfc22aa8 0x080490f9 0xb7f35800&lt;br /&gt;0xbfc22ab0 0xbfc22b08 0xb7dde050 0xb7f42ce0 0x080490e0 0xbfc22b08 0xb7dde050 0x00000001&lt;br /&gt;0xbfc22b34 0xbfc22b3c 0xb7f43820 0x00000000 0x00000001 0x00000001 0x00000000 0xb7f0dff4&lt;br /&gt;0xb7f42ce0 0x00000000 0xbfc22b08 0x90556081 0xafc02a91 0x00000000 0x00000000 0x00000000&lt;br /&gt;0xb7f3a660 0xb7dddf7d 0xb7f42ff4 0x00000001 0x08048790 0x00000000 0x080487b1 0x08048c1e&lt;br /&gt;0x00000001 0xbfc22b34 0x080490e0 0x080490d0 0xb7f35800 0xbfc22b2c 0xb7f3fead 0x00000001&lt;br /&gt;0xbfc23864 0x00000000 0xbfc23870 0xbfc23883 0xbfc238ba 0xbfc238ca 0xbfc238de 0xbfc238e9&lt;br /&gt;0xbfc23938 0xbfc23953 0xbfc2398c 0xbfc2399e 0xbfc239a8 0xbfc23c23 0xbfc23c59 0xbfc23c89&lt;br /&gt;Signal Type: 11&lt;br /&gt;ErrorNumber: 22&lt;br /&gt;PID: 6284&lt;br /&gt;&lt;br /&gt;Stack Trace:&lt;br /&gt;[  0] pid:[6284]   0x08048c1e&lt;br /&gt;[  1] pid:[6284]   0x08048beb&lt;br /&gt;[  2] pid:[6284]   0x08048bb8&lt;br /&gt;[  3] pid:[6284]   0x08048b85&lt;br /&gt;[  4] pid:[6284]   0x08048b52&lt;br /&gt;[  5] pid:[6284]   0x08048a1e&lt;br /&gt;[  6] pid:[6284]   0x08048814&lt;br /&gt;[  7] pid:[6284]   0x08048c70&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;----------------------------------------------------------------&lt;br /&gt;You can use &lt;span style="font-weight: bold;"&gt;"objdump -S -x stackdemo ｜ less"&lt;/span&gt; to find out the address's corresponding function.&lt;br /&gt;&lt;br /&gt;. If the function crashed in library, you can using the address - the  address of library (shown in /proc/xxx/maps) and find out the offset. This offset is the crash point in library. (using objdump)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4272939767197667332-4130386129797589624?l=linuxocarina.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linuxocarina.blogspot.com/feeds/4130386129797589624/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4272939767197667332&amp;postID=4130386129797589624' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/4130386129797589624'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/4130386129797589624'/><link rel='alternate' type='text/html' href='http://linuxocarina.blogspot.com/2007/10/stack-dump-debug-tip.html' title='Stack Dump Debug Tip'/><author><name>Tick</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://lh3.google.com/ticktock35/RxbHkGdUPGI/AAAAAAAAAE0/IFbLByIbaj8/s144/tux_ocarina.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_uSgEb50CjDE/Rx4YLWdUPLI/AAAAAAAAAFU/F3R5lNO0iI4/s72-c/stack.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4272939767197667332.post-1096588029977406086</id><published>2007-09-23T15:18:00.000+08:00</published><updated>2007-11-04T00:46:44.602+08:00</updated><title type='text'>簡易版 Minicom</title><content type='html'>昨天坐車下南部，在車上心血來潮想在 &lt;a href="http://wiki.openmoko.org/wiki/Neo1973"&gt;NEO1973&lt;/a&gt;上玩Minicom 結果發現手上沒有 minicom的 package。人在車上又沒有網路…想玩東西又沒得玩…就自已寫嘍…&lt;br /&gt;然後就在車上開始 coding ...&lt;br /&gt;發現還蠻有趣的，大概到台中的時候完成，之後就在車上一直玩…&lt;br /&gt;玩到 Notebook 沒電 @_@ 4 cell 的電池果然是不夠力啊&lt;br /&gt;&lt;br /&gt;執行檔是 tickminicom&lt;br /&gt;使用方法是 ./tickminicom [device] [speed]&lt;br /&gt;default 的 device 是 /dev/ttySAC0  ，speed 是 115200&lt;br /&gt;跳脫字元是 '%'&lt;br /&gt;&lt;br /&gt;因為是自已寫的，所以可以很直接的測試幾個想知道的性質…&lt;br /&gt;&lt;br /&gt;Filename: Makefile&lt;br /&gt;&lt;hr align="center" width="90%"&gt;&lt;br /&gt;&lt;table width="95%"&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;CC=arm-angstrom-linux-gnueabi-gcc&lt;br /&gt;all:&lt;br /&gt;  $(CC) -o tickminicom tick_minicom.c util.c&lt;br /&gt;  gcc -o tickminicom_x86 tick_minicom.c util.c&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Filename: debug.h&lt;br /&gt;&lt;hr align="center" width="90%"&gt;&lt;br /&gt;&lt;table&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#ifndef __MPENV_DEBUG_H__&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#define __MPENV_DEBUG_H__&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#include &lt;span style="color: rgb(0, 128, 0);"&gt;&amp;lt;assert.h&amp;gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#define CONFIG_DEBUG&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#ifdef CONFIG_DEBUG&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt; #include &lt;span style="color: rgb(0, 128, 0);"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt; #define debug(f, a...)                                             \&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;do&lt;/strong&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;                                                             \&lt;br /&gt;  &lt;span style="color: rgb(32, 64, 160);"&gt;printf&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;"DEBUG: (%s, %d): %s: "&lt;/span&gt;,&lt;span style="color: rgb(32, 64, 160);"&gt;__FILE__&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;__LINE__&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;__FUNCTION__&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;      \&lt;br /&gt;  &lt;span style="color: rgb(32, 64, 160);"&gt;printf&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;f&lt;/span&gt;, ## &lt;span style="color: rgb(32, 64, 160);"&gt;a&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;                               \&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt; &lt;strong&gt;while&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt; #else&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;    #define debug(f, a...)&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#endif&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#define error(f, a...)                                             \&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;do&lt;/strong&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;                                                             \&lt;br /&gt;  &lt;span style="color: rgb(32, 64, 160);"&gt;printf&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;"ERROR: (%s, %d): %s: "&lt;/span&gt;,&lt;span style="color: rgb(32, 64, 160);"&gt;__FILE__&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;__LINE__&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;__FUNCTION__&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;      \&lt;br /&gt;  &lt;span style="color: rgb(32, 64, 160);"&gt;printf&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;f&lt;/span&gt;, ## &lt;span style="color: rgb(32, 64, 160);"&gt;a&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;                               \&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt; &lt;strong&gt;while&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#endif&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Filename: util.h&lt;br /&gt;&lt;hr align="center" width="90%"&gt;&lt;br /&gt;&lt;table&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#ifndef __TICK_MINICOM_UTIL_H__&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#define __TICK_MINICOM_UTIL_H__&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#include &lt;span style="color: rgb(0, 128, 0);"&gt;&amp;lt;termios.h&amp;gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#include &lt;span style="color: rgb(0, 128, 0);"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#include &lt;span style="color: rgb(0, 128, 0);"&gt;&amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#include &lt;span style="color: rgb(0, 128, 0);"&gt;&amp;lt;unistd.h&amp;gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#include &lt;span style="color: rgb(0, 128, 0);"&gt;&amp;lt;fcntl.h&amp;gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#include &lt;span style="color: rgb(0, 128, 0);"&gt;&amp;lt;errno.h&amp;gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;/// &lt;span style="color: rgb(32, 64, 160);"&gt;Be&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;aware&lt;/span&gt; &lt;span style="color: rgb(0, 128, 0);"&gt;'x'&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;cannot&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;be&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;a&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;expression&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;or&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;this&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;function&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;cause&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;unpredicable&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;result&lt;/span&gt;.&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;struct&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;bdrt&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;bps&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;u_int32_t&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;b&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;static&lt;/strong&gt; &lt;strong&gt;struct&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;bdrt&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;bdrts&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;]&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;B0&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;,&lt;br /&gt;  &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;9600&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;B9600&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;,&lt;br /&gt;  &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;19200&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;B19200&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;,&lt;br /&gt;  &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;38400&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;B38400&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;,&lt;br /&gt;  &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;57600&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;B57600&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;,&lt;br /&gt;  &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;115200&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;B115200&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;,&lt;br /&gt;  &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;230400&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;B230400&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;,&lt;br /&gt;  &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;460800&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;B460800&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;,&lt;br /&gt;  &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;921600&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;B921600&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;getche&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;strong&gt;int&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;fd&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;open_device&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;strong&gt;char&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;device&lt;/span&gt;,&lt;strong&gt;int&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;speed&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;set_baud&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;strong&gt;int&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;fd&lt;/span&gt;,&lt;strong&gt;int&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;rate&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#endif&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Filename: util.c&lt;br /&gt;&lt;hr align="center" width="90%"&gt;&lt;br /&gt;&lt;table&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#include &lt;span style="color: rgb(0, 128, 0);"&gt;"util.h"&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#include &lt;span style="color: rgb(0, 128, 0);"&gt;"debug.h"&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#include &lt;span style="color: rgb(0, 128, 0);"&gt;&amp;lt;string.h&amp;gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;getche&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;strong&gt;int&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;fd&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;  &lt;strong&gt;int&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;i&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;strong&gt;char&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;ch&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;strong&gt;struct&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;termios&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;old&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;new&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(32, 64, 160);"&gt;tcgetattr&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;fd&lt;/span&gt;, &lt;span style="color: rgb(68, 68, 255);"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;old&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(32, 64, 160);"&gt;memcpy&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;new&lt;/span&gt;,&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;old&lt;/span&gt;, &lt;strong&gt;sizeof&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;strong&gt;struct&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;termios&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(32, 64, 160);"&gt;new&lt;/span&gt;.&lt;span style="color: rgb(32, 64, 160);"&gt;c_lflag&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; ~&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;ICANON&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;ECHO&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(32, 64, 160);"&gt;tcsetattr&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;fd&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;TCSANOW&lt;/span&gt;,&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;new&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(32, 64, 160);"&gt;i&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;read&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;fd&lt;/span&gt;,&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;ch&lt;/span&gt;, &lt;span style="color: rgb(255, 0, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(32, 64, 160);"&gt;tcsetattr&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;fd&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;TCSANOW&lt;/span&gt;, &lt;span style="color: rgb(68, 68, 255);"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;old&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;strong&gt;if&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;i&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;          &lt;strong&gt;return&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;ch&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;  &lt;strong&gt;else&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: rgb(32, 64, 160);"&gt;debug&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;"fd %d ERROR&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;"&lt;/span&gt;,&lt;span style="color: rgb(32, 64, 160);"&gt;fd&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;      &lt;strong&gt;return&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;set_baud&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;strong&gt;int&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;fd&lt;/span&gt;,&lt;strong&gt;int&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;rate&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;i&lt;/span&gt;,&lt;span style="color: rgb(32, 64, 160);"&gt;rt&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;u_int32_t&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;bd&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;struct&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;termios&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;ti&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;for&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;i&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;i&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;ARRAY_SIZE&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;bdrts&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;i&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;+&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;+&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;  &lt;strong&gt;if&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;bdrts&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;i&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;]&lt;/span&gt;.&lt;span style="color: rgb(32, 64, 160);"&gt;bps&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;rate&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: rgb(32, 64, 160);"&gt;bd&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;bdrts&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;i&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;]&lt;/span&gt;.&lt;span style="color: rgb(32, 64, 160);"&gt;b&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;      &lt;strong&gt;break&lt;/strong&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;if&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;bd&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(32, 64, 160);"&gt;error&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;"Cannot set Baud Rate!!&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;"&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;strong&gt;return&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;rt&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;tcgetattr&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;fd&lt;/span&gt;, &lt;span style="color: rgb(68, 68, 255);"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;ti&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;if&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;rt&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(32, 64, 160);"&gt;error&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;"Cannot get attr i=%d&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;"&lt;/span&gt;,&lt;span style="color: rgb(32, 64, 160);"&gt;rt&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;strong&gt;return&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;rt&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;rt&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;cfsetispeed&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;ti&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;B0&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;if&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;rt&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(32, 64, 160);"&gt;error&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;"Cannot set input baud to B0!!&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;"&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;strong&gt;return&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;rt&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;debug&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;"Open uart with speed %d&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;"&lt;/span&gt;,&lt;span style="color: rgb(32, 64, 160);"&gt;bdrts&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;i&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;]&lt;/span&gt;.&lt;span style="color: rgb(32, 64, 160);"&gt;bps&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;rt&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;cfsetospeed&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;ti&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;bd&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;if&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;rt&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(32, 64, 160);"&gt;error&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;"Cannot set baud rate %d&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;"&lt;/span&gt;,&lt;span style="color: rgb(32, 64, 160);"&gt;bdrts&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;i&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;]&lt;/span&gt;.&lt;span style="color: rgb(32, 64, 160);"&gt;bps&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;strong&gt;return&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;rt&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;ti&lt;/span&gt;.&lt;span style="color: rgb(32, 64, 160);"&gt;c_cflag&lt;/span&gt; |&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;CRTSCTS&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;  // &lt;span style="color: rgb(32, 64, 160);"&gt;hardware&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;control&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;return&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;tcsetattr&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;fd&lt;/span&gt;, &lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;, &lt;span style="color: rgb(68, 68, 255);"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;ti&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 68);"&gt;&lt;i&gt;/**&lt;br /&gt;* Open Uart for testing&lt;br /&gt;* return value is the fd&lt;br /&gt;*/&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt;  &lt;span style="color: rgb(32, 64, 160);"&gt;open_device&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;strong&gt;char&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;device&lt;/span&gt;,&lt;strong&gt;int&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;speed&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;fd&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;if&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;device&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;NULL&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(32, 64, 160);"&gt;error&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;"device is invalid (NULL pointer)&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;"&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;strong&gt;return&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;debug&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;"Try to open device %s!&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;"&lt;/span&gt;,&lt;span style="color: rgb(32, 64, 160);"&gt;device&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;fd&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;open&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;device&lt;/span&gt;,&lt;span style="color: rgb(32, 64, 160);"&gt;O_RDWR&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;if&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;fd&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(32, 64, 160);"&gt;error&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;"cannot open uart %s, fd is %d&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;"&lt;/span&gt;,&lt;span style="color: rgb(32, 64, 160);"&gt;device&lt;/span&gt;,&lt;span style="color: rgb(32, 64, 160);"&gt;fd&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(32, 64, 160);"&gt;error&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;"%s&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;"&lt;/span&gt;,&lt;span style="color: rgb(32, 64, 160);"&gt;strerror&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;errno&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;strong&gt;return&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;if&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;set_baud&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;fd&lt;/span&gt;,&lt;span style="color: rgb(32, 64, 160);"&gt;speed&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;  &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(32, 64, 160);"&gt;error&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;"Set Baud rate failed!!&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;"&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;strong&gt;return&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;return&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;fd&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Filename: tick_minicom.c&lt;br /&gt;&lt;hr align="center" width="90%"&gt;&lt;br /&gt;&lt;table&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 68);"&gt;&lt;i&gt;/**&lt;br /&gt;* @file tick_minicom.c&lt;br /&gt;* @brief a tiny uart client&lt;br /&gt;* @license GPL (General Public License)&lt;br /&gt;*/&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#include &lt;span style="color: rgb(0, 128, 0);"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#include &lt;span style="color: rgb(0, 128, 0);"&gt;&amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#include &lt;span style="color: rgb(0, 128, 0);"&gt;&amp;lt;unistd.h&amp;gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#include &lt;span style="color: rgb(0, 128, 0);"&gt;&amp;lt;string.h&amp;gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#include &lt;span style="color: rgb(0, 128, 0);"&gt;&amp;lt;errno.h&amp;gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#include &lt;span style="color: rgb(0, 128, 0);"&gt;"debug.h"&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#include &lt;span style="color: rgb(0, 128, 0);"&gt;"util.h"&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#define DEFAULT_UART &lt;span style="color: rgb(0, 128, 0);"&gt;"/dev/ttySAC0"&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#define DEFAULT_BAUD 115200&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;static&lt;/strong&gt; &lt;strong&gt;int&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;keep_run&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/// &lt;span style="color: rgb(32, 64, 160);"&gt;Set&lt;/span&gt; &lt;span style="color: rgb(0, 128, 0);"&gt;'%'&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;as&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;the&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;escape&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;code&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;input_command&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;strong&gt;int&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;input&lt;/span&gt;,&lt;strong&gt;int&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;output&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;  &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;i&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;char&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;buf&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;[1];&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;while&lt;/strong&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;keep_run&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;  &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(32, 64, 160);"&gt;i&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;getche&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;input&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;strong&gt;if&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;i&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: rgb(32, 64, 160);"&gt;debug&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;"file closed!!&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;"&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: rgb(32, 64, 160);"&gt;keep_run&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;      &lt;strong&gt;break&lt;/strong&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;  &lt;strong&gt;if&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;i&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;'%'&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: rgb(32, 64, 160);"&gt;debug&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;"User entered the escape code.&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;"&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: rgb(32, 64, 160);"&gt;debug&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;"Exiting program!&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;"&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: rgb(32, 64, 160);"&gt;keep_run&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;      &lt;strong&gt;break&lt;/strong&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(32, 64, 160);"&gt;buf&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;]&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;i&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(32, 64, 160);"&gt;write&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;output&lt;/span&gt;,&lt;span style="color: rgb(32, 64, 160);"&gt;buf&lt;/span&gt;,&lt;span style="color: rgb(255, 0, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;read_from_uart&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;strong&gt;int&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;input&lt;/span&gt;,&lt;strong&gt;int&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;output&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;i&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;char&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;buf&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;[&lt;/span&gt;1&lt;span style="color: rgb(68, 68, 255);"&gt;]&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;while&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;keep_run&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(32, 64, 160);"&gt;i&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;getche&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;input&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(32, 64, 160);"&gt;buf&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;]&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;i&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(32, 64, 160);"&gt;i&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;write&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;output&lt;/span&gt;,&lt;span style="color: rgb(32, 64, 160);"&gt;buf&lt;/span&gt;,&lt;span style="color: rgb(255, 0, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;main&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;strong&gt;int&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;args&lt;/span&gt;,&lt;strong&gt;char&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;argv&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;uart&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;pid&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;char&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;buf&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;128&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;]&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;if&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;args&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(32, 64, 160);"&gt;uart&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;open_device&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;DEFAULT_UART&lt;/span&gt;,&lt;span style="color: rgb(32, 64, 160);"&gt;DEFAULT_BAUD&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt; &lt;strong&gt;else&lt;/strong&gt; &lt;strong&gt;if&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;args&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;2&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(32, 64, 160);"&gt;uart&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;open_device&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;argv&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;]&lt;/span&gt;,&lt;span style="color: rgb(32, 64, 160);"&gt;DEFAULT_BAUD&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt; &lt;strong&gt;else&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(32, 64, 160);"&gt;uart&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;open_device&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;argv&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;]&lt;/span&gt;,&lt;span style="color: rgb(32, 64, 160);"&gt;atoi&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;argv&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;2&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;]&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;if&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;uart&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(32, 64, 160);"&gt;error&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;"Open device failed !!&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;"&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;strong&gt;return&lt;/strong&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;strong&gt;else&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(32, 64, 160);"&gt;debug&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;"Open Uart and set baud rate OK!!&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;"&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;keep_run&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;pid&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;fork&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;if&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;pid&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;  // &lt;span style="color: rgb(32, 64, 160);"&gt;parent&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(32, 64, 160);"&gt;input_command&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;,&lt;span style="color: rgb(32, 64, 160);"&gt;uart&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(32, 64, 160);"&gt;debug&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;"Exiting Tick's minicom&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;"&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;strong&gt;else&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;  // &lt;span style="color: rgb(32, 64, 160);"&gt;child&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(32, 64, 160);"&gt;pid&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;getppid&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(32, 64, 160);"&gt;read_from_uart&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;uart&lt;/span&gt;,&lt;span style="color: rgb(255, 0, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(32, 64, 160);"&gt;debug&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;"Try to close uart&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;"&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(32, 64, 160);"&gt;debug&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;"Result of close uart=%d&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;"&lt;/span&gt;,&lt;span style="color: rgb(32, 64, 160);"&gt;close&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;uart&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;sprintf&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;buf&lt;/span&gt;,&lt;span style="color: rgb(0, 128, 0);"&gt;"kill -9 %d"&lt;/span&gt;,&lt;span style="color: rgb(32, 64, 160);"&gt;pid&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;system&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;buf&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4272939767197667332-1096588029977406086?l=linuxocarina.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linuxocarina.blogspot.com/feeds/1096588029977406086/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4272939767197667332&amp;postID=1096588029977406086' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/1096588029977406086'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/1096588029977406086'/><link rel='alternate' type='text/html' href='http://linuxocarina.blogspot.com/2007/09/minicom.html' title='簡易版 Minicom'/><author><name>Tick</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://lh3.google.com/ticktock35/RxbHkGdUPGI/AAAAAAAAAE0/IFbLByIbaj8/s144/tux_ocarina.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4272939767197667332.post-3328873377501321402</id><published>2007-09-08T14:37:00.000+08:00</published><updated>2007-09-08T15:22:43.717+08:00</updated><title type='text'>MPENV</title><content type='html'>大概在一年多前使用 QT2 寫了一些Embedded System 的 MMI，&lt;br /&gt;因為某些外在因素整體架構有點亂。&lt;br /&gt;而在當時就開使構思寫一個精簡的 MMI Framework.&lt;br /&gt;定義一些在 Embedded System MMI 的寫作方式，資源控管等東西…&lt;br /&gt;目標是讓降低 Programmer 寫 MMI 時要顧慮的東西，如 status，resource，&lt;br /&gt;只要專心寫要寫的東西就好了。&lt;br /&gt;&lt;br /&gt;幾個月前和幾個朋友聊到這個想法，也就在 SourceForge 註冊了這個案子.&lt;br /&gt;MPENV (Modulized Pages Environment)&lt;br /&gt;&lt;br /&gt;簡單來說，就是用 &lt;a href="http://en.wikipedia.org/wiki/Model-view-controller"&gt;MVC&lt;/a&gt; 的架構來寫一個 MMI Framework.&lt;br /&gt;目前我們只定義了 Module 和 Pages 的介面及跳躍方式。&lt;br /&gt;離目標還有一大段的距離。不過我們正在努力。&lt;br /&gt;&lt;br /&gt;我們使用C++，GTK/GLib 為開發平台，目前不使用 GTKmm。&lt;br /&gt;而 UI component  是用   手寫 or gtk_builder 做出來。&lt;br /&gt;&lt;br /&gt;這幾天還在想如何把 controller 實做出來  :P&lt;br /&gt;&lt;br /&gt;目前有一大堆手寫文件，希望在不久的將來我可以把文件整理一下寫個 SDS 再向大家介紹它。&lt;br /&gt;&lt;br /&gt;--&lt;br /&gt;文筆不好, 真是苦手啊 ~_~&lt;br /&gt;ToDo: 表達能力&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4272939767197667332-3328873377501321402?l=linuxocarina.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='https://sourceforge.net/projects/mpenv' title='MPENV'/><link rel='replies' type='application/atom+xml' href='http://linuxocarina.blogspot.com/feeds/3328873377501321402/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4272939767197667332&amp;postID=3328873377501321402' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/3328873377501321402'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/3328873377501321402'/><link rel='alternate' type='text/html' href='http://linuxocarina.blogspot.com/2007/09/mpenv.html' title='MPENV'/><author><name>Tick</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://lh3.google.com/ticktock35/RxbHkGdUPGI/AAAAAAAAAE0/IFbLByIbaj8/s144/tux_ocarina.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4272939767197667332.post-3908485454964439622</id><published>2007-08-17T20:13:00.000+08:00</published><updated>2007-08-19T01:46:39.879+08:00</updated><title type='text'>One Day Off</title><content type='html'>西元 2007 年 8 月 17 日 颱風天&lt;br /&gt;&lt;br /&gt;這幾天天氣相當的不穩定，小弟連續磕了幾天的普拿疼後，昨天一整天完全沒有工作情緒，今天終於決定不去上班了。&lt;br /&gt;只想好好的睡一覺。好好的放鬆一下。&lt;br /&gt;&lt;br /&gt;睡到了十點，恣意的發呆了一下，頭也比較不痛了。&lt;br /&gt;下午到家附近學生時期常去的水餃店吃了中餐，好久沒去那家店了，沒想到老闆還跑來和我聊了一下天，他們以為我搬家了  :P&lt;br /&gt;&lt;br /&gt;吃完中餐，發了點小瘋，突然想回台大看看。也就去了。台大多出了許多建築物，舟山路也變成學校的一部分。&lt;br /&gt;&lt;br /&gt;颱風越來越大，一個人在校園裏漫遊。回想起那一段刻骨銘心的感情。埸景依舊，兩人依偎的身影卻只在回憶之中。&lt;br /&gt;&lt;br /&gt;到新總圖，四樓左側最後面坐了下來。暑假期間，沒什麼人。這是我大學最喜歡的位子，離我喜歡的書很近。大學時，有數不盡的時光泡在這裏。一個人靜靜的慢慢回味。&lt;br /&gt;&lt;br /&gt;我很喜歡坐在這裏，人生中有許多重大的決定，很多新的想法，讀出心得，感受出知識的威力都在這裏發生。&lt;br /&gt;&lt;br /&gt;畢業多年，回到這裏，也是在思考人生的走向，我們在這時代，我們背負的責任。我是否對得起多年前坐在這心中充滿理想的小子。&lt;br /&gt;&lt;br /&gt;回到系館教室，獨自一人坐在裏頭。這是我大學時代最後一次考試的教室。也是在這間教室之中，我聽到一位老師說： &lt;span style="font-style: italic;"&gt;Java 的 try catch 改善了過去 C 語言中例外處理的弱勢，這是一個新發明，是專家們深入研究程式語言後的發明。而未來做這件事的人，就是在座的各位。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;是的，也許我要更加的努力。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4272939767197667332-3908485454964439622?l=linuxocarina.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linuxocarina.blogspot.com/feeds/3908485454964439622/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4272939767197667332&amp;postID=3908485454964439622' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/3908485454964439622'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/3908485454964439622'/><link rel='alternate' type='text/html' href='http://linuxocarina.blogspot.com/2007/08/one-day-off.html' title='One Day Off'/><author><name>Tick</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://lh3.google.com/ticktock35/RxbHkGdUPGI/AAAAAAAAAE0/IFbLByIbaj8/s144/tux_ocarina.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4272939767197667332.post-2530644153521694470</id><published>2007-08-13T23:48:00.000+08:00</published><updated>2007-08-14T09:35:36.161+08:00</updated><title type='text'>毀壞 Partition 之  Office 2003 Word 救援</title><content type='html'>身為一名軟體工程師，常常會被親戚朋友問一堆怪怪的電腦問題。&lt;br /&gt;昨天就收到了兩個壞掉的隨身碟。一個 512 MB 另一個 1G 。&lt;br /&gt;它們的 MBR 和 superblock 都被病毒給毀了&lt;br /&gt;&lt;br /&gt;可是裏面的 Doc 檔又特別重要… ~_~&lt;br /&gt;&lt;br /&gt;身為一個好人，為了未來的幸福…當然義不容辭一定要把它們救回來嘍&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;以下是我的救援 steps&lt;br /&gt;1. 把 flash 插入可愛的 Linux 機器中。&lt;br /&gt;   "dmesg" check 一下是否硬體壞掉。&lt;br /&gt;   硬體 OK 但沒有 partition info&lt;br /&gt;2. 用 "fdisk /dev/sda"  check MBR&lt;br /&gt;   ok 真的爛了 @_@&lt;br /&gt;3. 用 &lt;span style="font-weight: bold;"&gt;dd if=/dev/sda of=honey_512M.img&lt;/span&gt;   備份下來&lt;br /&gt;&lt;br /&gt;4. check 資料是否完全爛掉，還好，data 還在&lt;br /&gt;&lt;br /&gt;因為苦主說明 word 檔很重要~~ 所以就專攻 word 檔嘍&lt;br /&gt;苦主用的是 office 2003，因此小弟就找了幾個 office 2003 的 word check 了一下檔頭檔尾&lt;br /&gt;&lt;br /&gt;Good Luck!!&lt;br /&gt;發現大多數的 word 檔檔頭是以 D0 CF 11 E0 A1 B1 1A E1 開頭&lt;br /&gt;以 6F 63 75 6D 65 6E 74 2E 38 00 F4 39 B2 71 結尾&lt;br /&gt;因此先用 hexdump +  head + tail 剪一個出來驗證&lt;br /&gt;驗證 OK !!&lt;br /&gt;&lt;br /&gt;5. 隨手寫一支小小的程式把這個區段的 word 檔給一個個 copy 出來&lt;br /&gt;  雖然不是所有資料都救回來了，但最重要的救回來了就好了 ^_^&lt;br /&gt;&lt;br /&gt;6. ./recover honey_512M.img  &lt;br /&gt;&lt;br /&gt;這個方法可以 recover 回文字量少(小檔案)，沒有使用 macro 的doc 檔&lt;br /&gt;如果檔案較大，大於 block size 那就比較麻煩了，就要去讀file system 的資料&lt;br /&gt;幸運的是，絕大多數的檔案都是小檔案。&lt;br /&gt;如果檔案中有圖片，就很可能變成圖片壞了，文字還是救得回來。&lt;br /&gt;&lt;br /&gt;以下是小程式的 source Code:&lt;br /&gt;&lt;br /&gt;Filename: recover.c&lt;br /&gt;Composer: Tick&lt;br /&gt;License: GPL&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;&lt;strong&gt;#include &lt;span style="color:#008000;"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;&lt;strong&gt;#include &lt;span style="color:#008000;"&gt;&amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;&lt;strong&gt;#include &lt;span style="color:#008000;"&gt;&amp;lt;string.h&amp;gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;const&lt;/strong&gt; &lt;strong&gt;int&lt;/strong&gt; &lt;span style="color:#2040a0;"&gt;PREFIX&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;[&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;]&lt;/span&gt; &lt;span style="color:#4444ff;"&gt;=&lt;/span&gt; &lt;span style="color:#4444ff;"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;0xD0&lt;/span&gt;, &lt;span style="color:#ff0000;"&gt;0xCF&lt;/span&gt;, &lt;span style="color:#ff0000;"&gt;0x11&lt;/span&gt;, &lt;span style="color:#ff0000;"&gt;0xE0&lt;/span&gt;, &lt;span style="color:#ff0000;"&gt;0xA1&lt;/span&gt;, &lt;span style="color:#ff0000;"&gt;0xB1&lt;/span&gt;, &lt;span style="color:#ff0000;"&gt;0x1A&lt;/span&gt;, &lt;span style="color:#ff0000;"&gt;0xE1&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;const&lt;/strong&gt; &lt;strong&gt;int&lt;/strong&gt; &lt;span style="color:#2040a0;"&gt;SURFIX&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;[&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;]&lt;/span&gt; &lt;span style="color:#4444ff;"&gt;=&lt;/span&gt; &lt;span style="color:#4444ff;"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;0x6F&lt;/span&gt;, &lt;span style="color:#ff0000;"&gt;0x63&lt;/span&gt;, &lt;span style="color:#ff0000;"&gt;0x75&lt;/span&gt;, &lt;span style="color:#ff0000;"&gt;0x6D&lt;/span&gt;, &lt;span style="color:#ff0000;"&gt;0x65&lt;/span&gt;, &lt;span style="color:#ff0000;"&gt;0x6E&lt;/span&gt;, &lt;span style="color:#ff0000;"&gt;0x74&lt;/span&gt;, &lt;span style="color:#ff0000;"&gt;0x2E&lt;/span&gt;, &lt;span style="color:#ff0000;"&gt;0x38&lt;/span&gt;, &lt;span style="color:#ff0000;"&gt;0x00&lt;/span&gt;, &lt;span style="color:#ff0000;"&gt;0xF4&lt;/span&gt;, &lt;span style="color:#ff0000;"&gt;0x39&lt;/span&gt;, &lt;span style="color:#ff0000;"&gt;0xB2&lt;/span&gt;, &lt;span style="color:#ff0000;"&gt;0x71&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; &lt;span style="color:#2040a0;"&gt;showExit&lt;/span&gt; &lt;span style="color:#4444ff;"&gt;(&lt;/span&gt;&lt;strong&gt;char&lt;/strong&gt; &lt;span style="color:#4444ff;"&gt;*&lt;/span&gt;&lt;span style="color:#2040a0;"&gt;arg&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;)&lt;/span&gt; &lt;span style="color:#4444ff;"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;   &lt;span style="color:#2040a0;"&gt;printf&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;(&lt;/span&gt;&lt;span style="color:#008000;"&gt;"This program is used to recover MS office files from broken image&lt;span style="color:#77dd77;"&gt;\n&lt;/span&gt;"&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;)&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;   &lt;span style="color:#2040a0;"&gt;printf&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;(&lt;/span&gt;&lt;span style="color:#008000;"&gt;"Usage: %s &amp;lt;image file&amp;gt;&lt;span style="color:#77dd77;"&gt;\n&lt;/span&gt;"&lt;/span&gt;,&lt;span style="color:#2040a0;"&gt;arg&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;)&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#4444ff;"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; &lt;span style="color:#2040a0;"&gt;recordFile&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;(&lt;/span&gt;&lt;span style="color:#2040a0;"&gt;FILE&lt;/span&gt; &lt;span style="color:#4444ff;"&gt;*&lt;/span&gt;&lt;span style="color:#2040a0;"&gt;foo&lt;/span&gt;,&lt;strong&gt;char&lt;/strong&gt; &lt;span style="color:#4444ff;"&gt;*&lt;/span&gt;&lt;span style="color:#2040a0;"&gt;file&lt;/span&gt;,&lt;strong&gt;int&lt;/strong&gt; &lt;span style="color:#2040a0;"&gt;start&lt;/span&gt;,&lt;strong&gt;int&lt;/strong&gt; &lt;span style="color:#2040a0;"&gt;end&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;)&lt;/span&gt; &lt;span style="color:#4444ff;"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;   &lt;span style="color:#2040a0;"&gt;FILE&lt;/span&gt; &lt;span style="color:#4444ff;"&gt;*&lt;/span&gt;&lt;span style="color:#2040a0;"&gt;fp&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;=&lt;/span&gt;&lt;span style="color:#2040a0;"&gt;NULL&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;   &lt;strong&gt;if&lt;/strong&gt; &lt;span style="color:#4444ff;"&gt;(&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;!&lt;/span&gt;&lt;span style="color:#2040a0;"&gt;foo&lt;/span&gt; &lt;span style="color:#4444ff;"&gt;|&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;|&lt;/span&gt; &lt;span style="color:#4444ff;"&gt;!&lt;/span&gt;&lt;span style="color:#2040a0;"&gt;file&lt;/span&gt; &lt;span style="color:#4444ff;"&gt;|&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;|&lt;/span&gt; &lt;span style="color:#2040a0;"&gt;strlen&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;(&lt;/span&gt;&lt;span style="color:#2040a0;"&gt;file&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;)&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;=&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;0&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;)&lt;/span&gt; &lt;span style="color:#4444ff;"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;       &lt;span style="color:#2040a0;"&gt;printf&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;(&lt;/span&gt;&lt;span style="color:#008000;"&gt;"Invalid file to record (%d,%d)&lt;span style="color:#77dd77;"&gt;\n&lt;/span&gt;"&lt;/span&gt;,&lt;span style="color:#2040a0;"&gt;start&lt;/span&gt;,&lt;span style="color:#2040a0;"&gt;end&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;)&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;       &lt;strong&gt;return&lt;/strong&gt;&lt;span style="color:#4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;   &lt;span style="color:#4444ff;"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;   &lt;span style="color:#2040a0;"&gt;fp&lt;/span&gt; &lt;span style="color:#4444ff;"&gt;=&lt;/span&gt; &lt;span style="color:#2040a0;"&gt;fopen&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;(&lt;/span&gt;&lt;span style="color:#2040a0;"&gt;file&lt;/span&gt;,&lt;span style="color:#008000;"&gt;"w"&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;)&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;   &lt;strong&gt;if&lt;/strong&gt; &lt;span style="color:#4444ff;"&gt;(&lt;/span&gt;&lt;span style="color:#2040a0;"&gt;fp&lt;/span&gt; &lt;span style="color:#4444ff;"&gt;=&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;=&lt;/span&gt; &lt;span style="color:#2040a0;"&gt;NULL&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;)&lt;/span&gt; &lt;span style="color:#4444ff;"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;       &lt;span style="color:#2040a0;"&gt;printf&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;(&lt;/span&gt;&lt;span style="color:#008000;"&gt;"open record file %s failed!!&lt;span style="color:#77dd77;"&gt;\n&lt;/span&gt;"&lt;/span&gt;,&lt;span style="color:#2040a0;"&gt;file&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;)&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;       &lt;strong&gt;return&lt;/strong&gt;&lt;span style="color:#4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;   &lt;span style="color:#4444ff;"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;   &lt;span style="color:#2040a0;"&gt;fseek&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;(&lt;/span&gt;&lt;span style="color:#2040a0;"&gt;foo&lt;/span&gt;,&lt;span style="color:#2040a0;"&gt;start&lt;/span&gt;,&lt;span style="color:#2040a0;"&gt;SEEK_SET&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;)&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;   &lt;strong&gt;while&lt;/strong&gt; &lt;span style="color:#4444ff;"&gt;(&lt;/span&gt;&lt;span style="color:#2040a0;"&gt;ftell&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;(&lt;/span&gt;&lt;span style="color:#2040a0;"&gt;foo&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;)&lt;/span&gt; &lt;span style="color:#4444ff;"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#2040a0;"&gt;end&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;)&lt;/span&gt; &lt;span style="color:#4444ff;"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;       &lt;span style="color:#2040a0;"&gt;fputc&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;(&lt;/span&gt;&lt;span style="color:#2040a0;"&gt;fgetc&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;(&lt;/span&gt;&lt;span style="color:#2040a0;"&gt;foo&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;)&lt;/span&gt;,&lt;span style="color:#2040a0;"&gt;fp&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;)&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;   &lt;span style="color:#4444ff;"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;   &lt;span style="color:#2040a0;"&gt;fclose&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;(&lt;/span&gt;&lt;span style="color:#2040a0;"&gt;fp&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;)&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#4444ff;"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; &lt;span style="color:#2040a0;"&gt;scanFile&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;(&lt;/span&gt;&lt;span style="color:#2040a0;"&gt;FILE&lt;/span&gt; &lt;span style="color:#4444ff;"&gt;*&lt;/span&gt; &lt;span style="color:#2040a0;"&gt;foo&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;)&lt;/span&gt; &lt;span style="color:#4444ff;"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;   &lt;strong&gt;int&lt;/strong&gt; &lt;span style="color:#2040a0;"&gt;c&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;   &lt;strong&gt;int&lt;/strong&gt; &lt;span style="color:#2040a0;"&gt;index&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;0&lt;/span&gt;,&lt;span style="color:#2040a0;"&gt;index_e&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;0&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;   &lt;strong&gt;int&lt;/strong&gt; &lt;span style="color:#2040a0;"&gt;start&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;0&lt;/span&gt;,&lt;span style="color:#2040a0;"&gt;end&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;0&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;   &lt;strong&gt;int&lt;/strong&gt; &lt;span style="color:#2040a0;"&gt;fid&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;1&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;   &lt;strong&gt;char&lt;/strong&gt; &lt;span style="color:#2040a0;"&gt;buf&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;[&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;256&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;]&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;   &lt;strong&gt;while&lt;/strong&gt; &lt;span style="color:#4444ff;"&gt;(&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;!&lt;/span&gt;&lt;span style="color:#2040a0;"&gt;feof&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;(&lt;/span&gt;&lt;span style="color:#2040a0;"&gt;foo&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;)&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;)&lt;/span&gt; &lt;span style="color:#4444ff;"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;       &lt;span style="color:#2040a0;"&gt;c&lt;/span&gt; &lt;span style="color:#4444ff;"&gt;=&lt;/span&gt; &lt;span style="color:#2040a0;"&gt;fgetc&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;(&lt;/span&gt;&lt;span style="color:#2040a0;"&gt;foo&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;)&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;       //    &lt;span style="color:#2040a0;"&gt;printf&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;(&lt;/span&gt;&lt;span style="color:#008000;"&gt;"get 0x%02x at %d PREFIX[%d]=0x%02x&lt;span style="color:#77dd77;"&gt;\n&lt;/span&gt;"&lt;/span&gt;, &lt;span style="color:#2040a0;"&gt;c&lt;/span&gt;, &lt;span style="color:#4444ff;"&gt;(&lt;/span&gt;&lt;strong&gt;int&lt;/strong&gt;&lt;span style="color:#4444ff;"&gt;)&lt;/span&gt;&lt;span style="color:#2040a0;"&gt;ftell&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;(&lt;/span&gt;&lt;span style="color:#2040a0;"&gt;foo&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;)&lt;/span&gt;,&lt;span style="color:#2040a0;"&gt;index&lt;/span&gt;,&lt;span style="color:#2040a0;"&gt;PREFIX&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;[&lt;/span&gt;&lt;span style="color:#2040a0;"&gt;index&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;]&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;)&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;       &lt;strong&gt;if&lt;/strong&gt; &lt;span style="color:#4444ff;"&gt;(&lt;/span&gt;&lt;span style="color:#2040a0;"&gt;c&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;=&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;=&lt;/span&gt;&lt;span style="color:#2040a0;"&gt;PREFIX&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;[&lt;/span&gt;&lt;span style="color:#2040a0;"&gt;index&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;]&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;)&lt;/span&gt; &lt;span style="color:#4444ff;"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;           &lt;span style="color:#2040a0;"&gt;index&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;+&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;+&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;       &lt;span style="color:#4444ff;"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;strong&gt;else&lt;/strong&gt; &lt;span style="color:#4444ff;"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;           &lt;span style="color:#2040a0;"&gt;index&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;0&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;       &lt;span style="color:#4444ff;"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;       &lt;strong&gt;if&lt;/strong&gt;&lt;span style="color:#4444ff;"&gt;(&lt;/span&gt;&lt;span style="color:#2040a0;"&gt;index&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;=&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;=&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;(&lt;/span&gt;&lt;strong&gt;sizeof&lt;/strong&gt;&lt;span style="color:#4444ff;"&gt;(&lt;/span&gt;&lt;span style="color:#2040a0;"&gt;PREFIX&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;)&lt;/span&gt;/&lt;strong&gt;sizeof&lt;/strong&gt;&lt;span style="color:#4444ff;"&gt;(&lt;/span&gt;&lt;span style="color:#2040a0;"&gt;PREFIX&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;[&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;0&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;]&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;)&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;)&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;)&lt;/span&gt; &lt;span style="color:#4444ff;"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;           &lt;span style="color:#2040a0;"&gt;printf&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;(&lt;/span&gt;&lt;span style="color:#008000;"&gt;"Get PREFIX at %d index = %d&lt;span style="color:#77dd77;"&gt;\n&lt;/span&gt;"&lt;/span&gt;,&lt;span style="color:#4444ff;"&gt;(&lt;/span&gt;&lt;strong&gt;int&lt;/strong&gt;&lt;span style="color:#4444ff;"&gt;)&lt;/span&gt;&lt;span style="color:#2040a0;"&gt;ftell&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;(&lt;/span&gt;&lt;span style="color:#2040a0;"&gt;foo&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;)&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;-&lt;/span&gt;&lt;span style="color:#2040a0;"&gt;index&lt;/span&gt;, &lt;span style="color:#2040a0;"&gt;index&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;)&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;           &lt;span style="color:#2040a0;"&gt;start&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;=&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;(&lt;/span&gt;&lt;strong&gt;int&lt;/strong&gt;&lt;span style="color:#4444ff;"&gt;)&lt;/span&gt;&lt;span style="color:#2040a0;"&gt;ftell&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;(&lt;/span&gt;&lt;span style="color:#2040a0;"&gt;foo&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;)&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;-&lt;/span&gt;&lt;span style="color:#2040a0;"&gt;index&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;           &lt;span style="color:#2040a0;"&gt;index&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;0&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;       &lt;span style="color:#4444ff;"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;       &lt;strong&gt;if&lt;/strong&gt; &lt;span style="color:#4444ff;"&gt;(&lt;/span&gt;&lt;span style="color:#2040a0;"&gt;start&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;!&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;0&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;)&lt;/span&gt; &lt;span style="color:#4444ff;"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;           &lt;strong&gt;if&lt;/strong&gt; &lt;span style="color:#4444ff;"&gt;(&lt;/span&gt;&lt;span style="color:#2040a0;"&gt;c&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;=&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;=&lt;/span&gt;&lt;span style="color:#2040a0;"&gt;SURFIX&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;[&lt;/span&gt;&lt;span style="color:#2040a0;"&gt;index_e&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;]&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;)&lt;/span&gt; &lt;span style="color:#4444ff;"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;               &lt;span style="color:#2040a0;"&gt;index_e&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;+&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;+&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;           &lt;span style="color:#4444ff;"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;strong&gt;else&lt;/strong&gt; &lt;span style="color:#4444ff;"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;               &lt;span style="color:#2040a0;"&gt;index_e&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;0&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;           &lt;span style="color:#4444ff;"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;           &lt;strong&gt;if&lt;/strong&gt; &lt;span style="color:#4444ff;"&gt;(&lt;/span&gt;&lt;span style="color:#2040a0;"&gt;index_e&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;=&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;=&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;(&lt;/span&gt;&lt;strong&gt;sizeof&lt;/strong&gt;&lt;span style="color:#4444ff;"&gt;(&lt;/span&gt;&lt;span style="color:#2040a0;"&gt;SURFIX&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;)&lt;/span&gt;/&lt;strong&gt;sizeof&lt;/strong&gt;&lt;span style="color:#4444ff;"&gt;(&lt;/span&gt;&lt;span style="color:#2040a0;"&gt;SURFIX&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;[&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;0&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;]&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;)&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;)&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;)&lt;/span&gt; &lt;span style="color:#4444ff;"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;               &lt;span style="color:#2040a0;"&gt;end&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;=&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;(&lt;/span&gt;&lt;strong&gt;int&lt;/strong&gt;&lt;span style="color:#4444ff;"&gt;)&lt;/span&gt;&lt;span style="color:#2040a0;"&gt;ftell&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;(&lt;/span&gt;&lt;span style="color:#2040a0;"&gt;foo&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;)&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;               &lt;span style="color:#2040a0;"&gt;printf&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;(&lt;/span&gt;&lt;span style="color:#008000;"&gt;"     File starts at %d end at %d size %d bytes&lt;span style="color:#77dd77;"&gt;\n&lt;/span&gt;"&lt;/span&gt;,&lt;span style="color:#2040a0;"&gt;start&lt;/span&gt;,&lt;span style="color:#2040a0;"&gt;end&lt;/span&gt;,&lt;span style="color:#2040a0;"&gt;end&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;-&lt;/span&gt;&lt;span style="color:#2040a0;"&gt;start&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;)&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;               &lt;span style="color:#2040a0;"&gt;sprintf&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;(&lt;/span&gt;&lt;span style="color:#2040a0;"&gt;buf&lt;/span&gt;,&lt;span style="color:#008000;"&gt;"%04d.doc"&lt;/span&gt;,&lt;span style="color:#2040a0;"&gt;fid&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;+&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;+&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;)&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;               &lt;span style="color:#2040a0;"&gt;recordFile&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;(&lt;/span&gt;&lt;span style="color:#2040a0;"&gt;foo&lt;/span&gt;,&lt;span style="color:#2040a0;"&gt;buf&lt;/span&gt;,&lt;span style="color:#2040a0;"&gt;start&lt;/span&gt;,&lt;span style="color:#2040a0;"&gt;end&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;)&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;               &lt;span style="color:#2040a0;"&gt;start&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;0&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;               &lt;span style="color:#2040a0;"&gt;index_e&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;0&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;           &lt;span style="color:#4444ff;"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;       &lt;span style="color:#4444ff;"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;   &lt;span style="color:#4444ff;"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#4444ff;"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; &lt;span style="color:#2040a0;"&gt;main&lt;/span&gt; &lt;span style="color:#4444ff;"&gt;(&lt;/span&gt;&lt;strong&gt;int&lt;/strong&gt; &lt;span style="color:#2040a0;"&gt;args&lt;/span&gt;,&lt;strong&gt;char&lt;/strong&gt; &lt;span style="color:#4444ff;"&gt;*&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;*&lt;/span&gt;&lt;span style="color:#2040a0;"&gt;argv&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;)&lt;/span&gt; &lt;span style="color:#4444ff;"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;   &lt;span style="color:#2040a0;"&gt;FILE&lt;/span&gt; &lt;span style="color:#4444ff;"&gt;*&lt;/span&gt;&lt;span style="color:#2040a0;"&gt;foo&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;   &lt;strong&gt;if&lt;/strong&gt;&lt;span style="color:#4444ff;"&gt;(&lt;/span&gt;&lt;span style="color:#2040a0;"&gt;args&lt;/span&gt; &lt;span style="color:#4444ff;"&gt;=&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;=&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;1&lt;/span&gt; &lt;span style="color:#4444ff;"&gt;)&lt;/span&gt; &lt;span style="color:#4444ff;"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;       &lt;span style="color:#2040a0;"&gt;showExit&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;(&lt;/span&gt;&lt;span style="color:#2040a0;"&gt;argv&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;[&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;0&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;]&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;)&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;       &lt;strong&gt;return&lt;/strong&gt; &lt;span style="color:#ff0000;"&gt;0&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;   &lt;span style="color:#4444ff;"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;   &lt;span style="color:#2040a0;"&gt;foo&lt;/span&gt; &lt;span style="color:#4444ff;"&gt;=&lt;/span&gt; &lt;span style="color:#2040a0;"&gt;fopen&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;(&lt;/span&gt;&lt;span style="color:#2040a0;"&gt;argv&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;[&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;1&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;]&lt;/span&gt;,&lt;span style="color:#008000;"&gt;"r"&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;)&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;   &lt;strong&gt;if&lt;/strong&gt; &lt;span style="color:#4444ff;"&gt;(&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;!&lt;/span&gt;&lt;span style="color:#2040a0;"&gt;foo&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;)&lt;/span&gt; &lt;span style="color:#4444ff;"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;       &lt;span style="color:#2040a0;"&gt;printf&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;(&lt;/span&gt;&lt;span style="color:#008000;"&gt;"Open File %s failed!!&lt;span style="color:#77dd77;"&gt;\n&lt;/span&gt;"&lt;/span&gt;,&lt;span style="color:#2040a0;"&gt;argv&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;[&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;1&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;]&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;)&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;       &lt;strong&gt;return&lt;/strong&gt; &lt;span style="color:#ff0000;"&gt;0&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;   &lt;span style="color:#4444ff;"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;   &lt;span style="color:#2040a0;"&gt;printf&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;(&lt;/span&gt;&lt;span style="color:#008000;"&gt;"Open File OK!!&lt;span style="color:#77dd77;"&gt;\n&lt;/span&gt;"&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;)&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;br /&gt;   &lt;span style="color:#2040a0;"&gt;scanFile&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;(&lt;/span&gt;&lt;span style="color:#2040a0;"&gt;foo&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;)&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;br /&gt;   &lt;span style="color:#2040a0;"&gt;fclose&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;(&lt;/span&gt;&lt;span style="color:#2040a0;"&gt;foo&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;)&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#4444ff;"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4272939767197667332-2530644153521694470?l=linuxocarina.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linuxocarina.blogspot.com/feeds/2530644153521694470/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4272939767197667332&amp;postID=2530644153521694470' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/2530644153521694470'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/2530644153521694470'/><link rel='alternate' type='text/html' href='http://linuxocarina.blogspot.com/2007/08/partition-office-2003-word.html' title='毀壞 Partition 之  Office 2003 Word 救援'/><author><name>Tick</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://lh3.google.com/ticktock35/RxbHkGdUPGI/AAAAAAAAAE0/IFbLByIbaj8/s144/tux_ocarina.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4272939767197667332.post-103592271834607676</id><published>2007-07-28T15:57:00.000+08:00</published><updated>2008-12-11T14:17:30.597+08:00</updated><title type='text'>春待草</title><content type='html'>&lt;object height="20" width="200"&gt;&lt;param name="movie" value="http://static.boomp3.com/player.swf?id=416cd1f1acf6"&gt;&lt;param name="wmode" value="transparent"&gt;&lt;embed src="http://static.boomp3.com/player.swf?id=416cd1f1acf6" type="application/x-shockwave-flash" wmode="transparent" height="20" width="200"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;object height="20" width="200"&gt;&lt;param name="movie" value="http://static.boomp3.com/player.swf?id=bfb6556c0860"&gt;&lt;param name="wmode" value="transparent"&gt;&lt;embed src="http://static.boomp3.com/player.swf?id=bfb6556c0860" type="application/x-shockwave-flash" wmode="transparent" height="20" width="200"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;自從聽到 黑野宏通 大師的曲子後，深深著迷。&lt;br /&gt;其中我最喜歡的就是這首 "春待草"&lt;br /&gt;剛剛突然想把它錄起來…&lt;br /&gt;於是使用 &lt;a href="http://audacity.sourceforge.net/"&gt;Audacity&lt;/a&gt; 和 &lt;a href="http://lame.sourceforge.net/index.php"&gt;Lame&lt;/a&gt; 錄起壓成 mp3&lt;br /&gt;由於沒有良好的錄音設備，有相當大的背景噪音，請多包涵&lt;br /&gt;和大家分享…&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;使用笛4C:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_uSgEb50CjDE/RqsJY1O0KUI/AAAAAAAAABY/p9tgLBgk6I0/s1600-h/223.jpg"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_uSgEb50CjDE/RqsJY1O0KUI/AAAAAAAAABY/p9tgLBgk6I0/s200/223.jpg" alt="" id="BLOGGER_PHOTO_ID_5092174125883205954" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;另一把 7C&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_uSgEb50CjDE/Rqtyh1O0KVI/AAAAAAAAABg/2bggiuZPj24/s1600-h/DSC00187.JPG"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_uSgEb50CjDE/Rqtyh1O0KVI/AAAAAAAAABg/2bggiuZPj24/s200/DSC00187.JPG" alt="" id="BLOGGER_PHOTO_ID_5092289729222945106" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4272939767197667332-103592271834607676?l=linuxocarina.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linuxocarina.blogspot.com/feeds/103592271834607676/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4272939767197667332&amp;postID=103592271834607676' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/103592271834607676'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/103592271834607676'/><link rel='alternate' type='text/html' href='http://linuxocarina.blogspot.com/2007/07/blog-post.html' title='春待草'/><author><name>Tick</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://lh3.google.com/ticktock35/RxbHkGdUPGI/AAAAAAAAAE0/IFbLByIbaj8/s144/tux_ocarina.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_uSgEb50CjDE/RqsJY1O0KUI/AAAAAAAAABY/p9tgLBgk6I0/s72-c/223.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4272939767197667332.post-5223347138223539168</id><published>2007-07-28T13:06:00.000+08:00</published><updated>2007-07-28T14:08:58.657+08:00</updated><title type='text'>隨手筆記 murmur</title><content type='html'>七月天，份外悶熱。不想開冷氣…&lt;br /&gt;&lt;br /&gt;難得星期六空閒了一下，左手是  Harry Potter 7 ，右手是 Mozart 小夜曲的譜。&lt;br /&gt;正在恣意的浪費寶貴的假期…&lt;br /&gt;&lt;br /&gt;跟了我四年多的 Laptop 越來越怪， device 一個一個壞去，還是撐著用…&lt;br /&gt;想買新的 Laptop&lt;br /&gt;用了十幾年的電視也一直晃動，畫面歪曲變型…&lt;br /&gt;想玩Wii 看來也要買新電視…&lt;br /&gt;&lt;br /&gt;Wish List:&lt;br /&gt;    Laptop  &lt;br /&gt;    TV&lt;br /&gt;    Wii&lt;br /&gt;&lt;br /&gt;啊…又想省錢…&lt;br /&gt;過去的教育一直告訴我，錢要省下來，用來投資做資產分配，&lt;br /&gt;不需要慾望的就要省下來…&lt;br /&gt;未來生活才有保障…&lt;br /&gt;&lt;br /&gt;說得容易，可是當慾望和理財衝突時。&lt;br /&gt;看著別人享樂，自己卻努力克制慾望…&lt;br /&gt;心情並不快樂…&lt;br /&gt;Laptop 應該是要買了…因為這是我吃飯的工具…&lt;br /&gt;TV，Wii...  我可能也沒時間看，沒時間玩  ~_~  先省下來吧…  &gt;_&lt;&lt;br /&gt;&lt;br /&gt;想做好多事，想玩好多東西。沒時間，就是沒時間…&lt;br /&gt;想多陪陪心愛的人，想做陶笛，吹陶笛，想看 Harry potter，想把一些技術上的心得寫下來，想玩 Wii ，…&lt;br /&gt;Wish List 好長…&lt;br /&gt;而每天工作時間又超長。想省下時間做自己想做的事，真的好難…&lt;br /&gt;&lt;br /&gt;可是當真的有時間時，唯一想做的事就是，好好休息…真的太累了…只想躺在床上，好好的睡一覺。&lt;br /&gt;&lt;br /&gt;這陣子在工作上看到了許多 "人事" 上的現象，有一些心得…&lt;br /&gt;工作從興趣變成了工作…真是可悲~&lt;br /&gt;賠掉了時間，出賣靈魂，又只賺那麼一點錢…還被別人說是阿宅…&lt;br /&gt;我到底在追求什麼啊？&lt;br /&gt;&lt;br /&gt;想讓心愛的人有好的生活，想讓未來能活得更有尊嚴。&lt;br /&gt;想真正做出一些有趣的東西，有趣的事…&lt;br /&gt;想讓台灣的資訊人才能真正的產生應有的價值，創造價值…&lt;br /&gt;建構一流的 Team ，做一流的事…&lt;br /&gt;可是自己光有一點技術，會做事，但不抵 "人事" 的力量。&lt;br /&gt;&lt;br /&gt;到這年頭還相信："誠信正直"  看起來真的幼稚了點。&lt;br /&gt;我不期待別人如此，只希望自己能夠堅持下去。&lt;br /&gt;&lt;br /&gt;我不是阿宅，我只是丁了點…&lt;br /&gt;&lt;br /&gt;發洩完了…吹笛子去…&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4272939767197667332-5223347138223539168?l=linuxocarina.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linuxocarina.blogspot.com/feeds/5223347138223539168/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4272939767197667332&amp;postID=5223347138223539168' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/5223347138223539168'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/5223347138223539168'/><link rel='alternate' type='text/html' href='http://linuxocarina.blogspot.com/2007/07/murmur.html' title='隨手筆記 murmur'/><author><name>Tick</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://lh3.google.com/ticktock35/RxbHkGdUPGI/AAAAAAAAAE0/IFbLByIbaj8/s144/tux_ocarina.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4272939767197667332.post-7232150326503152987</id><published>2007-07-12T23:31:00.000+08:00</published><updated>2007-07-29T00:55:57.218+08:00</updated><title type='text'>Synergy 鍵盤滑鼠共用程式</title><content type='html'>幾天前看到同事在玩，才知道原來有一個這麼方便的工具。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://synergy2.sourceforge.net/"&gt;Synergy&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;以下是 PC Home 上的簡介:&lt;br /&gt;&lt;b style="font-style: italic;" class="t1630"&gt;Synergy － 讓你用一套鍵盤滑鼠掌控身邊的所有電腦&lt;/b&gt;&lt;span style="font-style: italic;"&gt;你是否有多部電腦呢？那麼當你要切換不同的電腦時，是透過什麼樣的方式呢？KVM？遠端遙控？這些都落伍了，讓筆者所介紹的這款 Synergy 來幫助你透過一套鍵盤滑鼠控制所有的電腦吧！&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;更酷的是，它可以同一套程式跑在不同的 OS 之上，就變成一下在 Windows 一下在 Linux 一下又可以滑到 Mac 之上。&lt;br /&gt;&lt;br /&gt;不過，在使用之前，要先設一在機器為Server  (就是你正在用滑鼠的那台) 其它台設成 client (要指定好 server 是誰)。&lt;br /&gt;再者，要設定好每台電腦之間的關係，而且要注意一件事：要設定好兩者之間的相互關係。&lt;br /&gt;如&lt;br /&gt;&lt;br /&gt;A &lt;---&gt; B&lt;br /&gt;&lt;br /&gt;我們可以說： &lt;span style="font-weight: bold;"&gt;A 在 B 的左邊&lt;/span&gt;   如此滑鼠滑過 B 的左邊邊線時，就會跑到 A 上面&lt;br /&gt;而如果我們希望滑鼠滑過 A 的右邊邊線時滑鼠可以回到 B 上的話，我們還要定義&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;B 在 A 的右邊&lt;/span&gt; 。&lt;br /&gt;當然，這個關係可以不是 1-1，onto 的，也就是你可以用這個程式做一個滑鼠迷宮 @_@&lt;br /&gt;但我想大概沒人這麼自虐吧 :P&lt;br /&gt;畢竟，這是一個做來讓我們方便使用的程式。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;ps 因為這個程式只認 IP ，就提供服務，所以在某些情況下， keyboard 和 mouse 是有機會被別人搶走的 (大家可以想一想  :P)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4272939767197667332-7232150326503152987?l=linuxocarina.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linuxocarina.blogspot.com/feeds/7232150326503152987/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4272939767197667332&amp;postID=7232150326503152987' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/7232150326503152987'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/7232150326503152987'/><link rel='alternate' type='text/html' href='http://linuxocarina.blogspot.com/2007/07/synergy.html' title='Synergy 鍵盤滑鼠共用程式'/><author><name>Tick</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://lh3.google.com/ticktock35/RxbHkGdUPGI/AAAAAAAAAE0/IFbLByIbaj8/s144/tux_ocarina.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4272939767197667332.post-4334144293632559463</id><published>2007-07-09T17:20:00.000+08:00</published><updated>2007-07-09T18:02:54.126+08:00</updated><title type='text'>[轉貼] screen 教學</title><content type='html'>一篇不錯的 Screen 入門文&lt;br /&gt;留著做備忘 :P&lt;br /&gt;來源: http://plog.longwin.com.tw/post/1/249&lt;br /&gt;&lt;br /&gt;&lt;h3 class="title"&gt;screen 教學&lt;/h3&gt; &lt;p&gt;screen 是個非常好用的工具(Linux, BSD.. 等).&lt;/p&gt;&lt;p&gt;這個網址有很詳細的教學: &lt;a href="http://blog.dragon2.net/archives/2004/10/06/17.php" target="_blank"&gt;screen 簡介&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;下面將一些重點部份轉貼過來..&lt;/p&gt;&lt;h4&gt;使用 screen&lt;/h4&gt;&lt;p&gt;在命令列下打 screen 就會進入 screen 的天地：&lt;br /&gt;% screen&lt;/p&gt;&lt;p&gt;注 意，所有 screen 的指令都是以 Ctrl 鍵加上 a 鍵開始的，在之後以 C-a 代表，C-a c 代表按住 Ctrl 鍵不放再按 a 鍵，然後放開按 c 鍵；而 C-a C-c 代表按住 Ctrl 鍵不放再按 a 鍵，然後放開後再按住 Ctrl 鍵不放按 c 鍵。&lt;/p&gt;&lt;p&gt;開啟，關閉，切換 &lt;/p&gt;&lt;p&gt;C-a c 或 C-a C-c 開啟新的視窗，並同時切換到這個新的視窗&lt;br /&gt;C-a n 或 C-a C-n 或 C-a (space) 切換到下一個視窗（0-&gt;1 1-&gt;2 ...）&lt;br /&gt;C-a p 或 C-a C-p 切換到上一個視窗（1-&gt;0 2-&gt;1 ...）&lt;br /&gt;C-a C-a 切換到上一個顯示過的視窗（不是照順序切換）&lt;br /&gt;C-a 0 切換到第 0 個視窗&lt;br /&gt;C-a (1..9) 切換到第 (1..9) 個視窗&lt;br /&gt;C-a w 或 C-a C-w 會列出目前所開啟的視窗&lt;br /&gt;0$ tcsh 1$ tcsh 2*$ tcsh 3$ tcsh &lt;/p&gt;&lt;p&gt;有星號 "*" 的表示目前顯示中的視窗，之後的 tcsh 代表這個視窗的 title ，預設是以開啟時的 shell 名稱&lt;br /&gt;C-a K 關閉所有的視窗並退出 screen&lt;br /&gt;C-a ' 或 C-a " 會出現 "Switch to window:" 字樣，輸入號碼後就可切到該視窗&lt;br /&gt;單一視窗使用中的指令 &lt;/p&gt;&lt;p&gt;C-a C 清除目前的視窗內容&lt;br /&gt;C-a d 或 C-a C-d 脫離（detach）目前的 screen ，並放到背景執行（不管開了幾個視窗），下面會再提到&lt;br /&gt;C-a D D 強力脫離，除了放到背景執行外，並自動 logout&lt;br /&gt;C-a C-g 虛擬嗶聲（visual bell）的切換，可以在畫面上顯示訊息代表一般的嗶聲&lt;br /&gt;C-a H 紀錄目前視窗所有顯示過的東西（檔名為 screenlog.n n 為視窗號碼）&lt;br /&gt;C-a i 或 C-a C-i 顯示目前視窗的資訊&lt;br /&gt;(11,24)/(80,24)+1000 +(+)flow -ins -org +wrap +app -log -mon +r G0 [BBBB] &lt;/p&gt;&lt;p&gt;C-a l 或 C-a C-l 重繪視窗，如果有字顯示亂掉了可以用這個指令&lt;br /&gt;C-a m 或 C-a C-m 或 C-a (enter) 可以顯示最近一次顯示過的訊息&lt;br /&gt;C-a t 或 C-a C-t 顯示系統的時間及主機名稱還有負載&lt;br /&gt;C-a v 顯示版本資訊&lt;br /&gt;C-a x 或 C-a C-x 如果你要暫時離開目前位置又不想先 logout ，那可以用這個來鎖住 screen&lt;br /&gt;C-a S 將營幕畫面暫停&lt;br /&gt;C-a q (C-a S 暫停) 的 回復&lt;br /&gt;C-a ? 線上求助畫面&lt;br /&gt;複製/卷軸 模式&lt;br /&gt;按下 C-a [ 就可以進入 複製/卷軸 模式（只有在目前視窗才算，其他視窗照常）基本上跟 vi 很像： &lt;/p&gt;&lt;p&gt;h, j, k, l 分別為向左，向下，向上，向右移動一格（或是一行）&lt;br /&gt;0 移到該行最左邊&lt;br /&gt;^ 與 $ 分別移到該行最左邊及最右邊的非空白字元&lt;br /&gt;w 以字為單位往前移動並移到字首&lt;br /&gt;b 以字為單位往後移動並移到字首&lt;br /&gt;e 以字為單位往前移動並移到字尾&lt;br /&gt;C-b 向上捲一頁&lt;br /&gt;C-f 向下捲一頁&lt;br /&gt;C-u 向上捲半頁&lt;br /&gt;C-u 向下捲半頁&lt;br /&gt;/ 與 ? 向下或向上尋找字串&lt;br /&gt;(space) 第一次按下到第二次按下的區域會被複製到暫存區內&lt;br /&gt;(ESC) 離開 複製/卷軸 模式&lt;br /&gt;接著按下 C-a ] 便可以把剛剛存到暫存區內的內容複製出來。 &lt;/p&gt;&lt;p&gt;善用 screen&lt;br /&gt;前 面提到當按了 C-a d 脫離了 screen 後，會回到沒有執行 screen 時的狀態，但是同時在之前 screen 裡每個視窗內在跑的 process （不管是前景或背景執行的）仍然繼續執行，即使 logout 也不會有影響。所以你可能接著離開身邊的電腦，然後跑出去喝個水，或者另外找個舒服的地方坐下來再接著剛剛的工作。 &lt;/p&gt;&lt;p&gt;好，當你重新登入（login）之後，要怎麼接回剛剛的 screen 呢？重打 screen 只會讓電腦另外又開個 screen 給你，你所要做的事就是加些參數： &lt;/p&gt;&lt;p&gt;screen -ls 顯示目前個人所有的 screen&lt;br /&gt;% screen -ls&lt;br /&gt;There are screens on:&lt;br /&gt;1188.ttyp4.SungSung (Attached)&lt;br /&gt;76920.ttypq.SungSung (Detached)&lt;br /&gt;2 Sockets in /tmp/screens/S-AlanSung. &lt;/p&gt;&lt;p&gt;上面的 Attached 表示你現在連接的 screen ，而 Detached 則表示沒有連接的，最後則是共有多少個 screen 數量&lt;br /&gt;screen -r 就是重新回到（resume）screen 裡，如果你只有開一個 screen ，那只要簡單地打&lt;br /&gt;% screen -r &lt;/p&gt;&lt;p&gt;就沒問題了，但是像上面那個，如果你有了兩個以上的 screen ，這樣就有問題了&lt;br /&gt;% screen -r&lt;br /&gt;There are several screens on:&lt;br /&gt;1188.ttyp4.SungSung (Detached)&lt;br /&gt;76920.ttypq.SungSung (Detached)&lt;br /&gt;Type "screen [-d] -r [pid.]tty.host" to resume one of them. &lt;/p&gt;&lt;p&gt;如它的訊息所述，你可以加上它的 process id 或是使用的 tty 加上主機名來決定要接回那一個 screen 。假設在這裡我們要接回 process id 為 1188 的那一個，就打&lt;br /&gt;% screen -r 1188&lt;br /&gt;或&lt;br /&gt;% screen -r ttyp4&lt;br /&gt;或&lt;br /&gt;% screen -r ttyp4.SungSung&lt;br /&gt;或&lt;br /&gt;% screen -r 1188.ttyp4.SungSung&lt;br /&gt;都可以&lt;/p&gt;&lt;p&gt;screen -d 假設現在自己的電腦突然當機，或是網路突然斷了一時連不上去，等到好了之後，想要接回來原來的 screen 卻發現&lt;br /&gt;% screen -r&lt;br /&gt;There is a screen on:&lt;br /&gt;1188.ttyp4.SungSung (Attached)&lt;br /&gt;There is no screen to be resumed.&lt;/p&gt;&lt;p&gt;這時候 -d 這個參數就派上用場了，讓你可以控制某個 screen 脫離（detach），接著再加上 -r 把這個 screen 接手回來&lt;br /&gt;% screen -d&lt;br /&gt;[1188.ttyp4.SungSung detached.]&lt;br /&gt;% screen -r&lt;br /&gt;或直接&lt;br /&gt;% screen -d -r&lt;/p&gt;&lt;p&gt;screen -wipe 有時候不小心跳電了，這時候重開機後當然也不會有 screen 留著，但是由於 screen 會有紀錄所有的 screen ，因為雖然舊的沒有了，可是還是有紀錄在，因此這個指令就是把廢棄不用的 screen 給"擦拭乾淨"（wipe）&lt;br /&gt;There are screens on:&lt;br /&gt;69103.ttyp5.SungSung (Removed)&lt;br /&gt;529.ttyp0.SungSung (Detached)&lt;br /&gt;1 socket wiped out.&lt;br /&gt;1 Socket in /tmp/screens/S-AlanSung.&lt;/p&gt;&lt;p&gt;會 用了上面所介紹的功能，你可以現在進入 bbs ，進入聊天室跟人聊天或是在上面發表文章到一半，發現計中要關門了，你可以從容的 detach ，回家之後再連回來 attach ，繼續剛剛的話題或發表文章，而對方可能根本沒發覺。只要你連線的主機不當機，那電話線或網路再怎麼不?都不必怕斷線。&lt;/p&gt;&lt;p&gt;如果你需要更多詳細的資料，可以善用線上手冊（manual pages）或是 info 這個指令&lt;br /&gt;% man screen&lt;br /&gt;% info screen&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;div class="posted"&gt;  作者   jon    (    &lt;a href="http://plog.longwin.com.tw/document-ebook"&gt;Document-Ebook&lt;/a&gt; )     ::  &lt;a href="http://plog.longwin.com.tw/document-ebook/2005/11/04/screen_teach"&gt;迴響 (2)&lt;/a&gt;::  &lt;a href="http://plog.longwin.com.tw/document-ebook/2005/11/04/screen_teach"&gt;靜態連結網址&lt;/a&gt;  &lt;/div&gt;           &lt;div class="blogbody"&gt;     &lt;p class="title"&gt;      &lt;img src="http://plog.longwin.com.tw/imgs/comment_icon1.gif" alt="this is comment icon" /&gt; 請問split怎麼用？ &lt;span class="categoryinfo"&gt;[&lt;a href="http://plog.longwin.com.tw/index.php?op=Comment&amp;articleId=249&amp;amp;parentId=475&amp;blogId=1"&gt;回覆&lt;/a&gt;]&lt;/span&gt;     &lt;/p&gt;     &lt;p&gt;嗯..screen很好用，不過這一篇教學滿基本的，所以想請問在screen中的split功能怎麼使用？&lt;/p&gt;      &lt;div class="posted"&gt;         Comment by          spancer         (12/09/2005 16:53)&lt;/div&gt;&lt;/div&gt;       &lt;div class="blogbody"&gt;     &lt;p class="title"&gt;      &lt;img src="http://plog.longwin.com.tw/imgs/comment_icon1.gif" alt="this is comment icon" /&gt; 回 spancer &lt;span class="categoryinfo"&gt;[&lt;a href="http://plog.longwin.com.tw/index.php?op=Comment&amp;amp;amp;articleId=249&amp;parentId=476&amp;amp;blogId=1"&gt;回覆&lt;/a&gt;]&lt;/span&gt;     &lt;/p&gt;     &lt;p&gt;之前倒是沒這樣子試過, 剛剛去 man 了一下 screen,&lt;br /&gt;Ctrl-a S 就可以 split,&lt;br /&gt;Ctrl-a tab 就可以切到下面的視窗,&lt;br /&gt;Ctrl-a Ctrl-a 下面的視窗就可以到處切換,&lt;br /&gt;Ctrl-a Q 就將分割的視窗關掉,&lt;br /&gt;(當看到一片黑的時後, 總之就 Ctrl-a Ctrl-a 就對了)&lt;/p&gt;      &lt;div class="posted"&gt;         Comment by          &lt;a href="http://plog.longwin.com.tw/"&gt;Tsung&lt;/a&gt;         (12/09/2005 17:09)&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4272939767197667332-4334144293632559463?l=linuxocarina.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://plog.longwin.com.tw/post/1/249' title='[轉貼] screen 教學'/><link rel='replies' type='application/atom+xml' href='http://linuxocarina.blogspot.com/feeds/4334144293632559463/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4272939767197667332&amp;postID=4334144293632559463' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/4334144293632559463'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/4334144293632559463'/><link rel='alternate' type='text/html' href='http://linuxocarina.blogspot.com/2007/07/screen.html' title='[轉貼] screen 教學'/><author><name>Tick</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://lh3.google.com/ticktock35/RxbHkGdUPGI/AAAAAAAAAE0/IFbLByIbaj8/s144/tux_ocarina.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4272939767197667332.post-4650750479335379354</id><published>2007-06-27T09:32:00.000+08:00</published><updated>2007-06-27T12:56:50.190+08:00</updated><title type='text'>2007陶笛與塤的形音色美</title><content type='html'>陳鏡老師將於苗栗陶瓷博物館舉辦為期一個月的陶笛與塤的創作展, 同時也邀請多位國內陶笛製作者共同參加.&lt;br /&gt;&lt;br /&gt;展覽期間也有多場精彩的陶笛音樂演出及陶笛相關的研討會. 這場夏日盛會, 您非去不可.&lt;br /&gt;&lt;br /&gt;地點: 苗栗陶瓷博物館&lt;br /&gt;時間: 2007 年 8/01 ~ 8/31&lt;br /&gt;官網: 2007陶笛與塤的形音色美&lt;br /&gt;&lt;br /&gt;白鷺鷥獲邀在 8/4 開幕音樂茶會上演出. 預計曲目為&lt;br /&gt;&lt;br /&gt;莫札特小夜曲&lt;br /&gt;玩具兵進行曲&lt;br /&gt;四月望雨&lt;br /&gt;白鷺鷥&lt;br /&gt;&lt;br /&gt;敬請期待 .....&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------&lt;br /&gt;◆指導單位：行政院文化建設委員會．國立臺灣工藝研究所&lt;br /&gt;◆主辦單位：苗栗縣政府．苗栗陶瓷博物館&lt;br /&gt;◆協辦單位：陶藝雜誌、中華民國陶藝協會、苗栗縣陶藝協會、苗栗縣陶笛協會、白鷺鷥陶笛樂團、台中市陶笛樂團、彰化縣陶笛樂團、換日線陶笛隊、嘉義市樂耕陶笛隊、Rubato陶笛音樂藝術樂團&lt;br /&gt;&lt;br /&gt;◆展期：2007年08月01日起至08月31日止&lt;br /&gt;◆會場：苗栗陶瓷博物館（苗栗縣旅客服務映像園區）&lt;br /&gt;◆地址：苗栗縣公館鄉館南村館南352號&lt;br /&gt;◆電話：037-236-818 傳真：037-238-288&lt;br /&gt;◆陶笛參展作家：林孟德、李生鴻、李焜剛、何財銘、吳寶安、吳淑櫻、官鋒忠、范欽章、許浩倫、郭慶榮、陳國祥、陳鏡、張志名、楊文涵、劉鼎魁、潘國隆、蔡宗翰、謝永清、藍鈺雯（以上順序依姓氏筆劃排列）&lt;br /&gt;&lt;br /&gt;◆記者會：2007年08月02日（四）上午10點整&lt;br /&gt;◆出席名單：參與展覽及演出的朋友 等自由參加&lt;br /&gt;&lt;br /&gt;◆開幕音樂茶會：2007年08月04日（六）上午10點整&lt;br /&gt;◆演奏名單：許浩倫、蘇義堡、黃文琪、陳鏡、白鷺鷥陶笛樂團、台中市陶笛樂團、彰化縣陶笛樂團、 Rubato陶笛音樂藝術樂團 等&lt;br /&gt;&lt;br /&gt;◆複管陶笛表演＆陶笛製作示範：2007年08月12日（日）上午10點整&lt;br /&gt;◆演出名單：許浩倫、陳鏡&lt;br /&gt;&lt;br /&gt;◆陶笛吹奏＆製作研討會：2007年08月19日（日）上午10點整&lt;br /&gt;◆演出及主講名單：苗栗縣陶笛協會、換日線陶笛隊、潘旭建&lt;br /&gt;&lt;br /&gt;◆陶笛吹奏表演：2007年08月26日（日）上午10點整&lt;br /&gt;◆演出名單：嘉義市樂耕陶笛隊、王明中&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;◆策展人：陳鏡（桼采匋）&lt;br /&gt;◆相關展覽圖片請至  &lt;a href="http://photo.xuite.net/ceramicist/1743318"&gt;http://photo.xuite.net/ceramicist/1743318&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;◆【苗栗縣旅客服務映像園區】占地2.1公頃餘&lt;br /&gt;位置－位於苗栗縣公館鄉南方約兩公里，省六號公路左側；距離中山高速公路僅三公里餘。&lt;br /&gt;特色－本為陸軍基地，已廢棄多時，苗栗縣政府以閒置空間再利用方式，改造為：&lt;br /&gt;1、觀光旅遊資訊中心&lt;br /&gt;2、苗栗縣陶瓷博物館&lt;br /&gt;3、成為苗栗地區農業特產展現中心點&lt;br /&gt;4、地區景觀公園&lt;br /&gt;5、客家文化特色園區&lt;br /&gt;&lt;a href="http://www1.mlc.gov.tw/culture/01.php?id=24"&gt;http://www1.mlc.gov.tw/culture/01.php?id=24&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4272939767197667332-4650750479335379354?l=linuxocarina.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://blog.xuite.net/pankuolong/egret/11979860#5667036' title='2007陶笛與塤的形音色美'/><link rel='replies' type='application/atom+xml' href='http://linuxocarina.blogspot.com/feeds/4650750479335379354/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4272939767197667332&amp;postID=4650750479335379354' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/4650750479335379354'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/4650750479335379354'/><link rel='alternate' type='text/html' href='http://linuxocarina.blogspot.com/2007/06/2007.html' title='2007陶笛與塤的形音色美'/><author><name>Tick</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://lh3.google.com/ticktock35/RxbHkGdUPGI/AAAAAAAAAE0/IFbLByIbaj8/s144/tux_ocarina.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4272939767197667332.post-5832331216168872132</id><published>2007-06-26T16:14:00.000+08:00</published><updated>2007-06-28T17:46:29.867+08:00</updated><title type='text'>檢查 library dependency 的小工具</title><content type='html'>在開發"手工打造"的 Embedded System 時，可能會遇到library depency 的問題&lt;br /&gt;而我們不見得能一下子就知道這個 library 的 dependency (請使用 ldd or objdump)&lt;br /&gt;&lt;br /&gt;愛偷懶的小弟因為懶得算 dependency，就寫了一支小 script 幫我算&lt;br /&gt;&lt;br /&gt;它可以把我所指定的程式所依賴的 library 找出來，如果在我的 target 之中沒有它就把它從 library source copy 過來 (這樣就可以找出 library 的最小集合)&lt;br /&gt;&lt;br /&gt;它可以搭配其它 script 使用，做到完全自動化計算 library dependency&lt;br /&gt;&lt;br /&gt;個人覺得還蠻方便的，分享給大家&lt;br /&gt;&lt;br /&gt;File: checklib.sh&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;table border="3" width="90%"&gt;&lt;br /&gt;&lt;font color="0000ff"&gt;&lt;strong&gt;#!/bin/bash&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#444444"&gt;# This software may be used and distributed according to the terms&lt;br /&gt;# of the GNU General Public License (GPL), incorporated herein by reference.&lt;/font&gt;&lt;br /&gt;&lt;font color="#444444"&gt;# Drivers based on this skeleton fall under the GPL and must retain&lt;/font&gt;&lt;br /&gt;&lt;font color="#444444"&gt;# the authorship (implicit copyright) notice.&lt;/font&gt;&lt;br /&gt;&lt;font color="#444444"&gt;#&lt;/font&gt;&lt;br /&gt;&lt;font color="#444444"&gt;# This program is distributed in the hope that it will be useful, but&lt;/font&gt;&lt;br /&gt;&lt;font color="#444444"&gt;# WITHOUT ANY WARRANTY; without even the implied warranty of&lt;br /&gt;# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU&lt;/font&gt;&lt;br /&gt;&lt;font color="#444444"&gt;# General Public License for more details.&lt;br /&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#444444"&gt;#composer Tick&lt;br /&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#2040a0"&gt;LIB_SOURCE_PATH&lt;/font&gt;=&lt;font color="#008000"&gt;&amp;quot;/Project/tank/lib/ /usr/toolchain/arm-linux/arm-linux/lib&amp;quot;&lt;/font&gt;&lt;br /&gt;&lt;font color="#2040a0"&gt;REFERENCE_LIB_PATH&lt;/font&gt;=&lt;font color="#008000"&gt;&amp;quot;/path to my project rootfs/disk/lib/&amp;quot;&lt;/font&gt;&lt;br /&gt;&lt;font color="#2040a0"&gt;TARGET_LIB_PATH&lt;/font&gt;=&lt;font color="#008000"&gt;&amp;quot;/path to my project rootfs/disk/lib/&amp;quot;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#2040a0"&gt;LIBS&lt;/font&gt;=&lt;font color="#008000"&gt;&amp;quot;&amp;quot;&lt;/font&gt;&lt;br /&gt;for file_tmp in $@;do&lt;br /&gt;    &lt;font color="#2040a0"&gt;FILE&lt;/font&gt;=`file &lt;font color="#2040a0"&gt;$file_tmp&lt;/font&gt;`&lt;br /&gt;    if (( `echo &lt;font color="#2040a0"&gt;$FILE&lt;/font&gt; | grep &lt;font color="#008000"&gt;&amp;quot;dynamically linked&amp;quot;&lt;/font&gt; | wc -l` == 0 )) ;then&lt;br /&gt;        continue;&lt;br /&gt;    fi&lt;br /&gt;    if [ &lt;font color="#008000"&gt;&amp;quot;`echo &lt;font color="#2040a0"&gt;$FILE&lt;/font&gt; | awk '{print &lt;font color="#2040a0"&gt;$7&lt;/font&gt;}'`&amp;quot;&lt;/font&gt; = &lt;font color="#008000"&gt;&amp;quot;80386,&amp;quot;&lt;/font&gt; ];then&lt;br /&gt;        &lt;font color="#2040a0"&gt;OBJDUMP&lt;/font&gt;=&lt;font color="#008000"&gt;&amp;quot;objdump&amp;quot;&lt;/font&gt;&lt;br /&gt;    else&lt;br /&gt;        &lt;font color="#2040a0"&gt;OBJDUMP&lt;/font&gt;=&lt;font color="#008000"&gt;&amp;quot;arm-linux-objdump&amp;quot;&lt;/font&gt;&lt;br /&gt;    fi&lt;br /&gt;    LIBS+=`${OBJDUMP}  -p &lt;font color="#2040a0"&gt;$file_tmp&lt;/font&gt;   | awk '/NEEDED/ {printf(&lt;font color="#008000"&gt;&amp;quot;%s  &amp;quot;&lt;/font&gt;,&lt;font color="#2040a0"&gt;$2&lt;/font&gt;); }'`&lt;br /&gt;done&lt;br /&gt;&lt;br /&gt;for lib_tmp in &lt;font color="#2040a0"&gt;$LIBS&lt;/font&gt;;do&lt;br /&gt;    &lt;font color="#2040a0"&gt;IS_exist&lt;/font&gt;=0&lt;br /&gt;    for SS in ${REFERENCE_LIB_PATH};do&lt;br /&gt;        if (( `find &lt;font color="#2040a0"&gt;$SS&lt;/font&gt; -name ${lib_tmp} | wc -l` &amp;gt; 0));then&lt;br /&gt;            &lt;font color="#2040a0"&gt;IS_exist&lt;/font&gt;=1;&lt;br /&gt;            break;&lt;br /&gt;        fi&lt;br /&gt;    done&lt;br /&gt;    if (( ${IS_exist} &amp;gt; 0  )); then&lt;br /&gt;        continue;&lt;br /&gt;    fi&lt;br /&gt;    &lt;font color="#2040a0"&gt;SRC_LIB&lt;/font&gt;=&lt;font color="#008000"&gt;&amp;quot;&amp;quot;&lt;/font&gt;&lt;br /&gt;    for SS in  ${LIB_SOURCE_PATH};do&lt;br /&gt;    &lt;font color="#2040a0"&gt;SRC_LIB&lt;/font&gt;=&lt;font color="#008000"&gt;&amp;quot;${SRC_LIB} `find ${SS} -name ${lib_tmp}`&amp;quot;&lt;/font&gt;&lt;br /&gt;    done&lt;br /&gt;    if [ &lt;font color="#2040a0"&gt;$SRC_LIB&lt;/font&gt; ];then&lt;br /&gt;        &lt;font color="#2040a0"&gt;SRC_BASE&lt;/font&gt;=`echo &lt;font color="#2040a0"&gt;$SRC_LIB&lt;/font&gt; | awk '{&lt;font color="#2040a0"&gt;stop&lt;/font&gt;=index(&lt;font color="#2040a0"&gt;$0&lt;/font&gt;,&lt;font color="#008000"&gt;&amp;quot;.so&amp;quot;&lt;/font&gt;);&lt;font color="#2040a0"&gt;ans&lt;/font&gt;=substr(&lt;font color="#2040a0"&gt;$0&lt;/font&gt;,0,stop-1);print ans}'`&lt;br /&gt;        echo &lt;font color="#008000"&gt;&amp;quot;You are going to copy the following libraries to ${TARGET_LIB_PATH}:&amp;quot;&lt;/font&gt;&lt;br /&gt;        echo &lt;font color="#008000"&gt;&amp;quot;cp -av ${SRC_BASE}[0-9.]*[!a] to ${TARGET_LIB_PATH}&amp;quot;&lt;/font&gt;&lt;br /&gt;        echo -n &lt;font color="#008000"&gt;&amp;quot;continue? &amp;quot;&lt;/font&gt;&lt;br /&gt;        read ans;&lt;br /&gt;        if [ &lt;font color="#008000"&gt;&amp;quot;&lt;font color="#2040a0"&gt;$ans&lt;/font&gt;&amp;quot;&lt;/font&gt; = &lt;font color="#008000"&gt;&amp;quot;y&amp;quot;&lt;/font&gt; ]  || [ &lt;font color="#008000"&gt;&amp;quot;&lt;font color="#2040a0"&gt;$ans&lt;/font&gt;&amp;quot;&lt;/font&gt; = &lt;font color="#008000"&gt;&amp;quot;Y&amp;quot;&lt;/font&gt; ];then&lt;br /&gt;            cp -av ${SRC_BASE}[\.0-9\-]*[!a] ${TARGET_LIB_PATH}&lt;br /&gt;        fi&lt;br /&gt;    else&lt;br /&gt;        echo &lt;font color="#008000"&gt;&amp;quot;Warning: I cannot find ${lib_tmp} from the LIB_SOURCE_PATH you set!!&amp;quot;&lt;/font&gt;&lt;br /&gt;        echo &lt;font color="#008000"&gt;&amp;quot;It might be missed not in somewhere else.&amp;quot;&lt;/font&gt;&lt;br /&gt;        echo &lt;font color="#008000"&gt;&amp;quot;Please check if it is not in '${LIB_SOURCE_PATH}'&amp;quot;&lt;/font&gt;&lt;br /&gt;    fi&lt;br /&gt;    echo&lt;br /&gt;    echo&lt;br /&gt;done&lt;br /&gt;&lt;/table&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4272939767197667332-5832331216168872132?l=linuxocarina.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linuxocarina.blogspot.com/feeds/5832331216168872132/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4272939767197667332&amp;postID=5832331216168872132' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/5832331216168872132'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/5832331216168872132'/><link rel='alternate' type='text/html' href='http://linuxocarina.blogspot.com/2007/06/library-dependency.html' title='檢查 library dependency 的小工具'/><author><name>Tick</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://lh3.google.com/ticktock35/RxbHkGdUPGI/AAAAAAAAAE0/IFbLByIbaj8/s144/tux_ocarina.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4272939767197667332.post-3569587066044413902</id><published>2007-06-23T20:57:00.000+08:00</published><updated>2007-06-23T21:07:01.150+08:00</updated><title type='text'>[舊文]list_head 的用法</title><content type='html'>三年前寫的文章 &lt;br /&gt;有機會再來討論一下這個好玩的東西&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;引言回覆&lt;br /&gt;發表 list_head 的用法 &lt;br /&gt;在 linux kernel 之中做double link list 時有個東西實在是又好用，又強大，速度又快。&lt;br /&gt;那就是 list head&lt;br /&gt;其實這個東西和我們在資料結構中學的沒兩樣。&lt;br /&gt;只是這個玩意運用了 struct 的結構性，及 C 語言本身的低階能力，使得速度變得很快。&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;struct list_head {&lt;br /&gt;　struct list_head *prev,*next;&lt;br /&gt;};&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;他的內容只有 list_head 的 兩個 pointer.也只能指 list_head&lt;br /&gt;在運用時，有個 macro 叫&lt;br /&gt;list_entry&lt;br /&gt;&lt;br /&gt;他可以以 list_head 的位址，及這個 list_head 在物件中的位址，算出物件的位址。&lt;br /&gt;也就是說，假設有一個物件叫 ABC 以下是內容：&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;struct ABC {&lt;br /&gt;　int index;&lt;br /&gt;　char *name;&lt;br /&gt;　int score;&lt;br /&gt;　struct list_head lh;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;如果你今天拿到一個 ABC物件中的 lh 的位址(lhpt)的話，你就可以從這裏拿到該物件的位址。&lt;br /&gt;e.q. struct ABC *abc = list_entry(lhpt, struct ABC,lh);&lt;br /&gt;如此，list_head 就會依 lh 在 ABC 的相對位置，及 lhpt 的位址算出 這個 ABC 的位址。&lt;br /&gt;&lt;br /&gt;當有 list_head 的物件被 allocate 出來時，要記得初始化 prev 和 next&lt;br /&gt;e.q. INIT_LIST_HEAD(&amp;abc-&gt;lh);&lt;br /&gt;&lt;br /&gt;加入串列中的用法是&lt;br /&gt;list_add(&amp;abc-&gt;lh,head);&lt;br /&gt;or&lt;br /&gt;list_add_tail(&amp;abc-&gt;lh,head);&lt;br /&gt;&lt;br /&gt;刪除是&lt;br /&gt;list_del(&amp;abc-&gt;lh);&lt;br /&gt;但是，有一點一定要記得 list_del 不會清掉 abc-&gt;lh 的內容&lt;br /&gt;但是會清掉 abc-&gt;lh-&gt;prev 的 next 和 abc-&gt;lh-&gt;next 的 prev&lt;br /&gt;如果要清得乾淨一點，就要用 list_del_init(&amp;abc-&gt;lh);&lt;br /&gt;那就會 abc-&gt;lh-&gt;prev == abc-&gt;lh-&gt;next==&amp;abc-&gt;lh&lt;br /&gt;&lt;br /&gt;-- &lt;br /&gt;會不會寫得太難懂啦 ~_~&lt;br /&gt;&lt;br /&gt;星期五 二月 20, 2004 8:18 am&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4272939767197667332-3569587066044413902?l=linuxocarina.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linuxocarina.blogspot.com/feeds/3569587066044413902/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4272939767197667332&amp;postID=3569587066044413902' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/3569587066044413902'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/3569587066044413902'/><link rel='alternate' type='text/html' href='http://linuxocarina.blogspot.com/2007/06/listhead.html' title='[舊文]list_head 的用法'/><author><name>Tick</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://lh3.google.com/ticktock35/RxbHkGdUPGI/AAAAAAAAAE0/IFbLByIbaj8/s144/tux_ocarina.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4272939767197667332.post-1060962032472829798</id><published>2007-06-23T20:48:00.000+08:00</published><updated>2007-06-23T21:10:07.641+08:00</updated><title type='text'>[舊文] bash shell script 程式設計</title><content type='html'>這是三年前寫的舊文嘍~ 放在這懷舊一下&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;bash shell script 程式設計(序言,1,2,3,4,5,6,完)&lt;br /&gt;&lt;br /&gt;發表 bash shell script 程式設計(序言,1,2,3,4,5,6,完)&lt;br /&gt;相信所有玩過 Unix的人都會同意 shell script 是一個十分強大的工具，可以用來幫助自已在短時間內解決許多枯\躁而乏味的工作，而且讓工作變得有趣。&lt;br /&gt;對於 shell script 要怎麼寫，為什麼會想到這麼寫？對於這個問題，我個人的答案是：用多了，就知道了。有時很聰明的想法，往往是靈機一動，就想到了。我會建議大家，如果寫了好用的 script 就把他留下來，給個好名字。有時候用得上時，就會很高興有這個自製的工具。&lt;br /&gt;當然，要寫 script 之前，要先了解一些東西。&lt;br /&gt;1. 資料流&lt;br /&gt;&gt;, &gt;&gt; , &lt; , | , #&amp;amp;&gt;# .....&lt;br /&gt;2. 一些好用的工具&lt;br /&gt;cat&lt;br /&gt;grep&lt;br /&gt;awk&lt;br /&gt;sed&lt;br /&gt;find&lt;br /&gt;more&lt;br /&gt;........ everything you can use.&lt;br /&gt;3. 變數&lt;br /&gt;4. 指令代換&lt;br /&gt;5. 判斷式&lt;br /&gt;if else fi&lt;br /&gt;6. 流程控制&lt;br /&gt;while for&lt;br /&gt;....&lt;br /&gt;在之後的幾篇文章中，我會慢慢把一個個 topic 寫完...&lt;br /&gt;希望不會寫得太糟 Razz&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;tick 在 星期五 二月 06, 2004 12:11 am 作了第 8 次修改&lt;br /&gt;星期六 一月 17, 2004 12:42 am  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;發表 資料流&lt;br /&gt;UNIX是第一個支援資料流的作業系統。&lt;br /&gt;什麼是資料流呢？&lt;br /&gt;就是把程式的輸入和輸出想像成一個串流，&lt;br /&gt;在 Unix 之下，任和一個一般的程式都會直接開三個檔案。&lt;br /&gt;0. stdin&lt;br /&gt;1. stdout&lt;br /&gt;2. stderr&lt;br /&gt;這三個檔案分別是 資料流的 輸入和輸出，及錯誤輸出&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;stdin ====&gt; 程式 =====&gt; stdout&lt;br /&gt;　　　　　　　　∟==&gt; stderr&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;在 default 之下，stdin 是接著 keyboard&lt;br /&gt;stdout 是接著 tty (你想成 monitor 就好了)&lt;br /&gt;stderr 也是接著 tty&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;資料流既然是"流"，那當然可以轉向。&lt;br /&gt;"&lt;" 這個指令呢就是把 stdin 接上後面的檔案 如 cat &lt;&gt;" 是把 stdout 寫入後面的 file&lt;br /&gt;如檔案內有東西，會把檔案內的東西清空才寫入。&lt;br /&gt;&lt;br /&gt;"&gt;&gt;" 和 "&gt;" 相同，但不會把檔案內的東西清空，而是寫在檔尾&lt;br /&gt;如&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;cat test.txt &gt;&gt; foo&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;"|" (pipe)這個呢則是把前面的stdout 接到後面程式的 stdin&lt;br /&gt;如&lt;br /&gt;cat test.txt | more&lt;br /&gt;這樣， cat 的輸出就可以被 more 接下來。&lt;br /&gt;&lt;br /&gt;&gt; &gt;&gt; 還可以把 stderr 轉到 stdout&lt;br /&gt;如&lt;br /&gt;2&gt;&amp;1&lt;br /&gt;也可把 stdout 轉到 stderr&lt;br /&gt;如&lt;br /&gt;1&gt;&gt;&amp;amp;2&lt;br /&gt;&lt;br /&gt;在 shell script 中資料流轉向，和pipe 是十分常用的技巧&lt;br /&gt;(應該說是基本工夫)&lt;br /&gt;在一般下指令的時候也是很常用上&lt;br /&gt;如&lt;br /&gt;cat pbsd.c | grep CONFIG_PBS&lt;br /&gt;&lt;br /&gt;有時候如果要做一些比較複雜的動作。接個四五個 pipe 再加上轉向，也不為過&lt;br /&gt;&lt;br /&gt;--&lt;br /&gt;過年期間我不能上網，所以我會在自己的 notebook 寫，等回台北再 post 上來&lt;br /&gt;&lt;br /&gt;星期日 一月 18, 2004 1:45 am  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;如果有好的能力，沒有好的工具，那也是沒有用，但很幸運的是，&lt;br /&gt;之前的 Unix Programer 寫了許多方便自己的工具，相同的那些工具\r&lt;br /&gt;也能方便我們。&lt;br /&gt;下面是一些工具的簡單介紹。(都可用 pipe 和轉向)&lt;br /&gt;cat :&lt;br /&gt;　　把檔案打開，印到 stdout 上&lt;br /&gt;grep :&lt;br /&gt;　　 grep 是一個在輸入資料中找出指明要找的字串的那一行文字的工具。&lt;br /&gt;　　如&lt;br /&gt;　　 grep "I Love Shell Script" test.txt&lt;br /&gt;　　 就是把 test.txt 這個檔案中，有 "I Love Shell Script" 這個字串的那一行印&gt;到&lt;br /&gt;　　stdout 中。&lt;br /&gt;　　cat test.txt | grep "I Love Shell Script" #也是一樣的&lt;br /&gt;awk :&lt;br /&gt;　　一個用來分析內文的工具，它可以掃描文章內容，找出你要的文字，且&lt;br /&gt;　　依你的要求做輸出，你可以把它當做 grep 的加強版。&lt;br /&gt;　　awk 的語法很像 C 語言，所以對會寫 C 語言的人而言，這是一個很好用的工具&lt;br /&gt;　　如&lt;br /&gt;　　awk '{print NR,$0}' text.txt&lt;br /&gt;　　就會把 text.txt 的內容印出來，且加上行數&lt;br /&gt;sed :&lt;br /&gt;　　這個工具可以幫你把你想換掉的字串一次換掉&lt;br /&gt;&lt;br /&gt;awk 和 sed 這兩個工具是十分強大的工具，它們可以做到的事十分的多&lt;br /&gt;遠比它一開始被定義時所想到的功能還多，多到可以寫一本書來談。\r&lt;br /&gt;O'Reilly 就有出一本 awk &amp; sed 的書，有興趣的話可以找一本來看看。&lt;br /&gt;&lt;br /&gt;find:&lt;br /&gt;　　這個工具可以依你的要求，找出你想要的檔案，在系統管理上很好用。&lt;br /&gt;　　可是依時間，大小，檔名，修改時間等等的選項來找檔案。&lt;br /&gt;&lt;br /&gt;more (less) :&lt;br /&gt;　　把 stdin or 檔案內容分成一頁一頁的來看，一般來說， less 比較強一些。&lt;br /&gt;　　可以支援 vi 的語法，但目前 more 也一一支援了。&lt;br /&gt;&lt;br /&gt;以上每個工具都是十分好用的工具。&lt;br /&gt;但我沒有詳細的談，詳細的東西呢，你可以用 man 這個工具來看。&lt;br /&gt;如&lt;br /&gt;man find&lt;br /&gt;然後你就會了解為什麼我只說一下它們的功能了 Smile&lt;br /&gt;&lt;br /&gt;星期二 一月 27, 2004 11:34 am  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;發表 變數 參數&lt;br /&gt;在 bash 中設定變數很容易&lt;br /&gt;不用指定形態&lt;br /&gt;直接指定就可以了&lt;br /&gt;如&lt;br /&gt;myvar="I love linux."&lt;br /&gt;就是指定 myvar 這個變數為 "I love linux." 這個字串&lt;br /&gt;使用這個變數呢，則是用 $myvar 來使用&lt;br /&gt;如&lt;br /&gt;echo $myvar&lt;br /&gt;&lt;br /&gt;如想對 變數做運算，可用 let&lt;br /&gt;let "expression"&lt;br /&gt;&lt;br /&gt;如 let i=i+1&lt;br /&gt;&lt;br /&gt;在 shell script 中，可以在 script 加上參數&lt;br /&gt;而參數會依你所打入的指令依序定義&lt;br /&gt;如有一個script 叫 showme&lt;br /&gt;#!/bin/bash&lt;br /&gt;# filename showme&lt;br /&gt;echo $0&lt;br /&gt;echo $1&lt;br /&gt;echo $2&lt;br /&gt;&lt;br /&gt;執行結果如下&lt;br /&gt;&gt;./showme abc def&lt;br /&gt;./showme&lt;br /&gt;abc&lt;br /&gt;def&lt;br /&gt;&lt;br /&gt;如果要 show出所有參數，可以 $* 表之。&lt;br /&gt;要知道參數數量，可以 $# 表之&lt;br /&gt;$$ 為 script 執行時的 pid&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;--&lt;br /&gt;寫著寫著，有一些東西不清楚，找了一下 man&lt;br /&gt;發現 man 寫得真是清楚極了。&lt;br /&gt;&lt;br /&gt;上 google 查了一下，有一個網頁整理的很好&lt;br /&gt;http://www.fanqiang.com/a4/b1/index_b.html&lt;br /&gt;看來我可以不用寫了 QooQ&lt;br /&gt;&lt;br /&gt;星期二 二月 03, 2004 12:47 am  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;發表 指令代換&lt;br /&gt;在 bash 之中 我們可以用 ` command` 來執行指令，且將其視為一個整體，最後的結果為全部的結果&lt;br /&gt;例如&lt;br /&gt;ls -alF `find -size 0`&lt;br /&gt;就是找出所有 size == 0 的檔案&lt;br /&gt;將之結果當做是 ls -alF 的參數&lt;br /&gt;這個技巧在 shell 之中很常見如&lt;br /&gt;NumberOfFiles=`find | wc -l`&lt;br /&gt;就是把 find | wc -l 這結果指定為 NumberOfFiles 的值&lt;br /&gt;&lt;br /&gt;星期三 二月 04, 2004 10:27 pm  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;發表 判斷式&lt;br /&gt;shell script 是一個完整的語言，當然會有 if else 等等的指令&lt;br /&gt;就讓我們來看看如何使用 bash shell 的 判斷式 吧&lt;br /&gt;&lt;br /&gt;在這裏我是假設大家會使用某種程式語言。&lt;br /&gt;&lt;br /&gt;格式是如下的&lt;br /&gt;&lt;br /&gt;if expression; then&lt;br /&gt;　　list&lt;br /&gt;elif list; then&lt;br /&gt;　　 list&lt;br /&gt;else&lt;br /&gt;　　list&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;這裏的 list 代表是一個或一堆指令的集合。&lt;br /&gt;expression 代表的是一個會有return 值的指令。&lt;br /&gt;&lt;br /&gt;如expression 不為空，或 0 就表示為 true&lt;br /&gt;fi 代表 這個 if 結束了 如同 C 語言的 }&lt;br /&gt;then 就如同 C 語言的 {&lt;br /&gt;&lt;br /&gt;elif 後面的 list 會依序執行，到了最後如不為空，或 0 就為真 也就是再執行後面的 list&lt;br /&gt;&lt;br /&gt;對於 expression 如要寫判斷式 有兩種格式&lt;br /&gt;1. (( expression ))&lt;br /&gt;這個格式等同於 let "expression"&lt;br /&gt;這就是把 expression 內的資料做計算&lt;br /&gt;例如&lt;br /&gt;(( $abc + 1 ))&lt;br /&gt;2. [[ expression ]]&lt;br /&gt;這個格式等是可以比較這個 expression 的兩邊&lt;br /&gt;如&lt;br /&gt;[[ $1 == "abc" ]]&lt;br /&gt;如果相同，就為 1 否則為 0&lt;br /&gt;比較的運算子有 == != ! &amp;&amp;amp; ||&lt;br /&gt;== 是全等&lt;br /&gt;!= 不等&lt;br /&gt;! not 運算子&lt;br /&gt;&amp;&amp;amp; and 運算子&lt;br /&gt;|| or 運算子&lt;br /&gt;如&lt;br /&gt;( (( $# &gt; 3 )) &amp;&amp;amp; [[ $1=="abc" ]] &amp;&amp;amp; ( [[ $2!="def" ]] || ![[ $3=="ghi" ]]) )&lt;br /&gt;&lt;br /&gt;一個例子&lt;br /&gt;if (( $#==0 )) ; then&lt;br /&gt;echo "usage: xxx [xxx | xxxx]"&lt;br /&gt;else&lt;br /&gt;　if ( [[ $1 != "xxx" ]] &amp;&amp;amp; [[ $1 != "xxxx" ]] ) ; then&lt;br /&gt;　　echo "prometer [xxx | xxxx]"&lt;br /&gt;　　exit&lt;br /&gt;　fi&lt;br /&gt;　if [ $1 = "xxx" ]; then&lt;br /&gt;　　....&lt;br /&gt;　else&lt;br /&gt;　　........&lt;br /&gt;　fi&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;星期三 二月 04, 2004 11:00 pm  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;發表 流程控制&lt;br /&gt;在程式之中，for 和 while 讓我們省下了很多的力氣&lt;br /&gt;&lt;br /&gt;在 bash shell 之中 for 和 while 的用法如下&lt;br /&gt;for:&lt;br /&gt;在bash 中 for 的用法有兩種&lt;br /&gt;for name [ in word ] ; do list ; done&lt;br /&gt;for (( expr1 ; expr2 ; expr3 )) ; do list ; done&lt;br /&gt;第一種是從 字串的array 中拿出一個，成為 name (name 為變數)&lt;br /&gt;再進入迴圈中，直到array 中的字拿完為止 (list 為迴圈內容)&lt;br /&gt;&lt;br /&gt;第二種就很像 C 語言了, 第一次跑時，一開始 run expr1&lt;br /&gt;再 check expr2&lt;br /&gt;跑完 list 後 跑 expr3 再跑 expr2&lt;br /&gt;一旦expr2 的結果是 0 or 空 就跳離&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;while:&lt;br /&gt;while 的用法&lt;br /&gt;while list_a ; do list_b; done&lt;br /&gt;當 list_a 的最後一個 command 結果不為 0 或 空之時，就進入迴圈做 list_b&lt;br /&gt;&lt;br /&gt;until:&lt;br /&gt;until list_a; do list_b; done&lt;br /&gt;和 while 相反，當 list_a 的最後一個 command 的結果不為 0 或空時，離開迴圈。&lt;br /&gt;&lt;br /&gt;還有一些東西 如 select case esac 等... 這些東西可以用 if for or while 組合而成，就不再說明了。&lt;br /&gt;&lt;br /&gt;星期四 二月 05, 2004 11:40 pm  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;發表 put all together&lt;br /&gt;說了那麼多，我們開始來寫寫 bash shell script 吧&lt;br /&gt;就拿之前post 過的 chout 為例子好了&lt;br /&gt;&lt;br /&gt;首先，一始開寫 shell script 的人很有可能不知道如何執行 shell script&lt;br /&gt;假設我們有一個 shell script 叫 chout 已經寫好了&lt;br /&gt;我們有兩個方法可以執行它&lt;br /&gt;1. bash chout&lt;br /&gt;這個方法是執行一個 bash ，且叫它讀入 chout 並執行&lt;br /&gt;2. 在 chout 的第一行加入 #!/bin/bash&lt;br /&gt;(告訴你的shell 這個 shell script 指定用 bash)&lt;br /&gt;再 chmod a+x chout&lt;br /&gt;(指定 chout 為一個可執行檔)&lt;br /&gt;之後你就可以把 chout 當一個程式來使用了。&lt;br /&gt;&lt;br /&gt;讓我們來看看這個例子&lt;br /&gt;01 #!/bin/bash&lt;br /&gt;02 if (( $#==1 )) ; then&lt;br /&gt;03　　ares=`find -name '*.c'`&lt;br /&gt;04　　ares="$ares `find -name '*.h'`"&lt;br /&gt;05 else&lt;br /&gt;06 　　ares=`find -name $2`&lt;br /&gt;07 fi&lt;br /&gt;08 for arrs in $ares&lt;br /&gt;09 do&lt;br /&gt;10 　if [ -f $arrs ] &amp;&amp;amp; (( `cat $arrs | grep -i $1 | wc -l` &gt; 0 )); then&lt;br /&gt;11 　　echo "In file $arrs"&lt;br /&gt;12 　　cat $arrs | awk '{print "#"NR"\t"$0}' | grep -i $1&lt;br /&gt;13 　　echo " "&lt;br /&gt;14 　fi&lt;br /&gt;15 done&lt;br /&gt;&lt;br /&gt;01 行告訴我們，這是一個 bash 的程式&lt;br /&gt;02 $# 是變數的數量，也就是 : 若 變數的數量為 1 則做 03 04 否則做 06&lt;br /&gt;03 把 "find -name *.c" 這個指令的結果存在ares 中&lt;br /&gt;04 ares 再加上 find -name *.h 的結果&lt;br /&gt;06 找 名字為第二個參數的檔案，且存成 ares&lt;br /&gt;08 在 ares 中依序抓出一個元素，命之為 arrs ，如抓完了，做 15 行的下一行(沒有了，就是結束了)&lt;br /&gt;09 10~14 是迴圈範圍&lt;br /&gt;10 當 $arrs 是檔案 ( [ ] 是 test 的簡寫 (有興趣請看 man test)) 且 $arrs 有大於一行包涵 第一個參數的話，做 11~13&lt;br /&gt;11 應該不用解釋吧&lt;br /&gt;12 為$arrs 中的內容加上行號，只 show 出有 $1 的行&lt;br /&gt;13 印空白行&lt;br /&gt;&lt;br /&gt;　&lt;br /&gt;以上只是一個小小的 shell script&lt;br /&gt;因為 shell script 不用 compile ，只要隨手改改，隨手寫寫就能用。&lt;br /&gt;不用考慮太多形態的問題，所有程式都是指令。都是 可用的function&lt;br /&gt;所以在使用上很方便，只要多加一點點巧思，就可以用一點點的時間，做出一些很炫的東西。&lt;br /&gt;試著玩玩看吧，保証 linux 功力會大增喔!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4272939767197667332-1060962032472829798?l=linuxocarina.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://csl.csie.fju.edu.tw/phpBB2/viewtopic.php?p=66&amp;sid=5a9909ad8f955648a557c0316b5366e3' title='[舊文] bash shell script 程式設計'/><link rel='replies' type='application/atom+xml' href='http://linuxocarina.blogspot.com/feeds/1060962032472829798/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4272939767197667332&amp;postID=1060962032472829798' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/1060962032472829798'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/1060962032472829798'/><link rel='alternate' type='text/html' href='http://linuxocarina.blogspot.com/2007/06/bash-shell-script.html' title='[舊文] bash shell script 程式設計'/><author><name>Tick</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://lh3.google.com/ticktock35/RxbHkGdUPGI/AAAAAAAAAE0/IFbLByIbaj8/s144/tux_ocarina.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4272939767197667332.post-2053771522630658969</id><published>2007-06-23T09:42:00.002+08:00</published><updated>2009-04-24T03:14:22.871+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c++'/><category scheme='http://www.blogger.com/atom/ns#' term='Selftest'/><category scheme='http://www.blogger.com/atom/ns#' term='0xlab'/><category scheme='http://www.blogger.com/atom/ns#' term='Unit test'/><title type='text'>Self Unit Test Framework</title><content type='html'>&lt;span style="font-size:100%;"&gt;自我測試架構                       &lt;br /&gt;適用語言： OOP language&lt;br /&gt;&lt;br /&gt;相信大家都知道軟體測試的重要，也明白軟體測試有助於開發者及早發現問題。&lt;br /&gt;軟體測試之中有相當多的面向，而今天我要提的，是 Unit Test 這個部分。&lt;br /&gt;&lt;br /&gt;在 OOP 的語言之中，每個元件應該有其一獨特且專一個功能 (如此才能彰顯 OOP 的優勢)&lt;br /&gt;也就是說，在寫 OOP 的案子時，到最後應該會像是在玩樂高一般。把每個元件兜到它應該出現的位置。案子也就成了。&lt;br /&gt;&lt;br /&gt;但，這只是個理想。&lt;br /&gt;&lt;br /&gt;實際作做案子就會知道，程式一定有 bug ，而要如何 debug 就成了每個設計師的惡夢。而debug 中最最另人頭疼的，就是不知道 bug 在那。&lt;br /&gt;Unit Test 就是一個很有效且快速的技術幫助設計師了解且找出問題的所在。&lt;br /&gt;在表面上，做 Unit Test 看起來會多花許多工夫。不過，在案子越來越龐大時， Unit Test 可以快速的指出問題的癥結，也可以讓 PM 更明確的掌握案子的進度。&lt;br /&gt;一般來說，使用 Unit Test 技術可以讓案子穩定的有進展。&lt;br /&gt;&lt;br /&gt;在使用 Unit test 之前要了解幾件事。&lt;br /&gt;1．你的物件是要做什麼的。&lt;br /&gt;2．有那些  boundary 存在？&lt;br /&gt;3．錯誤情況的處理為何？&lt;br /&gt;4．任何你的物件會遇到的極端狀況&lt;br /&gt;&lt;br /&gt;再依上述的認知做以下的 Test&lt;br /&gt;1． 正常的 input 資料是否有正常的 output  (要先知道正確的結果)&lt;br /&gt;2．在 boundary 時資料是否也是正常運作    lower/upper bound 都要做&lt;br /&gt;3．不正常的 input 時，是否能發現，且做出正確的回應？&lt;br /&gt;4．大量被使用時，是否能成功的運作？&lt;br /&gt;&lt;br /&gt;在做測試時，你要用最嚴苛的心去測你的程式。這才是正真對你自己仁慈。&lt;br /&gt;&lt;br /&gt;每個物件都要有一個自己的測試程式，每做一次修改(不管多小的修改)，就要跑一次，並得到一份報告。&lt;br /&gt;&lt;br /&gt;如果物件被整合到其它物件，其它的物件也要做 Unit test&lt;br /&gt;最懶也是最好的方法就是寫支小 script 一次跑完所有的 Tests&lt;br /&gt;(好像很花時間？其實不然，因為它可能會在很短的時間內幫你找出本來可能要花一個月才找出來的 bug)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;以下是小弟寫的 Unit Test FrameWork  (可輕易的改寫成 Java 版的 :-) )&lt;br /&gt;每個要被測試的物件，只要多重繼承  &lt;span style="font-family:monospace;"&gt;&lt;/span&gt;SelfTestUnit&lt;br /&gt;然後實作下面兩個 functions&lt;br /&gt;&lt;/span&gt;&lt;pre&gt;&lt;span style="font-size:100%;"&gt;virtual bool doSelfTest() {return false;};&lt;br /&gt;把你對這個物件的測試寫在裏面，並回報是否測試成功&lt;br /&gt;&lt;br /&gt;virtual const char *myClassName(){return "Please Set ClassName Here";};&lt;br /&gt;指定這個物件的名字 (for report)&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;而在測試程式之中寫:&lt;br /&gt;Capataz cap;&lt;br /&gt;cap.addSelfTester(new 被測試的物件(1));&lt;br /&gt;cap.addSelfTester(new 被測試的物件(2));&lt;br /&gt;cap.addSelfTester(new 被測試的物件(3));&lt;br /&gt;...&lt;br /&gt;cap.doTest();&lt;br /&gt;&lt;br /&gt;就可以了...&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;hr align="center" width="90%"&gt;&lt;br /&gt;File: selftest.h&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#ifndef __TICK_CPP_SELF_TEST_FRAMWORK__&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#define __TICK_CPP_SELF_TEST_FRAMWORK__&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#include &lt;span style="color: rgb(0, 128, 0);"&gt;&amp;lt;vector&amp;gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;class&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;SelfTestUnit&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(32, 64, 160);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: rgb(32, 64, 160);"&gt;virtual&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;bool&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;doSelfTest&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;strong&gt;return&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;false&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: rgb(32, 64, 160);"&gt;virtual&lt;/span&gt; &lt;strong&gt;const&lt;/strong&gt; &lt;strong&gt;char&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;myClassName&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;strong&gt;return&lt;/strong&gt; &lt;span style="color: rgb(0, 128, 0);"&gt;"Please Set ClassName Here"&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;class&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;Capataz&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(32, 64, 160);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;br /&gt;      //&lt;span style="color: rgb(32, 64, 160);"&gt;Capataz&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;strong&gt;char&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;file&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;      //~&lt;span style="color: rgb(32, 64, 160);"&gt;Capataz&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: rgb(32, 64, 160);"&gt;bool&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;addSelfTester&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;SelfTestUnit&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: rgb(32, 64, 160);"&gt;bool&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;addSelfTester&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;SelfTestUnit&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: rgb(32, 64, 160);"&gt;bool&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;delSelfTester&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;SelfTestUnit&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: rgb(32, 64, 160);"&gt;bool&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;delSelfTester&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;SelfTestUnit&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: rgb(32, 64, 160);"&gt;bool&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;doTest&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(32, 64, 160);"&gt;private&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: rgb(32, 64, 160);"&gt;std&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;vector&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;SelfTestUnit&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;_tester&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;      &lt;strong&gt;void&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;testReport&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;SelfTestUnit&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;,&lt;span style="color: rgb(32, 64, 160);"&gt;bool&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;      &lt;strong&gt;void&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;allPassReport&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;bool&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#ifdef SELFPROFILE&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#include &lt;span style="color: rgb(0, 128, 0);"&gt;&amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#include &lt;span style="color: rgb(0, 128, 0);"&gt;&amp;lt;stdlio.h&amp;gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;extern&lt;/strong&gt; &lt;span style="color: rgb(0, 128, 0);"&gt;"C"&lt;/span&gt; &lt;strong&gt;void&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;__cyg_profile_func_enter&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;strong&gt;void&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;func&lt;/span&gt;,&lt;strong&gt;void&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;caller&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;__attribute__&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;__no_instrument_function__&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;extern&lt;/strong&gt; &lt;span style="color: rgb(0, 128, 0);"&gt;"C"&lt;/span&gt; &lt;strong&gt;void&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;__cyg_profile_func_exit&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;strong&gt;void&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;func&lt;/span&gt;,&lt;strong&gt;void&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;caller&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;__attribute__&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;__no_instrument_function__&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#endif //SELFPROFILE&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#endif // __TICK_CPP_SELF_TEST_FRAMWORK__&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;hr align="center" width="90%"&gt;&lt;br /&gt;&lt;br /&gt;File: selftest.cpp&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#include &lt;span style="color: rgb(0, 128, 0);"&gt;&amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#include &lt;span style="color: rgb(0, 128, 0);"&gt;"selftest.h"&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;bool&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;Capataz&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;addSelfTester&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;SelfTestUnit&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;tester&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;  &lt;strong&gt;if&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;tester&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;NULL&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: rgb(32, 64, 160);"&gt;std&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;cout&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: rgb(0, 128, 0);"&gt;"Try to register a NULL pointer"&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;std&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;endl&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;      &lt;strong&gt;return&lt;/strong&gt; &lt;strong&gt;false&lt;/strong&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(32, 64, 160);"&gt;_tester&lt;/span&gt;.&lt;span style="color: rgb(32, 64, 160);"&gt;push_back&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;tester&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;strong&gt;return&lt;/strong&gt; &lt;strong&gt;true&lt;/strong&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;bool&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;Capataz&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;addSelfTester&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;SelfTestUnit&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&amp;amp;&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;tester&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;  &lt;strong&gt;return&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;addSelfTester&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;tester&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;bool&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;Capataz&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;delSelfTester&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;SelfTestUnit&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;tester&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(32, 64, 160);"&gt;std&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;vector&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;SelfTestUnit&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;iterator&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;pos&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;strong&gt;if&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;tester&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;NULL&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: rgb(32, 64, 160);"&gt;std&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;cout&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: rgb(0, 128, 0);"&gt;"Try to remove a NULL pointer"&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;std&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;endl&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;      &lt;strong&gt;return&lt;/strong&gt; &lt;strong&gt;false&lt;/strong&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;  &lt;strong&gt;for&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;pos&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;_tester&lt;/span&gt;.&lt;span style="color: rgb(32, 64, 160);"&gt;begin&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;pos&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;_tester&lt;/span&gt;.&lt;span style="color: rgb(32, 64, 160);"&gt;end&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;pos&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;+&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;+&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;      &lt;strong&gt;if&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;tester&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;pos&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;          &lt;span style="color: rgb(32, 64, 160);"&gt;_tester&lt;/span&gt;.&lt;span style="color: rgb(32, 64, 160);"&gt;erase&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;pos&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;          &lt;strong&gt;return&lt;/strong&gt; &lt;strong&gt;true&lt;/strong&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;  &lt;strong&gt;return&lt;/strong&gt; &lt;strong&gt;false&lt;/strong&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;bool&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;Capataz&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;delSelfTester&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;SelfTestUnit&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&amp;amp;&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;tester&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;  &lt;strong&gt;return&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;delSelfTester&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;tester&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;bool&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;Capataz&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;doTest&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;  &lt;strong&gt;bool&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;allpass&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;strong&gt;true&lt;/strong&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span style="color: rgb(32, 64, 160);"&gt;std&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;vector&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;SelfTestUnit&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;iterator&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;pos&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;strong&gt;if&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;_tester&lt;/span&gt;.&lt;span style="color: rgb(32, 64, 160);"&gt;size&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: rgb(32, 64, 160);"&gt;std&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;cout&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: rgb(0, 128, 0);"&gt;"There are no tester yet!!"&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;std&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;endl&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;      &lt;strong&gt;return&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;allpass&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;strong&gt;bool&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;btmp&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;strong&gt;for&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;pos&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;_tester&lt;/span&gt;.&lt;span style="color: rgb(32, 64, 160);"&gt;begin&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;pos&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;_tester&lt;/span&gt;.&lt;span style="color: rgb(32, 64, 160);"&gt;end&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;pos&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;+&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;+&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: rgb(32, 64, 160);"&gt;std&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;cout&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: rgb(0, 128, 0);"&gt;"Do Testing:"&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;pos&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;myClassName&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;std&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;endl&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: rgb(32, 64, 160);"&gt;btmp&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;pos&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;doSelfTest&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: rgb(32, 64, 160);"&gt;allpass&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;allpass&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;amp;&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;btmp&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: rgb(32, 64, 160);"&gt;testReport&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;pos&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;btmp&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(32, 64, 160);"&gt;allPassReport&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;allpass&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;strong&gt;return&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;allpass&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;Capataz&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;testReport&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;SelfTestUnit&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;stu&lt;/span&gt;, &lt;strong&gt;bool&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;rep&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;  &lt;strong&gt;if&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;rep&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: rgb(32, 64, 160);"&gt;std&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;cout&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: rgb(0, 128, 0);"&gt;"Test Report: "&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;stu&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;myClassName&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: rgb(0, 128, 0);"&gt;"---&amp;gt;OK!!"&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;std&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;endl&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt; &lt;strong&gt;else&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: rgb(32, 64, 160);"&gt;std&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;cout&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: rgb(0, 128, 0);"&gt;"Test Report: "&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;stu&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;myClassName&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: rgb(0, 128, 0);"&gt;"---&amp;gt;Failed!!"&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;std&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;endl&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;Capataz&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;allPassReport&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;strong&gt;bool&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;rep&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(32, 64, 160);"&gt;std&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;cout&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;std&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;endl&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;strong&gt;if&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;rep&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: rgb(32, 64, 160);"&gt;std&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;cout&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: rgb(0, 128, 0);"&gt;"All Passed? Yes"&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;std&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;endl&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt; &lt;strong&gt;else&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: rgb(32, 64, 160);"&gt;std&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;cout&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: rgb(0, 128, 0);"&gt;"All Passed? No"&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;std&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;endl&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4272939767197667332-2053771522630658969?l=linuxocarina.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linuxocarina.blogspot.com/feeds/2053771522630658969/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4272939767197667332&amp;postID=2053771522630658969' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/2053771522630658969'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/2053771522630658969'/><link rel='alternate' type='text/html' href='http://linuxocarina.blogspot.com/2007/06/self-unit-test-framework.html' title='Self Unit Test Framework'/><author><name>Tick</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://lh3.google.com/ticktock35/RxbHkGdUPGI/AAAAAAAAAE0/IFbLByIbaj8/s144/tux_ocarina.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4272939767197667332.post-1344982171634217529</id><published>2007-06-23T04:30:00.000+08:00</published><updated>2008-12-11T14:17:31.124+08:00</updated><title type='text'>[舊文]陶笛 DIY 心得圖</title><content type='html'>因為陶韻的資料不見了，只好把以前的東西搬來這裏 @_@ &lt;br /&gt;慘~ 過去點點滴滴的回憶啊~&lt;br /&gt;&lt;br /&gt;post at:&lt;br /&gt;2005/08/29 17:29&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_uSgEb50CjDE/RnwyW-AAzWI/AAAAAAAAAA4/jDspsRUArD4/s1600-h/ocarina_design.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_uSgEb50CjDE/RnwyW-AAzWI/AAAAAAAAAA4/jDspsRUArD4/s400/ocarina_design.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5078989849948638562" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_uSgEb50CjDE/RnwyXOAAzXI/AAAAAAAAABA/kITmif5U1PA/s1600-h/pins.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_uSgEb50CjDE/RnwyXOAAzXI/AAAAAAAAABA/kITmif5U1PA/s400/pins.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5078989854243605874" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4272939767197667332-1344982171634217529?l=linuxocarina.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linuxocarina.blogspot.com/feeds/1344982171634217529/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4272939767197667332&amp;postID=1344982171634217529' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/1344982171634217529'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/1344982171634217529'/><link rel='alternate' type='text/html' href='http://linuxocarina.blogspot.com/2007/06/diy_22.html' title='[舊文]陶笛 DIY 心得圖'/><author><name>Tick</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://lh3.google.com/ticktock35/RxbHkGdUPGI/AAAAAAAAAE0/IFbLByIbaj8/s144/tux_ocarina.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_uSgEb50CjDE/RnwyW-AAzWI/AAAAAAAAAA4/jDspsRUArD4/s72-c/ocarina_design.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4272939767197667332.post-6623033862150843490</id><published>2007-06-23T04:03:00.000+08:00</published><updated>2007-06-23T20:56:49.656+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='陶韻 DIY'/><title type='text'>[舊文]陶笛DIY 時的想法</title><content type='html'>舊文回 po ，因為陶韻的資料不見了，把它放到這來嘍&lt;br /&gt;&lt;br /&gt;星期一 十月 17, 2005 7:56 pm    文章主題: DIY 時的一些....想法   引言回覆&lt;br /&gt;也許應該放在閒聊板 0_O&lt;br /&gt;&lt;br /&gt;剛剛才用榔頭敲掉了一隻花了很多心血、長得很美的笛子&lt;br /&gt;原因無它，"音色不夠好"，而且又被我修壞掉了&lt;br /&gt;&lt;br /&gt;當決定要把它回收重作之時，內心其實是天人交戰的。&lt;br /&gt;那隻笛子是我彷是誠的外型，做日式十二孔笛。&lt;br /&gt;外型真的很美，可惜內空間沒挖好，又想用調音的調到我想要的調性&lt;br /&gt;調到了，音色也毀了。&lt;br /&gt;&lt;br /&gt;這陣子，作了好幾把笛子，在每把笛子中都灌注了多少的心血，感情。&lt;br /&gt;每當一把笛子第一次發出聲音之時，總是有一種莫名的感動，就好像聽到新生兒第一次啼哭，任何人都會因此而感動…之後慢慢地從單音變成十幾個不全的音，再慢慢的一個音一個音的相對音準慢慢確立。如果幸運的話，它會從黑黑的笛子慢慢變成灰白色…此時它已經能吹奏出許多的曲子。它已經有強烈的個性，有它的優缺點。&lt;br /&gt;出來的不見得是我所預期的個性，不見得是我要的音色，但每一支都讓我收獲不少。對於"陶笛"這樣東西又有更深入的體會，對於每種性質的平衡又有更深的體悟。&lt;br /&gt;&lt;br /&gt;把笛子拿去燒，又是另一次的浴火重生，每當決定安排一次燒笛，總是會在腦海裡幻想燒出來會有什麼樣的花紋，啊~~這到目前我為是沒辦法有效的掌握…也會怕燒壞了…這時的每一隻笛子早就和我有深厚的感情，早就帶給我無窮的歡樂。往往在燒之前，都是以訣別的眼神看著它們，先做好最壞的打算。所以燒成後，總是有一種重生的感覺。&lt;br /&gt;&lt;br /&gt;陶笛 DIY 入門真的不難，只要你有正確的工具，有點耐心，有點幸運，要一隻陶笛嗚嗚叫真的不難。&lt;br /&gt;難，是難在於進階之後。要高音漂亮？低音漂亮？音色乾淨？共鳴好？聲音哄亮？有無氣聲？音是不是夠準？每個音的氣量是否平均？是否好演奏？外型好不好看？……&lt;br /&gt;&lt;br /&gt;時至今日，學作陶笛大約半年的時日，回想起剛開始做陶笛之時，才做了幾把，就以為可以做出很好的笛子，深深覺得好笑&lt;br /&gt;&lt;br /&gt;手下那把破碎不堪的土笛，在幾個月前，我可能會把它封成 "演奏級" 的笛子，而現在卻是期待它的轉生。&lt;br /&gt;&lt;br /&gt;陶土就是這麼可愛，當你不滿意時，總是個可以再來一次 ^.^&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4272939767197667332-6623033862150843490?l=linuxocarina.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linuxocarina.blogspot.com/feeds/6623033862150843490/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4272939767197667332&amp;postID=6623033862150843490' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/6623033862150843490'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4272939767197667332/posts/default/6623033862150843490'/><link rel='alternate' type='text/html' href='http://linuxocarina.blogspot.com/2007/06/diy.html' title='[舊文]陶笛DIY 時的想法'/><author><name>Tick</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://lh3.google.com/ticktock35/RxbHkGdUPGI/AAAAAAAAAE0/IFbLByIbaj8/s144/tux_ocarina.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4272939767197667332.post-6628613252738294192</id><published>2007-06-11T21:38:00.000+08:00</published><updated>2008-12-11T14:17:31.310+08:00</updated><title type='text'>Linux kerne
