2014年8月8日 星期五

演算法quine python範例

Quine演算法為程式語言經過編譯之後
執行顯示出來的內容必須與原始碼相同

wiki介紹


原本以為很難
要描述顯示出來的內容必須再新添加內容
這樣顯示的內容又會再增加
好像無解一樣

實作後發現比想像中簡單多了

python範例:

s="quine"
v="s=v=l=n='n p="
l=':"()[]+\\'
n='\n'
p='print(v[:2]+l[1]+s+l[1]+n+v[2:4]+l[1]+v+l[1]+n+v[4:6]+v[8]+l+l[7]+v[8]+n+v[6:9]+l[7]+v[9]+v[8]+n+v[11:13]+v[8]+p+v[8]+n+p)'
print(v[:2]+l[1]+s+l[1]+n+v[2:4]+l[1]+v+l[1]+n+v[4:6]+v[8]+l+l[7]+v[8]+n+v[6:9]+l[7]+v[9]+v[8]+n+v[11:13]+v[8]+p+v[8]+n+p) 

複製code執行,顯示結果將會和code一模一樣

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


2014年6月30日 星期一

pwntcha安裝心得

由於有辨識captcha的需求
在網路上找到pwntcha開源套件

沒有編譯過原始碼經驗的我當然是困難重重

根據網路的資料來查找

看樣子使用Linux來編譯是會簡單許多

搞了一整天

利用VirtualBox安裝ubuntu 14.04 LTS

過程有點繁複

包含使用virtualbox guest addtion建立主客體之間的共用資料夾

(
簡短說明:
1.使用virtualbox 裝置->共用資料夾->新增出一個裝置(D_DRIVE)
2.於客體Linux內建立一個share資料夾(/home/ripple/share)
3.終端機輸入
mount -t vboxsf "裝置名稱" "掛載於Linux的path"
mount -t vboxsf D_DRIVE /home/ripple/share
)

開始安裝許多必要的套件(於編譯之前必定先安裝否則編譯將失敗)
切換至終端機 ctrl+alt+F2 或 ctrl+alt+T

sudo apt-get install libsdl1.2-dev libsdl1.2debian
sudo apt-get install libsdl1.2-dev (relatively large, 10M
sudo apt-get install libsdl-image1.2-dev
sudo apt-get install libsdl-mixer1.2-dev
sudo apt-get install libsdl-ttf2.0-dev
sudo apt-get install libsdl-gfx1.2-dev
sudo apt-get install libimlib2
sudo apt-get install libimlib2-dev
sudo apt-get install subversioin
Svn co svn :/ / svn.zoy.org / caca / pwntcha / trunk pwntcha
. / bootstrap
好的陣亡在這個步驟
說需要automake 1.5或以上的版本
sudo apt-get install automake autoconf
也都安裝好了就是無法./bootstrap

山不轉路轉
馬上抓了Fedora 20安裝(幾年不見都出到20了= =)
於virtualbox內安裝失敗
原因不明再次放棄
改安裝CentOS 6.5
有了先前安裝經驗
共用資料夾一下就建立好了
CentOS 比較麻煩阿repo內只有SDL1.2
libsdl-image
libsdl-image-devel
libsdl-mixer
libsdl-mixer-devel
都要從網路找rpm安裝
rpm -Uvh "rpm-package"
全部都安裝好後
到pwntcha的根資料夾
./bootstrap
./configure
make
make install
好的大功告成
cd /pwntcha/src
mkdir share
cd ..
開始搬資料到share資料夾內才可以開始用
ls -al 屬於資料夾的都要搬
(xanga,vbulletin,tickets,ticketmaster,slashdot,scode,phpbb,paypal)
cp -r xanga ./share
cp -r vbulletin ./share
...省略

總算是可以使用了
使用方式
pwntcha "圖片名"
啥~解不出來XD
再仔細閱讀
http://caca.zoy.org/wiki/PWNtcha
我要解的是屬於hoke
原來These captchas can currently not be defeated by PWNtcha
沒讀到這一行文字
看到圖片就高潮的下場就是白忙一場呢

2014年6月29日 星期日

這是一個起步


其實一直以來就覺得該開一個部落格了
原因無他
只是想要有個能夠備份自己所學習知識的工具罷了
過幾年後回頭審慎自己所寫的文章
再想想自己進步了多少

也可以在這邊抒發一些想法與心得
比起在Facebook內發些心得感想
然後開始與想法有出入的路人或交情甚薄的網友互相嘴砲
發文在這邊來的自由地多

有許多的東西想要學習
多數是程式設計方面
我一直深信專業不會賺錢
知識才能夠賺錢
或許有人反駁專業能領多少多少K
事實上不過是種薪水罷了
在我眼裡
賺錢不是一個月領多少K
而是你所擁有的的知識的連結能夠為你創造多少財富
學習程式設計也只是為了興趣
或許在學習的途中
能夠看見這些知識如何為我帶來財富

現階段的工作需求
所以主要以學習
python
monkeyrunner
Linux bash shell
C++
原本想學的arduino暫時先擱在一旁了
還有好多好多想學的東西
Java JavaScript C#
資訊真的是學不完