一大早又起来弄刚安装好的Ubuntu9.04,其实本来是想一直用Fedora的,可是无奈10对ATI显卡的支持真的是没得说。更新后老是无法进入xwindow,把显卡驱动卸后就没事了,可是总感觉到少了些什么。哈,好像有点扯远了,本来就是要说关于linux fetion的问题。
我在安装ubuntu时home目录是保存原来的(单独挂载到一个盘),这样似乎会导致一个问题,安装好的fetion无法启动,在命令行里启动时出现这样的错误信息:linux-fetion: error while loading shared libraries: libcurl.so.4: cannot open shared object file: No such file or directory。OH,原来是少了文件呐,就马上去新立德里搜索libcurl.so.4装上,心想现在应该没问题吧,再次双击fetion,还是无法启动,出现:Failed to execute child process "linux-fetion"(Permission denied)。这到底是什么破问题啊,以前在fedora时也没有这么多问题啊,后来试下在命令行里用超级用户权限启动,咦,发现行了,原来问题出在文件权限这里。
跑到/usr/bin目录里,把linux-fetion这个可执行文件的所属用户改变我登陆时的用户,然后再次启动,这次行了,可是什么图标都没有,看来那些配置文件也得全部改了。接着把/usr/share/libfetion这个目录的所属用户也全部改了,现在再次启动就OK了!
Linux下歌词新星
发帖者
coolzgx
时间:
5/08/2009
今天无意中在别人的博客上看到一个基于pyQt、dbus等技术的一个歌词显示工具,比起那些插件,lrcShow-X的启动方法略显麻烦,要先启动播放器,然后再在命令行里运行./lrcShow-X.py。目前其支持的播放器为:Amarok2、Audacious、Qmmp、 Exaile、Vlc和Quodlibet。其中audacious支持得最为完美。
不可否认其功能还是很强大,歌词编辑、调整和在视觉上的调整上都提供了支持。不过觉得歌词自动下载略显不足,经常得自己手动去搜,但总体来说lrcShow-X还是很不错的,值得试用。
PS:
链接:http://www.sanfanling.cn/read.php?267
下载:http://www.kde-apps.org/content/show.php?content=103055
不可否认其功能还是很强大,歌词编辑、调整和在视觉上的调整上都提供了支持。不过觉得歌词自动下载略显不足,经常得自己手动去搜,但总体来说lrcShow-X还是很不错的,值得试用。PS:
链接:http://www.sanfanling.cn/read.php?267
下载:http://www.kde-apps.org/content/show.php?content=103055
“Hello World!”的N种写法(转载)
发帖者
coolzgx
时间:
5/08/2009
在初学一门编程语言的时候,写一个“Hello world!”程序是最常见的入门方法。通过写一个成功的“Hello world!”,可以实践这门语言最基本的语法特性,还可以带给自己成就感,真是一举两得。C/C++语言本身有很多特性,如果能够将这些技术分解出来变 成一个个的“Hello world!”,并且将这些技术点到为止,貌似也算是一件善事。这里,列举了10个“Hello world!”程序,大家雅俗共赏一下。
1. 最经典的“Hello world!”
“Hello world!”最经典的写法当然是直接用 printf 输出“Hello world!”这几个字符了。无论用C还是 C++,写起来都非常的简洁明了。这里把最常见的几个全部列在下面。
#include
#include
int main()
{
printf("Hello world!"); // 教科书的写法
puts("Hello world!"); // 我最喜欢的
puts("Hello" " " "world!"); // 拼接字符串
std::cout << "Hello world!" << std::endl; // C++风格的教科书写法
return 0;
}
特别需要注意的是,在C/C++里,如果两个字符串之间除空白符以外没有任何东西,编译器会自动认为这两个字符串是连在一起的字符串。这样,如果一个字符串过长,可以用这种方法换行来写,既不浪费性能,又美观。
2. 用宏写的“Hello world!”
在C/C++里,宏是一个神奇的东西。特别是在C语言中,宏可以帮我们做一些“又脏又累”的活,包括拼接代码片断、隐藏繁琐的实现细节等等。其中特别有趣的是“#”的用法,它可以“提取”参数的名字,把它变成字符串。
#include
#define Say(sth) puts(#sth)
int main()
{
return Say(Hello world!);
}
请注意,这个Hello world可是完全没有出现引号哦!
3. 断章取义的“Hello world!”
字符串是一种常量这当然毫无疑问,但是它的类型是什么,这就需要考虑一下了。使用C++的typeid就可以这个问题的答案,而且只要是符合C或C++标 准的编译器就应该是一样的结果。比如字符串“Hello world!”,它的类型就是 char const [13]。
知道了这个,就可以写出以下的“Hello world!”:
#include
int main()
{
return puts(&"Do not say: Hello world!"[12]);
}
4. 退出时运行的“Hello world!”
大家都知道 main 函数退出意味着程序结束,可是这并不完全正确,我们完全可以在 main 函数退出以后做很多事呢——比如说,输出“Hello world!”。这个功能依赖于C标准库中提供的函数 atexit(),调用这个函数并注册自己的回调函数就行。需要注意,这个函数可以调用多次,最后注册的函数最先执行。
// 本文转自 C++Builder 研究 - http://www.ccrun.com/article.asp?i=999&d=v433i2
#include
#include
void say()
{
printf("world!");
}
void sth()
{
printf("Hello ");
}
int main()
{
return atexit(say), atexit(sth);
}
5. 读取自己的“Hello world!”
C/C++的编译器提供了一些有用的内置宏,最常用的就是 __FILE__ 和 __LINE__ 了。其中,__FILE__ 代表当前的源文件的文件名,嗯,对了,如果我们让这个程序读取自己的源文件,不就可以做一个很有意思的“Hello world!”了么?
// Hello world!
#include
#include
#include
int main()
{
std::ifstream ifs(__FILE__);
std::string say, some, word;
ifs >> say >> some >> word;
std::cout << some << " " << word;
return 0;
}
6. 话分两头的“Hello world!”
有了C++的类,我们就可以光明正大的在 main 函数执行之前和之后做感兴趣的事情了。我们可以声明一个全局的类的实例,这样,在 main 函数执行之前会调用这个类的构造函数,结束之后则会调用析构函数。
#include
class say
{
public:
say()
{
std::cout << "Hell";
}
~say()
{
std::cout << "world!";
}
}hello;
int main()
{
std::cout << "o ";
return 0;
}
7. 传入模板的“Hello world!”
C++的模板功能极为强大,可以说是C++里面最艰深、最经典、最时尚的部分。一个“Hello world!”当然无法使用很多很高级的模板技巧,我也不想只使用模板特化这样无阻挂齿的小技巧,嗯,那就来演示一个比较罕见的用法吧。
#include
template
class say
{
public:
void operator () ()
{
std::cout << words;
}
};
extern char hello[] = "Hello world!";
int main()
{
return say()(), 0;
}
请注意,这个 extern 是十分必要的,只有加上了 extern,这个指针才是一个编译器间可以确定的值,也才可以参与模板运算。还有,hello 必须为数组类型,而不能为 char*,这个道理和加 extern 是一样的。
此外,这里还演示了 functor 的用法,嗯,关于它的优点就不在这里多说了,反正是与原生指针相比有很多好处就是了。
8. 调用私有函数的“Hello world!”
我们知道,C++类的私有函数是不能被外界访问的,比如说 main 函数里面,它绝对不能访问类的私有函数,除非把它设为类的友元函数。不过我们还是可以用一些比较奇怪的方法访问类的私有函数——当然,这个私有函数必须满足一个条件:它是虚函数。
这里就涉及到一个问题,指向虚函数的虚表放在哪里?对于 VS.Net 2003 而言,虚表是类的第一个成员,虚函数指针按照函数声明的顺序放在虚表里面。当然,这个说法并不严谨,更细节的东西还是去看看那本“成人高钙奶粉”吧,它会给出最权威的解答。
这里是一个很有意思的例子:
#include
#include
class secret
{
private:
virtual void say()
{
std::cout << "Hello world!";
}
};
int main()
{
secret word;
(reinterpret_cast(**(intptr_t**)(&word)))();
return 0;
}
9. 最暴力的“Hello world!”
最暴力的调用函数的方法是:直接修改函数的返回地址,让这个地址指向我们想要调用的函数。这也就是缓冲区溢出漏洞的应用方法了,不过里面还涉及到很多问 题,在这里就不一一列举,想要了解的话,还是去 Google 吧。这里只演示一个可以在 VS.Net 2003 下可以用的“Hello world!”。
#include
#include
#include
void say()
{
puts("Hello world!");
exit(0);
}
int main()
{
volatile intptr_t a = 0;
volatile intptr_t * p = &a;
*(p + 2) = (intptr_t)say;
*(p + 3) = (intptr_t)say;
return 0;
}
10. 外星人说的“Hello world!”
好了,这个“Hello world!”是最匪夷所思的一个了!不过它并没有涉及任何复杂的C/C++语言特性,只是看起来有点酷。你能看懂外星人在说什么不?
#include
void alien_say(char * p)
{
while (putchar(*(p += *(p + 1) - *p)));
}
int main()
{
return alien_say("BETHO! Altec oh liryom(a loadjudas!) dowd."), 0;
}
1. 最经典的“Hello world!”
“Hello world!”最经典的写法当然是直接用 printf 输出“Hello world!”这几个字符了。无论用C还是 C++,写起来都非常的简洁明了。这里把最常见的几个全部列在下面。
#include
#include
int main()
{
printf("Hello world!"); // 教科书的写法
puts("Hello world!"); // 我最喜欢的
puts("Hello" " " "world!"); // 拼接字符串
std::cout << "Hello world!" << std::endl; // C++风格的教科书写法
return 0;
}
特别需要注意的是,在C/C++里,如果两个字符串之间除空白符以外没有任何东西,编译器会自动认为这两个字符串是连在一起的字符串。这样,如果一个字符串过长,可以用这种方法换行来写,既不浪费性能,又美观。
2. 用宏写的“Hello world!”
在C/C++里,宏是一个神奇的东西。特别是在C语言中,宏可以帮我们做一些“又脏又累”的活,包括拼接代码片断、隐藏繁琐的实现细节等等。其中特别有趣的是“#”的用法,它可以“提取”参数的名字,把它变成字符串。
#include
#define Say(sth) puts(#sth)
int main()
{
return Say(Hello world!);
}
请注意,这个Hello world可是完全没有出现引号哦!
3. 断章取义的“Hello world!”
字符串是一种常量这当然毫无疑问,但是它的类型是什么,这就需要考虑一下了。使用C++的typeid就可以这个问题的答案,而且只要是符合C或C++标 准的编译器就应该是一样的结果。比如字符串“Hello world!”,它的类型就是 char const [13]。
知道了这个,就可以写出以下的“Hello world!”:
#include
int main()
{
return puts(&"Do not say: Hello world!"[12]);
}
4. 退出时运行的“Hello world!”
大家都知道 main 函数退出意味着程序结束,可是这并不完全正确,我们完全可以在 main 函数退出以后做很多事呢——比如说,输出“Hello world!”。这个功能依赖于C标准库中提供的函数 atexit(),调用这个函数并注册自己的回调函数就行。需要注意,这个函数可以调用多次,最后注册的函数最先执行。
// 本文转自 C++Builder 研究 - http://www.ccrun.com/article.asp?i=999&d=v433i2
#include
#include
void say()
{
printf("world!");
}
void sth()
{
printf("Hello ");
}
int main()
{
return atexit(say), atexit(sth);
}
5. 读取自己的“Hello world!”
C/C++的编译器提供了一些有用的内置宏,最常用的就是 __FILE__ 和 __LINE__ 了。其中,__FILE__ 代表当前的源文件的文件名,嗯,对了,如果我们让这个程序读取自己的源文件,不就可以做一个很有意思的“Hello world!”了么?
// Hello world!
#include
#include
#include
int main()
{
std::ifstream ifs(__FILE__);
std::string say, some, word;
ifs >> say >> some >> word;
std::cout << some << " " << word;
return 0;
}
6. 话分两头的“Hello world!”
有了C++的类,我们就可以光明正大的在 main 函数执行之前和之后做感兴趣的事情了。我们可以声明一个全局的类的实例,这样,在 main 函数执行之前会调用这个类的构造函数,结束之后则会调用析构函数。
#include
class say
{
public:
say()
{
std::cout << "Hell";
}
~say()
{
std::cout << "world!";
}
}hello;
int main()
{
std::cout << "o ";
return 0;
}
7. 传入模板的“Hello world!”
C++的模板功能极为强大,可以说是C++里面最艰深、最经典、最时尚的部分。一个“Hello world!”当然无法使用很多很高级的模板技巧,我也不想只使用模板特化这样无阻挂齿的小技巧,嗯,那就来演示一个比较罕见的用法吧。
#include
template
class say
{
public:
void operator () ()
{
std::cout << words;
}
};
extern char hello[] = "Hello world!";
int main()
{
return say
}
请注意,这个 extern 是十分必要的,只有加上了 extern,这个指针才是一个编译器间可以确定的值,也才可以参与模板运算。还有,hello 必须为数组类型,而不能为 char*,这个道理和加 extern 是一样的。
此外,这里还演示了 functor 的用法,嗯,关于它的优点就不在这里多说了,反正是与原生指针相比有很多好处就是了。
8. 调用私有函数的“Hello world!”
我们知道,C++类的私有函数是不能被外界访问的,比如说 main 函数里面,它绝对不能访问类的私有函数,除非把它设为类的友元函数。不过我们还是可以用一些比较奇怪的方法访问类的私有函数——当然,这个私有函数必须满足一个条件:它是虚函数。
这里就涉及到一个问题,指向虚函数的虚表放在哪里?对于 VS.Net 2003 而言,虚表是类的第一个成员,虚函数指针按照函数声明的顺序放在虚表里面。当然,这个说法并不严谨,更细节的东西还是去看看那本“成人高钙奶粉”吧,它会给出最权威的解答。
这里是一个很有意思的例子:
#include
#include
class secret
{
private:
virtual void say()
{
std::cout << "Hello world!";
}
};
int main()
{
secret word;
(reinterpret_cast
return 0;
}
9. 最暴力的“Hello world!”
最暴力的调用函数的方法是:直接修改函数的返回地址,让这个地址指向我们想要调用的函数。这也就是缓冲区溢出漏洞的应用方法了,不过里面还涉及到很多问 题,在这里就不一一列举,想要了解的话,还是去 Google 吧。这里只演示一个可以在 VS.Net 2003 下可以用的“Hello world!”。
#include
#include
#include
void say()
{
puts("Hello world!");
exit(0);
}
int main()
{
volatile intptr_t a = 0;
volatile intptr_t * p = &a;
*(p + 2) = (intptr_t)say;
*(p + 3) = (intptr_t)say;
return 0;
}
10. 外星人说的“Hello world!”
好了,这个“Hello world!”是最匪夷所思的一个了!不过它并没有涉及任何复杂的C/C++语言特性,只是看起来有点酷。你能看懂外星人在说什么不?
#include
void alien_say(char * p)
{
while (putchar(*(p += *(p + 1) - *p)));
}
int main()
{
return alien_say("BETHO! Altec oh liryom(a loadjudas!) dowd."), 0;
}
用一句话概括四大名著
发帖者
coolzgx
时间:
5/06/2009
最点题的答案:
西游:疯狂的猴子
红楼:疯狂的石头
水浒:疯狂的好汉
三国:疯狂的战争
最时尚的答案:
西游:三藏团队的艺术化管理
红楼:败家子是怎样炼成的
水浒:兄弟连
三国:是金子总会发光的--记农村优秀青年孔明
最社会的答案:
西游:俺们天上有人
红楼:俺们朝廷有人
水浒:俺们江湖有人
三国:俺们有的是人
最批判的答案:
西游:公款旅游
红楼:公款追MM
水浒:公款吃喝
三国:为了公款旅游、公款追MM、公款吃喝而奋斗
最畅销的答案:
西游:《论旅游开发--唐朝学者记录沿途奇遇》
红楼:《论大观园开发--美女公关口述公司内幕》
水浒:《论梁山开发--108人旅游团的悲惨遭遇》
三国:《论中原开发--三大公司争夺开发权内幕》
最直接的答案:
西游:一个人和三个怪物的故事
红楼:一个男人和一群女人的故事
水浒:一群男人和三个女人的故事
三国:三个男人和战争的故事
最本质的答案:
西游:猴子被人驯服
红楼:男人被女人驯服
水浒:好汉被官府驯服
三国:和平被战争驯服
最“有戏”的答案:
西游:呔,妖怪!
红楼:嗨,妹妹!
水浒:嘿,老大!
三国:是,将军!
最实用的答案:
西游:真经的取法
红楼:爱情的谈法
水浒:牛肉的吃法
三国:战争的打法
最“影迷”的答案:
西游:动物王国历险记
红楼:趟过女人河的男人
水浒:我在黑社会的日子
三国:古惑仔之胜者为王
最“歌迷”的答案:
西游:人在旅途
红楼:你究竟有几个好妹妹
水浒:其实不想走
三国:英雄泪
最无奈的答案:
西游:神仙靠不住
红楼:亲戚靠不住
水浒:老大靠不住
三国:盟友靠不住
西游:疯狂的猴子
红楼:疯狂的石头
水浒:疯狂的好汉
三国:疯狂的战争
最时尚的答案:
西游:三藏团队的艺术化管理
红楼:败家子是怎样炼成的
水浒:兄弟连
三国:是金子总会发光的--记农村优秀青年孔明
最社会的答案:
西游:俺们天上有人
红楼:俺们朝廷有人
水浒:俺们江湖有人
三国:俺们有的是人
最批判的答案:
西游:公款旅游
红楼:公款追MM
水浒:公款吃喝
三国:为了公款旅游、公款追MM、公款吃喝而奋斗
最畅销的答案:
西游:《论旅游开发--唐朝学者记录沿途奇遇》
红楼:《论大观园开发--美女公关口述公司内幕》
水浒:《论梁山开发--108人旅游团的悲惨遭遇》
三国:《论中原开发--三大公司争夺开发权内幕》
最直接的答案:
西游:一个人和三个怪物的故事
红楼:一个男人和一群女人的故事
水浒:一群男人和三个女人的故事
三国:三个男人和战争的故事
最本质的答案:
西游:猴子被人驯服
红楼:男人被女人驯服
水浒:好汉被官府驯服
三国:和平被战争驯服
最“有戏”的答案:
西游:呔,妖怪!
红楼:嗨,妹妹!
水浒:嘿,老大!
三国:是,将军!
最实用的答案:
西游:真经的取法
红楼:爱情的谈法
水浒:牛肉的吃法
三国:战争的打法
最“影迷”的答案:
西游:动物王国历险记
红楼:趟过女人河的男人
水浒:我在黑社会的日子
三国:古惑仔之胜者为王
最“歌迷”的答案:
西游:人在旅途
红楼:你究竟有几个好妹妹
水浒:其实不想走
三国:英雄泪
最无奈的答案:
西游:神仙靠不住
红楼:亲戚靠不住
水浒:老大靠不住
三国:盟友靠不住
订阅:
博文 (Atom)