January 8th, 2009colinux && xming (part 1)

前段时间由于准备在linux下做些开发的事情, 但是还要经常在windows下上网(聊天)游戏(实况), 兼之还是有些认为linux桌面做的不够精致, 用着不甚习惯, 所以经常要在两个系统间来回切换, 不过这切换的代价比较大, 需要重启才能进入另外的系统.

终于在一个偶然的机会发现了有colinux这个东西(已经出来很久很久了… 足显现在我是多么的圡), 于是便开始了我的colinux尝试,

啊, 什么是colinux? 简单来讲就是可以在linux下以一个本地程序来运行linux的东西, 它和虚拟机不太相同, 是直接使用本地计算机资源, 速度相对快一些. 更说的介绍可以参照其主页上的说明.

下面是一些设置步骤, 仅供参考.

首先讲一下我的电脑的分区情况:

主硬盘前四个分区都是ntfs格式, 给windows用的, 然后一个是boot分区, ext2格式, 接着是swap, 再接着是root分区, ext3格式, 最后一个分区为lvm, 其中有一些卷挂载到linux下的usr/home之类的地方.在安之前自己对colinux的lvm支持还是有一点点小疑问的, 不过事实证明自己的担心是错误的 (不过因为一些先入为主的观念就导致走了弯路.), 再另外我的windows现在用的是window 7 build 7000, 在安装之前也会担心colinux不兼容……

1. 是从www.colinux.org找到colinux最新版的下载, 我下的是0.7.3的版本(0.7.3-linux-2.6.22.18)

2. 安装下载好的可执行文件.

3. 开始配置colinux

配置过程:

新版本的colinux抛弃了原来的xml配置文件格式, 而采用了name=value之类语句的配置方案, 具体的参数列表可以参考在colinux安装目录中的colinux-daemon.txt中的说明. 为了方便起见, 我们先配置它启动再说.

我们这里把所有需要的文件都放在一个单独的目录中, 假设为mylinux目录,

1. 我们需要把colinux安装目录里的vmlinux,initrd.gz, vmlinux-modules.tar.gz拷贝到mylinux中,  这几个文件是colinux提供的已经打过补丁的内核程序, 我们可以用它们来启动系统, 当然, 你也可以根据你的需要自己编译内核, 不过需要手动给内核打补丁, 这个我们之后再议.

2. 创建colinux的配置文件, 命名为linuxcfg.txt, 首先加入以下两行:

kernel=vmlinux
initrd=initrd.gz

这就是用来指定我们启动用的内核文件.

3. 我们需要在配置文件里指定本地硬盘在colinux中的设备的映射关系, 这里可以把本地硬盘的分区映射为colinux的一个分区, 也可以把一个文件或者目录映射为它的一个分区, 后面的方式对于和host系统之间的文件共享很有帮助.

在colinux中分区编号是从1开始的,  按顺序为1,2,3,4…, 这里值得注意的一点是, 分区的编号和linux的/dev/sdaX的方法不太相同, 这里没有主分区和逻辑分区之间可能会差几个数字, colinux中的编号是连续的.  所以按照我的分区来讲, 前面的ntfs分区应该是分别为1,2,3,4, boot为5, swap为6, root为7, lvm为8, 因为windows正在使用ntfs的分区, 我们就暂为把ntfs分区也挂到colinux中, 只创建其他linux分区到colinux中的设备映射.

在colinux的设备中, 硬盘设备是以cobdX的格式命名的, 对于本地硬盘分区的映射, 采取下面的方式

\Device\HarddiskX\PartitionY    Harddisk从0开始编号    Partition 从1开始编号

所以对于我的几个本地设备, 可以下几行配置:

cobd0=\Device\Harddisk0\Partition7
cobd1=\Device\Harddisk0\Partition5
cobd2=\Device\Harddisk0\Partition6
cobd3=\Device\Harddisk0\Partition8

分区映射指定好之后, 就是要指定启动时的根分区了, 因为我的根分区没有在lvm中, 所以我直接指定根分区所映射的那个设备即可,在这里应该是cobd0,

root=/dev/cobd0

tip: 如果你的根分区在lvm管理的卷上, 直接用类似于原来在linux下的卷名指定即可, 假设你的根分区在为lvmVolumn/root, 则可以用以下方式指定:

root=/dev/lvmVolumn/root

colinux在启动的时候会和普通启动一样先把lvm的所有卷扫描出来. 当然前提是你已经把你的lvm的分区映射到colinux的一个设备上了(在我这里就是: cobd3=\Device\Harddisk0\Partition8 做的事情),

在做完这些后, 我们就可以开始尝试启动colinux了, 打开cmd窗口, 并进入mylinux目录, 用如下命令

colinux-daemon.exe  @c:\mylinux\linuxcfg.txt  -v 3

在我们第一次启动时可能会遇到一些问题: 像有些分区会挂载不上, 这是因为colinux的硬盘设备映射名称都和原来系统中的不一样了, 所以我们需要修改/ets/fstab文件, 来更新挂的分区, 不过对于lvm中的卷来讲一般不用, 因为lvm的卷的名字不会变. 这里就是根据自己的需要把原来相应的设备改为/dev/cobdX, 不再多讲了.

到这里, 你的colinux应该就可以正常启动了, 在短暂的欢呼雀跃后你可能会发现一个问题: 它怎么联不上网络……, 欲知后事如何, 请听下回分解, 明天再写网络配置部分.

November 29th, 2008linux command pkg-config

今天在自己的机器上搭某个东西的环境的, 第一个问题便是要设置编译的路径之类的东西, 当我很傻X的自己在/usr/include/下找了半天所要的库之后, 终于注意到了原来安了一个叫pkg-config的东西, google之, 发现这个东西就是解决我刚才的手工劳动的:)

pkg-config –cflags –libs libglademm-2.4

便输出了我想要的东西, 当然它不有更多功能, 具体请看它的手册吧.

November 29th, 2008linux command – xargs

xargs 是用来从标准输入把行中的内容作为某个命令的参数, 并把执行结果输出,
from man:

  xargs - build and execute command lines from standard input<br />

我们在两台机器上同时运行同一个程序,这两台机器的环境应该是一样的, 但我们发发现在其中的一台机器上由于缺少一些运行时库而导致程序无法运行。我们已经在可以运行 的那台机器上得到了一个这个程序所依赖的所有库文件的列表(放在 depends.txt中, 每个文件名占一行),  问题是怎么找出有哪些库丢失了呢?
当然, 你可能会想到, 那直接一个一个的把这些文件在有问题的机器上找一下, 如果没有就表示丢失了呗, 当然这是正确的做法, 不过当文件数量过多的时候, 手工做显然是一个十分烦人的工作, 于是我们的xargs就派上用场了,
cat depends.txt | xargs ls -l | grep “No such file or directory”
首先看命令的前半部分, cat depends.txt | xargs ls -l , 这部分是把depends.txt中的内容作为输出到xargs ls -l 中, 而xargs做的事情就是把文件中的内容当作它的参数’ls -l” 的参数, 并执行ls -l 这个命令,
假如depends.txt 中有以下内容:

/usr/lib/a.so
/usr/lib/b.so

经过xargs处理后的命令行大致如下
ls -l /usr/lib/a.so
ls -l /usr/lib/b.so

我们知道ls遇到一个不存在的文件会输出file not found, 于是咱们再grep 一把, 就把这些不存在的文件找出来了:)
这是今天学到的命令, 现学现卖~~~

October 18th, 2008emacs muse mode – issues

muse是emacs中emacs-wiki mode的继任者, 兼容原来wiki的所有操作, 当然也有不少改进, 照wiki里讲它的优点, 大致有以下几点(直接从原文翻译过来的):

    • 可以处理不同的输出格式
    • 相对于EmacsWikiMode来讲hack它更容易, 代码的组织结构更加nice
    • 更加容易的从一个已有的样式派生出自己特定的发布样式
    • Muse中有一个大副改进的日志模式(支持输出Rss1.0(Rdf)/Rss2.0)

讲了这么多废话, 其实是因为这两天比较枯燥无聊的时候, 自己在瞎折腾Emacs, 所以找到了这么个东西准备用了当记事本用, 不过配置的时候发现了几个问题, 现在解决了, 写下来, 估计一定会有人和我遇到相同的问题!

问题一: 在Muse的QuickStart Tutorial中的源代码那一小节讲到插入源代码然后再发布出的文件里的代码就是高亮的, 可是我在刚开始试的时候是没有成功的: 发布出的代码是没有任何处理的. 经过调查后发现这个功能是需要htmlize.el 扩展的支持的, htmlize.el是被包含在XEmacs发布的, 所以使用XEmacs的兄弟们不会遇到这个问题, 估计写这个QuckStart的哥们用的就是XEmacs, 而htmlize.el默认是不在Emacs中的, 所以就需要自己手动下载这个文件并放到你的加载路径里喽.

问题二: 如何直接在edit模式就可以看到高亮的代码, 刚才讲到Muse发布时是支持高亮其中的代码的, 但是默认情况下是不支持在编辑状态就高亮代码的, 效果应该和下面的差不多

syntax-hilighting

找了半天总算从这里(作者: 叶文彬)找到了一个比较好看的实现(没办法, 谁让咱是不会写lisp的菜鸟呢!~~~~~), 作者的配置文件里有支持代码高亮的一些自定义函数, 就是从(defun muse-colors-src-tag (beg end) 到(add-to-list ‘muse-colors-tags ‘("src" t nil nil muse-colors-src-tag)) 这一段, 有了这些就可以让你的Muse支持高亮了. 另外建议也把htmlize-region-for-paste这个函数放到你的配置文件里, 有了这个函数, 就会把生成的代码的样式使用css样式而不是直接使用html的颜色标记指定, 当然你需要有一个css文件里包含了所需要的样式, 你要是不知道的话也参考这位作者定义的! 他的CSS样式文件在这里可以找到.

基本上为了支持代码高亮我从作者那抄了如下代码, 版权归原作者所有, 我只是引用一下下:

(defun htmlize-region-for-paste (beg end)
  "Htmlize the region and return just the HTML as a string.
This forces the `inline-css’ style and only returns the HTML body,
but without the BODY tag.  This should make it useful for inserting
the text to another HTML buffer."
  (let ((htmlbuf (htmlize-region beg end)))
    (unwind-protect
        (with-current-buffer htmlbuf
          (buffer-substring (plist-get htmlize-buffer-places ‘content-start)
                            (plist-get htmlize-buffer-places ‘content-end)))
      (kill-buffer htmlbuf))))
;;}}}

;(defvar muse-colors-overlays nil)
(defun muse-colors-src-tag (beg end)
  "Strip properties and mark as literal."
  (let (face)
    (muse-unhighlight-region beg end)
    (save-excursion
      (goto-char beg)
      (let ((fs 1) content face-list fe mode attrs number ov ovs
            (font-lock-verbose nil))
        (when (re-search-forward "<src\\(.*\\)>" nil t)
          (setq beg (match-end 0)
                attrs (mapcar
                       (lambda (pair)
                         (setq pair (split-string pair "="))
                         (setcdr pair (substring (cadr pair) 1 -1))
                         pair)
                       (split-string (match-string 1)))
                mode (and (assoc "lang" attrs)
                          (intern-soft (concat (cdr (assoc "lang" attrs))
                                               "-mode"))))
          (when (and mode (fboundp mode))
            (goto-char end)
            (setq end
                  (if (re-search-backward "</src>" nil t)
                      (match-beginning 0)
                    (point-max))
                  content (buffer-substring-no-properties beg end))
            (with-current-buffer (get-buffer-create "*muse-temp*")
              (funcall mode)
              (insert content)
              (font-lock-fontify-buffer)
              (htmlize-ensure-fontified)
              (or (get-text-property fs ‘face)
                  (setq fs (next-single-property-change fs ‘face)))
              (while (and fs (< fs (point-max)))
                (setq fe (or (next-single-property-change fs ‘face)
                             (point-max))
                      face (get-text-property fs ‘face))
                (and face fe (setq face-list (cons (list (1- fs) (1- fe) face) face-list)))
                (setq fs fe))
              (kill-buffer (current-buffer)))
            (when face-list
              ;; (message "%S" face-list)
              (dolist (f (nreverse face-list))
                (put-text-property (+ beg (car f)) (+ beg (cadr f))
                                   ‘face (nth 2 f)))))
          (when (and (assoc "number" attrs)
                     (setq number (string-to-number (cdr (assoc "number" attrs)))))
            (mapc (lambda (o)
                    (let ((pos (overlay-start o)))
                      (if (or (null pos)
                              (and (> pos beg) (< pos end)))
                          (delete-overlay o)
                        (push o ovs))))
                  muse-colors-overlays)
            (setq muse-colors-overlays ovs)
            (goto-char beg)
            (forward-line 1)
            (while (and (not (eobp)) (< (point) end))
              (when (not (looking-at "</src>"))
                (setq ov (make-overlay (point) (point)))
                (push ov muse-colors-overlays)
                (overlay-put ov ‘before-string (format "%4d " number))
                (setq number (1+ number)))
              (forward-line 1))))))))
(add-to-list ‘muse-colors-tags ‘("src" t nil nil muse-colors-src-tag))

基本在搞Muse的时候就遇到这两个比较麻烦的问题, Over:)

August 7th, 2008js ParseInt () function

某一哥们写了一个分析日期的函数, 日期格式大致是”yyyy-mm-dd”, 比如”2008-05-15”,

他用的代码大概是这样:

var year = ParseInt (dateStr.substr (0, 4);
var month = ParseInt (dateStr.strstr(5, 2);
….

代码看上去很正确, 没什么问题, 可是他在运行代码的时候却发现这个函数对于除8, 9月份外的日期都可以正常运行, 可是对当月份为8,9月的时候就会出现错误. 这段代码有问题还是发生了一些灵异事件导致错误的发生?

于是我们开始了调试之旅(当然是用的firebug), 可以发现, 当月份为08/09的时候, var month 一行返回的是空值, 这是为啥呢? 我们找到parseInt 函数的说明文档, 发现了一句话:”If the string begins with “0″, the radix is 8 (octal). This feature is deprecated”, 嗯, 这就是问题所在. 假如一个字符串从0开始, 便认为这是一个八进制的数, 而八进制里能出现的最大数的值是7, 所以当8/9出现在一个八进制数中时当然是一个错误的输入:D.

至于修改方法, 比较简单, 自己想吧~~

原题如下:
试参考以下代码,完成一个static_log2,该模板类的功能是求log2(int n)的整数部分

template <int n>
class static_fact //求n的阶乘
{
public: 
      enum { value = static_fact<n-1>::value * n };
};

template <>
class static_fact<0>

 public:enum { value = 1 };
};

#include <stdio.h>
void main()
{     
printf(“3! = %d “, static_fact<3>::value);
}

 没研究过template,连c++也不是太熟,不过看了一会,大概看出是个递归,剩下的就是想递归的结束条件了, 可怜我脑袋不太灵光,刚开始想歪了,浪费了不少时间,还好,后来还是想出来了,//blush

  还有一题就是一个比较难的竞赛题了, 我的数学不好,没搞出来,哪天有空,搜一下看看怎么做的:)


© 2007 pangwa's Blog | iKon Wordpress Theme by Windows Vista Administration | Powered by Wordpress