<?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>Mingbo</title>
	<atom:link href="http://mingbo.de/feed/" rel="self" type="application/rss+xml" />
	<link>http://mingbo.de</link>
	<description>一个劣质程序员的随想。</description>
	<lastBuildDate>Sat, 03 Mar 2012 09:42:09 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>新浪微博提醒脚本</title>
		<link>http://mingbo.de/2012/02/07/python-script-of-sina-weibo-notification/</link>
		<comments>http://mingbo.de/2012/02/07/python-script-of-sina-weibo-notification/#comments</comments>
		<pubDate>Tue, 07 Feb 2012 16:58:36 +0000</pubDate>
		<dc:creator>shaomingbo</dc:creator>
				<category><![CDATA[我的程序]]></category>
		<category><![CDATA[网络应用]]></category>
		<category><![CDATA[BUG]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[微博]]></category>

		<guid isPermaLink="false">http://mingbo.de/?p=188</guid>
		<description><![CDATA[无意中在微博上看到@乌云-漏洞报告平台 提起了一个关于“消息提醒未授权访问”的BUG。大致的看了一下网站上的截图，配合新浪微博的API 文档的介绍，估摸着弄了一下这个漏洞的实现脚本。其实，从实用的角度来看，这个BUG，基本上算不上严重（乌云的自评级才到3），也没有啥利用价值。又或者，像某位网友说的那样“由于这个接口流量过大而省去了认证环节”，而故意为之。 那，我为什么想着用脚本实现去利用这个漏洞呢？缘起放假前的一个idea。那段时间（包括现在）每天都在刷微博，浏览各种新闻网站，对网络产生了一种病态的依赖。想着，如果有一套提醒系统，在我关心的信息出现时，就自动推送给我，那该多好啊。而微博提醒自然可以通过其提供的API 来轻易实现。只不过当时玩API的时候没有注意别人的消息而已。 最近在看python 有关的书。目前，第二本已经看了一大半。寻思着练手的时候，正好可以借这个机会发挥一下。所以，这篇博客算是一个菜鸟看书笔记吧。如我微博所言，随便扫描了一圈，发现名人、艺人的微博信息普遍过载，而草根和技术流的微博都比较清静。下面是截图：这里是另外一张 python 脚本： #coding: gbk import urllib,sys #appkey = 从sina API申请 class SINA(object): '''简单的调用新浪微博OPEN API DEMO: s = SINA() flag = s.init_api_object(appkey, u'陈坤') if flag: uid = s.get_uid() ''' api_base_path = 'http://api.t.sina.com.cn/users/show.json?source=' def __init__(self): self.sina = {} @staticmethod def build_api_url(appkey, user_screen_name): '''生成新浪API URL ''' if appkey and user_screen_name: try: return [...]]]></description>
			<content:encoded><![CDATA[<p>无意中在微博上看到<a href="http://weibo.com/1981622273/y45XubyFR" target="_blank">@乌云-漏洞报告平台</a> 提起了一个关于“<a href="http://www.wooyun.org/bugs/wooyun-2010-04224" target="_blank">消息提醒未授权访问</a>”的BUG。大致的看了一下网站上的截图，配合<a href="http://open.weibo.com/wiki/API%E6%96%87%E6%A1%A3_V2" target="_blank">新浪微博的API 文档</a>的介绍，估摸着弄了一下这个漏洞的实现脚本。其实，从实用的角度来看，这个BUG，基本上算不上严重（乌云的自评级才到3），也没有啥利用价值。又或者，像某位网友说的那样“由于这个接口流量过大而省去了认证环节”，而故意为之。</p>
<p>那，我为什么想着用脚本实现去利用这个漏洞呢？缘起放假前的一个idea。那段时间（包括现在）每天都在刷微博，浏览各种新闻网站，对网络产生了一种病态的依赖。想着，如果有一套提醒系统，在我关心的信息出现时，就自动推送给我，那该多好啊。而微博提醒自然可以通过其提供的API 来轻易实现。只不过当时玩API的时候没有注意别人的消息而已。</p>
<p>最近在看python 有关的书。目前，第二本已经看了一大半。寻思着练手的时候，正好可以借这个机会发挥一下。所以，这篇博客算是一个菜鸟看书笔记吧。如我微博所言，随便扫描了一圈，发现名人、艺人的微博信息普遍过载，而草根和技术流的微博都比较清静。下面是截图：<a href="https://lh6.googleusercontent.com/-ced0CSxDZLA/TzAVmVfEkRI/AAAAAAAAAP0/rQK839BJo1s/s800/CentOS-2012-02-06-22-34-41.jpg" target="_blank">这里是另外一张</a></p>
<p><img class="aligncenter" src="https://lh6.googleusercontent.com/-au45w1RJCAY/TzAVies4pPI/AAAAAAAAAPs/7B_MJYm5f0c/s640/CentOS-2012-02-06-22-21-30.jpg" alt="" width="640" height="480" data-pinit="registered" /></p>
<p>python 脚本：</p>
<pre>
#coding: gbk
import urllib,sys

#appkey = 从sina API申请

class SINA(object):
    '''简单的调用新浪微博OPEN API
    DEMO:
    s = SINA()
    flag = s.init_api_object(appkey, u'陈坤')
    if flag:
        uid = s.get_uid()
    '''
    api_base_path = 'http://api.t.sina.com.cn/users/show.json?source='    

    def __init__(self):
        self.sina = {}

    @staticmethod
    def build_api_url(appkey, user_screen_name):
        '''生成新浪API URL
        '''
        if appkey and user_screen_name:
            try:
                return SINA.api_base_path + str(appkey) + '&#038;screen_name=' \
                    + urllib.quote(user_screen_name.decode(sys.stdin.encoding).encode('utf8'))
            except :
                return False
        else:
            return None

    def init_api_object(self, appkey, user_screen_name):
        ''' 初始化API对象
        appkey：从 [http://open.weibo.com/]申请
        user_screen_name:就是微博界面上显示的名称
        '''
        try:
            api = SINA.build_api_url(appkey, user_screen_name)
            if api:
                dic = urllib.urlopen(api).read()
                dic = eval(str(dic).replace('false', 'False').replace('true', 'True').replace('null', 'None'))
                if dic.has_key('error'):
                    return False
                else:
                    self.sina = dic
            else:
                return False
        except:
            return False
        else:
            return True

    def get_uid(self):
        '''获取UID
        '''
        if self.sina:
            return self.sina['id']
        else:
            return None

    def get_description(self):
        '''获取自我介绍
        '''
        if self.sina:
            return self.sina['description']
        else:
            return None

    def get_gender(self):
        '''获取用户性别
        '''
        gender = {'m': 'male', 'f':'femail'}
        if self.sina:
            return gender[self.sina['gender']]
        else:
            return None

    def get_followers_count(self):
        '''获取粉丝数量
        '''
        if self.sina:
            return self.sina['followers_count']
        else:
            return None

    def get_friends_count(self):
        '''获取关注数量
        '''
        if self.sina:
            return self.sina['friends_count']
        else:
            return None

    def get_statuses_count(self):
        '''获取微博数量
        '''
        if self.sina:
            return self.sina['statuses_count']
        else:
            return None

    def get_favourites_count(self):
        '''获取微博收藏数量
        '''
        if self.sina:
            return self.sina['favourites_count']
        else:
            return None

    def get_image_url(self):
        '''获取微博头像
        '''
        if self.sina:
            return self.sina['profile_image_url']
        else:
            return None

    def get_domain(self):
        '''获取微博地址
        '''
        if self.sina:
            return self.sina['domain']
        else:
            return None

    def get_location(self):
        '''获取所在位置
        '''
        if self.sina:
            return self.sina['location']
        else:
            return None

class SINA_NOTIFICATION(object):
    '''SINA 微博消息API
    DEMO:
    s = SINA()
    flag = s.init_api_object(APPKEY, u'陈坤')
    if flag:
        uid = s.get_uid()
        sn = SINA_NOTIFICATION()
        nf_flag = sn.init_notification(APPKEY, uid)
        if nf_flag:
            ns = sn.notifications()
            for item in ns:
                print "%s: %d"%(SINA_NOTIFICATION.dic[item],sn.get(item))
    '''
    api_base_path = 'http://api.t.sina.com.cn/remind/unread_count.json?source='

    dic = {'attention':u'有新的粉丝',
           'comment':u'有新的评论',
           'msg':u'有新的私信',
           'atme':u'有新提及我的微博',
           'atcmt':u'有新提及我的评论',
           'group':u'有新的微群消息',
           'notice':u'有新通知',
           'invite':u'有新的邀请',
           'badge':u'有新的徽章',
           'photo':u'有新的相册消息'}

    def __init__(self):
        self.nf = {}

    @staticmethod
    def build_api_url(appkey, uid):
        '''生成API URL
        '''
        if appkey and uid:
            try:
                return SINA_NOTIFICATION.api_base_path + str(appkey) + '&#038;user_id=' + str(uid)
            except:
                return False
        else:
            return False

    def init_notification(self, appkey, uid):
        '''初始化提醒对象
        '''
        try:
            api = SINA_NOTIFICATION.build_api_url(appkey, uid)
            if api:
                dic = urllib.urlopen(api).read()
                import os
                self.nf = eval(dic.replace('\r\n', os.linesep))#Linux support
            else:
                return False
        except:
            return False
        else:
            return True

    def notifications(self):
        '''呈现消息
        '''
        n_list = []
        if self.nf:
            for item in self.nf:
                if item == 'feed':
                    continue
                if self.nf[item] > 0:
                    n_list.append(item)
            return n_list
        else:
            return None

    def has_notification(self):
        '''是否有新的微博消息
        '''
        if self.nf:
            cnt = 0
            for item in self.nf:
                if item == 'feed':
                    continue
                cnt += self.nf[item]
            if cnt > 0:
                return True
            else:
                return False

    def get_atme(self):
        '''新提及我的微博数
        '''
        if self.nf:
            return self.nf['atme']
        else:
            return None

    def get_private_message(self):
        '''新私信数
        '''
        if self.nf:
            return self.nf['msg']
        else:
            return None

    def get_comment(self):
        '''新评论数
        '''
        if self.nf:
            return self.nf['comment']
        else:
            return None

    def get_atcmt(self):
        '''@新提及我的评论数
        '''
        if self.nf:
            return self.nf['atcmt']
        else:
            return None

    def get_group(self):
        '''微群消息未读数
        '''
        if self.nf:
            return self.nf['group']
        else:
            return None

    def get_photo(self):
        '''相册消息未读数
        '''
        if self.nf:
            return self.nf['photo']
        else:
            return None

    def get_invite(self):
        '''新邀请未读数
        '''
        if self.nf:
            return self.nf['invite']
        else:
            return None

    def get_badge(self):
        '''新勋章数
        '''
        if self.nf:
            return self.nf['badge']
        else:
            return None

    def get_notice(self):
        '''新通知未读数
        '''
        if self.nf:
            return self.nf['notice']
        else:
            return None

    def get_attention(self):
        '''新粉丝数
        '''
        if self.nf:
            return self.nf['attention']
        else:
            return None

    def get(self, lable):
        '''
        '''
        if lable not in ("attention","comment","msg","atme","atcmt","group","notice","invite","badge","photo"):
            return None
        if self.nf:
            return self.nf[lable]
        else:
            return None

if __name__ == '__main__':
    name = raw_input('请输入需要查询的昵称：')
    s = SINA()
    flag = s.init_api_object(appkey, name)
    if flag:
        uid = s.get_uid()
        sn = SINA_NOTIFICATION()
        nf_flag = sn.init_notification(appkey, uid)
        if nf_flag:
            if sn.has_notification():
                ns = sn.notifications()
                for item in ns:
                    print "%s: %d"%(SINA_NOTIFICATION.dic[item],sn.get(item))
            else:
                print '暂时还没有新的微博提醒'
        else:
            print 'something is error'.title()
    else:
        print ('没有找到与%s匹配的信息！'%name).title()
</pre>
<p>就在写博客的时候，我忽然想到可以把这个接口的数据进行稍微的梳理。比如找出名人堂里<a href="http://data.weibo.com/top/influence/famous" target="_blank">影响力排行榜</a>前50的大V们，谁获得的@最多，谁私信最多，谁新增的粉丝最多，谁收到的评论最多&#8230;等等。于是停下了博客的更新，顺手写下了后面的这个脚本。虽然，拿到的数据也没有什么商业价值，但起码，对于一个刚刚熟悉脚本的人来说，算是玩尽兴了。ok, 上代码：</p>
<pre>
#coding: gbk
from sina import SINA, SINA_NOTIFICATION

#appkey = 才sina API申请
person_list = ['文章同學', '蔡康永', '陈坤', '吴奇隆', '何炅', '杨幂',
               '任志强', '羅志祥','刘忻', '潘石屹', '陆琪', '宋丹丹',
               '方舟子','魏晨','张杰','韩庚', '姚晨', '李开复', '韩志国',
               '薛蛮子', '王力宏','马伊琍','汪东城', '周笔畅', '周立波',
               '舒淇', '陈翔橙', '慕容雪村', '阿信', '宁财神', '范范范瑋琪',
               '乐嘉', '企业家智库', '夢想家林志穎', '郭敬明', '炎亞綸','edc陳冠希',
               '张小娴', '张泉灵', '小霜', '小P老师', '谢娜', '高考直通车', '罗玉凤',
               '黑人建州', '牛尔', '鍾欣桐', '杜海涛Hito', '加措活佛-慈爱基金', '总裁语录'
               ]

def name_to_id(name, appkey):
    s = SINA()
    flag = s.init_api_object(appkey, name)
    if flag:
        return s.get_uid()

import cPickle
def save_id():
    person_id = {}
    try:
        for item in person_list:
            person_id[item] = name_to_id(item, appkey)
        if len(person_id) == 50:
            pfile = open('person_id.dat','wb')
            cPickle.dump(person_id, pfile, protocol=0)
            pfile.close()
        else:
            return False
    except:
        return False
    else:
        return True

def save_dic():
    person_dic = {}
    try:
        pfile = open('person_id.dat','rb')
        ids = cPickle.load(pfile)
        pfile.close()
        for item in person_list:
            uid = ids[item]
            sn = SINA_NOTIFICATION()
            nf_flag = sn.init_notification(appkey, uid)
            if nf_flag:
                person_dic[item] = sn.nf
        if len(person_dic) == 50:
            dic_file = open('person_dic.dat', 'wb')
            cPickle.dump(person_dic, dic_file, protocol=0)
        else:
            return False
    except:
        return False
    else:
        return True

def get_top_atme():
    dic_file = open('person_dic.dat', 'rb')
    dic = cPickle.load(dic_file)
    dic_file.close()
    atme_dic = {}
    for item in person_list:
        atme_dic[item] = dic[item]['atme']

    s_list = sorted(atme_dic.items(), lambda x, y: cmp(x[1],y[1]), reverse = True)
    return s_list[0][0], s_list[1][0], s_list[2][0]

def get_top_cmt():
    dic_file = open('person_dic.dat', 'rb')
    dic = cPickle.load(dic_file)
    dic_file.close()
    cmt_dic = {}
    for item in person_list:
        cmt_dic[item] = dic[item]['comment']

    s_list = sorted(cmt_dic.items(), lambda x, y: cmp(x[1],y[1]), reverse = True)
    return s_list[0][0], s_list[1][0], s_list[2][0]            

def get_top_msg():
    dic_file = open('person_dic.dat', 'rb')
    dic = cPickle.load(dic_file)
    dic_file.close()
    cmt_dic = {}
    for item in person_list:
        cmt_dic[item] = dic[item]['msg']

    s_list = sorted(cmt_dic.items(), lambda x, y: cmp(x[1],y[1]), reverse = True)
    return s_list[0][0], s_list[1][0], s_list[2][0] 

def get_top_new_followers():
    dic_file = open('person_dic.dat', 'rb')
    dic = cPickle.load(dic_file)
    dic_file.close()
    cmt_dic = {}
    for item in person_list:
        cmt_dic[item] = dic[item]['attention']

    s_list = sorted(cmt_dic.items(), lambda x, y: cmp(x[1],y[1]), reverse = True)
    return s_list[0][0], s_list[1][0], s_list[2][0]
import time

if __name__ == '__main__':
    print '现在时刻：',time.ctime()
    if save_id():
        if save_dic():
            func_list = [get_top_atme, get_top_cmt, get_top_msg, get_top_new_followers]
            func_name = {get_top_atme: '@', get_top_cmt: '评论',
                 get_top_msg: '私信', get_top_new_followers: '新粉丝'
                 }
            for item in func_list:
                print '此刻, 获得最多%s的人是:'%func_name[item]
                for it in item():
                    print '\t',it,'\t'
                print '*'*40
    print '处理完成：',time.ctime()
</pre>
<p>脚本的输出结果：</p>
<blockquote><p>现在时刻： Wed Feb 08 00:15:36 2012<br />
此刻, 获得最多@的人是:<br />
方舟子<br />
张小娴<br />
edc陳冠希<br />
****************************************<br />
此刻, 获得最多评论的人是:<br />
谢娜<br />
刘忻<br />
张杰<br />
****************************************<br />
此刻, 获得最多私信的人是:<br />
薛蛮子<br />
慕容雪村<br />
阿信<br />
****************************************<br />
此刻, 获得最多新粉丝的人是:<br />
方舟子<br />
张杰<br />
陈坤<br />
****************************************<br />
处理完成： Wed Feb 08 00:17:25 2012</p></blockquote>
<p>参考资料：</p>
<p><a href="http://open.weibo.com/wiki/2/remind/unread_count" target="_blank">新浪微博API 文档V2</a></p>
<p><a href="http://www.wooyun.org/bugs/wooyun-2010-04224" target="_blank">乌云-漏洞报告平台：新浪微博消息提醒未授权漏洞概要</a></p>
]]></content:encoded>
			<wfw:commentRss>http://mingbo.de/2012/02/07/python-script-of-sina-weibo-notification/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>颠倒黑白的Python</title>
		<link>http://mingbo.de/2012/01/30/python-is-not-justice/</link>
		<comments>http://mingbo.de/2012/01/30/python-is-not-justice/#comments</comments>
		<pubDate>Mon, 30 Jan 2012 19:08:32 +0000</pubDate>
		<dc:creator>shaomingbo</dc:creator>
				<category><![CDATA[我的程序]]></category>
		<category><![CDATA[碎碎念]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[布尔对象]]></category>

		<guid isPermaLink="false">http://mingbo.de/?p=180</guid>
		<description><![CDATA[最近偶尔翻翻python 的书，但总有一些小的惊喜： 我说，python 可以颠倒黑白，缘起下面这段不可思议的代码，运行结果让我出乎意料。稍微有编程经验的人会知道，”if true” 后面的代码必然要执行，而这样的常理在python 却遭到了驳斥。 def foo(): if True: print 'true' else: print 'false' True , False = False, True foo() 运行结果： 没有执行True 后面的代码，反而执行了False 后的代码。 事后分析，包括c++, java 等在内的编程语言通常将true, false 这样的值作为一个不可变的常量。而在python 里True, False 均为布尔类型的对象。当程序员对这样的2个对象进行置换操作时，会使得他们所指向的“值”发生变化（换句话说，True、False在python里均为可变的对象）。if 的判断依据并不是对象，而是对象所指的值（0或非0）。哈哈，这个分析不一定对，但至少目前我说服了我自己。 如果这个不算BUG，那么反思Python 设计者的世界观可能会是这样：世间不存在客观的真理，而只有主观的判断。所以即使是&#8221;true&#8221; 也不一定要执行。执行与否的关键在个人（程序员）。值得一提的是，使用某些IDE 编写代码的时候，会给予警告：“Assignment to reserved built-in symbol: True”。虽然可以运行通过，但至少会大大减少“意外”结果的概率了。]]></description>
			<content:encoded><![CDATA[<p>最近偶尔翻翻python 的书，但总有一些小的惊喜：</p>
<p>我说，python 可以颠倒黑白，缘起下面这段不可思议的代码，运行结果让我出乎意料。稍微有编程经验的人会知道，”if true” 后面的代码必然要执行，而这样的常理在python 却遭到了驳斥。</p>
<pre>
def foo():
    if True:
        print 'true'
    else:
        print 'false'

True , False = False, True

foo()
</pre>
<p>运行结果：</p>
<p><img class="aligncenter" src="https://lh5.googleusercontent.com/-3KKeeRlwads/TybjiVu5bxI/AAAAAAAAAPc/Y6hn8IS3bMM/s400/QQ%25E6%2588%25AA%25E5%259B%25BE20120130214732.jpg" alt="" width="400" height="180" data-pinit="registered" /></p>
<p>没有执行True 后面的代码，反而执行了False 后的代码。</p>
<p>事后分析，包括c++, java 等在内的编程语言通常将true, false 这样的值作为一个不可变的常量。而在python 里True, False 均为布尔类型的对象。当程序员对这样的2个对象进行置换操作时，会使得他们所指向的“值”发生变化（换句话说，True、False在python里均为可变的对象）。if 的判断依据并不是对象，而是对象所指的值（0或非0）。哈哈，这个分析不一定对，但至少目前我说服了我自己。</p>
<p>如果这个不算BUG，那么反思Python 设计者的世界观可能会是这样：世间不存在客观的真理，而只有主观的判断。所以即使是&#8221;true&#8221; 也不一定要执行。执行与否的关键在个人（程序员）。值得一提的是，使用某些IDE 编写代码的时候，会给予警告：“<strong>Assignment to reserved <span style="color: #ff0000;">built-in symbol</span>: True</strong>”。虽然可以运行通过，但至少会大大减少“意外”结果的概率了。</p>
]]></content:encoded>
			<wfw:commentRss>http://mingbo.de/2012/01/30/python-is-not-justice/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>我的密码策略：密码生成器</title>
		<link>http://mingbo.de/2012/01/10/password-generator/</link>
		<comments>http://mingbo.de/2012/01/10/password-generator/#comments</comments>
		<pubDate>Tue, 10 Jan 2012 14:22:51 +0000</pubDate>
		<dc:creator>shaomingbo</dc:creator>
				<category><![CDATA[我的程序]]></category>
		<category><![CDATA[网络应用]]></category>
		<category><![CDATA[密码]]></category>
		<category><![CDATA[程序]]></category>
		<category><![CDATA[隐私]]></category>

		<guid isPermaLink="false">http://mingbo.de/?p=126</guid>
		<description><![CDATA[“泄密门”从2011一直泄到了2012，今天国信办终于给出了查处结果。事件虽然画上了一个句号，但“密码保卫战”却从此吹响了号角。面对各式各样的网络服务，作为一个普通用户往往疲于应付。这样一来的结果通常是，一个密码走天下。如果没有“泄密门”，我想基本不会有人产生警觉；更进一步，即使产生了警觉，对于密码泄露这样的事，作为用户，到底该怎么办呢？（当然，也不排除到现在还有很多人没有意识到问题。） 危害是什么？ 这里有一份所谓黑客自爆入侵以及黑色产业链的报道，你或许可以在网上搜到更多。但在我看，这个泄密的真正问题在于，密码这样的隐私或者说你的加密思维被坏人知道了，产生了隐患。之所以是隐患，是因为这样的绝密信息，不一定会被人马上利用，也不一定会被人利用到当前的账号。 举个简单的例子：假设，a网站和b网站你的密码分别是123456a和123456b。a网站没什么价值，而且服务器端安全措施做的很一般。那么当黑客攻陷了a网站的服务器的时候，就对你的b账户就产生了威胁。你会说密码设置不同呀？但实际上之前的泄露已经为黑客增加了攻击你的思路以及筹码。一个有经验的黑客，如果真的盯上了b网站上的账号，估计在半个小时内，就能通过密码工具猜出你的账户密码来。 在前面这个例子里，用户还比较有防范意识，针对不同的网站，给出了不同的密码。但事实上很多网民，在使用网络服务的时候，都傻傻的只用一个账户和密码，或者近似的密码。因为密码多了，实在是记不住啊。对于这一点，我本人也深有体会。 我的密码策略 这段时间看了很多这方面的文章，也正在读关于密码攻防的书。虽然只看了两章，有了一些想法，想先罗列下来： 对于服务端，是否加密保存，用户无权过问，它会给你说这是“商业机密”；服务端是否安全，用户问了也没用，因为没人会告诉你不安全。用户用的是服务，理应完全信任服务器。不然，在这个信息流通环节，任何一环不可靠了，信息就无法流通了，当然也就无法产生价值了。退一步讲，你用这个服务，就要给个“密码”。所以，你看着办。 但从国信办给出的调查报告来看，一个让人不得不担忧的结论浮出水面：“广东YY语音聊天网站泄露的数据，系该公司员工利用职务之便从公司内部备份数据库窃取的。”试想，如果服务端的工作人员，可以轻易的接触这些敏感信息的话，并且这些敏感信息在坏人们手中流通的话，还并且保护你的敏感信息的密码因为便于记忆而透露出你的加密思维的话，那么，你危险了。 在传统加密体系中，最安全的方法便是“一次性密码簿”。明文根据一次性的密码簿产生出密文。这样做的好处是，明文下次被加密的时候，会以不同的密文呈现。而对于攻击者而言，除非拿到密码簿，否则无法猜解明文的信息。而对于明文的撰写者来说，明文从未变过。 OK，简单的说，我的密码策略是：借用密码生成器实现一站一密码。这样做的好处无非以下几点：密码强度足，加大了攻击者的攻击难度；即使被服务器端的工作人员出卖了，也不怕其他服务器的信息沦陷；没有记忆负担。 实现思路： 思路也很简单，将常记密码做为计算对象，并将使用服务的标签作为“盐”（SALT）对计算结果进行扰动，使用现行的牛X单向函数算一个值。这个值的特性在于，1）确定性，被计算的对象经过反复计算的结果是统一的；2）不可逆，其他用户拿到单向函数的算法以及计算结果，无法推测被计算对象（也就是常记密码）；3）复杂性，满足密码强度的需求。这样，用户在登陆网站的时候，只需要拿出密码生成器对常用、好记的密码进行一次计算，即可产生出强度足够高的密码了。 通俗的说，用常记的密码作为爸爸，用服务的名称（或别的什么）作为妈妈，生一堆密码儿子。任何居心不良的人要从儿子找到老子、娘，几乎是不可能的。而为了突破可能要付出的代价，基本上超越了小用户讨论的意义。嗯，大致的如下图所示： 实现： 第一次用c++ 写桌面程序。单向函数，用的MD5。看了一下文档，原封不动的实现了。但昨晚分析生成结果的时候发现密文的局限性在于只有16进制的显示。换句话说，生成的密码F以后的字符就没了，更不谈特殊字符。于是，后来的更新版本对密码做了1次散列，再于是，便可以看到下面这样的密码了。 FAQ： 1，公布了实现细节，密码生成器还能用吗？答案是肯定的。 我的观点如下：1，黑客，或者密码分析者通常得逞不是靠暴力猜解。牛X的黑客，通常会从掌握的其他信息入手，俗称“社会工程学”。换句话说，被牛B的黑客盯上了，密码已经不是最重要的了。整个信息领域的安全系统才是关键；但，我们能做的是提高每一个敏感信息的破解难度；2，充分相信数学家对MD5算法的不可逆性的验证。比起某些国产知识产权的算法来讲，MD5有着更高的性价比；3，对于彩虹表的破解，我想说，我们这个工具生成的密码已经不是传统的一次MD5或者说多次MD5的计算结果，刚才也说过，计算结果被重新散列了。要想用彩虹表破解，黑客需要针对我们的程序重新生成新的彩虹表。这个代价足够大，大到让那些黑客放弃对我们的攻击。 因此，对于民用密码工具来说，我想这个生成器是够用了。 2，对密码生成结果做一份备份保存。 这个问题，我权衡过：如果要把生成结果，保存下来，对于这样的日志信息放在哪里比较安全？作为谷粉，我比较信任google，是不是放到google docs上？一个密码生成工具还具备联网通讯的能力貌似说不过去啊，谁知道你是存到谁的docs上了！放在本地？如果加密保存，对于用户来说，更没意义。因为加密后的信息无法唤醒任何记忆。而明文保存，无异于将敏感信息集中保存在了一个毫无防备的硬盘里，等着别人来拿。嗯，所以三思之后，这个功能就被我砍了。退一步说，既然使用的是常记密码，而标签（SALT）是自己设的服务名称，在唤醒密码记忆的时候基本上是没有压力的。 3，生成的密码，太复杂，难得记下来。 生成的密码，是不用记的。你看不懂密码，我也看不懂，正常人都看不懂。但你需要记得，用什么关键词生成的密码。下次填写密码的时候，需要重新运行一次程序来计算。现在很多浏览器都有记录当前密码的功能，登陆成功后，可以让他们帮忙记住，免得下次输入。呃，算是一种，比较小众的工具吧。 一句话：只对Google，Microsoft这样的巨头放心，其他的还是多留一个心眼吧。 文件下载 dbank下载  &#124;  skydrive下载 File Size: 574759 Byte(s) (561.29 KB) Modified Date: 2012-01-11 00:42 MD5: cf94f92c2077479a9329b6a23fc6ed67 SHA1: 392a9dbc91ba65486b70205be6f1e533ba26ca32 SHA256: 1fd03ef08c05b015dbc772ff4d90300f799945fd65cb755fda4a9b93942d475a CRC32: f6bd99f9 UPDATE: 很快的，用工具修改了一些常用网站的密码。悲剧的是，今天早上躺在床上用手机登陆微博的时候，却发现要重新填密码。我晕了个晕，看来一会要在android上做一版本出来。 关于移动终端上的密码更新问题，想来想去还是觉得移动操作系统品种太多，单靠个人的精力是无法满足开发需求的。一个比较好的思路是，借助同步工具，可以将相关密码同步到移动终端上来。比如鼎鼎大名的evernote，国产的有道笔记等，相当的方便。因此，在这里，我就不放出android 版本的APP了。思路仅供参考。 看了上面的几次update，你不难发现，我是一个纠结的人。虽然，自认为上述代替方案够用，但今天还是手痒，写了一个android 的版本。看到后台下载统计的次数，我想，这里就不放出移动版本了。有需要的人给我邮件吧。]]></description>
			<content:encoded><![CDATA[<p>“泄密门”从2011一直泄到了2012，今天国信办终于给出了<a href="http://news.ifeng.com/gundong/detail_2012_01/11/11885596_0.shtml" target="_blank">查处结果</a>。事件虽然画上了一个句号，但“密码保卫战”却从此吹响了号角。面对各式各样的网络服务，作为一个普通用户往往疲于应付。这样一来的结果通常是，一个密码走天下。如果没有“泄密门”，我想基本不会有人产生警觉；更进一步，即使产生了警觉，对于密码泄露这样的事，作为用户，到底该怎么办呢？（当然，也不排除到现在还有很多人没有意识到问题。）</p>
<p><strong>危害是什么</strong>？</p>
<p>这里有一份所谓<a href="http://www.enet.com.cn/article/2012/0104/A20120104953750.shtml" target="_blank">黑客自爆</a>入侵以及黑色产业链的报道，你或许可以在网上搜到更多。但在我看，这个泄密的真正问题在于，密码这样的隐私或者说你的加密思维被坏人知道了，<strong>产生了隐患</strong>。之所以是隐患，是因为这样的绝密信息，不一定会被人马上利用，也不一定会被人利用到当前的账号。</p>
<p>举个简单的例子：假设，a网站和b网站你的密码分别是123456a和123456b。a网站没什么价值，而且服务器端安全措施做的很一般。那么当黑客攻陷了a网站的服务器的时候，就对你的b账户就产生了威胁。你会说密码设置不同呀？但实际上之前的泄露已经为黑客增加了攻击你的思路以及筹码。一个有经验的黑客，如果真的盯上了b网站上的账号，估计在半个小时内，就能通过密码工具猜出你的账户密码来。</p>
<p>在前面这个例子里，用户还比较有防范意识，针对不同的网站，给出了不同的密码。但事实上很多网民，在使用网络服务的时候，都傻傻的只用一个账户和密码，或者近似的密码。因为密码多了，实在是记不住啊。对于这一点，我本人也深有体会。</p>
<p><strong>我的密码策略</strong></p>
<p>这段时间看了很多这方面的文章，也正在读关于密码攻防的书。虽然只看了两章，有了一些想法，想先罗列下来：</p>
<ul>
<li>对于服务端，是否加密保存，用户无权过问，它会给你说这是“商业机密”；服务端是否安全，用户问了也没用，因为没人会告诉你不安全。用户用的是服务，理应完全信任服务器。不然，在这个信息流通环节，任何一环不可靠了，信息就无法流通了，当然也就无法产生价值了。退一步讲，你用这个服务，就要给个“密码”。所以，你看着办。</li>
<li>但从国信办给出的调查报告来看，<span style="color: #ff0000;">一个让人不得不</span><span style="color: #ff0000;"><a href="http://news.ifeng.com/gundong/detail_2012_01/11/11885596_0.shtml" target="_blank">担忧的结论</a>浮出水面</span>：“广东YY语音聊天网站泄露的数据，系该公司员工利用职务之便从公司内部备份数据库窃取的。”试想，<strong>如果服务端的工作人员，可以轻易的接触这些敏感信息的话，并且这些敏感信息在坏人们手中流通的话，还并且保护你的敏感信息的密码因为便于记忆而透露出你的加密思维的话，那么，<span style="color: #ff0000;">你危险了</span></strong>。</li>
<li>在传统加密体系中，最安全的方法便是“<em>一次性密码簿</em>”。明文根据一次性的密码簿产生出密文。<strong>这样做的好处是，明文下次被加密的时候，会以不同的密文呈现</strong>。而对于攻击者而言，除非拿到密码簿，否则无法猜解明文的信息。而对于明文的撰写者来说，明文从未变过。</li>
<li>OK，简单的说，我的密码策略是：借用<strong>密码生成器</strong>实现一站一密码。这样做的好处无非以下几点：密码强度足，加大了攻击者的攻击难度；即使被服务器端的工作人员出卖了，也不怕其他服务器的信息沦陷；没有记忆负担。</li>
</ul>
<p><strong>实现思路</strong>：</p>
<p>思路也很简单，将常记密码做为计算对象，并将使用服务的标签作为“盐”（SALT）对计算结果进行扰动，使用现行的牛X单向函数算一个值。这个值的特性在于，1）确定性，被计算的对象经过反复计算的结果是统一的；2）不可逆，其他用户拿到单向函数的算法以及计算结果，无法推测被计算对象（也就是常记密码）；3）复杂性，满足密码强度的需求。这样，用户在登陆网站的时候，只需要拿出密码生成器对常用、好记的密码进行一次计算，即可产生出强度足够高的密码了。</p>
<p>通俗的说，用常记的密码作为爸爸，用服务的名称（或别的什么）作为妈妈，生一堆密码儿子。任何居心不良的人要从儿子找到老子、娘，几乎是不可能的。而为了突破可能要付出的代价，基本上超越了小用户讨论的意义。嗯，大致的如下图所示：</p>
<p style="text-align: center;"><img class="aligncenter" title="密码生成器" src="https://lh6.googleusercontent.com/-3zcT9CI4wOY/Tw0eXvoqDgI/AAAAAAAAAN8/uVi-JA8ny9w/s640/%2525E5%2525AF%252586%2525E7%2525A0%252581%2525E7%252594%25259F%2525E6%252588%252590%2525E5%252599%2525A8.jpg" alt="" width="640" height="480" data-pinit="registered" /></p>
<p style="text-align: left;"><strong>实现</strong>：</p>
<p style="text-align: left;">第一次用c++ 写桌面程序。单向函数，用的MD5。看了一下文档，原封不动的实现了。但昨晚分析生成结果的时候发现密文的局限性在于只有16进制的显示。换句话说，生成的密码F以后的字符就没了，更不谈特殊字符。于是，后来的更新版本对密码做了1次散列，再于是，便可以看到下面这样的密码了。</p>
<p style="text-align: left;"><img class="aligncenter" src="https://lh6.googleusercontent.com/-UBkdx9cDQCA/Tw0iEEaUHxI/AAAAAAAAAOI/0sil-HPw4fA/s800/%2525E5%2525AF%252586%2525E7%2525A0%252581%2525E7%252594%25259F%2525E6%252588%252590%2525E5%252599%2525A8%2525E6%252588%2525AA%2525E5%25259B%2525BE.jpg" alt="" width="319" height="387" data-pinit="registered" /></p>
<p style="text-align: left;">FAQ：</p>
<p style="text-align: left;">1，公布了实现细节，密码生成器还能用吗？答案是肯定的。</p>
<p style="text-align: left;">我的观点如下：1，黑客，或者密码分析者通常得逞不是靠暴力猜解。牛X的黑客，通常会从掌握的其他信息入手，俗称“社会工程学”。换句话说，被牛B的黑客盯上了，密码已经不是最重要的了。整个信息领域的安全系统才是关键；<strong>但，我们能做的是提高每一个敏感信息的破解难度</strong>；2，充分相信数学家对MD5算法的不可逆性的验证。比起某些国产知识产权的算法来讲，MD5有着更高的性价比；3，对于彩虹表的破解，我想说，我们这个工具生成的密码已经不是传统的一次MD5或者说多次MD5的计算结果，刚才也说过，计算结果被重新散列了。要想用彩虹表破解，黑客需要针对我们的程序重新生成新的彩虹表。这个代价足够大，大到让那些黑客放弃对我们的攻击。</p>
<p style="text-align: left;">因此，对于<strong>民用密码工具</strong>来说，我想这个生成器是够用了。</p>
<p style="text-align: left;">2，对密码生成结果做一份备份保存。</p>
<p style="text-align: left;">这个问题，我权衡过：如果要把生成结果，保存下来，对于这样的日志信息<strong>放在哪里</strong>比较安全？作为谷粉，我比较信任google，是不是放到google docs上？一个密码生成工具还具备联网通讯的能力貌似说不过去啊，谁知道你是存到谁的docs上了！放在本地？如果加密保存，对于用户来说，更没意义。因为加密后的信息无法唤醒任何记忆。而明文保存，无异于将敏感信息集中保存在了一个毫无防备的硬盘里，等着别人来拿。嗯，所以三思之后，这个功能就被我砍了。退一步说，既然使用的是常记密码，而标签（SALT）是自己设的服务名称，在唤醒密码记忆的时候基本上是没有压力的。</p>
<p style="text-align: left;">3，生成的密码，太复杂，难得记下来。</p>
<p style="text-align: left;"><span style="color: #ff0000;"><strong>生成的密码，是不用记的</strong></span>。你看不懂密码，我也看不懂，正常人都看不懂。但你需要记得，用什么关键词生成的密码。下次填写密码的时候，需要重新运行一次程序来计算。<strong>现在很多浏览器都有记录当前密码的功能，登陆成功后，可以让他们帮忙记住，免得下次输入。</strong>呃，算是一种，比较小众的工具吧。</p>
<p style="text-align: left;">一句话：只对Google，Microsoft这样的巨头放心，其他的还是多留一个心眼吧。</p>
<p style="text-align: left;"><strong>文件下载</strong></p>
<p style="text-align: left;"><a href="http://dl.dbank.com/c0pf1t4nh7" target="_blank">dbank下载</a>  |  <a href="https://skydrive.live.com/redir.aspx?cid=cefc216405bfb10c&amp;resid=CEFC216405BFB10C!333&amp;parid=CEFC216405BFB10C!332&amp;authkey=!AAyo5SiMwkKL9Ho" target="_blank">skydrive下载</a></p>
<blockquote><p>File Size: 574759 Byte(s) (561.29 KB)<br />
Modified Date: 2012-01-11 00:42<br />
MD5: cf94f92c2077479a9329b6a23fc6ed67<br />
SHA1: 392a9dbc91ba65486b70205be6f1e533ba26ca32<br />
SHA256: 1fd03ef08c05b015dbc772ff4d90300f799945fd65cb755fda4a9b93942d475a<br />
CRC32: f6bd99f9</p></blockquote>
<p style="text-align: left;"><strong>UPDATE</strong>:</p>
<p style="text-align: left;"><del>很快的，用工具修改了一些常用网站的密码。悲剧的是，今天早上躺在床上用手机登陆微博的时候，却发现要重新填密码。我晕了个晕，看来一会要在android上做一版本出来。</del></p>
<p style="text-align: left;"><del>关于移动终端上的密码更新问题，想来想去还是觉得移动操作系统品种太多，单靠个人的精力是无法满足开发需求的。一个比较好的思路是，借助同步工具，可以将相关密码同步到移动终端上来。比如鼎鼎大名的evernote，国产的有道笔记等，相当的方便。因此，在这里，我就不放出android 版本的APP了。思路仅供参考。</del></p>
<p style="text-align: left;">看了上面的几次update，你不难发现，我是一个纠结的人。虽然，自认为上述代替方案够用，但今天还是手痒，写了一个android 的版本。看到后台下载统计的次数，我想，这里就不放出移动版本了。有需要的人给我邮件吧。</p>
]]></content:encoded>
			<wfw:commentRss>http://mingbo.de/2012/01/10/password-generator/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>小补常识：智能手机的CPU</title>
		<link>http://mingbo.de/2012/01/08/smartphone-cpu/</link>
		<comments>http://mingbo.de/2012/01/08/smartphone-cpu/#comments</comments>
		<pubDate>Sun, 08 Jan 2012 11:19:14 +0000</pubDate>
		<dc:creator>shaomingbo</dc:creator>
				<category><![CDATA[智能手机]]></category>
		<category><![CDATA[网络应用]]></category>
		<category><![CDATA[cpu]]></category>
		<category><![CDATA[小米]]></category>

		<guid isPermaLink="false">http://mingbo.de/?p=114</guid>
		<description><![CDATA[常闻A8，A9，却不知何谓。今天在@螺号闹眼子的怂恿下，就沿着这条线对相关知识进行了梳理。A8，A9全称实为Cortex-A8, Cortex-A9，而Cortex是ARM家族的一员。所以，首先我们要看看ARM。 ARM（Advance RISC Machine）也叫进阶精简指令集机器，有高效能、低耗电的特点，因此会常常在便携式设备见到它的身影。ARMv1 &#8211; ARMv7是不同版本的架构，不同的版本内部也有细分，它们分别映射出不同的ARM家族。ARM家族从ARM1开始，因为各种历史原因，开始有了分支（例如StrongARM, XScale）。到ARM11之后，就开始改名为Cortex。 我们常常提到的A8，A9，实际上就是Cortex 这个家族的产物，但其架构均为ARMv7-A。 A8的特点（相比于以前的产品）： 频率从600MHz到1GHz，超频后，可以达到更高 NEON 技术，可加速多媒体和信号处理算法，其性能为ARMv5的3倍，ARMv6的2倍。 集成的2级高速缓存，0k-1M可配置容量。具有可编程延迟，以适应不同的数组特征。（优化的1级高速缓存，可以在最大程度上提供高性能、降低功耗） 满足2000 Dhrystone MIPS的消费类应用。（IPS是一种CPU速度的计量单位，较为可信的IPS值取决于测试软件的测试情境以及测试时间。DMIPS，Dhrystone Million Instructions executed Per Second用于整数计算能力的测试） VPFv3 为半精度、单精度和双精度浮点运算中的浮点操作提供硬件支持。 Jazelle-RCT，优化Java的JIT和动态自适应分配，将内存占用空间减少高达三倍。 A9的特点（相比于A8）： 频率更高 以低廉的价格提供低功耗的单核实现，利用MPCore技术，可以扩展为4核。 可选NEON和其他浮点处理引擎。 有一点，从官方文档里，我们可以清楚的看到A8是不支持多核的，参考下图。而A9家族是可以支持1-4个内核，并可以提供单核实现。但官方没有提供更详尽的数据。 之所以说是@螺号闹眼子的怂恿，缘起小米手机。网络上关于这款手机的口水贴，软文，理智贴，喷子贴太多。于是打算亲自一探究竟。大家的疑惑大多都聚焦在“最快的手机里我们是最便宜的，最便宜的手机里我们是最强大的。”这样的宣传口号上。查了好久小米使用的CPU-&#62;MSM8260的详细参数，可能由于商业机密，能找到的参数信息，都不太官方。 因为高通（CPU生产厂商）自称MSM8260是双核，而有言论辩驳（质疑）这个观点。事实上，这场辩驳早在PC时代，Intel和AMD之间就发生过。当年的Pentium D是Intel将两颗Pentium 4封装在一个基板上。AMD觉得这是假双核，而这类双核现在被网友戏称为“胶水”双核。我们前面已经看到过，A8是不支持多核的。由于MSM8260很多特性类似于A8，所以很多网友认为MSM8260就是伪双核，在这里，我们也只能类比一下Pentium D了。 贴一下MSM8x60的特性吧： 2个Scorpion 1.2GHz ~1.5GHz 核心 Adreno 220 GPU 支持1080p video 编解码 更牛B的网络支持、更牛B的双摄像头支持、更牛B的GPS支持以及USB支持 其中Adreno 220和高通前一代的GPU Adreno 205相比是一个亮点，下面是官方给出的对比： Adreno 220: 88M [...]]]></description>
			<content:encoded><![CDATA[<p>常闻A8，A9，却不知何谓。今天在<a href="http://weibo.com/lacertae" target="_blank">@螺号闹眼子</a>的怂恿下，就沿着这条线对相关知识进行了梳理。A8，A9全称实为Cortex-A8, Cortex-A9，而Cortex是ARM家族的一员。所以，首先我们要看看ARM。</p>
<p>ARM（Advance RISC Machine）也叫进阶精简指令集机器，有高效能、低耗电的特点，因此会常常在便携式设备见到它的身影。ARMv1 &#8211; ARMv7是不同版本的架构，不同的版本内部也有细分，它们分别映射出不同的ARM家族。ARM家族从ARM1开始，因为各种历史原因，开始有了分支（例如StrongARM, XScale）。到ARM11之后，就开始改名为Cortex。</p>
<p>我们常常提到的A8，A9，实际上就是Cortex 这个家族的产物，但其架构均为ARMv7-A。</p>
<p>A8的特点（相比于以前的产品）：</p>
<ul>
<li>频率从600MHz到1GHz，超频后，可以达到更高</li>
<li>NEON 技术，可加速多媒体和信号处理算法，其性能为ARMv5的3倍，ARMv6的2倍。</li>
<li>集成的2级高速缓存，0k-1M可配置容量。具有可编程延迟，以适应不同的数组特征。（优化的1级高速缓存，可以在最大程度上提供高性能、降低功耗）</li>
<li>满足2000 Dhrystone MIPS的消费类应用。（IPS是一种CPU速度的计量单位，较为可信的IPS值取决于测试软件的测试情境以及测试时间。DMIPS，Dhrystone Million Instructions executed Per Second用于整数计算能力的测试）</li>
<li>VPFv3 为半精度、单精度和双精度浮点运算中的浮点操作提供硬件支持。</li>
<li>Jazelle-RCT，优化Java的JIT和动态自适应分配，将内存占用空间减少高达三倍。</li>
</ul>
<p>A9的特点（相比于A8）：</p>
<ul>
<li>频率更高</li>
<li>以低廉的价格提供低功耗的单核实现，利用MPCore技术，可以扩展为4核。</li>
<li>可选NEON和其他浮点处理引擎。</li>
</ul>
<p>有一点，从官方文档里，我们可以清楚的看到<strong>A8是不支持多核的</strong>，参考下图。而A9家族是可以支持1-4个内核，并可以提供单核实现。但官方没有提供更详尽的数据。</p>
<p style="text-align: center;"><img class="aligncenter" style="border-style: initial; border-color: initial; border-image: initial; border-width: 0px;" src="https://lh3.googleusercontent.com/-vp71devB_Xs/Twl9YPiRnPI/AAAAAAAAAN0/PJJ3YsHwT40/s800/QQ%2525E6%252588%2525AA%2525E5%25259B%2525BE20120108192313.jpg" alt="" width="344" height="363" border="0" data-pinit="registered" /></p>
<p>之所以说是<a href="http://weibo.com/lacertae" target="_blank">@螺号闹眼子</a>的怂恿，缘起小米手机。网络上关于这款手机的口水贴，软文，理智贴，喷子贴太多。于是打算亲自一探究竟。大家的疑惑大多都聚焦在“最快的手机里我们是最便宜的，最便宜的手机里我们是最强大的。”这样的宣传口号上。查了好久小米使用的CPU-&gt;MSM8260的详细参数，可能由于商业机密，能找到的参数信息，都不太官方。</p>
<p>因为高通（CPU生产厂商）自称MSM8260是双核，而有言论辩驳（质疑）这个观点。事实上，这场辩驳早在PC时代，Intel和AMD之间就发生过。当年的Pentium D是Intel将两颗Pentium 4封装在一个基板上。AMD觉得这是假双核，而这类双核现在被网友戏称为“胶水”双核。我们前面已经看到过，A8是不支持多核的。由于MSM8260很多特性类似于A8，所以很多网友认为MSM8260就是伪双核，在这里，我们也只能类比一下Pentium D了。</p>
<p>贴一下MSM8x60的特性吧：</p>
<ul>
<li>2个Scorpion 1.2GHz ~1.5GHz 核心</li>
<li><strong>Adreno 220 GPU </strong></li>
<li>支持1080p video 编解码</li>
<li>更牛B的网络支持、更牛B的双摄像头支持、更牛B的GPS支持以及USB支持</li>
</ul>
<div>其中Adreno 220和高通前一代的GPU Adreno 205相比是一个亮点，下面是官方给出的对比：</div>
<div>
<ul>
<li>Adreno 220: 88M triangles/sec, 532M 3D pixels/sec, 1080p video recording and playback up to 30 frames/second</li>
<li>Adreno 205: 41M triangles/sec, 245M 3D pixels/sec, 720p video recording and playback up to 30 frames/second</li>
</ul>
</div>
<p>著名的测评网站smartphonebenchmarks.com给出的消息：</p>
<p>MSM8x60是基于ARM Cortex A8设计的，因此三代Snapdragon 与前一代的主频上不会有太大的区别。但由于封装了2个内核，通过某些技术手段（如增加部分乱序执行，实现异步多核心功能）主频应该会高出20%，而且运行起来应该比前一代同频率快2.4倍。但这样的前提是，操作系统能充分利用该CPU设计，并且系统上运行的软件可以感知到这个双核。</p>
<p><strong>所以，我的结论很简单</strong>：MSM8x60是个过渡品，有进步。而小米手机呢，虽然比起我现在用的HTC G8牛B很多，但冷静一下，我觉得还是再等下一款A9处理器的新品吧。</p>
<p>参考文献：</p>
<p>1，<a href="http://zh.wikipedia.org/wiki/ARM%E6%9E%B6%E6%A7%8B" target="_blank">维基百科：ARM架构</a></p>
<p>2，<a href="http://www.arm.com/zh/products/processors/cortex-a/cortex-a8.php" target="_blank">Cortex-A8 处理器官网参考消息</a></p>
<p>3，<a href="http://www.arm.com/zh/products/processors/cortex-a/cortex-a9.php" target="_blank">Cortex-A9 处理器官网参考消息</a></p>
<p>4，<a href="http://www.arm.com/zh/products/processors/technologies/neon.php" target="_blank">NEON技术参考消息</a></p>
<p>5，<a href="http://www.arm.com/zh/products/processors/technologies/vector-floating-point.php" target="_blank">VPF技术参考消息</a></p>
<p>6，<a href="http://smartphonebenchmarks.com/forum/index.php?/topic/73-analysis-of-qualcomm-msm8x60-msm8260msm8660-12ghz-dual-core-snapdragon-processor/" target="_blank">高通MSM8x60分析-1.2GHz dual-core Snapdragon processor</a></p>
<p>7，<a href="https://developer.qualcomm.com/sites/default/files/snapdragon-s3-product-overview.pdf" target="_blank">高通Snapdragon S3产品说明书</a></p>
]]></content:encoded>
			<wfw:commentRss>http://mingbo.de/2012/01/08/smartphone-cpu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>2011总结与2012展望</title>
		<link>http://mingbo.de/2012/01/02/summary-of-2011-and-outlook-of-2012/</link>
		<comments>http://mingbo.de/2012/01/02/summary-of-2011-and-outlook-of-2012/#comments</comments>
		<pubDate>Mon, 02 Jan 2012 15:57:48 +0000</pubDate>
		<dc:creator>shaomingbo</dc:creator>
				<category><![CDATA[碎碎念]]></category>
		<category><![CDATA[总结]]></category>

		<guid isPermaLink="false">http://mingbo.de/?p=81</guid>
		<description><![CDATA[这一年又稀里糊涂的过去了。很多很多事还没来得及存盘，却已经习惯了遗忘。 累并痛苦着，是我生活的主旋律。正如韩寒在《青春》里说的一样，“一到25岁，人人自危”。一方面，看到自己的衰老，而另一方面，却看不到前途。迷茫于爱情，却常常忽略了亲情，期盼温暖，却漠视着社会&#8230;挣扎着，寻求一种内心的平衡。 习惯了自我否定。每当在电视机前看到梁咏琪的时候，爸爸还会喊我凑过来一起看。这些年的每一次类似的场景，我都不好意思，不好意思承认我也粉过GiGi。不是说，她不值得粉，而是我变了。所以，为了不经常否定自己，我也一度不爱表达自己的观点。但这种掩耳盗铃的想法，也是我现在想否定的。嗯，我一直在否定中成长。 悲催的人生莫过于选择了一份既不喜欢，也不在行的工作。2011年，我的头等大事，便是逃过这一劫。相关的准备，是从6月份开始的。一次tencent的实习生招聘，让我意识到自己的严重不足。日后，便是为了面试而做准备。算法，数据结构，操作系统，c++语法，各种宝典。很多我的同学都不会看的书，我看了。嗯，我的专业不是计算机（也不是计算机相关）。9月底，刚开始有招聘信息的那会也迷茫过，总觉得因为学校、因为专业，一个面试机会都没有。但10月份，迎来了高潮。我用谷歌日历排满了宣讲、笔试、面试的安排。整个10月，除了月头的休息，基本上没有空档，就连休息也被我合理的用来做准备。但安排的再好，也会有冲突。有的时候是面试和笔试冲突，有的时候是笔试和笔试的冲突，有的时候更刺激，面试和面试有冲突。每一个艰难的决定背后，往往都会伴随着“懊恼不已”。 人生中，第一次面试给了tencent。嗯，第一次的时候，都特傻，当然也没有成果，但一定最难忘。不是每一个企业在大面积校招的过程中都肯花120分钟来选择应届生的。我很荣幸的在第二轮面试的时候参与了这个过程，虽然遗憾的是最后没能被选上。但考官对技术的驾驭能力、表达能力、引导能力给我印象深刻，同时，从他嘴里我看到了一个不一样的自己。如果说tencent的考官在技术上让我折服，那么网易的考官应该说是人品了。分享了他的亲身经历，还给了我额外的机会。虽然，最后都没能在面试中起到作用，但让我对这个IT行业有了新的认识和期待。还有一个国企HR，她与我的对话让我记忆犹新。我当时问她，“作为一个前辈，您觉得这一路走来，有什么可以告诫我的吗？”她答，“现在回头看看，5年前，我和那群刚毕业的学生一样，不知所措。现在要我看一份工作好不好，我觉得关键是看这个工作能不能让自己的价值有所提升！”嗯，正是她的这句话，让我对手中那几个offer有了新的取舍认识，更加坚定的选择了现在这份工作（但，并没有选择国企）。 重新定位。我在微博上给自己的定位是小人物，2B。我这类人，很难有一个准确的自我定位。不管是活在自己的世界里，还是共同的世界，总会觉得自己与众不同。但，还没有发现自己到底哪里与众不同，哈哈。 所以，容易让人产生误解，是我生活的插曲。我不会承认，自己难以接近，也不会承认，无法理解他人。但我会承认，我太专注于自己，而不太爱理会他人。绝大多数的时候，我不会考虑别人的感受，更喜欢用自己的方法，达到自己的目的，方才罢休。这几年，有人来到我的身边，然后默然离去，接下来的也都未能幸免 。我知道，问题在我。对于身边的人，我亏欠的太多太多。2012年，怀着各种担忧，但更期待自己在这方面的成长。 遗忘，是一个借口。没有好的习惯，去战胜懒惰才是真的。以至于，这一年，我所经历的，都没有具体的素材进行总结。接下来的一年里，我会用行动来改变自己，尽管，这又是一次对自己的否定。本来，想要在这里罗列一个书单，作为2012年奋斗的一个目标。后来觉得，更实际的，不如列一个数字：10本书吧！2012年，10本技术类书籍，剩下的，靠自由发挥。我会经常到这里，贴出自己的学习心得。 嗯，2012，我来了。]]></description>
			<content:encoded><![CDATA[<p>这一年又稀里糊涂的过去了。很多很多事还没来得及存盘，却已经<strong>习惯了</strong><strong>遗忘</strong>。</p>
<p>累并痛苦着，是我生活的主旋律。正如韩寒在《青春》里说的一样，“一到25岁，人人自危”。一方面，看到自己的衰老，而另一方面，却看不到前途。迷茫于爱情，却常常忽略了亲情，期盼温暖，却漠视着社会&#8230;挣扎着，寻求一种内心的平衡。</p>
<p><strong>习惯了自我否定</strong>。每当在电视机前看到梁咏琪的时候，爸爸还会喊我凑过来一起看。这些年的每一次类似的场景，我都不好意思，不好意思承认我也粉过GiGi。不是说，她不值得粉，而是我变了。所以，为了不经常否定自己，我也一度不爱表达自己的观点。但这种掩耳盗铃的想法，也是我现在想否定的。嗯，我一直在否定中成长。</p>
<p>悲催的人生莫过于选择了一份既不喜欢，也不在行的工作。2011年，我的头等大事，便是逃过这一劫。相关的准备，是从6月份开始的。一次tencent的实习生招聘，让我意识到自己的严重不足。日后，便是为了面试而做准备。算法，数据结构，操作系统，c++语法，各种宝典。很多我的同学都不会看的书，我看了。嗯，我的专业不是计算机（也不是计算机相关）。9月底，刚开始有招聘信息的那会也迷茫过，总觉得因为学校、因为专业，一个面试机会都没有。但10月份，迎来了高潮。我用谷歌日历排满了宣讲、笔试、面试的安排。整个10月，除了月头的休息，基本上没有空档，就连休息也被我合理的用来做准备。但安排的再好，也会有冲突。有的时候是面试和笔试冲突，有的时候是笔试和笔试的冲突，有的时候更刺激，面试和面试有冲突。每一个艰难的决定背后，往往都会伴随着“懊恼不已”。</p>
<p>人生中，第一次面试给了tencent。嗯，第一次的时候，都特傻，当然也没有成果，但一定最难忘。不是每一个企业在大面积校招的过程中都肯花120分钟来选择应届生的。我很荣幸的在第二轮面试的时候参与了这个过程，虽然遗憾的是最后没能被选上。但考官对技术的驾驭能力、表达能力、引导能力给我印象深刻，同时，从他嘴里我看到了一个不一样的自己。如果说tencent的考官在技术上让我折服，那么网易的考官应该说是人品了。分享了他的亲身经历，还给了我额外的机会。虽然，最后都没能在面试中起到作用，但让我对这个IT行业有了新的认识和期待。还有一个国企HR，她与我的对话让我记忆犹新。我当时问她，“作为一个前辈，您觉得这一路走来，有什么可以告诫我的吗？”她答，“现在回头看看，5年前，我和那群刚毕业的学生一样，不知所措。现在要我看一份工作好不好，我觉得关键是看这个工作能不能让自己的价值有所提升！”嗯，正是她的这句话，让我对手中那几个offer有了新的取舍认识，更加坚定的选择了现在这份工作（但，并没有选择国企）。</p>
<p>重新定位。我在微博上给自己的定位是小人物，2B。我这类人，很难有一个准确的自我定位。不管是活在自己的世界里，还是共同的世界，总会觉得自己与众不同。但，还没有发现自己到底哪里与众不同，哈哈。</p>
<p>所以，容易让人产生误解，是我生活的插曲。我不会承认，自己难以接近，也不会承认，无法理解他人。但我会承认，我太专注于自己，而不太爱理会他人。绝大多数的时候，我不会考虑别人的感受，更喜欢用自己的方法，达到自己的目的，方才罢休。这几年，有人来到我的身边，然后默然离去，接下来的也都未能幸免 。我知道，问题在我。对于身边的人，我亏欠的太多太多。2012年，怀着各种担忧，但更期待自己在这方面的成长。</p>
<p>遗忘，是一个借口。没有好的习惯，去战胜懒惰才是真的。以至于，这一年，我所经历的，都没有具体的素材进行总结。接下来的一年里，我会用行动来改变自己，尽管，这又是一次对自己的否定。本来，想要在这里罗列一个书单，作为2012年奋斗的一个目标。后来觉得，更实际的，不如列一个数字：10本书吧！2012年，10本技术类书籍，剩下的，靠自由发挥。我会经常到这里，贴出自己的学习心得。</p>
<p>嗯，2012，我来了。</p>
]]></content:encoded>
			<wfw:commentRss>http://mingbo.de/2012/01/02/summary-of-2011-and-outlook-of-2012/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>一种淘宝骗局</title>
		<link>http://mingbo.de/2011/05/15/a-cheat-method-at-taobao/</link>
		<comments>http://mingbo.de/2011/05/15/a-cheat-method-at-taobao/#comments</comments>
		<pubDate>Sun, 15 May 2011 05:23:07 +0000</pubDate>
		<dc:creator>shaomingbo</dc:creator>
				<category><![CDATA[网络应用]]></category>
		<category><![CDATA[淘宝]]></category>
		<category><![CDATA[迅雷]]></category>
		<category><![CDATA[骗局]]></category>

		<guid isPermaLink="false">http://mingbo.de/2011/05/15/%e4%b8%80%e7%a7%8d%e6%b7%98%e5%ae%9d%e9%aa%97%e5%b1%80/</guid>
		<description><![CDATA[自诩是一个精明的胖子，力图寻找力所能及的真相已经成为一种习惯。其实，这次被骗不是一两天了，但却在我纯洁的心灵留下了不可磨灭的伤痕。沉淀很久的愤慨，还是打算写出来，尽可能的杜绝这种骗局再让人受害。 迅雷会员，是我个人觉得比较有性价比的一种互联网增值服务。说来10块钱一个月的官方定价，也不为过，使用不同的支付渠道还有折扣。然而，在淘宝上，搜索“迅雷会员”，你会发现有一大批低于官方定价的购买渠道，对于任何了解迅雷vip的用户都会不由得暗自打起小算盘来。其中有一种购买形式是，10元左右，包年。 我当时，就找淘宝ID为“迷糊小浣熊”的卖家购买了1年VIP 会员。付款后，很顺利的在5分钟内开通了会员服务。一直到这个时候，任何自认为精明的顾客都不会觉得有问题。问题发生在2个月后，卖家承诺的1年服务居然无端地被终止了。很自然地，你会想起联系卖家，可是无果。继续，很自然的想起找淘宝撑腰，可惜系统会提示你“很遗憾，该投诉维权入口已经关闭”。 思绪凌乱了没？你已经成功买该服务超过2个月了！ 无独有偶，“精明”的胖子曾经因为想尝试更具有竞争力的网络服务，找淘宝ID为“zh88518”的四钻卖家购买了1年的Dreamhost 网站空间的合租服务。差不多也是2个月左右的时间，出现了空间被官方suspend 了。找卖家询问，答曰可以开新的空间，但之前的网站数据无法找回。过了不到一个月的时间，循环出现前述症状。一个这样不稳定的空间，还拿出来祸害客户，真是无耻。无奈之下，胖子又去寻找新的空间卖家。 总结一下，对于网络服务，特别是时间跨度比较久的，一定要考量清楚了再购买。价格方面过于“有竞争力的”产品，还是等爱吃第一只螃蟹的人来尝试吧。 p.s. 时至今日，我翻看了一下我的购买记录，“迷糊小浣熊”这个ID已经被淘宝冻结了。]]></description>
			<content:encoded><![CDATA[<p>自诩是一个精明的胖子，力图寻找力所能及的真相已经成为一种习惯。其实，这次被骗不是一两天了，但却在我纯洁的心灵留下了不可磨灭的伤痕。沉淀很久的愤慨，还是打算写出来，尽可能的杜绝这种骗局再让人受害。</p>
<p>迅雷会员，是我个人觉得比较有性价比的一种互联网增值服务。说来10块钱一个月的官方定价，也不为过，使用不同的支付渠道还有折扣。然而，在淘宝上，搜索“迅雷会员”，你会发现有一大批低于官方定价的购买渠道，对于任何了解迅雷vip的用户都会不由得暗自打起小算盘来。其中有一种购买形式是，10元左右，包年。</p>
<p>我当时，就找<strong>淘宝ID为“迷糊小浣熊”</strong>的卖家购买了1年VIP 会员。付款后，很顺利的在5分钟内开通了会员服务。一直到这个时候，任何自认为精明的顾客都不会觉得有问题。问题发生在2个月后，卖家承诺的1年服务居然无端地被终止了。很自然地，你会想起联系卖家，可是无果。继续，很自然的想起找淘宝撑腰，可惜系统会提示你“很遗憾，该投诉维权入口已经关闭”。</p>
<p>思绪凌乱了没？你已经成功买该服务超过2个月了！</p>
<p>无独有偶，“精明”的胖子曾经因为想尝试更具有竞争力的网络服务，找<strong>淘宝ID为“zh88518”的<span style="text-decoration: underline;">四钻卖家</span></strong>购买了1年的Dreamhost 网站空间的合租服务。差不多也是2个月左右的时间，出现了空间被官方suspend 了。找卖家询问，答曰可以开新的空间，但之前的网站数据无法找回。过了不到一个月的时间，循环出现前述症状。一个这样不稳定的空间，还拿出来祸害客户，真是无耻。无奈之下，胖子又去寻找新的空间卖家。</p>
<p>总结一下，对于网络服务，特别是时间跨度比较久的，一定要考量清楚了再购买。价格方面过于“有竞争力的”产品，还是等爱吃第一只螃蟹的人来尝试吧。</p>
<p>p.s. 时至今日，我翻看了一下我的购买记录，“迷糊小浣熊”这个ID已经被淘宝冻结了。</p>
]]></content:encoded>
			<wfw:commentRss>http://mingbo.de/2011/05/15/a-cheat-method-at-taobao/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Opera mini for android 穿越版下载</title>
		<link>http://mingbo.de/2011/02/14/opera-mini-android-fucking-gwf/</link>
		<comments>http://mingbo.de/2011/02/14/opera-mini-android-fucking-gwf/#comments</comments>
		<pubDate>Mon, 14 Feb 2011 16:04:46 +0000</pubDate>
		<dc:creator>shaomingbo</dc:creator>
				<category><![CDATA[网络应用]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[opera]]></category>
		<category><![CDATA[科学上网]]></category>

		<guid isPermaLink="false">http://shao.mingbo.de/?p=9</guid>
		<description><![CDATA[opera 穿越版之所以能够翻墙主要是因为opera 浏览器有自己的数据压缩服务器，但大陆地区的用户访问opera的压缩服务器的时候，他会检测到你的ip所属区域，根据天朝具有特色的&#8221;某些不太明确的规定&#8221;，opera会阻止你使用该压缩服务。为了能够科学上网，luosheng1986在Goolge Code 创建了一个OPM Server Mirro的开源项目，通过在国外主机上运行简单的几行php 代码（必须在国外的web host上运行），跳过了opera的ip 地址检测，从而使得我们能够重新使用opera 国际版的数据压缩服务，也就是实现了穿越。 所以Opera 穿越版的关键是上述这个类似代理的跳转。由于免费空间在我心中不靠谱的烙印，你懂的，所以，我个人还是建议使用这里提供的方法，自行修改。下面提供一个使用freewebhostingarea 做的apk 文件，希望对您有帮助。点这里下载。 P.s.这篇日志是旧博客上的，完全符合我现在的日志要求。]]></description>
			<content:encoded><![CDATA[<p><strong></strong><strong>opera</strong> 穿越版之所以能够翻墙主要是因为<strong>opera</strong> 浏览器有自己的数据压缩服务器，但大陆地区的用户访问<strong>opera</strong>的压缩服务器的时候，他会检测到你的ip所属区域，根据天朝具有特色的&#8221;某些不太明确的规定&#8221;，<strong>opera</strong>会阻止你使用该压缩服务。为了能够科学上网，<a href="http://code.google.com/u/luosheng1986/">luosheng1986</a>在Goolge Code 创建了一个OPM Server Mirro的<a href="http://goo.gl/0MajG">开源项目</a>，通过在国外主机上运行简单的几行php 代码（必须在国外的web host上运行），跳过了<strong>opera</strong>的ip 地址检测，从而使得我们能够重新使用<strong>opera</strong> 国际版的数据压缩服务，也就是实现了穿越。</p>
<p>所以<strong>Opera</strong> 穿越版的关键是上述这个类似代理的跳转。由于免费空间在我心中不靠谱的烙印，你懂的，所以，我个人还是建议使用这里<a href="http://goo.gl/vejSd">提供的方法</a>，自行修改。下面提供一个使用<a href="http://www.freewebhostingarea.com/">freewebhostingarea</a> 做的apk 文件，希望对您有帮助。<strong>点<a href="http://goo.gl/hNm36">这里下载</a></strong>。</p>
<p>P.s.这篇日志是旧博客上的，完全符合我现在的日志要求。</p>
]]></content:encoded>
			<wfw:commentRss>http://mingbo.de/2011/02/14/opera-mini-android-fucking-gwf/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>又是一个新的Hello World</title>
		<link>http://mingbo.de/2011/02/14/another-hello-world/</link>
		<comments>http://mingbo.de/2011/02/14/another-hello-world/#comments</comments>
		<pubDate>Mon, 14 Feb 2011 15:45:44 +0000</pubDate>
		<dc:creator>shaomingbo</dc:creator>
				<category><![CDATA[碎碎念]]></category>

		<guid isPermaLink="false">http://shao.mingbo.de/2011/02/14/%e5%8f%88%e6%98%af%e4%b8%80%e4%b8%aa%e6%96%b0%e7%9a%84hello-world/</guid>
		<description><![CDATA[我的博客经历了3次搬家。 记得最早用的BLOG 是QQ Zone。当时，写博客的方法很简单：疯狂的浏览各类网站，然后不加任何版权信息的转帖。接下来是等待着人们的点击（或许还能交流一下观点），然后暗爽。但很快的，我注意到了一些问题： 博客的点击量并没有我预期中的那么大 我的读者似乎都是认识我的人 QQ Zone 页面复杂到浏览器加载起来很吃力 我关注的博客都不是用的QQ Zone QQ Zone 的使用限制太大了。 使用互联网的人都会不知不觉的邂逅搜索引擎，然后很快的爱上她。在这个不算慢的过程中，我从一些个人站长的嘴里了解到了SEO 。一种分享的渴望，在这一刻终于有了一种“科学”的方法。后来，理所当然的我选择了百度旗下的百度空间，原因很简单，即使是我转载来的文章，我的空间页面仍能够在搜索结果里比较靠前…… 剪贴并快乐着的日子并不长。我经历了人生的一个转折点：研究生入学考试。为了准备，我和很多孩子一样放弃了自己的兴趣爱好，当然包括更新我的剪贴板。 一段不知道该怎么描述的空白，此处应该省略好多字。 嗯，我开始启用现在的这个域名(mingbo.de)，重新开始了我的博客生活。这是第三次大搬家。与之前的搬家不同的是，我有开始认真的写博客了，每一篇都尽量的保证原创，但凡引用的地方也一定标注了出处。悲剧的是，墨菲定律在2011 年的春节期间光顾了我的博客：为了节省开支，我的博客没有继续使用昂贵的独立主机，而转向了合租空间。大致是因为某个合租用户违反了某些政策，空间提供商冻结了我们的账户。经努力，抢救无效——之前的博客数据就在那一刻悲剧了。 我尽可能的想办法将博客恢复到原貌。结果还算理想，只是某些文章的附图找不到了。但，很诡异的是，当审视着那些个残缺不全的文章时，我忽然间做了一个艰难的决定：全部删掉，重写。我不知道现在自己要用什么理由去支持我当时的行为。但新博客在这里，嗯，我不会让相同的悲剧重演。 Hello , World!]]></description>
			<content:encoded><![CDATA[<p>我的博客经历了3次搬家。</p>
<p>记得最早用的BLOG 是QQ Zone。当时，写博客的方法很简单：疯狂的浏览各类网站，然后不加任何版权信息的转帖。接下来是等待着人们的点击（或许还能交流一下观点），然后暗爽。但很快的，我注意到了一些问题：</p>
<ul>
<li>博客的点击量并没有我预期中的那么大</li>
<li>我的读者似乎都是认识我的人</li>
<li>QQ Zone 页面复杂到浏览器加载起来很吃力</li>
<li>我关注的博客都不是用的QQ Zone</li>
<li>QQ Zone 的使用限制太大了。</li>
</ul>
<p>使用互联网的人都会不知不觉的邂逅搜索引擎，然后很快的爱上她。在这个不算慢的过程中，我从一些个人站长的嘴里了解到了<a href="http://goo.gl/veTNv" target="_blank">SEO</a> 。一种分享的渴望，在这一刻终于有了一种“科学”的方法。后来，理所当然的我选择了百度旗下的百度空间，原因很简单，即使是我转载来的文章，我的空间页面仍能够在搜索结果里比较靠前……</p>
<p>剪贴并快乐着的日子并不长。我经历了人生的一个转折点：研究生入学考试。为了准备，我和很多孩子一样放弃了自己的兴趣爱好，当然包括更新我的剪贴板。</p>
<p>一段不知道该怎么描述的空白，此处应该省略好多字。</p>
<p>嗯，我开始启用现在的这个域名(mingbo.de)，重新开始了我的博客生活。这是第三次大搬家。与之前的搬家不同的是，我有开始认真的写博客了，每一篇都尽量的保证原创，但凡引用的地方也一定标注了出处。悲剧的是，<a href="http://goo.gl/1a5jt" target="_blank">墨菲定律</a>在2011 年的春节期间光顾了我的博客：为了节省开支，我的博客没有继续使用昂贵的独立主机，而转向了合租空间。大致是因为某个合租用户违反了某些政策，空间提供商冻结了我们的账户。经努力，抢救无效——之前的博客数据就在那一刻悲剧了。</p>
<p>我尽可能的想办法将博客恢复到原貌。结果还算理想，只是某些文章的附图找不到了。但，很诡异的是，当审视着那些个残缺不全的文章时，我忽然间做了一个艰难的决定：全部删掉，重写。我不知道现在自己要用什么理由去支持我当时的行为。但新博客在这里，嗯，我不会让相同的悲剧重演。</p>
<p>Hello , World!</p>
]]></content:encoded>
			<wfw:commentRss>http://mingbo.de/2011/02/14/another-hello-world/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

