0%

clangformat.com是一个通过交互方式设置clang-format格式选项并查看格式化效果的网站,将所生成的配置选项命名为.clang-format并保存在用户主目录下,然后在使用clang-fromat格式化代码就会读取并应用该配置选项。但是在这里需要注意的一点就是,PointerBindsToType: 100这一句是该网站的默认选项,但是右侧的解释部分我们可以清楚地看到,该选项的值是一个bool类型值,因而该选项的值应为true或是false。我们在保存文件时应根据我们的实际需要修改。

这样就可以使用clang-format来格式化生成漂亮的代码了。

什么?没有clang-format?如果在Debian系统,可以使用超级牛力的apt-get来安装:

1
apt-get install clang-format-3.5

时间飞逝,转眼之间距离上一篇《不作不死-Gentoo折腾记》已经过去近两个月的时间了。事实上,Debian的折腾与前面Windows和Gentoo的折腾是同时的,然而由于各种原因一直没有记录,今天在这里记录一下。

我个人的Debian使用历史还要从大学时代说起。那个时候刚刚买了电脑,由于个人的兴趣也开始尝试折腾各种Linux发行版,可以说那个时候每天的主要折腾内容就是重装Linux。当时学校里论坛里有一个大牛,他极为推崇Debian,并且据他说,自从他用了Debian以后就再也没有换过其他的Linux发行版本。于是在大牛的指引,我也开始了Debian的尝试,当然也正始他所说,我使用了Debian以后也不再想换用其他的Linux发行版本了。丰富的软件源,超级牛力的apt-get,这就是Debianer深爱的原因。正如网友所说,使用Debian就像开了一家超市,无论缺什么,只需要apt-get就可以了。当然,Debian为了追求系统的稳定性,软件的陈旧一直为大家所诟病,而随着基于Debian的Ubuntu的兴起,Debian也加快了开发的节奏。当然,对于个人用户来说,使用testing源,或者sid源或是experimental源,软件包的版本还是相当新,而软件包的稳定性也并不如听起来的那样恐怖。

好了,说了这么多无非是想要表达一下个人对于Debian的喜爱。在前面的文章中我们提到过,折腾Debian的原因就是为了能够使用CUDA进行GPU加速以及编译OpenCV。然而不幸的是,由于Nvidia对于Linux的支持问题,Nvidia所提出的Optimus技术是我们在Linux下使用CUDA的主要障碍。如果我们的笔记本支持在Bios里关掉集成显卡从而仅使用独立的Nvidia显卡,那是最好不过的了。但是在很多时候,我们所选购的笔记本提供商并不会在Bios里提供这样的功能,那么我们就需要转求其他的解决方案了。

幸运的是,伟大的开源运动为我们提供了Bumblebee解决方案,我们可以在其项目主页上看到相应的特性介绍以及安装方法。对于Bubmlebee在Debian下的安装,Debian Wiki介绍了相应的安装方法,这是我们首先要参考的文档。概括起来,Debian Wiki所提到的方法主要分为下面几步:

  • 安装Nvidia驱动

关于Nvidia驱动的安装,我们可以在Nvidia的官网下载对应的驱动。当然,在Debian的安装源中也有相应的Nvidia驱动,我们也可以选择通过apt-get来进行安装。

我们可以使用下面的命令来搜索一下Debian源中的Nvidia驱动:

apt-cache search nvidia

这样我们会看到多个Nvidia驱动可以选择,我们可以选择其中一个进行安装:

apt-get install nvidia-driver

apt-get会自动为我们解决相关的依赖关系。

  • 安装Bumblebee

同样我们也可以先来查看一下源中Bumblebee中的软件包情况:

apt-cache search bumblebee

然后通过apt-get进行安装:

apt-get install bumblebee bumblebee-nvidia

Bumblebee提供了optirun程序,我们可以通过该实用程序将相应的计算任务提交给GPU完成。例如,我们可以能过下面的命令将firefox程序放在GPU上运行:

optirun firefox

如果一切顺利我们会看到firefox正常启动运行。然而一切顺利终归是最为理想的情况,实际的情况并非总是如此,我们也许会遇到无法访问nvidia驱动这样的错误,解决方法是编辑/etc/bumblebee/bumblebee.conf,将KernelDriver=nvidia改为KernelDriver=nvidia-current,保存后重启bumblebeed守护进程:

/etc/init.d/bumblebeed restart

这样以后我们应该就可以顺利启动firefox了,当然,很有可能我们需要多次运行该命令才会启动成功。

好了,关于Debian Wiki上所介绍的关于Bumblebee的安装大致就是如此了,但是实际中我们会发现,仅是这样的安装步骤是不足够的。

要测试Nvidia驱动以及Bumblbee是否安装成功并正常工作,我们可以使用一个简单的测试程序,即mesa-utils所提供的glxgears。首先我们运行一下glxgears来看一下集成显卡的渲染速度:

glxgears

在我的机器上大致会达到60FPS这样的速度。

下面我们来测试一下在GPU上的渲染速度:

optirun glxgears

很奇怪的结果不是吗?GPU的渲染速度和集成显卡的渲染速度居然是一样的?如果仅是这样的渲染速度,我们还折腾CUDA运算干什么呢?为什么会出现这样的结果呢?

一切的原因就在于Debian Wiki介绍中少了一步,那就是安装virtualgl。关于virtualgl,我们可以在其项目主页上看到相应的介绍,简单来说,virtualgl所要实现的就是将渲染操作放在GPU上运行,而将渲染结果显示放在集成显卡上运行。这样看来virtualgl正是Bumblebee所需要的。

我们可以在virtualgl的项目主页上循着相应的链接下载安装virtualgl,安装后我们再运行下面的命令:

optirun glxgears

我们就会惊喜地看到,GPU的渲染速度可以惊艳地达到1800FPS,这才是GPU运行应有的水准嘛。

好了,我们的安装步骤已经接近尾声了,但是我们注意到,上面一系列的命令操作都是以root用户进行的,而当我们普通用户运行上面的命令时却告诉权限不足,并提示我们将用户加入bumblebee组,我们可以通过下面的命令来添加:

gpasswd -a user bumblebee

注销后再重新登陆,我们就可以顺利运行optirun命令了。

搞了Nvidia驱动与Bumblebee,安装CUDA开发包就是很简单的事情了。首先我们可以看一下源中所提供的cuda开发包:

apt-cache search cuda

然后安装相应的软件包:

apt-get install nvidia-cuda-dev nvidia-cuda-toolkit

apt-get会自动为解决依赖关系并安装相应的依赖包。

以上就是我在Debian上折腾CUDA的经历,准备好了CUDA开发环境,下面我们就可以学习CUDA开发了。

Gentoo,跑得最快的小企鹅,是Linux社区中一个独特的发行版本。采用与FreeBSD类似的Portage包管理机制,通过emerge自动化构建工具,采用由源码编译的方式构建整个系统,通过精确的编译选项控制,力求最大限度的压榨硬件性能,从而提供不同的Linux使用体验。正所谓成也emerge,败也emergeemerge是Gentoo爱好者所津津乐道的自动化构建工具,为Gentoo聚集了大批忠实的粉丝,然而也正是emerge的高门槛,挡住了许多Gentoo初学者尝试的脚步。在网络上有一篇Gentoo创始人所写的关于Gentoo设计哲学及其发展历程的文章(Gentoo的前世今生),大家可以找来一读,相信在读后,大家对Gentoo会有更多的了解。

言归正传,在前面的一篇文章中提到,由于在Debian下编译安装OpenCV所遇到的困难以及某软件文档中提到的在Gentoo下的CUDA环境下进行测试的诱惑(CUDA正是我所需要的),最终毅然决定再重新折腾一次Gentoo(之所以说重新,是因为之前有过折腾Gentoo的经历)。

提到Gentoo的安装,对于许多Gentoo初学者来说也同样是一件很困难的事情。好在Gentoo官方提供了大量的文档可供参考,如果我们参考这些官方的安装文档,Gentoo的安装就会变得容易得多。

概括起来Gentoo的安装可以分为下面几步:

  • 准备硬盘
  • 解压stage3
  • 解压portage
  • 编译安装内核
  • 编译安装必须的系统工具
  • 编译安装grub启动引导
  • 配置系统
  • 重启进入Gentoo新系统
  • emerge world

说起来就是这样简单的几步,但是实际操作起来,我们就会发现有许多需要注意的地方。首先我们需要在/etc/portage/make.conf中设置Gentoo安装源,在这里推荐163的源:

GENTOO_MIRRORS="http://mirrors.163.com/gentoo/"

为了在编译安装软件包时不会安装无谓的语言包,我们可以在/etc/portage/make.conf中设置编译时所用的语言:

LINGUAS="zh_CN"

在安装X时,我们需要指定要安装的驱动:

INPUT_DEVICES="evdev keyboard mouse synaptics"
VIDEO_CARDS="intel nvidia"

然后通过下面的命令安装X:

emerge -av xorg-server

如果需要图形界面,我们可以选择轻量级的XFCE4:

emerge -av xfce4-meta

当然,通过这种方式安装的软件会相对比较多,如果我们有耐心,或是想了解一下XFCE4的软件包组成,我们可以选择emerge单个软件包的方式来安装。在这里要提醒大家一下的就是,通过上面的命令所安装的软件包并未包含xfce4-terminal,如果我们希望使用该终端软件,一定要记得另外安装哦。

好了,这样我们就可以准备启动XFCE4了。当然在启动之前我们还需要最后一步配置:

echo "exec startxfce4" >> .xinitrc

这样以后我们就可以启动X了:

startx

一般来说,我们会比较顺利的进入XFCE图形环境。

在熟悉的图形环境里,我们就可以emerge整个世界了。

但是我折腾Gentoo的最初目的是为了cuda与opencv啊,如果不解决这两个软件包,那折腾Gentoo岂不是没有意义了?!在这里不得不感叹一下,Gentoo通过源码安装的方式确实在某种程度上带来了便利。

要安装cuda,首先要解决nvidia显卡驱动问题。在前面安装X时,我们通过指定VIDEO_CARDS已经顺利地安装了闭源nvidia驱动,我们所缺少就是切换显卡驱动的bumblebee:

emerge bumblebee

为了测试显卡驱动是否安装成功,我们可以使用mesa-utils测试套件:

emerge mesa-utils

首先我们可以看一下不使用nvidia驱动时的glxgear速度:

glxgear

然后再对比一下使用nvidia驱动时的glxgear速度:

optirun glxgear

此时我们应看到速度上的巨大差异。如果看到两者之间的速度差不多,那就需要检查一下我们的软件安装是否正确。

安装cuda开发工具包:

emerge -av nvidia-cuda-toolkit

安装opencv软件包:

emerge -av opencv

此时我们就会看到可以使用的各处USE FLAG,我们可以根据我们的需要打开或关闭相应的USE FLAG,而portage会自动为我们解决相应的依赖关系。

OK,一切就绪,前进吧!!

我现在所用的新笔记本是去年10月份购入的Aspire V3-571G,i5-3230M双核处理器、GT
730M独立显示、4G独立显存、1920x1080分辨率的IPS全高清屏,最重要的是5038的价格,正如网上大家的评价,这是一款性价比相当不错的笔记本。而我也希望能够在工作中充分发挥其性能,因而在来西安出差之前,特意更换了一块1T的硬盘,并加装了一条4G内存,从而使得内存容量达到8G。本希望他能够充分发挥其性能优势,然而在最近一段时间却给我带来不少的烦恼,而烦恼的根源就是GT730M独立显卡。

问题的起源是这样的:现在出差所在的单位,所有的开发工作都是在Linux平台下完成的,由于受困于项目所需要的处理速度,理所当然的,我们希望能够使用CUDA来加速我们项目的处理能力。然而由于我的笔记本是IntelNvidia双显卡,且由于Nvidia的Optimus技术,使得在Linux系统上安装Nvidia驱动并安装CUDA开发包变得困难起来。好在开源社区推出了Bumblebee解决方案,可以在Linux系统上实现Nvidia的3D硬件加速,从而使得在Linux系统下使用CUDA进行开发成为可能。然而悲催的是,不论我是使用源里的Nvidia驱动,还是在Nvidia官网下载的驱动,虽然都可以正常的安装,但却无法使用,更不要说CUDA开发了。在网上搜索了半天,原来遇到同样问题的人还不在少数,而问题的根源就在于Nvidia的Optimus技术,而解决方案就是Bumblebee。但是无论我怎样尝试,都没有办法在我的Debian上正常运行。难道我们的开发终归要回到Windows平台吗?

另一个促使我折腾的原因则是这样的:在我们的项目中使用OpenCV,在我第一次安装上Debian系统,我是使用源里的OpenCV来进行安装的,然而由于Debian的自由策略,是不提供nonfree的安装模块的,而nonfree模块也正是我们所需要的,这样一来,我们只能自己来编译安装OpenCV了。然而在使用CMake进行配置时却有一大堆的依赖关系需要解决,这时的我只能在源中一个个查找然后安装了。这时的我真是有些怀念Gentoo的编译安装啊。巧的是,布老师给我了一份CUDA SURF的代码让来看一下,而在这份代码的README中就说明,这份代码仅在Gentoo的CUDA环境下进行过测试。这就让我那颗的心蠢蠢欲动了。

最后一根压倒骆驼的稻草则是这样的:不知道是我Debian系统更新的原因,还是我OpenCV编译的原因,我们项目中的一个测试例子在显示两幅keypoints图片后,在两张图片之间切换时就会产生程序死掉样子的空白。再加上我再次尝试编译OpenCV时,以前能够成功编译的代码和配置在这次编译时却一直报错,在网上搜索了一下发现,似乎是由于FFMPEG的版本较新的原因。没有办法,自己重新由源码编译安装了FFMPEG,并修改了OpenCV的部分代码,才最终编译成功。而这更使我下定决定回归Gentoo的编译安装。

当时在我的1T硬盘上,系统分区则安装的情况是这样的:最前面是100M的系统保留分区,然后是400G的Debian分区,接下为200G左右的Windows分区,最后是一个逻辑分区。由于前面的想法,我就想在400G的Debian分区上划分200G出安装Gentoo,之前有过在Windows上使用分区软件划分分区的经验,通过使用PartitionMagic之类的软件,就可以对分区进行调整而不会破坏分区上的数据。然而这一次,无论我怎么尝试,都不能对Debian分区进行调整。无奈之后,只能重新分区重新安装系统了。于是将400G的Debia分区与前面的100M系统保留区分合并,重新划分为两个分区,一个用来安装Debian,而另一个用来安装Gentoo。两个系统安装完成后进行了简单的配置,于是重启,结果发现我的Win7系统进不去了,错误提示BOOTMSG丢失,这时才意识到我将100M的系统保留分区删除的严重后果。

为了恢复Win7系统的启动分区真是花费了很大的努力,各种修复方法都进行了尝试,然而无一例外的,所得到的都是令人失望的结果。终于在折腾在半夜后决定使用我的终极大法,重装Windows。

采用重装的方法,那一切就变得简单起来了,只需按照顺序重新安装,下载软件,配置等进行下来就可以了。这时所需要做的就是耐心的等待和地糟糕网速的容忍。不过好在这一切之后,一切又都恢复正常了。

这就是我最近很二的折腾电脑的经历。真是应了那句话no zuo no die啊!!!

最近在Cousera上开始了一门介绍使用Scala进行函数式编程的公开课Functional Programming Principles in Scala,该课程使用基于EclipseScalaIDE作为开发工具,使用SBT作为构建工具,从而第一次知道了SBT这个构建工具。

关于课程所用开发工具及环境的搭建,在课程视频有详细的介绍,而且在Tools Setup还有相应的说明,而关于SBT的初步使用在Sbt Tutorial部分也有相应的介绍,通过阅读这些说明,我们就可以初步了解Sbt的使用,以满足该课程的需要。当然,如果我们感兴趣或是有需要,我们可以网络上找到大量的相关文档,当然官网的文档是我们一定要找机会细读的,另外在Github上还有一份相当不错的关于Sbt的介绍

然而在实际使用时,我们就会发现,Sbt的自动化库管理工具需要连接网络下载相关的依赖包,而且似乎是每执行一个任务就要连网下载,完全没有理会已下载的JAR包(很有可能是我没有正确的理解Sbt才会有这样的认识),对于我们这样糟糕的网络环境来说,这绝对是一个极大的挑战,即使是在早上人少网络环境相发不错的时候连网下载也不见得会成功,这对于刚刚燃起学习兴趣的我来说是一个极大的打击。

不过好在这个问题并不是不能解决的。在Google上搜索一下,我们就可以找到大量的关于Sbt库依赖管理的内容,当然在Sbt官网文档的库管理部分就已经介绍了Sbt的依赖库管理方法。原来在Sbt中,我们可以使用自动与手动两种方式来管理Sbt工程的依赖库,即Managed Dependencies与Unmanaged dependencies,当使用自动方式时,在工程目录下的build.sbt文件指定所依赖的库:

libraryDependencies += "org.scalatest" %% "scalatest" % "1.9.1" % "test"

libraryDependencies += "junit" % "junit" % "4.10" % "test"

上面的两行代码就指定了scalatest-1.9.1junit-4.10两个依赖库。然而也就因为这两个依赖库,在执行Sbt任务时就会长时间卡在依赖库下载这一步。

幸好我们还可以选择使用手动管理依赖库。当使用手动管理依赖库时,我们只需要将所依赖的库放在工程目录下的lib目录中,当启动Sbt时,Sbt会自动将lib目录下的库文件添加到classpath中。但时在这里我们需要注意的一点就是,当选择使用手动管理方式时,我们需要将build.sbt文件中的上述两行代码注释掉,否则依然还是使用自动管理方式,依然会连网下载。

//libraryDependencies += "org.scalatest" %% "scalatest" % "1.9.1" % "test"

//libraryDependencies += "junit" % "junit" % "4.10" % "test"

这就是我在初次使用Sbt时遇到的问题,记录在这里,希望会对遇到类似情况的朋友有用。

我的Gateway T6819c是2007年10月1日购买的(之所以日期记得这样清楚是因为第二年的10月1日我在北京花了1050的价格购买了美利达入门级山地车勇士,这在当时是一件十分疯狂的举动),作为Gateway入华来的第二款笔记本,搭配了Intel酷睿双核T5250,不过主频低了些,只有1.50GHz,1G内存,120G硬盘。可以说这是当时笔记本的标准配置,比起现在2G内存,500G硬盘的标配来说真是寒碜得多。随着时间的推移与软件技术的进步,软件运行所需要的硬件资源越来越多,我的T6819c越来越难以应对越来越苛刻的硬件需求,而在安装了Win7以后更是步履维艰,更加雪上加霜的是学校使用华为iNode客户进行认证上网,iNode的网络监控所耗费的硬件资源更为压垮我的最后一根稻草。无奈囊中羞涩,实现不了换新本的美梦,那就只能寻求升级的途径了。

最早听说SSD还是2011年在办公室里看《电脑报》时了解到的呢。不过当时的SSD真是贵得离谱,加之尚且能够忍受当时的电脑速度,因而没有动过任何心思。而随着硬件技术的进步,SSD越来越进入大众的视野,不再成为可遇而不可求的神器。当然最为重要的是在京东搞活动时以699元的价格入手了一块金泰克SSD。既然要升级,那就顺便也升级一下内存吧,于是在淘宝上购得了一条2G的三星DDR2 800的内存。等一切齐备后就开始了我的笔记本升级之旅。

内存的升级比较简单,卸下电池,打开电脑后盖,很轻松地就搞定了内存升级。而我的SSD升级真可谓是一波三折啊。

在升级开始之前,特意在网上Google了一下SSD升级攻略。看网上的教程觉得很简单,只需要将SSD安装在光驱位即可。如何将SSD安装在光驱位,一开始以为是使用光驱架来固定SSD硬盘呢。待我辛辛苦苦当光驱拆下来一看却傻了眼,因为第一我根本就卸不来光驱架,第二光驱是IDE接口,而我的SSD是SATA接口。

再仔细地看了一下网上的教程,原来将SSD安装在光驱位是通过一个所谓的光驱位硬盘架来实现的,于是马上淘宝搜索购买(在这里要提醒朋友们注意你需要的IDE接口还是SATA接口),几天后收到宝贝后继续升级之旅。

有了光驱位硬盘架,接下的工作就要简单得多了。将SSD固定在硬盘架上,然后将硬盘架插入光驱位,虽然过程有些波折,但总的说来还算顺利。一切搞定,下面就是安装系统了。

关于系统的安装,最初的想法是将原来硬盘的Windows直接拷贝过来,不过试了网上的方法后无一成功,没有办法,只能再重新安装了。安装过程一切顺利,但进入系统后却傻了眼,装在SSD上的Windows真是慢得要死啊!说好的程序秒开呢,我怎么没有体验到。勉强使用鲁大师跑个分,晕啊,跑分的结果显示,SSD的性能还不如我之前的机械式硬盘呢。

SSD接在IDE接口

看到这样的跑分结果真是郁闷得不行。如果是这样的速度我还不如用这个价钱来买一个大容量的机械式硬盘呢。不过突然间想到,这是不是因为我将SSD接在IDE接口上的原因呢?

于是再将我的机械式硬盘卸下来,拆下硬盘架,将SSD固定在硬盘架上,然后插在硬盘位的SATA接口上,将机械式硬盘固定在光驱位硬盘架上,插在IDE接口上。重启后进入Win7系统,这回的感觉立马就爽得多了。再用鲁大师跑个分先:

SSD接在SATA接口

原来之前的性能低下是因为转接在IDE接口上的原因啊。看来SSD还是要接在SATA接口上啊。想来也是,只有SATA对SATA,这些比特数据才能畅通无阻不减速啊。

以上就是我使用SSD升级笔记本的经历。真是纸上得来终觉浅,决知比事要躬行啊。

其实早就想就这个题目写点什么了,因为就在上个月,听说有一个高中同学(我们虽然不同班,但是彼此认识)由于高速车祸而离开了这个世界,丢下了娇妻幼子(孩子好像刚出生不久)。刚开始看到这个熟悉的名字时真是心里一震,这几年看着我们一起的同学正在按着生活的轨迹结婚生子,正在感叹我们逐渐老去,没有想到已经有同学开始离开这个世界了。一个人的离去对于这个家庭来说是怎么的伤痛啊?!正如另一个同学所说,一个家庭就这样崩溃了。

无独有偶,昨天和同学一起去食堂吃饭,在餐桌上同学讲了前一段时才知道他的一个关系很好的同学也因为车祸在床上过了痛苦的几年后也离开了这个世界,同样留下了年轻的妻子和幼小的孩子以及慢慢老去的父母。同学说,刚听到他同学的母亲说他走了时,一时没有反应过来,还在追问他去哪里了。等到知道所谓的走了是指离开这个世界时,心里真是难受极了。正如他说,已经几年没有哭过了,在那一刻哭了一个稀里哗啦。

清明三天小长假在家休息时,接到老家爸爸的电话,说是我的三娘(老家的叫法,爸爸的三嫂)老了。三娘由于糖尿病已经卧床多年了,我上一次见她还是2011年我回家结婚,过年时和妻子、老弟一起去三娘家拜年的时候看的呢。那时她已经因为糖尿病行动不便了。这两年来由于路远孩子小一直没有回家过年,没想到在这个清明时节,三娘也离开了这个世界。我和妈说,离开了也许是件好事,终于可以没有病痛,终于不再操心了。

记得在初中时,学校里要大家买保险。那时觉得买了保险就有了保障和安全,就连在马路上走路也放心大胆多了。那时年轻,还不知道生命的宝贵与脆弱。随着自己慢慢长大,特别是有了自己的孩子以后,就发现自己胆小得多了,不论做什么都是小心翼翼。有时想起初中时买了保险的感觉,那时的自己是多傻啊。

2010年我毕业参加工作,那个冬天和几个老大哥整天泡在实验室里,做所谓的科研项目。周末就几个人出去喝酒吹牛,也算是过了一段时花天酒地的日子。然而2011年初再开学上班的时候却得知整天和我们泡在一起喝酒吹牛的康教员的妻子患了癌症,虽然经过治疗没有失去生命,但也留下了永远的遗憾。那段时间作为项目主要设计人员的康教员由于工作的原因有时不能陪妻子去北京化疗,虽然我们都劝他陪嫂子一起去,而他只能无奈的说工作太忙了。

“工作是永远也忙不完的,所以该陪妻子陪妻子,该陪孩子陪孩子。”这是另一位尹大哥周末离开实验室去陪妻子逛街时总会和我说的话。“地球离了谁都能转,工作离了谁都能干,但是家离不开你。”这是我在和同事聊天时会说的话。

某一天看到同学老贾在微信朋友圈里感叹到:“一周过去紧接着一月过去。稍停下来的时候我想问自己,这样活着的意义是什么?”我评论到:“我不断的拷问自己,为什么活着?死并不可怕,但你还要未尽的责任,所以要小心的活着!”

为了我们爱的人,我们要好好照顾自己,小心地活着!!

今天终于读完了霍达的《穆斯林的葬礼》。事实上,这本书的阅读起于寒假前,然而真正的高潮与结局部分却是在今天一天之内读完的。合上书本静静想来,新月与楚雁潮的坚贞爱情令人感动,命运弄人的安排又令人感到悲哀,玉王的离去,玉儿的归来,这一切的一切都令人感叹。

说起这本书,记得我还在上中学的时候就已经有人向我推荐过了。那时班里有同学看过这本书,极力赞扬,并大力向我推荐。然而那时的我,由于种种原因也并没有找来读。记得去年在单位时,有一次和同事聊天谈起想要看《穆斯林的葬礼》这本书,同事也向我推荐并简要地向我介绍了书中的故事。不过他好像也是上学的时候看过的,并于书中故事的记忆也并不清楚了。

自从手中有了Kindle Paperwhite以后,也开始尝试在亚马逊上购买电子书来看,而这本《穆斯林的葬礼》也正是放寒假前在亚马逊中国的网站购买,这才真正开始阅读这本同学和同事都曾经向我推荐过的名著。

爱情可以说是一切文学创作的永恒主题,而《穆斯林的葬礼》也正是围绕着两代人的爱情悲剧来展开的。爱情是什么?人生在世,似乎每个人都在追寻自己的爱情,而对于爱情,每个人也都会自己的定义。

在爱情面前,有的人懦弱,有的人勇敢。奥利佛大声的喊出,每个人都有爱的权利。而他本人也正是在对玉儿的执著追求中倒在了纳粹德国丢向伦敦的炸弹之下。奥利佛是勇敢的,至死都是追求自己所认定的爱情。

那玉王与玉儿之间呢?这是不伦之恋吗?正如韩子奇自己所辩称的那样,他们之间本没有血缘关系,他们都有爱的权利。那玉儿呢?是我们现在所说的可耻的小三吗?玉儿自小和韩子奇生活在一起,韩子奇撑起了这个家,供玉儿读书,韩子奇对于玉儿来说,是兄长,更是父亲,是她的依靠,虽然更是她的姐夫。然而在这样一个战火纷飞的年代里,今天的自己连是否能够看到明天的太阳都是一个疑问,在这样的时候,追求自己的爱情,珍惜自己爱的权利与机会,这有错吗?

楚雁潮所理解的爱情却是这样的:

爱情,是人类最美好的感情,当两颗心经历了长久的跋涉而终于起到了一起,像镜子一样互相映照,彼此如一,毫无猜疑,当它们的每一声跳动都是在向对方说:我永远也不离开你!那么,爱情就已经悄悄地来临,没有任何力量能把它们分开了。

楚雁潮,这样一个当时的异类分子,对新月的爱是真诚而挚热的,这坚贞的爱情令人动容,催人泪下。最后在新月坟前的提琴声,更是诉说着对新月的思念。谁能说这不是真正的爱情呢?

当爱情来临的时候,我们要勇敢一些,不要错过了而悔恨终生。正如周星驰在《大话西游》中的经典台词:曾经有一份真挚的爱情摆在我面前,但是我没有珍惜,等到了失去的时候才后悔莫及,尘世间最痛苦的事莫过于此。

问题源起

之前曾经尝试使用Wikimedia来记录自己学习时的文档,而Wikimedia使用MySQL数据库作为后台存储工具,所以在自己搭建的Wikimedia上所写的所有东西都是存储在MySQL数据库中。后来在朋友的推荐下开始尝试使用Sphinx-doc来管理自己的文档,并且一直想关要将以前Wikimedia中的内容也全部转移到Sphinx-doc上来,由于自己的懒惰一直没有完成这一工作。

然而在换了一个新的工作环境后,首先想到的就是要将以前的工作记录全部迁移过来,Sphinx-doc的文本文档很简单,只需要将文本文件拷贝过来就可以了。当然对于这样的MySQL数据库的备份与导入也是很简单的,然而自己犯懒,只是简单的将MySQL安装目录下data子目录中相应的数据为目录拷贝过来,结果导致拷贝过来的数据库文件不能在MySQL数据库中打开。这是为什么呢?

在网上Google一阵后了解到,采用InnoDB存储引擎存储的数据库文件在简单的数据库文件拷贝后就会出现这样的问题。因为真正的数据文件是存储在data子目录下的ibdata1文件中的,如果我们细心看一下就会发现,这个文件的体积是相当大的。由于没有将该文件一同拷贝过来,丢失了真正的数据文件,从而导致了不能查看数据的问题。

问题解决

知道了问题的原因,问题的解决就相对简单多了。委托同事将ibdata1文件拷贝出来放在新的MySQL安装目录中,然后在phpMyAdmin中查看数据库,此时数据库文件已经活生生的存在那里了。

问题是解决了,那MyISAM与InnoDB两个存储引擎之间到底有怎样的区别呢?现将搜索的一些结果记录如下。

MyISAM与InnoDB的区别与对比

如果在Google搜索一下,我们就会得到一系列的关于两者的对比分析:

MySQL 5.5关于MyISAM与InnoDB两种存储引擎的文档描述:

关于MyISAM与InnoDB性能的简单评测:http://blog.csdn.net/fu_zk/article/details/10477113

酷壳关于MyISAM与InnoDB选择的一些思考:http://coolshell.cn/articles/652.html

经验教训

总结一下所学到的经验教训,那就是:

  • 使用mysqldump工具进行MySQL数据库的备份与恢复,而不要简单的备份数据库文件;
  • 如果只是简单的拷贝数据库文件,且该数据库使用InnoDB存储引擎时,一定要记得同时拷贝ibdata1文件。

That’s all~~ Enjoy it~~

在Debian上一直使用sid源。前一段时间sid源中的radeon驱动升级到了6.14.4-6。由于之前曾经升级到6.14.4-5,一度导致不能启动Debian的图形界面,所以对6.14.4-6版本的radeon驱动抱以极大的期望,希望能够正常的启动X界面,然而升级后依然是黑乎乎的字符界面。

查看/var/log/Xorg.0.log,可以看到是由于不能找到/usr/lib/i386-linux-gnu/dri/r600_dri.so,Google一下发现需要安装libgl1-mesa-dri:

apt-get install libgl1-mesa-dri

安装该软件包后依然不能正常启动图形界面,查看日志文件,可以看到类似如下的错误:

dri does not export required DRI extension

使用Google在网络世界中搜索一下后发现,原来是没有安装相应的firmware。可以使用下面的命令进行安装:

apt-get install firmware-linux-nonfree

安装后需要重新配置并编译内核,在设置驱动的图形支持编译选项中需要指定相应的firmware路径与真正的firmware文件。

Device Drivers --->
  Generic Driver Options --->
  [*]  Include in-kernel firmware blobs in kernel binary
  # RadeonHD 2000, 3000, and 4000 series cards:
  (radeon/R600_rlc.bin radeon/R700_rlc.bin) External firmware blobs

经过漫长的编译等待后,重新安装编译得到的内核,但是使用新内核启动依旧不能启动X界面。查看日志文件,会看到类似下面的启动错误:

(EE) RADEON(0): [dri] RADEONDRIGetVersion failed because of a version mismatch.
[dri] This chipset requires a kernel module version of 1.17.0,
[dri] but the kernel reports a version of 2.0.0.[dri] If using legacy modesetting, upgrade your kernel.
[dri] If using kernel modesetting, make sure your module is
[dri] loaded prior to starting X, and that this driver was built
[dri] with support for KMS.
[dri] Disabling DRI

Google得之,该错误是由于KMS引起的,可以参考Xorg Wiki。为了避免该错误,在Xorg Wiki中给出几种解决办法,但是在我的Debian上,配置文件内核启动命令行均不起作用,没有办法,只能最后在内核中进行配置了:

(Enable Radeon KMS support)
Device Drivers --->
  Graphics support --->
  <*>  Direct Rendering Manager --->
  <*>    ATI Radeon
  [*]      Enable modesetting on radeon by default

为了使内核支持KMS,我们还需要进行另外的相关配置:

Device Drivers --->
  Graphics support --->
    Support for frame buffer devices --->
    (Disable all drivers, including VGA, Intel, nVidia, and ATI)

    (Further down, enable basic console support. KMS uses this.)
    Console display driver support --->
      <*>  Framebuffer Console Support

重新编译安装内核,使用新内核启动后终于看到久违的X界面了。具体请参考Gentoo文档

That’s all~~ Enjoy it~~