更新ibus和ibus-pinyin的ports到1.4.0

其实早就该更新的…… 不过之前尝试了一下,觉得1.4.0不咋的,还有些问题,于是没管…… 结果终于有好心人搞了个1.4.0的patch,还群发邮件说各位基于ibus的ports的maintainer们,快更新吧! 他顺便还加上了GTK3支持的选项,看来大家都要渐渐向GTK3迁移了么…… 在那个patch的基础上,提了些修改,现在在等待commit…… 具体来说: * 貌似其实ibus不依赖Qt?为啥从前加上去了呢…… 于是去掉了 * 没有post-deinstall这个target的,应该在pkg-plist里用@unexec来执行卸载命令的…… 所以从前的ibus port删除之后,是不会更新gtk2的immodules列表的…… 这么多时间了也没人发现…… 为了这个,ibus-pinyin也更新到1.4.0。但是ibus-pinyin 1.4.0居然要编译器支持c++0x…… BSD的古老的gcc 4.2怎么行…… 于是就让port依赖gcc 4.4+,没办法…… 其实ibus-pinyin还有个替代选项是用boost,但是开了之后没法编译。虽说打个补丁应该可以,但是太麻烦…… 另一个好处是,现在就不依赖boost了…… 其他更改: * 不知道为啥,ibus-pinyin有个${DBTAR}在DISTFILES里,而这个东西没定义过…… 删了删了 * 去掉boost支持,反正依赖gcc 4.4+了…… * RUN_DEPENDS单独定义。这个是portlint说的,说BUILD_DEPENDS其实还有别的东西,不能直接赋给RUN_DEPENDS * 目前禁用lua扩展。反正也没人用…… * 加了俩选项,选择是否编译Android DB和OpenPhrase DB。貌似是俩词库,OpenPhrase 那个挺大…… * 加了选项是否依赖opencc进行简繁转换 ibus 1.4.0在gvim里有些问题,换篇文讲吧…… 于是就等待commit了~

inline, weak symbol以及其他

首先,如果某个test.h里有如下内容: class A { public: int x(); }   int A::x() { }class A { public: int x(); } int A::x() { } 那如果只有一个test.cpp引用了它: #include "test.h"   int main() { A a; a.x(); }#include "test.h" int main() { A a; a.x(); } 那还好。但如果还有一个test2.cpp引用了它: #include "test.h"   int foo() { A a; a.x(); }#include "test.h" int …

Continue reading ‘inline, weak symbol以及其他’ »

关于#pragma interface

关于这个pragma,有某文档: http://gcc.gnu.org/onlinedocs/gcc/C_002b_002b-Interface.html 里面还有它的伴生pragma: #pragma implementation 大体意思是说,比如你有个A.h,有个A.cpp。A.h里面包含了一些除了类接口以外的一些东西,例如一部分类实现之类的,比方说,里面有类A,以及A::foo()的实现。 原来假如我是B.cpp,只要我#include你这个A.h,那我编译出来的B.o里面,就会有你的那一部分实现的副本,也就会有A::foo()的副本…… 然后有人觉得这样B.o会变大,于是发明了那俩pragma…… 定义了#pragma interface A 的头文件,引用它的B.cpp编译出来的B.o就不会包含那一部分实现的副本,而会有undefined symbol: undefined A::foo() 而与其对应的定义了#pragma implementation A的A.cpp,它编译出来的A.o里面,就会包含那一部分实现,也就是那些undefined symbol对应的东西: defined A::foo() 这样俩.o链接起来,就啥都有了,很好 === bug的分隔线 === 但是有时候有别的情况…… 例如其实那个类在一个C.so里面,而引用它的B.cpp是一个用了那个C.so的程序的一部分 于是B.cpp编译出来的B.o里面,那部分实现依旧是undefined symbol。但是,那些对应的symbol,在A.o和其他.o一起变成C.so的时候,都到了C.so里面。但是大概是由于链接的过程,原来的symbol信息没有导出来…… 于是C.so的导出symbol里面,并没有defined A::foo() 于是B.cpp位于的那个程序在链接的时候,就找不到那个A::foo()了,就有linker error了…… === 结论的分割线 === 总的来说,就是尽可能别用这个pragma…… 省那点空间没啥意义的…… 它文档里也说了 Note: As of GCC 2.7.2, these #pragmas are not useful in most cases 以及 Currently (3.4) the only benefit of …

Continue reading ‘关于#pragma interface’ »

给lftp报了一个bug

学校用的proftpd,为了照顾windows用户,设置了UseEncoding GBK GBK这样,proftpd返回的FEAT里面,有LANG,没有UTF8。但是lftp只要知道服务器支持LANG,就会发个LANG过去。只要收到LANG的回复,就认为服务器用的UTF-8……虽然LANG和UTF8都是RFC 2640定义的,但是支持LANG不一定就是UTF8啊……所以发了个patch给作者,不知道他会不会管……— src/ftpclass.cc.orig        2010-04-29 17:20:28.000000000 +0800+++ src/ftpclass.cc     2010-04-29 17:20:42.000000000 +0800@@ -4100,8 +4100,11 @@    case Expect::LANG:       if(is2XX(act))       {–        conn->utf8_activated=true;–        conn->SetControlConnectionTranslation(“UTF-8”);+                 if (conn->utf8_supported)+                 {+                         conn->utf8_activated=true;+                         conn->SetControlConnectionTranslation(“UTF-8”);+                 }       }       else if(act==530)         conn->tune_after_login=true;

折腾

折腾了几天,搞了各种事情* 升级Avant Window Navigator到trunk(0.3.9)有一大堆的事情,比如说:# bzr up之后,有冲突,干脆全部干掉重来。发现configure有问题,引用了莫名其妙的ac_python_version变量,这个东西哪里都没有。只好手动改成2.6。# 引用了libdesktop-agnostic,ports里没有,上网去发现貌似也在launchpad上边,可能也是awn这群人搞的,遂bzr co下来# 结果编译的时候有诸多问题,上网去,发现有bug-report,说是vala版本太新,而且他还branch了一个various-fixes分支出来# 第一次听说vala,貌似是利用gobject这套系统,配合一个类似于C#的语言,给C以面向对象能力。编译的时候先弄成C再编译# 再bzr co了那个fixes branch,终于好了。回头对付awn,还算比较容易# 新版多了个curve模式,貌似速度也好不少,稳定性也是,看来这个rewrite还不错* 升级awn-extras也有不少事情:# 发现里面的各个菜单组件都或者崩溃或者没有程序菜单,追溯到python-gmenu,最后看调试信息,发现没有applications.menu文件# 本来想生成一个完了,但是下了个菜单编辑工具alacarte,发现这个里面已经有程序菜单了…… 而且gnome-panel也有…… 标准不统一啊……# 之后再查资料,发现说XDG这套标准允许有前缀,并且通过locate得知有一个gnome-applications.menu在恰当的地方# 最后通过把XDG_MENU_PREFIX设为gnome-解决# 之后又是发现那个Media Player Applet不能放大的(不是文件大小)视频。怀疑和之前totem的问题一样# 看代码发现用的playbin这个gstreamer组件,直接gst-launch,果然出错,而且信息和totem的一样# 上网搜了一下,有人说totem的pkg-message里说了这个问题,果然有…… 用了就好了# 说明这个问题不只totem有,用gstreamer的都有…… 为啥默认的那些shm的参数那么小……* xps文件查看上两天有人发来xps文件,不能看…… 去网上下了XPS Essentials装,结果wine运行说有gdiplus的函数没实现…… 搜了之后,发现新版wine实现了,遂下载新版,结果换了一个函数…… 只好拷了一个gdiplus.dll过来,运行倒是可以,就是换页要好几秒……于是去网上找开源解决方案,找到ghostxps,后来发现就是ghostscript那个公司做的。直接转pdf,10M的xps变成了5xxK,但是里面图片质量很差。去网上看了一下,对latex转pdf有人说应该先转ps再ps2pdf,应该是同理。但是直接转出来的ps竟然有4xxM…… 再转pdf,有17M,还能忍受,质量很好* skypebsd ports里面那个skype是static的2.0.0.72-oss版,我输入不了中文,遂尝试新版。结果新版2.1.0.xx的dynamic版都会卡死在futex系统调用上,而static版不但不能输入中文,还没有声音……搜索得知,新版用了pulse,遂用rpm安装alsa的pulse插件,linux的pulse库等,结果运行时说shm_open没有实现…… 还是不行又尝试装了alsa的oss插件,并且设为默认,这次终于有声音了,但是…… 不能录音……最后还是回归老的了……* 自动挂载本来我山寨了一个自动挂载脚本,利用devd的CDEV建立事件,在ntfs/*和msdosfs/*出现的时候,自动挂载到/mnt/*结果现在有了iPod,就有问题了:我一般只是想充电而已于是要挂载自动camcontrol eject,问题是CDEV事件不包括设备名,只有label。在找不到反查工具的情况下,只好自己从label查设备大致上就是一个枚举,利用gpart结果得到所有设备,然后用glabel得到上面的label,并且进行匹配,符合的就是对应设备。搞的时候发现,glabel status的第一行输出一直是Name Status Components,而Name下面显示的就是label,而且Name的最后一个字母严格和label最后一个字母对齐,通过这个,可以保证从输出结果得到的label是完整的label,不多不少。现在碰见iPod就会自动卸载了,真不错……* easytag的崩溃问题本来easytag给某些歌写tag的时候,总是崩溃。这两天研究一下,发现都是不正常的ape tag引起的。虽然easytag本身只写id3 tag,但是他写的时候,会先清除ape tag,而要清除就要先解释,于是就挂了…… 我搞了py-apetag下来,结果删tag的时候也说不能解释……你们删除tag就不会简单地先删掉再建一个空的么…… 非要解释……最后手动把文件结尾APETAGEX开始的东西全干掉,世界清静了…… 感想:# gstreamer好强大,我视频库里那些视频都可以放…… 虽然对字幕的支持还是令人怀疑# 发现一个好东西,gst-editor,类似于windows里directx开发包里那个编辑directshow filter图的那个东西,这里是编辑gstreamer …

Continue reading ‘折腾’ »