额 当时安装的时候忘记总结了,以为一条命令很方便的就安装完了。发现还是要总结一下,有点小问题。
先brew seach gtk。然后brew install gtk+我是安装gtk2.0的版本。会提示要你安装XQuartz,还有网址。必须安装x啊。。到提供的网址上下载,并安装。然后再次执行brew install gtk+啪啪啪 安装好多东西。安装完了,写个hello World。
编译 gcc gtk.a.c -o first `pkg-config --cflags --libs gtk+-2.0`
会提示你pkg-config: command not found。
然后安装pkg-config : brew install pkg-config
安装完再编译 提示Package xcb-shm was not found in the pkg-config search path.
# export PKG_CONFIG_PATH=/usr/local/Cellar/cairo/1.14.0/lib/pkgconfig/
export PKG_CONFIG_PATH=/usr/X11/lib/pkgconfig
加上这个环境变量。再次编译成功。
我去 弄gtk还是在linux下方便。太折腾
Read more...
xfce terminal标题修改
今天发现在使用xfce的终端的时候,开一次vim退出后终端的标题就加了一个terminal ,开始以为是bug。
后来查了一下xfce的文档,发现有设置的地方。
菜单选择终端edit-preferences 在第一项里边的title就可以进行设置,动态标题选择替换初始标题就行了。
初始标题我填的 %#-%w-%D. 官方解释
%d : name of the current directory (short).
%D : current directory (long).
%w : window title set by shell.
%# : the session id.
配置文件修改是在,~/.config/xfce4/terminal/terminalrc
Read more...
xfce默认字体修改
装的freebsd的桌面用的xfce,刚刚修改了一下啊xfce的系统字体。
使用的手札简,下载字体后,新建“~/.fonts/”目录,把字体移动进去。然后通过开始菜单--settings--appearance-fonts,进行字体选择。选择好就能看的效果。
实际上修改了~/.config/xfce4/xfconf/xfce-perchannel-xml/xsettings.xml里面的配置
Read more...
tornado源码阅读-httpserver
前边ioloop看完了,application以前也看过一点,现在看看application和IOLoop是怎么结合起来的。
Application里的listen(port),实例化一个HTTPServer(),然后listen port address。
HTTPServer()继承自TCPServer, httputil.HTTPServerConnectionDelegate。HTTPServer参数传入application实例,还有一些参数。app保存在属性request_callback中,调用TCPServer的初始化方法,ioloop默认为None。然后都是参数的 保存。
listen方法是TCPServer里的,第一个方法返回socket,后调用add_sockets。self.ioploop为None,调用类静态方法IOLoop.current(),实例化IOLoop。然后将所有socket保存到_sockets中,调用在netutil.py里的add_accept_handler。
add_accept_handler第二个参数是一个函数,_handle_connection,ssl的不看。总的说就是实例化一个IOStream,然后调用handle_stream,handle_stream应该是看HTTPServer里的定义,这里没有。我去 看到这里感觉又要晕了。httpserver.py里的handle_stream应该是启动了httpserver。看到这里总结一个下。
一条是add_accept_handler的第二个参数应该是启动httpserver的功能的一个函数,看参数名是个callback。实例化了一个IOStream还没看,然后调用handle_stream启动httpserver。
额,先看看IOStream。继承BaseIOStream,额,没啥看的,付了一堆的变量。然后看httpserver.py里的handle_stream,一个context,看HTTP1ServerConnection,主要看start_serving,先进行类型判断,这是返回true,因为HTTPServer继承自httputil.HTTPServerConnectionDelegate,类似接口,只定义了两个空方法。然后后边运行_server_request_loop,异步。主要调了连接的read_response方法。大体看了一下,就是对包内容进行解析了。不看了
没仔细看逻辑,感觉画个图会好一点,看的都快吐了。看个流程都这么麻烦,以后再静下心来看一遍。放松一下
Read more...
python的__slots__
看python社区大妈组织的内容里边有一篇讲python内存优化的,用到了__slots__。然后查了一下,总结一下。感觉非常有用
python类在进行实例化的时候,会有一个__dict__属性,里边有可用的实例属性名和值。声明__slots__后,实例就只会含有__slots__里有的属性名。
Read more...
# coding: utf-8
class A(object):
x = 1
def __init__(self):
self.y = 2
a = A()
print a.__dict__
print(a.x, a.y)
a.x = 10
a.y = 10
print(a.x, a.y)
class B(object):
__slots__ = ('x', 'y')
x = 1
z = 2
def __init__(self):
self.y = 3
# self.m = 5 # 这个是不成功的
b = B()
# print(b.__dict__)
print(b.x, b.z, b.y)
# b.x = 10
# b.z = 10
b.y = 10
print(b.y)
class C(object):
__slots__ = ('x', 'z')
x = 1
def __setattr__(self, name, val):
if name in C.__slots__:
object.__setattr__(self, name, val)
def __getattr__(self, name):
return "Value of %s" % name
c = C()
print(c.__dict__)
print(c.x)
print(c.y)
# c.x = 10
c.z = 10
c.y = 10
print(c.z, c.y)
c.z = 100
print(c.z)
{'y': 2}
(1, 2)
(10, 10)
(1, 2, 3)
10
Value of __dict__
1
Value of y
(10, 'Value of y')
100
freebsd入门使用
在virtualbox里安装了freebsd虚拟机,使用了一下,感觉还不错。安装了xfce的桌面环境,装了firefox,默认字体太难看 哈哈。在虚拟机里速度很快。xfce桌面有panel可以自己定制 感觉爽爆了。查了文档,样式什么的也可以自己定制,这个就不折腾了,只是在虚拟机里玩玩,以后再用linux或者unix做桌面,我就选择freebsd,然后真正使用一下。
使用的功能很少,开发环境也没装,csh应该需要配置,也不是太好用。
安装软件只要pkg install,提供的命令很多很好。开始的时候看的中文文档,说命令是pkg_add然后发现没这个命令。。文档很不错,安装桌面也是看文档安装的。
Read more...
osx上安装Android开发环境
去官网下载了一个集成开发环境,直接安装。然后报错“Android Studio was unable to find a valid Jvm”
google
launchctl setenv STUDIO_JDK /Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk
解决之。
网上还有种方法是,finder --应用程序--android studio--显示包内容--contents--info.plist,搜索1.6.将1.6*改成1.6+就ok了。
Fetching android sdk component information,这个不知道具体干嘛的,好几次不成功。
同样的目录,contents/bin/idea.properties,最后加一行disable.android.first.run=true。
打开后的配置,configure--project Defaults--Project Structure--Android SDK location 添上 /Users/a0x55aa/Library/Android/sdk
Read more...
tornado源码阅读-IOLoop
tornado.ioloop.IOLoop.instance().start()
ioloop继承自Configurable。
configurable_base返回IOLoop,然后调用configured_class,然后再看IOLoop的configurable_default。这里面根据不同系统选择了不同的IOLoop类实现返回。下一步是initialize初始化了。
看一下epoll吧。
先找了一下IOLoop的start(),意料之中。因为configurable_default返回的类实现都是别的类,要看具体别的类中的定义了。
epoll.py里的EPollIOLoop只定义了initialize,EPollIOLoop继承自PollIOLoop,在ioloop.py文件里。
PollIOLoop继承自IOLoop,现在还不知道为什么这么继承,先往下看。super,IOLoop里边是空的。下边用到initialize第二个参数是impl。在PollIOLoop里是select.epoll()。还要去看看platform/select.py,额 我去还是import select。标准库中的select.epoll()返回一个epoll obj。判断是否有fileno属性,这个方法是返回一个文件描述符的。然后不知道是怎么操作这个句柄的不懂。先过。。
设置了一堆值。看platform/common.py里的Waker.继承自interface.Waker.父类只是定义了几个方法名。
先看初始化,self.write是个socket.self.writer.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)注释说禁止buffer,有数据就立即发送。
下边是做了一个测试,好像有些系统不支持检查出来。
下边又没懂,a都关闭了,还要那个文件描述符干嘛.这块后边做个测试研究一下。
初始化完了回到PollIOLoop,add_handler,第一个参数a的文件描述符,第二个参数consume是从a读数据读完为止。第三个参数是IOLoop里定义的,这里体现出继承的意义来了。
看add_handler,spit_fd取文件描述符,第二个handlers空,添加fd为key,文件描述符,handler为值。
没看懂,注释说就为了在io loop空闲时,想让他醒来发送假数据,这里也先过,网络方面的还是懂的太少了
然后初始化完成了。。下边是调用instance()了。这个只有在IOLoop里有定义,这里才是真正的继承意义。开始是没有_instance的,然后加锁,定义个实例IOLoop()返回这个实例。
饶了这么多圈终于实例化了。。。卧槽来
然后start(),PollIOLoop里,这里开始ioloop的循环执行了。详细的先不看了,看了一下等后边仔细分析一下。上边的waker也是结合这里一起再看一遍。
Read more...
tornado源码阅读-Configurable
想看一下IOLoop类的实现,发现继承自Configurable。就先看一下这个类。
Configurable类在util.py这个文件里。Configurable类的子类有AsyncHTTPClient,Resolver,IOLoop。
看__new__构造方法,configurable_base返回一个子类的实现,如果返回类本身。类的实现需要调用configured_class,主要初始化了__impl_class在configurable_default里。然后通过子类中configurable_default的定义选择不同的__impl_class(类实现)返回。initialize初始化类。
然后没了 ,没想到这么短。等后边看看IOLoop。
Read more...
git版本控制里的全局设置global
设置全局的用户名邮箱
$ git config --global user.name 0x55aa
$ git config --global user.email admin@google.com
设置全局的.gitignore
git config --global core.excludesfile ~/.gitignore
设置全局的命令别名
git config --global alias.st status
这个命令确实好用啊,用hg用的一直输入st, 现在又换成git不适应了,总要输错一次。mercurial和git,svn做简单版本控制还是都不错的
其实这些设置都是更改了~/.gitconfig文件。可以参考文档http://git-scm.com/docs/git-config.html
Read more...