请高手支招?
没有串口的机器也有/dev/ttyS0,也可以打开啊...
有没有人碰到过类似的问题,串口也是一种外设,intel的cpu是不会自带的.
PC上是接哪个总线呢?
http://linux.koolsolutions.com/2 ... under-debian-linux/
Check if Linux detects your Serial Port or not
There are many ways to do that. One way you could do is to give the following command:
# dmesg | grep ttyS
You should see something like this:
serial8250: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
serial8250: ttyS1 at I/O 0x2f8 (irq = 3) is a 16550A
00:09: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
00:0a: ttyS1 at I/O 0x2f8 (irq = 3) is a 16550A
The above output shows that your COM1 and COM2 ports are available and Linux recognizes them.
Another way to test is to give the following command:
# ls > /dev/ttyS0
If the command does not return any error message then your Serial Ports are recognized by your Linux system.
可以搜下那个DMESG 信息是怎么打出来,如何实现的。
__________________________________
个人意见,仅供参考。错了概不负责。
My blog: http://jianggmulab.blogspot.com/
欢迎访问:
集群和虚拟机版
来源:http://linux.chinaunix.net/bbs/thread-1174961-1-1.html
没有串口的机器也有/dev/ttyS0,也可以打开啊...
有没有人碰到过类似的问题,串口也是一种外设,intel的cpu是不会自带的.
PC上是接哪个总线呢?
http://linux.koolsolutions.com/2 ... under-debian-linux/
Check if Linux detects your Serial Port or not
There are many ways to do that. One way you could do is to give the following command:
# dmesg | grep ttyS
You should see something like this:
serial8250: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
serial8250: ttyS1 at I/O 0x2f8 (irq = 3) is a 16550A
00:09: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
00:0a: ttyS1 at I/O 0x2f8 (irq = 3) is a 16550A
The above output shows that your COM1 and COM2 ports are available and Linux recognizes them.
Another way to test is to give the following command:
# ls > /dev/ttyS0
If the command does not return any error message then your Serial Ports are recognized by your Linux system.
可以搜下那个DMESG 信息是怎么打出来,如何实现的。
__________________________________
个人意见,仅供参考。错了概不负责。
My blog: http://jianggmulab.blogspot.com/
欢迎访问:
集群和虚拟机版
来源:http://linux.chinaunix.net/bbs/thread-1174961-1-1.html
1. PHP的COOKIE
cookie 是一种在远程浏览器端储存数据并以此来跟踪和识别用户的机制。
PHP在http协议的头信息里发送cookie, 因此 setcookie() 函数必须在其它信息被输出到浏览器前调用,这和对 header() 函数的限制类似。
1.1 设置cookie:
可以用 setcookie() 或 setrawcookie() 函数来设置 cookie。也可以通过向客户端直接发送http头来设置.
1.1.1 使用setcookie()函数设置cookie:
bool setcookie ( string name [, string value [, int expire [, string path [, string domain [, bool secure [, bool httponly]]]]]] )
name: cookie变量名
value: cookie变量的值
expire: 有效期结束的时间,
path: 有效目录,
domain: 有效域名,顶级域唯一
secure: 如果值为1,则cookie只能在https连接上有效,如果为默认值0,则http和https都可以.
例子:
<?php
$value = 'something from somewhere';
setcookie("TestCookie", $value); /* 简单cookie设置 */
setcookie("TestCookie", $value, time()+3600); /* 有效期1个小时 */
setcookie("TestCookie", $value, time()+3600, "/~rasmus/", ".example.com", 1); /* 有效目录 /~rasmus,有效域名example.com及其所有子域名 */
?>
设置多个cookie变量: setcookie('var[a]','value');用数组来表示变量,但他的下标不用引号.这样就可以用$_COOKIE[‘var’][‘a’]来读取该COOKIE变量.
1.1.2. 使用header()设置cookie;
header("Set-Cookie: name=$value[;path=$path[;domain=xxx.com[;...]]");
后面的参数和上面列出setcookie函数的参数一样.
比如:
$value = 'something from somewhere';
header("Set-Cookie:name=$value");
1.2 Cookie的读取:
直接用php内置超级全局变量 $_COOKIE就可以读取浏览器端的cookie.
上面例子中设置了cookie"TestCookie",现在我们来读取:
print $_COOKIE['TestCookie'];
COOKIE是不是被输出了?!
1.3 删除cookie
只需把有效时间设为小于当前时间, 和把值设置为空.例如:
setcookie("name","",time()-1);
用header()类似.
1.4 常见问题解决:
1) 用setcookie()时有错误提示,可能是因为调用setcookie()前面有输出或空格.也可能你的文档使从其他字符集转换过来,文档后面可能带有BOM签名(就是在文件内容添加一些隐藏的BOM字符).解决的办法就是使你的文档不出现这种情况.还有通过使用ob_start()函数有也能处理一点.
2) $_COOKIE受magic_quotes_gpc影响,可能自动转义
3) 使用的时候,有必要测试用户是否支持cookie
<!--[if !supportLineBreakNewLine]-->
1.5 cookie工作机理:
有些学习者比较冲动, 没心思把原理研究,所以我把它放后面.
a) 服务器通过随着响应发送一个http的Set-Cookie头,在客户机中设置一个cookie(多个cookie要多个头).
b) 客户端自动向服务器端发送一个http的cookie头,服务器接收读取.
HTTP/1.x 200 OK
X-Powered-By: PHP/5.2.1
Set-Cookie: TestCookie=something from somewhere; path=/
Expires: Thu, 19 Nov 2007 18:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-type: text/html
这一行实现了cookie 功能,收到这行后
Set-Cookie: TestCookie=something from somewhere; path=/
浏览器将在客户端的磁盘上创建一个cookie文件,并在里面写入:
TestCookie=something from somewhere;
/
这一行就是我们用setcookie('TestCookie','something from somewhere','/');的结果.也就是用header('Set-Cookie: TestCookie=something from somewhere; path=/');的结果.
<!--[endif]-->
2. PHP的Session
session使用过期时间设为0的cookie,并且将一个称为session ID的唯一标识符(一长串字符串),在服务器端同步生成一些session文件(可以自己定义session的保存类型),与用户机关联起来.web应用程序存贮与这些session相关的数据,并且让数据随着用户在页面之间传递.
访问网站的来客会被分配一个唯一的标识符,即所谓的会话 ID。它要么存放在客户端的 cookie,要么经由 URL 传递。
会话支持允许用户注册任意数目的变量并保留给各个请求使用。当来客访问网站时,PHP 会自动(如果 session.auto_start 被设为 1)或在用户请求时(由 session_start() 明确调用或 session_register() 暗中调用)检查请求中是否发送了特定的会话 ID。如果是,则之前保存的环境就被重建。
2.1 sessionID的传送
2.1.1 通过cookie传送sessin ID
使用session_start()调用session,服务器端在生成session文件的同时,生成session ID哈希值和默认值为PHPSESSID的session name,并向客户端发送变量为(默认的是)PHPSESSID(session name),值为一个128位的哈希值.服务器端将通过该cookie与客户端进行交互.
session变量的值经php内部系列化后保存在服务器机器上的文本文件中,和客户端的变量名默认情况下为PHPSESSID的 coolie进行对应交互.
即服务器自动发送了http头:header('Set-Cookie: session_name()=session_id(); path=/');
即setcookie(session_name(),session_id());
当从该页跳转到的新页面并调用session_start()后,PHP将检查与给定ID相关联的服务器端存贮的session数据,如果没找到,则新建一个数据集.
2.1.2 通过URL传送session ID
只有在用户禁止使用cookie的时候才用这种方法,因为浏览器cookie已经通用,为安全起见,可不用该方法.
<a href="p.php?<?php print session_name() ?>=<?php print session_id() ?>">xxx</a>,也可以通过POST来传递session值.
2.2 session基本用法实例
<?php
// page1.php
session_start();
echo 'Welcome to page #1';
/* 创建session变量并给session变量赋值 */
$_SESSION['favcolor'] = 'green';
$_SESSION['animal'] = 'cat';
$_SESSION['time'] = time();
// 如果客户端使用cookie,可直接传递session到page2.php
echo '<br /><a href="page2.php">page 2</a>';
// 如果客户端禁用cookie
echo '<br /><a href="page2.php?' . SID . '">page 2</a>';
/*
默认php5.2.1下,SID只有在cookie被写入的同时才会有值,如果该session
对应的 cookie已经存在,那么SID将为(未定义)空
*/
?>
<?php
// page2.php
session_start();
print $_SESSION['animal']; // 打印出单个session
var_dump($_SESSION); // 打印出page1.php传过来的session值
?>
2.3 使用session函数控制页面缓存.
很多情况下,我们要确定我们的网页是否在客户端缓存,或要设置缓存的有效时间,比如我们的网页上有些敏感内容并且要登录才能查看,如果缓存到本地了,可以直接打开本地的缓存就可以不登录而浏览到网页了.
使用session_cache_limiter('private');可以控制页面客户端缓存,必须在session_start()之前调用.
更多参数见http://blog.chinaunix.net/u/27731/showart.php?id=258087的客户端缓存控制.
控制客户端缓存时间用 session_cache_expire(int);单位(s).也要在session_start()前调用.
这只是使用session的情况下控制缓存的方法,我们还可以在header()中控制控制页面的缓存.
2.4 删除session
要三步实现.
<?php
session_destroy(); // 第一步: 删除服务器端session文件,这使用
setcookie(session_name(),'',time()-3600); // 第二步: 删除实际的session:
$_SESSION = array(); // 第三步: 删除$_SESSION全局变量数组
?>
2.5 session在PHP大型web应用中的使用
对于访问量大的站点,用默认的session存贮方式并不适合,目前最优的方法是用数据库存取session.这时,函数bool session_set_save_handler ( callback open, callback close, callback read, callback write, callback destroy, callback gc )就是提供给我们解决这个问题的方案.
该函数使用的6个函数如下:
1. bool open() 用来打开会话存储机制,
2. bool close() 关闭会话存储操作.
3. mixde read() 从存储中装在session数据时使用这个函数
4. bool write() 将给定session ID的所有数据写到存储中
5. bool destroy() 破坏与指定的会话ID相关联的数据
6. bool gc() 对存储系统中的数据进行垃圾收集
例子见php手册session_set_save_handler() 函数.
如果用类来处理,用
session_set_save_handler(
array('className','open'),
array('className','close'),
array('className','read'),
array('className','write'),
array('className','destroy'),
array('className','gc'),
)
调用className类中的6个静态方法.className可以换对象就不用调用静态方法,但是用静态成员不用生成对象,性能更好.
2.6 常用session函数:
bool session_start(void); 初始化session
bool session_destroy(void): 删除服务器端session关联文件。
string session_id() 当前session的id
string session_name() 当前存取的session名称,也就是客户端保存session ID的cookie名称.默认PHPSESSID。
array session_get_cookie_params() 与这个session相关联的session的细节.
string session_cache_limiter() 控制使用session的页面的客户端缓存
ini session_cache_expire() 控制客户端缓存时间
bool session_destroy() 删除服务器端保存session信息的文件
void session_set_cookie_params ( int lifetime [, string path [, string domain [, bool secure [, bool httponly]]]] )设置与这个session相关联的session的细节
bool session_set_save_handler ( callback open, callback close, callback read, callback write, callback destroy, callback gc )定义处理session的函数,(不是使用默认的方式)
bool session_regenerate_id([bool delete_old_session]) 分配新的session id
2.7 session安全问题
攻击者通过投入很大的精力尝试获得现有用户的有效会话ID,有了会话id,他们就有可能能够在系统中拥有与此用户相同的能力.
因此,我们主要解决的思路是效验session ID的有效性.
<?php
if(!isset($_SESSION['user_agent'])){
$_SESSION['user_agent'] = $_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT'];
}
/* 如果用户session ID是伪造 */
elseif ($_SESSION['user_agent'] != $_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT']) {
session_regenerate_id();
}
?>
2.8 Session通过cookie传递和通过SID传递的不同:
在php5.2.1的session的默认配置的情况下,当生成session的同时,服务器端将在发送header set-cookie同时生成预定义超级全局变量SID(也就是说,写入cookie和抛出SID是等价的.),当$_COOKIE['PHPSESSID']存在以后,将不再写入cookie,也不再生成超级全局变量SID,此时,SID将是空的.
2.9 session使用实例
<?php
/**
* 效验session的合法性
*
*/
function sessionVerify() {
if(!isset($_SESSION['user_agent'])){
$_SESSION['user_agent'] = MD5($_SERVER['REMOTE_ADDR']
.$_SERVER['HTTP_USER_AGENT']);
}
/* 如果用户session ID是伪造,则重新分配session ID */
elseif ($_SESSION['user_agent'] != MD5($_SERVER['REMOTE_ADDR']
. $_SERVER['HTTP_USER_AGENT'])) {
session_regenerate_id();
}
}
/**
* 销毁session
* 三步完美实现,不可漏
*
*/
function sessionDestroy() {
session_destroy();
setcookie(session_name(),'',time()-3600);
$_SESSION = array();
}
?>
注明:
session 出现头信息已经发出的原因与cookie一样.
在php5中,所有php session 的注册表配置选项都是编程时可配置的,一般情况下,我们是不用修改其配置的.要了解php的session注册表配置选项,请参考手册的Session 会话处理函数处.
session的保存数据的时候,是通过系列化$_SESSION数组来存贮,所以有系列化所拥有的问题,可能有特殊字符的值要用 base64_encode函数编码,读取的时候再用base64_decode解码
转载 http://blog.chinaunix.net/u/27731/showart_259031.html
cookie 是一种在远程浏览器端储存数据并以此来跟踪和识别用户的机制。
PHP在http协议的头信息里发送cookie, 因此 setcookie() 函数必须在其它信息被输出到浏览器前调用,这和对 header() 函数的限制类似。
1.1 设置cookie:
可以用 setcookie() 或 setrawcookie() 函数来设置 cookie。也可以通过向客户端直接发送http头来设置.
1.1.1 使用setcookie()函数设置cookie:
bool setcookie ( string name [, string value [, int expire [, string path [, string domain [, bool secure [, bool httponly]]]]]] )
name: cookie变量名
value: cookie变量的值
expire: 有效期结束的时间,
path: 有效目录,
domain: 有效域名,顶级域唯一
secure: 如果值为1,则cookie只能在https连接上有效,如果为默认值0,则http和https都可以.
例子:
<?php
$value = 'something from somewhere';
setcookie("TestCookie", $value); /* 简单cookie设置 */
setcookie("TestCookie", $value, time()+3600); /* 有效期1个小时 */
setcookie("TestCookie", $value, time()+3600, "/~rasmus/", ".example.com", 1); /* 有效目录 /~rasmus,有效域名example.com及其所有子域名 */
?>
设置多个cookie变量: setcookie('var[a]','value');用数组来表示变量,但他的下标不用引号.这样就可以用$_COOKIE[‘var’][‘a’]来读取该COOKIE变量.
1.1.2. 使用header()设置cookie;
header("Set-Cookie: name=$value[;path=$path[;domain=xxx.com[;...]]");
后面的参数和上面列出setcookie函数的参数一样.
比如:
$value = 'something from somewhere';
header("Set-Cookie:name=$value");
1.2 Cookie的读取:
直接用php内置超级全局变量 $_COOKIE就可以读取浏览器端的cookie.
上面例子中设置了cookie"TestCookie",现在我们来读取:
print $_COOKIE['TestCookie'];
COOKIE是不是被输出了?!
1.3 删除cookie
只需把有效时间设为小于当前时间, 和把值设置为空.例如:
setcookie("name","",time()-1);
用header()类似.
1.4 常见问题解决:
1) 用setcookie()时有错误提示,可能是因为调用setcookie()前面有输出或空格.也可能你的文档使从其他字符集转换过来,文档后面可能带有BOM签名(就是在文件内容添加一些隐藏的BOM字符).解决的办法就是使你的文档不出现这种情况.还有通过使用ob_start()函数有也能处理一点.
2) $_COOKIE受magic_quotes_gpc影响,可能自动转义
3) 使用的时候,有必要测试用户是否支持cookie
<!--[if !supportLineBreakNewLine]-->
1.5 cookie工作机理:
有些学习者比较冲动, 没心思把原理研究,所以我把它放后面.
a) 服务器通过随着响应发送一个http的Set-Cookie头,在客户机中设置一个cookie(多个cookie要多个头).
b) 客户端自动向服务器端发送一个http的cookie头,服务器接收读取.
HTTP/1.x 200 OK
X-Powered-By: PHP/5.2.1
Set-Cookie: TestCookie=something from somewhere; path=/
Expires: Thu, 19 Nov 2007 18:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-type: text/html
这一行实现了cookie 功能,收到这行后
Set-Cookie: TestCookie=something from somewhere; path=/
浏览器将在客户端的磁盘上创建一个cookie文件,并在里面写入:
TestCookie=something from somewhere;
/
这一行就是我们用setcookie('TestCookie','something from somewhere','/');的结果.也就是用header('Set-Cookie: TestCookie=something from somewhere; path=/');的结果.
<!--[endif]-->
2. PHP的Session
session使用过期时间设为0的cookie,并且将一个称为session ID的唯一标识符(一长串字符串),在服务器端同步生成一些session文件(可以自己定义session的保存类型),与用户机关联起来.web应用程序存贮与这些session相关的数据,并且让数据随着用户在页面之间传递.
访问网站的来客会被分配一个唯一的标识符,即所谓的会话 ID。它要么存放在客户端的 cookie,要么经由 URL 传递。
会话支持允许用户注册任意数目的变量并保留给各个请求使用。当来客访问网站时,PHP 会自动(如果 session.auto_start 被设为 1)或在用户请求时(由 session_start() 明确调用或 session_register() 暗中调用)检查请求中是否发送了特定的会话 ID。如果是,则之前保存的环境就被重建。
2.1 sessionID的传送
2.1.1 通过cookie传送sessin ID
使用session_start()调用session,服务器端在生成session文件的同时,生成session ID哈希值和默认值为PHPSESSID的session name,并向客户端发送变量为(默认的是)PHPSESSID(session name),值为一个128位的哈希值.服务器端将通过该cookie与客户端进行交互.
session变量的值经php内部系列化后保存在服务器机器上的文本文件中,和客户端的变量名默认情况下为PHPSESSID的 coolie进行对应交互.
即服务器自动发送了http头:header('Set-Cookie: session_name()=session_id(); path=/');
即setcookie(session_name(),session_id());
当从该页跳转到的新页面并调用session_start()后,PHP将检查与给定ID相关联的服务器端存贮的session数据,如果没找到,则新建一个数据集.
2.1.2 通过URL传送session ID
只有在用户禁止使用cookie的时候才用这种方法,因为浏览器cookie已经通用,为安全起见,可不用该方法.
<a href="p.php?<?php print session_name() ?>=<?php print session_id() ?>">xxx</a>,也可以通过POST来传递session值.
2.2 session基本用法实例
<?php
// page1.php
session_start();
echo 'Welcome to page #1';
/* 创建session变量并给session变量赋值 */
$_SESSION['favcolor'] = 'green';
$_SESSION['animal'] = 'cat';
$_SESSION['time'] = time();
// 如果客户端使用cookie,可直接传递session到page2.php
echo '<br /><a href="page2.php">page 2</a>';
// 如果客户端禁用cookie
echo '<br /><a href="page2.php?' . SID . '">page 2</a>';
/*
默认php5.2.1下,SID只有在cookie被写入的同时才会有值,如果该session
对应的 cookie已经存在,那么SID将为(未定义)空
*/
?>
<?php
// page2.php
session_start();
print $_SESSION['animal']; // 打印出单个session
var_dump($_SESSION); // 打印出page1.php传过来的session值
?>
2.3 使用session函数控制页面缓存.
很多情况下,我们要确定我们的网页是否在客户端缓存,或要设置缓存的有效时间,比如我们的网页上有些敏感内容并且要登录才能查看,如果缓存到本地了,可以直接打开本地的缓存就可以不登录而浏览到网页了.
使用session_cache_limiter('private');可以控制页面客户端缓存,必须在session_start()之前调用.
更多参数见http://blog.chinaunix.net/u/27731/showart.php?id=258087的客户端缓存控制.
控制客户端缓存时间用 session_cache_expire(int);单位(s).也要在session_start()前调用.
这只是使用session的情况下控制缓存的方法,我们还可以在header()中控制控制页面的缓存.
2.4 删除session
要三步实现.
<?php
session_destroy(); // 第一步: 删除服务器端session文件,这使用
setcookie(session_name(),'',time()-3600); // 第二步: 删除实际的session:
$_SESSION = array(); // 第三步: 删除$_SESSION全局变量数组
?>
2.5 session在PHP大型web应用中的使用
对于访问量大的站点,用默认的session存贮方式并不适合,目前最优的方法是用数据库存取session.这时,函数bool session_set_save_handler ( callback open, callback close, callback read, callback write, callback destroy, callback gc )就是提供给我们解决这个问题的方案.
该函数使用的6个函数如下:
1. bool open() 用来打开会话存储机制,
2. bool close() 关闭会话存储操作.
3. mixde read() 从存储中装在session数据时使用这个函数
4. bool write() 将给定session ID的所有数据写到存储中
5. bool destroy() 破坏与指定的会话ID相关联的数据
6. bool gc() 对存储系统中的数据进行垃圾收集
例子见php手册session_set_save_handler() 函数.
如果用类来处理,用
session_set_save_handler(
array('className','open'),
array('className','close'),
array('className','read'),
array('className','write'),
array('className','destroy'),
array('className','gc'),
)
调用className类中的6个静态方法.className可以换对象就不用调用静态方法,但是用静态成员不用生成对象,性能更好.
2.6 常用session函数:
bool session_start(void); 初始化session
bool session_destroy(void): 删除服务器端session关联文件。
string session_id() 当前session的id
string session_name() 当前存取的session名称,也就是客户端保存session ID的cookie名称.默认PHPSESSID。
array session_get_cookie_params() 与这个session相关联的session的细节.
string session_cache_limiter() 控制使用session的页面的客户端缓存
ini session_cache_expire() 控制客户端缓存时间
bool session_destroy() 删除服务器端保存session信息的文件
void session_set_cookie_params ( int lifetime [, string path [, string domain [, bool secure [, bool httponly]]]] )设置与这个session相关联的session的细节
bool session_set_save_handler ( callback open, callback close, callback read, callback write, callback destroy, callback gc )定义处理session的函数,(不是使用默认的方式)
bool session_regenerate_id([bool delete_old_session]) 分配新的session id
2.7 session安全问题
攻击者通过投入很大的精力尝试获得现有用户的有效会话ID,有了会话id,他们就有可能能够在系统中拥有与此用户相同的能力.
因此,我们主要解决的思路是效验session ID的有效性.
<?php
if(!isset($_SESSION['user_agent'])){
$_SESSION['user_agent'] = $_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT'];
}
/* 如果用户session ID是伪造 */
elseif ($_SESSION['user_agent'] != $_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT']) {
session_regenerate_id();
}
?>
2.8 Session通过cookie传递和通过SID传递的不同:
在php5.2.1的session的默认配置的情况下,当生成session的同时,服务器端将在发送header set-cookie同时生成预定义超级全局变量SID(也就是说,写入cookie和抛出SID是等价的.),当$_COOKIE['PHPSESSID']存在以后,将不再写入cookie,也不再生成超级全局变量SID,此时,SID将是空的.
2.9 session使用实例
<?php
/**
* 效验session的合法性
*
*/
function sessionVerify() {
if(!isset($_SESSION['user_agent'])){
$_SESSION['user_agent'] = MD5($_SERVER['REMOTE_ADDR']
.$_SERVER['HTTP_USER_AGENT']);
}
/* 如果用户session ID是伪造,则重新分配session ID */
elseif ($_SESSION['user_agent'] != MD5($_SERVER['REMOTE_ADDR']
. $_SERVER['HTTP_USER_AGENT'])) {
session_regenerate_id();
}
}
/**
* 销毁session
* 三步完美实现,不可漏
*
*/
function sessionDestroy() {
session_destroy();
setcookie(session_name(),'',time()-3600);
$_SESSION = array();
}
?>
注明:
session 出现头信息已经发出的原因与cookie一样.
在php5中,所有php session 的注册表配置选项都是编程时可配置的,一般情况下,我们是不用修改其配置的.要了解php的session注册表配置选项,请参考手册的Session 会话处理函数处.
session的保存数据的时候,是通过系列化$_SESSION数组来存贮,所以有系列化所拥有的问题,可能有特殊字符的值要用 base64_encode函数编码,读取的时候再用base64_decode解码
转载 http://blog.chinaunix.net/u/27731/showart_259031.html
SIGCHLD属于unix以及类unix系统的一种信号
产生原因 siginfo_t代码值
1,子进程已终止 CLD_EXITED
2,子进程异常终止(无core) CLD_KILLED
3,子进程异常终止(有core) CLD_DUMPED
4,被跟踪子进程以陷入 CLD_TRAPPED
5,子进程已停止 CLD_STOPED
5,停止的子进程已经继续 CLD_CONTINUED
描述:
在一个进程终止或者停止时,将SIGCHLD信号发送给其父进程。按系统默认将忽略此信号。如果父进程希望被告知其子系统的这种状态,则应捕捉此信号。信号的捕捉函数中通常调用wait函数以取得进程ID和其终止状态。
产生原因 siginfo_t代码值
1,子进程已终止 CLD_EXITED
2,子进程异常终止(无core) CLD_KILLED
3,子进程异常终止(有core) CLD_DUMPED
4,被跟踪子进程以陷入 CLD_TRAPPED
5,子进程已停止 CLD_STOPED
5,停止的子进程已经继续 CLD_CONTINUED
描述:
在一个进程终止或者停止时,将SIGCHLD信号发送给其父进程。按系统默认将忽略此信号。如果父进程希望被告知其子系统的这种状态,则应捕捉此信号。信号的捕捉函数中通常调用wait函数以取得进程ID和其终止状态。
摘要:目前,数据库在各行各业中广泛应用。在众多商业数据库软件中,SQL SERVER 和ORACLE被较多的使用,因此这两个数据库软件的价格也较昂贵。本文主要介绍MySQL数据库在单线程或多线程程序环境下使用C API访问MySQL数据库方法,并给出了相应代码和分析。该数据库属于开源数据库,具有较高的成熟度,并且对于社区版本可以免费使用,因此对于需要使用 C API访问数据库的项目开发,可降低开发成本。
关键词:MySQL;C API;多线程
中图分类号:TP311文献标识码:A文章编号:1009-3044(2007)16-30904-02
Based on C API MySQL Database Multi-threaded Access Methods
YU Cheng-gong
(Zhejiang Pharmaceutical College,Ningbo 315100,China)
Abstract:Currently,the database in all walks of life were widely used.In many commercial database software,SQL Server and Oracle are used more and therefore their prices are more expensive. This paper describes the MySQL database in single-threaded or multi-threaded programming environment using C API access to the MySQL database, and gives the corresponding code and analysis. The database is open source database, with a higher maturity level, and the community version can be used for free. It satisfies the need to use the C API access to the database of project development, and reduces development costs.
Key words:MySQL;C API;multi-threaded
1 引言
随着社会信息化的深入,数据库在社会各个领域被广泛应用。在这些数据库应用项目开发过程中,需要做两方面的决策:1. 使用何种数据库软件;2. 采用何种方式访问数据库。数据库软件的选择面比较宽,在目前众多商业数据库软件中,SQL SERVER 和ORACLE被较多的使用,当然这两个数据库软件的价格也较昂贵,本文选择可免费使用的MySQL数据库社区版本,MySQL库属于开源数据库,具有较高的成熟度和可靠性。数据库的访问方式有很多,可以使用ODBC、DAO、ADO等方法,这些方法简单直接但是效率不高,不适合大型复杂的系统使用,例如网络游戏的数据库系统开发需要考虑同时大量的数据库访问,因此访问的效率非常重要。基于C程序语言的高效率,使用C API访问数据库可以提高数据库的访问效率。基于以上两点,本文将介绍基于C API的MySQL数据库访问方法,给出在单线程和多线程程序环境下的具体代码和分析。
2 建表
为了方便说明数据库的访问,先建立一个数据库表TestTable,可以使用SQL语句创建该表,也可以使用MySQL提供的图形界面来创建。数据库表中字段如下:
该数据库表使用最常见的用户名和密码作为字段,本文将通过该表来实现不同程序环境下基于C API的数据库的访问方法。
3 单线程程序的数据库访问
单线程应用程序访问MySQL数据库相对简单,其过程包含以下几步:
(1)初始化MySQL库
(2)初始化数据库连接句柄
(3)连接数据库
(4)通过SQL语句操作数据库并处理相应数据
(5)关闭数据库连接
(6)结束MySQL库
通过这五个步骤即可实现数据库的访问,具体代码和分析如下:
//在main主函数中添加代码
//1.定义访问数据库所需变量
MYSQL * myData;
MYSQL_RES * res;
MYSQL_ROW row;
//2. 初始化MySQL库和数据库连接句柄
myData = mysql_init((MYSQL*) 0);
//3. 连接数据库,MYSQL_IP和MYSQL_PORT表示数据库的IP和端口
// MYSQL_ACCOUNT, MYSQL_PASSWORD表示数据库连接的帐号和密码
//MYSQL_DBNAME表示所要访问的数据库名
mysql_real_connect( myData, MYSQL_IP, MYSQL_ACCOUNT, MYSQL_PASSWORD, MYSQL_DBNAME, MYSQL_PORT,NULL, 0 )
//4. 通过SQL语句操作数据库并处理相应数据
//4.1新建用户名为abcdef,密码为123456的记录
mysql_query(myData, "insert into TestTable value(‘abcdef’,’ 123456’)");
//4.2显示所有记录
//查询所有记录
mysql_query(myData, "select * from TestTable");
//将查询结果保存到res中
res = mysql_store_result( myData ) ;
//逐条显示记录
Int j = 0;
while ( row = mysql_fetch_row( res ) ) {//获取一条记录
j = mysql_num_fields( res ) ;//获取每条记录的字段数
for ( k = 0 ; k < j ; k++ )
printf( “%s”, row[k] ) ;
printf( “\n”) ;
}
//释放res
mysql_free_result( res ) ;
//5. 关闭数据库连接
mysql_close( myData );
//6. 结束MySQL库
mysql_library_end();
关于代码的几点说明:
(1)定义变量中的三个数据结构为访问MySQL所需,MYSQL结构表示一个数据库连接的句柄,其中包含了数据库连接所需的参数,MYSQL_RES结构表示数据库访问中一个查询的返回结果,MYSQL_ROW结构表示返回结构中的一条记录;
(2)获取查询结果res并处理完毕,必须释放res,否则会造成内存泄露
(3)在单线程时,步骤初始化MySQL库和数据库连接句柄可合并, 由mysql_init()来处理。该函数会自动调用函数mysql_library_init()来初始化MySQL库,同时初始化连接句柄。
4 多线程环境下的数据库访问
多线程环境下的数据库访问需要保证线程安全。Windows版本的MySQL C API函数都是线程安全的,除了mysql_library_init(),而我们刚才的代码中使用的mysql_init()函数会自动调用函数 mysql_library_init()来初始化MySQL库,因此在多线程环境下,需要不同的初始化代码和清理代码。具体过程如下:
(1)在主函数中调用mysql_library_init()来初始化MySQL库;
(2)启动各数据库访问线程
(3)主函数等待各个线程的结束
(4)调用mysql_library_end ()清理MySQL库。
其中数据库访问线程的代码和单线程数据库访问代码类似,但是需要如下变化:
(1)单线程中的第2步初始化MySQL库和数据库连接句柄,不能再使用mysql_init(),代码应作如下修改:
//初始化线程
my_init();
mysql_thread_init();
//初始化myData
myData = malloc(sizeof(MYSQL));
memset(&myData, 0, sizeof(MYSQL))
(2)上述初始化myData,只是将myData所有成员设为0,如果有需要可以根据具体情况设置该结构成员的值,例myData->reconnect= 1,其作用是设置数据库连接属性为重连接,即当数据库连接断开时,自动重新连接;
(3)单线程中的第6步不在需要,改为结束线程的清理工作,即调用mysql_thread_end()函数。
5 总结
综上所述,使用C API访问MySQL数据库在不同线程环境下的区别主要在于初始化和访问结束后清理代码,也就是说除了初始化和清理代码,MySQL提供给我们的C API函数都是线程安全的。最后需要有一点说明,使用C API访问数据库可以提高数据库的访问效率,但并不是所有的数据库项目都适合这种方式,该方式适合需要大量实时并发处理的数据库项目,例如网络游戏的数据库项目,对于有此需求的数据库项目可参考本文。
参考文献:
[1]MySQL AB,MySQL 5.0 Reference Manual.
来源:http://www.cppblog.com/cuijixin/archive/2008/04/22/47822.html
关键词:MySQL;C API;多线程
中图分类号:TP311文献标识码:A文章编号:1009-3044(2007)16-30904-02
Based on C API MySQL Database Multi-threaded Access Methods
YU Cheng-gong
(Zhejiang Pharmaceutical College,Ningbo 315100,China)
Abstract:Currently,the database in all walks of life were widely used.In many commercial database software,SQL Server and Oracle are used more and therefore their prices are more expensive. This paper describes the MySQL database in single-threaded or multi-threaded programming environment using C API access to the MySQL database, and gives the corresponding code and analysis. The database is open source database, with a higher maturity level, and the community version can be used for free. It satisfies the need to use the C API access to the database of project development, and reduces development costs.
Key words:MySQL;C API;multi-threaded
1 引言
随着社会信息化的深入,数据库在社会各个领域被广泛应用。在这些数据库应用项目开发过程中,需要做两方面的决策:1. 使用何种数据库软件;2. 采用何种方式访问数据库。数据库软件的选择面比较宽,在目前众多商业数据库软件中,SQL SERVER 和ORACLE被较多的使用,当然这两个数据库软件的价格也较昂贵,本文选择可免费使用的MySQL数据库社区版本,MySQL库属于开源数据库,具有较高的成熟度和可靠性。数据库的访问方式有很多,可以使用ODBC、DAO、ADO等方法,这些方法简单直接但是效率不高,不适合大型复杂的系统使用,例如网络游戏的数据库系统开发需要考虑同时大量的数据库访问,因此访问的效率非常重要。基于C程序语言的高效率,使用C API访问数据库可以提高数据库的访问效率。基于以上两点,本文将介绍基于C API的MySQL数据库访问方法,给出在单线程和多线程程序环境下的具体代码和分析。
2 建表
为了方便说明数据库的访问,先建立一个数据库表TestTable,可以使用SQL语句创建该表,也可以使用MySQL提供的图形界面来创建。数据库表中字段如下:
该数据库表使用最常见的用户名和密码作为字段,本文将通过该表来实现不同程序环境下基于C API的数据库的访问方法。
3 单线程程序的数据库访问
单线程应用程序访问MySQL数据库相对简单,其过程包含以下几步:
(1)初始化MySQL库
(2)初始化数据库连接句柄
(3)连接数据库
(4)通过SQL语句操作数据库并处理相应数据
(5)关闭数据库连接
(6)结束MySQL库
通过这五个步骤即可实现数据库的访问,具体代码和分析如下:
//在main主函数中添加代码
//1.定义访问数据库所需变量
MYSQL * myData;
MYSQL_RES * res;
MYSQL_ROW row;
//2. 初始化MySQL库和数据库连接句柄
myData = mysql_init((MYSQL*) 0);
//3. 连接数据库,MYSQL_IP和MYSQL_PORT表示数据库的IP和端口
// MYSQL_ACCOUNT, MYSQL_PASSWORD表示数据库连接的帐号和密码
//MYSQL_DBNAME表示所要访问的数据库名
mysql_real_connect( myData, MYSQL_IP, MYSQL_ACCOUNT, MYSQL_PASSWORD, MYSQL_DBNAME, MYSQL_PORT,NULL, 0 )
//4. 通过SQL语句操作数据库并处理相应数据
//4.1新建用户名为abcdef,密码为123456的记录
mysql_query(myData, "insert into TestTable value(‘abcdef’,’ 123456’)");
//4.2显示所有记录
//查询所有记录
mysql_query(myData, "select * from TestTable");
//将查询结果保存到res中
res = mysql_store_result( myData ) ;
//逐条显示记录
Int j = 0;
while ( row = mysql_fetch_row( res ) ) {//获取一条记录
j = mysql_num_fields( res ) ;//获取每条记录的字段数
for ( k = 0 ; k < j ; k++ )
printf( “%s”, row[k] ) ;
printf( “\n”) ;
}
//释放res
mysql_free_result( res ) ;
//5. 关闭数据库连接
mysql_close( myData );
//6. 结束MySQL库
mysql_library_end();
关于代码的几点说明:
(1)定义变量中的三个数据结构为访问MySQL所需,MYSQL结构表示一个数据库连接的句柄,其中包含了数据库连接所需的参数,MYSQL_RES结构表示数据库访问中一个查询的返回结果,MYSQL_ROW结构表示返回结构中的一条记录;
(2)获取查询结果res并处理完毕,必须释放res,否则会造成内存泄露
(3)在单线程时,步骤初始化MySQL库和数据库连接句柄可合并, 由mysql_init()来处理。该函数会自动调用函数mysql_library_init()来初始化MySQL库,同时初始化连接句柄。
4 多线程环境下的数据库访问
多线程环境下的数据库访问需要保证线程安全。Windows版本的MySQL C API函数都是线程安全的,除了mysql_library_init(),而我们刚才的代码中使用的mysql_init()函数会自动调用函数 mysql_library_init()来初始化MySQL库,因此在多线程环境下,需要不同的初始化代码和清理代码。具体过程如下:
(1)在主函数中调用mysql_library_init()来初始化MySQL库;
(2)启动各数据库访问线程
(3)主函数等待各个线程的结束
(4)调用mysql_library_end ()清理MySQL库。
其中数据库访问线程的代码和单线程数据库访问代码类似,但是需要如下变化:
(1)单线程中的第2步初始化MySQL库和数据库连接句柄,不能再使用mysql_init(),代码应作如下修改:
//初始化线程
my_init();
mysql_thread_init();
//初始化myData
myData = malloc(sizeof(MYSQL));
memset(&myData, 0, sizeof(MYSQL))
(2)上述初始化myData,只是将myData所有成员设为0,如果有需要可以根据具体情况设置该结构成员的值,例myData->reconnect= 1,其作用是设置数据库连接属性为重连接,即当数据库连接断开时,自动重新连接;
(3)单线程中的第6步不在需要,改为结束线程的清理工作,即调用mysql_thread_end()函数。
5 总结
综上所述,使用C API访问MySQL数据库在不同线程环境下的区别主要在于初始化和访问结束后清理代码,也就是说除了初始化和清理代码,MySQL提供给我们的C API函数都是线程安全的。最后需要有一点说明,使用C API访问数据库可以提高数据库的访问效率,但并不是所有的数据库项目都适合这种方式,该方式适合需要大量实时并发处理的数据库项目,例如网络游戏的数据库项目,对于有此需求的数据库项目可参考本文。
参考文献:
[1]MySQL AB,MySQL 5.0 Reference Manual.
来源:http://www.cppblog.com/cuijixin/archive/2008/04/22/47822.html
【摘要】:很多网站在一些看似不起眼的小问题上往往暴露出其不专业的缺点,这些问题看起来可能并不严重,甚至微不足道,但实践经验表明,在网站的总体功能差不多的情况下,细节问题往往是决定一个网站是否真正有效的关键因素。这就是网络营销中的细节致胜法则。
英国一家研究机构在2002年5月份发表的调查资料表明,英国很多大型公司在企业网站的建设和维护方面尽管花费了数以百万英镑计的资金,但真正有用的网站却寥寥无几,所投入的资金几乎等于浪费。其实这种状况在中国也很普遍,毫不夸张的说,95%以上的企业网站通常都没有发挥多大作用。于是我们常常可以看到一些
为企业网站“诊断”的文章罗列企业的“罪状”,比如网页设计简陋、长期没有更新、网站缺乏有效的推广等等,实际情况显然并不仅仅限于这些表面问题。
如果进行深入分析,不难发现,很多网站在一些看似不起眼的小问题上往往暴露出其不专业的缺点,这些问题看起来可能并不严重,甚至微不足道,但实践经验表明,在网站的总体功能差不多的情况下,细节问题往往是决定一个网站是否真正有效的关键因素。
小事情,大问题
网站上一个小小的错误,可能造成严重的经济损失,甚至引起不必要的法律纠纷,不要以为这是耸人听闻,这种事情已经出现在一些知名的企业中。据报道,2001年12月份,在圣诞节之前,戴尔电脑公司在自己的网站上将产品的价格误登,一款正常售价为229美元的音箱被标注为24.95美元,并且改信息在网站上刊登了将近一个星期,由于获得大量订货,订单数一度超过库存数量而被迫取消了部分订单。戴尔公司不得不按照错误的价格为部分顾客发货,而被取消订单者也获得了可用于购买软件及外围设备的10%的折扣卷。
如果说像戴尔公司这样因为网站上某个地方文字录入的错误而引起严重后果只是偶然现象的话,那么很多“日常小事”实际上都在严重影响着网站的最终效果。这种“小事”很多,我们不妨在此看一下在很多企业中都必不可少的信息——“联系方式”中所存在的误区。
(1)“联系方式”不应上演空城计
常用的联系方式包括地址、电话、电子邮件等,你也许会问,这么简单的问题,公布在网站上不就行了吗?没错,就这么简单,但是就有不少企业以为简单,反而没有给予足够的重视,结果造成很多问题。我们经常可以看到一些网站上的“联系我们”菜单,点击之后发现是一个形式如“mailto:webmaster@****.com” 的电子邮件链接,想查找公司地址和服务电话?没有,大概是希望用户发邮件去询问吧?这种情况如果出现在个人
主页中并不奇怪,但作为一个正规企业,用户会怎样联想呢?该企业是不是没有正规的办公场所或者电话因为欠费等原因已经被终止使用?或者根本就是一个非法的网站,因而不敢公布自己的地址和电话?就是这么一个简单的问题,怎么能让用户产生信任呢?即使不去想这么多,实践经验表明,发给webmaster的信件通常得不到及时回复,很多公司甚至根本不回复用户的邮件,由此可以想象,企业网站仅仅公布这样的联系方式能有多大意义。
(2)在线表单有缺陷
我们对此做进一步的分析,可以发现一些企业网站上尽管公布了多种联系方式,但其中仍然存在不少问题,以在线联系方式来说,根据笔者多年来对于大量企业网站的分析观察,通常有两种主要表现形式:一种是在网页上刊登企业的联系Email,用户将问题通过电子邮件发送给企业相关人员;另一种是利用浏览器界面让用户填写格式化的在线表单。此外还有一些非主流形式的在线联系方式,如论坛、留言簿、即时信息等,我们在此不做详细分析。从功能上说,在线表单和电子邮这两种常用的在线联系方式都可以实现用户沟通的目的,但从效果上来说却有着很大的区别。
在线表单是用户通过浏览器界面填写自己的联系信息和问题,然后在线提交到网站,由相应的管理人员处理,并且由于表单可以事先设定一些格式化的内容,如联系人姓名、单位、地址、问题类别等,通过在线表单提交的信息比一般的电子邮件更容易分类处理,因此受到一些网站的欢迎。尽管从表面来看,在线表单的作用与Email方式没有太大的差别,同样都可以达到传递信息的目的,但如果处理不当,在线表单可能会存在很大的潜在问题。
首先,由于在线表单限制了用户的个性化要求,有些信息可能无法正常表达;其次,当表单提交成功之后,用户也不了解信息提交到什么地方,多长时间可能得到回复,并且自己无法保留邮件副本,不便于日后查询。因此,有时会对采用在线表单的联系方式会产生不信任感。另外,顾客填写的联系Email地址也有错误的可能,这样将无法通过Email回复用户的问题,甚至会造成用户不满。
那么,是不是说在线表单就不适合于网上联系使用呢?当然也不是,关键在于是否真正站在用户的角度来考虑。其实只要对一些细节问题考虑更周到一些,情况就会有很大不同,比如,在联系信息的表单页面同时给出其他联系方式,如电子邮件地址、电话号码,并且给出一个服务承诺,在提交后多久会回复用户的问题,同时也有必要提醒用户对有关咨询的问题自行用其他方式保留副本。如果增加了这些细节处理,相信对于用户来说会感到自己受到高度重视,可以大大增加对企业的信任感,也会有更多信息愿意和企业交流,因而也会在一定程度上增进客户关系。
如果用户采用Email方式与企业联系,企业负责人员的回复过程可能会稍微麻烦一些,因为问题没有经过事先分类,个性的内容要多一些,有时甚至不容易判断应该转交给那个部分的人员来处理,但对于用户来说会产生一定程度的安全感,因为他“知道”自己的电子邮件发给了谁,也可以由发出邮件的备份查询自己的联系记录,因而通过Email方式联系被广泛采用。但,即使企业在网站上公布电子邮箱,深入探讨起来,还有不少地方存在问题,有有些企业采用免费邮箱的形式,还有一些网站为追求视觉上的漂亮,将联系信息用图片的形式来表达,这些看似不起眼的问题,同样会影响企业形象和用户的信任。
(3)免费邮箱问题多
利用免费邮箱作为商业应用,不仅影响企业形象,甚至会造成更大损失。我们经常可以看到一些小型企业网站上留下免费邮件地址,也许已经习以为常,甚至在不少企业高级管理人员的名片、广告、企业宣传材料、等场合也出现免费邮箱。从功能上说,无论免费邮箱,还是企业的专用邮箱都能起到信息传递的作用,但免费邮箱存在很多缺陷,即使不考虑技术方面的因素和服务商的种种限制,即使在正常使用的情况下有时也会造成严重后果,如一个比较隐形的问题,还没有引起足够的重视,那就是免费邮箱的保密性问题。免费邮箱服务商通常会有很多用户,同一个域名下的用户名比较接近的很多,如editor@163.net与editor@163.com等,或者editor@163.net与editor@263.net之间都很容易混淆,稍不留意,如果写错了收信人,就有可能造成泄密。如果使用企业自己的邮箱,这种事情发生的可能性就会大为降低。
(4)图片格式会误事
如果将联系方式等信息用图片形式来处理会怎样呢?我们知道,电子邮件地址可以设置一个“mailto:”的链接,用户点击链接就可以直接弹出系统默认的电子邮件发送程序,为联系提供了方便,即使不是马上发送邮件,采用文本形式的Email地址也可以很方便地拷贝到自己的通讯录或者记事本上,在需要时调出。如果将电子邮件地址制作为图片,用户将无法直接点击或者拷贝邮件地址,为了向公司发送电子邮件,不得不手工将邮件地址一个字符一个字符地重新输入一次,真是人为地制造麻烦!说不定用户早已不耐烦走掉了,如果因此失去
一个重要客户,岂不是很可惜?更有甚者,有些网站为追求华丽的效果,只有当鼠标移动到“联系方式”图标时才能显示联系信息,一旦移开鼠标,所有的信息都消失了!
(5)及时回复顾客更重要
仅仅有正确的联系方式也还远远不够,除了在网站设计和应用中应该重视联系信息的完整和有效之外,及时用户/潜在用户的Email咨询也非常重要,即使在网站上留下了详细的联系方式,如果不能在顾客期望的时间内回复或者根本不给予回复,结果可能对公司造成更大的负面影响。
国际著名调查公司Jupiter Media Metrix的研究表明,最近三年来,顾客对Email咨询期望的回复时间在不断缩短,从24小时减少到12小时,最近,大多数顾客希望在6个小时内获得关于顾客服务的询问,甚至为数不少的顾客在寻求获得即时满意的服务。但是目前可以做到这一点的企业不多,并且主要集中在网上零售、金融服务等领域,传统企业网站几乎没有一家可以在顾客期望的时间内给予回复,整体平均只有38%的被调查的企业可以在6小时内回复,33%的公司会在几天甚至更长的时间后回复用户的电子邮件,有些甚至根本不给予回复。表现较好的网上零售企业中有一半以上的网上零售商可以满足用户的期望,相形之下,由于用户应用互联网的范围越来越广泛,对于传统企业网站的服务自然很难感到满意。
像联系方式这么简单的问题很多企业都在犯不同程度的错误,其中包括不少大型企业和知名企业,而与此有同等重要的小细节问题还有很多,如网站信息的可靠性、网页标题的规范性、产品/服务介绍的完整性、回复顾客咨询的及时性等等,每一处细节问题处理不当,都会在一定程度上影响到企业网站的最终效果。
来源:http://www.marketingman.net/wmtheo/wsp118.htm
英国一家研究机构在2002年5月份发表的调查资料表明,英国很多大型公司在企业网站的建设和维护方面尽管花费了数以百万英镑计的资金,但真正有用的网站却寥寥无几,所投入的资金几乎等于浪费。其实这种状况在中国也很普遍,毫不夸张的说,95%以上的企业网站通常都没有发挥多大作用。于是我们常常可以看到一些
为企业网站“诊断”的文章罗列企业的“罪状”,比如网页设计简陋、长期没有更新、网站缺乏有效的推广等等,实际情况显然并不仅仅限于这些表面问题。
如果进行深入分析,不难发现,很多网站在一些看似不起眼的小问题上往往暴露出其不专业的缺点,这些问题看起来可能并不严重,甚至微不足道,但实践经验表明,在网站的总体功能差不多的情况下,细节问题往往是决定一个网站是否真正有效的关键因素。
小事情,大问题
网站上一个小小的错误,可能造成严重的经济损失,甚至引起不必要的法律纠纷,不要以为这是耸人听闻,这种事情已经出现在一些知名的企业中。据报道,2001年12月份,在圣诞节之前,戴尔电脑公司在自己的网站上将产品的价格误登,一款正常售价为229美元的音箱被标注为24.95美元,并且改信息在网站上刊登了将近一个星期,由于获得大量订货,订单数一度超过库存数量而被迫取消了部分订单。戴尔公司不得不按照错误的价格为部分顾客发货,而被取消订单者也获得了可用于购买软件及外围设备的10%的折扣卷。
如果说像戴尔公司这样因为网站上某个地方文字录入的错误而引起严重后果只是偶然现象的话,那么很多“日常小事”实际上都在严重影响着网站的最终效果。这种“小事”很多,我们不妨在此看一下在很多企业中都必不可少的信息——“联系方式”中所存在的误区。
(1)“联系方式”不应上演空城计
常用的联系方式包括地址、电话、电子邮件等,你也许会问,这么简单的问题,公布在网站上不就行了吗?没错,就这么简单,但是就有不少企业以为简单,反而没有给予足够的重视,结果造成很多问题。我们经常可以看到一些网站上的“联系我们”菜单,点击之后发现是一个形式如“mailto:webmaster@****.com” 的电子邮件链接,想查找公司地址和服务电话?没有,大概是希望用户发邮件去询问吧?这种情况如果出现在个人
主页中并不奇怪,但作为一个正规企业,用户会怎样联想呢?该企业是不是没有正规的办公场所或者电话因为欠费等原因已经被终止使用?或者根本就是一个非法的网站,因而不敢公布自己的地址和电话?就是这么一个简单的问题,怎么能让用户产生信任呢?即使不去想这么多,实践经验表明,发给webmaster的信件通常得不到及时回复,很多公司甚至根本不回复用户的邮件,由此可以想象,企业网站仅仅公布这样的联系方式能有多大意义。
(2)在线表单有缺陷
我们对此做进一步的分析,可以发现一些企业网站上尽管公布了多种联系方式,但其中仍然存在不少问题,以在线联系方式来说,根据笔者多年来对于大量企业网站的分析观察,通常有两种主要表现形式:一种是在网页上刊登企业的联系Email,用户将问题通过电子邮件发送给企业相关人员;另一种是利用浏览器界面让用户填写格式化的在线表单。此外还有一些非主流形式的在线联系方式,如论坛、留言簿、即时信息等,我们在此不做详细分析。从功能上说,在线表单和电子邮这两种常用的在线联系方式都可以实现用户沟通的目的,但从效果上来说却有着很大的区别。
在线表单是用户通过浏览器界面填写自己的联系信息和问题,然后在线提交到网站,由相应的管理人员处理,并且由于表单可以事先设定一些格式化的内容,如联系人姓名、单位、地址、问题类别等,通过在线表单提交的信息比一般的电子邮件更容易分类处理,因此受到一些网站的欢迎。尽管从表面来看,在线表单的作用与Email方式没有太大的差别,同样都可以达到传递信息的目的,但如果处理不当,在线表单可能会存在很大的潜在问题。
首先,由于在线表单限制了用户的个性化要求,有些信息可能无法正常表达;其次,当表单提交成功之后,用户也不了解信息提交到什么地方,多长时间可能得到回复,并且自己无法保留邮件副本,不便于日后查询。因此,有时会对采用在线表单的联系方式会产生不信任感。另外,顾客填写的联系Email地址也有错误的可能,这样将无法通过Email回复用户的问题,甚至会造成用户不满。
那么,是不是说在线表单就不适合于网上联系使用呢?当然也不是,关键在于是否真正站在用户的角度来考虑。其实只要对一些细节问题考虑更周到一些,情况就会有很大不同,比如,在联系信息的表单页面同时给出其他联系方式,如电子邮件地址、电话号码,并且给出一个服务承诺,在提交后多久会回复用户的问题,同时也有必要提醒用户对有关咨询的问题自行用其他方式保留副本。如果增加了这些细节处理,相信对于用户来说会感到自己受到高度重视,可以大大增加对企业的信任感,也会有更多信息愿意和企业交流,因而也会在一定程度上增进客户关系。
如果用户采用Email方式与企业联系,企业负责人员的回复过程可能会稍微麻烦一些,因为问题没有经过事先分类,个性的内容要多一些,有时甚至不容易判断应该转交给那个部分的人员来处理,但对于用户来说会产生一定程度的安全感,因为他“知道”自己的电子邮件发给了谁,也可以由发出邮件的备份查询自己的联系记录,因而通过Email方式联系被广泛采用。但,即使企业在网站上公布电子邮箱,深入探讨起来,还有不少地方存在问题,有有些企业采用免费邮箱的形式,还有一些网站为追求视觉上的漂亮,将联系信息用图片的形式来表达,这些看似不起眼的问题,同样会影响企业形象和用户的信任。
(3)免费邮箱问题多
利用免费邮箱作为商业应用,不仅影响企业形象,甚至会造成更大损失。我们经常可以看到一些小型企业网站上留下免费邮件地址,也许已经习以为常,甚至在不少企业高级管理人员的名片、广告、企业宣传材料、等场合也出现免费邮箱。从功能上说,无论免费邮箱,还是企业的专用邮箱都能起到信息传递的作用,但免费邮箱存在很多缺陷,即使不考虑技术方面的因素和服务商的种种限制,即使在正常使用的情况下有时也会造成严重后果,如一个比较隐形的问题,还没有引起足够的重视,那就是免费邮箱的保密性问题。免费邮箱服务商通常会有很多用户,同一个域名下的用户名比较接近的很多,如editor@163.net与editor@163.com等,或者editor@163.net与editor@263.net之间都很容易混淆,稍不留意,如果写错了收信人,就有可能造成泄密。如果使用企业自己的邮箱,这种事情发生的可能性就会大为降低。
(4)图片格式会误事
如果将联系方式等信息用图片形式来处理会怎样呢?我们知道,电子邮件地址可以设置一个“mailto:”的链接,用户点击链接就可以直接弹出系统默认的电子邮件发送程序,为联系提供了方便,即使不是马上发送邮件,采用文本形式的Email地址也可以很方便地拷贝到自己的通讯录或者记事本上,在需要时调出。如果将电子邮件地址制作为图片,用户将无法直接点击或者拷贝邮件地址,为了向公司发送电子邮件,不得不手工将邮件地址一个字符一个字符地重新输入一次,真是人为地制造麻烦!说不定用户早已不耐烦走掉了,如果因此失去
一个重要客户,岂不是很可惜?更有甚者,有些网站为追求华丽的效果,只有当鼠标移动到“联系方式”图标时才能显示联系信息,一旦移开鼠标,所有的信息都消失了!
(5)及时回复顾客更重要
仅仅有正确的联系方式也还远远不够,除了在网站设计和应用中应该重视联系信息的完整和有效之外,及时用户/潜在用户的Email咨询也非常重要,即使在网站上留下了详细的联系方式,如果不能在顾客期望的时间内回复或者根本不给予回复,结果可能对公司造成更大的负面影响。
国际著名调查公司Jupiter Media Metrix的研究表明,最近三年来,顾客对Email咨询期望的回复时间在不断缩短,从24小时减少到12小时,最近,大多数顾客希望在6个小时内获得关于顾客服务的询问,甚至为数不少的顾客在寻求获得即时满意的服务。但是目前可以做到这一点的企业不多,并且主要集中在网上零售、金融服务等领域,传统企业网站几乎没有一家可以在顾客期望的时间内给予回复,整体平均只有38%的被调查的企业可以在6小时内回复,33%的公司会在几天甚至更长的时间后回复用户的电子邮件,有些甚至根本不给予回复。表现较好的网上零售企业中有一半以上的网上零售商可以满足用户的期望,相形之下,由于用户应用互联网的范围越来越广泛,对于传统企业网站的服务自然很难感到满意。
像联系方式这么简单的问题很多企业都在犯不同程度的错误,其中包括不少大型企业和知名企业,而与此有同等重要的小细节问题还有很多,如网站信息的可靠性、网页标题的规范性、产品/服务介绍的完整性、回复顾客咨询的及时性等等,每一处细节问题处理不当,都会在一定程度上影响到企业网站的最终效果。
来源:http://www.marketingman.net/wmtheo/wsp118.htm
extends可以理解为全盘继承了父类的功能
implements可以理解为为这个类附加一些额外的功能
举个例子,Animal是一个父类,cat,dog,bird,insect都extends了Animal,
但是cat,dog,bird还可以implements比如run,shout这些interface,bird,insect可以implements比如fly这些interface
interface是一个接口,类似于C++中的纯虚函数。
举个简单的例子,有一类东西,都具有同样的行为,而这个共有的行为实现方式不一样。
如:笔这类东西,都有共同的行为“写”,铅笔、毛笔、圆珠笔、钢笔都有“写”的功能,但实现起来不一样。那么我们就可以抽象出一个接口“笔”
interface 笔{
void 写();
}
implement的意思是指在铅笔、毛笔、圆珠笔要有”写“的这个功能,就需要实现接口”笔“的”写“功能。而这个关键字implement就是实现的意思,如:
class 铅笔 implement 笔{
void 写(){
用铅芯画
}
}
class 钢笔 implement 笔{
void 写(){
用墨水画
}
}
而你提到的extends是指一个继承关系,子类继承父类的功能。举个简单的例子:父类”灯“具有”发光“的功能,而子类"台灯",只需要extends父类”灯“就拥有了发光的共功能。
参考:
http://bruce-ko.javaeye.com/blog/420254
implements可以理解为为这个类附加一些额外的功能
举个例子,Animal是一个父类,cat,dog,bird,insect都extends了Animal,
但是cat,dog,bird还可以implements比如run,shout这些interface,bird,insect可以implements比如fly这些interface
interface是一个接口,类似于C++中的纯虚函数。
举个简单的例子,有一类东西,都具有同样的行为,而这个共有的行为实现方式不一样。
如:笔这类东西,都有共同的行为“写”,铅笔、毛笔、圆珠笔、钢笔都有“写”的功能,但实现起来不一样。那么我们就可以抽象出一个接口“笔”
interface 笔{
void 写();
}
implement的意思是指在铅笔、毛笔、圆珠笔要有”写“的这个功能,就需要实现接口”笔“的”写“功能。而这个关键字implement就是实现的意思,如:
class 铅笔 implement 笔{
void 写(){
用铅芯画
}
}
class 钢笔 implement 笔{
void 写(){
用墨水画
}
}
而你提到的extends是指一个继承关系,子类继承父类的功能。举个简单的例子:父类”灯“具有”发光“的功能,而子类"台灯",只需要extends父类”灯“就拥有了发光的共功能。
参考:
http://bruce-ko.javaeye.com/blog/420254
cannot restore segment prot after reloc,原来这是SELinux搞的鬼,解决办法有两个
法一:
1. 使用chcon 命令
示例:
chcon -t texrel_shlib_t /usr/local/rsi/idl_6.1/bin/bin.linux.x86/*.so
修正为:
chcon -t textrel_shlib_t /usr/local/rsi/idl_6.1/bin/bin.linux.x86/*.so
如开通VSFTP:setsebool -P ftpd_disable_trans=0
法二:
2. 禁止掉SELinux
更改/etc/sysconfig/selinux 文件的内容为 SELINUX=disabled
法一:
1. 使用chcon 命令
示例:
chcon -t texrel_shlib_t /usr/local/rsi/idl_6.1/bin/bin.linux.x86/*.so
修正为:
chcon -t textrel_shlib_t /usr/local/rsi/idl_6.1/bin/bin.linux.x86/*.so
如开通VSFTP:setsebool -P ftpd_disable_trans=0
法二:
2. 禁止掉SELinux
更改/etc/sysconfig/selinux 文件的内容为 SELINUX=disabled
一、Linux下清空DNS缓存
Linux下DNS缓存实现通常有两种方式:一种是用DNS缓存程序NSCD(name service cache daemon)负责管理DNS缓存。另一种实现DNS缓存则是用Bind来架设Caching Name Server来实现。
如果是清除NSCD上的Cache,可重新启动NSCD服务来达成清除DNS Cache的效果。用这个命令:
# service nscd restart
或是
# /etc/init.d/nscd restart
如果是清除BIND服务器上的CACHE,用这个命令:
# rndc flush
如果你的DNS服务器是用dnsmasq实现的,用下面这个命令
$ sudo /etc/init.d/dnsmasq restart
注:DNSmasq是一个轻巧的,容易使用的DNS服务工具,它可以应用在内部网和Internet连接的时候的IP地址NAT转换,也可以用做小型网络的DNS服务。
几个用dnsmasq建立dns缓存服务器的文章,发给大家参考下。
用dnsmasq建立dns缓存服务器
用dnsmasq做dns代理缓存服务器
通过dnsmasq来提高ADSL上网速度
二、其它操作系统下清空DNS缓存的方法
1、微软windows下如何清空dns:
你可以用以下命令来清空dns 缓存内容。
ipconfig /flushdns
你也可以用以下命令来查看dns缓存内容。
ipconfig/displaydns
windows下的DNS Cache 是由DNS Client后台进程控制的,你可以在控制面板 ->服务中将其关闭,这样windows就不会进行DNS缓存,每次都将直接查询DNS Server 。
2、Mac OSX下如何清空DNS缓存:
在Mac OSX中,你可以用以下命令来清空DNS缓存内容:
bash-2.05a$lookupd-flushcache
三、其它一些DNS Cache小技巧
Q: 如何查看BIND DNS Server的Cache :
A: 在 bind 9中,可以使用rndc -dumpdb命令来查看DNS Cache,当然你的rndc要先配置好。这个命令会在/var/named(这个目录是在 named.conf 文件中指定的)目录中生成named_dump.db文件。
在bind8下,可以试试用kill -INT named_pid。
Q: DNS Cache的时间如何设置:
A: 在bind9 中,使用TTL参数来设置DNS默认的缓存时间,但要记住这个是你解析的域名在别人的DNS中的缓存时间。
Q: 在客户端如何清空DNS Cache:
A: 在Unix下,DNS客户端只是几个例程,负责转发和接受查询的功能,并不缓存。
Q: 在DNS服务器端如何清空DNS Cache:
A: 最简单的方法就是重新启动 named 进程;当然也有不用重启的方法: rndc flush
四、参考文章
How To Flush Linux/UNIX DNS Cache
清除DNS缓存
Google
来源:http://www.mike.org.cn/articles/how-to-clear-dns-cache/
Linux下DNS缓存实现通常有两种方式:一种是用DNS缓存程序NSCD(name service cache daemon)负责管理DNS缓存。另一种实现DNS缓存则是用Bind来架设Caching Name Server来实现。
如果是清除NSCD上的Cache,可重新启动NSCD服务来达成清除DNS Cache的效果。用这个命令:
# service nscd restart
或是
# /etc/init.d/nscd restart
如果是清除BIND服务器上的CACHE,用这个命令:
# rndc flush
如果你的DNS服务器是用dnsmasq实现的,用下面这个命令
$ sudo /etc/init.d/dnsmasq restart
注:DNSmasq是一个轻巧的,容易使用的DNS服务工具,它可以应用在内部网和Internet连接的时候的IP地址NAT转换,也可以用做小型网络的DNS服务。
几个用dnsmasq建立dns缓存服务器的文章,发给大家参考下。
用dnsmasq建立dns缓存服务器
用dnsmasq做dns代理缓存服务器
通过dnsmasq来提高ADSL上网速度
二、其它操作系统下清空DNS缓存的方法
1、微软windows下如何清空dns:
你可以用以下命令来清空dns 缓存内容。
ipconfig /flushdns
你也可以用以下命令来查看dns缓存内容。
ipconfig/displaydns
windows下的DNS Cache 是由DNS Client后台进程控制的,你可以在控制面板 ->服务中将其关闭,这样windows就不会进行DNS缓存,每次都将直接查询DNS Server 。
2、Mac OSX下如何清空DNS缓存:
在Mac OSX中,你可以用以下命令来清空DNS缓存内容:
bash-2.05a$lookupd-flushcache
三、其它一些DNS Cache小技巧
Q: 如何查看BIND DNS Server的Cache :
A: 在 bind 9中,可以使用rndc -dumpdb命令来查看DNS Cache,当然你的rndc要先配置好。这个命令会在/var/named(这个目录是在 named.conf 文件中指定的)目录中生成named_dump.db文件。
在bind8下,可以试试用kill -INT named_pid。
Q: DNS Cache的时间如何设置:
A: 在bind9 中,使用TTL参数来设置DNS默认的缓存时间,但要记住这个是你解析的域名在别人的DNS中的缓存时间。
Q: 在客户端如何清空DNS Cache:
A: 在Unix下,DNS客户端只是几个例程,负责转发和接受查询的功能,并不缓存。
Q: 在DNS服务器端如何清空DNS Cache:
A: 最简单的方法就是重新启动 named 进程;当然也有不用重启的方法: rndc flush
四、参考文章
How To Flush Linux/UNIX DNS Cache
清除DNS缓存
来源:http://www.mike.org.cn/articles/how-to-clear-dns-cache/
共享库必须放在plugin目录下,目录是由plugin_dir系统变量中定义的,默认这个目录是由配置变量中的pkglibdir定义的,可以在服务器启动时候改变,比如可以在my.cnf中设置:
[mysqld]
plugin_dir=/path/to/plugin/directory
plugin目录位置是mysql安装目录下的lib/plugin ,需要我们手动创建 。
先看看这个吧,http://dev.mysql.com/doc/refman/5.1/en/adding-udf.html
重新编译mysql吧,支持动态加载,编译的时候,添加这个选项:with-mysqld-ldflags=-rdynamic
阅读全文
[mysqld]
plugin_dir=/path/to/plugin/directory
plugin目录位置是mysql安装目录下的lib/plugin ,需要我们手动创建 。
先看看这个吧,http://dev.mysql.com/doc/refman/5.1/en/adding-udf.html
重新编译mysql吧,支持动态加载,编译的时候,添加这个选项:with-mysqld-ldflags=-rdynamic
阅读全文
工作需要,通过长连接的方式测试程序的性能,于是做了以下的测试。这里的代码是一个单元测试,给目标post指定数据。
其中 在headers中添加 "Connection":"Keep-Alive" 即可使服务器不主动断开此连接。当然也要注意,每次请求后,调用read()方法(否则不能进行下一次发送,httplib中第2次发送数据时,必须保证上一次数据被读取,否则会抛出异常)。
来源:http://blog.csdn.net/ustclu/archive/2008/11/18/3326624.aspx
其中 在headers中添加 "Connection":"Keep-Alive" 即可使服务器不主动断开此连接。当然也要注意,每次请求后,调用read()方法(否则不能进行下一次发送,httplib中第2次发送数据时,必须保证上一次数据被读取,否则会抛出异常)。
import urllib,unittest
class PressureTest(unittest.TestCase):
times=100
data='''
<?xml version="1.0" encoding="UTF-8"?>
<message >
</message>
'''
def testSend(self):
import httplib
headers = {"Content-type": "application/x-www-form-urlencoded","Accept": "text/plain","Connection":"Keep-Alive"}
conn = httplib.HTTPConnection("192.168.54.138",6040)
for i in range(self.times):
conn.request("POST", "/index.html", self.data, headers)
response = conn.getresponse()
response.read()
conn.close()
if __name__ == "__main__":
unittest.main()
class PressureTest(unittest.TestCase):
times=100
data='''
<?xml version="1.0" encoding="UTF-8"?>
<message >
</message>
'''
def testSend(self):
import httplib
headers = {"Content-type": "application/x-www-form-urlencoded","Accept": "text/plain","Connection":"Keep-Alive"}
conn = httplib.HTTPConnection("192.168.54.138",6040)
for i in range(self.times):
conn.request("POST", "/index.html", self.data, headers)
response = conn.getresponse()
response.read()
conn.close()
if __name__ == "__main__":
unittest.main()
来源:http://blog.csdn.net/ustclu/archive/2008/11/18/3326624.aspx
http://www.oracle.com/technology/global/cn/pub/articles/vasiliev-django.html
附上两篇文章:
在 Centos 5.2 中搭建 nginx python django 等等服务
1
http://www.dbasky.net/archives/2009/08/nginx-python-django-memcached-mysql-fastcgi.html
设置支持 django 的 nginx 配置文件
1
http://www.okpython.com/bbs/thread-2608-1-5.html
http://tech.foolpig.com/2010/08/30/python-django-nginx/
附上两篇文章:
在 Centos 5.2 中搭建 nginx python django 等等服务
1
http://www.dbasky.net/archives/2009/08/nginx-python-django-memcached-mysql-fastcgi.html
设置支持 django 的 nginx 配置文件
1
http://www.okpython.com/bbs/thread-2608-1-5.html
http://tech.foolpig.com/2010/08/30/python-django-nginx/
【SecureCRT 应用 sz/rz 上传大文件】
sc -bey
rz -bey
-b, --binary binary transfer
-e, --escape Escape control characters (Z)
-y, --overwrite overwrite existing files
-b binary 用binary的行动 上传下载,不表明 字符为ascii
-e 逼迫 escape 全部 独霸字符,比如 Ctrl+x,DEL等
上传大文件不出现错误用如下命令:
VBS自动脚本编写Demo:
sc -bey
rz -bey
-b, --binary binary transfer
-e, --escape Escape control characters (Z)
-y, --overwrite overwrite existing files
-b binary 用binary的行动 上传下载,不表明 字符为ascii
-e 逼迫 escape 全部 独霸字符,比如 Ctrl+x,DEL等
上传大文件不出现错误用如下命令:
VBS自动脚本编写Demo:
IFNULL()返回一个数字或字符串值,取决于它被使用的上下文环境:
1、如果为空返回0
select ifnull(null,0)
2、如果为空返回0,否则返回1
select if(isnull(col),0,1) as col.
MYSQL 中的IFNULL函数
IFNULL(expr1,expr2)
如果expr1不是NULL,IFNULL()返回expr1,否则它返回expr2。IFNULL()返回一个数字或字符串值,取决于它被使用的上下文环境。
mysql> select IFNULL(1,0);
-> 1
mysql> select IFNULL(0,10);
-> 0
mysql> select IFNULL(1/0,10);
-> 10
mysql> select IFNULL(1/0,'yes');
-> 'yes'
IF(expr1,expr2,expr3)
如果expr1是TRUE(expr1<>0且expr1<>NULL),那么IF()返回expr2,否则它返回expr3。IF()返回一个数字或字符串值,取决于它被使用的上下文。
mysql> select IF(1>2,2,3);
-> 3
mysql> select IF(1<2,'yes','no');
-> 'yes'
mysql> select IF(strcmp('test','test1'),'yes','no');
-> 'no'
expr1作为整数值被计算,它意味着如果你正在测试浮点或字符串值,你应该使用一个比较操作来做。
mysql> select IF(0.1,1,0);
-> 0
mysql> select IF(0.1<>0,1,0);
-> 1
在上面的第一种情况中,IF(0.1)返回0,因为0.1被变换到整数值, 导致测试IF(0)。这可能不是你期望的。在第二种情况中,比较测试原来的浮点值看它是否是非零,比较的结果被用作一个整数。
CASE value WHEN [compare-value] THEN result [WHEN [compare-value] THEN result ...] [ELSE result] END
CASE WHEN [condition] THEN result [WHEN [condition] THEN result ...] [ELSE result] END
第一个版本返回result,其中value=compare-value。第二个版本中如果第一个条件为真,返回result。如果没有匹配的result值,那么结果在ELSE后的result被返回。如果没有ELSE部分,那么NULL被返回。
mysql> SELECT CASE 1 WHEN 1 THEN "one" WHEN 2 THEN "two" ELSE "more" END;
-> "one"
mysql> SELECT CASE WHEN 1>0 THEN "true" ELSE "false" END;
-> "true"
mysql> SELECT CASE BINARY "B" when "a" then 1 when "b" then 2 END;
-> NULL
来源:http://blog.163.com/love-love-l/blog/static/21078304201002034639214/
cat fushuQQCheck.txt |awk '{print "select "$1 ",(select sum(FScore) from Tbl_ScoreDetail_" substr($1,length($1)-1,2) " where FDesId='\''"$1 "'\'' and FSType=1)-IFNULL((select sum(FScore) from Tbl_ScoreDetail_" substr($1,length($1)-1,2) " where FDesId='\''" $1 "'\'' and FSType=0),0); "}'
1、如果为空返回0
select ifnull(null,0)
2、如果为空返回0,否则返回1
select if(isnull(col),0,1) as col.
MYSQL 中的IFNULL函数
IFNULL(expr1,expr2)
如果expr1不是NULL,IFNULL()返回expr1,否则它返回expr2。IFNULL()返回一个数字或字符串值,取决于它被使用的上下文环境。
mysql> select IFNULL(1,0);
-> 1
mysql> select IFNULL(0,10);
-> 0
mysql> select IFNULL(1/0,10);
-> 10
mysql> select IFNULL(1/0,'yes');
-> 'yes'
IF(expr1,expr2,expr3)
如果expr1是TRUE(expr1<>0且expr1<>NULL),那么IF()返回expr2,否则它返回expr3。IF()返回一个数字或字符串值,取决于它被使用的上下文。
mysql> select IF(1>2,2,3);
-> 3
mysql> select IF(1<2,'yes','no');
-> 'yes'
mysql> select IF(strcmp('test','test1'),'yes','no');
-> 'no'
expr1作为整数值被计算,它意味着如果你正在测试浮点或字符串值,你应该使用一个比较操作来做。
mysql> select IF(0.1,1,0);
-> 0
mysql> select IF(0.1<>0,1,0);
-> 1
在上面的第一种情况中,IF(0.1)返回0,因为0.1被变换到整数值, 导致测试IF(0)。这可能不是你期望的。在第二种情况中,比较测试原来的浮点值看它是否是非零,比较的结果被用作一个整数。
CASE value WHEN [compare-value] THEN result [WHEN [compare-value] THEN result ...] [ELSE result] END
CASE WHEN [condition] THEN result [WHEN [condition] THEN result ...] [ELSE result] END
第一个版本返回result,其中value=compare-value。第二个版本中如果第一个条件为真,返回result。如果没有匹配的result值,那么结果在ELSE后的result被返回。如果没有ELSE部分,那么NULL被返回。
mysql> SELECT CASE 1 WHEN 1 THEN "one" WHEN 2 THEN "two" ELSE "more" END;
-> "one"
mysql> SELECT CASE WHEN 1>0 THEN "true" ELSE "false" END;
-> "true"
mysql> SELECT CASE BINARY "B" when "a" then 1 when "b" then 2 END;
-> NULL
来源:http://blog.163.com/love-love-l/blog/static/21078304201002034639214/
谁需要HTML5?【角色定位】
Google最需要!Apple的Jobs也需要。但这两个肯定各怀鬼胎。微软无所谓了,反正他还有Silverlight。
Mozilla/Firefox非盈利组织,目标可能会高尚些,是w3c标准就要支持。Opera那点浏览器市场占有率估计还没敢有太多想法。
Google的云计算帝国就差一个支持RIA(Rich Internet Applications)富互联网应用的客户端了,试想 HTML5得到普及,更多的应用转向BS模式时,微软帝国的桌面软件生态环境必定受到很大威胁,垂涎多年的Google一定是最大受益者。当在一台操作系 统免费的电脑上使用和MS Word差不多功能的免费Google Doc时,你还会掏钱买微软的Word吗?当你所有的办公应用都只需要打开浏览器窗口时,你还会花钱买操作系统吗?Google的Chrome OS操作系统界面已经说明了这个意图。
Jobs也需要HTML5,他是打着小算盘,想让浏览器原生支持视频音频,这样iPhone、iPad就不用嵌入Flash,Jobs当然 不能让Flash进iPhone OS,要不然App Store里的游戏谁去买?同时,如果大量的应用都能基于浏览器实现时,用户就不会被 Windows的桌面应用套牢了。漂亮的Mac电脑谁不喜欢。
他们选择HTML5都是为了更大野心,期望HTML5带来整个软件生态环境的改变,同时避开不受自己控制的Flash。
Macromedia和后来的当家Adobe把握住了互联网应用的发展需求,不断的完善的Flash,使之已经超越了浏览器本身的功能。各 大浏览器厂商也看到这种应用的需求,不甘于一个本该浏览器实现的功能,由一个几兆大小的 Plugin实现了,并玩的风生水起。于是不遗余力的推进 HTML5,并且矛头直指Flash。
用户想要HTML5吗?用户要的不是技术,是应用,是体验。如果你能拿Ajax实现一个开心农场,我想没谁会在乎它是不是Flash做的。
开发者想要HTML5吗?那需要一个成熟的HTML5+CSS3+JS的开发环境,需要各个浏览器提供统一的用户体验,即标准的完全兼容。还需要增加新的学习成本。阅读全文
Google最需要!Apple的Jobs也需要。但这两个肯定各怀鬼胎。微软无所谓了,反正他还有Silverlight。
Mozilla/Firefox非盈利组织,目标可能会高尚些,是w3c标准就要支持。Opera那点浏览器市场占有率估计还没敢有太多想法。
Google的云计算帝国就差一个支持RIA(Rich Internet Applications)富互联网应用的客户端了,试想 HTML5得到普及,更多的应用转向BS模式时,微软帝国的桌面软件生态环境必定受到很大威胁,垂涎多年的Google一定是最大受益者。当在一台操作系 统免费的电脑上使用和MS Word差不多功能的免费Google Doc时,你还会掏钱买微软的Word吗?当你所有的办公应用都只需要打开浏览器窗口时,你还会花钱买操作系统吗?Google的Chrome OS操作系统界面已经说明了这个意图。
Jobs也需要HTML5,他是打着小算盘,想让浏览器原生支持视频音频,这样iPhone、iPad就不用嵌入Flash,Jobs当然 不能让Flash进iPhone OS,要不然App Store里的游戏谁去买?同时,如果大量的应用都能基于浏览器实现时,用户就不会被 Windows的桌面应用套牢了。漂亮的Mac电脑谁不喜欢。
他们选择HTML5都是为了更大野心,期望HTML5带来整个软件生态环境的改变,同时避开不受自己控制的Flash。
Macromedia和后来的当家Adobe把握住了互联网应用的发展需求,不断的完善的Flash,使之已经超越了浏览器本身的功能。各 大浏览器厂商也看到这种应用的需求,不甘于一个本该浏览器实现的功能,由一个几兆大小的 Plugin实现了,并玩的风生水起。于是不遗余力的推进 HTML5,并且矛头直指Flash。
用户想要HTML5吗?用户要的不是技术,是应用,是体验。如果你能拿Ajax实现一个开心农场,我想没谁会在乎它是不是Flash做的。
开发者想要HTML5吗?那需要一个成熟的HTML5+CSS3+JS的开发环境,需要各个浏览器提供统一的用户体验,即标准的完全兼容。还需要增加新的学习成本。阅读全文
背景:用sed进行删除一行时用@或#均不行,最后还得用斜杠,
sed -i '@^worker_cpu_affinity.*@d' nginx.conf
sed: -e expression #1, char 1: unknown command: `@'
用@符号,即使没有提示啥错误,但实践发现其并没有被替换:
sed -s "s@jenkins@@" /etc/hosts
模糊匹配删一行:
sed -i "/.*bbs.mysql.*/d" /etc/hosts
用斜杠就对了,以行打头进行匹配:
比如删除Nginx里的nginx.conf里的 include vhosts/mini.conf,注意:如果有多个可能会删除多行;
阅读全文
sed -i '@^worker_cpu_affinity.*@d' nginx.conf
sed: -e expression #1, char 1: unknown command: `@'
用@符号,即使没有提示啥错误,但实践发现其并没有被替换:
sed -s "s@jenkins@@" /etc/hosts
模糊匹配删一行:
sed -i "/.*bbs.mysql.*/d" /etc/hosts
用斜杠就对了,以行打头进行匹配:
比如删除Nginx里的nginx.conf里的 include vhosts/mini.conf,注意:如果有多个可能会删除多行;
阅读全文
光影,PS,ISEE
导读:原文作者Richard Bejtlich写了一篇《Steve Jobs Understands Team Building》,现将译文《史蒂夫·乔布斯很懂团队建设》转载,以下是文章内容:
我偶然读到了由Rama Dev Jager和Rafael Ortiz在1998年写的《In the Company of Giants》这本书里的一段节选。他们采访苹果公司CEO 史蒂夫·乔布斯,下面的就是他关于团队建设的一些谈话:
问:你一直在向苹果公司、NeXT公司和Pixar公司输送人才,你认为他们是什么样的人才?
史蒂夫·乔布斯: 我想我一直在寻找真正的聪明的人,与他们一起共事。我们所从事的这些重要工作中没有一项是可以由一两个人或三四个人完成的……为了把这些一两个人不能完成的任务做好,你必须找到杰出的人。
这关键的总结发现是,对于生活中的大多数事情,一般的和最好的相比,一个最好的能抵两个一般的……
但是,在我所感兴趣的这个领域——最初是硬件设计——我发现一个最优秀的人完成工作的能力能抵50到100个一般水平的人。鉴于此,我们一直在追求精华之中的精华。
这就是我们所做的事情。我们建设一个团队,保证里面的成员都是A+水平。一个都是A+水平的小团队能抵上100个都是B或C水平的巨型团队。
问: 你的所有才能归功于善于发现人才吗?
史蒂夫·乔布斯: 并不只是发现人才。在招到人才后,你要建设一个团队氛围,让人们都感到他们周围都围绕着跟他一样有才能的人,而且工作是第一的。就要他们知道,他们的工作成绩代表了一切,这是一个深刻的明白的认识。——这就是全部。
招募人才并不是你一个人能干的了的,需要更多的帮助,所以我发现大家一起推荐、培养出唯才是举的文化氛围才是最好的方法。
问: 然而,对于一个创业公司,管理者并不会有那么多时间花在招募人才的事情上。
史蒂夫·乔布斯: 我完全的不赞同。我认为那是最重要的工作……在一个创业公司里,最初的十个人决定了这个公司的成败与否。
史蒂夫是对的。这就是我上周Tweeted这个的原因:
真正的IT/安全专业天才应该为创造不同而工作,而不是为了降低成本、“调整业务”、或解决其它困境工作。
我强调这一点:有志向的人希望创造出不同。他们想要给生活创造更好的东西。(我喜欢这句格言 — time to junk the present one, if you catch my drift, and go back!)
译文链接:http://www.aqee.net/2011/01/18/steve-jobs-understands-team-building/
我偶然读到了由Rama Dev Jager和Rafael Ortiz在1998年写的《In the Company of Giants》这本书里的一段节选。他们采访苹果公司CEO 史蒂夫·乔布斯,下面的就是他关于团队建设的一些谈话:
问:你一直在向苹果公司、NeXT公司和Pixar公司输送人才,你认为他们是什么样的人才?
史蒂夫·乔布斯: 我想我一直在寻找真正的聪明的人,与他们一起共事。我们所从事的这些重要工作中没有一项是可以由一两个人或三四个人完成的……为了把这些一两个人不能完成的任务做好,你必须找到杰出的人。
这关键的总结发现是,对于生活中的大多数事情,一般的和最好的相比,一个最好的能抵两个一般的……
但是,在我所感兴趣的这个领域——最初是硬件设计——我发现一个最优秀的人完成工作的能力能抵50到100个一般水平的人。鉴于此,我们一直在追求精华之中的精华。
这就是我们所做的事情。我们建设一个团队,保证里面的成员都是A+水平。一个都是A+水平的小团队能抵上100个都是B或C水平的巨型团队。
问: 你的所有才能归功于善于发现人才吗?
史蒂夫·乔布斯: 并不只是发现人才。在招到人才后,你要建设一个团队氛围,让人们都感到他们周围都围绕着跟他一样有才能的人,而且工作是第一的。就要他们知道,他们的工作成绩代表了一切,这是一个深刻的明白的认识。——这就是全部。
招募人才并不是你一个人能干的了的,需要更多的帮助,所以我发现大家一起推荐、培养出唯才是举的文化氛围才是最好的方法。
问: 然而,对于一个创业公司,管理者并不会有那么多时间花在招募人才的事情上。
史蒂夫·乔布斯: 我完全的不赞同。我认为那是最重要的工作……在一个创业公司里,最初的十个人决定了这个公司的成败与否。
史蒂夫是对的。这就是我上周Tweeted这个的原因:
真正的IT/安全专业天才应该为创造不同而工作,而不是为了降低成本、“调整业务”、或解决其它困境工作。
我强调这一点:有志向的人希望创造出不同。他们想要给生活创造更好的东西。(我喜欢这句格言 — time to junk the present one, if you catch my drift, and go back!)
译文链接:http://www.aqee.net/2011/01/18/steve-jobs-understands-team-building/