在開始之前...你必須先向facebook註冊你的網站
https://developers.facebook.com/
完成後即可得到你的
應用程式ID/API鑰匙=> 即後面會用到的client_id
網站URL=> 這應該是你自己設定的後面也會用到redirect_uri
應用程式密鑰=> 後面會用到的client_secret
完成註冊後就可以開始以下步驟了
Step1: 做登入的按鍵
這按鍵的只要加上這個超連結就行了
https://www.facebook.com/dialog/oauth?client_id=你的client_id&redirect_uri=http://www.7998.com.tw/
Step2: 在你的登入頁面需要加入一個code的參數 以便facebook將資料帶進來
在使用者按下登入的按鍵後facebook會讓使用者登入後再導回到你的網站並附帶一個code的參數
http://www.7998.com.tw/?code=2345eashdfhasdfjasdkfjasdlfjlasdj......這code是我亂打的 = ="
Step3: 利用facebook 傳來的code參數向facebook取得access_token
https://graph.facebook.com/oauth/access_token?client_id=應用程式ID/API鑰匙&redirect_uri=你的網址&client_secret=應用程式密鑰&code=2345eashdfhasdfjasdkfjasdlfjlasdj
會得到facebook 回傳的資料
access_token=asdfasdbja;ljserowjelrjlwjksejlfjsl....這當然也是我亂打的= ="
Step4: 利用access_token就可以取的使用者的資料了
https://graph.facebook.com/me?access_token=asdfasdbja;ljserowjelrjlwjksejlfjsl
詳細流程可以看facebook的官方說明
https://developers.facebook.com/docs/authentication/
2011年9月27日 星期二
[BCB] 視窗間傳遞物件訊息 SendMessage
在寫程式的時候有時候會需要和其他程式做溝通
這程式很有可能就在本機的電腦上的另一支程式
這時候就可以利用SendMessage這API來達成
首先先宣告結構
在.cpp中加入Send的function 當然最好在.h中先宣告
在接受端的部份
在from.h的private:後面加入宣告
在.cpp中加入
以上資料是從Delphi.Ktop找到的
這程式很有可能就在本機的電腦上的另一支程式
這時候就可以利用SendMessage這API來達成
首先先宣告結構
typedef struce _MYSTRUCT
{
char szChar[255];
int iInt;
}MyStruct;
在傳送端的部份在.cpp中加入Send的function 當然最好在.h中先宣告
void Send()
{
AnsiString app_name = "要收到訊息的視窗";
AnsiString msg = "要傳送的訊息";
int type = 1; //要傳送的數字
HWND hWnd = FindWindow(NULL, app_name.c_str()); //找到視窗
if(hWnd)
{
MyStruct ms;
istrcpy(ms.szChar, msg.c_str());
ms.iInt=type;
COPYDATASTRUCT CopyData;
CopyData.dwData=0;
CopyData.cbData=sizeof(MyStruct);
CopyData.lpData=&ms;
SendMessage( hWnd, WM_COPYDATA, NULL, (LPARM)&CopyData);
}
}
在接受端的部份
在from.h的private:後面加入宣告
void __fastcall WMCopyData( TMessage &Message );
BEGIN_MESSGE_MAP
MESSAGE_HANDLER(WM_COPYDATA, TMessage, WMCopyData)
END_MESSAGE_MAP(TForm)
在.cpp中加入
void __fastcall TMainForm::WMCopyData(TMessage &Message)
{
COPYDATASTRUCT *CopyData = (COPYDATASTRUCT*) (Message.LParam);
if(CopyData->cbData == sizeof(MyStruct) )
{
MyStruct ms;
CopyMemory(&ms, CopyData->lpData, CopyData->cbData);
//ms.Int 即是接收到的數字
//ms.szChar即是要接收到的訊息
}
}
以上資料是從Delphi.Ktop找到的
2010年8月23日 星期一
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月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
讀取
~/.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年1月29日 星期五
參考網站
Register相關
http://sunh.hosp.ncku.edu.tw/~cww/html/wreg.html
Licenses
http://www.openfoundry.org/Law-and-Policy/Licenses/
Programming with Clutter
http://www.openismus.com/documents/clutter_tutorial/1.0/docs/tutorial/html/index.html
Observer pattern
http://en.wikipedia.org/wiki/Observer_pattern
Set - C++ Reference
http://www.cplusplus.com/reference/stl/set/
用Open Source工具開發軟體
http://www.study-area.org/cyril/opentools/opentools/book1.html
http://sunh.hosp.ncku.edu.tw/~cww/html/wreg.html
Licenses
http://www.openfoundry.org/Law-and-Policy/Licenses/
Programming with Clutter
http://www.openismus.com/documents/clutter_tutorial/1.0/docs/tutorial/html/index.html
Observer pattern
http://en.wikipedia.org/wiki/Observer_pattern
Set - C++ Reference
http://www.cplusplus.com/reference/stl/set/
用Open Source工具開發軟體
http://www.study-area.org/cyril/opentools/opentools/book1.html
2009年10月20日 星期二
ADOConnection 動態連結資料庫
//設定資料庫路徑
AnsiString dbfile = "C:\\data.mdb";
ADOConnection->ConnectionString = WideString( AnsiString("Provider=Microsoft.Jet.OLEDB.4.0;")
+AnsiString("Data Source=") + dbfile +AnsiString(";Mode=ReadWrite;Persist Security Info=False") );
//設定其他元件的Connection (沒有重新指定將會無法使用)
ADOQuery->Connection = ADOConnection;
//之後就照原來的方式使用即可
參考網址 http://delphi.ktop.com.tw/board.php?cid=168&fid=918&tid=45446
AnsiString dbfile = "C:\\data.mdb";
ADOConnection->ConnectionString = WideString( AnsiString("Provider=Microsoft.Jet.OLEDB.4.0;")
+AnsiString("Data Source=") + dbfile +AnsiString(";Mode=ReadWrite;Persist Security Info=False") );
//設定其他元件的Connection (沒有重新指定將會無法使用)
ADOQuery->Connection = ADOConnection;
//之後就照原來的方式使用即可
參考網址 http://delphi.ktop.com.tw/board.php?cid=168&fid=918&tid=45446
2009年10月13日 星期二
取得檔案大小
/* 這部份的程式碼 雖然可以正常取得大小,但對簡體字不支援(雖然有時會找得到)
* 但是最重要的是這些程式碼在XP中執行時檔案or資料夾會被lock住無法修改
const char* szPath= path.t_str(); //path.c_str();
WIN32_FIND_DATA wfd;
ZeroMemory(&wfd, sizeof(WIN32_FIND_DATA));
FindFirstFile(szPath, &wfd);
return wfd.nFileSizeLow;
*/
//取得檔案大小
//以下做法可以使檔案Lock住的問題得以解決
TSearchRec sr;
double fsize = 0;
if( FindFirst( path, faAnyFile, sr ) == 0 )
{
fsize = (double)sr.Size;
}
FindClose( sr );
return fsize;
* 但是最重要的是這些程式碼在XP中執行時檔案or資料夾會被lock住無法修改
const char* szPath= path.t_str(); //path.c_str();
WIN32_FIND_DATA wfd;
ZeroMemory(&wfd, sizeof(WIN32_FIND_DATA));
FindFirstFile(szPath, &wfd);
return wfd.nFileSizeLow;
*/
//取得檔案大小
//以下做法可以使檔案Lock住的問題得以解決
TSearchRec sr;
double fsize = 0;
if( FindFirst( path, faAnyFile, sr ) == 0 )
{
fsize = (double)sr.Size;
}
FindClose( sr );
return fsize;
2009年8月21日 星期五
2009年8月11日 星期二
Python + Webkit
要在Python中加入Webkit的內容其實非常容易
首先第一步當然是
import webkit
然後產生webkit元件
self.web_view = webkit.WebView()
接下來就是將webkit的畫面放進準備好的容器中
如一個Box這邊用的是一個box
self.web_box.add(self.web_view)
再來就是設定webkit要顯示的網頁
以Google為例
self.web_view.open("http://www.google.com.tw")
這樣就完成了...網頁的內容就會呈現在你想要顯示的位置了
首先第一步當然是
import webkit
然後產生webkit元件
self.web_view = webkit.WebView()
接下來就是將webkit的畫面放進準備好的容器中
如一個Box這邊用的是一個box
self.web_box.add(self.web_view)
再來就是設定webkit要顯示的網頁
以Google為例
self.web_view.open("http://www.google.com.tw")
這樣就完成了...網頁的內容就會呈現在你想要顯示的位置了
2009年2月4日 星期三
BCB中使用Libcurl
很多OpenSource的程式有支援Window系統
也有很多是以VS開發的
當然...大部份的DLL套件也都是為VS而開發
而BCB要使用這些DLL套件必須要有BCB可以看得懂的點LIB
不然就要自已動態載入要用的Funcution這樣十分的費工
這邊用的方法就是直接產生Lib檔方便讀取的方法
首先到官網下載新的libcurl的binary
先把include中的curl放到系統中的BCB中的include資料夾中
然後將bin資料夾中的.dll檔一一做出對應的.lib檔...做法為
implib -a -c -f xxx.lib xxx.dll ::a switch force add _ alias to MS cdecl
接著把這些檔案放到你的程式的目錄中
並將這些.lib檔加入專案之中
就可以開始用libcurl開發程式了
這方法在其他的套件應該也適用
也有很多是以VS開發的
當然...大部份的DLL套件也都是為VS而開發
而BCB要使用這些DLL套件必須要有BCB可以看得懂的點LIB
不然就要自已動態載入要用的Funcution這樣十分的費工
這邊用的方法就是直接產生Lib檔方便讀取的方法
首先到官網下載新的libcurl的binary
先把include中的curl放到系統中的BCB中的include資料夾中
然後將bin資料夾中的.dll檔一一做出對應的.lib檔...做法為
implib -a -c -f xxx.lib xxx.dll ::a switch force add _ alias to MS cdecl
接著把這些檔案放到你的程式的目錄中
並將這些.lib檔加入專案之中
就可以開始用libcurl開發程式了
這方法在其他的套件應該也適用
2008年9月6日 星期六
[Python]透過DBUS調整螢幕亮度
今天研究了一下Screenlets的BrightnessScreenlet.py這支程式
發現到他調整螢幕亮度的方式是由DBus來控制的
在這邊把主要重點的部份寫出來
發現到他調整螢幕亮度的方式是由DBus來控制的
在這邊把主要重點的部份寫出來
#載入DBUS
import dbus
#設定Bus
bus = dbus.Bus(dbus.Bus.TYPE_SESSION)
hal_object = bus.get_object('org.freedesktop.PowerManagement','/org/freedesktop/PowerManagement/Backlight')
#設置interface
hal_interface = dbus.Interface(hal_object,'org.freedesktop.PowerManagement.Backlight')
#由這dbus的interface去設定亮度(0~100)
hal_interface.SetBrightness(brightness)
[C/C++]滑鼠手勢...
今天一進公司就看到Steven和Jacky在討論東西...
在我才剛按下開機鍵準備坐上我的座位時
就聽見Steven說...”這就交給kie做吧! 反正他這麼閒“ .....(= =ll)雖然真的很閒也不用這麼大聲的講出來吧!
好啦...切入重點...他們在討論的就是一個簡單的滑鼠手勢的程式的演算法
其實真的是非常的簡單...Coding的部份也不過幾行而已...
重點是他們都把演算法都討論的差不多了...於是希望我實做出來..
好吧...於是就有了這一篇文章啦.....
這個程式呢...基本上應該算是一個Funtion
所以呢...我就不把全部的程式貼出來了
做法是
先按下左鍵取得起點...接著比對每一點座標
當位移量超過誤差的範圍就記錄為一個動作
並記下完成的點的位置
當比對和上次的動作相同時就不記錄
當放開左鍵時動作結束
以下為重點的Source Code
首先我在主程式加入了4個全域變數
Direction ..存上一次得到的方向
X.........記錄起始點的X座標
Y.........記錄起始點的Y座標
Range.....容許手殘畫歪的範圍
接著就是在程式中加入了3個事件
MouseDown...當然就是滑鼠按下的事件...這是為了取得開始的位置...你總要知道什麼時候開始畫手勢嘛
MouseMotion..滑鼠移動的事件.......都說是滑鼠手勢了...當然就是滑鼠動的時候要有記錄丫
MouseLeft.....滑鼠放開的事件......有始有終囉
然後...有coding的部份當然除了給初始值外就是這3個事件囉
以下為三個事件的Souse Code ... 有興趣就看看吧..
在我才剛按下開機鍵準備坐上我的座位時
就聽見Steven說...”這就交給kie做吧! 反正他這麼閒“ .....(= =ll)雖然真的很閒也不用這麼大聲的講出來吧!
好啦...切入重點...他們在討論的就是一個簡單的滑鼠手勢的程式的演算法
其實真的是非常的簡單...Coding的部份也不過幾行而已...
重點是他們都把演算法都討論的差不多了...於是希望我實做出來..
好吧...於是就有了這一篇文章啦.....
這個程式呢...基本上應該算是一個Funtion
所以呢...我就不把全部的程式貼出來了
做法是
先按下左鍵取得起點...接著比對每一點座標
當位移量超過誤差的範圍就記錄為一個動作
並記下完成的點的位置
當比對和上次的動作相同時就不記錄
當放開左鍵時動作結束
以下為重點的Source Code
首先我在主程式加入了4個全域變數
Direction ..存上一次得到的方向
X.........記錄起始點的X座標
Y.........記錄起始點的Y座標
Range.....容許手殘畫歪的範圍
接著就是在程式中加入了3個事件
MouseDown...當然就是滑鼠按下的事件...這是為了取得開始的位置...你總要知道什麼時候開始畫手勢嘛
MouseMotion..滑鼠移動的事件.......都說是滑鼠手勢了...當然就是滑鼠動的時候要有記錄丫
MouseLeft.....滑鼠放開的事件......有始有終囉
然後...有coding的部份當然除了給初始值外就是這3個事件囉
以下為三個事件的Souse Code ... 有興趣就看看吧..
/*!
* wxEVT_LEFT_DOWN event handler for ID_HELLOMOUSE
*/
void HelloMouse::OnMouseLeftDown( wxMouseEvent& event )
{
X = event.m_x;
Y = event.m_y;
printf("oh...%d,%d\n",X,Y);
}
/*!
* wxEVT_MOTION event handler for ID_HELLOMOUSE
*/
void HelloMouse::OnMouseMotion( wxMouseEvent& event )
{
if(event.m_leftDown)
{
if(abs(X-event.m_x)>Range)
{
if((X>event.m_x)&&(Direction != 'L'))
{
Direction = 'L';
printf("L");
}
if((X {
Direction = 'R';
printf("R");
}
X = event.m_x;
Y = event.m_y;
}
if(abs(Y-event.m_y)>Range)
{
if((Y>event.m_y)&&(Direction != 'U'))
{
Direction = 'U';
printf("U");
}
if((Y {
Direction = 'D';
printf("D");
}
X = event.m_x;
Y = event.m_y;
}
}
}
/*!
* wxEVT_LEFT_UP event handler for ID_HELLOMOUSE
*/
void HelloMouse::OnMouseLeftUp( wxMouseEvent& event )
{
X = 0;
Y = 0;
Direction = NULL;
printf("\n");
}
2008年8月28日 星期四
電腦猜數字....
最近無聊上班太無聊
所以開始研究些有的沒的東西
於是想說研究看看電腦猜數字的程式的演算法是怎麼做到的
昨天大概想了一下還是不知道該如何下手
於是上Google找了一下...結果還真的是很多丫....
而且還人家還附上原始碼呢!!
參考網址:http://www.javaworld.com.tw/jute/post/view?bid=35&id=35423&sty=1&tpg=1&age=0
其實這方法的邏輯非常的簡單...
只分幾個步驟如下
Step1:
產生一個陣列存放所有可能的答案
如:{0123,0124,0125,.......,9875,9876}
Step2:
從所有可能中找出一個數來猜
如:第一個0123
Step3:
由玩家所填入的?A?B去判斷所有答案中符合這條件的所有的數
因為....由正解和你猜的數分析會是?A?B那也表示反推也是一樣的答案
然後將不符合條件的數設為-1
如:假設答案是5432
則0123得到0A2B
如果把0123當解答的話 你猜5432得到的也是0A2B
所以說你現在是反推的方式去想...只有和0123比較會得到0A2B的數才有可能是解答
也就是說其他不可能的數就可以刪除掉了
Step4:
重覆Step2~Step3就可以很快的得到答案了
所以一切就是這麼的簡單....
所以開始研究些有的沒的東西
於是想說研究看看電腦猜數字的程式的演算法是怎麼做到的
昨天大概想了一下還是不知道該如何下手
於是上Google找了一下...結果還真的是很多丫....
而且還人家還附上原始碼呢!!
參考網址:http://www.javaworld.com.tw/jute/post/view?bid=35&id=35423&sty=1&tpg=1&age=0
其實這方法的邏輯非常的簡單...
只分幾個步驟如下
Step1:
產生一個陣列存放所有可能的答案
如:{0123,0124,0125,.......,9875,9876}
Step2:
從所有可能中找出一個數來猜
如:第一個0123
Step3:
由玩家所填入的?A?B去判斷所有答案中符合這條件的所有的數
因為....由正解和你猜的數分析會是?A?B那也表示反推也是一樣的答案
然後將不符合條件的數設為-1
如:假設答案是5432
則0123得到0A2B
如果把0123當解答的話 你猜5432得到的也是0A2B
所以說你現在是反推的方式去想...只有和0123比較會得到0A2B的數才有可能是解答
也就是說其他不可能的數就可以刪除掉了
Step4:
重覆Step2~Step3就可以很快的得到答案了
所以一切就是這麼的簡單....
2008年8月22日 星期五
[Python]用DBus和Pidgin通訊
要用Python呼叫正在執行中的Pidgin其實非常的簡單
只要你的Pidgin的DBus的Function正常執行
可以用這行程式檢查
這是監聽DBus上由"im.pidgin.purple.PurpleInterface"所發出的訊號
看得到回應就是有,看不見就是沒有
如果你的DBus Function正常執行的話
你只要在Python 的前面import 進dbus
再加點設定就OK了
就像這樣
接著就能在程式中呼叫pidgin中的Dbus函式了
如以下是一個登入的function
其他的參考資訊可在Pidgin官網查到
http://developer.pidgin.im/wiki/DbusHowto
只要你的Pidgin的DBus的Function正常執行
可以用這行程式檢查
$dbus-monitor type=signal interface="im.pidgin.purple.PurpleInterface"這是監聽DBus上由"im.pidgin.purple.PurpleInterface"所發出的訊號
看得到回應就是有,看不見就是沒有
如果你的DBus Function正常執行的話
你只要在Python 的前面import 進dbus
再加點設定就OK了
就像這樣
import dbus bus = dbus.SessionBus()
obj = bus.get_object("im.pidgin.purple.PurpleService", "/im/pidgin/purple/PurpleObject")
purple = dbus.Interface(obj, "im.pidgin.purple.PurpleInterface")
接著就能在程式中呼叫pidgin中的Dbus函式了
如以下是一個登入的function
def login(account_protocol, account_name, account_pass):
account = purple.PurpleAccountNew(account_name, account_protocol)
purple.PurpleAccountSetPassword(account, account_pass)
purple.PurpleAccountsAdd(account) purple.PurpleAccountSetEnabled(account,"gtk-gaim",1)
purple.PurpleBlistSetVisible(1)
其他的參考資訊可在Pidgin官網查到
http://developer.pidgin.im/wiki/DbusHowto
2008年6月21日 星期六
[Python]Glade加Python的GUI設計入門
已經有一段時間沒有用Glade和Python寫程式了
為了怕自己忘記...所以還是記錄下來好了
首先在開始之前....要先安裝以下套件
Python....這是一定要的...不然程式不可能會Run
Glade3.... 這在開發階段是必須的...方便視窗的制作...當然還有別的方法可以做...那之後再討論
PyGtk.... 這也是必要的圖形介面的API
然後就是一步一步的開始程式設計
首先開啟Glade3

產生一個Frame

接著產生一個box(hbox或vbox都可以差別在直的排列或橫向排列)
設定切成幾份...這是切三份
然後放入元件...這邊放了一個Label和一個Text加一個hbox
在hbox中再放入兩個button...如此一來畫面就差不多完成了

接下來設定事件
這是完成的畫面...
為了怕自己忘記...所以還是記錄下來好了
首先在開始之前....要先安裝以下套件
Python....這是一定要的...不然程式不可能會Run
Glade3.... 這在開發階段是必須的...方便視窗的制作...當然還有別的方法可以做...那之後再討論
PyGtk.... 這也是必要的圖形介面的API
然後就是一步一步的開始程式設計
首先開啟Glade3

產生一個Frame

接著產生一個box(hbox或vbox都可以差別在直的排列或橫向排列)
設定切成幾份...這是切三份然後放入元件...這邊放了一個Label和一個Text加一個hbox

在hbox中再放入兩個button...如此一來畫面就差不多完成了

接下來設定事件

最後就可以開始程式設計了...
程式碼如下:
#!/bin/python
import gtk.glade
import gtk
import pygtk
class View:
def __init__(self):
#載入glade檔
self.UI = gtk.glade.XML("View.glade")
#載入視窗
self.window = self.UI.get_widget("window1")
#戴入元件
self.btn1 = self.UI.get_widget("eventbox1")
self.btn2 = self.UI.get_widget("eventbox2")
#顯示視窗畫面
self.window.show_all()
#設定事件
dic = {"on_window1_destroy": gtk.main_quit,
"on_btn1_button_press_event":self.on_btn1_button_press_event,
"on_btn2_button_press_event":self.on_btn2_button_press_event
}
#連接事件
self.UI.signal_autoconnect(dic)
#事件的Function
def on_btn1_button_press_event(self,widget,event):
print "hello"
def on_btn2_button_press_event(self,widget,event):
print "world"
#以下為程式進入點
def main():
gtk.main()
if __name__ == "__main__":
tvexample = View()
main()
這是完成的畫面...
訂閱:
文章 (Atom)