Apache一个BUG

      今天把lighttpd换成Apache(别问我原因),于是下载了httpd-2.2.9.tar.bz2回来编译。

由于有很多文献要读,我在这个http
server上建了一个目录,然后用脚本定时将实验室机器上的Paper同步到这个目录上,再在俺的MacBook上用另一个脚本下载回寝室。为了阅读方便,这个http
server上存放文献的目录开着Index。但是今天发现autoindex模块无法在Linux系统上显示中文文件名。于是在Firefox里面查看了一下Index页面的信息,发现发送编码居然是ISO-8859-1,也就是Western西方字符编
码。这就奇怪了,我明明在httpd.conf里指定了AddDefaultCharset UTF-8的啊。。。。      于是我打开autoindex模块的源代码,modules/generators/mod_autoindex.c,发现其中是这样判断编码的:

      if (autoindex_conf->ctype) {         
          ctype = autoindex_conf->ctype; 
      }                                     
      if (autoindex_conf->charset) {       
         charset = autoindex_conf->charset;
      }                                    
      else {                            
  #if APR_HAS_UNICODE_FS             
          charset = “UTF-8”;            
  #else
          charset = “ISO-8859-1”;
  #endif
      }

所以使用ISO-8859-1貌似是因为编译时预处理else中的判断结构出现了错误。那么APR_HAS_UNICODE_FS是个什么东西呢?查了一下,APR是Apache Portable Runtime(Apache可移植运行库)的缩写,这是一个用来保证上层程序可以跨平台编译运行的中间层。APR_HAS_UNICODE_FS是在srclib/apr/include/apr.h中定义的,而这个apr.h则是在configure时srclib/apr/include/apr.h.i生成的:在Windows下APR_HAS_UNICODE_FS=1,而在Linux及Unix下APR_HAS_UNICODE_FS=0,然后根据APR_HAS_UNICODE_FS的值,在编译autoindex模块时选择采用ISO-8859-1或者UTF-8编码。

这下问题就很明白了,这个http server系统是RHEL 5,locale是UTF-8,这样的话正好与mod_autoindex.c的初衷相违背:只要是在Linux系统下编译时,不管系统locale如何
设置都使用ISO-8859-1编码生成Index。

目前几乎所有主流Linux发行版的默认locale几乎清一色都是UTF-8,但是Apache中的autoindex_module非但不能判断locale采用相应的编码,反而不分青红皂白就用了ISO-8859-1编码。。。。这实在是。。。太汗了。

嗯,有时候Hacking一下软件还是很有意思的。

关于不同操作系统的争论,我的观点

       从技术层面来讲,Mac以及其他*nix系统有其长处,Windows也有其过人之处;反过来二者都有缺点存在。从用户使用层面来讲,二者面对的是不同的用户习惯,有人喜欢windows的那庞大和easy,有人喜欢Mac的清新华丽,有人喜欢linux的可定制性和透明。这都是不同的使用习惯使然,所以我说,没有最好的系统,只有最合适的系统。
       每个人都是从自己的立场讲话,自然观点都是片面的,只是程度不同而已。单一的操作系统很难满足不同人的需要,Windows的高市场占有率只是因为它满足了更多的人的需求。正因为如此,才需要Windows,Mac,Linux,以及FreeBSD等等等等操作系统共存与此,来满足不同的用户需求。在未来,技术的发展能够使各种日常应用兼容于不同的操作系统,这样,大家就能够根据自己的习惯去自由地选择不同的操作系统了。

       下面说说我个人的体会。因为从事一些研究工作,因此经常会用到一些科学软件,而这些软件绝大多数都是工作在*nix系统下,所以我有
机会比较多的接触到各种不同的操作系统(当然我不是专业人士,所以很多深入的开发工作没有作过,也不了解)。

       首先说说Linux,这个东西对于Windows用户上手确实是个小小的挑战,但并不难,因为通过Google任何人都可以找到一些初级问题的答案。比如说,装完Debian(Debian是一个Linux发行版,包含大量自由软件)系统后无法播放mp3文件,只要通过google关键字“debianmp3”完全可以找到详细的解决方法。或者,去论坛发帖。Linux对我来说有很多优点,比如说,可定制性:Ubuntu默认使用Gnome桌面环境,但是其中包含一大堆我用不到的软件,而且体积庞大,对硬件要求较高。所以安装时我会选择一个更为轻量化的桌面环境,比如Fluxbox或者Openbox,经过一些简单的配置(同样,可以Google到很详细的教程),同样可以100%满足我的需求。Flux启动后只有一个状态栏和一个右键菜单,非常的简单。通过编辑菜单文件,我可以在其中任意放置各种常用的程序(比如将Firefox放在第一位,终端放在第二位,还有OpenOffice,等等);通过编辑快捷键文件,可以为不同的系统动作设定快捷键(比如,Ctrl+H是最小化,Ctrl+Q是退出等等),可定制性极高。但是这个时候如果我想要实现类似 Windows Sidebar或者Dashboard的Widget怎么办?Google一下,发现有几种软件可以实现这一效果,比如GoogleGadget和 Screenlets。前者只需要从Google下载源代码并编译(也许有人觉得这个工作高深莫测,其实去年我也是这样觉得的,但事实证明没有那么困难);而后者更简单──很多Linux发行版都提供了“软件仓库”,用户可以直接自动下载安装其中的软件。举例来说,在Ubuntu中,在终端中输入 sudo apt-get installscreenlets,系统就会自动下载安装这个软件(当然也有对应的图形界面程序完成这些工作,之所以选择命令行方式是因为熟悉之后这样做明显效率更高)。
       通过这样一番配置,安装所有常用的工具和软件,我的Ubuntu系统只有800MB,开机时间23s,能够在Pentium/32MB内存级别的计算机上正常运行(当然有些大型软件会很慢)──同样能够满足我日常工作娱乐的几乎所有需求,为什么要用臃肿缓慢的Windows呢?这种可定制性是Windows远不能比的。当然Linux系统作为桌面系统的缺点也很明显,比如需要一些功夫去配置,用户需要学习一些新知识,硬件对Linux支持较差等等。

       下面说说Windows。我用Windows最早是从Windows3.2时代,Windows95没怎么用过(那时候我认为这东西完全是个花瓶),Windows98/Me/2000/XP用了很长时间,Vista断断续续用过一些。Windows做得非常优秀的一点在于其兼容性,对于不同硬件、不同软件,如果你用过DOS,就应该知道在DOS下安装一块声卡有多么困难。 PnP(Plug and Play,即插即用)的确为业界提供了一个很好的标准 (虽然早期PnP一度被戏谑为即插即祈祷,Plug andPray),使得不同的硬件能够在一起完美的工作而不互相冲突。虽然内核几次更换,但是如今那些DOS/Windows98程序依然能够在WindowsVista下正常运行,想要做到这一点的确很不容易,但正因为如此,Windows平台才会涌现出无数优秀的应用软件和游戏(当然还有病毒)。但是伴随这种大而全的模式,很多问题也应运而生。举个例子,安装WindowsVista时会向用户硬盘上安装几个GB大小的硬件驱动程序用于兼容不同的硬件,但是其中99.99%的硬件可能我一辈子都不会用到,这样的话无端地浪费了很多磁盘空间;再比如,WindowsVista之前的系统缺乏相应的权限管理系统,导致用户滥用管理员权限,病毒横行,等等等等。当然与这些缺点同时存在的还有上述那些有点,这样的对比还有很多,难以列举。Windows的确满足了绝大多数人的绝大多数甚至全部需求,所以它赢得了数量庞大的用户。

       最后来说说Mac。我用Mac时间并不长,一年而已,只是可能学习得比较多,所以大体上还是了解一些。对于Mac对于我来说,不单是一个优秀的操作系统,更是一个高度定制的软件与硬件的结合体。它同时具备Linux与Windows的一些优点,也有一些二者不具备的有点,当然还有很多缺点。这些优缺点大家可能了解得比我更多,这里就不多说了,着重谈谈我的个人经验。首先,Mac OSX是一个Unix系统,因此它天生与绝大多数开源软件有着极好的兼容性,我完全可以将实验室运行在Linux上的软件经过编译安装在Mac上运行,这样就可以将一部分工作转移到我的个人机器上来做。
      其次,Mac上有一大堆优秀的软件,比如Papers(科学文献管理软件),iPhoto等,在日常使用中实在找不到更合适的替代品了。最后,由于喜欢做一些平面设计(完全业余,主要是海报、网站、Tee的设计,呵呵,专业人士请多多指教),Mac OS X对文字的独特渲染方式(相比Windows来说,Mac OS X基于Postscript的渲染引擎最大限度地保留了字体的外观特征,而不像Windows那样单纯追求文本的清晰度而牺牲了字体设计师希望表达的效果)以及很多优秀的设计软件。

       以上只是一些个人使用中的经验之谈,鉴于本人才疏学浅,错误难免,希望各位能够不吝指正,感激不尽!

       此外,再说两句题外话。希望大家能够自觉维护一种纯净的讨论氛围,求同存疑,不要发展到人身攻击的地步。争论的目的在于相互交流不同的观点,而不是说服对方或者挫败对方。希望大家能在争论中共同学习,共同提高,这个目的达不到,所有讨论都是徒劳的。

编译aMule 2.2 SVN Universal Binary

下载:http://www.mediafire.com/?cm1qdtyz0d4鉴于aMule 1.3在Leopard下无法正常工作以及作者长期不更新,因此迫切需要从cvs编译一个能在Leopard下正常工作的aMule。之前已经成功编译了intel构架上的版本,但是由于系统里某些旧的lib不是Universal Binary,因此编译不成功。这几天看了jjgod大仙blog上的一些文章,终于成功编译了UB版本的aMule cvs,这里与大家分享。本文内容基于Mac OS X 10.5.2 Intel构架。

首先还是推荐先去看wiki上的文章 http://www.amule.org/wiki/index.php/HowTo_compile_on_Mac (以下简称原文),但是这个文章很久都没有更新了,所以照做肯定没戏,不过借此可以了解其依赖关系等基本信息。

第一步,安装Xcode 3.0,这个在Leopard光盘里面有,也可以从Apple Developer Connection下载安装;

第二步,安装Macports 1.6 for Leopard,安装方法和shell变量设置参见官方guide。其实原文中提到的automake、flex等几个工具都可以直接从tarball编译,但是由于依赖关系比较复杂,所以还是推荐从Macports安装。需要注意的是其中某些lib会在编译过程中进行连接,所以必须编译成为UB代码,这一点只需要在安装时加参数+universal,比如sudo port -v install automake +universal,但不能写成sudo port -v install gettext automake +universal,这样写gettext依然只有i386 arch的代码。按这个方法用macports安装automake, flex, gettext, libpng即可。
ps:原文中说macports中crypto++很古旧,其实已经更新到5.5.2了,呵呵。

第三步,编译安装crypto++。这个东西非常烦人,困惑了很久,等下具体说。下载crypto 5.5.2源代码(官网好像被墙了?从sourceforge上下吧)。crypto++没有configure文件,需要修改GNUmakefile。在第一行CXXFLAGS中增加参数-arch i386 -arch ppc,即改为CXXFLAGS = -DNDEBUG -g -O2 -arch i386 -arch ppc,然后make -f GNUmakefile进行编译(貌似不使用参数f连接时会出现找不到lcryptopp的情况)。接下来sudo make install PREFIX=/usr/local/cryptopp进行安装(这个地方我做了一件比较笨的事情,不单安装在了/usr/local/cryptopp,而且在/usr和SDK的/Developer/SDKs/MacOSX10.5.sdk/usr下面各装了一次,所以最后自己也搞不清楚连接时究竟用了哪一个,也没找到哪里有编译log,还望高手赐教)。

第四步,编译wxMac。首先去官网下载wxMac-2.8.7源代码,解压后在终端执行:
cd wxMac-2.8.7/build
../configure –disable-shared –enable-unicode –enable-debug –enable-debug_gdb –enable-universal_binary
这一步完全按照原文进行。编译完成后不需要install,但是要把amule-cvs目录和wxMac-2.8.7目录放在同一个目录下面。

第五步,编译aMule。在终端执行:
cd amule-cvs
./configure –disable-systray –disable-gtk –enable-embedded_crypto
–with-wx-config=../wxMac-2.8.7/build/wx-config
–enable-cas –enable-webserver –enable-amulecmd
–enable-debug –disable-optimize –with-crypto-prefix=/usr/local/cryptopp

–disable-dependency-tracking
CFLAGS=”-arch ppc -arch i386 -isysroot /Developer/SDKs/MacOSX10.5.sdk”
CXXFLAGS=”-arch ppc -arch i386 -isysroot /Developer/SDKs/MacOSX10.5.sdk”
make
如果没什么问题,编译通过之后就基本成功了。

第六步,打包app。在终端中执行./src/utils/scripts/mac_packager,结束后在amule-cvs中应该可以看到最终完成的bundle了,静态链接的程序大概有65MB。。。。

呵呵,本人并非专业人士,缺乏理论素养,花了很长时间才完成。希望大家能指正本文中的错误,本人感激不尽。最后谢谢jjgod大仙,呵呵,也推荐大家去看看jjgod的blog,真的受益非浅。

y2pBuTnVs_xuy24wUnJqOf8-IJTYyXE31uxFz1TJUNdQ4Wq26KMywZc7-nQJRm2edgv8L-RA4VOQF_MqUnsyMw5ww y2prMqsoGEOLhUyLHj-zFCTQT7gKtu8FtrHlAtrYeticuUEz-wItXKjg3z0DzrKlVsA37loZEMtcVyBN8lDnF0qOQ

macports在Leopard下编译universal的一个问题

转载自水木jjgod的blog
http://blog.jjgod.org/2007/12/03/macports-leopard-universal-issue/ 

December 3rd, 2007 by jjgod

近来在开发一个小软件,需要分发程序链接了一些用 macports 安装的库,众所周知,用 macports 安装 universal binary 程序是通过 +universal 这个缺省 variant 实现的。在默认情况下,显然用户不愿意安装 universal 的,既然都在自己机器上编译了,去编译其他平台的二进制程序即浪费时间又浪费空间。所以默认这个 variant 是禁用的,可是如果你自己开发的 Universal Binary 应用要链接用 macports 安装的那些库时,就必须首先确保这些库是 universal binary。

可是在 10.5 下通过 +universal 之后,链接程序会遇到类似下面的错误:

$ sudo port install gettext +universal

—>  Building gettext with target all
Error: Target org.macports.build returned: … returned error 2

gcc -dynamiclib  -o … -L/opt/local/lib -lc 
-isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch i386
-arch ppc -arch i386 -arch ppc -Wl,-framework -Wl,CoreFoundation
-install_name  /opt/local/lib/libintl.8.dylib
-compatibility_version 9 -current_version 9.2
ld: library not found for -ldylib1.10.5.o
collect2: ld returned 1 exit status

这是什么原因呢?仔细看最关键的地方在于,macports 缺省使用了 -isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch i386 -arch ppc 这个编译器参数来生成,可是在 Mac OS X 10.5 下,如果仅仅使用这个参数,系统仍然会以为你要编译的是 10.5 下运行的程序,所以最后会尝试链接 10.5 的 libc,问题是 10.5 的 libc 在 10.4 的 SDK 路径下当然找不到,于是就出错了。参考 Xcode-Users 上的讨论(http://lists.apple.com/archives/Xcode-users/2007/Oct/msg00686.html)。

怎么解决呢?也简单,加上 -mmacosx-version-min=10.4 这个编译参数就行了。不过对于 macports 来说,在哪儿加倒是一个问题,你可以针对每个 port,在 Portfile 里加上:

configure.universal_cflags-append  "-mmacosx-version-min=10.4"

也可以一劳永逸地通过修改 /opt/local/share/macports/Tcl/port1.0/portconfigure.tcl 脚本中的 default configure.universal_cflags 实现,这里是一个简单的 patch(http://trac.macosforge.org/projects/macports/attachment/ticket/13475/portconfigure.t cl.diff)。

这个 patch 已经发到了 macports 的 trac 上,希望能尽快在官方版本中得到修复。

/*
这个问题上次我试图编译aMule CVS Universal Binary的时候就发现了,呵呵。这次要把常用的开发工具全部搞成Universal Binary的。其实Universal Binary这个东东就和Classical一样,总是对一半人有用,一半人没用,但是对于开发者就比较痛苦了。要么准备两套开发平台,要么从头开始把各种libs和tools全部搞成Universal Binary。在x86平台上编译PowerPC构架部分真是慢。。。。

谈论 MS太贱了——关于firefox在live space无法发布日志的解决

 

引用

MS太贱了——关于firefox在live space无法发布日志的解决
刚刚用firefox发布日志,才发现竟然发布日志和保存为草稿两个按钮是灰色的
心想MS你要打击firefox也用不着这样吧,于是又一顿google,又让我找到了解决办法:

首先,你需要安装Firefox扩展 greasemonkey。这个扩展可以使你在加载一个页面的时候执行一段你自己的Javascript程序。

安装之后,将下面的程序拷贝到一个文本文件,并把扩展名改成 .user.js。(务必是.user.js,否则greasemonkey无法自动安装之)。

===脚本开始,拷贝时请不要包含这一行===
// ==UserScript==
// @name Enable Live Space Post Button
// @namespace http://ftofficer.spaces.live.com
// @description Enable Live Space Post Button
// @include http://*.spaces.live.com/*
// ==/UserScript==

function LiveSpace_enableButton(id) {
var button = document.getElementById(id);
if ( button ) {
var cls = button.getAttribute("class");
var clsNameEnd = cls.indexOf("spDisabled");
if ( clsNameEnd != -1 ) {
clsNameEnd–; // skip " " before spDisabled
var newCls = cls.substring(0, clsNameEnd);

button.setAttribute("class", newCls);
button.setAttribute("mi:state", "enabled");

var aNode = document.createElement("a");
aNode.id = id;
aNode.href = "#";
}
}
}

LiveSpace_enableButton("actionToolbarBlogPost");
LiveSpace_enableButton("actionToolbarSave");

===脚本结束,拷贝时请不要包含这一行===

然后将这个js文件拖放到Firefox窗口中,greasemonkey会弹出对话框询问是否安装,选择是,即可完成安装。

然后,去Live Space的“添加日志”当中看看吧。

如果看到“发布日志”和“保存为草稿”仍然没有启用的话,请看看greasemonkey当中配置的网直通配符是不是和你的网址一致,自己改改看看。在不行可以在这里回复。