socketref,再见!高德

https://github.com/adoggie

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  246 Posts :: 4 Stories :: 312 Comments :: 0 Trackbacks

常用链接

留言簿(54)

我参与的团队

搜索

  •  

最新评论

阅读排行榜

评论排行榜

#



import sys 
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtWebKit import *
start_url = 'http://searchex.yixun.com/?YTAG=1.100090000'
def save_file(data,file='temp.txt'):
f = open(file,'w')
f.write(data)
f.close()
web = None
def onDone():
f = open('scrapy.html','w')
page = web.page().mainFrame().toHtml().toUtf8().data()
f.write(page) 
f.close()
print "Done ..."
e = web.page().mainFrame().documentElement().findFirst("h3[class=m_classbox_hd]")
print e.tagName()
#print dir(e)
print e.toPlainText().toUtf8().data() #.decode('gbk') #.decode('utf-8') #.encode('utf-8')
save_file(e.toPlainText().toUtf8().data())
def onStart():
print "Started..." 
app = QApplication(sys.argv)
web = QWebView()
web.page().mainFrame().loadStarted.connect(onStart)
web.page().mainFrame().loadFinished.connect(onDone)
web.load(QUrl(start_url))
#print web.page().mainFrame().toHtml()
print 'end'
web.show()
sys.exit(app.exec_())
posted @ 2014-05-19 21:41 放屁阿狗 阅读(772) | 评论 (0)编辑 收藏

开始抓yixun.com的商品信息,开始很开心,但一下子来了问题。

http请求回来的商品分类条目用<a href=>, 但这个href不能直接使用,因为页面加载之后会启动js程序(一般都是jquery)对页面element进行配置和处理,例如:设置风格、事件等等。 

yixun玩了个防页面过期的小技巧:
   >每个请求page在server都会产生一个有效期变量XY(具体算法不详),
   >如果获取商品<a>直接请求,server将返回失败,因为<a href>并未包含XY
   >page加载完成之后js代码设置<a>被点击时触发事件E,E将XY添加到<a href>内
   >然后可以正确请求了


易迅防止请求页面过期,在主页中设置了一下参数: 
<script type="text/javascript"> window.yPageId = '17384560'; window.yPageLevel = '2';</script>

在页面内容中显示
<a ytag="40037" href="http://searchex.yixun.com/705938t705942-1-/" target="_blank">路由器</a>
注意: 返回的html就是如此

但如果用户点击(左键或者右键)此 node对象时,js代码会动态插入一个YTAG的变量 

未点击:
<a ytag="40037" href="http://searchex.yixun.com/705938t705942-1-/" target="_blank">路由器</a>

点击:   
<a ytag="40037" href="http://searchex.yixun.com/705938t705942-1-/?YTAG=2.1738456040037" target="_blank">路由器</a>

变量生成方式在这个js中实现:

此js 使用了jquery,页面完成加载之后,将配置页面元素的onclick行为,如果点击了页面元素,将YTAG属性加入到商品<a href=""/>中去 
js代码凌乱可以使用:
进行格式化观察

js代码:

G.header.search = {
    init: function() {
        G.header.search.event();
        G.header.search.setInputStyle();
        G.header.search.autoComplete();
    },
G.header.search.init();
query: function() {
        var input = $("#q_show"),
        v = $.trim(input.val()),
        c = $("#cate_show").val(),
        ret = true,
        href = input.attr("_href");
        if (v === G.header._Q_SHOW_DEF_TEXT && href) {
            window.location.href = href;
            ret = false;
        } else if (v === "" || v === G.header._Q_SHOW_DEF_TEXT) {
            if (!|| (c && c == "")) {
                input.focus();
                ret = false;
            }
        }
        if ($('#q_show').parents("form").find('input[name="YTAG"]').length === 0) {
            var ytag = $('#q_show').parents("form").find('input[type="submit"]').attr("ytag");
            var YTAG = (window.yPageLevel || 0+ '.' + (window.yPageId || 0+ ytag;
            $('#q_show').parents("form").append($('<input type="hidden" name="YTAG" value="' + YTAG + '" />'));
        }
        return ret;
    }

程序定义了G.header.search对象,并进行初始化init() ,query()是用户点击查询时触发使用 
init()内部配置了query函数,用于鼠标点击时候生成YTAG属性
看代码就很简单了

YTAG生成方式就是 window.yPageLevel+'.'+window.yPageId + <a ytag="40037">
这样一个商品条目的href就获得了
posted @ 2014-05-19 21:30 放屁阿狗 阅读(1666) | 评论 (0)编辑 收藏

posted @ 2014-05-15 01:00 放屁阿狗 阅读(775) | 评论 (0)编辑 收藏

sudo kextunload /System/Library/Extensions/AppleHDA.kext

sudo kextload /System/Library/Extensions/AppleHDA.kext

执行这两条就行了

posted @ 2014-05-14 12:56 放屁阿狗 阅读(530) | 评论 (0)编辑 收藏

tkinter工作在主线程,而gevent是单线程工作,如何整合在一起?
瞅到一段代码,迅速收藏



 1 import gevent
 2 from gevent import socket
 3 import Tkinter as tk
 4 
 5 class SockLoop(object):
 6     def __init__(self, callback):
 7         self.callback = callback
 8 
 9     def __call__(self, sock, client):
10         while 1:
11             mes = sock.recv(256)
12             ret = self.callback(client, mes)
13             if ret is not None:
14                 sock.send(ret)
15 
16 def socket_server(port, callback):
17     ssock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_TCP)
18     ssock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
19     ssock.bind(('', port))
20     ssock.listen(5)
21 
22     while 1:
23         sock, client = ssock.accept()
24         gevent.spawn(callback, sock, client)
25 
26 class App(object):
27     def __init__(self, root):
28         self.greenlet = None
29         self.root = root
30         self._build_window(root)
31         self.root.after(100, self._connect)
32 
33     def add_text(self, text):
34         cleaned_string = text.replace('\r''')
35         self.text.insert(tk.END, cleaned_string)
36 
37     def quit(self):
38         self.root.quit()
39 
40     def _build_window(self, root):
41         self.frame = tk.Frame(root)
42         self.text = tk.Text(self.frame)
43         self.quit_button = tk.Button(self.frame, text="Quit", command=self.quit)
44         self.text.pack()
45         self.quit_button.pack()
46         self.frame.pack()
47 
48     def _connect(self):
49         self.greenlet = gevent.spawn(
50                 socket_server,
51                 8080,
52                 SockLoop(lambda cl, txt: self.add_text("%s: %s" % (cl, txt))))
53         self.gevent_loop_step()
54 
55     def gevent_loop_step(self):
56         gevent.sleep()
57         self.root.after_idle(self.gevent_loop_step)
58 
59 
60 if __name__ == '__main__':
61     root = tk.Tk()
62     app = App(root)
63     root.mainloop()
posted @ 2014-05-04 16:59 放屁阿狗 阅读(940) | 评论 (0)编辑 收藏

俺不是果粉,但开发必须mac
参加的开发者大会,老外没一个不是mac的,也的确如此,mac是开发神器,虽然贵点,但还是很值,对得起他的身价 。
这是一种态度,价值观世界观的体现
linux+windows的完美结合,不!! ui远超windows

14.5k mac pro 15 retina 8G 内存 250 G ssd ,都配置差了点,但目前够了,有钱了再买台高配的,然后imac,还有那个外星桶的工作站


酷毙!
posted @ 2014-04-15 00:53 放屁阿狗 阅读(470) | 评论 (0)编辑 收藏

写代码,写好代码其实并不难,但如果要做好文档,能完整阐述清楚自己的构思、想法和逻辑结构,这比较难,自己也缺少这方面的耐心。
很多opensource的代码根本不需要文档也能一目了然,这是一种定力
多年前的项目中使用到python和ffmpeg, 网络上搜索了一下,均不能满足自己的要求。ffmpeg的python绑定提供的均是文件级的访问控制,也就是说没有暴露更多的可控接口来用。
所以还是一切都自己来做
ffmpeg采用0.81版本以上,当时发现mov文件在0.71以下无法正常解码,到0.81则解决了此问题。
python包装ffmpeg的方式很多,最好的可能就是swig,但太烦了,最后选择ctypes来访问ffmpeg接口。 
如果直接使用ffmpeg的api接口也不太合适,因为要暴露很多ffmpeg的接口、数据类型、常数定义等。
所以我是这么处理:   
  1. 编写一个功能动态库来包装ffmpeg,提供基本的业务功能 ,屏蔽ffmpeg细节,这里叫ffmpeg_media_codec.dll
  2. 用ctypes包装此ffmpeg_media_codec.dll,这里是ffmpeg.py
  3. 业务代码使用ffmpeg.py提供的接口访问、解码多媒体文件 
代码: http://sw2us.com/static/projects/py-ffmpeg/

ffmpeg_media_codec.dll 暴露的c接口 

 1 ffmpeg lib interface list:
 2 ===========================
 4 typedef unsigned char  StreamByte_t;
 6 struct MediaStreamInfo_t{
 7     int codec_type;
 8     int codec_id;
 9     int width;
10     int height;
11     int gopsize;
12     int pixfmt;
13     int tb_num;
14     int tb_den;
15     int bitrate;
16     int frame_number;
17     int videostream; //视频流编号
18 };
19 
20 struct MediaVideoFrame_t{
21     StreamByte_t *    rgb24;
22     size_t            size;
23     int                width;
24     int                height;
25     unsigned int    sequence; //控制播放顺序
26     unsigned int    duration; //播放时间
27 };
28 
29 struct MediaPacket_t{
30      StreamByte_t*    data;
31      size_t            size;
32     AVPacket    *    pkt;
33     int                stream;    //流编号 
34     int                dts;
35     int                pts;
36     size_t            sequence;
37     size_t            duration;
39 };
40 
41 struct MediaFormatContext_t;
42 
43 //解码器
44 struct MediaCodecContext_t{
45     AVCodecContext * codecCtx;    //AVCodecContext*
46     AVCodec *        codec;    
47     int                stream; //流编号
48     AVFrame *        rgbframe24; //
49     AVFrame*        frame;    //
50     StreamByte_t*    buffer;
51     size_t            bufsize;
52     void *            user;
53     MediaStreamInfo_t si;
54 };
55 
56 struct MediaFormatContext_t{
57     AVFormatContext * fc; //AVFormatContext* 
58     MediaStreamInfo_t video;    //视频信息
60 };
66 #ifdef __cplusplus
67  extern "C" {  
68 #endif
69 
70 int InitLib();         //初始化解码库
71 void Cleanup();    //
73 MediaCodecContext_t* InitAvCodec(MediaStreamInfo_t* si);    //根据媒体类型分配解码器对象
74 void FreeAvCodec(MediaCodecContext_t* codec);                  //释放解码器对象
76 MediaVideoFrame_t * DecodeVideoFrame(MediaCodecContext_t* ctx,MediaPacket_t* pkt);  //送入媒体包进行解码,返回视频帧
77 void FreeVideoFrame(MediaVideoFrame_t* frame);                  //释放视频帧
79 MediaPacket_t * AllocPacket();                                             //分配一个流媒体包对象(用于网传)
80 void FreePacket(MediaPacket_t* pkt);                                    //释放流媒体包
82 MediaFormatContext_t* InitAvFormatContext(char * file);          //媒体文件访问上下文,申请
83 void FreeAvFormatContext(MediaFormatContext_t* ctx);          //释放
84 MediaPacket_t* ReadNextPacket(MediaFormatContext_t* ctx);   //读媒体文件一个数据包
85 void ReadReset(MediaFormatContext_t* ctx) ;                //重置媒体访问读取位置
86 int SeekToTime(int timesec) ;                                     //跳跃到指定时间

ffmpeg.py 包装:

  1 import ctypes
  2 from ctypes import *

  5 _lib = cdll.LoadLibrary('ffmpeg.dll')
  6 
  7 _int_types = (c_int16, c_int32)
  8 if hasattr(ctypes, 'c_int64'):
  9     # Some builds of ctypes apparently do not have c_int64
 10     # defined; it's a pretty good bet that these builds do not
 11     # have 64-bit pointers.
 12     _int_types += (ctypes.c_int64,)
 13 for t in _int_types:
 14     if sizeof(t) == sizeof(c_size_t):
 15         c_ptrdiff_t = t
 16 
 17 class c_void(Structure):
 18     # c_void_p is a buggy return type, converting to int, so
 19     # POINTER(None) == c_void_p is actually written as
 20     # POINTER(c_void), so it can be treated as a real pointer.
 21     _fields_ = [('dummy', c_int)]

 26 class MediaStreamInfo_t(Structure):
 27     _fields_ = [
 28         ('codec_type', c_int),
 29         ('codec_id', c_int),
 30         ('width', c_int),
 31         ('height', c_int),
 32         ('gopsize', c_int),
 33         ('pixfmt', c_int),
 34         ('tb_num',c_int),
 35         ('tb_den',c_int),
 36         ('bitrate',c_int),
 37         ('frame_number',c_int),
 38         ('videostream',c_int),
 39         ('duration',c_int),
 40         ('extr',POINTER(c_char)), #解码器 额外hash表数据
 41         ('extrsize',c_int),
 42     ]
 43 
 44 class MediaVideoFrame_t(Structure):
 45     _fields_=[
 46         ('rgb24',POINTER(c_char)),
 47         ('size',c_uint),
 48         ('width',c_int),
 49         ('height',c_int),
 50         ('sequence',c_uint),
 51         ('duration',c_uint)
 52     ]
 53     
 54 class MediaPacket_t(Structure):
 55     _fields_=[
 56         ('data',POINTER(c_char)),
 57         ('size',c_uint),
 58         ('pkt',c_char_p),
 59         ('stream',c_int),
 60         ('dts',c_int),
 61         ('pts',c_int),
 62         ('sequence',c_uint),
 63         ('duration',c_uint)
 64     ]
 65     
 66     
 67 class MediaCodecContext_t(Structure):
 68     _fields_=[
 69         ('codecCtx',c_char_p),
 70         ('codec',c_char_p),
 71         ('stream',c_int),
 72         ('rgbframe24',c_char_p),
 73         ('frame',c_char_p),
 74         ('buffer',c_char_p),
 75         ('bufsize',c_uint),
 76         ('user',c_char_p),
 77         ('si',MediaStreamInfo_t)
 78     ]    
 79     
 80 class MediaFormatContext_t(Structure):
 81     _fields_=[
 82         ('fc',c_char_p),
 83         ('video',MediaStreamInfo_t)
 84     ]
 85     
 86 InitAvCodec = _lib.InitAvCodec
 87 InitAvCodec.restype = POINTER(MediaCodecContext_t)
 88 InitAvCodec.argtypes = [POINTER(MediaStreamInfo_t)]
 89 
 90 
 91 FreeAvCodec = _lib.FreeAvCodec
 92 FreeAvCodec.restype = None
 93 FreeAvCodec.argtypes = [POINTER(MediaCodecContext_t)]
 96 DecodeVideoFrame = _lib.DecodeVideoFrame
 97 DecodeVideoFrame.restype = POINTER(MediaVideoFrame_t)
 98 DecodeVideoFrame.argtypes = [POINTER(MediaCodecContext_t),POINTER(MediaPacket_t)]
100 FreeVideoFrame = _lib.FreeVideoFrame
101 FreeVideoFrame.restype = None
102 FreeVideoFrame.argtypes = [POINTER(MediaVideoFrame_t)]  
104 AllocPacket = _lib.AllocPacket
105 AllocPacket.restype = POINTER(MediaPacket_t)
106 AllocPacket.argtypes = []
109 FreePacket = _lib.FreePacket
110 FreePacket.restype = None
111 FreePacket.argtypes = [POINTER(MediaPacket_t),c_int]
113 InitAvFormatContext = _lib.InitAvFormatContext
114 InitAvFormatContext.restype = POINTER(MediaFormatContext_t)
115 InitAvFormatContext.argtypes = [c_char_p]
117 FreeAvFormatContext = _lib.FreeAvFormatContext
118 FreeAvFormatContext.restype = None
119 FreeAvFormatContext.argtypes = [POINTER(MediaFormatContext_t)]
122 ReadNextPacket = _lib.ReadNextPacket
123 ReadNextPacket.restype = POINTER(MediaPacket_t)
124 ReadNextPacket.argtypes = [POINTER(MediaFormatContext_t)]
127 ReadReset = _lib.ReadReset
128 ReadReset.restype = None
129 ReadReset.argtypes = [POINTER(MediaFormatContext_t)]
130 
131 SeekToTime = _lib.SeekToTime
132 SeekToTime.restype = c_int
133 SeekToTime.argtypes = [POINTER(MediaFormatContext_t),c_int]
134 
135 FlushBuffer = _lib.FlushBuffer
136 FlushBuffer.restype =None
137 FlushBuffer.argtypes = [POINTER(MediaCodecContext_t)]
138 
139 InitLib = _lib.InitLib
140 InitLib.restype =None
141 InitLib.argtypes = []
142 
143 Cleanup = _lib.Cleanup
144 Cleanup.restype =None
145 Cleanup.argtypes = []

好了,看看如何使用这些接口 
视频文件播放:      http://sw2us.com/static/projects/py-ffmpeg/test_qt.py
posted @ 2014-04-14 22:35 放屁阿狗 阅读(5836) | 评论 (2)编辑 收藏

从事webgis及其应用有些时日,实验性质的东西一直没有被大规模应用,一路走来颇多辛苦 
现将代码放出,有兴趣的朋友可看看,包括地图数据处理编译、地图渲染服务程序、wms程序、tce
http://114.215.178.29/wms/

目前从事im,移动互联网平台框架,p2p,并行计算方面研究
posted @ 2014-04-13 14:27 放屁阿狗 阅读(1421) | 评论 (4)编辑 收藏

近一周时间都在玩p2p,本来以为实现很简单,但做起来实属不易 。 
Udp穿透Nat会遇到多种Nat类型: 
1.FULL CORE 
2. RESTRICT
3. PORT-RESTRICT
4. SYMMETRIC 
1-3三种NAT实现穿透很简单,问题在于处理第4种类型:对等NAT 
SYMMETRIC NAT的工作模式区分在于内网通过NAT时分配的外部端口的方式不同,这又有三种情况: 
1. 端口递增: 通常新端口号会是前一次分配端口号加1或者加固定值 
2. 端口在当前NAT最新端口的左右区间: 例如当前NAT外网端口P,那新的分配端口会落在 -N < P < N
3. 随机分配SR (这个根据当时NAT的网络情况参数等作为函数f(x)的因子决定)
这第三种分配方式,目前无解,只要任意一端存在SR,则无法穿透  
当然很多技术研究者提出了如何猜测动态端口的方案,例如:统计技术的使用,服务器可对固定NAT进行采样分析等等。。
这个很难哦!
面对SR我直接放弃了,还真不巧,测试了3,4个网络环境的NAT,居然50%是SR,50%是SYMMETRIC的1,2种类型 。 
还是老实的服务器中转把!
一些p2p资料供参考:  http://114.215.178.29/static/p2p
posted @ 2014-04-11 00:32 放屁阿狗 阅读(369) | 评论 (0)编辑 收藏

应用中经常用pyCrypto 来生成用户Token等相关信息,够简单,所以贴代码分享
部分代码被关闭或者打开,使用者请自行调整,如果了解rsa很简单理解一下代码 

  1 GCONFS={
  2     'auth_public_keyfile':'public.rsa',
  3     'auth_private_keyfile':'private.rsa'
  4 }
  5 
  6 
  7 def encrypt_des(key,text):
  8     from Crypto.Cipher import DES
  9     import base64
 10     from Crypto import Random
 11     #iv = Random.get_random_bytes(8)
 12     des = DES.new(key, DES.MODE_ECB)
 13     reminder = len(text)%8
 14     if reminder ==0:  # pad 8 bytes
 15         text+='\x08'*8
 16     else:
 17         text+=chr(8-reminder)* (8-reminder)
 18     #text+=' '*(8-len(text)%8)
 19     return des.encrypt(text)
 20 #return base64.encodestring(des.encrypt(text))
 21 
 22 def decrypt_des(key,text):
 23     from Crypto.Cipher import DES
 24     import base64
 25     #    print key
 26     des = DES.new(key, DES.MODE_ECB)
 27     text = des.decrypt(text)
 28     pad = ord(text[-1])
 29     if pad == '\x08':
 30         return text[:-8]
 31     return text[:-pad]
 32 
 33 
 34 def rsa_generate():
 35     from Crypto.PublicKey import RSA
 36     from Crypto import Random
 37     random_generator = Random.new().read
 38     key = RSA.generate(1024, random_generator)
 39 
 40 
 41     #print key.publickey().encrypt('123213213123213213',20)
 42     public =  key.publickey().exportKey()
 43     #print key.publickey().exportKey()
 44     private = key.exportKey()
 45     return public,private
 46 
 47 def rsa_encrypt(key,text):
 48     '''
 49         传入私钥key和待加密明文数据text
 50         自动生成8字节长度随机密码P,用P将text进行des加密生成E,
 51         用私钥key加密P生成P2
 52 
 53         key - private key
 54         text - orignal text
 55         @return:  [P2+E]  RSA加密的des秘钥 + 加密的密文
 56     '''
 57     import uuid
 58     from Crypto.PublicKey import RSA
 59     deskey = hashlib.md5(uuid.uuid1().hex).hexdigest()[:8]
 60     text = encrypt_des(deskey,text)
 61 
 62     key = RSA.importKey(key)
 63     r = key.encrypt(deskey,32)
 64 
 65     return r[0]+text # 加密的key,和des加密的数据
 66 
 67 def rsa_decrypt(key,text):
 68     from Crypto.PublicKey import RSA
 69     try:
 70         rsa = RSA.importKey(key)
 71         deskey = text[:128]
 72         text = text[128:]
 73         deskey = rsa.decrypt(deskey)
 74         return decrypt_des(deskey,text)
 75     except:
 76         return ''
 77 
 78 class Cipher:
 79     def __init__(self):
 80 #        self.pubkey = pubkey
 81 #        self.privkey = privkey
 82         pass
 83 
 84     def encrypt(self,key,text):
 85         return rsa_encrypt(key,text)
 86 
 87 
 88     def decrypt(self,key,text):
 89         return rsa_decrypt(key,text)
 90 
 91     @staticmethod
 92     def getCipher():
 93         try:
 94             cip = Cipher()
 95             return cip
 96         except:
 97             traceback.print_exc()
 98             return None
 99 
100 def encryptToken(user):
101     '''
102         用户信息转换为token
103     '''
104     token=''
105     try:
106         d = json.dumps(user)
107 #        f = open(GCONFS['auth_public_keyfile'],'r')
108 #        pubkey = f.read()
109 #        f.close()
110         pubkey = ENCRYPT_PUBKEY
111         # d = Cipher.getCipher().encrypt(pubkey,d)  #rsa encrpyt
112         token = base64.encodestring(d).strip()
113     #print 'token size:',len(token)
114     except:
115         print traceback.format_exc()
116         token = ''
117 
118     return token
119 
120 def decryptToken(token):
121     user = None
122     try:
123 #        f = open(GCONFS['auth_private_keyfile'],'r')
124 #        privkey = f.read()
125 #        f.close()
126         privkey = ENCRYPT_PRIVKEY
127         d = base64.decodestring(token)
128         # d = Cipher.getCipher().decrypt(privkey,d) #rsa decrept
129         user = json.loads(d)
130     except:
131         #print traceback.format_exc()
132         pass
133     return user
posted @ 2014-04-01 10:22 放屁阿狗 阅读(3355) | 评论 (1)编辑 收藏

仅列出标题
共25页: 1 2 3 4 5 6 7 8 9 Last