画示意图,还是metapost好

March 10th, 2008

想画一个Linux内核五大组成部分的示意图(如下),试了一堆开源工具:GraphViz, Dia, Kivio,居然没有一个可以画出想要的样子。

Linux内核五大部件示意图

本来感觉对付这种图GraphViz应该比较拿手,但是搞了半天发现默认的dot工具没法指定顶点元素的位置,自动生成的布局极其诡异,neato倒是允许强制设定位置,但是不知道怎么搞的自动布局的箭头之间竟然互相交叉,凭着感觉调整了一下语句顺序,箭头不交叉了,但弧度又变得很奇特。。。

Dia和Kivio似乎都不怎么支持这种弧线箭头,虽然用折线箭头对付一下也凑合了,但总归不爽,至于界面的丑陋程度不提也罢。

其实OpenOffice.org Draw还不错,按以往的经验,画出的图还比较符合我的想法,只是OpenOffice.org家族里的其它成员太令人失望,实在不情愿为了它浪费EeePC宝贵的硬盘空间。

最后想起来还有个metapost,以前倒是玩过两下子,但没用它干过什么正经事,语法都快忘光了。杀到王垠前辈的网站找资料,居然惊奇地发现其中一个示例(下图)包含我要的所有元素:圆角矩形框起来的文字、弧线箭头,唯一一点疑虑就是不知道中文支持怎么样。。

王垠网站上的metapost示例

Google了一把,发现只要装好了cjk-latex,要让metapost支持中文非常简单,在Ubuntu 7.10中,只要装上

context
latex-cjk-chinese
latex-cjk-chinese-arphic-gbsn00lp
latex-cjk-chinese-arphic-gkai00mp

这几个包(后两个是字体,可以选装),然后在metapost文件前后分别添加

verbatimtex
%&latex
\documentclass{article}
\usepackage{CJK}
\begin{CJK}{UTF8}{gkai}
\begin{document}
etex



verbatimtex
\end{CJK}
\end{document}
etex

设定好CJK环境、字体(gkai是文鼎楷体,还有一个宋体的名字是gbsn)即可。

下面是最上面那幅图的完整代码:

verbatimtex
%&latex
\documentclass{article}
\usepackage{CJK}
\begin{CJK}{UTF8}{gkai}
\begin{document}
etex

input boxes;
input rboxes;

beginfig(1);
rboxit.PM(btex 进程管理 etex);
rboxit.MM(btex 内存管理 etex);
rboxit.FS(btex 文件系统 etex);
rboxit.NET(btex 网络接口 etex);
rboxit.IPC(btex 进程间通信 etex);
PM.c = (3cm, 2cm);
MM.c = PM.c + (0, 2cm);
FS.c = PM.c - (3cm, 0);
IPC.c = PM.c + (3cm, 0);
NET.c = PM.c - (0, 2cm);
drawboxed(PM,MM,FS,IPC,NET);
drawdblarrow MM.c{left}..{down}FS.c cutbefore bpath.MM cutafter bpath.FS;
drawdblarrow MM.c{right}..{down}IPC.c cutbefore bpath.MM cutafter bpath.IPC;
drawarrow MM.c{down}..{down}PM.c cutbefore bpath.MM cutafter bpath.PM;
drawarrow FS.c{right}..{right}PM.c cutbefore bpath.FS cutafter bpath.PM;
drawarrow IPC.c{left}..{left}PM.c cutbefore bpath.IPC cutafter bpath.PM;
drawarrow NET.c{up}..{up}PM.c cutbefore bpath.NET cutafter bpath.PM;
drawarrow FS.c{down}..{right}NET.c cutbefore bpath.FS cutafter bpath.NET;

endfig;

verbatimtex
\end{CJK}
\end{document}
etex

end

mptopdf之,就可以直接生成PDF文件,如果需要其它图片格式,可以先用pdftoppm转成ppm,再用ImageMaigck中的convert。

2008-3-6 1:40am

March 6th, 2008

VPS上的时钟好像不准,明天发封邮件给客服人员,让他们帮忙解决一下。

今晚写了“新手指南”页面,又列出一大堆待完成的链接。其实对于内核,我自己也只能算个新手,方便自己学习,是KernelDict建站的一个重要原因。

今天跟朋友聊天聊得太久,以后要改一改,保证良好的作息时间。

第二天

March 5th, 2008

配好了Apache2的NamedVirtualHost。就是按访问的域名决定DocumentRoot,这样http://donald.kerneldict.orghttp://www.kerneldict.org就可以分别直接进入blog和wiki,虽然两个域名都是指向同一台服务器。

原始的 HTTP 协议在请求中可以只发送网页相对地址,不强制发送域名,这样 Web 服务器就无法知道用户到底是访问了哪个域名,只能通过 IP 进行区分。但 HTTP/1.1 做了一些扩展,要求请求内容中也要包含域名,比较现代的浏览器都支持一扩展,现在很多共享网络空间都是使用同一个 IP 地址绑定不同域名,原理就是如此。

编辑了几个wiki特殊页面:关于、版权信息、编写帮助等。

找到一个不错的 MediaWiki 配置手册:
http://www.allwiki.com/wiki/Mediawiki

看来还有不少需要学的东西,慢慢来,用到再改不迟。

在 Google Calendar 中添加了一项提醒,每个工作日至少编写一个 KernelDict 条目,这样一年下来就可以有 260+ 个条目了,积少成多,加油加油 :)

KernelDict.org 开张了!

March 4th, 2008

终于有了自己的域名和VPS服务器,奋战一下午,终于开始有点样子了 :)

今天的主要工作:

  1. 装东西:mediawiki, wordpress
  2. 编辑了wiki首页

明天继续玩~