<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet href='http://feed.feedsky.com/styles/feedsky1.xsl' type='text/xsl' ?><!--这是一个由Feedsy提供技术支持的Feed，为了提高读者阅读的体验，以及满足用户美化自己Feed的需要，我们设计了多种精美的Feed模板，提供给大家选择，所有最终呈现出来的样式，皆由用户自愿选择使用，未经许可，任何团体和个人，请不要擅自修改样式或者盗用，这是对于用户选择权的尊重。--><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:fs="http://www.feedsky.com/namespace/feed" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link href="http://feed.feedsky.com/tuzei" type="application/rss+xml" rel="self"></atom:link><fs:self_link href="http://feed.feedsky.com/tuzei" type="application/rss+xml"></fs:self_link><lastBuildDate>Thu, 29 Dec 2011 13:27:15 GMT</lastBuildDate><title>土贼</title><description>关注互联网生活</description><image><url>http://www.feedsky.com/images/feedsky_logologo.gif</url><title>土贼</title><link>http://tuzei.net</link></image><link>http://tuzei.net</link><sy:updatePeriod>hourly</sy:updatePeriod><sy:updateFrequency>1</sy:updateFrequency><language>en</language><pubDate>Thu, 29 Dec 2011 13:29:35 GMT</pubDate><item><title>Linux 的 I2C 总线驱动模型</title><link>http://tuzei.net/2011/12/29/linux-%e7%9a%84-i2c-%e6%80%bb%e7%ba%bf%e9%a9%b1%e5%8a%a8%e6%a8%a1%e5%9e%8b/</link><content:encoded>&lt;p&gt;&lt;strong&gt;Linux 的I2C 总线驱动架构&lt;/strong&gt;&lt;br /&gt;
Bus Driver vs. Device Driver&lt;br /&gt;
Linux 中I2C 驱动分为两个部分，总线（BUS）和设备（DEVICE）。我把他们分别比喻为铁路和列车，相当的贴切啊！&lt;br /&gt;
1. 总线驱动&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;总线驱动是为系统中每个I2C 总线增加相应的读写方法，也包括I2C总线控制器的初始化等，但是总线驱动只提供读写函数，本身不会进行任何的通讯，因为它并不知道设备是否真正存在。这样设计也是为了减小SOC芯片驱动和外围设备驱动的耦合性。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;1.2. 设备驱动&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;设备驱动则是与挂在I2C 总线上的具体的设备通讯的驱动。通过I2C总线驱动提供的函数，不同SOC的I2C总线控制器的差异对设备驱动透明。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;在系统开机时，首先装载的是I2C总线驱动。一个总线驱动用于支持一条特定的I2C总线的读写。一个总线驱动通常需要两个模块，一个struct i2c_adapter 和一个struct i2c_algorithm 来描述。&lt;br /&gt;
&lt;a href=&quot;http://www.embexperts.com/viewthread.php?tid=68&quot;&gt;via&lt;/a&gt;&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/591567330/tuzei/feedsky/s.gif?r=http://tuzei.net/2011/12/29/linux-%e7%9a%84-i2c-%e6%80%bb%e7%ba%bf%e9%a9%b1%e5%8a%a8%e6%a8%a1%e5%9e%8b/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://tuzei.net/2011/12/29/linux-%e7%9a%84-i2c-%e6%80%bb%e7%ba%bf%e9%a9%b1%e5%8a%a8%e6%a8%a1%e5%9e%8b/feed/</wfw:commentRss><slash:comments>0</slash:comments><description>Linux 的I2C 总线驱动架构 Bus Driver vs. Device Driver Linux 中I2C 驱动分为两个部分，总线（BUS）和设备（DEVICE）。我把他们分别比喻为铁路和列车，相当的贴切啊！ 1. 总线驱动 总线驱动是为系统中每个I2C 总线增加相应的读写方法，也包括I2C总线控制器的初始化等，但是总线驱动只提供读写函数，本身不会进行任何的通讯，因为它并不知道设备是否真正存在。这样设计也是为了减小SOC芯片驱动和外围设备驱动的耦合性。 1.2. 设备驱动 设备驱动则是与挂在I2C 总线上的具体的设备通讯的驱动。通过I2C总线驱动提供的函数，不同SOC的I2C总线控制器的差异对设备驱动透明。 在系统开机时，首先装载的是I2C总线驱动。一个总线驱动用于支持一条特定的I2C总线的读写。一个总线驱动通常需要两个模块，一个struct i2c_adapter 和一个struct i2c_algorithm 来描述。 via&lt;img src=&quot;http://www1.feedsky.com/t1/591567330/tuzei/feedsky/s.gif?r=http://tuzei.net/2011/12/29/linux-%e7%9a%84-i2c-%e6%80%bb%e7%ba%bf%e9%a9%b1%e5%8a%a8%e6%a8%a1%e5%9e%8b/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>网摘 | 转载</category><pubDate>Thu, 29 Dec 2011 21:27:15 +0800</pubDate><author>jaykenduke</author><comments>http://tuzei.net/2011/12/29/linux-%e7%9a%84-i2c-%e6%80%bb%e7%ba%bf%e9%a9%b1%e5%8a%a8%e6%a8%a1%e5%9e%8b/#comments</comments><guid isPermaLink="false">http://tuzei.net/?p=742</guid><dc:creator>jaykenduke</dc:creator><fs:srclink>http://tuzei.net/2011/12/29/linux-%e7%9a%84-i2c-%e6%80%bb%e7%ba%bf%e9%a9%b1%e5%8a%a8%e6%a8%a1%e5%9e%8b/</fs:srclink><fs:srcfeed>http://tuzei.net/feed</fs:srcfeed><fs:itemid>feedsky/tuzei/~7195689/591567330/5276527</fs:itemid></item><item><title>Compiling directly into a kernel vs. modules</title><link>http://tuzei.net/2011/12/10/compiling-directly-into-a-kernel-vs-modules/</link><content:encoded>&lt;p&gt;You have two options for adding functionality to the kernel: building functions into the kernel (making a monolithic kernel) or adding them as modules.&lt;/p&gt;
&lt;p&gt;Monolithic kernels:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Building a function into the kernel directly ensures that that function will be available at all times. The downside is that it makes your kernel bigger, increasing boot time, and ultimately using that much more memory to hold the kernel. If you are compiling a kernel to fit on a floppy so that you can boot Linux off a rescue floppy, space will become an issue.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Modules:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Building a function as a module allows that function to be loaded into memory as needed and unloaded when it is no longer needed. This helps keep your kernel small. It is very useful if, say, you are swapping hardware in and out of your system frequently. You could compile support for a variety of, say, sound cards as modules, and your Linux system will theoretically only load the driver that is appropriate for the hardware setup at the time.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Another benefit of building functions as modules is that parameters can be passed to the modules which can be useful in debugging your system if problems occur.&lt;/p&gt;
&lt;p&gt;There are some considerations to be made when deciding if a kernel function should be modularized. A small performance penalty is paid as it takes a little time to get the module loaded and unloaded. There are some functions that are needed at boot time and these cannot be compiled as modules &amp;#8212; they need to be present in the kernel so your system can be loaded. For example, ext2/ext3/reiserfs file system support needs to be built into the kernel so that your partitions can be read, as you need to be able to read the filesystem to load modules. In my case, if I have PCMCIA support built into the kernel, then metworking works. If PCMCIA support is modularized, networking fails to start, probably because the PCMCIA support needs to be available very early in the boot process to set up networking.&lt;br /&gt;
via &lt;a href=&quot;http://forums.gentoo.org/viewtopic.php?t=58790&quot;&gt;Gentoo Forums&lt;/a&gt;&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/591567331/tuzei/feedsky/s.gif?r=http://tuzei.net/2011/12/10/compiling-directly-into-a-kernel-vs-modules/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://tuzei.net/2011/12/10/compiling-directly-into-a-kernel-vs-modules/feed/</wfw:commentRss><slash:comments>0</slash:comments><description>You have two options for adding functionality to the kernel: building functions into the kernel (making a monolithic kernel) or adding them as modules. Monolithic kernels: Building a function into the kernel directly ensures that that function will be available at all times. The downside is that it makes your kernel bigger, increasing boot time, [...]&lt;img src=&quot;http://www1.feedsky.com/t1/591567331/tuzei/feedsky/s.gif?r=http://tuzei.net/2011/12/10/compiling-directly-into-a-kernel-vs-modules/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>网摘 | 转载</category><pubDate>Sat, 10 Dec 2011 23:57:27 +0800</pubDate><author>jaykenduke</author><comments>http://tuzei.net/2011/12/10/compiling-directly-into-a-kernel-vs-modules/#comments</comments><guid isPermaLink="false">http://tuzei.net/?p=740</guid><dc:creator>jaykenduke</dc:creator><fs:srclink>http://tuzei.net/2011/12/10/compiling-directly-into-a-kernel-vs-modules/</fs:srclink><fs:srcfeed>http://tuzei.net/feed</fs:srcfeed><fs:itemid>feedsky/tuzei/~7195689/591567331/5276527</fs:itemid></item><item><title>以太网卡混杂模式与Sniffer程序学习</title><link>http://tuzei.net/2011/11/29/%e4%bb%a5%e5%a4%aa%e7%bd%91%e5%8d%a1%e6%b7%b7%e6%9d%82%e6%a8%a1%e5%bc%8f%e4%b8%8esniffer%e7%a8%8b%e5%ba%8f%e5%ad%a6%e4%b9%a0/</link><content:encoded>&lt;p&gt;&lt;a href=&quot;http://zh.wikipedia.org/wiki/%E6%B7%B7%E6%9D%82%E6%A8%A1%E5%BC%8F&quot;&gt;Wikipedia&lt;/a&gt;&lt;br /&gt;
&lt;blockquote&gt;混杂模式（Promiscuous Mode）是计算机网络中的术语。是指一台机器的网卡能够接收所有经过它的数据流，而不论其目的地址是否是它。&lt;/p&gt;
&lt;p&gt;一般计算机网卡都工作在非混杂模式下，此时网卡只接受来自网络端口的&lt;strong&gt;目的地址指向自己&lt;/strong&gt;的数据。当网卡工作在混杂模式下时，网卡将来自接口的&lt;strong&gt;所有数据&lt;/strong&gt;都捕获并交给相应的驱动程序。网卡的混杂模式一般在网络管理员分析网络数据作为网络故障诊断手段时用到，同时这个模式也被网络黑客利用来作为网络数据窃听的入口。在Liunx操作系统中设置网卡混杂模式，时需要管理员权限。在windows操作系统和Linux操作系统中都有使用混杂模式的抓包工具，比如著名的开源软件wireshark.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Linux下手动切换网卡(eth0)为(非)混杂模式。&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
默认为非混杂模式：&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;ifconfig eth0 -promisc&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;将eth0置为混杂(promiscuous)：&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;ifconfig eth0 promisc&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;查看网卡是否混杂：&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;ifconfig eth0&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;输出若包含PROMISC则说明处于混杂模式。&lt;br /&gt;
例：&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
eth0    Link encap:以太网  硬件地址 xx:xx:xx:xx:xx:xx&lt;br /&gt;
           inet 地址:x.x.x.x  广播:x.x.x.x  掩码:x.x.x.x&lt;br /&gt;
           UP BROADCAST RUNNING &lt;strong&gt;PROMISC&lt;/strong&gt; MULTICAST  MTU:1500  跃点数:1&lt;br /&gt;
           &amp;#8230;
&lt;/p&gt;&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;p&gt;注：&lt;span id=&quot;more-728&quot;&gt;&lt;/span&gt;&lt;br /&gt;
       1. struct ifreq结构定义在/usr/include/net/if.h，用来配置ip地址，激活接口，配置MTU等接口信息的。ifreq包含在ifconf结构中。而ifconf结构通常是用来保存所有接口的信息的。&lt;/p&gt;
&lt;p&gt;       2. 使用tcmdump监视某个主机设备(端口), 并产生C代码, 并可使用setsockopt绑定filter :&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;$ sudo tcpdump -i wlan0 -dd port xxxx and host xxx.xxx.xxx.xxx &lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;       3. 以太网帧结构(42)：Ethernet header(14)&amp;#8212;&gt;Dest Mac(6 bytes)[0-5], Source Mac[6-11]; IP header(20)&amp;#8212;&gt;[12-15]Dest IP(4 bytes), Source IP[16-19]; Tcp/Udp(8); Dest(2    bytes)/source port[20-21,22-23]&lt;/p&gt;
&lt;p&gt;       4. IP报文起始为0&amp;#215;45, 即版本(4 bit)与首部长度，占一个字节;&lt;/p&gt;
&lt;p&gt;参考资料：&lt;br /&gt;
               &lt;a href=&quot;http://hi.baidu.com/zkheartboy/blog/item/2dd5207abfbeb8ef2e73b3bf.html&quot;&gt;C语言编程来使网卡工作在混杂模式&lt;/a&gt;&lt;br /&gt;
               &lt;a href=&quot;http://2006zhouxinfeng.blog.163.com/blog/static/502402162011102532453/&quot;&gt; ioctl和struct ifreq &lt;/a&gt;&lt;br /&gt;
               &lt;a href=&quot;http://www.cnblogs.com/jinrize/archive/2009/11/24/1609902.html&quot;&gt;Linux下Sniffer程序的实现&lt;/a&gt;&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/591567332/tuzei/feedsky/s.gif?r=http://tuzei.net/2011/11/29/%e4%bb%a5%e5%a4%aa%e7%bd%91%e5%8d%a1%e6%b7%b7%e6%9d%82%e6%a8%a1%e5%bc%8f%e4%b8%8esniffer%e7%a8%8b%e5%ba%8f%e5%ad%a6%e4%b9%a0/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://tuzei.net/2011/11/29/%e4%bb%a5%e5%a4%aa%e7%bd%91%e5%8d%a1%e6%b7%b7%e6%9d%82%e6%a8%a1%e5%bc%8f%e4%b8%8esniffer%e7%a8%8b%e5%ba%8f%e5%ad%a6%e4%b9%a0/feed/</wfw:commentRss><slash:comments>0</slash:comments><description>Wikipedia 混杂模式（Promiscuous Mode）是计算机网络中的术语。是指一台机器的网卡能够接收所有经过它的数据流，而不论其目的地址是否是它。 一般计算机网卡都工作在非混杂模式下，此时网卡只接受来自网络端口的目的地址指向自己的数据。当网卡工作在混杂模式下时，网卡将来自接口的所有数据都捕获并交给相应的驱动程序。网卡的混杂模式一般在网络管理员分析网络数据作为网络故障诊断手段时用到，同时这个模式也被网络黑客利用来作为网络数据窃听的入口。在Liunx操作系统中设置网卡混杂模式，时需要管理员权限。在windows操作系统和Linux操作系统中都有使用混杂模式的抓包工具，比如著名的开源软件wireshark. Linux下手动切换网卡(eth0)为(非)混杂模式。 默认为非混杂模式： ifconfig eth0 -promisc 将eth0置为混杂(promiscuous)： ifconfig eth0 promisc 查看网卡是否混杂： ifconfig eth0 输出若包含PROMISC则说明处于混杂模式。 例： eth0 Link encap:以太网 硬件地址 xx:xx:xx:xx:xx:xx inet 地址:x.x.x.x 广播:x.x.x.x 掩码:x.x.x.x UP BROADCAST RUNNING PROMISC MULTICAST MTU:1500 跃点数:1 &amp;#8230; 注： 1. struct ifreq结构定义在/usr/include/net/if.h，用来配置ip地址，激活接口，配置MTU等接口信息的。ifreq包含在ifconf结构中。而ifconf结构通常是用来保存所有接口的信息的。 2. 使用tcmdump监视某个主机设备(端口), 并产生C代码, 并可使用setsockopt绑定filter : $ sudo tcpdump -i wlan0 -dd port xxxx and host xxx.xxx.xxx.xxx [...]&lt;img src=&quot;http://www1.feedsky.com/t1/591567332/tuzei/feedsky/s.gif?r=http://tuzei.net/2011/11/29/%e4%bb%a5%e5%a4%aa%e7%bd%91%e5%8d%a1%e6%b7%b7%e6%9d%82%e6%a8%a1%e5%bc%8f%e4%b8%8esniffer%e7%a8%8b%e5%ba%8f%e5%ad%a6%e4%b9%a0/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>技术 | 工作</category><pubDate>Tue, 29 Nov 2011 17:43:33 +0800</pubDate><author>jaykenduke</author><comments>http://tuzei.net/2011/11/29/%e4%bb%a5%e5%a4%aa%e7%bd%91%e5%8d%a1%e6%b7%b7%e6%9d%82%e6%a8%a1%e5%bc%8f%e4%b8%8esniffer%e7%a8%8b%e5%ba%8f%e5%ad%a6%e4%b9%a0/#comments</comments><guid isPermaLink="false">http://tuzei.net/?p=728</guid><dc:creator>jaykenduke</dc:creator><fs:srclink>http://tuzei.net/2011/11/29/%e4%bb%a5%e5%a4%aa%e7%bd%91%e5%8d%a1%e6%b7%b7%e6%9d%82%e6%a8%a1%e5%bc%8f%e4%b8%8esniffer%e7%a8%8b%e5%ba%8f%e5%ad%a6%e4%b9%a0/</fs:srclink><fs:srcfeed>http://tuzei.net/feed</fs:srcfeed><fs:itemid>feedsky/tuzei/~7195689/591567332/5276527</fs:itemid></item><item><title>[魔都日记2]关于目前正在做的和将要做的</title><link>http://tuzei.net/2011/11/02/%e9%ad%94%e9%83%bd%e6%97%a5%e8%ae%b02%e5%85%b3%e4%ba%8e%e7%9b%ae%e5%89%8d%e6%ad%a3%e5%9c%a8%e5%81%9a%e7%9a%84%e5%92%8c%e5%b0%86%e8%a6%81%e5%81%9a%e7%9a%84/</link><content:encoded>&lt;p&gt;来到魔都的第二周。一切都比较顺利，我们部门主要做大中型交换机的研发，机体板子结构比较复杂，模块区分非常明晰，产品已经发售使用。接下来需要做的就是将板子上跑的vxworks替换成目前比较流行的Linux，说白了就是系统移植方面的东西。最近这两天都是做一些准备工作，需要对LINUX底层的API接口，设备驱动，网络协议，以及VxWORKS与底层硬件交互的驱动进行深入了解。再有就是接触宏观的一些东西，比如板子内部的信息流通，整体的架构，收发报文的流程，抓包及包内数据的具体分析。板子主要有两块NT和LT板，即通常所说的网卡与线卡。整个MDU拿起来很沉，能看到的模块除了上述两个，还有风扇模块，电源模块及trace&amp;#038;debug接口,adsl&amp;#038;vdsl接口等。&lt;span id=&quot;more-702&quot;&gt;&lt;/span&gt;比较有幸的是直接见到了2u MDU的设计师，就坐在我附近，以后就有得学了。这是我为数不多的几次接触嵌入式系统的研发，比较有挑战性。&lt;/p&gt;
&lt;p&gt;看源码有一周多，有很大的收获，架构方面在逐步的成型。还是得努力，多学东西吧。题外话。早上跟会长学了一手，动态的更改MAC地址，由此花费了一上午时间写了个脚本，解决了不少问题。会长看了以后只说搞这行三分技术七分守管理，比较汗颜，我搞的这个也是无耻的暴力使用其他人的网络资源，乖乖的学东西。所谓大道至简，虚怀若古嘛。题外话2：不知道怎的突然就贼想玩玩TWITTER，用ANDROID客户端软件SSHTUNNEL也没什么大的效果，只能求助。题外话3：工作这一年会坚持写下去这个BLOG，当然大多数会写技术相关性的东西，留下一些印记。内容可能五花八门，python,tornado,linux,kernel,c/c++,algorithm. etc。就先这样，睡觉先，明天早起。安。&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/591567333/tuzei/feedsky/s.gif?r=http://tuzei.net/2011/11/02/%e9%ad%94%e9%83%bd%e6%97%a5%e8%ae%b02%e5%85%b3%e4%ba%8e%e7%9b%ae%e5%89%8d%e6%ad%a3%e5%9c%a8%e5%81%9a%e7%9a%84%e5%92%8c%e5%b0%86%e8%a6%81%e5%81%9a%e7%9a%84/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://tuzei.net/2011/11/02/%e9%ad%94%e9%83%bd%e6%97%a5%e8%ae%b02%e5%85%b3%e4%ba%8e%e7%9b%ae%e5%89%8d%e6%ad%a3%e5%9c%a8%e5%81%9a%e7%9a%84%e5%92%8c%e5%b0%86%e8%a6%81%e5%81%9a%e7%9a%84/feed/</wfw:commentRss><slash:comments>0</slash:comments><description>来到魔都的第二周。一切都比较顺利，我们部门主要做大中型交换机的研发，机体板子结构比较复杂，模块区分非常明晰，产品已经发售使用。接下来需要做的就是将板子上跑的vxworks替换成目前比较流行的Linux，说白了就是系统移植方面的东西。最近这两天都是做一些准备工作，需要对LINUX底层的API接口，设备驱动，网络协议，以及VxWORKS与底层硬件交互的驱动进行深入了解。再有就是接触宏观的一些东西，比如板子内部的信息流通，整体的架构，收发报文的流程，抓包及包内数据的具体分析。板子主要有两块NT和LT板，即通常所说的网卡与线卡。整个MDU拿起来很沉，能看到的模块除了上述两个，还有风扇模块，电源模块及trace&amp;#038;debug接口,adsl&amp;#038;vdsl接口等。比较有幸的是直接见到了2u MDU的设计师，就坐在我附近，以后就有得学了。这是我为数不多的几次接触嵌入式系统的研发，比较有挑战性。 看源码有一周多，有很大的收获，架构方面在逐步的成型。还是得努力，多学东西吧。题外话。早上跟会长学了一手，动态的更改MAC地址，由此花费了一上午时间写了个脚本，解决了不少问题。会长看了以后只说搞这行三分技术七分守管理，比较汗颜，我搞的这个也是无耻的暴力使用其他人的网络资源，乖乖的学东西。所谓大道至简，虚怀若古嘛。题外话2：不知道怎的突然就贼想玩玩TWITTER，用ANDROID客户端软件SSHTUNNEL也没什么大的效果，只能求助。题外话3：工作这一年会坚持写下去这个BLOG，当然大多数会写技术相关性的东西，留下一些印记。内容可能五花八门，python,tornado,linux,kernel,c/c++,algorithm. etc。就先这样，睡觉先，明天早起。安。&lt;img src=&quot;http://www1.feedsky.com/t1/591567333/tuzei/feedsky/s.gif?r=http://tuzei.net/2011/11/02/%e9%ad%94%e9%83%bd%e6%97%a5%e8%ae%b02%e5%85%b3%e4%ba%8e%e7%9b%ae%e5%89%8d%e6%ad%a3%e5%9c%a8%e5%81%9a%e7%9a%84%e5%92%8c%e5%b0%86%e8%a6%81%e5%81%9a%e7%9a%84/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>生活 | 碎片</category><category>技术 | 工作</category><pubDate>Wed, 02 Nov 2011 23:55:35 +0800</pubDate><author>jaykenduke</author><comments>http://tuzei.net/2011/11/02/%e9%ad%94%e9%83%bd%e6%97%a5%e8%ae%b02%e5%85%b3%e4%ba%8e%e7%9b%ae%e5%89%8d%e6%ad%a3%e5%9c%a8%e5%81%9a%e7%9a%84%e5%92%8c%e5%b0%86%e8%a6%81%e5%81%9a%e7%9a%84/#comments</comments><guid isPermaLink="false">http://tuzei.net/?p=702</guid><dc:creator>jaykenduke</dc:creator><fs:srclink>http://tuzei.net/2011/11/02/%e9%ad%94%e9%83%bd%e6%97%a5%e8%ae%b02%e5%85%b3%e4%ba%8e%e7%9b%ae%e5%89%8d%e6%ad%a3%e5%9c%a8%e5%81%9a%e7%9a%84%e5%92%8c%e5%b0%86%e8%a6%81%e5%81%9a%e7%9a%84/</fs:srclink><fs:srcfeed>http://tuzei.net/feed</fs:srcfeed><fs:itemid>feedsky/tuzei/~7195689/591567333/5276527</fs:itemid></item><item><title>魔都日记1</title><link>http://tuzei.net/2011/10/25/%e9%ad%94%e9%83%bd%e6%97%a5%e8%ae%b01/</link><content:encoded>&lt;p&gt;前段时间一直比较乱，所有的事情一下都集中到一起。两名导师都在纠结于我毕业选题。虽然有些不满，但总归要去做，老师或许是想的太多了，从最初的数据融合到数据挖掘，推荐算法到后面我实在忍受不了无休止的问答。听到我最终离开学校，导师只是说了句，可惜了，无它。选择出来实习在我想来或许是一件正确的事情，不，这一定是非常正确的事情，软件行业尽早入职可能会比在学校更早的体会到工作中的一些事情，在学校搞科研固然很好，可是你无法把定这个行业的需求，虽然可以依据大量的paper可以提高自己的功底，可这对浮躁的校园来讲，几乎是不能够做到的，这些方面，老师有些天真。&lt;span id=&quot;more-699&quot;&gt;&lt;/span&gt;想想研一一年飞快，除了上课就是对这电脑，对着厚厚的书，不停的coding，从未懈怠。还有一年多的时间就要再次毕业，丝毫没有本科领到毕业证的兴奋，现在可以平和的去思考一些问题，去想一些事情，这些东西都是老爷子教给我的，想来老爷子看的比较透。&lt;/p&gt;
&lt;p&gt;来魔都有一周多了，一切都安好，公司安排的相对比较顺利。就是出来找房子稍微麻烦一点，这相对于收拾房间卫生来说还是比较容易的。公司主要搞通讯网络，偏向底层，属于我比较喜欢的方向。刚开始会从系统移植做起，读了一些文档，感觉比较有趣。公司里面会不定时的举行项目组交流，参加了一次，获益匪浅。希望可以在这一行做出点东西，这些比较硬性，可以试试。就先这样，最近开始科研，可能会多写一些linux,python方面的东西。&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/591567334/tuzei/feedsky/s.gif?r=http://tuzei.net/2011/10/25/%e9%ad%94%e9%83%bd%e6%97%a5%e8%ae%b01/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://tuzei.net/2011/10/25/%e9%ad%94%e9%83%bd%e6%97%a5%e8%ae%b01/feed/</wfw:commentRss><slash:comments>1</slash:comments><description>前段时间一直比较乱，所有的事情一下都集中到一起。两名导师都在纠结于我毕业选题。虽然有些不满，但总归要去做，老师或许是想的太多了，从最初的数据融合到数据挖掘，推荐算法到后面我实在忍受不了无休止的问答。听到我最终离开学校，导师只是说了句，可惜了，无它。选择出来实习在我想来或许是一件正确的事情，不，这一定是非常正确的事情，软件行业尽早入职可能会比在学校更早的体会到工作中的一些事情，在学校搞科研固然很好，可是你无法把定这个行业的需求，虽然可以依据大量的paper可以提高自己的功底，可这对浮躁的校园来讲，几乎是不能够做到的，这些方面，老师有些天真。想想研一一年飞快，除了上课就是对这电脑，对着厚厚的书，不停的coding，从未懈怠。还有一年多的时间就要再次毕业，丝毫没有本科领到毕业证的兴奋，现在可以平和的去思考一些问题，去想一些事情，这些东西都是老爷子教给我的，想来老爷子看的比较透。 来魔都有一周多了，一切都安好，公司安排的相对比较顺利。就是出来找房子稍微麻烦一点，这相对于收拾房间卫生来说还是比较容易的。公司主要搞通讯网络，偏向底层，属于我比较喜欢的方向。刚开始会从系统移植做起，读了一些文档，感觉比较有趣。公司里面会不定时的举行项目组交流，参加了一次，获益匪浅。希望可以在这一行做出点东西，这些比较硬性，可以试试。就先这样，最近开始科研，可能会多写一些linux,python方面的东西。&lt;img src=&quot;http://www1.feedsky.com/t1/591567334/tuzei/feedsky/s.gif?r=http://tuzei.net/2011/10/25/%e9%ad%94%e9%83%bd%e6%97%a5%e8%ae%b01/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>生活 | 碎片</category><pubDate>Tue, 25 Oct 2011 23:03:13 +0800</pubDate><author>jaykenduke</author><comments>http://tuzei.net/2011/10/25/%e9%ad%94%e9%83%bd%e6%97%a5%e8%ae%b01/#comments</comments><guid isPermaLink="false">http://tuzei.net/?p=699</guid><dc:creator>jaykenduke</dc:creator><fs:srclink>http://tuzei.net/2011/10/25/%e9%ad%94%e9%83%bd%e6%97%a5%e8%ae%b01/</fs:srclink><fs:srcfeed>http://tuzei.net/feed</fs:srcfeed><fs:itemid>feedsky/tuzei/~7195689/591567334/5276527</fs:itemid></item><item><title>django上传图片问题</title><link>http://tuzei.net/2011/05/30/django%e4%b8%8a%e4%bc%a0%e5%9b%be%e7%89%87%e9%97%ae%e9%a2%98/</link><content:encoded>&lt;p&gt;最近这个在admin上传图片的东西搞的我非常郁闷，求教了很多人，查了很多资料。知道问题出在setting.py中的路径，但是怎么着改都有问题，今晚实在没辙就完全推倒重做，又仔细的分析了一遍media_root,media_url,static_root,static_url,admin_media_prefix。参考&lt;a href=&quot;https://docs.djangoproject.com/en/1.3/ref/settings/&quot;&gt;帮助文档&lt;/a&gt;，终于搞定，mark一下。&lt;span id=&quot;more-692&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&gt; MEDIA_ROOT&lt;/p&gt;
&lt;p&gt;the directory where you upload media&lt;/p&gt;
&lt;p&gt;&gt; MEDIA_URL&lt;/p&gt;
&lt;p&gt;the url where your site media &amp;#8211; css, js, icons etc live&lt;/p&gt;
&lt;p&gt;&gt; ADMIN_MEDIA_PREFIX&lt;/p&gt;
&lt;p&gt;the alias to where the admin media lives &amp;#8211; django/contrib/admin/media &lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;设置好setting.py文件后，在urls.py文件中添加一个urlpattern，如下代码：&lt;/p&gt;
&lt;div class=&quot;codecolorer-container python default&quot; style=&quot;overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;&quot;&gt;&lt;div class=&quot;python codecolorer&quot; style=&quot;padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap&quot;&gt;url&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;r&lt;span style=&quot;color: #483d8b;&quot;&gt;'^media/(?P&amp;lt;path&amp;gt;.*)$'&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;,&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #483d8b;&quot;&gt;'django.views.static.serve'&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;,&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: black;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'document_root'&lt;/span&gt;: settings.&lt;span style=&quot;color: black;&quot;&gt;MEDIA_ROOT&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;!--more--&gt;&lt;br /&gt;
&lt;img src=&quot;http://photo2.bababian.com/upload5/20110530/D8428A43A5222DEB92374F4970927EF9.jpg&quot; alt=&quot;setting&quot; /&gt;&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/591567335/tuzei/feedsky/s.gif?r=http://tuzei.net/2011/05/30/django%e4%b8%8a%e4%bc%a0%e5%9b%be%e7%89%87%e9%97%ae%e9%a2%98/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://tuzei.net/2011/05/30/django%e4%b8%8a%e4%bc%a0%e5%9b%be%e7%89%87%e9%97%ae%e9%a2%98/feed/</wfw:commentRss><slash:comments>1</slash:comments><description>最近这个在admin上传图片的东西搞的我非常郁闷，求教了很多人，查了很多资料。知道问题出在setting.py中的路径，但是怎么着改都有问题，今晚实在没辙就完全推倒重做，又仔细的分析了一遍media_root,media_url,static_root,static_url,admin_media_prefix。参考帮助文档，终于搞定，mark一下。 &gt; MEDIA_ROOT the directory where you upload media &gt; MEDIA_URL the url where your site media &amp;#8211; css, js, icons etc live &gt; ADMIN_MEDIA_PREFIX the alias to where the admin media lives &amp;#8211; django/contrib/admin/media 设置好setting.py文件后，在urls.py文件中添加一个urlpattern，如下代码： url&amp;#40;r'^media/(?P&amp;#60;path&amp;#62;.*)$', &amp;#160; &amp;#160; &amp;#160; &amp;#160; 'django.views.static.serve', &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#123;'document_root': settings.MEDIA_ROOT&amp;#125; &amp;#160; &amp;#160;&amp;#41;,&lt;img src=&quot;http://www1.feedsky.com/t1/591567335/tuzei/feedsky/s.gif?r=http://tuzei.net/2011/05/30/django%e4%b8%8a%e4%bc%a0%e5%9b%be%e7%89%87%e9%97%ae%e9%a2%98/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>django</category><category>技术 | 工作</category><pubDate>Mon, 30 May 2011 00:43:46 +0800</pubDate><author>jaykenduke</author><comments>http://tuzei.net/2011/05/30/django%e4%b8%8a%e4%bc%a0%e5%9b%be%e7%89%87%e9%97%ae%e9%a2%98/#comments</comments><guid isPermaLink="false">http://tuzei.net/?p=692</guid><dc:creator>jaykenduke</dc:creator><fs:srclink>http://tuzei.net/2011/05/30/django%e4%b8%8a%e4%bc%a0%e5%9b%be%e7%89%87%e9%97%ae%e9%a2%98/</fs:srclink><fs:srcfeed>http://tuzei.net/feed</fs:srcfeed><fs:itemid>feedsky/tuzei/~7195689/591567335/5276527</fs:itemid></item><item><title>django学习记录1</title><link>http://tuzei.net/2011/05/29/django%e5%ad%a6%e4%b9%a0%e8%ae%b0%e5%bd%951/</link><content:encoded>&lt;p&gt;&lt;strong&gt;Django报错UnicodeEncodeError: &amp;#8216;ascii&amp;#8217; codec can&amp;#8217;t encode characters 之解决方法！&lt;/strong&gt;&lt;br /&gt;
how-to:&lt;br /&gt;
编码问题。Change the __str__ methods on your models to be __unicode__ methods. Just change the name. Usually, nothing else will be needed. 　&lt;span id=&quot;more-686&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;admin.site.root &lt;strong&gt;vs&lt;/strong&gt; admin.site.urls&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;admin.site.root does not exist under Django 1.3 anymore, and you can use the last one instead.&lt;/p&gt;
&lt;div class=&quot;codecolorer-container python default&quot; style=&quot;overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;&quot;&gt;&lt;div class=&quot;python codecolorer&quot; style=&quot;padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap&quot;&gt;&amp;nbsp;&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;from&lt;/span&gt; django.&lt;span style=&quot;color: black;&quot;&gt;conf&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;urls&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;defaults&lt;/span&gt; &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;import&lt;/span&gt; *&lt;br /&gt;
&amp;nbsp;&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;from&lt;/span&gt; django.&lt;span style=&quot;color: black;&quot;&gt;contrib&lt;/span&gt; &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;import&lt;/span&gt; admin&lt;br /&gt;
&amp;nbsp;admin.&lt;span style=&quot;color: black;&quot;&gt;autodiscover&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&amp;nbsp;urlpatterns &lt;span style=&quot;color: #66cc66;&quot;&gt;=&lt;/span&gt; patterns&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;''&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;,&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;r&lt;span style=&quot;color: #483d8b;&quot;&gt;'^admin/'&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;,&lt;/span&gt; include&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;admin.&lt;span style=&quot;color: #dc143c;&quot;&gt;site&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;urls&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;,&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/591567336/tuzei/feedsky/s.gif?r=http://tuzei.net/2011/05/29/django%e5%ad%a6%e4%b9%a0%e8%ae%b0%e5%bd%951/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://tuzei.net/2011/05/29/django%e5%ad%a6%e4%b9%a0%e8%ae%b0%e5%bd%951/feed/</wfw:commentRss><slash:comments>0</slash:comments><description>Django报错UnicodeEncodeError: &amp;#8216;ascii&amp;#8217; codec can&amp;#8217;t encode characters 之解决方法！ how-to: 编码问题。Change the __str__ methods on your models to be __unicode__ methods. Just change the name. Usually, nothing else will be needed. 　 admin.site.root vs admin.site.urls admin.site.root does not exist under Django 1.3 anymore, and you can use the last one instead. &amp;#160;from django.conf.urls.defaults import * &amp;#160;from django.contrib [...]&lt;img src=&quot;http://www1.feedsky.com/t1/591567336/tuzei/feedsky/s.gif?r=http://tuzei.net/2011/05/29/django%e5%ad%a6%e4%b9%a0%e8%ae%b0%e5%bd%951/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>python</category><category>django</category><category>技术 | 工作</category><pubDate>Sun, 29 May 2011 09:56:45 +0800</pubDate><author>jaykenduke</author><comments>http://tuzei.net/2011/05/29/django%e5%ad%a6%e4%b9%a0%e8%ae%b0%e5%bd%951/#comments</comments><guid isPermaLink="false">http://tuzei.net/?p=686</guid><dc:creator>jaykenduke</dc:creator><fs:srclink>http://tuzei.net/2011/05/29/django%e5%ad%a6%e4%b9%a0%e8%ae%b0%e5%bd%951/</fs:srclink><fs:srcfeed>http://tuzei.net/feed</fs:srcfeed><fs:itemid>feedsky/tuzei/~7195689/591567336/5276527</fs:itemid></item><item><title>从无头单链表中删除节点</title><link>http://tuzei.net/2011/05/14/%e4%bb%8e%e6%97%a0%e5%a4%b4%e5%8d%95%e9%93%be%e8%a1%a8%e4%b8%ad%e5%88%a0%e9%99%a4%e8%8a%82%e7%82%b9/</link><content:encoded>&lt;p&gt;题目：&lt;br /&gt;
 假设有一个没有头指针的单链表。一个指针指向此单链表中间的一个节点（非第一个节点， 也非最后一个节点）。请将该节点从单链表中删除。&lt;br /&gt;
解答：&lt;br /&gt;
        典型的“狸猫换太子”， 若要删除该节点，正常情况下，应该要知道该节点的前面节点的指针，但是由于单链表中没有头结点，所以无法追溯到该节点前面的那个节点，因此，这里采用了“移花接木”的方法。设该节点为B，下一个节点为C。那么，首先将B节点的内容替换为C节点的内容，然后，将C节点删除，这样就达到了我们的目的。代码如下：&lt;span id=&quot;more-682&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
pcur-&gt;next = pnext-&gt;next;&lt;/p&gt;
&lt;p&gt;pcur-&gt;data = pnext-&gt;date;&lt;/p&gt;
&lt;p&gt;delete pnext;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;http://hi.baidu.com/silverxinger/blog/item/be3b0667b776c8710c33fafe.html&quot;&gt;via&lt;/a&gt;&lt;br /&gt;
&lt;!--more--&gt;&lt;br /&gt;
附录程序&lt;a href=&quot;http://www.cnblogs.com/kurtwang/archive/2010/09/22/1833050.html&quot;&gt;via&lt;/a&gt;：&lt;/p&gt;
&lt;div class=&quot;codecolorer-container c default&quot; style=&quot;overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;&quot;&gt;&lt;div class=&quot;c codecolorer&quot; style=&quot;padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap&quot;&gt;&lt;span style=&quot;color: #666666; font-style: italic;&quot;&gt;//考虑删除节点为尾节点&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #993333;&quot;&gt;void&lt;/span&gt; deleteNode2&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;Node &lt;span style=&quot;color: #339933;&quot;&gt;*&lt;/span&gt; pCurrent&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; Node &lt;span style=&quot;color: #339933;&quot;&gt;*&lt;/span&gt; head&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #b1b100;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;pCurrent &lt;span style=&quot;color: #339933;&quot;&gt;!=&lt;/span&gt; NULL&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #b1b100;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;pCurrent&lt;span style=&quot;color: #339933;&quot;&gt;-&amp;gt;&lt;/span&gt;next &lt;span style=&quot;color: #339933;&quot;&gt;!=&lt;/span&gt; NULL&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Node &lt;span style=&quot;color: #339933;&quot;&gt;*&lt;/span&gt; pTemp &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; pCurrent&lt;span style=&quot;color: #339933;&quot;&gt;-&amp;gt;&lt;/span&gt;next&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pCurrent&lt;span style=&quot;color: #339933;&quot;&gt;-&amp;gt;&lt;/span&gt;value &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; pTemp&lt;span style=&quot;color: #339933;&quot;&gt;-&amp;gt;&lt;/span&gt;value&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pCurrent&lt;span style=&quot;color: #339933;&quot;&gt;-&amp;gt;&lt;/span&gt;next &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; pTemp&lt;span style=&quot;color: #339933;&quot;&gt;-&amp;gt;&lt;/span&gt;next&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; delete pTemp&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #b1b100;&quot;&gt;else&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Node &lt;span style=&quot;color: #339933;&quot;&gt;*&lt;/span&gt; temp &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; head&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #b1b100;&quot;&gt;while&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;temp &lt;span style=&quot;color: #339933;&quot;&gt;!=&lt;/span&gt; NULL&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #b1b100;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;temp&lt;span style=&quot;color: #339933;&quot;&gt;-&amp;gt;&lt;/span&gt;next &lt;span style=&quot;color: #339933;&quot;&gt;==&lt;/span&gt; pCurrent&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; delete pCurrent&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; temp&lt;span style=&quot;color: #339933;&quot;&gt;-&amp;gt;&lt;/span&gt;next &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; NULL&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; temp &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; temp&lt;span style=&quot;color: #339933;&quot;&gt;-&amp;gt;&lt;/span&gt;next&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;#做Graph相关，使用到，思想来源于编程之美&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/591567337/tuzei/feedsky/s.gif?r=http://tuzei.net/2011/05/14/%e4%bb%8e%e6%97%a0%e5%a4%b4%e5%8d%95%e9%93%be%e8%a1%a8%e4%b8%ad%e5%88%a0%e9%99%a4%e8%8a%82%e7%82%b9/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://tuzei.net/2011/05/14/%e4%bb%8e%e6%97%a0%e5%a4%b4%e5%8d%95%e9%93%be%e8%a1%a8%e4%b8%ad%e5%88%a0%e9%99%a4%e8%8a%82%e7%82%b9/feed/</wfw:commentRss><slash:comments>0</slash:comments><description>题目： 假设有一个没有头指针的单链表。一个指针指向此单链表中间的一个节点（非第一个节点， 也非最后一个节点）。请将该节点从单链表中删除。 解答： 典型的“狸猫换太子”， 若要删除该节点，正常情况下，应该要知道该节点的前面节点的指针，但是由于单链表中没有头结点，所以无法追溯到该节点前面的那个节点，因此，这里采用了“移花接木”的方法。设该节点为B，下一个节点为C。那么，首先将B节点的内容替换为C节点的内容，然后，将C节点删除，这样就达到了我们的目的。代码如下： pcur-&gt;next = pnext-&gt;next; pcur-&gt;data = pnext-&gt;date; delete pnext; via 附录程序via： //考虑删除节点为尾节点 void deleteNode2&amp;#40;Node * pCurrent, Node * head&amp;#41; &amp;#123; &amp;#160; &amp;#160; if&amp;#40;pCurrent != NULL&amp;#41; &amp;#160; &amp;#160; &amp;#123; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if&amp;#40;pCurrent-&amp;#62;next != NULL&amp;#41; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#123; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; Node * pTemp = [...]&lt;img src=&quot;http://www1.feedsky.com/t1/591567337/tuzei/feedsky/s.gif?r=http://tuzei.net/2011/05/14/%e4%bb%8e%e6%97%a0%e5%a4%b4%e5%8d%95%e9%93%be%e8%a1%a8%e4%b8%ad%e5%88%a0%e9%99%a4%e8%8a%82%e7%82%b9/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>技术 | 工作</category><pubDate>Sat, 14 May 2011 21:59:56 +0800</pubDate><author>jaykenduke</author><comments>http://tuzei.net/2011/05/14/%e4%bb%8e%e6%97%a0%e5%a4%b4%e5%8d%95%e9%93%be%e8%a1%a8%e4%b8%ad%e5%88%a0%e9%99%a4%e8%8a%82%e7%82%b9/#comments</comments><guid isPermaLink="false">http://tuzei.net/?p=682</guid><dc:creator>jaykenduke</dc:creator><fs:srclink>http://tuzei.net/2011/05/14/%e4%bb%8e%e6%97%a0%e5%a4%b4%e5%8d%95%e9%93%be%e8%a1%a8%e4%b8%ad%e5%88%a0%e9%99%a4%e8%8a%82%e7%82%b9/</fs:srclink><fs:srcfeed>http://tuzei.net/feed</fs:srcfeed><fs:itemid>feedsky/tuzei/~7195689/591567337/5276527</fs:itemid></item><item><title>define与typedef的区别</title><link>http://tuzei.net/2011/05/12/define%e4%b8%8etypedef%e7%9a%84%e5%8c%ba%e5%88%ab/</link><content:encoded>&lt;p&gt;&lt;strong&gt;简单来讲：#define只是简单的进行了替换,而typedef则是为类型取了个&amp;#8221;别名&amp;#8221;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1) #define是预处理指令，在编译预处理时进行简单的替换，不作正确性检查，不关含义是否正确照样带入，只有在编译已被展开的源程序时才会发现可能的错误并报错。例如：&lt;br /&gt;
#define PI 3.1415926&lt;br /&gt;
程序中的：area=PI*r*r 会替换为3.1415926*r*r&lt;br /&gt;
如果你把#define语句中的数字9 写成字母g 预处理也照样带入。&lt;br /&gt;
&lt;span id=&quot;more-670&quot;&gt;&lt;/span&gt;&lt;br /&gt;
2）typedef是在编译时处理的。它在自己的作用域内给一个已经存在的类型一个别名，但是You cannot use the typedef specifier inside a function definition。&lt;/p&gt;
&lt;p&gt;3）typedef int * int_ptr;&lt;br /&gt;
与&lt;br /&gt;
#define int_ptr int *&lt;br /&gt;
作用都是用int_ptr代表 int * ,但是二者不同，正如前面所说 ，#define在预处理 时进行简单的替换，而typedef不是简单替换 ，而是采用如同定义变量的方法那样来声明一种类型。也就是说;&lt;/p&gt;
&lt;p&gt;//refer to (xzgyb(老达摩))&lt;br /&gt;
#define int_ptr int *&lt;br /&gt;
int_ptr a, b; //相当于int * a, b; 只是简单的宏替换&lt;/p&gt;
&lt;p&gt;typedef int* int_ptr;&lt;br /&gt;
int_ptr a, b; //a, b 都为指向int的指针,typedef为int* 引入了一个新的助记符&lt;/p&gt;
&lt;p&gt;//看看结果就知道了&lt;/p&gt;
&lt;div class=&quot;codecolorer-container cpp default&quot; style=&quot;overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;&quot;&gt;&lt;div class=&quot;cpp codecolorer&quot; style=&quot;padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap&quot;&gt;&lt;span style=&quot;color: #339900;&quot;&gt;#include &amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #339900;&quot;&gt;#include &amp;lt;typeinfo&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #0000ff;&quot;&gt;using&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;namespace&lt;/span&gt; std&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; main&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #0000ff;&quot;&gt;typedef&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;char&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt; CHAR&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; CHAR c,d&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #0000dd;&quot;&gt;cout&lt;/span&gt; &lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;typeid&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;c&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;.&lt;span style=&quot;color: #007788;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;typeid&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;d&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;.&lt;span style=&quot;color: #007788;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #339900;&quot;&gt;#define CH char*&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; CH c1,c2&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #0000dd;&quot;&gt;cout&lt;/span&gt; &lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;typeid&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;c1&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;.&lt;span style=&quot;color: #007788;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;typeid&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;c2&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;.&lt;span style=&quot;color: #007788;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #0000dd;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;这也说明了为什么下面观点成立&lt;br /&gt;
typedef int * pint ;&lt;br /&gt;
#define PINT int *&lt;/p&gt;
&lt;p&gt;那么：&lt;br /&gt;
const pint p ;//p不可更改，但p指向的内容可更改&lt;br /&gt;
const PINT p ;//p可更改，但是p指向的内容不可更改。&lt;/p&gt;
&lt;p&gt;pint是一种指针类型 const pint p 就是把指针给锁住了 p不可更改&lt;br /&gt;
而const PINT p 是const int * p 锁的是指针p所指的对象。&lt;/p&gt;
&lt;p&gt;3）也许您已经注意到#define 不是语句 不要在行末加分号，否则 会连分号一块置换。&lt;/p&gt;
&lt;p&gt;来源于&lt;a href=&quot;http://topic.csdn.net/u/20080401/14/1a5aa568-bea5-43d1-9245-cf555ef8f228.html&quot;&gt;csdn&lt;/a&gt;&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/591567338/tuzei/feedsky/s.gif?r=http://tuzei.net/2011/05/12/define%e4%b8%8etypedef%e7%9a%84%e5%8c%ba%e5%88%ab/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://tuzei.net/2011/05/12/define%e4%b8%8etypedef%e7%9a%84%e5%8c%ba%e5%88%ab/feed/</wfw:commentRss><slash:comments>0</slash:comments><description>简单来讲：#define只是简单的进行了替换,而typedef则是为类型取了个&amp;#8221;别名&amp;#8221; 1) #define是预处理指令，在编译预处理时进行简单的替换，不作正确性检查，不关含义是否正确照样带入，只有在编译已被展开的源程序时才会发现可能的错误并报错。例如： #define PI 3.1415926 程序中的：area=PI*r*r 会替换为3.1415926*r*r 如果你把#define语句中的数字9 写成字母g 预处理也照样带入。 2）typedef是在编译时处理的。它在自己的作用域内给一个已经存在的类型一个别名，但是You cannot use the typedef specifier inside a function definition。 3）typedef int * int_ptr; 与 #define int_ptr int * 作用都是用int_ptr代表 int * ,但是二者不同，正如前面所说 ，#define在预处理 时进行简单的替换，而typedef不是简单替换 ，而是采用如同定义变量的方法那样来声明一种类型。也就是说; //refer to (xzgyb(老达摩)) #define int_ptr int * int_ptr a, b; //相当于int * a, b; 只是简单的宏替换 typedef int* int_ptr; [...]&lt;img src=&quot;http://www1.feedsky.com/t1/591567338/tuzei/feedsky/s.gif?r=http://tuzei.net/2011/05/12/define%e4%b8%8etypedef%e7%9a%84%e5%8c%ba%e5%88%ab/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>技术 | 工作</category><pubDate>Thu, 12 May 2011 09:38:45 +0800</pubDate><author>jaykenduke</author><comments>http://tuzei.net/2011/05/12/define%e4%b8%8etypedef%e7%9a%84%e5%8c%ba%e5%88%ab/#comments</comments><guid isPermaLink="false">http://tuzei.net/?p=670</guid><dc:creator>jaykenduke</dc:creator><fs:srclink>http://tuzei.net/2011/05/12/define%e4%b8%8etypedef%e7%9a%84%e5%8c%ba%e5%88%ab/</fs:srclink><fs:srcfeed>http://tuzei.net/feed</fs:srcfeed><fs:itemid>feedsky/tuzei/~7195689/591567338/5276527</fs:itemid></item><item><title>Tree, a program for displaying trees.</title><link>http://tuzei.net/2011/05/04/tree-preprocessor/</link><content:encoded>&lt;p&gt;The `Tree&amp;#8217; program formats trees for screen display or printing with TeX .&lt;br /&gt;
&lt;a href=&quot;http://www.essex.ac.uk/linguistics/external/clmt/latex4ling/trees/tree/&quot;&gt;The `Tree&amp;#8217; preprocessor&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;For example:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Usage: &lt;/strong&gt;tree &amp;#8220;\tree (S(NP(John))(VP(runs)))&amp;#8221;&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;img src=&quot;http://www.essex.ac.uk/linguistics/external/clmt/latex4ling/trees/tree/g1.gif&quot; alt=&quot;Ptree&quot; /&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;p&gt;PS：这个小工具非常好用，看了以后，决定不自己搞了。&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/591567339/tuzei/feedsky/s.gif?r=http://tuzei.net/2011/05/04/tree-preprocessor/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://tuzei.net/2011/05/04/tree-preprocessor/feed/</wfw:commentRss><slash:comments>0</slash:comments><description>The `Tree&amp;#8217; program formats trees for screen display or printing with TeX . The `Tree&amp;#8217; preprocessor For example: Usage: tree &amp;#8220;\tree (S(NP(John))(VP(runs)))&amp;#8221; PS：这个小工具非常好用，看了以后，决定不自己搞了。&lt;img src=&quot;http://www1.feedsky.com/t1/591567339/tuzei/feedsky/s.gif?r=http://tuzei.net/2011/05/04/tree-preprocessor/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>技术 | 工作</category><pubDate>Wed, 04 May 2011 21:33:38 +0800</pubDate><author>jaykenduke</author><comments>http://tuzei.net/2011/05/04/tree-preprocessor/#comments</comments><guid isPermaLink="false">http://tuzei.net/?p=660</guid><dc:creator>jaykenduke</dc:creator><fs:srclink>http://tuzei.net/2011/05/04/tree-preprocessor/</fs:srclink><fs:srcfeed>http://tuzei.net/feed</fs:srcfeed><fs:itemid>feedsky/tuzei/~7195689/591567339/5276527</fs:itemid></item></channel></rss>
