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日 星期四

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日 星期五