gyn

Win32下的Perl,无用的select,停滞的Tk,结束吧....

python中unicode解决之道

和前一篇的起因一样,也是在使用 wxPython 的时候。因为不是每个人都熟悉英文(事实上,我总认为不熟悉或者说是生疏与英文的人,大多憎恨英文),不可避免的,需要显示一些中文。但是运行的结果显示大体如“ Syntax Error: Non ASCII character in ‘\xc4’…. ”的错误提示。按照 Dive into Python 的解释,这是因为 python 默认使用 ASCII 编解码,而中文显然不是标准的 ASCII
   按照文中的解决办法,是要在程序的第一或二行键入形如“
# -*- coding: gbk -*- ”或者将其中的 gbk 改为 cp936 ,这有什么不同。不过也许因为一些大牛习惯的缘故,使用 cp936 更酷一点。 Google 中的一种简单的写法是“ #coding=cp936 ”(需要注意的是和 bash 的语法相类似的,“ = ”两旁不能有空格),不过这样没有前一种来得顺眼,可按个人爱好任意选择。
   这样看来,问题似乎解决了。不过事事难预料,由于程序需要对
sqlite 进行读写,在将这些中文写入数据库的时候也出现了编解码错误的提示。看来 pysqlite 似乎只能处理 unicode 的数据,用惯了 perl DBI ,一时还无法接受这一而再烦人的错误。
   解决的办法是将中文用
unicode 实例化,然后在传给 pysqlite ,具体如: u’ 你好 这样。但是对于变量不能这样简化做,甚至于 u’%s’ % niha (其中 nihao 被赋值了‘你好’)的形式也不行。这里我们需要用 unicode 的完整形式, unicode(nihao, ‘cp936’)

posted @ 2007-10-24 20:26 gyn_tadao 阅读(676) | 评论 (0)编辑 收藏

wxPython中的一个登录对话框(Login Dialog)

在使用wxPython的过程中,临时需要加入一个登录对话框,因为不是标准Dialog,所以在google里搜索了一下,相关的信息只能用凤毛麟角来形容。查询了在wxPython DEMO中标准Dialog实例代码,发现与所需的极为类似,所以稍作修改就被派上用场了。
其中密码文本框的style是wx.TE_PASSWORD。类实例在ShowModal返回wx.ID_OK之后,调用GetValue返回用户名和密码,以供调用代码验证之用。
# -*- coding: gbk -*-

import wx

#-------------------------------------------------------------------------

class LoginDialog(wx.Dialog):
    
def __init__(self, parent, id, title,  
                       size 
= (350200),
                       pos 
= wx.DefaultPosition,
                       style 
= wx.DEFAULT_DIALOG_STYLE, useMetal = False):
        pre 
= wx.PreDialog()
        pre.Create(parent, id, title, pos, size, style)
        self.PostCreate(pre)
        self.user, self.password 
= ''''
        self.CreateSizer()
        
    
def dataEntries(self):
        
return (('用户  ', 0, self.OnUser),('密码  ', wx.TE_PASSWORD, self.OnPassword))
                                    
    
def dataButtons(self):
        
return ((wx.ID_OK, '确定'),(wx.ID_CANCEL, '取消'))
        
    
def CreateSizer(self):
        sizer 
= wx.BoxSizer(wx.VERTICAL)
        sizer.Add(wx.StaticText(self, 
-1'请输入用户名和密码'), 0, wx.ALIGN_CENTER | wx.ALL, 5)
        
for eachLabel, eachStyle, eachHandler in self.dataEntries():
            self.CreateEntry(sizer, eachLabel, eachStyle, eachHandler)
        sizer.Add(wx.StaticLine(self, 
-1, size=(20-1), style=wx.LI_HORIZONTAL),
                            0, wx.GROW 
| wx.ALIGN_CENTER_VERTICAL | wx.RIGHT | wx.TOP, 5)
        btnsizer 
= wx.StdDialogButtonSizer()
        
for eachId, eachLabel in self.dataButtons():
            self.CreateButton(btnsizer, eachId, eachLabel)
        btnsizer.Realize()
        sizer.Add(btnsizer, 0, wx.ALIGN_CENTER_VERTICAL 
| wx.ALL, 5)
        self.SetSizer(sizer)
        sizer.Fit(self)
            
    
def CreateEntry(self, sizer, label, style, handler):
        box 
= wx.BoxSizer(wx.HORIZONTAL)
        box.Add(wx.StaticText(self, 
-1, label), 0, wx.ALIGN_CENTER | wx.ALL, 5)
        text 
= wx.TextCtrl(self, -1"", size = (80-1), style = style)
        text.Bind(wx.EVT_TEXT, handler)
        box.Add(text, 
1, wx.ALIGN_CENTER | wx.ALL, 5)
        sizer.Add(box, 0, wx.GROW 
| wx.ALIGN_CENTER_VERTICAL | wx.ALL, 5)
        
    
def CreateButton(self, btnsizer, id, label):
        button 
= wx.Button(self, id, label)
        
if id == wx.ID_OK:
            button.SetDefault()
        btnsizer.AddButton(button)        
        
    
def OnUser(self, event):
        self.user 
= event.GetString()
        
    
def OnPassword(self, event):
        self.password 
= event.GetString()
        
    
def GetValue(self):
        
return (self.user, self.password)
        
#------------------------------------------------------------------------- 

posted @ 2007-10-23 16:37 gyn_tadao 阅读(4186) | 评论 (1)编辑 收藏

将参数文件转化为hash表的脚本

点此下载)在配置脚本的时候,经常需要读入一些参数,为了方便起见有时会把参数整理成参数文件。当这些参数是平行关系的时候,只需要按行读入即可;但是更一般的情况是,如果这些参数存在层次的关系,该怎么读入呢?
比方说,我要写一个带界面的数据库查询工具,该工具的界面大小由初始化参数决定,数据库的连接参数也写入在参数文件中。这样就存在了两类截然不相同类型的数据,最好将它们区分开来。具体形式如下:
size^
    x^
        500
    $
    y^
        500
    $
$
db^
    name^
        tj
    $
    host^
        localhost
    $
    port^
        5432
    $
    id^
        postgres
    $
    pwd^
        7697
    $
$
以上数据存成tj.param文件,再把它整成一个hash表,这样我要取数据库的端口的话就可以用“$param{'db'}->{'port'}->{'val'}”。
脚本如下:
sub getparam{
    my $param = shift;
    my @tmp = ();
    my $tmp = '';
    push @tmp, $param ;
    open PAR, 'tj.para' ;
    while (<PAR>) {
        s/^(\s+)([^\s]*)(\s+)$/$2/;
        chomp;
        if ($_ ne '') {
            s/\^// and do {
                my %tmp = ();
                $tmp[length(@tmp) - 1]->{"$_"} = \%tmp;
                push @tmp, \%tmp ;
                next;
            };
            s/\$// and do {
                if (@tmp>0) {
                    pop @tmp;
                } else {
                    print "logic error: stack has been empty.\n";
                    return 0;
                }
                next;
            };
            $tmp[length(@tmp) - 1]->{"val"} = $_;
        }
    }
    close PAR;
    if (length(@tmp) != 0) { return 0; }
    else {return 1;}
}

1;
存成tjpar.pl,测试一下看看:
use  strict;
require('tjpar.pl');

my %param = ();
getparam(\%param);

print $param{'db'}->{'port'}->{'val'};
会打印出来5432,就成功了;-)

posted @ 2007-08-14 11:21 gyn_tadao 阅读(416) | 评论 (1)编辑 收藏

监测网络并切换ip地址的脚本

最近电信的线路总是受到攻击,一旦出现问题就得切换到联通的线路上去。这样的情况优势甚至出现在晚上下班以后,弄得人疲惫不堪。两条宽带线路接入的机房在另一部门的机房里,那儿有专人值班,所以一般物理上的切换只要打电话拜托几位兄弟就行了。但是服务器机房只有我在看管,所以其上的ip地址切换就不得不亲自前往,甚是麻烦。所以写了一个监测的脚本,每一分钟ping网管一次,如果遇到不通则将ip地址换为联通的。
use Net::Ping;
$count = 0;
$timer = 1;
print "start monitoring...\n";
while(1){
    $p = Net::Ping->new();
    if( not $p->ping('*.*.*.*', 3) ){
        if ($count == 3){
            $count = 0;
            system 'netsh -f c:/interface';
            open FH, '>>c:/transfer_log.txt';
            @current = localtime();
            $index = 0;
            while($index < 6){ $log = $log."\t".shift(@current); }
            print FH $log."\n";
            close FH;
            last;
        }else{
            print 'failed: '.$count."\n";
            $count++;
            sleep 15;
            next;
        }
    }
    print 'success: '.$timer."\n";
    $timer++;
    $p->close();
    sleep 60;
}
其中interface文件是用‘netsh -c interface ip dump > c:/interface’命令导出的网卡信息,稍作修改即可使用。

posted @ 2007-07-22 21:14 gyn_tadao 阅读(504) | 评论 (1)编辑 收藏

bash常用指令备忘

ASCII码:
响铃    7
退格    10
制表符    11
新行    12
换行    12
换页    14
回车    15
转移    33
常用的命令:
ls -a : 显示全部文件包括隐藏文件
vi : 按i进入插入模式,按:进入last line模式,之后按wq保存并退出,按q!强制退出
echo : -n不输出换行
wc : -c字节 -m字符数 -w单词数 -l行数
mv cp : 只需要目标文件夹即可执行拷贝或者移动
ln : -s建立一个可跨越档案系统的软链接,默认情况下显示在同一档案系统中建立硬链接
2> : 标准错误的重定向
cut : -c1-5表示显示行的第一到五个字符,-d: -f1,5表示按冒号分割,然后显示分割出来的第一和五个字段,默认按制表符分割
paste : -d + 将各个文件的行用加号连接,-s合并单个文件的各行为一行
sed : 's/jin/hao/'将jin换位hao,-n '1,2p'显示第一、二行, -n '/jin/p'显示包含jin的行,'1,2d'不显示第一、二行,'/jin/d'不显示包含jin的行
tr : tr '[a-z]' '[A-Z]' < intro将小写母转化为大写(替换字符不可为空),-s用于压缩重复的被替换字符, -d ' '删除空格
grep : -l之显示匹配的文件名,-n显示行号,-v不显示匹配的行, -i不区分大小写
sort : -n将第一字段的值按数字形式来排序,-u不显示重复的行,-r反序排列,+1n跳过第一个字段,+2n -t:按冒号来划分字段,并且跳过前两个字段
uniq : 删除相同的行,-d显示相同的行

posted @ 2007-07-16 07:50 gyn_tadao 阅读(675) | 评论 (0)编辑 收藏

单服务器升级至双机热备实例

摘要:介绍了基于网络的双机热备系统的设计思路以及通过在主备服务器中配置脚本程序,将阅文站服务器升级至双机热备系统的过程。
关键词:双机热备,心跳监测,同步
Abstract: This paper introduce a design method of network based hot standby service system as well as the procedure of upgrade from single document server to hot standby service system by configuring script files on both active and standby server.
Keyword: hot standby service, heartbeat monitor, synchronization


1 :升级方案建立的起因
    目前的内部文件阅读服务器由于使用年代较长,经常出现无响应甚至死机的状况。由于内部文件阅读服务器是我台员工了解并获取规章制度内容和近期活动消息的一个重要途径,所以该服务器的稳定性显得十分重要。就目前的管理情况而言,除了定期的检查之外,一般都是通过阅读者的通报获知服务器处于无响应的状况,很难做到及时发现并处理。
    单纯通过增加检查次数的方法很难收到理想的效果。一来即便达到一天十次检查的量,对于服务器而言仍然是小时单位的数量级,而且只能在工作时间内施行;再者,由于没有配套的同步备份方案,即便发现服务器崩溃,恢复重建所消耗的时间依然相当可观。长时间停机导致信息传达的滞后将直接影响到工作的开展,试想如果这种情况发生在关键性服务器如新闻文稿系统上的话,将造成不可估量的严重后果。
 

2
:网络双机热备的思路
    所要采用的采用双机热备的办法,双机热备即是目前通常所说的 active/standby 方式。当 active 服务器出现故障的时候,通过软件诊测(一般是通过心跳诊断)将 standby 机器激活,保证应用在短时间内完全恢复正常使用。数据同步的方案一般在设计双机热备服务器时制定,比方说使用共享存储器就是个简单方便的解决办法;更加有效的方法的是在编写配置与数据输入输出相关的服务程序,使数据同时写入主备服务器中相关的数据库。但是在本文的例子中,由于文件服务器在建立时是一个单机的形式,所以其中的程序和数据都是针对单机进行设置的,如果要实现传统意义上双机热备的数据同步,需要对原先的网站程序和存储方案做较大的的修改,除开 standby 服务器的费用外,可能还需要另外购买存储设备。在对源文件无法进行修改或者预算有限的情况下,这种代价的方案并不是完全适用。
    为了克服以上的几个局限,我们利用网络代替传统心跳线和传输数据来同步数据,不但利用了现有的网络资源来节省投入的成本,而且在必要的情况下通过建立在不同端口的监听,
standby 服务器甚至可以同时为多台提供不同服务的 active 服务器的备用支持。
    首先,
standby 服务器中配置监控脚本,通过循环心跳检测 active 服务器的生存状况,达到实时监控的目的,一旦发现出错状况就可以采取预先设置的方案及时接管 active 服务器服务。通常情况下,一旦服务器崩溃,其网络功能也将停止,所以可以简单采用 ping 的方法监测 active 服务器;但是更一般的情况是,服务器仅仅是停止了某一项服务,比如网站发布服务或者数据库服务,而其网络联通性依然良好,针对这种情况需要在主备双方配置监测特定服务的信息问答脚本。比方说, active 服务器提供数据库查询服务,在每次接受到来自备服务器的心跳包后, active 服务器执行一次特定的 sql 查询并将查询所得与预期的比对,得到的结果以布尔值的形式传回备服务器,最后由备服务器决定是否接管服务。
    接着,为了保持
active 服务器与 standby 服务器中数据的一致性,需要将 active 服务器上的文件或数据库的更新内容,定期地通过一定的途径同步到备服务器中。对于数据处理不是很频繁的服务器,可以采用定期备份的方式。如需要采取更加细致的做法的话,在被服务器定期备份的基础上, active 服务器可以配置数据更新检测脚本,一旦检测到有数据更新就将其写入同步数据包中,当数据包达到规定大小之后就可用它来同步 standby 服务器。同步数据包大小的设置视乎网络的通畅度和服务器的响应能力而定。在两个条件都较好的情况下,可以采用小数据包的形式,这样做的好处在于主备的同步度较高, standby 服务器在接管服务时可以最大限度再现 active 服务器内容。而在有任何一个条件或者两者都不理想的情况下,需要适当增加数据包的大小。另外,由于目前一些大型的数据库普遍支持触发器,在同步这类数据库时我们可以利用触发器来保存添加、删除和更新的记录操作,很大程度上简化了同步的过程。  

3
:具体的升级方案和主要脚本分析
3.1
:心跳监视
    现在将以上的思路与具体的情况想结合,实现文稿阅读服务器升级至双机热备。由于该服务器提供的是
http 的网页浏览服务,所以在 standby 服务器中只需要配置定期具备获取网页功能的脚本即可以达到判断 active 服务器服务是否正常,换一句换说在做这个特例中 active 服务器的心跳应答是建立在已有的 http 服务上的,无需再建立额外的监听端口。
    以下是备份服务器上的心跳脚本
heartbeat.bat ,心跳间隔为一个小时即 3600 秒, active 服务器域名是 file.zsgd.com standby 服务器为 file-bak.zsgd.com 脚本首先建立了一个无穷循环,在该循环中每隔一个小时使用 LWP::Simple[1] 下载一次阅文站首页的内容,如果下载失败则表示 active 服务器 http 服务失效, standby 服务器将调用 iisweb.vbs[2] 来启动本身的 iis 网站服务。然后用 Net::FTP[3] 登录 zsgd.com 主站的 ftp 下载默认页面文件 default.asp ,修改其中的阅文站链接,使其指向 standby 服务器。最后将修改完的 default.asp 上传至 zsgd.com 主站 ftp ,覆盖原先的文件。

@rem = '--*-Perl-*--
@echo off
if "%OS%" == "Windows_NT" goto WinNT
perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
goto endofperl
:WinNT
perl -x -S %0 %*
if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
if %errorlevel% == 9009 echo You do not have Perl in your PATH.
if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
goto endofperl
@rem ';
#!perl
#line 15
use strict;
use LWP::Simple;
use Net::FTP;
my ( $none, $interval, $ftp, $backserver) = ( '', 3600, undef, 'file-bak.zsgd' );
my $content = $none;
whil(1){
       $content = get 'http://file.zsgd.com/';
       if( $content eq $none ){
              system ' cscript.exe %systemroot%/system32/iisweb.vbs /stop file ';
              system 'cscript.exe %systemroot%/system32/iisweb.vbs /start file';
              $ftp = Net::FTP->new('file.zsgd.com', debug => 0);
              $ftp->login('***', '***');
              $ftp->get('default.asp');
              open FL, '<default.asp';
              open TMP, '>tmp';
              while(<FL>){
                     chomp;
                     $_ =~ s/(.*)(file\.zsgd)(.*)/$1$backserver$3/;
                     print TMP $_."\n";
              }
              close FL; close TMP;
              system 'del default.asp';
              system 'ren tmp default.asp';
              $ftp->put('default.asp');
              $ftp->quit;
       }
       $content = $none;
       sleep $interval;
}
__END__
:endofperl

heatbeat.bat

3.2
:数据同步
    在数据同步方面, msdn 上有关于基于 Microsoft Jet 数据库引擎的 internet 数据库同步的具体方案 [4] ,为 windows 平台上大型数据库的同步提供了良好的途径。但是这次升级的服务器中配置的是小型 access 数据库,而且数据上载周期较长,没有 频繁的删除或者更新数据项的操作。所以出于实验和学习的目的,这里通过配置脚本来实现 internet access 数据库的监视与同步。
    在
active 服务器中配置 datamonitor.bat 脚本监视数据库的更新情况。首先读入参数文件中的数据,该参数文件保存的是前一次脚本运行得到的 access 数据库文件的最后修改时间和其中各个表的数据项 id 值,通过比对本次脚本运行得到的数据库修改时间与最后一次修改时间即可判断数据库在两次脚本运行期间是否更新了数据。一旦发现有更新,脚本将使用 DBD::ADO 连接 access 数据库。首先,检测各个表中 id 值大于前次查询最大 id 的数据记录,这些就是新插入的数据项;再在小于最大 id 值的 id 中检索不重复项,这些是被删除的数据项;接着用本次查询所得的 id 值替换参数文件中的内容;然后将这些数据分类打包,发送给 standby 服务器的数据同步监听脚本;最后做一些必要清理和初始化工作,一个小时后进入下一个周期重复以上的步骤。
    这么做的一个缺点是很难检测更新数据项,虽然理论上可以通过在表中设置更新标记的方法提示数据更新,但是更新标记的修改程序必须嵌入网站程序,这在加密的网页程序中将很难实现,退一步讲如果服务是基于编译了的程序的话,这样的修改将无从谈起。所以从某种程度上表明,重要的数据服务不要建立在文本型的数据库上,对于有同步要求的服务,选择的数据库至少要支持触发过程。在资金允许的前提下,最好使用如
oracle db2 等大型的数据库系统,另外免费的 mysql postgresql 也是不错的选择。

@rem = '--*-Perl-*--
@echo off
if "%OS%" == "Windows_NT" goto WinNT
perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
goto endofperl
:WinNT
perl -x -S %0 %*
if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
if %errorlevel% == 9009 echo You do not have Perl in your PATH.
if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
goto endofperl
@rem ';
#!perl
#line 15
use strict;
use DBI;
my ($PF_INET, $port, $SOCK_DGRAM) = (2, 2345, 2);
my $remote_addr = pack('SnC4x8',$PF_INET,$port,192,168,138,228);
socket(CLIENT, $PF_INET, $SOCK_DGRAM, getprotobyname('udp'));
my $dsn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:/temp/tp.mdb";
my $dbh = DBI->connect("dbi:ADO:$dsn", {PrintError => 0});
my $tbh = $dbh->prepare('select * from pic'); $tbh->execute;
my (@data, @tbl_id, $max_tbl_id, $del_id, @insert_data_ref)= undef;
my ($index, $id, $index_id) = (0, undef, undef);
while(1){
       open TBL, '<tbl-pic';
       open TMP, '>tmp';
       while(<TBL>){ chomp; push @tbl_id, $_ ; } #$_ = atoi $_;
       close TBL;
       $max_tbl_id = $tbl_id[(scalar @tbl_id) - 1];
       while(@data = $tbh->fetchrow_array()){
              $id = $data[0];
              print TMP $id."\n"
              if($id <= $max_tbl_id){
                     $index_id = $tbl_id[$index];
                     while($index_id <= $id){
                            if($index_id < $id){ $del_id .= $index_id."\t"; }
                            $index += 1;
                            if($index < (scalar @tbl_id)){ $index_id = $tbl_id[$index]; }else{ last; }
                     }
              }else{ my @temp = @data; push @insert_data_ref, \@temp; }
       }
       close TMP; system 'del tbl-pic'; system 'ren tmp tbl-pic';
       undef $tbh;
       $dbh->disconnect;
       send(CLIENT,$del_id, 0, $remote_addr);
       foreach my $ref(@insert_data_ref){
              my $item = undef;
              foreach my $field(@$ref){ $item .= $field."\t"; }
              send(UDP_CLIENT, $item, 0, $remote_addr);
       }
       close CLIENT;     
       sleep 3600;
       $dbh = DBI->connect("dbi:ADO:$dsn", {PrintError => 0});
       socket(CLIENT, $PF_INET, $SOCK_DGRAM, getprotobyname('udp'));
       (@tbl_id, $del_id, @insert_data_ref) = undef;
       $index = 0;
}
__END__
:endofperl

tbl-pic-monitor.bat
    在
standby 服务器中配置监听服务脚本用以检查并接受来自 active 服务器更新数据包,接着将接收到的数据中的前缀指示判断该数据是用于插入或是删除,从而再运行下一步的数据库更新操作,最后脚本进入下一个周期的等待监听。

@rem = '--*-Perl-*--
@echo off
if "%OS%" == "Windows_NT" goto WinNT
perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
goto endofperl
:WinNT
perl -x -S %0 %*
if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
if %errorlevel% == 9009 echo You do not have Perl in your PATH.
if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
goto endofperl
@rem ';
#!perl
#line 15
my $dsn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:/temp/tp.mdb";
my ($dbh, $sign, $content) = undef;
my ($buffer, $PF_INET, $port, $SOCK_DGRAM) = (undef, 2, 2345, 2);
my $local_addr = pack('SnC4x8', $PF_INET, $port, 192, 168, 138, 228);
socket(SERVER, $PF_INET,$SOCK_DGRAM, getprotobyname('udp')) or die("$!");
bind(SERVER, $local_addr) or die("$!");
listen(SERVER, 10);
while(1){
       next unless my $remote_addr = recv(UDP_SERVER, $buffer, 100, 0);
       chomp($buffer);
       $dbh = DBI->connect("dbi:ADO:$dsn", {PrintError => 0});
     
($sign, $content) = split $buffer, '::';
       if($sign eq 'add'){
              $dbh->prepare('insert into pic values(?, ?, ?, ?)');
              $dbh->execute(split($content, "\t"));
              $dbh->close;
       }else{
              $dbh->prepare('delete from pic where id = ?');
              foreach my $tmp(split $content, "\t"){ $dbh->execute($tmp); }
       }
       $dbh->disconnect;
}
__END__
:endofperl

tbl-pic-recv.bat 

4
:建立跟踪系统运行的系统日志
    一个成功服务器解决方案的产生,需要后期长时间的跟踪和调试。在建立了基于网络的双机热备系统之后,为了方便了解和检查 active standby 服务器中各个脚本的执行情况,需要对脚本做一些修改,使其能将执行的结果输出并存储到特定的日志文件中,方便管理员通过查询其中的内容来判断系统运行的状况。对于严重的状况,比如 active 服务器 down 机,系统还可以通过发送 email 的方式通知管理员,使其能及时做出反应。
    在心跳监测脚本中,当每个周期运行结束后,向日志文件里记录本周期检测启动成功与否、启动或失效的日期时间和检测得到的
http 反馈内容,如果没有得到内容则发送 email 给指定的管理员。对于数据同步, active 服务器中的脚本将记录本周期同步启动日期时间、数据库文件的最后一次修改时间、数据库连接状况、 socket 客户端启动成功与否及数据发送的结果; standby 服务器中的脚本将记录收到更新数据的时间和所有的数据内容以便于在必要的时候恢复数据库。

参考文献:

[1] perldoc5.8.8 www.perl.org 2006


[1] libwww-perl 的简称,提供一组用以访问 www 资源的简单而持久的 API
[2] IIS 网站管理脚本,在运行 IIS 6.0 的服务器上创建、删除、列出、启动、停止和暂停网站。
[3] 一个提供 ftp 客户端简单功能的类
[4] http://msdn2.microsoft.com/en-us/library/aa140025(office.10).aspx#intrjet4_distribrepset

posted @ 2007-07-08 22:35 gyn_tadao 阅读(1360) | 评论 (1)编辑 收藏

一个学习linux命令的好网站

http://www.linuxcommand.org/
顾名思义,网站的名字就是linux命令的意思。老外的文笔的确要好上一点,不比一些中文资料,虽然是英文但也不会有味如嚼蜡的感觉。有感兴趣的可以去瞧瞧,很基础的一些东西,刚刚可以用于入门。

posted @ 2007-05-24 14:00 gyn_tadao 阅读(702) | 评论 (1)编辑 收藏

转蛮有意思的一段伪代码

result love(boy, girl)
{
    if( boy.有房() and boy.有车() )
    {
        boy.set(nothing);
        return girl.嫁给(boy);
    }
    if( girl.愿意等() )
    {
    while(!(boy.赚钱 > 100,000 and girl.感情 > 8 ) )
    {
        for( day=1; day <=365; day++)
        {
            if( day == 情人节 )
            if( boy.givegirl(玫瑰) )
                girl.感情++;
            else
                girl.感情--;  
            if( day == girl.生日 )
            if( boy.givegirl(玫瑰) )
            {
                girl.感情++;
            }else{
                girl.感情--;
                boy.拼命赚钱();
            }
        }
        if( boy.有房() and boy.有车() )
        {
            boy.set(nothing);
            return girl.嫁给(boy);
        }
        年龄++;
        girl.感情--;
    }
   else return girl.goto( another_boy);
}

posted @ 2007-03-09 09:32 gyn_tadao 阅读(2161) | 评论 (5)编辑 收藏

泡妞三十六计(转)

第一计:铁面计。 随着社会的发展,MM变得越来越凶。女人猛于虎,既要泡得MM,又不要被MM所伤,最好莫如戴上一幅铁面。有铁面护着,说多肉麻的话,脸不红,妹妹玉手打来鼻不酸来眼不花,当的过份英俊曾从寨主处悟得此计。等妹妹累了烦了芳心也就许了,一幅铁面,胜过德才兼备远矣!忠告是此计莫在大洋用,大洋MM太厉害了,简直是老虎中的老虎。此计尤其在开心E族失效,你有铁面计,东方MM有踢屁功。

第二计:打折计。看到一个MM,先要沉得住气。色不迷人人自迷,不要见到MM自家先乱了枪法。再美再傲的MM,都可以打折来看。她盘亮不一定条顺,她是美女,有可能是个草包。无论MM再好,打折打到脚脖子上,也就泯然众人矣。别把MM当回事儿,就成功了一半,威威深信此言。妞无常势,泡无常形,别打折打得太过份,对MM失去兴趣。有位老人家说过,要战略上邈视MM,战术上重视MM。

第三计:秋千计。有过打秋千经验的人知道,要想把秋千荡得高,需要一下一下地加力。泡成功一个MM,也得一下一下地加力。今日加力,明日减力,只能在原处晃荡。除非你是世外高人,三天打鱼,两天晒网,保持MM平衡,否则你只有金枪独抱,眼睁睁瞧着人家妞来妹往。记住了,泡妞要有条理,心急吃不了热豆腐。泡妞如做人,需要一步一个脚印。

第四计:吃草计。好马不吃回头草,所以好马常饿肚子。这个世道,只要MM存在一天,GG的命运就多舛一天。当MM都象狗熊掰棒子般被扔掉,好在你不是狗熊,目前腋下没有夹着棒子也不要紧,可以回过头再遛一圈。许多MM潜的很深,要小心寻找美人鲨的蛛丝马迹。辛GG在九百年前研究过此计,他说蓦然回首,那妞却在,灯火阑珊处。

第五计:高帽计。人都喜欢戴高帽,MM是人,所以MM喜欢戴高帽。懂得拍马屁的GG是好 GG,懂得拍MM马屁的GG更是人中俊杰。此计不容易把握,有些水平高的MM,只有水平很高的马屁才能够被薰倒。嘴甜的GG有妞抱,从实践中走来,还将向实践中走去。薰倒的MM容易下手,不过常倒的MM你千万不要下手,比如要提防东方MM倒地时暗藏兔子蹬鹰式。

第六计:黄花计。黄花计是指青春易逝,许多事许多人转眼就成昨日黄花,杜秋娘JJ在泡妞三百首中说过,花开堪折直须折,莫待无花空折枝。人生行乐能几时,不只是GG遇到一个好MM不容易,MM遇到一个好GG也不容易。一定要抢抓机遇,与时俱进,MM如黄花,转眼花飞去,泡妞工程,时不我待呀!记得有位浪费掉无数宝贵泡妞时间的GG惨痛回忆,“忆往昔,峥嵘岁月稠,只可惜,没有泡妞空悲切,白了少年头。”

第七计:叉饭计。叉饭计是指无论多好饭,总吃一样总会腻的,只有均衡营养,才有利于身体健康。泡妞也是如此道理,才有利于GG们身体健康。你有一天觉得泡某个MM腻了的时候,就要考虑象鱼丝学习,有时候泡米饭MM,有时候泡烧饼MM,泡起妞来健康快乐。饭切忌吃得太饱,MM切忌泡得太多

第八计:土豆计。土豆藤蔓延伸多,土豆就结多远,即使藤蔓被毁,土豆依然可以保存,此计不适用于东方MM,她是生物老师,给她施此计,她挖地三尺也要把土豆刨出来。主旨是泡一个妞要有泡一个妞的收获,不要泡了N个妞,还跟一个妞没泡似的。有个叫保尔的老外说过,GG的一生应该是这样渡过的,当他回首往事,不因虚度年华而悔恨,不因碌碌无妞而感到羞耻,他应该自豪地说……

第九计:射雁计。这条计很老了,不过历久弥新,郎君还是把它写上了,老树也可以开新花嘛!两位古人射大雁讨论怎么吃雁的时候,雁已经飞跑了。看到MM,不要总想着泡到手后如何与她嘿咻,正当你做白日梦的时候,她说不定已经倒在别的GG怀里。射雁计主旨该出手时就出手,手出的不准,是技术问题,手出的不快,是思想问题。

第十计:金钱计。十个MM九个贪财,泡不到MM不要着急。临渊羡鱼,不如退而结网。在她的裙下死掉一百位GG也与你无关,你只须闷声赚银子。等你腰包鼓了,不用你去泡MM,MM排着队来泡你。有钱的GG自然妙语如珠、貌美枪粗、绅士风度、钻石老五。

第十一计:咖啡计。咖啡虽苦可以提神,泡妞虽苦也可以提神。即使你把一位MM泡上了床,也需要知道上床是个力气活。泡妞看起来表面光鲜,其中的酸甜苦辣只有自己知道。有MM的时候自然挺提神,提神过度难免神经衰弱,吃不香,睡不宁,这是典型的泡妞综合症。

第十二计:走狗计。这是普天下GG泡妞时用得最多的一条计,在MM眼睛的柔里,我宁愿做一条走狗,不计时间,不计名利,风雨无阻,无怨无悔。其实也挺有效的,走狗计实在是一条朴实无华的泡妞之计呀,推荐指数五星。

第十三计:台球计。记得有个段子,说女人和台球的区别,女人是杆进球不进,台球是球进杆不进。虽然泡妹妹的和打台球有区别,但目的都是进洞,虽然不能要求象戴维斯享得利基本上杆杆进洞,也得打几杆进一洞吧。台球计怎么样,不好说呀,泡妞如同打台球,十杆进一洞也是胜利。如果你泡妞只为她的心灵不为她的肉体,那整个大洋的GG都要佩服你的高境界。

第十四计:西游计。泡MM好比是师徒四人一马西天取经。泡妞时常不是一个人的事情,而是一群人的事情。一个泡妞三个帮,团结就是力量,大多数MM在群狼面前是没有招架之力的。成功要素是确定一个主泡手,不要妞未泡成,反而自家乱了阵脚,孔夫子有心得,GG之忧,不在泡妞,而在萧墙之内也。

第十五计:臭袜计。穿一个月不洗的袜子逻辑上比穿一天不洗的袜子要臭。一个月不泡妞的GG逻辑上要比一天不泡妞的GG劲头要足。这种劲头对MM来说诱惑力太大了,MM也需要尝鲜的。人活着就需要有活着的劲头,泡妞要有泡妞的劲头。

第十六计:卖柑计。杭有卖柑者,金玉其外,败絮其中,置于市,价十倍,抢购中。MM就是这样,哪怕她是草包,只要长的漂亮,总是泡者云集。虽然漂亮MM都是草包,但是想泡漂亮MM,GG就绝不能是草包。假如你是草包怎么办?很好办,你只需桃花运当头,泡她的GG比你更草包。

第十七计:两面计。外表绅士,暗地流氓,有这两种面孔的人,泡起妞来厉害得不得了。此计前人之途备矣,郎君不想续貂。只说中国的流氓文化。十个GG九个黄,还有一个是流氓。流氓皆是男人中的才俊之士,因此几千年来,流氓泡妞成功率一直居高不下。在诗经里借抱布贸丝泡妞的是小流氓,升官发财的是大流氓,当皇帝的是最大的流氓。你不要自吹泡的妞多,再多还多过皇帝吗?

第十八计:蝴蝶计。你和我是蝴蝶的双翅,停落时挨紧,飞翔时分离。此计运用到妙处,若即若离,如蝶舞动。这是程度较高的GG泡档次较高的MM常用手段。若即若离不是对MM忽冷忽热,而是你的一即一离都要牵动MM的芳心。动心——很奇妙的一件事呀!

第十九计:解牛计。庖丁解牛目无全牛,泡妞有了境界也会目无全妞。庖丁解牛十九年来,游刃有余,看到牛还怵然为戒,视为止,行为迟,动刀甚微;熟练的GG看到MM也都会小心翼翼的。庖丁刀下,牛如土委地;GG枪下,妞如土委地。特别注意,庖丁解牛刀十九年而刀刃若新发于硎,郎君不知道世上有没有GG泡妞十九年还枪如少年新的。泡妞慎之,慎之,泡妞天下之凶器,不得已而为之呀!

第二十计:画饼计。画饼当然是为了充饥。没有泡到MM,拿张MM的片片总是聊胜于无。郎君曾迷惑,把此计定为画饼计呢,还是望梅记呢?最后还是决定画饼吧,因为已经有情圣鱼丝画过饼了,想必画饼比望梅爽一些。望梅的滋味酸酸的,牙倒了可不妙。画饼容易泡妞难,年年画饼不是咱。

第二一计:唐诗计。熟读唐诗三百首,不会吟诗也会淫。爱的生说过,泡妞天才是百分之一的灵感加上百分之九十九的汗水。你流了百分之九十九的泡妞汗水,差不多已经是泡妞天才了。泡妞是个熟练活儿,没有泡到妞吗?不是你运气不好,而是你不熟练。有诗为证泡妞正当午,汗滴禾下土,谁知泡MM,个个皆辛苦。

第二二计:厕所计。不是教你偷窥上厕所的MM啊。你憋着SN的时候想上厕所,或者上厕所只是想在清净一下,抽根烟,然后呢?当然是离开,有谁BT想在厕所呆一辈子。你有很多种原因去泡妞,你有很多种原因把泡到的妞甩开。唉!这就是现实,未泡妞先打算甩妞,是GG的悲哀也是MM的悲哀

第二三计:苹果计。苹果砸脑袋,牛顿第一时间想到万有引力。MM经过面前,你要象牛GG学习,要在第一时间想到泡她。世间诸物道理相通,万有引力定理适用于泡妞定理,有漂亮MM经过时,GG总会感觉到万有引力。泡妞成功与GG质量成正比,距离成反比。你一时没有办法提高质量,只有想办法接近距离,近水楼台先得月,近身GG先得妞。其实MM没有人泡,也是挺寂寞的,让一个MM寂寞,简直是在犯罪。不信咱们可以在东方MM身上做个试验,一天不与东方MM打招呼,看东方MM什么反应。不过这个协议可能达不成,东方MM太招狼爱了。

第二四计:小鲜计。治大国如烹小鲜,泡妞如治国。老子的话意思不是说治大国象是烹小鱼一样容易,而是说烹小鱼时不能总是翻动,会把鱼翻烂的,讲的是无为而治。泡妞到了无为而泡的境界,当然是想泡谁就泡谁。不过无为的难度太大,对初学乍练的GG 只需要记得说话做事要三思而行,废话少说,闲淡事儿少做。每句话,每件事都要起到良好的泡妞效果,要搔到MM痒处,象烹小鲜一样,翻动不多,却是事半功倍。

第二五计:霸王计。郎君不是让GG们温习好《刑法》后搞rape。温柔对许多MM根本没有杀伤力,那就需要来个霸王硬上弓。初中物理教科书中提示我们,泡妞的阻力是恒定的,那泡妞力度越大,泡妞速度越快。当然你使霸王力的时候,一定会遇到MM 的阻力,你用的力一定要超过阻力,否则MM是不会就范的。能不能用霸王计,可以做个小测试,她在街上和一个男人手挽手逛,这时你敢不敢捧起她的脸吻一下,如果不敢,建议你用第二十计吧。

第二六计:睡觉计。如果泡妞萎靡不振,那就好好睡一觉去。你对她朝思暮想,衣带渐宽,她根本不会知道。当面她可以是主,背后就当她是猪好了。睡一觉去吧,明天你可以精神饱满地对她说昨夜一夜未睡,让她的心打鼓去吧。连睡觉都睡不好的GG,怎么能泡得好MM。可以毫不张地说,睡觉是检验泡妞心理素质的唯一标准。

第二七计:开心计。要泡妹妹得先到开心E族贫贫嘴,什么时候练得心花了,眼绿了,嘴油了,就可以泡妞去了。MM喜欢幽默的GG千古不变。梁锦松是怎么泡到伏明霞的,据伏明霞说,梁比较幽默。MM和你在一块儿开开心心的,这时候,你撵MM走,她都舍不得走。建议开心版弄个开心GG比赛,取得名次的皆可出师泡妞。

第二八计:牙婆计:如果没有红娘,张生泡不成莺莺;如果没有王婆,西门庆泡不成潘金莲。中介的力量真是强大呀。不要找GG为你牵线搭桥,顺手牵羊的教训太多了。郎君求学时曾与MM探讨过,要是张生泡红娘,西门庆泡王婆,世界将会怎样?

第二九计:秋鸿计。苏东坡告诫他侄女世上的常用泡妞手段是:人似秋鸿来有信,事如春梦了无痕。春梦无痕说的是三六计计中的最后一计,下文有交待。人似秋鸿说的是泡妞也得讲诚信,虽然女人的别名叫弱智,但女人感觉一向挺灵敏,诚信不诚信,她能感觉到。《礼记[$#8226]中庸》上说,诚者自成也。

第三十计:彩票计。买彩票为了中奖,虽然中奖的可能性很小。泡个好MM和买中头彩的难度差不多。有的GG不见兔子不撒鹰,有的GG的鹰吐血了还是没捕到兔子,但为了泡到合意的MM,GG们还是前赴后继。买彩票看彩经,泡妞看泡经,只能稳稳神罢了,总有总差那么一点的感觉。一道简单的几率题,身材好的MM一百个里也没一个,漂亮的MM一百个里面也没有一个,有素养的MM一百个里面也没有一个,一百的三次方是一百万,好妹妹是百万里挑一呀!。郎君忠告,中五块钱的彩票也是中彩,泡60分的妞也是泡妞。

第三一计:醉酒计。酒是色媒人,MM喝完酒容易搞定。可是现在很多GG不争气,喝酒喝不过MM。伤心ing,不愿多说。

第三二计:克螂计。屎克螂推粪球,武大郎玩夜猫子,什么档次的GG泡什么档次的MM,一般情况下是这样的,非要癞蛤蟆吃天蛾肉,别最后连苍蝇屎都吃不上。羡慕牛粪上插鲜花是正常的心理反应。可你别小瞧牛粪,他必有过人之处。赖汉取仙妻,表面风光,那赖汉背地里不知道承受了多少苦难,能娶到仙妻的赖汉,与伟人相去不远。

第三三计:守拙计。郭靖将守拙计运用得出神入化,所以武功练成了,黄蓉泡成了。非有大智慧不能用此计,郎君只是提一下这种现象罢了,真能达到大巧若拙境界的,哪里还用郎君教他怎么泡妞,都可以当郎君的老师了。郎君就没见过有真傻的小子能泡到好MM的。

第三四计:撞钟计。妞儿寂寞了,总是难免红杏出墙,所以你要时常恐固。做一天和尚撞一天钟,泡一天MM就要多讨好一天MM,不过现在MM挺复杂的,你就是天天临幸她,她也难免对别的GG投怀送抱,不过你对她好一点,她对别的GG投怀的次数少一点。长叹!这世道,出墙少的MM就是好MM,55555555555555555

第三五计:存酒计。郎君从来不会把酒储在一处,否则会酒到喝时尽空瓶,常用的方法是,某处存酒A,某处存酒B,某处……妞到用时方恨少,时常需要诸备一些备用。某处存MM甲,某处存MM乙,某处……

第三六计:飞翼计。苏东坡向侄女这样解释泡妞:“事如春梦了无痕”。李白说得狠:“事了拂衣去,深藏身与名”。GG常吟的一句诗,万花丛中过,片叶不沾身。郎君深明此理,所以将此计为压卷之计,三十六计,走都嫌慢,还是飞来得快

posted @ 2007-03-01 20:23 gyn_tadao 阅读(276) | 评论 (0)编辑 收藏

perl还是python

一度想转到python上的,但是总觉着就这样放弃perl实在有一些不值得。后来在写一个小工程的时候,又用到了perl,还是它比较方便。最近在看《高级perl编程》,的确是一本好书,好多内容是我以前不熟悉或者是模糊的。现在想来,还是先把perl学精通了,再涉足python的好。一来不至于把perl忘得太快,二来有些共通的地方也便于加深理解,最后毕竟在处理一些较小的工程时perl还是有其优势的。

posted @ 2007-01-24 14:51 gyn_tadao 阅读(1516) | 评论 (0)编辑 收藏

仅列出标题
共11页: First 3 4 5 6 7 8 9 10 11 
<2009年1月>
28293031123
45678910
11121314151617
18192021222324
25262728293031
1234567

导航

统计

常用链接

留言簿(15)

随笔分类(126)

随笔档案(108)

相册

搜索

最新评论

阅读排行榜

评论排行榜