<?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://mcfog.com/feed" rel="self" type="application/rss+xml" /><link>http://mcfog.com</link> <description>某雾自言自语的小小天地</description> <lastBuildDate>Sat, 14 Apr 2012 10:09:00 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=3.3.1</generator> <atom:link rel="hub" href="http://pubsubhubbub.appspot.com"/><atom:link rel="hub" href="http://superfeedr.com/hubbub"/> <item><title>It&#8217;s mcfog&#8217;s Note!</title><link>http://mcfog.com/p866/its-mcfogs-note.fog</link> <comments>http://mcfog.com/p866/its-mcfogs-note.fog#comments</comments> <pubDate>Sat, 14 Apr 2012 10:09:00 +0000</pubDate> <dc:creator>McFog</dc:creator> <category><![CDATA[传说中的default]]></category> <guid
isPermaLink="false">http://mcfog.com/?p=866</guid> <description><![CDATA[<p><img
src="http://i.imgur.com/MOBXs.jpg" alt="" /></p>]]></description> <content:encoded><![CDATA[<p><img
src="http://i.imgur.com/MOBXs.jpg" alt="" /></p> ]]></content:encoded> <wfw:commentRss>http://mcfog.com/p866/its-mcfogs-note.fog/feed</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>兵贵神速-domReady事件原理及相应jQuery源码分析</title><link>http://mcfog.com/p848/%e5%85%b5%e8%b4%b5%e7%a5%9e%e9%80%9f-domready%e4%ba%8b%e4%bb%b6%e5%8e%9f%e7%90%86%e5%8f%8a%e7%9b%b8%e5%ba%94jquery%e6%ba%90%e7%a0%81%e5%88%86%e6%9e%90.fog</link> <comments>http://mcfog.com/p848/%e5%85%b5%e8%b4%b5%e7%a5%9e%e9%80%9f-domready%e4%ba%8b%e4%bb%b6%e5%8e%9f%e7%90%86%e5%8f%8a%e7%9b%b8%e5%ba%94jquery%e6%ba%90%e7%a0%81%e5%88%86%e6%9e%90.fog#comments</comments> <pubDate>Sat, 07 Apr 2012 15:40:09 +0000</pubDate> <dc:creator>McFog</dc:creator> <category><![CDATA[WebDev]]></category> <category><![CDATA[传说中的default]]></category> <category><![CDATA[技术]]></category> <category><![CDATA[jQuery]]></category> <category><![CDATA[JS]]></category> <guid
isPermaLink="false">http://mcfog.com/?p=848</guid> <description><![CDATA[<blockquote><p>突然发现，其实本来自以为非常熟悉的一些技术，一旦被人提问以后就会发现自己并不能很好地说明清楚，所以开始认真地写一些非常基础的技术分享，不断查资料探究原理的过程还是非常有趣的</p></blockquote><p><img
src="http://i.imgur.com/RPnLx.jpg" alt="2009090812124856310.jpg" /></p><p>之前被问domReady事件到底是啥，比onload到底好在哪里，一句话说的话就是 DomTree加载完成之后，不等图片加载完domReady就会发生，这时绝大多数JS已经可以正常地运行了（因为页面上初始的dom元素都齐了）。但要说清楚这个domReady的来龙去脉，还真没那么简单。</p> W3C标准页面加载过程<p>W3C中关于浏览器加载过程的时间信息的接口标准中有很多页面加载方面的标准，简单地说在chrome里检查<code>performance.timing</code>就可以看见各个事件发生的时间戳 <img
src="http://i.imgur.com/Jf7rp.png" alt="無名の QQ スクリーンショット.png" /> W3C的这张图很好地描述了浏览器加载页面的整个过程，除了domLoading(开始解析dom树)可能会抢先在responseEnd(网络接受应答完毕)之前发生之外，基本是从左到右时间顺序发生 <img
src="http://www.w3.org/TR/navigation-timing/timing-overview.png" alt="" /></p><p>这里我们关注processing以及之后的部分，我尝试解释一下各个事件的含义</p><ul><li><code>domLoading</code> 浏览器拿到了一些HTML代码，开始解析dom树<ul><li>设置<code>document.readyState</code>为”loading”（也就触发了<code>readyStateChange</code>)</li><li>注意引用的外部script会阻塞dom树解析</li><li>解析过程比较复杂这里不多涉及，可以参考W3C的Parsing部分的标准</li></ul></li><li><code>domInteractive</code> 浏览器初步解析完dom树，但并不稳定，仍残余一些工作，W3C的相关标准链接<ul><li>设置<code>document.readyState</code>为”interactive”</li><li>清空打开标签堆栈，也就是强制关闭仍未闭合的标签</li><li>写在html中的script元素，含defer属性且不含async属性的会在这个时机被执行</li><li>此时才会触发<code>domContentLoaded</code>事件</li></ul></li><li><code>domContentLoaded</code>其实就是俗称的domReady事件，此时dom树已经稳定<ul><li>aync属性的script元素在这个时机被执行</li><li>满足另一种条件的script元素也是这个时机被执行，我没能看懂，估计是来自于<code>document.createElement</code>创建出来的某种情况</li></ul></li><li><code>domComplete</code> 需要加载的资源（包括图片、iFrame等等等等）以及脚本全部执行完毕<ul><li>设置<code>document.readyState</code>为”complete”</li><li>这个事件和load事件的区别是load事件必须要有Browsing Context才会被触发，但时机是一样的</li></ul></li><li><code>loadEventStart</code> load事件被触发</li><li><code>loadEventEnd</code> load事件执行完毕</li> &#8230;<p><a
class="more-link block-button" href="http://mcfog.com/p848/%e5%85%b5%e8%b4%b5%e7%a5%9e%e9%80%9f-domready%e4%ba%8b%e4%bb%b6%e5%8e%9f%e7%90%86%e5%8f%8a%e7%9b%b8%e5%ba%94jquery%e6%ba%90%e7%a0%81%e5%88%86%e6%9e%90.fog">继续阅读 &#187;</a></p></ul>]]></description> <content:encoded><![CDATA[<blockquote><p>突然发现，其实本来自以为非常熟悉的一些技术，一旦被人提问以后就会发现自己并不能很好地说明清楚，所以开始认真地写一些非常基础的技术分享，不断查资料探究原理的过程还是非常有趣的</p></blockquote><p><img
src="http://i.imgur.com/RPnLx.jpg" alt="2009090812124856310.jpg" /></p><p>之前被问domReady事件到底是啥，比onload到底好在哪里，一句话说的话就是 DomTree加载完成之后，不等图片加载完domReady就会发生，这时绝大多数JS已经可以正常地运行了（因为页面上初始的dom元素都齐了）。但要说清楚这个domReady的来龙去脉，还真没那么简单。</p><h3>W3C标准页面加载过程</h3><p><a
href="http://www.w3.org/TR/navigation-timing/">W3C中关于浏览器加载过程的时间信息的接口标准</a>中有很多页面加载方面的标准，简单地说在chrome里检查<code>performance.timing</code>就可以看见各个事件发生的时间戳<br
/> <img
src="http://i.imgur.com/Jf7rp.png" alt="無名の QQ スクリーンショット.png" /><br
/> W3C的这张图很好地描述了浏览器加载页面的整个过程，除了domLoading(开始解析dom树)可能会抢先在responseEnd(网络接受应答完毕)之前发生之外，基本是从左到右时间顺序发生<br
/> <img
src="http://www.w3.org/TR/navigation-timing/timing-overview.png" alt="" /></p><p>这里我们关注processing以及之后的部分，我尝试解释一下各个事件的含义</p><ul><li><code>domLoading</code> 浏览器拿到了一些HTML代码，开始解析dom树<ul><li>设置<code>document.readyState</code>为”loading”（也就触发了<code>readyStateChange</code>)</li><li>注意引用的外部script会阻塞dom树解析</li><li>解析过程比较复杂这里不多涉及，可以参考<a
href="http://www.w3.org/TR/html5/parsing.html#parsing">W3C的Parsing</a>部分的标准</li></ul></li><li><code>domInteractive</code> 浏览器初步解析完dom树，但并不稳定，仍残余一些工作，<a
href="http://www.w3.org/TR/html5/the-end.html#the-end">W3C的相关标准链接</a><ul><li>设置<code>document.readyState</code>为”interactive”</li><li>清空<a
href="http://www.w3.org/TR/html5/parsing.html#stack-of-open-elements">打开标签堆栈</a>，也就是强制关闭仍未闭合的标签</li><li>写在html中的script元素，含defer属性且不含async属性的会在这个时机被执行</li><li>此时才会触发<code>domContentLoaded</code>事件</li></ul></li><li><code>domContentLoaded</code>其实就是俗称的domReady事件，此时dom树已经稳定<ul><li>aync属性的script元素在这个时机被执行</li><li><a
href="http://www.w3.org/TR/html5/the-script-element.html#list-of-scripts-that-will-execute-in-order-as-soon-as-possible">满足另一种条件</a>的script元素也是这个时机被执行，我没能看懂，估计是来自于<code>document.createElement</code>创建出来的某种情况</li></ul></li><li><code>domComplete</code> 需要加载的资源（包括图片、iFrame等等等等）以及脚本全部执行完毕<ul><li>设置<code>document.readyState</code>为”complete”</li><li>这个事件和load事件的区别是load事件必须要有<a
href="http://www.w3.org/TR/html5/browsers.html#browsing-context">Browsing Context</a>才会被触发，但时机是一样的</li></ul></li><li><code>loadEventStart</code> load事件被触发</li><li><code>loadEventEnd</code> load事件执行完毕</li></ul><h3>domReady的现实</h3><p>一般来说我们希望页面上的脚本尽量快速地被执行，但很多情景下都需要完整可操作的dom树才能保证脚本执行正确,尤其是IE6在interactive以及之前的阶段，如果用JS操作了dom树会直接“无法打开站点”。</p><p>问题是绝大多数情况下，图片(或者swf等)都不是JS脚本需要的资源，也就是说我们要找的时间点是dom树完整之后，图片加载之前的一个地方来执行我们的脚本，也就是所谓的domReady。对于主流标准浏览器来说，domContentLoaded正是我们需要的domReady，但很不幸我们生活在有IE的世界里，所以需要为IE找一个替代品(<a
href="http://javascript.nwbox.com/IEContentLoaded/">doScroll checking</a>)</p><h4>jQuery相关源码解析</h4><p>这里看的是jQuery1.7.2的代码，相关部分在<a
href="https://github.com/jquery/jquery/blob/1.7.2/src/core.js">core.js</a>里面</p><p>jQuery里domReady的绑定代码是<code>jQuery(callback)</code>或者<code>jQuery(document).ready(callback)</code>，最终都落到了<a
href="https://github.com/jquery/jquery/blob/1.7.2/src/core.js#L253"><code>jQuery.fn.ready</code></a>上，readyList维护注册在ready时间上的callback集合，<a
href="https://github.com/jquery/jquery/blob/1.7.2/src/core.js#L396"><code>jQuery.ready</code></a>是jQuery希望绑定在domReady上的callback，里面会执行所有通过各种手段绑定上ready的callback，于是我们主要看<a
href="https://github.com/jquery/jquery/blob/1.7.2/src/core.js#L423"><code>jQuery.bindReady</code></a></p><ol><li>处理了被调用时已经load事件都发生过的情况(L430)</li><li>对标准浏览器，用domContentLoaded事件并同时也绑上load事件作为fallback来支持早期版本 (L437)</li><li>对IE，首先绑定了readystatechange的complete的情况，以及load事件，然后尝试使用<a
href="https://github.com/jquery/jquery/blob/1.7.2/src/core.js#L942"><code>doScrollCheck</code></a>来更早地触发ready事件(L445)</li></ol><h3>domReady的问题</h3><p>domReady虽然通常比load快不少，但此时并不能保证外部资源全部load到，所以需要读img/包含img的元素的尺寸时不能直接在domReady里面跑，flash及类似的外部资源也有类似的问题</p><hr
/><p>参考：<a
href="http://www.cnblogs.com/zhangziqiu/archive/2011/06/27/DOMReady.html">DOM Ready 详解</a></p> ]]></content:encoded> <wfw:commentRss>http://mcfog.com/p848/%e5%85%b5%e8%b4%b5%e7%a5%9e%e9%80%9f-domready%e4%ba%8b%e4%bb%b6%e5%8e%9f%e7%90%86%e5%8f%8a%e7%9b%b8%e5%ba%94jquery%e6%ba%90%e7%a0%81%e5%88%86%e6%9e%90.fog/feed</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Nite.PointDenoiser的正确用法</title><link>http://mcfog.com/p787/nite-pointdenoiser%e7%9a%84%e6%ad%a3%e7%a1%ae%e7%94%a8%e6%b3%95.fog</link> <comments>http://mcfog.com/p787/nite-pointdenoiser%e7%9a%84%e6%ad%a3%e7%a1%ae%e7%94%a8%e6%b3%95.fog#comments</comments> <pubDate>Sun, 04 Mar 2012 10:53:38 +0000</pubDate> <dc:creator>McFog</dc:creator> <category><![CDATA[技术]]></category> <category><![CDATA[CSharp]]></category> <category><![CDATA[Kinect]]></category> <category><![CDATA[OpenNI]]></category> <guid
isPermaLink="false">http://mcfog.com/?p=787</guid> <description><![CDATA[摘要<p>在OpenNI/Kinect框架开发中，如何正确地使用Nite.PointDenoiser (XnVPointDenoiser) 来对手势进行平滑、降噪处理</p> 问题<p>嗯，最近调教Kinect做手势识别，上OpenNI/Nite框架。 追踪手部用<code>Nite.SessionManager</code>很轻松就能弄出样子来，但是用带除噪的<code>Nite.PointDenoiser</code>代替<code>Nite.PointControl</code>却无效，坐标依旧不停地颤动。</p> 原因<p>在GoogleGroups里找到了一些有关的讨论，简单地说就是根据API手册，相关的事件如<code>OnPrimaryPointUpdate</code>在<code>PointDenoiser</code>类中压根没有重载，</p><p>翻API手册，可以找到一张难看的类图 <img
src="http://imgur.com/ToB5g.png" alt="PointDenoiser类图" /> 作为一个<code>PointFilter</code>的子类，<code>PointDenoiser</code>是有信息输入（订阅者）<code>MessageListener</code> 和信息输出（发布者）<code>MessageGenerator</code>两者的特性的，在XnVPointDenoiser Member List页面可以很清楚地看到<code>PrimaryPointUpdate</code>等事件都是属于<code>PointControl</code>也就是<code>MessageListener</code>继承而来的，所以这些事件中的信息必然是和输入的信息一模一样不可能被降噪，要获取降噪后的结果，我们需要的是<code>MessageGenerator</code>下的方法，也就是<code>PointDenoiser::AddListener</code></p> 解决<p>最简单的方法就是把<code>PointControl</code>的实例传给<code>PointDenoiser::AddListener</code>，然后监听<code>PointControl</code>的相关事件，大致代码如下</p> ?View Code CSHARP<pre>1 2 3 4 5 6 7 8 </pre><pre class="csharp" style="font-family:monospace;">ScriptNode scrNode; SessionManager session = Context.CreateFromXmlFile&#40;&#34;./path/to/config.xml&#34;, out scrNode&#41;; PointControl pointControl = new PointControl&#40;&#41;; PointDenoiser pointDenoiser = new PointDenoiser&#40;&#41;; &#160; session.AddListener&#40;pointDenoiser&#41;; pointDenoiser.AddListener&#40;pointControl&#41;; pointControl.PrimaryPointUpdate += &#8230; <p><a class="more-link block-button" href="http://mcfog.com/p787/nite-pointdenoiser%e7%9a%84%e6%ad%a3%e7%a1%ae%e7%94%a8%e6%b3%95.fog">继续阅读 &#187;</a></p></pre>]]></description> <content:encoded><![CDATA[<h3>摘要</h3><p>在OpenNI/Kinect框架开发中，如何正确地使用Nite.PointDenoiser (XnVPointDenoiser) 来对手势进行平滑、降噪处理</p><h3>问题</h3><p>嗯，最近调教Kinect做手势识别，上<a
href="http://openni.org">OpenNI/Nite</a>框架。<br
/> 追踪手部用<code>Nite.SessionManager</code>很轻松就能弄出样子来，但是用带除噪的<code>Nite.PointDenoiser</code>代替<code>Nite.PointControl</code>却无效，坐标依旧不停地颤动。</p><h3>原因</h3><p>在GoogleGroups里找到了<a
href="http://groups.google.com/group/openni-dev/browse_thread/thread/098a17305a1ac25f#msg_19e5177aa2f7b8e1">一些有关的讨论</a>，简单地说就是根据API手册，相关的事件如<code>OnPrimaryPointUpdate</code>在<code>PointDenoiser</code>类中压根没有重载，</p><p>翻API手册，可以找到一张难看的类图<br
/> <img
src="http://imgur.com/ToB5g.png" alt="PointDenoiser类图" /><br
/> 作为一个<code>PointFilter</code>的子类，<code>PointDenoiser</code>是有信息输入（订阅者）<code>MessageListener</code> 和信息输出（发布者）<code>MessageGenerator</code>两者的特性的，在<em>XnVPointDenoiser Member List</em>页面可以很清楚地看到<code>PrimaryPointUpdate</code>等事件都是属于<code>PointControl</code>也就是<code>MessageListener</code>继承而来的，所以这些事件中的信息必然是和输入的信息一模一样不可能被降噪，要获取降噪后的结果，我们需要的是<code>MessageGenerator</code>下的方法，也就是<code>PointDenoiser::AddListener</code></p><h3>解决</h3><p>最简单的方法就是把<code>PointControl</code>的实例传给<code>PointDenoiser::AddListener</code>，然后监听<code>PointControl</code>的相关事件，大致代码如下</p><div
class="wp_codebox_msgheader"><span
class="right"><sup><a
href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span
style="color: #99cc00">?</span></a></sup></span><span
class="left"><a
href="javascript:;" onclick="javascript:showCodeTxt('p787code3'); return false;">View Code</a> CSHARP</span><div
class="codebox_clear"></div></div><div
class="wp_codebox"><table><tr
id="p7873"><td
class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td
class="code" id="p787code3"><pre class="csharp" style="font-family:monospace;">ScriptNode scrNode<span style="color: #008000;">;</span>
SessionManager session <span style="color: #008000;">=</span> Context<span style="color: #008000;">.</span><span style="color: #0000FF;">CreateFromXmlFile</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;./path/to/config.xml&quot;</span>, <span style="color: #0600FF; font-weight: bold;">out</span> scrNode<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
PointControl pointControl <span style="color: #008000;">=</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> PointControl<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
PointDenoiser pointDenoiser <span style="color: #008000;">=</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> PointDenoiser<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
session<span style="color: #008000;">.</span><span style="color: #0000FF;">AddListener</span><span style="color: #008000;">&#40;</span>pointDenoiser<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
pointDenoiser<span style="color: #008000;">.</span><span style="color: #0000FF;">AddListener</span><span style="color: #008000;">&#40;</span>pointControl<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
pointControl<span style="color: #008000;">.</span><span style="color: #0000FF;">PrimaryPointUpdate</span> <span style="color: #008000;">+=</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> EventHandler<span style="color: #008000;">&amp;</span>lt<span style="color: #008000;">;</span>HandEventArgs<span style="color: #008000;">&gt;</span><span style="color: #008000;">&#40;</span>pointControl_PrimaryPointUpdate<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span></pre></td></tr></table></div><p>最后贴个完整的类，转发了<code>PointDenoiser</code>的三个配置属性，另外在当中插入了一个broadcaster预留给子类一个访问和控制的接口</p><div
class="wp_codebox_msgheader"><span
class="right"><sup><a
href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span
style="color: #99cc00">?</span></a></sup></span><span
class="left"><a
href="javascript:;" onclick="javascript:showCodeTxt('p787code4'); return false;">View Code</a> CSHARP</span><div
class="codebox_clear"></div></div><div
class="wp_codebox"><table><tr
id="p7874"><td
class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
</pre></td><td
class="code" id="p787code4"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System</span><span style="color: #008000;">;</span>
<span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">NITE</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #0600FF; font-weight: bold;">namespace</span> GGI<span style="color: #008000;">.</span><span style="color: #0000FF;">Model</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #6666cc; font-weight: bold;">class</span> PointDenoiseControl<span style="color: #008000;">:</span>PointControl
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0600FF; font-weight: bold;">public</span> PointDenoiseControl<span style="color: #008000;">&#40;</span>SessionManager _session<span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">:</span> <span style="color: #0600FF; font-weight: bold;">base</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            session <span style="color: #008000;">=</span> _session<span style="color: #008000;">;</span>
            broadcaster <span style="color: #008000;">=</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> Broadcaster<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            broadcaster<span style="color: #008000;">.</span><span style="color: #0000FF;">AddListener</span><span style="color: #008000;">&#40;</span><span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            pointDenoiser <span style="color: #008000;">=</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> PointDenoiser<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            session<span style="color: #008000;">.</span><span style="color: #0000FF;">AddListener</span><span style="color: #008000;">&#40;</span>pointDenoiser<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            pointDenoiser<span style="color: #008000;">.</span><span style="color: #0000FF;">AddListener</span><span style="color: #008000;">&#40;</span>broadcaster<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">protected</span> Broadcaster broadcaster<span style="color: #008000;">;</span>
        <span style="color: #0600FF; font-weight: bold;">protected</span> SessionManager session<span style="color: #008000;">;</span>
        <span style="color: #0600FF; font-weight: bold;">protected</span> PointDenoiser pointDenoiser<span style="color: #008000;">;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">float</span> DistanceThreshold
        <span style="color: #008000;">&#123;</span>
            get
            <span style="color: #008000;">&#123;</span> <span style="color: #0600FF; font-weight: bold;">return</span> pointDenoiser<span style="color: #008000;">.</span><span style="color: #0000FF;">DistanceThreshold</span><span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span>
            set
            <span style="color: #008000;">&#123;</span> pointDenoiser<span style="color: #008000;">.</span><span style="color: #0000FF;">DistanceThreshold</span> <span style="color: #008000;">=</span> value<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span>
        <span style="color: #008000;">&#125;</span>
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">float</span> CloseRatio
        <span style="color: #008000;">&#123;</span>
            get
            <span style="color: #008000;">&#123;</span> <span style="color: #0600FF; font-weight: bold;">return</span> pointDenoiser<span style="color: #008000;">.</span><span style="color: #0000FF;">CloseRatio</span><span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span>
            set
            <span style="color: #008000;">&#123;</span> pointDenoiser<span style="color: #008000;">.</span><span style="color: #0000FF;">CloseRatio</span> <span style="color: #008000;">=</span> value<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span>
        <span style="color: #008000;">&#125;</span>
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">float</span> FarRation
        <span style="color: #008000;">&#123;</span>
            get
            <span style="color: #008000;">&#123;</span> <span style="color: #0600FF; font-weight: bold;">return</span> pointDenoiser<span style="color: #008000;">.</span><span style="color: #0000FF;">FarRatio</span><span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span>
            set
            <span style="color: #008000;">&#123;</span> pointDenoiser<span style="color: #008000;">.</span><span style="color: #0000FF;">FarRatio</span> <span style="color: #008000;">=</span> value<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span>
        <span style="color: #008000;">&#125;</span>
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div><p>PS: 还是MarkDown爽，怎么就没早点想起来装个MarkDown的WP插件呢= =</p> ]]></content:encoded> <wfw:commentRss>http://mcfog.com/p787/nite-pointdenoiser%e7%9a%84%e6%ad%a3%e7%a1%ae%e7%94%a8%e6%b3%95.fog/feed</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>流水账</title><link>http://mcfog.com/p781/%e6%b5%81%e6%b0%b4%e8%b4%a6.fog</link> <comments>http://mcfog.com/p781/%e6%b5%81%e6%b0%b4%e8%b4%a6.fog#comments</comments> <pubDate>Wed, 26 Oct 2011 16:21:30 +0000</pubDate> <dc:creator>McFog</dc:creator> <category><![CDATA[心]]></category> <guid
isPermaLink="false">http://mcfog.com/?p=781</guid> <description><![CDATA[<p>一不小心又是一年多没有写这个分类了，随便翻翻前面，按短的算我入宅都有3年了……这个分类最早从高考前的月经贴开始，而我现在已经在开始头疼能不能正常毕业了……</p><p>不知道是不是一边上学一边实习的缘故，总觉得最近的状态没有暑假的时候的好了，工作方面开始出现一些差错和不足了，在公司抽不出时间来看新番了，自信心似乎也没以前那么强了</p><p>学校这边还要还挂科的债，而且大四这帮课竟然充满了PJ，实在是没有天理（顺带一提这周一我翘了一个PJ的检查，昨天下午去找了助教演示那个残缺的PJ被鄙视了，今天上午还要再去）</p><p>找工作方面，我越来越佩服那些玩海投战术的同志了……我就投了俩，其中支付宝还渺无音讯呢，都觉得焦头烂额了……不过我还是坚持自己的做法，投的少&#038;准，希望这周末的面试能果断拿下一个offer先吧……</p><p>PS，我发现这个分类其实可以改名叫黑历史了…… PS2，准备尝试实施GTD了……</p>]]></description> <content:encoded><![CDATA[<p>一不小心又是一年多没有写这个分类了，随便翻翻前面，按短的算我入宅都有3年了……这个分类最早从高考前的月经贴开始，而我现在已经在开始头疼能不能正常毕业了……</p><p>不知道是不是一边上学一边实习的缘故，总觉得最近的状态没有暑假的时候的好了，工作方面开始出现一些差错和不足了，在公司抽不出时间来看新番了，自信心似乎也没以前那么强了</p><p>学校这边还要还挂科的债，而且大四这帮课竟然充满了PJ，实在是没有天理（顺带一提这周一我翘了一个PJ的检查，昨天下午去找了助教演示那个残缺的PJ被鄙视了，今天上午还要再去）</p><p>找工作方面，我越来越佩服那些玩海投战术的同志了……我就投了俩，其中支付宝还渺无音讯呢，都觉得焦头烂额了……不过我还是坚持自己的做法，投的少&#038;准，希望这周末的面试能果断拿下一个offer先吧……</p><p>PS，我发现这个分类其实可以改名叫黑历史了……<br
/> PS2，准备尝试实施GTD了……</p> ]]></content:encoded> <wfw:commentRss>http://mcfog.com/p781/%e6%b5%81%e6%b0%b4%e8%b4%a6.fog/feed</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>又见拖延症</title><link>http://mcfog.com/p770/%e5%8f%88%e8%a7%81%e6%8b%96%e5%bb%b6%e7%97%87.fog</link> <comments>http://mcfog.com/p770/%e5%8f%88%e8%a7%81%e6%8b%96%e5%bb%b6%e7%97%87.fog#comments</comments> <pubDate>Thu, 16 Jun 2011 16:10:46 +0000</pubDate> <dc:creator>McFog</dc:creator> <category><![CDATA[monolog]]></category> <guid
isPermaLink="false">http://mcfog.com/?p=770</guid> <description><![CDATA[<p>唔……还有5门考试和4篇文章，今天下午还就有一门压根还没还没看的期末，睡觉前还应该交掉一篇文章，我却还在各种拖……</p><p>希望这不是第一万五千四百九十八次六月底Orz</p>]]></description> <content:encoded><![CDATA[<p>唔……还有5门考试和4篇文章，今天下午还就有一门压根还没还没看的期末，睡觉前还应该交掉一篇文章，我却还在各种拖……</p><p>希望这不是第一万五千四百九十八次六月底Orz</p> ]]></content:encoded> <wfw:commentRss>http://mcfog.com/p770/%e5%8f%88%e8%a7%81%e6%8b%96%e5%bb%b6%e7%97%87.fog/feed</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>小黑X220入手，上果照</title><link>http://mcfog.com/p760/%e5%b0%8f%e9%bb%91x220%e5%85%a5%e6%89%8b%ef%bc%8c%e4%b8%8a%e6%9e%9c%e7%85%a7.fog</link> <comments>http://mcfog.com/p760/%e5%b0%8f%e9%bb%91x220%e5%85%a5%e6%89%8b%ef%bc%8c%e4%b8%8a%e6%9e%9c%e7%85%a7.fog#comments</comments> <pubDate>Sun, 05 Jun 2011 09:46:56 +0000</pubDate> <dc:creator>McFog</dc:creator> <category><![CDATA[点滴]]></category> <category><![CDATA[gadget]]></category> <category><![CDATA[真相]]></category> <guid
isPermaLink="false">http://mcfog.com/?p=760</guid> <description><![CDATA[<p>港行，i5-2410M,2G,320G,蓝指六，6.5K送货上门</p><p>等去学校了再搞个内存条就行了 <img
rel="lightbox" src="http://i.imgur.com/CHALOl.jpg" alt="" /> <img
rel="lightbox" src="http://i.imgur.com/DInLVl.jpg" alt="" /></p>]]></description> <content:encoded><![CDATA[<p>港行，i5-2410M,2G,320G,蓝指六，6.5K送货上门</p><p>等去学校了再搞个内存条就行了<br
/> <img
rel="lightbox" src="http://i.imgur.com/CHALOl.jpg" alt="" /><br
/> <img
rel="lightbox" src="http://i.imgur.com/DInLVl.jpg" alt="" /></p> ]]></content:encoded> <wfw:commentRss>http://mcfog.com/p760/%e5%b0%8f%e9%bb%91x220%e5%85%a5%e6%89%8b%ef%bc%8c%e4%b8%8a%e6%9e%9c%e7%85%a7.fog/feed</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>申腾讯实习记</title><link>http://mcfog.com/p752/%e7%94%b3%e8%85%be%e8%ae%af%e5%ae%9e%e4%b9%a0%e8%ae%b0.fog</link> <comments>http://mcfog.com/p752/%e7%94%b3%e8%85%be%e8%ae%af%e5%ae%9e%e4%b9%a0%e8%ae%b0.fog#comments</comments> <pubDate>Thu, 19 May 2011 08:45:18 +0000</pubDate> <dc:creator>McFog</dc:creator> <category><![CDATA[点滴]]></category> <category><![CDATA[腾讯]]></category> <guid
isPermaLink="false">http://mcfog.com/?p=752</guid> <description><![CDATA[<p>上周末面完最后一面，据HR说这个礼拜就会有结果，但今天还没收到offer，心情不可避免地有些忐忑 <img
src="http://i.imgur.com/fZPff.jpg" alt="" /> 面试的风格么，非常急，几次短信基本都是凌晨收到当天的面试通知，据说是因为有外地来面的所以希望迅速搞定，于是HR全力各种加班……</p><p>&#160;</p> 笔试<p>比起深度和难度更注重广度的一份卷子，难度低下（编程题比大一的程设期末还简单N多），后面分方向的部分我做了2个方向的(PHP和JS)，PHP的题目比较基础，甚至涉及整型变量范围这样的；JS题目比较实际，要求码一段实现某某交互的代码，用jQuery简单写了下</p> 一面<p>笔试N千人，其中技术的一千多，一面六百多人，比通知的时间晚了一个小时左右才轮到我</p><p>一面主要是技术，也是比起深度更在乎广度的面试，面试官很年轻，气氛很轻松，这里问排序算法的问题没答到最好（堆排）……遗憾……</p><p>其他还有关于HTTP，TCP的，关于浏览器、缓存、OS、环境部署等等各个方面的问题，但都问得不深，正中本人下怀</p><p>据说有的面试官会给你看你的笔试卷子，我也没看到，有点好奇……</p> 二面<p>二面的消息倒是提前了一天发给我(不过还是凌晨)，后来得知二面叫boss面，我的面试官是上海这边的开发总监(?)。嘛，一看就是个boss了，广东口音的美帝海龟，说英文比说中文沟通更有效率（不过好处是感觉紧张的时候可以装作听不懂广东话来缓解一下）</p><p>技术方面问题比一面少一些但也难一些，另外还问了一些关于TeamWork，关于Communication之类方面的问题，说实话这类问题都是唱得容易做起来难，我只希望以后我工作的时候真能做到我说的那些就已经很好了(汗)，和一面的共同点就是可以反问问题，不仅能获得关于问题的更详细的描述，也能获得一些提示，也能整理一下自己的思路，另外最后还有个智力题，不需要看任何面经什么的我觉的正常人都看到过的（3个人住旅馆30块老板退5块服务生扣2块下略）</p><p>和简历相关的问题也是例行公事，反正简历没有水分，如实即可，另外还问了关于失败经历的问题，这种问题只要回答成『我从那次失败中学到了N多』就行</p> 三面<p>三面是HR的面试，比前两次时间上都短，HR不问任何技术问题，主要还是看个人性格、兴趣，还有对腾讯的看法等等之类，虽然去之前有点紧张（碰到一坨研究生和某研究生大牛），但其实是最水的一面了，后来还宣传了一下腾讯内部的员工待遇什么的</p><p>&#160;</p> 刚才收到一面面试官owen的消息说我进了他们组，QQ团购，撒花 嘛，忐忑是不忐忑了，还是等HR的通知到了再去日西吧]]></description> <content:encoded><![CDATA[<p>上周末面完最后一面，据HR说这个礼拜就会有结果，但今天还没收到offer，心情不可避免地有些忐忑<br
/> <img
src="http://i.imgur.com/fZPff.jpg" alt="" /><br
/> 面试的风格么，非常急，几次短信基本都是凌晨收到当天的面试通知，据说是因为有外地来面的所以希望迅速搞定，于是HR全力各种加班……</p><p>&nbsp;</p><h2>笔试</h2><p>比起深度和难度更注重广度的一份卷子，难度低下（编程题比大一的程设期末还简单N多），后面分方向的部分我做了2个方向的(PHP和JS)，PHP的题目比较基础，甚至涉及整型变量范围这样的；JS题目比较实际，要求码一段实现某某交互的代码，用jQuery简单写了下</p><h2>一面</h2><p>笔试N千人，其中技术的一千多，一面六百多人，比通知的时间晚了一个小时左右才轮到我</p><p>一面主要是技术，也是比起深度更在乎广度的面试，面试官很年轻，气氛很轻松，这里问排序算法的问题没答到最好（堆排）……遗憾……</p><p>其他还有关于HTTP，TCP的，关于浏览器、缓存、OS、环境部署等等各个方面的问题，但都问得不深，正中本人下怀</p><p>据说有的面试官会给你看你的笔试卷子，我也没看到，有点好奇……</p><h2>二面</h2><p>二面的消息倒是提前了一天发给我(不过还是凌晨)，后来得知二面叫boss面，我的面试官是上海这边的开发总监(?)。嘛，一看就是个boss了，广东口音的美帝海龟，说英文比说中文沟通更有效率（不过好处是感觉紧张的时候可以装作听不懂广东话来缓解一下）</p><p>技术方面问题比一面少一些但也难一些，另外还问了一些关于TeamWork，关于Communication之类方面的问题，说实话这类问题都是唱得容易做起来难，我只希望以后我工作的时候真能做到我说的那些就已经很好了(汗)，和一面的共同点就是可以反问问题，不仅能获得关于问题的更详细的描述，也能获得一些提示，也能整理一下自己的思路，另外最后还有个智力题，不需要看任何面经什么的我觉的正常人都看到过的（3个人住旅馆30块老板退5块服务生扣2块下略）</p><p>和简历相关的问题也是例行公事，反正简历没有水分，如实即可，另外还问了关于失败经历的问题，这种问题只要回答成『我从那次失败中学到了N多』就行</p><h2>三面</h2><p>三面是HR的面试，比前两次时间上都短，HR不问任何技术问题，主要还是看个人性格、兴趣，还有对腾讯的看法等等之类，虽然去之前有点紧张（碰到一坨研究生和某研究生大牛），但其实是最水的一面了，后来还宣传了一下腾讯内部的员工待遇什么的</p><p>&nbsp;</p><hr
/> <strong>刚才收到一面面试官owen的消息说我进了他们组，QQ团购，撒花</strong><br
/> 嘛，忐忑是不忐忑了，还是等HR的通知到了再去日西吧</p> ]]></content:encoded> <wfw:commentRss>http://mcfog.com/p752/%e7%94%b3%e8%85%be%e8%ae%af%e5%ae%9e%e4%b9%a0%e8%ae%b0.fog/feed</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>【神鼠绘】我的“紧张感”曲线</title><link>http://mcfog.com/p746/%e3%80%90%e7%a5%9e%e9%bc%a0%e7%bb%98%e3%80%91%e6%88%91%e7%9a%84%e2%80%9c%e7%b4%a7%e5%bc%a0%e6%84%9f%e2%80%9d%e6%9b%b2%e7%ba%bf.fog</link> <comments>http://mcfog.com/p746/%e3%80%90%e7%a5%9e%e9%bc%a0%e7%bb%98%e3%80%91%e6%88%91%e7%9a%84%e2%80%9c%e7%b4%a7%e5%bc%a0%e6%84%9f%e2%80%9d%e6%9b%b2%e7%ba%bf.fog#comments</comments> <pubDate>Mon, 09 May 2011 13:18:55 +0000</pubDate> <dc:creator>McFog</dc:creator> <category><![CDATA[点滴]]></category> <category><![CDATA[神鼠绘]]></category> <guid
isPermaLink="false">http://mcfog.com/?p=746</guid> <description><![CDATA[<p>嘛，人在面临重要时间节点的时候心理上都难免出现波动，这样的波动因人而异，下面这个可能是比较通常的一种 <img
src="http://ih.mcfog.com/di-14130494610910.png" alt="" /></p><p>可惜我不是一般人，也不是二班的人，我来自一个神奇的班级，即使在那个神奇的班级里我也算一个神奇的角色了，下面是我自评自己在重要事件来临时的心理紧张程度曲线 <img
src="http://ih.mcfog.com/di-10130494611016.png" alt="" /></p><ul><li>1：被以前的同学称为『高中的一个梦想之一就是过一天他这样的日子』的堕落日常</li><li>2：发现竟然要XXX了，我却完全不知道X是个啥，陷入恐慌中约一天至三秒的时间</li><li>3：三秒或一天后发现慌也是没用的，于是听天由命了</li><li>4：事件发生的时候进入一种很神奇的量子态，按照费因曼求和来说应该是表现为紧张感0，按照事件的大小还有一定概率让我陷入Seed的状态</li><li>5：虽然结束后马上就会开始恢复堕落的日常，但还是会有几天玩得没有平时那么尽兴，嘛，但也仅此而已了</li></ul><p>嘛，其实今天的情况是这样的：我去南极洲找企鹅面试，等面试的过程中无聊开PSP低头闷玩，面试过程中找回了上个礼拜不小心丢掉了的自信心，面试结束后感觉世界比以前要鲜艳一些</p>]]></description> <content:encoded><![CDATA[<p>嘛，人在面临重要时间节点的时候心理上都难免出现波动，这样的波动因人而异，下面这个可能是比较通常的一种<br
/> <img
src="http://ih.mcfog.com/di-14130494610910.png" alt="" /></p><p>可惜我不是一般人，也不是二班的人，我来自一个神奇的班级，即使在那个神奇的班级里我也算一个神奇的角色了，下面是我自评自己在重要事件来临时的心理紧张程度曲线<br
/> <img
src="http://ih.mcfog.com/di-10130494611016.png" alt="" /></p><ul><li>1：被以前的同学称为『高中的一个梦想之一就是过一天他这样的日子』的堕落日常</li><li>2：发现竟然要XXX了，我却完全不知道X是个啥，陷入恐慌中约一天至三秒的时间</li><li>3：三秒或一天后发现慌也是没用的，于是听天由命了</li><li>4：事件发生的时候进入一种很神奇的量子态，按照<a
href="http://www.hudong.com/wiki/%E5%AE%87%E5%AE%99%E5%8E%86%E5%8F%B2%E6%B1%82%E5%92%8C" target="_blank">费因曼求和</a>来说应该是表现为紧张感0，按照事件的大小还有一定概率让我陷入Seed的状态</li><li>5：虽然结束后马上就会开始恢复堕落的日常，但还是会有几天玩得没有平时那么尽兴，嘛，但也仅此而已了</li></ul><hr
/><p>嘛，其实今天的情况是这样的：我去南极洲找企鹅面试，等面试的过程中无聊开PSP低头闷玩，面试过程中找回了上个礼拜不小心丢掉了的自信心，面试结束后感觉世界比以前要鲜艳一些</p> ]]></content:encoded> <wfw:commentRss>http://mcfog.com/p746/%e3%80%90%e7%a5%9e%e9%bc%a0%e7%bb%98%e3%80%91%e6%88%91%e7%9a%84%e2%80%9c%e7%b4%a7%e5%bc%a0%e6%84%9f%e2%80%9d%e6%9b%b2%e7%ba%bf.fog/feed</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>技术文章固然不错</title><link>http://mcfog.com/p740/%e6%8a%80%e6%9c%af%e6%96%87%e7%ab%a0%e5%9b%ba%e7%84%b6%e4%b8%8d%e9%94%99.fog</link> <comments>http://mcfog.com/p740/%e6%8a%80%e6%9c%af%e6%96%87%e7%ab%a0%e5%9b%ba%e7%84%b6%e4%b8%8d%e9%94%99.fog#comments</comments> <pubDate>Mon, 02 May 2011 17:07:55 +0000</pubDate> <dc:creator>McFog</dc:creator> <category><![CDATA[monolog]]></category> <guid
isPermaLink="false">http://mcfog.com/?p=740</guid> <description><![CDATA[<p>但还是扯谈的文章以后看起来会更有感触啊，で，McFog自言自语道</p><p>之前翻了一遍以前的扯谈文章心里还是有点淡淡的【哔—】的，以后还是多写写那种文章的罢……</p><p>话说GR里竟然有8个订阅者……有点好奇啊</p>]]></description> <content:encoded><![CDATA[<p>但还是扯谈的文章以后看起来会更有感触啊，で，McFog自言自语道</p><p>之前翻了一遍以前的扯谈文章心里还是有点淡淡的【哔—】的，以后还是多写写那种文章的罢……</p><p>话说GR里竟然有8个订阅者……有点好奇啊</p> ]]></content:encoded> <wfw:commentRss>http://mcfog.com/p740/%e6%8a%80%e6%9c%af%e6%96%87%e7%ab%a0%e5%9b%ba%e7%84%b6%e4%b8%8d%e9%94%99.fog/feed</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>[PY]复杂情况(GAE)下Django的模板搜寻顺序自定义</title><link>http://mcfog.com/p735/py%e5%a4%8d%e6%9d%82%e6%83%85%e5%86%b5gae%e4%b8%8bdjango%e7%9a%84%e6%a8%a1%e6%9d%bf%e6%90%9c%e5%af%bb%e9%a1%ba%e5%ba%8f%e8%87%aa%e5%ae%9a%e4%b9%89.fog</link> <comments>http://mcfog.com/p735/py%e5%a4%8d%e6%9d%82%e6%83%85%e5%86%b5gae%e4%b8%8bdjango%e7%9a%84%e6%a8%a1%e6%9d%bf%e6%90%9c%e5%af%bb%e9%a1%ba%e5%ba%8f%e8%87%aa%e5%ae%9a%e4%b9%89.fog#comments</comments> <pubDate>Sat, 30 Apr 2011 09:40:51 +0000</pubDate> <dc:creator>McFog</dc:creator> <category><![CDATA[WebDev]]></category> <category><![CDATA[技术]]></category> <category><![CDATA[django]]></category> <category><![CDATA[gae]]></category> <category><![CDATA[Python]]></category> <guid
isPermaLink="false">http://mcfog.com/?p=735</guid> <description><![CDATA[<p>嘛，作为下定决心学习新技术系列，正式开始折腾Django了，作为不放到网上跑会死星人放和不折腾会死星人，以及没钱买VPS穷鳖星人果断选择了在GAE上搭Django环境来玩，多亏python系和google系的众多Geek，让我有很多已有的open-source的project可以引用（后附清单）</p><p>因为引用的东西很多，所以目录管理成了很重要的一个问题，模板目录是一个比较复杂的问题，因为众多app中既有引用的app，可能需要用公用的模板去覆盖（比如openid登录），也有自己的实际项目的app，需要覆盖掉公用的模板，所以我在根目录建立了templates_override和templates_fallback来区分，然后如何设置对应的settings.py就成了问题</p><p>翻手册翻文档翻源码，需要自定义一个类来解决这个问题，下面是settings.py的片段</p> ?View Code PYTHON<pre>1 2 3 4 5 6 7 8 9 10 11 12 13 </pre><pre class="python" style="font-family:monospace;">from django.template.loaders.filesystem import Loader as fsLoader class settingsLoader&#40;fsLoader&#41;: def __init__&#40;self, dirs = None&#41;: self.dirs = dirs def load_template_source&#40;self, template_name, template_dirs=None&#41;: if not template_dirs: template_dirs = self.dirs return super&#40;settingsLoader, self&#41;.load_template_source&#40;template_name, template_dirs&#41; TEMPLATE_LOADERS = &#40; &#40;'settings.settingsLoader', &#91;os.path.join&#40;os.path.dirname&#40;__file__&#41;, &#8230; <p><a class="more-link block-button" href="http://mcfog.com/p735/py%e5%a4%8d%e6%9d%82%e6%83%85%e5%86%b5gae%e4%b8%8bdjango%e7%9a%84%e6%a8%a1%e6%9d%bf%e6%90%9c%e5%af%bb%e9%a1%ba%e5%ba%8f%e8%87%aa%e5%ae%9a%e4%b9%89.fog">继续阅读 &#187;</a></p></pre>]]></description> <content:encoded><![CDATA[<p>嘛，作为下定决心学习新技术系列，正式开始折腾Django了，作为<strong>不放到网上跑会死星人</strong>放和<strong>不折腾会死星人</strong>，以及<strong>没钱买VPS穷鳖星人</strong>果断选择了在GAE上搭Django环境来玩，多亏python系和google系的众多Geek，让我有很多已有的open-source的project可以引用（后附清单）</p><p>因为引用的东西很多，所以目录管理成了很重要的一个问题，模板目录是一个比较复杂的问题，因为众多app中既有引用的app，可能需要用公用的模板去覆盖（比如openid登录），也有自己的实际项目的app，需要覆盖掉公用的模板，所以我在根目录建立了templates_override和templates_fallback来区分，然后如何设置对应的settings.py就成了问题</p><p>翻手册翻文档翻源码，需要自定义一个类来解决这个问题，下面是settings.py的片段</p><div
class="wp_codebox_msgheader"><span
class="right"><sup><a
href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span
style="color: #99cc00">?</span></a></sup></span><span
class="left"><a
href="javascript:;" onclick="javascript:showCodeTxt('p735code6'); return false;">View Code</a> PYTHON</span><div
class="codebox_clear"></div></div><div
class="wp_codebox"><table><tr
id="p7356"><td
class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td
class="code" id="p735code6"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">template</span>.<span style="color: black;">loaders</span>.<span style="color: black;">filesystem</span> <span style="color: #ff7700;font-weight:bold;">import</span> Loader <span style="color: #ff7700;font-weight:bold;">as</span> fsLoader
<span style="color: #ff7700;font-weight:bold;">class</span> settingsLoader<span style="color: black;">&#40;</span>fsLoader<span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, dirs = <span style="color: #008000;">None</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">dirs</span> = dirs
    <span style="color: #ff7700;font-weight:bold;">def</span> load_template_source<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, template_name, template_dirs=<span style="color: #008000;">None</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> template_dirs:
            template_dirs = <span style="color: #008000;">self</span>.<span style="color: black;">dirs</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">super</span><span style="color: black;">&#40;</span>settingsLoader, <span style="color: #008000;">self</span><span style="color: black;">&#41;</span>.<span style="color: black;">load_template_source</span><span style="color: black;">&#40;</span>template_name, template_dirs<span style="color: black;">&#41;</span>
TEMPLATE_LOADERS = <span style="color: black;">&#40;</span>
    <span style="color: black;">&#40;</span><span style="color: #483d8b;">'settings.settingsLoader'</span>, <span style="color: black;">&#91;</span><span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">join</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">dirname</span><span style="color: black;">&#40;</span>__file__<span style="color: black;">&#41;</span>, <span style="color: #483d8b;">'templates_override'</span><span style="color: black;">&#41;</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>,
    <span style="color: #483d8b;">'django.template.loaders.app_directories.load_template_source'</span>,
    <span style="color: black;">&#40;</span><span style="color: #483d8b;">'settings.settingsLoader'</span>, <span style="color: black;">&#91;</span><span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">join</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">dirname</span><span style="color: black;">&#40;</span>__file__<span style="color: black;">&#41;</span>, <span style="color: #483d8b;">'templates_fallback'</span><span style="color: black;">&#41;</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>,
<span style="color: black;">&#41;</span></pre></td></tr></table></div><p>目前来看Django还是比较顺手的，就是墙内部署GAE实在蛋疼……尤其是有这么多引用的app，文件数量很大……万幸GAE部署的时候不是一个个文件上传而是打包一炮上传的
&nbsp;</p><p>附录：目前引用的project清单</p><ul><li><a
href="http://www.allbuttonspressed.com/projects/django-nonrel" target="_blank">Django-nonrel</a> (noSql Django移植版)</li><li><a
href="http://www.allbuttonspressed.com/projects/djangoappengine" target="_blank">djangoappengine</a> (上述移植版的GAE接口)</li><li><a
href="http://www.allbuttonspressed.com/projects/django-mediagenerator" target="_blank">django-mediagenerator</a>(打包CSS/JS用Django app)</li><li><a
href="http://www.google.com/url?sa=t&amp;source=web&amp;cd=1&amp;ved=0CCYQFjAA&amp;url=http%3A%2F%2Fdeveloper.yahoo.com%2Fyui%2Fcompressor%2F&amp;ei=XtC7TZG7A4GcvgP3zfjOBQ&amp;usg=AFQjCNG_vcsyGjWMSfn9XJSRFSxPM-g7NA&amp;sig2=WNbb7h8DVliqKcRcb3hV2A" target="_blank">YUI Compressor</a> (这个不用说了吧……)</li><li><a
href="https://launchpad.net/django-openid-auth" target="_blank">django-openid-auth</a> (将OpenID整合至Django原生的认证)</li><li><a
href="http://openidenabled.com/python-openid/ " target="_blank">python-openid</a> (OpenID的python支持)</li></ul> ]]></content:encoded> <wfw:commentRss>http://mcfog.com/p735/py%e5%a4%8d%e6%9d%82%e6%83%85%e5%86%b5gae%e4%b8%8bdjango%e7%9a%84%e6%a8%a1%e6%9d%bf%e6%90%9c%e5%af%bb%e9%a1%ba%e5%ba%8f%e8%87%aa%e5%ae%9a%e4%b9%89.fog/feed</wfw:commentRss> <slash:comments>0</slash:comments> </item> </channel> </rss>
