2011年3月23日星期三

Firefox 4 正式版來了!



三大瀏覽器最後一員Firefox終於官方正式推出第4代了,其實昨晚在moztw已經看到在FTP可以下載,苦等一天後主頁都更新了。

再說有什麼新功能,新特點已經是舊聞,不如說說我自己的選擇。

其實自己用軟件沒有Fans向的問題,就三大來說,我暫時只不會考慮Google Chrome,原因有三個。
  1. Extension選擇始終較少,就一般我常用的NoScript,AdBlock,在Chrome的版本可以用奇奇怪怪去形容。不能說是無效,但用起上來例如加Url等等就始終不如Firefox更就手。而且較進階的如iMacro,Chrome版本是十分差的。
  2. Chrome使用上習慣問題,Chrome的操作上,我總是不習慣,要說出例子,很難,但我相信大家或許會有同感。
  3. UserScript支援性較Firefox差,沒有GreaseMonkey的情況下,有很多明明在FF上是UserScript的,在Chrome上需要轉寫成Extension,雖然Chrome是支援UserScript,但用FF我不用擔心相容性問題。

這是我自己的原因,當然各花入各眼吧。

至於IE9,其實的確比IE8優良很多了,起動速度快(因為沒有Extension?),瀏覽速度等等都很快。
但不得不承認IE我比較用在工作上多,在家裡都是FF做主打。
始終當今做網頁程式的,首要都是要兼容IE,而不是FF。特別是商業客戶或者政府機構,沒通過IE,休想可以收工....
所以EndUser可以放棄IE,但我就不可以了。

其實近這一年很多人都說"XX比較快!!!所以我會用它~",令我回想3DMark時代,如果你是數據派就沒有什麼好講,基本上這類Benchmark換算成現實情況,其實未必相差大,三者的效能其實已經拉得很近喇。

再來就是跟Firefox 3.5時一樣,Mozilla搞了一個Firefox 4 下載統計,大家可以看看。
http://glow.mozilla.org/

2011年3月16日星期三

HTML5補習班

在EndUser的世界可能未感受到,但在開發人員的世界,就像之前的Ajax熱一樣,焦點已經開始集中在HTML5,相信不出一年就會是很熱門的技術。
應該還有不少人對HTML5陌生,分享一些我Delicious上的HTML5 Bookmark給大家,大家特別要看看Flash/Silverlight的殺手 - WebGL!!

了解篇

HTML5 Presentation - 由零開始介紹HTML5新元素 (店長推薦!!!)
http://slides.html5rocks.com

HTML5 Rocks - HTML5資願集散地,算是現時最齊全的HTML5網
http://www.html5rocks.com/

HTML 5 Demos and Examples - 大大小小的Demos
http://html5demos.com/

HTML5 Test - 測試你的Browser支援多少HTML5新元素
http://html5test.com/

Canvas Demos - 有很多用Canvas製造的HTML5 Game
http://www.canvasdemos.com/

入門篇

W3Schools HTML5教學 - 網頁程式員沒可能不知的W3Schools都開始HTML5教程
http://www.w3schools.com/html5/

WebGL篇

就我自己認為WebGL才是HTML5最大的賣點,看過你就知點解。
HelloRacer™ WebGL
http://helloracer.com/webgl/

測試篇

三大Browser廠牌Google,Mozilla,Microsoft都有推出自家的HTML5技術演示網站。
Google Chrome
Chrome Experiments
http://www.chromeexperiments.com/


Microsoft Internet Explorer
Test Drive
http://ie.microsoft.com/testdrive/


Mozilla Firefox
Web 'O Wonder
https://demos.mozilla.org


List of WebGL Framework
http://www.khronos.org/webgl/wiki/User_Contributions#Frameworks

HTML5 Game - 塊魂


唔知大家玩過塊魂未,我自己就PS2/PSP/Xbox360版就好鐘意玩,現在有HTML5版,直接起網頁上吸HTML Element!!!

HTML5で塊魂をプレイする Katamari Hack
http://japanese.engadget.com/2011/03/13/html5-katamari-hack/

IE9 正式版有了!!!



IE9終於都出正式版,立即試用過後,覺得起動速度快過8代,運行複雜的Javascript網頁當然是很快,始終IE9速度和Chrome 10/Firefox 4不相伯仲。
而我終於可以在IE上看到自己的Blog不再因為CSS3問題變得醜陋,之前IE8看自己的Blog,Round Corner沒有了,文字出狗牙,很多都出現走位情況,現在好很多了。

功能上就真的有點落後,連很基本的,而Chrome 10/FF4都內建的"貼上並前往"都沒有,"複製圖片連結"也沒有...
當然大家很早就知道IE9依然沒有什麼所謂Extension,所以我目光都會依然放在FF4身上,IE9剛推出,就盡量在蜜月期用多幾天...

Download Internet Explorer 9
ie9.tw
探索 Internet Explorer 9
http://windows.microsoft.com/zh-TW/internet-explorer/products/ie-9/features

2011年3月11日星期五

網頁程式員必須知道的Web Test

假如你找工作時,遇到有人問你 : (你的網頁程式是如何做測試的?)
最常見的答法或者是:(完成後,自己試試,看看有沒有Error,速度好不好,試一試如SQL Injection之類的安全性。)
或者會"專業一點"答:(做一做Unit Test,Stress Test吧。)
但如果再追問你:(做多少次?)
面對這個問題,無論你答多少次都是Fail...

就如上面所講,很多人都知道什麼是UnitTest,LoadTest,StressTest,即使沒有做太多,但都有概念。
但以現今複雜性高的網頁程式來說,單單對程式碼做UnitTest,針對Server做StressTest其實不夠意思。

倒不如做我現在要說的Web Test
Web Test的意義在於實際模擬使用者情況下操作程式,使用者數目可以是單人或模擬多人使用,並循環地測試。

如一開始所說,試想一想你要測試一個Registration Form,人手做一千次,每一次資料要不同,你想一想時間要多久?
或者測試一個Shopping Cart,由登入 > 購買 > Checkout > 打Billing/Shipping Address 到完成,即使有一些AutoFill Form軟件幫助,相信做100次你已經夠悶。

所以我們需要靠一些WebTest軟件幫助,如果你比較熟悉Visual Studio,你應該聽過Visual Studio Team System版本,VSTS版本其中一個獨有功能就是Web Testing,但我暫時不打算介紹它,始終VSTS是較特殊版本,未必很多人有機會使用到,而且假如你寫PHP,Ruby & JSP的話就用不到。


基本上這類軟件大前題就是要做到Automated,全自動化去代替人手測試,如果在Google搜尋Web Test Tool Software,你會找到很多形形式式的軟件,但今次我想介紹給大家三套免費Free的WebTest Software,而且是比較易上手的。

1. iMacros
有使用Firefox的人一定不會陌生,因為iMacros是長期穩佔官方Firefox Extension的主頁上。
iMacros可以整合Firefox,亦有IE的版本。
隨了可以記錄你Mouse/Keyboard操作,還有兩種錄影模式,一種是用Form Element的ID去記錄,另一種是X/Y定位形式。
功能上都很夠一般使用,支援Random資料輸入等等。
但缺點就是你只可以模擬一個使用者,雖然你可以開多個Browser操作,但我自己所測試,有機會會Crash。
另一樣缺點就是Random資料的Data Soruce你需要自己寫Javascript或者用VBScript連接DataBase。
但無論是個人或商業用都是免費的。


2. Badboy
很另類的軟件名稱,這個是獨立軟件,不依靠任何Browser。
跟iMacros功能大致一樣,但其中一樣我喜歡的是Data Source方便比iMacros做得好很多。
無論Excel或SQL,Badboy可以經ODBC去連接取得資料。
而且更可以以Multi Thread形式去模擬多使用者
但不是沒有不足之處的,首先是Badboy的Browser Engine是IE,即使最新版本都不能轉Firefox或Chrome,而且軟件本身免費授權方式是非商業用。



3. Load Tester Free
這個是最專業的一個,除了上述所講的錄影,DataSource,模擬多使用者功能,還包含一些 Profilering /Stress Test功能,亦有詳細報告等等。
免費版本和收費版本分別是,免費版最多模擬10人使用和有限度去記錄Report項目,但其實我覺得都很夠了。
另外吸引我之處是這款軟件對ASP.NET作出針對性優化,ASP.NET是有一種東西叫ViewState,ViewState消失的話,整個ASP.NET頁面便告死亡。
所以在做自動化工作時,維護ViewState很重要。
有興趣可以看看 Load Testing 101: ASP.NET Web Applications



以上三款軟件,我自己暫時使用iMacros,不排除會轉用其他兩個,始終各有優缺點。
最後想說的是,就我個人而言,我自己都很少做Unit Test,除了工作時間緊迫關係之外,我覺得做這類實際的Web Test比較重要。
因為WebTest最大意義是自己做一次UAT程序。
配合程式本身的Exception Logging,其實都已經足夠。

Visual Studio 2010 SP1 有了


MSDN Subscriptions User已經可以見到Release版本。
公開下載應該都是這幾天。

Visual Studio 2010 SP1的主要更新點:
  • Includes Microsoft Silverlight 4 Tools for Visual Studio 2010
  • New Performance wizard for Silverlight
  • IntelliTrace for 64-bit and SharePoint
  • IIS 7.5 Express support
  • SQL Server CE 4 support (available as separate d/l)
  • Preliminary HTML5 and CSS3 support
  • New Razor Syntax Support (available as separate d/l)
  • Support for Microsoft Web Platform Installer (PI)
  • WCF RIA Services V1 SP1
  • Unit Testing support for the .NET Framework 3.5


更詳細的ChangeLog在這裡 - Description of Visual Studio 2010 Service Pack 1

2011年3月8日星期二

當女軟件工程師的那些好處

Jean Hsu:当女软件工程师的那些好处
http://blog.jobbole.com/539/
Google前女軟件工程師分享她的工作經歷
http://blog.jobbole.com/500/

老實講,我知這樣說會得罪很多人,但都現實的說一句,如果佢係醜女的話,整件事的結局已經不同...
所以應該把標題改做 : ( 当美女软件工程师的那些好处 )
回看小弟自己在職場上的經歷和主觀的睇法,不是職業的關係,而是本身樣子比較好的女性,在職場上不論各行各業,根本是佔優勢。

Jean Hsu照片


Jean Hsu Blog
http://www.jeanhsu.com/
原文:
The Benefits of Being a Female Software Engineer
My Experiences as a Female Software Engineer

2011年3月5日星期六

VB vs C# 2011版

沒完沒了的爭論,每年外國都總會有人身先士卒發一個類似的文,我在這個Blog都轉貼過幾次了。
但每次看這些"VB vs C#"我又覺得很有趣。

不過無可否認,VB的確是在死亡中,死因都是源自一些謬論。

例如 :
  • 寫C#的人專業一點。
  • 用C#寫的軟件穩定一點或效能一點。
  • VB只是適合學校教學使用或兒童Langauge。
但我對VB有情意結,而且沒有VB的.NET Framework太沉悶了。

以下幾條Link是前幾天在Google Reader見到,都有過百人回應 :
Should I abandon VB.Net?有百多個回應!
留言引伸至其他網站:
http://news.ycombinator.com/item?id=2274986
http://www.reddit.com/r/programming/comments/fuy1t/should_i_abandon_vbnet/

2011年3月3日星期四

當EF LINQ Expression遇上Methods

若你跟我一樣之前有用LINQ to SQL的話,總會有機會把Extension Methods與LINQ Query結合,就算沒有,toString()這個Object Method或者Convert.ToString(),你都沒可能未用過。

在LINQ to SQL或者LINQ to Object的時候都是相安無事的。

但在Entity Framework上,情況就有不同。

先看Extension methods :
    public static class ExtensionMethods
    {
        public static int ToInt(this String str)
        {
            return Convert.ToInt32(str);
        }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        using (AdventureWorksEntities awe = new AdventureWorksEntities())
        {
            string s = "1";
            var select = from p in awe.ProductModel
                         where p.ProductModelID == s.ToInt()
                         select p;
            Response.Write(select.Count());
        }
    }
很無奈,你會得到錯誤訊息:
中文:
LINQ to Entities 無法辨識方法 'Int32 ToInt(System.String)' 方法,而且這個方法無法轉譯成存放區運算式。

英文:
System.NotSupportedException: LINQ to Entities does not recognize the method 'Int32 ToInt(System.String)' method, and this method cannot be translated into a store expression.

可能你會說,不用Extension Methods就可以了,但原來ToString()和Convert.ToString()都會出現類似錯誤。
再看看:
    protected void Page_Load(object sender, EventArgs e)
    {
        using (AdventureWorksEntities awe = new AdventureWorksEntities())
        {
            object obj = "abcd";
            var select = from p in awe.ProductModel
                         where p.CatalogDescription.Contains(obj.ToString())
                         select p;
            Response.Write(select.Count());
            //錯誤訊息:LINQ to Entities 無法辨識方法 'System.String ToString()' 方法,
            //而且這個方法無法轉譯成存放區運算式。
        }

    }

    protected void Page_Load(object sender, EventArgs e)
    {
        using (AdventureWorksEntities awe = new AdventureWorksEntities())
        {
            object obj = "abcd";
            var select = from p in awe.ProductModel
                         where p.CatalogDescription.Contains(Convert.ToString(obj))
                         select p;
            Response.Write(select.Count());
            //錯誤訊息:LINQ to Entities 無法辨識方法 'System.String ToString(System.Object)' 方法,
            //而且這個方法無法轉譯成存放區運算式。
        }
    }

那原因是什麼呢?
根據這裡這裡這裡所講。

L2S和EF其中一個最大分別就是,EF把LINQ expressions區分為Client的CLR Method和Server的Canonical Function
因為EF轉換expressions成SQL時,就必須參照兩者進行轉換。
可以參考MSDN上的CLR Method to Canonical Function Mapping

而大家所見列表中並沒有ToString()和Convert.ToString(),更莫說自定義的Extension Methods,所以才會出現錯誤 : System.NotSupportedException: LINQ to Entities does not recognize the method.

2011年3月2日星期三

IIS7導致WebService無效?

今天工作上的ASP.NET Project莫名其妙出現兩個錯誤。
我的開發環境和Project架構都很簡單 :
  1. VWD 2010
  2. ASP.NET 4.0
  3. jQuery 1.4.4
  4. JSON.NET
  5. ASP.NET內建的Dev Server
  6. CodePlex上的CassiniDev
整個Project已經做了個多月,一直在本機上沒有問題,今天想試試上傳去Windows Server 2008的IIS7.5上試試運行,誰不知就出現jQuery Ajax失靈,唯有用IE的Developer Tool看看,使用jQuery.Ajax的error function觀看responseText properties,得出Exception Message說原因來自WebService。
System.InvalidOperationException: Request format is unrecognized for URL unexpectedly ending in '/getRecords'.
System.Web.Services.Protocols.WebServiceHandlerFactory.CoreGetHandler(Type type, HttpContext context, HttpRequest request, HttpResponse response)
System.Web.Services.Protocols.WebServiceHandlerFactory.GetHandler(HttpContext context, String verb, String url, String filePath)
System.Web.MaterializeHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
來看看Code部份:
function getRecords(RecordID) {
   $.ajax({
            type: "POST",
            url: "WebService/ClientCallBack.asmx/getRecords",
            data: "{ 'RecordID': '" + RecordID + "' }",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (msg) {
            var json = JSON.parse(msg.d);
            $.each(json, function (idx, item) {
                alert(json[idx].Title);
                //Do Something Else
            });
        },
        error: function (err) {
            alert("error : " + err.responseText);
        }
    });
}
using Newtonsoft.Json;

[WebMethod]
public string getRecords(int RecordID)
{
List<DataContractClass.Records> jsonlist = new List<DataContractClass.Records>();
DataContractClass.Records r = null;
using (ReferralDBEntities de = new ReferralDBEntities())
{
int id = 0;
var records = from pack in de.ReferralPackages
where pack.RecordID == RecordID 
orderby pack.CreatedDate descending
select pack, item;

foreach (var rec in records)
{
r = new DataContractClass.PatientRecords();
r.PackageID = rec.pack.PackageID;
r.Title = rec.pack.Title;
//and more...
jsonlist.Add(r);
} 
}
return JsonConvert.SerializeObject(jsonlist);
}

由於那個WebService是用EF4加JSON.NET回傳Json String,所以我在Browser直接打上<http://www.mydomain.com/WebService/ClientCallBack.asmx>試試,但竟沒有問題,再看看jQuery部份,兩者實在沒有微調空間,
jQuery最重要的兩行我都有了。
contentType: "application/json; charset=utf-8",
dataType: "json",

試了很多方法都不行,最後唯有Google再Google,找到這篇文章
問題大概是會出現在當IIS7的Application Pool設定Managed pipeline mode成<Integrated>才發生。
而解決方法是在web.config的system.web段中插入下面的設定就搞定。
<system.web>
<webServices>
<protocols>
<add name="HttpGet" />
<add name="HttpPost" />
</protocols>
</webServices>
</system.web>

但事情還未解決...之後又出現新的錯誤:
System.InvalidOperationException: Request format is invalid: application/json; charset=utf-8.
at System.Web.Services.Protocols.HttpServerProtocol.ReadParameters()
at System.Web.Services.Protocols.WebServiceHandler.CoreProcessRequest()

而解決方法則在這裡找到
在web.config加入
<system.webServer>
<handlers>
<add name="ScriptHandlerFactory" verb="*" path="*.asmx" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<add name="ScriptHandlerFactoryAppServices" verb="*" path="*_AppService.axd" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
</handlers>
</system.webServer>

就大功告成。

第一個問題成因在KB article中有解說。
<By default, in .NET Framework 1.1, HTTP GET and HTTP POST are both disabled. This is for security reasons.>
雖然文中說是.NET 1.1問題,但解決方法卻是一模一樣。

而第二個問題就是,其實在IIS7的Manager上的Handler Mappings部份已經可以見到有ScriptHandlerFactory,
但就是沒有preCondition="integratedMode"一項,所以相信為什麼在Managed pipeline mode=<Classic>沒有問題,但轉成<integrated>就會產生錯誤。

2011年3月1日星期二

Google Picasa Web 無限儲存空間

我前幾天才把心一橫把Picasa的相片搬至DropBox....亦很辛苦的把DropBox谷至19.75GB....
但始終DropBox的相簿部份不太好用,存放檔案Hotlink給人下載就真的不錯。

看到這裡Google Picasa 網路相簿開始提供「技術性」無限容量上傳空間!,詳細可以進這網站看看。

現在Google已經更新為
Google+ 為您的相片免費提供儲存空間,並且會自動將您的相片大小調整為 2048 像素。如同「Picasa 網路相簿」,只要上載的影片長度不超過 15 分鐘即可免費儲存。
參考:
Picasa 網路相簿和 Google+

換句話說,只要開通Google+服務就可以享有"無限儲存空間"了。

WP-Plugin SlideZoom v1.4.0 Release!

超過半年沒有更新,因為自己實在沒有太多時間,但其實這個PlugIn自己都很重視,因為我自己都是經常使用的。
但對於這個Plugin的使用人數就不太滿意了,在Google Search的話 :
http://www.google.com.hk/search?q=SlideZoom會得出共約 2,830 項結果,
但這個PlugIn其實已經差不多兩歲了.....

不過怎樣都好,盡可能都會繼續更新下去,
新版本下載 / Changelog / Demo去專頁吧。
http://tatmingstudio.blogspot.com/2009/03/slidezoom.html