Android JNI SetIntField 是如何定义的

August 22, 2010

窍门在下面的代码里

/home/bhj/src/android-nv-froyo/dalvik/vm/Jni.c:2638: #define SET_TYPE_FIELD(_ctype, _jname, _isref) \
=> #define SET_TYPE_FIELD(_ctype, _jname, _isref) \
Advertisements

写给表弟(三)

August 14, 2010

靠,用的这个weblogger.el肯定有问题,贴(2)的时候把(1)给弄没了。没了就没了吧,没什么大不了的。

关于学C++拘泥于各种偏僻语法的人,还有一个例子能说明他们有多可笑,就是鲁迅先生笔下的孔乙己,专门研究茴香豆的茴字有多少种写法。

题目叫“要有识”,怎么说得好像有些知识是不用学的呢?没错,因为有些知识你学了一辈子也用不着,就像茴字有多少种写法,无疑是一种知识,把这知识用出来的人,却遭人耻笑。

还有些知识,你现在或者一时半会儿用不着,所以即使学了也会忘记,反而浪费你的时间,妨碍你用已经学会的知识去解决你已经能够解决的问题。这些用不着的知识,往往是学起来最费劲的,道理很简单,就是因为用不着。用得着的,用过几次就能加深印象,用不着的它就容易忘记啊。唉,又狗咬自己尾巴了。

说到最后,建议你学一点哲学,这是“关于知识的知识”,比如矛盾论之类的。上一篇提到的小狗,就可以套一下矛盾论的说法,它是从一个小坡上滚下来,完了对它反而有点好处,如果完全没有滚,那就谈不上了;如果是个太大太陡的坡,说不定滚死了,最后都没有好处。这就是一个矛盾、平衡的问题。

就像什么知识该学,该什么时候学,花多大力气去学,也是这么一个平衡的问题。

如果不明白我说的意思,没关系。并不是什么东西都需要弄懂的,你不懂的东西,不会对你造成伤害。把你懂得东西,尽你最大的可能用出来,是很重要的。

What you don’t know, won’t hurt you!

写给刚学计算机的表弟(二)

August 14, 2010

要有识

俗话说,艺高人胆大,所以可见胆大不大跟一个人的技术水平也很有关系。我得小心一点,别说着说着又回到胆子问题上去,变成狗咬自己尾巴,团团转。

但是团团转似乎还真难以避免。学计算机就像学走路,呃,就像小狗崽子学走路,人还是狗都无所谓。记不大清了,可能是杰克·伦敦写的一本小说里,描写了两只小狗学走路的场景。狗妈妈一不留神,两只小狗从狗窝里爬了出来,一只比较胆小,迟迟不敢离开狗窝太远,另一只稍微胆大一点,越走越远,一不小心还从一个小坡上滚了下来,吓得它呜呜直叫(可见其实它的胆子也不比它兄弟大多少)。最后这两只小狗就有了完全不同的境遇。

学知识可不就跟小狗探索未知的世界一样吗。很多东西,你没有亲身经历过是不可能学到的,光看书一点儿用也没有,光看你表哥跟你这儿瞎扯也一点儿用也没有。必须真正地从小坡上滚下来过,才能知道那是怎么回事。

看见别人滚下来,去问问它,什么感觉?它不可能跟你说明白,它只能告诉你,没事儿,你不会受伤的。对它的这个说法,你可能相信,可能不信;即使相信,也可能犹豫、徘徊很长时间,最终还不敢滚一滚。

C++的作者 Bjarne Stroustrup 对学C++的人最爱说的一句话是,What you don’t know,won’t hurt you(你还未学到的知识,不会伤害于你)。

他为什么老说这句话?就跟为什么人们说“罗马不是一天建成的”一样,说明肯定有很多人不信。我就曾经是这样的一个傻子。

我学C++的时候,很怕自己有什么东西给遗漏了,没学仔细。整天纠缠于那些最偏僻、最邪门的语法,其实是很没有用的。忘记了学任何一门语言,最终的目的都应该是用它去解决问题,而不是把它所有的语言规则都弄懂。或者很多人根本没想过这个问题:我为什么要学这个,为什么要学那个?

仔细想想其实很正常,因为我们从小到大一直被灌输的思想就是“为了应付考试”。但是请你相信我,如果你走上社会后还继续抱着这种思想,那就是最大的傻子。

这是什么网络问题啊!

July 20, 2010

最近几天发现自己的机器每次开机1~2天之后就上不了Google了,而旁边的机器都还能上。所以可以排除是GFW引起的问题。

发生这种情况之后如果我想上任何google网站(搜索,邮件..),必须重启机器。不光光是浏览器上不了google,任何网络工具都不管用!wget/nc/telnet/lftp/curl,每个都报Connection timed out。只有非常偶尔的情况下这些命令行的工具可以把google的主页抓回来。不知道是什么原因引起的:-(

我试着分析了一下tcpdump抓的包,我用wget http://www.google.com去连google,常常会出现这样的情况:我的机器发一个Syn,然后google会回一个Syn+Ack,然后我的机器会发Rst。如果在旁边的机器上试的话是不会发这个Rst的,而是发Ack。

我的机器上好像也没有装什么防火墙,怎么会出这种状况呢?而且不是一开机就出,每次开机过二十多个小时后才出?

在 shell脚本里使用Abstract Factory的设计模式

July 20, 2010

在不同的平台下,我需要定义一个函数,of,其作用是在命令行下用系统定义的图形程序打开某个文件或URL。

比如,of .在Windows平台下应该用Explorer打开当前目录,而在Linux平台下应该用nautilus打开当前目录。

我需要一个工厂虚类,其实就是文件。在linux下,这个工厂有一个实类,同时也有一个对象,那就是我的.bashrc-linux;而在Windows下呢,那就是我的.bashrc-windows。哦,不好意思,我在Windows下在用的是Cygwin。所以也可以使用bash。

在.bashrc-linux这个工厂里,我们这样创建of

function of() {
    gnome-open "$@" > /dev/null 2>&1
}

而在.bashrc-windows这个工厂里,我们这样创建of

function of() {
     gnome-open "$@" > /dev/null 2>&1
}

在.bashrc里,我们这样决定要用哪个工厂:

if test `uname` = Linux; then
    factory=~/.bashrc-linux
else
    factory=~/.bashrc-windows
fi

然后,我们让工厂去创建我们想要的对象:

. $factory

哈哈,设计模式有何难哉!

设计模式123

July 20, 2010

今天重温了一下Desing Pattern (GOF)的前三种:Abstract Factory,Builder,Factory Method。

大意如下:

  1. 如果你需要处理不同的对象家族谱,用Abstract Factory。举例:你需 要创建三种对象,爸爸虚类,妈妈虚类,小二虚类,按照情况,实际创建的时候必 须用某种实类,如李家爸爸实类和张家爸爸实类。

    这里就可以定义一个工厂虚类了。针对两个家族,定义李家工厂实类和张家工厂实 类。工厂虚类里定义三个函数,分别是创建爸爸,创建妈妈,和创建小二。

  2. 如果需要一步一步地创建对象,用builder

  3. 如果需要由子类来创建对象,用factory method. 特别注意一下CreateFooBar 这样的函数,很有可能就是在使用factory method.

同时往多个博客上发帖子

July 15, 2010

呃,weblogger.el还支持这样的功能啊,真是太强悍了!

你可以上这两个地方看: csdn 或者live space

unmarkdown程序

July 14, 2010

用markdown来写博客无疑方便很多,不用太操心格式的问题。python有个库叫 python-html2text,这个可以用来做unmarkdown,但是不能直接调用这个库:

python /usr/share/pyshared/html2text.py

这样是不行的,会有根据终端大小进行断行。所以我们自己写一个封装,名字就叫unmarkdown:

#!/usr/bin/env python
import html2text, sys
data = sys.stdin.read().decode('utf8')
sys.stdout.write(html2text.html2text_file(data, None, '').encode('utf8'))

再在weblogger的hook里做一些设置,发表文章之前做一下markdown,编辑文章之前做一下unmarkdown,爽!

有一点要特别注意的是,code block不要放在一开始的位置。也就是说,不要一上来就贴代码,这样做会导致格式弄乱,python-html2text里可能是有一个bug。

用Eva在Linux下上QQ

July 12, 2010

比腾讯自己出的Linux版QQ不要强太多哦

腾讯太弱了

如何在Linux下使用我的配置文件

June 30, 2010

跑下面这个脚本:

cd ~ #必须把我的东西放在~/windows-config下   
git clone git://github.com/baohaojun/windows-config.git   
./windows-config/bin/after-co-ln-s.sh   
./windows-config/bin/linux/after-check-out.sh

最后跑完以后应该会出现OK的消息,如果没有出现应该就是出错了,需要自己查一下