使用Ubuntu工作

2010年07月21日 16:21

最近工作性质有所变化,离开了数据库开发部门,转回了老本行,做C++开发。考虑到开发的C++代码大部分都是在Linux下运行,所以我的心思又活络了,很久以前考虑过的使用Ubuntu做日常工作的想法又蹦回了脑海。经过几天的构思和实践,我发现使用Ubuntu工作基本是可行的。

当然,用Ubuntu工作跟个人使用不一样,因为工作性质的关系,需要做一些迁就,并且要考虑到各种问题,不能像个人使用那般激进。

安装

首先当然是Ubuntu的安装。工作机并不是新机器,上面已经有大量日常工作数据和资料,包括文档、代码和其它各种资料,另外还有大量的个人数据。如果要空出一个分区来安装,需要做大量的迁移工作。为了减少工作量以及由此带来的各种风险,我选择了使用wubi安装。

wubi在选择的分区上创建一个虚拟的分区(有点类似虚拟机的做法),最大容量可以到30G,然后将ubuntu系统安装在这个虚拟的分区上。并且修改Windows的Bootloader,增加一个Ubuntu的选项。进入Ubuntu之后,所有的Windows分区,除了安装所在分区之外,都会存在于位置列表中,当你点击打开时进行自动的挂载。而Ubuntu虚拟分区所在的实际分区,则会预先挂载到/host目录。

按这种方式安装好的系统,Windows下的一切都不需要改动,只是在安装所在的分区减少了30G的容量而已。如果觉得不需要则可以安全的卸载。可以使系统迁移的风险降到最低。

基本办公

邮件/日程安排使用Evolution,稍加设置即可,没有什么麻烦,值得一提的是日程可以设置跟Google日历同步,结合我的android手机,很方便。Office文档可以用OpenOffice阅读和编辑。

MSN/GTalk交流可以用Empathy。另外Ubuntu 10.04有一个提醒指示工具,直接集成了邮件/IM的提醒,很好用。

C++开发

这是我最重要的工作,找一些合适的工具当然是很必要的。这里要稍微介绍一下我们的代码规范。我们的代码以组件的形式分布在上百个目录中,用配置文件的形式指名组件间的依赖。有一个自制的工具负责产生项目代码,在Windows下,这个工具可以产生VC用的makefile和Visual Studio用的dsw/dsp文件,在Linux下,这个工具可以产生makefile。

makefile做构建没有问题,但是并不利于代码管理。而在几百个目录之间做代码管理,用VIM显然不太合适。必须要有一个IDE。在网上稍微找了一点资料之后,我选择了Code::Block作为C++开发的IDE。那么如何将产生的makefile导入成Code::Blcok的项目呢?一开始我想了很多办法,都没有得到满意的效果。后来找到一份资料,说Code::Block支持项目使用外部的makefile做构建,这让我茅塞顿开:我不需要创建一个跟makefile功能完全相同的项目,而只需要一个包含全部文件的项目,并指定用外部makefile就好了!后者简单得多。我稍微修改了我们的工具,增加了生成cbp(CodeBlock Project)文件和workspace文件的功能,并在project里指定使用外部makefile进行构建,这样既可以使用Code::Block做文件管理,又不用担心构建跟原来有所不同。一举两得。

数据库

我们的项目经常要跟oracle打交道,因此一个oracle的客户端还是必不可少的。还好oracle提供了一些免费的工具,可以让我们完成这个任务。可以去Oracle网站下载oracle-xe.deb做客户端基础(注意oracle-xe从定义上来说是server,按理oracle-xe-client才是我们要的,但实际中我发现client缺少很多必要的功能,比如tnsname.ora,所以我还是选择装server)。然后使用SQLDeveloper这个免费工具做GUI。说实话SQLDeveloper没有PLSQL developer好用,但还算是一件不错的工具。

版本控制

我们公司相当BT的使用Visual SourceSafe做版本控制。想要公司在短时间内改用subversion/CVS/mercurial/git是不现实的,于是我只能自己想办法迁就了。

首先为了使用VSS,wine是不可或缺的。安装完wine之后,可以去找一份现成的VSS 6.0直接拷贝到本地就可以了。然后输入命令:wine SSEXP.exe就可以启动VSS的图形化界面了。有可能第一次运行会失败,报找不到MFC42.DLL,这个也比较容易,去Windows目录下找一个DLL丢到VSS程序目录就可以了。

在Linux下运行VSS是无法直接访问远程目录的。不过好在Linux有mount这个强有力的工具。我们使用cifs文件类型将远程目录mount到本地目录,然后在VSS里选择本地目录就可以了。在mount的时候要注意权限。

根据wine网站的说明,check in/check out/getversion等常用功能都没有问题,different会出错,但我实际实验是正常的。另外还说加文件不行,这个还没条件试,改天试试。

-----------------------------------

基本上这么一来,我的日常工作在Ubuntu下就没有问题了。以后如果再碰到问题,再解决。

备份BAT脚本

2010年07月05日 11:50

有个需求:Windows服务器上有一堆的LOG文件,需要定期清理掉一些之前的文件,将他们归档到指定目录(归档时保持原先的目录结构)。

用Shell其实挺简单的,不过Windows服务器上不能用,而且服务器原则上也不能安装第三方的软件。所以只能通过BAT实现了。

本来认为这是一个不可能的任务,但是后来一查资料,原来Windows还提供了一个不错的工具:forfiles,可以查找指定日期之前之后的文件,并针对这些文件执行一个命令。这个命令可以满足我的需求。

这个命令是Windows 2003以上的服务器版本自带的,XP没有。如果需要的话,可以去下载一份2003的版本,直接可用。

但是forfiles执行命令的时候有个问题,就是他会将当前目录设定为扫描到的文件所在的目录,这一点在实现我的需求的时候,造成了一些麻烦。不过最后我还是写出了这个批处理,现在贴出来希望给需要的人一些帮助。

archive.bat

@echo off
rem 注意,以下所有涉及路径的变量,均必须为绝对路径,不能为相对路径。
rem 在这个批处理的同目录下必须存在do.bat,用于实际的文件处理

rem ====================================
rem 配置设定
rem ====================================
rem 扫描的源文件夹。此程序对目标文件夹是递归扫描的。
set SRC_PATH=f:\temp\test\src

rem 目标文件夹。需要归档的文件将存放在这个文件夹里。
rem 注意该文件夹必须为绝对路径
set DEST_PATH=f:\temp\test\dest

rem -- 归档几天前的文件
set DAYS=5

rem ==============================================
rem 实际程序开始
rem ==============================================

rem 实际处理文件的批处理程序
set DO_BATCH=%~p0\do.bat

forfiles /P %SRC_PATH% /S /D -%DAYS% /C "cmd /c %DO_BATCH% @isdir @relpath @path %DEST_PATH%"

do.bat

@echo off
rem 参数:%1=isdir %2=relpath %3=fullpath %4=dest_path
rem 注意:%2是相对路径

set ISDIR=%1
set RELPATH=%~2
set FULLPATH=%~3
set DEST_ROOT=%~4
set DEST_PATH="%DEST_ROOT%%~p2"
set DEST_FILE="%DEST_ROOT%%RELPATH%"

rem 创建必需的目标目录
if %ISDIR%==TRUE mkdir "%DEST_FILE%"
if not EXIST "%DEST_PATH%" mkdir "%DEST_PATH%"

rem 复制文件到目标目录
if %ISDIR%==FALSE copy "%FULLPATH%" "%DEST_FILE%"

rem 删除源文件(如果源文件是目录则不删除)
if %ISDIR%==FALSE del "%FULLPATH%"

其中 %~2中~的意思是消除对应字符串的分号("),比如原先%2的值是"c:\program files",%~2的值就是 c:\program files

%~p2的~p的意思是获取文件所在的目录。

其他似乎没什么好解释的了。

Design downloaded from free website templates.