2012年12月26日 星期三

使用apt-get安裝軟體不顯示提示輸入欄位(unattended)

最近在安裝chef時總是需要輸入一些資料,例如管理者密碼、本機網址等等
這個提示用意很好,但是在做自動化安裝時我們常常需要的是不需人工介入
因此就這好意就變成了困擾
在網路上找了一堆作法,經過測試後只有以下的作法才有用
先設定環境變數
export DEBIAN_FRONTEND=noninteractive
接著使用以下的指令做安裝軟體(${pkg_name}請填上您的軟體名稱)
apt-get -y -q install ${pkg_name}

2012年12月20日 星期四

Ubuntu遠端桌面伺服器

我需要的是一個類似Windows Remote Desktop的遠端桌面軟體
意即是"開機後,不需使用者登入,遠端桌面伺服器即啟動,且遠端與本地端的畫面是一樣的"
以下是我設定的方式

安裝軟體
sudo apt-get -y install x11vnc

讓啟動X11vnc的指令開機時執行
編輯/etc/rc.local並加入以下的指令
x11vnc -auth /var/run/lightdm/root/:0 -display :0 -forever &
PS. 如果需設定桌面小大,可以再加上"-geometry 1024x768"的參數

接著使用vncviewer連到${your_server_ip}:0就可以了

好玩的是還可以再用Ubuntu內建的Desktop sharing做同步分享出去喔!

參考資料連結如下:
http://marcelozambranav.blogspot.com/2011/11/configure-x11vnc-in-ubuntu-1110-aka.html
http://ubuntuguide.org/wiki/Ubuntu_Oneiric_Remote_Access#Remote_Access

2012年12月18日 星期二

密碼強度檢查方式比較

在http://www.checkio.org/上參加了用python解題的遊戲
第一個題目就讓我很感興趣
題目是要寫一隻程式去檢查密碼的強度
條件一:字串長度大於10
條件二:必需包含數字
條件三:必需包含小寫字母
條件四:必需包含大寫字母
我的解法是method1,但看了其他人的解法後不知道效率如何
於是寫了下面的程式去比較
其他的方法是依別人的解法去稍做修改,儘量不修改到程式,以求測試正確
#!/usr/bin/env python

import re
import string
import timeit

data_list = ['A1213pokl', 'bAse730onE', 'asasasasasasasaas', 'QWERTYqwerty', '123456123456', 'QwErTy911poqqqq']

def method1():
    global data_list

    for str in data_list:
        if len(str) >= 10 and re.match('.*([0-9]){1,}.*', str) and re.match('.*([a-z]){1,}.*', str) and re.match('.*([A-Z]){1,}.*', str):
            pass
        else:
            pass

    return True

def method2():
    global data_list

    for str in data_list:
        if len(str) >= 10 and filter(lambda a:a.isupper(), str) and filter(lambda a:a.islower(), str) and filter(lambda a:a.isdigit(), str):
            pass
        else:
            pass

    return True

def method3():
    global data_list

    for str in data_list:
        digit = upper = lower = False

        if len(str) < 10:
           pass
        else:
            for s in str:
                if s in string.ascii_lowercase:
                   lower = True
                if s in string.ascii_uppercase:
                    upper = True
                if s in string.digits:
                    digit = True
            if lower and upper and digit:
                pass
            else:
                pass

    return True

def method4():
    global data_list

    expr = re.compile("^.*(?=.{10,})(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).*$")

    for str in data_list:
        bool(expr.findall(str))

    return True

def method5():
    global data_list

    for str in data_list:
        bool(re.match('((?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{10})', str))

    return True

def method6():
    global data_list

    expr = re.compile('((?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{10})')

    for str in data_list:
        bool(expr.match(str))

    return True

t = timeit.Timer(method1)
print "method1", t.timeit()

t = timeit.Timer(method2)
print "method2", t.timeit()

t = timeit.Timer(method3)
print "method3", t.timeit()

t = timeit.Timer(method4)
print "method4", t.timeit()

t = timeit.Timer(method5)
print "method5", t.timeit()

t = timeit.Timer(method6)
print "method6", t.timeit()

測試出來的結果
method1 22.0549740791
method2 28.7450380325
method3 24.3238689899
method4 15.9753398895
method5 12.3819229603
method6 7.79946398735

所以看來使用正規表示式理論上是比較快的
但是前提是要看得懂
如果需要對大量的資料做正規表示式的比對
使用re.compile後的結果速度會快很多
但只有少數使用我想差距不大吧
但究竟是多少數,可能還要看正規表示式的內容跟數量才能做決定吧!