2008年06月6日 — cjacker (阅读: 601)
编译时当然很方便,通过宏定义就可以了。
printf(”%d.%d.%d”,__GNUC__,__GNUC_MINOR__,__GNUC_PATCHLEVEL__);
运行时有什么好办法吗?没有找到,只想到了以下几个:
popen(”gcc -v”);解析。
或者popen(”ls /lib/libgcc_s-*”),解析。
还有更干净的方法吗?思考中…
获得glibc版本的方法很简单:getconf GNU_LIBC_VERSION就可以取到了。
归类于: 未分类 | 评论(0)
2008年05月31日 — cjacker (阅读: 567)
某包,运行时不正常,提示需要/var/tmp/xxxx/下的一堆资源。
显然,这是prefix错误,将RPM_BUILD_ROOT当成了自己的prefix。
百思不得其解。
猜测,最大的可能是打包时 时钟错误,比如时间设置小于包内文件的时间等等,造成两次编译:
1,build段,这部分的定义肯定是正确的,%configure绝对就是./configure –prefix=/usr –sysconfdir=/etc ….
2,install段,由时钟错误引起install时,构建环境认为生成的binary不是最新结果,所以需要进行二次构建,在rpm打包过程,这部分是要将binary result安装到/var/tmp/XXXX目录下。所以一般是这么写:
%makeinstall 或者make install DESTDIR=$RPM_BUILD_ROOT.
这是最可能出问题的地方,将DESTDIR=$RPM_BUILD_ROOT传给了make install。而make install因为时钟错误触发了make过程,而make又处理DESTDIR造成构建认为prefix=$RPM_BUILD_ROOT.
最终直接导致binary生成失败。
打包更多是一种体力活和细活,没想到也隐藏着种种陷阱。
归类于: 未分类 | 评论(0)
2008年05月29日 — cjacker (阅读: 593)
总会找到一些文章,而且是大多数文章,在解释lambda的时候总是要描述什么是“lambda”,数学上的关系,历史等等,把一个简单明了又方便使用的小技巧搞的好像高深莫测一样。
lambda就是匿名函数,也就是随用随局部声明的函数。
在Haskell中:
main = do
print $ (\x y->x+y) 2 3
在Python中:
python -c “print ((lambda x,y:x+y)(2,3))”
在csharp 3.0中:
public delegate int MyDelegate(int m, int n);
class T
{
public static void Main(string [] args)
{
MyDelegate myDelegate = (x, y) => x + y;
System.Console.WriteLine(myDelegate(2, 3));
}
}
上面的lambda表达式的特征都是共同的
参数 符号 表达式
\x y -> x+y 符号记法: \ ->
lambda x,y:x+y 符号记法: lambda :
(x,y)=>x+y 符号记法: ()=>
都是在局部声明了匿名的函数,上面的例子看起来多此一举,但比如你要map一个list,对每个元素作特定操作的时候,就非常方便了。
看一个Haskell的例子:
onStop mozembed (mozEmbedGetLocation mozembed >>= \url->entrySetText urlentry url)
本来必须的一个回调函数实现,至少需要传递mozembed和urlentry两个参数,现在用monad记法和lambda表达式就全部省掉了。
如果你不想处理参数,可以在表达式中忽略,或者干脆使用\_ _这样的匿名参数记法。
至于参数自身,则使用了pattern match的方法处理,类型被自动推断。
c/cpp自身是没有lambda实现的,boost.lambda实现了对lambda表达式的支持,但是还是不要使用的好:
_1+_2这样的东西时间长了估计就没人可以看懂。
Conclusion:
1,什么是lambda? 不知道,以后也不需要知道。知道有这么一个玩意就可以了。
2,为什么使用lambda? 现在可以不知道,如果不用,以后也不需要知道。
3,什么是lambda表达式? 看起来大概就是上面那个样子。
4,必须使用lambda吗? 不是。
归类于: 未分类 | 评论(0)
2008年05月22日 — cjacker (阅读: 581)
ZDNet UK的一篇文章列举了10种常见的,但常惹你生气的软件(打印版)。互联网送给你很多玩具,它重写了商业和娱乐的规则。但是你并非不会产生烦恼,实际上它们常常会弄巧成拙,令你痛苦不堪,甚至幻想没有互联网,它从来没有出现过。 Adobe Reader:我们只是用它看电子书,但它却像官僚机构一样臃肿,不间断的更新(还要求重启,这是什么道理?)。
Apple:它让微软看起来是个好人。
Windows Update:“立即重启”,“不要关闭电源,直至5项更新完成”,“你需要安装Microsoft Genuine Advantage”,“请在安装前关闭所有应用程序”。
RealPlayer:犯下的罪行罄竹难书,它嵌入的广告比报纸首页还多(其实和国内的许多软件相比,它已算是圣人了)。
Java:它是一种程序语言,但是不甘寂寞,总是想提醒你Sun有多好,并推销OpenOffice,还在你的浏览器上安装Yahoo Toolbar,天底下有这种语言吗?
Yahoo:它设法控制你的邮件、搜索引擎、主页,更别提该死的工具栏了。
Norton Antivirus:就像是你的桌面出现了撒旦。
预先捆绑的软件:一些公司总是想夹带私货,索尼就是其中的王者:悄悄的安装程序,并加入到系统启动项中,或者消耗巨大的资源。
Outlook/Exchange:当免费的web email飞速发展时,它还是不紧不慢,过好多年才更新一次。
Flash:自我感觉良好的播放器。
归类于: 未分类 | 评论(0)
2007年12月1日 — cjacker (阅读: 798)
一个比较奇怪的问题,描述如下:
root用户,su到一个普通用户得到如下错误:
[root@localhost ~]# su - work
su: warning: cannot change directory to /home/work: Permission denied
su: /bin/bash: Permission denied
而work用户也无法通过login登录,闪现同样错误。
这是一个非常奇怪的问题,到底是什么导致的呢?思路如下:
1,程序执行权限
2,程序依赖的共享库权限
3,目录权限
检查/bin/bash,权限正确,检查/home/work权限正确,检查/lib/ld-***.so,权限也正确。
继续调试,检查/etc/passwd,将work的home设置为/tmp,把/tmp设置为777,这个权限是最宽松的。
su出现同样的错误。
也就是work用户无法访问777权限的/tmp。
问题到底出现在哪里呢?
最后
stat /,因为你ls是看不到的。
File: “/”
Size: 1024 Blocks: 2 IO Block: 1024 目录
Device: 803h/2051d Inode: 2 Links: 22
Access: (0666/drw-rw-rw-) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2007-12-01 22:28:48.000000000 +0800
Modify: 2007-12-01 22:28:34.000000000 +0800
Change: 2007-12-01 23:17:35.000000000 +0800
问题出来了,这里的权限是错误的,X权限的丢失造成的,这里留一个问题自己去查吧:x权限对目录意味着什么?
修改后问题消失。
产生上述问题的方法:
第一种,chmod 666 /,可以导致。
或者,
第二种,chmod 700 /lib/ld-xxxx.so,也可以导致su失败。
有兴趣可以自己试一下。
/权限的丢失对于各种运行在自己用户身份上的daemon也存在同样的影响。
Powered by ScribeFire.
归类于: 未分类 | 评论(0)
2007年11月23日 — cjacker (阅读: 749)
Let's start with the Root System Description Pointer (RSDP) which lets you know how to find everything else. This pointer tells you where to find the Root System Description Table (RSDT) and/or the Extended System Description Table (XSDT). The RSDT is a holder from the 1.0 ACPI spec; the XSDT has the same information but allows the use of 64-bit addresses. This table contains pointers to the Fixed ACPI Description table (FADT) and other tables.
The FADT describes various ACPI registers, information about the SCI interrupt used by the ACPI subsystem, and information about legacy power management support (SMI). it also contains a pointer to the Firmware ACPI Control Structure (FACS) and the Differentiated System Description Table (DSDT). The DSDT contains descriptions of various functions that allow you to retrieve information about fan, temperature, button status, and so on, as well as to control various devices through the ACPI interface.
The Secondary System Description Table (SSDT) is an extension of the DSDT. Your platform may have more than one such table. A pointer to it is located in the RSDT. These are meant to be add-on tables that describe various optional features that your vendor may supply depending on your particular hardware configuration.
A full description of these tables is in section 5 of the ACPI 3.0 specification.
How to dump ACPI tables under Linux.use acpidump and iasl
Powered by ScribeFire.
归类于: 未分类 | 评论(0)
2007年09月21日 — cjacker (阅读: 848)
实现很简单,但是Idea却很重要……
http://www.gnome.org/start/2.20/notes/C/index.html#rnusers-login-and-screensaver
gnome 2.20 support leave messages when the machine is locked.when you unlock it, you will get all the messages.
Here is the clone for KDE.
the patch is applied on kdebase-3.5.7.
actually, you only need recompile kdesktop/lock.
NOTE: it depends on libnotify and notification-daemon.



Patch is here:
http://www.kde-apps.org/content/download.php?content=66631&id=1
Powered by ScribeFire.
归类于: 未分类 | 评论(0)
2007年09月18日 — cjacker (阅读: 986)
C标准函数,似乎不应该有平台问题:
我们看一下这个程序:
#include <unistd.h>
#include <stdio.h>
int main()
{
rename(”/tmp/abc”,”/tmp/bcd”);
perror(”why:”);
}
此程序运行一切正常。
自己将路径修改为不同的分区之间移动,或者将同一分区挂载到不同的mount点进行rename。
看看结果会怎么样。
man 2 rename
oldpath and newpath are not on the same mounted filesystem. (Linux permits a filesystem to be
mounted at multiple points, but rename(2) does not work across different mount points, even if the
same filesystem is mounted on both.)
在Windows上尝试:
rename(”C:\\a.txt”,”D:\\b.txt”);
works!!
Powered by ScribeFire.
归类于: 未分类 | 评论(0)
2007年09月14日 — cjacker (阅读: 1041)
问题的表现,rpm无故崩溃,db文件损坏,随机出现,并且有可能在安装过程中出现,造成系统安装不完整。
根据问题表现的猜测,db文件损坏的可能原因:文件系统,db未正确关闭,线程问题或者C库问题,gcc生成的代码质量不高?
分析:
1,文件系统损坏,这个不靠谱,什么都不坏,单单db坏了,而且,没有任何文件系统损坏的迹象。
2,db没有正确关闭,很有可能,而且,rpm的python确实存在这个问题,退出时没有很好的检查db状态,这个已经打了patch,问题还是存在。
3,线程或者C库,不能吧?大家都用同样的东西,而且整个系统1000多个软件包都是这么构建的,也没有问题
4,同3。
通过对2的修改,解决掉了db为正确关闭的问题,但是,问题仍然存在,那么可能是什么原因?
经过对rpm错误输出的分析,基本可以确定问题是db4导致(rpm使用内嵌的db,并不会使用系统提供的db4)。
调试rpm内嵌的db4,包括其他版本db的port,都没有解决问题或者说db工作的很正常。
反过头来继续分析:
1,问题随机出现
2,安装过程中有可能出现,导致安装失败
3,如果能够成功安装,一般进入系统后第一次安装软件包(通过yum或者手工安装)都会出现。
4,修复一次后以后很难出现。
通过上面的分析基本锁定范围应该是系统的安装程序,因为修复后不会再出现就可以排除系统本身的故障。
那就查查anaconda对db4做了什么吧。
经查:
anaconda中出现如下代码:
rpm.addMacro(”__dbi_htconfig”, “hash nofsync %{__dbi_other} %{__dbi_perms}”)
其中的nofsync就是元凶。
为什么就不说了,自己查查就知道了,去掉这个参数后rpmdb死锁问题得到了彻底的修复。
Powered by ScribeFire.
归类于: 未分类 | 评论(1)
2007年09月14日 — cjacker (阅读: 963)
这个问题是一直存在的:在en_US.utf8或者其他的locale下,qt3/kde中文显示成方块。
后来找了个用fedora 7的朋友验证了一下,问题也是一样的存在。
导致的问题就是:如果你使用en_US或者其他latin的locale环境,在qt3中中文显示不出来,当然gtk2/qt4是OK的。
那么你在所有的kde程序中(至少目前都是kde3)显示的中文都是方块。
通过在qfontdatabase trace,用FcPatternPrint打印FontConfig的匹配Pattern,qt3的字体匹配是没有问题的,那问题到底在哪呢?
在qfontdatabase.cpp中有这样一段代码:
#ifdef Q_WS_X11
if (script == QFont::Han) {
// modify script according to locale
static QFont::Script defaultHan = QFont::UnknownScript;
defaultHan = QFont::Han_SimplifiedChinese;
if (defaultHan == QFont::UnknownScript) {
QCString locale = setlocale(LC_ALL, NULL);
if (locale.contains(”ko”))
defaultHan = QFont::Han_Korean;
else if (locale.contains(”zh_TW”) || locale.contains(”zh_HK”))
defaultHan = QFont::Han_TraditionalChinese;
else if (locale.contains(”zh”))
defaultHan = QFont::Han_SimplifiedChinese;
else
defaultHan = QFont::Han_Japanese;
}
script = defaultHan;
}
#endif
不用过多解释了,需要LC_ALL,一个英文或者latin的locale当然不会设置LC_ALL了,也不可能出现LANG=en_US.utf8, LC_ALL=zh_CN.utf8这样的设置(比较变态,虽然可以工作),如果不设置,中文将被当成QFont::UnknownScript;可以匹配到中文字体,但是不能正确显示。
怎么修改呢?这里提供几个办法:
1,老老实实把LC_ALL设置成你需要的,比如LC_ALL=zh_CN.utf8。
2, 注释掉这段代码,对于中文用户,应该没什么问题。
3,通过其他的方式来判断需要将script设置成什么。
Powered by ScribeFire.
归类于: 未分类 | 评论(0)