2013年11月4日 星期一

[Python] Eclipse上的Django安裝筆記

Django是一套用Python寫出來的Web應用框架,採用了MVC模式。這是我在新工作一開始馬上就接觸到的平台,第一天裝了半天搞不定,最後還是蘇老師裝一次給我看才搞定,結果我用家裡的電腦沒辦法完整安裝完成,因為詳細流程我也來不及做筆記下來,就這樣工作三天我也回家試了三天,看網路上的文件也一直不成功,終於在今天下班回家安裝成功,雖然跟蘇老師的安裝方式有點不太一樣,不過也是成功了,就在此紀錄當備忘,也讓以後有需要的人可以參考,因為我好像還沒看過Django在Windows底下完整的中文安裝說明,大部分都是Unix like的環境。
  1. 既然是Python的平台,當然要有Python才能執行,中文的Python安裝網頁有很多,可以參照其他網頁,在此不詳述。
  2. 正確安裝好Python之後,到Django網站下載Django的安裝檔Django-1.5.5.tar.gz。下載完成後用解壓縮軟體解壓縮,裡面會有個Django-1.5.5的資料夾。之後在開始輸入「cmd」開啟命令提示字元。進去之後目錄cd切換到所在的資料夾,並輸入「python setup.py install」並執行。接著setup.py這個Python的檔案便會執行,自動下載所需要的檔案安裝到Python的資料夾中。
  3. 本來你安裝Python的時候path設定是「C:\Python27\;C:\Python27\Tools\Scripts;」,裝完Django後請改成「C:\Python27\;C:\Python27\Scripts;」
  4. 在此我是用Eclipse做為開發Django的IDE。開啟Eclipse選擇「Windows→preferences→PyDev→Editor→Interpreter - Python」,先「remove」之前import的library,在用「Auto Config」自動讓他重抓,或是你要用「New」來指定Python執行的路徑也行。這個步驟是買個保險,避免有library沒抓到而出現的靈異現象。
  5. 抓完library路徑之後,就可建立Django的專案資料夾。選擇「File→Other→PyDev Django Project」。接下來輸入你的project的名稱繼續下一步下一步到底。註︰如果打完project name之後,上面沒有錯誤訊息而且「Next」還是disable的狀態,那表示你在開這個Django project之前沒有先開一個Python的project,依照蘇老師的說法應該是不用先開Python project再開Django project,但我就是兩台電腦都遇到一樣情況,所以有遇到的人就請先開一個Python project再開Django project試試看。如果你按下「Next」,結果出現「Django not found」的訊息,那表示你的Django沒有安裝好,請再重裝一次吧,我之前也是在這個地方鬼打牆很久。
  6.  接下來選擇你的Django版本跟資料庫類型,之後Finish。
  7.  專案建好之後對專案資料夾按右鍵→Run As→1 PyDev: Django,來啟動Django。
  8. 成功啟動後會看到Console會有下列訊息。
  9. 之後在網址列輸入http://127.0.0.1:8000/,如果有看到「It worked!」就算是啟動成功了。
  10. 其餘的安裝資料可以參考官方安裝文件。如果有人依照上面方式安裝失敗,那麼可以試試安裝pip看看,因為我也是試了很多方式,所以裡面有些步驟不保證一定沒有疏漏,也許是我剛好之前亂槍打鳥安裝了某的東西,在加上用上述的方式才剛好成功。

2013年10月20日 星期日

[Java]連結資料庫查詢表單-使用XAMPP底下的MySQL


下午閒來無事試試看本來拿來寫PHP的XAMPP底下的MySQL來當練習資料庫存取的對象

使用JDBC可能會有ClassNotFoundException跟SQLException

看你要catch還是throws在這邊是選擇thorws的方式

Class.forName表示你要載入的JDBC驅動

在這因為是用MySQL所以是com.mysql.jdbc.Driver

url、user、password這三個字串分別紀錄資料庫路徑還有登入的帳號密碼

其中讓我搞很久的是資料庫路徑的部份

本來我以為是用我在網頁上看到的//localhost/phpmyadmin/路徑

目標是存取student資料庫底下的students資料表

但一直出現資料表不存在

我也疑惑說「奇怪他是在哪裡選擇資料庫名稱的?」

後來才發現原來他的路徑就包含了你要選取的資料表名稱

所以應該是//localhost/student才代表這台本機的MySql底下的student資料庫

try (Connection conn = DriverManager.getConnection(url, user, password))

這段是Java7新增的功能

本來的你資料庫開啟後需要用close()來關閉連線

但在Java7簡化了這個步驟直接寫到try裡面

執行完之後就會自動幫你close

Connection是資料庫連線的代表物件

可以在DriverManager.getConnection物件生成的時候輸入三個建構參數登入MySQL

conn.isClosed()則是用來判斷資料庫的狀態是否關閉

conn.createStatement()回傳一個Statement的物件來讓你可以輸入SQL語法

在此以用SELECT撈出資料我要的資料

stmt.executeQuery()會回傳查詢結果也就是ResultSet物件

ResultSet底下的next()會依序走訪ResultSet物件裡面每一列資料直到回傳false

在此假設我要印出資料庫欄位cID=7的那列資料

所以用if判斷getInt("cID")這欄是否為7

getInt()也可以傳入數字代表第幾欄的資料(注意!是從1開始算起)

也有getString()、getDouble()等方式讀取欄位資料

有興趣的人可以到java.sql.ResultSet這個interface底下查有哪些讀取的方法


import java.sql.*;

public class JDBC {
public static void main(String[] args) throws ClassNotFoundException,
SQLException {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost/student";
String user = "root";
String password = "1111";

try (Connection conn = DriverManager.getConnection(url, user, password)) {
System.out.printf("資料庫已%s%n", conn.isClosed() ? "關閉" : "開啟");
Statement stmt = conn.createStatement();
ResultSet result = stmt.executeQuery("SELECT * FROM students");
while (result.next()) {
if (result.getInt("cID") == 7) {
System.out.printf("cID=%d\n", result.getInt(1));
System.out.printf("cName=%s\n", result.getString(2));
System.out.printf("cSex=%s\n", result.getString(3));
System.out.printf("cBirthday=%s\n", result.getString(4));
System.out.printf("cEmail=%s\n", result.getString(5));
System.out.printf("cPhone=%s\n", result.getString(6));
System.out.printf("cAddr=%s\n", result.getString(7));
}
}
}
}
}



最後結果如下

2013年10月18日 星期五

[Java]大樂透程式-使用Set

昨天去面試的時候有考到一題,請你寫出大樂透的程式
因為寫的太慢才寫到前面面試的人就進來了
後來他看了我的code覺得用for迴圈不好啦~吧啦吧啦
以效率的觀點來看用for迴圈的確不太好
我想到的方法,亂數產生數字存到陣列前還得去檢查是否有重複的數字
這又要一個迴圈去檢查是否重複,複雜度可能會是O(n^2)
後來回來想到其實數字不重複的特性不就是Set嗎?
所以就寫了下面的程式 我利用Set擁有相同元素不收集的特性
在lottery class中重新定義equals()跟hashCode()
因為Java要判斷物件是否重複,常會用到hashCode()跟equals()
規格書中也建議兩個方法必需要同時實做(來源:JavaSE7技術手冊)
所以在此hashCode我就直接return接收到的變數當作HashCode
如果數字一樣就代表這是個重複的元素不予收集
equals()判斷obj是否為null跟getClass的內容是否一樣
程式本體的部份while只需判斷lotteryNumber的size()是否有小於6就好
原因很簡單,只要小於6就代表Set收集到的obj未滿6個
只要size()的內容等於6就表示這個hashSet的物件裡面的存的物件一定是不重複的
最後當你呼叫toString的時候他就會一一回傳重新定義過的toString內容並印出數字

import java.util.HashSet; import java.util.Random; import java.util.Set; class lottery { private String number; public lottery(String number) { this.number = number; } public boolean equals(Object obj) { if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } return true; } public int hashCode() { return Integer.valueOf(number); } public String toString() { return number; } } public class test { public static void main(String[] args) { Random random = new Random(); Set lotteryNumber = new HashSet(); while (lotteryNumber.size() < 6) { lotteryNumber.add(new lottery( Integer.toString(random.nextInt(49) + 1))); } System.out.println(lotteryNumber); } }