Tuesday, October 12, 2010

太極與物件導向

今天看曾仕強教授所出的《易經的奧祕》時,看到一句話"《老子、四十二章》說:「道」生一,一生二,二生三,三生萬物。",這句話讓我有所感悟,因為這跟Java物件導向的設計很像,因為所有的物件都是繼承Object這個物件而來,由Object可以產生無限個物件。

而太極有陰陽,正如同程式設計中所有的基本概念也是如此,如if, for, while, try catch, switch等都有這個概念,甚至物件導向的多載也是。而且每個都是陰陽不可分的,有人會說"我可以只寫if不寫else啊!",但實際上就算不寫else你一樣在做else的事,也就是do nothing,只是你有沒有將他寫出來而已。因為程式設計的概念會將所有的東西轉換成兩個狀態去運行,即便你是用"if, else if",在他的最小的狀態也就是只有兩個狀態,這跟電腦最初的設計原理有關。而這兩個狀態並不是單純的"0,1"狀態,而是兩個狀態同為一體的,因為誰也不能單獨存在,如果單獨存在,那設計出來的程式就只有一直0而沒有1,或是一直1沒有0了。而這兩個狀態是在有資源時會同時存在,同時運轉,只是在設計上我們需要對狀態做"切片",看看現狀是如何。

Wednesday, September 15, 2010

Java檔案套件使用

預設檔案配置(在Windows環境)

(myProject)
|
|--(source)
| |
| |--(com)
| |
| |--(coffee)
| |
| |--bowCoffee.java
| |--products.java
|
|--(classes)
|
|--(com)
|
|--(coffee)
|
|--bowCoffee.class
|--products.class


兩個檔案都是屬於com.coffee這個套件中
bowCoffee.java

package com.coffee;
public class bowCoffee{
void bow(String str){
System.out.println(str + " is bowing!");
}
}


products.java

package com.coffee;
import com.coffee.bowCoffee;
public class products{
public static void main(String[] args){
bowCoffee bc = new bowCoffee();
bc.bow("Blue Mountain coffee bean");
}
}


在編譯的時候在 C:\JavaProject\MyProject 下執行
-d classes 會將編譯好的.class依照他的套件目錄存放在classes資料夾中

javac -d classes source\com\coffee\bowCoffee.java
javac -d classes source\com\coffee\products.java

在執行products.java編譯時會出現以下錯誤,
因為products.java無法找到com.coffee.bowCoffee

source\com\coffee\products.java:2: cannot find symbol
symbol : class bowCoffee
location: package com.coffee
import com.coffee.bowCoffee;
^
source\com\coffee\products.java:5: cannot find symbol
symbol : class bowCoffee
location: class com.coffee.products
bowCoffee bc = new bowCoffee();
^
source\com\coffee\products.java:5: cannot find symbol
symbol : class bowCoffee
location: class com.coffee.products
bowCoffee bc = new bowCoffee();
^
3 errors

所以products.java要改以-cp(-classpath)的方式執行

javac -d classes -cp classes source\com\coffee\products.java


要用package路徑方可執行。

java -cp classes com.coffee.products


若在classes資料夾中則不需要在加-cp classes便可以執行。

備註:
現在開發JAVA的相關IDE都很放便,由其是在版本與套件管理上,
若想單純使用編譯器來開發大型程式,那-d與-cp(-classpath)的使用就相當重要了。

Tuesday, September 14, 2010

在Ubuntu上安裝eclipse

首先要先確定自己的環境,因為Ubuntu上預設安裝的是OpenJava,
所以要先安裝SUN JAVA並將其配置好。
至於安裝的部份可以參考我上一篇
Ubuntu上安裝SUN-JAVA6 + Apache Tomcat

配置Sun版本的Java,選擇現在要使用的版本。
$ sudo update-alternatives --config java

安裝eclipse,將其安裝在你想要的地方,我同常是放在/usr/local底下
$ sudo tar xzf eclipse-java-helios-linux-gtk.tar.gz
$ sudo chmod -R +r eclipse

建立一個eclipse執行文件
$ sudo touch /usr/bin/eclipse
$ sudo chmod 755 /usr/bin/eclipse
$ sudo gedit /usr/bin/eclipse

#!/bin/sh
export ECLIPSE_HOME="/usr/local/eclipse"

$ECLIPSE_HOME/eclipse $*


建立應用程式選單
$ sudo gedit /usr/share/applications/eclipse.desktop

[Desktop Entry]
Encoding=UTF-8
Name=Eclipse
Comment=Eclipse IDE
Exec=/usr/local/eclipse/eclipse
Icon=/usr/local/eclipse/icon.xpm
Terminal=false
Type=Application
Categories=GNOME;Application;Development;
StartupNotify=true


在第一次使用eclipse時,先執行以下指令
/usr/local/eclipse/eclipse -clean

現在你可以透過應用程式MENU來開啟eclipse了。

參考資料:
http://flurdy.com/docs/eclipse/install.html

Monday, September 13, 2010

Ubuntu上安裝SUN-JAVA6 + Apache Tomcat

第一次使用Ubuntu,現在正在測試軟體安裝的狀況。
不過發現起初要安裝SUN-JAVA6時確無法使用aptitude找到相關套件,
後來拜了一下Google後發現,原來是有apt server沒有更新到。
$ sudo gedit /etc/apt/sources.list

把這兩行前面的#拿掉
deb http://archive.canonical.com/ubuntu lucid partner
deb-src http://archive.canonical.com/ubuntu lucid partner

在進行搜尋
$ sudo aptitude search SUN-JAVA6
終於找到了

因為要執行Apache-Tomcat
所以就先安裝SUN-JAVA6-bin SUN-JAVA6-jre SUN-JAVA6-jdk
$ sudo aptitude install SUN-JAVA6-bin SUN-JAVA6-jre SUN-JAVA6-jdk

再來是安裝Apache Tomcat,先去下載
$ wget http://ftp.twaren.net/Unix/Web/apache//tomcat/tomcat-6/v6.0.29/bin/apache-tomcat-6.0.29.tar.gz

安裝到/usr/local下
$ sudo mkdir /usr/local/tomcat
$ sudo mv apache-tomcat-6.0.29.tar.gz /usr/local/tomcat/
$ sudo tar -zxvf apache-tomcat-6.0.29.tar.gz

tomcat環境設定
$ sudo gedit ~/.bashrc
增加JAVA_HOME位置
export JAVA_HOME=/usr/lib/jvm/java-6-sun

建立tomcat的auto-start and shutdown檔
$ sudo gedit /etc/init.d/tomcat

# Tomcat auto-start
#
# description: Auto-starts tomcat
# processname: tomcat
# pidfile: /var/run/tomcat.pid

export JAVA_HOME=/usr/lib/jvm/java-6-sun

case $1 in
start)
sh /usr/local/tomcat/bin/startup.sh
;;
stop)
sh /usr/local/tomcat/bin/shutdown.sh
;;
restart)
sh /usr/local/tomcat/bin/shutdown.sh
sh /usr/local/tomcat/bin/startup.sh
;;
esac
exit 0

其中tomcat是你的資料夾位置,以此次安裝來說要改成tomcat/apache-tomcat-6.0.29


改變tomcat資料夾權限
$ sudo chmod 755 /etc/init.d/tomcat

建立啟動連結
$ sudo ln -s /etc/init.d/tomcat /etc/rc1.d/K99tomcat
$ sudo ln -s /etc/init.d/tomcat /etc/rc2.d/S99tomcat

現在只要重開電腦,他就會自動登入啦!

參考資料:
http://www.howtogeek.com/howto/linux/installing-tomcat-6-on-ubuntu/

Saturday, September 11, 2010

Windows7對vista的檔案分享與印表機分享

兩台電腦在同一個區域網路內,網路架構如下
寄件者 windows7_vista_share


網路分享設定步驟
Windows7上的設定
開始\控制台
寄件者 windows7_vista_share


控制台\系統及安全性
寄件者 windows7_vista_share


控制台\系統及安全性\系統
設定工作群組
寄件者 windows7_vista_share

寄件者 windows7_vista_share

寄件者 windows7_vista_share

重新啟動電腦

控制台\網路和網際網路
寄件者 windows7_vista_share


控制台\網路和網際網路\網路和共用中心
寄件者 windows7_vista_share

選擇關閉密碼保護共用
寄件者 windows7_vista_share


控制台\網路和網際網路\網路和共用中心\進階共用設定
家用或公用場所(目前設定檔)
寄件者 windows7_vista_share


Vista上的設定
開始\控制台
寄件者 windows7_vista_share


控制台\系統及維護
寄件者 windows7_vista_share


控制台\系統及維護\系統
使用相同的工作群組
寄件者 windows7_vista_share

重新啟動電腦

控制台\
寄件者 windows7_vista_share


控制台\網路和網際網路
寄件者 windows7_vista_share


控制台\網路和網際網路\網路和共用中心
關閉以密碼保護的共用,將要分享的功能打開
寄件者 windows7_vista_share


檔案分享
分享Windows7上的檔案
寄件者 windows7_vista_share

寄件者 windows7_vista_share

電腦當中的網路選項可以找到windows7電腦
寄件者 windows7_vista_share

寄件者 windows7_vista_share


印表機分享
分享配置在Windows7上的印表機
寄件者 windows7_vista_share


控制台\硬體和音效\裝置和印表機
選擇要分享的印表機,按右鍵選擇"印表機內容"
寄件者 windows7_vista_share


共用設定與其他驅動程式設定
寄件者 windows7_vista_share


其他驅動程式設定,選擇共享的驅動程式類型(x86就是32位元版; x64為64位元版)
寄件者 windows7_vista_share


Vista上的設定
控制台\硬體和音效\印表機
新增印表機
寄件者 windows7_vista_share


寄件者 windows7_vista_share


若沒有自動偵測到,可使用第二個紅圈選項
寄件者 windows7_vista_share


依名稱選取功用應表機,可用瀏覽的方式新增
寄件者 windows7_vista_share


最後,安裝驅動程式,完成分享。
寄件者 windows7_vista_share



以上方式,僅適合虛擬區域網路內,或是防火牆或閘道器內的網路。

Thursday, August 26, 2010

Java Applet測試



因為Blogger好像不支援外來連接的applet,
所以只能用iframe插入文章中。

Thursday, August 19, 2010

在Chrome中使用ScribeFire來發表文章

這是我第一次在Chrome中使用ScribeFire(以下簡稱SF)來發表文章,感覺很特別。


SF有Blogger登入功能,所以可以很方便存取Blogger中的文章。



SF亦可以編寫新舊文章(舊文章會自Blogger中讀入)。



SF的編文方式是採用Rich Text的方式,與Blogger中的邊文方式大同小異,也可使用HTML Mode,但是不支援圖片上載。



Categories也會將舊有的標籤讀入,亦可加入新的標籤,但是無法同時使用兩個舊有標籤,需要用New Category的方式加入,不是很方便。



最後是可以選擇Publish與Draft。



完整的功能頁





------使用心得------
對於發文量很大的使用者來說,這個套件相當好用,但對於只擁有少數Blogger的人來說,
就沒有什麼大的差別了。
而且雖然這個套件很多人使用,但誰也不敢擔保他會不會洩漏個資(帳號密碼)啊!

Wednesday, August 18, 2010

Java enum的使用範例


enum Today{
Mon(1), Tue(2), Wed(3), Thu(4), Fri(5), Sat(6), Sun(7);
Today(int d){
this.day=d;
}
private int day;
public int getDay(){
return day;
}
}
class Test{
public static void main(String[] args){
Today t = Today.Tue;
switch(t.getDay()){
case 1: System.out.println("Today is Monday."); break;
case 2: System.out.println("Today is Tuesday."); break;
case 3: System.out.println("Today is Wednesday."); break;
case 4: System.out.println("Today is Thursday."); break;
case 5: System.out.println("Today is Friday."); break;
case 6: System.out.println("Today is Saturday."); break;
case 7: System.out.println("Today is Sunday."); break;
default: break;
}
}
}

結果:
java Test
Today is Tuesday.

Friday, August 06, 2010

Wednesday, August 04, 2010

Java基本資料範圍


public class DataRange {
public static void main(String[] args) {
System.out.println("byte range: " + Byte.MAX_VALUE + " ~ " + Byte.MIN_VALUE);
System.out.println("short range: " + Short.MAX_VALUE + " ~ " + Short.MIN_VALUE);
System.out.println("int range: " + Integer.MAX_VALUE + " ~ " + Integer.MIN_VALUE);
System.out.println("long range: " + Long.MAX_VALUE + " ~ " + Long.MIN_VALUE);
System.out.println("float range: " + Float.MAX_VALUE + " ~ " + Float.MIN_VALUE);
System.out.println("double range: " + Double.MAX_VALUE + " ~ " + Double.MIN_VALUE);
}
}



C:\Java\exam>javac DataRange.java

C:\Java\exam>java DataRange
byte range: 127 ~ -128
short range: 32767 ~ -32768
int range: 2147483647 ~ -2147483648
long range: 9223372036854775807 ~ -9223372036854
float range: 3.4028235E38 ~ 1.4E-45
double range: 1.7976931348623157E308 ~ 4.9E-324


byte使用8位元; short使用16位元; int使用32位元; long使用64位元
float使用32位元; double使用64位元
char使用16位元;

左邊的部分都可以指定(assignment)給右邊的型別:
byte --> short --> int --> long --> float --> double

window 自動關機設置

用在xp/vista可以自動關機
只要在Command Prompt
打進 shutdown.exe -s -t 60(60就是1分鐘-3600就是一小時)
-s(是關機)
-t (是時間)
-a (是取消)
-r (是重新啟動)

電腦就會自動的關機啦
這個工能的好處是當你要出門時又怕電腦開太久還
就可以用來關機
時間可以自己設置

Friday, July 23, 2010

Array Length

寫程式常常會需要用到陣列長度,以下列出幾種方法:

C

int a[3]={1,2,3};
int arrLength=(sizeof(a)/sizeof(*a));
printf("%d", arrLength);

結果:3

C++

template
int GetArrLength(T(&)[size]){return size;}
int main()
{
int a[]={1,2,3};
int arrLength = GetArrLength(arr);
printf("%d", arrLength);
getchar();
return 0;
}

結果:3

Java

int a[]=new int[3];
System.out.println(a.length);

結果:3

參考資料:
C Array length function problem
C++ Tip: How To Get Array Length

Sunday, July 18, 2010

Java名詞解釋

literal 是數字與文字的總稱。Java 中的各種資料型態,包括字元、字串、數值、常數時,皆通稱literal。

Java識別字的習慣命名原則

Tuesday, April 13, 2010

[C\C++]:printf(), scanf();


printf("格式字串", 項目1, 項目2, ...);

使用範例:

#include
int main(){
int c=11;
printf("(%5d)10\n",c);
printf("(%5o)8\n",c);
printf("(%5x)16\n",c);
getch();
return 0;
}

執行結果:

( 11)10
( 13)8
( b)16


printf()函數常用的格式碼:

格式碼 說明
%c 字元
%% 印出百分比號
%d 十進位整數
%ld 長整數
%e 浮點數,指數e型式
%f 浮點數,小數點型式
%u 無號十進位整數
%o 無號八進位整數
%x 無號十進位整數

printf()函數常用的跳脫序列

跳脫序列 功能
\a 警告音
\b 倒退
\n 換行
\r 歸位
\t 跳格
\' 印出單引號
\" 印出雙引號
\\ 印出反斜線
\/ 印出斜線



scanf("格式字串", &變數1, &變數2, …);

使用範例:

#include
int main(){
int c;
scanf("%d", &c);
printf("(%5d)10\n",c);
getch();
return 0;
}

執行結果:

12
( 12)10

scanf()函數常用的輸入格式碼:

格式碼 說明
%c 字元
%d 十進位整數
%lf 倍精度浮點數
%f 浮點數,小數點型式
%u 無號十進位整數
%o 無號八進位整數
%x 無號十進位整數

SyntaxHighlighter教學

如果要在網頁上放程式碼,最麻煩的是會被blogger的網站將辨識錯誤成HTML,
所以利用SyntaxHighlighter就可以很方便的使用了。
網站:
http://alexgorbatchev.com/wiki/SyntaxHighlighter

SyntaxHighlighter是利用JavaScript所寫成的,所以很適合使用在Blogger中。

一下是設定步驟
步驟一:
可以選擇到官網下載最新的程式碼,或是使用官網的網頁版
兩者有好有壞,前者相較於後者是,除非你擺放程式碼的網路位置連線太慢,要不然前者的連線速度會較快,因為後者會因為太多人使用,造成速度變慢。而後者的好處是方便操作,不需要額外的空間擺放這些程式碼。

若使用前者,則先將裡面的"Scripts"與"styles"內的所有檔案,都上傳至你的網頁空間中。

步驟二:
以使用Blogger為例,到"版面配置/修改HTML/"將以下程式碼貼在"body"之間



步驟三:
可參照以下的範例操作。


#include
int main(){
printf("Hello!");
getch();
return 0;}


說明-
brush:<使用的語言>; gutter:<是否要行號(true|false)>; smart-tabs:gutter:<是否使用tab(true|false)>; table-size:

brush:
可使用的語言有
















































Brush name
Brush aliases
File name
ActionScript3
as3, actionscript3
shBrushAS3.js
Bash/shell
bash, shell
shBrushBash.js
ColdFusion
cf, coldfusion
shBrushColdFusion.js
C#
c-sharp, csharp
shBrushCSharp.js
C++
cpp, c
shBrushCpp.js
CSS
css
shBrushCss.js
Delphi
delphi, pas, pascal
shBrushDelphi.js
Diff
diff, patch
shBrushDiff.js
Erlang
erl, erlang
shBrushErlang.js
Groovy
groovy
shBrushGroovy.js
JavaScript
js, jscript, javascript
shBrushJScript.js
Java
java
shBrushJava.js
JavaFX
jfx, javafx
shBrushJavaFX.js
Perl
perl, pl
shBrushPerl.js
PHP
php
shBrushPhp.js
Plain Text
plain, text
shBrushPlain.js
PowerShell
ps, powershell
shBrushPowerShell.js
Python
py, python
shBrushPython.js
Ruby
rails, ror, ruby
shBrushRuby.js
Scala
scala
shBrushScala.js
SQL
sql
shBrushSql.js
Visual Basic
vb, vbnet
shBrushVb.js
XML
xml, xhtml, xslt, html, xhtml
shBrushXml.js


參考文章:
http://www.inote.tw/2009/02/blogger.html

Thursday, April 08, 2010

[Java]jdk-6u19-windows-i586環境參數設定

因為安裝位置預設在
C:\Program Files\
所以在環境參數中要新增一個變數名稱PATH
變數值為

;C:\Program Files\Java\jdk1.6.0_19\bin

若已經有一個變數PATH,那就直接加在變數值後面即可。
再新增一個變數名稱CLASSPATH
變數值為

.;C:\Program Files\Java\jdk1.6.0_19\lib;C:\Program Files\Java\jdk1.6.0_19\lib\tools.jar;

如果要測試有沒有設定成功
到執行命令列打cmd
執行javac
如果可以看到javac的使用參數說明的話,那代表你成功設定好環境參數了!

Saturday, February 27, 2010

費氏數列(Fibonacci Number)

讀資料結構,有時候會突然撞牆,每每已了解的知識,太久不用就會忘掉!
費氏數列(Fibonacci Number)是種很有趣的數列,
他的規則如下:








所以大致排列方式為

+-----+---+---+---+---+---+---+---+--------+
| n | 0 | 1 | 2 | 3 | 4 | 5 | 6 | ...... |
+-----+---+---+---+---+---+---+---+--------+
| Fib | 0 | 1 | 1 | 2 | 3 | 5 | 8 | ...... |
+-----+---+---+---+---+---+---+---+--------+

如果用樹狀圖會更容易了解





























使用遞迴的方式,可以得到費氏數列的值:

#include
int X(int n){
if(n<=1) return n;
else return X(n-1)+X(n-2);
}
int main(){
printf("%d", X(6));
getch();
return 0;
}

Monday, February 08, 2010

以陣列實作堆疊

在學習資料結構時,最重要的一個課題就是堆疊、駐列等結構。以下簡介以陣列實作堆疊的案例:

先簡介一些必要變數與函數:

#define N 100 //堆疊最大容量;
int stack[N]; //宣告stack;
int sp; //堆疊的指標;

StackOverflow()當堆疊已經滿的時候告知使用者"Stack Over flow",也就是不能再push資料;
StackUnderflow()當堆疊已經空的時候高知使用者"Stack Under flow",也就是不能再pop資料;

void StackOverflow(){
printf("\nStack Over flow");
}
void StackUnderflow(){
printf("\nStack Under flow");
}

CreateStack()當需要堆疊stack時,讓其指標初始位置定在-1,因為C語言的陣列是從0開始編排;

void CreateStack(){
sp=-1;
}

IsStackEmpty()判斷堆疊stack是否已空;
IsStackFull()判斷堆疊stack是否已滿;

bool IsStackEmpty(){
return (sp==-1);
}
bool IsStackFull(){
return (sp==(N-1));
}

AddStack(int item)將一筆資料item丟入堆疊stack中,過程須判斷stack還有沒有空間;

void AddStack(int item){ //void AddStack(ItemType item){
if(IsStackFull())StackOverflow();
else stack[++sp]=item;
}

DeleteStack()將堆疊stack最上面的一筆資料移除,但實際上只是將stack的指標sp往下移動,在過程中要先判斷stack是否已空,而不能在移動sp;

int DeleteStack(){ //ItemType DeleteStack(){
if(IsStackEmpty()) StackUnderflow();
else return stack[sp--];
}

StackTop()將堆疊stack最上面的值複製出來;

int StackTop(){ //ItemType StackTop(){
if(IsStackEmpty()) StackUnderflow();
else return stack[sp];
}


以下是一個簡單的堆疊範例:

#include
#include
/***************************************
#ifndef _STDBOOL_H
#define _STDBOOL_H
#define bool _Bool
#define true 1
#define false 0
#define __bool_true_false_are_defined 1
#endif
***************************************/

#define N 100 //const int N=100;
int stack[N]; //ItemType stack[N];
int sp;
void StackOverflow(){
printf("\nStack Over flow");
}
void StackUnderflow(){
printf("\nStack Under flow");
}
void CreateStack(){
sp=-1;
}
bool IsStackEmpty(){
return (sp==-1);
}
bool IsStackFull(){
return (sp==(N-1));
}
void AddStack(int item){ //void AddStack(ItemType item){
if(IsStackFull())StackOverflow();
else stack[++sp]=item;
}
int DeleteStack(){ //ItemType DeleteStack(){
if(IsStackEmpty()) StackUnderflow();
else return stack[sp--];
}
int StackTop(){ //ItemType StackTop(){
if(IsStackEmpty()) StackUnderflow();
else return stack[sp];
}
void Status(){
int i;
printf("sp:%d\n", sp);
printf("stack:\n");
for(i=0; i<=sp; i++){
printf("%d\t", i);
}
printf("\n");
for(i=0; i<=sp; i++){
printf("%d\t", stack[i]);
}
}
int main(){
int input, copy;
char ch;
CreateStack();
Status();
do{
printf("\nInput:");
scanf("%d", &input);
AddStack(input);
Status();
printf("\nDo you want to input a number?(y/n):");
ch=_getche();
}while(ch=='y');
do{
printf("\nDo you want to delete a number?(y/n):");
ch=_getche();
if(ch=='y')
DeleteStack();
printf("\n");
Status();
}while(ch=='y');
copy=StackTop();
printf("\ncopy:%d", copy);
getch();
return 0;
}

以下是程式結果:

sp:-1
stack:


Input:33
sp:0
stack:
0
33
Do you want to input a number?(y/n):y
Input:44
sp:1
stack:
0 1
33 44
Do you want to input a number?(y/n):y
Input:55
sp:2
stack:
0 1 2
33 44 55
Do you want to input a number?(y/n):n
Do you want to delete a number?(y/n):y
sp:1
stack:
0 1
33 44
Do you want to delete a number?(y/n):n
sp:1
stack:
0 1
33 44
copy:44