Linux 下串口终端,默认是字符界面minicom.这个软件优点是REHL自带,缺点也不少。一是在在LINUX桌面版下,对于嵌入式初学者,容易与字符终端搞混,。二是界面分隔不明显,如解释给开发板传送文件,不太容易看出是怎么进行。而在WINDOWS下,用超级终端就分隔的很明显,学生一操作就明白,三是与开发板有一些不太兼容,比如在某一个开发板上,发现光标经常丢失,这样造成使用上极为不方便,因此后我也就找到一款图形界面串口终端,gtkterm来代替minicom
gtkterm的使用说明
下载
http://www.jls-info.com/julien/linux/
最新版本是 http://www.jls-info.com/julien/linux/gtkterm-0.99.5.tar.gz
在RHEL5上它需要 libiconv库和libvte 0.10.以上库
这个是典型的configure & make & make install项目
1.安装libiconv
2.安装VTE,否则报相应的库找不到,RHEL自带光盘带了安装文件,但是默认开发库找不到。
checking for pkg-config... /usr/bin/pkg-config
checking pkg-config is at least version 0.10.4... yes
checking for TERMINAL_WIDGET... Package vte was not found in the pkg-config search path.
Perhaps you should add the directory containing `vte.pc'
to the PKG_CONFIG_PATH environment variable
No package 'vte' found
configure: error: Package requirements (vte >= 0.10.4) were not met.
Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed sofchecking for pkg-config... /usr/bin/pkg-config
checking pkg-config is at least version 0.10.4... yes
checking for TERMINAL_WIDGET... Package vte was not found in the pkg-config search path.
Perhaps you should add the directory containing `vte.pc'
to the PKG_CONFIG_PATH environment variable
No package 'vte' found
configure: error: Package requirements (vte >= 0.10.4) were not met.
Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.
Alternatively you may set the TERMINAL_WIDGET_CFLAGS and TERMINAL_WIDGET_LIBS environment variables
to avoid the need to call pkg-config. See the pkg-config man page for
more details.
tware in a non-standard prefix.
Alternatively you may set the TERMINAL_WIDGET_CFLAGS and TERMINAL_WIDGET_LIBS environment variables
to avoid the need to call pkg-config. See the pkg-config man page for
more details.
安装库文件,
[root@rhel5 Server]# rpm -ivh vte-0.14.0-2.el5.i386.rpm
warning: vte-0.14.0-2.el5.i386.rpm: Header V3 DSA signature: NOKEY, key ID 37017186
Preparing... ########################################### [100%]
package vte-0.14.0-2.el5 is already installed
[root@rhel5 Server]# rpm -ivh vte-devel-0.14.0-2.el5.i386.rpm
warning: vte-devel-0.14.0-2.el5.i386.rpm: Header V3 DSA signature: NOKEY, key ID 37017186
Preparing... ########################################### [100%]
1:vte-devel ########################################### [100%]
[root@rhel5 Server]#
3.生成make ,注意要把链接iconv库的语句加入,否则链接时找不到。
LDFLAGS=-liconv ./configure #生成Makefile,如果提示缺省的C找不到,可以先执行一次./configure后再执行上述语句
4.编译,安装 make & make install
安装后执行 gtkterm. 进行图形界面配置即可
来源:http://blog.chinaunix.net/u3/105675/showart_2108697.html
gtkterm的使用说明
下载
http://www.jls-info.com/julien/linux/
最新版本是 http://www.jls-info.com/julien/linux/gtkterm-0.99.5.tar.gz
在RHEL5上它需要 libiconv库和libvte 0.10.以上库
这个是典型的configure & make & make install项目
1.安装libiconv
2.安装VTE,否则报相应的库找不到,RHEL自带光盘带了安装文件,但是默认开发库找不到。
checking for pkg-config... /usr/bin/pkg-config
checking pkg-config is at least version 0.10.4... yes
checking for TERMINAL_WIDGET... Package vte was not found in the pkg-config search path.
Perhaps you should add the directory containing `vte.pc'
to the PKG_CONFIG_PATH environment variable
No package 'vte' found
configure: error: Package requirements (vte >= 0.10.4) were not met.
Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed sofchecking for pkg-config... /usr/bin/pkg-config
checking pkg-config is at least version 0.10.4... yes
checking for TERMINAL_WIDGET... Package vte was not found in the pkg-config search path.
Perhaps you should add the directory containing `vte.pc'
to the PKG_CONFIG_PATH environment variable
No package 'vte' found
configure: error: Package requirements (vte >= 0.10.4) were not met.
Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.
Alternatively you may set the TERMINAL_WIDGET_CFLAGS and TERMINAL_WIDGET_LIBS environment variables
to avoid the need to call pkg-config. See the pkg-config man page for
more details.
tware in a non-standard prefix.
Alternatively you may set the TERMINAL_WIDGET_CFLAGS and TERMINAL_WIDGET_LIBS environment variables
to avoid the need to call pkg-config. See the pkg-config man page for
more details.
安装库文件,
[root@rhel5 Server]# rpm -ivh vte-0.14.0-2.el5.i386.rpm
warning: vte-0.14.0-2.el5.i386.rpm: Header V3 DSA signature: NOKEY, key ID 37017186
Preparing... ########################################### [100%]
package vte-0.14.0-2.el5 is already installed
[root@rhel5 Server]# rpm -ivh vte-devel-0.14.0-2.el5.i386.rpm
warning: vte-devel-0.14.0-2.el5.i386.rpm: Header V3 DSA signature: NOKEY, key ID 37017186
Preparing... ########################################### [100%]
1:vte-devel ########################################### [100%]
[root@rhel5 Server]#
3.生成make ,注意要把链接iconv库的语句加入,否则链接时找不到。
LDFLAGS=-liconv ./configure #生成Makefile,如果提示缺省的C找不到,可以先执行一次./configure后再执行上述语句
4.编译,安装 make & make install
安装后执行 gtkterm. 进行图形界面配置即可
来源:http://blog.chinaunix.net/u3/105675/showart_2108697.html
先列举几个实事:国内大学课程中,C程序设计已被列为公共基础课;C和C++目前以27.0%的总和位居计算机语言排行榜榜首;各种著名的算法通常都以C语言描述作为标准;开源操作系统 Linux 2.6 内核源代码接近600万行,其中99%以上的代码是用C写的。
C是一种结构化的、面向过程的高级编程语言,C是最能让你理解计算机程序运行原理的高级语言,它最贴近于汇编,跨平台性好,系统级别的程序设计都离不开C语言,比如Linux内核和驱动程序99%以上的代码是C写的!在没有高级语言的日子里,前辈们使用汇编代码操纵机器指令,繁琐的助记符和杂乱的结构给程序的编写和调试带来了极大的麻烦,更重要的是汇编程序是高度依赖于具体CPU的,换一个平台代码就要全部重写一次。人们设想能否以一种直观的、结构化的表现手段来描述头脑中的编程想法,然后由计算机来“翻译”成机器指令?——C语言的发明使这一想法成为了现实,这里不得不提两个人: Ken Thompson 和 Dennis Ritchie (K&R),二人在开发UNIX时发明了C语言 ——从此,人们编程可以不必关心计算机的运行细节,而把重点放到程序的功能和结构的设计上,C语言的出现也第一次真正将结构化编程概念变为现实,结构化带来了模块化,模块化使分工协作成为可能,分工协作则带来了软件的产业化!这正是C经历了30多年仍保持旺盛生命力的原因之一。
C语言贴近于汇编,几乎每句C程序都与若干条相对固定的汇编指令相对应。据统计,优秀的C编译器编译出的程序仅比相应的汇编代码写出的程序平均略大约10%,略慢约10%。C的指针保留了汇编的部分特性,这使得C/C++成为了唯一能够直接操作内存的高级语言,在提供高级语言方便性性的同时最大限度地保留了底层硬件提供的基本功能,在结构性和灵活性之间取得最佳平衡点!因此,C语言应该和某一种平台的汇编结合起来学习,从计算机运行原理和程序设计两个层面充分理解C语言,才能达到最好的学习效果!
现在很多人推崇C++,没错,面向对象是计算机编程继结构化之后最伟大的革命,C++面向对象的概念给我们编程带来了极大的方便,但在选择使用C++之前至少应理解什么是“面向对象”,其次,要明白C++比C的优势在哪里,劣势或不足在哪里。我个人非常不屑“为了多学一门语言、为了追求面向对象时髦而学C++”的想法,很多人仅仅学了C++表面的东西却说自己学会C++了,然而问其什么是多态、什么是重载、虚函数的作用却支吾半天说不上来。不要忘了,面向对象是以面向过程为基础的,更确切的说C++完全包含了C!所以说,一方面学习C++一定要以C为基础,而且是扎实的C编程基本功!以C的基础来学C++会事半功倍!另一方面要根据需要来决定使用结构化(C)还是面向对象(C++),如果C完全能胜任就没必要使用C++,实事证明,C++编译出的程序要比C大一些、慢一些,而且C++的跨平台性不如C好。说到面向对象编程,其实C的结构体就有面向对象的概念的雏形,Linux内核中很多代码都是用结构体(struct)封装的数据结构,有与各结构体相对应的处理函数,结构紧凑,设计十分巧妙,可以说是用C实现的“面向对象”编程。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/rssn_net/archive/2008/09/07/2893935.aspx
http://blog.csdn.net/rssn_net/archive/2008/09/07/2893935.aspx
C是一种结构化的、面向过程的高级编程语言,C是最能让你理解计算机程序运行原理的高级语言,它最贴近于汇编,跨平台性好,系统级别的程序设计都离不开C语言,比如Linux内核和驱动程序99%以上的代码是C写的!在没有高级语言的日子里,前辈们使用汇编代码操纵机器指令,繁琐的助记符和杂乱的结构给程序的编写和调试带来了极大的麻烦,更重要的是汇编程序是高度依赖于具体CPU的,换一个平台代码就要全部重写一次。人们设想能否以一种直观的、结构化的表现手段来描述头脑中的编程想法,然后由计算机来“翻译”成机器指令?——C语言的发明使这一想法成为了现实,这里不得不提两个人: Ken Thompson 和 Dennis Ritchie (K&R),二人在开发UNIX时发明了C语言 ——从此,人们编程可以不必关心计算机的运行细节,而把重点放到程序的功能和结构的设计上,C语言的出现也第一次真正将结构化编程概念变为现实,结构化带来了模块化,模块化使分工协作成为可能,分工协作则带来了软件的产业化!这正是C经历了30多年仍保持旺盛生命力的原因之一。
C语言贴近于汇编,几乎每句C程序都与若干条相对固定的汇编指令相对应。据统计,优秀的C编译器编译出的程序仅比相应的汇编代码写出的程序平均略大约10%,略慢约10%。C的指针保留了汇编的部分特性,这使得C/C++成为了唯一能够直接操作内存的高级语言,在提供高级语言方便性性的同时最大限度地保留了底层硬件提供的基本功能,在结构性和灵活性之间取得最佳平衡点!因此,C语言应该和某一种平台的汇编结合起来学习,从计算机运行原理和程序设计两个层面充分理解C语言,才能达到最好的学习效果!
现在很多人推崇C++,没错,面向对象是计算机编程继结构化之后最伟大的革命,C++面向对象的概念给我们编程带来了极大的方便,但在选择使用C++之前至少应理解什么是“面向对象”,其次,要明白C++比C的优势在哪里,劣势或不足在哪里。我个人非常不屑“为了多学一门语言、为了追求面向对象时髦而学C++”的想法,很多人仅仅学了C++表面的东西却说自己学会C++了,然而问其什么是多态、什么是重载、虚函数的作用却支吾半天说不上来。不要忘了,面向对象是以面向过程为基础的,更确切的说C++完全包含了C!所以说,一方面学习C++一定要以C为基础,而且是扎实的C编程基本功!以C的基础来学C++会事半功倍!另一方面要根据需要来决定使用结构化(C)还是面向对象(C++),如果C完全能胜任就没必要使用C++,实事证明,C++编译出的程序要比C大一些、慢一些,而且C++的跨平台性不如C好。说到面向对象编程,其实C的结构体就有面向对象的概念的雏形,Linux内核中很多代码都是用结构体(struct)封装的数据结构,有与各结构体相对应的处理函数,结构紧凑,设计十分巧妙,可以说是用C实现的“面向对象”编程。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/rssn_net/archive/2008/09/07/2893935.aspx
http://blog.csdn.net/rssn_net/archive/2008/09/07/2893935.aspx
伪静态已经不是一个新鲜的名词了,尤其是在现今SEO的炒作中。如何实现伪静态这是每个程序员都关心的问题,除非您不搞SEO。大多的伪静态都是以Htaccess(Apache mod_rewrite)来实现的,但是一个规划不太好的网站要用Htaccess实现,需要写一大堆的代码,而还有某种原因我们不得不放弃Htaccess,或是由于服务器不支持,或是个人偏好等等。阅读全文
_call()函数是php类的默认魔法函数,__call() 在一个对象的上下文中,如果调用的方法不能访问,它将被触发,可以用它来做重载,如果一个类的方法不存在,则需要重新加载一次。
运行结果:
Calling object method 'runTest' in object context
以上来自:
http://blog.163.com/lgh_2002/blog/static/4401752620105256371802/
用__call()实现方法重载 :
<?php
class foo {
function __call($name,$arguments) {
print("Did you call me? I'm $name!");
print_r($arguments);
}
} $x = new foo();
$array = array(1,2,2,1984);
$x->doStuff("dfdf");
$x->fancy_stuff($array,"777");
?>
Did you call me? I'm doStuff!Array ( [0] => dfdf ) Did you call me? I'm fancy_stuff!Array ( [0] => Array ( [0] => 1 [1] => 2 [2] => 2 [3] => 1984 ) [1] => 777 )
$arguments 0,1,2,3 分别对应如果没有该函数的三个函数参数。
$name表示缺失的函数名称!
使用 __call 实现“过载”动作
---------- 调试PHP情况 ----------
456
not_exist_fun is called but not exist,U can do it by yourselft.
方法不存在
————————————————————————————————————————————————————————
如果在框架里用它,是这样的,PHP5里有一个反射函数,进行autoload进相关文件,后对该类的Obj进行:Obj->fun();
如果这个fun不存在就调用这个__call,这个call是上层类,其autoload时new的是这个继承的类名,于是有,如下伪代码:
运行结果:
Calling object method 'runTest' in object context
以上来自:
http://blog.163.com/lgh_2002/blog/static/4401752620105256371802/
用__call()实现方法重载 :
<?php
class foo {
function __call($name,$arguments) {
print("Did you call me? I'm $name!");
print_r($arguments);
}
} $x = new foo();
$array = array(1,2,2,1984);
$x->doStuff("dfdf");
$x->fancy_stuff($array,"777");
?>
Did you call me? I'm doStuff!Array ( [0] => dfdf ) Did you call me? I'm fancy_stuff!Array ( [0] => Array ( [0] => 1 [1] => 2 [2] => 2 [3] => 1984 ) [1] => 777 )
$arguments 0,1,2,3 分别对应如果没有该函数的三个函数参数。
$name表示缺失的函数名称!
使用 __call 实现“过载”动作
<?php
class Magic {
function __call($name,$arguments) {
if($name=='foo') {
if(is_int($arguments[0])) $this->foo_for_int($arguments[0]);
if(is_string($arguments[0])) $this->foo_for_string($arguments[0]);
}
} private function foo_for_int($x) {
print("oh an int!");
} private function foo_for_string($x) {
print("oh a string!");
}
} $x = new Magic();
$x->foo(3);
$x->foo("3");
?>
class Magic {
function __call($name,$arguments) {
if($name=='foo') {
if(is_int($arguments[0])) $this->foo_for_int($arguments[0]);
if(is_string($arguments[0])) $this->foo_for_string($arguments[0]);
}
} private function foo_for_int($x) {
print("oh an int!");
} private function foo_for_string($x) {
print("oh a string!");
}
} $x = new Magic();
$x->foo(3);
$x->foo("3");
?>
---------- 调试PHP情况 ----------
456
not_exist_fun is called but not exist,U can do it by yourselft.
方法不存在
————————————————————————————————————————————————————————
如果在框架里用它,是这样的,PHP5里有一个反射函数,进行autoload进相关文件,后对该类的Obj进行:Obj->fun();
如果这个fun不存在就调用这个__call,这个call是上层类,其autoload时new的是这个继承的类名,于是有,如下伪代码:
PHP DIO Extension: Looking for beta testers阅读全文
背景:smarty自己也能实现cache,这块于nginx的cache模块不一样,它能实现一个页面某些地方(块)用上cache,有些用不上,实现灵活控制。
一)
框架里一般写成配置文件:
./libraries/smarty/Smarty.class.php
/**
* This enables template caching.
* <ul>
* <li>0 = no caching</li>
* <li>1 = use class cache_lifetime value</li>
* <li>2 = use cache_lifetime in cache file</li>
* </ul>
* @var integer
*/
var $caching = 0;
var $cache_dir = 'cache';
var $cache_lifetime = 3600;
二)配置文件,只配置路径,而不配置caching 值,在初始化时决定:
[codes=php]
<?php
defined('SYS_PATH') OR die('No direct access allowed.');
return array (
'templates_ext' => 'html',
'template_path' => APP_PATH. 'views/',
'cache_path' => DATA_PATH. 'cache/smarty_cache/',
'compile_path' => DATA_PATH. 'cache/smarty_compile/',
'configs_path' => DATA_PATH. 'config/',
'left_delimiter' => '<{',
'right_delimiter' => '}>',
);
[/codes]
三)smarty 默认是不cache的
./libraries/smarty/Smarty.class.php:
[codes=php]
var $caching = 0;
[/codes]
阅读全文
一)
框架里一般写成配置文件:
./libraries/smarty/Smarty.class.php
/**
* This enables template caching.
* <ul>
* <li>0 = no caching</li>
* <li>1 = use class cache_lifetime value</li>
* <li>2 = use cache_lifetime in cache file</li>
* </ul>
* @var integer
*/
var $caching = 0;
var $cache_dir = 'cache';
var $cache_lifetime = 3600;
二)配置文件,只配置路径,而不配置caching 值,在初始化时决定:
[codes=php]
<?php
defined('SYS_PATH') OR die('No direct access allowed.');
return array (
'templates_ext' => 'html',
'template_path' => APP_PATH. 'views/',
'cache_path' => DATA_PATH. 'cache/smarty_cache/',
'compile_path' => DATA_PATH. 'cache/smarty_compile/',
'configs_path' => DATA_PATH. 'config/',
'left_delimiter' => '<{',
'right_delimiter' => '}>',
);
[/codes]
三)smarty 默认是不cache的
./libraries/smarty/Smarty.class.php:
[codes=php]
var $caching = 0;
[/codes]
阅读全文
我目前知道两种php实现多线程的方式,现在贴出来,大家互相学习。阅读全文
[/home/karlwu/qdkj/src]# lsof|grep httpd|grep qdkj
httpd 3255 root 46w REG 8,1 216486 113428 /tmp/apache_qdkj.log
httpd 3255 root 155w REG 8,1 216486 113428 /tmp/apache_qdkj.log
httpd 3255 root 211w REG 8,1 216486 113428 /tmp/apache_qdkj.log
httpd 5832 nobody 46w REG 8,1 216486 113428 /tmp/apache_qdkj.log
公司经常做压力测试,因此我写了一个脚本。记录系统的性能信息,以便以后进行分析。很不错的脚本哦!希望给想监控系统状态的朋友们节省一些时间。阅读全文
商业需求对数据库的影响是第一位的,一个不是很合理的需求可能会整死你的数据库。
一个很简单的例子:
实时的统计论坛有多少帖子。真的需要实时吗?如果数据量小的时候实时似乎没有多大的影响。如果数据量大的话,对数据库可以说是一个不小的冲击。
解决的办法是建立一个统计表,只有一条记录一个字段就是论坛帖子的总数。但如果是在高峰期的时候,每秒钟有好多的帖子可能又会带来新的问题。
仔细分析一下确实需要实时统计吗?有多少人真正会关心这个数字?
换个角度,如果不需要实时的更新,每隔一段时间刷新这个数字到统计表中,性能提高的不是一点半点。
总结一下:其实好多地方都可以使用这种方法的。比如说分页,到一定程度用户会关心有多少页吗?
遇到这种问题的时候有两个问题可以反问我们自己:
1:真的需要实时吗?
2:用户真的关心吗?
如果处理好了,在这些方面数据库可能会表现的更加出色。
所以在一个新的项目货产品上线前,你和项目经理或产品经理分析一下这些情况,没准他们会采纳你的要求的。
来源:http://blog.sina.com.cn/s/blog_4d8a2c970100fcy6.html
一个很简单的例子:
实时的统计论坛有多少帖子。真的需要实时吗?如果数据量小的时候实时似乎没有多大的影响。如果数据量大的话,对数据库可以说是一个不小的冲击。
解决的办法是建立一个统计表,只有一条记录一个字段就是论坛帖子的总数。但如果是在高峰期的时候,每秒钟有好多的帖子可能又会带来新的问题。
仔细分析一下确实需要实时统计吗?有多少人真正会关心这个数字?
换个角度,如果不需要实时的更新,每隔一段时间刷新这个数字到统计表中,性能提高的不是一点半点。
总结一下:其实好多地方都可以使用这种方法的。比如说分页,到一定程度用户会关心有多少页吗?
遇到这种问题的时候有两个问题可以反问我们自己:
1:真的需要实时吗?
2:用户真的关心吗?
如果处理好了,在这些方面数据库可能会表现的更加出色。
所以在一个新的项目货产品上线前,你和项目经理或产品经理分析一下这些情况,没准他们会采纳你的要求的。
来源:http://blog.sina.com.cn/s/blog_4d8a2c970100fcy6.html
总体来讲有以下因素影响mysql的性能 :
1:商业需求
2:系统架构及实现
3:scheme的设计
4:sql query语句
5:硬件系统环境
从以上的顺序,就应该能够看出那些方面对mysql性能影响是最大的。调整mysql时应该遵从以上的顺序。
在接下来的一些文章中,我会详细的讲解以上几点对mysql的影响。
来源:
http://blog.sina.com.cn/s/blog_4d8a2c970100fcxd.html
1:商业需求
2:系统架构及实现
3:scheme的设计
4:sql query语句
5:硬件系统环境
从以上的顺序,就应该能够看出那些方面对mysql性能影响是最大的。调整mysql时应该遵从以上的顺序。
在接下来的一些文章中,我会详细的讲解以上几点对mysql的影响。
来源:
http://blog.sina.com.cn/s/blog_4d8a2c970100fcxd.html
[实践OK]用php实现上传文件时显示进度条(保证可以运行),用PHP Session和Javascript实现文件上传进度条。
Php/Js/Shell/Go jackxiang 2010-3-15 17:40
本来这篇文章早应该写了,由于其他原因一直没有时间完成。这两天抽空写了一个简单的版本,发出来大家一块学习吧。阅读全文
今天发现了一个php函数readfile()执行速度要比include和require要快。
Function Time (s) Memory (b)
32Kb File 1Mb File 32Kb File 1Mb File
file_get_contents 0.00152 0.00564 52480 1067856
fpassthru 0.00117 0.00184 20016 20032
fgets 0.00195 0.07190 30760 30768
file 0.00157 0.06464 87344 2185624
require_once 0.00225 0.08065 67992 2067696
include 0.00222 0.08202 67928 2067624
readfile 0.00117 0.00191 19192 19208
具体用法如下:
假设你有一个文本文件wade.txt,内容如下:
hello wade,you are so cool!!!
下面是具体的php代码:
readfile.php
<?php
readfile("wade.txt");
?>
如果你感到速度不错的话,可以用它来代替include和require了。
来源:http://blog.sina.com.cn/s/blog_4d8a2c970100evd2.html
Function Time (s) Memory (b)
32Kb File 1Mb File 32Kb File 1Mb File
file_get_contents 0.00152 0.00564 52480 1067856
fpassthru 0.00117 0.00184 20016 20032
fgets 0.00195 0.07190 30760 30768
file 0.00157 0.06464 87344 2185624
require_once 0.00225 0.08065 67992 2067696
include 0.00222 0.08202 67928 2067624
readfile 0.00117 0.00191 19192 19208
具体用法如下:
假设你有一个文本文件wade.txt,内容如下:
hello wade,you are so cool!!!
下面是具体的php代码:
readfile.php
<?php
readfile("wade.txt");
?>
如果你感到速度不错的话,可以用它来代替include和require了。
来源:http://blog.sina.com.cn/s/blog_4d8a2c970100evd2.html
syslog-ng是用带代替syslog的log server。功能对syslog有很大的提高。支持tcp,支持buffer(商业版中支持,如果remote log server 死掉的话,可以先把log存放到本地的buffer中,等到remote log server 恢复的时候,然后再将本地的log server中buffer中的内容重新发送给 remote log server).
本实例的目的是配置两台syslog-ng,一台clinet一台server。server端主要是对client日志的收集,然后我们就可以在服务器端统一分析了。
本人公司的应用是把log4j的日志通过syslog-ng client 发送到server端,然后通过python脚本分析写入数据库。然后再通过open flash chart画出图表出来,不多说了直接贴安装方法和具体的配置。
pre-acquire
eventlog-0.2.5.tar.gz
libnet
glib-java.x86_64
glib-java-devel.x86_64
glib2-devel
step 1:install syslog-ng
tar xzvf syslog-ng-2.0.7.tar.gz
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
./configure --prefix=/usr/local/syslogng --enable-tcp-wrapper --sysconfdir=/etc
make && make install
step 2:initiate
1:create syslog-ng.conf in /etc/ directory
2:create service lsb script in /etc/init.d directory
cp init.d.RedHat-7.3 /etc/init.d/syslogng and modify PATH environment
3:create logs group and logs user
step 3:configuration
client side:
# $Id: client-syslog-ng.conf,v 1.4 2005/10/23 18:36:10 jmates Exp $
#
# syslog-ng client configuration: some local logs, in addition to TCP
# logging to central loghost. Listens only on localhost interface;
# requires "logs" user and group on system.
#
# Local logs are stored under /var/log/archive in a syslog-ng specific
# format that includes facility, priority, and a timestamp that includes
# the year.
options {
log_fifo_size(4096);
group(logs);
dir_group(logs);
create_dirs(yes);
dir_perm(0750);
perm(0640);
use_time_recvd(no);
use_fqdn(yes);
chain_hostnames(no);
keep_hostname(yes);
stats(3600);
};
source local {
unix-stream("/dev/log" max_connections(150));
udp(ip(127.0.0.1) port(514));
internal();
};
# all logs to loghost via TCP
filter notdebug { level(info...emerg); };
destination loghost { tcp("192.168.1.7" port(5149)); };
log { source(local); filter(notdebug); destination(loghost); };
# emergency to more locations by default
filter emergency { level(emerg); };
destination allusers { usertty("*"); };
log { source(local); filter(emergency); destination(allusers); };
destination d_cons { file("/dev/console"); };
log { source(local); filter(emergency); destination(d_cons); };
# alternate locations for other logs to avoid need to logrotate and HUP
destination d_mesg {
file( "/logs/archive/messages/$R_YEAR/$R_MONTH/$R_YEAR-$R_MONTH-$R_DAY"
template("$ISODATE <$FACILITY.$PRIORITY> $HOST $MSG\n")
template_escape(no)
);
};
destination d_mail {
file( "/logs/archive/mail/$R_YEAR/$R_MONTH/$R_YEAR-$R_MONTH-$R_DAY"
template("$ISODATE <$FACILITY.$PRIORITY> $HOST $MSG\n")
template_escape(no)
);
};
#filter f_e {
#not(facility(cron) and priority(info));
#};
filter f_filter1 { level(info...emerg) and not facility(mail) and not facility(user); };
filter f_filter3 { facility(user); };
filter f_filter2 { facility(mail); };
log { source(local); filter(f_filter1); destination(d_mesg); };
log { source(local); filter(f_filter2); destination(d_mail); };
server side:
[root@monitserver etc]# more syslog-ng.conf
# $Id: server-syslog-ng.conf,v 1.4 2005/10/23 18:31:57 jmates Exp $
#
# Central loghost syslog-ng configuration.
options {
log_fifo_size(8192);
# garden gnomes shouldn't log (Gnome has a buggy log implementation)
# needs to be set on client systems, too...
bad_hostname("gconfd");
use_time_recvd(no);
group(logs);
create_dirs(yes);
dir_group(logs);
dir_perm(0750);
perm(0640);
chain_hostnames(no);
keep_hostname(yes);
stats(3600);
use_fqdn(yes);
};
# TODO look into enabling 'keep-alive' or 'tcp-keep-alive' on both
# client and server systems to avoid prior connections lingering?
source local {
unix-stream("/dev/log");
udp(ip(0.0.0.0) port(514));
tcp(ip(0.0.0.0) port(5149) max-connections(333));
internal();
};
filter emergency { level(emerg); };
destination users { usertty("*"); };
log { source(local); filter(emergency); destination(users); };
filter f_1 {
level(debug...emerg);
};
destination d_1 {
file("/var/log/everything"
template("$ISODATE <$FACILITY.$PRIORITY> $HOST $MSG\n")
template_escape(no)
);
};
log { source(local); filter(f_1); destination(d_1); };
# Windows logs to custom location (via Snare Agent, see [GS #1518])
filter windows {
program(MSWinEventLog);
};
destination windows {
file("/var/log/archive/windows/$R_YEAR/$R_MONTH/$R_YEAR-$R_MONTH-$R_DAY"
template("$ISODATE <$FACILITY.$PRIORITY> $HOST $MSG\n")
template_escape(no)
);
};
log {
source(local); filter(windows); destination(windows);
flags(final);
};
filter f_2 {
level(info...emerg);
};
filter f_3 {
not facility(mail);
};
filter f_10 {
not facility(user);
};
destination d_2 {
file("/var/log/archive/messages/$R_YEAR/$R_MONTH/message.$R_YEAR-$R_MONTH-$R_DAY"
template("$ISODATE <$FACILITY.$PRIORITY> $HOST $MSG\n")
template_escape(no)
);
};
log { source(local); filter(f_2); filter(f_3);filter(f_10); destination(d_2); };
filter f_5 {
facility(mail) and level(debug...emerg);
};
filter f_6 {
facility(user) and level(debug...emerg);
};
filter f_7 {
facility(user) and level(debug...emerg) and match("wadetest.track");
};
filter f_8 {
facility(user) and level(debug...emerg) and match("wadetest.secretcrush");
};
filter f_9 {
facility(user) and level(err);
};
filter f_10 {
facility(user) and level(debug...emerg) and match("wadetest.track");
};
filter f_11 {
facility(user) and level(debug...emerg) and match("wadetest.advertise");
};
destination d_3 {
file("/var/log/archive/mail/$R_YEAR/$R_MONTH/total.$R_YEAR-$R_MONTH-$R_DAY"
template("$ISODATE $HOST_FROM <$FACILITY.$PRIORITY> $HOST $MSG\n")
template_escape(no)
);
};
destination d_11{
pipe("/data/trackpipe");
};
log { source(local); filter(f_5); destination(d_3); };
log { source(local); filter(f_9); destination(d_9); };
log { source(local); filter(f_11); destination(d_11); };
step 4:start syslog-ng
service syslogng start
来源:
http://blog.sina.com.cn/s/blog_4d8a2c970100f2qz.html
本实例的目的是配置两台syslog-ng,一台clinet一台server。server端主要是对client日志的收集,然后我们就可以在服务器端统一分析了。
本人公司的应用是把log4j的日志通过syslog-ng client 发送到server端,然后通过python脚本分析写入数据库。然后再通过open flash chart画出图表出来,不多说了直接贴安装方法和具体的配置。
pre-acquire
eventlog-0.2.5.tar.gz
libnet
glib-java.x86_64
glib-java-devel.x86_64
glib2-devel
step 1:install syslog-ng
tar xzvf syslog-ng-2.0.7.tar.gz
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
./configure --prefix=/usr/local/syslogng --enable-tcp-wrapper --sysconfdir=/etc
make && make install
step 2:initiate
1:create syslog-ng.conf in /etc/ directory
2:create service lsb script in /etc/init.d directory
cp init.d.RedHat-7.3 /etc/init.d/syslogng and modify PATH environment
3:create logs group and logs user
step 3:configuration
client side:
# $Id: client-syslog-ng.conf,v 1.4 2005/10/23 18:36:10 jmates Exp $
#
# syslog-ng client configuration: some local logs, in addition to TCP
# logging to central loghost. Listens only on localhost interface;
# requires "logs" user and group on system.
#
# Local logs are stored under /var/log/archive in a syslog-ng specific
# format that includes facility, priority, and a timestamp that includes
# the year.
options {
log_fifo_size(4096);
group(logs);
dir_group(logs);
create_dirs(yes);
dir_perm(0750);
perm(0640);
use_time_recvd(no);
use_fqdn(yes);
chain_hostnames(no);
keep_hostname(yes);
stats(3600);
};
source local {
unix-stream("/dev/log" max_connections(150));
udp(ip(127.0.0.1) port(514));
internal();
};
# all logs to loghost via TCP
filter notdebug { level(info...emerg); };
destination loghost { tcp("192.168.1.7" port(5149)); };
log { source(local); filter(notdebug); destination(loghost); };
# emergency to more locations by default
filter emergency { level(emerg); };
destination allusers { usertty("*"); };
log { source(local); filter(emergency); destination(allusers); };
destination d_cons { file("/dev/console"); };
log { source(local); filter(emergency); destination(d_cons); };
# alternate locations for other logs to avoid need to logrotate and HUP
destination d_mesg {
file( "/logs/archive/messages/$R_YEAR/$R_MONTH/$R_YEAR-$R_MONTH-$R_DAY"
template("$ISODATE <$FACILITY.$PRIORITY> $HOST $MSG\n")
template_escape(no)
);
};
destination d_mail {
file( "/logs/archive/mail/$R_YEAR/$R_MONTH/$R_YEAR-$R_MONTH-$R_DAY"
template("$ISODATE <$FACILITY.$PRIORITY> $HOST $MSG\n")
template_escape(no)
);
};
#filter f_e {
#not(facility(cron) and priority(info));
#};
filter f_filter1 { level(info...emerg) and not facility(mail) and not facility(user); };
filter f_filter3 { facility(user); };
filter f_filter2 { facility(mail); };
log { source(local); filter(f_filter1); destination(d_mesg); };
log { source(local); filter(f_filter2); destination(d_mail); };
server side:
[root@monitserver etc]# more syslog-ng.conf
# $Id: server-syslog-ng.conf,v 1.4 2005/10/23 18:31:57 jmates Exp $
#
# Central loghost syslog-ng configuration.
options {
log_fifo_size(8192);
# garden gnomes shouldn't log (Gnome has a buggy log implementation)
# needs to be set on client systems, too...
bad_hostname("gconfd");
use_time_recvd(no);
group(logs);
create_dirs(yes);
dir_group(logs);
dir_perm(0750);
perm(0640);
chain_hostnames(no);
keep_hostname(yes);
stats(3600);
use_fqdn(yes);
};
# TODO look into enabling 'keep-alive' or 'tcp-keep-alive' on both
# client and server systems to avoid prior connections lingering?
source local {
unix-stream("/dev/log");
udp(ip(0.0.0.0) port(514));
tcp(ip(0.0.0.0) port(5149) max-connections(333));
internal();
};
filter emergency { level(emerg); };
destination users { usertty("*"); };
log { source(local); filter(emergency); destination(users); };
filter f_1 {
level(debug...emerg);
};
destination d_1 {
file("/var/log/everything"
template("$ISODATE <$FACILITY.$PRIORITY> $HOST $MSG\n")
template_escape(no)
);
};
log { source(local); filter(f_1); destination(d_1); };
# Windows logs to custom location (via Snare Agent, see [GS #1518])
filter windows {
program(MSWinEventLog);
};
destination windows {
file("/var/log/archive/windows/$R_YEAR/$R_MONTH/$R_YEAR-$R_MONTH-$R_DAY"
template("$ISODATE <$FACILITY.$PRIORITY> $HOST $MSG\n")
template_escape(no)
);
};
log {
source(local); filter(windows); destination(windows);
flags(final);
};
filter f_2 {
level(info...emerg);
};
filter f_3 {
not facility(mail);
};
filter f_10 {
not facility(user);
};
destination d_2 {
file("/var/log/archive/messages/$R_YEAR/$R_MONTH/message.$R_YEAR-$R_MONTH-$R_DAY"
template("$ISODATE <$FACILITY.$PRIORITY> $HOST $MSG\n")
template_escape(no)
);
};
log { source(local); filter(f_2); filter(f_3);filter(f_10); destination(d_2); };
filter f_5 {
facility(mail) and level(debug...emerg);
};
filter f_6 {
facility(user) and level(debug...emerg);
};
filter f_7 {
facility(user) and level(debug...emerg) and match("wadetest.track");
};
filter f_8 {
facility(user) and level(debug...emerg) and match("wadetest.secretcrush");
};
filter f_9 {
facility(user) and level(err);
};
filter f_10 {
facility(user) and level(debug...emerg) and match("wadetest.track");
};
filter f_11 {
facility(user) and level(debug...emerg) and match("wadetest.advertise");
};
destination d_3 {
file("/var/log/archive/mail/$R_YEAR/$R_MONTH/total.$R_YEAR-$R_MONTH-$R_DAY"
template("$ISODATE $HOST_FROM <$FACILITY.$PRIORITY> $HOST $MSG\n")
template_escape(no)
);
};
destination d_11{
pipe("/data/trackpipe");
};
log { source(local); filter(f_5); destination(d_3); };
log { source(local); filter(f_9); destination(d_9); };
log { source(local); filter(f_11); destination(d_11); };
step 4:start syslog-ng
service syslogng start
来源:
http://blog.sina.com.cn/s/blog_4d8a2c970100f2qz.html
PHP手册 :
There are 5 monkeys in the tree
本函数用来将字符串格式化。参数 format 是转换的格式,以百分比符号 % 开始到转换字符为止。而在转换的格式间依序包括了
$bookSQL=sprintf("UPDATE book SET pass=%s WHERE id=%d",
GetSQLValueString($_POST['list'], "text"),
GetSQLValueString($_GET['id'],"int"));
GetSQLValueString 这个函数,可以换成别的函数
但在sql语句这里用上sprintf()这个函数的话!就相对安全多了,比如id那里我们可以用上%d
或是有很多sql操作的时候,用上这个
$Result = $db->query($bookSQL) or die(mysql_error());
下面加上sprintf这个函数的说明:
引用
sprintf
将字符串格式化。
语法: string sprintf(string format, mixed [args]...);
返回值: 字符串
函数种类: 资料处理
内容说明
本函数用来将字符串格式化。参数 format 是转换的格式,以百分比符号 % 开始到转换字符为止。而在转换的格式间依序包括了
填空字符。0 的话表示空格填 0;空格是默认值,表示空格就放着。
对齐方式。默认值为向右对齐,负号表向左对齐。
字段宽度。为最小宽度。
精确度。指在小数点后的浮点数位数。
类型,见下表 % 印出百分比符号,不转换。
b 整数转成二进位。
c 整数转成对应的 ASCII 字符。
d 整数转成十进位。
f 倍精确度数字转成浮点数。
o 整数转成八进位。
s 整数转成字符串。
x 整数转成小写十六进位。
X 整数转成大写十六进位。
printf直接输出,注意区别:
sprintf:
---------- 调试PHP ----------
<Result><Status>2</Status><Error><Id></Id><Description></Description></Error></Result>
输出完成 (耗时 0 秒) - 正常终止
printf:
---------- 调试PHP ----------
<Result><Status>2</Status><Error><Id></Id><Description></Description></Error></Result>86
输出完成 (耗时 0 秒) - 正常终止
86,是输出了$outStr的长度。
echo $outStr; //86
printf($upStrOut, $status,$id,$description); //<Result><Status>2</Status><Error><Id></Id><Description></Description></Error></Result>
There are 5 monkeys in the tree
本函数用来将字符串格式化。参数 format 是转换的格式,以百分比符号 % 开始到转换字符为止。而在转换的格式间依序包括了
$bookSQL=sprintf("UPDATE book SET pass=%s WHERE id=%d",
GetSQLValueString($_POST['list'], "text"),
GetSQLValueString($_GET['id'],"int"));
GetSQLValueString 这个函数,可以换成别的函数
但在sql语句这里用上sprintf()这个函数的话!就相对安全多了,比如id那里我们可以用上%d
或是有很多sql操作的时候,用上这个
$Result = $db->query($bookSQL) or die(mysql_error());
下面加上sprintf这个函数的说明:
引用
sprintf
将字符串格式化。
语法: string sprintf(string format, mixed [args]...);
返回值: 字符串
函数种类: 资料处理
内容说明
本函数用来将字符串格式化。参数 format 是转换的格式,以百分比符号 % 开始到转换字符为止。而在转换的格式间依序包括了
填空字符。0 的话表示空格填 0;空格是默认值,表示空格就放着。
对齐方式。默认值为向右对齐,负号表向左对齐。
字段宽度。为最小宽度。
精确度。指在小数点后的浮点数位数。
类型,见下表 % 印出百分比符号,不转换。
b 整数转成二进位。
c 整数转成对应的 ASCII 字符。
d 整数转成十进位。
f 倍精确度数字转成浮点数。
o 整数转成八进位。
s 整数转成字符串。
x 整数转成小写十六进位。
X 整数转成大写十六进位。
printf直接输出,注意区别:
sprintf:
---------- 调试PHP ----------
<Result><Status>2</Status><Error><Id></Id><Description></Description></Error></Result>
输出完成 (耗时 0 秒) - 正常终止
printf:
---------- 调试PHP ----------
<Result><Status>2</Status><Error><Id></Id><Description></Description></Error></Result>86
输出完成 (耗时 0 秒) - 正常终止
86,是输出了$outStr的长度。
echo $outStr; //86
printf($upStrOut, $status,$id,$description); //<Result><Status>2</Status><Error><Id></Id><Description></Description></Error></Result>
[root@localhost ~]# setserial -g /dev/ttyS*
/dev/ttyS0, UART: 16550A, Port: 0x03f8, IRQ: 4
/dev/ttyS1, UART: 16550A, Port: 0x02f8, IRQ: 3
/dev/ttyS2, UART: unknown, Port: 0x03e8, IRQ: 4
/dev/ttyS3, UART: unknown, Port: 0x02e8, IRQ: 3
/dev/ttyS0, UART: 16550A, Port: 0x03f8, IRQ: 4
/dev/ttyS1, UART: 16550A, Port: 0x02f8, IRQ: 3
/dev/ttyS2, UART: unknown, Port: 0x03e8, IRQ: 4
/dev/ttyS3, UART: unknown, Port: 0x02e8, IRQ: 3
setserial /dev/ttyS1 baud_base 57600
[root@localhost ~]# setserial -a /dev/ttyS0
/dev/ttyS0, Line 0, UART: 16550A, Port: 0x03f8, IRQ: 4
Baud_base: 115200, close_delay: 50, divisor: 0
closing_wait: 3000
Flags: spd_normal skip_test
[root@localhost ~]# setserial -a /dev/ttyS1
/dev/ttyS1, Line 1, UART: 16550A, Port: 0x02f8, IRQ: 3
Baud_base: 57600, close_delay: 50, divisor: 0
closing_wait: 3000
Flags: spd_normal skip_test
/dev/ttyS1, Line 1, UART: 16550A, Port: 0x02f8, IRQ: 3
Baud_base: 57600, close_delay: 50, divisor: 0
closing_wait: 3000
Flags: spd_normal skip_test
以下是参考:
阅读全文