﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-大日如来</title><link>http://www.cppblog.com/kuchao/</link><description /><language>zh-cn</language><lastBuildDate>Sun, 05 Apr 2026 15:19:10 GMT</lastBuildDate><pubDate>Sun, 05 Apr 2026 15:19:10 GMT</pubDate><ttl>60</ttl><item><title>git-svn问题</title><link>http://www.cppblog.com/kuchao/archive/2009/12/18/103462.html</link><dc:creator>大日如来</dc:creator><author>大日如来</author><pubDate>Fri, 18 Dec 2009 05:14:00 GMT</pubDate><guid>http://www.cppblog.com/kuchao/archive/2009/12/18/103462.html</guid><wfw:comment>http://www.cppblog.com/kuchao/comments/103462.html</wfw:comment><comments>http://www.cppblog.com/kuchao/archive/2009/12/18/103462.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/kuchao/comments/commentRss/103462.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kuchao/services/trackbacks/103462.html</trackback:ping><description><![CDATA[<p>1、从svn clone出项目，加上-s参数以标记识别svn标准的目录分支结构，同时通过show-ignore设置git库的exclude属性：  <ol> <li>git svn clone -s https://svn.xxx.com/svn/xxx  <li>git svn show-ignore &gt;&gt; .git/info/exclude&nbsp; </li></ol> <p>2、建立本地工作分支，开始工作：  <ol> <li>git checkout -b work&nbsp; </li></ol> <p>修改内容直接commit，加上-a开头以省略git add操作：  <ol> <li>git commit -a&nbsp; </li></ol> <p>3、提交回svn的过程：  <ol> <li>git checkout master&nbsp;&nbsp; <li>git merge work&nbsp;&nbsp; <li>git svn rebase&nbsp;&nbsp; <li>git svn dcommit&nbsp; </li></ol> <p>在今天工作中，我提交回svn的方式是：  <ol> <li>git checkout master&nbsp;&nbsp; <li>git svn rebase&nbsp;&nbsp; <li>git merge work&nbsp; </li></ol> <p>结果svn rebase时在master分支上产生了一个新的node，这样merge时就不能快速合并，出现了冲突，修复后，在dcommit时出错，出现N个孤立节点。因为不熟悉，就checkout出work分支，进行了dcommit，然后重新生成一次git库。<br><br>今天解决了这个问题，参考以下网址：<a href="https://wiki.bnl.gov/dayabay/index.php?title=Synchronizing_Repositories">https://wiki.bnl.gov/dayabay/index.php?title=Synchronizing_Repositories</a>。<br>以下重新描述一下问题和解决方法：<br>1、在执行git svn dcommit时，出现如下错误：<br>Committing to https://svn.xxx.com/svn/projects/trunk ...<br>提交时发生合并冲突: 您的文件或目录”test/functional/xxx_controller_test.rb“可能已经过时: The version resource does not correspond to the resource within the transaction.&nbsp; Either the requested version resource is out of date (needs to be updated), or the requested version resource is newer than the transaction root (restart the commit). at /usr/bin/git-svn line 450<br>2、这时，重新执行以下步骤即可：  <ol> <li>git svn fetch&nbsp;&nbsp; <li>git svn rebase&nbsp;&nbsp; <li>git svn dcommit&nbsp; </li></ol> <p>但我在执行git svn rebase时，又出现冲突，这个时候，只需要手工合并掉冲突，并重新add一下：  <ol> <li>git add .&nbsp; </li></ol> <p>然后，再执行：  <ol> <li>git rebase --continue</li></ol> <p>如果报告说没有修改内容，则换成执行：  <ol> <li>git rebase --skip&nbsp; </li></ol> <p>完成rebase过程，这时就可以git svn dcommit了。<br>这样，总算解决了svn历史冲突问题，不用象前面那样笨笨的重新git-svn clone.</p><img src ="http://www.cppblog.com/kuchao/aggbug/103462.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kuchao/" target="_blank">大日如来</a> 2009-12-18 13:14 <a href="http://www.cppblog.com/kuchao/archive/2009/12/18/103462.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>freebsd上postgres连接数修改办法</title><link>http://www.cppblog.com/kuchao/archive/2009/12/16/103332.html</link><dc:creator>大日如来</dc:creator><author>大日如来</author><pubDate>Wed, 16 Dec 2009 08:38:00 GMT</pubDate><guid>http://www.cppblog.com/kuchao/archive/2009/12/16/103332.html</guid><wfw:comment>http://www.cppblog.com/kuchao/comments/103332.html</wfw:comment><comments>http://www.cppblog.com/kuchao/archive/2009/12/16/103332.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kuchao/comments/commentRss/103332.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kuchao/services/trackbacks/103332.html</trackback:ping><description><![CDATA[<p>今天发现pg连上30多接近40个连接的时候出现连接失败的状况。感觉上好像在pg的conf里看到一个connection是40，一翻果然如此，修改成100后启动可耻的失败鸟。。。</p> <p>查看/var/log/messages大致意思是SEMMIN/SEMMNS不够了。好办，如下操作：</p> <p>修改 /etc/sysctl.conf 增加以下指令<br>kern.ipc.shmmax=134217728<br>kern.ipc.shmall=32768<br>kern.ipc.semmap=256  <p>修改 /boot/loader.conf 增加以下指令<br>kern.ipc.semmni=256<br>kern.ipc.semmns=512<br>kern.ipc.semmnu=256  <p>修改/usr/local/psql/data/postgresql.conf <br>max_connections = 100  <p>修改以后需要重启 <p>一切安静了。。。正义狼不叫了，世界和平了。</p><img src ="http://www.cppblog.com/kuchao/aggbug/103332.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kuchao/" target="_blank">大日如来</a> 2009-12-16 16:38 <a href="http://www.cppblog.com/kuchao/archive/2009/12/16/103332.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>freebsd上postgre安装</title><link>http://www.cppblog.com/kuchao/archive/2009/12/16/103331.html</link><dc:creator>大日如来</dc:creator><author>大日如来</author><pubDate>Wed, 16 Dec 2009 08:33:00 GMT</pubDate><guid>http://www.cppblog.com/kuchao/archive/2009/12/16/103331.html</guid><wfw:comment>http://www.cppblog.com/kuchao/comments/103331.html</wfw:comment><comments>http://www.cppblog.com/kuchao/archive/2009/12/16/103331.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kuchao/comments/commentRss/103331.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kuchao/services/trackbacks/103331.html</trackback:ping><description><![CDATA[<p>cd /usr/ports/databases/postgresql84-server/<br>sudo make install clean  <p>sudo emacs /etc/login.conf<br>---<br>postgres:\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :lang=en_US.UTF-8:\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :setenv=LC_COLLATE=C:\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :tc=default:<br>---<br>and run `cap_mkdb /etc/login.conf'.<br>Then add 'postgresql_class="postgres"' to /etc/rc.conf.  <p>To initialize the database, run  <p>&nbsp; sudo /usr/local/etc/rc.d/postgresql initdb  <p>You can then start PostgreSQL by running:  <p>&nbsp; sudo /usr/local/etc/rc.d/postgresql start<br>To run PostgreSQL at startup, add<br>'postgresql_enable="YES"' to /etc/rc.conf  <p>监听所有地址 <p>sudo emacs /usr/local/pgsql/data/postgresql.conf<br>listen_addresses = '*'  <p>允许某ip段连接 <p>sudo emacs /usr/local/pgsql/data/pg_hba.conf<br># my lan<br>host&nbsp;&nbsp;&nbsp; all&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; all&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 192.168.64.0/22&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; md5  <p>修改pgsql密码 <p>su<br>su pgsql<br>psql -d postgres<br>alter user pgsql with password '******';  <p>给某个db增加过程语言 <p>createlang plpgsql yangchao</p><img src ="http://www.cppblog.com/kuchao/aggbug/103331.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kuchao/" target="_blank">大日如来</a> 2009-12-16 16:33 <a href="http://www.cppblog.com/kuchao/archive/2009/12/16/103331.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何在svn系统中使用git</title><link>http://www.cppblog.com/kuchao/archive/2009/12/09/102839.html</link><dc:creator>大日如来</dc:creator><author>大日如来</author><pubDate>Wed, 09 Dec 2009 03:39:00 GMT</pubDate><guid>http://www.cppblog.com/kuchao/archive/2009/12/09/102839.html</guid><wfw:comment>http://www.cppblog.com/kuchao/comments/102839.html</wfw:comment><comments>http://www.cppblog.com/kuchao/archive/2009/12/09/102839.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kuchao/comments/commentRss/102839.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kuchao/services/trackbacks/102839.html</trackback:ping><description><![CDATA[<p>如果正在使用svn，打算换到git，又暂时不想放弃已有的svn代码库，可以选择git-svn。说一说我自己从svn到git的经验吧。 <h5>开始</h5> <p>安装最新版本的git，从git 1.5.3以后支持git-svn，git和svn的配合就要借助这个功能。 <p>安装完毕后要做一些简单的配置。最直接的做法就是创建修改~/.gitconfig。下面是我的.gitconfig<pre>[user]
        name = Robin Lu
        email = ---@gmail.com
[color]
        diff = auto
        status = auto
        branch = auto
[alias]
  st = status
  rb = svn rebase
  ci = commit -a
  co = checkout</pre>
<p>[user]部分标示出使用者的身份，你提交的代码会自动引用这一身份信息。[color]设置命令输出的颜色。[alias]部分可以简化一些常用命令，比如在这里将git status简化为git st。
<h5>初始化代码库</h5>
<p>首先用git-svn来初始化本地的代码库(repository)<pre>git svn clone -s svn-repository-url</pre>
<p>svn-repository-url部分使用svn代码库的url。如果要从trunk目录或者某个branch目录里check out，要把-s换成-T、-b等选项。具体参看man git-svn。这个命令时间比较长，因为需要同步所有的提交历史，还好只此一次，以后不会这么慢了。做完这一步，在本地就有了一个完整的代码库，包括所有commit的历史和log，已经可以开始用它来进行开发工作了。
<p>不过，在开始开发之前，最好先做一次垃圾搜集：<pre>git gc</pre>
<p>它对代码库的信息进行垃圾搜集和压缩，最明显的作用就是减小磁盘占用空间。第一次做效果尤其明显。
<p>你可以检查一下代码库的状态：<pre>git status</pre>
<p>现在应该在一个叫”master”的分支(branch)上。
<p>用这个命令来显示出所有的分支(branch):<pre>git branch -a</pre>
<p>master前有一个*号，代表你现在所处的分支，另外还有一个分支叫trunk，它是一个远程分支(remote branch)，对应的是远程svn代码库。master实际上是trunk的一个本地分支。
<p>接下来，需要配置忽略文件，让git忽略一些目录中不希望加入代码库的文件，类似svn propset svn:ignore。全局有效的忽略文件列表可以添加在./.git/info/exclude文件中。比如我需要忽略所有vi产生的swp文件：<pre>.*.swp</pre>
<p>对于和目录有关的忽略文件设置可以在该目录下创建.gitignore，然后加入需要忽略的内容，比如我希望忽略根目录下的log,tmp等目录，可以直接在根目录下的.gitignore中加入:<pre>log
tmp</pre>
<h5>开发流程</h5>
<p>可以开始工作了。用git后开始养成一个新习惯，就是工作前先创建新分支:<pre>git checkout -b new_branch</pre>
<p>-b后是分支名，创建的同时，你要转到了新分支上。尽量保持master上没有未提交到svn的commit，这样随时都可以很容易的产生一个干净的分支。
<p>接下来你可以写代码，修改文件或者添加文件。如果想看看修改了什么，可以用：<pre>git diff</pre>
<p>如果对某个修改不满意，希望恢复原状，可以使用:<pre>git checkout path/filename</pre>
<p>相当于svn revert
<p>git引入一个索引(index)的概念，提交前，需要把要提交的文件加入到git索引(index)中：<pre>git add path/filename1
git add path/filename2
...</pre>
<p>然后提交<pre>git commit -m "提交感言"</pre>
<p>每次commit都是提交索引(index)中的内容。
<p>如果要一次提交所有修改过的文件，可以一次性添加，然后提交<pre>git add .
git commit -m "提交感言"</pre>
<p>如果只是修改，并没有添加新文件，可以直接用下面的命令:<pre>git commit -a -m "提交感言"</pre>
<p>将被修改文件加入索引并提交，一次完成全过程。
<p>在修改加入所索引后，如果想看看索引内容中都所了什么修改，可以用：<pre>git diff --cached</pre>
<p>适合在提交前做最后的code review。
<p>查看最近一次提交的内容，可以使用<pre>git show</pre>
<p>修改中随时查看当前代码库的状态：<pre>git status</pre>
<p>相当于svn status
<p>删除和移动某个文件：<pre>git rm file
git mv file newfile</pre>
<h5>提交到svn</h5>
<p>在完成了几轮工作后，要将本地内容提交到远程svn中，可以先让当前分支和远程svn同步：<pre>git svn rebase</pre>
<p>然后将所有已经合并到master分支的本地修改提交到svn<pre>git svn dcommit</pre>
<p>如果在git svn rebase时发生代码冲突，需要先手动解决冲突，然后用git add将修改加入索引，然后继续rebase<pre>git svn rebase --continue</pre>
<h5>缺点</h5>
<p>最后说说这种工作方式的缺点。这个话题稍微复杂一点。
<p>svn和git的工作原理毕竟不同，git对代码提交的非线性特性在svn中难以再现，如果使用了git-merge或者git-pull，再提交到svn，相关分支上的提交历史有可能无法体现在svn上。从svn的使用者的角度，无法辨别这是一个提交还是一次合并，所以在和svn协作过程中，尽量不要使用merge，或者说，尽量让代码库保持线性。
<p>我的经验是，如果不在乎svn中是否反映出提交历史，使用merge也无妨。比如完成工作后，可以将工作分支合并到主分支中去：<pre>git checkout master
git merge new_branch</pre>
<p>先用checkout命令切换回master分支，然后将新分支中内容合并进来。然后在master分支上做git svn rebase和dcommit。从svn来看，这就是一个commit，new_branch上的提交历史在svn上体现不出来。(有例外情况，以后再讨论)。
<p>还有一个解决办法是尽量保持git代码库的线性特征。比如在new_branch分支中，先和master做rebase，再合并到master分支中：<pre>git rebase master
git checkout master
git merge new_branch</pre>
<p>然后在master上做dcommit，就可以在svn代码库中看到完整的提交历史。
<p>如果看到这已经有点头晕了，可以干脆不管它，就按照前面的做法，直接在你的工作分支里dcommit，等对非线性开发有一定了解再来看各种情况。
<p>好了，基本上知道这些就可以干活了。</p><img src ="http://www.cppblog.com/kuchao/aggbug/102839.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kuchao/" target="_blank">大日如来</a> 2009-12-09 11:39 <a href="http://www.cppblog.com/kuchao/archive/2009/12/09/102839.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>git很好很强大</title><link>http://www.cppblog.com/kuchao/archive/2009/12/09/102838.html</link><dc:creator>大日如来</dc:creator><author>大日如来</author><pubDate>Wed, 09 Dec 2009 03:38:00 GMT</pubDate><guid>http://www.cppblog.com/kuchao/archive/2009/12/09/102838.html</guid><wfw:comment>http://www.cppblog.com/kuchao/comments/102838.html</wfw:comment><comments>http://www.cppblog.com/kuchao/archive/2009/12/09/102838.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kuchao/comments/commentRss/102838.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kuchao/services/trackbacks/102838.html</trackback:ping><description><![CDATA[<p>最近把版本管理系统换成<a href="http://git-scm.com/" target="_blank">git</a>了，果然非常好用，难怪大家都在推荐。 <p>首先不要有心理障碍，那些名词都是吓唬人的。所谓的“非线性开发”无非是指强大的branch和merge的能力，“分布式版本管理”就是说每人自己都有一套本地的repository，不存在一个集中的版本服务器。 <p>给我带来的最直接的好处有： <ol> <li>傻瓜都会的初始化，git init, git commit -a, 就完了。对于随便写两行代码就要放到SCM里的人来说，再合适不过。也可以拿git做备份系统，或者同步两台机器的文档，都很方便。  <li>绝大部分操作在本地完成，不用和集中SCM服务器交互，终于可以随时随地大胆地check in代码了。  <li>branch管理容易多了，无论是建立新的branch，还是在branch之间切换都一条命令完成，不需要建立多余的目录。  <li>branch之间merge时，不仅代码会merge在一起，check in历史也会保留，这点非常重要。</li></ol> <p>工具之所以好，除了方便好用，还在于它帮助并鼓励你做正确的事情。频繁check in是一件很好的事情，好处我不多说了，git就鼓励你频繁check in。branch也是一件好事情，我们大多很怕branch因为它太麻烦了，去掉这层心理包袱，branch可以让我们的开发工作很有条例。 <p>还有一些实用的功能，比如bisect,用二分法来寻找regression，你以前手动做过这种事么？我做过。以后如果要做就不会怕了。还有stash，做hot fix非常方便。 <p>如果正在用svn，劝服所有合作开发者使用git之前，可以先用git-svn，和svn整合得非常好。 <p>分布式版本管理系统取代集中式版本管理系统，只是时间的问题了。</p><img src ="http://www.cppblog.com/kuchao/aggbug/102838.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kuchao/" target="_blank">大日如来</a> 2009-12-09 11:38 <a href="http://www.cppblog.com/kuchao/archive/2009/12/09/102838.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>心得、架构、经验。。。。杂</title><link>http://www.cppblog.com/kuchao/archive/2009/10/28/99658.html</link><dc:creator>大日如来</dc:creator><author>大日如来</author><pubDate>Wed, 28 Oct 2009 05:33:00 GMT</pubDate><guid>http://www.cppblog.com/kuchao/archive/2009/10/28/99658.html</guid><wfw:comment>http://www.cppblog.com/kuchao/comments/99658.html</wfw:comment><comments>http://www.cppblog.com/kuchao/archive/2009/10/28/99658.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kuchao/comments/commentRss/99658.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kuchao/services/trackbacks/99658.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp; 前段时间去北京出差，看了烈火和上水轩的项目，最大的感触就是经验、人才的积累，个人的积累到项目组的积累到公司的积累，很强的个人能力，很好的团队氛围，加上完善的公司团队支撑，大个一路羡慕，其实我第一次看到也很羡慕，不过积累这种东西不是一个人能撑起来的。平常心就好。</p> <p>&nbsp;&nbsp;&nbsp; 还是说下架构，这次去和左拉聊过之后，比较有感触，但是依然有不赞同的地方，他坚持单服构架，只是加入多线程设计使承载提升，上层倒是计划用一些类似无缝地图这样的技术，但是我对单服承载能力和容错能力依然表示怀疑。增加了出错几率和程序员调试时间，当然这些我对他是没底气争辩的，他完整的经历了两个项目，经验是无法比的。</p> <p>&nbsp;&nbsp;&nbsp; 我依然坚持我的底层多线程，逻辑单线程架构，开发调试简单。单线程逻辑能力的不足我用多服来分散。就我的经验来看，这样对我目前的团队好处最大，因为服务端逻辑程序员都是新手，写多线程程序经验不足，经常死锁、漏锁。</p> <p>&nbsp;&nbsp;&nbsp; <a href="http://www.valgrind.org/" target="_blank">valgrind</a>在内存泄露方面还是不太好用，也只能是能用，但是其他方面倒是有一些意想不到的收获，发现了几处逻辑BUG，比如我的服务端线程accept到新的socket后就创建一个线程收发包，但是停止时我先停了accept线程，不挂<a href="http://www.valgrind.org/" target="_blank">valgrind</a>就没事，挂上就hang up在pthread_join位置上，郁闷很久，改了顺序就完全ok。</p> <p>&nbsp;&nbsp;&nbsp; 针对内存泄露，我又找了一个很小的工具<a href="http://hald.dnsalias.net/projects/memcheck/" target="_blank">memcheck</a>，效果出乎意料的好。我要的就是对malloc/realloc的内存检测是否free掉了。这个小工具也只有这个功能，在linux下面还能看到backtrace，不错不错。</p> <p>&nbsp;&nbsp;&nbsp; 说到linux，不知道是我的错觉还是什么，新底层在linux下跑的貌似确实要好一些，不是指速度，那个是肉眼无法观察出来的，纯粹的感觉，调试过程中的输出、gdb给的反馈等等。怎么形容呢。感觉FreeBSD比较硬，更偏程序员多一些。linux就比较软，替服务器管理员考虑的就多一些。纯感觉。</p><img src ="http://www.cppblog.com/kuchao/aggbug/99658.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kuchao/" target="_blank">大日如来</a> 2009-10-28 13:33 <a href="http://www.cppblog.com/kuchao/archive/2009/10/28/99658.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>服务端重构</title><link>http://www.cppblog.com/kuchao/archive/2009/10/22/99173.html</link><dc:creator>大日如来</dc:creator><author>大日如来</author><pubDate>Thu, 22 Oct 2009 02:49:00 GMT</pubDate><guid>http://www.cppblog.com/kuchao/archive/2009/10/22/99173.html</guid><wfw:comment>http://www.cppblog.com/kuchao/comments/99173.html</wfw:comment><comments>http://www.cppblog.com/kuchao/archive/2009/10/22/99173.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kuchao/comments/commentRss/99173.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kuchao/services/trackbacks/99173.html</trackback:ping><description><![CDATA[<p>金山有一套自己的服务端，单服务端，c++的，跑在CentOS上。代码很庞大。维护起来不是很方面，而且个人感觉使用了太多的c++的特性。</p> <p>第一次重构服务端是刚来的时候，包括多服务端构架，多线程底层，因为时间紧，使用的是我上一个服务端的大体框架，上一套服务器使用c++/stlport/boost/asio，逻辑是简单了，但是问题也隐藏起来了，这次干脆使用纯c代码+libev。当底层搭建完成程序员开始工作后，我利用剩余时间重新考虑了一下服务端，首先被我放弃的是一开始就考虑上万人承载、无缝地图等等，把承载放在了比较合理的设计8k，实际5k一组上，经过和其他部门的沟通，在构架上也做了一些改动，避免了一处明显的瓶颈设计。</p> <p>再次重构依然采用多服务端构架，做了简单的跨*nix平台，目前在FreeBSD7.2和CentOS5.2上开发，底层是多线程，逻辑单线程，客户端监听使用4个收，4个发来处理IO，服务端之间是一个连接一个线程，kqueue/epoll只针对客户端监听使用，监听使用一个，4个收包线程一个线程使用一个。</p> <p>逻辑线程就一个，简单的从收到的包的队列里取出数据然后处理。</p> <p>都是些轻车熟路的东西，写下来不到1000行代码，效果还需要压来测试。</p> <p>在一次次重构中，真正感觉到了简单的美丽，现在的代码连libev都抛弃了，kqueue/epoll简单包装了一下，纯c的代码运用起来也渐渐得心应手，没有任何复杂的数据结构，感觉很好。</p> <p>valgrind终于进行了重大升级，虽然features上提的是支持MacOS，但好歹和FreeBSD同源不是，3.5.0版本在FreeBSD上使用再也不需要mount /proc了，而且上个版本在FB7.2上根本用不成。这次表现的很好，虽然误报依然一大堆，但好歹有报不是。终于不在FB上写程序的时候提心吊胆了，以前可是根本就没泄露检测工具。反倒是CentOS上编译valgrind失败，好像是一个define的问题，没去管它。</p> <p>当个项目总监，特别是比较大项目的管理者还是很累的，不过我觉得做管理要有所依，服务端编程我不会放下，再忙每天都要抽出时间来写几段代码，其实管理很简单，我的风格不喜欢搞太多事情，懒，但是做管理这样是不够的，缺乏强沟通、强推动。总觉得团队少了最核心的一点什么。努力！</p><img src ="http://www.cppblog.com/kuchao/aggbug/99173.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kuchao/" target="_blank">大日如来</a> 2009-10-22 10:49 <a href="http://www.cppblog.com/kuchao/archive/2009/10/22/99173.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>眼镜度数</title><link>http://www.cppblog.com/kuchao/archive/2009/10/12/98367.html</link><dc:creator>大日如来</dc:creator><author>大日如来</author><pubDate>Mon, 12 Oct 2009 05:02:00 GMT</pubDate><guid>http://www.cppblog.com/kuchao/archive/2009/10/12/98367.html</guid><wfw:comment>http://www.cppblog.com/kuchao/comments/98367.html</wfw:comment><comments>http://www.cppblog.com/kuchao/archive/2009/10/12/98367.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kuchao/comments/commentRss/98367.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kuchao/services/trackbacks/98367.html</trackback:ping><description><![CDATA[
<p>这个年龄了。眼镜的度数应该不会有太大变化了。</p> <p>记下来吧。免得每次都要找借口去眼镜店眼光</p> <p>R &#8211;3.75 &#8211;2.00 X165</p> <p>L &#8211;5.00 &#8211;2.00 X15</p> <p>瞳距68</p><img src ="http://www.cppblog.com/kuchao/aggbug/98367.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kuchao/" target="_blank">大日如来</a> 2009-10-12 13:02 <a href="http://www.cppblog.com/kuchao/archive/2009/10/12/98367.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IncrediBuild 无限期试用的办法</title><link>http://www.cppblog.com/kuchao/archive/2009/10/12/98366.html</link><dc:creator>大日如来</dc:creator><author>大日如来</author><pubDate>Mon, 12 Oct 2009 05:02:00 GMT</pubDate><guid>http://www.cppblog.com/kuchao/archive/2009/10/12/98366.html</guid><wfw:comment>http://www.cppblog.com/kuchao/comments/98366.html</wfw:comment><comments>http://www.cppblog.com/kuchao/archive/2009/10/12/98366.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kuchao/comments/commentRss/98366.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kuchao/services/trackbacks/98366.html</trackback:ping><description><![CDATA[
<p>别鄙视我，国情嘛。</p> <p>Mark一下，免得30天后又忘了。改天有空研究一下多Agent的效率。</p> <p>IncrediBuild是一个很强的分布式编译工具，可以明显缩短大型项目编译时间，但是价格不菲。对于我这样的穷人来说，只能使用试用版。试用期限是30天，30天到了即使删掉再安装仍然不能使用。给Xoreax写信申请延长试用期限，也没给答复，估计针对个人他们根本就不让延长试用。</p> <p>令人郁闷的是，网上能找到的所有破解都是无效的。即使界面显示已经破解，但是时间一到，功能根本不正常。根本不会把编译任务分发给别人，只能本机编译了。</p> <p>IncrediBuild 2.40的License有2个文件CoordLicense.dat和AgentLicense.dat，分别位于Coordinator和Agent安装目录下，这两个文件都是RSA数字签名过的，除非修改.exe文件中的解密密钥，否则没法伪造License文件。但既然网上能找到的破解都无法正常使用，所以肯定不容易搞定。对于3.20应该也大同小异。</p> <p>IncrediBuild在第一次运行的时候会向注册表中写入软件到期的时间。</p> <p>2.40: HKCR\Interface\{E9B0227F-437C-4F7A-86D9-2676B83F359F}\ProxyStubClsid32 = {M1-M2-M3-T1-T2}</p> <p>3.20: HKCR\Interface\{B7348B5D-B65D-4BF5-AF63-A3135249ACA7}\ProxyStubClsid32 = {M1-M2-M3-T1-T2}</p> <p>卸载软件的时候并不会卸载这个注册表项，所以重新安装仍然不能使用。最简单的办法是卸载软件后手动删除这个注册表项，然后重新安装，就又可以继续试用。还有一种办法就是，我们定期更新上面这个注册表项的值，把时间往后推移。还好该软件时间算法并不复杂，很容易算出来。</p> <p>比如说到期时间是2008.5.30日23:59:59，可以写两行简单的代码：</p> <p>COleDateTime DateTime(2008, 5, 30, 23, 59, 59);</p> <p>DATE Date = (DATE)DateTime;</p> <p>此时Date的值是39598.999988425923 (0x37BA E7FFDF55E340)</p> <p>T1：37BA</p> <p>T2：E7FFDF55E340</p> <p>M1 = 37 * BA * E7 * FF = 23EAEB06</p> <p>M2 = DF * 55 = 4A0B</p> <p>M3 = E3 * 40 = 38C0</p> <p>这样我们就可以把注册表中上述键值改为：{23EAEB06-4A0B-38C0-37BA-E7FFDF55E340}</p> <p>这样，软件到了2008.5.31 00:00:00才会过期。</p><img src ="http://www.cppblog.com/kuchao/aggbug/98366.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kuchao/" target="_blank">大日如来</a> 2009-10-12 13:02 <a href="http://www.cppblog.com/kuchao/archive/2009/10/12/98366.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>FreeBSD备忘</title><link>http://www.cppblog.com/kuchao/archive/2009/10/12/98365.html</link><dc:creator>大日如来</dc:creator><author>大日如来</author><pubDate>Mon, 12 Oct 2009 05:01:00 GMT</pubDate><guid>http://www.cppblog.com/kuchao/archive/2009/10/12/98365.html</guid><wfw:comment>http://www.cppblog.com/kuchao/comments/98365.html</wfw:comment><comments>http://www.cppblog.com/kuchao/archive/2009/10/12/98365.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kuchao/comments/commentRss/98365.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kuchao/services/trackbacks/98365.html</trackback:ping><description><![CDATA[
<p>好记性不如烂笔头</p> <p>systat基本上是FreeBSD中最功能最多的系统监视命令，显示CPU、I/O、内存、虚拟内存、mbufs、磁盘IO、网络状态等信息等。</p> <p>命令：</p> <p><strong>systat [-display] [refresh-interval]</strong></p> <p>其中 display 为我们所要显示的信息项目，我们也可以在进入 systat 后通过输入&#8220;:<strong>display</strong>&#8221;变更显示项目，<strong>refresh-interval </strong>参数是需要多长时间采样一次系统数据输出到屏幕，单位是秒。</p> <p>实例：<strong># systat -vmstat 1</strong></p> <p><a href="http://www.lvtao.cn/wp-content/uploads/2008/02/vmstat.gif"></a>命令解释：显示CPU、I/O、内存、虚拟内存、mbufs、磁盘IO、网络状态等信息。信息采样刷新时间为1秒。</p> <p><strong>以下为可用的 display 参数：</strong></p> <p>pigs 显示目前系统中使用 CPU 最多的行程名称。如果所有行程的 CPU 使用量未满 100%，则多出来的部份显示为 IDLE。 <br>icmp 统计目前 ICMP 封包的进出情形。 <br>icmp6 显示 IPv6 的 ICMP 封包进出情形。 <br>ip 显示 IP 层的封包统计及 UDP 封包信息。 <br>ip6 和 IP 一样，但只显示 IPv6 的封包。 <br>tcp 显示 TCP 的封包统计。 <br>iostat 显示 I/O 状况统计，并分类为各种模式显示。 <br>swap 显示目前各个储存空间上的虚拟内存的使用情形。 <br>mbufs 显示 mbufs 被使用的状态。 <br>vmstat 这是我们最常用的显示模式，它显示了最多的信息，包含 I/O、虚拟内存、mbufs、网络等信息。 <br>netstat 显示网络的使用情形。 <br>ifstat 显示各个网络适配卡的使用情形。</p> <p>==================================================</p> <p>最快的FreeBSD升级办法：</p> <p>The freebsd-update(8) utility supports binary upgrades of i386 and amd64 systems running earlier FreeBSD releases. Systems running 7.0-RELEASE, 7.1-RELEASE, 7.2-BETA, 7.2-RC1, or 7.2-RC2 can upgrade as follows:</p><pre># freebsd-update upgrade -r 7.2-RELEASE</pre>
<p>During this process, FreeBSD Update may ask the user to help by merging some configuration files or by confirming that the automatically performed merging was done correctly.</p><pre># freebsd-update install</pre>
<p>The system must be rebooted with the newly installed kernel before continuing.</p><pre># shutdown -r now</pre>
<p>After rebooting, freebsd-update needs to be run again to install the new userland components, and the system needs to be rebooted again:</p><pre># freebsd-update install
# shutdown -r now</pre>
<p>Users of earlier FreeBSD releases (FreeBSD 6.x) can also use freebsd-update to upgrade to FreeBSD 7.2, but will be prompted to rebuild all third-party applications (e.g., anything installed from the ports tree) after the second invocation of "freebsd-update install", in order to handle differences in the system libraries between FreeBSD 6.x and FreeBSD 7.x.</p>
<p>==================================================</p>
<p>添加用户组：</p>
<p>pw group add coder</p>
<p>添加新用户：</p>
<p>adduser</p><img src ="http://www.cppblog.com/kuchao/aggbug/98365.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kuchao/" target="_blank">大日如来</a> 2009-10-12 13:01 <a href="http://www.cppblog.com/kuchao/archive/2009/10/12/98365.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>