OS X 中有关拼音声调的 tricks

输入“hǎo”

输入带声调的拼音字母,在 iOS 上是非常简单的,在拼音输入法里,长按一个韵母字母,即可弹出声调选择框。
iOS上的拼音音调

但在 OS X 上,在拼音输入法下长按变成了连续输入,而不会弹出声调选择框。在英文输入法下长按虽然会弹出声调选择框,但不是汉语拼音标准的声调,最大的影响就是,里面找不到三声。
英文输入法的音调

解决方法是,添加输入源“美国(扩展)”,选择这个输入源,然后:

  • option + a,再按 a,可得到 ā。
  • option + e,再按 a,可得到 á。
  • option + v,再按 a,可得到 ǎ。
  • option + `,再按 a,可得到 à。

拼音输入法按声调筛选

输入全拼后,按 option + tab,可按声调筛选。
按声调筛选

输入“犇”

复杂文字的输入可进行拆字输入,如犇,可输入 niuniuniu(三个牛),然后按 shift + space,还会贴心地告诉你这个字的读音。
拆字输入

从 Evernote 迁移到了印象笔记

一直用 Evernote 做笔记管理,其简单快捷、搜索功能强大、多平台同步方便。2012 年,Evernote 专门推出了中国版,取名印象笔记。值得注意的是,中国版印象笔记与 Evernote International 的账户是完全分离的,中国版的数据完全存储在中国境内的服务器上,访问速度比 Evernote 更快更稳定,你懂的。

我一直没有迁移到中国版的印象笔记。虽然印象笔记团队声明会给中国用户一样的数据安全保证,虽然我只记录一些技术内容和平时的想法,但总觉得哪里怪怪的。

但是最近,Evernote International 经常变得访问及其缓慢。尤其是在 Mac 版客户端上,经常出现笔记内容为空的情况,昨天甚至把之前一篇笔记的内容弄丢了。唉,迫于无奈决定迁移到印象笔记。

迁移方法可参见印象笔记知识库。我采用了 NoteDup 工具,只要用 International 和印象笔记的账户分别授权就好了。不过图片比较多的笔记会非常慢,甚至卡在那儿无法继续进行,如果有这种情况发生建议直接跳过去,手动迁移这一条笔记(一个晚上都没复制过去啊亲)。迁移完检查笔记数量,发现少了一条,找了好久终于找到了那条没被复制过去的笔记,我唯一能想到的原因就是笔记里有 g 和 f 和 w 这三个字母的组合了…

迁移之后速度大大提升。

My new computer - Mac mini

前些日子买了 2014 版的 Mac mini,这也是我自己的第一台 Mac,之前都是用黑苹果和办公室里公司配的 iMac。

My Mac mini

回想一下,自 2000 年爹妈给买了第一台电脑至今,也算见证了计算机和互联网在中国的发展历程。写下用过的三台电脑的配置,也足以看到计算机技术在这十几年来的发展了。

* DIY PC(Oct, 2000) Lenovo F31 Laptop(Oct, 2007) Mac mini(Dec, 2014)
CPU Intel Celeron 2 600MHz Intel Core 2 Duo T5250 (1.5GHz) Intel Core i5-4288U (2.6GHz)
RAM SDRAM 64MB 2GB (1GB*2) DDR2 667MHz 8GB LPDDR3 1600MHz
Harddisk Quantum 20GB PATA 5400rpm WD 160GB SATA 5400rpm Apple 256GB PCIe SSD
Video Card nVidia TNT2(8MB,AGP) nVidia Geforce 8400M GS(128MB,PCIe x16) Intel Iris Graphics(Built-in)
Sound Card Creative Vibra 128 Built-in Realtek HDA Built-in Intel HDA
Modem Motorola 56kbps Motorola 56kbps None
NIC None BCM5906 10M/100M BCM5701 10/100/1000BASE-T
WLAN None Intel 3945ABG Broadcom 802.11a/b/g/n
Bluetooth None Bluetooth 2.0 Bluetooth 4.0
Monitor Samsung SyncMaster 550s 15’CRT Built-in 13.3’ LCD None
ODD CD-ROM 48X DVD±RW None
Sound box Ranbow M2 Built-in Built-in
OS Windows 98 SE Windows Vista Home Premium Mac OS X Yosemite

Mac mini 外接显示器显示模糊的解决

之前看到过有好多人遇到了 Mac 外接显示器显示不清晰的问题,一直以为是 HDMI 输出只支持某几种特定分辨率的原因。如今我也遇到了这个问题,收到 Mac mini 欣喜地接上电源、显示器、键盘鼠标,发现…好虚啊!

可是我显然没有用 HDMI 输出…

用了 CE-LINK 的 Mini DP to VGA 转接线接到了一个之前闲置不用的显示器上(BenQ FP756-12ms),惨不忍睹。在系统偏好的通用里,已经选择了“使用 LCD 平滑字体(可用时)”。

Google 找到了解决的方法,原因是系统把显示器识别成了 CRT,所以没有采用 LCD 平滑。

OS X 有五种字体平滑选项:关闭、自动、轻、中、重。但在偏好设置里有关字体平滑选项只有一个复选框,不选即为关闭,选上即为自动。可惜这个“自动”识别错了。

所以我们需要强制指定字体平滑,方法是更改 globalDomain 中的 AppleFontSmoothing 参数。

Terminal
1
$ defaults -currentHost write -globalDomain AppleFontSmoothing -int 1

其中,最后的参数 1 为轻度,还可选择 2 为中度,3 为重度。

另外,查看该值可通过:

Terminal
1
$ defaults -currentHost read -globalDomain AppleFontSmoothing

若提示

The domain/default pair of (kCFPreferencesAnyApplication, AppleFontSmoothing) does not exist

则意味着当前选择了关闭或自动。

删除对该值的设置:

Terminal
1
$ defaults -currentHost delete -globalDomain AppleFontSmoothing

经测,BenQ FP756-12ms 对于我来说最合适的值为 3。

iOS8 中 UILabel 不显示 subview 的问题

在 iOS8 中,如果在一个 UILabel 对象上添加 subview,同时给这个 label 设置了背景色 (backgroundColor),则会发现这些 subview 都不显示出来,但可以响应事件(如一个按钮作为 subview,按钮不显示但可以正常响应点击)。如果不给这个 label 设置背景色,则可以正常显示。

在 iOS7 上不存在此问题。

有些开发者为了方便,在自定义 NavigationBar 时用 UILabel 做父容器,然后在其上添加按钮,导致了在 iOS8 上运行时,导航栏上的按钮都不显示。

避免采用 UILabel 等做父容器,它们本来就不适合做父容器。

Cannot locate compiling with Xcode6

正式推出的 iOS8 中,定位服务分为了 使用应用程序期间 和 始终 两种权限,这导致了一些变化。之前的工程若用 Xcode5 编译,并在 iOS8 上运行,会向用户请求始终获取位置的权限。若用 Xcode6 编译,会发现程序不会向用户请求权限,同时导致无法定位。

解决方法并不复杂,只需在 Info.plist 中加入请求定位权限时显示给用户的提示信息即可:

-Info.plist
1
2
<key>NSLocationWhenInUseUsageDescription</key>
<string>写上为什么要在程序运行时获取位置</string>

或

-Info.plist
1
2
<key>NSLocationAlwaysUsageDescription</key>
<string>写上为什么要始终获取位置</string>

Caution!粗体的字体名

程序在 iOS7+ 上运行正常,但在 iOS6 上会直接崩溃,且没有任何崩溃信息。
经单步调试,发现问题出现在这一句上:

1
NSMutableAttributedString *attributedType = [[NSMutableAttributedString alloc] initWithString:@"hello" attributes:@{NSFontAttributeName: [UIFont fontWithName:@"Verdana-bold" size:14.0],NSForegroundColorAttributeName:[UIColor redColor]}];

所需实现的是将一个 NSAttributedString 显示在一个 UILabel 上,我的印象中 iOS6 是支持在 UILabel 上显示 AttributedString 的,实际证明也是这样,所以排除了 iOS6 不支持。

经过猜测和尝试,发现是这个 -bold 的缘故,改为 -Bold 就正常了,而且在 iOS7+ 上也是正常的。

晕…好吧。

OMG, WireLurker

前几日,美国著名网络安全公司 Palo Alto Networks 发布了一则消息,监测到一个新型病毒 WireLurker。让它区别于众多病毒的地方在于,它运行于一直及其安全的 Mac OS X,并能感染与其连接的 iOS 设备,而且并不要求 iOS 设备被越狱。这也是第一个可以感染 iOS 程序的病毒。

病毒来源为中国著名的苹果技(dào)术(bǎn)论坛-麦芽地,论坛中很多二次打包的盗版软件、游戏中加入了 WireLurker,国内非常多的 Mac 用户被感染。

简单地判断自己有没有中招,可查看 /usr/local 中有没有一个名叫 machook 的目录,如果有,恭喜中招!

machook 目录中的内容:

Terminal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ tree /usr/local/machook/
machook
├── com.apple.globalupdate.plist
├── com.apple.machook_damon.plist
├── dylib
│ ├── libcrypto.1.0.0.dylib
│ ├── libiconv.2.dylib
│ ├── libimobiledevice.4.dylib
│ ├── liblzma.5.dylib
│ ├── libplist.2.dylib
│ ├── libssl.1.0.0.dylib
│ ├── libusbmuxd.2.dylib
│ ├── libxml2.2.dylib
│ └── libz.1.dylib
├── globalupdate
├── machook
└── watch.sh

Palo Alto 为我们提供了一个查杀 WireLurker 的 python 脚本(暴露了,曾经在麦芽地下过一个游戏..)。

Terminal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
$ python WireLurkerDetectorOSX.py
WireLurker Detector (version 1.2.0)
Copyright (c) 2014, Palo Alto Networks, Inc.
[+] Scanning for known malicious files ...
[!] Found malicious file: /Library/LaunchDaemons/com.apple.machook_damon.plist
[!] Found malicious file: /Library/LaunchDaemons/com.apple.globalupdate.plist
[!] Found malicious file: /usr/local/machook/
[!] Found malicious file: /System/Library/LaunchDaemons/com.apple.appstore.plughelper.plist
[!] Found malicious file: /System/Library/LaunchDaemons/com.apple.MailServiceAgentHelper.plist
[!] Found malicious file: /System/Library/LaunchDaemons/com.apple.systemkeychain-helper.plist
[!] Found malicious file: /System/Library/LaunchDaemons/com.apple.periodic-dd-mm-yy.plist
[!] Found malicious file: /usr/bin/com.apple.MailServiceAgentHelper
[!] Found malicious file: /usr/bin/com.apple.appstore.PluginHelper
[!] Found malicious file: /usr/bin/periodicdate
[!] Found malicious file: /usr/bin/systemkeychain-helper
[!] Found malicious file: /usr/bin/stty5.11.pl
[+] Scanning for known suspicious files ...
[!] Found suspicious file: /etc/manpath.d/
[+] Scanning for infected applications ... (may take minutes)
[!] Found infected application: /Applications/Sim City 4 Deluxe Edition.app
[!] WARNING: Your OS X system is highly suspicious of being infected by the WireLurker.
[!] You may need to delete all malicious or suspicious files and/or applications above.
[!] For more information about the WireLurker, please refer:
[!] http://researchcenter.paloaltonetworks.com/2014/11/wirelurker-new-era-os-x-ios-malware/

Mac 平台也被恶人盯上了,据说与数字公司有关。远离盗版,MAS 里有的尽量在 MAS 里下载,保证安全。

避免使用 description 等作为属性名

自 Xcode 6 起,继承于 NSObject 的类一定要避免使用 description 等作为属性的名字,否则会被认为是 NSObject 中的 description 属性。

警告内容:

Auto property synthesis will not synthesize property 'description' because it is 'readwrite' but it will be synthesized 'readonly' via another property.

如果在代码中执行了 setDescription,则程序会崩溃,错误信息:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[AnObject setDescription:]: unrecognized selector sent to instance 0x79e8b260'

如果在代码中试图取 description 的值,则会得到 NSObject 的 description 属性,即该对象的指针,如 <AnObject: 0x7c97f870>。

其实本就该避免,只不过之前不会出问题而已。