pymssql是一個比較通用的在python中連接MS SQL數據庫的玩意, 不過他的開發版(2.0)版比正式版更加穩定, 功能也豐富一些.

項目地址 https://code.google.com/p/pymssql

源碼地址

hg clone https://pymssql.googlecode.com/hg/ pymssql

編譯之前你需要幾樣東西

首先是Cython (Cython的安裝需求是需要VS2008 (py2.6以上) 或mingw32編譯環境

然後是Mingw32編譯環境, 編譯pymssql需要

 

獲得源碼之後就setup.py build -c mingw32吧 然後install

一切都是輕車熟路

 

問題來了

你會驚訝的發現他連不上任何數據庫

在新版本中, pymssql依賴freetds連接, 因此即使在windows, 他也需要freetds的配置文件

[global]
    port = 1433

[myserver]
	host = 192.168.0.16
	port = 1433

然後你還需要名字改成freetds.conf, 然後添加系統變量

set FREETDSCONF=c:/path/to/freetds.conf

set FREETDS=/path/to/freetds.conf路徑

 

 

然後就可以connect到host=myserver即可到達192.168.0.16了

 

 

 

有這麼一個數據表, 某字段用的varchar()

 

有那麼一個pymssql 這尼瑪connect的時候只能用utf8

 

然後select 出來的居然是 unicode 類型的 gbk編碼過的字符串

然後就有了這麼一個東西 將unicode類型的字符串轉換成普通的字符串 用來decode啥的

def fuckmssqlencode(s):
    return ''.join(map(chr, map(ord, s)))
 

首先你需要有 python-messaging, 除非你想自己写一大堆的pdu解码编码吧

https://github.com/pmarti/python-messaging
安装依赖是setup-tools, 因为安装脚本依赖他来解决其他依赖=_=.

当然还需要pySerial…用来和串口通讯,

这里假设ser是你的串口对象, 带timeout的设定(否则你就华丽丽等卡死吧23333)

发短信

from messaging.sms import SmsSubmit
from messaging.sms.deliver import SmsDeliver

pdu = SmsSubmit(number, text).to_pdu()[0]
ser.write('AT+CMGS=%d\r' % pdu.length)
ser.readlines()
ser.write('%s\x1a' % pdu.pdu)
for i in range(100):
	a = self.ser.readlines()
	for line in a :
		#print line
		if "OK" in line:
		    print "SUCC"
		    break
		if "ERROR" in line:
		    print "ERROR"
		    break

收短信

from messaging.sms import SmsSubmit
from messaging.sms.deliver import SmsDeliver

ser.write('AT+CMGL=0\r')
time.sleep(0.5)
recv_once = ser.read(1000)
recv = ''
while recv_once:
	recv = recv + recv_once
	recv_once = self.ser.read(1000)
	time.sleep(0.1)

for line in recv.split():
	try:
		sms = SmsDeliver(line.strip())
		print sms.number, sms.text
	except:
		pass

这里收的是所谓的未读短信, 执行过AT+CMGL=0之后就算已读了, 要AT+CMGL=4才能找到了…

 
def connectdb():
    name = "db" + hashlib.md5(str(time.time())).hexdigest()[0:4]
    db = QtSql.QSqlDatabase.addDatabase("QMYSQL", name)
    db.setHostName(dbcfg['server']);
    db.setPort(dbcfg['port'])
    db.setDatabaseName(dbcfg['dbname'])
    db.setUserName(dbcfg['dbuser'])
    db.setPassword(dbcfg['dbpw'])
    db.setConnectOptions("CLIENT_COMPRESS=1;MYSQL_OPT_RECONNECT=1;")
    dbstatus = db1.open()
    if not dbstatus:
        return None
    else:
        return db

这是一段连接到MYSQL数据库的函数

这里要指出的是

db.setConnectOptions("CLIENT_COMPRESS=1;MYSQL_OPT_RECONNECT=1;")
这行, 设定自动重连接恩

至于如何判断数据库断开,
class dbthread(QtCore.QThread):
    def __init__(self, parent=None):
        QtCore.QThread.__init__(self)
    def go (self):
        self.start()
    disconn = 0
    def run(self):
        query=QtSql.QSqlQuery(db=db)
        query.exec_(QtCore.QString('''SHOW STATUS LIKE 'Uptime';'''))
        print "db.isOpen()",db.isOpen()
        status=query.next()
        if not  status:
            self.emit(QtCore.SIGNAL("debug(QString)"), u"数据库断开, 正在重连...")
            self.disconn = 1
        elif self.disconn:
            self.emit(QtCore.SIGNAL("debug(QString)"), u"重连接成功")
            self.disconn = 0

写个定时器去运行吧

原来使用的是可怕到死的硬替换, 非常容易崩溃, 换成这样去做就基本不崩溃了

 

我真蛋疼…

這次會考慮使用BSD許可證釋出源代碼.

語言? 自然是Python , 這次會開始使用2.6了…

Python 2.5終究還是會被淘汰的….

 

svn co http://svn.copyliu.cn/aion_stat/

 

要說到最早時候開始寫程序, 要追溯到小學恩.

當年那個小霸王學習機有個BASIC, 順便小霸王包裝上除了說明書之外竟然還有一本小霸王的BASIC語言入門, 印象中還很厚, 裏面包含了一些程序設計的基本理念, 還有程序結構, 還有BASIC的語法, 後來我就非常蛋疼的在上面打hello world啦, 照抄example啦, 然後寫出點自己的A+B AxB 各種求余, 找素數的這個那個小程序.

後來到了初中,就開始被投入了萬惡的OI事業, 當年用C語言的不多, 所以學的是pascal, 到我高中畢業的時候據說pascal已經從NOIP除名了怎麼的(這是後話了), 反正C語言我是沒學過的.

自然初三的時候衝擊了一次NOIP的普及組, 當然 我的學校不是什麽名校(我畢業之後還倒閉了), 也就連初賽也進不去了, 那時候據說我差點能進複賽的樣子.

然後就是高中

高中的時候還是有進競賽培訓的, 依然是pascal,那時候就開始學習各式各樣的數據結構, 還有那些到現在依然感覺操蛋的算法, 反正呢, 因為pascal和NOIP的比賽內容, 養成了非常扎實的寫括號功底(?), 還有面向過程的功底, (當然還有各種用stdout來debug的能力, 跳轉到頭暈但是CPU不會暈的能力….)

現在的話, 因為Frank死命要我幫他調試他的lrcShow系列程序, 於是接觸到了那個神奇的python語言, 然後用我的扎實的寫括號功底(喂喂)和面向過程的功底寫出了我現在一看代碼就感覺非常頭暈的基於萬惡的CGI的TSLv1版, 現在倒好, 被那個 NEET+EX跟踪狂小王子万年受细节临阵脱逃废柴2222TB等等图书正直灵梦附体前缀炸弹幽灵主催精华后宫A 引入到了django的世界.

不得不說django是好東西

C語言么? 暫時沒有想法恩

 

嗯, 為了重新學習各種算法, 為了深研Python, 決定用python開發一個STG(彈幕遊戲)引擎, 那麼, 實現日期當然是遙遙無期了…….

嗯., 就是這樣, 需要幾本好的資料, 中英皆可.

 

# -*- coding: utf-8 -*-

import sys
reload(sys) # Python2.5 初始化后会删除 sys.setdefaultencoding 这个方法,我们需要重新载入
sys.setdefaultencoding(‘utf-8′)

str = ‘中文’
str.encode(‘gb18030′)

 

第一期功能目標: 服務端使用HTTP服務, 通過HTTP協議配合客戶端實現用戶註冊, 鍵權, 初步的公共聊天功能, 成員列表, 用戶IP地址以及是否公網用戶檢測, 用戶遊戲狀態(建 連 遊 窺) , 以及自動執行遊戲並進入響應菜單等功能.

第二期功能目標: 通過監視遊戲內存實現勝負判定讀取, 利用該數據計算用戶等級等, 如果有打開自動保存錄像,則自動上傳到服務器實現存檔.私聊, 聊天文字格式自定義.

第三期功能目標: 脫離HTTP協議

服務器端初步計畫: 為了減低程序複雜度, 初步使用HTTP協議, 利用服務器現有的HTTP(IIS apache等)服務端加上web腳本實現平台服務端. 具體內容分列如下.

服務器語言: python or php

數據庫: 為了更減低程序複雜度, 直接使用文本數據庫(後期可考慮mysql), 而且文本數據庫安全性較高

數據庫內容分別為, 用戶信息, 聊天記錄

客戶端使用python(或其他)語言編寫的GUI客戶端, 具體協定如下:

註冊及鑑權 略.

登陸後, 客戶端檢測本機IP地址並監聽一個端口, 將檢測到的IP發送給服務端, 由服務端通過發送一個簡單的文本檢測客戶端網絡的可達到狀態並記錄.

主動請求服務端要求用戶列表以及最近聊天記錄, 用戶列表應該存在用戶名, 網絡狀態, IP, 遊戲狀態等信息, 以後每隔一段時間主動請求刷新一次.

聊天使用utf8純文本, 發送聊天內容為簡單的提交過程, 服務端收到之後,記錄與文本數據庫中, 下發聊天記錄的內容包含一個ID號以辨別新舊.

客戶端可以通過功能按鈕來建立遊戲, 連接到指定某人的遊戲, 或觀看, 用戶起動該功能時, 馬上調用遊戲主程序並使用win32api將遊戲設定到相應的狀態. 然後發送一個請求到服務器要求更改用戶遊戲狀態,

 

-以上-

 

参考了网上VS调用方式仿照过来,比想象中简单,不过因为找不到迅雷的com接口列表,没有头绪了,可能以后搞伪春菜人格的时候会用到吧。


import win32com.client
a=win32com.client.Dispatch('ThunderAgent.Agent.1')
a.AddTask('http://www.baidu.com/index.htm/')
a.CommitTask()

© 2012 Copy S. Liu 的部落格 Suffusion theme by Sayontan Sinha