九天雁翎的博客
如果你想在软件业获得成功,就使用你知道的最强大的语言,用它解决你知道的最难的问题,并且等待竞争对手的经理做出自甘平庸的选择。 -- Paul Graham

CMake简介 - 一个现代软件构建系统

第一次见到CMake应该是在Eclipse中的编译工具链选项,但是一直没有太过在意,然后再次认识CMake与许多人一样,是通过KDE的源代码,当我上次查看KDE中右键菜单编辑时,接触了KDE的源代码时,很自然的需要KDE的构建系统,CMake,但是光是用用,也没有在意,直到我看到《通向KDE4之路》系列文章《通向KDE4之路(八):CMake,新的KDE构建系统》时,(KDE使用者推荐阅读,写的实在是太精彩了!Linux伊甸园的转载版本是比较好的,但是不全,其他很多版本都不带图,少了很多阅读乐趣,KDECN的版本文章较全,就是没有图)对KDE4从autotools工具链转向CMake有了深刻印象,有了一探究竟的想法,毕竟,当年我学习autotools系列工具的时候,压根就没有用心,在公司也没有类似工具的使用氛围,一般都是通过一个简单的模板手工编写makefile,然后整个工程的先后顺序依赖等事情通过bash脚本来管理-_-!呵呵,虽然说实话,因为毕竟公司的工程的改动并不大,而且当时以移植Windows的服务器程序为主,所以还算够用。。。。。另外,要是不是现在没有工作比较清闲,还真没有闲工夫去学习这些东西。

阅读全文....

懒惰是程序员的美德! 懒惰程序员的最爱AutoHotkey 尝鲜


懒惰是程序员的美德! 懒惰程序员的最爱AutoHotkey 尝鲜

write by 九天雁翎(JTianLing) -- www.jtianling.com

讨论新闻组及文件

Don’t Repeat yourself在编程领域成为DRY原则,是知道我们编写强壮代码的重要指导原则之一,但是,事实上在其他领域也是一样的(我也不知道此原则是否最先出现在编程领域)。Larry Wall的懒惰是程序员的美德的话我是记忆深刻。作为一个对计算机着迷,对程序无比投入的人,深知学海无涯,但是,正是因为学无止尽,更迫切的需要我们做追求效率的程序员,将重复的工作交给最擅长做重复工作的电脑去做,只有这样,我们才能将更多的时间节省下来,去干我们自己想干的事情。(虽然工作时不太可能-_-!但是起码能赢得一句手快的评价,再次-_-!)学习VIM,Bash,Python,Lua,Qt,SQL都是如此,在这条路上已经走了这么远的我们,又何惧为了更加提高效率,再多学AutoHotkey这样一个小工具呢?既然选择了远方,就只顾风雨兼程,既然选择了编程,就只能忘了远方。-_-!敲自己的键盘,让别人走路去吧。

AutoHotkey的名字大家说不上如雷贯耳,久仰大名,起码也是早有耳闻了吧。让我们不惧艰险(又是一种脚本语言-_-!)将AutoHotkey作为饭后甜点好好品尝一下吧吧^^

 

AutoHotkey是什么

AutoHotkey简单来说是一个附带键盘宏录制的脚本工具,但是因为功能太过强大了,叫做自动化工具也许较为合适。从自动化工作这一点来看,AutoHotkey类似Linux下的Bash,都不以脚本语言的逻辑表达能力取胜,专门针对自动化工作设计,只不过Bash是命令行下的,对窗口一无所知,而AutoHotkey可以说是专门针对Windows的窗口平台的,有对快捷键和窗口环境的强大支持。(我见人将其称作GUI-Scripting,实在贴切)也许可以说AutoHotkey就是GUI环境下的Bash。既然Linux下Bash是必学的(的确应该学),那么AutoHotkey也就顺便学了吧。

 

安装配置

下载安装我就不多说了,真的不知道这里有个地址可以去看看。善用佳软的AutoHotkey 0级教程,顺便推荐下善用佳软,推崇并介绍了很多好用的免费软件,个人很喜欢。

AutoHotkey的脚本是以ahk为后缀的文本文件,用你自己最喜欢的编辑器编辑吧,对于vim来说,已经内置了对ahk的语法高亮,我习惯将AutoHotkey的安装目录添加进环境的PATH中,这样用vim编辑脚本的时候可以直接简单的通过!Autohotkey %来运行脚本。(事实上我将其map到了F5上)但是愿意的话,其实.ahk文件在AutoHotkey安装后是与其关联的,直接双击也可以运行此脚本。

 

初步

首先编个最简单的脚本,看看效果先。

Run http://www.jtianling.com

将上一行的代码保存成文本,双击运行,或者用autohotkey运行之,会自动开启你机器上的默认浏览器登录我的博客,建议大家每天运行100次以上^^这个功能有点像Python的os模块的startfile函数,通过解析后面的字符串来判断应该使用什么与其关联的程序运行。当年工作的时候我有个开机脚本就是用Python此函数做的,功能就是开启工作需要的一大堆程序,VS,MSDN,TotalCommand自动一个一个开启并打开合适的工程或目录。现在这个功能也可以交由autohotkey来完成了。就是一条Run命名。

相对来说,对于特定用途的工具(比如Bash,autohotkey)来完成其擅长的事情是会比通用工具(比如Python)来的简洁的,此即一例,Python中虽然也能完成这样的工作(在没有学习Bash前,在linux下它都是我的脚本工具),但是,需要进行import模块,函数调用等一堆难看的东西,autohotkey只需要一个Run。这里之所以讲的多点,是想说明一个特定工具哪怕并不是完成了什么不可能完成的任务,也许仅仅是将任务完成的更加简洁高效和优雅,也是一个工具的用途体现。至于值不值得为了这份优雅付出学习的代价,那就见仁见智了。

再看个例子:

Run c:/DirTest.txt

此脚本会自动的用你机器配置的文本编辑器开启此文件。(文件必须存在)

但是以下脚本

Run notepad.exe c:/DirTest.txt

无论文件存在不存在都会开始记事本,其中的区别,大家自己体会一下。事实上解析的强度比一般人能够想象的还要厉害,帮助文件中有这个示例:

Run mailto:someone@somedomain.com

呵呵,什么意思大家都知道,牛吧。可惜我一般不用客户端写邮件-_-!

 

快捷键

AutoHotkey自然对Hotkey又特别支持啦,脚本中用符号表示快捷键,一次排列,几个常见的修饰键对应符号是#Win, !Alt,^Control,+Shift。那么什么叫依次排列呢?看下面的例子。

#space::Run http://www.jtianling.com

以上的例子即将Win + space 键设定为访问我的博客,运行后发现没有直接的反应,不像上述例子,此时AutoHotkey以trayicon小图标的形式运行于右下角,当你输入Win + space的时候会触发其运行默认的浏览器开启网站,并且一直有效,直到你将其关闭。(此例也推荐大家每日运行100遍^^与前面第一个例子结合交叉运行效果更佳)同理,要ctrl+space就是^space,要ctrl+alt+space就是^!space。

事实上,一个快捷键可以对应多个命令,也可以多个快捷键对应一个命令,格式有点不多,见下例。

#space::
Run http://www.jtianling.com
Run http://hi.csdn.net/vagrxie
return

#^a::
#^b::
Run http://www.jtianling.com
return

此例即是在按下Win + space时打开我的CSDN博客和空间两个网页,并且CTRL + WIN + A与CTRL + WIN + B都是打开我的博客。举这两个例子主要是告诉大家AutoHotkey的格式相对比较灵活,比如这里的一对多和多对一。当不是一对一并且写在一行时,需要以return来表示脚本的结束。

 

信息窗口

这也许是最先应该说的,MsgBox

MsgBox Text

即可以通过MessageBox弹出Text的信息,比较方便

可以通过MsgBox弹出Yes Or No等选项,并获取,以判断分支执行程序。

MsgBox, 4,?,Yes or No?
ifMsgBox Yes
    MsgBox You Said Yes!
else
    MsgBox You Said No?

分支执行的语法比较奇怪,通过if结合MsgBox构成一个IfMsgBox特别应对MsgBox的选择。

 

对窗口的控制

个人感觉,对窗口的控制是AutoHotkey的精髓所在,这也是为什么我将其比作GUI下的bash。这里我还是通过从简单到复杂的例子来描述。比如,我现在在编辑文档的时候常常会需要打开AutoHotkey的帮助文档查看,一般我的操作是用鼠标点击其最小化的窗口以激活,或者我也会需要开启gvim以编辑示例程序,也是需要用鼠标去激活,因为用atl+Tab的方式还不如用鼠标快,有了AutoHotkey,我们就有更方便的Hotkey去完成这样的任务了。

SetTitleMatchMode 2
#tab::
ifWinNotExist, GVIM
{
    MsgBox GVIM is not running
    return
}
IfWinNotActive,GVIM
    WinActivate,GVIM
else
    WinActivate,Windows Live Writer
return

如上脚本,先判断是否有标题包含GVIM的窗口存在,不存在则报告GVIM没有运行,不然WIN+TAB键的效果就是在GVim与Windows Live Writer之间切换,非常方便。ifWinNotExist如其名,用于判断一个窗口是否存在,ifWinNotActive也如其名用于判断一个窗口是否激活,第一个参数都是表示窗口标题文字的匹配,匹配模式由SetTitleMatchMode决定。

1: A window's title must start with the specified WinTitle to be a match.
2: A window's title can contain WinTitle anywhere inside it to be a match.
3: A window's title must exactly match WinTitle to be a match.

我们使用的是2,表示任意位置都匹配,默认是1,速度最快,必须是开始位置匹配。if一组的函数都还支持其他参数,具体的请查看帮助文档了,我这里主要是展示一下用途。

实际上AutoHotkey对窗口的控制还有很多强大的功能,一篇小文无法一一尽数,这里再举个例子:

SetTitleMatchMode 2
Loop, 10
{
    Random, x, 0, 50
    Random, y, 0, 50
    WinMove,GVIM,, %x%, %y%
    WinHide,GVIM
    Sleep, 100
    WinShow,GVIM
}

上述程序运行后,GVIM窗口会变的疯狂。。。WinMove,WinHide,WinShow的意思都很明显,分别是移动,隐藏,显示窗口,这里有两个有新意的地方,一个是Random和x,y,有点编程知识的人都看出来了,AutoHotkey是允许设定变量的,此处的x,y就是,引用变量的方式是前后各1个百分号,与windows批处理程序的一样。另外就是Loop,10表示的循环结构了。

 

操作记录器

这个功能有点像国内一个也比较强大的软件键盘精灵的功能(当年玩那种泡菜网络游戏没有少用过它,单纯的键盘鼠标模拟功能不比AutoHotkey差),就是将键盘鼠标操作记录下来,自动生成AutoHotkey的脚本。省去了重复工作的脚本编写之苦。带GUI界面,截图如下:

image 点击左上角的Record按钮就开始记录键盘鼠标的操作了。然后通过点击录制时屏幕左上角的Stop停止录制。上面的脚本是我录制的一段激活Windows live Writer和最小化Windows live Writer的过程。

WinWait, ,
IfWinNotActive, , , WinActivate, ,
WinWaitActive, ,
MouseClick, left,  1159,  889
Sleep, 100
WinWait, xfsdlaf.ahk (E:/work) - GVIM,
IfWinNotActive, xfsdlaf.ahk (E:/work) - GVIM, , WinActivate, xfsdlaf.ahk (E:/work) - GVIM,
WinWaitActive, xfsdlaf.ahk (E:/work) - GVIM,
MouseClick, left,  908,  17
Sleep, 100
WinWait, ,
IfWinNotActive, , , WinActivate, ,
WinWaitActive, ,
MouseClick, left,  33216,  32891
Sleep, 100
WinWait, Don’t Repeat yourself 懒惰是程序员的美德 AutoHotkey 尝鲜 - Windows Live Writer,
IfWinNotActive, Don’t Repeat yourself 懒惰是程序员的美德 AutoHotkey 尝鲜 - Windows Live Writer, , WinActivate, Don’t Repeat yourself 懒惰是程序员的美德 AutoHotkey 尝鲜 - Windows Live Writer,
WinWaitActive, Don’t Repeat yourself 懒惰是程序员的美德 AutoHotkey 尝鲜 - Windows Live Writer,
MouseClick, left,  1362,  10
Sleep, 100
MouseClick, left,  1387,  10
Sleep, 100

会发现自动生成的代码较人工的代码还是乱了很多-_-!机器嘛,不是那么聪明。上面代码很重要的一个就是通过MouseClick来模拟鼠标的点击,有了这个功能,想干什么都可以了………………顺便提及一下,也可以通过

Send Keys
SendRaw Keys
SendInput Keys
SendPlay Keys
SendEvent Keys

来模拟键盘的输入。下面是一个当你暂时离开机器却有不想锁屏时可以提出警告的脚本。:)

SetTitleMatchMode 2
SetKeyDelay 50
Words = WARNING{!} DO NOT OPERATE MY COMPUTER{!}

KeyWait, LButton, D
run,gvim YouAreUnderMonitored,,Max
WinWait,YouAreUnderMonitored
Send i%Words%{Esc}

此脚本等待鼠标左键单击,然后自动开启gvim并最大化,然后一个字一个字输入警告信息^^不明就里的人一看估计碰鬼了。

 

小结

对于AutoHotkey这样强大的东西,一篇3000来字的小文实在是无法详细尽数其功能,而本人的目的也就是提供给觉得AutoHotKey复杂而不去学习的人尝个鲜,知道了AutoHotkey没有那么难以后,伴随着使用,参考着帮助文档,慢慢的会发现AutoHotkey也是一个离不开的工具了。我就在网上看到很多人狂喊,Linux下什么都好,就是没有AutoHotkey-_-!(其实类似的言论非常多,比如也没有Windows Live Writer equivalent)

原创文章作者保留版权 转载请注明原作者 并给出链接

write by 九天雁翎(JTianLing) -- www.jtianling.com

阅读全文....

Windows下的Qt编程环境配置(Eclipse+CDT+MinGW与VS2008+VS Add in)要点


Windows下的Qt编程环境配置(Eclipse+CDT+MinGW与VS2008+VS Add in) 要点

write by 九天雁翎(JTianLing) -- www.jtianling.com

讨论新闻组及文件

     本文不准备详细的讲解每一步,那是侮辱准备开始进行Qt学习的人的智商,仅仅将容易碰到的问题和关键步骤。

 

Eclipse+CDT+MinGW:

没有话说,首先下载安装带CDT的EclipseQt的Windows安装包。Qt的安装包中是附带了MinGW的,虽然版本相对会老一点,所以不求新的完全可以不自己安装MinGW。(MinGW的安装,推荐下载自动安装包安装)

然后就是Qt的Eclipse integration,也有安装包,配置正确,安装完成后,安装部分完成的差不多了。

配置过程,首先Eclipse中将C/C++->New CDT project wizard中的toolchains改成MinGW GCC,并设为默认,然后将MinGW目录中(假如没有单独安装Qt的目录下有)的mingw32-make.exe改为make.exe,这一步很关键,切记,当年我缺少make.exe很郁闷直接下了个GNU版本的make程序,自以为应该错不了,结果GNU的make在解析Windows版本程序的时候会出现问题,我很久都没有发现是GNU make程序的问题(主要问题在于程序路径的解析),剩下的就简单了,建立工程时选other,会看到Qt的工程向导,建好,编译,运行。

 

VS2008+VS Add in

VS2008安装就不多说了,Qt VS add in的安装也不多说了,都是普通的安装包,很简单,但是配置,让人吐血,这一步没有看文档能够完成的,那是天才。当时都安装完以后,新建工程会出现Qt的向导,但是使用后,会发现创建不了,提示你配置Qt,然后会发现VS2008中已经出现Qt的菜单项,选择Qt Option后,可以看到需要配置Qt SDK的路径,选择后,你无论确认多少次你选择是正确的,但是OK按钮永远还是不可用,一直灰显的,你会纳闷了,程序出问题了?明明选择正确了啊?这就是Nokia出的高级软件-_-!

事实上,是配置不对,目录对了,但是目录里面的东西不对,你选择是是MinGW版本的Qt SDK-_-!事实上,Nokia就没有配置好的VS Qt版本提供下载,需要搭配VS使用时,需要自行配置。在Qt SDK安装目录下,将整个以时间命名的目录拷贝一份(保留MinGW版本以配合Eclipse),在此目录的下一层目录的Qt/bin中会发现configure.exe程序,我们需要运行此程序对Qt进行配置。我推荐配置命令是

D:/Qt/vs2008ver/qt>configure -opensource -debug-and-release -platform win32-msvc2008 -no-sql-sqlite -no-qt3support -no-dbus -no-phonon -no-phonon-backend -no-webkit -no-libtiff -no-dsp

剩下来进行傻瓜式选择,开始等待Qt的配置。配置完成后,用nmake编译,留下至少7G的空间用于存放中间文件,然后等N个小时吧(鬼知道Qt到底多么庞大)祈祷你成功吧,然后再次进入VS的Qt Option选项,选择目录,总算看到OK按钮活过来了,不容易啊,在Windows中要求进行Linux般的配置,会难住更多的人,因为在Linux下我进行再复杂的配置都习以为常,但是在Windows下我只习惯下一步。。。。。。。。。。。。

这一段讲这么多,是希望大家亲自来感受一下被折磨的感觉-_-!还有以防进行到一半需要帮助的难兄难弟,其实,正因为这个步骤实在是繁琐加费时,所以,现在有个专门的开源项目来解决此事,那就是qt-msvc-installer,经我试用,感觉比上述过程实在是一个天一个地,我庆幸我用的是VS2008,因为上述项目只支持VS2008,同用VS2008的人庆贺吧,说开源不好的人(比如Qt在这点上做的)的确有道理,但是没有开源(比如说qt-msvc-installer),那我们就还是在做着那些重复的,无意义的,让人郁闷及崩溃的事情。

 

感想(可忽略,纯粹废话)

一般而言,在Windows下安装软件,配置软件比Linux下容易的多,随着yum,apt等工具的发展,事情慢慢开始发展变化了,最近发现Qt的变成环境可以作为极端的例子来看,在Linux下配置一个Qt的编程环境那是相当简单的事情,因为其他的一切都已经有了,g++,make,有了,qt4可以通过apt-get安装,已经存在一个qt的C++的编译环境了,我们需要做的就是下载Eclipse并安装(事实上kubuntu9.04中也可以apt-get安装的,但是版本太老),再搭配一个qt的eclipse插件,就一切OK了,全过程不要1个小时,但是要在Windows下搭建一个类似的环境谈何容易啊,没有勇气,信心,毅力的同志根本不可能在不参考教程的情况下解决。。。。参考教程也需要毅力。。。。(最近Linux软件的配置安装都很少看类似的东西了,Windows下更加是很久很久没有听说过安装软件要看教程的了)

其实,VS版本的Qt难以配置使用应该来说有一部分是Nokia的因素,他们是故意设计难用的,因为他们有好用的Windows下的商业版本用来卖钱,其实这是奇怪的继承了奇趣的传统,奇趣需要这种手段赚钱,但是Nokia根本不会需要这点零头,Nokia需要是的极大的推广Qt,以获取开发人员对其移动平台的支持(支持塞班的Qt就要发布了)。。。。现在Gnome与GTK+声势已经盖过KDE+Qt了,但是Nokia却仍然不肯放弃那古老的传统,这是我不能理解的。

原创文章作者保留版权 转载请注明原作者 并给出链接

write by 九天雁翎(JTianLing) -- www.jtianling.com

阅读全文....

OpenGL in Qt


OpenGL in Qt

write by 九天雁翎(JTianLing) -- www.jtianling.com

讨论新闻组及文件

    Qt还是本人可移植GUI程序开发的首选,不过Qt开发普通的应用程序是行,但是据说效率太低,以至于像某些人说的那种刷新看得到一条条横线?这点我比较纳闷,就我使用的感觉,虽然Qt不以效率著称,但是事实上有足够的优化,最最典型的就是默认的图形双缓冲,按照Windows下的编程惯例是需要手动开启,并通过额外的接口调用才能使用的,这一点在以前简单图形编程学习时比较过Qt,Win32 GDI时感受特别深刻,在没有额外处理的时候,Win32动画程序那个闪阿,而Qt程序非常稳定。事实上,我想,Qt的其他问题比效率严重多了,比如个人感觉Qt程序在Windows下刷新的感知明显没有Windows原生程序快,这点倒是值得改进。

    学习OpenGL很久了,也是时候在Qt的框架下感受一下OpenGL了,这也是学习OpenGL的好处,学习D3D的话就没有这么Happy了,事实上这也导致我老实东学西学-_-!真不知是好是坏。。。只是作为程序员的感觉,要是世界只剩下Windows,那么实在失去了太多的色彩。

    以下的代码全部在Kubuntu9.04环境下运行,在Eclipse IDE + CDT 6.0 + gcc 4.3.3 + qt4Eclipse插件 下编译运行

    我现在是在用笔记本工作,并且笔记本没有支持3D加速的显卡。。。但是,还好,Linux可以使用Mesa在显卡不支持的时候可以自动启用软件模拟,支持的时候自动启用硬件加速。
   

Qt中的OpenGL框架

    Qt可以说是对OpenGL有直接支持的,提供了QGLWidget类来绘制OpenGL,并且一如Qt既往的面向对象封装方式。下面是一个最简单的程序,一如《Win32 OpenGL编程(3) 基本图元(点,直线,多边形)的绘制》中的Hello World例子。
    

OpenGL.h

 

#ifndef OPENGL_H
#define OPENGL_H

#include
#include
#include "ui_opengl.h"

class OpenGL : public QGLWidget
{
    Q_OBJECT

public:
    OpenGL(QGLWidget *parent = 0);
    ~OpenGL();

    void initializeGL();
    void resizeGL(int width, int height);
    void paintGL();

private:
    void draw();

private:
    Ui::OpenGLClass ui;
};

#endif // OPENGL_H

 

OpenGL.cpp

#include "opengl.h"

OpenGL::OpenGL(QGLWidget *parent)
    : QGLWidget(parent)
{
    ui.setupUi(this);
}

OpenGL::~OpenGL()
{

}

void OpenGL::initializeGL()
{

}

void OpenGL::resizeGL(int, int)
{

}

void OpenGL::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT);
    draw();
}

void OpenGL::draw()
{
    glColor3f (1.0, 1.0, 1.0);
    glBegin(GL_POLYGON);
    glVertex3f (-0.5, -0.5, 0.0);
    glVertex3f ( 0.5, -0.5, 0.0);
    glVertex3f ( 0.5,  0.5, 0.0);
    glVertex3f (-0.5,  0.5, 0.0);
    glEnd();
}

    这样就完成了一个利用OpenGL绘制矩形的任务,paintGL中调用的完全是普通的OpenGL函数,一如我们学过的普通OpenGL函数,没有区别。其中最主要的代码就在OpenGL::paintGL()中,这一点需要额外注意,那就是此处与普通的Qt程序是不同的,普通的Qt程序将重绘的工作放在paintEvent中进行,但是,可以想像的是,其实paintGL不过是QGLWidget中paintEvent中调用的一个虚接口,Qt可以在外面做好足够的OpenGL准备工作。initializeGL,resizeGL,paintGL 3个额外的虚接口就构成了一个简单但是强大的OpenGL框架,一如GLUT抽象出的框架及我在Win32 OpenGL学习时建立的框架一样,知道这些以后,可以将OpenGL在Qt中的编程分成两个部分,一个部分就是由initializeGL,resizeGL,paintGL三个虚接口构成的OpenGL的领域,我们可以在其中进行我们习惯的OpenGL操作,而程序的输入等其他GUI相关的处理则还是交由Qt原来的框架去完成。

 

OpenGL从Win32到Qt

    为了说明Qt中对于OpenGL处理的抽象,我将原来在《Win32 OpenGL编程(5) 顶点数组》一文中实现的一个较复杂的例子移植到Qt中。

 

其实基本上做做copy和paste的操作就OK了。

void OpenGL::initializeGL()
{
    glClearColor(0.0, 0.0, 0.0, 0.0);
    // 启用顶点数组
    glEnableClientState(GL_VERTEX_ARRAY);

    // 颜色数组也需要启用
    glEnableClientState(GL_COLOR_ARRAY);

    // 默认就是此参数,可忽略,为了明确说明特意指定
    glShadeModel(GL_SHADE_MODEL);

    // 顶点数组数据
    static GLfloat fVertices[] = {    -0.5, -0.5,
                                     0.5, -0.5,
                                     0.5,  0.5,
                                    -0.5,  0.5,
                                     0.0,  0.0};    // 添加的原点

    // 颜色数组
    static GLfloat fColor[] = { 1.0, 0.0, 0.0,
                                0.0, 1.0, 0.0,
                                0.0, 0.0, 1.0,
                                0.0, 0.0, 0.0,
                                1.0, 1.0, 1.0};        // 原点颜色为白色

    // 指定顶点数组数据
    glVertexPointer(2, GL_FLOAT, 0, fVertices);

    // 制定颜色数组
    glColorPointer(3, GL_FLOAT, 0, fColor);

}

void OpenGL::resizeGL(int, int)
{

}

void OpenGL::paintGL()
{
    draw();
}

void OpenGL::draw()
{
    glClear(GL_COLOR_BUFFER_BIT);    // 清空颜色缓冲区

    static GLubyte byTopIndices[] = { 2, 3, 4};
    static GLubyte byLeftIndices[] = { 3, 0, 4};
    static GLubyte byBottomIndices[] = { 0, 1, 4};
    static GLubyte byRightIndices[] = { 1, 2, 4};

    // 上述函数调用与下面的效果一样
    glPushMatrix();
    glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_BYTE, byTopIndices);
    glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_BYTE, byLeftIndices);
    glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_BYTE, byBottomIndices);
    glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_BYTE, byRightIndices);
    glPopMatrix();

}

 

效果如下图:

 

这也可以看做是抽象的强大之处,经过同样的抽象,OpenGL代码放在Qt中与放在Win32中,放在GLUT中其实都没有什么两样。但是,最重要的是,上面这段代码可以在Windows下面编译运行,而反过来却不行-_-!
完整的源代码放在博客源代码的2009-10-20/OpenGL中,但是这个源代码可不是VS2008的了,是Eclipse的工程管理的,当然不用Eclipse直接使用makefile编译也行。全文用在Kubuntu中用Google Docs编辑发布,希望格式不会乱。

 

完整源代码获取说明

由于篇幅限制,本文一般仅贴出代码的主要关心的部分,代码带工程(或者makefile)完整版(如果有的话)都能用Mercurial在Google Code中下载。文章以博文发表的日期分目录存放,请直接使用Mercurial克隆下库:

https://blog-sample-code.jtianling.googlecode.com/hg/

Mercurial使用方法见《分布式的,新一代版本控制系统Mercurial的介绍及简要入门

要是仅仅想浏览全部代码也可以直接到google code上去看,在下面的地址:

http://code.google.com/p/jtianling/source/browse?repo=blog-sample-code

原创文章作者保留版权 转载请注明原作者 并给出链接

write by 九天雁翎(JTianLing) -- www.jtianling.com

 



阅读全文....

Windows Live Writer试用及众多插件试用评测

write by 九天雁翎(JTianLing) -- www.jtianling.com

讨论新闻组及文件

     一直比较被CSDN的博客系统所折磨,很多东西一直不太好用,在线编辑功能有多么不好用就不多数了,当年手一滑还可能在页面跳转时丢失全文,现在这点有所改善,在切换页面时有提醒,但是贴图片的操作还是如此的复杂,默认宽度还是无法调节,在我的1440*900的显示器上就像在800*600上编辑一样,让人崩溃。离线编辑明显还是更安全,更方便,也能在本地保存一份,所以使用上了Word2007,Word2007附带有博客发表功能,编辑功能足够的强大,贴图片更加方便了,但是可惜通过Word2007发表后的博文总是会格式不对,最气人的就是格式离谱到标题2比标题1要大,C++语言的#include <xxx>永远被解析,然后变成#include空气,也没有办法预览效果,直接编辑发布后的HTML。导致我非常郁闷,只能先通过,后来与CSDN负责人的工作人员联系了一下,他推荐我使用Windows Live Writer(以下简称WLW),我就试用了一下,感觉编辑功能太过简陋,首先复制粘贴会丢失格式,那么就没有办法直接粘贴代码附带颜色和格式了,并且不能自定义格式模板,即将段落,标题的格式改成自定义的,还不能通过模板新建文章,因为以上缺点,直接放弃了WLW。后来在网上看到有人说WLW是世界上最好的博客编写发布软件,甚至在Linux下他也是通过Wine去运行WLW写博客,我才准备回过头来确认一下,WLW真的有这么好吗?网上搜索了一下这几个缺陷,既然WLW支持插件系统,希望有插件可以解决问题吧,我将http://gallery.live.com/上感觉可能有用的插件全部下载回来,逐一尝试,顺便公布一下结果,免得大家做重复工作。以下是我下载回来的插件:

2009-10-17 15-33-31 wlwplugins 2009-10-17 16-04-22 wlwpluginsinsert

 

作为程序员的技术博客,插入代码没有高亮的问题首先是肯定要解决的,以下以一段OpenGL相关的C++程序片段为例,其中包含了#include,宏定义,函数定义,中文注释等,展示全部效果给大家看,

相关插件很多:

CodeSnippet

界面,配置选项非常多,感觉不错。还可选择silent模式,以后直接从剪贴板中按照原来的配置添上代码,简洁明快,很好,就是目前没有发现怎么关闭silent模式-_-!

最后在Documents and Settings/<用户名>/Application Data/Leo Vildosola/Code Snippet plugin for Windows Live Writer下找到了其配置文件CodeSnippet.dll.config,编辑RunSilent为false如下后修复。

<RunSilent>false</RunSilent>

2009-10-17 16-05-42 code Snippet 

实际代码出现效果,可配置,可用容器显示滚动条效果以限制源代码所占篇幅(可惜高度不可以通过GUI方便的调节),格式正常,颜色漂亮,支持中文。感觉不错。有个缺点就是不是用容器的时候无法一次选择然后配置。

   1:  
   2: // OpenGL需要的头文件
   3: #include <GL/glew.h>
   4: #include <GL/glut.h>
   5:  
   6: //定义程序链接时所需要调用的OpenGL程序库,简化工程配置
   7: #pragma comment( lib, "glu32.lib" )  
   8: #pragma comment( lib, "glut32.lib" )  
   9:  
  10: // DEFINES ////////////////////////////////////////////////
  11:  
  12: // MACROS /////////////////////////////////////////////////
  13:  
  14: #define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)
  15: #define KEYUP(vk_code)   ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)
  16:  
  17: // GLOBALS ////////////////////////////////////////////////
  18: HWND      ghWnd; // 窗口句柄
  19: HINSTANCE ghInstance; // 程序实例句柄
  20:  
  21: #define FRAME_PER_SECOND (30)
  22: #define TIME_IN_FRAME (1000/FRAME_PER_SECOND)
  23: #define CIRCLE_POINTS (100)
  24: #define PI (3.1415926535898)
  25:  
  26: // 取消 OpenGL ,在程序结束前调用,释放渲染环境,设备环境以及最终窗口句柄。
  27: void DisableOpenGL()
  28: {
  29:     wglMakeCurrent( NULL, NULL );
  30:     wglDeleteContext( ghRC );
  31:     ReleaseDC( ghWnd, ghDC );
  32: }
  33:  
 
   1: // OpenGL需要的头文件
   2: #include <GL/glew.h>
   3: #include <GL/glut.h>
   4:  
   5: //定义程序链接时所需要调用的OpenGL程序库,简化工程配置
   6: #pragma comment( lib, "glu32.lib" )  
   7: #pragma comment( lib, "glut32.lib" )  
   8:  
   9: // DEFINES ////////////////////////////////////////////////
  10:  
  11: // MACROS /////////////////////////////////////////////////
  12:  
  13: #define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)
  14: #define KEYUP(vk_code)   ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)
  15:  
  16: // GLOBALS ////////////////////////////////////////////////
  17: HWND      ghWnd; // 窗口句柄
  18: HINSTANCE ghInstance; // 程序实例句柄
  19:  
  20: #define FRAME_PER_SECOND (30)
  21: #define TIME_IN_FRAME (1000/FRAME_PER_SECOND)
  22: #define CIRCLE_POINTS (100)
  23: #define PI (3.1415926535898)
  24:  
  25: // 取消 OpenGL ,在程序结束前调用,释放渲染环境,设备环境以及最终窗口句柄。
  26: void DisableOpenGL()
  27: {
  28:     wglMakeCurrent( NULL, NULL );
  29:     wglDeleteContext( ghRC );
  30:     ReleaseDC( ghWnd, ghDC );
  31: }

 

Paste As VS Code

界面如下,选项还算比较丰富,但是明显没有CodeSnippet

2009-10-17 16-21-38pasteasVScode

代码效果还行,并且可以一次选中然后进一步配置,就是对中文支持有些问题,可惜了。还有标题栏可以选择显示,就是不能编辑,奇怪的设置。

  1.  
  2. // OpenGL??的头文件
  3. #include <GL/glew.h>
  4. #include <GL/glut.h>
  5.  
  6. //定义程序?接时所???用的OpenGL程序库,简化工程?置
  7. #pragma comment( lib, "glu32.lib" 
  8. #pragma comment( lib, "glut32.lib" 
  9.  
  10. // DEFINES ////////////////////////////////////////////////
  11.  
  12. // MACROS /////////////////////////////////////////////////
  13.  
  14. #define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)
  15. #define KEYUP(vk_code)   ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)
  16.  
  17. // GLOBALS ////////////////////////////////////////////////
  18. HWND      ghWnd; // 窗口句柄
  19. HINSTANCE ghInstance; // 程序实例句柄
  20.  
  21. #define FRAME_PER_SECOND (30)
  22. #define TIME_IN_FRAME (1000/FRAME_PER_SECOND)
  23. #define CIRCLE_POINTS (100)
  24. #define PI (3.1415926535898)
  25.  
  26. // 取消 OpenGL ?在程序结束前?用??放渲染环境??备环境以及最终窗口句柄。
  27. void DisableOpenGL()
  28. {
  29.     wglMakeCurrent( NULL, NULL );
  30.     wglDeleteContext( ghRC );
  31.     ReleaseDC( ghWnd, ghDC );
  32. }

 

Source Code Formater:

界面,很大,感觉不错,虽然配置选项其实不多,也可选择box格式,不过效果一般。

2009-10-17 17-01-34sourcecodeformatter

全文格式效果一般,颜色明显没有Code Snippet丰富,而且代码行间距实在太大,还无法配置.


  1: 
  2: // OpenGL需要的头文件
  3: #include <GL/glew.h>
  4: #include <GL/glut.h>
  5: 
  6: //定义程序链接时所需要调用的OpenGL程序库,简化工程配置
  7: #pragma comment( lib, "glu32.lib" )  
  8: #pragma comment( lib, "glut32.lib" )  
  9: 
 10: // DEFINES ////////////////////////////////////////////////
 11: 
 12: // MACROS /////////////////////////////////////////////////
 13: 
 14: #define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)
 15: #define KEYUP(vk_code)   ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)
 16: 
 17: // GLOBALS ////////////////////////////////////////////////
 18: HWND      ghWnd; // 窗口句柄
 19: HINSTANCE ghInstance; // 程序实例句柄
 20: 
 21: #define FRAME_PER_SECOND (30)
 22: #define TIME_IN_FRAME (1000/FRAME_PER_SECOND)
 23: #define CIRCLE_POINTS (100)
 24: #define PI (3.1415926535898)
 25: 
 26: // 取消 OpenGL ,在程序结束前调用,释放渲染环境,设备环境以及最终窗口句柄。
 27: void DisableOpenGL()
 28: {
 29:     wglMakeCurrent( NULL, NULL );
 30:     wglDeleteContext( ghRC );
 31:     ReleaseDC( ghWnd, ghDC );
 32: }
 33: 
 34: 

 

一个syntaxhighlighter

似乎要和Windows的博客空间相匹配,而且配置界面感觉很简陋,在我的机器上以insert就崩溃

2009-10-17 17-10-19 Syntax Highlighter

 

另一个Syntax Highlighter

界面简陋

2009-10-17 17-18-36 syntax highlighted

颜色还不错,但是不支持中文,一票否决.

// OpenGLÐèÒªµÄÍ·Îļþ
#include <GL/glew.h>
#include <GL/glut.h>

//¶¨Òå³ÌÐòÁ´½ÓʱËùÐèÒªµ÷ÓõÄOpenGL³ÌÐò¿â,¼ò»¯¹¤³ÌÅäÖÃ
#pragma comment( lib, "glu32.lib" )  
#pragma comment( lib, "glut32.lib" )  

// DEFINES ////////////////////////////////////////////////

// MACROS /////////////////////////////////////////////////

#define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)
#define KEYUP(vk_code)   ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)

// GLOBALS ////////////////////////////////////////////////
HWND      ghWnd; // ´°¿Ú¾ä±ú
HINSTANCE ghInstance; // ³ÌÐòʵÀý¾ä±ú

#define FRAME_PER_SECOND (30)
#define TIME_IN_FRAME (1000/FRAME_PER_SECOND)
#define CIRCLE_POINTS (100)
#define PI (3.1415926535898)

// È¡Ïû OpenGL £¬ÔÚ³ÌÐò½áÊøÇ°µ÷Óã¬ÊÍ·ÅäÖȾ»·¾³£¬É豸»·¾³ÒÔ¼°×îÖÕ´°¿Ú¾ä±ú¡£
void DisableOpenGL()
{
	wglMakeCurrent( NULL, NULL );
	wglDeleteContext( ghRC );
	ReleaseDC( ghWnd, ghDC );
}

还有一个syntax highter,需求真是大啊,软件如此多。可

2009-10-17 17-27-22 syntax highlighted edit

名不符实,根本没有高亮,仅仅只有缩进。但是可以一次选中然后配置,这点比较好。支持中文。

// OpenGL需要的头文件
#include <GL/glew.h>
#include <GL/glut.h>

//定义程序链接时所需要调用的OpenGL程序库,简化工程配置
#pragma comment( lib, "glu32.lib" )  
#pragma comment( lib, "glut32.lib" )  

// DEFINES ////////////////////////////////////////////////

// MACROS /////////////////////////////////////////////////

#define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)
#define KEYUP(vk_code)   ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)

// GLOBALS ////////////////////////////////////////////////
HWND      ghWnd; // 窗口句柄
HINSTANCE ghInstance; // 程序实例句柄

#define FRAME_PER_SECOND (30)
#define TIME_IN_FRAME (1000/FRAME_PER_SECOND)
#define CIRCLE_POINTS (100)
#define PI (3.1415926535898)

// 取消 OpenGL ,在程序结束前调用,释放渲染环境,设备环境以及最终窗口句柄。
void DisableOpenGL()
{
	wglMakeCurrent( NULL, NULL );
	wglDeleteContext( ghRC );
	ReleaseDC( ghWnd, ghDC );
}

Paste from Visual Studio

完美复制visual studio的代码,从其他地方拷贝过来的无效,无界面配置。用途单一。

// OpenGL需要的头文件
#include <GL/glew.h>
#include <GL/glut.h>

//定义程序链接时所需要调用的OpenGL程序库,简化工程配置
#pragma comment( lib, "glu32.lib" )  
#pragma comment( lib, "glut32.lib" )  

// DEFINES ////////////////////////////////////////////////

// MACROS /////////////////////////////////////////////////

#define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)
#define KEYUP(vk_code)   ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)

// GLOBALS ////////////////////////////////////////////////
HWND      ghWnd; // 窗口句柄
HINSTANCE ghInstance; // 程序实例句柄

#define FRAME_PER_SECOND (30)
#define TIME_IN_FRAME (1000/FRAME_PER_SECOND)
#define CIRCLE_POINTS (100)
#define PI (3.1415926535898)

// 取消 OpenGL ,在程序结束前调用,释放渲染环境,设备环境以及最终窗口句柄。
void DisableOpenGL()
{
    wglMakeCurrent( NULL, NULL );
    wglDeleteContext( ghRC );
    ReleaseDC( ghWnd, ghDC );
}

代码及语法高亮插件小结

没有感觉完美的插件,相对来说不支持中文的我们不考虑了,不支持C++的我不考虑了,最后结论是仅仅使用VS的人可以考虑Paste from Visual Studio,够用就行,不然CodeSnippet是最佳选择,比那么多的syntax highlighter都要好用,Source Code Formater可以作为第二选择,相对来说显示效果没有CodeSnippet好,配置选项没有那么丰富。

其他插件:

MSDN Link

感觉不错,作用也很好,说是能很方便的查找添加MSDN的关键字链接,可是我连查wglMakeCurrent,wglDeleteContext,ReleaseDC都不存在,然后查了个简单的abs都查不到,有可能是网络问题,但是现在我网络状况很好,可惜了。

 2009-10-17 17-45-08locateurlatmsdn

 

from console

将控制台中复制的东西插入,因为我常用putty登录linux,然后展示命令行的东西,所以对我个人也很实用,也许一般人没有什么用吧。Windows的命令行甚至可以显示命令高亮-_-!功能强大,好用,虽然没有任何配置的办法。

Windows:

C:/>dir/w
 驱动器 C 中的卷没有标签。
 卷的序列号是 6854-7E94

 C:/ 的目录

AnalysisLog.sr0          AUTOEXEC.BAT             CONFIG.SYS
[Documents and Settings] [Download]               [Downloads]
[ppt]                    [Program Files]          [TDDOWNLOAD]
[Temp]                   [WINDOWS]
               3 个文件        419,464 字节
               8 个目录  1,806,254,080 可用字节

C:/>

Linux:

jtianling@jtianling-laptop:~$ ls -l | head -n 5
总用量 20772
-rwxrw-r--  1 jtianling jtianling     1570 2008-10-26 16:59 1
-rwxrw-r--  1 jtianling jtianling       11 2009-08-21 17:25 1.bat
-rwxrw-r--  1 jtianling jtianling       80 2008-11-12 23:45 allhead
-rw-r--r--  1 jtianling jtianling        0 2009-08-29 12:37 a.out
jtianling@jtianling-laptop:~$ 

 

Rich Editor

有点像代码高亮的插件,但是仅支持C#和VB.net,还不支持中文,图都不想贴。

 

SnagIt Screen Capture

能将抓的图直接粘贴到WLW中,甚至不保存,节省大量时间,强烈推荐使用,首先要安装SnagIt。有一点问题就是配置太少无法抓WLW本身的图,医者不自医?-_-!

image

 

WikiPedia Link

直接插入关键字在Wiki的链接,相对来说,由于Wiki的目录设置,其直接通过字符串生成了Wiki的链接,甚至没有查看一下链接是否存在,这点比较郁闷,但是总的来说还是值得一用。比如右边,C++,就是用此插件插入的,当肯定链接存在时不妨一用。

 

Word Count

原以为WLW中没有统计字数的功能,后来我发现本来就有,那还要这个干啥?还要求先选中全文-_-!无语了。

 

Text Template

有点类似VA的Snippets功能,保存文本的模板,可惜的是不能将全部格式保留下来,所以将范围限制在了最最简单的文字,有点可惜。

 

总结

以上就是我使用过的插件,感觉Windows Live Writer本身可能不是太好用,但是没有关系,有了这些插件后,就好用多了,对于我来说,特别重要的是语法高亮的插件,这也算是开放的一个好处吧,希望微软多多开放,就像VS及WLW走的路一样。

本文因为操作Windows live Writer失误,被新的文章覆盖,通过Google cache奇迹般地找回,感谢Google-_-!

原创文章作者保留版权 转载请注明原作者 并给出链接

write by 九天雁翎(JTianLing) -- www.jtianling.com

 



阅读全文....

Linux下的blog writer -- bilobo测试


bilbo 测试成功,Linux总算有办法可以发点东西了!!!

原来在Linux下是通过FireFox发的,但是CSDN对Firefox的支持有问题,在线编辑会丢失格式,更严重的是FireFox提交的文章只能用FireFox才能看到,害得当时我一批文章全部重新发表了一次,不知道现在好了没有,总之我是没有再敢用FireFox发表文章了。

最近总算在KDE下找到了blog writer了!

bilbo虽然不算太好用,分类取不会来,最近文章取不回来,不能设置文章发表的分类,还有如下代码不好贴的问题。。。。。。但是起码,当我想突然看到某个东西想转载的时候,不用再切换到Windows下了。

bilbo是KDE下的离线博客写作工具,主页是:http://bilbo.gnufolks.org/

ubuntu可以在这里下载:https://launchpad.net/~neversfelde/+archive/ppa/+packages

贴代码测试:

#include <GL/glut.h>

#include <stdlib.h>

void display(void)

{

/* clear all pixels */

glClear (GL_COLOR_BUFFER_BIT);

/* draw white polygon (rectangle) with corners at

* (0.25, 0.25, 0.0) and (0.75, 0.75, 0.0)

*/

glColor3f (1.0, 1.0, 1.0);

glBegin(GL_POLYGON);

glVertex3f (0.25, 0.25, 0.0);

glVertex3f (0.75, 0.25, 0.0);

glVertex3f (0.75, 0.75, 0.0);

glVertex3f (0.25, 0.75, 0.0);

glEnd();

/* don't wait!

* start processing buffered OpenGL routines

*/

glFlush ();

}

void init (void)

{

/* select clearing color */

glClearColor (0.0, 0.0, 0.0, 0.0);

/* initialize viewing values */

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);

}

测试结果:格式丢失,颜色丢失,使用bilobo的代码标记工程无效。


试着贴个图

格式测试成功,大小正常,不会像Word2007一样乱掉。

测试结果:完全成功。

阅读全文....

VS2008中自定义C++工程模板与修改新建文件默认编码的办法

VS2008中自定义C++工程模板与修改新建文件默认编码的办法

write by 九天雁翎(JTianLing) -- www.jtianling.com

讨论新闻组及文件

一、   需求

网上讲VS(以下VS均特指VS2008)自定义模板的不少,不过大部分都是讲C#或者Web开发的,什么export template的,都不适合C++工程,由于MS的确是减弱了对C++的支持,(这点没有人否认吧?)所以在VSC++总是被遗忘在那个没有人理睬的角落,所以现在很多人宁愿还用着C++MFC最辉煌的版本VC6.0,哪怕那个版本的C++这么不符合标准。。。。。既然MS不关心C++使用者,那就只有自己奋发图强罗,还好再怎么样,没有了VS,我们总还是有VIM+G+++GDB/Emacs的,没有了MFC我们还有QtGTK+的,何况个人用EclipseLinux下做Qt程序的感觉也不错,闲话不说了,看看正题。

自定义工程模板是用途很大的,当你有一个简单的模板用于开发的时候,没有VS内部的支持时,你有两种办法,其一你将原有整个工程拷贝一份,然后改工程名(在我以前的公司就是这样干的),改名不说,要进VSS,还得改工程的GUID(不懂的就算了),其二是新建一个工程,然后一个一个添加文件,假如有自己的目录结构的时候,还得重新控制目录结构,工程大时也是异常麻烦,其实这些用上了VS自定义模板,一切都可以很简单,就像你进行Win32 SDKMFC开发MS给你的模板一样。

修改VS中新建文件的默认编码嘛,纯Windows人士请忽略,我是因为需要在Linux下编辑和查看这些文件才有此需求。事实上,即使想要在Linux下查看或者编辑这些代码也可以不做改变,但是我就是想将其全部改成UTF8,不喜欢将Linux下设置一大堆东西,gcc需要加gb2312的选项,vim需要加配置,Eclipse也需要改配置,其他文本编辑工具也需要选定编码,全部是因为VS在中文Windows下的默认编码是gb2312(我用的是英文VS2008,这个可能是跟着操作系统环境走的),虽然也不怪MS。。。。既然VS也支持UTF8,就让Windows迁就Linux了。。。。还需要迁就的是Linux下的换行与Windows不同,顺便一起解决了,虽然大部分时候,在公司,都是用Linux的东西来迁就Windows。修改默认编码的办法我在网上找了很久也没有找到,大部分人都说是直接用Advanced Save Option来选择保存,那样多麻烦啊,或者先建立工程以后用find批量改,那样也不见的简单啊。。。。。。。。看下面的解决办法。

 

二、   解决办法

1.      新建文件

奥秘在Microsoft Visual Studio 9.0/VC/vcprojectitems中(Microsoft Visual Studio 9.0根据你安装目录而定)

新建的C++文件,主要是newc++file.cpp这个文件,目前是空的,你将其改成什么样,那就是什么样,比如,我需要在每个文件的头部添加一大串的GPL说明,(不是我想,这是FSF规定的),那么就直接在此文件添加我的文件头即可,以后用add->add new item->C++ files时,就都会自动带着文件头出来了。。。更好用的是,我现在将此文件转为UTF8+Unix换行格式,那么以后新建的文件都是如此了。。。呵呵,此谓之一劳永逸。

新建的头文件是hfile.h这个文件,如上更改,一劳永逸。事实上,我将上面的文件复制一份,重命名为hfile.h^^

普通文本文件由于常做Readme用,也改了。是text.txt这个文件。

 

2.      授人以鱼不如授人以渔

我当然不是一个一个文件试出来的,也不是猜出来的,授人以鱼不如授人以渔,这里告诉大家怎么去自己摸索。上述三个文件有个共同特点,那就是可以通过右键add->new item,那么我首先查看的就是new item了,这里,我的Visual C++下的下面有UICodeDataResourceWebUtilityProperty Sheets7个选项,与Microsoft Visual Studio 9.0/VC/vcprojectitems下面的7个目录及目录名一一对应,很明显了,这些选项由此7个目录中的内容控制的,首先看Code目录,一个code.vsdir的文件,打开一看

 ../NewC++File.cpp|{1B027A40-8F43-11D0-8D11-00A0C91BC942}|#1075|10|#1076|{1B027A40-8F43-11D0-8D11-00A0C91BC942}|9031|4096|#1077

../HFile.h|{1B027A40-8F43-11D0-8D11-00A0C91BC942}|#1078|15|#1079|{1B027A40-8F43-11D0-8D11-00A0C91BC942}|9030|4096|#1080

../IDLFile.idl|{1B027A40-8F43-11D0-8D11-00A0C91BC942}|#1084|20|#1085|{1B027A40-8F43-11D0-8D11-00A0C91BC942}|9035|4096|#1086

../DEFFile.vsz|{1B027A40-8F43-11D0-8D11-00A0C91BC942}|#1087|35|#1088|{1B027A40-8F43-11D0-8D11-00A0C91BC942}|9036|4096|#1089

../addmc++componentclass.vsz|{1B027A40-8F43-11D0-8D11-00A0C91BC942}|#1236|85|#1237|{1B027A40-8F43-11D0-8D11-00A0C91BC942}|9563|4096|#1238

../installer.vsz|{1B027A40-8F43-11D0-8D11-00A0C91BC942}|#1245|85|#1246|{1B027A40-8F43-11D0-8D11-00A0C91BC942}|9564|4096|#1247

咋一看,乱码?2进制文件?的确像,再仔细看看,前面的一部分,那不就是菜单中有的Items项?一一对应的。再仔细看,发现其实前面的字符串都是一个目录,指向父目录下的各个文件,其中前面两个就是.. /NewC++File.cpp.. /HFile.h两个文件,那就是上一节中我发现的两个文件,对应新添加的C++文件和头文件。vsdir后面的东西是更详细的说明,长串的{}GUID#xxx是通过ID来表示资源。但是这里我们不去详细了解了,想要详细了解的参看MSDN这里,同理,文本文件在Utility目录下的VCUtilityItems.vsdir制定的,我就不多说了。

 

3.      自定义工程模板

新建工程中有个Custom Wizard选项,我将其命名为Win32OpenGLWizard。建立以后是一个完整的Wizard工程,天哪,一看,真复杂,我仅仅想建立一个简单的C++工程嘛,至于这样复杂吗?很显然,MS设计VS的自定义模板的时候就是给其他软件开发商用的,根本没有考虑过个人使用-_-!因为其中包含了HTML,CSS,JS….并不是每个人都是做网页的**。。。。作为用C++的我们,就知道想办法摸索摸索罗,符合我们的要求就好。要将引导框设计的多么完美我个人是没有什么希望了。所以建立Win32OpenGLWizard工程时,用户的UI选择就不需要了吧,直接通过名字就好。

首先利用刚才新建的Wizard去建立一个工程,(会出现在New ProjectWizard下,实际的文件放在 我的文档/Visual Studio 2008/Wizards中)发现我们主要关注的是Template Files下的两个文件,那就是生成后工程会包含的文件。尝试一下。

template Files下添加main.cpp,修改Readme.txt,删除sample.txt,实际操作时请将文件添加到/Templates/1033目录下面去,并且手动修改Templates.inf添加进main.cpp。新建工程后果然可行。

 

4.      修改自定义工程模板

有个问题是Readme.txtSource File目录下,而main.cpp跑到Source Files外面去了。作为半个完美主义者,虽然工程已经能编译通过,但是还是有点不爽,我希望进一步改进,那么下一步看看Source Files是哪里规定的罗,在default.js中可以看到

function AddFilters(proj)

{

       try

       {

              // Add the folders to your project

              var strSrcFilter = wizard.FindSymbol('SOURCE_FILTER');

              var group = proj.Object.AddFilter('Source Files');

              group.Filter = strSrcFilter;

       }

       catch(e)

       {

              throw e;

       }

}

此函数,已经明白一半了,此函数不就是寻找匹配的过滤文字,然后将其加入Source Files中去嘛。^^就看SOURCE_FILTER是什么symbo

这里分两种情况:

wizard UI

假如没有添加Wizards UI可以在添加的wizard工程下看到一个vsz文件,我这里如下:

VSWIZARD 7.0

Wizard=VsWizard.VsWizardEngine.9.0

 

Param="WIZARD_NAME = Win32OpenGL"

Param="ABSOLUTE_PATH = D:/MyDocument/Visual Studio 2008/WizardTemplate/Win32OpenGL/Win32OpenGL"

Param="FALLBACK_LCID = 1033"

Param="WIZARD_UI = FALSE"

Param="SOURCE_FILTER = txt"

 

这就是一个简单的类INI文件,详细信息可以参考MSDN这里。我们关心的自然是SOURCE_FILTER参数,改成cpp,竟然没有效果,不知道其他人怎么样,我这里没有效果的原因不明。但是虽然不知道此js wizard.FindSymbol的实现方法,但是我们还是可以用暴力解决!呵呵,将上述js函数改成如下形式:

 function AddFilters(proj)

{

       try

       {

              // Add the folders to your project

              //var strSrcFilter = wizard.FindSymbol('SOURCE_FILTER');

              var strSrcFilter = 'cpp';

              var group = proj.Object.AddFilter('Source Files');

              group.Filter = strSrcFilter;

       }

       catch(e)

       {

              throw e;

       }

}

就好了。我得意的笑啊,我得意的笑^^对于MS奇怪的失灵,有的时候暴力也是必须的。

 

wizard UI

假如添加了UIMS就要考虑你在wizard UI中改变此Symbo的可能了,会在HTML/1033/default.htm这个UI管理文件下看到

<SYMBOL NAME='SOURCE_FILTER' TYPE=text VALUE='txt'></SYMBOL>

改之

<SYMBOL NAME='SOURCE_FILTER' TYPE=cpp VALUE='cpp'></SYMBOL>

有效。

再次创建工程,cpp文件已经在Source Files中了,ReadMe.txt也死出去了,以后再需要头文件什么的也一样处理就好了。

 

5.      接近完美

好了吗?已经很好了,但是作为3/4个完美主义者,我还有有点想改的地方,那就是我平时建工程,很简单的工程主文件与工程名一直,这样万一哪天想全部拷贝到一起管理也方便,但是按上述方式文件将全部是main.cpp,解决之,电脑上没有咋程序员解决不了的事情。

看上述js脚本,如下函数:

function GetTargetName(strName, strProjectName)

{

       try

       {

              // TODO: set the name of the rendered file based on the template filename

              var strTarget = strName;

 

              if (strName == 'readme.txt')

                     strTarget = 'ReadMe.txt';

 

              if (strName == 'sample.txt')

                     strTarget = 'Sample.txt';

 

              return strTarget;

       }

       catch(e)

       {

              throw e;

       }

}

 

再看看它的使用,就知道此处就是我们需要修改的地方,实际上MS已经考虑了这样的情况了,我们不需要暴力^^改成如下内容:

function GetTargetName(strName, strProjectName)

{

       try

       {

              // TODO: set the name of the rendered file based on the template filename

              var strTarget = strName;

 

              if (strName == 'readme.txt')

                     strTarget = 'ReadMe.txt';

 

              if (strName == 'main.cpp')

                     strTarget = strProjectName + ".cpp";

 

              return strTarget;

       }

       catch(e)

       {

              throw e;

       }

}

测试,OK

 

三、   后记

所有的说明,版权信息都在,文件内容,编码,换行符都搞定了,文件名也符合我的要求了,接近完美,鉴定完毕!

此过程发狂的得不到MSDN满篇.Net的帮助,又难领悟广大C#网民的旁敲侧击,独自在VS的漆黑中摸索,逢JS大山则开路,逢HTML大石则劈之,屡次撞壁,失败数回,叹MS之弃cpper至此,捶胸顿足,奋发自强,吐血三升,乃作此文,以兹纪念。

 

write by 九天雁翎(JTianLing) -- www.jtianling.com

 



阅读全文....

分布式的,新一代版本控制系统Mercurial的介绍及简要入门

分布式的,新一代版本控制系统Mercurial的介绍及简要入门

write by 九天雁翎(JTianLing) -- www.jtianling.com

讨论新闻组及文件

在经历了《版本控制系统(RCS)的选择与比较》后,选择了Mercurial下面给大家介绍一下Mercurial

一、   提要

本文以假设你已经了解基本的版本控制系统知识,知道诸如库,历史,提交等常见的概念,本文简要的说明了在Windows/Linux下的可用安装版本,在Google Code上建库,管理,修改,提交,取回的过程,基本上仅是平时开发需要的最基础的一些功能。(连merge都没有说)因为要掌握任何可用的版本管理系统的全部功能都是一个复杂的系统过程,本文并不期望能包含全部内容,仅仅希望作为一个对Mercurial的介绍及入门引导,并不对基本的版本控制概念进行过多的描述。想要进一步学习Mercurial的可以参考最后的参考资料,个人比较推荐用《Mercurial 使用教程》入门,然后需要的时候可以查看《Mercurial: The Definitive Guide》。

 

二、   介绍

Mercurial与一般传统的版本控制系统的最大区别在于分布式的概念。所谓分布式,就是指没有一个所谓的集中的中心(central)库,这个库一般由svn server(svn)vss administrator(vss)控制,而Mercurial就没有这样的一个库,所以使用版本控制的时候甚至都不需要一个administratorserver,本地直接建库,直接就使用,任何一个库都可以作为中心库,每个库在Mercurial看来都是平等的。当然,实际使用的时候,可以人为的去指定一个中心库以作为发布,但是,这里强调的是Mercurial本身不关心这个,对它来说都是一样的。Linus他在演讲的时候多次说集中式的版本控制系统没有前途,因此,Subversion的开发者想要开发一个更好的CVS其实是脑子出了毛病-_-!呵呵,实际上,他虽然说得比较过,但是分布式的版本控制的确是比集中式有很多优点。

首先,分布式最大的好处就是离线工作,不仅意味着可以不联网就享受版本控制的好处,并且也意味着普通的提交速度也要快的多,而且,以此带来的巨大灵活性甚至能改变你的工作方式,因为以前集中式的版本控制系统,每次提交都会影响到他人,以至于不能提交未经测试的版本,而使用分布式的版本控制系统时,你可以随时随地的本地提交,安全的保护自己的工作成果,以防意外,也能随时随地的本地clone,本地分支,本地就是一套完整的版本控制系统!直到修改到最终版本,然后才push(相当于集中式版本控制的commit)到真正的一个公用库上去。想到那当年作为一个新员工,每次提交代码都需要请示总监的日子。。。。那是多么痛苦的啊。。。。

其次,对于个人开发者来说,使用集中式版本控制系统的时候有没有想过,仅仅是一个人工作,为啥偏要建立一个中心库,然后每次将自己的代码提交到那上面去啊?自己本地一个副本,库还得有一个副本,也不环保嘛。呵呵,甚至,我以前还为此专门架设了自己的VSS服务和SVN服务器-_-!而用分布式的版本控制系统就没有那么麻烦了,本地建库,直接使用就好了^^只有用过后才知道原来一切都那么简单。。。。。。。。。。。。。并且,当你哪天想要将工作成果share出去的时候,也不麻烦,还是一条普通的push命令,就像远方的服务器一直搭建好了一样。

但是,其实目前来说,分布式的版本控制系统还是有一定缺陷的,比如权限控制的问题,这点可能因为Mercurial的用户群主要在于开源世界,所以没有太过重视,实际上对企业开发可能会比较重要,相对来说SVN,特别是VSS就要好的多。但是,事实上通过外部的手段进行权限的控制还是可行的(比如ssh的登录),只不过相对来说会复杂一点,这也算是个小缺陷了(可大可小)。然后Mercurial相比Git还有个缺点,那就是分支的时候不能对单独的子目录进行,一次clone就是一个工程,这样希望在一个大工程中对一个小项目进行分支,会比较麻烦,这点也算是比较大的缺点了,但是,上述缺点都不是分布式版本控制固有的,仅仅是目前Mercurial的实现的问题,相对来说,分布式和集中式这样工作方式上的区别才是最主要的,毕竟Mercurial还年轻,希望Mercurial将来的实现会更好^^

 

三、   安装

1.      Windows

Windows可使用的版本有3种,首先是官方的版本:http://mercurial.berkwood.com/ ,最新版是1.3.1

2009-08-08: Mercurial 1.3.1 - Release version

其次是可爱的乌龟,不过不叫TortoiseMercurial,而是Tortoisehg(因为Mercurial在命令行的命令是HG,不会有人喜欢Mercurial这样长的命令吧-_-),在http://bitbucket.org/tortoisehg/stable/wiki/download,找到下载地址,最新版是0.8.2 ,此外,此网址还有个中文的注册表文件zh_CN可以下,下载后直接打开,可以使的右键菜单的语言编程中文(但是设置中的语言还是E文,为了统一,建议还是用E文的比较好) (BTW:乌龟真是版本控制之王啊。。。。。。。。。从CVSSVNMercurialGit是无所不包啊。。。。。。)

最后,假如仅仅是使用VS工作的话,也有VS的集成版本,叫Mercurial SCC Package,在http://www.newsupaplex.pp.ru/hgscc_news_eng.html有最新的版本下载。

要说明的是,Mercurial遵循的是典型的Unix风格,即自己只做命令行功能,图形界面留给了别人做,所以官方版本仅仅只有命令行功能,TortoiseHg是在Windows下较好的一种,这里向大家推荐一下。实际上安装完TortoiseHg后,已经包含了完整的官方版本,毕竟,TortoiseHg仅仅是Mercurial的一个GUI前端而已。下载后,安装的流程就不多说了,无非就是下一步。。。。不会的话也不会想要使用这个软件了。(安装后,想使用中文的就再打开上面的中文菜单注册表文件。)      再然后,就可以在右键中看到菜单。

 

2.      Linux

对于官方版本来说,Ubuntu下利用

apt-get install mercurial

就行

Redhat就用yum吧,都有可用版本。不过在我的kubuntu9.04上安装的是1.01版本,实在太老了。

TortoiseHgLinux也可用(事实上,仔细观察一下Windows版本的TortoiseHg就知道,其实它本质上是个GTK程序-_-!

http://bitbucket.org/tortoisehg/stable/wiki/download还是能找到下载的地方:

Linux

Debian packages are coming soon.

Ubuntu packages can be found at: https://launchpad.net/~maxb/+archive/ppa or https://launchpad.net/~tortoisehg-ppa

Fedora RPM packages:

If no package yet exists for your platform, then use the source install method described on the hgtk page. Note that we do not suggest that you run from a tarball, even though we make one available for download. We prefer you use a local clone of TortoiseHg instead. If you do decide to use a tarball, you'll want to delete thgutil/config.py* to remove the hard-coded paths.

To use the settings tool on Linux, you must have http://code.google.com/p/iniparse/ installed.

不翻译了,这里说明一下。。。。。launchpad是出品ubuntu的公司建立的一个源代码host,上述链接上有介绍使用方法,基本上如同普通的程序一样,通过apt-get获取key,然后修改apt-get/etc/apt/下的source.list,添加进新的ppa的源(有3个),然后通过apt-get update更新一下源的信息,就可以直接通过apt-get install tortoisehg来下载了,这时下载的mercurial会是最新的1.3版本,而不是原来的1.01老版了。

我用的是kubuntu,没有用tortoisehg,因为那样要安装一整套的gtk库,用gnome的人就幸福了^^唉。。。这也是当年选择了Qt的后遗症啊。。。。。。。。。。

 

3.      Eclipse

Eclipse由于是Windows,Linux通用的,所谓单独放在这里了,呵呵,JAVA程序的这个优点还是挺吸引人的,说到这里感叹一下,JAVA程序员哪能理解学习了CreateProcess然后重新学习fork,execxxx,学习了CreateThread,然后学习pthread_create的痛苦啊。。。。。呵呵,这些都是题外话。另外,eclipse插件的管理,你得首先安装对应的原始官方版本。。。

Eclipse插件:http://www.vectrace.com/mercurialeclipse/

 

4.      检验安装

首先检验已经安装成功,可以查看一下官方的版本

Windows下:

E:/work>hg version

Mercurial Distributed SCM (version 1.3.1+1444a42f6052)

 

Copyright (C) 2005-2009 Matt Mackall <mpm@selenic.com> and others

This is free software; see the source for copying conditions. There is NO

warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

 

Linux下:

jtianling@jtianling-laptop:~$ hg version

分布式软件配置管理工具 - 水银 (版本 1.3.1)

 

版权所有 (C) 2005-2009 Matt Mackall <mpm@selenic.com> 和其他人。

这是自由软件,具体参见版权条款。这里没有任何担保,甚至没有适合

特定目的的隐含的担保。

 

呵呵,在通过ppa那个链接安装了新版后,竟然版权信息是中文的。。。。并且,Mercurial翻译成了水银,这点比较让人吐血。事实上Mercurial表示墨丘利。。。。。也就是希腊神话中的赫尔墨斯(Hermes)。。。。。。

WIKI的说明:

墨丘利(Mercurius)罗马神话中为众神传递信息的使者,相对应于希腊神话的赫耳墨斯Hermes)。他的形象一般是头戴一顶插有双翅的帽子,脚穿飞行鞋,手握魔杖,行走如飞。墨丘利是裘比特玛亚的儿子,是医药、旅行者、商人和小偷的保护神,西方药店经常用他的缠绕两条蛇的手杖作为标志。

此外,由于水星在天上运行的速度很快,所以亦用了他的名字而命名。

怎么说。。。。。。。。。。。我都觉得Matt Mackall原意是指墨丘利吧-_-!又扯远了。。。。。

 

说明安装成功。。。。。。。。。。。。。

 

四、   简要使用说明

因为在Windows下和在Linux下使用Mercurial是类似的(命令行嘛,能差别大到哪去),这里以Windows下的使用为例,之所以使用Windows为例而不是用Linux因为我用的是Word2007编辑所以复制结果比较方便,之所以用Word2007是因为拷贝到IE中的CSDN blog编辑框中比较方便,之所以用IE是因为CSDN blogFirefox的支持不好。。。。。。。。这里抱怨一下-_*!。。。。。

下面的小标题括号中的英文即是对应的Mercurial命令。

1.      帮助(help)

从上面的检验安装方法可以看出来,Mercurial的命令是Hg

首先,因为我不能将所有的命令都讲完,所以先告诉大家怎么用帮助^^,我果然很取巧-_-!

Mercurial有内建的帮助系统,参数是helphelp后还可以以需要查询的命令为参数。

比如:

E:/work>hg help init

hg init [-e CMD] [--remotecmd CMD] [DEST]

 

create a new repository in the given directory

 

    Initialize a new repository in the given directory. If the given

    directory does not exist, it will be created.

 

    If no directory is given, the current directory is used.

 

    It is possible to specify an ssh:// URL as the destination.

    See 'hg help urls' for more information.

 

options:

 

 -e --ssh        specify ssh command to use

    --remotecmd  specify hg command to run on the remote side

 

use "hg -v help init" to show global options

 

2.      建库(init)

上面的帮助内容,懂E文的的就看懂了,init就是Mercurial的建库命令,使用方法如此简单。比如我希望在E:/Work/Hello下建立一个我自己的库,只需要在e:/Work/Hello目录输入hg init如下:

E:/work/hello>hg init

 

E:/work/hello>

事实上,你看不到任何输出,但是通过dir查看的时候会发现多出的.hg目录(Linux因为是“.”开头,默认是隐藏的),而Windows下没有这个规矩,所以还是会显示出来。想起一个笑话,以前有个牛人说,为啥.Net.Net?因为在Linux下甚至都不会显示出来^^

这个时候一个你自己的Mercurial库就建好了:)

 

3.      克隆(clone)

事实上,我机器上还是保留了svn,因为我可以很方便的在sourceforgeGoogle code上下载别人的代码-_-!用的是svn co命令,事实上,大部分人用的最多的也就是这个命令了^^,在mercurial上将svnVSScheckout代码命令叫做克隆(clone),事实上也体现了不同的版本控制系统的管理哲学。集中库吗,需要的是检出(checkout)然后迁入(commit),而分布式呢,因为就没有集中库的概念,你需要做的是在一个人为指定的集中库上克隆一份,你自己的库也就是与服务器上的库一样的库(克隆的概念^^

首先看下帮助,(这里只贴上了第一行):

E:/work>hg help clone

hg clone [OPTION]... SOURCE [DEST]

hg clone 目标

       比如,以后我准备将代码都放在Google Code上共享,而Google CodeMercurial原生支持(哈雷路亚),所以,大家可以直接通过clone命令去随意克隆我的代码,我的博客sample代码存放的Mercurial的地址是

https://blog-sample-code.jtianling.googlecode.com/hg/

那么大家只需要通过如下命令就能下载回去我所有的Sample代码:(当然,Mercurial要是已经安装好的,并且在你想要下载的位置执行下列命令(google推荐的用法

hg clone https://blog-sample-code.jtianling.googlecode.com/hg/ jtianling-blog-sample-code

这样,就将我所有的blog sample代码全部clone到当前目录的jtianling-blog-sample-code目录下了。

如下所示:

E:/work/jtianling-blog-sample-code>dir/w

 驱动器 E 中的卷是 文档

 卷的序列号是 940C-1FF8

 E:/work/jtianling-blog-sample-code 的目录

[.]         [..]        [.hg]       [2009-9-25]

               0 个文件              0 字节

               4 个目录  3,043,004,416 可用字节

E:/work/jtianling-blog-sample-code>

目前仅仅有在E:/work/jtianling-blog-sample-code/2009-9-25/helloMercurial下添加进去的一个文本,helloMercurial.txt

好了,仅仅想学会怎么用Mercurial去享用别人代码的人可以放心的走了,一切很简单吧:)

 

4.      本地提交(commit

Mercurial也有commit,不过这里的commitVSS,SVN中的不同,这里的commit仅仅提交到本地,所以题目特意强调了一下,是本地的提交,这再一次的体现了命令反应哲学的问题^^。在Mercuria里面,你可以放心的commit,因为不会影响到别人。

比如,刚才我clone回来的文本helloMercurial.txt内容是:

Hello World

To Test Mercruail and Google Code

 

Create By JTianLing

我将其修改一下

Hello World

To Test Mercruail and Google Code

And Test Commit

Create By JTianLing

 

然后提交,命令如下:

E:/work/jtianling-blog-sample-code>hg commit

这个时候,在Windows下,直接弹出的是默认的文本编辑工具,我这里是记事本,有如下提示信息:

HG: Enter commit message.  Lines beginning with 'HG:' are removed.

HG: Leave message empty to abort commit.

HG: --

HG: user: JTianLing

HG: branch 'default'

HG: changed 2009-9-25/helloMercurial/helloMercurial.txt

 

告诉你输入提交的message,没有的话是会终止提交的,这也体现了一种好的软件版本管理哲学,每次提交都强制性的要求有说明的,VSS中由于可以忽略说明,所以事实上,我们公司是没有任何人提交带说明的,然后呢?碰到问题的时候就靠喊贝,反正在一个公司-_-!这里,我加入一行:

Add a Line to Test commit command

然后保存退出。这时候提交就已经完成了。

 

5.      记录(log)

怎么确认提交完成没有,怎么查看版本历史,用log命令,执行效果如下:

E:/work/jtianling-blog-sample-code>hg log

changeset:   1:88252aa4d260

tag:         tip

user:        JTianLing

date:        Fri Sep 25 12:27:01 2009 +0800

summary:     Add a Line to Test commit command

 

changeset:   0:baf69ca9684e

user:        JTianLing

date:        Fri Sep 25 12:00:01 2009 +0800

summary:     Create Project Blog

 

 

E:/work/jtianling-blog-sample-code>

 

可以看到我说明的Add a Line to Test commit command版本已经commit了。但是这个时候其实是不影响google上的任何东西的啊:)google上该是啥还是啥。

 

6.      版本同步(push,pull

当我真的需要将修改提交到服务器上怎么做呢?用push(推)出去自己的版本:)事实上,这还是牵涉到版本管理哲学的问题,因为google codehost的那个库在Mercurial看来也就是一个普通的库,没有什么特殊的,你仅仅是将自己的库强行推给它,将它的库修改而已。同理,当你想要放弃修改,需要做的就是将google code上的库pull(拉)回来。比如,我想同步修改google code上我的那个文本。

命令及输出如下:

E:/work/jtianling-blog-sample-code>hg push https://blog-sample-code.jtianling.googlecode.com/hg/

pushing to https://blog-sample-code.jtianling.googlecode.com/hg/

searching for changes

http authorization required

realm: Google Code Mercurial Repository

user: JTianLing

password:

Success.

当然,在google codepush是需要用户名和密码的,完成后显示Success,然后你再去clone的时候会发现内容已经变了。

这里我们确认一下,通过下面的命令,我们再clone一份放到jtianling-blog-sample-code2目录中去。

E:/work>hg clone https://blog-sample-code.jtianling.googlecode.com/hg/ jtianling-blog-sample-code2

requesting all changes

adding changesets

adding manifests

adding file changes

added 2 changesets with 2 changes to 1 files

updating working directory

1 files updated, 0 files merged, 0 files removed, 0 files unresolved

 

E:/work>

这里,会发现输出的信息也与第一次看到的不同了,这里已经有两个changesets了,需要说明的是Mercurial是基于changesets管理的版本控制系统与git基于内容管理(snapshot)管理的方式不同。在Mercurial中,一个系统就是通过一个一个changesets累加起来的。

这里,可以看到新的内容了(按照本文的说明,你下的时候就已经是新的内容了)

 

五、   小结

事实上Mercurial的命令远不止这一些,详细的内容还是那句话,希望大家可以查看教程Mercurial 使用教程与《Mercurial: The Definitive Guide》,一篇小文,难以承载那么多东西,呵呵,何况,也没有必要做太多前人已经做好的工作。《Mercurial 使用教程作为入门非常不错,并且还是中文的,推荐给大家。而且,我说的都是命令行下面的操作,但是,事实上命令行都懂了,图形操作就更不用说了,主要的是理解这些命令对应的分布式版本控制管理概念就好。

我写此文的目的其实主要是因为以后会将blog中的sample代码都放在上述示例的那个工程中,而我会使用Mercurial,为了不需要每次都向大家解释怎么样才能用Mercurial clone回代码,特别写此文简单的介绍一下。

 

六、   参考资料:

需要详细了解Mercurial的话,这里有几篇非常好的教程

1.  Mercurial: The Definitive Guide》,By Bryan O'Sullivan。最好的Mercurial教程,就是篇幅巨大

2.  A tutorial on using Mercurial》,官方推荐的一个教程E文版

3.  Mercurial 使用教程,上面那个教程的中文版,!推荐!

4.  Mercurial快速入门,一个中文的快速入门教程,事实上仅仅翻译了标题-_-!

5.  Mercurial manual 》,作者就是Mercurial的作者。

 

write by 九天雁翎(JTianLing) -- www.jtianling.com

阅读全文....

版本控制系统(RCS)的选择与比较

版本控制系统(RCS)的选择与比较

write by 九天雁翎(JTianLing) -- www.jtianling.com

讨论新闻组及文件

为啥考虑选择一个版本控制系统呢?由来已久。其实说到版本控制系统,工作的时候顺从公司的安排,一直用的是VSS,家里面以前常常使用VS,顺便也用上了VSS,但是到了后来,VSS明显不行了,当做Linux的工程,Python工程,或者Eclipse中的工程时,VSS都不太胜任工作,早就想换一个到处能使的版本控制系统了。另外,工作以外其实陆陆续续写了很多代码,在博客上发布的时候常常是用复制粘贴这样的方式,以前也曾经将一些重要的工程打包,放到google groups上去,但是实在是太过麻烦,要方便的话,还是在网站找个项目托管,将所有的代码直接提交,供大家去取的方式最好,顺便将自己的工作之外的代码编写方式统一,也更好组织工程的目录结构。在重装电脑的时候也省事,不用将N大的东西考来考去还怕丢失。在自己家的服务器,台式机,笔记本3者间倒腾代码也更加方便。

       谈谈目前流行的RCS的选择,基本上现在还在用的版本控制系统分为3种,一种以VSS(Visual Source Safe)为代表,在局域网内使用,第二种以CVS(Concurrent Versions System)SVN(Subversion)为代表在互联网上使用,第三种以Mercurial,Git为代表,以分布式方式使用,(对应的,CVS,SVN的使用方式将所有的内容都集中在一台服务器上,被称作集中式)可以在互联网上使用,但是本机也有代码仓库,可以本地提交代码。基本上,将这三种依次的分为3代也未尝不可。

       Wiki上有个网页很详细的列出了众多流行的RCS极其功能比较,《Comparison of revision control software》,建议所有在众多的RCS软件中看的眼花缭乱的人去看看(也许看过后更加乱了)。总而言之我得出的结论是Mercurial > SVN > CVS > VSS

       谈谈选择,选择的目的就是在广泛的方位内使用版本控制系统,抛弃VSS本来就是选择的目的,这里就不多说了。

       CVS实在算是老牌的版本控制系统了,当年整个开源世界都是靠CVS过来的。而SVNCVS开发者特意针对CVS缺点开发的产品,出来以后,整个开源世界都换了颜色。。。。典型的就是Source Forge,这个世界最大的开源站点(个人感觉)都换了SVN后,还有什么理由使用CVS呢?Google Project Host出来的较晚,一开始就是使用SVN。另外,SVNCVS强大的地方除了上面的WIKI文章,还可以参考本文最后的中文补充材料。SVN替代CVS的趋势是不可逆转的,抛弃CVS

       现在就剩下SVN,Mercurial,Git了,其实SVN已经足够强大了,这点毋庸置疑,但是为什么我们还需要分布式呢?(Mercurial,Git的代码管理方式)个人工作时的经历,使我决定使用最新的特性。SVN的代码提交必须首先要能联网,这也是开源时,不同的开发者在不同的地方决定的,分布式的好处就是本地也有代码仓库,这样即使没有联网也可以本地提交代码,然后等待联网时再去Merge,当然,这是简单的说明,最大的好处在于,本地也能有一套完整的版本控制系统,在代码没有提交到正式的代码仓库前享受版本控制的好处,这点的好处非常多。举两个最常见的例子,其一就是一个代码量适中的工作,你没有分出版本,工作到一半的时候,很显然不能提交到正式的库里,影响大家的工作,那么中途你想尝试改改代码,有个本地库,能让你更加的自由,其二就是工作已经完成后,但是还没有来得及测试,中途需要去完成一个更加重要的工作,此时代码提交到正式库中还是不恰当的,假如有个本地的库的话,能够先提交,然后无论过了多久后,你再回来,你都能可靠地获取到完整的代码,以前工作的时候在VSS我就碰到过这样的情况,然后12天的工作就在一个自以为安全的全取上丢失了。因为上面痛苦的经历,我决定尝试使用最新的分布式版本控制系统,虽然我已经在自己的服务器上好不容易搭建了一套SVN服务了,虽然自己的开发机上都已经装好了TortoiseSVN了,虽然分布式的版本控制系统还太新,以至于还不太完善。呵呵,作为程序员,就要敢于拥抱新事物嘛。。。。。。。。又想起某句名言,IT领域最大的特点就是喜新厌旧。。。。。。

       最后剩下的就是MercurialGit之争了,在这两个RCS中选择还真是痛苦的选择,因为各有优势,就像当年选择一个除MFC以外的GUI库一样,QtGTK的选择一样痛苦。(当年最后的选择是Qt)这里,有几篇不错的中文文章《拥抱Mercurial---选择分布式版本控制工具》,《分布式版本控制工具:git & mercurial》,《几个分布式vcs比较(文中的HG就是指Mercurial)对其进行了比较,具体的比较内容这里结合WIKI中的文章总结下:

GIT:

1.   与SVN的集成更好。
2.   GIT
是基于内容的跟踪系统,相较Mecurial而言,模型简单些,因此容易扩展;

3.   Linuxrails世界中应用相当广泛。(GIT本身就是Linus开发的,这点是自然的,当年CSDNCC++世界最大的口水战不就是因为GIT全部是用C开发,然后某个Windows下的C++开发者提出了疑问后触发的吗。。。。。。)

4.   跨平台特性较弱。(可以理解)

5.   命令复杂。。。。。(对应的也许是功能更加强大吧)

6.   branch建立合并功能强大,方便。

 

Mercurial

1. SVN命令相似,学习代价更小。

2. 跨平台特性很好。(事实上TortoiseHg较成熟,好用,再加上用Python开发)

3. 使用广泛,文档很好。

4.获得的支持更多。(最典型的就是Google,Google Code原生支持Mercurial)

 

 

以下是各自获得的支持列表:

Software  

Web interfaces  

Stand-alone GUIs  

Integration and/or Plug-ins for IDEs  

Git

gitweb, wit, cgit, GitHub, gitorious, Trac

gitk, git-gui (Tcl/Tk), tig, TortoiseGit, qgit, gitg (GNOME/GTK), (h)gct (Qt), git-cola (Qt), Git Extensions (Windows Explorer)

Eclipse (JGit/EGit); Netbeans (NbGit); Visual Studio (Git Extensions); Emacs (extension for standard VC); TextMate (Git TextMate Bundle); Vim (VCSCommand plugin); IntelliJ IDEA >8.1 (standard feature); Komodo IDE; Anjuta

Mercurial

included [63], Bitbucket, Trac

Hgk (Tcl/Tk), (h)gct (Qt), TortoiseHg (Windows Explorer, Nautilus)

Eclipse (Mercurial Eclipse), NetBeans ([50]), Visual Studio 2008 ([51]), Emacs, Vim (VCSCommand plugin), Komodo IDE

比较明显的是,Git获得的Linux下的支持那是非常多啊。。。。。。

最后,看的越多,越难选择,两者都是非常优秀的软件,相对来说,Git更加强大,但是因为自己还是需要在Windows下做一些工作的,另外,因为想在网上找个地方托管代码,Google支持Mercurial而不支持Git,因为这个缘故,选择Mercurial了。。。。。呵呵,最后的选择因为这么简单的原因。。。。。。。

       另外,对于E文不太好的人,提供一篇中文补充材料:

版本控制系统简介RCS/CVS/Subversion》向我们讲述了CVS的特性,SVNCVS强大的地方,以及一些SVN的缺点。

 

 

后记:经过使用后,对Mercurial有了一些更理性的认识,相对来说,Mercurial的库的建立因为是分布式的,建立起来更加方便,本地不需要任何服务器什么的,直接就能很好的享受版本控制的好处,仅仅需要了解几个命令就能胜任日常的使用。但是,事实上,目前来说,分布式的如Mercurial的版本控制系统还是有一些缺陷的,最重要的即是权限的控制功能比较弱,这点可能因为Mercurial的用户群主要在于开源世界,所以没有太过重视,实际上企业开发可能会比较恼火,相对来说SVN,特别是VSS就要好的多。然后Mercurial相对Git有个缺点,那就是分支的时候不能对单独的子目录进行,一次clone就是一个工程,这样希望在一个大工程中对一个小项目进行分支,会比较麻烦,这点也算是比较大的缺点了,总的来说,Mercurial还是小项目和小团队使用的版本控制的首选,使用方便,入门也简单,功能强大,但是可能大团队,就得有所考虑了,但是大团队还是想使用Mercurial的话,还是能通过其他版本控制住权限的,然后,通过划分较多小Mercurial项目的版本来解决一次只能分支一个完整Mercurial的问题。

最后,我后来还看到一篇洋洋洒洒的论文-_-!可见事情发生的猛烈和迅速。。。。《为什么软件项目从集中式迁移到分布式版本控制系统的热情持续不减?》
最后的最后,我为Mercurial写了一个简单的介绍及入门引导《分布式的,新一代版本控制系统Mercurial的介绍及简要入门

 

 

write by 九天雁翎(JTianLing) -- www.jtianling.com

 



阅读全文....