Linux|系统管理|WEB开发

关注Linux,系统管理,WEB开发以及开源世界

Redhat El5如何映射裸设备到逻辑卷

| Comments

之前的版本如何做,这里不做描述,自行 Google。 之前通常的方法,在该版本,KERNEL并不能直接获得设备名称或者主次设备号,我们需要通过dmsetup指令来间接获得。 一下操作的目录均在/etc/udev/rules.d/

  1. 编辑90-dm.rules文件,注释掉下面这行
    KERNEL=="dm-[0-9]*", ACTION=="add", OPTIONS+="ignore_device"

  2. 编辑60-raw.rules文件,加入下面几行:

     KERNEL!="dm-[0-9]*",GOTO="skip_dm"
     PROGRAM!="/sbin/dmsetup  ls --exec /bin/basename -j %M -m %m", GOTO="skip_dm"
     RESULT=="vg1-lv1", RUN+="/bin/sh -c '/bin/raw /dev/raw/raw1 $MAJOR $MINOR'"
     LABEL=skip_dm
    

    上面第一行代码表示如果不是dm设备,则直接跳到skip_dm处 第二行表示如果后面的指令返回为假(非0值),则跳到skip_dm处。

用python解决amule中文乱码的问题

| Comments

Linux下的amule并不会对链接做编码转换,也就是说,比如下面这样的链接地址:

ed2k://|file|%E7%94%9F%E6%B4%BB%E5%A4%A7%E7%88%86%E7%82%B8.The.Big.Bang.Theory.S02E15.Chi_Eng.HR-HDTV.AC3.960X528.x264-YYeTs%E4%BA%BA%E4%BA%BA%E5%BD%B1%E8%A7%86.avi|230043648|e49a10d7052b5dfee4aa8b3336b76301|h=qkhaltxhuygwphznp2holcvdarxki3e6|/

直接交给amule下载时,给出的文件名就会变成下面这个样子:

生活大爆炸.The.Big.Bang.Theory.S02E04.Chi_Eng.HR-HDTV.AC3.960X528.x264-YYeTs人人影视.avi

所以需要我们自己先把链接转变成“正确”的编码,然后交给amule,还是上面那个链接,转换过来就是:

How to Apparmor Allows Launching Chrome Browser From Evince

| Comments

我电脑上的google chrome browser是从官方下载的,使用上到时没有问题,而且chrome browser也设置为我的默认浏览器,这一设置,引发了一个问题,在使用evince浏览单pdf文件的时候,如果点击文档中的链接,会给出一个permission denied 的错误.

依然是Apparmor搞的鬼。解决的办法如下:

  1. 编辑/etc/apparmor.d/abstractions/ubuntu-browsers 文件,修改或者加入下面一行 /opt/google/chrome/google-chrome Ux 路径依赖于你安装google chrome的路径。
  2. 执行下面的指令: $ sudo apparmor_parser -T -W -r /etc/apparmor.d/usr.bin.evince 现在尝试用evince打开pdf文档,点击链接试试,应该没有那个扰人的警告了吧。

查找当前目录的重复文件

| Comments

Ubuntu下有一个 fdupes 程序可以用来打印当前目录下有多少文件是重复的。因为是二进制程序,所以效率上更高。 而用Python实现的,效率就很低了,同样的目录,fdupes只用了2秒的样子,而Python程序就用了15s,大约7-8倍速度差距。 所以这个代码仅仅只是一个演示罢了。
代码参考《Python for Unix and Linux System Administration》一书。

File /Users/wgzhao/Sites/blog.wgzhao.com/source/downloads/code/dirtory could not be found

代码运行类似如下:

$ fdupes.py Dropbox/
....
Dropbox/Public/rhce-ts-9.0-1.2.noarch.rpm
Dropbox/Public/Linux/rhce-ts-9.0-1.2.noarch.rpm

Dropbox/repos/bolebi/hooks/pre-revprop-change.tmpl
Dropbox/repos/lshc/hooks/pre-revprop-change.tmpl
....

Dropbox/Public/libflashplayer.so
Dropbox/Public/Linux/libflashplayer.so

Core Python Programming 2nd Chapter 20 Exercise

| Comments

这一章主要是网络客户端编程,讨论了包括SMTP,POP3,FTP,URL在内的一些编程技术。Python针对网络编程有一个非常强大的模块,那就是Twisted,这个工具太强大,以至于有专门的书籍来讲述如何使用。

后面的习题大部分都是写一些代码片段,比如获取一个页面,连接一个FTP服务器,连接你的邮箱。

Core Python Programming 2nd Chapter 19 Exercise

| Comments

因为这一章是图形化编程,第一版和第二版都只是简单的描述了一下Tkinter如何使用。其他模块,比如PyGtk,WxPython更加是一笔带过了,所以要完成后面的习题,还得自己找一些资料看。

关于Tkinter的资料,国内不过,基本上还是官方文档为主,Python官方站点给出了一个关于Tkinter的专题,集中了一些资料,感兴趣的可以看看。

19–8.简单的文本编辑器。在您上一题答案的基础上创建一个简单的文本编辑器。可以用剪贴板或读文件的方式 在一个文本域里显示一些文字供用户编辑。当用户退出程序时(通过 QUIT 按钮或 Quit/Exit 菜单项) 会询问用户是否保存所作的修改。附加题:给您的脚本添加一个拼写检查接口,增加一个按钮或菜单项来对文件 进行拼写检查。拼写错误的词句应在文本域组件中用不同的背景或前景色高亮显示出来。

Core Python Programming 2nd Chapter 9 Exercise

| Comments

9–1.文件过滤. 显示一个文件的所有行, 忽略以井号( # )开头的行. 这个字符被用做Python , Perl, Tcl, 等大多脚本文件的注释符号. 附加题: 处理不是第一个字符开头的注释.

去掉以#开头的行比较好办,用startswith函数也行,用string[0]获得第一个字符也行。
麻烦的是如果要去掉行中间的注释,我这里采取用的是正规表达式(RE)方法,代码如下:

Core Python Programming 2nd Chapter 18 Exercise

| Comments

18-4. 线程和文件。把练习 9-19 的答案做一些改进。我们要得到一个字节值,一个文件名然后显示在文件中那个字节出现了多少次。假设这个文件非常的大。文件是可以有多个读者的,那我们就可以创建多个线程,每个线程负责文件的一部分。最后,把所有的线程的结果相加。使用timeit()对单线程和多线程分别进行计时,对性能的改进进行讨论。
18-5. 线程,文件和正则表达式。你有一个非常大的 mailbox 文件——如果没有的话,你可以把你所有的 e-mail 的原始信息放到一个文本文件中。你现在要做的是,使用你在 15 章写的识别 e-mail 地址和网页 URL 的正则表达式,分析出这个大文件里的所有的 e-mail 地址和 URL,把这些链接写到一个.html(或.htm)文件中。在这个文件生成时,会自动显示一个浏览器,打开这个文件,显示所有的链接。使用多线程来分隔处理大文件和把结果写到一个新的.html 文件的操作。在浏览器中测试一下你的结果,确保那些链接都能正常工作。
18-8. 线程池。修改例 18.9 的代码,不再是一个生产者和一个消费者,而是可以有任意个消费者线程(一个线程池),每个线程可以在任意时刻处理或消耗任意多个产品。
18-9. 文件, 创建一些线程来计算一些(可能很大量的)文件中一共有多少行。你可以选择要使用多少个线程。比较单线程与多线程的性能差异。提示:回顾一下第 9 章(文件和输入 输出)的练习。

Core Python Programming 2nd Chapter 13 Exercise

| Comments

这个章节的内容值得仔细阅读,而且不应该只读一遍。 我对比了第一版和第二版,后者在13节增加了一些内容。另外习题有所增加。
还有一个现象就是因为第一版的翻译不是第二版的翻译,有些术语和语句风格有比较大的区别,在这一章就体现的更加明显了。

13-3,13-4:MoneyFmt 类里只有一个数据值(即,金额),和五个方法(你可以随意编写其他方法)。
__init__()构造器对数据进行初始化,
update()方法把数据值替换成一个新值,
__nonzero__()是布尔型的,当数据值非零时返回True,
__repr__()方法以浮点数的形式返回金额;而
__str__()方法采用和dollarize()一样的字符格式显示该值。
(a) 编写 update()方法,以实现数据值的修改功能。
(b) 以你已经编写的dollarize()的代码为基础,编写__str__()方法的代码 (c)纠正__nonzero__()方法中的错误,这个错误认为所有小于 1 的数值,例如, 美分($0.50),50返回假值(False)。
(d) 附加题: 允许用户通过一个可选参数指定是把负数数值显示在一对尖括号里还是显示一个负号。默认参数是使用标准的负号。

Core Python Programming 2nd Chapter 11 Exercise

| Comments

11–7. 用 map() 进 行 函 数 式 编 程 。
给 定 一 对 同 一 大 小 的 列 表 , 如 [1 , 2 , 3] 和[‘abc’,’def’,’ghi’,….],将两个标归并为一个由每个列表元素组成的元组的单一的表,以使我们的结果看起来像这样:
{[(1,’abc’), (2, ‘def’), (3, ‘ghi’), …}.

实现代码如下: