<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>响马的唠叨</title>
	<atom:link href="http://www.9465.net/feed" rel="self" type="application/rss+xml" />
	<link>http://www.9465.net</link>
	<description>不想做程序员的程序员不是好程序员</description>
	<lastBuildDate>Tue, 08 May 2012 06:36:24 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>西祠：嫁做商人妇</title>
		<link>http://www.9465.net/archives/371.html</link>
		<comments>http://www.9465.net/archives/371.html#comments</comments>
		<pubDate>Wed, 31 Aug 2011 16:51:26 +0000</pubDate>
		<dc:creator>响马</dc:creator>
				<category><![CDATA[创业]]></category>
		<category><![CDATA[社交网络]]></category>
		<category><![CDATA[公司]]></category>
		<category><![CDATA[西祠]]></category>

		<guid isPermaLink="false">http://www.9465.net/?p=371</guid>
		<description><![CDATA[2000年的西祠是野蛮生长的西祠，艺龙强大的资金支持，保证了西祠的发展空间。同时北京南京两地监管真空，使得西祠的言论空前绝后地自由。这也为2001年的西祠休站埋下隐患。。]]></description>
			<content:encoded><![CDATA[<p>1999年底，西祠几乎花光了当时是教师的我的全部积蓄（其实也没多少，但是光了）。恰逢艺龙需迅速打开局面，终与@唐越 达成收购协议，西祠正式嫁做商人妇。<br />
<span id="more-371"></span><br />
2000年也因此成为西祠野蛮生长的一年。艺龙强大的资金支持，使得西祠的硬件压力得以缓解，发展空间的瓶颈得到解决。同时，南京网监认为西祠归北京管，北京网监认为西祠归南京管。两不管的状态，形成监管真空，那一年是西祠言论最为开放的一年。而这一切为2001年的长期休站埋下隐患。</p>
<p>2000年一年的时间，西祠在线用户从进入艺龙前的400人，猛增到5000人，并在2001年9月我离开时达到7000人的规模。这一规模一直保持到2005年10月。</p>
<p>然而，该来的总归会来。在2001年天朝年经来临前，艺龙接到了封站令，理由是西祠没有论坛 icp。而其实那个时候根本没有那个玩意。</p>
<p>接下来就是关站，然后悄悄开了后门放网友进来玩。于此同时，开始了为其数月的论坛 icp 申请历程。</p>
<p>从那时起，我便向公司提出将在尽最大努力让西祠恢复开站后，引咎辞职。</p>
<p>数月后，天朝年经沥尽，口径放宽，西祠拿到论坛 icp，正式开站。又过数月，稳定下来后，我正式离开了自己创办了3年多的西祠胡同。</p>
<p>那是2001年的9月，我满30，距今10年整。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.9465.net/archives/371.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>西祠故事－厉胜男之《家住宁海路》</title>
		<link>http://www.9465.net/archives/359.html</link>
		<comments>http://www.9465.net/archives/359.html#comments</comments>
		<pubDate>Wed, 24 Aug 2011 15:35:20 +0000</pubDate>
		<dc:creator>响马</dc:creator>
				<category><![CDATA[社交网络]]></category>
		<category><![CDATA[西祠]]></category>

		<guid isPermaLink="false">http://www.9465.net/?p=359</guid>
		<description><![CDATA[厉胜男是个传奇。她的出现就是为了一篇纪实巨著《家住宁海路》。之前无人认识，之后无人知晓。如果你没看过《家住宁海路》，那么你还算不上是真正的老西祠。]]></description>
			<content:encoded><![CDATA[<p>厉胜男是个传奇。她的出现就是为了一篇纪实巨著《家住宁海路》。之前无人认识，之后无人知晓。如果你没看过《家住宁海路》，那么你还算不上是真正的老西祠。<br />
<span id="more-359"></span><br />
2001年3月28日，厉胜男以《<a href="http://www.xici.net/d1401288.htm" target="_blank">你强奸了我的眼睛 『家住宁海路』之一</a>》开篇进入西祠，也拉开了历时三个月，滔滔五十三篇的纪实巨著《<a href="http://www.xici.net/u302751/article.asp?s=%BC%D2%D7%A1%C4%FE%BA%A3%C2%B7" target="_blank">家住宁海路</a>》的序幕。</p>
<p>网友评说：</p>
<p><strong>@牛吃草:<br />
</strong>我相信厉胜男已经在无意中为我们建立了一个话语体系<br />
平静的小女子的文字里，讲述着一个个平淡而又不平淡的故事，我们又该怎么来看厉胜男的这些文字，我们无言以对那些文字透出来的无奈与沉重，我们甚而没有说出那些我们早就知道，能表达出而又没有表达出的现实。<br />
责任以及现实，真的成了一个过时而又让很多人感到耻笑的字眼？</p>
<p><strong>@安替:<br />
</strong>妈的，感动地我要死</p>
<p><strong>@陈楠:</strong><br />
跟宁海路无关的这篇<br />
比所有的有关的都要好看<br />
这个凌涛让我想起我的同学<br />
都有八九的创伤和回忆<br />
但是后面的没这么精彩<br />
包括我自己<br />
我们都平淡和沉淀下来</p>
<p><strong>@两堆果子:</strong><br />
&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;</p>
<p>&nbsp;</p>
<p>再读《<a href="http://www.xici.net/u302751/article.asp?s=%BC%D2%D7%A1%C4%FE%BA%A3%C2%B7" target="_blank">家住宁海路</a>》</p>
]]></content:encoded>
			<wfw:commentRss>http://www.9465.net/archives/359.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>13年前的西祠胡同入站欢迎辞。。</title>
		<link>http://www.9465.net/archives/357.html</link>
		<comments>http://www.9465.net/archives/357.html#comments</comments>
		<pubDate>Tue, 23 Aug 2011 15:47:20 +0000</pubDate>
		<dc:creator>响马</dc:creator>
				<category><![CDATA[创业]]></category>
		<category><![CDATA[社交网络]]></category>
		<category><![CDATA[西祠]]></category>

		<guid isPermaLink="false">http://www.9465.net/?p=357</guid>
		<description><![CDATA[1998年4月14日，西祠胡同开始运行，在当时冷冰冰互联网里，这段调侃的欢迎辞，温暖过很多文青。。]]></description>
			<content:encoded><![CDATA[<p>西祠胡同是一个城南的小胡同，纯朴、善良的民风，乐于助人的习俗，使这里成为一个和睦的大家庭。在胡同里住有23家人家，最老的住户是住在15号的张大妈家，她是西祠胡同的居委会主任，张大妈可是个热心肠的人，张家长，李家短，全胡同没有一个比她更清楚的。来西祠胡同的人多了，张大妈也就更加忙了，谁家的客人太多，谁家忙不过来，都还得张大妈来调解。这不，二子的茶馆里有一位客人要提建议，也得张大妈张罗。</p>
<p><span id="more-357"></span>要说起这二子，那可是个人物。高中毕业，连考了八年的高考，硬是没考上，一横心，借了两万块钱，在胡同口开了一家茶馆。嘿，你还别说，过了一年，这茶馆还开出了名气，远近十几里没有不知道二子茶馆的。这二子茶馆成了老少爷们聊天听戏的绝好去处。</p>
<p>再说这张大妈，在动乱的年代里，不知道在什么地方捡回来一个外国小孩，问了半天，也没问出叫什么名字。因为张大妈的老伴姓毕，就给他起了个名字叫毕丐之。为这事，那年代没少受罪。这毕丐之后来被人带走就没了音讯。过了二十几年，张大妈收到一封写满外国字的信，找王老师一看，竟是毕丐之的，不过他现时可不叫毕丐之了，叫个什么英文名字，这名字张大妈也记不住啊，王老师就告诉她，中文的读法就是比尔该死。(比尔英语角)</p>
<p>这个王老师又是谁呢？原来啊，王老师是市青少年宫的一个课外辅导员，是个画家。这王老师可不得了，天文地理、琴棋书画，那是无一不通，是胡同里公认的王秀才。大家有个大事小情的，都要请王老师拿个主意。而王老师呢，也就理所当然的成了胡同里所有小孩的课外辅导老师。</p>
<p>还有一个人得说一下，那就是王秀芝，去年下岗后，在家闲了大半年，找过很多工作，都没干成。和在大学里教书的大姐和姐夫一商量，竟在西祠胡同的最里面开了一家网吧，叫秀芝网吧。这事说起来谁也不信，但她毕竟开张了，第一天就挤满了人，后来没有一天不人满为患。这王秀芝干脆一不做二不休，请来大姐和姐夫，在网吧里又开了一个长期讲座，叫WEB教室。这名字被二子一叫，竟成了歪脖教室。</p>
<p>来西祠胡同串门子的人越来越多，各家各户都挤满了人。张大妈一想，总这样也不是办法，就在居委会单独开了几个房间，由客人自发地开设讨论小组，如西祠证券、软件发烧友、游戏人生等，讨论大家关心的话题。同时还设了一个西祠聊天楼，在聊天楼里可以自开房间喝茶聊天，神吹海侃，竟也慢慢地红火起来。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.9465.net/archives/357.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ubuntu 安装 Java[转]</title>
		<link>http://www.9465.net/archives/351.html</link>
		<comments>http://www.9465.net/archives/351.html#comments</comments>
		<pubDate>Thu, 04 Aug 2011 16:07:16 +0000</pubDate>
		<dc:creator>响马</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://www.9465.net/?p=351</guid>
		<description><![CDATA[回回都要手工装，烦躁。。。。]]></description>
			<content:encoded><![CDATA[<p>回回都要手工装，烦躁。</p>
<p>安装办法：</p>
<p>1，编辑源列表：</p>
<pre class="brush:shell">sudo vim /etc/apt/sources.list</pre>
<p>在最后 添加一行：</p>
<pre class="brush:shell">deb http://archive.canonical.com/ lucid partner</pre>
<p>2，更新:</p>
<pre class="brush:shell">sudo  apt-get update</pre>
<p>3，安装java：</p>
<pre class="brush:shell">sudo apt-get install sun-java6-jre</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.9465.net/archives/351.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Joel Spolsky: 创业公司如何公平分配股权？[转]</title>
		<link>http://www.9465.net/archives/340.html</link>
		<comments>http://www.9465.net/archives/340.html#comments</comments>
		<pubDate>Mon, 06 Jun 2011 09:14:50 +0000</pubDate>
		<dc:creator>响马</dc:creator>
				<category><![CDATA[创业]]></category>
		<category><![CDATA[公司]]></category>
		<category><![CDATA[股份]]></category>

		<guid isPermaLink="false">http://www.9465.net/?p=340</guid>
		<description><![CDATA[在一个创业公司，几乎所有 可能会出错的地方都会出错，而且会出错的问题当中最大最大的问题是创始人之间巨大的、令人气愤的、吵到面红耳赤的关于“谁更努力工作”的争论，谁拥有更多 股份，谁提出的想法等等。这也是我总会与一个朋友50-50平分一个新公司的股权，而不是坚持自己拥有60%的股权，因为“这是我的想法”，或者因为“我 比你更有经验”，或者任何其它原因。为什么呢？因为如果我把股权拆分为60-40，公司将在我们（创始人）不断争吵当中走向失败！如果你只是说，“去他妈 的，我们永远也无法知道正确的股权分配比例，我们还是像哥们儿那样50-50平分”，你们将继续是朋友而且公司将生存下去。]]></description>
			<content:encoded><![CDATA[<h3>创业网友提问：</h3>
<p>我有一个新的社会网络应用的构想。我并不期望这个应用可以获得巨大成功，但我想还是有些潜力的。我找过一些好友和同事交流过这个想法，他们都十分喜欢这个构想。还有些朋友甚至提出想作为合作伙伴加入一起进行开发，把想法变为一个可用的软件。</p>
<p>我无法用自己的钱给他们支付工资（他们也不期望那样），而且大家都打算把这项工作作为我们平时晚上或周末的业余项目。因为我认为这个想法有潜力可以变为成功的企业，我想从目前这个阶段开始，就解决企业所有权/薪酬的问题，免得将来因为没界定清楚导致真正的问题。我倾向于把公司所有权在我们三个创始人当中平分，而且基于这个分配规则来确定将来盈利后如何分配。这个选择对吗？如果对，怎么才算公平的股权分配？这是我自己提出的想法而且已花了不少时间做规划（而且我很确定我将自己负担所有开发过程中发生的费用），所以我感觉我应该理所当然持有更大的股权。这个要求是否合理？</p>
<p>我还同时企图想办法按付出的努力来激励我的合伙人。我不担心有人加入后什么都不干，但我的确认为我们当中有一个或多个人也许将十分努力付出，比其他人付出更多。如果情况是这样，我想这类合伙人应该获得更多的股份。在规划股权架构方面，您有何建议？<br />
<span id="more-340"></span><br />
<h3>Joel Spolsky回答:</h3>
<p>这个问题实在是太普遍了，我打算对这个为题给出这个世界上最详细的回答。我希望，将来如果这个坛子上有人问到类似的问题，大家只需要引用我的回答。</p>
<p><strong>最重要的（股权分配）原则：公平，而且可感知到的公平，比真正拥有大的股份更有价值。</strong>在一个创业公司，几乎所有可能会出错的地方都会出错，而且会出错的问题当中最大最大的问题是创始人之间巨大的、令人气愤的、吵到面红耳赤的关于“谁更努力工作”的争论，谁拥有更多股份，谁提出的想法等等。这也是我总会与一个朋友50-50平分一个新公司的股权，而不是坚持自己拥有60%的股权，因为“这是我的想法”，或者因为“我比你更有经验”，或者任何其它原因。为什么呢？因为如果我把股权拆分为60-40，公司将在我们（创始人）不断争吵当中走向失败！如果你只是说，“去他妈的，我们永远也无法知道正确的股权分配比例，我们还是像哥们儿那样50-50平分”，你们将继续是朋友而且公司将生存下去。</p>
<p>所以，我郑重向大家推出：<strong>Joel的适用于任何创业公司创始人完全公平划分股权的秘笈！</strong></p>
<p>为简单起见，我将假设你们不打算拿风险投资，而且你们将不会有外来的投资人。随后，我再解释如何处理风险投资，但目前我们暂时假设没有投资人。同样为简单起见，我们临时假设所有创始人都辞掉了他们的全职工作，而且同时开始全职为新公司工作。随后，我再解释如何处理后来加入的创始人。</p>
<p>来啦，原则是这样的：随着你们公司的成长，你们将一层一层/一批一批地加入新员工。公司的首批员工就是第一个创始人（或者第一批创始人）。也许有1个，2个，3个或者更多，但你们都同时开始在新公司工作，而且你们要冒一样的风险……例如辞掉你们的工作加入一个未被市场认可的新公司。</p>
<p>第二批进来的人就是首个（批）真正的员工。当你聘任这批人时，你已从某个来源获得现金（投资人或者客户，这个无所谓）。这些人不需要冒多大风险因为他们从工作的第一天开始就拿了工资，而且，老实说，他们不是公司的创始人，他们是加入公司打工的。</p>
<p>第三批的人是更后来加入到员工。他们加入公司时，公司已运作得不错。</p>
<p>对于很多公司而言，每隔大约1年将进来一“批”员工。当你的公司规模大到可以卖给谷歌或上市或是其它，你公司员工也许已经有了6批：创始人1批，员工大约5批。每一批员工人数都比上一批更多。也许有2个创始人，第二批当中有5名最早的员工，第三批有25名员工，而第四批有200名员工。<strong>越迟加入公司的员工需要冒的风险越低。</strong></p>
<p>好啦，你将这样利用上述信息：<strong>创始人应该最终拿整个公司大约50%的股份。首层下面的5层员工的每一层最终都分别分到大约10%的公司股份，每一层的员工都将平分这10%的股份。</strong></p>
<p><strong> </strong>例子：</p>
<ul>
<li>2个创始人启动公司。他们每人拿2500份股份。公司总市值按5000股算，所以每个创始人拿一半。</li>
<li>第一年，他们聘用了4名员工。这4名员工每人拿250份股份。公司总市值按6000股算。</li>
<li>第二年，他们又聘用了一批20名员工。这些员工每人拿50份股份。他们获得更少股份因为他们要承受的风险更少。因为公司给每一批员工派发的股份是1000股，所以他们每人拿到50股。</li>
<li>直到公司员工有了6批，你已给出10000股。每个创始人最终持有公司25%的股份。每个员工“层级”持有10%的股份。所有员工当中，最早进入公司的员工，因为他们与迟来的相比要承担的风险最大，在所有员工中持有最多股份。</li>
</ul>
<p>靠谱吗？你不必严格按照这个公式来规划股份，但基本思路是：你设立不同的资历“层”，最高的层级中的员工承受最大的风险，最低层层级的员工承担最少的风险，而每个“层”的员工平分公司分配给这个层级的股份，这个规则神奇地让越早加入到员工获得越多的股份。</p>
<p>使用“层级”的一个稍微不同的方式是“资历”。你的顶部层级是公司创始人，再下一层，你需要预留一整层给将来招聘牛逼哄哄并坚持需要10%股份的CEO；再下一层是给那些早期进来的员工以及顶级经理人的，等等。无论你如何组织你的层级，它们应该是设计清晰明了，容易理解，不容易产生纷争。现在，你搞定了一个公平的份股系统，但还有一个重要的原则：你必须执行“<strong>股份绑定</strong>”<strong>(vesting)</strong>。股份绑定期最好是4到5年。任何人都必须在公司做够起码1年才可持有股份（包括创始人）。好的股份绑定计划一般是头一年给25%，然后接下来每个月落实2%。否则，你的合作创始人将加入公司3个星期后跑掉，然后7年后又出现，并声称他拥有公司的25%的股份。<strong>没有“股份绑定”条款，你派股份给任何人都是不靠谱的！</strong>没有执行“股份绑定”是极其普遍的现象，后果可以十分严重。你看到有些公司的3个创始人没日没夜地工作了5年，然后你发现有些混蛋加入后2个星期就离开，这混蛋还以为他仍然拥有公司25%的股份，就因为他工作过的那2个星期。</p>
<p>好了，让我们清理一下整个设计蓝图中没搞定的小问题。<strong>如果你的公司融资了，股份如何分割？</strong>投资可以来自任何方向，一个天使投资人，一个风险投资公司，或者是某人的老爸。基本上，回答很简单：<strong>新的投资将“稀释”所有人的股份。</strong></p>
<p>沿用上面的例子，我们有2个创始人，我们给了自己每人2500股股份，所以我们每人拥有公司的50%股份，然后我们找了个风投，风投提出给我们100万换取1/3的公司股份。公司1/3的股份=2500股。所以，你发行2500股给了风投。风投持有1/3公司股份，而你和另外一个创始人各持1/3。就这么多。如果并不是所有早期员工都需要拿工资，怎么办？很多时候，有些公司创始人有不少个人积蓄，她决定公司启动后的某个阶段可以不拿工资。而有些创始人则需要现金，所以拿了工资。很多人认为不拿工资的创始人可以多拿一些股份，作为创业初期不拿工资的回报。问题是，你永远不可能计算出究竟应该给多多少股份（作为初期不拿工资的回报）。这样做将导致未来的纷争。<strong>千万不要用分配股权来解决这些问题。</strong>其实，你只需要针对每位创始人拿的工资做好记帐：不拿工资创始人就给她记着工资“欠条”。当公司有了足够现金，就根据这个工资欠条补发工资给她。接下来的几年中，当公司现金收入逐步增加，或者当完成第一轮风险投资后，你可以给每一位创始人补发工资，以确保每一位创始人都可从公司得到完全一样的工资收入。</p>
<p><strong>创业构想是我提出的，难道我不应该多拿股份吗？</strong>不拿。构想基本上是不值钱的。仅仅因为提出创业构想就获得更多股权，因此导致纷争是不值得的。如果你们当中有人首先提出的创业构想，但你们都同时辞工并同时开始创业，你们应该拿同等的股份。为公司工作才是创造价值的原因，而你洗澡的时候突发奇想的“创业点子”根本不值什么钱。</p>
<p><strong>如果创始人之一不是全职投入创业公司工作，该怎么办？</strong>那么，他（们）就不能算是“创始人”。在我的概念中，如果一个人不全职投入公司的工作就不能算是创始人。任何边干着他们其它的全职工作边帮公司干活的人只能拿工资或者工资“欠条”，但是不要给股份。如果这个“创始人”一直干着某份全职工作直到公司拿到风投，然后辞工全职过来公司干活，他（们）和第一批员工相比好不了多少，毕竟他们并没有冒其他创始人一样的风险。</p>
<p><strong>如果有人为公司提供设备或其它有价值的东西（专利、域名等），怎么处理？</strong>很好啊。按这些东西的价值支付现金或开个“欠条”咯，别给股份。你准确算一下他给公司带来的那台电脑的价值，或者他们自带的某个聪明的字处理专利的价格，给他们写下欠条，公司有钱后再偿还即可。在创业初期就用股权来购买某些公司需要的东西将导致不平等，纷争和不公平。</p>
<p><strong>投资人、创始人和雇员分别应该拥有多少股份？</strong>这都要看市场情况来确定。现实地看，如果投资人最终获得超过50%的公司股权，创始人将感觉自己不重要而且会丧失动力，所以好的投资人也不会这样干（拿超过50%的股权）。如果公司能依赖自我积累来发展而不依靠外来投资，创始人和员工一起将拥有公司100%的股权。有趣的是，这样的安排将给未来投资人带来足够的压力，以平衡投资人与创始人/员工。一条老经验是：公司上市时（当你雇佣了足够的员工而且筹集了足够的投资后），投资人将拥有50%股份，创始人+员工将拥有50%股份，但是就2011年热门的网络公司而言，他们的投资人最终拥有的股份都比50%少得多。</p>
<h3>结论</h3>
<p>虽然创业公司股权分配原则这个问题没有一刀切的解决方案，但是你得尽可能让它简单化，透明化，直接了当，而最重要的是：要公平。只有这样你的公司才更有可能成功。</p>
<p>文章来自<a href="http://www.bookandman.com/2011/05/01/joel-spolsky-fair-startup-ownership-split/" target=_blank>http://www.bookandman.com/2011/05/01/joel-spolsky-fair-startup-ownership-split/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.9465.net/archives/340.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>伟大的架构师和产品经理－－老聃</title>
		<link>http://www.9465.net/archives/327.html</link>
		<comments>http://www.9465.net/archives/327.html#comments</comments>
		<pubDate>Wed, 18 May 2011 18:34:56 +0000</pubDate>
		<dc:creator>响马</dc:creator>
				<category><![CDATA[产品设计]]></category>
		<category><![CDATA[架构]]></category>
		<category><![CDATA[道德经]]></category>

		<guid isPermaLink="false">http://www.9465.net/?p=327</guid>
		<description><![CDATA[《道德经》里面有这样一段话： “三十幅共一毂，当其无，有车之用。埏埴以为器，当其无，有器之用。凿户牖以为室，当其无，有室之用。故有之以为利，无之以为用。” 大致的意思是，做轱辘，你得留一个洞来插车轴；做器皿，你得把中间挖空来盛水；做房子，得把里面空出来才好住人。 一个架构，一个产品，必须能解决问题，就是有，同时必须能够解决同一类问题，就是无。 对于开放平台，必须能够尽可能的接入外部资源，同时有对外部资源有价值。有价值就是有，开放就是无。 相信今天的程序员，架构师，产品经理，都可以从里面找到自己学科的身影。 什么设计模式，开放平台，api。。。]]></description>
			<content:encoded><![CDATA[<p>《道德经》里面有这样一段话：</p>
<p>“三十幅共一毂，当其无，有车之用。埏埴以为器，当其无，有器之用。凿户牖以为室，当其无，有室之用。故有之以为利，无之以为用。”</p>
<p>大致的意思是，做轱辘，你得留一个洞来插车轴；做器皿，你得把中间挖空来盛水；做房子，得把里面空出来才好住人。</p>
<p>一个架构，一个产品，必须能解决问题，就是有，同时必须能够解决同一类问题，就是无。</p>
<p>对于开放平台，必须能够尽可能的接入外部资源，同时有对外部资源有价值。有价值就是有，开放就是无。</p>
<p>相信今天的程序员，架构师，产品经理，都可以从里面找到自己学科的身影。</p>
<p>什么设计模式，开放平台，api。。。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.9465.net/archives/327.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>纠结的 websocket 握手协议</title>
		<link>http://www.9465.net/archives/312.html</link>
		<comments>http://www.9465.net/archives/312.html#comments</comments>
		<pubDate>Wed, 04 May 2011 19:47:51 +0000</pubDate>
		<dc:creator>响马</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[websocket]]></category>

		<guid isPermaLink="false">http://www.9465.net/?p=312</guid>
		<description><![CDATA[websocket 现在版本的握手协议相当变态。]]></description>
			<content:encoded><![CDATA[<p>websocket 现在版本的握手协议相当变态。</p>
<p>前一版本看着还像个 http 的握手：</p>
<pre class="brush:css">GET /ws HTTP/1.1
Upgrade: WebSocket
Connection: Upgrade
Host: www.9465.net
Origin: http://www.9465.net
Cookie: somenterCookie</pre>
<pre class="brush:css">HTTP/1.1 101 Web Socket Protocol Handshake
Upgrade: WebSocket
Connection: Upgrade
WebSocket-Origin: http://www.9465.net
WebSocket-Location: ws://www.9465.net/ws</pre>
<p>再看看现在的版本：<br />
<span id="more-312"></span>
<pre class="brush:css">GET /ws HTTP/1.1
Host: www.9465.net
Connection: Upgrade
Sec-WebSocket-Key2: 12998 5 Y3 1 .P00
Sec-WebSocket-Protocol: ws
Upgrade: WebSocket
Sec-WebSocket-Key1: 4 @1 46546xW%0l 1 5
Origin: http://www.9465.net
^n:ds[4U</pre>
<pre class="brush:css">HTTP/1.1 101 WebSocket Protocol Handshake
Upgrade: WebSocket
Connection: Upgrade
Sec-WebSocket-Origin: http://www.9465.net
Sec-WebSocket-Location: ws://www.9465.net/ws
Sec-WebSocket-Protocol: ws
8jKS’y:G*Co,Wxa-</pre>
<p>奶奶的这叫做什么协议，就看那两个 Key，居然还好意思叫做 Sec Key，还弄出一个数空格的解密算法。这样加密有意义吗？把三个未知数一起传送给服务器让它计算，跟送一个未知数让他计算有什么区别。</p>
<p>再看请求的 body，你的头里面有 Content-Length 没有就送 body 过来啊。</p>
<p>响应就更无聊了，装模做样算个 md5 回来。好歹知道还有个 md5 算法了。但是这样加密有什么意义呢？不能让你传送的数据更安全，也不能防止服务器仿冒。唯一能够起到的作用，就是服务器会说 v76 的握手协议。</p>
<p>如果非要说这样加密一次有用的话，能想到的是防止 proxy 缓存重发。那也不需要把协议搞得这样丑陋，下面这样就足够达到这么目的。</p>
<pre class="brush:css">GET /ws HTTP/1.1
Host: www.9465.net
Connection: Upgrade
Sec-WebSocket-Key: sxa23d3=
Sec-WebSocket-Protocol: ws
Upgrade: WebSocket
Origin: http://www.9465.net</pre>
<pre class="brush:css">HTTP/1.1 101 WebSocket Protocol Handshake
Upgrade: WebSocket
Connection: Upgrade
Sec-WebSocket-Origin: http://www.9465.net
Sec-WebSocket-Location: ws://www.9465.net/ws
Sec-WebSocket-Protocol: ws
8jKS’y:G*Co,Wxa-</pre>
<p>请求随机发送 Sec-WebSocket-Key，响应的 body 开头返回计算的 md5。</p>
<p>不知道设计者怎么想的。</p>
<p>@郝立华 提醒我协议更新了，我就去看了一下新草案，握手变成这样了：</p>
<pre class="brush:css">GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Origin: http://example.com
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 7</pre>
<pre class="brush:css">HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Sec-WebSocket-Protocol: chat</pre>
<p>这样的思路才对头，终于改掉了 v76 的变态协议。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.9465.net/archives/312.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>春天里，再次感动</title>
		<link>http://www.9465.net/archives/243.html</link>
		<comments>http://www.9465.net/archives/243.html#comments</comments>
		<pubDate>Fri, 22 Oct 2010 09:25:03 +0000</pubDate>
		<dc:creator>响马</dc:creator>
				<category><![CDATA[音乐]]></category>
		<category><![CDATA[东北]]></category>
		<category><![CDATA[农民工]]></category>
		<category><![CDATA[汪峰]]></category>
		<category><![CDATA[河南]]></category>

		<guid isPermaLink="false">http://www.9465.net/?p=243</guid>
		<description><![CDATA[还记得许多年前的春天 那时的我还没剪去长发 没有信用卡没有她 没有24小时热水的家 可当初的我是那么快乐 虽然只有一把破木吉他 在街上，在桥下 在田野中 唱着那无人问津的歌谣 如果有一天 我老无所依 请把我留在 在那时光里 如果有一天 我悄然离去 请把我埋在 这春天里 还记得那些寂寞的春天 那时的我还没冒起胡须 没有情人节 没有礼物 没有我那可爱的小公主 可我觉得一切没那么糟 虽然我只有对爱的幻想 在清晨 在夜晚 在风中 唱着那无人问津的歌谣 也许有一天 我老无所依 请把我留在 在那时光里 如果有一天 我悄然离去 请把我埋在 在这春天里 春天里 你是这此刻烂漫的春天 依然像那时温暖的模样 我剪去长发留起了胡须 曾经的苦痛都随风而去 可我感觉却是那么悲伤 岁月留给我更深的迷惘 在这阳光明媚的春天里 我的眼泪忍不住的流淌 也许有一天 我老无所依 请把我留在 在那时光里 如果有一天 我悄然离去 请把我埋在 在这春天里 如果有一天 我老无所依 [...]]]></description>
			<content:encoded><![CDATA[<p><embed src="http://player.youku.com/player.php/sid/XMjE4NDU2NTY4/v.swf" quality="high" width="480" height="400" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash"></embed></p>
<p>还记得许多年前的春天<br />
那时的我还没剪去长发<br />
没有信用卡没有她<br />
没有24小时热水的家<br />
可当初的我是那么快乐<br />
虽然只有一把破木吉他<br />
<span id="more-243"></span>在街上，在桥下 在田野中<br />
唱着那无人问津的歌谣<br />
如果有一天 我老无所依<br />
请把我留在 在那时光里<br />
如果有一天 我悄然离去<br />
请把我埋在 这春天里</p>
<p>还记得那些寂寞的春天<br />
那时的我还没冒起胡须<br />
没有情人节 没有礼物<br />
没有我那可爱的小公主<br />
可我觉得一切没那么糟<br />
虽然我只有对爱的幻想<br />
在清晨 在夜晚 在风中<br />
唱着那无人问津的歌谣<br />
也许有一天 我老无所依<br />
请把我留在 在那时光里<br />
如果有一天 我悄然离去<br />
请把我埋在 在这春天里 春天里</p>
<p>你是这此刻烂漫的春天<br />
依然像那时温暖的模样<br />
我剪去长发留起了胡须<br />
曾经的苦痛都随风而去<br />
可我感觉却是那么悲伤<br />
岁月留给我更深的迷惘<br />
在这阳光明媚的春天里<br />
我的眼泪忍不住的流淌<br />
也许有一天 我老无所依<br />
请把我留在 在那时光里<br />
如果有一天 我悄然离去<br />
请把我埋在 在这春天里<br />
如果有一天 我老无所依<br />
请把我留在 在这春天里<br />
如果有一天 我悄然离去<br />
请把我埋在 在这春天里 春天里</p>
]]></content:encoded>
			<wfw:commentRss>http://www.9465.net/archives/243.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>How are you，怎么是你啊</title>
		<link>http://www.9465.net/archives/207.html</link>
		<comments>http://www.9465.net/archives/207.html#comments</comments>
		<pubDate>Fri, 10 Sep 2010 17:24:46 +0000</pubDate>
		<dc:creator>响马</dc:creator>
				<category><![CDATA[胡言乱语]]></category>
		<category><![CDATA[英语]]></category>
		<category><![CDATA[随心]]></category>

		<guid isPermaLink="false">http://www.9465.net/?p=207</guid>
		<description><![CDATA[今天随心回来，抱怨学校里面的英语太简单，连老师都觉得课本讲的没有意义。 我就好奇问她，开始是不是教：“How are you”啊？ 然后她说，是啊是啊，于是大笑。 因为之前我给她讲过一个笑话，翻译“How are you”为“怎么是你”，翻译“How old are you”为“怎么老是你”。 看了不少美剧，有个感觉，那就是如果有人问你：“How are you”的时候，多半你的状况其实已经很不好了。更多的和更随便的是“What&#8217;s up”，或者“What&#8217;s going on”。 不过还好的是，随心他们的教材里面，回复“How are you”的不是“I&#8217;m fine,  tank you, and you”了。也许是个进步了，^_^。 管他呢。]]></description>
			<content:encoded><![CDATA[<p>今天随心回来，抱怨学校里面的英语太简单，连老师都觉得课本讲的没有意义。</p>
<p>我就好奇问她，开始是不是教：“How are you”啊？</p>
<p>然后她说，是啊是啊，于是大笑。</p>
<p>因为之前我给她讲过一个笑话，翻译“How are you”为“怎么是你”，翻译“How old are you”为“怎么老是你”。</p>
<p>看了不少美剧，有个感觉，那就是如果有人问你：“How are you”的时候，多半你的状况其实已经很不好了。更多的和更随便的是“What&#8217;s up”，或者“What&#8217;s going on”。</p>
<p>不过还好的是，随心他们的教材里面，回复“How are you”的不是“I&#8217;m fine,  tank you, and you”了。也许是个进步了，^_^。</p>
<p>管他呢。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.9465.net/archives/207.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>谁是阿凡达</title>
		<link>http://www.9465.net/archives/148.html</link>
		<comments>http://www.9465.net/archives/148.html#comments</comments>
		<pubDate>Sat, 04 Sep 2010 14:14:36 +0000</pubDate>
		<dc:creator>响马</dc:creator>
				<category><![CDATA[电影]]></category>
		<category><![CDATA[社交网络]]></category>
		<category><![CDATA[gravatar]]></category>
		<category><![CDATA[redmine]]></category>
		<category><![CDATA[阿凡达]]></category>

		<guid isPermaLink="false">http://www.9465.net/?p=148</guid>
		<description><![CDATA[最近折腾 WordPress 和 Redmine，发现他们都支持了一个头像服务，叫做 Gravatar，就觉得老外挺搞笑，居然也跟国人一样山寨……]]></description>
			<content:encoded><![CDATA[<p><img class="size-medium wp-image-149 alignleft" title="avatar" src="http://www.9465.net/wp-content/uploads/2010/09/avatar-298x300.jpg" alt="" width="298" height="300" />最近折腾 WordPress 和 Redmine，发现他们都支持了一个头像服务，叫做 Gravatar，就觉得老外挺搞笑，居然也跟国人一样山寨。</p>
<p>然而随着不断挖掘，居然发现大家似乎都很山寨，不但 WordPress 和 Redmine 自己都有支持本地上传的 avatar 插件，就连 facebook 和 tweeter 也叫 avatar，于是就很费解了，就开始问 google 大叔。</p>
<p>google 大叔让我问爱词霸MM，爱词霸MM 这么回答的：</p>
<p><span id="more-148"></span></p>
<pre>1. 化身,天神下凡,具体化
2. 【电脑】(术语)指在虚拟实境中互动地呈现一个人;尤指电脑游戏或聊天室中代表使用者的）化身
3. 2010美国电影《阿凡达》</pre>
<p>“Avatar”源自印度梵语，本意是指”分身、化身”。互联网时代，Avatar成为网络虚拟角色&#8212;网络用户在以图像为主的虚拟世界中的虚拟形象的代名词。</p>
<p>目前可考证的最早关于 avatar 在互联网的应用是 1995 年的 avatar MUD:<br />
<a href="http://en.wikipedia.org/wiki/Avatar_(MUD)" target="_blank">http://en.wikipedia.org/wiki/Avatar_(MUD)</a></p>
<p>所以很难说电影叫 avatar 是依照其本意，还是依照 avatar 在网络世界里的大量应用。</p>
<p>管他呢。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.9465.net/archives/148.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>ubuntu 上 redmine 安装及 svn 权限绑定</title>
		<link>http://www.9465.net/archives/67.html</link>
		<comments>http://www.9465.net/archives/67.html#comments</comments>
		<pubDate>Fri, 03 Sep 2010 16:07:42 +0000</pubDate>
		<dc:creator>响马</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[redmine]]></category>
		<category><![CDATA[svn]]></category>

		<guid isPermaLink="false">http://www.9465.net/?p=67</guid>
		<description><![CDATA[讨论 redmine 的安装，以及使用 redmine 项目关系管理 svn 权限。]]></description>
			<content:encoded><![CDATA[<p>本文并不适用于所有的需求。适用环境如下：</p>
<ul>
<li>redmine 用户分为程序员和普通成员，普通成员不可访问 svn，程序员可以访问，并且可以访问全部 svn 代码。</li>
<li>只有项目组成员才被允许向版本库中提交代码。</li>
</ul>
<p>因为 apache 认证模块的限制，未能实现 svn 的浏览权限与项目绑定。因此程序员允许查阅全部代码。<br />
<span id="more-67"></span><br />
<strong>一、下载并安装 redmine</strong></p>
<pre class="brush:shell">sudo apt-get install apache2 libapache-ruby1.8 apache2-mpm-worker libapache2-mod-passenger
sudo apt-get install redmine redmine-sqlite
sudo chown www-data /usr/share/redmine/config/environment.rb</pre>
<p>安装时选择 sqlite 数据库。</p>
<p><strong>二、配置 apache</strong></p>
<p>编辑文件：/etc/apache2/sites-available/default</p>
<pre class="brush:xml">&lt;VirtualHost *:80&gt;
  RailsBaseURI /
  SetEnv X_DEBIAN_SITEID default
  ServerName redmine
  DocumentRoot /usr/share/redmine/public

  &lt;Directory "/usr/share/redmine/public"&gt;
    AllowOverride None
    Order allow,deny
    Allow from all
  &lt;/Directory&gt;

&lt;/VirtualHost&gt;</pre>
<p><strong>三、修改密码存储方式兼容 apache 认证</strong></p>
<p>修改文件：app/models/user.rb</p>
<pre class="brush:diff">         return nil unless user.auth_source.authenticate(login, password)
       else
+        if user.hashed_password[0,5] != '{SHA}'
+          pw_s = ""
+          user.hashed_password.unpack(
+                  'a2'*(user.hashed_password.length / 2)).collect do |x|
+            pw_s &lt;&lt; x.hex
+          end
+          user.hashed_password = '{SHA}' + Base64.encode64(pw_s).chomp
+        end
+
         return nil unless User.hash_password(password) == user.hashed_password
       end
     else
@@ -274,8 +287,10 @@

 private
   def self.hash_password(clear_password)
-    Digest::SHA1.hexdigest(clear_password || "")
+    '{SHA}' + Base64.encode64(Digest::SHA1.digest(clear_password || "")).chomp
   end
 end</pre>
<p><strong>四、安装 dbi 认证</strong></p>
<pre class="brush:shell">cd /etc/apache2/mods-enabled
sudo ln -s ../mods-available/dbd.load
sudo ln -s ../mods-available/authn_dbd.load
sudo ln -s ../mods-available/auth_basic.load</pre>
<p><strong>五、修改认证方式，并关联 redmine 数据库</strong></p>
<p>修改文件：/etc/apache2/mods-available/dav_svn.conf</p>
<pre class="brush:xml">DBDriver sqlite3
DBDParams "/var/redmine/default/redmine_default" 

&lt;Location /svn&gt;
  DAV svn
  SVNPath /var/svn
  AuthType Basic
  AuthName "Private area" 

  AuthBasicProvider dbd

  AuthDBDUserPWQuery "select hashed_password from users where login=%s and type='User' and status=1 and id in ( select user_id from groups_users,users where group_id=id and type='Group' and (lastname='svn' or lastname='svn_commit'))" 

  Require valid-user
&lt;/Location&gt;</pre>
<p>至此，svn 已被设置为只有属于 svn 或者 svn_commit 两个组的激活用户可以访问 svn，全部具备读写权限。</p>
<p><strong>六、限制提交权限</strong></p>
<p>在 svn\hooks 目录下创建 pre-commit.pl，内容如下。程序中第六行需修改为实际的 sqlite 数据库路径，第 11 行需修改为 svn 的本地实际路径。</p>
<pre class="brush:perl">#!/usr/bin/env perl

use strict;
use Carp;
use DBI;
my $dbh = DBI-&gt;connect("dbi:SQLite:/var/redmine/default/redmine_default") || die "Cannot connect: $DBI::errstr";

my $repos        = shift;
my $txn          = shift;
my $svnlook = "/usr/bin/svnlook";
my $svnbase = "file:///var/svn/";

my $minchars = 4;

my @svnlooklines = &amp;read_from_process($svnlook, 'log', $repos, '-t', $txn);
my $comment = shift @svnlooklines;

unless (length $comment) {
  die "A comment is required!\n";
  }

if ( length($comment) &lt; $minchars ) {
  die "Comment must be at least $minchars characters.\n";
  }

# Get the author from svnlook.
my @svnlooklines = &amp;read_from_process($svnlook, 'author', $repos, '-t', $txn);
my $author = shift @svnlooklines;
unless (length $author)
  {
    die "$0: txn '$txn' has no author.\n";
  }

# Figure out what directories have changed using svnlook..
my @dirs_changed = &amp;read_from_process($svnlook, 'dirs-changed', $repos,
                                      '-t', $txn);

# Lose the trailing slash in the directory names if one exists, except
# in the case of '/'.
my $rootchanged = 0;
for (my $i=0; $i&lt;@dirs_changed; ++$i)
  {
    if ($dirs_changed[$i] eq '/')
      {
        $rootchanged = 1;
      }
    else
      {
        $dirs_changed[$i] =~ s#^(.+)[/\\]$#$1#;
      }
  }

# Figure out what files have changed using svnlook.
my @files_changed;
foreach my $line (&amp;read_from_process($svnlook, 'changed', $repos, '-t', $txn))
  {
    # Split the line up into the modification code and path, ignoring
    # property modifications.
    if ($line =~ /^..  (.*)$/)
      {
        push(@files_changed, $1);
      }
  }

# Create the list of all modified paths.
my @changed = (@dirs_changed, @files_changed);

# There should always be at least one changed path.  If there are
# none, then there maybe something fishy going on, so just exit now
# indicating that the commit should not proceed.
unless (@changed)
  {
    die "$0: no changed paths found in txn '$txn'.\n";
  }

# check admin
my $dbconn = $dbh-&gt;prepare("select login from users where login='$author' and admin='t'");
$dbconn-&gt;execute();

if ( $dbconn-&gt;fetchrow_array )
{
  exit 0;
}

# check group svn_commit
my $dbconn = $dbh-&gt;prepare("select login from users where login='$author' and type='User' and status=1 and id in ( select user_id from groups_users,users where group_id=id and type='Group' and lastname='svn_commit')");
$dbconn-&gt;execute();

unless ( $dbconn-&gt;fetchrow_array )
{
  die "user '$author' does not have permission to commit.\n";
}

my %permissions;
foreach my $path (@changed)
  {
    $permissions{$path} = 0;
  }

my $dbconn = $dbh-&gt;prepare("select substr(url, length('$svnbase')) from users,repositories,members where repositories.project_id=members.project_id and users.id=members.user_id and users.login='$author' and url like '$svnbase%'");
$dbconn-&gt;execute();

while( my $row = $dbconn-&gt;fetchrow_array)
{
  my ($url) = substr($row, 1);

  if (substr($url, -1) eq "/")
  {
    $url = substr($url, 0, length($url) - 1);
  }

  foreach my $path (@changed)
  {
    if( $url eq '' || $path eq $url || ( substr( $path, 0, length($url)) eq $url &amp;&amp; substr( $path, length($url), 1) eq "/" ))
    {
      $permissions{$path} = 1;
    }
  }
}

my $exit_code = 0;

foreach my $path (@changed)
{
  if($permissions{$path} ne 1)
  {
    print STDERR "user '$author' does not have permission to commit to '$path'\n";
    $exit_code = 1;
  }
}

exit $exit_code;

# All checks passed, so allow the commit.

sub safe_read_from_pipe
{
  unless (@_)
    {
      croak "$0: safe_read_from_pipe passed no arguments.\n";
    }
  print "Running @_\n";
  my $pid = open(SAFE_READ, '-|');
  unless (defined $pid)
    {
      die "$0: cannot fork: $!\n";
    }
  unless ($pid)
    {
      open(STDERR, "&gt;&amp;STDOUT")
        or die "$0: cannot dup STDOUT: $!\n";
      exec(@_)
        or die "$0: cannot exec '@_': $!\n";
    }
  my @output;
  while (&lt;SAFE_READ&gt;)
    {
      chomp;
      push(@output, $_);
    }
  close(SAFE_READ);
  my $result = $?;
  my $exit   = $result &gt;&gt; 8;
  my $signal = $result &amp; 127;
  my $cd     = $result &amp; 128 ? "with core dump" : "";
  if ($signal or $cd)
    {
      warn "$0: pipe from '@_' failed $cd: exit=$exit signal=$signal\n";
    }
  if (wantarray)
    {
      return ($result, @output);
    }
  else
    {
      return $result;
    }
}

sub read_from_process
  {
  unless (@_)
    {
      croak "$0: read_from_process passed no arguments.\n";
    }
  my ($status, @output) = &amp;safe_read_from_pipe(@_);
  if ($status)
    {
      if (@output)
        {
          die "$0: '@_' failed with this output:\n", join("\n", @output), "\n";
        }
      else
        {
          die "$0: '@_' failed with no output.\n";
        }
    }
  else
    {
      return @output;
    }
}</pre>
<p>修改完成后，svn 权限被设置成为必须属于项目组成员才可以提交。</p>
<p><strong>七、配置示例</strong></p>
<p>下面举例说明如何具体使用：</p>
<p>假设 svn 路径为 /var/svn，项目为 prj1</p>
<p>在 redmine 的版本库管理里，需要选择 subversion 并设定地址为：file:///var/svn/prj1</p>
<p>svn 将自动按照 file:///var/svn/ 匹配所属项目，并检验用户是否为合法项目成员，验证成功后才会予以提交。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.9465.net/archives/67.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>如何干净的独立一个 svn 项目目录</title>
		<link>http://www.9465.net/archives/49.html</link>
		<comments>http://www.9465.net/archives/49.html#comments</comments>
		<pubDate>Fri, 03 Sep 2010 12:27:27 +0000</pubDate>
		<dc:creator>响马</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[svn]]></category>

		<guid isPermaLink="false">http://www.9465.net/?p=49</guid>
		<description><![CDATA[如何从一个庞大的版本库中将一个项目目录干净地独立出来……]]></description>
			<content:encoded><![CDATA[<p>需要从一个庞大的版本库中将一个项目目录独立出来，这个问题很常见，解决方法也差不多，这里有详细讲解：</p>
<p><a href="http://blog.chrisramsay.co.uk/2008/11/03/split-up-a-multi-project-svn-repo/" target="_blank">http://blog.chrisramsay.co.uk/2008/11/03/split-up-a-multi-project-svn-repo/</a></p>
<p>不过这么处理之后，会有一个遗留问题，那就是会留下大量垃圾日志。整个代码库内的日志全部都会保留，无论是否属于本项目。在大量搜索的基础上，发现这个问题基本无解，甚至准备放弃。</p>
<p>考虑几天后，突发奇想，笨人用笨法，全库操作不可行，咱就一个一个来。通过依次 dump 每个版本，来达到仅同步有用版本的目的。<br />
<span id="more-49"></span><br />
具体方法如下：</p>
<p><strong>一、建立空库，啰嗦一下：</strong></p>
<pre class="brush:shell">svnadmin create tempsvn</pre>
<p><strong>二、取得目标项目的版本列表：</strong></p>
<pre class="brush:shell">svn log file:///var/svn/team1/prj2 &gt; log.txt</pre>
<p><strong>三、依次将版本列表中的版本同步到临时库中。</strong></p>
<p>我比较偷懒，直接用 UltraEdit 的宏处理了文件，勤快的人不妨根据自己的需要写一个小程序，与大家分享。最后我处理出的文本是这样的：</p>
<pre class="brush:shell">svnadmin dump -r 128 file:///var/svn | svnadmin load tempsvn
svnadmin dump --incremental -r 139 file:///var/svn | svnadmin load tempsvn
svnadmin dump --incremental -r 153 file:///var/svn | svnadmin load tempsvn
......</pre>
<p>需要注意两点，log 出来的文件版本号是从大到小的，需要倒序一下；第一个版本的操作需要与后面的版本不同，后面的版本需要增量 dump。</p>
<p>保存文件并执行，Linux 还需要做一些修改，不罗嗦了。</p>
<p><strong>四、更换项目目录。</strong></p>
<p>经过上面的步骤，tempsvn 里便有了一份干净的只有与 team1/prj2 有关系的版本库，但是代码库中还可能因为历史提交的原因包含其他路径的文件，需要再进行一次 dump，svndumpfilter，load 的过程，这些方法前面我提到的博客都有介绍。当然你可以同时修改路径等其他操作。</p>
<p>方法虽然达到目的了，但是因为需要依次同步版本，所以实际操作耗时稍微长一些。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.9465.net/archives/49.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>跟大车师傅学开车</title>
		<link>http://www.9465.net/archives/33.html</link>
		<comments>http://www.9465.net/archives/33.html#comments</comments>
		<pubDate>Mon, 30 Aug 2010 16:34:15 +0000</pubDate>
		<dc:creator>响马</dc:creator>
				<category><![CDATA[在路上]]></category>
		<category><![CDATA[自驾]]></category>

		<guid isPermaLink="false">http://www.9465.net/?p=33</guid>
		<description><![CDATA[去年在呼伦贝尔，同车的人都睡着了，为了强迫自己不睡着，我给自己想了一个题目，那就是这几年出门跑路，都学到了什么行车礼节。一路想想，居然想到不少……]]></description>
			<content:encoded><![CDATA[<p>去年在呼伦贝尔，同车的人都睡着了，为了强迫自己不睡着，我给自己想了一个题目，那就是这几年出门跑路，都学到了什么行车礼节。一路想想，居然想到不少。<br />
<span id="more-33"></span><br />
一，<strong>高速公路不要长时间占用超车道</strong>，意识到这一点是在去太原的高速公路上面。山西的高速都在山区，再加上运煤车比较多，高速速度真的不高，但路上倒一直很通畅。然后我不断发现前面的大车在超车后，都尽可能快的返回到行车道。初想起来，觉得这些大车师傅真绅士。再想一下，如果大车坚持占据超车道，势必导致小车在大车之间穿行超车，这些制动困难的大家伙会更危险。所以，为自己和他人的生命安全着想，请不要长期占据超车道。</p>
<p>二，<strong>别人让路时，如果允许，在通过后鸣笛致谢</strong>。在甘肃玉门的一段土路上，路很窄，后面的大车估计是空车，开得比较快，我向路边让了一下，大车迅速跟上并超了过去，在他车身通过时，师傅按了一下喇叭。当时把我吓了一跳。观察了几回之后，我发现大多数大车师傅都会这么做。因为工作性质，很多大车都需要在狭窄的环境里面协作工作，的确是很需要互相谦让，而不是我们在城市里面到处抢道的。因为会车超车条件比较苛刻，完成超车或会车后，提醒对方自己已经完成动作，也是十分必须的。所以鸣笛也不是单纯的向对方致敬，而是告诉对方可以放心移动了。</p>
<p>三，<strong>当别人向你致谢时，如果允许，可以鸣笛致意</strong>。长白山的一段防火山路，因为是冬天，所以路完全被冰封了。在一辆大车（就是这辆车把我从路边雪窝里拖出来的）给我让路，我通过并鸣笛致谢时，几乎马上，大车也鸣笛致意。因为当时开着窗子，大车的喇叭把我们都狠狠的吓了一跳。很多大车师傅在别人致谢的时候，都会这样致意，当然也不是全部。</p>
<p>四，<strong>在山区弯道上，积极协助后车超车</strong>。大兴安岭的山路视野很不好，几乎没有可能能安全超车，直线距离不够，弯道视野不好。但是几乎每次，前面的大车都会在某个弯道，在我看不见前方路况的时候，打出右转向灯。于是我便可以了解到一个信息，大车师傅看到弯道前方对方车道无车，我可以借道超车。相反如果大车在弯道处没有打出右转向灯，那么要么大车师傅看你不爽，要么就是对方车道会车，不适合借道超车。试想如果大车师傅不协助，后车强行弯道超车时发现会车，一定会往外掰，倒霉的还是大车自己。</p>
<p>五，<strong>在狭窄道路上，如果你发现可以会车的位置，尽快停下等待会车</strong>。很多乡间的道路，以及沙漠公路，都是单车道的，不是双向单车道，是单车道。就是说，一旦会车，必定有一辆车要下路，而通常下路都不会有什么好结果。这种单车道一般都有会车用的停车带，停车带的位置会出现一个两车道的宽度。如果你发现自己可以先到达一个停车带，一定要进入等待，不要希望对方停下来等你会车，因为通常你能看到的地方不会有第二个停车带。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.9465.net/archives/33.html/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>免费邮箱搬家</title>
		<link>http://www.9465.net/archives/24.html</link>
		<comments>http://www.9465.net/archives/24.html#comments</comments>
		<pubDate>Sun, 29 Aug 2010 07:04:53 +0000</pubDate>
		<dc:creator>响马</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[免费资源]]></category>

		<guid isPermaLink="false">http://www.9465.net/?p=24</guid>
		<description><![CDATA[9465.net 邮箱托管从 live.com 迁移到 163.com，一点体会……]]></description>
			<content:encoded><![CDATA[<p>9465.net 的邮箱以前一直由 live.com 托管，随着使用越来越频繁，感觉国内使用实在是太慢太慢了，但是一直也下不了决心更换。</p>
<p>直到最近重装 wordpress，想用邮箱发送注册邮件和评论通知，使用了一个 WP-Mail-SMTP 的插件，而在安装过程中却发现不支持 live.com 的邮箱，趁此东风，决定更换邮箱托管了。</p>
<p>于是简单查看了一下国内的免费域名邮箱，sohu 需要企业营业执照，就先选择了网易的免费企业邮箱 ym.163.com。</p>
<p> 折腾一下午，更换完成。目前看来有几个好处：</p>
<p>一，速度快。的确是快，ping pop.ym.163.com 延时 66ms，而 pop3.live.com 要 380ms。<br />
二，支持邮件群。对我是没有用处的，但是企业使用这点还是有些好处的。<br />
三，协议简单，使用方便。我并不需要多好的安全性，但是却需要比较好的兼容性，于是不支持 ssl 对我来说反而成了优点。对于企业就难说了。<br />
四，outlook 收信不再重复。live.com 在设置不删除服务器信件后（因为手机还需要收信，所以不能收信后立即删除），outlook 会不断重复信件。现在好了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.9465.net/archives/24.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>重新来过</title>
		<link>http://www.9465.net/archives/16.html</link>
		<comments>http://www.9465.net/archives/16.html#comments</comments>
		<pubDate>Sat, 28 Aug 2010 16:06:51 +0000</pubDate>
		<dc:creator>响马</dc:creator>
				<category><![CDATA[胡言乱语]]></category>

		<guid isPermaLink="false">http://www.9465.net/?p=16</guid>
		<description><![CDATA[之前的数据懒得恢复了，在 ubuntu 上架设了一个新 wordpress，重新来过。 只是从前的老朋友们需要重新注册一下子，辛苦辛苦。]]></description>
			<content:encoded><![CDATA[<p>之前的数据懒得恢复了，在 ubuntu 上架设了一个新 wordpress，重新来过。</p>
<p>只是从前的老朋友们需要重新注册一下子，辛苦辛苦。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.9465.net/archives/16.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

