有朋友問在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實做。
2011年3月7日 星期一
2010年10月19日 星期二
LINQ not in
今天因為處理繪圖需要針對集合做not in的運算,主要是因為TeeChart提供的API實在太弱了,所以有些運算只好自己土法煉鋼。故事大綱是這樣的,我有100個Point,符合條件的其中的20個我想要拿掉,如果不使用LINQ的話,做法如下
改成使用LINQ的話
結果會與上面一樣
透過LINQ,程式碼可讀性會提高很多,不過這裡的not in的用法第一次用,所以稍微花了點時間找
//針對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的話
Listpoints = 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問題解決者,我相信你應該無時無刻都在學習新的技術、架構跟管理手法吧,時間的洪流對你來說,不會只是年紀的增加,還會有知識與經驗的成熟,希望大家能一起共勉之。
我想要分享一下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的考試本來就有漏洞阿,題庫在外面就買的到了,還是最搶手的書籍,這能怪誰呢。
前一份工作我還有機會可以面試新人,當時看到有證照的人我通常會問一些相關的問題,已確定他是否真的有實作經驗,而不是背題庫去換張證照而已,沒想到當我去考試的時候,還被這樣詢問,實在是有點不是滋味。
廢話不多說,我準備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的頁面,並於加入底下程式碼)
由上圖可知,預設為NETWORK SERVICE的帳號在執行asp.net的頁面
實驗一:預設的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(圖片抓的不好)
要讓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日 星期四
訂閱:
文章 (Atom)

