發表文章

bash script中字串處理

在撰寫bash script時,字串處理算是最常用到的功能了。而且你會需要用到的字串處理還真不少。以下是一些最近在學習時有使用到的字串處理功能的筆記。 字串串接 常常會需要將處理到的內容串接並保存到一個變數中,在bash script中可以用以下的指令完成: newLine="${orgLine} other line" 可是如果你要處理的字串中含有'\r'這類的特殊字元時,要先將它去除,不然你會debug到死也不知為何你的字串都無法正常串接。因為雖然你有正常串接了,但在echo出來時,一遇到'\r'就會再將游標移到前頭重印,就會讓你以為你都沒有正確地串接字串。 要移除 '\r' 的話,可以用 tr 指令。例如: removeLine=$(echo $newLine | tr '\r' ' ') 要由一個檔案中一行行地處理所要的資料時,可以用如下的方式: while read -r line; do # your process done < <(cat $fileName | grep key1 | grep key2) 不過如果最後再使用 tr 指令想要替換某個字元時,好像就無法正常讀入行的資料。所以最好是在內迴圈自行再處理。 字串基本處理 截取部份字串: sStr=${fullStr:0:10}    # 由0開始取10個字元 移除部份字串 有時會需要將字串中符合樣式的部份給移除,且查詢的方式有分由前至後或由後至前,以及是移除最長或最短的樣式的組合。 前至後 後至前 移除最長 ## %% 移除最短 # % 例如有個完整的檔案路徑,想要分別取出檔名部份及路徑部份的話: fullPath=/opt/game/setting.conf fileName=${fullPath##*/} path=${fullPath%/*} int main(){ return 0; }

移動SVN及重新連接

近期有個專案是要將原本放置在windows主機中的visual svn的svn程式碼銦庫改到另一個Linux中的svn程式碼倉庫中。在查詢了網路上其它人的作法後,大致上緗利地完成了整個程式碼倉庫的移動。 我們移動的作法如下: 備份原本的程式碼倉庫 svnadmin dump <your-repo-name> > <backup-repo-name.dump> 在新的主機上建立新的repo目錄 svnadmin create <new-repo> 匯入程式碼 svnadmin load <new-repo> < <backup-repo-name.dump> 大致上使用上述的三個步驟就可以完svn程式碼倉庫的移動了。這種作法也可以用於備份程式碼倉庫的作業。   移動完成後,因為主機的ip也不同了,而且repo的名稱可能也不同了,接下來就是開發人員本地端原本的svn程式碼目錄要如何重新導向到新的目錄。目前採用的方式如下: 先備份你本地端原本的目錄 在你原本的svn程式碼目錄上重新用svn check out針對新的svn repo重新取出一份 可能要再將一些原本備份下來的原始目錄copy回新的目錄,確保你本地端的working copy都有copy回來,以便到時能再check in   將程式碼重新check in到另一個svn中 由檔案總管copy專案目錄到新目錄中,此時因為檔案總管不會一併copy .svn這類的隱藏目錄,所以copy過去的只是專案的程式碼 在新copy的專案目錄上執行svn check in的步驟將它簽入到新的svn repo即可

使用WinScp的C#程式進行SFTP連接時如何找到FingerPrint

圖片
可以利用WinScp程式 先用WinScp配合要使用的帳號及密碼,登入遠端的SFTP主機後 到WinScp的Commands –> Server/Protocol Information視窗中的Protocol這頁,可以看到下方會列出此帳號連到這台主機時要使用的FingerPrint Key   可以利用Linux上的指令 另一種方式就是 利用一些Linux的指令 ,在使用帳號及密碼登入SFTP主機後,計算出要使用的FingerPrint Key file=$(mktemp) ssh-keyscan host > $file 2> /dev/null              ** 其中的host要用SFTP主機的IP或hostname替代 ssh-keygen -l -f $file cat $file rm $file

簡單就是美

今天在網路上看到一篇跟程式設計師有關的文章,標題是: 不廢話!五組程式碼,道盡 Coder 10 年幽幽練功路 。內容就真的是五組程式碼,看了真是很有感想。 一開始寫程式時就是簡單、笨笨的寫,後來有經驗了,就開始想要展現自己的能力,簡單的東西就寫得開始有點複雜了。又過了一些日子,經驗累積更多了,最後才領悟到簡單又可以達到目的的才是最美的。真所謂是反璞歸真啊。 的確,真正有能力的人不會把事情搞得很複雜來展現自己的能耐,反而是能切中要點,用最簡單的方式處理才是最厲害的。 這又讓我想到了最近看到的Bjarne Stroustrup C++之父在youtube上的一段演講,標題是: Make Simple Tasks Simple !"完整內容我還沒有時間看完,但我想大意應該是差不多的。 另外前不久也才剛看完Clean Code的中譯本: 無瑕的程式碼 。的確,寫程式寫到最後,真的是要用最簡單易懂的方式來處理,這樣未來自己再回頭看時,或是交接給後來的人維護時才不會太吃力。例如有關程式碼中註解的撰寫,如果是程式碼真接就容易看得懂的意思就不用再寫成註解了。因為這樣不但是多餘的,而且未來如果程式碼變更時而忘了去改註解的話,那真的會讓後來的接手維護的人不知這段到底是程式碼是正確的,還是註解是正確的。當然,前提是你的程式碼本身就可以明確地表達自己的意圖才好。

[讀書] Docker入門與實戰

不久前就經常在網路上看到有關 docker 的相關消息,只是一知半解的得知它是一種很類似虛擬機器的工具,但是算是輕量級的。因為它不用再跑在一份OS上,只要用現有的OS即可。但又可以實現「容器」的概念。 近日在逛書店時正好看到有相關的書籍--「 Docker入門與實戰 」,內容正好是適合我這種剛入門的讀者。 書中一開始當然就是先介紹一下docker的概念。它可以不用再另外用像是virtualbox這類的虛擬工具就可以執行一份完整且獨立的linux os環境。而且它的出發點是希望write once run anywhere,只要做好一份影像檔,就可以拿到各種OS中執行成一份獨立的容器,並且可以使用容器中的功能。 接著就是介紹了一些有關docker的操作指令,像是如何由公開倉庫取得可用的影像檔,如何執行指定的影像檔成為一個容器。接著就是容器裏變更的內容如何儲存下來待後續再使用。 容器要安裝及執行所需的服務到此為止看來是沒問題了,接著是因為都是執行在同一個OS層中,使用的網路卡也是一樣的,那有些服務所要使用到的port該如何設定才好呢? 原來在執行容器時可以利用命令列的方式將本機上的某個port對應到所執行的容器中的指定的port上。例如在容器中如果有提供ssh的服務,且ssh平用的是port 22的話,那可以指定將本機例如port 10122映射到port 22上。這樣任何外部的用戶端都可以利用<本機IP>:10122的方式來存取到容器中的ssh服務了。 學了這麼多,最重要的還是要能透過實作的方式來測試實際的用途。所以接著就是來到了實作的章節。第一份實作就是利用docker官方的ubuntu影像檔,安裝並啟用ssh服務來給外部人員使用。可是依書中的步驟就我測試下來都是失敗的。安裝ssh及執行服務看來是沒問題,但就是在要用ssh client端登入時,就一直會詢問密碼。可是不論使用什麼密碼都無法成功登入。 後來查了一下,原來 官方網站中也有相關的實作應用 ,參考了一下才知道,原來是書中少了設定root密碼的部份,難怪都無法登入。 後來在利用Dockerfile自動建立影像檔中,自行加入了修改root使用者帳號的密碼,並且也自行加入了幾個預設會用到的登入帳號及密碼後,目前看來就可以正常的產生一份可以使用ssh服務的容器了。

使用regular expression來match中括號(square bracket)

沒想到在C#中也算玩過一陣子的正規表示式(Regular Expression),來到了Linux C/C++中竟然時常碰壁。 現在只是想要找一個用中括號([])包起來的字串,竟然沒有想的那麼簡單。 假設我要找的目標為 [1234],在以前C#的時候的寫法會是\[(?<num>(\d*)\]。來到了Linux C/C++時,也是用原本的概念組了一串這樣的比對格式: \[([0-9]*\] 沒想到一使用std::regex_match()後就掛了。在編譯(或說指定)這個比對格式給std::regex時就出現Exception了。 這個問題查了一些google上的文章,大家都說遇到正規表示中有的字元的話就是前面加上跳脫字元\就可以啦。沒想到結果會是失敗。 後來看到有人指示要比對中括號的話,需要將它放在中括號中 !! 就是用這樣的方式: [\[]([0-9]*)[\]] 指定要比對於中括號中給定的字元,也就是中括號的左右兩邊的符號。 最後終於是正常編譯過關,且可以正常比對成功了。 而且要注意的是,當將上面這段比對格式放到C/C++的程式碼中,針對\不用再重覆一次,也就是不要寫成 "[\\[]([0-9]*)[\\]]" 這樣比對的結果也是失敗的喔。

2014 8月書單

圖片
今天正好有空閒時間,由台北的娘家步行約兩公里、花了20分鐘經過植物園、總統府,來到了重慶南路上的天瓏書局,看看這陣子有沒有出些什麼有趣或是工作上有用到的書。逛了大約半小時,大致上找到了三本想要買的書。 你也可以和大師這麼接近 - 用C++開發頂級多執行緒網路函數庫Muduo 這本書主要是要介紹使用Open Source的Muduo來開發有關網路相關應用程式時,處理多執行緒相關的書。前面第一章大致上介紹了在多執行緒上開發應用程式會遇到且會花上許多時間除錯的經驗。 看了一下內容,還蠻想買的。而且正好有提到一個我目前遇到但還無法解決的問題。就是你定義一個自已的類別的const函式時,如果裏面有需要用到mutex來同步多執行緒的存取的話,因為會改變到mutex的狀態,所以你的函式變成也無法修飾成const。書中是說可以用mutable這個修飾字來處理。實際的狀況就等買了書再仔細看囉。 不過天瓏的繁體版一本只能打85折。只好回家再到網路上找看看有沒有79折的了。博客來目前是9折,金石堂、灰熊愛讀書都是79折,只是有訂購的話才會進貨。 後來google了一下,作者的部落格中也有Muduo的相關PPT及 教學影片 可供參考。另外也看到 原作者陳碩的部落格 有介紹可以到amazon.cn買電子版的。雖然是簡體版的,但電子版正合我意。因為家裏的空間真的不大,買了很多書後來過年大掃除時,都只能論斤賣了。很可惜。 不過要買amazon.cn的電子書,還真的讓我花了一些時間。原本以為只要上網註冊一個帳號就可以買了,沒想到一註冊完要買時,它說我是非中國的帳戶不能買電子版的。 原本要請在大陸的親友代為用我的帳戶登入去購買的,以為他是看上網的地區。沒想到也是不行。後來只好去有關帳戶設定那邊看一下,原來可以更改所在地。就用親友的大陸地址改了一下。 還真的可以改地區耶,接著就是去試看看能否購買囉。 再回到原來的網址,果然出現kindle電子版的購買選項了。接著就是用網頁上的購買流程付費後,馬上到我的iPad中開啟Kindle for iPad,同步一下就可以看到剛剛買的書了。下載後就可以觀看了。 Specification by Example 中文版:團隊如何交付正確的軟體 博碩出版社最近開始一系列地出一些比較高層次的書籍,提...

DDWRT中的埠轉發(映射)跟UPnP

圖片
自從某次更新了iPad OS版本後,造成我家的Wifi分享器ASUS 520GU變得時常當機要進行重啟。原本想換台新的,後來想想還是省下了,先把它刷機一下,看看有沒有救好了。 查了一下網路上有關Wifi分享器的刷機建議,好像只有兩套軟體是比較有人在使用的。一套就是 Tomato ,另一套就是 DDWRT 。後來就選了DDWRT這套來刷我的ASUS 520GU。在參考不少文章後,終於成功地更新了DDWRT,從此它跟iPAD就相安無事了。 只是DDWRT上的功能看來還蠻多的,一時間也沒空去研究它。只要能用就好了。 不巧,最近又開始弄了一台NAS Synology DS213j。本來只是想說能備份照片就好了。後來又看到它裏面還有不少套件,有時有多餘的時間時就手癢給它裝了幾個來玩玩。 Wordpress是算蠻有名的部落格軟體,以前也有試著申請過一些免費的網路空間來試玩。沒想到DS213j裏也有這個套件,一樣手癢給它點下去安裝完了。 DS213j真的是很適合完全不需任何知識,只要會點滑鼠的人就可以使用的。沒幾下又裝好了Wordpress了。 在自已家裏可以連到這個網站看到Wordpress首頁也算不錯了。只是又看到DS213j有個功能就是能透過一些設定,讓你由外部的網路就可以連回家裏NAS上的網站。這…當然也要試用一下啦。 不過在設定「外部存取」的功能時,是有點需要技巧的。最方便的方式就是先去開啟你的Wifi分享器的UPnP伺服器功能,再透過DS213j的「外部存取」功能中的路由器設定功能來設定,這樣也是只要會點滑鼠就可以設定好了。 設定好外部存取後,也就這樣放著了。反正可以用就好了,管它是如何設好的。 最近不小心又到網路上查了一下到底UPnP是什麼好用的東西,這麼方便就可以設好網路的轉址。沒想到不查還好,一查就查到一些負面的消息。 很多人都建議要將這項功能給關閉才比較安全 。 天啊,那當然要來關閉它囉。只是看了一下UPnP裏的設定值,這不是跟「埠轉發(映射)」很類似嗎? 所以就先手動在「埠轉發(映射)」裏設定一些在UPnP中有設定的Port。只是一開始的協定是設為「兩者」也就是TCP/UDP兩個都設定。接著就到UPnP這頁將UPnP伺服器給關閉。關閉後,再透過其它網路進行測試,看看是否還可以由外部的網路來...

安裝CentOS 7.0.4 Server版

跟 RedHat 體系最相近的要算是Fedora了,但可惜的是 Fedora 並沒有提供單純安裝成Linux Server版本的功能。Ubuntu雖然有提供Server的版本,但跟RedHat又有點差異。目前看來只有 CentOS 跟RedHat最為相近且又支援單純安裝Linux Server版本的功能。 要將CentOS安裝成Linux Server版本的話有兩種方式,一種是使用他的Minimal版本,另一種是使用一般的DVD版本,只是在一開始啟動時,就按下Tab鍵,這時會出現一行指令,在指令後輸入 text後,就可以用文字模式來進行安裝了。 設定網路 變更成固定網址 設定gcc開發環境 執行 sudo yum install gcc gcc-c++ make gdb autoconf automake 就可以建立一個可用來進行c/c++開發程式的環境了

MSSQL 2008/2012 Management Studio安裝後無法設定及使用「已註冊伺服器群組」

最近正好更新電腦,重新安裝了MSSQL Server 2008/2012的Management Studio。安裝後開啟程式就先將原本在舊電腦中的伺服器註冊資訊匯出並匯入到新的電腦中。匯入時發生了錯誤,造成無法正常匯入。 後來重新開啟MSSQL Server Management Studio後就無法正常使用「已註冊伺服器群組」了。有試過移除後再重新安裝,可是只要一開啟程式時,就會出現錯誤。雖然可以忽略這個錯誤訊息,但一進入主程式,就無法使用「已註冊伺服器群組」。 花了點時間查了一下,發現可能是原本匯入失敗的設定資料造成無法使用「已註冊伺服器群組」。 有人建議就先去刪除這些註冊資訊 ,註冊的資訊位於: %APPDATA%\Microsoft\Microsoft SQL Server\100\Tools\Shell\ 只要將RegSvr.xml這個檔案刪除後,再重啟SSMS就可以正常使用了。

ACER 3820TG 舊筆電重灌Window 7 x64

發現目前使用的舊筆電ACER 3820TG上面執行的Windows 7已經越來越慢了。有時給他休眠一下還起不來呢。一定要強制重開機才行。看來又到了重灌作業系統的時機了。 沒想到,有這個想法後,惡夢就開始了。 想說重灌不就是接上光碟機,放入Windows 7 DVD就可以重灌了嗎?誰知ACER 3802TG就不是這樣。 當我接上光碟機,放入安裝光碟,並進入BIOS設定由光碟機先開機後,是有出現開始用光碟機開機的資訊,但Windows 7 DVD安裝光碟讀取到一半,就給我出現藍底白字的畫面了。 試了很多次都沒辦法。 後來想說那就來重建一下MBR好了,可能是哪裏有問題造成無法正常開機。可MBR要重建要如何重建呢? 查了一下,有些救援的工具,例如 Hiren's bootCD ,就是一份可以用來製作開機光碟,裏面已有數種免費的工具的整合包。要下載的話,可到這個 網頁下載 。 有了工具就開始先進行MBR的修複吧。但沒想到偏偏選了其中一個只能修複Windows XP以前的MBR的工具,這一修理下,就更慘了。造成原本的Windows 7作業系統也無法開機了。因為Windows 7 的MBR比較特別。 接著想說再用Hiren's bootCD再來選一次其它工具修複成Windows 7可接受的MBR,沒想到就無法再順利開機了。 最後的辦法就是折掉硬碟,接上外接盒,到另一台筆電中,在那台筆電中執行EaseUS Partion Tool,用這個工具裏的Rebuild MBR方式,才讓ACER 3820TG使用的硬碟可以正常安裝作業系統。 可以順利安裝後,接下就是重灌完Windows 7 OS後,要如何重裝ACER 3820TG的驅動程式了。 我的安裝方式為: 驅動程式 是否重開機 Note VGA_ATI_8.713.3.3000_W7x86x64_AS3820T NO WLAN_Atheros_9.0.0.202_Win7x86x64 NO 無線網卡驅動程式,可以上網用 防毒軟體(Avast) NO 可以上網了,先防毒一下 LAN_Atheros_1.0.0.23_Win7x86x64 NO 網卡驅動程式 Card Reader_Alcor_1.0.12.50_Win...

Scrum != Agile

原文來自於Dr. Dobb's的 Scrum != Agile Agile是一種文化,表示組織可以在短時間內(二週)內就有個新版本給客戶端使用,並得到回饋。回饋的內容會再轉化成下一次的Agile流程。 Scrum是一種程序 XP是所有12種實作(Practices),缺一不可

Ubuntu 13.04 at VirtualBox 4.2.x 超級慢的啦

在Ubuntu 13.04版本出來後,試著在VirtualBox 4.2.x版本用虛擬機器的方式來安裝使用,沒想到安裝完後,執行起來真是超慢的。 想說是不是我的電腦太舊的,換了一台4核,Core-i5 1G獨顯,8G DDR3的NB,試了也是一樣的結果。 查了一下資料,好像是 需要安裝額外的套件,或將某些功能關閉 。可是雖然是可以快一點,但顯示上則是怪怪的,時常黑黑的一片。 看來似乎是Virtual Box的問題,好像目前仍待解決。但Virtual Box也有說明,像Ubuntu 13.04的版本看來是需要「真的GPU」而不能用模擬的。看來只能真的拿一台來安裝了,不能再用Virtual Box這種模擬器了。 不過也有人則是 改回使用原本的介面GNOME ,或這也是種方式。

Can I Run in 64Bit ?

圖片
有同事問到怎麼寫出來的.NET 程式放到64bit的Windows 2008 R2上執行時,怎麼還是執行成32bit模式呢? 會是因為我們都是在32bit開發及編譯造成它只能用32 bit模式執行嗎? 理論上在.NET編譯時都是預設為Any CPU的,也就是會依執行的環境來選擇是執行成32或64 bit模式。 可是不知怎麼地,VS2010在新增一個專案時,它的CPU就預設成用32bit模式。這應該也不是因為我們是在32 bit的環境下開發造成它預設選32 bit(x86)模式。因為就算我在一台64 bit的作業系統環境下建立新的專案,它還是預設選x86模式。 所以我們必須手動切換成Any CPU才行. 切換成Any CPU後編譯的可執行檔放到64 bit的環境中執行時,就會自動切換成64 bit來執行了。

MSSQL字串長度在EntityFramework中比對失敗

在開始使用Entity Framework後,一切的ORM都是用.NET Entity Framework來自動產生的。 查詢資料庫的方式也改用了LINQ的語法。例如要查詢某資料表某欄位是否為某等定字串時,可以用如下的語法: var result = from myRow in myTable where myRow.Name == "MyFirstName" select myRow; 但神奇的是,某一天這段語法失靈了。就算資料庫中有符合條件的資料也無法被篩選出來。 如果將語法改為使用StartWith()的方式,則可以正常地找出所要的資料。 var result = from myRow in myTable where myRow.Name.StartWith("MyFirstName") select myRow; 此時開始懷疑是不是資料庫裏那個欄位的資料後面是有空白字元的。這個資料欄位一開始時是以ncahr()的方式開立的,在輸入一些資料後,因為設計上的調整,所以改為使用nvarchar()的型別。 於是就用SQL指令去查了一下資料欄位的字串長度是不是含有空白字元,使用的SQL語法如下: select Name, LEN(Name) as NameLength from myTable 由顯示的結果來看,資料欄裏字串的長度也沒錯啊,看來是沒有包含空白字元。但使用LINQ的語法就是無法用==的方式來查詢所要的資料。 後來想說去查一下SQL的 LEN() 函式的定義,看看是否有特別的部份。哇,原來函式的定義如下,是不包含尾部的空白字元的耶。那如果要查看原始字串長度要用哪個函式呢? Returns the number of characters of the specified string expression, excluding trailing blanks. 原來要查到真正的原始字串長度的話,要用 DATALENGTH() 才行。 一查之下才知道,原來原本用ncahr()改為nvarchar()後,原先輸入的字串資料還是保留了原本後面的空白字元。 如果要修改資料的話,可以用以下的SQL指令: update myName = RTRIM(my...

命名規則:變數前是否要加上型別資訊

最早最早以前,一開始接觸程式設計時,就是在用Visual C++ 5.0 + MFC寫Windows程式。所以一開始的程式變數的命名規則都是學MFC裏的命名方式,也就是所謂 匈牙利命名法 。 匈牙利命名法倒是也沒什麼問題,我想他的起源應該是因為以前的C編譯器是不支援在編譯時檢查參數型別的,所以特別要在變數的前面加上型別的資訊,以便程式設計人員可以在編寫程式碼的時候就能夠有機會在第一時間查覺出所引用的變數型別上有出入,而不用等到程式真正編譯好執行時才發現錯誤。 而目前的程式語言及編譯器都已經能在編譯程式碼時就幫忙檢查引用的參數型別了,於是這種命名方式隨著時代的演進,應該是可以不用採用這種方式來命名了才對。 就開發程式設段時間以來,目前最常用到的就是兩種命名方式,一種是Pascal Case,另一種是Camel Case。 Pascal Case 變數的命名首字母是大寫,後續單字的第一個字母也都是大寫,例如TestSample。 Camel Case 有分成兩種,一種是Upper Camel Case,基本上就跟Pascal Case一樣。另一種是Lower Camel Case,變數的首字母是小寫,後續單字的第一個字母則都是大寫。例如testSample。 基本上這樣的方式也沒有誰好誰壞,只要有個規則,大家一致就好。 不過個人認為,如果是無型別檢查的環境下,變數的名稱(或一些需要命名的名稱)我習慣會加上型別的資訊。 例如在使用資料庫時,要為資料表及檢視表命名時,習慣上會加上tbl及vw的字首。用來識別這是資料表還是檢視表。 因為有些語法在檢視表上應該是不適用的,例如INSERT、UPDATE、DELETE這類的語法。檢視表只適合用來下SELECT的查詢語法。為了在使用時就能識別出是資料表或檢視表,個人覺得還是加上識別字比較好。 在C#或C++中我們可以宣告一個列舉,例如: public enum ServerStatusEnum { READY, IDLE } 在使用這種列舉型別來定義變數時,就可以: public ServerStatusEnum ServerStatus = ServerStatusEnum.IDLE; 因為我們想要的就是定義一個Server的Status,所以變數名稱當...

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]->...