2012年7月4日 星期三

[JavaScript] Observer Pattern Implement

上一篇講到簡單的observer Pattern的作法,這一篇我們把它寫成一個class
//Observer class
function Observer() {
  var topics = [];
   
   return{
    Register:function( topic, func ) {
        if(!topics[topic])
         topics[topic]=[]; // two dimension for store callback func
        topics[topic].push(func);
    },
    
    Publish:function( topic, args ) {
        if ( !topics[topic] ) {
            console.log('no such topic');
            return false;
        }
        var subscribers = topics[topic];
        for(var i in subscribers)
         subscribers[i](topic,args);
    },
    
    UnRegister:function( topic ) {
        if ( !topics[topic] ) {
            return false;
        }
        topics[topic]=null;
    }
   }
};
如何使用呢?
//How to use
var observ = new  Observer();
 
 //call back signature (topic,data)
 var testHandler = function (topics, data) {
    console.log("1:"+topics + ": " + data);
 };
 var testHandler2 = function (topics, data) {
    console.log("2:"+topics + ": " + data);
 };
 
 observ.Register('cal1', testHandler);
 observ.Register('cal1', testHandler2);
 observ.Publish('cal1', 'hello world!');
 observ.Publish('cal1', ['test', 'a', 'b', 'c']);
 
 observ.UnRegister('example1');
 
 observ.Publish('example1', 'hello world!');

------------------
執行結果如下


沒想到使用Javascript寫一個Observer Pattern會如此簡單 ....

2012年7月2日 星期一

[JavaScript] Observer Pattern Cont.

續上篇
Observer Pattern真的是一個蠻好用的Pattern,以我工作的例子是我會去操作一個第三方的JavaScript API,操作完之後這個API只會產生一個事件,而且這個事件裡面會帶一個參數表示目前的狀態
如下
trdParty.onCallback(function(status){
   // do something you want
});

trdParty.doMethod();

onCallback會在每次呼叫不同的doMethod都會回傳目前的狀態,你可以透過偵測status的狀態來執行你想做的事情,最簡單的方式是透過類似HashTable的方式來做mapping,如下
var funMap = [];
funMap['status1'] = function(status)
{
   //do statu1 need to do
};
funMap['status2'] = function(status)
{
   //do statu2 need to do
};

trdParty.onCallback(function(status){
   funMap[status.Text](status); //這裡就會依照status.Text的狀態類型呼叫對應的method了
});

trdParty.doMethod();
透過以上的方法可以簡單的做funciton mapping呼叫。但如果針對一個status可能有好幾件事情要做呢?
說真的,透過JavaScript來達到二維的呼叫也是很簡單
var funMap = [][]; //二維
funMap['status1'].push(function(status)
{
   //do statu1 need to do -- 1
});
funMap['status1'].push(function(status)
{
   //do statu1 need to do -- 2
});
funMap['status2'].push(function(status)
{
   //do statu2 need to do -- 1
});
funMap['status2'].push(function(status)
{
   //do statu2 need to do -- 2
});

trdParty.onCallback(function(status){
   for(var fn in funMap[status.Text])
   {
      funMap[status.Text][fn](status);
   }
});

trdParty.doMethod();

怎樣,很簡單吧。

不過這樣寫每次沒辦法利用,時間晚了,下次再來介紹整個Observer Pattern...

2012年6月28日 星期四

[JavaScript] Observer Pattern

這是在我日常的工作中是一個很常被使用到的Pattern,它使用起來的方式如下
var callback = function(topic, data){
   console.log(topic + ': ' + data);
}

//假設observe object 已存在
observe.addCallback('MyTopic',callback);

observe.fireCallback('Mytopic', 'my data 1');  // Mytopic : my data 1
observe.fireCallback('Mytopic', 'my data 2');  // Mytopic : my data 2
observe.fireCallback('Mytopic', 'my data 3');  // Mytopic : my data 3


基本上使用起來很像.NET中event的方式

To be continue ...

[JavaScript] Advanced Object Declaration

上一篇文章中提到了幾個JavaScript class的宣告方式,以及用該class來宣告物件。而這一篇會介紹比較Advanced的物件宣告方式

Literal
//object declaration with attribute and method
var person = {
 //public attribute
 name:'',
 year:0,
 
 //public function
 Init:function(name, year){
  this.name=name;
  this.year=year; 
 }
}

Module
//can declare private/public attribte and method
var Person = (function(){
 //private attribute
 var name;
 
 var privateInfo=function(){
  return this.name;
 };
 
 //All public method and attribute
 return{
  //public attribute
  Nickname:'Andy',
  //public method
  getInfo:function(){
   return Nickname + " - " + name;    
  }
 }
})();

目前看起來好像只有透過所謂Module的宣告方式才可以有public/private的特性,其他方式的的宣告方法看起來都沒有這個效果.

有鑑於有我第一次看到Module的宣告方式看了好久都看不懂,還以為是所謂的新語法,其實不是,帶我一一來拆解
//一般方法的宣告方式
var Person = function(){ /*do what you want*/ };

//execute method
Person();

//如果方法裡面有回傳值
var Person = function(){ 
 /*do what you want*/ 
 
 // return a JSON object
 return{
  pubVar:'',
  pubMethod:function()
  {
   // do method
  }
  
   
 }
};
//execute the same method
var obj = Person();
//get PubVar
var val = obj.pubVar;
//execute pubmethod
obj.pubMethod();
那如果宣告的同時就順便執行呢?
//用()把整個function的宣告包起來後順便再()執行
var person = (function(){ /*do what you want */ })();

//get PubVar
var val = obj.pubVar;
//execute pubmethod
obj.pubMethod();


不曉得各位看官有沒有看懂了

2012年6月20日 星期三

JavaScript class 宣告方式

在JavaScript的語法中,光是class的宣告方式就有好幾種,底下列出我所知道的宣告方式

function Person(name,year){
 //public attribute
 this.name=name;
 this.year=year;
 
 //public method
 this.getInfo(){
  return 'I am '+ this.name + 
      ',and I am ' + this.year + 'years old';
 }
}

用法
var p = new Person('Andy','18');
p.getInfo();

你也可以透過Prototype的方式宣告
function Person(name,year){
 //public property
 this.name=name;
 this.year=year;
}
//public method
//底下方法也可以宣告public property
//public method
Person.prototype.getInfo = function(){
  //public method
  return 'I am '+ this.name + 
      ',and I am ' + this.year + 'years old';
};
..
或者這樣宣告
var Person = function(name,year){
 //public attribute
 this.name=name;
 this.year=year;
};

//public method
Person.prototype.getInfo = function(){
  //public method
  return 'I am '+ this.name + 
      ',and I am ' + this.year + 'years old';
};
另一種宣告class的方法,不過這個方法我不知道怎麼宣告constructor
var Person = new Class;

//public method
Person.prototype.getInfo = function(){
  //public method
  return 'I am '+ this.name + 
      ',and I am ' + this.year + 'years old';
};

靜態方法(static method)部分,可以這樣宣告

//Person is class name
Person.find = function(id){/* ... */}


//instance method部分,也可以這樣宣告

//instance a Person object
var person = new Person('Andy',18);
person.find = function(id){/*  .... */}


下次再來介紹如何宣告物件 ....

2012年3月19日 星期一

[讀書心得 part4] 交辦時,務必說清楚、想明白

大家好,我又來分享讀書心得啦 ^^
今天跟大家分享訣竅三
  1. 勉強他的能力,不要勉強他的意願
    • 話說沒有意願,能力再好都是枉然,可見意願的重要性。所以平常一定要跟member混熟,指派工作的時候,一定要了解他的能力是否有辦法完成這個交辦,如果有辦法完成自然比較好說服,如果比較難完成,那在指派的時候也一定要想辦法說服他。我很常會用的招式是:你把這件事情完成,你就會學習到以後該怎麼處理這樣類型的工作了。目前看起來成效很爛(冏)
  2. 他有沒有個人目標,會影響工作成敗
    • 說真的,我也覺得這點很重要,但問題要讓member有個人目標其實真的還蠻難的,我也曾經幫member訂過目標,但效果其實不符合預期,或許我該找時間好好來跟member談談他的目標到底在哪?
  3. 不合理的工作要求,交辦給誰最好呢?
    • 我覺得交辦給誰都不好,所以如果可以把不合理的工作要求合理化,那交辦出去的機會可能會大一點。例如寫程式,一隻程式可以花一天沒架構沒規劃的方式寫出來,也可以花三天好好的規畫寫出來,當時間急的時候,你要一個很有sense的member花一天寫出來,你該如何說服他?去年我就常遇到這樣的事情。那時候跟我合作的member能力非常好,但對程式撰寫有一定程度的潔癖,說真的,要我寫出一個很糟的程式,對我來說也是一種虐待。所以我會先跟他討論,跟他說目前事情的急迫性,以及目前會跟老闆報告說現在的方式會產生的問題,日後我們需要再額外花時間來refactor目前寫的程式,讓老闆知道。還好那位member跟我交情還不錯,我們就這樣完成了大多數的程式,之後有被refactor的部分也有80%以上。
    • 所以我寧願先讓事情盡量合理化,再來做所謂的交辦,萬一不行,也跟member討論出平衡點。
  4. 他不是你的分身,做法不一樣,千萬別跳腳
    • 話說寫程式裡有一個流程叫做code review,通常是組織裡比較資深的member幫比較資淺的member review code,review的過程中,可以提出建議的做法,以及指出有問題的地方。我覺得code review 對我來說也是練功的一種,有時候可以看到自己沒想過的作法,當然有時候也會看到讓自己氣得跳腳的寫法。從寫程式就可以知道,針對同一種需求,不同的人去寫程式,通常不太可能寫出一樣的code,但只要知道目標在哪(這真的很重要),確定過程中都是往目標的正確路徑,我想就算中間稍微停頓看個風景也不為過。

2012年3月12日 星期一

[讀書心得 part3] 硬塞前,先慎選人與事

今天來跟大家分享【交辦的技術 讀書心得 Part3】


  1. 交辦標準,不是看他做不做得到
    • 作者說交辦是指把這件事情的【責任】交付出去給member,member在接到工作的同時也同時擔負起完成這件事情的【責任】。身為Leader腦袋真的要轉過來,雖然明明知道很多事情member其實並沒有足夠的能力來完成,但如果一昧的攬在自己的身上,到頭來只是讓自己更累,團隊產出更少,而且少了培養member的機會,會讓整個團隊的競爭力降低。
    • 當member承擔這個任務成敗的【責任】後,勢必會更用心的去處理,過程中千萬別插手,一插手,事情的責任馬上就轉到自己身上了。例如,你叫member寫一個專案Deploy的SOP,過程中如果你插手給予意見,則member勢必認為只要把你的意見加入,就萬無一失,有問題的話也不是自己的問題,因為已經參照你給的意見來執行了,所以身為Leader千萬要忍住。
    • 當然還是要評估這件事情是不適合由該member來執行,如果難度太高,一樣會陷入【交辦失敗】的魔咒,所以身為Leader可能還是需要想一些方式讓Member可以較順利的執行該任務,藉由完成該任務來提升member的能力。
  2. 三種工作,別突然硬塞
    1. 陌生的工作
    2. 非緊急重要事項
    3. 指派人力的工作
    • 針對上述三項工作,我覺得比較有趣的是【非緊急重要事項】。前陣子剛好看了某時間管理的文章,文中將事情分為四個象限,分別是【緊急】、【重要】、【非緊急】、【非重要】。將這四個象限去組合,則可以得到【非緊急重要事項】。而處理這四個現象的先後順序分別是1.【緊急重要】2.【非緊急重要】3.【緊急非重要】4.【非緊急非重要】。很多人常常把2,3處理搞混,連我都不例外,不過只要接受這個理論,就可以順利地交辦的事項一一完成。
    • 所謂【非緊急重要事項】通常是長久規畫的策略或方針,將這類的事情交辦給部屬,無疑是主管自己無能(機會高),或者真的是member能力超好(機會低)。member對於due date還很久的事項,通常較缺乏經驗去執行,而且這類的事物通常有很多事情並非member的權責可以決定,例如:半年後的新專案開發架構。身為Leader必須將這類事務細分成多個工作包(WBS),當細分成WBS後,即可讓每個WBS依序成為【緊急重要事項】,則member依WBS的順序去執行,則每個階段就都可以有產出,最後完成這個【非緊急重要事項】。
    • 至於另外兩個【 陌生的工作 】和【 指派人力的工作 】接導因於member對這類交辦經驗薄弱,例如 指派人力的工作,member可能連自己要完成某個交辦需花多少時間都估不出來了,你還要他去指派別人工作? 
  3. 預防災難,你得會看人
    • 其實這個部份我還很少機會用到,書上指的是要會用【領導人】,小弟我還沒機會成為可以指派【領導人】的人。不過重點還是開船著船長要知道目的地在哪,路線規劃要漂亮,相關環境變數收集齊全,才能順利帶領船員,快快樂樂的出航,平平安安且順順利利的到達目的地。
  4. 菜鳥和老鳥,交辦方式肯定不一樣
    • 這應該是廢話,但不知道會不會有人白目到連這個都不知道。不過菜鳥分兩種【能力好的】跟【能力差的】;老鳥也分兩種【能力好的】和【能力差的】。針對菜鳥當然再交辦事項的時候要給予適當的指導,但遇到能力好的,更需要給予適當的發揮及尊重,這是我個人的感覺。而老鳥部分,能力好的就給予極度的尊重,但別忘了還是要訂一下schedule,能力差的我會跟他討論,並希望盡量藉由討論來取得他願意執行的平衡點,重點還是schedule要訂一下,不然滑掉的機會很高。

2012年3月7日 星期三

[讀書心得 part2] 做中學你硬塞給他就對了


今天來分享【交辦的技術 part2】
  1. 交辦工作,不用等到【對他有信心】
    • 我覺得像我這種菜鳥leader,或者好人leader絕對想不到這一點,腦海中想到的都是怎樣把member有辦法處理的事情交辦給他,所以都會自己花時間把難的部分先解決掉,剩下比較簡單的部份還會先跟member講解該怎麼處理。作者說的對,想當初人家assign給我job的時候也很少教我該怎麼去處理,或許懂得如何自己去處理的人才可以真正的成長,我覺得我腦袋沒轉過來反而阻礙了member成長的機會。
  2. 成長,都是勉強來的
    • 同上,記得有一個理論是說,如果你針對一件task要達到至少80分,那你就要求自己或member往100分的目標去邁進,就算沒能達到100分,應該至少都有八、九十分的水準。雖然自己很討厭別人凹我,但我不去凹member,那到頭來只是讓整個團隊的績效都卡到自己身上而已,於團隊的進步跟產出沒什麼幫助。
  3. 你得【保障】他的失敗機會
    • 作者說,當你把工作指派給member的時候,他就同時被賦予需要擔負這項工作成敗的責任了。也因為擔負了這個責任,他才能更用心地去完成這項工作;不過並不是每件事情因為擔負了責任,努力去做就一定可以順利完成,當Leader的我,通常腦海中想著該怎麼樣讓事情順利的進行不要出錯,但這卻是最要不得的想法,待我說來。
    • 首先如果自己想讓事情進行順利的想法,必定就不希望member往錯誤的方向邁進,或著允許他交出錯誤的成果,但像寫程式這種事情,不讓他去try error幾次根本就學不到經驗。我有時候會太龜毛幫member寫一個template讓他照著寫就好,孰不知這樣讓他少學習到很多,到頭來事情做完了,他還是沒學到東西,講白一點,下次一樣的事情要他做他可能還不知道從何開始,因為我的雞婆讓他少了學習的機會。
    • 唯有接受member失敗的結果才能讓他真的去學習到東西,雖然這真的很天人交戰,尤其老闆壓我schedule的時候更是難以實行。但如果不狠心讓schedule滑個幾次,永遠都沒有讓member學習的機會,永遠事情都只會壓在我自己身上而已。當member有從交辦的事項中學習到,下次處理類似的交辦工作才能真的獨立去完成,但是要在schedule與讓member學習抉擇,真的是一件很難的事。
  4. 想培養他,就從【分外】工作開始
    • 其實作者說【分外】的工作指的是leader的工作,像是協調利害關係人相關的事務,以及做一些規劃類事情。我覺得這一點真的要睜大眼睛去看你的member是怎麼想的。如果你常把這類的工作交辦給member,正面一點的member會覺得有磨練的機會,負面一點的大概就會覺得你在凹他了,就像我常常覺得有某人在凹我一樣。這時候怎樣把交辦這類的事項用漂亮的方式包裝好再交給member就是一項學問了。
    • 講白一點,就是想辦法說服member能心甘情願的去處理這類的事物,而不要讓他覺得被凹了,我本人就很討厭被凹的感覺。但我也知道事情總是要有人處理,今天這件事情會落到我身上,大概也是凹我的人schedule嘎不過來了,但如果他能說出漂亮的理由說服我,我可能就傻傻地覺得處理這樣的事務也不錯,可以學到額外的經驗,反之,下一秒我就會跟別的同事抱怨說:【你看,XXX又那凹我了!!!】。相同的道理,身為leader有這類的事情要指派,還是要學會察言觀色比較重要。

其實在寫這些心得的同時,我也常常在想遇到相同的事情自己該怎麼處理。也希望大家能分享一下自己的經驗及想法。

2012年3月6日 星期二

[讀書心得 part1] 交辦的技術

 這本書是透過博客來的eDM才看到的,剛好這陣子遇到了。看了一下書的介紹感覺還蠻有趣的就用禮券去金石堂買了(哈)。

雖然說我不是主管,但卻一職被賦予要帶team member做事的使命,我從事軟體相關工作,從工作到現在大概六年,除了第一年沒有帶member,之後幾乎每一年都需要帶member做事,這時候member能力的好壞,以及我跟member之間的關係就嚴重地影響到工作的成果。

底下要分享的是我自己的心得對應書裡的章節

當主管第一件要學的事 (先說我根本不是主管)
  1. 放手讓他做,他就會成材
    • 我的經驗來說,要放手讓member還是要考量member的能力。如果member能力不足,放手讓他做只會造成他的壓力,但我卻一直忽略了壓力才能讓人成長,不過我個人覺得只有適當的壓力才會讓人成長,過多的壓力只會壓垮member,所以要衡量交辦一件事情對member造成多少壓力其實不好評估。我只知道能力好的壓力應該會比較低,能力差的壓力應該很大。
  2. 交辦失敗會摧毀一個人
    • 最近一位我帶的member因為能力不太足夠,我所交辦的每一件事情感覺對他都造成了莫大的壓力,但這件事情我卻是過了一陣子才發現,喪失了讓他學習的機會,因為能力不夠的關係,應該已經讓他連學習的時間或想法都沒了,尤其我所從事的工作是需要寫程式的,寫程式這種東西會的就是很快,不會的你給他再多時間可能都不夠。如果我能早點發現他的能力不足,或許可以提早訓練他,但目前因為專案時程都很趕,有時候跟他的對話都會因為他完成事項的不足而露出不滿意的話語,我想這部份真的很值得學習。與其交辦失敗摧毀一個人,倒不如想方法讓這個member變成可用之材還比較好。
  3. 糾正【無法交辦】心態的訣竅
    • 這裡主要是說,對於事情要不要交辦,主管的心態會去衡量說
      1. 這件事情太難,還是我自己來好了
      2. 這件事情太簡單,我來處理比較快
    • 其實身為一個leader如果不適當的把手中的事情交辦出去,最後只會造成自己生產力降低而已,對老闆來說身為leader的你的產出,不應該跟身為你member的產出是一樣的價值的。身為leader應該著重在規劃,再把規畫要做的事情交付給member,這樣才能提升團隊的績效。所以不管什麼事情,只要是可以交辦給member的應該都要盡量的交辦出去,不然最後member沒事做,自己卻因為事情太多處理不完而成為團隊的bottleneck,對團隊來說是一點幫助都沒有,所以應該要往這個方向去邁進,member也能從交辦的事項當中學習到處理事情的經驗,就由交辦事項提升能力,期望能一舉兩得。
其實在PMP中也有一個領域是在講Human Resource Management的談到獲得專案團隊、開發專案團隊及管理專案團隊,遇到人的問題真的去實施都是很難的。

2011年3月7日 星期一

模擬Javascript取得client IP

有朋友問在LoadBalance後的ASP.NET程式取得的Client IP都是LB的虛擬IP,這是因為後面的LB之後,Client的Request會先傳送到LB的Server,再透過LB往後傳送到真實的Server,所以透過ASP.NET的Request.UserHostAddress會抓取到的是虛擬IP。針對這個問題我想到的有兩種解決方案,第一透過RIA程式,例如Silverlight或Flex之類的程式抓取ClientIP後,再透過操作dom物件塞到html dom,這樣submit的時候就能取得;第二種做法是找一台不在LB後面的機器,也就是用IP可以直接access到的server,在這一台server提供一個模擬Javascript寫出hidden的欄位,其值再給予Client IP即可(因該Server不在LB後面所以Request.UserHostAddress可以正確抓取Client IP),以下示範第二種做法使用ASP.NET實做。

2010年10月19日 星期二

LINQ not in

今天因為處理繪圖需要針對集合做not in的運算,主要是因為TeeChart提供的API實在太弱了,所以有些運算只好自己土法煉鋼。故事大綱是這樣的,我有100個Point,符合條件的其中的20個我想要拿掉,如果不使用LINQ的話,做法如下

    //針對Point的定義
    class PointF
    {
        public double X { set; get; }
        public double Y { set; get; }

        public override bool Equals(object obj)
        {
            PointF inObj = obj as PointF;
            return this.X == inObj.X && this.Y == inObj.Y;
        }
    }

    List points = new List(); 
    List flagPoint = new List();  
    for (int i = 0; i < 100; i++) 
    {
       PointF point = new PointF { X = i, Y = i };
       points.Add(point);
       if (i % 5 == 0) //製造符合條件的point
          flagPoint.Add(point);
    }
    Console.WriteLine("total point {0}",points.Count.ToString());
    Console.WriteLine("flag point {0}", flagPoint.Count.ToString());
    //比對以移除符合條件的點
    for (int i = 0; i < points.Count; i++)
    {
       for (int j = 0; j < flagPoint.Count; j++)
       {
          if (points[i].X == flagPoint[j].X && points[i].Y == flagPoint[j].Y)
          {
              points.Remove(points[i]);
              break;
          }
       }
    }
            
    Console.WriteLine("points point {0}", points.Count.ToString());
    Console.WriteLine("flag point {0}", flagPoint.Count.ToString());

    Console.ReadKey();
其結果如下
改成使用LINQ的話
 
 List points = new List();
 List flagPoint = new List();
 for (int i = 0; i < 100; i++)
 {
     PointF point = new PointF { X = i, Y = i };
     points.Add(point);
     if (i % 5 == 0)
        flagPoint.Add(point);
  }
  Console.WriteLine("total point {0}",points.Count.ToString());
  Console.WriteLine("flag point {0}", flagPoint.Count.ToString());

  points = (from c in points
            where !flagPoint.Contains(c)
           select c).ToList();

  Console.WriteLine("points point {0}", points.Count.ToString());
  Console.WriteLine("flag point {0}", flagPoint.Count.ToString());

  Console.ReadKey();

結果會與上面一樣

透過LINQ,程式碼可讀性會提高很多,不過這裡的not in的用法第一次用,所以稍微花了點時間找

2010年8月20日 星期五

Java 與 .NET 使用心得

本來下面的內容,是要寫在SCWCD考試心得的,不過看看好像有點跳Tone了,所以就另外寫一篇文章來分享吧 ^^

我想要分享一下J2EE跟.NET技術的心得,雖然很多年沒寫Java了,但這些年並沒有荒廢學習新的技術,可以說其實這幾年非常熟悉使用.NET的技術來開發系統了,說.NET技術可能並不會有啥大不了的感覺,但如果說用.NET的架構可 能就有比較囂張一點,一直以來Java的人都有點瞧不起.NET的,認為那不過是玩具而已,年紀好像越資深越是這樣。

我的看法是這樣,我從2000年開始 學習使用Java技術,當時還是個學生,到了2003年開始接觸.NET,當時也還是個學生,當時的我覺得.NET真是個抄襲Java抄襲的很完全的東 西,不過Tool真的做得蠻好用的,就是相關的套件(Ex: Collections)少了點,2005年後開始工作,也沒想太多,人家說用什麼就用什麼,所以一開始就來比較硬的Struts,當初也學到不少東西, 因為搭配Ibatis,順便在當時學到了ORM的技術,不過沒寫多久就被抓去寫.NET了,那之後寫了將近五年的.NET;也從一邊喜歡.NET的好 Tool,一邊抱怨.NET可以用的Framework太少,到現在看到.NET的大成長(WF,WCF,WPF,ORM EF,LINQ),現在的我覺得.NET已經超好用了,沒想到卻要回去寫Java了,再回來看Java,這幾年幾乎沒啥大進步,實在覺得有點可惜。

不過有老師說:[技術本身沒有好壞,只有用的人才有好壞],我可以理解這個道理。我目前的公司已經有20幾年的歷史,資訊系統少說也有十幾年的歷 史,.NET也不過就是在這幾年才大躍進,如果在那個時間點,腦袋沒壞的人應該也都是會選Java吧(其實這裡還有很多C跟C++呢),而身為一個IT人 員,不應該只是因為專長於某種特定的技術而自喜,反而應該站在管理者的角度去看,這個時候應該用什麼技術,用什麼Solution才是對後續的發展是有益 的。最後,如果你只是把自己定位成一個IT黑手,我相信這樣心態的人可能早晚會被時間的洪流所淘汰,但如果你是把自己定位成一個IT問題解決者,我相信你應該無時無刻都在學習新的技術、架構跟管理手法吧,時間的洪流對你來說,不會只是年紀的增加,還會有知識與經驗的成熟,希望大家能一起共勉之。

SCWCD 考試心得

其實今年是本人第一次換工作,長久以來已經用.NET的技術非常的習慣了,也從來沒想過會再回來接觸Java的技術,進新公司後老闆的期許就是去弄一張SCWCD的證照來,所以也只好入境隨俗去考一張來應應景。這其實已經超過我考證照的極限了,一直以來我都是一年頂多一張證照,而今年年初我就已經去弄了張微軟的BI證照了,想說以後應該可以少寫很多程式開始來玩商業智慧了,沒想到人算不如天算,進了家大公司後,其實資訊系統相當龐大且複雜,所以才發現自己會的技術便顯得相當的渺小了。

廢話不多說,我準備SCWCD其實大概一個月,但是考試的書(猛虎)是從三個月前就已經買好擺在那了,一直以來都有斷斷續續在看,而早在大學時期其實就有寫J2EE的經驗了,剛開始工作的第一年也有寫J2EE,還是用Struts呢,所以對SCWCD的考試內容其實並不算陌生(章節都有看過,就是內容不清楚而已 ^^"),建議真的要考試的人還是要工作有用到才好,不然其實像我寫了好幾年的.NET,在看SCWCD的時候,常常會想到這個技術在.NET裡面是怎麼用的,有時候會分心,心中只是care如果用.NET來寫應該怎麼用(我承認我是來鬧的),不過也因為這樣讓我對J2EE的技術更加的了解,這對我準備SCWCD來說是另一項收穫。

如果你已經是一個熟悉J2EE的開發者,建議你只花兩個禮拜來準備就好了。首先花一個禮拜把猛虎從頭到尾看一遍,另一個禮拜安排每天練習習題,最好到考試前能夠重複練習超過三次以上,把會答錯的問題做上記號,考試前一個小時光看那些會答錯的題目就好了,我是依循這樣的方式去考,最後雖然沒有滿分過關,但分數也不低就是了。

如果你不是一個熟悉J2EE的開發者,建議你先買額外的書籍,在此建議買Head First系列的JSP and Servlet,不過你可能需要先花一個月K這本書,另外在花另一個月K猛虎吧,這樣是為了確保考過之後,你是真的懂SCWCD,而不是只是考過而已。

我是在新竹的巨匠考的,因為剛好之前在台北的巨匠有上過課,所以在巨匠買考券有折扣(詢問過III,UUU了),不過考試前倒是有一些小插曲,當我進入考場詢問考場人員相關注意事項的時候,考場人員丟了一句話說,如果你是背題庫的,請至少撐過半小時再出來,真是傷人阿 ;雖然我是看著題庫練習的,但被這樣說是有點不爽,不過這表示Oracle SUN的考試本來就有漏洞阿,題庫在外面就買的到了,還是最搶手的書籍,這能怪誰呢。

前一份工作我還有機會可以面試新人,當時看到有證照的人我通常會問一些相關的問題,已確定他是否真的有實作經驗,而不是背題庫去換張證照而已,沒想到當我去考試的時候,還被這樣詢問,實在是有點不是滋味。

2010年7月21日 星期三

探討ASP.NET Run Account

會寫這篇文章是因為最近使用WCF 呼叫 COM object的時候遇到了權限的問題。原本我一直以為WCF host on IIS的時候,他的Run Account就會和ASP.NET的設定一樣,由於我原本所撰寫呼叫的COM object使用WCF host在IIS上的時候,一直出現奇怪的錯誤(看不出來是權限問題),但是host在console ap or windows service上面都是OK的,所以我還是直覺是Run Account的問題。為了解決這個問題我才知道WCF的Run Account並不是跟ASP.NET的設定一樣,而是直接聽命於Application pool的Run Account。底下做了一些實驗(PS:先確定ASP.NET的authentication mode為windows)。

實驗一:預設的Run Account (新增一個aspx的頁面,並於加入底下程式碼)
protected void Page_Load(object sender, EventArgs e)
    {
        Label1.Text = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
    }
上面的程式碼執行結果如下
 由上圖可知,預設為NETWORK SERVICE的帳號在執行asp.net的頁面

2010年6月14日 星期一

Hibernate in Eclipse

本篇文章先不介紹Hibernate的相關內容,只著重在如何搭配Eclipse plugin來產生Hibernate的相關設定檔。

要讓Hibernate能夠work的最基本條件,就是需要有底下三種東西
1.Configuration File (hibernate.cfg.xml)
2.Mapping File (*.hbm.xml) ->hibernate 3.x 可以直接使用Annotation在DTO 中描述即可
3.DTO

依照下列的操作方式,一步一步即可 (注意 : 這裡亦不介紹hibernate plugin的安裝,之後的文章中再介紹)

步驟1:注意,這裡要選擇Others(圖片抓的不好)


2010年4月22日 星期四

要換工作了,過陣子這裡可能會出現Java的文章了吧 ^^

最近在看的書籍
  • Spring 2.0
  • ExtJS
  • Hibernate
  • EJB

過陣子來寫個Hibernate IDE教學好了 ^^

2010年2月9日 星期二

Different between Event and Delegate

  • Event is Arraylist of delegates .
  • Delegate ( as its English meaning ) : Secretary or someone who connect two persons throuh him .
  • Delegate can fire only one method

2010年2月8日 星期一

[T-SQL] INTERSECT 交集查詢

最近寫程式遇到的一個問題需要使用到SQL的交集查詢的功能,問題內容如下,我有一群各式各樣的"藥"的資料,而每一個藥是由"不同成分"所組成,我需要知道的是同時符合某些成分的要有哪些?

這個問題敘述乍看之下很簡單(符合某些成分的藥),但仔細想才覺得事情不是傻人的想的那麼簡單,問題的重點在於需要同時符合某幾個成分,這樣的藥有哪些,以下面的例子來看

SELECT [MedID]
      ,[MedName]
  FROM [Northwnd].[dbo].[MedTB]

2010年1月28日 星期四

用 FileManager 當asp.net部署管理系統 (Part 2)

繼上一篇文章提到如何使用FileManager來部署新程式,其實步驟非常簡單,只需要把要部署的程式上傳到正確的路徑就可以了,底下示範使用一個名為 HelloToday.aspx的程式來部署,該程式aspx內容如下(只有一個Label元件)


2010年1月8日 星期五