Sharing

2011年11月20日 星期日

Python 2.7 Standard Library 筆記 -- Regular Expression

教學連結
http://docs.python.org/howto/regex.html#regex-howto

re Module
http://docs.python.org/library/re.html


  • \d 就是 [0-9] \D 則是 [^0-9]
  • \s 就是 [ \t\n\r\f\v] \S 則是 [^ \t\n\r\f\v]
  • \w 就是 [a-zA-Z0-9_] \S 則是 [^a-zA-Z0-9_]
  • [] 是一堆字元的集合, 只要出現裡面任一字元, 就算符合
  • * 是重覆  0 ~ 無限多次
  • + 是重覆 1 ~ 無限多次
  • ? 是重覆 0 或 1 次

  • re.compile 會回傳一個 pattern object,利用這個 pattern object 可以持續的分解一段文字,還滿好用的
  • class SRE_Pattern(__builtin__.object)
     |  Compiled regular expression objects
     |
     |  Methods defined here:
     |
     |  findall(...)
     |      findall(string[, pos[, endpos]]) --> list.
     |      Return a list of all non-overlapping matches of pattern in string.
     |
     |  finditer(...)
     |      finditer(string[, pos[, endpos]]) --> iterator.
     |      Return an iterator over all non-overlapping matches for the
     |      RE pattern in string. For each match, the iterator returns a
     |      match object.
     |
     |  match(...)
     |      match(string[, pos[, endpos]]) --> match object or None.
     |      Matches zero or more characters at the beginning of the string
     |
     |  scanner(...)
     |
     |  search(...)
     |      search(string[, pos[, endpos]]) --> match object or None.
     |      Scan through string looking for a match, and return a corresponding
     |      MatchObject instance. Return None if no position in the string matches.
     |
     |  split(...)
     |      split(string[, maxsplit = 0])  --> list.
     |      Split string by the occurrences of pattern.
     |
     |  sub(...)
     |      sub(repl, string[, count = 0]) --> newstring
     |      Return the string obtained by replacing the leftmost non-overlapping
     |      occurrences of pattern in string by the replacement repl.
     |
     |  subn(...)
     |      subn(repl, string[, count = 0]) --> (newstring, number of subs)
     |      Return the tuple (new_string, number_of_subs_made) found by replacing
     |      the leftmost non-overlapping occurrences of pattern with the
     |      replacement repl.
     |
    
    
  • 要注意 raw string 及非 raw string 的差別,一般會直接使用 raw string,比較直覺
  • # 第一個方案用一般  string 來找尋 '\n' 必須要輸入 "\\n"
    >>> p  = re.compile('\\n', re.IGNORECASE)   
    >>> p.findall("\np")
    ['\n']
    >>> p.findall("\\np")
    []
    # 第二個方案用 raw string, 就直接輸入 "\n" 就可以了,效果是一樣的
    >>> p  = re.compile(r'\n', re.IGNORECASE)
    >>> p.findall("\np")
    ['\n']
    >>> p.findall("\\np")
    []
    >>> print p.findall("\np")[0]
    
  • Compilation Flags
    • IGNORECASE, 這個應該很方便, 可以省去很多必須注意的小地方
    • MULTILINE, 可以自動把每一行分開解析
  • A | B 可以找尋 A 或 B, A 和 B 分別是一個 RE
  • ^A 可以指定字串起始點必須要符合 A, A 是一個 RE
    • 不過在集合 [] 內, ^ 是當反相的意思
  • A$ 可以指定字串尾巴必須要符合 A, A 是一個 RE
  • \bS\b 用來指明要找尋的字串S前面或是後面必須要有分隔的字元
  • \BS\B 剛好是\b 的相反, 字串 S 的前面或是後面不可以是分隔的字元
  • () 用在區隔 group, 可以讓你一次在一個字串內找尋兩個 pattern, 甚至這兩個 pattern 是有交互作用的
  • >>> p = re.compile('(a(b)c)d')
    >>> m = p.match('abcd')
    >>> m.group(0)
    'abcd'
    >>> m.group(1)
    'abc'
    >>> m.group(2)
    'b'
    
    • (?P...) ,指定 group 的名字, (?P=name) 是舊的寫法
    • (?:...), 不指定 group 的名字, 只 mapping 但不抓回來, 這邊的寫法有點難以理解
    • >>> m = re.match("([abc])+", "abc")
      >>> m.groups()
      ('c',)
      >>> m = re.match("(?:[abc])+", "abc")
      >>> m.groups()
      ()
      
    • (...)\1 可以用來指明第幾個 group, \1 表示要搜尋第一個 group
  • Splitting Strings
    • 也可以利用 RE 來 split string, 符合的字串將會被消去, 然後分段整個字串
    • 如果不想把符合的字串消去, 就必須加上 group
    • >>> p = re.compile(r'\W+')
      >>> p2 = re.compile(r'(\W+)')
      >>> p.split('This... is a test.')
      ['This', 'is', 'a', 'test', '']
      >>> p2.split('This... is a test.')
      ['This', '... ', 'is', ' ', 'a', ' ', 'test', '.', '']
      
  • Search and Replace
    • 符合的 pattern 可以用在 Replace Rule 當中, 這三種表示法都是同樣的意思 \1 = \g<1> = \g
  • *?、+?、?? 都是 Non-Greedy


2011年11月15日 星期二

LVM 中製作 snapshot


兩個範例

Example 1: 普通用法
lvcreate -i 3 -I 8 -L 100 vg00
Tries to create a striped logical volume with 3 stripes, a stripesize of 8KB and a size of 100MB in the volume group named vg00. The logical volume name will be chosen by lvcreate.


Example 2: 從一個已存在的 image 製作 snapshot
lvcreate --size 100m --snapshot --name snap /dev/vg00/lvol1

creates a snapshot logical volume named /dev/vg00/snap which has access to the contents of the original logical volume named /dev/vg00/lvol1 at snapshot logical volume creation time. If the original logical volume contains a file system, you can mount the snapshot logical volume on an arbitrary directory in order to access the contents of the filesystem to run a backup while the original filesystem is updated.

2011年11月10日 星期四

iSCSI Target Management

收集一下目前可以管理 iSCSI Target 的東西,目前有使用過的

各種 Solution
比較
IET 的說明
  • A iSCSI target driver for Ethernet adapters, which tgt has used as a base for istgt

Tgt 的說明

  • Designed to work with multiple SCSI type devices and integrate them into the Linux kernel in a standard way
  • implementing a significant portion of tgt in user space while maintaining performance comparable to a target driver implemented in kernel space
  • The first author has maintained IET. The failure to push it into the mainline kernel is one of the reasons why tgt was born.

SCST 的說明
  • all the SCST components reside in kernel space



  1. 在使用上 IET 需要先設置 conf 檔案,雖然也可以用指令動態管理,但卻沒有方法更新 Conf 檔
  2. Tgt 則是全部用指令,之後再 output 設置到 conf 檔案
  3. Performance 似乎在 Kernal space 執行的  SCST 最好
  4. 根據這篇,似乎 Ubuntu 不支援 SCST,有點可惜
  5. LIO 還在開發中,但提供的介面很齊全,不管是 CLI or LIB 都有,在系統整合時應該會方便不少,但可惜它的穩定性以及開發時間都還無法滿足我的要求。


2011年11月8日 星期二

sudo with redirect syntax


執行這段時發現無法執行,看了半天才發現他可能是先執行 (sudo echo hello) 然後再導向檔案,所以就已經沒有 root 的身份

pjack@ubuntu1104-64-5:/etc/ceph/a$ sudo echo hello > tmp.txt
bash: tmp.txt: Permission denied


網路上有找到兩個解法


# 第一種
sudo sh -c "echo hello >> tmp.txt"

# 第二種
echo "hello" | sudo tee tmp.txt

2011年11月1日 星期二

Python 學習手冊第三版筆記 (七)


CH.27 例外事件基礎

with/as 環境管理器的敘述滿難懂的,感覺大部份的 with/as 都可以用 try/finally 實作完成,但好處似乎是物件可以事先把對 exception 的處理定義好,ex: 檔案碰到 exception 時會自動關閉,等到別人使用你的物件時,只要透過 with/as 就可以正確的處理 exception ,而不需要讓每個人都煩惱 "如果遇到 exception ,我是否需要去關檔?"

CH.28 例外事件物件

類別式例外事件的概念在 Java 中已發展的很完全,這讓我覺得原作者果然很懶惰 :P 所以只想用最簡單的方式來處理 Exception,不過看的出來 Python 在這部份的設計很明顯的不敷使用,也間接造成了光是 raise 就有很多種奇怪怪的寫法,書的作者也只能嘆氣囉! 這就是 Design 或是架構在一開始沒有設計好的後遺症

CH.29 例外事件的設計


>>> help(sys.exc_info)
Help on built-in function exc_info in module sys:

exc_info(...)
    exc_info() -> (type, value, traceback)
    
    Return information about the most recent exception caught by an except
    clause in the current stack frame or in an older stack frame.



>>> help(os.popen)
Help on built-in function popen in module nt:

popen(...)
    popen(command [, mode='r' [, bufsize]]) -> pipe
    
    Open a pipe to/from a command returning a file object.

>>> help(os.system)
Help on built-in function system in module nt:

system(...)
    system(command) -> exit_status
    
    Execute the command (a string) in a subshell.


PyDoc 、 PyChecker、PyUnit 好用的三大工具!


看到這裡我終於把這本書都讀完囉!