2009年7月12日 | 分类: 他山之石, 兴趣所在 | 标签:

Nathan A. Good, 高级信息工程师, Consultant

2009 年 6 月 29 日

PHP 的版本 V6 包含一些新特性和语法改进,从面向对象的角度看,PHP6 更加易于使用。其他重要特性(比如在许多核心函数中支持 Unicode)反映了 PHP V6 力争获得更好的国际通用性支持和健壮性。

PHP 已经很流行,它不仅用于各个领域(根据 Netcraft),而且还得到大部分 ISP 的支持和知名 Web 公司(比如 Yahoo!)的使用。此外,未来的 PHP 版本将引入新的特性以提高其易用性和安全性。您已经为使用 PHP V6 做好准备了吗?假设您要升级到 PHP V6,您的脚本能正常执行吗?或者需要进行一些更改?本文主要介绍 PHP V6 的变化(一些特性向后支持 PHP V5.x 版本),您可能需要根据这些变化对当前的脚本作出一些调整。

如果您尚未使用 PHP,并且一直考虑使用它,那么可以看看它的最新特性。这些特性 —— 从 Unicode 支持到 XML 支持 —— 将让您能够更加轻松地编写出特性丰富的 PHP 应用程序。

PHP V6 的新特性

PHP V6 的初步副本已经发布,所以您可以下载它并试用本文列出的许多特性和更改。对于当前副本已经实现的特性,见 参考资料。

改进的 Unicode 支持

PHP V6 的最大改进是在许多核心函数中支持 Unicode 字符串。这个新特性有巨大的影响,因为它允许 PHP 支持更广泛的字符集,从而获得更多的国际支持。所以,如果您是一位使用不同语言(比如 Java™ 编程语言,这些语言的国际化(il8n)支持比 PHP 好)的开发人员或架构师,那么您应该看看国际化支持改进后的 PHP。

现在,已经可以下载和使用针对开发人员的 PHP V6,所以您可以看到其中的一些特性已经支持 Unicode 字符串。要获取已经经过测试和验证的可以处理 Unicode 的函数,参见 参考资料。

名称空间

名称空间 是一种避免函数名和类名出现冲突的方法,并且不会在命名约定中使用前缀,从而增强了函数名和类名的可读性。因此通过使用名称空间,您可以使用可能已被他人使用的类名,但不用担心出现问题。清单 1 提供一个 PHP 的名称空间例子。

您不需要对代码进行任何更新或修改,因为不包含名称空间的 PHP 代码将能够正常运行。因为名称空间特性向后支持至 PHP V5.3,因此当该特性可用时,您可以在 PHP 应用程序中引入名称空间。

清单 1. 名称空间的例子


Web 2.0 特性

取决于您使用 PHP 的方式以及当前的代码,PHP V6 中的语言和语法差别对您的影响可能没有接下来的特性大,这些特性允许您将 Web 2.0 特性直接引入到 PHP 应用程序中。

SOAP

SOAP 是 Web 服务采用的协议之一,并且在许多其他语言中都得到支持,比如 Java 编程语言和 Microsoft® .NET。尽管有许多其他方式可以使用和公开 Web 服务(比如 Representational State Transfer,REST),SOAP 仍然是实现不同平台之间的交互性的常用方法。除了 PHP Extension and Application Repository (PEAR) 库中的 SOAP 模块之外,PHP V5 还引入了一个 SOAP 扩展。默认情况下这个扩展是禁用的,所以您或您的 ISP 必须启用它。此外,您可以通过 PEAR 包构建 SOAP 客户端和服务器,比如 SOAP 包。

除非您更改了默认设置,否则 SOAP 扩展在 PHP V6 中是启用的。这些扩展为实现 SOAP 客户端和 SOAP 服务器提供一种简易的方法,从而使您能够构建使用和提供 Web 服务的 PHP 应用程序。

如果默认启用了 SOAP 扩展,您就不需要在 PHP 中配置它们。如果您开发了 PHP 应用程序并发布给 ISP,那么您必须和 ISP 进行核实,确保他们在升级时为您启用 SOAP 扩展。

XML

从 PHP V5.1 开始,XMLReader 和 XMLWriter 就成为了 PHP 核心的一部分,这使您能够在 PHP 应用程序中更加轻松地处理 XML。与 SOAP 扩展一样,如果您使用 SOAP 或 XML 的话,这个特性是个好消息,因为 PHP V6 比 V4 更适合您。

XMLWriter 和 XMLReader 是基于流的面向对象类,它们允许您读写 XML,并且不要担心 XML 的细节。

删除的特性

PHP V6 在添加一些新特性的同时,也删除了以前版本中的一些函数和特性。被删除的大部分东西,比如 register_globals 和 safe_mode,在当前的 PHP 中都被广泛认为是 “有漏洞的”,因为它们可能招致安全风险。为了保持 PHP 的简洁性,将删除下面小节列出的函数和特性。在 ISP 或企业升级到 PHP V6 之后,反对删除这些内容的人很可能会给现有的脚本带来安全问题,而支持删除的人将会很幸运,因为 PHP 团队为他们修复了一些漏洞,并且提供更加干净、安全的实现。

从 PHP V6 删除的特性包括:

* magic_quotes
* register_globals
* register_long_arrays
* safe_mode

magic_quotes

由于 magic_quotes 导致可移植性、性能和易用性方面的问题,所以 PHP 文档不鼓励使用它。鉴于这个原因,PHP V6 干脆删除了该特性。因此,在升级到 PHP V6 之前,要确保您的代码没有使用 magic_quotes。如果您正在使用 magic_quotes 为数据库调用转换字符串类型,请使用数据库实现的参数化查询(如果支持的话)。如果不支持参数化查询,请使用数据库实现的类型转换函数,比如针对 MySQL 的 mysql_escape_string 或针对 PostgreSQL 的 pg_escape_string。清单 2 显示了一个使用 magic_quotes 的例子。

清单 2. 使用 magic_quotes(不推荐)


在针对新版本 PHP 进行处理之后,您的 PHP 代码应该类似于清单 3。

清单 3. 使用参数化查询(推荐)
prepare("INSERT INTO USERS (USERNAME) VALUES ?");
$statement->execute(array($_GET['username']));
?>

prepare(“INSERT INTO USERS (USERNAME) VALUES ?”);
$statement->execute(array($_GET[‘username’]));
?>

既然即将完全删除对 magic_quotes 的支持,get_magic_quotes_gpc() 函数就不再可用。这可能会影响一些老版本的 PHP 脚本,因此在更新之前,确保对所有存在这些函数的地方进行修复。

register_globals

register_globals 配置键在 PHP V4.2 中已经默认关闭,当时也引起了争议。当 register_globals 打开之后,就能轻松地使用可能注入了来自 HTML 表单的值的变量。因为在脚本中并不真正需要初始化这些变量,所以很容易编写出带有安全漏洞的脚本。register_globals 文档(见 参考资料)提供关于 register_globals 的更多信息。清单 4 是一个使用 register_globals 的例子。

清单 4. 使用 register_globals(不推荐)


如果您的 PHP 代码使用了全局变量,那么应该更新它。即便不是为了使用新版本的 PHP 而更新它,从安全角度考虑,您也应该进行更新。更新完成之后,您的代码应该类似于清单 5。

清单 5. 更加明确的代码(推荐)


register_long_arrays

当打开 register_long_arrays 设置时,它将注册 $HTTP_*_VARS 预定义变量。如果您目前使用更长的变量,那么需要进行更新,以适应更短的变量。这个设置是在 PHP V5 中引入的(考虑到向后兼容性),但出于性能考虑,PHP 团队建议关闭它。清单 6 是一个使用 register_long-arrays 的例子。

清单 6. 使用注册数组(不推荐)


如果您的 PHP 代码类似于清单 6,那么更新它,如清单 7 所示。如果 register_long_arrays 设置是打开的,那么关闭它,然后再次测试脚本。

清单 7. 使用 $_GET(推荐)


safe_mode

当打开了 safe_mode 配置键时,它确保所操作的文件的所有者与所执行的脚本的所有者匹配。这最初作为在共享服务器环境中进行操作时(许多 ISP 都这样做)处理安全性的一种方法。(要获得受 safe_mode 更改影响的函数列表的链接,请参见 参考资料)。您的 PHP 代码不会受这一更改的影响,但是有必要了解它,免得在未来设置 PHP 时使用它或在脚本中依赖它。

PHP 标记

Microsoft Active Server Pages (ASP) 样式的标记(PHP 标记的缩短版)不再受支持。要确保您的脚步不存在这种问题,请检查是否在 PHP 文件中使用了 <% 或 %> 标记。如果使用了,那么分别将其替换为 。

FreeType 1 和 GD 1

PHP 团队删除了对 FreeType 1 和 GD 1 的支持,其理由是这两个库缺乏持续开发,并且已经不适应时代要求。不过,这两个库的更新版本将提供更好的功能。要更多地了解 FreeType 和 GD,参见 参考资料。

ereg

将从核心 PHP 支持中删除支持 Portable Operating System Interface (POSIX) 正则表达式的 ereg 扩展。如果您正在使用 POSIX 正则表达式函数之一,这一更改将带来影响,除非您包含 ereg 功能。如果您正在使用 POSIX 正则表达式,可以考虑更新正则表达式函数,以使用 Perl-Compatible Regular Expression (PCRE) 函数,因为它们提供更多的特性和更好的平台。表 1 列出了删除 ereg 之后将不可用的 POSIX 正则表达式函数。同时展示了它们的 PCRE 代替函数。

表 1. ereg() 函数及其 PCRE 等效函数
ereg() 函数 类似的 preg() 函数
ereg(), eregi() preg_match()
ereg_replace(), ereg_replacei() preg_replace()

PHP V5.3

这里提到的一些特性还将迁移到 PHP V5.3,5.3 版本是在 2008 年的第一季度发布的。您可能希望升级到 V5.3 并开始使用这些特性,但是直接迁移到 PHP V6 能够节省该步骤。下面列出向后支持 v5.3 的特性:

* 名称空间
* 默认情况下在核心函数中包含 XMLReader 和 XMLWriter

结束语

PHP V6 将提供许多改进,并且删除老版本 PHP 中的一些特性。为了利用最新的特性和了解删除的特性,请仔细阅读 NEWS 列表(见 参考资料),它包含 PHP V6 添加或删除的特性的最新信息。现在,您可以下载开发人员版本的 PHP V6,并确保您的应用程序不受这些变更的影响。您还可以利用这次机会清理自己的脚本,删除本文不推荐使用的函数,或更新您的语法以确保应用程序受支持。

原文地址:http://www.ibm.com/developerworks/cn/opensource/os-php-future/

2009年7月6日 | 分类: 兴趣所在 | 标签: , ,

code sinppet
Authors: Roman Roan, Wyatt Neal
Code Snippet was created by Roman Roan and originally hosted at http://blog.enargi.com. It is powered by the GeSHi engine and is quite possibly the best syntax highlighting engine for WordPress. A large number of languages are supported and it can be easily extended. Since his blog is no longer functioning, I’m attempting to keep his wonderful contribution available so I’ve given it a home at http://blog.hackerforhire.org/code-snippet/. If you find any bugs with it, let me know and I will do my best to resovle them.

runcode
Author: Sunshow
A plugin for WordPress, which can be used to show your code.

url:http://wordpress.org/extend/plugins/runcode/

修改:发现这个插件中作者写死了textarea的cols和rows,而且居然没有加入到textarea中,稍微修改了一下标签的匹配,让runcode标签自动支持rows和cols属性。
在runcode.php:135加入
[code lang=”php”]

[/code]
用今天看到的一个css效果做个demo
url:http://www.blueidea.com/tech/web/2009/6846.asp

提示:你可以先修改部分代码再运行。

以下是Mozilla识别的圆角效果:
[code lang=”css”]
border-radius:5px;
-moz-border-radius:5px;
-webkit-border-radius:5px;
[/code]

2009年7月4日 | 分类: 兴趣所在 | 标签:

要用到apache的mod_rewrite和mod_proxy模块组,在apache源文件下的modules/proxy包含了所有代理的内容,添加不同的模块能支持不同的代理。

我们还是用apxs来安装新的模块,值得注意的是在安装mod_proxy模块时,要将proxy_util.c加入进来一起编译;同样,如果要支持mod_proxy_ajp 需要把ajp的相关c文件包含进来,具体命令:

[xw@byr proxy] $ apxs -i -a -c mod_proxy.c proxy_util
[xw@byr proxy] $ apxs -i -a -c mod_proxy_ajp.c ajp*.c

接下来只需要在代理机器上配置被代理的虚拟域即可:
<VirtualHost *:80>
ServerName xw2423.byr.edu.cn
ErrorLog logs/xw-error_log
CustomLog logs/xw-access_log common
UseCanonicalName   Off
ProxyRequests   Off
RewriteEngine   on
RewriteRule ^/(.*)$ http://xw2423.byr.edu.cn/$1 [P,L]
</VirtualHost>

其中前几行的配置与普通虚拟域配置相同,后面则做一个rewrite,把对此域的请求重写到被代理服务器上,[P]表示通过代理访问,[L]表示为最后的匹配规则,具体文档参考:
http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewriterule
http://httpd.apache.org/docs/2.2/mod/mod_proxy.html

==========附 apxs 中文参考========

apxs – Apache 扩展工具

apxs是一个为Apache HTTP服务器编译和安装扩展模块的工具,用于编译一个或多个源程序或目标代码文件为动态共享对象,使之可以用由mod_so提供的LoadModule指令在运行时加载到Apache服务器中。

因此,要使用这个扩展机制,你的平台必须支持DSO特性,而且Apache httpd必须内建了mod_so模块。apxs工具能自动探测是否具备这样的条件,你也可以自己用这个命令手动探测:

$ httpd -l

该命令的输出列表中应该有mod_so模块。如果所有这些条件均已具备,则可以很容易地借助apxs安装你自己的DSO模块以扩展Apache服务器的功能:

$ apxs -i -a -c mod_foo.c
gcc -fpic -DSHARED_MODULE -I/path/to/apache/include -c mod_foo.c
ld -Bshareable -o mod_foo.so mod_foo.o
cp mod_foo.so /path/to/apache/modules/mod_foo.so
chmod 755 /path/to/apache/modules/mod_foo.so
[activating module 'foo' in /path/to/apache/etc/httpd.conf]
$ apachectl restart
/path/to/apache/sbin/apachectl restart: httpd not running, trying to start
[Tue Mar 31 11:27:55 1998] [debug] mod_so.c(303): loaded module foo_module
/path/to/apache/sbin/apachectl restart: httpd started

其中的参数files可以是任何C源程序文件(.c)、目标代码文件(.o)、甚至是一个库(.a)。apxs工具会根据其后缀自动编译C源程序或者连接目标代码和库。但是,使用预编译的目标代码时,必须保证它们是地址独立代码(PIC),使之能被动态地加载。如果使用GCC编译,则应该使用 -fpic 参数;如果使用其他C编译器,则应该查阅其手册,为apxs使用相应的编译参数。

有关Apache对DSO的支持的详细信息,可以阅读mod_so文档,或者直接阅读src/modules/standard/mod_so.c源程序。

apxs -g [ -S name=value ] -n modname

apxs -q [ -S name=value ] query ...

apxs -c [ -S name=value ] [ -o dsofile ] [ -I incdir ] [ -D name=value ] [ -L libdir ] [ -l libname ] [ -Wc,compiler-flags ] [ -Wl,linker-flags ] files ...

apxs -i [ -S name=value ] [ -n modname ] [ -a ] [ -A ] dso-file ...

apxs -e [ -S name=value ] [ -n modname ] [ -a ] [ -A ] dso-file ...

-n modname
它明确设置了 -i(安装)和 -g(模板生成)选项的模块名称。对 -g 选项,它是必须的;对 -i 选项,apxs工具会根据源代码判断,或(在失败的情况下)按文件名推测出这个模块的名称。

-q
查询某种apxs设置的信息。该选项的query参数可以是下列一个或多个字符串:CC, CFLAGS, CFLAGS_SHLIB, INCLUDEDIR, LD_SHLIB, LDFLAGS_SHLIB, LIBEXECDIR, LIBS_SHLIB, SBINDIR, SYSCONFDIR, TARGET 。这个参数用于手动查询某些设置。比如,要手动处理Apache的C头文件,可以在Makefile中使用:

INC=-I`apxs -q INCLUDEDIR`

-S name=value
此选项可以改变apxs的上述设置。

-g
此选项生成一个名为name的子目录(见选项 -n)和其中的两个文件:一个是名为mod_name.c的样板模块源程序,可以用来建立你自己的模块,或是学习使用apxs机制的良好开端;另一个则是对应的Makefile ,用于编译和安装此模块。

-c
此选项表示需要执行编译操作。它首先会编译C源程序(.c)files为对应的目标代码文件(.o),然后连接这些目标代码和files中其余的目标代码文件(.o和.a),以生成动态共享对象dsofile 。如果没有指定 -o 选项,则此输出文件名由files中的第一个文件名推测得到,也就是默认为mod_name.so
-o dsofile
明确指定所建立的动态共享对象的文件名,它不能从files文件列表中推测得到。如果没有明确指定,则其文件名将为mod_unknown.so
-D name=value
此选项直接传递到给编译命令,用于增加自定义的编译变量。
-I incdir
此选项直接传递到给编译命令,用于增加自定义的包含目录。
-L libdir
此选项直接传递到给连接命令,用于增加自定义的库文件目录。
-l libname
此选项直接传递到给连接命令,用于增加自定义的库文件。
-Wc,compiler-flags
此选项用于向编译命令 libtool --mode=compile 中附加compiler-flags ,以增加编译器特有的选项。
-Wl,linker-flags
此选项用于向连接命令 libtool --mode=link 中附加linker-flags ,以增加连接器特有的选项。

-i
此选项表示需要执行安装操作,以安装一个或多个动态共享对象到服务器的modules目录中。
-a
此选项自动增加一个LoadModule行到httpd.conf文件中,以激活此模块,或者,如果此行已经存在,则启用之。
-A
-a 选项类似,但是它增加的LoadModule命令有一个井号前缀(#),即此模块已经准备就绪但尚未启用。
-e
表示需要执行编辑操作,它可以与 -a-A 选项配合使用,与 -i 操作类似,修改Apache的httpd.conf文件,但是并不安装此模块。

假设有一个扩展Apache功能的模块mod_foo.c ,使用下列命令,可以将C源程序编译为共享模块,以在运行时加载到Apache服务器中:

$ apxs -c mod_foo.c
/path/to/libtool --mode=compile gcc ... -c mod_foo.c
/path/to/libtool --mode=link gcc ... -o mod_foo.la mod_foo.slo

然后,必须修改Apache的配置,以确保有一个LoadModule指令来加载此共享对象。为了简化这一步骤,apxs可以自动进行该操作,以安装此共享对象到”modules”目录,并更新httpd.conf文件,命令如下:

$ apxs -i -a mod_foo.la
/path/to/instdso.sh mod_foo.la /path/to/apache/modules
/path/to/libtool --mode=install cp mod_foo.la /path/to/apache/modules ... chmod 755 /path/to/apache/modules/mod_foo.so
[activating module 'foo' in /path/to/apache/conf/httpd.conf]

如果配置文件中尚不存在,会增加下列的行:

LoadModule foo_module modules/mod_foo.so

如果你希望默认禁用此模块,可以使用 -A 选项,即:

$ apxs -i -A mod_foo.c 

要快速测试apxs机制,可以建立一个Apache模块样板及其对应的Makefile :

$ apxs -g -n foo
Creating [DIR] foo
Creating [FILE] foo/Makefile
Creating [FILE] foo/modules.mk
Creating [FILE] foo/mod_foo.c
Creating [FILE] foo/.deps

然后,立即可以编译此样板模块为共享对象并加载到Apache服务器中:

$ cd foo
$ make all reload
apxs -c mod_foo.c
/path/to/libtool --mode=compile gcc ... -c mod_foo.c
/path/to/libtool --mode=link gcc ... -o mod_foo.la mod_foo.slo
apxs -i -a -n "foo" mod_foo.la
/path/to/instdso.sh mod_foo.la /path/to/apache/modules
/path/to/libtool --mode=install cp mod_foo.la /path/to/apache/modules ... chmod 755 /path/to/apache/modules/mod_foo.so
[activating module 'foo' in /path/to/apache/conf/httpd.conf]
apachectl restart
/path/to/apache/sbin/apachectl restart: httpd not running, trying to start
[Tue Mar 31 11:27:55 1998] [debug] mod_so.c(303): loaded module foo_module
/path/to/apache/sbin/apachectl restart: httpd started
2009年7月1日 | 分类: 兴趣所在 | 标签: ,

在apache下,打开Permalinks的条件是启用mod_rewrite。

安装mod_rewrite的方法就是在编译时加上–enable-rewrite参数。

在已编译好的apache的服务器上安装mod_rewrite的方法如下:

#/usr/local/www/bin/apxs -i -a -c ./mod_rewrite.c

这样系统会重新编译,并将自动更新httpd.conf,添加模块

安装好后,在phpinfo中就可以看到Loaded Modules项里存在mod_rewrite

mod_rewrite的用法参考:http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html

为了在WordPress中实现Permalinks还需将系统的目录属性改为:


    Options FollowSymLinks
    AllowOverride All

2009年7月1日 | 分类: 兴趣所在 | 标签: , ,

有一定效果的jquery插件,其中的tooltip和expose效果还是挺好的

主页:http://flowplayer.org/tools/

ms官方还做flash播放器。。。

2009年6月13日 | 分类: 那些奇葩 | 标签:

女声太具有诱惑力了。。。

植物大战僵尸1

 

 

 

 

 

 

 

植物大战僵尸2

 

 

 

 

 

 

 

 

植物大战僵尸3

 

 

 

 

 

 

植物大战僵尸4

 

 

 

 

 

 

 

 

歌词

向日葵们~
[白天]
草地上有一个怪蜀黍
草地上有两个怪蜀黍
草地上又来个怪蜀黍
我们不喜欢草地上的怪蜀黍

我知道你们又高又黑又粗鲁g
准备把我头上的花瓣铲除
然后将主人的脑袋烹煮
我只是一朵向日葵
我们却组成整支部队
你们喜欢品尝“脑乳”
我们讨厌怪蜀黍

[zombies 僵尸们]
我曾经是国足
我头顶三角柱
我手持铁栅门
我们都是怪蜀黍

[晚上]
草地上还是有怪蜀黍
草地上有好多怪蜀黍
草地上有新的怪蜀黍
我们讨厌草地上的怪蜀黍

也许是时候重新评估
我知道你们有许多食物
不过脑乳中胆固醇含量太过丰富 [对身体可是重负哦]
你们已经归西 因此不在乎
所以我们将使用阳光
来把这片草地常守护

[zombies 僵尸们]
我看上你的三轮车(才不给你叻)
一盆黄油扣我头上(哼 活该)
我要吃掉你的“豆腐乳”(豌豆君救命啊> <)
我们就是怪蜀黍

[屋顶]
草地上有一个怪蜀黍
草地上有两个怪蜀黍
草地上又来个怪蜀黍
我们不喜欢草地上的怪蜀黍
[完]

2009年5月16日 | 分类: 他山之石, 那些奇葩 | 标签:

当令你快乐的一切不能再令你快乐,当令你悲哀的一切不能再令你悲哀,甚至激怒你的一切不能再激怒你的时候,是不是很可怕?一位哲人曾说过:这就叫做苍老。

再想起你,你的名字,你的笑,你的一切,都只能加上一个“别人的”。
再想起我们在一起的事,也只能加上一个“曾经的”。

有些感情是指甲,剪掉了还会重生,无关痛痒。而有些感情是牙齿,失去以后永远有个疼痛的伤口无法弥补。

不见面不等于不思念,不联络只是为了掩饰眷恋。

有些人脸上太多的笑是因为他们心中有太多的泪。

人生有一个地方,有一个人,在这个人面前,可以不必有出息,可以不必有形象,可以全身是弱点,这是知己。
(这句本人蛮喜欢的)

每个人在每个阶段得做每个阶段的事,就算怀念,都得离开。

只有你不想放的,没有你放不下的。

很多人,很多事,原本是熟悉的,以为明天可以再继续的。于是转过身暂时放手,想的是明日又将重聚的希望。太阳落下去重新升起来以前,那些事,就不可能再经历;那些人,就从此与你永别了。

有时候不知道真相,不了解本质的人,是快乐的.而能够假装不知道真相,不了解本质的人,却是幸福的. (这句看不懂)

就像一个热闹的party刚刚结束,人走了,灯灭了,黑暗中就只剩下你一个人……人有时就需要在寂寞中才能自省.只有从喧嚣走入寂静,你才会专注自己的心灵.

对的时间,遇见对的人,是一生幸福.
对的时间,遇见错的人,是一场心伤.
错的时间,遇见错的人,是一段荒唐.
错的时间,遇见对的人,是一生叹息.

生命中不断有人离开或进入.于是,看见的,看不见了;记住的,遗忘了.生命中不断有得到和失落.于是,看不见的,看见了;遗忘的,记住了.然而,看不见的,是不是就等于不存在?记住的,是不是永远不会消失?(很灵的一句话)

我一直不愿意承认你是我生命中的过客。 (这句能共鸣)

今生今世,但愿岁月静好,现世安稳,每天都能看见他的笑颜。

若必得与最后的荒芜对望,也许明日出发,看一程山长水远,而归来是一生的事。(这需要何等慷慨的勇气和淡然的胸襟)

青春尚未散场,还有未来可以挥霍。现实很穷,理想很富裕。

当你还在我身边,我就开始怀恋,因为我知道你即将离去。 ——米兰 昆德拉(深刻,无奈)

我们已经走得太远,以至于忘记了,为什么而出发。 ——纪伯伦(为什么出发?)

佛笑了笑:爱是因为相互欣赏而开始的,因为心动而相恋,因为互相离不开而结婚,但更重要的一点是需要宽容、谅解、习惯和适应才会携手一生的。

你曾经问我,你最喜欢哪座城市?亲爱的,你知道我的答案吗?我最喜欢有你的城市。

我爱你.也许这是心底最大的遗憾,因为,从来不曾诉与你。(这种心境是不可取的)

爱一个人,不要随便牵手,更不要轻易放手!

在这世间,有一些无法抵达的地方。无法靠近的人。无法完成的事情。无法占有的感情。无法修复的缺陷。

当他终于对你说“你的名字,我的姓氏”后,他终于不用套上别人的了,他也不是曾经的了。只是,那时,是否可以真的无憾?

在什么都不确定的年代,我们总是爱得太早,放弃得太快,轻易付出承诺,又不想等待结果。

戒指,不再是一生一世的承诺,终生相守的誓言,却成了纪念伤感的烙印。

就像有人说过的:戒指好比爱情,戴在手上,也是戴在心上;伤在心上,便也伤在手上。不敢碰的,是那心里的伤;不原摘的,是那难舍的爱。

有人说,通往心脏的血脉是在无名指上,你知道我多想在今生,倾尽所有,牢牢地栓住你的无名指啊!

如果爱让我走下去,我一定会拼到爱尽头。

时间过了,爱情淡了,相爱的人也就散了。

有些人是一直会刻在生命里的,哪怕忘记了他的声音忘记了他的笑容忘记了他的脸,可是每次想起他,那种感受,却永远不会变。
(经典啊!)

曾经以为你是风筝,我是手中握着那根线,无论你飞向何方,我最终是你的归属。现在终于明白,如果爱你,就不应该束缚你(这句话要花很多时间才能明白,即使明白也需要克服难以释怀的心情)

2009年5月2日 | 分类: 兴趣所在 | 标签: ,

1.进入visual模式
visual模式有三种,一种是默认的visual模式,在normal模式下按下”v”就可以进入。一种是visual line模式,按下”V”可以进入。另一种是今天要讲的visual block模式,按下Ctrl-V进入。如果是在Windows下面的vim,则用Ctrl-Q进入。Windows下的vim有许多快捷键被替换掉了,在安装目录下的mswin.msi有详细的信息。

2.选择文本
进入visual模式后,按住shift键就可以上下左右移动选择文本,也可以使用数字+h/j/k/l来移动选择文本块;使用”$”和”^”可以将选择扩展到行尾或者行首。

3.插入
选择文本块后,键入”I”进入文本插入模式。键入你想输入的文本后,按下”Esc”,这样就会在你选择的文本块的每行的左边(选择文本的左边)全部插入你刚才输入的文本,如:

include "/home/app/file1.h"
include "/home/app/file2.h"
include "/home/app/file3.h"

当你光标停在”file1″的”f”上时,按下Ctrl-Q进入visual模式,然后”2j”选择2行,键入”I”进入插入模式,输入”include/”后按下”Esc”,文本就会变成这样了:

include "/home/app/include/file1.h"
include "/home/app/include/file2.h"
include "/home/app/include/file3.h"

注意:(i)如果要在选择的块的后面加入文本,将”I”替换成”A”(Append)即可,比如上例中光标停留在”file”前面的一个”/”上时,键入”Ainclude/”也可以达到相同效果。(ii)如果想使选择的文本块扩展到每行行尾,进入visual模式后,按下”$”即可。同理,扩展到行首使用”^”

4.替换
如果是想替换选中的文本,先选中需要替换的文本,然后键入”c”进入输入状态,键入文本后按下”Esc”键。如上例中,先选中”app”,然后键入”cinclude”,文本内容将变成:

include "/home/include/file1.h"
include "/home/include/file2.h"
include "/home/include/file3.h"

如果想替换掉选中文本块到行尾的所有内容,使用C代替c,或者利用”$”先将选中扩展至行尾,再用c进行操作.
替换还有一下几个命令,在选择本文块后直接键入该命令即可:
~ 交换大小写
U 将小写变成大写
u 将大写变成小写

5.移动
使用”>”可以将选择的文本向右移动,空白部分以空格填充。使用”:set shiftwidth=n”(n为数字)命令可以定义移动的空格数。这在我们写程序时非常有用,比如有以下代码:

for ( i=0; i<10; i++ ) {
  if ( ... ) {
    ......
  }
  if ( ... ) {
    a = i * 2;
    b = a--;
  }
}

如果我们想在第一个if语句前再加一个for循环,就是做成两次for循环的嵌套,但是内部的程序段不变,加入后,显然程序的缩进被破坏,第一个if后的所有语句都要向右再缩进,这次,块移动操作就派上用场啦。先设置好你需要缩进的空白数,然后选中第一个if块的语句,然后键入”>”,缩进一下就完成了。可怜以前我都是一行又一行的去移啊移啊。。。
注意:”<“可以实现向左移动,但是如果左边没有足够的shift空间,那么该命令什么也不做。

6.连接
“J”命令可以是你选择的行全部连接成一行,行与行之间以一个空格代替所有的换行符和空白,在连接行的最后放置两个空格。如果想保留行的前导空白和后缀空白,使用”gJ”来代替”J”命令。
该命令在三种visual模式下均可操作。

2009年3月31日 | 分类: 兴趣所在 | 标签:

Flex 3 Style Explorer beta:http://blog.5d.cn/user39/riahome/upload/2007-12/Flex3StyleExplorer_V3Beta.rar

Flex 3 Components Explorer: http://examples.adobe.com/flex3/componentexplorer/explorer.html

Flex 3 Filter Explorer: http://blog.5d.cn/user39/riahome/upload/2007-08/20078221239281.rar

Flex 3 Effect Explorer: http://blog.keutgens.de/download/flexEffectExplorer/current/flexEffectExplorer.zip

Flex 3 Primitive Explorer: http://blog.5d.cn/user39/riahome/upload/2007-08/20078221259252.rar

Flex Chart Explorer:http://demo.quietlyscheming.com/ChartSampler/app.html

2009年3月8日 | 分类: 他山之石 | 标签: ,

转自 http://hi.baidu.com/thinkinginlamp/blog/item/2fd89e51bc60e62043a75b4d.html

这个陷阱在PHP里存在很久了,先看代码:

$array = array(1, 2, 3); 

foreach ($array as &$v) {} 
foreach ($array as  $v) {} 

print_r($array); 

运行代码,得到的结果却是:

Array
(
    [0] => 1
    [1] => 2
    [2] => 2
)

可以发现,经过两次foreach后,最后一个元素由3变成了2。

为什么会这样呢?这是因为第一次foreach的时候$v成为了一个引用变量($array[2]),如此,当第二次foreach的时候,实际上只是在对这个引用变量($array[2])进行了若干次赋值而已。

第一次:$array[2] = 1,此时$array各元素分别为1,2,1
第二次:$array[2] = 2,此时$array各元素分别为1,22
第二次:$array[2] = 2,此时$array各元素分别为1,2,2

一不小心很可能会掉入这个陷阱,为了避免这个问题,需要在第一次foreach后执行unset($v),解决方案有点丑陋,但也没有办法,PHP脚本里的变量一旦生成就在整个脚本中有效,不像Java中,变量是块级别的,仅仅在对应的{}中有效。

今天偶然发现这个,算是我小白吧。。。不过bug合情合理,常常foreach的变量的冲突导致程序bug,谨记!

第4页/6页首页...23456