<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>iLenceel &#187; 档案一理</title>
	<atom:link href="http://lenciel.cn/category/note/feed/" rel="self" type="application/rss+xml" />
	<link>http://lenciel.cn</link>
	<description>俏也不争春，只把春来叫</description>
	<lastBuildDate>Fri, 18 May 2012 10:16:59 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Android开发中使用ProGuard</title>
		<link>http://lenciel.cn/2012/02/android-maven-proguard-integration/</link>
		<comments>http://lenciel.cn/2012/02/android-maven-proguard-integration/#comments</comments>
		<pubDate>Mon, 27 Feb 2012 11:06:45 +0000</pubDate>
		<dc:creator>lenciel</dc:creator>
				<category><![CDATA[档案一理]]></category>
		<category><![CDATA[android maven proguard tutorial]]></category>

		<guid isPermaLink="false">http://lenciel.cn/?p=2003</guid>
		<description><![CDATA[今天被同事问到怎么在release版本里面所有的log都去掉的时候，竟然只能回忆起用ProGuard做过这个，完全忘记怎么做的了，特立此存照。文章里面使用的例子放在 Android-Maven-ProGuard-Sample-App ProGuard简介 在移动设备上面开发应用程序，性能是一个很关键的指标。你的老板走过来要你提高性能的时候，你的第一反应有可能是抓起熟悉的工具花几个小时profile自己的应用，找出那些时间都花在哪里了。在使用这么终极的手段之前，千万不要忘记了先试试ProGuard。 做Android之前就是Java程序员的可能早就已经对ProGuard很熟悉了。简单的来说，ProGuard就是一个Java的class文件处理器，主要的功能类似奥运会口号： 让你的程序变得更小更快 让你的程序变得更难被反向工程 尽管ProGuard不是专用于Android开发的，但是在Android的SDK里面已经包括了这个工具，路径是ANDROID_HOME/tools/proguard，文档可以在http://proguard.sourceforge.net看到。 让程序变得更小更快的好处是不言而喻的。ProGuard通过对bytecode进行优化，优化手段包括去掉无用的代码，去掉内联方法的调用，对类的继承结构进行优化，把所有能加上的final和static加上，以及对算术运算进行Peephole optimization等等。 让程序变得更难被反向工程就不一定是每个人都需要的了。一般情况下，对Android的反向工程是把Dalvik的bytecode转换成Java的bytecode，然后使用传统的Java反向工具转成成Java源代码。如果你的项目是开源的，显然也没有必要防止别人反向。但是如果是下面几种情况，你就很可能需要它了： 你在源文件里面有一些不想被别人看到的信息，如密码等 你的代码里面有自己或者公司的赖以生存的知识产权 你的甲方有明确的要求 你的程序按license等方式收费，你不想被别人把licens检查的部分去掉重新编译个版本 ProGuard可以帮助通过对类，方法和成员名称进行混淆，同时通过去掉结构化的信息，如文件名或者行号表等，来使得代码从理论上变得不可被反向工程。 如此看来，ProGuard真是美好事物一枚。但是ProGuard也不是随手一点药到病除的，也有一点学习曲线。 启用ProGuard 如果你使用Eclipse的ADT，每个新建的项目都会生成一个proguard.cfg文件在项目的根目录。你对ProGuard的所有设定就是在这个文件里面完成的。要想在项目里面启用Proguard，只需要把同样在项目根目录的default.properties里面加上： proguard.config=proguard.cfg 当然，如果你蛋疼到要自己去移动cfg文件的位置，也要记得去改等号后面的部分。然后，在所有的release版本的build里，你的Proguard就已经生效了。对于使用Eclipse的同学来说，release的build就是指通过选择Android Tools&#62;Export Signed/Unsigned Application Package来进行。 因为在大多数开发中我们都会使用Ant或者是Maven来对项目进行管理，所以一般不会直接用Eclipse来进行release版本的编译，所以通常我们还要掌握如何在不使用ADT的情况下使用ProGuard。对于Maven而言，可以通过使用Maven Android plugin来完成。同时，由于ProGuard已经完全集成到Android的工具链里面了，所以Android的Ant任务里面也有一个专门的private任务叫做-obfuscate，会把激活并使用ProGuard作为release这个target的一部分，所以使用Ant的话只要一个ant release就可以了。 当ProGuard执行以后，会产生几个特别重要的文件： mapping.txt：保存了混淆后的名字和混淆前名字的对应关系。对于每次release的build，都要记得保存这个文件，要不然如果你收到release版本上报出的defect的时候，就等着哭吧。 seeds.txt：ProGuard找到的你的程序的entrypoint列表。 usage.txt：ProGuard觉得没有用所以移除了的一堆类，域和方法的list。要想学习写作“完美”的ProGuard规则的同学就要经常来这个文件看看自己定下的rule对ProGuard的行为究竟有什么样的影响。如果你有用的类出现在list里面了，说明你削得太猛了，反之亦然。 需要注意的是这些文件的输出目录。在使用Ant ProGuard target的时候，输出目录是bin/proguard/，但是如果是通过ADT(右键project&#62;Android Tools&#62;Export）的话，输出目录会是proguard/。 还有一个常见的困惑就是ProGuard是怎么找到那些需要处理的文件的。一般情况下，ProGuard希望你用-injars或者是-libraryjars来告诉它。但是对Android开发而言，Ant任务和ADT都会自动的查看你的libs，output和项目的classpath目录。 从执行过程的日志来看，ProGuard对类文件的操作分为三个步骤：shrink，optimize，obfuscate。每个步骤都是可选的，可以通过使用-dontshrink、-dontoptimize和-dontobfuscate来分别关掉。一般来说，不用因为结果“不如人意”就随意的关掉某个步骤。完整的进行三个步骤，然后不断的改变规则，直到达到最佳效果，是使用ProGuard的最佳方式。 编写ProGuard规则 ProGuard和很多工具一样，其强大之处在于选项够多。作为Android开发者使用，首先心里要明白，没有一个唯一的最佳配置规则。在此基础上，去掌握一些对Android程序而言通常是适用的规则。然后，就像在文章里面已经反复强调过的一样，以这些规则为起点，反复的调整你的规则，找出一个对自己的程序最适用的规则。 当然，因为选项太多，ProGuard给初学者的感觉难免是千头万绪，无从下手。因此，我们可以从一个例子程序入手来找到对ProGuard的“感觉”。 这个例子本身没有任何特别之处，MyButton类继承自Button但是没有添加新的方法，可以通过它来观察ProGuard如何对继承结构进行压缩。Click的handler除开显示toast之外也没有特别的功能，可以通过它来观察ProGuard对方法名的混淆。AMPSampleActivity里面还专门有一个没有被调用的方法，可以通过它来观察ProGuard对这种情况的处理。下面是程序的入口Activity的实现： 我们期望ProGuard做的事情包括： 保留AMPSampleActivity类，因为它是我们在XML里面指定的程序入口 保留StringUtils类和它的repeat方法 保留myClickHandler方法 保留MyButton类 去掉unusedMethod 除开XML里面引用的类（AMPSampleActivity和MyButton），其他的类名都需要被混淆 除开XML里面引用的方法名（myClickHandler），其他的方法名都要被混淆 完成一些对Android而言通常适用的优化（下面会仔细展开） ProGuard的规则是“白名单”的，也就是说ProGuard只会对你特别指定的类刀下开恩。这也就是说，对任何程序，我们都至少要写一条规则，来保留程序的入口类。因为是Android程序，我们可以这么写： -keep public [...]]]></description>
			<content:encoded><![CDATA[<p>今天被同事问到怎么在release版本里面所有的log都去掉的时候，竟然只能回忆起用ProGuard做过这个，完全忘记怎么做的了，特立此存照。文章里面使用的例子放在<a class="network" href="https://github.com/lenciel/AMP" rel="me"><img src="http://lenciel.cn/wp-content/themes/lenciel/images/github_button.png" alt="" width="16" height="16" /> Android-Maven-ProGuard-Sample-App</a>
</p>
<p><strong></p>
<h4>ProGuard简介</h4>
<p></strong></p>
<p>在移动设备上面开发应用程序，性能是一个很关键的指标。你的老板走过来要你提高性能的时候，你的第一反应有可能是抓起熟悉的工具花几个小时profile自己的应用，找出那些时间都花在哪里了。在使用这么终极的手段之前，千万不要忘记了先试试ProGuard。</p>
<p>做Android之前就是Java程序员的可能早就已经对ProGuard很熟悉了。简单的来说，ProGuard就是一个Java的class文件处理器，主要的功能类似奥运会口号：</p>
<ul>
<li>让你的程序变得更小更快 </li>
<li>让你的程序变得更难被反向工程 </li>
</ul>
<p>尽管ProGuard不是专用于Android开发的，但是在Android的SDK里面已经包括了这个工具，路径是<code>ANDROID_HOME/tools/proguard</code>，文档可以在<a href="http://proguard.sourceforge.net">http://proguard.sourceforge.net</a>看到。</p>
<p>让程序变得更小更快的好处是不言而喻的。ProGuard通过对bytecode进行优化，优化手段包括去掉无用的代码，去掉内联方法的调用，对类的继承结构进行优化，把所有能加上的<code>final</code>和<code>static</code>加上，以及对算术运算进行<a href="http://en.wikipedia.org/wiki/Peephole_optimization" target="_blank">Peephole optimization</a>等等。</p>
<p>让程序变得更难被反向工程就不一定是每个人都需要的了。一般情况下，对Android的反向工程是把Dalvik的bytecode转换成Java的bytecode，然后使用传统的Java反向工具转成成Java源代码。如果你的项目是开源的，显然也没有必要防止别人反向。但是如果是下面几种情况，你就很可能需要它了： </p>
<ul>
<li>你在源文件里面有一些不想被别人看到的信息，如密码等 </li>
<li>你的代码里面有自己或者公司的赖以生存的知识产权 </li>
<li>你的甲方有明确的要求 </li>
<li>你的程序按license等方式收费，你不想被别人把licens检查的部分去掉重新编译个版本 </li>
</ul>
<p>ProGuard可以帮助通过对类，方法和成员名称进行混淆，同时通过去掉结构化的信息，如文件名或者行号表等，来使得代码从理论上变得不可被反向工程。</p>
<p>如此看来，ProGuard真是美好事物一枚。但是ProGuard也不是随手一点药到病除的，也有一点学习曲线。</p>
<p><strong></p>
<h4>启用ProGuard</h4>
<p></strong></p>
<p>如果你使用Eclipse的ADT，每个新建的项目都会生成一个<code>proguard.cfg</code>文件在项目的根目录。你对ProGuard的所有设定就是在这个文件里面完成的。要想在项目里面启用Proguard，只需要把同样在项目根目录的<code>default.properties</code>里面加上：</p>
<p>
<div class="wp_syntax"><div class="code"><pre class="xorg_conf" style="font-family:monospace;">proguard.config=proguard.cfg</pre></div></div>

</p>
<p>当然，如果你蛋疼到要自己去移动cfg文件的位置，也要记得去改等号后面的部分。然后，在所有的release版本的build里，你的Proguard就已经生效了。对于使用Eclipse的同学来说，release的build就是指通过选择Android Tools&gt;Export Signed/Unsigned Application Package来进行。</p>
<p>因为在大多数开发中我们都会使用Ant或者是Maven来对项目进行管理，所以一般不会直接用Eclipse来进行release版本的编译，所以通常我们还要掌握如何在不使用ADT的情况下使用ProGuard。对于Maven而言，可以通过使用Maven Android plugin来完成。同时，由于ProGuard已经完全集成到Android的工具链里面了，所以Android的Ant任务里面也有一个专门的private任务叫做<code>-obfuscate</code>，会把激活并使用ProGuard作为release这个target的一部分，所以使用Ant的话只要一个ant release就可以了。</p>
<p>当ProGuard执行以后，会产生几个特别重要的文件：</p>
<ul>
<li>mapping.txt：保存了混淆后的名字和混淆前名字的对应关系。<strong>对于每次release的build，都要记得保存这个文件</strong>，要不然如果你收到release版本上报出的defect的时候，就等着哭吧。 </li>
<li>seeds.txt：ProGuard找到的你的程序的entrypoint列表。 </li>
<li>usage.txt：ProGuard觉得没有用所以移除了的一堆类，域和方法的list。要想学习写作“完美”的ProGuard规则的同学就要经常来这个文件看看自己定下的rule对ProGuard的行为究竟有什么样的影响。如果你有用的类出现在list里面了，说明你削得太猛了，反之亦然。</li>
</ul>
<p>需要注意的是这些文件的输出目录。在使用Ant ProGuard target的时候，输出目录是<code>bin/proguard/</code>，但是如果是通过ADT(右键project&gt;Android Tools&gt;Export）的话，输出目录会是<code>proguard/</code>。</p>
<p>还有一个常见的困惑就是ProGuard是怎么找到那些需要处理的文件的。一般情况下，ProGuard希望你用<code>-injars</code>或者是<code>-libraryjars</code>来告诉它。但是对Android开发而言，Ant任务和ADT都会自动的查看你的<code>libs</code>，<code>output</code>和项目的<code>classpath</code>目录。</p>
<p>从执行过程的日志来看，ProGuard对类文件的操作分为三个步骤：shrink，optimize，obfuscate。每个步骤都是可选的，可以通过使用<code>-dontshrink</code>、<code>-dontoptimize</code>和<code>-dontobfuscate</code>来分别关掉。一般来说，不用因为结果“不如人意”就随意的关掉某个步骤。完整的进行三个步骤，然后不断的改变规则，直到达到最佳效果，是使用ProGuard的最佳方式。</p>
<p><strong></p>
<h4>编写ProGuard规则</h4>
<p></strong></p>
<p>ProGuard和很多工具一样，其强大之处在于选项够多。作为Android开发者使用，首先心里要明白，没有一个唯一的最佳配置规则。在此基础上，去掌握一些对Android程序而言通常是适用的规则。然后，就像在文章里面已经反复强调过的一样，以这些规则为起点，反复的调整你的规则，找出一个对自己的程序最适用的规则。</p>
<p>当然，因为选项太多，ProGuard给初学者的感觉难免是千头万绪，无从下手。因此，我们可以从一个例子程序入手来找到对ProGuard的“感觉”。</p>
<p>这个例子本身没有任何特别之处，<code>MyButton</code>类继承自<code>Button</code>但是没有添加新的方法，可以通过它来观察ProGuard如何对继承结构进行压缩。Click的handler除开显示toast之外也没有特别的功能，可以通过它来观察ProGuard对方法名的混淆。<code>AMPSampleActivity</code>里面还专门有一个没有被调用的方法，可以通过它来观察ProGuard对这种情况的处理。下面是程序的入口Activity的实现：</p>
<p>我们期望ProGuard做的事情包括：</p>
<ul>
<li>保留<code>AMPSampleActivity</code>类，因为它是我们在XML里面指定的程序入口 </li>
<li>保留<code>StringUtils</code>类和它的<code>repeat</code>方法 </li>
<li>保留<code>myClickHandler</code>方法 </li>
<li>保留<code>MyButton</code>类 </li>
<li>去掉<code>unusedMethod</code> </li>
<li>除开XML里面引用的类（<code>AMPSampleActivity</code>和<code>MyButton</code>），其他的类名都需要被混淆 </li>
<li>除开XML里面引用的方法名（<code>myClickHandler</code>），其他的方法名都要被混淆 </li>
<li>完成一些对Android而言通常适用的优化（下面会仔细展开） </li>
</ul>
<p>ProGuard的规则是“白名单”的，也就是说ProGuard只会对你特别指定的类刀下开恩。这也就是说，对任何程序，我们都至少要写一条规则，来保留程序的入口类。因为是Android程序，我们可以这么写：</p>
</p>

<div class="wp_syntax"><div class="code"><pre class="xorg_conf" style="font-family:monospace;">-keep public class * extends android.app.Activity</pre></div></div>

</p>
<p>这里我们可以看到ProGuard的rule用的语法基本上遵循了Java本身的语法（extends等等），但是它支持使用通配符。规则中的-keep告诉ProGuard不要删除也不要混淆任何从android.app.Activity继承的类。</p>
<p>很简单，不是吗？如果你这个时候运行程序，会看到： </p>
<p>
<div class="wp_syntax"><div class="code"><pre class="xorg_conf" style="font-family:monospace;">    org.lenciel.android/org.lenciel.android.AMPSampleActivity<span class="br0">&#125;</span>: 
    ➥ android.view.InflateException: Binary XML file line <span style="color: #adadad; font-style: italic;">#6: Error inflating </span>
    ➥ class org.lenciel.android.MyButton</pre></div></div>

</p>
<p>为什么在inflate我们自定义的view的时候crash了呢？这是因为自定义的view是在XML里面被用到的，而不是在Java代码里面。因此ProGuard会认为这是没有用的代码而试着删除它。要保证这些自定义的view不被误删，就需要定义如下的规则：</p>
<p>
<div class="wp_syntax"><div class="code"><pre class="xorg_conf" style="font-family:monospace;">-keepclasseswithmembers class * <span class="br0">&#123;</span>
    public &lt;init&gt;<span class="br0">&#40;</span>android.content.Context, android.util.AttributeSet<span class="br0">&#41;</span>; 
<span class="br0">&#125;</span> 
&nbsp;
-keepclasseswithmembers class * <span class="br0">&#123;</span>
    public &lt;init&gt;<span class="br0">&#40;</span>android.content.Context, android.util.AttributeSet, int<span class="br0">&#41;</span>; 
<span class="br0">&#125;</span></pre></div></div>

</p>
<p>这两条规则告诉ProGuard不要对定义了可能被<code>LayoutInflater</code>调用的构造函数的任何类进行优化。我们这里使用了<code>-keepclasseswithmembers</code>而不是<code>-keep</code>。</p>
<p>再次运行，会遇到下面的错误：</p>
<p>
<div class="wp_syntax"><div class="code"><pre class="xorg_conf" style="font-family:monospace;">java.lang.IllegalStateException: Could not find a method 
   ➥ myClickHandler<span class="br0">&#40;</span>View<span class="br0">&#41;</span> in the activity class org.lenciel.android.AMPSampleActivity for onClick handler on 
   ➥ view class org.lenciel.android.MyButton</pre></div></div>

</p>
<p>去查看<code>usage.txt</code>你会发现<code>myClickHandler</code>又被干掉了。为什么在第一条规则里面我们告诉ProGuard不要动<code>AMPSampleActivity</code>里面的任何东西，还是会有这种情况发生？这是使用<code>-keep</code>的一个常见的误会。我们用<code>-keep</code>告诉ProGuard保留一个类的时候，没有提供任何类的“body”信息的话，ProGuard仅仅会保留这个类的名字。它仍然会对这个类内部的所有东西进行优化和混淆。要保留方法，我们需要这么写：</p>
<p>
<div class="wp_syntax"><div class="code"><pre class="xorg_conf" style="font-family:monospace;">-keep public class * extends android.app.Activity <span class="br0">&#123;</span> 
    methods; 
<span class="br0">&#125;</span></pre></div></div>

</p>
<p>但是这样写显然又太过于慷慨了。下面这条规则会好很多：</p>
<p>
<div class="wp_syntax"><div class="code"><pre class="xorg_conf" style="font-family:monospace;">-keepclassmembers class * extends android.app.Activity <span class="br0">&#123;</span>
    public void *<span class="br0">&#40;</span>android.view.View<span class="br0">&#41;</span>; 
<span class="br0">&#125;</span></pre></div></div>

</p>
<p>这条规则告诉ProGuard，如果一个<code>Activity</code>在<code>shrink</code>阶段没有被去掉，那么就保留那些<code>public</code>的，没有返回值的，传入了<code>android.view.View</code>作为参数的方法。</p>
<p>可以看到，使用ProGuard存在一个不断调优的过程。他山之石，可以攻玉，已经有很多人使用ProGuard来优化Android程序了，于是也有了一些被普遍采用的规则和选项，我们下面来个简单说明。</p>
<p><strong></p>
<h4>常用规则和选项</h4>
<p></strong></p>
<p>前面看到的规则对于例子程序就足够了。但是如果我们的程序使用了<code>Service</code>怎么办？和<code>Activity</code>一样，<code>Service</code>也是在manifest xml里面定义的，因此我们需要对<code>proguard.cfg</code>做一定的扩展。</p>
<p>下面的规则是针对Android程序一般来说都比较有效的。</p>
<p>一般来说，下面的Android framework class都是需要保留的：</p>
<p>
<div class="wp_syntax"><div class="code"><pre class="xorg_conf" style="font-family:monospace;">-keep public class * extends android.app.Activity 
-keep public class * extends android.app.Application 
-keep public class * extends android.app.Service 
-keep public class * extends android.content.BroadcastReceiver 
-keep public class * extends android.content.ContentProvider 
-keep public class * extends android.app.backup.BackupAgentHelper 
-keep public class * extends android.preference.Preference 
-keep public class com.android.vending.licensing.ILicensingService</pre></div></div>

</p>
<p>虽然你的程序可能一开始没有使用其中的一些类，但是定义好全部这些规则也是有好处的：它可以避免你在使用ProGuard编出的版本crash之后去搞半天才发现有某个类似的规则需要更新但是你忘记了。</p>
<p>第二个有用的规则是保留<code>static</code>的<code>CREATOR</code>域，这个是Android用来parcel对象的。这个域由于是在运行的时候<a href="http://www.google.com.hk/url?sa=t&amp;rct=j&amp;q=introspection&amp;source=web&amp;cd=2&amp;ved=0CDYQFjAB&amp;url=http%3A%2F%2Fen.wikipedia.org%2Fwiki%2FIntrospection&amp;ei=_JhDT-6ADIGtiQfF46TMBA&amp;usg=AFQjCNEEE1rrErPfi38AVCPjdN6ri-qROA" target="_blank">Instrospection</a>的，所以ProGuard会认为它是无用的域并把它去掉。下面这条rule可以防止这样的事情发生：</p>
<p>
<div class="wp_syntax"><div class="code"><pre class="xorg_conf" style="font-family:monospace;">-keepclassmembers class * implements android.os.Parcelable <span class="br0">&#123;</span>
    static android.os.Parcelable$Creator CREATOR; 
<span class="br0">&#125;</span></pre></div></div>

</p>
<p>在程序中如果你调用了native的code，比如你用JNI来调用了c的lib，由于在Java代码里面是一份方法的签名，而没有方法的实现，它必须被链接到native code上。这也就意味着这些函数名不能被ProGuard加以混淆了，不然链接的过程就会失败。下面的规则可以保证ProGuard不去动native的方法名：</p>
<p>
<div class="wp_syntax"><div class="code"><pre class="xorg_conf" style="font-family:monospace;">-keepclasseswithmembernames class * <span class="br0">&#123;</span> 
     native methods; 
<span class="br0">&#125;</span></pre></div></div>

</p>
<p>我们这里使用的<code>-keepclasseswithmembernames</code>是告诉ProGuard，被调用过的方法留着，没有调用过的都去掉。</p>
<p>前面的规则看起来都一目了然。下面这个可能要费解一些：</p>
<p>
<div class="wp_syntax"><div class="code"><pre class="xorg_conf" style="font-family:monospace;">-keepclassmembers enum * <span class="br0">&#123;</span>   
     public static **<span class="br0">&#91;</span><span class="br0">&#93;</span> values<span class="br0">&#40;</span><span class="br0">&#41;</span>; 
     public static ** valueOf<span class="br0">&#40;</span>java.lang.String<span class="br0">&#41;</span>; 
<span class="br0">&#125;</span></pre></div></div>

</p>
<p>这个规则是让ProGuard不要去动任何<code>Enum</code>的<code>values</code>和<code>valueOf</code>方法。这些方法之所以特殊是因为Java自己是通过发射机制来调用它们的。这可能也是Google<a href="https://developer.android.com/guide/practices/design/performance.html#avoid_enums" target="_blank">不建议使用</a>Java enum的原因吧：它们比<code>final class fields</code>的性能要低不少。如果你已经遵照Google的教诲停止使用<code>Enum</code>，那你也不需要这条规则了，恭喜。</p>
<p>下面来看看常用的选项：</p>
<p>
<div class="wp_syntax"><div class="code"><pre class="xorg_conf" style="font-family:monospace;">-dontusemixedcaseclassnames 
-dontskipnonpubliclibraryclasses 
-dontpreverify 
-verbose</pre></div></div>

</p>
<p>第一个选项可以避免像Windows这样不区分大小写的操作系统不会因为类似<code>A.class</code>和<code>a.class</code>写到同一个文件里面就驾崩。</p>
<p>第二个选项是因为ProGuard默认不会处理任何非public的类。但是有时候我们会遇到public的类继承自内部的非public的类。所以打开这个选项可以更好的覆盖。</p>
<p>第三个选项是告诉ProGuard不要做<code>preverify</code>（预检验），因为这个只对J2ME或者是Java6的平台有用。</p>
<p>最后一个选项，你们懂的。</p>
<p>前面我们提到过ProGuard有一个优化代码（optimize）的过程。大多数时候ProGuard都会火力全开的对所有的代码做优化。这些优化操作有些时候是相当aggressive的，比如合并类的时候ProGuard会试着既从纵向上合并也从横向上合并，以便得到尽量少的类文件，也就可以得到尽量小的APK。同时它还会试着优化循环和代数运算。默认的ADT生成的ProGuard选项关掉了很多的优化选项：</p>
<p>
<div class="wp_syntax"><div class="code"><pre class="xorg_conf" style="font-family:monospace;">-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*</pre></div></div>

</p>
<p>Google并没有提供他们这么配置的依据。我们可以试着先禁用这个选项，看看程序运行起来会不会有问题。如果遇到了问题再试着慢慢的减弱优化，来“探底”。</p>
<p>同时ProGuard的优化是可以“递归”的，也就是优化完的结果可以作为下次优化的输入继续优化。你可以指定它反复进行多少次。但ProGuard如果发现已经没有什么可以优化，会自动停下来，不一定跑到你指定的次数。一般设置成5就够了：</p>
<p>
<div class="wp_syntax"><div class="code"><pre class="xorg_conf" style="font-family:monospace;">-optimizationpasses <span style="color: #cc66cc;">5</span></pre></div></div>

</p>
<p><strong></p>
<h4>如果处理混淆后版本的错误报告</h4>
<p></strong></p>
<p>如果你发布了混淆的版本，有一个问题你就得面对：用户提交的问题单里面产生自这些类和方法都完全打乱过后的版本。为了展示这种问题，在Demo程序里面专门加了这么一个类：</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #FFA500; font-weight: bold;">public</span> <span style="color: #FFA500; font-weight: bold;">class</span> Bomb <span style="color: #009900;">&#123;</span>
    <span style="color: #FFA500; font-weight: bold;">public</span> <span style="color: #FFA500; font-weight: bold;">void</span> explode<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #FFA500; font-weight: bold;">throw</span> <span style="color: #FFA500; font-weight: bold;">new</span> <span style="color: #003399;">RuntimeException</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Boom!&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

</p>
<p>在onCreate方法里面它会被引爆：</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #FFA500; font-weight: bold;">public</span> <span style="color: #FFA500; font-weight: bold;">void</span> onCreate<span style="color: #009900;">&#40;</span>Bundle savedInstanceState<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #FFA500; font-weight: bold;">super</span>.<span style="color: #90EE90;">onCreate</span><span style="color: #009900;">&#40;</span>savedInstanceState<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    setContentView<span style="color: #009900;">&#40;</span>R.<span style="color: #90EE90;">layout</span>.<span style="color: #90EE90;">main</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #003399;">String</span> toast <span style="color: #339933;">=</span> StringUtils.<span style="color: #90EE90;">repeat</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Hello ProGuard! &quot;</span>, <span style="color: #cc66cc;">3</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    Toast.<span style="color: #90EE90;">makeText</span><span style="color: #009900;">&#40;</span><span style="color: #FFA500; font-weight: bold;">this</span>, toast, Toast.<span style="color: #90EE90;">LENGTH_SHORT</span><span style="color: #009900;">&#41;</span>.<span style="color: #90EE90;">show</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #FFA500; font-weight: bold;">new</span> Bomb<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #90EE90;">explode</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

</p>
<p>如果你运行程序，就会看到下面的错误：</p>
<p>
<div class="wp_syntax"><div class="code"><pre class="xorg_conf" style="font-family:monospace;">java.lang.RuntimeException: Unable to start activity ...MainActivity<span class="br0">&#125;</span>: 
java.lang.RuntimeException: Boom!
...
Caused by: java.lang.RuntimeException: Boom!
   at org.lenciel.android.MainActivity.onCreate<span class="br0">&#40;</span>Unknown Source<span class="br0">&#41;</span>
   at android.app.Instrumentation.callActivityOnCreate<span class="br0">&#40;</span>
   ➥ Instrumentation.java:<span style="color: #cc66cc;">1047</span><span class="br0">&#41;</span>
   at android.app.ActivityThread.performLaunchActivity<span class="br0">&#40;</span>
   ➥ ActivityThread.java:<span style="color: #cc66cc;">2627</span><span class="br0">&#41;</span>
   ... <span style="color: #cc66cc;">11</span> more</pre></div></div>

</p>
<p>可以看到在错误出现位置的stack trace既没有行号也没有文件名。这是因为相关的信息都被ProGuard优化掉了。如果我们想避免这种情况，就要在<code>proguard.cfg</code>里面加上下面的选项：</p>
<p>
<div class="wp_syntax"><div class="code"><pre class="xorg_conf" style="font-family:monospace;">-keepattributes SourceFile,LineNumberTable</pre></div></div>

</p>
<p>显然，有了行号和文件名，还是解决不了方法被混淆的问题。我们这个例子程序里面方法很少，而<code>onCreate</code>方法因为是<code>Override</code>的，所以ProGuard不会去动它。如果是正式的工程，最好的办法还是用<code>retrace</code>工具来根据<code>mapping.txt</code>还原整个日志。</p>
<p>
<div class="wp_syntax"><div class="code"><pre class="xorg_conf" style="font-family:monospace;">$ retrace proguard/mapping.txt stacktrace.txt</pre></div></div>
</p>
]]></content:encoded>
			<wfw:commentRss>http://lenciel.cn/2012/02/android-maven-proguard-integration/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Icon Font</title>
		<link>http://lenciel.cn/2012/02/icon-font/</link>
		<comments>http://lenciel.cn/2012/02/icon-font/#comments</comments>
		<pubDate>Sat, 25 Feb 2012 02:45:29 +0000</pubDate>
		<dc:creator>lenciel</dc:creator>
				<category><![CDATA[档案一理]]></category>
		<category><![CDATA[web design]]></category>

		<guid isPermaLink="false">http://lenciel.cn/?p=1973</guid>
		<description><![CDATA[最近收集了一些Icon Font准备自己的项目里面用（这也是本座因为Stack功能切换回Delicious来管理书签之后第建的第一个Stack）。Icon Font本身看起来和普通的icon没有特别的差别： + Add+ ⊕ Add-alt⊕ a Alerta ← Arrow-left← → Arrow-right→ ↑ Arrow-up↑ ↓ Arrow-down↓ A AttachmentA ↩ Back↩ b Bookmarkb B BubbleB c Cartc C ChartC ✔ Check✔ ⌚ Clock⌚ ☁ Cloud☁ × Delete× ⊗ Delete-alt⊗ d Deniedd ✎ Edit✎ e Equalizere ! Exclamation! E EyeE ⚑ Flag⚑ f Fullscreenf ⚙ Gear⚙ [...]]]></description>
			<content:encoded><![CDATA[<div>
<p>最近收集了一些<a href="http://delicious.com/stacks/view/F4tX2W" target="_blank">Icon Font</a>准备自己的项目里面用（这也是本座因为Stack功能切换回Delicious来管理书签之后第建的第一个<a href="http://delicious.com/help#title1" target="_blank">Stack</a>）。Icon Font本身看起来和普通的icon没有特别的差别：
</p>
<section id="see" class="see">
<div class="content">
<ul>
<li><span class="icon">+</span>
<div class="tooltip">Add<br /><span class="character">+</span></div>
</li>
<li><span class="icon">⊕</span>
<div class="tooltip">Add-alt<br /><span class="character">⊕</span></div>
</li>
<li><span class="icon">a</span>
<div class="tooltip">Alert<br /><span class="character">a</span></div>
</li>
<li><span class="icon">←</span>
<div class="tooltip">Arrow-left<br /><span class="character">←</span></div>
</li>
<li><span class="icon">→</span>
<div class="tooltip">Arrow-right<br /><span class="character">→</span></div>
</li>
<li><span class="icon">↑</span>
<div class="tooltip">Arrow-up<br /><span class="character">↑</span></div>
</li>
<li><span class="icon">↓</span>
<div class="tooltip">Arrow-down<br /><span class="character">↓</span></div>
</li>
<li><span class="icon">A</span>
<div class="tooltip">Attachment<br /><span class="character">A</span></div>
</li>
<li><span class="icon">↩</span>
<div class="tooltip">Back<br /><span class="character">↩</span></div>
</li>
<li><span class="icon">b</span>
<div class="tooltip">Bookmark<br /><span class="character">b</span></div>
</li>
<li><span class="icon">B</span>
<div class="tooltip">Bubble<br /><span class="character">B</span></div>
</li>
<li><span class="icon">c</span>
<div class="tooltip">Cart<br /><span class="character">c</span></div>
</li>
<li><span class="icon">C</span>
<div class="tooltip">Chart<br /><span class="character">C</span></div>
</li>
<li><span class="icon">✔</span>
<div class="tooltip">Check<br /><span class="character">✔</span></div>
</li>
<li><span class="icon">⌚</span>
<div class="tooltip">Clock<br /><span class="character">⌚</span></div>
</li>
<li><span class="icon">☁</span>
<div class="tooltip">Cloud<br /><span class="character">☁</span></div>
</li>
<li><span class="icon">×</span>
<div class="tooltip">Delete<br /><span class="character">×</span></div>
</li>
<li><span class="icon">⊗</span>
<div class="tooltip">Delete-alt<br /><span class="character">⊗</span></div>
</li>
<li><span class="icon">d</span>
<div class="tooltip">Denied<br /><span class="character">d</span></div>
</li>
<li><span class="icon">✎</span>
<div class="tooltip">Edit<br /><span class="character">✎</span></div>
</li>
<li><span class="icon">e</span>
<div class="tooltip">Equalizer<br /><span class="character">e</span></div>
</li>
<li><span class="icon">!</span>
<div class="tooltip">Exclamation<br /><span class="character">!</span></div>
</li>
<li><span class="icon">E</span>
<div class="tooltip">Eye<br /><span class="character">E</span></div>
</li>
<li><span class="icon">⚑</span>
<div class="tooltip">Flag<br /><span class="character">⚑</span></div>
</li>
<li><span class="icon">f</span>
<div class="tooltip">Fullscreen<br /><span class="character">f</span></div>
</li>
<li><span class="icon">⚙</span>
<div class="tooltip">Gear<br /><span class="character">⚙</span></div>
</li>
<li><span class="icon">g</span>
<div class="tooltip">Grid<br /><span class="character">g</span></div>
</li>
<li><span class="icon">❤</span>
<div class="tooltip">Heart<br /><span class="character">❤</span></div>
</li>
<li><span class="icon">⌂</span>
<div class="tooltip">Home<br /><span class="character">⌂</span></div>
</li>
<li><span class="icon">i</span>
<div class="tooltip">Info<br /><span class="character">i</span></div>
</li>
<li><span class="icon">l</span>
<div class="tooltip">List<br /><span class="character">l</span></div>
</li>
<li><span class="icon">L</span>
<div class="tooltip">Lock<br /><span class="character">L</span></div>
</li>
<li><span class="icon">⬇</span>
<div class="tooltip">Location<br /><span class="character">⬇</span></div>
</li>
<li><span class="icon">✉</span>
<div class="tooltip">Message<br /><span class="character">✉</span></div>
</li>
<li><span class="icon">m</span>
<div class="tooltip">Move<br /><span class="character">m</span></div>
</li>
<li><span class="icon">♫</span>
<div class="tooltip">Music<br /><span class="character">♫</span></div>
</li>
<li><span class="icon">p</span>
<div class="tooltip">Photo<br /><span class="character">p</span></div>
</li>
<li><span class="icon">▶</span>
<div class="tooltip">Play<br /><span class="character">▶</span></div>
</li>
<li><span class="icon">P</span>
<div class="tooltip">Power<br /><span class="character">P</span></div>
</li>
<li><span class="icon">?</span>
<div class="tooltip">Question<br /><span class="character">?</span></div>
</li>
<li><span class="icon">⟲</span>
<div class="tooltip">Refresh<br /><span class="character">⟲</span></div>
</li>
<li><span class="icon">-</span>
<div class="tooltip">Remove<br /><span class="character">-</span></div>
</li>
<li><span class="icon">⊝</span>
<div class="tooltip">Remove-alt<br /><span class="character">⊝</span></div>
</li>
<li><span class="icon">r</span>
<div class="tooltip">RSS<br /><span class="character">r</span></div>
</li>
<li><span class="icon">s</span>
<div class="tooltip">Share<br /><span class="character">s</span></div>
</li>
<li><span class="icon">★</span>
<div class="tooltip">Star<br /><span class="character">★</span></div>
</li>
<li><span class="icon">t</span>
<div class="tooltip">Tag<br /><span class="character">t</span></div>
</li>
<li><span class="icon">T</span>
<div class="tooltip">Trash<br /><span class="character">T</span></div>
</li>
<li><span class="icon">u</span>
<div class="tooltip">User<br /><span class="character">u</span></div>
</li>
<li><span class="icon">v</span>
<div class="tooltip">Video<br /><span class="character">v</span></div>
</li>
<li><span class="icon">⚠</span>
<div class="tooltip">Warning<br /><span class="character">⚠</span></div>
</li>
<li><span class="icon">z</span>
<div class="tooltip">Zoom<br /><span class="character">z</span></div>
</li>
</ul></div>
</section>
<div>
    有的浏览器居然还不支持<a href="http://www.html5tutorial.info/html5-range.php" target="_blank">HTML5的range</a>，所以如果你看到下面是输入框的话，建议你升级浏览器或者是自己输入数字再左键点击页面任何地方…-_-”。Anyway，Icon font确实是很酷的，因为：    </p>
<ol>
<li>
			你可以很容易的改变它的大小</p>
<input type="range" id="font-size-slider" min="6" max="100" value="62">
		</li>
<li>
			你可以很容易的改变它的颜色</p>
<input type="range" class="color-slider" id="color-slider-1" min="0" max="360" value="0">
<input type="range" class="color-slider" id="color-slider-2" min="0" max="100" value="50">
<input type="range" class="color-slider" id="color-slider-3" min="0" max="100" value="50">
		</li>
<li>
			你甚至可以很容易的改变它的阴影效果</p>
<input type="range" class="shadow-slider" id="shadow-slider-1" min="0" max="20" value="0">
<input type="range" class="shadow-slider" id="shadow-slider-2" min="0" max="20" value="0">
<input type="range" class="shadow-slider" id="shadow-slider-3" min="0" max="20" value="0">
		</li>
<li>Icon Font不会有PNG那样的在IE下面不透明的问题</li>
<li>用了它可以完成任何用图片的icon达到的效果，甚至可以旋转和调整透明度</li>
<li>只要浏览器支持，你就可以使用<code>text-stroke</code>或者是<code>background-clip:text;</code>这种更加复杂的效果了</li>
</ol></div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://lenciel.cn/2012/02/icon-font/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Smartphone Q1 &amp; Q2</title>
		<link>http://lenciel.cn/2011/08/smartphone_sales_analysis_in_2011_q1_q2/</link>
		<comments>http://lenciel.cn/2011/08/smartphone_sales_analysis_in_2011_q1_q2/#comments</comments>
		<pubDate>Fri, 26 Aug 2011 06:42:18 +0000</pubDate>
		<dc:creator>lenciel</dc:creator>
				<category><![CDATA[档案一理]]></category>
		<category><![CDATA[answer]]></category>
		<category><![CDATA[report]]></category>

		<guid isPermaLink="false">http://lenciel.cn/2011/08/smartphone-q1-q2/</guid>
		<description><![CDATA[转眼威武的两个季度过去了，行业像地震了一般，有专利的互掐，接着MOTOGoogle出来了，然后HP把WebOS砍了，不知道Q3会不会更有趣。 下面的数据来源主要是 Tomi on Q1 2011 Tomi on Q2 2011 制造商净值 上座的从Apple的20.3个million到ZTE的2.7个million。Apple虽然还是头把交椅，但其实自己并没有什么太大的增长。主要是Nokia仍然在坚持自己的错误道路，这多少有点儿像当年的浏览器大战时Netscape被MS搞掉的场景。一个是处心积虑，一个是执迷不悟。 而很多人没察觉的，无论是环比同比，三星，而不是Apple，才是今年最大的赢家。如果不算上Apple还未投放的杀器iPhone Nano，估计Apple要在市场占有率上战胜三星这种硬件软件平台和产品线极度完备的厂家，会非常困难。 季度智能手机销售量(millions) 华为的数据可能不准 Vendor Q2 2011 ch ch Q1 2011 ch ch Q4 2010 Apple 20.3 +10% +1.9 18.4 +15% +2.5 16.2 Samsung 17.8 +41% +5.2 12.6 +20% +2.1 10.5 Nokia 16.7 -31% -7.5 24.2 -15% -4.3 28.3 RIM 13.3 -9% -1.2 [...]]]></description>
			<content:encoded><![CDATA[<p>转眼威武的两个季度过去了，行业像地震了一般，有专利的互掐，接着MOTOGoogle出来了，然后HP把WebOS砍了，不知道Q3会不会更有趣。</p>
<p>下面的数据来源主要是</p>
<blockquote><li>Tomi on <a href="http://communities-dominate.blogs.com/brands/2011/05/final-numbers-for-q1-in-smartphones-bloodbath-year-2-electric-boogaloo.html">Q1 2011</a> </li>
<li>Tomi on <a href="http://communities-dominate.blogs.com/brands/2011/08/smartphone-market-shares-at-q2-and-report-card-for-half-year-performance.html">Q2 2011</a> </li>
</blockquote>
<p>  <strong><br />
<h4>制造商净值</h4>
<p> </strong>
<p>上座的从Apple的20.3个million到ZTE的2.7个million。Apple虽然还是头把交椅，但其实自己并没有什么太大的增长。主要是Nokia仍然在坚持自己的错误道路，这多少有点儿像当年的浏览器大战时Netscape被MS搞掉的场景。一个是处心积虑，一个是执迷不悟。</p>
<p>而很多人没察觉的，无论是环比同比，三星，而不是Apple，才是今年最大的赢家。如果不算上Apple还未投放的杀器iPhone Nano，估计Apple要在市场占有率上战胜三星这种硬件软件平台和产品线极度完备的厂家，会非常困难。</p>
<table class="sortable">
<caption>季度智能手机销售量(millions)      <br /><span class="smaller">华为的数据可能不准</span> </caption>
<tbody>
<tr>
<th>Vendor</th>
<th>Q2 2011</th>
<th class="narrow" title="Change">ch</th>
<th class="narrow" title="Change">ch</th>
<th>Q1 2011</th>
<th class="narrow" title="Change">ch</th>
<th class="narrow" title="Change">ch</th>
<th>Q4 2010</th>
</tr>
<tr>
<td>Apple</td>
<td>20.3</td>
<td>+10%</td>
<td>+1.9</td>
<td>18.4</td>
<td>+15%</td>
<td>+2.5</td>
<td>16.2</td>
</tr>
<tr>
<td>Samsung</td>
<td>17.8</td>
<td>+41%</td>
<td>+5.2</td>
<td>12.6</td>
<td>+20%</td>
<td>+2.1</td>
<td>10.5</td>
</tr>
<tr>
<td>Nokia</td>
<td>16.7</td>
<td>-31%</td>
<td>-7.5</td>
<td>24.2</td>
<td>-15%</td>
<td>-4.3</td>
<td>28.3</td>
</tr>
<tr>
<td>RIM</td>
<td>13.3</td>
<td>-9%</td>
<td>-1.2</td>
<td>14.5</td>
<td>+2%</td>
<td>+0.3</td>
<td>14.2</td>
</tr>
<tr>
<td>HTC</td>
<td>12.2</td>
<td>+26%</td>
<td>+2.5</td>
<td>9.7</td>
<td>-5%</td>
<td>-0.5</td>
<td>10.2</td>
</tr>
<tr>
<td>LG</td>
<td>5.4</td>
<td>+15%</td>
<td>+0.7</td>
<td>4.7</td>
<td>0</td>
<td>0</td>
<td>4.7</td>
</tr>
<tr>
<td>Sony Ericsson</td>
<td>5.3</td>
<td>+8%</td>
<td>+0.4</td>
<td>4.9</td>
<td>-6%</td>
<td>-0.3</td>
<td>5.2</td>
</tr>
<tr>
<td>Motorola</td>
<td>4.4</td>
<td>+7%</td>
<td>+0.3</td>
<td>4.1</td>
<td>-16%</td>
<td>-0.8</td>
<td>4.9</td>
</tr>
<tr>
<td>Huawei</td>
<td>4.0</td>
<td>+67%</td>
<td>+1.6</td>
<td>2.4</td>
<td class="infinity">∞</td>
<td>+2.4</td>
<td>-</td>
</tr>
<tr>
<td>ZTE</td>
<td>2.7</td>
<td>+23%</td>
<td>+0.5</td>
<td>2.2</td>
<td class="infinity">∞</td>
<td>+2.2</td>
<td>-</td>
</tr>
<tr>
<td>Other</td>
<td>5.9</td>
<td>+7%</td>
<td>+0.4</td>
<td>5.5</td>
<td>+6%</td>
<td>+0.3</td>
<td>5.2</td>
</tr>
<tr class="separator">
<td>Total</td>
<td>108.0</td>
<td>+7%</td>
<td>+6.8</td>
<td>101.2</td>
<td>+2%</td>
<td>+2.2</td>
<td>99.4</td>
</tr>
</tbody>
</table>
<p>智能手机整个销售量的增幅当然是略显疲态的。在2010年那种每个季度有24%左右(Q3达到了31%)的翻江倒海的势头已经不见踪迹。最大的变化在前五名的排序，HTC有望在下个季度超过RIM成为第四，因为虽然在Q1所有的Android厂商都有负增长，但是到了Q2输家除开Nokia之外就只有RIM。</p>
<p>华为和中兴正式成为智能手机制造商中的重要角色。在这之前华为和中兴的终端可能主要是捆绑式的直销给运营商，所以直接对用户的市场上不怎么能看到。但是慢慢的两家都从幕后战斗到了台前。特别是华为的表现非常好，上升幅度是所有厂商里面最猛的。</p>
<p>Motorola和Sony Ericsson勉强维持了增长，LG相比之下日子略好过。</p>
<p>  <strong><br />
<h4>去年比比</h4>
<p></strong>
<p>与去年进行比较，三星显然也是最大的赢家，有将近500%的增速。</p>
<table class="sortable">
<caption>Q2智能销售年比</caption>
<tbody>
<tr>
<th>Vendor</th>
<th>Q2 2011</th>
<th class="narrow" title="Change">ch</th>
<th class="narrow" title="Change">ch</th>
<th>Q2 2010</th>
</tr>
<tr>
<td>Apple</td>
<td>20.3</td>
<td>+142%</td>
<td>+11.9</td>
<td>8.4</td>
</tr>
<tr>
<td>Samsung</td>
<td>17.8</td>
<td>+493%</td>
<td>+14.8</td>
<td>3.0</td>
</tr>
<tr>
<td>Nokia</td>
<td>16.7</td>
<td>-31%</td>
<td>-7.3</td>
<td>24.0</td>
</tr>
<tr>
<td>RIM</td>
<td>13.3</td>
<td>+19%</td>
<td>+2.1</td>
<td>11.2</td>
</tr>
<tr>
<td>HTC</td>
<td>12.2</td>
<td>+171%</td>
<td>+7.7</td>
<td>4.5</td>
</tr>
<tr>
<td>Motorola</td>
<td>4.4</td>
<td>+63%</td>
<td>+1.7</td>
<td>2.7</td>
</tr>
<tr>
<td>Other</td>
<td>23.3</td>
<td>+195%</td>
<td>+15.4</td>
<td>7.9</td>
</tr>
<tr class="separator">
<td>Total</td>
<td>108.0</td>
<td>+75%</td>
<td>+46.3</td>
<td>61.7</td>
</tr>
</tbody>
</table>
<p>  <strong><br />
<h4>制造商市场占有率</h4>
<p></strong>
<p>净值数据大家向来没有那么关心，山头大小才是最挂念的。尽管Apple满世界的贴自己的利润值和增幅，我们可以看到它的市场占有率没有发生什么太大的变化。在Apple的上次飞跃完成之后，市面上大概每卖出5个智能手机就有一个是iPhone，目前这个比例停滞不前。就像前面提到的，要和三星作战，只有传说中的iPhone Nano推出拼一下中端和低端市场的份额，能否成功将是Apple能不能再次飞跃的关键。</p>
<table class="sortable">
<caption>季度市场份额</caption>
<tbody>
<tr>
<th>Vendor</th>
<th>Q2 2011</th>
<th class="narrow" title="Change">ch</th>
<th>Q1 2011</th>
<th class="narrow" title="Change">ch</th>
<th>Q4 2010</th>
<th class="narrow" title="Change">ch</th>
<th>Q3 2010</th>
</tr>
<tr>
<td>Apple</td>
<td>19%</td>
<td>+1</td>
<td>18%</td>
<td>+2</td>
<td>16%</td>
<td>-2</td>
<td>18%</td>
</tr>
<tr>
<td>Samsung</td>
<td>16%</td>
<td>+4</td>
<td>12%</td>
<td>+1</td>
<td>11%</td>
<td>+1</td>
<td>10%</td>
</tr>
<tr>
<td>Nokia</td>
<td>15%</td>
<td>-9</td>
<td>24%</td>
<td>-4</td>
<td>28%</td>
<td>-5</td>
<td>33%</td>
</tr>
<tr>
<td>RIM</td>
<td>12%</td>
<td>-2</td>
<td>14%</td>
<td>0</td>
<td>14%</td>
<td>-1</td>
<td>15%</td>
</tr>
<tr>
<td>HTC</td>
<td>11%</td>
<td>+1</td>
<td>10%</td>
<td>0</td>
<td>10%</td>
<td>+2</td>
<td>8%</td>
</tr>
<tr>
<td>LG</td>
<td>5%</td>
<td>0</td>
<td>5%</td>
<td>0</td>
<td>5%</td>
<td>+2</td>
<td>3%</td>
</tr>
<tr>
<td>Sony Ericsson</td>
<td>5%</td>
<td>0</td>
<td>5%</td>
<td>0</td>
<td>5%</td>
<td>+2</td>
<td>3%</td>
</tr>
<tr>
<td>Motorola</td>
<td>4%</td>
<td>0</td>
<td>4%</td>
<td>-1</td>
<td>5%</td>
<td>0</td>
<td>5%</td>
</tr>
<tr>
<td>Huawei</td>
<td>4%</td>
<td>+2</td>
<td>2%</td>
<td>+2</td>
<td>-</td>
<td>-</td>
<td>-</td>
</tr>
<tr>
<td>ZTE</td>
<td>3%</td>
<td>+1</td>
<td>2%</td>
<td>+2</td>
<td>-</td>
<td>-</td>
<td>-</td>
</tr>
<tr>
<td>Other</td>
<td>6%</td>
<td>+2</td>
<td>4%</td>
<td>-2</td>
<td>6%</td>
<td>+1</td>
<td>5%</td>
</tr>
<tr class="separator">
<td>Volatility</td>
<td>&#160;</td>
<td>11%</td>
<td>&#160;</td>
<td>7%</td>
<td>&#160;</td>
<td>8%</td>
<td>&#160;</td>
</tr>
</tbody>
</table>
<p>可以看到Q2三星增加了4个百分点，Apple就1个，而大量的增长点都被HTC和天朝列强拿下了。显然，整个季度的增幅主要是Android相关的厂商贡献。</p>
<p>只有Nokia和RIM在桶妈，Nokia是相当的桶妈。</p>
<p>  <strong><br />
<h4>去年比比</h4>
<p></strong>
<p>一比就再次说明，Samsung大胜一场，Apple和一干Android厂商有发展，RIM亏了三分之一，Nokia则损失了六成。 </p>
<p>唯一没有从Nokia的溃败中获利的就是Motorola，因为它只在美国市场上风光，而Nokia在美国市场本来就孱弱，吐不出来太多份额给它。</p>
<table class="sortable">
<caption>Q2 年比</caption>
<tbody>
<tr>
<th>Vendor</th>
<th>Q2 2011</th>
<th class="narrow" title="Change">ch</th>
<th>Q2 2010</th>
</tr>
<tr>
<td>Apple</td>
<td>19%</td>
<td>+5</td>
<td>14%</td>
</tr>
<tr>
<td>Samsung</td>
<td>16%</td>
<td>+11</td>
<td>5%</td>
</tr>
<tr>
<td>Nokia</td>
<td>15%</td>
<td>-24</td>
<td>39%</td>
</tr>
<tr>
<td>RIM</td>
<td>12%</td>
<td>-6</td>
<td>18%</td>
</tr>
<tr>
<td>HTC</td>
<td>11%</td>
<td>+4</td>
<td>7%</td>
</tr>
<tr>
<td>LG</td>
<td>5%</td>
<td>+3</td>
<td>2%</td>
</tr>
<tr>
<td>Sony Ericsson</td>
<td>5%</td>
<td>+2</td>
<td>3%</td>
</tr>
<tr>
<td>Motorola</td>
<td>4%</td>
<td>0</td>
<td>4%</td>
</tr>
<tr>
<td>Other</td>
<td>13%</td>
<td>+5</td>
<td>8%</td>
</tr>
<tr class="separator">
<td>Volatility</td>
<td>&#160;</td>
<td>30%</td>
<td>&#160;</td>
</tr>
</tbody>
</table>
<p>  <strong><br />
<h4>操作系统市场份额</h4>
<p></strong>
<p>操作系统方面，Android赢得如此彻底，就像Symbian输得那么绝对一样。iOS基本没有变化，Bada有不错的表现。BlackBerry和Windows显然是loser(Windows份额如此小都还能做到负增长，真是奇迹)。</p>
<table class="sortable">
<caption>OS市场份额</caption>
<tbody>
<tr>
<th>OS</th>
<th>Q2 2011</th>
<th class="narrow" title="Change">ch</th>
<th>Q1 2011</th>
<th class="narrow" title="Change">ch</th>
<th>Q4 2010</th>
<th class="narrow" title="Change">ch</th>
<th>Q3 2010</th>
</tr>
<tr>
<td>Android</td>
<td>45%</td>
<td>+10</td>
<td>35%</td>
<td>+5</td>
<td>30%</td>
<td>+5</td>
<td>25%</td>
</tr>
<tr>
<td>iOS</td>
<td>19%</td>
<td>+1</td>
<td>18%</td>
<td>+2</td>
<td>16%</td>
<td>-2</td>
<td>18%</td>
</tr>
<tr>
<td>Symbian</td>
<td>16%</td>
<td>-9</td>
<td>25%</td>
<td>-7</td>
<td>32%</td>
<td>-4</td>
<td>36%</td>
</tr>
<tr>
<td>BlackBerry</td>
<td>12%</td>
<td>-2</td>
<td>14%</td>
<td>0</td>
<td>14%</td>
<td>-1</td>
<td>15%</td>
</tr>
<tr>
<td>bada</td>
<td>5%</td>
<td>+2</td>
<td>3%</td>
<td>0</td>
<td>3%</td>
<td>+1</td>
<td>2%</td>
</tr>
<tr>
<td>Windows Mobile</td>
<td>1%</td>
<td>-1</td>
<td>2%</td>
<td>0</td>
<td>2%</td>
<td>-1</td>
<td>3%</td>
</tr>
<tr>
<td>Windows Phone 7</td>
<td>1%</td>
<td>-1</td>
<td>2%</td>
<td>0</td>
<td>2%</td>
<td>+2</td>
<td>-</td>
</tr>
<tr>
<td>Other</td>
<td>1%</td>
<td>0</td>
<td>1%</td>
<td>0</td>
<td>1%</td>
<td>0</td>
<td>1%</td>
</tr>
<tr class="separator">
<td>Volatility</td>
<td>&#160;</td>
<td>13%</td>
<td>&#160;</td>
<td>7%</td>
<td>&#160;</td>
<td>8%</td>
<td>&#160;</td>
</tr>
</tbody>
</table>
<p>Android在Q3有望超过后面三家的和，Bada还不能对BlackBerry的第四地位有直接威胁，但长远来看，三星这有内存有屏幕有系统的对手岂可小视。</p>
<p>  <strong><br />
<h4>去年比比</h4>
<p></strong>
<p>这一比，Android的崛起和Symbian的衰落更加有戏剧感。基本上Symbian丢掉了整个行业的四分之一的份额，而Android基本上收割了这么多。</p>
<table class="sortable">
<caption>Q2年比</caption>
<tbody>
<tr>
<th>OS</th>
<th>Q2 2011</th>
<th class="narrow" title="Change">ch</th>
<th>Q2 2010</th>
</tr>
<tr>
<td>Android</td>
<td>45%</td>
<td>+27</td>
<td>18%</td>
</tr>
<tr>
<td>iOS</td>
<td>19%</td>
<td>+5</td>
<td>14%</td>
</tr>
<tr>
<td>Symbian</td>
<td>16%</td>
<td>-28</td>
<td>44%</td>
</tr>
<tr>
<td>BlackBerry</td>
<td>12%</td>
<td>-6</td>
<td>18%</td>
</tr>
<tr>
<td>bada</td>
<td>5%</td>
<td>+4</td>
<td>1%</td>
</tr>
<tr>
<td>Windows Mobile</td>
<td>1%</td>
<td>-2</td>
<td>3%</td>
</tr>
<tr>
<td>Windows Phone 7</td>
<td>1%</td>
<td>+1</td>
<td>-</td>
</tr>
<tr>
<td>Other</td>
<td>1%</td>
<td>-1</td>
<td>2%</td>
</tr>
<tr class="separator">
<td>Volatility</td>
<td>&#160;</td>
<td>37%</td>
<td>&#160;</td>
</tr>
</tbody>
</table>
<p>今年的大戏已经基本拍完，那就是Android联合部队搞定了iOS。</p>
<p>  <strong><br />
<h4>Android内部分裂</h4>
<p></strong>
<p>Android联合部队的组成非常复杂。三星和HTC今年各占整个市场的四分之一份额，而去年他们两家大概各卖了三分之一。老大老二的份额减少，彰显了Android老三的位置争夺之精彩：2010的Q3是Motorola，Q4是Sony Ericsson，而过去的两个季度是LG。到年底，可能华为就会扛起老三的大旗。</p>
<table class="sortable">
<caption>Andorid市场销售份额</caption>
<tbody>
<tr>
<th>Vendor</th>
<th>Q2 2011</th>
<th class="narrow" title="Change">ch</th>
<th>Q1 2011</th>
<th class="narrow" title="Change">ch</th>
<th>Q4 2010</th>
<th class="narrow" title="Change">ch</th>
<th>Q3 2010</th>
</tr>
<tr>
<td>Samsung</td>
<td>25%</td>
<td>+1</td>
<td>24%</td>
<td>+1</td>
<td>23%</td>
<td>-8</td>
<td>31%</td>
</tr>
<tr>
<td>HTC</td>
<td>24%</td>
<td>-2</td>
<td>26%</td>
<td>-4</td>
<td>30%</td>
<td>-3</td>
<td>33%</td>
</tr>
<tr>
<td>LG</td>
<td>11%</td>
<td>-2</td>
<td>13%</td>
<td>+3</td>
<td>10%</td>
<td>+2</td>
<td>8%</td>
</tr>
<tr>
<td>Sony Ericsson</td>
<td>11%</td>
<td>-2</td>
<td>13%</td>
<td>-4</td>
<td>17%</td>
<td>+9</td>
<td>8%</td>
</tr>
<tr>
<td>Motorola</td>
<td>9%</td>
<td>-2</td>
<td>11%</td>
<td>-5</td>
<td>16%</td>
<td>-2</td>
<td>18%</td>
</tr>
<tr>
<td>Huawei</td>
<td>8%</td>
<td>+2</td>
<td>6%</td>
<td>+6</td>
<td>-</td>
<td>-</td>
<td>-</td>
</tr>
<tr>
<td>ZTE</td>
<td>6%</td>
<td>+1</td>
<td>5%</td>
<td>+5</td>
<td>-</td>
<td>-</td>
<td>-</td>
</tr>
<tr>
<td>Other</td>
<td>6%</td>
<td>+4</td>
<td>2%</td>
<td>-2</td>
<td>4%</td>
<td>+2</td>
<td>2%</td>
</tr>
<tr class="separator">
<td>Volatility</td>
<td>&#160;</td>
<td>8%</td>
<td>&#160;</td>
<td>15%</td>
<td>&#160;</td>
<td>13%</td>
<td>&#160;</td>
</tr>
</tbody>
</table>
<p>在Android风暴中，获利最多的其实就是华为中兴等小制造商。三星基本守住了，其他的如HTC, LG, Sony Ericsson和Motorola无不出现丢失份额的情况。这种低价Android手机制造商的增长态势正好说明了这两个季度并不能简单的认为是Android手机比其他的智能手机做得好，而应该明白Android手机是智能手机中首先推进中低端市场的。以前本座就<a href="http://lenciel.cn/2010/10/my-first-android-app/">写过</a>，随着Android，iOS这样的平台出现，smart phone和feature phone之间的鸿沟已经被抹平，显然，Android在这方面走得更快。</p>
<p>其他的平台显然也在做往中低端市场进发的准备。Bada这方面做得非常不错，iOS显然也是有解了。Windows和RIM要干啥，大家好像还没有看见。</p>
<p>  <strong><br />
<h4>去年比比</h4>
<p></strong>
<p>同去年相比，三星和HTC两个带头大哥在Android阵营中的份额大跌。Motorola跌了一半，LG和Sony Ecrisson小胜。但愿MotoGoogle能有更好的策略，不然抱着个北美市场是吃不饱的，看看Palm怎么混的就知道了。</p>
<table class="sortable">
<caption>Android市场年比</caption>
<tbody>
<tr>
<th>Vendor</th>
<th>Q2 2011</th>
<th class="narrow" title="Change">ch</th>
<th>Q3 2010</th>
</tr>
<tr>
<td>Samsung</td>
<td>25%</td>
<td>-6</td>
<td>31%</td>
</tr>
<tr>
<td>HTC</td>
<td>24%</td>
<td>-9</td>
<td>33%</td>
</tr>
<tr>
<td>LG</td>
<td>11%</td>
<td>+3</td>
<td>8%</td>
</tr>
<tr>
<td>Sony Ericsson</td>
<td>11%</td>
<td>+3</td>
<td>8%</td>
</tr>
<tr>
<td>Motorola</td>
<td>9%</td>
<td>-9</td>
<td>18%</td>
</tr>
<tr>
<td>Huawei</td>
<td>8%</td>
<td>+8</td>
<td>-</td>
</tr>
<tr>
<td>ZTE</td>
<td>6%</td>
<td>+6</td>
<td>-</td>
</tr>
<tr>
<td>Other</td>
<td>6%</td>
<td>+4</td>
<td>2%</td>
</tr>
<tr class="separator">
<td>Volatility</td>
<td>&#160;</td>
<td>24%</td>
<td>&#160;</td>
</tr>
</tbody>
</table>
<p>从整个市场的数据可以看到，目前所有的小厂商都只有Android平台可用。五巨头里，HTC是没有自己的平台的，其他四个都有(Nokia的虽然土，但是也是一个)。HP的WebOS的最大的接手者就是HTC，当然也有可能三星会拿到。如果WebOS被买断，小厂商就只有选WP平台来补充Android了。预计年底Android将会冲到顶峰，而手机大战其实还远没有到关键时刻：现在大家都在蚕食Symbian吐出来的份额而已。</p>
]]></content:encoded>
			<wfw:commentRss>http://lenciel.cn/2011/08/smartphone_sales_analysis_in_2011_q1_q2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>小囧</title>
		<link>http://lenciel.cn/2010/12/can-not-leave-comment-solved/</link>
		<comments>http://lenciel.cn/2010/12/can-not-leave-comment-solved/#comments</comments>
		<pubDate>Fri, 10 Dec 2010 04:40:51 +0000</pubDate>
		<dc:creator>lenciel</dc:creator>
				<category><![CDATA[档案一理]]></category>
		<category><![CDATA[wordpress]]></category>
		<category><![CDATA[无法留言]]></category>

		<guid isPermaLink="false">http://lenciel.cn/2010/12/can-not-leave-comment-solved/</guid>
		<description><![CDATA[昨天被来留言的嘉宾投诉才知道，原来这段时间这里这么冷清除了自己懒之外，还有一个原因是不能留言啊…… 从来都是放开评论，基本不是设置问题。 禁用Cache插件，还是一样。基本不是cache问题。 换了个模板，还是一样。基本不是语法问题。 版本打回2.9，还是一样。基本不是wordpress问题。 自己登录留言，可以留，基本不是数据库问题。 整了个笨办法，跟了一下comment-post，shoot，原来是你…… 路上有拾遗，发现原来Thread-Comment在留言已经发成功了之后还在不停的Ajax，Ajax，Ajax…有空再看看怎么解决。 麻烦各路FF，IE678，Chrome神仙试试，现在好了没有。]]></description>
			<content:encoded><![CDATA[<p><a href="http://lenciel.cn/wp-content/uploads/2010/12/ac1b3a57d1e96ccb86767974a09fe17c15ccb5ac_m.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="ac1b3a57d1e96ccb86767974a09fe17c15ccb5ac_m" border="0" alt="ac1b3a57d1e96ccb86767974a09fe17c15ccb5ac_m" src="http://lenciel.cn/wp-content/uploads/2010/12/ac1b3a57d1e96ccb86767974a09fe17c15ccb5ac_m_thumb.jpg" width="484" height="272"></a> </p>
<p>昨天被来留言的嘉宾投诉才知道，原来这段时间这里这么冷清除了自己懒之外，还有一个原因是不能留言啊……</p>
<p>从来都是放开评论，基本不是设置问题。</p>
<p>禁用Cache插件，还是一样。基本不是cache问题。</p>
<p>换了个模板，还是一样。基本不是语法问题。</p>
<p>版本打回2.9，还是一样。基本不是wordpress问题。</p>
<p>自己登录留言，可以留，基本不是数据库问题。</p>
<p>整了个笨办法，跟了一下comment-post，shoot，原来是你……</p>
<p>路上有拾遗，发现原来Thread-Comment在留言已经发成功了之后还在不停的Ajax，Ajax，Ajax…有空再看看怎么解决。</p>
<p>麻烦各路FF，IE678，Chrome神仙试试，现在好了没有。</p>
]]></content:encoded>
			<wfw:commentRss>http://lenciel.cn/2010/12/can-not-leave-comment-solved/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>顺便</title>
		<link>http://lenciel.cn/2009/03/update-to-wp271/</link>
		<comments>http://lenciel.cn/2009/03/update-to-wp271/#comments</comments>
		<pubDate>Thu, 19 Mar 2009 12:16:26 +0000</pubDate>
		<dc:creator>lenciel</dc:creator>
				<category><![CDATA[档案一理]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[wordpress 2.7.1]]></category>
		<category><![CDATA[微软雅黑]]></category>

		<guid isPermaLink="false">http://lenciel.cn/2009/03/update-to-wp271/</guid>
		<description><![CDATA[据说wordpress已经2.7.1了，就顺便连着插件一起升级了。 据说21寸的液晶已经白菜价了，就顺便font-size:16px了。 据说有一小撮人长期看不清楚。就顺便提一下浏览器字体。 这张图图是IE的： 这张图图是Firefox的： 本座觉得微软雅黑字体大概是Vista为数不多的好过XP的东西，而且Windows 7里面肯定还是用它。所以大家可以开始用了。如果你已经在系统里面有这个字体，且你用的是IE，建议进一下选项设置字体： 如果你还没有装过，就顺便从本站下载一下吧： 顺便问一句…本座有点忘记《标本制作者》是想写啥了，咋办？]]></description>
			<content:encoded><![CDATA[<p>据说wordpress已经2.7.1了，就顺便连着插件一起升级了。</p>
<p>据说21寸的液晶已经白菜价了，就顺便font-size:16px了。</p>
<p>据说有一小撮人长期看不清楚。就顺便提一下浏览器字体。</p>
<p>这张图图是IE的：</p>
<p><a href="http://lenciel.cn/wp-content/uploads/2009/03/songti.png"><img title="song-ti" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="183" alt="song-ti" src="http://lenciel.cn/wp-content/uploads/2009/03/songti.png" width="480" border="0" /></a> </p>
<p>这张图图是Firefox的：</p>
<p><a href="http://lenciel.cn/wp-content/uploads/2009/03/yahei.png"><img title="ya-hei" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="187" alt="ya-hei" src="http://lenciel.cn/wp-content/uploads/2009/03/yahei.png" width="480" border="0" /></a> </p>
<p>本座觉得<a href="http://zh.wikipedia.org/wiki/%E5%BE%AE%E8%BD%AF%E9%9B%85%E9%BB%91" target="_blank">微软雅黑</a>字体大概是Vista为数不多的好过XP的东西，而且Windows 7里面肯定还是用它。所以大家可以开始用了。如果你已经在系统里面有这个字体，且你用的是IE，建议进一下选项设置字体：</p>
<p><a href="http://lenciel.cn/wp-content/uploads/2009/03/iefontconfig.png"><img title="ie-font-config" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="484" alt="ie-font-config" src="http://lenciel.cn/wp-content/uploads/2009/03/iefontconfig-thumb.png" width="414" border="0" /></a> </p>
<p>如果你还没有装过，就顺便从本站下载一下吧：[Download not found] </p>
<p>顺便问一句…本座有点忘记《标本制作者》是想写啥了，咋办？</p>
]]></content:encoded>
			<wfw:commentRss>http://lenciel.cn/2009/03/update-to-wp271/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>年终讲&#8212;Tool List</title>
		<link>http://lenciel.cn/2008/12/tool-list-2008/</link>
		<comments>http://lenciel.cn/2008/12/tool-list-2008/#comments</comments>
		<pubDate>Fri, 19 Dec 2008 08:53:59 +0000</pubDate>
		<dc:creator>lenciel</dc:creator>
				<category><![CDATA[档案一理]]></category>
		<category><![CDATA[tool list 2008]]></category>

		<guid isPermaLink="false">http://lenciel.cn/2008/12/tool-list-2008/</guid>
		<description><![CDATA[据说，会使用工具是本座和齐天大圣系的区别。 andlinux，因为cygwin或者PuTTY很多地方不够纯粹（比如不能很好的支持screen），而各种vmware也显得麻烦（还容易被WST扫到）。 vim，现在水平还比较土，简单的编辑和常见的插件知道怎么用了。写shell，看c/cpp的代码用。GNU Emacs对本座来说太重了。 Eclipse，用来写java code。还装了一个easyeclipse for python写工具。 Adobe PDF Reader，放弃Foxit，因为在打开很多pdf时不够清晰。 Office，有些惊讶，原来十八摸的文档也是用word写的。 命令行状态下的活，用Yakuake, screen, ZSH。记得最开始我是用urxvt，不记得什么原因开始换成了Yakuake。如果你需要做远程操作而你还没有尝试过screen，至少去试试dtach。在命令行下还会大量用到SSH。如果你也用SSH而你还没有搞懂SSH Tunnel，那…. Firefox 3 portable，插件有Adblock Plus + NoScript + Delicious + WeatherBug + Greasemonkey + FireBug + IE Tab。Delicious再加上它后台可以设置的dailypost功能使得网摘可以以日志的形式发布出来。后面三个都是为了调试Blog，它们都非常好用。 MSN + QQ(QQ上得少，但本座是光荣的腾讯家属)。 Notes 8，尽管傻大笨粗，这是标配。平时自己的邮件，当然Gmail。 amaroK，受不了为了同步ipod就装iTunes这么个软件。 GIMP，这个blog上面的图片处理都是用它完成的。 FileZilla，不管是客户端还是服务器软件，长期是它。 Picasa3，图片管理以及简单的处理，上传也很方便。版本3特别有趣的是增强后的Collage功能，特别适合旅游之后或者毕业之前的场合。 ToDoList，和很多脑子够用的人不同，本座必须有一个工具来跟踪所有的事情。换用过一段时间的gtd-free，结果有一次它因为xml编码出错crash了，丢失了所有的数据。简单，足够，基于xml，开放源码。 Zoundry Raven，把网志写在本地绝对是对的。Zoundry叫Zoundry Raven之后更新得似乎很疲倦。正在换用WLW。 mplayerc + ffdshow + real alternative，还是这三个东西保证本座AV生活。 Autohotkey，穿防火墙，开CIP，打开notes和st，没有你我怎么活。 TotalCommander，继续在用古老的没被加强没被汉化的版本。 workwave，为脖子和背安装的软件，按照偶像派的说法是，你丫一着急就把别人关了。嗯，确实有这个问题。 [...]]]></description>
			<content:encoded><![CDATA[<p>据说，会使用工具是本座和齐天大圣系的区别。</p>
<ol>
<li><a href="http://www.andlinux.org/" target="_blank">andlinux</a>，因为<a href="http://www.cygwin.com/">cygwin</a>或者<a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/">PuTTY</a>很多地方不够纯粹（比如不能很好的支持screen），而各种vmware也显得麻烦（还容易被WST扫到）。</li>
<li><a href="http://www.vim.org/" target="_blank">vim</a>，现在水平还比较土，简单的编辑和常见的插件知道怎么用了。写shell，看c/cpp的代码用。<a href="http://www.gnu.org/software/emacs/">GNU Emacs</a>对本座来说太重了。</li>
<li><a href="www.eclipse.org" target="_blank" class="broken_link">Eclipse</a>，用来写java code。还装了一个<a href="easyeclipse.org" target="_blank" class="broken_link">easyeclipse</a> for python写工具。</li>
<li><a href="www.adobe.com/products/reader/" target="_blank" class="broken_link">Adobe PDF Reader</a>，放弃<a href="www.foxitsoftware.com/" target="_blank" class="broken_link">Foxit</a>，因为在打开很多pdf时不够清晰。</li>
<li>Office，有些惊讶，原来十八摸的文档也是用word写的。</li>
<li>命令行状态下的活，用<a href="yakuake.uv.ro" target="_blank" class="broken_link">Yakuake</a>, <a href="http://www.gnu.org/software/screen/">screen</a>, <a href="http://www.zsh.org/">ZSH</a>。记得最开始我是用<a href="http://software.schmorp.de/pkg/rxvt-unicode.html">urxvt</a>，不记得什么原因开始换成了<a href="yakuake.uv.ro" target="_blank" class="broken_link">Yakuake</a>。如果你需要做远程操作而你还没有尝试过screen，至少去试试<a href="dtach.sourceforge.net/" target="_blank" class="broken_link">dtach</a>。在命令行下还会大量用到SSH。如果你也用SSH而你还没有搞懂<a href="http://www.google.com/search?q=SSH+tunnels&amp;sourceid=navclient-ff&amp;ie=UTF-8&amp;rlz=1B3GGGL_zh-CN___CN231" target="_blank">SSH Tunnel</a>，那….</li>
<li><a href="portableapps.com/apps/internet/firefox_portable/test" target="_blank" class="broken_link">Firefox 3 portable</a>，插件有<a href="http://adblockplus.mozdev.org/">Adblock Plus</a> + <a href="http://www.noscript.net/">NoScript</a> + <a href="http://delicious.com/help" target="_blank">Delicious</a> + <a href="weather.weatherbug.com/labs/firefox-weather-extension.html" target="_blank" class="broken_link">WeatherBug</a> + <a href="http://www.greasespot.net/">Greasemonkey</a> + <a href="https://addons.mozilla.org/en-US/firefox/addon/1843" target="_blank">FireBug</a> + <a href="https://addons.mozilla.org/firefox/addon/1419" target="_blank">IE Tab</a>。<a href="http://delicious.com/help" target="_blank">Delicious</a>再加上它后台可以设置的dailypost功能使得<a href="http://lenciel.cn/2007/04/zuo2ri4sou1gua1290/" target="_blank">网摘可以以日志的形式发布</a>出来。后面三个都是为了调试Blog，它们都非常好用。</li>
<li><a href="messenger.live.com/" class="broken_link">MSN</a> + <a href="http://www.tencent.com" target="_blank">QQ</a>(QQ上得少，但本座是光荣的腾讯家属)。</li>
<li><a href="www.ibm.com/software/sw-lotus/notes" class="broken_link">Notes 8</a>，尽管傻大笨粗，这是标配。平时自己的邮件，当然Gmail。</li>
<li><a href="http://amarok.kde.org/">amaroK</a>，受不了为了同步ipod就装iTunes这么个软件。</li>
<li><a href="http://www.gimp.org/">GIMP</a>，这个blog上面的图片处理都是用它完成的。</li>
<li><a href="http://filezilla-project.org">FileZilla</a>，不管是客户端还是服务器软件，长期是它。</li>
<li><a href="http://picasa.google.com/" target="_blank">Picasa3</a>，图片管理以及简单的处理，上传也很方便。版本3特别有趣的是增强后的<a href="http://www.youtube.com/watch?v=zWgVNzV1OYc" target="_blank">Collage功能</a>，特别适合旅游之后或者毕业之前的场合。</li>
<li><a href="http://www.codeproject.com/KB/applications/todolist2.aspx" target="_blank">ToDoList</a>，和很多脑子够用的人不同，本座必须有一个工具来跟踪所有的事情。换用过一段时间的<a href="sourceforge.net/projects/gtd-free/ " target="_blank" class="broken_link">gtd-free</a>，结果有一次它因为xml编码出错crash了，丢失了所有的数据。简单，足够，基于xml，开放源码。</li>
<li><a href="www.zoundryraven.com/" target="_blank" class="broken_link">Zoundry Raven</a>，把网志写在本地绝对是对的。Zoundry叫<a href="www.zoundryraven.com/" target="_blank" class="broken_link">Zoundry Raven</a>之后更新得似乎很疲倦。正在换用<a href="tucerev01.tucson.ibm.com" target="_blank" class="broken_link">WLW</a>。</li>
<li><a href="sourceforge.net/projects/guliverkli" target="_blank" class="broken_link">mplayerc</a> + <a href="sourceforge.net/projects/ffdshow" target="_blank" class="broken_link">ffdshow</a> + <a href="www.free-codecs.com/download/real_Alternative.htm" target="_blank" class="broken_link">real alternative</a>，还是这三个东西保证本座AV生活。</li>
<li><a href="www.autohotkey.com" target="_blank" class="broken_link">Autohotkey</a>，穿防火墙，开CIP，打开notes和st，没有你我怎么活。</li>
<li><a href="www.ghisler.com/" target="_blank" class="broken_link">TotalCommander</a>，继续在用古老的没被加强没被汉化的版本。</li>
<li><a href="http://www.workrave.org/" target="_blank">workwave</a>，为脖子和背安装的软件，按照偶像派的说法是，你丫一着急就把别人关了。嗯，确实有这个问题。</li>
<li><a href="www.ccleaner.com" target="_blank" class="broken_link">CCleaner</a>，也是多年老相好了。</li>
<li><a href="www.debugmode.com/wink" target="_blank" class="broken_link">wink</a>，经常要截图要归档操作过程的本座……</li>
<li><a href="wordpress.org" target="_blank" class="broken_link">wordpress</a> + <a href="www.wampserver.com/en" target="_blank">wamp</a>，这是这个blog的根基。</li>
</ol>
<p>下面这些是不再使用的软件：</p>
<ul>
<li><strong>Thunderbird</strong>，自从T42移交给Konthiga，公司的本上面有Notes，就没有再装邮件客户端了。</li>
<li><strong>OpenOffice</strong>，道理同上，用公司的本，有正版Office可以用了。</li>
<li><strong>Picpick</strong>，很喜欢的一个截图软件。但是经常会在你编辑的时候丢失截下来的图片，搞得人神经紧张，放弃了。</li>
<li><strong>Cygwin</strong>，再见，Cygwin。</li>
<li><strong>PuTTY</strong>，再见Putty，还有puttycyg。</li>
<li><strong>Tor</strong>，穿墙的速度非常慢。还是远程登录到实验室的机器去上网快很多。</li>
<li><strong>iTunes</strong>，为啥突然从很喜欢变得很不喜欢了呢。</li>
<li><strong>Yupoo</strong>，没有往上面传图片了，也就没有用它的客户端了。</li>
<li><strong>Pidgin</strong>，你叫GAIM的时候给过你次机会，这是第二次。还是不够好。</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://lenciel.cn/2008/12/tool-list-2008/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>第四媒体还是媒体</title>
		<link>http://lenciel.cn/2008/11/sin-of-media/</link>
		<comments>http://lenciel.cn/2008/11/sin-of-media/#comments</comments>
		<pubDate>Thu, 20 Nov 2008 14:31:16 +0000</pubDate>
		<dc:creator>lenciel</dc:creator>
				<category><![CDATA[档案一理]]></category>
		<category><![CDATA[眉头一皱]]></category>
		<category><![CDATA[媒体]]></category>
		<category><![CDATA[百度]]></category>

		<guid isPermaLink="false">http://lenciel.cn/2008/11/sin-of-media/</guid>
		<description><![CDATA[媒，谋也。谋合二姓。 &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#8212;-《说文》 媒从来就不是一个很光明的职业。如果说媒婆造就的是满眼泪痕的无爱婚姻，那么媒体的毒性似乎就更大了。 最近Web业界有发生一些很有标志性意义的事情。比如刘韧被抓，比如百度被K。 按我们习惯的逻辑，你去百度上搜索什么药疗效好，或者是去Donews看奇虎的软件如何，因为得到的信息都没有付费，似乎作为提供信息的刘韧或者百度是不需要负太多责任的。 但是，这几件事情却让我们看到，作为新生代信息提供者的刘韧或者百度们，也许根本就不关心它提供的内容质量如何，可信度多高，它更关心的是可以从信息发布者那边谋求多少利益。这种精神就已经很媒体，很不internet了。 这就好比我们在街头拦住别人问路，常常被指到错误的方向。这也许是因为有人瞎热心，也许是因为有人不用心，但每次都指向洗脚屋的人就是险恶用心了。 有人在网络成了新媒体的时候亢奋，有人为乌托邦沦陷失落。媒体是什么呢？本座无意批判某个行业是彻底礼崩乐坏的，但是，我们21世纪的媒体确实乏善可陈。 基本上来说除开偶尔会把美好东西撕烂给你看，满足你心理的上的需求之外，主要是兜售欲望。媒体让你发现自己又胖又黑，头发发叉皮肤干燥，房子太小车子太旧，汉语里面所有的褒义词，你基本上可以在半个小时的广告节目里面听个饱…….. 买，买，买，媒体希望你买下所有有人在卖的东西，这就是媒体。 钱不是个坏东西，我们一定不能穷。但欲望不是一个很好的东西，还在看童话的时候我们就知道，那些反派角色都代表着欲望。 一个理想的媒体，应该不为钱所奴，应该在中国这个慢慢两极化的社会中搭起桥梁，不要让人们因为物质生活的不同而变得陌生，应该鼓励宽广的胸怀。 当然这样的媒体很难存在。就像宽广的胸怀不像Jonny Walker的广告里面那样靠犯傻就能获得。也许杜斯妥也夫斯基在《卡拉马夫助兄弟》里面的建议比较实在： 首先要善良，然后是诚实，最后是不要轻易遗忘。 CoffeeBreak： [1]最近打算去和电气学院最不淫荡的足球运动员同居，目前住的地方招租。 [2]今天在浦建路那边看到一个pizza店叫比萨狂，人头攒动生意真好。嗯，没有人试过像本座一样把店名反过来念一次么？还是人家真的太敏感？ [3]FBI终于承认本座是一个好青年了。]]></description>
			<content:encoded><![CDATA[<p><a href="http://lenciel.cn/wp-content/uploads/2008/11/0b5b2ec772cd3be4d3c8a185aa40e989d1d7483c-m.jpg"><img title="0b5b2ec772cd3be4d3c8a185aa40e989d1d7483c_m" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; margin-left: 0px; margin-right: 0px; border-right-width: 0px" height="180" alt="0b5b2ec772cd3be4d3c8a185aa40e989d1d7483c_m" src="http://lenciel.cn/wp-content/uploads/2008/11/0b5b2ec772cd3be4d3c8a185aa40e989d1d7483c-m-thumb.jpg" width="232" align="left" border="0" /></a> 媒，谋也。谋合二姓。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#8212;-《说文》</p>
<p>媒从来就不是一个很光明的职业。如果说媒婆造就的是满眼泪痕的无爱婚姻，那么媒体的毒性似乎就更大了。</p>
<p>最近Web业界有发生一些很有标志性意义的事情。比如<a href="http://tech.163.com/08/1120/04/4R5QQ3HU000915BF.html">刘韧被抓</a>，比如<a href="http://www.google.com/search?hl=en&amp;rlz=1B3GGGL_zh-CN___CN231&amp;q=%E7%99%BE%E5%BA%A6+%E5%A4%AE%E8%A7%86&amp;btnG=Search&amp;aq=f&amp;oq=">百度被K</a>。</p>
<p>按我们习惯的逻辑，你去百度上搜索什么药疗效好，或者是去Donews看奇虎的软件如何，因为得到的信息都没有付费，似乎作为提供信息的刘韧或者百度是不需要负太多责任的。</p>
<p>但是，这几件事情却让我们看到，作为新生代信息提供者的刘韧或者百度们，也许根本就不关心它提供的内容质量如何，可信度多高，它更关心的是可以从信息发布者那边谋求多少利益。这种精神就已经很媒体，很不internet了。</p>
<p>这就好比我们在街头拦住别人问路，常常被指到错误的方向。这也许是因为有人瞎热心，也许是因为有人不用心，但每次都指向洗脚屋的人就是险恶用心了。</p>
<p>有人在网络成了<a href="http://www.google.com/search?hl=en&amp;rlz=1B3GGGL_zh-CN___CN231&amp;q=%E7%BD%91%E7%BB%9C+%E7%AC%AC%E5%9B%9B%E5%AA%92%E4%BD%93&amp;btnG=Search&amp;aq=f&amp;oq=">新媒体</a>的时候亢奋，有人为乌托邦沦陷失落。媒体是什么呢？本座无意批判某个行业是彻底礼崩乐坏的，但是，我们21世纪的媒体确实乏善可陈。</p>
<p>基本上来说除开偶尔会把美好东西撕烂给你看，满足你心理的上的需求之外，主要是兜售欲望。媒体让你发现自己又胖又黑，头发发叉皮肤干燥，房子太小车子太旧，汉语里面所有的褒义词，你基本上可以在半个小时的广告节目里面听个饱……..</p>
<p>买，买，买，媒体希望你买下所有有人在卖的东西，这就是媒体。</p>
<p>钱不是个坏东西，我们一定不能穷。但欲望不是一个很好的东西，还在看童话的时候我们就知道，那些反派角色都代表着欲望。</p>
<p>一个理想的媒体，应该不为钱所奴，应该在中国这个慢慢两极化的社会中搭起桥梁，不要让人们因为物质生活的不同而变得陌生，应该鼓励宽广的胸怀。</p>
<p>当然这样的媒体很难存在。就像宽广的胸怀不像Jonny Walker的广告里面那样靠犯傻就能获得。也许杜斯妥也夫斯基在《卡拉马夫助兄弟》里面的建议比较实在：</p>
<blockquote><p>首先要善良，然后是诚实，最后是不要轻易遗忘。</p>
</blockquote>
<p> CoffeeBreak：   <br />[1]最近打算去和电气学院最不淫荡的足球运动员同居，目前住的地方招租。    <br />[2]今天在浦建路那边看到一个pizza店叫<a href="http://waimai.shanghai-wai-mai.com/shanghai-wai-mai/%E6%AF%94%E8%90%A8%E7%8B%82">比萨狂</a>，人头攒动生意真好。嗯，没有人试过像本座一样把店名反过来念一次么？还是人家真的太敏感？    <br />[3]FBI终于承认本座是一个好青年了。</p>
]]></content:encoded>
			<wfw:commentRss>http://lenciel.cn/2008/11/sin-of-media/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>是啊</title>
		<link>http://lenciel.cn/2008/06/so-it-is/</link>
		<comments>http://lenciel.cn/2008/06/so-it-is/#comments</comments>
		<pubDate>Thu, 19 Jun 2008 15:47:01 +0000</pubDate>
		<dc:creator>lenciel</dc:creator>
				<category><![CDATA[关门一看]]></category>
		<category><![CDATA[档案一理]]></category>
		<category><![CDATA[news]]></category>
		<category><![CDATA[欧洲杯]]></category>
		<category><![CDATA[熊猫]]></category>
		<category><![CDATA[王益]]></category>

		<guid isPermaLink="false">http://lenciel.cn/2008/06/so-it-is/</guid>
		<description><![CDATA[关心时事的你们一眼就看出来这不是林肯是范跑跑。 是啊，大家费了很大力气，仅仅是从讨论该不该跑前进到讨论该不该理直气壮说老子就是要跑。 是啊，看欧洲杯显然是有些考验体力的，特别是本座又没有诈尸[1]的习惯。算起来加上午休，回到上海三天才睡了六个小时不到，晚上还去踢了场球。而本座居然现在还光荣的醒着，大概是因为在网上找乐子不是件难事。 比如，某高官[2]被抓居然股市就跳水了，顿时抢劫不如去炒股[3]变成炒股不如被打劫了。 又比如，某好莱坞影片有熊猫赵老师就号召大家群起抵制了，但为什么《花木兰》大家就看得很开心，难道因为木兰无长胸，大家就觉得鬼子吃不到豆腐。 又是啊，汽油涨价了大家快去加油。不过本座还没带油箱的车，只能去给传火炬的人加油。 最后是啊，今天偶然翻到一张图片。是有段时间写ttcn3的编译器，需要分词。本座就去问了问google他们分得怎么样。因为结果让本座颇为吃惊，就截图纪念了一下。 Coffee Break:[1]方便一下还不熟悉本座讲话风格的朋友：我的意思是，先躺下又起来。[2]其实本座是把“王小丫、刘芳菲PK”看成了“王小丫、刘亦菲PK”才关了一心的。[3]好像ps这张图片的哥们儿还被抓了，谁叫你要落款公安局呢。]]></description>
			<content:encoded><![CDATA[<p><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="235" alt="26515202" src="http://lenciel.cn/wp-content/uploads/img/99a92af3c969_166D/26515202_thumb.jpg" width="174" align="left" border="0"></p>
<p>关心时事的你们一眼就看出来这不是林肯是<a href="http://www.google.cn/search?client=aff-cs-worldbrowser&#038;forid=1&#038;ie=utf-8&#038;oe=UTF-8&#038;hl=zh-CN&#038;q=%E8%8C%83%E8%B7%91%E8%B7%91" target="_blank">范跑跑</a>。</p>
<p>是啊，大家费了很大力气，仅仅是从讨论该不该跑前进到讨论该不该理直气壮说老子就是要跑。</p>
<p>是啊，看欧洲杯显然是有些考验体力的，特别是本座又没有诈尸[1]的习惯。算起来加上午休，回到上海三天才睡了六个小时不到，晚上还去踢了场球。而本座居然现在还光荣的醒着，大概是因为在网上找乐子不是件难事。</p>
<p>比如，<a href="http://finance.ifeng.com/people/200806/0615_188_597900.shtml" target="_blank">某高官</a>[2]被抓居然股市就跳水了，顿时<a href="http://news.qq.com/a/20070529/000881.htm" target="_blank">抢劫不如去炒股</a>[3]变成炒股不如被打劫了。</p>
<p>又比如，某好莱坞影片有熊猫赵老师就号召大家群起抵制了，但为什么<a href="http://www.douban.com/subject/1294833/" target="_blank">《花木兰》</a>大家就看得很开心，难道因为木兰无长胸，大家就觉得鬼子吃不到豆腐。</p>
<p>又是啊，汽油涨价了大家快去加油。不过本座还没带油箱的车，只能去给传火炬的人加油。</p>
<p>最后是啊，今天偶然翻到一张图片。是有段时间写ttcn3的编译器，需要分词。本座就去问了问google他们分得<a href="http://translate.google.cn/translate?hl=zh-CN&#038;sl=en&#038;u=http://www.justrage.com/article.php/20070502181540344&#038;sa=X&#038;oi=translate&#038;resnum=1&#038;ct=result&#038;prev=/search%3Fq%3Dleave%2Bme%2Bfucking%2Balone%26complete%3D1%26hl%3Dzh-CN%26newwindow%3D1%26rlz%3D1B3GGGL_zh-CN___CN231" target="_blank">怎么样</a>。因为结果让本座颇为吃惊，就截图纪念了一下。</p>
<p><img style="margin: 5px 5px 5px 65px" height="140" alt="google_trans" src="http://lenciel.cn/wp-content/uploads/img/99a92af3c969_166D/google_trans_thumb.png" width="268"></p>
<p>Coffee Break:<br />[1]方便一下还不熟悉本座讲话风格的朋友：我的意思是，先躺下又起来。<br />[2]其实本座是把“王小丫、刘芳菲PK”看成了“王小丫、刘亦菲PK”才关了一心的。<br />[3]好像ps这张图片的哥们儿还被抓了，谁叫你要落款公安局呢。</p>
]]></content:encoded>
			<wfw:commentRss>http://lenciel.cn/2008/06/so-it-is/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Country For Offlineman</title>
		<link>http://lenciel.cn/2008/04/country-for-offlineman/</link>
		<comments>http://lenciel.cn/2008/04/country-for-offlineman/#comments</comments>
		<pubDate>Thu, 10 Apr 2008 12:04:16 +0000</pubDate>
		<dc:creator>lenciel</dc:creator>
				<category><![CDATA[档案一理]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://lenciel.yo2.cn/articles/country-for-offlineman.html</guid>
		<description><![CDATA[一、前言 我必须说，是Lenciel太喜欢这张插图才起了这个名字。其实，我是一篇技术贴。 可能是以前的公司干活时不让上网的原因，Lenciel非常不习惯在blog上写技术贴。不过昨天在用eclipse+pdt搭调试php的环境过程中，他实在是google得非常怨。排名靠前的文章，比如那个孙高勇的，标题党得很厉害，结果看着看着xampp映入了他的眼帘。能抄得这么脑残，还是非常不易的。 二、正文 WAMP+Eclipse+PDT+XDebug路线，可谓是非常主旋律，根正苗红。 1.安装WAMP WAMP是Mysql、Apache和PHP的集成分布包，安装过程没什么好说的，到WAMP去下载安装就行了。当然在机器上建过SVN库或者Bugzilla服务之类的兄弟对上面三个东西会比较熟悉，也许机器上面已经有了三者中的某些，只用补全即可。 2.安装XDebug 最新版本的XDebug在这里下载。你在什么操作系统是没有疑问的。而PHP的版本，假设你装好的WAMP在[Your Wamp Directory]路径，你应该先去 [Your Wamp Directory]\bin\php\ 下面去看。下载后这个东东放在 [Your Wamp Directory]\bin\php\[Your Wamp PHP Directory]\ext\ 下面。然后你得切换到 [Your Wamp Directory]\bin\apache\[Your Wamp Apache Directory]\bin\ 去修改php.ini文件。在文件末尾，加上： zend_extension_ts="[Wamp Directory]/php/ext/[php_xdebug-file].dll" xdebug.remote_enable=1 xdebug.remote_host="localhost" xdebug.remote_port=9000 xdebug.remote_handler="dbgp" xdebug.show_local_vars=1 xdebug.profiler_enable_trigger=1; xdebug.profiler_output_dir = "[你想放日志的路径]/profiling" 比如我的配置文件是这样的： 现在，你就可以重启Wamp的Apache服务器，让配置生效了。 3.安装Eclipse和PDT 假如你有了版本比较新的Eclipse(3.3+)，只要点击从updatesite升级插件就好了：click 如果你还没有Eclipse(3.3+)，只要去完整下载就好：click 4.调试 因为我们配置了使用xdebug来调试。所以得在你的pdt插件下面做一些修改。首先在Eclipse的plugin文件夹下面找到你的pdt插件目录，大致应该是如下图： 然后在..\resources\php5\路径下找到php.ini，这个文件就是影响你的Eclipse插件工作的。把它修改成用xdebug而不是默认的zend，大概是这样（注意我是把下载的xdebug的动态库也拷贝了一份到这里，所以是相对路径）： 接下来在Eclipse下面给debug做一下配置。先要告诉它xdebug时的php用哪个php可执行文件（这里小阻拦了本座一下，个人觉得，这里要手动添加php的可执行文件是非常搞笑的bug） ： 然后在debugger下面配置你刚刚添加的可执行文件。 新建一个PHP Project，然后新建一个经典的phpInfo页面。如下图： 接着我们就可以调试了。不论是Wordpress还是Mediawiki，都可以作为一个本地项目，按照debug as [...]]]></description>
			<content:encoded><![CDATA[<p><img width="480" src="http://pic.yupoo.com/lenciel/0297955dbe60/lqd1uvpy.jpg" height="230" /></p>
<p>一、前言</p>
<p>我必须说，是Lenciel太喜欢这张插图才起了这个名字。其实，我是一篇技术贴。</p>
<p>可能是以前的公司干活时不让上网的原因，Lenciel非常不习惯在blog上写技术贴。不过昨天在用eclipse+pdt搭调试php的环境过程中，他实在是<a target="_blank" href="http://www.google.cn/search?q=wamp+pdt&#038;sourceid=navclient-ff&#038;ie=UTF-8&#038;rlz=1B3GGGL_zh-CN___CN231">google得</a>非常怨。排名靠前的文章，比如那个<a target="_blank" href="http://blog.chinaunix.net/u/15722/showart_441008.html">孙高勇</a>的，标题党得很厉害，结果看着看着xampp映入了他的眼帘。能抄得这么脑残，还是非常不易的。</p>
<p>二、正文</p>
<p>WAMP+Eclipse+PDT+XDebug路线，可谓是非常主旋律，根正苗红。</p>
<p>1.安装WAMP</p>
<p>WAMP是Mysql、Apache和PHP的集成分布包，安装过程没什么好说的，到<a target="_blank" href="http://www.wampserver.com/">WAMP</a>去下载安装就行了。当然在机器上建过SVN库或者Bugzilla服务之类的兄弟对上面三个东西会比较熟悉，也许机器上面已经有了三者中的某些，只用补全即可。</p>
<p>2.安装XDebug</p>
<p>最新版本的XDebug在<a target="_blank" href="http://www.xdebug.com/">这里</a>下载。你在什么操作系统是没有疑问的。而PHP的版本，假设你装好的WAMP在[Your Wamp Directory]路径，你应该先去</p>
<p><strong>[Your Wamp Directory]</strong>\bin\php\</p>
<p>下面去看。下载后这个东东放在</p>
<p>[Your Wamp Directory]\bin\php\<strong>[Your Wamp PHP Directory]</strong>\ext\</p>
<p>下面。然后你得切换到</p>
<p>[Your Wamp Directory]\bin\apache\<strong>[Your Wamp Apache Directory]</strong>\bin\</p>
<p>去修改php.ini文件。在文件末尾，加上：</p>
<p><pre name="code" class="php">
zend_extension_ts="[Wamp Directory]/php/ext/[php_xdebug-file].dll"
xdebug.remote_enable=1
xdebug.remote_host="localhost"
xdebug.remote_port=9000
xdebug.remote_handler="dbgp"
xdebug.show_local_vars=1
xdebug.profiler_enable_trigger=1;
xdebug.profiler_output_dir = "[你想放日志的路径]/profiling"
</pre>
</p>
<p>比如我的配置文件是这样的：</p>
<p><img width="500" src="http://pic.yupoo.com/lenciel/584685617521/medium.jpg" height="198" /></p>
<p>现在，你就可以重启Wamp的Apache服务器，让配置生效了。<br />
3.安装Eclipse和PDT</p>
<p>假如你有了版本比较新的Eclipse(3.3+)，只要点击从updatesite升级插件就好了：<a target="_blank" href="http://download.eclipse.org/tools/pdt/updates/">click</a></p>
<p>如果你还没有Eclipse(3.3+)，只要去完整下载就好：<a target="_blank" href="http://download.eclipse.org/tools/pdt/downloads/">click</a><br />
4.调试</p>
<p>因为我们配置了使用xdebug来调试。所以得在你的pdt插件下面做一些修改。首先在Eclipse的plugin文件夹下面找到你的pdt插件目录，大致应该是如下图：</p>
<p><img width="388" src="http://pic.yupoo.com/lenciel/462465617520/rqnuc1a5.jpg" height="170" /></p>
<p>然后在..\resources\php5\路径下找到php.ini，这个文件就是影响你的Eclipse插件工作的。把它修改成用xdebug而不是默认的zend，大概是这样（注意我是把下载的xdebug的动态库也拷贝了一份到这里，所以是相对路径）：</p>
<p><img width="500" src="http://pic.yupoo.com/lenciel/988715617521/medium.jpg" height="131" /></p>
<p>接下来在Eclipse下面给debug做一下配置。先要告诉它xdebug时的php用哪个php可执行文件（这里小阻拦了本座一下，个人觉得，这里要手动添加php的可执行文件是非常搞笑的bug） ：</p>
<p><img width="500" src="http://pic.yupoo.com/lenciel/003185617520/medium.jpg" height="240" /></p>
<p>然后在debugger下面配置你刚刚添加的可执行文件。</p>
<p><img width="500" src="http://pic.yupoo.com/lenciel/226335617520/medium.jpg" height="249" /></p>
<p>新建一个PHP Project，然后新建一个经典的phpInfo页面。如下图：</p>
<p><img width="500" src="http://pic.yupoo.com/lenciel/860345617520/medium.jpg" height="337" /></p>
<p>接着我们就可以调试了。不论是Wordpress还是Mediawiki，都可以作为一个本地项目，按照debug as a web page的模式去调试了。</p>
<p>延伸阅读：<br />
lifehacker上面一篇不错的wiki安装指导 &#8211; <a target="_blank" href="http://lifehacker.com/software/wikipedia/geek-to-live-set-up-your-personal-wikipedia-163707.php">click</a></p>
]]></content:encoded>
			<wfw:commentRss>http://lenciel.cn/2008/04/country-for-offlineman/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

