2009年12月29日 星期二

Teamview 簡便的遠端桌面軟體

一個簡單易用的遠端桌面軟體,
不需註冊也不需要知道對方IP位址,可突破防火牆封鎖
就可遠端連線控制對方電腦或讓對方遠端控制自己電腦
也可作兩台電腦間的檔案傳輸

參考文章(下載):Teamviewer 免安裝中文版
##ShowAll##

2009年12月22日 星期二

Prolog筆記-QuickSort

補充:我知道寫Prolog程式的人,大腦會抽筋打結,因為我就是。
          這題目答案是抄錄的,僅供參考,拿來交作業是沒有用的,
          當初我交出去的作業程式碼也不是這一個,謝謝同學光臨!

Prolog語言是logic language,
用來寫AI,雖然很不好上手,但搞懂後覺得蠻有興趣的,
但畢竟沒有從基礎學起,還是不知道怎麼寫

使用軟體:SWI-Prolog

題目:用Prolog寫QuickSort演算法
          可能使用到的封裝 =>
          Sort([], []).
          Sort([X], [X]).
          Sort([A,B|X], Y]).

作法描述:
輸入一連串數字的陣列,由qsort以遞迴呼叫來處理,
編譯器會先取陣列第一個數字來當基準值,將陣列傳入到divide,
所有數字都會與這個基準值做比對,
小於基準值的數放到左邊陣列Ls,大於基準值的數右邊陣列Rs,
當Ls和Rs都得到之後,兩個陣列也繼續分別做qsort處理,直到陣列為空,
回傳時,是把左邊陣列右邊陣列結合到一個新陣列,而這個陣列就是已經排序好的陣列。
q => 即quicksort,排序一串數字陣列
divide => 將數字陣列做比對後,完成左右分割
combine => 將左、右陣列合併

答案:
q([], []).
q([Head|List], Sort) :-
  divide(Head, List, L, R), q(L, Out_L), q(R, Out_R), combine(Head, Out_L, Out_R, Sort).

divide(Head, [], Ls, Rs).
divide(Head, [T_Head|Tail], [T_Head|Ls], Rs) :-
  T_Head =< Head, divide(Head, Tail, Ls, Rs). divide(Head, [T_Head|Tail], Ls, [T_Head|Rs]) :-   T_Head > Head, divide(Head, Tail, Ls, Rs).

%append()是語言提供的函數,可用來將兩list合併
combine( Head, L, R, Sort) :-
  append(L, [Head|R], Sort).

輸入範例:
q([30,25,50,40,15,45],L).

測試結果:

JAVA筆記-覆寫equals()與hashCode()

之前寫Collection,看到這兩個方法,就很想使用
但要用的近乎人意,卻要很費一番功夫

沒有被覆寫的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的成員變數

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判斷式

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來建立靜態內部類別的實體

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##
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 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##
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 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.
需要使用迂迴的方式去找出實體類別間的對應關係,
所以與抽象類別的速度相比之下較為緩慢

介面與類別一起使用的參考想法 =>
先為了某些機制建立一個介面,然後再設計一個抽象類別實作這個介面

JAVA筆記-abstract class抽象類別,由子類別實作

宣告型式:
[存取修飾元] 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筆記-final的意義

1. final+屬性 => 一經定義後,就不可再變更值(即常數)
2. final+方法 => 不可再被覆寫
3. final+類別 => 不可再被繼承

JAVA筆記-interface介面,解決多重繼承問題

為一種標準、規範,只是做規格、功用的定義宣告
由於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##
/******************
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的參照,所以不能用這兩個相關指令

Adobe Flash Player 看線上影片必備安裝

上網必備,作業系統沒有內建Adobe Flash Player就直接安裝吧!

參考文章(下載):Adobe Flash Player 離線安裝版(內建 IE、Firefox 版及移除工具)

Http File Server(HFS) HTTP的檔案伺服器

類似FTP Server,但這套軟體傳輸速度比較不穩定
基本上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出來才可用
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()

JAVA筆記-物件導向的兩個精神與三個特徵

##ShowAll##

精神
1.抽象化(Abstraction)
2.繼承(Inheritance)

特徵
1.繼承(Inheritance)
2.封裝(Encapsulation)
3.多型(Polymorphism)

2009年11月12日 星期四

JAVA筆記-A Multi-Threaded Server

這支程式好有挑戰性,不但要非常熟悉Thread的運用,
還要解決臨界區間和鎖的問題,
看了好多Multi-Threaded相關的程式碼,
對於設計整個演算法我也思考了好多種變形,
寫完這支程式完後會對分散式計算多點興趣了

補充:關於這個程式碼的不正確性
write client的會做寫入資料的操作,但對於這個操作,
我其實是通知server要寫入什麼資料,
再由server進行實際要寫入的資料,這會加重server的loading,
應該要把寫入資料的操作,寫在write client才好,當然,程式仍可執行

程式下載:Multi-Threaded Server

A Multi-Threaded Server
You are to implement a multi-threaded server that provides shared read/write access to an integer array of size 10.
The server will maintain an array of 10 integers. It will accept two client operations:
read - will return the values of the integers in the array Processes array
write num[10] - will update the values of the integers in the array with the integers in num
Server Threads
main thread
• Receive requests for read or write service
• Create a new thread to service each client request, then loop back to handle the next request.
read/write threads
• Communicate with associated clients. They will need the socket after the main thread has accepted the client.
• Handle concurrency control. That is, once created, it is up to the new read or write thread to determine if it is "safe" to perform the operation.
• Should allow multiple concurrent readers, but exclusive access for writers.
• When a writer finishes writing and there are both readers and writers waiting, the finishing writer should allow the first waiting writer to execute before anyallow the first waiting writer to execute before any waiting readers. If there are no waiting writers, the finished writer should allow all waiting readers to execute concurrently.
• Each read/write thread should perform a busy loop incrementing a local variable from 0 to 2,000,000 before actually doing the reading or the writing of the shared array. Make sure that you put this loop inside the critical section of the thread. This simulates longer service and will therefore introduce more contention for the resource.
The Clients
• You will create a set of clients to exercise the server. „
• You should implement both the writer and reader clients.„
• Clients should loop making their requests several times - Clients should loop making their requests several times -enough to get contention in the server. „
• Clients should print status messages to the screen with an identifier indicating which client that the message came from.„
• On testing, you should create enough clients to fully demonstrate the concurrency control technique that you have implemented.
• With proper concurrency control, the readers should always get an array with all elements having been written by one writer. Your status messages should check this and indicate its validity.

Note: Neither client needs user input. The read client simply does a loop (say 30 times) issuing a read request to the server and printing the results. The write client does a loop (say also 30 times) issuing write requests to the server You(say also 30 times) issuing write requests to the server. You can make the write client to use the loop counter to be the value it writes so that the first time it writes all 1's, the second time all 2's, etc. Then, you should see that the read client gets back 10 uniform values each time (say all 1's the first read, all 2's for the next 3 times, all 10's the next time). The values depend on the interleaving. All we can say is that a single read loop iteration should get the same 10 values back. You can also try putting busy loop or sleep delays in both reader and writer clients if you want to see how it impacts the interleaving and the result.

JAVA筆記-物件導向萬年曆程式

這支程式,是完全用物件導向的觀念來撰寫的
可能題目也不難的關係,所以我自覺物件化寫得很好
以前寫JAVA都像是小孩子寫C一樣,大學真沒學好

程式下載:Calendar


題目:
Implement a calendar class and a calendar_month include the following functionality:
(1) calendar :
     Specify a year, such as 1989
     Specify a print pattern. Pattern a is a 2*6 format, and pattern b is 3*4 format.
(2) calendar_month :
     Assign a year.
     Assign a month.
     Compute dates and fill the dates of each week in the month of the year.
(3) Constraints :
     All the dates are stored in calendar_month.
     All the dates are printed by a method in calendar_month.

實作方法:
CalendarFrame : 使用者介面(輸入年、月、格式)
Calendar : 計算年曆、輸出年曆
Calendar_Month : 計算月曆、輸出月曆


操作介面:


顯示結果:

SML筆記-兩LIST相加

補充:ML比Prolog人性化了一點,
          但就連Google也很難查詢到中文教學
          乖乖看英文吧!

ML語言是functional language,
很不直覺的程式,思考邏輯好難建立起來喔!
而且連本中文教學書都沒有可以讓我學習
臨時抱佛腳,沒從基礎打起,寫得很頭大

使用軟體:SML of New Jersey

題目:
Define a function sumlists: int list * int list -> int list which takes in input two lists of integers and gives as result the list of the sums of the elements in corresponding position in the input lists. The shortest list has to be seen as extended with 0’s.
Examples:
(1) Sumlists([],[]) = []
(2) Sumlists([1,2],[3,4]) = [4,6]
(3) Sumlists([1],[3,4,2]) = [4,4,2]
(4) Sumlists([1,6],[3]) = [4,6]

答案:
fun merge(xs,ys) =
if null(ys) then xs
else hd(xs)+hd(ys)::merge(tl(xs), tl(ys));

fun sumlists(x, y) =
if length(x) >= length(y) then merge(x, y)
else if length(x) < length(y) then merge(y, x) else [];


更簡短的答案:
fun sumlists([],[]) = []
| sumlists(x::xs,y::ys) = (x+y)::sumlists(xs,ys)
| sumlists([],y::ys) = (y)::sumlists([],ys)
| sumlists(x::xs,[]) = (x)::sumlists(xs,[])
;


測試結果:

2009年10月5日 星期一

JAVA筆記-取得陣列個數

int[] i = new int [10];
int len = i.length; //len=10

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,若是內部類別則皆可使用

2009年9月30日 星期三

JAVA筆記-jar包裹classes

包裹classes全部目錄到sample.jar
命令=> 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

JAVA筆記-package和import

file1
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++筆記-#運算子

//參數化巨集,#運算子可將引數變為字串
#define STR(data) #data
STR(hello)

C/C++筆記->>右移運算子

無號數,直接補0,
有號數時,正號補0,負號補1

C/C++筆記-用位元運算判斷奇偶數

if((value & 1) == 0)
  cout << "偶數" ;

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;

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播放器上觀看
吃力不討好的工作,沒錢又被唸動作太慢,超失落的

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轉換字元變整數

//將char型態輸出為整數
signed char = 37;
cout << static_cast(ch);

C/C++筆記-長整數宣告

long int var = 1234L; //加一個L

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',但不影響

2009年9月19日 星期六

C/C++筆記-cstring使用C式字串函式

#include <cstring>
//之後可使用strcpy,strcat,strlen,strcmp...

C/C++語言筆記-系統變數命名

以底線開頭的多為系統變數名稱

C/C++筆記-取得陣列個數

/* 用除法的方式 */
int number = sizeof(array)/sizeof(array[0]);

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++筆記-設定變數初值

int counter(0); //傳統方式int counter = 0

C/C++筆記-寬字元、寬字串使用

/* 使用L自首來指定寬字元 */
wchar_t wide = L'Ω'; //寬字元使用
wstring hello = L"こんにちは";//寬字串使用

C/C++筆記-at安全取得字串字元

/* 安全取得字串第一個字元(避免字串未定義) */
first_ch = name.at(0); //亦同first_ch = name[0];

C/C++筆記-substr取得部份字串

// 取得字串索引位址第5個字元開始,長度為八個字元
sub_string = main_string.substr(5,8);

C/C++筆記-螢幕輸出特殊字元

\b     游標後退一個位元
\f      換頁
\n     換行
\r      游標到目前的行開頭
\t      到下一個定位點
\'       輸出'
\"      輸出"
\\      輸出\
\nnn  輸出八進位ASCII字元
\xNN  輸出十六進位ASCII字元

C/C++筆記-length取得字串長度

length = full_name.length();

2009年9月17日 星期四

PDF-XChange Viewer PDF快速啟動閱讀

除了Adobe Reader之外,許多人會用免費軟體Foxit Reader來看PDF,
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
其他相似軟體Stickieshott notesSticker

C/C++筆記-memset動態配置記憶體

memset是在標準程式庫中,用組合語言撰寫
執行速度會較快且簡易,但只用在部分情況
memset是少見的記憶體配置方法

//calloc配置記憶體方法
foo_var = (struct foo*)calloc(3, sizeof(foo));

//等同於下列,此程式碼將結構內容清除為0
memset(foo_var, '\0', sizeof(foo)*3);
##ShowAll##

Universal Extractor 解壓縮exe安裝檔

可解壓縮一般壓縮檔外,它還可解壓縮軟體安裝檔.exe、.msi、.cab等
這個好,這樣就可直接獲取檔案內部圖片、影片等檔案了

參考文章(下載):Universal Extractor 中文版

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++筆記-用巨集方式,不限型態變數值交換程式碼

#define SWAP(x,y,t) (t=x, x=y, y=t)

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++筆記-stdin、stdout、stderr串流

stdin 標準輸入串流
stdout 標準輸出串流
stderr 輸出串流且系統會留下紀錄檔

C/C++筆記-用scanf,陣列不須加&運算子

用scanf,陣列不須加&運算子

C/C++筆記-getchar()、putchar()輸出入字元

//輸入一個字元,會傳回該字元的ASCII值,若發生錯誤會回傳EOF
int getchar(void)
//若輸出成功,會傳回該字元的ASCII值,若發生錯誤會回傳EOF
int putchar(int ch)

C/C++筆記-字串輸入

鍵盤輸入字串常用gets(str)
因為scanf("%s",str)當遇到空格或換行字元便會結束

C/C++筆記-從s1字串中找到s2字串

char *strstr(const char *s1, const char *s2);

C/C++筆記-strrev將字串倒置

strrev(s1); //將s1字串倒置

C/C++筆記-strcpy複製字串

//連同'\0',from字串複製到to字串
strcpy(char *to, const char *from)
strncpy(char *to, const char *from, size_t len)

C/C++筆記-strlen取得字串長度

size_t strlen(const char *str)

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++筆記-strchr尋找字元

strchr(const char *str, int ch)
strrchr(const char *str, int ch)

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##

C/C++筆記-fgetc將輸入的字元轉整數

char ch;
int num;
num = fgetc(ch) - '0' ;

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##
//使用在陣列上
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?

Lingoes靈格斯 免費翻譯軟體

大陸製的,很賊地同時集合其他軟體的翻譯辭典
除了內建幾個翻譯辭典外,
還有非常大量的外掛補充包,什麼都有,
Google翻譯、Yahoo翻譯、譯點通翻譯、、、
也因此確實比Dr.Eye好用了

辭典補充包:詞典庫
參考文章(下載):靈格斯翻譯家 Lingoes Translator 免安裝中文版
##ShowAll##

2009年9月4日 星期五

VirtualBox 免費虛擬作業系統

比VMware幾百MB相比,這小巧的太多了,而且免費
介面簡潔,功能齊備,簡單易操作,從此不用VMware了
一些常用附加功能簡易說明:
  1. 虛擬LINUX,放大縮小調整螢幕 =>
    安裝VirtualBox客戶端軟體即完成
  2. 虛擬LINUX,與實體OS共享資料夾=>
    root身份下輸入mount -t vboxsf sourcefolder targetfolder
  3. 虛擬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

2009年9月1日 星期二

MagV 免費線上看雜誌

還以為是大陸網站,想不到是繁體中文的,資料蠻豐富的

連結網址:MagV
參考文章:
MagV免費網路看雜誌

2009年8月22日 星期六

用IE快速登入FTP

網址列輸入 => ftp://[帳號]:[密碼]@[FTP位址]
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中所做的變數設定
var maxFontSize = 20; //最大字型
var maxColor = [255,64,64]; //漸層起始顏色
var minFontSize = 10; //最小字型
var minColor = [255,127,0]; //漸層結束顏色
var lcShowCount = true; //顯示文章篇數

樹狀分類產生器

Blogger只有提供標籤,功能上稍顯不足
我的Blogger的Categories,即是用此方法

連結網站:樹狀分類產生器
參考文章:網站、部落格「樹狀分類產生器」

C/C++筆記-calloc動態配置記憶體

與malloc功能相似,但會初始化為0,常用來配置陣列

/* 配置10 * int 大小的記憶體空間 */
int *p;
p = (int *)calloc(10, sizeof(int)); //需傳兩個參數

##ShowAll##

C/C++筆記-變數儲存類別

變數儲存類別
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##

C/C++筆記-#include函式庫

#include <filename> //標準函式庫
#include "filename" //自己撰寫的

2009年8月14日 星期五

ZuneDesktop和Royale,兩款佈景主題

兩套很好看的佈景主題,一黑一藍
黑色的跟Vista的差不多
藍色的佈景主題比較好看

參考文章(下載):微軟提供的 ZuneDesktop 佈景主題(典雅黑)

ClearType Tuner 讓螢幕字體更好看

使螢幕字體更清晰好看
Vista以上作業系統的就不需要了

參考文章(下載):ClearType Tuner 讓LCD字體更好看!

2010/07 note
Windows 7有內建此軟體並預設好了
##ShowAll##

2009年8月10日 星期一

講義王 豐富的職場、行銷、管理投影片網站

有很多職場、行銷、管理的投影片,
當然,網站內豐富的資料不只這些,
但實在太多了,有點不知從何看起,
想看都看不完

連結網址:講義王

sugoideas.com 台灣偶像劇、綜藝節目,高速下載觀看

從2001年開始,琳瑯滿目的台灣偶像劇和綜藝節目,
檔案齊全,下載高速,畫質清晰,
應該是給海外留學生方便用的

連結網址:偶像劇 綜藝節目

無名挖挖挖 搜尋朋友的無名

玩了一下,很強!
無名一點隱私都沒有

連結網址:無名挖挖挖
參考文章:
找朋友、找正妹必備工具 - 無名挖挖挖 + 搜尋技巧大公開

miroKo BT代抓,下載秒殺

miroKo是個非常快速下載的BT代抓免費空間,號稱秒殺BT
操作有點複雜,不易上手
空間只有5GB,一次只能抓一個BT檔,而且無法勾選要下載的檔案
但如果檔案是比較熱門的,往往都已經抓好了,就不用再抓了
直接就可下載,下載速度每秒可達3~4M
網路上想抓的熱門檔案,幾乎都已抓好
不必再去慢慢等BT軟體載好

下載頁面:miroKo
參考文章:
miroko-免費5GB網路硬碟BT代抓
2010/07 note
從今日開始,全面收費,沒有免費可用了 = =

新酷音輸入法 非常準確的自動選字

只會新注音的我,用過自然輸入法和雅虎輸入法
新酷音輸入法,選字選的更準確
幾乎不用再讓我選字了

參考文章(下載):新酷音輸入法

note 2011/08
若安裝64bit系統,一定要另外再安裝修正檔
參考文章 => 解決新酷音於 Windows 7 64位元的 IE 無法輸入的問題
##ShowAll##

GreatNews RSS訂閱文章軟體

簡單好用的RSS訂閱軟體

參考文章(下載):GreatNews 1.0.0.386 免安裝中文版

2010/07 note
Google的閱讀器更好用
##ShowAll##

FileZilla FTP上傳下載

可連上FTP伺服器上傳下載,
小巧簡易的免安裝綠色版,且支援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的缺點就不用說了,什麼都不好用

參考文章(下載):世界之窗瀏覽器免安裝中文版

YouTube Downloader HD 簡便下載YouTube影片

網路上雖然很多方法,
但因為我時常要下載,
用這個軟體比較方便又免安裝,

官方下載:YouTube Downloader HD
參考文章:YouTube Downloader HD 下載YouTube高畫質影片


2010/03 note
用過幾種下載youtube影片的方法,就算是HQ畫質,載下來後影片還是很模糊
後來用JDownloader,它可以載到近似於Youtube網站上的畫質

Everything 極速搜尋電腦內檔案

XP內建的搜尋慢的跟烏龜一樣
Everything可瞬間就搜尋到要找到的檔案,而且免安裝

參考文章(下載):Everything 免安裝中文版

2009年8月9日 星期日

讓XP時鐘顯示今天星期幾

我覺得這樣做很好,馬上知道今天星期幾

參考文章:讓 XP 桌面右下角的時鐘顯示今天星期幾

icolorFolder 好看的彩色漸層資料夾

蠻喜歡的,粉色系漸層資料夾,還可以當作資料分類

參考文章(下載):iColorFolder 中文版

免軟體,快速擷取視窗桌面

若要擷取整個螢幕畫面,直接點選鍵盤上[PrtScr]鍵
若只要擷取視窗畫面則按[Alt]+[PrtScr]
之後再到小畫家按"貼上"即可

2010/07 note
Windows 7,有內建簡便的螢幕剪取工具
##ShowAll##

如何關閉無用的開機啟動程序

簡單關閉無用的開機啟動程序
「執行」命令輸入msconfig,再點選「啟動」標籤
將不想要開機啟動的程式取消勾選

XP桌布自動更換

微軟出的一套非常簡單的桌布自動更換軟體
安裝好後在桌面按滑鼠左鍵,點"內容"即可找到

參考文章(下載):桌布自動換

在文章中顯示程式碼,加上顏色和框架

比較常見的有兩種方法,為了搞這個,花了點時間
原先是用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能夠接受的代碼
"&"寫成"&amp;"
"<"寫成"&lt;"
">"寫成"&gt;"
" "寫成"&nbsp;"


(四)完成範例
將上述兩個方法合併即可讓程式碼有框架和顏色地顯示,
在文章中將程式碼置於<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##