Life Since 1985

Happy Hacking

记录几本关于linux开发的书籍

这是基本在"Linux Application Development"(Linux应用程序开发)中提到的基本书,有关于c语言的,也有关于linux下面高级编程的。特此记录在这里,以提醒自己时常翻阅。

(1)"The C Programming Language" 第二版 1988

(2)"Practical C Programming" 1993

(3)"Programming with  GNU Software" 1997

(4)"Advanced Programming in the UNIX Environment" 1992

(5)"UNIX Network Programming" 2004

(6)"A Practical Guide to Red Hat Linux 8" 2002

(7)"Linux in a Nutshell" 2003

(8)"Linux Device Drivers" 2003

GO语言环境设置

对于GO语言我也是今天闲着没事装上玩玩,按照GO语言官方文档的安装方法大体都能够安装上,不过有很多细节上面说的不是很清楚,而且有很多地方有可能在当前GO的版本上已经有所更改,所以特地写出来以供大家一起研究。

首先介绍一下我的环境:Ubuntu amd64

1.Go语言需要设置四个环境变量:

GOROOT:一般设置为$HOME/go,这个是GO安装包的根目录,一般的安装文件都下载在这里。

GOARCH:这个标识出系统的架构,即为386、amd64或是arm

GOOS:这个标识出操作系统类型,即为linux、freeBSD、darwin等等

GOBIN:一般设置为$HOME/bin,指明GO编译后安装的二进制目录。这个在官方的文档中写的是可选,但是在真正的安装过程中发现是必须要设置的,不知道是否是因为系统、架构的原因有所不同。

2.编译.bashrc,在里面设置好环境变量:

export GOROOT=$HOME/go  
export GOARCH=amd64  
export GOOS=linux  
export GOBIN=$HOME/bin
export PATH=${PATH}:$HOME/bin  

设置好之后可以通过以下命令查看是否设置成功

env | grep '^GO'

3.安装一些必要的工具

(1)安装Mercurial版本管理系统

sudo apt-get install mercurial

(2)安装GCC、C标准库、Bison分析器、 以及make、awk和ed等开发工具

sudo apt-get install bison gcc libc6-dev ed gawk make

4.下载GO的源文件

hg clone -r release https://go.googlecode.com/hg/ $GOROOT

通过以下命令对GO进行编译

cd $GOROOT/src
./all.bash

如果编译成功会在终端中显示如下信息

--- cd ../test
N known bugs; 0 unexpected bugs

基本上到现在为止GO语言环境已经编译并设置好了。

 

python新式类的继承方式

最近在读《python学习手册》,发现python新式类的继承方式很有意思,而且据说在python3.0里面所有的类都将变成新式类,在此让同是跟我一样在Python2.x入门的人尝个鲜。

在python的普通中类中,继承的模式是深度优先的,也就是说对于一个对象的搜索遵循从左至右、从下到上的原则,而这从下到上的原则又优于从左至右。发觉语言上的描述十分晦涩,举个例子吧。

# -*- coding:utf-8 -*-
class A():
    """
    作为所有类的基类
    """
    value = 1
    
    def __init__(self, ):
        """
        """
        
class B(A):
    """
    D的基类,继承自A
    """
    
    def __init__(self, ):
        """
        """

class C(A):
    """
    D的基类,继承自A
    并且将基类中的变量值修改
    """
    value = 3
    
    def __init__(self, ):
        """
        """
        
class D(B, C):
    """
    """
    
    def __init__(self, ):
        """
        """
        
x = D()
print x.value

对于以上的代码输出的结果将是1。

因为对于经典类来说,在类D中调用对象value,首先要查找类D中是否有value,如果没有则按顺序查找B->A->C。它是一种广度优先的查找方式,所以首先会在基类A中查找到对象value,然后输出1。

以下是新式类的例子:

# -*- coding:utf-8 -*-
class A(object):
    """
    作为所有类的基类
    """
    value = 1
    
    def __init__(self, ):
        """
        """
        
class B(A):
    """
    D的基类,继承自A
    """
    
    def __init__(self, ):
        """
        """

class C(A):
    """
    D的基类,继承自A
    并且将基类中的变量值修改
    """
    value = 3
    
    def __init__(self, ):
        """
        """
        
class D(B, C):
    """
    """
    
    def __init__(self, ):
        """
        """
        
x = D()
print x.value

对于这个例子输出的结果将是3。

因为基类A继承于object,而所有继承于object的类都将是新式类。对于新式类来说,在类D中调用对象value,它首先查找的依然是类D。如果没有查找到的话,他会依次查找B->C->A。在我看来,它是一种按层查找的原则,会在较低层查找对象,如果没有的话再到较高层查找。所以对于这个例子来说,value在类C中被查找到,所以它的值将会是3。

这种继承方式的查找还是挺有意思的,我本人是比较喜欢新式类的继承方式,因为毕竟如果在继承类中有对于基类中对象的修改,那么这种修改应该是有意义的,而经典类的继承方式就有可能因为基类顺序的问题将这种有意义的修改屏蔽掉,所以还是新式类会比较好一些。而对于python语言的发展来说,python3.0以后所有的类继承方式都将是新式类的继承,也就说所有的类都将是新式类,所以这种继承方式也是我们有必要去掌握的。

linux下乱码的解决

本来是想解决一下FLASH乱码的我问题,但是通过这种方法可以解决绝大多数的在linux系统下产生的乱码问题。其实这个方法就是将默认的字体删除,让linux使用不会产生问题的中文字体。这个问题用一下两条命令就能解决。

sudo cp /etc/fonts/conf.d/49-sansserif.conf /etc/fonts/conf.d/49-sansserif.conf.bak

这一条是进行备份,如果执行第二条命令后并没有解决乱码问题可以通过将文件名去掉.bak来还原。

sudo rm /etc/fonts/conf.d/49-sansserif.conf

这条命令是删除这个字体。

执行完后然后刷新网页,一般都会解决乱码的问题。

PS:不是原创,从google大神中找到的,不过命令下的注释使我写的,希望会对大家有所帮助。这个方法不是仅仅如原文所说只能解决flash乱码的问题,因为改变的不仅仅是flash中的字体,改变的是os的字体。所以经过我的测试对于pdf产生的乱码也能够很好的解决。

ps:很惊奇这个方法的通用性,在刚刚接触linux的时候就是使用这种方法,到了现在依然可以用。

It's so coooooool!!! 交换你的caps-lock和ctrl

在emacs中ctrl确实难按了一些 最近看到一篇文章就是教怎样将caps-lock和ctrl映射交换的,看了一下觉得很有道理就按照他的方法换了。It's so cool!!!

1.windows系统下:

要想在windows中实现这个互换,需要修改注册表。从开始菜单中选择“运行”,输入regedit。在左边的树状视图中,找到: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout 点击 KeyboardLayout 项,使之获得焦点。再从“编辑”菜单中选择新建一个二进制值,命名为 "Scancode Map",它的类型应该显示为 REG_BINARY。 然后选择这个新建的"Scancode Map"值项,用“编辑”菜单中选择修改二进制值,在二进制编辑对话框中,输入下列数据:

0000: 00 00 00 00 00 00 00 00

0008: 03 00 00 00 3A 00 1D 00

0010: 1D 00 3A 00 00 00 00 00

2.linux系统中: 在linux的X-Window中,可以使用xmodmap工具。在你的主目录新建一个名字为.xmodmap的文件,如果已经存在则只需修改。向该文件加入下列内容:

!
! Swap Caps_Lock and Control_L
!
remove Lock = Caps_Lock
remove Control = Control_L
keysym Control_L = Caps_Lock
keysym Caps_Lock = Control_L
add Lock = Caps_Lock
add Control = Control_L

保存,再向你的 /etc/rc.local 文件加入一行:

xmodmap ~/.xmodmap 2>/dev/null

3.在Mac OS X(Panther或Jaguar)中,你得安装一个修改过的键盘驱动,这说来有些吓人,但是很有效。

这儿有个关于驱动的讨论: http://www.macosxhints.com/article.php?story=20031102032521826 如果你用的不是Mac笔记本,好像有一个XML文件可以编辑来实现,可以参考这儿: http://www.eecs.wsu.edu/%7Eschneidj/mac-os-x-10.3.html#swap

下面的URL有一条关于在其它系统上实现的信息: http://www.manicai.net/comp/swap-caps-ctrl.html

ps:这是我以前博客的一篇文章,已经有点过时了,在linux中修改.xmodmap的方法交换caps lock和ctrl是通用的,不过对于gnome来说现在有着更为简单的方法,gnome中的键盘选项直接就支持交换ctrl键盘的位置。

linux下eclipse的安装和配置

eclipse是我们常用的一个ide环境,虽然我一般是在emacs下写东西,但是有些大型工程或者要和别人协同合作的时候eclipse却是常用的标准,所以有时也会用到eclipse。

eclipse在linux下面的设置很容易,基本上下载下来解压缩后就能用了,但是想要系统“认识”这个软件那么对他进行一些必要的配置还是必须的。

具体步骤如下:

1.首先下载eclipse(废话)

2.将eclipse解压缩到/opt下面

3.在/usr/bin下面创建一个启动脚本

sudo gedit /usr/bin/eclipse

脚本内容如下:

#!/bin/sh
export ECLIPSE_HOME=/opt/eclipse
$ECLIPSE_HOME/eclipse $*

4.让脚本具有执行的权限

sudo chmod +x /usr/bin/eclipse

#到现在为止其实你已经可以在终端中直接输入eclipse运行了,不过有些盆友还是比较喜喜欢用桌面启动器(也就是快捷方式)或者菜单去运行eclipse,所以下面再加上创建启动器和菜单项的方法。不过桌面和面板上启动器是在太简单了,我只说明一下添加菜单启动器的过程。

首先在/usr/share/applications目录里新建一个eclipse.desktop启动器进行编辑。

sudo gedit /usr/share/applications/eclipse.desktop

在文件中添加如下内容:

[Desktop Entry]
Encoding=UTF-8
Name=Eclipse Platform
Comment=Eclipse IDE
Exec=eclipse
Icon=/opt/eclipse/icon.xpm
Terminal=false
StartupNotify=true
Type=Application
Categories=Application;Development;

好了,这样就搞定了,尽情享受eclipse吧!(也有可能是折磨-_-!)

ps:测试环境为ubuntu10.04,eclipse helios

清华申请退学博士作品:完全用Linux工作(转贴)

: 尽管我们已经不习惯看长篇大论, 但我还是要说, 这是一篇值得你从头读到尾的长篇文章.
2005年9月22日,清华在读博士生王垠在水木社区BLOG上发表了《清华梦的粉碎--写给清华大学的退学申请》明确要求退学,
引起社会各界广泛争论. 他创作的长篇文章《完全用Linux工作》, 洋洋两万多字, 从不同角度居高临下的阐述了他眼中Linux完全优越于Windows的各种理由, 这篇文章并不简单的是一篇论述"Windows能做的事Linux都能做"这样的文章, 通篇洋溢着一个彻底批判 Windows 平台基础的计算机哲学, 计算机应用和计算机教育体系的人的万丈豪情, 尽管可能偏激, 也不乏详细的推理论述. 今天我们重温本文, 一方面也是因为CB上喜爱和推广Linux的人士很多, 有时也会爆发小规模论战, 我们希望能通过对本文的研究与讨论, 来窥测国内部分Linux推广者的心态, 同时为大家提供更宽广的讨论空间.

我已经半年没有使用 Windows 的方式工作了。Linux 高效的完成了我所有的工作。

GNU/Linux 不是每个人都想用的。如果你只需要处理一般的事务,打游戏,那么你不需要了解下面这些了。

我不是一个狂热的自由软件份子,虽然我很喜欢自由软件。这篇文章也不是用来推行自由软件运动的,虽然我觉得自由软件运动是非常好的。

这 篇文章也不是用来比较 Linux 和 Windows 内核效率,文件系统,网络服务的。我现在是作为一个用户而不是一个开发者来说话的,我们的讨论是基于操作,应用层面的。是为了告诉大学里还不了解,或者不 理解 UNIX 的科学工作者和大学生,UNIX 比 Windows 更适合用于科学研究工作,请大家理解 UNIX 的工作方式,不要用 Windows 的标准来要求 Linux,而要用一个科学工作者的标准来要求自己,用UNIX 的思想来武装自己。

我显然是反对在大学,特别是理工科专业推广 Windows 的。我也反对在对"娃娃"们的计算机启蒙教育中使用 Windows。因为 Windows 不论从技术上,经济上,思想风格上都是与我们培养高科技人才的目标格格不入的。Windows 的流行属于历史遗留问题,爷爷一级的人当然已经不可救药,但是我们不应该让下一代继续走上歧途。

继续阅读

115诡异的乱码

今天下载115网盘的资源,文件名一堆乱码,以前就出现过这种状况。其实也不是乱码,仔细看了一下应该是用%分隔的unicode码。反正也是闲的没事自己就用python写了一个恢复正常文件名的小程序,还算比较简单,主要就是读取文件名,然后将文件名按照%分隔,再手动设置一个溢出判断,超出两个字符就算溢出,溢出的部分和在文件名中的位置偏移另存,然后转换为字符就行了,最后将转换完的文件名存储。

python确实比较方便啊,不过十几二十行的代码而已,要是这个程序用c 或者java写的话……

# -*- coding:gb2312 -*-
F = open('datafile')
s = F.readlines()
s = [c.rstrip() for c in s]
ls = [c.split('%') for c in s]
result  = []
for c in ls:
    del c[0]
    isLarge = False
    sTag = None
    nTag = None
    n = -1
    for i in c:
        n = n + 1
        if len(i) > 2:
            isLarge = True
            sTag = i[2:]
            c[n] = i[:2]
            nTag = n + 1
            #print sTag
            #print nTag
    c = ['0x' + p for p in c]
    c = [eval(p) for p in c]
    c = [chr(p) for p in c]
    if isLarge == True:
        c.insert(nTag, sTag)
    result.append(''.join(c) + '\n')
    #print c

F.close()
F = open('myfile', 'w')
F.writelines(result)
'''
for i in result:
    print i
'''

Hp笔记本安装Ubuntu无线网卡开关的LED灯闪烁解决办法

本文来源于老牛的博客 原文地址: Ubuntu-wlan-led/ 转载请注明

今天在公司用我的Hp本子无线上网,发现一个奇怪的问题,就是网络连通后掌托处的无线网卡开关一直是闪烁状态,平常关闭的时候是红色的,在Windows中接通后是绿色的,可是在Ubuntu 9.04中接通后是不停的红,绿闪烁,担心这个会对硬件造成一定得伤害,所以就google了一下,没想到还这有这个问题的解决办法。

具体方法如下:

在终端进入 /etc/network/if-up.d 目录

$cd /etc/network/if-up.d

建立一个文件 iwl-no-blink

$sudo gedit iwl-no-blink

编辑里面的内容为

代码:

#!/bin/sh
if [ "$IFACE" = "wlan0" ]; then
for dir in /sys/class/leds/iwl-phy*; do
echo none > $dir/trigger
done
fi

保存

设置权限

$sudo chmod 755 /etc/network/if-up.d/iwl-no-blink

重启系统,再次连接,问题解决了。

 

str() VS repr()

        内建函数str()和repr()可以方便地以字符串的方式获取对象的内容、类型、数值属性等信息。

       str()函数得到的字符串可读性好,而repr()函数得到的字符串通常可以用来重新获得该对象,通常情况下obj == eval(repr(obj)) 这个等式是成立的。这两个函数接受一个对象作为其参数,返回适当的字符串。

>>> str(4.53-2j)
'(4.53-2j)'
>>>
>>> str(1)
'1'
>>>
>>> str(2e10)
'20000000000.0'
>>>
>>> str([0, 5, 9, 9])
'[0, 5, 9, 9]'
>>>
>>> repr([0, 5, 9, 9])
'[0, 5, 9, 9]'
>>>
>>> `[0, 5, 9, 9]`
'[0, 5, 9, 9]'

        尽管str()和repr()运算在特性和功能方面都非常相似,事实上repr返回的是一个对象的“官方”字符串表示,也就是说绝大多数情况下可以通过求 值运算(使用内建函数eval())重新得到该对象,但str()则有所不同。str()致力于生成一个对象的可读性好的字符串表示,它的返回结果通常无 法用于eval()求值,但很适合用于print语句输出。需要再次提醒的是,并不是所有repr()返回的字符串都能够用 eval()内建函数得到原来的对象。

>>> eval(`type(type))`) 
File "<stdin>", line 1
eval(`type(type))`)
^  
SyntaxError:invalid syntax

        也就是说 repr() 输出对 Python比较友好,而str()的输出对用户比较友好。虽然如此,很多情况下这三者的输出仍然都是完全一样的。