嘿嘿,关于看门狗的作用,我来讲……

1:要讲系统的可靠性,首先要讲系统安全保证机制的可靠性,对于MCU系统来说,养DOG是其中最重要的一条

2:很多人可能要讲,我没养DOG,我的系统也很可靠,所以看门狗没有必要。
   这是一种不需要反驳的观点,从理论上来讲,养狗安全系数肯定会高一些;

3:在系统里面养狗,狗本身电路也是存在失效可能性的,在上面有人曾讲到MAX813翘了,这就属于这种情况,MAX813还属于比较好的,过去很多人经常用到的25045,内部集成了EE等资源,这东西不怎的,很容易被干扰得自己挂了。

4:很多人在争执系统里面应该如何养狗,很多人片面的以为狗一定要在主循环里面养才是最好的,在这里不得不说说hotpower的中断养狗论了,当年 hotpower为了证明那些人的说法是何其错误,整出了一个中断养狗论,很多人根本没看懂hotpower想要表达的真实含义,从原理上讲,hotpower其实要表达的是:要想养一条忠实听话的好狗,在哪个地方养根本不重要,在哪个地方养都可以达到最好的效果,真正重要的是要注意软体返回的各个路径,在异常的时候,要通过条件互驳,让狗起来看家。

5:虽然hotpower中断养狗的方法也可以达到比较好的看家效果,但俺却是一个主循环养狗的坚定拥护者,原因无它,第一:主循环养狗简单明了;第二:主循环养狗比较省代码,第三:不管是中断还是主循环养狗,实现条件互驳,这只狗都一样忠实。
6:在这里不得不说程序结构,那种流水帐的程序结构,不管是中断还是主循环养狗,结果都是一样:养了一只癞皮狗!关于这一点,如果谁有不同意见,可以提出来讨论讨论

7:这些都做好了有什么用呢?
一个再忠实的狗,也只能是系统的一部分,在矿安产品中有一个说法叫:本安型,也就是本质安全性,当然,MCU系统是无法实现本安性的,所以需要看家的 DOG,但系统的根本依然是要努力提高系统本身的安全性,一个再好的看门狗动作处理,也只能是尽量恢复现场,并且,系统也绝不能总是出现保护的行为,如果这样,将是一个不可原谅的设计……
这就又延伸到电路设计和PCB设计甚至工艺设计等等问题,这不是这个主题帖讨论的范围,所以,俺也不说了……
二:
MCU系统为什么要DOG!?

DOG是为了防止不知道哪天出现的窃贼的,对付已知出现的窃贼,最好的办法就是直接拿棍子轰倒……

对于一个系统,通过测试只是尽可能模拟实际可能出现的干扰,显然:从数学的概率讲,不能涵盖100%的情况,并且,一个产品可能大批量的被众多不同类型用户使用,所以,测试条件的样本抽取本就不可能重现100%现实状况。

一句胡说八道的理论:如果你的系统产生复位,说明你的设计不行,改好设计就可以,所以没有必要要看门狗……

本懒得反驳,看应和者居然众多,避免错误的理论误人子弟,必须以证视听:
我已经讲过多次了,测试只是一种必要不充分的条件,请认真理解这个来自数学的概念……
没有测试,只能通过在实际使用条件下的试用来检验设计,这样的设计更加是不充分的测试,而且,这样的测试只能更加无序的浪费时间和精力……
一个是安装chmsee,用新立得管理工具,搜索chmsee,安装即可。
另一个就是给firefox安装个插件,工具--->添加组件--->获取附加组件搜索chm reader
下载:

你可以开多个浏览器IE,FIREFOX等来测试,你也可以通过它来进行两个远在天边的人来聊天:
点击:http://www.5ifd.com/comet


<?php

$filename  = dirname(__FILE__).'/data.txt';

// store new message in the file
$msg = isset($_GET['msg']) ? $_GET['msg'] : '';
if ($msg != '')
{
  file_put_contents($filename,$msg);
  die();
}

// infinite loop until the data file is not modified
$lastmodif    = isset($_GET['timestamp']) ? $_GET['timestamp'] : 0;
$currentmodif = filemtime($filename);
while ($currentmodif <= $lastmodif) // check if the data file has been modified
{
  usleep(10000); // sleep 10ms to unload the CPU
  clearstatcache();
  $currentmodif = filemtime($filename);
}

// return a json array
$response = array();
$response['msg']       = file_get_contents($filename);
$response['timestamp'] = $currentmodif;
echo json_encode($response);
flush();

?>



<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title>Comet demo</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <script type="text/javascript" src="prototype.js"></script>
  </head>
  <body>

<div id="content">
</div>

<p>
  <form action="" method="get" onsubmit="comet.doRequest($('word').value);$('word').value='';return false;">
    <input type="text" name="word" id="word" value="" />
    <input type="submit" name="submit" value="Send" />
  </form>
</p>

<script type="text/javascript">
var Comet = Class.create();
Comet.prototype = {

  timestamp: 0,
  url: './backend.php',
  noerror: true,

  initialize: function() { },

  connect: function()
  {
    this.ajax = new Ajax.Request(this.url, {
      method: 'get',
      parameters: { 'timestamp' : this.timestamp },
      onSuccess: function(transport) {
        // handle the server response
        var response = transport.responseText.evalJSON();
        this.comet.timestamp = response['timestamp'];
        this.comet.handleResponse(response);
        this.comet.noerror = true;
      },
      onComplete: function(transport) {
        // send a new ajax request when this request is finished
        if (!this.comet.noerror)
          // if a connection problem occurs, try to reconnect each 5 seconds
          setTimeout(function(){ comet.connect() }, 5000);
        else
          this.comet.connect();
        this.comet.noerror = false;
      }
    });
    this.ajax.comet = this;
  },

  disconnect: function()
  {
  },

  handleResponse: function(response)
  {
    $('content').innerHTML += '<div>' + response['msg'] + '</div>';
  },

  doRequest: function(request)
  {
    new Ajax.Request(this.url, {
      method: 'get',
      parameters: { 'msg' : request }
    });
  }
}
var comet = new Comet();
comet.connect();
</script>

</body>
</html>



prototype.js



基于libevent 1.3e, 利用了libevent里面现成的http库
编译方法,先安装libevent,然后
    cc -o httpd httpd.c -L/usr/local/lib/ -Wall -O2 -I/usr/local/include -ggdb -levent
可以作为一个商业运行环境的基础,真正的业务系统里面,comet server也很简单,比这个程序复杂不了什么,它只处理comet,只是一个通道,复杂的东西放到其他地方。
打算作为下图中的一个模块
点击在新窗口中浏览此图片阅读全文
背景:(1)偶尔会出现mysql的server和mysql的client默认的socke文件不在一个地方,我们用mysql时会出现一个找不到mysql.sock的情况。
(2)因非正常关机出现:/tmp/mysql.sock 不见了,找不到了,如何连接上去的问题?(其他机器通过tcp可以的)
先放个命令在mysql运行机上链接的方法:

原因一:
linux系统一次不正常关机后,连接mysql的时候系统提示不能通过/tmp/mysql.sock文件进行连接,或者非正确关闭时,导致mysql.sock文件再次丢失,当你在次启动时出现如下错误,connect mysqld faild ,/tmp/mysql.sock can't find
mysql.sock的丢失主要是因为更改了机器名,在没有正确关闭mysqld的情况下,去执行mysqld_safe,这样他就删除已经运行的mysql.sock了。正常情况下,mysqld_safe 应该告诉我们是已经有Mysqld运行了,而上边并没有这样提示,主要是更改机器名导致mysqld_safe判断是否已经运行,去找的是newhostname.pid文件,但已经运行的mysqld生成的是oldhostname.pid, 肯定找不到newhostname.pid,所以mysqld_safe收拾一下(清理了mysql.sock),然后去重启,但是ibdata需要lock,它lock不了,还是起不了,但是老的mysql.sock就消失。
原因二:
连接localhost通常通过一个Unix域套接字文件进行,一般是/tmp/mysql.sock。如果套接字文件被删除了,本地客户就不能连接。这可能发生在你的系统运行一个cron任务删除了/tmp下的临时文件。
如果你因为丢失套接字文件而不能连接,你可以简单地通过重启服务器重新创建得到它。因为服务器在启动时重新创建它。

解决办法,实时上,在/etc/init.d 下有个连接启动脚本 mysqld ,我们启动时可以直接用它 service mysqld start |stop
来自:http://blog.csdn.net/imzoer/article/details/8444400
实践情况如下:
[root@localhost init.d]# mysqladmin -u root -hlocalhost -p shutdown
Enter password:
mysqladmin: connect to server at 'localhost' failed
error: 'Can't connect to local MySQL server through socket '/tmp/mysqld.sock' (2)'
Check that mysqld is running and that the socket: '/tmp/mysqld.sock' exists!
直接干死了:
pkill -9 mysql
重启:
/usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/data/db/mysql --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/data/db/mysql/localhost.err --open-files-limit=65535 --pid-file=/usr/local/mysql/xd_xiyou_db_7.pid --socket=/tmp/mysqld.sock --port=3306

————————————————上面这种太粗暴,实践操作Ok如下:—————————————————————————
[root@localhost init.d]# service mysql stop
Shutting down MySQL.....                                   [  OK  ]
[root@localhost init.d]# service mysql start
Starting MySQL...                                          [  OK  ]

启动原理:
/etc/init.d/mysql
里写明了basedir及datadir,这块datadir很重要,启动时起了很大的作用,在安装时就定下来不改动最好了:

——————————————————————————————————————————————————————————
出现以下的信息:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
如果还不行.就先
#ps -aux|grep mysql
找mysql的进程里的那个socket位置,如:

方法一:
mysql --port=3306 -uroot -p123qwe*** -S /var/lib/mysql/mysql.sock
方法二:
mysql --socket=/var/lib/mysql/mysql.sock --port=3306 -uroot -p123qwe***
方法三:
ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock
阅读全文
当你有QQ消息时,QQ的小图标会晃动,我们甚至还可以设定QQ有消息时,自动弹出来!
这些在C/S模式下很容易实现!如果要在B/S模式如何来实现呢?
我们的肯定会想到在客服端调用ajax在后台不断的查询服务器.看是否有关于自己的消息.如果有则查询返回.这种做法肯定会大量的占用系统的资源!不可取!
现在DWR的反转AJAX功能.允许我们从服务器端来控制客服端.而不需要客户端来请求.服务器可以自动把消息发给指定的客户端! 点击在新窗口中浏览此图片
点击在新窗口中浏览此图片
我不能把公司的代码贴出来,所以我自己写了一个DEMO,已经实现了对指定用户发送消息的功能,并且即时显示在指定的用户界面上面.当然你可以修改这些,让它弹出来显示,或者像QQ一样在你页面的某个角落让消息的图标闪动:)
下面我做一个简单的说明:阅读全文

#include "gtk/gtk.h"

gboolean draw_some( GtkWidget *widget, GdkEventExpose *event,
         gpointer data )
{
    gdk_draw_line( widget->window,
       widget->style->fg_gc[GTK_WIDGET_STATE( widget )],
       10, 10, 100, 100 );
    return TRUE;
}


int main( int argc, char *argv[] )
{
    GtkWidget* window;
    GtkWidget* draw_area;
    
    gtk_init( &argc, &argv );
    
    window = gtk_window_new( GTK_WINDOW_TOPLEVEL );
    gtk_widget_set_usize( window, 400, 300 );
    g_signal_connect( G_OBJECT( window ), "destroy",
          G_CALLBACK( gtk_main_quit ), NULL );

    draw_area = gtk_drawing_area_new( );
    gtk_widget_set_size_request( draw_area, 100, 100 );
    g_signal_connect( G_OBJECT( draw_area ), "expose_event",
          G_CALLBACK( draw_some ), NULL );

    gtk_container_add( GTK_CONTAINER( window ), draw_area );

    gtk_widget_show( draw_area );
    gtk_widget_show( window );
    
    gtk_main( );
    
    return 0;
}
用jsp帮助实现的,当中遇到了不少的问题,后来在ITPUB的一些朋友和自己的辛苦努力下终于完成了该程序阅读全文
现在大家使用开发工具有点盲目,什么都用,本来选择多是好事,但如果进行专业开发,选错开发工具将造成很大的影响,甚至是致命的。

几年来我一直做嵌入式Linux,也写过很多的程序,从系统配置程序,编辑器,拔号程序到监控系统到电子邮件到浏览器(这两个主要是改人家的)。马马虎虎还可以说是一个经验丰富的程序员,对中国的Linux行业也比较熟悉。我一直用这些开发工具。基本上没有什么解决不了的问题(就客户或开发需求而言)。我向来很讲究社会主义精神的,自己有所得就拿出来给大家分享,如果有用大家就参考参考,没用就批评或说出自己的看法。

我的经验归纳起来很简单,就是做开发最好还是用redhat(开发英文应用)或turbolinux系统(开发中文应用)+GTK/GNOME+glade+anjuta+sourcenavigator。语言方面当然是使用C/C++了,写应用主要是C,做图形系统底层时(如windows manager, X系统) 则主要是C++。

至于QT/KDE/Designer的组合我不是很推荐。我研究了不少时间,总觉得写不出好的东西来,甚至做了一个embedded qt 的中文输入也没用上。所以我也不是很支持用KDE进行开发,我想这与我个人喜好没有很大的关系。

Kyrix本应该是不错的东西,但要这么贵我觉得就不用去考虑它了。

其它的新鲜东西就不用谈了,大偏或太先进的东西只能拿去研究或做技术筹备,等成熟了我们再上。
回复:
能详细谈谈不使用qt的理由么?为什么写不出好东西?
总觉得GTK很土,glade功能也不够强大。qt的类库使用起来还是很舒服的,特别是对xml, regexp的支持很不错,有时候即使不写GUI也想用qt。觉得qt不爽的是它的性能和许可证,但GTK是从根上就烂了,控件很土,接口累赘,比 motif好不到哪里(对于同样的程序,qt的代码量一般是gtk的一半),那个GTK的祖宗gimp是窗口污染的典型例子。
回复:
这样说未免太偏激了

gimp窗口太多,但是anjuta就很整洁, 关键是你怎么用,
QT也不错,但是我会选择gtk2的。
回复:
还是喜欢使用GTK+。QT没有使用过,不过觉得GTK+写程序还是很简单。不过可以GTK+控件不是很多。如果有一天可以多到和Delphi那么多就好了。还有GLIB也非常不错。许多自己以前要写的数据结构现在都有了,省了不少的事情,而且GLIB不依赖图形环境,不写GUI,只用GLIB也不错
回复:
我不敢打赌你用了GTK就会放弃QT了。

回复:
我个人觉得用什么都一个样,关键是你能不能开发出好东东来,如果只是吹象的话,那谁都会。
如果真让我在GTK+, QT和Klyix三者间选择一种的话,我首先排除Klyix,它好用,但不自由,也不能用于开发底层的东西,我想真正的Linux高手是不甘心于开发一些中看不中用的小东西,这才是Linux真正的魅力。
接下来,我再排除QT,同样是因为它不是真正的Free,因为我要自由,谁不给自由我就轰谁!
回复:
gtk 和 qt 都得会才好,
我本来是学 QT的
但是我想写一个 xmms 的 plugin。
还得学 GTK 才行呀。

回复:
gtk的程序又小又快,占内存又少,界面不但支持漂亮的theme,还能把整个界面做成一张图片一样。代码虽多,但用熟了易记且可大量复制。 而且它是完全的free,想把它怎么改怎么卖都成。

至于qt, 程序代码是很少,但占的内存大,qt库本身也比gtk库大得多,要是做嵌入式应用就远不如gtk了。
qt的界面才土,就像win95一样,支持的theme也不漂亮,GNOME就比KDE漂亮多了。
qt写的商用程序有版权问题,特别是qt/e的贵,钱都给trolltech赚了....
http://www.sunnyu.com/?p=93
给fast-cgi方式的php做一个检查脚本

使用fast-cgi方式的php在使用,有时候由于编写的代码问题,使处理代码的php-cgi进程的运行占用很多时间,在将所有活动的 php-cgi 进程都占用后,web服务器对php的请求就失去响应了。

通过命令查看服务器上一共开了多少的 php-cgi 进程

   1.

      ps -fe |grep "php" | grep -v "grep" | wc -l


使用如下命令查看已经有多少个php-cgi进程用来处理tcp请求

   1.

      netstat -anop | grep "php" | grep -v "grep" | wc -l


当被使用的php进程接近所开启的php进程数时,可以考虑将被耗用的php进程释放一下,以防止网站访问的阻塞。

按照以上思路编写了一个检查脚本。

1.

#

#!/bin/sh

#



echo "begin check"



#define default check delta num

defdeltacount=10



phpcount=`ps -fe |grep "php" | grep -v "grep" | wc -l`

netstatcount=`sudo netstat -anop | grep "php" | grep -v "grep" | wc -l`



echo "  php process count is $phpcount

netstat process count is $netstatcount"



deltacount=`expr $phpcount - $netstatcount`



if [ -n "$1" ]; then

  defdeltacount=$1

fi



echo "deltacount is $deltacount, defdeltacount is $defdeltacount"



if [ $deltacount -lt $defdeltacount ]; then

  echo "  need reset"

  sudo /root/tools/resetphp.sh

else

  echo "  not need reset"

fi



echo "check end"


其中 /root/tools/resetphp.sh 为编写的php重启脚本。
脚本可以放到 crontab 中,做自动定时检查处理。
php中mysql_pconnect()的实现方式:阅读全文

<?php
set_time_limit(0);
header("Connection: Keep-Alive");
header("Proxy-Connection: Keep-Alive");
for($i=0; $i<1000; $i++) {
   print "fuck man!".$i."<br>";
   flush();
   sleep(3);
   clearstatcache();
}
?>

delete from user_daily where day=date(now() - interval 4 day);
SELECT date( now( ) - INTERVAL 4 DAY ) ;
安装好:Visual Studio6,除了VB VC FOXPRO,安装好后:
打开IE,工具--》Internet选项--》高级--》去掉显示友好HTTP错误信息--》显示每个脚本错误的信息打开--》禁用脚本调试-》禁用脚本调试其他给关闭掉。

然后,适当看看下文:阅读全文
4个字符

字符串的长度:
长度的单位为字符。一个多字节字符算作一个单字符。

MySQL字符串函数:
对于一个包含五个二字节字符集, LENGTH()返回值为 10, 而CHAR_LENGTH()的返回值为5。

也就是说:
对于一个汉字和一个字母都是一个字符。遵循CHAR和VARCHAR定义规范。也与数据库本身设置的字符集有关。

mysql的char和varchar字段不区分unicode还是别的什么编码,统统按照ascii来存,所以一个汉字占用2个字节。

CHAR和VARCHAR类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。

CHAR和VARCHAR类型声明的长度表示你想要保存的最大字符数。例如,CHAR(30)可以占用30个字符。

CHAR列的长度固定为创建表时声明的长度。长度可以为从0到255的任何值。当保存CHAR值时,在它们的右边填充空格以达到指定的长度。当检索到CHAR值时,尾部的空格被删除掉。在存储或检索过程中不进行大小写转换。

VARCHAR列中的值为可变长字符串。长度可以指定为0到65,535之间的值。(VARCHAR的最大有效长度由最大行大小和使用的字符集确定。整体最大长度是65,532字节)。

char是定长字符数据,所谓定长就是长度固定的,当输入的数据长度没有达到指定的长度时将自动以英文空格在其后面填充,使长度达到相应的长度。
CHAR是固定字符数量,储存时不足部分用空格补齐,搜起来比较快,占用空间相对就多
VARCHAR是不固定字符数量,占用空间小,不过需要记录字符数。
char是一种固定长度的类型,varchar则是一种可变长度的类型,它们的区别是:

  char(M)类型的数据列里,每个值都占用M个字节,如果某个长度小于M,MySQL就会在它的右边用空格字符补足.(在检索操作中那些填补出来的空格字符将被去掉)在varchar(M)类型的数据列里,每个值只占用刚好够用的字节再加上一个用来记录其长度的字节(即总长度为L+1字节).

使用的一般规则:

1.      经常变化的字段用char

2.      知道固定长度的用char

3.      尽量用varchar

4.      超过255字节的只能用varchar或者text

5.      能用varchar的地方不用text
阅读全文
vi /etc/rc.d/init.d/iptables
1-1024, 3306, 36000, 56000,  這些都是高危端口, 不能隨便開的
http://www.ibm.com/developerworks/cn/web/wa-lo-comet/
分页: 199/259 第一页 上页 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 下页 最后页 [ 显示模式: 摘要 | 列表 ]