博文

目前显示的是 十二月, 2011的博文

指针强转的时候要小心啊!

今天我的程序遇到了一个BUG,很蹊跷。ACE有一个ACE_Service_Repository单件,相当于一个bean container那样的东西。我把一些object在启动的时候注册进去,然后在运行的时候根据名字查找。于是就解决了两个问题:以名称查找的方式进行依赖注入被查找的对象,可以单独编译在另一个so中,动态加载。但是我用的时候遇到了BUG,我的出问题的代码如下:ACE_Service_Type const *svcp = 0; if (-1 == ACE_Service_Repository::instance ()->find (ACE_TEXT ("MyDbEnv"), &svcp)) { thrownewstd::runtime_error("cannot find MyDbEnv Impl"); } MyDbEnv* env=(MyDbEnv*)svcp->type()->object(); env->openDatabase("…"); 运行的时候,vc告诉我,esp寄存器坏了。我纳闷了好一半天。向ACE_Service_Repository注册对象首先要用这个宏定义一个工厂方法,ACE_FACTORY_DEFINE (ACE_Local_Service, MyDbEnv) 其中ACE_FACTORY_DEFINE的定义如下:# define ACE_FACTORY_DEFINE(CLS,SERVICE_CLASS) \ voidACE_MAKE_SVC_CONFIG_GOBBLER_NAME(ACE_VERSIONED_NAMESPACE_NAME,SERVICE_CLASS)(void *p){ \ ACE_VERSIONED_NAMESPACE_NAME::ACE_Service_Object * _p = \ static_cast< ACE_VERSIONED_NAMESPACE_NAME::ACE_Service_Object *> (p); \ …

2011-12-27

今天把Berkeley DB加进去,加到昨天的测试代码中。然后把client改成多线程的,其实就是为了方便启动测试。首先,当服务器端是单线程的时候,一切都工作的很好,QPS也不低。然后,我把服务器改成多线程,共享一个db handle。然后立马就死锁了。速度非常快。嗯,用锁的时候必须把死锁检测打开。dbenv->set_lk_detect(DB_LOCK_DEFAULT);你猜怎么着?第一次测试,很OK,插入20万条数据(key是用java.util.Random.nextLong生的),花了23秒。第二次,卡死了。我以为又是死锁,但是用pstack打开一看,不是。好多线程在等锁,还有好多线程停留在pwrite状态下:#0 0x00000030d56c4aa8 in pwrite64 () from /lib64/libc.so.6
#1 0x00000000004b1852 in __os_io ()
#2 0x000000000057872c in __memp_pgwrite ()
#3 0x0000000000578974 in __memp_bhwrite ()
#4 0x00000000005772cc in __memp_alloc ()
#5 0x00000000004a15f7 in __memp_fget ()
#6 0x00000000004ef276 in __ham_get_cpage ()
#7 0x00000000004e7011 in __ham_lookup ()
#8 0x00000000004e7814 in __hamc_put ()
#9 0x000000000045ffe1 in __dbc_iput ()
#10 0x00000000004613e0 in __dbc_put ()
#11 0x000000000045ccbe in __db_put ()
#12 0x000000000046b112 in __db_put_pp ()
#13 0x0000000000445ba6 in Db::put(DbTxn*, Dbt*, Dbt*, unsigned int) ()
#14 0x00000000004426e0 in MyService::put(google::protobuf::RpcController*…

今天写代码写的比较爽

我之前怀疑ICE会不会因为太臃肿了,而导致RPC效率不高。于是从前天开始,就准备重新用google protocol buffers实现一套,比一比。今天下午快下班的时候,终于写完,并做了benchmark。结果与ICE差不多,没有明显差异,在单线程的客户端上依然是7000-8000的QPS。不过悲剧的是,服务器端有内存泄漏。哈哈…… 明天慢慢找吧。另外,之所以重写,是因为我想采用thread-per-connection的模型,本来是想提高CPU使用率,可是后来一想,其实。。。唉,难说。如果像现在这样,单个客户端很难把服务器的CPU吃满,那么这种模型也还好。但是如果慢慢的把更多的逻辑加进去,而客户端的请求量不均等的话,那么不是很好。再说吧。反正MySQL是这么做的,我仿它的。至于那些建议我用epoll的人,麻烦给我足够的理由,否则我没法接受,我觉得很可笑。今天一上班就在不停的写代码,感觉就跟刚进大观园的刘姥姥一样,头也不抬,仿佛要一口气吃掉一头牛。有时候我觉得最需要被做benchmark的不是我们的代码,而是我们自己。为啥呢? 因为,现在互联网公司的绝大多数项目,运行效率不是第一位的,开发效率才是第一位的。所以我们总是想做出更简单易用的框架。嗯…… 给人做benchmark ? 太难。明天把BDB加进去把存储部分写完,下班之前就可以测出上篇文章我想要的答案了。虽然,不是最终值,起码这是一个起点嘛。如果有精力,就在服务器端和客户端各加一个线程池,做connection pool。下班!

碎碎念,关于一个datastore

最近,想做一个data store,存储一些用户数据。我想越简单越好,不要搞什么分布式,尽力单机解决所有问题,然后找一个机器做replication。但是呢,这个机器所处位置很重要,很容易成为整个网站的瓶颈,所以我还是想尽可能的提高效率。我要一个什么东西呢? 简单点说,就是一个可持久化的、高效的KV存储。例如腾讯的CMEM服务,或者,mysqld+memcached。我只是举个例子,不一定非要走memcache的接口。每个item都有一个过期时间,超过那个时间之后,应当被删除,否则硬盘会炸掉的。据同事估计,数据量大概是1-2T左右。我觉得我通过压缩手段,能降低到100GB的规模。请求的频率呢,大概是每秒2-3万次读写,而且写入比例非常大,可能是读的2-3倍。我希望能尽可能的把QPS(query per second)做高一些,比如做到10W QPS。这个问题,如果想最简单的解决方式,那么可能是用一个mysql或者redis这样的数据库,然后尽力优化就行了。MySQL的qps能到多少呢?我之前测试,即便是最简单的update语句,也只有5000左右。client是单线程的。一个key-value的data store,QPS的瓶颈在哪?Btree/Hash本身?还是网络IO?为了测试一下RPC的性能,我昨天做了一个非常简单的测试,用ICE写一个特别简单的hello world,服务器端收到请求之后,不做任何处理,立马return 0。服务器端是C++的,客户端是JAVA的。你猜QPS多少?在我自己的笔记本上测试,只有3000。放在服务器上测试,2个intel E5620(4核),只有7-8千。为什么只有这么低呢?因为客户端是单线程的。第一个请求完了之后,才会发第二个请求。于是我在单机上开了20个进程一起跑,大约测试到8万左右的QPS。但是,这个数据我能满意吗?按我实际的运行环境,我这东西只对内网服务,我的client只有10个左右。所以,如果这些client本身不是多线程的,那么我的吞吐量可能无法达到3万。假设,服务器的内存已经非常大,cache命中率已经足够高,那么通过加CPU,能提高QPS吗?现在绝大多数高性能网络服务器都是单线程模型,所以我才有这个疑问。假如,用epoll做一个echo service,那么单机能跑到多少? Hash这样的结构,非常适合于并发读…

终于用图形界面连上外网的服务器了

我想用jconsole连接外网的服务器,可惜外网的服务器不仅不支持直接连接,而且我也没有这个服务器的root权限,它防火墙的规则很严格,我没可能开什么新端口也不能连接外面的其它机器。但是最终我还是搞定了。记录一下过程:这个服务器是Linux机器,但是只安装了必须的程序,不带有任何xorg的client和server程序。所有有两条路:A:在我本机运行一个X,然后让它来连接我。B:在它上面运行一个X,用vnc的方式连接。我选择了后者。首先,下载一个vnc server,我用的是 realvnc, http://www.realvnc.com/cgi-bin/download.cgi然后,光有vncserver还不够,还得有xauth这个程序,我是从rpm里面解出来的。然后把所有这些可执行文件,vncconfig vncpasswd vncserver vncviewer x0vncserver Xvnc,传到服务器上,自己的HOME目录下的bin文件夹(~/bin)中。检查一下PATH是否包含$HOME/bin,如果没有,加上。然后先运行一次vncserver,那么它就会生成~/.vnc这个目录。改一下xstartup这个文件。它默认会启动xterm和twm(这是一个窗口管理器)。xterm -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
twm &可惜我的机器上没有xterm也没有twm,所以要注释掉,把我要执行的程序,如jconsole写进去。OK,这就解决了,虽然没有root权限,但是也想装个X并启动的问题。下一步就是打洞了。把这个机器的5901端口,通过神奇的隧道,转发到我本机上。打洞的方式,每个公司都不一样,此处略掉。

我的一个VPS貌似是被黑了

前一阵给一个朋友买了一个ubuntu的vps,做ssh proxy用。今天收到短信,说上不去了。然后吧,比较悲剧的是我发现我也连不上这个服务器了。然后只好从grub修改启动方式,进去改root密码。顺便吐槽下,ubuntu的reset root password的方式千变万化,不同的版本必须用不同的方式,你要是想像以前那样,直接加single进入单用户模式,sorry,bye-bye 。。。进去之后,发现/var/log是被清掉的。root的.ssh目录下的authorized_keys已经被改掉了。真是个悲剧吖。然后我赶紧把sshd的配置文件review了一遍,把基于密码的登录方式禁用掉,把root的远程登陆也禁用掉。把每个用户的密码挨个改一遍,但是……/etc/passwd下有很多用户的shell不是/sbin/nologin,而是/sbin/sh,比如games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh这些东西混杂其中使得我心惊胆颤,不知道这种账户到底能不能通过远程登录。最后,我觉得这件事情最可怕的在于,我不知道hacker到底改了什么。如果他偷偷替换了某个so,然后趁我最初登录服务器抓狂的时候,把我输入过的密码挨个记录下来并发送走……嗯,这还没完,总之只要这个so还在,他就能继续控制这台服务器(设想他改的是libc.so.x)。而Linux并没有Windows那样的sfc /scan的命令,所以,此时唯一正确的方式就是重装系统。是这样吗? 第一次被黑,求指点。p.s.我怀疑是因为我装了一个wordpress,但是从来没搭理它,也没用。但是wordpress的安全漏洞是层出不穷,如果再配合上Linux kernel的某个权限提升漏洞,就嗝屁了。附:我的防火墙设置# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 c…

完美和新浪到底有多么不同?

今天听一些人讲了一些东西,收获很多。本来想写完美和我现在的公司有多不同,但是不敢,因为前几天我收到一封邮件,要求我别乱说话,并提醒我注意自己的人身安全,所以还是说sina吧。老黄举了一个例子,msn网站 作为微软release周期最短的一个产品,平均2-3个月release一次。并且最关键的是,它是一个产品,采用一个版本号,整体发布。而不是产品线。老黄说,这是在做软件,而不是做服务。对于互联网的网站,应该是在做服务。长久以来,我一直把完美和文思这样的公司统一归为软件企业。软件企业在做什么呢?我花2-3年的时间,做一个特别优秀的软件,然后卖出去。完了吗?没完。拿了钱就想跑?哪有那么容易。用户拿去用之后,不断会有新需求提上来,于是在产品卖出去之后,把绝大多数人慢慢砍掉去做新项目,然后留1-2个技术人员继续满足客户无休止的新需求、改BUG。今天我在想,我这种观点是错的。魔兽多久发布一次补丁? 3个月,还是半年?而国产网游呢,几乎一直是在靠不断的出资料片,出新的节日活动拉拢用户。你说中国人每年要过多少个节日啊!!!下周就是圣诞了,管你信不信耶稣,不做个圣诞节活动,你好意思吗?一定要做,而且不能跟去年一样! 策划每天都想发新版本,不是往外面的正式服发,就是往外面的测试服发。一周发3-4个版本是很正常的。所以,魔兽世界,和完美的游戏,绝对是两种产品。我在完美后来过的很苦逼,名为主程序,实际不过是个发版本的,管理svn分支、build、release。更惊讶的是,听老黄说,豆瓣是一个神奇的网站,持续集成做的特别好。发布一个新东西上线,从自动测试到部署完毕,也就4分钟的时间。我的第一个反应是,哇塞,完美你赶紧学学人家吧!我们可以少加多少班啊!可是后来一想,又不对。这事儿我都不用给panpan说,不等他开口,我自己就把我自己推倒了。因为问题不在这,游戏每次更新的时候,停机时间长不是因为程序造成的。这个核心在于:完美注重结果,你的ACU,你的月充值,所有的中高层都能看的见。这就是你的KPI,在它的强大压力下,中间的一切流程化的东西都被弱化以至于消失了。以至于很长很长的几年里,游戏做线上更新一直跟QA部门没有什么关系。你对你的结果负责就好了,你不求我帮你测,我干嘛帮你测?直到有一天,我们项目竖立了一个典型,怎么因为一个非常小的程序BUG,流失了很多很多用户,然后大幅度影响当季度的利润,…

数学对象是天然存在的还是被构造出来的?

数学对象是天然存在的还是被构造出来的?这个问题差不多是在问数学对象到底是不是一个客观实在。对于任何两点,我们能够画一条直线通过这两点。任何两点之间存在一条直线。这两句话在文字含义上略有区别,但不是我正在思考的。我想说的是另外一个新了解到的东西:我们在定义一个数学对象的时候是否用到了被包含对象所在的集合?举个例子:如果把“中国首富”,定义为中国最有钱的人。看上去似乎是没有问题的。但是如果你把集合A定义为所有不属于A的集合,那么就有问题了。(参见罗素悖论)于是有人提出:我们不能在定义一个数学对象的时候用到包含它的集合。数学对象是构造出来的,不是天然存在的。举个例子 :数学分析的一开始 ,有两个重要的概念,上界和上确界。上界就是说,一个数,比某个集合中的所有数都大(或等于),那么这个数就是这个集合的上界。上确界就是说,一个集合的所有上界中,最小的一个。比如,2是{x<0}的上界,3也是{x<0}的上界,但是它们都不是{x<0}的上确界,0才是。可是,数学分析课本才不是这么定义上确界的。课本是说,对于集合S,如果存在一个a,a是S的上界,并且对于任何小于a的数,总能在集合S中找到一个数大于a,那么a就是S的上确界。这个定义并未假设S的上界存在,也未假设S的上确界存在。事实上,这才是遇到习题中确界类问题的时候,一般的证明思路。这让我想起上个月去支教的时候,和志愿者们聊直言命题的存在性。因为,所有的S都是M,又因为,所有的M都是P,所以,有S是P。这个推论对吗?这个问题在于,全称直言命题是否具有存在性含义。全称直言命题是指“所有的S都是P”以及“没有S是P”这两类命题。特称命题是有存在性的。如果全称命题没有存在性含义,那么两个全称命题不能得到一个特称命题作为结论。这是经典逻辑和近代的直觉主义的一个重要争执。而前面的争论在于,我们在描述一些数学定理的时候,比如,S的上确界是S的上界中最小的一个,这种定义方式是否有问题?假如S的上界是空集呢?若你认为某些数学概念是天然存在的,最前面说的那种循环定义,其实也可被接受。比如中国首富。若什么都要被构造出来……我第一次认识到这个事情是在学习Coq的时候。发现,有些定理是在它的体系能证明不了的。

书超越其本身的意义?

今天是 @有时右逝 的新书发布会,http://event.weibo.com/291670 。原定于下午2点开始,在中关村图书大厦签售 。但是他前面是郑渊洁的签售。郑渊洁在2点14分的时候在sina上发了一条微博说:“我在北京中关村图书大厦《皮皮鲁送你100条命》读者见面会上签了五个小时,现场依然有很多读者。我承诺只要现场还有一位读者就不走。”于是@有时右逝 和他的读者们就只好默默的等着。当时队伍已经从5楼排到1楼,排在队首那位,是早上7点20就来了,可惜中关村图书大厦还没开门,就只好去买个煎饼吃完再回来。一直等到4点多,郑大师终于走了。然后@有时右逝 上来很愤怒的发了一通牢骚,为什么所有人都在跟他强调秩序要遵守秩序但是就没有人提醒一下郑渊洁按预定的时间安排来。呃,右右是个很粗俗的人,脾气急躁,发布会上说了些不合适话后来又后悔了,上微博道歉。“今天的事情,我冷静想了想,不怪任何人,只怪我自己不争气。如果我的地位够高,那么我的读者也能够像@郑渊洁 老师的读者一样得到应有的尊重,起码会有座位让大家等。我唯一能做的,就是下楼和我的读者一起站在寒风里苦逼。对不起,哥们们兄弟们,我没能耐,让大家吃苦了。今天我看到了@郑渊洁 老师的微薄,说是很多读者远道而来,所以他要负责尽职。我明白,因为我也有读者是坐着飞机从大连来得,也有坐火车从四川来的。所以我也打算全部签完之后再走。当然了,最终原因还是因为我人微言轻。最后的办法是我自己在走廊里给读者们签字,但是管理方又说这样很乱,会打扰里面的签售会,而且一再和我强调秩序。但是,如果按照秩序来,我的读者两个小时前就该进场休息了,而不会是一直在外面受冻。对不起,我没有为你们争夺到合理的权利,哪怕是椅子都没能加一把。抱歉了,很多人都要赶着回家,而且书店九点关门。很多远道而来的朋友,我们只能匆匆写下几个名字并不能一笔一笔多加几句祝福。我们在8点52分结束了所有人的签售,可想而知时间多么赶。而那些2点来到的读者,就这么等到了晚上9点。对不起,哥们姐们,我没能耐,没有帮你们夺回那两个小时。最后还是感谢那些在寒风之中坚挺了不知道多少个小时的兄弟姐妹们。谢谢你们的坚持,让我知道魔兽玩家是一家。这个世界理应如此残酷,而并非那些童话描写的温馨和公平。我发誓,我一定努力,我要让我的读者获得应该得到的尊重和待遇。我发誓。”事后,很多人去刷@郑渊洁 的微博请他…

感谢完美

算一下,从完美离职,差不多已经一年。很多事情放在当时看不清楚,而只有放在一个相对较远的时间点再去看,才能看的明白。我在完美,算是运气极好的那种人吧。当时面试的时候我并不知道我面的是哪个部门,进去之后才知道是数据安全部。刚开始有些诧异这个部门是做什么的,后来才发现,它有点类似于完美的研究院,各种基础性的研发,比如数据库、网络框架、OS定制化都是在这里做。但是它又和纯研究性质的研究院不同,它也做项目。而我所参与的,就是它的第一个游戏项目。回过头想,你说一个刚毕业不久的学生,最需要什么?户口?很高的起薪?这些完美都提供了,但是倘若被这些蒙蔽,那么就有些可惜了。刚进完美的时候,panpan给我们开了一个会,我至今记忆深刻。大意是说,这里只有一种职业,程序员。我们分初级程序员、中级程序员、高级程序员,而没有游戏程序员、3D程序员这样的title。所以你就想,如果你想做好一个程序员,该从哪些方面提升自己?我想,对于一个刚毕业的学生来说,最重要的就是,拼命写代码,安安稳稳的写3-5年代码,再去想什么HA啊、分布式啊这些事情。完美是一个非常重视研发,尤其是非常重视程序员的游戏公司,和其它互联网公司不同的是,他更像是一个传统的软件公司,制定开发计划,每天写工作报告,反复迭代。刚毕业的学生,写的代码都是惨不忍睹,管你清华的还是北邮的,都是如此。一个个的BUG被揪出来,慢慢的就会养成一些好习惯,比如减小临时变量的作用域,把函数不要写太长。这些,光看《Effectivce C++》这样的书是不行的。因为这些书不是系统的讲一个问题,而是一条一条的,想的什么就说什么,而且其中有些是过于偏激的。只有多实践,才能写出好的代码。在完美,工作强度是很大,但是相比于高三的学生来说,咱还是轻松很多吧?想超越普通人的成功,就得花出不一般的勤奋。如果我当时留在Sina,那么走的就完全是另外的一条路。熟悉更多的开源产品,比如MongoDB、Mysql Proxy,略读他们的代码,然后在拼装上做的更熟练,美其名曰:"架构师"。但是对技术产品的认识,始终是停留在一个比较浅的层面。假如,现在有一个新的开源产品出现,我该如何去了解它?我认为,分三步:What? 它是做什么的,适用于什么领域。拿Protocol Buffer来说,它就是一个序列化框架,凡是要把一个对象通过IO(文件、数据库、网络)…

KindleFire被我变砖了

记录下我今天做了什么。我想给Kindle编译一个自定义的内核。嗯,这件事情无论怎么想都是个高难度的事情。首先,安装vmware 8.0,然后在vmware里面装ubuntu 11.10 64 bits按照http://source.android.com/source/initializing.html 所写的构造编译环境。首先,安装32位jdk
http://download.oracle.com/otn-pub/java/jdk/6u29-b11/jdk-6u29-linux-i586.bin
root@ubuntu:~# mkdir /usr/java/
root@ubuntu:~# mv jdk1.6.0_29 /usr/java/
root@ubuntu:~# ln -s /usr/java/jdk1.6.0_29 /usr/java/default
root@ubuntu:~# export PATH=$PATH:/usr/java/default/bin
root@ubuntu:~# export JAVA_HOME=/usr/java/defaultFedora/Red Hat企业版下,全局的PATH变量依然是在/etc/profile下设置的。我不知道ubuntu是怎么回事,没看懂。反正/etc/profile和/etc/profile.d中都没有找到设置PATH的代码。然后安装必备的包:apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev libc6-dev lib32ncurses5-dev ia32-libs x11proto-core-dev libx11-dev lib32readline-gplv2-dev lib32z-dev libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown libxml2-utils有点搞笑,很多包的包名必须加上gplv2才行。至于吗?何苦呢。然后安装Android SDK和NDK。然后从这里下载Kindle Fire 6.2的更新包
https://s3.amazonaws.com/kindle-fire-updates/…

win7下给Kindle Fire安装Android SDK的USB驱动

这是拿root之前必须要做的事情。下载android SDK,http://dl.google.com/android/installer_r15-windows.exe 并安装。我就默认安装到C盘了。在SDK Manager里面下载需要包。首先,在Android 2.3.3(API 10)下面选上SDK Platform。然后,在Extras里面选上USB Driver。然后依次安装。.android\adb_usb.ini 加一行0x1949打开C:\Program Files (x86)\Android\android-sdk\extras\google\usb_driver\android_winusb.inf 在[Google.NTx86]和[Google.NTamd64]节的末尾都加上 ;Kindle Fire %SingleAdbInterface% = USB_Install, USB\VID_1949&PID_0006 %CompositeAdbInterface% = USB_Install, USB\VID_1949&PID_0006&MI_01控制面板里打开“设备管理器”,会发现kindle是个叹号。更新驱动,目录选择C:\Program Files (x86)\Android\android-sdk\extras\google\usb_driver到C:\Program Files (x86)\Android\android-sdk\platform-tools下执行 adb kill-server adb start-server adb devices执行完最后一条命令后,应该能看到输出这样的结果。List of devices attached
6708002600000001 device这就对了。同时,“设备管理器”里也没有叹号了。

2011-12-3

29号回京,30号休息一天,收拾东西,取kindle。然后从31号到现在,一直在给我的电脑重装系统,今天已经是第四天。重装系统的原因有这么几个:C盘满了,怎么清理都没用。然后因为用了2年了,反复的装软件、卸软件,很多软件在系统内留下了许多垃圾,越来越慢。然后是诺顿非要把我的Thunderbird的Inbox文件删除,不给我任何其它选项。隔几分钟弹一次,我实在是烦了。 我之前吃过一次这样的亏,我在跟人聊QQ,忙着打字,然后按了一下回车。但是当时机器卡了一下,在我按回车之前,诺顿跳出来了,问我是否要删除Inbox文件,我按了下回车,其实这个操作本来该发给QQ的,却发给了诺顿,然后我的邮件就统统被删除了,诺顿说因为文件太大,所以就没有备份。这次装系统,我把以前的D盘和C盘合在一起,装系统以及各种软件。然后把以前的E盘更名为D盘,装其它东西。区别是,C盘里的东西是重装的时候可以直接格掉的。这次我给C盘分了155GB,但愿它不要再爆仓。这次重装之前虽然用ghost做了备份,但是依然犯了一个很大的失误。我只对windows下的分区做了备份,因为我本来也就没有想调整Linux分区。但是我在用windows 7 自带的磁盘管理器在扩展分区上新建逻辑分区的时候,它错误的把这个分区上的所有Linux分区都给我删了。囧。我想通过工具把分区表找回来,但是那几个分区是先做LVM,把一个主分区、一个逻辑分区合成一个lvg之后再在这上面分的lv,然后newfs。所以我试了好几个软件,都没能找回来。估计它们不认识这么复杂的方式吧。于是我的Linux下的所有东西都丢了,无限怨恨。但是我对我调整后的备份方案非常满意。首先是本地的Ghost备份。用Ghost把所有windows分区备份到一个做了raid冗余的磁盘阵列上。我用的Ghost版本是Ghost 15,可以直接在windows下一边聊QQ一边做备份,也可以利用u盘启动然后在那下面做备份。Ghost 15非常优秀,它本身是基于win7做的,而且支持自定义恢复盘,把我需要的驱动都加进去。于是在它的恢复环境中支持网络访问NAS甚至是网盘上的数据。它的备份速度非常快,我备份了200G左右的数据也就花了1个多小时。而且它默认采用的是全量+增量的备份模式,我昨天做完一次全量之后再做增量,只花了3分钟。支持加密,支持压缩。所以比直接 复制/粘贴的方式备份好多…

kindle fire第二日:root、输入法、VPN等等

我知道拿root权限之后会有很多问题,比如amazon video看不了了,但是没有输入法是很痛苦的事情,所以就还是拿了root。拿root的过程比较简单,这里有图文并茂的教程 http://rootkindlefire.com/kindle-fire-root/how-to-root-kindle-fire/ 按着一步步做。作者提供了一个mini版的android SDK,把最必须的几个文件包起来,然后做成一个bat。装输入法的过程比较繁琐,大致步骤如下:首先,用Kindle Fire的浏览器打开http://shouji.sogou.com/download1.php 下载AndroidPad版的sogou输入法,并安装。然后,会发现用不了。因为有个系统设置不对,需要把/data/data/com.android.providers.settings/databases/settings.db里面secure表的enabled_input_methods的值后面追加上“:com.sohu.inputmethod.sogoupad/.SogouIME”(无引号)。安装的时候可能因为缺权限,所以安装程序没能把这个加上,非要用root账户手动改。具体步骤在这里http://forum.xda-developers.com/showthread.php?t=1351914先把Kindle Fire和电脑用USB线连接起来,这时候电脑上会多出来一个盘。在Kindle上选Disconnect。电脑上那个盘消失了。在电脑上找到拿root时下载的那个文件夹,运行 adb shell,把文件copy出来然后重新点一下kindle fire的屏幕,点上面的通知区域,然后让它重新以usb的方式连接到电脑上。于是电脑上会多出来一个盘。在电脑上用Sqlite编辑器,比如Navicat Premium,打开多出来的这个盘的Download目录下settings.db文件。找到secure表。这个表一共就2列,key/value的形式。找到key=enabled_input_methods的那一行,它现在的值应该是com.android.inputmethod.latin/.LatinIME。在后面追加上“:com.sohu.inputmethod.sogoupad/.SogouIME”(…