晓明 的个人资料Garden of Lazy Cat照片日志列表更多 ![]() | 帮助 |
|
|
2月27日 再说在LaTeX中使用中文字体在刚开始学用LaTeX的时候,曾经花了相当大的精力去折腾中文字体。最近才发现,原来用XeTeX处理中文非常方便,不需要任何设置,就能够使用系统中安装的TrueType和OpenType字体。 MikTeX2.7中已经集成了XeTeX 0.999.7,所以安装了MikTeX2.7之后,就已经有了XeTeX了。只需要在编译的时候,使用xetex代替tex;xelatex代替latex命令即可。下面就是一个简单的例子,将下面的代码以UTF-8编码方式保存成一个文本文件,命名为test.tex
\documentclass[12pt,a4paper]{article} 然后执行xelatex test两次,就可以生成带有中文书签的pdf文件了。包括CJK extB的字体都可以直接使用,非常方便。生成的pdf文件是内嵌字体的,而且可以直接copy。所以需要考虑所用的字体是否被授权可以嵌入pdf。 XeTeX无法和CJK包一起使用,不过可以到ctex论坛上下载一个xeCJK包。xeCJK可以和XeTeX一起使用,这个包处理了诸如中文标点之类的问题,还支持分别设置中英文的默认字体,使用起来比较方便。 文件中使用的字体名称,比如SimSun,PMingLiU等,可以用fc-list命令获得。在命令行窗口中执行fc-list可以看到所有能够检索到的字体,也可以后边跟上语言名称来缩小范围。比如我的机器上执行fc-list :lang=zh-cn命令查询简体中文的字体,结果如下:
STCaiyun,华文彩云:style=Regular 同理查询繁体中文字体可以用fc-list :lang=zh-tw命令,查询日语字体可以用fc-list :lang=ja。 2月20日 万恶的IE!最近有这么一个需求:在浏览器中的一个能够显示HTML的输入框中,即时检测输入内容的变化以及字符数目。 首先<input>和<textarea>被排除了,因为这两者只能显示纯文本。如果是HTML文本,就会被近乎原封不动[1]显示出来。那么就只能用<div contenteditable>这种东西来做了,然后问题就出现了。对于欧洲文字来说,这个没有问题,我只需要响应这个HTML element的onKeyPress和onKeyDown事件就可以处理绝大多数的情况。可是对于亚洲语言来说,因为有输入法的存在,这个问题就变得离奇地困难。因为通过onKeyPress和onKeyUp第一无法获知用户输入的是什么字符,第二无法获知长度,第三无法获知什么时候输入结束。 于是决定响应DIV的onPropertyChange事件,结果发现在IE中居然没有反应。google之,说是IE的著名bug,拥有contenteditable=TRUE属性的element不会发出onPropertyChange和onChange事件。tnnd! 于是乎,这个问题现在无解了……。 [1] textarea会很“聪明”地帮你去解释转义字符。比如<textarea>></textarea>会显示成> 11月8日 市场啊市场 著名市场调查公司Canalys前天(11月6日)发布了08年3季度的全球智能手机出货量调查报告(原文见此)。其主要结论如下:
看来经济的萧条并不影响人们的手机消费。而Apple的增长是情理之中的。只不过523%的确是一个相当惊人的数字。微软去年还是第二,现在已经被Apple和RIM赶超了。 抛开水果粉们宗教般的狂热,平心而论,iPhon的确是够酷够眩,而在欧美2代的签约价也相对来说更容易接受。Symbian和RIM也在努力推陈出新。比如Nokia的E71, 5800XM,还有Blackberry 8120, 以及最近热炒的Storm,都十足吸引我的眼球。 反观微软的WM,最大的问题在于生产周期太长,其次便是易用性太差,和缺乏创新性的UI。像Dopod Touch以及Diamond,都是很不错的UI典范,相当值得微软去学习。在微软裹足不前的时候,竞争对手却花样百出,那么现在的市场结果是完全没有意外的。 8月11日 LaTeX菜鸟又学会一招以前都是用pdflatex来直接生成PDF文件。今天才知道,原来从dvi生成PDF是有好处的,虽然多了一个命令,需要用latex命令先生成dvi,然后再用dvipdfmx命令生成PDF。但是首先这样的PDF中的字符是可以正确copy的,其次是dvipdfmx可以正确使用TTF字体,生成的PDF更漂亮。 以下边的测试代码为例:
下边是生成的PDF放大到1600%的效果。左边的是pdflatex直接生成的,右边的是latex+dvipdfmx生成的。 而前者copy出来是“KÕ”,后者则是正确的“测试”。 8月6日 本年度的Assembly夏季大会竞赛结果公布了.读书的时候超级喜欢看64K demo,崇拜到无可复加。虽然现在远不如当年那么喜欢技术了,不过看到竞赛结果还是很兴奋的去下载下来仔细膜拜了一下。我这里提供的下载地址是Assembly大会的官方网站,应该比较安全。 1. 4K intro 2. 64K intro 3. Demo 7月23日 变态的##啊今天想写一个一个小工具类来作Profiler,来测我的一些代码的时间消耗。于是利用RAII,构造的时候记录时间,析构的时候再取一次时间,记录二者的差。代码大致看上去是这样的:
然后我调用的时候,差不多就是这样的:
基本上这段代码工作的很好,我想要的东西都记录下来了。不过吃午饭的时候,突然意识到了一个问题,我的宏定义是有问题的。问题就在于,C++有规定, ## 两端的咚咚,不作为宏展开,该啥样就是啥样。(C++2003, 条款[16.3.3/2])。也就是说,如果我这个是这样的就傻眼了:
因为 LogHere 被展开为 MySomeLog __obj__LINE__ ( "foo", 1234 ) 而不是 MySomeLog __obj1234 ( "foo", 1234 ) 。这样的结果就是我重复声明了一个对象。尽管对于我的目的来说,不会出现这种调用,但是这的确是一个错误。因为我之所以把对象名加上 __LINE__ ,目的就是为了避免出现重名对象。 其实 ## 的这个变态规定我是知道的,并且在面试中还问过被面试者…… -_-! 自己在写代码的时候,结果就糊里糊涂的忘记了。 唔,谁能帮我解决这个问题,用一个宏去生成不重复名字的对象。想想这个问题还是有点伤脑筋的。 7月7日 LaTeX杂七杂八最近想写一些学习语言的笔记,考虑到乱七八糟的东西比较多,比如IPA,我又不会希腊语的输入法,用Word写起来太烦。于是决定用LaTeX来写。结果是遇到了不少稀奇古怪的问题,不过还好总算都解决掉了。把这些问题记在这里,以便自己或者别人以后查询。 1. 希腊文的输入可以用babel包的greek,这个包真是相当不错,帮助文档很清晰明了。不过一开始就把我给郁闷住了,因为按照帮助文档里的做法,我还是没法输入抑扬音῀。按照帮助文档里说,用\textgreek{~h}就可以输出“ῆ”,可是不对,输出的是“ η”。这个问题把我搞的很抓狂。于是Google之,结果说用\ibygr输入古希腊语最方便。试用之,一头雾水,还不如原来的好用。只好接着Google,终于找到了答案,应该用\textgreek{\~h},这次就对了,是帮助文档写错了,唉唉。 不过这个问题只解决了一半,当我输入带气符的抑扬音的时候,又出了两个问题问题。其一是\textgreek{>\~h}不对,出来的是“῏η”,而不是“ἦ”。另外一个是ι下标的问题。我用\textgreek{h|}能够出来正确的“ῃ”,但是我用\textgreek{\~h|}出来的不是“ῇ”,而是奇怪的“ῆι”。最后找到的解决方案是,用\char转义符就可以搞定了。好吧,总比没有强。好在有ι下标或者带气符的情况下同时发抑扬音的情况不是很多。-_-b 2. 这个问题也很郁闷,之前从来没遇到过,就是只要写超过了一定的行数,CJK就抱错。这个很抓狂,错误信息是: ! Undefined control sequence. Google之,无果,只有寥寥几条问这个错误的,无人回答。尝试多次,均无法解决,最后只好悻悻放弃。今天突然想看看cjk-font这个包带的字体怎么样,于是仔细读了一下CJK包里的cjk.txt这个文档,发现这个问题赫然在列。 -_-! 原来是个well-known issue,解决问题的方法就是在\end{CJK}或者\end{CJK*}之前加入\newpage,\clearpage或者\cleardoublepage中的任一个,就可以解决问题。nnd,这个太坑人了。 3. IPA,这个我用的tipa这个包,没有问题,相当相当好用。 我的一个代码小片段: \documentclass{paper} 效果如下: 5月29日 ⿰⿱⿲⿳⿴⿵⿶⿷⿸⿹⿺⿻〾这些字符好玩吧,喜欢做ASCII的人对这些字符肯定不陌生,好多漂亮的ASCII作品使用了这些字符中的一部分。不过我在这里可不是讲如何去做ASCII图案。虽然我偶尔也做,但是我的审美太差,从来都做不出来好看的。-_-b 要藏拙啊。 事实上这些符号被称为表意文字描述符,是用来描述表意文字(其实主要是汉语)字符的组成结构的。在Unicode标准中(4.1的chap 11,5.0的chap 12)详细描述了这些符号的用法。
这些符号在使用上就相当于一个运算操作符,不过是使用波兰表达式(Polish Notation)的方法,这样的好处是省略掉了括号,但是对于非IT业界的人来说,波兰表达式理解起来就有点别扭了。波兰表达式的基本概念是:第一,操作符放在操作对象的前边;第二,从操作对象开始计算,而不是操作符。比如:(1+2)*3 的波兰表达式就是:* + 1 2 3。 我先举几个例子:
嗯,我估计学过数据结构或者编译原理的人肯定能懂这个,没学过的还真不好说…… 再举一个稍微复杂点的例子,圝这个字怎么表示:
现在明白这些字符的含义了吧,其实这些字符就是用来描述复杂字,或者码外字的。计算机无法输入的字就可以用这种方式来描述,再举一个例子: ,这个字是Unicode CJK ext-b的汉字,Unicode码位是U+25E16,没有支持CJK ext-b字体的话,就只能看到一个方框了。那么这个字用表意文字描述符描述就成了: 再举一个Unicode未包含的字符,陕西著名的biangbiang面的biang字: 好吧,我承认只有搞IT的人才会用这么复杂的方式来描述汉字…… 5月21日 说说Windows里的常见字体西文的字体大致可以分为衬线字体和无衬线字体两大类。之前我曾经在blog里推荐了李果正先生的一篇文章,里边对于衬线字体和无衬线字体的区别说的很清楚。中文字体有对应的区分方式,只不过在中文中称之为白体与黑体。衬线字体与白体因为在笔画的末端有修饰,并且笔画有粗细之分,容易区分出单个字符,所以适用于大篇幅的行文,比如书籍的正文。而无衬线字体和黑体笔画末端没有修饰,笔画基本上粗细一致,所以不适合于大篇幅的行文,但是由于其醒目,所以适合于作为标题或者需要着重突出的文字部分。 中文中的白体字与黑体字 中国传统的印刷字体都是白体字。在刻板印刷的时代,为了刻画的方便,汉字与木板的纹理是垂直的,这样汉字的横画因为与木纹平行,所以可以比较纤细;而竖划与木纹交叉,需要粗一些,以防止两侧木纹断裂处磨损严重而无法辨识。在横画的两端,仍然是出于避免因为磨损而漫灭不可识,要加上修饰。跟均中国传统书法的特点,这个修饰就是类似三角形的样子。在计算机中,常见的白体字有宋体(明体),仿宋,楷体等三大类。 宋体和明体是同一种字体,恰如其名,宋体起源于宋朝,但是在宋朝却并不流行。宋人较推崇颜欧柳三家,刻板时都要请名家手书底稿,所以“字大如钱,纸洁如玉”的宋版图书很少使用宋体。宋体因为间架固定,缺少变化,被讥讽为“匠体”。但是使用宋体字刻板成本低廉,所以一直没有失传,尤其是后来活字印刷开始流行后,宋体非常适合活字,所以在印刷品中所占比重越来越大了。明朝万历年间,宋体流传到了日本,被日本人称为“明朝体”,现在Windows中所带的日文字体MS Mincho就是这个名字。台湾最初的汉字照排系统从日本进口,所以在计算机领域,也依从日本的称谓,称之为明体。目前宋体是大陆,台湾,香港三地的标准印刷体。 宋体与新宋体 现在Windows XP中默认的简体中文字体为宋体,字体文件为simsun.ttc,这是一个字体集合,包含了宋体和新宋体。该字体由北京中易公司开发,在Windows XP中的版本为3.03,支持GBK字符集,2万多个汉字。在Windows Vista中的版本为5.0,支持Unicode CJK, CJK ext-A, CJK ext-B共计7万余汉字。CJK ext-B部分的汉字则单独保存为另一个字体文件simsunb.ttf。由于simsun字体缺乏hint信息,所以在过大或过小的字号下,都会出现笔画残缺等问题。由于这个原因,Vista中已经把简体中文默认字体改成了雅黑。而方正公司的宋体(18030超大字符集),常州华文公司的华文宋体则都没有这个问题。 细明体与新细明体 细明体是Windows XP中默认的繁体中文字体,字体文件为MingLiU.ttc,包含了细明体和新细明体。该字体由台湾的威锋数位(原名华康)开发,起初的版本只支持BIG-5字符(即没有简体中文字符),在后来的版本中支持Unicode CJK标准。同样在Vista下,CJK ext-B的字形放到了一个单独的字体文件MingLiUB.ttc中。新细明体和细明体的汉字部分是基本相同的,主要区别在于ASCII字符,新细明体更美观一些。Vista中繁体中文的默认字体为微软正黑。 仿宋体 仿宋体顾名思义,是从宋体演变出来的字体。有传说是秦桧发明,不知真伪。仿宋体吸收了楷体的一些特点,所以与宋体相比更类似手写体。Windows中的仿宋体文件名为simfang.ttf,XP及之前的版本只支持GB2312字符集。在中国大陆,仿宋体是公文的标准字体。 楷体 楷书一直以来是中国的标准手写字体。目前在台湾,使用楷体印刷也成为一种风尚,尤其是在学术文章和政府公文中。Windows中的简体中文楷体字体文件为simkai.ttf,也是中易公司开发的,XP及之前的版本只支持GB2312字符集。繁体中文楷体字体文件为KaiU.ttf,中文名称为标楷体,是威锋数位设计开发的。从Windows2000开始,标楷体支持Unicode。 黑体大致分为三类:传统黑体,圆体,以及综艺体。传统黑体的特点是笔画较粗,没有衬线;圆体的笔画端点以及转折点都比较圆滑;综艺体则是用直线,波浪线等代替部分笔画,富有动感。 传统黑体 Windows XP及之前的版本中,简体中文黑体使用中易公司的中易黑体,文件名为simhei.ttf,支持的字符集为GBK。在Vista中,除了中易黑体外,还提供了由方正设计开发的微软雅黑,文件名为msyh.ttf,支持的字符集为GBK。Vista繁体中文版本中则使用香港蒙纳(Monotype)设计开发的微软正黑,文件名为msjh.ttf。另外出于美观,Vista还为雅黑和正黑提供了加粗的字体,分别名为msyhbd.ttf和msjhbd.ttf。Microsoft Office中还带了个华文细黑,由常州华文公司设计开发,文件名为stxihei.ttf。Vista中的日文黑体字体为Meiryo,汉字部分由河野英一设计,西文和假名部分则由Bitstream和C&G两公司的创始人,字体大师Matthew Carter操刀。Meiryo中的hint做得非常出色,所以即使在小字号的情况下依然非常清晰(Meiryo中并没有像其它东亚字体那样为小字号嵌入点阵字型)。Meiryo的名字由此而来(日语中“明了”的发音)。 对于小字号来说,黑体要比宋体悦目,因此在Vista中,使用雅黑和正黑作为中文的默认字体,取代了原来的宋体。而苹果很早就使用华文细黑作为默认字体了。就我个人看,正黑设计的要比雅黑好看得多。而且雅黑由于hint作的不好,所以在小字号的时候能够看出很明显的大小不一致。 圆体 Windows中的圆体字主要是四通公司设计的幼圆,文件名为simyou.ttf,支持的字符集为GBK。
西文中的衬线体和无衬线体 据石刻大师Edward M. Catich在其著作《Origin of the Serif》说,西文中的衬线字体来源于石刻,衬线有利于石工雕刻。衬线字体Serif一词源自荷兰语schreef,其含义为“笔迹”。而无衬线字体Sans Serif则是Sans(法语,=英语的without) + Serif。 西文的衬线体分为四类:Old Style,Transitional,Slab Serif,Modern。 旧体(Old Style):旧体的起源最早,也是最接近手写体的衬线体,线条比较纤细,粗细线不十分明显。一个很大的特点是衬线的方向并不是直的,看上去很有动感,比如字母t,j,i上端的衬线。旧体的代表字体是Garamond。Garamond是一大类旧体衬线字的名字,来源于法国铅字铸造师Claude Garamond。 过渡体(Transitional):过渡体的风格介于旧体和现代体之间,线条较粗,粗细线对比明显,但不如现代体那么明显。过渡体的代表字体是Times New Roman。Times New Roman是字体大师Stanley Morison为主的设计小组于1932年为英国泰晤士报所设计。Stanley非常喜爱古罗马的字体,所以在这个字体是吸收了很多罗马字体的元素,并称之为新罗马体。 粗衬线体(Slab Serif):顾名思义,粗衬线体的衬线和笔画粗细相同,和打字机有很深的渊源。粗衬线体中最出名的当数Courier。Courier本是上世纪50年代IBM为打字机设计的字体,但IBM并没有为Courier申请专利,结果Courier就成了打字机的行业标准了。Courier系列的字体由于是等宽字体,所以很适合于书写、阅读程序源代码。我现在使用的就是Windows中的Courier New。与fixedsys(无衬线)相比,Courier的可读性更高一些。 现代体(Modern):现代体强调竖画,衬线细长,装饰作用大于实用价值。Microsoft Office中的Bodoni MT就是一个典型的现代体字体。 西文的无衬线体也分为四类:Grotesque,Neo-Grotesque,Humanist和Geometric。早期的无衬线体都是大写字母,直到1835年,William Thorowgood才发明了第一套无衬线小写字母,当时印刷工人由于是第一次见到无衬线小写字母,觉得很怪异,于是称之为Grotesque(风格怪异)。之后公众对无衬线体仍然不太接受,直到1880年,Ferdinand Theinhardt为柏林普鲁士皇家科学院设计出Royal Grotesque字体,才标志着无衬线体被广泛接受。柏林普君主政体瓦解后,Royal Grotesque更名为Akzidenz Grotesk Condensed,即著名的AG系统。十九世纪初Morris Fuller Benton在American Type Founders工作期间设计了一系列的无衬线字体,称为哥特体(Gothic)。Gothic这个名字和Grotesque同样都有点歧视的味道,隐含的意思是说,这种字体来自于野蛮的哥特人,而不是文明的罗马人(Roman)。AG和Gothic对后来的无衬线字体影响颇为深远。 粗黑体(Grotesque):粗黑体的代表是Grotesque系列和Helvetica系列。Adobe曾设计了一系列的Helvetica字体。因为其价格昂贵,所以微软没有购买Helvetica系列的字体。 现实主义体(Neo-Grotesque):现实主义体的笔画平直,字宽变化小,因为其平实的特点,也被称为“无特点体(anonymous sans serif)”。其代表是Standard和Arial。Arial是Helvetica的派生字体,它的一个问题是大写的字母i与小写的字母L没有任何区别。 人文主义体(Humanist):人文体的笔画粗细变化较大,可读性强,是目前使用最广泛的无衬线体。Calibri,Lucida,Segoe,Frutiger都是人文主义体的代表。Vista中就使用Segoe UI作为西文界面的默认字体。Office 2007中西文的默认字体则是Calibri,之前则是Arial。 几何体(Geometric):几何体是利用几何构型来设计的一种字体,富有现代感。常见的几何体有Avant Garde和Century Gothic。 另外还有一些不太好分类的无衬线字体,常见的比如Tahoma和Verdana。这两个字体均为字体大师Matthew Carter为微软所设计。Verdana派生自Frutiger,于1996年出版,其名字由来是verdant + Ana。verdant代表西雅图(西雅图因其绿化程度高被称为翡翠之城),Ana则是当时微软字型部门经理Virginia Howlett女士的女儿的名字。Tahoma派生自Arial,也有人将其归入到人文主义体中,于1999年出版。Tahoma名字来源于华盛顿州第三大城市Tacoma,为印第安语,含义为“众水之母”。Tahoma比Arial丰满,且I与l很容易区分,所以用户很多。
主要参考资料: 3月30日 玩LaTeX - 配置中文字体话说某日小芃芃问我什么排版软件好用,我脱口而出:LaTeX。不过结果是小芃芃装了之后觉得太难用,改投Microsoft Publisher门下了。汗啊.... 我到是被自己钩起来玩LaTeX的兴趣了。主要的原因还是怕丢人,我自己都不会用,还敢大言不惭地推荐给别人用。要是被问起来某个相关问题,答不出来岂不是太糗? -_-b 不过话说回来了,我得冠冕点,得说我现在很喜欢这东西,想学学.... 于是某日跟小芃芃夸口说,我要去学LaTeX,回头用LaTeX作一个带双行夹批的脂本《红楼梦》出来。 这下子牛皮吹大了…… 遇到的第一个问题就是没法处理中文。我倒是知道网上有现成的解决方案,就是CTeX,不过这东西里边有不少违反版权的东西,比如WinEdt,比如Windows字体。想想就不爽,于是决定还是自己来搞好了。 貌似Windows下也没有别的选择,LaTeX只能安装MikTeX。其实这个发布版本挺好的,包管理也挺好用的,目前的稳定版本是2.7。不需要全部都装,缺少的包会在编译的过程中自动提示安装,所以只需要安装一个basic版本就好了。装好了之后,启动start->all programs->MiKTeX 2.7->Browse Packages,在name栏输入CJK,点击Filter,能够列出3个包来,我只安装了CJK,没有安装font和font utils. 现在的问题就是没有中文字体了,我还是决定选用SimSun,主要是这个用的最普遍。于是到网上找了如何加入ttf字体的说明,自己开始动手DIY。基本的步骤如下: 1. 生成TFM文件,创建如下目录%_MIKTEXROOT%\fonts\tfm\arphic\simsun,打开console,进入该目录,执行: 之所以这里我用了Unicode,而不是GB,是因为我觉得UTF8更方便一些,后来事实证明我的想法是正确的。 2. 修改%_MIKTEXROOT%\tex\latex\cjk\UTF8\c70song.fd,我的修改是这样的: \DeclareFontFamily{C70}{song}{}
3. 执行initexmf -u. 这样就搞定了,hoho,我真是冰雪聪明啊。不过考虑到我最初的目的是要用LaTeX来编辑古籍,所以SimSun还是有些不适合,于是从网上下载了李果正先生作的繁体中文包,这个也是UTF8的,恰好可以和我的SimSun字体混排在一起。^_^ 测试的LaTeX代码如下: \documentclass[12pt]{book}
用pdflatex命令转换为PDF文件后,效果如图: 万里长征走完了第半步,接着努力学习。给自己加油! 3月11日 C/C++中的++与--心情啊心情,今天开始恢复更新blog,唉唉。先从一个无聊的话题开始吧。 对++/--操作这个问题折腾最多的应该是计算机等级考试,无聊且没劲。:( 不过有些常识还是有必要知道的。 1. 前置运算返回l-value,而后置运算返回r-value。在逻辑上前置运算返回自身,而后置运算返回一个临时copy。(假设变量类型均为int)
2. 无论前置运算还是后置运算的,其操作数类型只能是l-value。结合上一条规则,可以知道: 3. ++的操作数可以是bool类型,--的操作数不可以是bool类型。对于bool类型的变量,无论其值为true或false,执行++后,结果为true. 此规则不建议使用。 4. C/C++中规定,在一个表达式中,任一变量只能至多被改变一次,否则其行为未被定义,完全依赖于编译器的实现。 5. C/C++在分析语句的时候,token按最长匹配,而不考虑其是否合法。例如: 1月3日 可恶的GetDC()最近写了段代码去查询当前输入窗口中的字符高度,大致的样子是这样的:
LONG GetTextHeight( HWND hwnd ) 可是结果有的时候正确,有的时候不正确。折腾了许久都没有搞定,最后还是在MSDN里找到了门道,在GetTextMetrics的文档中,Remark部分提到:
Note that GetDC returns an uninitialized DC, which has "System" (a bitmap font) as the default font; thus the need to select a font into the DC. 顿时明白了自己什么地方搞错了,忘记了GetDC获取的其实是系统默认的DC,这样得到的TEXTMETRIC也是系统默认的。所以如果输入窗口用了系统的默认字体和字号,自然就是没有问题的,反之就不行了。于是把代码修改成这样,结果就正确了。
LONG GetTextHeight( HWND hwnd ) 结论是:看MSDN的时候,一定要认真读Remark... 11月2日 邪恶的main函数1. main可以递归么? C++2003,3.6.1/3条款说,程序里不要使用main。事实上,无论用VS2005还是GCC3.4.2,递归调用main,或者在某个函数中调用main都可以编译成功,就像这样,虽然这没啥意义.... (IOCCC的获奖作品倒是很多都用到了main的递归)
int main( int argc, char* argv[] ) 2. main可以重载么? C++2003,3.6.1/2条款说,main不可以重载。VS2005和GCC3.4.2都支持这个条款。不过在3.6.1/3条款中又说:main并非保留字。这样在命名空间里,或者类成员函数中,都可以声明叫main的函数。
namespace Myspace 3. main不可以声明为inline或者static. 4. main函数的定义方式. main函数的返回值类型只能是int,不能是其他类型,包括void. 在C89中,如果不声明返回值类型,则编译器认为是int。但是不写和void是两回事儿,估计很多人是因为这个所以才认为main的返回值可以为void了。而在C99和C++中,这是不允许的。也就是说开发者必须声明函数的返回值类型。main函数的返回值是提供给OS使用的,OS通过返回值判断程序是否正确执行,0表示没有错误。这就是为什么必须使用int作为返回值类型的原因。 在C++2003,3.6.1/2条款中说:“[main function] It shall have a return type of type int, but otherwise its type is implementation-defined.” 这句话相当猥琐,我第一次读的时候就把otherwise后边理解为main函数的返回值类型可以是implementation-defined的了。后来反复折腾,才明白原来这句话的含义是说,main函数的参数列表是implementation-defined的,而不是返回值类型。 3.6.1/2条款中要求编译器必须支持以下两种定义:
int main() { /* ... */ } C99则叙述更加精确,要求也支持等价定义。比如可以用char** argv代替char* argv[]。 void main() 在VS2005下可通过编译,在GCC3.4.2下编译失败。 int main( double somePara ) 在VS2005和GCC3.4.2下均通过编译。不过这个声明委实没有任何意义。除非编译器的装载器对此有特定的含义。 3月22日 偶像的力量前一阵子参加一个很有趣的培训,快结束的时候,老师跟我们闲聊。越聊越高兴,于是就谈起来了IT界的牛牛们,老师很郁闷地发现,我们居然没有人听说过Grace Hopper。于是,他给我们留的家庭作业就是去了解Grace Hopper。 我这个人一向比较八卦,最喜欢看名人的小道消息,于是很兴奋的完成了家庭作业。完成后才明白老师为什么那么遗憾,Grace在IT业界真的属于里程碑式的人物,从来没听说过她的确是我的错。 现在开始八卦: 1. 1943年Grace加入了海军,在Mark I, II, III上开发程序。她是当时Mark I上唯一个女程序员。 2. 1945年9月9日,Mark II宕机了,原因是一只飞蛾死在了一只继电器中,造成了电路故障。最后15:45时,Hopper找到了那只飞蛾,用发夹把飞蛾夹了出来,并把这只飞蛾的尸体用胶布贴到了她的日志里。虽然之前就有用bug代表缺陷的用法,但是bug和debug这两个单词被广泛使用,则是从这件事儿而起。 同时这只可怜的蛾子被认为是计算机历史上第一个bug。 3. Grace在50年代发明了第一个程序语言的编译器A-0。在此之前,程序员需要把程序手工转成01序列,打孔后交给计算机执行。Grace觉得可以有这么一种程序,把英语翻译成程序。当时她的同事都觉得这是天方夜谭,计算机只能处理数字。Grace对嘲讽她的人说了这么一句话,“It's always easier to ask forgiveness than it is to get permission.”。1952年,Grace成功地写出来了A-0,不仅支持英语还支持法语和德语。在之后地年代里,又升级成A-1, A-2... Thanks God. 要是没有编译器,我们程序员今天怎么活啊? 4. 1959年Grace发明了COBOL语言。虽然现在已经很少有人熟悉COBOL,但是在商业应用领域COBOL还是有着不可替代的作用。而COBOL的Validation思想至今在计算机领域仍然被使用。 5. Grace一生入伍三次。第一次是1943年入伍,1966年Grace年满60周岁,光荣退役,当时的军衔是中校。Grace退休之后,海军郁闷到渣,因为他们发现,老太太一走,好多东西都玩不转了,于是海军赶紧给Grace写信要求她复职。于是1967年,Grace又入伍了,主要作为顾问和培训新人,1971年又退役了。1972年,还是因为海军实在离不开她,Grace以66岁高龄又入伍了,1973年老太太升职为上校。1985年,Grace成为美国第一个女性海军少将,1986年,老太太年满80,终于第三次光荣退休了。 6. 1934年Grace在26岁的时候获得了数学博士学位,在之后的岁月里,她一共获得了47个荣誉博士学位。 7. 这是Grace给一位年轻后进颁发奖状的照片。看出来这位年轻人是谁了么?Knuth! 永远不要以为女性不适合IT行业,Grace对于绝大部分从事IT行业的人来说都是一座难以逾越的高山!向偶像致敬! 2月8日 Wonderful 3D Online Treasure Books借用别人的一句话:Friggin' awesome!其实除了这句话,我还真不知道该如何评价这个3D电子书。 2007年1月30日,一项被称为Turning the Pages™的技术被发表,第二天,大英图书馆就推出了使用这个技术的在线电子书库。Turning the Pages™本质上是一个XBAP应用。XBAP是XAML Browser Application的缩写,是一种利用XAML技术构建Internet应用的技术。XAML是Vista引入的一种标记语言,可以用来定义文本、图象和控件的布局,与HTML相似,但是表达能力更为丰富。 在非Vista操作系统中,则需要安装.Net 3.0. 这个在线电子书库主要内容是大英图书馆收藏的珍品孤本等,进入网站,第一本就是达芬奇著名的《阿蓝道抄本》(Codex Arundel)。整个系统界面简洁明了。 我找了一本希伯来文的书,因为希伯来文是从右到左书写,所以和中国传统书籍类似,书页从左到右排列,这是扉页。 这个电子书系统的一大特色是提供了文本信息,点击下边的“Text”按钮,会弹出一个Text窗口,内容是对电子书该章节的评价以及翻译。在Text按钮右边,还有一个Audio按钮,按下会听到语音讲解。 书页可以根据需要进行放大缩小。 翻动页面的时候,做得很有真实感。 虽然说使用应用程序很容易做到这个效果,但是考虑到这是使用标记语言编写的浏览器应用,还是相当有震撼力的。我非常喜欢这个系统中的Text和Audio功能,很贴心,也很专业。操作起来也很简单明了。 虽然现在XAML还褒贬不一,B/S结构的Rich应用(我不知道这个rich该怎么翻译)也刚刚起步,但是从现在的发展来看,让人感觉前途还不算那么黑暗。 1月17日 网络时代,我们该相信什么?一个名为《世界最罕见的七种花》的贴子在网上各大论坛被反复转载。里边列出的7种花为:火红郁金香,芹叶铁线,昙花,羊乳花,绿玫瑰,豹皮花,淡烟色郁金香。 不知道原帖是怎么写的,我看到的版本都是把芹叶铁线莲写成芹叶铁线。这里边剩下三种我不清楚,但是芹叶铁线莲,昙花,羊乳花,豹皮花都不算罕见。芹叶铁线莲和羊乳在华北地区分布颇广。不知道这“最罕见”是根据什么标准评定出来的。 类似的现象数见不鲜。在互联网高度发达的今天,人们最习惯的就是“外事不决问google,内事不决问baidu”。然而一个问题是,谁来保证互联网信息的正确性。转贴和剽窃是互联网上最流行两种信息传播方式,貌似区别只是是前者不是为了谋名谋利。绝大部分的转贴者和剽窃者只是原封不动地将某个信息从一个网站搬到另一个网站,大概在他们看来,并没有验证其正确性的义务。 有很大一部分人习惯用网络搜索的结果多少作为验证正确性的手段,而这个方法是不可靠的。举例子说,用google和百度搜索“床第”和“床笫”,其结果如下: google: 床第-410,000条结果。床笫-83,700条结果。 baidu: 床第-649,000条结果。床笫-106,000条结果。 单从搜索引擎返回的结果来说,看起来仿佛“床第”才是对的。然而事实上“床笫”才是正确的。“笫”的含义是竹席,床笫泛指贴身的卧具,所以有“床笫之欢”,“床笫之私”等等说法。可见单看搜索引擎的结果多少是不太可靠的。 前两天看到一篇贴子,是某专家评论红牛的,其中说“牛磺酸是人体必须氨基酸”。高中学生物的时候应该就会学到人体必须氨基酸只有8种,牛磺酸不参与蛋白质的和成,再重要也不会被归入必须氨基酸之内的。而在搜索引擎中搜索,与此专家相同意见的条目还是很多的。 又及,百度知道和百度百科中很多条目是抄袭的维基百科。 11月29日 编程的毛病——C++之父访谈原文见:http://www.technologyreview.com/InfoTech/17831/ 翻译:jowtte@hotmail.com 11/29/2006 在20世纪的80年代和90年代,Bjarne Stroustrup设计并实现了C++程序语言。C++普及了面向对象编程,同时也影响了包括Java在内的诸多的程序语言。 Technology Review: 为什么绝大多数的软件糟糕透顶? TR:我们怎么样来弥补现在的尴尬处境? TR:程序员努力工作的回报是高效率的代码,这就是隐藏在C++背后的思想。贝尔实验室希望有这样一种语言,少数真正聪明的人可以用这种语言来为诸如电子开关系统(ESS)等低速计算机编写应用。今天,软件开发人员越来越多,计算机的速度越来越快。这有损于C++的观点么? TR:回顾一下,在设计C++的过程中,在程序员的效率、安全以及软件运行时效率可靠性上作出的取舍难道不是一个原则性错误么? TR:你如何面对这种现象:C++被许多程序员广泛抨击的同时又被广泛使用?为什么C++如此成功? TR:在《C++语言的设计和演化》一书中,你声称Kierkegaard[2]是你的语言概念的影响因素之一。这是玩笑么? TR:你最遗憾的是什么?
译注: [1] average programmer见《Tao of Programming》一书,指介于wise programmer和foolish programmer之间的一类人。 [2] Kierkegaard是丹麦哲学家,全名Søron Aabye Kierkegaard,是一名虔诚的基督徒,强调个体的存在,反对教条主义。 [3] 1984年是C++从理论走向商业化重要的一年 9月27日 电话测谎韩国人正在研究提供一项技术可以分析打电话时的通话。一个功能叫做"Truthful Calls", 另一个功能叫"Love Detector"。简言之,前者是测谎,后者是分析“爱情有多深”。这个系统会每隔一个小的时间段分析一次,然后生成一个以时间为横轴的直方图以便观察结果。(相关新闻见这里) 看起来这个功能非常有利于社会的和谐稳定。人们不需要绞尽脑汁来分析对方的言外之意,只需要简单的问问:“你是在说谎么?”,“你想要说的是xxx么?”就可以判断对方的目的了。 谈恋爱的模式也会产生翻天覆地地变化,电话里大概最多的话是这个样子的:“老婆,你昨天对我的love level只有3.3,咱俩得好好谈谈了”…… 9月20日 Unicode 5.0.0 Standard Released今天到Unicode官方网站上闲逛,无意中发现Unicode 5.0.0标准已经发布了,发布时间是8月26日。标准的实体书将在2007年一季度上市,在线的UCD(Unicode Character Database)则已经是最终的发布版本了。 5.0.0没有带来惊喜。CJK Extension C仍然没有定稿,没有被包含到5.0.0的标准中。不过5.0.0支持以下这些编码规范的最新版本:大陆的GB18030,香港的HKSCS,日本的JIS X 0213。 与4.1.0相比,5.0.0增加了1369个字符定义,一部分是对已有的字符集的补充,一部分是新添加的字符集。前者包括:西里尔字母(Cyrillic),希腊字母(Greek),希伯来字母(Hebrew),坎纳达字母(Kannada),拉丁字母(Latin),数学符号(math),音标扩展(phonetic extensions),符号(symbols)。后者则包含两种小语种字母:印尼的方言巴厘语字母(Balinese),非洲西部的一种方言字母N’Ko;以及三种已经消亡的书写系统:八思巴字母(Phags-pa),, 腓尼基字母(Phoenician)以及苏美尔-阿卡德楔形文字(Sumero-Akkadian Cuneiform)。 这个表列出了Unicode 5.0.0的编码点情况:
对于简体中文用户来说,最重要的一点就是对GB18030最新版的支持。虽然GB18030设计得很屎,但是对于绝大多数人来说,编码标准是透明的,Usability才是最重要的事情。就是不知道我们日常用的OS们啥时候能支持Unicode 5.0.0的标准。 8月15日 Microsoft XNA 微软宣布在本月底发布 Microsoft® XNA™ Game Studio Express的免费下载版本,这是一个很有意思的商业行为。
XNA何许人也?其全称是Xbox/DirectX New Generation Architecture,即是一个在DirectX之上的游戏开发Framework。用户可以利用XNA Game Studio便捷开发Xbox的游戏,并且代码可以不经任何修改,只改变编译选项,便可以编译出Xbox 360或Windows Desktop的游戏来。
根据Microsoft官方的说法,XNA Game Studio应该是集成到Visual Studio中,依赖于Visual Studio运行。Visual Studio 2005的debugger已经颇为人性化,相信微软也是考虑到这个因素。对于开发者来说,集成后不仅能够利用Visual Studio 2005的开发环境,也不需要花费时间去学习一种新的开发工具。
之所以说这是个有意思的商业行为,是因为XNA的发布显然会刺激Xbox 360的消费。对于这种开放式的API,便捷的开发环境,统一的开发平台,肯定会吸引更多的公司和个人去开发更多的游戏。对于玩家来说,既可以有机会玩到更多更好的游戏,也可以尝试DIY,自己作游戏过把瘾。结果便是一个三赢的局面,当然XNA的质量如何尚不可知,还得拭目以待。 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|