显示标签为“computech”的博文。显示所有博文
显示标签为“computech”的博文。显示所有博文

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年2月5日星期四

perl cheatsheet(from perldoc)


下面是个关于 Perl 的 CheatSheet,也就是那种什么也没学的时候就先背下来,以后越学越受用的关键内容
格式……很讨厌,是从 perldoc 搞来的
blogger 的 css 让我搞了半天啊
绝对不做美工,果然要遭报应的……

CONTEXTS SIGILS ARRAYS HASHES
void $scalar whole: @array %hash
scalar @array slice: @array[0, 2] @hash{'a', 'b'}
list %hash element: $array[0] $hash{'a'}
&sub
*glob SCALAR VALUES
number, string, reference, glob, undef
REFERENCES
\ references $$foo[1] aka $foo->[1]
$@%&* dereference $$foo{bar} aka $foo->{bar}
[] anon. arrayref ${$$foo[1]}[2] aka $foo->[1]->[2]
{} anon. hashref ${$$foo[1]}[2] aka $foo->[1][2]
\() list of refs
NUMBERS vs STRINGS LINKS
OPERATOR PRECEDENCE = = perl.plover.com
-> + . search.cpan.org
++ -- == != eq ne cpan.org
** < > <= >= lt gt le ge pm.org
! ~ \ u+ u- <=> cmp tpj.com
=~ !~ perldoc.com
* / % x SYNTAX
+ - . for (LIST) { }, for (a;b;c) { }
<< >> while ( ) { }, until ( ) { }
named uops if ( ) { } elsif ( ) { } else { }
< > <= >= lt gt le ge unless ( ) { } elsif ( ) { } else { }
== != <=> eq ne cmp for equals foreach (ALWAYS)
&
| ^ REGEX METACHARS REGEX MODIFIERS
&& ^ string begin /i case insens.
|| $ str. end (before \n) /m line based ^$
.. ... + one or more /s . includes \n
?: * zero or more /x ign. wh.space
= += -= *= etc. ? zero or one /g global
, => {3,7} repeat in range /o cmpl pat. once
list ops () capture
not (?:) no capture REGEX CHARCLASSES
and [] character class . == [^\n]
or xor | alternation \s == whitespace
\b word boundary \w == word characters
\z string end \d == digits
DO \S, \W and \D negate
use strict; DON'T
use warnings; "$foo" LINKS
my $var; $$variable_name perl.com
open() or die $!; `$userinput` use.perl.org
use Modules; /$userinput/ perl.apache.org
  FUNCTION RETURN LISTS
stat localtime caller SPECIAL VARIABLES
0 dev 0 second 0 package $_ default variable
1 ino 1 minute 1 filename $0 program name
2 mode 2 hour 2 line $/ input separator
3 nlink 3 day 3 subroutine $\ output separator
4 uid 4 month-1 4 hasargs $| autoflush
5 gid 5 year-1900 5 wantarray $! sys/libcall error
6 rdev 6 weekday 6 evaltext $@ eval error
7 size 7 yearday 7 is_require $$ process ID
8 atime 8 is_dst 8 hints $. line number
9 mtime 9 bitmask @ARGV command line args
10 ctime just use @INC include paths
11 blksz POSIX:: 3..9 only @_ subroutine args
12 blcks strftime! with EXPR %ENV environment

2007年3月1日星期四

FSTAB 和 MTAB 文件

这是两个很危险的文件!没有他们,计算机将找不到驱动器设备和分区。修改前一定要做好备份。

/etc/fstab
本文件描述了各种不同的文件系统。"fsck"和"mount"等命令都需要这些文件才能工作。看起来有点复杂,不过其实只要我们把这个文件拆分成下面几个部分后,一切都会变得很清晰。清往下看:
(另一种理解:/etc/fstab 文件的存在价值就是,让计算机内的程序能知道如何寻找各个分区)
例:
< 分区 >< 挂载点 >< 文件系统 > < 选项 >< dump >< fsck order >
/dev/hdb1 . . . . / . . . . . . . . . . . . ext3 . . . . . . . . . defaults . . . . . . . 1 . . . . . . . . . 1
/dev/hdb6 . . . . /home. . . . . . . ext3 . . . . . . . . . defaults . . . . . . . 1 . . . . . . . . . 2
/dev/hdb5 . . . . swap . . . . . . . . swap . . . . . . . . defaults . . . . . . . 0 . . . . . . . . . 0
/dev/hda1 . . . . /mnt/win_c vfat . . . iocharset=iso8859-1,codepage=850,umask=0 0 0
none . /mnt/cdrom . . supermount dev=/dev/hdc,fs=auto,ro,--,iocharset=iso8859-1,codepage=850,umask=0 0 0
none . /mnt/floppy supermount dev=/dev/fd0,fs=auto,--,iocharset=iso8859-1,sync,codepage=850,umask=0 0 0
/dev/sda1 /mnt/memory_card auto user,iocharset=iso8859-1,kudzu,codepage=850,noauto,umask=0,exec 0 0
前面列比较好理解,<分区><jiazaidian><文件系统><加载选项>。比较特殊的是最后两列,重点说明一下
dump:转存列,被转存工具调用,用来决定是否备份文件系统。1表示备份,0表示不备份。本文档不会涉及转存工具的工作细节。
fsck order:fsck顺序列,表明系统启动时,fsck 检查文件系统的顺序。0表示不检查,CD和软盘之类的可以动存储设备需要指定为这个值。大于1的值告诉fsck启动时需要检查这个文件系统。数字大小决定开机时检测这个文件系统的顺序。

/etc/mtab
这个文件记录已经加载的设备,本文件在 mount 命令执行后自动更新
另外,本文件和 fstab看起来很相像,但是又不完全相同(注意 rw 和 ro 是 keduxie 和 只读 的意思),本文件中列出的,都是已经加载好的设备
例:
/dev/hdb1 / ext3 rw 0 0
none /proc proc rw 0 0
none /proc/bus/usb usbdevfs rw 0 0
none /dev devfs rw 0 0
none /dev/pts devpts rw,mode=0620 0 0
/dev/hdb6 /home ext3 rw 0 0
none /mnt/cdrom supermount ro,dev=/dev/hdc,fs=auto,--,iocharset=iso8859-1,codepage=850,umask=0 0 0
none /mnt/cdrom2 supermount ro,dev=/dev/scd0,fs=auto,--,iocharset=iso8859-1,codepage=850,umask=0 0 0
none /mnt/floppy supermount rw,sync,dev=/dev/fd0,fs=auto,--,iocharset=iso8859-1,codepage=850,umask=0 0 0
/dev/hda1 /mnt/windows vfat rw,iocharset=iso8859-1,codepage=850,umask=0 0 0
/dev/hdb7 /usr ext3 rw 0 0
/dev/sda1 /mnt/memory_card vfat rw,nosuid,nodev,iocharset=iso8859-15,codepage=850,umask=0,user=julia 0 0

2007年2月24日星期六

JBoss,oracle连接池 简单配置

驱动:拷贝oracle数据库的jdbc驱动程序到[$jboss_home]/server/default/下

配置:在[$jboss_home]/server/default/oracle-ds.xml文件中修改Oracle数据库连接的本地配置

使用:java建立连接代码如下:
//通过连接池连接数据库
try {
InitialContext ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup

("java:/OracleDS");
Connection conn = ds.getConnection();
out.println("数据库连接成功");
conn.close();
} catch (Exception e) {
out.println("数据库连接失败");
}

2007年2月14日星期三

Struts主要类

ActionServlet 类

您还记得函数映射的日子吗?在那时,您会将某些输入事件映射到一个函数指针上。如果您对此比较熟悉,您会将配置信息放入一个文件,并在运行时加载这个文件。函数指针数组曾经是用 C 语言进行结构化编程的很好方法。

现在好多了,我们有了 Java 技术、XML、J2EE,等等。Struts 的控制器是将事件(事件通常是 HTTP post)映射到类的一个 servlet。正如您所料 -- 控制器使用配置文件以使您不必对这些值进行硬编码。时代变了,但方法依旧。

ActionServlet 是该 MVC 实现的 Command 部分,它是这一框架的核心。 ActionServletActionActionFormActionForward 。如前所述, struts-config.xml 文件配置该 Command。在创建 Web 项目时,您将扩展 ActionActionForm 来解决特定的问题。文件 struts-config.xml 指示 ActionServlet 如何使用这些扩展的类。这种方法有几个优点: (Command) 创建并使用

  • 应用程序的整个逻辑流程都存储在一个分层的文本文件中。这使得人们更容易查看和理解它,尤其是对于大型应用程序而言。
  • 网页设计人员不必费力地阅读 Java 代码来理解应用程序的流程。
  • Java 开发人员也不必在更改流程以后重新编译代码。

可以通过扩展 ActionServlet 来添加 Command 功能。

ActionForm 类

ActionForm 维护 Web 应用程序的会话状态。 ActionForm 是一个抽象类,必须为每个输入表单模型创建该类的子类。当我说 输入表单模型 时,是指 ActionForm 表示的是由 HTML 表单设置或更新的一般意义上的数据。例如,您可能有一个由 HTML 表单设置的 UserActionForm 。Struts 框架将执行以下操作:

  • 检查 UserActionForm 是否存在;如果不存在,它将创建该类的一个实例。
  • Struts 将使用 HttpServletRequest 中相应的域设置 UserActionForm 的状态。没有太多讨厌的 request.getParameter() 调用。例如,Struts 框架将从请求流中提取 fname ,并调用 UserActionForm.setFname()
  • Struts 框架在将 UserActionForm 传递给业务包装 UserAction 之前将更新它的状态。
  • 在将它传递给 Action 类之前,Struts 还会对 UserActionForm 调用 validation() 方法进行表单状态验证。 注: 这并不总是明智之举。别的网页或业务可能使用 UserActionForm ,在这些地方,验证可能有所不同。在 UserAction 类中进行状态验证可能更好。
  • 可在会话级维护 UserActionForm

注:

  • struts-config.xml 文件控制 HTML 表单请求与 ActionForm 之间的映射关系。
  • 可将多个请求映射到 UserActionForm
  • UserActionForm 可跨多页进行映射,以执行诸如向导之类的操作。

Action 类

Action 类是业务逻辑的一个包装。 Action 类的用途是将 HttpServletRequest 转换为业务逻辑。要使用 Action ,请创建它的子类并覆盖 process() 方法。

ActionServlet (Command) 使用 perform() 方法将参数化的类传递给 ActionForm 。仍然没有太多讨厌的 request.getParameter() 调用。当事件进展到这一步时,输入表单数据(或 HTML 表单数据)已被从请求流中提取出来并转移到 ActionForm 类中。

注:扩展 Action 类时请注意简洁。 Action 类应该控制应用程序的流程,而不应该控制应用程序的逻辑。通过将业务逻辑放在单独的包或 EJB 中,我们就可以提供更大的灵活性和可重用性。

考虑 Action 类的另一种方式是 Adapter 设计模式。 Action 的用途是“将类的接口转换为客户机所需的另一个接口。Adapter 使类能够协同工作,如果没有 Adapter,则这些类会因为不兼容的接口而无法协同工作。”(摘自 Gof 所著的 Design Patterns - Elements of Reusable OO Software )。本例中的客户机是 ActionServlet ,它对我们的具体业务类接口一无所知。因此,Struts 提供了它能够理解的一个业务接口,即 Action 。通过扩展 Action ,我们使得我们的业务接口与 Struts 业务接口保持兼容。(一个有趣的发现是, Action 是类而不是接口)。 Action 开始为一个接口,后来却变成了一个类。真是金无足赤。)

Error 类

UML 图(图 6)还包括 ActionErrorActionErrorsActionError 封装了单个错误消息。 ActionErrorsActionError 类的容器,View 可以使用标记访问这些类。 ActionError 是 Struts 保持错误列表的方式。



图 7. Command (ActionServlet) 与 Model (Action) 之间的关系的 UML 图

Relationship of ActionServlet to Action

ActionMapping 类

输入事件通常是在 HTTP 请求表单中发生的,servlet 容器将 HTTP 请求转换为 HttpServletRequest 。控制器查看输入事件并将请求分派给某个 Action 类。 struts-config.xml 确定 Controller 调用哪个 Action 类。 struts-config.xml 配置信息被转换为一组 ActionMapping ,而后者又被放入 ActionMappings 容器中。(您可能尚未注意到这一点,以 s结尾的类就是容器)

ActionMapping 包含有关特定事件如何映射到特定 Action 的信息。 ActionServlet (Command) 通过 perform() 方法将 ActionMapping 传递给 Action 类。这样就使 Action 可访问用于控制流程的信息。

ActionMappings

ActionMappingsActionMapping 对象的一个集合。

摘自:《Struts,MVC的一种开放源码实现》,IBM.com

2006年11月2日星期四

pbcat...是pb建立的系统表

当PowerBuilder第一次连接SQL Server时,它要在用户数据库中建立它的扩展属性数据字典,一共有五个以“pbcat"为前缀的表,它们分别是:pbcatcol(字段), pbcatedt(编辑风格),pbcatfmt(格式),pbcattbl(表),和pbcatVld(规则)。这就是所谓的PowerBuilder 系统表,当你在DB Painter中增加或者删除表字段时,相应地在pbcatcol和pbcattbl表中有一条相关记录手插入或删除。如果增加扩展属性,那么在 pbcatfmt,pbcatvld和pbcatedt表中,会建立相应的记录。

解决mysql odbc connector找不到pbcattbl表的错误

最近几天用pb(powerbuilder)作前台,与mysql数据库使用mysql odbc connector连接
当时懒,没有重新建一个数据库或者用户,直接用root账户登陆test数据库
结果在pb中打开sql的时候就会出现以下错误提示:

SQLSTATE = S0002
[MySQL][ODBC 3.51 Driver][mysqld-4.0.12-nt] Table 'root.pbcattbl' doesn't exist.

另外在数据窗口中不能编辑从数据库中提取数据的控件——只要选中该控件,立刻出现内存只读错误,并退出pb

我在google上没有找到中文的相关问题解决方案,甚至没有人讨论这个问题
E文文章倒是有提出的,可是解答得乱七八糟,我看了几篇都没什么帮助

仔细看数据库中的现有表,发现存在一个test.pbcattbl的表
后来考虑root.pbcattbl因该是在root数据库下需要一个pbcattbl表,那么这个驱动程序为什么会需要在这样一个位置寻找表呢?我的服务器中根本没有名为root的数据库,而这个数据库的名字又刚好和我的登陆用户名一致,因此我怀疑这个驱动程序可能是寻找这样一个表:与当前登陆用户同名的数据库中,需要有一个名为pbcattbl的表

因此我重新建立一个用户test,并把pb中的连结和登陆数据库的用户全部改为test

当前问题解决

仍然不理解的是,这个表内容是空的,我不明白pbcattbl表是做什么用
由该表导出的SQL语句如下:

DROP TABLE IF EXISTS `test`.`pbcattbl`;
CREATE TABLE `test`.`pbcattbl` (
`pbt_tnam` char(65) NOT NULL,
`pbt_tid` int(11) default NULL,
`pbt_ownr` char(65) NOT NULL,
`pbd_fhgt` smallint(6) default NULL,
`pbd_fwgt` smallint(6) default NULL,
`pbd_fitl` char(1) default NULL,
`pbd_funl` char(1) default NULL,
`pbd_fchr` smallint(6) default NULL,
`pbd_fptc` smallint(6) default NULL,
`pbd_ffce` char(18) default NULL,
`pbh_fhgt` smallint(6) default NULL,
`pbh_fwgt` smallint(6) default NULL,
`pbh_fitl` char(1) default NULL,
`pbh_funl` char(1) default NULL,
`pbh_fchr` smallint(6) default NULL,
`pbh_fptc` smallint(6) default NULL,
`pbh_ffce` char(18) default NULL,
`pbl_fhgt` smallint(6) default NULL,
`pbl_fwgt` smallint(6) default NULL,
`pbl_fitl` char(1) default NULL,
`pbl_funl` char(1) default NULL,
`pbl_fchr` smallint(6) default NULL,
`pbl_fptc` smallint(6) default NULL,
`pbl_ffce` char(18) default NULL,
`pbt_cmnt` varchar(254) default NULL,
UNIQUE KEY `pbcatt_x` (`pbt_tnam`,`pbt_ownr`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


看各列名字,貌似用来存储和管理本库中用户信息的……

zzzzZZZZ

zzzzZZZZ