2014年7月26日 星期六

Python for對不同datatype的測試


python的for不同於其他語言
感覺簡潔而且強大了許多
但是往往使用起來對概念的理解上也有點心虛阿XD

所以特別測試一下了解for對不同資料型別的處理方式

字串的處理:


for char in string:
  print char

會計算字串有幾個字元
有幾個字元就迴圈幾次


a = "12345"

for i in a

  print i



結果

1

2

3

4

5






列表的處理(Tuple相同):


for element in list:
  print element

會計算列表有多少個元素
有多少個元素就迴圈幾次

a = ( 'L1' , 'L2' , 'L3' , 'L4' , 'L5' ) for i in a
  print i

結果
L1
L2
L3
L4
L5


字典的處理:


for key in dictionary:
  print key

for key in dictionary
  print dictionary[key]  #印出value

有多少個key就迴圈幾次
排列的順序與key值有關
也就是會由小到大來print出來
如果key是string則會以迭代器的位置來開始印
所以想使用for在dictionary上面
最好key值使用integer較好控制
使用string為key值可能會出現非預期的錯誤



a = { 1:'a', 3:'b', 2:'c', 4:'d', 5:'e' } #注意key順序不同


for i in a


  print i





結果以key值大小排序


1

2

3

4

5



如果想要取出value值
則使用
for i in a
  print a[i]
結果以key值大小取出value值
a
c
b
d
e

2014年7月25日 星期五

正規表示式 regular expression 學習


常常看到程式中出現類似亂碼之莫名其妙的東西
譬如
^\d{3}\s(\w+)&
原來是叫正規表示式阿
也有人叫正則表達式
學名叫regular expression
總而言之就是一種字串的篩選器

regular expression常見於各種語言都會用到
也就是三不五時看到別人python內import的re

常用的部分
\d 數字
\w 任意字元含數字
\s 任意空白字元 space tab都算
{3} 乘以三次\d\d\d 等於\d{3}
( ) 擷取器 abc  a(b)c  b會被擷取出來
. 任意字元
+ 任意字串不包含自己本身
* 任意字串含自己本身
[] 就是or啦 [abc]de , ade,bde,cde都符合
[^] 就是nor啦
^ooxx&  ^開頭&結尾 嚴謹篩選,前後有東西都不合格


Regexone非常棒的教學練習網站
http://regexone.com/

基本上全部的練習做過一遍
應該就都懂了


python sys.argv[]用法


常看到python中出現sys.argv[]這東西
找了些資料總算理解了
紀錄一下備忘

sys.argv[]是python獲取命令列參數的方法
譬如我們在terminal中會輸入的指令
ls -a
-a就是命令列參數
sys.argv[0] 代表了文件的檔案名稱本身
意思就是ls
sys.argv[1] 就代表了-a

以下是參考網路的範例並修改成容易理解的方式




# -*- coding: utf-8 -*-

import sys>



>#建立一個讀取檔案的function能將檔案內容print出來

def readfile(filename): 

 '''read file and print'''

 f = file(filename)

 while True:

  line = f.readline()

  if len(line) == 0:

   break

  print line, 

 f.close()

 

#開始對sys.argv下定義

if len(sys.argv) < 2: #len小於2也就是不帶參數啦

 print 'no argument'

 sys.exit()

if sys.argv[1].startswith('--'):

 option = sys.argv[1][2:] # 取出sys.argv[1]的數值但是忽略掉'--'這兩個字元

 if option == 'version': 

  print 'Version 1.2.3'

 elif option == 'help':

  print 'help documention'

 else:

  print 'only --version --help can be used'

  sys.exit()

else:

 for filename in sys.argv[1:]: #檔案名稱於參數位置時讀取檔案

  readfile(filename)



"""

此檔案名稱為readfile.py

則可以用readfile.py --version來查詢版號

readfile.py --help來查詢help文件

readfile.py readme.txt 可以執行function

"""

2014年7月20日 星期日

AWS (Amazon Web Services) 練習django架站與linux shell的好工具


今天跟著教學申請了一個亞馬遜雲端服務帳號
http://blog.rx836.tw/blog/first-amazon-web-services/

原本一直考慮將我的windows換成ubuntu的想法可以暫停了
windows對於部分開源軟體的安裝實在是有點頭大
但是把我電腦重灌成linux使用起來可能就不是那麼方便了

AWS目前有一年免費可以使用
只要不要超過流量的話
如果真的能架出超過流量的網站(非用來大量上傳下載之類的)
我想付那個費用也是值得的

整個申請流程還算簡單
按照上面的Link做很快就能申請完成了
也速度建置了django基本的運作

目前容易卡關的小細節就是
AWS內運行的Instance並沒有對外的public IP
必須去申請一個
在左方控制那邊的 Elastic IP
申請完之後再把它allocate到你正在跑的instance就行了
不過ssh會被斷線要再重連一次
另外就是security group要設定好
不然外面連不進去也沒有用

Django的測試伺服器必須記得是使用

python mange.py runserver 0.0.0.0:8000
不設定0.0.0.0這個any ip的話
會只給本地端連線
自己的瀏覽器會無法連線過去

最後
不使用了記得到Elastic IP頁面Release IP
據說占著茅坑不拉屎會被罰錢




2014年7月18日 星期五

git 心得整理


Git是使用於版本控制的程式
GitHub是著名的Git網站也就是repository

Git有提供git shell能透過command line直接對repository下達clone push pull等等的命令
Git shell documentation
http://git-scm.com/docs/git-shell.html

Git shell使用ssh遠端加密操作
也就是自己電腦需要有private_key而public_key需要置放於repository
簡單的來說public_key就是鎖
private_key就是鑰匙
你可以將public_key放在很多repository
自己的電腦只要有private_key就能夠遠端登入每個有public_key的repository
產生key的方法為
開啟git shell輸入以下指令

ssh-keygen -t rsa -C "username@emailhost"
之後將private_key放置於program files\Git\bin內
並將public_key打開複製裡面的文字放置到github的產生SSH內

GitHub Default Storage的path如果為C:\abc\
repository專案名稱為def.git
則對應到C:\abc\def\ 資料夾內
下載方式為

git clone https://github.com/username/def.git

這張用小畫家畫的概念圖對新手應該有非常大的幫助



剩的就靠全中文的教學網站
Documentation正體中文

2014年7月14日 星期一

準備不夠?做就是在準備了!


我朋友說想去學英文會話

希望能夠跑國外路線的業務

依照我所認識的他

英文會話能力並不算太差

至少溝通上應該不會有問題才是


我跟他說

語言能力沒有環境下不練習就會退化

何必去學會話能力

認真去跑國外業務會話能力不就能夠提升了嗎?

我們總是希望在別人能表現自己最優秀的一面

但事實上你要如何去達到完美

現在世界變化如此迅速

等你練習到完美時或許環境又改變了

現在這個世界需要的是目的為導向

我相信國外的客戶不會因為你語言能力強大就跟你下訂單

既然目的是國外客戶的業務

語言不過是溝通的工具

不需要達到完美

能夠明確的表達產品的功能即可

說一口流利的英文的確是有加分作用

但我想那在客戶願不願意下訂單的影響是非常小的

重要的還是在於產品的功能與價格以及業務誠不誠實



當然許多事情有不同的目的

特別是一次性決定勝負的項目

譬如考試、面試、表演

這時自然準備就重要了許多囉

2014年7月11日 星期五

丟掉Monkeyrunner投向AndroidViewClient的懷抱吧!


Monkeyrunner是一套android device自動化測試的工具

腳本使用jython語言

詳細的介紹如下:
http://developer.android.com/tools/help/monkeyrunner_concepts.html

不過由於monkeydevice的takeSnapshot method丟出exception的機率太高

導致我不得不放棄monkeyrunner轉向AndroidViewClient

AndroidViewClient是純python語言寫成

原始碼在此
https://github.com/dtmilano/AndroidViewClient
Download

安裝方式為
windows內環境變數加上
變數:
ANDROID_VIEW_CLIENT_HOME
值:
C:\AndroidViewClient-master\AndroidViewClient\src

之後就能夠直接於python內調用了

連接上deivce並screenshot的範例腳本


from com.dtmilano.android.adb.adbclient import AdbClient

if len(sys.argv) >= 2:
    serialno = sys.argv[1]
else:
    serialno = '.*'

device = AdbClient(serialno=serialno)
img = device.takeSnapshot()




另外monkeyimage的功能必須使用PIL (Python Image Library)來替代
http://www.pythonware.com/products/pil/
讀取電腦中的picimg圖片與拍screenshot之後切圖下來的picimg2作比對的腳本
     

        #Monkeyrunner
picimp = MonkeyRunner.loadImageFromFile('./pic/picimp.png')
picimp2=device1.takeSnapshot()
picimp2=picimp2.getSubImage((300,660,150,70))
        if picimp.sameAs(picimp2) == 1:
     
        #AndroidViewClient with PIL
picimp = Image.open("../pic/picimp.png")
picimp2= device1.takeSnapshot(reconnect=True)
picimp2= picimp2.transform((150,60),Image.EXTENT, (300,660,450,720))
        if device1.sameAs(picimp, picimp2, 1)== 1:


整體來說
AndroidViewClient效率高出Monkeyrunner許多
而且takesnapshot也不像monkeydevice一樣太多的出錯
目前實測沒有出錯過
如果要跑長時間的測試有包含到takesnapshot
使用AndroidViewClient會好上許多

補充:
monkeyrunner下的read()與python的read()不太一樣
我的python file.read()讀不出tshark所擷取的封包資訊
反而monkeyrunner下使用的file.read()就能夠讀取出來
估計是monkeyrunner使用java的直譯器的關係

2014年7月9日 星期三

網路的發展是否將能夠傳送觸覺嗅覺與味覺呢?


N年前網路從貝爾實驗室發明出來之後(詳細歷史自行查閱吧XD)

一直發展至今

網路對於多數人已經是每天不可或缺生活要件

網路提供的便利性無遠弗屆

但一直以來Output都是影像與聲音

許多方面的應用不單單是只有影像或聲音就足夠的

我想這也是目前實體店面能夠持續生存的最大原因

就好比網路購買的物品來說

我們總是希望在電腦前面就能夠真實地感受到布料的觸覺

也希望在電腦前面就能夠決定這瓶香水適不適合自己

也想知道明天將寄送來的餅乾會不會吃一口就丟掉

但至今似乎還沒有適合的 solution來解決這部分的問題


一言以蔽之

科技還沒有進步到如此的階段

你相信未來我們在電腦前面(或許未來根本已經不需要電腦)

能夠接受到觸覺嗅覺與味覺嗎?

我相信是遲早的事情

3D列印已經能夠將物品的形狀透過網路來傳輸了

還有什麼是不能靠網路來傳輸的?

或許一件usb裝置搭載香料混合器就能夠產生不同的氣味

或許未來氣味也有類似RGB三原色的RGB三原味

僅需要提供數值就能透過裝置產生不同的氣味

或許有個裝置能產生不同味道只要你將它含在口中(不是這麼衛生就是了)

或許材料工程突破製造出能夠變換各種不同質感的物體

當然所有東西都必須數位化了

都需要制定規範了

未來的發展真的是能夠無限的想像


當人類對於腦部的研究夠透徹又如何?

所有的感官知覺要被操控接收就太過於簡單了

或許嗅覺檔案是直接去影響腦中分析嗅覺的區域來達到效果

其他部位的感官亦同

人體身上也有許多的 Input / Output

如果不要透過人體的Input直接將檔案傳送至腦部

所有的世界都將會不同

這部分的構想過去的小說電影都有提到了

魔鬼總動員+攔截記憶碼

但如果這一切真的發生了

我想這世界將會有許多的成癮者

希望自己永遠活在虛擬感官的接收中

再也不要醒過來



2014年7月7日 星期一

Runas 解決windows 7 batch script 權限問題的好幫手


今天在處理tshark.bat時卡在windows 7權限問題

tshark.bat內容:


tshark pppoes and host xx.xx.xx.xx

不斷的permission denied.

加入runas 能夠設定跑此bat檔的用戶是誰

不過較麻煩的是windows 7內至少要有兩名用戶否則無法使用

所以必須創立新的使用者帳戶

並且新增密碼


runas /user:tshark /savecred "C:\program files\wireshark\tshark.exe pppoes and host xx.xx.xx"

如果沒有/savecred則每次執行bat檔都要輸入一次密碼

有加入/savecred則第一次需要輸入之後就不需要輸入了


Python 檔案內搜索固定位置字串並取代文字




#欲寫入文字
number = 123


filea = open("abc.xml", "r+")          #開啟檔案,須以r+讀寫模式
fileaString = filea.read()                    #將檔案讀成字串
idFilter = 'Name="ID" Value='         #搜索檔案內特定的文字
idPosition = fileaString.find(idFilter)  #抓出檔案內特定的文字位置
filea.seek(idPosition+33,0)               #將當前檔案讀寫位置設定到想要改寫的地方
filea.write(str(user_num))                  #將字串寫入,整數需要先更改成字串
filea.close()                                       #關閉檔案


範例:

abc.txt檔案內容:

123456789
abcdefghijklmnop


filea = open("abc.txt", "r+")
fileaString = filea.read()
idFilter = 'cde'
idPosition = fileaString.find(idFilter)
filea.seek(idPosition,0)
filea.write('GUNGUNGUN')  
filea.close()

輸出結果:

123456789
aGUNGUNGUNklmnop

2014年7月1日 星期二

Wireshark tcpdump capture filter doesn't work


一直以來嘗試wireshark抓取封包只能利用Filter.

Capture Filter設上條件之後就抓不到任何封包了

原來是因為pppoe的關係

pppoe的封包檔頭與一般IP封包不同

所以capture filter設上條件會將pppoe給過濾掉

Capture Filter的設置方式為

pppoes and host xx.xx.xx.xx

就能夠作用囉



而tcpdump抓取pppoe封包的方式為

tcpdump ether[0x0c:2] == 0x8864

不過試了老半天依舊無法將host條件或-s給加進去阿

還是無法取得http header資訊

希望有高手幫忙解答了


2014/7/7補充

tcpdump無法解決pppoe的問題

改使用tshark總算成功了

tshark pppoes and host 123.123.123.123 and port 80