2009年4月16日星期四

parrot 鹦鹉 1.0 release

鹦鹉,对于 perl 6 意义重大
相当于真正执行二进制代码的虚拟机
如今,鹦鹉已经 release 了
但是很讽刺地,它现在的发展似乎明显超越了 perl 6 的开发进展

不管怎么说,它的正式发布,还是要恭喜的

2009年4月14日星期二

perl 参数的 I 和 i

perl 参数的 i 和 I 都可以指定路径
其中 I 指定的是文件夹
i 指定的是 pm 文件

比如 /Test 文件夹下有 Teacher.pl 和 Boy.pm 两个文件

../
./
|-Test/
  |-Boy.pm
  |-Teacher.pl

其中 Teacher.pl 调用 Boy.pm 代码
代码如下:


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

package Test::Teacher;
use strict;
use warnings;

use Test::Boy;

my @eth = Test::Boy::getEverything();

foreach(@eth){
print "out: ".$_."\n";
}
#!/cygdrive/c/Perl/bin/perl 
package Test::Boy;
use strict;
use warnings;

my @everything = 1 .. 9;

sub getEverything{
@everything;
}
1 假设当前路径为 /cygdrive/e/pl可以使用
perl Test/Teacher.pl
注:perl 会从 ./ 下寻找 Test::Boy.pm,也就是相当于 -iTest::Boy 参数

2 假设当前路径为 /cygdrive/e/pl/Test 时
则需要使用
perl -I../ Teacher.pl
注:perl 会从 ../ 寻找 Test::Boy.pm
use Foo::Bar 意味着什么
   ——摘自 http://wiki.perlchina.org/Simple_module_tutorial

use Foo::Bar
并不意味着在 @INC 的目录中寻找一个叫做Foo::Bar.pm的模块文件。
它的意思是在@INC的目录中寻找一个叫做‘Foo’的“子目录”,
然后在其中找一个叫做“Bar.pm”的“模块”。
现在,如果我们成功"use"了一个模块,
那么我们就可以通过完整的包路径语法
&PACKAGE::FUNCTION
使用这个模块中的所有函数。
当我们说&Foo::Bar::some_func的时候,
我们指的是“包的名字”而不是那个在use中曾使用的包含路径的文件名。
这会允许你可以在一个use过的文件中包含很多包名字。
实际使用中这些名字通常是相同的。


另外,假设 Teacher.pl 在 Test 文件夹同级

../
./
|test/
| |-Boy.pm
|-Teacher.pl

如果要调用 Boy.pm,也要在 Boy.pm 开头的 package 生命中写清
Test::Boy
即:pm 一定要放在 pm 内与包路径相同的文件夹下,并在文件夹外层调用

vim 7.0 也有 tab 页

古人云:vi 是个好东西

vi 的 buffer 是个不太好看的东西——中文真是博大精深,我主要表达的是不容易看清楚的意思
:ls 是个很好用的命令,但不够直观
用户一定要 ls 一下才能看清楚 buffer 里的东西
这样的操作显然违背了 vi 的特色——让人体任何部位的移动尽量减少,哪怕一毫米

于是,vim 7.0 开始支持 tab(标签页)
gvim 下的 tab 更是直观
最简单常用的用法如下:

netrw 中
t 把光标指向的文件在新标签页中打开
通常模式下
:tabnew 打开一个新的标签页
:tabc[lose] 关闭当前的标签页
:tab help 在一个新标签页中打开帮助
:help :tab 在帮助中打开关于标签页内容
:tab help :tab 在新标签页中打开关于新标签页的帮助

其他的,按以上方法查帮助吧

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
保存后不需要重启,或者被修改帐户重新登录之类。直接使用就行

zzzzZZZZ

zzzzZZZZ