一個簡單易用的遠端桌面軟體,
不需註冊也不需要知道對方IP位址,可突破防火牆封鎖
就可遠端連線控制對方電腦或讓對方遠端控制自己電腦,
也可作兩台電腦間的檔案傳輸
參考文章(下載):Teamviewer 免安裝中文版
##ShowAll##
2009年12月29日 星期二
2009年12月22日 星期二
JAVA筆記-覆寫equals()與hashCode()
之前寫Collection,看到這兩個方法,就很想使用
但要用的近乎人意,卻要很費一番功夫
沒有被覆寫的equals是比較兩物件的參考位置,物件不同則傳回false
若要比對兩物件屬性內容值,則要自己覆寫
並且也一併覆寫hashCode,不同物件會有不同hash code
若兩物件equals()相等,hashCode()也必須相等,否則可能會有錯誤問題
尤其是Hash-Based Collection會用到
覆寫hashCode()不容易,
使用jakarta所提供的HashCodeBuilder類別,
下載commons-lang-2.1.jar,
看到這裡,懶惰的我,也想放棄了,
真的要用到再說吧!
但要用的近乎人意,卻要很費一番功夫
沒有被覆寫的equals是比較兩物件的參考位置,物件不同則傳回false
若要比對兩物件屬性內容值,則要自己覆寫
並且也一併覆寫hashCode,不同物件會有不同hash code
若兩物件equals()相等,hashCode()也必須相等,否則可能會有錯誤問題
尤其是Hash-Based Collection會用到
/* equals()覆寫例子 */
public boolean equals(Object obj) {
//若同一物件則true
if (this == obj) return true;
//getClass()會可用來判斷物件是否屬於同一類別
if(obj != null && getClass() == obj.getClass()){
if(obj instanceof Ball) {
Ball ball = (Ball)obj;
//比對屬性內容值
if (tradeMark.equals(ball.tradeMark) &&
kind.equals(ball.kind) &&
color.equals(ball.color)) {
return true;
}
}
}
return false;
}
覆寫hashCode()不容易,
使用jakarta所提供的HashCodeBuilder類別,
下載commons-lang-2.1.jar,
看到這裡,懶惰的我,也想放棄了,
真的要用到再說吧!
/* hashCode()覆寫例子 */
import org.apache.commons.lang.builder.HashCodeBuilder;//加入外掛
public int hashCode() {
return new HashCodeBuilder(17, 37). //應放入兩個質數
append(tradeMark). //利用append()加入參與的物件變數
append(kind).
append(color).
toHashCode(); //最後取得hash code數值
}
JAVA筆記-initializer實做區塊
{...}單獨放在class內是用來初始實做區塊
分為兩種instance initialize、static initialize
在instance initialize區塊,
編譯器會將其內部的程式碼複製到每個建構子中,
若原initialize區塊和instance initialize區塊中有定義相同的變數
則會以initialize的定義為主,
而該變數不會被instance initialize的定義覆蓋
至於static initialize則不會被複製到建構子中,會用來初始化靜態變數,
static initialize不能存取一般的instance物件變數,
但instance initialize是可存取static和non-static的成員變數
分為兩種instance initialize、static initialize
在instance initialize區塊,
編譯器會將其內部的程式碼複製到每個建構子中,
若原initialize區塊和instance initialize區塊中有定義相同的變數
則會以initialize的定義為主,
而該變數不會被instance initialize的定義覆蓋
至於static initialize則不會被複製到建構子中,會用來初始化靜態變數,
static initialize不能存取一般的instance物件變數,
但instance initialize是可存取static和non-static的成員變數
public class InitializerSample {
String id;
int birthday;
String name;
static int money;
InitializerSample() {}
InitializerSample(int kind) {}
//instance initialize
{
id = "A123456789";
birthday = 20050101;
name = "pcschool";
}
//static initialize
static {
money = 10000;
}
}
JAVA筆記-多個繼承時,使用型別轉換要注意
進行物件型別轉換時,多個繼承容易撰寫錯誤,
未避免執行風險,加上instanceof判斷式
未避免執行風險,加上instanceof判斷式
class Animal extends Organism{...}
class Mammalian extends Animal{...}
Animal animal = null;
if(new Mammalian() instanceof Animal){
animal = (Animal)new Mammalian();
}
##ShowAll##
2009年12月19日 星期六
JAVA筆記-靜態內部類別的存取權限
一般類別+內部類別+static的存取關係真是複雜
難怪當初看JAVA我會不由自主的想先跳過
沒事不要寫這麼複雜關係的程式碼,
如果要用到一本書要放在旁邊就是了
靜態外部類別的內部類別同樣是被放在Global記憶體區塊,
所以內部類別不管有沒有宣告static,都可互相看見而存取
(其實一般使用靜態類別時,本身內部就沒有設定static,
成員變數本來就互相看見,多設定一道static,
它還是放在Global記憶體內,當然還是會可以看見)
靜態類別本身是沒有this指標,也不需要new建立實體
但靜態內部類別的non-static成員會有this指標指向自己,
(這一段話我感到有點含糊,靜態內部類別裡的non-static成員為什麼會有this指標?)
所以靜態內部類別可以同時定義static和non-static成員,
因此,也可用new來建立靜態內部類別的實體
執行結果:
99
9
77
77
99
9
難怪當初看JAVA我會不由自主的想先跳過
沒事不要寫這麼複雜關係的程式碼,
如果要用到一本書要放在旁邊就是了
靜態外部類別的內部類別同樣是被放在Global記憶體區塊,
所以內部類別不管有沒有宣告static,都可互相看見而存取
(其實一般使用靜態類別時,本身內部就沒有設定static,
成員變數本來就互相看見,多設定一道static,
它還是放在Global記憶體內,當然還是會可以看見)
靜態類別本身是沒有this指標,也不需要new建立實體
但靜態內部類別的non-static成員會有this指標指向自己,
(這一段話我感到有點含糊,靜態內部類別裡的non-static成員為什麼會有this指標?)
所以靜態內部類別可以同時定義static和non-static成員,
因此,也可用new來建立靜態內部類別的實體
class MyOuter {
private int x = 7;
static private int sx = 9;
static class MyStatic {
private int x = 77;
static private int sx = 99;
public void fooA() { // non-static member
System.out.println("static inner class A.");
System.out.println(sx); //
System.out.println(MyOuter.sx); //
System.out.println(x); //
System.out.println(this.x); //
//static inner class中沒有MyOuter的this指標
//System.out.println(MyOuter.this.x);
}
public static void fooB() { // static member
System.out.println("static inner class B.");
System.out.println(sx);
System.out.println(MyOuter.sx);
}
}
}
public class StaticInnerClass {
public static void main(String[] args) {
//MyOuter.MyStatic.fooB();
MyOuter.MyStatic s = new MyOuter.MyStatic();
s.fooA();
s.fooB();
}
執行結果:
99
9
77
77
99
9
JAVA筆記-用匿名內部類別來實作介面
內部類別沒有實際練習過,雖然看懂了用法,
但還是感到含糊,不知道要在怎樣的情況下運用
適合用在程式只會用到一次就不需再使用類別的情況
##ReadMore##
但還是感到含糊,不知道要在怎樣的情況下運用
適合用在程式只會用到一次就不需再使用類別的情況
##ReadMore##
interface Pet {
void skill();
void move();
}
public class AnonymousClass {
public static void main(String[] args) {
Pet p = new Pet()
{
public void skill(){
System.out.println("我會握手 !");
}
public void move(){
System.out.println("我會跑步 !");
};
};
p.skill();
p.move();
}
}
2009年12月11日 星期五
JAVA筆記-import static
只是讓程式少打幾個字,方便程式設計師撰寫程式更清楚明瞭
使用import static的最後指向必須是靜態成員
##ReadMore##
import
import static
使用import static的最後指向必須是靜態成員
##ReadMore##
import
import java.lang.System;
out.println("hallo");
import static
import static java.lang.System.out;
out.println("hallo");
JAVA筆記-列舉當一般類別,可用抽象方法和實做
列舉用抽象方法,需自行透過覆寫來實作
列舉可實做介面,但未開放使用繼承
public enum Operator {
//------> 利用匿名類別來實做operate(int x) <------
//加入()的撰寫
PLUSONE(){ int operate(int x){ return x;} },
//可省略()的撰寫
ABS{ public int operate(int x){return x;} };
//抽象方法
abstract int operate(int x);
}
列舉可實做介面,但未開放使用繼承
public enum Orderenum implements OrderInterface{}
##ShowAll##
JAVA筆記-列舉當一般類別,可加入方法和屬性
列舉也是類別,當作外部類別時可加入屬性和方法,
但列舉的值必須先宣告,且列舉設定完內容要加分號
且編譯器不會自動加上static final修飾字
##ReadMore##
但列舉的值必須先宣告,且列舉設定完內容要加分號
且編譯器不會自動加上static final修飾字
##ReadMore##
public enum OrderEnum {
STOCKNO(2330),
STOCKPRICE(45.5),
STOCKQTY(10), //有參數,由OrderEnum(double d)建構子實作
IDENTIFY(); //無參數,由OrderEnum()建構子實作
private OrderEnum() { //列舉建構子一定是private
System.out.println("A");
}
OrderEnum(double d) { //列舉建構子會編譯成private
System.out.println("B");
}
public int id; //屬性
public boolean submit(){ //方法
return true;
}
}
JAVA筆記-enum列舉,switch應用
//會自動轉成Week.Monday.ordinal(),用int比對,數值由0遞升
switch(Week.Monday){
case Monday:
System.out.println(Week.Monday);
break;
}
##ShowAll##
JAVA筆記-enum列舉,宣告與輸出
宣告範例:
編譯器會將列舉自動加上public、static、final的修飾,
即不被繼承、定義後資料無法更改
輸出值範例:
覆寫toString(),因值而異的類實作
public enum Week {Sun, Mon, Tue, Wed, Thu, Fri, Sat}
編譯器會將列舉自動加上public、static、final的修飾,
即不被繼承、定義後資料無法更改
輸出值範例:
//輸出單一字串
System.out.print(Week.Sunday);
//輸出列舉內全部字串
Week[] week = Week.values(); //將列舉轉成陣列使用
for(int i=0; i<week.length; i++) //取得列舉長度
System.out.print(week[i] + ", ");
覆寫toString(),因值而異的類實作
enum Grade {
A{public String toString(){return "a"}}, B, C, D
}
System.out.print(Week.A); //結果輸出的是a
JAVA筆記-介面與抽象類別的差異
介面與抽象類別內的皆可宣告抽象方法,
且不可直接建立實體,必須由其他類別來實作出來,
所以也容易混淆
目的上 =>
interface是制定訊息接收者的規格,模擬類別的多重繼承
abstract class則是制定部分物件的規格,並且制定訊息接收者的規格,為多型作準備。
使用上 =>
interface用來被實作,abstract class則是用來被繼承
概念上 =>
abstract class:
可以想像手機物件基本上該有哪些功能,然後將那些功能名稱定義好,
一定也有一些功能是所有手機都一樣的!也可以先都寫好。
定義好之後,開發手機軟體的廠商就可以依據這些已定義好的method來撰寫
interface:
顧名思義就是不同系統、或是不同世界的中介橋樑,
只注重介面格式,而不理會實作內容。
如:人跟電腦的溝通介面是什麼?螢幕、鍵盤、滑鼠等...
人跟手機的溝通介面是什麼?螢幕、鍵盤等...
所以一個物件可以有很多個介面,像手機的鍵盤面板,
今天高興換紅色,明天工作開心換藍色,
因為介面是一樣的,所以可以隨便更換面板。
差異上 =>
1.
interface的方法全都是抽象方法
abstract則有一般方法和抽象方法
抽象方法指的是沒有「實作」出來的方法
2.
interface與abstract類別都不能直接用來建立物件實體,
必須由一個標準類別來繼承它,實作其抽象方法,
然後再以此建立物件實體。
3.
interface可多重繼承interface
abstract只能單一繼承
3.
interface沒有建構子
abstract有建構子
4.
interface沒有內建的super與this變數
abstract有內建的super與this變數
5.
interface的成員變數全都是static final型式
abstract類別的成員變數比照一般類別
6.
interface內的方法只可封裝public、default
abstract內的方法只可封裝public、default、protected
7.
需要使用迂迴的方式去找出實體類別間的對應關係,
所以與抽象類別的速度相比之下較為緩慢
介面與類別一起使用的參考想法 =>
先為了某些機制建立一個介面,然後再設計一個抽象類別實作這個介面
且不可直接建立實體,必須由其他類別來實作出來,
所以也容易混淆
目的上 =>
interface是制定訊息接收者的規格,模擬類別的多重繼承
abstract class則是制定部分物件的規格,並且制定訊息接收者的規格,為多型作準備。
使用上 =>
interface用來被實作,abstract class則是用來被繼承
概念上 =>
abstract class:
可以想像手機物件基本上該有哪些功能,然後將那些功能名稱定義好,
一定也有一些功能是所有手機都一樣的!也可以先都寫好。
定義好之後,開發手機軟體的廠商就可以依據這些已定義好的method來撰寫
interface:
顧名思義就是不同系統、或是不同世界的中介橋樑,
只注重介面格式,而不理會實作內容。
如:人跟電腦的溝通介面是什麼?螢幕、鍵盤、滑鼠等...
人跟手機的溝通介面是什麼?螢幕、鍵盤等...
所以一個物件可以有很多個介面,像手機的鍵盤面板,
今天高興換紅色,明天工作開心換藍色,
因為介面是一樣的,所以可以隨便更換面板。
差異上 =>
1.
interface的方法全都是抽象方法
abstract則有一般方法和抽象方法
抽象方法指的是沒有「實作」出來的方法
2.
interface與abstract類別都不能直接用來建立物件實體,
必須由一個標準類別來繼承它,實作其抽象方法,
然後再以此建立物件實體。
3.
interface可多重繼承interface
abstract只能單一繼承
3.
interface沒有建構子
abstract有建構子
4.
interface沒有內建的super與this變數
abstract有內建的super與this變數
5.
interface的成員變數全都是static final型式
abstract類別的成員變數比照一般類別
6.
interface內的方法只可封裝public、default
abstract內的方法只可封裝public、default、protected
7.
需要使用迂迴的方式去找出實體類別間的對應關係,
所以與抽象類別的速度相比之下較為緩慢
介面與類別一起使用的參考想法 =>
先為了某些機制建立一個介面,然後再設計一個抽象類別實作這個介面
JAVA筆記-abstract class抽象類別,由子類別實作
宣告型式:
[存取修飾元] abstract class 類別名稱 [implements ...] [extends ...]
抽象類別由子類別用extends來實作,不可用new建立實體
抽象類別內的方法可以使用一般方法和抽象方法,
而抽象方法要加abstract,
並且不可用private,因為子類別無法實作沒有道理
[存取修飾元] abstract class 類別名稱 [implements ...] [extends ...]
抽象類別由子類別用extends來實作,不可用new建立實體
抽象類別內的方法可以使用一般方法和抽象方法,
而抽象方法要加abstract,
並且不可用private,因為子類別無法實作沒有道理
abstract class Car {
public void power(){}
abstract void move();
}
public class Tank extends Car{
public void move(){
Syatem.out.println("Track");
}
}
2009年12月9日 星期三
JAVA筆記-interface介面,解決多重繼承問題
為一種標準、規範,只是做規格、功用的定義宣告
由於extends不能單一繼承一般類別,為了達到多重繼承的目的,
在介面類別中可以多重繼承介面類別,來模擬一般類別的多重繼承
多重繼承寫法:extends 介面類別1, 介面類別2 ,介面類別3 ...
必須全部都是介面類別
介面宣告寫法:[存取權限] interface 介面名稱 [extends ...]
使用介面的類別用implements來實作,不可用new建立實體
且全部方法都會編譯成抽象方法
實作介面寫法:[存取權限] class 類別名稱 implements [extends ...]
javac會自動編譯成下方程式碼
所以存取權限必須只能用default和public,否則會錯誤
下方程式碼寫了一個Dog來實做Pet
由於extends不能單一繼承一般類別,為了達到多重繼承的目的,
在介面類別中可以多重繼承介面類別,來模擬一般類別的多重繼承
多重繼承寫法:extends 介面類別1, 介面類別2 ,介面類別3 ...
必須全部都是介面類別
介面宣告寫法:[存取權限] interface 介面名稱 [extends ...]
使用介面的類別用implements來實作,不可用new建立實體
且全部方法都會編譯成抽象方法
實作介面寫法:[存取權限] class 類別名稱 implements [extends ...]
public interface Pet {
String attr = "cute"; //必須給予初值
void skill(); //不能實作函式
void move(); //不能實作函式
}
javac會自動編譯成下方程式碼
public interface Pet {
public static final String attr = "cute";
public abstract void skill();
public abstract void move();
}
所以存取權限必須只能用default和public,否則會錯誤
下方程式碼寫了一個Dog來實做Pet
public class Dog implements Pet{
public void skill(){
System.out.println("玩球");
}
public void move(){
System.out.println("跑跑跳跳");
}
public static void main(String[] args) {
Dog dog = new Dog();
dog.skill();
dog.move();
}
}
JAVA筆記-instanceof多型使用方法
用不同型別的宣告,建立繼承物件的實體,
使用的是實做物件的函式與屬性
##ReadMore##
使用的是實做物件的函式與屬性
##ReadMore##
/******************
Animal: move()
Bird: move()
Cat: move()、skill()
Tiger: skill()
Bird、Cat繼承Animal
Tiger繼承Cat
*******************/
class Animal {
public void move() {
System.out.println("移動...");
}
}
class Cat extends Animal {
public void move() {
System.out.println("跑跑跳跳...");
}
public void skill() {
System.out.println("洗澡...");
}
}
class Bird extends Animal {
public void move() {
System.out.println("蹦蹦飛飛...");
}
}
class Tiger extends Cat {
public void skill() {
System.out.println("守獵...");
}
}
public class Zoo {
public static void main(String[] args) {
//ex1
Tiger a = new Tiger();
t.skill; //呼叫Tiger的method
t.move; //呼叫Tiger的method
//ex2
Cat c = new Tiger();
c.skill; //呼叫Tiger的method
c.move; //呼叫Tiger的method
//ex3
Animal a = new Tiger();
a.move; //呼叫Tiger的method
a.skill; //編譯錯誤
//Animal型別沒有skill(),無法使用Tiger的函式
/*********************
//ex4
Animal a = new Tiger();
((Tiger)a).skill; //呼叫Tiger的method
((Brid)a).move; //編譯正確
//但是Tiger並不是繼承Brid,執行時會錯誤
//必須加上條件式if(a instanceof Brid),傳回false則代表不可轉型
//instanceof是用來判斷某個類別是否實作了某個介面
*********************/
}
}
JAVA筆記-extends繼承關係下的建構子
class Father {
Father(){System.out.println("A")};
}
class Son extends Father{
Son(){
//super();//自動加入在建構子第一行,而執行super建構子
System.out.println("B")};
}
public class Example{
public static void main(String[] args){
Son son = new Son();
}
}
##ReadMore##
結果輸出:
A
B
PS:若super類別的建構子有需要參數,則必須自行輸入,否則可能錯誤
在static中,沒有this和super的參照,所以不能用這兩個相關指令
Http File Server(HFS) HTTP的檔案伺服器
類似FTP Server,但這套軟體傳輸速度比較不穩定
基本上FTP Server上該有的功能幾乎都具備
好處是可以直接用IE呈現,架站非常簡單,也不需額外使用客戶端軟體
臨時傳檔給朋友最方便,那還需要FTP嗎?
最好使用2.2以上英文版本,網頁上會有folder archive的字串
可讓使用者直接在網頁上打包下載整個資料夾
而且更重要的是還可編輯HTML網頁,這軟體真大心的
參考文章(下載):HFS 檔案伺服器
基本上FTP Server上該有的功能幾乎都具備
好處是可以直接用IE呈現,架站非常簡單,也不需額外使用客戶端軟體
臨時傳檔給朋友最方便,那還需要FTP嗎?
最好使用2.2以上英文版本,網頁上會有folder archive的字串
可讓使用者直接在網頁上打包下載整個資料夾
而且更重要的是還可編輯HTML網頁,這軟體真大心的
參考文章(下載):HFS 檔案伺服器
2009年11月13日 星期五
JAVA筆記-vararg變長參數,利用省略號傳多個參數
利用省略號...傳多個參數,也是把參數自動轉成陣列
public int calc(int...c){
int sum = 0;
for(int i:c)
sum+=i;
return sum ;
}
/*使用時可傳多個參數*/
int a = new calc(1,2);
int b = new calc(1,2,3,4);
int c = new calc(a,b);
##ShowAll##
JAVA筆記-關於static成員
static只能用在類別裡,
不能使用在方法之內,
方法內也不能再定義方法
類別內,static不可呼叫non-static,只可呼叫static,
non-static則都可,
因static不需要被建立就可執行,
亦即static成員中根本沒有隱含的this參考指標指向物件,
但non-static卻未被建立,必須先new出來才可用
不能使用在方法之內,
方法內也不能再定義方法
類別內,static不可呼叫non-static,只可呼叫static,
non-static則都可,
因static不需要被建立就可執行,
亦即static成員中根本沒有隱含的this參考指標指向物件,
但non-static卻未被建立,必須先new出來才可用
public class Test {
void a() {
b(); //正確
d(); //正確
}
void b() {}
static void c() {
b(); //錯誤,不可直接呼叫b()
d(); //正確,可直接呼叫d()
}
static void d(){
new Test().b(); //正確,可直接呼叫b()
}
}
JAVA筆記-Object類別提供的方法
##ShowAll##任何物件包含自定義物件,都繼承Object類別
Object提供的方法:
clone()
equals()
finalize()
hashCode()
notify()
notifyAll()
toString()
wait()
Object提供的方法:
clone()
equals()
finalize()
hashCode()
notify()
notifyAll()
toString()
wait()
JAVA筆記-物件導向的兩個精神與三個特徵
##ShowAll##
精神
1.抽象化(Abstraction)
2.繼承(Inheritance)
特徵
1.繼承(Inheritance)
2.封裝(Encapsulation)
3.多型(Polymorphism)
2009年10月5日 星期一
JAVA筆記-建立多維陣列
##ShowAll##
int m[][] = new int [2][3]; //生成多維陣列
int m[][] = new int[][3]; //不合法
int m[][] = new int[2][]; //合法,生成動態陣列
m[0]= new int[3];
m[1]= new int[5];
/* 若要變動陣列大小,需重新new物件 */
JAVA筆記-宣告類別、屬性、方法的權限
##ShowAll##
修飾元用來宣告類別、屬性、方法的權限
private => 同一class才可存取
dafault => 同一package的class才可存取
protected => 同一package的class才可存取,
不同package要有繼承關係才可存取
public => 皆可存取
類別只能使用public和default,若是內部類別則皆可使用
修飾元用來宣告類別、屬性、方法的權限
private => 同一class才可存取
dafault => 同一package的class才可存取
protected => 同一package的class才可存取,
不同package要有繼承關係才可存取
public => 皆可存取
類別只能使用public和default,若是內部類別則皆可使用
2009年9月30日 星期三
JAVA筆記-jar包裹classes
包裹classes全部目錄到sample.jar
命令=> jar -cvf sample.jar
關於META-INF目錄和MANIFEST.MF文件另外做學習
命令=> jar -cvf sample.jar
關於META-INF目錄和MANIFEST.MF文件另外做學習
JAVA筆記-classpath路徑
-sourcepath 用來設定.java檔的位置
-classpath或-cp 用來指向副檔名為.jar、.zip、.class的位置
不同的classpath以;符號來分隔(linux下,用:符號)
ex: -classpath classpath1;classpath2;classpath3
若C:\prg\SCJP\classes\com\pet\water下有Fish.class
Fish.class的套件設定是package com.pet.water
絕對路徑,在C:\目錄下
C:\>java C:\prg\SCJP\classes com.pet.water.Fish
相對路徑,C:\prog\SCJP目錄下
C:\prg\SCJP>java -cp .\classes com.pet.water.Fish
不用設定-cp,C:\prg\SCJP\classes目錄下
C:\prg\SCJP\classes>java com.pet.water.Fish
-classpath或-cp 用來指向副檔名為.jar、.zip、.class的位置
不同的classpath以;符號來分隔(linux下,用:符號)
ex: -classpath classpath1;classpath2;classpath3
若C:\prg\SCJP\classes\com\pet\water下有Fish.class
Fish.class的套件設定是package com.pet.water
絕對路徑,在C:\目錄下
C:\>java C:\prg\SCJP\classes com.pet.water.Fish
相對路徑,C:\prog\SCJP目錄下
C:\prg\SCJP>java -cp .\classes com.pet.water.Fish
不用設定-cp,C:\prg\SCJP\classes目錄下
C:\prg\SCJP\classes>java com.pet.water.Fish
JAVA筆記-package和import
file1
##ReadMore##
file2
file3
package water;
public class Fish
{
public static name = "Jerry" ;
}
##ReadMore##
file2
/* file2.java不在同一個package,程式碼的調用方法 */
public class PetScore
{
public static void main(String[] args)
{
String Name = water.Fish.name ;
}
}
file3
/* 調用import,類似C語言的include */
import water.*;
public class PetScore
{
public static void main(String[] args)
{
String Name = Fish.name ;
}
}
2009年9月28日 星期一
C/C++筆記-設定、測試、清除的位元運算
const int BIT = 0x01;
char flags = 0; //初始狀態位元
/* 設定一個位元 */
flag |= BIT; //flags變成BIT狀態
/* 測試位元 */
if(flags & BIT != 0)
cout << "BIT flag is set" ;
else
cout << "No BIT detected" ;
/* 清除位元 */
//清除位元是指flags與BIT有相同位元的地方,都必須清為0
flag = flag & ~BIT;
##ShowAll##
2009年9月25日 星期五
JAVA筆記-for-each多維陣列輸出
##ShowAll##
String[][] exams = {{"SCJP","SCWCD","SCMAD"},{"MCSD","MCAD","MCDBA"}};
for(String[] ex : exams)
{
for(String e : ex)
{
System.out.print(e + ", ");
}
}
JAVA筆記-label函式標籤
##ShowAll##
//有點像goto,但此方法似乎不會破壞程式結構
OuterLoop:
for( ; ; )
{
InnerLoop:
for( ; ; )
{
continue OuterLoop; //跳到OuterLoop標籤的函式
break OuterLoop; //跳出OuterLoop標籤的函式
}
}
JAVA筆記-final關鍵字使用
用final修飾過的類別(class)不能被繼承
函式(method)不能被重載,在C++加上const的函式意指回傳值不能被改變
變數不能被更改,意指常數,等於一般C++的const變數
在JAVA內,通常定義常數方法是static final PI = 3.1412;
函式(method)不能被重載,在C++加上const的函式意指回傳值不能被改變
變數不能被更改,意指常數,等於一般C++的const變數
在JAVA內,通常定義常數方法是static final PI = 3.1412;
2009年9月24日 星期四
C/C++筆記-函式預設參數
void draw(const int width, const int height, double scale=1.0);
...
//---> 以下兩呼叫函式是相等的
draw(3, 5, 1.0); //採用尺度比例
draw(3, 5,); //採用預設比例
##ShowAll##
DVDFab HD Decrypter 解除DVD防拷
解除DVD防拷,使用AnyDVD使用要錢的,
免費的有DVD43,但是好像只有英文版
一般使用免費軟體,從防拷到燒錄大概的步驟是
DVD43(或AnyDVD)解除防拷+DVDShrink轉檔(或切割)+Imburn燒錄
若使用DVDFab Platinum它全包了,但是這款要錢
包含解除防拷+DVD9轉DVD5(或切割)+DVD燒錄
而DVDFab Decrypter是DVDFab Platinum的精簡版,
在解除防拷功能方面是不用錢的,方便好用
其中內含的試用功能,可將DVD備份轉擋到許多指定的可攜式裝置
整個流程相當複雜,我覺得非必要不要嘗試,很累人的,
但學會之後,卻又是一大驚喜 DVDFab HD Decrypter
(註:DVD9轉DVD5(或切割),
這一步驟是因為原裝一片DVD容量是一般空白DVD容量的兩倍,
所以必須透過破壞壓縮轉檔或者切割成兩片)
使用DVDFab破解DVD防拷教學 =>
DVDFab HD Decrypter 破解、備份有防拷保護的DVD影片光碟?
參考文章(下載):DVDFab HD Decrypter 免安裝中文版
以前大學時為了幫朋友燒錄完整的正版DVD影音, 弄的我嘔心瀝血,
而且我那時甚至連DVD有防拷都不了解, 我研究了很多相關影音軟體,
熬夜兩個晚上, 燒了好幾片光碟,才好不容易弄出來,
因為那個時候, DVD相關的軟體其實並不多,一堆備份軟體,
但光備份沒用,必須還要解除防拷 ,
想要燒錄完整正版DVD影音是很困難的,防拷、轉檔、切割、播放、、、
我的電腦配備也不是很強,每一步驟的執行都很花時間,
時間又非常趕燒出來後,不管NeroShow或PowerDVD,
都出現一些不同的播放錯誤這都是因為防拷解除不完全,
可是那時我不知道究竟原因是什麼,
後來終於在找到AnyDVD後,終於燒成功了,
AnyDVD+Nero+PowerDVD,完整備份,可在DVD播放器上觀看
吃力不討好的工作,沒錢又被唸動作太慢,超失落的
免費的有DVD43,但是好像只有英文版
一般使用免費軟體,從防拷到燒錄大概的步驟是
DVD43(或AnyDVD)解除防拷+DVDShrink轉檔(或切割)+Imburn燒錄
若使用DVDFab Platinum它全包了,但是這款要錢
包含解除防拷+DVD9轉DVD5(或切割)+DVD燒錄
而DVDFab Decrypter是DVDFab Platinum的精簡版,
在解除防拷功能方面是不用錢的,方便好用
其中內含的試用功能,可將DVD備份轉擋到許多指定的可攜式裝置
整個流程相當複雜,我覺得非必要不要嘗試,很累人的,
但學會之後,卻又是一大驚喜 DVDFab HD Decrypter
(註:DVD9轉DVD5(或切割),
這一步驟是因為原裝一片DVD容量是一般空白DVD容量的兩倍,
所以必須透過破壞壓縮轉檔或者切割成兩片)
使用DVDFab破解DVD防拷教學 =>
DVDFab HD Decrypter 破解、備份有防拷保護的DVD影片光碟?
參考文章(下載):DVDFab HD Decrypter 免安裝中文版
以前大學時為了幫朋友燒錄完整的正版DVD影音, 弄的我嘔心瀝血,
而且我那時甚至連DVD有防拷都不了解, 我研究了很多相關影音軟體,
熬夜兩個晚上, 燒了好幾片光碟,才好不容易弄出來,
因為那個時候, DVD相關的軟體其實並不多,一堆備份軟體,
但光備份沒用,必須還要解除防拷 ,
想要燒錄完整正版DVD影音是很困難的,防拷、轉檔、切割、播放、、、
我的電腦配備也不是很強,每一步驟的執行都很花時間,
時間又非常趕燒出來後,不管NeroShow或PowerDVD,
都出現一些不同的播放錯誤這都是因為防拷解除不完全,
可是那時我不知道究竟原因是什麼,
後來終於在找到AnyDVD後,終於燒成功了,
AnyDVD+Nero+PowerDVD,完整備份,可在DVD播放器上觀看
吃力不討好的工作,沒錢又被唸動作太慢,超失落的
2009年9月23日 星期三
C/C++筆記-懸盪參考
// Dangling Renferences 懸盪參考
const int& min(const int& i1, const int& i2)
{
if(i1 < i2)
return (i1);
return (i2);
}
int main()
{
const int& = min(1+2, 3+4); //傳回位址,所以取址
return 0;
}
/* 傳回的min(1+2, 3+4)是暫存的參考指標,
函式執行完後會被刪除,然而&i仍指向這個參考指標 */
##ShowAll##
C/C++筆記-const參數與函式
//i1、i2在函式中是const變數,不能改變值
const int& min(const int& i1, const int& i2)
{
if(i1 < i2)
return (i1);
return (i2);
}
int main()
{
min(1+2, 3+4);
return 0;
}
/*
* const的函式意義是指,若函式是傳回參考指標變數,
* 則該變數傳回後不能直接變更回傳值
* min(1+2,3+4)=0;由於是const函式,傳回值不能作改變
*/
##ShowAll##
C/C++筆記-將變數傳遞進參考指標函式
//好處是傳一般變數即可
void inc_counter(int& counter)
{
++counter;
}
int main()
{
int a_count = 0;
inc_counter(a_count);
std::cout << a_count << '\n' ; //傳回值+1
return 0;
}
/* 這種作法似乎不能用在C語言 */
##ShowAll##
2009年9月22日 星期二
C/C++筆記-namespace格式化變數名稱
/* 避免命名變數名稱冗長,如core_ui_games_back_ */
//---> ex1:
namespace std
{
istream cin;
ostream cout;
ostream cerr;
}
std::cout << "namespace" ; //使用方法,std::cout
/* 加上using namespace std;程式碼後,可直接使用cout */
//---> ex2:
namespace display
{
int width;
int height;
bool visible;
};
using display::width; //使用using
width=10; //之後要就可直接使用width
/* 但應避免使用using,以免有重複名稱 */
##ShowAll##
2009年9月21日 星期一
C/C++筆記-用static_cast轉換C,C++字串
//C++字串轉C字串
char c_stype[100];
string a_string("something");
strcpy(c_style,a_string.c_str());
//C字串轉C++字串
a_string = c_style;
a_string = static_cast(c_style); //使用static_cast
/* C字串稍快一點,但使用strcpy和strcat有超過字串範圍的風險 */
##ShowAll##
C/C++筆記-strcpy和strcat超出字串範圍的風險
strcpy和strcat使用時會有超出字串範圍的風險
解法1:可用assert函式來避免
解法2:strncpy(name,"Oualline",sizeof(name)-1);
最後一個會自動補'\0'
解法2:strncat(name,"Oualline",sizeof(name)-strlen(name)-1);
若空間已滿,則'\0'就不會自動加入,需自行填入,
多寫一行程式碼 name[sizeof(name)-1]='\0';
加上此行程式碼若未超出空間會多一個'\0',但不影響
解法1:可用assert函式來避免
解法2:strncpy(name,"Oualline",sizeof(name)-1);
最後一個會自動補'\0'
解法2:strncat(name,"Oualline",sizeof(name)-strlen(name)-1);
若空間已滿,則'\0'就不會自動加入,需自行填入,
多寫一行程式碼 name[sizeof(name)-1]='\0';
加上此行程式碼若未超出空間會多一個'\0',但不影響
2009年9月19日 星期六
C/C++筆記-assert防止陣列索引溢出
/* 叫用#include <assert.h> 來檢查有無超過範圍 */
int primes[] = {2,3,5,7,11,13,17};
int index = 10;
assert(index < (sizeof(primes)/sizeof(primes[0])));
assert(index >= 0);
std::cout << primes[index] ;
/* 用起來其實很累人,但一些大型source code,會看到在用 */
##ShowAll##
C/C++筆記-螢幕輸出特殊字元
\b 游標後退一個位元
\f 換頁
\n 換行
\r 游標到目前的行開頭
\t 到下一個定位點
\' 輸出'
\" 輸出"
\\ 輸出\
\nnn 輸出八進位ASCII字元
\xNN 輸出十六進位ASCII字元
\f 換頁
\n 換行
\r 游標到目前的行開頭
\t 到下一個定位點
\' 輸出'
\" 輸出"
\\ 輸出\
\nnn 輸出八進位ASCII字元
\xNN 輸出十六進位ASCII字元
2009年9月17日 星期四
PDF-XChange Viewer PDF快速啟動閱讀
除了Adobe Reader之外,許多人會用免費軟體Foxit Reader來看PDF,
Foxit Reader支援中文沒那麼強,而且沒有分頁瀏覽
PDF-XChange Viewer PDF功能很強大,但我用不到那麼多,
速度快有分頁功能,中文支援強,這很好用
參考文章(下載):PDF-XChange Viewer 免安裝中文版 ##ShowAll##
Foxit Reader支援中文沒那麼強,而且沒有分頁瀏覽
PDF-XChange Viewer PDF功能很強大,但我用不到那麼多,
速度快有分頁功能,中文支援強,這很好用
參考文章(下載):PDF-XChange Viewer 免安裝中文版 ##ShowAll##
C/C++筆記-逗號運算子
/* ,運算子是敘述結合,同等於{} */
if (total < 0) {
std::cout << "You owe nothing\n" ;
total = 0 ;
}
// 上面敘述同等於
if (total < 0)
std::cout << "You owe nothing\n", total = 0;
/* 常用在for迴圈內 */
for(two=0,three=0; two<10; two+=2,three+=3)
std::cout << two+three ;
##ShowAll##
StickyPad 備忘桌面貼 (支援鬧鐘)
以前都用記事本備忘,
還是用個好看絢麗的桌面貼
快速鍵:視窗鍵+N
參考文章(下載):StickyPad 漂亮、好用的備忘錄桌面貼
2010/03 note
Windows 7有內建便條籤,就不需要了
2010/12 note
其他相似軟體Stickies、hott notes、Sticker
還是用個好看絢麗的桌面貼
快速鍵:視窗鍵+N
參考文章(下載):StickyPad 漂亮、好用的備忘錄桌面貼
2010/03 note
Windows 7有內建便條籤,就不需要了
2010/12 note
其他相似軟體Stickies、hott notes、Sticker
C/C++筆記-memset動態配置記憶體
memset是在標準程式庫中,用組合語言撰寫
執行速度會較快且簡易,但只用在部分情況
memset是少見的記憶體配置方法
執行速度會較快且簡易,但只用在部分情況
memset是少見的記憶體配置方法
//calloc配置記憶體方法
foo_var = (struct foo*)calloc(3, sizeof(foo));
//等同於下列,此程式碼將結構內容清除為0
memset(foo_var, '\0', sizeof(foo)*3);
##ShowAll##
2009年9月12日 星期六
C/C++筆記-main的命令列引數
//main的引數是指外部傳給main函數的引數
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
printf("argc = %d\n",argc); //argc會傳回引數的個數
for(int i=0;i<argc;i++)
printf("%s\n",argv[i]); //*argv[]儲存成字元陣列
system("pause");
}
##ReadMore##
範例:
輸入命令:print_file -v -l 40
命令引數會放在argv[0]、argv[1]、argv[2]、argv[3]
argc為4
argv[1]可拆成argv[1][0]='-'和argv[1][1]='v'
PS:
引數中有數字,可利用atoi將字串轉為整數
atoi(&argv[1][2]);
C/C++筆記-union聯合,使用同一塊記憶體
union成員是共用一個記憶體空間,只能設定一個成員
union value {
long int i_value;
float f_value;
}data;
main() {
data.f_value = 5.0;
data.i_value = 3; //data.f_value內容被刪除
data.f_value = 5.5; //data.i_value內容被刪除
}
##ShowAll##
C/C++筆記-代表null的字元
char name[6];
name[0] = 'J';
name[1] = 'a';
name[2] = '\0';
name[3] = 'e';
name[4] = 's';
name[5] = 'm';
printf("%s",name);
畫面只會輸出Ja,讀到'\0'會認定字串已結束
##ShowAll##
C/C++筆記-getchar()、putchar()輸出入字元
//輸入一個字元,會傳回該字元的ASCII值,若發生錯誤會回傳EOF
int getchar(void)
//若輸出成功,會傳回該字元的ASCII值,若發生錯誤會回傳EOF
int putchar(int ch)
C/C++筆記-strcpy複製字串
//連同'\0',from字串複製到to字串
strcpy(char *to, const char *from)
strncpy(char *to, const char *from, size_t len)
C/C++筆記-strcat連結字串
//str1之後接str2
strcat(char *str1, const char *str2)
strncat(char *str1, const char *str2, size_t len)
C/C++筆記-strcmp比較字串
strcmp(const char *str1, const char *str2)
strncmp(const char *str1, const char *str2, size_t len)
/* 相等傳回0,小於傳回負數,大於傳回正數 */
C/C++筆記-前置處理器#define
//取消先前#define定義
#undef
#if
#else
#endif
//如果已被定義
#ifdef
#endif
//如果未被定義,則去定義
#ifndef
#define
#endif
//顯示程式名稱與行數等錯誤訊息
#if
#error "wrong"
#endif
##ShowAll##
C/C++筆記-檔案內字串搜尋程式碼
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define fn "textfile.txt"
int search(FILE*,char *);
int main(void)
{
int last=0;
char buf[80];
FILE *fp;
fp = fopen(fn,"r+");
scanf("%s",buf); //輸入要找的字串
while(1)
{
int line = search(fp,buf);
if(line)
printf("%s found in line %d.\n",buf,line+last);
else
break;
last += line; //更新目前計算的行數
}
fclose(fp);
system("pause");
return 0;
}
int search(FILE *fp,char *s)
{
int i,j=0;
char buf[80];
for(i=1 ; fgets(buf,80,fp) != NULL ; i++)
if(strstr(buf,s) != NULL) //從buf字串中找s字串
return i;
return 0;
}
##ShowAll##
C/C++筆記-fseek()、ftell()、rewind()變更串流內的位置函數
/*
會從指定的origin位置移動offset個位元組
origin定義:
SEEK_SET,串流開始位置
SEEK_CUR,串流目前位置
SEEK_END,串流結束位置
若更改成功則傳回0值
*/
int fseek(FILE *fp, long offset, int origin);
/* 回傳串流目前位置,發生錯誤傳回-1 */
long ftell(FILE *stream);
/* 將串流的目前位置設為該串流的開頭 */
void rewind(FILE *stream);
##ShowAll##
C/C++筆記-fread()、fwrite()輸出入二進制串流
//數值不必轉為字元形式,效率較優勢
fread(void *buffer, size_t size, size_t num, FILE *fp);
/*
代表讀取num個大小為size的位元組,
之後存入buffer陣列(任意型態),
最後回傳成功讀取的資料數,
檢查回傳值是否等於num值則成功
*/
int n=999;
FILE *fp;
//開啟為二進位檔
if((fp = fopen("binfile","wb")) == NULL) exit(1);
//寫入一個整數999到檔案
if(fwrite(&n, sizeof(int), 1, fp) != 1) exit(1);
fclose(fp);
##ShowAll##
C/C++筆記-fprintf()、fscanf()輸出入串流
//與printf()、scanf()函數功能相同
fprintf(FILE *fp, char *control string, arguments...);
fscanf()(FILE *fp, char *control string, arguments...);
C/C++筆記-fgets()、fputs()輸出入字串
char buf[80];
FILE *fp;
if((fp = fopen("textfile","r")) == NULL) exit(1);
while((ch = fgets(buf,80,fp)) != NULL) //一次讀取一行,一行不超過80個字元
fput(buf,stddout); //將字串輸出到螢幕
fclose(fp);
##ShowAll##
2009年9月11日 星期五
C/C++筆記-fgetc()、fputc()輸出入字元
FILE *fp;
if((fp = fopen("textfile","r")) == NULL) exit(1);
while((ch = fgetc(fp)) != EOF) //將字元一個個讀入
fput(ch,stddout); //將字元一個個輸出到螢幕
fclose(fp);
##ShowAll##
C/C++筆記-指標多重間接參照
/*
* 指標本身也是有記憶體位址,
* 所以宣告一個指向指標形態變數的指標是合法的
*/
int **pp,*p,x=5;
pp = &p;
p = &x;
**pp = 10; //最後x值是10
##ShowAll##
C/C++筆記-顯示檔案內容並計算字數程式碼
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int i;
File *fp;
char f[10],buf[80]; //檔名不超過10個字母,一行不超過80字元
scanf(%s,f);
if((fp = fopen(f,"r")) == NULL) exit(1);
while(fgets(buf,80,fp)) != NULL)
fputs(buf,stdout); //將檔案一行行輸出
printf("\n");
rewind(fp); //將串流fp指回檔案開頭
for(i=0;;i++)
if(fscanf(fp,"%s",buf) == EOF)
break;
fclose(fp);
system("pause");
return 0;
}
##ShowAll##
C/C++筆記-指標意義、指標運算、陣列指標
//&運算子的意義為:取得變數的記憶體位址
//*運算子的意義為:取得變數的記憶體值
int *ptr,a;
ptr = &a;
ptr++; //將指標ptr指向變數a的後4個bytes
ptr = ptr - 20; //將指標ptr指向變數a的後20*4個bytes
int *ptr,a[10];
ptr = a+5;
printf(%d %d,*a,*ptr) //會印出陣列a[0]的數值和a[5]的數值
##ShowAll##
C/C++筆記-typedef用法
typedef int width;
相似#define width int
但typedef可定義更複雜的物件
##ReadMore##
使用範例:
相似#define width int
但typedef可定義更複雜的物件
##ReadMore##
//使用在陣列上
typedef int group[10];
group totals;
for(i=0; i<10; ++i)
totals[i] = 0;
使用範例:
//typedef 舊型態名稱 新型態名稱
typedef unsigned int pint;
pint a; //a的型態等同於unsigned int
typedef struct snake {
int head;
int tail;
int body;
}SNAKE;
SNAKE sn1; //等同於struct snake宣告
C/C++筆記-realloc重新配置記憶體空間
int *p;
p = (int *)malloc(sizeof(int) * 5);
p = (int *)realloc(p, sizeof(int) * 10); //將記憶體空間變大
C/C++筆記-malloc動態配置記憶體
/* 配置一個int大小的記憶體空間 */
int *p;
p = (int *)malloc(sizeof(int));
/* 配置一個struct大小的記憶體空間 */
struct ex{
int a;
char[2];
};
struct ex *p;
p = (struct ex *)malloc(sizeof(struct ex));
free(p); //釋放記憶體
##ShowAll##
C/C++筆記-fopen()、fclose()開關檔
//開檔
FILE *fp;
if((fp = fopen("file","r")) == NULL)
{
printf("file open error!\n");
}
//關檔
fclose(fp);
/*---開檔模式---*/
//[讀、寫、附加]
//"r", "w", "a"
//[讀、寫、附加,二進位模式]
//"rb", "wb", "ab"
//[不存在回傳NULL、存在刪除原檔、不存在建立新檔,皆可讀可寫]
//"r+", "w+", "a+"
//[不存在回傳NULL、存在刪除原檔、不存在建立新檔,皆可讀可寫,二進位模式]
//"rb+", "wb+", "ab+"
##ShowAll##
2009年9月10日 星期四
Google閱讀器 RSS訂閱文章
之前是用GreatNews軟體來訂閱Blog文章,
但後來發現不夠方便,只能在單一主機上使用,
常常要往來不同電腦,還是要用Google的雲端技術比較好
而且除了最新文章之外,還可以撈到之前的所有舊文章,
這一點就比其他RSS訂閱軟體還要好了
連結網址:Google閱讀器
參考文章:如何用Google Reader訂閱部落格RSS?
但後來發現不夠方便,只能在單一主機上使用,
常常要往來不同電腦,還是要用Google的雲端技術比較好
而且除了最新文章之外,還可以撈到之前的所有舊文章,
這一點就比其他RSS訂閱軟體還要好了
連結網址:Google閱讀器
參考文章:如何用Google Reader訂閱部落格RSS?
Lingoes靈格斯 免費翻譯軟體
大陸製的,很賊地同時集合其他軟體的翻譯辭典
除了內建幾個翻譯辭典外,
還有非常大量的外掛補充包,什麼都有,
Google翻譯、Yahoo翻譯、譯點通翻譯、、、
也因此確實比Dr.Eye好用了
辭典補充包:詞典庫
參考文章(下載):靈格斯翻譯家 Lingoes Translator 免安裝中文版
##ShowAll##
除了內建幾個翻譯辭典外,
還有非常大量的外掛補充包,什麼都有,
Google翻譯、Yahoo翻譯、譯點通翻譯、、、
也因此確實比Dr.Eye好用了
辭典補充包:詞典庫
參考文章(下載):靈格斯翻譯家 Lingoes Translator 免安裝中文版
##ShowAll##
2009年9月4日 星期五
VirtualBox 免費虛擬作業系統
比VMware幾百MB相比,這小巧的太多了,而且免費
介面簡潔,功能齊備,簡單易操作,從此不用VMware了
一些常用附加功能簡易說明:
參考文章(下載):VirtualBox 中文版
簡易教學:VirtualBox v3.0.4 虛擬電腦,練重灌、測軟體、玩病毒,不怕搞壞電腦!
詳細教學:VirtualBox2.1 使用心得(2.2另外附註說明)
其他教學:虛擬LINUX下,放大縮小調整螢幕
虛擬LINUX下,與實體OS共享資料夾
(註:共享資料夾,不能與掛載文件夾的名稱相同)
介面簡潔,功能齊備,簡單易操作,從此不用VMware了
一些常用附加功能簡易說明:
- 虛擬LINUX,放大縮小調整螢幕 =>
安裝VirtualBox客戶端軟體即完成 - 虛擬LINUX,與實體OS共享資料夾=>
root身份下輸入mount -t vboxsf sourcefolder targetfolder - 虛擬WINDOWS,用VirtualBox共享資料夾
我的電腦 > 右鍵 > 連接網路磁碟機 > 瀏覽 > 點選共享的資料夾
參考文章(下載):VirtualBox 中文版
簡易教學:VirtualBox v3.0.4 虛擬電腦,練重灌、測軟體、玩病毒,不怕搞壞電腦!
詳細教學:VirtualBox2.1 使用心得(2.2另外附註說明)
其他教學:虛擬LINUX下,放大縮小調整螢幕
虛擬LINUX下,與實體OS共享資料夾
(註:共享資料夾,不能與掛載文件夾的名稱相同)
piaip AppLocale (Microsoft AppLocale修改版本) 解決軟體亂碼
使用簡體軟體會有亂碼,可用Microsoft AppLocale來解決
而piaip AppLocale修改了一些Microsoft AppLocale的亂碼問題
參考文章(下載):pAppLocale
而piaip AppLocale修改了一些Microsoft AppLocale的亂碼問題
參考文章(下載):pAppLocale
2009年9月1日 星期二
2009年8月22日 星期六
用IE快速登入FTP
網址列輸入 => ftp://[帳號]:[密碼]@[FTP位址]
EX.
帳號:acc
密碼:pass
FTP:127.0.0.1
=> ftp://acc:pass@127.0.0.1/
##ShowAll##
EX.
帳號:acc
密碼:pass
FTP:127.0.0.1
=> ftp://acc:pass@127.0.0.1/
##ShowAll##
2009年8月15日 星期六
在Blogger上,使用彩色漸層標籤雲
標籤雲的文章很多,想要用得越漂亮,步驟越複雜
我用了一個簡單不華麗的標籤雲
網路上教學文章一堆,但是教學文章是要寫給不會用的人看的,
莫名其妙少了一個步驟,或一堆寫得不清不楚的,寫來幹麻啊!
下面是我參考的一篇寫得夠清楚正確的
參考文章:三步驟把blogger的標籤,改造成標籤雲(Tag Cloud)
補充:
在參考文章中的步驟3,"找到這一列程式碼 (注意, 後面是 /> 結束哦!)"
如果沒有在樣板程式碼中看到"/>",
必須先儲存,再將"展開小裝置範本"的打勾先取消
備註:節錄一段程式碼,是用在我Blogger中所做的變數設定
我用了一個簡單不華麗的標籤雲
網路上教學文章一堆,但是教學文章是要寫給不會用的人看的,
莫名其妙少了一個步驟,或一堆寫得不清不楚的,寫來幹麻啊!
下面是我參考的一篇寫得夠清楚正確的
參考文章:三步驟把blogger的標籤,改造成標籤雲(Tag Cloud)
補充:
在參考文章中的步驟3,"找到這一列程式碼 (注意, 後面是 /> 結束哦!)"
如果沒有在樣板程式碼中看到"/>",
必須先儲存,再將"展開小裝置範本"的打勾先取消
備註:節錄一段程式碼,是用在我Blogger中所做的變數設定
var maxFontSize = 20; //最大字型
var maxColor = [255,64,64]; //漸層起始顏色
var minFontSize = 10; //最小字型
var minColor = [255,127,0]; //漸層結束顏色
var lcShowCount = true; //顯示文章篇數
C/C++筆記-calloc動態配置記憶體
與malloc功能相似,但會初始化為0,常用來配置陣列
##ShowAll##
/* 配置10 * int 大小的記憶體空間 */
int *p;
p = (int *)calloc(10, sizeof(int)); //需傳兩個參數
##ShowAll##
C/C++筆記-變數儲存類別
變數儲存類別
1.extern
2.register
3.static
4.const
##ShowAll##
1.extern
extern int a;
// 代表變數a是另一個檔案所宣告的變數
2.register
register int i;
// 變數i存取會較快
3.static
static int x=0;
// 在不同區域重複命名,都是共用同一個變數x
4.const
const x=1;
// 常數x值無法變更
##ShowAll##
C/C++筆記-函數的指標
函數也在記憶體中,所以指標也可以指向函數
int add(int,int);
int add(int,int);
int main(void)
{
int ans, (*p)(int x, int y); //宣告函數指標p
p = add; //將p指向函數add
ans = (*p)(3,4) //間接呼叫add函數
printf("%d",ans);
}
void add(int x,int y)
{
returb x+y;
}
##ShowAll##
C/C++筆記-檔案複製程式碼
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char ch;
char src[] = "file1.txt";
char dst[] = "file2.txt";
File *from,*to;
if((from = fopen(src,"rb")) == NULL) exit(1);
if((to = fopen(dst,"wb")) == NULL) exit(1);
while(fread(&ch,sizeof(ch),1,from) != 0)
fwrite(&ch,sizeof(ch),1,to);
fclose(from);
fclose(to);
system("pause");
return 0;
}
##ShowAll##
C/C++筆記-struct結構用法
struct animal { //結構名稱可省略,但就不能再建此結構
char name[10];
int sex;
}dog; //變數名稱可省略,之後再另行建立
宣告 =>
struct animal cat,pig[5];
指標宣告 =>
struct animal *kitty=cat;
C++予許省略struct保留字
C/C++筆記-結構傳遞與回傳結構
int cmp(struct animal s1, struct animal s2)
{
return s1.sex == s2.sex;
}
struct animal getinfo(void)
{
struct anumal temp;
gets(temp.name);
scanf("%d",&temp.sex);
return temp;
}
##ShowAll##
C/C++筆記-將指標傳遞進函式
void func(int*,int);
int main(void)
{
int x=0,*p;
p = &x;
func(p,3); //Call-by-Reference
printf("x = %d",x);
}
void func(int *p,int y)
{
*p = y;
}
##ShowAll##
C/C++言筆記-將陣列傳遞進函式
void func(int a[])
{
int temp = a[1];
}
int main(void)
{
int a[2]={3,6};
func(a);
}
/*
* 若是多維陣列,第一個陣列要給予數字才能索引
* int a[10][10]; 合法
* int a[10][]; 合法
* int a[][]; 不合法
*/
##ShowAll##
2009年8月14日 星期五
ClearType Tuner 讓螢幕字體更好看
使螢幕字體更清晰好看
Vista以上作業系統的就不需要了
參考文章(下載):ClearType Tuner 讓LCD字體更好看!
2010/07 note
Windows 7有內建此軟體並預設好了
##ShowAll##
Vista以上作業系統的就不需要了
參考文章(下載):ClearType Tuner 讓LCD字體更好看!
2010/07 note
Windows 7有內建此軟體並預設好了
##ShowAll##
2009年8月10日 星期一
miroKo BT代抓,下載秒殺
miroKo是個非常快速下載的BT代抓免費空間,號稱秒殺BT
操作有點複雜,不易上手
空間只有5GB,一次只能抓一個BT檔,而且無法勾選要下載的檔案
但如果檔案是比較熱門的,往往都已經抓好了,就不用再抓了
直接就可下載,下載速度每秒可達3~4M
網路上想抓的熱門檔案,幾乎都已抓好
不必再去慢慢等BT軟體載好
下載頁面:miroKo
參考文章:miroko-免費5GB網路硬碟BT代抓
2010/07 note
從今日開始,全面收費,沒有免費可用了 = =
操作有點複雜,不易上手
空間只有5GB,一次只能抓一個BT檔,而且無法勾選要下載的檔案
但如果檔案是比較熱門的,往往都已經抓好了,就不用再抓了
直接就可下載,下載速度每秒可達3~4M
網路上想抓的熱門檔案,幾乎都已抓好
不必再去慢慢等BT軟體載好
下載頁面:miroKo
參考文章:miroko-免費5GB網路硬碟BT代抓
2010/07 note
從今日開始,全面收費,沒有免費可用了 = =
新酷音輸入法 非常準確的自動選字
只會新注音的我,用過自然輸入法和雅虎輸入法
新酷音輸入法,選字選的更準確
幾乎不用再讓我選字了
參考文章(下載):新酷音輸入法
note 2011/08
若安裝64bit系統,一定要另外再安裝修正檔
參考文章 => 解決新酷音於 Windows 7 64位元的 IE 無法輸入的問題
##ShowAll##
新酷音輸入法,選字選的更準確
幾乎不用再讓我選字了
參考文章(下載):新酷音輸入法
note 2011/08
若安裝64bit系統,一定要另外再安裝修正檔
參考文章 => 解決新酷音於 Windows 7 64位元的 IE 無法輸入的問題
##ShowAll##
FileZilla FTP上傳下載
可連上FTP伺服器上傳下載,
小巧簡易的免安裝綠色版,且支援unicode
預設顯示編碼為unicode,若想改為BIG5編碼的方法:
Filezilla在站台管理員的字碼集選擇「使用自訂碼集」,手動輸入BIG5
參考文章(下載):FileZilla Portable
##ShowAll##
小巧簡易的免安裝綠色版,且支援unicode
預設顯示編碼為unicode,若想改為BIG5編碼的方法:
Filezilla在站台管理員的字碼集選擇「使用自訂碼集」,手動輸入BIG5
參考文章(下載):FileZilla Portable
##ShowAll##
TheWorld 世界之窗IE核心瀏覽器
note 2011/08
由於該軟體被360收購,更新很慢
官網遲遲不修復,軟體也持續有BUG,
不建議再去使用,如要使用,建議版本用3.3.0.8
網頁瀏覽器就用這套吧!
這是我用過最快速好用的瀏覽器了
目前最新3.x.x.x版本,仍不斷再更新
強大好用的功能直接就內嵌在瀏覽器裡,不用再另外找外掛
速度絕對快,功能又強大,而且又是免安裝的綠色軟體
另一大優點是採多程序頁面管理,所以幾乎沒有網頁假死問題
另外還有網路書籤的功能
雖然一開始的設定很繁瑣,但設定好後就很好用了
缺點是目前外掛尚未提供讓人開發,所以特定外掛不多
maxthon傲遊瀏覽器,內核也是IE
而且外掛還不錯,擋廣告的能力強
但最大缺點是是單程序管理,會有網頁假死問題,
在各各方面也都不如世界之窗
火狐的缺點蠻明顯的,有些網頁只有用IE才能開啟
雖然有大量的外掛好用,但裝太多外掛,開啟速度就被拖得很慢
IE的缺點就不用說了,什麼都不好用
參考文章(下載):世界之窗瀏覽器免安裝中文版
由於該軟體被360收購,更新很慢
官網遲遲不修復,軟體也持續有BUG,
不建議再去使用,如要使用,建議版本用3.3.0.8
網頁瀏覽器就用這套吧!
這是我用過最快速好用的瀏覽器了
目前最新3.x.x.x版本,仍不斷再更新
強大好用的功能直接就內嵌在瀏覽器裡,不用再另外找外掛
速度絕對快,功能又強大,而且又是免安裝的綠色軟體
另一大優點是採多程序頁面管理,所以幾乎沒有網頁假死問題
另外還有網路書籤的功能
雖然一開始的設定很繁瑣,但設定好後就很好用了
缺點是目前外掛尚未提供讓人開發,所以特定外掛不多
maxthon傲遊瀏覽器,內核也是IE
而且外掛還不錯,擋廣告的能力強
但最大缺點是是單程序管理,會有網頁假死問題,
在各各方面也都不如世界之窗
火狐的缺點蠻明顯的,有些網頁只有用IE才能開啟
雖然有大量的外掛好用,但裝太多外掛,開啟速度就被拖得很慢
IE的缺點就不用說了,什麼都不好用
參考文章(下載):世界之窗瀏覽器免安裝中文版
YouTube Downloader HD 簡便下載YouTube影片
網路上雖然很多方法,
但因為我時常要下載,
用這個軟體比較方便又免安裝,
官方下載:YouTube Downloader HD
參考文章:YouTube Downloader HD 下載YouTube高畫質影片
2010/03 note
用過幾種下載youtube影片的方法,就算是HQ畫質,載下來後影片還是很模糊
後來用JDownloader,它可以載到近似於Youtube網站上的畫質
但因為我時常要下載,
用這個軟體比較方便又免安裝,
官方下載:YouTube Downloader HD
參考文章:YouTube Downloader HD 下載YouTube高畫質影片
2010/03 note
用過幾種下載youtube影片的方法,就算是HQ畫質,載下來後影片還是很模糊
後來用JDownloader,它可以載到近似於Youtube網站上的畫質
2009年8月9日 星期日
免軟體,快速擷取視窗桌面
若要擷取整個螢幕畫面,直接點選鍵盤上[PrtScr]鍵
若只要擷取視窗畫面則按[Alt]+[PrtScr]
之後再到小畫家按"貼上"即可
2010/07 note
Windows 7,有內建簡便的螢幕剪取工具
##ShowAll##
若只要擷取視窗畫面則按[Alt]+[PrtScr]
之後再到小畫家按"貼上"即可
2010/07 note
Windows 7,有內建簡便的螢幕剪取工具
##ShowAll##
在文章中顯示程式碼,加上顏色和框架
比較常見的有兩種方法,為了搞這個,花了點時間
原先是用SyntaxHighlighter的外掛來顯示程式碼,
因為他的樣式比較好看,
但在Blogger使用,會遇到一些奇怪的問題,
我一直弄不出來,不想再debug了,就用另一個方法了
不過要顯示程式碼仍然是相當繁雜的工作
(一)加上框架
步驟一
先在Blogger中找到版面配置->修改html
在html樣板程式碼內搜尋到/* Variable definitions這一行
將下方的程式碼貼在/* Variable definitions上方
步驟二
在文章中將程式碼置於<code class="ref">程式碼</code>區塊中即可
參考文章:[筆記]在文章裡顯示優質的程式碼區
(二)加上顏色
前面步驟已將框架完成了,若想將程式碼加上顏色,可接著繼續做下列方法
步驟一
在html樣板程式碼內搜尋到;<head;>這一行
將下方的程式碼貼在;</head;>上方
繼續搜尋 <body>,將其直接改成<body onload='prettyPrint()'>
步驟三
在文章中將程式碼置於<code class="prettyprint">程式碼</code>區塊中即可
參考文章:在 Blogger 中使用 google-code-prettify 顯示程式碼
(三)備註
在撰寫持程式碼時,會有一些特殊符號,需改寫成html能夠接受的代碼
"&"寫成"&"
"<"寫成"<"
">"寫成">"
" "寫成" "
(四)完成範例
將上述兩個方法合併即可讓程式碼有框架和顏色地顯示,
在文章中將程式碼置於<code class="prettyprint">程式碼</code>區塊中即可
2010/08 note
另一個搭配Windows Live Writer來撰寫程式碼的方法,在文章中漂亮地張貼程式碼
原先是用SyntaxHighlighter的外掛來顯示程式碼,
因為他的樣式比較好看,
但在Blogger使用,會遇到一些奇怪的問題,
我一直弄不出來,不想再debug了,就用另一個方法了
不過要顯示程式碼仍然是相當繁雜的工作
(一)加上框架
步驟一
先在Blogger中找到版面配置->修改html
在html樣板程式碼內搜尋到/* Variable definitions這一行
將下方的程式碼貼在/* Variable definitions上方
CODE { display: block; /* fixes a strange ie margin bug */ font-family: Courier New; font-size: 8pt; overflow:auto; background: #f0f0f0 url(http://klcintw.images.googlepages.com/Code_BG.gif) left top repeat-y; border: 1px solid #ccc; padding: 10px 10px 10px 21px; max-height:200px; line-height: 1.2em; }
步驟二
在文章中將程式碼置於<code class="ref">程式碼</code>區塊中即可
參考文章:[筆記]在文章裡顯示優質的程式碼區
(二)加上顏色
前面步驟已將框架完成了,若想將程式碼加上顏色,可接著繼續做下列方法
步驟一
在html樣板程式碼內搜尋到;<head;>這一行
將下方的程式碼貼在;</head;>上方
<link href='http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.css' rel='stylesheet' type='text/css'/><script src='http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.js' type='text/javascript'/>步驟二
繼續搜尋 <body>,將其直接改成<body onload='prettyPrint()'>
步驟三
在文章中將程式碼置於<code class="prettyprint">程式碼</code>區塊中即可
參考文章:在 Blogger 中使用 google-code-prettify 顯示程式碼
(三)備註
在撰寫持程式碼時,會有一些特殊符號,需改寫成html能夠接受的代碼
"&"寫成"&"
"<"寫成"<"
">"寫成">"
" "寫成" "
(四)完成範例
將上述兩個方法合併即可讓程式碼有框架和顏色地顯示,
在文章中將程式碼置於<code class="prettyprint">程式碼</code>區塊中即可
#include <stdio.h>
void main()
{
int a=10, b=20;
printf("%d",a+b);
}
2010/08 note
另一個搭配Windows Live Writer來撰寫程式碼的方法,在文章中漂亮地張貼程式碼
2009年8月7日 星期五
C/C++筆記-enum列舉
//預設起始值從0開始,也可指定值
enum people {female,male=2} mary;
mary = female;
if(mary == male)
printf("mary is a woman");
##ShowAll##
訂閱:
文章
(
Atom
)