<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">
 
 <title>清风のBlog</title>
 
 <link href="http://qingfeng.github.com/" />
 <updated>2009-09-15T09:55:59-07:00</updated>
 <id>http://qingfeng.github.com/</id>
 <author>
   <name>Tom Preston-Werner</name>
   <email>qingfeng AT me.com</email>
 </author>
 
 
 <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/qingfeng" /><feedburner:info uri="qingfeng" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:browserFriendly>This is an XML content feed. It is intended to be viewed in a newsreader or syndicated to another site, subject to copyright and fair use.</feedburner:browserFriendly><entry>
   <title>Crack Apple TV</title>
   <link href="http://qingfeng.github.com/2009/09/15/Crack-Apple-TV/" />
   <updated>2009-09-15T00:00:00-07:00</updated>
   <id>http://tom.preston-werner.com/2009/09/15/Crack-Apple-TV</id>
   <content type="html">
这几天拿到 @ai829 的 Apple TV,尝试破解了一下,记录一下这次的破解历程&lt;br&gt;

&lt;ul&gt;
    &lt;li&gt;事前准备:AppleTV一台,U盘一个,网线一根&lt;/li&gt;
    &lt;li&gt;先升级固件到2.4.0&lt;/li&gt;
    &lt;li&gt;下载2.4.0的dmg为一会制作破解U盘作准备
        &lt;p&gt;http://mesu.apple.com/data/OS/061-6242.20090624.Aq20P/2Z694-5660-029.dmg&lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;下载atvusb-creator (atvusb-creator-1.0.b10.zip)
        &lt;p&gt;http://code.google.com/p/atvusb-creator/downloads/list&lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;插入事先准备好的U盘,运行atv-creator,出现如下界面&lt;br&gt;
        &lt;img src="http://atvusb-creator.googlecode.com/svn/branches/wiki-images/atvusb-creator.png"/&gt;
        &lt;ul&gt;
            &lt;li&gt;选择ssh-tools&lt;/li&gt;
            &lt;li&gt;Choose a DMG,选择之前下载的2.4.0的dmg文件&lt;/li&gt;
        &lt;/ul&gt;
        然后点击Create Using -&gt; 这个选项,一个破解U盘就制作好了
    &lt;/li&gt;
    &lt;li&gt;
        &lt;p&gt;
        把做好的U盘插入到AppleTV上,然后用网线把AppleTV和交换机连接,启动AppleTV.启动后会看到破解的过程,破解完成后,会在你的AppleTV上启动一个SSH服务
        &lt;ul&gt;
            &lt;li&gt;host: appletv.local&lt;/li&gt;
            &lt;li&gt;user: frontrow&lt;/li&gt;
            &lt;li&gt;password: frontrow&lt;/li&gt;
        &lt;/ul&gt;
        然后拔掉U盘,拔电,重启你的AppleTV
        &lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;
        然后用scp命令,把你的影片放到appletv的Movies目录即可,例如:&lt;br/&gt;
        scp xxx.avi frontrow@appletv.local:~/Movies/
    &lt;/li&gt;
&lt;/ul&gt;</content>
 </entry>
 
 <entry>
   <title>The Elements of Programming Style</title>
   <link href="http://qingfeng.github.com/2009/08/08/The-Elements-of-Programming-Style/" />
   <updated>2009-08-08T00:00:00-07:00</updated>
   <id>http://tom.preston-werner.com/2009/08/08/The-Elements-of-Programming-Style</id>
   <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;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;
只要你能保证程序的可读性，能不用 goto 就别用 。&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;
不要因为一个 bug 而停止不前。&lt;br&gt;
打开编译程序的调试选项。&lt;br&gt;
常量结构用数据声明初始化，变量结构用执行代码初始化。&lt;br&gt;
小心 off-by-one 错误。&lt;br&gt;
当循环中有多个跳出点时要小心。&lt;br&gt;
如果什么都不做，那么也要优雅的表现出这个意思。&lt;br&gt;
用边界值测试程序。&lt;br&gt;
手工检查一些答案。&lt;br&gt;
防御式编程 - 为不可能的情况写几句代码。&lt;br&gt;
10.0 乘 0.1 很难保证永远是 1.0 。&lt;br&gt;
7/8 等于 0 ，而 7.0/8.0 不等于 0 。&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;

</content>
 </entry>
 
 <entry>
   <title>Tokyo Cabinet的Abstract Database API</title>
   <link href="http://qingfeng.github.com/2009/08/06/TokyoCabinet-Abstract-Database-API/" />
   <updated>2009-08-06T00:00:00-07:00</updated>
   <id>http://tom.preston-werner.com/2009/08/06/TokyoCabinet-Abstract-Database-API</id>
   <content type="html">
&lt;h4&gt;简介&lt;/h4&gt;
&lt;div class="dl50"&gt;
抽象データベースは、オンメモリハッシュデータベースとオンメモリツリーデータベースとハッシュデータベースとB+木データベースと固定長データベースとテーブルデータベースを同一のAPIで抽象化したデータベースです。それを扱うのが抽象データベースAPIです。`tcadb.h' にAPIの仕様の完全な記述があります。
&lt;/div&gt;

&lt;div class="dl50"&gt;
&lt;h4&gt;Tokyo Cabinet的数据结构分为&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;1.Hash结构&lt;/li&gt;
&lt;li&gt;2.B+Tree&lt;/li&gt;
&lt;li&gt;3.定长数据库&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;但无论哪种数据结构,最后都会抽象为以下操作,以及分别对应不同的API&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;put&lt;/li&gt;
Hash: bool tchdbput2(TCHDB *hdb, const char *kstr, const char *vstr);&lt;br&gt;
B+Tree: bool tcbdbput2(TCBDB *bdb, const char *kstr, const char *vstr);&lt;br&gt;
Table: bool tctdbput3(TCTDB *tdb, const char *pkstr, const char *cstr);&lt;br&gt;
&lt;li&gt;get&lt;/li&gt;
Hash: char *tchdbget2(TCHDB *hdb, const char *kstr);&lt;br&gt;
B+Tree: char *tcbdbget2(TCBDB *bdb, const char *kstr);&lt;br&gt;
Table: char *tctdbget3(TCTDB *tdb, const char *pkstr);&lt;br&gt;
&lt;/ul&gt;

这样,就为开发相应的接口,增加了不少复杂度,需要针对不同的数据结构,去调用不同的API,但Abstract Database API有效减少了这个麻烦,看下面的代码
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="n"&gt;TCADB&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;adb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tcadbnew&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;tcadbopen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;adb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dbname&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;fprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stderr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;open error: %s&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dbname&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;tcadbput2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;adb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;tcadbclose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;adb&lt;/span&gt;&lt;span class="p"&gt;)){&lt;/span&gt;
    &lt;span class="n"&gt;fprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stderr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;close error:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;tcadbdel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;adb&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
一个tcadbput2,就可以代替所有的put方法了,adb是通过判断所操作数据库的扩展名,来决定调用哪种数据库的API,扩展名对应如下:
&lt;ul&gt;
&lt;li&gt;Hash: .tch&lt;/li&gt;
&lt;li&gt;B+Tree: .tcb&lt;/li&gt;
&lt;li&gt;定长数据库: .tcf&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;特殊API的调用&lt;/h4&gt;
在特殊情况下,不同的数据结构,又提供了一些自己独有的API,例如B+Tree,可以添加重复的key,这时就需要用到tcbdbputdup2方法,用adb如何调用呢,看代码
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="n"&gt;TCADB&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;adb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tcadbnew&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;tcadbopen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;adb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dbname&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;fprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stderr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;open error: %s&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dbname&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;tcbdbputdup2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;adb&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;bdb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;tcadbclose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;adb&lt;/span&gt;&lt;span class="p"&gt;)){&lt;/span&gt;
    &lt;span class="n"&gt;fprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stderr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;close error:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;tcadbdel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;adb&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
通过adb-&gt;bdb就可以指定现在的抽象数据库为一个B+Tree数据库,其他数据库的获取方式如下:&lt;br&gt;
&lt;ul&gt;
&lt;li&gt;Hash: adb-&gt;hdb&lt;/li&gt;
&lt;li&gt;B+Tree: adb-&gt;bdb&lt;/li&gt;
&lt;li&gt;定长数据库: adb-&gt;fdb&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;



</content>
 </entry>
 
 <entry>
   <title>尝试编写Python的C扩展</title>
   <link href="http://qingfeng.github.com/2009/07/01/python-ext1/" />
   <updated>2009-07-01T00:00:00-07:00</updated>
   <id>http://tom.preston-werner.com/2009/07/01/python-ext1</id>
   <content type="html">
&lt;h4&gt;一个加法方法示例&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;my&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;my&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="mf"&gt;3&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;

&lt;h4&gt;实现代码&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="cp"&gt;#include &amp;quot;Python.h&amp;quot;&lt;/span&gt;
&lt;span class="cp"&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;/span&gt;
&lt;span class="cp"&gt;#include &amp;lt;stdbool.h&amp;gt;&lt;/span&gt;
&lt;span class="cp"&gt;#include &amp;lt;stdint.h&amp;gt;&lt;/span&gt;

&lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;PyObject&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PyObject&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;PyObject&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
    &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;PyArg_ParseTuple&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;ii&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Py_BuildValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;i&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;PyMethodDef&lt;/span&gt; &lt;span class="n"&gt;methods&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;add&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;METH_VARARGS&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;initpycabinet&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
    &lt;span class="n"&gt;PyObject&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Py_InitModule&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;my&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;methods&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;

</content>
 </entry>
 
 
</feed>

