2014年2月19日 星期三

UML: 快速進入SA/SD 或專案管理人員必備工具,資訊管理人員/老闆必讀(第一篇:資訊人員篇)


學老半天(真的很久)
後來發現,被一堆人問了到底為何用 UML 圖,自己也疑惑了好久,最後發現他的價值

古代人狀況一:
以前都自己做程式,跟2-3個二人快速建製程式,效率又快又好,幹嘛那東西,太慢了~!

古代人狀況二:
所有的東西我有screen shot, input/output 都可以跟 user 需求到,幹嘛畫啥 UML
input/output 正確,中間邏輯我自己解決就好啦,甚麼 UML??

古代人狀況三:
有 SA/SD 規格都弄好了給我寫程式,我照本宣科就好,幹嘛學那?反正資訊人員工作挺好找的,換個工作又容易,又可加薪水,學那幹嘛?

古代人狀況四:
我好優秀喔,我一下就學會 UML, 也都畫得出來,也會分析,也會 coding, 工作也做得出來,然後呢?Domain know-how 不用了解啦,很會問、會畫圖,然後給下面人做 coding 就好啦。但是網站卻不賺錢。。。。。業務的錯啦,公司的錯啦。。。。

以上狀況
狀況一:
中小型企業公司商業邏輯簡單,當然這樣就夠了,但如果沒有乖乖的做好顯示層/邏輯層/商業邏輯層分開,以後要 refactor 你就很難了。如果架構開始變複雜,那就開始爆掉了,沒人想維護,離職開始

狀況二:
這跟一很像,中間邏輯自己解決,然後呢?沒分層好,你一直在增加自己的 "技術債務",然後離職潮開始。

狀況三:
大公司分工清楚,這很好,但台灣以後直接跟對岸競爭,不會畫沒關係,先學會看吧

狀況四:
優秀的資訊人員應該像是名醫,你的病人(需求者或是老闆)跟你說他的症狀,你可以替他解決現在的問題和未來的問題(撇開道德風險不談)。
你有過去看名醫生排很久,然後他1分鐘就看完嗎?因為他看太多了,一眼看出問題在哪。

喔,that is great。

但是,你有時會不會覺得還是醫不好,他一直在症狀治療
或是告訴你他多懂,但你的病一直不好
你有看過 Doctor House 這部美國影片嗎?他最主要是說很多病因是由家中環境影起
所以他都會去派他的手下去看病患的家中去採集狀況。
不去了解 domain know-how 的自負工程師,就像不去真的了解病患家中實際環近狀況的醫生
一直用儀器治療,然後症狀治療,醫不好反正也不是我的問題,我又不是神。
但這樣真的是優秀的工程師嗎?

你可能會想。。。我又沒多拿錢。。。。我在公司地位很高了(或還不夠高),還是忙內鬥或向上管理等事務吧


但這樣真的是優秀的工程師嗎?




圖案來源:http://stuffkit.com/wp-content/uploads/2012/10/amazing-photos-2012-27.jpg

為何寫網誌?



夠了,我一直以來不太想寫這東西的原因很簡單

第一:
要讓別人找到你的網誌,你的內容必須有當下的價值,有潮流性的或參考類的就可以很容易被找到

第二:
如果要有長期被訂閱的價值,那你可能要有實質的(或人家以為你有)商業價值、實質效用/效果或娛樂性等。

如何快速做到(內容):
一般人能快速做到的就是轉載其他的資訊來增加內容物,比如好餐廳/食物、專業技術分享等,就可以快速累積人氣。如果是潮流話題,那你能分享的話,那就更快速了。因為大家會想知道最新知識、如何成功、如何賺錢等就更靈光了。


但是。。。。人是會被用盡的,也就是時間有限,怎麼可能真的一直言之有物又分享不完,所以只能拿別人的物品或東西來PO了。。。。那跟我個性不合,我又不是做廣告的~!
最後大多變成廣告工具或網拍等,才能有比較巨額的金錢收入進來。。。。

我覺得我有些觀念要改,就這樣。。。。但要 change to a different way, my way.

2014年2月5日 星期三

看完 Kenming 的 "【外包開發與管理】從開發者角色看「兩地分工」開發流程"

啊,
很多東西要學習

看完了 Kenming 的文章 "【外包開發與管理】從開發者角色看「兩地分工」開發流程"
覺得是我一直想要找的架構
雖然我的目的是要內部分工, 不是要真的外包, 但其實也是個可以認真考慮的架構

最近新團隊人員一直加入, 如果沒有個架構可不行, 不然會大亂
所以除了安排好每個人的工作和發掘大家的專長是首要任務, 但又不能荒廢開發進度
所以有幾件重大事情需要盡快完成

1 團隊使用 UML 工具的普及度:
  團隊人員已有人會用 StarUML但考慮要不要慢慢轉換到 Enterprise Archtect
  參考軟體:StarUML, Enterprise Architect

2 人員架構的安排:
  因為是新隊伍,所以必須快速的評估每個人的屬性和特值,但比起團隊的很多人,
  我年資沒比他們高,要決定這些東西,只能去請教他們
  參考資料:Kenming 的文章 "【外包開發與管理】從開發者角色看「兩地分工」開發流程"

3 Agile development, 敏捷開發:
  哇,這東西聽起來是不錯,但執行起來還是需要有經驗的人來帶,
  不然以後很難矯正回來。3人團隊和10人團隊,畢竟方式完全不同。
  聽過團隊之前的經驗都是原本公司自行開發的專案管理軟體或
  直接用MS excel 或 MS Project 是不錯
  但是,我希望可以有 敏捷開發的 iteration 概念,我覺得這才是王道
  參考軟體:
  VersionOne $$$$ --> Link 
  Jira/Greenhopper $ --> Link
  Rally $$$$$ --> Link
  OnTime $$ --> Link
  Visual Studio $$$$$$ --> 整合,但是需要 VS ultimate 版本

待續.....
  
  

2013年4月5日 星期五

如何用C# 寫成 COM+ 物件後然後使用 asp 調用 custom class Array(PHP就不用和麼麻煩) => Retrieve Custom class array from COM object using Classic ASP


我現在在維護一些傳統 asp 網頁,裡面會使用到我自己寫的 COM (C#),然後把他安裝到元件服務

我所需要的回傳物件 data 格式為下

    public class eTicket_Info : ServicedComponent, IeTicket_Info
    {        
        public int OrderBulkNo { get; set; }
        public string Pno { get; set; }
        public string agentId { get; set; }
        public string rloc { get; set; }
        public DateTime rlocCreateDate { get; set; }
        public string OfficeID { get; set; }
        public string SessionKey { get; set; }
        public string IATA_Number { get { return "3XXXX615";  } }
        public string Issuing_Agent { get { return "AXXX"; } }
        public string Issuing_Agent_Location { get { return "XXX";  } }
    

        public object flight_Detail_Info {
                         [return: MarshalAs(UnmanagedType.Struct, SafeArraySubType = VarEnum.VT_ARRAY)] get; 
                        set; } //Flight_Detail_Info        
        public object members_simple_Info { 
                        [return: MarshalAs(UnmanagedType.Struct, SafeArraySubType = VarEnum.VT_ARRAY)] get; 
                        set; } // Members_simple_Info

    }

嚐試過很多次,總算找到對的方法,因為不知如何調用 members_simple_Info [],最後發現是必須使用。


 [return: MarshalAs(UnmanagedType.Struct, SafeArraySubType = VarEnum.VT_ARRAY)] get

然後其實回傳的是 array。而且他的 Type 請放 objectVB喜歡這樣,如果傳回他原本的 Type,會有 error

在 Implementation class 裡需要這樣寫才才行


       var _fdCount = _fd.Count();
       if (_fdCount > 0)
              {
                     data.flight_Detail_Info = new Flight_Detail_Info[_fdCount];
                     data.flight_Detail_Info = _fd.Cast<object>().ToArray();
               }
               else
                      data.flight_Detail_Info = null;

在 asp 裡請這樣寫,重點是,這樣寫後,我可以直接把 array 指定給參數(以下藍字)



Dim  data
Set data = PNRObj.retrievePNR((PNR), (OrderBulkNo), (O_autoindex), (ms_sno) )

response.write "data.rloc(8):" & data.Issuing_Agent


'Set paxs = data.members_simple_Info
if IsArray(data.members_simple_Info) then Response.Write("IsArray") & "<br />"
Response.Write( "VarType(data.members_simple_Info:" & VarType(data.members_simple_Info)) & "<br />"
Response.Write("UBound:" & UBound(data.members_simple_Info)) & "<br />"
Response.Write("VarType(data.flight_Detail_Info):" & VarType(data.flight_Detail_Info)) & "<br />"
Response.Write("UBound:" & UBound(data.flight_Detail_Info)) & "<br />"


if UBound(data.members_simple_Info)>=0 then
paxs = data.members_simple_Info
For Each pax In paxs
response.write pax.firstname & "<br />"
Next
end if

if UBound(data.flight_Detail_Info)>=0 then
flights = data.flight_Detail_Info()
For Each flight In flights
response.write flight.fltConxFrom & "<br />"
Next
end if



大功告成

Improvement:
看可不可以簡化 C# 那裡的 code, 再跟大家做報告

2013年2月28日 星期四

C# Serviced Component architecture: Best Practice for Enterprise 企業所需的程式架構1:原有32-bit元件怎麼辦?PHP也可接喔

花了好多時間建置和測試 C# 的 Serviced Component,測試和建置結果對於企業級的公司有很大的好處,為何呢?要做到3層式(或多層式)架構對企業來說是非常重要的,因為如果企業如果遇到要加新的功能,或 expose 原有的功能到新的 presentation layer (mobile 手機, iPad, 等)那你就一定要把 presentation - business - data , web service etc 等都分開來為不同的 layer,來取得可以改變程式架構的空間,當然複雜度也會增加,但因為不同的部分都會由不同的工程師來負責,所以也可以讓多人同時工作。

市面上 Serviced Component 書很少,不然就是很舊,然後 Microsoft 又一直說要改成 WCF,但根本就一樣概念的東西。。。。只是需要判斷不同的 techonogy 需要在何時情況才用。


好了,不廢話了,直接把結果說出來:

把既有的 business, data component 等 ( C# or vb6 or etc.),放在你已有的地方不要動,多做出一層 ServiceComLayer.cs 把你要 expose的 functions 使用 繼承 ServicedComponent 來 expose 出來給其他的不管是 Delphi, VB6, PHP, classic asp,只要是32-bit window,他都吃。(不用每個 class 繼承 servicedComponent)

我知道你會說,等等,不是要 64-bit 時代了,你還在管 32-bit?

1. 你不可能每次都做新的功能或案子,就不理舊的東西,企業需要延續性
2. 就算是新技術,此確保舊功能(dll 元件)都還可以用,在加上新的功能(技術)時,延伸就好了。因為你的核心已是C# 最新的framework,你只是 expose 給其他技術(或平台)做連接, e.g. PHP也可喔,ASP.NET無敵慢。
3. 連接 third party Component  然後 expose到你現有(32-bit app, vb6 etc) 或新的 C# application都可以。
4. 做成 web service給 application 或網站使用,執行效率太差了~
5. 如何服務 mobile application, 之後我再發表吧。。。。這樣一來,同一套程式,不用寫那麼多次。。。。只要改presentation layer就好了。

如果你覺得沒用,可能你貴公司不是在此企業架構下,就不用想那麼多啦~!
就算是 Wall Street Journal 也還有很多 classic asp (http://chinese.wsj.com/big5/index.asp)頁面,PHP頁面(https://secure.wsj-asia.com/subscription1/index.php),這不是一時三刻改得完,或怎是企業覺得沒有必要去換成新的網頁技術(因為舊的還很好用)。那以上文章可幫助你朝這方向前進。





2012年11月2日 星期五

[C#] GACUtil.exe location 執行檔案


GACUtil.exe location 執行檔案
32-bit
C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin\NETFX 4.0 Tools\.


64-bit
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools





2012年10月30日 星期二

[C#] 轉換成數字的方法:int.Parse()、int.TryParse()、Convert.ToInt32()

將字串等型態的值轉換成數字是常用到的轉換
不過有時候轉換失敗時
就會產生錯誤
雖然可以用try.....catch去處理例外
不過int.TryParse()更方便
只要轉換失敗
就會傳回false和數字0
這可避免不必要的例外

以下是三種方法的狀況比較

//int.Parse各式輸入值的狀況
int.Parse("20");   //20
int.Parse("1000000000000");   //OverflowException
int.Parse("a");   //FormatException
int.Parse(String.Empty);   //FormatException
int.Parse(null);   //ArgumentNullException
//int.TryParse各式輸入值的狀況
int resultInt = 0;
int.TryParse("20", out resultInt);   //True
int.TryParse("1000000000000", out resultInt);   //False
int.TryParse("a", out resultInt);   //False
int.TryParse(String.Empty, out resultInt);   //False
int.TryParse(null, out resultInt);   //False

//Convert.ToInt32各式輸入值的狀況
Convert.ToInt32("20");   //True
Convert.ToInt32("1000000000000");   //OverflowException
Convert.ToInt32("a");   //FormatException
Convert.ToInt32(String.Empty);   //FormatException
Convert.ToInt32(null);   //0




我的用法:
 if (int.TryParse(l_sTimeoutText, out l_iTimeout) == false) //判斷tbxTimeout2.Text,字串是否為數字,不是就傳出false,並使用預設值
            {                                                          //string轉int
                l_iTimeout = 1000;
            }


 Quote reference: 小葛部落格