2009年2月9日星期一

几个需要关注的

LDAP 服务器中心控制的认证系统
https://oss.gonicus.de/labs/gosa/

LAMP 安装笔记

老生常谈,发现每次都要去GOOGLE,太烦了,还是记录下来。


[root@localhost /]# cd /home/src/
/*默认把安装包都放在/home/src/目录下*/
[root@localhost src]# tar xvzf httpd-2.2.2.tar.gz
[root@localhost src]# cd httpd-2.2.2
[root@localhost httpd-2.2.2]# ./configure --prefix=/usr/local/apache --enable-so
[root@localhost httpd-2.2.2]# make
[root@localhost httpd-2.2.2]# make install
[root@localhost /]# /usr/local/apache/bin/apachectl start
/*启动Apache*/
/*系统启动时加载apache*/
[root@localhost /]# cp /usr/local/apache/bin/apachectl /etc/rc.d/init.d/httpd
[root@localhost /]# cd /etc/rc.d/rc3.d
[root@localhost rc3.d]# ln -s ../init.d/httpd S80httpd



安装MySQL
[root@localhost /]# cd /home/src/
[root@localhost src]# tar xvzf mysql-standard-5.0.27-linux-i686-glibc23.tar.gz
[root@localhost src]# cd mysql-standard-5.0.27-linux-i686-glibc23
[root@localhost mysql-standard-5.0.27-linux-i686-glibc23]# groupadd mysql
[root@localhost mysql-standard-5.0.27-linux-i686-glibc23]# useradd -g mysql mysql
[root@localhost mysql-standard-5.0.27-linux-i686-glibc23]# more INSTALL-BINARY
/*认真的阅读一下这个文档,就会发现MySQL很容易安装*/
[root@localhost src]#mv mysql-standard-5.0.27-linux-i686-glibc23 /usr/local/mysql
[root@localhost src]# cd /usr/local/mysql/
[root@localhost mysql]# scripts/mysql_install_db --user=mysql
[root@localhost mysql]# chown -R root .
[root@localhost mysql]# chown -R mysql data
[root@localhost mysql]# chgrp -R mysql .
[root@localhost mysql]# bin/mysqld_safe --user=mysql &
/*启动MySQL*/
[root@localhost mysql]# ./bin/mysqladmin -u root password ‘password’
[root@localhost mysql]# ./bin/mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 80 to server version: 5.0.27-standard-log

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql>
[root@localhost mysql]# cp support-files/mysql.server /etc/init.d/mysql
[root@localhost mysql]# vi /etc/init.d/mysql
修改如下定义使其内容为:
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
[root@localhost mysql]# chkconfig --level 345 mysql on
[root@localhost mysql]# service mysql restart
Shutting down MySQL. [ 确定 ]
Starting MySQL [ 确定 ]
[root@localhost mysql]#
到这里MySQL就装好了。


安装Php
[root@localhost /]# cd home/src/php-5.2.0
[root@localhost php-5.2.0]# ./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql --with-apxs2=/usr/local/apache/bin/apxs
[root@localhost php-5.2.0]# make
[root@localhost php-5.2.0]# make install
[root@localhost php-5.2.0]# cp php.ini-dist /usr/local/php/lib/php.ini
编辑Apache配置文件
即/usr/local/apache/conf/httpd.conf,并添加以下一行:
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
并在 DirectoryIndex 一行加上 index.php
/*添加php5模块*/
LoadModule php5_module modules/libphp5.so
保存并退出
测试
建立test.php文件放在apache目录下的htdocs下,内容如下:
phpinfo();
?>
通过浏览器查看http://localhost/test.php


安装phpMyAdmin(可选)
用FTP工具上传phpMyAdmin-2.7.0-pl2到/home/src
[root@localhost src]# mv phpMyAdmin-2.7.0-pl2 /usr/local/apache/htdocs/phpmyadmin
[root@localhost src]# cd /usr/local/apache/htdocs/phpmyadmin
[root@localhost phpmyadmin]# vi config.default.php
$cfg['Servers'][$i]['auth_type'] = 'config'; 将config 改为 http
/*通过浏览器查看http://localhost/ phpmyadmin就可以管理你的MySQL数据库了*/

2009年2月6日星期五

Berkeley DB: C 语言访问从0开始 中文版 Chap1-4

Environment 环境


本手册致力于提供对Berkeley DB函数库的一个介绍。实际上,它描述了如何创建一个非常简单的单线程的应用程序。而且不经意的是,本手册忽略了许多创建简单应用程序所不需要知道重要的DB的数据库引擎的特性。有一个特性是如此重要不可忽视,需要在此进行概要性的介绍: 环境.

虽然环境对于字节锱铢计较的嵌入式环境下的应用程序来说使用可能性极低,但是对于许多其他的应用程序来说并不在乎这么一点小事。环境从本质上来说,是一个或者多个数据库的封装。
打开一个环境之后,你将可以在那个环境之中打开数据库,数据库将因此相对于环境所配置的HOME目录来进行创建和定位。

环境提供了许多单独的数据库服务器所不能提供的特性:

* 多数据库文件

DB可以在磁盘上的一个物理文件中创建多个数据库。这种设计是为了能够使得应用程序能够打开少量的数据库。然而,为了能够使用该特性,你的应用程序必须使用环境文件。

* 多线程和多进程支持
在使用环境文件的时候, DB设置在内存中的缓冲和锁能够被所有在该环境文件中打开的数据库所共享。环境文件使你能够使用DB提供给多线程/进程访问DB数据库的子系统。例如,你可以使用一个环境文件来 使用 CDS (并发数据存储) , 锁子系统, 或者 共享内存缓冲池。

* 事务处理
DB 提供了事务子系统,为数据库写入提供了完整的ACID保护。(what is ACID-protection??) 在环境文件中设置使用事务子系统, 然后序列性的获取事务ID.

* 高可用性(复用)支持

DB 提供了一个复用子系统,使得单个的MASTER数据库能够复用多个只读的复用数据的拷贝。环境文件用于配置和管理这个子系统。

* 日志子系统

DB 为应用程序提供了预写式日志作为高度的灾难恢复对策。一旦激活了该功能,日志子系统允许应用程序通过日志文件中所包含的信息进行两种恢复(普通和catastrophic)

以上所有主题,都在 Berkeley DB Programmer's Reference Guide 中有描述。

2009年2月5日星期四

Berkeley DB: C 语言访问从0开始 中文版 Chap1-3

Database Limits and Portability 数据库限制和可移植性

Berkeley DB提供了对所有数据管理的支持,包括位于内存中的非常小的数据库到巨大的拥有百万级记录和TB级数据的数据库。 DB的数据库能够保存最多256TB的数据。 单独一条记录的KEY或者DATA能偶保存最多4GB 数据。

DB的数据库将数据以二进制形式保存,可以跨平台使用,甚至无需考虑平台的处理器的字节序问题。有一点需要注意的是,在数据可移植性之外,在小端字节序的架构上,会遇到一些性能上的问题。 详细请参见 设置比较函数 以获得进一步的参考。

DB的数据库和数据能够支持并发访问 - 他们是线程安全的,并且他们在多进程的时候也能和平共处。
请注意, 为了能够使多线程可以共享数据库和缓冲,DB所采用的方法使得DB 不能够在 网络共享存储设备上(例如 NFS或者WINDOWS 网络共享)很好的使用。 因此,你不应将DB的数据库和环境放在通过网络共享方式挂接的驱动器上。

Berkeley DB: C 语言访问从0开始中文版 Chap1-1

Chap1-1 Berkeley DB Concepts 概念

在进一步深入之前,将向你描述一些你创建基于DB的应用程序的时候所会遇到的宏观性的概念。

抽象的说,DB数据库中包含着 记录 。 逻辑上,每一条记录标示一个数据库中的独立条目。每一个这样的记录包含两个部分的信息:键 和 数据. 本手册将偶尔使用 一条记录的键 或者 一条记录的数据,这样的名词在 处理一个或者多个数据库记录的语境中。

因为 DB数据库中使用了 key /Data 这样的对子,它们有时被认为是一个有两个子段的关系型数据库表。然而,data (有时是key, 依赖于DB所定义的存取方式) 能够保有非常复杂的数据。常见的伎俩是C语言的结构和其他的构造被存入记录中。这样有效的把一个 只有两个字段的表变为了一个n字段的表,其中n-1个字段是对应着数据结构的成员。

注意,DB数据库非常象一个关系型数据库中的一个表。许多DB应用程序因此需要使用多个DB数据库(就象关系型数据库里面有许多表一样)。

和关系型数据库系统不同的是,一个DB数据库仅仅包含有一个根据给定的存取方式(BTree, Queue, Hash )组织起来的记录集合。在关系型数据库系统中, 底层的存取方式往往被隐藏起来。

一般咸认,基于DB的应用程序应设计为,一个数据库存储一种特定类型的数据(就象在一个关系型数据库中, 一个单独的数据表保存了某种特定方面的数据)因为许多应用程序需要管理许多种数据,故而基于DB的应用程序经常使用到了多个DB数据库。

例如,一个会计应用程序。这种应用程序的数据管理涉及银行账户,记账账户,股票,借贷等等,同时还有客户,银行机构,客户账户等等。在传统的关系型数据库总,所有这些不同种类的信息将被用一系列复杂的数据表进行存储和管理。在基于DB的应用程序中,所有这些信息将被分割并用多个数据库进行存储和管理。

基于DB的应用程序能够通过一个可选的方法,数据库应用环境来更方便的使用多个数据库。更多信息请参考本手册的附录部分的 [[数据库应用环境]]。

利用大部分的DB的API时候,需要使用包含函数指针的特殊结构。这些回调函数称之为方法,因为它们看上去就想一个C++类中的方法,用于访问这些方法的变量,被称为句柄。就象使用一个数据库之前,需要先获得这个数据库的句柄。


从数据库获取数据有时被称为获取记录, 因为用于获取记录的方法叫做 get(). 同样,存入数据库记录被称为写入记录,因为你要调用put().

在使用数据库句柄向DB数据库存入记录的时候,记录将根据该DB数据库定义的排序方式存入。排序大部分都是根据key来进行的, 但是有时也考虑data . 如果存入一条记录,而该记录的key相同的记录已经存在于数据库中, 则新记录将替换老记录。然而,如果该数据库支持重复记录(具有相同的key 但是不同的数据),则新的记录将作为新记录作为重复记录登入数据库,且既存记录不会被覆盖。

如果一个DB数据库支持重复记录,那么你可以通过数据库句柄来仅仅获取重复记录集合中的第一条记录。

在使用数据库句柄时,可以通过一个特殊机制:游标来读写数据。游标是铁杆的迭代器,可以用来遍历数据库中的记录。翻来覆去,前前后后。也可以用游标来定位一条记录。在数据库支持重复记录的时候,游标是唯一的能够存取重复记录集合的方法。

最后,DB提供了一种特殊的数据库,称为第2梯队。
第2梯队为通常的数据库(称为第1梯队以区别于第2梯队)提供索引。第2梯队的数据库非常有趣,因为它们能够保存复杂的数据类型,但是查询到指定记录的话,仅仅需要该记录的key. 如果你希望能够通过某些惨不忍睹的零碎信息查询到一个记录,而且还不是key的话,你就需要用到第2梯队的数据库。

-----

专有名词翻译
secondary database 第2梯队
key 键盘

Berkeley DB: C getting started 从0 开始 Chap1-0

Getting Started with Berkeley DB 中文版

翻译 suning
工程开始日期 2009-02-04


原始版权声明
This documentation is distributed under the terms of the Sleepycat public license. You may review the terms of this license at: http://www.sleepycat.com/download/oslicense.html

Sleepycat Software, Berkeley DB, Berkeley DB XML and the Sleepycat logo are trademarks or service marks of Sleepycat Software, Inc. All rights to these marks are reserved. No third-party use is permitted without the express prior written consent of Sleepycat Software, Inc.

To obtain a copy of this document's original source code, please write to .

11/9/2005

本翻译文稿声明

遵从创作共享协议。

目录
Chapter 1. Introduction to Berkeley DB 介绍


DB 是一个嵌入式的数据库引擎,所以她极端之迅速。你可以将她象其他的程序库一样编译并链接
进入你的程序。这就意味着DB运行在你的应用程序的进程空间中,可以避免访问单独的数据库服
务器时所发生的大量进程间通讯的成本。

作为一个进阶的性能提升手段,DB提供了一个内存中的缓冲来提高你经常使用的数据的访问速度。
一旦配置之后,这个缓冲的使用将对应用程序来说是透明的。她几乎不需要应用程序开发者来关
注她。

在其赤裸裸的高速度之外, DB的可配置性也有两把刷子。她提供了多种组织数据库中数据的方法。
被称为 存取方法,每一个这样的数据组织机制提供了非常不同的特性,以适应于不同的数据管理场
景。(注意,本手册将几乎完全着眼于 BTree 这种存取方式,因为这种方式为大量的数据库应用
程序所采用)

在此配置之上,DB提供了许多子系统,用于提高DB的兼容性。例如,许多应用程序要求写入保护,
用于提供数据的完整性保护,为此,DB能够启动一个事务子系统来对数据库写入提供事务性的访问。

如果要列出在哪些操作系统上可以使用DB, 实在是罄竹难书。笼统的说,它可以运行于所有主流
商业操作系统,包括许多嵌入式平台。

最后,DB还提供了丰富的应用程序接口。Sleepycat官方支持通过C,C++和JAVA的访问,但是还
有许多其他语言的访问DB的应用程序接口,例如脚本语言Perl和Python.

注意:

在你将要使用DB进行一些搞七捻三的活动之前,我要非常郑重的提示未成年人们:
DB不是一个关系型数据库(虽然你可以用她来创建一个关系型数据库)。我忠诚的
坦白,DB没有提供许多高级特性比如触发器, 也没有支持SQL。

DB仅仅使用有限的API集合即可有效的进行数据的存取活动。


关于这个手册

这个地方由于翻译者太懒,认为可以跳过,因此暂不翻译。


---------
专有名词
access method 存取方式

FWD:TCP/IP Socket编程的几点肮脏的问题

1.有客户端开多线程对服务器进行连接断开压力测试,在连接接近4000次时,再也连接不上服务器,过了段时间后恢复正常,而后再出现,如此往复.使用 Prcess Explorer查看System Idle Process发现大量的TIME_WAIT状态下的Socket.
解析如下:
TCP TIME-WAIT 延迟断开TCP 连接时,套接字对被置于一种称为TIME-WAIT 的状态。这样,新的连接不会使用相同的协议、源 IP 地址、目标 IP 地址、源端口和目标端口,直到经过足够长的时间后,确保任何可能被错误路由或延迟的段没有被异常传送。在RFC 793 中,将这种套接字对不被其它连接重新使用的时间长度指定为 2 个MSL(最大段生存时间的 2 倍)或 4 分钟。对于Windows NT 和Windows 2000 来说,这是默认设置。然而,在此默认设置下,某些网络应用程序在很短时间内执行多个出站连接,就可能会在端口收回前用完所有的可用端口。Windows NT 和Windows 2000 提供两种方法来控制这种情况。第一种方法是使用TcpTimedWaitDelay 注册表参数,改变该数值。对于 Windows NT 和Windows 2000,其值最低可设置为30 秒,这样在大多数情况下不会出现问题。每二种方法是使用 MaxUserPorts 注册表参数,来配置用户可访问的临时端口数(用作出站连接的源端口)。默认情况下,当应用程序从系统请求任何套接字用于出站调用时,就会提供一个数值在1024 到 5000 之间的端口。MaxUserPorts 参数可用于设置管理员所允许的出站连接的最大端口值。例如,将该值设置为10,000(十进制),就会有约 9000 个用户端口可用于出站连接。关于这一概念的详细信息,请参见 RFC 793,也可参见MaxFreeTcbs 和 MaxHashTableSize 注册表参数。
注册表位置:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
主动断开的一方进入TIME_WAIT状态,被动断开的一方进入CLOSE_WAIT状态.不要试图使用SO_DONTLINGER设置避免TIME_WAIT状态!!!

2. If you are using I/O completion ports, note that the order of calls made to WSASend/WSARecv is also the order in which the buffers are populated. WSASend//WSARecv should not be called on the same socket simultaneously from different threads, since it can result in an unpredictable buffer order.

Socket 关闭的检测问题
3.作客户端开1024个稳定连接到服务器,然后使用Prcess Explorer强行非法关闭该客户端,1024个连接瞬间被异常断开,服务器将不能检测到所有socket的断开,如果是完成端口,即时当前打开KeepAlive,即时当前正在执行异步WSARecv, GetQueuedCompletionStatus 仍然可能无法返回正确的错误提示客户端关闭! Socket资源将残留.原来我以为仅在瞬间断电,操作系统崩溃,网线拔开这3种情况下才会发生该现象,看来进程崩溃也可以导致,只是以前的socket 数量不足以让操作系统来不及处理.

2009年2月4日星期三

Solaris 10 和 Berkeley DB

Berkeley DB 似乎作为 Sun Studio 11的一个部分提供了
SunOS 5.10 Generic_120011-14 sun4v sparc SUNW,SPARC-Enterprise-T5220 Solaris

$pkginfo |grep -y Berkeley
application SUNWbdb BerkeleyDB-Base 4.2.52 (sun-private) Solaris Sparc 32-bit and 64-bit Architecture
application SUNWbdbj BerkeleyDB-Java(sun-private) 4.2.52 Solaris Sparc 32-bit and 64-bit Architecture

它被安装在
/usr/local/BerkeleyDB.4.2

Berkeley DB Related Links

Oracle Berkeley DB Homepage
http://www.oracle.com/technology/products/berkeley-db/index.html

Berkeley DB Online Manual
http://www.berkeleydb.net/man/bdb/index.html

Berkeley DB 的wikipedia 项目中提到了一本书
APress -The Berkeley DB book
该书有PDF版本,可以从如下链接访问

http://www.ebookee.com.cn/The-Berkeley-DB-Book_152798.html

2009年2月2日星期一

被隐藏的时光

有人说, 男人的26岁-29岁是一段被隐藏的时光。
我第一次为这种全称命题而共鸣。

原文LOME http://lome.blogcn.com/diary,21278466.shtml

我实在是太好奇了。可是他们都不肯告诉我,那个时候他们都在干什么。其中一个男人将手指放在嘴唇中间做收声状,诡秘的笑着说:“那是个秘密。”

这是一次朋友聚会上发生的小片段。当时的我,正在被一段感情所折磨,恨不得写一本有关男人成长史的言情小说来明志。我以为我已经挺了解那个男人了,结果还没动笔,就在心里打打提纲就觉得好像有一块时光被隐藏起来了,那段人生经历在我的脑海里仿佛是空白的一样,我确信他从来没有与我讲过那段时光的故事。所以,看着酒桌上一堆意气风发的中年男人们正在高谈阔论,我喝了杯酒,就突然心里一动,问道:你们26岁到29岁那段日子里都在干嘛?

然后他们都楞了一下,有个男人笑着说,不告诉你。另外一个人就是前面竖起手指的那个,还有一个人貌似正常的说,那时候啊,就上班呗,然后结婚了,过日子,还没离开原来的单位。等等等等。……最后大家说了不少,但我还是不知道,那段日子里都发生了什么,一个意气风发的男青年,就这样朝深沉稳妥的中年男人走过去了。当然,我的小说看来是写不出了。因为我后来有意识的问过很多中年男人,得到的,始终是一个语焉不详的含糊的答案。

我觉得我爱的那个男人跟我隐藏了他人生最关键的时光。当然,他肯定不是故意的,我当时也没想起来问。男人们在恋爱的时候总是喜欢回忆过去。是的可那是好遥远的过去:他会讲他小时候家人的关系,小学时分食一块糖的童年伙伴,中学时的死党和变态的老师……最多提提大学同寝室的兄弟,毕业之后的那段人生就开始模糊,已经身居高位的男人自然可以轻描淡写的说一句“我刚毕业的第一份工作是收泥沙船的过路费”,但是再往后的狗血残酷岁月,他绝对会轻描淡写带过。不知道他们是不是只有在女人面前才会无意识的隐瞒这段岁月,而女人们想起她们的爱人,心目中总是浮现出那个安静乖巧的孩子、倔强叛逆的少年、意气风发的才子……那是男人们在回忆过去的时候在女人们心里树立的形象,女人会因此而爱上他,说起来为事业打拼是件事后回想起来还满酷的事情,可是当时呢,做一个卑微的推销员所遭遇过的内外交织的创伤,绝不会是回忆录上的笑话那么简单。

就好像女人也总喜欢怀念自己的“被追求史”,却很不愿意回想被男人拒绝的状态一样,那些被隐藏的时光,后来和男性朋友聊到多了,其中一名隐晦的透露了一些关节所在:假如没有什么意外,大部分男人的26-29岁之间是个很微妙的年纪。那时候他们已经工作了几年,不像当年才毕业那么意气风发和没头脑,反而因为知道得越多而开始越谦卑;那时候的他们在事业上还很迷茫,从被人使唤的年轻人到了一个面临打开局面进入上升通道的野心家。有的人因此成功了,但是付出了常人不能的血泪汗水,有的人还是很平庸,但是让他在那个年纪就甘愿承认这一点是非常痛苦的事情。此外,他们大多数在这个年纪结了婚——无论他是否真的懂得了感情。这样的日子在日后回想起来有感动也有叹息,更多的是对当年自己的一副傻样更不忍回首。所以,这是个尴尬的年纪。男人们面临着内心的转折,也面临着人生道路的选择,这一切并不像小说中描写得那么传奇和奋斗,而是一个男人隐忍着不断磨砺自己的过程——来之不易或失去太多都容易让幸福和成就感打了折扣,所以,这难道是他们内心回避这段时光的最真实的潜意识?

所以,男人们其实有种纯真的情怀:他总是想让你认识到他是聪明的、纯真的、好玩的、善良的,所以他们愿意给女人们讲述少年故事,和自己现在的故事(这个时候他们的人生观世界观已经足够丰满成熟了),而中间那段被隐藏的时光,是他们曾经的伪装、矫饰、为了达到目的不惜代价的努力、与现实无奈的妥协、某段深刻的感情……若细细回想,也许一切都有点带着被伤害的影子。

所以,在那段被隐藏的时光之外,你只看见了一个中年男人现在的优秀杰出,和他年少时候的纯真情怀。仿佛,他一夜之间就长大了。