使用Swift(1)

序言 Apple新推出的Swift编程语言无疑会成为最近码农研究的热点,现在官方有一本官方Guide,这本书已经有国内的开发者开始翻译了(#该来的总会来的#)。 当然只看完Swift的语法还不足以进行Cocoa应用开发,用郭总的话说,语言并不会带来新的起跑线,要想开发优秀的Cocoa应用还是需要对Cocoa这个框架的深入理解。这就跟用RubyMotion仍然要学习Cocoa是一个道理,万变不离其宗。这方面就可以参考Using Swift with Cocoa and Objective-C这篇文档。 另外,Swift刚刚推出一天就已经有开发者用它开发了FlappyBird,可见大家对这门语言的热情。这个系列的博客主要是记录我在学习Swift语言过程中感觉有趣的语法、用法,并不会对所有语法都逐一进行分析,而是举几个简单的例子帮我自己来理解Swift这门语言。如果这些例子能帮助你对Swift这门语言建立一些基本的认识或者感觉,那就再好不过了! PS:博客内容的记录顺序大部分是根据官方Guide来的,因为这是我的阅读顺序,在阅读过程中可能会根据我的理解跳跃穿插一些内容。另外因为我也是在逐渐阅读文档,所以可能写过的内容会有多次修订。 环境要求 要使用Swift必须要安装Xcode 6 Beta版,安装Xcode6不需要10.10,在10.9上就可以使用。 代码 本文中使用道德测试代码都可以在SwiftWithCocoa这个repo中找到,大部分代码都在MyPlayground中。 “变量”不变 第一次接触这个概念是在了解Scala的时候,Scala中有两个关键字,分别是val和var,用var声明的变量跟其他语言中的一样,可以改变值,但是val声明的变量,一旦第一次赋值之后就无法改变了,也就是所谓的“变量”不变。这种类型主要应用在多线程的场景中,可以有效的避免资源抢占,死锁等情况的发生,从语言级保证了代码的稳定性和执行效率。 Swift也提供了类似的声明方法,分别是let和var,用let声明的是常量,用var声明的是变量。 基本数据类型 Tuple Tuple应该是我从python、ruby转到OC之后感觉最需要的类型。Tuple最大的贡献在于能轻便的创建一些临时对象,并在不同的领域使用。比如函数返回的时候可以利用tuple便捷的返回多个值,这是现在很多流行语言都支持的。 // Returning from func func response() -> (Int, String) { return (404, "Not Found") } var code: Int, description: String (code, description) = response() // code == 404 // description == "Not Found" 我记得我最开始学python,交换变量的方法真是让我震惊了,Swift里面(因为支持了tuple,所以)也有类似的方法了: // Swapping vars var first = 1 var second = 2 // Change 2 to "ASDF" and see the error (first, second) = (second, first) // first == 2 // second == 1 需要注意的是,因为Swift强调的是类型安全,所以上面例子中的first和second必须要是同样的类型才能交换,如果类型不同需要进行显式的类型转换,下面会进行讨论。

在node-webkit中使用sqlite3

这两天在调研使用node-webkit开发Mac应用并且提交到Mac App Store的可能性。这类客户端应用有非常通用的一点就是需要一个本地数据存储功能。根据node-webkit的官方wiki,我觉得最适合的就是所谓的Web SQL Database了,同时文档中也说是使用sqlite3来实现的。因此就需要实现sqlite3与node-webkit的整合。 为了测试,我直接clone了一个windows版的demo。最开始我的尝试是使用node-webkit 0.9.2版(使用最新版的目的是为了保证node-webkit没有使用一些过时的或者private的api导致MAS审核悲剧)。首先我用npm install sqlite3安装了sqlite3 for node,结束之后运行nw node-webkit-sqlite3-windows-demo,结果提示error: Error: Cannot find module '/Users/voidmain/WorkSpace/NodeJS/node-webkit-sqlite3-windows-demo/node_modules/sqlite3/lib/binding/node-v11-darwin-ia32/node_sqlite3.node' 如果直接google这个错误会有人说明使用nw-gyp rebuild --target=<node-webkit-version> --arch=ia32来rebuild一下(如果没有安装nw-gyp的话需要先npm install一下),但是使用node-webkit 0.9.2的话,编译不会通过,会提示有error,于是继续google,终于在sqlite3项目的issue 265中看到了这个: 看来是死胡同了,无奈只能使用更早版本的node-webkit,所以我换成了node-webkit 0.8.6版,然后再次用nw-gyp编译,还是出错,错误是Undefined variable module_name in binding.gyp while trying to load binding.gyp,继续google,最后又在wiki中找到了解答:Build native modules with nw gyp,关键的一段是: For some packages you may need to use node-pre-gyp (e.g. when you get the error “Undefined variable module_name in binding.gyp while trying to load binding.gyp”), which supports building for both node.

NSUserDefaults无法保存?

FML。。花了一上午调了一个bug。。 事情是这样的,我正在写的这个mac应用用到了Core Data,所以就把Core Data的文件放到了~/Library/Container/my.app.container这个目录下。但是在开发的过程中entity的结构总会发生变化,在基本稳定之前我也不想写升级那些,所以就偷懒*把container目录给删了*。 上午在用NSUserDefaults保存用户的选项的时候,当前保存成功,调用[[NSUserDefaults standardUserDefaults] synchronize]也返回YES,但是就是重启应用之后保存的内容就消失了。去~/Library/Preferences目录下找也确实没有对应的文件。 调了一上午,尝试了各种解决方案,也没搞定,最后终于在这个SO问题里面找到了答案。 关键是answer下面的第一个comment: Also if you move the container while testing / debugging to the trash, the cfprefsd (see Activity Monitor) still keeps a link to the .plist. Empty the trash and force quit both cfprefsd (user and root). 用ps一看果然有2个cfprefsd,有一个应该就是之前删除container的时候留下的,把它kill了,然后重试就好了! 感谢 @mahal,真是救了我一命!

关于Leadership

今天被朋友推荐看了一段视频,叫”Leadership From A Dancing Guy”: youtube地址: youku地址: 无解说加长版地址: 我的思考 如果想要引发一场潮流的话,首先你要有勇气站出来,表达自己的观点 你的观点(产品)必须容易被其他人接受(所谓easy to follow) 作为最开始的leader,你需要尝试辅导最开始的几个follower,因为他们很重要(if the leader is the flint,the first follower is really the spark) 如果想要引领潮流,不要想着“你”到底有多重要,重要的是这场潮流(movement) 作为leader不要怕失败,从那个加长版本可以看到,他最开始试图教好几个人如何跟他一起跳他的舞蹈,但是都失败了,可是他仍然自娱自乐,没有停下来 换位思考,如果你看到有人在尝试引发一场潮流,而你觉得他的行为能吸引你,不要犹豫,站出来成为first followers,帮助一下leader吧!

How to Use New Android Animation API for Compat Fragment

Why Since honeycomb (API level 11), Google has introduced a new set of APIs to help developers build better app, including Fragment and property animation. These new APIs are great, but they are not quite compatible with older devices, thus Google provided a support library to solve this problem. While building my app, I’m trying to use the compat fragment to support as many devices as possible, meanwhile, I want to take advantage of new set of animation apis to create animation easier.

[更新-教程]如何在Mac上玩儿国服星际2(原生,非port版)

##更新 前一阵重装了一次星际2,发现可以直接通过暴雪登陆器mac版安装,所以之前的方法就作废了,登陆器使用方法请参考官方博客。 –原文– 星际争霸2更新虫心之后,以前的通过region.xml在Mac上移植方法好像失效了,好不容易找到了一种解决方案,把我操作的流程写下来,希望能对大家有帮助。话不多说,进入正题。 准备工作 要实现这个流程准备工作的任务还是挺重的,主要分为一下几步: - 在Windows上下载一个星际2的客户端,用网易提供的绿色版就行。 - 在Mac上下载台湾(美国应该也行,我没测试过)服务器的Mac客户端。在Mac上进行安装,注意,不用全部更新完成,更新至绿色可执行状态即可。 - 下载Support.dmg和SC_II_apps&toolsCN[2.0.6.25180].dmg两个文件,注意,不要用浏览器打开,用迅雷直接下载URL。 开始替换 ~~以上内容全部下载完成后就要开始操作了: 1.把国服绿色版压缩包解压。 2.把Support.dmg和apps&tools.dmg里面的内容复制到解压路径下,必要时替换对应内容。 3.把Mac上台湾客户端下的StarCraft II, StarCraft II Editor,StarCraft II Public Test和Versions的内容复制&替换到解压路径下。 4.启动游戏,这个时候游戏的客户端可能会一直停在初始化阶段,可以从菜单中选择修复客户端,然后静静的等着它完成更新。 5.更新结束后,点击执行,这时候发现,客户端的右边多了中国特色的几行字,恭喜你,成功了! ~~ 说明 我之前使用了挺多种方法的,可能在某些步骤上由于之前方法遗留的内容导致与各位的流程不太一致,但基本思想应该是通用的。另外,坛子里面有人说不能更新,我倒是没有这个问题。 致谢 这篇博客的方法主要依赖于这个博文,感谢大神提供的方法。最后上图,并祝大家gl hf!

[教程]如何在Mac上玩儿国服Dota2(非port版)

很多人不买Mac的原因(之一)是Mac上没啥游戏,这一点确实没错,不过仔细想想大家有多少时间玩儿*那么*多游戏呢?其实平时有一两个长玩的游戏也就不错了。另一方面,很多著名游戏例如WOW,Dota2,SC2,D3等等都有原生的Mac版,本来就没有太大的游戏障碍。 *但是*这些游戏都没有原生的国服版本,真是悲哀啊。于是Mac党只能自立更生,寻找解决方案,这篇博文就是教大家如何在Mac上玩儿原生的Dota2。接下来还会写一篇关于如何在Mac上玩儿原生国服星际2的教程。 准备工作 言归正传,要想在Mac上玩国服Dota2,首先需要有一个完美世界的帐号,以及Dota2激活码(等公测了这个激活码应该也就不是必须的了)。为了进入游戏,还需要一个Steam帐号。有了这些就万事具备了。 绑定帐号 在Mac上安装Steam平台,并用自己的steam帐号登陆,这个时候直接搜索Dota2应该是无法找到的,好像是对中国地区不开放的原因,所以需要在朋友或者自己的windows电脑上,下载国服的Dota2客户端,然后用Steam帐号登陆,并绑定自己的完美世界帐号以及Dota2激活码。 下载内容 绑定结束后,再次登陆Steam平台,就会看到Dota2和Dota2 Test两个游戏,如下图。其中Dota2 Test是Beta版本的Dota2,一般用于公测,*注意*:下载这个版本的Dota2是无法登陆国服的,因为国服没有对应的服务。所以咱们直接下载Dota2就可以了。等待下载完成。 设置参数 下载完成后,在Dota2这一项目上点击右键,选择Properties选项,点击Set Launch Options按钮,在弹出框中输入:-perfectworld steam,然后点OK,如下图。这样一来,就指定了Steam运行的是完美世界的服务,也就是国服了。 Have Fun 准备就绪后就可以启动游戏了,在我的本子上测试效果还可以,稍微有点模糊,另外,因为Steam上下载的内容是英文版的,所以人物的对话和配音都是英文的,这一点应该可以通过将国服对应文件复制过来解决,但是我没有具体检查文件列表,有兴趣的朋友可以研究下,并且欢迎给我留言,我好即时补充。借用Dota蛋疼集锦里面小Y的话吧,Don’t worry, be happy!

What I have learned from terminal-notifier

The terminal-notifier is a cute command-line tool written by alloy that sends User Notifications for OS X systems running 10.8 or later. There’s not so much code down there, but still I’ve learned a lot, and here’s what I’ve got: Architecture Overview There are two major parts in this project. To deliver NSUserNotification or respond to user click event, we need a Cocoa App even though there will never be a display window or something.