Install Dynamips & Dynagen on Fedora 16 64bit

Ubuntu真是一个想给用Linux但又想偷懒的人准备的好系统。还记得N久前我发的那篇Ubuntu上安装Dynamips & Dynagen的文章吗?那可真是方便啊,一个sudo apt-get install dynagen就全部搞定了,太他妈方便了。相比之下,Fedora下安装Dynamips & Dynagen就麻烦很多,足足花费了我一个下午的时间。输入sudo yum install dynagen肯定是不行的啦,不然我也不会写这文章了。来,跟我一起做:

 

1.安装Dynamips

我的解决方法是到作者网站直接下载了binary文件。这个是已经编译好的软件了。把它放到一个文件夹中,比如~/dynamips。我是比较推荐放在一个独立的文件夹中。因为每次运行,它都会生成一些文件,如果放在~下,长时间使用后会很乱。

期间我走了不少弯路。比如下载Dynagen官网上的那个rpm包/src.rpm包。rpm包安装出错,因为它是一个i386包,使用的是32位的库,而我使用的是64位系统,自然带的都是64位的库。也曾想过在/lib/下面做link,不过依赖的包好多。就放弃了。而src.rpm包,使用rpmbuild –rebuild的方法来创建rpm安装包,但到了最后,出现mips64_x86.h:not supported for ‘mov’的错误。Google上搜不到解决方法。于是,最后发现了那个二进制文件不是安装文件,而是已经编译好的文件。Oh Yeah,拿来直接用啦。

 

2.安装Dynagen

先到Dynagen官网下载最新版的src.rpm文件,然后进行rpmbuild –rebuild打包。如期出现错误啊,还要安装两个依赖包:

sudo yum install libpcap-devel

sudo yum install elfutils-libelf-devel

如果出现提示/usr/lib/libelf.a文件缺失的情况,则做如下处理:

sudo ln -s /usr/lib64/libelf.a /usr/lib/libelf.a

到此,执行rpmbuild –rebuild dynagen-0.11.0-1.fc9.src.rpm就能顺利完成打包工作。接着进入~/rpmbuild/RPMS/noarch下安装吧:

rpm -idynagen-0.11.0-1.fc9.noarch.rpm

 

至此,安全全部完成。进行验证:

 

大功告成。不过还是有缺点:

1.即使我在/usr/local/bin下做了一个link,还是没法直接用dynamips命令来直接启动dynamips。

2.退出后,dynamips进行还存在,想再次运行必须手动杀掉进程才行。

 

以上是我的一点回忆。可能有差错,若发现请在下面评论中指出。我会进行验证。

文章看上去不长,但这次绝对比上次费神多了。:-)

使用wxPython开发数据库管理软件小结

软件综合实验课程要求设计一个数据库管理小软件,在上次的使用C语言开发失败后(被字符处理给搞得头大了),这次决定使用Python开发,正好也逼迫自己学习一下Python.由于作业要求开发一个图形管理软件,所以选择了wxPython来做GUI.数据库操作部分使用MySQLdb.整个软件有1644行,数据库使用MySQL 5.5.18-log Community.Python版本为2.7.2.wxPython版本没注意,应该是2.8版本.整个软件实现以下功能:添加/修改数据库,实现了基本的编号自动生成功能.没有制作的是查找功能.不会制作的是报表生成功能.下面总结此次作业中的重点代码.

 

0.编码统一

这是及其重要的一部分,因为wxPython默认使用ANCII编码。

#coding=UTF-8          #指定Python使用UTF-8编码

import  sys

reload(sys)              #重载sys库。不然下面一条setdefaultcoding会提示无这个函数

sys.setdefaultcoding(‘utf-8′)       #指定系统使用utf-8编码,这样wxPython也会使用utf-8,而不是ancii

 

1.数据库操作

数据库的操作使用MySQLdb库来编写.给我的感觉是该库是一个C语言MySQL函数库的Python实现.唯一的区别是select语句返回结果,C语言中是数组,Python中Tuple.(其实两者区别不大.)

conn=MySQLdb.connect(host,username,passwd,db)      #连接数据库
cur=conn.cursor() #实例化一个游标
cur.execute(sql) #执行sql语句

#如果是select操作,那么使用以下方法获取结果
results=cur.fetchall()          #结果返回的是一个Tuple类型的数据

#如果是create/update/delete等操作,需要以下方法使sql操作生效
conn.commit()

cur.close()       #关闭游标
conn.close()     #关闭连接

2.GUI设计

i.初始化wxPython APP

不论是何种wxPython,都需要先实例化wxPython,在程序最外层全局初始化:

app=wx.App(False)

app.MainLoop()

ii.底层Frame窗口

wxPython中的wx.Frame是一个窗口画布控件,一般用它来作GUI的底层,主界面的其他元素都应该画制在Frame层之上。可以简单的只是创建一个wx.Frame的实例化对象,也可以写一个类来继承wx.Frame类,并且重构__init__()函数来创建自己的Frame模板。下面是一个简单的自定义的wx.Frame继承类:

class MainWindow(wx.Frame):

    def __init__(self,parent,titile):               #实例化MainWindow时做的初始化操作

        wx.Frame.__init__(self,parent,titile)           #调用wx.Frame的初始化函数

这样一个简单的自定义的wx.Frame继承类就完成了。你可以在Frame中放置许多元素。wx.Frame也拥有一些自己特有的元素。下面是制作一个简单的MenuBar和StatusBar代码应该放置在MainWindow类的初始化函数中:

self.CreateStatusBar()         #在Frame中创建一个StatusBar。wxPython会自动将其放置在窗口最底部

FileMenu=wx.Menu()           #创建一个File下拉菜单

exitMenu=FileMenu.Append(wx.ID_EXIT,”Exit”,”Exit”)      #在File菜单中附加一个Exit退出按钮

MenuBar=wx.MenuBar()              #创建一个MenuBar

MenuBar.Append(FileMenu,”File”)         #将File菜单附加到MenuBar中

self.SetMenuBar(MenuBar)            #将MenuBar添加到MainWindow中。

一个带MenuBar和StatusBar的Frame类就创建完成了。不过还没完事呢,还需要给exitMenu按钮绑定事件才行:

self.Bind(wx.EVT_MENU,self.OnExit,exitMenu)

还需要写一个事件函数:

def OnExit(self,e):

    self.close()

完成的MainWindow类如下:

class MainWindow(wx.Frame):

    def __init__(self,parent,titile):               #实例化MainWindow时做的初始化操作

         wx.Frame.__init__(self,parent,titile)           #调用wx.Frame的初始化函数

         self.CreateStatusBar()         #在Frame中创建一个StatusBar。wxPython会自动将其放置在窗口最底部

         FileMenu=wx.Menu()           #创建一个File下拉菜单

         exitMenu=FileMenu.Append(wx.ID_EXIT,”Exit”,”Exit”)      #在File菜单中附加一个Exit退出按钮

         MenuBar=wx.MenuBar()              #创建一个MenuBar

         MenuBar.Append(FileMenu,”File”)         #将File菜单附加到MenuBar中

         self.SetMenuBar(MenuBar)            #将MenuBar添加到MainWindow中。

         self.Bind(wx.EVT_MENU,self.OnExit,exitMenu)

    def OnExit(self,e):

          self.close()

iii.Panel画布控件

wx.Panel画布控件,其实它并没有任何内容,仅仅是一张画布,让开发者可以将其他控件放置在上面。它不能独立工作,必须有一个父窗口,比如wx.Frame。通过它可以将不同功能分区设计。它不能放置MenuBar和StatusBar之类的控件,不过它还是可以放置很多其他GUI控件的。后面要提到的Grid控件,Button控件,BoxSizer控件等都可以放置其中。

class MainPanel(wx.Panel):

    def __init__(self,parent):

        wx.Panel.__init__(self,parent)

 

iv.Button控件

和上面提到的ExitMenu一样,Button控件工作也需要一次实例化,一次事件绑定,一个事件函数:

    BuExit=wx.Button()
    self.Bind(wx.EVT_BUTTON,self.OnBuExit,BuExit)

def OnBuExit(self,e):

    self.close()

 

v.Grid控件

Grid是一种网格控件。它是wxPython的一部分,不过仅仅import wxPython不够,基本的wxPython库不包含Grid控件。需要import wxPython.grid才行。

wxPython.grid库是一个包含所有wxWidget.grid控件的库。这次我只使用了wxPython.grid.Grid控件,其它更高级的控件并没有使用到。

self.grid=wx.grid.Grid(self)             #实例化一个GRID

self.grid.CreateGrid(rowlen,collen)          #创建Grid网格,rowlen,collen为行列数目,即创建一个rowlen行collen列的网格

self.grid.SetColLabelValue(colnum,string)         #设定列名。colnum为列号,string为列名

self.grid.SetRowLabelValue(rownum,string)          #设定行名。

self.grid.SetCellValue(rownum,colnum,string)        #设定单元格的值。

 

vi.BoxSizer控件

BoxSizer控件是帮助开发者排列其他控件元素的工具。它是非常有用的工具。BoxSizer有两种样式,分别是HORIZONTAL和VERTICAL,放置在同一个BoxSizer中的元素以指定样式排列。BoxSizer可以嵌套排列,所以在一个布局中,开发者会创建多个BoxSizer来排列各种元素。

abox=wx.BoxSizer(VERTICAL)      #竖排样式的BoxSizer

bbox=wx.BoxSizer(HORIZONTAL)        #横排样式的BoxSizer

abox.Add(Button1,flag=CENTER,border=5)         #将Button1添加入abox中

abox.Add(Button2,flag=CENTER,border=5)

bbox.Add(abox,border=5)              #BoxSizer的嵌套。

bbox.Add(self.grid,border=5)        #将grid添加入bbox中。

self.SetSizer(box)            #记得要设定BoxSizer,否则BoxSizer不生效。

 

vii.ComboBox/StaticText/TextCtrl控件

这三个控件的代码很少,所以放一起讲。

st1=wx.StaticText(self,label=”test”,size=(-1,-1))      #创建一个StaticText

txt1=wx.TextCtrl(self,size)                 #创建一个TextCtrl

txt1.SetValue(string)           #设定txt1的内容。不设定则为空。

val=txt1.GetValue()              #获取txt1中的内容

cb1=wx.ComboBox(self,value,choices=list(val),style)       #此处value指ComboBox的选项条数,choices为选项内容,必须为list类型,style为可选项。

 

viii.Dialog控件

wx.Dialog控件可以看成是一个特殊的Frame控件,它可以独立工作,而不需要父窗口的依赖。它也是一个画布,没有内容的Dialog就是一个空空的窗口。下面是一个wx.Dialog的自定义继承类:

class Dialog(wx.Dialog):

    def __init__(self,parent,title):

        wx.Dialog.__init__(self,parent,title)    #调用wx.Dialog初始化函数

        self.ShowModal()           #别忘记让它显示出来。不然Dialog即使激活,也是不显示任何窗口的。

 

ix.MessageDialog控件

从控件名就可以看出它是一个消息提示框。这并不是一个很难的控件。

dlg=wx.MessageDialog(self,para,title,style)           #para为消息提示内容,title为框口标题。style为窗口类型,比如一个带ok按钮的窗口。

dlg.ShowModal()               #显示dlg

dlg.DestroyModal()             #如在按下ok键后销毁。

 

 

以上就是这次实验中的控件和库函数的使用简介。至于怎样调用数据库进行操作,各位看官的心中应该早已有方法了,在此不做说明了。整个程序还有很多不足之处,很多方法还可以继续抽象出来,进行程序优化。功能上也还有未实现的部分以及功能的不足。

参考资料:

 

下面是本次实验的全部代码下载:

MySQL乱码解决方法一则

已经被这个问题困扰很久了。也查阅了很多网上的解决方法,但都无法解决这一问题。最后终于找到了一则方法成功解决。

编辑/etc/my.cnf(这是在Fedora下的配置文件地址),找到[mysqld],在其下添加如下项:

character_set_server=utf8

然后重启mysql服务。输入以下命令检测数据库字符集的设定:

show variables like ‘char%’;

show variables like ‘collation%’;

结果如下:

+————————–+—————————-+
| Variable_name            | Value                      |
+————————–+—————————-+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+————————–+—————————-+

+———————-+—————–+
| Variable_name        | Value           |
+———————-+—————–+
| collation_connection | utf8_general_ci |
| collation_database   | utf8_general_ci |
| collation_server     | utf8_general_ci |
+———————-+—————–+

其中关键的client,connection,database,results,server以及collation中的三项为utf8,则表示更改成功。

之后建立的数据库就不会再遇到中文乱码问题了。不过需要注意的是,数据库要重新建过才行。已经建好的数据库还是乱码。(悲剧阿!)

之前按照网上的方法比如set names utf8或者添加default-character-set=utf8都无法成功。我想起原因是使用的数据库版本不同导致。(MySQL 5.5.18-log Community)

C语言连接MySQL

小记以下Fedora 16(x86_64)下使用C语言编程连接MySQL数据库的方法。

首先安装MySQL以及相关的开发工具:

sudo yum install mysql-server mysql-devel gcc

安装好如上两个包之后,即可创建数据库,并进行编程开发了。

一个简单的C语言连接数据库实例:

#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <mysql/mysql.h>

MYSQL mysql;

main()
{
char host[32]=”localhost”;
char user[32]=”root”;
char passwd[32]=”";
char dbname[32]=”test”;

if(mysql_init(&mysql)==NULL)
{
printf(“初始化失败”);
return(1);
}
if(mysql_real_connect(&mysql,host,user,passwd,dbname,0,NULL,0)==NULL)
{printf(“连接数据库失败.”);return(1);}
else printf(“连接数据库成功.”);
mysql_close(&mysql);
return(0);
}

进行编译:

gcc -o Database_Connection_test Database_Connection_test.c -L /usr/lib64/mysql -lmysqlclient

运行:

./Data_Connection_test

结果如下:

连接数据库成功。

昨晚在尝试的时候总是失败,提示mysql_init()等函数未声明,或者是提示无-lmysqlclient这参数。究其原因是-L之后的路径我没填写正确。64位mysql的lib库是在/usr/lib64下,而我填写成了/usr/lib/mysql,故总是失败。

Fedora 16使用初感

怀着对Ubuntu屎黄色界和最近几个发行版质量降低的不满,我转投了Fedora阵营。刚好Fedora 16这周二正式发布,上手试试呗。于是花了十几个小时下载了DVD安装包并刻录(吐槽以下Transmission在高速下载下卡卡的表现。大概也是因为使用配置很老的台式机的结果),在刚过去的两天间,我完成了Fedora 16在笔记本和台式机上的部署。下面是一些使用初感。

Fedora一贯的清爽主题(见上图),感觉很舒服,比Ubuntu的默认主题好多了。Fedora的应用程序滚动条没花哨的修改,比Ubuntu的渐隐滚动条用起来方便。从系统的各项功能中我们看出两者的定位不同:Fedora面向各类专业个人用户,而Ubuntu则是普通大众。为什么这么说呢,观察以下系统提供的视图功能:Ubuntu中很在背景设置中可以找到主题设置,也可以设置屏保;而Fedora压根没提供这种设置,只是简单的提供了一个壁纸设置。Ubuntu中没有SELinux和防火墙的设置界面;而Fedora提供了这些功能,并且有着更加严格的默认设置。从中我感觉两者面向的用户群不同。

这是我第一次就接触RPM系的Linux发行版,本以为会有些难上手,好在Fedora有着同apt一样功能的yum命令,并且软件源除了Fedora官方源之外,还有使用更为广泛的RPMFusion–集合了好几个常用源的综合源。安装和寻找软件也很方便。只是有一点我认为yum还可以改进:在写在软件包后能做个不再依赖的软件列表,并且提供一个如apt一样的autoremove功能。

在Gnome 3 Shell的体验上,Fedora 16和Ubuntu 11.10+Gnome 3 Shell两者无太大差异。在一些细节上Fedora做的币Ubuntu好:如ibus图标。当然部分也是因为Canonical的开发重点倾向了自家的Unity。

今天还花了一点时间把conky搞定,这花了我不少时间。因为直接从源里安装的是1.81版,所以网上的很多配置都无法使用。故我自己从默认配置起手自己搞了一个。没加入CPU温度检测,这不论是以前使用Ubuntu时还是现在使用Fedora,都是一个让我头痛的问题。查阅了很多网上讨论和官方/非官方教程,都找不到一个好的解决方法。即使以前的方法可以使用(确实以前找到一个解决方法之后是有效的),放到1.81版中就无效了。所以这次就没添加这项检测内容。