<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:wfw="http://wellformedweb.org/CommentAPI/">
  <channel>
    <title><![CDATA[Q.yuhen]]></title> 
    <link>http://www.rainsts.net/</link> 
    <description><![CDATA[秋雨漏更夜，琴音动心痕。RainTrail Studio.China 2000-2009]]></description> 
    <language>zh-cn</language> 
    <copyright><![CDATA[Copyright 2010, Q.yuhen]]></copyright> 
    <webMaster><![CDATA[qyuhen@hotmail.com (Q.yuhen)]]></webMaster> 
    <generator>LBS v2.0.313</generator> 
    <pubDate>Sun, 14 Mar 2010 11:26:41 +0800</pubDate> 
    <ttl>60</ttl>
  
    <item>
      <title><![CDATA[libconfig - Configuration File Library]]></title> 
      <link><![CDATA[http://www.rainsts.net/article.asp?id=960]]></link> 
      <category><![CDATA[ASM C/C++]]></category> 
      <author><![CDATA[yuhen <null@null.com>]]></author> 
      <pubDate>Sat, 13 Mar 2010 21:39:14 +0800</pubDate> 
      <description><![CDATA[配置文件很重要，INI 太弱，XML 太繁复，Linux *.conf 很酷。<br /><br />找了好几种相关的类库，发觉还是 <a href="http://www.hyperrealm.com/main.php?s=libconfig" title="http://www.hyperrealm.com/main.php?s=libconfig" target="_blank">hyperrealm libconfig</a> 最强大最好用，相关细节可参考 <a href="http://www.hyperrealm.com/libconfig/libconfig_manual.html" title="http://www.hyperrealm.com/libconfig/libconfig_manual.html" target="_blank">官方手册</a>。<br /><br />源中的版本是 1.3.2-1，也可以去官方文章下载最新版本。<br /><div class="code">$ sudo apt-get install libconfig8 libconfig8-dev</div><br />完全类脚本化的配置语法，支持注释、包含、简单配置、数组、列表以及非常像类的组。<br /><br />test.conf<div class="code"># Example </div>]]></description>
      <wfw:commentRss><![CDATA[http://www.rainsts.net/feed.asp?q=comment&id=960]]></wfw:commentRss>
    </item>
      
    <item>
      <title><![CDATA[分析 &quot;静态存储区操作分析&quot;]]></title> 
      <link><![CDATA[http://www.rainsts.net/article.asp?id=959]]></link> 
      <category><![CDATA[ASM C/C++]]></category> 
      <author><![CDATA[yuhen <null@null.com>]]></author> 
      <pubDate>Sat, 13 Mar 2010 16:48:19 +0800</pubDate> 
      <description><![CDATA[今天从 ChinaUnix 上看到的一个帖子，感觉有点意思，做个简单的分析。<br /><br /><a href="http://bbs.chinaunix.net/viewthread.php?tid=1674163&amp;extra=page%3D1%26amp%3Bfilter%3Dtype%26amp%3Btypeid%3D133" title="http://bbs.chinaunix.net/viewthread.php?tid=1674163&amp;extra=page%3D1%26amp%3Bfilter%3Dtype%26amp%3Btypeid%3D133" target="_blank">原帖</a> 内容如下:<br /><br />写一个小程序时，偷懒使用了静态字符数组，但是对于程序执行结果却想不太明白，大家帮忙分析一下：<br /><div class="code">#include &lt;stdio.h&gt;<br />#include &lt;string.h&gt;<br /><br />char * form_string (int c)<br />{<br />&nbsp;&nbsp;static char buf[64];<br />&nbsp;&nbsp;memset (buf, 0, sizeof (buf));<br />&nbsp;&nbsp;snprintf (buf, sizeof (buf), &quot;%d&quot;, c);</div>]]></description>
      <wfw:commentRss><![CDATA[http://www.rainsts.net/feed.asp?q=comment&id=959]]></wfw:commentRss>
    </item>
      
    <item>
      <title><![CDATA[libmm - Shared Memory library]]></title> 
      <link><![CDATA[http://www.rainsts.net/article.asp?id=958]]></link> 
      <category><![CDATA[ASM C/C++]]></category> 
      <author><![CDATA[yuhen <null@null.com>]]></author> 
      <pubDate>Fri, 12 Mar 2010 20:34:38 +0800</pubDate> 
      <description><![CDATA[本文的 Share Memory 又可称为 Memory Pool，就是在匿名内存映射区(mmap) 预先划出一大块内存，以后的分配操作都可以在这块内存内部进行，包括 malloc、calloc、free 等等。Memory Pool 的好处是不在堆(Heap)和栈(CallStack)上分配，可以重复使用，避免多次向内核请求分配和释放内存，一定程度上提高了性能。另外只需释放整个 Pool 即可完成所有的内存释放，避免内存泄露的发生。<br /><br />安装 libmm 库:<div class="code">$ sudo apt-get libmm14 libmm-dev libmm-dbg</div><br />头文件: /usr/include/mm.h<div class="code">/* Standard Malloc-Style API */<br />MM     *mm_create(size_t, const char *);</div>]]></description>
      <wfw:commentRss><![CDATA[http://www.rainsts.net/feed.asp?q=comment&id=958]]></wfw:commentRss>
    </item>
      
    <item>
      <title><![CDATA[GCC 常用参数]]></title> 
      <link><![CDATA[http://www.rainsts.net/article.asp?id=957]]></link> 
      <category><![CDATA[ASM C/C++]]></category> 
      <author><![CDATA[yuhen <null@null.com>]]></author> 
      <pubDate>Fri, 12 Mar 2010 14:37:49 +0800</pubDate> 
      <description><![CDATA[<b>1. 预处理</b><br /><br />输出预处理结果到文件。<br /><div class="code">$ gcc -E main.c -o main.i</div><br />保留文件头注释。<br /><div class="code">$ gcc -C -E main.c -o main.i</div><br />参数 -Dname 定义宏(源文件中不能定义该宏)，-Uname 取消 GCC 设置中定义的宏。<br /><div class="code">$ tail -n 10 main.c<br />int main(int argc, char* argv[])<br />{<br />&nbsp;&nbsp;#if __MY__<br />&nbsp;&nbsp;printf(&quot;a&quot;);<br />&nbsp;&nbsp;#else<br />&nbsp;&nbsp;printf(&quot;b&quot;);<br />&nbsp;&nbsp;#endif<br />&nbsp;return EXIT_SUCCESS;<br />}<br /><br />$ gcc -E main.c -D__MY__ | tail -n 10<br /><br />int main(int argc, char* argv[])<br />{<br />&nbsp;&nbsp;printf(&quot;a&quot;);<br />&nbsp;&nbsp;return 0;</div>]]></description>
      <wfw:commentRss><![CDATA[http://www.rainsts.net/feed.asp?q=comment&id=957]]></wfw:commentRss>
    </item>
      
    <item>
      <title><![CDATA[Dynamic Linking Loader]]></title> 
      <link><![CDATA[http://www.rainsts.net/article.asp?id=956]]></link> 
      <category><![CDATA[ASM C/C++]]></category> 
      <author><![CDATA[yuhen <null@null.com>]]></author> 
      <pubDate>Fri, 12 Mar 2010 00:33:37 +0800</pubDate> 
      <description><![CDATA[在运行时动态载入库(.so)，并调用其中的函数。<br /><br /><b>1. 动态库</b><br /><br />我们调用的目标函数就是 testfunc() 。<br /><br />mylib.c<div class="code">#include &lt;stdio.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;string.h&gt;<br /><br />void testfunc(const char* s, int x)<br />{<br />&nbsp;&nbsp;printf(&quot;testfunc call.\n&quot;);<br />&nbsp;&nbsp;printf(&quot;%s, %d\n&quot;, s, x);<br />}</div><br />编译成动态库。<br /><div class="code">$ gcc -fPIC -shared -o libmy.so mylib.c<br /><br />$ nm libmy.so<br /><br />... ...<br />000004ac T testfunc</div><br />符号表中包含了目标函数名称。<br /><br /><b>2. 调用</b><br /><br />]]></description>
      <wfw:commentRss><![CDATA[http://www.rainsts.net/feed.asp?q=comment&id=956]]></wfw:commentRss>
    </item>
      
    <item>
      <title><![CDATA[8086 寻址方式]]></title> 
      <link><![CDATA[http://www.rainsts.net/article.asp?id=955]]></link> 
      <category><![CDATA[ASM C/C++]]></category> 
      <author><![CDATA[yuhen <null@null.com>]]></author> 
      <pubDate>Thu, 11 Mar 2010 14:10:25 +0800</pubDate> 
      <description><![CDATA[<b>1. 立即寻址方式</b><br /><br />直接将操作数存放在指令中。该操作数是为常数，通常用来初始化寄存器。<br /><div class="code">-a<br />1396:0100 mov ax, 1234<br />1396:0103<br /><br />-t<br />AX=1234  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000<br />DS=1396  ES=1396  SS=1396  CS=1396  IP=0103   NV UP EI PL NZ NA PO NC<br />1396:0103 0000          ADD     [BX+SI],AL                         DS:0000=CD</div><br /><b>2. 寄存器寻址方式</b><br /><br />操作数存放于寄存器中，通过寄存器名完成操作。<br /><div class="code">-a 100<br />1396:0100 mov ax, 5555</div>]]></description>
      <wfw:commentRss><![CDATA[http://www.rainsts.net/feed.asp?q=comment&id=955]]></wfw:commentRss>
    </item>
      
    <item>
      <title><![CDATA[Python Library: DataStruct]]></title> 
      <link><![CDATA[http://www.rainsts.net/article.asp?id=954]]></link> 
      <category><![CDATA[Dynamic Language]]></category> 
      <author><![CDATA[yuhen <null@null.com>]]></author> 
      <pubDate>Wed, 10 Mar 2010 21:03:35 +0800</pubDate> 
      <description><![CDATA[Python 标准库里提供了很多稀奇古怪的数据类型，摘录几个看着正常且常用的试试。<br /><br /><b>1. Array</b><br /><br />和 list 很像，但仅能保存同一类型的的数据，更接近传统数组 (C# Array)。<br /><div class="code">&gt;&gt;&gt; from array import array<br /><br />&gt;&gt;&gt; a = array(&#39;i&#39;, range(10))<br />&gt;&gt;&gt; a<br />array(&#39;i&#39;, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9])<br /><br />&gt;&gt;&gt; a[3]<br />3<br />&gt;&gt;&gt; a[3] = 99<br />&gt;&gt;&gt; a<br />array(&#39;i&#39;, [0, 1, 2, 99, 4, 5, 6, 7, 8, 9])<br /><br />&gt;&gt;&gt; a.insert(2, 100)<br />&gt;&gt;&gt; a<br />array(&#39;i&#39;, [0, 1, 100, 2, 99, 4, 5, 6, 7, 8, 9])</div><br />类型代码: &#91;list]&#91;/list]]]></description>
      <wfw:commentRss><![CDATA[http://www.rainsts.net/feed.asp?q=comment&id=954]]></wfw:commentRss>
    </item>
      
    <item>
      <title><![CDATA[Python Library: Serialize]]></title> 
      <link><![CDATA[http://www.rainsts.net/article.asp?id=953]]></link> 
      <category><![CDATA[Dynamic Language]]></category> 
      <author><![CDATA[yuhen <null@null.com>]]></author> 
      <pubDate>Wed, 10 Mar 2010 16:31:52 +0800</pubDate> 
      <description><![CDATA[利用 marshal 模块，我们可以对一些内置类型对象进行序列化操作。marshal 序列化结果是专用格式但与平台无关。<br /><div class="code">Only None, integers, long integers, floats, complex numbers, strings, Unicode strings, tuples, lists, dictionaries, and code objects are supported. Lists, tuples, and<br />dictionaries can only contain supported objects. Class instances and recursive references in lists, tuples, and dictionaries are not supported.</div><br />序列化成字节数组。<br />&#91;code]&#91;/code]]]></description>
      <wfw:commentRss><![CDATA[http://www.rainsts.net/feed.asp?q=comment&id=953]]></wfw:commentRss>
    </item>
      
    <item>
      <title><![CDATA[Python Library: Inspect]]></title> 
      <link><![CDATA[http://www.rainsts.net/article.asp?id=952]]></link> 
      <category><![CDATA[Dynamic Language]]></category> 
      <author><![CDATA[yuhen <null@null.com>]]></author> 
      <pubDate>Wed, 10 Mar 2010 15:37:15 +0800</pubDate> 
      <description><![CDATA[Module inspect 有点 System.Diagnostics 和 System.Reflection 的意思。<br /><br /><b>1. StackFrame</b><br /><br />获取当前栈帧<br /><div class="code">#!/usr/bin/env python<br /># -*- coding: utf-8 -*-<br /><br />import inspect<br /><br />def test():<br />&nbsp;&nbsp;f = inspect.currentframe()<br />&nbsp;&nbsp;t = inspect.getframeinfo(f)<br />&nbsp;&nbsp;print t<br /><br />test()<br /><br />&gt;&gt;&gt; <br />Traceback(filename=&#39;D:\\Python\\main.py&#39;, lineno=8, function=&#39;test&#39;, code_context=[&#39;    t = inspect.getframeinfo(f)\n&#39;], index=0)</div><br />获取指定栈帧<br /><div class="code">#!/usr/bin/env python</div>]]></description>
      <wfw:commentRss><![CDATA[http://www.rainsts.net/feed.asp?q=comment&id=952]]></wfw:commentRss>
    </item>
      
    <item>
      <title><![CDATA[Python Library: Exec &amp; Compile]]></title> 
      <link><![CDATA[http://www.rainsts.net/article.asp?id=951]]></link> 
      <category><![CDATA[Dynamic Language]]></category> 
      <author><![CDATA[yuhen <null@null.com>]]></author> 
      <pubDate>Wed, 10 Mar 2010 10:31:00 +0800</pubDate> 
      <description><![CDATA[直接运行代码字符串也是动态语言的一个重要特征。虽然在 .NET/C# 里也可通过 CodeDom 实现类似的功能，但远没 Python 这么方便自由。<br /><div class="code">&gt;&gt;&gt; code = &quot;&quot;&quot;<br />def test(s):<br />&nbsp;&nbsp;print &quot;test:&quot;, s<br /><br />a = 123<br />&quot;&quot;&quot;<br />&gt;&gt;&gt; exec code<br /><br />&gt;&gt;&gt; a<br />123<br /><br />&gt;&gt;&gt; test(&quot;abc&quot;)<br />test: abc</div><br />内置函数里还有 eval() 和 execfile() 都是用来做类似事情的。exec 关键字执行多行代码片段，eval() 函数通常用来执行一条包含返回值的表达式，而 execfile 自然是用来执行源码文件了。<br /><div class="code">&gt;&gt;&gt; a = 10<br /><br />&gt;&gt;&gt; x = eval(&quot;a + 3&quot;)<br /><br />&gt;&gt;&gt; x<br />13</div><br />eval() 和 execfile() ]]></description>
      <wfw:commentRss><![CDATA[http://www.rainsts.net/feed.asp?q=comment&id=951]]></wfw:commentRss>
    </item>
      
  </channel>
</rss>
