参与gopkg项目中去,准备学习一下xml包。
1、先到这个项目中,点击fork按钮。地址:https://github.com/astaxie/gopkg
2、代码下载到本地:$ git clone https://github.com/0x55aa/gopkg.git
3、给项目命名:cd gopkg
$ git remote add upstream https://github.com/astaxie/gopkg
4、从原项目更新:$ git fetch upstream
5、提交修改到项目:git push origin master
6、手动点击pull request,查看修改是否正确,填写内容,提交。
很小心,提交通过成功。顺便熟悉了markdown语法。
Read more...
django错误信息不靠谱解决办法
错误主要是在forms.py里面,想添加text文本编辑框,然后写了一个forms.TextField().....这不是重点,重点是我把views里的代码也写完,访问调试的时候,django页面提示View does not exist in module news.views。 views.py文件是一定存在的,不知道错在哪里。googel关键字找到so上说,用manage.py shell会提供更多信息。然后我再shell里导入views ,发现报前边的错误。修改,运行,然后正常了。
Read more...
django代码组织的想法
先说说我以前的做法:models.py里单纯的就是几个表,几个字段;forms.py里除了除了form的定义,把form数据的验证也放到这里来;view.py里是剩下的所有东西。
现在的想法(还没做):在models.py里面的类加上一些简单的处理方法,比如获取相关分类表里面的名称。forms.py里面加上save操作。
以前在django群里讨论过这个问题,大牛说逻辑处理最好不要放到views里面。这次写程序,又多瞅了几眼文档,感觉这样的好处确实很多,程序更容易读懂,减少代码行数,提高了代码复用,views.py文件肯定更加清晰。
Read more...
windows安装gtk++MinGw
1.下载gtk+.
http://ftp.acc.umu.se/pub/gnome/binaries/win32/gtk+/
2.解压到d盘,添加环境变量D:\gtk\bin
3.测试gtk+。命令行输入:pkg-config --cflags gtk+-2.0或者gtk-demo
4.下载mingw
http://sourceforge.net/projects/mingw/files/MinGW/
5.双击安装,安装环境我选择了C Compiler & C++ Compiler & MSYS Basic System & MinGW Developer ToolKit,这里要用到mysys等工具。下载安装完后添加环境变量:D:\MinGW\bin。
6.测试mingw:可以在命令行下输入 gcc -v。
Read more...
#include
int main( int argc,
char *argv[] )
{
GtkWidget *window;
gtk_init (&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_widget_show (window);
gtk_main ();
return 0;
}
'gcc base.c -o base `pkg-config --cflags --libs gtk+-2.0`,打开MinGw Shell输入以上命令,就可编译完成,运行base.exe,成功。
以前想学pygtk的,现在自己用python写个工具就要依赖n多包,以后换个地方就要重新安装,很烦。给别人写的时候,又要打包程序很大,很不爽。再者说,接口应该都差不多。
python编写printScreen图片保存程序
正在编写的程序用的很多Windows下的操作,查了很多资料。看到剪切板的操作时,想起以前想要做的一个小程序,当时也没做,现在正好顺手写完。
功能:按printscreen键进行截图的时候,数据保存在剪切板里面,很不方便。比如游戏的时候截一个瞬间的图片,但你不能退出游戏保存图片,不方便多次截图。而我也不喜欢安装各种软件,所以准备写这个工具。
思路:一个是自定义快捷键,截图,保存。考虑到很可能各种冲突,取消。然后还是用按printscreen来截图,然后从剪切板读取图片数据,保存。想法是,先监听键盘按键,当printscreen按键时,读取剪切板内容,最后保存图片到指定位置。
1 监听键盘按键:从网上找到资料,安装pywin32,pyhook。链接:http://sourceforge.net/projects/pyhook/,http://sourceforge.net/projects/pywin32/。教程:http://sourceforge.net/apps/mediawiki/pyhook/index.php?title=PyHook_Tutorial。
2 读取剪切板内容,也是需要pywin32.文档在:
Read more...
[Pythonpath]\Lib\site-packages\PyWin32.chm,在线的:
http://timgolden.me.uk/pywin32-docs/index.html
文档中给出的几种格式都不是图片保存的数据,Google搜索“Standard Clipboard Formats”,链接:http://msdn.microsoft.com/en-us/library/windows/desktop/ff729168%28v=vs.85%29.aspx,所有的格式,主要就是1-17.
好在文档中有一个函数:GetPriorityClipboardFormat,可以返回剪切板中的格式,从一个迭代器中。于是手动输入找到了,y有时为6,win32con.CF_TIFF,还会为2。当然这里直接用返回数据就行了,不需要知道是什么。
主要用到:
OpenClipboard,CloseClipboard,GetPriorityClipboardFormat,GetClipboardData,这几个函数文档都有介绍,主要说说CloseClipboard,官方文档上讲,不要在剪切板里放置对象后调用CloseClipboard。
3 保存图片:
到这里发现可以直接用PIL模块,直接解决问题,上面太曲折T_T。
可以直接使用ImageGrab.grab() 进行抓屏,或者使用ImageGrab.grabclipboard()从剪切板获取图像。
最后变成,监听按键,按下printscreen后,用pil截图保存。T_T 感觉还不如设置快捷键,这样应该少占用内存。
cut.py
用golang写的小的基于udp协议的聊天室程序
又传到github上了:https://github.com/0x55aa/golang-udp-chat
用golang写的第二个程序,这么久再没学golang,找到《go语言编程》的电子版,现在打算重新再学一遍。翻出这个程序,分享。
没有什么特殊功能,自己边做边添加,主要使用了net包中关于upd的几个函数。还没有实现预期的功能,只是个雏形,传上去好记得还写过这么个小程序,哪天心血来潮再改改。
程序是根据这个程序修改的《Network programming with Go》,下面我想看完电子书开始用go写web程序,路漫漫其修远兮 吾将上下而求索。
截了client的图:
Read more...
![golang-udp-chat golang聊天程序](/static/uploads/2013/01/golang-udp-chat-300x252.png)
python源码剖析笔记-字符串
PyStringObject需要保存字符串长度(ob_size),当产生字符串对象后,将不会改变(不可变对象)。这一特性使得PyStringObject对象可作为dict的键值,同时也使一些字符串操作的效率大大降低了,比如字符串连接操作。
typedef struct {
PyObject_VAR_HEAD
long ob_shash;
int ob_sstate;
char ob_sval[1];
} PyStringObject;
同c语言一样,字符串末尾以‘\0’结尾,但是中间可以出现’\0’,ob_sval指向一段长度为ob_size+1个字节的内存,字符串结束需要满足ob_sval[ob_size] == ‘\0’
Ob_hash缓存该对象的hash值,初始值为-1。Ob_sstate在书后面介绍intern机制,对于被intern之后的字符串,在整个python运行期间,系统中都只有唯一一个与该字符串对应的PyStringObject对象。当判断两个PyStringObject对象是否相同时,如果都被intern了,只要检查对应的对象是否相同即可。
PyStringObject对应的类型对象为PyString_Type,tp_itemsize被设置成sizeof(char),即一个字节。与ob_size共同决定申请多少内存。
字符串对象有长度限制,大小为2GB。
Intern机制对相同字符串的处理:
a = “python”
b=”python”
print a,b
intern机制的关键,是有一个叫interned的字典,记录intern机制处理过的PyStringObject对象。
对于上面的例子,先创建PyStringObject对象a,先会检查interned字典里有没有字符串与a相同,这里显然没有,将会添加到interned字典里。当创建b后(必须先要创建)执行intern操作,继续检查interned字典,发现有相同的字符串对象a,然后指向b的PyObject指针将指向a,b的引用计数减1,b将会被回收了。
有长度为256的字符缓冲池,添加到缓冲池的流程:当在创建PyStringObject对象时(还没创建),先检查长度。为字符时,再检查字符缓冲池是否有该字符,有,直接返回缓冲的该对象,结束;没有,创建PyStringObject对象,检查长度为字符,对对象进行intern操作,最后缓存至字符缓冲区。创建StringObject的两个函数不是太长也有注释,还能看懂。
字符串连接
通过”+”操作符对字符串进行连接是,调用string_concat函数:先计算连接后的字符串的长度,然后创建新的字符串对象分配给他计算的长度内存,最后复制。
Join操作,调用函数string_join:基本流程和“+”操作符相同。这里的区别是,“+”操作符有两个字符串就要创建一个新对象,join是对列表中的所有字符串进行,只要创建一次新对象就行。当进行多个字符串的连接时,应使用join操作。
Read more...
python源码剖析笔记-对象多态和对象池
作者写得很容易让人明白,真是好书。
Python创建一个对象时,比如PyIntObject,会分配内存,进行初始化。然后用一个PyObject *变量,而不是通过PyIntObject* 变量来保存和维护这个对象。在python内部各个函数直接传递的都是泛型指针 PyObject *。指针所指的对象是什么类型的我们不知道,只能从指针所指的对象的ob_type域动态判断(PyTypeObject),python正是通过这个域实现了多态
书上举了Print的例子
void Print(PyObject * object){
object -> ob_type -> tp_print(object)
}
如果传给Print的指针是一个PyIntObject *,从PyObject指针找到ob_type指针再调用类型里对应的输出操作。作者在前面对这几个关键对象做了讲解,这里很好理解。
对象池
数值比较小的整数在程序中会频繁使用,为解决频繁内存申请和释放,使用对象池。对象池里的每一个PyInetObject对象都能够被任意的共享。大整数和小整数的分界点默认设定为[-5,257),修改方式,修改源码重新编译python。
对于大整数对象,python提供一块内存空间,由大整数轮流使用。数量为82个,也可以通过修改源码改变。
PyIntObject创建的过程,如果是小整数对象,则返回在小整数对象池中的对应的对象。如果不是,使用通用整数对象池
可以很容易的理解一些问题:
>>> a1=[1,2,3]
>>> b1=a1
>>> b1 == a1
True
>>> b1 is a1
True
>>> b2 = [1,2,3]
>>> a1 == b2
True
>>> a1 is b2
False
>>> c1=1
>>> c2 = c1
>>> c1 == c2
True
>>> c1 is c2
True
>>> c3 =1
>>> c3 == c1
True
>>> c3 is c1
True
==判定具有相同的值,is判定是同一个对象。A1 b1是对同一个列表的引用,is返回True,a1 b2不是,返回False。下面的c3 c1 返回True,是对同一对象的引用。
Read more...
编写chrome扩展遇到“即将停止支持清单版本 1。请升级到版本 2。”
在编写chrome扩展的时候,遇到“即将停止支持清单版本 1。请升级到版本 2。”的警告。
解决方法:
在manifest.json文件中增加:
Read more...
{ ..., "manifest_version": 2, ... } 官方文档:http://developer.chrome.com/extensions/manifestVersion.html
python的几个内建函数
几个比较常用的,翻译了一点官方文档。文档http://docs.python.org/2/library/functions.html#built-in-functions
startswith,endswith
str.endswith(suffix[, start[, end]])
str.startswith(prefix[, start[, end]])
>>> s="python"
>>> s.startswith('py')
True
>>> s.startswith('th',2)
True
>>> s.startswith(('py','yt'))
True
>>> s.startswith(('py','yt'),1)
True
判断字符串是否以suffix结尾,以prefix开始,是,返回true。stat,end是截取字符串。从python2.5开始,支持元祖。
lambda
匿名函数
>>> f = lambda x:x+1
>>> f(2)
3
>>> (lambda x,y:x*y)(2,3)
6
内建函数开始:
zip([iterable, ...])
返回一个元组列表,由每个参数队列的第i个元素组成元祖。列表的长度是参数队列里面最短的一个的长度。一个参数返回一个一元元组??的列表,无参数返回空列表。zip(*[iter(s)]*n)是个逆操作?
>>> a=[1,2,3]
>>> b=[4,5,6]
>>> c=[4,5,6,7,8,9]
>>> zip(a,b)
[(1, 4), (2, 5), (3, 6)]
>>> zip(a,c)
[(1, 4), (2, 5), (3, 6)]
>>> zip(a)
[(1,), (2,), (3,)]
>>> zip()
[]
>>> zip(*[(1, 4), (2, 5), (3, 6)])
[(1, 2, 3), (4, 5, 6)]
>>> x,y = zip(*[(1, 4), (2, 5), (3, 6)])
>>> print x,y
(1, 2, 3) (4, 5, 6)
filter(function, iterable)
返回一个列表,由iterable里元素能使function返回真的元素构成。当iterable是元组或者字符串时,返回类型不变,其他返回list。如果function为None,将假定一个function,iterable的元素都符合(文档咋没看懂,感觉正好相反)。
filter(function, iterable)等价[item for item in iterable if function(item)],这个肯定是列表啊,不一定等价
function为None,等价[item for item in iterable if item]。
>>> filter(lambda x:x>2,[1,2,3,4])
[3, 4]
>>> filter(None,[1,2,3,4])
[1, 2, 3, 4]
>>> filter(lambda x:x>'c',"abcdef")
'def'
map(function, iterable, ...)
将每一个iterable的元素带入function,组成列表返回。
>>> map(lambda x:x+2,[1,2,3,4])
[3, 4, 5, 6]
reduce(function, iterable[, initializer])
从左到右依次取iterable中的元素,带入function。initializer是初始值,function有两个参数,有初始值第一个参数为初始值,第二个从iterable中取,然后执行function,结果带入第一个参数,第二个参数取iterable下一个元素。
>>> a=[1,2,3,4]
>>> reduce(lambda x,y: x+y,a)
10
>>> reduce(lambda x,y: x+y,a,10)
20
Read more...