<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='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'><id>tag:blogger.com,1999:blog-7597887370716014923</id><updated>2012-02-17T01:58:19.300+08:00</updated><category term='GIS'/><category term='Media Library'/><category term='GPU'/><category term='Performance'/><category term='SQL'/><category term='雲林'/><category term='遊戲'/><category term='HDR'/><category term='桃園'/><category term='Windows'/><category term='SQLite'/><category term='Apple'/><category term='宜蘭'/><category term='Flash'/><category term='Java. Objective-C'/><category term='Sweet'/><category term='台北'/><category term='台灣'/><category term='Corel'/><category term='有趣'/><category term='物理'/><category term='Windows Programming'/><category term='哲學'/><category term='.NET 4'/><category term='五專同學'/><category term='iOS'/><category term='Metro Style Application'/><category term='MySQL'/><category term='64-bit'/><category term='演算法'/><category term='北海岸'/><category term='DLL'/><category term='Windows Runtime'/><category term='Corel digital studio'/><category term='分享'/><category term='桌遊'/><category term='ASM'/><category term='生活'/><category term='GPL'/><category term='ATL'/><category term='攝影'/><category term='動畫'/><category term='大屯火山彙'/><category term='苗栗'/><category term='中央山脈'/><category term='JavaScript'/><category term='影像處理'/><category term='考試'/><category term='菲律賓'/><category term='.NET'/><category term='南投'/><category term='西藏'/><category term='台中'/><category term='帛琉'/><category term='Windows 8'/><category term='MeeGo'/><category term='彰化'/><category term='ETW'/><category term='澎湖'/><category term='Web AP'/><category term='Structured Storage'/><category term='阿里山山脈'/><category term='C++'/><category term='Windows Phone'/><category term='經驗'/><category term='design pattern'/><category term='登山'/><category term='CPU'/><category term='雪山山脈'/><category term='趣味'/><category term='旅行'/><category term='OOAD'/><category term='回憶'/><category term='Android'/><category term='HTML5'/><category term='Windows 7'/><category term='線性代數'/><category term='User experience design'/><category term='漫畫'/><category term='debug'/><category term='浮潛'/><category term='Pixel Shader'/><category term='REST'/><category term='新竹'/><category term='軟體工程'/><category term='萬聖節'/><category term='SxS'/><category term='COM'/><category term='公司'/><category term='Google'/><category term='OpenSource'/><category term='研所同學'/><category term='windbg'/><category term='色彩學'/><category term='C#'/><category term='縮時攝影'/><category term='NGen'/><category term='變裝'/><category term='WPF'/><category term='Windows CE'/><category term='Silverlight'/><title type='text'>design studio, James S. Hsieh</title><subtitle type='html'>design studio 是一個為程式設計．登山．攝影．等主題組成的BLOG，希望能大家於線上交流彼此的心得和經驗，並且討論技術和解決在程式開發上遇到的難題！ http://design-studio.lookin.at/</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default?start-index=101&amp;max-results=100'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>187</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-3607161451304705103</id><published>2012-01-28T23:50:00.000+08:00</published><updated>2012-01-30T23:51:48.858+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='登山'/><category scheme='http://www.blogger.com/atom/ns#' term='宜蘭'/><category scheme='http://www.blogger.com/atom/ns#' term='旅行'/><category scheme='http://www.blogger.com/atom/ns#' term='雪山山脈'/><title type='text'>2012 01 28 加羅湖</title><content type='html'>&lt;div style="text-align: center;"&gt;
&lt;embed flashvars="host=picasaweb.google.com&amp;amp;hl=zh_TW&amp;amp;feat=flashalbum&amp;amp;RGB=0x000000&amp;amp;feed=https%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2FNomadLibra%2Falbumid%2F5703412613136079185%3Falt%3Drss%26kind%3Dphoto%26hl%3Dzh_TW" height="400" pluginspage="http://www.macromedia.com/go/getflashplayer" src="https://picasaweb.google.com/s/c/bin/slideshow.swf" type="application/x-shockwave-flash" width="550"&gt;&lt;/embed&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;iframe frameborder="0" height="350" marginheight="0" marginwidth="0" scrolling="no" src="http://maps.google.com.tw/maps/ms?ie=UTF8&amp;amp;hl=zh-TW&amp;amp;oe=UTF8&amp;amp;brcurrent=3,0x346869c6e5ca1629:0xabe9848310382a87,0,0x3468412ca1674fd5:0x4061145f0e1f1fc9&amp;amp;msa=0&amp;amp;msid=203146497459763676427.0004b7c0b5b4bfffac5d7&amp;amp;start=0&amp;amp;num=200&amp;amp;t=h&amp;amp;ll=24.481759,121.460552&amp;amp;spn=0.02734,0.047207&amp;amp;z=14&amp;amp;output=embed" width="550"&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;small&gt;在較大的地圖上查看&lt;a href="http://maps.google.com.tw/maps/ms?ie=UTF8&amp;amp;hl=zh-TW&amp;amp;oe=UTF8&amp;amp;brcurrent=3,0x346869c6e5ca1629:0xabe9848310382a87,0,0x3468412ca1674fd5:0x4061145f0e1f1fc9&amp;amp;msa=0&amp;amp;msid=203146497459763676427.0004b7c0b5b4bfffac5d7&amp;amp;start=0&amp;amp;num=200&amp;amp;t=h&amp;amp;ll=24.481759,121.460552&amp;amp;spn=0.02734,0.047207&amp;amp;z=14&amp;amp;source=embed" style="color: blue; text-align: left;"&gt;2012 01 28 加羅湖&lt;/a&gt;&lt;/small&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7597887370716014923-3607161451304705103?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/3607161451304705103/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=3607161451304705103&amp;isPopup=true' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/3607161451304705103'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/3607161451304705103'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2012/01/2012-01-28.html' title='2012 01 28 加羅湖'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-2014216245748436444</id><published>2011-11-09T10:57:00.000+08:00</published><updated>2011-11-25T17:06:47.977+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='COM'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Metro Style Application'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Runtime'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows 8'/><title type='text'>從 COM 到 Windows Runtime Component</title><content type='html'>Windows Runtime Component 是 COM 的一種延伸我想這是錯的, 但如果說&amp;nbsp;WinRT Component 是 COM 的一種演化, 我想這是正確的. 由於 COM 被賦予不少期待所以它很複雜, 從 binary-level interface (在 WinRT 稱 abstract binary interface), system-wide activation, automatic memory management&amp;nbsp;, reflection and Type Library (在 WinRT 為 Windows Runtime metadata), threading model (在 WinRT 稱 concurrency model) 到 out-of-process object 都是 COM 想一併解決的問題. 我猜 Windows Runtime Component 的目標與 COM 相近, 並且想簡化 COM 的複雜度.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Abstract Binary Interface&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
由於 WinRT Component 可以使用 Pure C++ 搭配 &lt;a href="http://msdn.microsoft.com/en-us/library/hh438466(v=VS.110).aspx"&gt;Windows Runtime C++ Template Library&lt;/a&gt; (WRL) 來實作, 所以&amp;nbsp;binary-level interface 跟 COM 是相同的, 換句話說就是跟 Visual C++ 的 VTable 完全同. 不過 ABI 限制了可以傳遞的 type, 所有可以傳遞的 type 必須是&amp;nbsp;Windows Runtime types. 概念上來說如果不是一個 POD type, 那就必須是一個實作 &lt;a href="http://msdn.microsoft.com/en-us/library/br205821(v=VS.85).aspx"&gt;IInspectable&lt;/a&gt;&amp;nbsp;interface 的 COM,&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/br205821(v=VS.85).aspx"&gt;IInspectable&lt;/a&gt;&amp;nbsp;是用來做為 language projecting 用的, 簡單的說&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/br205821(v=VS.85).aspx"&gt;IInspectable&lt;/a&gt;&amp;nbsp;可以傳回該 object 所有支援的 interfaces (&lt;a href="http://msdn.microsoft.com/en-us/library/br205822(v=VS.85).aspx"&gt;IInspectable::GetIids&lt;/a&gt;) 還有 object 本身的 class fully-qualified name (&lt;a href="http://msdn.microsoft.com/en-us/library/br205823(v=VS.85).aspx"&gt;IInspectable::GetRuntimeClassName&lt;/a&gt;). 有了這兩個資訊就足夠查詢&amp;nbsp;Windows Runtime metadata (*.winmd).&amp;nbsp;WRL::Details:RuntimeClass 會去實作&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/br205821(v=VS.85).aspx"&gt;IInspectable&lt;/a&gt;&amp;nbsp;這個介面.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Object Activation&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
COM Activation (COM DLL)有幾個步驟 :&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;COM DLL 可以經由呼叫&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms682162(v=vs.85).aspx"&gt;DllRegisterServer&lt;/a&gt;&amp;nbsp;來註冊 COM 到系統中&lt;/li&gt;
&lt;li&gt;根據 CLSID 從&amp;nbsp;HKEY_CLASSES_ROOT\CLSID 找出 object 對應的 binary path.&lt;/li&gt;
&lt;li&gt;載入 binary 並且呼叫&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/aa910634.aspx"&gt;DllGetClassObject &lt;/a&gt;function 來取得 Class object.&lt;/li&gt;
&lt;li&gt;呼叫&amp;nbsp;Class object 的&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms682215(v=vs.85).aspx"&gt;IClassFactory::CreateInstance&lt;/a&gt;&amp;nbsp;來 create object.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
WinRT DLL Component &amp;nbsp;則是:&lt;/div&gt;
&lt;div&gt;
&lt;ol&gt;
&lt;li&gt;註冊 WinRT DLL Component 的方式跟 COM 很不相同, &lt;strike&gt;我猜這跟 GAC 應該會很像&lt;/strike&gt;.&lt;br /&gt;&lt;i&gt;[Update&amp;nbsp;2011/11/09]&lt;br /&gt;目前了解是放在 Activation Store (registry)&lt;br /&gt;HKEY_CURRENT_USER\Software\Classes\ActivatableClasses&lt;br /&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsRuntime\ActivatableClassId&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;根據 activatable class ID&amp;nbsp;找到對應的&amp;nbsp;binary path&lt;/li&gt;
&lt;li&gt;載入 binary 並且呼叫 &lt;a href="http://msdn.microsoft.com/en-us/library/br205771(v=vs.85).aspx"&gt;DllGetActivationFactory&lt;/a&gt; function 來取得 factory.&lt;/li&gt;
&lt;li&gt;呼叫&amp;nbsp;factory&amp;nbsp;的&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/br205780(v=vs.85).aspx"&gt;IActivationFactory::ActivateInstance&lt;/a&gt;&amp;nbsp;來 create object.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
目前我看到的 WinRT Component 都必須被 package 到 Metro style app 之中也就是 local side-by-side, 不知道微軟允不允許&amp;nbsp;WinRT Component 也能做為 cross application 的 share component.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Automatic Memory Management&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
WinRT Component 採用的 automatic memory management 是與傳統 COM 一樣的 &lt;a href="http://en.wikipedia.org/wiki/Reference_counting"&gt;reference counting&lt;/a&gt;&amp;nbsp;而非 .NET Framework 的&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Garbage_collection_(computer_science)#Copying_vs._mark-and-sweep_vs._mark-and-don.27t-sweep"&gt;mark and sweep garbage collector&lt;/a&gt;, 我想這是可想而知的, 因為 C++&amp;nbsp;並沒有 runtime 的幫忙來 GC 所以必須靠每個 object 自己來管理. 由於&amp;nbsp;WinRT Component&amp;nbsp;被 JavaScript, C#, VB.NET 中被使用所以&amp;nbsp;reference cycles 這個重要的課題必須被解決, 所以微軟為&amp;nbsp;WinRT Component 引入了 &lt;a href="http://en.wikipedia.org/wiki/Weak_reference"&gt;weak reference&lt;/a&gt; 的能力, 基本上使用 WRL 實作的 component 由於繼承了 WRL::Details:RuntimeClass 所以都會實作&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/br224609(v=vs.85).aspx"&gt;IWeakReferenceSource&lt;/a&gt;. 當然這必須是設計&amp;nbsp;component&amp;nbsp;的 developer 有意識的去使用 weak reference 才能解決&amp;nbsp;reference cycles 問題. 有興趣實作的人可以去看&amp;nbsp;WRL::Detial::WeakReference 這個 class 就能夠了解這是如何辦到的. 以下描述一個&amp;nbsp;reference cycles 如何使用&amp;nbsp;weak reference 來打斷這個 cycle, 假設有 A, B 兩個 objects:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-qxcBdxfv68s/TrNT94-C0FI/AAAAAAAAcRI/4_H-28QyO8k/s1600/weakRef.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="92" src="http://1.bp.blogspot.com/-qxcBdxfv68s/TrNT94-C0FI/AAAAAAAAcRI/4_H-28QyO8k/s400/weakRef.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Reflection, Projection&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
IDL 是用來描述 COM interface 跟 class 的描述語言, 使用 C++ (非 C++/CX )實作 WinRT Component 還是必須使用 IDL 來描述 object 的 metadata, MIDL compiler 會根據 IDL 來產生 Type Library (TLB) 與 Windows Runtime metadata (winmd). 有趣的是你可以直接用 .NET Reflector 開啟&amp;nbsp;winmd 檔案. 以下是微軟 Metro style app 的 sample&amp;nbsp;&lt;a href="http://code.msdn.microsoft.com/windowsapps/DLL-server-authoring-sample-48438758"&gt;DLL server authoring sample&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-r8FetbpGysU/TrNtG75xMsI/AAAAAAAAcRU/FM8wd550D34/s1600/winmd.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="265" src="http://1.bp.blogspot.com/-r8FetbpGysU/TrNtG75xMsI/AAAAAAAAcRU/FM8wd550D34/s400/winmd.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
如果是使用 C++/CX 則它會自動產生&amp;nbsp;winmd 而不用去撰寫 IDL.&amp;nbsp;Language Projection 完全仰賴&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/br205821(v=VS.85).aspx"&gt;IInspectable&lt;/a&gt;&amp;nbsp;與&amp;nbsp;Windows Runtime metadata&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Threading model&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
根據 WRL 的 source code 上來看 reference counter 已經確保是 thread-safety, 這有別於 ATL 的設計, 由於 WinRT component 沒有 registry 或是其他 metadata 來描述 COM 的 threading model, 所以我猜測 WinRT &amp;nbsp;已經不使用 apartment 的概念來管理&amp;nbsp;WinRT component, &lt;strike&gt;換句話說, 可能所有的 thread&amp;nbsp;都是 MTA 所有的&amp;nbsp;component 都是 Free, 但是&lt;/strike&gt;&amp;nbsp;, 令我訝異的是&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/br224650(v=VS.85).aspx"&gt;RoInitialize&lt;/a&gt; 還是必須傳入, RO_INIT_SINGLETHREADED 或是&amp;nbsp;RO_INIT_MULTITHREADED, 來描述 thread 的&amp;nbsp;concurrency&amp;nbsp;model. 目前我還不知道原因.&lt;br /&gt;
&lt;br /&gt;
更讓我疑惑的是&amp;nbsp;old-style COM 該怎麼辦呢? 微軟文件上是說&amp;nbsp;old-style COM&amp;nbsp;在 Metro style app 下還是能夠有限度的被使用 (PS. 可以被使用的 COM CLSID 被記錄在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsRuntime\AllowedCOMCLSIDs), 在使用 COM 之前還是必須呼叫&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/windows/apps/ms695279(v=VS.85).aspx"&gt;CoInitializeEx&lt;/a&gt;&amp;nbsp;且傳遞&amp;nbsp;COINIT_APARTMENTTHREADED 或 COINIT_MULTITHREADED 描述 thread 的 threading model, 根據我測試的結果 C++/CX and XAML 的 UI thread (不是 main thread 喔) 是 STA 並且內建了 message loop. 但如果有兩個 STA 要存取對方所擁有的 COM 時, Workder thread 所 host 的 COM 可能就無法正常運作, 因為我不知道怎麼在一個 Worker thread 實作一個 message loop 來推動 STA 下 Apartment 或是 Both 的 COM object, 因為&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms644936(v=vs.85).aspx"&gt;GetMessage&lt;/a&gt;/&lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms644943(v=vs.85).aspx"&gt;PeekMessage&lt;/a&gt;&amp;nbsp;API 在 WinRT 已經不能用了.&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;[Update&amp;nbsp;2011/11/09]&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;看了這篇&amp;nbsp;&lt;a href="http://channel9.msdn.com/Events/BUILD/BUILD2011/PLAT-875T"&gt;Windows Runtime internals: understanding "Hello World"&lt;/a&gt;&amp;nbsp;article 我才恍然大悟, Threading model 是存在的, 只不過 WinRT 隱藏了這些細節, WinRT 有一個預設的 Win32 exe 也就是 WWAHost.exe ,它被用來 host Metro style&amp;nbsp;application.&amp;nbsp;WWAHost.exe 也就是&amp;nbsp;application&amp;nbsp;的 Server, 以我所了解, host 可以是別的 exe, 這些資訊會被記錄在HKEY_CURRENT_USER\Software\Classes\ActivatableClasses\Server\XXX\ExePath. 根據我對這篇&amp;nbsp;article 的了解,&amp;nbsp;WWAHost.exe 的第一個 thread 會是 &lt;span class="Apple-style-span" style="color: red;"&gt;MTA&lt;/span&gt;, 這個 thread 被用來做為 activation 之用. 所以 WWAHost!Host::Run 會去執行twinapi!Windows::ApplicationModel::Core::CoreApplicationFactory::RunWithBackgroundFactory 並且等待新的&amp;nbsp;activation&amp;nbsp;request. 當新的 request 進來時, 它會 fork 一個新的 &lt;span class="Apple-style-span" style="color: red;"&gt;STA &lt;/span&gt;thread 並且執行 request 的需求. 這個需求可能任何一種 Contract ex: Launch, Search, BackgroundTasks ....&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-wEwVA_ghluc/TroVy2BNufI/AAAAAAAAcR4/BuxbbyUjK_o/s1600/WinRTTM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="226" src="http://3.bp.blogspot.com/-wEwVA_ghluc/TroVy2BNufI/AAAAAAAAcR4/BuxbbyUjK_o/s400/WinRTTM.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;i&gt;[Update 2011/11/25]&lt;/i&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;i&gt;&lt;a href="http://www.microsoft.com/download/en/details.aspx?id=27411"&gt;Introduction to background tasks -&amp;nbsp;Guidelines for developers&lt;/a&gt;&amp;nbsp;對於 threading model 有特別的解釋&lt;/i&gt;&lt;/div&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;For non-JavaScript apps, the background tasks are hosted
in an in-proc DLL which is loaded in a multi-threaded apartment (MTA) within
the app. For JavaScript apps, background tasks are launched in a new
single-threaded apartment (STA) within the WWA host process. The actual
background task class can be STA or MTA. Because background tasks can run when
an app is in a Suspended or Terminated state, they need to be decoupled from
the foreground app. Loading the background task DLL in a separate apartment
enforces separation of the background task from the app while allowing the
background task to be controlled independently of the app.&lt;/span&gt;&lt;/i&gt;&lt;/blockquote&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;b&gt;Out-of-Process WinRT Component&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
依照 WRL 的 source code&amp;nbsp;的設計來看, WinRT Component 是允許&amp;nbsp;Out-of-Process 的形式, 但是我卻找不到實際的 sample, 如同上述的問題&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms644936(v=vs.85).aspx"&gt;GetMessage&lt;/a&gt;/&lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms644943(v=vs.85).aspx"&gt;PeekMessage&lt;/a&gt;&amp;nbsp;API&amp;nbsp;已經不存在了, 這樣如何實作一個&amp;nbsp;Out-of-Process COM 呢?&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;[Update&amp;nbsp;2011/11/10]&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;我猜想 WinRT 可能提供類似&amp;nbsp;DLL Surrogates 的方式來實作 DLL Server, 也就是說我們不用寫一個 exe 來 host COM 而是使用 WinRT 提供既有的 host exe. 另外, WinRT 提供 Broker.&amp;nbsp;&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
還有許多問題需要釐清.... 如果我知道答案在分享出來 :D&lt;br /&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/7597887370716014923-2014216245748436444?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/2014216245748436444/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=2014216245748436444&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/2014216245748436444'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/2014216245748436444'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2011/11/com-windows-runtime-component.html' title='從 COM 到 Windows Runtime Component'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-qxcBdxfv68s/TrNT94-C0FI/AAAAAAAAcRI/4_H-28QyO8k/s72-c/weakRef.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-6226918510125496060</id><published>2011-11-08T17:08:00.000+08:00</published><updated>2011-11-09T12:12:58.117+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='COM'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Runtime'/><title type='text'>Stack of WinRT</title><content type='html'>&lt;br /&gt;
來分享一下 WinRT 下 JavaScript 呼叫 C++ WinRT object 的 stack 你發現什麼嗎? :D&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;b&gt;. &amp;nbsp;0 &amp;nbsp;Id: f70.7f0 Suspend: 0 Teb: 7f3dd000 Unfrozen&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Start: WWAHost!mainCRTStartup (001c77a2)&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Priority: 0 &amp;nbsp;Priority class: 32 &amp;nbsp;Affinity: f&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;b&gt;ChildEBP RetAddr &amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;00eafb44 76e619f8 ntdll_77220000!ZwWaitForSingleObject+0xc&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;00eafbb0 76e61983 KERNELBASE!WaitForSingleObjectEx+0x8f&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;00eafbc4 6341b17b KERNELBASE!WaitForSingleObject+0x12&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #d5a6bd; font-size: xx-small;"&gt;00eafbec 6341b21d twinapi!Windows::ApplicationModel::Core::CoreApplicationFactory::RunWithBackgroundFactoryAndThreadingModel+0x1af&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #d5a6bd; font-size: xx-small;"&gt;00eafc04 001c92ed twinapi!Windows::ApplicationModel::Core::CoreApplicationFactory::RunWithBackgroundFactory+0x19&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #d5a6bd; font-size: xx-small;"&gt;00eafc54 001c7750 WWAHost!Host::Run+0xec&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #d5a6bd; font-size: xx-small;"&gt;00eafc70 001c78a9 WWAHost!RunHost+0x80&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #d5a6bd; font-size: xx-small;"&gt;00eafc94 74d69391 WWAHost!mainCRTStartup+0x107&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;00eafca0 772831b0 kernel32!BaseThreadInitThunk+0xe&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;00eafce0 77283183 ntdll_77220000!__RtlUserThreadStart+0x6f&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;00eafcf8 00000000 ntdll_77220000!_RtlUserThreadStart+0x1b&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;b style="font-size: x-small;"&gt;. &amp;nbsp;4 &amp;nbsp;Id: f70.c58 Suspend: 0 Teb: 7f2aa000 Unfrozen&lt;/b&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Start: SHCore!CMemStream::Stat+0x3d (7437aaed)&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Priority: 0 &amp;nbsp;Priority class: 32 &amp;nbsp;Affinity: f&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;b&gt;ChildEBP RetAddr &amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #93c47d; font-size: xx-small;"&gt;038be98c 609875b6 Microsoft_Samples_DllServerAuthoring!XXX+0x8aa5&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;span class="Apple-style-span" style="color: cyan;"&gt;038be9d0 60987f74 &lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;jscript9!Projection::ProjectionMethodInvoker::InvokeUnknown&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span" style="color: cyan;"&gt;+0x18d&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: cyan; font-size: xx-small;"&gt;038bea8c 609880a9 jscript9!Projection::InvokeMethodByThisInfo+0x44d&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: cyan; font-size: xx-small;"&gt;038beac0 608cba2f jscript9!Projection::MethodSignatureThunk+0x74&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: cyan; font-size: xx-small;"&gt;038beaf8 6098f2e7 jscript9!Js::JavascriptFunction::CallFunction+0x84&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: cyan; font-size: xx-small;"&gt;038beb20 608cba2f jscript9!Projection::ProjectionWriter::DelayedMethodAssignContinuationThunk+0x89&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: cyan; font-size: xx-small;"&gt;038beb58 6087ff39 jscript9!Js::JavascriptFunction::CallFunction+0x84&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: cyan; font-size: xx-small;"&gt;038beb74 6087fef2 jscript9!Js::InterpreterStackFrame::OP_CallI+0x43&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: cyan; font-size: xx-small;"&gt;038beba8 608dc151 jscript9!Js::InterpreterStackFrame::Process+0x687&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: cyan; font-size: xx-small;"&gt;038bec9c 04960d71 jscript9!Js::InterpreterStackFrame::InterpreterThunk+0x249&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: cyan; font-size: xx-small;"&gt;038beca8 608cba2f 0x4960d71&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: cyan; font-size: xx-small;"&gt;038bece0 608cb92f jscript9!Js::JavascriptFunction::CallFunction+0x84&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: cyan; font-size: xx-small;"&gt;038bed54 608cb81f jscript9!Js::JavascriptFunction::CallRootFunction+0x105&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: cyan; font-size: xx-small;"&gt;038bed90 608cb7a6 jscript9!ScriptSite::CallRootFunction+0x52&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: cyan; font-size: xx-small;"&gt;038bedbc 6087b6d2 jscript9!ScriptSite::Execute+0x76&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: cyan; font-size: xx-small;"&gt;038bee20 5e22dd06 jscript9!ScriptEngine::Execute+0x10f&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #c27ba0; font-size: xx-small;"&gt;038bee90 5e22dc32 mshtml!CListenerDispatch::InvokeVar+0xcb&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #c27ba0; font-size: xx-small;"&gt;038beeb0 5e059acc mshtml!CListenerDispatch::Invoke+0x3e&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #c27ba0; font-size: xx-small;"&gt;038bf07c 5dfdc38c mshtml!CEventMgr::Dispatch+0x648&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #c27ba0; font-size: xx-small;"&gt;038bf0a8 5e673887 mshtml!CEventMgr::DispatchMouseEvent+0x12f&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #c27ba0; font-size: xx-small;"&gt;038bf1f0 5e568ee3 mshtml!CEventMgr::DispatchClickEvent+0x236&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #c27ba0; font-size: xx-small;"&gt;038bf218 5e563c92 mshtml!CElement::Fire_onclick+0x51&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #c27ba0; font-size: xx-small;"&gt;038bf274 5e36330c mshtml!CElement::DoClick+0x10e&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #c27ba0; font-size: xx-small;"&gt;038bf344 5dfe786f mshtml!CDoc::PumpMessage+0x14df&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #c27ba0; font-size: xx-small;"&gt;038bf49c 5e1e7c35 mshtml!CDoc::OnMouseMessage+0x418&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #c27ba0; font-size: xx-small;"&gt;038bf644 5e2b2f16 mshtml!CDoc::OnWindowMessage+0xda3&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #c27ba0; font-size: xx-small;"&gt;038bf670 751d6bf8 mshtml!CServer::WndProc+0xf6&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #c27ba0; font-size: xx-small;"&gt;038bf69c 751d6d80 user32!InternalCallWinProc+0x23&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #c27ba0; font-size: xx-small;"&gt;038bf718 751d7e41 user32!UserCallWinProcCheckWow+0x100&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #c27ba0; font-size: xx-small;"&gt;038bf78c 751d7f32 user32!DispatchMessageWorker+0x3d4&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #c27ba0; font-size: xx-small;"&gt;038bf79c 60d933b6 user32!DispatchMessageW+0x10&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #c27ba0; font-size: xx-small;"&gt;038bf7d4 60d93466 windows_ui!Windows::UI::Core::CDispatcher::ProcessMessage+0xc7&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #c27ba0; font-size: xx-small;"&gt;038bf824 001cdfd6 windows_ui!Windows::UI::Core::CDispatcher::ProcessEvents+0x6c&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #c27ba0; font-size: xx-small;"&gt;038bf848 001cc4ac WWAHost!CoreWindowDispatcher::RunMessageLoop+0x59&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #c27ba0; font-size: xx-small;"&gt;038bf864 6341c6e6 WWAHost!WebInstance::Run+0x4a&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #c27ba0; font-size: xx-small;"&gt;038bf87c 7437abc1 twinapi!Windows::ApplicationModel::Core::CoreApplicationView::ViewProviderThreadProc+0x27&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #c27ba0; font-size: xx-small;"&gt;038bf8fc 74d69391 SHCore!CMemStream::Stat+0x111&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;038bf908 772831b0 kernel32!BaseThreadInitThunk+0xe&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;038bf948 77283183 ntdll_77220000!__RtlUserThreadStart+0x6f&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;038bf960 00000000 ntdll_77220000!_RtlUserThreadStart+0x1b&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;b&gt;. &amp;nbsp;4 &amp;nbsp;Id: 968.c0c Suspend: 0 Teb: 000007f7`8b995000 Unfrozen&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Start: SHCore!IStream_WriteStr+0xa0 (000007fc`88d099f0)&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Priority: 0 &amp;nbsp;Priority class: 32 &amp;nbsp;Affinity: f&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;b&gt;Child-SP &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RetAddr &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Call Site&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;000000d1`b7b4a7b8 000007fc`8ac5110d ntdll!ZwWaitForSingleObject+0xa&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;000000d1`b7b4a7c0 000007fc`72da393e KERNELBASE!WaitForSingleObjectEx+0x79&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;000000d1`b7b4a860 000007fc`72da38f0 clr!SafeReleaseHelper+0x14b&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;000000d1`b7b4a8a0 000007fc`72da396d clr!CLREvent::WaitEx+0x100&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;000000d1`b7b4a900 000007fc`7312db92 clr!CLREvent::WaitEx+0x6a&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;000000d1`b7b4a9a0 000007fc`7312dab0 clr!Thread::WaitSuspendEventsHelper+0xc6&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;000000d1`b7b4aa60 000007fc`7339b90b clr!Thread::WaitSuspendEvents+0x11&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;000000d1`b7b4aa90 000007fc`72de1a78 clr! ?? ::FNODOBFM::`string'+0x43279&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;000000d1`b7b4aad0 000007fc`732e78c8 clr!Thread::RareDisablePreemptiveGC+0x229&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;000000d1`b7b4ab60 000007fc`732ee814 clr!PostSendEvent_Internal+0x35&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;000000d1`b7b4ab90 000007fc`73412d07 clr!DebuggerController::DispatchPatchOrSingleStep+0x1e4&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;000000d1`b7b4ac70 000007fc`72e571e0 clr! ?? ::FNODOBFM::`string'+0xcf569&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;000000d1`b7b4acd0 000007fc`72e5713d clr!Debugger::FirstChanceNativeException+0x64&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;000000d1`b7b4ad10 000007fc`72dbd0b8 clr!StackTraceInfo::AllocateStackTrace+0xc3&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;000000d1`b7b4ad50 000007fc`72dbd03c clr!CLRVectoredExceptionHandlerPhase2+0x6d&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;000000d1`b7b4ada0 000007fc`72dbcf71 clr!CLRVectoredExceptionHandler+0x9d&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;000000d1`b7b4ae00 000007fc`8da7a7e9 clr!CLRVectoredExceptionHandlerShim+0x95&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;000000d1`b7b4ae30 000007fc`8da80aad ntdll!RtlpCallVectoredHandlers+0x105&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;000000d1`b7b4aed0 000007fc`8daca7ba ntdll!RtlDispatchException+0x6d&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;000000d1`b7b4b5d0 000007fc`13750a1f ntdll!KiUserExceptionDispatcher+0x2e&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;000000d1`b7b4bb90 000007fc`1375035b 0x7fc`13750a1f&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;000000d1`b7b4c310 000007fc`13750226 0x7fc`1375035b&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;000000d1`b7b4c400 000007fc`72fce02e 0x7fc`13750226&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;000000d1`b7b4c4a0 000007fc`72fce241 clr!zzz_AsmCodeRange_End&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;000000d1`b7b4c500 000007fc`72fce173 clr!COMToCLRWorkerBody+0x219&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;000000d1`b7b4c580 000007fc`72fce05a clr!COMToCLRWorkerBody+0x104&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;000000d1`b7b4c5e0 000007fc`72fcde4a clr!COMToCLRWorkerDebuggerWrapper+0x22&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;000000d1`b7b4c640 000007fc`72fcdfd7 clr!COMToCLRWorker+0x1ea&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;000000d1`b7b4c7f0 000007fc`737942a5 clr!zzz_AsmCodeRange_Begin+0x57&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: cyan; font-size: xx-small;"&gt;000000d1`b7b4c880 000007fc`73824527 jscript9!amd64_ProjectionCall+0x65&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: cyan; font-size: xx-small;"&gt;000000d1`b7b4c8e0 000007fc`73824f54 &lt;/span&gt;&lt;span class="Apple-style-span" style="color: red; font-size: xx-small;"&gt;&lt;b&gt;jscript9!Projection::ProjectionMethodInvoker::InvokeUnknown&lt;/b&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: cyan; font-size: xx-small;"&gt;+0x117&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: cyan; font-size: xx-small;"&gt;000000d1`b7b4c9a0 000007fc`738250fb jscript9!Projection::InvokeMethodByThisInfo+0x484&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: cyan; font-size: xx-small;"&gt;000000d1`b7b4cae0 000007fc`73748458 jscript9!Projection::MethodSignatureThunk+0xeb&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: cyan; font-size: xx-small;"&gt;000000d1`b7b4cb50 000007fc`7382d028 jscript9!amd64_CallFunction+0x82&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: cyan; font-size: xx-small;"&gt;000000d1`b7b4cbc0 000007fc`73748458 jscript9!Projection::ProjectionWriter::DelayedMethodAssignContinuationThunk+0xf8&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: cyan; font-size: xx-small;"&gt;000000d1`b7b4cc30 000007fc`73769584 jscript9!amd64_CallFunction+0x82&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: cyan; font-size: xx-small;"&gt;000000d1`b7b4cca0 000007fc`7376802d jscript9!Js::InterpreterStackFrame::OP_CallCommon+0x94&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: cyan; font-size: xx-small;"&gt;000000d1`b7b4cd20 000007fc`73783217 jscript9!Js::InterpreterStackFrame::Process+0x927&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: cyan; font-size: xx-small;"&gt;000000d1`b7b4ce70 000000d1`b8dd095b jscript9!Js::InterpreterStackFrame::InterpreterThunk+0x2ac&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: cyan; font-size: xx-small;"&gt;000000d1`b7b4d090 000007fc`73748458 0xd1`b8dd095b&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: cyan; font-size: xx-small;"&gt;000000d1`b7b4d0c0 000007fc`73769584 jscript9!amd64_CallFunction+0x82&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: cyan; font-size: xx-small;"&gt;000000d1`b7b4d110 000007fc`7376802d jscript9!Js::InterpreterStackFrame::OP_CallCommon+0x94&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: cyan; font-size: xx-small;"&gt;000000d1`b7b4d190 000007fc`73894fdc jscript9!Js::InterpreterStackFrame::Process+0x927&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: cyan; font-size: xx-small;"&gt;000000d1`b7b4d2e0 000007fc`737af33a jscript9!Js::InterpreterStackFrame::OP_TryCatch+0x7c&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: cyan; font-size: xx-small;"&gt;000000d1`b7b4d350 000007fc`73783217 jscript9!Js::InterpreterStackFrame::Process+0x29f4&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: cyan; font-size: xx-small;"&gt;000000d1`b7b4d4a0 000000d1`b8dd0963 jscript9!Js::InterpreterStackFrame::InterpreterThunk+0x2ac&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: cyan; font-size: xx-small;"&gt;000000d1`b7b4d690 000007fc`73748458 0xd1`b8dd0963&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: cyan; font-size: xx-small;"&gt;000000d1`b7b4d6c0 000007fc`73769584 jscript9!amd64_CallFunction+0x82&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: cyan; font-size: xx-small;"&gt;000000d1`b7b4d720 000007fc`7376802d jscript9!Js::InterpreterStackFrame::OP_CallCommon+0x94&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: cyan; font-size: xx-small;"&gt;000000d1`b7b4d7a0 000007fc`73783217 jscript9!Js::InterpreterStackFrame::Process+0x927&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: cyan; font-size: xx-small;"&gt;000000d1`b7b4d8f0 000000d1`b8dd096b jscript9!Js::InterpreterStackFrame::InterpreterThunk+0x2ac&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: cyan; font-size: xx-small;"&gt;000000d1`b7b4daa0 000007fc`73748458 0xd1`b8dd096b&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: cyan; font-size: xx-small;"&gt;000000d1`b7b4dad0 000007fc`73769584 jscript9!amd64_CallFunction+0x82&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: cyan; font-size: xx-small;"&gt;000000d1`b7b4db20 000007fc`7376802d jscript9!Js::InterpreterStackFrame::OP_CallCommon+0x94&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: cyan; font-size: xx-small;"&gt;000000d1`b7b4dba0 000007fc`73783217 jscript9!Js::InterpreterStackFrame::Process+0x927&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: cyan; font-size: xx-small;"&gt;000000d1`b7b4dcf0 000000d1`b8dd0973 jscript9!Js::InterpreterStackFrame::InterpreterThunk+0x2ac&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: cyan; font-size: xx-small;"&gt;000000d1`b7b4dec0 000007fc`73748458 0xd1`b8dd0973&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: cyan; font-size: xx-small;"&gt;000000d1`b7b4def0 000007fc`73769584 jscript9!amd64_CallFunction+0x82&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: cyan; font-size: xx-small;"&gt;000000d1`b7b4df50 000007fc`7376802d jscript9!Js::InterpreterStackFrame::OP_CallCommon+0x94&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: cyan; font-size: xx-small;"&gt;000000d1`b7b4dfd0 000007fc`73783217 jscript9!Js::InterpreterStackFrame::Process+0x927&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: cyan; font-size: xx-small;"&gt;000000d1`b7b4e120 000000d1`b8dd097b jscript9!Js::InterpreterStackFrame::InterpreterThunk+0x2ac&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: cyan; font-size: xx-small;"&gt;000000d1`b7b4e2f0 000007fc`73748458 0xd1`b8dd097b&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: cyan; font-size: xx-small;"&gt;000000d1`b7b4e320 000007fc`738bdd3e jscript9!amd64_CallFunction+0x82&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: cyan; font-size: xx-small;"&gt;000000d1`b7b4e370 000007fc`7380a2e5 jscript9!Js::JavascriptFunction::CallFunction+0x7e&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: cyan; font-size: xx-small;"&gt;000000d1`b7b4e3c0 000007fc`73794370 jscript9!Projection::Delegate::Invoke+0x485&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: cyan; font-size: xx-small;"&gt;000000d1`b7b4e670 000007fc`8c846a15 jscript9!IndirectMethodInvoker+0x60&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #d5a6bd; font-size: xx-small;"&gt;000000d1`b7b4e6d0 000007fc`8c84417b rpcrt4!Invoke+0x65&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #d5a6bd; font-size: xx-small;"&gt;000000d1`b7b4e720 000007fc`8c833696 rpcrt4!NdrStubCall2+0x371&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #d5a6bd; font-size: xx-small;"&gt;000000d1`b7b4ed60 000007fc`8d728ddf rpcrt4!NdrStubCall3+0xe0&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #d5a6bd; font-size: xx-small;"&gt;000000d1`b7b4edc0 000007fc`8d728d3c combase!CStdStubBuffer_Invoke+0x67&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #d5a6bd; font-size: xx-small;"&gt;000000d1`b7b4edf0 000007fc`8d643927 combase!SyncStubInvoke+0x60&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #d5a6bd; font-size: xx-small;"&gt;000000d1`b7b4ee60 000007fc`8d728bcf combase!CCtxComChnl::ContextInvoke+0x27d&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #d5a6bd; font-size: xx-small;"&gt;000000d1`b7b4f090 000007fc`8d72f5cf combase!ComInvokeWithLockAndIPID+0x695&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #d5a6bd; font-size: xx-small;"&gt;000000d1`b7b4f360 000007fc`8d696479 combase!ComInvoke+0x182&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #d5a6bd; font-size: xx-small;"&gt;000000d1`b7b4f3a0 000007fc`8d6bd29b combase!ThreadDispatch+0x29&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #d5a6bd; font-size: xx-small;"&gt;000000d1`b7b4f3d0 000007fc`8d709316 combase!CComApartment::ASTAHandleMessage+0x117&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #d5a6bd; font-size: xx-small;"&gt;000000d1`b7b4f400 000007fc`8d6bd968 combase!`Microsoft::WRL::Module&amp;lt;1,Microsoft::WRL::Details::DefaultModule&amp;lt;1&amp;gt; &amp;gt;::Create'::`2'::`dynamic atexit destructor for 'module''+0x309a&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #d5a6bd; font-size: xx-small;"&gt;000000d1`b7b4f6a0 000007fc`7fbbc70f combase!CoMsgWaitInProcessEvents+0xbc&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #d5a6bd; font-size: xx-small;"&gt;000000d1`b7b4f710 000007f7`8c35232b windows_ui!Windows::UI::Core::CDispatcher::ProcessEvents+0x77&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #d5a6bd; font-size: xx-small;"&gt;000000d1`b7b4f7c0 000007f7`8c3503af WWAHost!CoreWindowDispatcher::RunMessageLoop+0x6f&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #d5a6bd; font-size: xx-small;"&gt;000000d1`b7b4f800 000007fc`884dbc26 WWAHost!WebInstance::Run+0x4f&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #d5a6bd; font-size: xx-small;"&gt;000000d1`b7b4f840 000007fc`88d09ad1 twinapi!Windows::ApplicationModel::Core::CoreApplicationView::ViewProviderThreadProc+0x3a&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #d5a6bd; font-size: xx-small;"&gt;000000d1`b7b4f880 000007fc`8d093cdc SHCore!IStream_WriteStr+0x187&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;000000d1`b7b4f980 000007fc`8dac3c85 kernel32!BaseThreadInitThunk+0x18&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;000000d1`b7b4f9b0 00000000`00000000 ntdll!RtlUserThreadStart+0x1d&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7597887370716014923-6226918510125496060?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/6226918510125496060/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=6226918510125496060&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/6226918510125496060'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/6226918510125496060'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2011/11/winrt-javascript-c-winrt-object-stack-d.html' title='Stack of WinRT'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-2256236192732127061</id><published>2011-10-27T14:11:00.000+08:00</published><updated>2011-12-17T02:21:04.307+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Corel'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML5'/><category scheme='http://www.blogger.com/atom/ns#' term='Web AP'/><title type='text'>ChopChop 可以讓影片發揮擴大社交圈功能！</title><content type='html'>&lt;br /&gt;
&lt;a href="http://2.bp.blogspot.com/-dOfSyPahMg8/Tqj0KalKJII/AAAAAAAAcQg/DF29f6adbSs/s1600/logo.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-dOfSyPahMg8/Tqj0KalKJII/AAAAAAAAcQg/DF29f6adbSs/s1600/logo.png" /&gt;&lt;/a&gt;&lt;a href="http://chopchop.corel.com/"&gt;ChopChop&lt;/a&gt; 是免費的 Facebook 應用程式，可以讓影片發揮擴大社交圈功能！ 先搜尋 YouTube™ 影片，將影片全部組合到 ChopChop 腳本中，找出您最喜歡的片刻，然後將您完成的混搭影片分享給 FaceBook 上的朋友。 取個有趣的片名和標題說明，然後標示您的朋友，再邀請他們加入您的 ChopChop 影片作品。 ChopChop 讓您的影片樂趣無窮！&lt;br /&gt;
&lt;br /&gt;
ChopChop 是我的第一個 Web application, 他結合了影片編輯與社群互動等有趣的功能, 在這個產品中, 我負責 Video render engine, RESTful Web API 跟 Database 等規劃與設計.&lt;br /&gt;
&lt;br /&gt;
DEMO:&amp;nbsp;&lt;a href="http://chopchop.corel.com/projects/ag1zfmNob3BjaG9wYXBwcicLEgVQZ0lkeCIPZmIkNzI0MjYyNDg5JDA0DAsSB1BhY2thZ2UYAQw"&gt;美女接龍&lt;/a&gt;, &lt;a href="http://chopchop.corel.com/projects/ag1zfmNob3BjaG9wYXBwcicLEgVQZ0lkeCIPZmIkNzIyNjM4Nzk1JDAyDAsSB1BhY2thZ2UYAQw"&gt;經典台詞&lt;/a&gt;,&amp;nbsp;&lt;a href="http://chopchop.corel.com/projects/ag1zfmNob3BjaG9wYXBwcigLEgVQZ0lkeCIPZmIkNzI0MjYyNDg5JDA0DAsSB1BhY2thZ2UY6QcM"&gt;2011 06 26-28 Palau + Phoenix&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-c2WuUksljAA/Tqj14iIrq3I/AAAAAAAAcQs/iyw71mDOuOU/s1600/ChopChopSnapshot2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-c2WuUksljAA/Tqj14iIrq3I/AAAAAAAAcQs/iyw71mDOuOU/s400/ChopChopSnapshot2.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-j2kmd6PcM1Q/Tqj15yvv-rI/AAAAAAAAcQ0/k_wX38lWRSk/s1600/ChopChopSnapshot1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-j2kmd6PcM1Q/Tqj15yvv-rI/AAAAAAAAcQ0/k_wX38lWRSk/s400/ChopChopSnapshot1.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;div class="MsoNormal" style="text-align: left;"&gt;
&lt;span lang="en-US"&gt;ChopChop is a free Facebook app that makes video social! Search YouTube™ videos, assemble them together in the ChopChop storyboard, find your favorite moments and share your mash-ups with your FaceBook friends. Add funny titles and captions, then tag your friends and invite them to add to your ChopChop video production. ChopChop is video fun for all! &lt;/span&gt;&lt;span lang="en-US" style="font-size: 12pt; font-weight: bold;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal" style="text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="MsoNormal" style="text-align: left;"&gt;
&lt;span lang="en-US"&gt;ChopChop is based on Google App Engine. I am responsible for the design&amp;nbsp;and development of&amp;nbsp; Web API, noSQL database (BigTable), server cache line, browser extensions (IE, Chrome, Firefox, and Safari), Facebook integration, and small part of front-end UI.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7597887370716014923-2256236192732127061?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/2256236192732127061/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=2256236192732127061&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/2256236192732127061'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/2256236192732127061'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2011/10/chopchop.html' title='ChopChop 可以讓影片發揮擴大社交圈功能！'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-dOfSyPahMg8/Tqj0KalKJII/AAAAAAAAcQg/DF29f6adbSs/s72-c/logo.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-6844257402331305232</id><published>2011-10-09T11:43:00.001+08:00</published><updated>2011-10-09T11:46:43.517+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='登山'/><category scheme='http://www.blogger.com/atom/ns#' term='西藏'/><category scheme='http://www.blogger.com/atom/ns#' term='旅行'/><title type='text'>2011 09 18 西藏轉山軌跡</title><content type='html'>&lt;div style="text-align: center;"&gt;
&lt;iframe frameborder="0" height="500" marginheight="0" marginwidth="0" scrolling="no" src="http://maps.google.com.tw/maps/ms?hl=zh-TW&amp;amp;vpsrc=6&amp;amp;ctz=-480&amp;amp;brcurrent=3,0x0:0x0,0&amp;amp;ie=UTF8&amp;amp;msa=0&amp;amp;msid=203146497459763676427.0004aed5529f0954f3b80&amp;amp;t=f&amp;amp;ll=31.060875,81.334938&amp;amp;spn=0.147048,0.188484&amp;amp;z=12&amp;amp;ecpose=31.17259141,81.33198642,8214.09,178.703,79.626,0.003&amp;amp;output=embed" width="550"&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;small&gt;在較大的地圖上查看&lt;a href="http://maps.google.com.tw/maps/ms?hl=zh-TW&amp;amp;vpsrc=6&amp;amp;ctz=-480&amp;amp;brcurrent=3,0x0:0x0,0&amp;amp;ie=UTF8&amp;amp;msa=0&amp;amp;msid=203146497459763676427.0004aed5529f0954f3b80&amp;amp;t=f&amp;amp;ll=31.060875,81.334938&amp;amp;spn=0.147048,0.188484&amp;amp;z=12&amp;amp;ecpose=31.17259141,81.33198642,8214.09,178.703,79.626,0.003&amp;amp;source=embed" style="color: blue; text-align: left;"&gt;西藏轉山軌跡&lt;/a&gt;&lt;/small&gt;


&lt;iframe width="550" height="500" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="http://maps.google.com.tw/maps/ms?msid=203146497459763676427.0004aed5529f0954f3b80&amp;amp;msa=0&amp;amp;ie=UTF8&amp;amp;t=h&amp;amp;vpsrc=6&amp;amp;brcurrent=3,0x0:0x0,1&amp;amp;ll=31.042051,81.323547&amp;amp;spn=0.147078,0.188484&amp;amp;z=12&amp;amp;output=embed"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;small&gt;在較大的地圖上查看&lt;a href="http://maps.google.com.tw/maps/ms?msid=203146497459763676427.0004aed5529f0954f3b80&amp;amp;msa=0&amp;amp;ie=UTF8&amp;amp;t=h&amp;amp;vpsrc=6&amp;amp;brcurrent=3,0x0:0x0,1&amp;amp;ll=31.042051,81.323547&amp;amp;spn=0.147078,0.188484&amp;amp;z=12&amp;amp;source=embed" style="color:#0000FF;text-align:left"&gt;西藏轉山軌跡&lt;/a&gt;&lt;/small&gt;
&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7597887370716014923-6844257402331305232?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/6844257402331305232/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=6844257402331305232&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/6844257402331305232'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/6844257402331305232'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2011/10/2011-09-18.html' title='2011 09 18 西藏轉山軌跡'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><thr:total>0</thr:total><georss:featurename>岡仁波齊峯</georss:featurename><georss:point>31.049404461655996 81.4141845703125</georss:point><georss:box>30.940555961655996 81.2562560703125 31.158252961655997 81.5721130703125</georss:box></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-9010296204473042054</id><published>2011-08-24T00:37:00.001+08:00</published><updated>2011-08-24T00:38:02.582+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HTML5'/><category scheme='http://www.blogger.com/atom/ns#' term='Web AP'/><title type='text'>Word Cloud</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-NkqWqfXoeek/TlPW4q0RYfI/AAAAAAAAbLo/cGTvNQ-iO9A/s1600/wordcloud.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="220" src="http://1.bp.blogspot.com/-NkqWqfXoeek/TlPW4q0RYfI/AAAAAAAAbLo/cGTvNQ-iO9A/s400/wordcloud.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://timc.idv.tw/wordcloud/zh/"&gt;http://timc.idv.tw/wordcloud/zh/&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/7597887370716014923-9010296204473042054?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/9010296204473042054/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=9010296204473042054&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/9010296204473042054'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/9010296204473042054'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2011/08/word-cloud.html' title='Word Cloud'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-NkqWqfXoeek/TlPW4q0RYfI/AAAAAAAAbLo/cGTvNQ-iO9A/s72-c/wordcloud.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-1586166424215608300</id><published>2011-07-06T01:21:00.002+08:00</published><updated>2011-07-06T01:21:42.360+08:00</updated><title type='text'>2011 06 25-28 Palau</title><content type='html'>&lt;div style="text-align: center;"&gt;
&lt;embed flashvars="host=picasaweb.google.com&amp;amp;hl=zh_TW&amp;amp;feat=flashalbum&amp;amp;RGB=0x000000&amp;amp;feed=https%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2FNomadLibra%2Falbumid%2F5624187349033625137%3Falt%3Drss%26kind%3Dphoto%26hl%3Dzh_TW" height="400" pluginspage="http://www.macromedia.com/go/getflashplayer" src="https://picasaweb.google.com/s/c/bin/slideshow.swf" type="application/x-shockwave-flash" width="550"&gt;&lt;/embed&gt;&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7597887370716014923-1586166424215608300?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/1586166424215608300/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=1586166424215608300&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/1586166424215608300'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/1586166424215608300'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2011/07/2011-06-25-28-palau.html' title='2011 06 25-28 Palau'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-1138406490503162157</id><published>2011-06-13T08:58:00.004+08:00</published><updated>2011-06-13T09:55:23.659+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='登山'/><category scheme='http://www.blogger.com/atom/ns#' term='攝影'/><category scheme='http://www.blogger.com/atom/ns#' term='旅行'/><category scheme='http://www.blogger.com/atom/ns#' term='南投'/><category scheme='http://www.blogger.com/atom/ns#' term='阿里山山脈'/><title type='text'>2011 06 11-12 水漾森林</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;br /&gt;
&lt;embed type="application/x-shockwave-flash" src="https://picasaweb.google.com/s/c/bin/slideshow.swf" width="500" height="400" flashvars="host=picasaweb.google.com&amp;hl=zh_TW&amp;feat=flashalbum&amp;RGB=0x000000&amp;feed=https%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2FNomadLibra%2Falbumid%2F5617508848449063425%3Falt%3Drss%26kind%3Dphoto%26hl%3Dzh_TW" pluginspage="http://www.macromedia.com/go/getflashplayer"&gt;&lt;/embed&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;iframe frameborder="0" height="500" marginheight="0" marginwidth="0" scrolling="no" src="http://maps.google.com.tw/maps/ms?ie=UTF8&amp;amp;hl=zh-TW&amp;amp;brcurrent=3,0x346ed3c0e598457b:0x688625a9fb101a47,0,0x3468d6aa1a5d49ad:0x1348fba95f17f6da&amp;amp;t=h&amp;amp;msa=0&amp;amp;msid=203146497459763676427.0004a58d5850ad145bd00&amp;amp;ll=23.612284,120.796394&amp;amp;spn=0.078645,0.094242&amp;amp;z=13&amp;amp;output=embed" width="550"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;small&gt;在較大的地圖上查看&lt;a href="http://maps.google.com.tw/maps/ms?ie=UTF8&amp;amp;hl=zh-TW&amp;amp;brcurrent=3,0x346ed3c0e598457b:0x688625a9fb101a47,0,0x3468d6aa1a5d49ad:0x1348fba95f17f6da&amp;amp;t=h&amp;amp;msa=0&amp;amp;msid=203146497459763676427.0004a58d5850ad145bd00&amp;amp;ll=23.612284,120.796394&amp;amp;spn=0.078645,0.094242&amp;amp;z=13&amp;amp;source=embed" style="color: blue; text-align: left;"&gt;2011 06 12 水漾森林&lt;/a&gt;&lt;/small&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7597887370716014923-1138406490503162157?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/1138406490503162157/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=1138406490503162157&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/1138406490503162157'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/1138406490503162157'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2011/06/2011-06-11-12.html' title='2011 06 11-12 水漾森林'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-5890329867245426694</id><published>2011-05-24T00:19:00.001+08:00</published><updated>2011-05-24T00:19:31.731+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='生活'/><category scheme='http://www.blogger.com/atom/ns#' term='旅行'/><category scheme='http://www.blogger.com/atom/ns#' term='雪山山脈'/><title type='text'>2011 05 21 松羅湖國家步道</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;embed flashvars="host=picasaweb.google.com&amp;amp;hl=zh_TW&amp;amp;feat=flashalbum&amp;amp;RGB=0x000000&amp;amp;feed=https%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2FNomadLibra%2Falbumid%2F5609362281298162177%3Falt%3Drss%26kind%3Dphoto%26hl%3Dzh_TW" height="267" pluginspage="http://www.macromedia.com/go/getflashplayer" src="https://picasaweb.google.com/s/c/bin/slideshow.swf" type="application/x-shockwave-flash" width="400"&gt;&lt;/embed&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7597887370716014923-5890329867245426694?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/5890329867245426694/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=5890329867245426694&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/5890329867245426694'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/5890329867245426694'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2011/05/2011-05-21.html' title='2011 05 21 松羅湖國家步道'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-5464230271389183890</id><published>2011-04-14T09:54:00.000+08:00</published><updated>2011-04-14T09:54:51.611+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='生活'/><category scheme='http://www.blogger.com/atom/ns#' term='攝影'/><title type='text'>James and Stella -  *</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;iframe allowfullscreen="" frameborder="0" height="349" src="http://www.youtube.com/embed/ngQU12rhtmE" title="YouTube video player" width="560"&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;iframe allowfullscreen="" frameborder="0" height="349" src="http://www.youtube.com/embed/tmnuJeT5WrU" title="YouTube video player" width="560"&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;iframe allowfullscreen="" frameborder="0" height="349" src="http://www.youtube.com/embed/uVpXtVyHcWc" title="YouTube video player" width="560"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7597887370716014923-5464230271389183890?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/5464230271389183890/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=5464230271389183890&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/5464230271389183890'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/5464230271389183890'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2011/04/james-and-stella.html' title='James and Stella -  *'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/ngQU12rhtmE/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-8192613918548640789</id><published>2011-04-07T22:28:00.000+08:00</published><updated>2011-04-07T22:28:10.382+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='生活'/><title type='text'>Wedding Invitation</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh6.googleusercontent.com/_YTmQMAUfDN8/TZ3FrhVaaVI/AAAAAAAAaoA/OaSL6KI7u3U/s720/Wedding%20Invitation.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="371" src="https://lh6.googleusercontent.com/_YTmQMAUfDN8/TZ3FrhVaaVI/AAAAAAAAaoA/OaSL6KI7u3U/s400/Wedding%20Invitation.jpg" width="400" /&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/7597887370716014923-8192613918548640789?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/8192613918548640789/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=8192613918548640789&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/8192613918548640789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/8192613918548640789'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2011/04/wedding-invitation.html' title='Wedding Invitation'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh6.googleusercontent.com/_YTmQMAUfDN8/TZ3FrhVaaVI/AAAAAAAAaoA/OaSL6KI7u3U/s72-c/Wedding%20Invitation.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-5857651843694430694</id><published>2011-04-01T02:15:00.000+08:00</published><updated>2011-12-18T11:30:42.517+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML5'/><category scheme='http://www.blogger.com/atom/ns#' term='Web AP'/><title type='text'>HTML5 Video Render Engine</title><content type='html'>&lt;br /&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="en-US"&gt;It is a web video render engine based on HTML5 and WebGL. It provides timeline, tracks, clips, programmable animation (key-frame) and video effects for user to compose a video project. A video project of output is a small JSON file (10~50KB). Engine can compose videos, images, audios and texts according to the project file in time. The media source can be a YouTube online video, an image in Picasa web, or a MP3 audio in the cloud etc. &lt;/span&gt;&lt;span lang="en-US"&gt;JVRE provides APIs to edit a video project based on online resources such as YouTube videos or Picasa images. The editing result likes a “playlist”, and it can be persisted to a JSON structure. JVRE can accord to the editing result to composite visual and auditory output on-the-fly with online resources.&amp;nbsp;&lt;/span&gt;&lt;span style="font-size: 11pt;"&gt;I designed and implemented whole engine.&lt;/span&gt;&lt;br /&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="zh-TW" style="font-family: 新細明體;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="en-US"&gt;Give a general application, a web-site provides video editing service based on JVRE. User can create/edit/playback his video project in the browser. The project file (a JSON structure) can be store in server for next playback or editing.&lt;/span&gt;&lt;span lang="en-US"&gt; &lt;/span&gt;&lt;span lang="en-US"&gt;JVRE also supports primary features such as:&lt;/span&gt;&lt;span lang="en-US"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;span lang="en-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal" style="margin-left: 14.1307pt; mso-level-font-family: 新細明體; mso-level-indent: 14.1307pt; mso-level-number-format: bullet; mso-level-size: 9.0pt; mso-level-text: ․; mso-pagination: none; text-indent: -14.1307pt;"&gt;
&lt;span style="direction: ltr; font-family: 新細明體; font-size: 9pt; unicode-bidi: embed;"&gt;․&lt;/span&gt;&lt;span style="width: 4.25pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span lang="en-US"&gt;Support multiple layers called tracks in timeline&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal" style="margin-left: 14.1307pt; mso-level-font-family: 新細明體; mso-level-indent: 14.1307pt; mso-level-number-format: bullet; mso-level-size: 9.0pt; mso-level-text: ․; mso-pagination: none; text-indent: -14.1307pt;"&gt;
&lt;span style="direction: ltr; font-family: 新細明體; font-size: 9pt; unicode-bidi: embed;"&gt;․&lt;/span&gt;&lt;span style="width: 4.25pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span lang="en-US"&gt;Track has multiple clips; it supports Transformation and Effects.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal" style="margin-left: 14.1307pt; mso-level-font-family: 新細明體; mso-level-indent: 14.1307pt; mso-level-number-format: bullet; mso-level-size: 9.0pt; mso-level-text: ․; mso-pagination: none; text-indent: -14.1307pt;"&gt;
&lt;span style="direction: ltr; font-family: 新細明體; font-size: 9pt; unicode-bidi: embed;"&gt;․&lt;/span&gt;&lt;span style="width: 4.25pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span lang="en-US"&gt;Clip is a playlist of one resource; it supports Transformation and Effect.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal" style="margin-left: 14.1307pt; mso-level-font-family: 新細明體; mso-level-indent: 14.1307pt; mso-level-number-format: bullet; mso-level-size: 9.0pt; mso-level-text: ․; mso-pagination: none; text-indent: -14.1307pt;"&gt;
&lt;span style="direction: ltr; font-family: 新細明體; font-size: 9pt; unicode-bidi: embed;"&gt;․&lt;/span&gt;&lt;span style="width: 4.25pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span lang="en-US"&gt;Source of clip can be a video, an audio, an image, or a title.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal" style="margin-left: 14.1307pt; mso-level-font-family: 新細明體; mso-level-indent: 14.1307pt; mso-level-number-format: bullet; mso-level-size: 9.0pt; mso-level-text: ․; mso-pagination: none; text-indent: -14.1307pt;"&gt;
&lt;span style="direction: ltr; font-family: 新細明體; font-size: 9pt; unicode-bidi: embed;"&gt;․&lt;/span&gt;&lt;span style="width: 4.25pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span lang="en-US"&gt;Title supports multiple texts and Transformation.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal" style="margin-left: 14.1307pt; mso-level-font-family: 新細明體; mso-level-indent: 14.1307pt; mso-level-number-format: bullet; mso-level-size: 9.0pt; mso-level-text: ․; mso-pagination: none; text-indent: -14.1307pt;"&gt;
&lt;span style="direction: ltr; font-family: 新細明體; font-size: 9pt; unicode-bidi: embed;"&gt;․&lt;/span&gt;&lt;span style="width: 4.25pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span lang="en-US"&gt;Effects implement with WebGL pixel-shader, it can leverage GPU.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal" style="margin-left: 14.1307pt; mso-level-font-family: 新細明體; mso-level-indent: 14.1307pt; mso-level-number-format: bullet; mso-level-size: 9.0pt; mso-level-text: ․; mso-pagination: none; text-indent: -14.1307pt;"&gt;
&lt;span style="direction: ltr; font-family: 新細明體; font-size: 9pt; unicode-bidi: embed;"&gt;․&lt;/span&gt;&lt;span style="width: 4.25pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span lang="en-US"&gt;User can edit timeline without pause playback.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal" style="margin-left: 14.1307pt; mso-level-font-family: 新細明體; mso-level-indent: 14.1307pt; mso-level-number-format: bullet; mso-level-size: 9.0pt; mso-level-text: ․; mso-pagination: none; text-indent: -14.1307pt;"&gt;
&lt;span style="direction: ltr; font-family: 新細明體; font-size: 9pt; unicode-bidi: embed;"&gt;․&lt;/span&gt;&lt;span style="width: 4.25pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span lang="en-US"&gt;Engine supports delay-loading and pre-loading videos to reduce latency.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal" style="margin-left: 14.1307pt; mso-level-font-family: 新細明體; mso-level-indent: 14.1307pt; mso-level-number-format: bullet; mso-level-size: 9.0pt; mso-level-text: ․; mso-pagination: none; text-indent: -14.1307pt;"&gt;
&lt;span style="direction: ltr; font-family: 新細明體; font-size: 9pt; unicode-bidi: embed;"&gt;․&lt;/span&gt;&lt;span style="width: 4.25pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span lang="en-US"&gt;Implement key-frame architecture for animations; the interpolation algorithm of key-frame is extendable.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal" style="margin-left: 14.1307pt; mso-level-font-family: 新細明體; mso-level-indent: 14.1307pt; mso-level-number-format: bullet; mso-level-size: 9.0pt; mso-level-text: ․; mso-pagination: none; text-indent: -14.1307pt;"&gt;
&lt;span style="direction: ltr; font-family: 新細明體; font-size: 9pt; unicode-bidi: embed;"&gt;․&lt;/span&gt;&lt;span style="width: 4.25pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span lang="en-US"&gt;Support hit-test for editing and interaction.&lt;/span&gt;&lt;span lang="en-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-QvQapN7QkbY/TuuK_MM3G7I/AAAAAAAAdMg/fwDo4PFz0rA/s1600/Picture1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="210" src="http://2.bp.blogspot.com/-QvQapN7QkbY/TuuK_MM3G7I/AAAAAAAAdMg/fwDo4PFz0rA/s400/Picture1.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span lang="zh-TW" style="font-family: 新細明體;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span lang="zh-TW" style="font-family: 新細明體;"&gt;&lt;span style="height: 236px; left: 314px; position: absolute; top: 557px; width: 313px; z-index: 1;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7597887370716014923-5857651843694430694?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/5857651843694430694/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=5857651843694430694&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/5857651843694430694'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/5857651843694430694'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2011/04/html5-video-render-engine.html' title='HTML5 Video Render Engine'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-QvQapN7QkbY/TuuK_MM3G7I/AAAAAAAAdMg/fwDo4PFz0rA/s72-c/Picture1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-7941966524566246160</id><published>2011-03-04T01:37:00.002+08:00</published><updated>2011-03-04T01:37:41.424+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Corel'/><category scheme='http://www.blogger.com/atom/ns#' term='旅行'/><category scheme='http://www.blogger.com/atom/ns#' term='北海岸'/><title type='text'>2011 03 02 Springfield Team 出團北海岸</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;embed type="application/x-shockwave-flash" src="https://picasaweb.google.com/s/c/bin/slideshow.swf" width="550" height="400" flashvars="host=picasaweb.google.com&amp;hl=zh_TW&amp;feat=flashalbum&amp;RGB=0x000000&amp;feed=https%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2FNomadLibra%2Falbumid%2F5579907450250285169%3Falt%3Drss%26kind%3Dphoto%26hl%3Dzh_TW" pluginspage="http://www.macromedia.com/go/getflashplayer"&gt;&lt;/embed&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/7597887370716014923-7941966524566246160?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/7941966524566246160/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=7941966524566246160&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/7941966524566246160'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/7941966524566246160'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2011/03/2011-03-02-springfield-team.html' title='2011 03 02 Springfield Team 出團北海岸'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-7953363206539113660</id><published>2011-02-27T13:39:00.000+08:00</published><updated>2011-02-27T13:39:25.438+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='生活'/><category scheme='http://www.blogger.com/atom/ns#' term='攝影'/><title type='text'>2011 02 26 死黨文子結婚</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;br /&gt;
&lt;a href="https://picasaweb.google.com/lh/photo/R4eGrUF6jJaWrRXMOFXR4Q?feat=embedwebsite"&gt;&lt;img height="267" src="https://lh6.googleusercontent.com/_YTmQMAUfDN8/TWnf6pNCaTI/AAAAAAAAaK8/wqHLXxX_ZCA/s400/2011-02-26-17.49.34.jpg" width="400" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;embed flashvars="host=picasaweb.google.com&amp;amp;hl=zh_TW&amp;amp;feat=flashalbum&amp;amp;RGB=0x000000&amp;amp;feed=https%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2FNomadLibra%2Falbumid%2F5578235606016785025%3Falt%3Drss%26kind%3Dphoto%26hl%3Dzh_TW" height="400" pluginspage="http://www.macromedia.com/go/getflashplayer" src="https://picasaweb.google.com/s/c/bin/slideshow.swf" type="application/x-shockwave-flash" width="550"&gt;&lt;/embed&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7597887370716014923-7953363206539113660?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/7953363206539113660/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=7953363206539113660&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/7953363206539113660'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/7953363206539113660'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2011/02/2011-02-26.html' title='2011 02 26 死黨文子結婚'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh6.googleusercontent.com/_YTmQMAUfDN8/TWnf6pNCaTI/AAAAAAAAaK8/wqHLXxX_ZCA/s72-c/2011-02-26-17.49.34.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-3093656456088419210</id><published>2011-02-25T04:28:00.003+08:00</published><updated>2011-02-25T18:25:41.340+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='design pattern'/><title type='text'>常常搞混的 Structural pattern</title><content type='html'>以下幾種 structural pattern 常常被搞混或是誤用, 甚至都以 wrapper 這個濫用的名詞來稱呼, 大多都有 aggregation 的結構關係, 其 aggregate&amp;nbsp;的目有所不同, 以下以 caller, aggregator&amp;nbsp;與 target 來說明三者的關係&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;&lt;b&gt;Shortcut (一種退化的 Facade)&lt;br /&gt;
&lt;/b&gt;aggregator&amp;nbsp;的目的是讓 caller 對 target 使用起來更簡單方便, aggregator&amp;nbsp;大多隱藏了很多操作 target 的細節, 所以具有減化複雜度的效果, 但是其目的是以 caller&amp;nbsp;方便為出發點, 所以&amp;nbsp;aggregator&amp;nbsp;多半參雜過多 caller 的假設與邏輯而變的不容易 maintain, 另外, 如果 target 提供一個新的功能,&amp;nbsp;aggregator&amp;nbsp;往往都要對映的 "開一條路" 讓 caller 使用, 如果開路的代價比方便的好處高, 這就成為一種不良的設計 middle men. &lt;br /&gt;
&lt;br /&gt;
C# 有一種 syntax sugar&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/bb383977.aspx"&gt;Extension methods&lt;/a&gt;&amp;nbsp;可以避面這種&amp;nbsp;middle men 的問題, 又可以將操作的邏輯封裝在 caller 的部分而非獨立建立出一組&amp;nbsp;aggregator&amp;nbsp;class.&lt;br /&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;Proxy&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;aggregator&amp;nbsp;的目的&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;表留一種間接性來達到某種&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&amp;nbsp;target 沒有的功能, 這些功能跟 target 本身的功能通常比較沒有直接相關 (但不是絕對), 多半&amp;nbsp;aggregator&amp;nbsp;都是&amp;nbsp;transparent, 並且它會針對特定 target 來設計, 所以擁有相同的介面, 以下是一些比較著名的應用:&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;virtual proxy: 用於&amp;nbsp;lazy&amp;nbsp;instantiation (visualization) 或是 lazy processing&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;remote proxy: 用於 IPC/RPC&amp;nbsp;proxy/stub, 用以支援遠端呼叫&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;access proxy: 用於 access control. COM 的 Apartment proxy/stub 就是一種 access proxy 用來保證對 target 的操作是 thread-safety&lt;br /&gt;
&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Decorator&lt;/b&gt;&lt;br /&gt;
當 target 有自己的繼承體系並且該體系擁有 composite pattern 結構, aggregator&amp;nbsp;的目的是擴充一些 target 沒有的功能 (sub-classing), 並且&amp;nbsp;aggregator 必須保有 composite 的特性, 所以它必須繼承&amp;nbsp;component 而非 target.&amp;nbsp;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;多半&amp;nbsp;aggregator&amp;nbsp;都是&amp;nbsp;transparent.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
proxy 跟 decorator 的目的嚴格說都是&amp;nbsp;sub-classing, 但是成本有時候比繼承還要高, 而 strategy 是一種比較低成本的做法, 但是這樣的機制必須被設計在 target 當中.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.boost.org/doc/libs/1_37_0/libs/iostreams/doc/index.html"&gt;Boost Iostreams library&lt;/a&gt;&amp;nbsp;與 &lt;a href="http://msdn.microsoft.com/en-us/library/ee719654(v=vs.85).aspx"&gt;WIC&lt;/a&gt;&amp;nbsp;提供 filter 的設計思維都是種&amp;nbsp;decorator pattern&lt;br /&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Adapter&lt;/b&gt;&lt;br /&gt;
aggregator&amp;nbsp;的目的是讓 target 加入到 caller 的繼承體系中, 用以解決不相容的問題, 這種做法非常直覺, 因為幾乎沒有人想要在 caller 的繼承體系中實做一個跟 target 功能近似的 class. 而多半會 reuse target.&lt;br /&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Bridge&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;aggregator&amp;nbsp;的目的是隔離抽象性&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;與&lt;/span&gt;&lt;/b&gt;實做, 所以&amp;nbsp;aggregator&amp;nbsp;必須定義一般性的抽像操作, 而 target 來實做細節, 一般來說&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;aggregator 會有自己的繼承體系, 並且 target 會有其對應關係, 不過, 繼承體系不一定是必要的 COM 的 interface 就是種例子,&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;繼承體系帶來的限制往往是弊多於利, 不如根據 aspect 分離 interface 是比較恰當的做法.&lt;br /&gt;
&lt;br /&gt;
如果一個&amp;nbsp;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;aggregator&amp;nbsp;會有多個可能的 target 實做對應, 那&lt;/span&gt;&lt;/b&gt;根據 target 來定義&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;aggregator (interface) 是種錯誤的&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;思維&lt;/span&gt;&lt;/b&gt;, 這違反 DIP 與 bridge 的目的, 保持抽像性與分離不相依的面像才是介面設計的原則.&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7597887370716014923-3093656456088419210?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/3093656456088419210/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=3093656456088419210&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/3093656456088419210'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/3093656456088419210'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2011/02/structural-pattern.html' title='常常搞混的 Structural pattern'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-6509893931875705151</id><published>2011-02-22T10:14:00.000+08:00</published><updated>2011-02-22T10:14:47.905+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='趣味'/><category scheme='http://www.blogger.com/atom/ns#' term='Web AP'/><title type='text'>Justin.tv</title><content type='html'>&lt;object type="application/x-shockwave-flash" height="400" width="550" id="jtv_flash" data="http://zh-tw.justin.tv/widgets/live_embed_player.swf?start_volume=0.0&amp;backgroundImage=&amp;channel=nomadlibra&amp;hostname=zh-tw.justin.tv&amp;auto_play=false" bgcolor="#000000"&gt; &lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;param name="allowNetworking" value="all" /&gt;&lt;param name="movie" value="http://zh-tw.justin.tv/widgets/live_embed_player.swf" /&gt;&lt;param name="flashvars" value="start_volume=0.0&amp;backgroundImage=&amp;channel=nomadlibra&amp;hostname=zh-tw.justin.tv&amp;auto_play=false" /&gt;&lt;/object&gt;&lt;br /&gt; &lt;a href="http://www.justin.tv/nomadlibra#r=-rid-&amp;s=em" style="padding:2px 0px 4px; display:block; width:353; font-weight:normal; font-size:10px; text-decoration:underline; text-align:center;"&gt;Watch live video from nomadlibra on Justin.tv&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7597887370716014923-6509893931875705151?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/6509893931875705151/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=6509893931875705151&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/6509893931875705151'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/6509893931875705151'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2011/02/justintv.html' title='Justin.tv'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-4394493160948572046</id><published>2011-02-09T14:36:00.000+08:00</published><updated>2011-02-09T14:36:31.225+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='COM'/><title type='text'>.NET and COM interop</title><content type='html'>以下是收集有用的連結&lt;br /&gt;
&lt;a href="http://msdn.microsoft.com/en-us/library/aa720748(v=vs.71).aspx"&gt;Type Library to Assembly Conversion Summary&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7597887370716014923-4394493160948572046?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/4394493160948572046/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=4394493160948572046&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/4394493160948572046'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/4394493160948572046'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2011/02/net-and-com-interop.html' title='.NET and COM interop'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-3478366076145342537</id><published>2011-02-08T10:43:00.001+08:00</published><updated>2011-02-08T10:43:23.475+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='登山'/><category scheme='http://www.blogger.com/atom/ns#' term='生活'/><category scheme='http://www.blogger.com/atom/ns#' term='大屯火山彙'/><category scheme='http://www.blogger.com/atom/ns#' term='五專同學'/><title type='text'>2011 02 06 五專同學聚會</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;embed type="application/x-shockwave-flash" src="https://picasaweb.google.com/s/c/bin/slideshow.swf" width="550" height="400" flashvars="host=picasaweb.google.com&amp;hl=zh_TW&amp;feat=flashalbum&amp;RGB=0x000000&amp;feed=https%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2FNomadLibra%2Falbumid%2F5570579709391236737%3Falt%3Drss%26kind%3Dphoto%26hl%3Dzh_TW" pluginspage="http://www.macromedia.com/go/getflashplayer"&gt;&lt;/embed&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/7597887370716014923-3478366076145342537?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/3478366076145342537/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=3478366076145342537&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/3478366076145342537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/3478366076145342537'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2011/02/2011-02-06.html' title='2011 02 06 五專同學聚會'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-43965801873265797</id><published>2011-01-29T23:33:00.002+08:00</published><updated>2011-01-29T23:33:47.737+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='生活'/><category scheme='http://www.blogger.com/atom/ns#' term='Corel'/><title type='text'>Corel 尾牙 + Team building</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;embed flashvars="host=picasaweb.google.com&amp;amp;hl=zh_TW&amp;amp;feat=flashalbum&amp;amp;RGB=0x000000&amp;amp;feed=http%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2FNomadLibra%2Falbumid%2F5567441890757080609%3Falt%3Drss%26kind%3Dphoto%26hl%3Dzh_TW" height="400" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://picasaweb.google.com/s/c/bin/slideshow.swf" type="application/x-shockwave-flash" width="550"&gt;&lt;/embed&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;embed flashvars="host=picasaweb.google.com&amp;amp;hl=zh_TW&amp;amp;feat=flashalbum&amp;amp;RGB=0x000000&amp;amp;feed=http%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2FNomadLibra%2Falbumid%2F5567432257824589793%3Falt%3Drss%26kind%3Dphoto%26hl%3Dzh_TW" height="400" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://picasaweb.google.com/s/c/bin/slideshow.swf" type="application/x-shockwave-flash" width="550"&gt;&lt;/embed&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7597887370716014923-43965801873265797?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/43965801873265797/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=43965801873265797&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/43965801873265797'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/43965801873265797'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2011/01/corel-team-building.html' title='Corel 尾牙 + Team building'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-2835698372226935342</id><published>2011-01-28T11:59:00.000+08:00</published><updated>2011-01-28T11:59:34.255+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='生活'/><category scheme='http://www.blogger.com/atom/ns#' term='Corel'/><title type='text'>新年快樂 - 我們公司可愛的卡片</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_YTmQMAUfDN8/TUI-8vLuPsI/AAAAAAAAZew/iZs7tUkJXjc/s1600/Corel+New+Year+Greeting+eCard+.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://4.bp.blogspot.com/_YTmQMAUfDN8/TUI-8vLuPsI/AAAAAAAAZew/iZs7tUkJXjc/s640/Corel+New+Year+Greeting+eCard+.png" width="451" /&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/7597887370716014923-2835698372226935342?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/2835698372226935342/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=2835698372226935342&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/2835698372226935342'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/2835698372226935342'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2011/01/blog-post.html' title='新年快樂 - 我們公司可愛的卡片'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_YTmQMAUfDN8/TUI-8vLuPsI/AAAAAAAAZew/iZs7tUkJXjc/s72-c/Corel+New+Year+Greeting+eCard+.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-7086541816872966214</id><published>2011-01-26T16:36:00.001+08:00</published><updated>2011-01-26T16:36:39.611+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='debug'/><category scheme='http://www.blogger.com/atom/ns#' term='windbg'/><title type='text'>Crash Dump - 要怎麼看 call stack (1)</title><content type='html'>&lt;b&gt;Q:&lt;/b&gt;&amp;nbsp;Call stack 怎麼看?&lt;br /&gt;
&lt;b&gt;A:&amp;nbsp;&lt;/b&gt;使用高階語言通常不需要了解 call stack 的 layout, 但是當你需要分析 dump 的時候, 這就是必備的知識. x86 CPU 使用兩個 register 來記錄&amp;nbsp;stack&amp;nbsp;frame&amp;nbsp;的位置:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;SP/ESP/RSP: &lt;b&gt;Stack pointer&lt;/b&gt; for top address of the stack.&lt;/li&gt;
&lt;li&gt;BP/EBP/RBP: &lt;b&gt;Stack base pointer/Frame pointer&lt;/b&gt;&amp;nbsp;for holding the address of the current stack frame.&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;一個&amp;nbsp;stack frame 包含了 引數, context 與返回位址, 區域變數. 當程式呼叫某個函數時, 首先會根據 calling convention 來推入引數, 然後 call 指令會將相關的 context 跟返回位址推入堆疊, 然後修正&amp;nbsp;stack frame:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;push ebp &amp;lt;= 將&amp;nbsp;&lt;b&gt;Frame pointer &lt;/b&gt;推入堆疊&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;mov ebp, esp&amp;nbsp;&amp;lt;= 把&amp;nbsp;&lt;b&gt;Frame pointer &lt;/b&gt;修正到新的位指, 該位址就是舊的 EBP 所在處&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;sub esp, X &amp;lt;= 把&amp;nbsp;&lt;b&gt;Stack pointer &lt;/b&gt;移動來配置區域變數 X 表示區域變數需要的大小 (x86 堆疊是往小的位址成長)&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;所以, 我們可以預料, EBP 永遠指到上一個 EBP&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_YTmQMAUfDN8/TT_OjcbX04I/AAAAAAAAZdk/S2cRuKoC5Mo/s1600/stack+frame.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="256" src="http://4.bp.blogspot.com/_YTmQMAUfDN8/TT_OjcbX04I/AAAAAAAAZdk/S2cRuKoC5Mo/s320/stack+frame.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;以下是個簡單的例子來分析一下 stack, 堆疊的頭尾在 003e0000~003dfec4, 最後一個 EBP 是 003dff2c, 所以, 以下紅色的部分是 previous frame pointer, 藍色則是 return address. 這兩個部分是不需要知道每個 function 的 calling convention 就能夠推出來的部分. 我們能夠看出這個 stack 是從 ntdll!_RtlUserThreadStart 成長的, 所以這樣判對的 call stack 是正確的!&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;利用 r 拿到當下的 context&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;0:000&amp;gt; r&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;&lt;div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;eax=00000000 ebx=00000000 ecx=00000000 edx=00000000 esi=003dff08 edi=00000000&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;eip=7722fd21 esp=&lt;b&gt;003dfec4 &lt;/b&gt;ebp=&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;003dff2c&lt;/b&gt;&lt;/span&gt; iopl=0 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; nv up ei pl nz na po nc&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;cs=0023 &amp;nbsp;ss=002b &amp;nbsp;ds=002b &amp;nbsp;es=002b &amp;nbsp;fs=0053 &amp;nbsp;gs=002b &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; efl=00000202&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;ntdll!NtDelayExecution+0x15:&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;7722fd21 83c404 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;add &amp;nbsp; &amp;nbsp; esp,4&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;利用 !teb 來知道 stack 的 base 跟 limit&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;0:000&amp;gt; !teb&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;TEB at 7efdd&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;000&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;ExceptionList: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;003dff1c&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;StackBase: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;b&gt;003e0000&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;StackLimit: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 003d6000&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;SubSystemTib: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 00000000&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;FiberData: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;00001e00&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;ArbitraryUserPointer: 00000000&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Self: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 7efdd000&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;EnvironmentPointer: &amp;nbsp; 00000000&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;ClientId: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 00000a18 . 00000734&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;RpcHandle: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;00000000&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Tls Storage: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;7efdd02c&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;PEB Address: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;7efde000&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;LastErrorValue: &amp;nbsp; &amp;nbsp; &amp;nbsp; 0&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;LastStatusValue: &amp;nbsp; &amp;nbsp; &amp;nbsp;c0000135&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Count Owned Locks: &amp;nbsp; &amp;nbsp;0&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;HardErrorMode: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;我們用 dds 或是 kd 指令把 raw stack 展開&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;0:000&amp;gt; dds 003dfec4 003e0000&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;b&gt;003dfec4 &amp;nbsp;&lt;/b&gt;7722fd21 ntdll!NtDelayExecution+0x15&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dfec8 &amp;nbsp;76902c50 KERNELBASE!SleepEx+0x65&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dfecc &amp;nbsp;00000000&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dfed0 &amp;nbsp;003dff08&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dfed4 &amp;nbsp;d78faaa0&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dfed8 &amp;nbsp;00dd337c CrashLab!__native_startup_lock&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dfedc &amp;nbsp;00000001&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dfee0 &amp;nbsp;00000000&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dfee4 &amp;nbsp;00000024&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dfee8 &amp;nbsp;00000001&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dfeec &amp;nbsp;00000000&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dfef0 &amp;nbsp;00000000&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dfef4 &amp;nbsp;00000000&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dfef8 &amp;nbsp;00000000&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dfefc &amp;nbsp;00000000&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dff00 &amp;nbsp;00000000&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dff04 &amp;nbsp;00000000&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dff08 &amp;nbsp;c4653600&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dff0c &amp;nbsp;ffffffff&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dff10 &amp;nbsp;00000000&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dff14 &amp;nbsp;003dfed4&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dff18 &amp;nbsp;00000000&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dff1c &amp;nbsp;003dff78&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dff20 &amp;nbsp;76925eb0 KERNELBASE!_except_handler4&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dff24 &amp;nbsp;a1202d44&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dff28 &amp;nbsp;00000000&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;003dff2c &amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;003dff3c &amp;lt;= Stack frame&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dff30 &amp;nbsp;&lt;span class="Apple-style-span" style="color: blue;"&gt;76903520 KERNELBASE!Sleep+0xf &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dff34 &amp;nbsp;000186a0&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dff38 &amp;nbsp;00000000&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;003dff3c &amp;nbsp;003dff88&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&amp;lt;= Stack frame&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;003dff40 &amp;nbsp;00dd100b CrashLab!wmain+0xb [d:\codes\crashlab\crashlab\crashlab.cpp @ 49]&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dff44 &amp;nbsp;000186a0&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dff48 &amp;nbsp;00dd117d CrashLab!__tmainCRTStartup+0x10f [f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c @ 583]&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dff4c &amp;nbsp;00000001&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dff50 &amp;nbsp;00571280&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dff54 &amp;nbsp;005760a8&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dff58 &amp;nbsp;d780fa7f&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dff5c &amp;nbsp;00000000&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dff60 &amp;nbsp;00000000&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dff64 &amp;nbsp;7efde000&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dff68 &amp;nbsp;00000000&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dff6c &amp;nbsp;00000000&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dff70 &amp;nbsp;003dff58&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dff74 &amp;nbsp;cc5814dc&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dff78 &amp;nbsp;003dffc4&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dff7c &amp;nbsp;00dd16f5 CrashLab!_except_handler4&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dff80 &amp;nbsp;d760246f&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dff84 &amp;nbsp;00000000&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;003dff88 &amp;nbsp;003dff94&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&amp;lt;= Stack frame&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;003dff8c &amp;nbsp;75453677 kernel32!BaseThreadInitThunk+0xe&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dff90 &amp;nbsp;7efde000&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;003dff94 &amp;nbsp;003dffd4&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&amp;lt;= Stack frame&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;003dff98 &amp;nbsp;77249d42 ntdll!__RtlUserThreadStart+0x70&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dff9c &amp;nbsp;7efde000&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dffa0 &amp;nbsp;6f7de307&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dffa4 &amp;nbsp;00000000&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dffa8 &amp;nbsp;00000000&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dffac &amp;nbsp;7efde000&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dffb0 &amp;nbsp;00000000&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dffb4 &amp;nbsp;00000000&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dffb8 &amp;nbsp;00000000&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dffbc &amp;nbsp;003dffa0&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dffc0 &amp;nbsp;00000000&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dffc4 &amp;nbsp;ffffffff&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dffc8 &amp;nbsp;772803dd ntdll!_except_handler4&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dffcc &amp;nbsp;1863df43&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dffd0 &amp;nbsp;00000000&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;003dffd4 &amp;nbsp;003dffec&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&amp;lt;= Stack frame&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;003dffd8 &amp;nbsp;77249d15 ntdll!_RtlUserThreadStart+0x1b&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dffdc &amp;nbsp;00dd12c5 CrashLab!wmainCRTStartup [f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c @ 393]&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dffe0 &amp;nbsp;7efde000&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dffe4 &amp;nbsp;00000000&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dffe8 &amp;nbsp;00000000&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;003dffec &amp;nbsp;00000000&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&amp;lt;= Stack frame&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;003dfff0 &amp;nbsp;00000000&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dfff4 &amp;nbsp;00dd12c5 CrashLab!wmainCRTStartup [f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c @ 393]&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dfff8 &amp;nbsp;7efde000&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003dfffc &amp;nbsp;00000000&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;003e0000 &amp;nbsp;????????&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;有時候 context 中的 EBP 可能會是錯的, 那就得猜一下了! 如果幸運的找到正確的 EBP, 你將可以使用 "k L = BasePtr [FrameCount]" 來忽略錯誤的 stack frame. 假如正確的 EBP 是 003dff44.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;0:000&amp;gt;&amp;nbsp;k L = &lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;003dff44 &lt;/b&gt;&lt;/span&gt;10&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;ChildEBP RetAddr &amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;s&gt;003dfec4 76902c50 ntdll!NtDelayExecution+0x15&lt;/s&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;003dff44 &lt;/b&gt;&lt;/span&gt;00dd117d KERNELBASE!SleepEx+0x65&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;003dff88 75453677 CrashLab!__tmainCRTStartup+0x10f&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;003dff94 77249d42 kernel32!BaseThreadInitThunk+0xe&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;003dffd4 77249d15 ntdll!__RtlUserThreadStart+0x70&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;003dffec 00000000 ntdll!_RtlUserThreadStart+0x1b&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;有幾種最佳化的技巧會讓這個技巧無法使用:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Inline:&amp;nbsp;&amp;nbsp;inline 利用行內拓展來避免函數呼叫, 所以根本沒有 stack frame.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Frame pointer omission (FPO): 當 FPO enable 時, function 的呼叫可能就不在維護 EBP (有些條件還是需要), 在這種狀況, 你就沒有 EBP 可以參考. 詳細可以參考這篇文章&amp;nbsp;&lt;a href="http://www.nynaeve.net/?p=91"&gt;http://www.nynaeve.net/?p=91&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7597887370716014923-7086541816872966214?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/7086541816872966214/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=7086541816872966214&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/7086541816872966214'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/7086541816872966214'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2011/01/crash-dump-call-stack.html' title='Crash Dump - 要怎麼看 call stack (1)'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_YTmQMAUfDN8/TT_OjcbX04I/AAAAAAAAZdk/S2cRuKoC5Mo/s72-c/stack+frame.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-2154130558709104763</id><published>2011-01-26T01:15:00.004+08:00</published><updated>2011-01-26T13:45:39.610+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='debug'/><category scheme='http://www.blogger.com/atom/ns#' term='windbg'/><title type='text'>Crash Dump - 為什麼 dump 的 call stack 總是會不準或很詭異</title><content type='html'>&lt;b&gt;Q:&amp;nbsp;為什麼 dump 的 call stack 總是會不準或怪怪的&lt;/b&gt;&lt;br /&gt;
&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;A:&amp;nbsp;有些比較成熟的軟體會在自己 crash 的時候產生 dump, 大部分有兩種做法&amp;nbsp;&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;程式內部使用&amp;nbsp;SetUnhandledExceptionFilter API 來設定 UnhandledExceptionFilter callback, 然後, 在 callback 利用&amp;nbsp;MiniDumpWriteDump API 來產生 dump&lt;/li&gt;
&lt;li&gt;一樣使用&amp;nbsp;UnhandledExceptionFilter callback, 不過由外部的程式來產生 dump&lt;/li&gt;
&lt;/ol&gt;&lt;div&gt;在第一種做法中, 似乎是因為呼叫 &amp;nbsp;MiniDumpWriteDump 的關係, 直接使用 windbg 指令 k 來傾印 call stack 會得到錯誤的結果. 例如下面這種不合理又附帶警告的 stack&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;0:000&amp;gt;&amp;nbsp;k&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;0035eb9c 768fb75d ntdll!ZwGetContextThread+0x12&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;0035ebac 754513f8 KERNELBASE!CloseHandle+0x2d&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;0035ebbc 7483d4c3 kernel32!CloseHandleImplementation+0x3f&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;0035ed54 00210000 dbghelp!Win32LiveSystemProvider::OpenMapping+0x1fe&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: red; font-size: x-small;"&gt;WARNING: Frame IP not in any known module. Following frames may be wrong.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;0035ed6c be05061e 0x210000&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;0035ed70 02810048 0xbe05061e&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;0035ed74 0035f3d8 0x2810048&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;0035ed78 00000000 0x35f3d8&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;最簡單的方法就是將 dump 中 ExceptionStream 的 exception context record 讀出來解釋 crash stack, 最直接就是使用 .ecxr 指令, 很明顯&amp;nbsp;KERNELBASE!RaiseException&lt;span class="Apple-style-span" style="color: red;"&gt; &lt;/span&gt;比較是合理的呼叫函數, 所以下面的 call stack 是正確的:&lt;br /&gt;
&lt;div&gt;&lt;div&gt;&lt;br /&gt;
&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;0:000&amp;gt; .ecxr&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;eax=0035fa0c ebx=00000001 ecx=00000003 edx=00000000 esi=ffffffff edi=00d23864&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;eip=768fb727 esp=0035fa0c ebp=0035fa5c iopl=0 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; nv up ei pl nz na pe nc&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;cs=0023 &amp;nbsp;ss=002b &amp;nbsp;ds=002b &amp;nbsp;es=002b &amp;nbsp;fs=0053 &amp;nbsp;gs=002b &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; efl=00000206&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;KERNELBASE!RaiseException+0x58:&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;768fb727 c9 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;leave&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;0:000&amp;gt;&amp;nbsp;k&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&lt;span class="Apple-style-span" style="color: red;"&gt;*** Stack trace for last set context - .thread/.cxr resets it&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;ChildEBP RetAddr &amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;0035fa5c 749edbf9 KERNELBASE!RaiseException+0x58&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;0035fa94 00ca88cd msvcr90!_CxxThrowException+0x48&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: red; font-size: x-small;"&gt;0035fbc8 00ca05e6 Sample!wWinMain+0xad &lt;b&gt;&amp;lt;= crash 所在之處&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;0035fc5c 75453677&amp;nbsp;Sample!__tmainCRTStartup+0x150&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;0035fc68 77249d42 kernel32!BaseThreadInitThunk+0xe&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;0035fca8 77249d15 ntdll!__RtlUserThreadStart+0x70&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;0035fcc0 00000000 ntdll!_RtlUserThreadStart+0x1b&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;如果沒有&amp;nbsp;ExceptionStream 那就比較麻煩了&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;0:000&amp;gt; .ecxr&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;Minidump doesn't have an exception context&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;Unable to get exception context, HRESULT 0x80004002&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
我們必須仰賴&amp;nbsp;Thread Environment Block 中的&amp;nbsp;StackBase 跟&amp;nbsp;StackLimit, 不過有時候&amp;nbsp;!teb 指令無法讀到正確的 TEB, 似乎 ThreadListStream 所記載的資料就是錯的, 後來我發現是因為建立 dump 的時候少了&amp;nbsp;MiniDumpWithProcessThreadData, 所以會有以下的狀況&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;0:000&amp;gt;&amp;nbsp;!teb&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;TEB at fffdd000&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: red; font-size: x-small;"&gt;&lt;b&gt;error InitTypeRead( TEB )...&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;Stream 0: type ThreadListStream (3), size 00000034, RVA 0000026C&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;1 threads&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;RVA 00000270, ID 8FC, &lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;Teb:FFFFFFFFFFFDD000&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&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/7597887370716014923-2154130558709104763?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/2154130558709104763/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=2154130558709104763&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/2154130558709104763'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/2154130558709104763'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2011/01/crash-dump-dump_26.html' title='Crash Dump - 為什麼 dump 的 call stack 總是會不準或很詭異'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-2324668562786560749</id><published>2011-01-26T01:00:00.007+08:00</published><updated>2011-01-26T18:10:13.831+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='debug'/><category scheme='http://www.blogger.com/atom/ns#' term='windbg'/><title type='text'>Crash Dump - 如何知道 dump 包含了哪些資訊?</title><content type='html'>&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;Q:&amp;nbsp;如何知道 dump 包含了哪些資訊?&amp;nbsp;&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;A:&amp;nbsp;指令&amp;nbsp;.dumpdebug&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;----- User Mini Dump Analysis&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;MINIDUMP_HEADER:&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;Version &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; A793 (61B0)&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;NumberOfStreams 11&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;Flags &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;1050&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0010&amp;nbsp;&lt;b&gt;MiniDumpScanMemory&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0040&amp;nbsp;&lt;b&gt;MiniDumpWithIndirectlyReferencedMemory&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;1000&amp;nbsp;&lt;b&gt;MiniDumpWithThreadInfo&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;可以由 Flags 得知 dump 包含了哪些資訊, 對應的&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/ms680519(v=vs.85).aspx"&gt;MINIDUMP_TYPE&lt;/a&gt;&amp;nbsp;請參閱 MSDN 或是&amp;nbsp;&lt;a href="http://www.debuginfo.com/articles/effminidumps.html"&gt;http://www.debuginfo.com/articles/effminidumps.html&lt;/a&gt;.&amp;nbsp;如果是自己軟體產生的 dump 甚至可以包含&amp;nbsp;ExceptionStream&amp;nbsp;! 只要在建立 dump 的 API&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/ms680360(v=vs.85).aspx"&gt;MiniDumpWriteDump&lt;/a&gt;&amp;nbsp;傳入 MINIDUMP_EXCEPTION_INFORMATION, 如果是利用&amp;nbsp;UnhandledExceptionFilter 來產生 dump 就非常的方便, 因為&amp;nbsp;UnhandledExceptionFilter 就提供了&amp;nbsp;EXCEPTION_POINTERS 來傳給 MINIDUMP_EXCEPTION_INFORMATION, 程式碼如下:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;MINIDUMP_EXCEPTION_INFORMATION mdei = {0};&lt;br /&gt;
mdei.ThreadId &amp;nbsp;= GetCurrentThreadId();&lt;br /&gt;
mdei.ExceptionPointers &amp;nbsp;= &lt;span class="Apple-style-span" style="color: red;"&gt;pExceptionPointers&lt;/span&gt;;&lt;br /&gt;
mdei.ClientPointers &amp;nbsp; &amp;nbsp; = FALSE;&lt;br /&gt;
&lt;br /&gt;
MINIDUMP_CALLBACK_INFORMATION mci = {0};&lt;br /&gt;
mci.CallbackRoutine &amp;nbsp; &amp;nbsp; = (MINIDUMP_CALLBACK_ROUTINE)MiniDumpCallback;&lt;br /&gt;
mci.CallbackParam &amp;nbsp; &amp;nbsp; &amp;nbsp; = 0;&lt;br /&gt;
&lt;br /&gt;
MINIDUMP_TYPE mdt = (MINIDUMP_TYPE) MiniDumpWithIndirectlyReferencedMemory | MiniDumpScanMemory | MiniDumpWithThreadInfo | MiniDumpWithHandleData);&lt;br /&gt;
&lt;br /&gt;
BOOL bRet = MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),&amp;nbsp;hFile, mdt, mdei, 0, &amp;amp;mci );&amp;nbsp;&lt;/blockquote&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;Stream 3: type &lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;b&gt;ExceptionStream&lt;/b&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt; (6), size 000000A8, RVA 000001A0&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;ThreadID&amp;nbsp;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;2720&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;ExceptionCode&amp;nbsp;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;C0000005&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;ExceptionRecord 0&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;ExceptionAddress&amp;nbsp;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;6a6b0998&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;Context record RVA 1010, size 2cc&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;個人建議的 mini dump 至少資訊包含&amp;nbsp;MiniDumpWithIndirectlyReferencedMemory,&amp;nbsp;MiniDumpScanMemory, MiniDumpWithThreadInfo, MiniDumpWithHandleData, MiniDumpWithProcessThreadData, MiniDumpWithUnloadedModules&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7597887370716014923-2324668562786560749?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/2324668562786560749/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=2324668562786560749&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/2324668562786560749'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/2324668562786560749'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2011/01/crash-dump-dump.html' title='Crash Dump - 如何知道 dump 包含了哪些資訊?'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-8800242348861080156</id><published>2011-01-25T10:57:00.015+08:00</published><updated>2011-01-26T13:28:54.405+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='debug'/><category scheme='http://www.blogger.com/atom/ns#' term='windbg'/><title type='text'>什麼是 C++ Runtime Error!</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: left;"&gt;每當程式跳出了以下的視窗, 大概除了按下 "確定" 什麼也不能做,&amp;nbsp;什麼是 "C++ Runtime Error!" ?&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_YTmQMAUfDN8/TT2cjxY67LI/AAAAAAAAZbw/fP03Ux2Zo8U/s1600/c%252B%252B+runtime+error.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="193" src="http://1.bp.blogspot.com/_YTmQMAUfDN8/TT2cjxY67LI/AAAAAAAAZbw/fP03Ux2Zo8U/s320/c%252B%252B+runtime+error.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
簡單說, &lt;span class="Apple-style-span" style="background-color: #674ea7;"&gt;大部分的&lt;/span&gt; C++ Runtime Error 是眾多例外狀況 exception 的其中一種, 這裡指的 exception 是指 Windows 的 Structured Exception Handling (SEH).&amp;nbsp;C++ Runtime Error 這種 exception 可以說是由 C++ Runtime 發出的 SEH exception, 當沒有人處理這個 exception 時, SEH 的 KiUserExceptionDispatcher 就會呼叫&amp;nbsp;C++ Runtime 內部預設的 unhandled exception filter &amp;nbsp;__CxxUnhandledExceptionFilter 來 "處理" 這個例外, 處理的方法則十分的簡單, 就是顯是以上的畫面然後結束程式! 所以我們可以看到堆疊大概會是以下的形式, 藍色部分是產生 exception 的部分, 黑色是 SEH, 而紅色則是 C++ Runtime 的部分. 這個例子是一個用 VC2008 建立的 MFC 程式, 所以會顯示 Message Box, 如果是 console 的程式, 輸出 message 到 stderror 串流.&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: red; font-size: x-small;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: red; font-size: x-small;"&gt;以上略&lt;/span&gt;&lt;br /&gt;
&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: red; font-size: x-small;"&gt;MSVCR90!__crtMessageBoxA+0x160&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: red; font-size: x-small;"&gt;MSVCR90!_NMSG_WRITE+0x16f&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: red; font-size: x-small;"&gt;MSVCR90!abort+0x26&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: red; font-size: x-small;"&gt;MSVCR90!terminate+0x33&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: red; font-size: x-small;"&gt;&lt;b&gt;CrashLab2!__CxxUnhandledExceptionFilter+0x3c&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;KERNEL32!UnhandledExceptionFilter+0x127&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;ntdll_77360000!__RtlUserThreadStart+0x62&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;ntdll_77360000!_EH4_CallFilterFunc+0x12&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;ntdll_77360000!_except_handler4+0x8e&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;ntdll_77360000!ExecuteHandler2+0x26&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;ntdll_77360000!ExecuteHandler+0x24&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;ntdll_77360000!KiUserExceptionDispatcher+0xf&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;KERNELBASE!RaiseException+0x58&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: blue; font-size: x-small;"&gt;MSVCR90!_CxxThrowException+0x48&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: blue; font-size: x-small;"&gt;CrashLab2!CCrashLab2App::CCrashLab2App+0x9c&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: blue; font-size: x-small;"&gt;以下略&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: blue; font-size: x-small;"&gt;&lt;/span&gt;你可以用 WinDbg 把 exception record 印出來, 關鍵在於&amp;nbsp;__CxxUnhandledExceptionFilter 這個函數, 因為每個&amp;nbsp;unhandled exception filter 都有 &lt;a href="http://msdn.microsoft.com/en-us/library/ms679331(v=vs.85).aspx"&gt;EXCEPTION_POINTERS&lt;/a&gt;&amp;nbsp;引數, &amp;nbsp;該結構包含了 EXCEPTION_RECORD 跟 CONTEXT. 你可以看到相當多的資訊, 包含了 exception 物件的指標跟型別, 所以這個例子只是很簡單的丟出一個 int 並且 "int" 的值是 "1", 有趣的是只要是 MSVC 丟出來的 exception, 他的&amp;nbsp;ExceptionCode 都會是 0xe06d7363, 直翻成 Ascii code 就剛好是 ".msc" 順帶一提, 如果是 .NET Runtime 的 exception 則&amp;nbsp;ExceptionCode 剛好是 0xe0434f4d ".COM".&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;0:000&amp;gt;&amp;nbsp;&amp;nbsp;.exr 001af4f0&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;ExceptionAddress: 0000000076a1b727 (KERNELBASE!RaiseException+0x0000000000000058)&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp; ExceptionCode: &lt;b&gt;e06d7363&lt;/b&gt; (C++ EH exception)&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;ExceptionFlags: 00000001&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;NumberParameters: 3&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp; Parameter[0]: 0000000019930520&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp; Parameter[1]: 00000000001af8c8&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp; Parameter[2]: 0000000001093dc0&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;pExceptionObject: &lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;00000000001af8c8&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;_s_ThrowInfo &amp;nbsp; &amp;nbsp;: 0000000001093dc0&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;Type &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;: &lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;int&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;0:000&amp;gt;&amp;nbsp;&amp;nbsp;dt &lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;int&lt;/b&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;00000000001af8c8&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;1&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;s style="background-color: purple;"&gt;因為這個 exception 已經被 "處理" 所以如果你用&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/ms680634(v=vs.85).aspx"&gt;SetUnhandledExceptionFilter&lt;/a&gt;&amp;nbsp;API 將無法攔到這個 exception.&lt;/s&gt;&lt;s style="background-color: purple;"&gt;&amp;nbsp;&lt;/s&gt;&amp;nbsp;我判斷是錯誤的, 正確的說&amp;nbsp;&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/ms680634(v=vs.85).aspx"&gt;SetUnhandledExceptionFilter&lt;/a&gt;&amp;nbsp;API 可以攔到部分的 C++ Runtime Error, 只要這個 error 是建立在 SEH Exception 之上. 但某些錯誤 (Pure virtual function call) 則必須註冊&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/xdkz3x12(v=vs.71).aspx"&gt;signal&lt;/a&gt;&amp;nbsp;來攔截, 因為他不會產生 exception 卻會直接&amp;nbsp;terminate process. 當然你也可以用 signal 來攔截 C++ Runtime 產生的 SEH exception. 大多數的 Windows programmer 對&amp;nbsp;signal 都不是非常的熟悉, 也許是因為&amp;nbsp;signal 是 UNIX 的產物,&amp;nbsp;signal 是 ANSI C 定義的一種 callback 方式, 專門接收特殊的信號以便傳遞給 program, 舉個例子 CTRL+C 可以關閉命令列程式就是用這種方式來傳遞&amp;nbsp;SIGINT.&lt;br /&gt;
&lt;s style="background-color: #ffe599;"&gt;&lt;/s&gt;&lt;br /&gt;
&lt;br /&gt;
以下就是個簡單的例子, 程式將會在&amp;nbsp;&lt;b style="color: red;"&gt;__CxxUnhandledExceptionFilter &lt;/b&gt;執行 terminate.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_YTmQMAUfDN8/TT5AVlwSfqI/AAAAAAAAZdA/8QeZMT832f0/s1600/signal.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="336" src="http://4.bp.blogspot.com/_YTmQMAUfDN8/TT5AVlwSfqI/AAAAAAAAZdA/8QeZMT832f0/s400/signal.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
以下是呼叫 "terminate" &amp;nbsp;callback function 的堆疊&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #6aa84f; font-size: x-small;"&gt;&lt;b&gt;CrashLab2!terminate&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;span class="Apple-style-span" style="color: #6aa84f;"&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;msvcr90d.dll!raise&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: red; font-size: x-small;"&gt;msvcr90d.dll!abort&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: red; font-size: x-small;"&gt;msvcr90d.dll!terminate&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: red; font-size: x-small;"&gt;&lt;b&gt;CrashLab2.exe!__CxxUnhandledExceptionFilter&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;KERNEL32!UnhandledExceptionFilter+0x127&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;ntdll_77360000!__RtlUserThreadStart+0x62&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;ntdll_77360000!_EH4_CallFilterFunc+0x12&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;ntdll_77360000!_except_handler4+0x8e&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;ntdll_77360000!ExecuteHandler2+0x26&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;ntdll_77360000!ExecuteHandler+0x24&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;ntdll_77360000!KiUserExceptionDispatcher+0xf&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;KERNELBASE!RaiseException+0x58&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: blue; font-size: x-small;"&gt;MSVCR90!_CxxThrowException+0x48&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: blue; font-size: x-small;"&gt;CrashLab2!CCrashLab2App::CCrashLab2App+0x9c&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: blue; font-size: x-small;"&gt;以下略&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: blue; font-size: x-small;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;有哪些狀況會產生 C++ Runtime Error 呢? 我所知道的有以下條件&lt;br /&gt;
&lt;div&gt;&lt;ol&gt;&lt;li&gt;未處理的 C++ exception&lt;br /&gt;
a.&amp;nbsp;產生 exception 而外部又沒有 try-catch&lt;br /&gt;
b. 在 catch statement 中又產生 exception 而外部又沒有 try-catch&lt;/li&gt;
&lt;li&gt;無法處理的 exception&lt;br /&gt;
a. printf, scanf 引數匹配錯誤&lt;br /&gt;
b. Pure virtual function call&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;&lt;div&gt;以下是個&amp;nbsp;Pure virtual function call 的例子, 當你建構 class B 就會發生.&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_YTmQMAUfDN8/TT4_-QN70KI/AAAAAAAAZc8/Vbr2V2CRP4Y/s1600/Pure+virtual+function+call.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/_YTmQMAUfDN8/TT4_-QN70KI/AAAAAAAAZc8/Vbr2V2CRP4Y/s320/Pure+virtual+function+call.png" width="242" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
其他例子的詳細描述可以參考&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/6f8k7ad1(v=VS.71).aspx"&gt;C Run-Time Errors R6002 through R6025&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/7597887370716014923-8800242348861080156?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/8800242348861080156/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=8800242348861080156&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/8800242348861080156'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/8800242348861080156'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2011/01/c-runtime-error.html' title='什麼是 C++ Runtime Error!'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_YTmQMAUfDN8/TT2cjxY67LI/AAAAAAAAZbw/fP03Ux2Zo8U/s72-c/c%252B%252B+runtime+error.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-6452659817415460366</id><published>2011-01-23T23:00:00.002+08:00</published><updated>2011-06-13T09:28:42.760+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='登山'/><category scheme='http://www.blogger.com/atom/ns#' term='攝影'/><category scheme='http://www.blogger.com/atom/ns#' term='宜蘭'/><category scheme='http://www.blogger.com/atom/ns#' term='中央山脈'/><title type='text'>2011 01 22 加羅湖</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;embed flashvars="host=picasaweb.google.com&amp;amp;hl=zh_TW&amp;amp;feat=flashalbum&amp;amp;RGB=0x000000&amp;amp;feed=http%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2FNomadLibra%2Falbumid%2F5565566268852967985%3Falt%3Drss%26kind%3Dphoto%26hl%3Dzh_TW" height="400" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://picasaweb.google.com/s/c/bin/slideshow.swf" type="application/x-shockwave-flash" width="550"&gt;&lt;/embed&gt;&lt;br /&gt;
&lt;br /&gt;
軌跡記錄到紮營點而已 &lt;br /&gt;
&lt;iframe frameborder="0" height="350" marginheight="0" marginwidth="0" scrolling="no" src="http://maps.google.com.tw/maps/ms?hl=zh-tw&amp;amp;ie=UTF8&amp;amp;brcurrent=3,0x346ef3065c07572f:0xe711f004bf9c5469,0&amp;amp;t=h&amp;amp;msa=0&amp;amp;msid=203146497459763676427.00049aa3d58b29684de9a&amp;amp;ll=24.480275,121.461411&amp;amp;spn=0.027106,0.042915&amp;amp;z=14&amp;amp;output=embed" width="500"&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;small&gt;在較大的地圖上查看&lt;a href="http://maps.google.com.tw/maps/ms?hl=zh-tw&amp;amp;ie=UTF8&amp;amp;brcurrent=3,0x346ef3065c07572f:0xe711f004bf9c5469,0&amp;amp;t=h&amp;amp;msa=0&amp;amp;msid=203146497459763676427.00049aa3d58b29684de9a&amp;amp;ll=24.480275,121.461411&amp;amp;spn=0.027106,0.042915&amp;amp;z=14&amp;amp;source=embed" style="color: blue; text-align: left;"&gt;2011 01 22 加羅湖&lt;/a&gt;&lt;/small&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;iframe frameborder="0" height="500" marginheight="0" marginwidth="0" scrolling="no" src="http://maps.google.com.tw/maps/ms?hl=zh-tw&amp;amp;ie=UTF8&amp;amp;brcurrent=3,0x346876b5eaaacb97:0x6fb788920a544edf,1,0x3467e03d6b232f5b:0xcfbb529e13d307ac&amp;amp;t=f&amp;amp;ecpose=24.49748637,121.4329244,2537.41,115.078,74.918,0&amp;amp;msa=0&amp;amp;msid=203146497459763676427.00049aa3d58b29684de9a&amp;amp;ll=24.485139,121.461911&amp;amp;spn=0.038822,0.047207&amp;amp;z=14&amp;amp;output=embed" width="550"&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;small&gt;在較大的地圖上查看&lt;a href="http://maps.google.com.tw/maps/ms?hl=zh-tw&amp;amp;ie=UTF8&amp;amp;brcurrent=3,0x346876b5eaaacb97:0x6fb788920a544edf,1,0x3467e03d6b232f5b:0xcfbb529e13d307ac&amp;amp;t=f&amp;amp;ecpose=24.49748637,121.4329244,2537.41,115.078,74.918,0&amp;amp;msa=0&amp;amp;msid=203146497459763676427.00049aa3d58b29684de9a&amp;amp;ll=24.485139,121.461911&amp;amp;spn=0.038822,0.047207&amp;amp;z=14&amp;amp;source=embed" style="color: blue; text-align: left;"&gt;2011 01 22 加羅湖&lt;/a&gt;&lt;/small&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7597887370716014923-6452659817415460366?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/6452659817415460366/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=6452659817415460366&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/6452659817415460366'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/6452659817415460366'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2011/01/2011-01-22.html' title='2011 01 22 加羅湖'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><thr:total>0</thr:total><georss:featurename>267台灣宜蘭縣大同鄉加羅湖</georss:featurename><georss:point>24.474435 121.477943</georss:point><georss:box>24.4353755 121.419578 24.5134945 121.53630799999999</georss:box></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-3277857101619646009</id><published>2011-01-17T01:33:00.001+08:00</published><updated>2011-01-17T01:45:26.833+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='COM'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Programming'/><title type='text'>Neutral Apartments</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;終於找到關於&amp;nbsp;Neutral Apartments 的描述了, 記得之前都查不到呢, 根據 MSDN 上寫的日期, 這是&amp;nbsp;9/2/2010 的文件, 真是 "新" 啊!&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
Neutral Apartments&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/ms681813(v=VS.85).aspx"&gt;http://msdn.microsoft.com/en-us/library/ms681813(v=VS.85).aspx&lt;/a&gt;&lt;br /&gt;
Threading Model Attribute&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/ms681753(v=VS.85).aspx"&gt;http://msdn.microsoft.com/en-us/library/ms681753(v=VS.85).aspx&lt;/a&gt;&lt;br /&gt;
有張挺有價值的表格 :)&lt;br /&gt;
COM+ Contexts and Threading Models&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/ms681289(v=VS.85).aspx"&gt;http://msdn.microsoft.com/en-us/library/ms681289(v=VS.85).aspx&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
而外還找到一個不錯解釋, 解釋的比 MSDN 還好, 真不知道他怎麼知道的 ..... 呵呵&lt;br /&gt;
摘錄於&amp;nbsp;&lt;a href="http://gsraj.tripod.com/com/com_threading.html"&gt;http://gsraj.tripod.com/com/com_threading.html&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Components that use the Thread Neutral Apartment model (TNA), mark themselves as Free Threaded or Both. Here the component instances run on the same thread type as the caller's thread. Each instance of a COM class can run on a different thread each time a method is called. When a thread is executing a method in a COM object, and that method creates a new object, MTS will suspend the current thread and create a new thread to handle the new object. Like the MTA, TNAs allow more than one thread to enter an apartment. However, once a thread has entered an apartment, it obtains an apartment-wide lock and no other thread can enter that apartment until it exits. This model was introduced into MTS and COM+ to ensure that context switches are faster.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7597887370716014923-3277857101619646009?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/3277857101619646009/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=3277857101619646009&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/3277857101619646009'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/3277857101619646009'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2011/01/neutral-apartments.html' title='Neutral Apartments'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-9117706784908225078</id><published>2011-01-16T22:09:00.003+08:00</published><updated>2011-01-16T22:10:32.136+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><category scheme='http://www.blogger.com/atom/ns#' term='GPL'/><title type='text'>MySQL licensing</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;大家都知道 MySQL 是以 GPL 的方式授權使用, 而他也提供付費授權的版本, 那麼, 如果一個網站使用 MySQL 做為營利用途, 那是否得公開源始碼呢? 否則就違反 GPL 授權了. 根據 GPL 的規範, GPL 軟體與軟體的衍生物都必須以 GPL 的方式公開源碼, 而衍生物比較廣泛的定義應該包含了 dynamic linking 跟 database access 這類的行為吧. 所以從這個角度來看, 營利網站似乎不能使用 GPL 的 MySQL ....&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;不過我又查到有此一說: 以下摘錄於&amp;nbsp;&lt;a href="http://stackoverflow.com/questions/620696/mysql-licensing-and-gpl"&gt;http://stackoverflow.com/questions/620696/mysql-licensing-and-gpl&lt;/a&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="border-collapse: collapse; line-height: 18px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; clear: both; margin-bottom: 1em; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline; word-wrap: break-word;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Provided that you keep it server-only(and therefore "private"), you don't have to release it as GPL. But as soon as it reaches public desktops, it can no longer be considered an internal build, and therefore source code is needed.&lt;/span&gt;&lt;/div&gt;&lt;div style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; clear: both; margin-bottom: 1em; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline; word-wrap: break-word;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;So you can:&lt;/span&gt;&lt;/div&gt;&lt;ul style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; list-style-image: initial; list-style-position: initial; list-style-type: disc; margin-bottom: 1em; margin-left: 30px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;li style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Release your code as GPL&lt;/span&gt;&lt;/li&gt;
&lt;li style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Buy the commercial version of MySQL&lt;/span&gt;&lt;/li&gt;
&lt;li style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Keep it server-only.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;從這樣的說法來看 Server 使用 MySQL 又好像不用付費 ... 我更好奇 Amazon 推出的&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;span class="Apple-style-span" style="-webkit-text-decorations-in-effect: underline; border-collapse: separate; font-family: arial, sans-serif; line-height: 19px;"&gt;Relational Database Service&amp;nbsp;&lt;/span&gt;服務又該怎麼算呢? 它可是建立在 MySQL 之上呢.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7597887370716014923-9117706784908225078?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/9117706784908225078/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=9117706784908225078&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/9117706784908225078'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/9117706784908225078'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2011/01/mysql-licensing.html' title='MySQL licensing'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-5017289893590273992</id><published>2011-01-07T00:03:00.003+08:00</published><updated>2011-01-07T00:05:10.312+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='COM'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><title type='text'>神秘的 COINIT Enum 到底做啥用的啊?</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: 'Segoe UI', Verdana, Arial; font-size: 13px;"&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms678505(v=vs.85).aspx"&gt;http://msdn.microsoft.com/en-us/library/ms678505(v=vs.85).aspx&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
COINIT_DISABLE_OLE1DDE&lt;br /&gt;
&amp;nbsp;&amp;nbsp; Disables DDE for OLE1 support.&lt;br /&gt;
COINIT_SPEED_OVER_MEMORY&lt;br /&gt;
&amp;nbsp;&amp;nbsp; Trade memory for speed.&lt;br /&gt;
&lt;br /&gt;
到底是啥鬼?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7597887370716014923-5017289893590273992?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/5017289893590273992/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=5017289893590273992&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/5017289893590273992'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/5017289893590273992'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2011/01/coinit-enum.html' title='神秘的 COINIT Enum 到底做啥用的啊?'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-7783075867189850812</id><published>2010-12-24T11:21:00.005+08:00</published><updated>2011-01-15T12:22:35.929+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQLite'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>SQLIte Query Planning</title><content type='html'>SQL 語言隱藏了大部分演算法跟資料結構的細節, 這讓 SQL 變得有彈性與容易使用, 但付出的代價就是效率, 當你要做出高效的 query 時, 你就必須了解你的&amp;nbsp;query statement 是怎麼被分析與執行的, 如果你能夠了解這些, 你就可以利用以前演算法的複雜度分析來思考&amp;nbsp;query statement, 如此也能找到更好的 statement 跟 對應的 indexing.&amp;nbsp;這幾篇文章讓我獲益不少, 在此分享一下吧:)&lt;br /&gt;
&lt;br /&gt;
The SQLite Query Planner &lt;a href="http://www.sqlite.org/optoverview.html"&gt;http://www.sqlite.org/optoverview.html&lt;/a&gt;&lt;br /&gt;
EXPLAIN QUERY PLAN&amp;nbsp;&lt;a href="http://www.sqlite.org/eqp.html"&gt;http://www.sqlite.org/eqp.html&lt;/a&gt;&lt;br /&gt;
Query Planning &lt;a href="http://www.sqlite.org/queryplanner.html"&gt;http://www.sqlite.org/queryplanner.html&lt;/a&gt;&lt;br /&gt;
Performance Tuning&amp;nbsp;&lt;a href="http://www.sqlite.org/cvstrac/wiki?p=PerformanceTuning"&gt;http://www.sqlite.org/cvstrac/wiki?p=PerformanceTuning&lt;/a&gt;&lt;br /&gt;
How do I improve the performance of SQLite?&amp;nbsp;&lt;a href="http://stackoverflow.com/questions/1711631/how-do-i-improve-the-performance-of-sqlite"&gt;http://stackoverflow.com/questions/1711631/how-do-i-improve-the-performance-of-sqlite&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Some SQLite 3.7 Benchmarks&amp;nbsp;&lt;a href="http://blog.quibb.org/2010/10/some-sqlite-3-7-benchmarks/"&gt;http://blog.quibb.org/2010/10/some-sqlite-3-7-benchmarks/&lt;/a&gt;&lt;br /&gt;
Fast Bulk Inserts into SQLite&amp;nbsp;&lt;a href="http://blog.quibb.org/2010/08/fast-bulk-inserts-into-sqlite/"&gt;http://blog.quibb.org/2010/08/fast-bulk-inserts-into-sqlite/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7597887370716014923-7783075867189850812?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/7783075867189850812/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=7783075867189850812&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/7783075867189850812'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/7783075867189850812'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2010/12/sqlite-query-planning.html' title='SQLIte Query Planning'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-4301192324501655954</id><published>2010-12-19T20:12:00.000+08:00</published><updated>2010-12-19T20:12:19.448+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='生活'/><title type='text'>Wedding slideshow</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" height="300" id="vp1UbEQG" width="540"&gt;&lt;param name="movie" value="http://static.animoto.com/swf/w.swf?w=swf/vp1&amp;e=1292760720&amp;f=UbEQG4NIYFUjrI1eNy4SOw&amp;d=34&amp;m=b&amp;r=w&amp;i=m&amp;options=loop"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed id="vp1UbEQG" src="http://static.animoto.com/swf/w.swf?w=swf/vp1&amp;e=1292760720&amp;f=UbEQG4NIYFUjrI1eNy4SOw&amp;d=34&amp;m=b&amp;r=w&amp;i=m&amp;options=loop" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="540" height="300"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;
Create your own &lt;a href="http://animoto.com/"&gt;video slideshow&lt;/a&gt; at animoto.com.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7597887370716014923-4301192324501655954?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/4301192324501655954/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=4301192324501655954&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/4301192324501655954'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/4301192324501655954'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2010/12/wedding-slideshow.html' title='Wedding slideshow'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-4634793983667384182</id><published>2010-12-16T10:39:00.002+08:00</published><updated>2010-12-16T10:39:05.733+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='生活'/><category scheme='http://www.blogger.com/atom/ns#' term='趣味'/><category scheme='http://www.blogger.com/atom/ns#' term='攝影'/><category scheme='http://www.blogger.com/atom/ns#' term='變裝'/><title type='text'>Stella 與 James 的婚紗</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;embed flashvars="host=picasaweb.google.com&amp;amp;hl=zh_TW&amp;amp;feat=flashalbum&amp;amp;RGB=0x000000&amp;amp;feed=http%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2FNomadLibra%2Falbumid%2F5548890646394967441%3Falt%3Drss%26kind%3Dphoto%26hl%3Dzh_TW" height="400" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://picasaweb.google.com/s/c/bin/slideshow.swf" type="application/x-shockwave-flash" width="550"&gt;&lt;/embed&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7597887370716014923-4634793983667384182?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/4634793983667384182/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=4634793983667384182&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/4634793983667384182'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/4634793983667384182'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2010/12/stella-james.html' title='Stella 與 James 的婚紗'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-8095623256334525441</id><published>2010-12-14T01:00:00.002+08:00</published><updated>2010-12-14T01:00:46.535+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='登山'/><category scheme='http://www.blogger.com/atom/ns#' term='桃園'/><category scheme='http://www.blogger.com/atom/ns#' term='雪山山脈'/><title type='text'>2010 12 11 北插二行</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;embed flashvars="host=picasaweb.google.com&amp;amp;hl=zh_TW&amp;amp;feat=flashalbum&amp;amp;RGB=0x000000&amp;amp;feed=http%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2FNomadLibra%2Falbumid%2F5550209406095761665%3Falt%3Drss%26kind%3Dphoto%26hl%3Dzh_TW" height="400" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://picasaweb.google.com/s/c/bin/slideshow.swf" type="application/x-shockwave-flash" width="550"&gt;&lt;/embed&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7597887370716014923-8095623256334525441?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/8095623256334525441/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=8095623256334525441&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/8095623256334525441'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/8095623256334525441'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2010/12/2010-12-11.html' title='2010 12 11 北插二行'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-3358658770995615099</id><published>2010-11-30T01:21:00.001+08:00</published><updated>2010-11-30T01:21:45.799+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Corel'/><title type='text'>Corel 的聖誕卡</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;我挺喜歡公司這張賀卡的風格 分享給大家看看嘍&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_YTmQMAUfDN8/TPPgwnF6WVI/AAAAAAAAXM0/_CClvIooTlI/s1600/Xmas-Card.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://2.bp.blogspot.com/_YTmQMAUfDN8/TPPgwnF6WVI/AAAAAAAAXM0/_CClvIooTlI/s640/Xmas-Card.jpg" width="384" /&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/7597887370716014923-3358658770995615099?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/3358658770995615099/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=3358658770995615099&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/3358658770995615099'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/3358658770995615099'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2010/11/corel.html' title='Corel 的聖誕卡'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_YTmQMAUfDN8/TPPgwnF6WVI/AAAAAAAAXM0/_CClvIooTlI/s72-c/Xmas-Card.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-7131618428319758</id><published>2010-10-31T23:34:00.000+08:00</published><updated>2010-10-31T23:34:12.244+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='生活'/><category scheme='http://www.blogger.com/atom/ns#' term='有趣'/><title type='text'>Stella 的一格漫畫</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;a href="http://picasaweb.google.com/lh/photo/ZnifB9VsG30yAVBBAniqzg?feat=embedwebsite"&gt;&lt;img height="293" src="http://lh6.ggpht.com/_YTmQMAUfDN8/TM1OkA9Q3qI/AAAAAAAAW1s/nqecJLtnpzk/s400/2010-10-31-18.57.49.jpg" width="400" /&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/7597887370716014923-7131618428319758?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/7131618428319758/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=7131618428319758&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/7131618428319758'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/7131618428319758'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2010/10/stella.html' title='Stella 的一格漫畫'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_YTmQMAUfDN8/TM1OkA9Q3qI/AAAAAAAAW1s/nqecJLtnpzk/s72-c/2010-10-31-18.57.49.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-1643459791043909172</id><published>2010-10-30T01:03:00.001+08:00</published><updated>2010-10-31T16:16:06.997+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='公司'/><category scheme='http://www.blogger.com/atom/ns#' term='變裝'/><category scheme='http://www.blogger.com/atom/ns#' term='萬聖節'/><category scheme='http://www.blogger.com/atom/ns#' term='台北'/><title type='text'>2010 10 29 萬聖節變裝</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;br /&gt;
&lt;a href="http://picasaweb.google.com/lh/photo/F_QsK0evVdzgucjNhPTUmg?feat=embedwebsite"&gt;&lt;img height="266" src="http://lh6.ggpht.com/_YTmQMAUfDN8/TMr7hWQG1VI/AAAAAAAAWww/UgPu6O9RQLs/s400/2010-10-29-12.44.15.jpg" width="400" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;embed flashvars="host=picasaweb.google.com&amp;amp;hl=zh_TW&amp;amp;feat=flashalbum&amp;amp;RGB=0x000000&amp;amp;feed=http%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2FNomadLibra%2Falbumid%2F5533511249177123377%3Falt%3Drss%26kind%3Dphoto%26hl%3Dzh_TW" height="400" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://picasaweb.google.com/s/c/bin/slideshow.swf" type="application/x-shockwave-flash" width="550"&gt;&lt;/embed&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7597887370716014923-1643459791043909172?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/1643459791043909172/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=1643459791043909172&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/1643459791043909172'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/1643459791043909172'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2010/10/2010-10-29.html' title='2010 10 29 萬聖節變裝'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_YTmQMAUfDN8/TMr7hWQG1VI/AAAAAAAAWww/UgPu6O9RQLs/s72-c/2010-10-29-12.44.15.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-293878352546299651</id><published>2010-10-26T18:48:00.000+08:00</published><updated>2010-10-26T18:48:11.587+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='大屯火山彙'/><category scheme='http://www.blogger.com/atom/ns#' term='旅行'/><category scheme='http://www.blogger.com/atom/ns#' term='台北'/><title type='text'>2010 10 24 磺溪溫泉</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;embed flashvars="host=picasaweb.google.com&amp;amp;hl=zh_TW&amp;amp;feat=flashalbum&amp;amp;RGB=0x000000&amp;amp;feed=http%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2FNomadLibra%2Falbumid%2F5531581625989779889%3Falt%3Drss%26kind%3Dphoto%26hl%3Dzh_TW" height="400" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://picasaweb.google.com/s/c/bin/slideshow.swf" type="application/x-shockwave-flash" width="550"&gt;&lt;/embed&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7597887370716014923-293878352546299651?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/293878352546299651/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=293878352546299651&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/293878352546299651'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/293878352546299651'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2010/10/2010-10-24.html' title='2010 10 24 磺溪溫泉'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-3585494815486991787</id><published>2010-10-12T10:44:00.000+08:00</published><updated>2010-10-15T10:46:28.580+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='帛琉'/><category scheme='http://www.blogger.com/atom/ns#' term='旅行'/><category scheme='http://www.blogger.com/atom/ns#' term='HDR'/><title type='text'>2010 10 12 帛琉 Part 4 and HDR</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;embed type="application/x-shockwave-flash" src="http://picasaweb.google.com/s/c/bin/slideshow.swf" width="550" height="400" flashvars="host=picasaweb.google.com&amp;hl=zh_TW&amp;feat=flashalbum&amp;RGB=0x000000&amp;feed=http%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2FNomadLibra%2Falbumid%2F5527563128787160865%3Falt%3Drss%26kind%3Dphoto%26hl%3Dzh_TW" pluginspage="http://www.macromedia.com/go/getflashplayer"&gt;&lt;/embed&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;embed type="application/x-shockwave-flash" src="http://picasaweb.google.com/s/c/bin/slideshow.swf" width="550" height="400" flashvars="host=picasaweb.google.com&amp;hl=zh_TW&amp;feat=flashalbum&amp;RGB=0x000000&amp;feed=http%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2FNomadLibra%2Falbumid%2F5527249171608680145%3Falt%3Drss%26kind%3Dphoto%26hl%3Dzh_TW" pluginspage="http://www.macromedia.com/go/getflashplayer"&gt;&lt;/embed&gt;&lt;br /&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/7597887370716014923-3585494815486991787?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/3585494815486991787/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=3585494815486991787&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/3585494815486991787'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/3585494815486991787'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2010/10/2010-10-12-part-4-and-hdr.html' title='2010 10 12 帛琉 Part 4 and HDR'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-2420440990949617914</id><published>2010-10-11T10:42:00.000+08:00</published><updated>2010-10-15T10:44:20.122+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='帛琉'/><category scheme='http://www.blogger.com/atom/ns#' term='旅行'/><category scheme='http://www.blogger.com/atom/ns#' term='浮潛'/><title type='text'>2010 10 11 帛琉 Part 3</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;embed type="application/x-shockwave-flash" src="http://picasaweb.google.com/s/c/bin/slideshow.swf" width="550" height="400" flashvars="host=picasaweb.google.com&amp;hl=zh_TW&amp;feat=flashalbum&amp;RGB=0x000000&amp;feed=http%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2FNomadLibra%2Falbumid%2F5527390265615779361%3Falt%3Drss%26kind%3Dphoto%26hl%3Dzh_TW" pluginspage="http://www.macromedia.com/go/getflashplayer"&gt;&lt;/embed&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/p/F591A6C1C32C06B6?hl=zh_TW&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/p/F591A6C1C32C06B6?hl=zh_TW&amp;fs=1" type="application/x-shockwave-flash" width="480" height="385" allowscriptaccess="always" allowfullscreen="true"&gt;&lt;/embed&gt;&lt;/object&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/7597887370716014923-2420440990949617914?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/2420440990949617914/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=2420440990949617914&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/2420440990949617914'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/2420440990949617914'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2010/10/2010-10-11-part-3.html' title='2010 10 11 帛琉 Part 3'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-4980731065995962976</id><published>2010-10-10T10:37:00.002+08:00</published><updated>2010-10-15T10:42:40.381+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='帛琉'/><category scheme='http://www.blogger.com/atom/ns#' term='旅行'/><category scheme='http://www.blogger.com/atom/ns#' term='浮潛'/><title type='text'>2010 10 10 帛琉 Part 2</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;embed flashvars="host=picasaweb.google.com&amp;amp;hl=zh_TW&amp;amp;feat=flashalbum&amp;amp;RGB=0x000000&amp;amp;feed=http%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2FNomadLibra%2Falbumid%2F5527350705344151201%3Falt%3Drss%26kind%3Dphoto%26hl%3Dzh_TW" height="400" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://picasaweb.google.com/s/c/bin/slideshow.swf" type="application/x-shockwave-flash" width="550"&gt;&lt;/embed&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;object height="385" width="480"&gt;&lt;param name="movie" value="http://www.youtube.com/p/9C5F55676C6BE016?hl=zh_TW&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/p/9C5F55676C6BE016?hl=zh_TW&amp;fs=1" type="application/x-shockwave-flash" width="480" height="385" allowscriptaccess="always" allowfullscreen="true"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7597887370716014923-4980731065995962976?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/4980731065995962976/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=4980731065995962976&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/4980731065995962976'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/4980731065995962976'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2010/10/2010-10-10-part-2.html' title='2010 10 10 帛琉 Part 2'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-3403102464901546038</id><published>2010-10-09T10:36:00.003+08:00</published><updated>2010-10-15T10:41:49.308+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='帛琉'/><category scheme='http://www.blogger.com/atom/ns#' term='旅行'/><title type='text'>2010 10 09 帛琉 Part 1</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;embed flashvars="host=picasaweb.google.com&amp;amp;hl=zh_TW&amp;amp;feat=flashalbum&amp;amp;RGB=0x000000&amp;amp;feed=http%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2FNomadLibra%2Falbumid%2F5527239199089590001%3Falt%3Drss%26kind%3Dphoto%26hl%3Dzh_TW" height="400" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://picasaweb.google.com/s/c/bin/slideshow.swf" type="application/x-shockwave-flash" width="550"&gt;&lt;/embed&gt;&lt;/div&gt;&lt;div style="text-align: center;"&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/7597887370716014923-3403102464901546038?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/3403102464901546038/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=3403102464901546038&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/3403102464901546038'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/3403102464901546038'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2010/10/2010-10-09-part-1.html' title='2010 10 09 帛琉 Part 1'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-4092411713543577125</id><published>2010-10-06T09:47:00.000+08:00</published><updated>2010-10-06T09:47:49.527+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='五專同學'/><title type='text'>2010 10 05 五專死黨歡唱</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;a href="http://picasaweb.google.com.tw/lh/photo/Ogs9A1ZrSGMd-yNoUDwk8A?feat=embedwebsite"&gt;&lt;img height="400" src="http://lh6.ggpht.com/_YTmQMAUfDN8/TKvS-9-bnyI/AAAAAAAAVr8/OLd5pGFeIOo/s400/2010-10-05-21.18.48.jpg" width="266" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://picasaweb.google.com.tw/lh/photo/S0xLulH0jdfpZ_Vjjlli7w?feat=embedwebsite"&gt;&lt;img height="266" src="http://lh5.ggpht.com/_YTmQMAUfDN8/TKvTVOPdgxI/AAAAAAAAVtE/945bK7He2EM/s400/2010-10-05-22.33.18.jpg" width="400" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;embed type="application/x-shockwave-flash" src="http://picasaweb.google.com.tw/s/c/bin/slideshow.swf" width="550" height="400" flashvars="host=picasaweb.google.com.tw&amp;hl=zh_TW&amp;feat=flashalbum&amp;RGB=0x000000&amp;feed=http%3A%2F%2Fpicasaweb.google.com.tw%2Fdata%2Ffeed%2Fapi%2Fuser%2FNomadLibra%2Falbumid%2F5524741013033057121%3Falt%3Drss%26kind%3Dphoto%26hl%3Dzh_TW" pluginspage="http://www.macromedia.com/go/getflashplayer"&gt;&lt;/embed&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/7597887370716014923-4092411713543577125?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/4092411713543577125/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=4092411713543577125&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/4092411713543577125'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/4092411713543577125'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2010/10/2010-10-05.html' title='2010 10 05 五專死黨歡唱'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_YTmQMAUfDN8/TKvS-9-bnyI/AAAAAAAAVr8/OLd5pGFeIOo/s72-c/2010-10-05-21.18.48.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-7803679707215219393</id><published>2010-09-21T13:27:00.001+08:00</published><updated>2010-09-21T13:28:14.927+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='生活'/><category scheme='http://www.blogger.com/atom/ns#' term='台北'/><title type='text'>2010 08 29 新店天湖</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;a href="http://picasaweb.google.com/lh/photo/VQ0tCEZVnjtG-13-YTIjvQ?feat=embedwebsite"&gt;&lt;img src="http://lh5.ggpht.com/_YTmQMAUfDN8/TJZD9ZQV0aI/AAAAAAAAVIc/FtzSm4VZMqM/s400/2010-08-29-13.31.29.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;embed type="application/x-shockwave-flash" src="http://picasaweb.google.com/s/c/bin/slideshow.swf" width="550" height="400" flashvars="host=picasaweb.google.com&amp;hl=zh_TW&amp;feat=flashalbum&amp;RGB=0x000000&amp;feed=http%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2FNomadLibra%2Falbumid%2F5518673071791600769%3Falt%3Drss%26kind%3Dphoto%26hl%3Dzh_TW" pluginspage="http://www.macromedia.com/go/getflashplayer"&gt;&lt;/embed&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7597887370716014923-7803679707215219393?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/7803679707215219393/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=7803679707215219393&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/7803679707215219393'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/7803679707215219393'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2010/09/2010-08-29.html' title='2010 08 29 新店天湖'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_YTmQMAUfDN8/TJZD9ZQV0aI/AAAAAAAAVIc/FtzSm4VZMqM/s72-c/2010-08-29-13.31.29.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-8700504751520706444</id><published>2010-08-20T01:53:00.000+08:00</published><updated>2010-08-20T01:53:52.871+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='旅行'/><category scheme='http://www.blogger.com/atom/ns#' term='台北'/><title type='text'>2010 08 15 老梅</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;embed type="application/x-shockwave-flash" src="http://picasaweb.google.com/s/c/bin/slideshow.swf" width="550" height="400" flashvars="host=picasaweb.google.com&amp;hl=zh_TW&amp;feat=flashalbum&amp;RGB=0x000000&amp;feed=http%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2FNomadLibra%2Falbumid%2F5507177114083625153%3Falt%3Drss%26kind%3Dphoto%26hl%3Dzh_TW" pluginspage="http://www.macromedia.com/go/getflashplayer"&gt;&lt;/embed&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7597887370716014923-8700504751520706444?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/8700504751520706444/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=8700504751520706444&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/8700504751520706444'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/8700504751520706444'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2010/08/2010-08-15.html' title='2010 08 15 老梅'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-6132562632480949982</id><published>2010-08-04T12:14:00.001+08:00</published><updated>2010-08-04T12:20:28.628+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='旅行'/><category scheme='http://www.blogger.com/atom/ns#' term='澎湖'/><title type='text'>2010 08 01 菊島之旅</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;a href="http://picasaweb.google.com/lh/photo/EoeqEoHUAWw499T7yemsVQ?feat=embedwebsite"&gt;&lt;img src="http://lh5.ggpht.com/_YTmQMAUfDN8/TFhSHSyXg_I/AAAAAAAAU0c/SLWUrpcL6aA/s400/2010-08-03-15.56.55.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://picasaweb.google.com/lh/photo/45I_EG9N-J7N2h-iYn-m8A?feat=embedwebsite"&gt;&lt;img src="http://lh5.ggpht.com/_YTmQMAUfDN8/TFhQvsvCk5I/AAAAAAAAUrY/_0x-M0IyKfM/s400/2010-08-01-12.24.03.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://picasaweb.google.com/lh/photo/UDqF5vC1bvPRLzp0P-ro4g?feat=embedwebsite"&gt;&lt;img src="http://lh5.ggpht.com/_YTmQMAUfDN8/TFhREHJoWqI/AAAAAAAAUtU/IjUeZaxHdi8/s400/2010-08-01-14.47.55--.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://picasaweb.google.com/lh/photo/AIAjCgPZQuHt_Y2RotgXWQ?feat=embedwebsite"&gt;&lt;img src="http://lh3.ggpht.com/_YTmQMAUfDN8/TFhRJLm2REI/AAAAAAAAUt0/iy78NkdSD-I/s400/2010-08-01-15.15.40.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://picasaweb.google.com/lh/photo/osdjSTyl-abcepW9pMjQqw?feat=embedwebsite"&gt;&lt;img src="http://lh5.ggpht.com/_YTmQMAUfDN8/TFhRnRqj2qI/AAAAAAAAUxE/WwGKzlCd_8Q/s400/2010-08-02-13.43.05.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://picasaweb.google.com/lh/photo/O1TKS85jP_oxIJu4Jlhpbg?feat=embedwebsite"&gt;&lt;img src="http://lh5.ggpht.com/_YTmQMAUfDN8/TFhRxFog-GI/AAAAAAAAUyI/oe6HcEkuvCE/s400/2010-08-03-10.27.12.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;embed flashvars="host=picasaweb.google.com&amp;amp;captions=1&amp;amp;hl=zh_TW&amp;amp;feat=flashalbum&amp;amp;RGB=0x000000&amp;amp;feed=http%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2FNomadLibra%2Falbumid%2F5501235633693073137%3Falt%3Drss%26kind%3Dphoto%26hl%3Dzh_TW" height="267" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://picasaweb.google.com/s/c/bin/slideshow.swf" type="application/x-shockwave-flash" width="400"&gt;&lt;/embed&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7597887370716014923-6132562632480949982?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/6132562632480949982/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=6132562632480949982&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/6132562632480949982'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/6132562632480949982'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2010/08/2010-08-01.html' title='2010 08 01 菊島之旅'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_YTmQMAUfDN8/TFhSHSyXg_I/AAAAAAAAU0c/SLWUrpcL6aA/s72-c/2010-08-03-15.56.55.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-7184548917705604544</id><published>2010-07-04T20:35:00.001+08:00</published><updated>2010-07-04T20:37:55.400+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='登山'/><category scheme='http://www.blogger.com/atom/ns#' term='台北'/><category scheme='http://www.blogger.com/atom/ns#' term='雪山山脈'/><title type='text'>2010 07 04 桶後溪 22km 健行</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;embed flashvars="host=picasaweb.google.com&amp;amp;hl=zh_TW&amp;amp;feat=flashalbum&amp;amp;RGB=0x000000&amp;amp;feed=http%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2FNomadLibra%2Falbumid%2F5490021168262824657%3Falt%3Drss%26kind%3Dphoto%26hl%3Dzh_TW" height="267" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://picasaweb.google.com/s/c/bin/slideshow.swf" type="application/x-shockwave-flash" width="400"&gt;&lt;/embed&gt;&lt;/div&gt;&lt;br /&gt;
今天走了 22 公里的林道, 雖然並不陡峭但是在那艷陽下真的叫人吃不消, 爬一半的過程中我們家楊大還拿出溫度計來看山上的氣溫, 結果, 太陽下竟然有 37度.... 畢竟高度只有 400~500 公尺高&lt;br /&gt;
&lt;br /&gt;
黃色是今天走的, 紫色是 2008 年的紀錄喔 下次希望能到礁溪&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;&lt;iframe frameborder="0" height="350" marginheight="0" marginwidth="0" scrolling="no" src="http://maps.google.com.tw/maps/ms?ie=UTF8&amp;amp;hl=zh-TW&amp;amp;brcurrent=3,0x346808e8b57b1149:0xcde259054fa552a0,0,0x345d5538b0b6645f:0x5aa90dfa6620edc0&amp;amp;oe=UTF8&amp;amp;start=249&amp;amp;num=200&amp;amp;source=embed&amp;amp;t=p&amp;amp;msa=0&amp;amp;msid=100001407629056322073.00048a8ecebd862096dc4&amp;amp;ll=24.840646,121.618996&amp;amp;spn=0.054523,0.085831&amp;amp;z=13&amp;amp;output=embed" width="500"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;small&gt;在較大的地圖上查看&lt;a href="http://maps.google.com.tw/maps/ms?ie=UTF8&amp;amp;hl=zh-TW&amp;amp;brcurrent=3,0x346808e8b57b1149:0xcde259054fa552a0,0,0x345d5538b0b6645f:0x5aa90dfa6620edc0&amp;amp;oe=UTF8&amp;amp;start=249&amp;amp;num=200&amp;amp;source=embed&amp;amp;t=p&amp;amp;msa=0&amp;amp;msid=100001407629056322073.00048a8ecebd862096dc4&amp;amp;ll=24.840646,121.618996&amp;amp;spn=0.054523,0.085831&amp;amp;z=13" style="color: blue; text-align: left;"&gt;桶後溪 旅行紀錄&lt;/a&gt;&lt;/small&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7597887370716014923-7184548917705604544?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/7184548917705604544/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=7184548917705604544&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/7184548917705604544'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/7184548917705604544'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2010/07/2010-07-04-22km.html' title='2010 07 04 桶後溪 22km 健行'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-6645048724673101454</id><published>2010-07-04T01:21:00.001+08:00</published><updated>2010-07-04T01:22:41.699+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MeeGo'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Phone'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><category scheme='http://www.blogger.com/atom/ns#' term='iOS'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows CE'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='Java. Objective-C'/><title type='text'>VM-based 的程式語言總是讓人又愛又恨</title><content type='html'>我想大家寫過 .NET Framework, Java 甚至是 Python 之後再回去開發 C/C++ 的程式碼應該多少都有一點 "卡卡" 的吧, 原因是因為, 對於 programmer 來說上述的三種語言都有著豐富且 "統一" 的 library 可以供大家使用, 所以寫起來也比較順手. 這些 VM-based 的程式語言還個重要的好處, 就是它與硬體平台並不相依, 所以基本上如果兩個平台有著相同的 "軟體抽象層" (包含 Programming model 跟 library), 用這些語言寫的程式是可以直接在上面跑的, &amp;nbsp;另一個共通的特點就是這些語言都提供 Garbage collection 的機制, 所以寫程式 "比較" 不用在意記憶體釋放的細節.&amp;nbsp;這些好處都可以快速的增加 programmer 的生產力, 但是, 付出的代價也是非常的多...&lt;br /&gt;
&lt;br /&gt;
首先&amp;nbsp;VM-based 的程式語言都需要 VM (廢話), 在沒有支援 JIT 的情況下, 程式碼必須以 Byte-code 的形式在 VM 中執行 (Java 在 ARM CPU上有 &lt;a href="http://en.wikipedia.org/wiki/Jazelle"&gt;Jazelle &lt;/a&gt;可以直接執行) 速度與 Native-code 相比還是差了一點點, 如果是 JIT 的話那應該就差不了太多了, 不過, 就我的經驗 JIT 還是挺花時間與記憶體, 在 Mobile 或是 Embedded system 的世界中對於記憶體的要求可能就更嚴格了.&lt;br /&gt;
&lt;br /&gt;
Garbage collection 是個很方便的技術真的大幅提升了開發的速度, 但是付出的代價就是 programmer 對於記憶體使用量的控制性降低了, 畢竟 GC 不可能隨時隨地都在做, 通常只有在記憶體比較不足或是系統比較有空的時候才會發生, 這對於程式來說有兩種影響 1. 記憶體的使用量比&amp;nbsp;Native-code 大而如果&amp;nbsp;programmer 需要精細的配置記憶體的使用量可能不大容易 2. GC 可能會影響系統執行的流暢度.&lt;br /&gt;
&lt;br /&gt;
觀察現行的 Mobile platform 各式各樣的硬體 CPU 規格, 要使用非 VM-based 的語言來開發軟體在佈署與相容性上將會非常麻煩, 以下是各個平台的概況: &lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Windows CE 提供了 C/C++ SDK 與 .NET Framework Compact 供 programmer 發展, 但是似乎是比較傾向 Native code, 以 Windows CE 7 來說, 微軟提供了&amp;nbsp;&lt;a href="http://www.microsoft.com/windowsembedded/en-us/products/windowsce/silverlightforwe.mspx"&gt;Microsoft Silverlight for Windows Embedded&lt;/a&gt; 給 C++ (沒錯不是 C# 喔) 做為 UI Framework,&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Windows Phone 7 上則是主推 Silverlight, &amp;nbsp;XNA 與 .NET Framework Compact (我猜是想把&amp;nbsp;Windows Phone 7 變成遊戲平台吧 :P) 這兩個平台的發展方向目前有點不同! &amp;nbsp;這有篇相關的文章可以看看 &lt;a href="http://www.zdnet.com/blog/microsoft/microsofts-new-pitch-every-net-developer-just-became-a-windows-phone-developer/5316"&gt;"Microsoft's new pitch: 'Every .Net developer just became a Windows Phone developer&lt;/a&gt;"&lt;/li&gt;
&lt;li&gt;Android 則是 Java 配上 Application Framework 與 NDK, NDK 相關的資訊還真的少得可憐, Google 則強烈建議大家用 Java 開發應用程式.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;iOS 提供的原生程式語言是 Objective-C, 基本上是 C-based 的程式語言, 所以速度上應該不是問題, 在加上 Apple 的硬體 model 單純所以沒有太多相容與移植的問題, 所以狀況比較單純, 但是還是有人對於&amp;nbsp;&amp;nbsp;Objective-C 的速度有些意見:P&amp;nbsp;&lt;a href="http://www.javarants.com/2010/05/26/android-dalvik-vm-performance-is-a-threat-to-the-iphone/"&gt;"Android Dalvik VM performance is a threat to the iPhone"&lt;/a&gt;&amp;nbsp;另外 .NET CLI 也可以在 iPhone 跑ㄟ &lt;a href="http://monotouch.net/"&gt;MonoTouch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;MeeGo API 部分是使用 Qt Framework 做為 UI Framework, 主要是使用 C/C++, 感覺&amp;nbsp;MeeGo 比較像一般的 OS, 現行的 Mobile OS 都在 Application framework 還有跨硬體平台的部分有著特殊的設計, 但是 MeeGo 在這方面著墨比較少.&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;可以見得每個平台的選擇都還不少, 除了 Apple iOS 獨樹一格之外, 其它開放性的系統都會有硬體相容性與移植的問題, 要用&amp;nbsp;VM-based 的程式語言還是 Native 的程式語言好呢? 我想混用最好, 但是佈署可就要花點心思了.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7597887370716014923-6645048724673101454?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/6645048724673101454/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=6645048724673101454&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/6645048724673101454'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/6645048724673101454'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2010/07/vm-based.html' title='VM-based 的程式語言總是讓人又愛又恨'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-9077052788920755550</id><published>2010-06-25T11:49:00.002+08:00</published><updated>2010-06-25T11:50:09.015+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><category scheme='http://www.blogger.com/atom/ns#' term='Apple'/><category scheme='http://www.blogger.com/atom/ns#' term='軟體工程'/><title type='text'>OS 與 programmer 的距離越來越遠...</title><content type='html'>&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;為什麼我會說 "OS 離 programmer 越來越遠..." 呢?&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;還記得我以前一開始寫程式的時候常常會想, 物件導向不是很棒嗎? 為什麼 Windows 下的 API 都這麼難用, 雖然它還是有物件的觀念但使用起來跟真正的物件還是有些差異雖然 MFC 包裝了不少 Win32 API, 但總免不了跟 OS 打交道的機會. 後來有了 Java 跟 .NET Framework, 在他們的世界裡物件模型是一致並且可以擴充的, 這時終於讓我天真感受到 "我終於活在完整的物件導向世界中 :P" 儘管實際沒有那麼盡善盡美, 但可以確定的是在那樣的開發環境下 OS 離我越來越遠... 我想這一切都是從 Java 開始的吧...&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;最近開始學習與了解&amp;nbsp;Android 的軟體架構 (我好像動作都比別人慢...) 也稍微 study 了一下 iOS 的設計, 反觀現有的 Windows. 有個共通的特點就是這些開發廠商都想慢慢的隱藏 "OS 的細節與耦合程度", 以微軟來說 COM 與 .NET Framework 提供了遠多於 Windows 本身豐富的元件, 也將一些生澀的 Win32 API 包裝成好用的物件, 所以 programmer 在 .NET 的環境下使用 P/Invoke 打交道的機會就越來越少.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;Android&amp;nbsp;也是個有趣的例子, 大家都知道&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;Android&amp;nbsp;底層是 Linux kernel, Google 在 Linux kernel 建構了變形的 Java VM 稱&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;Android Runtime 與 Application Framework 來增加 programmer 的生產力, Application Framework 是一群 Java 的元件並且描繪出&amp;nbsp;Android&amp;nbsp;上為了&amp;nbsp;mobile&amp;nbsp;特性自有的 programming model, 有了這層 Runtime, programmer 就不需要顧慮他的軟體到底跑在哪一個硬體平台 ARM or x86...,&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;Apple 的 iOS 與 MacOS 則是在 Linux/FreeBSD 上以&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; font-size: 13px;"&gt;Objective-C 的方式提供了&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; font-size: 13px;"&gt;Cocoa, Carbon 與 Java 等&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&amp;nbsp;Application Framework, 目的也是一樣加速軟體的開發.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;我想這就是近幾年 OS 的發展趨勢 "提供統一且豐富的元件加速軟體的開發", 以往的 OS 著重如何高效率的使用硬體, 而現經則是重視怎樣提升 OS 上軟體的開發速度. 畢竟一個 OS 的成功與否是取決於上面有多少 Application.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7597887370716014923-9077052788920755550?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/9077052788920755550/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=9077052788920755550&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/9077052788920755550'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/9077052788920755550'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2010/06/os-programmer.html' title='OS 與 programmer 的距離越來越遠...'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-6347496606194187896</id><published>2010-06-22T20:46:00.001+08:00</published><updated>2011-06-13T09:29:35.750+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='登山'/><category scheme='http://www.blogger.com/atom/ns#' term='宜蘭'/><category scheme='http://www.blogger.com/atom/ns#' term='中央山脈'/><title type='text'>2010 06 19 加羅湖登山口之旅</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;a href="http://picasaweb.google.com/lh/photo/dq7NbyMphD_18b-_KxfXZw?feat=embedwebsite"&gt;&lt;img src="http://lh6.ggpht.com/_YTmQMAUfDN8/TB647tTFbbI/AAAAAAAAUgw/fRsEh0VpK9M/s400/2010-06-20-09.50.04.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;embed flashvars="host=picasaweb.google.com&amp;amp;hl=zh_TW&amp;amp;feat=flashalbum&amp;amp;RGB=0x000000&amp;amp;feed=http%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2FNomadLibra%2Falbumid%2F5485024420110552305%3Falt%3Drss%26kind%3Dphoto%26hl%3Dzh_TW" height="267" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://picasaweb.google.com/s/c/bin/slideshow.swf" type="application/x-shockwave-flash" width="400"&gt;&lt;/embed&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7597887370716014923-6347496606194187896?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/6347496606194187896/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=6347496606194187896&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/6347496606194187896'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/6347496606194187896'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2010/06/2010-06-19.html' title='2010 06 19 加羅湖登山口之旅'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_YTmQMAUfDN8/TB647tTFbbI/AAAAAAAAUgw/fRsEh0VpK9M/s72-c/2010-06-20-09.50.04.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-8706844033883053499</id><published>2010-06-01T02:24:00.000+08:00</published><updated>2011-12-17T02:28:10.046+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQLite'/><category scheme='http://www.blogger.com/atom/ns#' term='COM'/><category scheme='http://www.blogger.com/atom/ns#' term='Corel digital studio'/><category scheme='http://www.blogger.com/atom/ns#' term='Media Library'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>Media Library Engine 2.0</title><content type='html'>&lt;br /&gt;
&lt;div class="MsoNormal"&gt;
&lt;span style="font-family: inherit;"&gt;&lt;span lang="en-US"&gt;It&lt;/span&gt;&lt;span lang="en-US"&gt; is a file-based media content management service that provides query/access, management&lt;/span&gt;&lt;span lang="en-US"&gt;,&lt;/span&gt;&lt;span lang="en-US"&gt; and trac&lt;/span&gt;&lt;span lang="en-US"&gt;ing&lt;/span&gt;&lt;span lang="en-US"&gt; API&lt;/span&gt;&lt;span lang="en-US"&gt;s. &lt;/span&gt;&lt;span lang="en-US"&gt;Windows applications&lt;/span&gt;&lt;span lang="en-US"&gt; can search, manage, and sync content with MLE2&lt;/span&gt;&lt;span lang="en-US"&gt;. It includes a daemon which &lt;/span&gt;&lt;span lang="en-US"&gt;syncs&lt;/span&gt;&lt;span lang="en-US"&gt; metadata and thumbnails between &lt;/span&gt;&lt;span lang="en-US"&gt;database&lt;/span&gt;&lt;span lang="en-US"&gt; &lt;/span&gt;&lt;span lang="en-US"&gt;and file system &lt;/span&gt;&lt;span lang="en-US"&gt;in background.&lt;/span&gt;&lt;span lang="en-US"&gt; MLE2 database back-end is SQLite engine.&lt;/span&gt;&lt;span lang="zh-TW" style="font-weight: bold;"&gt; &lt;/span&gt;&lt;span lang="en-US"&gt;Comparing to Google Picasa cataloging engine, MLE2 can handle more files (10K~100K files) than Picasa, and they have similar performance for cataloging and search. In addition, it provides a schema-free metadata system to store complex metadata. It &lt;/span&gt;&lt;span lang="en-US"&gt;supports multiple applications or instances to concurrently&lt;/span&gt;&lt;span lang="en-US"&gt; &lt;/span&gt;&lt;span lang="en-US"&gt;access library&lt;/span&gt;&lt;span lang="en-US"&gt;. &lt;/span&gt;&lt;span lang="en-US"&gt;MLE 2.0 also supports primary features such as:&lt;/span&gt;&lt;span lang="en-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="MsoNormal" style="margin-left: 24.0944pt; mso-level-font-family: 新細明體; mso-level-indent: 24.0944pt; mso-level-number-format: bullet; mso-level-size: 9.0pt; mso-level-text: ․; mso-pagination: none; text-indent: -24.0944pt;"&gt;
&lt;span style="font-family: inherit;"&gt;&lt;span style="direction: ltr; unicode-bidi: embed;"&gt;․&lt;/span&gt;&lt;span style="width: 14.25pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span lang="en-US"&gt;Support multiple libraries in concurrent.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal" style="margin-left: 24.0944pt; mso-level-font-family: 新細明體; mso-level-indent: 24.0944pt; mso-level-number-format: bullet; mso-level-size: 9.0pt; mso-level-text: ․; mso-pagination: none; text-indent: -24.0944pt;"&gt;
&lt;span style="font-family: inherit;"&gt;&lt;span style="direction: ltr; unicode-bidi: embed;"&gt;․&lt;/span&gt;&lt;span style="width: 14.25pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span lang="en-US"&gt;Support high performance query, full-text-search, grouping and paging; MLE can handle a query to search 100000 ~ 250000 files less than 1 sec (depends on HDD and CPU).&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal" style="margin-left: 24.0944pt; mso-level-font-family: 新細明體; mso-level-indent: 24.0944pt; mso-level-number-format: bullet; mso-level-size: 9.0pt; mso-level-text: ․; mso-pagination: none; text-indent: -24.0944pt;"&gt;
&lt;span style="font-family: inherit;"&gt;&lt;span style="direction: ltr; unicode-bidi: embed;"&gt;․&lt;/span&gt;&lt;span style="width: 14.25pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span lang="en-US"&gt;Support bulk operation to modify library.&lt;/span&gt;&lt;span lang="en-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal" style="margin-left: 24.0944pt; mso-level-font-family: 新細明體; mso-level-indent: 24.0944pt; mso-level-number-format: bullet; mso-level-size: 9.0pt; mso-level-text: ․; mso-pagination: none; text-indent: -24.0944pt;"&gt;
&lt;span style="font-family: inherit;"&gt;&lt;span style="direction: ltr; unicode-bidi: embed;"&gt;․&lt;/span&gt;&lt;span style="width: 14.25pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span lang="en-US"&gt;Support file time and size stacking&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal" style="margin-left: 24.0944pt; mso-level-font-family: 新細明體; mso-level-indent: 24.0944pt; mso-level-number-format: bullet; mso-level-size: 9.0pt; mso-level-text: ․; mso-pagination: none; text-indent: -24.0944pt;"&gt;
&lt;span style="font-family: inherit;"&gt;&lt;span style="direction: ltr; unicode-bidi: embed;"&gt;․&lt;/span&gt;&lt;span style="width: 14.25pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span lang="en-US"&gt;High throughput thumbnail system which supports three levels pixel, 96x96, 160x160, and 480x480.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal" style="margin-left: 24.0944pt; mso-level-font-family: 新細明體; mso-level-indent: 24.0944pt; mso-level-number-format: bullet; mso-level-size: 9.0pt; mso-level-text: ․; mso-pagination: none; text-indent: -24.0944pt;"&gt;
&lt;span style="font-family: inherit;"&gt;&lt;span style="direction: ltr; unicode-bidi: embed;"&gt;․&lt;/span&gt;&lt;span style="width: 14.25pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span lang="en-US"&gt;Support applications to trace change of files.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal" style="margin-left: 24.0944pt; mso-level-font-family: 新細明體; mso-level-indent: 24.0944pt; mso-level-number-format: bullet; mso-level-size: 9.0pt; mso-level-text: ․; mso-pagination: none; text-indent: -24.0944pt;"&gt;
&lt;span style="font-family: inherit;"&gt;&lt;span style="direction: ltr; unicode-bidi: embed;"&gt;․&lt;/span&gt;&lt;span style="width: 14.25pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span lang="en-US"&gt;Extensible metadata and tags model, applications can define customized metadata and tags for special purpose.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal" style="margin-left: 24.0944pt; mso-level-font-family: 新細明體; mso-level-indent: 24.0944pt; mso-level-number-format: bullet; mso-level-size: 9.0pt; mso-level-text: ․; mso-pagination: none; text-indent: -24.0944pt;"&gt;
&lt;span style="font-family: inherit;"&gt;&lt;span style="direction: ltr; unicode-bidi: embed;"&gt;․&lt;/span&gt;&lt;span style="width: 14.25pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span lang="en-US"&gt;Extensible fault-tolerable media parsing framework, applications can implement multiple media parsers to support customized file formats. MLE includes a default media parser which supports JPEG, PNG, and BMP format based on Microsoft Windows Imaging Component.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal" style="margin-left: 24.0944pt; mso-level-font-family: 新細明體; mso-level-indent: 24.0944pt; mso-level-number-format: bullet; mso-level-size: 9.0pt; mso-level-text: ․; mso-pagination: none; text-indent: -24.0944pt;"&gt;
&lt;span style="font-family: inherit;"&gt;&lt;span style="direction: ltr; unicode-bidi: embed;"&gt;․&lt;/span&gt;&lt;span style="width: 14.25pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span lang="en-US"&gt;An async message channel between MLE and all clients. MLE uses that to notify change notification, and applications can use it to communicate each other.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal" style="margin-left: 24.0944pt; mso-level-font-family: 新細明體; mso-level-indent: 24.0944pt; mso-level-number-format: bullet; mso-level-size: 9.0pt; mso-level-text: ․; mso-pagination: none; text-indent: -24.0944pt;"&gt;
&lt;span lang="en-US"&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal" style="margin-left: 24.0944pt; mso-level-font-family: 新細明體; mso-level-indent: 24.0944pt; mso-level-number-format: bullet; mso-level-size: 9.0pt; mso-level-text: ․; mso-pagination: none; text-indent: -24.0944pt;"&gt;
&lt;span lang="en-US"&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span style="font-family: inherit;"&gt;&lt;span lang="en-US"&gt;I designed and implemented whole engine.&lt;br /&gt;
&lt;/span&gt;&lt;span lang="zh-TW"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class="MsoNormal" style="margin-left: 24.0944pt; mso-level-font-family: 新細明體; mso-level-indent: 24.0944pt; mso-level-number-format: bullet; mso-level-size: 9.0pt; mso-level-text: ․; mso-pagination: none; text-indent: -24.0944pt;"&gt;
&lt;span lang="en-US"&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="MsoNormal" style="margin-left: 24.0944pt; mso-level-font-family: 新細明體; mso-level-indent: 24.0944pt; mso-level-number-format: bullet; mso-level-size: 9.0pt; mso-level-text: ․; mso-pagination: none; text-indent: -24.0944pt;"&gt;
&lt;span lang="en-US"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-iIhp4bcKdaY/TuuMwXJ9ljI/AAAAAAAAdM0/a9zwt-4AeVY/s1600/Picture3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="269" src="http://3.bp.blogspot.com/-iIhp4bcKdaY/TuuMwXJ9ljI/AAAAAAAAdM0/a9zwt-4AeVY/s320/Picture3.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="MsoNormal" style="margin-left: 24.0944pt; mso-level-font-family: 新細明體; mso-level-indent: 24.0944pt; mso-level-number-format: bullet; mso-level-size: 9.0pt; mso-level-text: ․; mso-pagination: none; text-indent: -24.0944pt;"&gt;
&lt;span lang="en-US"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="separator" style="background-color: white; clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-PfA5OXEKiLw/TuuMepGbmTI/AAAAAAAAdMs/tfG0EtyJkAg/s1600/Picture2.png" imageanchor="1" style="background-color: white; margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="216" src="http://3.bp.blogspot.com/-PfA5OXEKiLw/TuuMepGbmTI/AAAAAAAAdMs/tfG0EtyJkAg/s400/Picture2.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&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/7597887370716014923-8706844033883053499?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/8706844033883053499/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=8706844033883053499&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/8706844033883053499'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/8706844033883053499'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2010/06/media-library-engine-20.html' title='Media Library Engine 2.0'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-iIhp4bcKdaY/TuuMwXJ9ljI/AAAAAAAAdM0/a9zwt-4AeVY/s72-c/Picture3.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-1618765616850652303</id><published>2010-05-02T01:21:00.001+08:00</published><updated>2010-06-15T01:24:26.161+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='攝影'/><category scheme='http://www.blogger.com/atom/ns#' term='大屯火山彙'/><category scheme='http://www.blogger.com/atom/ns#' term='旅行'/><category scheme='http://www.blogger.com/atom/ns#' term='台北'/><title type='text'>2010 05 02 巴拉卡亂拍</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;br /&gt;
&lt;a href="http://picasaweb.google.com/lh/photo/zcD2gLZFaOc27a-AAvv7Lg?feat=embedwebsite"&gt;&lt;img src="http://lh3.ggpht.com/_YTmQMAUfDN8/S942lk4y-NI/AAAAAAAAUQw/_XG3VOWEw08/s400/2010-05-02-16.47.12.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;embed flashvars="host=picasaweb.google.com&amp;amp;hl=zh_TW&amp;amp;feat=flashalbum&amp;amp;RGB=0x000000&amp;amp;feed=http%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2FNomadLibra%2Falbumid%2F5466866889938749729%3Falt%3Drss%26kind%3Dphoto%26hl%3Dzh_TW" height="267" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://picasaweb.google.com/s/c/bin/slideshow.swf" type="application/x-shockwave-flash" width="400"&gt;&lt;/embed&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7597887370716014923-1618765616850652303?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/1618765616850652303/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=1618765616850652303&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/1618765616850652303'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/1618765616850652303'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2010/06/2010-05-02.html' title='2010 05 02 巴拉卡亂拍'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_YTmQMAUfDN8/S942lk4y-NI/AAAAAAAAUQw/_XG3VOWEw08/s72-c/2010-05-02-16.47.12.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-2772952212125891547</id><published>2010-04-25T01:21:00.001+08:00</published><updated>2010-06-15T01:25:05.857+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='攝影'/><title type='text'>2010 04 25 華山 Art Area</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;a href="http://picasaweb.google.com/lh/photo/Mu5-k3__O6tsaFe0xywA2A?feat=embedwebsite"&gt;&lt;img src="http://lh5.ggpht.com/_YTmQMAUfDN8/S9TzsDc4kjI/AAAAAAAAUKg/QpUsxzDoa94/s400/2010-04-25-12.35.02--.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;embed flashvars="host=picasaweb.google.com&amp;amp;hl=zh_TW&amp;amp;feat=flashalbum&amp;amp;RGB=0x000000&amp;amp;feed=http%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2FNomadLibra%2Falbumid%2F5464259755675980209%3Falt%3Drss%26kind%3Dphoto%26hl%3Dzh_TW" height="267" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://picasaweb.google.com/s/c/bin/slideshow.swf" type="application/x-shockwave-flash" width="400"&gt;&lt;/embed&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7597887370716014923-2772952212125891547?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/2772952212125891547/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=2772952212125891547&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/2772952212125891547'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/2772952212125891547'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2010/04/2010-04-25-art-area.html' title='2010 04 25 華山 Art Area'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_YTmQMAUfDN8/S9TzsDc4kjI/AAAAAAAAUKg/QpUsxzDoa94/s72-c/2010-04-25-12.35.02--.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-2273941091379585185</id><published>2010-04-18T17:46:00.001+08:00</published><updated>2010-04-18T17:47:14.979+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='彰化'/><category scheme='http://www.blogger.com/atom/ns#' term='旅行'/><category scheme='http://www.blogger.com/atom/ns#' term='台中'/><title type='text'>2010 04 16 大甲媽遶境 第四年</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;a href="http://picasaweb.google.com/lh/photo/ztRuWPy2TH7ZGusTLZxnvw?feat=embedwebsite"&gt;&lt;img src="http://lh6.ggpht.com/_YTmQMAUfDN8/S8rHeaCqLEI/AAAAAAAAScQ/HIxQMcN3Nq4/s400/2010-04-17-06.23.51-.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;embed flashvars="host=picasaweb.google.com&amp;amp;captions=1&amp;amp;hl=zh_TW&amp;amp;feat=flashalbum&amp;amp;RGB=0x000000&amp;amp;feed=http%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2FNomadLibra%2Falbumid%2F5461396779716228433%3Falt%3Drss%26kind%3Dphoto%26hl%3Dzh_TW" height="320" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://picasaweb.google.com/s/c/bin/slideshow.swf" type="application/x-shockwave-flash" width="500"&gt;&lt;/embed&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7597887370716014923-2273941091379585185?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/2273941091379585185/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=2273941091379585185&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/2273941091379585185'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/2273941091379585185'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2010/04/2010-04-16.html' title='2010 04 16 大甲媽遶境 第四年'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_YTmQMAUfDN8/S8rHeaCqLEI/AAAAAAAAScQ/HIxQMcN3Nq4/s72-c/2010-04-17-06.23.51-.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-1373832466465721555</id><published>2010-04-11T21:04:00.002+08:00</published><updated>2010-04-11T21:07:13.386+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='登山'/><category scheme='http://www.blogger.com/atom/ns#' term='台北'/><category scheme='http://www.blogger.com/atom/ns#' term='雪山山脈'/><title type='text'>2010 04 10 哈盆露營</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;br /&gt;
&lt;a href="http://picasaweb.google.com/lh/photo/loY2Fzpm34p7uOIe3BwFWA?feat=embedwebsite"&gt;&lt;img src="http://lh4.ggpht.com/_YTmQMAUfDN8/S8GgnpDQpjI/AAAAAAAASNo/OqJ3osPFmWY/s400/2010-04-10-16.48.24.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;embed flashvars="host=picasaweb.google.com&amp;amp;hl=zh_TW&amp;amp;feat=flashalbum&amp;amp;RGB=0x000000&amp;amp;feed=http%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2FNomadLibra%2Falbumid%2F5458820626605158961%3Falt%3Drss%26kind%3Dphoto%26hl%3Dzh_TW" height="320" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://picasaweb.google.com/s/c/bin/slideshow.swf" type="application/x-shockwave-flash" width="500"&gt;&lt;/embed&gt;&lt;br /&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/7597887370716014923-1373832466465721555?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/1373832466465721555/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=1373832466465721555&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/1373832466465721555'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/1373832466465721555'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2010/04/2010-04-10.html' title='2010 04 10 哈盆露營'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_YTmQMAUfDN8/S8GgnpDQpjI/AAAAAAAASNo/OqJ3osPFmWY/s72-c/2010-04-10-16.48.24.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-9055393165784396641</id><published>2010-04-05T22:51:00.001+08:00</published><updated>2010-04-05T22:51:55.076+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='分享'/><title type='text'>領悟</title><content type='html'>領悟 就是 辛曉琪 的歌&lt;br /&gt;
&lt;div style="text-align: center;"&gt;&lt;object height="385" width="480"&gt;&lt;param name="movie" value="http://www.youtube.com/v/yVnLhyVVmkc&amp;hl=zh_TW&amp;fs=1&amp;color1=0x3a3a3a&amp;color2=0x999999"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/yVnLhyVVmkc&amp;hl=zh_TW&amp;fs=1&amp;color1=0x3a3a3a&amp;color2=0x999999" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7597887370716014923-9055393165784396641?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/9055393165784396641/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=9055393165784396641&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/9055393165784396641'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/9055393165784396641'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2010/04/blog-post.html' title='領悟'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-6845508955760932448</id><published>2010-03-28T23:01:00.003+08:00</published><updated>2010-04-05T23:52:33.476+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='旅行'/><title type='text'>2010 03 28 淡水福佑宮</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;br /&gt;
&lt;a href="http://picasaweb.google.com/lh/photo/g4E2_O_2Mb00Ur1gQP8KaQ?feat=embedwebsite"&gt;&lt;img src="http://lh5.ggpht.com/_YTmQMAUfDN8/S69w98kuXKI/AAAAAAAAR1w/3mqs6C3uCMA/s400/2010-03-28-17.37.28.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;embed flashvars="host=picasaweb.google.com&amp;amp;hl=zh_TW&amp;amp;feat=flashalbum&amp;amp;RGB=0x000000&amp;amp;feed=http%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2FNomadLibra%2Falbumid%2F5453701799436110289%3Falt%3Drss%26kind%3Dphoto%26hl%3Dzh_TW" height="300" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://picasaweb.google.com/s/c/bin/slideshow.swf" type="application/x-shockwave-flash" width="500"&gt;&lt;/embed&gt;&lt;br /&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/7597887370716014923-6845508955760932448?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/6845508955760932448/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=6845508955760932448&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/6845508955760932448'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/6845508955760932448'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2010/04/2010-03-28.html' title='2010 03 28 淡水福佑宮'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_YTmQMAUfDN8/S69w98kuXKI/AAAAAAAAR1w/3mqs6C3uCMA/s72-c/2010-03-28-17.37.28.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-8974548474257819793</id><published>2010-03-27T22:58:00.002+08:00</published><updated>2010-04-05T23:53:15.127+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='登山'/><category scheme='http://www.blogger.com/atom/ns#' term='雪山山脈'/><title type='text'>2010 03 27 雲森瀑布</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;br /&gt;
&lt;a href="http://picasaweb.google.com/lh/photo/4XBMuvMmvCCyXX0HMirvjA?feat=embedwebsite"&gt;&lt;img src="http://lh5.ggpht.com/_YTmQMAUfDN8/S69wz_I6lpI/AAAAAAAAR0Q/WxJKperIryw/s400/2010-03-27-11.51.58.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;embed flashvars="host=picasaweb.google.com&amp;amp;hl=zh_TW&amp;amp;feat=flashalbum&amp;amp;RGB=0x000000&amp;amp;feed=http%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2FNomadLibra%2Falbumid%2F5453701609998364065%3Falt%3Drss%26kind%3Dphoto%26hl%3Dzh_TW" height="300" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://picasaweb.google.com/s/c/bin/slideshow.swf" type="application/x-shockwave-flash" width="500"&gt;&lt;/embed&gt;&lt;br /&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/7597887370716014923-8974548474257819793?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/8974548474257819793/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=8974548474257819793&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/8974548474257819793'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/8974548474257819793'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2010/03/2010-03-27.html' title='2010 03 27 雲森瀑布'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_YTmQMAUfDN8/S69wz_I6lpI/AAAAAAAAR0Q/WxJKperIryw/s72-c/2010-03-27-11.51.58.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-2279071438471781526</id><published>2010-03-23T14:46:00.001+08:00</published><updated>2010-03-23T14:47:24.169+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='COM'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>COM Managing Memory Allocation</title><content type='html'>回憶一下吧~&lt;br /&gt;
&lt;a href="http://msdn.microsoft.com/en-us/library/ms688453(VS.85).aspx"&gt;Managing Memory Allocation&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://msdn.microsoft.com/en-us/library/ms686638(VS.85).aspx"&gt;Memory Management Rules&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7597887370716014923-2279071438471781526?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/2279071438471781526/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=2279071438471781526&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/2279071438471781526'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/2279071438471781526'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2010/03/com-managing-memory-allocation.html' title='COM Managing Memory Allocation'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-1353447611729914449</id><published>2010-03-06T21:18:00.000+08:00</published><updated>2010-03-12T21:19:31.776+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='生活'/><category scheme='http://www.blogger.com/atom/ns#' term='台北'/><title type='text'>2010 03 06 迪化街</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;embed flashvars="host=picasaweb.google.com&amp;amp;hl=zh_TW&amp;amp;feat=flashalbum&amp;amp;RGB=0x000000&amp;amp;feed=http%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2FNomadLibra%2Falbumid%2F5445580668777097761%3Falt%3Drss%26kind%3Dphoto%26hl%3Dzh_TW" height="300" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://picasaweb.google.com/s/c/bin/slideshow.swf" type="application/x-shockwave-flash" width="520"&gt;&lt;/embed&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7597887370716014923-1353447611729914449?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/1353447611729914449/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=1353447611729914449&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/1353447611729914449'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/1353447611729914449'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2010/03/2010-03-06.html' title='2010 03 06 迪化街'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-7109719768375015330</id><published>2010-03-01T00:14:00.001+08:00</published><updated>2010-03-01T00:15:17.449+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='攝影'/><category scheme='http://www.blogger.com/atom/ns#' term='旅行'/><category scheme='http://www.blogger.com/atom/ns#' term='台北'/><title type='text'>2010 02 28 平溪天燈</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;embed flashvars="host=picasaweb.google.com&amp;amp;hl=zh_TW&amp;amp;feat=flashalbum&amp;amp;RGB=0x000000&amp;amp;feed=http%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2FNomadLibra%2Falbumid%2F5443315835303944465%3Falt%3Drss%26kind%3Dphoto%26hl%3Dzh_TW" height="300" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://picasaweb.google.com/s/c/bin/slideshow.swf" type="application/x-shockwave-flash" width="520"&gt;&lt;/embed&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7597887370716014923-7109719768375015330?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/7109719768375015330/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=7109719768375015330&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/7109719768375015330'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/7109719768375015330'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2010/03/2010-02-28.html' title='2010 02 28 平溪天燈'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-2999907711819604050</id><published>2010-02-19T23:54:00.002+08:00</published><updated>2010-02-19T23:57:48.270+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='漫畫'/><title type='text'>GANTZ 又回到了這房間...</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;br /&gt;
&lt;iframe frameborder="0" height="300" marginheight="0" marginwidth="0" scrolling="no" src="http://sketchup.google.com/3dwarehouse/mini?mid=724fc6bc4d78b0d345dcede991b68759&amp;amp;etyp=sw&amp;amp;width=400&amp;amp;height=300" width="400"&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_YTmQMAUfDN8/S3609IGbJ0I/AAAAAAAARcg/DVEL-4F4G_Q/s1600-h/gantz-sphere.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="253" src="http://4.bp.blogspot.com/_YTmQMAUfDN8/S3609IGbJ0I/AAAAAAAARcg/DVEL-4F4G_Q/s400/gantz-sphere.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&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/7597887370716014923-2999907711819604050?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/2999907711819604050/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=2999907711819604050&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/2999907711819604050'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/2999907711819604050'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2010/02/gantz.html' title='GANTZ 又回到了這房間...'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_YTmQMAUfDN8/S3609IGbJ0I/AAAAAAAARcg/DVEL-4F4G_Q/s72-c/gantz-sphere.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-2310420729700299131</id><published>2010-02-19T22:42:00.002+08:00</published><updated>2010-02-19T22:47:34.155+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='經驗'/><category scheme='http://www.blogger.com/atom/ns#' term='軟體工程'/><title type='text'>軟體的藝術 trade off</title><content type='html'>今天看了篇文張&amp;nbsp;&lt;a href="http://www.dotblogs.com.tw/blueimp/archive/2010/02/18/n-2010021802.aspx"&gt;程式設計的兩個觀點：架構狂還是效率狂？&lt;/a&gt;&amp;nbsp;覺得十分有趣也心有所感, 以下是我的想法:&amp;nbsp;我也算是個架構狂, 比較執著於彈性與複用, 所以 dependency 與 role and responsibility 的設計就非常龜毛. 但最近面對的工作對效率比架構還有著較嚴苛的要求, 如此的要求下變的必須以效率為導向來決定整體的架構. 有著最佳的效率意味著整體都要互相配合, dependency 就變的比較強也比較無法複用, 但贏得的是效率的提升, 這也是我這一兩年來對於架構跟效率有著比較不同的體認, trade off 就是軟體的藝術, 對&amp;nbsp;&lt;b&gt;效率&amp;nbsp;&lt;/b&gt;與&amp;nbsp;&lt;b&gt;架構&amp;nbsp;&lt;/b&gt;也不例外 :)&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_YTmQMAUfDN8/S36kYzGwkpI/AAAAAAAARcE/wOZ_Vzaj8y8/s1600-h/U2596P1T1D17628401F1394DT20090417082612.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://2.bp.blogspot.com/_YTmQMAUfDN8/S36kYzGwkpI/AAAAAAAARcE/wOZ_Vzaj8y8/s400/U2596P1T1D17628401F1394DT20090417082612.jpg" width="300" /&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/7597887370716014923-2310420729700299131?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/2310420729700299131/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=2310420729700299131&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/2310420729700299131'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/2310420729700299131'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2010/02/trade-off.html' title='軟體的藝術 trade off'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_YTmQMAUfDN8/S36kYzGwkpI/AAAAAAAARcE/wOZ_Vzaj8y8/s72-c/U2596P1T1D17628401F1394DT20090417082612.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-7441015980903300848</id><published>2010-02-18T01:28:00.001+08:00</published><updated>2010-02-20T00:55:49.729+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='桌遊'/><title type='text'>2010 02 14-18 Carcassonne</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;embed flashvars="host=picasaweb.google.com&amp;amp;hl=zh_TW&amp;amp;feat=flashalbum&amp;amp;RGB=0x000000&amp;amp;feed=http%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2FNomadLibra%2Falbumid%2F5438455855979963025%3Falt%3Drss%26kind%3Dphoto%26hl%3Dzh_TW" height="400" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://picasaweb.google.com/s/c/bin/slideshow.swf" type="application/x-shockwave-flash" width="550"&gt;&lt;/embed&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/7597887370716014923-7441015980903300848?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/7441015980903300848/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=7441015980903300848&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/7441015980903300848'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/7441015980903300848'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2010/02/2010-02-14-carcassonne.html' title='2010 02 14-18 Carcassonne'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-3859811834693678553</id><published>2010-02-12T14:13:00.010+08:00</published><updated>2010-02-13T17:03:23.279+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQLite'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>C++ Object Persistent for SQLite</title><content type='html'>上一篇文章我提到了 &lt;a href="http://sourceforge.net/apps/trac/litesql/"&gt;LiteSQL&lt;/a&gt;&amp;nbsp;的設計是利用 DB Schema (XML file) 來產生對應的 C++ Class, 而我的設計是從另一個角度出發 "設計 C++ 產生對應的 DB Schema" , 我設計了一系列的 Class, macro 跟 &amp;nbsp;template function 來達到 Object Persistent 這個目的, 而 SQLite 接合的部份我選擇了 &lt;a href="http://code.google.com/p/sqlite3pp/"&gt;SQLite3++&lt;/a&gt;&amp;nbsp;這個 SQLite3 backend library, 撰寫&amp;nbsp;Persistent Class 的時候只要利用這些東西就可以輕易的產生出可以&amp;nbsp;Persist 到 DB 的 class, 其中的功能包含簡易的 Reflection 跟 DB 對應的操作 function 諸如: CreateTable,&amp;nbsp;InsertInto,&amp;nbsp;UpdateAll,&amp;nbsp;UpdateModified,&amp;nbsp;SelectFromRow 等等... 以下是個使用的例子&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_YTmQMAUfDN8/S3TrUyGv4QI/AAAAAAAARIM/nL_9-qRkOUU/s1600-h/MLDBPersistSample.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="291" src="http://1.bp.blogspot.com/_YTmQMAUfDN8/S3TrUyGv4QI/AAAAAAAARIM/nL_9-qRkOUU/s400/MLDBPersistSample.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Persistent class declaration&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
當我們利用&amp;nbsp;macro 寫出這個 Class 的時候, 這些 macro 讓我們描述了 class MLDBPersistSample 所對應的 DB Schema 跟 metadata , 因為繼承自 MLDBPersistBase class, 所以擁有了上述 DB 操作的能力, 使用的時候就不需要再去組合 SQL 字串了 :D&amp;nbsp;要建立 Table 只要呼叫 CreateTable 這個 static function&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_YTmQMAUfDN8/S3TsB8Ty0tI/AAAAAAAARIQ/OlZ9GBcWqs4/s1600-h/CreateTable.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="15" src="http://4.bp.blogspot.com/_YTmQMAUfDN8/S3TsB8Ty0tI/AAAAAAAARIQ/OlZ9GBcWqs4/s400/CreateTable.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
它就會根據我們所描述的 metadata 產生出以下的 SQL statement&lt;br /&gt;
&lt;blockquote&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;b&gt;CREATE TABLE&lt;/b&gt; MLDBPersistSample(Column1 &lt;b&gt;TINYINT &lt;/b&gt;, Column2 &lt;b&gt;SMALLINT &lt;/b&gt;, Column3&lt;b&gt; INTEGER PRIMARY KEY AUTOINCREMENT&lt;/b&gt;, Column4 &lt;b&gt;BIGINT&lt;/b&gt; &lt;b&gt;DEFAULT &lt;/b&gt;0, Column5 &lt;b&gt;TEXT &lt;/b&gt;, Column6 &lt;b&gt;REAL NOT NUL&lt;/b&gt;L, Column7 &lt;b&gt;DATETIME &lt;/b&gt;, &lt;b&gt;CHECK&lt;/b&gt;(Column1 &amp;gt;= 0 &lt;b&gt;AND &lt;/b&gt;Column1 &amp;lt;= 5))&lt;/span&gt;&lt;/blockquote&gt;如果我們想要 insert 或是 update 一個 object 到 DB, 只要 (Column? 只是個例子, 實務上 Symbol 可以取得更有意義一點)&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_YTmQMAUfDN8/S3TswJ6DCYI/AAAAAAAARIU/TN347yC_nH8/s1600-h/InsertAndUpdate.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="90" src="http://1.bp.blogspot.com/_YTmQMAUfDN8/S3TswJ6DCYI/AAAAAAAARIU/TN347yC_nH8/s400/InsertAndUpdate.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
就能產生出以下的 SQL statement&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;&lt;b&gt;INSERT INTO &lt;/b&gt;MLDBPersistSample (Column3) &lt;b&gt;VALUES &lt;/b&gt;(?)&lt;/blockquote&gt;&lt;blockquote&gt;&lt;b&gt;UPDATE&lt;/b&gt; MLDBPersistSample &lt;b&gt;SET &lt;/b&gt;Column5 = ? &lt;b&gt;WHERE &lt;/b&gt;Column3 = ?&lt;/blockquote&gt;&amp;nbsp;問號 ? 的部分, 會利用 data binding 的方式傳給 SQLite 的 API&lt;br /&gt;
&lt;br /&gt;
Query 的部分, 我則是從 LiteSQL 例子中得到了一些啟發, 我實做了相對應的 query class 來產生對應的 SQL statement, 以下是個 C++ statement 與產生出 SQL statement 的結果&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_YTmQMAUfDN8/S3TwPa10afI/AAAAAAAARIY/5hKJ2835u04/s1600-h/SelectFromWhere.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="148" src="http://1.bp.blogspot.com/_YTmQMAUfDN8/S3TwPa10afI/AAAAAAAARIY/5hKJ2835u04/s320/SelectFromWhere.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;b&gt;SELECT&lt;/b&gt; MLDBPersistSample.Column3,MLDBPersistSample.Column5 &lt;b&gt;FROM &lt;/b&gt;MLDBPersistSample &lt;b&gt;WHERE &lt;/b&gt;(MLDBPersistSample.Column3 &amp;gt;?) AND (MLDBPersistSample.Column5==?) &lt;b&gt;ORDER BY &lt;/b&gt;MLDBPersistSample.Column1,MLDBPersistSample.Column2&lt;/blockquote&gt;我想這個部份是最有趣的, 也是 LiteSQL 最有創意的地方, 所以我也提供了這樣的使用方式, 利用這樣直覺得 C++ 操作可以產生出比較複雜一點點的 SQL query 真的是非常方便, 而且 C++ 的部分還會做&amp;nbsp;syntax checking, 而 10 跟 "hi" 的兩個 condition 會做&amp;nbsp;type checking, 並且兩個值會以 data binding 的方式傳給 SQLite API, 非常方便吧 :D&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7597887370716014923-3859811834693678553?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/3859811834693678553/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=3859811834693678553&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/3859811834693678553'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/3859811834693678553'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2010/02/object-persistent-for-c-for-sqlite.html' title='C++ Object Persistent for SQLite'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_YTmQMAUfDN8/S3TrUyGv4QI/AAAAAAAARIM/nL_9-qRkOUU/s72-c/MLDBPersistSample.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-7013377212649429352</id><published>2010-02-02T11:25:00.003+08:00</published><updated>2010-02-02T11:32:21.879+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQLite'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>LiteSQL - SQLite Object Persistent for C++</title><content type='html'>最近因為工作的原因需要用到 SQLite, Review 現有的 C++ Project, 我發覺我們現有 Project 在使用 SQLite 非常的不方便, 它使用最基本 (原始?!) 的方法自己組合 SQL statement 來操作 DB, 並建立一組 Class hierarchical 來 Modeling DB 的 Schema. 這樣設計的好處在於操作 DB 可以比較自主效能上也許會好些, Class&amp;nbsp;hierarchical 也可以比較複雜. 壞處則是, 許多 DB 的操作&amp;nbsp;SQL statement 都有固定的 pattern 這個部份可以抽離出來, 但是 Class,&amp;nbsp;statement&amp;nbsp;與 DB&amp;nbsp;Schema 的對應關係需要人工來維護. 能夠盡量減少人力來維護是我的目標, 所以, 我們需要一個有彈性的&amp;nbsp;SQLite Object Persistent Library.&lt;br /&gt;
&lt;br /&gt;
我 Survey 了一下現有的 C/C++&amp;nbsp;&lt;a href="http://www.sqlite.org/cvstrac/wiki?p=SqliteWrappers"&gt;SQLite wrapper project&lt;/a&gt;, 有支援&amp;nbsp;Object Persistent 的似乎只有 &lt;a href="http://sourceforge.net/apps/trac/litesql/"&gt;LiteSQL&lt;/a&gt;&amp;nbsp;這個 open source project, 是用 LiteSQL 必須使用 XML 來定義&amp;nbsp;DB&amp;nbsp;Schema, 並使用他們提供的 Code generator 來產生 C++ Modeling 的程式碼, 以下是官網上面的 &lt;a href="http://sourceforge.net/apps/trac/litesql/wiki/Examples"&gt;example&lt;/a&gt;. &lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_YTmQMAUfDN8/S2eV-sgqBiI/AAAAAAAAQ5k/Io0JYbGypow/s1600-h/LiteSQL%20DB%20Schema.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="113" src="http://1.bp.blogspot.com/_YTmQMAUfDN8/S2eV-sgqBiI/AAAAAAAAQ5k/Io0JYbGypow/s320/LiteSQL%20DB%20Schema.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;b&gt;&lt;i&gt;PersonDatabase &lt;/i&gt;&lt;/b&gt;db("sqlite3", "database=person.db");&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&lt;b&gt;&lt;i&gt;Person&lt;/i&gt;&lt;/b&gt;&lt;i&gt; &lt;/i&gt;person(db);&lt;br /&gt;
person.name = "Bob"; // assign values to fields&lt;br /&gt;
person.age = 20;&lt;br /&gt;
person.update(); // writes a new record to database&lt;/blockquote&gt;我們可以輕易的操作 Person 物件來建立/改變 DB 中的 record, 該例子隱藏了&amp;nbsp;SQL statement 並且轉換成較我們較直覺得物件化操作, 對於 Relation 的部分, LiteSQL 可以建立 Relation-class 來 Modeling 兩個&amp;nbsp;Persistent&amp;nbsp;Object 之間的關係,&amp;nbsp;這樣的設計在 C# 那種具有完整 Reflection 能力的語言中是非常容易實做, 但在 C/C++ 中則是非常困難.&lt;br /&gt;
&lt;br /&gt;
除了Object Persistent 之外,&amp;nbsp;LiteSQL&amp;nbsp;還提供了一下的 select 語句來方便查詢&lt;br /&gt;
&lt;blockquote&gt;&lt;b&gt;&lt;i&gt;PersonDatabase &lt;/i&gt;&lt;/b&gt;db("sqlite3", "database=person.db");&lt;br /&gt;
vector&lt;person&gt; = &lt;b&gt;select&lt;/b&gt;&lt;person&gt;(db).all();&lt;/person&gt;&lt;/person&gt;&lt;br /&gt;
&lt;b&gt;&lt;i&gt;Person &lt;/i&gt;&lt;/b&gt;bob = &lt;b&gt;select&lt;/b&gt;&lt;person&gt;(db, Person::Name == "Bob").one();&lt;/person&gt;&lt;/blockquote&gt;這個&amp;nbsp;library 給我不少的啟發, 但我實際上試用它卻有不小的挫折, 原因在於我們使用的&amp;nbsp;DB&amp;nbsp;Schema 似乎無法產生正確的 class, 畢竟這個計畫目前的狀態仍然是在&amp;nbsp;proof-of-concept implementation 的階段.&lt;br /&gt;
&lt;br /&gt;
我遇到的另一個問題是,&amp;nbsp;LiteSQL&amp;nbsp;是使用 Gen-Code 的方式來產生 Modeling Class, 所以, 如果&amp;nbsp;DB&amp;nbsp;Schema 改變了, 程式碼應該有不小幅度的改變 (我想無法避免), 但是開發過程中 Schema 改變是免不了的, 所以我嘗試設計了一個以 class modeling 為主的方式來產生&amp;nbsp;DB&amp;nbsp;Schema, 只要遵照一定的 class 設計方式, 就能夠利用類似&amp;nbsp;Reflection&amp;nbsp;的方式還產生 Schema 與 record 操作, 主要是配合 macro 跟 template 的方法來實現, 目前我還在設計中, 有機會再跟大家分享 :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7597887370716014923-7013377212649429352?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/7013377212649429352/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=7013377212649429352&amp;isPopup=true' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/7013377212649429352'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/7013377212649429352'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2010/02/litesql-sqlite-object-persistent-for-c.html' title='LiteSQL - SQLite Object Persistent for C++'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_YTmQMAUfDN8/S2eV-sgqBiI/AAAAAAAAQ5k/Io0JYbGypow/s72-c/LiteSQL%20DB%20Schema.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-158166470541575643</id><published>2010-01-19T20:43:00.009+08:00</published><updated>2010-01-20T00:12:27.641+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WPF'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='ETW'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Performance'/><title type='text'>ETW Scenario library and Real-time ETW Viewer</title><content type='html'>微軟在 Windows 2000 之後引入了 Performance Monitoring&amp;nbsp;機制&amp;nbsp;- &lt;span style="color: #93c47d;"&gt;Event Tracing for Windows ETW&lt;/span&gt;, 而在 Windows Vista 對於 ETW 有更多的改進, Vista 導入了 Unified event provider model 與新的 APIs 讓我們可以用一致的方式來處理 ETW event. 你不難發現微軟已經大量的整合 ETW event 到 CPU scheduler, File system, GPU Driver, Image Loader, .NET Framework JIT, GC, WPF render engine 等... 重要的模組中,&amp;nbsp;因為 ETW 是 Kernel build-in 等多種特性所以在使用上有較小的效能影響, 並且可以收集到&amp;nbsp;System-wide 的資訊. 微軟也為此提供豐富的 Tools 來支援軟體開發與 Performance tuning, 諸如 &amp;nbsp;Microsoft Windows Performance Toolkit, Visual Profile, Logman, Reliability and Performance Monitor (RPM)...&lt;br /&gt;
&lt;br /&gt;
但是, 如果我們要開發自己的 ETW event provider, 並且有圖形化的介面可以幫助我們了解效能上的問題有現成的 tool 嗎? 有的,&amp;nbsp;Microsoft Windows Performance Toolkit 中的&amp;nbsp;Event Trace 或是&amp;nbsp;xperfview 都可以幫助我們圖型化我們自製的&amp;nbsp;ETW event, 但是, 它只能提供一般性的呈現方式, 原因很簡單, 因為這些 tool 並沒有足夠的 domain knowledge 來解釋這些 event, 所以他只能以 Generic&amp;nbsp;event 的方式呈現, 如此我們只能以時間分佈的單一維度來觀察我們的 event, 其實這並不方便&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_YTmQMAUfDN8/S1WirF7on1I/AAAAAAAAO7E/KBnEtfwKd4o/s1600-h/xperfview%20and%20generic%20event.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="167" src="http://1.bp.blogspot.com/_YTmQMAUfDN8/S1WirF7on1I/AAAAAAAAO7E/KBnEtfwKd4o/s400/xperfview%20and%20generic%20event.png" width="400" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;b&gt;xperfview &lt;/b&gt;- Generic&amp;nbsp;event 只能看到事件發生的時間點&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
之前曾在微軟的 Blog 看到人家發問 "xperfview &amp;nbsp;是否能夠支援擴充" 不過到目前為止的答案是否定的, 其次&amp;nbsp;xperf 因為效率的考量所以只有提供 offline 的方式來分析&amp;nbsp;ETW event, 但對於有些特定的 use case 下將會非常麻煩, 我們總想知道使用者互動下效能與操作行為的相關性, real-time 的方式分析有時候比較快速與直覺, 有鑑於此我們就自己開發了簡單的 ETW Viewer 來幫助我們做到這些事情.&lt;br /&gt;
&lt;br /&gt;
首先, 我們要定義比&amp;nbsp;Generic&amp;nbsp;event 在豐富那麼一點點的語意來表達更多的資訊, 並且在 Client 的整合上可以更方便快速, 所以我們選擇一個 MSDN Code Gallery 上 ETW 相關的 Project - &lt;a href="http://code.msdn.microsoft.com/Scenario/Wiki/View.aspx?title=Home"&gt;Scenario&lt;/a&gt;&amp;nbsp;來做為整合的目標,&amp;nbsp;Scenario 是個 ETW event provider 的實做體, 它提供了 Native 與 Managed code 的兩種實做版本, 在 event 的格式部分,&amp;nbsp;因為&amp;nbsp;Scenario ETW Format 有定義了兩個值&amp;nbsp;Category (Unicode string) 與 Size (int64) 來讓我們描述&amp;nbsp;Client 想要描述的 "量" (你可以用來描述 FPS, cache miss rate 等等自訂的語意), 使用&amp;nbsp;Scenario 可以說非常的簡單, 我們只要埋入幾個特定的 check points: Begin, Step, End 在我們想觀察的 case 中, 並且將我們自訂的數值傳遞給&amp;nbsp;Scenario 就夠了. 就像:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;// C#:&amp;nbsp;Generate an ETW event (when enabled by an ETW controller)&lt;br /&gt;
using Scenario;&lt;br /&gt;
...&lt;br /&gt;
Scenario timer = new Scenario();&lt;br /&gt;
timer.Begin(); &lt;b&gt;&lt;span style="color: red;"&gt;// checkpoint 1&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
// ...&lt;br /&gt;
// Code that you want to time&lt;br /&gt;
// ..&lt;br /&gt;
timer.Step(&lt;b&gt;&lt;span style="color: red;"&gt;size&lt;/span&gt;&lt;/b&gt;)&amp;nbsp;&lt;b&gt;&lt;span style="color: red;"&gt;// checkpoint 2&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
// ...&lt;br /&gt;
// Code that you want to time&lt;br /&gt;
// ..&lt;br /&gt;
timer.End();&amp;nbsp;&lt;b&gt;&lt;span style="color: red;"&gt;// checkpoint 3&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
以上的程式為例,&amp;nbsp;Scenario 就會幫我們把 3 個&amp;nbsp;checkpoint 的時間間隔量出來, 並且把我們自訂的 Size 值也跟著傳給 ETW&amp;nbsp;consumer.&lt;br /&gt;
&lt;br /&gt;
接下來我們的問題就是如何顯示這個收集到的 event , 我們使用了 C# 開發了一個簡單的 WinForm 程式, 這個程式包含了一個&amp;nbsp;ETW&amp;nbsp;controller 跟 ETW&amp;nbsp;consumer,&amp;nbsp;ETW&amp;nbsp;controller 有能力動態的 Enable 或 Disable 指定的 ETW event, 在配合&amp;nbsp;Scenario 的設計下當一個 ETW event 被 Disable 時我們所 monitor 的程式除了一些簡單的判斷式, 它將不會執行 ETW provider 相關的程式碼,&amp;nbsp;這樣能確保在 Disable 的狀況下只有很少的效能損失. 利用&amp;nbsp;ETW&amp;nbsp;consumer 我們能即時且非同步的方式處理收到的 event, 並將其 Size 與&amp;nbsp;checkpoint 的時間顯示在 UI 的笛卡兒座標上, 這就是我們希望視覺化的部分. 此外, 這個程式也有能力將這些資訊寫進 SQLite 的 database 中, 這樣的好處是, 我們可以在將來更輕易的整合到 Auto testing 與 Build process 中. 以下就是 &amp;nbsp;Real-time ETW Viewer 的 Snapshot!&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_YTmQMAUfDN8/S1WoXrAS6yI/AAAAAAAAO7I/mXPCVABQOVg/s1600-h/ETWScenarioViewer.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="266" src="http://1.bp.blogspot.com/_YTmQMAUfDN8/S1WoXrAS6yI/AAAAAAAAO7I/mXPCVABQOVg/s400/ETWScenarioViewer.png" width="400" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; font-size: small;"&gt;&lt;b&gt;ETW Realtime Scenario Viewer - &lt;/b&gt;timeline view&lt;/span&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_YTmQMAUfDN8/S05-sYduFsI/AAAAAAAAOvs/3FjDs4CzX5c/s1600-h/ETWScenarioViewer.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="256" src="http://1.bp.blogspot.com/_YTmQMAUfDN8/S05-sYduFsI/AAAAAAAAOvs/3FjDs4CzX5c/s400/ETWScenarioViewer.png" width="400" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; font-size: small;"&gt;&lt;b&gt;ETW Realtime Scenario Viewer -&amp;nbsp;&lt;/b&gt;list view&lt;/span&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; font-size: small;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;"&gt;&lt;a href="http://msdn.microsoft.com/en-us/magazine/cc163437.aspx"&gt;Improve Debugging And Performance Tuning With ETW&lt;/a&gt; 是篇還蠻具體而微的文章, 對於這方面有興趣的人可以參考.&lt;/span&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/7597887370716014923-158166470541575643?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/158166470541575643/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=158166470541575643&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/158166470541575643'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/158166470541575643'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2010/01/etw-scenario-library-and-real-time-etw.html' title='ETW Scenario library and Real-time ETW Viewer'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_YTmQMAUfDN8/S1WirF7on1I/AAAAAAAAO7E/KBnEtfwKd4o/s72-c/xperfview%20and%20generic%20event.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-6800766400506971551</id><published>2010-01-17T16:09:00.004+08:00</published><updated>2010-01-17T16:18:24.976+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='登山'/><category scheme='http://www.blogger.com/atom/ns#' term='大屯火山彙'/><title type='text'>2010 01 17 陽明山七星池</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;embed type="application/x-shockwave-flash" src="http://picasaweb.google.com/s/c/bin/slideshow.swf" width="550" height="400" flashvars="host=picasaweb.google.com&amp;hl=zh_TW&amp;feat=flashalbum&amp;RGB=0x000000&amp;feed=http%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2FNomadLibra%2Falbumid%2F5427614905458437025%3Falt%3Drss%26kind%3Dphoto%26hl%3Dzh_TW" pluginspage="http://www.macromedia.com/go/getflashplayer"&gt;&lt;/embed&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;iframe width="550" height="400" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="http://maps.google.com.tw/maps?hl=zh-TW&amp;amp;ie=UTF8&amp;amp;t=k&amp;amp;brcurrent=3,0x3442b11620cdabf1:0x33fed2377fc79368,1,0x345d5538b0939f79:0xd16180625ca0e075&amp;amp;ll=25.174456,121.550691&amp;amp;spn=0.001942,0.002956&amp;amp;z=18&amp;amp;output=embed"&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;small&gt;&lt;a href="http://maps.google.com.tw/maps?hl=zh-TW&amp;amp;ie=UTF8&amp;amp;t=k&amp;amp;brcurrent=3,0x3442b11620cdabf1:0x33fed2377fc79368,1,0x345d5538b0939f79:0xd16180625ca0e075&amp;amp;ll=25.174456,121.550691&amp;amp;spn=0.001942,0.002956&amp;amp;z=18&amp;amp;source=embed" style="color:#0000FF;text-align:left"&gt;檢視較大的地圖&lt;/a&gt;&lt;/small&gt;&lt;br /&gt;
&lt;br /&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/7597887370716014923-6800766400506971551?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/6800766400506971551/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=6800766400506971551&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/6800766400506971551'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/6800766400506971551'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2010/01/2010-01-17.html' title='2010 01 17 陽明山七星池'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><thr:total>0</thr:total><georss:featurename>112台灣台北市北投區湖田里</georss:featurename><georss:point>25.174543656552625 121.55084609985352</georss:point><georss:box>25.173330156552627 121.54902209985352 25.175757156552624 121.55267009985351</georss:box></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-6927673964154354162</id><published>2010-01-13T22:21:00.004+08:00</published><updated>2010-01-13T22:26:44.955+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='哲學'/><category scheme='http://www.blogger.com/atom/ns#' term='軟體工程'/><title type='text'>什麼是好的軟體?</title><content type='html'>&lt;br/&gt;&lt;br /&gt;
實務派的人說: &lt;br /&gt;
&lt;blockquote&gt;軟體是種高度特化的藝術品, 所以裡面怎麼做不重要, 只要整體的功能與效率符合需求並且執行的很好, 最好能夠用最低的成本來達到目標就是王道.&lt;br /&gt;
&lt;/blockquote&gt;架構派的人說: &lt;br /&gt;
&lt;blockquote&gt;軟體是種有系統性的積木, 為了增加複用性與生產力, 降低擴充與維護的成本, 架構是軟體的靈魂.&lt;br /&gt;
&lt;/blockquote&gt;產品派的人說: &lt;br /&gt;
&lt;blockquote&gt;軟體只要功能多成本低, 能快速生產能夠高度客製化, 在效能上有好的表現, 很少 BUG 就是好軟體.&lt;br /&gt;
&lt;/blockquote&gt;使用者說: &lt;br /&gt;
&lt;blockquote&gt;軟體只要便宜 (最好不用錢), 好用, 快速就是好軟體.&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
軟體的特性還蠻複雜的, 它有著生產,&amp;nbsp;運作, 維護&amp;nbsp;時間長, 複製成本極低, 規格變動,&amp;nbsp;汰換率與人事變動成本高, 不易維護, 除錯與驗證等多種複雜特性. 要減少這些特性的缺點增加其優點是很明確的目標, 所以上面沒有一種人說錯, 軟體是在上述的多種衝突需求中找到一個最佳的平衡點就是好軟體. 但怎樣的平衡是正確的選擇就有很大的學問,&lt;br /&gt;
&lt;br /&gt;
舉個例子: timing 就是市場的一切, 快速的做出產品可以爭取更多的機會來把握&amp;nbsp;timing, 然而好的架構會因為降低耦合增加彈性等多種考量而延長產品的開發時間, 有時候這些設計可能在當下會被視為 over design 而被捨棄或忽略, 某個層面這是對的. 如果這個產品賣得好而延長了程式與架構的生命週期, 接下來要面對的就是該產品的架構會因為未來的需求而受到考驗, 好的架構也可以降低維護的成本. 所以這個平衡的因子似乎因為生命週期而有不同的選擇, 儘管軟體的生命週期會因為市場的反應而難以評估, 有些軟體可能會沿用個 10 年, 有些則只會出一個版本.&lt;br /&gt;
&lt;br /&gt;
再舉個例子:&amp;nbsp;架構的取捨有時候還得考量 programmer 的技術能力, 也許你會遇到一個窘境是你使用了一堆很棒的 design pattern 但你的同事卻一個也看不懂還是能存活下來. 你該用易懂直觀的架構還是稍微難懂但頗富彈性的架構呢?&lt;br /&gt;
&lt;br /&gt;
再再舉個例子: 如果有個公司就是做 OEM 或是硬體驅動程式 BIOS 這類強烈需求導向的工作, 也許這個軟體一但 GM 就等於進了墳墓, reuse 對這類型的工作也許毫不重要, 也可能這些具有 reuse 特性的部分人家都已經做好了等著你用, 這樣的公司文化與工作特質下, 怎樣的選擇好呢?&lt;br /&gt;
&lt;br /&gt;
什麼是好的軟體? 因為人, 因為時間, 因為佈署的方式, 因為舊有的包袱, 因為公司的文化與營運方式有著截然不同的答案. 連怎樣評估軟體是好是壞都是如此的複雜...&lt;br /&gt;
&lt;br/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7597887370716014923-6927673964154354162?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/6927673964154354162/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=6927673964154354162&amp;isPopup=true' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/6927673964154354162'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/6927673964154354162'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2010/01/blog-post.html' title='什麼是好的軟體?'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-8167450583014000417</id><published>2010-01-09T02:27:00.018+08:00</published><updated>2010-02-07T01:20:58.147+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET 4'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='NGen'/><title type='text'>幾個關於 .NET Framework 4 的幾個疑惑與希望...</title><content type='html'>.NET Framework 3.5 以來, 普及率一直不是很理想, 微軟也針對關鍵性的幾個因素做改善, 一下的幾點筆記是該去研究一下 :P&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;&lt;span style="line-height: 21px;"&gt;&lt;span style="font-family: inherit;"&gt;大家都知道 .NET 的 Application 的啟動時間可能會很慢, JIT 是個原因之一, 利用 NGEN 來改善 Startup Performance 是微軟提供的一種解決方法, 我們是該驗證一下這個方式, 有幾篇文章可以追一下:&amp;nbsp;&lt;/span&gt;&lt;a href="http://msdn.microsoft.com/en-us/magazine/cc163610.aspx"&gt;&lt;span style="font-family: inherit;"&gt;The Performance Benefits of NGen&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: inherit;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;a href="http://msdn.microsoft.com/en-us/magazine/dd569747.aspx"&gt;&lt;span style="font-family: inherit;"&gt;CLR Optimizations In .NET Framework 3.5 SP1&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: inherit;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: inherit;"&gt;&lt;a href="http://blogs.msdn.com/clrcodegeneration/archive/2009/05/03/Improvements-to-NGen-in-.NET-Framework-4.aspx"&gt;Improvements to NGen in .NET Framework 4&lt;/a&gt;,&amp;nbsp;&lt;a href="http://blogs.msdn.com/clrcodegeneration/archive/2007/09/15/to-ngen-or-not-to-ngen.aspx"&gt;To NGen or Not to NGen?&lt;/a&gt;,&amp;nbsp;&lt;a href="http://blogs.msdn.com/jgoldb/archive/2007/10/10/improving-wpf-applications-startup-time.aspx"&gt;Improving WPF applications startup time&lt;/a&gt;,&amp;nbsp;&lt;a href="http://blogs.msdn.com/jgoldb/archive/2007/12/10/splash-screen-to-improve-wpf-application-perceived-cold-startup-performance.aspx"&gt;Splash Screen To Improve WPF Application Perceived Cold Startup Performance&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
我驗證的結果, WPF 的 Cold/Cool Startup time 還是很久, 即使用了 NGen 速度還是沒辦法像 native code 一樣.&lt;br /&gt;
&lt;span style="line-height: normal;"&gt;&lt;span style="line-height: 21px;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: inherit;"&gt;WPF 與 Direct3D &amp;nbsp;的 footprint 差異有多大, WPF  的記憶體使用量一直為人所詬病 (相較於MFC), 不知道 4.0 是否有改善&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: inherit;"&gt;.NET Framework 的 installer size 一向不小, 所以微軟設計了.NET Framework 4 Client Profile 還有Web Bootstrapper, 文章上描述&amp;nbsp;.NET Framework 4 Client Profile&amp;nbsp;的安裝不一定需要 Reboot 並且可以&amp;nbsp;Parallel Download and Install, 這個也是需要追一下:&amp;nbsp;&lt;a href="http://social.msdn.microsoft.com/Forums/zh-HK/netfxsetupprerelease/thread/86a7accc-8bad-4bd9-9340-73f629cb522b"&gt;What's up with the "Reboot" step?&lt;/a&gt;&amp;nbsp;, &lt;a href="http://blogs.msdn.com/pmarcu/archive/2009/09/30/net-framework-4-0-beta-2-deployment.aspx"&gt;The .NET Framework 4.0 Beta 2 Installer Improvements&lt;/a&gt;,&amp;nbsp;&lt;a href="http://blogs.msdn.com/jgoldb/archive/2009/10/19/what-s-new-in-net-framework-4-client-profile-beta-2.aspx"&gt;What’s new in .NET Framework 4 Client Profile Beta 2&lt;/a&gt;, &lt;a href="http://download.microsoft.com/download/5/a/a/5aa86d6c-969b-42d8-bc6b-30e02bfeccf0/NETFXClientProfile_DeploymentGuide.htm#_Toc205028506"&gt;.NET Framework Client Profile Deployment Guide&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Installer size 已經比以前小很多了, 但是 install size 還是一樣肥的嚇人, 以 x86 為例, installer 的大小大約是 30.9 MB, 但是解壓縮加上 JIT 之後的大小需要 850 MB 左右, 這真的讓人卻步, 不過我承認 installer 縮小有助於程式在網路上散佈. 不過如果我想寫個 WPF 小軟體卻要求使用者要有 850 MB 的空間來安裝我的軟體, 應該沒有幾個使用者能夠接受.&lt;br /&gt;
&lt;br /&gt;
今天在別人的電腦嘗試安裝 Client profile 結果 installer 還是要求重新開機, 仔細觀察 MsiInstaller 的 log 發現這台電腦必須重新開機有幾個原因:&lt;br /&gt;
C:\WINDOWS\system32\dfshim.dll 正在被下列處理名稱所使用中: explorer 識別碼 1920&lt;br /&gt;
C:\WINDOWS\system32\mscoree.dll 正在被下列處理名稱所使用中: explorer 識別碼 1920&lt;br /&gt;
C:\WINDOWS\system32\mscoree.dll 正在被下列處理名稱所使用中: iexplore 識別碼 220&lt;br /&gt;
C:\WINDOWS\system32\mscoree.dll 正在被下列處理名稱所使用中: iexplore&lt;/span&gt; 識別碼 1764&lt;br /&gt;
&lt;br /&gt;
這台電腦的使用者算是個很基本的 End user 所以電腦安裝的軟體並沒有什麼特別之處但是還是被要求重新開機, 原因是 IE 跟 Shell 都佔住了 .NET Framework 的 runtime, 看來狀況並不明朗啊.. 然後查了一下 MSDN 發現, Client profile 的 installer 提供 &lt;a href="http://msdn.microsoft.com/en-us/library/ee390831(VS.100).aspx"&gt;command parameter&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;/norestart: Setup doesn’t reboot automatically. The chaining application needs to capture the return code and process and handle reboot if this switch is used.&lt;/blockquote&gt;但也只是暫時讓他不需要 reboot 罷了. &lt;br /&gt;
&lt;br /&gt;
根據 张羿的文章 &lt;a href="http://blogs.msdn.com/yizhang/archive/2007/11/05/net-mscoree-dll.aspx"&gt;".NET中的幕后英雄MSCOREE.dll "&lt;/a&gt; 所描述,&amp;nbsp;mscoree.dll 提供了 _CorExeMain 這個進入點做為&amp;nbsp;CLR 程式啟動之用, 重點是不管哪個版本的 .NET Framework 都是用這支&amp;nbsp;DLL&amp;nbsp;來啟動,&amp;nbsp;所以 mscoree.dll 在系統中只會有兩支 (32/64bit), 而 .NET Framework 4.0 似乎需要置換掉這個檔案, 所以重新開機也許在所難免. 除非類似 SxS 的方式使用私有的 mscoree.dll, 而 张羿 似乎有找到解決的方法不過還沒分享出來, 詳細可以參考 &lt;a href="http://blogs.msdn.com/yizhang/archive/2009/09/03/net-4-0-mscoree-dll-mscoreei-dll-reboot.aspx"&gt;".NET 4.0新功能：Mscoree.dll + Mscoreei.dll=更少的Reboot"&lt;/a&gt;　&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7597887370716014923-8167450583014000417?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/8167450583014000417/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=8167450583014000417&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/8167450583014000417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/8167450583014000417'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2010/01/net-framework-4.html' title='幾個關於 .NET Framework 4 的幾個疑惑與希望...'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-8504448404267810593</id><published>2010-01-08T01:53:00.010+08:00</published><updated>2010-01-09T00:05:06.839+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='COM'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Structured Storage'/><category scheme='http://www.blogger.com/atom/ns#' term='Performance'/><title type='text'>免費的 "IStream, IPropertyStorage" system-provided, stand-alone implementation COM</title><content type='html'>&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: inherit;"&gt;相信寫過&amp;nbsp;.NET&amp;nbsp;C# 的人對於&amp;nbsp;&lt;/span&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.io.memorystream.aspx"&gt;&lt;span style="font-family: inherit;"&gt;System.IO.MemoryStream&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: inherit;"&gt;&amp;nbsp;這樣的物件都感到十分方便, 因為MemoryStream 會在需要的時候自己&amp;nbsp;ReAlloc 來改變大小, 並且由於&amp;nbsp;MemoryStream 繼承自 Stream 這個 class 所以用途十分廣泛. 其實 COM 也有相似的設計 (不如說&amp;nbsp;.NET Framework&amp;nbsp;學 COM 的) COM 有定義一個基本的 interface &lt;/span&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa380034(VS.85).aspx"&gt;&lt;span style="font-family: inherit;"&gt;IStream&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: inherit;"&gt;, 概念上 IStream 就如同 .NET 中的&amp;nbsp;Stream 一樣, 不過它是 interface 而不是&amp;nbsp;abstract class, 在 COM 的世界裡 interface 是種 protocol, 所以任何人都可以實做&amp;nbsp;IStream 的 COM, 並且跟認得 IStream 的其它 COM 合作. 我之前就有寫過一個實做&amp;nbsp;IStream 的 COM, 它支援 non-buffering 的方式來 OpenFile. MSDN 就有一篇文章來教大家怎麼時做一個&amp;nbsp;FileStream - &lt;/span&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms752876(VS.85).aspx"&gt;&lt;span style="font-family: inherit;"&gt;Default IStream Implementation&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: inherit;"&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: inherit;"&gt;COM 的定位並不是個&amp;nbsp;Framework 所以沒有那麼多現成的 class 可以使用, 而且系統提供的 COM implement 也少的可憐. 但是 OLE32.DLL 還是提供了類似&amp;nbsp;MemoryStream 這類好用的東西, 我們可以使用&amp;nbsp;&lt;/span&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa378980(VS.85).aspx"&gt;&lt;span style="font-family: inherit;"&gt;CreateStreamOnHGlobal&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: inherit;"&gt;&amp;nbsp;來建立一個實做&amp;nbsp;IStream 的 COM instance, 而這個&amp;nbsp;instance 的功能就如同&amp;nbsp;MemoryStream 一樣會自動&amp;nbsp;ReAlloc. &amp;nbsp;當然 OLE32 也允許你從 IStream 拿到 HGlobal 的 HANDLE, 我們只要呼叫&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: inherit;"&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa379145(VS.85).aspx"&gt;GetHGlobalFromStream&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;&lt;span style="font-family: inherit;"&gt;HGLOBAL handle = NULL;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: inherit;"&gt;CComPtr spStream;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: inherit;"&gt;HRESULT hr = ::CreateStreamOnHGlobal(handle , FALSE, &amp;amp;spStream);&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: inherit;"&gt;hr = ::GetHGlobalFromStream(spStream,&amp;nbsp;handle);&lt;/span&gt;&lt;br /&gt;
&lt;/blockquote&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: inherit;"&gt;一但有了這個類似&amp;nbsp;MemoryStream 的 IStream 實做體, 我們還可以利用更多 OLE32 提供的功能, 例如&amp;nbsp;&lt;/span&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa379968(VS.85).aspx"&gt;&lt;span style="font-family: inherit;"&gt;IPropertyStorage&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: inherit;"&gt;, IPropertyStorage 這個 interface 的功能是個用來存放 property 的&amp;nbsp;container, property 可以是&amp;nbsp;&lt;/span&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa380072(VS.85).aspx"&gt;&lt;span style="font-family: inherit;"&gt;PROPVARIANT&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: inherit;"&gt;&amp;nbsp;所支援的任何 type, WIC 就是用&amp;nbsp;PROPVARIANT 來記錄存放在 JPEG EXIF 中的 metadata 詳細可以參考&amp;nbsp;&lt;/span&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee690266(VS.85).aspx"&gt;&lt;span style="font-family: inherit;"&gt;IWICEnumMetadataItem&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: inherit;"&gt;&amp;nbsp;(說遠了), 為什麼要介紹&amp;nbsp;IPropertyStorage 呢, 因為 OLE32 又提供了一個&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: inherit;"&gt;system-provided, stand-alone implementation 的實做體, 我們只要提供 IStream 或是 IStorage 給傳給&amp;nbsp;&lt;/span&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa380327(VS.85).aspx"&gt;&lt;span style="font-family: inherit;"&gt;StgCreatePropStg&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: inherit;"&gt;&amp;nbsp;這個 API, 它就會送一個&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: inherit;"&gt;IPropertyStorage&amp;nbsp;的&amp;nbsp;instance 給我們, 我想&amp;nbsp;property bag 這種東西的方變程度就不用說了.&amp;nbsp;有注意到嗎? 我們只要結合&amp;nbsp;CreateStreamOnHGlobal 和&amp;nbsp;StgCreatePropStg, 它就可以幫我們建立一個在記憶體中的&amp;nbsp;property bag, 這是何等的方便與容易呢?&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: inherit;"&gt;延伸思考一下&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: inherit;"&gt;IStream&amp;nbsp;能不能在 .NET 中使用呢? 當然可以啊因為&amp;nbsp;IStream 是 COM 呢, 連 .NET Framework 都有對應的&amp;nbsp;Interop interface&amp;nbsp;&lt;/span&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.comtypes.istream.aspx"&gt;&lt;span style="font-family: inherit;"&gt;System.Runtime.InteropServices.ComTypes.IStream&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: inherit;"&gt;&amp;nbsp;而&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: inherit;"&gt;IPropertyStorage 則對應於&amp;nbsp;MS.Internal.IO.Packaging.CompoundFile.UnsafeNativeIPropertyStorage, 不過似乎沒有公開 ...&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: inherit;"&gt;(後來查了一下 MSDN 發現&amp;nbsp;&lt;/span&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.ole.interop(VS.80).aspx"&gt;&lt;span style="font-family: inherit;"&gt;Microsoft.VisualStudio.OLE.Interop&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: inherit;"&gt;&amp;nbsp;有公開對應大部分 OLE32 的介面, 不過放在一個很怪的 DLL 中&amp;nbsp;microsoft.visualstudio.ole.interop.dll&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: inherit;"&gt;)&amp;nbsp;&lt;/span&gt;而 IStream 與 Stream 的轉換則有&amp;nbsp;DataStreamFromComStream 與 ComStreamFromDataStream 兩個 wrapper class 可以使用, 不過都包在&amp;nbsp;System.Windows.Forms.UnsafeNativeMethods 這個 internal class 中, 微軟真的很小氣 = =. 不過&amp;nbsp;UnsafeNativeMethods 真的是大個誇張啊, 大家可以用 .NET Reflector 看一下就可以知道了.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: inherit;"&gt;順帶一提&amp;nbsp;&lt;/span&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.io.unmanagedmemorystream.aspx"&gt;&lt;span style="font-family: inherit;"&gt;System.IO.UnmanagedMemoryStream&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: inherit;"&gt;&amp;nbsp;似乎是個不錯用的 class, 它可以 wrapper 一個 unmanaged 的 pointer 程為一個 Stream class, 雖然它是 unsafe 的 class 但是對於 performance 也許有不少幫助呢.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7597887370716014923-8504448404267810593?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/8504448404267810593/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=8504448404267810593&amp;isPopup=true' title='3 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/8504448404267810593'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/8504448404267810593'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2010/01/com-istream-ipropertystorage.html' title='免費的 &quot;IStream, IPropertyStorage&quot; system-provided, stand-alone implementation COM'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-3444453467184900570</id><published>2010-01-03T19:09:00.011+08:00</published><updated>2010-01-03T22:34:20.156+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='登山'/><category scheme='http://www.blogger.com/atom/ns#' term='桃園'/><category scheme='http://www.blogger.com/atom/ns#' term='雪山山脈'/><title type='text'>2010 01 02-03 北插天山露營</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;div style="text-align: left;"&gt;&lt;embed flashvars="host=picasaweb.google.com&amp;amp;hl=zh_TW&amp;amp;feat=flashalbum&amp;amp;RGB=0x000000&amp;amp;feed=http%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2FNomadLibra%2Falbumid%2F5422467047649897697%3Falt%3Drss%26kind%3Dphoto%26hl%3Dzh_TW" height="340" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://picasaweb.google.com/s/c/bin/slideshow.swf" type="application/x-shockwave-flash" width="500"&gt;&lt;/embed&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;
這太白癡了 不得不貼出來 .....&lt;br /&gt;
&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/YY8jKidRDZY&amp;hl=zh_TW&amp;fs=1&amp;hd=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/YY8jKidRDZY&amp;hl=zh_TW&amp;fs=1&amp;hd=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;object height="385" width="480"&gt;&lt;param name="movie" value="http://www.youtube.com/p/BC9864C8B3A1DEB3&amp;amp;hl=zh_TW&amp;amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/p/BC9864C8B3A1DEB3&amp;amp;hl=zh_TW&amp;amp;fs=1" type="application/x-shockwave-flash" width="480" height="385" allowscriptaccess="always" allowfullscreen="true"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;
&lt;script src="http://www.gmodules.com/ig/ifr?url=http://code.google.com/apis/kml/embed/embedkmlgadget.xml&amp;amp;up_kml_url=http%3A%2F%2Fdesign-studio.lookin.at%2FGPS%2F2010%252001%252002%2520%E5%8C%97%E6%8F%92%E5%A4%A9%E5%B1%B1%E9%9C%B2%E7%87%9F.kmz&amp;amp;up_view_mode=earth&amp;amp;up_earth_2d_fallback=1&amp;amp;up_earth_fly_from_space=1&amp;amp;up_earth_show_nav_controls=1&amp;amp;up_earth_show_buildings=1&amp;amp;up_earth_show_terrain=1&amp;amp;up_earth_show_roads=1&amp;amp;up_earth_show_borders=1&amp;amp;up_earth_sphere=earth&amp;amp;up_maps_zoom_out=0&amp;amp;up_maps_default_type=satellite&amp;amp;synd=open&amp;amp;w=500&amp;amp;h=400&amp;amp;title=Embedded+KML+Viewer&amp;amp;border=%23ffffff%7C3px%2C1px+solid+%23999999&amp;amp;output=js"&gt;
&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://2.bp.blogspot.com/_YTmQMAUfDN8/S0B9mW2WGgI/AAAAAAAAOpw/HImBXQ_nwPQ/s1600-h/2010+01+02+%E5%8C%97%E6%8F%92%E5%A4%A9%E5%B1%B1%E9%9C%B2%E7%87%9F+%E8%90%BD%E5%B7%AE%E5%9C%96.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_YTmQMAUfDN8/S0B9mW2WGgI/AAAAAAAAOpw/HImBXQ_nwPQ/s400/2010+01+02+%E5%8C%97%E6%8F%92%E5%A4%A9%E5%B1%B1%E9%9C%B2%E7%87%9F+%E8%90%BD%E5%B7%AE%E5%9C%96.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&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/7597887370716014923-3444453467184900570?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/3444453467184900570/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=3444453467184900570&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/3444453467184900570'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/3444453467184900570'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2010/01/2010-01-02-03.html' title='2010 01 02-03 北插天山露營'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_YTmQMAUfDN8/S0B9mW2WGgI/AAAAAAAAOpw/HImBXQ_nwPQ/s72-c/2010+01+02+%E5%8C%97%E6%8F%92%E5%A4%A9%E5%B1%B1%E9%9C%B2%E7%87%9F+%E8%90%BD%E5%B7%AE%E5%9C%96.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-354518542971262197</id><published>2010-01-01T18:06:00.002+08:00</published><updated>2010-01-03T20:13:14.403+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='攝影'/><category scheme='http://www.blogger.com/atom/ns#' term='縮時攝影'/><title type='text'>2010 01 01 跨年</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;a href="http://picasaweb.google.com/lh/photo/WrNbVJdf2KfrAhR-PzT1Yg?feat=embedwebsite"&gt;&lt;img src="http://lh5.ggpht.com/_YTmQMAUfDN8/Sz3F6ZcSTrI/AAAAAAAAOkM/9Iz_6G80Kg0/s400/2010-01-01-00.02.58.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://picasaweb.google.com/lh/photo/GpV721JVfhRCXu33hfnTnw?feat=embedwebsite"&gt;&lt;img src="http://lh3.ggpht.com/_YTmQMAUfDN8/Sz3F743eIKI/AAAAAAAAOkY/2C32iqzcW_A/s400/2010-01-01-00.06.42.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;object width="560" height="340"&gt;&lt;param name="movie" value="http://www.youtube.com/v/zo_uB95t79Q&amp;hl=zh_TW&amp;fs=1&amp;hd=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/zo_uB95t79Q&amp;hl=zh_TW&amp;fs=1&amp;hd=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"&gt;&lt;/embed&gt;&lt;/object&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/7597887370716014923-354518542971262197?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/354518542971262197/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=354518542971262197&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/354518542971262197'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/354518542971262197'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2010/01/2010-01-01.html' title='2010 01 01 跨年'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_YTmQMAUfDN8/Sz3F6ZcSTrI/AAAAAAAAOkM/9Iz_6G80Kg0/s72-c/2010-01-01-00.02.58.jpg' height='72' width='72'/><thr:total>0</thr:total><georss:featurename>105台灣台北市松山區精忠里</georss:featurename><georss:point>25.058850365773864 121.55488550662994</georss:point><georss:box>25.058242865773863 121.55397350662994 25.059457865773865 121.55579750662994</georss:box></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-4645863224651173998</id><published>2009-12-30T02:11:00.014+08:00</published><updated>2009-12-30T12:23:15.824+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='經驗'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='影像處理'/><category scheme='http://www.blogger.com/atom/ns#' term='Performance'/><title type='text'>JPG, PNG, BMP 速度大車拼</title><content type='html'>由於工作的關係我得嘗試去分析在相似的軟硬體環境, 小型的影像檔案到底哪個格式的 access 速度比較快呢? 嚴格說這個問題在現代的多工作業系統下是不容易有個穩定的答案, 但是我們還是值得去找到個趨勢來改進我們程式的效能.&lt;br /&gt;
&lt;br /&gt;
首先我們先定義小檔案有多小, 我取了一個以 80x80 的 24bit BMP 檔案做為基準, 該檔案的大小是&amp;nbsp;19,254 Bytes (磁碟大小&amp;nbsp;20,480&amp;nbsp;Bytes), 相對應的 PNG 為&amp;nbsp;17,533 Bytes&amp;nbsp;(磁碟大小&amp;nbsp;20,480&amp;nbsp;Bytes), JPG 為12,532&amp;nbsp;Bytes (磁碟大小 16,384 Bytes). 我所選擇的 codec 為 Windows Vista 內建的 WIC decoder.&lt;br /&gt;
&lt;br /&gt;
實驗的設計必須考慮作業系統對檔案快取造成的影響以及硬碟檔案的分佈與離散成度, 所以我做了以下的設計:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;在實驗前先對目的磁碟做 defragment 來減少斷裂與離散的問題&lt;/li&gt;
&lt;li&gt;利用程式對三種格式產生 0000~9999 為編號的 10K 個檔案&amp;nbsp;&lt;/li&gt;
&lt;li&gt;每次從 10K 檔案中隨機抽 1K 個檔案做為實驗之用降低快取的影響&lt;/li&gt;
&lt;li&gt;每次實驗後都重新開機, 開機後等待系統進入穩態以確保快取的影響降到最低&lt;/li&gt;
&lt;/ol&gt;&lt;div&gt;以下是兩個實驗內容:&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span style="color: #6fa8dc;"&gt;實驗一:&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;對 10K 檔案中隨機抽 1K 個檔案, 使用 WIC 載入記憶體並且 decode&amp;nbsp;其四次實驗結果如下:&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="color: #38761d;"&gt;PNG: 81, 86, 109, 110 平均 96.5&amp;nbsp;files/sec 120%&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;JPG: 77, 102, 89, 93&amp;nbsp;平均 90.25&amp;nbsp;files/sec 112%&lt;/li&gt;
&lt;li&gt;BMP: 71, 75, 85, 89&amp;nbsp;平均 80 files/sec 100%&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;該實驗的目的在於知道混合 CPU&amp;nbsp;bound 與 I/O&amp;nbsp;bound 的情況下, 不同格式在 WIC codec 的速度&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;b&gt;&lt;span style="color: #6fa8dc;"&gt;實驗二:&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
一個檔案已經事先載入到記憶體中, 然後使用 WIC 對相同記憶體 decode 10K 次其結果如下:&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="color: red;"&gt;JPG: &amp;nbsp;1788 files/sec 159%&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;BMP: 1118&amp;nbsp;files/sec 100%&lt;/li&gt;
&lt;li&gt;PNG: &amp;nbsp;963&amp;nbsp;files/sec &amp;nbsp;86%&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;該實驗的目的在於知道如果排除 I/O bound 的問題, 不同格式在 WIC codec 下速度&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;其實有只要有 I/O 因素的狀況下變異數都很大, 結果令人訝異的是 PNG 在第一個實驗有較好的表現, 但第二個實驗不考慮 I/O bound 的狀況下卻是最差的, 我能想到的解釋就是 JPG 在 decode 需要花費比較多的 seek time, 但是以磁碟機這種 block based device 來說這些檔案最多才佔 4 個 sectors 而且 JPG 檔案還比較小所以只佔 3 個, 所以&amp;nbsp;seek 動作應該是不太會發生在一次的 decode 中畢竟硬體不會一次只讀一個&amp;nbsp;sector.&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;所以這兩個實驗的結果還是沒有一個合裡的解釋, 誰能告訴我為什麼呢?&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;從實驗來看可以知道實驗一是個 I/O bound 遠高於 CPU bound 的問題, 所以加速的關鍵會再如何更好的降低 I/O 的影響, 所以我設計下個實驗:&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span style="color: #9fc5e8;"&gt;實驗三:&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;以三種格式做隨機存取來分析哪種方式的&amp;nbsp;I/O 效率最好,&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;使用原來的方法做為基準, 一個目錄有 10K 個檔案&lt;/li&gt;
&lt;li&gt;將 10K 個檔案合併成一個很大的檔案, 純粹將多個檔案 "黏" 在一起&lt;/li&gt;
&lt;li&gt;將 10K 個檔案合併成一個很大的檔案, 使用&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/aa380369(VS.85).aspx"&gt;COM&amp;nbsp;Structured Storage&lt;/a&gt; 來儲存&lt;/li&gt;
&lt;/ol&gt;&lt;div&gt;實驗的結果如下以 PNG 檔案為例&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="color: red;"&gt;Big chunk file: 309 240 351&amp;nbsp;平均 300 files/sec 238%&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;10K files: 104 139 135 平均 126&amp;nbsp;files/sec 100%&lt;/li&gt;
&lt;li&gt;Structured Storage file: 100 72 72&amp;nbsp;平均 81.3 files/sec 64%&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;結果變異數還是不小, 不過可以看出一個趨勢就是&amp;nbsp;Big chunk file 比分散的檔案快而且快很多, 而 COM&amp;nbsp;Structured Storage 是最慢的.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #6fa8dc;"&gt;實驗四:&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;對&amp;nbsp;Structured Storage&amp;nbsp;檔案中隨機抽 1K 個檔案, 使用 WIC 載入記憶體並且 decode&amp;nbsp;其三次實驗結果如下:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;span style="color: red;"&gt;JPG: 90, 92, 91,&amp;nbsp;平均 91&amp;nbsp;files/sec 133%&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;BMP:&amp;nbsp;68, 68, 69,&amp;nbsp;平均 68.3 files/sec 100%&lt;/li&gt;
&lt;li&gt;PNG: 65, 66, 66,&amp;nbsp;平均 65.6 files/sec 97%&lt;/li&gt;
&lt;/ul&gt;結果的變異數並不大, 且實驗中CPU 使用率很高, 以雙核心且程式使用一個 thread 的情況下, CPU 使用率約 50~54%. 但是實驗一的情況下 CPU使用率相對低很多. 其實&amp;nbsp;Structured Storage 在大檔案的狀況下效能真的不好但是功能確還蠻迷人, 如果單純用在諸如 Word 這類軟體的 serialize 上的確非常方便, 相關的經驗還可參考&amp;nbsp;&lt;a href="http://www.simple-talk.com/community/blogs/bart/archive/2005/10/11/3.aspx"&gt;Performance of structured storage files&lt;/a&gt;.&lt;br /&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7597887370716014923-4645863224651173998?l=nomadlibra.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nomadlibra.blogspot.com/feeds/4645863224651173998/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7597887370716014923&amp;postID=4645863224651173998&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/4645863224651173998'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7597887370716014923/posts/default/4645863224651173998'/><link rel='alternate' type='text/html' href='http://nomadlibra.blogspot.com/2009/12/jpg-png-bmp.html' title='JPG, PNG, BMP 速度大車拼'/><author><name>James Hsieh</name><uri>https://profiles.google.com/102565516658587558919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-mgSBEcaBKAs/AAAAAAAAAAI/AAAAAAAAdN8/MI6LFS2mLak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7597887370716014923.post-7271576915610819198</id><published>2009-12-27T20:22:00.008+08:00</published><updated>2009-12-27T20:45:18.393+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='趣味'/><title type='text'>猜猜他是誰? 我的閨房密友之一 :P</title><content type='html'>&lt;span style="font-size: small;"&gt;&lt;span style="font-size: 13px;"&gt;&lt;span style="font-size: medium;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: small;"&gt;&lt;span style="font-size: 13px;"&gt;&lt;span style="font-size: medium;"&gt;&lt;pre style="font-size: 8pt; font-weight: bold; letter-spacing: 4px; line-height: 8pt;"&gt;&lt;span style="color: #5e531d;"&gt;v&lt;/span&gt;&lt;span style="color: #525b26;"&gt;c&lt;/span&gt;&lt;span style="color: #636f31;"&gt;b&lt;/span&gt;&lt;span style="color: #888a49;"&gt;p&lt;/span&gt;&lt;span style="color: #979338;"&gt;d&lt;/span&gt;&lt;span style="color: #9c9429;"&gt;t&lt;/span&gt;&lt;span style="color: #7b8641;"&gt;k&lt;/span&gt;&lt;span style="color: #818d4b;"&gt;j&lt;/span&gt;&lt;span style="color: #505a1d;"&gt;b&lt;/span&gt;&lt;span style="color: #444c1b;"&gt;s&lt;/span&gt;&lt;span style="color: #464f22;"&gt;n&lt;/span&gt;&lt;span style="color: #434927;"&gt;a&lt;/span&gt;&lt;span style="color: #404423;"&gt;s&lt;/span&gt;&lt;span style="color: #494d32;"&gt;r&lt;/span&gt;&lt;span style="color: #464830;"&gt;d&lt;/span&gt;&lt;span style="color: #3d422c;"&gt;z&lt;/span&gt;&lt;span style="color: #46502b;"&gt;g&lt;/span&gt;&lt;span style="color: #4e5a2c;"&gt;p&lt;/span&gt;&lt;span style="color: #657246;"&gt;y&lt;/span&gt;&lt;span style="color: #6d7051;"&gt;t&lt;/span&gt;&lt;span style="color: #4f4f47;"&gt;e&lt;/span&gt;&lt;span style="color: #49443e;"&gt;i&lt;/span&gt;&lt;span style="color: #46413b;"&gt;j&lt;/span&gt;&lt;span style="color: #554e44;"&gt;a&lt;/span&gt;&lt;span style="color: #6e6159;"&gt;a&lt;/span&gt;&lt;span style="color: #756558;"&gt;c&lt;/span&gt;&lt;span style="color: #6d654e;"&gt;m&lt;/span&gt;&lt;span style="color: #515731;"&gt;q&lt;/span&gt;&lt;span style="color: #56642f;"&gt;l&lt;/span&gt;&lt;span style="color: #617d32;"&gt;a&lt;/span&gt;&lt;span style="color: #688835;"&gt;z&lt;/span&gt;&lt;span style="color: #334714;"&gt;g&lt;/span&gt;&lt;span style="color: #2e371a;"&gt;d&lt;/span&gt;&lt;span style="color: #465127;"&gt;b&lt;/span&gt;&lt;span style="color: #3e4921;"&gt;w&lt;/span&gt;&lt;span style="color: #3f4624;"&gt;h&lt;/span&gt;&lt;span style="color: #414e19;"&gt;u&lt;/span&gt;&lt;span style="color: #3f4c20;"&gt;h&lt;/span&gt;&lt;span style="color: #4d4e2f;"&gt;r&lt;/span&gt;&lt;span style="color: #8a684d;"&gt;v&lt;/span&gt;&lt;span style="color: #c46964;"&gt;z&lt;/span&gt;&lt;span style="color: #e3897e;"&gt;e&lt;/span&gt;&lt;span style="color: #d4967f;"&gt;w&lt;/span&gt;&lt;span style="color: #e58e7d;"&gt;s&lt;/span&gt;&lt;span style="color: #eba687;"&gt;w&lt;/span&gt;&lt;span style="color: #41561b;"&gt;z&lt;/span&gt;&lt;span style="color: #323a11;"&gt;s&lt;/span&gt;&lt;span style="color: #68792b;"&gt;c&lt;/span&gt;&lt;span style="color: #828b3a;"&gt;p&lt;/span&gt;&lt;span style="color: #9d865a;"&gt;q&lt;/span&gt;
&lt;span style="color: #93731c;"&gt;v&lt;/span&gt;&lt;span style="color: #666c30;"&gt;t&lt;/span&gt;&lt;span style="color: #717a37;"&gt;z&lt;/span&gt;&lt;span style="color: #8a8b49;"&gt;f&lt;/span&gt;&lt;span style="color: #939738;"&gt;u&lt;/span&gt;&lt;span style="color: #7a7d24;"&gt;z&lt;/span&gt;&lt;span style="color: #626b28;"&gt;i&lt;/span&gt;&lt;span style="color: #6c7c3e;"&gt;g&lt;/span&gt;&lt;span style="color: #4d5723;"&gt;q&lt;/span&gt;&lt;span style="color: #455322;"&gt;u&lt;/span&gt;&lt;span style="color: #3f4e17;"&gt;h&lt;/span&gt;&lt;span style="color: #3c421e;"&gt;q&lt;/span&gt;&lt;span style="color: #484f2d;"&gt;b&lt;/span&gt;&lt;span style="color: #515233;"&gt;l&lt;/span&gt;&lt;span style="color: #687142;"&gt;r&lt;/span&gt;&lt;span style="color: #626344;"&gt;x&lt;/span&gt;&lt;span style="color: #6c7548;"&gt;s&lt;/span&gt;&lt;span style="color: #61743c;"&gt;l&lt;/span&gt;&lt;span style="color: #82887a;"&gt;f&lt;/span&gt;&lt;span style="color: #6d6c6a;"&gt;k&lt;/span&gt;&lt;span style="color: #5e5955;"&gt;h&lt;/span&gt;&lt;span style="color: #615853;"&gt;f&lt;/span&gt;&lt;span style="color: #544240;"&gt;p&lt;/span&gt;&lt;span style="color: #473a34;"&gt;e&lt;/span&gt;&lt;span style="color: #5f514e;"&gt;x&lt;/span&gt;&lt;span style="color: #594a43;"&gt;l&lt;/span&gt;&lt;span style="color: #534a45;"&gt;d&lt;/span&gt;&lt;span style="color: #534c3c;"&gt;q&lt;/span&gt;&lt;span style="color: #777952;"&gt;o&lt;/span&gt;&lt;span style="color: #a1bd57;"&gt;t&lt;/span&gt;&lt;span style="color: #9dc048;"&gt;h&lt;/span&gt;&lt;span style="color: #87a744;"&gt;k&lt;/span&gt;&lt;span style="color: #6e8c32;"&gt;m&lt;/span&gt;&lt;span style="color: #637a20;"&gt;g&lt;/span&gt;&lt;span style="color: #54641d;"&gt;p&lt;/span&gt;&lt;span style="color: #4e6026;"&gt;h&lt;/span&gt;&lt;span style="color: #738e4b;"&gt;g&lt;/span&gt;&lt;span style="color: #6d8a47;"&gt;y&lt;/span&gt;&lt;span style="color: #5e6d34;"&gt;n&lt;/span&gt;&lt;span style="color: #6d5a39;"&gt;x&lt;/span&gt;&lt;span style="color: #ad6153;"&gt;s&lt;/span&gt;&lt;span style="color: #b45b53;"&gt;v&lt;/span&gt;&lt;span style="color: #ba735f;"&gt;n&lt;/span&gt;&lt;span style="color: #b26658;"&gt;u&lt;/span&gt;&lt;span style="color: #d5976e;"&gt;h&lt;/span&gt;&lt;span style="color: #99a35e;"&gt;e&lt;/span&gt;&lt;span style="color: #6d8531;"&gt;s&lt;/span&gt;&lt;span style="color: #798f3c;"&gt;a&lt;/span&gt;&lt;span style="color: #7d793c;"&gt;q&lt;/span&gt;&lt;span style="color: #c47d61;"&gt;x&lt;/span&gt;
&lt;span style="color: #816d17;"&gt;k&lt;/span&gt;&lt;span style="color: #5f6d30;"&gt;x&lt;/span&gt;&lt;span style="color: #6a7539;"&gt;c&lt;/span&gt;&lt;span style="color: #6e7e3d;"&gt;z&lt;/span&gt;&lt;span style="color: #627734;"&gt;c&lt;/span&gt;&lt;span style="color: #556527;"&gt;a&lt;/span&gt;&lt;span style="color: #4e5414;"&gt;l&lt;/span&gt;&lt;span style="color: #505d31;"&gt;g&lt;/span&gt;&lt;span style="color: #485027;"&gt;q&lt;/span&gt;&lt;span style="color: #424a21;"&gt;z&lt;/span&gt;&lt;span style="color: #3d4617;"&gt;z&lt;/span&gt;&lt;span style="color: #3a4410;"&gt;y&lt;/span&gt;&lt;span style="color: #647332;"&gt;k&lt;/span&gt;&lt;span style="color: #879057;"&gt;m&lt;/span&gt;&lt;span style="color: #979876;"&gt;e&lt;/span&gt;&lt;span style="color: #7b7d67;"&gt;a&lt;/span&gt;&lt;span style="color: #3f402e;"&gt;t&lt;/span&gt;&lt;span style="color: #5a5b4d;"&gt;l&lt;/span&gt;&lt;span style="color: #494a45;"&gt;y&lt;/span&gt;&lt;span style="color: #39383d;"&gt;h&lt;/span&gt;&lt;span style="color: #494041;"&gt;i&lt;/span&gt;&lt;span style="color: #605454;"&gt;r&lt;/span&gt;&lt;span style="color: #4f4343;"&gt;c&lt;/span&gt;&lt;span style="color: #4d3e41;"&gt;v&lt;/span&gt;&lt;span style="color: #645955;"&gt;l&lt;/span&gt;&lt;span style="color: #665a5a;"&gt;j&lt;/span&gt;&lt;span style="color: #706762;"&gt;z&lt;/span&gt;&lt;span style="color: #544947;"&gt;d&lt;/span&gt;&lt;span style="color: #635f56;"&gt;j&lt;/span&gt;&lt;span style="color: #615f4a;"&gt;q&lt;/span&gt;&lt;span style="color: #9ab44f;"&gt;b&lt;/span&gt;&lt;span style="color: #a0c458;"&gt;u&lt;/span&gt;&lt;span style="color: #9dc25b;"&gt;o&lt;/span&gt;&lt;span style="color: #99ba4f;"&gt;d&lt;/span&gt;&lt;span style="color: #9bb550;"&gt;u&lt;/span&gt;&lt;span style="color: #91a858;"&gt;q&lt;/span&gt;&lt;span style="color: #b8ac70;"&gt;e&lt;/span&gt;&lt;span style="color: #fec2a6;"&gt;g&lt;/span&gt;&lt;span style="color: #e0b491;"&gt;w&lt;/span&gt;&lt;span style="color: #6c6d31;"&gt;v&lt;/span&gt;&lt;span style="color: #955b43;"&gt;g&lt;/span&gt;&lt;span style="color: #914336;"&gt;v&lt;/span&gt;&lt;span style="color: #995844;"&gt;t&lt;/span&gt;&lt;span style="color: #9d6449;"&gt;q&lt;/span&gt;&lt;span style="color: #b67758;"&gt;h&lt;/span&gt;&lt;span style="color: #ca9f74;"&gt;y&lt;/span&gt;&lt;span style="color: #495118;"&gt;q&lt;/span&gt;&lt;span style="color: #4b4f1c;"&gt;a&lt;/span&gt;&lt;span style="color: #5e422d;"&gt;j&lt;/span&gt;&lt;span style="color: #b46556;"&gt;p&lt;/span&gt;
&lt;span style="color: #4a531a;"&gt;h&lt;/span&gt;&lt;span style="color: #515d1b;"&gt;s&lt;/span&gt;&lt;span style="color: #667441;"&gt;g&lt;/span&gt;&lt;span style="color: #62703b;"&gt;k&lt;/span&gt;&lt;span style="color: #5f7534;"&gt;n&lt;/span&gt;&lt;span style="color: #586628;"&gt;s&lt;/span&gt;&lt;span style="color: #454e17;"&gt;u&lt;/span&gt;&lt;span style="color: #373f18;"&gt;n&lt;/span&gt;&lt;span style="color: #384017;"&gt;w&lt;/span&gt;&lt;span style="color: #394321;"&gt;e&lt;/span&gt;&lt;span style="color: #394016;"&gt;d&lt;/span&gt;&lt;span style="color: #738a3c;"&gt;x&lt;/span&gt;&lt;span style="color: #828c50;"&gt;y&lt;/span&gt;&lt;span style="color: #848273;"&gt;s&lt;/span&gt;&lt;span style="color: #847b76;"&gt;b&lt;/span&gt;&lt;span style="color: #736a63;"&gt;t&lt;/span&gt;&lt;span style="color: #1d181c;"&gt;i&lt;/span&gt;&lt;span style="color: #342e2e;"&gt;f&lt;/span&gt;&lt;span style="color: #3c3837;"&gt;z&lt;/span&gt;&lt;span style="color: #332d2d;"&gt;e&lt;/span&gt;&lt;span style="color: #372d2e;"&gt;a&lt;/span&gt;&lt;span style="color: #473737;"&gt;f&lt;/span&gt;&lt;span style="color: #4f403b;"&gt;a&lt;/span&gt;&lt;span style="color: #564845;"&gt;t&lt;/span&gt;&lt;span style="color: #4c3e3d;"&gt;v&lt;/span&gt;&lt;span style="color: #55504d;"&gt;h&lt;/span&gt;&lt;span style="color: #625e5b;"&gt;s&lt;/span&gt;&lt;span style="color: #4a403e;"&gt;l&lt;/span&gt;&lt;span style="color: #423233;"&gt;i&lt;/span&gt;&lt;span style="color: #433e3a;"&gt;b&lt;/span&gt;&lt;span style="color: #403a24;"&gt;a&lt;/span&gt;&lt;span style="color: #97ac45;"&gt;q&lt;/span&gt;&lt;span style="color: #a5c756;"&gt;t&lt;/span&gt;&lt;span style="color: #a3c555;"&gt;h&lt;/span&gt;&lt;span style="color: #97b344;"&gt;a&lt;/span&gt;&lt;span style="color: #a7bc53;"&gt;h&lt;/span&gt;&lt;span style="color: #b8ac60;"&gt;a&lt;/span&gt;&lt;span style="color: #dd8f7b;"&gt;v&lt;/span&gt;&lt;span style="color: #eca885;"&gt;u&lt;/span&gt;&lt;span style="color: #91974d;"&gt;w&lt;/span&gt;&lt;span style="color: #8f7238;"&gt;z&lt;/span&gt;&lt;span style="color: #894132;"&gt;y&lt;/span&gt;&lt;span style="color: #8c4e39;"&gt;u&lt;/span&gt;&lt;span style="color: #7c4e36;"&gt;x&lt;/span&gt;&lt;span style="color: #a4604b;"&gt;q&lt;/span&gt;&lt;span style="color: #d59d7c;"&gt;w&lt;/span&gt;&lt;span style="color: #39441c;"&gt;r&lt;/span&gt;&lt;span style="color: #33311c;"&gt;z&lt;/span&gt;&lt;span style="color: #543429;"&gt;b&lt;/span&gt;&lt;span style="color: #ae5f4e;"&gt;q&lt;/span&gt;
&lt;span style="color: #495418;"&gt;d&lt;/span&gt;&lt;span style="color: #525d21;"&gt;c&lt;/span&gt;&lt;span style="color: #4e5a1a;"&gt;v&lt;/span&gt;&lt;span style="color: #5c6b2a;"&gt;d&lt;/span&gt;&lt;span style="color: #5d7039;"&gt;w&lt;/span&gt;&lt;span style="color: #5e6829;"&gt;q&lt;/span&gt;&lt;span style="color: #484d15;"&gt;l&lt;/span&gt;&lt;span style="color: #4a4d16;"&gt;o&lt;/span&gt;&lt;span style="color: #3e4712;"&gt;c&lt;/span&gt;&lt;span style="color: #323816;"&gt;t&lt;/span&gt;&lt;span style="color: #3b411b;"&gt;q&lt;/span&gt;&lt;span style="color: #4f5529;"&gt;c&lt;/span&gt;&lt;span style="color: #5e5946;"&gt;k&lt;/span&gt;&lt;span style="color: #675956;"&gt;j&lt;/span&gt;&lt;span style="color: #54504d;"&gt;k&lt;/span&gt;&lt;span style="color: #625a58;"&gt;k&lt;/span&gt;&lt;span style="color: #363437;"&gt;r&lt;/span&gt;&lt;span style="color: #2a2529;"&gt;k&lt;/span&gt;&lt;span style="color: #252525;"&gt;g&lt;/span&gt;&lt;span style="color: #312d2c;"&gt;l&lt;/span&gt;&lt;span style="color: #312829;"&gt;h&lt;/span&gt;&lt;span style="color: #3d3332;"&gt;f&lt;/span&gt;&lt;span style="color: #423433;"&gt;k&lt;/span&gt;&lt;span style="color: #584d49;"&gt;b&lt;/span&gt;&lt;span style="color: #635852;"&gt;d&lt;/span&gt;&lt;span style="color: #6b6662;"&gt;b&lt;/span&gt;&lt;span style="color: #514947;"&gt;x&lt;/span&gt;&lt;span style="color: #665e5b;"&gt;u&lt;/span&gt;&lt;span style="color: #281c1c;"&gt;a&lt;/span&gt;&lt;span style="color: #3f3432;"&gt;z&lt;/span&gt;&lt;span style="color: #2f261f;"&gt;k&lt;/span&gt;&lt;span style="color: #626c30;"&gt;e&lt;/span&gt;&lt;span style="color: #9ebf4e;"&gt;b&lt;/span&gt;&lt;span style="color: #a2c350;"&gt;f&lt;/span&gt;&lt;span style="color: #99bb4d;"&gt;h&lt;/span&gt;&lt;span style="color: #96ab4c;"&gt;y&lt;/span&gt;&lt;span style="color: #a7ab57;"&gt;w&lt;/span&gt;&lt;span style="color: #b7695d;"&gt;t&lt;/span&gt;&lt;span style="color: #ca8868;"&gt;m&lt;/span&gt;&lt;span style="color: #c09f69;"&gt;y&lt;/span&gt;&lt;span style="color: #998b42;"&gt;m&lt;/span&gt;&lt;span style="color: #8c4833;"&gt;d&lt;/span&gt;&lt;span style="color: #8c4f3a;"&gt;b&lt;/span&gt;&lt;span style="color: #804e33;"&gt;w&lt;/span&gt;&lt;span style="color: #9b5744;"&gt;m&lt;/span&gt;&lt;span style="color: #cc9473;"&gt;l&lt;/span&gt;&lt;span style="color: #696450;"&gt;h&lt;/span&gt;&lt;span style="color: #312819;"&gt;d&lt;/span&gt;&lt;span style="color: #654337;"&gt;w&lt;/span&gt;&lt;span style="color: #a3604f;"&gt;n&lt;/span&gt;
&lt;span style="color: #4c551c;"&gt;p&lt;/span&gt;&lt;span style="color: #3a4712;"&gt;d&lt;/span&gt;&lt;span style="color: #38450f;"&gt;t&lt;/span&gt;&lt;span style="color: #6c6b2a;"&gt;a&lt;/span&gt;&lt;span style="color: #6a6931;"&gt;e&lt;/span&gt;&lt;span style="color: #626820;"&gt;w&lt;/span&gt;&lt;span style="color: #6f752d;"&gt;c&lt;/span&gt;&lt;span style="color: #828035;"&gt;c&lt;/span&gt;&lt;span style="color: #747527;"&gt;q&lt;/span&gt;&lt;span style="color: #40450f;"&gt;c&lt;/span&gt;&lt;span style="color: #34371c;"&gt;b&lt;/span&gt;&lt;span style="color: #514d32;"&gt;b&lt;/span&gt;&lt;span style="color: #64564b;"&gt;g&lt;/span&gt;&lt;span style="color: #554641;"&gt;d&lt;/span&gt;&lt;span style="color: #43383c;"&gt;h&lt;/span&gt;&lt;span style="color: #645e5e;"&gt;o&lt;/span&gt;&lt;span style="color: #6f6a67;"&gt;b&lt;/span&gt;&lt;span style="color: #302c29;"&gt;d&lt;/span&gt;&lt;span style="color: #1e1d22;"&gt;h&lt;/span&gt;&lt;span style="color: #39393b;"&gt;o&lt;/span&gt;&lt;span style="color: #342e30;"&gt;b&lt;/span&gt;&lt;span style="color: #48413b;"&gt;u&lt;/span&gt;&lt;span style="color: #443c3a;"&gt;r&lt;/span&gt;&lt;span style="color: #36312e;"&gt;d&lt;/span&gt;&lt;span style="color: #322c2e;"&gt;r&lt;/span&gt;&lt;span style="color: #403635;"&gt;e&lt;/span&gt;&lt;span style="color: #534b48;"&gt;o&lt;/span&gt;&lt;span style="color: #5e5751;"&gt;z&lt;/span&gt;&lt;span style="color: #3e3337;"&gt;i&lt;/span&gt;&lt;span style="color: #281a19;"&gt;l&lt;/span&gt;&lt;span style="color: #393431;"&gt;n&lt;/span&gt;&lt;span style="color: #302d1a;"&gt;y&lt;/span&gt;&lt;span style="color: #9fc359;"&gt;o&lt;/span&gt;&lt;span style="color: #94b84a;"&gt;g&lt;/span&gt;&lt;span style="color: #8fab45;"&gt;z&lt;/span&gt;&lt;span style="color: #8b9d3a;"&gt;t&lt;/span&gt;&lt;span style="color: #9aa549;"&gt;c&lt;/span&gt;&lt;span style="color: #9f6f4b;"&gt;b&lt;/span&gt;&lt;span style="color: #ab654c;"&gt;v&lt;/span&gt;&lt;span style="color: #c08863;"&gt;t&lt;/span&gt;&lt;span style="color: #908744;"&gt;e&lt;/span&gt;&lt;span style="color: #994e37;"&gt;x&lt;/span&gt;&lt;span style="color: #8a4c35;"&gt;v&lt;/span&gt;&lt;span style="color: #875439;"&gt;k&lt;/span&gt;&lt;span style="color: #904d3c;"&gt;a&lt;/span&gt;&lt;span style="color: #b67b5d;"&gt;c&lt;/span&gt;&lt;span style="color: #c89b74;"&gt;z&lt;/span&gt;&lt;span style="color: #575d37;"&gt;c&lt;/span&gt;&lt;span style="color: #8b674f;"&gt;f&lt;/span&gt;&lt;span style="color: #9e5b4b;"&gt;g&lt;/span&gt;
&lt;span style="color: #5d6735;"&gt;r&lt;/span&gt;&lt;span style="color: #3a4314;"&gt;h&lt;/span&gt;&lt;span style="color: #374311;"&gt;b&lt;/span&gt;&lt;span style="color: #8d8345;"&gt;j&lt;/span&gt;&lt;span style="color: #a9994e;"&gt;k&lt;/span&gt;&lt;span style="color: #909338;"&gt;s&lt;/span&gt;&lt;span style="color: #a49e4a;"&gt;n&lt;/span&gt;&lt;span style="color: #a79d44;"&gt;z&lt;/span&gt;&lt;span style="color: #858a2e;"&gt;r&lt;/span&gt;&lt;span style="color: #5d6921;"&gt;w&lt;/span&gt;&lt;span style="color: #59601a;"&gt;k&lt;/span&gt;&lt;span style="color: #716c42;"&gt;e&lt;/span&gt;&lt;span style="color: #5a483e;"&gt;v&lt;/span&gt;&lt;span style="color: #392b2a;"&gt;y&lt;/span&gt;&lt;span style="color: #47423e;"&gt;k&lt;/span&gt;&lt;span style="color: #52494c;"&gt;u&lt;/span&gt;&lt;span style="color: #4d4747;"&gt;r&lt;/span&gt;&lt;span style="color: #40403e;"&gt;n&lt;/span&gt;&lt;span style="color: #0d0c11;"&gt;v&lt;/span&gt;&lt;span style="color: #1b191e;"&gt;n&lt;/span&gt;&lt;span style="color: #2e2a2b;"&gt;h&lt;/span&gt;&lt;span style="color: #312829;"&gt;z&lt;/span&gt;&lt;span style="color: #342a29;"&gt;k&lt;/span&gt;&lt;span style="color: #413131;"&gt;c&lt;/span&gt;&lt;span style="color: #584a49;"&gt;k&lt;/span&gt;&lt;span style="color: #4c4744;"&gt;k&lt;/span&gt;&lt;span style="color: #463e3c;"&gt;f&lt;/span&gt;&lt;span style="color: #473f3d;"&gt;j&lt;/span&gt;&lt;span style="color: #291f1e;"&gt;n&lt;/span&gt;&lt;span style="color: #241615;"&gt;k&lt;/span&gt;&lt;span style="color: #2d201a;"&gt;q&lt;/span&gt;&lt;span style="color: #2b2519;"&gt;e&lt;/span&gt;&lt;span style="color: #91b555;"&gt;s&lt;/span&gt;&lt;span style="color: #94b741;"&gt;r&lt;/span&gt;&lt;span style="color: #90b146;"&gt;n&lt;/span&gt;&lt;span style="color: #98b84b;"&gt;c&lt;/span&gt;&lt;span style="color: #93a64c;"&gt;j&lt;/span&gt;&lt;span style="color: #93853c;"&gt;b&lt;/span&gt;&lt;span style="color: #a15d4a;"&gt;c&lt;/span&gt;&lt;span style="color: #c69167;"&gt;b&lt;/span&gt;&lt;span style="color: #ac8d5e;"&gt;y&lt;/span&gt;&lt;span style="color: #a55e3e;"&gt;m&lt;/span&gt;&lt;span style="color: #975640;"&gt;g&lt;/span&gt;&lt;span style="color: #9e684e;"&gt;t&lt;/span&gt;&lt;span style="color: #90523b;"&gt;l&lt;/span&gt;&lt;span style="color: #aa7156;"&gt;r&lt;/span&gt;&lt;span style="color: #cf9d7a;"&gt;n&lt;/span&gt;&lt;span style="color: #5d5a39;"&gt;d&lt;/span&gt;&lt;span style="color: #a77c5a;"&gt;e&lt;/span&gt;&lt;span style="color: #a56452;"&gt;j&lt;/span&gt;
&lt;span style="color: #8d9144;"&gt;q&lt;/span&gt;&lt;span style="color: #7e843c;"&gt;m&lt;/span&gt;&lt;span style="color: #798948;"&gt;j&lt;/span&gt;&lt;span style="color: #979854;"&gt;a&lt;/span&gt;&lt;span style="color: #a59d55;"&gt;p&lt;/span&gt;&lt;span style="color: #9ba255;"&gt;t&lt;/span&gt;&lt;span style="color: #a8a04f;"&gt;l&lt;/span&gt;&lt;span style="color: #a49d4c;"&gt;u&lt;/span&gt;&lt;span style="color: #828a34;"&gt;d&lt;/span&gt;&lt;span style="color: #7b8830;"&gt;y&lt;/span&gt;&lt;span style="color: #928b3d;"&gt;f&lt;/span&gt;&lt;span style="color: #5b4c35;"&gt;t&lt;/span&gt;&lt;span style="color: #433029;"&gt;d&lt;/span&gt;&lt;span style="color: #31262a;"&gt;x&lt;/span&gt;&lt;span style="color: #2a201f;"&gt;l&lt;/span&gt;&lt;span style="color: #4c453f;"&gt;r&lt;/span&gt;&lt;span style="color: #454142;"&gt;a&lt;/span&gt;&lt;span style="color: #595554;"&gt;v&lt;/span&gt;&lt;span style="color: #242227;"&gt;s&lt;/span&gt;&lt;span style="color: #1c1c1e;"&gt;c&lt;/span&gt;&lt;span style="color: #2a292e;"&gt;w&lt;/span&gt;&lt;span style="color: #151316;"&gt;q&lt;/span&gt;&lt;span style="color: #262020;"&gt;o&lt;/span&gt;&lt;span style="color: #362c2b;"&gt;c&lt;/span&gt;&lt;span style="color: #403634;"&gt;k&lt;/span&gt;&lt;span style="color: #564b47;"&gt;a&lt;/span&gt;&lt;span style="color: #4e4442;"&gt;t&lt;/span&gt;&lt;span style="color: #403634;"&gt;x&lt;/span&gt;&lt;span style="color: #201615;"&gt;d&lt;/span&gt;&lt;span style="color: #170d0c;"&gt;y&lt;/span&gt;&lt;span style="color: #1d0d0d;"&gt;h&lt;/span&gt;&lt;span style="color: #1e1614;"&gt;t&lt;/span&gt;&lt;span style="color: #67743e;"&gt;k&lt;/span&gt;&lt;span style="color: #728f33;"&gt;q&lt;/span&gt;&lt;span style="color: #7a9a39;"&gt;u&lt;/span&gt;&lt;span style="color: #739536;"&gt;a&lt;/span&gt;&lt;span style="color: #708131;"&gt;k&lt;/span&gt;&lt;span style="color: #86883f;"&gt;f&lt;/span&gt;&lt;span style="color: #985c44;"&gt;u&lt;/span&gt;&lt;span style="color: #b77f5c;"&gt;n&lt;/span&gt;&lt;span style="color: #c6906a;"&gt;d&lt;/span&gt;&lt;span style="color: #967a48;"&gt;a&lt;/span&gt;&lt;span style="color: #a15a44;"&gt;h&lt;/span&gt;&lt;span style="color: #ae795a;"&gt;h&lt;/span&gt;&lt;span style="color: #9c5f4a;"&gt;x&lt;/span&gt;&lt;span style="color: #9c5b49;"&gt;t&lt;/span&gt;&lt;span style="color: #c89776;"&gt;y&lt;/span&gt;&lt;span style="color: #847361;"&gt;x&lt;/span&gt;&lt;span style="color: #c29375;"&gt;o&lt;/span&gt;&lt;span style="color: #a86552;"&gt;q&lt;/span&gt;
&lt;span style="color: #949046;"&gt;a&lt;/span&gt;&lt;span style="color: #92944b;"&gt;k&lt;/span&gt;&lt;span style="color: #929b4c;"&gt;h&lt;/span&gt;&lt;span style="color: #94964d;"&gt;p&lt;/span&gt;&lt;span style="color: #8b9455;"&gt;n&lt;/span&gt;&lt;span style="color: #8e8c41;"&gt;s&lt;/span&gt;&lt;span style="color: #82843b;"&gt;p&lt;/span&gt;&lt;span style="color: #767330;"&gt;g&lt;/span&gt;&lt;span style="color: #717b32;"&gt;p&lt;/span&gt;&lt;span style="color: #7a8737;"&gt;t&lt;/span&gt;&lt;span style="color: #717431;"&gt;f&lt;/span&gt;&lt;span style="color: #3f3828;"&gt;x&lt;/span&gt;&lt;span style="color: #362420;"&gt;m&lt;/span&gt;&lt;span style="color: #302624;"&gt;q&lt;/span&gt;&lt;span style="color: #1b1213;"&gt;n&lt;/span&gt;&lt;span style="color: #271c20;"&gt;g&lt;/span&gt;&lt;span style="color: #3c3837;"&gt;q&lt;/span&gt;&lt;span style="color: #4d4b4c;"&gt;y&lt;/span&gt;&lt;span style="color: #3a3539;"&gt;m&lt;/span&gt;&lt;span style="color: #1d1c22;"&gt;l&lt;/span&gt;&lt;span style="color: #29282d;"&gt;m&lt;/span&gt;&lt;span style="color: #352f2f;"&gt;p&lt;/span&gt;&lt;span style="color: #271d1e;"&gt;l&lt;/span&gt;&lt;span style="color: #342e2e;"&gt;t&lt;/span&gt;&lt;span style="color: #2d2727;"&gt;x&lt;/span&gt;&lt;span style="color: #2e2828;"&gt;j&lt;/span&gt;&lt;span style="color: #382e2f;"&gt;n&lt;/span&gt;&lt;span style="color: #2e2526;"&gt;v&lt;/span&gt;&lt;span style="color: #2c2221;"&gt;h&lt;/span&gt;&lt;span style="color: #1c1210;"&gt;b&lt;/span&gt;&lt;span style="color: #180d0b;"&gt;m&lt;/span&gt;&lt;span style="color: #180e0c;"&gt;h&lt;/span&gt;&lt;span style="color: #43392d;"&gt;m&lt;/span&gt;&lt;span style="color: #495115;"&gt;u&lt;/span&gt;&lt;span style="color: #5f7127;"&gt;w&lt;/span&gt;&lt;span style="color: #4e621d;"&gt;z&lt;/span&gt;&lt;span style="color: #4b531a;"&gt;m&lt;/span&gt;&lt;span style="color: #6a7030;"&gt;m&lt;/span&gt;&lt;span style="color: #946343;"&gt;g&lt;/span&gt;&lt;span style="color: #ad6d54;"&gt;c&lt;/span&gt;&lt;span style="color: #df9e7e;"&gt;f&lt;/span&gt;&lt;span style="color: #be9874;"&gt;l&lt;/span&gt;&lt;span style="color: #bb6f57;"&gt;z&lt;/span&gt;&lt;span style="color: #b5795d;"&gt;s&lt;/span&gt;&lt;span style="color: #b8826a;"&gt;b&lt;/span&gt;&lt;span style="color: #a6685b;"&gt;m&lt;/span&gt;&lt;span style="color: #cc997c;"&gt;y&lt;/span&gt;&lt;span style="color: #eab596;"&gt;r&lt;/span&gt;&lt;span style="color: #fac7a8;"&gt;l&lt;/span&gt;&lt;span style="color: #bc7d6b;"&gt;k&lt;/span&gt;
&lt;span style="color: #858c3c;"&gt;c&lt;/span&gt;&lt;span style="color: #989949;"&gt;x&lt;/span&gt;&lt;span style="color: #8a9a51;"&gt;a&lt;/span&gt;&lt;span style="color: #777d35;"&gt;o&lt;/span&gt;&lt;span style="color: #8a8e44;"&gt;r&lt;/span&gt;&lt;span style="color: #838845;"&gt;x&lt;/span&gt;&lt;span style="color: #667033;"&gt;x&lt;/span&gt;&lt;span style="color: #677331;"&gt;e&lt;/span&gt;&lt;span style="color: #718442;"&gt;t&lt;/span&gt;&lt;span style="color: #75873d;"&gt;e&lt;/span&gt;&lt;span style="color: #7f8b3f;"&gt;f&lt;/span&gt;&lt;span style="color: #403929;"&gt;f&lt;/span&gt;&lt;span style="color: #281a17;"&gt;m&lt;/span&gt;&lt;span style="color: #2a1b18;"&gt;r&lt;/span&gt;&lt;span style="color: #23191a;"&gt;z&lt;/span&gt;&lt;span style="color: #1d1314;"&gt;j&lt;/span&gt;&lt;span style="color: #282224;"&gt;r&lt;/span&gt;&lt;span style="color: #454545;"&gt;m&lt;/span&gt;&lt;span style="color: #3a3532;"&gt;v&lt;/span&gt;&lt;span style="color: #433938;"&gt;x&lt;/span&gt;&lt;span style="color: #332f30;"&gt;o&lt;/span&gt;&lt;span style="color: #2c2626;"&gt;a&lt;/span&gt;&lt;span style="color: #2f2524;"&gt;i&lt;/span&gt;&lt;span style="color: #342a29;"&gt;n&lt;/span&gt;&lt;span style="color: #392f2e;"&gt;s&lt;/span&gt;&lt;span style="color: #443633;"&gt;j&lt;/span&gt;&lt;span style="color: #3c3231;"&gt;a&lt;/span&gt;&lt;span style="color: #1d1312;"&gt;r&lt;/span&gt;&lt;span style="color: #261d18;"&gt;b&lt;/span&gt;&lt;span style="color: #1e0e0e;"&gt;l&lt;/span&gt;&lt;span style="color: #160b09;"&gt;c&lt;/span&gt;&lt;span style="color: #170d0c;"&gt;e&lt;/span&gt;&lt;span style="color: #332824;"&gt;i&lt;/span&gt;&lt;span style="color: #4b521c;"&gt;d&lt;/span&gt;&lt;span style="color: #4c5d19;"&gt;s&lt;/span&gt;&lt;span style="color: #4e5f18;"&gt;z&lt;/span&gt;&lt;span style="color: #3a4010;"&gt;b&lt;/span&gt;&lt;span style="color: #5f6623;"&gt;q&lt;/span&gt;&lt;span style="color: #7a6d36;"&gt;e&lt;/span&gt;&lt;span style="color: #a96751;"&gt;u&lt;/span&gt;&lt;span style="color: #d3987a;"&gt;u&lt;/span&gt;&lt;span style="color: #edb091;"&gt;j&lt;/span&gt;&lt;span style="color: #cd9272;"&gt;a&lt;/span&gt;&lt;span style="color: #c27b65;"&gt;h&lt;/span&gt;&lt;span style="color: #d4977a;"&gt;b&lt;/span&gt;&lt;span style="color: #d29884;"&gt;a&lt;/span&gt;&lt;span style="color: #e6a891;"&gt;q&lt;/span&gt;&lt;span style="color: #efb59d;"&gt;s&lt;/span&gt;&lt;span style="color: #f4baa4;"&gt;m&lt;/span&gt;&lt;span style="color: #dc9d8b;"&gt;l&lt;/span&gt;
&lt;span style="color: #828043;"&gt;p&lt;/span&gt;&lt;span style="color: #879548;"&gt;a&lt;/span&gt;&lt;span style="color: #77924f;"&gt;m&lt;/span&gt;&lt;span style="color: #607236;"&gt;y&lt;/span&gt;&lt;span style="color: #6a7829;"&gt;n&lt;/span&gt;&lt;span style="color: #6d823d;"&gt;f&lt;/span&gt;&lt;span style="color: #647e34;"&gt;i&lt;/span&gt;&lt;span style="color: #5b7432;"&gt;o&lt;/span&gt;&lt;span style="color: #61792f;"&gt;x&lt;/span&gt;&lt;span style="color: #6e8432;"&gt;j&lt;/span&gt;&lt;span style="color: #829845;"&gt;z&lt;/span&gt;&lt;span style="color: #4a462b;"&gt;z&lt;/span&gt;&lt;span style="color: #2e2623;"&gt;n&lt;/span&gt;&lt;span style="color: #201614;"&gt;i&lt;/span&gt;&lt;span style="color: #271918;"&gt;d&lt;/span&gt;&lt;span style="color: #201615;"&gt;g&lt;/span&gt;&lt;span style="color: #201816;"&gt;i&lt;/span&gt;&lt;span style="color: #2c2626;"&gt;e&lt;/span&gt;&lt;span style="color: #3e2e2f;"&gt;w&lt;/span&gt;&lt;span style="color: #3f211f;"&gt;m&lt;/span&gt;&lt;span style="color: #33201c;"&gt;z&lt;/span&gt;&lt;span style="color: #372727;"&gt;q&lt;/span&gt;&lt;span style="color: #4a3b38;"&gt;w&lt;/span&gt;&lt;span style="color: #43312f;"&gt;z&lt;/span&gt;&lt;span style="color: #332729;"&gt;y&lt;/span&gt;&lt;span style="color: #3f3432;"&gt;x&lt;/span&gt;&lt;span style="color: #392f2d;"&gt;z&lt;/span&gt;&lt;span style="color: #221413;"&gt;o&lt;/span&gt;&lt;span style="color: #160c0b;"&gt;q&lt;/span&gt;&lt;span style="color: #150706;"&gt;m&lt;/span&gt;&lt;span style="color: #160a0a;"&gt;a&lt;/span&gt;&lt;span style="color: #211515;"&gt;g&lt;/span&gt;&lt;span style="color: #230f10;"&gt;m&lt;/span&gt;&lt;span style="color: #4a4d18;"&gt;m&lt;/span&gt;&lt;span style="color: #3e4b15;"&gt;e&lt;/span&gt;&lt;span style="color: #415412;"&gt;a&lt;/span&gt;&lt;span style="color: #3a4412;"&gt;s&lt;/span&gt;&lt;span style="color: #535f21;"&gt;m&lt;/span&gt;&lt;span style="color: #6c7234;"&gt;o&lt;/span&gt;&lt;span style="color: #9c6f46;"&gt;p&lt;/span&gt;&lt;span style="color: #bc7e67;"&gt;w&lt;/span&gt;&lt;span style="color: #ebae91;"&gt;n&lt;/span&gt;&lt;span style="color: #ffcaa8;"&gt;p&lt;/span&gt;&lt;span style="color: #fcbba7;"&gt;j&lt;/span&gt;&lt;span style="color: #e5a38d;"&gt;v&lt;/span&gt;&lt;span style="color: #d79b83;"&gt;s&lt;/span&gt;&lt;span style="color: #d09380;"&gt;p&lt;/span&gt;&lt;span style="color: #db9d88;"&gt;d&lt;/span&gt;&lt;span style="color: #e0a18f;"&gt;w&lt;/span&gt;&lt;span style="color: #d1947f;"&gt;l&lt;/span&gt;
&lt;span style="color: #8b8555;"&gt;q&lt;/span&gt;&lt;span style="color: #696c3d;"&gt;w&lt;/span&gt;&lt;span style="color: #948220;"&gt;c&lt;/span&gt;&lt;span style="color: #858c56;"&gt;m&lt;/span&gt;&lt;span style="color: #aea06f;"&gt;v&lt;/span&gt;&lt;span style="color: #848949;"&gt;b&lt;/span&gt;&lt;span style="color: #668238;"&gt;j&lt;/span&gt;&lt;span style="color: #7e9a4d;"&gt;v&lt;/span&gt;&lt;span style="color: #87a146;"&gt;p&lt;/span&gt;&lt;span style="color: #9bb659;"&gt;a&lt;/span&gt;&lt;span style="color: #97b265;"&gt;h&lt;/span&gt;&lt;span style="color: #4b4930;"&gt;p&lt;/span&gt;&lt;span style="color: #362c2a;"&gt;g&lt;/span&gt;&lt;span style="color: #201615;"&gt;t&lt;/span&gt;&lt;span style="color: #251a18;"&gt;c&lt;/span&gt;&lt;span style="color: #190f0e;"&gt;l&lt;/span&gt;&lt;span style="color: #150c0d;"&gt;t&lt;/span&gt;&lt;span style="color: #1b1213;"&gt;u&lt;/span&gt;&lt;span style="color: #2a1816;"&gt;x&lt;/span&gt;&lt;span style="color: #3d1a14;"&gt;h&lt;/span&gt;&lt;span style="color: #4a1b13;"&gt;k&lt;/span&gt;&lt;span style="color: #411c16;"&gt;t&lt;/span&gt;&lt;span style="color: #4a211d;"&gt;v&lt;/span&gt;&lt;span style="color: #4a2721;"&gt;z&lt;/span&gt;&lt;span style="color: #593630;"&gt;d&lt;/span&gt;&lt;span style="color: #593129;"&gt;r&lt;/span&gt;&lt;span style="color: #431a14;"&gt;s&lt;/span&gt;&lt;span style="color: #2c100d;"&gt;t&lt;/span&gt;&lt;span style="color: #261714;"&gt;v&lt;/span&gt;&lt;span style="color: #210f0f;"&gt;p&lt;/span&gt;&lt;span style="color: #1d0b0b;"&gt;f&lt;/span&gt;&lt;span style="color: #1c0c0c;"&gt;l&lt;/span&gt;&lt;span style="color: #210f0b;"&gt;l&lt;/span&gt;&lt;span style="color: #7f9b37;"&gt;i&lt;/span&gt;&lt;span style="color: #688a2b;"&gt;x&lt;/span&gt;&lt;span style="color: #4b651b;"&gt;g&lt;/span&gt;&lt;span style="color: #536617;"&gt;j&lt;/span&gt;&lt;span style="color: #698028;"&gt;h&lt;/span&gt;&lt;span style="color: #57621e;"&gt;c&lt;/span&gt;&lt;span style="color: #6f5530;"&gt;y&lt;/span&gt;&lt;span style="color: #ad6a57;"&gt;i&lt;/span&gt;&lt;span style="color: #d5917c;"&gt;j&lt;/span&gt;&lt;span style="color: #fcb99c;"&gt;o&lt;/span&gt;&lt;span style="color: #fcbaa2;"&gt;o&lt;/span&gt;&lt;span style="color: #f0ad93;"&gt;d&lt;/span&gt;&lt;span style="color: #ca8c73;"&gt;q&lt;/span&gt;&lt;span style="color: #bd876b;"&gt;z&lt;/span&gt;&lt;span style="color: #ba826b;"&gt;x&lt;/span&gt;&lt;span style="color: #bc826e;"&gt;l&lt;/span&gt;&lt;span style="color: #b77a68;"&gt;x&lt;/span&gt;
&lt;span style="color: #bb9556;"&gt;f&lt;/span&gt;&lt;span style="color: #928332;"&gt;w&lt;/span&gt;&lt;span style="color: #989141;"&gt;r&lt;/span&gt;&lt;span style="color: #f7af99;"&gt;a&lt;/span&gt;&lt;span style="color: #fbc2a4;"&gt;v&lt;/span&gt;&lt;span style="color: #b89a74;"&gt;u&lt;/span&gt;&lt;span style="color: #9cab6a;"&gt;s&lt;/span&gt;&lt;span style="color: #a3ba6a;"&gt;o&lt;/span&gt;&lt;span style="color: #96b45a;"&gt;o&lt;/span&gt;&lt;span style="color: #90af52;"&gt;n&lt;/span&gt;&lt;span style="color: #8aa443;"&gt;d&lt;/span&gt;&lt;span style="color: #707b53;"&gt;t&lt;/span&gt;&lt;span style="color: #281e1c;"&gt;z&lt;/span&gt;&lt;span style="color: #1b1110;"&gt;o&lt;/span&gt;&lt;span style="color: #180e0d;"&gt;b&lt;/span&gt;&lt;span style="color: #160c0b;"&gt;x&lt;/span&gt;&lt;span style="color: #120a08;"&gt;v&lt;/span&gt;&lt;span style="color: #120a08;"&gt;l&lt;/span&gt;&lt;span style="color: #261110;"&gt;f&lt;/span&gt;&lt;span style="color: #3f1e17;"&gt;x&lt;/span&gt;&lt;span style="color: #572214;"&gt;k&lt;/span&gt;&lt;span style="color: #571f12;"&gt;n&lt;/span&gt;&lt;span style="color: #5f2517;"&gt;h&lt;/span&gt;&lt;span style="color: #642b1a;"&gt;y&lt;/span&gt;&lt;span style="color: #702f1d;"&gt;b&lt;/span&gt;&lt;span style="color: #7a3120;"&gt;l&lt;/span&gt;&lt;span style="color: #773320;"&gt;p&lt;/span&gt;&lt;span style="color: #6a3223;"&gt;b&lt;/span&gt;&lt;span style="color: #50231d;"&gt;i&lt;/span&gt;&lt;span style="color: #321414;"&gt;a&lt;/span&gt;&lt;span style="color: #3c1917;"&gt;y&lt;/span&gt;&lt;span style="color: #221616;"&gt;n&lt;/span&gt;&lt;span style="color: #32100f;"&gt;w&lt;/span&gt;&lt;span style="color: #778a3b;"&gt;q&lt;/span&gt;&lt;span style="color: #688a29;"&gt;o&lt;/span&gt;&lt;span style="color: #5c7b1d;"&gt;s&lt;/span&gt;&lt;span style="color: #587022;"&gt;k&lt;/span&gt;&lt;span style="color: #6e882d;"&gt;h&lt;/span&gt;&lt;span style="color: #607322;"&gt;g&lt;/span&gt;&lt;span style="color: #635526;"&gt;z&lt;/span&gt;&lt;span style="color: #ac6a54;"&gt;u&lt;/span&gt;&lt;span style="color: #b76f61;"&gt;k&lt;/span&gt;&lt;span style="color: #d58c7b;"&gt;t&lt;/span&gt;&lt;span style="color: #dd957f;"&gt;u&lt;/span&gt;&lt;span style="color: #de9c82;"&gt;y&lt;/span&gt;&lt;span style="color: #bb8265;"&gt;v&lt;/span&gt;&lt;span style="color: #99624d;"&gt;r&lt;/span&gt;&lt;span style="color: #945c4b;"&gt;u&lt;/span&gt;&lt;span style="color: #9d6453;"&gt;g&lt;/span&gt;&lt;span style="color: #a9725e;"&gt;x&lt;/span&gt;
&lt;span style="color: #d59069;"&gt;s&lt;/span&gt;&lt;span style="color: #997f35;"&gt;q&lt;/span&gt;&lt;span style="color: #5e602e;"&gt;k&lt;/span&gt;&lt;span style="color: #b66a5d;"&gt;z&lt;/span&gt;&lt;span style="color: #f89a92;"&gt;o&lt;/span&gt;&lt;span style="color: #e2a07d;"&gt;m&lt;/span&gt;&lt;span style="color: #aeb16a;"&gt;l&lt;/span&gt;&lt;span style="color: #abbd69;"&gt;e&lt;/span&gt;&lt;span style="color: #9bb461;"&gt;n&lt;/span&gt;&lt;span style="color: #76943e;"&gt;t&lt;/span&gt;&lt;span style="color: #769538;"&gt;f&lt;/span&gt;&lt;span style="color: #7f9542;"&gt;m&lt;/span&gt;&lt;span style="color: #2f261f;"&gt;h&lt;/span&gt;&lt;span style="color: #1f1715;"&gt;c&lt;/span&gt;&lt;span style="color: #180e0d;"&gt;c&lt;/span&gt;&lt;span style="color: #150b0a;"&gt;w&lt;/span&gt;&lt;span style="color: #120807;"&gt;u&lt;/span&gt;&lt;span style="color: #140a09;"&gt;n&lt;/span&gt;&lt;span style="color: #200e0c;"&gt;d&lt;/span&gt;&lt;span style="color: #451f16;"&gt;b&lt;/span&gt;&lt;span style="color: #5b2618;"&gt;m&lt;/span&gt;&lt;span style="color: #642715;"&gt;y&lt;/span&gt;&lt;span style="color: #73321e;"&gt;l&lt;/span&gt;&lt;span style="color: #7a3621;"&gt;f&lt;/span&gt;&lt;span style="color: #7a3621;"&gt;s&lt;/span&gt;&lt;span style="color: #743724;"&gt;k&lt;/span&gt;&lt;span style="color: #3a1b16;"&gt;a&lt;/span&gt;&lt;span style="color: #321817;"&gt;k&lt;/span&gt;&lt;span style="color: #794039;"&gt;e&lt;/span&gt;&lt;span style="color: #c78668;"&gt;g&lt;/span&gt;&lt;span style="color: #90604c;"&gt;h&lt;/span&gt;&lt;span style="color: #3a0e0b;"&gt;w&lt;/span&gt;&lt;span style="color: #6a110d;"&gt;x&lt;/span&gt;&lt;span style="color: #748d32;"&gt;r&lt;/span&gt;&lt;span style="color: #769132;"&gt;w&lt;/span&gt;&lt;span style="color: #6a8a1d;"&gt;m&lt;/span&gt;&lt;span style="color: #75912a;"&gt;d&lt;/span&gt;&lt;span style="color: #7c9831;"&gt;h&lt;/span&gt;&lt;span style="color: #779138;"&gt;q&lt;/span&gt;&lt;span style="color: #777f34;"&gt;r&lt;/span&gt;&lt;span style="color: #8d5f3b;"&gt;b&lt;/span&gt;&lt;span style="color: #9b5144;"&gt;v&lt;/span&gt;&lt;span style="color: #aa6254;"&gt;d&lt;/span&gt;&lt;span style="color: #b97663;"&gt;j&lt;/span&gt;&lt;span style="color: #b77b63;"&gt;x&lt;/span&gt;&lt;span style="color: #aa775c;"&gt;f&lt;/span&gt;&lt;span style="color: #94624b;"&gt;f&lt;/span&gt;&lt;span style="color: #8c5c46;"&gt;r&lt;/span&gt;&lt;span style="color: #945f4d;"&gt;t&lt;/span&gt;&lt;span style="color: #a26e59;"&gt;i&lt;/span&gt;
&lt;span style="color: #dc866b;"&gt;t&lt;/span&gt;&lt;span style="color: #94643e;"&gt;f&lt;/span&gt;&lt;span style="color: #585427;"&gt;h&lt;/span&gt;&lt;span style="color: #864736;"&gt;e&lt;/span&gt;&lt;span style="color: #b85b54;"&gt;l&lt;/span&gt;&lt;span style="color: #f2967d;"&gt;z&lt;/span&gt;&lt;span style="color: #b2a264;"&gt;p&lt;/span&gt;&lt;span style="color: #8e9343;"&gt;l&lt;/span&gt;&lt;span style="color: #879c3d;"&gt;k&lt;/span&gt;&lt;span style="color: #8da74e;"&gt;t&lt;/span&gt;&lt;span style="color: #8daf51;"&gt;s&lt;/span&gt;&lt;span style="color: #90ad53;"&gt;r&lt;/span&gt;&lt;span style="color: #292114;"&gt;q&lt;/span&gt;&lt;span style="color: #170d0c;"&gt;q&lt;/span&gt;&lt;span style="color: #120a08;"&gt;j&lt;/span&gt;&lt;span style="color: #130908;"&gt;m&lt;/span&gt;&lt;span style="color: #190b0a;"&gt;c&lt;/span&gt;&lt;span style="color: #1f0d09;"&gt;n&lt;/span&gt;&lt;span style="color: #210e08;"&gt;u&lt;/span&gt;&lt;span style="color: #381b15;"&gt;s&lt;/span&gt;&lt;span style="color: #532d20;"&gt;f&lt;/span&gt;&lt;span style="color: #51251a;"&gt;w&lt;/span&gt;&lt;span style="color: #522015;"&gt;n&lt;/span&gt;&lt;span style="color: #5f2114;"&gt;i&lt;/span&gt;&lt;span style="color: #90482f;"&gt;f&lt;/span&gt;&lt;span style="color: #502012;"&gt;l&lt;/span&gt;&lt;span style="color: #4f1e10;"&gt;o&lt;/span&gt;&lt;span style="color: #5b291e;"&gt;k&lt;/span&gt;&lt;span style="color: #f2a976;"&gt;c&lt;/span&gt;&lt;span style="color: #d89771;"&gt;h&lt;/span&gt;&lt;span style="color: #97573b;"&gt;t&lt;/span&gt;&lt;span style="color: #251113;"&gt;w&lt;/span&gt;&lt;span style="color: #891f11;"&gt;n&lt;/span&gt;&lt;span style="color: #74902c;"&gt;a&lt;/span&gt;&lt;span style="color: #7d9c35;"&gt;b&lt;/span&gt;&lt;span style="color: #97b545;"&gt;y&lt;/span&gt;&lt;span style="color: #8ea940;"&gt;a&lt;/span&gt;&lt;span style="color: #94b54c;"&gt;q&lt;/span&gt;&lt;span style="color: #93b64e;"&gt;k&lt;/span&gt;&lt;span style="color: #8ea346;"&gt;l&lt;/span&gt;&lt;span style="color: #948d3f;"&gt;k&lt;/span&gt;&lt;span style="color: #914e3d;"&gt;d&lt;/span&gt;&lt;span style="color: #935643;"&gt;c&lt;/span&gt;&lt;span style="color: #ac765c;"&gt;a&lt;/span&gt;&lt;span style="color: #b68469;"&gt;t&lt;/span&gt;&lt;span style="color: #ac7a63;"&gt;m&lt;/span&gt;&lt;span style="color: #a37158;"&gt;n&lt;/span&gt;&lt;span style="color: #8f5f49;"&gt;w&lt;/span&gt;&lt;span style="color: #925d4d;"&gt;a&lt;/span&gt;&lt;span style="color: #a27059;"&gt;i&lt;/span&gt;
&lt;span style="color: #95453a;"&gt;o&lt;/span&gt;&lt;span style="color: #d89165;"&gt;f&lt;/span&gt;&lt;span style="color: #835c3b;"&gt;e&lt;/span&gt;&lt;span style="color: #844c33;"&gt;c&lt;/span&gt;&lt;span style="color: #8b3f32;"&gt;o&lt;/span&gt;&lt;span style="color: #d9856d;"&gt;j&lt;/span&gt;&lt;span style="color: #a69057;"&gt;n&lt;/span&gt;&lt;span style="color: #8b8f43;"&gt;c&lt;/span&gt;&lt;span style="color: #778a30;"&gt;u&lt;/span&gt;&lt;span style="color: #99b15b;"&gt;q&lt;/span&gt;&lt;span style="color: #95b456;"&gt;k&lt;/span&gt;&lt;span style="color: #9ebb61;"&gt;o&lt;/span&gt;&lt;span style="color: #333414;"&gt;n&lt;/span&gt;&lt;span style="color: #180e0c;"&gt;y&lt;/span&gt;&lt;span style="color: #110907;"&gt;p&lt;/span&gt;&lt;span style="color: #130908;"&gt;o&lt;/span&gt;&lt;span style="color: #180a09;"&gt;w&lt;/span&gt;&lt;span style="color: #2c110a;"&gt;q&lt;/span&gt;&lt;span style="color: #270f0d;"&gt;e&lt;/span&gt;&lt;span style="color: #2f140d;"&gt;h&lt;/span&gt;&lt;span style="color: #481e12;"&gt;b&lt;/span&gt;&lt;span style="color: #481d14;"&gt;p&lt;/span&gt;&lt;span style="color: #48190f;"&gt;l&lt;/span&gt;&lt;span style="color: #4c170f;"&gt;d&lt;/span&gt;&lt;span style="color: #99533a;"&gt;p&lt;/span&gt;&lt;span style="color: #34180c;"&gt;f&lt;/span&gt;&lt;span style="color: #471b12;"&gt;q&lt;/span&gt;&lt;span style="color: #954e38;"&gt;c&lt;/span&gt;&lt;span style="color: #c37952;"&gt;b&lt;/span&gt;&lt;span style="color: #fcaf81;"&gt;q&lt;/span&gt;&lt;span style="color: #da997b;"&gt;k&lt;/span&gt;&lt;span style="color: #38121d;"&gt;q&lt;/span&gt;&lt;span style="color: #d29b62;"&gt;v&lt;/span&gt;&lt;span style="color: #6d922b;"&gt;p&lt;/span&gt;&lt;span style="color: #789c32;"&gt;s&lt;/span&gt;&lt;span style="color: #85a633;"&gt;k&lt;/span&gt;&lt;span style="color: #92af43;"&gt;z&lt;/span&gt;&lt;span style="color: #91ae42;"&gt;g&lt;/span&gt;&lt;span style="color: #97ba52;"&gt;m&lt;/span&gt;&lt;span style="color: #a2c05e;"&gt;t&lt;/span&gt;&lt;span style="color: #9fa84f;"&gt;w&lt;/span&gt;&lt;span style="color: #9c5a44;"&gt;x&lt;/span&gt;&lt;span style="color: #975a47;"&gt;i&lt;/span&gt;&lt;span style="color: #b27a61;"&gt;j&lt;/span&gt;&lt;span style="color: #c6977b;"&gt;v&lt;/span&gt;&lt;span style="color: #c3947a;"&gt;x&lt;/span&gt;&lt;span style="color: #a8715c;"&gt;y&lt;/span&gt;&lt;span style="color: #95624d;"&gt;s&lt;/span&gt;&lt;span style="color: #91594a;"&gt;n&lt;/span&gt;&lt;span style="color: #9f6d56;"&gt;d&lt;/span&gt;
&lt;span style="color: #6d3222;"&gt;z&lt;/span&gt;&lt;span style="color: #b66b4e;"&gt;p&lt;/span&gt;&lt;span style="color: #e09d69;"&gt;s&lt;/span&gt;&lt;span style="color: #946342;"&gt;l&lt;/span&gt;&lt;span style="color: #82442f;"&gt;t&lt;/span&gt;&lt;span style="color: #bb755b;"&gt;h&lt;/span&gt;&lt;span style="color: #bf9b61;"&gt;q&lt;/span&gt;&lt;span style="color: #8d9548;"&gt;j&lt;/span&gt;&lt;span style="color: #8fa552;"&gt;k&lt;/span&gt;&lt;span style="color: #97b34c;"&gt;r&lt;/span&gt;&lt;span style="color: #97b04b;"&gt;a&lt;/span&gt;&lt;span style="color: #96ac4a;"&gt;v&lt;/span&gt;&lt;span style="color: #555c26;"&gt;i&lt;/span&gt;&lt;span style="color: #190e08;"&gt;w&lt;/span&gt;&lt;span style="color: #130908;"&gt;k&lt;/span&gt;&lt;span style="color: #110907;"&gt;a&lt;/span&gt;&lt;span style="color: #160c0b;"&gt;g&lt;/span&gt;&lt;span style="color: #2b0f0c;"&gt;k&lt;/span&gt;&lt;span style="color: #38150f;"&gt;h&lt;/span&gt;&lt;span style="color: #703c2e;"&gt;s&lt;/span&gt;&lt;span style="color: #733921;"&gt;d&lt;/span&gt;&lt;span style="color: #753c28;"&gt;d&lt;/span&gt;&lt;span style="color: #512a1b;"&gt;q&lt;/span&gt;&lt;span style="color: #391e15;"&gt;m&lt;/span&gt;&lt;span style="color: #7f3f24;"&gt;n&lt;/span&gt;&lt;span style="color: #36191b;"&gt;l&lt;/span&gt;&lt;span style="color: #864533;"&gt;k&lt;/span&gt;&lt;span style="color: #894132;"&gt;m&lt;/span&gt;&lt;span style="color: #c58569;"&gt;e&lt;/span&gt;&lt;span style="color: #c1997f;"&gt;y&lt;/span&gt;&lt;span style="color: #ffc38d;"&gt;p&lt;/span&gt;&lt;span style="color: #874837;"&gt;d&lt;/span&gt;&lt;span style="color: #a0c34f;"&gt;n&lt;/span&gt;&lt;span style="color: #95c25d;"&gt;h&lt;/span&gt;&lt;span style="color: #7ea42b;"&gt;p&lt;/span&gt;&lt;span style="color: #86a736;"&gt;g&lt;/span&gt;&lt;span style="color: #91b142;"&gt;p&lt;/span&gt;&lt;span style="color: #8ba63d;"&gt;f&lt;/span&gt;&lt;span style="color: #859e36;"&gt;p&lt;/span&gt;&lt;span style="color: #82973a;"&gt;a&lt;/span&gt;&lt;span style="color: #929045;"&gt;x&lt;/span&gt;&lt;span style="color: #af6657;"&gt;q&lt;/span&gt;&lt;span style="color: #b16e5d;"&gt;v&lt;/span&gt;&lt;span style="color: #cb927e;"&gt;f&lt;/span&gt;&lt;span style="color: #cb9885;"&gt;m&lt;/span&gt;&lt;span style="color: #d9a58d;"&gt;g&lt;/span&gt;&lt;span style="color: #d39f89;"&gt;g&lt;/span&gt;&lt;span style="color: #bc8570;"&gt;s&lt;/span&gt;&lt;span style="color: #985f4e;"&gt;q&lt;/span&gt;&lt;span style="color: #94644e;"&gt;n&lt;/span&gt;
&lt;span style="color: #643420;"&gt;l&lt;/span&gt;&lt;span style="color: #7e3b2b;"&gt;u&lt;/span&gt;&lt;span style="color: #de906a;"&gt;r&lt;/span&gt;&lt;span style="color: #aa8d55;"&gt;b&lt;/span&gt;&lt;span style="color: #824b2d;"&gt;g&lt;/span&gt;&lt;span style="color: #a9664c;"&gt;f&lt;/span&gt;&lt;span style="color: #e2a974;"&gt;n&lt;/span&gt;&lt;span style="color: #95954d;"&gt;q&lt;/span&gt;&lt;span style="color: #879b44;"&gt;r&lt;/span&gt;&lt;span style="color: #829e47;"&gt;r&lt;/span&gt;&lt;span style="color: #8da954;"&gt;p&lt;/span&gt;&lt;span style="color: #738b33;"&gt;g&lt;/span&gt;&lt;span style="color: #718a39;"&gt;v&lt;/span&gt;&lt;span style="color: #33270f;"&gt;c&lt;/span&gt;&lt;span style="color: #150707;"&gt;o&lt;/span&gt;&lt;span style="color: #140907;"&gt;k&lt;/span&gt;&lt;span style="color: #110507;"&gt;i&lt;/span&gt;&lt;span style="color: #6d2e1c;"&gt;d&lt;/span&gt;&lt;span style="color: #3d1d0e;"&gt;q&lt;/span&gt;&lt;span style="color: #793d25;"&gt;y&lt;/span&gt;&lt;span style="color: #8a472c;"&gt;d&lt;/span&gt;&lt;span style="color: #955031;"&gt;n&lt;/span&gt;&lt;span style="color: #86482f;"&gt;o&lt;/span&gt;&lt;span style="color: #482418;"&gt;z&lt;/span&gt;&lt;span style="color: #bd725b;"&gt;s&lt;/span&gt;&lt;span style="color: #fed2ad;"&gt;a&lt;/span&gt;&lt;span style="color: #98524a;"&gt;g&lt;/span&gt;&lt;span style="color: #894434;"&gt;y&lt;/span&gt;&lt;span style="color: #ad5642;"&gt;s&lt;/span&gt;&lt;span style="color: #feba8d;"&gt;w&lt;/span&gt;&lt;span style="color: #fed095;"&gt;m&lt;/span&gt;&lt;span style="color: #ad974e;"&gt;e&lt;/span&gt;&lt;span style="color: #a9ca55;"&gt;r&lt;/span&gt;&lt;span style="color: #a9ca5f;"&gt;d&lt;/span&gt;&lt;span style="color: #9cbf47;"&gt;f&lt;/span&gt;&lt;span style="color: #99bb43;"&gt;x&lt;/span&gt;&lt;span style="color: #9cbf47;"&gt;i&lt;/span&gt;&lt;span style="color: #93ae43;"&gt;t&lt;/span&gt;&lt;span style="color: #90ab44;"&gt;o&lt;/span&gt;&lt;span style="color: #8c9d3d;"&gt;z&lt;/span&gt;&lt;span style="color: #a09b4a;"&gt;l&lt;/span&gt;&lt;span style="color: #c8876b;"&gt;d&lt;/span&gt;&lt;span style="color: #c27968;"&gt;g&lt;/span&gt;&lt;span style="color: #dfa08e;"&gt;h&lt;/span&gt;&lt;span style="color: #e9ae9c;"&gt;g&lt;/span&gt;&lt;span style="color: #ebbba4;"&gt;u&lt;/span&gt;&lt;span style="color: #efc0a2;"&gt;r&lt;/span&gt;&lt;span style="color: #dda38b;"&gt;o&lt;/span&gt;&lt;span style="color: #b07964;"&gt;y&lt;/span&gt;&lt;span style="color: #966a4f;"&gt;i&lt;/span&gt;
&lt;span style="color: #6c3c25;"&gt;n&lt;/span&gt;&lt;span style="color: #683524;"&gt;c&lt;/span&gt;&lt;span style="color: #b2684d;"&gt;v&lt;/span&gt;&lt;span style="color: #b99257;"&gt;b&lt;/span&gt;&lt;span style="color: #88553a;"&gt;b&lt;/span&gt;&lt;span style="color: #8c4f3a;"&gt;o&lt;/span&gt;&lt;span style="color: #e19e74;"&gt;c&lt;/span&gt;&lt;span style="color: #97884d;"&gt;i&lt;/span&gt;&lt;span style="color: #73803b;"&gt;n&lt;/span&gt;&lt;span style="color: #708538;"&gt;v&lt;/span&gt;&lt;span style="color: #768f3c;"&gt;e&lt;/span&gt;&lt;span style="color: #6c8534;"&gt;z&lt;/span&gt;&lt;span style="color: #536227;"&gt;z&lt;/span&gt;&lt;span style="color: #686d2d;"&gt;v&lt;/span&gt;&lt;span style="color: #1e0c0a;"&gt;c&lt;/span&gt;&lt;span style="color: #260d09;"&gt;f&lt;/span&gt;&lt;span style="color: #110706;"&gt;t&lt;/span&gt;&lt;span style="color: #7a331f;"&gt;l&lt;/span&gt;&lt;span style="color: #673d2d;"&gt;y&lt;/span&gt;&lt;span style="color: #94523c;"&gt;i&lt;/span&gt;&lt;span style="color: #8d4932;"&gt;l&lt;/span&gt;&lt;span style="color: #865534;"&gt;k&lt;/span&gt;&lt;span style="color: #6c3b2c;"&gt;m&lt;/span&gt;&lt;span style="color: #7a2e1e;"&gt;r&lt;/span&gt;&lt;span style="color: #c06e56;"&gt;r&lt;/span&gt;&lt;span style="color: #fed5b7;"&gt;s&lt;/span&gt;&lt;span style="color: #ffbea2;"&gt;l&lt;/span&gt;&lt;span style="color: #a34539;"&gt;j&lt;/span&gt;&lt;span style="color: #c16e4c;"&gt;h&lt;/span&gt;&lt;span style="color: #ef9269;"&gt;k&lt;/span&gt;&lt;span style="color: #fba276;"&gt;r&lt;/span&gt;&lt;span style="color: #a4ba58;"&gt;u&lt;/span&gt;&lt;span style="color: #a6c657;"&gt;m&lt;/span&gt;&lt;span style="color: #a3c459;"&gt;n&lt;/span&gt;&lt;span style="color: #a4ca59;"&gt;w&lt;/span&gt;&lt;span style="color: #a9ce5a;"&gt;o&lt;/span&gt;&lt;span style="color: #9bc04e;"&gt;b&lt;/span&gt;&lt;span style="color: #9cbc57;"&gt;y&lt;/span&gt;&lt;span style="color: #aac868;"&gt;w&lt;/span&gt;&lt;span style="color: #b8c677;"&gt;o&lt;/span&gt;&lt;span style="color: #c4b780;"&gt;u&lt;/span&gt;&lt;span style="color: #cf8376;"&gt;b&lt;/span&gt;&lt;span style="color: #c4786a;"&gt;o&lt;/span&gt;&lt;span style="color: #df9e8c;"&gt;t&lt;/span&gt;&lt;span style="color: #f6b9a4;"&gt;x&lt;/span&gt;&lt;span style="color: #fbc4af;"&gt;r&lt;/span&gt;&lt;span style="color: #f1bfa4;"&gt;y&lt;/span&gt;&lt;span style="color: #eab596;"&gt;q&lt;/span&gt;&lt;span style="color: #b38468;"&gt;c&lt;/span&gt;&lt;span style="color: #7e5d3a;"&gt;x&lt;/span&gt;
&lt;span style="color: #82492c;"&gt;z&lt;/span&gt;&lt;span style="color: #723b27;"&gt;o&lt;/span&gt;&lt;span style="color: #9a573d;"&gt;i&lt;/span&gt;&lt;span style="color: #dd9b67;"&gt;l&lt;/span&gt;&lt;span style="color: #995d45;"&gt;f&lt;/span&gt;&lt;span style="color: #955845;"&gt;z&lt;/span&gt;&lt;span style="color: #d99973;"&gt;e&lt;/span&gt;&lt;span style="color: #9c7b50;"&gt;r&lt;/span&gt;&lt;span style="color: #6d6e34;"&gt;i&lt;/span&gt;&lt;span style="color: #6e823d;"&gt;m&lt;/span&gt;&lt;span style="color: #7a9743;"&gt;b&lt;/span&gt;&lt;span style="color: #4e5f28;"&gt;a&lt;/span&gt;&lt;span style="color: #3a4219;"&gt;h&lt;/span&gt;&lt;span style="color: #40491e;"&gt;n&lt;/span&gt;&lt;span style="color: #33371c;"&gt;n&lt;/span&gt;&lt;span style="color: #6b1810;"&gt;d&lt;/span&gt;&lt;span style="color: #350c08;"&gt;c&lt;/span&gt;&lt;span style="color: #4a1915;"&gt;o&lt;/span&gt;&lt;span style="color: #994930;"&gt;c&lt;/span&gt;&lt;span style="color: #8e4228;"&gt;y&lt;/span&gt;&lt;span style="color: #7e361e;"&gt;d&lt;/span&gt;&lt;span style="color: #853a25;"&gt;w&lt;/span&gt;&lt;span style="color: #732e1e;"&gt;z&lt;/span&gt;&lt;span style="color: #6e261a;"&gt;r&lt;/span&gt;&lt;span style="color: #b45e45;"&gt;q&lt;/span&gt;&lt;span style="color: #faa588;"&gt;w&lt;/span&gt;&lt;span style="color: #fdc69f;"&gt;j&lt;/span&gt;&lt;span style="color: #f89e83;"&gt;p&lt;/span&gt;&lt;span style="color: #6f221a;"&gt;n&lt;/span&gt;&lt;span style="color: #be563d;"&gt;m&lt;/span&gt;&lt;span style="color: #e27b58;"&gt;m&lt;/span&gt;&lt;span style="color: #97aa50;"&gt;m&lt;/span&gt;&lt;span style="color: #a2b549;"&gt;a&lt;/span&gt;&lt;span style="color: #97a63d;"&gt;u&lt;/span&gt;&lt;span style="color: #96b14a;"&gt;y&lt;/span&gt;&lt;span style="color: #afc15e;"&gt;f&lt;/span&gt;&lt;span style="color: #b6c66d;"&gt;u&lt;/span&gt;&lt;span style="color: #c7ce8a;"&gt;d&lt;/span&gt;&lt;span style="color: #e2d5a0;"&gt;w&lt;/span&gt;&lt;span style="color: #f5d5af;"&gt;d&lt;/span&gt;&lt;span style="color: #ffe8ce;"&gt;p&lt;/span&gt;&lt;span style="color: #f8b49f;"&gt;y&lt;/span&gt;&lt;span style="color: #b46e62;"&gt;d&lt;/span&gt;&lt;span style="color: #ca887a;"&gt;x&lt;/span&gt;&lt;span style="color: #dda292;"&gt;m&lt;/span&gt;&lt;span style="color: #e2aa99;"&gt;q&lt;/span&gt;&lt;span style="color: #dca98e;"&gt;b&lt;/span&gt;&lt;span style="color: #d4a385;"&gt;o&lt;/span&gt;&lt;span style="color: #a17a5b;"&gt;f&lt;/span&gt;&lt;span style="color: #9a8550;"&gt;e&lt;/span&gt;
&lt;span style="color: #b56b4e;"&gt;n&lt;/span&gt;&lt;span style="color: #76442d;"&gt;i&lt;/span&gt;&lt;span style="color: #824532;"&gt;b&lt;/span&gt;&lt;span style="color: #eda481;"&gt;n&lt;/span&gt;&lt;span style="color: #ae7355;"&gt;a&lt;/span&gt;&lt;span style="color: #8f553f;"&gt;r&lt;/span&gt;&lt;span style="color: #ce8f6e;"&gt;k&lt;/span&gt;&lt;span style="color: #a87f53;"&gt;k&lt;/span&gt;&lt;span style="color: #676032;"&gt;g&lt;/span&gt;&lt;span style="color: #565f2a;"&gt;y&lt;/span&gt;&lt;span style="color: #4a5f26;"&gt;w&lt;/span&gt;&lt;span style="color: #3d4512;"&gt;t&lt;/span&gt;&lt;span style="color: #272c0c;"&gt;l&lt;/span&gt;&lt;span style="color: #323e18;"&gt;w&lt;/span&gt;&lt;span style="color: #32341e;"&gt;o&lt;/span&gt;&lt;span style="color: #1a1819;"&gt;j&lt;/span&gt;&lt;span style="color: #53170f;"&gt;c&lt;/span&gt;&lt;span style="color: #3f0e0a;"&gt;i&lt;/span&gt;&lt;span style="color: #9e4c34;"&gt;n&lt;/span&gt;&lt;span style="color: #a45034;"&gt;z&lt;/span&gt;&lt;span style="color: #994529;"&gt;l&lt;/span&gt;&lt;span style="color: #974730;"&gt;d&lt;/span&gt;&lt;span style="color: #622014;"&gt;y&lt;/span&gt;&lt;span style="color: #9a4028;"&gt;p&lt;/span&gt;&lt;span style="color: #842b19;"&gt;a&lt;/span&gt;&lt;span style="color: #9e4733;"&gt;k&lt;/span&gt;&lt;span style="color: #9d4d42;"&gt;g&lt;/span&gt;&lt;span style="color: #da9786;"&gt;c&lt;/span&gt;&lt;span style="color: #9d4d46;"&gt;z&lt;/span&gt;&lt;span style="color: #843025;"&gt;l&lt;/span&gt;&lt;span style="color: #cc6e4a;"&gt;g&lt;/span&gt;&lt;span style="color: #8ea23f;"&gt;m&lt;/span&gt;&lt;span style="color: #7f8023;"&gt;u&lt;/span&gt;&lt;span style="color: #97973f;"&gt;h&lt;/span&gt;&lt;span style="color: #f8aa7a;"&gt;z&lt;/span&gt;&lt;span style="color: #fd88a3;"&gt;v&lt;/span&gt;&lt;span style="color: #fba5ae;"&gt;y&lt;/span&gt;&lt;span style="color: #fce4e0;"&gt;k&lt;/span&gt;&lt;span style="color: #ffeddf;"&gt;f&lt;/span&gt;&lt;span style="color: #fdead9;"&gt;e&lt;/span&gt;&lt;span style="color: #fce1c4;"&gt;i&lt;/span&gt;&lt;span style="color: #fec3a5;"&gt;c&lt;/span&gt;&lt;span style="color: #ad6d61;"&gt;y&lt;/span&gt;&lt;span style="color: #ab7062;"&gt;t&lt;/span&gt;&lt;span style="color: #aa7062;"&gt;z&lt;/span&gt;&lt;span style="color: #aa7261;"&gt;m&lt;/span&gt;&lt;span style="color: #aa7a63;"&gt;d&lt;/span&gt;&lt;span style="color: #a07059;"&gt;c&lt;/span&gt;&lt;span style="color: #836040;"&gt;v&lt;/span&gt;&lt;span style="color: #927c4a;"&gt;q&lt;/span&gt;
&lt;span style="color: #885041;"&gt;b&lt;/span&gt;&lt;span style="color: #713c2a;"&gt;h&lt;/span&gt;&lt;span style="color: #6b3628;"&gt;u&lt;/span&gt;&lt;span style="color: #c4866f;"&gt;z&lt;/span&gt;&lt;span style="color: #b37157;"&gt;w&lt;/span&gt;&lt;span style="color: #864d3c;"&gt;v&lt;/span&gt;&lt;span style="color: #b97b64;"&gt;k&lt;/span&gt;&lt;span style="color: #d59c6f;"&gt;c&lt;/span&gt;&lt;span style="color: #7c693f;"&gt;x&lt;/span&gt;&lt;span style="color: #585630;"&gt;j&lt;/span&gt;&lt;span style="color: #3f4521;"&gt;o&lt;/span&gt;&lt;span style="color: #2a2f0f;"&gt;d&lt;/span&gt;&lt;span style="color: #23280a;"&gt;v&lt;/span&gt;&lt;span style="color: #303716;"&gt;i&lt;/span&gt;&lt;span style="color: #2d3510;"&gt;k&lt;/span&gt;&lt;span style="color: #252314;"&gt;v&lt;/span&gt;&lt;span style="color: #1b1613;"&gt;e&lt;/span&gt;&lt;span style="color: #140f0c;"&gt;j&lt;/span&gt;&lt;span style="color: #9b4d39;"&gt;f&lt;/span&gt;&lt;span style="color: #a6432e;"&gt;k&lt;/span&gt;&lt;span style="color: #8f331c;"&gt;o&lt;/span&gt;&lt;span style="color: #772b1d;"&gt;o&lt;/span&gt;&lt;span style="color: #863824;"&gt;m&lt;/span&gt;&lt;span style="color: #702a20;"&gt;m&lt;/span&gt;&lt;span style="color: #511c16;"&gt;h&lt;/span&gt;&lt;span style="color: #8c4237;"&gt;m&lt;/span&gt;&lt;span style="color: #d7806f;"&gt;y&lt;/span&gt;&lt;span style="color: #fec0a7;"&gt;l&lt;/span&gt;&lt;span style="color: #f2a88d;"&gt;o&lt;/span&gt;&lt;span style="color: #a54a38;"&gt;t&lt;/span&gt;&lt;span style="color: #fe8d6d;"&gt;c&lt;/span&gt;&lt;span style="color: #ca7f55;"&gt;p&lt;/span&gt;&lt;span style="color: #e56e46;"&gt;a&lt;/span&gt;&lt;span style="color: #ff90a6;"&gt;w&lt;/span&gt;&lt;span style="color: #ff6e83;"&gt;p&lt;/span&gt;&lt;span style="color: #fbb4b8;"&gt;x&lt;/span&gt;&lt;span style="color: #feded1;"&gt;r&lt;/span&gt;&lt;span style="color: #ffdad1;"&gt;z&lt;/span&gt;&lt;span style="color: #ffdbcd;"&gt;a&lt;/span&gt;&lt;span style="color: #fecdbc;"&gt;p&lt;/span&gt;&lt;span style="color: #fdb59c;"&gt;i&lt;/span&gt;&lt;span style="color: #bc7d6c;"&gt;o&lt;/span&gt;&lt;span style="color: #8d5147;"&gt;s&lt;/span&gt;&lt;span style="color: #855040;"&gt;e&lt;/span&gt;&lt;span style="color: #854d3c;"&gt;x&lt;/span&gt;&lt;span style="color: #87503b;"&gt;d&lt;/span&gt;&lt;span style="color: #89533b;"&gt;z&lt;/span&gt;&lt;span style="color: #814f36;"&gt;b&lt;/span&gt;&lt;span style="color: #805739;"&gt;n&lt;/span&gt;&lt;span style="color: #7f6238;"&gt;f&lt;/span&gt;
&lt;span style="color: #5f3122;"&gt;l&lt;/span&gt;&lt;span style="color: #613324;"&gt;b&lt;/span&gt;&lt;span style="color: #623323;"&gt;u&lt;/span&gt;&lt;span style="color: #744032;"&gt;y&lt;/span&gt;&lt;span style="color: #85493f;"&gt;o&lt;/span&gt;&lt;span style="color: #7f4436;"&gt;c&lt;/span&gt;&lt;span style="color: #ac6b57;"&gt;k&lt;/span&gt;&lt;span style="color: #fab089;"&gt;n&lt;/span&gt;&lt;span style="color: #a17f59;"&gt;n&lt;/span&gt;&lt;span style="color: #665936;"&gt;y&lt;/span&gt;&lt;span style="color: #3d421a;"&gt;h&lt;/span&gt;&lt;span style="color: #2b3213;"&gt;q&lt;/span&gt;&lt;span style="color: #303716;"&gt;o&lt;/span&gt;&lt;span style="color: #2c3216;"&gt;i&lt;/span&gt;&lt;span style="color: #29300f;"&gt;m&lt;/span&gt;&lt;span style="color: #282e14;"&gt;d&lt;/span&gt;&lt;span style="color: #2b291d;"&gt;f&lt;/span&gt;&lt;span style="color: #1a1511;"&gt;e&lt;/span&gt;&lt;span style="color: #4d251d;"&gt;d&lt;/span&gt;&lt;span style="color: #a0402a;"&gt;f&lt;/span&gt;&lt;span style="color: #97371f;"&gt;u&lt;/span&gt;&lt;span style="color: #632518;"&gt;l&lt;/span&gt;&lt;span style="color: #782f28;"&gt;u&lt;/span&gt;&lt;span style="color: #853e2c;"&gt;m&lt;/span&gt;&lt;span style="color: #7f3729;"&gt;q&lt;/span&gt;&lt;span style="color: #883235;"&gt;r&lt;/span&gt;&lt;span style="color: #f99f9e;"&gt;q&lt;/span&gt;&lt;span style="color: #ffc4cb;"&gt;q&lt;/span&gt;&lt;span style="color: #ffc6bb;"&gt;t&lt;/span&gt;&lt;span style="color: #e0845f;"&gt;d&lt;/span&gt;&lt;span style="color: #ff8c8f;"&gt;v&lt;/span&gt;&lt;span style="color: #ff87a2;"&gt;f&lt;/span&gt;&lt;span style="color: #fc6983;"&gt;f&lt;/span&gt;&lt;span style="color: #fd5971;"&gt;q&lt;/span&gt;&lt;span style="color: #ff7d8d;"&gt;d&lt;/span&gt;&lt;span style="color: #fe918e;"&gt;t&lt;/span&gt;&lt;span style="color: #fea098;"&gt;s&lt;/span&gt;&lt;span style="color: #fda49c;"&gt;o&lt;/span&gt;&lt;span style="color: #fc9692;"&gt;g&lt;/span&gt;&lt;span style="color: #f3887e;"&gt;g&lt;/span&gt;&lt;span style="color: #d76b5f;"&gt;n&lt;/span&gt;&lt;span style="color: #b06b4c;"&gt;n&lt;/span&gt;&lt;span style="color: #9a4d39;"&gt;w&lt;/span&gt;&lt;span style="color: #8a4631;"&gt;c&lt;/span&gt;&lt;span style="color: #833c2a;"&gt;v&lt;/span&gt;&lt;span style="color: #823a24;"&gt;j&lt;/span&gt;&lt;span style="color: #84442b;"&gt;f&lt;/span&gt;&lt;span style="color: #7e4c31;"&gt;a&lt;/span&gt;&lt;span style="color: #805e39;"&gt;o&lt;/span&gt;&lt;span style="color: #8e8449;"&gt;j&lt;/span&gt;
&lt;span style="color: #5a3020;"&gt;g&lt;/span&gt;&lt;span style="color: #5c3120;"&gt;i&lt;/span&gt;&lt;span style="color: #5f3020;"&gt;v&lt;/span&gt;&lt;span style="color: #5d2f1f;"&gt;a&lt;/span&gt;&lt;span style="color: #6b3628;"&gt;u&lt;/span&gt;&lt;span style="color: #7b3d30;"&gt;l&lt;/span&gt;&lt;span style="color: #a96250;"&gt;s&lt;/span&gt;&lt;span style="color: #ec9f83;"&gt;l&lt;/span&gt;&lt;span style="color: #c8946c;"&gt;b&lt;/span&gt;&lt;span style="color: #7b6742;"&gt;l&lt;/span&gt;&lt;span style="color: #4b4923;"&gt;o&lt;/span&gt;&lt;span style="color: #38421d;"&gt;x&lt;/span&gt;&lt;span style="color: #3c491e;"&gt;q&lt;/span&gt;&lt;span style="color: #344318;"&gt;t&lt;/span&gt;&lt;span style="color: #293414;"&gt;n&lt;/span&gt;&lt;span style="color: #2c3111;"&gt;u&lt;/span&gt;&lt;span style="color: #25290e;"&gt;n&lt;/span&gt;&lt;span style="color: #302d1c;"&gt;f&lt;/span&gt;&lt;span style="color: #251309;"&gt;j&lt;/span&gt;&lt;span style="color: #b0493a;"&gt;t&lt;/span&gt;&lt;span style="color: #8a2b19;"&gt;m&lt;/span&gt;&lt;span style="color: #6d2614;"&gt;x&lt;/span&gt;&lt;span style="color: #792920;"&gt;g&lt;/span&gt;&lt;span style="color: #97373b;"&gt;i&lt;/span&gt;&lt;span style="color: #99424b;"&gt;z&lt;/span&gt;&lt;span style="color: #e69f9b;"&gt;c&lt;/span&gt;&lt;span style="color: #fec0c5;"&gt;r&lt;/span&gt;&lt;span style="color: #fdebeb;"&gt;e&lt;/span&gt;&lt;span style="color: #ffc9d2;"&gt;c&lt;/span&gt;&lt;span style="color: #ffaf84;"&gt;f&lt;/span&gt;&lt;span style="color: #fa777d;"&gt;o&lt;/span&gt;&lt;span style="color: #ff617d;"&gt;j&lt;/span&gt;&lt;span style="color: #f84a61;"&gt;n&lt;/span&gt;&lt;span style="color: #d00824;"&gt;j&lt;/span&gt;&lt;span style="color: #ea2133;"&gt;k&lt;/span&gt;&lt;span style="color: #ff4755;"&gt;i&lt;/span&gt;&lt;span style="color: #db3b43;"&gt;u&lt;/span&gt;&lt;span style="color: #cc3c45;"&gt;c&lt;/span&gt;&lt;span style="color: #fd6e74;"&gt;t&lt;/span&gt;&lt;span style="color: #d02b39;"&gt;w&lt;/span&gt;&lt;span style="color: #d2875f;"&gt;o&lt;/span&gt;&lt;span style="color: #d18d66;"&gt;i&lt;/span&gt;&lt;span style="color: #a14836;"&gt;u&lt;/span&gt;&lt;span style="color: #873925;"&gt;f&lt;/span&gt;&lt;span style="color: #7f3220;"&gt;c&lt;/span&gt;&lt;span style="color: #823a24;"&gt;h&lt;/span&gt;&lt;span style="color: #86442c;"&gt;a&lt;/span&gt;&lt;span style="color: #7f5032;"&gt;p&lt;/span&gt;&lt;span style="color: #85683e;"&gt;n&lt;/span&gt;&lt;span style="color: #4f5b1b;"&gt;j&lt;/span&gt;
&lt;span style="color: #582e1e;"&gt;i&lt;/span&gt;&lt;span style="color: #5a3421;"&gt;z&lt;/span&gt;&lt;span style="color: #5c311e;"&gt;g&lt;/span&gt;&lt;span style="color: #5c3120;"&gt;p&lt;/span&gt;&lt;span style="color: #623120;"&gt;h&lt;/span&gt;&lt;span style="color: #6e3627;"&gt;g&lt;/span&gt;&lt;span style="color: #8d4a39;"&gt;r&lt;/span&gt;&lt;span style="color: #cd856c;"&gt;z&lt;/span&gt;&lt;span style="color: #f9b586;"&gt;k&lt;/span&gt;&lt;span style="color: #9a7853;"&gt;u&lt;/span&gt;&lt;span style="color: #5e5631;"&gt;e&lt;/span&gt;&lt;span style="color: #434923;"&gt;z&lt;/span&gt;&lt;span style="color: #445425;"&gt;d&lt;/span&gt;&lt;span style="color: #435022;"&gt;s&lt;/span&gt;&lt;span style="color: #344417;"&gt;i&lt;/span&gt;&lt;span style="color: #354119;"&gt;o&lt;/span&gt;&lt;span style="color: #353b17;"&gt;a&lt;/span&gt;&lt;span style="color: #4a4120;"&gt;d&lt;/span&gt;&lt;span style="color: #694225;"&gt;r&lt;/span&gt;&lt;span style="color: #c92236;"&gt;u&lt;/span&gt;&lt;span style="color: #982e20;"&gt;a&lt;/span&gt;&lt;span style="color: #943823;"&gt;f&lt;/span&gt;&lt;span style="color: #943e2d;"&gt;d&lt;/span&gt;&lt;span style="color: #a84349;"&gt;u&lt;/span&gt;&lt;span style="color: #ef9795;"&gt;l&lt;/span&gt;&lt;span style="color: #d77c81;"&gt;f&lt;/span&gt;&lt;span style="color: #e48e8f;"&gt;b&lt;/span&gt;&lt;span style="color: #fda7aa;"&gt;l&lt;/span&gt;&lt;span style="color: #fdb1b3;"&gt;u&lt;/span&gt;&lt;span style="color: #ffb88a;"&gt;p&lt;/span&gt;&lt;span style="color: #fcc698;"&gt;v&lt;/span&gt;&lt;span style="color: #fe5c74;"&gt;d&lt;/span&gt;&lt;span style="color: #fe4e62;"&gt;p&lt;/span&gt;&lt;span style="color: #ce041c;"&gt;c&lt;/span&gt;&lt;span style="color: #ff4755;"&gt;s&lt;/span&gt;&lt;span style="color: #fe2739;"&gt;x&lt;/span&gt;&lt;span style="color: #de192d;"&gt;i&lt;/span&gt;&lt;span style="color: #d91f34;"&gt;j&lt;/span&gt;&lt;span style="color: #fc4c60;"&gt;w&lt;/span&gt;&lt;span style="color: #b71a23;"&gt;t&lt;/span&gt;&lt;span style="color: #c27654;"&gt;e&lt;/span&gt;&lt;span style="color: #c37954;"&gt;b&lt;/span&gt;&lt;span style="color: #a24a34;"&gt;s&lt;/span&gt;&lt;span style="color: #88311e;"&gt;h&lt;/span&gt;&lt;span style="color: #843320;"&gt;t&lt;/span&gt;&lt;span style="color: #873a26;"&gt;b&lt;/span&gt;&lt;span style="color: #84462f;"&gt;w&lt;/span&gt;&lt;span style="color: #7b4c30;"&gt;u&lt;/span&gt;&lt;span style="color: #734825;"&gt;f&lt;/span&gt;&lt;span style="color: #52632c;"&gt;n&lt;/span&gt;
&lt;span style="color: #57311e;"&gt;p&lt;/span&gt;&lt;span style="color: #593421;"&gt;f&lt;/span&gt;&lt;span style="color: #5e3523;"&gt;s&lt;/span&gt;&lt;span style="color: #5c3623;"&gt;s&lt;/span&gt;&lt;span style="color: #5e3523;"&gt;z&lt;/span&gt;&lt;span style="color: #5f321f;"&gt;d&lt;/span&gt;&lt;span style="color: #733e2e;"&gt;x&lt;/span&gt;&lt;span style="color: #ba7862;"&gt;b&lt;/span&gt;&lt;span style="color: #f5b089;"&gt;p&lt;/span&gt;&lt;span style="color: #d09c75;"&gt;s&lt;/span&gt;&lt;span style="color: #765f3f;"&gt;q&lt;/span&gt;&lt;span style="color: #504b2d;"&gt;k&lt;/span&gt;&lt;span style="color: #755035;"&gt;v&lt;/span&gt;&lt;span style="color: #8f4c32;"&gt;g&lt;/span&gt;&lt;span style="color: #773d27;"&gt;m&lt;/span&gt;&lt;span style="color: #bd5147;"&gt;o&lt;/span&gt;&lt;span style="color: #ff7989;"&gt;d&lt;/span&gt;&lt;span style="color: #fa5166;"&gt;v&lt;/span&gt;&lt;span style="color: #830012;"&gt;x&lt;/span&gt;&lt;span style="color: #8d0513;"&gt;z&lt;/span&gt;&lt;span style="color: #993929;"&gt;o&lt;/span&gt;&lt;span style="color: #8f2b1c;"&gt;b&lt;/span&gt;&lt;span style="color: #913a27;"&gt;b&lt;/span&gt;&lt;span style="color: #863021;"&gt;g&lt;/span&gt;&lt;span style="color: #6f180f;"&gt;j&lt;/span&gt;&lt;span style="color: #9a2327;"&gt;u&lt;/span&gt;&lt;span style="color: #c14e53;"&gt;i&lt;/span&gt;&lt;span style="color: #c45a5c;"&gt;f&lt;/span&gt;&lt;span style="color: #e18367;"&gt;p&lt;/span&gt;&lt;span style="color: #fcb587;"&gt;n&lt;/span&gt;&lt;span style="color: #ffc599;"&gt;s&lt;/span&gt;&lt;span style="color: #fd3b56;"&gt;e&lt;/span&gt;&lt;span style="color: #fe3b4c;"&gt;s&lt;/span&gt;&lt;span style="color: #cc0820;"&gt;l&lt;/span&gt;&lt;span style="color: #f52535;"&gt;w&lt;/span&gt;&lt;span style="color: #fa2132;"&gt;s&lt;/span&gt;&lt;span style="color: #c30a1a;"&gt;p&lt;/span&gt;&lt;span style="color: #d32035;"&gt;u&lt;/span&gt;&lt;span style="color: #dc2d3e;"&gt;t&lt;/span&gt;&lt;span style="color: #a10e16;"&gt;e&lt;/span&gt;&lt;span style="color: #a84c33;"&gt;m&lt;/span&gt;&lt;span style="color: #a24c33;"&gt;k&lt;/span&gt;&lt;span style="color: #973c27;"&gt;o&lt;/span&gt;&lt;span style="color: #83311c;"&gt;i&lt;/span&gt;&lt;span style="color: #8a3521;"&gt;q&lt;/span&gt;&lt;span style="color: #8c3e28;"&gt;b&lt;/span&gt;&lt;span style="color: #7e442e;"&gt;w&lt;/span&gt;&lt;span style="color: #654423;"&gt;t&lt;/span&gt;&lt;span style="color: #21200c;"&gt;w&lt;/span&gt;&lt;span style="color: #3c441b;"&gt;u&lt;/span&gt;
&lt;span style="color: #563121;"&gt;t&lt;/span&gt;&lt;span style="color: #5a3322;"&gt;l&lt;/span&gt;&lt;span style="color: #5a3421;"&gt;w&lt;/span&gt;&lt;span style="color: #5b3623;"&gt;u&lt;/span&gt;&lt;span style="color: #55321e;"&gt;r&lt;/span&gt;&lt;span style="color: #54311d;"&gt;f&lt;/span&gt;&lt;span style="color: #633526;"&gt;p&lt;/span&gt;&lt;span style="color: #ce846b;"&gt;a&lt;/span&gt;&lt;span style="color: #fcb692;"&gt;l&lt;/span&gt;&lt;span style="color: #fac495;"&gt;e&lt;/span&gt;&lt;span style="color: #b79a72;"&gt;n&lt;/span&gt;&lt;span style="color: #b97e6c;"&gt;e&lt;/span&gt;&lt;span style="color: #fe7088;"&gt;j&lt;/span&gt;&lt;span style="color: #fe7e97;"&gt;f&lt;/span&gt;&lt;span style="color: #fd3551;"&gt;q&lt;/span&gt;&lt;span style="color: #f5334d;"&gt;g&lt;/span&gt;&lt;span style="color: #bb132d;"&gt;x&lt;/span&gt;&lt;span style="color: #c9152e;"&gt;f&lt;/span&gt;&lt;span style="color: #8d0414;"&gt;b&lt;/span&gt;&lt;span style="color: #89010f;"&gt;r&lt;/span&gt;&lt;span style="color: #591313;"&gt;k&lt;/span&gt;&lt;span style="color: #8c2a1d;"&gt;n&lt;/span&gt;&lt;span style="color: #8d3422;"&gt;b&lt;/span&gt;&lt;span style="color: #833821;"&gt;z&lt;/span&gt;&lt;span style="color: #702b1c;"&gt;w&lt;/span&gt;&lt;span style="color: #682218;"&gt;r&lt;/span&gt;&lt;span style="color: #732a21;"&gt;a&lt;/span&gt;&lt;span style="color: #c26b58;"&gt;s&lt;/span&gt;&lt;span style="color: #e8936e;"&gt;l&lt;/span&gt;&lt;span style="color: #febf8c;"&gt;x&lt;/span&gt;&lt;span style="color: #ffaa8c;"&gt;m&lt;/span&gt;&lt;span style="color: #ff253d;"&gt;e&lt;/span&gt;&lt;span style="color: #fc3441;"&gt;i&lt;/span&gt;&lt;span style="color: #c2071c;"&gt;i&lt;/span&gt;&lt;span style="color: #f11e2d;"&gt;z&lt;/span&gt;&lt;span style="color: #e01121;"&gt;a&lt;/span&gt;&lt;span style="color: #b60613;"&gt;o&lt;/span&gt;&lt;span style="color: #b40c1b;"&gt;o&lt;/span&gt;&lt;span style="color: #b50d1e;"&gt;a&lt;/span&gt;&lt;span style="color: #8e050d;"&gt;a&lt;/span&gt;&lt;span style="color: #8e291d;"&gt;t&lt;/span&gt;&lt;span style="color: #95321f;"&gt;n&lt;/span&gt;&lt;span style="color: #8f2b1b;"&gt;e&lt;/span&gt;&lt;span style="color: #8e2f1d;"&gt;c&lt;/span&gt;&lt;span style="color: #913623;"&gt;t&lt;/span&gt;&lt;span style="color: #8e3c26;"&gt;u&lt;/span&gt;&lt;span style="color: #ba3026;"&gt;j&lt;/span&gt;&lt;span style="color: #1f1d0e;"&gt;r&lt;/span&gt;&lt;span style="color: #1e1c0d;"&gt;a&lt;/span&gt;&lt;span style="color: #151608;"&gt;k&lt;/span&gt;
&lt;span style="color: #522e1e;"&gt;i&lt;/span&gt;&lt;span style="color: #553020;"&gt;k&lt;/span&gt;&lt;span style="color: #5a3020;"&gt;y&lt;/span&gt;&lt;span style="color: #583321;"&gt;k&lt;/span&gt;&lt;span style="color: #4e2d1a;"&gt;j&lt;/span&gt;&lt;span style="color: #4d2c19;"&gt;u&lt;/span&gt;&lt;span style="color: #5a3322;"&gt;b&lt;/span&gt;&lt;span style="color: #dc8d7e;"&gt;k&lt;/span&gt;&lt;span style="color: #fdcda9;"&gt;n&lt;/span&gt;&lt;span style="color: #fddab4;"&gt;n&lt;/span&gt;&lt;span style="color: #fcb3a4;"&gt;h&lt;/span&gt;&lt;span style="color: #ff93a3;"&gt;a&lt;/span&gt;&lt;span style="color: #fd93a7;"&gt;s&lt;/span&gt;&lt;span style="color: #fe7a92;"&gt;q&lt;/span&gt;&lt;span style="color: #fd6c89;"&gt;j&lt;/span&gt;&lt;span style="color: #ef2a45;"&gt;r&lt;/span&gt;&lt;span style="color: #c9192e;"&gt;q&lt;/span&gt;&lt;span style="color: #b6172b;"&gt;x&lt;/span&gt;&lt;span style="color: #af0c1d;"&gt;f&lt;/span&gt;&lt;span style="color: #9c0516;"&gt;r&lt;/span&gt;&lt;span style="color: #8c0313;"&gt;x&lt;/span&gt;&lt;span style="color: #7b2119;"&gt;y&lt;/span&gt;&lt;span style="color: #82291b;"&gt;f&lt;/span&gt;&lt;span style="color: #802f1e;"&gt;c&lt;/span&gt;&lt;span style="color: #7f3623;"&gt;b&lt;/span&gt;&lt;span style="color: #6f2b1e;"&gt;y&lt;/span&gt;&lt;span style="color: #8b3f32;"&gt;x&lt;/span&gt;&lt;span style="color: #a5574b;"&gt;l&lt;/span&gt;&lt;span style="color: #d27e64;"&gt;p&lt;/span&gt;&lt;span style="color: #feb483;"&gt;x&lt;/span&gt;&lt;span style="color: #fb424a;"&gt;v&lt;/span&gt;&lt;span style="color: #ec1029;"&gt;y&lt;/span&gt;&lt;span style="color: #fe2d40;"&gt;i&lt;/span&gt;&lt;span style="color: #bf0918;"&gt;u&lt;/span&gt;&lt;span style="color: #dd1323;"&gt;i&lt;/span&gt;&lt;span style="color: #d20e1a;"&gt;s&lt;/span&gt;&lt;span style="color: #b00613;"&gt;p&lt;/span&gt;&lt;span style="color: #a90510;"&gt;k&lt;/span&gt;&lt;span style="color: #b40b1e;"&gt;d&lt;/span&gt;&lt;span style="color: #860309;"&gt;c&lt;/span&gt;&lt;span style="color: #7d0d0c;"&gt;x&lt;/span&gt;&lt;span style="color: #8e2d1c;"&gt;l&lt;/span&gt;&lt;span style="color: #922f1c;"&gt;c&lt;/span&gt;&lt;span style="color: #8f2819;"&gt;p&lt;/span&gt;&lt;span style="color: #9d0c11;"&gt;b&lt;/span&gt;&lt;span style="color: #a60111;"&gt;l&lt;/span&gt;&lt;span style="color: #c23c3b;"&gt;h&lt;/span&gt;&lt;span style="color: #1a180b;"&gt;s&lt;/span&gt;&lt;span style="color: #17170b;"&gt;j&lt;/span&gt;&lt;span style="color: #16160a;"&gt;m&lt;/span&gt;
&lt;span style="color: #4c2b1c;"&gt;j&lt;/span&gt;&lt;span style="color: #522d1d;"&gt;h&lt;/span&gt;&lt;span style="color: #5b2f22;"&gt;l&lt;/span&gt;&lt;span style="color: #542d1e;"&gt;o&lt;/span&gt;&lt;span style="color: #482718;"&gt;j&lt;/span&gt;&lt;span style="color: #482718;"&gt;n&lt;/span&gt;&lt;span style="color: #4f2b1d;"&gt;n&lt;/span&gt;&lt;span style="color: #6e3228;"&gt;h&lt;/span&gt;&lt;span style="color: #ffcbab;"&gt;y&lt;/span&gt;&lt;span style="color: #fde9c8;"&gt;d&lt;/span&gt;&lt;span style="color: #ffeccb;"&gt;f&lt;/span&gt;&lt;span style="color: #ffbbb4;"&gt;u&lt;/span&gt;&lt;span style="color: #fe959a;"&gt;b&lt;/span&gt;&lt;span style="color: #fd7986;"&gt;n&lt;/span&gt;&lt;span style="color: #fe5363;"&gt;o&lt;/span&gt;&lt;span style="color: #f13448;"&gt;k&lt;/span&gt;&lt;span style="color: #c1132c;"&gt;g&lt;/span&gt;&lt;span style="color: #ad0b1a;"&gt;d&lt;/span&gt;&lt;span style="color: #780912;"&gt;u&lt;/span&gt;&lt;span style="color: #a50a1a;"&gt;j&lt;/span&gt;&lt;span style="color: #ad0819;"&gt;f&lt;/span&gt;&lt;span style="color: #49080c;"&gt;s&lt;/span&gt;&lt;span style="color: #751d13;"&gt;u&lt;/span&gt;&lt;span style="color: #7c2514;"&gt;i&lt;/span&gt;&lt;span style="color: #752315;"&gt;i&lt;/span&gt;&lt;span style="color: #7a2e21;"&gt;w&lt;/span&gt;&lt;span style="color: #7a2b1e;"&gt;u&lt;/span&gt;&lt;span style="color: #933b25;"&gt;p&lt;/span&gt;&lt;span style="color: #e38e65;"&gt;o&lt;/span&gt;&lt;span style="color: #ffa074;"&gt;e&lt;/span&gt;&lt;span style="color: #fc3144;"&gt;c&lt;/span&gt;&lt;span style="color: #e21124;"&gt;y&lt;/span&gt;&lt;span style="color: #fe2834;"&gt;l&lt;/span&gt;&lt;span style="color: #d61526;"&gt;o&lt;/span&gt;&lt;span style="color: #ce0b1b;"&gt;m&lt;/span&gt;&lt;span style="color: #bf0916;"&gt;v&lt;/span&gt;&lt;span style="color: #ad010f;"&gt;b&lt;/span&gt;&lt;span style="color: #a90510;"&gt;a&lt;/span&gt;&lt;span style="color: #b10f1a;"&gt;c&lt;/span&gt;&lt;span style="color: #7d000a;"&gt;a&lt;/span&gt;&lt;span style="color: #7e000b;"&gt;d&lt;/span&gt;&lt;span style="color: #620807;"&gt;h&lt;/span&gt;&lt;span style="color: #730b0a;"&gt;u&lt;/span&gt;&lt;span style="color: #880107;"&gt;f&lt;/span&gt;&lt;span style="color: #a30008;"&gt;v&lt;/span&gt;&lt;span style="color: #ab0012;"&gt;i&lt;/span&gt;&lt;span style="color: #2c1410;"&gt;q&lt;/span&gt;&lt;span style="color: #16130a;"&gt;b&lt;/span&gt;&lt;span style="color: #15120b;"&gt;l&lt;/span&gt;&lt;span style="color: #17170b;"&gt;k&lt;/span&gt;
&lt;span style="color: #3e2d19;"&gt;l&lt;/span&gt;&lt;span style="color: #51301f;"&gt;r&lt;/span&gt;&lt;span style="color: #593424;"&gt;d&lt;/span&gt;&lt;span style="color: #582e20;"&gt;g&lt;/span&gt;&lt;span style="color: #4a291a;"&gt;z&lt;/span&gt;&lt;span style="color: #4d291b;"&gt;l&lt;/span&gt;&lt;span style="color: #532d20;"&gt;c&lt;/span&gt;&lt;span style="color: #5e3023;"&gt;u&lt;/span&gt;&lt;span style="color: #c68879;"&gt;b&lt;/span&gt;&lt;span style="color: #ffcdb4;"&gt;q&lt;/span&gt;&lt;span style="color: #fdd9c3;"&gt;y&lt;/span&gt;&lt;span style="color: #fee3ce;"&gt;e&lt;/span&gt;&lt;span style="color: #fdd2bf;"&gt;o&lt;/span&gt;&lt;span style="color: #febcac;"&gt;k&lt;/span&gt;&lt;span style="color: #fe7678;"&gt;s&lt;/span&gt;&lt;span style="color: #dc3141;"&gt;b&lt;/span&gt;&lt;span style="color: #bb1225;"&gt;f&lt;/span&gt;&lt;span style="color: #b70c1e;"&gt;u&lt;/span&gt;&lt;span style="color: #5c0108;"&gt;c&lt;/span&gt;&lt;span style="color: #b30d23;"&gt;h&lt;/span&gt;&lt;span style="color: #a10618;"&gt;v&lt;/span&gt;&lt;span style="color: #8b0008;"&gt;g&lt;/span&gt;&lt;span style="color: #590807;"&gt;p&lt;/span&gt;&lt;span style="color: #70160e;"&gt;p&lt;/span&gt;&lt;span style="color: #781a12;"&gt;l&lt;/span&gt;&lt;span style="color: #801a15;"&gt;k&lt;/span&gt;&lt;span style="color: #821d13;"&gt;x&lt;/span&gt;&lt;span style="color: #a13e2b;"&gt;b&lt;/span&gt;&lt;span style="color: #b6573b;"&gt;m&lt;/span&gt;&lt;span style="color: #c9493e;"&gt;j&lt;/span&gt;&lt;span style="color: #fd2437;"&gt;m&lt;/span&gt;&lt;span style="color: #dc1125;"&gt;x&lt;/span&gt;&lt;span style="color: #fc2233;"&gt;a&lt;/span&gt;&lt;span style="color: #d91324;"&gt;p&lt;/span&gt;&lt;span style="color: #c80c1b;"&gt;d&lt;/span&gt;&lt;span style="color: #be0815;"&gt;a&lt;/span&gt;&lt;span style="color: #ab0310;"&gt;b&lt;/span&gt;&lt;span style="color: #a4020f;"&gt;f&lt;/span&gt;&lt;span style="color: #9e0813;"&gt;v&lt;/span&gt;&lt;span style="color: #810307;"&gt;d&lt;/span&gt;&lt;span style="color: #6a0007;"&gt;w&lt;/span&gt;&lt;span style="color: #8f0008;"&gt;u&lt;/span&gt;&lt;span style="color: #960008;"&gt;h&lt;/span&gt;&lt;span style="color: #960009;"&gt;l&lt;/span&gt;&lt;span style="color: #98000c;"&gt;e&lt;/span&gt;&lt;span style="color: #a50310;"&gt;a&lt;/span&gt;&lt;span style="color: #18140b;"&gt;n&lt;/span&gt;&lt;span style="color: #15120b;"&gt;j&lt;/span&gt;&lt;span style="color: #16130a;"&gt;v&lt;/span&gt;&lt;span style="color: #15150b;"&gt;p&lt;/span&gt;
&lt;span style="color: #5f7b30;"&gt;r&lt;/span&gt;&lt;span style="color: #58602f;"&gt;q&lt;/span&gt;&lt;span style="color: #694b2f;"&gt;w&lt;/span&gt;&lt;span style="color: #5f3924;"&gt;g&lt;/span&gt;&lt;span style="color: #522f1b;"&gt;g&lt;/span&gt;&lt;span style="color: #502f1c;"&gt;h&lt;/span&gt;&lt;span style="color: #563121;"&gt;q&lt;/span&gt;&lt;span style="color: #5c3023;"&gt;d&lt;/span&gt;&lt;span style="color: #5f3124;"&gt;j&lt;/span&gt;&lt;span style="color: #ad5f53;"&gt;d&lt;/span&gt;&lt;span style="color: #d27870;"&gt;n&lt;/span&gt;&lt;span style="color: #f0918b;"&gt;w&lt;/span&gt;&lt;span style="color: #fb9e97;"&gt;a&lt;/span&gt;&lt;span style="color: #ffb2ac;"&gt;o&lt;/span&gt;&lt;span style="color: #fba38f;"&gt;m&lt;/span&gt;&lt;span style="color: #cb2a3a;"&gt;e&lt;/span&gt;&lt;span style="color: #9c0413;"&gt;p&lt;/span&gt;&lt;span style="color: #a40816;"&gt;o&lt;/span&gt;&lt;span style="color: #9d0a14;"&gt;k&lt;/span&gt;&lt;span style="color: #a7081a;"&gt;k&lt;/span&gt;&lt;span style="color: #9a0717;"&gt;r&lt;/span&gt;&lt;span style="color: #a40517;"&gt;g&lt;/span&gt;&lt;span style="color: #a40313;"&gt;f&lt;/span&gt;&lt;span style="color: #620405;"&gt;z&lt;/span&gt;&lt;span style="color: #790d0d;"&gt;s&lt;/span&gt;&lt;span style="color: #9f3923;"&gt;j&lt;/span&gt;&lt;span style="color: #8c201d;"&gt;a&lt;/span&gt;&lt;span style="color: #8e2218;"&gt;f&lt;/span&gt;&lt;span style="color: #932318;"&gt;s&lt;/span&gt;&lt;span style="color: #fe353d;"&gt;w&lt;/span&gt;&lt;span style="color: #fb2436;"&gt;v&lt;/span&gt;&lt;span style="color: #fc2233;"&gt;k&lt;/span&gt;&lt;span style="color: #ef182a;"&gt;m&lt;/span&gt;&lt;span style="color: #d00d1d;"&gt;r&lt;/span&gt;&lt;span style="color: #bd0714;"&gt;q&lt;/span&gt;&lt;span style="color: #b80815;"&gt;t&lt;/span&gt;&lt;span style="color: #a90412;"&gt;z&lt;/span&gt;&lt;span style="color: #9e020f;"&gt;h&lt;/span&gt;&lt;span style="color: #8a0109;"&gt;x&lt;/span&gt;&lt;span style="color: #85020a;"&gt;j&lt;/span&gt;&lt;span style="color: #680105;"&gt;k&lt;/span&gt;&lt;span style="color: #92000a;"&gt;k&lt;/span&gt;&lt;span style="color: #8e010a;"&gt;g&lt;/span&gt;&lt;span style="color: #a8010b;"&gt;l&lt;/span&gt;&lt;span style="color: #a4000d;"&gt;z&lt;/span&gt;&lt;span style="color: #80020d;"&gt;s&lt;/span&gt;&lt;span style="color: #15120b;"&gt;p&lt;/span&gt;&lt;span style="color: #15150d;"&gt;o&lt;/span&gt;&lt;span style="color: #15150d;"&gt;g&lt;/span&gt;&lt;span style="color: #13130b;"&gt;z&lt;/span&gt;
&lt;span style="color: #556f26;"&gt;z&lt;/span&gt;&lt;span style="color: #86a255;"&gt;y&lt;/span&gt;&lt;span style="color: #71633c;"&gt;g&lt;/span&gt;&lt;span style="color: #533b21;"&gt;e&lt;/span&gt;&lt;span style="color: #59371e;"&gt;x&lt;/span&gt;&lt;span style="color: #5b3920;"&gt;y&lt;/span&gt;&lt;span style="color: #59351f;"&gt;n&lt;/span&gt;&lt;span style="color: #5d3323;"&gt;y&lt;/span&gt;&lt;span style="color: #623224;"&gt;e&lt;/span&gt;&lt;span style="color: #7b4638;"&gt;g&lt;/span&gt;&lt;span style="color: #b06e5e;"&gt;u&lt;/span&gt;&lt;span style="color: #bc7767;"&gt;a&lt;/span&gt;&lt;span style="color: #c27666;"&gt;q&lt;/span&gt;&lt;span style="color: #cd5c56;"&gt;h&lt;/span&gt;&lt;span style="color: #ce494c;"&gt;s&lt;/span&gt;&lt;span style="color: #b60f21;"&gt;h&lt;/span&gt;&lt;span style="color: #9f0310;"&gt;a&lt;/span&gt;&lt;span style="color: #98020e;"&gt;s&lt;/span&gt;&lt;span style="color: #ae0816;"&gt;o&lt;/span&gt;&lt;span style="color: #a40816;"&gt;x&lt;/span&gt;&lt;span style="color: #8c000b;"&gt;c&lt;/span&gt;&lt;span style="color: #8e000e;"&gt;z&lt;/span&gt;&lt;span style="color: #aa0516;"&gt;i&lt;/span&gt;&lt;span style="color: #ac0316;"&gt;i&lt;/span&gt;&lt;span style="color: #920108;"&gt;k&lt;/span&gt;&lt;span style="color: #cd5f44;"&gt;h&lt;/span&gt;&lt;span style="color: #c25f40;"&gt;a&lt;/span&gt;&lt;span style="color: #ab4730;"&gt;z&lt;/span&gt;&lt;span style="color: #ab2c23;"&gt;w&lt;/span&gt;&lt;span style="color: #ff2b3d;"&gt;h&lt;/span&gt;&lt;span style="color: #d50f20;"&gt;z&lt;/span&gt;&lt;span style="color: #fd2331;"&gt;v&lt;/span&gt;&lt;span style="color: #bd0618;"&gt;f&lt;/span&gt;&lt;span style="color: #cd0d1c;"&gt;f&lt;/span&gt;&lt;span style="color: #b90715;"&gt;a&lt;/span&gt;&lt;span style="color: #b40514;"&gt;d&lt;/span&gt;&lt;span style="color: #ab0513;"&gt;e&lt;/span&gt;&lt;span style="color: #94020d;"&gt;n&lt;/span&gt;&lt;span style="color: #87010a;"&gt;b&lt;/span&gt;&lt;span style="color: #820008;"&gt;j&lt;/span&gt;&lt;span style="color: #680009;"&gt;u&lt;/span&gt;&lt;span style="color: #8d040e;"&gt;w&lt;/span&gt;&lt;span style="color: #850006;"&gt;j&lt;/span&gt;&lt;span style="color: #9c0109;"&gt;l&lt;/span&gt;&lt;span style="color: #a7000a;"&gt;e&lt;/span&gt;&lt;span style="color: #85010c;"&gt;c&lt;/span&gt;&lt;span style="color: #251110;"&gt;s&lt;/span&gt;&lt;span style="color: #15150d;"&gt;e&lt;/span&gt;&lt;span style="color: #14140c;"&gt;v&lt;/span&gt;&lt;span style="color: #13120d;"&gt;h&lt;/span&gt;
&lt;span style="color: #627f2b;"&gt;c&lt;/span&gt;&lt;span style="color: #8fa84c;"&gt;x&lt;/span&gt;&lt;span style="color: #615733;"&gt;g&lt;/span&gt;&lt;span style="color: #51361b;"&gt;l&lt;/span&gt;&lt;span style="color: #55361a;"&gt;f&lt;/span&gt;&lt;span style="color: #633b21;"&gt;q&lt;/span&gt;&lt;span style="color: #6b3920;"&gt;s&lt;/span&gt;&lt;span style="color: #733c27;"&gt;g&lt;/span&gt;&lt;span style="color: #854c31;"&gt;q&lt;/span&gt;&lt;span style="color: #b06f51;"&gt;o&lt;/span&gt;&lt;span style="color: #fabc8d;"&gt;o&lt;/span&gt;&lt;span style="color: #eaaa84;"&gt;p&lt;/span&gt;&lt;span style="color: #de9d75;"&gt;k&lt;/span&gt;&lt;span style="color: #e53b3e;"&gt;t&lt;/span&gt;&lt;span style="color: #af0a1a;"&gt;u&lt;/span&gt;&lt;span style="color: #b20614;"&gt;k&lt;/span&gt;&lt;span style="color: #99010d;"&gt;x&lt;/span&gt;&lt;span style="color: #83000a;"&gt;z&lt;/span&gt;&lt;span style="color: #ad0715;"&gt;y&lt;/span&gt;&lt;span style="color: #b00817;"&gt;z&lt;/span&gt;&lt;span style="color: #94020d;"&gt;i&lt;/span&gt;&lt;span style="color: #9a0410;"&gt;s&lt;/span&gt;&lt;span style="color: #8a000d;"&gt;v&lt;/span&gt;&lt;span style="color: #b00515;"&gt;s&lt;/span&gt;&lt;span style="color: #a50010;"&gt;e&lt;/span&gt;&lt;span style="color: #94000e;"&gt;a&lt;/span&gt;&lt;span style="color: #b4071b;"&gt;u&lt;/span&gt;&lt;span style="color: #d81b2f;"&gt;w&lt;/span&gt;&lt;span style="color: #b80b1e;"&gt;f&lt;/span&gt;&lt;span style="color: #d51425;"&gt;p&lt;/span&gt;&lt;span style="color: #cf0b1f;"&gt;e&lt;/span&gt;&lt;span style="color: #ec1b2e;"&gt;i&lt;/span&gt;&lt;span style="color: #a10417;"&gt;n&lt;/span&gt;&lt;span style="color: #c90d1c;"&gt;k&lt;/span&gt;&lt;span style="color: #b70714;"&gt;t&lt;/span&gt;&lt;span style="color: #ae0613;"&gt;t&lt;/span&gt;&lt;span style="color: #a60514;"&gt;b&lt;/span&gt;&lt;span style="color: #8f030c;"&gt;m&lt;/span&gt;&lt;span style="color: #7e0109;"&gt;z&lt;/span&gt;&lt;span style="color: #85020a;"&gt;r&lt;/span&gt;&lt;span style="color: #6d0208;"&gt;a&lt;/span&gt;&lt;span style="color: #6f0006;"&gt;o&lt;/span&gt;&lt;span style="color: #910009;"&gt;h&lt;/span&gt;&lt;span style="color: #9c000d;"&gt;l&lt;/span&gt;&lt;span style="color: #a8010b;"&gt;h&lt;/span&gt;&lt;span style="color: #840109;"&gt;b&lt;/span&gt;&lt;span style="color: #8f0610;"&gt;v&lt;/span&gt;&lt;span style="color: #13120d;"&gt;f&lt;/span&gt;&lt;span style="color: #15160e;"&gt;a&lt;/span&gt;&lt;span style="color: #14140c;"&gt;t&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size: 8pt; font-weight: bold; letter-spacing: 4px; line-height: 8pt;"&gt;&lt;span style="color: #14140c;"&gt;
&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size: 8pt; font-weight: bold; letter-spacing: 4px; line-height: 8pt;"&gt;&lt;span style="color: #14140c;"&gt;
&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size: 8pt; font-weight: bold; letter-spacing: 4px; line-height: 8pt;"&gt;&lt;span style="color: #14140c;"&gt;&lt;span style="color: black; font-family: Arial; font-size: medium; font-weight: normal; letter-spacing: normal; line-height: normal; white-space: normal;"&gt;




&lt;pre style="font-size: 8pt; font-weight: bold; letter-spacing: 4px; line-height: 8pt;"&gt;&lt;span style="color: #82280d;"&gt;f&lt;/span&gt;&lt;span style="color: #ad684b;"&gt;o&lt;/span&gt;&lt;span style="color: #bd7b59;"&gt;t&lt;/span&gt;&lt;span style="color: #c0805d;"&gt;t&lt;/span&gt;&lt;span style="color: #c28360;"&gt;m&lt;/span&gt;&lt;span style="color: #c98361;"&gt;y&lt;/span&gt;&lt;span style="color: #d47a5f;"&gt;j&lt;/span&gt;&lt;span style="color: #bf5640;"&gt;x&lt;/span&gt;&lt;span style="color: #ab311a;"&gt;x&lt;/span&gt;&lt;span style="color: #a72f17;"&gt;h&lt;/span&gt;&lt;span style="color: #c18062;"&gt;k&lt;/span&gt;&lt;span style="color: #bb8060;"&gt;y&lt;/span&gt;&lt;span style="color: #553520;"&gt;d&lt;/span&gt;&lt;span style="color: #270e07;"&gt;q&lt;/span&gt;&lt;span style="color: #270e07;"&gt;s&lt;/span&gt;&lt;span style="color: #2e1207;"&gt;n&lt;/span&gt;&lt;span style="color: #32140a;"&gt;l&lt;/span&gt;&lt;span style="color: #2a1206;"&gt;v&lt;/span&gt;&lt;span style="color: #1c0b03;"&gt;a&lt;/span&gt;&lt;span style="color: #2d1106;"&gt;x&lt;/span&gt;&lt;span style="color: #2f1307;"&gt;u&lt;/span&gt;&lt;span style="color: #140905;"&gt;g&lt;/span&gt;&lt;span style="color: #3d2314;"&gt;s&lt;/span&gt;&lt;span style="color: #553a27;"&gt;l&lt;/span&gt;&lt;span style="color: #321c0f;"&gt;z&lt;/span&gt;&lt;span style="color: #351f12;"&gt;k&lt;/span&gt;&lt;span style="color: #211008;"&gt;b&lt;/span&gt;&lt;span style="color: #25120b;"&gt;i&lt;/span&gt;&lt;span style="color: #230f08;"&gt;v&lt;/span&gt;&lt;span style="color: #34180c;"&gt;i&lt;/span&gt;&lt;span style="color: #37170a;"&gt;z&lt;/span&gt;&lt;span style="color: #40190a;"&gt;b&lt;/span&gt;&lt;span style="color: #411709;"&gt;x&lt;/span&gt;&lt;span style="color: #3b1307;"&gt;s&lt;/span&gt;&lt;span style="color: #4d2a16;"&gt;v&lt;/span&gt;&lt;span style="color: #2e180d;"&gt;j&lt;/span&gt;&lt;span style="color: #2d170a;"&gt;q&lt;/span&gt;&lt;span style="color: #2f2114;"&gt;e&lt;/span&gt;&lt;span style="color: #1e140b;"&gt;h&lt;/span&gt;&lt;span style="color: #180f06;"&gt;o&lt;/span&gt;&lt;span style="color: #1e1408;"&gt;l&lt;/span&gt;&lt;span style="color: #130c06;"&gt;r&lt;/span&gt;&lt;span style="color: #0a0904;"&gt;n&lt;/span&gt;&lt;span style="color: #0f0b02;"&gt;p&lt;/span&gt;&lt;span style="color: #211306;"&gt;i&lt;/span&gt;&lt;span style="color: #1e1108;"&gt;f&lt;/span&gt;&lt;span style="color: #1f1106;"&gt;d&lt;/span&gt;&lt;span style="color: #130c06;"&gt;t&lt;/span&gt;&lt;span style="color: #170d01;"&gt;a&lt;/span&gt;&lt;span style="color: #5b351e;"&gt;e&lt;/span&gt;
&lt;span style="color: #a6593f;"&gt;q&lt;/span&gt;&lt;span style="color: #b06f4f;"&gt;v&lt;/span&gt;&lt;span style="color: #c0815e;"&gt;l&lt;/span&gt;&lt;span style="color: #c48562;"&gt;j&lt;/span&gt;&lt;span style="color: #d5835e;"&gt;g&lt;/span&gt;&lt;span style="color: #d57a5b;"&gt;l&lt;/span&gt;&lt;span style="color: #c4573a;"&gt;t&lt;/span&gt;&lt;span style="color: #af4025;"&gt;i&lt;/span&gt;&lt;span style="color: #a43218;"&gt;t&lt;/span&gt;&lt;span style="color: #83220f;"&gt;p&lt;/span&gt;&lt;span style="color: #c8906d;"&gt;r&lt;/span&gt;&lt;span style="color: #7e4830;"&gt;s&lt;/span&gt;&lt;span style="color: #735241;"&gt;q&lt;/span&gt;&lt;span style="color: #37190f;"&gt;p&lt;/span&gt;&lt;span style="color: #2f1308;"&gt;l&lt;/span&gt;&lt;span style="color: #37150b;"&gt;m&lt;/span&gt;&lt;span style="color: #270c05;"&gt;z&lt;/span&gt;&lt;span style="color: #1d0c04;"&gt;b&lt;/span&gt;&lt;span style="color: #2e1207;"&gt;q&lt;/span&gt;&lt;span style="color: #1f0e06;"&gt;g&lt;/span&gt;&lt;span style="color: #190b02;"&gt;q&lt;/span&gt;&lt;span style="color: #2b150a;"&gt;c&lt;/span&gt;&lt;span style="color: #361f11;"&gt;y&lt;/span&gt;&lt;span style="color: #382111;"&gt;e&lt;/span&gt;&lt;span style="color: #462f21;"&gt;s&lt;/span&gt;&lt;span style="color: #2e160c;"&gt;g&lt;/span&gt;&lt;span style="color: #261209;"&gt;k&lt;/span&gt;&lt;span style="color: #2c1106;"&gt;v&lt;/span&gt;&lt;span style="color: #401a0f;"&gt;z&lt;/span&gt;&lt;span style="color: #5c3828;"&gt;l&lt;/span&gt;&lt;span style="color: #57311c;"&gt;a&lt;/span&gt;&lt;span style="color: #4e2b18;"&gt;q&lt;/span&gt;&lt;span style="color: #4c1c08;"&gt;g&lt;/span&gt;&lt;span style="color: #461506;"&gt;l&lt;/span&gt;&lt;span style="color: #542714;"&gt;z&lt;/span&gt;&lt;span style="color: #35170d;"&gt;n&lt;/span&gt;&lt;span style="color: #220e03;"&gt;w&lt;/span&gt;&lt;span style="color: #250e06;"&gt;t&lt;/span&gt;&lt;span style="color: #180d07;"&gt;w&lt;/span&gt;&lt;span style="color: #170d04;"&gt;p&lt;/span&gt;&lt;span style="color: #25140a;"&gt;i&lt;/span&gt;&lt;span style="color: #29190a;"&gt;n&lt;/span&gt;&lt;span style="color: #0a0501;"&gt;i&lt;/span&gt;&lt;span style="color: #090601;"&gt;z&lt;/span&gt;&lt;span style="color: #0d0600;"&gt;c&lt;/span&gt;&lt;span style="color: #1e1206;"&gt;t&lt;/span&gt;&lt;span style="color: #241609;"&gt;l&lt;/span&gt;&lt;span style="color: #190f03;"&gt;b&lt;/span&gt;&lt;span style="color: #0c0800;"&gt;v&lt;/span&gt;&lt;span style="color: #3d220d;"&gt;b&lt;/span&gt;
&lt;span style="color: #b06f4f;"&gt;i&lt;/span&gt;&lt;span style="color: #b87958;"&gt;m&lt;/span&gt;&lt;span style="color: #d0865f;"&gt;d&lt;/span&gt;&lt;span style="color: #d1815e;"&gt;h&lt;/span&gt;&lt;span style="color: #ce7451;"&gt;q&lt;/span&gt;&lt;span style="color: #c0573a;"&gt;w&lt;/span&gt;&lt;span style="color: #bd5939;"&gt;n&lt;/span&gt;&lt;span style="color: #a8361c;"&gt;b&lt;/span&gt;&lt;span style="color: #7b1a07;"&gt;r&lt;/span&gt;&lt;span style="color: #ca8f71;"&gt;n&lt;/span&gt;&lt;span style="color: #d39d7b;"&gt;m&lt;/span&gt;&lt;span style="color: #66412e;"&gt;s&lt;/span&gt;&lt;span style="color: #3e180b;"&gt;e&lt;/span&gt;&lt;span style="color: #2c0b04;"&gt;s&lt;/span&gt;&lt;span style="color: #320d05;"&gt;d&lt;/span&gt;&lt;span style="color: #2b170e;"&gt;e&lt;/span&gt;&lt;span style="color: #1f0d03;"&gt;g&lt;/span&gt;&lt;span style="color: #30150a;"&gt;a&lt;/span&gt;&lt;span style="color: #1c0d06;"&gt;x&lt;/span&gt;&lt;span style="color: #1c0b03;"&gt;c&lt;/span&gt;&lt;span style="color: #2a1708;"&gt;q&lt;/span&gt;&lt;span style="color: #3b1e10;"&gt;g&lt;/span&gt;&lt;span style="color: #261209;"&gt;q&lt;/span&gt;&lt;span style="color: #402615;"&gt;y&lt;/span&gt;&lt;span style="color: #331b11;"&gt;f&lt;/span&gt;&lt;span style="color: #231202;"&gt;t&lt;/span&gt;&lt;span style="color: #3a1407;"&gt;s&lt;/span&gt;&lt;span style="color: #3d1104;"&gt;q&lt;/span&gt;&lt;span style="color: #421706;"&gt;v&lt;/span&gt;&lt;span style="color: #66412e;"&gt;n&lt;/span&gt;&lt;span style="color: #512814;"&gt;r&lt;/span&gt;&lt;span style="color: #572816;"&gt;d&lt;/span&gt;&lt;span style="color: #5b210d;"&gt;a&lt;/span&gt;&lt;span style="color: #571507;"&gt;v&lt;/span&gt;&lt;span style="color: #551c09;"&gt;l&lt;/span&gt;&lt;span style="color: #431506;"&gt;r&lt;/span&gt;&lt;span style="color: #231107;"&gt;r&lt;/span&gt;&lt;span style="color: #2e1207;"&gt;z&lt;/span&gt;&lt;span style="color: #1e1007;"&gt;s&lt;/span&gt;&lt;span style="color: #180e05;"&gt;j&lt;/span&gt;&lt;span style="color: #1e1108;"&gt;n&lt;/span&gt;&lt;span style="color: #271606;"&gt;e&lt;/span&gt;&lt;span style="color: #1e1108;"&gt;b&lt;/span&gt;&lt;span style="color: #090400;"&gt;s&lt;/span&gt;&lt;span style="color: #090601;"&gt;x&lt;/span&gt;&lt;span style="color: #100901;"&gt;f&lt;/span&gt;&lt;span style="color: #1a1108;"&gt;w&lt;/span&gt;&lt;span style="color: #2e1707;"&gt;d&lt;/span&gt;&lt;span style="color: #2b1901;"&gt;f&lt;/span&gt;&lt;span style="color: #38240b;"&gt;u&lt;/span&gt;
&lt;span style="color: #b36541;"&gt;g&lt;/span&gt;&lt;span style="color: #cb7b58;"&gt;v&lt;/span&gt;&lt;span style="color: #cf845c;"&gt;a&lt;/span&gt;&lt;span style="color: #c6714a;"&gt;w&lt;/span&gt;&lt;span style="color: #c2613e;"&gt;u&lt;/span&gt;&lt;span style="color: #ab4829;"&gt;g&lt;/span&gt;&lt;span style="color: #a84122;"&gt;p&lt;/span&gt;&lt;span style="color: #cb8168;"&gt;m&lt;/span&gt;&lt;span style="color: #ce9673;"&gt;w&lt;/span&gt;&lt;span style="color: #d09a78;"&gt;k&lt;/span&gt;&lt;span style="color: #cb9475;"&gt;a&lt;/span&gt;&lt;span style="color: #683a2a;"&gt;o&lt;/span&gt;&lt;span style="color: #502b19;"&gt;o&lt;/span&gt;&lt;span style="color: #3f1d13;"&gt;a&lt;/span&gt;&lt;span style="color: #2d170c;"&gt;k&lt;/span&gt;&lt;span style="color: #1c0d06;"&gt;a&lt;/span&gt;&lt;span style="color: #1f0d03;"&gt;s&lt;/span&gt;&lt;span style="color: #1e1109;"&gt;c&lt;/span&gt;&lt;span style="color: #33190a;"&gt;z&lt;/span&gt;&lt;span style="color: #1e1007;"&gt;k&lt;/span&gt;&lt;span style="color: #291107;"&gt;l&lt;/span&gt;&lt;span style="color: #210d06;"&gt;m&lt;/span&gt;&lt;span style="color: #2c1408;"&gt;o&lt;/span&gt;&lt;span style="color: #361c0f;"&gt;n&lt;/span&gt;&lt;span style="color: #160702;"&gt;e&lt;/span&gt;&lt;span style="color: #290e05;"&gt;l&lt;/span&gt;&lt;span style="color: #3b0f04;"&gt;t&lt;/span&gt;&lt;span style="color: #552413;"&gt;b&lt;/span&gt;&lt;span style="color: #6d3e2a;"&gt;p&lt;/span&gt;&lt;span style="color: #5a2f1e;"&gt;z&lt;/span&gt;&lt;span style="color: #57240f;"&gt;w&lt;/span&gt;&lt;span style="color: #5e2512;"&gt;v&lt;/span&gt;&lt;span style="color: #5f1e0c;"&gt;v&lt;/span&gt;&lt;span style="color: #5e1b08;"&gt;x&lt;/span&gt;&lt;span style="color: #5a1905;"&gt;s&lt;/span&gt;&lt;span style="color: #521705;"&gt;p&lt;/span&gt;&lt;span style="color: #2b1104;"&gt;d&lt;/span&gt;&lt;span style="color: #351508;"&gt;h&lt;/span&gt;&lt;span style="color: #290e03;"&gt;c&lt;/span&gt;&lt;span style="color: #100903;"&gt;z&lt;/span&gt;&lt;span style="color: #20110c;"&gt;s&lt;/span&gt;&lt;span style="color: #1e1007;"&gt;d&lt;/span&gt;&lt;span style="color: #261406;"&gt;o&lt;/span&gt;&lt;span style="color: #0d0900;"&gt;h&lt;/span&gt;&lt;span style="color: #0e0b04;"&gt;e&lt;/span&gt;&lt;span style="color: #060501;"&gt;y&lt;/span&gt;&lt;span style="color: #0c0703;"&gt;h&lt;/span&gt;&lt;span style="color: #2b1c07;"&gt;w&lt;/span&gt;&lt;span style="color: #3f2e14;"&gt;b&lt;/span&gt;&lt;span style="color: #5b4520;"&gt;h&lt;/span&gt;
&lt;span style="color: #cd7e57;"&gt;g&lt;/span&gt;&lt;span style="color: #c2613e;"&gt;m&lt;/span&gt;&lt;span style="color: #ba603e;"&gt;u&lt;/span&gt;&lt;span style="color: #ba5f40;"&gt;v&lt;/span&gt;&lt;span style="color: #b45634;"&gt;a&lt;/span&gt;&lt;span style="color: #9a371a;"&gt;y&lt;/span&gt;&lt;span style="color: #cb9070;"&gt;h&lt;/span&gt;&lt;span style="color: #d19978;"&gt;u&lt;/span&gt;&lt;span style="color: #d19b79;"&gt;a&lt;/span&gt;&lt;span style="color: #cd9574;"&gt;w&lt;/span&gt;&lt;span style="color: #c38765;"&gt;t&lt;/span&gt;&lt;span style="color: #5c2b1d;"&gt;w&lt;/span&gt;&lt;span style="color: #6b4532;"&gt;s&lt;/span&gt;&lt;span style="color: #371a12;"&gt;o&lt;/span&gt;&lt;span style="color: #2e160c;"&gt;t&lt;/span&gt;&lt;span style="color: #2f1107;"&gt;k&lt;/span&gt;&lt;span style="color: #1f0e07;"&gt;e&lt;/span&gt;&lt;span style="color: #211009;"&gt;x&lt;/span&gt;&lt;span style="color: #110801;"&gt;s&lt;/span&gt;&lt;span style="color: #241009;"&gt;g&lt;/span&gt;&lt;span style="color: #130802;"&gt;x&lt;/span&gt;&lt;span style="color: #260f09;"&gt;l&lt;/span&gt;&lt;span style="color: #2f190e;"&gt;k&lt;/span&gt;&lt;span style="color: #100903;"&gt;l&lt;/span&gt;&lt;span style="color: #1a0902;"&gt;s&lt;/span&gt;&lt;span style="color: #301207;"&gt;o&lt;/span&gt;&lt;span style="color: #572816;"&gt;k&lt;/span&gt;&lt;span style="color: #4f1e0d;"&gt;a&lt;/span&gt;&lt;span style="color: #69331b;"&gt;k&lt;/span&gt;&lt;span style="color: #491a08;"&gt;l&lt;/span&gt;&lt;span style="color: #561c08;"&gt;h&lt;/span&gt;&lt;span style="color: #60220d;"&gt;r&lt;/span&gt;&lt;span style="color: #6f2309;"&gt;y&lt;/span&gt;&lt;span style="color: #6b230b;"&gt;c&lt;/span&gt;&lt;span style="color: #661e06;"&gt;m&lt;/span&gt;&lt;span style="color: #6b280b;"&gt;z&lt;/span&gt;&lt;span style="color: #461506;"&gt;a&lt;/span&gt;&lt;span style="color: #2d1207;"&gt;t&lt;/span&gt;&lt;span style="color: #2c0e06;"&gt;t&lt;/span&gt;&lt;span style="color: #0a0500;"&gt;b&lt;/span&gt;&lt;span style="color: #140b06;"&gt;q&lt;/span&gt;&lt;span style="color: #1c0d06;"&gt;m&lt;/span&gt;&lt;span style="color: #1f1209;"&gt;x&lt;/span&gt;&lt;span style="color: #28160a;"&gt;i&lt;/span&gt;&lt;span style="color: #0c0701;"&gt;b&lt;/span&gt;&lt;span style="color: #080703;"&gt;r&lt;/span&gt;&lt;span style="color: #0e0603;"&gt;t&lt;/span&gt;&lt;span style="color: #1b140a;"&gt;f&lt;/span&gt;&lt;span style="color: #1c1004;"&gt;o&lt;/span&gt;&lt;span style="color: #3d2607;"&gt;l&lt;/span&gt;
&lt;span style="color: #cb7a4d;"&gt;m&lt;/span&gt;&lt;span style="color: #b75d38;"&gt;l&lt;/span&gt;&lt;span style="color: #ae5132;"&gt;w&lt;/span&gt;&lt;span style="color: #b04f2f;"&gt;w&lt;/span&gt;&lt;span style="color: #9f4b31;"&gt;x&lt;/span&gt;&lt;span style="color: #c28767;"&gt;p&lt;/span&gt;&lt;span style="color: #c9916e;"&gt;l&lt;/span&gt;&lt;span style="color: #d19978;"&gt;h&lt;/span&gt;&lt;span style="color: #ce9675;"&gt;p&lt;/span&gt;&lt;span style="color: #c99170;"&gt;w&lt;/span&gt;&lt;span style="color: #b2795c;"&gt;t&lt;/span&gt;&lt;span style="color: #653624;"&gt;x&lt;/span&gt;&lt;span style="color: #6c3e2f;"&gt;n&lt;/span&gt;&lt;span style="color: #381d14;"&gt;r&lt;/span&gt;&lt;span style="color: #2a0f06;"&gt;z&lt;/span&gt;&lt;span style="color: #372114;"&gt;z&lt;/span&gt;&lt;span style="color: #1c0d06;"&gt;r&lt;/span&gt;&lt;span style="color: #1c0f06;"&gt;a&lt;/span&gt;&lt;span style="color: #1f0c06;"&gt;t&lt;/span&gt;&lt;span style="color: #1b0e08;"&gt;k&lt;/span&gt;&lt;span style="color: #251309;"&gt;c&lt;/span&gt;&lt;span style="color: #261209;"&gt;j&lt;/span&gt;&lt;span style="color: #0a0501;"&gt;x&lt;/span&gt;&lt;span style="color: #110803;"&gt;a&lt;/span&gt;&lt;span style="color: #220a00;"&gt;s&lt;/span&gt;&lt;span style="color: #431c0d;"&gt;y&lt;/span&gt;&lt;span style="color: #4f1a0a;"&gt;r&lt;/span&gt;&lt;span style="color: #541b08;"&gt;l&lt;/span&gt;&lt;span style="color: #471909;"&gt;e&lt;/span&gt;&lt;span style="color: #5f200f;"&gt;g&lt;/span&gt;&lt;span style="color: #5d1c08;"&gt;w&lt;/span&gt;&lt;span style="color: #742308;"&gt;q&lt;/span&gt;&lt;span style="color: #71250b;"&gt;s&lt;/span&gt;&lt;span style="color: #752409;"&gt;t&lt;/span&gt;&lt;span style="color: #712609;"&gt;n&lt;/span&gt;&lt;span style="color: #70240a;"&gt;p&lt;/span&gt;&lt;span style="color: #511703;"&gt;i&lt;/span&gt;&lt;span style="color: #211008;"&gt;y&lt;/span&gt;&lt;span style="color: #2c0e06;"&gt;x&lt;/span&gt;&lt;span style="color: #160805;"&gt;x&lt;/span&gt;&lt;span style="color: #0f0800;"&gt;u&lt;/span&gt;&lt;span style="color: #160d04;"&gt;q&lt;/span&gt;&lt;span style="color: #1f1209;"&gt;v&lt;/span&gt;&lt;span style="color: #201207;"&gt;i&lt;/span&gt;&lt;span style="color: #201209;"&gt;i&lt;/span&gt;&lt;span style="color: #0f0802;"&gt;v&lt;/span&gt;&lt;span style="color: #090400;"&gt;i&lt;/span&gt;&lt;span style="color: #191007;"&gt;z&lt;/span&gt;&lt;span style="color: #312111;"&gt;v&lt;/span&gt;&lt;span style="color: #51361b;"&gt;b&lt;/span&gt;
&lt;span style="color: #c76f4b;"&gt;k&lt;/span&gt;&lt;span style="color: #b85d3e;"&gt;x&lt;/span&gt;&lt;span style="color: #9e3a1a;"&gt;l&lt;/span&gt;&lt;span style="color: #cc8d6e;"&gt;h&lt;/span&gt;&lt;span style="color: #ca8f6f;"&gt;x&lt;/span&gt;&lt;span style="color: #c68e6d;"&gt;d&lt;/span&gt;&lt;span style="color: #cb9370;"&gt;g&lt;/span&gt;&lt;span style="color: #d19b79;"&gt;p&lt;/span&gt;&lt;span style="color: #cf9776;"&gt;p&lt;/span&gt;&lt;span style="color: #c9936f;"&gt;k&lt;/span&gt;&lt;span style="color: #9b6247;"&gt;v&lt;/span&gt;&lt;span style="color: #40190a;"&gt;l&lt;/span&gt;&lt;span style="color: #4e2718;"&gt;b&lt;/span&gt;&lt;span style="color: #492316;"&gt;o&lt;/span&gt;&lt;span style="color: #3b271c;"&gt;e&lt;/span&gt;&lt;span style="color: #2a110a;"&gt;o&lt;/span&gt;&lt;span style="color: #28140b;"&gt;d&lt;/span&gt;&lt;span style="color: #26140a;"&gt;n&lt;/span&gt;&lt;span style="color: #180b03;"&gt;n&lt;/span&gt;&lt;span style="color: #2a160d;"&gt;b&lt;/span&gt;&lt;span style="color: #1a0b04;"&gt;l&lt;/span&gt;&lt;span style="color: #120701;"&gt;i&lt;/span&gt;&lt;span style="color: #1a1007;"&gt;r&lt;/span&gt;&lt;span style="color: #291810;"&gt;g&lt;/span&gt;&lt;span style="color: #3f2116;"&gt;q&lt;/span&gt;&lt;span style="color: #421102;"&gt;a&lt;/span&gt;&lt;span style="color: #5c1e07;"&gt;b&lt;/span&gt;&lt;span style="color: #511e0b;"&gt;z&lt;/span&gt;&lt;span style="color: #461707;"&gt;a&lt;/span&gt;&lt;span style="color: #74290c;"&gt;x&lt;/span&gt;&lt;span style="color: #6f2309;"&gt;a&lt;/span&gt;&lt;span style="color: #73260a;"&gt;k&lt;/span&gt;&lt;span style="color: #77260b;"&gt;v&lt;/span&gt;&lt;span style="color: #79280d;"&gt;m&lt;/span&gt;&lt;span style="color: #6d2109;"&gt;s&lt;/span&gt;&lt;span style="color: #661f09;"&gt;s&lt;/span&gt;&lt;span style="color: #561706;"&gt;q&lt;/span&gt;&lt;span style="color: #200e04;"&gt;y&lt;/span&gt;&lt;span style="color: #310f03;"&gt;i&lt;/span&gt;&lt;span style="color: #170803;"&gt;f&lt;/span&gt;&lt;span style="color: #110a04;"&gt;i&lt;/span&gt;&lt;span style="color: #100903;"&gt;e&lt;/span&gt;&lt;span style="color: #21130a;"&gt;r&lt;/span&gt;&lt;span style="color: #1f1209;"&gt;j&lt;/span&gt;&lt;span style="color: #21130a;"&gt;s&lt;/span&gt;&lt;span style="color: #201207;"&gt;w&lt;/span&gt;&lt;span style="color: #130a03;"&gt;y&lt;/span&gt;&lt;span style="color: #150e08;"&gt;w&lt;/span&gt;&lt;span style="color: #2f1f10;"&gt;j&lt;/span&gt;&lt;span style="color: #4c3217;"&gt;m&lt;/span&gt;
&lt;span style="color: #b95a3c;"&gt;x&lt;/span&gt;&lt;span style="color: #9c3a21;"&gt;u&lt;/span&gt;&lt;span style="color: #bc7c60;"&gt;u&lt;/span&gt;&lt;span style="color: #ba7d60;"&gt;p&lt;/span&gt;&lt;span style="color: #c58a6a;"&gt;b&lt;/span&gt;&lt;span style="color: #c78f6c;"&gt;l&lt;/span&gt;&lt;span style="color: #c8906f;"&gt;q&lt;/span&gt;&lt;span style="color: #ce9778;"&gt;c&lt;/span&gt;&lt;span style="color: #d39b78;"&gt;k&lt;/span&gt;&lt;span style="color: #d19b79;"&gt;q&lt;/span&gt;&lt;span style="color: #76442d;"&gt;a&lt;/span&gt;&lt;span style="color: #36190b;"&gt;l&lt;/span&gt;&lt;span style="color: #2e1100;"&gt;b&lt;/span&gt;&lt;span style="color: #3b150a;"&gt;v&lt;/span&gt;&lt;span style="color: #2b140c;"&gt;y&lt;/span&gt;&lt;span style="color: #2c180d;"&gt;t&lt;/span&gt;&lt;span style="color: #210e07;"&gt;o&lt;/span&gt;&lt;span style="color: #2a1206;"&gt;o&lt;/span&gt;&lt;span style="color: #170a04;"&gt;s&lt;/span&gt;&lt;span style="color: #220f08;"&gt;w&lt;/span&gt;&lt;span style="color: #110602;"&gt;t&lt;/span&gt;&lt;span style="color: #180b05;"&gt;b&lt;/span&gt;&lt;span style="color: #150704;"&gt;b&lt;/span&gt;&lt;span style="color: #210f03;"&gt;l&lt;/span&gt;&lt;span style="color: #491508;"&gt;l&lt;/span&gt;&lt;span style="color: #662007;"&gt;t&lt;/span&gt;&lt;span style="color: #60240c;"&gt;h&lt;/span&gt;&lt;span style="color: #5b1c0a;"&gt;j&lt;/span&gt;&lt;span style="color: #5e1c06;"&gt;p&lt;/span&gt;&lt;span style="color: #853212;"&gt;r&lt;/span&gt;&lt;span style="color: #812a0c;"&gt;v&lt;/span&gt;&lt;span style="color: #80290d;"&gt;n&lt;/span&gt;&lt;span style="color: #822d0e;"&gt;m&lt;/span&gt;&lt;span style="color: #7e270b;"&gt;q&lt;/span&gt;&lt;span style="color: #7e2b0d;"&gt;c&lt;/span&gt;&lt;span style="color: #6b1f05;"&gt;n&lt;/span&gt;&lt;span style="color: #6b2009;"&gt;b&lt;/span&gt;&lt;span style="color: #2f0e05;"&gt;t&lt;/span&gt;&lt;span style="color: #2d0f04;"&gt;p&lt;/span&gt;&lt;span style="color: #190c04;"&gt;m&lt;/span&gt;&lt;span style="color: #120904;"&gt;j&lt;/span&gt;&lt;span style="color: #100702;"&gt;p&lt;/span&gt;&lt;span style="color: #130a05;"&gt;x&lt;/span&gt;&lt;span style="color: #190c03;"&gt;l&lt;/span&gt;&lt;span style="color: #190c04;"&gt;l&lt;/span&gt;&lt;span style="color: #1f1108;"&gt;v&lt;/span&gt;&lt;span style="color: #1a1004;"&gt;f&lt;/span&gt;&lt;span style="color: #100901;"&gt;z&lt;/span&gt;&lt;span style="color: #342414;"&gt;k&lt;/span&gt;&lt;span style="color: #3a2007;"&gt;x&lt;/span&gt;
&lt;span style="color: #c28b6d;"&gt;v&lt;/span&gt;&lt;span style="color: #b17457;"&gt;e&lt;/span&gt;&lt;span style="color: #95553a;"&gt;z&lt;/span&gt;&lt;span style="color: #975940;"&gt;w&lt;/span&gt;&lt;span style="color: #af6f53;"&gt;p&lt;/span&gt;&lt;span style="color: #c18966;"&gt;k&lt;/span&gt;&lt;span style="color: #c88f71;"&gt;q&lt;/span&gt;&lt;span style="color: #ca9173;"&gt;x&lt;/span&gt;&lt;span style="color: #d19a7b;"&gt;t&lt;/span&gt;&lt;span style="color: #d39c7d;"&gt;g&lt;/span&gt;&lt;span style="color: #7a4831;"&gt;o&lt;/span&gt;&lt;span style="color: #481c0f;"&gt;p&lt;/span&gt;&lt;span style="color: #4a2714;"&gt;t&lt;/span&gt;&lt;span style="color: #250c05;"&gt;a&lt;/span&gt;&lt;span style="color: #31140c;"&gt;f&lt;/span&gt;&lt;span style="color: #2c1912;"&gt;w&lt;/span&gt;&lt;span style="color: #4a362b;"&gt;n&lt;/span&gt;&lt;span style="color: #221109;"&gt;h&lt;/span&gt;&lt;span style="color: #28160a;"&gt;p&lt;/span&gt;&lt;span style="color: #26150e;"&gt;d&lt;/span&gt;&lt;span style="color: #160c03;"&gt;t&lt;/span&gt;&lt;span style="color: #140903;"&gt;z&lt;/span&gt;&lt;span style="color: #180b03;"&gt;t&lt;/span&gt;&lt;span style="color: #1f0b04;"&gt;r&lt;/span&gt;&lt;span style="color: #44150b;"&gt;k&lt;/span&gt;&lt;span style="color: #6d260a;"&gt;e&lt;/span&gt;&lt;span style="color: #6a2a11;"&gt;m&lt;/span&gt;&lt;span style="color: #63230a;"&gt;p&lt;/span&gt;&lt;span style="color: #72280f;"&gt;d&lt;/span&gt;&lt;span style="color: #863114;"&gt;x&lt;/span&gt;&lt;span style="color: #882d10;"&gt;n&lt;/span&gt;&lt;span style="color: #8a2d0e;"&gt;z&lt;/span&gt;&lt;span style="color: #812a0e;"&gt;b&lt;/span&gt;&lt;span style="color: #882d0e;"&gt;m&lt;/span&gt;&lt;span style="color: #822f11;"&gt;w&lt;/span&gt;&lt;span style="color: #762709;"&gt;q&lt;/span&gt;&lt;span style="color: #671f07;"&gt;w&lt;/span&gt;&lt;span style="color: #3d1307;"&gt;m&lt;/span&gt;&lt;span style="color: #260b02;"&gt;o&lt;/span&gt;&lt;span style="color: #230c04;"&gt;q&lt;/span&gt;&lt;span style="color: #180b05;"&gt;t&lt;/span&gt;&lt;span style="color: #160d06;"&gt;d&lt;/span&gt;&lt;span style="color: #0b0600;"&gt;g&lt;/span&gt;&lt;span style="color: #170f04;"&gt;m&lt;/span&gt;&lt;span style="color: #190f05;"&gt;e&lt;/span&gt;&lt;span style="color: #241309;"&gt;m&lt;/span&gt;&lt;span style="color: #231304;"&gt;j&lt;/span&gt;&lt;span style="color: #2b1507;"&gt;s&lt;/span&gt;&lt;span style="color: #4b3319;"&gt;t&lt;/span&gt;&lt;span style="color: #4c2d0e;"&gt;z&lt;/span&gt;
&lt;span style="color: #c18666;"&gt;v&lt;/span&gt;&lt;span style="color: #a16145;"&gt;m&lt;/span&gt;&lt;span style="color: #6d3a1f;"&gt;y&lt;/span&gt;&lt;span style="color: #7c462e;"&gt;p&lt;/span&gt;&lt;span style="color: #9f6246;"&gt;e&lt;/span&gt;&lt;span style="color: #ba7f5f;"&gt;j&lt;/span&gt;&lt;span style="color: #c58d6c;"&gt;u&lt;/span&gt;&lt;span style="color: #c58d6c;"&gt;r&lt;/span&gt;&lt;span style="color: #ce9778;"&gt;z&lt;/span&gt;&lt;span style="color: #ab6e51;"&gt;y&lt;/span&gt;&lt;span style="color: #5d301d;"&gt;o&lt;/span&gt;&lt;span style="color: #6e4436;"&gt;m&lt;/span&gt;&lt;span style="color: #623f2c;"&gt;x&lt;/span&gt;&lt;span style="color: #421a0e;"&gt;p&lt;/span&gt;&lt;span style="color: #2f1107;"&gt;z&lt;/span&gt;&lt;span style="color: #2e130c;"&gt;u&lt;/span&gt;&lt;span style="color: #30180c;"&gt;g&lt;/span&gt;&lt;span style="color: #382014;"&gt;w&lt;/span&gt;&lt;span style="color: #3d2316;"&gt;h&lt;/span&gt;&lt;span style="color: #341c12;"&gt;u&lt;/span&gt;&lt;span style="color: #1d0f0c;"&gt;n&lt;/span&gt;&lt;span style="color: #220e05;"&gt;a&lt;/span&gt;&lt;span style="color: #220f08;"&gt;y&lt;/span&gt;&lt;span style="color: #28140b;"&gt;t&lt;/span&gt;&lt;span style="color: #210e07;"&gt;n&lt;/span&gt;&lt;span style="color: #2c1005;"&gt;c&lt;/span&gt;&lt;span style="color: #65230d;"&gt;f&lt;/span&gt;&lt;span style="color: #68250b;"&gt;w&lt;/span&gt;&lt;span style="color: #883115;"&gt;u&lt;/span&gt;&lt;span style="color: #842b0b;"&gt;z&lt;/span&gt;&lt;span style="color: #8a2c10;"&gt;w&lt;/span&gt;&lt;span style="color: #8d2e12;"&gt;q&lt;/span&gt;&lt;span style="color: #943515;"&gt;m&lt;/span&gt;&lt;span style="color: #923514;"&gt;u&lt;/span&gt;&lt;span style="color: #86300f;"&gt;f&lt;/span&gt;&lt;span style="color: #7b2c0e;"&gt;q&lt;/span&gt;&lt;span style="color: #631803;"&gt;d&lt;/span&gt;&lt;span style="color: #4d1808;"&gt;z&lt;/span&gt;&lt;span style="color: #2c1108;"&gt;h&lt;/span&gt;&lt;span style="color: #2c0f07;"&gt;c&lt;/span&gt;&lt;span style="color: #190c04;"&gt;x&lt;/span&gt;&lt;span style="color: #1a0b04;"&gt;v&lt;/span&gt;&lt;span style="color: #0d0802;"&gt;p&lt;/span&gt;&lt;span style="color: #110801;"&gt;v&lt;/span&gt;&lt;span style="color: #140905;"&gt;l&lt;/span&gt;&lt;span style="color: #1b1105;"&gt;o&lt;/span&gt;&lt;span style="color: #251506;"&gt;q&lt;/span&gt;&lt;span style="color: #331e0d;"&gt;r&lt;/span&gt;&lt;span style="color: #3d270f;"&gt;l&lt;/span&gt;&lt;span style="color: #84623d;"&gt;x&lt;/span&gt;
&lt;span style="color: #bf8361;"&gt;m&lt;/span&gt;&lt;span style="color: #a16146;"&gt;y&lt;/span&gt;&lt;span style="color: #643519;"&gt;x&lt;/span&gt;&lt;span style="color: #78442c;"&gt;k&lt;/span&gt;&lt;span style="color: #844c31;"&gt;s&lt;/span&gt;&lt;span style="color: #b4795b;"&gt;l&lt;/span&gt;&lt;span style="color: #c48c6b;"&gt;m&lt;/span&gt;&lt;span style="color: #c68e6d;"&gt;x&lt;/span&gt;&lt;span style="color: #c89373;"&gt;i&lt;/span&gt;&lt;span style="color: #4b1805;"&gt;g&lt;/span&gt;&lt;span style="color: #4b2010;"&gt;w&lt;/span&gt;&lt;span style="color: #623724;"&gt;e&lt;/span&gt;&lt;span style="color: #512115;"&gt;x&lt;/span&gt;&lt;span style="color: #6e4033;"&gt;i&lt;/span&gt;&lt;span style="color: #300f06;"&gt;y&lt;/span&gt;&lt;span style="color: #270e09;"&gt;c&lt;/span&gt;&lt;span style="color: #220b05;"&gt;z&lt;/span&gt;&lt;span style="color: #210c07;"&gt;c&lt;/span&gt;&lt;span style="color: #2a1208;"&gt;c&lt;/span&gt;&lt;span style="color: #230f06;"&gt;g&lt;/span&gt;&lt;span style="color: #3a160a;"&gt;f&lt;/span&gt;&lt;span style="color: #2c1608;"&gt;a&lt;/span&gt;&lt;span style="color: #571e0d;"&gt;b&lt;/span&gt;&lt;span style="color: #6a240b;"&gt;u&lt;/span&gt;&lt;span style="color: #833e1d;"&gt;w&lt;/span&gt;&lt;span style="color: #4c1b0c;"&gt;m&lt;/span&gt;&lt;span style="color: #3c0e01;"&gt;j&lt;/span&gt;&lt;span style="color: #4b1302;"&gt;m&lt;/span&gt;&lt;span style="color: #7f2b11;"&gt;e&lt;/span&gt;&lt;span style="color: #933416;"&gt;u&lt;/span&gt;&lt;span style="color: #933114;"&gt;j&lt;/span&gt;&lt;span style="color: #932e12;"&gt;q&lt;/span&gt;&lt;span style="color: #983717;"&gt;t&lt;/span&gt;&lt;span style="color: #9b3d1b;"&gt;h&lt;/span&gt;&lt;span style="color: #8c3311;"&gt;b&lt;/span&gt;&lt;span style="color: #7b2a0d;"&gt;l&lt;/span&gt;&lt;span style="color: #662007;"&gt;s&lt;/span&gt;&lt;span style="color: #471607;"&gt;n&lt;/span&gt;&lt;span style="color: #241009;"&gt;i&lt;/span&gt;&lt;span style="color: #220e05;"&gt;b&lt;/span&gt;&lt;span style="color: #170a02;"&gt;u&lt;/span&gt;&lt;span style="color: #150a04;"&gt;f&lt;/span&gt;&lt;span style="color: #0e0604;"&gt;f&lt;/span&gt;&lt;span style="color: #0e0701;"&gt;r&lt;/span&gt;&lt;span style="color: #160901;"&gt;o&lt;/span&gt;&lt;span style="color: #130c04;"&gt;d&lt;/span&gt;&lt;span style="color: #25170c;"&gt;u&lt;/span&gt;&lt;span style="color: #341f0c;"&gt;n&lt;/span&gt;&lt;span style="color: #4f331b;"&gt;g&lt;/span&gt;&lt;span style="color: #774925;"&gt;x&lt;/span&gt;
&lt;span style="color: #bd8262;"&gt;u&lt;/span&gt;&lt;span style="color: #a86b4e;"&gt;l&lt;/span&gt;&lt;span style="color: #6f3d24;"&gt;x&lt;/span&gt;&lt;span style="color: #5b2e19;"&gt;w&lt;/span&gt;&lt;span style="color: #7c462c;"&gt;f&lt;/span&gt;&lt;span style="color: #b6795c;"&gt;u&lt;/span&gt;&lt;span style="color: #ca9173;"&gt;j&lt;/span&gt;&lt;span style="color: #cc9576;"&gt;p&lt;/span&gt;&lt;span style="color: #c08567;"&gt;g&lt;/span&gt;&lt;span style="color: #53200f;"&gt;n&lt;/span&gt;&lt;span style="color: #3b1a0b;"&gt;k&lt;/span&gt;&lt;span style="color: #3f1a0a;"&gt;q&lt;/span&gt;&lt;span style="color: #44150b;"&gt;e&lt;/span&gt;&lt;span style="color: #451a0a;"&gt;d&lt;/span&gt;&lt;span style="color: #2e0e03;"&gt;y&lt;/span&gt;&lt;span style="color: #4b2115;"&gt;f&lt;/span&gt;&lt;span style="color: #401e14;"&gt;o&lt;/span&gt;&lt;span style="color: #2f1508;"&gt;r&lt;/span&gt;&lt;span style="color: #3a130c;"&gt;t&lt;/span&gt;&lt;span style="color: #58200f;"&gt;x&lt;/span&gt;&lt;span style="color: #2b0900;"&gt;s&lt;/span&gt;&lt;span style="color: #5a1d0b;"&gt;o&lt;/span&gt;&lt;span style="color: #5f1b06;"&gt;d&lt;/span&gt;&lt;span style="color: #76250a;"&gt;x&lt;/span&gt;&lt;span style="color: #6a1d09;"&gt;g&lt;/span&gt;&lt;span style="color: #622008;"&gt;r&lt;/span&gt;&lt;span style="color: #7c3112;"&gt;b&lt;/span&gt;&lt;span style="color: #6f270e;"&gt;a&lt;/span&gt;&lt;span style="color: #8f3117;"&gt;f&lt;/span&gt;&lt;span style="color: #963316;"&gt;h&lt;/span&gt;&lt;span style="color: #973214;"&gt;y&lt;/span&gt;&lt;span style="color: #9a3718;"&gt;a&lt;/span&gt;&lt;span style="color: #983714;"&gt;t&lt;/span&gt;&lt;span style="color: #963918;"&gt;v&lt;/span&gt;&lt;span style="color: #732109;"&gt;w&lt;/span&gt;&lt;span style="color: #591a0b;"&gt;z&lt;/span&gt;&lt;span style="color: #2f0d03;"&gt;q&lt;/span&gt;&lt;span style="color: #1d0c05;"&gt;f&lt;/span&gt;&lt;span style="color: #150c05;"&gt;o&lt;/span&gt;&lt;span style="color: #0f0802;"&gt;w&lt;/span&gt;&lt;span style="color: #170d04;"&gt;t&lt;/span&gt;&lt;span style="color: #0f0802;"&gt;y&lt;/span&gt;&lt;span style="color: #170c06;"&gt;n&lt;/span&gt;&lt;span style="color: #0f0802;"&gt;x&lt;/span&gt;&lt;span style="color: #23150c;"&gt;c&lt;/span&gt;&lt;span style="color: #100702;"&gt;l&lt;/span&gt;&lt;span style="color: #190c03;"&gt;d&lt;/span&gt;&lt;span style="color: #2e1908;"&gt;q&lt;/span&gt;&lt;span style="color: #593b1f;"&gt;d&lt;/span&gt;&lt;span style="color: #b2875a;"&gt;w&lt;/span&gt;
&lt;span style="color: #bb7e5f;"&gt;o&lt;/span&gt;&lt;span style="color: #b87b5e;"&gt;v&lt;/span&gt;&lt;span style="color: #995c40;"&gt;k&lt;/span&gt;&lt;span style="color: #7b442f;"&gt;r&lt;/span&gt;&lt;span style="color: #9e6246;"&gt;t&lt;/span&gt;&lt;span style="color: #c08769;"&gt;r&lt;/span&gt;&lt;span style="color: #cf9977;"&gt;j&lt;/span&gt;&lt;span style="color: #d09b7c;"&gt;u&lt;/span&gt;&lt;span style="color: #c6896a;"&gt;r&lt;/span&gt;&lt;span style="color: #541c0f;"&gt;p&lt;/span&gt;&lt;span style="color: #2d1002;"&gt;c&lt;/span&gt;&lt;span style="color: #381209;"&gt;q&lt;/span&gt;&lt;span style="color: #4f271b;"&gt;p&lt;/span&gt;&lt;span style="color: #532315;"&gt;v&lt;/span&gt;&lt;span style="color: #512115;"&gt;m&lt;/span&gt;&lt;span style="color: #5b301f;"&gt;l&lt;/span&gt;&lt;span style="color: #652011;"&gt;u&lt;/span&gt;&lt;span style="color: #4b1200;"&gt;c&lt;/span&gt;&lt;span style="color: #3f0d06;"&gt;r&lt;/span&gt;&lt;span style="color: #7a3621;"&gt;j&lt;/span&gt;&lt;span style="color: #9f452a;"&gt;z&lt;/span&gt;&lt;span style="color: #73230c;"&gt;k&lt;/span&gt;&lt;span style="color: #61200e;"&gt;i&lt;/span&gt;&lt;span style="color: #54210e;"&gt;m&lt;/span&gt;&lt;span style="color: #682209;"&gt;i&lt;/span&gt;&lt;span style="color: #69210b;"&gt;k&lt;/span&gt;&lt;span style="color: #76290d;"&gt;y&lt;/span&gt;&lt;span style="color: #852b10;"&gt;l&lt;/span&gt;&lt;span style="color: #8c2f0e;"&gt;a&lt;/span&gt;&lt;span style="color: #963314;"&gt;c&lt;/span&gt;&lt;span style="color: #953414;"&gt;h&lt;/span&gt;&lt;span style="color: #9b3316;"&gt;o&lt;/span&gt;&lt;span style="color: #933212;"&gt;x&lt;/span&gt;&lt;span style="color: #86240b;"&gt;s&lt;/span&gt;&lt;span style="color: #7b250a;"&gt;g&lt;/span&gt;&lt;span style="color: #6a230d;"&gt;r&lt;/span&gt;&lt;span style="color: #5a1907;"&gt;j&lt;/span&gt;&lt;span style="color: #380c03;"&gt;p&lt;/span&gt;&lt;span style="color: #2b0f03;"&gt;m&lt;/span&gt;&lt;span style="color: #370b00;"&gt;b&lt;/span&gt;&lt;span style="color: #1e0701;"&gt;e&lt;/span&gt;&lt;span style="color: #0a0501;"&gt;o&lt;/span&gt;&lt;span style="color: #0c0701;"&gt;r&lt;/span&gt;&lt;span style="color: #100903;"&gt;t&lt;/span&gt;&lt;span style="color: #120902;"&gt;k&lt;/span&gt;&lt;span style="color: #1b0e05;"&gt;d&lt;/span&gt;&lt;span style="color: #1e0e01;"&gt;f&lt;/span&gt;&lt;span style="color: #3a210d;"&gt;f&lt;/span&gt;&lt;span style="color: #5e401e;"&gt;f&lt;/span&gt;&lt;span style="color: #d5b28c;"&gt;w&lt;/span&gt;
&lt;span style="color: #b6795a;"&gt;p&lt;/span&gt;&lt;span style="color: #c2896b;"&gt;e&lt;/span&gt;&lt;span style="color: #bb8060;"&gt;g&lt;/span&gt;&lt;span style="color: #b37659;"&gt;x&lt;/span&gt;&lt;span style="color: #bd8264;"&gt;r&lt;/span&gt;&lt;span style="color: #cb9372;"&gt;o&lt;/span&gt;&lt;span style="color: #cf9879;"&gt;h&lt;/span&gt;&lt;span style="color: #d09b7b;"&gt;q&lt;/span&gt;&lt;span style="color: #c08567;"&gt;z&lt;/span&gt;&lt;span style="color: #5a2110;"&gt;i&lt;/span&gt;&lt;span style="color: #391109;"&gt;s&lt;/span&gt;&lt;span style="color: #2b0f04;"&gt;h&lt;/span&gt;&lt;span style="color: #39170b;"&gt;x&lt;/span&gt;&lt;span style="color: #441207;"&gt;q&lt;/span&gt;&lt;span style="color: #220905;"&gt;a&lt;/span&gt;&lt;span style="color: #ac5238;"&gt;d&lt;/span&gt;&lt;span style="color: #65321f;"&gt;h&lt;/span&gt;&lt;span style="color: #1f1108;"&gt;j&lt;/span&gt;&lt;span style="color: #0f0400;"&gt;s&lt;/span&gt;&lt;span style="color: #8a482e;"&gt;t&lt;/span&gt;&lt;span style="color: #7a3219;"&gt;l&lt;/span&gt;&lt;span style="color: #854c2e;"&gt;w&lt;/span&gt;&lt;span style="color: #683d1b;"&gt;i&lt;/span&gt;&lt;span style="color: #44240f;"&gt;c&lt;/span&gt;&lt;span style="color: #371108;"&gt;q&lt;/span&gt;&lt;span style="color: #6c210c;"&gt;t&lt;/span&gt;&lt;span style="color: #77270c;"&gt;g&lt;/span&gt;&lt;span style="color: #802a0f;"&gt;v&lt;/span&gt;&lt;span style="color: #8a2c10;"&gt;z&lt;/span&gt;&lt;span style="color: #8d2f13;"&gt;m&lt;/span&gt;&lt;span style="color: #923013;"&gt;r&lt;/span&gt;&lt;span style="color: #8d2b10;"&gt;o&lt;/span&gt;&lt;span style="color: #893012;"&gt;r&lt;/span&gt;&lt;span style="color: #7c260b;"&gt;y&lt;/span&gt;&lt;span style="color: #812a0f;"&gt;l&lt;/span&gt;&lt;span style="color: #6d230a;"&gt;j&lt;/span&gt;&lt;span style="color: #631b05;"&gt;n&lt;/span&gt;&lt;span style="color: #661d0c;"&gt;t&lt;/span&gt;&lt;span style="color: #571807;"&gt;z&lt;/span&gt;&lt;span style="color: #190600;"&gt;n&lt;/span&gt;&lt;span style="color: #3c160d;"&gt;c&lt;/span&gt;&lt;span style="color: #1e0b05;"&gt;s&lt;/span&gt;&lt;span style="color: #130804;"&gt;u&lt;/span&gt;&lt;span style="color: #100702;"&gt;z&lt;/span&gt;&lt;span style="color: #170a02;"&gt;i&lt;/span&gt;&lt;span style="color: #1b0e06;"&gt;u&lt;/span&gt;&lt;span style="color: #2f1d0f;"&gt;c&lt;/span&gt;&lt;span style="color: #341f0c;"&gt;q&lt;/span&gt;&lt;span style="color: #543216;"&gt;e&lt;/span&gt;&lt;span style="color: #f9dfbe;"&gt;v&lt;/span&gt;
&lt;span style="color: #b47856;"&gt;j&lt;/span&gt;&lt;span style="color: #c38b6a;"&gt;q&lt;/span&gt;&lt;span style="color: #c68e6d;"&gt;s&lt;/span&gt;&lt;span style="color: #c58d6c;"&gt;s&lt;/span&gt;&lt;span style="color: #c99170;"&gt;t&lt;/span&gt;&lt;span style="color: #cd9574;"&gt;i&lt;/span&gt;&lt;span style="color: #cd9775;"&gt;l&lt;/span&gt;&lt;span style="color: #cf9977;"&gt;z&lt;/span&gt;&lt;span style="color: #cb9274;"&gt;e&lt;/span&gt;&lt;span style="color: #6e2711;"&gt;k&lt;/span&gt;&lt;span style="color: #3f1008;"&gt;m&lt;/span&gt;&lt;span style="color: #491104;"&gt;v&lt;/span&gt;&lt;span style="color: #5d1809;"&gt;z&lt;/span&gt;&lt;span style="color: #4a1408;"&gt;d&lt;/span&gt;&lt;span style="color: #501a0e;"&gt;u&lt;/span&gt;&lt;span style="color: #cf6849;"&gt;l&lt;/span&gt;&lt;span style="color: #cb6c4c;"&gt;m&lt;/span&gt;&lt;span style="color: #2a1708;"&gt;h&lt;/span&gt;&lt;span style="color: #b9573a;"&gt;e&lt;/span&gt;&lt;span style="color: #a34927;"&gt;m&lt;/span&gt;&lt;span style="color: #691900;"&gt;u&lt;/span&gt;&lt;span style="color: #7f3616;"&gt;g&lt;/span&gt;&lt;span style="color: #7c4a31;"&gt;e&lt;/span&gt;&lt;span style="color: #0f0100;"&gt;p&lt;/span&gt;&lt;span style="color: #221006;"&gt;g&lt;/span&gt;&lt;span style="color: #3b1405;"&gt;m&lt;/span&gt;&lt;span style="color: #762208;"&gt;k&lt;/span&gt;&lt;span style="color: #7f2c0e;"&gt;i&lt;/span&gt;&lt;span style="color: #8b3212;"&gt;c&lt;/span&gt;&lt;span style="color: #8d300f;"&gt;p&lt;/span&gt;&lt;span style="color: #8c2d0f;"&gt;e&lt;/span&gt;&lt;span style="color: #7c2509;"&gt;m&lt;/span&gt;&lt;span style="color: #772309;"&gt;f&lt;/span&gt;&lt;span style="color: #711f07;"&gt;w&lt;/span&gt;&lt;span style="color: #6c2008;"&gt;f&lt;/span&gt;&lt;span style="color: #5c1805;"&gt;y&lt;/span&gt;&lt;span style="color: #72270a;"&gt;f&lt;/span&gt;&lt;span style="color: #70240a;"&gt;q&lt;/span&gt;&lt;span style="color: #681d08;"&gt;y&lt;/span&gt;&lt;span style="color: #4b1400;"&gt;j&lt;/span&gt;&lt;span style="color: #591806;"&gt;b&lt;/span&gt;&lt;span style="color: #56240d;"&gt;k&lt;/span&gt;&lt;span style="color: #2b1309;"&gt;f&lt;/span&gt;&lt;span style="color: #130804;"&gt;b&lt;/span&gt;&lt;span style="color: #170a04;"&gt;n&lt;/span&gt;&lt;span style="color: #1f1108;"&gt;z&lt;/span&gt;&lt;span style="color: #342112;"&gt;m&lt;/span&gt;&lt;span style="color: #362009;"&gt;a&lt;/span&gt;&lt;span style="color: #80542f;"&gt;h&lt;/span&gt;&lt;span style="color: #fde8cb;"&gt;r&lt;/span&gt;
&lt;span style="color: #b17457;"&gt;m&lt;/span&gt;&lt;span style="color: #c28c6a;"&gt;c&lt;/span&gt;&lt;span style="color: #c58d6c;"&gt;y&lt;/span&gt;&lt;span style="color: #c78f6e;"&gt;q&lt;/span&gt;&lt;span style="color: #c99170;"&gt;r&lt;/span&gt;&lt;span style="color: #c89270;"&gt;e&lt;/span&gt;&lt;span style="color: #c78e70;"&gt;d&lt;/span&gt;&lt;span style="color: #ca9573;"&gt;c&lt;/span&gt;&lt;span style="color: #cf9879;"&gt;n&lt;/span&gt;&lt;span style="color: #c07f61;"&gt;g&lt;/span&gt;&lt;span style="color: #b67056;"&gt;r&lt;/span&gt;&lt;span style="color: #c9886a;"&gt;r&lt;/span&gt;&lt;span style="color: #681d08;"&gt;t&lt;/span&gt;&lt;span style="color: #37160f;"&gt;x&lt;/span&gt;&lt;span style="color: #6d210a;"&gt;n&lt;/span&gt;&lt;span style="color: #da7758;"&gt;y&lt;/span&gt;&lt;span style="color: #ce704e;"&gt;v&lt;/span&gt;&lt;span style="color: #954a33;"&gt;t&lt;/span&gt;&lt;span style="color: #d27959;"&gt;o&lt;/span&gt;&lt;span style="color: #c76b54;"&gt;u&lt;/span&gt;&lt;span style="color: #a94b29;"&gt;c&lt;/span&gt;&lt;span style="color: #7f2b0f;"&gt;q&lt;/span&gt;&lt;span style="color: #290700;"&gt;e&lt;/span&gt;&lt;span style="color: #0b0801;"&gt;h&lt;/span&gt;&lt;span style="color: #713c1d;"&gt;s&lt;/span&gt;&lt;span style="color: #4a0f09;"&gt;s&lt;/span&gt;&lt;span style="color: #4d1f0f;"&gt;h&lt;/span&gt;&lt;span style="color: #200f08;"&gt;e&lt;/span&gt;&lt;span style="color: #923917;"&gt;s&lt;/span&gt;&lt;span style="color: #913816;"&gt;p&lt;/span&gt;&lt;span style="color: #8c3210;"&gt;w&lt;/span&gt;&lt;span style="color: #71210a;"&gt;f&lt;/span&gt;&lt;span style="color: #70220b;"&gt;r&lt;/span&gt;&lt;span style="color: #6a1e06;"&gt;u&lt;/span&gt;&lt;span style="color: #621a04;"&gt;w&lt;/span&gt;&lt;span style="color: #431a08;"&gt;j&lt;/span&gt;&lt;span style="color: #2c160b;"&gt;z&lt;/span&gt;&lt;span style="color: #220b03;"&gt;a&lt;/span&gt;&lt;span style="color: #3f1008;"&gt;l&lt;/span&gt;&lt;span style="color: #4a0e03;"&gt;m&lt;/span&gt;&lt;span style="color: #5d1808;"&gt;g&lt;/span&gt;&lt;span style="color: #5e210c;"&gt;d&lt;/span&gt;&lt;span style="color: #491807;"&gt;d&lt;/span&gt;&lt;span style="color: #0d0200;"&gt;z&lt;/span&gt;&lt;span style="color: #150a06;"&gt;b&lt;/span&gt;&lt;span style="color: #0b0602;"&gt;r&lt;/span&gt;&lt;span style="color: #2b150a;"&gt;x&lt;/span&gt;&lt;span style="color: #2e180b;"&gt;x&lt;/span&gt;&lt;span style="color: #ad8059;"&gt;l&lt;/span&gt;&lt;span style="color: #ffe5ce;"&gt;m&lt;/span&gt;
&lt;span style="color: #ad6e4d;"&gt;r&lt;/span&gt;&lt;span style="color: #c08769;"&gt;n&lt;/span&gt;&lt;span style="color: #c58d6c;"&gt;d&lt;/span&gt;&lt;span style="color: #c58c6e;"&gt;v&lt;/span&gt;&lt;span style="color: #c89172;"&gt;v&lt;/span&gt;&lt;span style="color: #c78f6c;"&gt;v&lt;/span&gt;&lt;span style="color: #c48e6a;"&gt;o&lt;/span&gt;&lt;span style="color: #c99371;"&gt;c&lt;/span&gt;&lt;span style="color: #cc9a77;"&gt;a&lt;/span&gt;&lt;span style="color: #d29d7d;"&gt;h&lt;/span&gt;&lt;span style="color: #d29d7e;"&gt;r&lt;/span&gt;&lt;span style="color: #ce9a75;"&gt;w&lt;/span&gt;&lt;span style="color: #8e3314;"&gt;m&lt;/span&gt;&lt;span style="color: #371106;"&gt;j&lt;/span&gt;&lt;span style="color: #7b250e;"&gt;q&lt;/span&gt;&lt;span style="color: #d87959;"&gt;j&lt;/span&gt;&lt;span style="color: #da7d5c;"&gt;s&lt;/span&gt;&lt;span style="color: #bc6547;"&gt;p&lt;/span&gt;&lt;span style="color: #d58264;"&gt;j&lt;/span&gt;&lt;span style="color: #c86d52;"&gt;e&lt;/span&gt;&lt;span style="color: #c37a5a;"&gt;c&lt;/span&gt;&lt;span style="color: #ad5432;"&gt;q&lt;/span&gt;&lt;span style="color: #a04220;"&gt;i&lt;/span&gt;&lt;span style="color: #84290c;"&gt;g&lt;/span&gt;&lt;span style="color: #6f1d08;"&gt;p&lt;/span&gt;&lt;span style="color: #6e220a;"&gt;j&lt;/span&gt;&lt;span style="color: #79280b;"&gt;x&lt;/span&gt;&lt;span style="color: #802c10;"&gt;n&lt;/span&gt;&lt;span style="color: #320a00;"&gt;g&lt;/span&gt;&lt;span style="color: #88340f;"&gt;i&lt;/span&gt;&lt;span style="color: #7f2e10;"&gt;z&lt;/span&gt;&lt;span style="color: #651e0c;"&gt;y&lt;/span&gt;&lt;span style="color: #140500;"&gt;w&lt;/span&gt;&lt;span style="color: #030400;"&gt;d&lt;/span&gt;&lt;span style="color: #1b0200;"&gt;u&lt;/span&gt;&lt;span style="color: #150802;"&gt;r&lt;/span&gt;&lt;span style="color: #0c0300;"&gt;y&lt;/span&gt;&lt;span style="color: #130a05;"&gt;i&lt;/span&gt;&lt;span style="color: #110602;"&gt;u&lt;/span&gt;&lt;span style="color: #1d0b01;"&gt;y&lt;/span&gt;&lt;span style="color: #521d0f;"&gt;p&lt;/span&gt;&lt;span style="color: #60220b;"&gt;m&lt;/span&gt;&lt;span style="color: #4b1207;"&gt;v&lt;/span&gt;&lt;span style="color: #0d0400;"&gt;c&lt;/span&gt;&lt;span style="color: #1e0501;"&gt;w&lt;/span&gt;&lt;span style="color: #0a0702;"&gt;m&lt;/span&gt;&lt;span style="color: #231208;"&gt;m&lt;/span&gt;&lt;span style="color: #291305;"&gt;o&lt;/span&gt;&lt;span style="color: #b3865d;"&gt;b&lt;/span&gt;&lt;span style="color: #fee9cc;"&gt;v&lt;/span&gt;
&lt;span style="color: #b57d5a;"&gt;t&lt;/span&gt;&lt;span style="color: #c99371;"&gt;d&lt;/span&gt;&lt;span style="color: #cd9876;"&gt;l&lt;/span&gt;&lt;span style="color: #d6997a;"&gt;c&lt;/span&gt;&lt;span style="color: #f19588;"&gt;k&lt;/span&gt;&lt;span style="color: #f88f8b;"&gt;b&lt;/span&gt;&lt;span style="color: #f98d8b;"&gt;l&lt;/span&gt;&lt;span style="color: #f48d84;"&gt;i&lt;/span&gt;&lt;span style="color: #e1907b;"&gt;o&lt;/span&gt;&lt;span style="color: #c8876b;"&gt;s&lt;/span&gt;&lt;span style="color: #c48e6c;"&gt;r&lt;/span&gt;&lt;span style="color: #cc9576;"&gt;o&lt;/span&gt;&lt;span style="color: #aa462e;"&gt;q&lt;/span&gt;&lt;span style="color: #4a1004;"&gt;n&lt;/span&gt;&lt;span style="color: #a13f24;"&gt;s&lt;/span&gt;&lt;span style="color: #dc8361;"&gt;k&lt;/span&gt;&lt;span style="color: #de8563;"&gt;f&lt;/span&gt;&lt;span style="color: #2a0f00;"&gt;r&lt;/span&gt;&lt;span style="color: #c36f4d;"&gt;t&lt;/span&gt;&lt;span style="color: #b95c3d;"&gt;z&lt;/span&gt;&lt;span style="color: #b25836;"&gt;q&lt;/span&gt;&lt;span style="color: #a74d2b;"&gt;j&lt;/span&gt;&lt;span style="color: #993c1b;"&gt;m&lt;/span&gt;&lt;span style="color: #872a0b;"&gt;l&lt;/span&gt;&lt;span style="color: #80260b;"&gt;l&lt;/span&gt;&lt;span style="color: #873110;"&gt;i&lt;/span&gt;&lt;span style="color: #792c10;"&gt;x&lt;/span&gt;&lt;span style="color: #350f02;"&gt;x&lt;/span&gt;&lt;span style="color: #220904;"&gt;x&lt;/span&gt;&lt;span style="color: #7c260f;"&gt;z&lt;/span&gt;&lt;span style="color: #681c05;"&gt;t&lt;/span&gt;&lt;span style="color: #060503;"&gt;r&lt;/span&gt;&lt;span style="color: #682208;"&gt;d&lt;/span&gt;&lt;span style="color: #6d260a;"&gt;f&lt;/span&gt;&lt;span style="color: #4c1709;"&gt;t&lt;/span&gt;&lt;span style="color: #130400;"&gt;n&lt;/span&gt;&lt;span style="color: #0a0a02;"&gt;h&lt;/span&gt;&lt;span style="color: #5b2b14;"&gt;f&lt;/span&gt;&lt;span style="color: #591508;"&gt;v&lt;/span&gt;&lt;span style="color: #551607;"&gt;w&lt;/span&gt;&lt;span style="color: #461b08;"&gt;x&lt;/span&gt;&lt;span style="color: #72462d;"&gt;m&lt;/span&gt;&lt;span style="color: #0e0906;"&gt;l&lt;/span&gt;&lt;span style="color: #221000;"&gt;o&lt;/span&gt;&lt;span style="color: #230401;"&gt;z&lt;/span&gt;&lt;span style="color: #0e0603;"&gt;d&lt;/span&gt;&lt;span style="color: #1e0e01;"&gt;z&lt;/span&gt;&lt;span style="color: #1d0e07;"&gt;f&lt;/span&gt;&lt;span style="color: #683f1f;"&gt;u&lt;/span&gt;&lt;span style="color: #fbe6c9;"&gt;s&lt;/span&gt;
&lt;span style="color: #cd9d75;"&gt;f&lt;/span&gt;&lt;span style="color: #d0a37a;"&gt;k&lt;/span&gt;&lt;span style="color: #f7928a;"&gt;c&lt;/span&gt;&lt;span style="color: #f46c76;"&gt;r&lt;/span&gt;&lt;span style="color: #f87482;"&gt;v&lt;/span&gt;&lt;span style="color: #fd889a;"&gt;n&lt;/span&gt;&lt;span style="color: #fc7f8f;"&gt;a&lt;/span&gt;&lt;span style="color: #f46674;"&gt;t&lt;/span&gt;&lt;span style="color: #f66e7c;"&gt;l&lt;/span&gt;&lt;span style="color: #f97d88;"&gt;x&lt;/span&gt;&lt;span style="color: #fa8389;"&gt;s&lt;/span&gt;&lt;span style="color: #f3887e;"&gt;f&lt;/span&gt;&lt;span style="color: #b8775b;"&gt;o&lt;/span&gt;&lt;span style="color: #5e1608;"&gt;v&lt;/span&gt;&lt;span style="color: #d57859;"&gt;k&lt;/span&gt;&lt;span style="color: #e99f7c;"&gt;i&lt;/span&gt;&lt;span style="color: #e79b77;"&gt;j&lt;/span&gt;&lt;span style="color: #de8461;"&gt;r&lt;/span&gt;&lt;span style="color: #c87458;"&gt;n&lt;/span&gt;&lt;span style="color: #975835;"&gt;e&lt;/span&gt;&lt;span style="color: #9f4020;"&gt;n&lt;/span&gt;&lt;span style="color: #973d1a;"&gt;l&lt;/span&gt;&lt;span style="color: #993c1b;"&gt;r&lt;/span&gt;&lt;span style="color: #923412;"&gt;y&lt;/span&gt;&lt;span style="color: #8b2c0e;"&gt;a&lt;/span&gt;&lt;span style="color: #8c2f10;"&gt;q&lt;/span&gt;&lt;span style="color: #71200b;"&gt;c&lt;/span&gt;&lt;span style="color: #985230;"&gt;z&lt;/span&gt;&lt;span style="color: #86260d;"&gt;w&lt;/span&gt;&lt;span style="color: #a3451f;"&gt;w&lt;/span&gt;&lt;span style="color: #822c11;"&gt;s&lt;/span&gt;&lt;span style="color: #1c0b01;"&gt;b&lt;/span&gt;&lt;span style="color: #521709;"&gt;h&lt;/span&gt;&lt;span style="color: #782e11;"&gt;u&lt;/span&gt;&lt;span style="color: #691d06;"&gt;s&lt;/span&gt;&lt;span style="color: #631a07;"&gt;d&lt;/span&gt;&lt;span style="color: #661b08;"&gt;i&lt;/span&gt;&lt;span style="color: #71240a;"&gt;t&lt;/span&gt;&lt;span style="color: #6d210a;"&gt;w&lt;/span&gt;&lt;span style="color: #7b381d;"&gt;u&lt;/span&gt;&lt;span style="color: #855e37;"&gt;q&lt;/span&gt;&lt;span style="color: #a9885b;"&gt;p&lt;/span&gt;&lt;span style="color: #090400;"&gt;z&lt;/span&gt;&lt;span style="color: #250705;"&gt;f&lt;/span&gt;&lt;span style="color: #77452c;"&gt;l&lt;/span&gt;&lt;span style="color: #341d15;"&gt;k&lt;/span&gt;&lt;span style="color: #200f08;"&gt;n&lt;/span&gt;&lt;span style="color: #351e0e;"&gt;u&lt;/span&gt;&lt;span style="color: #49270c;"&gt;c&lt;/span&gt;&lt;span style="color: #f5d7b1;"&gt;b&lt;/span&gt;
&lt;span style="color: #fc919b;"&gt;z&lt;/span&gt;&lt;span style="color: #fd8f98;"&gt;q&lt;/span&gt;&lt;span style="color: #ec4c54;"&gt;n&lt;/span&gt;&lt;span style="color: #f76673;"&gt;q&lt;/span&gt;&lt;span style="color: #fa7787;"&gt;p&lt;/span&gt;&lt;span style="color: #fd8699;"&gt;n&lt;/span&gt;&lt;span style="color: #f66a77;"&gt;h&lt;/span&gt;&lt;span style="color: #f05e68;"&gt;r&lt;/span&gt;&lt;span style="color: #f66979;"&gt;n&lt;/span&gt;&lt;span style="color: #f9788a;"&gt;d&lt;/span&gt;&lt;span style="color: #fb8092;"&gt;o&lt;/span&gt;&lt;span style="color: #e95354;"&gt;f&lt;/span&gt;&lt;span style="color: #d13f32;"&gt;e&lt;/span&gt;&lt;span style="color: #601b0c;"&gt;w&lt;/span&gt;&lt;span style="color: #f4ab88;"&gt;a&lt;/span&gt;&lt;span style="color: #f0af89;"&gt;x&lt;/span&gt;&lt;span style="color: #eda984;"&gt;z&lt;/span&gt;&lt;span style="color: #de8b6b;"&gt;i&lt;/span&gt;&lt;span style="color: #c45b3b;"&gt;q&lt;/span&gt;&lt;span style="color: #ba522f;"&gt;w&lt;/span&gt;&lt;span style="color: #aa4a24;"&gt;d&lt;/span&gt;&lt;span style="color: #260500;"&gt;g&lt;/span&gt;&lt;span style="color: #6f371e;"&gt;l&lt;/span&gt;&lt;span style="color: #863e18;"&gt;d&lt;/span&gt;&lt;span style="color: #842f12;"&gt;m&lt;/span&gt;&lt;span style="color: #843517;"&gt;w&lt;/span&gt;&lt;span style="color: #825a37;"&gt;n&lt;/span&gt;&lt;span style="color: #9b3010;"&gt;a&lt;/span&gt;&lt;span style="color: #b24e2c;"&gt;r&lt;/span&gt;&lt;span style="color: #b54e2b;"&gt;q&lt;/span&gt;&lt;span style="color: #9e3d1c;"&gt;c&lt;/span&gt;&lt;span style="color: #400c00;"&gt;q&lt;/span&gt;&lt;span style="color: #601d0a;"&gt;h&lt;/span&gt;&lt;span style="color: #7c260d;"&gt;p&lt;/span&gt;&lt;span style="color: #7b2a0d;"&gt;g&lt;/span&gt;&lt;span style="color: #6e2009;"&gt;w&lt;/span&gt;&lt;span style="color: #661905;"&gt;c&lt;/span&gt;&lt;span style="color: #671c07;"&gt;n&lt;/span&gt;&lt;span style="color: #72220b;"&gt;o&lt;/span&gt;&lt;span style="color: #7f3414;"&gt;p&lt;/span&gt;&lt;span style="color: #bf9654;"&gt;q&lt;/span&gt;&lt;span style="color: #7f563a;"&gt;d&lt;/span&gt;&lt;span style="color: #150802;"&gt;v&lt;/span&gt;&lt;span style="color: #34180a;"&gt;u&lt;/span&gt;&lt;span style="color: #c19477;"&gt;z&lt;/span&gt;&lt;span style="color: #351a09;"&gt;v&lt;/span&gt;&lt;span style="color: #2e180b;"&gt;s&lt;/span&gt;&lt;span style="color: #8b5e41;"&gt;y&lt;/span&gt;&lt;span style="color: #815838;"&gt;e&lt;/span&gt;&lt;span style="color: #fedfc0;"&gt;i&lt;/span&gt;
&lt;span style="color: #fd8092;"&gt;u&lt;/span&gt;&lt;span style="color: #ed5459;"&gt;h&lt;/span&gt;&lt;span style="color: #ea4f57;"&gt;p&lt;/span&gt;&lt;span style="color: #f7707f;"&gt;g&lt;/span&gt;&lt;span style="color: #f76e7e;"&gt;k&lt;/span&gt;&lt;span style="color: #f9788a;"&gt;b&lt;/span&gt;&lt;span style="color: #f4626d;"&gt;c&lt;/span&gt;&lt;span style="color: #f15f6c;"&gt;y&lt;/span&gt;&lt;span style="color: #f46a79;"&gt;c&lt;/span&gt;&lt;span style="color: #f76a7b;"&gt;t&lt;/span&gt;&lt;span style="color: #fa798b;"&gt;p&lt;/span&gt;&lt;span style="color: #e74948;"&gt;e&lt;/span&gt;&lt;span style="color: #b31305;"&gt;j&lt;/span&gt;&lt;span style="color: #511108;"&gt;w&lt;/span&gt;&lt;span style="color: #f4ad8d;"&gt;t&lt;/span&gt;&lt;span style="color: #fabc97;"&gt;q&lt;/span&gt;&lt;span style="color: #f2ae8b;"&gt;t&lt;/span&gt;&lt;span style="color: #e4956e;"&gt;w&lt;/span&gt;&lt;span style="color: #c55c3f;"&gt;d&lt;/span&gt;&lt;span style="color: #c15b35;"&gt;h&lt;/span&gt;&lt;span style="color: #b04c2a;"&gt;l&lt;/span&gt;&lt;span style="color: #ac4a25;"&gt;t&lt;/span&gt;&lt;span style="color: #973313;"&gt;l&lt;/span&gt;&lt;span style="color: #8b290c;"&gt;g&lt;/span&gt;&lt;span style="color: #8e290d;"&gt;o&lt;/span&gt;&lt;span style="color: #923015;"&gt;k&lt;/span&gt;&lt;span style="color: #a64220;"&gt;c&lt;/span&gt;&lt;span style="color: #ae4726;"&gt;h&lt;/span&gt;&lt;span style="color: #b6492a;"&gt;j&lt;/span&gt;&lt;span style="color: #b34826;"&gt;g&lt;/span&gt;&lt;span style="color: #983013;"&gt;p&lt;/span&gt;&lt;span style="color: #6d1804;"&gt;e&lt;/span&gt;&lt;span style="color: #0d0000;"&gt;o&lt;/span&gt;&lt;span style="color: #72200a;"&gt;e&lt;/span&gt;&lt;span style="color: #751f08;"&gt;k&lt;/span&gt;&lt;span style="color: #7a2409;"&gt;y&lt;/span&gt;&lt;span style="color: #7b270d;"&gt;g&lt;/span&gt;&lt;span style="color: #7b230b;"&gt;n&lt;/span&gt;&lt;span style="color: #7b250e;"&gt;x&lt;/span&gt;&lt;span style="color: #a2613b;"&gt;j&lt;/span&gt;&lt;span style="color: #87522a;"&gt;g&lt;/span&gt;&lt;span style="color: #733409;"&gt;m&lt;/span&gt;&lt;span style="color: #59331e;"&gt;n&lt;/span&gt;&lt;span style="color: #603b21;"&gt;q&lt;/span&gt;&lt;span style="color: #895a40;"&gt;i&lt;/span&gt;&lt;span style="color: #cb9d7c;"&gt;h&lt;/span&gt;&lt;span style="color: #58351f;"&gt;g&lt;/span&gt;&lt;span style="color: #c79e7e;"&gt;b&lt;/span&gt;&lt;span style="color: #e8c6a3;"&gt;d&lt;/span&gt;&lt;span style="color: #f9e0c1;"&gt;k&lt;/span&gt;
&lt;span style="color: #f46372;"&gt;j&lt;/span&gt;&lt;span style="color: #e74246;"&gt;o&lt;/span&gt;&lt;span style="color: #ec4c54;"&gt;e&lt;/span&gt;&lt;span style="color: #f25a67;"&gt;v&lt;/span&gt;&lt;span style="color: #f46672;"&gt;v&lt;/span&gt;&lt;span style="color: #f66979;"&gt;t&lt;/span&gt;&lt;span style="color: #ed5760;"&gt;f&lt;/span&gt;&lt;span style="color: #f5656f;"&gt;x&lt;/span&gt;&lt;span style="color: #f66574;"&gt;a&lt;/span&gt;&lt;span style="color: #f66878;"&gt;p&lt;/span&gt;&lt;span style="color: #fa7384;"&gt;e&lt;/span&gt;&lt;span style="color: #e43e3e;"&gt;p&lt;/span&gt;&lt;span style="color: #b91307;"&gt;t&lt;/span&gt;&lt;span style="color: #540b02;"&gt;s&lt;/span&gt;&lt;span style="color: #f4b491;"&gt;u&lt;/span&gt;&lt;span style="color: #faba97;"&gt;d&lt;/span&gt;&lt;span style="color: #e79774;"&gt;r&lt;/span&gt;&lt;span style="color: #d98762;"&gt;b&lt;/span&gt;&lt;span style="color: #ce704a;"&gt;q&lt;/span&gt;&lt;span style="color: #c45b3d;"&gt;o&lt;/span&gt;&lt;span style="color: #b54e2d;"&gt;k&lt;/span&gt;&lt;span style="color: #aa421f;"&gt;x&lt;/span&gt;&lt;span style="color: #a23b18;"&gt;a&lt;/span&gt;&lt;span style="color: #a23a17;"&gt;y&lt;/span&gt;&lt;span style="color: #9f3414;"&gt;o&lt;/span&gt;&lt;span style="color: #b45030;"&gt;j&lt;/span&gt;&lt;span style="color: #ba5131;"&gt;f&lt;/span&gt;&lt;span style="color: #b44824;"&gt;v&lt;/span&gt;&lt;span style="color: #b3472a;"&gt;l&lt;/span&gt;&lt;span style="color: #b24526;"&gt;j&lt;/span&gt;&lt;span style="color: #a63d20;"&gt;f&lt;/span&gt;&lt;span style="color: #852308;"&gt;v&lt;/span&gt;&lt;span style="color: #721907;"&gt;y&lt;/span&gt;&lt;span style="color: #711d05;"&gt;k&lt;/span&gt;&lt;span style="color: #632115;"&gt;q&lt;/span&gt;&lt;span style="color: #130400;"&gt;t&lt;/span&gt;&lt;span style="color: #5c3d28;"&gt;d&lt;/span&gt;&lt;span style="color: #7b4930;"&gt;w&lt;/span&gt;&lt;span style="color: #6b3d23;"&gt;r&lt;/span&gt;&lt;span style="color: #130900;"&gt;d&lt;/span&gt;&lt;span style="color: #9a5a37;"&gt;l&lt;/span&gt;&lt;span style="color: #915a3b;"&gt;v&lt;/span&gt;&lt;span style="color: #764a2f;"&gt;t&lt;/span&gt;&lt;span style="color: #61351c;"&gt;f&lt;/span&gt;&lt;span style="color: #af7e5d;"&gt;n&lt;/span&gt;&lt;span style="color: #efd0b3;"&gt;n&lt;/span&gt;&lt;span style="color: #d9ad94;"&gt;j&lt;/span&gt;&lt;span style="color: #dfb891;"&gt;e&lt;/span&gt;&lt;span style="color: #ffe8c9;"&gt;p&lt;/span&gt;&lt;span style="color: #fee9cc;"&gt;a&lt;/span&gt;
&lt;span style="color: #c44536;"&gt;t&lt;/span&gt;&lt;span style="color: #df3737;"&gt;z&lt;/span&gt;&lt;span style="color: #e84548;"&gt;x&lt;/span&gt;&lt;span style="color: #ed535b;"&gt;u&lt;/span&gt;&lt;span style="color: #f2626c;"&gt;y&lt;/span&gt;&lt;span style="color: #ed535d;"&gt;m&lt;/span&gt;&lt;span style="color: #e94c53;"&gt;d&lt;/span&gt;&lt;span style="color: #ee5760;"&gt;e&lt;/span&gt;&lt;span style="color: #ef5861;"&gt;h&lt;/span&gt;&lt;span style="color: #f56473;"&gt;p&lt;/span&gt;&lt;span style="color: #f77283;"&gt;n&lt;/span&gt;&lt;span style="color: #e03c3b;"&gt;n&lt;/span&gt;&lt;span style="color: #d83b32;"&gt;l&lt;/span&gt;&lt;span style="color: #87190c;"&gt;m&lt;/span&gt;&lt;span style="color: #f4b290;"&gt;x&lt;/span&gt;&lt;span style="color: #efa383;"&gt;b&lt;/span&gt;&lt;span style="color: #dc8863;"&gt;g&lt;/span&gt;&lt;span style="color: #cf815b;"&gt;b&lt;/span&gt;&lt;span style="color: #c96a4a;"&gt;y&lt;/span&gt;&lt;span style="color: #c2603b;"&gt;x&lt;/span&gt;&lt;span style="color: #b44b2b;"&gt;e&lt;/span&gt;&lt;span style="color: #a53a18;"&gt;j&lt;/span&gt;&lt;span style="color: #a13417;"&gt;t&lt;/span&gt;&lt;span style="color: #96280d;"&gt;y&lt;/span&gt;&lt;span style="color: #a94626;"&gt;p&lt;/span&gt;&lt;span style="color: #ab3f1b;"&gt;h&lt;/span&gt;&lt;span style="color: #af4024;"&gt;m&lt;/span&gt;&lt;span style="color: #c45738;"&gt;y&lt;/span&gt;&lt;span style="color: #be5132;"&gt;m&lt;/span&gt;&lt;span style="color: #b74f32;"&gt;b&lt;/span&gt;&lt;span style="color: #a73b1f;"&gt;y&lt;/span&gt;&lt;span style="color: #8c260d;"&gt;f&lt;/span&gt;&lt;span style="color: #83230b;"&gt;b&lt;/span&gt;&lt;span style="color: #791d04;"&gt;w&lt;/span&gt;&lt;span style="color: #81260b;"&gt;a&lt;/span&gt;&lt;span style="color: #85270d;"&gt;z&lt;/span&gt;&lt;span style="color: #8c2d0f;"&gt;j&lt;/span&gt;&lt;span style="color: #892b0f;"&gt;e&lt;/span&gt;&lt;span style="color: #88290d;"&gt;e&lt;/span&gt;&lt;span style="color: #85270d;"&gt;q&lt;/span&gt;&lt;span style="color: #a96236;"&gt;t&lt;/span&gt;&lt;span style="color: #bd8e72;"&gt;r&lt;/span&gt;&lt;span style="color: #825131;"&gt;e&lt;/span&gt;&lt;span style="color: #975e40;"&gt;e&lt;/span&gt;&lt;span style="color: #f3d5b1;"&gt;d&lt;/span&gt;&lt;span style="color: #fbddbb;"&gt;c&lt;/span&gt;&lt;span style="color: #cca17f;"&gt;g&lt;/span&gt;&lt;span style="color: #e5c29c;"&gt;j&lt;/span&gt;&lt;span style="color: #fee7c8;"&gt;d&lt;/span&gt;&lt;span style="color: #fee9ca;"&gt;e&lt;/span&gt;
&lt;span style="color: #a93420;"&gt;h&lt;/span&gt;&lt;span style="color: #db3330;"&gt;i&lt;/span&gt;&lt;span style="color: #e23d43;"&gt;o&lt;/span&gt;&lt;span style="color: #e63f46;"&gt;b&lt;/span&gt;&lt;span style="color: #f35866;"&gt;h&lt;/span&gt;&lt;span style="color: #d82d26;"&gt;d&lt;/span&gt;&lt;span style="color: #e23839;"&gt;i&lt;/span&gt;&lt;span style="color: #e23c3e;"&gt;t&lt;/span&gt;&lt;span style="color: #e9454c;"&gt;b&lt;/span&gt;&lt;span style="color: #ee525f;"&gt;v&lt;/span&gt;&lt;span style="color: #f96c7d;"&gt;u&lt;/span&gt;&lt;span style="color: #e33e42;"&gt;a&lt;/span&gt;&lt;span style="color: #db2f2f;"&gt;b&lt;/span&gt;&lt;span style="color: #a72412;"&gt;v&lt;/span&gt;&lt;span style="color: #f0ac89;"&gt;x&lt;/span&gt;&lt;span style="color: #d8805c;"&gt;b&lt;/span&gt;&lt;span style="color: #d47756;"&gt;v&lt;/span&gt;&lt;span style="color: #c56f4c;"&gt;g&lt;/span&gt;&lt;span style="color: #be6344;"&gt;f&lt;/span&gt;&lt;span style="color: #b45131;"&gt;z&lt;/span&gt;&lt;span style="color: #a53e1f;"&gt;x&lt;/span&gt;&lt;span style="color: #852109;"&gt;z&lt;/span&gt;&lt;span style="color: #993515;"&gt;r&lt;/span&gt;&lt;span style="color: #a73b21;"&gt;b&lt;/span&gt;&lt;span style="color: #cf6849;"&gt;e&lt;/span&gt;&lt;span style="color: #b74a2d;"&gt;v&lt;/span&gt;&lt;span style="color: #af411e;"&gt;e&lt;/span&gt;&lt;span style="color: #c05535;"&gt;k&lt;/span&gt;&lt;span style="color: #c0603a;"&gt;f&lt;/span&gt;&lt;span style="color: #b44b2b;"&gt;i&lt;/span&gt;&lt;span style="color: #aa4225;"&gt;p&lt;/span&gt;&lt;span style="color: #922e14;"&gt;m&lt;/span&gt;&lt;span style="color: #86280f;"&gt;r&lt;/span&gt;&lt;span style="color: #731b05;"&gt;d&lt;/span&gt;&lt;span style="color: #8f3014;"&gt;o&lt;/span&gt;&lt;span style="color: #9a3717;"&gt;y&lt;/span&gt;&lt;span style="color: #9c3919;"&gt;h&lt;/span&gt;&lt;span style="color: #9d3917;"&gt;w&lt;/span&gt;&lt;span style="color: #9a3517;"&gt;r&lt;/span&gt;&lt;span style="color: #9b3c1c;"&gt;j&lt;/span&gt;&lt;span style="color: #b87145;"&gt;s&lt;/span&gt;&lt;span style="color: #956342;"&gt;m&lt;/span&gt;&lt;span style="color: #aa7354;"&gt;j&lt;/span&gt;&lt;span style="color: #f8d8b2;"&gt;t&lt;/span&gt;&lt;span style="color: #fcdebc;"&gt;h&lt;/span&gt;&lt;span style="color: #f2d0ab;"&gt;h&lt;/span&gt;&lt;span style="color: #fcdab5;"&gt;u&lt;/span&gt;&lt;span style="color: #fce2bf;"&gt;d&lt;/span&gt;&lt;span style="color: #fee6c2;"&gt;n&lt;/span&gt;&lt;span style="color: #ffe9c4;"&gt;a&lt;/span&gt;
&lt;span style="color: #9f2c11;"&gt;c&lt;/span&gt;&lt;span style="color: #b61e11;"&gt;k&lt;/span&gt;&lt;span style="color: #e23838;"&gt;z&lt;/span&gt;&lt;span style="color: #ec4f56;"&gt;t&lt;/span&gt;&lt;span style="color: #d52726;"&gt;m&lt;/span&gt;&lt;span style="color: #bb0d04;"&gt;d&lt;/span&gt;&lt;span style="color: #cd180d;"&gt;o&lt;/span&gt;&lt;span style="color: #d01b14;"&gt;q&lt;/span&gt;&lt;span style="color: #d71f1d;"&gt;o&lt;/span&gt;&lt;span style="color: #ee4e5a;"&gt;t&lt;/span&gt;&lt;span style="color: #f05c6a;"&gt;z&lt;/span&gt;&lt;span style="color: #eb5159;"&gt;d&lt;/span&gt;&lt;span style="color: #be0d05;"&gt;g&lt;/span&gt;&lt;span style="color: #912211;"&gt;q&lt;/span&gt;&lt;span style="color: #e69c79;"&gt;h&lt;/span&gt;&lt;span style="color: #d37e59;"&gt;u&lt;/span&gt;&lt;span style="color: #d87e5b;"&gt;p&lt;/span&gt;&lt;span style="color: #cc7250;"&gt;o&lt;/span&gt;&lt;span style="color: #b14d2b;"&gt;r&lt;/span&gt;&lt;span style="color: #7d2108;"&gt;g&lt;/span&gt;&lt;span style="color: #8d3716;"&gt;x&lt;/span&gt;&lt;span style="color: #b25131;"&gt;j&lt;/span&gt;&lt;span style="color: #b34a2c;"&gt;s&lt;/span&gt;&lt;span style="color: #a4381b;"&gt;h&lt;/span&gt;&lt;span style="color: #ce7553;"&gt;d&lt;/span&gt;&lt;span style="color: #c66240;"&gt;a&lt;/span&gt;&lt;span style="color: #c25737;"&gt;o&lt;/span&gt;&lt;span style="color: #c56441;"&gt;x&lt;/span&gt;&lt;span style="color: #c15d3b;"&gt;e&lt;/span&gt;&lt;span style="color: #b24725;"&gt;c&lt;/span&gt;&lt;span style="color: #aa4322;"&gt;y&lt;/span&gt;&lt;span style="color: #933212;"&gt;g&lt;/span&gt;&lt;span style="color: #9b3214;"&gt;m&lt;/span&gt;&lt;span style="color: #601301;"&gt;x&lt;/span&gt;&lt;span style="color: #741d09;"&gt;a&lt;/span&gt;&lt;span style="color: #912c0e;"&gt;y&lt;/span&gt;&lt;span style="color: #a54121;"&gt;b&lt;/span&gt;&lt;span style="color: #9d3919;"&gt;p&lt;/span&gt;&lt;span style="color: #9a3717;"&gt;p&lt;/span&gt;&lt;span style="color: #9a3c1a;"&gt;p&lt;/span&gt;&lt;span style="color: #af6b46;"&gt;j&lt;/span&gt;&lt;span style="color: #542b15;"&gt;o&lt;/span&gt;&lt;span style="color: #edcaa4;"&gt;t&lt;/span&gt;&lt;span style="color: #ffe7c5;"&gt;q&lt;/span&gt;&lt;span style="color: #fde3c0;"&gt;e&lt;/span&gt;&lt;span style="color: #fce2bf;"&gt;a&lt;/span&gt;&lt;span style="color: #ffe9c4;"&gt;k&lt;/span&gt;&lt;span style="color: #ffe7c5;"&gt;t&lt;/span&gt;&lt;span style="color: #fee6c0;"&gt;p&lt;/span&gt;&lt;span style="color: #fee7c5;"&gt;c&lt;/span&gt;
&lt;span style="color: #9e200a;"&gt;a&lt;/span&gt;&lt;span style="color: #d22119;"&gt;n&lt;/span&gt;&lt;span style="color: #de3434;"&gt;l&lt;/span&gt;&lt;span style="color: #ea4a52;"&gt;t&lt;/span&gt;&lt;span style="color: #ba0c05;"&gt;v&lt;/span&gt;&lt;span style="color: #b90c05;"&gt;o&lt;/span&gt;&lt;span style="color: #c40f06;"&gt;u&lt;/span&gt;&lt;span style="color: #c70f05;"&gt;k&lt;/span&gt;&lt;span style="color: #cf120c;"&gt;m&lt;/span&gt;&lt;span style="color: #eb4e59;"&gt;y&lt;/span&gt;&lt;span style="color: #f05864;"&gt;m&lt;/span&gt;&lt;span style="color: #f15965;"&gt;k&lt;/span&gt;&lt;span style="color: #cb0f06;"&gt;f&lt;/span&gt;&lt;span style="color: #902211;"&gt;y&lt;/span&gt;&lt;span style="color: #e08c6a;"&gt;i&lt;/span&gt;&lt;span style="color: #d77f5b;"&gt;g&lt;/span&gt;&lt;span style="color: #d17755;"&gt;x&lt;/span&gt;&lt;span style="color: #b04928;"&gt;j&lt;/span&gt;&lt;span style="color: #671c05;"&gt;w&lt;/span&gt;&lt;span style="color: #88371a;"&gt;m&lt;/span&gt;&lt;span style="color: #843316;"&gt;z&lt;/span&gt;&lt;span style="color: #9f4427;"&gt;f&lt;/span&gt;&lt;span style="color: #993e21;"&gt;b&lt;/span&gt;&lt;span style="color: #a24325;"&gt;t&lt;/span&gt;&lt;span style="color: #973415;"&gt;v&lt;/span&gt;&lt;span style="color: #7e1f0b;"&gt;g&lt;/span&gt;&lt;span style="color: #ca7151;"&gt;u&lt;/span&gt;&lt;span style="color: #d78560;"&gt;g&lt;/span&gt;&lt;span style="color: #bd5532;"&gt;a&lt;/span&gt;&lt;span style="color: #a9421f;"&gt;j&lt;/span&gt;&lt;span style="color: #9a3614;"&gt;i&lt;/span&gt;&lt;span style="color: #a7522d;"&gt;a&lt;/span&gt;&lt;span style="color: #9e3a1a;"&gt;x&lt;/span&gt;&lt;span style="color: #701705;"&gt;u&lt;/span&gt;&lt;span style="color: #6a1904;"&gt;u&lt;/span&gt;&lt;span style="color: #8e2f11;"&gt;s&lt;/span&gt;&lt;span style="color: #9c3818;"&gt;j&lt;/span&gt;&lt;span style="color: #953213;"&gt;p&lt;/span&gt;&lt;span style="color: #8e2f0f;"&gt;d&lt;/span&gt;&lt;span style="color: #933e19;"&gt;v&lt;/span&gt;&lt;span style="color: #653618;"&gt;o&lt;/span&gt;&lt;span style="color: #b0855a;"&gt;p&lt;/span&gt;&lt;span style="color: #fee1c1;"&gt;g&lt;/span&gt;&lt;span style="color: #ffe8c6;"&gt;t&lt;/span&gt;&lt;span style="color: #ffe8c6;"&gt;o&lt;/span&gt;&lt;span style="color: #ffe8c8;"&gt;o&lt;/span&gt;&lt;span style="color: #ffe9ca;"&gt;a&lt;/span&gt;&lt;span style="color: #ffe8c8;"&gt;m&lt;/span&gt;&lt;span style="color: #ffe8c6;"&gt;y&lt;/span&gt;&lt;span style="color: #fee7c5;"&gt;w&lt;/span&gt;
&lt;span style="color: #dc302c;"&gt;z&lt;/span&gt;&lt;span style="color: #d12018;"&gt;x&lt;/span&gt;&lt;span style="color: #e03432;"&gt;b&lt;/span&gt;&lt;span style="color: #df3536;"&gt;a&lt;/span&gt;&lt;span style="color: #b30703;"&gt;q&lt;/span&gt;&lt;span style="color: #b80d05;"&gt;x&lt;/span&gt;&lt;span style="color: #c00e04;"&gt;g&lt;/span&gt;&lt;span style="color: #c60e04;"&gt;k&lt;/span&gt;&lt;span style="color: #e83e47;"&gt;d&lt;/span&gt;&lt;span style="color: #e73e45;"&gt;g&lt;/span&gt;&lt;span style="color: #e94c55;"&gt;u&lt;/span&gt;&lt;span style="color: #f05a66;"&gt;l&lt;/span&gt;&lt;span style="color: #d31c18;"&gt;h&lt;/span&gt;&lt;span style="color: #c42924;"&gt;s&lt;/span&gt;&lt;span style="color: #de785f;"&gt;f&lt;/span&gt;&lt;span style="color: #d5805b;"&gt;b&lt;/span&gt;&lt;span style="color: #cd704e;"&gt;l&lt;/span&gt;&lt;span style="color: #a13616;"&gt;o&lt;/span&gt;&lt;span style="color: #9f4a2b;"&gt;q&lt;/span&gt;&lt;span style="color: #873414;"&gt;o&lt;/span&gt;&lt;span style="color: #ad5338;"&gt;k&lt;/span&gt;&lt;span style="color: #c1684a;"&gt;e&lt;/span&gt;&lt;span style="color: #b25438;"&gt;e&lt;/span&gt;&lt;span style="color: #711b02;"&gt;r&lt;/span&gt;&lt;span style="color: #8a321a;"&gt;y&lt;/span&gt;&lt;span style="color: #833010;"&gt;t&lt;/span&gt;&lt;span style="color: #78280d;"&gt;f&lt;/span&gt;&lt;span style="color: #7d290f;"&gt;y&lt;/span&gt;&lt;span style="color: #b75234;"&gt;f&lt;/span&gt;&lt;span style="color: #9a3717;"&gt;d&lt;/span&gt;&lt;span style="color: #7f250b;"&gt;v&lt;/span&gt;&lt;span style="color: #4c0a00;"&gt;e&lt;/span&gt;&lt;span style="color: #882e14;"&gt;b&lt;/span&gt;&lt;span style="color: #661303;"&gt;w&lt;/span&gt;&lt;span style="color: #651806;"&gt;e&lt;/span&gt;&lt;span style="color: #6f1e09;"&gt;s&lt;/span&gt;&lt;span style="color: #8c2d11;"&gt;t&lt;/span&gt;&lt;span style="color: #87290f;"&gt;k&lt;/span&gt;&lt;span style="color: #863315;"&gt;d&lt;/span&gt;&lt;span style="color: #8f3d18;"&gt;x&lt;/span&gt;&lt;span style="color: #261003;"&gt;r&lt;/span&gt;&lt;span style="color: #f4cbab;"&gt;y&lt;/span&gt;&lt;span style="color: #fde2c4;"&gt;i&lt;/span&gt;&lt;span style="color: #ffe8c8;"&gt;y&lt;/span&gt;&lt;span style="color: #ffe8c8;"&gt;q&lt;/span&gt;&lt;span style="color: #ffe9ca;"&gt;o&lt;/span&gt;&lt;span style="color: #ffe8c9;"&gt;z&lt;/span&gt;&lt;span style="color: #ffe9ca;"&gt;b&lt;/span&gt;&lt;span style="color: #ffe8c8;"&gt;d&lt;/span&gt;&lt;span style="color: #fee6c4;"&gt;q&lt;/span&gt;
&lt;span style="color: #dc302c;"&gt;p&lt;/span&gt;&lt;span style="color: #cf1e16;"&gt;o&lt;/span&gt;&lt;span style="color: #df3130;"&gt;v&lt;/span&gt;&lt;span style="color: #d5231f;"&gt;u&lt;/span&gt;&lt;span style="color: #b10803;"&gt;f&lt;/span&gt;&lt;span style="color: #b60b03;"&gt;t&lt;/span&gt;&lt;span style="color: #c20d04;"&gt;n&lt;/span&gt;&lt;span style="color: #db2929;"&gt;k&lt;/span&gt;&lt;span style="color: #e03233;"&gt;s&lt;/span&gt;&lt;span style="color: #e53f43;"&gt;s&lt;/span&gt;&lt;span style="color: #ed4952;"&gt;o&lt;/span&gt;&lt;span style="color: #f05864;"&gt;n&lt;/span&gt;&lt;span style="color: #db2d2e;"&gt;w&lt;/span&gt;&lt;span style="color: #d42d27;"&gt;q&lt;/span&gt;&lt;span style="color: #c53d2d;"&gt;k&lt;/span&gt;&lt;span style="color: #d47a57;"&gt;b&lt;/span&gt;&lt;span style="color: #c76a48;"&gt;j&lt;/span&gt;&lt;span style="color: #b34f2b;"&gt;e&lt;/span&gt;&lt;span style="color: #ac4f2d;"&gt;m&lt;/span&gt;&lt;span style="color: #8f2c0d;"&gt;n&lt;/span&gt;&lt;span style="color: #953715;"&gt;b&lt;/span&gt;&lt;span style="color: #b24e37;"&gt;d&lt;/span&gt;&lt;span style="color: #cc765b;"&gt;l&lt;/span&gt;&lt;span style="color: #bc5a3f;"&gt;k&lt;/span&gt;&lt;span style="color: #aa4527;"&gt;b&lt;/span&gt;&lt;span style="color: #943716;"&gt;b&lt;/span&gt;&lt;span style="color: #842e0d;"&gt;z&lt;/span&gt;&lt;span style="color: #691803;"&gt;b&lt;/span&gt;&lt;span style="color: #741d09;"&gt;d&lt;/span&gt;&lt;span style="color: #621908;"&gt;d&lt;/span&gt;&lt;span style="color: #541202;"&gt;s&lt;/span&gt;&lt;span style="color: #480e02;"&gt;s&lt;/span&gt;&lt;span style="color: #501006;"&gt;r&lt;/span&gt;&lt;span style="color: #5f1a0b;"&gt;n&lt;/span&gt;&lt;span style="color: #561408;"&gt;m&lt;/span&gt;&lt;span style="color: #451308;"&gt;w&lt;/span&gt;&lt;span style="color: #82240b;"&gt;g&lt;/span&gt;&lt;span style="color: #7c240c;"&gt;z&lt;/span&gt;&lt;span style="color: #7c2d0e;"&gt;h&lt;/span&gt;&lt;span style="color: #2f1200;"&gt;z&lt;/span&gt;&lt;span style="color: #c08b69;"&gt;s&lt;/span&gt;&lt;span style="color: #ca9a76;"&gt;w&lt;/span&gt;&lt;span style="color: #fde0c2;"&gt;n&lt;/span&gt;&lt;span style="color: #ffe8c9;"&gt;p&lt;/span&gt;&lt;span style="color: #ffe8c9;"&gt;n&lt;/span&gt;&lt;span style="color: #fee7c7;"&gt;x&lt;/span&gt;&lt;span style="color: #ffe5c4;"&gt;q&lt;/span&gt;&lt;span style="color: #ffe5c4;"&gt;w&lt;/span&gt;&lt;span style="color: #fee4c3;"&gt;b&lt;/span&gt;&lt;span style="color: #fee1bf;"&gt;c&lt;/span&gt;
&lt;span style="color: #dd3431;"&gt;j&lt;/span&gt;&lt;span style="color: #cb1b0e;"&gt;d&lt;/span&gt;&lt;span style="color: #dd302c;"&gt;g&lt;/span&gt;&lt;span style="color: #d11c13;"&gt;v&lt;/span&gt;&lt;span style="color: #b00702;"&gt;o&lt;/span&gt;&lt;span style="color: #b40c03;"&gt;i&lt;/span&gt;&lt;span style="color: #d82520;"&gt;w&lt;/span&gt;&lt;span style="color: #ef5763;"&gt;n&lt;/span&gt;&lt;span style="color: #c80c01;"&gt;k&lt;/span&gt;&lt;span style="color: #e33e44;"&gt;a&lt;/span&gt;&lt;span style="color: #ea464d;"&gt;q&lt;/span&gt;&lt;span style="color: #ee5662;"&gt;c&lt;/span&gt;&lt;span style="color: #e54046;"&gt;s&lt;/span&gt;&lt;span style="color: #d51d1d;"&gt;h&lt;/span&gt;&lt;span style="color: #d31e17;"&gt;p&lt;/span&gt;&lt;span style="color: #d87556;"&gt;f&lt;/span&gt;&lt;span style="color: #ca7149;"&gt;e&lt;/span&gt;&lt;span style="color: #cc724d;"&gt;w&lt;/span&gt;&lt;span style="color: #a94b29;"&gt;f&lt;/span&gt;&lt;span style="color: #ba5636;"&gt;m&lt;/span&gt;&lt;span style="color: #a53a16;"&gt;v&lt;/span&gt;&lt;span style="color: #bf5b41;"&gt;y&lt;/span&gt;&lt;span style="color: #a32914;"&gt;i&lt;/span&gt;&lt;span style="color: #99200f;"&gt;i&lt;/span&gt;&lt;span style="color: #942a1a;"&gt;n&lt;/span&gt;&lt;span style="color: #9d2b13;"&gt;w&lt;/span&gt;&lt;span style="color: #a03115;"&gt;g&lt;/span&gt;&lt;span style="color: #993012;"&gt;d&lt;/span&gt;&lt;span style="color: #8c230d;"&gt;s&lt;/span&gt;&lt;span style="color: #8c2810;"&gt;i&lt;/span&gt;&lt;span style="color: #81230a;"&gt;g&lt;/span&gt;&lt;span style="color: #6e1c07;"
