<?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>Lost HIT - Zealot&#039;s Blog</title>
	<atom:link href="http://blog.losthit.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.losthit.com</link>
	<description>关注 linux/c/c++/python/web开发,互联网数据抓取与挖掘</description>
	<lastBuildDate>Mon, 02 Aug 2010 03:49:37 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>海盗分金问题分析与解决</title>
		<link>http://blog.losthit.com/archives/pirate-and-gold/</link>
		<comments>http://blog.losthit.com/archives/pirate-and-gold/#comments</comments>
		<pubDate>Sun, 01 Aug 2010 16:48:29 +0000</pubDate>
		<dc:creator>Zealot</dc:creator>
				<category><![CDATA[Algorithm]]></category>
		<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Computer Science]]></category>
		<category><![CDATA[nim]]></category>
		<category><![CDATA[代码]]></category>
		<category><![CDATA[海盗分金]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://blog.losthit.com/?p=329</guid>
		<description><![CDATA[海盗分金问题分析与解决
——Nim取子问题变形后的解决方案

全文下载链接：海盗分金问题分析与解决.pdf

Author:	Zealot Ke(kejie[at]kuxun.cn)
Date:	2010/7/30
背景
强哥邮件发出一个题目

有5个海盗,特别... ]]></description>
			<content:encoded><![CDATA[<h2>海盗分金问题分析与解决</h2>
<p style="text-align: right;">——Nim取子问题变形后的解决方案</p>
<p>
全文下载链接：<a href='http://blog.losthit.com/wp-content/uploads/2010/08/海盗分金问题分析与解决.pdf'>海盗分金问题分析与解决.pdf</a>
</p>
<p>Author:	Zealot Ke(kejie[at]kuxun.cn)<br />
Date:	2010/7/30</p>
<h3>背景</h3>
<p>强哥邮件发出一个题目</p>
<ol>
<li>有5个海盗,特别的残忍,特别的聪明</li>
<li>他们抢了100个金币,要进行分配,每个人都想分配足够多的金币,他们寸步不让.分配顺序是:5号海盗-&gt;4号海盗…1号海盗,即是:先由5号海盗决定如何分配,若分配不均,5号被扔下海,4号海盗再决定如何分配,依次类推.</li>
<li>如果没有二分之一或以上的海盗同意,分配人将被其他人扔下大海.</li>
<li>假如你是5号海盗,你会如何分配金币.确保自己不会被扔下大海,而且让其他4个海盗心服口服.</li>
</ol>
<h3>定义问题</h3>
<p>5号海盗必须按照上述规则，找出最优分配方案，否则将被其他人扔下大海。</p>
<h3>当前状态</h3>
<p>正确分配方案还没出来，必须尽快找出最优解。</p>
<h3>分析</h3>
<p>典型的nim取子问题的变形，采用倒推方式即可找到最优解。</p>
<h3>制定解决方案</h3>
<p>倒推方法如下所示</p>
<ol>
<li>如果只有一个海盗，如何分配？</li>
<li>如果有两个海盗，如何分配？</li>
<li>如果有n个海盗，每个海盗至少需要几个人同意？找出n-1个海盗情况下的分配方案中，需要收买多少海盗？最低需要多少金币？</li>
</ol>
<h3>实现解决方案</h3>
<p>倒推方法实现如下表所示，每一行表示一种人数情况下的分配方案，也即，最后一行给出5号海盗的分配方案。</p>
<div id="attachment_334" class="wp-caption alignleft" style="width: 706px"><a href="http://blog.losthit.com/wp-content/uploads/2010/08/nim-analytics-table.jpg"><img class="size-full wp-image-334" title="分配方案倒推分析表" src="http://blog.losthit.com/wp-content/uploads/2010/08/nim-analytics-table.jpg" alt="分配方案倒推分析表" width="696" height="664" /></a><p class="wp-caption-text">分配方案倒推分析表</p></div>
<p>注意：从表中可以看出聪明是大前提，当然残忍也是。nim取子游戏向来是君子游戏，没有这个前提的话，后面的海盗不按套路出牌就不可能有最优解。</p>
<h3>标准化解决方案</h3>
<p>从上表不难看出规律，也即，自己拿尽可能多的金币，同时保证后面的人依次分配0、1交错的金币数。规范化命题如下<br />
<strong>*命题</strong>: 假设对于n个聪明、残忍的海盗（n≥1），抢了Gold个金币，要进行分配，每个人都想分配足够多的金币，他们寸步不让。分配顺序是：n号海盗-&gt;n-1号海盗…1号海盗，即是：先由n号海盗决定如何分配，若分配不均，n号被扔下海，n-1号海盗再决定如何分配，依次类推。在该规则下，n号海盗最佳分配方案应当如此（为简单，避免使用地板函数，按n为奇偶数分类讨论）：<br />
不妨假设ones为得到1个金币海盗数，zeros为得到0个金币的海盗数。</p>
<ol>
<li>当n为奇数时，ones=zeros=(n-1)/2，分配方案为Gold-ones,0,1…0,1</li>
<li>当n为偶数时，ones=( n-2)/2,zeros=n/2，分配方案为Gold-ones,0,1…1,0</li>
</ol>
<p>该命题从上述分析中的规律中得出，不是定理，更不是公理，作为标准化解决方案需要严格证明。</p>
<p><strong>证明：</strong><br />
注释：使用跳跃数学归纳法证明，跳跃的step为2。<br />
先证明n为奇数时命题是否成立。<br />
当n=1时，显然该命题成立<br />
假设当n=m(m&gt;1)时命题成立，则分配方案为<br />
Ones(m) = Zeros(m) = (m-1)/2<br />
Proposal(m) = Gold-Ones(m),0,1,…,0,1<br />
= Gold-(m-1)/2, 0, 1, …,0,1<br />
当n=m+1时，显然命题成立，理由如下<br />
Ones(m+1) = (m+1-2)/2=(m-1)/2，Zeros(m+1) = (m+1)/2<br />
注意：a) m+1为偶数，计算ones和zeros需要换个公式b) 对比n=m情形，仅仅是多了个0。<br />
Proposal(m+1) = Gold-Ones(m+1),0,1,…,0,1,0<br />
= Gold-(m-1)/2, 0, 1, …,0,1,0<br />
对比Ones(m),Ones(m+1),Zeros(m),Zeros(m+1)可以看出仅仅是在Proposal(m)序列后面添个0。这会导致Proposal(m+1)与Proposal(m)两个序列中，0、1交错序列刚好错位，对应金币分配方案中则为：m+1号海盗分配方案就是把Proposal(m)中没有得到金币的人每人给1个金币实现自己金币最大化，同时保证同意的人数大于等于2。<br />
综上所述，当n为奇数时，该命题成立。<br />
再证明n为偶数时命题是否成立。<br />
当n=2时，命题成立（大于的最小偶数只能是2）<br />
归纳方法同1。<br />
综合1、2分析，该命题成立。<br />
证毕。</p>
<p><strong>该标准化解决方案用程序实现如下</strong><br />
说明：该程序考虑了金币数量远小于海盗数量时，最先出来分配的部分海盗都得喂鲨鱼去了。</p>
<pre class="c">$ cat nim.c
#include 

const int g_first = 2;
const int g_zero = 0;
const int g_one = 1;

int print_proposal(int *gold, int *pirate, int *ones, int *zeros, int *status) {
        int             ret = 1;
        int             number = 0;
        int             remain = *gold - *ones;
        if (*pirate &lt;= 0) {
                printf(".\n");
                return 0;
        }
        if (remain &lt;= 0) {
                number = 0;     /* not enough gold, killed by others, regenerate proposal */
                ret = 1;        /* conitnue */

                /* regenerate proposal */
                if (*pirate % 2 == 0) {
                        *ones = (*pirate - 2) / 2;
                        *zeros = *pirate / 2;
                } else {
                        *ones = *zeros = (*pirate - 1) / 2;
                }
        } else if (*status == g_one) {
                number = 1;
                *ones--;
                *status = g_zero;
        } else if (*status == g_zero) {
                number = 0;
                *zeros--;
                *status = g_one;
        } else {
                number = remain;
                *status = g_zero;
        }
        if (*status != g_first &amp;&amp; *ones &lt;= 0 &amp;&amp; *zeros &lt;= 0) {
                ret = 0;
        }

        printf("%d ", number);
        *pirate = *pirate - 1;

        return ret;
}

int main()
{
        int             gold;
        int             pirate;
        int             ones;
        int             zeros;
        int             temp;
        int             status;         /* process first, zero or one */
        printf("Please Enter gold and pirate number:\n");
        while (scanf("%d %d", &amp;gold, &amp;pirate) == 2) {
                if (pirate &lt; 1 || gold &lt; 1)
                        break;

                if (pirate % 2 == 0) {
                        ones = (pirate - 2) / 2;
                        zeros = pirate / 2;
                } else {
                        ones = zeros = (pirate - 1) / 2;
                }

                status = g_first;
                printf("Proposal(%d, %d) is: ", gold, pirate);
                temp = pirate;
                while (print_proposal(&amp;gold, &amp;temp, &amp;ones, &amp;zeros, &amp;status))
                        ;
                if (pirate == 1)
                        printf(".\n");

                printf("\n");
                printf("Please Enter gold and pirate number:\n");
        }
        return 0;
}</pre>
<p>程序运行结果如下所示<br />
<code><br />
$ gcc nim.c -o nim<br />
$ ./nim<br />
Please Enter gold and pirate number:<br />
100 1<br />
Proposal(100, 1) is: 100 .</code></p>
<p><code>Please Enter gold and pirate number:<br />
100 2<br />
Proposal(100, 2) is: 100 0 .</code></p>
<p><code>Please Enter gold and pirate number:<br />
100 3<br />
Proposal(100, 3) is: 99 0 1 .</code></p>
<p><code>Please Enter gold and pirate number:<br />
100 4<br />
Proposal(100, 4) is: 99 0 1 0 .</code></p>
<p><code>Please Enter gold and pirate number:<br />
100 5<br />
Proposal(100, 5) is: 98 0 1 0 1 .</code></p>
<p><code> </code></p>
<p><code>Please Enter gold and pirate number:<br />
0<br />
</code></p>
<h3>决定下一步</h3>
<p>本问题到此为止，暂时没有下一步动作。</p>
<h3>总结</h3>
<p>这个结论告诉我们</p>
<ol>
<li>最先掌握分配权的人，看似最危险，胆小的人可能会担心所有人都不支持你，你就只能下海去喂鲨鱼了。其实，他优先掌握了主动权，天下武功，唯快不破，掌握市场先机很重要。</li>
<li>越快越好，但不能快过了头。100个金币，1000个海盗的话，最先出来分配的人必然死掉。同样的，20年前搞酒店搜索，率先占据主动权，快得一塌糊涂那也没戏。</li>
</ol>
<p>完。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.losthit.com/archives/pirate-and-gold/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>粗略读完《深入理解计算机系统》</title>
		<link>http://blog.losthit.com/archives/read-csapp/</link>
		<comments>http://blog.losthit.com/archives/read-csapp/#comments</comments>
		<pubDate>Tue, 13 Jul 2010 15:07:22 +0000</pubDate>
		<dc:creator>Zealot</dc:creator>
				<category><![CDATA[Computer Science]]></category>
		<category><![CDATA[操作系统]]></category>
		<category><![CDATA[book]]></category>
		<category><![CDATA[csapp]]></category>
		<category><![CDATA[program]]></category>
		<category><![CDATA[深入理解计算机系统]]></category>

		<guid isPermaLink="false">http://blog.losthit.com/?p=322</guid>
		<description><![CDATA[书名：深入理解计算机系统（修订版）
英文名：Computer Systems A Programmer&#8217;s Perspective (简称CSAPP)
从英文名称就可以看出这是一本面向程序员的书籍。豆瓣上的链接：http://book.douban.com/subject/12304... ]]></description>
			<content:encoded><![CDATA[<p>书名：<strong>深入理解计算机系统（修订版）</strong><br />
英文名：Computer Systems A Programmer&#8217;s Perspective (简称CSAPP)<br />
从英文名称就可以看出这是一本面向程序员的书籍。豆瓣上的链接：<a href="http://book.douban.com/subject/1230413/" target="_blank">http://book.douban.com/subject/1230413/</a></p>
<p>这本书讲述的内容就像名称里说的那样，<strong>从程序员观点来研究和发掘计算机系统的架构和潜力</strong>，包括信息计算的基础理论，也包括大量硬件、体系结构、操作系统层的知识，并结合编程开发提供了相应的参考信息。是一本难得的好书。</p>
<p>从写作上来讲，这本书也非常不错。全书<b>自底向上</b>，从信息理论入手，逐步扩展到硬件、汇编、操作系统，网络编程，最后到应用软件层（以http server为例分析并发编程）。而开篇第一章就把整本书的脉络概括了，后面每一章都只不过是第一章每一小节的细化。因此，阅读起来全局把握上很轻松，而这也恰恰是非常关键的一点。</p>
<p>整本书非常厚，800多页，大而全，但终究是一本系统级的书，更深入的细节还是只有比较概念性的介绍。比如汇编程序，虚拟存储器管理，基于事件触发的并发网络编程等等。本书每一章都可以独立成书，深入分析。实际上，我们的大学四年中的教材基本上就是这样独立编排的。所以这本书可以算是一个系统性的参考，<b>用于辅助在头脑中建立整机的意识</b>。具体到某一个特定的领域，需要找更详细的资料阅读才能有更好的理解。</p>
<p>最后，书中的习题看上去非常不错，而且都有细致的答案供参考。受限于公交上阅读环境，没有仔细看这部分。以后可以研究研究。</p>
<p>不过限于书中知识点大而全，对cs专业的学生来说，更好的选择是<strong>大一买下来显摆，大二消遣，大三把玩，大四送给小师妹</strong>。不是这本书不够深入，只是我觉得相比四年的课程来讲，这本书中的内容在cs毕业生眼里是必须精通的，没必要放到毕业后再继续学习这些基础。现在看看这本书，我也只能后悔没早点买到。</p>
<p>哦，对了，书中开篇介绍了一些非常有意思的实验题，比正文有趣多了。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.losthit.com/archives/read-csapp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>R61在linux/debian下安装madwifi无线驱动</title>
		<link>http://blog.losthit.com/archives/tp-r61i-madwifi-wireless-in-debian-linux/</link>
		<comments>http://blog.losthit.com/archives/tp-r61i-madwifi-wireless-in-debian-linux/#comments</comments>
		<pubDate>Mon, 05 Apr 2010 16:06:07 +0000</pubDate>
		<dc:creator>Zealot</dc:creator>
				<category><![CDATA[Computer Science]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[ath5k]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[madwifi]]></category>
		<category><![CDATA[wireless]]></category>

		<guid isPermaLink="false">http://blog.losthit.com/?p=313</guid>
		<description><![CDATA[本文记录Thinkpad R61i在debian lenny下安装madwifi驱动程序，替代ath5k，实现无线上网。
主要参考：http://forum.ubuntu.org.cn/viewtopic.php?f=116&#38;t=169205。
仅作为tp安装linux的备忘，欢迎评论。

1. 下载
   Downl... ]]></description>
			<content:encoded><![CDATA[<p>本文记录Thinkpad R61i在debian lenny下安装madwifi驱动程序，替代ath5k，实现无线上网。<br />
主要参考：http://forum.ubuntu.org.cn/viewtopic.php?f=116&amp;t=169205。<br />
仅作为tp安装linux的备忘，欢迎评论。</p>
<pre>
1. 下载
   Download the latest madwifi snapshot. // Google it

2. 解压
   $ tar zxvf madwifi-hal-0.10.5.6-current.tar.gz

3. 编译安装madwifi // 首先通过apt安装编译环境
   $ sudo aptitude install build-essential linux-headers-$(uname -r)
   $ make
   $ sudo make install

4. 安装module
   $ sudo modprobe ath_pci

5. 使网卡每次开机时都加载, make it load every time you boot
   $ sudo vi /etc/modules
   添加一行，如下
     ath_pci

6. 重新启动机器
   $ sudo reboot

注释 &#038;&#038; 备忘
1. 为保证生效，重启前确认已屏蔽ath5k（默认驱动程序有可能是这个）
   检查是否已安装ath5k
   $ lsmod |grep ath5k
   有，则添加到blacklist
   $ cat /etc/modprobe.d/blacklist.conf
     blacklist ath5k
2. 确认安装驱动是否成功
   $ lsmod | grep ath_pci
     ath_pci               201176  0
     wlan                  193392  5 wlan_wep,wlan_scan_sta,ath_rate_sample,ath_pci
     ath_hal               300768  3 ath_rate_sample,ath_pci
3. 硬件型号查看
   $ lspci |grep Ethernet
     00:19.0 Ethernet controller: Intel Corporation 82566MM Gigabit Network Connection (rev 03)
     03:00.0 Ethernet controller: Atheros Communications Inc. AR242x 802.11abg Wireless PCI Express Adapter (rev 01)
4. ath5k是madwifi替代品，除非ath5k下无法连接无线，不建议使用madwifi
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.losthit.com/archives/tp-r61i-madwifi-wireless-in-debian-linux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>单件模式：Singleton那些事</title>
		<link>http://blog.losthit.com/archives/singleton-everthing/</link>
		<comments>http://blog.losthit.com/archives/singleton-everthing/#comments</comments>
		<pubDate>Sun, 28 Feb 2010 22:56:01 +0000</pubDate>
		<dc:creator>Zealot</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[设计模式]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[DCLP]]></category>
		<category><![CDATA[gtest]]></category>
		<category><![CDATA[pattern]]></category>
		<category><![CDATA[singleton]]></category>

		<guid isPermaLink="false">http://blog.losthit.com/?p=287</guid>
		<description><![CDATA[单件模式确保一个类只有一个实例，并提供一个全局的访问点。      &#8211;《Head First 设计模式》
有些时候，我们恰好需要这样一种设计，保证我们实例化的类在进程地址空间内只有一个实例，... ]]></description>
			<content:encoded><![CDATA[<blockquote><p><strong>单件模式</strong>确保一个类只有一个实例，并提供一个全局的访问点。      &#8211;《Head First 设计模式》</p></blockquote>
<p>有些时候，我们恰好需要这样一种设计，保证我们实例化的类在进程地址空间内只有一个实例，有了Singleton，一切似乎都简单明了，其实暗藏杀机。</p>
<p><strong>1. C++实现Singleton模式简单示例</strong></p>
<p>简单的C++实现示例代码</p>
<pre name="code" class="c++">
class Singleton {
    public:
        static Singleton* GetInstance(void) {
            if (Singleton::m_instance == NULL) {
                Singleton::m_instance = new Singleton();
            }
            return Singleton::m_instance;
        }
    private:
        static Singleton* m_instance;
        Singleton() {}
};
</pre>
<p>使用gtest测试，简单地测试一下每次调用GetInstance是否返回同一地址</p>
<pre name="code" class="c++">
#include <cstdlib>
#include <iostream>

#include <gtest/gtest.h>
using namespace std;
#define NEW_COUNT 4096

class Singleton {
    public:
        static Singleton* GetInstance(void) {
            if (Singleton::m_instance == NULL) {
                Singleton::m_instance = new Singleton();
            }
            return Singleton::m_instance;
        }
    private:
        static Singleton* m_instance;
        Singleton() {}
};

Singleton* Singleton::m_instance = NULL;

TEST(Singleton, sample) {
    Singleton* init_instance = Singleton::GetInstance();
    ASSERT_NE(init_instance, (Singleton*)NULL);

    Singleton* p = NULL;
    ASSERT_EQ(p, (Singleton*)NULL);

    for (int i = 0; i < NEW_COUNT; ++i) {
        p = Singleton::GetInstance();
        ASSERT_EQ(init_instance, p);
    }
}

int main(int argc, char **argv)
{
    ::testing::InitGoogleTest(&#038;argc, argv);
    return RUN_ALL_TESTS();
}
</pre>
<p>测试结果显示没有问题：<br />
<code>$ ./singleton<br />
[==========] Running 1 test from 1 test case.<br />
[----------] Global test environment set-up.<br />
[----------] 1 test from Singleton<br />
[ RUN      ] Singleton.sample<br />
[       OK ] Singleton.sample (1 ms)<br />
[----------] 1 test from Singleton (1 ms total)</code></p>
<p><code> </code></p>
<p><code>[----------] Global test environment tear-down<br />
[==========] 1 test from 1 test case ran. (2 ms total)<br />
[  PASSED  ] 1 test.</code></p>
<p>当然，这种测试没有太大意义。给出测试结果，主要用于之后的对比。</p>
<p><strong>2. python程序中调用Singleton模式的C++代码</strong><br />
初次接触Singleton后发现，使用Singleton模式的C++代码融合到python中有意想不到的惊喜：如果有某个类初始化需要很长时间，而之后调用的速度都很快的话，使用Singleton模式，然后在python中多次调用时，不会出现重复的初始化操作。<br />
简单地尝试了一下</p>
<p>首先在singleton.cpp中添加了一行输出，标识一次初始化操作：</p>
<pre name="code" class="c++">
Singleton* Singleton::GetInstance(void) {
    if (Singleton::m_instance == NULL) {
        Singleton::m_instance = new Singleton();
        std::cout << "initialize here." << std::endl;
    }
    return Singleton::m_instance;
}
</pre>
<p>封装的代码如下<br />
<code>$ cat _pysingleton.cpp -n</code></p>
<pre name="code" class="c++">
#include <Python.h>

#include "singleton.h"

using namespace std;

PyObject * GetInstance(PyObject *self, PyObject *args) {
    Singleton::GetInstance();
    return Py_BuildValue("s", NULL);
}

static PyMethodDef _pysingletonMethods[] = {
    {"GetInstance", GetInstance, METH_VARARGS, "get instance."},
    {NULL, NULL},
};

PyMODINIT_FUNC init_pysingleton(void) {
    PyObject * m;
    m = Py_InitModule("_pysingleton", _pysingletonMethods);
}
</pre>
<p>编译出来共享库_pysingleton.so<br />
<code>$ cat Makefile  -n </code></p>
<pre name="code">
CC                =       g++
FLAGS           =       -ggdb -O2 -Wall
INC               =       -I/usr/include/python2.5
LIB               =       -lgtest -lpython2.5
LLIB              =

%.o:%.cpp
        $(CC) $(FLAGS) $(INC) -c $<

_pysingleton.so: singleton.o _pysingleton.o
        $(CC) -shared $(CFLAGS) $(LLIB) $(INCLUDE) $^ -o $@

clean:
        rm -f *.so
        rm -f *.o
        rm -f *.pyc
        rm -f singleton
</pre>
<p>写个简单的python脚本测试一下在单一进程空间里，是否真的只调用一次<br />
<code>$ cat pysingleton.py -n</code></p>
<pre name="code" class="python">
#!/usr/bin/env python
# -*- coding: utf-8 -*-

''' sample for pysingleton
'''

import os
import sys
import _pysingleton

class PySingleton:
    def __init__(self):
        _pysingleton.GetInstance()

def main():
    ''' main function
    '''
    for i in xrange(3):
        PySingleton()
    print 'Done'

if __name__ == '__main__':
    main()
</pre>
<p>结果是<br />
<code> $ ./pysingleton.py<br />
initialize here.<br />
Done </code></p>
<p><strong>3. 多线程中使用Singleton模式</strong><br />
多线程里就会遇到一个double-check问题 (double-check-lock problem, DCLP)<br />
首先，静态变量m_instance作用域是全局的，处于临界区，在多线程需要加锁。这一点很好理解。<br />
但是，简单的在if外面加锁势必会影响性能，毕竟只有第一次调用才会生效，每次都有一次锁操作太费时，也没必要。<br />
于是，就会有double-check方法了，伪代码为<br />
<code>if (Singleton::m_instance == NULL)  // first check<br />
lock<br />
if (Singleton::m_instance == NULL)  // second check </code><br />
从这里可以看出，double-check有效地避免了重复锁操作问题。<br />
然而，问题还没有结束。采用double-check的话，又会引入另一个问题。在这里<br />
<code>Singleton::m_instance = new Singleton(); </code><br />
编译器可能会做个优化，首先将一个有效的内存地址返回给m_instance，然后再调用构造函数初始化。这样很有下一次double-check中首次检查通过，但是得到的内存地址指向的是一个未经初始化的类。后果怎么样，只有天知道了。<br />
更多细节，参考这里：<a href="http://www.ibm.com/developerworks/library/j-dcl.html" target="_blank">http://www.ibm.com/developerworks/library/j-dcl.html</a></p>
<p>a. 最简单的修改方法是<br />
<code>Singleton* temp = new Singleton();<br />
m_instance = temp; </code><br />
但是一个自作聪明地编译器还是会把结果优化成难以想象的样子<br />
b. 另一个方法就是使用volatile关键字，用以声明不受编译器优化的影响<br />
比如 <code>Singleton* volatile temp = new Singleton();</code><br />
但是远远不够，temp是volatile，但是*temp呢，temp-&gt;foo,temp-&gt;bar...这些成员呢？所以，要改的话，得把全世界都改成volatile，除了那个lock-_-|||</p>
<p><strong>4. 以上都只考虑单核，再考虑一下多核机器，问题将会更加复杂</strong></p>
<blockquote><p><strong>总结：珍爱生命，远离Singleton。</strong>尤其是不要把Singleton放进通用库中，还有C++中那个叫template的高级玩意儿，都搞在一起老天都很难保证会发生些什么。</p></blockquote>
<p>附<br />
1. <strong>这里也在讨论单例模式</strong>：<a href="http://code.google.com/p/google-singleton-detector/wiki/WhySingletonsAreControversial" target="_blank">Why Singletons Are Controversial</a><br />
2. 代码托管到<a href="code.google.com" target="_blank">Google Code</a>，欢迎围观、讨论、批评、挑bug：<a href="http://code.google.com/p/zldemo/source/browse/#svn/trunk/blog/singleton_everything" target="_blank">点此进入</a>（http://code.google.com/p/zldemo/source/browse/#svn/trunk/blog/singleton_everything）<br />
(墙内用户请不要使用https访问)<br />
--EOF--</p>
<p>p.s. 从 <a href="http://www.dbanotes.net/" target="_blank">DBA Notes</a>偷来EOF，顿感清爽不少</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.losthit.com/archives/singleton-everthing/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>从今天起努力做个客观的人</title>
		<link>http://blog.losthit.com/archives/be-objective-from-now/</link>
		<comments>http://blog.losthit.com/archives/be-objective-from-now/#comments</comments>
		<pubDate>Wed, 03 Feb 2010 14:37:46 +0000</pubDate>
		<dc:creator>Zealot</dc:creator>
				<category><![CDATA[Lifestyles]]></category>
		<category><![CDATA[生活]]></category>

		<guid isPermaLink="false">http://blog.losthit.com/?p=285</guid>
		<description><![CDATA[在网上流传着这样一句话：“把思考交给了电视，把联系交给了手机，把恋爱交给了网络，把双脚交给了汽车，把健康交给了药丸”。
        把思考从媒体中夺取过来，反而使得我们更加客观... ]]></description>
			<content:encoded><![CDATA[<p>在网上流传着这样一句话：“把思考交给了电视，把联系交给了手机，把恋爱交给了网络，把双脚交给了汽车，把健康交给了药丸”。</p>
<p>        把思考从媒体中夺取过来，反而使得我们更加客观。人云亦云，信息过载。面对大量信息的介入，我们也会思考，但会思考得很冲动，不知不觉主观上也会偏离正确的方向。<strong>冲动消费只会浪费金钱，冲动思考则会浪费智商。</strong>任何媒体，无论是电视、报纸还是网络，从来都不是客观的。大量吸收这些信息，而不加深入思考和判断，只会让我陷入别人的思维陷阱中。</p>
<p>        媒介影响我们思想的一个典型例子就是&#8221;80后&#8221;这个词。从某个&#8221;阴谋家&#8221;创造&#8221;80后&#8221;这个词之后，太多的人受到了相关的误导。而作为&#8221;80后&#8221;的我们又会怎么看呢？其实每个人心里都会有些自己的看法。相比那些&#8221;阴谋家&#8221;眼中&#8221;80后&#8221;的弱智行为，堕落状态，&#8221;80前&#8221;又能好的到哪里去呢？文化大革命中摧残人性的某些人，应该是一大群人，相比&#8221;80后&#8221;，不会感到汗颜吗？历史永远在进步，有理由相信新一代人整体上是会超越前一代人的。同样，我们也应当相信今天&#8221;脑残&#8221;、&#8221;弱智&#8221;、&#8221;不思进取&#8221;的&#8221;90后&#8221;将会超越我们尴尬的&#8221;80后&#8221;一代。历史将会用时间来证明这一点。</p>
<p>        回到主题，无论是&#8221;堕落的80后&#8221;，还是&#8221;脑残的90后&#8221;，都是被动接受的误导。客观的看待问题，不是一味的获取外界信息，更要有独立自主的思想。靠大量信息作为训练样本，基于统计方法得出结论，那是机器人。人，当有信仰，有独立的判断能力，而不受外界因素干扰。</p>
<p>        所以，我决定：从今天起，努力做一个客观的人。</p>
<p>补充：</p>
<p>        罗马不是一天建成的，习惯的改变需要不断的总结和改进，记录下来后经常反省和查看都是必须的。推荐Evernote软件，方便在便携设备上查看，同时也非常适合多平台间信息同步。比如&#8221;<a href="http://blog.losthit.com/archives/2009-review/" target="_blank">2009年个人总结</a>&#8220;，我就同步到itouch上的evernote中，上厕所时就看看&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.losthit.com/archives/be-objective-from-now/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Windows下文件搜索软件：Search Everything介绍</title>
		<link>http://blog.losthit.com/archives/recommend-software-search-everything/</link>
		<comments>http://blog.losthit.com/archives/recommend-software-search-everything/#comments</comments>
		<pubDate>Tue, 19 Jan 2010 15:46:37 +0000</pubDate>
		<dc:creator>Zealot</dc:creator>
				<category><![CDATA[Get Things Done]]></category>
		<category><![CDATA[软件]]></category>
		<category><![CDATA[ntfs]]></category>
		<category><![CDATA[problem]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[uac]]></category>
		<category><![CDATA[windows]]></category>
		<category><![CDATA[工具]]></category>
		<category><![CDATA[网络工具]]></category>

		<guid isPermaLink="false">http://blog.losthit.com/?p=278</guid>
		<description><![CDATA[以下是百度百科的介绍
Search Everything是速度最快的文件搜索软件。百G盘几十万个文件，可以在几秒钟之内完成索引；文件名搜索瞬间呈现结果。支持中文，支持正则表达式，可以通过HTTP或FTP分... ]]></description>
			<content:encoded><![CDATA[<p>以下是百度百科的介绍</p>
<blockquote><p><a href="http://www.voidtools.com" target="_blank">Search Everything</a>是速度最快的文件搜索软件。百G盘几十万个文件，可以在几秒钟之内完成索引；文件名搜索瞬间呈现结果。支持中文，支持正则表达式，可以通过HTTP或FTP分享搜索结　　果。如果不满意Windows自带的搜索工具、Total Commander的搜索、Google 桌面搜索或搜索，如果正在使用或放弃了Locate32，都值得推荐这款体积小巧、免安装、免费、速度极快的文件搜索工具。</p></blockquote>
<div class="wp-caption alignleft" style="width: 287px"><img class=" " title="Search Everything snapshot" src="http://www.voidtools.com/sssmall.jpg" alt="Search Everything 截图" width="277" height="213" /><p class="wp-caption-text">Search Everything 截图</p></div>
<p><strong>最喜欢的几大特点</strong></p>
<ol>
<li>体积小</li>
<li>速度快</li>
<li>支持正则匹配等复杂搜索条件</li>
<li>实时更新（安装软件比较明显：能实时看到新增加的文件）</li>
<li>支持远程部署(http/ftp等方式)</li>
</ol>
<p><strong>对我来说</strong><strong>不算致命的几个限制</strong></p>
<ol>
<li>仅支持NTFS格式的硬盘分区</li>
<li>仅支持文件名搜索</li>
</ol>
<p>在windows vista/win7中都会有受限于UAC，每次启动时都会弹出提示框。取消UAC自然不合适，Search Everything官网的FAQ已经给出了解决办法：<a href="http://blogs.techrepublic.com.com/window-on-windows/?p=616" target="_blank">Make Vista launch UAC restricted programs at startup with Task Scheduler</a>。<br />
<strong> 基本思想是</strong>：把Search Everything配置到计划任务里，每次系统启动时自动打开Search Everything，最关键的一点是计划任务中可以设置“以最高权限运行”。<br />
具体步骤可以参考上述网址，该网页中步骤极其详细，其实只有简单的几步而已。</p>
<p>我的配置如下</p>
<ol>
<li>创建计划任务
<p><div id="attachment_271" class="wp-caption alignnone" style="width: 303px"><a href="http://blog.losthit.com/wp-content/uploads/2010/01/step-1-create-task.png"><img class="size-full wp-image-271" title="step 1 - create task" src="http://blog.losthit.com/wp-content/uploads/2010/01/step-1-create-task.png" alt="第一步 创建任务" width="293" height="199" /></a><p class="wp-caption-text">第一步 创建任务</p></div></li>
<li>简单设置计划任务名称等信息。关键是设置“以最高权限执行” 计划任务
<p><div id="attachment_272" class="wp-caption alignnone" style="width: 642px"><a href="http://blog.losthit.com/wp-content/uploads/2010/01/step-2-task-setting.png"><img class="size-full wp-image-272" title="step 2 - task setting" src="http://blog.losthit.com/wp-content/uploads/2010/01/step-2-task-setting.png" alt="第二步 设置计划任务，关键是“以最高权限运行”" width="632" height="531" /></a><p class="wp-caption-text">第二步 设置计划任务，关键是“以最高权限运行”</p></div></li>
<li>创建触发器，选择系统启动时触发操作
<p><div id="attachment_273" class="wp-caption alignnone" style="width: 603px"><a href="http://blog.losthit.com/wp-content/uploads/2010/01/step-3-create-trigger.png"><img class="size-full wp-image-273" title="step 3 - create trigger" src="http://blog.losthit.com/wp-content/uploads/2010/01/step-3-create-trigger.png" alt="第三步 创建触发器" width="593" height="513" /></a><p class="wp-caption-text">第三步 创建触发器</p></div></li>
<li>设定操作：启动程序Search Everything
<p><div id="attachment_274" class="wp-caption alignnone" style="width: 457px"><a href="http://blog.losthit.com/wp-content/uploads/2010/01/step-4-operation.png"><img class="size-full wp-image-274" title="step 4 - operation" src="http://blog.losthit.com/wp-content/uploads/2010/01/step-4-operation.png" alt="第四步 设置操作" width="447" height="265" /></a><p class="wp-caption-text">第四步 设置操作</p></div></li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://blog.losthit.com/archives/recommend-software-search-everything/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Blog大事记</title>
		<link>http://blog.losthit.com/archives/sitelog/</link>
		<comments>http://blog.losthit.com/archives/sitelog/#comments</comments>
		<pubDate>Mon, 18 Jan 2010 17:43:50 +0000</pubDate>
		<dc:creator>Zealot</dc:creator>
				<category><![CDATA[Blog历程]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[sitelog]]></category>

		<guid isPermaLink="false">http://blog.losthit.com/?p=259</guid>
		<description><![CDATA[随手记备忘录是个好习惯，呵呵。

2010年1月，Blog迁移到Linode VPS上，彻底解决了古董机的mysql、apache、ip不稳定的问题：Blog使用美帝VPS：Linode服务介绍。
2009年8月15日，水木上淘到一个p3 CPU的古... ]]></description>
			<content:encoded><![CDATA[<p>随手记备忘录是个好习惯，呵呵。</p>
<ul>
<li>2010年1月，Blog迁移到Linode VPS上，彻底解决了古董机的mysql、apache、ip不稳定的问题：<a href="http://blog.losthit.com/archives/linode-vps/" target="_blank">Blog使用美帝VPS：Linode服务介绍</a>。</li>
<li>2009年8月15日，水木上淘到一个p3 CPU的古董机，100大洋(RMB)，并开始运行Blog</li>
<p>程序，ADSL环境。该古董配置：GenuineIntel Pentium III (Katmai) 501.159MHz/3个内存条共386M/8G硬盘。系统是Debian etch，linux 2.6.28。运行Blog服务使用的是apache2/php5/mysql5/wordpress2.8。</p>
<li>2006年3月，开始写Blog，貌似是在hitidea.org上: zealot.hitidea.org。该博客服务由Berg童鞋提供，并友情支持了域名绑定。</li>
</ul>
<p>&#8211;<br />
此文不间断更新中……</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.losthit.com/archives/sitelog/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Blog使用美帝VPS：Linode服务介绍</title>
		<link>http://blog.losthit.com/archives/linode-vps/</link>
		<comments>http://blog.losthit.com/archives/linode-vps/#comments</comments>
		<pubDate>Mon, 18 Jan 2010 17:03:55 +0000</pubDate>
		<dc:creator>Zealot</dc:creator>
				<category><![CDATA[Blog历程]]></category>
		<category><![CDATA[杂七杂八]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[linode]]></category>
		<category><![CDATA[sitelog]]></category>
		<category><![CDATA[vps]]></category>

		<guid isPermaLink="false">http://blog.losthit.com/?p=243</guid>
		<description><![CDATA[写在前面：首先强调，这不是话题广告。刚换掉了古董机，算是鸟枪换大炮吧，总结后庆祝一下。


突然购买Linode.com服务，直接原因是一时头脑发热。根本原因是ADSL里放Blog太不靠谱了，ip经常... ]]></description>
			<content:encoded><![CDATA[<p><em>写在前面</em>：首先强调，<strong>这不是话题广告</strong>。刚换掉了古董机，算是鸟枪换大炮吧，总结后庆祝一下。
</p>
<div id="attachment_248" class="wp-caption alignnone" style="width: 298px"><a href="http://blog.losthit.com/wp-content/uploads/2010/01/linode_logo_gray.png"><img class="size-full wp-image-248" title="linode_logo_gray" src="http://blog.losthit.com/wp-content/uploads/2010/01/linode_logo_gray.png" alt="linode.com logo" width="288" height="65" /></a><p class="wp-caption-text">linode.com logo</p></div>
<p>
突然购买<a href="http://www.linode.com/?r=2e236898b83cd7963f1cb6136e7b00cb9f13d1d8" target="_blank">Linode.com</a>服务，直接原因是一时头脑发热。根本原因是ADSL里放Blog太不靠谱了，ip经常更换，因此，需要时不时的更新DNS解析（DNS重新解析不会立即生效，慢则需要好几个小时）。观察了一周，服务、速度、稳定性都非常不错。
</p>
<p>
换用Linode后Google Analytics中的change项终于变绿了：</p>
<div id="attachment_250" class="wp-caption alignnone" style="width: 395px"><a href="http://blog.losthit.com/wp-content/uploads/2010/01/Blog-rate-in-Google-Analytics.png"><img class="size-full wp-image-250" title="Blog rate in Google Analytics" src="http://blog.losthit.com/wp-content/uploads/2010/01/Blog-rate-in-Google-Analytics.png" alt="Blog rate in Google Analytics" width="385" height="79" /></a><p class="wp-caption-text">Blog rate in Google Analytics</p></div>

<p>
<strong>在家里ADSL环境下使用古董机就是这样浪费生命的</strong></p>
<ol>
<li>话说以前Blog是架在这样一台100大洋(RMB)的古董机上：GenuineIntel Pentium III (Katmai) 501.159MHz/3个内存条共386M/8G硬盘/Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8139/8139C/8139C+/VGA compatible controller: Matrox Graphics, Inc. MGA G400/G450。系统是Debian etch，linux 2.6.28。</li>
<li>运行Blog服务使用的是apache2/php5/mysql5/wordpress2.8，瓶颈在CPU上，一次请求apache占用CPU就超过60%。试探性使用nginx，这才发现需要配置factcgi，可耻地失败鸟。</li>
<li>Mysql平均每个月挂掉2次，好在每次mysql check/repair都顺利的修复了。即使没有mysql crash，备份也还是很必要的。第一次crash后我就加了简单的自动备份脚本，每天凌晨自动备份，最多保留9份拷贝。</li>
<li>由于家里上网时ADSL，ip时常被更换，所以得记录ip，方便随时随地远程访问。在Google App Engine上起个服务记录访问ip，过滤掉公司的ip。家里的台式机上每隔一分钟访问一下这个ip。每次ip变换后就手动修改blog域名的dns解析。Dns解析开放api访问就好了。</li>
</ol>
<p>
鉴于上述种种不可饶恕的浪费时间行为，忍痛买了国外的vps。而且以后配置wordpress上twitter插件也很容易了。选Linode很偶然，上网看见<a href="http://twitter.com/Fenng" target="_blank">@Fenng</a>的Blog<a href="http://www.dbanotes.net/sitelog/linode_vps.html" target="_blank">使用这个</a>，应该不会太烂，价格也可以接受。这里也有一个推荐，介绍也很详细：<a href="http://www.blogkid.net/linode" target="_blank">http://www.blogkid.net/linode</a>。
</p>
<p>
注册Linode非常简单，特别注意的是<strong>亚洲访问速度较快的data center是旧金山的Fremont </strong>，不要选错了。不过即使错了，也不用担心，我就选错了。在support页面咨询了一下客服，一顿饭功夫人家就帮忙换了个data center，自己只需要按照说明点三个按钮：关机、迁移、重启。
</p>
<p>
Blog迁移异常顺利，不到1小时完成了所有工作。系统选用Debian 5.0，候选系统也超多。LAMP安装工具使用apt，参考这里：“<a href="http://www.howtoforge.com/ubuntu_debian_lamp_server" target="_blank">How To Set Up A Ubuntu/Debian LAMP Server</a>”。
</p>
<p>
使用国外vps，最大好处是配置twiter插件，搭建某推的api都非常容易。以前用自己的台式机时，每次都想方设法修改代码，强制使用tor代理，而且速度贼慢。
</p>
<p>
现在空间、带宽冗余很多，有空整点好玩的东西，呵呵。<br />
<strong> AD</strong>：需要注册的话，可以点这个推广的refer链接：<a href="http://www.linode.com/?r=2e236898b83cd7963f1cb6136e7b00cb9f13d1d8" target="_blank">http://www.linode.com/?r=2e236898b83cd7963f1cb6136e7b00cb9f13d1d8</a>，按照说明应该会给我返利。
</p>
<p>
Btw：最后跑题说另一个使用虚拟化服务的case，twitter架构中考虑突发事件带来的访问洪峰问题时，购买了云计算服务。好处是避免了自行购买的设备长期闲置，导致浪费。Linode同样可以按需购买相应服务，升降级都很方便。
</p>
<p>
补充：使用的Linode 360配置如下</p>
<ul>
<li>RAM: 360MB</li>
<li>Storage: 16GB</li>
<li>Transfer: 220GB</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.losthit.com/archives/linode-vps/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>2009年个人总结</title>
		<link>http://blog.losthit.com/archives/2009-review/</link>
		<comments>http://blog.losthit.com/archives/2009-review/#comments</comments>
		<pubDate>Thu, 31 Dec 2009 15:22:08 +0000</pubDate>
		<dc:creator>Zealot</dc:creator>
				<category><![CDATA[GTD]]></category>
		<category><![CDATA[Review]]></category>
		<category><![CDATA[个人总结]]></category>

		<guid isPermaLink="false">http://blog.losthit.com/?p=229</guid>
		<description><![CDATA[2009年最成功、最重要的事
想好了奋斗的方向：专心研究技术，踏实地做好基础技能学习（学和习）。
对比过去
踏踏实实做事真的很难，也是很多年轻人被抱怨的一个很大因素，而我更是如此... ]]></description>
			<content:encoded><![CDATA[<p><strong>2009年最成功、最重要的事</strong><br />
想好了奋斗的方向：专心研究技术，踏实地做好基础技能学习（学和习）。</p>
<p><strong>对比过去</strong><br />
踏踏实实做事真的很难，也是很多年轻人被抱怨的一个很大因素，而我更是如此。摒弃浮躁，踏实做事，该来的总会来。</p>
<p><strong>2009年发生了什么</strong><br />
重新提起对数学和英语的兴趣，并开始系统的学习。除此之外，发现了很多问题，并独立思考解决方案。当然，方案和想法不是想出来，更多是在学习中去挖掘。过去一年中从各种途径获取了推荐的非常不错的书籍以及其他信息，并从中学习到很多知识，关于软件项目、个人管理、编程技能……<br />
关于工作，2009年公司被收购，总体来说一切都在往好的方向发展，准确来说是转变。努力尝试从一个旁观者姿态来看的话，发现一路过来跌宕起伏，一次次的转变都静悄悄地降临在自己身上，乍一看不可思议，却也非常自然去走过来，感觉很奇妙。<br />
关于感情，过去一年和亲友交流少了些。有些东西一旦放松就有可能逐渐远去，真的在乎就不能回避，甚至忽视。不过，上半年被QQ、MSN、GTalk、校内等社交网络中无关信息打扰地太严重了，2010年得认真解决这个问题。感谢那些却始终惦记着我的人。<br />
2009也是一个令人失望的一年，眼睁睁看着这个国家的文明一次次倒退，却无能为力。能做的只是顺着众网民的大流：微动力，广天下。</p>
<p><strong>2009年最兴奋的事</strong><br />
看见好书，立马上网下订单，而不用像上学时那样苦苦纠结。不过，现在书累计重量接近我的小冰箱了，下次搬家将会很郁闷。</p>
<p><strong>2010年目标</strong><br />
1. 学习和提高<br />
a) 数学和英语，这两个都是基础，目前已经开始实施，按部就班，按需微调，暂时不需目标来指导。尽量做到平均每周能有4天中独立出一段有价值的时间来学习数学和英语。<br />
b) 编程经验，感觉过去一年看了太多的书，写的代码相对来说却不够。不过，按照提交的工作计划，2010年将会极大改善，我个人很期待。当然，09年积累下来的知识，包括个人管理经验，以及对软件项目认识的加深等，将会非常有益于将来的工作安排，不至于总是被计划外的事情和意外折腾地措手不及。<br />
c) 调整好作息，善待自己。今年对厨艺稍微研究了一阵子，已经能自己带饭上班了。在这个只有母乳相对来说比较安全的国家，安全饮食根本不现实，只希望自己能尽力做到最好吧，没有什么比健康更重要了。<br />
2. 改进和突破点<br />
a) 多与亲友交流。除了编程，还有很多事情能让生活变得有趣，不要让任何一个理由抢占了分享的乐趣。<br />
b) 多锻炼，小区跑步的人不少，天气好些时，可以尝试开始锻炼，并养成1个习惯用于健身（骑自行车上班不算）。<br />
c) 至少参加1次公益活动，内容不限。<br />
d) 至少养成1个好习惯，除之前提及的不算，内容不限，可以是工作管理、作息规范、锻炼等。<br />
3. 重复一点：善于休息。<br />
<strong>一句话感想：有啥也别有病，没啥也别没精神。</strong></p>
<p>p.s. 2010怎么发音</p>
<div id="attachment_239" class="wp-caption alignnone" style="width: 640px"><a href="http://blog.losthit.com/wp-content/uploads/2009/12/Screen-shot-2009-12-30-at-3.33.23-PM-630x352.png"><img class="size-full wp-image-239" title="How Are We Going To Say “2010″" src="http://blog.losthit.com/wp-content/uploads/2009/12/Screen-shot-2009-12-30-at-3.33.23-PM-630x352.png" alt="How Are We Going To Say “2010″" width="630" height="352" /></a><p class="wp-caption-text">How Are We Going To Say “2010″</p></div>
<p>图片来自：<a href="http://tc50tweets.techcrunch.com/story/396885318/how-are-we-going-to-say-%E2%80%9C2010%E2%80%B3-a-website-comes-just-in-the-nick-of-time" target="_blank">http://tc50tweets.techcrunch.com/story/396885318/how-are-we-going-to-say-%E2%80%9C2010%E2%80%B3-a-website-comes-just-in-the-nick-of-time</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.losthit.com/archives/2009-review/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>工作邮件处理技巧 &#8211; Outlook</title>
		<link>http://blog.losthit.com/archives/cleanup-mails-inbox-for-outlook/</link>
		<comments>http://blog.losthit.com/archives/cleanup-mails-inbox-for-outlook/#comments</comments>
		<pubDate>Sat, 26 Dec 2009 05:38:51 +0000</pubDate>
		<dc:creator>Zealot</dc:creator>
				<category><![CDATA[GTD]]></category>
		<category><![CDATA[Get Things Done]]></category>
		<category><![CDATA[mail]]></category>
		<category><![CDATA[outlook]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[邮件]]></category>

		<guid isPermaLink="false">http://blog.losthit.com/?p=221</guid>
		<description><![CDATA[本文主要针对outlook，不是因为outlook多么强大，而是很多公司考虑到保密问题都会自己建立邮件服务器。并且，公司内沟通经常使用约会、会议邀请等功能，也只有采用outlook那一大坨东西。
Outl... ]]></description>
			<content:encoded><![CDATA[<div id="attachment_224" class="wp-caption alignleft" style="width: 251px"><a href="http://blog.losthit.com/wp-content/uploads/2009/12/outlook2007previewlc61.jpg"><img class="size-full wp-image-224  " title="outlook 2007" src="http://blog.losthit.com/wp-content/uploads/2009/12/outlook2007previewlc61.jpg" alt="outlook 2007" width="241" height="235" /></a><p class="wp-caption-text">outlook 2007</p></div>
<p>本文主要针对outlook，不是因为outlook多么强大，而是很多公司考虑到保密问题都会自己建立邮件服务器。并且，公司内沟通经常使用约会、会议邀请等功能，也只有采用outlook那一大坨东西。<br />
Outlook最大的麻烦就一个字：慢。用过outlook的人都应该有所体会。想要改善outlook速度只有一个办法：删掉所有的邮件。<strong>真的，删掉，全部删掉。</strong>一年前看到outlook数据文件达到400多兆时，我就毫不犹豫的选择了这个方法。后来，删掉这些邮件确实没有什么不好的影响。<br />
日常管理时，尽量做到每收一封邮件就删掉。即使保留部分邮件，也应该控制保存时间尽量不要超过一周。<br />
删掉后那些信息上哪找去？每一封邮件都有不同信息，需要放到不同地方，但绝对不应该原封不动地躺在收件箱里。<br />
1）    通知公告类，看完就删<br />
2）    垃圾邮件，删除<br />
3）    需要确认某项操作的，回复，删除。<br />
4）    报警、出错信息，加入todo，删除。<br />
5）    有任务分配的邮件，加入todo，删除。<br />
6）    邮件内容超长，标记未读，有时间再看；看完后，删除。（更好的方案是，转存到手机上，然后删除。我用的是evernote，直接集成到outlook中，不到1秒钟就可以完成转存工作）<br />
7）    有重要信息，比如合作方联系方式（多在签名档中）。存到wiki，然后删除。这样做好处很多，首先，累积的邮件会使outlook变得极其臃肿，速度会大幅下降；其次，wiki很方便地与同事共享；最后，也是最重要一点，你离职的话需多久时间整理这些信息？事实上，离职后都会忘了处理这些信息。我就经历过这种痛苦，接手某项工作后，很多一部分精力都在查找各合作方的联系方式、以及相关的合作文档。<br />
8）    其他，尽量删除吧。<br />
关于存档，用outlook管理的话不推荐使用存档，存档会让你的outlook慢如蜗牛。我采用的方法是，笔记本上处理完邮件后立即删除。在公司的台式机上接受所有邮件，但不做任何处理，必要时会查询。事实上，基本上一个月也很难查1、2次。（只有一台电脑的话可以再启用另一个简单、便于查询的邮件工具来备份所有邮件，比如foxmail）</p>
<p>参考资料：<br />
1）    这本书中有专门章节来讨论邮件处理技巧：《时间管理—给系统管理员》，http://www.douban.com/subject/2253513/。<br />
2）    Zenhabits也有专门的讨论，可以参考，基本上思想差不多：http://zenhabits.net/2007/01/email-zen-clear-out-your-inbox/</p>
<blockquote><p>1)<strong> Don’t check email first thing in the morning, or have it constantly on</strong>. This is a tip offered by many blogs, so nothing new here. Checking email first thing will get you stuck in email for awhile. Instead, do your most important thing for the day, or the thing you’ve been procrastinating on the most. Then check email. Better yet, do 2 or 3 things first. Also, if you are constantly checking email throughout the day, or it notifies you as soon as an email comes in, you will be constantly distracted and not able to focus on the task before you. I check once an hour, but you might have different needs.<br />
2) <strong>When you check your email, dispose of each one, one at a time, right away.</strong> Make a decision on what needs to be done on each email.<br />
2a) Is it junk or some forwarded email? Trash it immediately.<br />
2b) Is it a long email that you just need to read for information? File it in a Read folder (or tag it Read and archive) or print it to read on the road (while waiting in line, for example).<br />
2c) If the email requires action, make a note of the action on your to-do or GTD lists to do later. Also note to check the email for info if necessary. Then archive the email. You can easily find it later when you need to do that task.<br />
2d) If you can respond to it in a minute or two, do so immediately. Don’t put it off. If you wait, you’ll end up with a backlog of emails to respond to, and you may never get around to it. I respond quickly, with a short note, and send it right away. That way I’m viewed as responsive and on top of things.<br />
2e) If you need to follow up on the email later, or are waiting for a response, note it on a Waiting For list. Don’t just leave it in your inbox as a reminder.<br />
3) <strong>I have only one folder: Archive.</strong> When I respond to an email, or finish reading it if it doesn’t need response, or note it on my to-do list, I archive it. Simple as that. You could add a Read folder if you want. I usually print longer ones to read later, like during lunch or while waiting for something. Other people have an Action folder or a Waiting For folder, but I find that that’s just an additional inbox (or “bucket” as GTD’s David Allen calls it) that you have to constantly check. I don’t like to check extra folders. I have my to-do lists and my Waiting For list, and that’s good enough. So it’s as simple as pressing “Archive” on an email, and if I need to find it later, Gmail’s search is so good that it’s easy to find. I’ve never had any problems with this system.<br />
Email Zen is that easy: check email at regular periods, take action on each email right away (or note it on a list to do later) and archive.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://blog.losthit.com/archives/cleanup-mails-inbox-for-outlook/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
