星期一, 十月 01, 2007

翻译:PHP和Session终极指南 II

原 文:PHP and Sessions, the ultimate guide!
原文作者:Deian Motov
发布日期:Sunday, 30 September 2007
译 者:石头希迁

记得我

这里是另外一个例子,这个例子要求你登录,然后你的用户名和会话开始时间都作为session变量存储。这些信息被用来显示session开始的总时间。

<?php

// initialize a session
session_start();
?>
<html>
<head></head>
<body>

<?php
if (!isset($_SESSION['name']) && !isset($_POST['name'])) {
// if no data, print the form
?>
<form action="<?php echo $_SERVER['PHP_SELF']?>" method="post">
<input type="text" name="name">
<input type="submit" name="submit" value="Enter your name">
</form>
<?php
}
else if (!isset($_SESSION['name']) && isset($_POST['name'])) {
// if a session does not exist but the form has been submitted
// check to see if the form has all required values
// create a new session
if (!empty($_POST['name'])) {
$_SESSION['name'] = $_POST['name'];
$_SESSION['start'] = time();
echo "Welcome, " . $_POST['name'] . ". A new session has been activated for you. Click <a href=" . $_SERVER['PHP_SELF'] . ">here</a> to refresh the page.";
}
else {
echo "ERROR: Please enter your name!";
}
}
else if (isset($_SESSION['name'])) {
// if a previous session exists
// calculate elapsed time since session start and now
echo "Welcome back, " . $_SESSION['name'] . ". This session was activated " . round((time() - $_SESSION['start']) / 60) . " minute(s) ago. Click <a href=" . $_SERVER['PHP_SELF'] . ">here</a> to refresh the page.";
}
?>
</body>
</html>

在这个例子中,session变量的出现和不出现决定了在三个可能出现的显示结果中到底显示哪一个。会话的开始时间通过time()函数被记录在$_SESSION['start']中,time()函数返回从1970年1月1号0时开始到当前时间的所有秒数。在最后阶段,存储在$_SESSION['start'] 中值和最近的time()返回值比较,来获得近似的花掉的时间。

需要重点强调一下,session_start()必须在脚本产生输出之前调用(如果您没有使用PHP的输出缓冲特性,可以阅读http://www.php.net/manual/en/ref.outcontrol.php)。这是因为PHP session内部使用in-memory cookies来保存session数据,而且cookie创建的头部必须在所有输出之前传输给客户端的浏览器。如果你在反问使用了session的页面看到如下的错误提示:
Warning: Cannot send session cache limiter - headers already sent (output started at ...)
这通常是因为在什么地方,以某种方式,一些输出在session_start()之前就传输到浏览器了。即使是在PHP中围绕session_start()的标签之外一个回车、一个空格字符都会产生这样的错误,因此要小心。

如前面提到的,每一次会话都有一个唯一的session ID,PHP用它来跟踪不同的客户端。这个session ID 是一长串字符,这串字符串自动的被PHP在一个页面到另外一个页面之间传递,以维护连续的会话。想看看它的样子,可以使用session_id()函数,如下面的例子:

<?php

// initialize a session
session_start();

// print session ID
echo "I'm tracking you with session ID " . session_id();

?>

当用户关闭了客户端的浏览器将会销毁了session,$_SESSION 数组中所有的变量将被刷新。也可以显式的销毁一个session----比如,当用户登出----通过调用session_destroy()函数。如下面的例子:


<?php

// initialize a session
session_start();

// then destroy it
session_destroy();

?>

你是否怀疑是不是弄错了----对,当你要调用session_destroy()来销毁一个session,你必须首先调用session_start()重新创建它。

记住$_SESSIONsuperglobal,这样你可以在一个函数里面和函数外面使用它,并不需要先声明其是global变量。如下面的例子:

<?php

// initialize a session
session_start();

// this function checks the value of a session variable
// and returns true or false
function isAdmin() {
if ($_SESSION['name'] == 'admin') {
return true;
}
else {
return false;
}
}

// set a value for $_SESSION['name']
$_SESSION['name'] = "guessme";
// call a function which uses a session variable
// returns false here
echo isAdmin()."
";

// set a new value for $_SESSION['name']
$_SESSION['name'] = "admin";
// call a function which uses a session variable
// returns true here
echo isAdmin()."
";

?>

你可以通过这个链接
http://www.php.net/manual/en/ref.session.php
了解更多关于session和处理session的函数。

(To be continued...)

翻译:PHP和Session终极指南 I

原 文:PHP and Sessions, the ultimate guide!
原文作者:Deian Motov
发布日期:
Sunday, 30 September 2007
译 者:石头希迁

一点耐心
现在,你已经用PHP连接了MySQL和SQLite,你可能觉得,你已经知道了使用PHP编程需要知道的一切了。或者,你甚至在考虑,用不着再访问Zend.com,也可以放弃这里的系列文章,去看一些更加豪华和更酷的...

Uh-uh,大错特错。

你要明白,虽然内建的数据库支持使得PHP编程更加容易,但这决不是PHP如此流行的唯一原因。方便的XML API和异常处理机制(PHP 5)、模块插件、内建的session管理等等也只是众多使得PHP流行的部分功能而已。PHP的这些内容将会在这一系列里面深入的讨论,希望你能自己找到它们,并且能个逗留稍微长点儿的时间。好了,现在,闭上眼睛,深呼吸,然后,继续你的阅读和发现----这个教程的主题是Sessions和cookies。

演出开始了
也许你曾听说:“HTTP是一个无状态的协议,Internet是一个无状态的开发环境”。

不?Hmmm。或者,并不全对。

用简单的话说,这句话的意思是,HTTP,即超文本传输协议,这个作为Web基石的协议并不能保留每个连接到Web服务器的客户端的标识,这样,对待每一个对Web页面的请求都被视为唯一和独立的连接,无论怎样,都和这个连接之前的连接没有任何关系。这种无状态的环境在你漫无目的的上网冲浪工作得非常好,可是,对于依赖于之前访问和数据的网站,它又产生一些很让人头疼的问题。最典型的例子是在线购物车----在无状态的环境,当访问者从一个页面跳到另一个页面时,系统保留你的访问踪迹,和采购单是很困难的。

很明显, 需要一个方法来维护状态,允许跟踪和维护一些客户端的连接数据。这样,cookies就出现了,cookies允许网站保存一些用户相关的信息在用户的系统中,并可以在任何需要的时候访问。一个cookie是一个简单的文件,其中保存了一些变量-值对,以及其链接到的域。当一个用户访问一个特定的域时,cookie中的值就会被读出并导入到服务器的环境里,这样,开发者就可以读,修改和使用这些值来实现他们的目的。将用户一次访问的数据带入到下一次访问,cookie是一个很方便的方法。

令一个常用的实现是使用session来保存连接相关的数据,这种session数据在用户访问中被保留在服务器端,并在最后销毁。每个session被赋予一个ID(每个session拥有一个唯一的ID),
在PHP中,
这个ID是PHP自动产生的。此session ID保存在两个位置:在客户端,使用一个临时的cookie,而在服务器端,使用平面文件或者数据库。session ID为每一次每一次接受到的请求赋予了一个名字,开发者可以标识出哪一个客户端开始了哪一次请求,可以在session变量中跟踪和维护用户相关的数据(变量-值对在会话期间都是可访问的,可以保存数值的和文字的信息)。

Sessions和cookies以这种方式绕过了HTTP协议的无状态约定,而且,被广泛使用在大量的最新的网站上用以维护个人和商业事务的信息。典型的,人们通常使用session来保存单次访问过程中的一些信息,而使用cookie来保存多次访问的数据。

PHP从PHP3.0开始支持cookies,内建的session管理从PHP4.o开始。所以这些特性都是缺省开启的,因此不必专门去激活这些特性。下面,看看你的第一个session。

第一个Session
用于演示session如何工作的第一个例子是点击计数程序。这是一个简单的计数器,但用户第一次访问的时候,这个计数器初始化,在用户重新连接这个网页的时候会增加。计数变量存储在一个session里面,这意味着,如果你访问之后访问了其他的站点,然后又回来,这个计数器的值会恢复(只要你没有通过关闭浏览器销毁这个session)。

看看代码:

<?php

// initialize a session
session_start();

// increment a session counter
$_SESSION['counter']++;

// print value
echo "You have viewed this page " . $_SESSION['counter'] . " times";

?>
想看看它是如何工作,通过浏览器,请求上面那段脚本,你会注意到,伴随着每次请求,计数器增加了1。如果你打开两个浏览器,每一个都请求这个脚本,PHP会为每个浏览器维护独立的计数器,它们各自增长。Session ID是用来标识不同的客户端的请求的,并为每个独立的会话创建保存好的之前访问的环境。这也意味着,在同一个会话中,用户反问了其他的网站,然后再头来再访问上面的脚本,只要你没有关闭你的浏览器,便可以恢复之前的session并为你重新创建。

PHP中每一个session通过
session_start()开始。这个函数检查session是否已经存在,要么恢复它(如果它存在的话),要么创建一个新的(如果它不存在的话)。session变量可以通过对$_SESSION superglobal数组添加key-value对来注册。可以在会话期的任何时候通过标准的数值标识来访问。上面的例子中,counter被加入$_SESSION数组,第一次被创建的时候为0,同一个会话中,每次对这个脚本的再请求都会重新获得counter,并增加1。

如果上面的例子并没有如我说的工作,请检查php.ini中session.save_path变量是否指向你系统的临时目录。这个变量缺省被硬编码为/tmp如果你使用windows系统,你需要编辑它为C:\Windows\temp(你系统的临时目录)。

(To be continued...)

星期日, 四月 29, 2007

我常用的Eclipse插件

1. Mylyn
用Mylar 进行以任务为中心的编程,第1 部分
用 Mylar 进行以任务为中心的编程,第 2 部分
和Bugzilla、eclipse、Mylar一起的日子

Mylar现在已经改名为Mylyn

2. JInto

3. subclipse

4. Clay Database Model

5. Eclipse SQL Explorer

6. EPIC - Eclipse Perl Integration

7. QuickREx - Regular Expressions

8. EHEP (Eclipse Hex Editor Plug-in)

9. Zend PHP IDE
Server-debug
10. JSEclipse

11. Ant Explore

Subversion 在ubuntu下的安装

1. 安装 subversion

$sudo apt-get install subversion subversion-tools
2. 创建一个新的储存库

$sudo svnadmin create /home/svn/myproject
3. 根据自己需要修改/home/svn/myproject/svnserve.conf
anon-access = read
auth-access = write
password-db = passwd
4. 根据自己需要修改/home/svn/myproject/passwd

5. 运行svnserve
$sudo svnserve -d --foreground -r /home/svn
( -d -- daemon mode
--foreground -- run in foreground (useful for debugging)
-r -- root of directory to serve
要了解更多信息,请输入: $ svnserve --help)
6. 其他

参考资料
1. 中文手册
2. THE Book on Subversion
3. Subversion Cheatsheet
4. Subversion FAQ

星期六, 四月 28, 2007

Ubuntu安装备忘

这两天在机器上安装了Feisty Fawn,这里记录一些备忘。
Step 1. 下载相关光盘

http://releases.ubuntu.com/ 下载 alternate光盘。

Step 2. 安装可设置启动

安装的过程不是很复杂,不过在最后,不要把grub安装在MBR,而是安装在挂载根目录的一个分区(/dev/hda2 for me)。然后用一张live CD运行命令
sudo dd if=/dev/hda2 of=linux.lnx bs=512 count=1
然后在windows的boot.ini中这样写
[boot loader]
timeout=30
default=c:\linux.lnx
[operating systems]
c:\linux.lnx=UBUNTU
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect
原来的boot.ini是这样的
[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect
上面的改动是将Ubuntu设置为缺省的启动项。这样操作的目的,是因为系统原来安装的windows,想用windows的启动管理来启动。这样做,主要是因为担心grub坏了。而windows还是好的,不然修复windows或者重新安装windows及其下软件都是比较麻烦的事情。不过网上也有教人如何来修复的,也有教人如何在windows中使用Grub的。

Step 3. 字体安装

现设置相关的Ubuntu源。这个在教育网和公众网都有一些,不过速度差别很大,细细选择合适的源。在 “系统-系统管理-语言支持” 里面把 “Chinese” 勾选上,这时可能需要下载一些东西。字体的设置参考如下两篇文章。
Linux字体微调 windows效果版
这里有很多显示器的DPI的数据

Step 4.安装Automatix

Automatix可以安装很多源里面没有的软件,如Acrobat Read,Gnochm。也可以通过他来安装一些开发环境。

Step 5. Java环境

Java和Eclipse可以通过Automatix来安装,之后
sudo update-alternatives --config java
然后配置环境变量:
sudo vim /etc/environment
在其中添加如下两行(根据使用的JDK版本设定):
CLASSPATH=/usr/lib/jvm/java-6-sun/lib
JAVA_HOME=/usr/lib/jvm/java-6-sun
保存退出。

之后配置Eclipse
虽然这时新安装的 java 已经成为系统默认的 jvm,但是 Eclipse 并不会用 update-alternative 设置的 jvm 来启动自身,而使用的是以前的 GNU Java。GNU Java 是 1.4.2 的实现,而且在性能上远不如 SUN 的实现。为了让 Eclipse 利用 SUN Java 启动,我们还需要继续配置。首先将 SUN Java 完完全全的设置为系统的默认 JDK(更具使用的JDK版本设定):
sudo update-java-alternatives -s java-6-sun
然后编辑 JVM 配置文件:
sudo vim /etc/jvm
将文件中的
/usr/lib/jvm/java-6-sun
这一行移动到配置块的顶部。由于 Eclipse 会忽略 Ubuntu 的通用 Java 设置(貌似一个 bug),我们需要继续编辑 Eclipse 的 java_home 文件:
sudo vim /etc/eclipse/java_home
如同上面一样,将
/usr/lib/jvm/java-6-sun
这一行移动到文件的顶部。

Step 6. 安装打印机(HP1000)

参阅这篇文章:Ubuntu下HP LaserJet 1000打印机的安装步骤(or Here)

Step 7. 一些基本配置修改和加强
sudo gconf-editor
到/apps/nautilus/desktop/分支下,去掉volumes_visible前面的复选框,勾上trash_icon_visible,home_icon_visible,computer_icon_visible前面的复选框。

Adobe acrobat Reader 的中日韩字体包在这里下载

Step 8. 媒体

相关软件还是通过Automatix安装。其后设置
安装 audacious, Mplayer & FF Plugin, FlashPlayer.
1) 如果需要把 APE 转换为 FLAC:
sudo apt-get install mac flac cuetools shntool
cuebreakpoints xx.cue |shnsplit -o flac -n xx xx.ape
2) Totem 从 2.17.5 开始默认使用 Gstreamer 作为后端解码方案,如果要使用xine作为后端,则
sudo apt-get totem-xine libxine-extracodecs

Totem 播放 rmvb 没有声音,这里给出了解决方法:
编辑 ~/.xine/catalog.cache 文件:
sudo gedit ~/.xine/catalog.cache
找到[/usr/lib/xine/plugins/1.1.4/xineplug_decode_real_audio.so]
把 decoder_priority 后面的数字修改为 10

3) 在Mplayer 的中文字幕设置方法
a) 在 Preferences-Font 里面点击 ”Browse” 选择一个中文字体,Encodeing 选择 Unicode。
b) 在 Preferences-Subtitle&OSD 里面的 Encoding 选择:Simplified Chinese Charset(cp936)
c) 在 Preferences-Font “Text scale” 这里调整字幕大小(我调整为 3.8 )。

如果播放时提示错误,设置一下:

Preferences-Video 选择 “xv X11/Xv”
Preferences-Codecs&demuxer 选择 “FFmpeg/libavcodec audio decoders”


step 9. 安装NTFS读写支持
sudo apt-get install ntfs-config
点击“应用程序” - “系统工具” - “NTFS写入支持配置程序”,输入密码,选中对内部设备的读写支持,和外部设备的读写支持,系统会自动扫描你硬盘上的NTFS分区,并重新挂载,这样,你的NTFS分区就能在Feisty下读写了.

step 10. 系统服务管理软件
sudo apt-get install bum
step 11. 安装vim
sudo apt-get install vim-full

step 12. 安装字典
sudo apt-get install stardict stardict-common
sudo apt-get install stardict-cdict-gb stardict-cedict-gb stardict-hanzim stardict-langdao-ce-gb stardict-langdao-ec-gb stardict-oxford-gb stardict-xdict-ce-gb stardict-xdict-ec-gb
Step 13. Emacs
参阅我的这篇文章:
Emacs 23在linux下的安装
只是不需要类似这样的语句,现在enable-font-backend是缺省的参数
alias emacs="emacs --enable-font-backend"
Step 14. 安装Subversion

参看我的这篇文章
Subversion 在ubuntu下的安装
Step 15. 下载软件和P2P软件设置
然后在Firefox里面关联ed2k链接

在地址栏输入about:config
新建“布尔”
名称为:network.protocol-handler.external.ed2k
值为:true

新建“字符串”
名称为:network.protocol-handler.app.ed2k
值为:/usr/bin/ed2k
Step 16.安装编译工具

如果你有编译源码的需要建议安装上 gcc,g++,make 等。
sudo apt-get install build-essential
Step 17. XAMPP安装
因为喜欢用XAMPP来作为开发环境,按照如下文章的介绍来安装。
HOWTO: Setup easy web development environment (XAMPP)
Step 18. Scim-bridge
安装了qterm, Eclipse之后,scim输入会有些问题,安装scim-bridge。
Ubuntu Feisty 中 scim-bridge 的安装和配置
Step 19. Rioutil
下载Rioutil

1. sudo mkdir /dev/usb
sudo mknod rio0 c 180 64
2. 配置
./configure --with-usbdevfs
注意,这里使用的是usbdevfs方式安装模块,如果不希望使用usbdevfs,需要执行
./configure --without-usbdevfs

3. 编译

make
4. 安
sudo make install
5.至此安装完成,由于可执行文件加载到了Linux内核的搜索路径,所以可以在任何一个目录下执行rioutil。你可以执行一下
sudo rioutil -i
看看能否搜索到你的RIO800。

Step 20. 其他软件
sudo apt-get install stellarium
sudo apt-get install texmake
sudo apt-get install xpdf ...
参考文章

Ubuntu 7.04 新手指南
Feisty安装全实录

星期六, 十二月 16, 2006

将windows文件专为unix格式

通常Unix中文本文件以linefeed (LF) 表示一行结束。而DOS(Windows)文件以一个carriage-return (CR) 和一个 linefeed (LF) 结束一行。因此在linux中要可用用flip将文件在不同文件格式之间转换。另一个命令dos2unix也可以。
$ find /the_paht -type f |xargs flip -u
flip可以的参数m可以将文件从DOS格式转换为UNIX格式。-t参数可以改变一个文件的时间戳。

星期二, 十二月 12, 2006

Emacs23在ubuntu下的安装

Emace23是Emacs的Unicode分支,无法Ubuntu下直接安装。需要从CVS下载。
$ sudo apt-get install ssh texinfo
$ sudo apt-get install libncurses5-dev
$ export CVS_RSH="ssh"
$ cvs -z3 -d:pserver:anonymous@cvs.savannah.gnu.org:/sources/emacs co -r emacs-unicode-2 emacs
然后configure,使其可以使用xft字体。
$./configure --prefix=/usr --enable-font-backend --with-gtk --with-xft --with-xpm --with-jpeg --with-tiff --with-png --x-includes=/usr/include/X11 --x-libraries=/usr/lib/X11
如果提示缺少gtk的开发文件,可以安装libgtk2.0-dev,再继续执行上面的命令。
make bootstrap
make info
sudo make install

可以这样来运行Emacs
$ emacs --enable-font-backend --font "Bitstream Vera Sans Mono-10"
或者在用户主目录下的.Xresources文件下加上:
Emacs.FontBackend: xft
Emacs.font: Bitstream Vera Sans Mono-8
在.bashrc里加入
alias emacs="emacs --enable-font-backend"
要用--enable-font-backend调用的原因是Emacs总是在检测Xresources之前调用字体相关的函数。运行:
$ xrdb -merge .Xresources
$ bash

需要说明的是,保留--enable-font-backend参数的原因是开发者对一些遗留的字体处理代码的移除还没有完成。很多用户也有意见,为什么不将--enable-font-backend作为缺省的参数。Kenichi Handa说,等他移除了那部分代码,这个参数就会消失的。这些,会写在Readme.Unicode里面。(See Here)

完成了以上的工作,Emacs可以很好的显示英文了。不过中文时候还有问题。Emacs好像随便显示了一个中文字体。这样在
.Xresources文件中改变一下字体。
Emacs.font: Monospace-10
在.emacs中加入
(set-fontset-font (frame-parameter nil 'font)
'han '("WenQuanYi Bitmap Song" . "unicode-bmp")
这里WenQuanYi Bitmap Song可以改为simsun或者Microsoft YaHei(如果你安装了这些字体的话)。要注意的是,写在xft相关的fontconfig文件中对于一些大小的字体的关闭反锯齿的功能似乎无效(See Here)。这个也许是现在这个Emacs23版本的bug。很多事情值得期待,慢慢等吧。