存档在 ‘Mac’ 分类

[HOW TO] complie intl extension for php 5.3.2 under Mac OS X 10.6

2010年12月29日

近期我在研究 Symfony2,这是一个全新的、个人认为很有前途的 php 框架。和 Symfony 1.x 相比基本是推倒重来的一个版本,官方号称这是这是最快的 php 框架之一。具体可以自己上官方网站看看。

然而 Symfony2 要求 php 5.3.2+ 以上版本,还需要 php intl 库,而 Mac OS X 10.6 默认自带的 php 没有 intl 扩展,我只好自己安装。php 扩展嘛,最方便的安装方法莫过于用 pecl 安装了,然而:

$ sudo pecl install intl
downloading intl-1.1.2.tgz ...
...
/usr/temp/intl/collator/collator_class.c:92: error: duplicate ‘static’
/usr/temp/intl/collator/collator_class.c:96: error: duplicate ‘static’
/usr/temp/intl/collator/collator_class.c:101: error: duplicate ‘static’
/usr/temp/intl/collator/collator_class.c:107: error: duplicate ‘static’
make: *** [collator/collator_class.lo] Error 1
ERROR: `make' failed

Google 了一番,没什么结果,好多人在问这个问题,但就是没有一个的解决方法。

那就自力更生吧,经过一番“研究”,发现原来是 php 5.3 的使用了新的内存回收方式,zval 结构体也和 php 5.2 不一样了,一些宏也改变了,ZEND_BEGIN_ARG_INFO_EX 这个宏在 php 5.2 是这样的:

#define ZEND_BEGIN_ARG_INFO_EX(name, pass_rest_by_reference, return_reference, required_num_args) \
    zend_arg_info name[] = { \
        { NULL, 0, NULL, 0, 0, 0, pass_rest_by_reference, return_reference, required_num_args },

在 php 5.3 下是这样的:

#define ZEND_BEGIN_ARG_INFO_EX(name, pass_rest_by_reference, return_reference, required_num_args)   \
    static const zend_arg_info name[] = {                                                                       \
        { NULL, 0, NULL, 0, 0, 0, pass_rest_by_reference, return_reference, required_num_args },

而 intl 1.1.2 中很多地方都用到了这个宏,比如上面出错的 collator/collator_class.c 文件:

static
ZEND_BEGIN_ARG_INFO_EX( collator_0_args, 0, 0, 0 )
ZEND_END_ARG_INFO()

看见没有,php 5.3 中 ZEND_BEGIN_ARG_INFO_EX 的定义中已经那个包含了一个 static 关键字,而 intl 1.1.2 中用到这个宏的地方还是按照 php 5.2 的方式使用,这个宏经过预处理后,导致出现 static 关键字重复,编译出错。 知道了问题原因,就试着修改下吧。由于 intl 1.1.2 库中是用这个宏的地方很多,不好一个一个该,我就用了一个邪恶的方法,在 intl_common.h 中重新定义这个宏:

// HACK!!!
#define ZEND_BEGIN_ARG_INFO_EX(name, pass_rest_by_reference, return_reference, required_num_args)   \
    const zend_arg_info name[] = {                                                                      \
        { NULL, 0, NULL, 0, 0, 0, pass_rest_by_reference, return_reference, required_num_args },

保存再编译,这次上面的那个错误没有了,但出现了别的错误:

/Users/liang/apps/intl-1.1.2/resourcebundle/resourcebundle_class.c:215: error:‘zval’ has no member named ‘refcount’;
make: *** [resourcebundle/resourcebundle_class.lo] Error 1

这个就是上面说的 zval 结构体的改变了。php 5.3 使用了新的 GC 方式,zval 结构体中的 refcount 成员改名为 refcount__gc,is_ref 改名为 is_ref__gc,而且也有配套的管理这个新成员的宏。经过研究,intl 1.1.2 中只有 3 个地方使用 php 5.2 的方式直接访问了 refcount 成员:

$ grep -r refcount *
msgformat/msgformat_format.c:#define Z_ADDREF_P(z) ((z)->refcount++)
msgformat/msgformat_format.c:       /* TODO: needs refcount increase here? */
resourcebundle/resourcebundle_class.c:  retval->refcount--;
resourcebundle/resourcebundle_iterator.c:   object->refcount--;
resourcebundle/resourcebundle_iterator.c:   object->refcount++;

其中 msgformat/msgformat_format.c 文件已经和 php 5.3 兼容了,所以只需要修把后面的三个地方修改为 php 5.3 的方式,那这个错误应该就修改好了。 修改方法很简单,分别打开上面的几个 resourcebundle/resourcebundle_class.c 文件和 resourcebundle/resourcebundle_iterator.c 文件,按照下面的方式修改:

retval->refcount--;     => Z_DELREF_P(retval);
bject->refcount--;      => Z_DELREF_P(object);
object->refcount++;     => Z_ADDREF_P(object);

完成后重新编译,OH YEAH~~~~能通过编译了。不过别高兴得太早,可能还有问题呢。先修改一下 php.ini 中的 intl 配置为:

[intl]
intl.default_locale = zh-CN

然后运行一下测试自带的测试用例,发现有很多测试用例没通过。。。 :-(

$ make test
=====================================================================
TEST RESULT SUMMARY
---------------------------------------------------------------------
Exts skipped    :    0
Exts tested     :   55
---------------------------------------------------------------------
Number of tests :   78                78
Tests skipped   :    0 (  0.0%) --------
Tests warned    :    0 (  0.0%) (  0.0%)
Tests failed    :   17 ( 21.8%) ( 21.8%)
Expected fail   :    0 (  0.0%) (  0.0%)
Tests passed    :   61 ( 78.2%) ( 78.2%)
---------------------------------------------------------------------
Time taken      :   10 seconds
=====================================================================

=====================================================================
FAILED TEST SUMMARY
---------------------------------------------------------------------
get_locale() [tests/collator_get_locale.phpt]
collator_get_sort_key() [tests/collator_get_sort_key.phpt]
datefmt_get_pattern_code and datefmt_set_pattern_code() [tests/dateformat_get_set_pattern.phpt]
datefmt_localtime_code() [tests/dateformat_localtime.phpt]
datefmt_parse_code() [tests/dateformat_parse.phpt]
datefmt_parse_localtime() with parse pos [tests/dateformat_parse_localtime_parsepos.phpt]
datefmt_parse_timestamp_code()  with parse pos [tests/dateformat_parse_timestamp_parsepos.phpt]
datefmt_set_timezone_id_code() [tests/dateformat_set_timezone_id.phpt]
numfmt_format() [tests/formatter_format.phpt]
numfmt_format_currency() [tests/formatter_format_currency.phpt]
grapheme() [tests/grapheme.phpt]
locale_get_display_name() [tests/locale_get_display_name.phpt]
locale_get_display_region() [tests/locale_get_display_region.phpt]
locale_get_display_script() [tests/locale_get_display_script.phpt]
locale_get_display_variant() [tests/locale_get_display_variant.phpt]
locale_get_region() [tests/locale_get_region.phpt]
locale_parse_locale() [tests/locale_parse_locale.phpt]
=====================================================================

因为这些测试用例本身也是 php 程序,我就自己在命令行下运行了一遍检查为什么会导致测试失败。发现大部分输出都是正确的,但有一些情况下输出和测试用例中的断言不匹配。为什么会这样呢?我没有深入研究,也不知道为什么。哪位朋友如果熟悉这方面请赐教。

我最后的结论: 我使用了这个自己编译的版本用了一段时间,没发现有什么不正常的地方,所以这种 patch 方式应该是可行的。但是,由于存在部分测试用例没有通过,可能会隐藏着一些意想不到的bug,所以不建议在生产环境下使用。

懒人有福了,patch 后的版本我放到了 github 上,大家可以直接 clone 一份下来编译,不用自己手动修改代码了,链接在此: https://github.com/liangzhenjing/php53-intl

虾米不做咱自己做:自制虾米网 “Mac版客户端”

2010年12月21日

虾米网是一个非常不错的音乐网站,有一个非常齐全的音乐库,基本上我能想到的歌曲全都有,而且都是完整的专辑,而且,而且貌似都是正版的,非常的不错。它的音乐品味推荐也是一个不错的功能,能根据我现有的喜好给我推荐新的歌曲,非常的 NICE。

我这段时间一直在上面听歌,不过我不太喜欢使用浏览器来听歌,因为我需要频繁地打开关闭浏览器窗口,于是有时候一不小心就 Commond+W 顺手关掉播放器窗口了,很不爽,特别是听某一首很劲爆的歌曲听得正 HI 的时候。。。。

于是我就去找虾米网的客户端,但虾米网只有一个叫做 Shark 的桌面版客户端,For Windows 版本。Mac 版嘛。。。。你见过国内哪家公司有推出 Mac 版软件的么(除了 10 美分的 QQ),我就不奢望了。。。

我又尝试了使用 CrossOver 来运行 Shark,没戏~~~~ Windows Only 简直就是兲朝挨踢业的猪蹄思想 :-(

只好想别的办法。正好前段时间用过一个叫做 Fluid 的程序,能为一个网站生成一个专用的本地客户端,挺有意思,虽然也仅仅是一个内嵌的浏览器,但使用起来感觉比直接使用浏览器要好很多,也可能仅仅是我的心理作用,呵呵。

经过一番折腾和研究,我发现 Fluid 还真很适合用来做这种“伪客户端”一类的东西,而且使用效果也很不错:

  1. 驻留后台,不会干扰其他浏览器的使用
  2. 有系统栏菜单,可以快速打开播放器(见下图右上角的虾米图标)
  3. 如果你是键盘控,它还可以使用全局快捷键来激活
  4. 支持自定义 userscript,如果你是 javascript 高手,估计会觉得这东西有用

先截一个效果图先,这是播放器页面:

自制虾米网客户端

» 阅读更多: 虾米不做咱自己做:自制虾米网 “Mac版客户端”

谷歌拼音输入法 for Mac (苹果版)试用印象

2010年9月15日

盼星星盼月亮的,终于盼来了谷歌拼音输入法 for Mac 版本,感谢国家!

在 Mac 世界里,比较好用的拼音输入法有 SunPinyin(免费)、QIM(69RMB) 和 FIT(免费) ,这几个输入法各有千秋,具体可以查看这篇文章:介绍一个不错的 Mac 下的拼音输入法:SunPinyin。但它们都可以用一句话来形容:没有搜狗拼音和谷歌拼音好用。

于是,广大 Mac 用户一直在盼望着这两个输入法推出 Mac 版本。搜狗的客服说了:暂时没这个打算。Google 呢?也只说了一句“谢谢XXX提出的建议”。看下图:

Screen shot 2010-09-15 at 11.00.53 AM

不过我觉得,既然 Google 员工都出面说了,那说明 Google 已经开始听到广大 Mac 用户的呼声了。再加上已经有了谷歌拼音Android版本,所以就认为,谷歌拼音出 Mac 版是迟早的事情。所以我就盼啊盼,现在终于盼到了谷歌拼音 for Mac 版本,虽然只是一个内部测试版本。作为一个热爱折腾的小白鼠,必然要第一时间装上试用的。

安装后需要进入系统选项打开谷歌拼音。提醒一下,谷歌拼音在输入法列表里面叫做“Goopy”,而不是中文“谷歌拼音”,也不是“Google Pinyin”。如图:

Screen shot 2010-09-15 at 12.09.52 PM

先看一下输入截图,这是在 QQ for Mac 上使用谷歌拼音输入法的截图:

Screen shot 2010-09-15 at 10.48.17 AM 

经过一小段时间的试用,我得出的结论是:

谷歌拼音输入法中文组词准确度依然一样的销魂!

有了这句话,几乎可以开始幻想谷歌拼音输入法 for Mac 版美妙的未来了。为什么是开始幻想呢?因为这个版本果然是一个真真正正的内部测试版本,除了输入功能已经能用之外,其他功能貌似都还在处于开发阶段。比如:

  1. Shift切换中英文输入功能无效
  2. 双拼不能使用
  3. 中英文标点符号切换无效,永远都是英文标点
  4. 输入框字体大小设置无效
  5. 选字框的二三候选、以词定字设置无效
  6. 切换简体繁体功能无效
  7. 用户词典管理功能点击了没反应
  8. 自动同步设置中干脆就没有输入google账号的地方。。。

一句话概括就是:大部分设置选项都不起作用

兼容性问题,我经过简单测试,以下我常用的应用程序都能正常使用谷歌拼音输入法 for Mac:

  1. Opera 浏览器 10.62
  2. Safari 浏览器 4.03
  3. Firefox 浏览器 3.6.9
  4. Google Chrome 浏览器 6.0 beta(我是浏览器控。。。)
  5. Mail 邮件客户端
  6. QQ for Mac 版本 build 606
  7. iWorks’09
  8. iCal
  9. iTunes 10
  10. Terminal
  11. NetBeans 6.9
  12. MacVim 7.2
  13. Adium 1.3.10
  14. Tings 1.2.11

以下程序使用过程中有问题:

  1. Eclipse 3.5 (按空格后选中的词不会进入文本框,完全无法使用)
  2. TextMate 1.5.9 (看不到候选框,但按空格能输出文字)

 

看来还是问题多多,但是这毕竟不是一个可以发布的成熟版本,而仅仅是一个内部测试版本,所以有什么问题都很正常的。以 Google 的实力,做出和 Windows 平台上的谷歌拼音输入法一样好用的 Mac 版本并不存在什么问题。

唯一的问题是:我实在是等不及了 ^_^

下载链接:http://marc.f2e.org/Google%20Pinyin.pkg.zip

PS:

QIM 会表示压力很大滴~~~

 

下面是一些截图,为避免首页被文章拉得过长,点击连接进入查看全文才能看到

» 阅读更多: 谷歌拼音输入法 for Mac (苹果版)试用印象

SunPinyin 输入法更新到 2.0.2.1008

2010年8月24日

前段时间写了一篇《介绍一个不错的 Mac 下的拼音输入法: SunPinyin》,之后我就一直使用 SunPinyin 到现在。SunPinyin 有自动学习功能,经过这段时间使用和学习,SunPinyin 的组词也越来越符合我的语言习惯,愈发好用了,在这里我 再次向大家推荐这个输入法

今天用着用着,突然 SunPinyin 提示有新版本更新,我扫了一眼更新内容就点确定让它自动更新了,自动更新后上了作者的博客看了下,发现作者是这么说的:“虽然Sparkle升级时无法打开安装包的问题已经解决,但是得等到下一次更新的时候才能起作用;所以,烦请大家不要通过自动升级来安装,而是直接下载pkg包来安装 …”,我很是无语。。。。

于是又下载下来手动安装了一遍,也不知道这样会不会有什么隐患。。。

以下是本次更新的主要内容:

  1. 加入了关闭/打开内模糊切分的选项
  2. 加入了使用backspace取消用户选择的选项
  3. 升级系统词库和语言模型至open-gram 0.1.22
  4. 解决了Sparkle升级时无法打开安装包的问题
  5. 加入了小鹤双拼方案的支持
  6. bugfixes若干

安装后试用了一下,觉得第二个功能比较实用。之前版本的 SunPinyin 输入法在输入了一长串拼音后才发现有输入错误的话,只能把所有已经输入的拼音删除重新输入,现在新版本加入了这个选项后,就可以直接使用方向键+退格键来重新输入一个拼音,非常方便。如图:

使用方向键和退格键修改拼音

使用方向键和退格键修改拼音

长句组词也是非常棒的:

长句组词

长句组词

其他方面暂时没发现什么不一样的地方,可能要用过一段时间才能慢慢体会到。

在 Mac 下使用 TeamViewer 进行远程协助

2010年8月21日

本砖家既然敢于自称砖家,那是因为确实有点真本事的。举一个最具有说服力的例子就是:我经常通过 QQ 远程协助帮朋友解决各种电脑问题!:-)

玩笑开完了,顺便扯出正事。

我以前确实经常通过远程协助帮同学朋友们解决电脑问题,但自从我从 Windows 叛逃到 Mac 上来以后,问题就来了:QQ for Mac 没有远程协助功能。而那些找我帮忙解决问题的,98.5% 都是电脑小白(中性用法,非贬义)。所以,我需要找一个安装最简单、配置最容易(最好是零配置)、没有安全隐患、也不会被当作病毒杀掉的远程控制软件,找来找去,试用了各种远程控制工具,最后发现 TeamViewer 正是我要找的。 » 阅读更多: 在 Mac 下使用 TeamViewer 进行远程协助

Mac 下管理窗口(最大化窗口, 贴边)利器: Cinch

2010年7月27日

用 Mac 的都知道, Mac 下的窗口只能通过拖右下角的那个小三角来调整大小, 实在是很不方便. 我很是想不明白为什么 Mac 一直迟迟不加这个功能, 难道 Mac 的开发者从来都不需要调整窗口大小的吗??

上谷歌中文搜索 “mac os x最大化窗口”, 和上 Google.com 搜索 “mac os x maximum window”, 都能找到一大堆相关问答, 看来这个问题不是我一个人想问. 要是有机会, 我很想问问乔帮主, 什么时候能加上这个功能啊??

不过在乔帮主回答之前, 我只好自己解决这个问题了. 找来找去, 我终于找到一个非常不错的窗口管理器: Cinch. 它可以最大化窗口, 往屏幕两边平铺窗口, 你要是用过 Windows 7 的 Aero Snap , 你就会发现和 Winddows 7 的 Aero Snap 几乎一模一样. 没错, 这个软件就是在模仿 Windows 7 的 Aero Snap, 而且做得很不赖.

这款软件安装过程和其他 Mac 软件一样, 直接拖到 Applications 目录然后运行即可, 就不多说了. 这里说下使用方法. 这个软件的使用非常简单, 操作方式如下:

  • 拖住任意一个窗口, 抵住菜单栏 -> 窗口最大化
  • 抵住屏幕左边 -> 自动调整为占据左半边窗口
  • 抵住屏幕左边 -> 自动调整为占据右半边窗口

这就是这款软件的所有的功能, 很简单吧? 很方便吧?  下载地址: » 阅读更多: Mac 下管理窗口(最大化窗口, 贴边)利器: Cinch

感谢国家, 感谢 Time Machine!

2010年7月26日

今天闲着没事, 就想改进改进前几天写的一个 Rails 程序, 在运行单元测试的时候得到了一堆错误, 检查了一下, 发现是之前装的 active_scaffold 插件导致的, 于是就直接 rm 掉了, 然后发现 public 目录里还有好多它的东西, 懒得一个一个删, 打算用 find 命令来删除掉它们, 但输入命令的时候输成了这个:

[liang@iMac: 616.im]$ find . -type dir -exec rm -fr {} \;
rm: “.” and “..” may not be removed
find: ./app: No such file or directory

然后猛然醒悟过来, 完了…., ls 了下:

[liang@iMac: 616.im]$ ll
total 32
-rw-r–r–  1 liang  staff  10011 Jul 25 22:43 README
-rw-r–r–  1 liang  staff    307 Jul 25 22:43 Rakefile


乖乖……所有目录被删除得一个不剩….

虽然 git 库里有历史, 但刚才花了一个多小时写的东西都没了 :-( , 这就是先谢国家的后果?? WTF??????

突然想起 Time Machine, 抱着一丝希望, 打开了 Time Machine, 发现恰好十几分钟前 Time Machine 作了一个快照, 赶紧还原回来….

检查了一下, 居然绝大部分改动都在! 哈哈, 看来感谢国家还是很有用的嘛!

总结:

  1. 感谢国家
  2. 感谢 Time Machine
  3. rm 很邪恶
  4. 邪恶的美帝创造出来的东西果然都是非常邪恶的

Mac 下使用 dos2unix 批量转换文件格式

2010年7月17日

在 windows 下编辑过的文件一般都会被保存为 dos 格式, 而 mac os x 和 *nix 类系统一般都是使用 unix 格式, 有些程序在打开 dos 格式的文件时会有警告甚至甚至拒绝使用. 怎么办呢? 如果少数几个文件的话可以用 vim 打开, 然后输入 :set fileformat=unix 来转换成为 unix 格式. 但如果有大量文件洒落在不同的文件夹下, 那一个一个转换那会累死人的. 这种情况下我们可以使用 dos2unix 这个实用工具来批量转换. » 阅读更多: Mac 下使用 dos2unix 批量转换文件格式

小技巧: 彩色高亮显示终端的命令行提示符

2010年7月7日

使用命令行终端的时候,经常会需要往回翻看历史输出记录,但由于终端的输出和命令行提示符的颜色是一样的,这时候要找到上一次输入的命令的位置往往会很费神,当历史输出记录很多了的时候就更加困难了,简直就是在挑战我们的眼睛。其实,只要玩点小花样,我们可以快速找到上一次输入的命令。

大家都知道,终端的输出是可以有颜色的,只要使用一些终端控制字符,我们就可以控制终端用不同的颜色输出不同的文字,以达到某种突显强调的效果。

“小花样”指的就是这个了:这些控制字符其实也可用在命令提示符上的哟 :) 。我们只要使用合适的控制字符加到命令行提示符(PS1)中,就可以控制命令行提示符的颜色!先看看最终效果:

wpid-Picture13-2010-07-7-00-501.png wpid-Picture14-2010-07-7-00-501.png

看看效果,上面的命令行提示符是绛红色的,两个绛红文本行之间就是上一次命令的输出啦,和下面的相比,更加一目了然,是不是?这么好用的东西,心动不如行动,赶快拿起你的电话键盘敲打吧 :)

Q:看起来很 NICE,那么,怎么使用这些命令行颜色控制字符呢? A:嗯。。。。问得好,但这毫无意义。这个问题太高深,最好还是留给您自己去 Google 吧,Google is your friend,我只是出来打酱油顺便提点思路而已。

Q:我看你是在用 Mac 耶,我用的是 Linux/FreeBSD/Solaris/etc…,也能用这个方法吗? A:我没试过,但理论上所有的类 *nix 衍生系统都可以使用

Q:妈妈说用苹果的都是果粉,果粉都是脑残,你用 Mac,所以你是脑残,我能相信脑残的话吗? A:我#$^**((&#..擦&$………..!!!

最后给出我自己用的命令行提示符代码:

export PS1=”\[\e[35;1m\][\u@\h: \W]\$\[\e[0m\] “

例行公事:http://LiANG.eu 原创文章,转载请保留版权和原文链接,否则您老人家就侵犯了《兲朝版权法》.txt,自重。

Mac下的博客客户端

2010年7月4日

使用博客客户端(blog client)的好处我就不废话了, 这里我要做的是介绍 Mac 下的博客客户端.

Windows 下的客户端很多, 个人觉得很好用的是 Live Writer, 功能齐全, 界面美观, 使用方便, 实在是一个居家旅行杀人越货必备利器. 现在”叛逃”到 Mac 下了, Live Writer 是惟一一个让我怀念的软件.  而 Live Writer 没有 for  Mac 版, 并且 Live Writer 也不能通过 Wine 或 CrossOver 也不能在 Mac 下运行, 没办法, 只好另寻新欢了.

Mac 有那些不错的博客客户端呢? 我 Google 了下, 谈到这个话题的中文文章数量是…., 不过英文资料倒还是不少, 特别是这篇文章, 把几乎所有的客户端都介绍了一遍, 建议大家都去看看, 我把上面介绍的看起来不错的试用了一遍(也就是说, 那些界面看起来太简单或者太业余的我没去试), 最后认为这几个算是不错的:

  • ScribeFire, 一个浏览器插件, 支持 Firefox 和 Crome, 免费
  • Deepest Sender, 一个浏览器插件, 支持 Firefox, 免费
  • QTM 免费(说实话, 只能说能用, 但很业余…)
  • Qumana 免费(也很业余…)
  • MacJournal 收费, 30天试用期
  • Blogo – 收费, 21天试用期
  • Ecto – 收费, 21天试用期
  • MarsEdit 收费, 30试用期

收费程序中我觉得 MacJournal 算是一个不错的程序, 功能比较齐全, 界面比较专业, 还可以自动上传插入的附件​, 很方便. 嗯, 价格不贵, 仅仅 $39.95 而已…..下面是截图 » 阅读更多: Mac下的博客客户端