2016年12月22日 星期四

[sublime]安裝中遇到的問題

anaconda的安裝
anaconda使用後會出現一些白框框住程式碼
How to fix:
Sublime > Preferences >Package >Anaconda >Settings User
會出現一個空白文件,加上{"anaconda_linting":false}即可

2016年12月20日 星期二

[Python]1.9.2 自定義函式

def 函式名稱(參數1, 參數2........):
      若干運算(敘述)
       return 回傳值1, 回傳值2......

 可以沒有回傳值

 def power(base,exp):
       return base**exp

函式的呼叫
power(2,3)
power(exp=3,base=2)

遞迴
如果我們今天有一個清單

lst = [1,2,[1,2,3],2,4,5,[23,12],[12,23,34,67]]

def print_list(lst):
 for item in lst:
  if isinstance(item,list):
   print_list(item)
  else:
   print item,

#isinstance(item,型態)這個方法就是問
#請問item是這個型態嗎?

#這邊要注意,運用遞回的方法把每一層的list剝開
print_list(lst)
執行結果 >>>1 2 1 2 3 2 4 5 23 12 12 23 34 67


參數的預設值
def add(a,b=1):
      return a+b

注意:帶有預設值的參數都需擺在沒有預設值的後面,
            位置呼叫時無法指定哪一些參數用預設值


2016年12月19日 星期一

[Python]1.9.1 內建函式

1.9.1 內建函式
內建函式的paper

工廠函式:專門負責型態或是製造資料
for example:
int('99') -------------99
float('1.73')----------1.73
bool('')---------------False
str(20)----------------'20'
list((1,2,3))----------[1,2,3]
list(set([1,1,2,2])----[1,2]























全部或任何
“對於所有”(for all) “存在一個” (exist) 在邏輯上是個很重要的概念
member = {'jack':90,'jerry':85,'jimmy':43,'Wang':9,'LI':23}
a = {}
for name,grade in member.items():
    
    if grade>60:
        a[name]=True
    else:
        a[name]=False
            
if all(a.values()):
    print "Everyone pass the test"
else:
    print "someone did not pass the test"
    for name,ch in a.items():
        if ch == False:
            print name
#這裡要注意的是dic資料的取用,用for 方法
#a.items()
#a.keys()
#a.values()




執行結果





















分析
all():會對list裡面的所有元素進行檢查,若全部元素為真,傳回True,否則傳回False
另一個函數any()則是只要一個人為真,就傳回真了

最大與最小
max(lst)
min(lst)

產生連續的整數
range(10)-----------[0,1,2,3,4,5,6,7,8,9]
range(2,7)----------[2,3,4,5,6]
range(2,13,3)-------[2,5,8,11]

群集的長度
>>>lst = [1,2,3,4,5]
>>>print len(lst)
>>>5
>>>dic = {1:2,2:2,3:2}
>>>print len(dic)
>>>5







[Python]1.8 例外

動態語言中,除了語法錯誤造成的Syntax Error以外,幾乎所有的錯誤都來自執行期的錯誤.像是TypeError或是NameError等等.當錯誤發生時,Python會產生Traceback,方便檢視錯誤的來源. 但是在開發時,重要的不是辨識每一個錯誤而是排除掉一些不是錯誤的錯誤,例外. 舉個例子:
#有個檔案test_file.txt

3 4
1 3

20 19
%%%
88 7
1 2 3 
0
#使用try except 敘述來避開中間%%%的例外
f = open('/Users/lijack/Desktop/test_file.txt')
for lines in f:
    try:
        a , b = lines.strip().split()
        print "{:>2} + {:>2} ={:>3}".format(a,b,int(a)+int(b))
        
    except:
        pass
#python 不允許有suite是空白的
    
    
f.close


#strip()函數會移除字串頭尾指定的符號
string = "     12342342314213     "
print string.strip()

string1 = "8888888dfasfsdfsdafasdf888888"
print string1.strip('8')

#split函數:用特定字符切割字串
string2 = "hello world jack"
a,b,c = string2.split()
print a
print b
print c



















分析:如果沒有用try - except 敘述時,有幾行( %%%, 1 2 3)沒有符合兩個數字的形式,便會出現ValueError.如果用if -else 敘述時,會出現很多種複雜的狀況.但其實我們並不需要去處理跟我們需要不相關的事.

執行:我們先執行try的程式碼,當發生錯誤時,立刻停止try,進入except 執行suite 裡的程式碼(ex: pass),在這題等於我們略過了所有不符合規格的行.

2016年12月13日 星期二

[Django] 1.7.3 讀檔與寫入檔案

資料檔的讀寫是python 的基本功能之一

開啟檔案:使用open函數

fp = open('test_file.txt','r')
a = fp.read()
b = fp.readline()
c = fp.readlines()
fp.close()
其中,test_file的欄位可填入絕對路徑,但是請注意
windows: fp = open('C:\\Users\\jack\\Desktop\\test_file.txt')
mac : fp = open('/Users/Documents/test_file.txt')
因為windows的路徑的斜線是\,會造成跳脫字元,所以要輸入兩個\
而mac沒有這個困擾

r:讀檔 w:寫入 a:附加

讀取檔案的方法有三種:read(), readline(), readlines()
      read() : 一口氣讀完
 readline():一次只讀一行文字檔,傳回一個字串
readlines():把每一行拆開放在不同的字串變數,最後彙整成一個串列




f = open ('C:\\Users\\jack\\Desktop\\MP21602\\zop.txt','r')

print (f.read())

#f = open ('C:\\Users\\jack\\Desktop\\MP21602\\zop.txt','r')
print (f.readline())
print (f.readline())

f = open ('C:\\Users\\jack\\Desktop\\MP21602\\zop.txt','r')
print (f.readlines())
read() 會顯示全部內容
readline() 照理說會顯示
 >>>
Beautiful is better than ugly

 Explicit is better than implicit
>>>

 因為純文字格式每行後面都有個換行符號\n ,加上本身print也有一個換行
有兩種解決方法
(1) 用strip()清除字串頭尾非必要字元
(2) print      ,end=""

使用with敘述可以讓程式更簡潔

with open('C:\\Users\\jack\\Desktop\\MP21602\\zop.txt','r') as f:
     for line in f:
         print line

上述程式把要讀取的檔案名稱寫在程式碼並不是個很好的方式,通常會把要操作的文字對象已執行參數的方式輸入 程式命令列函數可以用sys.argv取得

import sys

if len(sys.argv)<2:
    print("How to use: python 8-2.py class")
    exit(1)

std_data = dict()

with open(sys.argv[1],encoding='utf-8') as fp:
    alldata = fp.readlines()

for line in alldata:
    no,name = line.rstrip('\n').split(',')
    std_data[no] = name

print (std_data)

<\pre>


[Django]1.7.2

break and continue

如果while的條件總是成立,我們稱其為無窮迴圈.
使用時機:當我們的程式需要等待使用者的一些要求時

while True:
print “never stop”

而break 跟 continue 則可以強制介入迴圈

n = 5

count = 1

while True:

print "just print {} times".format(count)

if count == n:



break

count+=1

continue 的用法

n = 1

while n<=10:

if n==5:

n+=1

continue

print n

n+=1

for 迴圈

lst = [1,2,3]
for num in lst:
print num

for item in lst:
suite
將lst中的元素一個個取出,每取出一個便將他賦值(代入)
並且執行一次suite

for 可以對清單 元組 字典 字串 進行迭代

使用時機
for :當重複的次數可以被計算時
while:當條件清楚時



comprehension

lst = [1,2,3,4,5]
lst_eq = [n**2 for n in lst]
lst_eq1=[n**2 for n in lst if n%2==0]

>>>lst_eq
[1,4,9,16,25]
>>>lst_eq1
[4,16]

scores = [88,90,100,65,78]
score_dic = {student_id :score for student_id,score in enumerate(scores)}

>>>score_dic
{0: 88, 1: 90, 2: 100, 3: 65, 4: 78}

enumerate是一個函數,當它與for 搭配時,他會同時把索引值與元素取出

1.7 輸入與輸出

print函式
1.任何基本資料都可以用print輸出
2.print 1,———不斷行列印 加逗號

input函式
guess = 6
while True:
guess_number = int(input('please enter a num \n'))
if guess_number == guess:
print "right"
break
else:
print “wrong"
注意:任何輸入都會被當成字串,需要轉換



[python] selenium 爬蟲安裝指南

http://www.kenst.com/2015/03/installing-chromedriver-on-mac-osx/

1.First, you need to download chromedriver
2.create a path for chromedriver

sudo nano /etc/paths

add path of chromedriver
ex: /Users/jackli/Documents/webdriver

To check:
echo $PATH

3.move chromedriver to your own path

2016年11月24日 星期四

[Python]基礎篇 1.5

1.5.1 附值運算

a = 2
a = 'jack'
a=3.1415
左邊的變數參照右邊的資料

1.5.2 空運算
pass ???

1.5.3 自運算和加強運算
a+=5
a-=5
a*=5
a/=5
a%=5
a**=5

1.5.4 比較運算
1>0   True
1<0   False
0>=1 False
0<=1 True
0==0 True
0!=0  False

python有個比較特別的特性
可以同時使用兩個運算符


其他語言需用0<a且a<=5






1.5.5 邏輯運算
and
or
not

1.5.6 身分運算 is

==   判斷兩者的值是否相等
is     判斷兩者是否來自同個記憶體位址

這邊因為整數1是個不可變資料
所以python將a跟b都參照到了1

[1,2,3]是個可變資料
所以lst_1,lst_2參照道的是兩個不同的位址





1.5.7 隸屬運算 in

2016年11月23日 星期三

[Linux]nfs的使用

為了方便在多台linux間傳輸資料,所以需要一個NFS的系統

先用rpm 查詢 nfc ,rpcbind 有沒有安裝
rpm -qa |grep rpcbind
rpm -qa |grep nfc

執行/etc/init.d 下的rpcbind
(這裡有個問題,不知道為什麼不能直接執行,要先切換到init.d目錄下
/etc/init.d/rpcbind start

建立一個資料夾給NFS掛載
mkdir -p /home/nfs/Qdownload
-p     能直接建立樹狀的目錄,不用一層層建立資料夾

掛載目錄到本地資料夾
mount -t nfs 192.168.1.90:/Qdownload \
>/home/nfs/Qdownload

\+enter鍵                跨行輸入

df     查看掛載的情況
unmount 卸載


鳥哥NFS介紹

[Django]Github的建置

之前因為換電腦的關係,打的code只有複製下來,想在新的電腦上面用還需要安裝各種套件才能執行原本的code,但是忘記打包requirement.txt ,也無法自動安裝。
所以想說學習一下github的使用方法

首先先進入虛擬環境中
source test_env/bin/activate
建立一個Django專案
django-admin.py startproject mysite
接下來是Git 的初始化
先安裝git
yum install git
再來初始化
git init
git add --all
git commit -m "init"
git remote add origin https://github.com/412988937/mysite.git
git push -u origin master


2016年11月18日 星期五

[Raspberry Pi 3]建置環境與遠端操控

這個禮拜去光華的良興電子購買了Raspberry Pi 3 model B
RP3:1690元
殼子:350元(買貴了)

買來之後發現,RP3 的散熱不太好,隨便播個影片CPU就飆到90%
散熱片是必須,長時間執行的話要加買一個可以裝風扇的殼

以下是灌系統的步驟:
1.準備一張記憶卡
2.到Raspberry官網下載映像檔
   說明一下各系統的差異:
    NOOBS:一種多重開機方式,可以選擇要灌哪一種系統,需要較大記憶卡
    Raspbian:官方版本,支援最多
    OSMC:專門撥放影片的系統,很像一個多媒體播放器
    (第一次安裝界面記得要選英文,中文會都是亂碼
    其他的我還沒用過................
3.用Win32 Disk Imager 把下載的img燒到記憶卡
   (這個軟體只能讀取img,無法讀取iso)
4.之後就可以開機了

系統預設的帳密:pi /raspberry
更改密碼指令:passwd pi
啟用root帳號:sudo passed root 

剛啟動時,系統無法充分利用sd卡的空間,於是輸入
sudo raspi-config 進入raspberry pi 的配置工具

第一個選項能擴展系統的使用空間
其他很多細項可以研究
(8.overclock 超頻)

為了方便遠端使用,我們會把rp3的ssh跟vnc server 打開

sudo apt-get -y update                               #更新所有套件列表    #-y 對所有詢問同意
sudo apt-get -y upgrate                              #更新所有套件           #更新很久
sudo apt-get -y install tightvncserver        #灌VNC server 提供linux的遠端桌面功能

apt-get 指令介紹









[Django]sublime 2 的安裝與開始選單的修改

首先我們可以先到sublime的官網下載所需要的版本
然後切換到下載目錄,並輸入
tar vxjf Sublime\ Text\ 2.0.2.tar.bz2               #後面那一串是檔名,按兩次tab即可
sudo mv Sublime\ Text\ 2 /opt/                      #將解壓縮後產生的Sublime\ Text\ 2資料夾
                                                                          搬移到/opt/    (需要root的權限)
sudo ln -s /opt/Sublime\ Text\ 2/sublime_text /usr/bin/sublime
#建立連結檔


Sublime\ Text\ 2 = Sublime Text 2  (因為檔名中間都有空格所以這樣表示)



ln 指令的介紹


開始選單的修改

2016年11月15日 星期二

[Python]基礎篇1.4

資料型態
將會介紹python幾種常見的資料型態,像整數、浮點數、字串、清單、字典等等

1.4.1 整數與浮點數















1.4.2 布林值
True / False

1.4.3 字串(string)
>>>string = ''                                      #空字串
>>>string_a = 'h'                                #字串以''或""框住
>>>string_b = 'ello'
>>>string_a + string_b                      #字串間的串接
'hello'

另外我們可以用三雙引號(""")來製造跨行的字串
 (又稱:doc string (文件字串)
用三雙引號製造出的字串不僅能跨行
還可以保留他字面上的格式















如果要取出字串中某個字元

string[idex(索引)]

string[0:5]      #從index = 0 取到 index =4
string[:5]        #從index的開頭取到index = 4
string[5:]        #從index = 5 取到index的尾巴
string[2:8]      #從index = 2 取到 index = 7
string[:]          #簡易複製字串的方法





字串也能進行格式化


字串中有些特殊的字串叫跳脫字元(escape character)
print "hello\n"

\\       倒斜線
\'       單引號
\"      雙引號
\a      鈴響
\b      退格
\n      換行
\t       縮排

使用非英文的字串
#-*- coding: utf-8 -*-

1.4.4 清單 (List)
清單是一個序列(sequence),我們能夠存放任何型態的資料在清單之中
>>>lst = [ 'abc' , 27 , None]

取出元素    >>>lst[0]      'abc'
                    >>>lst[1]      27
                    >>>lst[2]      None
                    >>>lst[-1]     None
                    >>>lst[1:]     [27,None]
改變元素    >>>lst[1] = 28
加入元素    >>>lst.append('New')
彈出元素    >>>lst.pop(2)                            #第二個元素消失
排序元素    >>>lst.sort()

1.4.5 Tuple
Tuple is similiar with list, they are both sequences ,but the elements in the Tuple are static
for example:
>>>t=(2,4,5)
>>>t[0]
2
>>>t[1]=0
TypeError

We find that if we decide to change the element of Tuple, there is a type error.

Another point we need to know is:
if we want a tuple with single element, we are forced to add a comma,EX:
t=(1,)
because if we type t=(1), python will mislead to t=1


1.4.6 Dictionary{}

Is not a sequence. Is a corresponding data structure.


>>>dic = { 'name' : 'jack', 'age':27}
>>>dic['name']
'jack'
>>>dic['age']
27

we call 'name', 'age' --------key
             'jack', 27   ----------value


更改字典值:dic['key']=value_1
增加字典值:dic['key_1]=value_2

1.4.7 巢狀結構
person = ['jack',27,[1998, 09,30]}












1.4.8 使用群集的好處
score = [90,91,92,93]
total = sum(score)

1.4.9 可變與不可變
a=1
a=2
a是個參照,改變的是參照的位置

string = "abc"
string[1]='x'
TypeError

因為字串的內容是不可變的

字典的鍵是要是不可變的資料


































2016年11月10日 星期四

ftp 資料

http://www.phpini.com/linux/wget-download-ftp-whole-directory
http://255121.blogspot.tw/2015/01/linux-ftp.html
http://yahoon.blog.51cto.com/13184/200991
http://charleslin74.pixnet.net/blog/post/434429402-%5Blinux%5D-wget%E6%8C%87%E4%BB%A4%E7%9A%84%E7%94%A8%E6%B3%95

以下是有關ftp的指令

Example:
ftp:192.168.1.1
帳號:ruby12345
密碼:abcd1234
目錄結構:HDD1/pdsite

如果我要下載整個目錄
wget -r ftp://ruby12345:abcd1234@192.168.1.1//HDD1

[Python]基礎篇1.3


python的基礎

1.3.1
進入python shell >>打開terminal,輸入python

1.3.2
如果遇到不會用的指令>>help([指令])

1.3.3
變數命名須遵循以下規則
1.以底線或英文字母開頭
2.以底線或英文字母或數字連綴
3.不可與保留字相同
4.大小寫有別(case sensitive)
ex:
(O) result
(O)_result
(O)result_2
(O)Result_2
(X)$reuslt
(X)2_result
(X)for

1.3.4
變數的命名有其慣例,可以去找PEP8(Python Enhancement Proposals)來參考

1.3.5
關於資料型態,我們會在之後介紹重要資料結構(浮點數、字串、清單、字典.....)
python存在一個不具備任何資料型態的資料:None
且不同的資料型態有其獨特的運算符的方法

1.3.6
關於變數參照
>>>result=2
在這個例子中,result這個變數儲存了2這個整數,但實際上Python並沒有讓result直接紀錄2,而是找了一個可以儲存2這個整數的空間(容器),並讓result參考到了該空間。
result只是一張標籤,上面寫著儲存物的儲存位置
>>>變數result參照了2這個整數

參照的重要性
>>>result=2
>>>result=3.0
>>>result='hello'
>>>result=[1.2.3]
我們發現該變數不但能儲存不同型態的資料,還能隨時更換資料型態。
這在C/C++等靜態語言是不可能的事情,因為靜態語言的變數必須在一開始變數宣告時定義
對python 而言,變數只是個參照,參照了某個裝資料的容器

優點:減少了變數宣告的工作,能隨時更換儲存資料的類型
缺點:慢,難發現錯誤

1.3.7
vi----------------------------------開啟文字檔編輯器
test.py
a=10
b=20
result = a + b
print result
:w test.py-------------------------儲存檔案為test.py
python test.py--------------------執行

1.3.8
封裝、參數化與函式

1.3.9
類別與物件

每一種資料型態都是一種類別
a=10------------10是整數這個類別的實例(instance)or物件(object)

Example
如果我們有一個類別叫做Cat, my_cat是Cat的實例
>>>my_cat.name                                       #name是Cat的一種屬性(attribute)
'Kitty'
>>>my_cat.shout()                                    #shout是Cat的一種方法(method)
Meow
之後會學習如何自訂類別





2016年11月9日 星期三

[Django]安裝django與建置

pip install [套件名稱]
pip unintall [套件名稱]
pip install Django==1.7.1                      安裝django 1.7.1
django-admin.py --version                     查看django的版本  
django-admin.py startproject [name]     建置一個django 專案:name
tree mysite                                              樹狀展開mysite












python manage.py runserver                  啟動server (記得切回虛擬環境)(切回manage.py所在目錄)

接著在瀏覽器裡輸入:http://127.0.0.1:8000
就可以看到成功運行的網頁了

我發現網站的檔案並不是放在虛擬環境裡

<補充tree 套件的安裝>
su -
yum install tree
http://www.ahlinux.com/start/base/23132.html

[Django]虛擬環境的使用


虛擬環境主要應用情形有兩種
1.如果同時有很多個python專案在進行,而每個專案需要的環境都不同(可能套件版本不同
2.有十個人一起開發一個大型的專案,確保每個人開發環境都相同
    (可能有使用windows, linux, mac 的人要一起合作)


其中一個解決方法是虛擬環境

python的虛擬環境可以在同一個系統上建立各自獨立且乾淨的開發環境,並且彼此間不互相影響,免去相依性或衝突的問題,專心於開發及維護。

pip install --upgrade pip               更新pip
pip install virtualenv                    安裝virtualenv這個虛擬環境套件
virtualenv [name]                         建立一個name的虛擬環境

我們可以在當前的位置看到一個名為test_env 的目錄
其中它包含了bin,lib,include三個資料夾, lib64的連結檔, pip-selfcheck.json










source test_env/bin/activate         啟動虛擬環境



deactivate                                     解除虛擬環境

如果再也用不到的虛擬環境可以直接將test_env整個目錄刪除

回到一開始的問題
情境1. 我們可以為每個專案都準備一個虛擬環境 在虛擬環境間切換
情境2. 將建立好的虛擬環境統一分配給所有人
            分配方法有下:
            1.打包虛擬環境的目錄
            2.使用pip freeze 指令將套件列表輸出到requirements.txt
               其他人也用pip freeze 來讀取requirements.txt安裝

[Linux]centos 7.0 下 pip 的安裝

首先,centos 7.0 已經有內建python
python --version                    查詢自己的版本

再來是安裝pip
pip是python 的套件管理工具,集合了下載、安裝、管理、移除套件等功能

開始安裝吧
su -                                          切換至系統管理員

https://www.liquidweb.com/kb/how-to-install-pip-on-centos-7/
從這個網站知道
Pip is part of Extra Packages for Enterprise Linux (EPEL), which is a community repository of non-standard packages for the RHEL distribution. First, we’ll install the EPEL repository:

所以我們先輸入
yum install epel-release        安裝EPEL
yum install python-pip           安裝pip

成功安裝




2016年11月7日 星期一

[windows 安全]遠端連線 資料清除


因為需要在外面連回家裡的windows server 工作
所以開啟了遠端桌面
但是windows 會把每次的連線紀錄記起來
需要手動刪除

遠端桌面紀錄主要儲存在兩個位置
1.HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Default 下的MRU0,MRU1......
2.c:/Users/[user_name]/Documents/Default.rdp


底下是*.bat 的程式碼 

只能從桌面運行

reg delete "HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Default" /v "MRU0" /f
::刪除機碼1
reg delete "HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Default" /v "MRU1" /f
::刪除機碼2
cd..

::從桌面切換至上層目錄
cd Documents

::切換至Documents
attrib -h -r -s Default.rdp

::更改檔案屬性

del Default.rdp
::刪除遠端資料檔

shutdown /r /t 60 /c "Clear rdp"

 ::/r 重新啟動 
::/t 60 60秒後
::/c "comment"



2016年10月7日 星期五

cookie的使用

今天主要是來寫寫cookie
首先 什麼是cookie呢
cookie是一種存在瀏覽器內的資料
方便網站去記得使用者

def set_c(request):
    response = HttpResponse('set you lucky number as 8')
    response.set_cookie('lucky number',8)
    return response

def get_c(request):
    if 'lucky number' in request.COOKIES:
        return HttpResponse('Your lucky number is {0}'.format(request.COOKIES['lucky number']))
    else:
        return HttpResponse('NO COOKIES')

但是get_c 沒有抓到cookie ,明天研究

這邊有個寫法
print("%d %d"&('1','2')-----------1 2-------------old style
print("{} {}".format(1,2)---------1 2-------------new style
print("{1} {0}".format(1,2)------2 1-------------only for new style

裡面的數字可以對外面排序