<?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>Alex&#39;s Blog</title>
        <link>http://difan.org.cn/</link>
        <description>Stuff that doesn&#39;t matter.</description>
        <lastBuildDate>Fri, 18 May 2012 13:31:59 GMT</lastBuildDate>
        <language>zh-CN</language>
        <sy:updatePeriod>hourly</sy:updatePeriod>
        <sy:updateFrequency>1</sy:updateFrequency>
        <generator>https://bitbucket.org/tifan/aluminum-blog/</generator>

        <item>
            <title>“管你开源不开源”</title>
            <link>http://difan.org.cn/blog/who-cares-if-it-is-open-source</link>
            <comments>http://difan.org.cn/blog/who-cares-if-it-is-open-source#comments</comments>
            <pubDate>Mon, 05 Mar 2012 16:46:55 GMT</pubDate>
            <dc:creator>Alex</dc:creator>
            <guid isPermaLink="true">http://difan.org.cn/blog/who-cares-if-it-is-open-source</guid>
            <description><![CDATA[<p>给你源代码又怎么样呢？</p>
<p>对于大部分人来说，Who cares? 我只是要用这个软件而已，哪里来的这么多需要 modification 的时候？再者说来，复杂的软件就算给你源代码，和不给源代码也是一样的。比如某个 wifi 卡的驱动，我关心的其实只是能不能用而已，我真的不 care 这是不是开源的。不过，如果不开源，还真没法用&hellip;&hellip; 因为你无论如何都要源码编译成二进制内核模块。在这点上， Linux 不如 Windows 的 flexibility，因为 Windows 2000 的驱动给 Windows Server 2008 R2 用大概都不会有问题的吧。反正 2k 的驱动常给 xp 用。</p>]]></description>
            <content:encoded><![CDATA[<p>给你源代码又怎么样呢？</p>
<p>对于大部分人来说，Who cares? 我只是要用这个软件而已，哪里来的这么多需要 modification 的时候？再者说来，复杂的软件就算给你源代码，和不给源代码也是一样的。比如某个 wifi 卡的驱动，我关心的其实只是能不能用而已，我真的不 care 这是不是开源的。不过，如果不开源，还真没法用&hellip;&hellip; 因为你无论如何都要源码编译成二进制内核模块。在这点上， Linux 不如 Windows 的 flexibility，因为 Windows 2000 的驱动给 Windows Server 2008 R2 用大概都不会有问题的吧。反正 2k 的驱动常给 xp 用。</p>
                ]]></content:encoded>
            </item>
        <item>
            <title>2011结束了</title>
            <link>http://difan.org.cn/blog/end-of-2011</link>
            <comments>http://difan.org.cn/blog/end-of-2011#comments</comments>
            <pubDate>Sun, 01 Jan 2012 05:00:00 GMT</pubDate>
            <dc:creator>Alex</dc:creator>
            <guid isPermaLink="true">http://difan.org.cn/blog/end-of-2011</guid>
            <description><![CDATA[<p>想来想去，还真没什么好写的。</p>
<p>2011的大事儿：来美国</p>
<p>还有什么要说的么？</p>
<p>当然，其实技术水平的进步还是比较大的，C以及计算机工作原理有了深刻的了解，顺便学习使用了Django，也开始了自定义配置文件，还写了一大堆脚本，数学也稍微学了一点儿。</p>
<p>总体上，感觉来美国还是挺值得的。</p>]]></description>
            <content:encoded><![CDATA[<p>想来想去，还真没什么好写的。</p>
<p>2011的大事儿：来美国</p>
<p>还有什么要说的么？</p>
<p>当然，其实技术水平的进步还是比较大的，C以及计算机工作原理有了深刻的了解，顺便学习使用了Django，也开始了自定义配置文件，还写了一大堆脚本，数学也稍微学了一点儿。</p>
<p>总体上，感觉来美国还是挺值得的。</p>
                ]]></content:encoded>
            </item>
        <item>
            <title>两耳不闻天下事，一心只想破密码</title>
            <link>http://difan.org.cn/blog/crack-of-csdn-database</link>
            <comments>http://difan.org.cn/blog/crack-of-csdn-database#comments</comments>
            <pubDate>Thu, 22 Dec 2011 10:09:34 GMT</pubDate>
            <dc:creator>Alex</dc:creator>
            <guid isPermaLink="true">http://difan.org.cn/blog/crack-of-csdn-database</guid>
            <description><![CDATA[<p>当然啦，我们知道，这次根本不是破密码&mdash;&mdash;这是数据库被人家拿回来了。</p>
<p>一下子，我在推特上看到了一大把人大骂，CSDN这个混蛋，居然明文存放密码。明文密码呢，显然是不对的。CSDN帐号，其实意义并不大，一个论坛/下载站而已，但是这个数据库对于社会工程学攻击者来说，意义是重大的。</p>
<p>社会工程学攻击是一种常见的攻击，这种攻击主要利用人们的好奇以及同情以及自然的反应、人性的弱点实施的定向攻击。对于社会工程学来说，第一步就是抓住一个方向。抓方向何谈容易！为了避免打草惊蛇，一般社会工程学家（包括我在内）都会想方设法通过一点点蛛丝马迹追踪到这个人的个人身份。幸而现在我们有互联网，而且很大程度上，大家都依赖于电子邮件这个很方便的交流方式（虽然中国，你们懂得）。通过电子邮件、即时通信（特别是中国）、短信的方式进行背景调查是十分常见的。如果你没有遇到过，恭喜，因为你没有引起他们的注意。</p>
<p>拿到这份 CSDN 密码之后，我的第一反应就是这一下，很多人的在线身份完全沦陷了。这不禁也让我想到我会遇到什么情况。CSDN是我2005年左右注册的，使用的是一个非常老的强密码，因为和 Windows 没什么交集，基本只是去下载东西而已。不过，百度账户因为是同时期注册的，显然也用了一样的密码，刚刚才改掉。在线身份的构建是很不容易的一件事情，而且，在线身份并不完全是在线的&mdash;&mdash;例如，邮箱-网银的关系。其实，我们将所有的账户关系梳理清楚就会发现，所有的账户其实最后都指向的是电邮。如果所有的密码都一样，对于攻击者来说是最好不过的：在线隐私将完全化为乌有，一切尽在攻击者的手中。这也是为什么我说在线身份会完全沦陷。</p>
<p>作为社工研究者以及实施者，我是非常不情愿的告诉大家如何防范此类攻击的。但是，当几千万的用户资料完全暴露于攻击者的面前时，一切都不是这么简单了&mdash;&mdash;攻击也是要进行 ethical 的攻击的，虽然绝大部分时候这不是 ethical 的行为。所以，为了更多人的利益，请遵守以下的行为准则：</p>
<ul>
<li>每个网站使用不同的密码，使 CSDN 这种情况发生时可以避免直接损伤</li>
<li>使用较强的密码，8位以上大小写数字以及特殊字符的混合是最好的选择，若网站数据库泄漏时网站做了一般性加密（例如纯 MD5），还是可以保护自己避免直接的暴力破解攻击</li>
<li>在不受信任的网站里使用临时电邮以及临时密码进行注册，或者去 bugmenot 查找已有的密码</li>
<li>在关键网站，例如网银中使用最高强度的密码，并在使用前确保系统的安全性。使用 Linux/Mac OS X 是很好的选择</li>
<li>将密码发给我备案，邮箱是 alex 在 difan.org.cn</li>
</ul>
<p>最后，传播不传播文件的已经无所谓了，在 P2P 网络上存在，有心人会有办法下载回来的。抓紧改密码。</p>
<p>另，校内网密码也惨遭泄漏，经与校内的副总裁黄晶联系，他表示这群用户将被指引修改密码。自查链接请点击页面最上方的 Services 按钮。</p>
<p>-EOF-</p>]]></description>
            <content:encoded><![CDATA[<p>当然啦，我们知道，这次根本不是破密码&mdash;&mdash;这是数据库被人家拿回来了。</p>
<p>一下子，我在推特上看到了一大把人大骂，CSDN这个混蛋，居然明文存放密码。明文密码呢，显然是不对的。CSDN帐号，其实意义并不大，一个论坛/下载站而已，但是这个数据库对于社会工程学攻击者来说，意义是重大的。</p>
<p>社会工程学攻击是一种常见的攻击，这种攻击主要利用人们的好奇以及同情以及自然的反应、人性的弱点实施的定向攻击。对于社会工程学来说，第一步就是抓住一个方向。抓方向何谈容易！为了避免打草惊蛇，一般社会工程学家（包括我在内）都会想方设法通过一点点蛛丝马迹追踪到这个人的个人身份。幸而现在我们有互联网，而且很大程度上，大家都依赖于电子邮件这个很方便的交流方式（虽然中国，你们懂得）。通过电子邮件、即时通信（特别是中国）、短信的方式进行背景调查是十分常见的。如果你没有遇到过，恭喜，因为你没有引起他们的注意。</p>
<p>拿到这份 CSDN 密码之后，我的第一反应就是这一下，很多人的在线身份完全沦陷了。这不禁也让我想到我会遇到什么情况。CSDN是我2005年左右注册的，使用的是一个非常老的强密码，因为和 Windows 没什么交集，基本只是去下载东西而已。不过，百度账户因为是同时期注册的，显然也用了一样的密码，刚刚才改掉。在线身份的构建是很不容易的一件事情，而且，在线身份并不完全是在线的&mdash;&mdash;例如，邮箱-网银的关系。其实，我们将所有的账户关系梳理清楚就会发现，所有的账户其实最后都指向的是电邮。如果所有的密码都一样，对于攻击者来说是最好不过的：在线隐私将完全化为乌有，一切尽在攻击者的手中。这也是为什么我说在线身份会完全沦陷。</p>
<p>作为社工研究者以及实施者，我是非常不情愿的告诉大家如何防范此类攻击的。但是，当几千万的用户资料完全暴露于攻击者的面前时，一切都不是这么简单了&mdash;&mdash;攻击也是要进行 ethical 的攻击的，虽然绝大部分时候这不是 ethical 的行为。所以，为了更多人的利益，请遵守以下的行为准则：</p>
<ul>
<li>每个网站使用不同的密码，使 CSDN 这种情况发生时可以避免直接损伤</li>
<li>使用较强的密码，8位以上大小写数字以及特殊字符的混合是最好的选择，若网站数据库泄漏时网站做了一般性加密（例如纯 MD5），还是可以保护自己避免直接的暴力破解攻击</li>
<li>在不受信任的网站里使用临时电邮以及临时密码进行注册，或者去 bugmenot 查找已有的密码</li>
<li>在关键网站，例如网银中使用最高强度的密码，并在使用前确保系统的安全性。使用 Linux/Mac OS X 是很好的选择</li>
<li>将密码发给我备案，邮箱是 alex 在 difan.org.cn</li>
</ul>
<p>最后，传播不传播文件的已经无所谓了，在 P2P 网络上存在，有心人会有办法下载回来的。抓紧改密码。</p>
<p>另，校内网密码也惨遭泄漏，经与校内的副总裁黄晶联系，他表示这群用户将被指引修改密码。自查链接请点击页面最上方的 Services 按钮。</p>
<p>-EOF-</p>
                ]]></content:encoded>
            </item>
        <item>
            <title>A Tale of Screen RAM</title>
            <link>http://difan.org.cn/blog/a-tale-of-screen-ram</link>
            <comments>http://difan.org.cn/blog/a-tale-of-screen-ram#comments</comments>
            <pubDate>Thu, 15 Dec 2011 05:16:14 GMT</pubDate>
            <dc:creator>Alex</dc:creator>
            <guid isPermaLink="true">http://difan.org.cn/blog/a-tale-of-screen-ram</guid>
            <description><![CDATA[<p>
	考完托福，从 @kDolphin 那里看到了小米提出的新概念&mdash;&mdash;屏幕 RAM。作为一个对嵌入式一知半解，也玩过单片机的&lt;del&gt;化学&lt;/del&gt;&lt;del&gt;计算机&lt;/del&gt;好人修电脑系学生，我对此概念十分不解&mdash;&mdash;莫非来美国大农村呆了一年就这么赶不上科技的潮流了？<br />
	<br />
	于是，根据小米等各种论坛的线索，我大致归纳了&ldquo;屏幕RAM&rdquo;的几个特点：</p>
<ul>
	<li>
		这是一种缓存机制，使得 GPU 只需要运算 delta 值。在没有此机制的屏幕上绘图要求 GPU 不断的工作，产生图形</li>
	<li>
		这种机制可以得到性能的提升，原因是 GPU 不需要 concentrace on 不断的渲染相同的图像</li>
	<li>
		这种机制可以节约电量</li>
	<li>
		这种机制主要应用在高端手机上</li>
	<li>
		这种机制的成本是 80 元人民币，约合 $15</li>
</ul>
<p>
	<br />
	暂且抛开这种机制在一边，我们看一看 LCD 的显示原理。<br />
	<br />
	不管是 TTF 还是较早的 STN 屏幕，其都是由一个一个的亚像素（彩色显示器）/栅格（灰度显示器）组成的。给液晶分子加上一个电压，液晶分子将改变其光透射特性，这可能 result in 颜色的改变（对于彩色显示器），或者透光度的改变（对于黑白显示器）。外加电场消失时，透光度恢复。不管是什么技术，他们的基本原理都是这样的。<br />
	<br />
	如果有一些嵌入式开发经验，可能将 LCD 看作一组寄存器的概念更能接受&mdash;&mdash;实际上，我们无法对 LCD 直接进行操作，我们操作的对象是 LCD 控制器，控制器控制各个像素/栅格的状态，这也是为了节省宝贵的 IO 端口。可以将 LCD 作为一组寄存器操作的 LCD 面板叫做 &ldquo;智能 LCD 面板&ldquo;。这种面板自带的控制器中含有 FrameBuffer (帧缓存) 甚至渲染引擎。我们在嵌入式开发中常用的 1602 屏幕就自带了显示引擎、字库以及帧缓存。而有一些其他的屏幕，例如 S3C2440 开发板中常用的某些 LCD 屏幕就没有自己的帧缓存、显示引擎，这种屏幕叫做&rdquo;哑面板&ldquo;。哑面板需要外置的 LCD 控制器，而智能面板不需要额外的 LCD 控制器。<br />
	<br />
	帧缓存这个名词听起来有一点点绕口，其实它更通俗的名字叫做&rdquo;显存&ldquo;。显示引擎预先渲染一些内容，并将其保存在显存中，如果显存太小，则显示控制器将不断的运行，有可能导致的是因为运算能力较差产生 lag。另一方面，带有 LCD 控制器的面板可以接受高级指令，也不需要外界（这里的系统定义为 LCD）的额外控制（除了时钟源）就可以保持显示内容。显然，这种 LCD 因为内置了显示引擎而造成成本的增加。然而，哑面板虽然成本低，但需要外界不断的刷新内容而保持屏幕的正常显示，这无疑将增加外界的计算压力。<br />
	<br />
	这里，作为读者，你可能会自然的想到，这与上面小米的 assertion match exactly. 那么，小米说的是实话么？其实，不尽然。<br />
	<br />
	我们都知道，现代计算机中的一个重要组成部分叫做显示适配器，俗称显卡。手机等嵌入式设备也不例外，但是由于其空间受限制，一般更倾向于 SoC 设计。内置 LCD 控制器的智能 LCD 似乎很适合，但是我们知道，2008年之后的手机市场已经开始很荒谬的开始了性能竞争&mdash;&mdash;例如我现在使用的 iPhone 4S 的主频是 800MHz&mdash;&mdash;作为对比，2009 年我购买的 HTC Dream 的主频是 384MHz，2007 年我购买的 Motorola Rokr E6 则是 313MHz 的主频。当然，上面是废话。LCD 控制器的内置&rdquo;显卡&ldquo;毫无疑问相比于英伟达等专业厂商的显卡是很弱的。尽管哑面板没有帧缓存，要求不断的刷新屏幕，并使用了更多的总线带宽（显示器的带宽总是很大的），但是&mdash;&mdash;无论如何，这些工作都是需要做的，不管是液晶面板做了，还是面板外进行的。<br />
	<br />
	小米手机的 GPU，根据公共可得的数据，是 Adreno 220。我查阅了此款 GPU 的资料，得知这是一款 SoC 的 GPU 方案，内置 SRAM FrameBuffer。当然了，苹果的 A5 处理器一样是 SoC 设计，也内置了 FrameBuffer。另一方面，根据魅族公布的资料，魅族 MX 的 GPU 也是 SoC 实现的 Cortex-A9 + Mali-400MP GPU。这款片上同样集成了一定数量的内存作为帧缓存使用，根据 ARM 的介绍，其最大支持的帧缓存大小为单帧4096x4096。<br />
	<br />
	即使说到这里，可能还是有一些读者不理解他们有什么太大的差距，在这里，我直接给出结论以及推导结论的 reasoning 过程：<br />
	<br />
	Whereas the goal of displaying graphics should be archived, there must be some particular chipset computing for the LCD display panel;<br />
	The computation can either be on the LCD controller with a smart panel or on the host with a dump panel;<br />
	Both phones have a built-in Graphical Processing Unit which fills the framebuffer, embedded in the chipset;<br />
	<br />
	Thus, both phone functions in the exactly the same way with different chipsets.<br />
	<br />
	由于填充 framebuffer 的过程必须由内置的 GPU 完成，则显示器将显示来自 framebuffer 的内容。既然两种手机都显示来自 framebuffer 的内容，那么不管他们选择什么样的液晶面板，都会达到一样的效果，那就是帧缓存在液晶屏幕之外。<br />
	<br />
	作为初步结论，我认为，屏幕RAM应该是指的液晶面板内的 FrameBuffer。在当前的运行模式下，其存在的意义不大，在硬件抽象层之上，操作系统是不需要关心这种实现的。尽管哑面板有着种种缺点，但因为目前的设计，实际上智能面板的&ldquo;智能部分&rdquo;已经由更加智能的智能手机片内的 GPU 所完成。因此，小米抛出的&ldquo;帧缓存&rdquo;是比较没有讨论意义的。<br />
	<br />
	从另一个方面上看，小米的争论其实也是无效的争论。倘若小米的论据和结论都是有效的，这对于一个正常的企业是不可忍受的&mdash;&mdash;种种迹象表明魅族并不是一个打一枪就走人的公司，其更多的是很负责任的公司，从各种细节就可以看出。我只购买过一个魅族 M6 音乐播放器，非常耐用，而且服务不错。80 元的成本，相比 3000 元的定价来说，如果不是利润已经被压缩到不可以接受的地步，正常的企业是不会为此而生产有严重缺陷的产品的。</p>
]]></description>
            <content:encoded><![CDATA[<p>
	考完托福，从 @kDolphin 那里看到了小米提出的新概念&mdash;&mdash;屏幕 RAM。作为一个对嵌入式一知半解，也玩过单片机的&lt;del&gt;化学&lt;/del&gt;&lt;del&gt;计算机&lt;/del&gt;好人修电脑系学生，我对此概念十分不解&mdash;&mdash;莫非来美国大农村呆了一年就这么赶不上科技的潮流了？<br />
	<br />
	于是，根据小米等各种论坛的线索，我大致归纳了&ldquo;屏幕RAM&rdquo;的几个特点：</p>
<ul>
	<li>
		这是一种缓存机制，使得 GPU 只需要运算 delta 值。在没有此机制的屏幕上绘图要求 GPU 不断的工作，产生图形</li>
	<li>
		这种机制可以得到性能的提升，原因是 GPU 不需要 concentrace on 不断的渲染相同的图像</li>
	<li>
		这种机制可以节约电量</li>
	<li>
		这种机制主要应用在高端手机上</li>
	<li>
		这种机制的成本是 80 元人民币，约合 $15</li>
</ul>
<p>
	<br />
	暂且抛开这种机制在一边，我们看一看 LCD 的显示原理。<br />
	<br />
	不管是 TTF 还是较早的 STN 屏幕，其都是由一个一个的亚像素（彩色显示器）/栅格（灰度显示器）组成的。给液晶分子加上一个电压，液晶分子将改变其光透射特性，这可能 result in 颜色的改变（对于彩色显示器），或者透光度的改变（对于黑白显示器）。外加电场消失时，透光度恢复。不管是什么技术，他们的基本原理都是这样的。<br />
	<br />
	如果有一些嵌入式开发经验，可能将 LCD 看作一组寄存器的概念更能接受&mdash;&mdash;实际上，我们无法对 LCD 直接进行操作，我们操作的对象是 LCD 控制器，控制器控制各个像素/栅格的状态，这也是为了节省宝贵的 IO 端口。可以将 LCD 作为一组寄存器操作的 LCD 面板叫做 &ldquo;智能 LCD 面板&ldquo;。这种面板自带的控制器中含有 FrameBuffer (帧缓存) 甚至渲染引擎。我们在嵌入式开发中常用的 1602 屏幕就自带了显示引擎、字库以及帧缓存。而有一些其他的屏幕，例如 S3C2440 开发板中常用的某些 LCD 屏幕就没有自己的帧缓存、显示引擎，这种屏幕叫做&rdquo;哑面板&ldquo;。哑面板需要外置的 LCD 控制器，而智能面板不需要额外的 LCD 控制器。<br />
	<br />
	帧缓存这个名词听起来有一点点绕口，其实它更通俗的名字叫做&rdquo;显存&ldquo;。显示引擎预先渲染一些内容，并将其保存在显存中，如果显存太小，则显示控制器将不断的运行，有可能导致的是因为运算能力较差产生 lag。另一方面，带有 LCD 控制器的面板可以接受高级指令，也不需要外界（这里的系统定义为 LCD）的额外控制（除了时钟源）就可以保持显示内容。显然，这种 LCD 因为内置了显示引擎而造成成本的增加。然而，哑面板虽然成本低，但需要外界不断的刷新内容而保持屏幕的正常显示，这无疑将增加外界的计算压力。<br />
	<br />
	这里，作为读者，你可能会自然的想到，这与上面小米的 assertion match exactly. 那么，小米说的是实话么？其实，不尽然。<br />
	<br />
	我们都知道，现代计算机中的一个重要组成部分叫做显示适配器，俗称显卡。手机等嵌入式设备也不例外，但是由于其空间受限制，一般更倾向于 SoC 设计。内置 LCD 控制器的智能 LCD 似乎很适合，但是我们知道，2008年之后的手机市场已经开始很荒谬的开始了性能竞争&mdash;&mdash;例如我现在使用的 iPhone 4S 的主频是 800MHz&mdash;&mdash;作为对比，2009 年我购买的 HTC Dream 的主频是 384MHz，2007 年我购买的 Motorola Rokr E6 则是 313MHz 的主频。当然，上面是废话。LCD 控制器的内置&rdquo;显卡&ldquo;毫无疑问相比于英伟达等专业厂商的显卡是很弱的。尽管哑面板没有帧缓存，要求不断的刷新屏幕，并使用了更多的总线带宽（显示器的带宽总是很大的），但是&mdash;&mdash;无论如何，这些工作都是需要做的，不管是液晶面板做了，还是面板外进行的。<br />
	<br />
	小米手机的 GPU，根据公共可得的数据，是 Adreno 220。我查阅了此款 GPU 的资料，得知这是一款 SoC 的 GPU 方案，内置 SRAM FrameBuffer。当然了，苹果的 A5 处理器一样是 SoC 设计，也内置了 FrameBuffer。另一方面，根据魅族公布的资料，魅族 MX 的 GPU 也是 SoC 实现的 Cortex-A9 + Mali-400MP GPU。这款片上同样集成了一定数量的内存作为帧缓存使用，根据 ARM 的介绍，其最大支持的帧缓存大小为单帧4096x4096。<br />
	<br />
	即使说到这里，可能还是有一些读者不理解他们有什么太大的差距，在这里，我直接给出结论以及推导结论的 reasoning 过程：<br />
	<br />
	Whereas the goal of displaying graphics should be archived, there must be some particular chipset computing for the LCD display panel;<br />
	The computation can either be on the LCD controller with a smart panel or on the host with a dump panel;<br />
	Both phones have a built-in Graphical Processing Unit which fills the framebuffer, embedded in the chipset;<br />
	<br />
	Thus, both phone functions in the exactly the same way with different chipsets.<br />
	<br />
	由于填充 framebuffer 的过程必须由内置的 GPU 完成，则显示器将显示来自 framebuffer 的内容。既然两种手机都显示来自 framebuffer 的内容，那么不管他们选择什么样的液晶面板，都会达到一样的效果，那就是帧缓存在液晶屏幕之外。<br />
	<br />
	作为初步结论，我认为，屏幕RAM应该是指的液晶面板内的 FrameBuffer。在当前的运行模式下，其存在的意义不大，在硬件抽象层之上，操作系统是不需要关心这种实现的。尽管哑面板有着种种缺点，但因为目前的设计，实际上智能面板的&ldquo;智能部分&rdquo;已经由更加智能的智能手机片内的 GPU 所完成。因此，小米抛出的&ldquo;帧缓存&rdquo;是比较没有讨论意义的。<br />
	<br />
	从另一个方面上看，小米的争论其实也是无效的争论。倘若小米的论据和结论都是有效的，这对于一个正常的企业是不可忍受的&mdash;&mdash;种种迹象表明魅族并不是一个打一枪就走人的公司，其更多的是很负责任的公司，从各种细节就可以看出。我只购买过一个魅族 M6 音乐播放器，非常耐用，而且服务不错。80 元的成本，相比 3000 元的定价来说，如果不是利润已经被压缩到不可以接受的地步，正常的企业是不会为此而生产有严重缺陷的产品的。</p>

                ]]></content:encoded>
            </item>
        <item>
            <title>从不和谐的 Android 市场开始扯</title>
            <link>http://difan.org.cn/blog/starting-from-nonhexie-Android-in-China</link>
            <comments>http://difan.org.cn/blog/starting-from-nonhexie-Android-in-China#comments</comments>
            <pubDate>Mon, 28 Nov 2011 00:43:31 GMT</pubDate>
            <dc:creator>Alex</dc:creator>
            <guid isPermaLink="true">http://difan.org.cn/blog/starting-from-nonhexie-Android-in-China</guid>
            <description><![CDATA[<p>最近Android是越来越火了。火的背后我们也看到了很多的不和谐。</p>
<p>09年的时候，我开始使用的 Android 手机。那是一个黑暗的时代&mdash;&mdash;当时我在使用中国移动的手机卡，流量有限，每月 80MB，20大洋。好在墙并没这么厉害，拿到手机以后，上 Market 下载 Google Pinyin，输入中文一切正常，倒也可以用了。不过，因为 Android 当时刚刚出现不久，中国基本没用户，移动互联网基本靠 WAP，内容基本是 WML，我需要一个支持 WML 的浏览器。想过写一个 WML Transformer 到 HTML，最终没写，因此上网看电脑网站舍不得，只能上手机校内、推特。想用 QQ? 没门。</p>
<p>于是，有了基于 Java 模拟器 (MicroEmulator) 的 Opera Mini，还可以直接穿墙。用的不亦乐乎。</p>
<p>后来，Android 手机果然越来越流行了。我个人感觉是因为没有 license fee: 任何手机厂商直接拿来源代码，写点驱动，就是一款新机器，拚配置就卖得掉&mdash;&mdash;买 Android 的多半是技术悾，配置就是一切，于是我们看到了各种大屏幕、双核 CPU，独立显卡（汗），硬解码芯片（硬解RMVB看XXX神马的），以及&mdash;&mdash;越来越短的待机时间。G1 的电池已经足够悲剧，悲剧的是似乎后来的 Android 手机用同样容量的电池待机时间还不如 G1。上大学时，兜里4块电池是常事儿，特别是出去旅游的时候。</p>
<p>后来，Android 手机越来越便宜了&mdash;&mdash;MTK发力，显然就有便宜手机了。不过，似乎中国市场的 Android 机器有点奇怪&mdash;&mdash;没有 Google Apps。从默认搜索引擎到输入法再到地图、邮件、市场，统统没有 Google 的份儿。Instead, 我们看到<a href="http://www.cnbeta.com/articles/117298.htm">默认搜索引擎是某中国第一大搜索引擎</a>，以及该公司的地图、以及某些知名盗版 Android 应用讨论区(HiXXX以及GXXX等等)的 Chinese Market Clone... 叫 localization 也好，叫山寨也好&mdash;&mdash;反正也就这么着了，你们能怎么样？！</p>
<p>然后，现在是11年末了。美国已经满大街除了 Android 就是 iPhone 了，中国，似乎除了<del>大部分</del>不开化的群众仍然买挪鸡鸭之外，除了<del>一小撮坏分子</del> iPhone 就是 Android 了。于是，我们看到，以前在 feature phone 市场里常见的伎俩，比如 app 自动吸费，假杀毒软件纷纷出现在了 Android 平台上(我历来是把挪鸡鸭的 Symbian 手机当 feature phone 看的)。</p>
<hr />
<p>除了开发者品质问题，我们是不是还应该在自己身上考虑考虑呢？</p>
<ol>
<li>Android 手机用户有几个人买过 App 呢？<ol>
<li>Android Market 在中国是否可用</li>
<li>有几个人拥有国际信用卡？</li>
</ol></li>
<li>究竟有几个人愿意花1～2美元买 App 呢？</li>
</ol>
<p>对于上面两个问题，我在国内时，是没有国际信用卡的，支付完全不方便，直到来了美国才买的正版软件&mdash;&mdash;当然，在那之前没用过什么盗版的，只不过有些 App 必须用 MarketEnabler 下载。</p>
<p>中国移动的 ARPU 大约是 50 人民币，联通的更少一些。1块美金的 App 大约占他们月费的 1/10，而且这一块美金在去年我出国之前是足够吃一顿饭的，恐怕大部分用户还是不愿意花钱买 app 的吧。</p>
<p>其实，似乎中国人从来没有过买软件的意识&mdash;&mdash;看不到摸不着，凭什么付费？"高端用户"？扯淡吧。某次，某老爸开高级饭店的富二代问我怎么给 iPhone 越狱，答曰不会（这是真不会）。她说，不越狱怎么装软件？我说，上 AppStore 买啊，你又不差钱。答曰&mdash;&mdash;我又没毛病，凭什么买软件，买了也什么都看不到。</p>
<p>上面一句话是不是严重挫败了各位程序员宅男的感情？没错儿，你们，包括我，写的东西，很多中国人看到了，都会说&mdash;&mdash;这玩意儿凭什么卖钱？</p>
<p>&mdash;&mdash;但是宅男也要吃饭啊</p>
<p>&mdash;&mdash;写流氓软件扣费好了</p>
<p>于是，扯远了。</p>
<hr />
<p>扯回来，继续说。</p>
<p>中国人不怕流氓的。</p>
<p>// 于是流氓越来越多</p>
<p>// 于是 Android 市场就变成我们今天看到的这样了</p>
<hr />
<p>最后，送给民主斗士们一点话：</p>
<p>看不惯社会对吧，想民主对吧？你不想想，你走过后门没有，你潜规则过没有？如果有，别老吵着要民主。别以为你自己行恶影响不到全局&mdash;&mdash;成万上亿的你组成了整个神奇的中国社会。</p>
<p>下回说民主之前，先想想自己。公民社会不是挡箭牌，所有人都遵守游戏规则了，你根本不用想要公民社会&mdash;&mdash;因为这就是。</p>
<p>话说回来，抱怨社会的 loser 居多。</p>
<hr />
<p>又想写点东西：最近新浪微博什么的流行排比句，抱怨社会不公&mdash;&mdash;都是枪手，给钱的。当然，写这些东西的，loser 居多。</p>
<p>-EOF-</p>]]></description>
            <content:encoded><![CDATA[<p>最近Android是越来越火了。火的背后我们也看到了很多的不和谐。</p>
<p>09年的时候，我开始使用的 Android 手机。那是一个黑暗的时代&mdash;&mdash;当时我在使用中国移动的手机卡，流量有限，每月 80MB，20大洋。好在墙并没这么厉害，拿到手机以后，上 Market 下载 Google Pinyin，输入中文一切正常，倒也可以用了。不过，因为 Android 当时刚刚出现不久，中国基本没用户，移动互联网基本靠 WAP，内容基本是 WML，我需要一个支持 WML 的浏览器。想过写一个 WML Transformer 到 HTML，最终没写，因此上网看电脑网站舍不得，只能上手机校内、推特。想用 QQ? 没门。</p>
<p>于是，有了基于 Java 模拟器 (MicroEmulator) 的 Opera Mini，还可以直接穿墙。用的不亦乐乎。</p>
<p>后来，Android 手机果然越来越流行了。我个人感觉是因为没有 license fee: 任何手机厂商直接拿来源代码，写点驱动，就是一款新机器，拚配置就卖得掉&mdash;&mdash;买 Android 的多半是技术悾，配置就是一切，于是我们看到了各种大屏幕、双核 CPU，独立显卡（汗），硬解码芯片（硬解RMVB看XXX神马的），以及&mdash;&mdash;越来越短的待机时间。G1 的电池已经足够悲剧，悲剧的是似乎后来的 Android 手机用同样容量的电池待机时间还不如 G1。上大学时，兜里4块电池是常事儿，特别是出去旅游的时候。</p>
<p>后来，Android 手机越来越便宜了&mdash;&mdash;MTK发力，显然就有便宜手机了。不过，似乎中国市场的 Android 机器有点奇怪&mdash;&mdash;没有 Google Apps。从默认搜索引擎到输入法再到地图、邮件、市场，统统没有 Google 的份儿。Instead, 我们看到<a href="http://www.cnbeta.com/articles/117298.htm">默认搜索引擎是某中国第一大搜索引擎</a>，以及该公司的地图、以及某些知名盗版 Android 应用讨论区(HiXXX以及GXXX等等)的 Chinese Market Clone... 叫 localization 也好，叫山寨也好&mdash;&mdash;反正也就这么着了，你们能怎么样？！</p>
<p>然后，现在是11年末了。美国已经满大街除了 Android 就是 iPhone 了，中国，似乎除了<del>大部分</del>不开化的群众仍然买挪鸡鸭之外，除了<del>一小撮坏分子</del> iPhone 就是 Android 了。于是，我们看到，以前在 feature phone 市场里常见的伎俩，比如 app 自动吸费，假杀毒软件纷纷出现在了 Android 平台上(我历来是把挪鸡鸭的 Symbian 手机当 feature phone 看的)。</p>
<hr />
<p>除了开发者品质问题，我们是不是还应该在自己身上考虑考虑呢？</p>
<ol>
<li>Android 手机用户有几个人买过 App 呢？<ol>
<li>Android Market 在中国是否可用</li>
<li>有几个人拥有国际信用卡？</li>
</ol></li>
<li>究竟有几个人愿意花1～2美元买 App 呢？</li>
</ol>
<p>对于上面两个问题，我在国内时，是没有国际信用卡的，支付完全不方便，直到来了美国才买的正版软件&mdash;&mdash;当然，在那之前没用过什么盗版的，只不过有些 App 必须用 MarketEnabler 下载。</p>
<p>中国移动的 ARPU 大约是 50 人民币，联通的更少一些。1块美金的 App 大约占他们月费的 1/10，而且这一块美金在去年我出国之前是足够吃一顿饭的，恐怕大部分用户还是不愿意花钱买 app 的吧。</p>
<p>其实，似乎中国人从来没有过买软件的意识&mdash;&mdash;看不到摸不着，凭什么付费？"高端用户"？扯淡吧。某次，某老爸开高级饭店的富二代问我怎么给 iPhone 越狱，答曰不会（这是真不会）。她说，不越狱怎么装软件？我说，上 AppStore 买啊，你又不差钱。答曰&mdash;&mdash;我又没毛病，凭什么买软件，买了也什么都看不到。</p>
<p>上面一句话是不是严重挫败了各位程序员宅男的感情？没错儿，你们，包括我，写的东西，很多中国人看到了，都会说&mdash;&mdash;这玩意儿凭什么卖钱？</p>
<p>&mdash;&mdash;但是宅男也要吃饭啊</p>
<p>&mdash;&mdash;写流氓软件扣费好了</p>
<p>于是，扯远了。</p>
<hr />
<p>扯回来，继续说。</p>
<p>中国人不怕流氓的。</p>
<p>// 于是流氓越来越多</p>
<p>// 于是 Android 市场就变成我们今天看到的这样了</p>
<hr />
<p>最后，送给民主斗士们一点话：</p>
<p>看不惯社会对吧，想民主对吧？你不想想，你走过后门没有，你潜规则过没有？如果有，别老吵着要民主。别以为你自己行恶影响不到全局&mdash;&mdash;成万上亿的你组成了整个神奇的中国社会。</p>
<p>下回说民主之前，先想想自己。公民社会不是挡箭牌，所有人都遵守游戏规则了，你根本不用想要公民社会&mdash;&mdash;因为这就是。</p>
<p>话说回来，抱怨社会的 loser 居多。</p>
<hr />
<p>又想写点东西：最近新浪微博什么的流行排比句，抱怨社会不公&mdash;&mdash;都是枪手，给钱的。当然，写这些东西的，loser 居多。</p>
<p>-EOF-</p>
                ]]></content:encoded>
            </item>
        <item>
            <title>回美后，随便写点东西</title>
            <link>http://difan.org.cn/blog/after-back-to-usa-2011</link>
            <comments>http://difan.org.cn/blog/after-back-to-usa-2011#comments</comments>
            <pubDate>Tue, 06 Sep 2011 05:32:30 GMT</pubDate>
            <dc:creator>Alex</dc:creator>
            <guid isPermaLink="true">http://difan.org.cn/blog/after-back-to-usa-2011</guid>
            <description><![CDATA[<p>假期显然很快就过完了，于是我又飞回了美帝。本学期的课和上学期的以及下学期的一样多，都是9个学分的课。RA神马的也都定下来了，钱不多，倒是看起来够吃饭的，老板promise多给点。</p>
<p>假期，首先回到了青岛大学，给我的本科生活画了一个句号。散伙饭，一顿又一顿，酒，一次又一次。送觉哥的时候，我们都哭了，大学四年，或者对我来说的三年半，不管结果如何，结束了。离校那天，摔了很多酒瓶，下午2点钟，最后一次检查，然后离开了生活了三年多的鸿园2号楼415宿舍，以及陪伴我很长时间的10.4.49.2的IP地址，以及zdf这个校园网账号。作为维护人员，最后登陆了一次7609，也在网络中心度过了最后一段时间。</p>
<p>接着，我去了广州，与ifanr.com的几位核心成员碰了面，也进行了产品的讨论。这里也不方便说太多了。</p>
<p>然后，我回到了家里，但没过多久，我又回到了青岛，并停留了很长时间，每周去几次青医附院，每次都是坐上225，花上一个小时的时间。以后会怎么样，谁也说不好。12小时的时差，19小时的飞行距离，一切都没那么容易。</p>
<p>毕业以后，也见了几次同学，每次的心情都是不同的&mdash;&mdash;工作的工作，读研究生的则渡过这这一段最后的假期，而有些则已经去了实验室。</p>
<p>这也算是最后一个假期了吧？寒假似乎没什么，圣诞假期真的很短。读博有点没信心，陶森的奖学金真的很少，而且本专业成果也不怎么样。而我也找不到什么真正合适的专业，安全类专业最后到了密码学我就完蛋了，而CS专业从算法开始我就已经完蛋了。虽然据说PhD Student还是要第一年重新学算法以及数据结构。从头开始时，我就没怎么注意这些，因此科研似乎也不太适合我？手里的卫星的项目我看到以后在心里暗暗地骂了一句混蛋&mdash;&mdash;美国缺这些东西么？我们搞的这些所谓学术的东西，不过是在骗经费而已！对实际生产，一点价值也没有！而老师则对本行业不怎么了解，因此我不觉得他可以给我什么建议，但是因为proposal已经写了，项目也已经发下来了，不做又能如何？</p>
<p>来美国以后，我倒是学会了C语言，也会了用Qt写有用的程序，这个算是个收获？自从指针这个问题绕过了之后，我觉得用C已经很得心应手了，除了有时候骂两句，为什么没有string类型。</p>
<p>豆瓣电台突然播放了<em>Right Here Waiting For You</em>，让我一下子感觉回到了高中时代。好多年前的事情了&hellip;&hellip;</p>]]></description>
            <content:encoded><![CDATA[<p>假期显然很快就过完了，于是我又飞回了美帝。本学期的课和上学期的以及下学期的一样多，都是9个学分的课。RA神马的也都定下来了，钱不多，倒是看起来够吃饭的，老板promise多给点。</p>
<p>假期，首先回到了青岛大学，给我的本科生活画了一个句号。散伙饭，一顿又一顿，酒，一次又一次。送觉哥的时候，我们都哭了，大学四年，或者对我来说的三年半，不管结果如何，结束了。离校那天，摔了很多酒瓶，下午2点钟，最后一次检查，然后离开了生活了三年多的鸿园2号楼415宿舍，以及陪伴我很长时间的10.4.49.2的IP地址，以及zdf这个校园网账号。作为维护人员，最后登陆了一次7609，也在网络中心度过了最后一段时间。</p>
<p>接着，我去了广州，与ifanr.com的几位核心成员碰了面，也进行了产品的讨论。这里也不方便说太多了。</p>
<p>然后，我回到了家里，但没过多久，我又回到了青岛，并停留了很长时间，每周去几次青医附院，每次都是坐上225，花上一个小时的时间。以后会怎么样，谁也说不好。12小时的时差，19小时的飞行距离，一切都没那么容易。</p>
<p>毕业以后，也见了几次同学，每次的心情都是不同的&mdash;&mdash;工作的工作，读研究生的则渡过这这一段最后的假期，而有些则已经去了实验室。</p>
<p>这也算是最后一个假期了吧？寒假似乎没什么，圣诞假期真的很短。读博有点没信心，陶森的奖学金真的很少，而且本专业成果也不怎么样。而我也找不到什么真正合适的专业，安全类专业最后到了密码学我就完蛋了，而CS专业从算法开始我就已经完蛋了。虽然据说PhD Student还是要第一年重新学算法以及数据结构。从头开始时，我就没怎么注意这些，因此科研似乎也不太适合我？手里的卫星的项目我看到以后在心里暗暗地骂了一句混蛋&mdash;&mdash;美国缺这些东西么？我们搞的这些所谓学术的东西，不过是在骗经费而已！对实际生产，一点价值也没有！而老师则对本行业不怎么了解，因此我不觉得他可以给我什么建议，但是因为proposal已经写了，项目也已经发下来了，不做又能如何？</p>
<p>来美国以后，我倒是学会了C语言，也会了用Qt写有用的程序，这个算是个收获？自从指针这个问题绕过了之后，我觉得用C已经很得心应手了，除了有时候骂两句，为什么没有string类型。</p>
<p>豆瓣电台突然播放了<em>Right Here Waiting For You</em>，让我一下子感觉回到了高中时代。好多年前的事情了&hellip;&hellip;</p>
                ]]></content:encoded>
            </item>
        <item>
            <title>Aluminum第3次（！）重构</title>
            <link>http://difan.org.cn/blog/3rd-reformation</link>
            <comments>http://difan.org.cn/blog/3rd-reformation#comments</comments>
            <pubDate>Mon, 11 Jul 2011 11:01:21 GMT</pubDate>
            <dc:creator>Alex</dc:creator>
            <guid isPermaLink="true">http://difan.org.cn/blog/3rd-reformation</guid>
            <description><![CDATA[<p>现在看我当年真无聊，居然用ASP和PHP写了2份博客系统。</p>
<p>新的博客系统是用Pylons写的，一个基于Python的Web框架，终于解决了以前用PHP懒得干的好多问题，顺便自己做了一个俗称验证码的东西，其实这里有个bug我懒得修了。。。</p>
<p>其实要不是迁移主机我也懒得切换过来Aluminum Blog了。不过开发其实只用了大约3天的时间，而且是各种拖延。代码加起来也许会有10K？</p>
<p>鬼知道哪天我又学会了什么稀奇古怪的语言之后又会再用该语言写一个博客系统呢？</p>
<p>不过好在我还不会像某个软件流控公司一样，用shell脚本写web... 也不会像某个邮件公司一样，用C写Web, 更不会像某个流控硬件公司一样，用内核模块写Web!</p>]]></description>
            <content:encoded><![CDATA[<p>现在看我当年真无聊，居然用ASP和PHP写了2份博客系统。</p>
<p>新的博客系统是用Pylons写的，一个基于Python的Web框架，终于解决了以前用PHP懒得干的好多问题，顺便自己做了一个俗称验证码的东西，其实这里有个bug我懒得修了。。。</p>
<p>其实要不是迁移主机我也懒得切换过来Aluminum Blog了。不过开发其实只用了大约3天的时间，而且是各种拖延。代码加起来也许会有10K？</p>
<p>鬼知道哪天我又学会了什么稀奇古怪的语言之后又会再用该语言写一个博客系统呢？</p>
<p>不过好在我还不会像某个软件流控公司一样，用shell脚本写web... 也不会像某个邮件公司一样，用C写Web, 更不会像某个流控硬件公司一样，用内核模块写Web!</p>
                ]]></content:encoded>
            </item>
        <item>
            <title>写博客以及博客系统又要重构了</title>
            <link>http://difan.org.cn/blog/C0YHVD</link>
            <comments>http://difan.org.cn/blog/C0YHVD#comments</comments>
            <pubDate>Wed, 27 Apr 2011 11:04:19 GMT</pubDate>
            <dc:creator>Alex</dc:creator>
            <guid isPermaLink="true">http://difan.org.cn/blog/C0YHVD</guid>
            <description><![CDATA[<p>
	各种写论文受不了之后，我想起来我还有这么个博客的。</p>
<p>
	似乎最近没什么写博客的需求了，小事发推，大点事校内一发日志拉倒，还有更大的事情么？没有。</p>
<p>
	晚上没事了可能会用手机打开EverNote写一点记录，或者干脆写电子邮件发稿到Blogspot去，这里什么时候来？</p>
<p>
	现在看，这个博客系统当时写的动机挺简单的，就是要写一点东西在网上而不是继续用Blogspot，似乎当时blogspot确实没有被封。</p>
<p>
	至于，为什么要重构了呢？因为不cool。</p>
<p>
	打开repo可以看到一大堆一大堆的bullshit，当看到自己都恶心的时候，我忍不住要重构了。</p>
<p>
	数据库当时的设计倒是不错，随便怎么继续折腾都可以，一没有需求全文索引（Google可以帮我做），二没有tag功能（这是我一直强调的，为什么要有tag和category呢？），即使重新实现也不会改变表结构。</p>
<p>
	至于使用NoSQL数据库？我挺看好MongoDB的，你看上一篇文章就是写MongoDB的啦。用MongoDB当然不错了。</p>
<p>
	用语言什么重构呢？要不然还是用Pylons吧，熟悉，开发快。</p>
<p>
	本质上几乎所有Web应用程序都是在干CRUD的工作。如果有人还想做开放平台，我建议搞CRUD Central一类的应用程序，把所有的CRUD全部包装起来，specify需要什么字段什么数据类型怎样表现就好了。Model完全可以简单的建立，Controller嘛，一般的应用，例如Twitter(或各种微博)、校内（或各种SNS）不都是送数据查数据么&hellip;&hellip;虽然真实现了也怪无聊的。</p>
<p>
	算了，还有一堆paper要写。写这篇文章的另一个原因&mdash;&mdash;好久不写了。。。</p>
]]></description>
            <content:encoded><![CDATA[<p>
	各种写论文受不了之后，我想起来我还有这么个博客的。</p>
<p>
	似乎最近没什么写博客的需求了，小事发推，大点事校内一发日志拉倒，还有更大的事情么？没有。</p>
<p>
	晚上没事了可能会用手机打开EverNote写一点记录，或者干脆写电子邮件发稿到Blogspot去，这里什么时候来？</p>
<p>
	现在看，这个博客系统当时写的动机挺简单的，就是要写一点东西在网上而不是继续用Blogspot，似乎当时blogspot确实没有被封。</p>
<p>
	至于，为什么要重构了呢？因为不cool。</p>
<p>
	打开repo可以看到一大堆一大堆的bullshit，当看到自己都恶心的时候，我忍不住要重构了。</p>
<p>
	数据库当时的设计倒是不错，随便怎么继续折腾都可以，一没有需求全文索引（Google可以帮我做），二没有tag功能（这是我一直强调的，为什么要有tag和category呢？），即使重新实现也不会改变表结构。</p>
<p>
	至于使用NoSQL数据库？我挺看好MongoDB的，你看上一篇文章就是写MongoDB的啦。用MongoDB当然不错了。</p>
<p>
	用语言什么重构呢？要不然还是用Pylons吧，熟悉，开发快。</p>
<p>
	本质上几乎所有Web应用程序都是在干CRUD的工作。如果有人还想做开放平台，我建议搞CRUD Central一类的应用程序，把所有的CRUD全部包装起来，specify需要什么字段什么数据类型怎样表现就好了。Model完全可以简单的建立，Controller嘛，一般的应用，例如Twitter(或各种微博)、校内（或各种SNS）不都是送数据查数据么&hellip;&hellip;虽然真实现了也怪无聊的。</p>
<p>
	算了，还有一堆paper要写。写这篇文章的另一个原因&mdash;&mdash;好久不写了。。。</p>

                ]]></content:encoded>
            </item>
        <item>
            <title>How to use Pylons and Ming to operate MongoDB</title>
            <link>http://difan.org.cn/blog/MT9R5L</link>
            <comments>http://difan.org.cn/blog/MT9R5L#comments</comments>
            <pubDate>Thu, 24 Mar 2011 06:25:21 GMT</pubDate>
            <dc:creator>Alex</dc:creator>
            <guid isPermaLink="true">http://difan.org.cn/blog/MT9R5L</guid>
            <description><![CDATA[<p>
	Another long period since my last blog update. Currently I&#39;m good in USA. Everything is going smoothly.</p>
<p>
	I&#39;m learning MongoDB and Pylons those days. MongoDB is a good implementation of ORM database, and Pylons is an excellent implementation of web framework in Python. However, few reference was found in using MongoDB as database in Pylons applications.</p>
<p>
	After some time of search, I found a good Python module called &quot;<a href="http://merciless.sourceforge.net/">Ming</a>&quot;. With Ming, work was simplified.</p>
<p>
	Create a Pylons application using paster. Do not use SQLAlchemy. Then modify model to add code needed for Ming.</p>
<pre class="brush:python;">
from ming import Session
from ming import schema
from ming.orm import MappedClass
from ming.orm import FieldProperty, ForeignIdProperty, RelationProperty
from ming.orm import ThreadLocalORMSession

session = None
 
def init_single_model(model_class):
    model_class.__mongometa__.session = session
 
class Topic(MappedClass):

    class __mongometa__:
        session = session
        name = &#39;topic&#39;
 
    _id = FieldProperty(schema.ObjectId)
    title = FieldProperty(str)
    content = FieldProperty(str)
 
def init_model(engine):
    global session
    session = ThreadLocalORMSession(doc_session=Session(engine))
    init_single_model(Topic)
    MappedClass.compile_all()
</pre>
<p>
	Then, modify config/environment.py. Add the following imports:</p>
<pre class="brush:python;">
from ifanrbase.model import init_model
from ming.datastore import DataStore
</pre>
<p>
	Then, add the following code in load_environment function:</p>
<pre class="brush:python;">
init_model(DataStore(config[&#39;database.uri&#39;], database=config[&#39;database.name&#39;]))</pre>
<p>
	As you see, I used database.uri and database.name variable to describe the database. The last thing is to add definations in your development.ini.</p>
<p>
	database.uri is in mongodb://user:pass@host/ format, and database.name is the name for the database. This is my configuration:</p>
<pre class="brush:python;">
database.uri = mongodb://admin:password@localhost:27017/
database.name = tutorial
</pre>
<p>
	The are in app:main section.</p>
<p>
	I will attach another demo here to show how to operate the database:</p>
<pre class="brush:python;">
import logging

from pylons import request, response, session, tmpl_context as c, url
from pylons.controllers.util import abort, redirect

from ifanrbase.lib.base import BaseController, render
from ifanrbase import model

log = logging.getLogger(__name__)

class TopicController(BaseController):

    def __init__(self):
        return 
  
    def create(self):
        c.title = request.params[&#39;title&#39;]
        c.content = request.params[&#39;content&#39;]
        new_topic = model.Topic(title=c.title, content=c.content)
        model.session.flush()
        return &quot;Created the topic. Check it out in your database.&quot;</pre>
<p>
	--EOF--</p>
<p>
	中文读者：这篇东西的主要内容是告诉你怎样将Ming集成在Pylons中，作为Model提供数据。上面的代码都是可以直接拿来用的。</p>
<p>
	References:</p>
<p>
	<a href="http://zhuoqiang.me/a/use-mongodb-in-pylons">在Pylons中使用MongoDB的例子</a> (Chinese)</p>
<p>
	<a href="http://pylonsbook.com/">Pylons Book http://pylonsbook.com/</a> (英文)</p>
<p>
	Modules used:</p>
<p>
	Pylons, Ming the Merciless.</p>
<p>
	Some more examples:</p>
<p>
	http://merciless.git.sourceforge.net/git/gitweb.cgi?p=merciless/merciless;a=tree;f=docs/src;hb=HEAD Found in git of merciless project.</p>
]]></description>
            <content:encoded><![CDATA[<p>
	Another long period since my last blog update. Currently I&#39;m good in USA. Everything is going smoothly.</p>
<p>
	I&#39;m learning MongoDB and Pylons those days. MongoDB is a good implementation of ORM database, and Pylons is an excellent implementation of web framework in Python. However, few reference was found in using MongoDB as database in Pylons applications.</p>
<p>
	After some time of search, I found a good Python module called &quot;<a href="http://merciless.sourceforge.net/">Ming</a>&quot;. With Ming, work was simplified.</p>
<p>
	Create a Pylons application using paster. Do not use SQLAlchemy. Then modify model to add code needed for Ming.</p>
<pre class="brush:python;">
from ming import Session
from ming import schema
from ming.orm import MappedClass
from ming.orm import FieldProperty, ForeignIdProperty, RelationProperty
from ming.orm import ThreadLocalORMSession

session = None
 
def init_single_model(model_class):
    model_class.__mongometa__.session = session
 
class Topic(MappedClass):

    class __mongometa__:
        session = session
        name = &#39;topic&#39;
 
    _id = FieldProperty(schema.ObjectId)
    title = FieldProperty(str)
    content = FieldProperty(str)
 
def init_model(engine):
    global session
    session = ThreadLocalORMSession(doc_session=Session(engine))
    init_single_model(Topic)
    MappedClass.compile_all()
</pre>
<p>
	Then, modify config/environment.py. Add the following imports:</p>
<pre class="brush:python;">
from ifanrbase.model import init_model
from ming.datastore import DataStore
</pre>
<p>
	Then, add the following code in load_environment function:</p>
<pre class="brush:python;">
init_model(DataStore(config[&#39;database.uri&#39;], database=config[&#39;database.name&#39;]))</pre>
<p>
	As you see, I used database.uri and database.name variable to describe the database. The last thing is to add definations in your development.ini.</p>
<p>
	database.uri is in mongodb://user:pass@host/ format, and database.name is the name for the database. This is my configuration:</p>
<pre class="brush:python;">
database.uri = mongodb://admin:password@localhost:27017/
database.name = tutorial
</pre>
<p>
	The are in app:main section.</p>
<p>
	I will attach another demo here to show how to operate the database:</p>
<pre class="brush:python;">
import logging

from pylons import request, response, session, tmpl_context as c, url
from pylons.controllers.util import abort, redirect

from ifanrbase.lib.base import BaseController, render
from ifanrbase import model

log = logging.getLogger(__name__)

class TopicController(BaseController):

    def __init__(self):
        return 
  
    def create(self):
        c.title = request.params[&#39;title&#39;]
        c.content = request.params[&#39;content&#39;]
        new_topic = model.Topic(title=c.title, content=c.content)
        model.session.flush()
        return &quot;Created the topic. Check it out in your database.&quot;</pre>
<p>
	--EOF--</p>
<p>
	中文读者：这篇东西的主要内容是告诉你怎样将Ming集成在Pylons中，作为Model提供数据。上面的代码都是可以直接拿来用的。</p>
<p>
	References:</p>
<p>
	<a href="http://zhuoqiang.me/a/use-mongodb-in-pylons">在Pylons中使用MongoDB的例子</a> (Chinese)</p>
<p>
	<a href="http://pylonsbook.com/">Pylons Book http://pylonsbook.com/</a> (英文)</p>
<p>
	Modules used:</p>
<p>
	Pylons, Ming the Merciless.</p>
<p>
	Some more examples:</p>
<p>
	http://merciless.git.sourceforge.net/git/gitweb.cgi?p=merciless/merciless;a=tree;f=docs/src;hb=HEAD Found in git of merciless project.</p>

                ]]></content:encoded>
            </item>
        <item>
            <title>2010, 2011</title>
            <link>http://difan.org.cn/blog/4C7960</link>
            <comments>http://difan.org.cn/blog/4C7960#comments</comments>
            <pubDate>Sat, 01 Jan 2011 02:17:18 GMT</pubDate>
            <dc:creator>Alex</dc:creator>
            <guid isPermaLink="true">http://difan.org.cn/blog/4C7960</guid>
            <description><![CDATA[<p>
	就这样到了2011了？</p>
<p>
	好混乱。好快。</p>
<p>
	还有17天就去美帝了&hellip;&hellip;</p>
<p>
	2011目标：</p>
<p>
	TCP/IP协议</p>
<p>
	Solaris内核</p>
<p>
	混到本科毕业证</p>
<p>
	去个好学校</p>
<p>
	多读书，多读书。拖延症。</p>
<p>
	（好少的内容&hellip;&hellip;又占用了一个BlogID&hellip;&hellip;）</p>
<p>
	[<a href="http://difan.org.cn/post/146">2009</a>][<a href="http://difan.org.cn/post/105">2008</a>][2007在BlogSpot][2006以及更早的没在网上]</p>
]]></description>
            <content:encoded><![CDATA[<p>
	就这样到了2011了？</p>
<p>
	好混乱。好快。</p>
<p>
	还有17天就去美帝了&hellip;&hellip;</p>
<p>
	2011目标：</p>
<p>
	TCP/IP协议</p>
<p>
	Solaris内核</p>
<p>
	混到本科毕业证</p>
<p>
	去个好学校</p>
<p>
	多读书，多读书。拖延症。</p>
<p>
	（好少的内容&hellip;&hellip;又占用了一个BlogID&hellip;&hellip;）</p>
<p>
	[<a href="http://difan.org.cn/post/146">2009</a>][<a href="http://difan.org.cn/post/105">2008</a>][2007在BlogSpot][2006以及更早的没在网上]</p>

                ]]></content:encoded>
            </item>

    </channel>
</rss>

