2010年8月31日星期二

2001年與2010年的IT行業

昨晚看到一篇已很多很多年前看過的文章,應該是大約2003年左右,因為當年正是我轉做寫程式的時候,但其實這篇文是2001年出來,在台灣和中國大陸都廣泛流傳。
這篇文章叫做<程式與香雞排>是台灣一名叫蔡學鏞先生寫的文章,如果我沒有交代他是什麼人,可能你會當他和我一樣,
只是一個平庸的怨氣IT友。

就看看蔡學鏞的個人簡介:
蔡學鏞先生小檔案
蔡學鏞,台灣省台南縣人。畢業於台灣清華大學資訊系(Computer Science)碩士班。1983 年的夏天,蔡學鏞就讀小學時,開始學程式設計。這一路下來,使用過的程式語言依序為 BASIC、dBase III+、Clipper、C、x86 組合語言、C++、Java、C#。這些年來,程式設計也從個人的純興趣,變成學業,再變成工作。不管是變成學業還是變成工作,蔡學鏞對於程序設計的興趣未曾稍減。除了程式設計之外,蔡學鏞也喜歡音樂、電影、閱讀、寫作、繪圖、唱歌。

蔡學鏞目前居住在台北市,擔任的工作包括了:軟體公司的軟件工程師兼講師、出版社與雜誌社的作者與編輯、軟件技術諮詢顧問。

這段時間,有人再次談論起這篇<程式與香雞排>,是因為有人在比較台灣10年前和10年後的IT業,
大家有興趣可能看看mobile01網站30多頁的討論串,看過後,2009未時,台灣的IT業和香港有很多相似的地方,例如:
  1. 台灣一般有幾年經驗的Programmer人工約70,000新台幣,等於約17,000港元,在台灣,$TWD 70,000這個價已經是樽頸位,同樣地在香港有幾年經驗的Analysis Programmer有$HKD17,000已經很好運。
  2. 薪金同樣追不上物價通漲,樓價高企的時代。
  3. 台灣有很多One-Man-Project,寫好後,測試一下就交貨收錢,香港亦是。
  4. 業界人踩人的惡性競爭下,台灣的軟件訂單利潤太低,程式員的薪金都不會高得幾多,和香港一樣,什麼$HKD 1,000一個網頁程式...

當然還有很多相同之處,大家看過就明白。

其實台灣有賣雞扒,香港做Programmer又何嘗不是慘過斬叉燒呢...據說天水圍有個地方賣叉燒飯送半隻咸蛋只需要$25,但一天可以賣過百多盒,假設一盒利潤有$15的話,一天已經隨意賺千多元,不要以為我想順勢就吹牛,住天水圍的人應該知道吧,因為都是在香港討論區見到有人介紹我食的。

當然最後就一定要看看<程式與香雞排>吧,如果你是同行,看過後,你想一想這其實是2001年的文章,再想一想今天,你可能和我一樣歎息,業界其實十年都沒有進步過。
<程式與香雞排>
http://csie-tw.blogspot.com/2008/09/blog-post_29.html
Mirror (內容一樣)
http://jeffchang001.blogspot.com/2008/09/blog-post_30.html

2010年8月30日星期一

Windows 7 高品質主題

Microsoft官方發佈了很多高質素的ThemePack,WallPaper都是1920x1200高解像的,其中Bing’s Best系列,以及各國風景系列都是十分美麗。
大家可以在Personalization Gallery home下載。
另外日本MSN發佈了日本VS2010主題的ThemePack,以日本夜景為主。
http://closeup.jp.msn.com/visualstudio2010/


正確應付ASP.NET 4.0的Request Validation

這個錯誤,我幾乎肯定每一個寫ASP.NET的人都會遇過 :
從客戶端(xxx)中檢測到有潛在危險的Request.Form 值。 說明: 請求驗証過程檢測到有潛在危險的客戶端輸入值,對請求的處理已經中止。...

若上網搜尋解決方法,有半數的答案都是叫你在Page Detective把validateRequest設成"false",Ajax CallBack的話可能會叫你在web.config加入<httpRuntime requestValidationMode="2.0" />就了事。

ASP.NET 4.0的Request Validation由以往2.0時的*.aspx層面擴大至web service (*.asmx)和http handler(*.ashx)層面 (請參考ASP.NET 4 Breaking Changes)。其實既然MS提供全面的防止跨網站(XSS)指令碼攻擊,我們何必把它關掉,如果你想你的網站安全,就必須在Client-Side和Server-Side下功夫。

在設計ASP.NET頁期間,大家都會知道如Button Control都會有OnClick和OnClientClick事件,但如果用上jQueryUI這類純HTML Element的話,大家自然會加上runat="Server",然後掛上Event Handler (如btnSave_OnClick),例如jQueryUI的Button:
<button id="btnSave" runat="server" type="button" OnServerClick="btnSave_Click">
<span>Save</span>
</button>
大家都明白 :
上述Button中的OnServerClick等於ASP.NET原生的Button Control的OnClick ;同樣地OnClick亦等於OnClientClick。

兩者可以並存,而且亦因為會先觸發OnClick的事件,之後再觸發OnServerClick,所以要避免出現Request Validation的錯誤,正確做法就是Post Form前,先用JavaScript把String做一HTML Encode,然後再Post至Server,才是正確的做法。

JavaScript的HTML Encode和Decode,簡單的可以用Replace方法,但我就使用PHPJS的方法,PHPJS中有兩個方法, htmlentities()html_entity_decode(),就是給你做Encode和Decode之用。

假設我有一個TextBox叫txtTitle,一個Button叫btnSave的話,那實際做法就是:
<script type="text/javascript">
$(document).ready(function () {
HtmlDecode();
});

function HtmlEncode() {
html = $('#txtTitle').val();
$('#txtTitle').val(htmlentities(html));

}
function HtmlDecode() {
s = $('#txtTitle').val();
$('#txtTitle').val(html_entity_decode(s));

}
</script>
<asp:TextBox ID="txtTitle" runat="server" MaxLength="100" Width="400" ClientIDMode="Static"></asp:TextBox>
<button id="btnSave" clientidmode="Static" runat="server" type="button" onclick="HtmlEncode();" onserverclick="btnSave_Click">
<span>Save</span>
</button>
這就會在PostBack前,先把txtTitle.Text做一次Encode,那就可以避免出現問題。

上述的程序其實已經做了Encode,所以Server那邊是否需要再做一次HttpUtility.HtmlEncode()呢,我就覺得看你是否對PHPJS或你自定義的方法是否信任,我就安全為上,寫入Database時都會再做一次HttpUtility.HtmlEncode()

2010年8月29日星期日

推薦使用SMPlayer播放RMVB

K-Lite Codec Mega Pack由6.2.0之後不再連帶任何商業的Codec,Divx和Real Codec日後都不再包含在內,所以我都很苦惱有什麼代替品,雖然安裝Real Alternative都是一樣,但始終對我這類有電腦潔癖的人,就是不太願意安裝太多有FootPrint的軟件。

不知為什麼大陸的日劇組總是喜歡轉做RMVB格式發佈,其實今時今日RMVB已經再沒有優勢,在個個都用寬頻上網和BT的環境下,根本300MB和1000MB其實分別已經不大。

我找遍Google都再找不到Codec Pack有Real Codec而且還有更新,例如PureCodec已經半死狀態。
所以我試一試VLC Player看看播RMVB效果如何,其實我都不是第一次用VLC,老實說,我對它的界面感覺很差,設定又很複雜。
PortableApps下載後,試試播RMVB,感覺好似有點一格格的Lag,Seeking又Lag,畫面好似怪怪地,好似比常淡色和較光,不到3分鐘我就刪除,我懶得去做調整。

之後再試MPlayer的變種SMPlayer,同樣是使用Portable版,下載之後,試播,效果很好。
完全沒有VLC的問題,但和我使用的舊版K-Lite比較之下,還是K-Lite比較好,主要是當我1680x1050 Full Screen時,K-Lite的起格情況沒有那麼嚴重,不過在沒有選擇情況下,我只好用SMPlayer做臨時方案。

20100828_202332-t.png

2010年8月18日星期三

VirtualBox安裝Mac OS X Snow Leopard

VirtualBox 3.2開始支援MacOSX,好奇心驅使下,安裝來玩玩。

我的電腦配備如下:
  • Intel Core 2 Duo E8400 (No OverClock)
  • Foxconn P35A-S P35+ICH10R Chipset
  • 6GB Ram shared 2GB給VirtualBox
  • Geforce 9600GSO
  • Host OS : Windows 7 64bits
  • Guest OS : Mac OS X Snow Leopard 1.3.6 Retail

過程就依照這個連結做:
http://henrynote.twbbs.org/27
唯一分別是這一步,若我跟著文中所做就會停在Console畫面:
1. 把光碟機的光碟釋放
2. 開機順序讓"硬碟"當第一個
3. 將"啟用EFI(僅特殊作業系統)"打勾

我解決方法是用回empireEFIv1085.iso,掛在CDROM做Boot機碟,取消使用VirtualBox的EFI。
但不知是否因為沒有使用回VirtualBox的EFI,所以我更改不到解析度,但我沒有研究下去,始終都只是用來玩玩而已。

還有些Blog文可以參考一下:
How to install Mac OS X Snow Leopard in VirtualBox (Windows or Linux host)
How to Install Mac Snow Leopard on VirtualBox 3.2 with Non Apple, Intel PC
Install Mac OS X Snow Leopard On Windows Using VirtualBox

其實實際使用上,不如外間說那裡慢,一般使用都覺得很順暢,當然你不可能用來行PhotoShop吧,上Youtube會有點Lag,但純粹想感受一下Mac OS的話,是不會令你失望的。

順手做了一個ScreenCast 給大家看看:

2010年8月14日星期六

使用ASP.NET+jQueryUI模擬WordPress的drag&drop widgets

有用過WordPress的網友都會知道WP可以靠Drop&Drop去修改網頁上的Widget位置,這做法有利於可以即時顯示排列結果。

既然是Client-Side的技巧,在ASP.NET上,當然可以做到。
有很多JS Framework都有提供UI Subset去給你直接使用,但我則還是使用jQueryUI去自建,因為明白整個Life cycle,由init到complete,我覺得是很重要的。

jQueryUI方面,你需要用上 Draggable + Droppable + Sortable

ASP.NET方面,當儲存後,下次再進入時,當然要還原之前所設定的,這時候你就需要使用BulletedList Control,因為BulletedList其實就是<ol>或<ul>。

先給大家看看效果,其實暫時未盡完美,因為應該當Drop完成的時候,所複製的<li>element已經要有[Edit]/[Delete] buttons,但大家見到我暫時還需要PostBack才正常顯示是因為未完成。

ASP.NET GridView jQuery Drag & Drop

以前我們要做資料上的Sorting,可能還要用一些箭咀按鈕去一個個排列,但大家應該都用過很多先進的CMS,都會以Drag&Drop形式去操作。
當然這類現代的UI,不會是PHP專美,ASP.NET一樣可以做到。

大家都知道GridView Control 經Browser Render後,其實就是一個HTML Table,所以說穿了這和GridView沒有關係,即使你用Repeater,Listview Control只要ItemTemplate是Table架構就可以做到。

這個Demo我是用ASP.NET 4.0 + jQuery的TableDnD plugin製作的,其實官方網站已有很多Demo示範如何使用,所以我都沒寫 Tutorial 了,只是做一個screencast給大家看看效果,相信已經足夠。

不過大家可能會問影片中的Alert那些字串是什麼,其實就是當onDrop的時候所產生的Array,用途是給你做Ajax update之用。

2010年8月9日星期一

Eclipse artifacts.xml ???

今天突然在D:\ Driver出現一個artifacts.xml File。
位於
D:\_opt\public\technology\epp\epp_build\36\eclipse.S-3.6RC4-201006031500\

由於我用的Eclipse只是PDT+Subclipse,相信是Subclipse update後出現的,
此文章的連結

2010年8月6日星期五

Entity Framework 4.0 : No support for Auto-increment primary keys

EF4是一個不錯的ORM,配搭SQL Server是無敵的組合,但如果用EF4配合SQLCE的話,你可能要重新考慮一下。


無論LINQ2SQL或EF4,一個Table的Primary Key/Unique Key都很重要,因為做Insert/Update/Delete時,在SubmitChange()之前,.NET Framework就會用identifier把需要修改的Entity記起。
一般情況下,Create Table很自然會把id設定做INT / PrimaryKey / IDENTITY(1,1),但如果是SQLCE的話,會怎麼樣呢?

當你使用VS內建的Generator建立EntityModel *.edmx都沒有問題的,但只要你一做修改,就會出現Error
NotSupportedException Message=Server-generated keys and server-generated values are not supported by SQL Server Compact.

原因在Technet已經有解釋:
SQL Server Compact does not support entities with server-generated keys or values when it is used with the Entity Framework. When using the Entity Framework, an entity’s keys may be marked as server generated. This enables the database to generate a value for the key on insertion or entity creation. Additionally, zero or more properties of an entity may be marked as server-generated values. For more information, see the Store Generated Pattern topic in the Entity Framework documentation. SQL Server Compact does not support entities with server-generated keys or values when it is used with the Entity Framework, although the Entity Framework allows you to define entity types with server-generated keys or values. Data manipulation operation on an entity that has server-generated values throws a "Not supported" exception.

唯一解決方法,就是把INT轉做uniqueidentifier類型,而Default value設定做NEWID(),那每次新增一個紀錄就會自行輸入新的Row ID。


在程式碼方面,無論LINQ2SQL或EF4.0都會把uniqueidentifier的資料類型視為GUID (順便一提,GUID全名是Microsoft's Globally Unique Identifiers,和GUI (graphical user interface)無關),所以如果要做Where的程序時,就必須把Value轉成GUID,例如 :
private void cbAccount_SelectionChanged(object sender, SelectionChangedEventArgs e) {
dataEntities de = new dataEntities(EntityConn);
Guid guid = new Guid(cbAccount.SelectedValue.ToString());
var select = from val in de.account_value where val.account_id.Equals(guid) select val;
foreach (account_value v in select) { Console.WriteLine(v.value); }
}

或者有人擔心重覆的問題,大家可以看看維基百科,都幾有趣的。
與被隕石擊中的機率比較的話,已知一個人每年被隕石擊中的機率估計為170億分之1,等同於在一年內建立數十兆筆UUID並發生一次重複。換句話說,每秒產生10億筆UUID,100年後只產生一次重複的機率是50%。如果地球上每個人都各有6億筆UUID,發生一次重複的機率是50%。

其實我個人都有點不太認同把EF不支援INT類型的PrimaryKey,因為實際使用上,uniqueidentifier的確不方便,在我網上Research的同時,很多人都寧願使用回傳統SQL就算。

2010年8月1日星期日

不懂Java也可以自制Android程式

原來Google推出了一個叫App Inventor的工具,透過Drag & Drop就可以做Apps。
不過我個人覺得Google在管理contribution方面就差一點,Android market是這樣,充斥著大量垃圾,Android market有大量比堅尼女郎Apps...還有部份測試的Apps...
Chrome extension亦是這樣,extension數量就夠多,但奇形怪狀的都多。

可能Google都知道這問題,所以由這個App Inventor做出來的Apps不可以publish至market賣,否則market很快便淪陷。

20/Mar/2012 Update:
App Inventor已由麻省理工接手繼續開發,參考:
App Inventor Edu | Playing with blocks, building apps
AppInventor.org: Democratizing App Building
MIT App Inventor



香港的軟件開發示意圖

給準備入電腦行業的中五生,中七生,IVE生,大學生...
http://www.projectcartoon.com/