月度归档:2013年04月

关于strlen的小迷惑

首先,说明一下,我不是一个C程序猿,也不是一个C++程序猿,我从入门开始真正学习的编程语言以及正经用过的变成语言,也就是Java和C#,虽然我对其他的语言都非常感兴趣,同时也写过一些Python的脚本和C的代码(主要集中在JNI)。

由于这些年来的编程习惯,我认为字符串都应该会有自动获取其长度的方法,在前几天的工作中就碰到需要使用这个方法的场景了。由于我对strlen()使用的不慎,导致程序输出时而正确时而错误,最终定位到是因为使用strlen()方法获取字符串长度在多次执行后的输出不等,导致程序出现了不可控的情况。

那么是否是因为strlen()方法的问题呢,我自己首先十分肯定绝对不会是这个方法的问题,这些方法在时间和实践中都尼玛得到过太多的验证,且看Linux中的实现:
[c light=”true”]
#ifndef __HAVE_ARCH_STRLEN
/**
* strlen – Find the length of a string
* @s: The string to be sized
*/
size_t strlen(const char * s)
{
const char *sc;

for (sc = s; *sc != '\0'; ++sc)
/* nothing */;
return sc – s;
}
#endif
[/c]
这么简洁的实现,多么漂亮啊。肿么可能会出错捏?好吧,实际的应用场景是我需要将一个从C#运行时托管层将一个byte数组传入Native层,在Native层面做一些操作的时候呢,我直接使用了strlen()函数来确认当前byte数组的长度,尼玛脑残啊。托管层byte数组虽说可以认为是Native层的unsigned char数组,但是我并木有意识到C层的字符串都是需要’\0’来作为终止符滴,显然从托管层传入的数组中不会自行添加这个到数组中。所以才会出现偶尔内存中该数组后面确实没有任何值,那么strlen()函数在刚好读取到数组后的值为空时,那么其长度刚好正确,在某些时候该数组后连续的内存地址中并不为空,那么strlen()就会返回一个错误的长度,而我的逻辑代码又依赖于该长度,所以你只到的,Just Fucked Up!

所以在托管层申请的内存,传入Native层面时,一定要注意两个平台下对某些概念处理的不一致,否则到时候又得吃自己的狗屎了。WTF。

数字消费碎碎念

前几日将《重来》这本书给看完了,书中提到需要将自己的知识分享出去,分享你的知识能获得的将远远大于你付出的东西。自己深有同感,所以尝试重新开始写作,记录,先从非技术类开始吧。

我是一个程序猿,入行如今已经有四年时间了。从入行开始到现在,我个人在数字消费上的额度日渐上涨。其中包含的类别也蛮多,有购买软件的,有购买服务的,还有捐赠的。

记得第一次购买正版软件是在超图实习的时候,那时自己找朋友借钱买了个新的笔记本,当时机器拿回来之后安装了360安全卫士,当时看到有Nod32的促销,自己当时就直接购买了一年的正版服务,加上当时360促销的半年,应该是为期一年半的时间,具体价格忘了,应该是蛮便宜的,应该在50块钱以内。记得当时有一次不经意的聊天中,同组有个同事提到他购买了一个正版的杀毒软件服务时,我也顺口说了一嘴。旁边其他的同事当时觉得我俩很奇怪,我也觉得他们很奇怪。这是我第一次数字消费,Nod32也一直在我的机器上跑了一年多。直到我将笔记本的主要工作系统换成Ubuntu时,我在电脑上装了一个盗版的Win7,然后购买了3年的卡巴斯基,到今天还剩100多天的可用服务时长。这是我毕业之后在安全软件上的支出。

在超图实习期间,自己想架设一个自己的WordPress博客,也就是这个站点。然后正式工作的时候,就打算建起来,记得当时是在胡戈戈的店里买的一年的空间,域名还是胡戈戈帮忙给申请的,非常感谢他。记得当时两个费用加起来不到两百块钱,虽然在当时我一个月试用的工资只有2800块钱,但是我觉得100多块钱显然完全能够接受。

在超图工作的近一年的时间中,慢慢地我们伟大的GFW越来越厉害了,作为技术人员我显然不愿意被拦住,那个时候总是在网上找一些代理和第三方的应用来上Twitter,直到我使用的大部分应用和代理都无法正常使用了。这个时候我开始购买了一个名叫Puff的服务,购买了一年的服务。在Windows上有客户端,当时Puff还不能支持VPN连接,只能通过其客户端来完成连接,所幸的是它的客户端在Ubuntu下通过Wine可以完美运行,所以那个时候Puff帮助了我很多,感谢Puff的作者。

之后来到喜讯之后,身边有同事是做服务器的,刚好之前购买了为期一年的空间到期了,当时他建议将我的博客搬到他的VPS上面,然后免费蹭了半年。刚好公司搬家到天居园,那时候AWS刚好有一个EC2的活动,可以创建一个Instance免费使用一年时间,当时公司所有程序猿果断都申请了AWS帐号,创建了一个Instance,将自己的博客搬过去之后,也没有做什么其他的事情,这个时候我购买的Puff一年期服务也到期了,有了EC2就不愁神马翻墙不翻墙了,直接一个ssh连接就搞定了。这段时间内是自己学习最快的时候,这个EC2帮了很多的忙,感谢Amazon。顺便提一句,我是Amazon忠实的粉丝,能在Amazon上购买的东西,包括书和数码产品,从来不再别的地方购买。

在EC2免费到期之后,由于EC2年收费确实太贵,我们几个同事合租了一个VPS,之前用的是国外的某家VPS,目前是使用的42区的,非常不错,速度很好也很稳定,ssh很少会掉线。大家几个人平摊,每年每个人也就三四百块钱,物超所值。

另外由于很多Android设备不支持直接设置Http代理(小米手机的MIUI是可以),在当时测试Facebook接口的时候,我购买了一个VPN,当时选择的是一个名叫Runoz的VPN,目前使用了快一年,速度非常棒,客服响应速度更是超快。一年收费才尼玛100块钱还是多少,反正是非常便宜啦。一个帐号可以同时登录5台设备(我购买的时包年套餐),不限速不限流量,看什么Youtube根本不在话下,貌似除了迅雷等P2P软件会被禁,某些服务器上不建议经常下载,其他的限制根本就没有。

当然这些年陆续的域名续费肯定是要的,每年也就19.99美金,目前手上就两个域名,还算能接受。

作为一个程序猿,在解决了墙的问题之后,个人生产力已经明显得到了提升。在此之余,我们总不会放弃任何一个还有可能提升个人生产力的途径滴。在持续使用了一年多Ubuntu之后,我将工作环境切换到了Mac OSX上了,因为我是一个有轻微强迫症的人,我在使用Ubuntu的一年多时间内,尝试安装了很多新奇的软件,每次系统提示有更新,我都会毫不犹豫地选择更新,从来不等到第二天,而Ubuntu总是会在某次升级之后导致某些很小的功能会出现一些小问题,而我又是一个强迫症,很多时候要求我全心全意来工作去解决问题的时候,我的工具竟然让我不爽,很显然这个我是无法忍受的。

切换到Mac OSX上之后,发现了很多原本没有接触过的小软件,有付费的有免费的,下面列举一些我每天都在使用的,大部分都非常的棒。

Cnich,用于完成Win7下默认窗体自动最大化的功能

Dash,程序猿查看API文档神器,有了她之后生活更美好,该软件是共享软件,你可以免费一直使用,但是可以支持作者购买正版授权,这款软件是我迁移到Mac OSX下的第二天发现的软件,当天试用了1个多小时,直接购买了正版授权,也不算贵当时是半价,忘了是19.99美金还是9.99美金,应该没有超过100块钱。

1Password,因为工作中会涉及到一些公司帐号的密码,通过密码管理软件来管理总比直接放到Excel和Txt文件中靠谱,何况这款软件做得也是十分的良心,虽然比较贵,不过购买Family License还算划算,可以跟同事一起分担费用,Family License同时支持激活5台设备。

EuDic,有免费版的,付费后可以开启自定义词典的高级功能,虽然这些自定义词典大部分都是网络上开源的或是免费的资源,但是必须开启该功能后方可使用。售价不高,因为目前自己尚不需要暂时未购买该功能,之前一直使用StarDict,不过在Mac下EuDict将Mac的各种特性发挥得非常到位,你值得拥有。

MenuMate,在使用双屏环境时,经常需要将鼠标从屏幕二移动回主屏幕来操作Menu菜单,有了MenuMate之后就可以在任何地方直接呼出当前应用程序的Menu菜单了。当时做活动时购买的,花了0.99美金

Timing,一个每天默默在后台为你自动记录你在电脑上不同的软件上耗费的时间,可以非常快的判断你这周在电脑上将时间花在了开发、浏览网页、游戏上,活动时购入,也是0.99美金。

TextMate,目前我还不算真正会使用这个工具,只是作为简单的文本编辑器来使用的。

MacVim,有些操作还是习惯在Vim下完成,MacVim不仅有Vim的完整功能,同时又加入了一些更友好的特性,在Mac下非常贴心。

Sublime Text 2,神器一般的存在,目前使用得不多,只在写python脚本的时候会用一用,因为其在Linux环境下不支持中文也让我蛮纠结,另外使用频率太低,目前我还木有欲望来购买其正版授权(70$有点小多啊)

Parallels Desktop,因为某些网银的问题有的时候还是需要通过Windows下的IE来完成,所以这个你懂的,这个直接购买中文版即可,人民币239元,不贵好使。

Mou,Mac下Markdown文档编辑神器,作者也算神人了,凭一人之力完成了很多Mac下优质的软件,这是他开发的众多软件中的某款共享软件,目前我在写各种文档的首选就是Mou,我相信Markdown未来会是程序猿首选的文档交流格式。

Remote Desktop,这是目前我购买最贵的一款软件直接将Parallels Desktop给爆了,售价99美金,不过貌似购买了之后会自动获得iPhoto和GarageBand。这其实就是Mac OSX下的远程桌面连接功能,卖得可真够贵的,不过工作中需要从某台机器上去操作另一台机器,关键是还一定要进入图形环境,所以好吧,我选择妥协。

就在我写这篇文章的时候,微信公众号『Mac技巧』发布了一个MacHeist的Mac软件包打折的消息,我去看了一下,里头有一个是我非常想要的工具,那就是xScope,之前因为自己需要一个屏幕尺子,而在Mac下并没有找到免费的趁手的(FreeRuler体验已经非常不错,但是还无法达到我的要求),单独购买一个尺子委实太贵(Mac App Store中大部分尺子售价都在12人民币以上)。除了xScope之外还有一个神器就是PathFinder,虽然较Windows平台下的Total Commander稍逊一筹,但是也有其过人之处,关键是打包购买总共才9.99美金,尼玛的活动主办方还要将收入的10%捐赠出去,尼玛你还可以自行选择捐给哪个慈善组织,我默认选择平均捐给所有可选的慈善组织了。

MacHeist软件包如下:

xScope

iStopMotion

Totals

Clarify

AirServer

Fantastical

CleanMyMac 2

Little Inferno

Path Finder

Money(需此次活动售出份额超过55K才会解锁,童鞋们加油吧)

此次购买纯属巧合,昨天该活动结束之后,主办方貌似又追加了3天时间,我昨天就在还剩一分钟的时候才点击下单的,这个1分钟当然不是我在犹豫导致滴,其实时我得知这个事情的时候打开网页就只剩下45分钟了,但是我并木有看到这个消息,在告知同事有这个优惠活动之后,我就开始了当天的工作,想着中午吃饭的时候下单,当时我并没有意识到这个有时间限制,然后在上班过程中突然想起『Mac技巧』提到还剩13个小时,赶紧回到页面,刷新一下发现时间就剩1分钟了。尼玛果断下单付款之后,回到活动页面刷新,果真落下帷幕了,不过还好现在又延长了3天时间,大家购买的时候就不用像我这般如此仓促了。

在作为一个二逼程序猿的同时,我还是一个纸制品重度爱好者,阅读爱好者(注意,我木有使用重度了),只要有可能,我想拥有一切我看到过的优美的纸制品,想阅读所有我看到的好的书。有人说我很文艺,我觉得我一点都不,只是我喜欢的东西跟大家不太一样,内里我依然很土逼。既然咱们今天聊数字消费,还是回到正题吧。

我一直非常钟爱纸质书,纸质书的味道和编辑的品味是能让读者有一个很直接的感官的刺激的,不过这并不妨碍我同样喜欢阅读电子书。我购有一个Bambook,虽然使用频率不高,但是其在阅读Txt类的武侠小说的体验上绝对是最棒的(这些Txt电子书应该是有版权问题的,我确实无耻地看过很多类似的武侠小说)。我在电子书上其他的消费,全部是在我转向使用多看阅读这款软件开始的,之前我在Android平台上一直使用iReader这款软件,就因为我当时购入的Google Galaxy Nexus手机系统是Android 4.0,而iReader会不时地导致我的机器重启,无奈之下我只得寻找替代品,之前听说雷总投资了多看,然后Google了一下多看的相关资料,顿时感觉相见恨晚,果断装上。之后的电子阅读,百分之九十都是在多看上完成的,在我购买了一本《黑客与画家》纸质版本之后,多看阅读在数月之后推出了电子版,当时售价是¥12.00。那时刚好电子书炒得比较热,包括当时红极一时的唐茶的出现,我也非常想尝试一下电子书的消费是一种什么样的感觉和流程。Android版本的多看支付实在是方便,直接点用支付宝快捷支付服务,在不到1分钟的时间内,我就购买成功了。在我购买电子书之时,家中的纸质版本我才看到大概5~7页的样子,但是我在手机上花了不到2周的时间,这本书我就读完了,我那些上下班路上以及其他的碎片时间中,大部分时间都是在阅读该书。

初体验非常完美,价格合适,适合碎片化阅读,后续又购买了若干本。因为多看定期会推出很多限免书籍,我也会选择性的下载,不过购买的书籍阅读的概率明显偏高,因为我购买的书籍肯定是我当下非常想看的,限免的书籍也有不错的,更多都是图免费下载的,看的可能性并不是很大,最近已经不再下载自己不可能会看的限免书籍了。在多看上购买的书籍有:

《黑客与画家》

《公司的力量》

《凡客不凡》(这是购买公司的力量获赠的)

《煲一碗靓汤》(这是多看3.8妇女节活动获赠的)

《重来:更为简单有效的商业思维》,这本书真的只花了1周的时间竟然看完了,这一周竟然还是我这半年来最忙的一周,可想而知碎片时间阅读的产出能有多高。

《极简欧洲史》

 

在此之余,在App Store上还购买了一个游戏《战神之怒》(老比说的好,尼玛做游戏的,不玩别人游戏不太现实,该花的钱还是得花)。

回过来说说捐赠,原本捐赠不应该当作消费的,不过在我个人看来没有很大的区别,帮助别人并没有那么高尚,更何况所尽之力非常微薄。纯粹的数字捐款有几回,给Wikipedia捐过两次,数额不大,给去年的刷票助手也捐了很小的一点钱。至于其他的捐款还是不要说了,离这个主题太远了。

数字消费如此顺畅,不得不感谢为此做了很多事情的一些公司和组织啊。首先,信用卡发卡行和Visa,让我们在海外网络消费支付上完全不成问题,购买各种软件和服务,消费比国内使用支付宝都尼玛方便。其次,支付宝让购买电子书非常方便快捷。正是这些公司和组织不断地优化了很多的流程,我们才能如此顺畅又舒服地做各种数字消费啊,真心感谢招行、Visa和支付宝。