[翻译]在Mac OS X上安装Consolas(How to Install Consolas on Mac OS X)
原文地址:http://www.wezm.net/technical/2010/08/howto-install-consolas-font-mac/
Consolas是笔者十分喜欢的一个编程字体,是VS默认的编程字体,在过去笔者也把它作为我默认的文本编辑字体。
不过转变到一个mac兼职linux程序员后,就再也没有使用它。最近,一位同仁介绍了这篇文章,让笔者得以重新在Mac OS X上能够使用该字体了。
安装
1.下载针对Mac的Open XML File Format Converter,地址为Microsoft Mactopia download page
2.双击安装镜像,一般情况下都会自动挂载。如果没有,你需要查看下Open XML File Format Converter原始安装包
3.鼠标右击(或者control + 鼠标点击)原始安装包,选择“显示包内容”
4.在Finder窗口中,点击“Contents”,最后进入“Packages”
5.双击“OpenXML_all_fonts.pkg”,然后就会自动安装
步骤5:运行OpenXML_all_fonts.pkg安装
优化调整
现在Consolas已经安装豪了,不过按照目前字体的平滑设置,它会看起来有点小并且有点丑,所以需要调整这些设置。
对于Mac OS X雪豹版本来说,需要在终端理设置正确的值,因为apple从系统偏好设置里移除了选项:
1.打开终端(应用程序->实用工具->终端)
2.复制并粘贴下面的终端命令,然后回车
defaults -currentHost write -globalDomain AppleFontSmoothing -int 2
对于终端小白来说,可能并不能理解该命令的作用,其实该命令主要做了以下事情:
defaults命令是用来维护用户的默认设置,众所周知的就是偏好设置。其中AppleFontSmoothing设置是特殊的集合,针对全局的(对于所有的用户和系统),这里,设置级别为整数2,它在主要之前到现在的Mac OS X版本负责中等字体的平衡设置。
对于Mac OS X Leopard之前的版本来说:
1.打开系统偏好设置
2.点击”外观”
3. 在最底部,设置字体平滑为:“Medium (best for Flat Panel)”
设置完毕后,你需要重启系统,才能让这些设置生效。
zeroconf研究笔记(1) ——zeroconf初步认识

最近对zeroconf协议进行了一系列深入的研究,深深地被这一技术折服,在1999年就出现的该协议,在技术的应用上已经走向成熟,走向向大众普及之路了。
apple的airplay,airprint都是依赖了zeroconf的基础上,才展现出强大的功能。
zeroconf介绍
Zeroconf全称为Zero configuration networking,中文名则为零配置网络服务规范,是一种用于自动生成可用IP地址的网络技术,不需要额外的手动配置和专属的配置服务器。
“零配置网络服务”的目标,是让非专业用户也能便捷的连接各种网络设备,例如计算机,打印机等。整个搭建网络的过程都是通过程式自动化实现。如果没有zeroconf,用户必须手动配置一些服务,例如DHCP、DNS,计算机网络的其他设置等。这些对非技术用户和新用户们来说是很难的事情。
使用例子来形象地说明:
用户拥有一台apple tv和一台iPhone4s,那之只要都连入到同一个无线局域网内,iphone4s就会自动找出apple tv,那么在播放音乐或者视频时候,用户只要点击推送,就可以讲音乐和视频推送到apple tv上播放。
zeroconf协议的实现
zeroconf是协议,因此对应的是各种产品的实现,现在最主要的实现是apple的Bonjour和开源的Avahi。
这两套实现在程序接口上是可以兼容的,因此可以对zeroconf技术依赖的产品,可以使用兼容的开发接口,而不需要考虑到底是使用了Bonjour还是avahi。
Apple的zeroconf协议技术实现 – Bonjour
Bonjour是由apple实现的zeroconf协议的技术产品,Bonjour来源于法语,意思为你好。
使用了zeroconf技术的产品和服务,在网络中自动传播它们自己的服务信息并聆听其它设备的服务信息,设备之间就象在打招呼,这也是命名为Bonjour(法语:你好)的原因。
Bonjour是一套跨平台的产品,可以使用在Mac,Linux和Winows,以及是兼容POSIX的操作系统上,并且apple已经將其开源,所以也可以方便应用于各个产品。
Bonjour是由纯C编写的,同时也提供了Java的接口,目前如python或者ruby语言也可以很方便地调用使用它。
开源的zeroconf协议技术实现 – Avahi
Avahi 是Zeroconf规范的开源实现,基本是使用在Linux和FreeBSD上。包含了一整套多播DNS(multicastDNS)/DNS-SD网络服务的实现,使用的发布授权是LGPL。
在程序接口上,它使用DNSD与apple的Bonjour进行兼容,方便原来使用Bonjour的产品进行迁移。
目前在绝大多数的Linux发行版本中,都讲avahi作为系统启动进程,并且大量的服务也依赖于avahi。
Avahi也是用纯C编写的,同样也可以使用诸如Java的语言去调用使用开发产品或者服务。
嵌入式中的zeroconf – WiSe-Zeroconf
Wise-Zeroconf是Wise公司基于开源的Bonjour的基础上,提供给嵌入式产品的zeroconf技术实现。
由于是商业产品,详细资料不想,但是基本功能与Bonjour应该基本相同。
zeroconf最基础原理
zerconf协议主要是定义了三个层次:
1.不需利用dhcp server取得 设备地址如IP的相关资料
RFC 3927 , Dynamic Configuration of IPv4 Link-Local Addresses
http://www.ietf.org/rfc/rfc3927.txt
2.不需要通过DNS server就转换domain name和IP的关系
Multicast DNS
http://files.multicastdns.org/draft-cheshire-dnsext-multicastdns.txt
3.利用 DNS-SD来取得设备服务,而不需通过directory server
DNS-based Service Discovery, or DNS-SD.
http://files.dns-sd.org/draft-cheshire-dnsext-dns-sd.txt
zeroconf的未来分析
虽然zeroconf协议名声不大,即使是计算机专业开发人员也知之甚少,但是其实由于这几年apple发展的强势,其应用已经越来越广。
比如在iOS4.2推出时候的airplay,以及airprint都是在这基础上实现的,甚至iOS5.0后的air mirroing技术,也是在zeroconf技术上实现的。
可以预想在未来,zeroconf和DLNA將会有激烈的竞争关系。
小西GoogleReader发布
本身由于对Google Reader很挺依赖的,但是在N9上没有特别好的Google Reader软件,所以就萌生了做一个的年头。
这个软件是今年1月开始动手的,陆陆续续做到2月底,差不多完工了。不过由于当时没有N9,所以没办法进行真机测试,后来失业到现在,也没把心思花在这上面。现在已经5月了,N9就刚刚入手,所以就感觉加上了中文,测试了下,发布出来。
预计未来应该是一个月发更新一个版本,尽量功能上向Reeder学习,希望能做成那样强大。
现在暂时还没发布到ovi store上去,所以就发直接发deb安装包吧。
更新日志
0.0.1版本
1.可查看全部订阅RSS内容
2.可查看加星标,未读和加笔记RSS内容
3.可以查看订阅blog列表
4.支持添加订阅
5.支持添加笔记,标记可读和标记星标
0.0.2版本
1.修正https失效问题
下载地址:
0.0.1版本
http://vdisk.weibo.com/s/4-cuT
0.0.2版本
http://vdisk.weibo.com/s/4-yyT
由于现在还是失业阶段,估计还有大量时间可以优化,所以有bug可以及时邮件反馈给我,如果有什么功能想法和创意也可以mail。
附:程序图标比较丑,如果有PS大拿可以帮忙做下,非常感激,启动画面也暂时没有,也希望PS高手可以顺手帮忙做一个,thanks。
附注2:一开始就考虑到了伟大的墙,所以内部都是强制用HTTPS,有时会出现延迟的情况,比较无奈,不是app本身原因,是墙在起作用,在PC上测试也经常会出现。
bug反馈:
cnnbboy@gmail.com
无法Deb安装到N9/N950原因分析
最近为N9开发app,使用QtSDK开发过程中,经常会出现Deb无法安装到设备的情况发生,严重的干扰了开发效率。
经过初步研究,主要原因有如下3种:
1.权限问题
harmattan内虽然是基于linux,但是也有权限认证,使用aegis。
如果有库文件或者配置文件需要安装到系统路径中,同时又没有修改manifest.aegis,那必然会出现安装失败的情况。
解决的办法也很简单:
找到你app的 manifest.aegis文件,针对你安装文件分别添加
2.Deb大小问题
使用QtCreator上传deb到N9中,都是上传到/tmp目录,然后进行安装。
但是harmattan,为/tmp目录分配的空间是极小的,所以一旦Deb超过3m大小,那么会出现安装失败的情况。
解决办法也很简单,使用scp命令將deb包安装到用户主目录下进行安装。
3.莫名奇妙的错误
这种错误存在最郁闷,因为基本出现是有几率性的,而且令人感觉是莫名奇妙。
一般可以综合为,dkpg异常中断,导致dpkg的进程被锁;使用的了daemon的机制,写了启动脚本,启动脚本如果异常退出,也会导致错误的发生。
针对这些错误,只有跟踪安装log,然后依次针对改对应步骤的进行修改才有望解决。
如何在meego harmattan上发布和链接动态库
介绍
在为meego harmattan(N9)开发过程中,我们经验需要用到第三方库,由于Nokia Store的对于系统的保护策略,虽然harmattan是纯正的linux操作系统,但是我们不可能將动态库放在系统级别的目录,比如/usr/lib,/usr/local/lib。所以如果app使用了其他的动态库,在发布时候,会有链接失败的现象出现,并且同时我们也无法使用设置,考虑到过多的静态库会增加app的体积,所以研究一种可用的发布方式是必要的。
发布动态库
Nokia商店的策略建议讲动态库发布到/opt位置,一般是内置在你的程序目录内,我们假设程序目录目录为/opt/myapp/lib,同时名字为libcool.so。
那为了发布该库,你需要在你的.pro文件中加入如下行:
coollib.files = /local/path/to/libcool.so
coollib.path = /opt/myapp/lib
INSTALLS += coollib
假如你是在windows环境中,你的本地路径需要doc斜线符号来取代反斜线,比如c:/local/path/to/libcool.so。
你也可以考虑使用$$PWD变量来指定动态相对你的.pro文件的相对路径,比如
coollib.files = $$PWD/../coollib/libcool.so
链接到动态库
There are two stages needed for linking against a shared library: compile-time and runtime. At compile-time the shared library is being searched for the functions it exports to build dependencies inside your application’s binary. At runtime these dependencies are followed and the code of the shared library is actually executed.
这里有两种情况需要你链接到动态库,编译阶段和运行阶段。编译阶段,动态库用来和你的程序编译至二进制文件,运行阶段,程序依赖动态库代码而运行。
编译阶段需要在你的.pro文件中添加:
LIBS += -L/local/path/to -lcool
INCLUDEPATH = /local/headers-path
cool是库的名字去除后缀面的前缀lib,同时/local/headers-path是库头文件目录所在,你也可以使用$$PWD来使用。
为了成功编译,防止意外出来,你应该需要修改器的rules文件,將行
# dh_shlibdeps # Uncomment this line for use without Qt Creator
注释二次为
## dh_shlibdeps # Uncomment this line for use without Qt Creator
或者删除它。
这样做的理由主要出于未知理由(在Qt4.8.0) dh_shlibdeps命令如果只注释一次,那么仍将执行,这样会阻止你的工程编译链接动态库
在运行阶段,你需要告诉你的二进制程序文件,你的动态库文件位置那里,对于普通linux,我们可以使用 LD_LIBRARY_PATH环境变量,但是这里并不适用。
为了解决这个问题,你可以使用–rpath选项链接你的程序,添加下列一行在你的.pro文件中
QMAKE_LFLAGS += -Wl,–rpath=/opt/myapp/lib
然后,就完成了
总结
以上过程笔者已经在harmattan1.2测试通过,基本包含了绝大多数情况,偶然有特殊情况的话,可以考虑修改环境变量或者將库安装在系统级别的范围。
参考
http://www.developer.nokia.com/Community/Wiki/How_to_deploy_and_link_a_shared_library_on_Harmattan
使用无线连接模式开发N9 App
最近入入手N9,对于一个Qt兼linux兼移动开发人员来说,的确是神器了。
既然买来了,就好好开发玩玩。开发移动App,插着USB连着设备是必须得事,但是对于N9来说,不用这样麻烦,有无线连接,同样可以真机测试。
首先原来的USB模式,这部分可以参考BUG神牛的文章:
http://www.cuteqt.com/blog/?p=2169
无线部署开发模式和USB部署开发模式基本相同,最主要的就是要和开发主机连接到同一个无线ap内
可以看到,IP地址是192.168.1.104,那么在开发主机的QtSDK内设置设备时候,地址也应该是这个。
接下来呢?接下来就就没了,就是这么简单。其他按照bug神牛的做就可以了,哈,N9开发,就是这么简单。
QXmlStreamReader解决”Expected character data”
使用Qt解析xml是及其方便来的,一般情况下使用QXmlStreamReader就足以满足大多数需求。
不过,最近使用QXmlStreamReader解析由xhtml时候,却发现会有异常情况发生。
当时用readElementText()函数时候,会发生”Expected character data”错误,并且直接中断解析。
仔细研究一番发现主要原因有两点:
1.如果entries的内容为空,使用readElementText()并不会返回一个空的字符串,而是直接出错;
2.如果这个xml并不是一般的常见的xml文件,在entries下还包含了子元素,那么readElementText()也是会出错的;
解决办法其实也很简单,使用readElementText ( ReadElementTextBehaviour behaviour )函数来替代readElementText(),如果需要子元素的内容,则behavior为QXmlStreamReader::IncludeChildElements,如果不需要,则使用QXmlStreamReader::SkipChildElements。
参考资料:
http://stackoverflow.com/questions/4201175/why-cant-i-parse-a-xml-file-using-qxmlstreamreader-from-qt
[翻译]Proxychains for Mac OS X
Proxychains是在linux下很不错的一款程序,至于的它的作用,大家心里都明白,就是要安装android sdk或者其他什么需要爬长城时候用的。所幸,现在在mac.os.x下也能使用了。
原文地址:
http://touhou.ru/?act=showpost&pid=511
从proxychains官网下载源码包
http://proxychains.sourceforge.net
然后下载补丁
http://chrootlabs.org/bgt/proxychains_osx.html
打上补丁便于编译
patch -p1 < proxychains-3.1_osx.diff
编译过程
cd proxychains-3.1
./configure –PREFIX=/opt/local
cd proxychains
make
sudo make install
建立links,便于使用
mkdir ~/.libs
mkdir ~/.proxychains
ln -s /opt/local/lib/libproxychains.3.0.0.dylib ~/.libs/
ln -s /opt/local/etc/proxychains.conf ~/.proxychains/
配置proxychains.conf配置文件(需要禁止DNS请求并且设置代理)
sudo vim /opt/local/etc/proxychains.conf
具体设置细节
# Proxy DNS requests – no leak for DNS data
#proxy_dns
最后使用命令
./proxychains [command]
作者测试,使用可以根据自己的程序来
lynx 2ip.ru
proxychains lynx 2ip.ru
Three20学习笔记(1) —— TTNavigator
Three20学习已经有一段时间,并且用它开发了一个小西GoogleReader的原型。客观来说,Three20是一个相当不错的iOS第三方开发库,它简化了iOS开发过程,并且提供了很多不错的自定义的控件,对于iOS开发人员来说,应该是属于必学的开发库。当然,Three20也不全是优点,作为开发库来说,比较肥大,这点跟Qt倒是挺像的。
当然,学习之余,笔记也是重要,既帮助自己记录,也帮助别人参考。
简述
在iOS开发中,Navigation-based的App是最常用的开发模式。在一个iOS App中,我们不可能总是在一个固定的视图上就展示所有的数据内容,经常是需要多个视图。在UIKit框架种,UINavigationController和UITabBarController帮助我们iOS开发人员进行页面的导航和切换。但是,使用UINavigationController中,我们需要自己来掌握各个子Contoller的生命周期,过程较为繁琐。
在three20中,这些页面的导航功则由TTNavigator来帮助我们实现。
TTNavigator介绍
用three20文档的话来说,TTNavigator是内置了数据持久化的,基于URL的导航控制系统,它类似于Ruby on Rails’ routing,将URL链接地址存放在URL map中。当某个URL请求触发后,TTNavigator就会根据相应URL map来执行对应的代码,也就是你想显示以及如何显示视图。
同时,TTNavigator本身也是采用单例模式的,也就是说,一个App中只存在一个TTNavigator实例,以便我们方便使用。
可以用简单的代码来说明,这些代码应该位于你的应用程序的委托(Application Delegate)的applicationDidFinishLaunching:中
TTNavigator* navigator = [TTNavigator navigator]; navigator.window = window; TTURLMap* map = navigator.URLMap; [map from:@"tt://restaurant/(initWithName:)" toViewController:[RestaurantController class]];
而对应的类则是RestaurantController和它的初始化方法initWithName:。
-(void) initWithName: (NSString*)name { //... }
最后,如果我们要使用TTNavigator打开,则可以使用如下代码:
[navigator openURLAction:[TTURLAction actionWithURLPath:@"http://github.com/jverkoey"]]; [[TTNavigator navigator] openURLAction: [[TTURLAction actionWithURLPath:@"tt://restaurant/Chotchkie's"] applyAnimated:YES]]
当openURLAction:被调用后,RestaurantController类实例生成,并且调用初始化方法initWithName:,而字符串@”Chotchkie’s”则会作为第一个参数值传递进去。
如果使用UINavigationController来完成这些功能,则代码如下:
RestaurantController* controller = [[RestaurantController alloc] initWithName:@"Chotchkie's"]; [navigationController pushViewController:controller animated:YES]; [controller release];
也许从代码量上来说,也许是传统的方式要少得多,但是其实这样方式更加繁琐。假如我们要多次打开某个视图,我们要重复这样的代码很多次,而使用TTNavigator,建立好URL map映射后,我们只需要仅仅执行一个动作就可以切换到视图,而无需考虑其他繁琐的细节。
如何传递其他参数类型
在打开其他视图时,经常有各种复杂的情况出现,只传递NSString *类型参数并不能满足。
TTNavigator中TTURLAction自然在设计时也考虑到了这些需求,让我们用代码来查看:
NSArray *arr = [...load up with data...]; [[TTNavigator navigator] openURLAction:[[TTURLAction actionWithURLPath:@"tt://restaurant/Chotchkie's"] applyQuery:[NSDictionary dictionaryWithObject:arr forKey:@"arraydata"]]];
从代码中看,可以使用applyQuery:来传递NSDictionary类型的参数,当然对应的controller的初始化方法需要重载:
-(id) initWithName: (NSString*)name query:(NSDictionary*)query { for (MyObject* item in [query objectForKey:@"arrayData"]) //... do something with item ... } // ... }
通过TTURLAction的帮助,我们就可以把自己要传递的数据类型或者数据对象传递到对应的视图控制器中。
TTNavigator的其他补充
持久化
TTNavigator还有非常一个很不错的设计,就是记录视图历史,并且自动持久化。即使说,当app打开并且重新关闭后,TTNavigator会自动导航到用户上一次浏览的页面。当然前提,是在代码中选择了这一参数。
这主要跟以下三个参数有关:
TTNavigatorPersistenceModeNone — 不记录
TTNavigatorPersistenceModeTop — 只记录每次浏览的最后一个
TTNavigatorPersistenceModeAll — 记录所有的浏览历史
选择的示例代码如下:
TTNavigator* navigator = [TTNavigator navigator]; navigator.persistenceMode = TTNavigatorPersistenceModeAll;
传递多参数
除了通过TTURLAction传递特定的参数已经传递NSString类型的单个参数,TTNavigator也同样提供了传递多个参数的办法。
第一个办法,URL Map映射的代码更改为:
[map from:@"tt://menu/(initWithMenu:)/(withParam:)" toSharedViewController:[MenuController class]];
对应的控制器类的初始化方法为:
- (id)initWithMenu:(MenuPage)page withParam:(NSString*)param { if (self = [super init]) { self.page = page; } return self; }
这样,就可以很方便的传入两个参数。
第二个办法,URL Map映射的代码更改为:
[map from:@"tt://menu?menu=(initWithMenu:)" toSharedViewController:[MenuController class]];
对应的控制器类的初始化方法则为:
- (id)initWithMenu:(MenuPage)page query:(NSDictionary*)query { NSString *ref = [query objectForKey:@"ref"]; NSString *name = [query objectForKey:@"name"]; NSString *phone = [query objectForKey:@"phone"]; if (self = [super init]) { self.page = page; } return self; }
调用的代码如下:
TTOpenURL(@"tt://menu?menu=1&ref=hello&name=world&phone=123");
这个与前面传递自定义参数类型十分类似,其实也非常容易理解,是TTNavigator自动帮助我们将三个参数存入到NSDictionary类型中,并且传递过去。
需要注意得是,假如存在- (id)initWithMenu:(MenuPage)page方法,调用首先得是单参数方法,three20并不会智能得根据参数类型和参数个数去选择初始化方法,因此避免这个问题得最佳办法就是将在映射时候将方法名映射为唯一的不同的URL。
总结
可以看出,TTNavigator是一个十分强大的three20类,在使用three20中,几乎每个app都注定要使用到它,而得益于它基于URL 导航栏的机制,我们无需陷入到繁琐的细节中就可以完成我们的需求了。
参考文档
Three20简单安装
Three20是个有趣的项目,是从Facebook for iOS版本中提取出来的一个开发库,包含图片查看,一般工具,HTTP本地缓存,对于iOS开发新手来说,在初期省去过多繁琐的步骤,用这套库是不错的选择,我自然不不能免俗。
当然,现在暂时不研究其内部代码,也不打算研究复杂的过程,就先研究简单使用就可以了。
先下载
主页是https://github.com/facebook/three20,然后使用git命令就可以下载下来
$git clone https://github.com/facebook/three20.git
安装也很简单,只要使用命令即可,前提,安装了python,至于繁琐的手动安装,一边去
$python ttmodule.py -p path/to/your/project/yourproject.xcodeproj Three20 –xcode-version=4
到此为止,先用用吧,来快速开发下我心中的app
补充:对于额外的模块,比如xml和json,three20也提供了很方便的添加办法
添加extThree20XML模块 :
$ python three20/src/scripts/ttmodule.py -p path/to/myProject.xcodeproj extThree20XML
添加extThree20JSON模块



