2010年12月24日 星期五

Android EditText的輸入事件

關於Android的EditText的輸入事件,一開始我以為是用OnKeyListener去處理就可以了。
後來發現我錯了...OnKeyListener只接收"實體鍵盤的event觸發"對一般Android都是觸控的虛擬鍵盤一點反應都沒有。Google後發現應該是要用addTextChangedListener來處理才是正確的做法
程式大致如下:

myEditText.addTextChangedListener(new TextWatcher(){
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,int after) {
// TODO Auto-generated method stub
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// TODO Auto-generated method stub

}});

裡面三個function是new TextWatcher()必須要實作的
程式寫在onTextChange()那function裡面就可以了

2010年12月14日 星期二

Yahoo 搜尋股票代號API

在輸入股票代號時常常會不知道公司的股票代號
這時就可以用Yahoo 的這個API來搜尋

使用方式如下
http://d.yimg.com/autoc.finance.yahoo.com/autoc?query=關鍵字&callback=YAHOO.Finance.SymbolSuggest.ssCallback

此API可以尋找各交易所的股票代號相當的方便
但因為資料都是英文所以要搜尋中文公司也要輸入英文的關鍵字才行

用關鍵字Yahoo搜尋的結果如下
YAHOO.Finance.SymbolSuggest.ssCallback({"ResultSet":{"Query":"yahoo","Result":[{"symbol":"YHOO","name": "Yahoo! Inc.","exch": "NMS","type": "S","exchDisp":"NASDAQ","typeDisp":"Equity"},{"symbol":"YOJ.F","name": "YAHOO JAPAN","exch": "FRA","type": "S","exchDisp":"Frankfurt","typeDisp":"Equity"},{"symbol":"YOJ.BE","name": "YAHOO JAPAN","exch": "BER","type": "S","exchDisp":"Berlin","typeDisp":"Equity"},{"symbol":"YHO.MU","name": "YAHOO","exch": "MUN","type": "S","exchDisp":"Munich","typeDisp":"Equity"},{"symbol":"YHO.F","name": "YAHOO","exch": "FRA","type": "S","exchDisp":"Frankfurt","typeDisp":"Equity"},{"symbol":"YAHOF.PK","name": "YAHOO JAPAN CORP","exch": "PNK","type": "S","exchDisp":"Pink Sheets","typeDisp":"Equity"},{"symbol":"ETD","name": "Citigroup Inc. ELKS On Yahoo","exch": "PCX","type": "S","typeDisp":"Equity"},{"symbol":"YHO.DU","name": "YAHOO","exch": "DUS","type": "S","exchDisp":"Dusseldorf Stock Exchange","typeDisp":"Equity"},{"symbol":"YOJ.DE","name": "YAHOO JAPAN","exch": "GER","type": "S","exchDisp":"XETRA","typeDisp":"Equity"},{"symbol":"YHO.HM","name": "YAHOO","exch": "HAM","type": "S","exchDisp":"Hamburg","typeDisp":"Equity"}]}})

和Google Stock Api一樣...也是JSON格式
symbol = 代號
name = 公司名稱
exch = 證券交易所
type = 應該是上市上櫃分別
exchDisp = 交易所地點

參考自
http://stackoverflow.com/questions/885456/stock-ticker-symbol-lookup-api&rurl=translate.google.com.tw&twu=1&usg=ALkJrhgoUpKv7sDtcpKatP_oy50z7GI2Jg

2010年12月2日 星期四

Android Http Get 實作範例

首先
在AndroidManifest.xml中要加入可以使用網路的權限
< uses-permission android:name="android.permission.INTERNET" >< /uses-permission >

在程式部份

//for Http Get
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;


public void executeHttpGet() throws Exception {
try {
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet(網址);
HttpResponse response = client.execute(request);
String retSrc = EntityUtils.toString(response.getEntity());

System.out.println(retSrc);
} finally {
}
}

Android SharedPreferences 儲存簡單的欄位資訊

Android 提供了 SharedPreferences 這個介面讓我們方便存取一些預設資料或是一些簡單的使用者輸入的欄位資訊
要使用這個介面第一步當然是
import android.content.SharedPreferences;

接著,就是程式碼的部份

首先介紹儲存資料的部份
//取得SharedPreferences物件 (參數一是偏好設定檔的名稱,參數二是讀取權限)
SharedPreferences pref = getSharedPreferences("PREF_STOCK", MODE_WORLD_WRITEABLE);
//要修改偏好設定檔必須透過一個SharedPreferences.Editor 物件
//取得SharedPreferences.Editor 物件
SharedPreferences.Editor prefEdt = pref.edit();
//寫入資料(參數一是欄位名稱,參數二是要寫入的資料)
prefEdt.putString("PREF_T", "hello world");
//最後一定要commit將資料寫入檔案
prefEdt.commit();


在讀取方面就簡單多了

//取得SharedPreferences物件 (參數一是偏好設定檔的名稱,參數二是讀取權限)
SharedPreferences pref = getSharedPreferences("PREF_STOCK", MODE_WORLD_WRITEABLE);
//取得資料 (參數一是欄位名稱,參數二是讀取失敗時的預設資料)
String getS = pref.getString("PREF_T", "");


以上就是讀寫一個偏好設定檔要用的功能了
其他更深入的說明介紹可以參考以下的資料
http://asia.edu.tw/~lincyu/Android/Chapter11.pdf

http://developer.android.com/reference/android/content/SharedPreferences.html

Android 讀取JSON使用範例

在Android中使用JSON其實滿方便的,因為Libary已經有寫好了,只要直接拿來用就好了
首先

import org.json.JSONObject;
import org.json.JSONArray;

然後假設JSON格式的資料在一個字串json_data中
如果資料最外層是[]那就是JSONArray
最外層是{}則是JSONObject

以上一篇從Google取得的股票資料為例
最外層是[]然後裡面有不同的物件
取得資料方式如下

//將資料寫入JSONArray
JSONArray result = new JSONArray(json_data);
//取出陣列內所有物件
for(int i = 0;i < result.length(); i++)
{
//取出JSON物件
JSONObject stock_data = result.getJSONObject(i);
//取得物件內資料
System.out.println("t:"+stock_data.getString("t"));
System.out.println("l_cur:"+stock_data.getString("l_cur"));
System.out.println("c:"+stock_data.getString("c"));
System.out.println("cp:"+stock_data.getString("cp"));
}



可參考API網址
http://developer.android.com/reference/org/json/package-summary.html

2010年12月1日 星期三

Google Stock 股市API

跟據
http://googlefinanceblog.blogspot.com/2008/04/taiwan-stock-exchange-pricing-data.html
可以得知在2008Google的Stock API就已經有台灣股市的資料了使用方式就是把後面改成
TPE:代號 或是 代號.TW

查詢方式如下:(以2454聯發科)為例
http://finance.google.com/finance/info?client=ig&q=TPE:2454

得到的結果
// [ { "id": "683538" ,"t" : "2454" ,"e" : "TPE" ,"l" : "391.50" ,"l_cur" : "NT$391.50" ,"ltt":"1:30PM Taipei" ,"lt" : "Dec 1, 1:30PM Taipei" ,"c" : "+1.00" ,"cp" : "0.26" ,"ccol" : "chg" } ]

看得出來是個JSON格式的file
t就是代號
"l_cur":成交價格
"ltt":時間
"lt":日期時間
"c":漲跌
"cp":漲跌幅


其他資訊可以參考
http://stackoverflow.com/questions/527703/google-financial-api-how-get-stock-quotes

Google Finance API docs
http://code.google.com/intl/zh-TW/apis/finance/docs/2.0/reference.html

2010年11月26日 星期五

Android Bitmap 存檔


import java.io.File;
import java.io.FileOutputStream;
import java.io.BufferedOutputStream;


File myDrawFile = new File(mSaveFilePath);
try {
BufferedOutputStream bos = new BufferedOutputStream
(new FileOutputStream(myDrawFile));
mBitmap.compress(Bitmap.CompressFormat.PNG, 90, bos);
bos.flush();
bos.close();

} catch (Exception e) {
e.printStackTrace();
Log.d(null, "Save file error!");
return false;
}
Log.d(null, "Save file ok!");
return true;

2010年11月24日 星期三

[python] Google app engine 登出功能

from google.appengine.api import users

#利用users api取得登出網址(後面的參數是登出後要前往的頁面)
logoutUrl = users.create_logout_url("/")

2010年11月9日 星期二

Android初體驗之編譯出xxx.out.xml的錯誤

在寫Android 的時候有時候會發生出現xxx.out.xml的錯誤
這種錯誤的解決方法是

1.在Project->Clean清除目前的編譯
2.從專案中刪除xxx.out.xml
3.重新編譯

這問題發生的原因是:在Eclipse中編輯XML檔案,會預設用XSLT來轉換文件
所以當我們要執行編譯時,要把焦點由XML移開到專案上
為了必免這個問題可以參考以下做法


可以在Eclipse設定,選單Windows->Preference,選擇節點Run/Debug->Lauching,Lauch Operation選擇第一項。





這樣就不用每次都要把Focus 移開XML文件。

參考如下:
http://programmersay.blogspot.com/2010/07/android-mainoutxml.html
http://www.cnblogs.com/chunhui588/archive/2010/06/26/Android-debug-main-out-xml-parsing-error.html

2010年8月23日 星期一

C++ 使用環境變數

在Linux中有時候需要知道一些環境變數
例如要知道使用者的家目錄位置等。
這時候就可以利用getenv這個function
以下以Qt的程式碼示範

#include < stdlib.h >

QString strEnv = getenv( "HOME");

2010年7月28日 星期三

GPS

NMEA data
http://www.gpsinformation.org/dale/nmea.htm

HOWTO: Track your position using a GPS dongle and Google Earth
http://ubuntuforums.org/showthread.php?t=1083710

Using A Bluetooth GPS From Python
http://www.robertprice.co.uk/robblog/archive/2007/1/Using_A_Bluetooth_GPS_From_Python.shtml

教學

將win7安裝光碟放到USB隨身碟中
http://rondoyoyo.pixnet.net/blog/post/29644836

將AVI+字幕轉VCD或DVD使用教學
http://oz6877.myweb.hinet.net/2.htm

2010年7月13日 星期二

Qt 讀取MP3的ID3 tag

MP3資訊目前都是以ID3的tag標示

目前常見的標示有ID3v1, ID3v2.3, ID3v2.4

讀取方式大同小異但在v1和v2.3的編碼方式為Big5所以讀取時要比較注意一點

關於各欄位資訊可參照Wikipedia

http://en.wikipedia.org/wiki/ID3

下面提供簡單的讀取範例

QFile *file=new QFile(MP3檔案路徑);
if (!file->open(QIODevice::ReadOnly))
{
qDebug()<<"return";
return;
}
QTextCodec *codec = QTextCodec::codecForName("Big5");
QString head = file->read(3);
QString sver = file->read(1);
int ver = sver.at(0).toAscii();

//移到倒數第128個位置
file->seek(file->size()-128);

QString tag = file->read(3);
qDebug()<<"tag"<
QString title = codec->toUnicode(file->read(30));
QString artist = codec->toUnicode(file->read(30));
QString album = codec->toUnicode(file->read(30));
QString year = codec->toUnicode(file->read(4));
QString comment = codec->toUnicode(file->read(30));

qDebug()<<"head"< qDebug()<<"ver"< qDebug()<<"title"< qDebug()<<"artist"< qDebug()<<"album"< qDebug()<<"year"< qDebug()<<"comment"< file->close();

2010年6月23日 星期三

Qt 中文顯示亂碼解決方式

在main文件中添加代码:
#include < QTextCodec >

int main(int argc, char **argv)
{
....................
QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF8"));
QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF8"));
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF8"));
..........................
}

這樣就可以在其他地方使用中文字了

2010年6月10日 星期四

QNetworkAccessManager 處理Http Command

在Qt 要做Http Command也可以用QNetworkAccessManager這元件

這元件還可以讓使用者保持登入狀態

使用方式

#include < QNetworkAccessManager >
#include < QNetworkReply >

//宣告

QNetworkAccessManager *manager = new QNetworkAccessManager(this);

//收到Server回傳資料處理

connect(manager, SIGNAL(finished(QNetworkReply*)),this, SLOT(decode(QNetworkReply*)));

//要求登入事件處理

connect(manager, SIGNAL(authenticationRequired(QNetworkReply*,QAuthenticator*)), this,SLOT(authenticationResult(QNetworkReply*,QAuthenticator*)) );



//發出Http Command

QUrl url = new QUrl(Http_Command);

manager->get(QNetworkRequest(url));

2010年5月28日 星期五

API 網頁

Plurk API
http://www.plurk.com/API

Facebook Developer
http://developers.facebook.com/

Twitter API
http://apiwiki.twitter.com/Twitter-API-Documentation

Qt 中解析 JSON 文件

在Qt中要解析JSON的文件有套相當方便的Libary可供使用

可以使用 apt-get install libqjson-dev直接安裝

網站上也有提供使用說明和範例

使用時要在.pro中加上

LIBS += -L/usr/lib -lqjson

程式中加入

#include < qjson/parser.h >

其他請參照說明網頁

http://qjson.sourceforge.net/usage.html

2010年5月27日 星期四

Qt Http Get 簡單實作

現在網路上很多資料可以直接上網取得最新的資訊
也有很多網站提供API可以使用
而使用方法大都是利用http直接存取
http Get的方式就是一種
一般最簡單的用法就是之前提到Google 天氣API那樣直接接在網址後面就可以了
像http://www.google.com/ig/api?weather=,,,22625108,120308954
可以取得天氣的資訊
那在weather就是一個變數而後面的,,,22625108,120308954是給這變數的值
可以用&接在後面然後加其他的變數
在Qt中要用到HTTP就需要include < QHttp > 和 < QUrl > 以及 < QFile >
簡單的範例如下

//QUrl 用來設定網址內容
QUrl url;
//輸入網址
url = QUrl("http://www.google.com/ig/api");
//加入變數和值
url.addQueryItem("weather",",,,22625108,120308954");
//QFileInfo檔案資訊(用來取得輸入網址後面的名稱)若自定名稱就不需要
QFileInfo fileInfo(url.path());
QString fileName = fileInfo.fileName();
if (fileName.isEmpty()) {
fileName = "index.html";
}
//QFile檔案(用來儲存得到的網頁內容)
file = new QFile(fileName);
if (!file->open(QIODevice::WriteOnly)) {
qDebug()<<"Unable to save the file";
delete file;
file = 0;
return;
}
//QHttp用來做Http的Connection
http = new QHttp(this);
//連結完成的事件...另有很多其他事件可用如狀態變更、連線、傳輸進度等
connect(http,SIGNAL(done(bool)), this, SLOT(test(bool)));

//設定連接的伺服器和port
http->setHost(url.host(), url.port(80));
//使用HTTP Get command
http->get(url.toString(), file);
//結束這http connection
http->close();

主要的程式就是這一部份其他的部分再依照需求加上即可

2010年5月19日 星期三

Qt DesktopWidget 判斷視窗大小變換

Qt提供了一個QtDesktopWidget讀取Desktop的一些事件和屬性

//使用前需include
#include < QtGui/QDesktopWidget >
//接著就是宣告
QDesktopWidget *mDesktop;
//指定desktop
mDesktop = qApp->desktop();
//讀取Window 寬高
width = mDesktop->width();
height = mDesktop->height();
//指定視窗變化事件
connect(mDesktop,SIGNAL(resized(int)),this,SLOT(resizedSlot(int)) );

2010年4月27日 星期二

Qt IM開發工具

說明

在Qt中IM 可以使用Telepathy這套libary

在Moblin也是同樣是用Telepathy, Telepathy是一個IM, 可以用DBus控制 Empathy就是一個Telepathy的Client

由於在Telepathy要用到DBus所以在Qt中使用時要在專案檔(.pro)加入   CONFIG += qdbus


參考網站
Telepathy-Qt4
http://telepathy.freedesktop.org/doc/telepathy-qt4/

Telepathy Developer's Manual
http://people.collabora.co.uk/~danni/telepathy-book/index.html

2010年4月21日 星期三

Qt 讀寫 XML

首先在專案檔要加入
QT += xml
不然會出現錯誤

建立XML

//建立Document
QDomDocument doc( "Favorite" );
//建立root
QDomElement root = doc.createElement( "favorite" );
//將root加入doc
doc.appendChild( root );

到這邊已經建立好基本的XML了
接下來就是將資料放入XML

//建立節點
QDomElement app = doc.createElement( "application" );
//設定節點屬性的“名稱”和“內容”
app.setAttribute( "name", "Skype" );
//將節點放到root下成為一個子節點
root.appendChild( app );

這邊XML加入子節點和屬性的方法都有了剩下就是個人自己設計架構了
設計完了後要存檔

QFile file( "favor.xml" );
//開檔
if( !file.open( QFile::WriteOnly | QFile::Text ) )
{
//設定錯誤訊息
}
//設定QTextStream
QTextStream ts( &file );
//資料寫入
ts << doc.toString();
//既然有開檔當然就要關檔
file.close();

到這邊一個完整的XML就完成了
再來是要把檔案讀出來

QDomDocument doc;
QFile file(favor.xml);
QString errorStr;
int errorLine;
int errorCol;
if(!doc.setContent(&file,true,&errorStr,&errorLine,&errorCol))
{
//如果有錯在這邊處理
}
file.close();

這邊已經完成開檔動作
接著開始讀取內容

QDomNode root = doc.firstChild();
//檢查是否有子節點
if(root.hasChildNodes())
{
//取得所有子節點
QDomNodeList list=firstnode.childNodes();
//掃描所有子節點
for(int i = 0; i < list.count(); i++)
{
//取得第i個子節點
QDomNode node=list.at(i);
//節點名稱
qDebug() << node.nodeName();

QDomElement app = node.toElement();
//下面就是節點的屬性了
qDebug() << app.attribute("name");
}
}


以上就是XML基本會用到的東西

2010年4月16日 星期五

Qt 掃描目錄中的檔案

#include 《QDir》

QDir dir;
//設定要過濾的檔名
QStringList filters;
filters << "*.desktop";
//選擇目錄
dir.setPath("/usr/share/applications/");
//過濾檔案
dir.setFilter( QDir::Files | QDir::Hidden | QDir::NoSymLinks );
//檔案排序
dir.setSorting( QDir::Size | QDir::Reversed );
//過濾檔名
dir.setNameFilters(filters);

QFileInfoList list = dir.entryInfoList();
QFileInfo fi;
qDebug()<<"Bytes Filename";

for(int i = 0; i < list.count(); i++)
{
fi = list.at(i);
qDebug()《"file size:"《fi.size()《", file name:"《fi.fileName();
}

2010年4月14日 星期三

Linux Application選單

首先要先讀取哪些選項要顯示的
讀取
~/.config/menus/applications.menu
/etc/xdg/menus/applications.menu (一定會存在)

在/usr/share/desktop-directories/目錄中
可找到對應的.directory
即可得到對應選單的資訊

然後檢查/usr/share/applications
這目錄下的.desktop
就能得到所有的application的資訊

而icon大部份會存在
/usr/share/icons/
/usr/share/pixmaps/
這些目錄中

其他資訊參考這篇
http://library.gnome.org/admin/system-admin-guide/2.30/menustructure-0

2010年4月13日 星期二

在ubuntu 9.10 安裝FireFox 3.6

sudo tar -C /opt/ -xf FireFox3.6的.tar.bz2


sudo ln -sf /opt/firefox/firefox /usr/bin/firefox

2010年3月10日 星期三

2010年1月7日 星期四

用IP查詢服務的ISP

台灣 IP 網段分配列表 (查某 IP 是哪家 ISP)
列出台灣IPv4 網段各公司分配列表
http://rms.twnic.net.tw/twnic/User/M...p?Order=ORG.ID

也可輸入 IP 後直接列出該 IP 屬於哪家 ISP
http://rms.twnic.net.tw/twnic/login.jsp