顯示具有 程式設計 標籤的文章。 顯示所有文章
顯示具有 程式設計 標籤的文章。 顯示所有文章

2011年9月28日 星期三

[教學]用Facebook帳號登入你的網站

在開始之前...你必須先向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來達成


首先先宣告結構
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日 星期一

C++ 使用環境變數

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

#include < stdlib.h >

QString strEnv = getenv( "HOME");

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

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

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;

2009年8月21日 星期五

重新整理檔案總管某個目錄的圖示

之前找了很久
也有找到另一個方法重新整理但卻沒有refresh圖示
最後找到的時候測試的時候另人傻眼
因為程式只有兩行 = =a

第一行
#include "shlobj.h"

第二行
SHChangeNotify(SHCNE_UPDATEITEM, SHCNF_PATH | SHCNF_FLUSHNOWAIT, 目錄路徑, NULL);

不過問題解決了還是滿開心的

2009年8月11日 星期二

Python + Mozembed

第一步
import gtkmozembed

第二步
產生元件
self.web_view = gtkmozembed.MozEmbed()

第三步
放入容器
self.web_box.add(self.web_view)

第四步
顯示畫面
self.web_view.load_url("www.google.com")

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")

這樣就完成了...網頁的內容就會呈現在你想要顯示的位置了

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開發程式了

這方法在其他的套件應該也適用

2008年9月6日 星期六

[Python]透過DBUS調整螢幕亮度

今天研究了一下Screenlets的BrightnessScreenlet.py這支程式
發現到他調整螢幕亮度的方式是由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 ... 有興趣就看看吧..

/*!
* 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就可以很快的得到答案了


所以一切就是這麼的簡單....

2008年8月22日 星期五

[Python]用DBus和Pidgin通訊

要用Python呼叫正在執行中的Pidgin其實非常的簡單
只要你的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...如此一來畫面就差不多完成了


接下來設定事件



最後就可以開始程式設計了...

程式碼如下:

#!/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()



這是完成的畫面...