也许我不该让她走
MM去新塘一个小学做代课老师了。她当时问我好不好去。偶总觉得这些事要让她自己决定才好。
因为事关于她的前程。
偶总想她能有自己的想法。能自己决定自己的东西,不要依赖于某些人。
去了当天晚上她就打电话回来说那里的待遇不是很好。并且只有她一个人住在那宿舍里。很害怕。
决择总是痛苦的。无论选择那一面都可能会有后悔的时候。这是意志不坚定者的苦恼。
很明显,偶的意志很不坚定。
其实,我是不应该让她走的。
最近期的物质欲望
数码相机。像素500万左右。这样可以记录我的流浪生活,为我的出游做准备。其实我是很喜欢照相
的。每次看见以前的自己,总会有些感动。每次看见相片里的自己,再看看镜子里的自己,才会感到
成长的变化。世事沧桑都会反应在相片中!
希望这两三个月能实现。
宽屏显示器。这样在电脑前干什么事都爽。这个欲望有点奢侈。但渴望中! 因为比较奢侈,所以不急着
实现。计划这一两年内!
我为什么不选择Windows
本来是见惯世面了,这类文章在各大Linux论坛中是每个月都会出现的,大家都称
之为”月经贴“的啦!一般是一两个新人试用了Linux一两天,然后就以救世主的姿态
来说明是Linux需要普及还需要什么什么的!然后下面又有一大堆新近的Linux爱好者
说明楼主怎样怎样。颇有troll的嫌疑。
偶作为乡民(网络用语:看热闹的人)的身份,
浏览了一遍,本来是普通用户的话,就算了,可是一位技术人员,偶对他就有些求全责备
了。关于反对的话我也不说了,因为不需要我说。它的回贴者已经很好地回应了。
不过有好些回贴者又发起了人身攻击,这也是不太应该。不过这位技术人员得负些责任了。
本来这个选择window还是linux的问题,几乎可以比美宗教斗争了。一个派系攻击另一个派系
。在中国有一个特点,任何的争论,最后都只会剩下口舌之争,互相人身攻击。
下面是上面博客中一个留言内容。
================================
详细看了一下大家的回复,对于反对我的人,如果你是在windows+IE下回复你的反对言伦的,我鄙视你。自己就在做着否定自己的事情,怎么有资格说别人,特别是那些骂人的,请先看看你自己在用什么?你自己为什么不天天使用linux,想明白了再回复。
================================
偶现在已经可以算得上是纯正的Linux爱好者了,偶是天天用Linux的,因为偶硬盘上没有windows。
所以偶想偶还是有资格说说你们的吧!当然我不是要骂你 , 呵呵~
{也许偶也写一篇名叫偶为什么不选择Linux,或Linux在中国没前途之类的文章,偶博客的
点击率会立马上去哩~
}
偶作为有聊之就写一遍:我为什么不选择Window相对应吧。对于不了解Linux的初学者偶以前也写过一篇文章了,给Linux初学者说清的几个问题不再重复。偶不用我们,偶没有找到其他
人认同偶代表他的。所以只是行使偶自己的言论自由,决不以大众的名义去忽攸大家。
1.Windows要钱,太贵了。
装一个Windows XP,要三千多吧,再来个办公的office,又要三千多。
流行软件是很多。不过大部分要自己找注册码破解。不然就是广告,弹出栏。时间限制。
我跟你讲,这纯属道德问题。
– 引自《疯狂的石头》
盗版问题也不多说了。这里提一下,你是用得理直气壮的话我也无语。大家得了便宜还是
得卖点乖。别大声张扬。
2.病毒流行。
几乎每年都会爆发一次大规模的病毒风波吧。像那次什么冲激波,震荡波啊。为了防病毒,装
杀毒软件吧。内存本来就不多,还要分一部分给杀毒软件,防火墙。晕。杀毒软件也是要钱的
啊。找破解版,上网到处找注册码。
3.流氓软件很多,随时有被插的危险。
偶舍友用的是windows,因为他的电脑放在厅里,所以吃饭的时候偶们会看一下他电脑上的片子。
用realone打开一个电影。十秒钟内跳出十个页面,挡住了屏幕。严重影响观赏。因为偶不熟习
window,举不出更多的例子了。不过看看donew就知道了,最近老在谈论这个流氓软件哩。
更有甚者,还有一位博客提出流氓插的时候温柔点,别改主页,注册表就行。偶当时看了感觉就像
在请求强奸犯做案的时候带套,冷静地对待。已经达到见惯不怪的地步了,可谓之强。
偶没有这个习惯,所以别搞我!
4.重装率频繁
系统用得久了就一定会慢,磁盘就肯定乱。这几乎是定理。当时是很多熟知电脑(其实是Window)
的人告诉我的。用windows的几乎是每三个月重装一次。遇到问题的唯一解决方法就是重装,别
告诉我你是技术高手。当年在我认识的高手当中(如今不少是程序员),自己解决问题,帮别人解决
问题的方式就是重装。
linux出了问题,偶可以去google找答案,去irc,qq群里问人。耐心好一点都是可以解决的,并且还
可以学习到新的东西。无论怎样大的问题,都可以不用重装解决(除非你整个硬盘坏了)。
4样式单一。
永远是蓝天白云。千篇一律。没有个性化。定制个东西难于上青天。因为提供的都是二进制的东西。
虽然有改主题的软件,但是占用太大的资源了。并且还是用别人的东西,不能激活自己的创造性。
并且好像还要钱。
5.不利用于学习编程
默认装上的window,没有编程功能。还要自己去找个ide。一个ide几乎是一个系统那么大了。天啊
,我只想写个hello world而已啊。想找个源代码看看,学习下编程。买书吧,书中有例子。有没有
项目大一点的开源软件啊? 有啊,Linux下繁星那么多。window下的mfc的就好难找了。嗯,去找些
人一起讨论讨论吧。高手好像都不上QQ群的,irc上都是linux爱好者。
想学习下操作系统,只有理论,没有代码,window可没有代码公开啊。要学习操作系统,那还是看
Unix类。
就写这么多吧。写了许久突然发现无趣这样很无趣。
总之,谁解决了我上述问题。谁的Linux将小行其道。真正成为一小部分人的爱好。不过就算你解决
了,我也不会选择windows。 我不选择window并不是因为上面的原因。我不选择window的原因很
简单,因为我选择了Linux。我选择linux的原因也很简单,因为我喜欢这个系统。关你window什么事。
DoWhile(0)
更详细参考Kernelnewbies
为啥内核里有这么多 do{ }while(0) 的宏啊?一开始我也好不明白。感觉不出用了会有什么效果。不过明白之后就知道它的好处了。好处就在于多语句的宏。
#define FOO(x) print("arg is %sn",x);do_something(x);
在代码中使用:
if(2==blah) FOO(blah);
预编译展开后:
if(2==blah)
print("arg is %sn",blah);
do_something(blah);
看到了吧,do_something函数已经脱离了if语句的控制了。这可不是我们想要的。使用do{}while(0);就万无一失了。
if (2== blah)
do {
printf("arg is %sn", blah);
do_something(blah);
} while (0);
当然你也可以使用下面这种形式:
#define exch(x,y) { int tmp; tmp=x; x=y; y=tmp; }
但是它在if-else语句中会出现问题。如:
if (x > y)
exch(x,y); // Branch 1
else
do_something(); // Branch 2
展开后:
if (x > y) { // Single-branch if-statement!!!
int tmp; // The one and only branch consists
tmp = x; // of the block.
x = y;
y = tmp;v}; // empty statementelse
// ERROR!!! "parse error before else"do_something();
看到了吧,else成了语法错误了。使用do{}while(0)就不会有这个问题了。
if (x > y)
do {
int tmp;
tmp = x;
x = y;
y = tmp;
} while(0);
else
do_something();
嗯,现在明白之后,自己的代码也记得用啊!
为博客打扮之添加url图标
看见过许多网站URL前面都会有一个图标,一些个人的博客的URL上也有。
于是搞来玩玩。
问问了TG(偶一网友),得到方法。
===============================
<link rel=”icon” xhref=”/favicon.ico” mce_href=”/favicon.ico” type=”image/x-icon”>
<link rel=”shortcut icon” xhref=”http://static.flickr.com/90/222800378_c6f6a171b3_o.png” mce_href=”http://static.flickr.com/90/222800378_c6f6a171b3_o.png”
type=”image/x-icon”>
===============================
把png文件的url换成你想要的文件url,并把上面的代码拷贝到你侧栏编辑中的某一栏内容里。
代码啥意思偶也不清楚,反正能成。不求甚解! 有空的网友玩玩!
睡清华校园的家长不惨。
咋一看这则新闻,第一印象真的是觉很惨。可怜天下父母心是不错。但回头想想,他们其实不惨啊。
也早有人分析过了。去得了北京的,家里还能算穷的嘛!真正惨的是你见不着的,在乡下砸锅卖铁凑
学费的父母。哪还有钱去北京啊!
偶发一感!
LikelyUnlikely
更好的解释请看Kernelnewbies
在内核中常会见到下面这样的代码。
bvl = bvec_alloc(gfp_mask, nr_iovecs, &idx);
if (unlikely(!bvl)) {
mempool_free(bio, bio_pool);
bio = NULL;
goto out;
}
这个likely()和unlikely()其实是宏定义。原始定义在 include/linux/compiler.h中,如下:
#define likely(x) __builtin_expect(!!(x), 1) #define unlikely(x) __builtin_expect(!!(x), 0)
__builtin_expect是GCC内建的函数。下面引用linuxform中的一篇讲GCC扩展文章
的一部分(原我找到的也是引用的文章,此处给出链接),里面解释得很清楚。
------------------------------------------------------- * __builtin_expect(EXP, C) 内建函数 __builtin_expect 用于为编译器提供分支预测信息,其返回值是整数表达式 EXP
的值,C 的值必须是编译时常数。例如:
++++ include/linux/compiler.h
13: #define likely(x) __builtin_expect((x),1)
14: #define unlikely(x) __builtin_expect((x),0)
++++ kernel/sched.c
564: if (unlikely(in_interrupt())) {
565: printk("Scheduling in interruptn");
566: BUG();
567: }
这个内建函数的语义是 EXP 的预期值是 C,编译器可以根据这个信息适当地重排
语句块的顺序,使程序在预期的情况下有更高的执行效率。上面的例子表示处于中
断上下文是很少发生的,第 565-566 行的目标码可能会放在较远的位置,以保证
经常执行的目标码更紧凑。
-------------------------------------------------------
总结,这个宏主要是优化的作用。如果英文好的话可以看文章一开始给出的
在kernelnewbies中的链接,那里有更详细的解说。
细心的人应该留意到有一点不同,likely()一开始偶给的定义为__builtin_expect(!!(x),1)。
后来的文章解说中成了__builtin_expect((x),1)。
这应该是后来的版本更改所至。就是新近版本的内核已经更改成__builtin_expect(!!(x),1).
加上个“!!”有什么好处哩。我想是因为使代码强壮与兼容的原因。因为不能保证x表达式的结果一定是1或0,有可能是非0数。加了“!!”,结果就一定是在1和0范围内了。
Blog工具-performancing
一直以来我都使用Blogtk来作为我的博客写作工具。当然它并不是很好用。功能有限。华华曾经推荐一款博客工具logjam给我,这个是针对于livejournal系统的。当然也支持其它的博客系统。但我对于donews没设置成功。看过一下那个软件也再没用了。还是一直用Blogtk。用来写文字还凑合吧。最近贴一些代码的时候就有些愁了。才感到它的功能那么那么有限。
直到今天才发现firefox有一个写博客的扩展 Performancing。试用了一下,还是所见既所得的哩,还有颜色设置,很方便啊。才发觉有相逢恨晚的感觉。嗯,还是和Blogtk告别吧。另一个感叹:Firefox真是强大啊~
理所当然地从今日起,偶的博文都将由Performancing产生了!呵呵!
下面给个图先!
什么是asmlinkage
下面首先在kernelnewibes上的解释。
What is asmlinkage? The asmlinkage tag is one other thing that we should observe aboutthis simple function. This is a #define for some gcc magic that tellsthe compiler that the function should not expect to find any of itsarguments in registers (a common optimization), but only on theCPU's stack. Recall our earlier assertion that system_call consumesits first argument, the system call number, and allows up to four morearguments that are passed along to the real system call. system_callachieves this feat simply by leaving its other arguments (which werepassed to it in registers) on the stack. All system calls are markedwith the asmlinkage tag, so they all look to the stack for arguments.Of course, in sys_ni_syscall's case, this doesn't make any difference,because sys_ni_syscall doesn't take any arguments, but it's an issuefor most other system calls. And, because you'll be seeingasmlinkage in front of many other functions, I thought you shouldknow what it was about.
而我在 2.6.8的内核上的include/linux/linkage.h查到它的定义是:
#ifndef asmlinkage
#define asmlinkage CPP_ASMLINKAGE #endif
进一步,CPP_ASMLINKAGE的定义为:
#ifdef __cplusplus
#define CPP_ASMLINKAGE extern "C" #else #define CPP_ASMLINKAGE #endif
而在include/asm-i386/linkage.h里则有更明确的定义:
#define asmlinkage CPP_ASMLINKAGE __attribute__((regparm(0)))
__attribute__是GCC的C语言扩展语法。regparm(0)表示不从寄存器中传递参数。
另外,如果是__attribute__((regparm(3))),那么调用函数的时候参数不是通过栈传递,而是直接放到寄存器里,被调用函数直接从寄存器取参数。
此句引自了海中一浪的博客文章
asmlinkage确保它定义的函数从栈中读取参数而不是在寄存器中。
啥是__init __exit宏
(学习内核笔记由此开始)
更详细内容请kernelnewibes
原始定义在include/linux/init.h
#define __init __attribute__ ((__section__ (".init.text")))
#define __initdata __attribute__ ((__section__ (".init.data")))
#define __exitdata __attribute__ ((__section__(".exit.data")))
#define __exit_call __attribute_used__ __attribute__ ((__section__ (".exitcall.exit")))
#ifdef MODULE
#define __exit __attribute__ ((__section__(".exit.text")))
#else
#define __exit __attribute_used__ __attribute__ ((__section__(".exit.text")))
#endif
__init和__exit标记函数,__initdata和__exitdata标记数据。
此宏定义可知标记后的函数与数据其实是放到了特定的(代码或数据)段中。
标记为初始化的函数表明公在初始化期间使用。
在模块装载之后,模块装载就
会将初始化函数扔掉。这样可以将该函数占用的内存释放出来。
__exit修饰词标记函数只在模块卸载时使用。如果模块被直接编进内核
或内核不允许卸载模块。被此标记的函数将被简单地丢弃。
