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>

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