2015年11月18日 星期三

Django入門(1) 前置設定

Django是一個開放原始碼的Web應用框架,由Python寫成。採用了MVC的軟體設計模式 --wiki

安裝

pip install Django

建置專案

django-admin.py starproject proj
其中proj就是專案名

目錄結構

-- manage.py
|
-- proj
  |
  -- __init__.py
  -- settings.py
  -- urls.py
  -- wsgi.py
manage.py:python的命令稿,讓使用者更方便管理專案
proj:專案的主目錄
__init__.py
settings.py:設定檔
urls.py:URL的配置檔
wsgi.py:網頁伺服器和Django的接口

啟動Server

python manage.py runserver

環境設定

使用settings.py檔案

專案路徑

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
預設就會產生了,所以不用手動設定
之後還要設定模板(templates)路徑,在自動產生的TEMPLATES=[]底下:
TEMPLATES = [
  {
      'BACKEND': 'django.template.backends.django.DjangoTemplates',
      'DIRS': [],
      'APP_DIRS': True,
      'OPTIONS': {
          'context_processors': [
              'django.template.context_processors.debug',
              'django.template.context_processors.request',
              'django.contrib.auth.context_processors.auth',
              'django.contrib.messages.context_processors.messages',
          ],
      },
  },
]
在'DIRS': [],裡設置模板位置(Django 1.8適用):
'DIRS': [os.path.join(BASE_DIR, 'templates')],
若是Django1.8以前版本請另外新增以下:
TEMPLATE_DIRS = (
  os.path.join(BASE_DIR, 'templates'),
)
接著請在最上層的proj(和manage.py同一層)新增一個templates目錄,其是用來放網頁的模板

除錯模式

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
PS:為了網頁安全性考量,若網站要上線時,請記得將DEBUG模式關閉

Application安裝

在Django中App和Project是兩種不同的東西,一個Project可以由多個App組成。
 INSTALLED_APPS = (
  'django.contrib.admin',
  'django.contrib.auth',
  'django.contrib.contenttypes',
  'django.contrib.sessions',
  'django.contrib.messages',
  'django.contrib.staticfiles',
 )
這些是內建的,若往後有需要新增或移除App請在這裡設定

根URL配置

ROOT_URLCONF = 'proj.urls'

資料庫設定

DATABASES = {
  'default': {
      'ENGINE': 'django.db.backends.sqlite3',
      'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
  }
}
Django預設是使用sqlite3

語言和時區設定

預設是美國,因此可以將它改為台灣
LANGUAGE_CODE = 'zh-TW'
TIME_ZONE = 'Asia/Taipei'

參考資料

2015年5月6日 星期三

JavaSE8 Lambda 起手勢-簡單筆記


前言 

好像JDK9都快出來了現在才寫JDK8 orz
好吧其實也是之前寫的筆記一直沒放上來


正文
 
JDK8之前,如果你想排序,你可能會這麼做

String[] names = {"C333","A1","B22"};
Arrays.sort(names, new Comparator<String>() {
     public int compare(String name1, String name2) {
         return name1.length() - name2.length();
     }
});

for(String name:names) System.out.println(name);

Or

String[] names = {"C333","A1","B22"};
Comparator<String> comparator = new Comparator<String>() {
     @Override
     public int compare(String name1, String name2) {
         return name1.length() - name2.length();
     }
};

Arrays.sort(names,comparator);
for(String name:names) System.out.println(name);

這真的又臭又長對吧?
那麼讓我們看看Lambda

Comparator<String> comparator =(String name1,String name2)->name1.length()-name2.length();

Or

Comparator<String> comparator =(name1,name2)->name1.length()-name2.length();

所以你可以這麼更改它

String[] names = {"C333","A1","B22"};
Arrays.sort(names,(name1,name2)->name1.length()-name2.length());
for(String name:names) System.out.println(name);

恭喜!你學會使用它了
不過還有一件事
當你學到一些新東西時
你會無時無刻都使用它
因此你的程式可能充滿著滿滿的Lambda

來看看這個情境吧
public class comparator {
public int compare(String s1, String s2) {
         return s1.length() - s2.length();
}
}

public class main {
public static void main(String[] args) {
         String[] names = {"C333","A1","B22"};
         comparator c = new comparator();
         Arrays.sort(names,(name1,name2)->c.compare(name1,name2));
         for(String name:names) System.out.println(name);
}
}

這麼做很好的,但我們可以讓它更好

方法參照,這是配合Lambda新推出的功能
語法:class::method
所以我們可以這麼改

Arrays.sort(names,c::compare);
for(String name:names) System.out.println(name); 

補個重點: Lambda的語法Input -> body 


2015年4月22日 星期三

ubuntu忘記密碼的更改方法

超簡單der只要五個步驟

1. 重新開機進入grub選單(開機時按下esc鍵即可進入)
2. 進到Advanced option for ubuntu選項
3. 在recovery mode按下e鍵
4. 找到並將ro recovery nomodeset替換為rw single init=/bin/bash之後按下ctrl+x
5. 會進到有root權限的bash,再利用passwd root指令更改密碼即可

2015年4月18日 星期六

zsh介紹

會知道zsh其實是在軟體工程師的鄙視鏈這篇看到
那時候見識短淺的我根本不知道zsh是啥,於是稍微google了一下
結論zsh就是個shell
想說竟然站在鄙視鏈的頂端那一定不錯用,於是就去查了安裝方法
這裏介紹的是

Ubuntu和MacOSX的安裝
因為MacOSX就有內建zsh所以安裝過程就免了吧
Ubuntu需要下指令安裝
sudo apt-get install zsh

安裝完後要設定zsh為預設的shell
chsh -s /bin/zsh

接著安裝oh-my-zsh
MacOSX
 curl -L https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh | sh
Ubuntu
curl -L https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh | bash
oh-my-zsh是zsh的一個框架,內建許多實用設定、擴充元件、主題等等。

接著就是要幫zsh更換主題
主題樣式可參考:
https://github.com/robbyrussell/oh-my-zsh/wiki/themes
vim ~/.zshrc
找到ZSH_THEME="theme name"這行
把theme name改成想設的主題名稱就行了

整個zsh的安裝就大功告成了

不過真的用了zsh之後會有種回不去了的感覺,來講講我認為的zsh的優點 

  • 豐富的主題:話說換了zsh之後,使用terminal時被關注度整個大提升(於是就開始傳教XD) 
  • 超實用的tab鍵:不得不說tab鍵真的很好用,可以快速幫你補全指令甚至是目錄等等
  • 完全相容bash可以無痛轉手


更多詳細的比較可以看這篇:http://blog.jobbole.com/28829/
那麼今天就到此,我們下次見吧

2015年3月19日 星期四

Python note:lambda、filter、map、reduce

lambda:
匿名函數(wiki:匿名函式(英語:anonymous function)是指一類無需定義識別元(函式名)的函式或子程式,普遍存在於多種程式語言中。)
簡單來講就是將code當資料傳遞,且用完即丟
(ps: "()"代表可省略)
lambda ([函式名稱]) [傳入值] : [回傳]
example:
>>>lambda add x,y : x*y
>>>add(2,3)
5


filter:
過濾器,在眾多個元素中選出符合條件的元素
filter([條件] , [元素])
>>> filter(lambda x:x%3==1 , [1,2,3,4,5,6])
[1, 4]


map:
將運算套用在每個元素上,並傳回結果
map([運算] , [元素])
>>> map(lambda x:x*2, [0,1,2,3])
[0, 2, 4, 6]



reduce:
遍歷每個元素作運算,並傳回最終結果
reduce([運算] , [元素])
>>> reduce(lambda x,y : x*y,[1,2,3,4])
24


References:


Git新手實作教學(1)

#為什麼要叫新手呢?因為教的人是新手啊ヽ( ・∀・)ノ


Git安裝:
ubuntu直接下指令
apt-get -y install git-core git-doc git-gui gitk
其他的作業系統安裝請參考


Git設定:
輸入以下指令
git config --global user.name "YOUR NAME"
git config --global user.email "YOUR EMAIL ADDRESS"
上面兩個分別是設定username和email,這步驟一定要先作,要不然之後commit會出錯
設定完之後就可以開始使用了,一開始得先在你的專案下建立git的...
git init
這邊以ubuntu作業系統為例,首先在專案下建立一個README.md的檔案
vim README.md
輸入hello world後儲存離開
若不會使用vim者可以用記事本建立


Git查詢狀態:
git status
這個指令的用處是查詢目前檔案狀態,同時也會提示你下一步該怎麼做
這時候會出現以下訊息
Untracked files:
 (use "git add <file>..." to include in what will be committed)
意思是你還沒把新建的檔案加入容器中


Git添加、修改、刪除檔案:
可以使用
git add README.md
將README.md檔案加入git
這裡還有個更方便的快捷指令
git add .
意思是將所有新增或修改的檔案加入
任何的檔案經過新增或修改時,都必需要從新add
若要移除檔案也需要透過
git rm
來移除


Git提交:
當添加或修改完檔案時就可以將這次的動作提交並作紀錄
使用
git commit
會進到git內建的文字編輯器,在裡面輸入提交的訊息即可
但因為git內建的編輯器實在不怎麼好用,所以我習慣用快速指令
git commit -m ‘first commit’
這會直接提交單引號裡輸入的內容而不用透過編輯器
每一次的修改都需要經過git add和git commit來保存狀態,說實在還是有點麻煩
因此這裡有個快速指令
git commit -am 'commit text'
這相當於是使用
git add .
git commit -m ‘commit text’
兩個指令
但有個缺點就是,不適用新增的檔案
另外提交了話是要在有添增或修改或刪除時才可以提交


Git查詢commit:
指令
git log
git log HEAD^
可查看上一筆等同於以下指令
git log HEAD~1
git log HEAD~2
上面的指令可查看上上一筆,依此類推
更多git log的使用可參考

待續...

2015年3月18日 星期三

Python識別簡單的圖形驗證碼

其實以下內容主要都來自這篇 http://www.waitalone.cn/python-php-ocr.html 
但是原作者所用的開發環境是windows,身為Linux的愛好者當然要把他拿來Linux上玩玩
要使用這個套件首先需要安裝三個函式庫,分別為PIL、tesseract-ocr和pytesseract
很簡單的只要使用以下指令即可

sudo apt-get build-dep python-imaging
sudo apt-get install libjpeg8 libjpeg62-dev libfreetype6 libfreetype6-dev
sudo apt-get install tesseract-ocr
sudo easy_install pip
sudo pip install Pillow
sudo pip install pytesseract


安裝好後就可以開始寫code了,輸入以下

try:
    import pytesseract
    from PIL import Image
except ImportError:
    print "Error, Please install pytesseract and PIL"
    raise SystemExit
image = Image.open('captcha.png') #圖檔名稱
number = pytesseract.image_to_string(image)
print "The captcha is:%s" % number

若有顯示出名稱了話就代表成功辨識
於是就開始各種實驗了,試了以下圖片
print: The captcha is:231074
print: The captcha is:6K4L2
print: The captcha is:WMBHP
print: The captcha is:qub JD
print: The captcha is:
實驗結果:
看來成效不彰啊......( = A = |||
不過可以知道的是他支援可辨識的圖檔有.jpg .gif .png......其他還沒測試
那麼下次見吧 (´・ω・)

2015年3月12日 星期四

Eclipse Tomcat無法啟用解決辦法

最近在寫JSP的時候又遇到的一個問題
就是Tomcat無法開啟,他報錯的原因是因為8080 port被佔用了
可是明明昨天還好好的啊!
後來想到原來是早上在上課時老師要我們安裝其他協定
結果就把我的8080 port給占走了
後來把該協定停止運行後Tomcat還是開不起來
於是去查了之後發現可以用Docker模擬Tomcat環境解決問題
但是我現在急著就要測試我的專案啊!!!
於是就把課堂上安裝的協定移除(反正之後裝回來就好,而且又沒用到)
但Tomcat還是報同樣的錯誤,於是又開始爬文
最後找到了一個方法,照以下步驟

1. 關掉eclipse
2. 把Tomcat目錄底下的conf資料夾的內容全部複製到workspace/Servers/Tomcat v8.0 Server at localhost-config
3. 打開eclipse重新整理Servers資料夾
4. 開始Tomcat
5. 解決

這些步驟就是將Servers重新配置的方法
心得:看來要好好學習Docker了 (´・ω・)

Reference:
http://lucasterdev.altervista.org/wordpress/2012/05/12/could-not-load-the-tomcat-server-configuration-at-serverstomcat-v7-0-server-at-localhost-config-the-configuration-may-be-corrupt-or-incomplet/

2015年3月5日 星期四

Ubuntu下解決Google Chrome無法輸入中文

話說前幾天重灌Ubuntu的時候,安裝Chrome時
安裝完後發現我的Chrome竟然無法輸入中文!!!
但是在其他地方卻是可以使用中文的,因此確定是Chrome的問題後
重裝幾次、重開機幾次還是無法得到解決
後來爬文後發現是我的Chrome安裝錯誤
因為我的Chrome是32位元,但我電腦是64位元
因此把原先的Chrome移除後
在Terminal輸入以下代碼即可移除
sudo apt-get remove google-chrome-stable
接著重新安裝64位元問題得到解決

2015年2月24日 星期二

用Python爬的第一個網頁

利用Python爬最基本的網頁其實只用兩個步驟
  • 取得網頁內容
  • 解析他

而且從頭到尾只需要用到兩個類庫
(連結為API)

http://www.taiwanlottery.com.tw/news/DrawNumber.aspx 該網頁為例
其實就是取得樂透彩中獎號碼


其實整個實作的概念很簡單也基本,首先觀察一下案例網站的原始碼,找到我們要取出的內容,而我們要取出的內容就是那些樂透彩名稱、期號、中獎號碼,稍微觀察一下你會發現這些我們需要的內容都被<li>這個標籤給包圍,那麼現在我們要做的就是取得這標籤裡的內容物


開始來寫Code了


首先匯入urllib2,SGMLParser這兩個類庫
import urllib2
from sgmllib import SGMLParser


建立一個類來繼承SGMLParser
class Lottery(SGMLParser):
def __init__(self):
SGMLParser.__init__(self)
self.is_li = ""
self.name = []
def start_li(self, attrs):
self.is_li = 1
def end_li(self):
self.is_li = ""
def handle_data(self, text):
if self.is_li == 1:
self.name.append(text)

你會發現裡面的start_li、end_li、is_li的”li“就是我們要取得的標籤,也可以依照案例的不同而修改成其他的標籤,像是start_td、start_div等等
而name就是標籤裡的內容了


接著就是開始實作了,以下代碼為獲取整個網站內容
content = urllib2.urlopen('http://www.taiwanlottery.com.tw/news/DrawNumber.aspx').read()


開始解析內容
lottery = Lottery()
liottery.feed(content)
for i in liottery.name:
   i = i.replace(" ","")
   if '\n' not in i:
       print i


第一次執行會比較慢,只要沒馬上出現錯誤的結果都是好的
最終印出的結果如下

104
2
24
日獎號一覽表


大樂透


期別
104000021




本期中獎號碼
依大小順序排列:
28
39
41
46
48
09
39
28
03
48
41
49樂合彩


期別
104000021


本期中獎號碼
依大小順序排列:
28
39
41
46
48
39
28
03
48
41
4星彩


期別
104000047


本期中獎號碼
6
2
7
3星彩


期別
104000047


本期中獎號碼
2
3


今彩539


期別
104000047


本期中獎號碼
依大小順序排列:
12
14
23
27


14
23
12
11
39樂合彩


期別
104000047


本期中獎號碼
依大小順序排列:
12
14
23
27
14
23
12
11

References:
[Python] 超級基本的網頁抓取
http://rightthewaygeek.blogspot.tw/2013/09/python.html
Python写爬虫——抓取网页并解析HTML
http://www.lovelucy.info/python-crawl-pages.html