九天雁翎的博客
如果你想在软件业获得成功,就使用你知道的最强大的语言,用它解决你知道的最难的问题,并且等待竞争对手的经理做出自甘平庸的选择。 -- Paul Graham

用Markdown + VimPress写博客

这次把CSDN的文章移过来的时候, 发生了格式混乱的不愉快体验. 虽然以前的那些文章有些很稚嫩, 早期的文章现在看来甚至很可笑, 但是, 这种记录还是很值得保留, 毕竟是成长的过程.
整理一些文章格式的时候, 还发现一个有趣的故事, 原来我现在这么喜欢Vim, 来自于当时刚到北京, 用一个巨老无比的笔记本, 图形界面几乎没法用, 所以才无奈之下真正的耐下心来学习Vim, 见买了个新显示器. 而这已经是我第3次开始尝试使用Vim了, 从那以后, 我几乎没有Vim就没法工作了.
闲话少说, 综上所述, 我决定好好的管理一下自己的博客, 虽然现在已经用上了自己可以控制的Wordpress, 但是谁知道将来会不会再发生忘记缴费, 数据被删的事情呢, 即使我用上了Wordpress的备份, 我还是需要给自己写的文章做一个自己的备份, 并且可以用Git来管理, 这个才叫真的备份, 连历史记录都备份了. 同时, 因为格式上的原因, 我决定用某种文本格式来保存我的文章, 当然, 我可不准备手写HTML, 这样才不会出现用Windows Live Write写博客那样的悲剧, 并且, 作为离线写博客的方式, 用Vim来处理文本就方便了, 不用再去找各个平台的啥离线工具.

阅读全文....

做一些新尝试

我以前最喜欢的博客可能吧昨天破天荒的更新了,在可能吧获得国家认证以后,更新越来越少,直到昨天,作者真正的宣布了可能吧“可能”从此停止更新。

作者的理由是“能支配的时间、精力、激情都在减少,写博客的动力自然就不存在了。”“或许博客这种形式不太适合移动互联网传播,我尝试过Tumblr,还是太重,尝试用Twitter,过轻。微信,是我接下来要尝试的。”

心里突然有些悲凉。可能吧是我最为赞赏的坚持输出自己价值观的博客,在谷歌退出事件中力挺谷歌,因此获得了国家认证,对比那些发发牢骚,不痛不痒的博客来说,可能吧更加让人尊敬。而国家认证,事实上也毁掉了可能吧,的确,没有读者,那为什么写作,对于绝大部分现在还能看到可能吧的读者来说,输出的价值观早已被认可了,而看不到的人,可能才是更加应该去看的人,这真是吊诡。这也是国家认证的威力,让围墙中的人永远不知道自己其实活在围墙里面。一方面囚禁你,一方面告诉你你很幸福,这就是现实。

另外一个我很喜欢的博客,刘未鹏的博客最近更新也少了,可能作者忙于微软的输入法项目吧。目前真正能看的博客,可能只剩下阮一峰的博客了。有些感概。

CsdnBlogMover的帮助下,把CSDN的文章和评论都搬过来了,算是一种纪念吧,结果发现格式很乱,特别是当时心血来潮用windows live writer设计好看的模版写的那一系列文章,乱的一塌糊涂,基本不能看,同时windows live writer的保存格式又是一种私有格式,非得用windows live writer才能打开。再次印证了一切把人圈起来的东西,包括软件,都是万恶的。追求自由,往大了说追求言论自由,往小了说,使用一个软件的时候,拥有将来某个时间点不再使用这个软件的自由都是很重要的,这就要求这个软件的设计出发点不是企图把人圈起来,坏的典型就是windows live writer,好的例子,比如Evernote, Evernote在菜单上就有Export All Notes的功能,导出为公开格式的文本文件(甚至包括HTML)假如你愿意的话,你可以在任何时候离开Evernote,这是一种开放的精神,也是一种自信的气魄。不知道国内那么多模仿者,学习了这种精神没有。

我的博客最近很少更新,虽然也的确有最近比较忙的原因,同时,学的东西实在太杂了,虽然一直在学习新东西,但是都是广度上的,深度上没有突破,很多东西其实都比较浅,感觉不值得分享。我甚至都不好意思把那些肤浅的东西写下来,以免贻笑大方。但是这样下去,这个博客就没得东西可以更新了。

我也进行一些新的尝试吧,作为程序员,技术上,我会介绍一些自己感兴趣的库(最近爱上了github),同时自己应该也会有机会开源一些自己的库。同时,引进一些项目的想法,希望有人可以一起来完成。

除了技术,还有关于产品的想法,对游戏设计的想法,比如分享玩过游戏啥的。

还有,既然换了新地方,这也不是CSDN了,我将来会更多的分享我看过的书,看过的电影,体验过的设备,写些和技术无关的东西。这样的模式,最后可能接近阮一峰的博客 ,不知道最后能发展成什么样,都尝试一下吧。

阅读全文....

UnityScript程序设计语言

UnityScript(即javaScript for Unity)的教程网上千千万, 中文的也不少, 但是讲Unity3D界面操作的多, 讲UnityScript这个语言的少, 同时对于UnityScript的描述部分, 也是入门的教程多, 对语言特性的描述少, 能够成系统的我就根本没有找到过. 连续的看了不少的Unity3D的文章, 书籍, 但是发现写代码的时候, 对UnityScript的细节掌握仍然不甚了了, 也就是对怎么写UnityScript效率更高, 更加符合语言设计的目的, 风格等事情并还没有清晰的认识. 这个对于习惯写脚本的人来说, 可能是常态, 对于习惯C++我来说, 简直难以忍受.

看到这样的名字, 学过编程的人都知道我是模仿了经典的C语言教材, 目的也是一样. 本文的目的不是再多写一个教程, 而是希望对UnityScript这个语言进行一个较为深入细节, 并且准确的描述. 也就是说, 相对于教程, 本文会更加像一个语言说明书. 同时, 更不用说的就是, 本文会甚少涉及Unity3D本身的界面操作, 仅仅关注于UnityScript这个语言, 不要希望通过本文学会Unity3D, 但是, 当你对Unity3D有了些基本的了解后, 希望写一个大型游戏时, 本文会对你该怎么写脚本, 怎么写对脚本, 怎么样写好脚本, 并且避免掉进语言的陷阱中有一些帮助.
更进一步的说, 因为UnityScript完全是Unity3D控制的语言, 同时仅在Unity3D中可用, 所以对于UnityScript来说, 甚至于连哪些是属于语言本身的特性, 哪些属于库的扩展, 这些都分不清楚. 这比Objective C还混乱… 在Unity里面想要完全的区分开库和语言几乎不可能, 但是本文还是会尽量做这方面的尝试, 尽量将本文的主要关注点放在语言上, 而不是库上.

阅读全文....

怎样在Unity3D中使用Json

Unity3D中的javascript有些特异,和普通的javascript差异很大,其中eval就没法在iOS下使用(其实我在桌面版本也没有使用成功过)使得Json解析这种在javascript中非常原生态的事情变得不那么直接了。

直接使用eval后Unity3D给的错误信息很高端,我是没有看懂,应该是没有找到eval这个通用的函数:

Mono: AssemblyAssets/Scripts/Example/JTianLingExample.js(1,1): BCE0172: `UnityScript.Scripting.IEvaluationDomainProvider' interface member implementation must be public or explicit.

在网上找到了litjson库,通过这个支持.Net的库来曲线救国,折腾了一下,基本搞定。看网上讲litjson的资料很少,并且以C#居多,我这里就记录一下。

LitJson配置步骤

1.讲litjson的源代码中所有.cs文件放到Unity3d的assets中的plugins目录下,当然,在plugins下再建一个目录最好。Unity3D文档描述中plugins目录中的脚本会先运行,这样保证在我们写其他脚本的时候,litjson已经加载并运行好了。不然的话,等着报这种错误吧:
Mono: Image addref Mono.Cecil 0x1757740 -> /Applications/Unity/Unity.app/Contents/FramAssets/Scripts/Example/JTianLingExample.js(5,20): BCE0018: The name 'LitJson.JsonData' does not denote a valid type ('not found').

2.讲源代码放到plugins目录下后,会发现在Unity3d的editor中运行已经正常了,但是monodevelop中写javascript来调用litjson还是会报错误,也就是说monodevelop还是没有先运行litjson。因为C#的代码和javascript的代码在Unity3d生成的 项目中实际在几个不同的Project中,我们需要再配置一下:
在MonoDevelop中的Project->Edit Reference->Projects中,选择一下引用项(就像VS中添加项目依赖一样)
这里我们也会看到,放在plugins目录下的会放在Assembly-CSharp-firstpass中,而一般的脚本会放在Assembly-CSharp目录中。选上Assembly-CSharp-firstpass。

此时再在MonoDevelop中编译代码,顺利编译成功。

LitJson使用方式

1.解析json:

var s : String = '{"name":"jtianling", "phone" : ["135xxx", "186xxx"]}';
var json : LitJson.JsonData = LitJson.JsonMapper.ToObject(s);
print(json['name']);

if (json['phone'].IsArray) {
  for (var json_data : LitJson.JsonData in json['phone']) {
    print(json_data);
  }
}

输出名字和两个电话号码,如上所示,其实直接把JsonData当一个Map使用就好了,同时,还有一堆用于判断类型的IsXXX变量。比如,上例中,判断是否是数组的变量就是IsArray。

2.生成json字符串:

var data : Hashtable = Hashtable();
data['name'] = 'aaa';
var array : Array = Array();
array.Add('haha');
array.Add('haha2');
data['good'] = array;
var data_string : String = LitJson.JsonMapper.ToJson(data);
print(data_string);

输出:{"good":["haha","haha2"],"name":"aaa"}

也就是把使用map的过程反过来而已,不详细描述了。

另外,我们读取配置文件的时候常常是从文件中读取,我发现用Unity3D读取文件也值得单独写写,这个下次再讲。

原创文章作者保留版权 转载请注明原作者 并给出链接
九天雁翎(JTianLing) -- www.jtianling.com

 

阅读全文....

UnityScript风格指南(UnityScript Style Guide)

公司最近要开新的Unity3d项目了,Google虽然有JavaScript Style Guide,但是UnityScript和JavaScript的区别实在大到了几乎不是同一种语言的地步,这个只能自己动手了。好在起码还能参考一下Google的style guide。

阅读全文....

疯狂猎鸟项目小结 -- 技术篇(主要是cocos2d-x相关)

上次写了篇关于自己浅薄的管理经验的博客,被一些筒子们批评了,这次还是写篇技术贴吧,这样就不会有人说了,因为......那些人看不懂。该文早就和肖寒泉说了要写,但是因为写完后感觉好话不多,技术不多,就一直没有发布,现在我们又要开新项目了,而且不使用cocos2d-x了,那就发布了吧。

先说游戏引擎,疯狂猎鸟用的游戏引擎是cocos2d-x。

在一年多前(大概有这么久吧)就搜遍互联网,去寻找一个能跨win32,iphone平台的开源引擎,以方便进行iphone游戏的开发,只有很少的几个选项,甚至尝试过irrlicht不成熟的opengl es版,最后也尝试了orx,其实都不算特别理想,那个时候cocos2d-x刚刚出来没有多久,第一个支持的手机种类是沃phone,而iphone版本的demo都跑不顺畅,所以没敢使用。那个那时真的是有心自己写一个,无奈能力有限,但是很认可cocos2d-x的方向。

一年以后,当我开始再次为团队选择游戏引擎的时候,又一次的看了一下cocos2d-x,在查看了一下已经与cocos2d无异的demo后,说实话,相当长信心啊,我觉得自己能用到的特性也不会超过cocos2d-x的demo多少,那这样说的话,cocos2d-x就能用了,即使还有bug或者有什么平台相关的问题,因为cocos2d-x是开源引擎,那也不用怕,这也算是开源引擎的一个竞争优势,那就是不用100%成熟就能让人有信心使用。

初步研究后,作为传统的C++开发者(请允许我这样称呼自己),会有些受不了在C++中模拟objc的那种内存管理方式和类的初始化方式。看了cocos2d-x官网上的《Cocos2dxSimpleGame & Tutorials for beginners》后,就能很直接的感受到,cocos2d-x就是为移植而生的,所以文中一再的强调从cocos2d(objc)到cocos2d-x(C++) 几乎句句对译的优势,其实这个优势在真正用C++做原生开发的时候,就比较悲剧,因为这样的使用方式,根本就不是C++ style,你会感觉到内存不是完全在自己的控制之下。再进一步的看到cocos2d-x用C++实现的CCObject,CCAutoreleasePool,用于模拟objc的内存管理方式时,我觉得很悲催,cocos2d-x的作者们太辛苦了....然而,这还不算什么, CCArray,CCSet等objc容器和CCImage出现的时候,我近乎老泪纵横了,这是准备用C++实现一个objc吗?还带cocoa的......这可是GNU组织都没有实现的目标啊......开源社区的强大,让我感叹不已。

技术上,我能讲的东西不多,因为2D方面的东西也的确没有太多好讲。内存管理上,对于初学者,特别是刚刚毕业,学了点C++,连C++本身的内存管理都还没有弄明白的人,看到cocos2d-x绝对是晕的。建议是了解一些objc+cocoa的东西,最好是用过cocos2d,那样你就会明白那么多看起来别扭的设计是怎么来的了。其中,假如真的团队是初学者,那么可以完全限定不用autorelease那一套(也就是SpriteWithXXX那种接口),完全要求使用new来完成对象的创建,同时只是使用Release接口来完成内存释放,其中的管理还是自己完全接手即可,需要注意一个问题在于讲cocos2d-x编译成动态库时(iphone上不存在此问题),这样的做法不满足内存在哪分配在哪释放的原则(内存空间不同的问题),会crash。使用类似autoreleasepool时,实际相当于把最后一次引用技术放到了内存池中,每个循环都会集中清理一次,不用当心完全不会释放。
delegate的模拟机制做的不是很好,因为C++天生就不是适合干这个事情的材料,再加上Object的引用计数等问题,比如Action的回调使用时,保持Action的回调对象存在,一直加一个引用计数啥的(不知道是不是这个意思),容易导致内存管理混乱,同时,delegate的使用很混乱,因为用的是一个单独的基类来管理所有的回调类型。C++11的function,bind假如能用在这里,感觉设计上会清楚无数倍。
抽象上,cocos2d本身是单平台引擎,所以底层的设计本来就没有太多的考虑跨平台的事情,cocos2d-x比较单纯的去模仿,所以在平台抽象上做的就不是很好,比如渲染引擎的切换(opengl,opengl es,directx之间)就没有,导致win32上长期是opengl es加模拟(依赖于厂商的),平台的抽象也不是很好。建议参考irrlicht的抽象方式,哪怕是orx也好。
上面讲了那么多不好的地方,都是我们实际使用的时候碰到的问题,但是总体来说,cocos2d-x还是目前你想开发跨平台2d游戏最好的选择,上面也许只能说是爱之深恨之切吧。
其他的技术方面,texture packer很好用,值得买,particle designer也是粒子编辑器不二的选择。

阅读全文....

新的转变

2012总归是来了,这句话因为某种原因,听起来很悲壮。而这个时候,似乎也是该总结下2011的时候了,虽然过去的一年,我写的博客是越来越少了。 过去的一年对于我个人来说,应该算是工作以来最具有历史意义的一年吧,人生的轨迹在这里算是有了一个转折,或者说,有了一个比较突兀的变化。在年初的时候,我做了一个不那么艰难的决定,离开了那个曾经做出艰难决定的公司,加入了一家不到十人的初创企业,而这,决定了我将经历对于我个人来说最不平凡的一年,事实上,的确不平凡。 以前的工作对于我来说太容易,太没有挑战了,我需要一些更有难度的工作,这话由我说来似乎太过于自负或者自大,但是,这个话是前领导在年初的时候想要让我做出一些改变,给我的一个评价。背后的故事就不多说了,现在想想这个话说的的确有道理,假如我能够在每天晚上学习到半夜2~3点,因为兴趣去研究一些与工作不甚有关系的技术问题,写一堆乱七八糟的技术文章,而第二天半晕着去工作,但是工作却还总是不错的,甚至能够常常受到上级的认可,那这个工作对于我来说,的确有些过于容易了。 说这些没有啥自我膨胀的意思,虽然知道在中国当前环境下说这个话有些危险~~~~其实,说这些只是用于感叹今年我个人角色的一些转变,以及逐渐不那么容易的工作历程。

阅读全文....

移动平台现在可用的C++ 11特性

移动平台特指iOS和Android,并且Android使用的是NDK,因为开发的时候是在Win32平台下,所以还需要考虑VS的支持。

当前(2011-12-21)最新的版本:

Win32: Visual Studio 2010

Android NDK: GCC 4.4.3

iOS: Apple LLVM compiler 3.0(Clang)


本文所描述的C++ 11特性仅在上述三个平台,所写的版本号中有效,请先确认这点。

apache的WIKI上有个较为详细的列表。可以看到,现在能用的特性其实不怎么多:

  1. auto
  2. decltype
  3. extern template
  4. long long
  5. New function declaration syntax for deduced return types
  6. Right Angle Brackets
  7. R-Value References
  8. static_assert
  9. Built-in Type Traits

如下图:

上面是整体的描述,具体的各个编译器对C++ 11的支持情况见下面的链接:

Win32:
Visual Studio 2010支持情况:C++0x Core Language Features In VC10: The Table
Lambdas, auto, and static_assert: C++0x Features in VC10, Part 1
Rvalue References: C++0x Features in VC10, Part 2
decltype: C++0x Features in VC10, Part 3
Visual Studio 2011支持情况:C++11 Features in Visual C++ 11
Android NDK: GCC 4.4.3

Status of Experimental C++0x Support in GCC 4.4

C++0x/C++11 Support in GCC

iOS:

Apple LLVM compiler 3.0(Clang):C++ and C++'11 Support in Clang

The LLVM Compiler Infrastructure

 

使用方式:

1.Build Options选择Apple LLVM compiler 3.0

2."Apple LLVM compiler 3.0 - Language"中"C++ Language Dialect"选择“C++0x" (

3.”C++ Standard Library"选择libc++(LLVM C++ standard library with C++ '0X support)" (默认为"Compiler Default")

其他有意思的东西:

"libc++" C++ Standard Library

在线试用LLVM编译器

最新修改的原文所在地址


原创文章作者保留版权 转载请注明原作者 并给出链接

九天雁翎(JTianLing) -- www.jtianling.com

阅读全文....

三个乔布斯相关的视频

三个乔布斯相关的视频,“谨献给我们这个时代的疯子,那个真的改变这个世界的人” — Steve Jobs。

乔布斯在斯坦福大学的演讲视频

I'm convinced that the only thing that kept me going was that I loved what I did.

我坚信让我一往无前的唯一力量就是我热爱我所做的一切

 

You've got to find what you love, and that is as true for work as it is for your lovers.

所以,一定得知道自己喜欢什么,选择爱人时如此,选择工作时同样如此

 

Your work is going to fill a large part of your life, and the only way to be truly satisfied is to do what you believe is great work, and the only way to do great work is to love what you do.

工作将是生活中的一大部分,让自己真正满意的唯一办法,是做自己认为有意义的工作。做有意义的工作的唯一办法,是热爱自己的工作

 

If you haven't found it yet, keep looking, and don't settle.

你们如果还没有发现自己喜欢什么,那就不断地去寻找,不要祈求安逸

 

乔布斯45秒谈改变世界

在你成长的过程中,肯定一直会有人告诉你:世界原本就是这样,你的人生使命就是在这固有的世界中很好地生存,建立一个美满的家庭,多存一点钱,并尽量寻找生活的乐趣。其实这是非常狭隘的人生观,生活的舞台是非常广阔的。实际上,你生命中很多事物的缔造者甚至还没有你聪明和智慧,当你懂得了这么一个简单的道理之后,你会发现其实你也可以改变生活、影响世界,你可以创造属于你自己的东西,你的生命也将从此与众不同。 -- 来自kr

苹果Think Different电视广告

1997 年苹果的广告,由 Steve Jobs 亲自配音的版本。

Here’s to the crazy ones. The misfits. The rebels. The troublemakers. The round pegs in the square holes. The ones who see things differently. They’re not fond of rules. And they have no respect for the status quo. You can quote them, disagree with them, glorify or vilify them. About the only thing you can’t do is ignore them. Because they change things. They push the human race forward. While some may see them as the crazy ones, we see genius. Because the people who are crazy enough to think they can change the world, are the ones who do.

这是送给那个「疯子」、那个「不称职」、那个「叛逆份子」、那个「麻烦制造者」,那个用不一样的角度看这个世界的人。  他不喜欢规矩,对现状没有任何尊敬。  你可以引述他、你可以反对他、把他视为大师或是把他视为小丑。但有一件事情你没办法做,那就是忽略他。因为他改变这个世界,他把人类向前推进。  或许有些人认为他是一个疯子,我们认为他是一个天才。因为那些疯狂到认为他可以改变这个世界的人,才是那些真正改变这个世界的人。

 

阅读全文....