Archive for 十一月, 2007

To install Zend Optimizer on UNIX Variants

Posted by 机器人 on 25th 十一月 2007 in linux/server

install

1. The ZendOptimizer is available free of charge,download from websit:

http://www.zend.com/en/products/guard/downloads

2.Open a terminal window and change dir to the directory in which the Zend Optimizer package was saved. To untar the package use the command:

[root@localhost ~]# tar zxvf '/root/Desktop/ZendOptimizer-3.3.0a-linux-glibc21-i386.tar.gz'

 

3. From the extracted package’s directory, type the following command:

[root@localhost ZendOptimizer-3.3.0a-linux-glibc21-i386]# ./install

The installer is launched.

3. Follow the instrucions in the installer.

These instructions define the basic system configurations necessary for installing the Zend Optimizer, such as the Web Server in use and the location of theh php.ini or apachectrl(defalut at /usr/sbin/apachectrl),

4. If for some reason. the graphical installation will not start or is illegiable, use the command:./install-tty which is useful on low-end terminals such as when installing on a remote server via SSH/TELnet.".

The text only installation starts.

important note:

 

To install uninstall Zend Optimizer,you must be logged in with administrator/root permissions

uninstall

In order to uninstall Optimizer:

1. Replace the php.ini file with the backed up copy (php.ini-zend_optimizer.bak).

2.Delete the Optimizer installation directory.

3. Restart the Web Server.

Important note:

 

If you have other Zend products installed under the same directory.
do not delete the installation directory.In this case.you should only change the php.ini file

 

installation Verification

This program makes use of the Zend scripting language engine.

Use the php function:phpinfo() to verify a successful installation,as shown in the following script:

<?php
    phpinfo();
?>

The part of the output where the Zend Optimizer is listed looks similar to this:

 

Zend Engine vX.Y.Z, copyright (c) 1998-2006, Zend Technologies Ltd.,
with the Zend Optimizer vX.Y.Z, copyright (c) 1998-2006 Zend Technologies
Ltd.

机器人 2007-9-25 11:16 于北京 Sunday November 16 2007. robot at Beijing.

 

linux 主机硬盘的规划

Posted by 机器人 on 20th 十一月 2007 in linux/server
  1. 最简单的划分方法:在安装LINUX的过程中,至少要有两个分区,一个是“/",另一个则是虚拟内存"swap".如果硬盘很少,那么,使用这种分区方法会比较好,但是,这是一种不太安全的划分方式,因为一旦系统损坏,那么我们的数据就很难再找回。
  2. 稍麻烦的方式:在默认情况下,由于LINUX的操作系统都在/usr/中,所以,可以将这部分划分得大一占。另外,由于用户的信息都在/home下,这个也可以大一些,而/var下面记录的是所有默认服务器的登录文件,且邮件与WWW默认的路径也在/var下,因此这个空间规划大一些。需要的目录如下:
    1. /
    2. /usr
    3. /home
    4. Swap.

机器人 2007-11-20 于 北京

SVN服务器安装文档

Posted by 机器人 on 15th 十一月 2007 in 未分类

SVN服务器安装文档

2007-11-15

1.       下载

Window svn二进制安装包:

http://hqlong.com/admin/main.php?admin_action=admin_post&post_action=admin_post_add

2.       下载ZIP包,解压《本机解压到c:》将C:\svn\bin目录添加到环境变量中。

3.       C:\svn\bin目录下的mod_dav_svn.somod_authz_svn.so复制到apachemodules目录下.

4.       修改apache配置文件。将:

   #LoadModule dav_module modules/mod_dav.so

    #LoadModule dav_fs_module modules/mod_dav_fs.so

    去掉前面的#,然后所有LoadModule的后面添加下面两行

    LoadModule dav_svn_module modules/mod_dav_svn.so

LoadModule authz_svn_module modules/mod_authz_svn.so

重启apache

5.       建立源码仓库

 

6.       添加权限认证

 

7.       sdfa

 

 

 

参考资料:http://blog.csdn.net/bluelazyboy/archive/2007/01/26/1495115.aspx

http://www.subversion.org.cn/svnbook/1.2/svn-book.html#svn.ref.svn.c.import

www.hqlong.com终于把你给注册了

Posted by 机器人 on 15th 十一月 2007 in mylife

其实很早以前就想注册自己的域名,但一直都没有去。

在google刚推出gmail时,去申请我们gmail邮箱时,发现hqlong@gmail.com这个ID已经被注册掉了,当时就有种似乎本该属于自己的网络资源就再也不可能属于自己,而遗憾的感觉,可能有的朋友会说不就是一个ID吗?这个被注册了,再换一个就行了呗,可是话虽这样说,但我们可以假设一下。如果哪天互联网上出现了很多和你同名的ID,但确大多数是别人,你会有什么样的感觉。或者再来一个比较具体的例子:假设你在网上的ID叫test,如果我那天想给你发封邮件,但由于记不清你是的E-MAIL,很可能我会想当然的认为你的是test@phpoo.cn,而这时,但当你在注册test@phpoo.cn这个邮箱时,却发现被别人已经注册了,而这时你可能会选择一个test2008@phpoo.cn,如果这样,那么收到我给我邮件的人将会是别人,而不是你。。

所以在互联网上的ID号也是一种资源,一但被别人占有,那么就标志着你将失去它,当年麦当劳去注册http://www.mcdonalds.com,却发现已经一个叫mcdnalds的人给作为个人主页给注册了,最后不得不花费800万巨资当其收回,当然,举这个例子的目的并不是想将hqlong.com注册了,将来升值,在这里只是作一个比方,说明网络资源的重要。

其实本来今天也没有下定决心买www.hqlong.com这个域名,当我去搜索www.hqlong.cn时,发现在几分钟当已经被人给注册了,这里突然有种说不出的危机感,似乎感觉到下一分钟.com这个已将被别人注册。所以就毫不忧虑的将www.hqlong.com给注册了。

总算把hqlong.com给搬回家了,说来,这事还得感觉注册hqlong.cn的那位朋友,如果今天他不注册这个域名,很可能我还不会下决心,没准明天或者后天这两个自己梦寐以求的域名将这辈子和我无缘。。

总算有惊无险。

现在大家访问www.hqlong.com hqlong.com blog.hqlong.com都将指向到我现在的hqlong.phpoo.cn.

hqlong.phpoo.cn这个域名我也将长期使用,因为它见证着我过去的成长。

机器人 2007-11-15 于 北京。

富有神奇魅力的罗马数字

Posted by 机器人 on 14th 十一月 2007 in 未分类

载自:diveintopyton

你可能经常看到罗马数字,即使你没有意识到它们。你可能曾经在老电影或者电视中看到它们 (“版权所有 MCMXLVI” 而不是 “版权所有1946”),或者在某图书馆或某大学的贡献墙上看到它们 (“成立于 MDCCCLXXXVIII”而不是“成立于1888”)。你也可能在某些文献的大纲或者目录上看到它们。这是一个表示数字的系统,它实际上能够追溯到远古的罗马帝国 (因此而得名)。

在罗马数字中,利用7个不同字母进行重复或者组合来表达各式各样的数字。

* I = 1

* V = 5

* X = 10

* L = 50

* C = 100

* D = 500

* M = 1000

下面是关于构造罗马数字的一些通用的规则的介绍:

* 字符是叠加的。I 表示 1,II 表示 2,而 III 表示 3。VI 表示 6 (字面上为逐字符相加,“5 加 1”),VII 表示 7,VIII 表示 8。

* 含十字符 (I、X、C 和 M) 至多可以重复三次。对于 4,你则需要利用下一个最大的含五字符进行减操作得到:你不能把 4 表示成 IIII,而应表示为 IV (“比 5 小 1”)。数字 40 写成 XL (比 50 小 10),41 写成 XLI,42 写成 XLII,43 写成 XLIII,而 44 写成 XLIV (比 50 小 10,然后比 5 小1)。

* 类似地,对于数字 9,你必须利用下一个含十字符进行减操作得到:8 表示为 VIII,而 9 则表示为 IX (比 10 小 1),而不是 VIIII (因为字符 I 不能连续重复四次)。数字 90 表示为 XC,900 表示为 CM。

* 含五字符不能重复。数字 10 常表示为X,而从来不用VV来表示。数字 100 常表示为C,也从来不表示为 LL。

* 罗马数字一般从高位到低位书写,从左到右阅读,因此不同顺序的字符意义大不相同。DC 表示 600;而 CD 是一个完全不同的数字 (为 400,也就是比 500 小100)。CI 表示 101;而IC 甚至不是一个合法的罗马字母 (因为你不能直接从数字100减去1;这需要写成 XCIX,意思是比 100 小 10,然后加上数字 9,也就是比 10 小 1的数字)。

机器人 2007年11月14日 21:45 于 北京

MySQL 5.0 新特性教程 存储过程(整理)

Posted by 机器人 on 9th 十一月 2007 in mysql

MySQL 5.0 新特性教程 存储过程

Variables 变量

在复合语句中声明变量的指令是DECLARE。

(1) Example with two DECLARE statements

两个DECLARE语句的例子

CREATE PROCEDURE p8 ()
BEGIN
    DECLARE a INT;
    DECLARE b INT;
    SET a = 5;
    SET b = 5;
    INSERT INTO t VALUES (a);
    SELECT s1 * a FROM t WHERE s1 >= b;
END; // /* I won't CALL this */

在过程中定义的变量并不是真正的定义,你只是在BEGIN/END块内定义了而已(译注:也就是形参)。

注意这些变量和会话变量不一样,不能使用修饰符@你必须清楚的在BEGIN/END块中声明变量和它们的类型。

变量一旦声明,你就能在任何能使用会话变量、文字、列名的地方使用。

  (2) Example with no DEFAULT clause and SET statement

  没有默认子句和设定语句的例子

CREATE PROCEDURE p9 ()
BEGIN
    DECLARE a INT /* there is no DEFAULT clause */;
    DECLARE b INT /* there is no DEFAULT clause */;
    SET a = 5; /* there is a SET statement */
    SET b = 5; /* there is a SET statement */
    INSERT INTO t VALUES (a);
    SELECT s1 * a FROM t WHERE s1 >= b;
END; // /* I won't CALL this */

 

有很多初始化变量的方法。如果没有默认的子句,那么变量的初始值为NULL。你可以在任何时候使用SET语句给变量赋值。

  (3) Example with DEFAULT clause

  含有DEFAULT子句的例子

CREATE PROCEDURE p10 ()
BEGIN
    DECLARE a, b INT DEFAULT 5;
    INSERT INTO t VALUES (a);
    SELECT s1 * a FROM t WHERE s1 >= b;
END; //

我们在这里做了一些改变,但是结果还是一样的。在这里使用了DEFAULT子句来设定初始值,这就不需要把DECLARE和SET语句的实现分开了。

  (4) Example of CALL

  调用的例子

mysql> CALL p10() //
+--------+ 
| s1 * a |
+--------+ 
| 25 |
| 25 |
+--------+ 
2 rows in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)

  结果显示了过程能正常工作

  (5) Scope

作用域

mysql> CALL p11()//
+-------+ 
| x1 |
+-------+ 
| inner |
+-------+ 
+-------+ 
| x1 |
+-------+ 
| outer |
+-------+ 

现在我们来讨论一下作用域的问题。例子中有嵌套的BEGIN/END块,当然这是合法的。同时包含两个变量,名字都是x1,这样也是合法的。内部的变量在其作用域内享有更高的优先权。

当执行到END语句时,内部变量消失,此时已经在其作用域外,变量不再可见了,因此在存储过程外再也不能找到这个声明了的变量,但是你可以通过OUT参数或者将其值指派 给会话变量来保存其值。

  调用作用域例子的过程: 

mysql> CALL p11()//
+-------+ 
| x1 |
+-------+ 
| inner |
+-------+ 
+-------+ 
| x1 |
+-------+ 
| outer |
+-------+ 

  我们看到的结果时第一个SELECT语句检索到最内层的变量,第二个检索到第二层的变量

Conditions and IF-THEN-ELSE 条件式和IF-THEN-ELSE

  1.

  现在我们可以写一些包含条件式的例子:

CREATE PROCEDURE p12 (IN parameter1 INT)
BEGIN
    DECLARE variable1 INT;
    SET variable1 = parameter1 + 1;
    IF variable1 = 0 THEN
        INSERT INTO t VALUES (17);
    END IF;
    IF parameter1 = 0 THEN
        UPDATE t SET s1 = s1 + 1;
    ELSE
        UPDATE t SET s1 = s1 + 2;
    END IF;
END; //

  这里是一个包含IF语句的过程。里面有两个IF语句,一个是IF语句END IF,另一个是IF语句ELSE语句END IF。我们可以在这里使用复杂的过程,但我会尽量使其简单让你能更容易弄清楚。

  2. 

CALL p12 (0) //

  我们调用这个过程,传入值为0,这样parameter1的值将为0。

  3.

CREATE PROCEDURE p12 (IN parameter1 INT)
BEGIN
    DECLARE variable1 INT;
    SET variable1 = parameter1 + 1; <-- 
    IF variable1 = 0 THEN
        INSERT INTO t VALUES (17);
    END IF;
    IF parameter1 = 0 THEN
        UPDATE t SET s1 = s1 + 1;
    ELSE
        UPDATE t SET s1 = s1 + 2;
    END IF;
END; //

  这里变量variable1被赋值为parameter1加1的值,所以执行后变量variable1为1。

  4.

CREATE PROCEDURE p12 (IN parameter1 INT)
BEGIN
    DECLARE variable1 INT;
    SET variable1 = parameter1 + 1;
    IF variable1 = 0 THEN <-- 
        INSERT INTO t VALUES (17);
    END IF;
    IF parameter1 = 0 THEN
        UPDATE t SET s1 = s1 + 1;
    ELSE
        UPDATE t SET s1 = s1 + 2;
    END IF;
END; //

因为变量variable1值为1,因此条件"if variable1 = 0"为假,

IF

……

END IF

  被跳过,没有被执行。

  5.

  到第二个IF条件,判断结果为真,于是中间语句被执行了

  6.

CREATE PROCEDURE p12 (IN parameter1 INT)
BEGIN
    DECLARE variable1 INT;
    SET variable1 = parameter1 + 1;
    IF variable1 = 0 THEN
        INSERT INTO t VALUES (17);
    END IF;
    IF parameter1 = 0 THEN
        UPDATE t SET s1 = s1 + 1; <-- 
    ELSE
        UPDATE t SET s1 = s1 + 2;
    END IF;
END; //

因为参数parameter1值等于0,UPDATE语句被执行。如果parameter1值为NULL,则下一条UPDATE语句将被执行现在表t中有两行,他们都包含值5,所以如果我们调用p12,两行的值会变成6。

  7.

mysql> CALL p12(0)//
Query OK, 2 rows affected (0.28 sec)
mysql> SELECT * FROM t//
+------+ 
| s1 |
+------+ 
| 6 |
| 6 |
+------+ 
2 rows in set (0.01 sec)

  结果也是我们所期望的那样。

CASE 指令

  1.

CREATE PROCEDURE p13 (IN parameter1 INT)
BEGIN
    DECLARE variable1 INT;
    SET variable1 = parameter1 + 1;
    CASE variable1
    WHEN 0 THEN INSERT INTO t VALUES (17);
    WHEN 1 THEN INSERT INTO t VALUES (18);
    ELSE INSERT INTO t VALUES (19);
    END CASE;
END; //

  如果需要进行更多条件真假的判断我们可以使用CASE语句。CASE语句使用和IF一样简单。

  我们可以参考上面的例子:

 2.

mysql> select * from t; //
+------+ 
| s1 |
+------+ 
....
| 0 |
| 1 |
| 2 |
| 3 |
| 4 |
+------+ 
9 rows in set (0.00 sec)

  执行过程后,传入值1,如上面例子,值19被插入到表t中。

  Question

  问题

  问题: CALL p13(NULL) //的作用是什么?

  另一个:这个CALL语句做了那些动作?

  你可以通过执行后观察SELECT做了什么,也可以根据代码判断,在5秒内做出。

  Answer

  答案

mysql> CALL p13(NULL)//
Query OK, 1 row affected (0.00 sec)
mysql> SELECT * FROM t//
+------+ 
| s1 |
+------+ 
| 6 |
| 6 |
| 19 |
| 19 |
+------+ 
4 rows in set (0.00 sec)

  答案是当你调用p13时,MySQL插入了另一条包含数值19的记录。原因是变量variable1的值为NULL,CASE语句的ELSE部分就被执行了。希望这对大家有意义。如果你回答不出来,没有问题,我们可以继续向下走。

Loops 循环语句

WHILE … END WHILE

LOOP … END LOOP

REPEAT … END REPEAT

GOTO

  下面我们将会创建一些循环。我们有三种标准的循环方式:

  WHILE循环,LOOP循环以及REPEAT循环。还有一种非标准的循环方式:GO TO(译者语:最好不要用吧,用了就使流程混乱)。

WHILE ... END WHILE
CREATE PROCEDURE p14 ()
BEGIN
    DECLARE v INT;
    SET v = 0;
    WHILE v < 5 DO
        INSERT INTO t VALUES (v);
        SET v = v + 1;
    END WHILE;
END; //

  这是WHILE循环的方式。我很喜欢这种方式,它跟IF语句相似,因此不需要掌握很多新的语法。这里的INSERT和SET语句在WHILE和END WHILE之间,当变量v大于5的时候循环将会退出。使用

"SET v = 0;"

  语句使为了防止一个常见的错误,如果没有初始化,默认变量值为NULL,而NULL和任何值操作结果都为NULL。

WHILE … END WHILE example

mysql> CALL p14()// 

Query OK, 1 row affected (0.00 sec)

  以上就是调用过程p14的结果不用关注系统返回是"one row affected"还是"five rows affected",因为这里的计数只对最后一个INSERT动作进行计数。

WHILE … END WHILE example: CALL

mysql> select * from t; //
+------+ 
| s1 |
+------+ 
....
| 0 |
| 1 |
| 2 |
| 3 |
| 4 |
+------+ 
9 rows in set (0.00 sec)

  调用后可以看到程序向数据库中插入了5行。

REPEAT … END REPEAT

CREATE PROCEDURE p15 ()
BEGIN
    DECLARE v INT;
    SET v = 0;
    REPEAT
        INSERT INTO t VALUES (v);
        SET v = v + 1;
        UNTIL v >= 5
    END REPEAT;
END; //

这是一个REPEAT循环的例子,功能和前面WHILE循环一样。区别在于它在执行后检查结果,而WHILE则是执行前检查。(译者语:可能等同于DO WHILE吧)

REPEAT … END REPEAT: look at the UNTIL: UNTIL的作用

  注意到UNTIL语句后面没有分号,在这里可以不写分号,当然你加上额外的分号更好。

  REPEAT … END REPEAT: calling :调用

mysql> CALL p15()//
Query OK, 1 row affected (0.00 sec)
mysql> SELECT COUNT(*) FROM t//
+----------+ 
| COUNT(*) |
+----------+ 
| 14 |
+----------+ 
1 row in set (0.00 sec)

  我们可以看到调用p15过程后又插入了5行记录

LOOP … END LOOP

CREATE PROCEDURE p16 ()
BEGIN
    DECLARE v INT;
    SET v = 0;
    loop_label: LOOP
    INSERT INTO t VALUES (v);
    SET v = v + 1;
    IF v >= 5 THEN
        LEAVE loop_label;
    END IF;
    END LOOP;
END; //

  以上是LOOP循环的例子。

LOOP循环不需要初始条件,这点和WHILE循环相似,同时它又和REPEAT循环一样也不需要结束条件。

  LOOP … END LOOP: with IF and LEAVE 包含IF和LEAVE的LOOP循环

CREATE PROCEDURE p16 ()
BEGIN
    DECLARE v INT;
    SET v = 0;
    loop_label: LOOP
        INSERT INTO t VALUES (v);
        SET v = v + 1;
        IF v >= 5 THEN <-- 
            LEAVE loop_label;
        END IF;
    END LOOP;
END; //

  在循环内部加入IF语句,在IF语句中包含LEAVE语句。这里LEAVE语句的意义是离开循环。

  LEAVE的语法是LEAVE加循环语句标号,关于循环语句的标号问题我会在后面进一步讲解。

  LOOP … END LOOP: calling :调用

mysql> CALL p16()//
Query OK, 1 row affected (0.00 sec)
mysql> SELECT COUNT(*) FROM t//
+----------+ 
| COUNT(*) |
+----------+ 
| 19 |
+----------+ 
1 row in set (0.00 sec)

  调用过程p16后,结果是另5行被插入表t中。

abels 标号

CREATE PROCEDURE p17 ()
label_1: BEGIN
label_2: WHILE 0 = 1 DO LEAVE label_2; END
WHILE;
label_3: REPEAT LEAVE label_3; UNTIL 0 =0
END REPEAT;
label_4: LOOP LEAVE label_4; END LOOP;
END; //

  最后一个循环例子中我使用了语句标号。现在这里有一个包含4个语句标号的过程的例子。我们可以在BEGIN、WHILE、REPEAT或者LOOP语句前使用语句标号,语句标号只能在合法的语句前面使用。因此"LEAVE label_3"意味着离开语句标号名定义为label_3的语句或复合语句。

End Labels 标号结束符 

CREATE PROCEDURE p18 ()
label_1: BEGIN
label_2: WHILE 0 = 1 DO LEAVE label_2; END
WHILE label_2;
label_3: REPEAT LEAVE label_3; UNTIL 0 =0
END REPEAT label_3 ;
label_4: LOOP LEAVE label_4; END LOOP
label_4 ;
END label_1 ; //

  你也可以在语句结束时使用语句标号,和在开头时使用一样。这些标号结束符并不是十分有用。

  它们是可选的。如果你需要,他们必须和开始定义的标号名字一样当然为了有良好的编程习惯,方便他人阅读,最好还是使用标号结束符。

LEAVE and Labels 跳出和标号

CREATE PROCEDURE p19 (parameter1 CHAR)
label_1: BEGIN
    label_2: BEGIN
        label_3: BEGIN
            IF parameter1 IS NOT NULL THEN
                IF parameter1 = 'a' THEN
                    LEAVE label_1;
                    ELSE BEGIN
                        IF parameter1 = 'b' THEN
                            LEAVE label_2;
                            ELSE
                            LEAVE label_3;
                        END IF;
                    END;
                END IF;
            END IF;
        END;
    END;
END;//
LEAVE

  语句使程序跳出复杂的复合语句。

ITERATE

  迭代如果目标是ITERATE(迭代)语句的话,就必须用到LEAVE语句

CREATE PROCEDURE p20 ()
BEGIN
    DECLARE v INT;
    SET v = 0;
    loop_label: LOOP
    IF v = 3 THEN
        SET v = v + 1;
        ITERATE loop_label;
    END IF;
    INSERT INTO t VALUES (v);
    SET v = v + 1;
    IF v >= 5 THEN
        LEAVE loop_label;
    END IF;
END LOOP;

  (迭代)语句和LEAVE语句一样也是在循环内部的循环引用,它有点像C语言中的“Continue”,同样它可以出现在复合语句中,引用复合语句标号,ITERATE(迭代)意思是重新开始复合语句。

  那我们启动并观察下面这个循环,这是个需要迭代过程的循环:

ITERATE: Walking through the loop

深入循环

CREATE PROCEDURE p20 ()
BEGIN
    DECLARE v INT;
    SET v = 0;
    loop_label: LOOP <-- 
    IF v = 3 THEN
        SET v = v + 1;
        ITERATE loop_label;
    END IF;
    INSERT INTO t VALUES (v);
    SET v = v + 1;
    IF v >= 5 THEN
        LEAVE loop_label;
    END IF;
END LOOP; 

END; //

  让这个已经定义了标号的循环运行起来。

ITERATE: Walking through the loop

CREATE PROCEDURE p20 ()
BEGIN
    DECLARE v INT;
    SET v = 0;
    loop_label: LOOP
    IF v = 3 THEN <-- 
        SET v = v + 1;
        ITERATE loop_label;
    END IF;
    INSERT INTO t VALUES (v);
    SET v = v + 1;
    IF v >= 5 THEN
        LEAVE loop_label;
    END IF;
    END LOOP;
END; //

v的值变成3,然后我们把它增加到4。

CREATE PROCEDURE p20 ()
BEGIN
    DECLARE v INT;
    SET v = 0;
    loop_label: LOOP
    IF v = 3 THEN
        SET v = v + 1;
        ITERATE loop_label; <-- 
    END IF;
    INSERT INTO t VALUES (v);
    SET v = v + 1;
    IF v >= 5 THEN
        LEAVE loop_label;
    END IF;
    END LOOP;
END; //

ITERATE: walking through the loop

CREATE PROCEDURE p20 ()
BEGIN
    DECLARE v INT;
    SET v = 0;
    loop_label: LOOP <-- 
    IF v = 3 THEN
        SET v = v + 1;
        ITERATE loop_label;
    END IF;
    INSERT INTO t VALUES (v);
    SET v = v + 1;
    IF v >= 5 THEN
        LEAVE loop_label;
    END IF;
    END LOOP;
END; //

  然后开始ITERATE(迭代)过程。

ITERATE: walking through the loop

CREATE PROCEDURE p20 ()
BEGIN
    DECLARE v INT;
    SET v = 0;
    loop_label: LOOP <-- 
    IF v = 3 THEN
        SET v = v + 1;
        ITERATE loop_label;
    END IF;
    INSERT INTO t VALUES (v);
    SET v = v + 1;
    IF v >= 5 THEN
        LEAVE loop_label;
    END IF;
    END LOOP;
END; //

这里的ITERATE(迭代)让循环又回到了循环的头部。

ITERATE: walking through the loop

CREATE PROCEDURE p20 ()
BEGIN
    DECLARE v INT;
    SET v = 0;
    loop_label: LOOP
    IF v = 3 THEN
        SET v = v + 1;
        ITERATE loop_label;
    END IF;
    INSERT INTO t VALUES (v);
    SET v = v + 1;
    IF v >= 5 THEN
        LEAVE loop_label; <-- 
    END IF;
END LOOP; 

END; //

  当v的值变为5时,程序将执行LEAVE语句

ITERATE: walking through the loop

CREATE PROCEDURE p20 ()
BEGIN
    DECLARE v INT;
    SET v = 0;
    loop_label: LOOP
    IF v = 3 THEN
        SET v = v + 1;
        ITERATE loop_label;
    END IF;
    INSERT INTO t VALUES (v);
    SET v = v + 1;
    IF v >= 5 THEN
        LEAVE loop_label;
    END IF;
END LOOP; 

END; // <-- 

LEAVE的结果就是跳出循环,使运行指令到达复合语句的最后一步。

GOTO
CREATE PROCEDURE p...
BEGIN
...
LABEL label_name;
...
GOTO label_name;
...
END;

  MySQL的存储过程中可以使用GOTO语句。虽然这不是标准SQL语句,而且在这里建立标号的方法也和惯例中的不一样。由于为了和其他DBMS兼容,这个语句会慢被淘汰,所以我们在MySQL参考手册中没有提及。

Grand combination

大组合 

CREATE PROCEDURE p21
(IN parameter_1 INT, OUT parameter_2 INT)
LANGUAGE SQL DETERMINISTIC SQL SECURITY INVOKER
BEGIN
    DECLARE v INT;
    label goto_label; start_label: LOOP
    IF v = v THEN LEAVE start_label;
    ELSE ITERATE start_label;
    END IF;
    END LOOP start_label;
    REPEAT
        WHILE 1 = 0 DO BEGIN END;
        END WHILE;
        UNTIL v = v;
    END REPEAT;
    GOTO goto_label;
END;//

  上面例子中的语句包含了我们之前讲的所有语法,包括参数列表,特性参数,BEGIN/END块复合语句,变量声明,IF,WHILE,LOOP,REPEAT,LEAVE,ITERATE,GOTO。这是一个荒谬的存储过程,我不会运行它,因为里面有无尽的循环。但是里面的语法却十分合法。这些是新的流程控制和变量声明语句。下面我们将要接触更多新的东西。

机器人 2007-11-9(整理) 于 北京

文件格式类(收藏)

Posted by 机器人 on 8th 十一月 2007 in php/javascript

文件格式类(收藏)

 

$mime_types = array(
    'gif' => 'image/gif',
    'jpg' => 'image/jpeg',
    'jpeg' => 'image/jpeg',
    'jpe' => 'image/jpeg',
    'bmp' => 'image/bmp',
    'png' => 'image/png',
    'tif' => 'image/tiff',
    'tiff' => 'image/tiff',
    'pict' => 'image/x-pict',
    'pic' => 'image/x-pict',
    'pct' => 'image/x-pict',
    'tif' => 'image/tiff',
    'tiff' => 'image/tiff',
    'psd' => 'image/x-photoshop', 

    'swf' => 'application/x-shockwave-flash',
    'js' => 'application/x-javascript',
    'pdf' => 'application/pdf',
    'ps' => 'application/postscript',
    'eps' => 'application/postscript',
    'ai' => 'application/postscript',
    'wmf' => 'application/x-msmetafile', 

    'css' => 'text/css',
    'htm' => 'text/html',
    'html' => 'text/html',
    'txt' => 'text/plain',
    'xml' => 'text/xml',
    'wml' => 'text/wml',
    'wbmp' => 'image/vnd.wap.wbmp', 

    'mid' => 'audio/midi',
    'wav' => 'audio/wav',
    'mp3' => 'audio/mpeg',
    'mp2' => 'audio/mpeg', 

    'avi' => 'video/x-msvideo',
    'mpeg' => 'video/mpeg',
    'mpg' => 'video/mpeg',
    'qt' => 'video/quicktime',
    'mov' => 'video/quicktime', 

    'lha' => 'application/x-lha',
    'lzh' => 'application/x-lha',
    'z' => 'application/x-compress',
    'gtar' => 'application/x-gtar',
    'gz' => 'application/x-gzip',
    'gzip' => 'application/x-gzip',
    'tgz' => 'application/x-gzip',
    'tar' => 'application/x-tar',
    'bz2' => 'application/bzip2',
    'zip' => 'application/zip',
    'arj' => 'application/x-arj',
    'rar' => 'application/x-rar-compressed', 

    'hqx' => 'application/mac-binhex40',
    'sit' => 'application/x-stuffit',
    'bin' => 'application/x-macbinary', 

    'uu' => 'text/x-uuencode',
    'uue' => 'text/x-uuencode', 

    'latex'=> 'application/x-latex',
    'ltx' => 'application/x-latex',
    'tcl' => 'application/x-tcl', 

    'pgp' => 'application/pgp',
    'asc' => 'application/pgp',
    'exe' => 'application/x-msdownload',
    'doc' => 'application/msword',
    'rtf' => 'application/rtf',
    'xls' => 'application/vnd.ms-excel',
    'ppt' => 'application/vnd.ms-powerpoint',
    'mdb' => 'application/x-msaccess',
    'wri' => 'application/x-mswrite',
);

机器人 2007-11-8 于 北京

 

一个这样的问题的解决方法(载自phpoo讨论区)

Posted by 机器人 on 5th 十一月 2007 in phpoo

问题见:http://bbs.phpexp.cn/viewthread.php?tid=87&extra=page%3D1&authorid=0&page=1

这个问题的详细讨论大家可以参见我们的讨论区,如上地址。

现在我就来谈谈我的解题思路吧,当然,在我们的版块里,杨煌也给出了一种解决这类问题的方法,不过,如果你不仔细看,可以会被他的思路给绕进去,那人的解决思路一般都比较邪门,要看懂,你可能还得要多花费几分钟时间才行。

我的思路如下:

为了解决这样的问题,我们首先要想一下,什么样的数据才行让我们很方便的在外部输出我们想要的格式,只要把这问题给解决了,那么这题也就解决了1/3了。

我们要输出的格式如下:

1.中华人民共和国中华人民共和国  (大标题)

     1).中华人民共和国中华人民共和国(小标题)

     2).中华人民共和国中华人民共和国

     3).中华人民共和国中华人民共和国

2.中华人民共和国中华人民共和国

     1).中华人民共和国中华人民共和国

     2).中华人民共和国中华人民共和国

     3).中华人民共和国中华人民共和国

3.中华人民共和国中华人民共和国

     1).中华人民共和国中华人民共和国

     2).中华人民共和国中华人民共和国

     3).中华人民共和国中华人民共和国

如果要实现这样的效果,我们可以使用如下数据结构来完成该循环。。

 

<?php
    $a = array(
    'AAAAAAAAAA'    =>    array(
         'aaaaaaaaaa',
         'bbbbbbbbbb',
         'cccccccccc'
         ),
    'BBBBBBBBB'    =>    array(
         'aaaaaaaaaa',
         'bbbbbbbbbb',
         'cccccccccc'
         ),
    'CCCCCCCCC'    =>    array(
         'aaaaaaaaaa',
         'bbbbbbbbbb',
         'cccccccccc'
         )
    );

    foreach ($a as $k => $v) {
        echo $k.'<br>';
        if(is_array($v)) {
            foreach($v as $key => $val) {
                echo '&nbsp;&nbsp;'.$val.'<br>';
            }
        }
        echo '<br>';
    }
?>

运行效果如下:

 

AAAAAAAAAA
  aaaaaaaaaa
  bbbbbbbbbb
  cccccccccc

BBBBBBBBB
  aaaaaaaaaa
  bbbbbbbbbb
  cccccccccc

CCCCCCCCC
  aaaaaaaaaa
  bbbbbbbbbb
  cccccccccc

这样,就可以实现我们的效果。但是,这里的

$a = array(
    'AAAAAAAAAA'    =>    array(
         'aaaaaaaaaa',
         'bbbbbbbbbb',
         'cccccccccc'
         ),
    'BBBBBBBBB'    =>    array(
         'aaaaaaaaaa',
         'bbbbbbbbbb',
         'cccccccccc'
         ),
    'CCCCCCCCC'    =>    array(
         'aaaaaaaaaa',
         'bbbbbbbbbb',
         'cccccccccc'
         )
    );

这样的数据结构是我们人为构造的,所以这时,我们就得想办法,将数据库里的数据加工成这种格式,如果这一步完成,那么我们就成功了,所以这里的轮换是个关键点。

从数据库我们查询到的数据格式一般为:

big small
中国 中国北京
中国 中国台湾
美国 美国纽约

那么我们怎么转换它们了,在这里,大家一般不要想的太多,如果你把问题想复杂了,那么这问题就很难解决了,这里我们只需要巧妙的运行一下数据的键和值,那么这样的问题也就迎刃而解了。

我的方法如下:

 

$sql = "SELECT  a.Title AS big,b.Title AS small
                FROM largeTitle AS a  LEFT JOIN smallTitle AS b ON a.ID=b.LlargeID";
    $a = array();
    //大家注意頙的代码

    $r = mysql_query($sql);

    while ( $arr = mysql_fetch_array($r) ) {
        $a[$arr['big']] = $arr['small'];
    }

    //$a 现在已经是我们所需要的数据结构了

呵呵,上面的while()循环里的数组,大家是不是现在被吃了一大惊。。

所以,解决问题里,不在于解决方法的复杂度,而在于方法的巧妙度,用最简单的方法解决最复杂的问题。。

好了,看奋斗了。看一集就睡觉。。

机器人 2007-11-5 9:55 于 北京

呵呵,终于找到了吃早餐的地儿了。

Posted by 机器人 on 2nd 十一月 2007 in mylife

上班这么久,每天早上都为吃早餐发愁,为了能吃上早饭,早上宁愿换乘,也不愿意坐直达,为了就是能在换乘公交站那里买一点早餐,虽然工作地方比较繁华,唯一不足的地方就是找不到一个吃早饭的地儿。

昨天由于停水,所以公司没有提供午饭,早就听说地下室有餐厅,可一直没有去找,虽然我有一次下去找了,但发现下面全是车库,也就打消了这个念头,昨天可不一样,我们依然来找到了车库,但发现下面有很多人,也不知道他们是干嘛就,就跟着过去了,越过车库,眼前一亮,居然餐厅在那边。。

今天早上和生往常一样,来的比较早,就去了楼下的餐厅吃了一顿。

清单如下:

  一个鸡蛋

四个包子

一碗豆浆

一碗蛋炒饭

还有一碗粥。

够丰富了吧。

你闪猜多少钱??

|

|

|

|

|

|

答案揭晓: 3元自助餐。这么多年了,吃就最丰富的一餐可能就要算这一餐了。。

现在8:33了,快工作了。。不多说了。。

 

机器人 2007-11-2 8:33 于 北京

Mysql常用函数列表(收藏)

Posted by 机器人 on 1st 十一月 2007 in mysql

载自:http://blog.chinaunix.net/u/1222/showart_162319.html

HARSET(str) //返回字串字符集

CONCAT (string2  [,... ]) //连接字串

INSTR (string ,substring ) //返回substring首次在string中出现的位置,不存在返回0

LCASE (string2 ) //转换成小写

LEFT (string2 ,length ) //从string2中的左边起取length个字符

LENGTH (string ) //string长度

LOAD_FILE (file_name ) //从文件读取内容

LOCATE (substring , string  [,start_position ] ) 同INSTR,但可指定开始位置

LPAD (string2 ,length ,pad ) //重复用pad加在string开头,直到字串长度为length

LTRIM (string2 ) //去除前端空格

REPEAT (string2 ,count ) //重复count次

REPLACE (str ,search_str ,replace_str ) //在str中用replace_str替换search_str

RPAD (string2 ,length ,pad) //在str后用pad补充,直到长度为length

RTRIM (string2 ) //去除后端空格

STRCMP (string1 ,string2 ) //逐字符比较两字串大小,

SUBSTRING (str , position  [,length ]) //从str的position开始,取length个字符,

TRIM([[BOTH|LEADING|TRAILING] [padding] FROM]string2) //去除指定位置的指定字符

UCASE (string2 ) //转换成大写

RIGHT(string2,length) //取string2最后length个字符

SPACE(count) //生成count个空格

 
数学类

ABS (number2 ) //绝对值

BIN (decimal_number ) //十进制转二进制

CEILING (number2 ) //向上取整

CONV(number2,from_base,to_base) //进制转换

FLOOR (number2 ) //向下取整

FORMAT (number,decimal_places ) //保留小数位数

HEX (DecimalNumber ) //转十六进制

LEAST (number , number2  [,..]) //求最小值

MOD (numerator ,denominator ) //求余

POWER (number ,power ) //求指数

RAND([seed]) //随机数

ROUND (number  [,decimals ]) //四舍五入,decimals为小数位数]

SIGN (number2 ) //返回符号,正负或0

SQRT(number2) //开平方

 
日期时间类
 
ADDTIME (date2 ,time_interval ) //将time_interval加到date2

CONVERT_TZ (datetime2 ,fromTZ ,toTZ ) //转换时区

CURRENT_DATE (  ) //当前日期

CURRENT_TIME (  ) //当前时间

CURRENT_TIMESTAMP (  ) //当前时间戳

DATE (datetime ) //返回datetime的日期部分

DATE_ADD (date2 , INTERVAL d_value d_type ) //在date2中加上日期或时间

DATE_FORMAT (datetime ,FormatCodes ) //使用formatcodes格式显示datetime

DATE_SUB (date2 , INTERVAL d_value d_type ) //在date2上减去一个时间

DATEDIFF (date1 ,date2 ) //两个日期差

DAY (date ) //返回日期的天

DAYNAME (date ) //英文星期

DAYOFWEEK (date ) //星期(1-7) ,1为星期天

DAYOFYEAR (date ) //一年中的第几天

EXTRACT (interval_name  FROM date ) //从date中提取日期的指定部分

MAKEDATE (year ,day ) //给出年及年中的第几天,生成日期串

MAKETIME (hour ,minute ,second ) //生成时间串

MONTHNAME (date ) //英文月份名

NOW (  ) //当前时间

SEC_TO_TIME (seconds ) //秒数转成时间

STR_TO_DATE (string ,format ) //字串转成时间,以format格式显示

TIMEDIFF (datetime1 ,datetime2 ) //两个时间差

TIME_TO_SEC (time ) //时间转秒数]

WEEK (date_time [,start_of_week ]) //第几周

YEAR (datetime ) //年份

DAYOFMONTH(datetime) //月的第几天

HOUR(datetime) //小时

LAST_DAY(date) //date的月的最后日期

MICROSECOND(datetime) //微秒

MONTH(datetime) //月

MINUTE(datetime) //分

 

附:可用在INTERVAL中的类型

DAY ,DAY_HOUR ,DAY_MINUTE ,DAY_SECOND ,HOUR ,HOUR_MINUTE ,HOUR_SECOND ,MINUTE ,MINUTE_SECOND,MONTH ,SECOND ,YEAR

机器人 2007-11-1 于 北京