搜尋此網誌

2009年12月29日 星期二

String與基本資料型態之間的轉換

Java對於字串處理 功能很強大 有興趣詳細可以參參考 Java api

以下轉自Java world

1. 由 基本資料型態轉換成 String

String 類別中已經提供了將基本資料型態轉換成 String 的 static 方法
也就是 String.valueOf() 這個參數多載的方法

有下列幾種

String.valueOf(boolean b) : 將 boolean 變數 b 轉換成字串

String.valueOf(char c) : 將 char 變數 c 轉換成字串

String.valueOf(char[] data) : 將 char 陣列 data 轉換成字串

String.valueOf(char[] data, int offset, int count) :
將 char 陣列 data 中 由 data[offset] 開始取 count 個元素 轉換成字串

String.valueOf(double d) : 將 double 變數 d 轉換成字串

String.valueOf(float f) : 將 float 變數 f 轉換成字串

String.valueOf(int i) : 將 int 變數 i 轉換成字串

String.valueOf(long l) : 將 long 變數 l 轉換成字串

String.valueOf(Object obj) : 將 obj 物件轉換成 字串, 等於 obj.toString()

用法如:
int i = 10;
String str = String.valueOf(i);
這時候 str 就會是 "10"

2. 由 String 轉換成 數字的基本資料型態

要將 String 轉換成基本資料型態轉
大多需要使用基本資料型態的包裝類別

比如說 String 轉換成 byte
可以使用 Byte.parseByte(String s)
這一類的方法如果無法將 s 分析 則會丟出 NumberFormatException

byte :
Byte.parseByte(String s) : 將 s 轉換成 byte
Byte.parseByte(String s, int radix) : 以 radix 為基底 將 s 轉換為 byte
比如說 Byte.parseByte("11", 16) 會得到 17

double :
Double.parseDouble(String s) : 將 s 轉換成 double

float :
Double.parseFloat(String s) : 將 s 轉換成 float

int :
Integer.parseInt(String s) : 將 s 轉換成 int

long :
Long.parseLong(String s) : 將 s 轉換成 long

用法如:
try
 {  
 String str = "1234";   
int a = Integer.parseInt(str); 
} catch (NumberFormatException e) 
{   System.out.println(" parse int error!!  " + e); }

逐行讀取txt內的內容

import java.io.*;
class FileRead
{
public static void main(String args[])
{
try{
// Open the file that is the first
// command line parameter
FileInputStream fstream = new FileInputStream("textfile.txt");
// Get the object of DataInputStream
DataInputStream in = new DataInputStream(fstream);
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String strLine;
//Read File Line By Line
while ((strLine = br.readLine()) != null) {
// Print the content on the console
System.out.println (strLine);
}
//Close the input stream
in.close();
}catch (Exception e){//Catch exception if any
System.err.println("Error: " + e.getMessage());
}
}
}

2009年12月20日 星期日

Java-時間格式

//產生一個date物件
Date date = new Date();
//格式是年-月-日
//yyyy:代表年 MM:代表月份 dd:代表日 hh:代表時 mm:分 ss:秒
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
//就會根據上述你要的格式 去印出來
System.out.println(dateFormat.format(date));
//這在我論文用到的地方是
//getHtml是用來將後面的網址列的內容抓下來 但這網址有個特點就是帶入年-月-日,因此透過這樣的方法 我可以依據當天我要查得內容 直接抓下來 做分析
System.out.println(URLUtil.getHtml("http://cse.ttu.edu.tw/book/index.php?smode=Daily&caldate="+dateFormat.format(date)+"&SelRoom=04"));

Java-檔案儲存

最近都在趕論文 所以有一段時間沒把論文程式學到的部份放上來 之後再來補充其他的
//指定儲存的位置與檔案名稱
FileWriter out = new FileWriter("c:\\Audiolog.txt",true);
//儲存NO字串 記得要加上\r\n 這樣微軟下開啟txt才會正常
out.write("No"+"\r\n");
out.close();

原因是因為如下:
如果單純用\n來換行,用記事本打開檔案時
會看到原本應該換行的地方變成很多黑色小方塊
換行符號有兩種,一個叫Cr(carriage return),一個是Lf(line feed)
Mac只有Cr
Linux/Unix只有Lf
Windows則是CrLf,兩者皆有
意思是Linux只需要Lf一個字元就可以有換行加移到前面的效果
但是Windows就需要兩個

2009年12月9日 星期三

失眠

已經好久都沒辦法好好的睡一覺 躺著睡覺時 總會一直在想論文哪個部份有問題 要怎麼闡述 要怎麼架構 不然就是常常寫程式寫了一整夜都沒睡覺 有時後躺著會想 程式遇到了什麼問題 就會一直在想要怎麼解決 想到之後 我就想趕快爬起來試試看 運氣好 就是馬上就能解決 運氣不好 弄了一整夜還是不行 已經好久沒辦法出去散散心 也很久沒出去悠閒的約會了 平日+假日都是帶北鼻一起去研究室忙事情 剛好北鼻也是忙研究所的報告 一起加油吧! 忙完~我會帶妳出去玩的^^

2009年12月5日 星期六

Chrome 大改造-增加專屬於自己的套件

今天要介紹的是Google 開發者版,最近越來越多套件能使用了,決定從opera跳槽過來XD
下載

套件1: IE TAB
用途:有些網頁IE Only時,就能使用,非常方便,就不需要另外再開IE
使用方法: 點選圖片的紅框 就能增加在chrome的右上角 要使用的時候 就點一下"e" 就能將網頁
用ie來打開 另外可以用manage list來預先設定什麼網頁要用ie來開

圖片示範1
圖片示範2


套件2: Gmail Checker(其實就是firefox的Gmail Notifier)
用途:當你的gmail有新的信件時,就會自動彈出訊息,告知你有新的信,常在用gmail的人,這是一個非常好用的功能

圖片示範

套件3:自動將簡體網頁轉成繁體
用途:有時候會看到某些網頁是簡體 但是裡面又是你想要看得一些資訊(我寫程式的時候常常要在裡面挖寶XD 沒辦法...台灣對於程式設計的討論風氣 真的很低迷orz..) 這個套件能自動幫您轉成繁體網頁 相當方便 點一下,按加入即可

User Scripts應用: 固定縮放比例
新增套件:下載 (autozoom)
用途:有時螢幕很大 總會覺得螢幕中的字 實在太小 但chrome 又不像opera 或firefox可以固定縮放比例 還必我要按ctrl和滑鼠滾輪 來放大 實在非常麻煩 因此我們用user scripts來解決這個問題 等chrome出套件 當然就用套件囉XD

使用方法: 在C:\ChromePlus1.2.4.0\ChromePlusUserData\Default\ 裡面新建一個User Scripts的資料夾 接著新增一個 script autoPage.user.js為檔名的檔案 接著按右鍵編輯 新增以下的語法

// ==UserScript==
// @name autoPage
// @description page zoom
// @include *
// @exclude
// ==/UserScript==

autoPage();

function autoPage()
{
var zoomLevel=125; // 125指的是 縮放比例125% 可以看您的需求去做調整
zoom(zoomLevel);
}

function zoom(level)
{
var i = parseInt(document.body.style.zoom);
if (isNaN(i)) i=100;
newZoom= i * level / 100;
document.body.style.zoom=newZoom+'%';
}

接著在chrome捷進 增加--enable-user-scripts 請看下圖

圖片示範

書籤工具列:相信很多從各個瀏覽器跳槽過來的人 都會發現一件事 奇怪...怎麼沒書籤按鈕
沒錯...原裝chrome將書籤隱藏起來了 這時我們可以將他叫出來

使用方法:在Chrome的捷進裡面 增加--bookmark-menu 就可以叫出來
以下是我將固定縮放比例 以及 增加書籤按鈕一起啟動的圖片

圖片示範
新增書籤按鈕套件 下載

英文翻譯工具
Bubble Translate 下載

產生goo.gl 短網址工具列 只要開啟想縮短網址的網頁 點一下工具 它會自動幫你產生且複製短網址 非常方便

goo.gl url shortener 下載


還有這邊有相當多的套件網址可以用介紹給大家
網址:
http://www.chromeextensions.org/ (非官方)


2009年11月29日 星期日

好用的firewall


資訊安全是一門非常重要的課題(os:還不是微軟太弱...一堆漏洞..要不是很多軟體需要跑在微軟上..不然我真想投奔Ubuntu..) 一般電腦除了 防毒軟體+防木馬軟體 最好能再加上"防火牆" 這邊要介紹的是 完全免費且輕巧 並且設定上也相當簡單的軟體 它叫做Ghostwall 據說是一群黑客高手所做出來的軟體 其實原理上 他是將所有的port都封鎖 但軟體有先預設一些基本的port有打開 例如80port等 但是一些自行安裝的軟體 我們就必須自己去打開port,例如我打魔獸爭霸要當主機 那就要開啟6112port了 ftp 就要開啟21port等
功能頁面:

Ghostwall主頁:下載與介紹

2009年11月26日 星期四

慘..

臨時要用語音分析的東西 最近看了很多語音訊號的東西 因為要接觸這一塊 是我以前到現在都沒接觸過的 有太多的專有名詞我看不懂 短時間內要會 實在有點困難 看了一些paper 大致了解 要找出特徵 大致都是要經過FFT產生頻譜圖 去看出特徵 目前使用matlab能夠跑出波型圖 但是頻譜圖還不會弄 看到一些資料有什麼sin cos phase 這是什麼 真的看不懂... 問了老包那間的學弟 但他們都還沒弄到這 所以也沒辦法幫忙我什麼 目前的我真是吃力orz...很無助的感覺
畢業時間已經快到 結果我卻卡住了..也難為俊亨了 總覺得我一直再問很基本的問題 一點基礎都沒

2009年11月9日 星期一

Java 計算音源檔音量

我想這應該是很多寫這方面程式的人 都想知道的 由於java 的getlevel有bug 因此沒辦法直接獲取音源的振幅,所以我們必須先瞭解 音源檔的結構 是怎麼組成 必須先繞個彎去計算出振幅 我也是找了好久才找到的 稍微修改一下 就能正常運作 但注意這程式碼是計算出振幅 不是分貝 所以只要找到怎麼將振幅轉換成分貝 加入一行公式 就可以計算出來(目前先停擺..我在寫paper 等有空我再補充進去)
以下是程式碼

public class PCMFilePlayerLeveler implements Runnable {
File file;
AudioInputStream in;
SourceDataLine line;
int frameSize;
byte[] buffer;
Thread playThread;
boolean playing;
boolean notYetEOF;
AudioFormat format;
float level;

final static float MAX_8_BITS_SIGNED = Byte.MAX_VALUE;
final static float MAX_8_BITS_UNSIGNED = 0xff;
final static float MAX_16_BITS_SIGNED = Short.MAX_VALUE;
final static float MAX_16_BITS_UNSIGNED = 0xffff;

public PCMFilePlayerLeveler ()
throws IOException,
UnsupportedAudioFileException,
LineUnavailableException {
File fi= new File("c:\\JDKAudioRecord.wav");
in = AudioSystem.getAudioInputStream (fi);
//in = AudioSystem.getAudioInputStream (new BufferedInputStream (new FileInputStream(f)));
format = in.getFormat();
AudioFormat.Encoding formatEncoding = format.getEncoding();
if (! (formatEncoding.equals (AudioFormat.Encoding.PCM_SIGNED) ||
formatEncoding.equals (AudioFormat.Encoding.PCM_UNSIGNED)))
throw new UnsupportedAudioFileException (
file.getName() + " is not PCM audio");
System.out.println ("got PCM format: " +
format.getChannels() + " channels, " +
format.getSampleSizeInBits() + " bit samples");
frameSize = format.getFrameSize();
System.out.println ("got frame size: ");
DataLine.Info info =
new DataLine.Info (SourceDataLine.class, format);
System.out.println ("got info");
line = (SourceDataLine) AudioSystem.getLine (info);

// figure out a small buffer size
int bytesPerSec = format.getSampleSizeInBits() *
(int) format.getSampleRate();
System.out.println ("bytesPerSec = " + bytesPerSec);
int bufferSize = bytesPerSec / 20;
buffer = new byte[bufferSize];

System.out.println ("got line");
//line.open();
System.out.println ("opened line");
playThread = new Thread (this);
playing = false;
notYetEOF = true;
playThread.start();
}

public void run() {
int readPoint = 0;
int bytesRead = 0;
try {
// while (notYetEOF) {
System.out.println("test");
//if (playing) {
// only write if the line will take at
// least a buffer-ful of data
if (line.available() < buffer.length) {
Thread.yield();
// continue;
}
bytesRead = in.read (buffer,
readPoint,
buffer.length - readPoint);
if (bytesRead == -1) {
notYetEOF = false;
// break;
}
// how many frames did we get,
// and how many are left over?
System.out.println("test");
int frames = bytesRead / frameSize;
int leftover = bytesRead % frameSize;
// calculate level
calculateLevel (buffer, readPoint, leftover);
// if (level > 1)
// System.out.println ("WTF? level = " + level);
// System.out.println ("level: " + level);
// send to line
line.write (buffer, readPoint, bytesRead-leftover);
// save the leftover bytes
System.arraycopy (buffer, bytesRead,
buffer, 0,
leftover);
readPoint = leftover;

/* } else {
// if not playing
// Thread.yield();
try { Thread.sleep (10);}
catch (InterruptedException ie) {}
}*/
// } // while notYetEOF
System.out.println ("reached eof");
line.drain();
line.stop();
} catch (IOException ioe) {
ioe.printStackTrace();
} finally {
// line.close();
}
} // run

/** resets level by finding max value in buffer, taking
into account whether these are 8 or 16 bit values
(doesn't care about mono vs stereo - if one channel
is disproportionately louder than the other, it wins)
*/
private void calculateLevel (byte[] buffer,
int readPoint,
int leftOver) {
int max = 0;
boolean use16Bit = (format.getSampleSizeInBits() == 16);
boolean signed = (format.getEncoding() ==
AudioFormat.Encoding.PCM_SIGNED);
boolean bigEndian = (format.isBigEndian());
if (use16Bit) {
for (int i=readPoint; i int value = 0;
// deal with endianness
int hiByte = (bigEndian ? buffer[i] : buffer[i+1]);
int loByte = (bigEndian ? buffer[i+1] : buffer [i]);
if (signed) {
short shortVal = (short) hiByte;
shortVal = (short) ((shortVal << 8) | (byte) loByte);
value = shortVal;
} else {
value = (hiByte << 8) | loByte;
}
max = Math.max (max, value);
} // for
} else {
// 8 bit - no endianness issues, just sign
for (int i=readPoint; i int value = 0;
if (signed) {
value = buffer [i];
} else {
short shortVal = 0;
shortVal = (short) (shortVal | buffer [i]);
value = shortVal;
}
max = Math.max (max, value);
} // for
} // 8 bit
// express max as float of 0.0 to 1.0 of max value
// of 8 or 16 bits (signed or unsigned)
if (signed) {
if (use16Bit) { level = (float) max / MAX_16_BITS_SIGNED; }
else { level = (float) max / MAX_8_BITS_SIGNED; }
} else {
if (use16Bit) { level = (float) max / MAX_16_BITS_UNSIGNED; }
else { level = (float) max / MAX_8_BITS_UNSIGNED; }
}
System.out.println(level);
} // calculateLevel





public void start() {
playing = true;
if (! playThread.isAlive())
playThread.start();
line.start();
}

public void stop() {
playing = false;
line.stop();
}

public SourceDataLine getLine() {
return line;
}

public File getFile() {
return file;
}

public float getLevel() {
return level;
}
public static void main(String args[]) throws IOException, UnsupportedAudioFileException, LineUnavailableException
{
PCMFilePlayerLeveler calculate= new PCMFilePlayerLeveler();
calculate.start();
//System.out.println("無法錄音,錄音失敗");
//System.out.println(calculate.getLevel());
}
}


Java 用麥克風錄音

===========================只講解主要程式=============================
public void main() throws InterruptedException{
//設定錄完音之後的檔名以及路徑
String Filename = "C://JDKAudioRecord.wav";
File outputFile = new File(Filename);

AudioFormat audioFormat = null;
//設定音源檔的格式
//詳細api請看這 Java sound api
audioFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,
44100.0F, 16, 2, 4, 44100.0F, false);
//DataLine.Info subclass 去取得並且開啟 target data line
DataLine.Info info = new DataLine.Info(TargetDataLine.class,
audioFormat);
TargetDataLine targetDataLine = null;
try{
//從麥克風取得音源
targetDataLine = (TargetDataLine)AudioSystem.getLine(info);
targetDataLine.open(audioFormat);
}catch (Exception e){
System.out.println("無法錄音,錄音失敗");
e.printStackTrace();
System.exit(-1);
}

2009年10月17日 星期六

java-呼叫不同calss的method

由於目前寫得程式 我都把它包在同一個class下去執行 這次我把我要的功能分成兩個class 看起來比較明瞭簡單 順便學習一下
EX:
Server2.java (主要執行的程式)
JDKAudioRecorder.java (執行錄音的程式)


我在server2.java中 加入一段
JDKAudioRecorder s = new JDKAudioRecorder(targetDataLine,targetType,outputFile);
由於在 JDKAudioRecorder的constructor是有引數的 所以在這之前需要事先定義引數
如下:
AudioFormat audioFormat = null;
audioFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,44100.0F, 16, 2, 4, 44100.0F, false);
TargetDataLine targetDataLine = null;
AudioFileFormat.Type targetType = AudioFileFormat.Type.AU;
DataLine.Info info = new DataLine.Info(TargetDataLine.class,audioFormat);
targetDataLine = (TargetDataLine)AudioSystem.getLine(info);
targetDataLine.open(audioFormat);
String Filename = "C://JDKAudioRecord.wav";
File outputFile = new File(Filename);

接著我只要在server2.java中 加入s.main() (main method裡面就能起動整個JDKAudioRecorder.java 要做的事) 因此加入這段就等於把整個JDKAudioRecorder.java執行一次的意思一樣

2009年10月13日 星期二

暫存

最近在處理對聲音判斷其音量大小 目前有點卡關 暫存一些我查到的資訊
似乎是可以利用sample size 和number of channels 來決定此音源的音量大小

Digital audio is stored as a series of samples, where each sample is the amplitude of the sound wave being recorded. The volume of the sound is the same as the amplitude of the sound, therefore, each individual sample is simply encoded as the volume of the sound.

So you break the mic input down into a list of samples (based on the sample size / number of channels) and keep a running average to determine the sound level.

2009年10月7日 星期三

論文後續

情境感知:

(1)被動:
server可以透過google calendar(或其他行事曆的方式),也就是Location+Time,讓server瞭解它所在的地方,是在哪一種情境
ps:但也有可能預定了某個地方是在開會,但卻突然更動,沒有開會,這樣server還能夠用主動的方式,來瞭解它所在的地方是哪種情境

(2)主動:
server可以像人般(有五官)的瞭解它所在的情境在哪
ex:可透過聲音(聲音是否大聲),攝影機(看這個地方人多不多)等

方法:
其他文獻提到,我實驗所歸納的,幾個常見的情境
接著用五官,去分析這幾個情境,看是否能夠分離出來

ex:聲音小聲=>開會、電影院等
聲音大聲=>下課時間等

不知道這樣半年能不能寫的完@@ 囧....

2009年9月3日 星期四

氣餒

感覺論文怎麼樣都寫不好 也不知道自己在做什麼 有點力不從心 現在目標就是趕快把論文完成 同時也要準備預官考試 加油吧!自己

PS:補充一下 學長說的:先進去公司再說 學到了工作經驗 才有機會去談薪水 不管大學或碩士畢業 都是認作剛畢業 並沒有比較強 因為一點工作經驗都沒 不管如何都是要從底層程式設計師慢慢做起 所以程式設計能力的培養蠻重要的 那是基礎 這樣才有機會慢慢往上爬

2009年8月16日 星期日

Symbian-取得目前手機的來電模式狀態

要include以下兩個header檔
mproengengine.h
proengfactory.h
並且 Link ProfileEngine.lib
MProEngEngine* engine = ProEngFactory::NewEngineLC();
TInt activeId( engine->ActiveProfileId() );

如果engine->ActiveProfileId()
return回來為
0- General
1 - Silent
2 - Meeting
3 - Outdoor
4 - Pager
5 – Offline

2009年8月3日 星期一

懂得彎腰

看到一篇文章 裡面提到
愈成熟的麥穗,愈懂得彎腰。或者,我們也可以來 個逆向思考,愈懂得彎腰,才會愈成熟。保持謙虛和擁有成就,也許就像魚與熊掌般難以兼得,但也絕對不是二選一的單選題。只要隨時提醒自己,放下專業的身 段,願意誠懇和比你資淺或職務位階低的人好好溝通,擁有成就的同時,依然可以有謙虛的心胸。
換句話說,有專業素養、也很會做事,的確是成就自我的重要基礎,但溝通的技巧和友善的態度,卻是不可或缺的要件。

有些學識很棒的人,常被譏評為:「躲在象牙塔裡!」其中一部份的原因就是出在他們既不善於溝通、也不樂在溝通,與外界的接觸愈來愈少,他不瞭解別人,別人也不會懂他。
愈成熟的麥穗,愈懂得彎腰;愈懂得彎腰,才會愈成熟。保持謙虛和擁有成就絕對不是二選一的單選題。 誠如「會做事、也要會做人」的道理一樣,願意溝通的態度就是一種謙虛的表現,將會令你的專業表現,更添光彩!

實力越好越厲害的人更應常常保持謙虛的態度 就像飽滿的稻穗一般 期勉自己能夠慢慢的增強實力 同時也應保持謙虛的態度 幫助朋友 善待他人

2009年7月29日 星期三

PHP-投票計數篇

userprofile table中資料欄位 我是規劃成這樣

Id Context Profile

//從userprofile table中找到Context 欄位為meetingatschool 都把它挑出來
//接下來將其id遞減
$sql="SELECT * from userprofile where Context='meetingatschool' order by id DESC";
$result=mysql_query($sql);

//因為是遞減的關係最上面的那筆 就會是最新的那筆資料
//抓一列資料 存放到row[]中
$row=mysql_fetch_row($result);

$type="";

//因為row[2]是我存放Profile的地方
//接下來用switch case來分別對應 ex:如果row[2]存在的是General就將$type設為General
switch ($row[2]) {
case "general":
$type="General";
break;
case "meeting":
$type="Meeting";
break;
case "vibration":
$type="Vibration";
break;
case "outdoor":
$type="Outdoor";
break;
}
//ex:上面對應的$type=General 就是 General=General+1
//其中" . "是連接字串用 相當於java與C++中的" + "
$sql="update meetingatschool set ". $type . "=" . $type . "+1";
mysql_query($sql);

這邊的資料庫存完之後 我就可以到我的java server那邊 透過JDBC去連接資料庫 抓到資料 完成我要做的事情

PHP-連接資料庫篇

//連接資料庫 mysql_connect("localhost","帳號","密碼");
$con = mysql_connect("localhost","xxx","xxx");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
//選擇my_db資料庫
mysql_select_db("my_db", $con);
//將剛剛在主頁所選的選項的值 插入到userprofile table中
//另外要先到資料庫中 先建立好userprofile的table,並且要將Context和Profile兩個欄位也都建立
$sql="INSERT INTO userprofile (Context, Profile)
VALUES ('$_POST[context]','$_POST[profile]')";
mysql_query($sql);

Html-form with radiobox

這次是我第一次真的用Notepad++ 來寫html 還記得在我國中的時候 我有寫過網頁 但當時是用frontpage來寫 所以對html完全不熟 這次剛好論文需要 想說來試試看寫一下
本來寫程式 我是不喜歡問別人的 但這次比較急 只好趕快問人了= = 不過也因此...我覺得我沒特別學到什麼 囧...看來還是需要找個機會 好好去磨練一下




//當user按下送出之後 會導到insert.php這個頁面
//method有分post和get兩種 而get的方式,會看到url裡面有代參數
//但post就不會有 另外target="_blank" 是永遠開啟新視窗
<form action="insert.php" method="post" target="_blank">
//radiobox name設為相同 就表示同個群組 只能單選
< name="profile" value="general" type="radio">General
< name="profile" value="meeting" type="radio">Meeting
< name="profile" value="vibration" type="radio">Silent
< name="profile" value="outdoor" type="radio">Outdoor
< name="context" value="meetingatschool" type="hidden">
//斷行
<br>
//按鈕 value為Submit 顯示也會是Submit
< value="Submit" type="submit">
< /form>

Web server+Database設置篇

安裝的時候可以用懶人包 Appserv
Webserver:Apache
Database:MySQL
管理資料庫部份:phpmyadmin

如果不會安裝Appserv可以參考 教學

PHP Tutorial

HTML Tutorial

J2SE-JDBC 資料庫select篇

Statement stmt = null;
stmt = conn.createStatement();
//從meetingatschool table 去select
//executeQuery()方法則是用於SELECT等查詢資料庫的SQL
//會傳回ResultSet物件,代表變更或查詢的結果,查詢的結果會是一筆一筆的資料
ResultSet result = stmt.executeQuery( "SELECT * FROM meetingatschool");
//使用查詢到的結果之欄位順序來顯示
//
next()來移動至下一筆資料,它會傳回 true 或 false表示是否有下一筆資料
//由於我meetingatschool table存的型別是int 因此 我用getInt來取得資料
while(result.next()) {
System.out.print(" "+result.getInt(1) + "\t");
//這個地方 我是要拿來比較大小用
general=new Integer(result.getInt(1));
System.out.print(" "+result.getInt(2) + "\t");
meeting=new Integer(result.getInt(2));
System.out.print(" "+result.getInt(3) + "\t" );
vibration=new Integer(result.getInt(3));
System.out.println(" "+result.getInt(4) + "\t");
outdoor=new Integer(result.getInt(4));
}

J2SE-JDBC 資料庫連接篇

若是用MySQL來當作資料的話 請先下MySQL JDBC driver
之後將*.jar加入至CLASSPATH,Eclipse 在Library 加入external JAR

String driver = "com.mysql.jdbc.Driver";
//
jdbc:mysql://主機名稱:連接埠/資料庫名稱
String url = "jdbc:mysql://localhost/my_db";
//登入資料庫的帳號
String user = "xxx";
//登入資料庫的密碼
String password = "xxx";
Connection conn = null;
Class.forName(driver);
//連接資料庫
conn = DriverManager.getConnection(url, user, password);



J2SE-分析字串篇

byte[] buf ;
int read = 0;
//從inStream中讀取資料流 寫入到buf中
while((read = inStream.read(buf))!=-1){
String str = new String(buf, 0, read);
//字串以"."來作為分隔
String[] token =str.split("\\.");
//假設我在手機端傳的字串為meetingAtschool.Level1.Ring.Vibration
//以下寫法就是將token分別取出
if(token[0].equals("meetingAtschool"))
{


if(token[1].equals("Level1")){


System.out.println("Current Exposed level: Level1");
}

System.out.println("The match functionalities:");
if(token[2].equals("Ring"))
{


System.out.println("Ringer");
server.broadcast(Ring);

}
if(token[2].equals("Vibration"))
{

System.out.println("Vibration");
//讓執行緒暫停執行進入Not Runnable狀態 其中50000毫秒=50秒
//為了要傳給手機訊息 但是同一時間outputstream只能傳一個字串 所以我讓他暫停等候 再傳出去(這時上面的ring也已經傳出)
Thread.sleep(50000);
server.broadcast(vibration);
}
}

J2SE-Broadcast

//記得 import java.util.ArrayList;
// 建立對應 client 的 輸出物件

socketWriter = new PrintWriter(clientSocket.getOutputStream(), true);
//將client相關資訊存起來
server.setClientOutputStreams( clientSocket.getInetAddress().getHostAddress(), socketWriter );
//先將每個client的outputStream和ip存起來放到ArrayList中 ArrayList詳細用法請看Library
private static ArrayList clientOutputStreams;
clientOutputStreams = new ArrayList();
public ArrayList getClientOutputStreams(){
return clientOutputStreams;
}

public void setClientOutputStreams( String ip, PrintWriter w ){
clientOutputStreams.add( new createOutputStreamData(ip,w));
}

public class createOutputStreamData{
String clientIP;
PrintWriter writer;

public createOutputStreamData( String ip, PrintWriter w ){
clientIP = ip;
writer = w;
}
}
//從ArrayList取出之後 分別寫入到個別的outputstream
public void broadcast(char g2) throws IOException {
for( int i=0; i
getClientOutputStreams().get(i).writer.println(g2);
getClientOutputStreams().get(i).writer.flush();
}
}

J2SE-multithread socket

public void startServer() {

try {
//建立server用的socket (port不能小於1024)
echoServer = new ServerSocket(port);
}
catch (IOException e) {
System.out.println(e);
}

//每當一個device連線產生時,就產生一個新的thread去處理這個連線 並且等待下一個device連進來
while ( true ) {
try {
clientSocket = echoServer.accept();
numConnections ++;
Server2Connection oneconnection = new Server2Connection(clientSocket, numConnections, this);
new Thread(oneconnection).start();
}
catch (IOException e) {
System.out.println(e);
}
}
}
}

J2SE-初探 IDE安裝篇

最近一直懶惰沒上來更新 把之前寫的程式 整理一下@@

我的IDE:eclipse 可在這裡 下載
我都是用 Eclipse Classic 3.5.0 (162 MB) 這個版本
還有記得下載 : java runtime
Eclipse解壓縮之後 以及java runtime安裝完成
就可以開始開發囉
推薦網站:
Javaworld(國內)
良葛格學習筆記(國內)
Java Sun (國外) 可以查Library
基本上JAVA的資料還蠻多的 google一下很多資料可以查詢

2009年7月9日 星期四

symbian 彈出訊息視窗

Link against: avkon.lib eikctl.lib eikcdlg.lib

#include <aknnotewrappers.h>

//R_CHAT_ON 這個要在*.rss 裡面去定義
HBufC* textResource = StringLoader::LoadLC(R_CHAT_ON);
CAknInformationNote* note = new ( ELeave ) CAknInformationNote;
//彈出訊息視窗 變且顯示
note->ExecuteLD( *textResource );

詳情請見Library

symbian 儲存與讀取檔案內容

寫入檔案 程式碼如下:
//指定檔名與位置
_LIT(KFILE,"c:\\kk.txt");
//要寫入的字串
_LIT(KT,"meetingAtschool.Level1.Ring");
// RFileWriteStream 寫入一個stream到一個文件
詳情請看Library
RFileWriteStream write;
write.Replace(CCoeEnv::Static()->FsSession(),KFILE,EFileWrite);
//把KT字串放入buf
TBuf<400> buf(KT);
//寫入
write.WriteL(buf);
write.CommitL();
write.Close();

讀取檔案內容 程式碼如下:
//檔案的位置
_LIT(KFILE,"c:\\kk.txt");
RFileReadStream read;
read.Open(CCoeEnv::Static()->FsSession(),KFILE,EFileRead);
TBuf<40> buf2;
//讀出檔案 寫入到buf2 這邊特別要注意ReadL的第二個參數(這邊指27) 需要跟檔案內容的字串//一樣長 若比較小 會顯示不完全 若比較大 則會有錯誤訊息
//一般可以寫成buf.Length() 也就是說read.ReadL(buf2,buf.Length()); 這樣就可以知道 當初所//存的buf有多長
read.ReadL(buf2,27);
read.Close();

2009年6月21日 星期日

我家到我弟租房子的地方(近元智)



















高速公路北區路往圖 收費道圖片

橫書白色是ETC、藍色是回數票、黃色是現金/回數票;直書藍色是小型車、黃色是大型車。
最內側車道是小型車ETC專用車道,中間車道是回數票專用車道,再來車道是小型車現金收費車道,在來是大型車ETC專用車道,在來車道是大型車回數票車道,在來是大型車現金車道。
===去程======
路線一:確定
中正路靠最右邊 走南下 中和交流道接國道3(梅花3) 先過 土城->三鷹->接鶯歌系統 走國道2(梅花2)->八德大湳交流道下 下來時走右邊->接福德一路(靠左)->左轉和平路(靠右)->右轉介壽路一段(靠左)->左轉接廣福路(靠右)(這邊注意 介壽路沒多久 就到廣福路)->新中北路接興仁路二段->看到7-11右轉就是遠東路了->再過去就是元智了

後來發現路線二 比較方便
路線二:
中正路靠最右邊 走南下 中和交流道 入口靠右 接國道3(梅花3) 先過 土城->三鷹(鶯歌出口 三峽出口過兩個)->接鶯歌系統 走國道2(梅花2)->八德大湳->南桃園交流道下->走左手邊接大興西路三段(靠右 )->右轉接文中路一段->左轉接龍壽街一段(右手邊會看到桃園醫院)(上面會有陸橋)->右轉接中華路(靠左)->左轉接遠東路->過元智直走 看到7-11 沿著7-11直走 右手邊興仁國小 ->直走會看到第二個7-11 橫的路興安二街->下一條榮民路241巷


===回程======
興仁路二段->過兩個7-11->興仁路一段(靠右)->過平交道->右轉接中華路->看到頭上面有陸橋 不能走內線 內線左轉車專用->一直走會看到上面有國道2(梅花2)的橋->準備左轉接龍安街->過文中路->接大興西路三段->直走 走右手邊 梅花2 接上南桃園交流道 上高速公路->經八德大湳出口->直走會接鶯歌系統(不會像回去程 有個出口走) 而是直走 這時會看到叉路->走左邊北上接梅花三(右邊是南下)->經三鷹(三峽和鶯歌出口)->樹林收費站->土城->中和出口走左邊->接中和交流道->接著慢慢靠向內側車道->頭上會寫 中和/板橋(要走這個)(右邊好像是寫秀朗橋 還有中正路 有點忘了)->接著就準備下去了->靠內側車站->左轉民樂路就到了

===回程======
沿著路線二回去 中華路上面看到陸橋 就左轉 接龍壽街 在大興西路三段 靠右北上(走右邊) 接梅花2 走到底接鶯歌系統 走左手邊接梅花3 三鷹(三峽 鶯歌出口)->樹林收費站->土城->中和出口走左邊->接中和交流道->接著慢慢靠向內側車道->頭上會寫 中和/板橋(要走這個) 直走 靠內側 下去到民樂路口左轉就到了

2009年6月12日 星期五

symbian-傳訊息篇

iActiveSocket->Write( aText, iStatus );
此寫法在藍牙或與java socket傳字串時,都可以用此寫法
aText我定義為TDesC8,因此在傳遞訊息時,需將unicode轉換為UTF8
TBuf<40> text(_L("outdoor"));
這裡是相當於string text="outdoor"
TBuf8<40> text8;//用來作為儲存UTF8用
呼叫CnvUtfConverter::ConvertFromUnicodeToUtf8(text8, text);
將text轉成UTF8並存入text8中,接著就可以用在Write()中,去傳遞字串

symbian-修改來電模式篇

詳細用法 請參考Setting the profile tones in active profile using Profile Engine Wrapper API
特別注意
Capability以及Library

Library Files 在資料夾group中的XXX.mmp(XXX指的是檔名),點兩下打開,找下方標籤library 就可以增加了

Capability 則是同樣在此處,請看下方option的標籤,左上方就可以選擇Capability

更改來電模式方法 如下:
//standard
MProEngEngine* engine = ProEngFactory::NewEngineL();
CleanupReleasePushL(*engine);
engine->SetActiveProfileL(0);
CleanupStack::PopAndDestroy(1);

//silent

MProEngEngine* engine = ProEngFactory::NewEngineL();
CleanupReleasePushL(*engine);
engine->SetActiveProfileL(1);
CleanupStack::PopAndDestroy(1);

//meeting
MProEngEngine* engine = ProEngFactory::NewEngineL();
CleanupReleasePushL(*engine);
engine->SetActiveProfileL(2);
CleanupStack::PopAndDestroy(1);


//outdoor
MProEngEngine* engine = ProEngFactory::NewEngineL();
CleanupReleasePushL(*engine);
engine->SetActiveProfileL(3);
CleanupStack::PopAndDestroy(1);






symbian-選單篇

MENU_ITEM { command = EChatSendMessage; cascade = r_bt_profilechange_menu; txt="Select profile"
(ps:MENU_ITEM定義在*.rss底下,相關變數名稱則定義在*.rls底下 HandleCommandL 中switch case的CommandId 則是定義在*.hrh底下)

語法的意思是說 這個menu上的按鍵相對應的名稱叫做EChatSendMessage,可以在XXXAppui.cpp(XXX指的是你的檔名)
運用到 包括(1)HandleCommandL 處理手機上視窗介面的按鍵,按下去所對應的動作
(2) else if ( iChatInet->IsConnected() ){
SetItemDimmed( EChatSendMessage, !iChatInet->IsReadyToSendMessage() );}
這個意思是指 EChatSendMessage 這個按鍵 要不要出現 而後面若是True表示要隱藏,False表示要顯示,條件是當手機與server已經連線時,要不要隱藏

當我在某個function中呼叫 SetState( EConnected ); 我就可以將介面固定在以上的表達式中

cascade是要寫子選單的所用的方法,我們可以看到cascade = r_bt_profilechange_menu
而r_bt_profilechange_menu需要另外定義在*.rss底下,如下
RESOURCE MENU_PANE r_bt_profilechange_menu
{
items =
{
MENU_ITEM { command = EChangeprofileg; txt = STRING_r_bt_changeprofileg; },
MENU_ITEM { command = EChangeprofiles; txt = STRING_r_bt_changeprofiles; },
MENU_ITEM { command = EChangeprofilem; txt = STRING_r_bt_changeprofilem; },
MENU_ITEM { command = EChangeprofileo; txt = STRING_r_bt_changeprofileo;}
};
}

2009年6月2日 星期二

如何產生sis

(如何產生 待補充 目前正在趕程式 等弄好 會來補充)
若是出現Error : Cannot find file : ${EPOCROOT}\epoc32\release\gcce\urel\ChatEx.exe
ChatEx_gcce.pkg(19) : error: file I/O fault
可至/sis/.pkg檔案中,將路徑改成絕對路徑
例如:"C:\Symbian\9.2\S60_3rd_FP1\Epoc32\release\gcce\urel\ChatEx.exe"

產生後的sis檔 要上傳到此網站 認證 才能丟到手機安裝
裡面要填一個imei的數字 請按手機*#06# 就會跑出一段數字 輸入這段數字即可

2009年5月29日 星期五

初探-symbian開發環境架設

跟隨開發我的論文程式,紀錄一下,留下一些足跡,便於自己以後忘記可以再來看看,也分享一些開發經驗給大家

開發工具的主角,當然是Carbide c++囉,安裝順序如下
1ActivePerl-5.6.1.635
ActivePerl-5.10.0.1004(windows7 請用這個版本)
2.SDK (針對你的需要 下載相對應手機的SDK),例如我要開發N82,就下載S60 3rd FP1
下載網址:http://www.forum.nokia.com/Tools_Docs_and_Code/Tools/Platforms/
3.安裝Carbide c++

以上就是安裝順序,但特別要注意的是,你安裝的sdk位置需要與carbide c++的workspace,要同個槽,這樣就不會出現
BLDMAKE ERROR: Directory "\
Symbian\9.2\S60_3rd_FP1\EPOC32\"
的問題,再來就恭喜,可以開始來玩玩symbain的程式開發囉

若是跑模擬器出現
Application closed: ncnlist KERN-EXEC 3 error
可以用以下檔案覆蓋epoc32,覆蓋至 C:\Symbian\9.2\S60_3rd_FP1(預設路徑)裡面的epoc32資料夾

平常找一些資料可以看 Nokia forum
推薦書籍:S60 Programming. A Tutorial Guide
基本上 Symbian c++ 可以看的書非常稀少 不是太舊 就是沒人寫
國內是完全沒什麼論壇有在討論 因此強烈建議 一定要看英文 雖然有對岸論壇 也有在討論
但是如果要觀念清楚的話 先看上面我推薦的那本書 一步一步來看 然後看看SDK的範例 以及Nokia forum的一些教學 慢慢的就會熟悉了 剛開始學可能會有點痛苦 因為很多東西 是C++裡面沒有的 多寫程式 多試幾次 這是不二法則

2009年5月24日 星期日

我家到北鼻家路線

===去程======
中山路二段 祥興樓->好市多->家樂福(靠左)
左轉景平路 接華中橋
華中橋下 萬大路
接著沿著康定路直走 會經過 艋舺大道 內江街 成都路
康定路走到底 接環河南路 直走 環河北路一段到三段
接延平北路六段靠左(前面洲美快速道路)
左轉延平北路七段 再直走接延平北路八段 會經過富安國小
過沒多久就到了

===回程======
走延平北路八段 ->延平北路七段->延平北路六段(左邊洲美快速道路)
環河北一段(靠右)
於民生西路 右邊大稻程處 上環河快速道路(高架)
經過忠孝橋->中興橋->華江橋->萬板->(下平面)興義街->德昌街(靠中線)
上第二個高架前 走中線 最右邊是萬大路
上環快(高架)->走右線(華中橋)
上橋沒多久 右轉出口 接華中橋(有紅綠燈)
下華中橋 經中山路 下一條連城路 靠右線 於家樂福右轉
沿著連城路 靠右線 看到上面高架橋為中正路
過中正路後 靠右線 轉新生街

ps:
看上方指示 就可知道下個出口
平面道路 出口在左側
高架道路 出口在右側