2009年12月16日星期三

外判的禍

我Google Reader訂閱的幾個Blog都同時講呢件事,大概係中國Microsoft一個新網站抄襲另一個叫Plurk的網站。
可以睇下以下兩個網站就知什麼事。
電腦玩物 : 中國微軟的MSN聚酷疑似剽竊噗浪程式碼
Live Sino : MSN 中国“抄袭门”:聚酷抄袭 Plurk 界面和源代码

據說是Layout Design連Javascript Source Code直接Copy過去....
microsoft_copy_plurk-t.jpg

但是反而由這件事我才知道原來中國Microsoft部份產品是一間外判公司承包的 -
原文 : 美斯恩(MSN 中国)的品牌危机?

咁就解開我一直的疑問,記得之前我有用MSN群的時候,我實在不太明白Microsoft中國為什麼接受咁多廣告,而且那個MSN群的PlugIn又不似是Microsoft的作風。
原來中國Microsoft把部份業務外判,是次抄襲事件,就正正反映電腦業務外判問題。

2009年12月15日星期二

4 iPhone UI & Fluid TouchFLO Library for Windows Mobile

類似iPhone的轉頁效果,HTC公司早以用TouchFLO做到,但其實.NET CF上的軟件,自己都可以做。

CodePlex上就有4個這類Library,令你寫的WM軟件更加"iPhone"。

首先是iPhone UI,模擬iPhone介面,程式Menu:
http://iphoneui.codeplex.com/
較深入可以看看 : http://www.codeproject.com/KB/mobile/IPhoneUI.aspx
iphoneui_1-t.jpgiphoneui_2-t.jpg

另外3個就是TouchFLO換頁效果,
Touch UI
http://touchui.codeplex.com
Project Description :
This sample will help you build great looking and touch-enabled user interfaces for Windows Mobile and Windows phone (using compact framework).


Mobile UI
http://mobileui.codeplex.com/
Project Description :
An application framework for developing composite user interfaces (similar to Silverlight/WPF) on Windows Mobile 5 and 6 devices. It contains controls and graphic primitives that support rotation, scaling, animation, behaviours and transitions. Make awesome looking WinMo apps.


Fluid - Windows Mobile .NET Touch Controls
http://fluid.codeplex.com/
Project Description :
Fluid is a .NET 2.0 control library for Windows Mobile 6.0/6.1 with touch controls.

香港高登Windows Mobile版

現在寫的Windows Mobile版高登,進度非常之好,我花了星期六和星期日各一點時間,已經寫好大部份討論區的功能。
進度如下:
  • 抓取吹水台Topic List - 100%
  • 觀看內文 - 100%
  • 登入 - 100%
  • 開新 - Post 30%
  • 回Post - 30%
  • 引用文章 - 100%
  • 搜查文章 - 100%
  • 將高登Icon轉至Local Resource - 0%
  • Bookmark - 0%

最困難除了高登Server本身非常之慢,測試困難之外,其次就是介面上,手機軟件的世界和Windows軟件可謂兩個世界。
電腦上,空間比較大,設計介面上自由度大很多,但手機上,要如何盡量利用320x240的有限空間顯示資料就已經很考功夫。
另外就是.NET Compact Framework提供的Controls實在太簡化,功能少,樣子醜陋。
所以唯有自己寫UserControl,雖然網上有商業的UI Controls,但閒閒地都要幾千$$$,好貴。
免費的又不合用,我只想要一個類似Repeater的東西。

打開Visual Studio 2010 Beta2看看,原來還未包含.NET CF,上MSDN看,Microsoft似乎會Port現在的WPF去.NET CF 4.0去對抗iPhone UI。
預計這個WM版高登新年前應該可以完成吧。
2009-12-14-20-43-42-t.png

Thunderbird Addon - CompactHeader

我用Email Client沒有什麼要求,純粹用來看Newsgroup多,Thunderbird 3.0版沒有什麼驚喜,但就修改了Message Header欄的大細。
舊版可以打開/摺合,3.0新版反而不可以,而且顯示更多無謂資料。這對我來說很不便,因為我在公司偷偷地看Newsgroup時,Thunderbird 要開到很細才不會被捉到。

好彩有人和我一樣都抗拒這個新設計,有人做了一個Addon叫CompactHeader可以摺合它,省回一點空間。


CompactHeader :
https://addons.mozilla.org/en-us/thunderbird/addon/13564

2009年12月8日星期二

Google也有Free DNS了

Google都開放類似OpenDNS的DNS服務
DNS Address為
8.8.8.8
8.8.4.4

OpenDNS的相比
208.67.222.222
208.67.220.220

我想Google的,會比較易記。
其實這類DNS服務很好用,好多時我家用,Server,甚至PSP,NDS,手機的Wifi設定都用這類DNS。

Google Public DNS
http://code.google.com/intl/zh-HK/speed/public-dns/

2009年12月4日星期五

日本IT行業 35歲退休傳說

唔~原來日本IT業個環境同香港差唔多~大概都係話做IT做到約40歲就要搾兜,工時長,人工低。
雖然係日文,但係有打機Level既日文程度應該都睇得明。
我Quote左主要果幾段,全文就要睇下Link。
轉自:http://allabout.co.jp/career/corporateit/closeup/CU20080220A/

IT業界の人間はどの業界へ転職するのか


ITを提供しているITベンダーに勤務している人がどの業界へ転職しているかの調査です。

54.5% 会社は違っても同じITベンダーへ転職した人
45.5% 別の業界へ転職(流出)した人

た だ同じITベンダーと言いながらIT系以外の職種(営業、経理、人事など)へ移ることもありますし、別の業界と言いながらユーザー企業のシステム部門へ転 職する人もいます。移った業界で多かったのが「商社・流通・小売業」、「建設・土木・不動産」、「教育・研究」でした。

次はIT業界の勤 務経験がある転職経験者についてのアンケート調査です。仕事内容がIT関係から同じIT関係となり、引き続きITに関する仕事をしている割合が36.8% でした。ITからの人材流出、つまりITとは全然関係のない別の仕事に転職した人が45.0%になっています。


満足度の高い職種、低い職種


全体では半数(47.6%)の人が転職前の仕事に「満足」と回答しています。次に職種別に満足度をみてみましょう。

■「非常に満足」、「満足」と答えた割合が高かった職種ベスト3
1位 81.8% 研究開発・特許
2位 63.6% セールスエンジニア
3位 59.3% オープン・Web系SE
※「その他」はのぞく

■「非常に不満」、「やや不満」が多く満足度の低い職種ワースト3
1位 22.2% 制御・組込系SE
2位 38.5% 通信・ネットワーク・サーバSE
3位 39.6% プログラマ

転職する理由


回答者全員に尋ねた「転職の理由」です。
1位 給与・待遇が良くない
2位 会社の将来性が見えない
3位 仕事の内容にやりがい・面白さが感じられない


労働時間が長いが転職理由

■IT関連職種から別職種へ転職した理由
1位 給与・待遇が良くない
2位 労働時間が長い
3位 会社の将来性が見えない

2009年12月1日星期二

Office 2010: The Movie

IT搵工哀歌

起香港討論區,淡友集中地-資訊科技版搵到呢張圖,睇完呢篇文,冇乜感覺,只因文中既說話我自己都講得太多。
其實諗返當初我有機會免學分讀IVE HD,真係唔應該揀讀電腦...令到我Degree都要順勢讀返電腦。如果俾我重新揀多一次,我會讀社工,除左幫到人,人工高之外,就係前景好,香港未來只會有更多社會問題,需要更多社工。

不過其實電腦行業,工作空缺真是"一浸浸"的,有時幾日既Job AD都未必有一份岩自己,但有時就一連有幾份心水。
所以我見到香港討論區網友經常追求"專業"資格,
不如盡量裝備自己,而且做電腦最忌"乜都識,冇樣精。",到有好工時至知道未夠料已經太遲。

雖然有好多人都同我講過話學咁多o野,最後都係"Dup石仔",但做得耐電腦呢行,深明"技術"未必係升職條件,但絕對係生存條件,就算突破唔到樽頸位,做唔到管理級數,但起咁惡劣既行頭下,至少亦未怕失業。不過我自己每天都仲係"捱驢仔",預計最做到4月,岩岩好夠一年又要轉工了。

Google Wave Invitations

有人想試玩就留言給我吧。

2009年11月18日星期三

香港人製作的出色XNA遊戲

微軟的XNA推出了幾年,甚少見到亞洲區有作品,其實國外一樣都不算多,始終開發一隻遊戲,粗略去做都要一年半載,程式加美術還要種種功夫,人力物力不會少,寫完出來即使自己有滿足感,但沒有人玩都好像沒有太大意思。
而且正如早前我聽過一句話:( 起香港,搞High Tech就High o野,Low Tech就真係撈o野),咁既情況下,要香港還有人去寫Game真係難上加難。

不過今日見到一個Blog,有幾個幾高質素的XNA遊戲 (當然你不能搵商業作品去比較...),一開始我見到個Blog是繁體中文,以為是台灣人。
最後看多幾下至知道原來係香港人出品!!!
其實香港已經很少熱心的人非謀利咁去做開發了,值得支持一下。

Zephyr[XNA] : 遊戲設計 X 遊戲開發
http://koetap.mysinablog.com/
Hong Kong Indie Game Development Blog
http://percytse.blogspot.com/


2009年11月17日星期二

Object Oriented CSS Framework For ASP.NET & PHP

無論你是寫網頁程式還是網頁設計,近幾年應該經常聽到Framework這個字。
Javascript有Framework (jQuery, ExtJS, Prototype...) ; PHP有Framework (Zend , CodeIgniter , CakePHP ...) ; ASP.NET本身屬.NET Framework,最近又有MVC Framework等等。

或者很多Web Designer看到"Framework"這個字,都會避之則吉,看似都是和Programming有關,但如果你忽略了的話就走寶了。

近這一年,CSS Framework慢慢冒出來,在delicious.com都開始很多同類Bookmark,亦有很多討論區開始比較各種CSS Framework。

如果你想了解什麼是CSS Framework,建議先看看這幾篇文章。
Definitive List of CSS Frameworks – Pick Your Style
CSS Frameworks: Pros and Cons
CSS framework 利弊淺見

現時CSS Framework大概分兩種,大多數的一種是本身已經定義了很多Style,例如Grid式的Table Template,Header或Footer Style,甚至排板方面都可以直接套用CSS Framework而快速建立完整Design。由於現時CSS Framework定義其實沒有很統一,不同的CSS Framework提供不同的"功能",但肯定的是,全部都輔助你快速建立Layout。

提供一個CSS Framework選擇參考連結:
10 Promising CSS Framework That Worth A Look

至於另一種亦是我有興趣的是Object Oriented CSS Framework,這種Framework是針對編寫CSS方面,和之前講的一種相反,本身並沒有包含"罐頭"的"即食"樣式。
CSS加上Object Oriented,本身兩種在網頁開發上沒有關係的字詞,很難想像到會是什麼,但看到以下例子後,如果加上少少Programming知識,你就明白箇中奧妙。

Variables
把@brand_color設定成變數重覆使用,假若日後要更改的話,只需要修改一行就可以。
@brand_color: #4D926F;

#header {
color: @brand_color;
}

h2 {
color: @brand_color;
}

Mixins
Define 名稱為rounded_corners 的 Property後,可以整個打包去其他的style中使用。
.rounded_corners {
-moz-border-radius: 8px;
-webkit-border-radius: 8px;
border-radius: 8px;
}

#header {
.rounded_corners;
}

#footer {
.rounded_corners;
}

Operations
在CSS中直接進行加減乘除計算。
@the-border: 1px;
@base-color: #111;

#header {
color: @base-color * 3;
border-left: @the-border;
border-right: @the-border * 2;
}

#footer { 
color: (@base-color + #111) * 1.5; 
}

Nested Rules
這類似是OOP的中Class。
#header {
color: red;
a { 
font-weight: bold; 
text-decoration: none; 
} 
}

使用OO寫法的CSS可以簡潔很多,而且可以重覆使用或者承繼。不過暫時OO的CSS選擇並不多。
ASP.NET 的話可以試試.less CSS就有齊以上的功能,PHP的話可以試試xCSS,兩隻都是很容易使用和Setup的。

2009年11月16日星期一

ASP.NET使用Throw中止頁面

通常新接觸ASP.NET的朋友,都會把程式碼放進Page_Load事件中,如果因為不符合某條件而要中止網頁運行的話(例如一些要檢查登入的頁面),可能會用Exit Sub(VB)或者return(C#)退出Page_Load事件。

當然如果整個載入過程只有Page_Load的話,這個做法都還可以的。但假如還有其他Stage,例如Page_Init , Page_LoadComplete... (可參考ASP.NET Page Life Cycle Overview),單純地退出Page_Load事件就可以為你帶來一些程式上的錯誤。

當然概念上,大家要注意,即使你沒有寫上其他Stage的程式碼,但Runtime時,ASP.NET都會經過的,所以不要認為只把程式碼放進Page_Load事件中,便不會觸發其他Stage Event。

以下面段Code為例,網頁載入的過程會經過三個Stage : Page_Init => Page_Load => Page_LoadComplete

假如我使用return;(Exit Sub)的話 :
partial class DefaultPage : System.Web.UI.Page
{
protected void Page_Init(object sender, System.EventArgs e)
{
object intNum = "abcde";
int _intNum = 0;
if (!Int32.TryParse(intNum, _intNum)) {
return;
}
System.Diagnostics.Debug.Print("Page_Init is Loaded.");
}

protected void Page_Load(object sender, System.EventArgs e)
{
System.Diagnostics.Debug.Print("Page_Load is Loaded.");
}

protected void Page_LoadComplete(object sender, System.EventArgs e)
{
System.Diagnostics.Debug.Print("Page_LoadComplete is Loaded.");
}
}

Output Window便會顯示出
Page_Load is Loaded.
Page_LoadComplete is Loaded.

換句話說,return並不會中止其後的事件。但如果我們使用throw的話:
partial class DefaultPage : System.Web.UI.Page
{
protected void Page_Init(object sender, System.EventArgs e)
{
object intNum = "abcde";
int _intNum = 0;
if (!Int32.TryParse(intNum, _intNum)) {
throw;
}
System.Diagnostics.Debug.Print("Page_Init is Loaded.");
}

protected void Page_Load(object sender, System.EventArgs e)
{
System.Diagnostics.Debug.Print("Page_Load is Loaded.");
}

protected void Page_LoadComplete(object sender, System.EventArgs e)
{
System.Diagnostics.Debug.Print("Page_LoadComplete is Loaded.");
}
}

這樣Page_Load和Page_LoadComplete都不會執行,而頁面會轉去錯誤信息頁。

當然throw也是一個決定性的做法,正常未必需要因為不符合要求就把瀏覽者轉向錯誤頁面。
但大家從這個範例也可以看出一些ASP.NET Page Cycle上要注意的地方。

2009年11月13日星期五

Hornil StylePix - 超強的Portable Image Editor

我在這Blog介紹過的免費Image Editor都有好幾次,之前曾經介紹過Artweaver / PicPick,不過前者開始商業化,後者就不支援Layer而且功能比較少,雖然Paint.NET前幾天終於推出3.5版本,不過Paint.NET的Lasso Tool依然沒有改進,很難使用,所以我再物色一下有什麼新軟件。

今次介紹這個叫Hornil StylePix,韓國人出品。
這個Software幾好用的,介面很似Photoshop,除了基本應該有的修圖功能。
更支援Filter,Layer,和Batch processing,這幾個功能都是很多免費軟件都缺乏的,中文字支援方面我試過沒有問題。
Hornil StylePix更有Portable版本供選擇。

Download Hornil StylePix
http://hornil.com
Hornil StylePix功能說明
http://hornil.com/en/products/stylepix/features.html
Hornil StylePix Screen Shot
http://hornil.com/en/products/stylepix/screenshots.html

2009年11月12日星期四

Javascript - Passing arguments as Function

在Javascript中,Call Function絕對不會陌生,但如果有若干數量的Function因應不同的情況才Call怎麼辦呢?
當然有很多可能性,其中最常見的亦是傳統做法不外乎
if..(condition)..then...
function1();
function2();
function3();
...
而我的做法就是自行寫一個Helper,用Array以arguments型式去呼叫Function。
function SayGoodBye()
{
   $('#hello').html('GoodBye');
}

function SeeYou()
{
   $('#hello').html($('#hello').html() + ',' + 'See you next time!');
}

function caller(aryfunc)
{
   $.each(aryfunc,function(i,n) //用jQuery的each
     {  Function.call(n());  }
   );
}

$(document).ready(function() { 
  //if..(condition)..then...
  var myFunc = new Array(SayGoodBye,SeeYou); //and more...
  caller(myFunc); //Print out : GoodBye,See you next time!
}); 
<div id="hello"></div>

這就可以把 condition 移至外部,用Helper去呼叫Function更加靈活。而且Array中的項目,Function的arguments不只是資料型態(String,Int...),更可以是function()吧。

PhotoImpact正式死亡

今晚上Corel睇下有冇新版本,誰不知完全找不到產品介紹頁,連Download都沒有了。
再去Corel的官方討論區,連PhotoImpact的版塊都刪除了,已經心知不妙~回到Ulead的官方討論區看,果然Corel已經停止開發PhotoImpact,而且是想PI消失於世上,連未代的X3版本都不再出售。
可以看看這Post,Ulead前公司的人員都証實了 -
Photoimpact Dead ?
http://phpbb.ulead.com.tw/EN/viewtopic.php?t=35779
Corel已經前後殺死幾個好用的軟件,例如COOL 3D, GIF Animator, MediaStudio Pro...

其實我都不知Corel收購Ulead幹什麼,我又不覺得Corel的PaintShop Pro好用過PhotoImpact。(而且PaintShop Pro都是收購自Jasc)

PI我由第5代用到最後的X3,前前後後都有10年有多的時間,軟件來說都算是有感情的一個。

2009年11月7日星期六

jQuery - 當Javascript Ajax遇上Loop

之前已經略略打過一篇jQuery 的Async和sync的問題:
jQuery – Why Ajax return blank data?

近日我再次遇上近似的問題,我把一段jQuery.ajax 放在一段For...Loop中運行,發現同樣會出現同步問題。
再次上網查證一下,發現原來這不是jQuery的問題,問題在於Javascript原生的XMLHttpRequest和Synchronous問題。

出現問題的程式碼如下:
ASP.NET 2.0 Web Service :
<WebMethod()> _
Public Function returnString(ByVal inputString As String) As String
Return inputString
End Function

網頁上的jQuery Ajax CallBack :
<script type="text/javascript">
$(document).ready(function () { 
for (var i = 1 ;i <= 10;i++)
{
var Options= {
type: "POST",
url: "webservice/DataService.asmx/returnString",
data:'{ inputString: ' + i +'}',
async: "true",
contentType: "application/json; charset=utf-8",
dataType: "JSON",
success: function(response)  { alert(response);  } 
} 
$.ajax(Options); 
}
});
</script>

運行程式後,得出的alert不是順序的12345678910,有可能是4231789...或者9714523。
最後把async設成false就可以解決問題,但是運行時,Browser會呈現硬直狀態。
解決方法雖然是找到了,但是為什麼會這樣?
可以睇睇國外高手的Blog文:
Ajax and javascript don't use threads
Ajax, javascript and threads : the final truth

睇過之後,不難理解為什麼會出現這個同步問題。

2009年10月27日星期二

ASP.NET Server Side & Client Side資料加密處理

對於ASPX網頁上暫存資料方面,ServerSide最常用多數都是用Session,ClientSide應該都是ViewState吧,前者應該沒有太多保安問題,但後者的ViewState其實要Decode根本不難,所以加密功夫其實很重要的。近期工作上經常要使用 jQuery + Web Service處理資料,有些敏感資料會經JSON傳回Browser,又或者經Hidden Field傳回Server,有些情況是很難避免的 (特別是上司要求...),我看過有些懶人只用Base64轉碼就當是加密其實真的很危險。

.NET Framework其實本身在System.Security.Cryptography NameSpace下已經提供了大量加密方式,在MSDN看過後,取了幾種針對String加密的,做了少少資料搜集有關 3DES / DES / RSAAES (Rijndael) 的比較,其實4種方法同樣都需要一項Key才可以進行正常解密,所以即使知道你網頁中加密後的字串,而不知道你所設定的Key都不可能正常解密的。

論安全性,粗略評估後的排行應該是 AES (Rijndael) > AES > 3DES > RSA / DES。

至於使用方面,Client-Side可以使用以下的Javascript 解密AES:
http://www.movable-type.co.uk/scripts/aes.html

Server-Side方面,其實MSDN上已有很清晰的Sample,以下就是使用AES (Rijndael)方式對String進行encrypt和decrypt的例子。

using System;
using System.Security.Cryptography;
using System.Text;
using System.IO;

class RijndaelSample
{

static void Main()
{
try
{
// Create a new Rijndael object to generate a key
// and initialization vector (IV).
Rijndael RijndaelAlg = Rijndael.Create();

// Create a string to encrypt.
string sData = "Here is some data to encrypt.";
string FileName = "CText.txt";

// Encrypt text to a file using the file name, key, and IV.
EncryptTextToFile(sData, FileName, RijndaelAlg.Key, RijndaelAlg.IV);

// Decrypt the text from a file using the file name, key, and IV.
string Final = DecryptTextFromFile(FileName, RijndaelAlg.Key, RijndaelAlg.IV);

// Display the decrypted string to the console.
Console.WriteLine(Final);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}

Console.ReadLine();
}

public static void EncryptTextToFile(String Data, String FileName, byte[] Key, byte[] IV)
{
try
{
// Create or open the specified file.
FileStream fStream = File.Open(FileName, FileMode.OpenOrCreate);

// Create a new Rijndael object.
Rijndael RijndaelAlg = Rijndael.Create();

// Create a CryptoStream using the FileStream 
// and the passed key and initialization vector (IV).
CryptoStream cStream = new CryptoStream(fStream, RijndaelAlg.CreateEncryptor(Key, IV), CryptoStreamMode.Write);

// Create a StreamWriter using the CryptoStream.
StreamWriter sWriter = new StreamWriter(cStream);

try
{
// Write the data to the stream 
// to encrypt it.
sWriter.WriteLine(Data);
}
catch (Exception e)
{
Console.WriteLine("An error occurred: {0}", e.Message);
}
finally
{
// Close the streams and
// close the file.
sWriter.Close();
cStream.Close();
fStream.Close();
}
}
catch (CryptographicException e)
{
Console.WriteLine("A Cryptographic error occurred: {0}", e.Message);
}
catch (UnauthorizedAccessException e)
{
Console.WriteLine("A file error occurred: {0}", e.Message);
}

}

public static string DecryptTextFromFile(String FileName, byte[] Key, byte[] IV)
{
try
{
// Create or open the specified file. 
FileStream fStream = File.Open(FileName, FileMode.OpenOrCreate);

// Create a new Rijndael object.
Rijndael RijndaelAlg = Rijndael.Create();

// Create a CryptoStream using the FileStream 
// and the passed key and initialization vector (IV).
CryptoStream cStream = new CryptoStream(fStream, RijndaelAlg.CreateDecryptor(Key, IV), CryptoStreamMode.Read);

// Create a StreamReader using the CryptoStream.
StreamReader sReader = new StreamReader(cStream);

string val = null;

try
{
// Read the data from the stream 
// to decrypt it.
val = sReader.ReadLine();


}
catch (Exception e)
{
Console.WriteLine("An error occurred: {0}", e.Message);
}
finally
{
// Close the streams and
// close the file.
sReader.Close();
cStream.Close();
fStream.Close();
}

// Return the string. 
return val;
}
catch (CryptographicException e)
{
Console.WriteLine("A Cryptographic error occurred: {0}", e.Message);
return null;
}
catch (UnauthorizedAccessException e)
{
Console.WriteLine("A file error occurred: {0}", e.Message);
return null;
}
}
}

2009年10月23日星期五

Google Chrome Portable

portableapps.com終於都出佢自家的Google Chrome Portable。
之前在其他地方都見過有人製作的Portable版,不過我就不太相信一些不知名人士製作的Portable軟件。

因為有部份只是從installer extract file出來,run得到,就當是Portable,但亦有機會寫入資料至Registry 或分散元件檔案至其他地方等等。



portableapps.com出品就肯定品質有保証了。
Google Chrome Portable
http://portableapps.com/apps/internet/google_chrome_portable

2009年10月21日星期三

Visual Studio 2010 Beta 2


Visual Studio 2010 Beta 2今日剛剛Release,照以往推出時間來看,應該下年年頭約1,2月就會出正式版。
除了Visual Studio 2010轉了新Logo外,MSDN的Logo都轉了。

而整個MSDN主色都轉為紫色,文章部份再分為Classic / Lightweight / ScriptFree 三個顯示模式,取代之前的 loband (low bandwidth) 模式。

MSDN上已經有大量有關.NET Framework 4.0和Visual Studio 2010的文章可以參考,順道整理一下:
.NET Framework 4.0

Visual Studio 2010

ASP.NET 4

C# 2010

Visual Basic 2010

2009年10月17日星期六

Unbox MVP Award Kit!

今天終於收到了Microsoft寄來的MVP Award Kit,拿上手有點重量,大概都有1KG,個盒都幾靚。
內含一個獎座 / 一張MVP Certificate / 一張MVP証 / 一個襟章和一份NDA。奇怪的是,Microsoft 把我的名字印錯了 ....但Fedex包裹上印的卻是正確。
自己每天工作對著的大多數都是Microsoft的東西,得到一個MVP,其實算是對自己一些安慰 ,始終有些東西,未必可以帶來財富,但卻有錢都買不到。

2009年10月13日星期二

Aptana PHP Plugin停止開發~轉用PHP Designer 7

今天看到一直用的Aptana慢慢轉向商業化經營了...原本Domain是aptana.com,現在瓜分為.com和aptana.org for community plugins。最可惜的是Aptana已聲明PHP Plug-in停止開發 (見 Aptana PHP Plugin discontinued? ) ,會把現有的module移至Eclipse PDT。但我真的用不慣Eclipse系的IDE,可能我個人太Visual Studio向,用起Eclipse甚至Netbeans都覺得怪怪地。

唯有再看看其他PHP IDE有冇更新,有沒有更新至我要求的HTML + JavaScript Code Completion / PHP Code Hints等等。
我對工作上/興趣上的軟件要求很高,而且Programming的IDE更是我謀生工具,豈能兒戲。
我堅信 "工欲善其事,必先利其器。"的道理,無論軟件介面設計,Right-Click的menu command"就不就手"都有要求。

試過很多,比較出名的PHPEdit , PhpED , Zend Studio , Komodo IDE都試過,依然不稱心,主要都是不如Visual Studio無論HTML,JS,CSS都主面支援。

再試試PHP Designer 7,原來前幾天剛出新版,看ChangeLog見到這幾項,立即試試 :
New. JavaScript code completion
New. Support for JavaScript Object-oriented programming (OOP)
New. JavaScript code tip with extended information/documentation
New. Support for user-defined JavaScript functions
New. Support for user-defined JavaScript variables
New. Code Explorer for JavaScript
New. Jump to JavaScript declarations
New. Support for the JavaScript framework jQuery

試用過後,算是不錯,感覺很完整,無論HTML,JS,CSS,PHP的 Code Completion都做得不錯,但依然有半秒到Delay(即使我已set 0ms delay)。
介面都較接近返Visual Studio,不錯不錯。

Screenshots of phpDesigner 7
http://www.mpsoftware.dk/phpdesigner_screenshots.php

2009年10月8日星期四

Ajax Control Toolkit (v3.0.30930) released

5月時才大更新了一次,那時加入了
  1. HTMLEditor
  2. ComboBox
  3. ColorPicker
估不到幾個月後又有新版。
新版v3.0.30930加入兩個極之重大的新Control :
  1. Seadragon - JavaScript版本的Deep Zoom
  2. AsyncFileUpload - 就是Asynchronous AJAX File Upload Control,這個才是重點,因為大部份Async FileUpload的Control都要收錢,現在有這個就好了。

OneFileCMS - 最簡單的CMS

這個叫OneFileCMS的東西,整個程式就是一個PHP File,我諗應該算是全世界最簡單的了。
http://onefilecms.com/

2009年10月7日星期三

Project Manager 唔識 Program

起香港做電腦行業,要上位做到Manager級,
大概可以分三類,1.高相關學歷 2.真材實料 3.靠吹水 。
第1.和第2. 是無可厚非的,至於第3.認唔認同就因人而異,個人就唔太認同。

在Google上輸入Keyword : Project Manager 唔識 Program ,已經可以找到相關討論:
香港討論區 - 各行各業 - 資訊科技界 I.T.
PM需唔需要識Programming? 我覺得絕對要識,但需唔需要超強?咁又未必。
當然如果Coding 都強的話當然就更加好喇,我諗任何人都唔想有事時,PM十問九唔知,話知但又唔肯定的,最後叫你自己Google吧。

Project Manager - 職責就是Project Management : Resource Control / Documentation / Source Control 等等之外,本身不應接觸Implement層面,但萬一真是要的話,就出事了。
以近期我接手做Project的Database design做例,我估是PM技癢情況下Design schema的,就說明現實中PM要不要懂Programming。



這個Table有幾點都有問題 :
1. ParentMenuCode和Code,實際data是INT,但DataType卻有理冇理Set Nvarchar....
2. ParentMenuCode是FK Reference Code,實質就是主Menu和副Menu的關係,但理應分開兩個Table,現在放在一起,就會出現recursive的情況,到需要第三層目錄時就麻煩,再者Code是not null, ParentMenuCode是allow null , 是不是很奇怪...
3. ImageURL和RedirectURL 長度不一,一個是100,另一個是200。雖然好像太吹毛求瑕,但實際寫program時,要set input的max lenght就查一查長度都幾煩。

還有一些不方便公開ScreenShot的,例如Table名有空格,Primary Key / Constraints / Default value,應有則冇等等問題。
出現這些問題,原因就是設計的人沒有由Programming角度出發。
例如Table有空格,沒錯,看起來更清楚,但每次條Query都要用 [ ] (MSSQL) 或 ` ` (MySQL) Quote起來。
明明是應該Default是空白的卻可以Null,令到每次新增一條Record時都可能要特地Insert一個空白入去,或者相反用IsDBNull之類的Function是檢查,首當其衝當然是我這個寫Code的人。

所以現在你問我PM要不要識寫Program,我會答你至少都要"懂"。

PHP Comments Remover & Space Cleaner

一個免費的PHP Comments Remover,去PHP和HTML格式的Comment,另有去空白和內建obfuscator。
我試用過還不錯,用Universal Extractor後便是Portable版。

如果想進一步除去Line Break可以用用這個 PHP Code Cleaner and Indenter

Download PHP Comments Remover

2009年10月2日星期五

當選Microsoft MVP

7月時參選Microsoft MVP,在差不多已經忘記的時候收到Microsoft的Email通知當選了ASP/ASP.NET的MVP。

填報名表的時候,主要都是靠這個Blog的各類Programming文章,部份jQuery的教學文章和各大國外討論區如,StackOverFlowMSDN Forum之類的回應文章得選。

看看下年有沒有機會連任了。

小心選擇Facebook Application

近日有點時間,開始寫Facebook Application,大概是一個Facebook API + Google Map API 的小程式。
寫的過程發現到經Facebook API的Users.getInfo Call 可以取得很多個人資料,開始查證一下Facebook的Guidelines,看看是否容許儲存Profiles的資料。

一看之下,原來Facebook已表明有什麼是Storable Data,其他資料一概不可以儲存超過24小時。

但我相信以Facebook Application的架構,其實是沒有可能知道程式背後對資料做過什麼,如果程式把資料Copy至另一個媒體,其實已經追查不到。

就算是單單一個"送禮物","占卜","每日一字"的小程式,只要你加入Application前,一按"Allow",程式已經可以無限制地存取你的資料。唯一可以防止的方法就是去Privacy Settings選擇你公開什麼資料,但Facebook的default setting差不多是全開的。所以很多人胡亂去增加Application其實是有風險的。

2009年9月23日星期三

SongBird - iTunes Alternative 終於可以放棄Winamp

MP3 Player我用過的實在不多,十幾年前初玩電腦時用Real Player G2,後來用Musicmatch Jukebox (當時很出名的,那時Winamp還未成名),後來才用Winamp至今超過10年都有。不過 Winamp被買乜死乜既AOL收購左之後,果然同ICQ一樣越出越衰。
現在很多人都用iTunes,不過我個人對Apple出品沒有興趣,到現在我連一部iPod都沒有....而iTunes強迫人安裝QuickTime我更加不會想用它。

前幾日試用過SongBird,感覺不錯,是用Firefox改出來的iTunes替代品,不過軟件介面幾好用,完全是我想要的東西。
SongBird本身其實已經有齊基本播放/管理功能,其他功能可以藉由和Firefox一樣大量的Addon達成,當然亦有大量Theme可用。

SongBird除左安裝版本 : http://getsongbird.com/
亦有Portable版本 : http://portableapps.com/apps/music_video/songbird_portable

個人推薦以下Addon :
directory browser: 不用Import media file,只需要揀音樂檔案擺放的資料夾就可以播放。
LiveTweeter: Tweeter和Live Messenger的Now Playing Addon。
MinimizeToTray revived: 縮小至system tray。
Now Playing List : PlayList Addon。

songbird-1.1-screenshot-full-t.jpgscreeny_large-t.pngSongBird_2009-09-22-22-59-05-t.pngSongBird_2009-09-22-22-58-37-t.png