关于#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 ‘折腾’ »

Hacking FreeBSD to change manual page width

I don’t like the fixed width of manual pages, since I have such a wide terminal, but the man pages only occupied the left part.By inspecting the process launched, it seems like that there are several processes related:sh -c (cd /usr/share/man/en.UTF-8 ; /usr/bin/zcat /usr/share/man/en.UTF-8/man1/ls.1.gz | /usr/bin/tbl | /usr/bin/groff -S -Wall -mtty-char -man -Tutf8 | /usr/bin/col …

Continue reading ‘Hacking FreeBSD to change manual page width’ »

利用 bcdedit 解决 Vista 启动问题

前一段时间,把系统原来的还原分区(一个NTFS)清了,在那里装了FreeBSD 8/amd64。之后发现,FreeBSD的分区引导记录很不行,他只找活动分区启动,而不管自己是哪个分区的引导记录(大概也不知道……),所以从原来的BSD切换到新装的很麻烦,要手动改活动分区。于是就装了个grub4dos,折腾了半天终于好了。装完之后,尝试新菜单,发现Vista进不去了…… 提示大概是这样的:\Windows\system32\winload.exe 文件未找到或者已损坏 错误0xc000000e。试了一下,发现Vista启动菜单里面其他的项目也用不了了。想了一下,多半是干掉那个还原分区之后,Windows所在的分区成了第一个Windows能够认出来的分区,于是这个Boot Loader分不清楚了,不能在老地方找到这个文件了……先尝试把那个新装了BSD的分区类型改成NTFS,结果Windows还是不认…… 改回去之后,我想只好手动修改启动数据库了。Vista的启动数据库,不像XP就是根目录下面有一个boot.ini,而是在根目录下面\Boot\BCD这个文件里面,还是个二进制文件…… Windows就给了一个bcdedit来弄。因为进不了Vista,我尝试着用虚拟机里的XP来跑。这个虚拟机同时也把主机的真实硬盘作为第二块硬盘挂在上面。启动虚拟机,尝试了一下,bcdedit竟然能用,于是拷到WinXP这边来。主机Vista所在的盘在虚拟机里面是D盘,所以在运行bcdedit的时候,后面都要加上/store d:\boot\BCD 。改的过程其实很少。bcdedit原来那些命令也都能用。命令里面某一项的GUID,可以通过直接运行 bcdedit /store d:\boot\BCD 来了解,最上面{xxxxxxxx-…..}那个就是了,一串很长的十六进制数。默认项这个可以用{default}代替。首先,把默认项指定成Vista(原来是老BSD):bcdedit /store d:\boot\BCD /default <Vista项的GUID>然后设置默认项设备为分区d(一开始我设了c,结果还是不行…… Windows还是把那个算进去了么……)bcdedit /store d:\boot\BCD /set {default} device partition=D:bcdedit /store d:\boot\BCD /set {default} osdevice partition=D:这就好了。效果不用重启都能看见。还是利用虚拟机,qemu或者VirtualBox都可以,直接挂主机硬盘,Vista果然跑起来了…… 不过一会儿就蓝屏了……

gdb的出错消息

一直以来,运行gdb,之后输入 attach <PID>,会收到一些错误消息:> gdbGNU gdb 6.1.1 [FreeBSD]Copyright 2004 Free Software Foundation, Inc.GDB is free software, covered by the GNU General Public License, and you arewelcome to change it and/or distribute copies of it under certain conditions.Type “show copying” to see the conditions.There is absolutely no warranty for GDB.  Type “show warranty” for details.This GDB was …

Continue reading ‘gdb的出错消息’ »

Joomla 热门新闻的有效期

     热门文章上的内容,是完全按照新闻点击次数排的。虽然原来发布的时候有个失效时间,但是大部分人懒得写,导致很旧的但是点击量大的新闻会长时间排在顶上,违背了新闻和热门的意思。     因为这个原因,我想说不定能够设置一下,比如只显示两个月的新闻。但是看了一下那个热门新闻模块(mod_mostread),设置很简单,没这方面内容。     于是只好改代码了么…… 打开/joomla/modules/mod_mostread.php,看见如下代码: case 1: default: //Content Items only $query = “SELECT a.id, a.title, a.sectionid, a.catid” . “\n FROM #__content AS a” . “\n LEFT JOIN #__content_frontpage AS f ON f.content_id = a.id” . “\n INNER JOIN #__categories AS cc ON cc.id = a.catid” . “\n INNER JOIN #__sections AS s ON s.id …

Continue reading ‘Joomla 热门新闻的有效期’ »