<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0' version='2.0'><channel><atom:id>tag:blogger.com,1999:blog-7400397557817693121</atom:id><lastBuildDate>Thu, 22 Mar 2012 15:44:41 +0000</lastBuildDate><category>哈利路亚山</category><category>媳妇</category><category>就业</category><category>resgen</category><category>心情</category><category>感悟</category><category>工作</category><category>李承鹏</category><category>相片</category><category>采风</category><category>白名单</category><category>两会</category><category>firefox</category><category>中国经济</category><category>RSS</category><category>google map</category><category>网络审查</category><category>djangomarkup</category><category>ELLA</category><category>time traveler</category><category>网站清理</category><category>现实主义影视</category><category>resources</category><category>谷歌</category><category>海上皇宫</category><category>Lie to me</category><category>GFW</category><category>.net</category><category>Windows Service</category><category>AutoMapper</category><category>sea palace</category><category>游戏</category><category>ildasm</category><category>违章建筑</category><category>签名</category><category>杯具</category><category>国企</category><category>工信部</category><category>ui tabs</category><category>十月围城</category><category>Yahoo Pipes</category><category>百度</category><category>水利工程</category><category>地震</category><category>django</category><category>反腐</category><category>旅游</category><category>搬家</category><category>1e100.net</category><category>崇敬</category><category>读书</category><category>二倍距离</category><category>脚本</category><category>观后感</category><category>理财</category><category>trac</category><category>耕种效率</category><category>baidu</category><category>Skybound</category><category>西南旱情</category><category>时间旅行者</category><category>足球</category><category>media card</category><category>云南</category><category>股市</category><category>退出中国</category><category>fatal error</category><category>私企</category><category>不许联想</category><category>google</category><category>subversion</category><category>svn</category><category>反黑</category><category>Gecho</category><category>XP</category><category>通货膨胀</category><category>毛泽东</category><category>Winform</category><category>中国足球</category><category>网吧</category><category>哲学</category><category>周洋</category><category>神话</category><category>Visual Studio 2010</category><category>Avatar</category><category>交学费</category><category>VS2010 Ultimate</category><category>张家界</category><category>电影</category><category>reflector</category><category>Entity Frameworkd</category><category>MySQL Connector</category><category>geckofx</category><category>柳江</category><category>bat</category><category>异想天开</category><category>麦田圈</category><category>陈亦明</category><category>上调工资</category><category>父亲日记</category><category>安装</category><category>股票</category><category>ilasm</category><category>IE6</category><category>张洪石</category><category>ajax</category><category>编程</category><category>remote</category><category>金喜善</category><category>搜索引擎</category><category>Bodyguards and Assassins</category><category>项目管理</category><category>农民问题</category><category>water villa</category><category>resx</category><category>朝廷放屁</category><category>jquery</category><category>瓦屋山</category><category>blackberry</category><category>google earth</category><category>GeckoWebBrowser</category><category>随笔</category><category>经济学家</category><category>MySql</category><category>现代诗</category><category>水上别墅</category><category>xpcom</category><category>房价</category><category>V底</category><category>破解</category><category>蚁族</category><title>葡萄树下不乘凉</title><description>workingbird的博客，讲述我的生活和理想。</description><link>http://workingbird.365-366.com/</link><managingEditor>noreply@blogger.com (工作鸟)</managingEditor><generator>Blogger</generator><openSearch:totalResults>59</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-7400397557817693121.post-5272450070739133731</guid><pubDate>Tue, 13 Sep 2011 15:49:00 +0000</pubDate><atom:updated>2011-09-13T08:49:07.863-07:00</atom:updated><title>西安事变前中国国内的抗日格局</title><description>看待蒋介石的抗日，并不是三言两语能说清楚的。历史千万不能像我们的教科书那样，割裂起来看，那样是很容易被忽悠的。我也说个一二点，时间到西安事变，只分析了国内的部分 事情，且蒋介石1932年之前，都是打仗多，还有民国政府的党内约束造成两次下野，政治啊外交啊之类的事情也做得不多。事实不完整，权且留给大家敲砖。&lt;br /&gt;&lt;br /&gt;九一八之前：&lt;br /&gt;1、明治维新之后，日本近代工业开始高速发展。《江华条约》之后，工业化和军国化思想更加盛行，海军等近代军种得以高速发展。（中国开始洋务运动，近代工业开始起步，但到 后期，重心都倾向于轻工业，——估计是慈禧太后小女人心理吧。）&lt;br /&gt;&lt;br /&gt;2、1892年《甲午战争》，日军大获全胜。（中国签订马关条约，割地若干，赔款2亿多白银。）&lt;br /&gt;&lt;br /&gt;3、1900年，日本组团八国联军，“应邀”剿灭义和团。（1901年，中国签订辛丑条约，赔款八国共4亿多白银。）&lt;br /&gt;&lt;br /&gt;4、随后日本在朝鲜、东北，和俄国打仗。（中国也参加了，为日俄和平，贡献了旅顺、大连。）&lt;br /&gt;&lt;br /&gt;5、1914年一战爆发，日本参展，属于战胜国；同期占领胶济线。（中国也是战胜国，当时的政府主要是袁世凯，签订了二十一条，所以有了1919年的五四运动。）&lt;br /&gt;&lt;br /&gt;6、1918年日本出兵西伯利亚，被伟大的俄国击败，192X年铩羽而归，估计元气大伤，小打小闹不算的话，消停了若干年，一直到1928年皇姑屯事件，张作霖拜拜。（1 921年，武昌起义，建立中华民国。因为清政府被推翻，各地的军阀开始闹独立，1922-1924年两次直奉战争。）——张作霖是被北伐军（1924年）“逼”回去东北的 ，正因为和直系有仇，所以才后少帅的东北易帜，和南京国民政府合作。&amp;lt;1921年，中国共产党成立；1922年，苏联建国，中国共产党加入共产国际，接受俄共领导。192 4年国民党“一全”，国共第一次合作，1927年“八七会议”，“枪杆子里出政权”，共产党发动南昌起义及农民暴动——秋收起义。&amp;gt;（蒋介石围剿，未果。随后下野。）&lt;br /&gt;&lt;br /&gt;九一八——西安事变前：&lt;br /&gt;&lt;br /&gt;7、1931年，九一八事变。（东北易帜后，蒋奉联合，先后经历了中国1929年两次蒋冯战争，1930年中原大战。——中原大战持续大半年，2挑4。蒋、张估计中原大战 受损严重；同时，40年的战争消耗，工业化、军事力量已经远远落后于当时休养生息完毕的日本；蒋张只好退守山海关，收缩防御——这个结论是我猜的。随后，学生抗议，国民党 内讧，蒋介石下野，至翌年复出。）&amp;lt;1930-1935年，为共产国际代表王明期间。此五年历史很空缺，主要大事有两个：1931年11月，成立中华苏维埃，颁布宪法、发 行货币、设计国旗——王明确定苏维埃和国民政府为的“两国之争”；还有一个就是长征。&amp;gt;&lt;br /&gt;&lt;br /&gt;8、1932年，一二八事变。（蒋介石1月28日复出——有临危受命的感觉哈——死命抵抗，落败。）1932年，日本在东北成立伪满，建立战略后方，借助东北资源，以战养 战，大力发展军事工业。——东北重工业基地的底子，是日本人打下的。（1932年，蒋汪合作，共同抗日。）1933年，日本人入关，逼近北京、天津。（1933年，蒋介石 “攘外必先安内”，开始围剿苏维埃政权。汪精卫开始对日和谈，主导《塘沽协定》，至1937年七七事变，中日无大的冲突。）&amp;lt;1934年遵义会议后，至1935年，共产党长征。1935年，一二九运动——又是学生哈——要求“停止内战，一致对外”，随后瓦窑堡会议，确定抗日民族统一战线。&amp;gt;&lt;br /&gt;&lt;br /&gt;9、1936年，西安事变。国共二次合作，共同抗日。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7400397557817693121-5272450070739133731?l=workingbird.365-366.com' alt='' /&gt;&lt;/div&gt;</description><link>http://workingbird.365-366.com/2011/09/blog-post.html</link><author>noreply@blogger.com (工作鸟)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-7400397557817693121.post-2511213941389945911</guid><pubDate>Mon, 25 Oct 2010 02:59:00 +0000</pubDate><atom:updated>2010-10-24T19:59:13.001-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>随笔</category><title>什么是四爷</title><description>&lt;p&gt;人家都叫我四爷。很奇怪，我为什么叫四爷呢？我家我老大，应该是大爷而不是四爷。我之所以叫四爷，是因为在我的心理，四爷是一个伟大而又平常的人物。他就是我的四爷。我崇拜四爷，所以，别人看我常说四爷，就直接叫我四爷了。&lt;/p&gt;  &lt;p&gt;注：&lt;/p&gt;  &lt;p&gt;这篇文章是关于关键字四爷的测试文章。特此说明。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:47b2e981-1fd5-4043-bf1c-aecdcc49e182" class="wlWriterEditableSmartContent"&gt;标签: &lt;a href="http://workingbird.365-366.com/search/label/%e5%9b%9b%e7%88%b7" rel="tag"&gt;四爷&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7400397557817693121-2511213941389945911?l=workingbird.365-366.com' alt='' /&gt;&lt;/div&gt;</description><link>http://workingbird.365-366.com/2010/10/blog-post.html</link><author>noreply@blogger.com (工作鸟)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-7400397557817693121.post-4944737854722954640</guid><pubDate>Thu, 19 Aug 2010 17:21:00 +0000</pubDate><atom:updated>2010-08-19T10:38:16.484-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>AutoMapper</category><category domain='http://www.blogger.com/atom/ns#'>Winform</category><category domain='http://www.blogger.com/atom/ns#'>.net</category><title>Winform开发的利器autoMapper</title><description>&lt;p&gt;很多年没有在这儿写技术博客了。有些生疏，朋友们见谅。&lt;/p&gt;  &lt;h2&gt;引子&lt;/h2&gt;  &lt;p&gt;估计有不少写.Net的朋友也是和我一样，平时主要以WebForm开发位置，遇到WinForm开发的时候，总会遇到一些本来在WebForm下面很熟练的问题，在WinForm下面却麻烦重重了。&lt;/p&gt;  &lt;p&gt;我也刚开始写WinForm，时间不长。希望在这个过程中遇到的一些问题和解决办法，可以一一拿出来和朋友们分享。&lt;/p&gt;  &lt;h2&gt;场景&lt;/h2&gt;  &lt;p&gt;有如下一个及其简单的场景：&lt;/p&gt;  &lt;p&gt;1、主界面(Main)中有一项需要在另外一个Item编辑窗口(ItemEdit)中编辑；&lt;/p&gt;  &lt;p&gt;2、用户可以在窗口中对Item中的一些属性就行修改，保存后回到主窗口，这时主窗口在不刷新数据库的情况下，可以显示用户最新的编辑内容；&lt;/p&gt;  &lt;p&gt;3、用户也可能编辑部分内容后放弃了继续编辑，此时主窗口的内容应该保持不变。&lt;/p&gt;  &lt;h2&gt;非AutoMapper的一些解决办法&lt;/h2&gt;  &lt;p&gt;为实现上述需求，通常，编辑界面的构造函数中，添加一个参数用于传递待编辑对象即可。如&lt;/p&gt;  &lt;div&gt;   &lt;pre&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; ItemEdit(Entity entity){}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;上述需求如果在WebForm中很容易实现。因为WebForm的界面之间在不使用浏览器脚本的情况下，是相互独立的，没有通信。但对于WinForm，在实现场景需求3的时候，由于Entity是引用类型，如Entity被绑定到控件，用户一旦编辑后，实体将被同步修改，即便用户取消，在主界面中实体也已经被修改了。&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;  &lt;p&gt;一种相对ugly的解决办法是，在ItemEdit中，对象不绑定到控件，而在加载时手动为控件赋值，同时，在用户确定保存的时候，再从控件中依次取值，并依次赋值到Entity中。如&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;  &lt;div&gt;&lt;br /&gt;    &lt;pre&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt; TextBox tbxName = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; TextBox();&lt;br /&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; ItemEdit_Load(&lt;span style="color: #0000ff"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;	tbxName.Text = _entity.Name;&lt;br /&gt;}&lt;br /&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt; Button btvSave = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Button();&lt;br /&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; btnSave_Click(&lt;span style="color: #0000ff"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;	_entity.Name = tbxName.Text;&lt;br /&gt;	Save(_entity);&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;  &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;p&gt;在使用WinForm的时候，更常用的方式是采用控件绑定的方式。如：&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;  &lt;div&gt;&lt;br /&gt;    &lt;pre&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt; TextBox tbxName = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; TextBox();&lt;br /&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt; Button btvSave = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Button();&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; ItemEdit_Load(&lt;span style="color: #0000ff"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;	tbxName.DataBings.Add(&amp;quot;&lt;span style="color: #8b0000"&gt;Text&lt;/span&gt;&amp;quot;,_entity,&amp;quot;&lt;span style="color: #8b0000"&gt;Name&lt;/span&gt;&amp;quot;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; btnSave_Click(&lt;span style="color: #0000ff"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;	Save(_entity);&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;  &lt;/div&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;很明显，如果采用第二种方法，_entity的值将是和控件的中绑定的属性同步的。如果要避免这种情况，我们在页面编辑时，需要使用另外一个对象，以避免编辑时的实体与传入的entity存在引用关系。你也可以使用下面的这种方式，——如果在Entity有几十个属性的时候，你也不觉得麻烦的话，——下面的内容你也不需要在遇到了。&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;pre&gt;Entity _entityForEdit = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Entity();&lt;br /&gt;_entityForEdit.Name = _entity.Name;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;AutoMapper的解决办法&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;在这里，我们采用&lt;a href="http://automapper.codeplex.com/"&gt;AutoMapper&lt;/a&gt;来觉得这种问题。为了方便，我采用一个简单的测试用例的方式来说明。&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;div&gt;&lt;br /&gt;    &lt;pre&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; AutoMapper;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; NUnit.Framework;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt; RQQuery.Client.Test&lt;br /&gt;{&lt;br /&gt;    [TestFixture]&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; AutoMapperTest&lt;br /&gt;    {&lt;br /&gt;        [Test]&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; MainTest()&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; name = &amp;quot;&lt;span style="color: #8b0000"&gt;Entity From Main.&lt;/span&gt;&amp;quot;;&lt;br /&gt;            var entityForSave = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Entity {Name = name};&lt;br /&gt;            var codeForSave = entityForSave.GetHashCode();&lt;br /&gt;            var itemEditSaved = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ItemEdit(entityForSave);&lt;br /&gt;            itemEditSaved.Edit();&lt;br /&gt;            &lt;strong&gt;itemEditSaved.&lt;font color="#ff0000"&gt;Save();&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;            &lt;span style="color: #008000"&gt;//期望Name值被修改。&lt;/span&gt;&lt;br /&gt;            Assert.AreEqual(&amp;quot;&lt;span style="color: #8b0000"&gt;Entity is changed.&lt;/span&gt;&amp;quot;, entityForSave.Name,&amp;quot;&lt;span style="color: #8b0000"&gt;修改不成功&lt;/span&gt;&amp;quot;);&lt;br /&gt;            &lt;span style="color: #008000"&gt;//期望引用关系不被破坏。&lt;/span&gt;&lt;br /&gt;            Assert.AreEqual(codeForSave, entityForSave.GetHashCode(), &amp;quot;&lt;span style="color: #8b0000"&gt;引用关系丢失&lt;/span&gt;&amp;quot;);&lt;br /&gt;&lt;br /&gt;            var entityForCancel = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Entity { Name = name };&lt;br /&gt;            var codeForCancel = entityForSave.GetHashCode();&lt;br /&gt;            var itemEditCanceled = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ItemEdit(entityForCancel);&lt;br /&gt;            itemEditCanceled.Edit();&lt;br /&gt;            &lt;strong&gt;itemEditCanceled.&lt;font color="#ff0000"&gt;Cancel();&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;            &lt;span style="color: #008000"&gt;//期望Name值没有被修改。&lt;/span&gt;&lt;br /&gt;            Assert.AreEqual(name, entityForCancel.Name,&amp;quot;&lt;span style="color: #8b0000"&gt;已被修改&lt;/span&gt;&amp;quot;);&lt;br /&gt;            &lt;span style="color: #008000"&gt;//期望引用关系不被破坏。&lt;/span&gt;&lt;br /&gt;            Assert.AreEqual(codeForCancel, entityForSave.GetHashCode(), &amp;quot;&lt;span style="color: #8b0000"&gt;引用关系丢失&lt;/span&gt;&amp;quot;);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; Entity&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; Name { &lt;span style="color: #0000ff"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff"&gt;set&lt;/span&gt;; }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; ItemEdit&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;readonly&lt;/span&gt; Entity _entity;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;readonly&lt;/span&gt; Entity _entityForEdit;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; ItemEdit(Entity entity)&lt;br /&gt;        {&lt;br /&gt;            _entity = entity;&lt;br /&gt;&lt;br /&gt;            Mapper.CreateMap&amp;lt;Entity, Entity&amp;gt;();&lt;br /&gt;            &lt;br /&gt;            &lt;span style="color: #008000"&gt;//使用Mapper.Map&amp;lt;TSource,TDistination&amp;gt;(TEntity entity)，获取新的实例。&lt;/span&gt;&lt;br /&gt;            _entityForEdit = Mapper.Map&amp;lt;Entity, Entity&amp;gt;(_entity);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Edit()&lt;br /&gt;        {&lt;br /&gt;            _entityForEdit.Name = &amp;quot;&lt;span style="color: #8b0000"&gt;Entity is changed.&lt;/span&gt;&amp;quot;;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Save()&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #008000"&gt;//使用Mapper.Map&amp;lt;TSource,TDistination&amp;gt;(TEntity entity, TDistination distinationEntity)，&lt;/span&gt;&lt;br /&gt;            &lt;span style="color: #008000"&gt;//将从entity中取值，并复制给distinationEntity。&lt;/span&gt;&lt;br /&gt;            Mapper.Map&amp;lt;Entity,Entity&amp;gt;(_entityForEdit, _entity);&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #008000"&gt;//you can save _entity here.&lt;/span&gt;&lt;br /&gt;            &lt;span style="color: #008000"&gt;//....&lt;/span&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Cancel()&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #008000"&gt;//do nothing.&lt;/span&gt;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;  &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;上述MainTest方法，即模拟主界面的操作过程。代码是最好的注释，其余的就不详细解释了。&lt;img alt="" src="http://www.zu14.cn/coolemotion/emotions/zz_3.gif" /&gt; &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;在使用AutoMapper的时候，通过Mapper.CreateMap方法，创建实体的映射关系。&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;pre&gt;Mapper.CreateMap&amp;lt;Entity, Entity&amp;gt;();&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;我们在这里，将Entity自己映射为Entity。&lt;strong&gt;如果不声明这个映射，在使用Mapper.Get的时候，我们也可以获得对象，但AutoMapper将总是创建一个新的实例来完成映射&lt;/strong&gt;。&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Mapper.CreateMap第一个参数为源类型，第二个参数为目标类型。在映射时，如果源类型的属性与目标类型中的属性对应，即可完成映射；如果属性不同，可以通过ForMember、Ignore等方法声明对关系进行声明。更多用法的详细说明，可&lt;a href="http://automapper.codeplex.com/"&gt;参考文档&lt;/a&gt;（我没有找到更详细的，你有的话，可以告诉我。&lt;img alt="" src="http://www.zu14.cn/coolemotion/emotions/zz_16.gif" /&gt; ）。代码是最好的注释，IDE工具智能感知一下，用起来还是比较顺手的。或者google之。&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;----------------------------------------分隔线后面是精华---------------------------------- &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;&lt;strong&gt;重点注意&lt;/strong&gt;：&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;A：在对实体映射赋值时，只带source一个参数的Map方法，AutoMapper将创建新的实例作为返回值。&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;pre&gt;_entityForEdit = Mapper.Map&amp;lt;Entity, Entity&amp;gt;(_entity);&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;B：在对实体映射赋值时，使用带Distination的Map方法，AutoMapper将source实体的值映射到destination上，并不创建新的实例。此时也有返回值，与destination相同。在这里，我们将_entityForEdit的值直接赋给_entity，&lt;strong&gt;以保证引用关系的不被破坏&lt;/strong&gt;。（如采用A中的方法，则HashCode测试将不通过。）&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;pre&gt;Mapper.Map&amp;lt;Entity,Entity&amp;gt;(_entityForEdit, _entity);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;--EOF--&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7400397557817693121-4944737854722954640?l=workingbird.365-366.com' alt='' /&gt;&lt;/div&gt;</description><link>http://workingbird.365-366.com/2010/08/winformautomapper.html</link><author>noreply@blogger.com (工作鸟)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-7400397557817693121.post-2260062713049820304</guid><pubDate>Tue, 17 Aug 2010 07:57:00 +0000</pubDate><atom:updated>2010-08-17T00:58:11.844-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>杯具</category><title>关于一个插件，折腾48小时后的叨叨</title><description>&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:3dcb5bc7-05c4-4dd4-b28d-b90accc72fae" class="wlWriterEditableSmartContent"&gt;标签: &lt;a href="http://workingbird.365-366.com/search/label/Visual+Studio+2010" rel="tag"&gt;Visual Studio 2010&lt;/a&gt;&lt;/div&gt;  &lt;p&gt;上周日晚上，因为想在Ankhsvn上面集成一个IssueTracker，到CollabNet上面的那个desktop-vs。没有什么详细的说明，只有一个界面，感觉挺好的，和VSTF差不多。既然是Desktop，应该是单机版的，我也只需要一个这样的就满足要求了，毕竟只是为了任务速记。&lt;/p&gt;  &lt;p&gt;好不容易下载下来了，安装时却死活都安装不上。&lt;img alt="" src="http://www.zu14.cn/coolemotion/emotions/tu_1.gif" /&gt; &lt;/p&gt;  &lt;p&gt;于是，48小时的杯具就诞生了。&lt;img alt="" src="http://www.zu14.cn/coolemotion/emotions/tu_0.gif" /&gt; &lt;/p&gt;  &lt;p&gt;1、先根据错误activity的log信息，以为是VS 9.0下面的devenv在干扰，卸载了Visual Studio 2008。不行。&lt;/p&gt;  &lt;p&gt;2、错误信息变成了VS 10.0下面你的Devenv。担心是不是什么组件出错了，但log日志毕竟不如微软官方的那么详细。咬咬牙，把Visual Studio 2010修复了一下。（耗时N久）还是不行。&lt;/p&gt;  &lt;p&gt;3、一狠心，重装了Visual Studio 2010。这下总算可以了，desktop-vs可以安装上了，结果发现原来这个是Collabnet的一系列集成方案中的一个插件，还要装一个集成服务才行。可惜，文档（好像没有文档）里面语焉不详，只有下载页面的说明才有这些痕迹。谁又能细想？&lt;/p&gt;  &lt;p&gt;那就只好不管了。找到了一个&lt;a href="http://www.versioned.com/"&gt;Artifacts&lt;/a&gt;，正好可以单机版的。可惜是文件管理的，而且不能和ankhsvn集成。忍忍只好将就了。&lt;/p&gt;  &lt;p&gt;因为卸载了Visual Studio 2010，之前安装的很多组件都出现了问题。重装组件时出现了一些重叠的东西，第二天，把常用的插件卸载后重新安装了Visual Studio 2010。但到使用的时候，Visual Studio提示了如下的错误：&lt;/p&gt;  &lt;p&gt;---------------------------   &lt;br /&gt;Microsoft Visual Studio    &lt;br /&gt;---------------------------    &lt;br /&gt;The 'Visual Studio Explorers and Designers Package' package did not load correctly. &lt;/p&gt;  &lt;p&gt;The problem may have been caused by a configuration change or by the installation of another extension. You can get more information by running the application together with the /log parameter on the command line, and then examining the file 'C:\Users\myname\AppData\Roaming\Microsoft\VisualStudio\10.0\ActivityLog.xml'. &lt;/p&gt;  &lt;p&gt;Continue to show this error message?   &lt;br /&gt;---------------------------    &lt;br /&gt;是(Y)&amp;#160;&amp;#160; 否(N)&amp;#160;&amp;#160; &lt;br /&gt;--------------------------- &lt;/p&gt;  &lt;p&gt;---------------------------   &lt;br /&gt;Microsoft Visual Studio    &lt;br /&gt;---------------------------    &lt;br /&gt;The 'VSTS for Database Professionals Sql Server Data-tier Application' package did not load correctly. &lt;/p&gt;  &lt;p&gt;The problem may have been caused by a configuration change or by the installation of another extension. You can get more information by running the application together with the /log parameter on the command line, and then examining the file 'C:\Users\myname\AppData\Roaming\Microsoft\VisualStudio\10.0\ActivityLog.xml'. &lt;/p&gt;  &lt;p&gt;Continue to show this error message?   &lt;br /&gt;---------------------------    &lt;br /&gt;是(Y)&amp;#160;&amp;#160; 否(N)&amp;#160;&amp;#160; &lt;br /&gt;--------------------------- &lt;/p&gt;  &lt;p&gt;---------------------------   &lt;br /&gt;Microsoft Visual Studio    &lt;br /&gt;---------------------------    &lt;br /&gt;The 'RadLangSvc.Package, RadLangSvc.VS, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91' package did not load correctly. &lt;/p&gt;  &lt;p&gt;The problem may have been caused by a configuration change or by the installation of another extension. You can get more information by running the application together with the /log parameter on the command line, and then examining the file 'C:\Users\myname\AppData\Roaming\Microsoft\VisualStudio\10.0\ActivityLog.xml'. &lt;/p&gt;  &lt;p&gt;Continue to show this error message?   &lt;br /&gt;---------------------------    &lt;br /&gt;是(Y)&amp;#160;&amp;#160; 否(N)&amp;#160;&amp;#160; &lt;br /&gt;--------------------------- &lt;/p&gt;  &lt;p&gt;---------------------------   &lt;br /&gt;Microsoft Visual Studio    &lt;br /&gt;---------------------------    &lt;br /&gt;The 'Language Package' package did not load correctly. &lt;/p&gt;  &lt;p&gt;The problem may have been caused by a configuration change or by the installation of another extension. You can get more information by running the application together with the /log parameter on the command line, and then examining the file 'C:\Users\myname\AppData\Roaming\Microsoft\VisualStudio\10.0\ActivityLog.xml'. &lt;/p&gt;  &lt;p&gt;Continue to show this error message?   &lt;br /&gt;---------------------------    &lt;br /&gt;是(Y)&amp;#160;&amp;#160; 否(N)&amp;#160;&amp;#160; &lt;br /&gt;---------------------------&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;不勾（Google）不知道，勾完才发现，这些问题从2005年开始就有了。&lt;img alt="" src="http://www.zu14.cn/coolemotion/emotions/zz_11.gif" /&gt; 这从另外一个方面说明这是无解的。&lt;/p&gt;  &lt;p&gt;再经历一天一夜，24小时后，也就是刚才，我总算确认了，这个是无解的。&lt;img alt="" src="http://www.zu14.cn/coolemotion/emotions/zz_4.gif" /&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;唯一欣慰的是，如果使用/SafeMode模式启动，VS是正常的。&lt;/p&gt;  &lt;p&gt;安装的插件太多，重装之后，VS又是直接使用之前安装过的插件，这造成我根本就无法判断是哪个插件除了错。&lt;/p&gt;  &lt;p&gt;就在刚才反复清理“控制面板-&amp;gt;程序”，发现了这个Artifacts。卸载之后再正常启动Devenv，这个世界就清净了。&lt;img alt="" src="http://www.zu14.cn/coolemotion/emotions/tu_3.gif" /&gt; &lt;/p&gt;  &lt;p&gt;48小时，走了一圈，回到了原地。还是没有找到被集成到Ankhsvn中的IssueTracker。也许有时间会自己按照desktop-vs的方式，写一个单机版的。大致上能覆盖如下需求就行了：&lt;/p&gt;  &lt;p&gt;1、以数据库文件（Sqlite3，etc。）保存。通过Ankhsvn配置issue数据库。&lt;/p&gt;  &lt;p&gt;2、通过Ankhsvn增删改查Issue内容。&lt;/p&gt;  &lt;p&gt;Enhance：&lt;/p&gt;  &lt;p&gt;3、Commit时，可以通过修改相应Issue的状态。&lt;/p&gt;  &lt;p&gt;Enhance More：&lt;/p&gt;  &lt;p&gt;4、除了独立数据库直接操作外，还可以提供一些Socket供多个用户同时使用，这样可以符合团队开发的要求。&lt;/p&gt;  &lt;p&gt;5、也可以提供一些接口，给Subversion调用。&lt;/p&gt;  &lt;p&gt;绕来绕去，直接说吧，如果有一款能够Subversion、Trac集成的VS插件，该是个多美妙的事情啊！&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7400397557817693121-2260062713049820304?l=workingbird.365-366.com' alt='' /&gt;&lt;/div&gt;</description><link>http://workingbird.365-366.com/2010/08/visual-studio-2010.html</link><author>noreply@blogger.com (工作鸟)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-7400397557817693121.post-2321312106098553686</guid><pubDate>Tue, 17 Aug 2010 05:57:00 +0000</pubDate><atom:updated>2010-08-16T22:57:35.795-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>随笔</category><title>试用一下Live Writer的代码插件功能</title><description>&lt;p&gt;   &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:56f715c1-6c0e-4c7e-8b8a-9f85d31bf1e4" class="wlWriterEditableSmartContent"&gt;标签: &lt;a href="http://workingbird.365-366.com/search/label/%e6%b5%8b%e8%af%95" rel="tag"&gt;测试&lt;/a&gt;，&lt;a href="http://workingbird.365-366.com/search/label/%e4%bb%a3%e7%a0%81%e6%8f%92%e4%bb%b6" rel="tag"&gt;代码插件&lt;/a&gt;&lt;/div&gt; &lt;/p&gt;  &lt;p&gt;看一下C# 的效果。&lt;/p&gt;  &lt;div&gt;   &lt;pre&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; HelloWorld()&lt;br /&gt;{&lt;br /&gt;  Console.WriteLine(&amp;quot;&lt;span style="color: #8b0000"&gt;hello world.&lt;/span&gt;&amp;quot;);&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;还不错。&lt;img alt="" src="http://www.zu14.cn/coolemotion/emotions/tu_24.gif" /&gt; &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;再来个SQL&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;pre&gt;&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=Select&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;Select&lt;/a&gt; &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=Money&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;Money&lt;/a&gt; &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=From&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;From&lt;/a&gt; Wallet &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=Where&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;Where&lt;/a&gt; Amount &amp;gt; 100;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;基本还行吧。&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;再来个图片呢？&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh6.ggpht.com/_ajqEp4uKzG0/TGokyF9TaLI/AAAAAAAAAGI/alGRFzRqgog/s1600-h/Image.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="猪八戒" border="0" alt="猪八戒" src="http://lh4.ggpht.com/_ajqEp4uKzG0/TGokzUTMAqI/AAAAAAAAAGM/eVs-ogW5zqU/Image.jpg?imgmax=800" width="109" height="113" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;换个行之后看一下效果。换个行之后看一下效果。换个行之后看一下效果。换个行之后看一下效果。换个行之后看一下效果。换个行之后看一下效果。换个行之后看一下效果。&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;换个行之后看一下效果。换个行之后看一下效果。换个行之后看一下效果。换个行之后看一下效果。换个行之后看一下效果。换个行之后看一下效果。换个行之后看一下效果。&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;嗯。差不多了。不折腾了。总的说来还行。&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7400397557817693121-2321312106098553686?l=workingbird.365-366.com' alt='' /&gt;&lt;/div&gt;</description><link>http://workingbird.365-366.com/2010/08/live-writer.html</link><author>noreply@blogger.com (工作鸟)</author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_ajqEp4uKzG0/TGokzUTMAqI/AAAAAAAAAGM/eVs-ogW5zqU/s72-c/Image.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-7400397557817693121.post-8004114110889223882</guid><pubDate>Fri, 06 Aug 2010 17:42:00 +0000</pubDate><atom:updated>2010-08-06T10:42:21.333-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>1e100.net</category><category domain='http://www.blogger.com/atom/ns#'>谷歌</category><title>诡异的连接，1e100.net</title><description>&lt;p&gt;莫名的发现电脑上有很多连接到*.1e100.net的。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;          &lt;img src="http://img508.imageshack.us/img508/8550/zrclip001n4ce3b7e2.png" height="94" width="512"/&gt;&lt;br /&gt;        &lt;/p&gt;&lt;br /&gt;&lt;p&gt;域名是不断变化的。根域名没有泛解析，而且试了几个二级域名，发现也并不是每个都能解析。可能是按照一定规律随机生成的，生命周期很短。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;找个可以解析的，解析出来居然是google的服务器地址，还显然不都是同一个IP。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;          &lt;img src="http://img842.imageshack.us/img842/971/zrclip002p41a95db5.png" height="30" width="551"/&gt;&lt;br /&gt;        &lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;          &lt;img src="http://img842.imageshack.us/img842/1669/zrclip004p3ca61c14.png" height="24" width="542"/&gt;&lt;br /&gt;        &lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;          &lt;a href="http://www.ip138.com/"&gt;IP138&lt;/a&gt;查询结果：&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;          &lt;img src="http://img842.imageshack.us/img842/6240/zrclip003p3d5e28b8.png" height="132" width="471"/&gt;&lt;br /&gt;        &lt;/p&gt;&lt;br /&gt;&lt;p&gt;想来，google提供了免费的dns服务器，只要用它的dns服务器，就能很快得到最新的IP地址，当google如果不停的产生随机域名的时候，google的服务基本都能正常服务。所以，是google在做什么悄悄的行动，还是有可能的。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;那么，谷歌想做的是什么？拯救劳苦大众？&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7400397557817693121-8004114110889223882?l=workingbird.365-366.com' alt='' /&gt;&lt;/div&gt;</description><link>http://workingbird.365-366.com/2010/08/1e100net.html</link><author>noreply@blogger.com (工作鸟)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-7400397557817693121.post-8510227087632739288</guid><pubDate>Thu, 05 Aug 2010 15:29:00 +0000</pubDate><atom:updated>2010-08-05T08:30:11.136-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Visual Studio 2010</category><category domain='http://www.blogger.com/atom/ns#'>Entity Frameworkd</category><title>Entity Framework中支持timestamp</title><description>&lt;p&gt;Visual Studio 2010中的Entity Framework算是一个亮点之作。最近刚好用到。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;在EF中设计模型的时候，发现Type中并没有Timestamp这个类型。当然，EF是支持多数据库的，这种MSSQL特有的类型，没有也很正常。但我从MSSQL中通过导入Table，发现生成的Model中将Timestamp列转换成了Binary，Nullable为False，长度为8，设置了Concurrency Mode为Fixed，StoreGenratedPattern为Computed。而我反向从Model中为Version列设置此类型后，在数据库中生成的列为Binary类型，且新生成对象Insert时，会提示此列为Null不能插入。这等于是说，EF并没有为这列Binary按照StoreGenratedPattern的定义，自动Computed新值。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;这也许是一个不大不小的Bug，我在修改Version为其他的类型，且设置Computed时，同样有该错误。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;System.Data.SqlClient.SqlException: Cannot insert the value NULL into column 'Version', table 'XXXX.dbo.XXXXSet'; column does not allow nulls. INSERT fails.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;寻寻觅觅，并没有找到真正的解决方案。参照&lt;a href="http://www.andypotts.com/Blog/2010/01/31/CreatingATimestampColumnInSQLServerWhenUsingModelFirstGenerationWithEntityFramework4.aspx"&gt;AndyPotts&lt;/a&gt;，有个不完美的解决方案，就是在生成脚本的模板中，强制写成MSSQL中支持的Timestamp类型。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;我参照了上述文章中的做法，约定数据库中使用Version的字段，都设置为TimeStamp。做法如下：&lt;/p&gt;&lt;br /&gt;&lt;p&gt;1、设置Version的Property如下&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;img src="http://img842.imageshack.us/img842/6055/zrclip001p4be75aa.png" height="381" width="321"/&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;2、创建一个C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\Extensions\Microsoft\Entity Framework Tools\DBGen\SSDLToSQL10.tt的拷贝到同目录下，并重命名为：MySSDLToSQL10.tt。这样在EF设计器属性中，会及时刷新出现该模板文件（无需重新启动程序）。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;img src="http://img842.imageshack.us/img842/1342/zrclip002n20cbaaf5.png" height="252" width="304"/&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;修改MySSDLToSQL10.tt。AndyPotts说是第151行，我现在用的版本是在165行。不过你可以直接查找这行需要修改的代码：&lt;/p&gt;&lt;br /&gt;&lt;p&gt;[&amp;lt;#=Id(prop.Name)#&amp;gt;] &amp;lt;#=prop.ToStoreType()#&amp;gt; &amp;lt;#=WriteIdentity(prop, targetVersion)#&amp;gt; &amp;lt;#=WriteNullable(prop.Nullable)#&amp;gt;&amp;lt;#=(p &amp;lt; entitySet.ElementType.Properties.Count - 1) ? "," : ""#&amp;gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;然后修改为：&lt;/p&gt;&lt;br /&gt;&lt;p&gt;[&amp;lt;#=Id(prop.Name)#&amp;gt;] &amp;lt;#if (string.Compare(prop.Name,"&lt;span style="COLOR: #0000ff"&gt;Version&lt;/span&gt;",true) == 0) { #&amp;gt;TIMESTAMP&amp;lt;# } else { #&amp;gt;&amp;lt;#=prop.ToStoreType()#&amp;gt;&amp;lt;# } #&amp;gt; &amp;lt;#=WriteIdentity(prop, targetVersion)#&amp;gt; &amp;lt;#=WriteNullable(prop.Nullable)#&amp;gt;&amp;lt;#=(p &amp;lt; entitySet.ElementType.Properties.Count - 1) ? "," : ""#&amp;gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;代码中的Version，你可以修改为你模型中所约定的属性名称。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;通过上述修改后，MSSQL的脚本中，将Version列生成为Timestamp类型。数据库端的自动计算就不用担心了，而在APP里面，由于是Fixed和Computed类型的，也可以完成ADD、Insert、Update时的程序逻辑。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;另：我当前使用的Visual Studio 2010 Ultimate版本中，SSDLToMySQL.tt模板有严重的Bug。如果模型中创建了任何关联(Association)，生成脚本的时候，有时都会出现错误。似乎是配置文件中的Entity找不到。但有时，又是正常的。原因未知。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7400397557817693121-8510227087632739288?l=workingbird.365-366.com' alt='' /&gt;&lt;/div&gt;</description><link>http://workingbird.365-366.com/2010/08/entity-frameworktimestamp.html</link><author>noreply@blogger.com (工作鸟)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-7400397557817693121.post-668981744238570515</guid><pubDate>Mon, 02 Aug 2010 14:43:00 +0000</pubDate><atom:updated>2010-08-02T07:43:57.250-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>GFW</category><category domain='http://www.blogger.com/atom/ns#'>谷歌</category><category domain='http://www.blogger.com/atom/ns#'>google</category><title>Google迟早要被GFW给玩死</title><description>&lt;p&gt;今天总觉得郁闷，Gmail登录进去之后，打开邮件时老是出现超时的错误。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;偶然发现Firefox的右下角出现了docs.google.com，但google文档的Widget却不能加载。看来是google docs被GFW给XX了。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;按照GFW对google的处理原则，一旦某个服务被XX了，出于无可预测无限高深的技术规则，某些服务也许也会受到影响。于是把*://docs.google.com/*添加到了Foxyproxy中，Gmail就正常了。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;之前仅仅是如果是通过&lt;a href="http://www.google.com"&gt;www.google.com&lt;/a&gt;引导到了墙外面的网站，整个&lt;a href="http://www.google.com"&gt;www.google.com&lt;/a&gt;就会不方便几分钟，属于一人"犯罪"，子孙遭殃的。难不成现在GFW都学会株连到表亲了？在这么下去，离九族就不远了……&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7400397557817693121-668981744238570515?l=workingbird.365-366.com' alt='' /&gt;&lt;/div&gt;</description><link>http://workingbird.365-366.com/2010/08/googlegfw.html</link><author>noreply@blogger.com (工作鸟)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-7400397557817693121.post-5295409479446886021</guid><pubDate>Sat, 31 Jul 2010 14:16:00 +0000</pubDate><atom:updated>2010-07-31T07:16:42.948-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>blackberry</category><category domain='http://www.blogger.com/atom/ns#'>media card</category><category domain='http://www.blogger.com/atom/ns#'>fatal error</category><title>黑莓插入媒体卡不能读取！</title><description>&lt;p&gt;为了完成翻墙的伟大事业，不停的折腾mini Opera。一个不小心，--也许是内存卡正在忙着读写的时候，拔了数据线，然后媒体卡就不能再用了。在8520上开机关机，反复的插拔，媒体卡依旧没有办法正确识别。（答案在最后一段，如果你的确很急的话，中间啰嗦部分可跳过。:DDD）&lt;/p&gt;&lt;br /&gt;&lt;p&gt;可恨家里就只有一个thinkpad有读卡器，找了个TF-&amp;gt;SD的适配器，可能山寨货放久了，Thinkpad居然读不出来，家里有个Canon的DC，却可以读取。卡上没啥稀奇的数据，直接拿这个DC来格式化，插回手机，发现还是无效。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;屏幕提示"由于存在致命错误 因此不能读取媒体卡"。居然google还搜不到任何有关系的信息。换成English，错误信息为："media card can not be accessed due to fatal errors"，也没有发现有效的解决方案。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;有个网友说是电池拔掉之后遇到的问题。想了想，就当做是Windows，遇到问题重启总是一个办法。于是，关机，拔电池重启……等待是漫长的，结果是可喜的，于是，便有了这篇流水账。你也去试试吧，或许通过拔电池重启也会管用的。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7400397557817693121-5295409479446886021?l=workingbird.365-366.com' alt='' /&gt;&lt;/div&gt;</description><link>http://workingbird.365-366.com/2010/07/blog-post_31.html</link><author>noreply@blogger.com (工作鸟)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-7400397557817693121.post-6848348522842236537</guid><pubDate>Wed, 21 Jul 2010 09:51:00 +0000</pubDate><atom:updated>2010-07-21T02:51:14.795-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>VS2010 Ultimate</category><category domain='http://www.blogger.com/atom/ns#'>.net</category><category domain='http://www.blogger.com/atom/ns#'>MySQL Connector</category><title>安装MySQL Connector/Net 6.3.2.beta出现错误</title><description>&lt;p&gt;为了在VS2010 Ultimate下使用MySQL，安装MySql Connection .net 6.3.2时，却总是出现回滚，不能正确安装。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;通过命令行，抓取了一下安装日志：&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;msiexec /i D:\desktop\mysql.data.msi /log d:\log.txt&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;          &lt;code&gt;CAQuietExec: Microsoft (R) .NET Framework 安装实用工具版本 2.0.50727.4927&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;CAQuietExec: 版权所有(C) Microsoft Corporation。保留所有权利。&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;CAQuietExec:&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;CAQuietExec: 安装失败，已执行回滚。&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;CAQuietExec: Error 0xffffffff: Command line returned an error.&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;CAQuietExec: Error 0xffffffff: CAQuietExec Failed&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;CustomAction ManagedDataInstall returned actual error code 1603 (note this may not be 100% accurate if translation happened inside sandbox)&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;Action ended 17:30:45: InstallFinalize. Return value 3.&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;Action 17:30:45: Rollback. Rolling back action:&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;Rollback: Registering data provider in machine.config&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;Rollback: Copying new files&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;Rollback: Creating folders&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;Rollback: Updating component registration&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;Action ended 17:30:46: INSTALL. Return value 3.&lt;/code&gt;&lt;br /&gt;        &lt;/p&gt;&lt;br /&gt;&lt;p&gt;具体什么错误不知道，解决办法很简单，无意中发现的。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;在C:\Windows\Microsoft.NET\Framework下，有两个FX4.0的环境：v4.0.30319和Old_v4.0.21006。安装前把那个Old_v4.0.21006删除，再执行安装程序，一切就OK了。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;          &lt;img src="http://img35.imageshack.us/img35/1486/zrclip001n5c447e2c.png" height="384" width="532"/&gt;&lt;br /&gt;        &lt;/p&gt;&lt;br /&gt;&lt;p&gt;巴嘎变成说噶了。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;测试了一下，MySql下的Entity Framework也是可以用的。mindspace的破解可以被淘汰了，呵呵。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7400397557817693121-6848348522842236537?l=workingbird.365-366.com' alt='' /&gt;&lt;/div&gt;</description><link>http://workingbird.365-366.com/2010/07/mysql-connectornet-632beta.html</link><author>noreply@blogger.com (工作鸟)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-7400397557817693121.post-7596094109765294615</guid><pubDate>Tue, 20 Jul 2010 03:27:00 +0000</pubDate><atom:updated>2010-07-19T20:28:15.242-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>谷歌</category><category domain='http://www.blogger.com/atom/ns#'>google</category><title>g.cn页面有个html出现低级错误</title><description>&lt;p&gt;在http://www.g.cn/ 无意中看到的，估计是谷歌大意了。不过这显然有点和Google严谨的学究型作风不太相符。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;img src="http://img839.imageshack.us/img839/1619/zrclip001p59cc4285.png" height="235" width="688"/&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;很明显缺少了li的结束标签不是？&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7400397557817693121-7596094109765294615?l=workingbird.365-366.com' alt='' /&gt;&lt;/div&gt;</description><link>http://workingbird.365-366.com/2010/07/gcnhtml.html</link><author>noreply@blogger.com (工作鸟)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-7400397557817693121.post-4358141383529688286</guid><pubDate>Fri, 16 Jul 2010 02:43:00 +0000</pubDate><atom:updated>2010-07-15T19:43:54.490-07:00</atom:updated><title>中国特色发言模板填空，原创整理</title><description>&lt;p&gt;面对当前复杂的形势，我们必须以邓小平理论和"三个代表"重要思想为指导，深入贯彻落实科学发展观，坚持"（1）" 的方针，解放思想、实事求是、与时俱进、开拓创新，统筹国内国际两个大局，统筹当前与长远，坚持（2）与（3）相（4），坚持符合国际惯例与适应中国国情相统一（5），推动我国（6）科学健康有序发展，促进经济、政治、文化、社会建设全面进步，维护 社会和谐稳定和国家安全，走出一条具有中国特色的（7）道路。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;注：&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;（1）：填写此文涉及方向的政策方针；&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;（2）（3）：采用辩证法，列举所需要面对问题的正反两面。要能覆盖事物的所有面，以显示自己考虑问题的全面性。&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;（4）：动词，常用词包括"统一"、"结合"等。（234）通常采用气势磅礴的排比句，以3-5句为佳。&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;（5）：（234）的精辟用法之一。&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;（6）（7）：填写此文的涉及方向。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7400397557817693121-4358141383529688286?l=workingbird.365-366.com' alt='' /&gt;&lt;/div&gt;</description><link>http://workingbird.365-366.com/2010/07/blog-post.html</link><author>noreply@blogger.com (工作鸟)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-7400397557817693121.post-8497810135765627135</guid><pubDate>Tue, 29 Jun 2010 04:46:00 +0000</pubDate><atom:updated>2010-06-28T21:46:23.846-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>随笔</category><title>他们不让你说，是因为他们想低调</title><description>&lt;p&gt;他们不让你说，是因为他们想低调。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;（很久没有更新博客了。不是因为不让说，我从不故意冤枉别人。）&lt;/p&gt;&lt;br /&gt;&lt;p&gt;再怎么我们也是世界第三大国土面积的国家，因为是中央集权，链条长了，信息传递和反馈至少也要三五个月。所以，不要埋怨政府效率。理解才能万岁。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;现在看来，去年的大张旗鼓却在媒体上冷清的言论控制行动，是前奏。我们都太容易冲动，太容易被挑拨。他们是不愿意让事件扩大化的。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;我相信他们要做自我净化的事情。他们将这定位为组织内部的问题，是组织内部分成员信仰不坚定的问题，而并非是与人民对立的问题。有这部分未解密的历史的教训，他们对于可能导致升级到人民斗争的问题，都非常谨慎。快刀斩乱麻固然大快人心，但这是高风险的；拖泥带水虽被人骂作中庸不敢为，却是权衡再三后的明智选择。如果拖泥带水也能坚定执行，我支持拖泥带水。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;我不知道，这场斗争，对于人民群众，究竟会被影响到什么，程度又有多深。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;已经够多苦难了，众神保佑！&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7400397557817693121-8497810135765627135?l=workingbird.365-366.com' alt='' /&gt;&lt;/div&gt;</description><link>http://workingbird.365-366.com/2010/06/blog-post.html</link><author>noreply@blogger.com (工作鸟)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-7400397557817693121.post-3545535678425482357</guid><pubDate>Wed, 05 May 2010 08:34:00 +0000</pubDate><atom:updated>2010-05-05T01:34:39.143-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>经济学家</category><category domain='http://www.blogger.com/atom/ns#'>张洪石</category><category domain='http://www.blogger.com/atom/ns#'>房价</category><category domain='http://www.blogger.com/atom/ns#'>中国经济</category><title>看《北京房价处“高烧”阶段 临报复性上涨压力》有感</title><description>&lt;p&gt;看《&lt;a href="http://finance.qq.com/a/20100505/001552_1.htm"&gt;北京房价处"高烧"阶段 临报复性上涨压力&lt;/a&gt;》有感&lt;/p&gt;&lt;br /&gt;&lt;p&gt;连做个房产商的傀儡都做不好，这样的"经济学家"真的是中国的悲哀。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;直觉来说，很好奇张洪石是个什么经济学家？&lt;/p&gt;&lt;br /&gt;&lt;p&gt;上&lt;a href="http://www.cqvip.com/"&gt;维普期刊&lt;/a&gt;（号称收录2000多万）查了一下作者为张洪石的论文期刊：&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;1、除了第4页在地质方面的一个论文外，只有1篇（中国软科学2003年第11期）是独立署名的；&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;2、除去独立署名，有少量第一署名的期刊论文。但如果张洪石为第一署名，则通常会看到付玉秀或陈劲的名字同时出现，很有规律。&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;3、从2006年11月以后，只有2篇新收录论文，还不能确定是不是这个"张洪石"。经济方面关联性强一些的，除了在"突破性创新"方面有几篇论文外，大多都是和企业相关的。关于房地产和直接的经济理论方面，至少从标题来看，还没有看到任何文章。&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;从上面来结论一下，觉得基本属于外行，在房地产方面做评价不属于研究范围。除了年龄大些更多阅历外，可能还不如找个建筑工人说的到位。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;再看看"经济学家"的思路"经济学思路"。原文不引用了（第二页第4段）。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;按照最简单的算法，1.6亿元，按照2成首付计算，至少可以购买5个单元，占供应量的25%。开发商买走8亿元获得流动资金，就算是只有20%的毛利，这一来就收回了近1/3的成本，大大缓解了销售压力，有足够的资金支持自己囤房提价，还能不影响价格？就连这个例子都没有说明白，就开始转移视线，谈山西煤老板的1000亿，谈民营企业的投机资金，理由就同样苍白了。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;至于说"炒房者在房市充其量是起到一个推波助澜的作用"，这无可厚非。但面临上涨，所有的一切因素都是"推波助澜"，包括你家丈母娘。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;而房产调控就是要把这些推波助澜的因素，短期来说进行抑制，长期来说努力消除。报复性反涨，属于开发商的意愿，属于既得利益群体的意愿，可能也是一些曾经的企业高管的意愿。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7400397557817693121-3545535678425482357?l=workingbird.365-366.com' alt='' /&gt;&lt;/div&gt;</description><link>http://workingbird.365-366.com/2010/05/blog-post.html</link><author>noreply@blogger.com (工作鸟)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-7400397557817693121.post-2809296679320221921</guid><pubDate>Thu, 29 Apr 2010 07:48:00 +0000</pubDate><atom:updated>2010-04-29T00:48:37.340-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>MySql</category><title>MYSQL的弱智语法错误之空格</title><description>&lt;p&gt;用MySql少，经常遇到一些弱智的错误。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;比如&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;ERROR 1305 (42000): FUNCTION &amp;lt;databasename&amp;gt;.LOCATE does not exist&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;更通用些来讲，错误信息可能是&amp;lt;databasename&amp;gt;.&amp;lt;function name&amp;gt; does not exist&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;实际上呢，你的调用并没有错。之所以出现这个弱智错误，是因为在&amp;lt;function&amp;gt;的后面，你多了一个空格。去掉空格问题就解决了。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7400397557817693121-2809296679320221921?l=workingbird.365-366.com' alt='' /&gt;&lt;/div&gt;</description><link>http://workingbird.365-366.com/2010/04/mysql.html</link><author>noreply@blogger.com (工作鸟)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-7400397557817693121.post-1629093053073723828</guid><pubDate>Mon, 26 Apr 2010 07:27:00 +0000</pubDate><atom:updated>2010-04-26T00:27:57.577-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>地震</category><title>难道是地震云？</title><description>&lt;p&gt;那天在胖胡斐的博客上&lt;a href="http://www.panghufei.com/?p=10168"&gt;看到相片&lt;/a&gt;，留言说可能是地震云。评论没有显示出来，有些遗憾。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;今天看到新闻，说在离浙江不远的地方，台湾外海，发生了6.6级（也有说6.9级的）地震……&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7400397557817693121-1629093053073723828?l=workingbird.365-366.com' alt='' /&gt;&lt;/div&gt;</description><link>http://workingbird.365-366.com/2010/04/blog-post.html</link><author>noreply@blogger.com (工作鸟)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-7400397557817693121.post-6379985357167522583</guid><pubDate>Thu, 08 Apr 2010 10:03:00 +0000</pubDate><atom:updated>2010-04-08T03:04:36.116-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>GeckoWebBrowser</category><category domain='http://www.blogger.com/atom/ns#'>.net</category><title>解决GeckoWebBrowser获取document.DocumentElement的错误</title><description>&lt;p&gt;长话短说。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;在使用GeckoWebBrowser获取文件对象的时候，比如&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;code&gt;GeckoDocument document = geckoWebBrowser1.Document;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;GeckoElement content = document.DocumentElement;&lt;/code&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;也许会出现如下的错误信息：&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;code&gt;无法将类型为"System.__ComObject"的 COM 对象强制转换为接口类型"Skybound.Gecko.nsIDOMNSElement"。此操作失败的原因是对 IID 为"{F0AEF489-18C5-4DE6-99D5-58B3758B098C}"的接口的 COM 组件调用 QueryInterface 因以下错误而失败: 不支持此接口 (异常来自 HRESULT:0x80004002 (E_NOINTERFACE))。&lt;/code&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;论坛上有人说是因为Xulrunner和Gecko的版本问题。的确是这样的，我补充一下具体的解决方案。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;首先是确认你下载的Gecko版本。大的版本号，如1.9.1.X一般都很明确，在项目文件的Assembly里面可以查到。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;其次是下载相应版本号的xulrunner。上面的那个小版本号X对运行也有影响。如何判断X，我只能提供一个取巧的办法：比较gecko发布包的发布日期，在相同的版本下，如1.9.1.x，在Mozilla的服务器下找同个大版本号，但发布日期较晚的就行。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Win7，VS2008。我使用的版本是&lt;a href="http://code.google.com/p/geckofx/downloads/list"&gt;http://code.google.com/p/geckofx/downloads/list&lt;/a&gt;上的&lt;/p&gt;&lt;br /&gt;&lt;table&gt;&lt;br /&gt;&lt;tbody&gt;&lt;br /&gt;&lt;tr onmouseover="_rowRolloverOn(this)" onmouseout="_rowRolloverOff(this); cancelBubble=false"&gt;&lt;br /&gt;&lt;td class="vt id col_0"&gt;&lt;a style="WHITE-SPACE: nowrap" href="http://geckofx.googlecode.com/files/Skybound.GeckoFX.src.v1.9.1.0.zip"&gt;Skybound.GeckoFX.src.v1.9.1.0.zip&lt;/a&gt;，经试验，&lt;a href="ftp://ftp.mozilla.org/pub/xulrunner/releases/1.9.1/"&gt;ftp://ftp.mozilla.org/pub/xulrunner/releases/1.9.1/&lt;/a&gt;不能用，但&lt;a href="ftp://ftp.mozilla.org/pub/xulrunner/releases/1.9.1.7/"&gt;ftp://ftp.mozilla.org/pub/xulrunner/releases/1.9.1.7/&lt;/a&gt;可以。&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/tbody&gt;&lt;br /&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7400397557817693121-6379985357167522583?l=workingbird.365-366.com' alt='' /&gt;&lt;/div&gt;</description><link>http://workingbird.365-366.com/2010/04/geckowebbrowserdocumentdocumentelement.html</link><author>noreply@blogger.com (工作鸟)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-7400397557817693121.post-1927296968127913007</guid><pubDate>Tue, 23 Mar 2010 15:50:00 +0000</pubDate><atom:updated>2010-03-23T10:55:35.524-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>退出中国</category><category domain='http://www.blogger.com/atom/ns#'>网络审查</category><category domain='http://www.blogger.com/atom/ns#'>google</category><title>哥的退出，是社会的缩写</title><description>&lt;p&gt;&lt;a href="http://www.google.com/"&gt;哥&lt;/a&gt;的don't be evil，才是真正的相信"人之初性本善"。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;不是自己宣传了《孔子》仁爱，就是大善社会。我们社会的根基，已经不再是这三字经里面的前六个字了。所以，春晚看《不差钱》时不会觉得请"老毕"吃饭求人办事是讽刺；作法官时不相信扶起老人是出于好心；上五毛时不认可网络环境的自我净化作用；删帖时不理解愤青们的激进式表达……我们的道德基础是"性本恶"，所以我们的管理宗旨是"禁止"，且是思想层面，而非法律层面的。因"性本恶"，只要人类生息繁衍，恶就必然是增长的，因此，这种管理是无常态的，且是扩散化的。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;哥的退出就是因为哥陷入了两难的局面。哥认为公司应该按照"不作恶"为标准为核心，最求给社会带来最大价值。而现在哥不知道如何才能"不作恶"。因为这种"禁止"的不明确性，那么，哥只能做限定的被允许的事情。做限定允许的事情可以活下来，但不能带来最大价值。哥的法律体系和我们的法律体系出现了水土不服，哥在这个环境下，没办法对自己的所有事情把握后果，只能退出。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;哥的退出，正是印证了一句话"高尚是高尚者的墓志铭，卑鄙是卑鄙者的通行证。"&lt;/p&gt;&lt;br /&gt;&lt;p&gt;而这也正是这个社会的座右铭。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7400397557817693121-1927296968127913007?l=workingbird.365-366.com' alt='' /&gt;&lt;/div&gt;</description><link>http://workingbird.365-366.com/2010/03/blog-post_5978.html</link><author>noreply@blogger.com (工作鸟)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-7400397557817693121.post-8949843723663400059</guid><pubDate>Tue, 23 Mar 2010 13:37:00 +0000</pubDate><atom:updated>2010-03-23T06:38:10.907-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>云南</category><category domain='http://www.blogger.com/atom/ns#'>西南旱情</category><category domain='http://www.blogger.com/atom/ns#'>水利工程</category><title>张天师快快显灵！</title><description>&lt;p&gt;我国西南大旱还在煎熬，据说，&lt;a href="http://news.qq.com/a/20100323/000441.htm"&gt;北方也开始旱&lt;/a&gt;了。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;一年之计在于春。这短时间正好是春播的时候，这次大旱，对于正处于金融危机中的老百姓，伤害会很深。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;老天爷有点恶搞，云贵高原，我国第一江长江、第三江珠江都流过这片土地，却"被"旱灾了。轰轰烈烈的南水北调，还没有看到太多实际效果，却被老天爷来了个釜底抽薪。难道人定胜天的时代过去了？想想汶川地震，还有些后怕。看来要为三峡工程多烧烧香啊~&lt;/p&gt;&lt;br /&gt;&lt;p&gt;这样说，三峡工程可能有点委屈。猛然间想起来了以前玩的一个游戏：皇帝。估计最初电脑游戏比较早的同学应该知道这款DOS游戏。如果皇帝只知道穷兵黩武、经济建设，不管农田水利，什么大旱啊、蝗灾啊之类的，灾害多了还会时不时暴乱，搞得你很烦。当然，建设工商比较增加GDP，但游戏的平衡就是这样的。老百姓过的不好，国家再有钱都是白搭。有钱咋的，没人给你生小孩，生了小孩子养不活，养了孩子上不起学，上了学又找不到工作，没两年，修城墙都找不到人了，还想收啥税啊？&lt;/p&gt;&lt;br /&gt;&lt;p&gt;现在农村种地的少了，估计胡哥也没想着建设啥农田水利了。也或许地方的刺史廉洁度不高，拨款成效太小。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;已经旱了，追究这些也晚了。要是放回去一两千年，这会儿哪家道观发行的股票，肯定看涨。这不，求雨的单子接都接不完呢。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;已经旱了，亡羊补牢未为晚也。查查地方的水利建设，小水利、灌溉系统，是怎么建设的，又是怎么维护的。今年皇帝家还有余粮，明年呢？&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7400397557817693121-8949843723663400059?l=workingbird.365-366.com' alt='' /&gt;&lt;/div&gt;</description><link>http://workingbird.365-366.com/2010/03/blog-post_23.html</link><author>noreply@blogger.com (工作鸟)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-7400397557817693121.post-6424283921519124836</guid><pubDate>Tue, 16 Mar 2010 12:00:00 +0000</pubDate><atom:updated>2010-03-16T05:00:45.156-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>trac</category><category domain='http://www.blogger.com/atom/ns#'>subversion</category><category domain='http://www.blogger.com/atom/ns#'>项目管理</category><category domain='http://www.blogger.com/atom/ns#'>svn</category><title>SVN和Trac集成的post-commit模板</title><description>&lt;p&gt;模板使用方法：&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;1、每个对应的SVN Repository都需要一个自己的hooks；&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;2、复制三个文件到hooks目录；&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;3、修改SET TRAC_ENV为对应trac project目录即可。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;post-commit.bat，SVN的post-commit hooks入口。在Windows下，必须是可执行的文件。你也可以改成其他名字，如cmd。内容就一行：&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;code&gt;call %~dp0\trac-post-commit-hook.cmd %1 %2&lt;/code&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;trac-post-commit-hook.cmd，被post-commit.bat调用。内容如下，我觉得只需要修改红色字体的地方。当然，如果Python没有被加入PATH环境变量，需要多修改一下PYTHON_PATH，主要是便于让trac-post-commit-hook(这个是py文件)能够执行。&lt;/p&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;p&gt;@ECHO OFF&lt;/p&gt;&lt;br /&gt;&lt;p&gt;SET TRAC_ENV=&lt;span style="COLOR: #ff0000"&gt;disk:\your_trac_env\project&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;:: -- set if Python is not in the system path&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;SET PYTHON_PATH=&lt;/p&gt;&lt;br /&gt;&lt;p&gt;:: -- set to the folder containing trac/ if installed in a non-standard location&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;SET TRAC_PATH=&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;:: ----------------------------------------------------------&lt;/p&gt;&lt;br /&gt;&lt;p&gt;:: Do not execute hook if trac environment does not exist&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;IF NOT EXIST %TRAC_ENV% GOTO :EOF&lt;/p&gt;&lt;br /&gt;&lt;p&gt;set PATH=%PYTHON_PATH%;%PATH%&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;set PYTHONPATH=%TRAC_PATH%;%PYTHONPATH%&lt;/p&gt;&lt;br /&gt;&lt;p&gt;SET REV=%2&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Python "%~dp0\trac-post-commit-hook" -p "%TRAC_ENV%" -r "%REV%"&lt;/p&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://trac.edgewall.org/browser/trunk/contrib/trac-post-commit-hook?rev=8427"&gt;trac-post-commit-hook&lt;/a&gt;，链接进去是官方的代码。内容和下面一样。&lt;/p&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;p&gt;#!/usr/bin/env python&lt;/p&gt;&lt;br /&gt;&lt;p&gt;# trac-post-commit-hook&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;# ----------------------------------------------------------------------------&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;# Copyright (c) 2004 Stephen Hansen&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;#&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;# Permission is hereby granted, free of charge, to any person obtaining a copy&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;# of this software and associated documentation files (the "Software"), to&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;# deal in the Software without restriction, including without limitation the&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;# sell copies of the Software, and to permit persons to whom the Software is&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;# furnished to do so, subject to the following conditions:&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;#&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;# The above copyright notice and this permission notice shall be included in&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;# all copies or substantial portions of the Software.&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;#&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;# IN THE SOFTWARE.&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;# ----------------------------------------------------------------------------&lt;/p&gt;&lt;br /&gt;&lt;p&gt;# This Subversion post-commit hook script is meant to interface to the&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;# Trac (&lt;a href="http://www.edgewall.com/products/trac/"&gt;http://www.edgewall.com/products/trac/&lt;/a&gt;) issue tracking/wiki/etc&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;# system.&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;#&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;# It should be called from the 'post-commit' script in Subversion, such as&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;# via:&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;#&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;# REPOS="$1"&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;# REV="$2"&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;# TRAC_ENV="/path/to/tracenv"&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;#&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;# /usr/bin/python /usr/local/src/trac/contrib/trac-post-commit-hook \&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;# -p "$TRAC_ENV" -r "$REV"&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;#&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;# (all the other arguments are now deprecated and not needed anymore)&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;#&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;# It searches commit messages for text in the form of:&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;# command #1&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;# command #1, #2&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;# command #1 &amp;amp; #2&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;# command #1 and #2&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;#&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;# Instead of the short-hand syntax "#1", "ticket:1" can be used as well, e.g.:&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;# command ticket:1&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;# command ticket:1, ticket:2&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;# command ticket:1 &amp;amp; ticket:2&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;# command ticket:1 and ticket:2&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;#&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;# In addition, the ':' character can be omitted and issue or bug can be used&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;# instead of ticket.&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;#&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;# You can have more than one command in a message. The following commands&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;# are supported. There is more than one spelling for each command, to make&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;# this as user-friendly as possible.&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;#&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;# close, closed, closes, fix, fixed, fixes&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;# The specified issue numbers are closed with the contents of this&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;# commit message being added to it.&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;# references, refs, addresses, re, see&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;# The specified issue numbers are left in their current status, but&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;# the contents of this commit message are added to their notes.&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;#&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;# A fairly complicated example of what you can do is with a commit message&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;# of:&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;#&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;# Changed blah and foo to do this or that. Fixes #10 and #12, and refs #12.&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;#&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;# This will close #10 and #12, and add a note to #12.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;import re&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;import os&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;import sys&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;from datetime import datetime&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;from optparse import OptionParser&lt;/p&gt;&lt;br /&gt;&lt;p&gt;parser = OptionParser()&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;depr = '(not used anymore)'&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;parser.add_option('-e', '--require-envelope', dest='envelope', default='',&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;help="""&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;Require commands to be enclosed in an envelope.&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;If -e[], then commands must be in the form of [closes #4].&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;Must be two characters.""")&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;parser.add_option('-p', '--project', dest='project',&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;help='Path to the Trac project.')&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;parser.add_option('-r', '--revision', dest='rev',&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;help='Repository revision number.')&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;parser.add_option('-u', '--user', dest='user',&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;help='The user who is responsible for this action '+depr)&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;parser.add_option('-m', '--msg', dest='msg',&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;help='The log message to search '+depr)&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;parser.add_option('-c', '--encoding', dest='encoding',&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;help='The encoding used by the log message '+depr)&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;parser.add_option('-s', '--siteurl', dest='url',&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;help=depr+' the base_url from trac.ini will always be used.')&lt;/p&gt;&lt;br /&gt;&lt;p&gt;(options, args) = parser.parse_args(sys.argv[1:])&lt;/p&gt;&lt;br /&gt;&lt;p&gt;if not 'PYTHON_EGG_CACHE' in os.environ:&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;os.environ['PYTHON_EGG_CACHE'] = os.path.join(options.project, '.egg-cache')&lt;/p&gt;&lt;br /&gt;&lt;p&gt;from trac.env import open_environment&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;from trac.ticket.notification import TicketNotifyEmail&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;from trac.ticket import Ticket&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;from trac.ticket.web_ui import TicketModule&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;# TODO: move grouped_changelog_entries to model.py&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;from trac.util.text import to_unicode&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;from trac.util.datefmt import utc&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;from trac.versioncontrol.api import NoSuchChangeset&lt;/p&gt;&lt;br /&gt;&lt;p&gt;ticket_prefix = '(?:#|(?:ticket|issue|bug)[: ]?)'&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;ticket_reference = ticket_prefix + '[0-9]+'&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;ticket_command = (r'(?P&amp;lt;action&amp;gt;[A-Za-z]*).?'&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;'(?P&amp;lt;ticket&amp;gt;%s(?:(?:[, &amp;amp;]*|[ ]?and[ ]?)%s)*)' %&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;(ticket_reference, ticket_reference))&lt;/p&gt;&lt;br /&gt;&lt;p&gt;if options.envelope:&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;ticket_command = r'\%s%s\%s' % (options.envelope[0], ticket_command,&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;options.envelope[1])&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;command_re = re.compile(ticket_command)&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;ticket_re = re.compile(ticket_prefix + '([0-9]+)')&lt;/p&gt;&lt;br /&gt;&lt;p&gt;class CommitHook:&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;_supported_cmds = {'close': '_cmdClose',&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;'closed': '_cmdClose',&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;'closes': '_cmdClose',&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;'fix': '_cmdClose',&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;'fixed': '_cmdClose',&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;'fixes': '_cmdClose',&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;'addresses': '_cmdRefs',&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;'re': '_cmdRefs',&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;'references': '_cmdRefs',&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;'refs': '_cmdRefs',&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;'see': '_cmdRefs'}&lt;/p&gt;&lt;br /&gt;&lt;p&gt;def __init__(self, project=options.project, author=options.user,&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;rev=options.rev, url=options.url):&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;self.env = open_environment(project)&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;repos = self.env.get_repository()&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;repos.sync()&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;# Instead of bothering with the encoding, we'll use unicode data&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;# as provided by the Trac versioncontrol API (#1310).&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;try:&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;chgset = repos.get_changeset(rev)&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;except NoSuchChangeset:&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;return # out of scope changesets are not cached&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;self.author = chgset.author&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;self.rev = rev&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;self.msg = "(In [%s]) %s" % (rev, chgset.message)&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;self.now = datetime.now(utc)&lt;/p&gt;&lt;br /&gt;&lt;p&gt;cmd_groups = command_re.findall(self.msg)&lt;/p&gt;&lt;br /&gt;&lt;p&gt;tickets = {}&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;for cmd, tkts in cmd_groups:&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;funcname = CommitHook._supported_cmds.get(cmd.lower(), '')&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;if funcname:&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;for tkt_id in ticket_re.findall(tkts):&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;func = getattr(self, funcname)&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;tickets.setdefault(tkt_id, []).append(func)&lt;/p&gt;&lt;br /&gt;&lt;p&gt;for tkt_id, cmds in tickets.iteritems():&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;try:&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;db = self.env.get_db_cnx()&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;ticket = Ticket(self.env, int(tkt_id), db)&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;for cmd in cmds:&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;cmd(ticket)&lt;/p&gt;&lt;br /&gt;&lt;p&gt;# determine sequence number...&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;cnum = 0&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;tm = TicketModule(self.env)&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;for change in tm.grouped_changelog_entries(ticket, db):&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;if change['permanent']:&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;cnum += 1&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;ticket.save_changes(self.author, self.msg, self.now, db, cnum+1)&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;db.commit()&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;tn = TicketNotifyEmail(self.env)&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;tn.notify(ticket, newticket=0, modtime=self.now)&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;except Exception, e:&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;# import traceback&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;# traceback.print_exc(file=sys.stderr)&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;print&amp;gt;&amp;gt;sys.stderr, 'Unexpected error while processing ticket ' \&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;'ID %s: %s' % (tkt_id, e)&lt;br /&gt;&lt;br/&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;def _cmdClose(self, ticket):&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;ticket['status'] = 'closed'&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;ticket['resolution'] = 'fixed'&lt;/p&gt;&lt;br /&gt;&lt;p&gt;def _cmdRefs(self, ticket):&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;pass&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br/&gt;&lt;br /&gt;if __name__ == "__main__":&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;if len(sys.argv) &amp;lt; 5:&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;print "For usage: %s --help" % (sys.argv[0])&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;print&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;print "Note that the deprecated options will be removed in Trac 0.12."&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;else:&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;CommitHook()&lt;/p&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;p&gt;&lt;br/&gt;&lt;br /&gt;折腾完，发现其实网上说的方法都是正确的。但不知道为什么还是看官方文档才搞清楚。哎，自作践，不可活。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7400397557817693121-6424283921519124836?l=workingbird.365-366.com' alt='' /&gt;&lt;/div&gt;</description><link>http://workingbird.365-366.com/2010/03/svntracpost-commit.html</link><author>noreply@blogger.com (工作鸟)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-7400397557817693121.post-7753366957966939813</guid><pubDate>Tue, 16 Mar 2010 06:32:00 +0000</pubDate><atom:updated>2010-03-15T23:39:14.589-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>firefox</category><category domain='http://www.blogger.com/atom/ns#'>GeckoWebBrowser</category><category domain='http://www.blogger.com/atom/ns#'>Gecho</category><category domain='http://www.blogger.com/atom/ns#'>geckofx</category><category domain='http://www.blogger.com/atom/ns#'>Skybound</category><category domain='http://www.blogger.com/atom/ns#'>XP</category><category domain='http://www.blogger.com/atom/ns#'>xpcom</category><category domain='http://www.blogger.com/atom/ns#'>IE6</category><title>解决Skybound.Gecko中xpcom.dll加载错误</title><description>&lt;p&gt;使用&lt;a href="http://geckofx.org/"&gt;GeckoWebBrowser&lt;/a&gt;的时候，遇到一个很诡异的问题，在开发环境和测试环境中都可以运行的程序，部署到某些用户环境就出现了异常。通过开启日志文件，捕捉到异常信息如下：&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;code&gt;System.DllNotFoundException: Unable to load DLL 'xpcom': 找不到指定的程序。 (Exception from HRESULT: 0x8007007F)&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;at Skybound.Gecko.nsACString.NS_CStringContainerInit(nsACString container)&lt;br /&gt;&lt;br/&gt;&lt;/code&gt; 如果是英文系统，错误信息可能是：&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;code&gt;System.DllNotFoundException: Unable to load DLL 'xpcom': The specified module could not be found。 (Exception from HRESULT: 0x8007007F)&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;at Skybound.Gecko.nsACString.NS_CStringContainerInit(nsACString container)&lt;br /&gt;&lt;br/&gt;&lt;/code&gt; 既然和环境有关，说一下环境的差异：&lt;/p&gt;&lt;br /&gt;&lt;p&gt;开发环境：Win7+IE8，测试WinXP+SP3+IE8，出问题的电脑：WinXP+SP3+IE6。当然，这个环境是结合最后的分析才列出来的关键因素，现场的环境差异肯定比这个大得多。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;下面开始解决问题之旅了。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;使用&lt;a href="http://www.dependencywalker.com/"&gt;Dependency Walker&lt;/a&gt;可以发现，xpcom依赖的dll包括：XUL.dll,MOZCRT19.DLL和KERNEL32.DLL。其中，XUL.DLL和MOZCRT19.DLL位于xulrunner目录下，KERNEL32.DLL为系统自带。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;检查MOZCRT19.DLL，所依赖的DLL有两个，MSVCRT.DLL,KERNEL32.DLL，均位于system32下，且切实存在，跳过。&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;按照同样的方法，检查XUL.DLL：&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;A、所依赖的位于Xulrunner的DLL有：SQLITE3.DLL，JS3250.DLL，SMIME3.DLL， &lt;span style="COLOR: #ff0000"&gt;&lt;strong&gt;SSL3.DLL&lt;/strong&gt;&lt;/span&gt; ， &lt;span style="COLOR: #ff0000"&gt;&lt;strong&gt;NSS3.DLL&lt;/strong&gt;&lt;/span&gt; ，NSSUTIL3.DLL，NSPR4.DLL， &lt;span style="COLOR: #ff0000"&gt;&lt;strong&gt;PLC4.DLL&lt;/strong&gt;&lt;/span&gt; ， &lt;strong&gt;&lt;span style="COLOR: #ff0000"&gt;PLDS4.DLL&lt;/span&gt;&lt;br /&gt;&lt;br/&gt;&lt;/strong&gt; B、系统目录下的DLL有：SHELL32.DLL，OLE32.DLL，VERSION.DLL，WINSPOOL.DRV，COMDLG32.DLL，IMM32.DLL，WINMM.DLL，WSOCK32.DLL，MSIMG32.DLL，KERNEL32.DLL，USER32.DLL，GDI32.DLL，ADVAPI32.DLL，USP10.DLL，OLEAUT32.DLL&lt;/p&gt;&lt;br /&gt;&lt;p&gt;对上述A进行检查，发现在Dependency Walker里面，&lt;strong&gt;SSL3.DLL、PLC4.DLL，PLDS4.DLL、NSS3.DLL&lt;/strong&gt;是调用的Xulrunner下的文件。而实际在system32中同时存在这四个DLL，且文件不相同。这便是成DLL无法加载的原因。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;解决：&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;1、检查xpcom.cs第114行：&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;code&gt;if (binDirectory != null)&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;Environment.SetEnvironmentVariable("path",&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;Environment.GetEnvironmentVariable("path") + ";" + binDirectory , EnvironmentVariableTarget.Process);&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br/&gt;&lt;/code&gt; 代码显示，path的顺序是最后查找的Xulrunner路径。对Path的查找路径进行修改，使其先查找指定的目录。修改后代码如下：&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;code&gt;if (binDirectory != null)&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;Environment.SetEnvironmentVariable("path",&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;binDirectory + ";" + Environment.GetEnvironmentVariable("path") , EnvironmentVariableTarget.Process);&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;编译，发布，运行！:( 看上去对了，但还是启动不了。看来path的路径设置没有生效。FAILED。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;2、没办法，采用第二方案，将这四个DLL复制到windows/system32下，覆盖同名文件。再重新运行，OK。SUCCEED！这虽然不是完美的解决方案，但总是可以用了。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;当然，更进一步，这个可以做一个批处理。在Xulrunner上一级目录，运行批处理文件。批处理文件的主要内容如下：&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;code&gt;rename c:\WINDOWS\system32\ssl3.dll "ssl3.bak.by.xul.dll"&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;rename c:\WINDOWS\system32\plds4.dll "plds4.bak.by.xul.dll"&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;rename c:\WINDOWS\system32\plc4.dll "plc4.bak.by.xul.dll"&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;rename c:\WINDOWS\system32\nss3.dll "nss4.bak.by.xul.dll"&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;copy xulrunner\ssl3.dll c:\WINDOWS\system32\ssl3.dll&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;copy xulrunner\plds4.dll c:\WINDOWS\system32\plds4.dll&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;copy xulrunner\plc4.dll c:\WINDOWS\system32\plc4.dll&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;copy xulrunner\nss3.dll c:\WINDOWS\system32\nss3.dll&lt;/code&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;我觉得第一套方案修改path的方法应该是生效的，但实际效果却和期望的不一致，很纳闷。&lt;br /&gt;&lt;br/&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;BTW：&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;在windows 7 + IE8的环境下，上述四个文件在system32中都没有，path会到xulrunner中查找，上述问题就不存在了。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;也许还有其他环境或者问题与此类似，解决方案也应该是相似的。good luck！&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Update：&lt;/p&gt;&lt;br /&gt;&lt;p&gt;貌似&lt;a href="http://geckofx.org/viewtopic.php?pid=2665#p2665"&gt;这儿&lt;/a&gt;有一个更好的方法。希望对你有用。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7400397557817693121-7753366957966939813?l=workingbird.365-366.com' alt='' /&gt;&lt;/div&gt;</description><link>http://workingbird.365-366.com/2010/03/skyboundgeckoxpcomdll.html</link><author>noreply@blogger.com (工作鸟)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-7400397557817693121.post-1854826913233292178</guid><pubDate>Mon, 15 Mar 2010 06:45:00 +0000</pubDate><atom:updated>2010-03-14T23:45:36.230-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>jquery</category><category domain='http://www.blogger.com/atom/ns#'>ajax</category><category domain='http://www.blogger.com/atom/ns#'>remote</category><category domain='http://www.blogger.com/atom/ns#'>ui tabs</category><title>Jquery UI Tab使用remote模式时候的问题</title><description>&lt;p&gt;在Jquery ui tabs中，使用remote模式，即采用ajax加载，被加载的页面中页面初始化代码不能被执行。包括所有在document创建完成后执行的代码，如jquery中的ready，body的onload属性等。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;其实原因很简单，在UI tabs父页面被加载的时候，页面就已经完成了document.ready事件。通过ui tabs加载的ajax页面，是作为页面的一个部分被植入到父页面的容器中的，所以，被加载的页面没有document.ready事件。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;为了达到这样的效果，你需要把ajax页面单独加载时执行的function，通过其他的方式执行。比如说，在页面尾部插入一段script，在页面加载到该javascript代码的时候，通过浏览器的标准化规则自动执行。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;当然，方法还有很多。简单的来说，就是不要把这些代码放到$(function() {/*codes that is here can not execute when ajax child page loaded*/})或&amp;lt;body onload="canNotBeExecute()"&amp;gt;。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;不知道说清楚了没有，没看懂可以留言。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7400397557817693121-1854826913233292178?l=workingbird.365-366.com' alt='' /&gt;&lt;/div&gt;</description><link>http://workingbird.365-366.com/2010/03/jquery-ui-tabremote.html</link><author>noreply@blogger.com (工作鸟)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-7400397557817693121.post-30011182137599916</guid><pubDate>Mon, 15 Mar 2010 02:50:00 +0000</pubDate><atom:updated>2010-03-14T22:55:45.147-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>django</category><category domain='http://www.blogger.com/atom/ns#'>ELLA</category><title>折腾ELLA(3)</title><description>&lt;p&gt;话说哥昨天被&lt;a href="http://workingbird.365-366.com/2010/03/markupdown.html"&gt;markup给down住&lt;/a&gt;了。没办法，对processor这块不熟悉，还需要学习和研究。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;给ELLA发了消息，还没有回复。也是发消息的时候估计他们也准备下班陪老婆孩子。这会儿，应该上床了吧？&lt;/p&gt;&lt;br /&gt;&lt;p&gt;上班偷偷折腾了一下，发现很容易解决这个问题。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;问题首先被定位到djangomarkup.models.TextProcessor.convert&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;code&gt;def convert(self, src_txt):&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;function = self.get_function()&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;try:&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;return function(src_txt)&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;except Exception, err:&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;raise ProcessorError(err)&lt;/code&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;这个地方抛出了Exception，err的内容为："markdown() got an unexpected keyword argument 'extras."&lt;/p&gt;&lt;br /&gt;&lt;p&gt;ok，进入到function里面看看。通过get_funciton，发现，这个function其实就是djangomarkup.processor.markup.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;code&gt;&lt;br/&gt;&lt;br /&gt;def markdown(src, **kwargs):&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;try:&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;from markdown2 import markdown as m&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;except ImportError:&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;try:&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;from markdown import markdown as m&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;except ImportError:&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;raise ProcessorConfigurationError(u"markdown nor markdown2 found")&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;return m(src, extras=["code-friendly"])&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;/code&gt;&lt;br /&gt;&lt;br/&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;extras参数不认识？但是没有抛出ImportError异常，这个非常诡异。尝试着安装了一下&lt;a href="http://python-markdown2.googlecode.com/"&gt;markdown2&lt;/a&gt;。（安装过程略……）问题解决，添加到content中的内容可以通过检验被保存到数据库了。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;也就是说，djangomarkup要依赖于python-markdown或markdown2的。文档中没有明确的说明，真是折腾人！&lt;/p&gt;&lt;br /&gt;&lt;p&gt;继续探索中：虽然content被保存，但content中的template tag并没有被解释出来，居然会直接显示{% box %}xxx{% endbox %}标签。非常晕倒！&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7400397557817693121-30011182137599916?l=workingbird.365-366.com' alt='' /&gt;&lt;/div&gt;</description><link>http://workingbird.365-366.com/2010/03/ella3.html</link><author>noreply@blogger.com (工作鸟)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-7400397557817693121.post-2373490496659923398</guid><pubDate>Sun, 14 Mar 2010 18:58:00 +0000</pubDate><atom:updated>2010-03-14T11:59:01.308-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>djangomarkup</category><category domain='http://www.blogger.com/atom/ns#'>django</category><category domain='http://www.blogger.com/atom/ns#'>ELLA</category><title>撇犊子玩意儿，markup把哥给down住了。</title><description>&lt;p&gt;继续开始折腾ELLA。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;其实ELLA的架构思想挺不错的，目前是觉得模板的思想挺不错。模板和配置相互对应，兼顾了灵活性和实用性。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;可恨的是，每个Publishable object中不能添加任何content。只要那些需要模板验证的地方，随便写任何东西，或者通过界面工具添加任何东西，都会报错："&lt;span class="form-error-msg"&gt;Bad syntax in syntax formatting or template tags.&lt;/span&gt;"&lt;/p&gt;&lt;br /&gt;&lt;p&gt;非常不可思议！&lt;/p&gt;&lt;br /&gt;&lt;p&gt;悄悄的在数据库里面添加想要的Content，页面显示是正常的。我直接怀疑是djangomarkup中的验证有问题，或许是兼容性，或许是其他原因。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;给Ella发了个消息，不知道能不能等到回复。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;今天是三一五，祝兄弟们好运！&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7400397557817693121-2373490496659923398?l=workingbird.365-366.com' alt='' /&gt;&lt;/div&gt;</description><link>http://workingbird.365-366.com/2010/03/markupdown.html</link><author>noreply@blogger.com (工作鸟)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-7400397557817693121.post-3470617018794987367</guid><pubDate>Fri, 05 Mar 2010 01:38:00 +0000</pubDate><atom:updated>2010-03-04T17:38:41.571-08:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>网吧</category><category domain='http://www.blogger.com/atom/ns#'>两会</category><title>“关闭社会网吧”挺好啊</title><description>&lt;p&gt;网吧总是要有的，就业也总是要解决的。社会网吧关闭了，社会网吧再开放，等于现在的网吧从业人员变成公务员了。以后，网吧聘个网管也应该通过公务员考试来招吧？&lt;/p&gt;&lt;br /&gt;&lt;p&gt;机器也是要解决的。这个采购量，估计能养出好几个IBM、戴尔出来。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;两会代表还是忧国忧民的，提的不好是水平问题，但精神上应鼓励，是不？&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7400397557817693121-3470617018794987367?l=workingbird.365-366.com' alt='' /&gt;&lt;/div&gt;</description><link>http://workingbird.365-366.com/2010/03/blog-post_04.html</link><author>noreply@blogger.com (工作鸟)</author><thr:total>0</thr:total></item></channel></rss>
