almost 3 years ago

首先,在 /etc/network/interfaceswlan0 這段,參照下方做修改,主要是指定網卡要使用的無線網路 ID 以及密碼。

/etc/network/interfaces
allow-hotplug wlan0
iface wlan0 inet dhcp
      wpa-ssid MyHome
      wpa-psk 12345678
EOF

接著,重新啟動網路

$ sudo service networking restart

這樣應該就可以囉!

 
almost 3 years ago

今天在研究如何用 Regular Expression 來分析 LDAP 帳號時,突然有間有種以前看不懂得 Term 突然都了解的感覺。立馬做個記錄。

Syntax

() Capturing group - 括弧內的符合的內容會被收集起來

(?:) Non-capturing group - 告訴 Parser 不要收集此括弧內的內容

[] Character class - 一般大家熟悉的允許字元的集合

[^] Negated Character class - 跟 Character class 相反,是不允許字元的集合,^ 一定要在開頭

?= Positive lookahead - 緊鄰的字元必須符合

?! Negative lookahead - 緊鄰的字元不得符合

Example
  1. _(?=a): 底線後方必須馬上接英文字母 a

    • _abc -> match
    • _cde -> not match
  2. _(?!a): 底線後方不得為英文字母 a

    • _abc -> not match
    • _cde -> match

練習

這些例子可以在 Rubular 上作實驗。

  1. Find all values of ou and dc in the following LDAP string:

    uid=jim,ou=student,ou=mathematics,dc=nccu
    

    Pattern

    (?:ou|dc)=([^,]+)+
    
  2. Find all attribute in a HTML tag.

Python re

Python 使用 re 時,常用的指令有 2 個,分別是 re.search 以及 re.findall。差別主要在於 search 只要找到第一個就會停止了,findall 則會把整個字串分析完。

例子
import re

ldap_pattern = re.compile(r"(?:ou|dc)=([^,]+)+")
my_string = "uid=jim,ou=student,ou=mathematics,dc=nccu"

re.search(ldap_pattern, my_string).group()
re.findall(ldap_pattern, my_string)

Reference

  1. What I Learned Today: Regular Expression Backreferences
  2. Non capturing group? (?:)
  3. Lookaround
 
almost 3 years ago

9/4 去參加了 Function Thursday 的 Meetup。

這次主題試著以 Bottom Up 的角度來介紹 Functional Programming 應有的思維。主要的內容圍繞在 Lambda Calculus。對我來說,這是個還蠻陌生的主題。先紀錄下網路找到的關鍵字。

Definition

Let E be a λ-expression (or a λ-term), if E is

  1. Any variables: x, y
  2. An abstract function: λx.E. In Python, we use lambda:
    lambda x: E
    
  3. A function application: Abritary composition of λ-expression, e.g., (E1 E2).

Substitution

  1. α reduction
  2. β reduction

Examples

Given a syntactic sugar declaration

let x = a in 
let y = λz.x in
let x = b in
y x

It turns out

let x = b in y x    => (λx.y x) b      => yb
let y = lz.x in yb => (λy.yb) (λz.x) => yb [λz.x/y] => λz.xb
let x = a in λz.xb => (λx.λz.xb) a   => λz.ab

參考資料

 
about 3 years ago

Pyreverse 是一套繪製 UML class diagrams 及 package dependancy 的工具,目前已被整進 pylint

Requirement

  1. graphviz
  2. pylint (By pip)

使用方法

$ pyreverse -o [format] -p [file_name] [parsed_file]

format 會受限於 graphviz 能支援的格式,跟你當初編譯時有關,可以使用下列指令來作測試:

$ dot -Txxx

例子

$ pyreverse -o png -p my_module_base my_module_base/base.py

其他參數

-a N, -A    depth of research for ancestors
-s N, -S    depth of research for associated classes
-A, -S      all ancestors, resp. all associated
-m[yn]      add or remove the module name
-f MOD      filter the attributes : PUB_ONLY/SPECIAL/OTHER/ALL
-k          show only the classes (no attributes and methods)
-b          show 'builtin' objects

參考資料

Pyreverse : UML Diagrams for Python

 
about 3 years ago

今天在公司介紹了 Docker,自從在 2/25 參加了 Docker Taipei #1 Meetup後,就一直很想介紹一下 Docker。

不過,實在很難下筆。

先放上 Slide,有空再寫成文章吧。

Introduction to Docker @ slideshare