iDead

Thu Oct 06 14:40:00 UTC 2011

Tags:

说说我在手机游戏行业这两年

Tue Jun 15 07:32:00 UTC 2010

已经在新公司工作一个月了,每天写写ruby真是一件很快乐的事啊,不用等着漫长的编译时间,不用开着调试器慢性自杀真是一件很惬意的事。最近想来有点奇怪,好象游戏程序员与非游戏程序员之间平时交流的实在是不多,两者的关注点,交流圈,阅读书目与业界偶像都大大的不同,所以有必要谈一谈这两年来一点点观察与想法,以供可能有兴趣加入手机游戏业的同学一点点参考。因为我已经算是离开游戏业,所以有些想法一定会很主观,因为这仅仅是我的一点点观察与想法而已。

在说正事之前先扯扯淡淡(事后发现扯得太长,没兴趣的点这儿 看正题)吧,首先我不是一个硬派的游戏玩家,但还是有一段沉迷玩游戏之中的青葱岁月,大学时迷恋于仙剑,曾经一遍一遍的为了尝试那个谣传的另一结局,在迷宫中来回拼杀,创下了八小时打穿仙剑的记录(当然是用改的,一开始改出乾坤一抛,然后每次R即可,主要是迷宫太费劲了)。后来一发不可收拾,打完了我当时能找到的任何RPG游戏,包括《剑侠情缘2》与《风云天下会》,不过始终没有再也没能找到仙剑给我的感动,也就再也不动RPG,连暗黑都懒得尝试了。在早就烦腻了《红警》儍逼的坦克大战之后,偶然遇到了《帝国时代》,精美的画质与动感的音乐让我立刻爱上了它,从此它成为了我最爱的游戏,常常呼朋换友一起群P,单挑。后来也常常与几个死党打打《大富翁4》、《quake2》、《英雄无敌3》《三角洲》体会一下与人斗的无限乐趣。但是帝国,尤其是帝国2依然是我最爱的游戏,曾经花过不少时间来看战报,研究录像,上game zone与浩方,实战演练开局,也从中享受到无穷的乐趣。后来因为微软的不进取帝国3实在是太弱智,与玩帝国的人本来就比较小众,熟悉的战友日渐稀少,也渐渐的不再玩了。因为实在不喜欢星际的画面,以及与魔兽争霸玩众的疏离,也就再也没有玩过任何即时战略的游戏了。后来风起的网游,可能也是与玩家心理上的隔离,我是没有玩过,只有魔兽世界让我着迷了一段时间,只是发现太花时间,也就渐渐的不再玩了。至于小游戏,我也后来玩一下PopCap的几个经典的休闲游戏。最近也只偶尔玩一下数独来保护大脑的清醒。那种迷恋游戏的岁月与我越行越远,与那些从小伴着红白机,Gameboy一起长大,或又现在XBox,PS,NDS, PSP, Wii等设备一应俱全的玩家们,我只能感叹,我似乎从来没有真正的融入到video game的时代中来过。

不过话说回来,虽然事后想想,我曾经在游戏上消磨了太多的时间,但也是因为游戏,让我明白了DOS上的HIMEM与EMM386的设置,也从用FPE改游戏的过程中领悟了16进制,以及计算机程序的组成无非只是一些0101从磁盘跑到内存中被执行,也从中找到了一点点关于计算机的兴趣,然后才有机会能最终从事程序员这个前途的职业的。我是在高三毕业后那个不堪的回首的暑假中,第一次就是在我父亲科室的机房里接触到电脑的,那里的电脑看着还是很神秘,在一个大大装着空调的房间里放着两台电脑与一台针式的打印机,电脑应该一台是8086,一台是386,用着5寸盘与3寸盘保存着公司所有的重要资料,外人是不允许进去的,那时我们那儿被认为最牛的人现在看来只是一个数据库管理员,他掌管着公司上千号人的档案与工资资料的数据库,而真正教我使用电脑的大姐姐,只算是一个打字员。而我那可怜的对计算机的兴趣,一开始就被给毁了,我还以为计算机就是学习五笔+WPS+UCDOS。唉,如些看来入门老师还是很重要,可能一次糟糕的入门体验能毁掉你对一件事物的兴趣,好在我是幸运的,游戏让我重新认识了机算机的魅力。

虽然游戏让人重新找到对计算机的兴趣,而且我自己的第一个大一点非玩具式的程序也是一个能拿来玩一下的俄罗斯方块,但我自己却从来没有想过自己可能会成为一个游戏程序员,毕竟在我毕业的那个时代,游戏与互联网都还没有成为一个真正的成熟的产业,国内的游戏工作室是很少而且基本不成气候的,也只在网游找到了赢利模式之后,形成了一个巨大利润的成熟娱乐产业之后才慢慢的发现开发游戏的国内公司多了起来。在通过自学会了一点点C的皮毛,并通过侯捷老师的《深入浅出MFC》突然搞明白了什么是多态之后,终于有一个公司没有在乎我本科的专业,给我了一份工作,我成了一个写编辑器的C++程序员。

言归正传,话说两年前,在我厌倦了自己永远搞不懂的ERP开发之后,当时本着头脑中依稀对游戏开发神秘的好感,也看好于移动产业未来,我加入了Gameloft的北京工作室,成为了一个非典型的游戏从业者,因为在公司里我所接触的游戏程序员基本上都是从一开始工作就一直在游戏业中打拼。当然可能因为我的视角不同,所以可能会有一些不同于业内人士的感受吧。

一、全然不同的关注点与语境

当我到了Gameloft之后,首先发现的第一件事,就是游戏程序员使用着完全不同的术语体系,他们关注的总是帧数(FPS),三角形面数等指数,而且有一些词总是有一些特定不同于常识的含义,例如物理与AI都是指游戏中的特定概念。还有一些游戏专有的概念,利如UV、纹理、材质、寻路、动画、骨骼、路点、生死点及碰撞等等。这些都是一个要从事游戏业要搞明白的基本知识,唯有补充这些专业知识,才可能在游戏业中登堂入室,而且这些只是基础中的基础而已。

但是从另一方面来说,我接触的游戏程序员却多半不太关心模式,重构这些概念,对于高内聚与低耦合之类更是基本上不关心,agile与TDD之类在游戏业好象没有什么话语空间。DRY与KISS之类的原则好象在这儿不是太通行,曾经一度让我怀疑我是不是还生活在OO开发语境的生态之中,当然我的经历可能只是个例,但是我觉得可能国内游戏开发业与IT业内的交流不太多,整体不够开放吧。例如在游戏业内外能通吃的偶像级博主也大概只是云风一人而已吧。

二、iPhone与android当立,J2ME已死

其实我一入Gameloft时所进的项目组是NDS次世代平台,而后也曾在两个项目空隙之间暂时性的做过android与J2ME项目,而后一直都从事iPhone平台下的开发,所以对于这三个手机开发平台都还有一点认识,至于windows mobile平台、Symbian与Brew虽然支持原生的C++开发,但是由于开发成本,也多半不会为它们开发专属的C++游戏,基本上大部分是从J2ME移植过来的。而且这后三种平台基本现在是处于萎缩状态。虽然NOKIA的手机销量很大,但是它的Symbian开发平台真的是让人诟病,凡是我接触过做过Symbian平台的程序都多半不愿意继续在Symbian下开发。因为Gameloft不做国内市场,所以我不了解MTK平台。

先说J2ME吧,希望这个标题党的XX已死的口号不会招来太多人的口水,因为我这样说绝对不是为了哗众取宠,而是的确是这样想的。

1、J2ME的原创游戏先天怪味:我先说说原创的J2ME游戏吧,当我第一次看到J2ME写成的程序时,我当场就被雷得皮焦里嫩,程序有且仅有几个非常巨大的java类,而且怎么读都象是用java写成的糟糕的C代码,后来才知道这样是有原因的,因为手机游戏发行商的原因,对于游戏jar包的整体大小是严格的限制了,一般最大是1M,为了节约每个java类产生的元信息所占的大小,java语言的OOP特性只能被迫去除了,所以写出来的代码反而有着比较直接用C来写更古怪的不纯的怪味。在这样一种有着破窗户的示范效应的代码风格的影响下,真的很难有一个比较良好的代码质量,而与之伴随的自然是无尽的BUGs与牵一发而动全身的补丁加补丁。这样也造成了一个J2ME程序员基本成长空间不大的事实,因为这种代码质量及手机平台的硬件限制造成了在J2ME基本上做不出太复杂的游戏,并且程序员基本总是被BUG缠身,没有什么时间进行更多的思考与学习,除了几个个别天份很好的程序员,因为对于代码质量有更深入的追求,能在游戏开发技术上有更一步的精进,基本上我所遇到的J2ME程序员,都是将他们一年的工作经验用了n年。

2、J2ME的移植项目的体力粗活:至于J2ME的移植项目基本上就是IT业中的手工劳动密集的产业了。在讨论这一点之前,我需要大概说一下J2ME的游戏的开发流程:一个J2ME的游戏早期一般只会选一个主要的普及率高的手机作为目标机型,以它作为平台来只在它之上进行开发与测试,这一般被称之为主版(master),然后当游戏进入到alpha期之后,会另选出一些普及率次之但也很流行的手机作为目标机型,并在之上进行测试,一般会选出某一手机系列中比较有代表型的机型大概10个左右,称之为top10,在这之上开发的版本称之为次主版(submaster),然后大概等游戏进行到beta期之后,基本上就进入了大规模移植期,这时所有目标机型都会由一个专人负责,根据手机的厂商,手机的分辨率,是否支持触摸,是否有键盘等等功能,分出一系列子版本,在每个目标机型上进行移植开发与测试。如果不幸加入到这种项目中,每天的工作可能就是与分辨率,坐标,与手机的特性打交道了,恭喜你,你已经成为了蔡学镛所说的“程序女工”了,可能比较蓝领都不如吧。

至于程序女工,还是让我说两个悲惨的血泪故事,让大家明白我的所言非虚吧。惨案一:一个同事遇到一个程序只在某一型号的手机上只要跑到特定步骤就会死机,毫无头绪看不出任何问题的征兆,只到有一次偶然将一个局部变量改成全局变量时才解决了这个问题,原来是因为这个手机的J2ME的实现比较特别,将栈实现得特别小而且不给出任何异常,只要栈满了就毫无提示的死掉,只能放入堆中才能解决这个问题,遇到这种问题除了多了一个报怨的谈资与教训之外,其实对于真正的成长是没有太多的好处的。惨案二,对于不同的分率辨的屏幕布局是比较头痛的一件事,需要写时预定义一些与坐标相关的值,并考虑到不同分辨率之可能之调整,预留一些调整值定义的,而且鉴于java没有条件编译之说,不过好在有人创造性的使用cpp(C的宏处理器)来解决了这个问题,如果主版不是一个由同一个地理上的工作室上完成,基本上主版人员是没有什么动力将这样坐标魔数替换成预定义常量的,所有接手之人所做的事那就是各种魔数先博斗一番吧,哪怕运气好一点,每天为了坐标而不断调整也只是一件毫无技术含量的脏活而已,可能只能耐心有好处吧。而且也可能是大家都太耐心了,居然没有任何一个人想过要做一套统一的布局编辑器,虽然不能解决所有问题,但是能很大的程度上解决移植者之痛苦的。唉!

3、iPhone真是太爽了,虽然apple的审查制度让人不爽,再加上最近的那次开发者许可修改,封杀了诸如Unity 3D引擎的生存空间,但是总的来说在iphone下开发游戏还是最爽的,很少的几样目标机型,统一的分辨率(在iPhone4与iPad之后不再是了),完整的opengl es 2.0支持,充足的硬件资源(比起NDS不是好一点半点),完善的工具链再加上可以实时连机调试功能,再加上低廉的SDK价格,充足的社区资源与生态、支持C++等等。唯一可以算得上是缺点的地方,就是平台太好,竞争也比较激烈一点吧。此外有一点不知是否算是缺点的缺点,就是开发最后总是会需要Mac OS X的,你需要有一台mac,并且熟悉一下Mac OS X与Objective的,反正我是爱死这一点了。

4,android的前景不错,不过最近开发平台与营销平台还不算成熟,Gameloft作为第一手机游戏厂商在去年大辐缩减android上的投入就是一点证明,因为在android上投入产出比并不高,应该是低于iPhone。而且多机型测调试的问题也是存在,开发一款好的游戏,要在大部分的android的手机运行是需要花费更多的人力与物力的,这方面我的观点大概同于tinyfool的观点,不过随着android的占有率更一步提高,以及大量的原J2ME产业转型会更优先选择java语言平台,而非C++/Objective C++的iPhone平台,以及android的开源旗帜,末来的手机平台市场应该就是google与apple分庭抗礼了,至于第三家我现在是没有看到。

三、程序语言

现在的游戏语言主流还是C++ 与Java,虽然iPhone的第一语言是Objective C,但是因为它支持OpenGL及Objective C/C++混合编译,而且很多游戏都是一开始用C++写成,所以真正用Objective C还不多,除非是一开始专为iPhone所写且没有移植到其它平台的需求。Java就不用多说了,J2ME与android自然是用它。此外lua与sql(sqlite3)也在iPhone上有人使用,这个以后也应该会越来越多。不过可能又是一个有趣的个案,我身边的两个同事居然在需要一个排序算法时,直接人肉写出一个冒泡,而不是去用C++ 的sort,这种不研究自己所使用语言的行为真的是应该引以为戒的。

四、面向测试开发

我曾经有一段时间需要完善一个体育游戏的AI,结果发现了一个问题,就是程序的AI的“不可测”,当然这个不是海森堡的不可测,而是没有一套机制将出现时的场景保存下来,或者是将某个AI状态前的场景保存下来,能固定的重复,如果出现了bug,或者加了某个功能,你都需要手工操作人肉到那个状态(而且你还真不一定能人肉到),这实在是一件很痛苦的事情。其实在开发的一开始,就考虑这个问题,在底层提供一套序列化机制,能做到快照功能,并加上一个可控的伪随机函数,就不会出现一些所谓的不好重现的AI中的bug了,不过可惜项目的工期是死的,而且也没有太多人在乎这种质量问题,所在大家都只需苦练调试技巧就好了。

五、考勤加班与薪水

当一个公司大了之后,就会慢慢的有上大公司病,例如不再了解手下员工的工作情况,为了便于简单管理,会有严格的考勤制度,我觉得这一点对于游戏开发公司来说有点讽刺,当然这可能只是我的想法吧。此外游戏公司的加班自然是少不了的,好在Gameloft算是外企,周末的加班还是有双薪的,其它时候的加班那就算是贡献了,便是仅仅是为了一个诡异的完成期限(其实都是层层的留有余地)而加班,或又是一年年的欠上技术债而不愿还,搞到最后只能用加班撑门面,实在是说不过去。没有时间思考,没有时间阅读学习,没有时间生活,没有时间锻炼,此中的代价可是巨大的。不过说到薪水,手机游戏开发应该是高于其它行业一点点,但又低于网游公司一些吧,我说的是平均情况,其实与付出的代价相比,好象也不怎么多。不过从我最近观察到的情况,可能因为最近iPhone与android人才比较少有经验的程序人员(不限游戏开发)开出的价码还算可观吧,此外,现在基于SNS的flex的游戏程序员的需求也比较大,薪水还算不错噢,有兴趣的可以试试。

六、Joel测试

这个是纯报怨贴,不准备去Gameloft的人可以不看,我只说一下“9.你用到了你资金能力内可买到的最好工具吗?”这一条吧。公司居然在这一点上抠门,不肯购买Visual studio只让使用不能装插件的Express版本,本来可以提高效率的IncreBuild与Visual Assist X不能使用,你就等着VS在那个缓慢的编译吧,或者在需要打开某个文件时从文件树中一级级展开一级级查找吧,虽然commads可以减少一点这样的痛苦,但是它的补全功能也很一般。VAX的从声明自建定义,从定义自建声明的功能自然是不能用的了,你要一遍一遍去将两都定义全;没有了可以帮助重构的插件,你觉得大家会辛勤手工来搞定吗?或者大家都不重构,反正也没有人在乎。超级怀念我曾经买过的Ref++,可惜只支持到VS2005就停产了。自然也不会有人去使用DevPartner来寻找一个内存泄漏的吧。我也用emacs与e texteditor还有windbg与项目博斗了很久,可惜windbg的调试的友好性还是远差于VS,这样我总是要开着一个不拿来做编辑功能的VS express窗口,真TMD的别扭。好在大家都没有象我这样痛苦过,也许都从来没有高效过,或者是耐性极好。好吧,说VS太贵(真不贵,你与浪费的人力比,那个根本不算什么),每天开发需要的双显示器与mac mini总应该能按需申请吧,可惜没有,这两者的价格真的让我不好意思来说贵吧。我只是不明白为什么到了现在一个大公司居然还在这件事上犯糊涂。

七、引获

抱怨完了,还是说一点积极的东西,免得我形象太阴暗,象是一个破口大骂前女友的怨男。手机游戏行业虽然没有PC网游与次世代video game公司光采照人,但是也让我有机会能投身于游戏业内一窥全豹,而且也感受到移动产业的确是未来的金矿,虽然我现在不再做游戏了,但是依然没有离开移动产业。而且认识了几个牛人与交到一两个不错同事,其实这样还不够吗?

小结(总算写到这了,这篇博客也写得太费劲了) 总之如果从事手机游戏,如果你不是做iPhone或者是andriod的话,就不用做了,主要是没有什么前途而且是在谋杀生命。如果不做原创,也要慎重考虑。远离J2ME,远离移植,尤其是所谓的大规模移植。至于是否要入我的前东家嘛,兄弟你自己琢磨吧,我不表态。

此外,多学习点数学,多了解点语言,多品味点优秀的程序,总是对的。

Tags:

ByeBye Dreamhost

Sat Jan 16 22:03:00 UTC 2010

因为Site5 还为从其它主机转过来的用户提供了一份更多的优惠,你只需要能证明自己是从其它的主机转过来并且已经关闭了以前的帐号,你就能得到$25的“回扣”用于下一次的任何购买中。不过这份回扣是需要在购买Site5 的30天内申请的。反正我的域名已经全部转到了godaddy 网站也全迁过来了,虽然离真正到期还有一个多月,但是close掉在Dreamhost 上的帐号自己是不二之选了。关闭帐号是很简单的,只要点击close然后再确认再输入密码就行了。在最后提示我因为我的费用并没有用完,下次如果还决定回Dreamhost 的话,那笔钱还是可以作为折扣从我的价格中减去的。很公平不是吗?可惜我是真的不太准备回去了。

好吧,不管怎样我已经使用了Dreamhost 快三年了,说一说我的感受吧,可能对后来者能一点帮助,也算是一点经验或者是总结。

其实根据VPSer的介绍 Dreamhost 自建的机房位于洛杉矶,网速其实是很快的(这个我们下面会讨论的),而Site5 是使用著名的The Planet 机房速度也不慢,不过从我的(北京联通)测试上来看还是稍慢于Dreamhost 一点点。不过我这儿谈的网速仅仅是指传输层的速度,但是真实的用户体验是Site5 的速度大于Dreamhost 的,这个是得到多方(监控宝与google analytics)证实的。

为什么会是这样?我们可以先看几张我从监控宝 上获取的几张图

第一张是在Dreamhost 上较快的HTTP响应时间分布

第二张是在Dreamhost 上转慢的HTTP响应时间分布

第三张是在Dreamhost 上最慢的HTTP响应时间分布

第四张是在Site5 上平均的HTTP响应时间分布

第五张是在Site5 上较慢的HTTP响应时间分布

总体上来说,DNS的解析速度区别并不大,我在监控宝上关于ping值与DNS解析的速度的对比上Dreamhost 是要优于Site5 的,不过那个区别在100ms之内,人是感觉不到的。对于网页的下载时间,其实两者区别也不大也在100ms之内,而真正引起感官上的区别的主要是服务器的计算时间的区别,DH有时比S5要慢上太多了,而且有时DH上连建立链接的时间也会很慢,这只能说明DH也太超卖(oversell)了。而Site5 在这个方面控制的是比较好的吧,起码我现在的平均总的HTTP响应速度在2s左右。

总结一下吧,DH其实还是一个不错的主机,尤其是它第一年的优惠价格太诱人了,而且主机开放ssh权限,这对需要翻墙或者部署rails应用的用户来说还是很不错的。我就是因为它第一年的$24的价格被吸引去的,前不久居然还有过$7.77的第一年的价格优惠。但是第一年之后的价格就比较贵了,而且并不太物有所值了。加上它疯狂的超卖,我的那台主机开始感觉到越来越慢(第一年还好,是最近越来越糟的),所以你如果只是一个linux或rails的初手,只是想架个Blog或者是部署下rails玩玩,我还是推荐你可以买来玩上一年,别象我似的玩了一年之后因为懒得搬家就一共呆了快三年。除此之外我还是推荐Site5 作为共享主机的一个不错的选择,当然你要用VPS我还是推荐Linode 虽然我还没有用过,但是因为有几个我依赖的人的推荐,我相信这个是不错的。

PS:就我个人感觉监控宝 真的很不错,如果你有一个网站,那你一定要用用它! 关于Site5的购买你可以去riku 那儿看看

Tags:

写在google将要离开时

Wed Jan 13 15:09:00 UTC 2010

2010实在是一个互联网的大年,昨天的百度被黑,本来就引不起我作为一个看客的兴趣,也引不起我的同情。一个不被人尊敬的公司被黑,反而让我有一点暗爽,也许这是百度能给我带来的最大快乐了。

然后今天“谷歌”的离去ing,却让我有点兔死狐悲的悽凉,谷歌的底线还是让人肃然起敬的,不过作为天朝的屁民,本来也不想多说什么,剧本已经由《动物庄园》写好,我们只用等着去欣赏就好了。可惜的是XiaoLaiTinyFool 都引述了一个SB的名言,搞得我都有点无奈的想说点什么。好在我不用去百度混饭吃,也不在乎它是否收录我的网站,反正我说的也不是中文,想来它也是看不懂的。

Xiaolai表达是含蓄而自明的,tinyfool的表达是简单而达意的。我就不多重复什么了,只是这个孙云丰作为一个竞争对手的高层,居然在这个时候,不合时宜、迫不急待的跳出来将屎盆扣向谷歌,让我不禁对他的无瑕演技佩服得五体投地,以至于我开始如梦如幻如坠云里般精神恍惚并开始人戏不分了。

我不知他是真的本色出演将SB的这个角色刻划的如此如此入木三分,还是的确已入化境能如此的入戏,说出完美的台词。老大,你真的是《英雄》还是《十面埋伏》又或《头文字D》看多了,果然是对剧本理解得精妙之极,如果要打击对手这时跳出来又太急躁,远不如事情将过末过之时,来几句绵里藏针的阴损、显得既体面又圆滑而收效甚巨。抑或是急于向主人邀功献媚,那也不用说出:

政治环境短期内是无法改变的。在中国,每个企业或者个人,都必须戴着镣铐跳舞。

这样的实话来?有些事是知道而无需说的:大家都在男盗女娼,你自各儿道貌岸然、看不下去,还放出狠话来,说不玩了且宁可去死。这让喂食于你的主人情何以愖?你这难道不是给竞争对手一个将自己树立为不肯听从“世人皆浊,何不淈其泥而扬其波? 众人皆醉,何不哺其糟而歠其酾?”的劝告一意孤行投江而死的屈原形象的口实吗?唉,情何以愖啊?养狗也不能养这么笨的嘛、、、、

噢,对不起是我搞错了,大错特错,你这样的惊人表现的确是可歌可泣,技压达斯汀•霍夫曼蝉联百届奥斯卡都不为奇。因为这部记录片的名字不是《雨人》而是《S+B++++》!!

PS:下次续集《SB#####》的主角你也一并演了得了。

Tags:

搬家成功Dreamhost=>Site5

Sun Jan 10 09:05:00 UTC 2010

其实早在几个月前,当我的new relic 发给我的报告表明在Dreamhost上的得分从fair到了poor与让我很不爽的Unacceptable之后,又鉴于已有的前例 ,我已经另寻乐土之意。

赶在美国传统的打折季,新年动手吧,反正离我的dreamhost的过期时间有不到两个月的时间了。对于Linode 我虽然很有向往,但是对于自己的需求来说,VPS的价格还是偏高。因此在shared的主机中选择是比较正常的,其实一开始我并没有直奔Site5 而已,而是绕了个小弯去试试一下HostMonster 因为它打折之后$4.95/m的价格还是很让我心动的,不过在试用的感觉中我感觉可能是因为被dreamhost上ssh的方便给惯坏了,它需要身份验证(发个身份证的照片过去)才能开ssh的默认流程,就让我有预感HostMonster可能与rails不合,而且它那繁复的控制界面让我比较头大,试用了三天就直接要求退款了,好在它退款还是很方便。教训是没有关注一下rails社区对它的评价。这年头国内国外谈论的居然都是Linodeslicehost 甚至joynet 。我就一个想要找个地方hosting自己的mephisto偶尔玩一下rails的小网民容易吗?

有了这次教训,最后也就选中了Site5 :SSH自动开启也算是我想要的,总体上来说$9.95/m的费用是与dreamhost相当的,不过因为我当年曾经将dreamhost的空间一起与LiuFeng 分享,所以还是与它商量了一下,我们一起合租site5了,我出hostpro的价钱,他出turbo的费用。这样我们就又可以一起合租了,而且还额外得到了一个独立IP,的确是一个很好的方案噢。

虽然Site5本来就有60天回款的保证,但是为了麻烦,我还是使用了一个可以试用30天的coupon,不过事后证明这一步好象是多余的,因为我一开始试用就开始喜欢上site5了,居然它已经为你建立好一个/home/username/ruby/gems,而且还有一个已经写得不太完整的.gemrc。噢,看来site5为rails的用户已经想得足够多了。

至于site5的好处,liufeng已经在这里 讲过了,我就不多说了,只记得他当时太兴奋,在gtalk里面也不停的说site5的好处。对我而言最深的感受,它的网速与机器速度很快,我最喜欢的是它的live chat的客户支持,虽然我的英文足够糟到可以让它的客服刚好了解我要说什么,但是他们总是能很耐心且及时的解答我的很多问题,比起Dreamhost糟糕的live chat系统要好上太多了。

其实我是在中国时区的25号使用了一个30%折扣购买了一年的hostPro+Turbo主机计划,但是就是一个小时之后,就发现的主页上的折扣因为圣诞促销变成了35%,杯具啊。感觉就象被玩弄了一般,在我有点恼羞成怒地急躁的与Site5的交涉之后,他们居然很大方的答应将5%直接refund给我,呵呵,这种感觉让我一下子喜欢上了Site5。

就算了是site5没有其它好过dreamhost太多的优点,我也会因为这一点而喜欢site5的。噢噢

Tags:

从副业到全职的自然演变

Sun Jul 05 16:17:00 UTC 2009

下文翻译自Signal vs. Noise

有人怀疑我们认为应该在开展副业的同时保留日常工作的建议。他们认为建立一样事业需要如此多的坚持不懈地努力,以致于你需要投入所有的时间来将它做好。

的确如此建立一样事业需要大量的时间和精力。但是这种认为需要辞职的才能将它做好观点是一种误导。一旦你辞职,你就改变一切。你并没有获取多的时间,而是失去了它。你等于使自己的业务进入了倒计时。将自己自缚于要么马上赚钱或者完蛋的境地。你必须要么马上成功否则就只能永远放弃。

保留日常工作可以给您一个较长的时间来构建想法。它可以使您随着时间的推移提供持续不断的努力。没有快速致富的选项。但可以日积月累地缓慢建构。

是的,你需要寻找的时间做副业和日常工作。但是如果使用得当总会有足够的时间的:致力于您的想法,而不是看电视或玩《侠盗猎车手》。11点而不是10点去睡觉。这并不意味着通宵达旦或每天工作16小时,我们指的是每周有少许额外的时间。这就有足够的时间去做一些事情,然后不断给它加油。

让你的副业自然地发展成为一个全职的业务。让它有机地增长。开始一项副业。缓慢的构建它。持续的花点时间。随着项目的发展,你就可以判断是否投入更多资源。最后,如果一切按计划进行,您就可以辞职并全职于它(如果这正是你想要的) 。但是如果一开始就这样做的话那就是本末倒置。

想一想,自然中的演变是如何发生的。没有巨大的飞跃。事情逐渐发生变化。这是一种我们力争能达到的模式。

PS: 其实文章简单明了,本不用翻译,只是正好拿它来试试google 不久前出的翻译辅助工具

不错,一个很好用的工具,虽然它的翻译总会给你点误导:) 只可惜它现在的共享功能不太全,不能提供共享给大家,有点遗憾

Tags:

Scheme interpreter in 15 minutes

Wed Jun 03 01:41:00 UTC 2009

Tags:

David Heinemeier Hansson at Startup School 08

Fri May 22 22:00:00 UTC 2009

邮件发送提示成功,但是无法接收

Fri Apr 24 10:01:00 UTC 2009

自己写了一段发送邮件的客户端程序,一直运行良好。可是某天开始,程序发送能提示成功,但是一直接收不到,深感诧异。将笔记本带回家中,程序又运行良好。第二天上班,发现问题依旧。

随决定使用最原始的telnet命令查看问题原因,命令如下

16:52:22 [rx] 220 XXX.com ESMTP(EQManager V6.0) ESMTP
16:52:22 [tx] EHLO computer1
16:52:22 [rx] 250-XXX.com ESMTP(EQManager V6.0)
16:52:22 [rx] 250-STARTTLS
16:52:22 [rx] 250-AUTH LOGIN PLAIN
16:52:22 [rx] 250-AUTH=LOGIN PLAIN
16:52:22 [rx] 250-PIPELINING
16:52:22 [rx] 250-SIZE 25530692
16:52:22 [rx] 250 8BITMIME
16:52:22 [tx] AUTH LOGIN
16:52:22 [rx] 334 VXNlcm5hbWU6
16:52:22 [tx] e===========
16:52:22 [rx] 334 UGFzc3dvcmQ6
16:52:22 [tx] N===========
16:52:22 [rx] 235 ok, go ahead (#2.0.0)
16:52:22 [tx] MAIL FROM: <account@XXX.com>
16:52:22 [rx] 250 ok
16:52:22 [tx] RCPT TO: <account@sina.com>
16:52:22 [rx] 250 ok
16:52:22 [tx] DATA
16:52:22 [rx] 354 Send from Rising mail proxy
16:52:22 [tx] 
.

执行完DATA命令,发送结束符,然后等待从服务器的信息,等待足够长的时间后,系统提示超时。 邮件一直发送不成功。看到DATA命令紧跟着 Send from Rising mail proxy,猜测可能与瑞星 防毒软件有关,之后关闭了瑞星,再次发送,ok,一切正常,所有命令没有任何问题。DATA命令 也能返回响应,但是登录sina还是接受不到。考虑到网络延时,又等待了20分钟,还是接受不到。 至此黔驴技穷,无计可施了。遂放弃,回家休息了。

第二日上班后,登录sina,一下接收了n多封信,至此我的问题解决。

究其原因 1.确实是瑞星杀毒软件导致邮件接收不到。因为安装的是网络版,所以回家就关闭了瑞星,到公司 才打开,解释了为什么在家可以发送成功,而在公司不成功。 2.sina信箱使用的是免费信箱,上网查找,发现不止我一人,很多使用sina免费信箱的用户都抱怨 邮件接收延时大,夸张的需要隔一天才可以接收到,可能和他的服务器繁忙有关,当然也可能是不重视 免费的用户。

Tags:

总会有时间来实现你的梦想

Sat Mar 28 18:33:00 UTC 2009

“I’d love to start a company / become a great programmer / write an awesome blog, but there’s just not enough time in the day!” Bullshit. There’s always enough time, you’re just not spending it right.

看到了DHH 的这篇post 当时感触就很深,本想译出来偏不得闲,恰今天遇一事忆起且又有闲,试译一下,原文就很简单本不需译,纯当练手好玩尔;)

“I’d love to start a company / become a great programmer / write an awesome blog, but there’s just not enough time in the day!” Bullshit. There’s always enough time, you’re just not spending it right.

Now that’s some tough love, but I’m sick and tired of hearing “no time” as an excuse for why you can’t be great. It really doesn’t take that much time to get started, but it does take wanting it really bad. Most people just doesn’t want it bad enough and protect their ego with the excuse of time.

This excuse is particularly depressing when it comes from students. Oh, I have so many classes. Oh, I have so much home work. There’s simply no time to learn outside of school. Then you’re doing it wrong!

Never let your schooling interfere with your education, someone clever once said. Being willing to sacrifice at the edges is one of the most important skills you’ll ever learn.

I’ve received plenty of Bs and even Cs for classes that I was incredibly proud of because they came from hardly no time spent at all. Time that I could then spend on reading my own curriculum, starting my own projects, and running my own businesses.

And I did. During my undergrad, I created Instiki, Rails, Basecamp, and got on the path to being a partner at 37signals. Do you think I could fit all that and still get straight As and have lots of time left over for playing World of Warcraft? No.

If you want it bad enough, you’ll make the time, regardless of your other obligations. Don’t let yourself off the hook with excuses. It’s too easy and, to be honest, nobody cares on the other side.

It’s entirely your responsibility to make your dreams come through.

“我非常希望开一家公司/成为一个伟大的程序员/写一篇令人惊叹博客,但是没有足够的时间!”屁话。总有足够的时间,你只是没有正确使用!

爱之深责之切吧,现我已经十分厌倦听到以“没有时间”作为自己为何不足够强大的借口。不需要太多时间就可以开始,但这取决于是否真的非常想要。大多数人并不是真的足够想要,仅仅是拿时间作为自我开脱的借口而已。

尤其是听到学生说出这个借口时,会特别令人沮丧。“噢,我有这么多课。噢,我有那么多的家庭工作。有根本没有时间学习的学校以外的东西。”你错了!

绝不让学业干扰了您的教育,曾有智者如是说。为了取得优势情愿付出是你需要学习的最重要技能之一。

我的成绩曾得过大量的B,甚至还有C,但我仍然为此非常自豪,因为我几乎没有时间管它们。当时我的时间都花在阅读自己的课程,开始自己的项目,并运行自己的业务上了。

我做到了。在我大学阶段,我创建Instiki ,Rails,BaseCamp,并走上了37signals合伙人之路。那么你会认为我能搞定上面所说的这一切,并有很多时间来魔兽世界?No

如果你真的非常想要,无论怎样你都会抽出时间。不要拿借口来开脱。这是太容易了,并坦率地说,别人鬼在乎你这些。

让你梦想成真完全你自己的责任。

Tags:

总会有时间来实现自己的梦想,如果那真的是你的梦想的话

Tue Mar 10 16:34:00 UTC 2009

看来DHH是在厌倦了别人向他抱怨,或者是什么刺激之后吧,说出了一个真理,虽然是大白话,但是听上去还是让人不得不深思一番,这不,俺虽然也困得不行,也只好上来先发个post占个位先,等醒了之后再好好品读一下。志之

Tags:

将mysql数据导入到sqlite中

Tue Feb 17 18:52:00 UTC 2009

rails 2.0将默认配置的数据库改成sqlite 之后,我才真的开始使用这个”self-contained, serverless, zero-configuration, transactional”小巧,轻便的嵌入式的数据库、、、以下省去 溢美之词n多字

不对sqlite对我来说最大的好处就是不用安装与启动服务,完全就是一个绿色版,只要拷贝过来,放在路径之下就能直接使用了,而且数据库也就是一个文件也是可以随身携带的

如果不喜欢二进制文件也可以将数据转成文本,命令如下:

sqlite3 dbfile.sqlite3 ".dump" > sqlite3db.sql

不过我倒是没有试过在生产环境中使用它,平时在开发与测试时才使用,因此需要将一些mysql中的数据导入到我本地的sqlite3中

自然是先google之,看到一个比较直白的解决方案 它使用mysqldump导出sql语句并从中仅grep(提取)出insert语句,然后在使用
rake db:create
rake db:migrate
之后用
sqlite3 dbfile.sqlite3 < backup.sql
将数据导入到sqlite3中

不过其中有一点小问题:正如文中所说,mysql与sqlite3的转义符并不一致,除了需要将\'转成''(两个单引号)之外,还需要将"\r"(0x5c0x72)与"\n"(0x5c0x6e)转成\r(0x0d)\n(0x0a),此外\"也是需要转成"(双引号)的

并且文中的替换方法是使用编辑器手工替换的,这点与我懒惰的习惯实在是不符,还是用sed来自动化一下吧!最终拼成一个脚本如下:

#!/bin/sh
mysqldump  --opt --no-create-db --no-create-info --default-character-set=utf8 --extended-insert=0 -u user -ppassword database \
| grep 'INSERT' \
| sed -e "s/\\\'/''/g" -e "s/\\\r/\r/g" -e "s/\\\n/\n/g" -e 's/\\\"/"/g' > backup.sql

如果你需要每天将服务器上的数据备份并应用在日常的开发中的话,可以参考上次所写的DreamHost每日mysql数据库备份方案 将上面这段合并到Dreamhost 的cron任务中

Tags:

有趣的情人节时间密码

Sat Feb 14 21:09:00 UTC 2009
require 'rubygems'
require 'active_support'

Time.at 1234567890 # => Sat Feb 14 07:31:30 +0800 2009

Time.zone = "Beijing" # => "Beijing"

Time.zone.at 1234567890 # => Sat, 14 Feb 2009 07:31:30 CST +08:00

可惜今天一天都在加班,早上6:30才回,倒头就睡了,在不知不觉中就已经错过了这个有趣时间:(

Tags:

DreamHost每日mysql数据库备份方案

Sat Jan 24 07:49:00 UTC 2009

因为DreamHost 本身就提供了数据库的备份功能,尤其是象我这样更新不多blog数据也不多:( 一般出了问题restore一下就行了。

不过前几天我犯了一个相当低级的错误,执行了一次
rake db:reset
谁知DreamHost 居然只能在命令行中执行
drop database
却不能执行
create database

再去找panel里的数据库还在,但是restore居然提示没有任何内容,也不知出了什么事,只好发邮件问support.,但是网页总不能总是空的啊,好在幸好前几天为移植一个WordPress下的theme 导了一份数据出来,换了个数据改了database.yml就搞定了

只好亡羊补牢google了一下,自然是有现成的方案的,只是因为我想使用gmail来作为接受邮箱,但是gmail会拒收tar.gz, zip之类的文件,我修改了一下使用rar来打包,脚本如下:

#!/bin/bash
cd /home/yourname/backups/ 
mkdir mysql 
suffix=$(date +%y%m%d)
mysqldump --opt --default-character-set=utf8 -uyourname -ppassword -h yourhost.com database | sed "s/\\\'/''/g" > mysql/database.$suffix.sql
rar a archives/mysql_backup.$suffix.rar -r mysql/*
rm -r mysql/
mutt youname@gmail.com -a /home/yourname/backups/archives/mysql_backup.$suffix.rar -s "MySQL Backup"

其中,mysqldump之后需要加上—default-character-set=utf8 而且再一个sed “s/\\\’/’’/g” 通道比较好,这样导出的文件会将\’替成”看起来比较方便

Tags: