Levi 的个人资料Nothing :: Maybe Future日志列表留言簿更多 工具 帮助
7月11日

CppUnit在Window下的安装与使用

素材均来自网络,请遵守各相关软件的协议。本文转帖请注明作者或出处。

环境

WinXP sp2、VC6 + VisualAssist X、SlickEdit 12、doxygen + graphviz

下载

CppUnit 1.12.1 下载 744.92KB

编译

解压缩

解压缩下载到的cppunit-1.12.1.tar.gz文件得到一个名为cppunit-1.12.1的文件夹,其下有(关键文件和目录):

  • [examples]
  • [include]
  • [lib]
  • INSTALL
  • INSTALL-WIN32.txt
  • README

记此目录 X:\the\path\cppunit-1.12.1 为 <U> 。

环境配置

如确定 VC6 已经有 unicode 库支持。此步可跳过。

进入控制面板→添加/删除程序,配置 VC 安装组件。检查 VC 中 unicode 是否支持。

如果没有安装 unicode 支持,若安装盘在,可以插入光盘,再此选中并一路确定,将之安装上即可。

若安装盘不在,可下载此文件后,将其中的 lib 文件放到 VC 安装目录下的 VC98\MFC\LIB 目录。

编译库文件

打开 <U>\src\CppUnitLibraries.dsw 。Build→Batch Build→全部选中后Build。

打开 <U>\examples\examples.dsw 。同上,全部Build。

安装

给VC6中注册插件

Tools
→ Customize
→ Add-ins and macro files
→ Browse
→ 选择或输入 <U>\lib\TestRunnerDSPlugIn.dll
→ 确定

VC6

Tools
→ Options
→ Directories
→ Show directories for:

  • Include files 中,添加 <U>\include
  • Library files 中,添加 <U>\lib
  • Executable files 中,添加 <U>\lib

VisualAssist X

Visual Assist X Options
→ Project
→ C/C++ Directories
→ Platform: Custom
→ Show Directories: Stable include files
→ 添加 <U>\include

SlickEdit12

Tools
→ Tag Files
→ "C/C++" Tag Files
→ Add Tag File
→ C/C++
→ 选中Generate References
→ OK
→ 输入名称:CppUnit.vtg
→ 打开
→ 选择路径 <U>\include
→ OK
→ Done

使用

测试使用例子:CppUnit测试框架入门

一个简单的构造过程:编写GUI类型的CppUnit单元测试框架及用例

基本框架推荐模型:CppUnit 快速使用指南

2月16日

一个清晰的梦

几年来,第一次做梦这么清楚,醒来后,竟然大体的脉络全都能记下来。

两个朋友带我与一个女业余车手赛车。跑道是某体育场的跑道,地面是土路,跑道上有不少其他人在锻炼,跑的过程中需要躲人。赛程是三圈。我开的是奥拓,车型完全就是现实中一个朋友的二手车。对方开的我不认识。

我完全不会开车,在吹哨出发前,我把油门当作刹车踩了一下,于是我就在前头“抢跑”了。游戏继续。为表示公平或是什么原因,我一直试图刹车,直到吹哨出发,对方超过我,才继续踩油门。

跑的过程中,不懂换档,自己摸索,各种控制设备的位置感觉和现实中另一个朋友的欧兰德完全一样。听不出转速,一通瞎换。好在,还知道换的时候需要踩离合。开始有几次换档没换到位,导致车的感觉怪怪的。速度也没加上。被落后很远。跑着,躲避行人。跑到两圈半的时候,不知道是什么原因车走不了了,只好就停在跑道上,下车步行向终点。

我抛锚的时候,对手已经过了终点,不知为何,她又多跑了一圈,路过我的位置,依稀可见其愤愤的表情。估计大概是“怎么和这么水的对手跑了,丢人”之类的原因吧。

回到终点后,我带着一个朋友继续走,去抛锚的车那里。奇怪的是,我们都是沿着跑道走,全没有从中间穿越的想法。到了车那里,朋友简单看了一下,就让我上车,带我返回终点。不知为何,跑道拐弯处旁边不远有个土堆,也许是修什么东西挖出来的,在这个位置超越旁边的行人时,无奈停了一下,避让。再前进刚起动一两米,朋友看见了车外的另一个朋友,停车下去与其聊天。过一会才继续上车载我到终点。

到了终点。我醒了。

复杂的梦。这么多的元素。乱乱的感觉倒是我一贯梦境的风格。

1月21日

07年总结

 
2007我很忙“2007我很忙!” 你呢?测测看!
11月2日

Haskell 中的 Integer 与 Int

一、接触问题

事情[1]起源于,有人写了这样的代码:

divisors i = [j | j<-[1..i-1], i `mod` j == 0]
main = print [i | i<-[1..10000], i == sum (divisors i)]

然后用 C 写了相同逻辑的嵌套循环。

运行的时候发现,Haskell 程序运行的时间是 C 程序运行时间的接近 14 倍。为何如此呢?

问题提出以后,有人简单地给他补充了这样一句:

divisors :: Int -> [Int]

再次运行时发现,Haskell 程序运行的时间仅为 C 程序运行时间的 1.6 倍。

二、分析问题

是什么导致了程序的行为有如此大的差异呢?

查找资料后发现,Haskell 的默认数值类型是 Integer 。在函数声明缺省的状态下,对 divisors 函数的编译、优化也是基于此类型的。而众所周知的,较之于 Int ,Integer 有更大的数值范围。相对地,牺牲的就是性能。

这样看起来,有了这个声明,编译器就可以大胆地进行优化了。[2]

三、走远一点[3]

优化以后,为何还有 1.6 倍这个区别呢?

在计算机世界的原始社会中,就有这样一句话流传着:程序=数据结构+算法。

且不论这句话到现在是否已经过了保质期。起码我们可以由此知道,在相同算法的前提下,要比较效率,还需要保证所使用的数据结构是相同的。

Haskell 的世界里,list 是通过链表实现的(这也就是它支持无穷数列的原理基础)。所以,要比较 C 与 Haskell 的性能优劣,也许把 C 实现的数据结构改成使用链表更为平等些。

除了算法和数据结构,程序中包含了用于显示部分的代码。要比较性能,最好把显示部分剥离出来分别比较。

四、深入一步

除了 Integer 与 Int 以外, Haskell 中还有 Int16、Int32、Int64 等类型。

对于本文开头的问题,且不讨论范围更小的 Int16 ... 。不失一般性,也暂不分析无符号的类型 UInt32 。就简单比较一下,Int - Integer - Int32 - Int64 的性能优劣。

具体的分析步骤就不一一列举了(参见[1])。这里只陈述一下在 32 位平台下,简单优化后的分析结果。

效率比 Int : Int32 : Integer : Int64 ≈ 1 : 1 : 7.5 : 9

所以,在需求允许的情况下,尽量只用 Int 类型,如果数值范围较大,简单地使用 Integer 类型就够了。

 

[1] 事件的完整记录在这里
[2] 在声明对编译器行为的重要性这一点上,Haskell 编译器与其他语言的编译器并无二致,在写、进而优化代码的时候,一定要仔细斟酌。
[3] 这里的走远,仅仅是承认了 Haskell 本身与 C 在实现上有一定的区别,并无其他含义。

3月21日

[转贴]手机电池起死回生的方法

[Levi]原文亦是转贴且无出处,so...

当你的手机电池使用时间变短(记忆效应或老化)时 , 你是否会再买一颗电池来更换呢?

下次当你碰到这种情况时请省下你的钱 , 告诉你一个很有效的方法不妨试试看:

1.用橡皮把电池的金属触点上的污物搽掉,试试使用时间是否延长。

2. 把电池用报纸包起来再放进塑胶袋里包好放入冰箱三天(报纸可吸收多余水份)

3. 三天后取出常温下放二天

4. 二天后将电池充电 , 充足后装进手机里测试 (预计可救回80%-90%)

此方法也同样适用于其他数码产品俚电电池。如数码相机,数码摄象机,mp3,mp4等等。
至于有没有效果,反正电池快没用了,而且冰箱人人有,各位朋友不妨试试看吧 !

[Levi]本人未验证,不过有空可以尝试一下。

1月20日

JavaForge 的免费 SVN 服务器

    找到了一个免费 SVN 服务器提供者。注册后即时可用。
    网站地址:http://www.javaforge.com
 
    当前工程:
        Haskell, Haskell
        My Program's Setting, MyProg

Haskell 的 IDE

    Haskell 作为 FP 的典型语言,目前尚无成型的 IDE 环境,为了方便学习,于是考虑自己整合一个。因为对 UltraEdit 比较熟悉,于是考虑利用它来扩展一下。
    要把 UE32 作为 Haskell 的 IDE 使用,要做几个方面的工作。
    第一个是语法高亮。需要修改 UE32 的 wordfile.txt 文件。内容较多,由于现在学习得还没入门,整理得还不够完善,暂不发出来了。以后补上。
    第二个是编译和调试。可以利用 UE32 的自定义命令来调用 GHC 进行编译。具体操作如下:
《在 UE32 加入 GHC 的编译命令方法》
  假定 GHC 的安装目录是“D:\GHC”,UE 的安装目录是“D:\UE32”,注意根据实际情况修改下面的命令。
  在菜单中选择 [高级] -> [工具栏配置] 。
  添加项目:
    项目名称“GHC编译”;
    命令行“( ( (echo.[ Start compiling ]) & (D:\GHC\bin\ghc.exe --make %f -o %n.exe) ) && (echo.[ OK ]) ) || (echo.[ Failed ])”;
    工作目录“%p”;
    选项页:
      选择“DOS程序”;
      选中“保存活动文件”;
    输出页:
      选择“输出到列表框”;
      选中“捕获输出”;
      选择“不替换”;
    所有未提到的复选框均不必选中。
  点击“应用”即可保存。
  同样方式添加这样两个项目:
    项目名称“GHC编译运行”;
    命令行“( ( (echo.[ Start compiling ]) & (D:\GHC\bin\ghc.exe --make %f -o %n.exe) ) && ( (echo.[ Start runing ]) & ( %n.exe ) & (echo.[ Finish runing ]) & ( pause > NUL ) ) ) || (echo.[ Failed ])”;
    其它设置同“GHC编译”。
    项目名称“GHC分析”;
    命令行“( ( (echo.[ Start compiling ]) & (D:\GHC\bin\ghc.exe -prof -auto-all --make %f -o %n.exe) ) && ( (echo.[ Start runing ]) & ( %n.exe +RTS -p -RTS ) & (echo.[ Finish runing ]) ) && ( (echo.[ Show profile info ]) & (D:\UE32\Uedit32.exe %n.exe.prof) ) && (echo.[ O K ]) ) || (echo.[ Failed ])”;
    其它设置同“GHC编译”。
  确定以后就可以在 [高级] 菜单的最下方看见这三个项目及其快捷键,UE32 v12 里是 CTRL+SHIFT+0 到 CTRL+SHIFT+2 。
  这样,就可以在用 UE 编辑 Haskell 代码的时候随时进行编译或测试了。
  要注意的是,要修改命令行以适应本地的安装配置。
1月17日

SVN 的分支与合并

    最近用 SVN ,又重新温习了一下分支和合并。用之前已经完全忘记了怎么回事的东西,用以后发现就是这样清楚的一个逻辑。在此简单记录一下。
    假设代码在版本历史中顺序经历了 A、B、C、D ,这时因为发现了之前的 bug ,需要在 B 版本的基础上修改,于是从 B 开始分支,产生版本 F、G 。而另一方面,D 的升级也在继续,从而得到了 E 。
    这时,B 的 bug 在 G 得到了解决。进而,需要把 B-G 的变更合并到 E 中。这样才得到我们的工作版本。
    在操作时,需要明确 SVN 作为版本控制的工具,一次版本标记代表的只是此次更新所做的改动。这样,我们需要合并的是两个分支的修改。也就是要合并的是 B-G 的改动和 B-E 的改动,而合并的结果作为 E 的后续版本。
    于是,如果把这个产生了分支并需要合并的工程所在的目录叫做活动目录的话,可以描述我们的 SVN 操作步骤如下:
    ⒈ 在活动目录取出版本 B ;
    ⒉ 在活动目录进行合并操作,此时指定从 F 版本到 G 版本,正常情况下应该没有冲突,如果有,那手动解决一下吧;
    ⒊ 在活动目录进行合并操作,此时指定从 C 版本到 E 版本,这时出现冲突的可能性较大,手动解决吧;
    ⒋ 在活动目录提交完成合并的新版本 H 。
    仔细分析这里进行的操作。首先取出 B ,因为它在主干上而且是分支的根,所以可以从此得到直到 G 的修改;合并了到 G 的修改以后,当前版本是变化的 B ,内容是与 G 相同,但由于在主干上,它是有了不少变动的;然后合并到 E 的修改,是在 G 的代码, B 的版本记录之上进行的;解决冲突以后,代码是从 B 处直接修改到了 H 。
    配合“一个版本标记代表此次更新做的改动”的思路(毕竟我没实现 SVN ,而只是推测它的机制),在数据库里,H 是在主干上,应该是和主版本 E 作比较,得到了这次改动,入库。这样,才能以相同的机制对 E-H 进行处理。
10月22日

意外收获

    最近要出差半个月,要准备一些东西。
    在用 WebZip 下载 Haskell Reference 了以后,导出时发现可以做成 .chm 的帮助文件,于是搜索了 FAR 和 HTML Help Workshop 1.x ,安装以后,按照提示一导出,生成的帮助还挺不错的。可惜,Haskell Reference 页面的层次中,左侧分栏不是全局的导航,只是某个 Module 的子项导航。导致生成的帮助导航标题很不准确,搜索也受到了一点影响。
10月17日

学习 Haskell

想开始认识一下这个据说是最贴近数学语言的计算机语言。
 
从 haskell.org 上选了 GHC 作为编译器,利用已有的 UltraEdit-32 作为编辑器,Yet Another Haskell Tutorial 作为学习的参考资料,再加上 Refference, CardGHC 的文档,可以开始了。
 
持续更新中……

####
## 1月23日
- 普通的数据实体类型 (type) 用 * 表示,种类 (kind) 的类型是 (* -> *) ,如 Maybe 和 List 。
- 定义的类型别名 (type synonym) 可以用来定义其他的类型别名,限制是在定义时必须以完整参数表的形式给出定义式。
- 利用 IO 类型是 Monad 实例的特性,文件操作可以简单地使用类似这样的表达式:
    readFile "testdata.txt" >>= \s -> putStrLn (show s)
  * 一个附加问题:Haskell 如何操作二进制文件?
    1.  writeFile
      测试这样的表达式:
        writeFile "data.bfile" $ map (\a -> toEnum a::Char) [0..255]
      其输出文件中,数字 10 被转换为十六进制 0D 0A ,多了一个 0D 。也许是“文本格式”的原因。
    2.  readFile
      测试这样的表达式:
        readFile "data.bfile" >>= putStrLn . show . map fromEnum
      根据输出,0D 0A 被还原为 10 暂且略过。文件读到 1A 就认为是结束了。
      经测试,IO 提供的其他判断文件结束的函数也是同样效果。
- Monad 的几个基本方法:
    class Monad m where
        return  :: a -> m a
        fail    :: String -> m a
        (>>=)   :: m a -> (a -> m b) -> m b
        (>>)    :: m a -> m b -> m b
- IO 实现 do 符号的四个规则 (亦即编译器处理 do 子句的方式) :
    1.  do {e} →
          e
    2.  do {e; es} →
          e >> do {es}
    3.  do {let decls; es} →
          let decls in do {es}
    4.  do {p <- e; es} →
          let ok p = do {es}
              ok _ = fail "..."
          in  e >>= ok
  这四个规则联合起来实现了 do 子句调用 Monad 的过程。
  换言之,可以直接用 Monad 本身的语法写出无 do 子句的 IO 函数来。(虽然这不够直白)
- Monad 必须满足的三条法则 (若自定义不满足的,就可能有一些内建运算无法使用?也许可以利用这个特性测试编译器?) :
    1. return a >>= f ≡ f a
    2. f >>= return ≡ f
      <两种展开,乘一律>
    3. f >>= (\x -> g x >>= h) ≡ (f >>= g) >>= h
      <结合律>
      eg. getLine >>= (return . reverse) >>= putStrLn
- §9.3 的例子总结。
  ㈠  证明了一个 Monad 的基础函数符合三条法则。
  ㈡  一个典型的 Monad 构造过程:
      1. 写出一个常规函数。
      2. 比较常规函数和原形函数的差别,把差别抽象成类型。
      3. 定义(实现)抽象类型的“接口”(return 和 bind)。
      4. 将新类型代入常规函数,写出常规函数的 Monad 版本。
      在这个过程中,定义的 Monad 类型不是符合原形中的数据结构类型,而是,对其进行扩展的数据单元类型。
  * 应能对此进行扩展,目前没想到。
-

####
## 1月19日
- §8.4.2 里介绍了一个 Computation 类。此类是 Monad 的一个近似型。而对 OO 语言来讲,它是一个计算接口类。提供了四个接口:success 、failure 、augment 和 combine 。
  这四种方法把某种计算的结果封装到一起,其中包含了可能的成功和失败。这该是 Monad 的主要思想。
  从 Computation 类的定义看:
    class Computation c where
        success :: a -> c a
        failure :: String -> c a
        augment :: c a -> (a -> c b) -> c b
        combine :: c a -> c a -> c a
  success 把一个数据类型 a 封装成匹配 Computation 类的类型 c a ,表示一个成功的计算;
  failure 接受一个字符串,返回一个 Computation 类的量,表达失败的计算;
  augment 接受一个计算,一个将这个计算变为另一个计算的变换,从而产生新的计算。
  combine 接受两个之前的计算,产生一个新的,作为两者的结合。这个运算不是 Monad 必须的接口,但在 MonadPlus 中可以找到。
  在 Monad 类中,success 叫做 return ,failure 叫做 fail 以及 augment 叫做 >>= (bind) 。
  * 上面基本属于直译,因为觉得还是这样说起来稍微好接受点。
-
 
####
## 1月18日
- 两种类型定义:data①、newtype② 和 type③ 。
  ①定义的类型的数据集中含“bottom”;②用来定义自己实现的 Int 类型。
  ①的定义方式没有特别的局限;②的定义格式是受限制的 MyType a 方式。
  ③定义的是一个明确结构的别名。
  ⑴三者都可以实现某类的 instance 。
  ⑵①和③可以 deriving 某类。
-
 
####
## 12月18日
- 对数列的处理。
  两个函数(家族):zip、unzip
  截取函数:take、drop
  整合参数:curry、uncurry
  数列的另一个定义方式:[ f x | x <- xSet, otherConditions ]
- 库中常用数列类型复杂度。
          List    Array   FiniteMap
  insert  O(1)+   O(n)    O(log n)
  update  O(n)    O(n)    O(log n)
  delete  O(n)    O(n)    O(log n)
  find    O(n)    O(1)+   O(log n)
  map     O(n)    O(n)    O(n log n)x
- 可以用 foldx 结合函数运算(“.”等),简化很多 list 的处理表达式。
-

####
## 12月10日
- 实例定义。
    instance BaseClass MyDataTypeOrClass where
        OneCompleteDefinationMethods ...
    instance BaseClass x => BaseClass (MyDataTypeOrClass x) where
        OneCompleteDefinationMethods ...
  一些常用类的最小完备方法集:
    Eq :  A (==) :: Eq a => a -> a -> Bool
          B (/=) :: Eq a => a -> a -> Bool
    Show :  A show :: Show a => a -> String
            B showsPrec :: Show a => Int -> a -> String -> String
              showList :: Show a => [a] -> String -> String
    Read :  A readsPrec :: Read a => Int -> String -> [(a, String)]
              readList :: String -> [([a], String)]
    Ord : A compare :: Ord a => a -> a -> Ordering
          B (<=) :: Ord a => a -> a -> Bool
          C (>) :: Ord a => a -> a -> Bool
          D (>=) :: Ord a => a -> a -> Bool
          E (<) :: Ord a => a -> a -> Bool
          F min :: Ord a => a -> a -> a
          G max :: Ord a => a -> a -> a
    Enum :    pred :: Enum a => a -> a
              succ :: Enum a => a -> a
            A toEnum :: Enum a => Int -> a
            A fromEnum :: Enum a => a -> Int
              enumFrom :: Enum a => a -> [a]
              enumFromThen :: Enum a => a -> a -> [a]
              enumFromTo :: Enum a => a -> a -> [a]
              enumFromThenTo :: Enum a => a -> a -> a -> [a]
    Num : A (-) :: Num a => a -> a -> a
          A (*) :: Num a => a -> a -> a
          A (+) :: Num a => a -> a -> a
          A negate :: Num a => a -> a
          A signum :: Num a => a -> a
          A abs :: Num a => a -> a
          A fromInteger :: Num a => Integer -> a
-

####
## 12月9日
- 文件操作,多半需要 bracket 作为 wapper 来使用。
- 模块定义:
    module MyModule
    module MyModule ( NoInstanceDataType(),
                      PartValidDataType( PublicDataValue ),
                      FullValidDataTypeA( FullValidDataTypeA ),
                      FullValidDataTypeB( .. ),
                      PublicFunction                            )
  模块引入:
    import MyModule hiding ( PrivateDefinations )
    import qualified MyModule ...              -> MyModule.MyFunction ...
    import qualified MyModule as MyShortName   -> MyShortName.MyFunction ...
  多级模块(非 Haskell 98 标准,GHC 要 -i 参数):
    import qualified SubDir.MyModule as MyShortName
- 代码的书写,可读性编程(Literate Programming),.lhs 代码
  Bird-script(有点仿 BBS 或 Email 的回复引文的味道)
    1. 代码行首加“>”字符,其他不加。
    2. 代码行与注释行间有空行分隔。
  LATEX-style markup
    用 \begin{code} 行和 \end{code} 行明确代码行的范围。
- 函数式编程另类指南 http://chn.blogbeta.com/232.html
- where 与 let 。同一, where 子句是转换为 let 子句后进行编译的。
- () 转换运算符为函数。可以映射为省略参数的内嵌函数。
  `` 转换二元的函数为运算符。
- 多参函数可以理解为多阶函数。接受一个参数后,输出一个函数,接收下一参数,类推。
  这种函数可以赋值,可以进行一些函数运算。
- 与 . 运算组合函数类似,$ 运算应用函数。但 $ 运算优先级比较低,可以用以在一些情况下替代括号。
- 通过基于函数的运算,对定义进行纯数学推导。可以优化与分析函数。
- 几个调整参数的函数。
    curry   - 将第二、三个参数做成 pair 给第一个参函数作为参数。取返回值。
    uncurry - 将第二个 pair 参数分解为两个值给第一个参函数作为参数。取返回值。
    flip    - 将第二、三个参数顺序倒置,给第一个参函数作为参数。取返回值。
-

####
## 11月13日
- CPS, 这种机制的实现,除了函数本身工作所需要的参数之外,需要接受一个“继续”函数作为参数,用来决定完成以后如何继续工作。
  * 编译器实现上,用尾递归替代了函数直接返回?是否有额外的系统负担?
-

####
## 11月4日
- Just, Nothing, Nil 与 Cons, Left, Right 等,可以理解为定义类型的时候指定的特别的命名常量或命名运算。
  相应地,data 标识符可以定义一些常量。
- 对于 Either 这种数据类型,需要更详细的例子帮助理解。
-
 
####
## 10月21日
这两天忙于其他事情,没继续学习。
今晚 goo 了一下,发现一个数学上的强人用玩笑的语气写的一点关于 haskell 的东西,很精炼,似乎覆盖到了查 Reference 时所见到的绝大多数语法。其中还有几个应用的例子。最重要的是,用中文写的,所以存下来,这是链接
还有一个,这是链接
 
####
## 10月18日
- 函数定义直接使用等号。参数可以是任何类型。
- 由于优先级问题,参数不能写 -x ,必须加括号,封成一维向量。
- 函数中可以使用分支语句。
  if conditional
    then truePart
    else falsePart
  - 三个关键字都为必要关键字
  case exp of
    Pattern1  -> action1
    Pattern2  -> action2
    _         -> else_action
  还有参数匹配。(Reference card)
  Function pattern matching
   f [ ] = 0
   f [x] = 1
   f _   = -1
  Function conditionals (guards) (没懂这里的guards)
   f x | x == []        = 1
       | length x == 12 = 15
       | otherwise      = -1
- 函数定义开头可以使用 let var in expr 定义中间变量,也可以定义多个中间变量,多个中间变量必须有相同的缩进。(排版影响解析)
- 对于二元运算,加圆括号能使运算符(如加号)作为函数名来使用,反之,加反撇号(`)能使函数名(如 map )作为运算符来使用。
- 注释。“--”表示行注释;“{-”和“-}”含着跨行的注释。跨行注释可嵌套。
+ 缩进是语法的一部分,分多行的代码要注意。
- “<-”符号:name <- function ,运行 function ,结果命名为 name 。
- 用 const_value::Type 来明确某常量的类型。
- Haskell 函数可以分为“函数”和“过程”,函数的类型与其返回值类型相同,过程的类型不同于其返回值类型,所以,在过程中,不可以直接将过程名作为其值使用。
-
 
####
## 10月17日
- 大小写敏感。
- =号表示概念的定义,用时才展开。(“lazy”)
* 类型名以大写字母开头,函数或变量名以小写字母开头。
* 因为是 functional language ,所以对于一个定义明确的函数,haskell 消除了输出反过来影响该函数进程的副作用。
- 直接以向量的形式表达定元一维数组,各维度的值可以是各种类型(允许欠套)。特别地,二维向量(pair)可以使用 fst 和 snd 函数。
  也可以说,定元的数组用圆括号表示。
- 传统的 list 用以容纳变元的数组,haskell 用方括号表示,叫变元数组(暂称 list )。可以定义/使用空 list 。list 的各元素类型必须相同(允许欠套)。
  冒号用以向 list 添加元素,[] 记法必须在最后,前面可以有任意个元素加入。使用 length 、head 和 tail 函数进行操作。
  双加号用以连接两个 list 。
- 字符串就是元素为字符的变元数组,可以直接当作变元数组使用。
+ 定元与变元数组可以互相嵌套。
  函数运算优先级高于冒号运算和数学运算。(除括号运算外最高?)
  三维或更高维度的向量没法操作?(不能用 fst 函数对,也不能用 length 函数组。)
- 简单列表函数:
  映射:map 映射函数 变元数组
  过滤:filter 过滤条件函数 变元数组
  ××:foldr 某种二元运算符 值 变元数组
  ××:foldl ... ... ...
       运算符要加括号,优先级所限。(此函数对可能有十分重要的用处,又或者衍生出特别的用法。)
       * [修] 加括号是为了把运算符封装成一元向量,使其可以作为函数参数。(可以用多元向量否?)
         * [修] 加括号是为了把运算符封装成函数,使其可以作为函数参数。
       如果 foldl 用在无穷元数组,会死锁;而 foldr 可能可以产生返回值。(需要看后面才知道)
-
10月11日

Trackback:重装XP系统现在就像洗脸一样方便

 
  Rehtona 说的没错,IO.SYS/MSDOS.SYS 是要放在固定位置的,不过象楼主这样处理,单在一台机器上进行文件删除并立即复制的工作,是不会产生问题的。因为启动信息不只是这几个文件,MBR 里还有一点,除非破坏了 MBR ,简单复制此二文件才会失效。
  对于 DOS 解压缩覆盖提示的问题,可能有两个原因,楼主可以查看一下。一个是目录是否有冲突,DOS 在 C:\ 下的某个目录名被 XP 占用了;另一个是 XP 的临时文件目录,包括 %TEMP% 和浏览器 CACHE 。经过检查如果可以覆盖,也可以尝试直接用 RAR for DOS 的覆盖选项或利用 COMMAND.COM 的重定向来解决覆盖提示的问题。
8月18日

[Z]WinXP下编译ffmpeg

WinXP下编译ffmpeg
    ——转自firebolt2002&&小土人的专栏
 
  今天开始编译ffmpeg这个让人爱恨交加的东西了。由于VC++并非是一个标准的C编译器,所以ffmpeg使用的C99以及at&t汇编语法在VC下无法编译通过,我曾经从ffmpeg中提取过h263++的编码器,在不使用mmx优化选项的情况下,对C代码进行少许的改动还是能够编译通过和正常使用的,但是没有MMX优化的东西使用起来还是不爽的。
 
  采用MINGW在window平台下编译ffmpeg是个不错的选择,当然如果你有兴趣可以把它完全移植到VC环境下,我曾经的老板这么做过,(这是他的命根子,我连看一看的机会都没有,呵呵)据说移植了百万行代码。不过我怎么没发现有那么多呢。不过在VC下编译ffmpeg 会比用Mingw编译小很多,好像是500多K.。
 
  下面就说说用Mingw如何编译ffmpeg 吧。
 
  第一步:应该是安装和配置编译环境,我的做法比较简单,首先我去下载了一个DEV-CPP编译器,它包含了最新的Mingw。如果你没有DEV-CPP,你可以直接下载并安装Mingw.下载地址是http://www.mingw.org/。我安装的版本是MinGW-3.1.0-1.exe,请顺手下载一个MSYS-1.0.10.exe它是windows下的一个虚拟linux shell环境,我们需要用它来执行 configure 、make 等命令。首先安装 MinGW到一个指定的目录,假设在c:\MinGW目录下吧。然后设置环境变量,在PATH中加入 c:\MinGW\BIN。然后安装MSYS ,安装的过程中会提示你进行一些配置,其中需要提示你输入MinGW 的安装目录。这里需要注意一下,请输入 C:/MinGW(搞不懂,我输入C:\MinGW居然告诉我找不到,呵呵,可能是开发者玩惯LINUX了吧)如果是安装了DEV-CPP那就输入C:/dev-cpp即可。哦,差点忘了,您安装MinGW的时候别忘了下载一个WINAPI的源码包,如果安装DEV-CPP就不用了。哎,建议你还是安装个DEV-CPP吧,这个小东西还是很不错的,需要的东西基本上都有了。好了,编译环境配置好了。
 
  第二步:下载一个最新的ffmpeg源码包,我是通过CVS下载的,具体你可以看看ffmpeg的首页http://ffmpeg.sourceforge.net/index.php,通过CVS下载至少能保证你能得到最新的代码,ffmpeg的h264更新好像挺快的,呵呵。将ffmpeg源码解压缩到一个目录里,或者check-out 到一个目录里,在来个假设吧,D:\FFMpeg,运行桌面上的MSYS快捷方式,进入MSYS shell 里(如果安装没有创建快捷方式,晕我就不罗嗦了,安装目录里找MSYS.bat)。运行如下命令:
    1、$ cd /d/ffmpeg 进入ffmpeg工程目录.
    2、$ ./configure --enable-shared --enable-memalign-hack --disable-debug --enable-small
    3、$ make
 
  可以了,这是编译结束了,你可以在相应的目录里找到编译好的文件。如果不加--disable-debug --enable-small目标文件可能会很大,我的7M多。我下载的ffmpeg最新版本里有一个错误,在libavcodec目录下的snow.c文件的第3460行,pict->quality= ff_rate_estimate_qscale(&s->m);错误提示参数不够,我改成pict->quality= ff_rate_estimate_qscale(&s->m,0);编译顺利通过。
 
  问题1、目标文件怎么会这么大呢?(其实没啥关系,make install 后会进一步缩小,大概avcodec.dll 1.6M)如果制作网络下载的CAB包可能会大了点。没关系,明天想其他办法了。
 
  问题2、为啥导出这么多函数呢? 可能是我没仔细看MinGW的使用说明吧。有朋友知道MinGW如何制定导出函数麻烦能告诉我一下,谢谢。
 
今天就写到这里吧。明天见。
8月17日

高危病毒攻击数千电脑 专家担心大规模爆发

高危病毒攻击数千电脑 专家担心大规模爆发

2006年08月16日 19:52 北京晚报
 
  本报讯 (记者孙海东 贾中山) 瑞星昨天发出今年第一份黄色(三经)安全警报:两个利用微软操作系统高危漏洞进行传播的恶性病毒——“魔波(Worm.Mocbot.a)”和“魔波变种B(Worm.Mocbot.b)病毒,已使国内数千用户遭受攻击。
 
  专家警告,“魔波”病毒甚至有可能会像“冲击波”、“震荡波”病毒一样大规模爆发,预计将会有更多的电脑受到该病毒攻击。
 
  反病毒专家介绍,当用户的计算机遭受到该病毒攻击时,会出现系统服务崩溃,无法上网等症状。由于该病毒出现离微软发布补丁程序只有短短几天时间,有很多用户还没有来得及对系统进行更新。
 
  该病毒是利用微软MS06-040漏洞传播的。此前,美国国土安全部曾罕见地发布严重警告,称该漏洞有可能令黑客劫持他们的电脑,并在其上安装恶意软件,删除程序,或窃取私有账户信息。根据分析,“魔波”病毒会自动在网络上搜索具有系统漏洞的电脑,并直接引导这些电脑下载病毒文件并执行。只要这些用户的电脑没有安装补丁程序并接入互联网,就有可能被感染。感染该病毒的计算机会自动接受黑客远程控制命令。用户的银行卡账号、密码及其他隐私信息都有可能被黑客窃取。专家怀疑,该病毒很有可能为国人编写。
 
  针对该病毒,瑞星杀毒软件已进行及时升级,可彻底查杀此病毒。江民反病毒中心也已研制出专杀工具,计算机用户可登录其网站下载。专家建议同时提醒用户:及时登录微软网站(www.microsoft.com/chi-na/technet/Security/bul-letin/ms06-040.mspx)下载并安装补丁程序,以防范此病毒攻击。
8月15日

手机里暗含的秘密(世界人民震惊了!)

手机里暗含的秘密(世界人民震惊了!)
转自:天天向上
手机里暗含的秘密让我大吃一惊
 
  首先声明:这是我的一个朋友发给我的,我觉得现在有很多人可能都有以下列举的习惯,包括我在内(说的这五条我是全都有),最让我感到气愤的是第4条,如果我的朋友不告诉我,我可能就一直被蒙在鼓里,多花冤枉钱。所以我很希望看到此帖的人一定要注意对比自己是否也有这样的习惯,并且尽可能的告诉自己的朋友,少让人上当。
 
  1、手机电池不要等到没电才充电。

  一般我们都会有一种想法就是手机的电池电力要全部放完再充电比较好基本上是没错的,因为我们在以前使用的充电电池大部分是镍氢(NiH)电池,而镍氢电池有所谓的记忆效应若不放完电再充的话会导致电池寿命急速减少。因此我们才会用到最后一滴电才开始充电。但现在的手机及一般IA产品大部分都用锂(Li)电池,而锂电池的话就没有记忆效应的问题。若大家还是等到全部用完电后再充的话反而会使得锂电池内部的化学物质无法反应而寿命减少。最好的方法就是没事就充电让它随时随地保持最佳满格状态,这样你的电池就可用的又长又久喔。这是从厂商那得到的讯息,并经过本身测试而得。
 
  2、当手机正在充电时,请勿接电话!!

  原因是手机在充电时,来电接听的话会有潜在的危险。印度有一个31岁在保险公司任职业务经理的年轻人,十几天前在手机还接着充电器的时候接听电话,过了几秒大量的电流经过手机,这个年轻人被摔落到地面,家人发现时,手指烧伤,心跳微弱,并且已经失去意识。经紧急送到医院后,医生宣布到院死亡。行动电话是目前大家最常使用的现代发明。然而,我们也必须要警觉到仪器致死的危险。
 
  3、手机剩一格时不要使用
 
  收讯满格与只剩一格时相比,发射强度竟然相差1000倍以上.所以……常讲手机的人……要注意哦……^0^、昨天从一位交大教授那儿获得一项很重要的讯息,那就是当你发现手机的收讯强度只剩下一格的时候,宁可挂断不谈或者是改用公用电话。千万不要再滔滔不绝、口沫横飞、浓情蜜意、欲罢不能、没完没了……为什么呢?
  大家都知道手机的电磁波一直是让人担心的问题。而手机的设计为了在收讯较差的地区仍能保有相当的通话质量,会加强手机的电磁波发射强度.当收讯满格与只剩一格时相比,发射强度竟然相差1000倍以上。
 
  4、17951+电话号码=陷阱
 
  我也向1860查询过了.
  如果你把17951+电话号码储存在电话号码本里?而不是单独拨?收费就会从0.7元每分钟变成1.3元每分钟.他们的解释是如果储存在电话号码本里?系统将无法识别。所以获得资费优惠,必须每次在键盘上直接按17xxx。神州行用户如此?动感地带用户,全球通也一样。如果你是一个中国移动用户,当你知道中国移动为你设置以下的陷阱的时候,便不再惊讶于你的话费为何会像长了翅膀一样的飞走。用17951+电话号码可以优惠,但如果你预先将”17951+电话号码”存在手机的电话本,使用的时候调出来然后拔打出去,这时中国移动不承认你使用了17951这种优惠的拔打方式,而按照直接拔打的方式计费。如果你是在漫游,两种计费方式可以相差7倍之多!当我得知如此计费之后,我真的不知如何表达我的愤怒,后来打1860咨询时,如果不是主动冶询问这个问题,工号为6608的小姐根本就不告诉我这样的计费。
 
  5、手机费的寄生虫
 
  手机莫名其妙定置了无用短信,强烈建议大家都看一下自己有没有中招,最简单方法退订每月偷你手机费的寄生虫!
  中国移动在3.15被迫退出一项新业务,如果您是中国移动的手机用户,键入数字“0000”,发送短信至186201,数秒钟内将自动回复一条短信列表,显示您的手机上究竟订制了哪些短信服务,究竟是哪些短信服务商明着、暗着每月扣除您的手机费;键入数字“00000”,发送短信至186201,即可退订所有短信服务。
  〖levi补充:发送“00000”至查询到的 SP 服务提供商可以退订指定的服务,sina 说的。〗
 
  下面一条是来自网友 justjay 的补充,感谢这位朋友的及时补充,希望有更多的朋友如果知道其他有关手机里暗含的秘密,请不要吝啬,让这些黑幕都公之于众吧,我先替大家谢谢您了!
 
  补充一点~
  我们打电话的时候常常会为了正好赶在1:00前结束而庆幸,但其实并不是这样的,据一位中国移动的工作人员说,其实在你通话到0:55的时候就已经算一分钟了,所以0:55~1:00的通话时间其实是算你2分钟的钱~
 
  真是黑啊~~
 

一幅诡异的油画“2008-北京”

一幅诡异的油画“2008-北京”
转自:天天向上
  今天在网上看到了一幅十分阴暗诡异的油画。
  这幅油画也是有历史的,在2005年3月6日,纽约艺术博览会开幕。世界艺术家云集,观众鼎沸,博览会的左前方总是水泄不通之处,那里是加拿大Redinc艺术公司,聚光灯下,挂着一幅题为“2008-北京”巨幅油画。
  令人惊讶的是,网上对这副油画的含义有好几种不同的解读,看完那些解读之后,再看看这副油画,似乎又能发现更多诡异的东西。
  比较引起我注意的倒是画者在其blog上摘抄多伦多《世界日报》的解读文字(虽然作者并未正面承认这个解读是否完全符合他的创作原意):
  
  画的左上角,是一幅标准像,乍看上去,熟悉又不熟悉,那是孙中山的胡子,蒋介石的光头,毛泽东的五官新组合的标准像。它象徵着中国上一百年的历史,或者说是旧民主主义和新民主主义的全部。
  画的左面,是一个最天真和最聚精会神打麻将的女孩,她为抓了一手好牌而暗中庆幸。
  中间背影的女子,开了一个东风明杠,这象徵着当前不可无视的事实—中国在崛起。虽然那女子有些不规矩的小动作。
  中间正面女子,似乎有些外来血统。他在打牌之余,另有闲心眺望光源,也即将来。他穿着光纤,脸上有一些忧虑。
  再就是那个外国女郎了,她也来掺合中国的游戏,信心全无,躺在那里,因为她少抓了一张牌,相公,配打。
  右面显然是一个进城打工的农村姑娘,她是使中国掘起的生力军。然而他的脸上有一些不明白,有一些不满意。他手中握着一把亮晃晃的水果刀,这暗示着一种仇富心理,暗示着一种危机。
  画的右边,在破旧的建筑的前方,有一条大河,有一些石头,这象徵着前景莫测,只是摸着石头过河的现状。
  不过,在某个论坛上则又看到有人做另一番新解,却也别有新意:
  中间女子是美国,背后纹着凤凰的女子是中国,侧面正在认真考虑出什么牌的亚洲女为日本,另一个躺着的是俄国。
  中国女子碰了东风并不意味崛起,只是表达「做东」的意思。而俄国女郎也并不是信心全无的「相公」。仔细观察一下她的姿态就会发现,很显然,她是在趁日美不注意,和中国女郎偷换牌。这正是换牌的瞬间,所以她桌上的牌少了一张。另一面,居然跟美国也“有一腿”,是在迷惑美国?还是……
  而旁边那个拿刀的小女孩,明显发现了这一切。她的视线停留在正准备把牌偷偷塞给俄国女的中国女脸上。美国女人,似乎已从小女孩的表情中发现了什么……
  把小女孩说成刚进城的农民似乎也太勉强。我觉得可能是代表中国民众,而坐着的是政府。有这场游戏实际上是政治的博弈,普通中国人却怎么的怎么的(不好直说)意思。
  对於摸着石头过河的解释,我更是不敢苟同。我倾向於认为屋外描绘的是阴云密布的台海。
  至於文身,我也想不出来。腰间那个图形我无法解释。我打算简单地把文身视为画面的需要,在画面黄金位置设计一个文身,是一个不错的手段,最起码,比光溜溜的一个后背更有沖击力。
  嗯,这应该就像罗兰巴特宣示的「作者之死」(the death of the author)的意思吧:作品一旦完成而脱离作者后,读者将会以其文化脉络及思考,创造属於读者自己的意义……
  这里是论坛上的第三个诠释:
  中间女子是美国,背後纹著凤凰的女子是中国,侧面正在认真考虑出什麽牌的亚洲女为日本,另一个躺著的是俄国。中国女子碰了东风并不意味崛起,只是表达“做东”的 意思。而俄国女郎也并不是信心全无的“相公”。仔细观察一下她的姿态就会发现,很显然,她是在趁日美不注意,和中国女郎偷换牌。这正是换牌的瞬间,所以她桌上的牌少了一张。
  事实上画面裏中、美、俄都在参与作弊,只有日本女孩不知情在暗爽,就是说拍桌上博弈的四方日本才是陪打,牌搭子而已。
  盆裏的水果意味很明显,当然是代表台湾的地区利益。
  台湾之所以一身纯正中国式的装扮,是因为最後的中国传统在台湾。
  台湾手裏是一把餐刀,这大概是个双关,一是表示不管谁攫取了台湾的利益,台湾都只能乖乖的为之切水果;第二联系到小姑娘的表情,那把餐刀(代表她的防卫能力),就是对她利益最後的一点防御了。
  另外,喜欢美国的表情,看著台湾,一副又关心又不知道该怎麽办的样子;而台湾站在一旁冷眼观看,对几个家夥弄鬼看得一清二楚,可自己不在局中,却又什麽都不能说。
  配合日本妞傻乎乎的认真样子,和中国小妹妹狡黠的背影。
  这里是论坛上的第四个诠释:
  注意看了下, 中间只露出背影的女孩身上纹的是传统的中国凤凰。但身上所穿的却是西洋蕾丝衣物。是不是在说明现在的中国是”中学为体,西学为用”?
  外面的场景应该是暗示台湾海峡,阴云密布暗示紧张形势。
  台湾女孩不是在盯作弊,她盯的是中国女孩的脸,美国女孩盯著台湾女孩的脸,俄罗斯女孩也在盯著中国;三个人的表情都很有深意。日本女孩只看自己的牌,很投入也很满意。
  中、美、日、俄之间利益复杂,日本虽然卷了进去但只关心自己的利益。
  西方一般认为国民党民国政府是中国民族主义政府。这个解释了台湾的传统肚兜,似乎也在说08年大势还是在民国立场而不是台湾国立场。
  美国也没强多少,君不见,她虽然穿了衣服但没穿裤子?!但是她穿得最多!而且她的这种神情似乎也在考虑这局是不是要脱衣服了,因为中国女子在作弊,而俄罗斯已经是陪太子读书,只求不放炮了,打的时间越久,危险越大!
  中国却希望通过不正当竞争,争取必胜!
  日本看样子,是根本不知道裏面的凶险,尽管她好象已经输光了!而且大家应该注意,中国的上下家是日本和俄罗斯,美国只是对家而已!中国只能和日本、俄罗斯发生直接的利益冲突,美国却是隔岸观火,但是也有放炮的可能!
  不过,赢家是美国,因为她们的规矩是,谁输了谁就要脱一件衣服!
  日本可是衣服裤子都没穿 输到底了这样,日本已经没有筹码了,如果输了,就彻底退出比赛!赢了,还可以继续留下来!
  俄罗斯只能自保,输了还能打一场,也就是说还有机会!
  美国和中国有优势,但是如果是一个输了话,而无论剩下的是哪一位都是最强的了,而输的一方和俄罗斯相比,是同样的档次了!
  这局可以是最後一局,也可以是新的一局的前奏!

看厕所的老头怎么逼死移动老总的

看厕所的老头怎么逼死移动老总的
转自:天天向上

  今天早上,移动一官员猪古力在外突然感觉内急,只好找公共厕所。

  “干什么的?”大爷喊。

  “我是移动老总,我内急。”猪古力。

  “你不知道现在什么都要收费啊?”大爷。

  “行,多少钱?”猪古力。

  “进去5毛,出来3毛。”大爷看着他。

  “什么出来也要收费?”猪古力瞪着眼睛。

  “看什么看,我们这里实行双向收费。如果你办个厕所套餐的话,就可以单向收费了。”大爷站起来。

  “行,我付钱。”猪古力掏出十块钱。

  “大便还是小便?”大爷捏住钱问。

  “大便,快点。”

  “恩,你需要办理套餐吗?如果你一次性大便五十次,可以给你优惠再大便三十次。”大爷说。

  “别说了,我先进去,马上出来付钱。”老总进去后,选择了最后一个坑位爽了好久后出来了。

  “先生,您选择的是五号坑位,得付选号费用5毛钱,你在里面呆的时候没有说不要选择放音乐,所以每次收费6毛钱。另外你在里面蹲了十五分零一秒,前一分钟按5毛每分,后面按每分钟四毛计费。不足一分钟按一分钟计费。另外由于你的排泄量占用了我们的下水道带宽,所以请你另外按包月付出费用50园。最后你可以通过小孔看到进厕所的其他人,请付来人显示费1块钱。”猪古力先生已经呆在那里。

  “所以,老总先生,我们这里不刷卡,总共你要付59.4毛钱,如果逾期不交纳,按每日千分之三的费用计滞纳金,我方不另行通知,到积累到千元我方将通过法律手段催缴。”大爷刚刚说完,猪古力先生扑通一声晕倒在小便池里。

看完八个笑话 顿悟八个人生道理[转]

看完八个笑话 顿悟八个人生道理
转自:天天向上
  
  
  1、建筑师
  
  一位夫人打电话给建筑师,说每当火车经过时,她的睡床就会摇动。
  
  ”这简直是无稽之谈!”建筑师回答说,”我来看看。”
  
  建筑师到达后,夫人建议他躺在床上,体会一下火车经过时的感觉。
  
  建筑师刚上床躺下,夫人的丈夫就回来了。他见此情形,便厉声喝问:”你躺在我妻子的床上干什么?”
  
  建筑师战战兢兢地回答:”我说是在等火车,你会相信吗?”
  
  【顿悟】
  
  有些话是真的,却听上去很假;有些话是假的,却令人无庸置疑。
  
  2、引诱
  
  英国绅士与法国女人同乘一个包厢,女人想引诱这个英国人,她脱衣躺下后就抱怨身上发冷。先生把自己的被子给了她,她还是不停地说冷。
  
  ”我还能怎么帮助你呢?”先生沮丧地问道。
  
  ”我小时候妈妈总是用自己的身体给我取暖。”
  
  ”小姐,这我就爱莫能助了。我总不能跳下火车去找你的妈妈吧?”
  
  【顿悟】
  
  善解风情的男人是好男人,不解风情的男人更是好男人。
  
  3、调羹
  
  麦克走进餐馆,点了一份汤,服务员马上给他端了上来。
  
  服务员刚走开,麦克就嚷嚷起来:”对不起,这汤我没法喝。”
  
  服务员重新给他上了一个汤,他还是说:”对不起,这汤我没法喝。”
  
  服务员只好叫来经理。
  
  经理毕恭毕敬地朝麦克点点头,说:”先生,这道菜是本店最拿手的,深受顾客欢迎,难道您……”
  
  ”我是说,调羹在哪里呢?”
  
  【顿悟】
  
  有错就改,当然是件好事。但我们常常却改掉正确的,留下错误的,结果是错上加错。
  
  4、穿错
  
  饭厅内,一个异常谦恭的人胆怯地碰了碰另一个顾客,那人正在穿一件大衣。
  
  ”对不起,请问您是不是皮埃尔先生?”
  
  ”不,我不是。”那人回答。
  
  ”啊,”他舒了一口气,”那我没弄错,我就是他,您穿了他的大衣。”
  
  【顿悟】
  
  要做到理直气壮,并不是件容易的事情。理直的人,往往低声下气;而理歪的人,却是气壮如牛。
  
  5、回电
  
  一个苏格兰人去伦敦,想顺便探望一位老朋友,但却忘了他的住址,于是给家父发了一份电报:”您知道托马的住址吗?速告!”
  
  当天,他就收到一份加急回电:”知道。”
  
  【顿悟】
  
  当我们终于找到最正确的答案时,却发现它是最无用的。
  
  6、伤心故事
  
  有三个人到纽约度假。他们在一座高层宾馆的第45层订了一个套房。
  
  一天晚上,大楼电梯出现故障,服务员安排他们在大厅过夜。
  
  他们商量后,决定徒步走回房间,并约定轮流说笑话、唱歌和讲故事,以减轻登楼的劳累。
  
  笑话讲了,歌也唱了,好不容易爬到第34层,大家都感觉精疲力竭。
  
  ”好吧,彼德,你来讲个幽默故事吧。”
  
  彼德说:”故事不长,却令人伤心至极:我把房间的钥匙忘在大厅了。”
  
  【顿悟】
  
  我们痛苦,所以幽默;我们幽默,所以快乐。
  
  7、卖书
  
  一个很有名的作家要来书店参观。书店老板受宠若惊,连忙把所有的书撤下,全部换上作家的书。作家来到书店后,心里非常高兴,问道:”贵店只售本人的书吗?”
  
  ”当然不是。”书店老板回答,”别的书销路很好,都卖完了。”
  
  【顿悟】
  
  ”拍马屁”是个奇怪的词:你象是在奉承他,又象是在侮辱他。
  
  8、帮忙
  
  在邮局大厅内,一位老太太走到一个中年人跟前,客气地说:”先生,请帮我在明信片上写上地址好吗?”
  
  ”当然可以。”中年人按老人的要求做了。
  
  ”谢谢!”老太太又说:”再帮我写上一小段话,好吗?”
  
  ”好吧。”中年人照老太太的话写好后,微笑着问道:”还有什么要帮忙的吗?”
  
  ”嗯,还有一件小事。”老太太看着明信片说,”帮我在下面再加一句:字迹潦草,敬请原谅。”
  
  【顿悟】
  
  你若不肯帮忙,人家会恨你一个星期;如果帮得不够完美,还不如……
7月17日

欢迎SVN

  又用上了SVN,第一次用TortoiseSVN,还可以,整合到了资源管理器里,消耗还不算大,虽然偶尔图标显示不够同步,好在只是在目录树里有这情况,可以接受。
  工作路径里建了几个工程,需要共享文件,通过外部连接的方式搞定了。SVN功能是很不错的,就是用起来需要学习+小心。好多功能提供了还从来没有用到过,有机会自己尝试一下。
  一句话,多看文档。
  PS.需要的时候。 :)
6月23日

我们的爱情是多么毁人

我们的爱情是多么毁人


—— Tyutchev 俄罗斯

  我们的爱情是多么毁人!
  凭着盲目的热情的风暴,
  越是被我们真心爱的人,
  越是容易被我们毁掉!
  
  才多久啊,你曾骄傲于
  自己的胜利说:“她是我的了。”
  但不到一年,再请看看吧,
  你那胜利的结果怎样了?
  她面颊上的玫瑰哪里去了?
  还有那眼睛的晶莹的光,
  和唇边的微笑?啊,这一切
  已随火热的泪烧尽,消亡……
  
  你可记得,在你们初见时,
  唉!那初次的致命的会见——
  她的迷人的眼神,她的话语,
  和那少女的微笑是多么甜。
  但现在呢?一切哪里去了?
  这好梦究竟有多少时辰?
  唉,它竟好像北国的夏季,
  只是一个短暂的客人!
  
  你的爱情对她来说,
  成了命运的可怕的判决,
  这爱情以无辜的耻辱
  玷污了她,一生都难洗雪!
  悔恨的生活,痛苦的生活啊!
  只有绵绵无尽的回忆
  还留在她的深心里啮咬——
  但连它也终于把她遗弃。
  
  人世对于她成了一片荒凉,
  美好的幻景都已逝去……
  匆忙的人流把她心中的
  鲜艳的花朵踏成了污泥。
  从长期的痛苦中,是什么
  被她珍藏着,好像珠贝?
  那是邪恶的、酷虐的苦痛,
  既没有慰安,也没有眼泪!
  
  我们的爱情多么毁人!
  凭着盲目的热情的风暴,
  越是被我们真心爱的人,
  越是容易被我们毁掉!