Categories
木有技术

Windows 下使用MinGW编译Cython

用Visual C++编译器也是可以的(找不到vcvarsall.bat可以看这篇),不过为了后面移植方便,目前的项目还是用MinGW.
步骤其实很简单,参考http://cython.readthedocs.io/en/latest/src/tutorial/appendix.html
稍微翻译一下就是:

  1. 从这里http://www.mingw.org/wiki/HOWTO_Install_the_MinGW_GCC_Compiler_Suite 下载个MinGW Installer. 下载、安装的时候记住是32位版本的,因为64位版仍旧有些不兼容现象。
  2. 运行安装下载的程序。Cython只需要最基本的包(basic package)就行了,主要是为了里面的C++编译器
  3. 将你安装MinGW的目录设置到PATH环境变量中。默认位置应该是C:\MinGW\bin
  4. 在Python安装目录下创建配置文件。如果Python是安装在C:\Python27目录下,那就创建C:\Python27\Lib\distutils\distutils.cfg,然后文件内容为
    [build]
    compiler = mingw32

     

这样就可以使用GCC编译啦~
 

Categories
不学无术

Python numpy 按矩阵的某一列排序

可以参考我在StackOverflow上的回答
sorting arrays in numpy by column
利用numpy的argsort对需要排序的列标记序号(索引),然后直接改变原始矩阵的索引就行啦~

a = np.array([[1,2,3],[4,5,6],[0,0,1]])
a_arg = np.argsort(a[:,1]) #按第'1'列排序
a = a[a_arg]

 

Categories
木有技术

搭建自己的openwrt小镜像服务器

虽然当我写完的时候我发现wget可以一句话解决这个事情,不过还是与大家分享下代码吧~
更简单的方法详见:http://zqhong.qiniudn.com/2014/10/18/%E6%90%AD%E5%BB%BAOpenWrt%E6%9C%AC%E5%9C%B0%E8%BD%AF%E4%BB%B6%E5%BA%93%E9%95%9C%E5%83%8F/
下面是我写的小爬虫,是在其他人的成果基础上改的,新增支持级联目录
 

#!/usr/bin/env python
#coding=utf-8
#
# Openwrt Package Grabber
#
# Copyright (C) 2015 http://boweihe.me
# based on http://shuyz.com
#
import urllib2
import os
import re
def fetch_package(url, subdir=''):
    print 'fetching package list from ' + url
    content = urllib2.urlopen(url, timeout=15).read()
    pattern = r'<a href="(.*?)">'
    items = re.findall(pattern, content)
    for item in items:
        if item=='../':
            continue
        else:
            m = re.match(r'\w+/$', item)
            if m:
                if not os.path.exists(savedir + subdir + m.group()):
                    print 'makedir ' + m.group()
                    os.makedirs(savedir + subdir + m.group())
                fetch_package(url + m.group(), subdir + m.group())
            else:
                print 'downloading item : '+ item
                rfile = urllib2.urlopen(url + item)
                opendir = savedir + subdir + item
                with open(opendir, 'wb') as code:
                    code.write(rfile.read())
# the url of package list page, end with "/"
baseurl = 'http://downloads.openwrt.org/barrier_breaker/14.07/ar71xx/'
# which directory to save all the packages, end with "/"
savedir = './download-full1407/'
if not os.path.exists(savedir):
    os.makedirs(savedir)
fetch_package(baseurl)
print 'done!'

 

Categories
不学无术

组合 递归

荒废计算机太久了,以至于这么简单一个问题想了我大半天,其实就是数组求组合输出的方法,写下此日志提醒自己不能忘了老本!
题目的话大概可以这样表述

给出一个数据A={a_0,a_1,a_2…a_n}(其中n可变),打印出该数值元素的所有组合

需要使用递归的方法解决比较好,分而治之

给一大团数据{a0,a1, a2, …, an}:
1. 如果就剩一个元素的话,我就输出它,结束;
2.不输出a0,把除了我之外的余下一团交由递归处理;
3.要输出a0自己,然后余下一团交由递归处理;

其中case 3里面需要注意下一个递归要记住a0是要输出的,所以实践起来就是带了个前缀一样的东西记住。感觉这种排列组合的问题应该也可以用栈来解决,但归根结底还是分治。
用Python随意写了一个:

# coding:utf-8
def foo(inary, appendix=''):
    if len(inary) == 0:
        return
    #Case 0
    print appendix + str(inary[0])
    if len(inary) < 2:
        return
    #Case 1
    foo(inary[1:], appendix)
    #Case 2
    #print str(inary[0]),
    foo(inary[1:], appendix+str(inary[0]))

测试输出:

>>> foo([1, 2, 3, 4])
1
2
3
4
34
23
24
234
12
13
14
134
123
124
1234

 

Categories
木有技术

淘宝登陆中的token和st之类的东西

学习了一下 Python 淘宝系列(三): 模拟登陆成功后获取购物车信息
关于淘宝登陆验证的东西,里面牵扯到一个叫token,一个叫sp的两个东西~
自己用IE11试了一下,果然有那么些。
因为是网页登陆的,里面POST的参数跟教程中的有些许不用,特别是’TPL_password’字段,网页登陆时是空的。有可能是里面的参数的问题,估计是网页登陆还调用了其他处理密码的JS。
QQ截图20141205142830
QQ截图20141205143308
QQ截图20141205143556

Categories
不学无术

[转载]Python中实现带Cookie的Http的Post请求

本文转载自http://www.crifan.com/python_http_post_request_with_cookie/


 
已经实现了如何获得对应的cookie,具体参考:
【已解决】Python中如何获得访问网页所返回的cookie
现在想要把已获得cookie,在http的提交post请求的时候,也同时发送过去。
即,实现带cookie的http的post。
【解决过程】
1.看了这里
http://www.ideawu.net/blog/archives/270.html
的介绍,好像是cookiejar,自动管理的,不需要手动指定之前已有的cookie了。
去写代码试试。
2.后来的结果证实了,接下来,直接调用urllib2.Request,其自动会把cookie送过去的,
因为之前已经是urllib2.build_opener,添加了对应cookiejar去自动管理cookie了。
对应的代码如下:

# first url request
baiduSpaceEntryUrl = "http://hi.baidu.com/motionhouse";
cj = cookielib.CookieJar();
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj));
urllib2.install_opener(opener);
resp = urllib2.urlopen(baiduSpaceEntryUrl);
# second time do url request, the cookiejar will auto handle the cookie
loginBaiduUrl = "https://passport.baidu.com/?login";
para = {
    'username'  : username,
    'password'  : password,
    'mem_pass'  : 'on',
    };
postData = urllib.urlencode(para);
req = urllib2.Request(loginBaiduUrl, postData); # urllib2.Request: the HTTP request will be a POST instead of a GET when the data parameter is provided.
req.add_header('User-Agent', gConst['userAgentIE9']);
req.add_header('Content-Type', 'application/x-www-form-urlencoded');
req.add_header('Cache-Control', 'no-cache');
req.add_header('Accept', '*/*');
req.add_header('Connection', 'Keep-Alive');
resp = urllib2.urlopen(req);
respInfo = resp.info();

 

【总结】
Python中的cookiejar,自动帮我们管理好cookie,用起来,还是蛮方便的。
我们要做的只是,第一次build_opener的时候,把对应的cookiejar传进去,
以后每次的http的request,都会自动包含了cookie,而不需要我们操心了。

Categories
不学无术 木有技术

matplotlib 存储到内存文件 save to memory file(buffer) instead of disk file / PyQt4

References:
http://stackoverflow.com/questions/4330812/how-do-i-clear-a-stringio-object
http://stackoverflow.com/questions/8598673/how-to-save-a-pylab-figure-into-in-memory-file-which-can-be-read-into-pil-image
 
In fact Python have a StringIO module to deal with this problem, it works pretty fine with PyQt and matplotlib.
Procedures:
1. [SAVE] Create a StringIO object (or cStringIO which have faster speed)
2. [SAVE] Call savefig method of matplotlib and use the StringIO object instead as the input variable
3. [LOAD] Use QImage to read from StringIO object (via fromData method)
4. [LOAD] Use QPixmap and blabla to show the image….
 
Code:
 

# StringIO with matplotlib test
import matplotlib.pyplot as plt
import cStringIO
from PyQt4 import QtCore, QtGui
import sys
import cPickle
fig = plt.figure()
plt.plot([1, 2])
buf = cStringIO.StringIO()
plt.savefig(buf, format='png')
buf.seek(0)
app = QtGui.QApplication(sys.argv)
widget = QtGui.QWidget()
widget.resize(250, 150)
widget.setWindowTitle('simple')
qimg = QtGui.QImage.fromData(buf.getvalue())
pixmap = QtGui.QPixmap.fromImage(qimg)
label = QtGui.QLabel(widget)
label.setPixmap(pixmap)
label.setGeometry(0, 0, 250, 150)
widget.show()
sys.exit(app.exec_())

 
 

Categories
不学无术

PyQt使用线程更新GUI

给几个参考文章:
http://stackoverflow.com/questions/9957195/updating-gui-elements-in-multithreaded-pyqt
http://stackoverflow.com/questions/2585442/sending-custom-pyqt-signals
http://stackoverflow.com/questions/14090353/sending-messages-between-two-widgets-using-signals-and-slots
http://themkbytes.blogspot.com/2012/06/pyqt-qthread-signal-gui-examples.html

Threading with PyQt4

Categories
木有技术

PyCharm 3.4.1 注册码及注册机

==警告==

注册机打开时360系列娱乐软件会报毒,各位自己看着办

=======

注册机下载链接:http://pan.baidu.com/s/1jGvDZ62 密码:hh3o
 
提供几个注册码,用户名是EMBRACE222

===== LICENSE BEGIN =====
55646-12042010
000024fGr86dKEeR"6kGLRKZiBAxxy
CmiOVN!JfXO63IVEYHBFXcAprMLrq3
gWkFOBuZNzTLVG!WHRAAg2JjCI41H!
===== LICENSE END =====
===== LICENSE BEGIN =====
78431-12042010
00001L0arVmZEjYNqU9pOXrZxlUzw4
iIUK0doPnpphNSU8HtRXOGSGIruBGi
4VbvDvfj6FAfcFcxjzuEzpLJpkLVHt
===== LICENSE END =====
===== LICENSE BEGIN =====
50314-12042010
00001TbPnl4kVwEoPuO0tY9y!QEqUr
sjCXCi40IlDo8zEN44PXXnDlxicCbv
JPjGZJsEVRt3pTOh8MMP!wFlXcaesB
===== LICENSE END =====
===== LICENSE BEGIN =====
07662-12042010
00000JtsEpNfwGPO1tSRaiG2ykW0yC
1JyfK2"s6Ei0TUDTHsnl!AG2iFqOEp
Bj4SPEFXtBdnIRXIRCyKs4CINhNTVD
===== LICENSE END =====

 

Categories
不学无术

python format string (转)

来源不可考
在python中也有类似于c中的printf()的格式输出标记。在python中格式化输出字符串使用的是%运算符,通用的形式为 


格式标记字符串 % 要输出的值组 
其中,左边部分的”格式标记字符串“可以完全和c中的一致。右边的’值组’如果有两个及以上的值则需要用小括号括起来,中间用短号隔开。重点来看左边的部分。左边部分的最简单形式为: 

%cdoe 
其中的code有多种,不过由于在python中,所有东西都可以转换成string类型,因此,如果没有什么特殊需求完全可以全部使用’%s‘来标记。比如: 

‘%s %s %s’ % (1, 2.3, [‘one’, ‘two’, ‘three’]) 
它的输出为’1 2.3 [‘one’, ‘two’, ‘three’]’,就是按照%左边的标记输出的。虽然第一个和第二值不是string类型,一样没有问题。在这个过程中,当电脑发现第一个值不是%s 时,会先调用整型数的函数,把第一个值也就是1转成string类型,然后再调用str()函数来输出。前面说过还有一个repr()函数,如果要用这个 函数,可以用%r来标记。除了%s外,还有很多类似的code: 

整型数:%d 
无符号整型数:%u 
八进制:%o 
十六进制:%x   %X 
浮点数:%f 
科学记数法: %e   %E 
根据数值的不同自动选择%e或%f: %g 
根据数值的不同自动选择%E或%f: %G 
就跟前面说用进行转义一样,这里用%作为格式标记的标识,也有一个%本身应该如何输出的问题。如果要在”格式标记字符串“中输出%本身,可以用%%来表示。 
上面说的只是格式标记的最简间的形式,来看复杂一点的: 

‘%6.2f’ % 1.235 
在这种形式中,在f的前面出现了一个类似小数的6.2它表示的意思是,总共输出的长度为6个字符,其中小数2位。还有更复杂的: 

‘%06.2f’ % 1.235 
在6的前面多了一个0,表示如果输出的位数不足6位就用0补足6位。这一行的输出为‘001.24’,可以看到小数也占用一位。类似于这里0这样的标记还有-、+。其中,-表示左对齐,+表示在正数前面也标上+号,默认是不加的。最后来看最复杂的形式: 

‘%(name)s:%(score)06.1f’ %{‘score’:9.5, ‘name’:’newsim’} 
这种形式只用在要输出的内容为dictionary(一种python的数据类型)时,小括号中的(name)和(score)对应于后面的键值 对中的键。前面的例子可以看到,”格式标记字符串“中标记的顺序和”要输出的值组”中的值是一一对应的,有顺序,一对一,二对二。而在这种形式中,则不 是,每个格式标记对应哪个值由小括号中的键来指定。这行代码的输出为:’newsim:0009.5’。 

有时候在%6.2f这种形式中,6和2也不能事先指定,会在程序运行过程中再产生,那怎么输入呢,当然不能用%%d.%df或%d.%d%f。可 以用%*.*f的形式,当然在后面的”要输出的值组“中包含那两个*的值。比如:’%*.*f’ % (6, 2, 2.345)就相当于’%6.2f’ % 2.345。 

这是这本书到此为止看起来最复杂的内容。不过如果记不住,或不想那么耐烦,完全可以全部用%s代替,或者用多个”+”来构造类似的输出字符串。这里的%真有点除法的味道,怪不得设计者会选择用%这个除号。 


象C 中的sprintf函数一样,可以用“%”来格式化字符串。 

Table 3.1. 字符串格式化代码 

格式 描述 
%% 百分号标记 
%c 字符及其ASCII码 
%s 字符串 
%d 有符号整数(十进制) 
%u 无符号整数(十进制) 
%o 无符号整数(八进制) 
%x 无符号整数(十六进制) 
%X 无符号整数(十六进制大写字符) 
%e 浮点数字(科学计数法) 
%E 浮点数字(科学计数法,用E代替e) 
%f 浮点数字(用小数点符号) 
%g 浮点数字(根据值的大小采用%e或%f) 
%G 浮点数字(类似于%g) 
%p 指针(用十六进制打印值的内存地址) 
%n 存储输出字符的数量放进参数列表的下一个变量中