2016年10月17日 星期一

vim buffer tips

vim的設定已經好一陣子沒有動了,不過有一個小問題一直著困擾我。

那就是在vim中用:ACK找出關鍵字之後開啟的quickfix視窗也算是一個buffer,這樣在使用熱鍵持續切換buffer的時候會變成quickfix的內容顯示在主要視窗裡,然後就會害我關錯視窗,非常惱人。

最近本來想說要開buftabline的原始碼自己試著改改看,不過動手之前還是先google看看有沒有人遇到一樣的問題,然後就找到了這篇

裡面提到使用:if &buftype ==# 'quickfix'可以判斷出是否為quickfix buffer然後就直接再切一個buffer。

再配上我自己用的熱鍵F9/F10 (上一個buffer/下一個buffer)就設成這樣。
map <F10> :bnext<CR>:if &buftype ==# 'quickfix'<Bar>:bnext<Bar>endif<CR>
map <F9>  :bprev<CR>:if &buftype ==# 'quickfix'<Bar>:bprev<Bar>endif<CR>

雖然切buffer還是會有點看得出來是先顯示quickfix再切下一個buffer,不過我覺得還算堪用。

2016年7月4日 星期一

What is the Redfish in BMC?

最近工作需要所以研究了一下。

簡單的說就是網管們已經不想要再用ipmitool下指令給BMC去看伺服器的狀態,每次都要輸入一堆參數,打完感覺很飽這樣,為了不想要這麼飽甚至還寫了一堆腳本去下指令。

現在已經是21世紀,什麼東西都要很先進才行(傻子才一直用終端機下指令),所以業界就訂了這個規格出來說:那就在BMC裡面放個RESTful架構的伺服器,然後提供透過HTTP提供web API,傳遞資料的格式就用JSON,讓你們想要什麼,就可以做什麼~於是乎Redfish就訂出來了,網管們表示非常開心

這樣某些公司就可以跟伺服器廠商買有支援Redfish功能的伺服器,再找Front-end工程師來客製化符合公司需求的網頁,然後再找iOS app工程師跟Android app工程師來客製化符合網管們需求的應用程式,提高就業率

RESTful有不少中文網站在介紹,而Redfish就很少資料,希望我這篇文章有幫助到大家。

參考資料:
https://www.dmtf.org/standards/redfish
https://tw.twincl.com/@arthurtw/*641y
http://www8.hp.com/us/en/products/servers/proliant/restful-interface-tool.html

2016年6月24日 星期五

[SVN] Commit solution, but author is not me!

今天下午用另一台不常用的工作站加了兩次程式碼進到SVN伺服器,不過看Log卻發現兩次的Author是另一位同事,上Google搜尋了一下卻沒找到答案。
自己在這邊卻看到三個亂數名稱的檔案
 $ls ~/.subversion/auth/svn.simple  
因為通常登錄伺服器都是用同一組帳號密碼,三個這種數字怎麼想都是有點問題。
所以把他們通通刪了
 $rm ~/.subversion/auth/svn.simple/*

再隨意加個檔案測試一下,果然Author就正常了。 OS: Ubuntu 12.04 Tool: svn 1.6.17 (r1128011)

2016年5月12日 星期四

Vim 256 color

之前在這邊,看到有人有好心人貼了能印出256色的Python程式碼。
我改了一下讓它可以一次印多行而不要一口氣印完。

話不多說先上圖。










程式碼在這邊,可以修改第三行row的值來更改一次印出的行數。
有了它拿來改vim的配色就很好用。
 #!/usr/bin/env python  
 row = 16  
 colornums = 256  
 for i in range(1, colornums / row):  
     for j in range(row):  
        color = i + ((colornums / row) * j)  
        fgstr = "\033[38;5;%03dm%03d"%(color, color)  
        bgstr = "\033[48;5;%03dm%03d"%(color, color)  
        if j == (row - 1):  
            print fgstr, bgstr, '\033[0m'  
        else:  
            print fgstr, bgstr, '\033[0m',  

這邊就不討論怎麼上色,玩過BBS的人應該都會

 print "%03d"%(color)  
這樣印出數字color並且會把不滿3位數的部分補滿0。

 print "abc",
後面加的逗號","可以讓輸出不自動換行。

2016年4月20日 星期三

LeetCode Algorithms Problems by Python

這兩天剛開始玩,重點是[Run]的時候只會給一組測試資料,[Submit Solution]會跑不只一組測試資料,所以沒考慮到所有的Case就會遇到[Run]沒問題,但[Submit Solution]卻一直過不了的情況。

這邊大概只會列一下重點,就是沒搞清楚會卡住的點。

1. Two Sum

用一個list來存找到兩個數的index。

2. Add Two Numbers

輸入會是兩個linked list,每個node的值會是非負的整數,把值相加之後取個位數,進位則加到下一個node的值裡。
 Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)  
 Output: 7 -> 0 -> 8  
所以第三個node的運算結果才會是8。

題目沒講的還有一點,就是如果輸入改為
 Input: (2 -> 4 -> 3) + (5 -> 6 -> 7)  
那輸出會是
 Output: 7 -> 0 -> 1 -> 1  
4+6進位1再加進3+7為11,要再取餘數,然後把進位存到下一個node裡。

小提示:要先建一個head = ListNode(0),再進迴圈去把l1.val跟l2.val做運算存起來,所以回傳的時候是回傳head.next。

3. Longest Substring Without Repeating Characters

用for迴圈去產生字串然後做運算的話會很難寫,這個題目我是利用python的字典型態(dict type)去記錄已經遇過的英文字母。
最困難的部分應該是遇到重複的字母時該如何去重新計算目前字串的長度,我在這個部分卡了很久。

5. Longest Palindromic Substring

首先要知道什麼是迴文(Palindromic),簡單說就是從中間切開,頭尾對應位置的字相同的句子。
 aabaa  
 aabb  
 gabcbag  
像是上面三個例子,分為有中間字與無中間字的兩種類型。

這題真的是花了我很多時間也想了很久,我沒有使用動態規劃(dynamic programming),而是從頭以每個字母為中心向外延伸找出最大迴文。全部跑完會有超過時間的問題,所以我有加了一些判斷去縮減執行次數。因為寫不出來一次就能同時判斷有中間字跟無中間字所以我還爬了兩次字串,希望之後能想出只跑整個字串一次的寫法。

226. Invert Binary Tree

會開始寫LeetCode主要是看到這篇文章"雖然我們公司 90%的工程師都用你開發的工具,但我們還是不聘用你",這件事告訴我們演算法是很重要的,就算你開發了很棒的軟體,演算法很差還是進不了Google!所以才出現了這個反轉二元數的題目。

用迴圈來做的話可以用root.pop(0)來一個一個取出node,把找到的左右node用root.append(node)加到queue裡面。
用遞迴來做就是一直往下層找,找到盡頭之後再回上一層去另一邊鑽然後把左右值交換。
兩種都會用得到下面這個運算,可以直接換值。
 root.right, root.left = root.left, root.right  

2016年4月18日 星期一

Python的資料夾比較

最近在寫讓自己合code愈來愈省時間的小工具,畢竟我不是一個非常細心的人,常常會漏東漏西,每漏一次就會覺得自己更是應該早點把這個東西弄出來。(握拳)

要合併程式碼就一定會有廠商來的A跟自己改過的A+還有廠商來的新版B三個資料夾。
這時候就會覺得python的dircmp很好用,在這邊可以看到最下方有這幾行範例讓程式去子資料夾然後顯示出檔案跟路徑。

>>> from filecmp import dircmp
>>> def print_diff_files(dcmp):
...     for name in dcmp.diff_files:
...         print "diff_file %s found in %s and %s" % (name, dcmp.left,
...               dcmp.right)
...     for sub_dcmp in dcmp.subdirs.values():
...         print_diff_files(sub_dcmp)
...
>>> dcmp = dircmp('dir1', 'dir2') 
>>> print_diff_files(dcmp) 

像我這種腦袋不好的人最討厭看到遞迴了,到底是要怎麼把找到的檔案跟路徑傳出來讓我找資料找了好一陣子。因為傳值就會扯上call by value,call by reference有的沒的問題。
用谷歌搜尋call by reference python可以看到這位大大的部落格是第二個搜尋結果!
所以我就研究了一下,這篇提到了Immutable Object and Mutable Object (不變物件與可變物件),但說實在裡面的範例我看得不是很懂,所以自己寫了程式碼看看結果。

 def LOL(mutable, immutable):  
   print  
   print "LOL start"  
   print "mutable id in LOL is %s"%(id(mutable))  
   print "immutable id in LOL is %s"%(id(immutable))  
   
   mutable.append('xyz')  
   print "mutable modifed in LOL is ",  
   print mutable  
   print "mutable id in LOL is %s"%(id(mutable))  
   
   immutable += 1  
   print "immutable plus 1 in LOL is %s"%(immutable)  
   print "immutable id in LOL is %s"%(id(immutable))  
   
   mutable = ['MMM']  
   print "mutable assigned in LOL is ",  
   print mutable  
   print "mutable id in LOL is %s"%(id(mutable))  
   
   imumutable = 5  
   print "immutable assigned by 5 in LOL is %s"%(immutable)  
   print "immutable id in LOL is %s"%(id(immutable))  
   print "LOL end"  
   print  
   
 mutable = ['abc']  
 immutable = 0  
 print "mutable id is %s"%(id(mutable))  
 print "immutable id is %s"%(id(immutable))  
   
 LOL(mutable, immutable)  
   
 print "mutable id is %s"%(id(mutable))  
 print "immutable id is %s"%(id(immutable))  
 print "mutable is ",  
 print mutable  
 print "immutable is %s"%(immutable)


基本上就是numbers, booleans, strings, tuples, frozensets這五種型態的變數都是不變物件,其餘的資料型態都是可變物件,而自己建立的類別(class)為可變物件。(參考這邊

跑出來的結果在這邊:
 mutable id is 139901048634112  
 immutable id is 21690320  
   
 LOL start  
 mutable id in LOL is 139901048634112  
 immutable id in LOL is 21690320  
 mutable modifed in LOL is ['abc', 'xyz']
 mutable id in LOL is 139901048634112    ->可變物件傳進函式之後可做運算,但物件不變
 immutable plus 1 in LOL is 1  
 immutable id in LOL is 21690296         ->不可變物件傳進函式之後可做運算,並且物件改變
 mutable assigned in LOL is ['MMM']
 mutable id in LOL is 139901048690160    ->可變物件傳進函式之後被賦值後為新物件
 immutable assigned by 5 in LOL is 1  
 immutable id in LOL is 21690296         ->不可變物件傳進函式之後不可被賦值
 LOL end  
   
 mutable id is 139901048634112  
 immutable id is 21690320  
 mutable is ['abc', 'xyz']               ->可變物件在函式中的運算會直接影響該物件
 immutable is 0                          ->不可變物件在函式中的運算不會影響該物件


從上面的執行結果(可變物件傳進函式之後可做運算,但物件不變)拿來運用在一開始的資料夾遞迴比較上,我們可以丟一個串列(list)進去存找到的檔案以及左右路徑,即可拿到我們要的結果。
 from filecmp import dircmp  
   
 def print_diff_files(dcmp, result):  
   for name in dcmp.diff_files:  
     print "diff_file %s found in %s and %s" % (name, dcmp.left, dcmp.right)  
     temp = [name, dcmp.left, dcmp.right]  
     result.append(temp)  
   for sub_dcmp in dcmp.subdirs.values():  
     print_diff_files(sub_dcmp)  
   
 result = []  
 dcmp = dircmp('dir1', 'dir2')   
 print_diff_files(dcmp, result)   

是不是很簡單呢?(才怪)

2016年4月13日 星期三

Python Class錯誤的init

今天試寫了Python的類別功能,但跑出來的結果有些問題。
 class Test:  
    def __init__(self, path):  
      Test.data = os.path.join(path, 'data')  
   
 def Function:  
    A = Test('/home/gg/a/')  
    B = Test('/home/gg/b/')  
    C = Test('/home/gg/c/')  
    print A.data  
    print B.data  
    print C.data  

這樣寫的話執行Function結果如下
 /home/gg/c/data  
 /home/gg/c/data  
 /home/gg/c/data  

想了一下子才發現應該要這樣寫才對
 class Test:  
    def __init__(self, path):  
      self.data = os.path.join(path, 'data')  

這樣才會正確的印出
 /home/gg/a/data  
 /home/gg/b/data  
 /home/gg/c/data  

超不專業的我Orz

2016年3月29日 星期二

vim plugin 試用心得與vimrc設定無用小心得

開一篇文章來講試用過的vim外掛好了,再附上無用小知識。

vim-scrollbar
這個插件是讓vim開啟文件時,內容超過一頁會顯示垂直的拉條。
問題點

  1. 拉條只能顯示在左側,不能改到右側。
  2. 顏色無法自訂,內定的顏色我個人不喜歡。
  3. 拉條的字元不能顯示為空格,自訂為空格的話會有錯誤。
  4. 裝了之後按住上下會有很明顯的遲鈍,這點有回報在git上,但作者沒找到解決辦法。
這個插件可以幫你一次打開taglist,nerdtree跟srcexpl這三個插件的視窗,但用過之後我覺得三個插件一次打開會讓程式碼的畫面變很小,因為我是想讓vim變得跟source insight接近一些,所以比較喜歡需要什麼就開什麼。

無用小知識

1.在~/.vimrc中如果在重設熱鍵之後加上註解的話,按設定好的熱鍵會有警告音跑出來。
 map <PageUp> <C-u> " remap page up to ctrl-u  
所以比較好的寫法還是把註解移到前面,這樣就不會按個熱鍵噹噹噹一直響了。
 " remap page up to ctrl-u  
 map <PageUp> <C-u>  

2016年3月24日 星期四

vim套件:Tabbar與BufTabLine的差別

這篇就來講一下vim有關分頁管理的兩個插件tabbarbuftabline

首先,這是tabbar的圖。

我會想把tabbar換掉有幾點原因。

1. 因為最上方的分頁是用[]去做分隔,而[]又剛好是vim語法裡面的MatchParen,所以分頁切一切就會跑出藍底的MatchParen顏色,前後景顏色當然是可以從.vimrc裡面去設定,但不管我怎麼改顏色就是會跟整行分頁的配色不搭。
為了這個還想去把自己改tabbar.vim的程式碼,但把[]改成/\(這樣看起就跟Chrome瀏覽器的分頁有六成像)就會有目前分頁(CurrentBuffer)沒有上色的問題,因為tabbar.vim裡面的顏色是用[分頁編號:檔名]*去判斷為目前分頁來上色,但我看了半天vim的syntax語法還是看不懂怎麼自己改成/分頁編號:檔名\*去判斷為目前分頁。

2. 如圖所示目前的分頁都已經有顏色了為什麼還要加*表示目前是哪一個分頁,這點無法理解。

3. 裝了ack-vim.vim之後在quickfix window內按q後游標會跳到-TabBar-上面那行的行首,這點更是讓我無法忍受,怎麼會focus到那邊去?雖然這應該是ack-vim的問題,但表示這兩個套件的相容性就不是很好。

接著來看buftabline的圖。

沒有了討人厭的[]跟分頁編號,還能自己改配色,直接把第一行整個用掉,就算開很多分頁也不會顯得空間不夠(好傻好天真),在加上改成目前這樣的配色(跟Chrome有九成像)本人是感到相當滿意。
另外分頁其實就是vim內件的buffer功能,想多了解的話可以:h buffer來看一下文件。

更新
buffertabline有個嚴重的缺點就是沒有關閉分頁(close buffer)的功能,我下:bdelete:bd都會直接把整個vim關掉(崩潰~),這就是所謂的有一好沒兩好,看了半天:h buffer還是無解,幸好剛剛用google找到這個網頁,該作者寫了一個plugin可以關閉分頁而不會動到任何原本的視窗,可以把該網頁中間Alternative Script那一段複製下來存成bclose.vim然後丟進~/.vim/plugin裡面,再到~/.vimrc設個熱鍵就能用了。

2016年3月15日 星期二

我的vim離source insight好像有點遠


上一個工作用source insight用得很習慣,找關鍵字可以說是飛速,換新工作之後都是用putty連進虛擬機器上所以只能用vim,對於一直輸入find | grep感到相當的痛苦。

打錯字就不講了(弱者才會打錯字),一直會去找.svn資料夾也是很煩人的事情,就算加入把.svn資料夾的語法也是覺得很煩,於是開始想把vim弄得好用一點!(好像有哪邊怪怪的)

所以這兩個禮拜開始在裝vim的套件(OS:都三十幾歲了還要學著用vim說實在有點辛苦),以下插件的連結就不附了,因為滑鼠框一下右鍵搜尋google很快就有,而且超連結有可能會掛點,直接搜尋比較可靠。

目前我裝了
Vundle 自動安裝插件的插件。(第一個該裝的東西)

Taglist由Tagbar取代。
Tagbar 讓你在vim裡面可以看到程式碼的變數跟函式,功能類似Taglist,但感覺更好用一些,Taglist會把多個視窗的變數含式都列出來,非常奇怪的設計,而Tagbar會依照程式檔案的切換去顯示該檔案內的變數及函式。

NERDTree 讓你在vim裡面可以看到目錄樹跟檔案列表的插件。

vim-nerdtree-tabs 讓你的NERDTree不會因為開新分頁就消失的插件,這個很重要! 而且按ENTER開啟分頁不會把原本的開的文件蓋掉,NERDTree預設的熱鍵ENTER會把原本的蓋掉,T開新分頁但不切過去,t開新分頁順便切過去,這三個都非常的不直觀,我用得很痛苦,裝了這個之後新檔案會直接開在新分頁上並且focus過去,直觀就是好用!

Tabbar 管理分頁的插件,關閉分頁的設定是
:Tbbd
在~/.vimrc裡面設個熱鍵會很好用,本想設讓vim跟source insight還有Chrome瀏覽器一樣按CTRL+W都是關分頁的功能,但vim的CTRL+W都跟視窗的動作有關,所以只好放棄改用<Leader>w。
更新:這個插件裝了之後會跟其它套鍵的tab功能起衝突,移除又會把vim的page up/down還有上下左右鍵都搞掛,實在是有點困擾,除此之外關閉分頁之後會focus在前一個number的視窗(e.g. 1,2,3,4,把2關掉會focus在1),跟Chrome瀏覽器還有notepad++的行為都不一樣(e.g. 1,2,3,4,把2關掉會focus在原本的3),之後再看設定怎麼改。由buftabline取代。
buftabline 管理分頁的插件,我把用得很痛苦的tabbar換掉了!請看我的這篇文章來介紹這兩個插件有什麼分別。

ack-vim 讓ack-grep可以在vim中使用的插件
ack-grep是ACK這個搜尋工具的套件名稱,在Ubuntu中有另一個ack所以才改叫ack-grep。
因為我的虛擬機器作業系統是Ubuntu 12.04,所以用

sudo apt-get install ack-grep
裝的會是1.92版,然後用Vundle下載的ack.vim會有版本相容性的問題,所以在vim中輸入
:Ack keyword
會出現錯誤訊息unknown option: s然後什麼都找不到。
把這個錯誤訊息去google可以找到github上有人key過bug,要去~/.vimrc增加設定
let g:ack_default_options = " -H --nocolor --nogroup --column"
這個也很重要!花了我一堆時間去想說到底是哪裡沒裝好,沒想到是bug,弄好之後在vim中打

:Ack keyword
應該就可以找到想找的東西。
更新:在vim中用
:Ack
搜尋關鍵字再按q關閉搜尋視窗之後都會focus在Tabbar上面的那一串檔名裡,這點讓我感到困擾,正在找哪邊可以改,在NERDTree中按q就會乖乖回到程式碼中,或許是個方向。
幫插件除錯不如換插件,所以我換了vim-buftabline。

SrcExpl source explorer需要先安裝ctags才能使用,它被執行之後會在vim下面開啟一個視窗來顯示目前游標所在位置變數是在哪個檔案被定義以及上下幾行的內容,不過目前用起來有一些很明顯的定義值卻會無法顯示,我認為應該是有bug,但好像沒有其他的替代插件可以換。

CtrlP 當你在normal mode按下Ctrl+P後,這個插件會去找出目前路徑下的所有檔案,你輸入模糊檔名會列出相關的檔案,相當方便。開什麼NerdTree慢慢找檔案已經落伍了!(誤)

2016年3月9日 星期三

安裝Ubuntu 12.04.5 LTS心得

基本上這篇應該沒什麼參考價值,就只是留個筆記給自己看,不太懂為什麼都21世紀了裝個OS還會這麼辛苦,要打指令還要上網找怎麼修復磁區。

1. 放入光碟選擇從光碟開機

2. 選Try Ubuntu

3. 在左上角搜尋項目輸入GP會跑出GParted Partition Editor

4. 用GParted切出兩個pattition
e.g. /dev/sda1      /dev/sda2

5. sda1切大給作業系統用,sda2切小準備設成swap partition

6. crtl+alt+t開出終端機輸入sudo fdisk /dev/sda

7. 下t準備修改partition ID

8. Partition number輸入2表示選第二個partition,即/dev/sda2

9. Hex code輸入82,即Linux swap

10. 輸入p看更改後的結果

11. 輸入w寫入設定再一個q離開fdisk

12. mkswap /dev/sd2

完成以上動作之後即可成功安裝,然後開機過POST就停在左上角游標閃爍沒反應。(崩潰)

更新:

然後參考這一篇

基本上就是用光碟開機然後Try Ubuntu
ctrl+t打開terminal後輸入fdisk -l看哪個sda的boot欄位是有打星號的(假設為sdaX)
sudo mount /dev/sdaX /boot
sudo grub-install --root-directory=/mnt/ /dev/sda
修復開機磁區就好了。(痛哭流涕)