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免費網路看雜誌