登录 |

iPad网页开发教程及规则

2010年11月22日 上午 36:38 | 作者:

[toc]

iPad开发的局限性

  1. 在iPad上使用Safari浏览普通网站网页的时候,网页因为太大而导致需要手动放大缩小或者滑动,虽然这种滑动行为在iPad上市之初的各种宣传中被津津乐道,但时间久了我们还是会发现这样做并不方便,给用户带来的感受并不十分好。
  2. 不支持Flash在没有越狱的iPad Safari中,网站的Flash都是无法显示的,但可以通过第三方软件或插件或者浏览器来解决,不过,即使不能显示Flash,你一样能够用HTML5和CSS3实现同样的效果。
  3. 没有鼠标光标这意味着鼠标属性,例如鼠标悬停属性是不可能有的。

    你或许可以为这个找到一些变通的办法,但是到你的用户那里这些该如何工作将会是困难的事。

  4. 滚动条不能按照预期那样起作用滚动条不能显示包含了充满过多分区的内容。框架也存在高度和宽度的问题。另外,滚动过程中需要两个手指的手势。(我们将在下文中进行充分的讨论)
  5. 不支持CSS固定布局HTML 元素 position:fixed CSS属性不能正确显示,常常会使得页面停留在第一屏,无法向下翻页、放大缩小。

iPad用户侦测:User Agent(用户代理)

随着移动设备上网的普及,很多网站都会进行客户端浏览器类型侦测,主要是靠User Agent来进行识别,如果侦测到是手机浏览则可能重定向,让用户浏览移动设备专用版本。以往我们所指的移动设备,主要是手机等终端,现在,iPad也加入到移动终端设备的行列中来,但它拥有9.7″大屏幕,iPad的Safari浏览器带来接近PC电脑的浏览感受。所以对应iPad的网站页面必须不同于其他移动设备,区别iPad访问主要也要依靠其浏览器的User Agent来进行。

iPhone OS 3.2 SDK beta 3中描述的iPad Safari浏览器User Agent代码:

Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.10

iPad Safari的User Agent代码包含单词:”Mobile”、”iPad”,不包含单词:”iPhone”。这点必须要留意,如果网站以前的版本对移动设备的访问并未区分,那么现在需要修改下,以防止对相应设备返回错误的版本。

模拟iPad浏览器访问的方式

如果你无法通过iPad或iPhone模拟器测试网页情况,你还是能够通过一下方式进行测试:

  1. 通过Mac OS X 或 Windows版本的Safari浏览器充当模拟器Safari菜单->偏好设置->高级->选中 在菜单栏显示”开发菜单”,这是在菜单栏就会出现”开发”这个菜单项

    菜单”开发”->用户代理->其他,在弹出的对话框中粘贴上述User Agent代码,点击确定以后,就可以用Safari验证页面是否适合iPad显示了。

  2. 用谷歌浏览器充当模拟器命令行下输入:
    chrome.exe --user-agent="Mozilla/5.0 (iPad; U; CPU OS 3_2_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B500 Safari/531.21.10"
  3. Javascript侦测iPad的User Agent,然后转向到对应版本的URL。
    if((navigator.userAgent.match(/iPhone/i)) || (navigator.userAgent.match(/iPad/i))) {
       if (document.cookie.indexOf("iphone_redirect=false") == -1) {
          window.location = "http://ipad.www.opensoce.com";
       }
    }
  4. PHP脚本侦测User Agent
    if(strstr($_SERVER['HTTP_USER_AGENT'],'iPhone') || strstr($_SERVER['HTTP_USER_AGENT'],'iPad')) {
    header('Location: http://ipad.www.opensoce.com');
    exit();
    }
  5. Apache侦测转向
    RewriteCond %{HTTP_USER_AGENT} ^iPad
      RewriteRule ^index\..*$ ipad.html [L]
      RewriteCond %{HTTP_USER_AGENT} ^iPhone
      RewriteRule ^index\..*$ iphone.html [L]
  6. Nginx侦测转向
    if ($http_user_agent ~*iPad ) {
       proxy_pass  http://ipad.www.opensoce.com;
    }
    if ($http_user_agent ~*iPhone ) {
       proxy_pass  http://iphone.www.opensoce.com;
    }

使用W3C标准网站技术

iPad和iPhone的Safari浏览器不支持插件以及Flash。

使用插件技术(控件)的菜单、导航等在iPad或iPhone的浏览器下将不会显示。

使用插件植入的音频、视频也不会播放, 可以 HTML5的&lt;audio>和<video>标签发布音频视频内容。详细可参考Safari DOM中的HTMLMediaElement、HTMLVideoElement、HTMLAudioElement开发信息.

以往,你可能需要插件去表现动画内容,而在iPad和iPhone浏览器下可以直接采用Javascript+CSS3的特性去制作动画。CSS3开始朝着模块化的方向发展,比如盒子模型、列表模块、背景和边框等等。利用CSS3,你可以直接做出圆角表格,之前可是只能用图片或者VML技术才能实现。

关于HTML5和CSS3,目前在国内比较早和成功的应用是网易三大邮箱((mail.163.com; mail.126.com ;www.yeah.net),你在iPad上输入上述地址的时候,会被转向到iPad适应版本,用户感受很好。HTML5在规范性和速度上拥有诸多优势,据网易提供的数据显示,这个版本的使用中收信写信的速度提升50%。此外,还有一个优势在于,代码量减少大大提高邮箱服务器的处理运行效率,为日后的功能扩展提供一个更强有力的平台。

HTML5/CSS3的未来和目标是为了改善每个人的网络体验。HTML5/CSS3的一点简介:

    * 使用CSS3渐变,字体阴影,圆盒以边界–这些对菜单栏和简单的网站设计师特别实用的。
    * 如果你想显示视频,使用HTML5 视频播放器代替Flash(显然它就不能工作)。
    * 使用HTML5创建离线程序并且脱机存储数据。
    * 各种实用的教程到处都有,当在开发我的iPad网络程序时我就已经利用了它们。Google他们,得到创意。

利用普通电脑的Safari测试无插件支持情况
,在偏好设置->安全->,取消启用插件的选择框,

设置viewpoint

viewpoint,可以理解为:视窗、可视区域,相对于iPad硬件限定的窗口来定义的。iPad窗口大小不可改变,但viewpoint视窗大小可以设置调整。

如果在iPhone开发中指定了视窗标签设置, 在iPad开发中必须进行必要的校正。例如:

在iPhone中,我们会用下述代码的方式指定屏幕宽度

<meta name="viewport" content="width=320" /><!--不适应iPad-->

而在iPad中,则必须用device-width替代具体的宽度像素数。

<meta name="viewport" content="width=device-width" /><!--适应iPad-->

我们在设置宽度的同时可以设置可缩放的比例范围

<meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0;">

触摸式交互

外接硬件键盘仅是作为iPad的选件,触屏式键盘才是iPad主要的交互工具。用户点击文本框的时候,软键盘会自动弹出,例如用户点击<input type=”text”>或<textarea>等的时候。

iPhone、iPad用户主要是通过手指与网页进行交互。这种交互方式的缺陷是无法处理类似鼠标停留的事件,所以,在网页中的鼠标事件:mousemove、mouseover、mouseout或CSS代码的:hover达不到PC机浏览器中的表现效果.

单手指触摸事件(Touch Events):在iPhone、iPad浏览器中可处理的单手指DOM触摸事件:touchstart、touchmove、touchend、touchcancel(when the system cancels the touch) 。在输入框按住一会会弹出剪切/复制/粘贴窗口, 可在网页通过 -webkit-user-select: none代码禁用该功能.

双手指协同事件(Gestures), 即是指两只手指接触屏幕的时候缩放或者旋转的效果,对于侦听gestures,iPhone/iPad也有三个事件:gesturestart,gestureend,gesturechange。
同时事件参数event有两个属性:scale,rotate。Scale的中间值是1,大于1表示放大,小于1表示缩小。

模拟:hover伪类

因为iPhone并没有鼠标指针,所以没有hover事件。那么CSS :hover伪类就没用了。但是iPhone有Touch事件,onTouchStart 类似 onMouseOver,onTouchEnd 类似 onMouseOut。所以我们可以用它来模拟hover。使用Javascript:

var myLinks = document.getElementsByTagName('a');
for(var i = 0; i < myLinks.length; i++){
   myLinks[i].addEventListener(’touchstart’, function(){this.className = “hover”;}, false);
   myLinks[i].addEventListener(’touchend’, function(){this.className = “”;}, false);
}

然后用CSS增加hover效果:

a:hover, a.hover { /* 你的hover效果 */ }

这样设计一个链接,感觉可以更像按钮。并且,这个模拟可以用在任何元素上。

用 textareas 取代 contenteditable

iPhone和iPad浏览器不支持contenteditable元素。

阻止旋转屏幕时自动调整字体大小

-webkit-text-size-adjust是webkit的私有css:

html, body, form, fieldset, p, div, h1, h2, h3, h4, h5, h6 {-webkit-text-size-adjust:none;}

侦测设备旋转方向

iPhone可以在横屏状态下浏览网页,有时候你会想知道用户设备的手持状态来增强可用性和功能。下面一段Javascript可以判断出设备向哪个方向旋转,并且替换css:

window.onload = function initialLoad() {updateOrientation();}
function updateOrientation(){
	var contentType = "show_";
	switch(window.orientation){
		case 0:
			contentType += "normal";
			break;
		case -90:
			contentType += "right";
			break;
		case 90:
			contentType += "left";
			break;
		case 180:
			contentType += "flipped";
			break;
	}
	document.getElementById("page_wrapper").setAttribute("class", contentType);
}

iPhone/iPad才识别的CSS

如果不想设备侦测,可以用CSS媒体查询来专为iPhone/iPod定义样式。

@media screen and (max-device-width: 480px) {}

CSS3媒体查询

gpg: keyserver receive failed: keyserver error

2010年09月30日 上午 29:33 | 作者:

replace keyserver.ubuntu.com with any of the following servers:

pool.sks-keyservers.net
subkeys.pgp.net
pgp.mit.edu
keys.nayr.net
keys.gnupg.net
wwwkeys.XX.pgp.net - replace XX with your country code (fr, en, de... etc) 

安装percona-server(mysql)

2010年09月30日 上午 25:02 | 作者:

/etc/apt/sources.list

[shell]
deb http://repo.percona.com/apt karmic main
deb-src http://repo.percona.com/apt karmic main
[/shell]

导入证书

[shell]
sudo su
gpg –keyserver subkeys.pgp.net –recv-keys 1C4CBDCDCD2EFD2A
gpg -a –export CD2EFD2A | apt-key add –
[/shell]

卸载mysql5

[shell]
sudo apt-get remove mysql-server-core-5.1 mysql-client-5.1
[/shell]

安装

[shell]
sudo apt-get install percona-server-server percona-server-client
[/shell]


			

调整更改ubuntu时区/时间,locale

2010年09月14日 上午 31:31 | 作者:

http://www.blogjava.net/mstar/archive/2008/07/01/ubuntu_set_time_timezone.html

更改时区、时间

执行
tzselect
按照提示进行选择时区
sudo cp /usr/share/zoneinfo/Asia/ShangHai /etc/localtime
执行
sudo ntpdate cn.pool.ntp.org
cn.pool.ntp.org是位于中国的公共NTP服务器,用来同步你的时间

时间
sudo date -s 20080701

更改locale

修改/var/lib/locales/supported.d/local

比如:
en_US.UTF-8 UTF-8
zh_CN.UTF-8 UTF-8
zh_CN.GBK GBK
zh_CN GB2312

然后运行locale-gen就可以了。

或sudo dpkg-reconfigure locales

怎样设定locale呢?

设定locale就是设定12大类的locale分类属性,即 12个LC_*。除了这12个变量可以设定以外,为了简便起见,还有两个变量:LC_ALL和LANG。它们之间有一个优先级的关系:
LC_ALL>LC_*>LANG
可以这么说,LC_ALL是最上级设定或者强制设定,而LANG是默认设定值。
1、如果你设定了LC_ALL=zh_CN.UTF-8,那么不管LC_*和LANG设定成什么值,它们都会被强制服从LC_ALL的设定,成为 zh_CN.UTF-8。
2、假如你设定了LANG=zh_CN.UTF-8,而其他的LC_*=en_US.UTF-8,并且没有设定LC_ALL的话,那么系统的locale设定以LC_*=en_US.UTF-8。
3、假如你设定了LANG=zh_CN.UTF-8,而其他的LC_*,和LC_ALL均未设定的话,系统会将LC_*设定成默认值,也就是LANG的值 zh_CN.UTF-8 。
4、假如你设定了LANG=zh_CN.UTF-8,而其他的LC_CTYPE=en_US.UTF-8,其他的LC_*,和LC_ALL均未设定的话,那么系统的locale设定将是:LC_CTYPE=en_US.UTF-8,其余的 LC_COLLATE,LC_MESSAGES等等均会采用默认值,也就是LANG的值,也就是LC_COLLATE=LC_MESSAGES=……= LC_PAPER=LANG=zh_CN.UTF-8。

所以,locale是这样设定的:
1、如果你需要一个纯中文的系统的话,设定LC_ALL= zh_CN.XXXX,或者LANG= zh_CN.XXXX都可以,当然你可以两个都设定,但正如上面所讲,LC_ALL的值将覆盖所有其他的locale设定,不要作无用功。
2、如果你只想要一个可以输入中文的环境,而保持菜单、标题,系统信息等等为英文界面,那么只需要设定 LC_CTYPE=zh_CN.XXXX,LANG=en_US.XXXX就可以了。这样LC_CTYPE=zh_CN.XXXX,而 LC_COLLATE=LC_MESSAGES=……= LC_PAPER=LANG=en_US.XXXX。

服务器安装流程

2010年09月2日 下午 04:08 | 作者:

服务器列表

[shell]ip hostname server core memory
114.112.179.9 ajax.ch 后台服务器 4核 8G
114.112.179.10 web.ch 前端服务器 2核 8G
114.112.179.11 db.ch 数据库服务器 2核 8G
[/shell]

修改默认主机名ubuntu

/etc/hostname

修改hosts

/etc/hosts

[shell]127.0.0.1       localhost ajax.ch
114.112.179.9   ajax.ch
114.112.179.10  web.ch
114.112.179.11  db.ch
[/shell]

编辑软件源

/etc/apt/sources.list

[shell]
deb http://mirrors.163.com/ubuntu/ karmic main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ karmic-security main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ karmic-updates main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ karmic-proposed main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ karmic-backports main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ karmic main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ karmic-security main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ karmic-updates main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ karmic-proposed main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ karmic-backports main restricted universe multiverse
deb http://php53.dotdeb.org stable all
deb-src http://php53.dotdeb.org stable all[/shell]

导入dotdeb的验证密钥

[shell]gpg –keyserver keys.gnupg.net –recv-key 89DF5277
gpg -a –export 89DF5277 | sudo apt-key add -[/shell]

更新软件源

[shell]apt-get update[/shell]

下载安装php53.dotdeb缺失的两个库文件

根据操作系统选择下载安装对于的版本(32位=i386,64位=amd64):

[shell]
wget http://us.archive.ubuntu.com/ubuntu/pool/main/k/krb5/libkrb53_1.6.dfsg.4~beta1-5ubuntu2_[i386|amd64].deb

wget http://us.archive.ubuntu.com/ubuntu/pool/main/k/krb5/libkrb53_1.6.dfsg.3~beta1-2ubuntu1.8_[i386|amd64].deb
wget http://us.archive.ubuntu.com/ubuntu/pool/main/i/icu/libicu38_3.8-6ubuntu0.2_[i386|amd64].deb
dpkg -i *.deb
[/shell]

安装SVN,导出源代码

[shell]

cd /home/onoboss

svn co http://www.onoboss.com/svn/chs/trunk/

[/shell]

设置可写目录权限

[shell]
chmod -R 0777 ~/src/templates_c/ # 模板缓存
chmod -R 0777 ~/src/union_img/ # 联盟图片
chmod -R 0777 ~/src/images/te/ # 个人头像
chmod -R 0777 ~/src/viscera/folder_chat/ # 聊天文件
chmod -R 0777 ~/src/warlog/ # 战场日志
[/shell]

安装nginx

[shell]
apt-get install nginx
ln -sf ~/etc/nginx/sites-available/defalut /etc/nginx/sites-available/default
ln -sf ~/etc/nginx/fastcgi_params /etc/nginx/fastcgi_params
[/shell]

安装php+常用扩展

[shell]
apt-get install php5-cli php5-cgi php5-fpm php5-mysql php5-gd php5-curl php5-memcache php5-apc php5-xdebug
ln -sf ~/etc/php5/fpm/php.ini /etc/php5/fpm/php.ini
ln -sf ~/etc/php5/fpm/php5-fpm.conf /etc/php5/fpm/php5-fpm.conf
[/shell]

创建onoboss帐户

[shell]
# 创建帐号
useradd -G admin -s /bin/bash -m  onoboss
# 设置密码
passwd onoboss
[/shell]

安装MySQL

[shell]
apt-get install mysql-server
ln -sf ~/etc/mysql/my.cnf  /etc/mysql/my.cnf

/etc/init.d/mysql stop # 关闭mysql
rm /var/lib/mysql/ib_logfile* # 删除innodb默认日志文件,重启后新建,否则会导致innodb引擎无法启动
/etc/init.d/mysql start # 启动mysql
[/shell]

安装nfs

为什么选择安装到ajax.ch(9)而不是web.ch?
读取是远远多于写入的,因此要把文件放到读压力的服务器:
web.ch通过nfs服务写入文件到ajax.ch;ajax.ch提供持久连接服务,需要频繁检测文件是否存在等io读操作。

安装流程:http://wiki.onoboss.com/?p=170
共享目录:

vim /etc/exports
[shell]
/home/onoboss/src/union_img web.ch(rw,sync,no_root_squash,no_subtree_check)
/home/onoboss/src/images/te web.ch(rw,sync,no_root_squash,no_subtree_check)
/home/onoboss/src/viscera/folder_chat/ web.ch(rw,sync,no_root_squash,no_subtree_check)
/home/onoboss/src/warlog web.ch(rw,sync,no_root_squash,no_subtree_check)
[/shell]

vim /etc/fstab
[shell]
db.ch:/home/onoboss/src/union_img /home/onoboss/src/union_img nfs nosuid,noexec,nodev,rw,bg,soft,rsize=32768,wsize=32768 0 0
db.ch:/home/onoboss/src/images/te /home/onoboss/src/images/te nfs nosuid,noexec,nodev,rw,bg,soft,rsize=32768,wsize=32768 0 0
db.ch:/home/onoboss/src/viscera/folder_chat /home/onoboss/src/viscera/folder_chat nfs nosuid,noexec,nodev,rw,bg,soft,rsize=32768,wsize=32768 0 0
db.ch:/home/onoboss/src/warlog /home/onoboss/src/warlog nfs nosuid,noexec,nodev,rw,bg,soft,rsize=32768,wsize=32768 0 0
[/shell]

使用Xdebug跟踪代码执行|xdebug_get_function_stack|debug_backtrace

2010年09月1日 下午 47:17 | 作者:

Xdebug的很多功能是以附加的调试语句的形式出现的,可以使用这些语句获得关于应用程序的附加信息。例如,可以查找到当前场景调用的类、方法或者函数,以及调用起始的文件和代码行。例如,代码清单8-8演示了一个简单的调用跟踪信息。

代码清单8-8 使用Xdebug跟踪调用栈

<?php
class MyClass {
public function myCaller($other) {
$other->myCallee();
}
}

class MyOther {
public function myCallee() {
printf("%s", xdebug_call_class());
printf("::%s",    xdebug_call_function());
printf(" in %s", xdebug_call_file());
printf(":%s\n",      xdebug_call_line());
}
}

$a = new MyClass();
$b = new MyOther();

$a->myCaller($b);

这个例子会输出以下信息。

MyClass::myCaller in /path/to/xdebug.php:4

你还可以调用xdebug_get_function_stack()方法,它会返回到这一点为止的关于函数调用信息的一个数组。这个函数与标准的debug_backtrace() PHP函数很相似。

如果需要确定某个脚本两点之间调用过的所有函数和方法,例如当执行过程进入另外一个组件时,就可以使用Xdebug函数跟踪功能。这些跟踪记录了对某个文件的所有调用情况,可用于事后分析。使用以下函数启动和停止函数跟踪功能。

* void xdebug_start_trace(string filename [, int options])。这个函数用来启动跟踪函数调用。options值是一个位掩码值,它允许使用XDEBUG_TRACE_APPEND常量添加跟踪记录文件,使用XDEBUG_TRACE_COMPUTERIZED常量创建计算出的结果的输出格式,甚至可以使用XDEBUG_TRACE_HTML常 量创建一个HTML格式的表格跟踪记录。

* void xdebug_stop_trace()。当希望停止跟踪功能时,可以调用这个函数。如果不调用stop函数,跟踪功能将在执行过程结束时自动停止。

代码清单8-9显示了如何跟踪方法调用。这个例子修改了之前的代码,将最终的调用代码封装到跟踪语句中。

代码清单8-9 使用xdebug_start_trace跟踪代码执行

xdebug_start_trace('trace');
$a->myCaller($b);
xdebug_stop_trace();

TRACE START [16:53:57]
0.0010      57964    -> MyClass->myCaller() /code/xdebug.php:21
0.0011      58104     -> MyOther->myCallee() /code/xdebug.php:4
0.0011      58104      -> xdebug_call_class() /code/xdebug.php:10
0.0011      58128      -> printf() /code/xdebug.php:10
0.0014      58196      -> xdebug_call_function() /code/xdebug.php:11
0.0015      58196      -> printf() /code/xdebug.php:11
0.0016      58196      -> xdebug_call_file() /code/xdebug.php:12
0.0016      58244      -> printf() /code/xdebug.php:12
0.0017      58244      -> xdebug_call_line() /code/xdebug.php:13
0.0017      58244      -> printf() /code/xdebug.php:13
0.0018      58244   -> xdebug_stop_trace() /code/xdebug.php:22
0.0019      58244
TRACE END [16:53:57]

Xdebug还允许获得脚本的当前内存使用情况、高峰内存使用情况,以及脚本开始运行之后所花费的时间。

phpdoc安装

2010年08月20日 上午 04:54 | 作者:

安装

[shell]pear install phpDocumentor[/shell]

修改模板字符集为utf-8

[shell]sudo sed -i s/iso-8859-1/utf-8/g `grep -rl iso /usr/share/php/data/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/*`[/shell]

生成HTML文档

[shell]
#查看帮助
phpdoc -h
#生成文档
#phpdoc -d [源代码目录] -t [生成html目录]
phpdoc -d www/chs/branches/war/src/src/class/ -t /var/share/phpdoc/chs[/shell]

Namespaced Events

2010年08月17日 上午 32:38 | 作者:

jQuery provides a system for namespacing bound events for easier triggering and removal. Namespaced events were added in jQuery 1.2.

The Problem

Generally, when binding an event callback, you would do something like:

[js]$(‘.class’).bind(‘click’, function(){});[/js]

However, there is a problem: Sometimes you want to unbind just a specific handler, or group of handlers (like all handlers bound by a plugin).

Unfortunately calling unbind will remove all bound handlers.
[js]
$(‘.class’).unbind(‘click’);[/js]
You could create a reference for the function and use that for both bind and unbind.
[js]
function handler() { … }
$(‘.class’).bind(‘click’, handler);
$(‘.class’).unbind(‘click’, handler);[/js]
But that requires that you maintain a reference to the function for as long as it exists – which isn’t always feasible.

The Solution: Namespaced Events

jQuery provides a concept called namespaced events: Simply add a classname to your event when you declare it. You can then reference that namespaced event both with unbind and trigger.
[js]
$(‘.class’).bind(‘click.namespace’, function(){});
$(‘.class’).trigger(‘click.namespace’);
$(‘.class’).unbind(‘click.namespace’);[/js]
Namespaced events will be unbound or triggered when their namespace is mentioned explicitly, or no namespace is mentioned at all. For example:
[js]
$(‘.class’).bind(‘click.namespace’, function(){});
$(‘.class’).trigger(‘click.namespace’); // Will trigger
$(‘.class’).trigger(‘click’); // Will trigger
$(‘.class’).trigger(‘click.other’); // Won’t trigger[/js]
If you’ve used the same namespace on multiple events, you can easily remove the bindings from all events at once.
[js]
$(‘.class’).bind(‘click.namespace’, function(){});
$(‘.class’).bind(‘blur.namespace’, function(){});
$(‘.class’).unbind(‘.namespace’);[/js]
Namespaces may also come in handy when reinitializing events after an Ajax request:
[js]
$(‘.class’)
.unbind(‘click.namespace’)
.bind(‘click.namespace’, function(){});[/js]
As of jQuery 1.3 you can use multiple namespaces on your events, like so:
[js]
$(‘.class’).bind(‘click.a.b’, function(){});
$(‘.class’).trigger(‘click.a’);
$(‘.class’).unbind(‘click.b’);[/js]

[楚汉]迁移MySQL服务器

2010年08月4日 上午 31:35 | 作者:

文件

/trunk/src/source/base/release.config.class.php  数据库连接配置
/trunk/src/viscera/js/map_chat.js 聊天服务器ip
/trunk/src/viscera/map_state.php 地图引用  ×map_chat.js?[版本号]
/trunk/src/templates/game.html  主界面引用 ×map_chat.js?[版本号]

MySQL同步数据

  1. 将242的数据库导出备份文件到241
  2. 在241启动复制,change master to 242
  3. 等待同步完成,show slave status

具体步骤:http://wiki.onoboss.com/?p=42

SVN同步代码

svn up /home/onoboss/td_chs

TIPS

  1. 新装mysql-server,/etc/mysql/my.cnf 默认配置性能低下,推荐使用下面的:
    [shell][client]
    port            = 3306
    socket          = /var/run/mysqld/mysqld.sock
    [mysqld_safe]
    socket          = /var/run/mysqld/mysqld.sock
    nice            = 0

    [mysqld]
    user            = mysql
    pid-file        = /var/run/mysqld/mysqld.pid
    socket          = /var/run/mysqld/mysqld.sock
    port            = 3306
    basedir         = /usr
    datadir         = /var/lib/mysql
    tmpdir          = /tmp

    skip-external-locking
    skip-name-resolve

    skip-character-set-client-handshake
    init-connect            =’SET NAMES utf8′
    default-character-set   = utf8

    key_buffer              = 1M
    max_allowed_packet      = 16M
    thread_stack            = 192K
    thread_cache_size       = 16

    max_connections         = 512
    myisam-recover          = BACKUP
    back_log                = 1024

    query_cache_size        = 512M
    query_cache_limit       = 32M
    query_cache_min_res_unit = 1k

    join_buffer_size        = 2M

    expire_logs_days        = 10
    max_binlog_size         = 100M

    log_error               = /var/log/mysql/mysql.err
    general_log             = 1
    general_log_file        = /var/log/mysql/mysql.log
    long_query_time         = 1
    log-slow-queries        = /var/log/mysql/mysql-slow.log

    table_open_cache        = 1024
    max_heap_table_size     = 512M
    tmp_table_size          = 512M

    log_bin                 = mysql-bin
    server_id               = 242
    sync_binlog             = 1

    innodb_buffer_pool_size = 1G
    innodb_log_file_size    = 256M
    innodb_log_buffer_size  = 4M
    innodb_flush_log_at_trx_commit  = 2
    innodb_thread_concurrency       = 8
    innodb_flush_method     = O_DIRECT
    #transaction-isolation  = READ-COMMITTED

    [mysqldump]
    quick
    quote-names
    max_allowed_packet      = 16M

    [mysql]

    [isamchk]
    key_buffer              = 16M

    !includedir /etc/mysql/conf.d/[shell/]</li>
    <li>MySQL的错误,默认是保存在系统日志内:/var/log/syslog,使用以下命令查看:
    [shell]tail -f /var/log/syslog | grep mysql[/shell]

  2. Innodb重新设置日志文件大小,会导致Innodb引擎无法启动,需要先删除之前的日志文件:
    [shell]rm /var/lib/mysql/ib_logfile*[/shell]
  3. MySQL默认配置bind:127.0.0.1,导致php无法连接,删除或注释掉!再开启防火墙,禁止外部访问MySQL端口。
    [shell]
    #bind-address           = 127.0.0.1
    [/shell]
  4. 使用 127.0.0.1 连接数据库,localhost 可能连不上!
    241现在就不能使用localhost连接,mysql_connect返回false
  5. 一定要启用二进制日志,并做每日备份!数据丢了,哭都来不及……
    http://yueliangdao0608.blog.51cto.com/397025/118694

svn up,自动导出最新版本到目录

2010年07月30日 上午 25:40 | 作者:

vim /var/lib/svn/[revp]/hooks/post-commit

[shell]

#!/bin/sh

export LC_CTYPE=en_US.UTF-8

REPOS="$1"
REV="$2"

svn up /var/www/[revp]

[/shell]

chmod a+x /var/lib/svn/[revp]/hooks/post-commit

chown www-data:www-data /var/www/[revp]