November 24th, 2009progress on login

这里是指在linux下, 在我们的环境中由于在登录系统的时候需要比较久的时候(5-15秒), 在那里看着不动的屏幕总归会有些不爽, 于是便写了一个小小的进度条来.
首先呢, 我们先完成一个画一个转圈的直线的程序来(其实就是轮流打印”-\|-/”这几个字符, 它每转完一圈后会打印一个加号.) — 当然每次打印要有一个间隔, 不然会很快, 这个时间间隔我们能过程序参数来传递.

#! /bin/bash
count=0
#c is the array for the characters we'll print
c[0]='-\b' 
c[1]='\\\b'
c[2]='|\b'
c[3]='/\b'
c[4]='-\b'
c[5]='+'

while true
do
     let "count = $count %6"
     echo -n -e "${c[$count]}"
     sleep $1  #sleep sometime to continue....
     let "count = $count + 1"
done

在上面我们使用了echo 的两个参数, -n 是让它不打印一个多余的换行, -e让它解释转义字符, 而\b则是退格符.
好的, 下面就保存这个脚本并让它可执行(chmod +x ), 这里我把它命名为~/bin/timedot, 能过执行 ./timedot 0.2 来看一下效果吧. (请确定你的sleep程序可以接受小数形式的参数).

嗯, 看上去不错, 好的, 让我们把它加入到启动脚本里, 基本思路是把它作为一个后台程序运行.

~/bin/timedot 0.2&
timedotPID=$! #$! 是bash的内置变量, 它保存最后一个后台进行的pid.
...... #把你的很慢的代码放在这里.

kill $timedotPID  #杀掉打印进度条的进程.

好了, 试一下, 嗯, 似乎工作的还不错. 不过似乎有一个问题: 在每次启动的时候你都会看到一个类似下面的消息:

[1234]-  Terminated                 ~/bin/timedot 0.2&

之所以会有这行消息是因为你在后台运行一个程序的时候, bash会关注所有属于它的后台进程的状态, 并在后台进程结束后通知前台程序某个程序已经死掉啦(或者是已经完成了), 不过毫无疑问我们不希望看到关于timedot的通知消息(太丑陋了), 于是我们可以通过disown 命令来让bash放弃对timedot的管理.

好, 在这里似乎一切都很完美了, 不过假如你在一次登录的时候, 实在忍受不了长时间的等待了, 于是你按下了ctrl+c来中止当前的初始化脚本, 然后你就会发现了另外一个问题… 你会发现在你打字的时候总是会有”|/|-+”这几个字符蹦出来 —- 而这是因为你的ctrl+c虽然中止了你的初始化脚本, 但它却没有中此我们的这个后台进行的进度条进程. 好吧, 让我们修好它:

~/bin/timedot 0.2& 
timedotPID=$! #$! 是bash的内置变量, 它保存最后一个后台进行的pid.
my_control_c()
{
     kill $timedotPID #杀死后台进程<br />
     trap SIGINT  #重置SIGINT, 
}
trap my_control_c SIGINT   #我们设置一个control+c的钩子, 当用户按下control+c的时候会调用我们的my_control_c函数
...... #把你的很慢的代码放在这里.

kill $timedotPID  #杀掉打印进度条的进程.
trap SIGINT #重置SIGINT为默认值. 

这里使用了trap命令来设置ctrl+c的钩子, 这样每次要中止初始化脚本的时候就会调用我们自己的函数, 而它会杀掉后台进度条进程, 当然不要忘记重置钩子, 我们不需要再以后用到它了.

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:)

September 15th, 2008Firefox plugin: Source Editor

刚才在折腾网上预约某医院的在线预约, 可是在提交表单的时候, 总是会提示出错, 提示我我某网页元素yy_time的对象找不到, 在firefox和ie7下均无法通过提交, 于是只好查看其网页代码, 似乎是用一段js来检查提交内容的, 想了下, 似乎firefox有插件支持直接编辑网页内容的, google之 “firefox edit page source” , 果然找到一页介绍firefox7个网页编辑插件的页面 , 最后一个便是source editor.

于是下载安上, 使用很简单, 通过菜单里的start/stop source editor来打开/关闭编辑网页内容的功能, 打开后, 可以双击某一块区域, 然后就可以在里面直接修改其网页代码, 然后当然回到我刚才说到的问题, 直接给网页加上一个yy_time的input box, 然后并闭编辑功能并在里面填上当前的时间, 提交, 果然成功了:)

September 3rd, 2008旋三初试

在rollerfun写的… 作为首批拿到旋三的真正的用户, 虽然我是小菜鸟, 那也得瞎写点东西出来….

我是个新手, 原来没玩过平花之类的, 所以关于性能的评测就先不班门弄斧啦, 只说对旋三一些感观上的认识.

在漫长的等待后, 终于在上周六的下午拿到了旋三, 当天下午便忍不住穿上鞋去科技馆得瑟了 在科技馆还有三个人认出了是旋三来, 并且上来向我询问话旋三的信息 🙂 这说明旋三还是很受关注的啊~~) 其中有位看似高手的同学向我借穿了一会旋三, 经过他的测试后评价说鞋不错.

下面是一些个人的感觉, 有啥不对的地方请多指教

首先, 这鞋子的外形还是蛮酷的, 照片大家应该都已经在论坛上看到了, 我配的是玫瑰红的刀架, 很是拉风, 美中不足的可能要算是外壳的样子了, 它和鞋面的风格不甚匹配, 鞋面整体比较亮, 而鞋壳似乎和旋二的差不多, 外表是颗粒状的塑料? 按我想像中比较完美的外壳应该是和鞋面一样发亮的

其次, 鞋的整体感觉还不错, 比较跟脚, 因为有两个cuff扣, 所以可以确保鞋系的很紧, 小问题是似乎前脚掌的外侧稍微有些挤的感觉(那位试穿的兄弟也这么讲), 穿时间长了会有脚趾疼, 这也可能是新鞋的原因, 等再穿段时间看看. 另外刚开始穿鞋和脱鞋都不甚容易, 因为太紧了, 总是要把鞋带都松的差不多了才成.

另外的问题, 感觉脚踝周围的海绵不够厚, 里面感觉有些硬…

其他的像轮子应该是用的和旋二一样的轮子, 不用再多讲了.

最后, 如果有在上海的兄弟想试测试鞋子的话, 可以联系我啊, 我的鞋的尺码是41的. 周末可以在科技馆借你试穿:)

May 20th, 2008Cterm open url script

功能: 自动在浏览器中打开当前窗口中的所有链接

目的主要是为了节省在纯键盘工作的时候看到窗口里有链接, 想打开还得动鼠标的麻烦 (对于我这种使用充电鼠标的人有点用处)….

使用:CtUrlOpen

下载CtUrlOpen 并放到你的Cterm所在目录下的script目录. 你可以通过Cterm菜单 工具->运行脚本 或都编辑你的mycmds.txt加入如下一行, 之后就可以使用ctrl+alt+o快捷键使用它了.

64;    ctrl+alt+o;    openUrl;false;    pyf:script\CtUrlOpen.py;   #open url

已知问题:

没有自动忽略用户的ip.

Fixed issues:

  • 当行首出现类似*p 的语句时回车仍会补*, 本次更新检查如果行首的*后面紧跟的为非空格的话, 回车不自动补*
  • 在*或//后自动填充适当空格以和上行保持一致, 大致如下所示:
// This line are many leading spaces after "//"
// | (cursor will automatically move to the same column as "T"

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