写这个教程的起因是自己有时候家里的沙发上听着豆瓣电台的音乐, 用过豆瓣电台的朋友们知道, 它提供一个有用的按钮: 加心 – 遇到喜欢的歌儿可以给它加红心. 可是对于坐在沙发上的我, 如果听到一首很喜欢的歌想要去点那个加心按钮, 我需要站起身, 跑到电脑前面, 然后按下按钮, 再回到座位上 — 这个过程对于想好好听歌休息的人来讲会比较烦人.

“自己动手, 丰衣足食”

经历了十几分钟的搜索后, 终于决定使用EventGhost作为工具来实现我上面的需求. (不是软文, 那个软件都是开源地).选择它有以下原因:

  • 免费
  • 支持键盘/游戏控制器/遥控器(这一点比较重要, 这个在后几天准备会用MCE遥控器来控制电脑)
  • 可以架设一个web服务器来接收控制 (这让我在没有遥控器的情况下也可以使用手机作为临时遥控器了:-) )
  • 其他启动程序的事件也可以做为触发器
  • 支持查找窗口, 打开程序, 模拟键盘/鼠标动作等
  • 支持Python脚本扩展
  • 支持自己写插件

好了, 去EventGhost网站上下载最新版本的程序并安装上吧. 下面来开始设置并使用了.

启动EventGhost后, 通过菜单File->New, 开始新的设置. 它的窗口布局分为如下所示的左右两边: 左边的是日志窗口, 所有的窗口事件都显示这里面, 每个事件为单独的一行, 注意每一行都是可以拖动的 (我们会在后面用到), 右面是具体的事件/触发配置的窗口.

由于暂时没有遥控器, 我们先实现使用手机来控制电脑, 在右面窗口的AutoStart节点上右键并点击Add Plugin菜单, (注: 通过autostart可以设置一些在程序启动时自动加载/启动的服务插件等).

在弹出的插件选择窗口里选择Dynamic WebServer:

在接下来的配置窗口里填上监听的端口和web文件存放的根目录, 这里有个认证的选项, 简单起见我们留空(无认证).

在你的web文件目录里创建一个名为index.html的文件, 内容如下:

<head>
<title>douban 控制</title>
</head>
<body>
<a href=”index.html?Love”>加心</a>
</body>

这里我们简单的创建了一个按钮, 它指向一个”index.html?Love”, 这里EventGhost会把问号后面的参数作为动作的名字识别出来. 在自己的电脑上访问http://127.0.0.1:8080并且点击加心按钮, 你会发现在EvenGhost左侧的事件列表里会多出一个Http.Love的事件如下图所示:

好了, 我们已经可以通过访问网页来触发EventGhost的事件了, 接下来就是定制事件发生后我们要做的事情了, 这里我习惯单独使用Chrome浏览器打开douban.fm, 所以当事件发生后我们需要做以下事情:

1. 找到豆瓣电台所在的窗口并激活它

2. 定位鼠标到加心的按钮

3. 点击加心按钮

下面就开始吧, 首先在右侧窗口中添加一个Folder (Folder主要是为了整理结构用的, 没有什么实际功能上的影响), 右键菜单, 选择Add Macro, 并在Add Macro窗口的Window列表里选择Find Window, 找到Chrome中的豆瓣电台所在的窗口, 然后修窗口名字为”{*}豆瓣FM{*}”, 我们使用了{*}通配符来匹配所有字符, 这是因为豆瓣电台的窗口的标题会动态更新为当前的歌曲名称, 我们只选择固定的”豆瓣FM”. 完成后把这个宏的名称重命名为DoubanFm.

在Doubanfm节点上右键通过菜单”Add Action”, 并选择”Bring To Front”, Bring to Front会使用之前找到的窗口并把它激活为当前窗口.

为了简单起见, 我们这里直接认为豆瓣电台的窗口位置是固定的, 所以那个心的按钮位置也固定 (最后是写个脚本来通过图片匹配找到对应的位置, 相对复杂了点儿),

继续右键DoubanFm, 通过右键菜单”Add Action”, 在Mouse分类里选择Move Mouse to, 把x, y 设置为心号按钮所在的位置, 我们这里是1630, 700 (这里的值应该是你窗口上对应的坐标).

继续右键DoubanFM, 通过右键菜单”Add Action”, 在Mouse分类里选择Left Mouse button.

完成后的窗口会如下所示:

这时时候再右键DoubanFm, 通过菜单”Execute item”来你的脚本是否工作正常. 如果一切正常的话你会发现豆瓣电台窗口会被激活, 并且那个心号按钮会被点击.

一切正常后, 我们下面就要把点击网页的事件和我们定制好后的行为关联起来了, 在左侧的事件窗口里找到HTTP.Love一项(我们之前就触发了这个事件), 选中它并拖到右侧窗口里的DoubanFM节点里, 把它拖到DoubanFm的第一个子节点.

基本完工, 先通过浏览器打开http://127.0.0.1, 点击一下链接测试吧.

继续通过手机浏览器访问你电脑的地址, 就可以了. 当然, 如果你嫌我们之前的网页太过丑陋的话, 可以自己写一些好看的配色来, 这里我使用的是ajaxian提供的iphone的配色. 在手机中的效果如下(请原谅我用的不是iphone…):

接下来你就可以打开豆瓣电台, 然后跑到床上听歌爽去了, 当然要时不时的点一下加心才过瘾~

这不是终点, 前面的只是为了我们接下来的使用遥控器做的准备, 咱已经定购了微软MCE遥控器套装, 等它到货就可以使用遥控器远程控制玩了, 嘿嘿.

January 4th, 2010支出报告

鉴于自己花钱无度, 于是决定找一个记帐用的东西来. 同时考虑到自己会经常在家和公司间穿梭, 所以一个能在线记录的网站就最好了, 这样就可以同时在家里和公司里计帐. 刚开始的时候搜了一下相关的网站, 不过最后都放弃了(因为比较没有安全感, Web2.0的小服务指不定哪天就关了呢, 自己的数据放上面实在不放心啊…). 于是决定自己搞一个对自己靠谱的东西来.

最后决定使用GAE作为平台开发, 因为它有一些免费的流量和数据存储, 这些流量和存储对于我这种个人使用来讲是完全够用的了. 而且GAE已经有了自己的赢利模式, 再加上财大气粗的google, 估计短时间内也挂不掉, 所以就选了它啦.

于是在写出了一个小的原型(计帐和产生一个饼状图)后, 我就完全体现出了程序员的懒惰来 — 没人催的情况下, 东西只要够用就好, 实在是懒得完善它了.

之后我就充满热情的开始了计帐, 连每天两块左右的早餐以及买的一瓶水都要入帐, 这样持续了两个来月. 今天来了兴致看了一下这几个月的开销的报告, 下面上十一月份的:

report

可以看到我杯具的生活, 这里的吃饭的开销(午饭+晚饭)占了超过50%的比重, 如果再排除掉其他的像交通/药项目的话, 剩下的基本没有多少了, 可见我的娱乐生活是多么的空虚哪!

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, 然后并闭编辑功能并在里面填上当前的时间, 提交, 果然成功了:)

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