2012年3月17日

[ASPNET] CS0433之問題

坎尼之前有某個案子的專案在 Debug 的時候很常出現這個問題
所以今天就花了一些時間來追一下問題的發生點

I. 問題說明

此問題發生的時候會出現類似下面的訊息 (可以參考這討論串 

Compiler Error Message: CS0433: The type 'ASP.某個型別' exists in both
'{.Net Framework的路徑}\Temporary ASP.NET Files\root\aaa\bbb\A.dll' and
'{.Net Framework的路徑}\Temporary ASP.NET Files\root\aaa\bbb\B.dll'

CS0433 的官方文件裡寫的很清楚
"在您的應用程式內參考的兩個不同組件包含了相同的命名空間和型別,使其產生了模稜兩可 (Ambiguity) 的情況。"
(但其實 Exception 的內容也講的很清楚了)

只是坎尼檢查了一下專案,感覺不是型別重複的問題
比較像 compiler 快取住某些型別,但重新建置專案之後也只維持一下子
點了幾個頁面之後,有引用到該型別的頁面又會出現此項問題
(都是有引用 Web User Control 的頁面出問題)
(在找解決方法的過程中,發現好像 Web User Control 常會引發這個問題?)


所以坎尼又默默地打開ebay谷歌搜尋
blue-20060625142551

II. 解決方案

首先,在這篇裡提到了3個情況
  1. 不同的 aspx/ascx 引用了相同的 class 當作 code behind 的問題
  2. 因為更名造成有新舊兩種 dll
  3. User Control 的名稱和引用 User Control 的頁面名字一樣

嗯...實際測試之後似乎都不是這些問題,或應該是說,這些都不是主因
坎尼不死心地減少關鍵字,找到了這篇討論串 (其實前面放的討論串也有解法)

解法:在 Web.config 中,把 Compilationbatch 屬性設定為 false

batch 屬性在官方文件的說明為
"If True, eliminates the delay caused by the compilation required when you access a file for the first time. When this attribute is set to True, ASP.NET precompiles all the uncompiled files in a batch mode, which causes an even longer delay the first time the files are compiled. However, after this initial delay, the compilation delay is eliminated on subsequent access of the file."

大意大概是說:當需要該檔案且為第一次進入時才會 compile,以免造成 compile 時間過長,開發人員及客戶都會不爽

所以坎尼猜測就是因為這原因造成下列狀況

  1. A.aspx 引用 UCA.ascx (型別 UCA)
  2. B.aspx 引用 UCA.ascx (型別 UCA)
  3. 進入 A.aspx,進行 compile,沒出現問題
  4. 進入 B.aspx,進行 compile,此時有兩個 .dll 檔都有 UCA 型別

然後系統就混亂了『為什麼有兩個同名的人住在不同的地址,那我到底該去哪個地址找這個人?

『這個地址明明就住大中天,你還要說你是小中天』
dncignn 

III. 小結


不過可能很多人有疑問:為什麼我自己用就好好的,是你自己的問題吧?

其實問題的原因就可能是坎尼之前有做過某些檔案的更名
然後在新增頁面時,就直接把前一頁的程式碼貼過來 (壞習慣啊…)
但也不確定是不是這樣就有可能造成這個問題
畢竟是很久之前的專案,記憶有點久遠…

總之,提供另一個可能 cs0433 的解決方案
希望對同樣遇到這個問題的人有所幫助

2012年3月9日

[Freetalk] 漫談程式設計-II

前篇,本篇就再來舉個例子談談錯誤訊息處理吧

I. 錯誤訊息處理

校方希望全體師生都可以吃青菜,故舉辦了拍附近餐廳的青菜內容上傳的活動
pgs_04 
坎尼也很開心的點開網頁,看看大家的分享內容
但身為一個系統開發人員,注意網址列也是很正常的一件事
asaprogrammer

嗯,如第一張圖所示,是用 Query String 的方式傳送頁面資訊 
很常見的作法,可以節省運算成本,也能有效地達到目的
但好像沒有資料也會顯示該頁,所以坎尼就稍微改了一下參數
pgs_05 在按下Enter鍵的同時坎尼OS「啊啊啊,會不會壞掉?」

pgs_06 嗯…壞掉了 >/////<
但壞掉不要緊,這頁的問題是在它把錯誤訊息給吐出來了

「知道錯誤訊息不好嗎?」
給開發人員知道當然很好,可以馬上了解問題並進行解決

但是!!!

給使用者看到訊息的用意是? 難不成要使用者幫你 Debug 嗎?
還是說這是挑戰,看能不能釣到惡意攻擊的人?

這邊應該要做的是判斷頁數的大小,不合理的數字就該擋掉

II. 同場加映

坎尼想說這個網站會不會還有其他問題,所以就開始隨意瀏覽
除了點連結之外還有改網址…

!!! (出現 FF 中遇敵的音效)
pgs_07 
很明顯的,此站看來是舉辦了大家幫忙一起除錯的全民除錯活動
所以坎尼很好心的連過去 online_resource.php 看有沒有什麼可以幫上忙的

「咦? 奇怪,為什麼顯示 404 page not found? 」
「原來是有做直接存取的限制啊,坎尼放心了不少」
「………」(眉頭一皺,發現事情並不單純)
「不對,是 resource 拼成 resouce 了!!!!」

唉…就算程式沒寫好,英文也要練好啊…

by the way, 如果是系統不能控制的情況,請用 try…catch… 處理
像是 DB Server 當掉,使用者罵的是你而不是管 DB 的人員
(當然如果兩個都是同一個人管的…那…只能說很心酸)

III. 小結

錯誤訊息 (Error Log) 記錄請用 Log 工具
會在頁面上顯示是開發中為了方便做的事,不代表可以在上線之後做

另外最好設計錯誤訊息的顯示格式,到底是 Warning 還是 Fatal
至少要處理的時候可以排出優先順序
Will 保哥在 網站建置不是件簡單的事 @ 打造網站的步驟 的回應也談到
”錯誤訊息在網站企畫階段就要設計。”

至於把訊息曝露給使用者可能會有什麼狀況呢?
可以參考一下同樣是保哥寫的 機會教育:從中華民國總統府網站被發現 XSS 漏洞講起

[Freetalk] 漫談程式設計-I

坎尼自從重回學校之後,寫程式的機會就變少了
但最近在用某些資訊系統時,總覺得怎麼這麼不友善
看來程式魂還是在燒 XD
今天就來舉幾個資訊系統的例子,順便聊一下例子中的問題

I. 資料分類

所有有學過關聯式資料庫設計的人一定都聽過正規化
沒吃過牛肉也要知道瘦肉精,就算不會用也應該會記得1NF、2NF…BCNF …
(不知道正規化有幾階的人請回去找老師或是問維基 資料庫正規化 )

剛好最近用了下面這個XX請修系統
pgs_01

從外表看起來除了 UI 不美觀似乎沒啥大問題
但一打開請修項目:喔喔喔喔喔
pgs_02
幾百個選項一起跳出來,真是令人嘆為觀止
我眼睛也為了找修理項目眼花…

很明顯的,這個請修項目大概只做了第一正規化
坎尼直覺其實可以分為:大類、次類、問題說明 (上圖)
這樣 user 在找的時候可以先選水電類,接著可以找到日光燈,接著再填寫問題
像目前系統做法,日後要是又多了100項
那豈不是要讓下拉選單突破天際瀏覽器邊框了?

當然也有正規化太複雜,導致效能降低的情況,這時候就是要反正規化
但坎尼相信這些資料的量應該還不至於因為正規化而產生瓶頸

當然同頁面的請修地點也有同樣的問題存在
剛好最近又蓋了新宿舍,選單瞬間又加了幾十間房間 orz
pgs_03
 
(1421的同學抱歉啦,如果有看到這篇可以私信給坎尼,再請你們喝飲料)

另外還有個問題,最前面的 610421 很明顯是 primary key 之類的資訊
基本上對使用者是無用的,而且還曝露出自己系統設計原則

設計對白「我是610421的學生,想問幾個問題 (下略)」

除非客服有很好的資訊系統輔助
不然除了通靈之外,鬼才會知道 610421 代表什麼

II. 小結

本來還想多舉個例子的,但篇幅太長就先到這邊
下集待續… (富樫最近都沒休刊,所以坎尼也不能富奸)

2012年3月3日

Windows 8 Consumer Preview (Build 8250) 試玩心得

話說在 2009/1/6 & 2009/2/2 我分別寫了Windows 7 Beta (Build 7000) 安裝心得64-bit Windows 7 Beta (Build 7000) 試用心得兩篇文章,很快的在 2012/02/29 的 WMC 大會上,微軟發表了最新的 Windows 8 Consumer Preview (Build 8250) (發表會完整影片-1.5小時),於是我又手很癢的抓下來玩了。(MS 官方下載網頁,由於只有英文和簡中可以選,因此很自然的選了英文版)

(題外話:我覺得這場發表會上場的 MS 主管講話都太快了,聽眾很少有時間去消化他們講的內容,相較之下還是 Apple 發表會比較精采,聽眾比較能體會這次發表的新產品到底是怎樣的 insanely great)

這次的測試設備規格如下 (大概3~4歲的 NB):
  • Model: ASUS A8E
  • CPU: Intel Core2 Duo T8300 2.40GHz
  • Memory: 2GB
  • 沒有平板/觸控螢幕/藍牙鍵盤之類的配件 Q_Q
安裝過程參考T客邦佛心整理的自製 Windows 7 + Windows 8,玩新系統、舊系統繼續用,除了第一次執行 diskpart 指令要跑有點久以外,可以很順利的把系統裝起來。(更多不同的安裝方式請參考同樣是T客邦出品的 Windows 8 消費者預覽版安裝方法建議與試玩報告,比較之後還是在 Windows 7 系統上用 VHD 安裝比較方便。原汁原味的英文版請參考微軟員工 Scott Hanselman 的 How To Guide to Installing and Booting Windows 8 Consumer Preview off a VHD (Virtual Hard Disk))


現在網路上已經有很多簡介/試玩心得可以參考:
  1. Windows 8 消費者預覽版安裝方法建議與試玩報告-Page 2 介面變很多,關機在哪裡?
  2. [重灌狂人] 非學不可的14個 Windows 8「全新」鍵盤快速鍵
  3. [Engadget] Windows 8 消費者預覽版深入分析
我的感想和 Engadget 這篇差不多, 用平板的人應該會一直停在 Metro 介面(大多會是休閒娛樂/上網閒逛之類的使用情境),需要用傳統鍵盤滑鼠,或者需要用到 browser plug-in 工作的人,還是使用傳統桌面會比較順暢。(要寫程式/用 ssh 管理 unix-like servers 的人就更不用說了,應該有90%以上的時間會使用傳統桌面)

傳統桌面環境的改進:
  1. 三年前在使用 Windows 7 Beta 的時候都要另外安裝 Virtual CloneDrive,現在 Windows 8 Consumer Preview 原生支援可掛載 iso 檔,相當方便,也不需要做「直接把 iso 檔解壓縮出來使用」的蠢事了。
  2. 新的工作管理員更強大了,介面變得更有現代感:
  3. 設定系統啟動時要執行的 services / 軟體可直接在工作管理員中執行,不用再執行 msconfig (視窗無法放大,超爛) 或者到「服務」的管理介面去設定了。

  4. 複製多個檔案的介面也有大幅改進,可隨時暫停/繼續/取消,聽說連休眠後都可以繼續複製:

  5. 新版的 Windows 檔案總管引進 Ribbon 介面,更方便了:

目前安裝成功的軟體:
Also installed:
2012-03-09 : Line PC Version, K-Lite Mega Codec 8.5, Google Earth
2012-03-10 : Visual Studio 11 Ultimate (of course this should work)


目前仍然不 work 的軟體(全部都用最新版測試):
  1. World Community Grid
  2. Google Chrome 官方安裝檔 (但可透過 Avast 7.0/Google Earth 順便安裝)
  3. Dropbox
  4. ImgBurn
  5. FileZilla client
  6. PicPick
  7. 7-zip - 2012-03-09 Update - alternative: bandizip (ref: http://steachs.com/archives/2464)
  8. PPS/PPTV
  9. VLC (可以裝 K-Lite Mega Codec 順便裝 Windows Media Player Classic)
  10. 新酷音 (在傳統桌面可改裝 Yahoo!輸入法,但在 Metro 介面只能用系統內建的簡中輸入法。在傳統桌面切換輸入法的熱鍵沒辦法改成 ctrl + space)
  11. Pidgin (可改裝很多人不愛用的 Windows Live Messenger 2011)
  12. Java & Eclipse
雖然不 work,但 Windows 8 系統已經內建支援的:
  1. PDF -XChange viewer (Windows 8 內建的 Reader App 可直接開啟 PDF<無分頁瀏覽功能>,若需要分頁瀏覽可用 Google Chrome 來開啟多個 PDF 檔案)
  2. VirtualCloneDrive (Windows 8 內建支援直接掛載 iso 檔) 
2012-03-09 Update: 批次刪除 Metro 桌面中不想要的應用程式捷徑(Tile)

最近發現一件事,在傳統桌面安裝了軟體以後,就算在安裝過程中選擇「Don't create Desktop Shortcuts』,還是會在 Metro 桌面留下一大堆應用程式捷徑,讓 Metro 桌面變的很亂,夾雜了一大堆非 Metro style 的圖示。此時只要在所有想要移除的捷徑上按右鍵,就可以將要移除的圖示標記起來(右上角會顯示打勾):

 
然後再按一下左下角的「Unpin from Start」按鈕,就可以讓 Metro 桌面回復乾乾淨淨的狀態啦!
總結

由於一些常用的軟體(Dropbox, FileZilla client, 7-zip)沒辦法安裝,因此我暫時不考慮用 Windows 8 Consumer Preview 當做工作機 ,相信正式版推出以後問題都可以解決。至於公司內的老舊系統 (XP/IE6 Only) 就只能期待 Windows 8 的傳統桌面模式也可以像 Windows 7 一樣裝個 XP Mode 了 (嘆)。

希望 Windows 8 趕快推出,新系統除了有很多改進的地方,用起來總是比較好玩阿!

Google Spreadsheet 裡用規則運算式

最近因為工作關係,遇到要用 Google Form 及 Google Sheet 所以研究了 Google Sheet 裡的一些 function 怎麼用 首先,分享一下如何在 Google Sheet 裡用規則運算 :D