發表文章

目前顯示的是 2012的文章

DOS批次檔中取得中華民國年份

圖片
開始覺得DOS的批次檔指令真是高深莫測了。 最近想完成個小需求就是要寫一個DOS Batch指令檔,去Linux主機上用FTP模式下載一些檔案下來。 這些檔案的檔名都是以日期編名的,如果是用西元年,那倒也還容易。可是這次的檔名卻是用中華民國的年份。@@ 好吧,西元年算到中華民國年份,充其量用個減法減去1911年就可以得到了。但在DOS的批次檔中要如何寫啊? 首先要取得西元年的日期 在Dos命令列視窗中輸入date /t可以取得目前的日期,但格式化後取得的結果如下,它會多一個星期幾的字串。 但我們並不想要這個星期幾的字串,而且也不想要"/"。所以可以用如下的指令來取得20121003的字串: @echo off REM 產生日期參數 @For /f "tokens=1-3 delims=/ " %%a in ('date /t') do (set date=%%a%%b%%c) @echo %date% pause 執行的結果如下: 上面DOS指令中的For的意思就是將date /t的結果,依delims(分割字元)來區隔,注意這裏設定的分割字元有兩種,一種是"/",另一種" ",是空格喔。接著它會取分割後的第一到第三個部份,這是tokens=1-3指定的。 並且所分割出來的部份是以%%a開始命名變數,所以這三個分割出來的變數名稱就是%%a、%%b及%%c。 分割完成後就執行do裏面指令的指令 set date=%%a%%b%%c。這樣就可以得到20121003的字串了。 計算民國年 有了西元年月日,接著就是要計算民國年了。前面我們得到的字串其內容為20121003,接著我們想要取得前面四碼。要如何取得前四碼呢?這又是個難題了。後來查了一下,正好看到有人提供一個方式: set tt=%date:~0,4% 原來SET指令還有這種模式可以用來取得字串的某一部份,真是沒想到。後來就查了一下 SET指令的說明 ,才知道真有這種方式。 不過取到了前四碼,那要如何進行數學運算呢?原來也是用SET就可以了: SET /A ChinaYear=%Year%-1 在SET指令中加上/A的參數就是表示

有Administrator權限卻無法用gacutil.exe安裝

圖片
今天發生了一件奇怪的事,在一台裝了Windows 2008 R2作業系統的伺服器上,新增了一個帳號,並將這個帳號加入到Administrators群組中。理論上用這個帳號登入的使用者,就等於有了管理員的權限,要安裝什麼軟體都是沒問題的才對。 可是當用這組帳號登入後,開啟命令列視窗後,執行了gacutil.exe來安裝.NET開發出來的元件時,卻出現了以下授權不足的錯誤訊息: 一開始以為是什麼UAC功能要關閉,結果關了也是沒效。後來才知道有人說要用管理員的身份來開啟命令列視窗才行。本來以為登入者具有管理員權限就可以了,沒想到在開啟命令列視窗時還要特別用管理員權限開啟才行。 如果不是用管理員權限開啟視窗的話,會發現在視窗上面是沒有管理員的字樣的:

perl正規表示式(regular express)初體驗

# 2012/8/21 Justin # test # Regex查詢時,=後要直接接~,不然就match不到 my($rawData) = "HintA"; $rawData = ~m/(H.*)/; print( $1 . "\n" ); my($text) = "HintA"; $text =~m/(H.*)/; print $1 . "\n";

設定及存取Android專案中的Asset資源

圖片
最近要試寫一個Android的App,這個App需要使用到資料庫。只是一般程式一開始安裝後一定是沒有資料庫的,那第一份資料庫要由何而來呢? 一開始我天真的想法就是利用Android內建的 SQLiteOpenHelper ,先繼承它,並改寫其中的幾個函式,當程式一執行時會被呼叫到,此時再產生一個空白的資料庫,並執行一堆產生資料表的SQL指令。哈,這方式雖然可行,但如果資料庫裏的資料表很多的話,真的先程式碼就要寫一堆了。 一直在想說難道我不能內嵌一份最原始的SQLite資料庫檔案,當程式第一次執行時,就以這份為初始資料庫來給使用者使用嗎? 後來查了一下網路上的資料,參考別人的作法,總算是看到也有人 有同樣的實作方式 ,而且相關的程式碼都有了。當然就直接拿來使用囉。 只是一時不察,在這段程式碼的CopyDataBase()中有一段是: //Open your local db as the input stream             InputStream myInput = context . getAssets (). open ( DATABASE_NAME ); 一開始我以為context.getAssets()是存取App的根目錄,所以open()時會自動取得我放在根目錄下面的那份原始資料庫檔案。結果進行debug時發現在這段都會得到一個無法找到檔案的Exception。 後來查了一下有關getAssets()函式的說明,才知道原來這個函式會傳回一個 AssetManager ,透過這個AssetManager可以存取在專案中的一個Assets區塊。 所以一開始需要將原始的那份資料庫檔案放到這個Assets區塊中才能正常讀取並複製一份給第一次安裝App的使用者來使用。 只是查了很久,查不太到有人在說明如何將一份既有的SQLite資料庫檔案放到這個Assets區塊中來使用。於是就自行摸索了一下,總算是成功了。為了怕日後忘記,趕快在Blog中記錄一下。 首先在Ecllipse的Workspace中找到你的Android App專案,並找到它的assets區,如下圖所示。 在assets區中按下滑鼠右鍵,會出現如下圖的選項,請選[New]->[File]以便新增一個檔案。 在出現的對話視窗

StatusStrip裏的text元件無法更新

一般在C#中要更新某個TextBox或Label,只要將它的Text屬性設定成新的值就可以即時在畫面上看到最新的資料。 但今天使用到了一個StatusStrip裏的ToolStripStatusLabel元件,想要即時更新它的內容值時,同樣是指定了它的Text屬性,但並沒有即時更新。 查了一下網路上的解法,好多人都是說要用 this.Refresh(); 是可以這樣啦,只是這樣是叫整個Form本身去更新,更新的範圍會不會太大了。如果呼叫的頻率太高的話,我想效能上應該會有所影響。 後來想說去找一下ToolStripStatusLabel元件本身是否有Refresh()函式可以呼叫。結果是沒有。難怪大家都沒辦法,只好對整個Form來下手。 順手看了一下,那StatusStrip本身有沒有Refresh()呢,沒想到還真的有耶,那就叫StatusStrip去更新就好啦,不用叫到整個Form去更新。 問題就解決囉。

沒有預設建構子無法對List<>進行xml序列化

圖片
突然需要寫個xml的設定檔,於是就簡單寫了一個類別TestXml,其中含有一個List<TestA>的成員。TestA也是個簡單的類別,只有兩個屬性及一個帶有參數的建構子。 針對Xml的序列化也是簡單地使用XmlSerialize類別來處理,程式碼如下。但是一執行就出現了Exception。 Exception的內容是這樣寫的,它說無法序列化List<>中的型別。 一開始以為是TestA類別上要加上[Serializable],結果加了也沒用。後來又加了XmlArray、XmlArrayItem等等的,還是沒用。 最後就放棄List<>,先針對單一的類別TestA來進行Xml序列化,才知道原來是TestA這個類別沒有預設建構子(就是不帶任何參數的建構子)。找了半天,原來是這個問題。一切只能說List<TestA>無法序列化時的錯誤訊息也太不直覺了吧。

IntelliSense: PCH warning: header stop

圖片
下圖中的程式碼基本上語法都沒有錯,但在VS2010中卻出現了一項錯誤訊息:IntelliSense: PCH警告:標的停駐點不可以在巨集 ...。 查了一下MSDN剛好也有人反映這項問題,不過是英文的錯誤訊息( IntelliSense: PCH warning: header stop cannot be in a macro or #if block. An intellisense PCH file was not generated. ),難怪用中文都Google不到。 看來好像是在專案建立時如果選擇使用預先編譯的模式的話,在你新增的標頭檔還沒有任何程式碼引用到時,就會出現這個錯誤訊息。只要一旦你開始在任何一份程式碼中開始引用這份新的標頭檔後,就會開始自動地產生Intellisense的資訊,這項錯誤也會自動消失。

System.Data.OracleClient將過時

圖片
最近開始要試著使用.NET C#來存取Oracle資料庫。基本上所使用的物件跟MSSQL Server的差不多,只是由SqlConnection改為OracleConnection這類的。 只是一開始發現.NET中也有提供Oracle資料庫的Provider,所以就直接使用System.Data.OracleClient。程式碼編譯是沒有問題,但卻出現了警告,主要是說 這組函式庫即將會過時 。看MSDN網站是說在.NET 4.0中還會支援,但未來就不一定了,所以希望大家先改為使用第三方函式庫的方式來存取Oracle資料庫。 如果是要用第三方函式庫的話,當然最好的方式就是找原廠的函式庫囉。在Oracle的官網中可找到給Visual Studio 使用的Oracle函式庫開發工具: ODAC 11.2 Release 4 and Oracle Developer Tools for Visual Studio (11.2.0.3.0) 安裝成功後,在加入參考時應該可以找到Oracle.DataAccess這個函式庫。程式碼基本上都不用改,直接就可以編譯了。 Oracle資料庫的連線字串跟MS SQL的也有點不同: string connStr = @"Data Source=10.6.111.11;User Id=tx;Password=tx;";