Wednesday, March 4, 2015
Python学习笔记之subprocess
最简单的使用方式是:
subprocess.call(args),其中的args是a list of strings,args[0]是调用的程序路径,其后均为参数。call会阻塞直到子进程结束。call的返回值是子进程的返回值。这个函数与C的system很相似。
subprocess.check_output(args)与call相似,不过它会把子进程的输出作为一个bytestring返回
这个库最强大的函数是Popen,它其实是一个类的Constructer,完整形式是:
subprocess.Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0)
args与上文相同,不过这个调用不会阻塞当前进程,stdin,stdout,stderr可以是一个打开的file,或者是subprocess.PIPE,如果是PIPE,父进程可以用xxx.stdin/stderr/stdout与子进程通信。
其实呢,上述这些函数都是C的fork和execve的包装,它们大大简化了编程。如果要在C下实现Popen的功能,父进程需要现用pipe获得一个管道,然后fork,在子进程中关闭管道写端,用dup2重定向管道到stdin,接着execve,在父进程中需要关闭管道读端,然后向子进程输入数据,这些代码少说也要个5行。
现在觉得Python的官方库文档已经很完善了,而且不要翻墙,以后估计就不再写官方库的学习笔记了
Wednesday, February 25, 2015
Openwrt配置6in4
美国一家ISP, Hurricane Electric提供免费的IPv6接入的服务,叫做Tunnel Broker, 这个服务使用了6in4转换机制。用户只需要在网站注册,就可以申请免费的6in4隧道。不过有一个限制是Endpoint必须有公网IP。
对于刷好Openwrt Barrier Breaker的路由器,只需要简单的操作就可以实现6in4
1. 在tunnelbroker上申请一个隧道,申请时可以选择ping延迟最低服务节点。申请成功后会获得一个页面,里面有配置6in4的全部信息。
2.在Openwrt中新建一个Interface,名称为henet,选择Protocol为6in4,如果没有这个选项,请安装luci-proto-ipv6,6in4软件包,点击Sumbit
3.修改将tunnelbroker上的信息填入henet的配置中,具体可以参考http://wiki.openwrt.org/doc/uci/network#protocol_6to4_ipv6-in-ipv4_tunnel如果你的公网IP会变化,需要勾选,并填写一些信息,Update Key可以在Tunnel Details页面的Advanced选项中看到。
4.将henet的firewall zone设置为wan。
5. 在/etc/config/firewall下添加:
config rule
option src 'wan'
option target 'ACCEPT'
option proto '41'
6.修改/etc/config/network,在lan下添加option ip6addr,其后地址可以从Routed /64中任选一个。
重新启动路由器,并且刷新本机的DHCP,就可以获得一个公网IPV6地址了。测试网址http://test-ipv6.com/
不过,由于中国内并没有服务节点,最近的节点延迟也有100ms+,加之国际出口带宽有限,这种方式获得的IPv6质量很不好。
Sunday, February 22, 2015
Openwrt配置WLAN漫游
Update:
802.11f was deprecated. The new kid in town is 802.11r. OpenWrt 21.02 supports 802.11r. Here is a post on how to enable it.
家里有两台无线路由,都以AP的形式接入LAN。而我希望做的是能让无线设备在两个AP中选择信号最好的接入,并且实现漫游。
我所在大学的无线网络支持在同一个AC下漫游,因为学校采用的是H3C的解决方案,他们的私有技术可以支持接入点的快速切换。而我家中的路由一个是ralink的方案,一个是atheros的方案,不过它们都刷了OpenWrt系统。上网搜索后发现802.11协议只支持由客户端(比如手机)发起的切换。与GSM的handover不同,802.11的handover必须先断开链接,再建立新的链接。
要实现漫游,只需要把两个接入点的SSID,加密方式(我使用WPA2-PSK-CCMP)和密钥保持一致,两个AP使用不重叠的信道。
此外,还有一个802.11f协议,用于支持不同厂商AP之间的通信。要在Openwrt上开启这个协议,只需要在/etc/config/wireless里面增加一个 iapp_interface 字段,可以参考这个wiki.
应用这些设置后,我的小米手机可以自动在两个接入点中漫游,切换延迟大约半秒。
Tuesday, July 29, 2014
暂时弃用Gnome3,转投Mate
我是一个忠实的Gnome用户,Gnome 3.0发布后很快就适应了它一致的、优雅的界面。现在,Gnome已经升级到了3.10,虽然增加了功能(我几乎没有用到,比如说什么online accounts),但是bug也越来越多。有很多用户反映CPU占用高,内存泄漏,经常崩溃。有人猜测问题处在Gnome和显卡驱动的接口上(Intel显卡用户反映的问题比Nvidia用户多)。不过我没有找到有效的解决方案。
所以,唯一的选择就是换一个Desktop Manager。因为是Gnome的老用户,故选择了Mate,这是一个由Linuxmint主导的Gnome2的分支。虽然没有了那些窗口阴影,Overview等特效,Mate对资源的需求很低,目前也没有遇到崩溃的情况。唯一不足是有几个程序(比如Virtualbox)的外观变得很难看。
估计要等Fedora21出来后才会再试一下Gnome3了。
2015年2月4日更新:
Fedora21推出后,本人又投入了Gnome的怀抱。 目前没有发现CPU占用率过高的情况。不过Gnome真心变得臃肿了。
Wednesday, May 14, 2014
Lenovo Miix2 8使用手记
7月29日新增:
Miix2 8会遇到触摸屏失去响应的情况,原因触摸屏驱动存在Bug,会导致不能解锁,需要强制关机。可以临时用OTG线连一个鼠标。几天前放出了一个新版触摸屏驱动,失去响应的频率降低了,但是依然会发生。
Miix2还会遇到关机后不能正常断电,导致不能开机,这个时候需要强制关机。因为Miix2本身待机功耗很低,因此不建议经常关机。
2015年2月4日更新:
Miix2 8触摸屏经常失去响应的终极解决办法是拆开后盖,把触摸屏排线重新接好(如果分不清的话三个排线都重新插拔一下)。
Sunday, April 13, 2014
在Fedora 20上使用TLP进行笔记本电源管理
升级Fedora 20后发现笔记本电池的使用时间有所缩短,用powertop一看,处理文字时的耗电量就有20W,明显不正常。于是就看了一下pm-utils的scripts。果不其然,/usr/lib64/pm/power.d下面空空如也。我东拼西凑了一个powersave script, 放到/etc/pm/power.d下面。后来发现,拔下电源后脚本没有运行,只有手动执行pm-powersave true才可以生效。查了一下,发现pm-utils已经deprecated了,只能另寻方案。
Arch wiki推荐用acpid,不过它只能在有ACPI事件时运行某个脚本。这样就需要自己写一个开机启动脚本判断是否处于电池模式,相当不爽。
后来,在Fedora论坛上发现了一个相关的讨论,有用户推荐用TLP(主页)。 这个东西的功能很强大,可以在电池模式和市电模式采用不同的电源配置(硬盘,WLAN,WWAN,蓝牙,USB,声卡,显卡,SATA控制器,PCIE等等)。此外,它还可以配置Thinkpad电池的thresholds.其配置文件在/etc/default/tlp,几乎不需要太大改动。
使用后效果还是相当明显的,电池模式下功耗降低到了15W,可以多用半小时啦。这里凸显了Linux发行版和Windows的差别,一个电源管理都有好多套方法。说不定什么时候又搞出个更强大的。
Friday, December 6, 2013
Kindle Paperwhite 越狱
越狱的方法来自http://www.mobileread.com/forums/showthread.php?t=198446,第二代KPW越狱方法在http://www.mobileread.com/forums/showthread.php?t=186645 ,由于当前的5.3.9版本不支持DEBUG模式,所以需要先降级到5.3.5版本(和升级的方法相同)。
然后,按照越狱包README的要求拷贝相应文件,再次更新Kindle后就越狱成功了。
越狱后可以发现多了一本书jailbreak-log,可以打开看看越狱过程。
然后,就可以下载5.3.9的固件,重新升级到5.3.9.不过,升级后要记得安装Rescue Pack和Kindlet Developer Certificates。这些都可以在上面的网址中找到。
越狱完成后,就可以在Kindle上运行许多小程序了,比如扫雷、中国象棋、Midori网页浏览器等等。不过,首先要做的是安装usbnet和KUAL,http://www.mobileread.com/forums/showthread.php?t=203326 它提供了一个访问各种Kindlets的界面。并且,可以在KUAL中开启和关闭usbnet。由于Kindle是基于Linux的,usbnet可以把kindle的usb口转化成一个虚拟网卡,连接电脑并安装驱动后即可用SSH连接kindle。此外,usbnet也支持在Wifi网络上运行SSH和SFTP服务,因此打开SSH over WIFI后可以不用数据线拷书籍了,唯一遗憾就是SFTP的中文支持不是很好,会乱码。
关于kindlet,koreader,扫雷,记事本,收藏夹管理器的安装,以及更改屏保等操作都可以在下面的网页中找到,我也就不再重复了。
http://www.douban.com/group/topic/42835056/
http://www.mobileread.com/forums/showthread.php?t=205064
最后推荐一个Kindlet,BackDoorLock,它可以禁用Kindle的后台自动更新功能。
