發表文章

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 中文版:團隊如何交付正確的軟體 博碩出版社最近開始一系列地出一些比較高層次的書籍,提