GO GO GO, Fire in the Hole!!!

Saturday, June 06, 2009

 

柏林历险记

这个周末没怎么出去走,说说上个星期天出去发生的一些事情吧。想起来还真算得上是在柏林的一次历险呢,哈哈。

柏林的商店和超市星期天都不开门(好像是法律规定的,不过欧洲人真的好浪漫啊,商店超市都不开门,卖花的店铺是一定会开门的),想起有一个德国的同事曾经用Google Map给我看过在公寓的附近有一个机场,因为修在市区,考虑到周围的楼房越来越多,为了安全起见就废弃了,说是值得去看看。于是把Nokia Maps打开,定好位,打算步行过去转转。看看信息也不算远,3公里不到,走2,30分钟就到了。正好下过雨的天空放晴了,太阳刚刚好的样子(柏林的天气就像小娃娃的脸,一会儿下雨一会儿出太阳的,还遇到过边出太阳边下大雨的:-( ),开开心心的就出了门。

沿着Maps的指示一直走到了Tempeholfer Damm大街的一个立交桥下,Maps提示应该右拐,向右一看,两条车道旁边,还是有能容得下一个人行走的人行小道的,也没有多想,就沿着这条小路走了上去。这是一小段上坡的路,走上去了才发现,这两条车道跟立交桥上的车道合并到一起去了。看起来有点像高速公路的样子。放眼望去,左边不远处是很大的一块空地,上门还立了一些雷达之类的东西,恩,这应该就是那个机场了,估计前面应该有路通过去吧,于是接着向前走。又走了一段路,发现从我身边经过的车基本上都会很大声的按一下喇叭,而且前方怎么看都不像是有路下去的样子,又把Nokia Maps拿出来看了一下,估计可能是走错了吧,因为机场在路得另外一边,可能是要从那一边走才能走得过去。于是决定沿着原路往回走再绕过去。走了可能有50米左右的样子,对面的车道上一辆车拉着汽笛开过去了,仔细一看好像是救护车,我还以为是走错了路德国警察来了呢……还好是在对面车道上,应该跟我没什么关系,低着头继续走。走着走着发现怎么汽笛声越来越近了呢?抬头一看,那辆救护车居然绕到我这边来了,估计是在前面某个地方调了个头。车开到跟前停住了,下来一个mm,问我们怎么在这里走路?说这是高速公路,车辆的速度很快的,在这里走很危险。我赶紧给她解释我们是想到对面那个废弃了的机场去观摩学习一下,莫有别的意思,我这就沿着原路走回去,应该没有啥子问题……哪知道这位mm居然发扬了及其热情的国际人道主义精神,叫我们上车,他们(还有一个男的驾驶员)带我们去。没有办法,有车坐总强过坐11路吧,于是就上了车。救护车一路鸣着汽笛把我们送到了废弃机场的门口。下了车mm还不停的叮嘱在高速公路上行走是很危险的(这个我是知道滴,不过德国的高速公路行人怎么可以自由进入啊……而且也算是被Nokia Maps忽悠了一把,估计也有可能是我选择目的地有一点点偏移),如果被警察逮到了那是很麻烦滴,这里才是旅游者进入的地方等等。好歹人家把我们从高速公路上救了回来,还一路送到了想到的地方啊,连忙给她道谢,说了无数个thank you both,她才上车走了。汗,到柏林的第一个星期天就免费做了回德国的救护车……

在救护车里面拍的照片:

走到机场大门口,发现这里已经关闭了,游客不得入内。

不过旁边的广场还是非常热闹的样子。走近了一看,哇,好多自行车啊!

还有DJ耶:

骑车的人看起来都好专业的样子(至少穿的衣服是很专业滴),而且车上都编了号,估计是在举行什么自行车比赛,干脆找个地方看看吧,反正太阳也很不错,而且旁边就有一个很大的草坪,上面也有一些人坐在草坪上晒太阳:

还有位仁兄脱光了上身晒日光浴呢:

草坪下面就是一条通道,不时的有自行车骑进去。

本来以为这些是进去准备,然后比赛开始会有很多自行车一起冲出来的,结果等了半天都没有开始,反而是陆陆续续的有貌似参赛者的车子骑了进去,这才恍然大悟,原来这里是终点啊,看来这个比赛已经快结束了,后来的这些都应该算是骑得比较慢的了吧!还打算拍拍“万车奔腾”的,这下没搞了。还好太阳也晒得差不多了,不如拍拍屁股走人吧。结果这时候一年轻老外走了过来,刚才就看到他在用照相机朝着这边拍照,莫非是想交流一下对中德关系滴看法?一声Hello之后,他介绍说他是柏林一所大学建筑系的学生,因为这个机场的建筑比较有特色,所以过来拍几张照片,同时想在建筑的照片里面也加上一些带有人文气息的东西,看到我们是东方人,所以把我们也照进去了,他过来就是专门征求我们的意见能不能使用我滴肖像权滴。哈哈,原来是要发表俺的照片啊;)没问题没问题。他看我答应了,便拿出了厚厚的一本打印好的便签让我签字确认,看了一下,很简单的几句德文,看不懂,他又解释说写的是“我同意他使用带有我肖像的照片发表在刊物和著作上”。汗,这老外还真是严谨啊……签完卖脸契(好像不是卖吧,这是免费的耶),他又跟我聊了一会儿,说就在离这里几个街区的地方有一个什么大型的festival(也就是什么聚会之类的)马上就要开始了,说如果我有兴趣的话等下可以过去看看。

等他走了以后,我们就沿着他指的方向说去找找那个festival。地方没找到,倒是看到了一场自行车球比赛:

这里应该是以前机场的正门,现在被隔成了几个小球场,年轻人们骑着自行车玩一种类似于马球的活动。这个以前没见过,还挺新奇的。估计马球是贵族的运动吧,骑着自行车打球那可是便宜多了。

绕了一圈还是没看到有什么非常热闹的地方,不过看到一辆警车,看起来怪怪的,有点像成都的出租车的样子:

既然找不到这个festival,那就回去了吧。还是步行,这次Nokia Maps找的路没有耍我们了,尽是从别墅(估计在德国也算是很普通的住房吧)群里面穿梭:

要是我们租的房子是这样的那该有多好啊……在不停的羡慕中走了半个小时,终于结束了这次在柏林的历险:)


Tuesday, June 02, 2009

 

柏林的第一个周日

今天是周日,因为欧洲没有端午节(这是当然了,不过下周一是他们的圣灵升天日,不用上班,所以这个端午节算是补回来了),所以在家休息。

睡到早上7点起床,跟老婆聊了会儿,吃过早饭,估摸快九点的样子,便出门打算到附近的一个MediaMarkt(专门卖电子产品的)逛逛。刚到这里的前几天曾经进去找过食品超市,没找到,而且柏林的商店和超市关门都很早,一般晚上8点就关门了,那天又是下班以后去的,所以只是走马观花的看了看,今天倒是可以趁休息好好的逛一下。这个Markt离我们住的公寓很近,沿着Burgemeister大街走到Tempelhofer Damm右转,直走下去几百米就到了。这个就是接到牌,Burgemeister和Friedrich-Franz大街是相交的。

街上很冷清,建筑物也没有多高,看起来旧旧的样子,但是很结实。

某家门口不知名的植物:

这就是Temphofel Damm大街了:

出了街口,对面就有一个Markt,上面那个应该是某赌场的名字,在附近看到不少,不过没有进去过。

这个白色的建筑就是MediaMarkt了。其实也不只是买电器的,也有其他一些服装品牌,比如说Esprit。

周末的早上和平时差不多,估计德国人都还在睡大觉,街上基本上看不到人。很快走到了这个Markt门口,结果还没有开门。看了一下门上的标签,估计应该是早上10点才开门的样子,那就沿着Tempelhofer Damm这条大街走走吧,反正一个小时很快就过了。Markt旁边就是市政大楼(如果我没有看错的话)。跟成都的比起来差远了,不过也说明人家没有乱用纳税人的金钱:

市政厅下面还有咖啡吧,以及随处可见的涂鸦:

市政厅旁边有一个U-Bahn站,下去拍了两张照片:

这个就是传说中的Automate(自动售票机)了:

Automate旁边就是剪票的机器:

整个地铁站都比较小,实际上就是一个站台和两个通道:

出了地铁站,在市政厅旁边的石雕旁照了张相。在柏林,这种类似的石雕随处可见。

路过一家类似于房产中介的公司,橱窗里的欧元有点意思,就是不知道是不是真的有这些面值的欧元:

看到一个电话亭,进去了再出来,咦,怎么还是没有变超人?

猜猜这个是干什么用的?

如果是在成都,多半是用于什么雨水引流之类的,但是这个实际上是地铁的通风口。从这里经过的时候刚巧有一列地铁从下面开过,那个风吹得啊... 再往前走,发现了一个亚超,不过在街对面,等下过去瞧瞧吧,正好这次忘了带芡粉过来,做的菜都勾不了芡。(结果走过去了才看到今天不营业)

欧洲路边有很多小车,最典型的当数Benz的Smart了:

国内的红心小贵族确实跟Smart长的一摸一样,难怪人家总理访华的时候要说中国的汽车工业是在盗窃了... 不远的地方有一个U.S.A的不晓得什么部门还是机构,门口停了一辆超长的Lincoln:

这辆小车跟Smart长的有点像,但是不是Smart,不知道是什么牌子(别是红心小贵族吧)。

路边的美甲店,女人就是有共同的爱好啊~~~~

快走回到Media Markt的时候,看到一辆U.S Army(也不知是真是假)的车子,好拉风的样子:

最后走到Media Markt的门口,已经十点过了,结果还是没有开门的样子。老老实实的把71拿出来查德文字典,才知道门上标的时间是星期一到星期五以及星期六,没有星期天的。上网查了一下,当场晕倒,原来柏林几乎所有的商店和超市(除了加油站附近和地铁站附近的面包店和咖啡店),在星期天和节假日都不营业。 还指望着逛了这个商场以后去常去的那家超市买点青菜呢,这下没搞了,还好冰箱里还有两种白菜,看来这个周末只有吃白菜啰~~~ 还是拍张照片留作纪念吧——纪念第一次发现星期天不营业的超市。


 

柏林的地铁

说说星期二早上的曲折吧。公寓在Burgemeister大街,公司在Invaliden大街,相距有接近10公里远,看看我从Google Maps上截的图片,先是住所:

下面站在更高的角度看看住所在柏林所处的方位:

这张是从公寓到公司,A是公寓,B是公司:

柏林曾经被分为东西柏林,两边相互开发了自己的交通系统。东西柏林合并之后,各种交通站遍布了柏林的各个地方。最快捷方便的当数地铁了。地铁在柏林叫做U-Bahn,我认识的人都把它发音做“乌棒”。(有点像一种味道不错的鱼)。还有一种S-Bahn,那是在地面上跑的有轨列车,速度比较慢,不过在有些地方两条U-Bahn线路之间或者一条U-Bahn的某段在修路的话,就需要换乘S-Bahn(当然也可以坐Bus)。Google Maps上有比较全的U-Bahn的数据,实际上U6就可以从公寓直接到达公司:

上图中紫色的那条线就是U6的路线,几乎是贴着公寓和公司过去的——可惜的是我们当时不知道这一点。而且我们出门的时候才6点半,所以想着可以先走走。结果先是往反方向走了一段路:

之所以走错了方向,是因为我的E71当时找GPS很慢,一直没找到(可能是跟我当时没有SIM卡,无法使用positioning server有关)。等GPS fix了以后,发现方向反了已经是7点过了。想想不要转来转去的转丢了,还是找个taxi吧,结果街上连个鬼影子都看不到,更没有成都街头的出租车到处开着揽客的情况(后来才知道在柏林出租车是有专门的上车点的)。因为不熟悉路线,本来不打算在第一天去公司的路上坐地铁的,但是这下子只好硬着头皮找了一个U-Bahn的station走了下去。
进了乌棒的车站,发现整个车站居然没有英文的信息!几乎所有有用的信息都是用德文提供的(或者有其他欧洲语言,但是没有英文和中文)。还好用车站里面的地铁停靠站图和Maps上的地名进行对比,发现好像坐到Mehringdamm比较靠谱,然后好像应该转乘其他U-Bahn线路,但是左看右看都没看明白应该转哪一个。情急之下决定还是先坐到Mehringdamm再说吧,至少离公司近了一些。
决定是有了,执行的第一步就是怎么样买票。整个地铁站很小,不像是有人售票的样子,倒是有几个自动售票机。这些自动售票机上显示的也是德文,还好可以切换到英文。用英文进了系统,发现有很多种选择,short trip, 1 day ticket, monthly ticket, berlin welcome card的,一大堆,根本就搞不懂该买哪一个。点来点去,想想干脆找个最便宜的买吧。short trip的貌似最便宜,点进去居然还有standard fare和reduced fare两种,一个是1.2欧,一个是1欧。本来想买1欧那个的,但是想想这种折扣应该有某种限制吧?来柏林之前在网上查过说如果被查到没有合法的票会被重罚的,于是买了两张1.2欧的(其实还是买错了,不过还好没遇到查票的)。下面图中的B就是Mheringdamm。

到了Meheringdamm,还是看不懂该换哪一条乌棒继续前进。看看时间还有1个多小时,那就干脆走路吧~~!这样保险一点-_-| 咱不是有Ovi Maps吗... 出了乌棒窝,等71定好了位,看看离公司还有接近5km,1个多小时应该能够走得到吧(事实证明估算确实比较准确,9:00准时到达公司,就是Yolanda穿了双高跟鞋,估计把脚走肿了),出发!暴走柏林正式开始!!路上还找了个小面包店吃了个小面包+咖啡,平均一个人2.2欧的样子(两个人都感觉没吃饱,太不划算了)。
到了公司见到Iwona以后问起地铁的路线,并且把我们早上买的票给她看了一下,她当时就笑着说你们真幸运,没被查到,这种short trip是指坐地铁不能超过3站路,而我们到Mehringdamm下总共坐了有7站的样子,如果被查到了不止丢人,还要罚款40欧。正确的做法应该是买月票,这个是最划算的,72欧,一个月内所有柏林公共交通随便坐。或者买Single ticket,这种是指向着一个方向坐,中途可以换S-Bahn,Bus,但是是2小时之内有效。这里顺便提一下,在柏林买了公共交通票以后,如果不是月票,需要在乘车之前先把票在一个小机器上invalidate了,也就是类似于我们的剪票。如果被查到用没有invalidate的票坐车,也是会被罚款的。有关柏林公共交通的详细信息,包括各种票的价格和用途用法,都可以在这个地方查得到:http://www.bvg.de/index.php/en/Bvg/Index/folder/709/name/Fares+Overview 。我后来在这个地方查到我们第一条早上买的那种票的reduce版本,是给6-14岁的儿童和体积比较大的狗狗坐地铁用得-_-...
P.S. 后来又买了一次这种short trip的票...就在星期二晚上跟Iwona告别之后,坐地铁坐过站了,一直坐到了U6的终点。还好我们应该下的Kaiserin-Augusta-Street站离这里只有2站路,所以正好可以用short trip的票过去。又及,星期四的晚上下班后在地铁站等着买票回家,居然有一个外国mm送了我们两张票(真是人品爆发了啊)。


 

柏林的第一顿大餐

经过近30小时的折腾,并且在Frankfurt机场为超重的行李补了25欧元之后,总算在晚上10点平安的到达了柏林。来柏林之前联系了德国分公司的Admin帮忙在柏林订了酒店式公寓,钥匙就寄存在楼下的一个希腊餐馆。一路上我都在担心晚上太晚了餐馆会不会关门,结果一下飞机我就释然了——都10点过了天还是亮的,看起来就像才下午6点过的样子。出了机场,沿着路牌走到坐Taxi的地方,放眼望去,哇,一排的Benz~~。本来想打个奔的看看是啥感觉的,结果人家指了指我们的行李示意我们的箱子太大,他的行李箱装不下。无奈之下只好另找了一个比较大的大众(没看是啥型号,有点像途安)前往公寓。柏林打的起价2.5欧元,7公里之前每公里1.5欧,7公里之后每公里1欧,这点比国内好,国内上了7公里还要多给钱。花了20多欧打到了公寓门口,这时天也黑了。那个希腊餐馆果然还开着,里面还有几个人在吃晚餐。拿了钥匙进了公寓,疲惫至极的洗了个澡倒头就睡。

柏林凌晨4点过天就完全亮了,活生生的被强烈的光线给叫起了床。捣腾了下公寓提供的无线网络想要用skype打电话给老婆报个平安,结果该死的笔记本死活找不到无线网络,看来是啥软件没装上。还好公寓里面有电话,看了下价格,虽然比较贵,但还是报个平安比较重要,所以还是给老婆打了个电话简短的说了不到一分钟,我估计账单上面又会多出几欧的通话费-_-!

这是第一天在德国上班,还是不要迟到的好,于是简单的洗漱了一下,6点半就出了门。天倒是早就亮了,但是路上基本上看不到行人。经过一番曲折(稍后再写一篇来讲讲这个曲折吧:))之后,用地铁坐了一半的路程之后又步行了一半的路程,终于在9点钟准时走进了公司。结果我要找的人居然还没有到-_-| 他到中国来的时候我可是8:30就到公司接待他了啊~~~ 等了半天终于有另外一个人(很高)过来找我,原来他就是我天天下午在电话里交谈的Radek。我要找的人(Hendra)生病了(失声),给他发了个短信让他负责安排我们。就这样终于找到了座位安顿了下来。坐下来没多一会而,Iwona也来了。这可是我在异乡见到的第一个熟人啊~~~~~ 当下约好下了班一起去吃晚饭,也就是下面图片中的MIRCHI餐厅。

这是一个新加坡餐厅,Iwona强烈推荐,说是她每次来柏林必吃的。菜单直接给了德文的,还好Iwona找waiter要了两套英文的,要不我们还真是睁眼瞎了... 我点了一杯德国啤酒,一个浓汤,一个开胃菜和一个主菜。啤酒的味道有点点苦,但是多喝两口就觉得还不错了。很快汤上来了,这种浓汤和国内必胜客之类的餐厅提供的浓汤完全是两回事啊(从大小尺寸上来讲)。这个汤里面有两个类似响铃抄手的东西,不过里面包的是虾和其他的肉类。

汤还没喝完,开胃菜就上来了:

这哪里像是开胃菜的样子,是菜没错,就是分量太足啦,估计这个吃点开开胃,然后吃完也就饱了,不用吃其他的了...... 才吃了几口,主菜也上来了,我点的是海鲜面条,面条里面拌了不少大虾仁周围的那几片是虾片,味道还行,就是这份量......

这是Yolanda点的鱼,也是好大一盘:

坚持着吃了几口主菜,我就已经感觉很饱了。问了问Iwona能不能打包带回家,结果被告知打包在欧洲是“don't”之一,最好不要。无奈的看着剩下的两大盘东西,只有在心里说声罪过罪过了~~~。 我点的这几样加起来要20几欧,不过还好是Iwona请客。上一张热情好客的Iwona的照片:

餐厅的环境比较有异国情调,不过我没到过新加坡,不知道是不是正宗的新加坡风格:


Sunday, January 15, 2006

 

有关UDP的一点总结

在winsocket编程中,UDP类型的socket一样可以调用connect方法,将一个远端地址和本地地址进行一个逻辑上的绑定,以简化后续的sendto和recvfrom调用。但是,如果我们只调用bind,而不调用connect,同样可以在udp的socket上面调用recv方法:
sockaddr_in localaddr;
localaddr.sin_family=AF_INET;
localaddr.sin_addr.s_addr=htonl(INADDR_ANY);
localaddr.sin_port=htons(9090);
SOCKET s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
bind(s, (SOCKADDR*)&localaddr, sizeof(SOCKADDR));
char buf[255];
recv(s, buf, 255, 0);
这段代码可以收到所有成功发到本机的9090端口的udp数据,不过你无法得知收到的数据的来源地址。
如果在recv之前调用了connect,并传入一个远端地址,比如说127.0.0.1的9091端口,那么除了从这个地址发来的udp数据以外,recv调用不会收到其他的数据。
另外,也可以不调用bind,直接调用connect,winsocket不会返回错误,recv调用也会一直阻塞,但是不知道向哪个端口发数据才能收到;如果不调用bind也不调用connect,直接调用recv,winsocket将会返回SOCKET_ERROR,错误码是10022,“提供了一个无效的参数”。

 

类成员的const修饰符重载

前几天被人问到类函数加上const修饰符后的重载情况,翻了一下,只发现对参数的const修饰符的情况的描述,没有发现在函数上加上const修饰符后的情况的描述。其实这个情形是非常简单的,在同一个类里面定义的两个函数,如果只是const修饰符上的区别,那么这两个函数同样会构成一个重载集。不同的是一个被const对象调用,一个被非const对象调用。例如:
class A
{
public:
void fun(){};
void fun()const{};
};
那么:
A a;
a.fun(); // 这里是调用 void fun()
const A ac;
ac.fun(); // 这里是调用 void fun() const

Wednesday, January 04, 2006

 

同步GreatNews数据的小工具

最近一直在用GreatNews(http://www.curiostudio.com)做我的Rss阅读器,非常喜欢这个软件,但同时也带来了问题,我家里的机器和公司的机器上各装了个GN,一来开机的时间不同,收到的news也会有差距,二来两边的feed可能也会有不同,当然有网友可能会说,你把GN的db随身带到不就行了?呵呵,可我是个很懒的人,不习惯天天把db传来传去的,我只希望能够隔一段时间就能够同步一下两边的数据库就好了,所以我写了个小工具,非常简单,就是使用CppSqlite3(一个Sqlite3的c++ warpper:http://www.codeproject.com/database/CppSQLite.asp)对GN的数据库进行分析,从src db里面找出dest db里面没有的feed,然后把这个feed和这个feed下的所有news插入到dest db里面去(我先在dest db里面建立一个temp group,需要在转换后自己手工从这个group下把feed拖到合适的group去),对于dest db里面已有的feed,也会比较其news,把src db里面有的而dest db里面没有的news插入到dest db里面去,就这么简单。

可执行包:(http://www.ashtime.com/tyraeldata/GNDBSyncerProj-executable.rar
源代码包:(http://www.ashtime.com/tyraeldata/GNDBSyncerProj-src.rar)

Friday, December 30, 2005

 

C++ Primer 3rd 错误之二

在242页,6.11节(“其他string操作”)里面,有一段删除string部分内容的代码:
已知string:
string name("AnnaLiviaPlurabelle");
要生成字符串"Annabelle":
typedef string::size_type size_type;
size_type startPos = name.find('L');
size_type endPos = name.find_last_of('a');
name.erase(name.begin()+startPos, name.begin()+endPos);
书上写到,上面的代码得到的name将会是"Annaabelle",而不是"Annabelle",因为erase方法参数中的第二个iterator指向的字符不属于要被删除的范围。到此为之,一切正确。但是接下来就让人很困惑了:

“我们给他传递endPos来删除第二个重复的'a':
name.erase(endPos);

姑且不说erase的单参数形式要求的是iterator(这一点书上明确写了,虽然endPos可以转为string::iterator,不会导致编译不过,但是鉴于书中上面的代码都用的是name.begin()+endPos,我估计这是一个笔误),最严重的问题在于,如果这行代码是和上面的几行代码连用的话,是肯定会出问题的:因为第一个erase的调用已经移除了name里面的部分字符,此时再按照之前查找'a'的位置去erase这个多余的'a',如果字符串此时长度小于endPos,那么就会导致invalide range的exeption,或者字符串幸运的足够长,那么将会误删掉一个不该删掉的字符而把'a'继续留在原地。

 

发现C++ Primer 3rd edition里面的一个错误

在234页的字符分隔函数里面,得到一行文字的最后一个word是这样处理的:
short word_pos = 0;
string textline = (*text_file)[line_pos];
string::size_type pos = 0;
string::size_type prev_pos = 0;
while( (pos = textline.find_first_of(' ', pos)) != string::npos )
{
words->push_back(textline.substr(prev_pos, pos-prev_pos));
locations->push_back(make_pair(line_pos, word_pos));
++word_pos;
prev_pos = ++pos;
}
words->push_back(textline.substr(prev_pos, pos-prev_pos));

注意最后这句,pos在此时实际上已经等于 string::npos 了,所以 pos-prev_pos 并不是真实的最后一个字符的长度。那么为什么这段代码执行不会有问题呢?呵呵,这是因为,std::string的substr方法,在截取子字符串时,如果已经到了末尾,就算截取到的子字符串还没有第二个参数那么长,也会停止。换句话说,在这里是想要substr最后一个字符,那么只要起始点正确,给substr的第二个参数足够大,那么就肯定能够得到最后一个字符。现在我们再来看看string::npos的定义,在我的VC7.1自带的stl里面的定义是4294967295这个数字,也就是十六进制的oxFFFFFFFF(32位机器上的unsigned int所能表示的最大值),所以这第二个参数肯定是足够大到获取最后一个字符的。
虽然结果是正确的,但是感觉还是有点不爽,稍微改一下,变成这个样子:
words->push_back(textline.substr(prev_pos, textline.length()-prev_pos));
ok,feel better~~

Thursday, December 22, 2005

 

封装struct的ByteArray的实现

最近因项目需要要在Python里面使用ByteArray,于是用struct封装了一下:

import struct
class ByteArray:
"""
A class to simulate ByteArray.
@author tyraeltong@gmail.com
@attention call writexxx(),last call getContent() to get result.
"""
m_cont=[]
def writeByte(self, b):
self.m_cont.append(struct.pack('B', b))
def writeShort(self, s):
self.m_cont.append(struct.pack('H', s))
def writeInt(self, i):
self.m_cont.append(struct.pack('I', i))
def writeString(self, s):
self.m_cont.append(s)
def getContent(self):
return ''.join(self.m_cont)

奇怪的是struct的's'format,好像对字符串并不起作用,下面的语句:
struct.pack('s', 'abcd')
只会返回 'a'

Thursday, October 20, 2005

 

命令行编译VC7工程

最近打算给eWork客户端工程做一个NightlyBuild的东西,先找了一下命令行编译VC7工程的办法:

运行Visual Studio .NET 2003 Command Prompt,输入:
devenv /build Debug
或者:
devenv /build Release
强制重新编译:
devenv /rebuild Release
让编译输出信息保存到文件:
devenv /rebuild Release /out nightly.log

Archives

October 2005   December 2005   January 2006   June 2009  

This page is powered by Blogger. Isn't yours?

Subscribe to Posts [Atom]