﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-阿里技术学习博客-随笔分类-技术</title><link>http://www.cnitblog.com/aliyiyi08/category/5193.html</link><description>分享学习经验</description><language>zh-cn</language><lastBuildDate>Mon, 26 Sep 2011 04:33:21 GMT</lastBuildDate><pubDate>Mon, 26 Sep 2011 04:33:21 GMT</pubDate><ttl>60</ttl><item><title>这两天使劲玩git和hg,本周四要给兄弟们讲啦!</title><link>http://www.cnitblog.com/aliyiyi08/archive/2009/03/02/54966.html</link><dc:creator>阿里爸爸</dc:creator><author>阿里爸爸</author><pubDate>Sun, 01 Mar 2009 16:42:00 GMT</pubDate><guid>http://www.cnitblog.com/aliyiyi08/archive/2009/03/02/54966.html</guid><wfw:comment>http://www.cnitblog.com/aliyiyi08/comments/54966.html</wfw:comment><comments>http://www.cnitblog.com/aliyiyi08/archive/2009/03/02/54966.html#Feedback</comments><slash:comments>11</slash:comments><wfw:commentRss>http://www.cnitblog.com/aliyiyi08/comments/commentRss/54966.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/aliyiyi08/services/trackbacks/54966.html</trackback:ping><description><![CDATA[这两天使劲玩git和hg,本周四要给兄弟们讲啦!<br><br>之前看分布式版本控制时,不是太注重使用.周四就要讲了,必须注重理论,更注重实用!因为到时我必须阐述清楚为什么要使用分布式版本控制.和SVN比有什么优点!用的时候怎么用?<br><br>今天碰到一下奇怪的问题,特记录下来.<br>今天我在一台机器(71.85两台都是linux)上装了git,另一台没有装[128.212].<br>先在71.85上git init初始化了版本库,并把一老项目代码提交了进去.<br>然后把71.85整个目录打包到扔到128.212上,想这样就可以偷懒少装一个git环境,以后用的时候就用71.85<br>然后在71.85用这个命令去取代码"git clone ssh://jian@xx.xxx.128.212/home/jian/temp/temp/gittest/",但是就是报错,就是取不出来,出错信息如下:\<br><br><u>Initialized empty Git repository in /data/git/git_clone/gittest/.git/<br></u><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#106;&#105;&#97;&#110;&#64;&#120;&#120;&#46;&#120;&#120;&#120;&#46;&#49;&#50;&#56;&#46;&#50;&#49;&#50;&#39;&#115;"><u>jian@xx.xxx.128.212's</u></a><u> password: <br>bash: git-upload-pack: command not found<br>fatal: The remote end hung up unexpectedly<br></u><br>搞了好一会就是不行,google之无解!最后想会不会是那边128.212上没装git.再试一下在128.212装上git.在71.85上重试下,问题解决!这个git的错误信息太难懂了!<br><img src ="http://www.cnitblog.com/aliyiyi08/aggbug/54966.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/aliyiyi08/" target="_blank">阿里爸爸</a> 2009-03-02 00:42 <a href="http://www.cnitblog.com/aliyiyi08/archive/2009/03/02/54966.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Haskell教程[转如飞的]</title><link>http://www.cnitblog.com/aliyiyi08/archive/2009/02/13/54524.html</link><dc:creator>阿里爸爸</dc:creator><author>阿里爸爸</author><pubDate>Fri, 13 Feb 2009 08:40:00 GMT</pubDate><guid>http://www.cnitblog.com/aliyiyi08/archive/2009/02/13/54524.html</guid><wfw:comment>http://www.cnitblog.com/aliyiyi08/comments/54524.html</wfw:comment><comments>http://www.cnitblog.com/aliyiyi08/archive/2009/02/13/54524.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/aliyiyi08/comments/commentRss/54524.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/aliyiyi08/services/trackbacks/54524.html</trackback:ping><description><![CDATA[一.序 <br><br>1．什么是Haskell? <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Haskell是一种函数编程语言. 1980年代以前对函数编程有很多研究, 但不同的研究者使用各自不同的语法记号, 一起交流时造成一些不便. 后来1987年的时候, 在FPCA'87会议上制定了统一的Haskell语言. Haskell吸收了各家的长处, 是一种纯粹的函数编程语言,并根据科学家Haskell B.Curry的名字命名. Haskell经过多年的发展完善, 目前使用的版本是Haskell 98. <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>2．Haskell有什么特点? <br><br>&nbsp;&nbsp;&nbsp;&nbsp;相对Haskell来说,传统的Basic,Pascal,C++,C#,Java,Python等都是命令(imperative)编程语言, 程序语句有一定的执行次序. 函数(functional)编程语言则给出执行的内容, 关注于更高层次的"做什么"而不是"怎么做", 这就是二者最明显的一个区别。函数编程语言的语法功能非常强，使编程的效率大幅提高。 <br>&nbsp;&nbsp;&nbsp;&nbsp;Haskell是世界上公认的语法最优美最简洁的一种语言。的确，Haskell语言是写给人看的，而不是写给机器看的。另一方面，这也使得的Haskell的编译技术成为一个难点。从以人为本的角度来看，程序员的时间比机器的时间更宝贵，所以Haskell是明智的选择。 <br><br>3．如何获得Haskell? <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Haskell是一个公共的语言定义, 任何人都可以编写它的实现(implementation), 因而Haskell有很多解释器(比如Hugs)和编译器(比如GHC), 它们都可以在www.haskell.org上得到. 解释器的优点是便于学习和开发,程序写好后不需要编译直接就可以运行,编译器则可以将程序编译可独立执行的文件,便于发布. Haskell既能解释执行, 也能槐槐嘁? 这也是优于其他语言的一个地方. <br><br>附：Hugs使用指南 <br><br>&nbsp;&nbsp;&nbsp;&nbsp;本文中的示例程序都将在Hugs中运行, 在这里简要介绍一下Hugs的使用方法。Hugs可以在http://www.haskell.org/hugs/下载，安装文件只有2.8M， 是学Haskell的必备工具. <br><br>使用方法: <br><br>1.用你自己喜欢的文本编辑器将源程序写好, 保存到文件中, 文件以扩展名 hs 结尾. <br><br>2.运行Hugs, 出现提示符: Prelude&gt; ,表示Prelude库已经装载. <br><br>3.输入:? 可以查看可供使用的一些命令的说明 <br><br>4. 先输入:!, 然后就可以输入DOS命令并执行. 比如输入:!dir查看当前的工作目录 <br><br>5. 输入:cd directory_name 将工作目录改为你保存源文件的目录 <br><br>6. 输入:l file_name 将源程序载入, 提示符变为Main&gt; <br><br>现在就可以在提示符后输入各种表达式以检验所定义的函数的功能, 执行所需的运算. <br><br>注意: 在提示符后不可以定义新的函数, 因为Haskell中各语句不是顺序执行的, 而把整个源文件当作一个整体来处理, 在编辑器中修改源程序并保存后, 只要输入:r就重新载入, 改动就生效了. <br><br><br>二.语法概要 <br><br>1.注释有两种: 一种以"--"开始到行尾结束, 一种以"{-"开始,以"-}"结束,可以延续多行. <br><br>2.表达式和函数都有类型,但类型声明不是必需的,有一套类型推断系统可以推断出所涉及的类型. <br><br>3.函数的定义多使用模式(pattern)匹配的方法, 两个标识符(identifier)邻接就表示函数调用. <br><br>4.函数变量和类型变量的标识符以小写字母开头, 类型构造和模块的标识符以大写字母开头. <br><br>5.语句块以缩进区分, 从同一列开始的语句属于同一个块. <br><br>6.保留字: case class data default deriving do else if import in infix infixl infixr instance let module newtype of then type where _ <br><br>7.运算符可以自定义,由以下符号进行组合: <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;: # $ % &amp; * + - = . / \ &lt; &gt; ? ! @ ^ | <br>&nbsp;预定义的运算符有: <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+ &nbsp;- &nbsp;* &nbsp;/ &nbsp;^ &nbsp;$ &nbsp;++ &nbsp;. &nbsp;&amp;&amp; &nbsp;|| &nbsp;== &nbsp;/= &lt;= &nbsp;&gt;= &nbsp;&lt; &nbsp;&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;: // &nbsp;= &nbsp;@ &nbsp;-&gt; &nbsp;=&gt; &nbsp;.. &nbsp;:: &nbsp;&lt;- &nbsp;!! <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>8.数字: 123 &nbsp;12.3 &nbsp;1.23e5 &nbsp;0o67 &nbsp;0x3A <br><br>&nbsp;字符: 'a' 'A' '\n' <br>&nbsp; <br>&nbsp;字符串: "character string" <br>&nbsp; <br>&nbsp; <br>三.常数 <br><br>&nbsp;&nbsp;&nbsp;&nbsp;在函数编程语言中, 函数是一个中心概念, 常数也可看作是常函数. 如下语句: <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f = 3 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;定义了一个常数. f 被定义为3后就不能重复定义 f=5 ,任何时候调用f, 它都返回3. 这就消除了一些边际效应,减少了出错的可能性. 以下代码在函数编程和命令编程中具有完全不同的含义: <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;a = 2 <br>&nbsp;&nbsp;&nbsp;&nbsp;b = 4 <br>&nbsp;&nbsp;&nbsp;&nbsp;c = a + b <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;在函数编程中解释为: 定义常数a为2, 定义b为4, 定义c为a,b之和. &nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;在命令编程中解释为: 给变量a赋值2, 给b赋值4, 求a,b之和赋给c. <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;定义和赋值的区别在于, 定义不分次序, 赋值有次序, 以上程序在Haskell中完全可以倒过来写: <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;c = a + b <br>&nbsp;&nbsp;&nbsp;&nbsp;a = 2 <br>&nbsp;&nbsp;&nbsp;&nbsp;b = 4 <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;另外, 定义并不计算, 比如: <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;d = 3*5 <br>&nbsp;&nbsp;&nbsp;&nbsp;e = 1/0 <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;在命令程序中, e=1/0会引发一个错误, 在Haskell中只有当计算e时才引发错误. <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;Haskell的思维更像是人脑的思维而不是机器的思维. <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;也可以给常数加以类型说明, 比如: <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;b :: Int <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;如果没有这一类型说明, 系统自动根据 b=4 推断b的类型为: Integer <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;Int和Integer区别是Int的取值范围是有限的, Integer的大小是无限的. 因为Integer比Int更普遍,所以在没有明显说明b的类型为Int时, 就自动推断b的类型为: Integer <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;再举几个例子,在Haskell标准库Prelude中定义的常数中,有两个是: <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;pi = 4 * atan 1 <br>&nbsp;&nbsp;&nbsp;&nbsp;otherwise = True <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>四.单变量函数 <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;如下语句: <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;f &nbsp;&nbsp;&nbsp;&nbsp;(x)=x+2 <br>&nbsp;&nbsp;&nbsp;&nbsp;double(x)=2*x <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;就定义了两个简单的函数, 函数的类型由自变量的类型和返回值在类型决定, 用运算符"-&gt;"连接. <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;比如可以用以下语句说明它们的类型: <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;f &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:: Int -&gt; Int <br>&nbsp;&nbsp;&nbsp;&nbsp;double :: Float -&gt; Float <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;表示f是从Int变量到Int变量的映射. 如果没有明显说明, 系统根据函数定义中所涉及到的运算(+),(*)推断这两个函数的类型为: &nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;Num a =&gt; a -&gt; a <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;这里a是一个类型变量, 属于一个独立的名字空间, Num是一个类, Num a =&gt; 表示类型a属于Num类. Num类中定义了(+)和(*)的运算, 继承此类的类型也支持这两种运算. 这样使用类来限定函数的类型, 使函数具有的普遍性. 把类型归为一些类, 实现了类型的多态, 也简化了编程的任务. <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;在Haskell中函数非常频繁地用到, 通常在函数的定义和使用中省去括号, 直接用两个标识符邻接表示函数作用. 所以f和double的定义可写为: <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;f x &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= x + 2 <br>&nbsp;&nbsp;&nbsp;&nbsp;double x = 2 * x <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;调用函数的格式和定义函数的格式基本是相同的, 比如定义函数g如下: <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;g x = 2 * f x <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;函数作用的优先极高于其他所有的运算符, 所以2 * f x等价于2 * (f x), 也等价于2 * (f(x)). <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;函数作用的次序是从左向右的, 所以可以等价地定义g为: <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;g x = double (f x) <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;Prelude有一个运算符$的定义如下: <br>&nbsp;&nbsp;&nbsp;&nbsp;infixr 0 &nbsp;$ <br>&nbsp;&nbsp;&nbsp;&nbsp;($) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:: (a -&gt; b) -&gt; a -&gt; b <br>&nbsp;&nbsp;&nbsp;&nbsp;f $ x &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= f x <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;可见, $也是表示函数作用的, 但它的优先级最低, 而且作用次序是从右向左的.所以还可以等价地定义g为: <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;g x = double $ f x <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;引入$, 避免了括号的使用, 尤其当$后的表达式很长有多行时使用$是很方便的. <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>五. 多变量函数 <br><br><br>&nbsp;&nbsp;严格说来, 一个函数只能接收一个参数, 返回一个值. 但有两种方法可以实现多变量函数. <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;1.Curried函数 <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;函数接受一个参数后, 返回的也是一个函数, 这个函数对可以接受别的参数. 比如: <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;add :: Int -&gt; Int -&gt; Int <br>&nbsp;&nbsp;add x y = x + y <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;从add类型可以看出, 有两个"-&gt;", 而"-&gt;"的结合次序是从右向左, 所以add的类型是: <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;Int -&gt; ( Int -&gt; Int ) <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;即add接受一个Int参数, 返回一个( Int -&gt; Int )的函数, 这个函数再接受一个Int返回一个Int. <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;这样的函数就叫curried函数. <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;2.使用数组 <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;数组就是把几个变量放到一起看成是一个变量, 从而使函数可以输入和输出多个变量. 比如: <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;add :: (Int,Int) -&gt; Int <br>&nbsp;&nbsp;add (x,y) = x+y <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;数组是Haskell中的一种数据结构, 数组中可以放不同类型的变量, 数目不限但长度固定, 数组的类型就是数组内各元素的类型组合起来构成一种类型. <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;这两种函数在使用中各有特色, 而且可以用Prelude中定义的curry和uncurry互相转换. <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;curry &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:: ((a,b) -&gt; c) -&gt; (a -&gt; b -&gt; c) <br>&nbsp;&nbsp;curry f x y &nbsp;&nbsp;&nbsp;&nbsp;= f (x,y) <br><br>&nbsp;&nbsp;uncurry &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:: (a -&gt; b -&gt; c) -&gt; ((a,b) -&gt; c) <br>&nbsp;&nbsp;uncurry f p &nbsp;&nbsp;&nbsp;&nbsp;= f (fst p) (snd p) <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;稍作一点解释:类型说明中出现的小写a,b,c等叫类型变量, 表示任意一种类型. f (x,y)表示f接受数组为参数, curry f x y就是(curry f) x y 表示curry f可以接受两个变量为参数. 令 g=curry f, 则 g x y = f (x,y). 可见curry的转换作用, curry的类型表达更清楚和说明了这一点. uncurry也是一样的道理, 其中的fst和snd分别表示取二元数组的第一个和第二个元素.定义如下: <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;fst &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:: (a,b) -&gt; a <br>&nbsp;&nbsp;&nbsp;fst (x,_) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= x <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;snd &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:: (a,b) -&gt; b <br>&nbsp;&nbsp;&nbsp;snd (_,y) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= y <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;"_"叫匿名变量, 匹配指定类型任意的输入值, 该值在"="后的表达式中不会用到. <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>六. 离散函数 <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;有些函数的参变量只有有限个取值, 比如Prelude中not的定义如下: <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;not &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:: Bool -&gt; Bool <br>&nbsp;&nbsp;&nbsp;not True &nbsp;&nbsp;&nbsp;&nbsp;= False <br>&nbsp;&nbsp;&nbsp;not False &nbsp;&nbsp;&nbsp;= True <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;not对逻辑变量取反. <br><br>&nbsp;&nbsp;&nbsp;离散的变量可以使用保留字data定义, 比如: <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;data Direction = Left|Up|Right|Down <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;这就定义了一种Direction类型的变量, 这种变量的取值只有四个值:Left,Up,Right,Down. <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;data定义了一个新的类型, type则可以给一个已有的类型取一个别名.比如: <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;type Point = (Float, Float) <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;(Float, Float)是容纳两个Float变量的数组的类型, 取别名后既简化了书写, 也附加了含义. <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;现在看针对离散变量的函数如何定义: <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;move :: Direction -&gt; Point -&gt; Point <br>&nbsp;&nbsp;&nbsp;move Left &nbsp;(x,y) = (x-1,y) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;move Up &nbsp;&nbsp;&nbsp;(x,y) = (x,y-1) <br>&nbsp;&nbsp;&nbsp;move Right (x,y) = (x+1,y) <br>&nbsp;&nbsp;&nbsp;move Down &nbsp;(x,y) = (x,y+1) <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;即分别对应离散变量的每一个取值对函数作相应的定义. 以(x,y)表示位置, 给move输入移动的方向和当前的位置, 就输出了移动后的位置. <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;再看一个例子: <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;data Thing = Paper | Stone | Scissors &nbsp;&nbsp;deriving Show <br><br>&nbsp;&nbsp;&nbsp;beat :: Thing -&gt; Thing <br>&nbsp;&nbsp;&nbsp;beat Paper &nbsp;&nbsp;&nbsp;= Scissors <br>&nbsp;&nbsp;&nbsp;beat Stone &nbsp;&nbsp;&nbsp;= Paper <br>&nbsp;&nbsp;&nbsp;beat Scissors = Stone <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;定义Thing类型有三个取值, deriving Show表示Thing类型继承Show类, 从而拥有的Show的method, Show类的作用是将取值转化为字符串在屏幕上显示. beat定义了三种物品,纸,石头,剪刀之间的输赢关系. <br>&nbsp; <br><br>&nbsp;&nbsp;&nbsp;自然数是离散的也是无限的, 以自然数为变量的函数通常用迭代的方法定义, 即函数自己调用自己.举个例子: <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;fac 0 = 1 <br>&nbsp;&nbsp;&nbsp;fac n = n * fac (n-1) <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;这样计算fac n时, 先去计算fac (n-1),有fac n = n * fac (n-1)=n * (n-1) * fac (n-2),如此类推, 一直算到fac 0, 最后的结果是把从1到n的自然数全部连乘起来. <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;再比如: &nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;increment,fib :: Int -&gt; Int <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;increment x=x+1 <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;fib 1 = 1 <br>&nbsp;&nbsp;&nbsp;fib 2 = 2 <br>&nbsp;&nbsp;&nbsp;fib n = fib (n-1) + fib (n-2) <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;当计算函数时, 按照输入的参数逐一匹配所给的模式, 如果无法匹配时给出错误中断. 对于自然数模式匹配还允许用如下方式定义函数: <br>&nbsp;&nbsp;&nbsp;foo (n+1) = n-1 <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;Haskell中预定义的针对字符的函数有: <br>&nbsp;&nbsp;&nbsp;isAscii, isLatin1, isControl, isPrint, isSpace, isUpper, isLower, <br>&nbsp;&nbsp;&nbsp;isAlpha, isDigit, isOctDigit, isHexDigit, isAlphaNum, <br>&nbsp;&nbsp;&nbsp;digitToInt, intToDigit, <br>&nbsp;&nbsp;&nbsp;toUpper, toLower, <br>&nbsp;&nbsp;&nbsp;ord, chr,等 <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;ord将字母转换为数字, chr反之. <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>七. 连续函数 <br><br><br>&nbsp;&nbsp;&nbsp;Haskell中整数可以用Int和Integer表示, 实数可以用Float(单精度)和Double(双精度)来表示. 有理数还可用Rational表示, 相当于无限精度的浮点数. <br>&nbsp;&nbsp;&nbsp;Prelude中定义了两个在数学上较基本的函数: <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;1. 常数函数 <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;const &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:: a -&gt; b -&gt; a <br>&nbsp;&nbsp;&nbsp;const k _ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= k <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;2. 单位函数 <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;id &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:: a -&gt; a <br>&nbsp;&nbsp;&nbsp;id &nbsp;&nbsp;&nbsp;x &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= x <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;当函数针对变量的不同取值范围有不同的行为时, 就要用到选择结构. 比如: <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;3. 绝对值函数 <br>&nbsp;&nbsp;&nbsp;abs' x = if x&gt;=0 then x else -x &nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;if ... then ... else ...的结构也可以用"|"(guard)来表达, 上述abs'也可写成: <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;abs' x |x&gt;=0 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= x <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|otherwise = -x &nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;"|"还可用于更多的分支选择, 比如: <br>&nbsp;&nbsp;&nbsp;4. 符号函数 <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;sign x |x&gt;0 &nbsp;= 1 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|x==0 = 0 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|x&lt;0 &nbsp;= -1 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;绝对值函数和符号函数在Prelude中分别为abs和signum, 其定义是用prime函数实现的. <br>&nbsp;&nbsp;&nbsp;下面再举几例子,以熟悉函数的定义方法. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;5. 二次方程求根函数: <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;root (a,b,c) = (x1,x2) where &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x1=(-b+d)/(2*a) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x2=(-b-d)/(2*a) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dd = b*b-4*a*c <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d | dd&gt;=0 =sqrt dd <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| dd&lt;0 &nbsp;=error "No real root" <br>&nbsp;&nbsp;&nbsp;这里where引入一个内嵌的语句块, 在其中定义的函数在外部是看不到的. error函数用来提示出错的信息. <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;6. 求导函数 <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;diff :: (Float-&gt;Float) -&gt; (Float-&gt;Float) <br>&nbsp;&nbsp;&nbsp;diff f = f&#8217; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;where f&#8217; x = (f (x+h) - f x) / h <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;h = 0.0001 <br>&nbsp;&nbsp;为了h的取值可调, 也可以把h包括在参数中: <br>&nbsp;&nbsp;&nbsp;flexDiff h f x = (f(x+h)-f(x))/h <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;把flexDiff h sin 1的取值和cos 1的取值在h=0.001,0.0001,0.00001下比较, 取0.0001的接近程度最好. <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;7. 方程求根 <br>&nbsp;&nbsp;利用牛顿法可定义函数为: <br>&nbsp;&nbsp;zero :: (Float-&gt;Float) -&gt; Float <br>&nbsp;&nbsp;zero f = until goodEnough improve 1.0 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;where improve b = b - f b / diff f b <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;goodEnough b = f b ~= 0.0 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;其中until是Prelude中定义的执行循环的一个函数, 其定义如下: <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;until &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:: (a -&gt; Bool) -&gt; (a -&gt; a) -&gt; a -&gt; a <br>&nbsp;&nbsp;until p f x &nbsp;&nbsp;&nbsp;= if p x then x else until p f (f x) <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;until的作用是看条件p x是否成立, 不成立就用f作用x, 返回值替代原来的x, 直到条件p x成立为止. <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;表示约等于的运算符~=则需要自己定义. <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;8. 求逆函数 <br>&nbsp;&nbsp;利用方程求根的结果就可以求逆: <br>&nbsp;&nbsp;inverse :: (Float-&gt;Float) -&gt; Float -&gt; Float <br>&nbsp;&nbsp;inverse g a = zero f <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;where f x = g x - a &nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>八. 数列和数组 <br><br>&nbsp;&nbsp;&nbsp;数列中元素的类型一致, 元素数目可变; 数组中元素的类型任意, 元素数目固定. 可以说数列和数组对数据的抽象做到了性能与灵活性的恰到好处, 有些语言中只提供一种容器, 元素数目可变, 类型也任意, 其结果是无法满足类型完全的需要, 也将低了运算的效率. <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;数组的使用比较简单, 对于数列来说则大有文章. <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;1. 数列的构造 <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;数列是用[]和(:)构造的, []是一个空的数列, x:xs的含义是元素x附加到数列xs的前面组成一个更长的数列. 比如, 1:[] 等于[1], 2:3:1:[]等于[2,3,1], 运算符(:)是从右向左运算的. 所有的数列都可以看作是从[]开始, 将各元素用(:)附到上面形成的. 在实际编程中有一些简记法可以快速地构造数列. <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;a. 列举法 <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;将数列的元素一一列举, 比如: [1,2,3], ['A','B','d'], [[1,2], [4,5,6]]等等, 数列的类型用"[元素类型]"来表示, 这几个例子的类型依次为: [Int], [Char], [[Int]]. <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;b. 给出变化范围 <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;适用于构造等差数列, 比如: [1..5]等于[1,2,3,4,5], ['a'..'d']等于['a','b','c','d']等于"abcd"因为type String=[Char]. 默认的等差为1, 也可以给出前两个元素指定等差, 比如: [2,4..8]等于[2,4,6,8], [2,4..7]等于[2,4,6], [2.5,4..9.5]等于[2.5,4.0,5.5,7.0,8.5,10.0]. <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;c. 描述法 <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;描述法给出数列中元素取值的范围以及所满足的条件, 与数学中集合的描述法是一样的. 例如: <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;[3*x+2| x&lt;-[3,6,9]] --记号"&lt;-"表示属于,x依次取3,6,9,代入3*x+2,得到数列[11,20,29] <br>&nbsp;&nbsp;&nbsp;[x*x| x&lt;-[1..9], x `rem` 3==1] --给出x的范围,还限定x除3余1 <br>&nbsp;&nbsp;&nbsp;[(x,y)|x&lt;-[1,2,3],y&lt;-[x..3]] --等于 [(1,1),(1,2),(1,3),(2,2),(2,3),(3,3)] <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;2. 从数列中选取元素 <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;head --数列的第一个元素 <br>&nbsp;&nbsp;&nbsp;tail --除去第一个元素剩余的数列 <br>&nbsp;&nbsp;&nbsp;last --最后一个元素 <br>&nbsp;&nbsp;&nbsp;init --除去最后一个元素剩余的数列 <br>&nbsp;&nbsp;&nbsp;take n --数列前n个元素 <br>&nbsp;&nbsp;&nbsp;drop n --除去数列前n个元素剩余的数列 <br>&nbsp;&nbsp;&nbsp;(!!)n &nbsp;--第n个元素, 索引指标从0开始 <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;3. 从数列中筛选元素 <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;filter p &nbsp;&nbsp;&nbsp;--把数列中所有满足条件p的元素取出来组成一个数列 <br>&nbsp;&nbsp;&nbsp;takeWhile p --从第0个元素起, 取满足p的元素, 遇到不满足条件的元素时停止 <br>&nbsp;&nbsp;&nbsp;dropWhile p --从第0个元素起, 去掉满足p的元素, 遇到不满足条件的元素时停止 <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;条件p是一个以数列元素为自变量, 返回值为逻辑值的函数. 比如预定义的even,odd判断奇偶性. <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;4. 常用数列函数 <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;length lst --求数列的元素数目 <br>&nbsp;&nbsp;&nbsp;reverse lst --将数列中元素次序反过来 <br>&nbsp;&nbsp;&nbsp;lst1 ++ lst2 --将两个数列连成一个数列 <br>&nbsp;&nbsp;&nbsp;concat lst &nbsp;--lst是数列的数列,concat将各子数列一个数列 <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;sum lst &nbsp;--对lst中的元素求和 <br>&nbsp;&nbsp;&nbsp;product lst &nbsp;--lst中的元素连乘 <br>&nbsp;&nbsp;&nbsp;elem e lst --判断e是否为lst中的元素 <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;or lst &nbsp;&nbsp;&nbsp;--对类型为[Bool]的lst中所有元素求或 <br>&nbsp;&nbsp;&nbsp;and lst &nbsp;&nbsp;--对类型为[Bool]的lst中所有元素求与 <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;zip <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;5. 高阶函数 <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;map f lst --将lst按照函数f映射得到一个新的数列 <br>&nbsp;&nbsp;&nbsp;map :: (a-&gt;b) -&gt; [a] -&gt; <strong><br>&nbsp;&nbsp;&nbsp;map f [] = [] <br>&nbsp;&nbsp;&nbsp;map f (x:xs) = f x : map f xs <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;foldr,foldl --给定一种运算和一个初值,将初值和数列中所有元素由此运算连起来计算 <br>&nbsp;&nbsp;&nbsp;foldr :: (a-&gt;b-&gt;b) -&gt; b -&gt; [a] -&gt; b <br>&nbsp;&nbsp;&nbsp;foldr op e [] = e <br>&nbsp;&nbsp;&nbsp;foldr op e (x:xs) = x &#8216;op&#8216; foldr op e xs <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;foldl op e [] = e <br>&nbsp;&nbsp;&nbsp;foldl op e (x:xs) = foldl op (e&#8216;op&#8216;x) xs &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;示例: <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;rate &nbsp;&nbsp;:: [Float]-&gt;[Float] &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;rate ls = map (/s) ls where s=sum ls &nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;--(/s)是将运算符"/"偏参化,并括起来当作函数使用 &nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;numDigits [] = 0 <br>&nbsp;&nbsp;&nbsp;numDigits (c:cs) = (if (c &gt;= '0') &amp;&amp; (c &lt;= '9') then 1 else 0) + numDigits cs <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;--典型的以模式匹配和迭代的方法定义数列函数, numDigits 计算字符串中数字的个数 <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>九. 无限数列 <br><br>&nbsp;&nbsp;&nbsp;可以定义无限长的数列, 比如: <br>&nbsp;&nbsp;&nbsp;from :: Int -&gt; [Int] <br>&nbsp;&nbsp;&nbsp;from n = n : from (n+1) <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;from2 = from 2 &nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;from n得到的是一个从n开始的无限长的自然数列, 因为Haskell的lazy evaluate或non-strict的特性, 这个定义并不会引起无限次的计算. 对数列进行操作时, 有的函数要用到数列中所有的元素, 用这样的函数操作无限数列就会使计算机不停地计算, 直到内存或堆栈不够用为止; 而有的函数只用到数列的一部分元素, 这时无限数列就派上用场了. 比如: <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;take 5 from2 =&gt; [2,3,4,5,6] <br>&nbsp;&nbsp;&nbsp;from2(!!)9 &nbsp;&nbsp;=&gt; 11 <br>&nbsp;&nbsp;&nbsp;takeWhile (\x-&gt;x*x&lt;100) from2 =&gt; [2,3,4,5,6,7,8,9] <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;这里用"=&gt;"表示计算结果, (\x-&gt;x*x&lt;100) 是一个匿名函数,即用这样的格式表达了函数的输入与输出却不用给函数起名字另行定义. <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;上述from函数其实可以用给出数列元素变化范围的方法直接得到数列, 比如: [2..], [1,3..] <br>&nbsp;&nbsp;&nbsp;Prelude中定义用于生成无限数列的函数还有: <br>&nbsp;&nbsp;&nbsp;repeat :: a -&gt; [a] <br>&nbsp;&nbsp;&nbsp;repeat x = x : repeat x &nbsp;&nbsp;&nbsp;--对元素a无限重复 <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;iterate :: (a-&gt;a) -&gt; a -&gt; [a] <br>&nbsp;&nbsp;&nbsp;iterate f x = x : iterate f (f x) <br>&nbsp;&nbsp;&nbsp;{- <br>&nbsp;&nbsp;&nbsp;iterate (+1) 3 is [3, 4, 5, 6, 7, 8, . . . <br>&nbsp;&nbsp;&nbsp;iterate (*2) 1 is [1, 2, 4, 8, 16, 32, . . . <br>&nbsp;&nbsp;&nbsp;iterate (/10) 5678 is [5678, 567, 56, 5, 0, 0, . . . <br>&nbsp;&nbsp;&nbsp;-} <br>&nbsp;&nbsp;&nbsp;下面再举几个无限数列的应用的例子: <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;squares = [ x*x | x&lt;-[0..]] <br>&nbsp;&nbsp;&nbsp;isSquare n = elem n (takeWhile (&lt;=n) squares) &nbsp;&nbsp;--判断一个数是否为平方数 <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;fibs = fibgen 1 1 &nbsp;&nbsp;--Fibonacci 数列 <br>&nbsp;&nbsp;&nbsp;fibgen n1 n2 = n1 : fibgen n2 (n1+n2) <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;primes = map head (iterate crossout [2..]) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--用筛法求素数 &nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;where &nbsp;crossout (x:xs)=filter (not.divisible x) xs <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;divisible x y = y `rem` x == 0 <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;prime = sieve [2..] &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;---改进后的素数数列 <br>&nbsp;&nbsp;sieve (x:xs) = x : sieve (filter (\y -&gt;y `rem` x /= 0) xs) <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;有了这些定义后, take 100 prime 就是取前100个素数, prime(!!)1000 就是取第1000个素数, 因为数列的定义是无限的, 数列的计算是有限, 这样就无须为不同的需要定义不同长度的数列, Hakell处理无限数列的能力实在是令人叹服. <br>&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>十. 数列排序 <br><br>&nbsp;&nbsp;&nbsp;&nbsp;Qucik Sort是对数列元素快速排序的一种算法. 初次见到的版本是: <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;qsort1 [] &nbsp;&nbsp;&nbsp;&nbsp;= [] <br>&nbsp;&nbsp;&nbsp;&nbsp;qsort1 (x:xs) = qsort1 elts_lt_x ++ [x] ++ qsort1 elts_greq_x <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;where <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elts_lt_x &nbsp;&nbsp;= [y | y &lt;- xs, y &lt; x] <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elts_greq_x = [y | y &lt;- xs, y &gt;= x] <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;后来又有人将其写为: <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;qsort2 [] = [] <br>&nbsp;&nbsp;&nbsp;&nbsp;qsort2 (x:xs) = qsort2 less ++ [x] ++ qsort2 more <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;where less = filter &nbsp;&nbsp;(&lt;x) &nbsp;xs <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;more = filter &nbsp;&nbsp;(&gt;=x) xs <br>&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;可以明显地看到在比较的过程中对数列扫描的两次, 所以我就想能不能扫描一次就把比x大的和比x小的分开, 这就是我的第一个实现这一想法的程序: <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;qsort3 [] = [] <br>&nbsp;&nbsp;&nbsp;qsort3 (x:xs) = qsort3 xl ++ [x] ++ qsort3 xr <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;where &nbsp;(xl,xr,_) = until f g ([],[],xs) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f (_,_,w)=w==[] <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g (l,g,y:ys) |y&lt;=x =(y:l,g,ys) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|y&gt; x =(l,y:g,ys) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;但这个程序的效率不高, 然后就逐渐改进: <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;qsort4 []=[] <br>&nbsp;&nbsp;&nbsp;qsort4 (x:xs)=qsort4 xl ++ [x] ++ qsort3 xr <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;where (xl,xr)=split (&lt;x) xs <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;split f []=([],[]) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;split f (y:ys) |f y &nbsp;=(y:fst (split f ys),snd (split f ys)) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|True =(fst (split f ys),y:snd (split f ys)) &nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;qsort5 []=[] <br>&nbsp;&nbsp;&nbsp;qsort5 (x:xs)=qsort5 xl ++ [x] ++ qsort5 xr <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;where (xl,xr)=split (&lt;x) xs <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;split f []=([],[]) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;split f (y:ys) |f y &nbsp;=(y:l,r) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|True =(l,y:r) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;where (l,r)=split f ys &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;qsort6 []=[] <br>&nbsp;&nbsp;&nbsp;qsort6 (x:xs)=qsort6 xl ++ [x] ++ qsort6 xr <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;where (xl,xr)=split x xs <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;split _ [] = ([],[]) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;split e (x:xs) | e&gt;=x &nbsp;= (x:l,r) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| e&lt;x &nbsp;&nbsp;= (l,x:r) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;where (l,r) = split e xs <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;qsort7 []=[] <br>&nbsp;&nbsp;&nbsp;qsort7 (x:xs)=qsort7 xl ++ [x] ++ qsort7 xr <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;where (xl,xr)=split x xs <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;split _ [] = ([],[]) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;split e (x:xs) | x&lt;e &nbsp;&nbsp;= (x:l,r) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| True &nbsp;= (l,x:r) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;where (l,r) = split e xs <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;qsort8 []=[] <br>&nbsp;&nbsp;&nbsp;qsort8 (x:xs)=qsort8 xl ++ (x: qsort8 xr) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;where (xl,xr)=split x xs <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;split _ [] = ([],[]) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;split e (x:xs) | x&lt;e &nbsp;&nbsp;= (x:l,r) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| True &nbsp;= (l,x:r) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;where (l,r) = split e xs &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;qsort9 ls &nbsp;= qsort' ls [] <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;where &nbsp;qsort' [] &nbsp;&nbsp;&nbsp;&nbsp;acc = acc <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;qsort' (x:xs) acc = qsort' xl (x:qsort' xr acc) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;where (xl,xr) = split x xs <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;split _ [] = ([],[]) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;split e (x:xs) | x&lt;e &nbsp;&nbsp;= (x:l,r) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| True &nbsp;= (l,x:r) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;where (l,r) = split e xs &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;qsort10 ls = qsort' ls [] <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;where &nbsp;qsort' [] &nbsp;&nbsp;&nbsp;&nbsp;acc = acc <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;qsort' (x:xs) acc = split x xs [] [] acc <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;where split e [] l r acc = qsort' l (e:qsort' r acc) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;split e (x:xs) l r acc | x&lt;e &nbsp;= split e xs (x:l) r acc <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| True = split e xs l (x:r) acc &nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br><br>&nbsp;&nbsp;&nbsp;qsort6 对算法的体现最直接, 最容易理解. 以后每一次改动都是为了提高程序运算的效率. <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;尽管qsort10已经排得很快了, 但 merge sort 可以排得更快. <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;msort:: Ord a =&gt; [a] -&gt; [a] <br>&nbsp;&nbsp;&nbsp;msort = treefold merge [] . map (:[]) <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;merge:: Ord a =&gt; [a] -&gt; [a] -&gt; [a] <br>&nbsp;&nbsp;&nbsp;merge [] b = b <br>&nbsp;&nbsp;&nbsp;merge a [] = a <br>&nbsp;&nbsp;&nbsp;merge (a:a's) (b:b's) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| a &lt; b = a: merge a's (b:b's) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| otherwise = b: merge (a:a's) b's <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;为了进行检验, 在源文件最开始加入: <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;import Random <br>&nbsp;&nbsp;&nbsp;gen=mkStdGen 60 <br>&nbsp;&nbsp;&nbsp;lst=take 100 (randomRs (1,100) gen ::[Int]) &nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;生成一个包含100个随机数的数列lst. &nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>十一. 排列组合 <br><br>&nbsp;&nbsp;&nbsp;排列是把数列的元素的所有可能的排列次序都找出来. <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;perms :: [a] -&gt; [[a]] <br>&nbsp;&nbsp;&nbsp;perms [] = [ [] ] <br>&nbsp;&nbsp;&nbsp;perms (x:xs) = concat (map (between x) (perms xs)) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;where between e [] = [ [e] ] <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;between e (y:ys) = (e:y:ys) : map (y:) (between e ys) &nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;组合是从数列中取若干个元素所有可能的取法. <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;combs :: Int -&gt; [a] -&gt; [[a]] <br>&nbsp;&nbsp;&nbsp;combs 0 xs = [ [] ] <br>&nbsp;&nbsp;&nbsp;combs (n+1) [] = [ ] <br>&nbsp;&nbsp;&nbsp;combs (n+1) (x:xs) = map (x:) (combs n xs) ++ combs (n+1) xs <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;这两个算法都是从书上找的. 以下的程序是我自己写的: <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;maps :: [a-&gt;b]-&gt; a -&gt;<strong> <br>&nbsp;&nbsp;&nbsp;maps [] x = [] <br>&nbsp;&nbsp;&nbsp;maps (f:fs) x = f x : maps fs x <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;split :: Int -&gt; [a] -&gt; ([a],[a]) <br>&nbsp;&nbsp;&nbsp;split 0 ls = ([],ls) <br>&nbsp;&nbsp;&nbsp;split _ [] = ([],[]) <br>&nbsp;&nbsp;&nbsp;split n (x:xs) = (x:xl,xr) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;where (xl,xr)=split (n-1) xs &nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;perm :: [a]-&gt;[[a]] <br>&nbsp;&nbsp;&nbsp;perm [] = [[]] <br>&nbsp;&nbsp;&nbsp;perm lst = concat $ maps fs lst <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;where fs = map f [0..length lst-1] <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f i lst = map (x:) (perm (xl++xs) ) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;where (xl,xr)=split i lst <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(x:xs)=xr <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;maps和map的定义非常类似, 执行类似其他语言中for循环的功能, 而until执行while循环的功能. <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;split将数列分成两个部分, 前半部分包括n个元素, 后半部分为剩余的元素. <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;perm计算的效率虽不太高, 但是 <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;perm [1,2,3] <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;输出的结果为:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] <br>&nbsp;&nbsp;&nbsp;跟自己手工排的结果是一样的. 而 <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;perms [1,2,3] <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;输出的结果为:[[1,2,3],[2,1,3],[2,3,1],[1,3,2],[3,1,2],[3,2,1]] <br>&nbsp;&nbsp;&nbsp;看起来有点乱. <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;后来对perm改进得: <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;sp xl [x] = [(xl,x,[])] &nbsp; <br>&nbsp;&nbsp;&nbsp;sp xl (x:xr) = (xl,x,xr):sp (xl++[x]) xr <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;perm' [x]=[[x]] <br>&nbsp;&nbsp;&nbsp;perm' ls= [x:xs|(xl,x,xr)&lt;-sp [] ls, xs&lt;-perm'(xl++xr) ] &nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;perm'同perm所用的算法和思路是一样的, 但效率已大大提高了. <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>十二. 运算符 <br><br>&nbsp;&nbsp;&nbsp;定义一个运算符, 要说明它的结合性和优先级. <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;infixr 右结合 <br>&nbsp;&nbsp;&nbsp;infixl 左结合 <br>&nbsp;&nbsp;&nbsp;infix &nbsp;不结合 <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;左右都可结合的运算符如 +, * 定义为左结合即可. <br>&nbsp;&nbsp;&nbsp;优先级从0到9, 0最低, 9最高 <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;已定义的运算符有: <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;level 9 . and !! <br>&nbsp;&nbsp;&nbsp;level 8 ^ <br>&nbsp;&nbsp;&nbsp;level 7 *, /, `div`, `rem` and `mod` <br>&nbsp;&nbsp;&nbsp;level 6 + and - <br>&nbsp;&nbsp;&nbsp;level 5 :, ++ and \ <br>&nbsp;&nbsp;&nbsp;level 4 ==, /=,&lt;, &lt;=, &gt;, &gt;=, `elem` and `notElem` <br>&nbsp;&nbsp;&nbsp;level 3 &amp;&amp; <br>&nbsp;&nbsp;&nbsp;level 2 || <br>&nbsp;&nbsp;&nbsp;level 1 (not used in the prelude) <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;举例: &nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;infixr 3 &nbsp;&amp;&amp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;(&amp;&amp;) &nbsp;:: Bool -&gt; Bool -&gt; Bool <br>&nbsp;&nbsp;&nbsp;False &amp;&amp; x &nbsp;&nbsp;= False <br>&nbsp;&nbsp;&nbsp;True &nbsp;&amp;&amp; x &nbsp;&nbsp;= x &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br><br>&nbsp;&nbsp;&nbsp;先定义&amp;&amp;的结合性和优先级, 然后象定义函数一样定义它的功能. <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;运算符用括号括起来, 可以当作函数使用, 比如: <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;map (3+) [1,2,3] <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;map (+3) [1,2,3] <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;函数名用左引号`引起来, 也可以声明为运算符, 比如: <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;fac n = product [1..n] <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;infix 5 !^!, `choose` <br>&nbsp;&nbsp;&nbsp;(!^!), choose :: Int-&gt;Int-&gt;Int &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;n `choose` k = fac n `div` (fac k * fac (n-k)) <br>&nbsp;&nbsp;&nbsp;n !^! k = fac n `div` (fac k * fac (n-k)) &nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;有了这些定义后, <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;choose 5 2 <br>&nbsp;&nbsp;&nbsp;(!^!) &nbsp;5 2 <br>&nbsp;&nbsp;&nbsp;5 &nbsp;&nbsp;!^! &nbsp;2 <br>&nbsp;&nbsp;&nbsp;5 `choose` 2 <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;都给出答案10. &nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>十三. 复合函数 <br><br><br>&nbsp;&nbsp;&nbsp;当一个函数的返回值的类型与另一个函数输入值的类型相同时, 这两个函数就可以复合. 在Haskell中两个函数复合用运算符(.)表示. 举几个例子: <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;f x = (x,2) <br>&nbsp;&nbsp;&nbsp;g (x,y)=(x+y)*(x-y) <br>&nbsp;&nbsp;&nbsp;h = g.f <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;sumaux []=[] <br>&nbsp;&nbsp;&nbsp;sumaux (x:xs)=x+sum xs : sumaux xs <br>&nbsp;&nbsp;&nbsp;sums =reverse.sumaux.reverse <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;函数复合也可以使用匿名函数, 比如: <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;foo=not.(\x-&gt;even x &amp;&amp; x&lt;100) <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;复合运算满足结合律: <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;f . (g . h) = (f . g) . h <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;下面看几个定理: <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;(map f . map g) xs = map (f.g) xs 即 map f . map g = map (f.g) <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;map f (xs++ys) = map f xs ++ map f ys <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;map f . concat = concat . map (map f) <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;map f . (x:) = (f x :) . map f <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;map f xs = foldr g [] ys where g x ys = f x : ys <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;concat xss = fold (++) [] xss <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;length . combs k = ( `choose` k) . length <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;sum (xs++ys) = sum xs + sum ys <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;这些定理都不难理解, 也很容易证明. 你也可以自己证明一些其他的定理. <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>十四. 小结 <br><br>&nbsp;&nbsp;&nbsp;从前面各节的标题来看, Haskell根本就是在搞数学, 不象是在编程. 其实这正体现了Haskell的一个突出的优点, 它对各种数学概念提供了完美的支持, 我说Haskell是数学家的乐园. 数学是一个基础, 我认为把数学做好的编程语言才有潜力把其他事情做好. <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;你在作数学题的时候, 从来也没有过把变量看作是存储器, 给变量赋值的概念, 也没有用到for,while循环语句, 而在Haskell中正好抛弃了这些概念. 用Haskell解决问题的思路与人思路非常接近, 比如相当一部分函数以数学归纳法的方式来定义, 对数据的描述性的定义等. 它掩盖了非常细节的问题, 在更高的层次上处理问题. 这样就提高了编程的效率, 提高了代码的可重用性. <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;Haskell是世界上公认的语法最优美最简洁的一种语言。Haskell语言是写给人看的，而不是写给机器看的。另一方面，这也使得的Haskell的编译技术成为一个难点, 编译后的程序运行速度比C略慢一些。从以人为本的角度来看，程序员的时间比机器的时间更宝贵，所以Haskell是明智的选择。 &nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;以后各节将更多关注于Haskell编程方面的一些特性, 而不仅仅是做算术. Haskell的高效和强大将得到进一步的证实. 由于Haskell主要是在UNIX平台上发展起来的, 专门针对Windows的类库不是很多. 但Haskell的先进性是不容置疑的, 它的发展只是一个时间的问题. <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;我希望你们已经意识到为什么要学函数编程语言, 欢迎来到精彩的Haskell世界--一个更好的地方. <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>十五. 输入输出 <br><br><br>&nbsp;&nbsp;&nbsp;1.输出字符串: putChar, putStr, putStrLn, print, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;输入字符串: getChar, getLine, getContents, interact, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;2.文件操作: readFile, writeFile, appendFile, readIO, readLn &nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>GHC使用指南 <br><br>GHC可以把Haskell程序编译为可执行文件. 操作方法如下: <br><br>1.到http://www.haskell.org/ghc/下载并安装GHC. <br>2.用cmd打开一个命令窗口. <br>3.输入ghc --make file.hs 回车. <br>ghc为编译器, 必要时给出ghc.exe文件所在的目录, file.hs为被编译的文件, 必要时也 <br>给出它的目录. <br>file.hs文件中要包含一个函数名为main的函数,运行可执行文件时这个函数被执行. <br>4.输出文件的文件名为a.out, 将后缀名改为exe, 就可以运行了. <br>5. 使用ghc -o foo file.hs 可以指定输出文件名, 在此例中将得到foo.exe <br>&nbsp;&nbsp;使用ghc -O file.hs &nbsp;&nbsp;&nbsp;&nbsp;可以优化编译输出 <br>6. 当源程序中使用了某个或多个package时,使用 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ghc -package p_name1 -package p_name2 --make file.hs <br>&nbsp;&nbsp;加载所需的包. <br>7. 使用ghc --interactive 可以打开ghci, 在ghci中使用:set -package name 加载包<br><br><br><br>[因为今天看如飞的这篇文章看不了,在百度的缓存页里捞出来,贴此方便自己和大家]</strong></strong><img src ="http://www.cnitblog.com/aliyiyi08/aggbug/54524.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/aliyiyi08/" target="_blank">阿里爸爸</a> 2009-02-13 16:40 <a href="http://www.cnitblog.com/aliyiyi08/archive/2009/02/13/54524.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用php监听标准输入的方式,实现实时调用的方式</title><link>http://www.cnitblog.com/aliyiyi08/archive/2008/12/03/52173.html</link><dc:creator>阿里爸爸</dc:creator><author>阿里爸爸</author><pubDate>Wed, 03 Dec 2008 08:22:00 GMT</pubDate><guid>http://www.cnitblog.com/aliyiyi08/archive/2008/12/03/52173.html</guid><wfw:comment>http://www.cnitblog.com/aliyiyi08/comments/52173.html</wfw:comment><comments>http://www.cnitblog.com/aliyiyi08/archive/2008/12/03/52173.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/aliyiyi08/comments/commentRss/52173.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/aliyiyi08/services/trackbacks/52173.html</trackback:ping><description><![CDATA[<p class=MsoNormal><font face=Arial color=navy size=1><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial"><o:p>&nbsp;</o:p></span></font></p>
<p class=MsoNormal><font face=Arial color=#800080 size=1><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial"><a title=http://cn.php.net/proc_open href="http://cn.php.net/proc_open"><u>http://cn.php.net/proc_open</u></a></span></font><font color=navy size=1><span style="FONT-SIZE: 9pt; COLOR: navy">的以下这一段就是原来我也在玩的一个想法</span></font><font face=Arial color=navy size=1><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">!</span></font><font color=navy size=1><span style="FONT-SIZE: 9pt; COLOR: navy">很有意思</span></font><font face=Arial color=navy size=1><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">!<o:p></o:p></span></font></p>
<p class=MsoNormal><font face=宋体 color=navy size=1><span style="FONT-SIZE: 9pt; COLOR: navy">启动一堆</span></font><font face=Arial color=navy size=1><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">php</span></font><font color=navy size=1><span style="FONT-SIZE: 9pt; COLOR: navy">子进程</span></font><font face=Arial color=navy size=1><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">,</span></font><font color=navy size=1><span style="FONT-SIZE: 9pt; COLOR: navy">这些子进程全在监听标准输入</span></font><font face=Arial color=navy size=1><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">,</span></font><font color=navy size=1><span style="FONT-SIZE: 9pt; COLOR: navy">主进程有任务时再把数据扔给子进程</span></font><font face=Arial color=navy size=1><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">!</span></font><font color=navy size=1><span style="FONT-SIZE: 9pt; COLOR: navy">这样应该比每次都生成一堆子进程来得节省资源</span></font><font face=Arial color=navy size=1><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">!<o:p></o:p></span></font></p>
<p class=MsoNormal><font face=Arial color=navy size=1><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial"><o:p>&nbsp;</o:p></span></font></p>
<p class=MsoNormal><font face=Arial color=navy size=1><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial"><o:p>&nbsp;</o:p></span></font></p>
<p class=MsoNormal><font face=Arial color=navy size=1><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial"><o:p>&nbsp;</o:p></span></font></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0"><strong><strong><font face=Verdana color=black size=2><span lang=EN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana">jaroslaw at pobox dot sk</span></font></strong></strong><font face=Verdana color=black size=2><span lang=EN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana"><br><a title=http://cn.php.net/manual/en/function.proc-open.php#82130#82130 href="http://cn.php.net/manual/en/function.proc-open.php#82130#82130"><u><font color=#0000ff>28-Mar-2008 06:15</font></u></a> <o:p></o:p></span></font></p>
<p class=MsoNormal style="BACKGROUND: #f0f0f0"><span class=html1><font face="Courier New" color=black size=3><span lang=EN style="FONT-SIZE: 12pt; FONT-FAMILY: 'Courier New'">Some functions stops working proc_open() to me.</span></font></span><font face="Courier New" color=black><span lang=EN style="COLOR: black; FONT-FAMILY: 'Courier New'"><br><span class=html1><font color=black>This i made to work for me to communicate between two php scripts:</font></span><br><br></span></font><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">&lt;?php</span></font></span><font face="Courier New" color=#0000bb><span lang=EN style="COLOR: #0000bb; FONT-FAMILY: 'Courier New'"><br><span class=default1><font color=#0000bb>$abs_path </font></span></span></font><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">= </span></font></span><span class=string1><font face="Courier New" color=#dd0000><span lang=EN style="FONT-FAMILY: 'Courier New'">'/var/www/domain/filename.php'</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">;</span></font></span><font face="Courier New" color=#007700><span lang=EN style="COLOR: #007700; FONT-FAMILY: 'Courier New'"><br></span></font><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">$spec </span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">= array(array(</span></font></span><span class=string1><font face="Courier New" color=#dd0000><span lang=EN style="FONT-FAMILY: 'Courier New'">"pipe"</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">, </span></font></span><span class=string1><font face="Courier New" color=#dd0000><span lang=EN style="FONT-FAMILY: 'Courier New'">"r"</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">), array(</span></font></span><span class=string1><font face="Courier New" color=#dd0000><span lang=EN style="FONT-FAMILY: 'Courier New'">"pipe"</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">, </span></font></span><span class=string1><font face="Courier New" color=#dd0000><span lang=EN style="FONT-FAMILY: 'Courier New'">"w"</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">), array(</span></font></span><span class=string1><font face="Courier New" color=#dd0000><span lang=EN style="FONT-FAMILY: 'Courier New'">"pipe"</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">, </span></font></span><span class=string1><font face="Courier New" color=#dd0000><span lang=EN style="FONT-FAMILY: 'Courier New'">"w"</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">)); </span></font></span><font face="Courier New" color=#007700><span lang=EN style="COLOR: #007700; FONT-FAMILY: 'Courier New'"><br></span></font><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">$process </span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">= </span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">proc_open</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">(</span></font></span><span class=string1><font face="Courier New" color=#dd0000><span lang=EN style="FONT-FAMILY: 'Courier New'">'php '</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">.</span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">$abs_path</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">, </span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">$spec</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">, </span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">$pipes</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">, </span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">null</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">, </span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">$_ENV</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">); </span></font></span><font face="Courier New" color=#007700><span lang=EN style="COLOR: #007700; FONT-FAMILY: 'Courier New'"><br><span class=keyword1><font color=#007700>if (</font></span></span></font><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">is_resource</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">(</span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">$process</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">)) {</span></font></span><font face="Courier New" color=#007700><span lang=EN style="COLOR: #007700; FONT-FAMILY: 'Courier New'"><br><span class=keyword1><font color=#007700>&nbsp;&nbsp;&nbsp; </font></span></span></font><span class=comment1><font face="Courier New" color=#ff8000><span lang=EN style="FONT-FAMILY: 'Courier New'"># wait till something happens on other side</span></font></span><font face="Courier New" color=#ff8000><span lang=EN style="COLOR: #ff8000; FONT-FAMILY: 'Courier New'"><br><span class=comment1><font color=#ff8000>&nbsp;&nbsp;&nbsp; </font></span></span></font><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">sleep</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">(</span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">1</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">);</span></font></span><font face="Courier New" color=#007700><span lang=EN style="COLOR: #007700; FONT-FAMILY: 'Courier New'"><br><span class=keyword1><font color=#007700>&nbsp;&nbsp;&nbsp; </font></span></span></font><span class=comment1><font face="Courier New" color=#ff8000><span lang=EN style="FONT-FAMILY: 'Courier New'"># send command</span></font></span><font face="Courier New" color=#ff8000><span lang=EN style="COLOR: #ff8000; FONT-FAMILY: 'Courier New'"><br><span class=comment1><font color=#ff8000>&nbsp;&nbsp;&nbsp; </font></span></span></font><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">fwrite</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">(</span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">$pipes</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">[</span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">0</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">], </span></font></span><span class=string1><font face="Courier New" color=#dd0000><span lang=EN style="FONT-FAMILY: 'Courier New'">'echo $test;'</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">);</span></font></span><font face="Courier New" color=#007700><span lang=EN style="COLOR: #007700; FONT-FAMILY: 'Courier New'"><br><span class=keyword1><font color=#007700>&nbsp;&nbsp;&nbsp; </font></span></span></font><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">fflush</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">(</span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">$pipes</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">[</span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">0</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">]);</span></font></span><font face="Courier New" color=#007700><span lang=EN style="COLOR: #007700; FONT-FAMILY: 'Courier New'"><br><span class=keyword1><font color=#007700>&nbsp;&nbsp;&nbsp; </font></span></span></font><span class=comment1><font face="Courier New" color=#ff8000><span lang=EN style="FONT-FAMILY: 'Courier New'"># wait till something happens on other side</span></font></span><font face="Courier New" color=#ff8000><span lang=EN style="COLOR: #ff8000; FONT-FAMILY: 'Courier New'"><br><span class=comment1><font color=#ff8000>&nbsp;&nbsp;&nbsp; </font></span></span></font><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">usleep</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">(</span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">1000</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">);</span></font></span><font face="Courier New" color=#007700><span lang=EN style="COLOR: #007700; FONT-FAMILY: 'Courier New'"><br><span class=keyword1><font color=#007700>&nbsp;&nbsp;&nbsp; </font></span></span></font><span class=comment1><font face="Courier New" color=#ff8000><span lang=EN style="FONT-FAMILY: 'Courier New'"># read pipe for result</span></font></span><font face="Courier New" color=#ff8000><span lang=EN style="COLOR: #ff8000; FONT-FAMILY: 'Courier New'"><br><span class=comment1><font color=#ff8000>&nbsp;&nbsp;&nbsp; </font></span></span></font><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">echo </span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">fread</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">(</span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">$pipes</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">[</span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">1</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">],</span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">1024</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">).</span></font></span><span class=string1><font face="Courier New" color=#dd0000><span lang=EN style="FONT-FAMILY: 'Courier New'">'&lt;hr&gt;'</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">;</span></font></span><font face="Courier New" color=#007700><span lang=EN style="COLOR: #007700; FONT-FAMILY: 'Courier New'"><br><span class=keyword1><font color=#007700>&nbsp;&nbsp;&nbsp; </font></span></span></font><span class=comment1><font face="Courier New" color=#ff8000><span lang=EN style="FONT-FAMILY: 'Courier New'"># close pipes</span></font></span><font face="Courier New" color=#ff8000><span lang=EN style="COLOR: #ff8000; FONT-FAMILY: 'Courier New'"><br><span class=comment1><font color=#ff8000>&nbsp;&nbsp;&nbsp; </font></span></span></font><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">fclose</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">(</span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">$pipes</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">[</span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">0</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">]);</span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">fclose</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">(</span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">$pipes</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">[</span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">1</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">]);</span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">fclose</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">(</span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">$pipes</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">[</span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">2</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">]);</span></font></span><font face="Courier New" color=#007700><span lang=EN style="COLOR: #007700; FONT-FAMILY: 'Courier New'"><br><span class=keyword1><font color=#007700>&nbsp;&nbsp;&nbsp; </font></span></span></font><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">$return_value </span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">= </span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">proc_close</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">(</span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">$process</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">);</span></font></span><font face="Courier New" color=#007700><span lang=EN style="COLOR: #007700; FONT-FAMILY: 'Courier New'"><br><span class=keyword1><font color=#007700>}</font></span><br></span></font><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">?&gt;</span></font></span><font face="Courier New" color=#0000bb><span lang=EN style="COLOR: #0000bb; FONT-FAMILY: 'Courier New'"><br></span></font><font face="Courier New" color=black><span lang=EN style="COLOR: black; FONT-FAMILY: 'Courier New'"><br><span class=html1><font color=black>filename.php then contains this:</font></span><br><br></span></font><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">&lt;?php</span></font></span><font face="Courier New" color=#0000bb><span lang=EN style="COLOR: #0000bb; FONT-FAMILY: 'Courier New'"><br><span class=default1><font color=#0000bb>$test </font></span></span></font><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">= </span></font></span><span class=string1><font face="Courier New" color=#dd0000><span lang=EN style="FONT-FAMILY: 'Courier New'">'test data generated here&lt;br&gt;'</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">;</span></font></span><font face="Courier New" color=#007700><span lang=EN style="COLOR: #007700; FONT-FAMILY: 'Courier New'"><br><span class=keyword1><font color=#007700>while(</font></span></span></font><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">true</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">) {</span></font></span><font face="Courier New" color=#007700><span lang=EN style="COLOR: #007700; FONT-FAMILY: 'Courier New'"><br><span class=keyword1><font color=#007700>&nbsp;&nbsp;&nbsp; </font></span></span></font><span class=comment1><font face="Courier New" color=#ff8000><span lang=EN style="FONT-FAMILY: 'Courier New'"># read incoming command</span></font></span><font face="Courier New" color=#ff8000><span lang=EN style="COLOR: #ff8000; FONT-FAMILY: 'Courier New'"><br><span class=comment1><font color=#ff8000>&nbsp;&nbsp;&nbsp; </font></span></span></font><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">if(</span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">$fh </span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">= </span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">fopen</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">(</span></font></span><span class=string1><font face="Courier New" color=#dd0000><span lang=EN style="FONT-FAMILY: 'Courier New'">'php://stdin'</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">,</span></font></span><span class=string1><font face="Courier New" color=#dd0000><span lang=EN style="FONT-FAMILY: 'Courier New'">'rb'</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">)) {</span></font></span><font face="Courier New" color=#007700><span lang=EN style="COLOR: #007700; FONT-FAMILY: 'Courier New'"><br><span class=keyword1><font color=#007700>&nbsp;&nbsp; &nbsp; &nbsp;&nbsp; </font></span></span></font><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">$val_in </span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">= </span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">fread</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">(</span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">$fh</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">,</span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">1024</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">);</span></font></span><font face="Courier New" color=#007700><span lang=EN style="COLOR: #007700; FONT-FAMILY: 'Courier New'"><br><span class=keyword1><font color=#007700>&nbsp;&nbsp; &nbsp; &nbsp;&nbsp; </font></span></span></font><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">fclose</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">(</span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">$fh</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">);</span></font></span><font face="Courier New" color=#007700><span lang=EN style="COLOR: #007700; FONT-FAMILY: 'Courier New'"><br><span class=keyword1><font color=#007700>&nbsp;&nbsp;&nbsp; }</font></span><br><span class=keyword1><font color=#007700>&nbsp;&nbsp;&nbsp; </font></span></span></font><span class=comment1><font face="Courier New" color=#ff8000><span lang=EN style="FONT-FAMILY: 'Courier New'"># execute incoming command</span></font></span><font face="Courier New" color=#ff8000><span lang=EN style="COLOR: #ff8000; FONT-FAMILY: 'Courier New'"><br><span class=comment1><font color=#ff8000>&nbsp;&nbsp;&nbsp; </font></span></span></font><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">if(</span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">$val_in</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">)</span></font></span><font face="Courier New" color=#007700><span lang=EN style="COLOR: #007700; FONT-FAMILY: 'Courier New'"><br><span class=keyword1><font color=#007700>&nbsp;&nbsp; &nbsp; &nbsp;&nbsp; eval(</font></span></span></font><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">$val_in</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">);</span></font></span><font face="Courier New" color=#007700><span lang=EN style="COLOR: #007700; FONT-FAMILY: 'Courier New'"><br><span class=keyword1><font color=#007700>&nbsp;&nbsp;&nbsp; </font></span></span></font><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">usleep</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">(</span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">1000</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">);</span></font></span><font face="Courier New" color=#007700><span lang=EN style="COLOR: #007700; FONT-FAMILY: 'Courier New'"><br><span class=keyword1><font color=#007700>&nbsp;&nbsp;&nbsp; </font></span></span></font><span class=comment1><font face="Courier New" color=#ff8000><span lang=EN style="FONT-FAMILY: 'Courier New'"># prevent neverending cycle</span></font></span><font face="Courier New" color=#ff8000><span lang=EN style="COLOR: #ff8000; FONT-FAMILY: 'Courier New'"><br><span class=comment1><font color=#ff8000>&nbsp;&nbsp;&nbsp; </font></span></span></font><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">if(</span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">$tmp_counter</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">++ &gt; </span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">100</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">)</span></font></span><font face="Courier New" color=#007700><span lang=EN style="COLOR: #007700; FONT-FAMILY: 'Courier New'"><br><span class=keyword1><font color=#007700>&nbsp;&nbsp; &nbsp; &nbsp;&nbsp; break;</font></span><br><span class=keyword1><font color=#007700>}</font></span><br></span></font><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">?&gt;</span></font></span><span class=html1><font face="Courier New" color=black><span lang=EN style="FONT-FAMILY: 'Courier New'"> </span></font></span><font face=Verdana color=black size=2><span lang=EN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana"><o:p></o:p></span></font></p>
<p class=MsoNormal><font face=Arial color=navy size=1><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial"><o:p>&nbsp;</o:p></span></font></p><img src ="http://www.cnitblog.com/aliyiyi08/aggbug/52173.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/aliyiyi08/" target="_blank">阿里爸爸</a> 2008-12-03 16:22 <a href="http://www.cnitblog.com/aliyiyi08/archive/2008/12/03/52173.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>记录一下两个php5实现多任务处理的方式</title><link>http://www.cnitblog.com/aliyiyi08/archive/2008/11/21/51763.html</link><dc:creator>阿里爸爸</dc:creator><author>阿里爸爸</author><pubDate>Fri, 21 Nov 2008 04:09:00 GMT</pubDate><guid>http://www.cnitblog.com/aliyiyi08/archive/2008/11/21/51763.html</guid><wfw:comment>http://www.cnitblog.com/aliyiyi08/comments/51763.html</wfw:comment><comments>http://www.cnitblog.com/aliyiyi08/archive/2008/11/21/51763.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/aliyiyi08/comments/commentRss/51763.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/aliyiyi08/services/trackbacks/51763.html</trackback:ping><description><![CDATA[<p>记录一下两个php5实现多任务处理的方式:<br>一、针对proc_open打开管道的方式<br>&lt;?php</p>
<p>echo "Programstartsat".date('h:i:s').".\n";</p>
<p>$timeout=10;</p>
<p>$streams=array();</p>
<p>$handles=array();</p>
<p>/*Firstlaunchaprogramwithadelayofthreeseconds,then</p>
<p>onewhichreturnsafteronlyonesecond.*/</p>
<p>$delay=30;</p>
<p>for($id=0;$id&lt;=10;$id++){</p>
<p>&nbsp;$error_log="".$id.".txt";</p>
<p>&nbsp;$descriptorspec=array(</p>
<p>&nbsp;&nbsp;0=&gt;array("pipe","r"),</p>
<p>&nbsp;&nbsp;1=&gt;array("pipe","w"),</p>
<p>&nbsp;&nbsp;2=&gt;array("file",$error_log,"w")</p>
<p>&nbsp;);</p>
<p>&nbsp;$cmd='sleep '.$delay.';echo "Finishedwithdelayof'.$delay.'".';<br>echo $cmd."--\n";</p>
<p><br>&nbsp;</p>
<p>&nbsp;$handles[$id]=proc_open($cmd,$descriptorspec,$pipes);</p>
<p>&nbsp;$streams[$id]=$pipes[1];</p>
<p>&nbsp;$all_pipes[$id]=$pipes;</p>
<p>&nbsp;$delay-=2;</p>
<p>}</p>
<p>while(count($streams)){</p>
<p>echo "while------\n";<br>&nbsp;$read=$streams;</p>
<p>&nbsp;stream_select($read,$w=null,$e=null,$timeout);</p>
<p>&nbsp;foreach($read as $r){</p>
<p>&nbsp;&nbsp;$id=array_search($r,$streams);</p>
<p>&nbsp;&nbsp;echo stream_get_contents($all_pipes[$id][1]) . "-\n";</p>
<p>&nbsp;&nbsp;if(feof($r)){</p>
<p>&nbsp;&nbsp;&nbsp;fclose($all_pipes[$id][0]);</p>
<p>&nbsp;&nbsp;&nbsp;fclose($all_pipes[$id][1]);</p>
<p>&nbsp;&nbsp;&nbsp;$return_value=proc_close($handles[$id]);<br>echo "--".$return_value."\n";</p>
<p>&nbsp;&nbsp;&nbsp;unset($streams[$id]);</p>
<p>&nbsp;&nbsp;}</p>
<p>&nbsp;}</p>
<p>}</p>
<p>?&gt;</p>
<p><br><br>二、针对stream_socket_client打开socket的方式<br><br>清单1.同时请求多个HTTP页面</p>
<p>＜?php</p>
<p>echo"Programstartsat".date(''h:i:s'').".\n";</p>
<p>$timeout=10;</p>
<p>$result=array();</p>
<p>$sockets=array();</p>
<p>$convenient_read_block=8192;</p>
<p>/*Issueallrequestssimultaneously;there''snoblocking.*/</p>
<p>$delay=15;</p>
<p>$id=0;</p>
<p>while($delay＞0){</p>
<p>$s=stream_socket_client("phaseit.net:80",$errno,</p>
<p>$errstr,$timeout,</p>
<p>STREAM_CLIENT_ASYNC_CONNECT&#124;STREAM_CLIENT_CONNECT);</p>
<p>if($s){</p>
<p>$sockets[$id++]=$s;</p>
<p>$http_message="GET/demonstration/delay?delay=".</p>
<p>$delay."HTTP/1.0\r\nHost:phaseit.net\r\n\r\n";</p>
<p>fwrite($s,$http_message);</p>
<p>}else{</p>
<p>echo"Stream".$id."failedtoopencorrectly.";</p>
<p>}</p>
<p>$delay-=3;</p>
<p>}</p>
<p>while(count($sockets)){</p>
<p>$read=$sockets;</p>
<p>stream_select($read,$w=null,$e=null,$timeout);</p>
<p>if(count($read)){</p>
<p>/*stream_selectgenerallyshuffles$read,soweneedto</p>
<p>computefromwhichsocket(s)we''rereading.*/</p>
<p>foreach($readas$r){</p>
<p>$id=array_search($r,$sockets);</p>
<p>$data=fread($r,$convenient_read_block);</p>
<p>/*Asocketisreadableeitherbecauseithas</p>
<p>datatoread,ORbecauseit''satEOF.*/</p>
<p>if(strlen($data)==0){</p>
<p>echo"Stream".$id."closesat".date(''h:i:s'').".\n";</p>
<p>fclose($r);</p>
<p>unset($sockets[$id]);</p>
<p>}else{</p>
<p>$result[$id].=$data;</p>
<p>}</p>
<p>}</p>
<p>}else{</p>
<p>/*Atime-outmeansthat*all*streamshavefailed</p>
<p>toreceivearesponse.*/</p>
<p>echo"Time-out!\n";</p>
<p>break;</p>
<p>}</p>
<p>}</p>
<p>?＞</p>
<p>如果运行此清单，您将看到如下所示的输出。</p>
<p>清单2.从清单1中的程序获得的典型输出</p>
<p>Programstartsat02:38:50.</p>
<p>Stream4closesat02:38:53.</p>
<p>Stream3closesat02:38:56.</p>
<p>Stream2closesat02:38:59.</p>
<p>Stream1closesat02:39:02.</p>
<p>Stream0closesat02:39:05.<br><br></p><img src ="http://www.cnitblog.com/aliyiyi08/aggbug/51763.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/aliyiyi08/" target="_blank">阿里爸爸</a> 2008-11-21 12:09 <a href="http://www.cnitblog.com/aliyiyi08/archive/2008/11/21/51763.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PHP5新特性: 更加面向对象化的PHP[收藏]</title><link>http://www.cnitblog.com/aliyiyi08/archive/2008/10/14/50157.html</link><dc:creator>阿里爸爸</dc:creator><author>阿里爸爸</author><pubDate>Mon, 13 Oct 2008 17:03:00 GMT</pubDate><guid>http://www.cnitblog.com/aliyiyi08/archive/2008/10/14/50157.html</guid><wfw:comment>http://www.cnitblog.com/aliyiyi08/comments/50157.html</wfw:comment><comments>http://www.cnitblog.com/aliyiyi08/archive/2008/10/14/50157.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/aliyiyi08/comments/commentRss/50157.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/aliyiyi08/services/trackbacks/50157.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: PHP处理对象部分的内核完全重新开发过，提供更多功能的同时也提高了性能。在以前版本的php中，处理对象和处理基本类型（数字，字符串）的方式是一样的。这种方式的缺陷是：当将对象赋值给一个变量时，或者通过参数传递对象时，对象将被完全拷贝一份。在新的版本里，上述操作将传递引用（可以把引用理解成对象的标识符），而非值。<br><br>很多PHP程序员可能甚至没有察觉到老的对象处理方式。事实上，大多数的php应用都可以很好地运行。或者仅仅需要很少的改动。<br><br>私有和受保护成员<br>PHP5引入了私有和受保护成员变量的概念。我们可以用它来定义类成员的可见性。<br>&nbsp;&nbsp;<a href='http://www.cnitblog.com/aliyiyi08/archive/2008/10/14/50157.html'>阅读全文</a><img src ="http://www.cnitblog.com/aliyiyi08/aggbug/50157.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/aliyiyi08/" target="_blank">阿里爸爸</a> 2008-10-14 01:03 <a href="http://www.cnitblog.com/aliyiyi08/archive/2008/10/14/50157.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>口碑营销的秘密[荐转]</title><link>http://www.cnitblog.com/aliyiyi08/archive/2008/07/03/46261.html</link><dc:creator>阿里爸爸</dc:creator><author>阿里爸爸</author><pubDate>Thu, 03 Jul 2008 03:03:00 GMT</pubDate><guid>http://www.cnitblog.com/aliyiyi08/archive/2008/07/03/46261.html</guid><wfw:comment>http://www.cnitblog.com/aliyiyi08/comments/46261.html</wfw:comment><comments>http://www.cnitblog.com/aliyiyi08/archive/2008/07/03/46261.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/aliyiyi08/comments/commentRss/46261.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/aliyiyi08/services/trackbacks/46261.html</trackback:ping><description><![CDATA[<p>宝洁旗下Tremor公司称他们用新方旧法调和，再配以大量秘制调料，揭开了口碑营销的秘密。&nbsp; </p>
<p>　　药剂师们从不指望偶然配成长生不死药，化学家们不会空耗时日炼铅成金，美国宇航局的科学家们也不会徒劳地修补时间机器。 </p>
<p>　　可是，宝洁公司倒是有一帮人耗费四年时光，要锤炼出营销魔法∶自然而然的口碑，也就是大家告诉大家。他们努力的硕果是打造了一支营销劲旅—Tremor公司，该公司声称已经揭开了口碑妙方的秘密。Tremor筛选出25万名青少年志愿者，构成庞大网络，先与同龄人接触最新的产品和理念。不用说，宝洁希望这些志愿者能够和周围的朋友们分享他们的新体验。这一招收效甚大，促使Tremor开始瞄准另一个目标市场—妈妈们—来施展逐渐成长起来的口碑营销。 </p>
<p>　　从这一举措背后可以窥见Tremor创造者的奇思妙想。想想这个名字就知道了∶颤栗（tremor）可能是一阵难以捉摸的情感或思绪，转瞬即逝。在Tremor网站的主页上，总是跳动着令参与者们激动的承诺。 </p>
<p>　　尽管这支劲旅采用的手段充满神秘色彩，宝洁仍然把它奉为营销科学∶旧法新用，通过以技术为后盾的研究加上创新方法来打造客户关系。这并不意味着宝洁愿意把魔法秘密公之于众，但是在接受《市场营销官》杂志采访时，Tremor的首席执行官史蒂夫&#183;诺克斯确实道出了宝洁研发及其成果的许多内幕。他还谈到了现在口碑营销上的知识缺口及其未来发展方向。 </p>
<p>　　&#8220;在Tremor成立的头几年，我们全力去了解口碑在市场上如何发挥作用，&#8221;诺克斯说。而且工作还不止于此。&#8220;口碑营销是一门动态科学而非静态科学。&#8221; </p>
<p>　　有些持怀疑态度的人说，口碑营销绝不可能是科学，硬把口碑同营销扯上关系太牵强。有些批评者认为，大肆夸大口碑营销的作用，妄想产生消费者自发宣传品牌的效果，只可能让营销人面对更大的挑战，因为公众会变得更多疑、更轻视广告宣传。但是宝洁这家全球最大的广告客户，不仅打造了一个口碑营销项目，而且专门成立了一个公司来推动口碑营销，其声势绝对能够淹没怀疑者们的声音。 </p>
<p>　　Tremor的客户数量快速增加。从2001年起，Tremor开始为母公司和其他公司的产品打造广告宣传活动。现在，Tremor为包括梦工厂在内的电影制作公司、可口可乐和丰田等品牌公司制作口碑营销计划。诺克斯说公司80%的品牌宣传活动中都是为其他公司制作的，但是他彬彬有礼地拒绝透露（或确认）任何客户的名称。 </p>
<p>　　除了宝洁以外，还有许多公司也在尝试把口碑营销由理想转变为真正可靠的分销渠道。口碑营销协会于2004年成立，拥有会员150 家。协会于3月份在芝加哥召开了第一次大会。随着Tremor和类似的口碑营销模式不断发展变化，许多大公司都开始密切关注这个新潮流了。 </p>
<p>　　Sprint通讯公司的消费者电子商务总监大卫&#183;迪克凯说∶&#8220;我们没有宝洁走得那么远。我们还不确定口碑营销会朝哪个方向发展。但是我们先要充分了解这个领域，如果它繁荣发展下去，我们就可以随时加以利用。&#8221;　　 </p>
<p>　　口碑营销第一步∶联络员 </p>
<p>　　推动Tremor前进的是25万名青少年，宝洁称他们为&#8220;联络员&#8221;。据诺克斯说，从宝洁的最初研究中得出的主要启示就是，这些&#8220;联络员&#8221;自始至终活跃在产品为市场接受的过程中，因而他们有别于享有&#8220;潮流创新者&#8221;之称的潮流先驱和早期采用者。这些&#8220;潮流创新者&#8221;很了解消费者的需求。虽然他们能够迅速接受新产品和新理念，但是却不一定能构成口碑营销的通途大道；有些潮流先驱有可能成为口碑传播的死胡同，因为他们会把只有自己知道的秘密囤积起来，秘而不宣。 </p>
<p>　　而联络员却不同，即使他们是最后知道秘密的人，也会马上广而告之，告诉身边的人去关注某个新产品、一首酷歌、新电视节目或是新电影。诺克斯认为，这些人有着真正广泛深厚的社会关系网络，而且很愿意同他人交流。 </p>
<p>　　Tremor的广告宣传取得成功，全要靠这些联络员们的动动嘴、动动手指（敲键盘），因此宝洁投入了大量时间、设计了种种方法来识别他们。第一步是把青少年吸引到Tremor网站（Tremor.com）来。申请参加者一旦登陆，就有各种问题要回答（例如，每天你和多少人交谈？买了新产品有什么感想？）。通过这些问题可以发现候选人的八项个性特征。诺克斯告诉我们其中三个最重要的特征∶好奇，善于交际，善于游说。例如，一个典型联络员的密友名单上，一般都会有150~200个一有消息就联系的朋友。 </p>
<p>　　在筛选阶段，大概会有15%的申请者能够通过，这些人被称为Tremor的新成员。而没入选的也会被礼貌地拒绝∶&#8220;谢谢您对Tremor的关注。很抱歉，这次我们的申请人数已满。&#8221;入选者接着将进入&#8220;新兵训练营基地&#8221;接受严格的训练。Tremor运用各种新理念、新机会吸引他们。比如，Tremor曾发出一封电子邮件，邀请入选者为某部电影提供创意，邮件的标题就是&#8220;像好莱坞大腕那样思考&#8221;。 </p>
<p>　　其间，宝洁的员工通过网络在幕后监视他们是否行如其言。简言之，看看这些孩子怎么处理得到的第一口独一份的美味。接下来的就是Tremor的秘方调料了。有8~10%的最初申请者会获得联络员的身份（占目标群体的1%）。即使是更深入Tremor之后，这些正式成员仍然会受到秘密评估，而他们自己浑然不觉。诺克斯坦然承认了这一细节，可是却给Tremor自称的透明度罩上了一层阴影—对任何口碑营销来说，透明度可能都是引起人们争议的焦点吧。 </p>
<p>　　诺克斯深信，这个精英群体极具影响力，他们是营销人忽视的一支劲旅。的确，像交友网站Fraudster这样的品牌公司，还有BuzzMetrics等口碑营销公司正在拼命追踪联络员型消费者，又称市场影响者、传导者或是蜜蜂。但是，其他准备开展口碑营销的营销人担心这些影响者获得的影响力太大。 </p>
<p>　　这种辩论常常使Tremor和 BzzAgent陷于争斗之中。BzzAgent的客户包括家乐氏（Kellogg）, 拉尔夫劳伦（Ralph Lauren）和啤酒商 Anheuser-Busch等。这家公司自己没有健全的筛选志愿者的专利体系，它的做法是有多少人要多少人（到目前为止，它已拥已有8.6万名志愿者）。志愿者们在线申请，在线签约参加试用新产品，与亲朋好友及其他人交流对产品的感想，然后写成日记发送给BzzAgent。 </p>
<p>　　与Tremor不同，BzzAgent认为任何顾客——无论是家庭主妇还是首席执行官——都有可能和别人聊聊最新市场动向，而且大部分人也很乐于通过不同的人获得信息。BzzAgent的首席执行官大卫&#183;巴尔特说∶&#8220;在制造口碑方面，市场影响者并不比一般人做得更好。人人都可以成为我们的宣传员。&#8221;</p>
<p>　　口碑营销第二步∶有价值 </p>
<p>　　一谈到影响者的问题，大部分营销人都认为，如果传递信息的人没有诚意，口碑营销就是无效的。对Tremor来说，在精挑细选了联络员之后，只完成了可信的口碑营销的一半。公司还必须设法精心修饰产品，以便达到口碑营销的最佳效果。 </p>
<p>　　联络员的关系是在线形成的。但大多数情况下，联络员和产品之间的纽带是在线下结成的∶公司通过邮局寄发给他们礼品包，有贴画，DVD或是样品。Tremor和品牌代表们多次召开会议，反复讨论这些礼品包以及整个宣传活动，看看它们是否能体现两个要素∶可倡导与可扩大。 </p>
<p>　　可倡导和可扩大的模式是在理论、心理学知识、宝洁现有数据和Tremor的专利调研几个方面结合的基础上建立起来的。用Tremor的行话来说，当联络员自然地体验某种产品、喜欢上它并和同伴谈论它时，就是在倡导产品。诺克斯解释道∶&#8220;当联络员刚开始接触一个新想法，他首先会问自己∶&#8216;这个想法值得我广而告之吗？&#8217; 有价值才是他们在社会上&#8216;畅通无阻&#8217;的通行证，因而他们所宣传的必须是自己相信的东西。&#8221; </p>
<p>　　Tremor不会草率地下结论说一个联络员是否对某个产品有所反应。诺克斯说∶&#8220;我们有办法找到品牌值得倡导的关键要素，以及联络员倡导这个产品的理由。&#8221; </p>
<p>　　Tremor口碑营销模式中的第二个要素是可扩大，即某个产品信息或使用体验很容易为人所道，产品能自然而然地进入人们闲谈当中。诺克斯说∶&#8220;找到同时具备可倡导和可扩大潜力的口碑理念确非易事。&#8221; </p>
<p>　　因此，Tremor在开展广告活动之前，要先在一组联络员当中进行信息测试，来寻找最有效用的信息。诺克斯解释说∶&#8220;这样做，使我们在产品进入市场前就能够告诉客户说∶&#8216;看见这八个想法了吗？联络员不会谈论它们的。但是这个呢？这个才是他们的热门话题。&#8217;&#8221; </p>
<p>　　Tremor的广告要出色，关键取决于广告活动开始前所掌握的数据量。就是说，只有精心培育，才会产生大量有价值的热门话题。相比之下，BzzAgent的特色则是拥有一套流畅的反馈系统。BzzAgent培训大批&#8220;沟通开拓者&#8221;，要求他们每周仔细审阅4,000~7,000份数量可观的业务报告，并分别对每份报告做出总结。最后，再从中筛选出有用的信息绘制成图表提供给客户。 </p>
<p>　　撇开新品发布前期的精心筹划不谈，诺克斯强调，送给联络员的礼品包当中并没有指定的宣传语或是谈话要点。也就是说，即便Tremor竭尽所能培养联络员对产品的积极反应，这些青少年的行为仍是自发、真实的。可倡导和可放大性的要旨，就是&#8220;一些理由，使孩子们在自然而然的情形下对别人说：&#8216;嗨，我跟你说过某某产品吗？&#8217;&#8221; </p>
<p>　　他挑选的字眼儿&#8220;自然而然的情形&#8221;，在某些营销人听来，可能和&#8220;可扩大&#8221;及&#8220;联络员&#8221;这样的术语并不相称。难道人的情感刺激或体验真的可能如此地&#8220;收放自如&#8221;，像积木一样，可随意地拆分或组合？还堂而皇之地称之为&#8220;自然而然&#8221;？ </p>
<p>　　技术与互联网战略公司EchoDitto首席执行官尼科&#183;梅尔认为，自觉的口头宣传并不是真正的口碑宣传。他的公司创立了在线社区，帮助客户提升知名度，筹措资金。梅尔说∶&#8220;最成功的营销是润物细无声式的，不为人察觉。&#8221; 霍华德&#183;迪安2004年总统大选的网站智囊们备受赞誉，因为他们成功地运用了网志和其他互联网工具，拉拢了大批平民支持者。 </p>
<p>　　诺克斯非常清楚，当新鲜感消失，一切变得程式化，这些联络员就会逐渐感到厌倦。他说∶&#8220;这个问题让我夜不成眠。我必须和这些联络员保持一种关系，鼓励他们一直参与我们的活动。&#8221;为了使这些孩子们乐此不疲，Tremor每年只让联络员参加20次活动。 </p>
<p>　　Tremor还有其他办法防止联络员产生厌倦情绪。开展&#8220;影响力活动&#8221;，即在新品上市前邀请联络员出谋划策，还请他们为现有产品提建议。在Tremor网站上，宝洁用青少年们对产品产生的影响来鼓舞他们的士气。例如，一条大字标题这样写道∶&#8220;你告诉了佳洁士你需要什么样的产品！&#8221;在宣传香草和樱桃味可乐的&#8220;派对炫生活&#8221; 主题活动中，联络员提交了各种广告口号，网站上就打出这样的标题∶&#8220;你帮助可口可乐挑选了一个口号，它被贴在瓶上发送给了近百万人!&#8221; </p>
<p>　　据诺克斯说，这类广告活动本身可提倡和可扩大的程度很高，因为青少年个人与品牌有了直接联系。&#8220;联络员们可以对所有的朋友说∶&#8216;我帮那条广告挑选了音乐。&#8217;这自然而然就把这些孩子们的话题引向广告所涉及的产品了。&#8221; </p>
<p>　　又是那个字眼儿∶自然而然。　　 </p>
<p>　　口碑营销第三步∶看回报 </p>
<p>　　营销人备受印刷品和电视广告低迷回报率所困，不知如何才能贴近对媒体退避三舍的消费者群体。Tremor和其他的口碑营销公司引起了这些营销人的注意。出版商企鹅集团营销副总裁李克&#183;帕斯克切罗，四年前首次试水，委托BzzAgent运用口碑营销宣传推广一本企鹅小说。帕斯克切罗说，他现在正和BzzAgent合作实施第24个口碑营销计划。 </p>
<p>　　当营销人纷纷转向这个新媒介的时候，他们却没有必要的好办法来衡量它的回报。例如，Tremor的口碑营销差不多在联络员的宣传停止后就同时结束了。诺克斯承认说∶&#8220;我能评估口碑从Tremor到联络员的宣传效果，最多还能评估从联络员到他们最亲密的朋友的宣传效果。在此之后，就一无所知了。&#8221; </p>
<p>　　其他口碑营销公司寄希望于先进的口碑营销度量系统。Intelliseek等广告公司开发出各种方法，通过筛读1,100万个网志、信息板和其他网上社区，在线追踪某个品牌的口碑。在线社交网Friendster自诩拥有1,600万会员，声称能够通过追踪会员们在线联系的原因和方法来测量第二级、第三级口碑营销的效果。BuzzMetrics则提供一系列口碑调研和规划服务。他们开发了一项综合服务，用户申请该服务后，每季度都会收到有关某行业各个子市场中（如营养行业）可识别的影响者在线活动的报告和简报。 </p>
<p>　　BuzzMetrics目前向七家最大的食品公司提供该项服务。 </p>
<p>　　BuzzMetrics总裁和首席执行官乔纳森&#183;卡森说∶&#8220;上千万的消费者在庞大数码数据支持的环境里参与口碑营销活动，这为口碑营销的衡量带来了巨大的可能性，也带来了营销人渴求的消费者责任感。&#8221; </p>
<p>　　诺克斯指出，相对而言，Tremor的绝大多数客户更关注的是在采用了口碑营销的领域中销售状况如何，而并不是自己的品牌在网络世界里有多大的反响。销售曲线不断出现高峰，这才是驱使帕斯克切罗与BzzAgent继续合作的原因。 </p>
<p>　　他说∶&#8220;和BzzAgent的很多客户一样，我也不怎么看公司提供的图表。&#8221;帕斯克切罗更感兴趣的不是BzzAgent复杂的反馈过程，而是反馈的结果。举例说明，2001年9月11日企鹅出版集团出版了一本名为《神酷的艺术》（The Art of Shen Ku）的书。帕斯克切罗用尽了印刷品广告等各种促销手段，但是该书出版一年仍是无人问津。于是他决定尝试口碑营销，期望能让这本书&#8220;起死回生&#8221;。六个月之后，销售额翻番。帕斯克切罗说∶&#8220;如果要在印刷品广告和口碑营销之间选择，我会选择后者。&#8221; </p>
<p>　　这些成功的案例促使口碑营销在一个个新领域里遍地开花。Tremor感到对青少年受众采用的方法效果很好，现在决定向更贴近宝洁产品线的&#8220;妈妈&#8221;市场进军。诺克斯说，Tremor需要修改一些筛选问题，例如，把妈妈们&#8220;即时通讯名单中的好朋友数量&#8221;改成&#8220;参加的机构数量&#8221;，而联络员的基本概念则会保持不变。Tremor还在尝试其他的招募方法，以便能够捕获这个对技术不敏感、也不怎么上网的消费群体。 </p>
<p>　　Tremor和客户把目光投向了口碑营销的下一个应用领域—客户保留。诺克斯一直主张，用口碑营销打造品牌忠诚度，要用可倡导和可扩大模式做基础。他问道∶&#8220;是什么原因促使联络员从现在起四个月、或是九个月、或是一年半以内向别人谈论某个产品呢？&#8221;&#8220;我们正和几个客户合作，利用口碑营销来打造会持续多年的长期忠诚度计划。&#8221; </p>
<p>　　他当然不会说出这些客户的名字，但是如果现行模式能透露什么的话，这些客户一定会享受到一项慷慨的服务套餐，包含有Tremor专用词、影响者信条和热议话题预测等口碑营销科学的种种术语。</p>
<p><br>&nbsp;</p><img src ="http://www.cnitblog.com/aliyiyi08/aggbug/46261.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/aliyiyi08/" target="_blank">阿里爸爸</a> 2008-07-03 11:03 <a href="http://www.cnitblog.com/aliyiyi08/archive/2008/07/03/46261.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转一研究mysql全文索引的好文,对于小站做简单搜索特有用</title><link>http://www.cnitblog.com/aliyiyi08/archive/2008/07/02/46242.html</link><dc:creator>阿里爸爸</dc:creator><author>阿里爸爸</author><pubDate>Wed, 02 Jul 2008 11:21:00 GMT</pubDate><guid>http://www.cnitblog.com/aliyiyi08/archive/2008/07/02/46242.html</guid><wfw:comment>http://www.cnitblog.com/aliyiyi08/comments/46242.html</wfw:comment><comments>http://www.cnitblog.com/aliyiyi08/archive/2008/07/02/46242.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/aliyiyi08/comments/commentRss/46242.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/aliyiyi08/services/trackbacks/46242.html</trackback:ping><description><![CDATA[<div>全文索引在 MySQL 中是一个 FULLTEXT 类型索引。FULLTEXT 索引用于 MyISAM 表，可以在 CREATE TABLE 时或之后使用 ALTER TABLE 或 CREATE INDEX 在 CHAR、VARCHAR 或 TEXT 列上创建。对于大的数据库，将数据装载到一个没有 FULLTEXT 索引的表中，然后再使用 ALTER TABLE (或 CREATE INDEX) 创建索引，这将是非常快的。将数据装载到一个已经有 FULLTEXT 索引的表中，将是非常慢的。<br><br>全文搜索通过 MATCH() 函数完成。<br><br><span>mysql</span><span>&gt;</span><span> CREATE TABLE articles (<br></span><span>-&gt;</span><span> id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,<br></span><span>-&gt;</span><span> title VARCHAR(</span><span>200</span><span>),<br></span><span>-&gt;</span><span> body TEXT,<br></span><span>-&gt;</span><span> FULLTEXT (title,body)<br></span><span>-&gt;</span><span> );<br>Query OK, </span><span>0</span><span> rows affected (</span><span>0.00</span><span> sec)<br><br>mysql</span><span>&gt;</span><span> INSERT INTO articles VALUES<br></span><span>-&gt;</span><span> (NULL,</span><span>'</span><span>MySQL Tutorial</span><span>'</span><span>, </span><span>'</span><span>DBMS stands for DataBase ...</span><span>'</span><span>),<br></span><span>-&gt;</span><span> (NULL,</span><span>'</span><span>How To Use MySQL Efficiently</span><span>'</span><span>, </span><span>'</span><span>After you went through a ...</span><span>'</span><span>),<br></span><span>-&gt;</span><span> (NULL,</span><span>'</span><span>Optimising MySQL</span><span>'</span><span>,</span><span>'</span><span>In this tutorial we will show ...</span><span>'</span><span>),<br></span><span>-&gt;</span><span> (NULL,</span><span>'</span><span>1001 MySQL Tricks</span><span>'</span><span>,</span><span>'</span><span>1. Never run mysqld as root. 2. ...</span><span>'</span><span>),<br></span><span>-&gt;</span><span> (NULL,</span><span>'</span><span>MySQL vs. YourSQL</span><span>'</span><span>, </span><span>'</span><span>In the following database comparison ...</span><span>'</span><span>),<br></span><span>-&gt;</span><span> (NULL,</span><span>'</span><span>MySQL Security</span><span>'</span><span>, </span><span>'</span><span>When configured properly, MySQL ...</span><span>'</span><span>);<br>Query OK, </span><span>6</span><span> rows affected (</span><span>0.00</span><span> sec)<br>Records: </span><span>6</span><span> Duplicates: </span><span>0</span><span> Warnings: </span><span>0</span><span><br><br>mysql</span><span>&gt;</span><span> SELECT </span><span>*</span><span> FROM articles<br></span><span>-&gt;</span><span> WHERE MATCH (title,body) AGAINST (</span><span>'</span><span>database</span><span>'</span><span>);<br></span><span>+----+-------------------+------------------------------------------+</span><span><br></span><span>|</span><span> id </span><span>|</span><span> title </span><span>|</span><span> body </span><span>|</span><span><br></span><span>+----+-------------------+------------------------------------------+</span><span><br></span><span>|</span><span> </span><span>5</span><span> </span><span>|</span><span> MySQL vs. YourSQL </span><span>|</span><span> In the following database comparison ... </span><span>|</span><span><br></span><span>|</span><span> </span><span>1</span><span> </span><span>|</span><span> MySQL Tutorial </span><span>|</span><span> DBMS stands </span><span>for</span><span> DataBase ... </span><span>|</span><span><br></span><span>+----+-------------------+------------------------------------------+</span><span><br></span><span>2</span><span> rows </span><span>in</span><span> </span><span>set</span><span> (</span><span>0.00</span><span> sec)<br><br>&nbsp;函数 MATCH() 对照一个文本集(包含在一个 FULLTEXT 索引中的一个或多个列的列集)执行一个自然语言搜索一个字符串。搜索字符串做为 AGAINST() 的参数被给定。搜索以忽略字母大小写的方式执行。对于表中的每个记录行，MATCH() 返回一个相关性值。即，在搜索字符串与记录行在 MATCH() 列表中指定的列的文本之间的相似性尺度。 <br><br>当 MATCH() 被使用在一个 WHERE 子句中时 (参看上面的例子)，返回的记录行被自动地以相关性从高到底的次序排序。相关性值是非负的浮点数字。零相关性意味着不相似。相关性的计算是基于：词在记录行中的数目、在行中唯一词的数目、在集中词的全部数目和包含一个特殊词的文档(记录行)的数目。 <br><br>它也可以执行一个逻辑模式的搜索。这在下面的章节中被描述。 <br><br>前面的例子是函数 MATCH() 使用上的一些基本说明。记录行以相似性递减的顺序返回。 下一个示例显示如何检索一个明确的相似性值。如果即没有 WHERE 也没有 ORDER BY 子句，返回行是不排序的。 <br><br><span>mysql</span><span>&gt;</span><span> SELECT id,MATCH (title,body) AGAINST (</span><span>'</span><span>Tutorial</span><span>'</span><span>) FROM articles;<br></span><span>+----+-----------------------------------------+</span><span><br></span><span>|</span><span> id </span><span>|</span><span> MATCH (title,body) AGAINST (</span><span>'</span><span>Tutorial</span><span>'</span><span>) </span><span>|</span><span><br></span><span>+----+-----------------------------------------+</span><span><br></span><span>|</span><span> </span><span>1</span><span> </span><span>|</span><span> </span><span>0.64840710366884</span><span> </span><span>|</span><span><br></span><span>|</span><span> </span><span>2</span><span> </span><span>|</span><span> </span><span>0</span><span> </span><span>|</span><span><br></span><span>|</span><span> </span><span>3</span><span> </span><span>|</span><span> </span><span>0.66266459031789</span><span> </span><span>|</span><span><br></span><span>|</span><span> </span><span>4</span><span> </span><span>|</span><span> </span><span>0</span><span> </span><span>|</span><span><br></span><span>|</span><span> </span><span>5</span><span> </span><span>|</span><span> </span><span>0</span><span> </span><span>|</span><span><br></span><span>|</span><span> </span><span>6</span><span> </span><span>|</span><span> </span><span>0</span><span> </span><span>|</span><span><br></span><span>+----+-----------------------------------------+</span><span><br></span><span>6</span><span> rows </span><span>in</span><span> </span><span>set</span><span> (</span><span>0.00</span><span> sec) </span><br>下面的示例更复杂一点。查询返回相似性并依然以相似度递减的次序返回记录行。为了完成这个结果，你应该指定 MATCH() 两次。这不会引起附加的开销，因为 MySQL 优化器会注意到两次同样的 MATCH() 调用，并只调用一次全文搜索代码。<br><br><span>mysql</span><span>&gt;</span><span> SELECT id, body, MATCH (title,body) AGAINST<br></span><span>-&gt;</span><span> (</span><span>'</span><span>Security implications of running MySQL as root</span><span>'</span><span>) AS score<br></span><span>-&gt;</span><span> FROM articles WHERE MATCH (title,body) AGAINST<br></span><span>-&gt;</span><span> (</span><span>'</span><span>Security implications of running MySQL as root</span><span>'</span><span>);<br></span><span>+----+-------------------------------------+-----------------+</span><span><br></span><span>|</span><span> id </span><span>|</span><span> body </span><span>|</span><span> score </span><span>|</span><span><br></span><span>+----+-------------------------------------+-----------------+</span><span><br></span><span>|</span><span> </span><span>4</span><span> </span><span>|</span><span> </span><span>1</span><span>. Never run mysqld </span><span>as</span><span> root. </span><span>2</span><span>. ... </span><span>|</span><span> </span><span>1.5055546709332</span><span> </span><span>|</span><span><br></span><span>|</span><span> </span><span>6</span><span> </span><span>|</span><span> When configured properly, MySQL ... </span><span>|</span><span> </span><span>1.31140957288</span><span> </span><span>|</span><span><br></span><span>+----+-------------------------------------+-----------------+</span><span><br></span><span>2</span><span> rows </span><span>in</span><span> </span><span>set</span><span> (</span><span>0.00</span><span> sec)<br><br>MySQL 使用一个非常简单的剖析器来将文本分隔成词。一个&#8220;词&#8221;是由文字、数据、&#8220;'&#8221; 和 &#8220;_&#8221; 组成的任何字符序列。任何在 stopword 列表上出现的，或太短的(3 个字符或更少的)的 &#8220;word&#8221; 将被忽略。 <br><br>在集和查询中的每个合适的词根据其在集与查询中的重要性衡量。这样，一个出现在多个文档中的词将有较低的权重(可能甚至有一个零权重)，因为在这个特定的集中，它有较低的语义值。否则，如果词是较少的，它将得到一个较高的权重。然后，词的权重将被结合用于计算记录行的相似性。 <br><br>这样一个技术工作可很好地工作与大的集(实际上，它会小心地与之谐调)。 对于非常小的表，词分类不足以充份地反应它们的语义值，有时这个模式可能产生奇怪的结果。 <br><br><span>mysql</span><span>&gt;</span><span> SELECT </span><span>*</span><span> FROM articles WHERE MATCH (title,body) AGAINST (</span><span>'</span><span>MySQL</span><span>'</span><span>);<br>Empty </span><span>set</span><span> (</span><span>0.00</span><span> sec)<br><br>在上面的例子中，搜索词 MySQL 却没有得到任何结果，因为这个词在超过一半的记录行中出现。同样的，它被有效地处理为一个 stopword (即，一个零语义值的词)。这是最理想的行为 -- 一个自然语言的查询不应该从一个 1GB 的表中返回每个次行(second row)。 <br><br>匹配表中一半记录行的词很少可能找到相关文档。实际上，它可能会发现许多不相关的文档。我们都知道，当我们在互联网上通过搜索引擎试图搜索某些东西时，这会经常发生。因为这个原因，在这个特殊的数据集中，这样的行被设置一个低的语义值。 <br><br>到 4.0.1 时，MySQL 也可以使用 IN BOOLEAN MODE 修饰语来执行一个逻辑全文搜索。 <br><br><span>mysql</span><span>&gt;</span><span> SELECT </span><span>*</span><span> FROM articles WHERE MATCH (title,body)<br></span><span>-&gt;</span><span> AGAINST (</span><span>'</span><span>+MySQL -YourSQL</span><span>'</span><span> IN BOOLEAN MODE);<br></span><span>+----+------------------------------+-------------------------------------+</span><span><br></span><span>|</span><span> id </span><span>|</span><span> title </span><span>|</span><span> body </span><span>|</span><span><br></span><span>+----+------------------------------+-------------------------------------+</span><span><br></span><span>|</span><span> </span><span>1</span><span> </span><span>|</span><span> MySQL Tutorial </span><span>|</span><span> DBMS stands </span><span>for</span><span> DataBase ... </span><span>|</span><span><br></span><span>|</span><span> </span><span>2</span><span> </span><span>|</span><span> How To Use MySQL Efficiently </span><span>|</span><span> After you went through a ... </span><span>|</span><span><br></span><span>|</span><span> </span><span>3</span><span> </span><span>|</span><span> Optimising MySQL </span><span>|</span><span> In </span><span>this</span><span> tutorial we will show ... </span><span>|</span><span><br></span><span>|</span><span> </span><span>4</span><span> </span><span>|</span><span> </span><span>1001</span><span> MySQL Tricks </span><span>|</span><span> </span><span>1</span><span>. Never run mysqld </span><span>as</span><span> root. </span><span>2</span><span>. ... </span><span>|</span><span><br></span><span>|</span><span> </span><span>6</span><span> </span><span>|</span><span> MySQL Security </span><span>|</span><span> When configured properly, MySQL ... </span><span>|</span><span><br></span><span>+----+------------------------------+-------------------------------------+</span><span> </span><br><br>这个查询返回所有包含词 MySQL 的记录行(注意： 50% 的阈值没有使用)，但是它没有包含词 YourSQL。注意，一个逻辑模式的搜索不会自动地以相似值的降序排序记录行。你可以从上面的结果出看得出来，最高的相似值(包含 MySQL 两次的那个) 最列在最后，而不是第一位。一个逻辑全文搜索即使在没有一个 FULLTEXT 索引的情况下也可以工作，然而它慢些。<br><br>逻辑全文搜索支持下面的操作符：&#8220;+&#8221; 一个领头的加号表示，该词必须出现在每个返回的记录行中，&#8220;-&#8221; 一个领头的减号表示，该词必须不出现在每个返回的记录行中。 <br><br>缺省的 (当既没有加号也没有负号被指定时)词是随意的，但是包含它的记录行将被排列地更高一点。这个模仿没有 IN BOLEAN MODE 修饰词的 MATCH() ... AGAINST() 的行为。 <br><br>&lt; &gt; 这两个操作符用于改变一个词的相似性值的基值。&lt; 操作符减少基值，&gt; 操作符则增加它。参看下面的示例。 <br><br>( ) 圆括号用于对子表达式中的词分组。 <br><br>~一个领头的否定号的作用象一个否定操作符，引起行相似性的词的基值为负的。它对标记一个噪声词很有用。一个包含这样的词的记录将被排列得低一点，但是不会被完全的排除，因为这样可以使用 - 操作符。 <br><br>* 一个星号是截断操作符。不想其它的操作符，它应该被追加到一个词后，不加在前面。 <br><br>" 短语，被包围在双引号"中，只匹配包含这个短语(字面上的，就好像被键入的)的记录行。 <br><br>这里是一些示例： <br><br>apple banana <br><br>找至少包含上面词中的一个的记录行 <br><br>1.+apple +juice ... 两个词均在被包含 <br>2.+apple macintosh ... 包含词 &#8220;apple&#8221;，但是如果同时包含 &#8220;macintosh&#8221;，它的排列将更高一些 <br>3.+apple -macintosh ... 包含 &#8220;apple&#8221; 但不包含 &#8220;macintosh&#8221; <br>4.+apple +(&gt;pie &lt;strudel) ... 包含 &#8220;apple&#8221; 和 &#8220;pie&#8221;，或者包含的是 &#8220;apple&#8221; 和 &#8220;strudel&#8221; (以任何次序)，但是&#8220;apple pie&#8221; 排列得比 &#8220;apple strudel&#8221; 要高一点 <br>5.apple* ... 包含 &#8220;apple&#8221;，&#8220;apples&#8221;，&#8220;applesauce&#8221; 和 &#8220;applet&#8221; <br>6."some words" ... 可以包含 &#8220;some words of wisdom&#8221;，但不是 &#8220;some noise words&#8221; <br><br><strong>全文的限制</strong> <br><br>* MATCH() 函数的所有参数必须是从来自于同一张表的列，同时必须是同一个FULLTEXT 索引中的一部分，除非 MATCH() 是 IN BOOLEAN MODE 的。 <br><br>* MATCH() 列列表必须确切地匹配表的某一 FULLTEXT 索引中定义的列列表，除非 MATCH() 是 IN BOOLEAN MODE 的。 <br><br>* AGAINST() 的参数必须是一个常量字符串。 <br><br><strong>微调 MySQL 全文搜索</strong> <br><br>不幸地，全文搜索仍然只有很少的用户可调参数，虽然增加一些在 TODO 上排列很高。如果你有一个 MySQL 源码发行(查看章节 2.3 安装一个 MySQL 源码发行)，你可以发挥对全文搜索的更多控制。 <br><br>注意，全文搜索为最佳的搜索效果，被仔细地调整了。修改默认值的行为，在大多数情况下，只会使搜索结果更糟。不要修改 MySQL 的源代码，除非你知道你在做什么！ <br><br>* 被索引的词的最小长度由 MySQL 变量 ft_min_word_len 指定。查看章节 4.5.6.4 SHOW VARIABLES。将它改为你所希望的值，并重建你的 FULLTEXT 索引。 (这个变量只从 MySQL 4.0 开始被支持) <br><br>* stopword 列表可以从 ft_stopword_file 变量指定的文件中读取。查看章节 4.5.6.4 SHOW VARIABLES。在修改了 stopword 列表后，重建你的 FULLTEXT 索引。(这个变量只从 MySQL 4.0.10 开始被支持) <br><br>* 50% 阈值选择由所选择的特殊的衡量模式确定。为了禁止它，修改 `myisam/ftdefs.h' 文件中下面的一行： <br><span>#define</span><span> GWS_IN_USE GWS_PROB</span> <br><br>改为：<br><br><span>#define</span><span> GWS_IN_USE GWS_FREQ <br><br>然后重新编译 MySQL。在这种情况下，不需要重建索引。 注意：使用了这个，将严重地减少 MySQL 为 MATCH() 提供足够的相似性值的能力。如果你确实需要搜索这样的公共词，最好使用 IN BOOLEAN MODE 的搜索代替，它不遵守 50% 的阈值。 <br><br>* 有时，搜索引擎维护员希望更改使用于逻辑全文搜索的操作符。这些由变量 ft_boolean_syntax 定义。然而，这个变量是只读的，它的值在 `myisam/ft_static.c' 中被设置。 <br><br>对于这些更改，要求你重建你的 FULLTEXT 索引，对于一个 MyISAM 表，最容易的重建索引文件的方式如下面的语句： <br><span>mysql</span><span>&gt;</span><span> REPAIR TABLE tbl_name QUICK; <br><br><strong>全文搜索 TODO </strong>* 使所有对 FULLTEXT 索引的操作更快 <br><br>* 邻近(Proximity)操作符 <br><br>* 对 "always-index words" 的支持。他们可以是用户希望视为一个词处理的任意字符串，例如 "C++"、"AS/400"、"TCP/IP"，等等 <br><br>* 支持在 MERGE 表中的全文搜索 <br><br>* 对多字节字符的支持 <br><br>* 依照数据的语言建立 stopword 列表 <br><br>* Stemming (当然，依赖于数据的语言) <br><br>* Generic user-suppliable UDF preparser. <br><br>* 使模式更加灵活 (通过为 CREATE/ALTER TABLE 中的 FULLTEXT 增加某些可调整参数)</span></span></span></span></span> </div><img src ="http://www.cnitblog.com/aliyiyi08/aggbug/46242.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/aliyiyi08/" target="_blank">阿里爸爸</a> 2008-07-02 19:21 <a href="http://www.cnitblog.com/aliyiyi08/archive/2008/07/02/46242.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Rose与PowerDesigner：两款建模工具对比分析比较</title><link>http://www.cnitblog.com/aliyiyi08/archive/2007/12/07/37474.html</link><dc:creator>阿里爸爸</dc:creator><author>阿里爸爸</author><pubDate>Fri, 07 Dec 2007 11:03:00 GMT</pubDate><guid>http://www.cnitblog.com/aliyiyi08/archive/2007/12/07/37474.html</guid><wfw:comment>http://www.cnitblog.com/aliyiyi08/comments/37474.html</wfw:comment><comments>http://www.cnitblog.com/aliyiyi08/archive/2007/12/07/37474.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/aliyiyi08/comments/commentRss/37474.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/aliyiyi08/services/trackbacks/37474.html</trackback:ping><description><![CDATA[一、 二者的出身&nbsp;&nbsp;<br>&nbsp; &nbsp; 作为世界最著名的两大CASE工具，Rational Rose和PowerDesigner的名声可谓如雷贯耳。Rose是当时全球最大的CASE工具提供商Rational的拳头产品，UML建模语言就是由Rational公司的三位巨头Booch、Rumbaugh和Jacobson发明的，后来Rational被IBM收购，所以Rose 可谓出身名门，嫁入豪族。而PowerDesigner也有一段好玩的历史，作者王晓昀是一位中国人，在法国SDP软件公司工作时，由于苦觅一个好用的CASE工具未果，干脆自由开搞，整了个AMC*Designor出来，居然一炮打响，在法国卖得个&#8220;巴黎纸贵&#8221;，后来SDP被Powersoft公司收购，同年Sybase这只大黄雀又吃下了Powersoft这只螳螂，所以PowerDesigner也是惊艳出场，星光四射。<br><br>&nbsp;&nbsp;&nbsp; 但两者所走的明星路线却很不相同，Rose出道是时，走的是UML面向对象建模，而后再向数据库建模发展，而PowerDesigner则反其道而行之，它先是一个纯粹的数据库建模工具，后来才向面向对象建模，业务逻辑建模及需求分析建模进军，最终变成&#8220;演视歌三栖&#8221;明星。<br><br>&nbsp;&nbsp;&nbsp; 由于第一印象的影响，所以Rose常常给人的印象还是只是面向对象分析设计的工具，而PowerDesigner给人的印象则还停留在数据库建模工具上。其实，现在的Rose和PowerDesigner都即可以进行数据库建模，也可以进行面向对象建模，只是存在支持上的偏重而已。<br><br>二、 二者区别概述<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Rose和PowerDesigner虽然在项目分析设计领域已经成为被高度聚光的明星，但是在具体使用哪款工具的问题上，不同的公司，不同的人，出于成本，习惯抑或个人喜好，往往有自己的判断。由于笔者在不同的公司中被分别要求使用Rose或PowerDesigner进行分析设计工作，所以对二者有着较为细致的体验。<br><br>&nbsp;&nbsp;&nbsp; &nbsp;Rose走大而全，一站式的策略，它没有将数据库设计和面向对象设计清晰地分开，仅以不同的目录来区分。而PowerDesigner将两者划分到独立的模型文件中，分别对应不同的设计环境，并通过模型之间的转换工具建立各模型的关联。即使对于数据库设计模型，PowerDesigner也需要你选择一个具体的数据库产品及其版本，以便工作环境对具体数据库敏感。所以Rose显得大而化之，而PowerDesigner则比较精细和具体化。Rose的逆向工程，文档输出，代码生成等输入输出功能上表现得比较生硬单调，PowerDesigner在逆向工程，特别是文档输出和代码生成这些功能上提供了精细的控制，让用户拥有高度的自由度。<br>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;Rose在操作体验上存在很多需要改进的地方，Rose偏向于让用户用鼠标进行操作，对键盘操作支持不好。而PowerDesigner在用户体验上得分很高，大部分操作都可以通过键盘完成，在充分熟悉其快捷键的前提下，PowerDesigner将给设计者一种行云流水的感觉，用户交互上更加人性化。此外，Rose往往占用更多的资源，容易异常退出，PowerDesigner则显得轻便稳定。所以，我个人对两者的体验就是&#8220;Rose笨拙，PD利索&#8221;。下面将具体列出Rose和PowerDesigner的一系列的区别，相信大家可以借由这些比较而见微知著，窥斑知豹，以资在选择工具时，提供参考。
<div id=1>三、 模型组织和层次结构上的区别<br>&nbsp;&nbsp;&nbsp; 1、模型组织Rose将数据库模型和对象模型放在一起，在进行数据表模型设计时，没有特性化的东西。而PowerDesigner将两者分开，其模型组织层级关系是：工作空间-&gt;模型类型-&gt;具体语言/数据库的模型-&gt;包-&gt;文件夹-&gt;Diagram-&gt;设计元素。在创建模型文件时，会让你选择模型类型，选择模型类型后，还可以选择模型类型下语言及版本相关的细分类。不同设计模型对应软件工程的不同阶段，如业务模型和需求模型属于项目需求阶段，而对象模型属于概要和详细设计阶段，数据库模型属于详细设计阶段。它们之间虽然有很强的内在联系，但差异性也很明显，硬将两者放到一起，就象把猴子和猩猩关进同一个笼子，为了兼顾和平衡两者之间的考量，其结果是两者都得不到很好的支持。<br>&nbsp;
<p align=center><img style="WIDTH: 526px; HEIGHT: 273px" height=300 alt="" src="http://image.it168.com/cms/2006-12-5/image/11(1).JPG" width=553></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; 图 1新建模型窗口（PD）&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img height=448 alt="" src="http://image.it168.com/cms/2006-12-5/image/06125945.JPG" width=446></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 图 2新建模型窗口（Rose）<br><br>&nbsp;&nbsp;&nbsp;&nbsp; PowerDesinger可以通过模型转换工具进行数据库建模和面向对象模型的相互转换。但Rose不能将对象转换为表，也不能将表转换为对象。<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; 2、工作空间PowerDesigner有工作空间的概念，一个工作空间下可以同时打开多个设计模型文件；而Rose同时仅能打开一个设计文件，如果在设计时，需要参考其他的Rose设计模型，则需要反复关闭现有模型，打开参考模型，显得设计上比较欠考虑。这个问题上两者的差异恰似Eclipse和JBuilder的区别，Eclipse可以同时打开多个工程，而JBuilder只能同时打开一个工程。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、设计界面PowerDesigner的设计界面可以左右上下移动，而Rose只能向右，向下移动，此外。PowerDesigner可以将模型元素放大很多倍，而Rose只能放大到正常倍数，不过Rose的Overview工具可以使用户快速定位到设计区中特定的区域，有点类似于游戏界面中常用的小地图，挺不错；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img style="WIDTH: 577px; HEIGHT: 367px" height=401 alt="" src="http://image.it168.com/cms/2006-12-5/image/06125962.JPG" width=613><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 图 3 Overview工具（Rose）<br>&nbsp;&nbsp; 而在PowerDesigner中，你可以通过F8快捷键查看Diagram的总览图，不过只得通过放大操作定位到定位区域。<br>4&nbsp; 对模型和语言的支持<br>&nbsp; ?&nbsp;对设计模型的支持力度和广度<br>PowerDesigner对对象模型和数据库建模两者的支持力度已经大抵相等，此外，还支持概念模型、业务模型、需求模型、XML模型、信息流模型、自由模型的分析设计。不过对后面这几个模型的支持比较初级，而且在实际的应用中，这些模型用得也比较少，PowerDesigner的突出亮点还是在数据库建模和对象模型的设计上。<br><br>&nbsp; &nbsp;&nbsp;&nbsp; 对于数据库模型，PowerDesigner支持20余种数据库，对于同一数据库的不同版本还提供单独的支持，以便在设计数据库模型时，提供数据库和版本相关的设计。对于面向对象模型，PowerDesigner支持11种主流语言，为对Java 5.0提供单独的支持。<br>Rose基本上可以说是一个对象模型设计工具，对数据库模型的支持相对粗糙，内嵌的只支持Oracle 8数据库，对其他数据库设计的支持需要通过安装插件的方式获得，且对数据库物理存储参数等较细粒度的内容支持得比较粗糙。Rose的对象模型主要支持Java、VC和VB三种语言。<br><br>?&nbsp;对Java语言的支持<br>Rose对Java语言的支持更好，不但为不同版本的JDK提供了支持（不过Rose 2003还不支持JDK 5.0），还为Java具体产品及设计模式（如EJB、Corba、Servlet，GOF设计模式等）提供了内嵌性的支持，这些支持直接反应在Rose的主菜单上。正因为如此，使Rose背上的沉重的历史负担，如EJB和Corba这种语言级的东西是易变且不断更新的，如何在这些具体产品的地位和影响已经降低时，对其作出割舍而又保证版本的兼容性，是摆在设计者面前的难题。<br>PowerDesigner仅提供语言级对象设计的支持，不涉及语言内部的具体产品。其次因为它的设计工作区是和具体的模型类型及语言细分类相关的，而非在主菜单中直接提供支持，所以PowerDesigner在升级时显得更加从容一些。<br>这也是为什么PowerDesigner能以每年一个版本的速度升级，而Rose在2003版本后，新版本还迟迟投入市场的内在原因，否则以IBM的财力，研发能力不至于对市场反应如果缓慢。<br><br>5&nbsp; 输入和输出功能的比较<br>?&nbsp;反向工程<br>从将程序代码转换为设计模型的逆向工程功能上看，Rose更象一个IDE，它会对需要逆向工程操作的程序代码进行深度语义检查，如果存在诸如程序代码引用了类库之外的类，反向工程将失败，而且在报告失败之前，窗口会陷入长时间无响应状态。<br>PowerDesigner仅对需逆向工程的程序代码进行浅度语法检查，这种浅度语法检查不涉及包，类之间的关联，仅对诸如类名是否和类文件名匹配，是否少了&#8220;}&#8221; 等语法性的内容进行检查。即便存在错误，PowerDesigner也允许你忽略错误，继续进行逆向工程操作，这种宽松的限制带来了很大的便利。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img height=127 alt="" src="http://image.it168.com/cms/2006-12-5/image/06125997.JPG" width=384><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 图 4逆向工程失败选择三种选择（PD）<br>&nbsp;&nbsp;&nbsp; 忽略错误后，PowerDesigner会尽量修补错误，例如代码中少了对应的&#8220;}&#8221;，它将会补上，类名和文件名不一致，将忽略类文件名保持类名不变。<br><br>&nbsp;&nbsp;&nbsp; Rose一直宣扬的理念是IDE和设计工程进行双向互通：在Rose中完成模型设计后导出为IDE所用的代码，IDE编码调整后又逆向工程到Rose。理念很美，深具吸引力，但是在实现中，往往很少有开发团队会这样做。一般CASE工具只是在分析设计阶段使用，甚至很大比例的设计师仅把它当成画图的工具。<br>真正进入编码开发阶段后，将加入大量设计时不涉及的类和方法，如果将这些非骨架性的东西Reverse到CASE工具中，反而会使原来清晰的设计变得雾里花，水中月。所以即使编码时，需要对原分析模型进行调整，一般也是手工去调整设计模型，而不是通过逆向工程去同步，毕竟分析设计是骨架性的，而编码是血肉性的，两者有属性上的区别。如果真的需要频繁进行的代码和UML转换，最好使用类似于Together一样的工具，它嵌入到IDE中，使代码和模型转换方便快捷。<br><br>?&nbsp;文档导出功能<br>PowerDesigner对文档导出提供了精细的控制，你不但可以对文档所包含的内容项进行设置，还可以对内容项的格式进行设置。如导出的表结构是否包括名称、数据类型、备注等项目，这些项目在表栏中的宽度占比，颜色，字号等等，不一而足。<br><br>&nbsp;&nbsp;&nbsp; PowerDesinger 12.0 还新增了一个多模型文档整合导出的Milti-Model Report模型，允许你以多个模型作为输入生成为统一文档，实现模型设计按阶段分开，文档又统一整合的目的。<br><br>&nbsp;&nbsp;&nbsp; 由于PowerDesigner文档导出的设置非常精细，所以要设置好一个文档导出模式实非不易。有鉴于此，PowerDesinger提供了三种常用的导出模板，用户也可以自己定义模板。通过模板可以迅速完成设计模型文档的导出工作。<br>而Rose没有导出模板的概念，更不能对导出项和格式进行设置，你只能按Rose的系统内置的方式进行模型文档的发布。<br><br>?&nbsp;代码导出<br>&nbsp;&nbsp;&nbsp;&nbsp; 在导出设计模型的代码时，PowerDesigner提供了精细的控制，不但可以进行对象级别，还可以进行代码级别的控制（如是否要生成字段备注的代码，外键代码在表体代码内声明还是在表体外部声明等），而Rose没有提供代码导出的控制，也只能按其系统内部设置的方式导出代码。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img height=363 alt="" src="http://image.it168.com/cms/2006-12-5/image/06125934.JPG" width=584><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 图 5 数据库模型导出设置（PD）<br>?&nbsp;<br>&nbsp;&nbsp;&nbsp; 生成测试数据<br>&nbsp;&nbsp;&nbsp; PowerDesigner可为数据表生成批量的测试数据，而且你还可以制定测试数据的生成规则。这个功能给初期项目的开发测试带来很大的便利。Rose中没有提供类似的功能。</p>
</div><img src ="http://www.cnitblog.com/aliyiyi08/aggbug/37474.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/aliyiyi08/" target="_blank">阿里爸爸</a> 2007-12-07 19:03 <a href="http://www.cnitblog.com/aliyiyi08/archive/2007/12/07/37474.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql5配置主从库</title><link>http://www.cnitblog.com/aliyiyi08/archive/2007/12/07/37471.html</link><dc:creator>阿里爸爸</dc:creator><author>阿里爸爸</author><pubDate>Fri, 07 Dec 2007 10:59:00 GMT</pubDate><guid>http://www.cnitblog.com/aliyiyi08/archive/2007/12/07/37471.html</guid><wfw:comment>http://www.cnitblog.com/aliyiyi08/comments/37471.html</wfw:comment><comments>http://www.cnitblog.com/aliyiyi08/archive/2007/12/07/37471.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/aliyiyi08/comments/commentRss/37471.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/aliyiyi08/services/trackbacks/37471.html</trackback:ping><description><![CDATA[<p>安装mysql请参考以下文章<br><a href="http://blog.sina.com.cn/s/blog_4fe1599c01000b7t.html">http://blog.sina.com.cn/s/blog_4fe1599c01000b7t.html</a></p>
<p>下面直接记录下配置主从库的操作:<br>1.在主库建立要同步的数据库,建立主库的帐号和修改主库配置<br>首先连接上数据库<br>mysql -S /tmp/mysql-3108.sock<br>创建测试同步的数据库,"create database sinatest;"<br>然后建立负责同步的用户<br>grant all on *.* to <a href='&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#97;&#108;&#105;&#64;&#34;&#37;'>ali@"%</a>" Identified by "abc111";</p>
<p><br>然后修改/data2/ali/mysql3308/my.cnf主库的配置,增加<br>binlog-do-db=sinatest</p>
<p>2.修改从库配置<br>然后修改/data2/ali/mysql3309/my.cnf主库的配置,增加<br>master-host=127.0.0.1<br>master-user=ali<br>master-password=abc111<br>master-port=3308<br>server-id=2<br>master-connect-retry=60<br>replicate-do-db=sinatest<br>log-slave-updates</p>
<p>3.重启mysql<br>/usr/local/mysql/bin/mysqld_safe --defaults-file=/data2/ali/mysql3308/my.cnf&nbsp; --user=root &amp;<br>/usr/local/mysql/bin/mysqld_safe --defaults-file=/data2/ali/mysql3309/my.cnf&nbsp; --user=root &amp;</p>
<p>4.在主库创建数据表,检查从库是否同步正确<br>进入主库,创建数据表<br>mysql -S /tmp/mysql-3108.sock<br>CREATE TABLE if not exists ali_test_00 (<br>&nbsp; `id` int(11) unsigned NOT NULL auto_increment,<br>&nbsp; `my_id` varchar(16) binary NOT NULL default '',<br>&nbsp; `my_title` varchar(96) binary NOT NULL default '',<br>&nbsp; `status` int(11) unsigned NOT NULL default '1',<br>&nbsp; PRIMARY KEY&nbsp; (`id`),<br>&nbsp; KEY `my_id` (`my_id`)<br>) TYPE=MyISAM;</p>
<p>insert into ali_test_00 values (null,32,"aliwwww",1); <br>insert into ali_test_00 values (null,32,"aliwwww",1); </p>
<p>然后检查从库是否有该表和表中是否有数据</p>
<p>SHOW SLAVE STATUS;&nbsp;&nbsp; <br>SHOW MASTER STATUS;&nbsp; <br>slave stop; <br>slave start; </p>
<p>CHANGE MASTER TO <br>MASTER_HOST='127.0.0.1', <br>MASTER_USER='ali', <br>MASTER_PASSWORD='abc111', <br>MASTER_LOG_FILE='mysql-bin.000003', <br>MASTER_LOG_POS=0; <br></p><img src ="http://www.cnitblog.com/aliyiyi08/aggbug/37471.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/aliyiyi08/" target="_blank">阿里爸爸</a> 2007-12-07 18:59 <a href="http://www.cnitblog.com/aliyiyi08/archive/2007/12/07/37471.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PHP中使用XML-RPC构造Web Service简单入门[转]</title><link>http://www.cnitblog.com/aliyiyi08/archive/2007/09/26/34051.html</link><dc:creator>阿里爸爸</dc:creator><author>阿里爸爸</author><pubDate>Wed, 26 Sep 2007 07:23:00 GMT</pubDate><guid>http://www.cnitblog.com/aliyiyi08/archive/2007/09/26/34051.html</guid><wfw:comment>http://www.cnitblog.com/aliyiyi08/comments/34051.html</wfw:comment><comments>http://www.cnitblog.com/aliyiyi08/archive/2007/09/26/34051.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/aliyiyi08/comments/commentRss/34051.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/aliyiyi08/services/trackbacks/34051.html</trackback:ping><description><![CDATA[PHP中使用XML-RPC构造Web Service简单入门<br><br><br>* 作者：heiyeluren<br>* 时间：2006-03-05<br>* 博客：http://blog.csdn.net/heiyeshuwu<br><br><br>[ Web Service介绍 ]<br><br>Web Service就是为了异构系统的通信而产生的，它基本的思想就是使用基于XML的HTTP的远程调用提供<br>一种标准的机制，而省去建立一种新协议的需求。目前进行Web Service通信有两种协议标准，一种是<br>XML-RPC，另外一种是SOAP。XML-RPC比较简单，出现时间比较早，SOAP比较复杂，主要是一些需要稳定<br>、健壮、安全并且复杂交互的时候使用。<br><br>PHP中集成了XML-RPC和SOAP两种协议的访问，都是集中在xmlrpc扩展当中。另外，在PHP的PEAR中，不管<br>是PHP 4还是PHP 5，都已经默认集成了XML-RPC扩展，而且该扩展跟xmlrpc扩展无关，能够独立实现XML<br>-RPC的协议交互，如果没有xmlrpc扩展，建议使用PEAR::XML-RPC扩展。<br><br>我们这里主要是以XML-RPC来简单描述Web Service的交互过程，部分内容来自PHP手册，更详细内容，建<br>议参考手册。<br><br><br>[ 安装xmlrpc扩展 ]<br><br>如果你的系统中没有安装xmlrpc的php扩展，那么请正确安装。<br><br>在Windows平台下，首先把PHP安装目录下的扩展php_xmlrpc.dll放到C:\Windows或者C:\Winnt目录下，<br>(PHP4的扩展在C:\php\extensions目录中，PHP5的扩展在C:\php\ext目录中)，同时在<br>C:\Windows\php.ini或者C:\Winnt\php.ini中把extension=php_xmlrpc.dll前面的分号";"去掉，然后重<br>启Web<nobr><strong class=kgb onmouseover='isShowAds = true;isShowAds2 = true;KeyGate_ads.Move(this,"","%u5FAE%u8F6F%u670D%u52A1%u5668%u7AEF%u4EA7%u54C1%u5927%u5168%uFF0C%u70B9%u51FB%u83B7%u5F97%u3002","20854","服务器","%u670D%u52A1%u5668","http%3A//go.microsoft.com/%3Flinkid%3D6331218", event)' style="FONT-WEIGHT: normal; CURSOR: hand; COLOR: #0000ff; TEXT-DECORATION: underline" onclick='javascript:window.open("http://s2.17luntan.com/ClickPortal/WebClick.aspx?id=20854&amp;k=%u670D%u52A1%u5668&amp;siteid=3dacfa40-5e60-4554-a298-258665cf5820&amp;url=http%3A//www.blog71.cn/user1/suneast009988/archives/2007/19375.html&amp;gourl=http%3A//go.microsoft.com/%3Flinkid%3D6331218&amp;parm=30513650B9599C028C12991B32CB3EE79C68B99C302F3975&amp;alliedsiteid=0");' onmouseout="isShowAds = false;isShowAds2 = false">服务器</strong></nobr>后查看phpinfo()有没有XML-RPC项目就能够确定是否已经正确安装xmlrpc扩展。<br><br>在Unix/Linux平台下，如果没有安装xmlrpc扩展，请在重新编译PHP，在configure的时候请加入 --<br>with-xmlrpc 选项，然后查看phpinfo()看是否正常安装xmlrpc。<br><br>(注意：以下操作都是建立在xmlrpc扩张正常安装前提下，请务必正确安装。)<br><br><br>[ XML-RPC工作原理 ]<br><br>XML-RPC大致就是整个过程就是使用XML来进行通信。首先构造一个RPC <nobr><strong class=kgb onmouseover='isShowAds = false;isShowAds2 = false;isShowGg = true;InTextAds_GgLayer="_u670D_u52A1_u5668_u7AEF";KeyGate_ads.ShowGgAds(this,"_u670D_u52A1_u5668_u7AEF",event)' style="BORDER-RIGHT: 0px; PADDING-RIGHT: 0px; BORDER-TOP: 0px; PADDING-LEFT: 0px; FONT-WEIGHT: normal; PADDING-BOTTOM: 0px; MARGIN: 0px; BORDER-LEFT: 0px; CURSOR: hand; COLOR: #0000ff; PADDING-TOP: 0px; BORDER-BOTTOM: 0px; TEXT-DECORATION: underline" onclick='javascript:window.open("http://pagead2.googlesyndication.com/pagead/iclk?sa=l&amp;ai=BCgoFKAj6RumOJIz-sAKT8ZyfA4OYwC7D0JTPA8CNtwHQ6AwQARgBILHzmwkoFDgAUJTz8eQEYJ250IGQBaAB36m9_gOqAQoyMDAwMDA0ODYysgENd3d3LmJsb2c3MS5jbsgBAdoBQWh0dHA6Ly93d3cuYmxvZzcxLmNuL3VzZXIxL3N1bmVhc3QwMDk5ODgvYXJjaGl2ZXMvMjAwNy8xOTM3NS5odG1sgAIBqQLf5RTzA9-BPqgDAegDlgLoA0s&amp;num=1&amp;adurl=http://www.autolink.com.cn/jhoa.asp&amp;client=ca-pub-9553494669999741");GgKwClickStat("服务器端","www.autolink.com.cn","afc","2000004862");' onmouseout='isShowGg = false;InTextAds_GgLayer="_u670D_u52A1_u5668_u7AEF"'>服务器端</strong></nobr>用来出来从RPC客户端传<br>递过来的使用XML封装的请求，并且把处理结果通过XML的形式返回给RPC客户端，客户端就去分析XML获<br>取自己需要的数据。<br><br>XML-RPC的<nobr><strong class=kgb onmouseover='isShowAds = false;isShowAds2 = false;isShowGg = true;InTextAds_GgLayer="_u670D_u52A1";KeyGate_ads.ShowGgAds(this,"_u670D_u52A1",event)' style="BORDER-RIGHT: 0px; PADDING-RIGHT: 0px; BORDER-TOP: 0px; PADDING-LEFT: 0px; FONT-WEIGHT: normal; PADDING-BOTTOM: 0px; MARGIN: 0px; BORDER-LEFT: 0px; CURSOR: hand; COLOR: #0000ff; PADDING-TOP: 0px; BORDER-BOTTOM: 0px; TEXT-DECORATION: underline" onclick='javascript:window.open("http://pagead2.googlesyndication.com/pagead/iclk?sa=l&amp;ai=BCgoFKAj6RumOJIz-sAKT8ZyfA4OYwC7D0JTPA8CNtwHQ6AwQARgBILHzmwkoFDgAUJTz8eQEYJ250IGQBaAB36m9_gOqAQoyMDAwMDA0ODYysgENd3d3LmJsb2c3MS5jbsgBAdoBQWh0dHA6Ly93d3cuYmxvZzcxLmNuL3VzZXIxL3N1bmVhc3QwMDk5ODgvYXJjaGl2ZXMvMjAwNy8xOTM3NS5odG1sgAIBqQLf5RTzA9-BPqgDAegDlgLoA0s&amp;num=1&amp;adurl=http://www.autolink.com.cn/jhoa.asp&amp;client=ca-pub-9553494669999741");GgKwClickStat("服务","www.autolink.com.cn","afc","2000004862");' onmouseout='isShowGg = false;InTextAds_GgLayer="_u670D_u52A1"'>服务</strong></nobr>器端必须有现成的函数提供给客户端调用，并且客户端提交的请求中的函数和方法必须和<br>服务器端的一致，否则将无法获取所需要的结果。<br><br>下面我进行简单的代码来描述整个过程。<br><br><br>[ XML-RPC实践 ]<br><br>服务器端使用xmlrpc_server_create函数产生一个服务器端，然后把需要需要暴露的RPC调用接口进行注<br>册，接受RPC客户端POST过来的XML数据，然后进行处理，处理结果通过XML的形式显示给客户端。<br><br>代码如下： rpc_server.php<br><br><?php <br>/**<br>* 函数：提供给RPC客户端调用的函数<br>* 参数：<br>* $method 客户端需要调用的函数<br>* $params 客户端需要调用的函数的参数数组<br>* 返回：返回指定调用结果<br>*/<br>function rpc_server_func($method, $params) {<br>$parameter = $params[0];<br>if ($parameter == "get")<br>{ <br>$return = ''This data by get method''; <br>}<br>else<br>{<br>$return = ''Not specify method or params'';<br>} <br>return $return; <br>} <br><br>//产生一个XML-RPC的服务器端<br>$xmlrpc_server = xmlrpc_server_create(); <br><br>//注册一个服务器端调用的方法rpc_server，实际指向的是rpc_server_func函数<br>xmlrpc_server_register_method($xmlrpc_server, "rpc_server", "rpc_server_func"); <br><br>//接受客户端POST过来的XML数据<br>$request = $HTTP_RAW_POST_DATA;<br><br>//执行调用客户端的XML请求后获取执行结果<br>$xmlrpc_response = xmlrpc_server_call_method($xmlrpc_server, $request, null); <br><br>//把函数处理后的结果XML进行输出<br>header(''Content-Type: text/xml''); <br>echo $xmlrpc_response; <br><br>//销毁XML-RPC服务器端资源<br>xmlrpc_server_destroy($xmlrpc_server); <br>?&gt;<br><br>服务器端构造好了，那么再构造我们的RPC客户端。客户端大致通过Socket访问XML-RPC服务器端的80端<br>口，然后把需要调用的RPC接口封装到XML里，通过POST请求提交给RPC服务器端，最后获取服务器端返回<br>结果。<br><br>代码如下：rpc_client.php<br><a href="http://www.shwujiao.com.cn/">上海保洁</a>:http://www.shwujiao.com.cn<br><?php<br>/**<br>* 函数：提供给客户端进行连接XML-RPC服务器端的函数<br>* 参数：<br>* $host 需要连接的主机<br>* $port 连接主机的端口<br>* $rpc_server XML-RPC服务器端文件<br>* $request 封装的XML请求信息<br>* 返回：连接成功成功返回由服务器端返回的XML信息，失败返回false<br>*/<br>function rpc_client_call($host, $port, $rpc_server, $request) { <br><br>//打开指定的服务器端<br>$fp = fsockopen($host, $port); <br><br>//构造需要进行通信的XML-RPC服务器端的查询POST请求信息<br>$query = "POST $rpc_server HTTP/1.0\nUser_Agent: XML-RPC Client\nHost: <br>".$host."\nContent-Type: text/xml\nContent-Length: ".strlen($request)."\n\n".$request."\n"; <br><br>//把构造好的HTTP协议发送给服务器，失败返回false<br>if (!fputs($fp, $query, strlen($query))) <br>{ <br>$errstr = "Write error"; <br>return false; <br>} <br><br>//获取从服务器端返回的所有信息，包括HTTP头和XML信息<br>$contents = ''''; <br>while (!feof($fp))<br>{ <br>$contents .= fgets($fp); <br>} <br><br>//关闭连接资源后返回获取的内容<br>fclose($fp); <br>return $contents; <br>} <br><br>//构造连接RPC服务器端的信息<br>$host = ''localhost''; <br>$port = 80; <br>$rpc_server = ''/~heiyeluren/rpc_server.php'';<br><a href="http://www.shwujiao.com.cn/">上海保洁公司</a>:http://www.shwujiao.com.cn<br>//把需要发送的XML请求进行编码成XML，需要调用的方法是rpc_server，参数是get<br>$request = xmlrpc_encode_request(''rpc_server'', ''get''); <br><br>//调用rpc_client_call函数把所有请求发送给XML-RPC服务器端后获取信息<br>$response = rpc_client_call($host, $port, $rpc_server, $request); <br><br>//分析从服务器端返回的XML，去掉HTTP头信息，并且把XML转为PHP能识别的字符串<br>$split = ''<?xml version="1.0" encoding="iso-8859-1"?>'';<br>$xml = explode($split, $response);<br>$xml = $split . array_pop($xml);<br>$response = xmlrpc_decode($xml);<br><br>//输出从RPC服务器端获取的信息<br>print_r($response);<br><br>?&gt; <br><br><br>大致我们上面的例子就是提交一个叫做rpc_server的方法过去，参数是get，然后获取服务器端的返回，<br>服务器端返回的XML数据是：<br><br><string>This data by get method</string><br></value></param>
</params>
</methodresponse><br><br>那么我们再通过xmlrpc_decode函数把这个XML编码为PHP的字符串，我们就能够随意处理了，整个Web <br>Service交互完成。<br><br><br>[ 结束语 ]<br><br>不管是XML-RPC也好，SOAP也罢，只要能够让我们稳定、安全的进行远程过程的调用，完成我们的项目，<br>那么就算整个Web Service就是成功的。另外，如果可以的话，也可以尝试使用PEAR中的XML-RPC来实现<br>上面类似的操作，说不定会更简单，更适合你使用。<br><br>简单的使用XML-RPC进行Web Service交互就完成了，部分代码参考PHP手册，想获取详细信息建议参考手<br>册，如果文章有不正确，请指正。<img src ="http://www.cnitblog.com/aliyiyi08/aggbug/34051.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/aliyiyi08/" target="_blank">阿里爸爸</a> 2007-09-26 15:23 <a href="http://www.cnitblog.com/aliyiyi08/archive/2007/09/26/34051.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>tcpdump 截取数据包</title><link>http://www.cnitblog.com/aliyiyi08/archive/2007/09/15/33464.html</link><dc:creator>阿里爸爸</dc:creator><author>阿里爸爸</author><pubDate>Sat, 15 Sep 2007 09:10:00 GMT</pubDate><guid>http://www.cnitblog.com/aliyiyi08/archive/2007/09/15/33464.html</guid><wfw:comment>http://www.cnitblog.com/aliyiyi08/comments/33464.html</wfw:comment><comments>http://www.cnitblog.com/aliyiyi08/archive/2007/09/15/33464.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/aliyiyi08/comments/commentRss/33464.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/aliyiyi08/services/trackbacks/33464.html</trackback:ping><description><![CDATA[应用服务端口是3333，发现有一端数据处理有问题，想确认网络数据的传输次序，就用tcpdump了，<br>tcpdump -w data.dmp host server_ip and port 3333<br><br>截下来用omnipeek分析，发现大的数据包数据长度总是slice length。查了一下才发现tcpdump缺省只截取一定长度的数据包。<br>-s 选项可以解决这个问题. -s 0 是指定保存完整的包，如果指定一个非零的数值，那么将会保存这个数值的长度。<br><br>tcpdump -w data.dmp -s 0 host server_ip and port 3333<img src ="http://www.cnitblog.com/aliyiyi08/aggbug/33464.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/aliyiyi08/" target="_blank">阿里爸爸</a> 2007-09-15 17:10 <a href="http://www.cnitblog.com/aliyiyi08/archive/2007/09/15/33464.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux下 不常用进程信息查看命令</title><link>http://www.cnitblog.com/aliyiyi08/archive/2007/09/15/33463.html</link><dc:creator>阿里爸爸</dc:creator><author>阿里爸爸</author><pubDate>Sat, 15 Sep 2007 09:09:00 GMT</pubDate><guid>http://www.cnitblog.com/aliyiyi08/archive/2007/09/15/33463.html</guid><wfw:comment>http://www.cnitblog.com/aliyiyi08/comments/33463.html</wfw:comment><comments>http://www.cnitblog.com/aliyiyi08/archive/2007/09/15/33463.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/aliyiyi08/comments/commentRss/33463.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/aliyiyi08/services/trackbacks/33463.html</trackback:ping><description><![CDATA[所打开的文件<br>获取方法1：<br># ls -l /proc/$PID/fd/<br><br>获取方法2：<br># lsof -p $PID<br><br>内存分配表<br>获取方法：<br># lcat /proc/$PID/maps<br><br>堆栈<br>获取方法：<br># pstack $PID<br><br>所发出的系统调用<br>获取方法：<br># strace -p $PID<br><br>所发出的库函数调用<br>获取方法：<br># ltrace -p $PID<br><br>进程继承关系<br>获取方法：<br>ps -eo user,pid,ppid,%cpu,%mem,vsz,rss,tty,stat,start,time,wchan,command --forest<br><br>运行时dumpcore<br>获取方法：<br># gcore $PID<br><img src ="http://www.cnitblog.com/aliyiyi08/aggbug/33463.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/aliyiyi08/" target="_blank">阿里爸爸</a> 2007-09-15 17:09 <a href="http://www.cnitblog.com/aliyiyi08/archive/2007/09/15/33463.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>web2.0网站如何设计UE/UI</title><link>http://www.cnitblog.com/aliyiyi08/archive/2007/08/28/32512.html</link><dc:creator>阿里爸爸</dc:creator><author>阿里爸爸</author><pubDate>Mon, 27 Aug 2007 18:49:00 GMT</pubDate><guid>http://www.cnitblog.com/aliyiyi08/archive/2007/08/28/32512.html</guid><wfw:comment>http://www.cnitblog.com/aliyiyi08/comments/32512.html</wfw:comment><comments>http://www.cnitblog.com/aliyiyi08/archive/2007/08/28/32512.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/aliyiyi08/comments/commentRss/32512.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/aliyiyi08/services/trackbacks/32512.html</trackback:ping><description><![CDATA[<p>web2.0网站如何设计UE/UI <br>这些天总有些负责网站界面的设计人员找我咨询，怎么做用户访谈才感觉不像聊天，怎么样让用户参与到设计中来，得到更多的意见而不是简单的一句还可以或不错之类的评语，原型的改进花费时间总是太长怎么能缩短，设计的时候没什么把握，诸如此类的问题。。我想对此在msn上做的指导大量重复，需要在这里做一些入门级的解释了。。</p>
<p>Q1:首先，用户为中心的设计环节包括哪些活动？<br>答案：设计--〉原型--〉测试--〉再改进设计--〉原型--〉测试 --〉。。。看出来了吧，这是个迭代过程。。。你的设计没有把握，那么使用测试来验证，发现问题，再快速改进。。</p>
<p>Q2:这样的迭代，什么时候中止，递交给开发呢？<br>答案：没有完美的设计的，递交给开发前，保证你的设计没有一级易用性问题。否则上线的产品用户骂声一片。。但是还有一些小的bug好改的都改掉，不能改的下一版本吧。什么时候中止，那要看口袋里的钱，还剩的时间和人力等资源限制咯。看得出来吧，这里面肯定有很多的Tradeoff（妥协）的，做UE的和做开发的一定要搞好关系哦，这样，可以多改掉几个bug </p>
<p>Q3: 用户什么时候接触？他们最理想的介入时期是什么时候？<br>答案：作为UE/UI要记得，永远和用户保持紧密联系。不管项目进展到什么时刻，你都要思考，用户要干嘛，喜欢怎么干，这样的设计他们会不会觉得舒服流畅。要验证答案，那就赶紧去接触他们吧。</p>
<p>Q4：我知道在开发前期的设计工作，要做一些用户研究，问卷调查，用户访谈之类的，到底要研究些什么，出来些什么结果呢？<br>答案：在设计之前，你要明白的一件事情就是，为谁而设计。围绕这个谁，你需要回答：</p>
<p>1.他们的基本特征，比如年龄段分布，性别特征，家庭，行业，电脑经验，上网经验，收入阶层等等。。</p>
<p>2.你需要找到他们中间最典型的人群，需求最强烈的人群是怎样的一个形象。这个在UCD里面叫做角色提炼(Personas setting)。也许为10万个人设计，你什么都靠猜的，没可能满足10万个人的要求。但是你为这一个或者两个角色来设计吧，他们最典型，他们的需求满足好了，你就离成功不远了。</p>
<p>3.用户在使用你的网站到底舒服不，流畅不，主要是看他的操作习惯，行为方式和网站设计的是不是很匹配。你要研究什么，根本就是典型用户的操作习惯，行为方式，最后获得一个用户模型(User Model)。网站要创造出的用户体验，不是用户对你说，我要怎么样怎么样的，也不是设计者自己在那里想，嗯，这么设计比较容易，两步就能完成，一定很好。。两步就一定好么，你的用户很可能就习惯了走某固定的三步来完成，你的两步，很可能让他们满腹狐疑，忧心忡忡了。。</p>
<p>ok,现在你知道了，出来的结果是什么，用户群特点，典型用户的形象即角色(Persona),然后就是用户模型。。</p>
<p>Q5：知道研究什么呢，该怎么开展研究呢？<br>答案：用户研究的方法可以很灵活的，常常见到类似聊天一样的，一个问，一个来答，叫用户访谈。还有一些方法，比如问卷调查，焦点小组，数据分析等等。。根据不用的研究内容，还有时间，技术，成本来决定。。<br>至于怎么研究，一个前提就是，目的性明确。不管你做访谈也好，问卷也好，漫无目的，只会让你对这些形式的有效性产生怀疑。。比如问卷，设计多少个问题，设计哪些问题，你要规划好了。。问卷设计哪几个纬度，每个纬度需要几个问题可以得到结果，什么样的量表合适。。</p>
<p>Q6：项目已经进入开发了，做用户研究来不及了啊。<br>答案：嗬嗬，来得及来得及，只是要让你的第一批用户多多忍耐了。UCD是迭代过程嘛，已经开发了，你就研究着，准备对第一版本的产品进行测试评估和改进吧。。慢慢来，一个一个的改。</p>
<p>Q7：你所在的team(UI)是怎样跟一个团队(产品策划，程序员等)沟通合作的，又怎样更好的融入到产品的整个过程中的呢？<br>答：经历过很多种不同的Team,他们处在不同的位置上，常常承担的责任也不一样，因此作事情的方式也完全不一样了。UE在整个产品开发过程中的位置把握准确，相当的重要。关于位置怎么最合适，日后我再专门阐述。目前接触到较理想的工作方式，如何沟通合作，是和产品设计决策者一起工作，将你获得的研究或者评估结果，直接变成设计或建议，传递给产品设计决策者，判断问题的重要性，有哪几种可行的方案，如何改最合适，你们一起探讨。常常，在研究方案是否可行时，你需要跟程序员沟通，提出你的想法，询问是否能实现，实现难度，大致的时间。这样能够保证你方案的可快速执行。这存在很多的沟通技巧。最好的情况就是你， UE人员，要把以用户为中心的思想灌输给他，让他进入你设定的情景，站在你的立场去考虑问题，这样程序员会增加工作的责任感，他甚至可能发挥主观能动性，帮你想到更好的实现方法。。。这样的一种氛围中，整个的团队就像一根绳子往一个方向使劲，都全力想让产品做好，想想，那样的工作多让人充满激情吧。</p>
<p>这只是其中一部分，在你和产品决策者沟通时，甚至还有市场部门的同事参与，一方面，你要代表用户的利益，另一方面，你要试图了解公司希望创造的商业价值，从中找到一个平衡点。这种设计才最容易获得上层的支持，以最快的速度推行下去。可以看看偶翻译的用户体验设计师的职责那片文章。</p>
<p>Q8：界面(原型+设计)，交互(包括js)，测试等都由一个人做吗？如果不是的话，那么对用户体验的研究又怎样能证明自己的作用？<br>答：这些工作我都做过，一个人做这种情况其实非常的常见。但是一个人，并不理想，最好，还是培养一个团队。而且有些工作，一个人做不了，必须有协助。这主要看公司的不同状况了。如果是一个人，评估用户体验研究的效果，就可以对你的成绩进行评判了。<br>如何是一个Team,是好几个人协作完成，如何证明每一部份的工作成效?iceshow是问这个吧。<br>老实说，我对这个问题没有把握。因为UE的日常工作就是设计-原型-测试评估，是完整的流程，对工作的评估，只能考核整个流程下来的结果。单独一部份工作做得如何，我还没有研究过。。</p>
<p>白鸦在blog里面特意的提到我这个系列，标题的web2.0，应该改掉。我倒不想，出于UE知识的普及，这样的标题适合目标用户群-- web2.0用户体验实践者,可以抓住他们的眼球。这一群能人帮助只是迅速传播普及。另外在用户体验设计方面，之前3篇完全适用web2.0..</p>
<p>今天说说web2.0和1.0在用户体验方面的不同之处，但是，这只是我浅薄的理解，希望可以得到各位资深的实践者们的提点。其实以我的积累，应该是远远不够的。</p>
<p>用户体验包括四个因素：品牌，功能，usability和内容。现在大家常常误认为：用户体验=易用性（或者可用性/usability）。其实不然。</p>
<p>web2.0最不缺的是功能，每一个创业者都是认为自己发现了用户的某一种需求，而市场上没有任何产品可以去满足，因此觉得自己可以开发出具备某些功能的2.0产品。。这方面，不多说什么，只是说一点，细分用户群，必定会成为竞争趋势。。仔细研究了用户群，深入挖掘他们的特点和需求，在最开始就做到高的粘着力，是否更好了？</p>
<p>在品牌上，很多人对这一点的忽略，导致了用户体验的整个盲目。现在我问你，sina,sohu和网易,有什么差别？普通用户可不清楚，都是门户网站。。好像网易开发游戏，sohu还开发了搜索，sina,好像经常做赞助活动。。这就是品牌么？现在问你Nokia和Moto有什么差别？你能回答吧。。品牌和用户体验的关系，是互相影响的。。你用Nokia,发现它简单朴实，好用，还抗摔。就是样子有点。。那么nokia的品牌形象排除了价格因素后就是这样，简单朴实好用机身抗摔，样子一般了点。。现在如果有人推荐你，某个品牌，它是如何的有趣个性时尚，然后你一使用，发现：切，哪点特别的，跟 Nokia差不多，还不如买Nokia。。失败了吧，因为品牌没有独特的个性，带来的用户体验期望值和现实落差，将会让你的目标用户转头而去。。网易相册和其他的相册，有什么差别。。和flikr反正是大大的不同。。</p>
<p>在内容上面。虽然说，web2.0是用户参与，很多网站的内容都是用户来建设。。但是在用户参与之前，你要想，用户为什么要参与。。只因为我没有日记本，你给我一个日记本，我就一定要用你给的这个来写么？用户是否参与，参与程度多少，这些都取决于你现在的内容。。你现在是空的。。鬼知道你这个网站是不是快黄了，我干吗要在这写啊。。你现在很多，但是都是转载的，没几个用户在写。。骗我么？我写了根本就没有几个人看。。好，现在你的内容很多，用户也开始很多了。。但是，天啦，这些内容也未免太广告性了吧。。。或者，用户想，我写了你会不会到处转载啊。。你们这的用户素质怎么样啊。。。而且，形式上，你的品牌，说一点关联性，品牌你标语说时尚个性，网站样子看上去土拉吧唧的，马上用户的信任度就降低了。。</p>
<p>Usability,网站当然要好用了，很迅速的完成内容提交，或者找到目标内容，这是当然的。。但是不是随便一个你觉得交互方式很流畅的网站，都可以完全拷贝复制。幸亏世界如此丰富，不然我们做交互设计的，就跟做数学公式一样了，多没意思，一个套路。。不同的用户，习惯不同的交互方式，他们喜欢什么样子的，这便是用户研究里面要做的一部分工作。。这样的研究结果，帮助你的交互设计具备了自己的个性。。usability测试的结果，是要知道你的目标用户群的看法，发现的问题，而不是科学研究，三步如何变成两步。<br>&nbsp;<br></p><img src ="http://www.cnitblog.com/aliyiyi08/aggbug/32512.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/aliyiyi08/" target="_blank">阿里爸爸</a> 2007-08-28 02:49 <a href="http://www.cnitblog.com/aliyiyi08/archive/2007/08/28/32512.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>给你的网站加速 Squid-Linux下的使用详解</title><link>http://www.cnitblog.com/aliyiyi08/archive/2007/07/20/30286.html</link><dc:creator>阿里爸爸</dc:creator><author>阿里爸爸</author><pubDate>Fri, 20 Jul 2007 03:21:00 GMT</pubDate><guid>http://www.cnitblog.com/aliyiyi08/archive/2007/07/20/30286.html</guid><wfw:comment>http://www.cnitblog.com/aliyiyi08/comments/30286.html</wfw:comment><comments>http://www.cnitblog.com/aliyiyi08/archive/2007/07/20/30286.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnitblog.com/aliyiyi08/comments/commentRss/30286.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/aliyiyi08/services/trackbacks/30286.html</trackback:ping><description><![CDATA[<p>&nbsp;本文出自: <a href="http://fanqiang.chinaunix.net/a6/b6/20010626/170400681.html">http://fanqiang.chinaunix.net/a6/b6/20010626/170400681.html</a> (2001-06-26 17:04:00) </p>
<p>做为眼下最流行的操作系统，Linux已经越来越受到世人的关注。虽然目前Linux的软件还不是很丰富， <br>替代WINDOWS作为普通PC机操作系统还为时过早，但是在服务器领域，Linux的稳定性，可操作性决不 <br>输于任何操作系统，并且也有优秀的软件支持。Squid就是其中之一。Linux加Squid的组合做为代理 <br>服务器，性能远远超过WINNT加MSPROXY2.0（个人观点），为几百人的小型局域网代理绰绰有余。下 <br>面，我就详细的介绍Squid的安装及使用技巧，希望大家能够喜欢上它。&nbsp; </p>
<p>1.Squid简介 </p>
<p>　　Squid是一个缓存internet数据的一个软件，它接收用户的下载申请，并自动处理所下载的数据。 <br>也就是说，当一个用户象要下载一个主页时，它向Squid发出一个申请，要Squid替它下载，然后Squid <br>连接所申请网站并请求该主页，接着把该主页传给用户同时保留一个备份，当别的用户申请同样的页面 <br>时，Squid把保存的备份立即传给用户，使用户觉得速度相当快。目前，Squid 可以代理HTTP, FTP,&nbsp; <br>GOPHER, SSL 和 WAIS 协议，暂不能代理POP, NNTP等协议。不过，已经有人开始修改Squid，相信不 <br>久的将来，Squid能够代理这些协议。 </p>
<p>　　Squid能够缓存任何数据吗？不是的。象缓存信用卡帐号、可以远方执行的scripts、经常变换的 <br>主页等是不合适的也是不安全的。Squid可以自动的进行处理，你也可以根据自己的需要设置Squid， <br>使之过滤掉你不想要的东西。 </p>
<p>　　Squid可以工作在很多的操作系统中，如AIX, Digital Unix, FreeBSD, HP-UX, Irix, Linux,&nbsp; <br>NetBSD, Nextstep, SCO, Solaris，OS/2等，也有不少人在其他操作系统中重新编译过Squid。 </p>
<p>　　Squid对硬件的要求是内存一定要大，不应小于128M，硬盘转速越快越好，最好使用服务器专用SCSI <br>硬盘，处理器要求不高，400MH以上既可。 </p>
<p>2. Squid的编译和运行 </p>
<p>　　其实现在的Linux发行套件中基本都有已经编译好的Squid，你所作的就是安装它既可。如果你手头 <br>没有现成的编译好的Squid或想使用最新的版本，去ftp:squid.nlanr.net下载一份，自己编译。 </p>
<p>　　Squid的编译是非常简单的，因为它基本上是自己配置自己。最容易出现的问题是你的系统上没有 <br>合适的编译器，这可以通过安装相应的编译器解决。如果出现其他问题，你可以问一下有经验的用户或 <br>到相应的邮件列表寻找帮助。 </p>
<p>　　编译Squid之前，最好建一个专门运行Squid的用户和组。我就在自己的服务器上建了一个名为 <br>squid的用户和组，用户目录设为/usr/local/squid。然后su为用户squid并从squid.nlanr.net下载 <br>Squid的源文件到目录 /usr/local/squid/src中，用如下命令进行解压： </p>
<p>　　％tar xzf squid-2.0.RELEASE-src.tar.gz </p>
<p>　　％cd /usr/local/squid/src/ squid-*.*.RELEASE / </p>
<p>　　％./configure </p>
<p>　　%make </p>
<p>　　％make install </p>
<p>　　第一个命令在目录/usr/local/squid/src中产生一个新的子目录/squid-*.*.RELEASE/。命令 <br>./configure会自动查询你的系统配置情况以及你系统中使用的头文件。不加参数的./configure会 <br>把Squid安装在目录/usr/local/squid中，如果你想使用其他目录，用如下命令 <br>./configure --prefix=/some/other/directory，这会把Squid安装在目录/some/other/directory中。 <br>make命令编译Squid，make install命令安装Squid。 </p>
<p>　　不出意外的话，目录/usr/local/squid中会出现如下目录： </p>
<p>　　/bin </p>
<p>　　/cache </p>
<p>　　/etc </p>
<p>　　/logs/ </p>
<p>　　/src （自己创建的） </p>
<p>　　目录/bin中含有Squid可执行程序，包括Squid本身，ftpget等。 </p>
<p>　　目录/cache包含Squid缓存的数据，其中包含象/00/ /01/ /02/ 以及/03/这样的目录，这些目录 <br>中还有子目录，因为目录多了比在一个目录成千上万的文件中寻找一个文件更容易，速度更快。 </p>
<p>　　目录/etc中包含Squid的唯一的配置文件squid.conf。 </p>
<p>　　目录/logs中包含Squid的日志。 </p>
<p><br>3. squid.conf文件的配置 </p>
<p>　　在安装Squid后，在目录/usr/local/squid /etc中会自动产生一个样本squid.conf文件，文件中 <br>对每一个选项都有详细的说明，用户可以通过修改该文件以满足不同的需要。 </p>
<p>　　总的来说，有如下几个重要选项： </p>
<p>　　&#183;http_port:设定Squid监听的端口，你最好设一个比较好记的端口号，以便在进行客户机配置 <br>时容易记住。我的机器上端口号设的是8080。缺省为3128。 </p>
<p>　　&#183;cache_mem：设定Squid占用的物理内存，根据我的经验，cache_mem的大小不应超过你的服务 <br>器物理内存的三分之一，否则将会影响机器的总体性能。 </p>
<p>　　&#183;maximum_object_size：设定Squid可以接收的最大对象的大小。Squid缺省值为4M，我自己入 <br>认为太大，你可以根据自己的需要进行设定。 </p>
<p>　　&#183;cache_dir：设定缓存的位置、大小。一般看起来形式如下 <br>&#8220;cache_dir /usr/local/squid/cache 100 16 256&#8221;。 /usr/local/squid/cache代表缓存的位置； <br>100代表缓存最大为100M；16和256代表一级和二级目录数。 </p>
<p>　　&#183;cache_effective_user：设定使用缓存的有效用户。缺省为用户nobody，如果你的系统中没 <br>有用户nobody，最好建一个或以非root用户运行Squid。 </p>
<p>　　下面我给出一个最简单的squid.conf文件： </p>
<p>　　#squid.conf - a very basic config file for squid </p>
<p>　　#Turn logging to it's lowest level </p>
<p>　　debug_options ALL,1 </p>
<p>　　#defines a group (or Access Control List) that includes all IP addresses </p>
<p>　　acl all src 0.0.0.0/0.0.0.0 </p>
<p>　　#define RAM used </p>
<p>　　cache_mem 32M </p>
<p>　　#defines the cache size </p>
<p>　　cache_dir /usr/local/squid/cache 100 16 256 </p>
<p>　　#allow all sites to use connect to us via HTTP </p>
<p>　　http_access allow all </p>
<p>　　#allow all sites to use us as a sibling </p>
<p>　　icp_access allow all </p>
<p>　　#test the following sites to check that we are connected </p>
<p>　　dns_testnames internic.net usc.edu cs.colorado.edu mit.edu yale.edu </p>
<p>　　#run as the squid user </p>
<p>　　cache_effective_user squid squid </p>
<p>　　这个配置文件允许所有人使用Squid，创建了100M缓存，使用32M内存，在缺省位置 <br>"/usr/local/squid/cache"缓存数据，所有缓存数据以组squid和用户squid身份保存，端口为3128。 <br>虽然这个配置很不安全，但是它已经能使用了。 </p>
<p><br>4. 运行Squid </p>
<p>　　首先以root身份登陆。运行如下命令： </p>
<p>　　％/usr/local/squid/bin/squid &#8211;z </p>
<p>　　该命令会产生Squid所有的缓存目录。 </p>
<p>　　如果你想前台执行Squid,接着执行命令： </p>
<p>　　％/usr/local/squid/bin/squid -NCd1 </p>
<p>　　该命令正式启动Squid。如果一切正常，你会看到一行输出 </p>
<p>　　Ready to serve requests. </p>
<p>　　如果想后台运行Squid，把它做为一个精灵进程，执行命令： </p>
<p>　　％/usr/local/squid/bin/squid </p>
<p>　　观察Squid是否运行使用命令： </p>
<p>　　% squid -k check </p>
<p>　　输出会告诉你Squid的当前状态。 </p>
<p><br>　　好了，文章先写到这里，其实这里介绍的都是最基本的东西，Squid有好多高级的功能， <br>如做WEB服务器的高速缓存，做二级代理服务器，做为防火墙，以及怎样设定过滤规则等，这里 <br>就不详述了，如果有机会再奉献给大家。 <br>&nbsp;<br></p><img src ="http://www.cnitblog.com/aliyiyi08/aggbug/30286.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/aliyiyi08/" target="_blank">阿里爸爸</a> 2007-07-20 11:21 <a href="http://www.cnitblog.com/aliyiyi08/archive/2007/07/20/30286.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Seomoz发布Web2.0排名</title><link>http://www.cnitblog.com/aliyiyi08/archive/2007/06/12/28336.html</link><dc:creator>阿里爸爸</dc:creator><author>阿里爸爸</author><pubDate>Mon, 11 Jun 2007 17:42:00 GMT</pubDate><guid>http://www.cnitblog.com/aliyiyi08/archive/2007/06/12/28336.html</guid><wfw:comment>http://www.cnitblog.com/aliyiyi08/comments/28336.html</wfw:comment><comments>http://www.cnitblog.com/aliyiyi08/archive/2007/06/12/28336.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/aliyiyi08/comments/commentRss/28336.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/aliyiyi08/services/trackbacks/28336.html</trackback:ping><description><![CDATA[今天，著名的搜索引擎营销公司<a title=SEOmoz href="http://www.seomoz.org/"><u><font color=#0000ff>SEOmoz</font></u></a>发布了<a title=2007年度Web2.0网站评选结果 href="http://www.seomoz.org/article/2007-web20"><u><font color=#0000ff>2007年度Web2.0评选结果</font></u></a>。
<p>　　SEOmoz 组织25名在Web2.0领域的专家组成一个专业团队，对数百个Web2.0网站进行评估，从41个种类中分别挑选出最受欢迎的前三名。不过此评选只针对英文的Web2.0网站进行，其他语言的Web2.0网站并未出现其中。</p>
<p>　　下面是获奖的网站名单：</p>
<table width=494 align=center border=1>
    <tbody>
        <tr bgColor=#c0c0c0>
            <td style="COLOR: #cc0000; TEXT-ALIGN: center" width=110>类别 </td>
            <td style="COLOR: #cc0000; TEXT-ALIGN: center" width=105>第一名 </td>
            <td style="COLOR: #cc0000; TEXT-ALIGN: center" width=105>第二名 </td>
            <td style="COLOR: #cc0000; TEXT-ALIGN: center" width=146>第三名 </td>
        </tr>
        <tr>
            <td>博客搜索类 </td>
            <td>Technorati </td>
            <td>Bloglines </td>
            <td>Findory </td>
        </tr>
        <tr>
            <td>书签类 </td>
            <td>Ma.gnolia </td>
            <td>Furl </td>
            <td>Clipmarks </td>
        </tr>
        <tr>
            <td>图书类 </td>
            <td>Lulu </td>
            <td>Biblio </td>
            <td>Library Thing </td>
        </tr>
        <tr>
            <td>商业类 </td>
            <td>Squidoo </td>
            <td>Instant Bull </td>
            <td>Shopify </td>
        </tr>
        <tr>
            <td>城市搜索和评论类 </td>
            <td>Yelp </td>
            <td>Judy's Book </td>
            <td>Yahoo! Local </td>
        </tr>
        <tr>
            <td>分类和目录类 </td>
            <td>Craigslist </td>
            <td>Oodle </td>
            <td>vFlyer </td>
        </tr>
        <tr>
            <td>协作写作和文字处理类 </td>
            <td>Google Docs and Spreadsheets </td>
            <td>Writeboard </td>
            <td>ThinkFree </td>
        </tr>
        <tr>
            <td height=20>通信类 </td>
            <td height=20>Meebo </td>
            <td height=20>Campfire </td>
            <td height=20>MailEmotion </td>
        </tr>
        <tr>
            <td>内容聚合和管理类 </td>
            <td>Wufoo </td>
            <td>ProjectStat.us </td>
            <td>EditGrid </td>
        </tr>
        <tr>
            <td>数字存储和远程访问类 </td>
            <td>Omnidrive </td>
            <td>Esnips </td>
            <td>TotoExpress </td>
        </tr>
        <tr>
            <td height=22>活动类 </td>
            <td height=22>Upcoming </td>
            <td height=22>Eventful </td>
            <td height=22>Confabb </td>
        </tr>
        <tr>
            <td>Feed管理类 </td>
            <td>Feedburner </td>
            <td>Attensa </td>
            <td>BlogBridge </td>
        </tr>
        <tr>
            <td>笑话类 </td>
            <td>Cocktail Builder </td>
            <td>One Sentence </td>
            <td>Fuzzmail </td>
        </tr>
        <tr>
            <td>游戏类 </td>
            <td>Arcaplay </td>
            <td>Games2Web </td>
            <td>Guess-The-Google </td>
        </tr>
        <tr>
            <td>保健类 </td>
            <td>PEERtrainer </td>
            <td>Medstory </td>
            <td>Healia </td>
        </tr>
        <tr>
            <td>维基服务类 </td>
            <td>Wetpaint </td>
            <td>PBwiki </td>
            <td>Stikipad </td>
        </tr>
        <tr>
            <td>排名和投票类 </td>
            <td>43 Things </td>
            <td>Statsaholic </td>
            <td>Listdump </td>
        </tr>
        <tr>
            <td>地图类 </td>
            <td>Google Maps </td>
            <td>Wayfaring </td>
            <td>Frappr </td>
        </tr>
        <tr>
            <td height=17>营销类 </td>
            <td height=17>Intellicontact </td>
            <td height=17>Conduit </td>
            <td height=17>PlugIM </td>
        </tr>
        <tr>
            <td>整合服务类 </td>
            <td>Ning </td>
            <td>Boxxet </td>
            <td>Coverpop </td>
        </tr>
        <tr>
            <td>移动技术类 </td>
            <td>Twitter </td>
            <td>Plusmo </td>
            <td>JuiceCaster </td>
        </tr>
        <tr>
            <td>音乐类 </td>
            <td>Pandora </td>
            <td>Last.fm </td>
            <td>Discrevolt </td>
        </tr>
        <tr>
            <td>网络桌面类 </td>
            <td>Goowy </td>
            <td>Desktoptwo </td>
            <td>EyeOS </td>
        </tr>
        <tr>
            <td>办公应用类 </td>
            <td>Google Apps </td>
            <td>Zoho </td>
            <td>Backpack </td>
        </tr>
        <tr>
            <td>慈善事业类 </td>
            <td>Care2 </td>
            <td>Donor Choose </td>
            <td>Be Green Now </td>
        </tr>
        <tr>
            <td>图片和数字照片类 </td>
            <td>Flickr </td>
            <td>Picasa </td>
            <td>Picnik </td>
        </tr>
        <tr>
            <td>播客服务类 </td>
            <td>Odeo </td>
            <td>PodShow </td>
            <td>PodOmatic </td>
        </tr>
        <tr>
            <td>专业网络类 </td>
            <td>LinkedIn </td>
            <td>Spoke </td>
            <td>Xing </td>
        </tr>
        <tr>
            <td>提问和建议类 </td>
            <td>Yahoo! Answers </td>
            <td>Minti </td>
            <td>Say-So </td>
        </tr>
        <tr>
            <td>房地产类 </td>
            <td>Zillow </td>
            <td>HousingMaps </td>
            <td>iiProperty </td>
        </tr>
        <tr>
            <td>零售类 </td>
            <td>Threadless </td>
            <td>Etsy </td>
            <td>WipBox </td>
        </tr>
        <tr>
            <td>搜索类 </td>
            <td>Rollyo </td>
            <td>Swicki </td>
            <td>Pipl </td>
        </tr>
        <tr>
            <td>社交网站类 </td>
            <td>Facebook </td>
            <td>Mingle2 </td>
            <td>Pipl </td>
        </tr>
        <tr>
            <td>社交新闻类 </td>
            <td>Digg </td>
            <td>Reddit </td>
            <td>Newsvine </td>
        </tr>
        <tr>
            <td>社交标签类 </td>
            <td>Del.icio.us </td>
            <td>StumbleUpon </td>
            <td>BlinkList </td>
        </tr>
        <tr>
            <td height=24>首页类 </td>
            <td height=24>Netvibes </td>
            <td height=24>PageFlakes </td>
            <td height=24>Personalized Google </td>
        </tr>
        <tr>
            <td height=24>旅游类 </td>
            <td height=24>Farecast </td>
            <td height=24>Kayak </td>
            <td height=24>RealTravel </td>
        </tr>
        <tr>
            <td height=24>视频类 </td>
            <td height=24>YouTube </td>
            <td height=24>Dailymotion </td>
            <td height=24>Metacafe </td>
        </tr>
        <tr>
            <td>视觉艺术类 </td>
            <td>ColorBlender </td>
            <td>Swivel </td>
            <td>The Broth </td>
        </tr>
        <tr>
            <td>网页开发和设计类 </td>
            <td>CakePHP </td>
            <td>Prototype Javascript Framework </td>
            <td>Yahoo! UI </td>
        </tr>
        <tr>
            <td>维基类 </td>
            <td>YourMinis </td>
            <td>SpringWidgets </td>
            <td>Flock </td>
        </tr>
    </tbody>
</table>
<br>原文: <a href="http://www.web2week.com/archives/2007/05/seomozweb20.html">http://www.web2week.com/archives/2007/05/seomozweb20.html</a>
<img src ="http://www.cnitblog.com/aliyiyi08/aggbug/28336.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/aliyiyi08/" target="_blank">阿里爸爸</a> 2007-06-12 01:42 <a href="http://www.cnitblog.com/aliyiyi08/archive/2007/06/12/28336.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PC World近日发布了2007年度最佳产品前100名[荐]</title><link>http://www.cnitblog.com/aliyiyi08/archive/2007/06/12/28335.html</link><dc:creator>阿里爸爸</dc:creator><author>阿里爸爸</author><pubDate>Mon, 11 Jun 2007 17:32:00 GMT</pubDate><guid>http://www.cnitblog.com/aliyiyi08/archive/2007/06/12/28335.html</guid><wfw:comment>http://www.cnitblog.com/aliyiyi08/comments/28335.html</wfw:comment><comments>http://www.cnitblog.com/aliyiyi08/archive/2007/06/12/28335.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/aliyiyi08/comments/commentRss/28335.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/aliyiyi08/services/trackbacks/28335.html</trackback:ping><description><![CDATA[<a href="http://www.pcworld.com/">PC World</a>近日发布了2007年度最佳产品前100名，评选的范围包括电子产品、网站和服务。值得一提的是，其中包含了很多Web2.0网站。<br><br>
<h2 class=artSubtitle>The Top 100 Products, in Ranked Order</h2>
<ol>
    <li>Google Apps Premier Edition <a href="http://blogs.pcworld.com/techlog/archives/003783.html" target=_blank><u><font color=#0000ff>Review</font></u></a> | <a href="http://www.google.com/a/help/intl/en/admins/editions.html" target=_blank><u><font color=#800080>Vendor Site</font></u></a>
    <li>Intel Core 2 Duo <a href="http://www.pcworld.com/article/id,126342/article.html"><u><font color=#0000ff>Review</font></u></a> | <a href="http://www.pcworld.com/product/pricing/prtprdid,22879556-sortby,retailer/pricing.html"><u><font color=#0000ff>Check Prices</font></u></a>
    <li>Nintendo Wii <a href="http://www.pcworld.com/article/id,127869/article.html"><u><font color=#0000ff>Review</font></u></a> | <a href="http://www.pcworld.com/product/pricing/prtprdid,27737371/pricing.html"><u><font color=#0000ff>Check Prices</font></u></a>
    <li>Verizon FiOS <a href="http://www22.verizon.com/content/ConsumerFios" target=_blank><u><font color=#0000ff>Vendor Site</font></u></a>
    <li>RIM Blackberry 8800 <a href="http://www.pcworld.com/article/id,130213-c,cellphones/article.html"><u><font color=#0000ff>Review</font></u></a> | <a href="http://www.pcworld.com/product/pricing/prtprdid,32970683/pricing.html"><u><font color=#0000ff>Check Prices</font></u></a>
    <li>Parallels Desktop <a href="http://www.pcworld.com/article/id,126824/article.html"><u><font color=#0000ff>Review</font></u></a> | <a href="http://www.pcworld.com/product/pricing/prtprdid,35915982/pricing.html"><u><font color=#0000ff>Check Prices</font></u></a>
    <li>Pioneer Elite 1080p PRO-FHD1 <a href="http://www.pcworld.com/product/pricing/prtprdid,28081748/pricing.html"><u><font color=#0000ff>Check Prices</font></u></a>
    <li>Infrant Technologies ReadyNAS NV <a href="http://www.pcworld.com/product/pricing/prtprdid,28923799/pricing.html"><u><font color=#0000ff>Check Prices</font></u></a>
    <li>Apple Mac OS X 10.4 "Tiger" <a href="http://www.pcworld.com/article/id,130282/article.html"><u><font color=#0000ff>Review</font></u></a> | <a href="http://www.pcworld.com/product/pricing/prtprdid,8422356/pricing.html"><u><font color=#0000ff>Check Prices</font></u></a>
    <li>Adobe Premiere Elements 3 <a href="http://www.pcworld.com/article/id,127281/article.html"><u><font color=#0000ff>Review</font></u></a> | <a href="http://www.pcworld.com/product/pricing/prtprdid,27418009/pricing.html"><u><font color=#0000ff>Check Prices</font></u></a>
    <li>Apple TV <a href="http://www.pcworld.com/article/id,130468/article.html"><u><font color=#0000ff>Review</font></u></a> | <a href="http://www.pcworld.com/product/pricing/prtprdid,32453085/pricing.html"><u><font color=#0000ff>Check Prices</font></u></a>
    <li>Samsung SyncMaster 244T <a href="http://www.pcworld.com/article/id,127306-page,1-c,monitors/article.html"><u><font color=#0000ff>Review</font></u></a> | <a href="http://www.pcworld.com/product/pricing/prtprdid,13468535/pricing.html"><u><font color=#0000ff>Check Prices</font></u></a>
    <li>BillP Studios WinPatrol <a href="http://www.pcworld.com/downloads/file/fid,22728-order,1-page,1/description.html"><u><font color=#0000ff>Download</font></u></a>
    <li>HP dv9000t <a href="http://www.pcworld.com/article/id,131020-c,notebooks/article.html"><u><font color=#0000ff>Review</font></u></a> | <a href="http://www.pcworld.com/product/pricing/prtprdid,32703508/pricing.html"><u><font color=#0000ff>Check Prices</font></u></a>
    <li>McAfee SiteAdvisor <a href="http://www.pcworld.com/downloads/file/fid,62594-order,1-page,1/description.html"><u><font color=#0000ff>Download</font></u></a>
    <li>Canonical Ubuntu 7.04 <a href="http://www.pcworld.com/article/id,130110/article.html"><u><font color=#0000ff>Review</font></u></a>
    <li>Pandora.com <a href="http://blogs.pcworld.com/tipsandtweaks/archives/001913.html" target=_blank><u><font color=#0000ff>Review</font></u></a>
    <li>Microsoft Xbox 360 Elite <a href="http://www.pcworld.com/article/id,131416/article.html"><u><font color=#0000ff>Review</font></u></a> | <a href="http://www.pcworld.com/product/pricing/prtprdid,35111287/pricing.html"><u><font color=#0000ff>Check Prices</font></u></a>
    <li>Paint.net <a href="http://www.pcworld.com/downloads/file/fid,64533-order,1-page,1/description.html"><u><font color=#800080>Download</font></u></a>
    <li>Hitachi Deskstar 7K1000 <a href="http://www.pcworld.com/article/id,131417-c,harddrives/article.html"><u><font color=#0000ff>Review</font></u></a> | <a href="http://www.pcworld.com/product/pricing/prtprdid,36187293/pricing.html"><u><font color=#0000ff>Check Prices</font></u></a>
    <li>SightSpeed 6 <a href="http://www.pcworld.com/downloads/file/fid,23087-order,1-page,1/description.html"><u><font color=#0000ff>Download</font></u></a>
    <li>Kayak <a href="http://www.kayak.com/" target=_blank><u><font color=#800080>Web Site</font></u></a>
    <li>Nikon D40X <a href="http://www.pcworld.com/product/pricing/prtprdid,34451888/pricing.html"><u><font color=#0000ff>Check Prices</font></u></a>
    <li>New York Times Times Reader <a href="http://select.nytimes.com/gst/timesreader.html" target=_blank><u><font color=#0000ff>Vendor Site</font></u></a>
    <li>Samsung BlackJack <a href="http://www.pcworld.com/article/id,128732-c,cellphones/article.html"><u><font color=#0000ff>Review</font></u></a> | <a href="http://www.pcworld.com/product/pricing/prtprdid,29936786/pricing.html"><u><font color=#0000ff>Check Prices</font></u></a>
    <li>Apple iPod (80GB) <a href="http://www.pcworld.com/product/specs/id,29313-c,mp3players/specs.html"><u><font color=#0000ff>Test Report</font></u></a> | <a href="http://www.pcworld.com/product/pricing/prtprdid,26037922/pricing.html"><u><font color=#0000ff>Check Prices</font></u></a>
    <li>Yahoo Mail Beta <a href="http://advision.webevents.yahoo.com/mailbeta/" target=_blank><u><font color=#800080>Vendor Site</font></u></a>
    <li>TomTom One <a href="http://www.pcworld.com/article/id,126974/article.html"><u><font color=#0000ff>Review</font></u></a> | <a href="http://www.pcworld.com/product/pricing/prtprdid,24580125/pricing.html"><u><font color=#0000ff>Check Prices</font></u></a>
    <li>Dell UltraSharp 2407WFP <a href="http://www.pcworld.com/article/id,127284-page,1-c,monitors/article.html"><u><font color=#0000ff>Review</font></u></a> | <a href="http://www.pcworld.com/product/pricing/prtprdid,20885367/pricing.html"><u><font color=#0000ff>Check Prices</font></u></a>
    <li>Zoho <a href="http://www.pcworld.com/article/id,128248-page,2-c,sites/article.html"><u><font color=#0000ff>Review</font></u></a>
    <li>Google Gmail <a href="http://www.gmail.com/" target=_blank><u><font color=#0000ff>Vendor Site</font></u></a>
    <li>Sling Media Slingbox Pro <a href="http://www.pcworld.com/product/pricing/prtprdid,27670756/pricing.html"><u><font color=#0000ff>Check Prices</font></u></a>
    <li>Red Octane Guitar Hero 2 <a href="http://www.pcworld.com/video/id,430-page,1-bid,0/video.html"><u><font color=#0000ff>Video</font></u></a> | <a href="http://www.pcworld.com/product/pricing/prtprdid,35121454/pricing.html"><u><font color=#0000ff>Check Prices</font></u></a>
    <li>Google YouTube <a href="http://www.youtube.com/" target=_blank><u><font color=#0000ff>Vendor Site</font></u></a>
    <li>Mozilla Firefox 2 <a href="http://www.pcworld.com/downloads/file/fid,23160-order,1-page,1/description.html"><u><font color=#0000ff>Download</font></u></a>
    <li>Google Picasa <a href="http://www.pcworld.com/downloads/file/fid,64528-order,1-page,1/description.html"><u><font color=#0000ff>Download</font></u></a>
    <li>Nikon D80 <a href="http://www.pcworld.com/article/id,127910-c,cameras/article.html"><u><font color=#0000ff>Review</font></u></a> | <a href="http://www.pcworld.com/product/pricing/prtprdid,23760800/pricing.html"><u><font color=#0000ff>Check Prices</font></u></a>
    <li>Skype 3 <a href="http://www.pcworld.com/downloads/file/fid,23523-order,1-page,1/description.html"><u><font color=#800080>Download</font></u></a>
    <li>Aliph Jawbone <a href="http://blogs.pcworld.com/digitalworld/archives/2006/12/wireless_versio_1.html" target=_blank><u><font color=#0000ff>Review</font></u></a> | <a href="http://www.pcworld.com/product/pricing/prtprdid,36002696/pricing.html"><u><font color=#0000ff>Check Prices</font></u></a>
    <li>Shure E500PTH <a href="http://www.pcworld.com/article/id,126509/article.html"><u><font color=#0000ff>Review</font></u></a> | <a href="http://www.pcworld.com/product/pricing/prtprdid,21150194/pricing.html"><u><font color=#0000ff>Check Prices</font></u></a>
    <li>CyberPower Gamer Infinity Ultimate <a href="http://www.pcworld.com/article/id,131171-c,desktoppcs/article.html"><u><font color=#0000ff>Review</font></u></a> | <a href="http://www.pcworld.com/product/pricing/id,29853/pricing.html"><u><font color=#0000ff>Check Prices</font></u></a>
    <li>Asus w5fe-2P025E <a href="http://www.pcworld.com/article/id,131031/article.html"><u><font color=#0000ff>Review</font></u></a> | <a href="http://www.pcworld.com/product/pricing/id,29879/pricing.html"><u><font color=#0000ff>Check Prices</font></u></a>
    <li>AVS Forum<a href="http://www.avsforum.com/" target=_blank><u><font color=#0000ff> Web Site</font></u></a>
    <li>Yahoo Flickr <a href="http://www.pcworld.com/article/id,119985-page,3-c,sites/article.html"><u><font color=#0000ff>Review</font></u></a>
    <li>Apple iPod Nano (8GB) <a href="http://www.pcworld.com/product/pricing/prtprdid,26036013/pricing.html"><u><font color=#0000ff>Check Prices</font></u></a>
    <li>Nikon Coolpix S50c <a href="http://www.pcworld.com/product/pricing/prtprdid,33724692/pricing.html"><u><font color=#0000ff>Check Prices</font></u></a>
    <li>Dell UltraSharp 2007WFP <a href="http://www.pcworld.com/article/id,125925-c,monitors/article.html"><u><font color=#0000ff>Review</font></u></a> | <a href="http://www.pcworld.com/product/pricing/prtprdid,18864442/pricing.html"><u><font color=#0000ff>Check Prices</font></u></a>
    <li>OCZ Trifecta Secure Digital Memory Card <a href="http://www.pcworld.com/product/pricefinder/browse/category.html?id=10034&amp;filter=vendors[],PGOC|vendors[],PGOCZ"><u><font color=#0000ff>Check Prices</font></u></a>
    <li>Archos 704 Wi-Fi <a href="http://www.pcworld.com/article/id,130611/article.html"><u><font color=#0000ff>Review</font></u></a> | <a href="http://www.pcworld.com/product/pricing/id,29884/pricing.html"><u><font color=#0000ff>Check Prices</font></u></a>
    <li>Lenovo ThinkPad X60 Tablet <a href="http://www.pcworld.com/article/id,131030/article.html"><u><font color=#0000ff>Review</font></u></a> | <a href="http://www.pcworld.com/product/pricing/prtprdid,18451138/pricing.html"><u><font color=#0000ff>Check Prices</font></u></a>
    <li>Canon EOS 30D <a href="http://www.pcworld.com/article/id,125451/article.html"><u><font color=#0000ff>Review</font></u></a> | <a href="http://www.pcworld.com/product/pricing/prtprdid,17423818/pricing.html"><u><font color=#0000ff>Check Prices</font></u></a>
    <li>LaLa.com <a href="http://blogs.pcworld.com/staffblog/archives/001571.html" target=_blank><u><font color=#0000ff>Review</font></u></a>
    <li>Google Maps for Mobile <a href="http://www.google.com/gmm/index.html" target=_blank><u><font color=#0000ff>Vendor Site</font></u></a>
    <li>Canon Pixma iP4300 <a href="http://www.pcworld.com/article/id,128622-c,printers/article.html"><u><font color=#0000ff>Review</font></u></a> | <a href="http://www.pcworld.com/product/pricing/prtprdid,24847869/pricing.html"><u><font color=#0000ff>Check Prices</font></u></a>
    <li>Kaspersky Anti-Virus <a href="http://www.pcworld.com/article/id,130873/article.html"><u><font color=#0000ff>Review</font></u></a> | <a href="http://www.pcworld.com/product/pricing/prtprdid,9126300/pricing.html"><u><font color=#0000ff>Check Prices</font></u></a>
    <li>Microsoft Office 2007 <a href="http://www.pcworld.com/article/id,128266/article.html"><u><font color=#0000ff>Review</font></u></a> | <a href="http://www.pcworld.com/product/pricing/id,29529/pricing.html"><u><font color=#0000ff>Check Prices</font></u></a>
    <li>Asus Crosshair <a href="http://www.pcworld.com/product/specs/id,29717/specs.html"><u><font color=#0000ff>Test Report</font></u></a> | <a href="http://www.pcworld.com/product/pricing/prtprdid,23143525/pricing.html"><u><font color=#0000ff>Check Prices</font></u></a>
    <li>Digg.com <a href="http://digg.com/" target=_blank><u><font color=#0000ff>Web Site</font></u></a>
    <li>Dell XPS M1210 <a href="http://www.pcworld.com/article/id,131029/article.html"><u><font color=#0000ff>Review</font></u></a> | <a href="http://www.pcworld.com/product/pricing/prtprdid,34505012/pricing.html"><u><font color=#0000ff>Check Prices</font></u></a>
    <li>Creative Zen V Plus (8GB) <a href="http://www.pcworld.com/article/id,127376/article.html"><u><font color=#0000ff>Review</font></u></a> | <a href="http://www.pcworld.com/product/pricing/prtprdid,30886199/pricing.html"><u><font color=#0000ff>Check Prices</font></u></a>
    <li>Apple iTunes <a href="http://www.pcworld.com/downloads/file/fid,23102-order,1-page,1/description.html"><u><font color=#0000ff>Download</font></u></a>
    <li>Gigabyte GA-965P-DQ6 <a href="http://www.pcworld.com/product/specs/id,29712-chid,6287/specs.html"><u><font color=#0000ff>Test Report</font></u></a> | <a href="http://www.pcworld.com/product/pricing/prtprdid,22624820/pricing.html"><u><font color=#0000ff>Check Prices</font></u></a>
    <li>Iomega NAS 1TB <a href="http://www.pcworld.com/product/pricing/prtprdid,19070854/pricing.html"><u><font color=#0000ff>Check Prices</font></u></a>
    <li>Fujifilm FinePix F40fd <a href="http://www.pcworld.com/product/pricing/prtprdid,32672991/pricing.html"><u><font color=#0000ff>Check Prices</font></u></a>
    <li>Canon MP600 <a href="http://www.pcworld.com/article/id,128221-page,1-c,printers/article.html"><u><font color=#0000ff>Review</font></u></a> | <a href="http://www.pcworld.com/product/pricing/prtprdid,25948985/pricing.html"><u><font color=#0000ff>Check Prices</font></u></a>
    <li>37Signals Backpack <a href="http://www.pcworld.com/article/id,128248-page,11-c,sites/article.html"><u><font color=#0000ff>Review</font></u></a>
    <li>LG Electronics BH100 <a href="http://blogs.pcworld.com/staffblog/archives/003408.html" target=_blank><u><font color=#0000ff>Review</font></u></a> | <a href="http://www.pcworld.com/product/pricing/prtprdid,32683433/pricing.html"><u><font color=#0000ff>Check Prices</font></u></a>
    <li>Craigslist.org <a href="http://www.craigslist.org/" target=_blank><u><font color=#0000ff>Web Site</font></u></a>
    <li>BBB.org <a href="http://www.bbb.org/" target=_blank><u><font color=#0000ff>Web Site</font></u></a>
    <li>Fujitsu ScanSnap s500 <a href="http://www.pcworld.com/article/id,129085/article.html"><u><font color=#0000ff>Review</font></u></a> | <a href="http://www.pcworld.com/product/pricing/prtprdid,18601595/pricing.html"><u><font color=#0000ff>Check Prices</font></u></a>
    <li>NEC MultiSync 90GX2 <a href="http://www.pcworld.com/article/id,124349-page,1-c,monitors/article.html"><u><font color=#0000ff>Review</font></u></a> | <a href="http://www.pcworld.com/product/pricing/prtprdid,17631073/pricing.html"><u><font color=#0000ff>Check Prices</font></u></a>
    <li>Adobe CS3 <a href="http://www.pcworld.com/article/id,128728/article.html"><u><font color=#0000ff>Review</font></u></a> | <a href="http://www.pcworld.com/product/pricing/id,29682/pricing.html"><u><font color=#0000ff>Check Prices</font></u></a>
    <li>Dell XPS 410 <a href="http://www.pcworld.com/article/id,131173-c,desktoppcs/article.html"><u><font color=#0000ff>Review</font></u></a> | <a href="http://www.pcworld.com/product/pricing/prtprdid,23142729/pricing.html"><u><font color=#0000ff>Check Prices</font></u></a>
    <li>Meebo <a href="http://www.pcworld.com/article/id,131664-c,webservices/article.html"><u><font color=#0000ff>Review</font></u></a>
    <li>SysInternals/Microsoft Process Explorer <a href="http://www.pcworld.com/downloads/file/fid,23780-order,1-page,1/description.html"><u><font color=#0000ff>Download</font></u></a>
    <li>Wacom Graphire Bluetooth 6x8 Pen Tablet <a href="http://www.pcworld.com/product/pricing/prtprdid,8057504/pricing.html"><u><font color=#0000ff>Check Prices</font></u></a>
    <li>VMWare Player <a href="http://www.vmware.com/download/player/" target=_blank><u><font color=#0000ff>Vendor Site</font></u></a>
    <li>Emusic <a href="http://www.emusic.com/" target=_blank><u><font color=#0000ff>Web Site</font></u></a>
    <li>TiVo Series3 HD Digital Media Recorder <a href="http://www.pcworld.com/article/id,126965/article.html"><u><font color=#0000ff>Review</font></u></a> | <a href="http://www.pcworld.com/product/pricing/prtprdid,26543910/pricing.html"><u><font color=#0000ff>Check Prices</font></u></a>
    <li>Netvibes <a href="http://www.netvibes.com/" target=_blank><u><font color=#800080>Web Site</font></u></a>
    <li>TripAdvisor <a href="http://www.tripadvisor.com/" target=_blank><u><font color=#0000ff>Web Site</font></u></a>
    <li>Apple MacBook Pro <a href="http://www.pcworld.com/article/id,124879/article.html"><u><font color=#0000ff>Review</font></u></a> | <a href="http://www.pcworld.com/product/pricing/prtprdid,28215798/pricing.html"><u><font color=#0000ff>Check Prices</font></u></a>
    <li>Avira AntiVir Personal Edition Classic <a href="http://www.pcworld.com/article/id,124487/article.html"><u><font color=#0000ff>Review</font></u></a> | <a href="http://www.pcworld.com/product/pricing/id,27558/pricing.html"><u><font color=#0000ff>Check Prices</font></u></a>
    <li>Ning.com <a href="http://www.pcworld.com/article/id,130604/article.html"><u><font color=#0000ff>Review</font></u></a>
    <li>Check Point Software ZoneAlarm Internet Security Suite <a href="http://www.pcworld.com/article/id,129514/article.html"><u><font color=#0000ff>Review</font></u></a> | <a href="http://www.digitalriver.com/dr/v2/ec_Main.Entry17C?SID=89508&amp;SP=10023&amp;CID=0&amp;PID=699281&amp;PN=1&amp;V1=699281&amp;CUR=840&amp;DSP=&amp;PGRP=0&amp;ABCODE=&amp;CACHE_ID=0" target=_blank><u><font color=#0000ff>Download Store</font></u></a>
    <li>SanDisk Sansa Connect <a href="http://www.pcworld.com/article/id,131052-c,mp3players/article.html"><u><font color=#0000ff>Review</font></u></a> | <a href="http://www.pcworld.com/product/pricing/prtprdid,35421113/pricing.html"><u><font color=#0000ff>Check Prices</font></u></a>
    <li>VirusTotal.com <a href="http://blogs.pcworld.com/tipsandtweaks/archives/003589.html" target=_blank><u><font color=#0000ff>Review</font></u></a>
    <li>Flurry <a href="http://blogs.pcworld.com/staffblog/archives/003961.html" target=_blank><u><font color=#0000ff>Review</font></u></a>
    <li>Oki Printing Solutions C3400n <a href="http://www.pcworld.com/article/id,127556-c,printers/article.html"><u><font color=#0000ff>Review</font></u></a> | <a href="http://www.pcworld.com/product/pricing/prtprdid,26184166/pricing.html"><u><font color=#0000ff>Check Prices</font></u></a>
    <li>nVidia GeForce 8800 GTX <a href="http://www.pcworld.com/product/pricefinder/search?qt=8800+gtx&amp;id=1"><u><font color=#0000ff>Check Prices</font></u></a>
    <li>Microsoft Windows Media Player 11 <a href="http://www.pcworld.com/downloads/file/fid,63730-order,1-page,1/description.html"><u><font color=#0000ff>Download</font></u></a>
    <li>Netflix Watch Now <a href="http://www.netflix.com/" target=_blank><u><font color=#0000ff>Vendor Site</font></u></a>
    <li>Audacity <a href="http://www.pcworld.com/downloads/file/fid,22513-order,1-page,1/description.html"><u><font color=#0000ff>Download</font></u></a>
    <li>Congoo <a href="http://www.pcworld.com/article/id,130979-page,9-c,searchengines/article.html"><u><font color=#0000ff>Review</font></u></a>
    <li>Wladimir Palant Adblock Plus <a href="http://www.pcworld.com/downloads/file/fid,64454-order,1-page,1/description.html"><u><font color=#0000ff>Download</font></u></a>
    <li>Buffalo Nfiniti Dual Band Gigabit Router &amp; Access Point <a href="http://www.pcworld.com/product/pricing/prtprdid,31777292/pricing.html"><u><font color=#0000ff>Check Prices</font></u></a>
    <li>Panasonic HDC-SD1 <a href="http://www.pcworld.com/article/id,129478/article.html"><u><font color=#0000ff>Review</font></u></a> | <a href="http://www.pcworld.com/product/pricing/prtprdid,32908613/pricing.html"><u><font color=#0000ff>Check Prices</font></u></a>
    <li>Logitech Harmony 880 <a href="http://www.pcworld.com/article/id,120438/article.html"><u><font color=#0000ff>Review</font></u></a> | <a href="http://www.pcworld.com/product/pricing/prtprdid,7803953/pricing.html"><u><font color=#0000ff>Check Prices</font></u></a>
    <li>Sling Media SlingPlayer Mobile <a href="http://us.slingmedia.com/page/slingplayermobile.html" target=_blank><u><font color=#0000ff>Vendor Site</font></u></a>
    <li>Shure SE210 <a href="http://www.pcworld.com/article/id,129479/article.html"><u><font color=#0000ff>Review</font></u></a> | <a href="http://www.pcworld.com/product/pricing/prtprdid,34312253/pricing.html"><u><font color=#0000ff>Check Prices</font></u></a></li>
</ol>
<img src ="http://www.cnitblog.com/aliyiyi08/aggbug/28335.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/aliyiyi08/" target="_blank">阿里爸爸</a> 2007-06-12 01:32 <a href="http://www.cnitblog.com/aliyiyi08/archive/2007/06/12/28335.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一种正在网络上慢慢兴起的数据交换格式 JSON</title><link>http://www.cnitblog.com/aliyiyi08/archive/2007/05/31/27864.html</link><dc:creator>阿里爸爸</dc:creator><author>阿里爸爸</author><pubDate>Thu, 31 May 2007 08:32:00 GMT</pubDate><guid>http://www.cnitblog.com/aliyiyi08/archive/2007/05/31/27864.html</guid><wfw:comment>http://www.cnitblog.com/aliyiyi08/comments/27864.html</wfw:comment><comments>http://www.cnitblog.com/aliyiyi08/archive/2007/05/31/27864.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/aliyiyi08/comments/commentRss/27864.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/aliyiyi08/services/trackbacks/27864.html</trackback:ping><description><![CDATA[JSON是一种正在网络上慢慢兴起的数据交换格式。就象AJAX并不是什么新技术一样，JSON也没有提供什么新格式，它基于ECMAScript标准中对ObjectLiteral的定义(ECMA-262, 11.1.5)，早就被javascript支持。格式定义非常简单，就是通过一组键值对来定义一个对象。在javascript中，你可以直接将这种格式的数据赋值给一个变量，然后通过键名取值。相对于使用xml来作为数据交换格式，如果要在javascript里使用，首先需要创建一个DOMParser，然后通过DOM接口访问节点对象，非常繁琐，更不用说不同浏览器的实现中DOMParser的实现和DOM接口都有诸多不同。为什么大量的AJAX应用中宁可直接返回一个HTML片断而不是直接把XML交给javascript处理，一个主要原因就是处理XML的过程比较复杂。JSON最重要的贡献就是简化了解析数据的过程。 del.icio.us提供的在网页上显示书签的javascript脚本就基于JSON，看一下这个脚本，再设想一下通过AJAX读取del.icio.us提供的RSS接口来实现这个功能，就能体会JSON的巧妙了。除此之外，更有人提出类似XSLT的JSONT，可以将JSON格式的内容转换成其他形式，虽然还暂时还没有XSLT灵活和强大，至少展示了一种可能性。 JSON解决的另一个传统AJAX中xmlhttprequest不能解决的问题就是跨域链接的问题。基于安全考虑，各种浏览器缺省都不允许xmlhttprequest跨域名链接，abc.com页面上的xmlhttprequest是无法连接def.com的内容的。在网页中，JSON可以采用引入script元素的方式导入数据，html中的script可以指定非本地脚本，跨域链接的问题得以解决。但使用这样的方式导入JSON数据，是一个同步的过程（是否可以用defer属性来实现异步？），这点上不如xmlhttpreqeust灵活。 
<img src ="http://www.cnitblog.com/aliyiyi08/aggbug/27864.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/aliyiyi08/" target="_blank">阿里爸爸</a> 2007-05-31 16:32 <a href="http://www.cnitblog.com/aliyiyi08/archive/2007/05/31/27864.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>正则表达式[精]</title><link>http://www.cnitblog.com/aliyiyi08/archive/2007/05/30/27793.html</link><dc:creator>阿里爸爸</dc:creator><author>阿里爸爸</author><pubDate>Wed, 30 May 2007 12:00:00 GMT</pubDate><guid>http://www.cnitblog.com/aliyiyi08/archive/2007/05/30/27793.html</guid><wfw:comment>http://www.cnitblog.com/aliyiyi08/comments/27793.html</wfw:comment><comments>http://www.cnitblog.com/aliyiyi08/archive/2007/05/30/27793.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/aliyiyi08/comments/commentRss/27793.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/aliyiyi08/services/trackbacks/27793.html</trackback:ping><description><![CDATA[<p>1．什么是正则表达式</p>
<p><br>简单的说，正则表达式是一种可以用于文字模式匹配和替换的强有力的工具。是由一系列普通字符和特殊字符组成的能明确描述文本字符串的文字匹配模式。</p>
<p>正则表达式并非一门专用语言，但也可以看作是一种语言，它可以让用户通过使用一系列普通字符和特殊字符构建能明确描述文本字符串的匹配模式。除了简单描述这些模式之外，正则表达式解释引擎通常可用于遍历匹配，并使用模式作为分隔符来将字符串解析为子字符串，或以智能方式替换文本或重新设置文本格式。正则表达式为解决与文本处理有关的许多常见任务提供了有效而简捷的方式。</p>
<p>正则表达式具有两种标准：</p>
<p>&#183;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 基本的正则表达式(BRE &#8211; Basic Regular Expressions)</p>
<p>&#183;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 扩展的正则表达式(ERE &#8211; Extended Regular Expressions)。</p>
<p>ERE包括BRE功能和另外其它的概念。</p>
<p>&nbsp;</p>
<p>正则表达式目前有两种解释引擎：</p>
<p>&#183;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 基于字符驱动(text-directed engine)</p>
<p>&#183;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 基于正则表达式驱动(regex-directed engine) </p>
<p>Jeffery Friedl把它们称作DFA和NFA解释引擎。</p>
<p>&nbsp;</p>
<p>约定：</p>
<p>为了描述起来方便，在本文中做一些约定：</p>
<p>1.&nbsp;&nbsp;&nbsp;&nbsp; 本文所举例的所有表达时都是基于NFA解释引擎的。</p>
<p>2.&nbsp;&nbsp;&nbsp;&nbsp; 正则表达式，也就是匹配模式，会简写为Regex。</p>
<p>3.&nbsp;&nbsp;&nbsp;&nbsp; Regex的匹配目标，也就是目标字符串，会简写为String。</p>
<p>4.&nbsp;&nbsp;&nbsp;&nbsp; 匹配结果用会用黄色底色标识。</p>
<p>5.&nbsp;&nbsp;&nbsp;&nbsp; 用1\+1=2 括起来的表示这是一个regex。</p>
<p>6.&nbsp;&nbsp;&nbsp;&nbsp; 举例会用以下格式：</p>
<p>&nbsp;</p>
<p>test<br>This is a test<br>会匹配test，testcase等</p>
<p><br>&nbsp;&nbsp; <br>2．正则表达式的起源<br>正则表达式的&#8220;祖先&#8221;可以一直上溯至对人类神经系统如何工作的早期研究。Warren McCulloch 和 Walter Pitts 这两位神经生理学家研究出一种数学方式来描述这些神经网络。</p>
<p>1956 年, 一位叫 Stephen Kleene 的美国数学家在 McCulloch 和 Pitts 早期工作的基础上，发表了一篇标题为&#8220;神经网事件的表示法&#8221;的论文，引入了正则表达式的概念。正则表达式就是用来描述他称为&#8220;正则集的代数&#8221;的表达式，因此采用&#8220;正则表达式&#8221;这个术语。 </p>
<p>随后，发现可以将这一工作应用于使用Ken Thompson 的计算搜索算法的一些早期研究，Ken Thompson是Unix 的主要发明人。正则表达式的第一个实用应用程序就是 Unix 中的qed 编辑器。从那时起直至现在正则表达式都是基于文本的编辑器和搜索工具中的一个重要部分。具有完整语法的正则表达式使用在字符的格式匹配方面上，后来被应用到熔融信息技术领域。自从那时起，正则表达式经过几个时期的发展，现在的标准已经被ISO(国际标准组织)批准和被Open Group组织认定。 </p>
<p>哇哈哈...不可天下人负我!!!<br>穷！机子天天蓝屏......<br>&nbsp; </p>
<p>&nbsp;<br>3. 正则表达式使用祥解<br>最简单的正则表达式相信大家都已熟悉并且经常使用，那就是文字字符串。特定的字符串可通过文字本身加以描述；像 test这样的Regex模式可精确匹配输入的字符串&#8221;test&#8221;，但是它也可以匹配this is a testcase，这就不是我们想要得结果。</p>
<p>当然，使用正则表达式匹配等于它自身的精确字符串是没有价值的实现，不能体现正则表达式的真正作用。但是，假如要查找的不是test，而是所有以字母 t 开头的单词，或所有4个字母的单词，那该怎么办？这超出了文字字符串的合理范围。所以我们才需要深入地研究正则表达式。</p>
<p>3.1基本语法<br>虽然正则表达式并非一门专用语言，但它也有一些特殊的规定，也可以称之为基本语法。</p>
<p>正则表达式是由普通字符（例如字符 a 到 z）以及特殊字符（称为元字符）组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板，将某个字符模式与所搜索的字符串进行匹配。</p>
<p>构造正则表达式的方法和创建数学表达式的方法一样。也就是用多种元字符与操作符将小的表达式结合在一起来创建更大的表达式。</p>
<p>可以通过在一对分隔符之间放入表达式模式的各种组件来构造一个正则表达式。</p>
<p>3.1.1普通字符<br>由所有那些未显式指定为元字符的打印和非打印字符组成。这包括所有的大写和小写字母字符，所有数字，所有标点符号以及一些符号。</p>
<p>3.1.2非打印字符<br>非打印字符也是普通字符，单独列出来便于参考。 </p>
<p>哇哈哈...不可天下人负我!!!<br>穷！机子天天蓝屏......<br>&nbsp; <br>非打印字符参考（有错大家矫正，JS手册都有）<br>\cx <br>匹配由x指明的控制字符。例如， \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则，将 c 视为一个原义的 'c' 字符。</p>
<p>\f <br>匹配一个换页符。等价于 \x0c 和 \cL。</p>
<p>\n <br>匹配一个换行符。等价于 \x0a 和 \cJ。</p>
<p>\r <br>匹配一个回车符。等价于 \x0d 和 \cM。</p>
<p>\s <br>匹配任何空白字符，包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。</p>
<p>\S <br>匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。</p>
<p>\t <br>匹配一个制表符。等价于 \x09 和 \cI。</p>
<p>\v <br>匹配一个垂直制表符。等价于 \x0b 和 \cK。</p>
<p>Regex中可以使用非打印字符。\t会匹配一个tab字符(ASC||)，\r 会匹配一个回车(0x0D)，\n 会匹配一个换行符(0x0A)。应该注意的是：Windows使用\r\n表示一行的结束，而UNIX使用\n 。</p>
<p>同样，我们可以在Regex中使用16进制的ASCⅡ码或者ANSI标准码。在拉丁语中，版权符号的代码是0xA9，所以我们也可以这样来匹配版权符号 \xA9 。另外一个匹配tab的写法是：\x09 。但是注意，第一位的&#8220;0&#8221;必须去掉。</p>
<p><br>特殊字符<br>特殊字符也叫做元字符，保留字符（Metacharactor），在Regex中表示特殊的意义，大部分的意思在不同的上下文中的意义是不同的，这里只列出最普遍的意义。</p>
<p>特殊字符共有11个：<br>$<br>匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性，则 $ 也匹配 '\n' 或 '\r'。要匹配 $ 字符本身，请使用 \$。</p>
<p>( )<br>标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符，请使用 \( 和 \)。</p>
<p>*<br>匹配前面的子表达式零次或多次。要匹配 * 字符，请使用 \*。</p>
<p>+<br>匹配前面的子表达式一次或多次。要匹配 + 字符，请使用 \+。</p>
<p>.<br>匹配除换行符 \n之外的任何单字符。要匹配 .，请使用 \。</p>
<p>[ <br>标记一个中括号表达式的开始。要匹配 [，请使用 \[。</p>
<p>?<br>匹配前面的子表达式零次或一次，或指明一个非贪婪限定符。要匹配 ? 字符，请使用 \?。</p>
<p>\<br>将下一个字符标记为或特殊字符、或原义字符、或反向引用、或八进制转义符。例如， 'n' 匹配字符 'n'。'\n' 匹配换行符。序列 '\\' 匹配 "\"，而 '\(' 则匹配 "("。</p>
<p>^<br>匹配输入字符串的开始位置，除非在方括号表达式中使用，此时它表示不接受该字符集合。要匹配 ^ 字符本身，请使用 \^。</p>
<p>{<br>标记限定符表达式的开始。要匹配 {，请使用 \{。</p>
<p>|<br>指明两项之间的一个选择。要匹配 |，请使用 \|。</p>
<p>在元字符前加 \ 转义符，可以把特殊字符当作普通字符来使用。</p>
<p>比如：如要要匹配 1+1=2 ，正确的正则表达式应该为1\+1=2。否则， + 会被当作特殊字符对待。</p>
<p>除了特殊字符，所有的其他字符都不应该加 \ 。因为 \ 也是一个特殊字符。\ 和普通字符组合在一起也可以创造一种特殊的意义。比如 \d 表示匹配所有的数字。</p>
<p>作为程序员，单引号和双引号不是特殊字符会也许让我们感到很惊讶。但这是正确的。因为我们在编程的时候，编程语言会知道引号之间的哪些字符表示特殊意义，编译器在把字符串x传递给regex解释引擎之前，会把它们处理成regex。比如，在C#中，如果我们要匹配 1\+1=2 ，在程序中我们要这样写： &#8220;1\\+1=2&#8221; ，C#编译器会把 &#8220;\\&#8221; ，处理为一个&#8220;\&#8221; 。同样，如果要匹配 C:\Temp ，首先，正则表达式要这样写 C:\\Temp，然后在程序中我们应该这样写：&#8220; C:\\\\temp&#8221;。 </p>
<p>哇哈哈...不可天下人负我!!!<br>穷！机子天天蓝屏......<br>&nbsp; <br>&nbsp;</p>
<p><br>3.1.4字符集<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 字符集描述了一组字符，Regex解释器会认为匹配字符集中的一个字符就可以认为匹配成功。</p>
<p>字符集用[ ]括起来即可。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 比如gr[ae]y就可以匹配gray或者grey。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 字符集只能匹配一个字符，gr[ae]y就不能和graey匹配。字符集中的字符顺序是任意的，得到的结果都是唯一的。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可以在字符集中用连字符&#8220;-&#8221;来表示一个范围。[0-9]的结果和[0123456789]的匹配结果都是相同的。字符集中的范围可以有多种。比如[0-9a-fA-F]表示匹配所有的16进制，包括大小写。也可以把范围和单个字符组合在一起用,[0-9a-fxA-FX]表示匹配所有的16进制或者一个字符X。字符集的顺序不会影响结果。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在字符集的开始标志&#8220;[&#8221;后面加上一个&#8220;^&#8221;符号，表示否定，表示匹配除字符集中定义的字符以外的所有字符。包括非打印字符和行结束符。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注意：字符集匹配的一个字符，而不是一个位置。所以。q[^u]的意义不是&#8220;q后面的字符不是u&#8221;。而是&#8220;q后面的字符可以是除了u以外的所有字符&#8221;。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; q[^u]不会和Iraq匹配。</p>
<p>但是会和Iraq is a country匹配，因为q后面的空格字符是一个&#8220;不是u的字符&#8221;。</p>
<p>3.1.5在字符集中使用元字符<br>字符集中的元字符只能是 &#8216;]&#8217;, &#8216;\&#8217;, &#8216;^&#8217;, 和 &#8216;-&#8216; 。</p>
<p>其他元字符在字符集中都失去了特殊意义，表示的只是一个普通字符。也不需要用加&#8220;\&#8221;。</p>
<p>比如：</p>
<p>匹配一个&#8220;*&#8221;或者&#8220;+&#8221;，用[*+]就足够了。即使给他们加上&#8220;\&#8221;，regex解释器也会把他们忽略掉。</p>
<p>&nbsp;</p>
<p>四种特殊字符的处理：</p>
<p>在字符集中要表示&#8220;]&#8221;，&#8220;^&#8221;和&#8220;-&#8221;需要在后面加上转义符&#8220;\&#8221;，来表示它们代表的分别是普通字符&#8220;]&#8221;，&#8220;^&#8221;和&#8220;-&#8221;。</p>
<p>也可以把它们放在一个不能表示特殊意义的位置，后一个方法比较好，因为他们不会影响可读性。</p>
<p>&#8220;^&#8221; <br>要想匹配一个&#8220;^&#8221;，可以把它放在除了紧跟&#8220;[&#8221;的任意一个位置。</p>
<p>Regex<br>String<br>Description</p>
<p>[x^]<br>A string with x and ^.<br>匹配x或者&#8220;^&#8221;</p>
<p>&nbsp;</p>
<p><br>&#8220;]&#8221; <br>可以把&#8220;]&#8221;放在紧跟着&#8220;[&#8221;的位置，或者使用否定字符集。</p>
<p>Regex<br>String<br>Description</p>
<p>[]x]<br>A string with x and ]<br>匹配x或者&#8220;]&#8221;</p>
<p>[^]x]<br>A string with x and ]<br>匹配除了x和&#8221;] &#8221;以外的所有字符</p>
<p><br>&#8220;\&#8221; <br>要想把&#8220;\&#8221;当作一个普通字符来匹配，而不是一个特殊字符，必须把&#8220;\&#8221;再用一个&#8220;\&#8221;括起来。</p>
<p><br>[\\x]<br>A string with x and \<br>匹配x或者&#8220;\&#8221;</p>
<p>&nbsp;</p>
<p><br>&#8220;-&#8221; <br>连字符可以放在紧跟着&#8220;[&#8221;的后面，或者正好&#8220;]&#8221;的前面，或者紧跟着&#8220;^&#8221;的后面。</p>
<p>&nbsp;</p>
<p>[-x]<br>A string with x and -<br>匹配x或者&#8220;-&#8221;</p>
<p>[x-]<br>A string with x and -<br>匹配x或者&#8220;-&#8221; </p>
<p>预定义字符集<br>因为很多字符集是经常使用的，所以Regex解释器预定义了一些常用字符集：</p>
<p>d<br>[0-9]<br>所有数字</p>
<p>\w<br>[a-zA-Z] <br>表示所有的字符，和文化字体有关</p>
<p>\s<br>[ \t\r\n] </p>
<p>空格，回车和tab。和文化字体有关</p>
<p>预订一字符集可以既可以用在字符集里面，也可以用在字符集外面。<br>\s\d<br>1&lt;space&gt;+&lt;space&gt;2&lt;space&gt;=&lt;space&gt;3<br>匹配后面紧跟着一个数字的空白符</p>
<p>[\s\d]<br>1&lt;space&gt;+&lt;space&gt;2&lt;space&gt;=&lt;space&gt;3<br>匹配一个单独的字符或者一个数字或者一个空白符</p>
<p>[\da-fA-F]和[0-9a-fA-F]的匹配结果是一样的。</p>
<p>&nbsp;</p>
<p>同样，在预定义字符集前面加一个&#8220;^&#8221;符号表示否定。它们也有预先定义好的表示：</p>
<p>\D<br>[^\d]<br>非数字</p>
<p>\W<br>[^\w] <br>非字符，和文化字体有关</p>
<p>\S<br>[^\s] <br>非空格，回车和tab。和文化字体有关</p>
<p>在&#8220;[]&#8221;使用否定预订一字符集时要特别心。[\D\S]不等于[^\d\s]。[^\d\s]会匹配除了数字和空白符以外的所有字符。而[\D\S]会匹配要么不是一个数字，要么是空白符。因为数字不是空白符，空白符也不是数字，所以[\D\S]会匹配任意的字符。</p>
<p>限定符<br>有时候不知道要匹配多少字符。为了能适应这种不确定性，正则表达式支持限定符的概念。这些限定符可以指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。</p>
<p>下表给出了各种限定符及其含义的说明：</p>
<p>* 匹配前面的子表达式零次或多次。例如，zo* 能匹配 "z" 以及 "zoo"。 * 等价于{0,}。 <br>+ 匹配前面的子表达式一次或多次。例如，'zo+' 能匹配 "zo" 以及 "zoo"，但不能匹配 "z"。+ 等价于 {1,}。 <br>? 匹配前面的子表达式零次或一次。例如，"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。 <br>{n} n 是一个非负整数。匹配确定的 n 次。例如，'o{2}' 不能匹配 "Bob" 中的 'o'，但是能匹配 "food" 中的两个 o。 <br>{n,} n 是一个非负整数。至少匹配n 次。例如，'o{2,}' 不能匹配 "Bob" 中的 'o'，但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。 <br>{n,m} m 和 n 均为非负整数，其中n &lt;= m。最少匹配 n 次且最多匹配 m 次。刘， "o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。 <br>对一个很大的输入文档而言，章节数很轻易就超过九章，因此需要有一种方法来处理两位数或者三位数的章节号。限定符就提供了这个功能。下面的JScript 正则表达式可以匹配具有任何位数的章节标题：</p>
<p>/Chapter [1-9][0-9]*/<br>下面的 VBScript 正则表达式执行同样的匹配：</p>
<p>"Chapter [1-9][0-9]*"<br>请注意限定符出现在范围表达式之后。因此，它将应用于所包含的整个范围表达式，在本例中，只指定了从 0 到 9 的数字。</p>
<p>这里没有使用 '+' 限定符，因为第二位或后续位置上并不一定需要一个数字。同样也没有使用 '?' 字符，因为这将把章节数限制为只有两位数字。在 'Chapter' 和空格字符之后至少要匹配一个数字。</p>
<p>如果已知章节数限制只有99 章，则可以使用下面的 JScript 表达式来指定至少有一位数字，但不超过两个数字。</p>
<p>/Chapter [0-9]{1,2}/<br>对 VBScript 可以使用下述正则表达式：</p>
<p>"Chapter [0-9]{1,2}"<br>上述表达式的缺点是如果有一个章节号大于 99，它仍只会匹配前两位数字。另一个缺点是某些人可以创建一个 Chapter 0，而且仍能匹配。一个更好的用来匹配两位数的 JScript 表达式如下：</p>
<p>/Chapter [1-9][0-9]?/<br>或者</p>
<p>/Chapter [1-9][0-9]{0,1}/<br>对 VBScript 而言，下述表达式与上面等价：</p>
<p>"Chapter [1-9][0-9]?"<br>或者</p>
<p>"Chapter [1-9][0-9]{0,1}"<br>'*'、 '+'和 '?' 限定符都称之为贪婪的，也就是说，他们尽可能多地匹配文字。有时这根本就不是所希望发生的情况。有时则正好希望最小匹配。 </p>
<p>例如，你可能要搜索一个 HTML 文档来查找一处包含在 H1 标记中的章节标题。在文档中该文字可能具有如下形式：</p>
<p>&lt;H1&gt;Chapter 1 &#8211; Introduction to Regular Expressions&lt;/H1&gt;<br>下面的表达式匹配从开始的小于号 (&lt;) 到 H1 标记结束处的大于号之间的所有内容。</p>
<p>/&lt;.*&gt;/<br>VBScript 的正则表达式为：</p>
<p>"&lt;.*&gt;"<br>如果所要匹配的就是开始的 H1 标记，则下述非贪婪地表达式就只匹配 &lt;H1&gt;。</p>
<p>/&lt;.*?&gt;/<br>或者</p>
<p>"&lt;.*?&gt;"<br>通过在 '*'、 '+' 或 '?' 限定符后放置 '?'，该表达式就从贪婪匹配转为了非贪婪或最小匹配。 <br></p>
<img src ="http://www.cnitblog.com/aliyiyi08/aggbug/27793.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/aliyiyi08/" target="_blank">阿里爸爸</a> 2007-05-30 20:00 <a href="http://www.cnitblog.com/aliyiyi08/archive/2007/05/30/27793.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转一篇非常好的MySQL优化的文章 </title><link>http://www.cnitblog.com/aliyiyi08/archive/2007/05/19/27272.html</link><dc:creator>阿里爸爸</dc:creator><author>阿里爸爸</author><pubDate>Sat, 19 May 2007 11:22:00 GMT</pubDate><guid>http://www.cnitblog.com/aliyiyi08/archive/2007/05/19/27272.html</guid><wfw:comment>http://www.cnitblog.com/aliyiyi08/comments/27272.html</wfw:comment><comments>http://www.cnitblog.com/aliyiyi08/archive/2007/05/19/27272.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnitblog.com/aliyiyi08/comments/commentRss/27272.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/aliyiyi08/services/trackbacks/27272.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一、我们可以且应该优化什么？ <br><br>硬件 <br><br>操作系统/软件库 <br><br>SQL服务器(设置和查询) <br><br>应用编程接口(API) <br><br>应用程序 <br><br><br>-------------------------------------------------------------------------------- <br><br>二、优化硬件 <br><br>如果你需要庞大的数据库表(>2G)，你应该考虑使用64位的硬件结构，像Alpha、Sparc或即将推出的IA64。因为MySQL内部使用大量64位的整数，64位的CPU将提供更好的性能。 <br><br>对大数据库，优化的次序一般是RAM、快速硬盘、CPU能力。 <br><br>更多的内存通过将最常用的键码页面存放在内存中可以加速键码的更新。 <br><br>如果不使用事务安全(transaction-safe)的表或有大表并且想避免长文件检查，一台UPS就能够在电源故障时让系统安全关闭。 <br><br>对于数据库&nbsp;&nbsp;<a href='http://www.cnitblog.com/aliyiyi08/archive/2007/05/19/27272.html'>阅读全文</a><img src ="http://www.cnitblog.com/aliyiyi08/aggbug/27272.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/aliyiyi08/" target="_blank">阿里爸爸</a> 2007-05-19 19:22 <a href="http://www.cnitblog.com/aliyiyi08/archive/2007/05/19/27272.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>初步了解Bindows是什么[转]</title><link>http://www.cnitblog.com/aliyiyi08/archive/2007/05/10/26814.html</link><dc:creator>阿里爸爸</dc:creator><author>阿里爸爸</author><pubDate>Thu, 10 May 2007 02:25:00 GMT</pubDate><guid>http://www.cnitblog.com/aliyiyi08/archive/2007/05/10/26814.html</guid><wfw:comment>http://www.cnitblog.com/aliyiyi08/comments/26814.html</wfw:comment><comments>http://www.cnitblog.com/aliyiyi08/archive/2007/05/10/26814.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/aliyiyi08/comments/commentRss/26814.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/aliyiyi08/services/trackbacks/26814.html</trackback:ping><description><![CDATA[<p><font face=Arial>通过 Bindows&#8482;，你可以开发Web页面中的全功能桌面应用程序，而无需任何插件。不论你是喜欢严格地按照最优方法进行 OOP，还是喜欢最近比较流行的 RAD，Bindows&#8482; 都为你提供了开发高效灵活的 Rich Internet Applications 的工具。 </font></p>
<p><font face=Arial>Bindows&#8482; 框架提供：</font></p>
<p><font face=Arial>基于类的面向对象 API； <br>一个完整的窗口系统，带有一组广泛支持的窗体小部件，包括菜单、表单、表格、滑块、量表以及更多； <br>开发零接触 SOA 客户端应用程序的最好的工具包； <br>内置 XML，SOAP 和 XML-RPC 支持； <br>从单用户到企业级的支持。 <br>&#8220;富&#8221;&#8220;瘦&#8221;兼备</font></p>
<p><font face=Arial>Bindows 突破了你必须要在富（界面）和瘦（客户端）之间选择的典范。<br>Bindows 应用程序可以如现代任何桌面应用程序一样华丽同时又极其瘦小（并且是零接触）。Bindows 应用程序是：</font></p>
<p><font face=Arial>华丽的，可定制的，有着桌面般的 GUI 组件 <br>运行于标准的浏览器中而无需任何安装的（零接触） <br>无需专门的客户端，运行时引擎，或者插件 <br>无依赖性</font></p>
<p><font face=Arial>Bindows 应用程序不依赖于：</font></p>
<p><font face=Arial>服务器 —— 任何服务器（Java，.NET，PHP 等都可以与 Bindows 结合使用） <br>后端平台 —— 任何后端硬件和后端软件 <br>操作系统 —— 客户端可以使用任何操作系统（只要它包含一个支持的浏览器） <br>语言 —— 所有的语言都支持。Bindows 支持 Unicode <br>浏览器 —— 大部分浏览器都支持（比如：Internet Explorer 5.5 及其更高版本，Mozilla 1.4 及其更高版本，Netscape 7.1 及其更高版本，Firefox，K-Meleon 和 Camino） </font></p>
<p><font face=Arial>Bindows 软件开发工具包（SDK）</font></p>
<p><font face=Arial>Bindows 是一个用来编写安全健壮的 Rich Internet Applications 的软件开发工具包（SDK）。Bindows 平台为瘦 Web 客户端提供了丰富的功能。Bindows 应用程序无需终端用户下载 —— 真正的零接触（不使用 Java、Flash 或者 ActiveX）</font></p>
<p><font face=Arial>XML 和 Web Services </font></p>
<p><font face=Arial>Bindows 应用程序通过 XML 文档来定义，并且支持标准的 SOAP Web Services. </font></p>
<p><font face=Arial>Bindows 开发环境</font></p>
<p><font face=Arial>支持企业级项目 <br>跨浏览器、跨平台支持 <br>不依赖于服务器的构架 <br>可以与新的和已存在的资源协同工作 <br>有统一的开发方式 </font></p>
<p><font face=Arial>Rich Internet Applications (RIA)</font></p>
<p><font face=Arial>Rich Internet Applications 将现代 PC 桌面程序般的界面与基于 Internet 的构架相结合，使得通过 Internet 浏览器访问到的程序拥有桌面软件一样的功能。RIA 允许 Web 站点在无需终端用户下载的情况下提供复杂的数据处理并有着快速的反应时间。</font></p>
<br><a href="http://news.csdn.net/n/20061221/99746.html">原文</a> 
<img src ="http://www.cnitblog.com/aliyiyi08/aggbug/26814.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/aliyiyi08/" target="_blank">阿里爸爸</a> 2007-05-10 10:25 <a href="http://www.cnitblog.com/aliyiyi08/archive/2007/05/10/26814.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Sun第三财季盈利 存储表现欠佳</title><link>http://www.cnitblog.com/aliyiyi08/archive/2007/05/02/26572.html</link><dc:creator>阿里爸爸</dc:creator><author>阿里爸爸</author><pubDate>Wed, 02 May 2007 04:59:00 GMT</pubDate><guid>http://www.cnitblog.com/aliyiyi08/archive/2007/05/02/26572.html</guid><wfw:comment>http://www.cnitblog.com/aliyiyi08/comments/26572.html</wfw:comment><comments>http://www.cnitblog.com/aliyiyi08/archive/2007/05/02/26572.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/aliyiyi08/comments/commentRss/26572.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/aliyiyi08/services/trackbacks/26572.html</trackback:ping><description><![CDATA[今天，Sun报告说公司第三季度继续赢利，尽管存储产品的表现持续欠佳。<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp; 根据GAAP计算，Sun公司在这一季度净利润为6700万美元，每股收益2美分，这一业绩好于去年同期，2006财年第三季度，Sun的净亏损为2.17亿美元，每股亏损6美分。此前，分析师们估计该公司每股的收益会达1美分。<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp; Sun公司这一财季的收入是32.83亿美元，比去年同期增长3.3%，但未能达到分析师此前预期的34.2亿美元。<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp; Sun公司数据管理部门的收入，包括存储，共计5.5亿美元，同比下降0.2%，致使CEO Jonathan Schwartz在电话会议上抱怨说：&#8220;我们的存储业务有所进步，但表现没有达到预期。&#8221;<br>&nbsp;&nbsp;<br>&nbsp;&nbsp; &nbsp;该业绩表明，Sun 还在为它的存储产品做着不懈的努力。该公司已经用41亿美元收购了StorageTek，去年一直在不断改进它的存储业务。<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp; 尽管Sun公司的存储业务表现不佳，但它的归档产品和磁带产品表现不错，公司 CEO Jonathan Schwartz希望通过最近的开放其公司NAS源码的决定会扭转目前的局面。他说：&#8220;我们会继续开发Solaris，不只是在系统方面，还包括存储方面。&#8221;<br>&nbsp;&nbsp;<br>&nbsp;&nbsp; &nbsp;CEO Jonathan Schwartz还抱怨美国和英国这一财季的业绩。他说：&#8220;我们预计第三季度只是季节性的问题----我们在美国和英国的市场处于困境，尤其是三月份。&#8221;<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp; Sun公司CFO Mike Lehman 也打算避开财务问题，也解释说是季节性问题，用户延迟购买他们的产品是因为Sun最近与日本富士通的合作。他说：&#8220;三月的这一季度一直是一个季节性问题。&#8221;&#8220;销售速度放缓是上星期Sun与富士通宣布会提供更高性能产品的必然结果。&#8221;<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp; 针对目前的情况，有分析师说，经历了重大调整的Sun可能正计划做出更大的变动。他说：&#8220;我们正密切关注Sun工作人员的一举一动。&#8221;<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp; Sun还介绍了它的新产品计划，这一周，该公司正计划推出它的第一个与视频有关的产品，该产品兼具服务器与存储的功能。它是一款新的刀片产品，兼备Intel, AMD, 和 Sun公司自己的SPARC处理器，将在六月份面市，命名为&#8220;Constellation&#8221;。<br>&nbsp;&nbsp;<br>&nbsp;&nbsp; 在随后的交易中，Sun股票下跌36美分，跌至5.59美元，跌幅为6.06%。 <a href="http://www.dostor.com/t/finance/2007-04-26/0002932681.shtml">原文</a> 
<img src ="http://www.cnitblog.com/aliyiyi08/aggbug/26572.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/aliyiyi08/" target="_blank">阿里爸爸</a> 2007-05-02 12:59 <a href="http://www.cnitblog.com/aliyiyi08/archive/2007/05/02/26572.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>程序员不能不看的好文章[精转]</title><link>http://www.cnitblog.com/aliyiyi08/archive/2007/04/30/26414.html</link><dc:creator>阿里爸爸</dc:creator><author>阿里爸爸</author><pubDate>Sun, 29 Apr 2007 17:31:00 GMT</pubDate><guid>http://www.cnitblog.com/aliyiyi08/archive/2007/04/30/26414.html</guid><wfw:comment>http://www.cnitblog.com/aliyiyi08/comments/26414.html</wfw:comment><comments>http://www.cnitblog.com/aliyiyi08/archive/2007/04/30/26414.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnitblog.com/aliyiyi08/comments/commentRss/26414.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/aliyiyi08/services/trackbacks/26414.html</trackback:ping><description><![CDATA[[转贴]学编程的人不能不看的好文章 [精华]&nbsp; 摘自中国java开发网<br><br>看了下面的这篇文章，深有感触，枣子碰到的问题也是我们大多数程序员的通病，也许我们大多数人都只是在做一些比较小型的软件，对软件运行的效率不在乎，就算对速度和效率在乎的也可能是一些在数据库操作方面的。大家看完了，也许会有很多感想，但这只是我同意枣子的个人观点。<br>(枣子原创--www.vcroad.net wutao8@263.net)<br>做为一名大四的学生,我面试过不少的单位，有成功的也有失败的，但是对我来说所有的失败在某种意义上都是一种成功，特别是我下面写的这些，写这篇文章的时候，我已经签了南京的一家软件公司，但是想起今年2月21日我面试苏州台湾的IT公司的经历联想到我们现在<br>学习编程的一些情况我真的深有感触，这次面试使我深深的体会到了失败但也收获了很多。我要说的将分成三部分，1.是<br>我面试的具体经过2.是由面试想到的3.现今我应该做的。当然这些话很大程度上是我个人的意见，不可能完全得到大家的赞同，所以<br>在某些观点上如果哪位朋友觉得跟我的有很大出入，请不要介意，也不要对我攻击，就当我没有说过，欢迎和我联系共同探讨这些问题！我的EMAIL:wutao8@263.net<br>1.面试经过<br>大约在年前我接到了台湾瑞晟(Realtek)苏州公司的面试通知，通知我2月21日到苏州工业园区面试，接到面试后的几天我把一些专业<br>课温习了一遍，特别是C++和数据结构，由于大学几年里，我一直专研这些方面，加上通过了高级程序员的考试，对于一些常用的算法<br>我差不多也达到了烂熟于胸的地步，当时的感觉是如果问了我这些方面的问题我应该是没有问题的！<br>21日那天我被安排在4：30面试，由一位技术人员单独给我面试，在问了一些简单的问题之后他给我出了一道编程题目，题目是这样的：<br>(由于具体面试的题目比较烦琐，我将其核心思想提取出来分解成了两个独立的简单的问题，有可能问题分解的不当，请大家见谅，实际面试了一个的问题但比其复杂很多，而且涉及一些高等数学变换)<br>1) 写一个函数计算当参数为n(n很大)时的值 1-2+3-4+5-6+7......+n<br>哼，我的心里冷笑一声！没想到这么简单，我有点紧张的心情顿时放松起来！<br>于是很快我给出我的解法：<br>long fn(long n)<br>{<br>long temp=0;<br>int i,flag=1;<br>if(n&lt;=0)<br>{<br>printf("error: n must &gt; 0);<br>exit(1);<br>}<br>for(i=1;i&lt;=n;i++)<br>{<br>temp=temp+flag*i;<br>flag=(-1)*flag;<br>}<br>return temp;<br>}<br>搞定！当我用期待的目光看着面试官的时候，他微笑着跟我说，执行结果肯定是没有问题！但当n很大的时候我这个程序执行效率很低，<br>在嵌入式系统的开发中，程序的运行效率很重要，能让CPU少执行一条指令都是好的，他让我看看这个程序还有什么可以修改的地方，<br>把程序优化一下！听了这些话，我的心情当时变的有点沉重，没想到他的要求很严格，之后我对程序进行了严格的分析，给出了改进了的方案！<br>long fn(long n)<br>{<br>long temp=0;<br>int j=1,i=1,flag=1;<br>if(n&lt;=0)<br>{<br>printf("error: n must &gt; 0);<br>exit(1);<br>}<br>while(j&lt;=n)<br>{<br>temp=temp+i;<br>i=-i;<br>i&gt;0?i++:i--;<br>j++;<br>}<br>return temp;<br>}<br>虽然我不敢保证我这个算法是最优的，但是比起上一个程序，我将所有涉及到乘法指令的语句改为执行加法指令，既达到要题目的要求而且<br>运算时间上缩短了很多！而代价仅仅是增加了一个整型变量！但是我现在的信心已经受了一点打击，我将信将疑的看者面试官，他还是微笑着<br>跟我说：&#8220;不错，这个程序确实在效率上有的很大的提高！&#8221;我心里一阵暗喜！但他接着说这个程序仍然不能达到他的要求，要我给出更优的<br>方案！天啊！还有优化！我当时真的有点崩溃了，想了一会后，我请求他给出他的方案！然后他很爽快的给出了他的程序！<br>long fn(long n)<br>{<br>if(n&lt;=0)<br>{<br>printf("error: n must &gt; 0);<br>exit(1);<br>}<br>if(0==n%2)<br>return (n/2)*(-1);<br>else<br>return (n/2)*(-1)+n;<br>}<br><br>搞笑，当时我目瞪口呆，没想到他是这个意思，这么简单的代码我真的不会写吗，但是我为什么没有往那方面上想呢！他说的没有错，在n很大很大的时候这三个程序运行时间的差别简直是天壤之别！当我刚想开口说点什么的时候，他却先开口了：&#8220;不要认为CPU运算速度快就把所有的问题都推给它去做，程序员应该将代码优化再优化，我们自己能做的决不要让CPU做，因为CPU是为用户服务的，不是为我们<br>程序员服务的！&#8221;多么精辟的语言，我已经不想再说什么了！接着是第二个问题：<br>2),他要求我用一种技巧性的编程方法来用一个函数实现两个函数的功能n为如：fn1(n)=n/2!+n/3!+n/4!+n/5!+n/6!<br>fn2(n)=n/5!+n/6!+n/7!+n/8!+n/9! 现在用一个函数fn(int n,int flag)实现，当flag为0时，实现fn1功能，如果flag为1时<br>实现fn2功能！他的要求还是效率，效率，效率！说实在话，如果我心情好的话我应该能给出一种比较好的算法，但我那时真的没有什么心思<br>再想了，我在纸上胡乱画了一些诸如6!=6*5!的公式后直截了当的跟他说要他给出他的答案！面试官也没有说什么，给出了他的思路：<br>定义一个二维数组 float t[2][5]存入[2!,3!,4!,5!,6!},{5!,6!,7!,8!,9!]然后给出一个循环：<br><br>for(i=0;i&lt;6;i++)<br>{<br>temp=temp+n/t[flag];<br>}<br>最后得到计算值！呵呵，典型的空间换时间的算法！<br>这些总共花了50分钟的时间，还有十分钟我就跟他很随意的聊聊天，聊了一些编程以及生活的问题，那时的我已经很放松了，<br>因为我知道这次面试结果只有一个：失败。5:30的时候面试官要我等通知，于是我离开了他们公司。这就是面试的整个经过！<br><br>2.由面试想到的<br><br>真的是很失败啊！我记得那天下好大的雨，气温也很低，我边走边想，从5:30一直走到7:30，全身都湿透了，又冷又饿，但是我只是一直走，脑子里面充满了疑惑，我也想让雨把自己淋醒！看到这里有些朋友可能觉得那些面试题目不算什么如果让自己做的话肯定能全部答对，我肯定相信你，因为我从未怀疑过中国程序员的能力，我认为中国有世界上最好的程序员，我也从未认为自己是高手，所以我做不出来不代表中国程序员比台湾或者别的地方的程序员差，所以我就从我的角度，我的所见所想来谈一些感想：<br><br>不错全世界都有优秀的程序员，中国也不例外，但是我疑惑的是：到底中国和台湾或者国外的优秀的程序员的比例到底是多少？台湾我不知道，中国100个程序员里有几个是优秀的呢?我根本算不上，从上面的表现就足以说明一切了！是1个？5个？10个？50个？这个数字我不敢乱猜，恐遭网友一顿痛骂，那么我们国内有多少人学习计算机呢？拿我们学校来说，计算机97级4个班，98级5个班，99级10个班，2000级 17个班，人多了，老师怎么办？我们学校的做法是让研究生上课，然后呢？补考一抓一大把，大把大把的补考费落入了学校的口袋，还说现在的学生素质低！真是好笑，我都不知道学校这么做是为了什么，为国内培养大量的程序员吗？学生们能真正学到计算机知识吗？好了，我敢讲，在我们学校学习编程学生和优秀程序员 (注意我指的是优秀，只会编几个糟烂程序的人算不上)的比例应该是100:0.1<br>在这种比例下虽然我们中国学习编程的人铺天盖地，但是想想有多少个人能真正为中国软件业发展作出贡献，有多少人能真正写出优秀的程序名扬海外！<br><br>我从学习编程以来，不管是自学还是老师指导，从来都是解决问题就好，编出程序来就行，我的疑惑是：我们有真正的强调过程序的效率，程序的质量吗？我们有仔细分析过我们写的东西，看看有没有可以改进的地方，看看有没有简单的方法来达到同样的目的呢？我问心自问，我发现，我从来没有对我写出来的程序进行过优化，最多就是进行详细的测试，然后Debug，但是这就足够了吗？这些天我偶尔发现我曾经写过的一个游戏，那是一年前我刚加入www.vcroad.net做为其中一员时候，感觉应该拿点东西出来，然后花了一个星期的时间写出来的！程序不算复杂，但是用到了不少数据结构的东西，也用到了一些精彩的算法，加上 windows的界面和游戏的可玩性，写完后受到了不少好评，我当时真的很佩服自己！但是现在看呢：没有一句注释，好多丑陋的函数名比如：void chushihua()，好多没有必要的变量，可以用简单语句完成工作的我使用华丽的算法，大量使用全局变量.....,说不好听的话，六百多行的程序除了能运行之外就是一陀屎！如果一年前我能听到一些反面意见的话，大概我能早一点觉悟，但是自从原代码在网站发布以来听到的都是赞美之词，没有一个人向我提出程序改进的意见，这又说明了一个什么问题呢？很值得思考啊！<br><br>还有一个疑惑是：我们说的和做的真的一样吗？我在学校的时候曾经受学院指派承办过一个计算机大赛，请了一个老师出决赛的题目，主要是一些算法题目，这个老师可能是我上大学以来唯一敬佩的老师了，从程序调试到打分，对于每个程序都仔细分析其时间效率和空间效率，然后综合打分，四十个人的卷子，老师从下午三点一直调试到晚上十点，在有些写的精彩的语句后还加上批注。我真是高兴很遇到这样的老师并且和他做深入的交流，但在事后，却发生了一件不愉快的事，在比赛中获得第二名的学生找到我，说他程序全部调试成功应该给他满分，并且应该得第一，我说不过他，最后调出了他的原程序和第一名的原程序对比，不错，两个程序都运行的很好，这时，那个同学开口了：&#8220;我的程序写的十分简捷明了，仅仅数行就完成了题目要求，而他的却写了一大堆，为什么给他的分多过给我的分。&#8221;我当时很是气愤，如果不是老师负责的话，那么现在第一名和第二名的位置真的要互调了，拜托，不是程序的行数越少程序的质量就越高，我记得我跟他大谈这方面的道理，最后说服他了！哈哈，但是我，只能说说而已，我不知道还有多少人一样，说起来头头是道，但心里却压根就从未重视过它！<br><br>3.我打算做的！<br>其实那天我想到的远不止上面那么多，但是我不想再说了，因为我猜想看这篇文章的网友大概都有一肚子的感想，一肚子的抱怨，借用这篇文章发泄可不是我想达到的目的，在上面我把自己骂的一文不值也不是妄自菲薄，但是在某些方面我真的做错了，或者说是偏离了正确方向，现在是矫正方向和重整旗鼓的时候了，就象我前面说过的，我相信中国有世界上最好的程序员，我也相信我的水平不会一直保持现状，我现在就收拾起牢骚真正的实干起来！<br>真的很巧，就写到这里的时候我在网上偶尔发现了这篇手册，我不知道这预示着什么，但是我想如果我照下面这个基本原则一直踏实做下去，我一定会实现我的理想---一名优秀的软件设计师!<br><br>（下面这些文字不是我的原创，是我偶尔在网上发现的，我真的很幸运能看到这些，这篇文章也随着下面的文字而结束，我真心的希望您能从这篇文章中得到启发,这篇文章欢迎大家随意转载，您可以不写作者是谁，但是请您写上www.vcroad.net原创，谢谢您的支持）<br><br>作者：金蝶中间件公司CTO袁红岗<br><br>不知不觉做软件已经做了十年，有成功的喜悦，也有失败的痛苦，但总不敢称自己是高手，因为和我心目中真正的高手们比起来，还差的太远。世界上并没有成为高手的捷径，但一些基本原则是可以遵循的。<br><br>　　1. 扎实的基础。数据结构、离散数学、编译原理，这些是所有计算机科学的基础，如果不掌握他们，很难写出高水平的程序。据我的观察，学计算机专业的人比学其他专业的人更能写出高质量的软件。程序人人都会写，但当你发现写到一定程度很难再提高的时候，就应该想想是不是要回过头来学学这些最基本的理论。不要一开始就去学OOP，即使你再精通OOP，遇到一些基本算法的时候可能也会束手无策。<br><br>　　2. 丰富的想象力。不要拘泥于固定的思维方式，遇到问题的时候要多想几种解决问题的方案，试试别人从没想过的方法。丰富的想象力是建立在丰富的知识的基础上，除计算机以外，多涉猎其他的学科，比如天文、物理、数学等等。另外，多看科幻电影也是一个很好的途径。<br><br>　　3. 最简单的是最好的。这也许是所有科学都遵循的一条准则，如此复杂的质能互换原理在爱因斯坦眼里不过是一个简单得不能再简单的公式：E=mc2。简单的方法更容易被人理解，更容易实现，也更容易维护。遇到问题时要优先考虑最简单的方案，只有简单方案不能满足要求时再考虑复杂的方案。<br><br>　　 4. 不钻牛角尖。当你遇到障碍的时候，不妨暂时远离电脑，看看窗外的风景，听听轻音乐，和朋友聊聊天。当我遇到难题的时候会去玩游戏，而且是那种极暴力的打斗类游戏，当负责游戏的那部分大脑细胞极度亢奋的时候，负责编程的那部分大脑细胞就得到了充分的休息。当重新开始工作的时候，我会发现那些难题现在竟然可以迎刃而解。<br><br>　　5. 对答案的渴求。人类自然科学的发展史就是一个渴求得到答案的过程，即使只能知道答案的一小部分也值得我们去付出。只要你坚定信念，一定要找到问题的答案，你才会付出精力去探索，即使最后没有得到答案，在过程中你也会学到很多东西。<br><br>　　6. 多与别人交流。三人行必有我师，也许在一次和别人不经意的谈话中，就可以迸出灵感的火花。多上上网，看看别人对同一问题的看法，会给你很大的启发。<br><br>　　7. 良好的编程风格。注意养成良好的习惯，代码的缩进编排，变量的命名规则要始终保持一致。大家都知道如何排除代码中错误，却往往忽视了对注释的排错。注释是程序的一个重要组成部分，它可以使你的代码更容易理解，而如果代码已经清楚地表达了你的思想，就不必再加注释了，如果注释和代码不一致，那就更加糟糕。<br><br>　　8. 韧性和毅力。这也许是"高手"和一般程序员最大的区别。A good programming is 99 weat and 1ffee。高手们并不是天才，他们是在无数个日日夜夜中磨练出来的。成功能给我们带来无比的喜悦，但过程却是无比的枯燥乏味。你不妨做个测试，找个 10000以内的素数表，把它们全都抄下来，然后再检查三遍，如果能够不间断地完成这一工作，你就可以满足这一条。<br>
<img src ="http://www.cnitblog.com/aliyiyi08/aggbug/26414.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/aliyiyi08/" target="_blank">阿里爸爸</a> 2007-04-30 01:31 <a href="http://www.cnitblog.com/aliyiyi08/archive/2007/04/30/26414.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CrazyEgg: 新型访问统计工具</title><link>http://www.cnitblog.com/aliyiyi08/archive/2007/04/27/26261.html</link><dc:creator>阿里爸爸</dc:creator><author>阿里爸爸</author><pubDate>Fri, 27 Apr 2007 05:46:00 GMT</pubDate><guid>http://www.cnitblog.com/aliyiyi08/archive/2007/04/27/26261.html</guid><wfw:comment>http://www.cnitblog.com/aliyiyi08/comments/26261.html</wfw:comment><comments>http://www.cnitblog.com/aliyiyi08/archive/2007/04/27/26261.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/aliyiyi08/comments/commentRss/26261.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/aliyiyi08/services/trackbacks/26261.html</trackback:ping><description><![CDATA[<a href="http://www.crazyegg.com/"><u><font color=#0000ff><br><br>crazyegg</font></u></a> 的广告已经有大半年了，应该有很多人已经把那个广告都看烦了，疯狂的鸡蛋目的和其它的站点统计工具不太一样，他会提供一个页面的地图，上面显示各个链接被点击的次数，以此帮助我们选择最有效的投放广告的区域，最热门的链接，改善模板，调整布局，etc。而 crazyegg 漂亮的页面设计也应该算是他们的一大卖点。对于 crazyegg 另外两个功能 <a href="http://crazyegg.com/images/list.jpg"><u><font color=#0000ff>list</font></u></a>（不支持中文）和 <a href="http://crazyegg.com/images/heatmap.jpg"><u><font color=#0000ff>heatmap</font></u></a> 我感觉用处并不是很大。
<div style="WIDTH: 240px; TEXT-ALIGN: right"><a title="Zooomr :: Photo Sharing" href="http://beta.zooomr.com/photos/12771@Z01/157153/"><img style="BORDER-RIGHT: #000 1px solid; BORDER-TOP: #000 1px solid; BORDER-LEFT: #000 1px solid; BORDER-BOTTOM: #000 1px solid" height=146 alt="Crazy Egg — Reports1156432348871" src="http://static.zooomr.com/images/d3e56657de9186b109f88bd9aaa72985fbbca7bd.jpg" width=240></a></div>
<p>遗憾的是 crazyegg 的免费用户每月只有可怜区区 5000 的访问数可用，想没有拘束的用下去只有花钱了 <img class=wp-smiley alt=:( src="http://www.dancemoon.net/wp-includes/images/smilies/icon_sad.gif"> </p>
<p>其实 <a href="http://www.google.com/analytics/zh-CN/"><u><font color=#0000ff>Google Analyetics</font></u></a> 早就提供了这个功能，就在内容优化-&gt;导航分析-&gt;网站覆盖图，可不知道什么原因，这个功能被他们做的很不完善，很多链接都没有被统计，用着很不舒服，现在可以勉强用 crazyegg 代替了:p</p>
<img src ="http://www.cnitblog.com/aliyiyi08/aggbug/26261.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/aliyiyi08/" target="_blank">阿里爸爸</a> 2007-04-27 13:46 <a href="http://www.cnitblog.com/aliyiyi08/archive/2007/04/27/26261.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开源软件的几种版权</title><link>http://www.cnitblog.com/aliyiyi08/archive/2007/04/25/26150.html</link><dc:creator>阿里爸爸</dc:creator><author>阿里爸爸</author><pubDate>Tue, 24 Apr 2007 16:26:00 GMT</pubDate><guid>http://www.cnitblog.com/aliyiyi08/archive/2007/04/25/26150.html</guid><wfw:comment>http://www.cnitblog.com/aliyiyi08/comments/26150.html</wfw:comment><comments>http://www.cnitblog.com/aliyiyi08/archive/2007/04/25/26150.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/aliyiyi08/comments/commentRss/26150.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/aliyiyi08/services/trackbacks/26150.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 　　自由/开源软件是一种有版权的软件，自由/开源软件是一种得到许可的软件。自由/开源软件许可协议(或许可证)是其版权实施的延伸。<br><br>　　自由/开源软件采用“左版”(CopyLeft)的概念，虽然其“版权”也应考虑到保护“作者对其作品享有权益”的作用，但由于自由开源运动的本质是发扬“自由、开放精神”，把重点放在扩大用户的自由和权益方面，放在用户在再传播(或再发布)时得到扩大的许可授权方面，而不是把重点放在对作者特权的保护方面(如表现为不收版权费，任何人都可自由获得、复制、修改、发布原创作品或升级产品的源代码，淡化作者的特权，甚至“模糊”可执行的“版权”，总之由原作者放弃自己的一些知识产权的权利，向公众公布许可等)。它不同于传统“版权”(即“右版”，CopyRight)在“保护作者对作品享有法定特权”方面所表现的刚性化的特征。<br><br>　　自由/开源软件的版权理论上属于原创软件作品的作者(writers、authors、developers)，以及升级软件作品的后续修改者(贡献者Contributors，志愿者Volunteers)，总称为所有者(owners)。&nbsp;&nbsp;<a href='http://www.cnitblog.com/aliyiyi08/archive/2007/04/25/26150.html'>阅读全文</a><img src ="http://www.cnitblog.com/aliyiyi08/aggbug/26150.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/aliyiyi08/" target="_blank">阿里爸爸</a> 2007-04-25 00:26 <a href="http://www.cnitblog.com/aliyiyi08/archive/2007/04/25/26150.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>