2009年4月13日星期一

perl socket

一个服务端

#!/cygdrive/c/Perl/bin/perl -w

use strict;
use warnings;

use IO::Socket;
use Tk;

sub sendf{
my $socket=IO::Socket::INET->;new(
       PeerHost      => 'localhost',
       Protor        => "tcp",
       PeerPort      => 3067
       );
die "no socket $@ \n" until $socket;
print "client created \n";

print $socket "client say: ".shift."\n";
$socket->;flush();
close($socket);
}

my $mw = MainWindow->;new;
$mw->;Button(    -text=>"say hello",    -command=>sub{sendf("Hello, server!");}    )->pack;

MainLoop;
一个客户端(只有一个按钮,按一下,就去跟服务器发消息)

#!/cygdrive/c/Perl/bin/perl 

use strict;
use warnings;

use Tk;
use IO::Socket;

my $socket = IO::Socket::INET->;new(
LocalHost      => 'localhost',
Proto          => "tcp",
LocalPort      => 3067,
Listen         => 5
) or die 'no socket $@ \n';
print "server created \n";

while(my $nsocket = $socket->;accept()){
while(defined (my $buf = <$nsocket>;))
{
   print "\n$buf";
}

}

close($socket);
print "server finished\n";
注意
服务器端 socket 创建时,listen 参数一定要设定,否则不会报错,但服务器不会被 accept() 阻塞

2009年4月11日星期六

sudo

sudo 功能不赘述,修改权限时,用 visudo 很安全——校验文件配置是否正确,如果不正确,在保存退出时就会提示你配置出错位置。
但我还是喜欢真正的vim。修改执行权限可以通过 vim:
vim /etc/sudoers

编辑中,支持别名(alias,跟变量差不多含义)

Alias主要分成4种
Host_Alias
Cmnd_Alias
User_Alias
Runas_Alias

1) 配置Host_Alias:就是主机的列表
Host_Alias HOST_FLAG = hostname1, hostname2, hostname3
2) 配置Cmnd_Alias:就是允许执行的命令的列表
Cmnd_Alias COMMAND_FLAG = command1, command2, command3
3) 配置User_Alias:就是具有sudo权限的用户的列表
User_Alias USER_FLAG = user1, user2, user3
4) 配置Runas_Alias:就是用户以什么身份执行(例如root,或者oracle)的列表
Runas_Alias RUNAS_FLAG = operator1, operator2, operator3
5) 实际上最终目标是要拼成如下格式
配置权限的格式如下:
USER_FLAG HOST_FLAG=(RUNAS_FLAG) COMMAND_FLAG
如果不需要密码验证的话,则按照这样的格式来配置
USER_FLAG HOST_FLAG=(RUNAS_FLAG) NOPASSWD: COMMAND_FLAG

配置示例:
# sudoers file.
#
# This file MUST be edited with the 'visudo' command as root.
#
# See the sudoers man page for the details on how to write a sudoers file.
#

# Host alias specification
Host_Alias EPG = 192.168.1.1, 192.168.1.2

# User alias specification

# Cmnd alias specification
Cmnd_Alias SQUID = /sbin/shutdown, /bin/rm

# Defaults specification

# User privilege specification
root ALL=(ALL) ALL
support EPG=(ALL) NOPASSWD: SQUID

# Uncomment to allow people in group wheel to run all commands
# %wheel ALL=(ALL) ALL

# Same thing without a password
# %wheel ALL=(ALL) NOPASSWD: ALL

# Samples
# %users ALL=/sbin/mount /cdrom,/sbin/umount /cdrom
# %users localhost=/sbin/shutdown -h now

注意
涉及到路径时最好写绝对路径
每行中间的空格,可以是 tab
保存后不需要重启,或者被修改帐户重新登录之类。直接使用就行

2009年3月31日星期二

openfire is very easy to use


本地试验,运行了个 xmpp 聊天服务器,很简单,很好用
openfire 作为服务器端,非常简单
中文控制台界面,足够了

2009年3月27日星期五

Debian 5 lost eth0

我弄丢了我虚拟机上的的 eth0!

最近我做得最大的动作,就是把我的 Debian 4 升级到 Debian5
——其实那已经是很久以前的事情了,但当时可能用的是 apt-get upgrade,所以不知不觉就升级上来了
当我突然发现版本号变化的时候,赶快去看了看这个最大版本号的升级带来了什么

我感兴趣的大概只有两件事
1. apt-get 系列改为 aptitude——仅凭这一点,就足以升级一个大版本号了
2. log 系统改为 rsyslog——其实这影响也不大,直接用 aptitude install 一下新的,就可以自动删除两个旧的 log 服务器了

以上更新完之后,重启
然后……我发现不能连接网络啦!!

ifconfig 的结果是只有 lo,没有eth0
这是一个很奇怪的现象,而这个现象显然不是来自系统升级——因为早就升级过了
刚做过的动作只是安装了 aptitude 和改变了 log 服务
但是这与网络没什么关系

上网查询了一下处理方法,有人说执行以下 dhconfig 就可以解决
试了一下,可行
但是重启之后还是要再次执行

很不甘心地检查了一下启动日志,发现出现了一个很诡异的 eth1
并且在 dhconfig 的时候,似乎也是通过配置 eth1 来使用网络的

目前问题原因仍在查询中,但更加合理的临时处理方案是,把
/etc/network/interfaces
文件里的 eth0 改成 eth1

这个方法对于有既存脚本针对 eth0 的人,显然不好用的
不过我可以暂时应付一下

另:
grep /var/log/kern.log
看到许多 udev: renamed network interface eth0 to eth1

2009年3月9日星期一

发现 Groovy

很眼馋 C++ 有 lua
我一直在寻找 Java 的脚本语言
最近发现 Groovy,也发现我不知道的脚本语言的用法——闭包

zzzzZZZZ

zzzzZZZZ