Yet another trap of CocoaPods

Creating a pod in my private repo, it worked fine till I made some uncertain changes. Now running ‘pod install’ in Example will complain:

Resolving dependencies of `Podfile`
[!] Unable to satisfy the following requirements:

– `DataModel (from `../`)` required by `Podfile`
– `DataModel (from `../`)` required by `Podfile`
– `DataModel (= 0.1.0)` required by `Podfile.lock`

And eventually, I figured it out, it is caused by iOS platform version which I just modified to reflect truth of framework in bundle requires 8.0.

  s.platform     = :ios, ‘8.0’

It works like a charm when the version is 7.0 or 7.1 . How could it be so weird?! Well, it is not weird indeed, I just didn’t give the iOS version in Podspec file. It will work with right iOS platform version, like:

platform :ios, ‘8.0’

The error information didn’t mention platform version, it should have saved my day!

Xcode7 的两个小坑

Xcode7 还在 beta,时不时崩一下什么的倒也是预料之中的事,没料到的是之前用着好好的,今天升完 El Capitan 之后,模拟器居然不见了,设备倒是在 schema 栏右边里能看到,不过注明不能用。

看了看系统日志是 Simulator 服务不停的崩。查了查,有人已经分析过了:
http://stackoverflow.com/questions/31551480/xcode-7-beta-4-ios-simulators-missing-and-not-installable
简单点说,去把7.x / 8.x 的 simulator 映像文件都移走或者干脆删除,就好了。

另外,beta4 会报怨 CoreData 模型文件没有指定版本号,这新建的文件哪来的版本好,在 Editor 里给建了一个版本终于不 warning 了。

Install MacPorts on Mac OS X 10.11

Just notice MacPorts is missing after upgraded to 10.11 beta, need re-installing.

Downloaded MacPorts 2.3.3 source tar ball, but configure complains there is no Foundation framework. And it is solved by xcode-select -s to switch to Xcode7-beta:

sudo xcode-select -s /Applications/Xcode-beta.app/Contents/Developer/

Little tricks with XCTest

Tried to call all other tests in one test function.

    // alternate what setup done
    // full tests in alternated state
    NSArray * tests = [FileLibraryTests testInvocations];
    for (NSInvocation * inv in tests ) {
        NSString * sel = NSStringFromSelector(inv.selector);
        if (![sel containsString:@"WithInit"] && ![sel containsString:@"Monitoring"]) {
            [inv invokeWithTarget:self];
        }
    }
    //back to normal state

And just noticed XCode6 added XCTestExpetation, no longer need semaphore like:

    #import 
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
dispatch_after(dispatch_time(0, (int64_t)(0.2 * NSEC_PER_SEC)), 
        dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), 
        ^{
            ... dispatch_semaphore_signal(sema); ...
        }
    );
dispatch_semaphore_wait(sema, dispatch_time(DISPATCH_TIME_NOW, 30*NSEC_PER_SEC));

It is much simple to test async operations now:

    XCTestExpectation *expectation = [self expectationWithDescription:@"xxx"];
// invoke it in code async executing
    ... ^(){
        [expectation fulfill];
    } ...
[self waitForExpectationsWithTimeout:1 handler:^(NSError *error) {
        // cleanup.
    }];

CocoaPods and objc_msgSend

I got this “Too Many arguments to function call, expected 0, have 3” error while compiling a project relies on QuickDialog.

According “https://developer.apple.com/library/ios/documentation/General/Conceptual/CocoaTouch64BitGuide/ConvertingYourAppto64-Bit/ConvertingYourAppto64-Bit.html”, it is easy to fix, just cast the function to right prototype, like:

int (*action)(id, SEL, int) = (int (*)(id, SEL, int)) objc_msgSend;

But, the invocation is in a pod project which is locked for editing and even if I unlock it, the change will lose at next checking out of the project.

Further peek at objc/message.h shows it is a trick to help compiler ensuring the call is with right frame, the signature is still available with OBJC_OLD_DISPATCH_PROTOTYPES micro. Then I found the:Screen Shot 2015-06-12 at 9.27.25 AM

Set “Enable Strict Checking of objc_msgSend Calls” in QuickDialog target of Pod project, done.

原型工具小结

耍了一堆原型工具,感觉可以分成三类:

  1. 动图型:已经有界面的图片了,不管是手绘还是 PS / Sketch 3,有许多工具都可以导入后加上热区跳转和交互效果了。
  2. 描绘型:提供各种图形组件,可以快速描画界面,普通可以快速实现界面跳转,复杂的交互和条件处理只有少量组件可以了。
  3. 编程型:无论是直接拿 html/js 开练,还是拿 Quartz Composer 用图形语言写,本质上都是在编程了,看用的人会写js还是熟图形处理了。

目前看下来,还是 Axure 功能比较全面,其它的工具处理处理小项目还成,管理复杂项目还是费劲点。Pencil 这个开源项目其实很不错,就是蛮久没人维护了。

Apple Watch 使用小结

Apple Watch 到手有些日子了,用下来还不错。

最为担心的问题是电池,实际表现非常好,我基本早上7点带上,到晚上23点左右取下来,正常一天下来还剩40~50%的电量,工作日活动比较少且没时间不停折腾表的话,2天其实也坚持得过来。

运动探测不是太准,比如我在键盘上工作时,它有时就会误判而影响久坐提醒,1.0.1说改进了算法,希望会好一点。

抬腕亮屏需要的加速度或行程比较大,有时手本来就抬着,再举到眼前偶尔会有不亮屏的情况,需要再来一次;而开车时,转动方向盘则会经常自己亮着,是经常呀,这个略浪费电。

导航功能就是个样子货,还是手机开语音比较实在。接电话很酷,特别是开车的时候,方便多了,就是音质实在太差!

现在改用太阳表盘了,每天看看日出日落时间还蛮酷的, Module 表盘太快就看疲劳了。

第三方应用普遍还打磨得不大够。

微信,消息功能做得还比较完整,能收能看能开朋友圈,就是时不时跳出来说“您收到了一条消息”又不告诉我是啥,而且打开消息时速度比较闹心。在对话里图片处理也不细致,似乎是按比例缩放的,而不是占满全屏,经常大一点又不是正方形的图片会看不清楚。但凑合着用还是可以的,且而微信手机版本的主界面还蛮好看的。

微博,有直接消息时还是会弹通知的,还可以回,不过万一当时没回,就再也看不到了。平常它在手机上只会卖萌,完全没用,那个计步功能现在也没搞清楚怎么生效,反正我这儿一直是0.

Twitter 做得还是不错的,可惜没 wi-fi 时翻墙比较烦人,基本只拿来收通知了。丫的 iOS 客户端我没找到在哪里设置代理,Android 版本倒是很好找。

搜狐视频动作很快,已经有表上的播放控制和个人收藏查看功能了,不过它没法控制 iPad 上的播放呀,手机我就拿手上看了,放远了看不清楚呀。也试了 AirPlay 到 Apple TV 上,这个不知道是我不会用还是咋得,音量似乎控制不了,也不能控制 airplay 切换。顺便吐个槽,在 iPad 上做个看得见的 AirPlay 目标切换菜单就那么有挑战性?

淘宝有交易时会弹通知,不过平时基本在捣乱,时不时发一个上边“手机淘宝”,下边“关闭”,中间啥也没有的消息是几个意思?招行的客户端就文明多了。

听说这货防水其实很 NB,不过坏了不保,想来想去还是没带它去游泳,反正也没有游泳统计模式。

最后越来越觉得还是应该买 42mm 的,特别是被某人吐槽说 38mm 的在我手上颇有基佬范以后。

Apple Watch 初体验

Apple Watch 用了大半天了。感觉很不错,操作流畅,电力持久,屏幕明亮艳丽,就是铝壳比表盘还是逊色不少,应该买不锈钢的。

手表的基本功能自然是时间管理。
默认的时钟表盘一点也不花哨,但是很实用:时间、日期、最近事项提示、运动量摘要、气温都有了。如果不满意,用力按一下,就可以换表盘了,还可以对现有表盘做一些定制,试下来还是觉得默认的实用。
自带的世界时钟,能够自动同步我在手机上添加过的地区;自带的秒表,设计很花心思,默认的视图是一个大表盘,最近一圈与总时间用两根不同颜色的指针显示在表盘上,上划一下,则进入具有分、秒、厘秒三个小表盘并附每圈记录清单
自带的小定时器非常直接,默认最多12小时,用力按一次则可以切换12/24小时。
自带的日历就略显简陋,默认显示从今天起的待办事项清单,可以滑动到以后的日子,点左上角的日期可以显示整个月,但是似乎不能切到其它月。用力按可以将清单换成今天视图。
自带的闹钟功能齐全,可以用力按新建闹钟,点击已有的闹钟可以修改时间、重复、提醒等等,功能很全。不过,在我这个38mm表盘上操作实在让人精神紧张,还是用 Siri 设置闹钟更舒服。

另一个基本功能则是运动和健康管理。
自带的健康活动非常简单,久坐会提醒我站起来活动活动非常有帮助。不过 Apple Watch 防溅不防水,不能带着游泳,是个遗憾,我目前主要靠游泳锻炼身体。
自带的健身功能也不错,支持各种常见的锻炼方式。我家小 Nemo 发现它之后,就开了室内跑步在家来回跑,玩得可欢了。结束时会提供热量消耗、心率等统计数据。
另外装了 Nike+ Runnign和咕咚运动。Nike+需要先在手机上完成设置,它会下载 viavoice 套件,可以在跑步过程中播放音乐、打气,当然也有各种统计和朋友间的排名。咕咚的功能也挺全,支持的活动类型挺多,就是需要在应用里先绑定一下健康设备,允许读写健康数据,这个没有放在初始设定过程里,有点小绕。

通知与消息
将各种通知弹到手表上,这种提醒方式很方便。手机经常需要静音,不静音也会时不时错过。手表会把通知显示在表面上,如果错过了,从顶上向下划一下就会显示清单了,跟 iPhone 上的方式是一样的。除了系统本身的短信、电话、邮件,微信、微博、QQ、Twitter 这类消息型应用,支付宝、招商银行掌上生活等也会有提醒。不过居然没看到 Facebook。

微信在手机上能够正常使用,不仅可以看消息,还可以发消息。微博则选择了另一个方向,做得比较好玩,感觉是猜测新上手的手表用户们应该急于显摆,所以提供了第多少位手表微博用户和朋友圈里运动量排名的功能,有新消息时也可以看、赞,但发不了消息,可以用力按然后分享到微博。我是第21090位用户,可见国内已经发了不少货了。

工具
系统自带了挺多功能的,向上划一下,会有:
手机连接状态与控制,音乐(会在手机上放而不是在表上),心率,电量,健康活动,日历,天气,股票,地图,和日照情况。

mwCalculator 是个小计算器,咋一看只有数字,还是挺困扰的,用力按也没用,后来发现是点击结果显示区域切换数字和运算符,这个就不应该用同样的颜色了,最好再加一个视觉暗示。

用手表来控制 Keynote / PowerPoint 是个很酷的主意。 Keynote 的手机扩展可以自动发现电脑上运行着的 Keynote 并控制翻页,就是测试的过程中断掉过一回,着实让人担心。

电池续航能力确实有点让人担心,14.5小时左右从100%到1%,其中打了1个10分钟左右的电话,下班高峰时段导航了约么10公里走了约30分钟,测量了1.7公里的户外步行约30分钟,额外测过五六次心跳,其余使用应该还在日常范围之内。

用 CSS 给 FORM Input 换行

自从若干年前看过《超越CSS:WEB设计艺术精髓》一书之后,再看 HTML 源文件就经常有各种心理障碍。刚才试着写个小注册表单,就有一个字段分行的问题。直接写:

<label><input>
<label><input>

会连成一行显示。这个问题非常容易解决,不管是用 div/p/br,还是用 label 包住 input 然后 display:box; 之,都可以达成效果。前者插了一堆没意义的标签,而且把布局与内容混为一体了;后者逻辑上感觉不太对,label 是 input 的一个修饰件才对嘛。

这个问题应该用 CSS 解决。直接的想法是 input:after ,不过 content:’\a’ 不起作用,又不能放标签,试了一下附个图片把后边的东东挤开,也没成。
再试 label:before,这回成了。
label:before { content: ‘\a’; white-space:pre; }


折腾图片的时候又掉坑里了,在 meteor app 里图片死活出不来,iron-router 总是跳出来说 template 找不着,明明图片是放在 public 下面,iron-rotuer 也是v1.0.7呀。各种疑神疑鬼,好久才发现,这 public 自己放到 /client 下边了,挪回顶上就好了。

** 扔草稿箱里居然忘了

Apple Watch hands-on

Apple send me the watch earlier than planned.

box

slide down to open

move away the document and additional  band(There are documents and an additional band in the bottom paper bag)

 
open the case to see the watch

back side of the watch with protection  skin

on my wrist

choose languague after first time turned on

confirm the language chosen

setting the language

prompt to pair with iPhone

showing the animation

show in animation

launch app on the iPhone

show watch screen in iPhone camera to pair

the phone recognized the watch

Apple watch confirms paired

left-right hand

LUA on iPhone screen

guides - map

guides - siri

guides - statistics data

guide - passcode

guide - ready

synchronizing app the watch is ready to go