<?xml version="1.0" encoding="GB2312"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:admin="http://webns.net/mvcb/"
	xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">

	<channel>
		<title>
			<![CDATA[allie的博客]]>
		</title>
		<link>http://allie.bokee.com/index.html</link>
		<description>
			<![CDATA[欢迎访问allie的博客]]>
		</description>
		<dc:language>zh-cn</dc:language>
		<dc:creator>email</dc:creator>
		<dc:date>2007-08-25T18:37:21Z</dc:date>
		<admin:generatorAgent rdf:resource="http://blog.bokee.com.com" />
	
					<item>
				<title>
					<![CDATA[Subversion 基于 Apache 使用时用户权限的管理]]>
				</title>
				<link>http://allie.bokee.com/3832984.html</link>
				<description>
					<![CDATA[<p><p>Subversion 项目和用户权限配置指南：</p><p>一、Subversion 的两种使用方式：<br />&nbsp;&nbsp;&nbsp; 1、Apache 站点方式；<br />&nbsp;&nbsp;&nbsp; 2、本地命令行方式。<br />&nbsp;&nbsp;&nbsp; 当然，我们也可以通过客户端来进行访问，但那也必须先建立上述<br />两种访问接口。</p><p><br /></p><p>二、Apache 方式的配置<br />&nbsp;&nbsp;&nbsp; 第一种方式我们需要安装 Apache 服务器程序，同时需要安装两个模</p><p>块：<br />&nbsp;&nbsp;&nbsp; mod_dav_svn&nbsp;&nbsp; 以及&nbsp;&nbsp; mod_authz_svn<br />&nbsp;&nbsp;&nbsp; 他们可以在 Subversion 的站点上找到，请在附录中查找链接。<br />&nbsp;&nbsp;&nbsp; 将所有需要的模块安装之后，我们必须编辑 Apache 的配置文档，让</p><p>其将我们要用的模块装载。一般来说，Apache 的配置文件是 httpd.conf</p><p>。位置一般在 Apache 安装目录下的 conf 子目录中。而模块我们一般放</p><p>在 modules 子目录中。我们在配置文件 httpd.conf 中加入：<br />&nbsp;&nbsp;&nbsp; LoadModule dav_svn_module&nbsp;modules/mod_dav_svn.so<br />&nbsp;&nbsp;&nbsp; LoadModule authz_svn_module&nbsp;modules/mod_authz_svn.so<br />&nbsp;&nbsp;&nbsp; 这样，Apache 就可以访问 Subversion 的仓库了。</p><p>三、Apache 方式中项目的发布<br />&nbsp;&nbsp;&nbsp; 首先还是要先建立 Subversion 的项目，例如：<br />&nbsp;&nbsp;&nbsp; svnadmin create /home/svn/projectA<br />&nbsp;&nbsp;&nbsp; 之后，在 httpd.conf 文件中加入：<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DAV svn<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SVNPath /home/svn/projectA<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; 如果是想建立多个项目的话，可以使用另一种写法：<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DAV svn<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SVNParentPath /home/svn<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; 这样，凡是在 /home/svn 目录下的子目录， Apache 都交给 Subversion </p><p>DAV 去处理。用户即可以通过浏览器或者URL访问 Subversion 管理的项</p><p>目了。</p><p>四、Apache 方式下的权限管理<br />&nbsp;&nbsp;&nbsp; 首先，我们来创建一个用户 robert。<br />&nbsp;&nbsp;&nbsp; 由于是第一次创建用户，我们必须同时创建一个用户口令文件：<br />&nbsp;&nbsp;&nbsp; htpasswd -c authfile robert<br />&nbsp;&nbsp;&nbsp; 这时，会提示输入用户密码以及确认用户密码。htpasswd 程序会将</p><p>用户密码进行散列运算后保存在 authfile 中。创建第二个用户时，我们</p><p>就不必输入 -c 开关了。<br />&nbsp;&nbsp;&nbsp; htpasswd authfile harry</p><p>&nbsp;&nbsp;&nbsp; 如果想要删除某个用户，我们可以使用下列指令：<br />&nbsp;&nbsp;&nbsp; htpasswd -D authfile harry<br />&nbsp;&nbsp;&nbsp; 这样，harry 就被从 authfile 中删除了。</p><p>&nbsp;&nbsp;&nbsp; 这时，Subversion 的权限管理问题就转化为了 Apache 的权限管理问</p><p>题了。我们将前述的目录配置做一下修改：<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DAV svn<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SVNPath /home/svn/projectA<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AuthType Basic<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AuthName &quot;Subversion projectA&quot;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AuthUserFile /home/svn/projectA/authfile<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Require valid-user<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; 这样，对 projectA 访问就必须提供 authfile 中记录的用户和正确密码</p><p>才可以进行了。</p><p>五、Apache 方式下的分组管理<br />&nbsp;&nbsp;&nbsp; 有时，我们希望能够将多个开发人员编为一组，使用组的方式来为</p><p>项目设定权限。比如 projectA 项目只有属于 groupA 的成员才可以存取</p><p>。下面我们来介绍其配置方法。<br />&nbsp;&nbsp;&nbsp; 这里，我们就要用到 mod_authz_svn 提供的功能了。我们对 </p><p>httpd.conf 中的目录配置再做一次修改：<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DAV svn<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SVNParentPath /home/svn/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AuthzSVNAccessFile /home/svn/authz.conf<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AuthType Basic<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AuthName &quot;Subversion projectA&quot;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AuthUserFile /home/svn/projectA/authfile<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Require valid-user<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; 大家可以注意到，这里使用了另一个配置文件：authz.conf<br />&nbsp;&nbsp;&nbsp; 他的大致结构如下：<br />&nbsp;&nbsp;&nbsp; [groups]<br />&nbsp;&nbsp;&nbsp; everyone = robert, tommy, songjy, zhengyong, orcus, zhangq<br />&nbsp;&nbsp;&nbsp; groupA = robert, zhangq<br />&nbsp;&nbsp;&nbsp; groupB = orcus, tommy<br />&nbsp;&nbsp;&nbsp; [projectA:/]<br />&nbsp;&nbsp;&nbsp; @groupA = rw<br />&nbsp;&nbsp;&nbsp; @everyone = r<br />&nbsp;&nbsp;&nbsp; [projectB:/]<br />&nbsp;&nbsp;&nbsp; @everyone = r<br />&nbsp;&nbsp;&nbsp; @groupB = rw<br />&nbsp;&nbsp;&nbsp; Ok, 我想大家应该已经明白了基于组和项目的管理方法了。:)</p><p>附录：</p><p>1、获取最新安装包：<br />&nbsp;&nbsp;&nbsp; <a href="http://summersoft.fay.ar.us/pub/subversion/latest/whitebox-el-3/bin/"><font color="#004377">http://summersoft.fay.ar.us/pub/subversion/latest/whitebox-el-3/bin/</font></a></p></p>]]>
				</description>
				<guid isPermaLink="false">
					3832984@http://allie.bokee.com/
				</guid>
				<dc:subject></dc:subject>
				<dc:date>2005-12-10  14:45</dc:date>
			</item>
					<item>
				<title>
					<![CDATA[PostgreSQL 数据库的安装和运行简介]]>
				</title>
				<link>http://allie.bokee.com/3833009.html</link>
				<description>
					<![CDATA[<p><p>PostgreSQL 数据库的安装和运行简介<br /><br />1、下载源代码及解压缩：<br />&nbsp;&nbsp;&nbsp; http://www.postgresql.org/ftp/latest/<br />&nbsp;&nbsp;&nbsp; 在这里我们可以看到像这样的文件：<br />&nbsp;&nbsp;&nbsp; postgresql-XXX.tar.gz&nbsp; （这里的 XXX 是版本号）<br /><br />PostgreSQL 数据库的安装和运行简介<br /><br />1、下载源代码及解压缩：<br />&nbsp;&nbsp;&nbsp; http://www.postgresql.org/ftp/latest/<br />&nbsp;&nbsp;&nbsp; 在这里我们可以看到像这样的文件：<br />&nbsp;&nbsp;&nbsp; postgresql-XXX.tar.gz&nbsp; （这里的 XXX 是版本号）<br /><br />&nbsp;&nbsp;&nbsp; 同时还有一些小一点的文件：<br />&nbsp;&nbsp;&nbsp; postgresql-base-XXX.tar.gz<br />&nbsp;&nbsp;&nbsp; postgresql-opt-XXX.tar.gz<br />&nbsp;&nbsp;&nbsp; postgresql-docs-XXX.tar.gz<br />&nbsp;&nbsp;&nbsp; postgresql-test-XXX.tar.gz<br /><br />&nbsp;&nbsp;&nbsp; 前者&quot;postgresql-XXX.tar.gz&quot;是完整的源代码发布。<br />&nbsp;&nbsp;&nbsp; 而后者四个文件包含的是完整发布的四个子集。而后四个压缩包解压的结果和完整压缩包解压的结果是完全相同的。<br />&nbsp;&nbsp;&nbsp; -base 压缩包是成功安装所必须的一个基本包，他包含了数据库服务器和必要的客户端接口。<br />&nbsp;&nbsp;&nbsp; -opt 压缩包包含所有的开发支持文件。包括 C++、JDBC、ODBC、Perl、Python 和 Tcl 的接口，同时还有多字节码的支持。<br />&nbsp;&nbsp;&nbsp; -docs 压缩包含有 HTML 格式的文档（man 格式文档在 base 包中）。<br />&nbsp;&nbsp;&nbsp; -test 压缩包给出了测试程序。<br /><br />&nbsp;&nbsp;&nbsp; 随后我们就可以解压了，假设我们下载的是完整版：<br />&nbsp;&nbsp;&nbsp; tar xzf postgresql-XXX.tar.gz<br />&nbsp;&nbsp;&nbsp; 这样，我们便得到了一个 postgresql-XXX 目录。<br /><br />2、编译：<br />&nbsp;&nbsp;&nbsp; 第二步，我们进入解压后的目录，开始编译：<br />&nbsp;&nbsp;&nbsp; $cd postgresql-XXX<br />&nbsp;&nbsp;&nbsp; $./configure --help<br />&nbsp;&nbsp;&nbsp; 先看看有什么样的编译参数，如果没有什么需要指定的，我们就可以开始了：<br />&nbsp;&nbsp;&nbsp; $./configure<br />&nbsp;&nbsp;&nbsp; $make<br />&nbsp;&nbsp; &nbsp;<br />3、安装：<br />&nbsp;&nbsp;&nbsp; 编译完成之后，我们要将二进制文件安装到系统中去。这时，我们需要系统管理员的权限：<br />&nbsp;&nbsp;&nbsp; $su<br />&nbsp;&nbsp;&nbsp; 输入 root 用户的口令，接着<br />&nbsp;&nbsp;&nbsp; #make install<br />&nbsp;&nbsp;&nbsp; 这样，我们的 PostgreSQL 数据库就安装好了。<br />&nbsp;&nbsp;&nbsp; 如果没有在 configure 的时候单独指定的话，数据库的默认安装位置是：<br />&nbsp;&nbsp;&nbsp; /usr/local/pgsql<br /><br />4、初始化：<br />&nbsp;&nbsp;&nbsp; 运行数据库之前，我们先要为其准备好环境。<br />&nbsp;&nbsp;&nbsp; 由于 Postgre 默认不允许 root 运行，所以第一步是为其创建一个用户：<br />&nbsp;&nbsp;&nbsp; #adduser postgres<br />&nbsp;&nbsp;&nbsp; 当然你也可以使用系统中已有的用户。但最好还是创建一个便于管理。<br />&nbsp;&nbsp;&nbsp; 接下来是创建数据目录：（该目录的位置可以随意指定）<br />&nbsp;&nbsp;&nbsp; #mkdir /usr/local/pgsql/data<br />&nbsp;&nbsp;&nbsp; #chmod 700 /usr/local/pgsql/data&nbsp; （Postgre 要求该目录的权限设置为 700）<br />&nbsp;&nbsp;&nbsp; #chown postgres /usr/local/pgsql/data<br />&nbsp;&nbsp;&nbsp; 切换为该用户或者以该用户登陆：<br />&nbsp;&nbsp;&nbsp; #su postgres<br />&nbsp;&nbsp;&nbsp; 初始化数据目录：<br />&nbsp;&nbsp;&nbsp; $cd /usr/local/pgsql/bin<br />&nbsp;&nbsp;&nbsp; $./initdb -D /usr/local/pgsql/data<br /><br />5、运行及控制：<br />&nbsp;&nbsp;&nbsp; 到此为止，我们的 PostgreSQL 数据库已经可以使用了。<br />&nbsp;&nbsp;&nbsp; 我们可以用下列命令来起动数据库服务器：<br />&nbsp;&nbsp;&nbsp; $./postmaster -D /usr/local/pgsql/data &amp;<br />&nbsp;&nbsp;&nbsp; 也可以使用 pg_ctl 命令来控制其启动、停止等动作。具体用法可参考<br />&nbsp;&nbsp;&nbsp; $./pg_ctl --help<br />&nbsp;&nbsp;&nbsp; 例如：<br />&nbsp;&nbsp;&nbsp; $./pg_ctl start -D /usr/local/pgsql/data<br />&nbsp;&nbsp;&nbsp; $./pg_ctl stop -D /usr/local/pgsql/data<br />&nbsp;&nbsp;&nbsp; $./pg_ctl restart -D /usr/local/pgsql/data<br /><br />&nbsp;&nbsp;&nbsp; PostgreSQL is a Great Program！欢迎大家和我交流！</p></p>]]>
				</description>
				<guid isPermaLink="false">
					3833009@http://allie.bokee.com/
				</guid>
				<dc:subject></dc:subject>
				<dc:date>2005-12-10  14:46</dc:date>
			</item>
					<item>
				<title>
					<![CDATA[Subversion 仓库的定期备份]]>
				</title>
				<link>http://allie.bokee.com/5039402.html</link>
				<description>
					<![CDATA[<p><p>#!/bin/sh<br />#<br /># subversion data backup script<br /># by scud <a href="http://www.jscud.com">http://www.jscud.com</a><br /># 2005-11-27<br />#<br /># subversion完整备份的脚本,调整好后使用crontab -e 放到自动执行里面即可.<br />#<br />#备份日志文件<br />LogFile=/backup/svn/svnbak.log</p><p>DATE=`date +%Y%m%d`</p><p>#备份目录<br />BakDir=/backup/svn/data</p><p>#日常备份目录,如果有<br />DailyDir=/backup/svn/daily</p><p>#要备份的项目列表文件,只有项目名<br />ProjectLst=/backup/svn/project.lst</p><p>#所有项目都保存在这个目录下<br />SvnDir=/var/svn</p><p>#svnadmin程序的路径<br />SVNADMIN=/usr/bin/svnadmin</p><p>echo &quot; &quot; &gt;&gt; $LogFile<br />echo &quot; &quot; &gt;&gt; $LogFile<br />echo &quot;-------------------------------------------&quot; &gt;&gt; $LogFile<br />echo $(date +&quot;%y-%m-%d %H:%M:%S&quot;) &gt;&gt; $LogFile<br />echo &quot;--------------------------&quot; &gt;&gt; $LogFile</p><p>cd $BakDir</p><p>#读取项目列表<br />PROJECTLIST=`cat $ProjectLst`</p><p><br />for project in&nbsp; $PROJECTLIST<br />do<br />&nbsp;&nbsp;&nbsp; projectdata=$SvnDir/$project<br />&nbsp;&nbsp;&nbsp; destdir=$BakDir/$project<br />&nbsp;&nbsp;&nbsp; dumpfile=$DATE.$project.tgz<br />&nbsp;&nbsp; <br />&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; if [ -f $BakDir/$dumpfile ]<br />&nbsp;&nbsp;&nbsp; then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo &quot;backup file have exist!&quot; &gt;&gt;$LogFile<br />&nbsp;&nbsp;&nbsp; else </p><p>&nbsp;&nbsp;&nbsp;&nbsp; $SVNADMIN hotcopy $projectdata $destdir --clean-logs</p><p>&nbsp;&nbsp;&nbsp;&nbsp; tar czvf $dumpfile $destdir &gt;/dev/null<br />&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp; rm -fr $project<br />&nbsp;<br />&nbsp;echo &quot;backup $project done into $dumpfile &quot;&gt;&gt;$LogFile</p><p>&nbsp;&nbsp;&nbsp; fi<br />&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; ## delete old tgz 此处根据crontab的时间调整,例如一周一次备份,此处保留了5份备份,以前的删除<br />&nbsp;&nbsp;&nbsp; oldfile=&quot;$BakDir/&quot;$(date +%y%m%d --date=’28 days ago’).$project.tgz<br />&nbsp;<br />&nbsp;if [ -f $oldfile ]&nbsp; <br />&nbsp;then&nbsp; <br />&nbsp;&nbsp; rm -f $oldfile &gt;&gt; $LogFile 2&gt;&amp;1&nbsp; <br />&nbsp;&nbsp; echo &quot;[$oldfile]Delete Old File Success!&quot; &gt;&gt; $LogFile&nbsp; <br />&nbsp;else&nbsp; <br />&nbsp;&nbsp; echo &quot;[$oldfile]No Old Backup File!&quot; &gt;&gt; $LogFile&nbsp; <br />&nbsp;fi<br />&nbsp;&nbsp; <br />done</p><p><br />#delete previous daily backup files<br />cd $DailyDir<br />rm -f *</p></p>]]>
				</description>
				<guid isPermaLink="false">
					5039402@http://allie.bokee.com/
				</guid>
				<dc:subject></dc:subject>
				<dc:date>2006-05-12  14:19</dc:date>
			</item>
					<item>
				<title>
					<![CDATA[Subversion 日常管理技巧]]>
				</title>
				<link>http://allie.bokee.com/5039418.html</link>
				<description>
					<![CDATA[<p><p>subversion锁定解除、升级、备份与恢复<br />类别: 原创- nightcat @ 4:10 pm <br />###############################################<br />#<br />#DocName:subversion锁定解除、升级、备份与恢复<br />#Author:nightcat<br />#Time:2005-5-23<br />#EMail:liwenfei@21cn.com<br />#WebSite:nightcat.512j.com<br />#<br />###############################################</p><p>1.发生琐定，解除步骤：<br />A.确定没有存取.关闭httpd服务器.<br />B.成为管理员身份<br />C.执行svnadmin recover /path/to/repo命令<br />D.重启动subversion.</p><p>//注意：<br />A.以管理员身份，非root身份，如果一root身份，要重新chmod,库的权限.</p><p>/////////////////////////////////////////////////////////////////////////<br />2.升级的步骤：<br />////////////////////////////////////////////////////////////////////////<br />A.现有版本svnadmin ,将档案库dump出来<br />B.升级到新版的subversion<br />C.删除就档案库,再原处以新版本subversion,建立新的空档案库.<br />D.再利用新版本svnadmin ,将档案库load到刚刚建立好的档案库.</p><p>实例：<br />//导出<br />[code] $svnlook youngest oldrepo<br />$svnadmin dump oldrepo &gt; dumpfile<br />[/code]<br />//还原<br />$svnadmin load newrepo &lt; dumpfile</p><p>//////////////////////////////////////////////////////////////////////////<br />3.即时备份目录<br />/////////////////////////////////////////////////////////////////////////<br />$svnadmin hotcopy /path/to/repo /backup/repo</p><p>//////////////////////////////////////////////////////////////////////////<br />4.渐进式备份实现.<br />//////////////////////////////////////////////////////////////////////////</p><p>A.建立文件hot-backup.perl.内容如下：<br />#!/usr/bin/perl -w<br />use strict;</p><p>my $repos_path = ‘/path/to/repos’;<br />my $dumpfile = ‘/usr/backup/svn-dumpfile’;<br />my $last_dumped = ‘/var/log/svn-last-dumped’;<br />my $svnlook = ‘/usr/local/subversion/bin/svnlook’;<br />my $svnadmin = ‘/usr/local/subversion/bin/svnadmin’;</p><p># Figure out the starting revision. Use 0 if we cannot read the<br /># last-dumped file, else use the revision in that file incremented<br /># by 1.<br />my $new_start = 0;<br />if (open LASTDUMPED, $last_dumped)<br />{<br />my $line = ;<br />if (defined $line and $line =~ /^(\d+)/)<br />{<br />$new_start = $1 + 1;<br />}<br />close LASTDUMPED;<br />}</p><p># Query the youngest revision in the repos.<br />my $youngest = `$svnlook youngest $repos_path`;<br />defined $youngest &amp;&amp; $youngest =~ /^\d+$/<br />or die “$0: ’svnlook youngest $repos_path’ cannot get youngest revision.\n”;<br />chomp $youngest;</p><p># Do the backup.<br />system(&quot;$svnadmin dump $repos_path –revision $new_start:$youngest –incremental &gt;&gt; $dumpfile.tmp&quot;) == 0<br />or die “$0: svnadmin dump to ‘$dumpfile.tmp’ failed.\n”;</p><p># Store a new last-dumped revision.<br />open LASTDUMPED, “&gt; $last_dumped.tmp”<br />or die “$0: cannot open ‘$last_dumped.tmp’ for writing: $!\n”;<br />print LASTDUMPED “$youngest\n”;<br />close LASTDUMPED<br />or die “$0: error in closing ‘$last_dumped.tmp’ for writing: $!\n”;</p><p># Rename to final locations.<br />rename(&quot;$dumpfile.tmp”, $dumpfile)<br />or die “$0: cannot rename ‘$dumpfile.tmp’ to ‘$dumpfile’: $!\n”;<br />rename(&quot;$last_dumped.tmp”, $last_dumped)<br />or die “$0: cannot rename ‘$last_dumped.tmp’ to ‘$last_dumped’: $!\n”;<br /># All done!</p><p>B.备份.先编辑hot-backup.perl里面正确的路径名.<br />#vi hot-backup.perl修改为自己的路径：<br />my $repos_path = ‘/path/to/repos’;<br />my $dumpfile = ‘/usr/backup/svn-dumpfile’;<br />my $last_dumped = ‘/var/log/svn-last-dumped’;<br />my $svnlook = ‘/usr/local/subversion/bin/svnlook’;<br />my $svnadmin = ‘/usr/local/subversion/bin/svnadmin’;<br />#perl hot-backup.perl得到的文件是/usr/backup/svn-dumpfile</p><p>c.还原<br />1.建立新的仓库<br />#svnadmin create /usr/local/repo/newrepo</p><p>2.还原信息<br />#svnadmin load /usr/local/repo/newrepo &lt; /usr/backup/svn-dumpfile</p><p>3.注意：以后每天都备份.再执行还原即可,不必新建仓库了.</p><p>4.为了每段时间能验证备份的有效性.最好是建立一个验证仓库，用来还原，看信息是否正常。</p><p>d.有提交，就备份.进入仓库<br />#vi /hooks/post-commit.tmpl<br />添加内容在后面<br />perl /usr/local/subversion/backup/hot-backup.perl<br />每次提交触发一次备份</p><p>E.修改一下上面的程序，让能接受参数输入<br />#!/usr/bin/perl -w<br />use strict;</p><p>my $repos_path = $ARGV[0];<br />my $dumpfile = $ARGV[1];<br />my $last_dumped = $ARGV[2];</p><p>my $svnlook = ‘/usr/local/subversion/bin/svnlook’;<br />my $svnadmin = ‘/usr/local/subversion/bin/svnadmin’;</p><p>#for usage<br />if(@ARGV != 3 )<br />{<br />print “$0:[/path/to/repo] [/backup/dumpfile] [/var/log/lastdump]\n”;<br />exit 1 ;<br />}</p><p># Figure out the starting revision. Use 0 if we cannot read the<br /># last-dumped file, else use the revision in that file incremented<br /># by 1.<br />my $new_start = 0;<br />if (open LASTDUMPED, $last_dumped)<br />{<br />my $line = ;<br />if (defined $line and $line =~ /^(\d+)/)<br />{<br />$new_start = $1 + 1;<br />}<br />close LASTDUMPED;<br />}</p><p># Query the youngest revision in the repos.<br />my $youngest = `$svnlook youngest $repos_path`;<br />defined $youngest &amp;&amp; $youngest =~ /^\d+$/<br />or die “$0: ’svnlook youngest $repos_path’ cannot get youngest revision.\n”;<br />chomp $youngest;</p><p># Do the backup.<br />system(&quot;$svnadmin dump $repos_path –revision $new_start:$youngest –incremental &gt;&gt; $dumpfile.tmp&quot;) == 0<br />or die “$0: svnadmin dump to ‘$dumpfile.tmp’ failed.\n”;</p><p># Store a new last-dumped revision.<br />open LASTDUMPED, “&gt; $last_dumped.tmp”<br />or die “$0: cannot open ‘$last_dumped.tmp’ for writing: $!\n”;<br />print LASTDUMPED “$youngest\n”;<br />close LASTDUMPED<br />or die “$0: error in closing ‘$last_dumped.tmp’ for writing: $!\n”;</p><p># Rename to final locations.<br />rename(&quot;$dumpfile.tmp”, $dumpfile)<br />or die “$0: cannot rename ‘$dumpfile.tmp’ to ‘$dumpfile’: $!\n”;<br />rename(&quot;$last_dumped.tmp”, $last_dumped)<br />or die “$0: cannot rename ‘$last_dumped.tmp’ to ‘$last_dumped’: $!\n”;<br /># All done!</p><p>//////////////////////////////////////////////////////////////////////<br />5.hot-backup.py完整备份<br />/////////////////////////////////////////////////////////////////////</p><p>//////////////////////////////////////////////////////////////////////<br />6.tar包完整备份<br />/////////////////////////////////////////////////////////////////////<br />1.进入仓库的根目录/usrl/local/<br />#cd /usr/local/<br />2.备份整个目录.<br />#tar -cf repo.tar /usr/local/repo. </p><p>3.还原时候来到根目录/usrl/local/<br />#tar -xvf repo.tar</p><p>4.也可以备份单个目录.<br />#tar -cf svn.tar /usr/local/repo/svn.</p><p>5.还原单个目录到目录/usr/local/repo/<br />#tar -xvf svn.tar</p><p>6.每天的自动备份脚本backup.sh.放于/usrl/local/subversion/backup目录下<br />#!/bin/sh<br />USAGE=&quot;Usage:`basename $0` [-f|-d] [files|directories]”<br />if [ $# -lt 2 ] ; then<br />echo “$USAGE”;<br />exit 1 ;<br />fi<br />case “$1″ in<br />-f) shift<br />TARGES=&quot;-tvf” ;<br />for i in “$@” ;<br />do<br />if [ -f “$i” ] ; then<br />FILES = `tar $TAGES “$i” 2 &gt; /dev/null`<br />if [ $? -eq 0 ] ; then<br />echo ; echo “$i” ; echo “$FILES”<br />else<br />echo “ERROR:$i not a tar file.”<br />fi<br />else<br />echo “ERROR:$i not a file.”;<br />fi<br />done<br />;;<br />-d) shift<br />TARGES=&quot;-cvf” ;<br />if [ -f backup.tar ] ; then<br />mv backup.tar backup1.tar<br />fi<br />tar $TARGES backup.tar “$@”<br />;;<br />*) echo “$USAGE”<br />exit 0<br />;;<br />esac<br />exit $?</p><p>8.固定时间运行脚本Slackware下 vi /var/spool/cron/crontabs/root.添加如下：<br />20 18 * * * /usr/local/subversion/backup/backup.sh -d /usr/local/repo 1&gt; /dev/null # 每日18:20，下班后20分钟</p><p>/////////////////////////////////////////////////////////////////<br />注意：<br />/////////////////////////////////////////////////////////////////<br />1.linux直接cp的备份仓库能在nt下使用,但是nt的复制不能在linux下使用.<br /></p></p>]]>
				</description>
				<guid isPermaLink="false">
					5039418@http://allie.bokee.com/
				</guid>
				<dc:subject></dc:subject>
				<dc:date>2006-05-12  14:20</dc:date>
			</item>
					<item>
				<title>
					<![CDATA[作者申明]]>
				</title>
				<link>http://allie.bokee.com/5146528.html</link>
				<description>
					<![CDATA[<p><p>本站收集的文章大多为互联网上广为传播的IT技巧、操作手册等，且本站为非营利性质，纯属兴趣爱好。而这些文章大部分均无从查询原始出处。如侵犯了您的著作权，请您在留言中说明。站长会予以及时删除。<br /></p></p>]]>
				</description>
				<guid isPermaLink="false">
					5146528@http://allie.bokee.com/
				</guid>
				<dc:subject></dc:subject>
				<dc:date>2006-06-1  10:03</dc:date>
			</item>
					<item>
				<title>
					<![CDATA[如何安装PHP的PEAR模块]]>
				</title>
				<link>http://allie.bokee.com/5282614.html</link>
				<description>
					<![CDATA[<p><p>如何安装PHP的PEAR模块</p><p>1、下载模块包，一般是 .tgz 或者 .tar.gz 格式的压缩包；<br />2、解压缩，并将 package.xml 复制或者移动到解压后的目录内；<br />3、进入目录，运行 phpize；<br />4、运行 pear install package.xml；<br />5、ok</p><p>附注：phpize 工具可能没有安装，如果是从源代码方式安装的 php 的话应该有的。<br />另：用 php -i 或者 pear list 等命令可以获得诸如 php 到哪里寻找 php.ini 等信息。<br />php 的模块一般放在一个 extensions 目录里，由 extension_dir 指示。<br />php.ini （一般在 /usr/local/lib 下，可用 php -i确认）中必须显示导入一个模块扩展：<br />extension = classkit.so</p></p>]]>
				</description>
				<guid isPermaLink="false">
					5282614@http://allie.bokee.com/
				</guid>
				<dc:subject></dc:subject>
				<dc:date>2006-06-23  12:12</dc:date>
			</item>
					<item>
				<title>
					<![CDATA[MySQL 数据库命令行工具]]>
				</title>
				<link>http://allie.bokee.com/5282623.html</link>
				<description>
					<![CDATA[<p><p>MySQL 包括一个服务器进程管理数据库，以及一系列访问数据库和创建应用的工具：</p><p>mysql&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 在 MySQL 中执行 SQL 查询，也可以执行在文件中存储的SQL命令；<br />mysqlaccess&nbsp; : 管理用户；<br />mysqladmin&nbsp;&nbsp; : 管理数据库服务器，包括数据库的创建和移除；<br />mysqld&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 实际的 MySQL 服务器进程；<br />mysqldump&nbsp;&nbsp;&nbsp; : 将数据库或表的定义和内容转储到文件；<br />mysqlhotcopy : 热备份；<br />mysqlimport&nbsp; : 将不同文件格式的数据导入到 MySQL 表中；<br />mysqlshow&nbsp;&nbsp;&nbsp; : 显示服务器或者任何对象（数据库和表）的信息。</p><p>mysql_secure_installation&nbsp; :&nbsp; 用于管理 root 密码，远程访问、移除临时（测试）数据库及临时用户的一个脚本。</p><p>一般来讲，Root 应只用于数据库本机上登录 MySQL，我们可以增加一个拥有超级管理权限的用户 'admin' 来实现远程的维护。</p><p>Tips:</p><p>1、用 root 登录；<br />2、执行如下语句：<br />&nbsp;&nbsp; mysql&gt;grant all privilages on *.* to <a href="mailto:admin@localhost">admin@localhost</a> identified by 'password' with grant option;<br />&nbsp;&nbsp; mysql&gt;grant all privilages on *.* to <a href="mailto:admin@" %?="">admin@&quot;%</a>&quot; identified by 'password' with grant option;</p><p>&nbsp;&nbsp; &quot;%&quot;是通配符，授予 admin 用户可以从任何主机发起访问，password 是为 admin 用户设置的密码。</p></p>]]>
				</description>
				<guid isPermaLink="false">
					5282623@http://allie.bokee.com/
				</guid>
				<dc:subject></dc:subject>
				<dc:date>2006-06-23  12:14</dc:date>
			</item>
					<item>
				<title>
					<![CDATA[心得一句话]]>
				</title>
				<link>http://allie.bokee.com/5282631.html</link>
				<description>
					<![CDATA[<p>深入、仔细的把一篇文档看下来，要比只是把它保存下来备查要有价值的多。 </p>]]>
				</description>
				<guid isPermaLink="false">
					5282631@http://allie.bokee.com/
				</guid>
				<dc:subject></dc:subject>
				<dc:date>2006-06-23  12:15</dc:date>
			</item>
					<item>
				<title>
					<![CDATA[C++ 开源程序库]]>
				</title>
				<link>http://allie.bokee.com/5294005.html</link>
				<description>
					<![CDATA[<p><p>1、系统和网络编程库：ACE<br />&nbsp;&nbsp;&nbsp; 除了ACE之外，还有很多系统和网络编程方面的程序库。比如在线程库方面，还有ZThread、boost::thread，如果放大到C/C++领域，还有APR，还有CII。在文件和目录操作方面，boost也有相应的组件，而在网络编程方面有socket++，还有boost::asio，未来的C++0X中几乎肯定有一个网络编程和一个线程库。然而目前看来，ACE仍然是进行系统和高性能网络编程的首选，其地位在一段时间内不会被撼动。它不但是一个实用的程序库、框架集，还是一个典范的设计模式应用范例，非常值得学习。</p><p>2、GUI库：Qt<br />&nbsp;&nbsp;&nbsp; 传统上Qt被认为是可移植的GUI库，但实际上Qt现在已经是一个比较完整的可移植应用程序框架了，其中包含了大量的工具，比如正则表达式、Web和Socket类、2D和3D图形、XML解析、SQL类等，甚至还包括了一个完整的容器类库，不过其王牌还是GUI。在目前的跨平台GUI框架中，Qt成熟度最高，已经被一些大公司应用在关键产品中。由于Trolltech对Qt采用的dual license模式，该产品既可以从开源社区获得支持，又能够赚取足够的商业利润，因此其前景也令人比较有信心。<br />&nbsp;&nbsp;&nbsp; Qt的主要技术特色是其元对象模型。Qt实际上使用的并不是标准的C++，而是标准C++的一个扩展。它通过元对象模型扩展，实现了著名的signal/slot机制，而这一机制也成为Qt的最大特色和优势。<br />&nbsp;&nbsp;&nbsp; 与Qt类似的可移植GUI框架还有wxWidget、FOX等。</p><p>3、分布式对象中间件：ICE<br />&nbsp;&nbsp;&nbsp; ICE是分布式对象中间件领域里的后起之秀，可以大致地将其视为“改进版”的CORBA。目前应用在一些大型项目当中，其中包括波音公司主持的下一代陆军作战系统。<br />&nbsp;&nbsp;&nbsp; ICE的一个特别价值是其代码的范例意义。由于ICE的出现较晚，开发者比较系统地应用了新的C++编程风格，所以成为了研读C++代码的良好目标。</p><p>4、正则表达式：boost::regex<br />&nbsp;&nbsp;&nbsp; 正则表达式是编程工作中最强有力的工具之一。C++的正则表达式支持一直以来是一个软肋。大约在2001年左右，boost中出现了regex库，初步解决了这个问题。但是最初的regex无论在效率上还是可靠性方面都有一些问题，后来经过一次大规模的翻修之后，达到了比较完善的程度。<br />&nbsp;&nbsp;&nbsp; 其他可以选择的替代品还有C语言的pcre库，Qt中的QRegExp类等。</p><p>5、矩阵计算：MTL<br />&nbsp;&nbsp;&nbsp; 自1995年以来，C++在科学计算领域当中取得了巨大的突破。这主要归功于template技术的高级应用，使得C++在科学计算的性能方面取得了巨大的进步，一大批优秀的C++科学计算库涌现出来。比如Blitz++、POOMA、MTL、Boost::uBLAS。而这其中，MTL就功能丰富程度、性能、开发支持和成熟程度来讲，是比较突出的一个，因此可以优先考虑。值得一提的是，2002年，MTL与后来被Intel收购的KAI C++配合，曾经在性能评测中击败了FORTRAN。</p><p>6、XML、TinyXml<br />&nbsp;&nbsp;&nbsp; C++的XML相关库不少，但是大部分其实都是C库，使用起来自然不那么轻便。其中基于DOM的有TinyXml，基于SAX的当然是Xerces。前者小巧快捷，便于使用，适合做数据交换。后者则是全功能的XML解析器。</p><p>7、内存管理：boost::smart_ptr，Hans-Boehm GC<br />&nbsp;&nbsp;&nbsp; C/C++的内存管理是一个永恒的话题。一般来说，C++的开发者倾向于自己管理内存。然而，出乎很多C++开发者意料的是，近期C++的一些领袖人物已经公开宣称，如果不配备自动内存管理机制，用C++编写安全可靠的大型程序是非常困难的。而Bjarne Stroustrup也曾对中国开发者建议，如果没有特别的理由，应该在大型项目中使用自动内存管理工具。因此，今天的C++开发者应当积极地学习和应用自动内存管理设施。<br />&nbsp;&nbsp;&nbsp; 说到自动内存管理，比较轻量级的做法是boost::smart_ptr，而激进的做法是引入完整的GC机制。目前开源而又比较可靠的GC中，Hans-Boehm GC无疑是最受信赖的。作为一个保守的GC，Hans-Boehm GC在性能和功能方面都算是卓越。特别是，使用这个GC，你仍然可以delete、free来自己管理内存，对于我们编程习惯的冲击比较小。</p><p>8、配置管理：Lua<br />&nbsp;&nbsp;&nbsp; 随着软件系统越来越复杂，对软件的可配置型提出了越来越高的要求。传统上只要通过命令行参数来配置的系统，现在可能需要越来越多的方式和机制。目前越来越受欢迎、并且得到越来越多证实的做法，是将Lua嵌入到C/C++程序中，而用Lua程序作为配置脚本。这种做法的优势是，Lua语言强大灵活，可以适应复杂的配置要求。同时，Lua便于嵌入C/C++程序，而且编译执行速度非常快，可以说是目前解决C/C++程序配置管理问题的一个出色方案。</p><p>9、密码及安全：OpenSSL<br />&nbsp;&nbsp;&nbsp; 安全是今天进行C/C++编程无法回避和必须重视的问题。然而编写安全的应用程序，特别是跟网络相关的C/C++应用程序，是一件十分困难的事情。可以说，整个业界目前在这个进程上仍然处于“初级阶段”。特别是涉及到大量的安全、密码学相关的算法、规范，如果让开发者自己摸索，其工作量和难度达到了不现实的程度。因此必须借助可靠的相关程序库才有可能提高程序的安全性。在这方面，OpenSSL是目前最好的选择，其内容之全面可靠，已经成为业界标杆。然而，由于安全编程固有的复杂性，即使使用penSSL，开发工作仍然是非常繁琐的。因此我们也希望能够尽快看到更简单、更易用的C/C++安全程序库。</p></p>]]>
				</description>
				<guid isPermaLink="false">
					5294005@http://allie.bokee.com/
				</guid>
				<dc:subject></dc:subject>
				<dc:date>2006-06-25  20:53</dc:date>
			</item>
					<item>
				<title>
					<![CDATA[TopCoder]]>
				</title>
				<link>http://allie.bokee.com/5302074.html</link>
				<description>
					<![CDATA[<p><br />今天中午在 Topcoder 上作了一个算法题，结果只得了 79.7o 分，郁闷！<br />检查了一下结果，自动测试的第四项没有通过。之后晚上回家的路上又检查了一次，找到了问题所在。低级错误！<br />看来以后做算法要小心又小心，不能急躁。否则很容易漏掉一些情况的存在。<br />TopCoder 是一个很不错的平台，可以作为闲暇时练练手的一个场所。以后招小弟的时候，就让他们在 TopCoder 上比赛，看谁的分数高。哈哈哈哈，连面试题都省得出了，呵呵呵 :D<br />现在有点后悔自己的精力用的不是很合理，应该系统的学习 STL 库的。如今如果没有一本工具书在身边，真不知道怎么能写程序了。<br /></p>]]>
				</description>
				<guid isPermaLink="false">
					5302074@http://allie.bokee.com/
				</guid>
				<dc:subject></dc:subject>
				<dc:date>2006-06-27  10:44</dc:date>
			</item>
					<item>
				<title>
					<![CDATA[一如IT深似海，夜夜凌晨不息灯啊！]]>
				</title>
				<link>http://allie.bokee.com/5302082.html</link>
				<description>
					<![CDATA[<p>近日楼下的老同学经常上来和我探讨一些 C/C++ 方面的东西。而且常常是稀奇古怪的问题，诸如 goto 语句对隐式初始化变量/实例的影响、什么多重三元运算符的结合性问题等等。晕……<br />还好还能给勉强解释解释。看来有句话说得不假：一如IT深似海，夜夜凌晨不息灯啊！ </p>]]>
				</description>
				<guid isPermaLink="false">
					5302082@http://allie.bokee.com/
				</guid>
				<dc:subject></dc:subject>
				<dc:date>2006-06-27  10:45</dc:date>
			</item>
					<item>
				<title>
					<![CDATA[三十六计前半部]]>
				</title>
				<link>http://allie.bokee.com/5302085.html</link>
				<description>
					<![CDATA[<p><p>三十六计</p><p>“胜战计”<br />1、瞒天过海<br />&nbsp;&nbsp;&nbsp; 备周则意怠，常见则不疑。阴在阳之内，不在阳之对。太阳，太阴。</p><p>2、围魏救赵<br />&nbsp;&nbsp;&nbsp; 共敌，不如分敌，敌阳不如敌阴。</p><p>3、借刀杀人<br />&nbsp;&nbsp;&nbsp; 敌已明，友未定，引友杀敌，不自出力，以“损”推演。</p><p>4、以逸待劳<br />&nbsp;&nbsp;&nbsp; 困敌之势，不以战，损刚益柔。</p><p>5、趁火打劫<br />&nbsp;&nbsp;&nbsp; 敌之害大，就势取利，刚决柔也。</p><p>6、声东击西<br />&nbsp;&nbsp;&nbsp; 敌志乱萃，不虞，坤下兑上之象，利其不自主而取之。</p><p>“敌战计”<br />7、无中生有<br />&nbsp;&nbsp;&nbsp; 诳也，非诳也，实其所诳也。少阴、太阴、太阳。</p><p>8、暗渡陈仓<br />&nbsp;&nbsp;&nbsp; 示之以动，利其静而不主。</p><p>9、隔岸观火<br />&nbsp;&nbsp;&nbsp; 阳乘序乱，阴以待逆。暴戾恣帷，其势自毙。顺以动豫，豫顺以动。</p><p>10、笑里藏刀<br />&nbsp;&nbsp;&nbsp; 信而安之，阴以图之；备而后动，忽使有变。刚中柔外也。</p><p>11、李代桃僵<br />&nbsp;&nbsp;&nbsp; 势必有损，损阴以益阳。</p><p>12、顺手牵羊<br />&nbsp;&nbsp;&nbsp; 微隙在所必乘，微利在所必得。少阴，少阳。</p><p>“攻战计”<br />13、打草惊蛇<br />&nbsp;&nbsp;&nbsp; 疑以扣实，察而后动；复者，阴之媒也。</p><p>14、借尸还魂<br />&nbsp;&nbsp;&nbsp; 有用者，不可借；不能用者，求借。借不能用者而用之，匪我求童蒙，童蒙求我。</p><p>15、调虎离山<br />&nbsp;&nbsp;&nbsp; 待天以困之，用人以诱之，往赛来返。</p><p>16、欲擒故纵<br />&nbsp;&nbsp;&nbsp; 逼而反兵；走而减势。紧随勿迫，累其气力，消其斗志。散而后擒，兵不血刃。需，有孚，光。</p><p>17、抛砖引玉<br />&nbsp;&nbsp;&nbsp; 类以诱之，击蒙也。</p><p>18、擒贼擒王<br />&nbsp;&nbsp;&nbsp; 摧其坚，夺其魁，以解其体。龙战于野，其道穷也。</p></p>]]>
				</description>
				<guid isPermaLink="false">
					5302085@http://allie.bokee.com/
				</guid>
				<dc:subject></dc:subject>
				<dc:date>2006-06-27  10:46</dc:date>
			</item>
					<item>
				<title>
					<![CDATA[项目发布了]]>
				</title>
				<link>http://allie.bokee.com/5549421.html</link>
				<description>
					<![CDATA[]]>
				</description>
				<guid isPermaLink="false">
					5549421@http://allie.bokee.com/
				</guid>
				<dc:subject></dc:subject>
				<dc:date>2006-08-19  12:17</dc:date>
			</item>
					<item>
				<title>
					<![CDATA[项目移植到 OSGi 上开发啦]]>
				</title>
				<link>http://allie.bokee.com/5772842.html</link>
				<description>
					<![CDATA[<p>&nbsp;&nbsp;&nbsp; 8月份开始写的一个系统监视工具appp，本来是想自己设计成插件模式的，但是一直也想不出个好的方案。后来只好用静态代码的形式了，再把项目做成开源的项目。<a href="http://appp.sourceforge.net/">http://appp.sourceforge.net/</a><br />&nbsp;&nbsp;&nbsp; 后来看到 Eclipse 3.0 后的版本已经移到了 OSGi 的平台上，突然想起了这个框架。好久之前曾经关注过 OSGi 的。当时也是想找一个轻量级的好用的插件体系。但是当时的 OSGi 才发布了 R2，并且没有合适的实现可用。今天又 google 了一下，OSGi 已经有了好多个实现的版本。Oscar 实现了 R3，并且已经在 Apache 基金会的支持之下发展。（要知道好多很 Great 的库都是出自 Apache 的。例如我们常用的 Xml parser 和 Xmlrpc 库。以及鼎鼎大名的 Tomcat）。另外还有一个叫做 Knopflerfish 的开源实现也不错，已经实现了 R4 描述的绝大部分规范。除了开源的项目外，还有一些商业化的实现。IBM 也有自己的一套商业版 OSGi 框架。<br />&nbsp;&nbsp;&nbsp; 正如博上一些兄弟所言，OSGi 实现了现在许多软件系统都需要的功能需求。例如：插件机制、智能升级、模块化管理、模块依赖性管理、模块生命周期管理等。<br />&nbsp;&nbsp;&nbsp; 现在，我要把原来那个完成了多半的程序从 C++ 上转到 Java 上来，做成 OSGi 的 Bundle 形式。同时把 appp 中的 MonitorPolicy 以及 NotificationPolicy 也设计成 Bundle 形式的，发布相应的 Service。这样模块管理的工作就轻松了。如果有其他同仁来写这些监控策略，也可以有章可循了。只要做成符合 OSGi 规范的插件，并且遵循一点点 appp 中的服务发布规则即可。同时还有方便的开发平台可用：Eclipse !!开发者只需要选择创建&quot;plugin&quot;，将目标平台修改为 Standard OSGi 即可，这样做出来的 plugin 就可以在所有标准的 OSGi R4 实现框架中安装和启动。<br />&nbsp;&nbsp;&nbsp; 刚刚进入 OSGi 世界的感觉简单来说就是四个字：“如获至宝” :D<br />&nbsp;&nbsp;&nbsp; 但是，现在的 OSGi 资料还是非常少的。除了 OSGi 官方网站提供的 R4.core.pdf 之外，就是各个 OSGi 实现所发布的文档了。IBM Developerworks 站点上也有篇文章不错。真希望大家可以建立一个专门讨论 OSGi 技术的平台来交流心得。<br /></p>]]>
				</description>
				<guid isPermaLink="false">
					5772842@http://allie.bokee.com/
				</guid>
				<dc:subject></dc:subject>
				<dc:date>2006-10-19  17:38</dc:date>
			</item>
			</channel>
</rss>

