2015年4月29日 星期三

[教學] 建立 Python + django + MySQL 開發環境 for windows

由於接了一個用 django 開發的項目,所以簡單整理一下它開發環境設定方法:

軟體需求:

  1. Python for Windows
    (視乎版本需求,建議用32 bit 版本,因為小弟試用過64 bit 版本,會有不明的問題,所以放棄了) https://www.python.org/download/releases/2.7.6/
  2. pip (package manager for python)
    下載get-pip.py
    https://pip.pypa.io/en/latest/installing.html
  3. MySQL-python driver
    https://pypi.python.org/pypi/MySQL-python/1.2.5

安裝步驟:

  1. 安裝 python for windows
    image

    設定安裝目錄
    image
    image
  2. 設定好PATH 環境變數指向Python 根目錄
    image
  3. 安裝pip
    1. 開啟cmd (run as administrator),前往get-pip.py所在的目錄
       image
    2. 執行python get-pip.py
      image 
    3. 經過一輪下載後完成安裝
      image
  4. 安裝MySQL-Python Driver
    image
  5. 利用pip 安裝django
    1. 執行 python -m pip install django==1.2.6
      image
    2. 如預到以下這個問題,請按照這個網址修改Python 目錄下的Lib\mimetype.py
      http://bugs.python.org/review/9291/diff/1663/Lib/mimetypes.py
      image
    3. 經過一輪下載後安裝完成!
      image

2014年9月23日 星期二

[Shell Script] How to force user to run a shell script on login and force it on logout in UNIX

Sometime we only allow user to perform restricted action defined by the shell script and do not allow them to access normal command prompt, we can do this as follow:

1. Prepare the shell script (e.g. menu.sh)
2. Add the following in the .profile of the user
trap '' 1 2 3 15 # ignore all these signal (ctrl-c, etc)
SHELL=/bin/sh
export SHELL
menu.sh # the shell script you define to restrict user action
echo "MSG:: This is end of profile"    
exit # Exit when the shell script complete



notes:


- Make sure .profile have correct permission (accessible by user itself).






Evernote helps you remember everything and get organized effortlessly. Download Evernote.

2014年9月22日 星期一

[Shell Script] How to execute SQL script file using sqlplus in shell script

exit | ${ORACLE_HOME}/bin/sqlplus -L -S <user>/<password>@<connect identifier> @abc.sql

notes:
  1. config ORACLE_HOME 
  2. -L = Attempts to log on just once, instead of reprompting on error. If you don't turn this flag on the script will hang on error like wrong login, wrong connect identifier
  3. -S = silent mode, suppresses the sqlplus banner, prompt, etc
  4. Exit command is for automatically exit sqlplus after running the sql script file, or you can put an exit (or quit) statement at the end of the sql script.
Evernote helps you remember everything and get organized effortlessly. Download Evernote.

2014年9月17日 星期三

用 Decorator Pattern (裝飾者模式) 實作台式飲品店

參考書籍:
Head First Design Patterns (這是一本學Design Pattern 很好的書,漫畫形式,很易看易懂)
參考連結:
Wiki Decorator Pattern
神人對Decorator Pattern 的文章 (這篇文章好清楚,如果沒有書看這個也很簡單易明。)
簡單來說,如果有一些物件是同時有[相同特性]和[相似特性]時,就很適合用Decorator Pattern。
就舉台式飲品為例,各式台式飲品都有相同的特性,例如產品名稱、基本價格、等等。
也可以相似的特性,例如加各式配料,加珍珠、加仙草、等等
在這個例子,相同的特性就放在Component 去實現,相似特性就放到Decorator 去實現。
Component 的抽象類別,將相同的特性如產品名稱、基本價格都放在這裡:
package decorator.beverage;

public abstract class Beverage {
 
 String description = "Unknown Beverage";
 
 public String getDescription(){
  return description;
 }
 
 public abstract double cost();

}

Component 的實作,假設我們的小店只有奶茶和奶綠兩種飲品:
package decorator.beverage;

public class MilkTea extends Beverage {
 
 // override the abstract class description
 public MilkTea(){
  description = "Milk Tea";
 }
 
 // implement the abstract method
 public double cost() {
  return 1.99;
 }

}
package decorator.beverage;

public class MilkGreenTea extends Beverage {

 // override the abstract class description
 public MilkGreenTea(){
  description = "Milk GreenTea";
 }

 // implement the abstract method
 public double cost() {
  return 2.99;
 }

}

然後就是Decroator 的抽象類別:
package decorator.beverage.flavouring;

import decorator.beverage.Beverage;

public abstract class FlavouringDecorator extends Beverage {

 // Decorator should reimplement this to decorate the beverage
 public abstract String getDescription(); 

}

然後是Decorator 的實作,假設我們有三種Decorator,冰的、加珍珠、加仙草:
package decorator.beverage.flavouring;

import decorator.beverage.Beverage;

public class Iced extends FlavouringDecorator {

 Beverage drink;
 
 //Decorator must have the base beverage
 public Iced(Beverage drink){
  this.drink = drink;
 }
 
 // Decorate the description of the beverage
 public String getDescription() {
  return "Iced " + drink.getDescription();
 }

 // Add the cost of Jelly to the beverage
 public double cost() {
  return drink.cost() + 0.20;
 }

}
package decorator.beverage.flavouring;

import decorator.beverage.Beverage;

public class Pearl extends FlavouringDecorator {

 Beverage drink;
 
 //Decorator must have the base beverage
 public Pearl(Beverage drink){
  this.drink = drink;
 }
 
 // Decorate the description of the beverage
 public String getDescription() {
  return drink.getDescription() + ", with Pearl";
 }

 // Add the cost of pearl to the beverage
 public double cost() {
  return drink.cost() + 0.5;
 }

}
package decorator.beverage.flavouring;

import decorator.beverage.Beverage;

public class Jelly extends FlavouringDecorator {

 Beverage drink;
 
 //Decorator must have the base beverage
 public Jelly(Beverage drink){
  this.drink = drink;
 }
 
 // Decorate the description of the beverage
 public String getDescription() {
  return drink.getDescription() + ", with Jelly";
 }

 // Add the cost of Jelly to the beverage
 public double cost() {
  return drink.cost() + 0.70;
 }

}

最後就是我們的小店貢X開店了,我們點了三種飲品,分別是凍仙草奶茶、珍珠奶綠、凍珍珠奶茶......
package decorator;

import decorator.beverage.*;

public class GongTea {

 public static void main(String[] args) {
  
  //凍仙草奶茶
  Beverage beverage1 = new MilkTea();
  beverage1 = new Iced(beverage1);
  beverage1 = new Jelly(beverage1);
  System.out.println("Beverage1 is " + beverage1.getDescription() + ", price is $" + beverage1.cost());
  
  //珍珠奶綠
  Beverage beverage2 = new MilkGreenTea();
  beverage2 = new Pearl(beverage2);
  System.out.println("Beverage2 is " + beverage2.getDescription() + ", price is $" + beverage2.cost());
  
  //凍珍珠奶茶
  Beverage beverage3 = new MilkTea();
  beverage3 = new Iced(beverage3);
  beverage3 = new Pearl(beverage3);
  System.out.println("Beverage3 is " + beverage3.getDescription() + ", price is $" + beverage3.cost());
  
 }

}

運行的結果如下:
DecoratorTestingOutput

2014年8月29日 星期五

[Shell Script] How to take the content of a text file as the parameter of a shell script call

If you have record the pid of a application in a file named PID.pid, and you want to check if the process of the application still alive. You can try the following:
#!/bin/bash

if ps -p "$(< PID.pid)" > /dev/null 2>&1
then
     echo "Process is running......" >&2
     exit 1
else
    echo "Process is not running......" >&2
     exit 0
fi




Evernote helps you remember everything and get organized effortlessly. Download Evernote.

2013年4月24日 星期三

[教學] 快速建立Tomcat Development Environment + 簡單 jsp 示範

本筆記是為一些有Java 經驗的朋友所寫,方便他們快速由頭開始建立好Tomcat 的開發環境,所以不懂Java 的朋友這篇文章或許不識合你。
另外本筆記依據小弟開發經驗所記下,由於現在用的開發環境已經用了好一陣子,所以我沒有由頭每一個步驟驗證,中間或有錯漏,有錯請指正!
Software Requirment:
1. Java EE 6 SDK
http://www.oracle.com/technetwork/java/javaee/downloads/index.html
2. Tomcat 6.0
http://tomcat.apache.org/download-60.cgi
3. Eclipse IDE for Java EE Developers
http://www.eclipse.org/downloads/packages/eclipse-ide-java-ee-developers/junosr2
4. MySQL
主要是在本教學內的JSP 示範用,MySQL 的安裝教學我想不難在網絡上找到
5. MySQL JDBC Driver
http://dev.mysql.com/downloads/connector/j/
開發環境設定:
1. Setup Java EE (全部選 default setting 即可)
2. Unzip eclipse,打開eclipse.exe (Eclipse 是小弟常用的IDE,所以在本教學都會用eclipse 演示)
((VK8OBWHUELSO~I4NMNI~8

image
3. 先在Eclipse設定好一個Web Project 備用: Right click “Project Explorer”, 打開 New Project 選單,選擇 Dynamic Web Project ,做好一些簡單的設定
image
image
4. Eclipse 已經準備好了
image
5. 開始設定Tomcat: 打開Tomcat,先到conf folder 內,編輯tomcat-users.xml,這裡是tomcat manager 的使用者設定
2(M93ZC3(`E%J)E[[2YE]%X

6. 在lib folder 內放好JDBC Driver
WM6ESMYP89%P{Y9(N~T195A
7. 在<tomcat-users> 內插入以下使用者設定 (user=user1, password=welcome)

<role rolename="manager"/>
<role rolename="admin"/>
<user username="user1" password="welcome" roles="admin,manager"/> 

PB2`A2`0V4Y[4I)7RY8AXJF
8. 在tomcat 的bin folder 內,執行setclasspath.bat,最後執行startup.bat,你就會看到tomcat 在啓動了
image
 
9. 打開localhost:8080,看見老虎頭像就大功告成了
image

10. 現在假設MySQL 已經在本機安裝好,並有以下一個簡單的Database tutorial,裡面有一個Table tbl_tutorial,內容如下
image

11. 在Eclipse 的web project 裡,打開WebContent folder,然後新增一個jsp file (right click WebContent, New > JSP File)
image

12. 編輯JSP

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@ page import ="java.sql.*" %>
<%@ page import ="javax.sql.*" %>
<%@ page import ="java.util.*" %>
<%@ page import ="java.lang.Number" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body> 
<% 

Class.forName("com.mysql.jdbc.Driver");
java.sql.Connection con = DriverManager.getConnection("jdbc:mysql://<DB host>:<DB port>/tutorial","<DB user>","<DB password>");
Statement st= con.createStatement(); 

String sql = "SELECT name FROM tbl_tutorial;";
ResultSet rs=st.executeQuery(sql); 

while (rs.next()){
    out.println("Hello world! " + rs.getString(1) + "<br/>");
} 

%> 

</body>
</html>










13. 將完成好的web app 打包成war 檔案:right click web project, Export > WAR file
image

image
14. 登入Tomcat Manager (用step 7 的設定)
image
image

15. Deploy 剛剛 export 出來的WAR file
]{7301[DVOM0Z}D8_8(UDFV
M}U$OMPIEOL_M1V0S9`NHND

16. 打開http://localhost:8080/Tutorial/testing.jsp 你就會看到結果了!
image

17. 最後簡單介紹一下剛deploy 的web app 的folder structure

Depoly 後在webapps 底下就會自動生成一個project 名的folder
image

對應Eclipse 內WebContent folder 內的所有檔案都會被搬到這裡
image

WEB-INF folder 內主要放complie 好的java class,如果將來要寫servlet ,class file 就會被搬到 classes folder 內
而lib 則是用來放這個web app 專用的library
image










2013年4月10日 星期三

用SQL Developer 連接到 MySQL 的方法

在Tools > Preference > Database > Third Party JDBC Driver 加入MySQL 的JDBC 就可以正常連上MySQL了

SQL Developer - Preference

How to access parent window element from an iframe with jQuery

Parent window:

<html>
<input type=”text” id=”target” value=”hello”>
<iframe src=”iframeForm.html” width=”400″ height=”400″>
</html>

iframe:

<script type="text/javascript">
parent.top.$(‘input#target’).val();
</script>

2012年5月23日 星期三

How to detect (and execute macro) the value change in specific cell in Excel


Private Sub Worksheet_Change(ByVal Target As Range)
     If Not Intersect(Target, Sheets("Sheet1").Range("Your range")) Is Nothing Then
          Application.EnableEvents = False
          'Do something here
          Application.EnableEvents = True
     End If
End Sub

2011年8月10日 星期三

用iPhone 做 GPS Logger 及 Geotag 相片

上星期和朋友挑戰體能極限,由東涌騎單車入廸欣湖。因為路程不是傳統的單車徑,也沒有指示牌,所以忽發奇想,想寫一篇攻略,方便想挑戰這條路的大小朋友。
IMG_2118
為了完成這個偉大,找來了一個不錯用的iPhone app,叫做 Geotag Photo Pro。
官方網址:http://www.geotagphotos.net/en/
AppStore 網址:http://itunes.apple.com/us/app/geotag-photos-pro/id355503746?mt=8
GPS Logging
要做GPS Log 的做法十分簡單,首先從AppStore 買下這個app,然後把它打開,以下是它的主畫面:
IMG_2157
第一次先用按New trip,然後輸入一個行程名稱。
IMG_2158
完成後返回主畫面,你可以先進入Autolog選項
image
在這裡你可以選擇每隔多少分鐘記下GPS位置,上次騎單車我選了兩分鐘,但發現騎單車有時騎得快,結果記下來的不太準確。但注意如果調得太密,電量消耗會很大。(給大家作參考,我用的是3GS,再外接一顆MiPOW Power Tube 2200,有2200mAh 的後備電量,由早上十一時多到晚上八時多都沒大問題。)
IMG_2159
再進入第二項 Settings & Upload
image

這裡有很多不同的設定,先看看Accuracy settings
IMG_2160
第一項設定的也不知道,如果有朋友知道的請告訴我。第二項設定比較有用,預設它只會用GPS作為記錄的訊號,但如果身處室內,我建議還是設定為GPS+GSM,那定位會比較準確。
IMG_2169
Notifications、Advanced Settings 和 Setup time on camera, 只是一些基本設定,這裡就略過不提了。Upload logged data 只是將你的GPS LOG 上載到官網那裡做Geotag,但由於官網有提供免費的offline Geotag 工具,所以這個選項也略過不提。
所有設定都完成了,那可以開始記錄行程了!先回主畫面,然後按REC ,那麼旅程就會開始記錄了。緊記旅程完結後也要停止記錄,不然你把你回家的路程也記錄了。
image
Geotagg 相片
要Geotag 相片,方法也很簡單,首是先進入 Settings & Upload ,然後進入 Link with Geotagphotos.net ,點選這裡會帶你到官網申請賬戶。
申請賬戶後,到官網,點選右上角的Geotag your photos now,然後登入賬戶。
image
登入後在右手面你會發現一個Geotag 工具的offline version,先下載它。
image
這個軟體是一個JAVA 程式 (runGeotagPhotosOffline.jnlp),所以你必需先安裝JAVA,如沒有裝請到這裡安裝:http://www.java.com/zh_TW/
安裝JAVA 後,打開軟體,它會問你要兩個東西:
1. GPX file
2. 要做Geotag 的相片所存放的位置
image
第二點對大家沒有難度,那第一點要如何那到GPX file 呢?方法也很簡單,先進入APP,然後選擇先前記錄好的LOG。
image
進入這個畫面後,選擇想滙出行程 (按右手面的藍色箭咀)。
image
然後選 Export to Email ,之後到自己的電郵下載GPX 檔。
image
下在完成後,在 Geotag 軟體選好剛下載的GPX 檔,然後等軟體載入相片,然後按下 Geotagging ,軟體就會為你每張上片加入位置資訊。
image
待所有相片處理完成後,你用一些支援定位的看圖軟件如 Picasa 打開相片,你就會看到相片的定位了!
謝謝收看!