今天总算收到了 Google Adsense 寄给我的 PIN 信封,距离它公元 2008 年 3 月 24 日给我的电子邮件通知正好两周。现在貌似 Google 改政策了,以前都是 Adsense 帐户赚到 $50 以上才会寄 PIN 的,现在仅仅 $10 以上就邮寄 PIN 了。我的 Google Adsense 帐户开了两个月零七天,才赚了 $14.09,唉,真慢啊,什么时候才能到 $100 呢?
分类: IT杂谈
solrex.cn 的新子域名
由于对某些服务感到新鲜,所以为我的域名添加了几个子域名:
1. http://m.solrex.cn 和 http://wap.solrex.cn
我的手机版博客,使用 WireNode 提供的服务,上面两个域名均重定向到 http://solrex.wirenode.mobi,我用自己的手机访问测试正常。
2. http://feed.solrex.cn 和 http://feeds.solrex.cn/solrex
将博客 FeedSky 和 FeedBurner 烧录绑定到了自己的域名,不影响原有的 feed 地址。
其中 http://feed.solrex.cn 是 FeedSky 提供的域名绑定服务,http://feeds.solrex.cn/solrex 是 FeedBurner 提供的 MyBrand 服务,这两个域名均为直接 CNAME 绑定。所以,FeedBurner 那个在国内仍然无法正常访问,不过可以通过阅读器订阅。
飞信充分表明了中国移动是一个闷骚的弱智
因为平时短信通信量很大,所以最近在尝试中国移动的飞信业务,然后发现了一些很有趣的事情。
1. 不允许下载飞信手机客户端到电脑。
在飞信的官方网站上,手机客户端只能用手机上网下载。(飞信给你发条包含 URL 的消息,你点击下载)
为什么用户不能在电脑上下载了然后自己安装到手机上呢?嘿嘿,就算只有几十K,GPRS 下载也是有钱赚的(0.01元/KB那也是将近一块钱那)!要是大家都在电脑上下了,中国移动不少赚了很多吗?
其实这是典型的中国移动拿用户当弱智耍的例子(当然,这也不是第一次了)。不过大家要明白一个道理,几乎所有 WAP 网站都是可以通过 WEB 访问的,那么移动给的链接自然可以用电脑下载的。拿我的 Samsung E908 来说,移动给的链接是:
http://nav.m161.com.cn/drops/clientdownload.aspx?category=j2me&vendor=sam&model=e908
在这里链接下载下来的是一个 Amigo_sam_e908.jad,和下载 JAVA 游戏时一样,.jad 文件其实只是一个文本文件,用文本编辑器打开后就能发现真正的 JAVA 程序 .jar 文件的下载地址是:
http://nav.m161.com.cn/drops/clientdownload.aspx?category=j2me&vendor=sam&model=e908_jar
在这个链接下载下来的是一个 Amigo_sam_e908.jar 文件,然后只需要把那个 .jad 文件中的 MIDlet-Jar-URL: 后面换成 .jar 文件的文件名 Amigo_sam_e908.jar,然后将两个文件传输到手机里,按照一般安装手机 JAVA 游戏的步骤安装即可。
2. 手机客户端的常用短语。
在用手机客户端发消息时,飞信内置了一些常用短语,下面大家来看看这些“常用”短语是什么:
1> 你好。
2> 有时间么?可以和你聊聊吗?
3> 你好,很高兴可以和你成为朋友。
4> 你多大了?是男生还是女生?
5> 你是用手机聊吗?
6> 为什么不说话?
7> 你的名字好特别,是什么意思呢?
8> 可以给我你的电话号码吗?
9> 回头再聊,我正开车呢?
10> 这么晚了,还不睡?
看完了这几条,我实在不明白它们有哪条能勉强算上“常用”!特别是第 5 条和第 8 条,用飞信自然能看到对方在线状态和对方手机号码,傻啊,还问?
嘿嘿,如果真的有某个人“常用”这几句话,我只能说你很“中国移动”了!
Google Talk 小徽章
无意间发现 Google 推出了一个新功能,Google Talk 小徽章,把一个 iframe 放到网站上,这样网站的访客就能直接通过点击这个小徽章里的链接匿名和发布者聊天,不需要 Google 帐户。
测试了一把,发现当状态标识为 "busy" 的时候,通过小徽章无法聊天;当状态标识为 "available" 时匿名访客才可以点击它来进行聊天。由于是匿名,聊天时发布者方显示的对方名字是 "Guest"。
Google Reader 的一点问题
Google Reader 是我非常喜欢的在线博客订阅器,自从发现这个服务之后我就结束了尝试 N 个离线博客订阅软件的历史。用 Google Reader 看别人的博客好像看邮件一样,而且可以抓取一些国内无法访问的国外博客系统的 feed,很方便。
自从使用以来它就一直很稳定,不过这两天我发现 GR 貌似出现了一些小问题:一个是抓取我的博客 feed 有错,订阅的 http://feeds.feedburner.com/solrex 的条目中忽然多出了十条和我同一服务器的某个博客条目,而 feedburner 的原始连接中并没有这十条内容;二是抓取 feed 的时候没有通知订阅用户数,所以我的 feedburner 和 feedsky 显示的订阅用户一下子少了一大半,本来就只有一百多人订阅,现在显示的订阅数就更可怜了。
本来我以为这可能是个别问题,可是著名博客和菜头也在文章中说某些用户的订阅在 GR 中显示为乱码。这就叫人奇怪了,为什么 GR 在这几天发生那么多问题?难道是 GR 在测试新功能?
虽然 GR 这两天出了那么多问题,我仍然要推荐它,下面简单介绍一下我觉得比较好的特色:
1. 共享阅读。一种方法是把共享阅读块放在自己的主页上(看我的博客右侧栏),另一种是在 GR 的阅读视图里与 Google 好友共享阅读条目,还有一种方法就是把条目直接 email 给别人。
2. 快捷键操作。GR 有很多键盘快捷键,比如:j 阅读下一条,k 阅读上一条,n 移到下一条,p 移到上一条,o 打开列表项,这样操作起来非常方便。
3. 使用安全连接(https)的 GR,避免连接被重置。在中国国内某些网络条件下,明文传输的网页是会被过滤的,如果订阅的博客文章中有敏感词条,路由器就会重置网络连接,比如经常看到的浏览器提示“与服务器的连接被重置”就是由于这个原因。使用安全连接的 GR https://www.google.com/reader/view/ 能避免此类状况的发生。(此方法同样适用于 Gmail 的连接不稳定现象)
4. feed 阅读趋势。GR 可以统计你的阅读情况,并提供一些阅读趋势排行榜,以供你了解自己的阅读习惯。
Twiki 语法快速指南
最后更新时间:2008年01月14日01点00分
摘要:
这份文档主要给出了一些常用的 TWiki 文章编辑方法。TWiki 是一个广泛使用的开源 wiki 系统,通常被企业和组织用户用来共享知识等。更多介绍请看它的官方站点:http://twiki.org 。
这只是作者的一份编程笔记,其实与网上早期版本的 TWiki 文档中文翻译有些重复,需要更多内容请查看参考文章和链接。
目录
1. 基本语法
1.1 话题
1.2 标题和段落
1.3 字体
1.4 列表
1.4.1 无序号列表
1.4.2 带序号列表
1.5 表格
1.6 链接
1.6.1 词条链接
1.6.2 外部链接
1.6.3 页面内锚点
1.6.4 图片和附件链接
1.7
图标
2. 页面编辑技巧
3. 参考文章和链接
1. 基本语法
[1.1 话题]
Wiki 的精神就是用词条描述世界,所以 TWiki 也是这样,它内部对内容的管理是用一个一个 WikiWord 来分类的。WikiWord 就是像前面这种两个单词构成的连接在一起的词组,里面大小写交错。
TWiki 的话题(topic)推荐用 WikiWord 来建立,如果用户输入的新话题不是一个 WikiWord,那么建立新话题的按钮就不会被激活。但是 TWiki 允许用户使用非 WikiWord 建立词条,需要手动勾选上允许使用非 WikiWord 建立话题。
[1.2 标题和段落]
1.2.1 标题
TWiki 中可以使用分级标题,分级标题的语法如下:
---+
---++
即在行首三个"-"和一个"+"代表一级标题,三个"-"和两个"+"代表二级标题,以此类推。当用户使用规范的标题记号建立好话题之后,可以很方便地使用"%TOC%"标记建立一个标题目录。如果用户不想某个标题被包含,只需要在标记标记后加上两个感叹号"!!",比如:
---+!! 目录
%TOC%
这样目录这个标题就不会包含在自动建立的目录里。
1.2.2 段落
TWiki 的段落分隔和 LaTeX 有点儿类似,段落之间需要空一行。如果想输入不被 TWiki 格式化的原始文字(比如源程序等),需要用标签将这些段落包起来,主要有以下两种标签:
<verbatim></verbatim>
<pre></pre>
区别是 <verbatim></verbatim> 中间的代码以完全原始方式显示,<pre></pre> 中某些 HTML 标签依然起作用。
[1.3 字体和分隔线]
1.3.1 字体
TWiki 使用字体的方式比较像 HTML 的标签,就是在字符串两头加上某些标记。比如:
*Bold Font* 粗体
_Italic Font_ 斜体
__Bold Italic__ 粗斜体
=Fixed Font= 等宽字符
==Bold Fixed Font== 等宽粗体字符
最最需要注意的一点是:这些标记"*_="必须内侧与文字相连,外侧为空格,标记之间也不得有空格。
1.3.2 分割线
TWiki 的分割线是在行首输入连续的多于三个的减号"-",例如
----
[1.4 列表]
1.4.1 无序号列表
无序号列表的格式是:
*
*
即三个空格加"*"所进一层,六个空格加"*"缩进第二层,以此类推。
1.4.2 带序号列表
带序号列表的格式是:
1.
1.
即三个空格加"1"所进一层,六个空格加"1"缩进第二层,以此类推。注意,这里的"1"代表用阿拉伯数字编号列表,其它编号方式有"A"或"a"大小写字母标号,"I"或"i"大小写罗马字母编号。
注意:这里后面的小数点可要可不要,可以一直使用"1"编号,也可用"1,2,3"递增编号,效果无区别。
[1.5 表格]
表格的建立是用竖线"|"分隔,比如:
|T1|T2|T3|
|A1|A2|A3|
就建立了一个两行三列的列表。单元格内部的左右对齐是利用和竖线的距离实现的。
[1.6 链接]
1.6.1 词条链接
如果是规范的多词 WikiWord 话题,可以使用双方括号直接括起来,例如:[[my wiki topic]]就会直接引用 MyWikiTopic 词条;如果是非规范话题,或者引用说明和引用话题不一样,需要使用引用与说明分开的格式,例如:[[MyWikiTopic][my WIKI topic]]。
1.6.2 外部链接
外部链接可以直接使用类似与词条链接的方式来引用,例如:[[
http://blog.solrex.org][Solrex 的博客]] 。
1.6.3 页面内锚点
在页面内可以定义锚点,这样可以使用链接在页面内跳来跳去。定义锚点的方法是在行首使用 #WikiWord,例如:
#FootNote Footnote is....
就定义了一个到该段的锚点。引用锚点和词条链接的方式也类似,例如:[[#FootNote][to footnote]]。如果引用别的页面的锚点,只需要在锚点前面加上该页面的话题名,例如:[[MyWikiTopic#FootNote][to another footnote]]。
1.6.4 图片和附件链接
如果引用在同一页面的附件或者图片(其实一般图片也是附件),链接的格式为:%ATTACHURL%/filename.extesion,比如:%ATTACHURL%/about.pdf;引用在不同页面的链接,需要在文件名前面加上该页面主题的名字,比如:%PUBURL%/%WEB%/MyWikiTopic/about.pdf
[1.7 图标]
TWiki 预定义了很多图标,直接在文中就可以使用,比如帮助的小 i 图标是:%H%,update 的图标是:%U%,new 的图标是:%N%。合理使用这些图标能增强文章的可读性。
2. 页面编辑技巧
[1] 建立话题时合理分级,有规律地规划父话题和子话题关系。
[2] 处理重复话题时使用 %INCLUDE{"XXX"}% 来包含已有的话题,比如我已经有了 PersonalComputer 话题,在建立 PC 话题时候,就应该直接在页面中使用 %INCLUDE{"PersonalComputer"}% 来避免冗余。
[3] 使用%TOC%自动创建目录:当编辑一篇比较长的文章时,建议使用标题标记建立分级标题,最后使用 %TOC% 在上方建立一个可索引目录。
[4] 合理使用字体和图标增加可读性。
[5] 合理使用 HTML 代码来加强页面排版功能。TWiki 可以直接支持 HTML 代码,为了格式的统一,一般不建议直接使用 HTML。但有些页面排版过于复杂,使用 HTML 可以直接达到要求。
[6] 使用注释的技巧:TWiki 没有装 footnote 插件时候是不支持注释链接的,但是可以通过一些技巧来实现。我们可以先在注释或者引用列表前建立一个锚点:
#FootNote
---+ Footnotes
1 aaa
1 bbb
当文中内容需要注释时,使用 HTML 和 TWiki 链接一起加一个上脚标:aaa<sup>[[[#FootNote][1]]]</sup>,这样 aaa 的右上角就可以出现一个方括号,里面是带到脚注链接的脚注编号 "1"。
3. 参考文章和链接
[1] 早期版本 TWiki 语法格式的中文翻译:
http://www.stlchina.org/twiki/bin/view.pl/TWiki/TextFormattingRules
[2] TWiki 官方语法文档:
http://twiki.org/cgi-bin/view/TWiki/TextFormattingRules
:tag: Wiki,TWiki
Cool IPv6
中科院通了 IPv6 试验网,现在我们可以用 IPv6 网络看免费的高速网络电视,将近四十个台。还可以用 IPv6 打免费电话,固定电话有点儿杂音,效果还不错,手机貌似不好打。最重要的是,连流量费都不算,哈哈!!!
希望免费的午餐持续时间越长越好!*_*
生日倒计时
最近没什么写字的欲望,上上课,上上班,看看书,晚上回去和女友视频一会儿,日子过得挺轻松自在的。唯一比较痛苦的是考试的临近,已经定下十二月有四门课考试,不过,早考早超生 :-)。
由于 yo2 在调整服务器(鬼知道在怎么调整),我的 WordPress 博客间歇性地抽风,要么完全访问不了,要么从 500 到 504 的错误轮着来,没办法只能耐心地多刷新几次。今天更好,貌似 css 样式单没了,侧栏直接挂中心栏上了,快点调整完吧!
昨天心血来潮想给女友做个生日倒计时,Google 搜一下没找到合适的,不过一想用 Javascript 应该很简单,就自己写了一个,放到了我的 WordPress 博客侧栏最下方。下面是源代码,可以插入到支持 Javascript 的博客侧栏中,比如 Blogspot 或者自己用开源 WordPress 建的博客。
<div id="counter" style="padding: 5px 0px 0px 0px; background:
url(图片地址) no-repeat scroll 0%; width: 200px; height: 130px; text-align: center; font-family: Georgia;
font-size: 14px; font-weight: normal;">
<a href="http://blog.solrex.org/articles/birthday-counter.html" style="color: #FF6600;">
<script type="text/javascript">
var today = new Date();
var birthday = new Date(today.getFullYear(), 生日月份-1, 生日日期);
var diff = birthday - today;
var greeting = "距离 某人 生日还有";
if (diff <= 0 && diff >= -86400000){
greeting = "今天是 某人 的生日!<br />祝 某人 生日快乐!";
} else {
if (diff < 0) {
birthday = new Date(today.getFullYear()+1, 生日月份-1, 生日日期);
diff = birthday - today;
}
greeting += Math.ceil(diff/86400000);
greeting += "天";
}
document.write(greeting);
</script></a></div>
其实代码很简单,而且 Javascript 使用用户计算资源,不用加重服务器负担。唉,本来还想使用 Javascript 调整一下 div 的 css 样式可以支持每个月更换图片呢,只是好久没写过 web 程序了,老做不对,又没有个顺手的 JS 调试器,只好作罢 :-)。
PS: 今天买了一个据说是工包的森海塞尔 MX500 耳机,35RMB还送卷线盒,买过来后对着网上的的辨别真伪教程对比了半天(除了没拆开),分辨不出来真假。听了一下,就我这样的耳朵,居然觉得比 M6 带的据魅族官方说质量相当于MX500 的 PT850 声音效果还要好,中国人造假的能力真彪悍。
魅族 PT850 的设计是绝对有问题的:一是白色的耳机线不够柔软,弹性太好,黑色的稍微好些;二是耳机插头的根部内导线太容易断了,网上 n 多人抱怨,据说是魅族为了促销它的配件故意做成这样的。我第一根 PT850 只用了两个月,现在用的这根只好专门用胶带把插头根部缠上,不然估计里面也早断了;三是佩戴很不舒适,尤其是我这种耳朵眼小的,虽然看起来很好看。
邮件签名的重要性
首先,非常感谢 Eric You Xu 师兄在博客里推荐我的博客,但嵌入式开发高手不敢当,我只能说在 GDB 的移植和远程调试方面有比较多的经验,离高手还有很大距离(不是谦虚,我一直想成为那种无论在哪儿都能独挡一面的程序员,努力中 ^_^)。
下面我开始发牢骚:
有一个人,中国某家公司的员工,大概也从事 GDB 的移植,前段时间一直问我有关 GDB 移植方面的问题,我也一直非常耐心的回答他。但是,但是,搞得我非常非常不爽,条缕如下:
1. 刚开始通过 Gtalk 与我联系,在我的状态为 busy 时给我发消息,而我工作时总是使用全屏的远程桌面,自然看不到消息。
2. 问我问题前不知道自我介绍一番,在我强调更喜欢邮件联系时仍给我发送 Gtalk 消息。
3. 由于对方没有自我介绍,我委婉地劝他最好使用公司信箱跟我联系,他说公司信箱不准向外发信,但你邮件总得有个签名吧,连签名都没有。
4. 在我使用公司信箱和他联系后,仍然发送工作邮件到我的私人信箱中,谁想在私人信箱中看到工作上的联系啊?
5. 后来总算有了签名,却是英文名,但没有公司信息,没有个人联系方式;我给他签名叫做 Wenbo,他抬头仍然使用 Hi Yang。
6. 最后我回答了他很多问题,忍无可忍了,因为谁也不希望帮助的人是自己的竞争对手,就算是义务劳动,也得搞清楚对方是谁吧。请他告诉我他的中文名字和公司,并且开玩笑说说不定哪天我可以到他们那里找工作呢。结果呢,就没有回应了。我猜,难道是怕我抢他的饭碗?太荒谬了吧。
其实我最不爽的就是他没有自我介绍,因为我觉得这是提问时,尤其是一对一提问时候起码的礼貌,唉!
所以我真的很希望大家都能看看 How To Ask Questions The Smart Way,晓得怎么做才是礼貌的问问题的方法。为别人也为自己,想想要是自己碰到这样的情况会有什么感觉。
至于自我介绍其实也不一定需要,只要养成在邮件中附加自己联系方式签名的习惯,像下面这样:
--
Wenbo Yang
SimpLight Nanoelectronics Ltd. 6 Zhichun Road, 10th Floor, Beijing, China
Phone: +86-10-5126-6989 --- Email: wenbo.yang@simplnano.com
一是方便别人,从邮件签名就能了解你的基本情况;二是方便自己,省得专门的自我介绍;三是宣传自己和宣传公司,不相信你 Google 一下 "Wenbo Yang" 和 "simplnano"。有这么多好处,为什么不使用呢?
又回到北京了
好些天没有更新博客了(针对我的更新频率而言),原因很简单,有更重要的事情去做 :-)。
1 号到的北京,把寄放在同学那里的被子拖到租住的公寓,请邓飞、丽君吃了顿饭。2 号到公司报到,换了个办公桌,换了个电话。寄来的包裹和录取通知书同时到达,纳闷不已,为什么北京往南京挂号需要七天而南京挂号到北京只需要三天?害得我为了一张纸折腾(中科院的录取通知书着实简陋,信封是牛皮小信封,通知书就是一张请柬大小)。我原以为是通知书的那玩意儿是入学须知,但搞不明白的是,为什么入学须知要寄给我两次?
一毕业,这同学们好久不更新的博客都重新拾起来了,反而显得我有点儿懒。这下到公司工作,晚上的时间就多了些,可能又要恢复我正常的更新速度了。
这两天工作也没干什么事,FPGA 调试还不太熟练,模拟器又改了不少,而且更新中工作不太正常,所以就随便看看代码、看看邮件列表和一些 patch。GDB 的 mailing list 里这两天挺有意思的,有个人发了一个希望把 GDB 代码用 C++ 重写的邮件,然后一群大佬说这个问题别讨论了,各持己见讨论起来会没个头的。但是某个邮件里有巨牛的一句话:“The more C++ code I see, the more convinced I get that the language should die. ”让我叹服不已,哈哈。
重装了一个 Ubuntu,当然也装上了 beryl,比原来用着更方便了。Google desktop for linux 推出了,试用了一下,挺好的,特别喜欢它的两下 ctrl 就可以弹出搜索框,这样就免得我还得用鼠标把光标定位在 Google toolbar 里去。Google desktop 的 sidebar 没有在 Linux 版本上体现出来比较遗憾,那些小工具很有意思,但其实 Linux 本身就带有很多有一些的小玩意儿,喜欢玩的能把桌面配置得很 cool 或者 cute。为 Firefox 装了一个 IE7 的主题,看起来还是蛮好的,看来 Microsoft 的 UI 工程师也不是吃干饭的。但是 wine 现在还不支持 IE7,用 ies4linux 测试版装上之后,IE7 的 UI 效果一点儿也没有,真没劲。
毕业了,大家都在干不同的事,还有人(XHO)感叹没假期了,哈哈,准备成家立业的时候已经开始了,慢慢就该习惯了。
开始使用 WordPress
先引用一段著名的对话:
A: 你有博客吗?
B: 有。
A: 你介意换一个 BSP(Blog Service Provider) 吗?
B: 介意。
A: 你介意多一个 BSP 吗?
B: ......
总之呢,就是想说,在和菜头的竭力推荐下,在 GFW 的竭力阻拦下,在 Live Space 的竭力变慢下,我又在 yo2.cn 申请了一个博客。至于 yo2.cn 有什么好,请访问 http://www.hecaitou.net ,翻翻以前的文章,你就可以大致了解了。
现在算是把域名 blog.solrex.cn 绑定到了 yo2.cn 的博客上了,不是原来的域名转向,是绑定,就是所有文章什么的都可以用这个域名访问。据说这项服务以后要收费,其实收费没什么,自己申请一个空间一年还得好几百呢,还得自己配置 WP(WordPress),我也是因为懒得配置才不愿意找这个麻烦。最关键的是服务,QoS,我可不再希望自己花费了很多心血在上面的博客说被封就被封了,而且还不是我的责任,是 BSP 没有做好公关。这两年 livespace 和 blogspot 经常性的出问题已经很讨厌了,希望 yo2.cn 这个国内的博客服务商在这方面能做好一些。稍微慢一点儿没关系,发文章麻烦一点儿没关系,但别不能访问。
WP 挺好的,用起来很舒服,而且可以有很多自由度。我还把以前所有的文章都迁移到了现在的站点上,加起来有两百七十多篇吧。哈哈,两年,看来写的不少。
如果 yo2.cn 能保持现在这种服务,年费我愿意交。本想等用一段稳定了再重烧 feedburner,但昨天还是忍不住重烧了一下,所以可能使用 feedburner 订阅我的博客的就看到了今天有很多旧的更新 :)。不过这下再从 feed 中点进去到网站就不是 live space 了,留言也不用登录了,可惜的是,feedburner 教育网还是无法访问。唉,为什么在中国上个网就那么难呢?
最后重申一下,欢迎访问新博客。Live Space 和 Blogspot 仍然保持同步更新,没办法啊,我对中国小网站的风险抵抗能力还是持怀疑态度的。如果 yo2.cn 能保持一年不频繁停机、不被封站、并保持服务质量,我就放弃那两个博客。
Google 街景
Google Maps 推出了 Street View,就是在查询地点的时候,可以查看一条街的照片,然后一路走下去。感觉真是太震撼了,这样可以足不出户就把某些地方旅游一遍。不过可惜的是,Google Maps 并不支持中国市场而 Google Ditu 并不提供本类服务。
唉,最近被毕业的事情弄的好烦,老是碰上些没谱的人,做事情出力不讨好。算了算了,不说了,都是同学。
函数调用栈和栈帧
在计算机科学中,Callstack 是指存放某个程序的正在运行的函数的信息的栈。Call stack 由 stack frames 组成,每个 stack frame 对应于一个未完成运行的函数。
在当今流行的计算机体系架构中,大部分计算机的参数传递,局部变量的分配和释放都是通过操纵程序栈来实现的。栈用来传递函数参数,存储返回值信息,保存寄存器以供恢复调用前处理机状态。每次调用一个函数,都要为该次调用的函数实例分配栈空间。为单个函数分配的那部分栈空间就叫做 stack frame,也就是说,stack frame 这个说法主要是为了描述函数调用关系的。
Stack frame 组织方式的重要性和作用体现在两个方面:第一,它使调用者和被调用者达成某种约定。这个约定定义了函数调用时函数参数的传递方式,函数返回值的返回方式,寄存器如何在调用者和被调用者之间进行共享;第二,它定义了被调用者如何使用它自己的 stack frame 来完成局部变量的存储和使用。
|------------------|<--high address
| ...... | Previous
| ...... | frames
|------------------|<-----------
| registers and |
| local variables |
|------------------| Caller's
| argument 6 |
| argument 5 | frame
| argument 4 |
| argument 3 |
| argument 2 |
| argument 1 |
|------------------|<--previous sp
| return address |(n-4)sp
|------------------|(n-8)sp
| saved registers |
| ...... | Current
|------------------| frame
| local variables |(Callee's
| ...... | frame )
|------------------|
| next calling |
| arguments list |
|------------------|<--sp
| ...... |
|__________________|<--low address
图片链接:http://solrex.googlepages.com/frame.jpg
上图描述的是一种典型的(MIPS O32)嵌入式芯片的 stack frame 组织方式。在这张图中,计算机的栈空间采用的是向下增长的方式,SP(stack pointer) 就是当前函数的栈指针,它指向的是栈底的位置。Current Frame 所示即为当前函数(被调用者)的 frame ,Caller’s Frame 是当前函数的调用者的 frame 。每个 frame 中所存放的内容和存放顺序,则由目标体系架构的调用约定(calling convention)定义。如图所示,MIPS O32调用约定规定了所占空间不大于4 个字节的参数应该放在从 $4到 $8 的寄存器中,剩下的参数应该依次放到调用者 stack frame 的参数域中,并且在参数域中需要为前四个参数保留栈空间;如果被调用者需要使用 $16 到 $23 这些保留寄存器(saved register),就必须先将这些保留寄存器的值保存在被调用者 stack frame 的保留寄存器域中,当被调用者返回时恢复这些寄存器值;当被调用者不是叶子函数时,即被调用者中存在对其它函数的调用,需要将 RA(return address) 寄存器 ($31) 值保存到被调用者 stack frame 的返回值域中;被调用者所需要使用的局部变量,应保存在被调用者 stack frame 的本地变量域中。
在没有 BP(base pointer) 寄存器的目标架构中,进入一个函数时需要将当前栈指针向下移动 n 字节,这个大小为 n 字节的存储空间就是此函数的 stack frame 的存储区域。此后栈指针便不再移动,只能在函数返回时再将栈指针加上这个偏移量恢复栈现场。由于不能随便移动栈指针,所以寄存器压栈和出栈都必须指定偏移量,这与 x86 架构的计算机对栈的使用方式有着明显的不同。
在 RISC 计算机中主要参与计算的是寄存器,saved registers 就是指在进入一个函数后,如果某个保存原函数信息的寄存器会在当前函数中被使用,就应该将此寄存器保存到堆栈上,当函数返回时恢复此寄存器值。而且由于 RISC 计算机大部分采用定长指令或者定变长指令,一般指令长度不会超过32个位。而现代计算机的内存地址范围已经扩展到 32 位,这样在一条指令里就不足以包含有效的内存地址,所以RISC计算机一般借助于一个返回地址寄存器 RA(return address) 来实现函数的返回。几乎在每个函数调用中都会使用到这个寄存器,所以在很多情况下 RA 寄存器会被保存在堆栈上以避免被后面的函数调用修改,当函数需要返回时,从堆栈上取回 RA 然后跳转。移动 SP 和保存寄存器的动作一般处在函数的开头,叫做 function prologue;恢复这些寄存器状态的动作一般放在函数的最后,叫做 function epilogue。
Life Pieces
忍了几天,又想写点东西了。论文初稿已近完成,这些天倒也充实,白天工作,晚上写论文。只是因为公司在装修一个硬件实验室,好几天吵吵地不行,不然大概已经完成,也不必为食言而发愁了。
刚看了一个新闻,什么 Google 又出拼音输入法,还为词库和什么狗纠缠不清。只可惜常用 Linux 系统,那个 EXE 在我电脑上也没甚用处。其实我对输入法要求相当低,只要能支持智能 ABC 的双拼规则,我就愿意使用。以前发现过一个紫光可以自定义双拼规则的,我把回忆到的智能 ABC 的所有双拼对应的键填进去,费了老半天劲了,结果发现紫光会让我的系统崩溃着玩,立马放弃了。自从用过了 Scim,在 Linux 下我再也不会选择别的输入法了。为什么呢?就因为 Scim 可以选择很多种双拼方案,而且非常友好地支持了智能 ABC 的双拼。从实践上来说,我甚至认为 Scim 比智能 ABC 做的还要好,因为它的词频记忆绝对比智能 ABC 的更智能。当然了,和王三表同志所弘扬的黑马输入法没法比,但是黑马支持智能 ABC 的双拼吗?如果黑马支持,我立马就去买套用。其实对于习惯于词输入的人来说,整句的词库并没多大意义,不过,说不定我会改变一下这个习惯。我很期待 Windows 的 Scim,但如果 Google 的输入法能像 Scim 一样,我也会把自己在 Win 下的首选改为它。其实选择输入法可不像葛优选手机一样,哪家人多选哪家,而是哪家符合自己习惯和需要就用哪家。从 N 年前养成的输入习惯到了现在,改起来有那么容易吗?
还是一个软件的问题。偶然看到孙燕姿又出了新专辑,心中痒痒地慌,又偶然看到心仪很久的魅族 M6 降价,心中又痒了一下,几痒几不痒就让我到村里搞了一台 4G 的,看着爱不释手啊。咱的耳朵不是金耳朵,硬件好不好也听不出来,不过我算是充分地认识到了魅族软件的垃圾,那是相当的垃圾啊!!!不知道魅族软件工程师是怎么想的,一插到 USB 上就屏蔽掉所有的按键,也只能怪我一直无所谓于所谓的"安全删除硬件"。直接把线从电脑上拔下来,然后发现所有按键依然被屏蔽,屏幕上依然显示"USB 连接中",NND 直到电耗完。怎一个变态逻辑了得???要不是咱想支持国产,而 iPod 又不支持 FM,我真后悔没买个 Nano,水 2G 才 900 。
又是一个软件的问题,不过是和软件工程师有关的问题(咳咳,我的意思是程序员)。天宝兄弟两天前在博客上发泄了一通,http://www.liongg.net/?p=104 ,大肆宣扬对某个国内知名 GIS 公司对待实习生方式的不满,一肚子苦水啊。看过一本书,好像叫什么 Extreme Programming xxxx ,里面谈到了如何能让团队成员高效率地开发程序,如何让团队成员有满足感。想想我能进现在的公司很幸运啊,虽然公司不大,但做的事情很厉害,员工也全都是精英,而且工作的氛围相当的好。怎么说呢,能有一种被别人重视的和需要感觉真的能让工作起来开心许多。我也和很多在北京工作的程序员交流过,能够有我现在这样的工作环境的还没有遇见过,尤其是在上地中关村产业园的那些小公司,我基本没留下什么好印象。所有的都是 N 多人坐一排,不准上网,不准做和程序无关的事,电脑没有光驱,USB 口被封掉,N 多人一个电话,天天加班没有加班费,工资很低,总之就是把员工当贼看待,当民工使唤。不知道像 Google 这样的公司是不是真如宣传中那样,反正微软和 IBM 除了有钱也不是什么太好的地方。唉,找到一个适合自己的公司也不易。反正啊,我在这也干的不错,也打算毕业以后马上来公司继续做事。经理昨天还问我,毕业以后什么打算啊?我说,毕业以后还想过来干,反正在家也没什么事做。经理说,好,等你毕业过来我们就不把你当 intern 了,当我们的正式员工对待。我就在琢磨,难道是在暗示我再来会加薪,那敢情好!^_^
不罗嗦了,赶紧把论文整完。
SVN you should know
SVN 是 Subversion 的缩写,一个开源的版本管理工具,类似于 CVS 和 Visual Studio 的 Source Safe。不过据它的作者称是因为忍受不了 CVS 的缺点所写的,可能会比 CVS 表现好一点,因为我只有在 check out 某些开源代码时候才会用到 CVS,并不经常,所以只是猜测。不过肯定是比 Source Safe 表现要好,因为两者的理念是不同的,Visual Source Safe 管理小型项目还可以,是不适合管理多用户的大项目的,再说,Source Safe 也只能在 VS 里面用,而 SVN 的客户端有 Linux 和 Window 的版本。顺便提一下的是,WIN 下有种最流行的 SVN 客户端就是集成在右键菜单的一个小乌龟,很有意思的。
SVN 有非常好的使用文档,相比其它的开源项目来说,SVN 的中文化也做的很好,有专门的中文站,可以搜一下。SVN book 介绍的相当全面,但是,读完那么长的文档也没有必要。我这里就介绍一些常用且是最常用到的命令(Linux 下,Win 下就不说了,都是 GUI 操作)。
建立版本库:svnadmin create /data/svnpool
这是指定版本库存放的位置,貌似必须是一个绝对路径,建立好以后里面会建立起一些配置和数据库的文件。
指定编辑器:export EDITOR=vim
因为每次的版本操作都要添加一些信息在 log 里,把 EDITOR 放在环境变量里可以使用自己熟悉的编辑器来编辑这些信息。这句话经常放在 .bashrc 里。
导入项目:svn import file:///data/svnpool
在当前目录下的所有目录和文件都会导入到版本库里。
列表查询:svn list file:///data/svnpool
一般情况下都要先查询一下某个目录存在不存在才去导出。
导出项目:svn co file:///data/svnpool/project
这时候会在当前目录下建立一个 project 的目录,里面存有 SVN 的信息。
更新项目:svn update
使当前目录下的所有文件和目录版本与版本库中保持一致。
查看不同:svn diff
查看当前目录下的所有文件和目录与版本库中有那些不同,也可以加上版本参数 -r revision1:revision2 查看两个版本有什么不同。
添加文件和目录到当前项目:svn add subdir/file
把当前目录下的 subdir/file 添加到当前目录对应的项目中去。
删除、移动或复制当前项目中的目录和文件: svn rm/mv/cp ...
把某个文件或目录更改名字、复制或从版本库中删除。
提交更改:svn commit
把更改后的文件提交到版本库中形成新的版本。
在初始导出和导入的时候,可能需要给出 URL,主要有几种格式,file:///, http://, svn://, svn+ssh://user@host。当项目已经导出时候,就不需要打路径名了,有可能需要密码,如果验证的话。
这些是最常用的命令,像其它的一些命令,比如 merge 之类的,用到时候再查 svn book 和 man page 也不晚。版本控制很有用的,比如自己平常写的代码,放到版本库里就比较好查询和撤销修改,而不用每次都保存个备份。而且增量修改时当代码发生错误时候可以很快定位更改在哪里,找到错误原因。其实所有文档都可以放在 SVN 库里的,只是某些文件类型不好做 diff 罢了。
Thesis And Others
(之所以在标题总包括英文,是因为我不喜欢 blogspot 把我的日志链接变成 blog-post_nn.html。)
最近写字很痛苦,像是强迫症一样,不想写,但养成的习惯又觉得不写少点什么,还是记下点东西好些。主要的原因是没有静心的时间和空闲,上班,下班,有时候周末也会来公司做些事,大概是无聊吧。本身也不是很喜欢闹腾的场景,在学校时候还有一群哥们在一起扯,现在基本无语了。除了工作的交流,一天没多少话,对于我这种话多的人,实在是一种痛苦。
论文算有眉目了,本来因为觉得 GDB 移植和数学没什么相关,而研究生读网络安全,想做一些密码学的东西,但吴老师说,既然做了很多工作,也比较深入了,就写 GDB 的移植和原理吧。后来在网上搜到一个上交大的计算机硕士发在国内一个叫《计算机工程》杂志的论文,讲的是 AS 的移植,人家硕士还发这种论文,我本科论文写个 GDB 移植看来也不是很掉价。工作已经完成了,而且完全是我自己做的,写下来基本没什么难度,我还顺便尝试一下用 SVN 来维护论文的版本,tex 文件也是文本,除了中文编码问题,和程序文件也没什么区别。
最近也比较忙,公司的两种芯片都是 Multi-Core 的 RISC CPU,老板一直想要一个支持多核的调试器,但是现在很多对多核的调试机理都是多个调试器对应多个核。我本来想用一种cheat的方法来实现专注于单核但可切换多核的功能,就是在 GDB 的角度来看是单核的,但实际上可以运行时切换到另外的核上。这个工作量应该不大,但这样会有一些问题,比如 break point 只能实现在一个核上。项目经理想得非常好,他希望 GDB 能 load 多套 symbol fie,而且能同时控制多个核。谈何容易啊,要能做那帮 GNU 的 MAINTAINER 们早就做了,有很多 mail 讨论这个问题的,但一直没有一个有效的机制来描述多核,因为多核的情况太复杂了,有各种各样的实现方式。不过具体到某种体系结构来说,并不是不可能实现的,IBM 的一个工程师就说他们实现了 SPU 和 PPC 的双核调试。GDB 是不可能根据某种特定情形修改自己的,它必须到有一种数据结构描述能够兼容大部分多核 CPU 时候才会更改自己现有的架构。我不知道这个 hacking 的工作我能不能做到,但恐怕在回学校前是做不完的了,只有等读研究生时候来北京再接着做了。现在正在疯狂地读代码中,移植的时候只需要考虑 back-end 的东西,像 symbol, breakpoint 啦根本不用管,这会儿也得看了。
也有一件很不爽的事,看到一个人在博客里理直气壮地说自己从来不给应聘者回拒绝信,而且还非常鄙视应届生。唉,还是 JavaEye 的资深会员,以前 JavaEye 的资深会员在我心中是多崇高的地位啊,现在看来某些人也就 just so so。而且他在 JavaEye 的博客上的评论基本上一片赞成声调,我不知道是不是我错了,难道出于礼貌回一封格式固定的拒绝信就那么难吗?难道非得让应聘者享受等待的痛苦就那么让人开心吗?JavaEye 上基本上都是大老,这些大老们都会这么看待问题,那么中国的公司做不过别人也是可想而知了。其实从我的应聘实习生经历来看,虽然不多,但是大公司都会给拒信的,我收过 Unilever 的拒信,Google 的拒信,Microsoft 的拒信。小公司也有几个,不过小公司给拒信的真不多,我记得只有一家做 Java 报表的公司给过拒信。没收到拒信真的没什么,我会以为公司 HR 比较忙,或者邮件服务器有问题,或者其它种种问题,但是如果我知道一家公司的 HR 理直气壮地说我就懒得给你拒信,我真的是对这家公司很反感。三十年河东,三十年河西,公司和 HR 把自己当爷,总有一天会有人让你们自己拿自己当孙子的。一个人能力有问题没什么,但做人有问题就会让人厌恶了。
顺便再说一个趣事,我也当了回神童!公司的一个同事那天和我聊天,问我硕士论文什么题目,我就纳闷了,我是本科啊。结果知道他一直以为我是硕士,还告诉他同学,我们公司有一个20岁就硕士毕业的实习生,笑死我了。
貌似 Picasa 也防盗链
才发现把 picasa Web 相册中的 image location 放在 blogspot 是看得到的,在 spaces 里是看不到的,在百合也是看不到的,除非你在浏览器中打开过这些图片,浏览器中有缓存才可以看到。看来 google 也并不想别人分享它的流量,不过比百度好一点的是只是不显示图片而已,没有再给显示出来一个大叉,上面写着"这是百度的",NND。我不知道是不是我的环境问题,如果真的 picasa web album 有防盗链措施的话,我只有舍弃它了。不知道别的相册怎么样,已经注册了个 flickr,没时间用,有空再说吧。
在 space 上看不了图片的可以暂时先访问相册:http://picasaweb.google.com/solrex/RandomBeijingImage ,或者到 blogspot 的博客。
RSS List Sharing Movement @ Rainy Day
北京不可多得的好天气,蒙蒙细雨,三个月来第一次见到
本打算找个公园转转,早起的小雨打乱了我的计划
去北航里的工行给小黑打完我的奖学金税,便又踱步到公司了
灯都没开,一个人都没有,似乎没人愿意在雨天里到公司加班
摁亮显示器,进入 SUSE,检查一下 Kmail,仿佛又无所事事了
打开 Firefox,又开始我的程式之旅:
lilybbs, blogspot, WLM space, google reader
今天忽然想到,许多未订阅的朋友的 blog 好久不曾逛了
于是乎,从 link list 中一个一个点入
然后一个一个加到 google reader 的 rss list 中
我的 link list 一直在加长, rss item 也在增加
有个冲动,想发起一个 share rss list 的运动
让大家把订阅的 blog 列表用XML或OPML文件格式共享出来
不过那样会泄露很多隐私的
当然了,可以有选择的共享
不知道有没有人欢迎?
脱离了 windows 系统之后,msn 上的小星星也看不到了
只能通过 rss reader 刷刷刷
加之也离开了南京
所以 google reader 就成了看别人生活的窗口
进入大四以后,几乎所有人的博客更新都放缓甚至停止了
互相之间的访问也少了
我又换了 BSP
也不知道有多少人会看到这篇 blog
我把我的 RSS 订阅列表 opml 文件放到了博客主页面右侧的最下
链接名为:Solrex is reading...
我会不定期的更新这个文件
你可以查看我正在阅读哪些人的博客,并把它加到你的阅读列表中
也可以把这个文件导入到你的阅读器中然后做取舍
如果你愿意参加这个运动,可以采用同样的方式
也可以把我的共享链接加到你的页面上
如果不知道如何上载文件,也可以放在博客文章里
总之,Hope everyone enjoy your reading!
Yodao Blogender
Yodao Blogender
有道又推出一件有意思的服务:博客男女,借此测了一下我的三个博客。
1.http://mu-er.spaces.live.com
Google Fans
以前我只承认自己是 “Google 的忠实用户“,不过现在我决定把自己上升为“温和的 Google Fans”。所以呢,博客主阵地也将转移到 Google: http://solrex.blogspot.com ,但 MSN SPACE 仍将保持同步更新。MSN 之所以没有失去我这个用户,应该感谢中国伟大的 GFW。比较易记的: http://blog.solrex.cn 会一直指向我主博客,谢谢。
唉,放弃原来的博客也是有点舍不得,在我的苦力经营下日点击量已经趋近 40,虽然大部分是 google 和 baidu 带来的,不过,这些数字又有什么用呢?后悔当时为博客选择域名不谨慎,其实,每个人都不应该把自己的幸福寄于他人,理智的人应该遵从 Adam Smith 的指导,在不伤害别人的前提下寻求自身利益的最大化。
本人下一个目标是努力争取在研究生阶段进入 Google 中国做实习生,我知道自己现在和 top coder 还相差很远,今后会努力提高在数学和算法领域的知识水平。我将不放过任何一个进入 Google 的机会,朋友们有任何和 Google 实习有关的消息都请 email 我一份,我会非常感谢。