行者无疆 始于足下 - 行走,思考,在路上

稀里糊涂的数模比赛

原来数模和acm本不是一个级别的。

数模,三人一队,十天一题。

原本我是学计算机的,谁曾想到那两人matlab倒也丝毫不落下风,因此我只能回到了自己的老本行——LaTeX写文档了。写文档当然要涉及到图表、公式、参考文献等等。因此我顺便进一步熟悉了下Linux环境下绘图工具的使用。

简单的说,绘图工具分为两类,一类是CLI的,另一类是GUI的。两种工具也大体代表了不同的理念,前者是WYTIWYG(What You Think Is What You Get),所思即所得,后者是WYSIWYG(What You See Is What You Get),所见即所得。具体到应用上,前者以\TeX派系为代表,后者以MS Word派系为代表。

我们先说第一类。和\TeX配合的绘图工具,我了解的有四个:

  1. metapost
  2. asymptote
  3. pgf\tikz
  4. pstriks

前两者属于离线做图工具;后两者属于在线做图工具。可能你又会问,什么叫离线做图工具?什么又叫在线做图工具?

简单来说,离线做图就是单独建立文件,然后生成eps等独立的图形文件,通过\includegraphics等类似的命令将图形文件嵌入到latex文件中(这样说也许不妥,因为latex文件经过不同处理可以生成多种类型的文件如dvi、ps、pdf等等,嵌入到latex中意思是“图形”嵌入到生成的文件中)。metapost和asymptote属于这种。

在线做图就是直接在TeX文件中敲相应宏包的绘图命令,经过处理后直接生成图形。pgf\tikz和pstricks属于此类。两种方式并没有优劣之别。离线做图更灵活,在线做图则更加方便。

从历史上来说,metapost和pstricks历史更长久一点,而asymptote和pgf\tikz则相对年轻。

语法上,metapost比较怪异;asymptote的语法仿照c++(可见c++确实是王道^_^);pgf\tikz我用过一段时间,感觉比较乱,毫无章法;pstricks基于postscript,据说比较强大,但是我没用过,不好评价。

能力上,各有所长,metapost可以解方程;asymptote的3d不错;pgf\tikz生成一些特殊的图如自动机、MindMap等效果非常好;pstricks,不知道了。其实我觉得四者精通其一即可“纵横天下”。

这里附上一些Gallery,做图能力强弱,大家自己分明:

  1. metapost: gallery1
  2. asymptote: gallery1
  3. pgf\tikz: gallery1, gallery2
  4. pstrikcs: gallery1, gallery2

上两张图,来猜猜是用什么画出来的。不要告诉我是photoshop、inkscape哦。

 

以上是基于CLI派基于\TeX的绘图工具。除此之外,graphviz也是非常有用的一个小工具。与metapost等重量级的工具相比,graphviz的长处在于轻便灵活。短短几句话可以生成多种格式的文件。他自创了一种dot language,并且自动提供了几种layout算法。graphviz尤其适合画流程图和类图,可以看看它的gallery。著名的源码文档工具doxygen生成类图时调用的就是graphviz。而且graphviz还提供了python语言的调用接口pygraphviz

提到这里,也就不能不提到emacs了。说emacs是神的编辑器,此言一点也不为过。gentoo:

sudo emerge -av graphviz-dot-mode

dot语言的语法非常简练,看看我简单探索的成果:

graphviz-dot-mode,快捷键:

  • C-c c: compile, 根据你想要的layout,输入相应的编译命令
  • C-c p: preview, 预览图片效果(期间遇到了一个问题,用dot生成嵌入中文的ps或eps文件时,在emacs中预览是正常的,但是嵌入到latex文件中就会出现乱码,这可能是文字编码之前。

还有两个工具:

可以将graphviz的dot文件转换为tex兼容的格式,直接嵌入tex文件中,具体我就没有用过了。

最后一个推荐的CLI派的绘图干将就是gnuplot了。gnuplot主要擅长数学数据的可视化,结合maximaoctave等等可以形成一套完备的CAS系统。而且据我所知,gnuplot本身也是支持metapost接口导出的。这是gnuplot的gallery,看看什么叫数学之美。

说了这么多废话,第一类总算数的差不多了。接下来再简单数数第二类。基于GUI的画图工具,汗牛充栋,大块的如gimp、inkscape等,做尔等工作,牛刀杀鸡也。

还是一些小工具来得实惠。首先推荐的当然是大名鼎鼎的dia了。引用其官方主页上的介绍:

Dia is a gtk+ based diagram creation program released under the GPL license.

Dia is inspired by the commercial Windows program 'Visio', though more geared towards informal diagrams for casual use. It can be used to draw many different kinds of diagrams. It currently has special objects to help draw entity relationship diagrams, UML diagrams, flowcharts, network diagrams, and many other diagrams. It is also possible to add support for new shapes by writing simple XML files, using a subset of SVG to draw the shape.

It can load and save diagrams to a custom XML format (gzipped by default, to save space), can export diagrams to a number of formats, including EPS, SVG, XFIG, WMF and PNG, and can print diagrams (including ones that span multiple pages).

有趣的是,dia还支持pgf/tikz、metapost、pstricks文件格式的导出。所以把dia当成信手涂鸦工具,导入tex文件中,倒会给一向严谨的tex添点趣味。

最后一个小工具,类似于windows下的几何画板,顺手画一些几何图形还是非常赞的,这就是Geogebra。我非常赞赏的两点是:

  • 像autocad一样,具有命令行模式,既能精确控制,又能随手泼墨;
  • 也支持多种格式的export,如metapost和pgf格式。

好了,这么晚了,说了这么多废话,但愿说者无意、听者有心。安。

纠结的Mac安装

导师让我研究iphone下的程序开发。迫于经济窘迫,手头没有mac,四处查资料,终于搞出来了一个跨平台的解决方案,写了20多页的英文文档,美其名曰《The Cross-Platform Developing Skills for Mac Applications》,认真进行了排版,给导师发了过去。可是导师太忙了没有时间看呃。于是我一股脑的跟导师倾诉了一番mac, objective-c, gnustep等等之类的东西,虽然我也不太懂。导师看我做的十分认真,比较满意,中午一起吃了饭,下午来了个学长,一起坐下交流一番。我刚想倾诉我伟大的跨平台解决方案,学长说,"现在mac os可以装载pc上了“。于是我就悲剧了。

周五下午去公司跟学长借了盘,插进光驱,改下bios从cd启动,哇,竟然能启动,而且见到了安装界面。窃以为到这步,我的pc装苹果之路已经走完了一半。哪知这仅仅是噩梦的开始。整个下午就在网上乱逛,了解下pc安装苹果的知识,了解下多系统的安装与启动。晚上回到寝室,真刀真枪,开始干了。

首先是硬盘的问题。由于我的头脑发热,整个硬盘250G,就一个archlinux,这么一来要想安装苹果先得给苹果腾点地方啊。于是找到了传说中的Gparted,但是系统正在运行,/分区和/home分区无法umount,因此更无法resize,于是就找到了Gparted Live CD。wget拖了半个小时,用brasero刻盘,第一次可能用了全速刻盘,最后出现了莫名其妙的错误,刻录失败,废了一张cd。于是又想到了伟大的ultraiso 9.3版。咱不是有virtualbox嘛。马上去神网下了ultraiso,装上,插上u盘,打算搞鸽GParted Live USB出来。依然宣告失败。还剩一张cd,又用brasero刻录了下,这下降低了刻录速度,终于成功。reboot。

加载了3、4分钟的样子,Gparted终于出来了。桌面环境采用的是fluxbox,虽然没用过。先把/home分区resize一下,成功。重启,进入archlinux,df -h看看文件系统,成功!!很是兴奋的样子。reboot again,又进入了GParted Live CD,打算给mac腾30g的空间。不知怎么的,我试探性的用了一个貌似叫new partition table的功能,谈出个窗口,我点了个确定,又一个窗口,我又点了确定,这下糟了!整个硬盘被重新格式化了,整个过程不超过1s中的时间,我想这GParted也太nb了。250g的硬盘,1s中不到就全部搞定格式化了。

呜呜,我的archlinux,我的心血啊。索性,一不做,二不休,先装苹果吧。苹果的盘是ideneb的leopard 10.5.7的版本。从晚上7点到午夜12点,总共装了不下6次。终于还是没装上。症状是安装完所有软件重启后风火轮转几圈后就黑屏无反应。可能是各种驱动的问题,但是我用手机上网,反复设置,反复选择,还是没有成功,这使我彻底失望。mac的安装确实是一个关乎rp的问题。怎么办?

思前想后,还是决定装windows 7,再重新装个linux吧。于是找室友帮忙,下载了windows msdn英文原版,还是用伟大的ultraiso,刻成了live usb,启动,开始安装。半个小时,一个华丽的启动界面出现在我的眼前——果然很绚丽。简单使用了一下,相比vista,对windows 7确实做的非常非常不错。尤其是独具匠心的UI设计。超级任务栏,aero peak,动态的主题效果,重新设计的media center,便捷的网络vpn链接,还有许多我觉得不错但是叫不出名字的功能,真的很强大。而且运行起来比vista要轻快多了。看来MS这次是下了血本了。

盗版,这个字眼对于中国的it人来说是一种挥之不去的痛。虽然我也不想用盗版,虽然我可以用linux满足自己开发、办公、学习方方面面的需要,但是某些时候环境是不一样的。譬如实验室的同组同学都在用visual studio 2008做开发,这种情况下想不用盗版的MS产品恐怕都很难。据说即将面试的Visual Studio 2010正版要11100+美刀。简直是不可想向了。算了。这是在中国。cc98上有几个msdn的key,也许这次rp不错,竟然能电话激活了。此时已经半夜两点多了,撑不住了,睡了。

第二天早晨10点才爬起来。继续搞电脑。得装个linux。装哪个版本好呢?arch,自己配置还是蛮麻烦的。说实话现在对系统安装已经没有多大的兴趣了。每次重装系统都是把自己的精心调制的作品一点一点碾碎,然后再一点一点搭建起来。我是需要xetex最新版本的,自从用了latex后,已经完全不能习惯word。google了下,ubuntu 9.10中的texlive貌似还停留在2007版本。算了,还是arch吧。

有了上次的安装经验,这次的安装也算是轻车熟路了。但是自己又没有十全的把握与信心,于是在win7下把archlinux官网wiki上的Beginner's Guide打印了下来,七十多页。具体的安装过程不讲了,大体上都一样的,真想自己装的话看Beginner's Guide。只是记录一下安装过程中遇到的几个小问题。

1、grub的引导问题。很幸运的是archlinux自动识别了win7,只需要在grub的menu.lst文件中去掉几行注释就行。这是我的menu.lst文件: 

# general configuration:
timeout   5
default   0
color light-blue/black light-cyan/blue

# boot sections follow
# each is implicitly numbered from 0 in the order of appearance below
#
# TIP: If you want a 1024x768 framebuffer, add "vga=773" to your kernel line.
#
#-*

# (0) Arch Linux
title  Arch Linux
root   (hd0,8)
kernel /vmlinuz26 root=/dev/disk/by-uuid/06ec3189-80fa-471d-b8be-20de1d458f63 ro nomodeset vga=773
initrd /kernel26.img

# (1) Arch Linux
title  Arch Linux Fallback
root   (hd0,8)
kernel /vmlinuz26 root=/dev/disk/by-uuid/06ec3189-80fa-471d-b8be-20de1d458f63 ro
initrd /kernel26-fallback.img

# (2) Windows
title Windows
rootnoverify (hd0,0)
#makeactive
chainloader +1

2、rc.conf的问题,最重要的是要安装hal,并把它防盗rc.conf的daemons里面,否则进入gui后无法识别键盘鼠标。这是我的daemons设置:

DAEMONS=(@syslog-ng @network @netfs @crond @hal @kdm @alsa)

3、语言选择问题,在rc.conf会有一个LOCALE的设置问题,建议不要更改成中文,保持默认就好。我就是看了某个教程的知道改成了zh_CN.utf8,结果进入kde时,界面字体非常难看。也可能是我的字体还没有配置好的原因。

4、localtime和UTC的选择。wiki上说如果是windows和linux双系统,还是选择localtime比较好。

LOCALE="en_US.utf8"
HARDWARECLOCK="localtime"
USEDIRECTISA="no"
TIMEZONE="Asia/Shanghai"

5、字体配置我选择的是WenQuanYi Micro Hei系列,效果还算不错的。仿雅黑字体的。

6、触摸板的增强可以用gsynaptics驱动,其中有个circular scrolling的功能,非常的有趣。实现了mac触摸板的某些功能。自己google一下就知道了。在触摸板上画圈circular,就可以实现srolling的功能。呵呵。注意,gsynaptics的设置默认每次是不能保存的。把下面语句:

gsynaptics-init &

加入到你自己主目录下的.xprofile文件中即可。

7、显卡驱动的问题。我的是ati x1450卡。采用xf86-video-ati的开源驱动即可。但是最新的内核(2.6.31以上版本)开发了一个叫做kernal mode-setting的功能,会引起一些冲突,导致桌面效果无法启用。具体可以参考archlinux wiki上的这篇文章。解决方法是禁用kernal mode-setting功能。在grub menu.lst中实现。也就是下面这句:

kernel /vmlinuz26 root=/dev/disk/by-uuid/06ec3189-80fa-471d-b8be-20de1d458f63 ro nomodeset vga=773

nomodeset表示禁用kernal mode-setting,vga=773表示启用控制台的framebuffer。至于framebuffer是什么,自己百度吧。

8、xetex的字体问题。直接将下载的字体cp到/usr/share/fonts里面,最好建一个目录来存放自己的字体,然后最好

fc-cache -f -v

一下。

9、okular, evince不能显示中文问题。据说二者都是基于poppler的,安装poppler-data即可完美解决这个问题:

sudo pacman -S poppler-data

10、从普通用户到root用户gui程序无法启动的问题:

[lox@freelox ~]$ su root
Password:
[root@freelox lox]# firefox
No protocol specified
No protocol specified
Error: cannot open display: :0.0
[root@freelox lox]#
 

解决办法是在转到root之前输入xhost +命令:

[lox@freelox ~]$ xhost +
access control disabled, clients can connect from any host
[lox@freelox ~]$ su root
Password:
[root@freelox lox]# firefox
[root@freelox lox]#
 

 应该是与X11协议的实现有关。我没大看明白。自己百度吧。

能想起来的问题大体就这么多,放上一张archlinux+kde的图片的,是我现在的桌面:

后来的后来,在win7里面装上了Visual Studio 2008, Visual Assist和Viemu以及Vmware 6.5,当然,全部都是中国特色的db,呃,很矛盾。

周日看了一天的计算理论,教材是《Elements of the Theory of Computation: Second Edition》的中文版,张立昂、刘田译。不过质量实在不怎么样。看了三十页,就发现了至少三处错误。边看教材边做习题,打算把习题全部做完,统一给老师交上去好了。中途要画几个finite automata,于是又头脑发热翻了翻pgf/tikz manual,还算有点小成果。

又是繁忙的一周,汇编语言要补,计算机组成的实验更要补,计算几何的期中考试,数值分析新的内容,操作系统两份报告,还有很多很多。呃。加油吧。从来没感到学业如此繁重过。

今天买了三本书

第一本:货币战争。

第二本:C++程序设计原理与实践。

第三本:Unix编程艺术。

共131.8元,花尽了钱包里的所有钱,一分不剩。印象中好像好久没有这样买过书了。尽管我的书已经不少了,多的连宿舍的书架都放不下了。

这一周整个人就像一部机器一样在运转。上周五开始做作业。先是完成了导师布置的任务——写一个iphone下的hello world程序。坦白的说,有些时候我是很随意的,有些时候又过于吹毛求疵。这么一个任务,我看了网上的数十篇文章,下载了十几篇pdf电子书,经过筛选总结最后写出了一份精美的带有目录,索引的达27页的英文文档。题目叫The Cross-Platform Developing Skills for Mac Applications给导师发了过去。可是导师实在是太忙了。没有时间看我的文档。只是今天中午交谈的时候看到文档,简介大气,还是称赞了一下,呵呵。

周日和周一都在补计算几何的知识,用的教材是Computational Geometry in C,刚开始还好,越到后来越难。布置的作业也都很有难度。导致我两天下来才做了十道题。虽然迟交了几天,但总算是弥补了。交总比不交好。交的作业是用latex写的。画一些几何图形,顺便学了学pfg\tikz的用法。真的很不错。如下面的代码: 

\begin{figure}
\centering
\begin{tikzpicture}[line width=2pt]
\draw (-1,0) -- (8,0);
\draw (0,-1) -- (0,8);
\draw[step=.5cm, very thin] (0,0) grid (7.2,7.2);

\coordinate [label=above:$A$] (A) at (1, 4);
\coordinate [label=left:$B$] (B) at (0.5, 3.5);
\coordinate [label=left:$C$] (C) at (1, 3);
\coordinate [label=left:$D$] (D) at (0.3, 1.3);
\coordinate [label=below:$E$] (E) at (1, 1);

\draw[blue] (A) -- (B) -- (C)  -- (D) -- (E);
\draw[blue] (2, 0) -- (2, 6);

\coordinate [label=right:$A'$] (A') at (2, 4);
\coordinate [label=right:$B'$] (B') at (2, 3.5);
\coordinate [label=right:$C'$] (C') at (2, 3);
\coordinate [label=right:$D'$] (D') at (2, 1.3);
\coordinate [label=right:$E'$] (E') at (2, 1);

\draw[blue] (A) -- (A');
\draw[blue] (B) -- (B');
\draw[blue] (C) -- (C');
\draw[blue] (D) -- (D');
\draw[blue] (E) -- (E');

\coordinate [label=above:$a$] (a) at (5, 4);
\coordinate [label=left:$b$] (b) at (4.5, 4.5);
\coordinate [label=left:$c$] (c) at (5, 3);
\coordinate [label=left:$d$] (d) at (4.3, 1.3);
\coordinate [label=below:$e$] (e) at (5, 1.3);

\draw[green] (a) -- (b) -- (c)  -- (d) -- (e);
\draw[green] (6, 0) -- (6, 6);

\coordinate [label=right:$a'$] (a') at (6, 4);
\coordinate [label=right:$b'$] (b') at (6, 4.5);
\coordinate [label=right:$c'$] (c') at (6, 3);
\coordinate [label=right:$d'$] (d') at (6, 1.3);
\coordinate [label=right:$e'$] (e') at (6, 1.3);

\draw[green] (a) -- (a');
\draw[green] (b) -- (b');
\draw[green] (c) -- (c');
\draw[green] (d) -- (d');
\draw[green] (e) -- (e');
\end{tikzpicture}
\caption{Monotonic polygonal chains}
\label{fig:monotonic_chain}
\end{figure}

经xelatex处理的图形如下:

pgt/tikz

还有algorithm, algorithmic宏包,用来排版算法伪码效果非常好。我估计<<Introduction to Algorithms>>上的伪码就是用的这个。latex源码如下:

\begin{algorithm}
  \caption{Determining whether or not P is convex}
  \label{alg:convex}
  \begin{algorithmic}[1]
    \FOR {$i = 1$ to $n$}
    \STATE $j \gets i \bmod n$
    \STATE $p \gets \overrightarrow{V_{j-1}V_j} \times \overrightarrow{V_{j}V_{j+1}}$
    \IF{$p < 0$}
    \PRINT "Polygon P is not an convex polygon!"
    \RETURN \FALSE
    \ENDIF
    \RETURN \TRUE
    \ENDFOR
  \end{algorithmic}
\end{algorithm}

排版效果(博客中上传的图片貌似都有压缩,效果稍差):

昨天无意间又发现了cdlatex这个东西,至此,emacs+cdlatex+auctex+reftex+outline+xetex,这些东西组合起来,感觉写文档非常美妙。在文档中穿梭,有时间,等我通晓elisp后,在来总结这些东西。再上一张图。

emacs latex editing environment

这不,今天写实验报告又碰见了数据的图形化,顺便复习下gnuplot。kiss the unix。

下午在老板公司,和学长简单交流了下,自己在一边搞定上网,大概看了下windows ce的东西。不过现在感觉自己最大的软肋还是编程基础和算法基础。看书看书看书。

明天的数值分析,逻辑,后天的计算机组成实验,都是头疼的课。我一向对电类的课程比较头疼。电路原理,数电等硬件类课程无一例外都挂掉了。一方面是自己没好好学,另一方面也是自己实在提不起兴趣。比较讨厌。逻辑实验虽然七搞八搞能做出结果,但是个中详细原理,却懒得去理了,只求用latex把实验报告弄的好看点,祈求得个差不多的分数就行。

C++之父Bjarne Stroustrup的最新力作<<Programming: Principles and Practice Using C++>>,刚翻了翻目录。讲的内容非常广泛。从最初的入门知识,语言结构,面向对象,stl,gui,embedded, testing,不知深度如何。书中前言说:If you work by yourself, don't expec to spend less time than that(maybe 15 hours a week for 14 weeks)。

Unix编程艺术,经典书籍,久闻其名,今天终于狠下心买了一本。当小说来看好了。

越学越不明白。计算机软件简直是无边无际无极的知识海洋。技术的更新,理论的发展,这些独有的特点使得计算机应用科学的知识更新换代极其迅速。我想在大概明白所谓的需求驱动。计算机的学习也是一样,什么样的需求,什么样的技术,用到了再去学,边学边实践。像什么asp pk php等等完全是无聊的东西。有需要就学,没有这个需要的话学了不用也忘掉。当然有些经典的东西,c++, unix, emacs, latex, algorithms, sql, xml, 这才是千秋万代的东西。加油吧,lox。




Host by is-Programmer.com | Power by Chito 1.3.3 beta | © 2007 LinuxGem | Design by Matthew "Agent Spork" McGee