介绍下:这个是参考网上例子做的一个PC机上的苹果蓝牙无线一体的适配器。这个蓝牙本来笔记本上用的,放到PC上来就要做些调整。主要调整就是把USB的5V电压转成其需要的3.3V电压,上面的三脚贴片就是转换电压的。但是最难的还是布线上面,一则蓝牙的数据线是扁平的接口,比较难弄,二则板上的USB口不好固定。感觉如果不重新印刷电路板要做最后的成品干净利落是很难的。
为搞这个东西前后损失了4个蓝牙适配器。掩面。东西太小,手太糙。
玩星际争霸二了快半年,颇有感触啊!
即时战略游戏的一个要求是反应快。面对瞬息万变的局面,要快速转变打法,一旦发现别人出克制你的兵种,得马上调整。在敌人防守、屯兵、开野矿、或者偷袭的情况下,自己的打法也不同。切不可一条路走到黑。我这个人一直都是慢半拍的,还有点一根筋,真要命。
我以前玩游戏跟电脑玩的多,跟人玩的少。确实跟人玩更有意思点,不过我容易紧张,一盘游戏下来就发现肩酸。紧张的话就思路混乱,微操作也很难了。过于注重胜负的人就容易这样。
有计划的更容易战胜对手。比如你几兵营开具、暴某种兵,对方如果没有及时发现,一般很难应对。这个跟围棋下子求“先”很一样,谁先变谁就能掌握主动。如果想后发制人,一陷入被动就难办了。
兵贵神速,贵在奇。稳扎稳打是一法,就是容易疲于奔命、陷入被动。
对于“玩”要辩证的看,玩并不是玩物丧志,只是一种更快学习的手段。
最近家中被盗,小偷半夜从窗户侵入室内,将手机、首饰、笔记本电脑银行卡等细软一具卷走,估计直接经济损失人民币3万。意外的是小偷从包中捡出工作牌牌,这样我第二日可以正常朝九晚五,虽不能连上办公网络发出自己存在的证明,但还好没有发生被拒之门外的尴尬。还有一喜就是我手机卡办了实名制,花15元就重新找回自己(身份证我保管的很好)。所以被盗后情绪还算稳定,也为小偷的贴心而感动:盗亦有道啊尼码的。
我手机原来用的是用了两年多的HTC G1,被盗前电池撑半天都难,程序打开也很慢。被盗后我换了个Nokia 2630c,400¥,支持WCDMA,而且电池据我观察撑个3天没问题。不想换智能机,没钱。android, ios哥都折腾过,智能机不就是愤怒的小鸟+僵尸+切西瓜+切绳子么。无趣。地铁上还是发发呆好,上了一天班么,回回血。
ipod Touch也没了,想买个ipod Nano,发现现在的新版的是很小,还触摸屏的,不过要别在胸前,有点傻。其实我只想在地铁上听听歌,这样比较容易发呆。于是搞了个微软的zune,8G,400¥。(后来发现这货不能显示中午歌曲名,好吧,我忍。)
死里逃生的人大概都有这种感觉:重来一次生命是多么不容易,重来一次鸡肋的体验是多么的恶心人。
Dojo上一个普通的Ajax调用:
var xhrHandler = dojo.xhrGet({url:this.url,
handleAs:"json-comment-optional", content:serverQuery});
xhrHandler.addCallback(dojo.hitch(this, function(data){
this._xhrFetchHandler(data, request, fetchHandler, errorHandler);
}));
xhrHandler.addErrback(function(error){
errorHandler(error, request);
});
addCallback时,如果deferred已经完成,则传入的function被立刻执行。所以如果上面的xhrGet很快执行完成,则加入的callback也会被执行(这个时候消息队列为空),如同代码顺序执行。如果xhrGet较长时间完成,则加入的callback会有异步运行的效果。
上面的代码感觉很奇特,有种时空的错觉。如果dojo.xhrGet(..).addCallback(…).addCallback(…)则好点。
这个东西叫Promise,在CommonJS有单独的列出来,写法可以这样requestData(“foo.bar.com”).then(…).then(),看上去直观了很多。新的Dojo.js语法里面也有这个东西,不算新,只是我对Promise这个词很感兴趣,还有Future。
当命名一个抽象概念时,名字很重要啊!
后来搜了下,原来Future在java中也有这个概念,可以参考这篇中文的文章(把callback和actor鄙视了一通),大体上讲就是把一个异步的程序转为顺序的写法:
ExecutorService executor = ...//copy from jdk doc
ArchiveSearcher searcher = ...
void showSearch(final String target)
throws InterruptedException {
Future<String> future
= executor.submit(new Callable<String>() {
public String call() {
return searcher.search(target);
}});
displayOtherThings(); // do other things while searching
try {
displayText(future.get()); // use future 这个地方会被block
} catch (ExecutionException ex) { cleanup(); return; }
如果会被block的话,还有啥意义呢?不过代码的逻辑清楚很多。
正式的解释在wikipeida上面有:http://en.wikipedia.opreiki/Futures_and_promises Futures and promises.
看这篇dojo tutorial,你发现原来dojo.then其实对应上面的future,也就是一个包含返回数据的对象(js不需要用get方法),dojo.when的用处就是使普通的数据和“将来”的数据统一使用。Wikipedia对java需要get的方式为显式的future,而dojo的为隐式的。
在Actor模式中也会用到future,具体参考Akka的这篇文档。(Akka的文档比Scala完善很多,而且有java的版本,上手很容易。上面说Future is Monad,晕啊)
Future[Object] future = actorRef.sendRequestReplyFuture[Object](msg); Object result = future.get(); //Block until result is available, usually bad practice
actor之间可以用message来访问,上面的方式方便了非actor访问actor。如果系统明确的划分成几个Actor,则future使用的地方很少。