2014年7月6日 星期日

vim - statusline


status line會在vim底下有一個視窗,用以顯示狀態,透過laststatus=0關閉status line,或laststatus=2永遠開啟status line。透過statusline設定要顯示那些東西,以及如何顯示,基本上就是"%"加上修飾字(vim的document稱為item),如%F會顯示含路徑檔案名稱,%f顯示不含路徑檔案名稱,其他一般文字會被直接顯示,如set statusline=%l/%L,就會顯示"目前所在行數/全部行數",如8/50之類的字眼。而空白要用"\"escape。

有幾個特別的修飾字(item),如"*"是設定highlight group,根據group number設定前景與背景顏色,如
set statusline=%2*%F
hi User2 ctermfg=3  ctermbg=0
會將%F(顯示含路徑檔案名稱)顯示前景為黃色的字體。


修飾字(item)"<"則會截去過長的字串。修飾字(item)"="會把status分成左右兩部分,即靠左靠右對齊。其餘的翻翻document吧。


以下是我常用的vim設定,

set statusline=
set statusline+=%1*\[%n]                                  "buffernr
set statusline+=%2*\ %<%F\                                "File+path
set statusline+=%3*\ %=\ %{''.(&fenc!=''?&fenc:&enc).''}\ "Encoding
set statusline+=%4*\ %{(&bomb?\",BOM\":\"\")}\            "Encoding2
set statusline+=%5*\ %{&ff}\                              "FileFormat (dos/unix..)
set statusline+=%6*\ row:%l/%L\ col:%03c\ (%03p%%)\             "Rownumber/total (%)
set statusline+=%0*\ \ %m%r%w\ %P\ \                      "Modified? Readonly? Top/bot.
hi User2 ctermfg=3  ctermbg=0
hi User6 ctermfg=3  ctermbg=4
set laststatus=2




參考資料
  1. vim document - statusline, http://vimdoc.sourceforge.net/htmldoc/options.html#'statusline'
  2. vim document - status-line, http://vimdoc.sourceforge.net/htmldoc/windows.html#status-line
  3. Learn Vimscript the Hard Way, Status Lines





2014年6月15日 星期日

git - push to non-bare repository


如果push到non-bare的repository,則會被reject,必須將該repository的receive.denyCurrentBranch設為ignore

brook@vista:~/x2$ git push origin HEAD
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 227 bytes, done.
Total 2 (delta 0), reused 0 (delta 0)
remote: error: refusing to update checked out branch: refs/heads/master
remote: error: By default, updating the current branch in a non-bare repository
remote: error: is denied, because it will make the index and work tree inconsistent
remote: error: with what you pushed, and will require 'git reset --hard' to match
remote: error: the work tree to HEAD.
remote: error:
remote: error: You can set 'receive.denyCurrentBranch' configuration variable t
remote: error: 'ignore' or 'warn' in the remote repository to allow pushing int
remote: error: its current branch; however, this is not recommended unless you
remote: error: arranged to update its work tree to match what you pushed in some
remote: error: other way.
remote: error:
remote: error: To squelch this message and still keep the default behaviour, see
remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
To /home/brook/x
 ! [remote rejected] HEAD -> master (branch is currently checked out)
error: failed to push some refs to '/home/brook/x'

編輯該repoistory底下的.git/config
[receive]
    denyCurrentBranch = ignore


相關文章:
git筆記





2013年9月28日 星期六

RFC 5969 - IPv6 Rapid Deployment on IPv4 Infrastructures (6rd) -- Protocol Specification之筆記


Abstract

描述6rd prefix + IPv4 address的方式定址的優點,如automatic IPv6 prefix delegation to site, statless operation, simple provisioning and service等等。


Introduction

6rd機制成功的被商業化,被詳細記錄在RFC 5569。6rd是基於6to4改善而來,主要差異是在IPv6 Prefix的部分,6to4是用2002::/16,6rd是SP(service provider)自訂的prefix。6to4也可以被視為是6rd的subset,因為如果6rd的prefix是2002::/16就是6to4了。


Terminology

6rd prefix 被SP用來給6rd domain的IPv6 prefix。SP可以布署一個以上的6rd domain。
6rd CE (Customer Edge) 在6rd的布置中擔任CPE(Customer Premises Equipment)的角色或稱RG (Residential Gateway)。典型的CE有一個WAN site interface和一個以上的LAN interface,LAN端也稱為Customer-facing。提供IP6能力,WAN端也稱SP-facing。
6rd delegated prefix 由CE計算給Customer site端使用的IPv6 Prefix。
6rd domain 使用相同的virtual 6rd link的CEs和BRs的集合。SP可以有一個以上的6rd doamin。每個6rd domain必須使用不同的6rd prefix。
6rd Border Relay 被佈署在6rd domain的edge位置。IPv4-enabled interface用於6rd的IPv6 in IPv4 tunnel端。IPv6 interface用於連接IPv6網路。
BR IPv4 address 6rd Border Relay的IPv4 address。
6rd virtual interface encapsulation and decapsulation of IPv6 packets inside IPv4。


6rd Prefix Delegation

6rd delegated prefix是利用6rd prefix和CE的IPv4計算出來,用於customer site。如圖一:
當IPv4 address在6rd domain可以被aggregate,如10.0.0.0/8,則不使用全部的IPv4來計算,因為前面8bit可以被aggregate,所以使用後面24bit(即o bit為24)。
6rd不限於使用public IP,但如果private address會overlap,就應該被切成不同的6rd domain(使用不同的6rd prefix, 可以確保唯一性)。
即使相同的SP,也可能使用不同的IPv4 bit數,比如10.0.0.0/8和192.168.0.1/16之間的差異就可能會使用不同的IPv4MaskLen。
6rd delegated prefix是使用IPv4計算,所以IPv4 address的變動,也會影響6rd delegated prefix,因此建議以IPv4 address的lease time當成prefix的lifetime。


6rd Configuration

6rd有四個重要的configured value:
IPv4MaskLen ignore最高的幾個bit,比如IPv4 address range是10.0.0./8,那麼IPv4MaskLen就是8,使用後面24bit來計算6rd delegated prefix。
6rdPrefix 6rd IPv6 prefix
6rdPrefixLen 6rd IPv6 prefix length.
6rdBRIPv4Address 6rd Border Relay的IPv4 address.


Customer Edge Configuration
這四個configured value可透過TR-69,PPP或手動方式設定,這份RFC使用DHCP方式取得參數。

6rd DHCPv4 Option

6rdBRIPv4Address允許一個以上,不過OPTION_6RD只能限制最多只有一個6rd domain,不支援多個6rd domain。當6rd被啟動, CE會設定default route到BR,比如CE IP: 10.100.100.1/8, BR IP: 10.0.0.1, 6rdPrefix: 201:db8/32,那麼CE的routing table會是這樣:
     ::/0 -> 6rd-virtual-int0 via 2001:db8:0:100:: (default route)
     2001:db8::/32 -> 6rd-virtual-int0 (direct connect to 6rd)
     2001:db8:6464:100::/56 -> Null0 (delegated prefix null route)
     2001:db8:6464:100::/64 -> Ethernet0 (LAN interface)

Border Relay Configuration
BR的位址可以利用anycast address達到loading baalancing和reliability.


IPv6 in IPv4 Encapsulation

IPv6的Traffic class field必須被複製到IPv4的Tos欄位(可以參考RFC 4213/3056/2983/3168等)。

Maximum Transmission Unit
6rd的MTU應該被設成CE WAN side的MTU - 20 bytes(IPv4 header),如果IPv4 MTU是1500,那麼6rd Tunnel MTU應該被設成1500-20=1480。如果缺乏資訊,6rd MTU應該被設成1280。

Receiving Rules
為了防止spoofing攻擊,6rd的BR和CE應該根據6rd domain的參數,驗證6rd Tunnel的IPv4 address和IPv6 address的IPv4部分是否相符,不符合就drop。


IPv6 Address Space Usage

基本上就是6rd prefix length和IPv4MaskLen的取捨,如果要給user的6rd delegated prefix是 /60,而IPv4MaskLen是24(根據IPv4 aggregate的程度),那麼6rdPrefixLen就要給60-24=36。



    參考資料:
  1. RFC 5969 - IPv6 Rapid Deployment on IPv4 Infrastructures (6rd) -- Protocol Specification




熱門文章