posts - 43,  comments - 64,  trackbacks - 0

小式


撑开一把宽大的油伞
你叫我回头,再相拥一次
铜铁铺里午睡的老人
把父亲的旧桶撂在檐下
篱笆灰墙,斜风矮窗

我会带回红豆的良种
土地就拥有血气与生气
忘记了欢唱的人们
无论多么卑微与庸碌
也会憧憬欢笑与善良

倘若你已经幸福的离开
我会寄去花开的时节
填埋一半自己的坟冢。
相爱的孩子们会记得,
吻的香甜,与未成熟的苦涩



给你们,让我感动过的人们。

我向往悲情的结束无人知,希望你可以理解我的心思,只在你一个人的身上,爱你,而无所求。

29日夜
posted @ 2006-08-30 10:20 周波 阅读(349) | 评论 (0) | 编辑 收藏
  刚刚才把社会实践报告搞定,几千字的东西一点都不难了,上了大学才知道,原来吹嘘和胡扯也是可以凑字数的,根本不像技术文章,深入浅出的字里行间才有价值。

  这个七月和八月,对于家庭来说,是非常关键的两个月,我经历了从父母失业的阴云到现在又平静下来的涨落。于是乎我想了许多,这个世界本来就是充斥着随机与概率的,好像少林足球中的那个涮盘子的师兄说,“为什么我老爸不是李嘉诚呢?”,我也有过这样的想法,其实更加的浓烈,没有好的条件,如何去和别人竞争,都不再一个起跑线上,没有前人的经验,没有引导,只有自己的一切。当然,自己能力强的人完全也可以达到相应的境界,只是太艰难,机遇也很微茫。这是事实,不是我的臆断。但是,人们的大脑中如果充斥着“假设”“如果”这样的字眼,那么将没有任何的动力与那种强烈的欲望。人们的事情都一样,无论是工作还是谈恋爱,总不能说,如果我的老婆是某某该多好,如果我能一个人完成UNIX系统。

  自小不喜欢竞争,只喜欢自己研究好玩的东西,自娱自乐的我,也许不适合那种高压力的投入产出式的生活工作方式。我很佩服那个不领菲尔兹奖的俄罗斯人,无论怎么说,自己就是不喜欢和平常人在一起,搞研究也没有所谓的军事化进度,规模性效应,动辄几百页的篇目。他只是在网上发布了自己的几页手稿,也就是Frameworks的东西。从小也不喜欢说话,口吃是一个原因,更多情况时,觉得无话可说。星座上说是“强烈的羞耻感”,我想人人多多少少会有一些,也都有这样的时刻,没有充分被肯定前我是不会轻易的说出话。我则是将这样的特点发挥得更加艺术,人家问我问题,无论是简单的机器故障,还是朋友咨询我买电脑的事情,从来我都是把我所知道的全部说出来,提供给别人,让他们自己选择。有人还说我是Google过来的,我只能说,你这个人,漠视获取基本知识的能力。当然我也有自己的经验,不可能全部Google去。

  暑假前面的日子都在搞那个RK引擎。嗯……26日前,我所有的Blog都是叫做“Rita's XXXX”,比如这个Blog以前叫做“Rita's Garden”,那个么,叫做“Rita's Kiss”。这简直是一种信仰,我觉得是一种对待感情的最好方式。印象最深刻的一个上午,图形引擎有了一些突破,那个时候气温37度,我还是没有开空调,光着膀子,跑到房间外边的走廊上怪叫一声,然后紧接着感觉两眼昏花,因为没吃早饭呵呵。现在看来,那是相当简单的Trick,当我看过HF2引擎和ORGE引擎后,也知道了Shader程序应该如何与Fixed Functional程序整合。做到了快20号,终于发现有个最致命的缺点,渲染器承担了太多的工作,甚至包括了Shading类和场景类,到了后来,无法作摄像机,无法作矩阵变换,无法作脚本计算。程序倒是有我的风格,简单易用,就是太简单了,没有处理内部逻辑。算是第一个C++失败作品。后来Sigraphic 2006开幕了,Europgraphic也开幕了,我也彻底失去信心了,因为设计功底不够,比工程还工程。

   有些后悔暑假没有出去玩,也没有去参加语言培训,法语荒废了。我喜欢学习,那种感觉好极了,语言这种东西多学一些是有好处的,不仅仅是水平,也代表了一种新的思维方式。我就是挺喜欢法语的思路,形容词后置,极端严格的语法,各种时态与情况,差不多覆盖了所有的语言环境。德语也是,听起来虽然说不好听,也不押韵,单词也变态,简直就是极端变态。不过还是挺有意思的。语言么,熟练出技术,脱口而说,现在听德语歌占用了我90%的时间,剩下的是10%是英语。开学去上法语班吧,也没有害处。英语不好说,虽然说平时看的所有技术书籍都是英文的,可是考试这种天杀的东西,还是有独到的方式。用高三的班风靡的口头禅来说,就是“写”!

  说起了高中,我希望用我的三年寿命换取高三能够和她在一起的一个星期。那个晚上,没有星光,城市里的高中,天色是暗红的。每天晚自习一打下课铃,我就跑到可以看到走廊的位置上,看着她和她朋友慢慢的从我们班门前走过,好漂亮的头发,和清澈无暇的瞳孔。可惜高中时刻不是我的,现在也不是,以后也难说。你猜对了,她就是Rita。我承认,我爱她,远远多于恨她,甚至都恨我自己,为什么要恨她。就这样,暑假,15日她从长春回来,我不想去接她。18日走,我也不想送,不知道说什么,我也觉得非常尴尬。就是这样的日子,让我极端的疲惫。前几天夜里说,她有男朋友了。今天傍晚,有个大线人,应该是侦查过了,说因为是她不知道如何拒绝。我简直要给她气死了,天蝎的女人,就是毒,而且还没有任何可以捉摸的线索和表示,总之比测试Windows还要复杂。

  Seele In Not,我的大学第一个暑假,一生中,还有最多两个。拿起UML Distilled,明天去学校报到了,还要复习物理准备补考。
posted @ 2006-08-28 19:57 周波 阅读(377) | 评论 (0) | 编辑 收藏
小谈 CPU 缓存体系

  现在的 CPU 依旧采用冯诺伊曼体系,喜欢像傻子一样从头执行到尾,中途没有任何的跳转停顿等待。可是现实情况是,大部分程序里面还是少不了 IF ELSE 之类的判断,循环就更加得多了。如何优化循环大家可以自己琢磨,其实不难,可以参考一下《高质量 C\C++ 编程指南》

  现在 CPU 上都有 Level 1 指令缓存(又叫做 L1 Trace )与 Level 1 数据缓存( L1 Data Cache )。 PMMX , P2 , P3 为二者都准备了 16kb ,我的 P4 Northwood (以下简称 P4NW )有 8kbL1 数据缓存和 12kb 指令缓存。 CPU 读取 L1 Data Cache 中的数据只需要 1 个时钟周期,速度非常快,应该是仅次于寄存器了。数据缓存是由 256 或者 512 行 32bytes 组成的,也就是 32bytes 对齐的,而 P4NW 是 64bytes 字节对齐的,并行 4 路,总共 128 行。当你处理的数据没有载入缓存的时候, CPU 将从内存读取缓存行大小的数据,所以缓存行总是对齐到能被 32 整除的物理地址。 CPU 对 L1 数据缓存中的数据进行操作是最快速的。所以推荐内存地址最起码是 32byte 对齐的。目前编译器在这个地方的优化已经非常好了,一般都是 4byte 对齐,当然也都是 32 对齐的。在后面你将会看到, SSE2 要求数据是 16 字节对齐的。

    缓存类似一个 C++ set 容器,但是不能赋值到一个任意的内存地址。每行本身都有 1 个 7bit 大小的关联值( set value )要和目标内存地址的 5 到 11 位对应( 0-4 位已经忽略了),也可以理解为,关联值是内存段地址的一部分。 PPro 中,有 128 个关联值对应到 2 行,所以最多可以为任意的内存单元准备 2 个缓存行。 PMMX P2 P3 P4NW 有 4 个。由于内存是分段的,所以说 CPU 只能为, 5-11 位地址相同的内存准备 2 或者 4 个不同的缓存行。如何为两个内存地址赋予相同的关联值呢?把 2 个地址的低 5bit 去掉,这样就能被 32 整除了。如果这 2 个截断了的地址都是 4096 ( 1000H )的倍数,那么这两个地址就有了相同的关联值。

    让我们用汇编加深一下印象,假设 ESI 中是 32 对齐的地址。

                                          AGAIN:  MOV  EAX,  [ESI]

MOV  EBX,  [ESI+13*4096+4]

MOV  ECX,  [ESI+20*4096+28]

DEC   EDX

JNZ   AGAIN

   Oh Year ,这里 3 个地址都有相同的关联值,而且地址跨度都超过了数据缓存的大小,可这个循环在 PPro 上效率会相当低。当你想读取 ECX 的值的时候,将没有空闲的缓存行了 —— 因为共享一个关联值,而且 2 行已经被使用了。此时 CPU 将腾出最近使用的 2 个缓存行,一个已经被 EAX 使用。然后 CPU 把这个缓存行用 [ESI+20*4096] 到 [ESI+20*4096+31] 的内存数据填充,然后从缓存中读取 ECX 。听起来好象相当的烦琐。更加糟糕的是,当又需要读取 EAX 的时候,还需要重复上述的过程,需要对内存缓存来回操作,效率相当的低,甚至不如不用缓存。可是,如果我们把第三行改成:

MOV  ECX,  [ESI+20*4096+32]

  哦,不好,看起来,我们的地址超过了 32 ,不能被整除了。可是这样有了不同的关联值,也就意味着有了 1 个新行,不再共享可怜的 2 个行。这样一来,对三个寄存器的操作就不需要反复的用 2 个缓存行进行调度了,各有一个了。嘿嘿,这次只需要 3 个时钟周期了,而上一个要 60 个周期。这是在 PPro 上的,在后来的 CPU 中都是 4 路的,也就不存在上面的问题了。搞笑的是, Intel 的文档却错误的说 P2 的缓存是 2 路的。虽然说很少人在用那么古老的 CPU ,可是其中的道理大家应该明白。

  可是判断要访问的部分数据是否有相同的关联值,也就是关于缓存是否能够命中的问题,是相当困难的,汇编还好,用高等级语言编译过的程序鬼知道是否对缓存做过优化呢。所以么,推荐,在程序的核心部分,对性能要求最高的部分,先对齐数据,然后确保使用的单个数据块不要超过缓存大小, 2 个数据块,单个不要超过缓存大小的一半(仔细想想为什么,因为关联值的问题,可以缓存分为两部分处理两块)。可是大部分情况下,我们都是使用远比数据缓存大的多的结构,以及编译器自己返回的指针,然后为了优化你可能希望把所有频繁使用的变量放到一个连续的数据块中以充分利用缓存。我们可以这样做,把静态变量数值拷贝到栈中的局部变量中,等子函数或者循环结束后再拷贝回来。这样一来就相当于把静态变量放入了连续的地址空间中去。

当读取的数据不在 L1 Cache 内时, CPU 将要从 L2 Cache 读取 L1 缓存行大小的数据到 L1 里去,大概需要 200ns 的时间(也就是 100Mhz 系统的 20 个时钟周期),但是直到你能够使用这些数据前,又需要有 50-100ns 的延迟。最糟糕的是,如果数据也不在 L2 Cache 中,那么就只能从最慢速的内存里读取了,内存的龟速哪能和全速的缓存相比。

好了,关于缓存的知识可以就此打住了,下面开始讲如何优化缓存。无非就是 3 种方法,硬件预取( Prefetch )、软件预取、使用缓存指令。关于预取的注意事项主要有这些:

<!--[if !supportLists]--> 1、  <!--[endif]--> 合理安排内存的数据,使用块结构,提高缓存命中率。

<!--[if !supportLists]--> 2、  <!--[endif]--> 使用编译器提供的预取指令。比如ICC中的_mm_prefetch _mm_stream,甚至_mm_load等比较“传统”的指令。

<!--[if !supportLists]--> 3、  <!--[endif]--> 尽可能少的使用全局的变量或者指针。

<!--[if !supportLists]--> 4、  <!--[endif]--> 程序尽可能少的进行判断跳转循环。

<!--[if !supportLists]--> 5、  <!--[endif]--> 使用const标记,不要在代码中混合register声明。

不过要提醒一句,真正提高程序效率的方法不是那种,从头到尾由于外科手术般的解剖,一个一个地方的优化,请抓住程序最核心的部分进行优化,记住 80-20 规则。

 

使用 SIMD

先复习一下对齐指令, __declspec(aliagn(#)) , # 替换为字节数。比如想声明一个 16 字结对齐的浮点数组, __declspec(aliagn(16)) float Array[128] 。需要注意的是,最好充分了解你 CPU 的类型,支持哪些指令集。 SIMD 主要使用在需要同时操作大量数据的工作领域,比如 3D 图形处理(游戏),物理建模( CAD ),加密,以及科学计算领域。据我所知,目前 GPGPU 也是使用 SIMD 的代表之一。

MMX

主要特性: 57 条指令, 64bit 的 FP 寄存器 MM0-MM7 ,对齐到 8 个 80bit 的 FP 寄存器 ST0-ST7 。需要数据 8 字节对齐,也就是使用 Packed 数字。

PS :这里冒出了一个问题,为什么 Intel 要把 MMX 的寄存器和 FPU 的寄存器混合起来使用呢?因为这里牵涉到一个 FPU 状态切换问题,后面会提到,当你在一段代码中又要用到 MMX 指令又要用到传统的 FPU 指令,那么需要保存 FPU 状态,或者退出 MMX 。可是这种操作对于 FPU 来说非常昂贵,而且对于多任务操作系统来说,近乎于不可能完成的任务 —— 同时有许多程序,有些需要 MMX ,有些不需要,而正确地进行调度会变得非常困难。所以 Intel 将保存状态的工作完全交给了 CPU 自己,软件人员无须作太多这方面的工作,这样一来,就向前向后兼容了多任务操作系统,比如 Windows 和 Linux 。后来随着操作系统和 CPU 的不断升级,操作系统开发人员发布了一个补丁包,就可以让操作系统使用新的寄存器。这时人们都发现 Intel 的这种做法是相当短视的,这可以当作一个重大的失误。后来 Intel 通过引入了新的浮点指令集,这时才加入 XMM 寄存器。可造成这段故事的原因却根本不是技术问题,保证兼容性也是一个方面,总之真的说不清楚。你只要记得无法同时使用 MMX 与 FPU 就可以了, CPU 要进行模式切换。

SSE1

主要特性: 128bit 的 FP 寄存器 XMM0-XMM7 。增加了数据预取指令。额外的 64bit 整数支持。支持同时处理 4 个单精度浮点数,也就是 C\C++ 里的 float 。

适用范围:多媒体信号处理

SSE2

主要特性: 128bit 的 FP 寄存器支持处理同时处理 2 个双精度 double 浮点数,以及 16byte 8word 4dword 2quadword 整数。

适用范围: 3D 处理 语音识别 视频编码解码

SSE3

主要特性:增加支持非对称 asymmetric 和水平 horizontal 计算的 SIMD 指令。为 SIMD 提供了一条特殊的寄存器 load 指令。线程同步指令。

适用范围:科学计算 多线程程序

手头工具

1 、选择一个合适的编译器,推荐用 Intel C++ Compiler (以下简称 ICC ),以及 Visual Studio .NET 2003 及以上 IDE 附带的 C++ 编译器。同时, Microsoft C++ Compiler 也支持 AMD 的 3DNow 。 GCC C++ Compiler 没有测试。

2 、 Intel 以及 AMD 的汇编指令集手册。这个是必需的,强烈建议每个C++ Coder人手准备一份。

  所有的都用 C++ 混合变成的方式实现

使用范例:

向量乘法在 3D 处理中非常非常多,多半用于计算单位矢量的夹角。

我们先定义一个顶点结构。

__declspec(align( 16 ))  struct  Vertex{
    
float  x,y,z,w;
};
    16字节对齐的结构,其实本身也是16字节的东西。如果没有对齐,运行时会报错。

w是其次坐标系的参数,处理向量的时候不需要用到。我的函数是这样的:

float Dot(Vertex* v1,Vertex* v2)
{
    Vertex tmp;
    __asm{
        MOV EAX,[v1];
        MOVAPS XMM0,[EAX];
        MOV EAX,[v2];
        MOVAPS XMM1,[EAX];
        MULPS XMM0,XMM1;
        MOVAPS tmp,XMM0;
    };
    
return tmp.x + tmp.y + tmp.z;
};

    VC中反汇编之:
 1 float Dot(Vertex* v1,Vertex* v2)
 2 {
 3 0041C690  push        ebx  
 4 0041C691  mov         ebx,esp 
 5 0041C693  sub         esp,8 
 6 0041C696  and         esp,0FFFFFFF0h 
 7 0041C699  add         esp,4 
 8 0041C69C  push        ebp  
 9 0041C69D  mov         ebp,dword ptr [ebx+4] 
10 0041C6A0  mov         dword ptr [esp+4],ebp 
11 0041C6A4  mov         ebp,esp 
12 0041C6A6  sub         esp,0E8h 
13 0041C6AC  push        esi  
14 0041C6AD  push        edi  
15 0041C6AE  lea         edi,[ebp-0E8h] 
16 0041C6B4  mov         ecx,3Ah 
17 0041C6B9  mov         eax,0CCCCCCCCh 
18 0041C6BE  rep stos    dword ptr [edi] 
19     Vertex tmp;
20     __asm{
21         MOV EAX,[v1];
22 0041C6C0  mov         eax,dword ptr [v1] 
23         MOVAPS XMM0,[EAX];
24 0041C6C3  movaps      xmm0,xmmword ptr [eax] 
25         MOV EAX,[v2];
26 0041C6C6  mov         eax,dword ptr [v2] 
27         MOVAPS XMM1,[EAX];
28 0041C6C9  movaps      xmm1,xmmword ptr [eax] 
29         MULPS XMM0,XMM1;
30 0041C6CC  mulps       xmm0,xmm1 
31         MOVAPS tmp,XMM0;
32 0041C6CF  movaps      xmmword ptr [tmp],xmm0 
33     };
34     return tmp.x + tmp.y + tmp.z;
35 0041C6D3  fld         dword ptr [tmp] 
36 0041C6D6  fadd        dword ptr [ebp-1Ch] 
37 0041C6D9  fadd        dword ptr [ebp-18h] 
38 };
    前面都是保护现场入Stack的代码,没有必要管。我之所以这样,在Stack中声明了一个零时变量返回之,是为了减少代码的行数。有兴趣地可以参考本文后面引用资料中的Intel范例,代码多的多,功能却一样。这样就可以利用SIMD计算点乘了。图示:
    这种顶点格式称为AoS(Array of structure),这种结构的好处是,能够和现有的程序结构,比如D3D中的FVF顶点格式,和GL中的顶点格式。但是,由于许多情况下,并没有使用第四各浮点数,这就让SIMD指令浪费了25%的性能。于是有了SoA格式,让我们重新来过。
    我借用了一下上面一个结构的指令,还是没有用_mm_128格式,让大家看得清楚一些:
__declspec(align(16)) struct Vertex_soa{
     
float x[4],y[4],z[4],w[4];
};
    依旧16字节对齐。计算函数如下:
 1 void Dot(Vertex_soa* v1,Vertex* v2,float* result)
 2 {
 3     Vertex tmp1,tmp2;
 4     __asm{
 5         MOV ECX,v1;
 6         MOV EDX,v2;
 7 
 8         MOVAPS XMM7,[ECX];
 9         MOVAPS XMM6,[ECX+16];
10         MOVAPS XMM5,[ECX+32];
11         MOVAPS XMM4,[ECX+48];
12         MOVAPS XMM0,XMM7;
13         UNPCKLPS XMM7,XMM6;
14         MOVLPS [EDX],XMM7;
15         MOVHPS [EDX+16],XMM7;
16         UNPCKHPS XMM0,XMM6;
17         MOVLPS [EDX+32],XMM0;
18         MOVHPS [EDX+48],XMM0;
19 
20         MOVAPS XMM0,XMM5;
21         UNPCKLPS XMM5,XMM4;
22         UNPCKHPS XMM0,XMM4;
23         MOVLPS [EDX+8],XMM5;
24         MOVHPS [EDX+24],XMM5;
25         MOVLPS [EDX+40],XMM0;
26         MOVHPS [EDX+56],XMM0;
27 
28         MOVAPS XMM3,[EDX];
29         MOVAPS XMM2,[EDX+16];
30         MOVAPS XMM1,[EDX+32];
31         MOVAPS XMM0,[EDX+48];
32 
33         MULPS XMM3,XMM2;
34         MULPS XMM1,XMM0;
35         MOVAPS tmp2,XMM1;
36         MOVAPS tmp1,XMM3;
37     };
38     result[0] = tmp1.x + tmp1.y + tmp1.z;
39     result[1] = tmp2.x + tmp2.y + tmp2.z;
40 };
    Oh Yeah,就是这样了,同时计算了1对乘法。我在代码中借用了一下前面的顶点结构,这样方便一些。至于SOA格式,请看前面的声明。很多代码都是转换Stack中的内存格式,转换成AOS格式,这样才能使用SIMD指令计算。

    通过上面的演示,想必大家已经对SIMD有了个直观地认识,其实在自己的代码中加入这些是非常方便与容易的。虽然说现在的CPU性能已经提高了许多,性能也强了许多,可是在诸多对性能要求高的地方,还是非常烤烟程序员的水平的。

    欢迎大家拍砖!
posted @ 2006-08-24 15:37 周波 阅读(3662) | 评论 (2) | 编辑 收藏
为了以后优化算法,还是硬着头皮学了一下汇编,也就是C\C++与汇编的混合编程,帖一个类的代码,非常简单的东西,觉得还可以优化。识别CPU的型号,使用了Intel的CPUID指令,还没有来得及看AMD的资料,以后有空了我也做一个类似于CPUID一样的小工具呵呵。
class CIntelCpuInfo{
private:
    DWORD m_VersionInfo;
    DWORD m_Features;
    
    
void GetFeatures();
    
void GetVersionInfo();
public:
    CIntelCpuInfo() {};
    
~CIntelCpuInfo() {};
    
void Show();
};

void CIntelCpuInfo::Show()
{
    
this->GetVersionInfo();
    
this->GetFeatures();
};

void CIntelCpuInfo::GetVersionInfo()
{
    DWORD VER;
    DWORD BACKUP;

    DWORD STEP,MODEL,FAMILY;
    __asm{
        MOV EAX,01H;
        CPUID;
        MOV VER,EAX;
        MOV BACKUP,EAX;
        AND EAX,0000000FH;
        MOV STEP,EAX;
        MOV EAX,BACKUP;
        SHR EAX,
4;
        AND EAX,0000000FH;
        MOV MODEL,EAX;
        MOV EAX,BACKUP;
        SHR EAX,
8;
        AND EAX,0000000FH;
        MOV FAMILY,EAX;
    };
    cout
<<"Family ID : "<<FAMILY<<" Stepping ID : "<<STEP<<" Model : "<<MODEL<<endl;
};

void CIntelCpuInfo::GetFeatures()
{
    DWORD C,D;
    DWORD SSE3Tag;
    DWORD SSTEPTag;
    DWORD SSE2Tag;
    DWORD SSE1Tag;
    DWORD MMXTag;
    __asm{
        MOV EAX,01H;
        CPUID;
        MOV C,ECX;
        PUSH ECX;
        AND ECX,01H;
        MOV SSE3Tag,ECX;
        POP ECX;
        AND ECX,0080H;
        MOV SSTEPTag,ECX;
        SHR SSTEPTag,
7;
        MOV D,EDX;
        SHR EDX,
23;
        PUSH EDX;
        PUSH EDX;
        AND EDX,01H;
        MOV MMXTag,EDX;
        POP EDX;
        SHR EDX,
2;
        AND EDX,01H;
        MOV SSE1Tag,EDX;
        POP EDX;
        SHR EDX,
3;
        AND EDX,01H;
        MOV SSE2Tag,EDX;
    };
    cout
<<"SSE3 Support ? "<<SSE3Tag<<endl;
    cout
<<"SSE2 Support ? "<<SSE2Tag<<endl;
    cout
<<"SSE1 Support ? "<<SSE1Tag<<endl;
    cout
<<"Enhanced SpeedStepping ? "<<SSTEPTag<<endl;
};
我的CPU是2002年下半年的,Intel Pentium 4 Northwood 1.8GA,嗬嗬,搞得多么先进一样。截图如下,

o_ASM.JPG

结果完全正确。有了一些经验,在以后的程序中,可以通过识别CPU类型进行额外的优化,以后好好的研究Intel的Manual。
posted @ 2006-08-18 22:15 周波 阅读(1085) | 评论 (1) | 编辑 收藏
    是黑暗的年代就会有英雄出现。他们在废弃的管道中来回跳跃,熟悉这个世界上任何枪械的使用,不过更多的时候他们不屑使用热兵器。他们也是当局最为头痛的家伙,倒不是他们的武艺高超,更多的原因是,他们政治观点的完完全全的与自己所推行的背道而驰。可是往往就是这些人,才能给在水深火热里面挣扎生活的民众一丝希望,与活下去的勇气。有这样的风云人物出现,是不幸,也是万幸。

    苏特勒的“北方野火”代替保守党上台,清洗异己,强力打造政权符号,黑底红十字。动用平民研制生化武器,对美国的战争不闻不问。于是乎,造就了V怪客这个变种。V怪客杀一个人,就会留下一支玫瑰,还有一个鲜红的V字。党员们每次执行公务,都会把党徽昭示于众,好像我们的一些人,总会把自己的身份挂在嘴边。人们畏惧,胆战心惊的存活。无休止的宵禁,黑夜里无休止的恐惧。

    最近与一个家境颇好的同学在版上讨论关于一个鼓楼老太10年卖报积攒10万准备买房的事情,不管什么,人家抛出“我只要我自己过得好,别人的死活与我无关”的话,我顿时无话可说,因为我太诧异于我们85年后这一代的想法已经进化到如此地步。正如一个人的出生阶级反映了成长环境,以及日后的成就。国家也一样,成吉思汗,一介武夫,帝国分崩离析;法国大革命,吉特伦派,雅格宾派,热月党,最后竟然等来了拿破仑。

    国家的精神总是在各种容易达成广泛契合的类型中间寻找自己的实在形体,其中的艰辛与过程只有执行者才能深刻的体会到。这一点倒有些类似于谈恋爱,总有自己不适合的,与不属于自己的。正如美国宪法起草的过程一般,各种私利所想与公共所趋走到一起寻求妥协。但是当国家精神以条文、体制的方式——我称之为政权符号加以体现出来的时候,发展的趋势将由政府的决策方式进行解释。民众在塑造个人自己心中的国家精神,一般无法考虑,只能从全局的行为模式进行观测。好比没有人说德国人从来不闯红灯,不过都知道德国人极为严谨细致一样。反过来说,国家作为地域性组织的高级形式,其职责必须被道德感约束,而且必须将其行为集合公布于众——设立军队警察法庭监狱议会。

    V怪客的刀剑与玫瑰让首脑胆战心惊,不顾一切的想抓住他。可是V怪客总能出其不意的如同幽灵一般出现,让目标没有痛苦的死去,放上玫瑰,等待党员们收尸,继续通缉。自己在自己的城堡里仰望这个古老城市的生命,在暴风骤雨下沉睡,滋长,享受真黄油煎的鸡蛋,赏阅着满墙的违禁艺术品,代价是自己的面具,到死都没有人看到自己的真面目。

    政权符号应当是人们心中的第一印象,也将会混杂着各种来自个人的不成熟视点。正如一个社会的既得利益团体与贫苦的受剥削人群之间的冲突,V怪客们也会将自己的意志强加给那些头头脑脑们,无非也就是暗杀煽动等等。当既得利益团体受到威胁的时候,他们求助于强化政权符号在大众心中的孤立感与强硬感 —— 没错,孤立。进化过的高级社会,成员与政权之间将不仅仅存在于,“我今天打猎捕获了一头牛,可是我从酋长那里到了一点点牛尾巴”这样的关系,而更多的关联会在个人生活的方方面面中得到强化,因为无论在在何种环境中发展,国家组织只会变得越来越强势与暴戾。

    可是无论怎样,民众的需求都是建立在自己的生活基础上的,只要可以有可以糊口的工作,有一处栖身之所,也有一些所谓的政治权利——无论是有用还是无用的,就都可以生存下来。可是,想要在这种近似简化为供求的关系中寻找正义或者公义是相当相当困难的,因为这样如同没有任何思考就进行交易,从不计较利益得失与真正的需求。或者说,在这样不断强调个人空间与行为自由的社会中,人们的心智将更加容易的被误导与曲解,也不会对这种伸出手式的动作作出多么深刻的思考。政权符号此时退化为既得利益团体的救命稻草,剥削群体的咒骂对象,与暴民的发泄对象。

    暴民从来就不是绿林好汉,那种无畏的破坏供求关系与社会心理的行径往往只能适得其反,而且大多数绿林好汉从来都不会开仓济民,往往也是自己做了土皇帝。暴民也不是小说中出生入死杀人无数的神枪手,往往一介武夫还是要受制于所处的形势。暴民应该是,理解民众的需求,知晓如何重塑民众的信心,洞悉当下的薄弱点,最好,也是如何用最少的武力消灭无耻之徒的,普通民众。
posted @ 2006-08-17 15:26 周波 阅读(755) | 评论 (6) | 编辑 收藏
  r_emule.JPG
今天像往常一样打开eMule 0.47a,从sf.net上下载的干净版本,可不是veryCD那种垃圾修改版本。eMule目前文件数目最多用户最多的是德国DonkeyServer服务器群。veryCD以前很不错,但是广告也越来越多了起来,更重要的,它发布的eMule版本是用得最多的。好多次向朋友推荐sf.net上的原版eMule,可是他们不知道安装的时候没有简体中文,安装好了后可以选简体中文的。现在可好,当那些猪脑Web投资商不顾一切的将这种流氓行为推广到互联网的时候,在互联网上,中国P2P用户的脸面何在?当他惊恐的发现没有人再下载客户端为他的广告买单的时候,中国的用户将无法得益于P2P软件。强烈建议流氓软件名单中加入VeryCD的eMule。

为了以后的eMule,可以正常使用,请到sourceforge.net下载官方干净版本。
posted @ 2006-08-17 09:44 周波 阅读(1969) | 评论 (5) | 编辑 收藏

2006年3月 雪城

    雪片落在的城头,
    已经四月。

    好像流浪的人们,
    在教堂外支起破碎的篷帐。

    故乡的梅花开了,
    你没有机会看上一眼。

    雪城的女儿笑了,
    她向往过自由,热情,大海。

    我重新翻出抄本,油灯,
    窗台的诗丛又发了芽:

    它们为一人折断,
    它们为一人枯干。

    城里没有眼眶的雕塑,
    立在处决记忆的刑场上。

    它的胸中燃烧过篝火,
    却没有一位会拉琴的父亲。

    它没有看见我,
    因为恐惧我的刀剑;

    她也没有看见我,
    我蒙住了你镜中的双眼。

 

posted @ 2006-08-10 21:43 周波 阅读(289) | 评论 (0) | 编辑 收藏
  1. 结构冗繁。尚不说安装一个普通的LINUX发行版需要多少包,就是包和包之间的依赖关系,可是比理顺肠子还困难一百倍。最讨厌看到的就是在命令行下兴冲冲的输入安装命令时跳出一个个require提示,得!插入碟一个一个安装吧。
  2. 体积庞大。WINDOWS98多大?全部安装600M;2000多大?普通安装1.3G;XP多大?普通安装2.1G;VISTA还不知道。反正我知道SUSE已经用DVD装载了。这一点比M$先进!可是硬盘空间呢?是否系统真的需要那么多的东西么?非也
  3. 工具花哨不统一。我知道LINUX FANS的水平很高,可是就是没有M$出的软件那么顺手实用,就拿播放器来说,各式各样的东西,从KDE自己的MP3播放器开始,到仿造WINAMP的播放器,还有各种CD播放器。WINDOWS下就是方便多了,ASPI+EAC可以搞定所有的CD抓取工作,foobar2000+Media Player Classic,搞定了音频视频。即使是对大多数人来说,也有诸如WMP,PowerDVD等对于入门用户也非常有亲和力的软件。这种高手充其量也是普通的Hacker,不是Engineer,更不是Professinal Developer。
  4. 基础教育没有普及。好象还没有人给大多数入门者解释过X-WINDOWS是什么东西,当初我是花了不少时间才弄明白X11R6 XFree86 XServer等等就是是什么东西,然后才会安装NVIDIA的驱动程序,手动更改配置文件。也没有人解释过,当初人们如何用命令行访问http,访问NFS,大多数会用WINDOWS下的“网上邻居”,“CuteFTP”。如果想要推广LINUX,学校这一关不可忽视。可是……
  5. 需要最起码让所有的人都要明白C\C++语言是怎么回事。想升级系统,先拿内核开刀。可是这个内核究竟是什么东西,为什么要编译?为什么编译时需要用到一个叫做makefile的东西?一切的一切,对于普通人来说,可是非常陡峭的学习曲线。
  6. 开发人员没有一个完整强大的C\C++ IDE。IDE,最基本的功能莫过于工程管理和代码提示。Borland造了一个,那是为了Delphi,可是C\C++人员呢?难道还是vim敲字符?手动make?
  7. 驱动程序规范不统一。有的驱动程序要求重新编译内核,以及各种各样的安装方式。3D是最要命的,除了NVIDIA积极外,其他的厂商看不出什么动作。还有3D API,纯软件跨平台的Mesa3D,还有一个GLX。
posted @ 2006-08-10 21:25 周波 阅读(431) | 评论 (1) | 编辑 收藏
这几天忙着找兼职,可是人家一听我是大二的,都不要了

干脆再修炼修练内功吧,研究研究Dx10。大三空闲多了出去找工作。

哪怕清洁工什么的我都愿意干,没办法,生活所迫。

女朋友还是不要了,浪费钱。

晚上发信息,还是那句“真的感谢你可以坐我的朋友,你实在太好了,可是我不会轻易和自己妥协的”

得!这种死恋比打仗还痛苦。
posted @ 2006-08-08 11:54 周波 阅读(817) | 评论 (6) | 编辑 收藏
  在CSDN上面发表过,可惜没有什么多大的反响。看来我写完算了。

  MSN上一直有个昵称是日语写的人,而且能看得懂,是长枪的名。而且,聊天从来都是用繁体中文,开始我还以为他是个香港人还是台湾人。后来才知道,他就是个上海人,不过去日本做的软件,学的日语,也真正的体会到了日本和风的真正韵味。
  日本的孩子,从小就被教育为要成为“日本男儿”,而且很多民歌童谣里面也都是这样。所以说,日本的小男孩从小炼空手道剑道是非常平常的事情。而在我们的国 家里面,稍微富裕的城市家庭里面,孩子大多学习琴棋书画,或者就是在网吧游戏机房里面消磨时间。在他的眼里,男人就要求能够努力工作,还要能打,也就是身 体好。在日本人眼里,男孩也就是要从小锻炼好身体,上为国家社稷,下为自己的生活努力拼搏。所以日本人的企业,尤其是像IT行业里从来就没有提倡欧美式, 一个天才包揽所有,而是强调每个人都如同蚂蚁一样,为了整个集体,拼命的学习,拼命的工作,绝对的服从,没有任何反对的机会。听起来好像很残酷,可是只有 亲身体会过的人才有那种感触。这个就像老早以前的我们国家,那种下班后依旧不想回家,还要求找些事情做的那种质朴的感情。所以说,日本在战后可以迅速崛 起,与德国人出了名的古板和严谨有异曲同工之处。如果社会上的男人——恕我直言,现在依旧是个男权社会,以后也依旧会是,这个世界的财富大部分还是由男人 取得,无论职位高低贵贱,从最原始的搬运工,到所谓的高级领导人,大部分真正能够创造价值的职位还是由男人掌握的。如果社会上的男人都如同蚂蚁一样,刻苦 的学习与努力工作,那么,一个国家岂有不崛起之理?相反,如果人们懒惰,不思进取,不能分辨真假好坏,就会任由小部分别有用心的人物牵着鼻子走。一个社会 究竟如何的具有生命力,看看它的民众的精神状态与追求就可以了,如果一个社会造就的人们,天天想着如何去走相对省力气的捷径,如何去费尽心机的拆别人墙肥 自己,如何的耍小聪明。这点在国外,我想每个人都有所感触。
  说一些实际的,对普通人胃口的,比如找女孩子来说,日本大部分都是女孩子追男孩子。情人节都是女孩子送男孩子巧克力。可以理解,在那种男权社会,社会分 工,家庭分工极为明确。男人只需要努力挣钱养活全家老小,女人就在家里做男人的后勤工作。说到这里,女权主义者又要跳上桌子,挥舞起自由主义的大旗,嚷嚷 什么女人也有自尊,不能靠男人养着。这是废话,在哪里不都一样,又没有明文规定女人不可以工作,女人只能靠男人养着,可惜偏偏只有只有身边八十年代后的大 部分女人才会这样做寄生虫,这样的不顾一切的在网上牛鬼蛇神一样的疯狂脱衣,疯狂卖丑,疯狂自慰——自我安慰。一次在公交车上,一个行为极为做作的女孩在 电话里大言不惭地说,“你究竟怎么养我啊!”。我想,那个男人也是个,贱货,这种女人都追求的话,这片土地上就不会有任何女孩出现了。好像总会冒出来上海 女人疯狂的追求外国男人的事情,哪怕穷得叮当响,在中国,那些女人是觉得中国男人弱,没自尊,点破一点,没有办法满足自己的劣种追求。可是来中国追求中国 男人的日本女人,恰恰就是看中了中国男人的弱,日本男人那种要强与疯狂竞争让他们受不了。不知道这是对中国男人的羞辱还是什么,反正我觉得挺难受的。
  正如中国诸多淫民朝思暮想的那样,在电车上做哪些猥琐的事情。日本人管这些叫做“痴汉”,繁体字也就是这个。日本电车非常非常的拥挤,而且更重要的是,日本女人穿着非常暴露,反正就是远比中国所谓的时尚女人暴露。不过值得注意的是,好像大部分痴汉都是大学毕业生,没有工作,只能成为类似于中国盲流一样的人。为此日本电车有专门的女子车厢,为此还有民间组织团体抵制这种制度,因为“痴汉”毕竟是少数,不能这样把所有的男人一棍子打死。不过在这里,我也是大学生,即将大二。细细想起来,不如不去上学,在家里自学取得知识都要,可是文凭歧视又无法避免,又需要为这一纸文凭消耗4年时间。成为盲流固然心痛,可是都是生活。曾经看过《程序员》关于去日本工作的开发人员的报道,还有近几年无数上海公司成为对日外包的情况,不曾经注意过日本这么多的情况。
  印象中的日本是个很普通的国家,历史上没事也喜欢搞搞霸权侵略什么的。从明朝就开始了,日本的安土桃山时代。说到这里小粪粪又要跳出来指责,不妨摊开历史书,历史上中国土地上的朝代对周围的国家怎么样了?还不是希望占为己有,开疆辟野。保家卫国是一回事,可是纯粹为了所谓的安危去四处征讨也绝对不在少数。可是为什么旧时代的日本与大清国一样的腐朽破败,可是为什么却可以在日俄战争中击溃俄国?为什么能在甲午战争中击溃清兵?二战后,日本又与中国一样,废墟瓦立,经济即将崩溃,可是他们又崛起了,崛起的更高,连亲手栽培的美国人都怕了。现在,总体上来说是文明时代,各个国家主要还是以发展经济,培养法制社会秩序,富裕劳动人民为最重要的使命。为什么小泉总是改不了去靖国神社参拜,国内的右翼组织的强大是最主要的原因。自古日本就有“公武双治”的说法,幕府将军和公家朝廷总是对峙着的。现在也一样,无非是传统的尊皇派与政府派之间的对峙。
  做技术的人,看问题一般都比纯粹搞什么“社会问题”的人看问题要清晰的多。正如一个人无法选择他的出生,却可以改变它的命运;可以无法选择被哪个政权奴役,却可以选择心归何方。等生活了不少年,也会发现年轻时嚷嚷着“粪斗”实在是愚蠢至极的方法。只要有一个地方,符合一个人的生活观念,与周围的大部分人都抵触,在这里那么肯定将成为众矢之的。好像周围的同学有许多高考没有考好,准备出国的。总之,尊重别人的理想,比自己去拚命的诋毁别人来的,成熟的多,也有益的多,毕竟,自己的这一生的价值才是最重要的。
posted @ 2006-08-03 10:40 周波 阅读(327) | 评论 (0) | 编辑 收藏
仅列出标题
共5页: 1 2 3 4 5 
<2026年10月>
日一二三四五六
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567

周波 87年出生 南京林业大学05421班242信箱 专业木材科学与工程工业装备与过程自动化 迁移到 jedimaster(dot)cnblogs(dot)com

常用链接

留言簿(4)

随笔分类

随笔档案

新闻档案

同学们Blog

搜索

  •  

积分与排名

  • 积分 - 58427
  • 排名 - 413

最新评论

阅读排行榜