2013年12月26日 星期四

JavaScript 使用 Math.random 取得隨機變數值

一個亂數值夠不夠亂,分佈的是否平均,是決定機率值公不公平的關鍵。

在 JavaScript 裡要產生一個亂數,首推的就是 Math.random() 這函數了。而這個函數值所分佈的範圍是 0 ~ 0.9999... 之間,可以用一個數學式來表示   0≦ X < 1

2013年12月24日 星期二

讓 Web.config 支援 .Net 3.5 的 Compiler



在舊的 .Net  2.0專案升級成 3.5 後,總是會想要使用新的功能。但很奇怪的,是我程式開發的電腦上可以正常執行,但將程式放到上線區後,就會出現下面的錯誤訊息:

) expected


使用 Linq 的 Distinct() 方法

過去對於要在一個字串中( ex: "A,A,B,C," )取得不重複的組合,不動大腦的方式就是跑迴圈吧!真正要開始寫的時候,心裡就會再嘀咕說:「可是還要寫很多行ㄟ...」

2013年11月21日 星期四

我對生死的初淺瞭解

週末參加了位於宜蘭的青廣聯誼活動,感受到年輕人的熱情與活力。每個人的臉上,都像是盛開的花朵,似乎前面有著無限可能在迎接著他們。隔天,也就是週一,我接到一位讚頌班師姊病逝的消息,下班後我就到醫院去助念。在那一刻,又彷彿覺得一切的事物其實是不真實的,因為你隨時都有可能會失去一切,也一定會失去。

年輕的時候,怕得到的太少。所以不斷地努力,主要目的是想要得到更多。
年老的時候,怕失去的太多。所以不斷地努力,主要目的是想要失去更少。


2013年10月4日 星期五

用 LinqToExcel 輕鬆讀取 Excel 內容

先前提到在匯入 Excel 時還要費點力氣去判斷 Sheet 的名稱,今天在網路上找資料時,發現另一個用來讀取 Excel 的不錯選擇-- LinqToExcel。但它只能用來讀 Excel ,不能寫入喔 (參考03)。

首先到下面網站去下載 LinqToExcel 壓縮檔。

https://code.google.com/p/linqtoexcel/

解開檔案後,把下面四個 dll 加入到專案的參考。

LinqToExcel.dll
Remotion.Data.Linq.dll
log4net.dll
Remotion.Data.Linq.dll

2013年10月3日 星期四

讀 Excel 資料時,我是該用 Sheet1 還是工作表1 ?

常常在網路上看到許多前輩介紹 C# 讀取 Excel 檔案內容時,會使用 OleDbConnection 方式,以下面語法來讀取 Excel 內的 Sheet1 內容。

SELECT * FROM [Sheet1$]

2013年9月26日 星期四

RDLC匯出的 Excel 有 Footer 嗎?

使用  RDLC 設計報表,ReportViewer 都會提供匯出的工具,讓我們可以匯出成 Excel 、Word、PDF 等檔案類型。但最近發現,當我在報表上使用了頁首(Page Header) 與頁尾(Page Footer) 時,匯出到 Excel 並將檔案打開後,我的頁尾竟然不見了!

2013年9月24日 星期二

在 RDLC 報表連結外部圖片

使用 RDLC 產生本地端報表時,如果需要動態地更換圖片,那該怎麼辦呢?例如根據不同的使用者就會對應不同的照片。這時候,如果可以讓我們在 .cs 裡面設定報表要連結的外部圖片檔,應該就可以完成了。

2013年9月17日 星期二

在 RDLC 報表使用參數傳遞

透過 Visual Studio 開發 RDLC 報表時,常常為了能夠更彈性地去控制報表,需要以「傳參數」的方式將 .cs 裡的參數串到 .rdlc 報表。這需求大概可分為兩個部份,第一是報表參數的設定,第二則是參數的傳遞。依序紀錄自己這幾天測試的步驟。

2013年9月11日 星期三

覆盤



  • 覆盤:圍棋對羿結束時,將對羿的過程按落子的順序重新再來一遍。研究對羿的內容,作為精進棋藝的方式。

2013年8月25日 星期日

15 分鐘的魔力


高效活用法則:

1.編輯力在渾沌中更有條理
  • 找回自己對於時間的主導權
    ※不管是公事還是私事,在發生前,利用零碎時間一邊記下細節,一邊在心中預演。
  • 擁有整段時間來完成一件工作的機會難得,反而是將大塊工作切割成小塊,分段處理,才是時間編輯的關鍵。
    ※要點:只要是能夠中途暫停的工作內容,就可切割。

2013年6月18日 星期二

讓 ReadOnly 的 TextBox 控制項也能呈現灰色

將 TextBox 的 Enabled 屬性設為 False 時,在畫面上這個 TextBox 會呈現灰色且不能點選。可是如果是將該 TextBox 的 ReadOnly 屬性設為 True 時,在畫面的呈現上,雖然使用者無法做任何的修改,但是顏色上卻不會變成灰色,容易讓使用者誤以為這是可以編輯的。

2013年6月12日 星期三

落地就是蕃薯命-沈芯菱



通常自己在看事情時,第一個想到的是事情會有多困難,得花多少時間才能完成。很自然地,就會生出一大堆藉口或理由,說服自己別做了,別自找苦吃。但有些人卻不一樣,他看事情,第一個現起的是會帶來多少希望,帶來多少機會與無限可能。

以下是摘要自沈芯菱相關採訪介紹影片與雜誌的部份:

2013年6月4日 星期二

不是改個密碼就好了嗎?

遠端的 SQL Server 換個密碼,不是很平常的事,會對你有什麼影響嗎?

有,偏偏被我遇到了,Compiler 之後出現以下錯誤訊息:

------ Deploy started: Project: SqlCommandGallery, Configuration: Debug Any CPU ------
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\TeamData\Microsoft.Data.Schema.TSqlTasks.targets(120,5):
Error Deploy01234: Could not connect to 127.0.0.1 : Login failed for user 'pubOOO'.
Done executing task "SqlDeployTask" -- FAILED.
Done building target "DspDeploy" in project "SqlCommandGallery.dbproj" -- FAILED.
Done executing task "CallTarget" -- FAILED.
Done building target "DBDeploy" in project "SqlCommandGallery.dbproj" -- FAILED.
Done building project "SqlCommandGallery.dbproj" -- FAILED.

Build FAILED.

2013年5月27日 星期一

一切都是最好的安排 (守門人篇)




有一座寺院供奉著一尊觀音菩薩像,因為有求必應,四鄉八鎮專程前來祈禱膜拜,香火鼎勝每天香客特別多。一天,寺院的看門人,對菩薩像說:“我真羨慕你呀!你每天輕輕鬆松,不發一言,就有這麼多人送來禮物,哪像我這麼辛苦,風吹日曬​​才能得個溫飽?”

2013年5月24日 星期五

一切都是最好的安排 (乞丐篇)






不執著,隨緣,感恩 每件事情最好的安排~~

從乞丐到富豪的啟發

從前有一個叫化子每天出門乞討,他很想過正常人的生活,於是他總要乞討一些糧食積攢起來。

可是他積攢了好多年,他的糧倉還是只有那麼一點米。他不明白是怎麼回事,於是他打算弄個明白。

一切都是最好的安排 (國王篇)



從前有一個國家, 地不大,人不多,但是人民過著悠閒快樂的生活,因為他們有一位不喜歡做事的國王和一位不喜歡做官的宰相。國王沒有什麼不良嗜好,除了打獵以外,最喜歡與宰相微服私訪民隱。宰相除了處理國務以外,就是陪著國王下鄉巡視,如果是他一個人的話,他最喜歡研究宇宙人生的真理,他最常掛在嘴邊的一句話就是「一切都是最好的安排」。

2013年5月21日 星期二

ReportViewer 不自動分頁

在 VS2010 上,於 WebForm 環境下使用 ReportViewer 時,網頁上都會自動幫你把報表內容根據預設的紙張大小來做報表的分頁。

在某些情況下,我們反而覺得要一直去點選下一頁,很像不是這麼討人喜歡,何不一下就看光光,看個明白呢?

如果是這樣子的話,ReportViewer 有一個設定可以幫我們完成。只需要打開報表檔 *.rdlc ,如下圖。我們在屬性的下拉清單選擇 Report ,或是你在報表設計範圍裡點選灰色的地方,也會出現。而關鍵就是在 InteractiveSize 的屬性,我們將高度設為 0cm,如此,可以想像我們的紙張是無限長度的紙張,這樣他就不會幫我們自動切割成好幾頁了。


設定後的結果如下。


參考:rdcl 报表设置不分页

佛學66句禪語


簡樸增長慈悲心
真善涵養智慧愛

引導語:禪語主要指從佛門中傳出的精華語句,話語平樸,含意深遠,對人生思想等方面有著精神食糧的作用。

由於禪語的文雅和雋永,常在文學藝術作品中得到應用。
下面本本就帶你去看看震撼世界的66句禪語。



1.人之所以痛苦,在於追求錯誤的東西。
 
2.如果你不給自己煩惱,別人也永遠不可能給你煩惱。因為你自己的內心,你放不下。
 
3.你永遠要感謝給你逆境的眾生。
 
4.你永遠要寬恕眾生,不論他有多壞,甚至他傷害過你,你一定要放下,才能得到真正的快樂。
 
5.當你快樂時,你要想這快樂不是永恆的。當你痛苦時,你要想這痛苦也不是永恆的。
 
6.今日的執著,會造成明日的後悔。
 
7.你可以擁有愛,但不要執著,因為分離是必然的。
 
8.不要浪費你的生命在你一定會後悔的地方上。
 
9.你什麼時候放下,什麼時候就沒有煩惱。
 
10.每一種創傷,都是一種成熟。
 
11.狂妄的人有救,自卑的人沒有救,認識自己,降伏自己,改變自己,才能改變別人。


12.你不要一直不滿人家,你應該一直檢討自己才對。不滿人家,是苦了你自己。
 
13.一個人如果不能從內心去原諒別人,那他就永遠不會心安理得。
 
14.心中裝滿著自己的看法與想法的人,永遠聽不見別人的心聲。
 
15.毀滅人只要一句話,培植一個人卻要千句話,請你多口下留情。
 
16.根本不必回頭去看咒?你的人是誰?如果有一條瘋狗咬你一口,難道你也要趴下去反咬他一口嗎?
 
17.永遠不要浪費你的一分一秒,去想任何你不喜歡的人。
 
18.請你用慈悲心和溫和的態度,把你的不滿與委屈說出來,別人就容易接受。
 
19.同樣的瓶子,你為什麼要裝毒藥呢?同樣的心裡,你為什麼要充滿著煩惱呢?
 
20.得不到的東西,我們會一直以為他是美 好的,那是因為你對他瞭解太少,沒有時間與他相處在一起。當有一天,你深入瞭解後,你會發現原不是你想像中的那麼美好。
 
21.活著一天,就是有福氣,就該珍惜。當我哭泣我沒有鞋子穿的時候,我發現有人卻沒有腳。
 
22.多一分心力去注意別人,就少一分心力反省自己,你懂嗎?



23.憎恨別人對自己是一種很大的損失。
 
24.每一個人都擁有生命,但並非每個人都懂得生命,乃至於珍惜生命。不瞭解生命的人,生命對他來說,是一種懲罰。
 
25.情執是苦惱的原因,放下情執,你才能得到自在。
 
26.不要太肯定自己的看法,這樣子比較少後悔。
 
27.當你對自己誠實的時候,世界上沒有人能夠欺騙得了你。
 
28.用傷害別人的手段來掩飾自己缺點的人,是可恥的。
 
29.默默的關懷與祝福別人,那是一種無形的佈施。
 
30.不要刻意去猜測他人的想法,如果你沒有智慧與經驗的正確判斷,通常都會有錯誤的。
 
31.要瞭解一個人,只需要看他的出發點與目的地是否相同,就可以知道他是否真心的。
 
32.人生的真理,只是藏在平淡無味之中。
 
33.不洗澡的人,硬擦香水是不會香的。名聲與尊貴,是來自於真才實學的。有德自然香。



34.時間總會過去的,讓時間流走你的煩惱吧!
 
35.你硬要把單純的事情看得很嚴重,那樣子你會很痛苦。
 
36.永遠扭曲別人善意的人,無藥可救。
 
37.說一句謊話,要編造十句謊話來彌補,何苦呢?
 
38.白白的過一天,無所事事,就像犯了竊盜罪一樣。
 
39.廣結眾緣,就是不要去傷害任何一個人。
 
40.沉默是譭謗最好的答覆。
 
41.對人恭敬,就是在莊嚴你自己。
 
42.擁有一顆無私的愛心,便擁有了一切。
 
43.來是偶然的,走是必然的。所以你必須,隨緣不變,不變隨緣。
 
44.慈悲是你最好的武器。



45.只要面對現實,你才能超越現實。
 
46.良心是每一個人最公正的審判官,你騙得了別人,卻永遠騙不了你自己的良心。
 
47.不懂得自愛的人,是沒有能力去愛別人的。
 
48.有時候我們要冷靜問問自已,我們在追求什麼?我們活著為了什麼?
 
49.不要因為小小的爭執,遠離了你至親的好友,也不要因為小小的怨恨,忘記了別人的大恩。
 
50.感謝上蒼我所擁有的,感謝上蒼我所沒有的。
 
51.凡是能站在別人的角度為他人著想,這個就是慈悲。
 
52.說話不要有攻擊性,不要有殺傷力,不誇已能,不揚人惡,自然能化敵為友。
 
53.誠實的面對你內心的矛盾和污點,不要欺騙你自己。
 
54.因果不曾虧欠過我們什麼,所以請不要抱怨。
 
55.大多數的人一輩子隻做了三件事;自欺、欺人、被人欺。


56.心是最大的騙子,別人能騙你一時,而它卻會騙你一輩子
 
57.只要自覺心安,東西南北都好。如有一人未度,切莫自己逃了。
 
58.當你手中抓住一件東西不放時,你只能擁有這件東西,如果你肯放手,你就有機會選擇別的。人的心若死執自己的觀念,不肯放下,那麼他的智慧也只能達到某種程度而已。
 
59.如果你能夠平平安安的渡過一天,那就是一種福氣了。多少人在今天已經見不到明天的太陽,多少人在今天已經成了殘廢,多少人在今天已經失去了自由,多少人在今天已經家破人亡。
 
60.你有你的生命觀,我有我的生命觀,我不干涉你。只要我能,我就感化你。如果不能,那我就認命。

61.你希望掌握永恆,那你必須控制現在。
 
62.惡口永遠不要出自於我們的口中,不管他有多壞,有多惡。你愈罵他,你的心就被污染了,你要想,他就是你的善知識。
 
63.別人可以違背因果,別人可以害我們,打我們,譭謗我們。可是我們不能因此而憎恨別人,為什麼?我們一定要保有一顆完整的本性和一顆清淨的心。
 
64.如果一個人沒有苦難的感受,就不容易對他人給予同情。你要學救苦救難的精神,就得先受苦受難。
 
65.世界原本就不是屬於你,因此你用不著拋棄,要拋棄的是一切的執著。萬物皆為我所用,但非我所屬。

66.雖然我們不能改變周遭的世界,我們就只好改變自己,用慈悲心和智慧心來面對這一切。








2013年4月24日 星期三

透過 HTML Agility Pack 抓網頁資料


多年以前,已經忘了是從哪邊學到有關抓網頁的語法,當時能夠把網頁抓回來就已經很開心了,後面的扒資料雖然扒的很辛苦,卻也甘之如飴。時日漸增,如今想到要扒資料,不免有點力不從心。經由 Gower 的推薦,找到 HTML Agility Pack,透過類似 XML 的 XPath 方式,可以很容易的找到所需要的內容。

基本的 HTML Agility Pack 介紹可以參考 HTML Agility Pack:簡單好用的快速 HTML Parser


我在官網下載了 [Documentation] 手冊,並在 Agility 裡面找到 HtmlWeb 類別提供了一個 Load() 方法,經測試後,的確會如該文章作者所說,對於中文會出現亂碼的問題,不過可以透過設定編碼方式來解決,可參考:

HtmlAgilityPack - How to set custom encoding when loading pages


HtmlDocument hDoc = new HtmlDocument();
HtmlWeb hw = new HtmlWeb();
hw.AutoDetectEncoding = false;
hw.OverrideEncoding = System.Text.Encoding.Default;
hDoc=hw.Load("http://tw.stock.yahoo.com/q/q?s=2002");

string strResult = hDoc.DocumentNode.OuterHtml;


這裡去抓取網頁的方法是透過 HtmlWeb.Load(),而文章作者使用的則是 WebClient.DownloadData(),古早前我所學到的則是 WebRequest.GetResponse(),這三者雖然都可以完成抓網頁的功能,但以效能來說:

WebRequest.GetResponse() > WebClient.DownloadData() > HtmlWeb.Load()

可由以下效能測試圖表觀察得知。




[統計程式下載]


經由多次的測試結果來看,使用 WebRequest.GetResponse 與 WebClient.DownloadData 效能都還不錯,但使用 HtmlWeb.Load 的效能就差很多,如果將來有考慮到效能問題,應該避開使用 HtmlWeb.Load 方法。

參考:

2013年3月25日 星期一

project has not been confiured



剛接手一個 VS2010 的專案,想說都是同樣的開發工具所開發的,應該沒什麼問題吧!結果專案一打開,竟跳出個我很陌生的錯誤訊息,然後該專案就無法開啟。

錯誤訊息如下:
The local IIS URL http://localhost/XXX specified for Web project XXX has not been confiured. In order to open this project the virtual directory needs to be configured. Would you like to create the virtual directory now?



從錯誤訊息看起來,是因為這個專案是採用 Web Site 模式開發,但在我的 IIS 裡面找不到相對應的虛擬目錄。原來這專案當初在命名時,可能使用 OOO,但對應的網站虛擬目錄卻是用 XXX,難怪我一開始根據專案名稱來建虛擬目錄時會建錯。

這時候有兩個解決方法,第一個最簡單,就是去更改 IIS 的設定,將 IIS 的虛擬目錄名稱改為 XXX。第二個,則是自己比較陌生的方法,但其實也不難。只要在無法載入的專案上按右鍵,就會出現 Edit OOO.csproj  的選項,點選進去後,會出現一份 xml 格式的設定檔,找到 <IISUrl>,把他註解掉(mark)或改成 http://localhost/XXX ,再重新載入一次專案就可以了。

是不是採用註解 (mark)掉的方式,差別在於:

用註解掉(mark)的方式,程式在執行時,他會透過虛擬一個網站的方式,以 http://localhost:1234/XXX 來呈現。
<!--<IISUrl>http://localhost/XXX</IISUrl>-->

但如果你的 IIS 裡早就已經設定好網站路徑,則可以將 OOO.csproj 裡的 IISUrl 改成正確的位置即可。程式執行實則會是: http://localhost/XXX

參考:The local IIS URL specified for Webproject has not been configured.

2013年3月18日 星期一

Windows 排程無法執行


用 .net 的 console 模式寫了一個 .exe 檔,在自己電腦上直接執行,是正常的,主要功能是讀取同個資料夾下面的 xml 檔,並進行後面的一些處理工作。但奇怪的是,當我使用電腦排程去呼叫 .exe 檔時,就會在排程表裡面發現所建立的排程一直處於「執行中」的狀態,且這個現象一直都不會停止,由於我是設成每天都要執行,所以當第二天的同個時間要執行時,就會出現錯誤,理由是先前的工作尚未結束,所以無法再做新的。這理由我倒覺得合理,但問題是,為何第一天執行的程式遲遲無法結束呢?心裡第一個念頭,是該不會在裡面給我跑無限迴圈吧!!

就在自己含淚一行一行的檢查程式之餘,發現原來程式是停在下面這一行:


System.Console.ReadLine();


原先是我用來判斷是否使用者有正確的擺放 xml 檔到執行程式的資料夾,沒有的話就會跳出訊息,並將執行畫面暫停,等待輸入「Enter」鍵之後再繼續執行。只是這作法,放到 windows 排程裡,就會造成系統為了要等待輸入「Enter」而停在那一直無法結束,其實程式不是在跑無限迴圈,而是無限等待


然而,真正產生問題的原因,並不只是因為自己誤用了 ReadLine()而已,最主要的問題是為何會找不到 xml 檔呢,我用我的兩隻眼睛的確在執行檔的資料夾下面都有看到啊。在網路上有看到許多人在討論 windows 排程無法正常執行的討論議題,其中「Windows server 2008 排程無法執行」這一篇有提到,如果有對檔案進行存取動作時,要使用完整路徑,否則他可能預設會用 C:\Windows\System32 資料夾來處理。我測試了一下,的確如此,假設我是直接去執行 .exe 檔,則他就會以執行檔所在路徑來處理,但使用排程時,就變成 C:\Windows\System32 了。

我在程式裡面有使用到

DataSet dsConfig=new DataSet();
string strFileName="setup.xml";
if(System.IO.File.Exists(strFileName))
{
    dsConfig.ReadXml(strFileName);
}


這寫法很不幸的,在使用 windows 排程時會發生找不到 xml 檔的問題。

於是我改用完整路徑的方法來改善。


首先,透過 GetExecutingAssembly().Location 取得執行檔的完整檔名路徑
System.Reflection.Assembly.GetExecutingAssembly().Location


接著只取執行檔的完整路徑(不含檔名)
Path.GetDirectoryName(FileName)

所以修改後的程式就變成:
DataSet dsConfig=new DataSet();
//取得執行路徑
string strExecPath = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
//取得 .xml 設定檔完整路徑,windows 排程需使用完整路徑設定
string strFullPath=string.Format("{0}\\{1}",strExecPath,setupFile);


if(System.IO.File.Exists(strFullPath))
{
  dsConfig.ReadXml(strFullPath);
}


原來,將程式改寫為 windows 排程,還需要考慮是否使用「完整路徑」的問題啊!

參考:Windows server 2008 排程無法執行