<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-8459683134438933251</atom:id><lastBuildDate>Mon, 26 Sep 2011 11:36:39 +0000</lastBuildDate><title>Adventures of Aladdin</title><description /><link>http://aladdin-nest.blogspot.com/</link><managingEditor>noreply@blogger.com (aladdin)</managingEditor><generator>Blogger</generator><openSearch:totalResults>15</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/aladdin-nest" /><feedburner:info uri="aladdin-nest" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8459683134438933251.post-8906142471992774234</guid><pubDate>Wed, 31 Aug 2011 17:21:00 +0000</pubDate><atom:updated>2011-09-01T12:21:52.976+08:00</atom:updated><title>一份重要簡報的導覽</title><description>&lt;p&gt;老實說，自從一個規模頗大的官網從手中溜走之後，我很久沒有關心 css 相關的議題了。以前累積下來的CSS知識，這兩三年也讓我輕鬆砍了不少規模中等的網站。但這次，為了處理一個規模相當大的官網切版工作，再加上non-table layout + IE 6 compatible 的要求，我又回來跟CSS裝熟了。&lt;/p&gt;&lt;p&gt;但比較大的問題是：1)設計不是我這邊出的，只能被動收件，而且切第一個版的時候，後面的設計還有一半以上沒出來，2)我以前從來不在乎non-table，最大的擋箭牌就是IE 6。但當客戶舉了業界第一品牌的網站給我看後（馬的，他們的設計比我們簡單一百倍好嗎？）硬著頭皮，只好再度表演特技了。&lt;/p&gt;&lt;p&gt;這三年關於refactor的心得，讓我深信：「do it right once and refactor forever」是千年不變的真理（好拉，其實我也不相信這鬼話），但當我重複在類似的html架構下，寫下近乎完全相同的「border : 1px solid…」時，我就知道事情大條了：CSS中，code duplication的情況太嚴重了，而且，我的refactor沒有unit test做保證。好，那就只能第一次就搞定，不能再想refactor了。因此，我光首頁就重做了三次，第一個內頁就重做了兩次。兩頁花了我一整個星期（一整個星期？C#和AS早就不知道寫到哪了！），還因此每天被人照三餐問候進度….唉…&lt;/p&gt;&lt;p&gt;問題的根源在哪？高中時，跟王浩洋玩prolog的時候，就得到的經驗是： pattern matching rule set 的finite state system，都有難以人工debug的問題，也就無法開發系統(當然，prolog是認為：這個debug的事情，可以由prolog寫成的自動debug系統來做，請各位大笑三聲)。以前我就隱隱覺得CSS selector是個爛東西，但以為是selector跟FP（Functional Programming）比較像的原因；但這次的經驗，讓我確認selector是個更糟糕的東西：他就是pattern matching rule set，而且rule的priority還爛得可怕（specificity和什麼鬼!important）。但，當然也有另一個可能，就是阿拉丁是個爛咖，連html+CSS也寫不好！&lt;/p&gt;&lt;p&gt;前幾天，從&lt;a href="http://minipai.tw/post/64" target="_blank"&gt;http://minipai.tw/post/64&lt;/a&gt;看到了&lt;a href="http://www.slideshare.net/stubbornella/our-best-practices-are-killing-us" target="_blank"&gt;http://www.slideshare.net/stubbornella/our-best-practices-are-killing-us&lt;/a&gt;這份簡報，讓我確定：我不是爛咖，因為每個人都有這樣的困擾。因為有人說看不懂這份簡報，所以，我決定對這份簡報做個小小的導覽：&lt;/p&gt;&lt;p&gt;--------這是分隔線，以下請配合簡報服用---&lt;/p&gt;&lt;p&gt;簡報一開始到21頁，檢查了許多知名網站的CSS，如facebook等。用數字告訴我們，CSS 的duplication在這些網站中，不停的發生。也就是，這並不是誰的問題，而是我們所有人的問題。&lt;/p&gt;&lt;p&gt;接下來，他用幾頁說明他的觀點：CSS（就像 Javascript一樣）並不糟，問題在於我們用錯工具（好吧，看到第五遍，我承認我有被說服到，但支撐front-end的兩大支柱都被人說爛？恩…）&lt;/p&gt;&lt;p&gt;然後，作者列舉了三個值得討論的best practice，並認為這三個迷思讓大家產生今天的問題：Don’t add any extra elements (不增加額外的tag)，Don’t add classes (不要用class)，Use descendent selectors exclusively (僅靠單純的tag疊加選擇子達成)。但這三個best practice，導致了specificity快速增加的問題。Specificity是CSS計算rule使用優先順序的規則，meyer 的書解釋得很清楚，又有中文版，大家可以去看一下。&lt;/p&gt;&lt;p&gt;接下來就是一串舉例，告訴我們各種情況下，specificity怎麼快速增加。那個 sidebar的例子，相信做過大官網切版的人，都會感同身受。最後，這樣寫css的方式，會讓我們只能靠firebug或其他類似工具才能確認我們的css code是否正確。&lt;/p&gt;&lt;p&gt;而且，更可怕的，specificity會因為官網上線後增加功能而繼續往上疊加。有些人認為!important會解決這樣的問題，但不！!important會帶來更多的問題。92頁告訴你這個極致會是怎麼樣糟糕的狀況。&lt;/p&gt;&lt;p&gt;之前都是處理selector，94頁開始看style的內容。這邊舉了一個例子稍微值得解釋一下。前面的#sidebar h3憑空出現，讓整個style都做了新的設定。但#sidebar .collaborators h3的內容，其實跟最原始的h3相同。但在css中，我們只能把h3的定義整個拉到#sidebar .collaborators h3再放一次，因為在css中，我們沒有辦法「中和」#sidebar h3產生的影響。這是為什麼簡報一開始，在這些大網站上，你會看到這麼多重複宣告的原因。&lt;/p&gt;&lt;p&gt;怎麼解決？98頁提了幾個思考點：Add non-semantic elements judiciously (慎重考慮加上非語意的tag，比如div)， Keep specificity as low as possible（保持specificity盡量低），Abstract repeating visual patterns (把重複的視覺架構萃取出來)，Use specificity to define your architecture (定html架構的時候，要把specificity考慮進去)。&lt;/p&gt;&lt;p&gt;後面舉了facebook的media block為例，說明設計時的條件，和對應的作法。（Facebook我沒那麼熟，不過過一陣子會有案子發生，到時來檢查這個例子）。&lt;/p&gt;&lt;p&gt;109頁，舉了兩個最近不停在我眼前出現的字眼：Sass和Less。簡單講，由於CSS的破爛設計，css duplication是會大量發生的。但如果我們有另外一個語言，本身是dry的，可以產生我們要的破爛CSS。那讓程式去產生破爛CSS，我們人只要維護這個語言寫成的碼就可以了；Sass和Less就是這樣的語言。看起來，Sass已經是大部分web developer的首選了。最近試用了一下Sass，暫時無法評論，得等下次有大案子再說了。&lt;/p&gt;&lt;p&gt;-------------這是分隔線，導覽到此結束，以下是碎碎念&lt;/p&gt;&lt;p&gt;希望這樣的導覽對大家有幫助。最後要協同報告的是：Javascript也很爛，而且也是爛到爆；所以同樣的工作也有人做在javascript身上，就是大家最近常聽到的coffeescript。這一次的CSS探險，讓我確定了一個很重要的事情：不管HTML 5再棒，有Javascript和CSS護身，還有死不知恥的W3C consortium不清楚現實開發狀況，Flash 安啦！&lt;/p&gt;&lt;p&gt;還有一點補充，grid system 960的作者，在&lt;a href="http://www.slideshare.net/nathansmith/refresh-okc"&gt;http://www.slideshare.net/nathansmith/refresh-okc&lt;/a&gt;這份簡報的第50, 51頁，也回應了nicole的觀點。請大家自行參照...&lt;/p&gt;還有，我這次很幸運的完全不知道這三個迷思。所以，我對於該加的div絕不手軟，該用的class絕不少用。雖然還是很多的code duplication，但是最近做了一兩個重要的refactor，都很順利。不過，根本解決之道，應該還是使用Sass或Less這樣的工具。但對於一般的designer來說該怎麼辦？我還真不知道。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8459683134438933251-8906142471992774234?l=aladdin-nest.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/aladdin-nest/~3/LVOx4uRKLyk/blog-post.html</link><author>noreply@blogger.com (aladdin)</author><thr:total>0</thr:total><feedburner:origLink>http://aladdin-nest.blogspot.com/2011/09/blog-post.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8459683134438933251.post-1086193259802237611</guid><pubDate>Wed, 22 Jun 2011 08:11:00 +0000</pubDate><atom:updated>2011-06-22T16:23:28.875+08:00</atom:updated><title>關於設計給製作的.psd 檔案該有的規矩（用在.ai也通）</title><description>&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;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;------這一條叫做分隔線------&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Photoshop的檔案分層說明：&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;除了大背景之外，請根據功能，將圖層群組起來。&lt;/li&gt;&lt;li&gt;群組之後，請給予一個能夠描述該群組用途的名稱。最常見的是使用群組的設計目的（選單、標頭、標籤列、banner列等等）來命名。&lt;/li&gt;&lt;li&gt;若有相同的設計目的，但卻處於頁面的不同位置，請分開成不同的群組，並在功能性之外，加上位置的描述（上選單、左選單）之類的，&lt;/li&gt;&lt;li&gt;群組中，請根據圖層的功能姓再繼續命名。如果有是使用多個圖層才能完成的視覺效果，請把相關的圖層再群組起來。&lt;/li&gt;&lt;li&gt;圖層，也盡量取有描述性的名稱（如「按鈕陰影」、「上部光影」等）。尤其是使用單獨一層很難看見的效果（如Difference、Overlay、Lighten）時，正確的目的描述，可以讓製作單位減少錯殺圖層的可能性。&lt;/li&gt;&lt;li&gt;內容頁的psd檔：如果好幾頁共用相同的設計元素，請把每一個頁面的特殊部分做成一個top-level 群組。幾個頁面共用的元素（如選單），則獨立在外成一個群組，並在群組名稱後面增加「（共用）」這樣的字眼&lt;/li&gt;&lt;li&gt;文字的部分，請勿轉成bitmap。因為對製作單位來說，文字的大小和間距這些資訊更為重要。雖然psd文件從Mac到PC（或反過來）上，字體與位置有可能會跑掉，但有文字的大小和間距資訊，製作單位比較容易再處理。&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div&gt;檔案交付前，請設計單位先做以下的檢查：&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;檔案打開來，除了大背景之外，所有其他的圖層都應該在某個群組中。&lt;/li&gt;&lt;li&gt;請確認所有的圖層，都使用了目的性或功能姓的描述名稱，而不是Photoshop預設的「Layer 5」或「Layer 3 copy 11」之類的。&lt;/li&gt;&lt;li&gt;請確認圖層群組與子群組的名稱，都使用了正確的目的性或功能性描述。&lt;/li&gt;&lt;li&gt;請把圖層群組開開關關，確認每個圖層群組都「僅包含」群組名稱所指的內容。在我們的經驗中，這點讓我們製作人員去檢查，出錯的機率是百分之百，且會大幅增加製作上來來回回的時間。&lt;/li&gt;&lt;li&gt;如果需要，請不吝另外給文件，說明您的分層。&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&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/8459683134438933251-1086193259802237611?l=aladdin-nest.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/aladdin-nest/~3/P13CsDLYh5Y/psd-ai.html</link><author>noreply@blogger.com (aladdin)</author><thr:total>0</thr:total><feedburner:origLink>http://aladdin-nest.blogspot.com/2011/06/psd-ai.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8459683134438933251.post-7206076164867730826</guid><pubDate>Mon, 09 May 2011 06:38:00 +0000</pubDate><atom:updated>2011-05-09T14:43:20.485+08:00</atom:updated><title>在.aspx中直接呼叫System.Diagnostics.Trace.WriteLine不會有作用</title><description>這個問題之前遇到過，被以前的外包解決過。這次自己遇到，卻一直沒想起來有這件事情，所以把原來的連結貼一遍：&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.alexthissen.nl/blogs/main/archive/2007/02/11/viewing-diagnostics-trace-info-in-an-asp-net-website.aspx" target="_blank"&gt;http://www.alexthissen.nl/blogs/main/archive/2007/02/11/viewing-diagnostics-trace-info-in-an-asp-net-website.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;簡單講：asp.net會把我們的.aspx轉換成.cs（或.vb）。然後再呼叫csc把產生的程式碼編譯完成。後面這道編譯的手續，如果沒有把/d:Trace打開，產生的程式碼就會忽略System.Diagnostics.Trace。這篇教的就是怎麼把這個選項打開。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8459683134438933251-7206076164867730826?l=aladdin-nest.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/aladdin-nest/~3/CYYj7x9nLWg/aspxsystemdiagnosticstracewriteline.html</link><author>noreply@blogger.com (aladdin)</author><thr:total>0</thr:total><feedburner:origLink>http://aladdin-nest.blogspot.com/2011/05/aspxsystemdiagnosticstracewriteline.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8459683134438933251.post-3649071064937037728</guid><pubDate>Fri, 06 May 2011 05:03:00 +0000</pubDate><atom:updated>2011-05-09T14:52:51.250+08:00</atom:updated><title>「Viewstate MAC 的驗證失敗」 的另一個可能</title><description>「Viewstate MAC 的驗證失敗。blah blah blah machineKey 設定 blah blah」錯誤，是一個常見的 asp.net webform 問題（好累，以後都要說是 MVC 還是 webform ）。起因多半來自兩個：&lt;br /&gt;&lt;br /&gt;1. 是 webfarm 的設定，就是向A主機要了xxx.aspx，但postback卻到了B主機。實務上，我們還是寧可用big IP這類的產品做分流，遠比用軟體手段設定session state mirror問題要少。這個部分多半要找網管確認問題，比較麻煩。&lt;br /&gt;&lt;br /&gt;2. 是讓頁面自動做postback，但卻在Viewstate還沒load完前就進行。&lt;br /&gt;&lt;br /&gt;以上的內容，&lt;a href="http://blog.miniasp.com/post/2007/11/07/ASPNET-20-and-Validation-of-ViewState-Mac-failed-exception.aspx"&gt;這裡有比較詳細的解釋&lt;/a&gt;。&lt;br /&gt;&lt;br /&gt;昨天客戶的客戶又發生這樣的錯誤，原來以為是 1.，但客戶說他自己之前偶而也會遇到。這個「偶而」讓我覺得很奇怪，因為公司內部是不會透過Big IP的。把 asp.net 2.0 關於 machinekey 的 security 章節讀完了以後，才想到：阿，Autogenerate 的 machineKey也會是問題阿！&lt;br /&gt;&lt;br /&gt;Google了一下，果然：&lt;br /&gt;&lt;a href="http://social.msdn.microsoft.com/Forums/en-US/netfxsetup/thread/1a3a947b-fda0-4446-a4c7-7e8730d4064d/" target="_blank"&gt;http://social.msdn.microsoft.com/Forums/en-US/netfxsetup/thread/1a3a947b-fda0-4446-a4c7-7e8730d4064d/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;上面討論串的回答有提到這一點，也就是每次app pool 被recycle以後，machineKey就會重新產生一次。如果使用者之前就進入我們的網站，但卻很久沒有進行任何操作，等到 app pool 被 recycle了以後，使用者卻用recycle之前的網頁進行postback，就會導致這樣的情況發生。&lt;br /&gt;&lt;br /&gt;所以比較安全的作法，就還是把machineKey給定下來。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8459683134438933251-3649071064937037728?l=aladdin-nest.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/aladdin-nest/~3/ObSwJ4xj6_M/viewstate-mac.html</link><author>noreply@blogger.com (aladdin)</author><thr:total>0</thr:total><feedburner:origLink>http://aladdin-nest.blogspot.com/2011/05/viewstate-mac.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8459683134438933251.post-4210484852837226893</guid><pubDate>Tue, 03 May 2011 10:30:00 +0000</pubDate><atom:updated>2011-05-03T19:03:35.341+08:00</atom:updated><title>JQuery Timer</title><description>老實說，我並不是很常寫複雜的javascript。最近手癢把一個原來要用flash完成的自動換圖，改用javascript寫。由於對 setInterval 深惡痛覺，就找了半天看有沒有Timer可用。找了半天，發現大部分的都用callback，也有closure的問題，再找下去也不是辦法，就決定自己寫一個。&lt;div&gt;&lt;br /&gt;&lt;pre name="code" class="JScript"&gt;function Timer(delay, repeatCount) {&lt;br /&gt;    this.delay = delay;&lt;br /&gt;    this.repeatCount = repeatCount;&lt;br /&gt;    this.currentCount = 0;&lt;br /&gt;    this.timeHandle = 0;&lt;br /&gt;    this.running = false;&lt;br /&gt;    this.start = function() {&lt;br /&gt;        this.timeHandle = setInterval(Timer.delegate(this, this._timer), this.delay);&lt;br /&gt;        running = true;&lt;br /&gt;    }&lt;br /&gt;    this.reset = function() {&lt;br /&gt;        this.stop();&lt;br /&gt;        this.currentCount = 0;&lt;br /&gt;    }&lt;br /&gt;    this.stop = function() {&lt;br /&gt;        if (this.timeHandle != 0) {&lt;br /&gt;            clearInterval(this.timeHandle);&lt;br /&gt;            this.timeHandle = 0;&lt;br /&gt;        }&lt;br /&gt;        this.running = false;&lt;br /&gt;    }&lt;br /&gt;    this._timer = function() {&lt;br /&gt;        $(this).trigger($.Event("timer"));&lt;br /&gt;        if (this.repeatCount &gt; 0) {&lt;br /&gt;            this.currentCount++;&lt;br /&gt;            if (this.currentCount &gt;= this.repeatCount) {&lt;br /&gt;                this.reset();&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;Timer.delegate = function(obj, func) {&lt;br /&gt;    var f = function() {&lt;br /&gt;        var target = arguments.callee.target;&lt;br /&gt;        var func = arguments.callee.func;&lt;br /&gt;        return func.apply(target, arguments);&lt;br /&gt;    };&lt;br /&gt;    f.target = obj;&lt;br /&gt;    f.func = func;&lt;br /&gt;    return f;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;使用的方式：需要先載入jquery（只是要一個能 trigger event 的 framework）。用 bind("timer", handler) 去接收timer事件。&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="JScript"&gt;var ct = 0;&lt;br /&gt;function timer_tick(event) {&lt;br /&gt;ct++;&lt;br /&gt;alert(ct + "," + this.currentCount);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;var timer = new Timer(5000, 3);&lt;br /&gt;$(timer).bind("timer", timer_tick);&lt;br /&gt;timer.start();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;這個是照著flash.utils.Timer刻的，用法也幾乎相同（用javascript模仿read-only，實在太囉唆了，所以沒做），不熟悉的人可以去 &lt;a href="http://help.adobe.com/zh_TW/AS3LCR/Flash_10.0/flash/utils/Timer.html"&gt;http://help.adobe.com/zh_TW/AS3LCR/Flash_10.0/flash/utils/Timer.html&lt;/a&gt; 看。至於這麼一點功能卻要 load 一個龐大的 jquery，是不是值得，就請大家自己判斷了。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;.js file: &lt;a href="http://demo.cdl-inc.com/aladdin-js/timer.js"&gt;http://demo.cdl-inc.com/aladdin-js/timer.js&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/8459683134438933251-4210484852837226893?l=aladdin-nest.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/aladdin-nest/~3/o-qwqqi3xFQ/jquery-timer.html</link><author>noreply@blogger.com (aladdin)</author><thr:total>0</thr:total><feedburner:origLink>http://aladdin-nest.blogspot.com/2011/05/jquery-timer.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8459683134438933251.post-6307164164119656251</guid><pubDate>Mon, 29 Jun 2009 08:45:00 +0000</pubDate><atom:updated>2009-06-29T17:41:52.586+08:00</atom:updated><title>FDB選擇browser的問題</title><description>最近恢復使用fdb來debug swf檔案。但在我的機器上遇到一個麻煩的問題，就是每次都用safari打開debug player，偏偏safari在我的機器上跑得並不順。經過了一些搜尋，找到這一篇：&lt;br /&gt;&lt;br /&gt;http://www.jetbrains.net/jira/browse/IDEADEV-34701&lt;br /&gt;&lt;br /&gt;處理了一下，很快就能用firefox。但是遇到了一些不明的問題，幾乎不能設定breakpoint。ie就沒有這個問題，我想，單純只是因為ActiveX的架構...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8459683134438933251-6307164164119656251?l=aladdin-nest.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/aladdin-nest/~3/XyNv64j_r-c/fdbbrowser.html</link><author>noreply@blogger.com (aladdin)</author><thr:total>2</thr:total><feedburner:origLink>http://aladdin-nest.blogspot.com/2009/06/fdbbrowser.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8459683134438933251.post-8455414130040906530</guid><pubDate>Sat, 19 Jul 2008 05:26:00 +0000</pubDate><atom:updated>2008-07-19T14:35:27.946+08:00</atom:updated><title>Set Nocount</title><description>好吧，我只能說我對adodb生疏太久了，這樣的一個bug居然要快一個星期才找到...&lt;br /&gt;&lt;br /&gt;事情是這樣的，我要做一份report，根據年月分，所以我寫了一段這樣的SQL&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="sql"&gt;&lt;br /&gt;create procedure get_message_count_by_user&lt;br /&gt;@ctrlId nvarchar(32),&lt;br /&gt;@sdate datetime,&lt;br /&gt;@edate datetime&lt;br /&gt;as&lt;br /&gt;&lt;br /&gt;declare @sd datetime, @ed datetime&lt;br /&gt;create table #temp (sd datetime, ed datetime , ctTotal int, ctR int, ctS int, ctnp int)&lt;br /&gt;insert #temp select sdate, edate, 0, 0, 0, 0 from sep_month(@sdate, @edate)&lt;br /&gt;update #temp set ctTotal=t1  &lt;br /&gt; from (select sd, count(sid) t1 from #temp as s, messageboard &lt;br /&gt; where contentdate&amp;gt;=s.sd and s.ed&amp;gt;contentdate and groupno=@ctrlId and deleteUser is null and &lt;br /&gt; (status='2' or isnull(returnUser,'')&amp;lt;&amp;gt;@ctrlId  ) &lt;br /&gt; group by sd ) as a&lt;br /&gt; where #temp.sd=a.sd&lt;br /&gt;update #temp set ctR=t1  &lt;br /&gt; from (select sd, count(sid) t1 from #temp as s, messageboard &lt;br /&gt; where contentdate&amp;gt;=s.sd and contentdate&amp;lt;s.ed and groupno=@ctrlId and deleteUser is null and &lt;br /&gt; status='2'&lt;br /&gt; group by sd ) as a&lt;br /&gt; where #temp.sd=a.sd&lt;br /&gt;update #temp set ctS=t1  &lt;br /&gt; from (select sd, count(sid) t1 from #temp as s, messageboard &lt;br /&gt; where contentdate&amp;gt;=s.sd and contentdate&amp;lt;s.ed and groupno=@ctrlId and deleteUser is null and &lt;br /&gt; status='5'&lt;br /&gt; group by sd ) as a&lt;br /&gt; where #temp.sd=a.sd&lt;br /&gt;update #temp set ctNP=ctTotal-ctR-ctS&lt;br /&gt;&lt;br /&gt;select * from #temp&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;呼叫這個stored procedure，在asp.net一點問題也沒有，但是在asp中，我就是沒有辦法叫adodb取得#temp中的資料。測試了很久，甚至把stored procedure一行一行拆開來測試，結果發現：Insert #temp select 這一行一加入之後，後面的select敘述就沒有辦法傳回值了。這使得我想起很久很久以前（應該是七年前）我也遇過一個類似的問題，於是把資料庫一個一個找出來，在眾多的stored procedure中搜尋，終於看到一個熟悉的字眼：set nocount。於是在開頭(第六行）跟select * from #temp之前（第29行）分別加上：set nocount on, set nocount off，問題就解決了。&lt;br /&gt;&lt;br /&gt;不過說到set nocount，這讓我想起許多陳年往事，還牽涉到一位如今是M$名嘴級的講師。這是個又臭又長的故事，有機會再說。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8459683134438933251-8455414130040906530?l=aladdin-nest.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/aladdin-nest/~3/RcM_XdHhqsU/set-nocount.html</link><author>noreply@blogger.com (aladdin)</author><thr:total>0</thr:total><feedburner:origLink>http://aladdin-nest.blogspot.com/2008/07/set-nocount.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8459683134438933251.post-2706587452100891582</guid><pubDate>Wed, 11 Jun 2008 00:54:00 +0000</pubDate><atom:updated>2011-03-23T21:21:22.570+08:00</atom:updated><title>iPhone 2.0 的遠見</title><description>在 iPhone 2.0 上市之前，聽到一個之前專寫c#的朋友說，他最近買了一部mac在學習寫iPhone程式，這讓我驚訝了好一會兒。但看完了WWDC 2008 Keynote，我知道他的選擇是有意義的。&lt;br /&gt;&lt;br /&gt;所有人看完 Keynote 的時候，注意到的都是199元。我看到的，卻是 "iPhone is the phone that changes the phones forever."&lt;br /&gt;&lt;br /&gt;steve jobs 在1984年推出Macintosh的時候，動機就是：我要一部可以改變世界的電腦。Macintosh的確改變了整個電腦世界，唯一的問題只是：從中獲利的不是Apple，而是M$。1997年回鍋的steve，雖然透過iMac創造了話題，但是卻沒有什麼機會再度改變世界。一直到iPod，不，正確的說，是iTunes，改變了音樂販售的世界，也就改變了製作音樂這個行業。&lt;br /&gt;&lt;br /&gt;iPod的發跡，除了金錢上的回報之外，有沒有為他們自己留下什麼可怕的武器？有，答案就是iTunes，以及操作iTunes上得到的學習。仔細想想，iTunes是世界上，唯一針對一個單一硬體商品進行加值販售的網路通路，這讓很多其他人起而仿效。我認為：iTunes是一把刀，真正的重點是：當你有了一把刀，可以直接切進你的消費群，你會想拿來幹嘛？&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8459683134438933251-2706587452100891582?l=aladdin-nest.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/aladdin-nest/~3/FYHP06sY39U/iphone-20.html</link><author>noreply@blogger.com (aladdin)</author><thr:total>0</thr:total><feedburner:origLink>http://aladdin-nest.blogspot.com/2008/06/iphone-20.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8459683134438933251.post-7339305428084894861</guid><pubDate>Wed, 28 May 2008 00:40:00 +0000</pubDate><atom:updated>2008-05-28T08:53:56.390+08:00</atom:updated><title>Safari的強勢推廣</title><description>Safari目前市占率約為5%，而蘋果公司3月開始透過iTunes的自動更新大力推廣Safari。這種&lt;span style="color: rgb(255, 0, 0);"&gt;強勢推廣&lt;/span&gt;已有一些效果，根據Net Applications統計，Safari在視窗電腦的市占率3月時成長200%。&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/8459683134438933251-7339305428084894861?l=aladdin-nest.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/aladdin-nest/~3/SGeGHG_o6sg/safari.html</link><author>noreply@blogger.com (aladdin)</author><thr:total>1</thr:total><feedburner:origLink>http://aladdin-nest.blogspot.com/2008/05/safari.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8459683134438933251.post-7354497558590351846</guid><pubDate>Fri, 23 May 2008 00:59:00 +0000</pubDate><atom:updated>2008-05-23T09:14:32.996+08:00</atom:updated><title>DataBinding的問題</title><description>從昨天傍晚遇到這個問題，弄了一整夜找不出原因。先把問題記下來，將來再研究為何...&lt;br /&gt;&lt;br /&gt;ArticleEntryEditor繼承了DataList，做了一點小修改。&lt;br /&gt;&lt;br /&gt;ArticleEntryEditor的EditItemTemplate，用了一個UserControl：ArticleEditorItem&lt;br /&gt;&lt;br /&gt;在ArticleEditorItem中，接受一個Item的欄位，型別為ContentItem。用DataBind的&lt;%# Container.DataItem %&gt;之後，ArticleEditorItem 中的 DropDownList 都不會抓到正確的值。應該說，在指定完畢之後，就立刻不見了（回復到選單的第一個值）。可是其他的WebControl不會受到影響。&lt;br /&gt;&lt;br /&gt;如果是在OnItemDataBound中，去指定ArticleEditorItem.Item的值，就不會有這個問題。&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/8459683134438933251-7354497558590351846?l=aladdin-nest.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/aladdin-nest/~3/qUBzG3OnAT8/databinding.html</link><author>noreply@blogger.com (aladdin)</author><thr:total>1</thr:total><feedburner:origLink>http://aladdin-nest.blogspot.com/2008/05/databinding.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8459683134438933251.post-38584016094131718</guid><pubDate>Sun, 11 May 2008 05:18:00 +0000</pubDate><atom:updated>2008-05-11T14:12:54.148+08:00</atom:updated><title>IPrincipal vs Session Identity Persistence 的思考</title><description>為了家總的案子，終於把這一段給弄清楚了...&lt;br /&gt;&lt;br /&gt;簡單講IPrincipal的架構：HttpContext.User就是一個IPrincipal，IPrincipal負責標示Role（有個IsInRole的method要實現），也就是負責授權。IPrincipal下面有一個Identity，可以存真正獲得這個Principal的Identity(:IIdentity)。&lt;br /&gt;&lt;br /&gt;每次的HttpRequest, Asp.Net都會自動幫我們把IPrincipal與IIdentity處理出來。標準狀況下（使用Forms Authentication，且使用FormsAuthentication.SetAuthCookie的情況下），每個Request獲得的User是一個GenericPrincipal，Identity則是一個FormsIdentity。這往往不是我們要的，所以，我們有兩種作法：&lt;br /&gt;&lt;br /&gt;1. 在系統拿到IPrincipal與IIdentity的時候，自己根據取得的IIdentity.Name去把我們要的類別代換。比如我有CDLPrincipal:IPrincipal, CDLIdentity:IIdentity，在Authentication_End的時候，執行 &lt;br /&gt;&lt;pre name="code" class="c-sharp"&gt;&lt;br /&gt;string currentUserId=HttpContext.User.Identity.Name;&lt;br /&gt;HttpContext.Current.User=new CDLPrincipal(currentUserId);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;這裡的new CDLPrincipal，基本上就是從Identity Store裡，取出我們要的CDLPrincipal，以及附贈的CDLIdentity。也就是說，在這個過程裡面，HttpContext.Current.User發生了兩次指定的工作：一次是系統做的，一次是我們做的。&lt;br /&gt;&lt;br /&gt;2. 如果要只想做一次這個動作，只能我們自己寫Authentication Module。在這種時候，我們要用authentication cookie把所有IPrincipal的內容Serialize（並Encrypt）成一個string，然後指定cookie name，傳給browser。這也是Msdn的標準作法，SetAuthCookie只是這個作法的一個簡易版。這種作法的問題很多，主要authentication cookie這下子可能變得很長，影響頻寬。&lt;br /&gt;&lt;br /&gt;第一種作法，可以用HttpModule解決或是用Page_Init，第二種方式就一定是用HttpModule處理。&lt;br /&gt;&lt;br /&gt;另外，這跟使用Session比起來有何好處？老實說，除了可以Impersonate之外，我看不出任何好處。但多了一個Auth. Cookie，在頻寬上是有影響的。session的偽冒問題，IPrincipal的作法同樣透過cookie，也不可避免。&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/8459683134438933251-38584016094131718?l=aladdin-nest.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/aladdin-nest/~3/6MS1JslvP_0/iprincipal-vs-session-identity.html</link><author>noreply@blogger.com (aladdin)</author><thr:total>0</thr:total><feedburner:origLink>http://aladdin-nest.blogspot.com/2008/05/iprincipal-vs-session-identity.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8459683134438933251.post-7588498577119130730</guid><pubDate>Thu, 08 May 2008 09:51:00 +0000</pubDate><atom:updated>2011-03-24T09:50:03.568+08:00</atom:updated><title>Inversion of Control 與 DI 的分別</title><description>最近突然沒有什麼事，花了一點時間把 Inversion of Control 與 Dependency Injection 的議題搞清楚。&lt;br /&gt;&lt;br /&gt;Martin Fowler雖然很久以前就說明了 &lt;a href="http://martinfowler.com/bliki/InversionOfControl.html"&gt;IoC 是什麼&lt;/a&gt;，而 &lt;a href="http://martinfowler.com/articles/injection.html"&gt;DI 又是什麼&lt;/a&gt;，但是網路上的文章還是很多人弄錯，有必要說明一下。這邊的解釋沒有任何新意，完全是別人（多半是 Martin Fowler）已經說明過的。&lt;br /&gt;&lt;br /&gt;從前，我們寫command line程式時，會要求使用者按照我們的規定輸入資料。比如：先輸入座號、再輸入分數，如此重複五十次完成一個班級的分數輸入作業。然後，用另外一個命令，顯示所有輸入的內容；萬一有錯，再執行一個命令，這個命令會要求我們輸入一筆座號，再輸入分數，僅修改該座號的分數。這樣的執行步驟，都是我們事先決定的，使用者必須按照順序一個一個來；好一點的程式設計者，會提供一些方式讓人中途離開這個流程（比如ctrl-c）。我們的程式寫起來，就是一個接一個的執行一個個指令，這是以前的作法。這樣的程式，寫起來如下：&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="sql"&gt;&lt;br /&gt;for i=1 to 50&lt;br /&gt; print "請輸入座號" : input no&lt;br /&gt; print "請輸入分數" : input score&lt;br /&gt; writeSql "insert score(no, score) values(@1, @2)", no, score&lt;br /&gt;next&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;進入視窗年代後（是，我說的是 Macintosh 的 Window），程式就不是這樣寫了。基本上我們叫出一個可操作的視窗，然後系統進入一個無窮迴圈（其實不是無窮迴圈，不過先這樣想好了）。使用者透過滑鼠操作，點選座號的文字控制項，輸入座號；再點選分數的文字控制項，輸入分數，再點選送出，完成一個操作。在這種寫作程式的方式下，我們的程式比較像是這樣的模式：&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="jscript"&gt;&lt;br /&gt;var txtNo:TextInput;&lt;br /&gt;var txtScore:TextInput;&lt;br /&gt;var btnSave:Button;&lt;br /&gt;public function initialize():void{&lt;br /&gt; txtNo=new TextInput();&lt;br /&gt; addChild(txtNo);&lt;br /&gt; txtNo.x=10; txtNo.y=50;&lt;br /&gt; txtNo.addEventListener(focusOut, checkTxtNo);&lt;br /&gt;&lt;br /&gt; txtScore=new TextInput();&lt;br /&gt; addChild(txtScore);&lt;br /&gt; txtScore.x=10; txtScore.y=90;&lt;br /&gt; txtScore.addEventListener(focusOut, checkTxtScore);&lt;br /&gt;&lt;br /&gt; btnSave=new Button();&lt;br /&gt; addChild(btnSave);&lt;br /&gt; btnSave.x=10; btnSave.y=130; btnSave.label="儲存";&lt;br /&gt; btnSave.addEventListener(click, saveScore);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private function checkTxtNo(evt:Event):void{&lt;br /&gt;  ...&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;我們寫的程式，只有在使用者做出對應的動作時，才會被系統呼叫，處理該處理的事情，而不再掌管主要的流程。這種程式寫作方式，也就是&lt;span style="font-weight: bold; color:#0099ff;"&gt;把程式執行流程的控制權從程式設計者轉移到背後的框架&lt;/span&gt;，所以這種程式的架構方式，我們稱為 Inversion of Control。在這種程式的撰寫中，最常用到的就是Template Pattern。&lt;br /&gt;&lt;br /&gt;IoC，還可以說明另一個程式庫特性：&lt;span style="font-weight: bold; color:#0099ff;"&gt;所有的 Framework，都是 IoC 的&lt;/span&gt;，也就是單獨看你寫完的程式碼而沒有該程式庫的背景知識，我們會無法確定執行的流程。不符合以上條件的，就是 Library。所以，Flex是一個 Framework，pureMVC 是 Framework，as3core 則是 Library。另外許多程式庫，雖宣稱是 Framework，但在這樣的標準下，很快就可以判定其實他們應該是 Library，比如個人最近在研究的 AsWing。&lt;br /&gt;&lt;br /&gt;這樣的判定有何用處嗎？有，當你需要快速瞭解一個framework時。把framework中，屬於Library的部分先略過，直接切進核心的執行流程（這裡常出現的關鍵字是：life cycle），你就可以很快的掌握該怎麼使用該framework。&lt;br /&gt;&lt;br /&gt;以上就是個人關於 Inversion of Control 的瞭解。至於 Dependency Injection，網路上的說明資料就太多了，不需要我再多做說明。倒是有一點可以提：&lt;br /&gt;&lt;br /&gt;&lt;a href="http://martinfowler.com/articles/injection.html"&gt;Inversion of Control Containers and the Dependency Injection pattern&lt;/a&gt; 這邊提到兩種decoupling的作法，第一種就是Dependency Injection，第二種是Service Locator。DI 由Java界率先發難，推廣得很好沒問題，但 Service Locator 呢？有人在用嗎？答案是有，而且正是 .Net Framework 的標準作法，只是改名叫做 Provider。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8459683134438933251-7588498577119130730?l=aladdin-nest.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/aladdin-nest/~3/tkP0dwsXuKw/inversion-of-control-di.html</link><author>noreply@blogger.com (aladdin)</author><thr:total>0</thr:total><feedburner:origLink>http://aladdin-nest.blogspot.com/2008/05/inversion-of-control-di.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8459683134438933251.post-3050786305903348497</guid><pubDate>Tue, 06 May 2008 12:30:00 +0000</pubDate><atom:updated>2008-05-06T21:23:59.167+08:00</atom:updated><title>Page Inherited Abstract 不能在 VS 2003 中以Design View觀看</title><description>這句話的意思是：如果你自己定義了一個繼承自Page的Abstract class，那任何以這個Abstract class延伸的出來的頁面，就不能在Visual Studio 2003中以Design View檢視。&lt;br /&gt;&lt;br /&gt;也就是說：&lt;br /&gt;&lt;pre name="code" class="c-sharp"&gt;&lt;br /&gt;public abstract class BasePage : System.Web.UI.Page {&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public class adm_user_list : BasePage{&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;其中 adm_user_list是 adm_user_list.aspx的code behind。在這種情況下，adm_user_list.aspx就無法在 Visual studio 2003 下以 Design view 觀看。嘗試這件事情的時候，會得到Type Abstract的錯誤訊息。&lt;br /&gt;&lt;br /&gt;也許這本來就是應該的（沒有時間去查清楚Design time support的相關限制），但我還是覺得很奇怪。對所有其他有design time support的server control，當然不應該有abstract的可能，但Page是一個很奇怪的例外。就以上例來說，adm_user_list.aspx已經是BasePage的一個實作子類別，不是一個Abstract Type。而且，就算沒有code behind，所有的.aspx都會由掛在IIS的ISAPI（也就是ASP.NET_xxxxx.dll)先行產生一個class（這裡的例子，會產生ASP.adm_user_list_aspx這個class）。這樣還給我Type Abstract，就會讓人有點三條線的感覺....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8459683134438933251-3050786305903348497?l=aladdin-nest.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/aladdin-nest/~3/jlyvtrspJRs/page-inherited-abstract-vs-2003-design.html</link><author>noreply@blogger.com (aladdin)</author><thr:total>0</thr:total><feedburner:origLink>http://aladdin-nest.blogspot.com/2008/05/page-inherited-abstract-vs-2003-design.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8459683134438933251.post-3058949160216608008</guid><pubDate>Tue, 29 Apr 2008 22:34:00 +0000</pubDate><atom:updated>2008-04-30T07:23:37.337+08:00</atom:updated><title>SQL 2000 Database diagram is removed from Visual Studio 2005</title><description>好吧！找了一個多小時，得到的是這樣的答案。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://codebetter.com/blogs/brendan.tompkins/archive/2006/03/10/140542.aspx"&gt;Visual Studio 2005... Uggh.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;裡面reference到M$的原始說法：&lt;br /&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms186552.aspx"&gt;Working with SQL Server 2000 Diagrams&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;簡單的說，因為SQL 2000的Database Diagram的資料結構與SQL 2005不一樣。由於SQL 2005必須要是dbo才能夠存取Database diagram，而且該權利不可轉讓，這表示在內部結構上發生了天大的變化。SQL 2000在安全性的思考上實在太糟，做這樣的改變雖然是好的，但是...&lt;span style="color: rgb(255, 0, 0);"&gt;他〤的，M$你同時支援SQL 2000的Database Diagram是會怎樣！&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;從Brendan的文章摘取的&lt;br /&gt;4) They’ve removed support for SQL 2000 Database Diagrams.  It’s there for SQL 2005, but for SQL 2000 Databases, it’s just gone!  Hey, um.. This was a feature I used, like, um A LOT! And uh, SQL Server 2005 is like NEW, and my company probably won’t be migrating for a while.&lt;br /&gt;&lt;br /&gt;我只能說，M$一天到晚搞這種「強迫升級的把戲」...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8459683134438933251-3058949160216608008?l=aladdin-nest.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/aladdin-nest/~3/m4YtAslYGKM/sql-2000-database-diagram-is-removed.html</link><author>noreply@blogger.com (aladdin)</author><thr:total>0</thr:total><feedburner:origLink>http://aladdin-nest.blogspot.com/2008/04/sql-2000-database-diagram-is-removed.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8459683134438933251.post-7008830079009246599</guid><pubDate>Mon, 28 Apr 2008 05:39:00 +0000</pubDate><atom:updated>2008-04-28T14:52:16.955+08:00</atom:updated><title>Flash player 9.0.124.0的新安全性限制</title><description>這個blog設立也很久了，一篇文章都沒寫。就拿這一篇開頭吧！&lt;br /&gt;&lt;br /&gt;今天犇亞有人通知說，update了新的flash player以後，原本正常的功能就消失了。在網站上找了一下，發現了這一篇：&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.adobe.com/devnet/flashplayer/articles/flash_player9_security_update.html"&gt;http://www.adobe.com/devnet/flashplayer/articles/flash_player9_security_update.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;原來改了安全性限制。可是看了半天，還是不知道到底在說什麼。更奇怪的是：WebService不作用就算了，有些HttpService可以動，有些又不行。用sniffer看了半天，才發現：Http GET可以運作，但是Http Post不能運作。這篇文章裡面講到安全性限制來自於addRequestHeader這個幾乎從來沒用過的東西。我知道WebService有用到SOAPAction這個Header，但是想了半天也不知道為什麼Get跟Post會有差，只好回去sniffer找蛛絲馬跡...&lt;br /&gt;&lt;br /&gt;結果在Post的時候，發現有一個奇怪的字眼會出現在Request header裡：flex-http-service。只要是HttpService用Post的時候，這東西就會自動增加在Header裡，想必就是flex幫我們用addRequestHeader做出來的，於是把這個東西加進去crossdomain.xml裡，如下面：&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt; &amp;lt;cross-domain-policy&amp;gt;&lt;br /&gt;   &amp;lt;allow-access-from domain="localhost" secure="false"/&amp;gt;&lt;br /&gt;   &amp;lt;allow-http-request-headers-from domain="localhost" headers="flex-http-service,SOAPAction"/&amp;gt;&lt;br /&gt; &amp;lt;/cross-domain-policy&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;事情就解決啦...&lt;br /&gt;&lt;br /&gt;以上是Flex 1.5的HttpService生出的麻煩，2.0不知道還會不會自動增加。過幾天有空再試。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8459683134438933251-7008830079009246599?l=aladdin-nest.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/aladdin-nest/~3/YCNcOvGw9cc/flash-player-901240.html</link><author>noreply@blogger.com (aladdin)</author><thr:total>0</thr:total><feedburner:origLink>http://aladdin-nest.blogspot.com/2008/04/flash-player-901240.html</feedburner:origLink></item></channel></rss>

