Web信息架构:设计大型网站:第3版 | CSDN读书: "Web信息架构:设计大型网站:第3版"
12/18/2008
12/10/2008
12/04/2008
Install Zend_Tool in Ubuntu 8.10
As a hot PHP framework, Zend Framework offer a command tool named zend_tool, let us install it to our desktop of Ubuntu. see the following:
1 install php-cli
#sudo apt-get install php5-cli php5-dev
2 create direcotory
#cd /home/edwin/Zend
#mkdir tool
#mkdir library
3 check out load Zend framework
Zend_Tool library
#cd tool
#svn co http://framework.zend.com/svn/framework/laboratory/Zend_Tool/ ./
Zend Framework Stand Library
#cd library
#svn co http://framework.zend.com/svn/framework/standard/trunk/library/ ./
3 add 2 library to php.ini's include path
#sudo gedit /etc/php5/cli/php.ini
then , add "include_path = ".:/home/edwin/Zend/tool/library:/home/edwin/Zend/library" to the bottom line;
4 test it
#cd /home/edwin/Zend/tool/bin
#php zf.php
you will get soem errors like following:
zf.php cannot find the Zend Framework Labratory Library. Please either set the $zendFrameworkPath in zf.php OR set the ZFL_PATH environment variable.
So, that means php's include path was wrong. I checked it, but there was no problem on it. By many test about it, the solution is fllowing: you need change zf.php's directory path"/" into " DIRECTORY_SEPARATOR" .
/**
* DEV ONLY START - this will be removed when this hits incubator
*/
$zendFrameworkPath = null;
$zendFrameworkLabPath = null;
if ($zendFrameworkPath === null) {
$zendFrameworkPath = @include_once 'Zend'. DIRECTORY_SEPARATOR .'Loader.php'; //change this line
if ($zendFrameworkPath === false) {
// get the env var?
$zendFrameworkPath = getenv('ZF_PATH');
if ($zendFrameworkPath == '' || !file_exists($zendFrameworkPath)) {
die('zf.php cannot find the Zend Framework Standard Library. Please either set the $zendFrameworkPath in zf.php OR set the ZF_PATH environment v
ariable.' . PHP_EOL);
}
}
}
if ($zendFrameworkLabPath === null) {
$zendFrameworkLabPath = @include_once 'ZendL'. DIRECTORY_SEPARATOR .'Tool'. DIRECTORY_SEPARATOR .'Framework'. DIRECTORY_SEPARATOR .'Endpoint'. DIRECTORY_
SEPARATOR .'Cli.php'; //change this line
if ($zendFrameworkLabPath === false) {
// get the env var?
$zendFrameworkLabPath = getenv('ZFL_PATH');
if ($zendFrameworkLabPath == '' || !file_exists($zendFrameworkLabPath)) {
die('zf.php cannot find the Zend Framework Labratory Library. Please either set the $zendFrameworkPath in zf.php OR set the ZFL_PATH environment
variable.' . PHP_EOL);
}
}
}
if ($zendFrameworkLabPath !== 1) {
set_include_path($zendFrameworkLabPath . PATH_SEPARATOR . get_include_path());
}
if ($zendFrameworkPath !== 1) {
set_include_path($zendFrameworkPath . PATH_SEPARATOR . get_include_path());
}
unset($zendFrameworkPath, $zendFrameworkLabPath);
/**
* DEV ONLY STOP
*/
require_once 'Zend/Loader.php';
Zend_Loader::registerAutoload();
// run the cli endpoint
ZendL_Tool_Framework_Endpoint_Cli::main();
At the end, copy the zf.sh and zf.php to /usr/bin
#sudo cp zf.sh /usr/bin/zf
#sudo cp zf.php /usr/bin/zf.php
then, you can use the command zf at the terminal:
#zf show version
Zend Framework Version: 1.7.1
That is Ok! You could code some cool scripts by it or php-cli now
12/02/2008
Bug的级别定义
在项目开发过程中,用到的bug解决状态列举出来,希望对大家有所帮助:
- FIXED(已解决):bug已经被解决,并且通过经过测试。
- INVALID(不是bug):被描述的问题不是一个bug(测试人员提出这个bug,但是开发人员认为不是bug)。
- WONTFIX(不修改bug,NeedlessFix):被描述的问题是一个bug,但是不准备进行修改。
- LATER(下一版本再修改):被描述的问题是一个bug,但是不在当前版本中进行修改。(已经确定在下一版本修改)
- REMIND(可能到下一个版本再修改):被描述的问题是一个bug,但是很可能不在目前版本中进行修改(注意是可能,注意later)
- DUPLICATE(bug重复):提出的问题和当前已经存在的某个bug重复。
- WORKSFORME(bug不能重现):不能重现这个bug,查看源代码也不知道为什么会出现这样的bug 现象,如果以后有更多的关 于这个bug的线索,将重新接受这个bug。(这个是对于那些知道有bug,但是却不能重现bug的情况)
11/27/2008
11/23/2008
解决Ubuntu8.04中mysql中文乱码
昨天刚在笔记本上安装Ubuntu 8.04,按照步骤安装了apt的mysql数据库,然后将现有的开发数据库导入(基于UTF-8),发现浏览的时候出现乱码现象,所以解决办法:
1 确认Mysql的编码
通过客户端进入mysql,执行
mysql>show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
确认是编码问题
2 找到mysql的配置文件,修改/etc/mysql/my.cnf
sudo gedit /etc/mysql/my.cnf
在my.cnf文件中的[client]段和 [mysqld]段加上以下两行内容:
[client]
default-character-set=utf8
[mysqld]
default-character-set=utf8
3 需要重启mysql服务
sudo /etc/init.d/mysql restart
4 查看一下现在mysql的编码
sudo mysql -u root -p
mysql>show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8|
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
5 编码正确,由于刚才导库的时候是基于错误编码的基础上作的,所以,会有编码的问题,因此,删除刚才导入的数据库,重新导入,打开页面,OK!
11/20/2008
macchanger
macchanger 和 ifconfig [interface] hw ether [MAC] 的功能一樣, 可以變更網路卡卡號,
但並不是實體地修改卡號, 重開機後仍會回復, 嚴格說起來是可以設定網路卡卡號.
另外一個好用功能是可以查詢 vendor
查詢本機 eth0
# macchanger -s eth0
Current MAC: 00:02:b3:9b:b9:ba (Intel Corporation)
查詢 00:e0:4c 開頭是那一家做的
# macchanger -l | grep 00:e0:4c
7079 - 00:e0:4c - Realtek Semiconductor Corp.
列出 D-Link 的 MAC list
# macchanger --list=D-Link
Misc MACs:
Num MAC Vendor
--- --- ------
Wireless MACs:
Num MAC Vendor
--- --- ------
0012 - 00:05:5d - D-Link DWL-650, DWL-650H
0013 - 00:06:25 - Linksys WPC11 v2.5, D-Link DCF-650W, Linksys WPC11 v3
# macchanger --list=D-link
Misc MACs:
Num MAC Vendor
--- --- ------
1374 - 00:05:5d - D-link Systems, Inc.
3426 - 00:0d:88 - D-link Corporation
3863 - 00:0f:3d - D-link Corporation
5340 - 00:50:ba - D-link
5862 - 00:80:c8 - D-link Systems, Inc.
Wireless MACs:
Num MAC Vendor
--- --- ------
指定 keyword 大小寫有差, 資料檔 /usr/local/share/macchanger/OUI.list 的內容, 大小寫並沒有統一,
還是用 macchanger -l | grep -i keyword 比較實用
11/16/2008
使用svnsync镜像版本库
术语
* 主(Master): 将要通过svnsync被同步的活动读/写版本库。
* 镜像(Mirror): 将要与master通过svnsync同步的只读版本库。
注意,svn的版本要大于1.4
实现
实现svnsync的唯一的前提条件是创建一个希望镜像的版本库,一旦创建,你就可以按照下面步骤继续:
Step 1: 创建镜像Repository
svnadmin create MIRROR_REPO_PATH
Step 2: 设置镜像版本库只对同步用户可写
为了让镜像版本库只被同步用户写,我们的例子里用户名是”svnsync”,我们有一些选项,一个就是使用Subversion的授权功能设置缺省的访问规则(在auth文件里设置):
[/]
* = r
svnsync = rw #MIRROR_REPO_USER
Step 3: 让镜像版本库使用同步用户修改修订版本属性
为此,我们需要创建一个pre-revprop-change钩子,类似于下面的例子,也是shell脚本,在hook文件夹里,有一个建立一个per-revprop-change的文件(不用管他的模版文件),将下面的内容复制:
#!/bin/sh
USER="$3"
if [ "$USER" = "MIRROR_REPO_USER" ]; then exit 0; fi
echo “Only the syncuser user may change revision properties as this is a read-only, mirror repository.” >&2
exit 1
然后修改这个文件的属性为777
Step 4: 注册同步的镜像版本库
在任何平台使用下面的svnsync命令:
svnsync initialize URL_TO_MIRROR_REPO URL_TO_MASTER_REPO --username=MASTER_REPO_USER --password=MASTER_REPO_PASSWD
如果所有的配置正确,你一定会看到下面的输出:
Copied properties for revision 0.
如果有错误,一般就是上步钩子的问题,仔细阅读错误信息,可以纠正。现在你已经注册了镜像版本库与主版本库的同步,我们必须继续执行初始的同步,这样镜像版本库才和主版本库是一样的了。
Step 5: 执行初始同步
为了确定所有事情已经准备好了,并且执行初始同步,在任何系统只需要执行:
svnsync synchronize URL_TO_MIRROR_REPO --username=MASTER_REPO_USER --password=MASTER_REPO_PASSWD
如果所有的同步正确,你会看到类似的输出:
Committed revision 1.
Copied properties for revision 1.
Committed revision 2.
Copied properties for revision 2.
Committed revision 3.
Copied properties for revision 3.
不过在这里可能会出现 “svnsync: Couldn't get lock on destination repos after 10 attempts”类似的报错,你需要手动清除lock
svn pdel --revprop -r 0 svn:sync-lock --username=MIRROR_REPO_USER URL_TO_MIRROR_REPO
Step 6: 使用post-commit钩子自动同步
根据初始同步的输出,我们现在要做的就是写一个定时执行或post-commit钩子来同步镜像版本库,我建议post-commit,因为它让你的镜像版本库尽可能的最新,下面是可以用在主版本库上同步镜像版本库的post-commit钩子,一个shell脚本:
# Example for synchronizing one repository from the post-commit hook
#!/bin/sh
SVNSYNC=/usr/local/bin/svnsync
$SVNSYNC synchronize URL_TO_MIRROR_REPO –username=svnsync –password=svnsyncpassword &
exit 0
就这样了,一旦你执行了上面列出的步骤,你一定可以得到一个随着主版本库提交自动更新的镜像版本库,我们对于svnsync的介绍和如何去实现它。
if 和 switch 语句效率比较
在 switch 语句中条件只求值一次并用来和每个 case 语句比较。在 elseif 语句中条件会再次求值。如果条件比一个简单的比较要复杂得多或者在一个很多次的循环中,那么用 switch 语句可能会快一些。
以上为 php 手册在叙述 switch 中的一句,该怎么理解呢?
从整体效率上看,是相当的。但区别存在于呢?举个例子
if ($noizy==1) {
echo "noizy1";
} elseif ($noizy==2) {
echo "noizy2";
} elseif ($noizy==3) {
echo "noizy3";
}
以上是 if 代码的一个片段,在最差的状况下,也就是当 $noizy = 3 时,共运行了3次比较,而且,每次比较都必须取出 $noizy 的值一次。如果换成 switch
switch ($noizy) {
case 1:
echo "1";
break;
case 2:
echo "2";
break;
case 3:
echo "3";
break;
}
只在开头 switch 的括号中取出 $noizy 的值,然后把值与case值逐一进行比较
效率的差别就在这儿,因此我总结几点:
1.当只进行一次比较时,推荐使用 if,原因很简单,此时 if 与 switch 没有本质区别,而用 if 代码较为简洁,省去多余字节,可乐而不为?
2.当多次纯粹的比较数字或字符时,推荐使用 switch,当进行N次比较,switch 只取值一次,而 if …… elseif 则取值 1 <= x <= N (x 为实际次数)。
3.当遇到复合条件时,应该视情况而灵活运用 if 与 switch。
11/15/2008
Ubuntu下图像工具
Scrot
是一个命令行下使用的截图工具,支持全屏、窗口、选取、多设备、缩略图、延时,甚至可以截图完毕之后指定某程序打开截好的图片。
安装:
可以打开新立得搜索 scrot 并安装,也可以在终端:
sudo apt-get install scrot
Scrot 使用:
scrot [options] [file]
描述
scrot 是一个使用 imlib2 库截取屏幕和保存图像的的工具。
选项 [file] 指定截图保存的文件名。 如果 [file] 没有指定,
截图就会以当前的日期和时间为文件名保存在当前目录中。
选项
-h, --help
显示帮助并且退出
-v, --version
显示版本信息并且退出
-b, --border
当选择一个窗口时,同时包含窗口边框。
-c, --count
延时时的显示倒计时
-d, --delay NUM
延时 NUM 秒
-e, --exec APP
对保存的图像执行程序 APP
-q, --quality NUM
图像质量 (1-100) 值大意味着文件大, 压缩率低。
-m, --multidisp
对多个显示设备分别截图并且连接在一起。
-s, --select
用鼠标交互式的选择一个窗口或者区域。
-t, --thumb NUM
同时生成缩略图。 NUM 是缩略图的百分比。
说明符
--exec 和 文件名可以使用可以被 scrot 扩充的格式说明符。有两种类型的
说明符。 '%' 前导的说明符由 strfile(2) 来解释。例程可以查看 strftile
手册。这些选项用来引用当前的日期。第二种说明符由 scort 内部解释并且
使用前缀 '$'. 可以识别的说明符如下:
$f 图像的路径/文件名 (如果在文件名中就会忽略)
$n 图像文件名 (如果在文件名中会被忽略)
$s 图像大小(字节数) (如果在文件名会被忽略)
$p 图像像素大小
$w 图像宽度
$h 图像高度
$t 图像格式
$ 打印字符 'n 打印新行 (如果在文件名中会被忽略)
例子(~ 用户主目录):
1、对全屏截图并保存文件名:
scrot ~/abc.png
2、抓取窗口,b 参数表示带边框窗体,s 用户可以指定窗口:
scrot -bs ~/abc.png
3、抓取鼠标选定区域:
scrot -s ~/abc.png
4、延时抓取,d 表示延时,c 倒计时,10 是秒,抓菜单等其他东西时很好用:
scrot -cd 10 ~/abc.png
5、生成缩略图,t 表示要生成缩略图, 20% 表示缩略图的比例, s 表示截取用户划定区域:
scrot -t 20% -s ~/abc.png
6、启用某项操作 s 划定截图,-e 采用某项行为,这里用 gimp 打开截图图片,
scrot -s ~/abc.png -e 'gimp $f'
agave (龙舌兰)
非常不错,除了取色,配色,还可以将常用的颜色保存起来以备以后使用,apt-get之后就可以使用了
sudo apt-get install agave
Network tools in ubuntu
Wireshark
世界上使用Wireshark的人相当多。它具有一个协议分析程序的全部基本特性,而且还有其它产品所没有的其它特性。其开放源代码文本专利允许专业人员对其进行功能增强的工作。它可以运行在各种计算平台上,其中包括Unix,Linux,Windows等等。
(1)安装
sudo apt-get install Wireshark
(2)运行
如果你想打开Wireshark,可以打开Applications(应用程序)―>Internet(互联网)―> Wireshark
Etherape
EtherApe是Unix系统中的一个图形界面的网络监视器,能够以图形方式显示网络活动。主机和链接通信量的大小可以动态显示。它支持Ethernet、 FDDI、 Token Ring、ISDN、 PPP 、 SLIP等网络类型的设备。它可以过滤显示的通信,并能够从一个文件中读取通信数据,也可以从网络中读取动态数据。
(1)安装
sudo apt-get install etherape
(2)运行:
要运行etherape只需单击Applications―>Internet―>EtherApe:
在打开之后,你就可以看到所有网络协议的所有网络活动。
Ethstatus
Ethstatus是一个基于控制台的监视程序,用以显示以太网接口的统计数据。它与intraf类似,不过它以一个永久性控制台任务的形式运行,并可监视网络负载。
(1)安装
sudo apt-get install ethstatus
如果只是想在命令行上查看网卡的状态,可以直接输入如下的命令:
ethstatus
Install Flex builder in Ubuntu 8.0.4
The blog that follow use a ubuntu 8.04 computer
1 install jre
#sudo apt-get install sun-java6-jre
#sudo update-alternatives --config java
There are 2 alternatives which provide `java'.
Selection Alternative
-----------------------------------------------
1 /usr/bin/gij-wrapper-4.1
*+ 2 /usr/lib/jvm/java-6-sun/jre/bin/java
Press enter to keep the default[*], or type selection number:
choice 2
Then,
#sudo gedit /etc/environment
add the following 2 lines:
CLASSPATH=.:/usr/lib/jvm/java-6-sun/lib
JAVA_HOME=/usr/lib/jvm/java-6-sun
then,
#sudo gedit /etc/jvm
put the following to the top of this document
/usr/lib/jvm/java-6-sun
2 download flexbuilder_linux_install_a4_081408.bin and pdt-all-in-one-linux-gtk-1.0.3.tar.gz
Note:The version of eclipase must great than 3.2, so do not install it use
#sudo apt-get install eclipse
3 install flex builder
# ./flexbuilder_linux_install_a4_081408.bin
The solution without libgtk when install uplink in ubuntu
When I installed the linux game Uplink, There was an error:
edwin@edwin-desktop:~/Desktop$ sh ./uplink-demo-1.54.sh
Verifying archive integrity... All good.
Uncompressing Uplink demo 1.54DEMO...........................................................................................
/home/edwin/.setup10083: error while loading shared libraries: libgtk-1.2.so.0: cannot open shared object file: No such file or directory
So, I install the following:
sudo apt-get install libgtk1.2
sudo apt-get install libgpm1
在ubuntu安装其他主题
Ubuntu Studio
酷炫的Ubuntu Studio主题套件
代码:
sudo apt-get install ubuntustudio-themeubuntustudio-icon-theme ubuntustudio-gdm-theme ubuntustudio-wallpapers usplash-theme-ubuntustudio
Mac4Lin
进入Mac4Lin的工程主页:http://sourceforge.net/projects/mac4lin
点击 Download,然后把需要的软件包下载下来吧!
11/08/2008
Software versioning
一、版本号
1、V(Version):即版本,通常用数字表示版本号。(如:EVEREST Ultimate v4.20.1188 Beta)
2、Build:用数字或日期标示版本号的一种方式。(如:VeryCD eMule v0.48a Build 071112)
3、SP:Service Pack,升级包。(如:Windows XP SP 2/Vista SP 1)
二、授权和功能划分
1、Trial:试用版,通常都有时间限制,有些试用版软件还在功能上做了一定的限制。可注册或购买成为正式版。
2、Unregistered:未注册版,通常没有时间限制,在功能上相对于正式版做了一定的限制。可注册或购买成为正式版。
3、Demo:演示版,仅仅集成了正式版中的几个功能,不能升级成正式版。
4、Lite:精简版。
5、Full:完整版。
三、开发阶段划分
1、Alpha 版:内测版,内部交流或者专业测试人员测试用。Bug较多,普通用户最好不要安装。
2、Beta 版:公测版,专业爱好者大规模测试用,存在一些缺陷,该版本也不适合一般用户安装。
3、Gamma 版:相当成熟的测试版,与即将发行的正式版相差无几。
4、RC版:Release Candidate 候选版本,处于Gamma阶段。从Alpha到Beta再到Gamma是改进的先后关系,但RC1、RC2往往是取舍关系。
四、语言划分
1、SC:Simplified Chinese 简体中文版。
2、GBK:简体中文汉字内码扩展规范版。
3、TC:Traditional Chinese 繁体中文版。
4、BIG5:繁体中文大五码版。
5、UTF8:Unicode Transformation Format 8 bit,对现有的中文系统不是好的解决方案。
Developing Product based on the SVN
Repository Layout
We create a trunk directory to hold the “main line” of development, a branches directory to contain branch copies, and a tags directory to contain tag copies.These top-level directories is :
/trunk
/branches
/tags
1. trunk
The porpose of trunk is for branching, tagging, and merging the source code.
2. branches
Branch , a line of development that exists independently of another line, it always begins life as a copy of trunk's at sometime, and moves on from there, generating its own history.
Type A: maintainable branches for released version
Type B: feature-developing branches for new requirement
3. tags
A tag is just a “snapshot” of a project in time.The aim of tags to save the stable release version of product, there is an new maintainable branch should be build at the same time, just for the patch and issue solution
11/06/2008
Singleton pattern in PHP 5
1类别: 创建型设计模式
2意图: 确保一个类只有一个实例,而且自行向整个系统提供这一个实例(类本身提供一个实例的全局访问点)
3代码:
class Singleton {
// 用静态变量来存储signleton的实例
private static $_instance;
// 私有的构造器阻止New
private function __construct() {
...
}
// 避免除了New外,用户可以通过clone和序列化来获得多个singleton的实例
public function __clone() {
trigger_error('Clone is not allowed.', E_USER_ERROR);
}
public function __wakeup() {
trigger_error('Deserializing is not allowed.', E_USER_ERROR);
}
//用layz load 的方法,获得唯一实例
public static function getInstance() {
if (!self::$instance instanceof self) {
self::$instance = new self;
}
return self::$instance;
}
//singleton的实际作用
public function doAction() {
...
}
}
//usage
Singleton::getInstance()->doAction();
?>
更多: http://www.tonymarston.net/php-mysql/singleton.html
http://en.wikipedia.org/wiki/Singleton_pattern
How to publish source code in Blogger.com
Wordpress有许多代码语法高亮插件可以便捷地展示源代码,但是Blogspot我还发现此类的应用。不过我们可以让google prettify code为Blogspot着色代码。
google prettify code是一个轻量级的Javascript模块通过CSS文件对代码进行上色处理,支持C、Java、PHP、Python、HTMLl和Javascript等十几种语言。让我们动手吧。
1.进入Blogspot控制台 –>布局 –>修改HTML
在head区调用google prettify code的Javascript和CSS文件:
<link href="http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.css" rel="stylesheet" type="text/css"/>
<script src="http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.js" type="text/javascript"/>
2.将“”改成“”
3.修改pre标签的CSS以适合您的使用。
pre {
margin: 5px 20px;
border: 1px dashed #666;
padding: 5px;
background: #f8f8f8;
white-space: pre-wrap; /* css-3 */
white-space: -moz-pre-wrap; /* Mozilla, since 1999 */
white-space: -pre-wrap; /* Opera 4-6 */
white-space: -o-pre-wrap; /* Opera 7 */
word-wrap: break-word; /* Internet Explorer 5.5+ */
}
现在可以写一篇博客试一下了,将您的代码放在pre标签内,给pre加上class为“prettyprint”,即:
<pre class="”prettyprint”">your code
</pre>
11/03/2008
Gnome Keyboard Shortcuts
Tired of using your mouse so much? Did you know that Gnome has keyboard shortcuts for just about everything you can do with a mouse? Here's a list of the various shortcuts on both platforms.
General Shortcut Keys
Alt + F1 | Opens the Applicantions Menu . |
Alt + F2 | Displays the Run Application dialog. |
Print Screen | Takes a screenshot. |
Alt + Print Screen | Takes a screenshot of the window that has focus. |
Ctrl + Alt + right arrow | Switches to the workspace to the right of the current workspace. |
Ctrl + Alt + left arrow | Switches to the workspace to the left of the current workspace. |
Ctrl + Alt + up arrow | Switches to the workspace above the current workspace. |
Ctrl + Alt + down arrow | Switches to the workspace below the current workspace. |
Ctrl + Alt + d | Minimizes all windows, and gives focus to the desktop. |
F1 | Starts the online help browser, and displays appropriate online Help. |
Window Shortcut Keys
Alt + Tab | Switches between windows. When you use these shortcut keys, a list of windows that you can select is displayed. Release the keys to select a window. |
Alt + Esc | Switches between windows in reverse order. Release the keys to select a window. |
F10 | Opens the first menu on the left side of the menubar. |
Alt + spacebar | Opens the Window Menu . |
Arrow keys | Moves the focus between items in a menu. |
Return | Chooses a menu item. |
Esc | Closes an open menu. |
Ctrl + Alt + right arrow | Switches to the workspace to the right of the current workspace. |
Ctrl + Alt + left arrow | Switches to the workspace to the left of the current workspace. |
Ctrl + Alt + up arrow | Switches to the workspace above the current workspace. |
Ctrl + Alt + down arrow | Switches to the workspace below the current workspace. |
Ctrl + Alt + d | Minimizes all windows, and gives focus to the desktop. |
Panel Shortcut Keys
Ctrl + Alt + Tab | Switches the focus between the panels and the desktop. When you use these shortcut keys, a list of items that you can select is displayed. Release the keys to select an item. |
Ctrl + Alt + Esc | Switches the focus between the panels and the desktop. Release the keys to select an item. |
Ctrl + F10 | Opens the popup menu for the selected panel. |
Tab | Switches the focus between objects on a panel. |
Return | Chooses the selected panel object or menu item. |
Shift + F10 | Opens the popup menu for the selected panel object. |
Arrow keys | Moves the focus between items in a menu. Moves the focus between interface items in an applet also. |
Esc | Closes an open menu. |
F10 | Opens the Applications menu from the Menu Bar , if the Menu Bar is in a panel. |
Application Shortcut Keys
Shortcut Keys | Command |
---|---|
Ctrl + N | New |
Ctrl + X | Cut |
Ctrl + C | Copy |
Ctrl + V | Paste |
Ctrl + Z | Undo |
Ctrl + S | Save |
Ctrl + Q | Quit |
Update Error of linux-image on Ubuntu 8.04
When you install new update package named
Linux image 2.6.24-19-generic (版本 2.6.24-19.34)
(Linux kernel image for version 2.6.24 on x86/x86_64.)
, there an error :
/var/cache/apt/archives/linux-image-2.6.24-19-generic_2.6.24-19.43_i386.deb: unable to make backup link of `./boot/vmlinuz-2.6.24-19-generic' before installing new version
Solution:
Open a terminal, then execute the following command:sudo rm -fv /boot/initrd.img-2.6.24*.bak
sudo rm -fv /boot/vmlinuz-2.6.24-19-generic
sudo rm -fv /boot/initrd.img-2.6.24-19-generic
sudo rm -fv /boot/config-2.6.24-19-generic
sudo rm -fv /boot/abi-2.6.24-19-generic
sudo rm -fv /boot/System.map-2.6.24-19-generic
11/01/2008
Next:If you can see the future, you can save it
Cris (Nicholas Cage) has the power to see 2 minutes into the future, and works as a magician in Las Vegas with this talent, along with some moderate amount of sleight of hand. He notes however, that by the nature of seeing the future, every time he views it, it then changes. His ability is an innate talent he does not understand, but for a long time, Cris has been seeing a vision of a woman walking into a diner, far more than two minutes in his future. He knows the woman in his vision will arrive at 8:09, but does not know what day or if it is AM or PM, so he has been going to this diner twice a day every day to meet her and find out why he can see her farther than two minutes in the future. After drawing the suspicion of a Las Vegas casino by winning ten thousand dollars in a series of small, coincidental hands, Cage slips by their frustrated security, thwarting a robbery on his way out. The following day, after evading the FBI (that is attempting to bring him in to help with an anti-terror investigation), Cris finally sees Liz (Jessica Biel), the woman from his dream. After attempting to introduce himself repeatedly--each time seeing his advance fall flat, then changing his actions and thus the future--he charms her enough to get a ride from her to Flagstaff, Arizona. Cris is, of course, not headed there, but, thanks to his future sight, knows she is. When a road is washed out, they are forced to stay at a hotel on the edge of a cliff.
Agent Farris tracks them and assembles a large team to bring Cris in. The terrorists, who have been watching the FBI, also follow, hoping to kill Cris before he can help the authorities. Agent Farris confronts Liz while she is walking near the hotel and persuades her to drug Cris so that they can bring him in peacefully. Instead, Liz warns Cris, who tells her about his secret. When she asks why he will not help the FBI stop the terrorists, he tells her about the limitations of his ability. He can only see his future, and only two minutes in the future, but that he can see much further on matters concerning her. When Cris tries to escape, he is arrested, and the terrorists kidnap Liz.
In custody, Cris is strapped to a chair with his eyes held open and forced to watch television until he can have a vision that helps the FBI. When he sees a report of Liz being strapped with explosives and blown up, Agent Farris promises to help save her as long as Cris will help her.
Cris uses his future visions to find the terrorists and lead a tactical team on a raid to stop them. When they arrive, Cris is able to walk right up to the terrorist leader by seeing where the bullets will go and dodging them. After killing the terrorists and saving Liz, they realize that the bomb has already been moved. Agent Farris shows a seismograph to Cris hoping that he will see any tremors caused by explosions before they happen. Just then, he starts yelling that it is happening now, and in the distance, the bomb goes off, destroying everything around them.
Then we see Cris and Liz sleeping on a bed. Cris is reflecting that "every time you look into the future, it changes... because you looked at it." Because the nuclear weapon the terrorists had could hurt Liz, Cage has been able to see a day into the future, and is, as he lies there, exploring different possible courses of action, doing what, he reveals to Liz, is his duty that he has evaded for a long time, using his power to save people, now that he, having found Liz and love, has the courage to do so.
精彩对白:
Cris Johnson : You've probably seen a lot of those shows - Mentalists, Magicians, Illusionists - and wondered if they're the real deal. Your skepticism tells you it's just an act. That way, you can sleep at night. You'd be shocked to know that sometimes, not often, but sometimes, it is the real deal, masquerading as an act, hiding behind a few 50-dollar tricks, hiding in plain sight. Because if the magician doesn't do that…the alternative is impossible to live with…"
克里斯·约翰逊:你可能已经看过一些这样的表演--超能力者、巫术师、魔术师--想知道他们的能力是否是真实存在的。你怀疑的天性会告诉你,这只是一场表演……因为只有这样,你才能在晚上睡得安稳些。有的时候,你可能会对这个认知感到震惊,不是常常,是有时候--这些都是真的,只是被伪装成了一场表演,隐藏在一个只值50美元的小把戏或在眼睛能及的地方后面。因为魔术师只能假装这是不真实的把戏,否则他就没有什么选择的余地了。
Callie Ferris: Tell me what just happened. What did you see
Cris Johnson: If I do what you want, you'll keep me in this chair forever.
凯莉·弗瑞斯:告诉我刚刚发生了什么?你看到了什么?
克里斯·约翰逊:如果我告诉你,能让我永远坐在这把舒服的椅子里吗?
Liz: You can see things before they happen
Cris Johnson: Only my future... except with you. I saw far beyond anything I'd ever seen before. You need to get away from here.
莉兹:你能在事情发生前就预见到它?
克里斯·约翰逊:只是与我有关的未来……除了你之外。我刚看到了一些以前看到过的……你必须马上离开这里。
Callie Ferris: I believe that the urgency of this situation compels the use of any and all resources to obtain Cris Johnson.
凯莉·弗瑞斯:我认为目前的紧张形势,足以允许让我们使用一切手段和资源得到克里斯·约翰逊。
Cris Johnson: I've seen every possible ending. None of them are good for you.
克里斯·约翰逊:我已经看到了每一个有可能出现的结局,不过它们中的任何一个对于你来说都不是好消息。
Liz: I don't want you to die.
Cris Johnson: It happened. It just hasn't happened yet.
莉兹:我不想让你死。
克里斯·约翰逊:死亡早晚会降临的,只是现在还不到时候而已
10/21/2008
A Zend_locale Problem:the migration of Zend_Locale
Today, my project based on Zend Framework have this error message:
You are running Zend_Locale in compatibility mode... please migrate
your scripts.
I search on Google, find this article named:: I18N compatibility mode
So, I change my code in class system_Bootstrap:
private function _buildLocale() {
if (! $this->_locale instanceof Zend_Locale) {
Zend_Locale::$compatibilityMode = false; //add this line
$this->_locale = new Zend_Locale ('zh');
Zend_Registry::set ( 'locale', $this->_locale );
}
return $this->_locale;
}
10/20/2008
Some Commands of SVN
Context: We have a new project named Odour
Get Svn help
$ svn help
Get sub-commands' help
$ svn help add
Import a new Project
$ cd ~/project
$ mkdir -p Odour/{trunk,branches,tags}
$ svn import svntest https://localhost/svn/Odour --message "Start project"
$ rm -rf Odour
The aim of this operation is to build a new project named Odour, there are three sub-directory in this project involved trank, branches, and tags. Then you should delete the Odour when you have imported the project to our repository named https://localhost/test/svntest
Checkout a project
$ svn checkout https://localhost/test/svntest/trunk --username= yourname
Some example about the reversion
$ svn diff --revision PREV:COMMITTED foo.php
# shows the last change committed to foo.php
$ svn log --revision HEAD
# shows log message for the latest repository commit
$ svn diff --revision HEAD
# compares your working file (with local changes) to the latest version
# in the repository
$ svn diff --revision BASE:HEAD foo.php
# compares your “pristine” foo.php (no local changes) with the
# latest version in the repository
$ svn log --revision BASE:HEAD
# shows all commit logs since you last updated
$ svn update --revision PREV foo.php
# rewinds the last change on foo.php
# (foo.php's working revision is decreased)
$ svn checkout --revision 3
# specified with revision number
$ svn checkout --revision {2002-02-17}
$ svn checkout --revision {15:30}
$ svn checkout --revision {15:30:00.200000}
$ svn checkout --revision {"2002-02-17 15:30"}
$ svn checkout --revision {"2002-02-17 15:30 +0230"}
$ svn checkout --revision {2002-02-17T15:30}
$ svn checkout --revision {2002-02-17T15:30Z}
$ svn checkout --revision {2002-02-17T15:30-04:00}
$ svn checkout --revision {20020217T1530}
$ svn checkout --revision {20020217T1530Z}
$ svn checkout --revision {20020217T1530-0500}
Update
$ svn up
add
$ svn add foo.file
$ svn add foo1.dir
$ svn add foo2.dir --non-recursive
$ svn delete README
Conflict
The svn will create three files named .mine, .rOLDREV, .rNEWREV separately When the workcopy have confict with header version, for example:
$ ls -l
sandwich.txt
sandwich.txt.mine
sandwich.txt.r1
sandwich.txt.r2
There are there method to resolve this confict.
Method A: modify the sandwich.txt, then run:
$ svn resolved sandwich.txt
Mehtod B: use the header version to override your version
$ cp sandwich.txt.r2 sandwich.txt
$ svn resolved sandwich.txt
Method C: use revert
$ svn revert sandwich.txt
Reverted 'sandwich.txt'
$ ls sandwich.*
sandwich.txt
Then , you can submit your workcopy$ svn commit --message "Correct some fatal problems"
$ svn commit --file logmsg
$ svn commit
Clean Up
svn cleanup
Build branch
Method A: local build
$ svn checkout http://svn.example.com/repos/calc bigwc
A bigwc/trunk/
A bigwc/trunk/Makefile
A bigwc/trunk/integer.c
A bigwc/trunk/button.c
A bigwc/branches/
Checked out revision 340.
$ cd bigwc
$ svn copy trunk branches/my-calc-branch
$ svn status
A + branches/my-calc-branch
$ svn commit -m "Creating a private branch of /calc/trunk."
Adding branches/my-calc-branch
Committed revision 341.
Method B:remote build
$ svn copy http://svn.example.com/repos/calc/trunk \
http://svn.example.com/repos/calc/branches/my-calc-branch \
-m "Creating a private branch of /calc/trunk."
Committed revision 341.
Swith to branch from trunk
$ cd calc
$ svn info | grep URL
URL: http://svn.example.com/repos/calc/trunk
$ svn switch http://svn.example.com/repos/calc/branches/my-calc-branch
U integer.c
U button.c
U Makefile
Updated to revision 341.
$ svn info | grep URL
URL: http://svn.example.com/repos/calc/branches/my-calc-branch
Build a tag
$ svn copy http://svn.example.com/repos/calc/trunk \
http://svn.example.com/repos/calc/tags/release-1.0 \
-m "Tagging the 1.0 release of the 'calc' project."
$ ls
my-working-copy/
$ svn copy my-working-copy http://svn.example.com/repos/calc/tags/mytag
Committed revision 352.
Delete a branch
$ svn delete http://svn.example.com/repos/calc/branches/my-calc-branch \
-m "Removing obsolete branch of calc project."
Create a new repository
$ svnadmin help
...
$ svnadmin help create
...
$ svnadmin create bdb /usr/local/repository/svn/test
$ chown -R svn.svn /usr/local/repository/svn/test
common YUM command in CentOs
1.列出所有可更新的软件清单
命令:yum check-update
2.安装所有更新软件
命令:yum update
3.仅安装指定的软件
命令:yum install
4.仅更新指定的软件
命令:yum update
5.列出所有可安裝的软件清单
命令:yum list
用YUM安装删除软件
装了系统添加删除软件是常事,yum同样可以胜任这一任务,只要软件是rpm安装的。
安装的命令是,yum install xxx,yum会查询数据库,有无这一软件包,如果有,则检查其依赖冲突关系,如果没有依赖冲突,那么最好,下载安装;如果有,则会给出提示,询问是否要同时安装依赖,或删除冲突的包,你可以自己作出判断。
删除的命令是,yum remove xxx,同安装一样,yum也会查询数据库,给出解决依赖关系的提示。
1.用YUM安装软件包
命令:yum install
2.用YUM删除软件包
命令:yum remove
用YUM查询软件信息
我 们常会碰到这样的情况,想要安装一个软件,只知道它和某方面有关,但又不能确切知道它的名字。这时yum的查询功能就起作用了。你可以用 yum search keyword这样的命令来进行搜索,比如我们要则安装一个Instant Messenger,但又不知到底有哪些,这时不妨用 yum search messenger这样的指令进行搜索,yum会搜索所有可用rpm的描述,列出所有描述中和messeger有关的rpm包,于 是我们可能得到gaim,kopete等等,并从中选择。
有时我们还会碰到安装了一个包,但又不知道其用途,我们可以用yum info packagename这个指令来获取信息。
1.使用YUM查找软件包
命令:yum search
2.列出所有可安装的软件包
命令:yum list
3.列出所有可更新的软件包
命令:yum list updates
4.列出所有已安装的软件包
命令:yum list installed
5.列出所有已安装但不在 Yum Repository 內的软件包
命令:yum list extras
6.列出所指定的软件包
命令:yum list
7.使用YUM获取软件包信息
命令:yum info
8.列出所有软件包的信息
命令:yum info
9.列出所有可更新的软件包信息
命令:yum info updates
10.列出所有已安裝的软件包信息
命令:yum info installed
11.列出所有已安裝但不在 Yum Repository 內的软件包信息
命令:yum info extras
12.列出软件包提供哪些文件
命令:yum provides
清除YUM缓存
yum 会把下载的软件包和header存储在cache中,而不会自动删除。如果我们觉得它们占用了磁盘空间,可以使用yum clean指令进行清除,更精确 的用法是yum clean headers清除header,yum clean packages清除下载的rpm包,yum clean all一 股脑儿端
1.清除缓存目录(/var/cache/yum)下的软件包
命令:yum clean packages
2.清除缓存目录(/var/cache/yum)下的 headers
命令:yum clean headers
3.清除缓存目录(/var/cache/yum)下旧的 headers
命令:yum clean oldheaders
命令:yum clean, yum clean all (= yum clean packages; yum clean oldheaders)
Update the Rsync from 2.8 to 3.0.4 on CentOs
安裝 for CenOS 5 i386 版的 rpmforge-release package
- wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.3.6-1.el5.rf.i386.rpm
- rpm -ivh rpmforge-release-0.3.6-1.el5.rf.i386.rpm
安裝之後,在 /etc/yum.repos.d/ 目錄底下會多了兩個檔案,分別為 mirrors-rpmforge與 rpmforge.repo
執行 yum update rsync 之後,就可以看到有新版的 rsync 可以升級囉!
10/19/2008
Add x-debugger-server to the test server
Step:
1 download the x-debugger-server
http://downloads.zend.com/pdt/server-debugger/
2 Locate ZendDebugger.so or ZendDebugger.dll file
that is compiled for the correct version of PHP (4.3.x, 4.4.x, 5.0.x, 5.1.x, 5.2.x) in the
appropriate directory.
("5_2_x_comp" is used for me)
2. Add the following line to the php.ini file:
Linux and Mac OS X: zend_extension=/full/path/to/ZendDebugger.so
Windows: zend_extension_ts=/full/path/to/ZendDebugger.dll
zend_debugger.allow_hosts=
zend_debugger.expose_remotely=always
example:
[Zend]
zend_extension_ts=D:/PHP/ext/ZendDebugger.dll
zend_debugger.allow_hosts=127.0.0.1/32
zend_debugger.allow_tunnel=127.0.0.1/32
zend_debugger.expose_remotely=always
3. Place dummy.php file in the document root directory.
when in ZF project :add the DummyphpController.php to default Module
class DummyphpController extends Core_Controller_Abstract {
public function indexAction() {
@ini_set ( 'zend_monitor.enable', 0 );
if (@function_exists ( 'output_cache_disable' )) {
@output_cache_disable ();
}
if (isset ( $_GET ['debugger_connect'] ) && $_GET ['debugger_connect'] == 1) {
if (function_exists ( 'debugger_connect' )) {
debugger_connect ();
exit ();
} else {
echo "No connector is installed.";
}
}
}
}
?>
4. Restart web server.
10/18/2008
set up the player in ubuntu
1 add the resource ,and update ,install it
sudo wget http://www.medibuntu.org/sources.list.d/hardy.list -O /etc/apt/sources.list.d/medibuntu.list
sudo apt-get update && sudo apt-get install medibuntu-keyring && sudo apt-get update
2 install xine
sudo apt-get install libxine1-ffmpeg libxine1-all-plugins libxine1-plugins w32codecs gcc-3.3-base libstdc++5
3 install gstream
sudo apt-get install gstreamer0.10-ffmpeg gstreamer0.10-pitfdll gstreamer0.10-plugins-bad gstreamer0.10-plugins-bad-multiverse gstreamer0.10-plugins-ugly gstreamer0.10-plugins-ugly-multiverse gstreamer0.10-esd
sudo apt-get install gstreamer0.10-fluendo-mpegdemux gstreamer0.10-gnonlin libflashsupport
4 install smplay
sudo apt-get remove totem-mozilla -y
sudo apt-get install smplayer smplayer-themes mozilla-mplayer
10/17/2008
Install process of Ubuntu8.X
The aim of this article is to log the ubuntu install process for PHP developers . So , if you want to work on Ubuntu , this article will give you some hands.
1 Install system by CD
Note:set the language to English
2 Directions layout
Select to manually edit the partition table. I’m doing my testing on a standard 80GB harddrive and will modify these sizes for production.
/boot ext3 200MB bootable
/ ext3 15GB or More (files are relatively static)
swap 4GB (4xRAM if you don't have much memory, down to 1xRAM if you have gobs of memory)
/home ext3 10GB (personal files)
/repository ext3 40G (for you other archives)
/backup ext3 16G (workspace)
3 add the resurce
deb http://archive.ubuntu.org.cn/ubuntu-cn/ hardy main restricted universe multiverse
deb http://tw.archive.ubuntu.com/ubuntu hardy main restricted universe multiverse
deb http://tw.archive.ubuntu.com/ubuntu hardy-security main restricted universe multiverse
deb http://tw.archive.ubuntu.com/ubuntu hardy-updates main restricted universe multiverse
deb http://tw.archive.ubuntu.com/ubuntu hardy-backports main restricted universe multiverse
deb http://tw.archive.ubuntu.com/ubuntu hardy-proposed main restricted universe multiverse
deb-src http://tw.archive.ubuntu.com/ubuntu hardy main restricted universe multiverse
deb-src http://tw.archive.ubuntu.com/ubuntu hardy-security main restricted universe multiverse
deb-src http://tw.archive.ubuntu.com/ubuntu hardy-updates main restricted universe multiverse
deb-src http://tw.archive.ubuntu.com/ubuntu hardy-backports main restricted universe multiverse
deb-src http://tw.archive.ubuntu.com/ubuntu hardy-proposed main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu/ hardy main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu/ hardy-security main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu/ hardy-updates main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu/ hardy-proposed main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu/ hardy-backports main restricted universe multiverse
deb-src http://archive.ubuntu.com/ubuntu/ hardy main restricted universe multiverse
deb-src http://archive.ubuntu.com/ubuntu/ hardy-security main restricted universe multiverse
deb-src http://archive.ubuntu.com/ubuntu/ hardy-updates main restricted universe multiverse
deb-src http://archive.ubuntu.com/ubuntu/ hardy-proposed main restricted universe multiverse
deb-src http://archive.ubuntu.com/ubuntu/ hardy-backports main restricted universe multivers
then
# sudo apt-get update
4 edit fstab
mkdir /home/edwin/workspace
mkdir /home/edwin/repository
sudo gedit /etc/fstab
then add the fllowing
/dev/sda6 /home/edwin/repository ext3 defaults 0 0
/dev/sda5 /home/edwin/workspace ext3 defaults 0 0
5 setting the SCIM
if you have set the current profile that the scim is available, the following process is just for you.
5.1 install scim pinyin
sudo apt-get install scim-pinyin
5.2 setting scim
sudo im-switch -s scim
5.3 Edit the file /etc/X11/xinit/xinput.d/scim by typing in a terminal (Applications>Accessories>Terminal):
sudo gedit /etc/X11/xinit/xinput.d/scim
If you want to use scim input in KDE applications, you will also have to change the following line :
GTK_IM_MODULE="xim"
QT_IM_MODULE="xim"
into :
GTK_IM_MODULE="scim-bridge"
QT_IM_MODULE="scim-bridge"
5.4 sudo gedit /usr/lib/gtk-2.0/2.10.0/immodule-files.d/libgtk2.0-0.immodules
find the followling line,
"xim" "X Input Method" "gtk20" "/usr/share/locale" "ko:ja:th:zh"
change the them into:
"xim" "X Input Method" "gtk20" "/usr/share/locale" "en:ko:ja:th:zh"
6 setting Right Click Terminal Menu
sudo apt-get install nautilus-open-terminal
7 setting the docs reader
sudo apt-get install xpdf-chinese-simplified xpdf-chinese-traditional poppler-data
8 install zip tools
sudo apt-get install unrar p7zip-full cabextract
9 install devs tools
install zend server
sudo apt-get install build-essential autoconf automake subversion
sudo apt-get install mysql-server mysql-client
10 install system rc tools
sudo apt-get install sysv-rc-conf
10/15/2008
setup Compiz Fusion in ubuntu
1 add deb source
deb http://download.tuxfamily.org/3v1deb feisty eyecandy
deb-src http://download.tuxfamily.org/3v1deb feisty eyecandy
get keywget http://download.tuxfamily.org/3v1deb/DD800CD9.gpg -O- | sudo apt-key add -
2 update systemsudo apt-get update
sudo apt-get dist-upgrade
3 Install Compiz and Compiz Fusionsudo apt-get install compiz compiz-gnome compiz-fusion-* compizconfig-settings-manager
4、run Compiz Fusion
in sessions, add the following
compiz --replace
5、if you want to use Compiz Fusion + emerald, so run the following
sudo apt-get install emerald
in sessions
compiz --replace -c emerald &
10/11/2008
Build Flex SDK in Ubuntu 8.X
1、安装Java环境
(1)安装sun-java6-jre/sun-java6-jdk
sudo apt-get install sun-java6-jre
sudo apt-get install sun-java6-jdk
(2)设置当前默认的java解释器:
sudo update-alternatives --config java
执行后会出现类似如下的画面:
There are 2 alternatives which provide `java'.
Selection Alternative
-----------------------------------------------
*+ 1 /usr/lib/jvm/java-6-sun/jre/bin/java
2 /usr/bin/gij-wrapper-4.1
Press enter to keep the default
(3)编辑/etc/environment,加入下面两行:
CLASSPATH=.:/usr/lib/jvm/java-6-sun/lib
JAVA_HOME=/usr/lib/jvm/java-6-sun
sudo gedit /etc/jvm
将文件中的/usr/lib/jvm/java-6-sun
这一行填入到配置块的顶部
2. 安装flex Sdk
安装Adobe FLEX 3.0 SDK 从下面的地址http://www.adobe.com/go/flex3_sdk下载Adobe FLEX 3.0 SDK,我下载的是flex_sdk_3.2.0.3562_mpl.zip
#mkdir /home/edwin/flexSdk
#cd /home/edwin
#unzip Desktop/flex_sdk_3.2.0.3562_mpl.zip -d flexSdk/
#chmod -R 777 flexSdk/bin
3 测试
#gedit hello.as
#/home/edwin/flexSdk/mxmlc hello.as
#firefox hello.swf
9/20/2008
9/18/2008
9/13/2008
Many tips for optimize your php code
1。 If a method can be static, declare it static。 Speed improvement is by a factor of 4。 如果一个方法可静态化,就对它做静态声明。速率可提升至4倍。
2。 echo is faster than print。 echo 比 print 快。
3。 Use echo’s multiple parameters instead of string concatenation。 使用echo多重参数(译注:指用逗号而不是句点)代替字符串连接。
4。 Set the maxvalue for your for-loops before and not in the loop。 在执行for循环之前确定最大循环数,不要每循环一次都计算最大值。
5。 Unset your variables to free memory, especially large arrays。 注销那些不用变量尤其是大数组,以便释放内存。
6。 Avoid magic like __get, __set, __autoload 尽量避免使用__get,__set,__autoload。
7。 require_once() is expensive 少用require_once()
8。 Use full paths in includes and requires, less time spent on resolving the OS paths。 在包含文件时使用完整路径,解析操作系统路径所需时间会更少。
9。 If you need to find out the time when the script started executing, $_SERVER[’REQUEST_TIME’] is preferred to time() 如果你想知道脚本开始执行时刻,使用$_SERVER[‘REQUEST_TIME’]要好于 time()。
10。 See if you can use strncasecmp, strpbrk and stripos instead of regex。 检查是否能用strncasecmp,strpbrk,stripos函数代替正则表达式完成相同功能。
11。 str_replace is faster than preg_replace, but strtr is faster than str_replace by a factor of 4。 str_replace函数比preg_replace函数快,但strtr函数效率是str_replace函数(9php.com)四倍。
12。 If the function, such as string replacement function, accepts both arrays and single characters as arguments, and if your argument list is not too long, consider writing a few redundant replacement statements, passing one character at a time, instead of one line of code that accepts arrays as search and replace arguments。如果一个字符串替换函数,可接受数组或字符作为参数,并且参数长度不太长,那么可以考虑额外写一段替换代码,使得每次传递参数是一个字符,而不是只写一行代码接受数组作为查询和替换参数。
13。 It’s better to use select statements than multi if, else if, statements。 使用选择分支语句好于使用多个if,else if语句。
14。 Error suppression with @ is very slow。 用@屏蔽错误消息做法非常低效。
15。 Turn on apache’s mod_deflate 打开apachemod_deflate模块。
16。 Close your database connections when you’re done with them。 数据库连接当使用完毕时应关掉。
17。 $row[’id’] is 7 times faster than $row[id]。 $row[‘id’]效率是$row[id]7倍。
18。 Error messages are expensive。 错误消息代价昂贵。
19。 Do not use functions inside of for loop, such as for ($x=0; $x < x="0;">prop++) is 3 times slower than a local variable。 递增一个对象属性(如:$this->prop++)要比递增一个局部变量慢3倍。
23。 Incrementing an undefined local variable is 9-10 times slower than a pre-initialized one。递增一个未预定义局部变量要比递增一个预定义局部变量慢9至10倍。
24。 Just declaring a global variable without using it in a function also slows things down (by about the same amount as incrementing a local var)。 PHP probably does a check to see if the global exists。仅定义一个局部变量而没在函数中调用它,同样会减慢速度(其程度相当于递增一个局部变量)。PHP大概会检查看是否存在全局变量。
25。 Method invocation appears to be independent of the number of methods defined in the class because I added 10 more methods to the test class (before and after the test method) with no change in performance。方法调与类中定义方法数量无关
26。 Methods in derived classes run faster than ones defined in the base class。 派生类中方法运行起来要快于在基类中定义同样方法。
27。 A function call with one parameter and an empty function body takes about the same time as doing 7-8 $localvar++ operations。 A similar method call is of course about 15 $localvar++ operations。调用带有一个参数空函数,其花费时间相当于执行7至8次局部变量递增操作。类似 方法调用所花费时间接近于15次局部变量递增操作。
28。 Surrounding your string by ‘ instead of " will make things interpret a little faster since php looks for variables inside "…" but not inside ‘…’。 Of course you can only do this when you don’t need to have variables in the string。用单引号代替双引号来包含字符串,这样做会更快一些。因为PHP会在双引号包围字符串中搜寻变量,单引号则不会。当然,只有当你不需要在字符串中包含变量时才可以这么做。
29。 When echoing strings it’s faster to separate them by comma instead of dot。 Note: This only works with echo, which is a function that can take several strings as arguments。输出多个字符串时,用逗号代替句点来分隔字符串,速度更快。注意:只有echo能这么做,它是一种可以把多个字符串当作参数“函数 ”(译注:PHP手册中说echo是语言结构,不是真正函数,故把函数加上了双引号)。
30。 A PHP script will be served at least 2-10 times slower than a static HTML page by Apache。 Try to use more static HTML pages and fewer scripts。 Apache解析一个PHP脚本时间要比解析一个静态HTML页面慢2至10倍。尽量多用静态HTML页面,少用脚本。
31。 Your PHP scripts are recompiled every time unless the scripts are cached。 Install a PHP caching product to typically increase performance by 25-100% by removing compile times。除非脚本可以缓存,否则每次调用时都会重新编译一次。引入一套PHP缓存机制通常可以提升25%至100%性能,以免除编译开销。
32。 Cache as much as possible。 Use memcached - memcached is a high-performance memory object caching system intended to speed up dynamic web applications by alleviating database load。 OP code caches are useful so that your script does not have to be compiled on every request。尽量做缓存,可使用memcached。memcached是一款高性能内存对象缓存系统,可用来加速动态Web应用程序,减轻数据库负载。对运算码缓存很有用,使得脚本不必为每个请求做重新编译。
33。 When working with strings and you need to check that the string is either of a certain length you’d understandably would want to use the strlen() function。 This function is pretty quick since it’s operation does not perform any calculation but merely return the already known length of a string available in the zval structure (internal C struct used to store variables in PHP)。 However because strlen() is a function it is still somewhat slow because the function call requires several operations such as lowercase & hashtable lookup followed by the execution of said function。 In some instance you can improve the speed of your code by using an isset() trick。当操作字符串并需要检验其长度是否满足某种要求时,你想当然地会使用strlen()函数。此函数执行起来相当快,因为它不做任何计算,只返回在zval 结构(C内置数据结构,用于存储PHP变量)中存储已知字符串长度。但是,由于strlen()是函数,多多少少会有些慢,因为函数调用会经过诸多步骤,如字母小写化(译注:指函数名小写化,PHP不区分函数名大小写)、哈希查找,会跟随被调用(函数一起执行。在某些情况下,你可以使用isset()技巧加速执行你代码。
举例如下
if (strlen($foo) < 5) { echo "Foo is too short"; } 与下面做比较 if (!isset($foo{5})) { echo "Foo is too short"; } Calling isset() happens to be faster then strlen() because unlike strlen(), isset() is a language construct and not a function meaning that it’s execution does not require function lookups and lowercase。 This means you have virtually no overhead on top of the actual code that determines the string’s length。调用isset()恰巧比strlen()快,因为与后者不同是,isset()作为一种语言结构,意味着它执行不需要函数查找和字母小写化。也就是说,实际上在检验字符串长度顶层代码中你没有花太多开销。 34。 When incrementing or decrementing the value of the variable $i++ happens to be a tad slower then ++$i。 This is something PHP specific and does not apply to other languages, so don’t go modifying your C or Java code thinking it’ll suddenly become faster, it won’t。 ++$i happens to be faster in PHP because instead of 4 opcodes used for $i++ you only need 3。 Post incrementation actually causes in the creation of a temporary var that is then incremented。 While pre-incrementation increases the original value directly。 This is one of the optimization that opcode optimized like Zend’s PHP optimizer。 It is still a good idea to keep in mind since not all opcode optimizers perform this optimization and there are plenty of ISPs and servers running without an opcode optimizer。当执行变量$i递增或递减时,$i++会比++$i慢一些。这种差异是PHP特有,并不适用于其他语言,所以请不要修改你C或Java代码并指望它们能立即变快,没用。++$i更快是因为它只需要3条指令 (opcodes),$i++则需要4条指令。后置递增实际上会产生一个临时变量,这个临时变量随后被递增。而前置递增直接在原值上递增。这是最优化处理一种,正如ZendPHP优化器所作那样。牢记这个优化处理不失为一个好主意,因为并不是所有指令优化器都会做同样优化处理,并且存在大量没有装配指令优化器互联网服务提供商(ISPs)和服务器。 35。 Not everything has to be OOP, often it is too much overhead, each method and object call consumes a lot of memory。并不是事必面向对象(OOP),面向对象往往开销很大,每个方法和对象调用都会消耗很多内存。 36。 Do not implement every data structure as a class, arrays are useful, too。 并非要用类实现所有数据结构,数组也很有用。 37。 Don’t split methods too much, think, which code you will really re-use。 不要把方法细分得过多,仔细想想你真正打算重用是哪些代码? 38。 You can always split the code of a method later, when needed。 当你需要时,你总能把代码分解成方法。 39。 Make use of the countless predefined functions。 尽量采用大量PHP内置函数。 40。 If you have very time consuming functions in your code, consider writing them as C extensions。如果在代码中存在大量耗时函数,你可以考虑用C扩展方式实现它们。 41。 Profile your code。 A profiler shows you, which parts of your code consumes how many time。 The Xdebug debugger already contains a profiler。 Profiling shows you the bottlenecks in overview。评估检验(profile)你的代码。检验器会告诉你,代码哪些部分消耗了多少时间。Xdebug调试器包含了检验程序,评估检验总体上可以显示出代码瓶颈。 42。 mod_gzip which is available as an Apache module compresses your data on the fly and can reduce the data to transfer up to 80%。 mod_zip可作为Apache模块,用来即时压缩你数据,并可让数据传输量降低80%
更多
数据库中主键和外键的设计原则
主键和外键是把多个表组织为一个有效的关系数据库的粘合剂。主键和外键的设计对物理数据库的性能和可用性都有着决定性的影响。
必须将数据库模式从理论上的逻辑设计转换为实际的物理设计。而主键和外键的结构是这个设计过程的症结所在。一旦将所设计的数据库用于了生产环境,就很难对这些键进行修改,所以在开发阶段就设计好主键和外键就是非常必要和值得的。
主键:
关系数据库依赖于主键---它是数据库物理模式的基石。主键在物理层面上只有两个用途:
1. 惟一地标识一行。
2. 作为一个可以被外键有效引用的对象。
基于以上这两个用途,下面给出了我在设计物理层面的主键时所遵循的一些原则:
1. 主键应当是对用户没有意义的。如果用户看到了一个表示多对多关系的连接表中的数据,并抱怨它没有什么用处,那就证明它的主键设计地很好。
2. 主键应该是单列的,以便提高连接和筛选操作的效率。
注:使用复合键的人通常有两个理由为自己开脱,而这两个理由都是错误的。其一是主键应当具有实际 意义,然而,让主键具有意义只不过是给人为地破坏数据库提供了方便。其二是利用这种方法可以在描述多对多关系的连接表中使用两个外部键来作为主键,我也反 对这种做法,理由是:复合主键常常导致不良的外键,即当连接表成为另一个从表的主表,而依据上面的第二种方法成为这个表主键的一部分,然,这个表又有可能 再成为其它从表的主表,其主键又有可能成了其它从表主键的一部分,如此传递下去,越靠后的从表,其主键将会包含越多的列了。
3. 永远也不要更新主键。实际上,因为主键除了惟一地标识一行之外,再没有其他的用途了,所以也就没有理由去对它更新。如果主键需要更新,则说明主键应对用户无意义的原则被违反了。
注:这项原则对于那些经常需要在数据转换或多数据库合并时进行数据整理的数据并不适用。
4. 主键不应包含动态变化的数据,如时间戳、创建时间列、修改时间列等。
5. 主键应当有计算机自动生成。如果由人来对主键的创建进行干预,就会使它带有除了惟一标识一行以外的意义。一旦越过这个界限,就可能产生认为修改主键的动机,这样,这种系统用来链接记录行、管理记录行的关键手段就会落入不了解数据库设计的人的手中。
数据库设计常识
表和字段的设计(数据库逻辑设计)
表设计原则
1) 标准化和规范化 数 据的标准化有助于消除数据库中的数据冗余。标准化有好几种形式,但Third Normal Form(3NF)通常被认为在性能、扩展性和数据完整性方 面达到了最好平衡。简单来说,遵守3NF 标准的数据库的表设计原则是:“One Fact in One Place”即某个表只包括其本身基本的属性,当不是它们本身所具有的属性时需进行分解。表之间的关系通过外键相连接。它具有以下特点:有一组表专门存放通过键连接起来的关联数据。
举例:某个存放客户及其有关定单的3NF 数据库就可能有两个表:Customer 和Order。Order 表不包含定单关联客户的任何信息,但表内会存放一个键值,该键指向Customer 表里包含该客户信息的那一行。事实上,为了效率的缘故,对表不进行标准化有时也是必要的。
2) 数据驱动 采用数据驱动而非硬编码的方式,许多策略变更和维护都会方便得多,大大增强系统的灵活性和扩展性。 举例,假如用户界面要访问外部数据源(文件、XML 文档、其他数据库等),不妨把相应的连接和路径信息存储在用户界面支持表里。还有,如果用户界面执行工作流之类的任务(发送邮件、打印信笺、修改记录状态等),那么产生工作流的数据也可以存放在数据库里。角色权限管理也可以通过数据驱动来完成。事实上,如果过程是数据驱动的,你就可以把相当大的责任推给用户,由用户来维护自己的工作流过程。
3) 考虑各种变化 在设计数据库的时候考虑到哪些数据字段将来可能会发生变更。举例,姓氏就是如此(注意是西方人的姓氏,比如女性结婚后从夫姓等)。所以,在建立系统存储客户信息时,在单独的一个数据表里存储姓氏字段,而且还附加起始日和终止日等字段,这样就可以跟踪这一数据条目的变化。
字段设计原则
4) 每个表中都应该添加的3 个有用的字段
* CreationDate,在VB 下默认是Now(),而在SQL Server 下默认为GETDATE()
* ModifyDate,记录修改的时间
5) 对地址和电话采用多个字段
描述街道地址就短短一行记录是不够的。Address_Line1、Address_Line2 和Address_Line3 可以提供更大的灵活性。还有,电话号码和邮件地址最好拥有自己的数据表,其间具有自身的类型和标记类别。
6) 使用角色实体定义属于某类别的列
在需要对属于特定类别或者具有特定角色的事物做定义时,可以用角色实体来创建特定的时间关联关系,从而可以实现自我文档化。
举例:用PERSON 实体和PERSON_TYPE 实体来描述人员。比方说,当John Smith, Engineer 提升为 John Smith, Director 乃至最后爬到John Smith, CIO 的高位,而所有你要做的不过是改变两个表PERSON 和 PERSON_TYPE 之间关系的键值,同时增加一个日期/时间字段来知道变化是何时发生的。这样,你的PERSON_TYPE 表就包含了所有 PERSON 的可能类型,比如Associate、Engineer、Director、CIO 或者CEO 等。还有个替代办法就是改变 PERSON 记录来反映新头衔的变化,不过这样一来在时间上无法跟踪个人所处位置的具体时间。
7) 选择数字类型和文本类型尽量充足
在SQL 中使用smallint 和tinyint 类型要特别小心。比如,假如想看看月销售总额,总额字段类型是smallint,那么,如果总额超过了$32,767 就不能进行计算操作了。
而ID 类型的文本字段,比如客户ID 或定单号等等都应该设置得比一般想象更大。假设客户ID 为10 位数长。那你应该把数据库表字段的长度设为12 或者13 个字符长。但这额外占据的空间却无需将来重构整个数据库就可以实现数据库规模的增长了。
8) 增加删除标记字段
在表中包含一个“删除标记”字段,这样就可以把行标记为删除。在关系数据库里不要单独删除某一行;最好采用清除数据程序而且要仔细维护索引整体性。
3. 选择键和索引(数据库逻辑设计)
键选择原则:
1) 键设计4 原则
* 为关联字段创建外键。
* 所有的键都必须唯一。
* 避免使用复合键。
* 外键总是关联唯一的键字段。
2) 使用系统生成的主键
设计数据库的时候采用系统生成的键作为主键,那么实际控制了数据库的索引完整性。这样,数据库和非人工机制就有效地控制了对存储数据中每一行的访问。采用系统生成键作为主键还有一个优点:当拥有一致的键结构时,找到逻辑缺陷很容易。
3) 不要用用户的键(不让主键具有可更新性)
在确定采用什么字段作为表的键的时候,可一定要小心用户将要编辑的字段。通常的情况下不要选择用户可编辑的字段作为键。
4) 可选键有时可做主键
把可选键进一步用做主键,可以拥有建立强大索引的能力。
索引使用原则
索引是从数据库中获取数据的最高效方式之一。95%的数据库性能问题都可以采用索引技术得到解决。
1) 逻辑主键使用唯一的成组索引,对系统键(作为存储过程)采用唯一的非成组索引,对任何外键列采用非成组索引。考虑数据库的空间有多大,表如何进行访问,还有这些访问是否主要用作读写。
2) 大多数数据库都索引自动创建的主键字段,但是可别忘了索引外键,它们也是经常使用的键,比如运行查询显示主表和所有关联表的某条记录就用得上。
3) 不要索引memo/note 字段,不要索引大型字段(有很多字符),这样作会让索引占用太多的存储空间。
4) 不要索引常用的小型表
不要为小型数据表设置任何键,假如它们经常有插入和删除操作就更别这样作了。对这些插入和删除操作的索引维护可能比扫描表空间消耗更多的时间。
4. 数据完整性设计(数据库逻辑设计)
1) 完整性实现机制:
实体完整性:主键
参照完整性:
父表中删除数据:级联删除;受限删除;置空值
父表中插入数据:受限插入;递归插入
父表中更新数据:级联更新;受限更新;置空值
DBMS对参照完整性可以有两种方法实现:外键实现机制(约束规则)和触发器实现机制
用户定义完整性:
NOT NULL;CHECK;触发器
2) 用约束而非商务规则强制数据完整性
采用数据库系统实现数据的完整性。这不但包括通过标准化实现的完整性而且还包括数据的功能性。在写数据的时候还可以增加触发器来保证数据的正确性。不要依赖于商务层保证数据完整性;它不能保证表之间(外键)的完整性所以不能强加于其他完整性规则之上。
3) 强制指示完整性
在有害数据进入数据库之前将其剔除。激活数据库系统的指示完整性特性。这样可以保持数据的清洁而能迫使开发人员投入更多的时间处理错误条件。
4) 使用查找控制数据完整性
控制数据完整性的最佳方式就是限制用户的选择。只要有可能都应该提供给用户一个清晰的价值列表供其选择。这样将减少键入代码的错误和误解同时提供数据的一致性。某些公共数据特别适合查找:国家代码、状态代码等。
5) 采用视图
为了在数据库和应用程序代码之间提供另一层抽象,可以为应用程序建立专门的视图而不必非要应用程序直接访问数据表。这样做还等于在处理数据库变更时给你提供了更多的自由。
5. 其他设计技巧
1) 避免使用触发器
触发器的功能通常可以用其他方式实现。在调试程序时触发器可能成为干扰。假如你确实需要采用触发器,你最好集中对它文档化。
2) 使用常用英语(或者其他任何语言)而不要使用编码
在创建下拉菜单、列表、报表时最好按照英语名排序。假如需要编码,可以在编码旁附上用户知道的英语。
3) 保存常用信息
让一个表专门存放一般数据库信息非常有用。在这个表里存放数据库当前版本、最近检查/修复(对Access)、关联设计文档的名称、客户等信息。这样可以实现一种简单机制跟踪数据库,当客户抱怨他们的数据库没有达到希望的要求而与你联系时,这样做对非客户机/服务器环境特别有用。
4) 包含版本机制
在数据库中引入版本控制机制来确定使用中的数据库的版本。时间一长,用户的需求总是会改变的。最终可能会要求修改数据库结构。把版本信息直接存放到数据库中更为方便。
5) 编制文档
对所有的快捷方式、命名规范、限制和函数都要编制文档。
采用给表、列、触发器等加注释的数据库工具。对开发、支持和跟踪修改非常有用。
对数据库文档化,或者在数据库自身的内部或者单独建立文档。这样,当过了一年多时间后再回过头来做第2 个版本,犯错的机会将大大减少。
6) 测试、测试、反复测试
建立或者修订数据库之后,必须用用户新输入的数据测试数据字段。最重要的是,让用户进行测试并且同用户一道保证选择的数据类型满足商业要求。测试需要在把新数据库投入实际服务之前完成。
7) 检查设计
在开发期间检查数据库设计的常用技术是通过其所支持的应用程序原型检查数据库。换句话说,针对每一种最终表达数据的原型应用,保证你检查了数据模型并且查看如何取出数据。
三、数据库命名规范
1. 实体(表)的命名
1) 表 以名词或名词短语命名,确定表名是采用复数还是单数形式,此外给表的别名定义简单规则(比方说,如果表名是一个单词,别名就取单词的前4 个字母;如果表 名是两个单词,就各取两个单词的前两个字母组成4 个字母长的别名;如果表的名字由3 个单词组成,从头两个单词中各取一个然后从最后一个单词中再取出两 个字母,结果还是组成4 字母长的别名,其余依次类推)
对工作用表来说,表名可以加上前缀WORK_ 后面附上采用该表的应用程序的名字。在命名过程当中,根据语义拼凑缩写即可。注意,由于ORCLE会将字段名称统一成大写或者小写中的一种,所以要求加上下划线。
举例:
定义的缩写 Sales: Sal 销售;
Order: Ord 订单;
Detail: Dtl 明细;
则销售订单明细表命名为:Sal_Ord_Dtl;
2) 如果表或者是字段的名称仅有一个单词,那么建议不使用缩写,而是用完整的单词。
举例:
定义的缩写 Material Ma 物品;
物品表名为:Material, 而不是 Ma.
但是字段物品编码则是:Ma_ID;而不是Material_ID
3) 所有的存储值列表的表前面加上前缀Z
目的是将这些值列表类排序在数据库最后。
4) 所有的冗余类的命名(主要是累计表)前面加上前缀X
冗余类是为了提高数据库效率,非规范化数据库的时候加入的字段或者表
5) 关联类通过用下划线连接两个基本类之后,再加前缀R的方式命名,后面按照字母顺序罗列两个表名或者表名的缩写。
关联表用于保存多对多关系。
如果被关联的表名大于10个字母,必须将原来的表名的进行缩写。如果没有其他原因,建议都使用缩写。
举例:表Object与自身存在多对多的关系,则保存多对多关系的表命名为:R_Object;
表 Depart和Employee;存在多对多的关系;则关联表命名为R_Dept_Emp
2. 属性(列)的命名
1) 采用有意义的列名,表内的列要针对键采用一整套设计规则。每一个表都将有一个自动ID作为主健,逻辑上的主健作为第一组候选主健来定义,如果是数据库自动生成的编码,统一命名为:ID;如果是自定义的逻辑上的编码则用缩写加“ID”的方法命名。如果键是数字类型,你可以用_NO 作为后缀;如果是字符类型则 可以采用_CODE 后缀。对列名应该采用标准的前缀和后缀。
举例:销售订单的编号字段命名:Sal_Ord_ID;如果还存在一个数据库生成的自动编号,则命名为:ID。
2) 所有的属性加上有关类型的后缀,注意,如果还需要其它的后缀,都放在类型后缀之前。
注: 数据类型是文本的字段,类型后缀TX可以不写。有些类型比较明显的字段,可以不写类型后缀。
3) 采用前缀命名
给每个表的列名都采用统一的前缀,那么在编写SQL表达式的时候会得到大大的简化。这样做也确实有缺点,比如破坏了自动表连接工具的作用,后者把公共列名同某些数据库联系起来。
3. 视图的命名
1) 视图以V作为前缀,其他命名规则和表的命名类似;
2) 命名应尽量体现各视图的功能。
4. 触发器的命名
触发器以TR作为前缀,触发器名为相应的表名加上后缀,Insert触发器加 _I ,Delete触发器加 _D ,Update触发器加 _U ,如:TR_Customer_I,TR_Customer_D,TR_Customer_U。
5. 存储过程名
存储过程应以 UP_ 开头,和系统的存储过程区分,后续部分主要以动宾形式构成,并用下划线分割各个组成部分。如增加代理商的帐户的存储过程为 UP_Ins_Agent_Account 。
6. 变量名
变量名采用小写,若属于词组形式,用下划线分隔每个单词,如@my_err_no。
7. 命名中其他注意事项
1) 以上命名都不得超过30个字符的系统限制。变量名的长度限制为29(不包括标识字符@)。
2) 数据对象、变量的命名都采用英文字符,禁止使用中文命名。绝对不要在对象名的字符之间留空格。
3) 小心保留词,要保证你的字段名没有和保留词、数据库系统或者常用访问方法冲突
5) 保持字段名和类型的一致性,在命名字段并为其指定数据类型的时候一定要保证一致性。假如数据类型在一个表里是整数,那在另一个表里可就别变成字符型了。
9/11/2008
军事英语
"cover me" 掩护我
"you take the point" 你占据该要点
"hold this position" 待在(防守)这个位置
"regroup team" 重组队伍
"follow me" 跟着我
"taking fire, need assistance"吸引火力,需要援助
"go" 前进
"fall back" 后退
"stick together team" 保持队形(不要散了)密集阵形进攻
"get in position" 进入适当的位置
"storm the front" 守住前面
"report in" 请报告情况
"affirmative/roger that"收到
"enemy spotted" 发现敌人
"need backup" 需要支援
"sector clear" 扇区安全(当你确定一个区域安全之后,你可以向你的队友发送这句话。)
"i'm in position" 我到达指定的位置
"reporting in" 报告自己的位置
"negative" 拒绝(接受)
"enemy down" 消灭敌人
"wait for my go" 待在你的作战位置,等我的命令
"fire in the hole" 扔手榴弹(炸弹一类)
"Taking Fire, Need Assistance" 压制火力,需要火力协助
"Fall Back" 全队后撤
"Storm the Front" 守住前面
"Enemy Down" 敌人被消灭
"Hold your fire" 停火
"keep your fire" 保持火力(别停下来)
"move" 走!移动
"move on" 继续前进
"move back" 后撤
"move out" 搬走;开拔
英美军衔
Army 陆军
Field Marshal 元帅
General 上将
Lieutenant General 中将
Major General 少将
Brigadier 准将
Colonel 上校
Lieutenant Colonel 中校
Major 少校
Captain 上尉
Lieutenant 中尉
Second Lieutenant 少尉
Warrant Officer (Class I) 一级准尉
Warrant Officer (ClassII) 二级准尉
Staff Sergeant 上士
Sergeant 中士
Corporal 下士
Lance Corporal 一等兵
Private 二等兵
Recruit 新兵
Air Force 空军
Marshal of the Royal Air Force 元帅
Air Chief Marshal 上将
Air Marshal 中将
Air Vice Marshal 少将
Air Commodore 准将
Group Captain 上校
Wing Commander 中校
Squadron Leader 少校
Flight Lieutenant 上尉
Flying Officer 中尉
Pilot Officer 少尉
Warrant Officer (Class I) 一级准尉
Warrant Officer (Class II) 二级准尉
Flight Sergeant 上士
Sergeant 中士
Corporal 下士
Senior Aircraftman 一等兵
Leading Aircraftman 二等兵
Aircraftman 新兵
Navy 海军
Admiral of the Fleet 元帅
Admiral 上将
Vice Admiral 中将
Rear Admiral 少将
Commodore 准将
Captain 上校
Commander 中校
Lieutenant Commander 少校
Lieutenant 上尉
Sublieutenant 中尉
Acting Sublieutenant 少尉
Warrant Officer (Class I) 一级准尉
Warrant Officer (Class II) 二级准尉
Chief Petty Officer 上士
Petty Officer First Class 中士
Petty Officer Second Class 下士
Leading Seaman 一等兵
Able Seaman 二等兵
Ordinary Seaman 新兵
Marine Corps 海军陆战队
General 上将
Lieutenant General 中将
Major General 少将
Brigadier 准将
Colonel 上校
Lieutenant Colonel 中校
Major 少校
Captain 上尉
Lieutenant 中尉
Second Lieutenant 少尉
Warrant Officer (Class I) 一级准尉
Warrant Officer (Class II) 二级准尉
Colour Sergeant 上士
Sergeant 中士
Corporal 下士
Marine First Class 一等兵
Marine Second Class 二等兵
Recruit 新兵
Army 陆军
General of the Army 五星上将
General 上将
Lieutenant General 中将
Major General 少将
Brigadier General 准将
Colonel 上校
Lieutenant Colonel 中校
Major 少校
Captain 上尉
First Lieutenant 中尉
Second Lieutenant 少尉
Chief Warrant Officer 一级准尉
Warrant Officer 二级准尉
Master Sergeant 军士长
Sergeant First Class 上士
Sergeant 中士
Corporal 下士
Private First Class 一等兵
Private 二等兵
Basic Private 三等兵
Air Force 空军
General of the Air Force 五星上将
General 上将
Lieutenant General 中将
Major General 少将
Brigadier General 准将
Colonel 上校
Lieutenant Colonel 中校
Mayor 少校
Captain 上尉
First Lieutenant 中尉
Second Lieutenant 少尉
Chief Warrant Officer 一级准尉
Warrant Officer 二级准尉
Master Sergeant 军士长
Technical Sergeant 技术军士
Staff Sergeant 参谋军士
Airman First Class 一等兵
Airman Second Class 二等兵
Airman Third Class 三等兵
Navy 海军
Fleet Admiral 五星上将
Admiral 上将
Vice Admiral 中将
Rear Admiral 少将
Commodore 准将
Captain 上校
Commander 中校
Lieutenant Commander 少校
Lieutenant 上尉
Lieutenant Junior Class 中尉
Ensign 少尉
Commissioned Warrant Officer 一级准尉
Warrant Officer 二级准尉
Chief Petty Officer 军士长
Petty Officer First Class 上士
Petty Officer Second Class 中士
Petty Officer Third Class 下士
Seaman First Class 一等兵
Seaman Second Class 二等兵
Apprentice Seaman 三等兵
Marine Corps 海军陆战队
General 上将
Lieutenant General 中将
Major General 少将
Brigadier General 准将
Colonel 上校
Lieutenant Colonel 中校
Major 少校
Captain 上尉
First Lieutenant 中尉
Second Lieutenant 少尉
Commissioned Warrant Officer 一级准尉
Warrant Officer 二级准尉
Master Sergeant 军士长
Technical Sergeant 技术军士
Staff Sergeant 参谋军士
Sergeant 中士
Corporal 下士
Private First Class 一等兵
Private 二等兵
9/09/2008
9/08/2008
本来就没有开始,也不会有结束,只有存在
生命的本质在于存在,不会有开始和结束。就好像无序与有序。时间倒成一个欺骗小孩的糖果,欺骗着生命去追求永恒。可笑,本来就是不逝的存在,再来什么永恒。思维是凌驾于生命上的另一种存在,必然在这个限定的空间里,永远存在。
空间的本质是一种界限,界定着不同的存在。生命有自己的空间,思维也将有自己的空间,只是被界定了而已,或者是因为你在里面而已。也许时间是生命空间的的规则,但不能保证是所有空间的规则。
思维是一种最原始的回归。回归到无序,足够大,也足够小,自己也感觉好笑,本来就不能用大小来定义,那是空间的尺度。而不是存在的规则。就好比,原子去看分子,分子去看细胞,细胞去看器官,器官去看人体,人体去看地球,地球去看太阳系,太阳系去看银河系....., 等等,这个逻辑本是是错误的,他将是一个正无穷,或者是负无穷。呵呵,就好比孩子突然告诉你,蚂蚁不但有红的,还有黑的,你当然会笑,会笑他无知。呵呵,我们也不是一样吗!
9/01/2008
熵
什么是熵
“熵”是德国物理学家克劳修斯在1850年创造的一个术语,他用它来表示任何一种能量在空间中分布的均匀程度。能量分布得越均匀,熵就越大,那对于个体来讲价值越小。如果对于我们所考虑的系统来说,能量完全均匀地分布,那么,这个系统的熵就达到最大值。
熵定律是科学定律之最,这是爱因斯坦的观点。我们知道能源与物质、信息一样,是物质世界的三个基本要素之一, 而在物理定律中,能量守恒定律是最重要的定 律,它表明了各种形式的能量在相互转换时,总是不生不灭保持平衡的。在等势面上,熵增原理反映了非热能与热能之间的转换具有方向性,即非热能转变为热能效 率可以100%,而热能转变成非热能时效率则小于100%(转换效率与温差成正比),这种规律制约着自然界能源的演变方向,对人类生产、生活影响巨大;在 重力场中,热流方向由体系的势焓(势能+焓)差决定,即热量自动地从高势焓区传导至低势焓区,当出现高势焓区低温和低势焓区高温时,热量自动地从低温区传 导至高温区,且不需付出其它代价,即绝对熵减过程。显然熵所描述的能量转化规律比能量守恒定律更重要,通俗地讲:熵定律是"老板",决定着企业的发展方向,而能量守恒定律是"出纳",负责收支平衡,所以说熵定律是自然界的最高定律。
熵是混乱和无序的度量.熵值越大,混乱无序的程度越大.
熵增定律
在克劳修斯看来,在一个系统中,如果听任它自然发展,那么,能量差总是倾向于消除的。让一个热物体同一个冷物体相接触,热就会以下面所说的方式流动:热 物体将冷却,冷物体将变热,直到两个物体达到相同的温度为止。如果把两个水库连接起来,并且其中一个水库的水平面高于另一个水库,那么,万有引力就会使一 个水库的水面降低,而使另一个水面升高,直到两个水库的水面均等,而势能也取平为止。
因此,克劳修斯说,自然界中的一个普遍规律是:能量密度的差异倾向于变成均等。换句话说,“熵将随着时间而增大”。
对于能量从密度较高的地方向密度较低的地方流动的研究,过去主要是对于热这种能量形态进行的。因此,关于能量流动和功-能转换的科学就被称为“热力学”,这是从希腊文“热运动”一词变来的。
人们早已断定,能量既不能创造,也不能消灭。这是一条最基本的定律;所以人们把它称为“热力学第一定律”。
克劳修斯所提出的熵随时间而增大的说法,看来差不多也是非常基本的一条普遍规律,所以它被称为“热力学第二定律”。
举例来讲果我们能看到橡皮筋的分子结构,我们会发现它的结构在拉紧和放松的状态时是不一样的。放松的时候它的分子结构像一团乱麻交织在一起。而在把橡皮 筋拉长的时候,那些如同链状的分子就会沿着拉伸的方向比较整齐地排列起来。于是我们可以看到两种状态:一种是自然,或者自发的状态。在这种状态下结构呈“ 混乱”或 “无序”状。而另一种是在外界的拉力下规则地排列起来的状态。这种“无序” 的状态还可以从分子的扩散中观察到。用一个密封的箱子,中间放一个隔板。在隔板的左边空间注入烟。我们把隔板去掉,左边的烟就会自然 (自发)地向右边扩散,最后均匀地占满整个箱体。这种状态称为“无序”。
在物理学里我们可以用“熵”的概念来描述某一种状态自发变化 的方向。比如把有规则排列的状态称为“低熵”而混乱的状态对应于“高熵”。而熵则是无序性的定量量度。热力学第二定律的结论是:“一个孤立系统的熵永不减 少。”换句话说,物质世界的状态总是自发地转变成无序;“从低熵”变到“高熵”。比如,当外力去除之后,整齐排列的分子就会自然地向紊乱的状态转变;而箱 子左边的烟一定会自发地向右边扩散。这就是著名的“熵增定律”。
我们这个宇宙是熵增的宇宙.热力学第二定律,体现的就是这个特征. 生命是高度的有序,智慧是高度的有序. 在一个熵增的宇宙为什么会出现生命?会进化出智慧?(负熵) 热力学第二定律还揭示了, 局部的有序是可能的,但必须以其他地方更大无序为代价. 人生存,就要能量,要食物,要以动植物的死亡(熵增)为代价. 万物生长靠太阳.动植物的有序, 又是以太阳核反应的衰竭(熵增),或其他的熵增形势为代价的. 人关在完全封闭的铅盒子里,无法以其他地方的熵增维持自己的负熵. 在这个相对封闭的系统中,熵增的法则破坏了生命的有序.熵增是一个相对的被动的过程,熵减是一个绝对的主动的过程。
熵是时间的箭头,在这个宇宙中是不可逆的. 时间是一个相对的被动的结果!熵与时间密切相关,如果时间停止"流动",熵增也就无从谈起. "任何我们已知的物质能关住"的东西,不是别的,就是"时间". 低温关住的也是"时间". 生命是物质的有序"结构"."结构"与具体的物质不是同一个层次的概念. 就象大厦的建筑材料,和大厦的式样不是同一个层次的概念一样. 生物学已经证明,凡是到了能上网岁数的人, 身体中的原子,已经没有一个是刚出生时候的了. 但是,你还是你,我还是我,生命还在延续. 倒是死了的人,没有了新陈代谢,身体中的分子可以保留很长时间. 意识是比生命更高层次的有序.可以在生命之间传递. 说到这里,我想物质与意识的层次关系应该比较清楚了. 这里之所以将"唯物"二字加上引号. 是因为并不彻底.为什么熵减是这个宇宙的本质,还没法回答.
信息熵
信息熵的定义与熵的定义相似,我们说的信息熵一般是指信息论的香农理论。
在日常生活中,信息是指“消息”,“情况”等。看电视、看报纸、看书、打电话、听广播、上网浏览,乃至聊天、开会,人们都获得了“消息”。消息通过“消息传递系统”传递,各种系统可以抽象为通讯系统模型。这一模型并不只限于通信系统,对于生物神经系统,遗传系统,市场的经济信号感知反馈系统,管理系统,都可以运用这个模型。
在消息传递系统中,其传输的是消息;但消息传递过程中,最普通,却容易被忽视的一点是:收信人在收到消息以前是不知道消息的具体内容的。消息的传递过程,对收信人来说,是一个从不知到知的过程,或者说是一个从不确定到确定的过程。
从通信过程来看,收信者的所谓“不知”就是不知道发送端将发送描述何种运动状态的消息。例如,看天气预报前,不清楚天气的将出现何种状态; 看天气预报后,这种不确定性就大大缩小了。所以通信过程是一种从不确定到确定的过程。不确定性消除了,收信者就获得了信息。所以香农认为, 信息是不定性的减少或消除。即
I = S(Q/X)-S(Q/X')
I代表信息,Q 代表对某件事的疑问,S 代表不定性,X为收到消息前关于Q的知识,X' 为收到消息后关于Q 的知识。
如何理解信息熵和熵的关系?单从概率的表达式看,两者的定义是相似的
信息熵并不是负熵,它描述的是信源 不确定性而不是 不确定性的减少。信息熵大表示信源的不确定程度较大,同样是一种 无序性。香农的信息概念是人们对事物了解的不确定性的减少或消除,这一定义关注的是通信中的信息问题,所以香农信息是一种与信道相关的“信息”。信源、信 道是信宿成了认识过程的不可分割的部分,主客体是不可分的;香农的概率,是主体对客体(信宿对信源)的一种先验主观认识,这本身就加入了主体的因素。因 此,作为“通信中的数学理论”,信源与信宿在信道联系下的“互信息”,才是香农的“信息”。信道的任务是以信号方传输和存贮信息,通过信息处理后,一般只会增加信息的损失,不可能增加原来获得的信息。这意味着,在任何信息传输系统中,最后获得的信息至多是信源所提供的信息;信息一旦丢失,如不触及信源,就不能再恢复。这就是 信息不增原理,又称 数据处理定理,熵只是平均不确定性的描述,而不确定性的消除才是接受端获得的信息量,信息量不应该与不确定性混为一谈。
信息论并不是香农一个人建立的,实际上它是由好几位科学家差不多在同一时候提出来的。香农从通信编码方面,维纳从滤波理论方面,统计学家费希尔(Fisher )从古典统计理论方面,研究了信息的理论问题。但维纳与香农在信息概念的理解上有些不同
信息论并不是香农一个人建立的,实际上它是由好几位科学家差不多在同一时候提出来的。香农从通信编码方面,维纳从滤波理论方面,统计学家费希尔(Fisher )从古典统计理论方面,研究了信息的理论问题。但维纳与香农在信息概念的理解上有些不同
信息熵并不是负熵,它描述的是信源不确定性而不是不确定性的减少。信息熵大表示信源的不确定程度较大,同样是一种无序性。香农的信息概念是人们对事 物了解的不确定性的叫少或消除,实际上是“互信息”;因为这一定义关注的是通信中的信息问题,所以香农信息是一种与信道相关的“信息”。
变量的不确定性越大,熵也就越大,把它搞清楚所需要的信息量也就越大。
信息熵是信息论中用于度量信息量的一个概念。一个系统越是有序,信息熵就越低;
反之,一个系统越是混乱,信息熵就越高。所以,信息熵也可以说是系统有序化程度的一个度量。也就是熵值低的信息,价值更高!
信息理论的鼻祖之一Claude E. Shannon把信息(熵)定义为离散随机事件的出现概率。所谓信息熵,是一个数学上颇为抽象的概念,在这里不妨把信息熵理解成某种特定信息的出现概率。 而信息熵和热力学熵是紧密相关的。根据Charles H. Bennett对Maxwell's Demon的重新解释,对信息的销毁是一个不可逆过程,所以销毁信息是符合热力学第二定律的。而产生信息,则是为系统引入负(热力学)熵的过程。所以信息 熵的符号与热力学熵应该是相反的。一般而言,当一种信息出现概率更高的时候,表明它被传播得更广泛,或者说,被引用的程度更高。我们可以认为,从信息传播 的角度来看,信息熵可以表示信息的价值。这样子我们就有一个衡量信息价值高低的标准,可以做出关于知识流通问题的更多推论。
信息熵的计算是非常复杂的。而具有多重前置条件的信息,更是几乎不能计算的。所以在现实世界中信息的价值大多是不能被计算出来的。但因为信息熵和热力学熵 的紧密相关性,所以信息熵是可以在衰减的过程中被测定出来的。因此信息的价值是通过信息的传递体现出来的。在没有引入附加价值(负熵)的情况下,传播得越 广、流传时间越长的信息越有价值。
熵在传播中是指信息的不确定性,一则高信息度的信息熵是很低的,低信息度的熵则高。具体说来,凡是导致随机事件集合的肯定性,组织性,法则性或有序性等增加或减少的活动过程,都可以用信息熵的改变量这个统一的标尺来度量。
相对的衡量制度可以用熵,绝对的时候,他就没有价值了,然而,这个世界哪来的绝对?个体的意义在于抵抗无序,无序的意义在于消减个体,重新生成个体。哎,无名万物之始,有名万物之母啊!