2013年12月

Linux系统调用

最近重新开始看操作系统,看得我云里雾里,经典的操作系统书又很难,看不大懂。学校的操作系统课,说实在的,真的好难和自己真正编程结合起来,里面的概念很多,而且很多都是很老的,历史总是这么蛋疼。没办法,只能硬着头皮去看。这次先讲讲系统调用,因为没看过里面的具体源码,但是尽可能让文章偏向实际编程中的应用。

什么叫系统调用


计算机有很多的硬件,比如键盘,鼠标,网卡,磁盘,声卡这些硬件都是我们实际可以触碰到的,但是对于用户应用程序而言是没办法直接操作这些设备的。为什么呢?一是硬件涉及到很多电路实现,让用户自己编写程序去操作是很困难和复杂的。二是编程的人直接操作硬件会有很大的安全隐患,因为这些资源都是很多程序共享的,万一我们写的程序能够直接操作硬件,安全性就不能保障了。所以所有这些设备的上面抽象了一层驱动程序,这些驱动程序会实现很多硬件相关操作,也就是说每个硬件发布商都得提供各自的硬件的驱动程序用于操作硬件。那么应用程序怎么去调用这些驱动程序呢?答案就是通过操作系统的系统调用,我们告诉操作系统我们要对某个硬件做某个操作,操作系统来帮你完成,然后把得到的结果返回给我们。

- 阅读剩余部分 -

grep 动态文件输出

tail -f access.log | grep "www.firefoxbug.net" 在因为access.log是动态变化的,随时都可能增加,因为管道的作用是在输入端完成或者buffer满了才会到输出端过滤,所以grep出来的结果是无的。

加 --line-buffered 参数可以动态查看文件。
tail -f access.log | grep --line-buffered "www.firefoxbug.net"

git入门二(新建分支)

这一节讲下git的分支功能,分支功能是什么呢?其实这才是真正的软件版本管理核心,比如你的项目想添加一个的功能,但是这个版本是测试的,不一定上线,再或者想开发一个2.0版本专门用于某个场合。传统的做法就是把原来的项目代码,全部都复制一份。然后还傻乎乎地为了区别,把文件夹的名字分成1.0版本和2.0版本,别笑华哥,我之前开发OpenCDN就是这样的。到后来以至于我根本搞不清楚各个版本了,而且还浪费磁盘空间。总之看起来就是很不爽,但是用git可以解决版本控制的问题。

git通过增加分支的方法来实现,git默认的主分支就是master,可以用下面的命令查看。

git branch #查看分支
git branch new_branch #创建一个新的分支
git checkout new_branch #切换到新的分支
git checkout -d new_branch #删除分支

- 阅读剩余部分 -

git入门一(一次commit)

网上git的资料已经很多了,可git这个东西一开始还是比较难理解,以至于我周围的朋友都说这东西太难用了。我自己也玩了两年的linux,但是接触git这个东西一开始还是挺难理解的。其实主要是不像其他工具那样,git还是得静下心来好好看看的。自己对git也不是特别熟悉,所以不能深入解释里面的工作细节,只解释一些常用到的。
在一个项目下面初始化一个git仓库,主要会分成三个部分。一部分是你的工作目录(working),说白了就是你的项目代码。一部分是索引文件(staged file),这里就是你项目的tmp文件。还有一部分是仓库(History),这里才是git真正的数据库,存放你的项目记录的地方。举个例子,我们通用的vim编辑一个文件,一旦开始编辑,目录下就会产生一个.swp文件,然后你编辑完成后按下wq退出,才会真正存到编辑的文件里面。

git1
图片from http://blog.jobbole.com/tag/git/page/2/

git的工作流程也是这样,你初始化一个git仓库后,git监控要指定的文件,你修改了文件之后会暂时存到staged里面去,也就是tmp的部分。当你commit的时候就会真正把tmp里面的文件提交到git仓库里面,这才是真正的一次操作。

- 阅读剩余部分 -

Python日志模块

日志的重要性不言而喻,之前写各种程序最纠结的就是这部分了,每次都自己定义日志格式,以后还是用标准的python日志模块吧。Python的日志类型也是Nginx和Syslog一样,是分等级的。 NOTSET < DEBUG < INFO < WARNING < ERROR < CRITICAL 如果把looger的级别设置为INFO, 那么小于INFO级别的日志都不输出, 大于等于INFO级别的日志都输出

- 阅读剩余部分 -

Python watchdog

想监控本地文件系统下的某个目录,原本是想用pyinotify的,谁知道mac的最新系统不支持,于是找了watchdog。根据官网的API做了一份和pyinotify的demo。

<pre>
#!/usr/bin/python
# -*- coding: UTF-8 -*-

# author : firefoxbug
# E-Mail : wanghuafire@gmail.com
# Blog   : www.firefoxbug.net

import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler

class MyHandler(FileSystemEventHandler):
	def on_created(self,event):
		if event.is_directory:
			print event.event_type,event.src_path
		else :
			print event.event_type,event.src_path

	def on_deleted(self,event):
		if event.is_directory:
			print event.event_type,event.src_path
		else :
			print event.event_type,event.src_path

	def on_modified(self,event):
		if not event.is_directory:
			print event.event_type,event.src_path

	def on_moved(self,event):
		print "move",event.src_path,event.dest_path

if __name__ == "__main__":
	event_handler = MyHandler()
	observer = Observer()
	observer.schedule(event_handler, path='.', recursive=True)
	observer.start()

	try:
		print "started myWatch"
		while True:
			time.sleep(1)
	except KeyboardInterrupt:
		observer.stop()
	observer.join()
</pre>

详细的可以参考 http://pythonhosted.org/watchdog/