载入中…

如何让Ubuntu启动提速50%与Upstart使用

2011.08.18 | 天气: | 标签: , , ,


不得不说10.04以后的Canonical为了让Ubuntu启动速度加快下了相当大的功夫:不惜去掉传统的rc.X,init.d等,换成能并行启动处理的Upstart,还单独开发了ureadahead这个软件来预加载所有可能读到的文件。我觉得还是应该还真面目以正视听。我的机子按2011年的配置来说是相当老爷机和落伍了,可是启动经过调整后可以达到32秒
而且蓝牙、HAL、WIFI必须的程序没有移出启动队列
首先得说说我的基本配置:

ThinkPad X200s
CPU:Intel Core2 SU3500-1.40GHz[单核]
内存:DDR3 1333 4GB
硬盘:HDD WDC WD2500BEVS 250GB 5400RPM

软件与平台:

Ubuntu 10.04.3 LTS
ureadahead 0.100.0

那么怎么做到的呢?
< 阅读全文 >

HTML5之语音输入

2011.08.15 | 天气: | 标签: ,

谷歌的网站是时逛时新啊,今天在他们首页发现了HTML5的新玩法——语音搜索。可惜的是只有webkit核心的浏览器才能使用。用法很简单
只需要在input添加属性x-webkit-speech即可,例子如下:
<"input type="text" x-webkit-speech /">
这样你的输入框右边里就多了个「小话筒」,点击的时候就会提示

这时说出来识别后就可以了,我测试下来,中文英语的识别率还挺高的。

语音输入其他属性:

  • lang

    这玩意可以强制输入框里面的语音的语言种类,例如
    <"input type="text" x-webkit-speech lang="zh-CN"/">

  • 语音事件

    目前已知的只有onwebkitspeechchange,顾名思义,就是语音发生变化时触发的事件,一般可以作为提交
    <"input type="text" x-webkit-speech onwebkitspeechchange="$(this).cloest('form').submit()"/">
    这样说完以后就自动搜索了

  • x-webkit-grammar

    这个不是语音搜索用的属性,但是可以控制这个输入的语法,例如在做搜索框的话就可以用
    <"input type="text" x-webkit-speech x-webkit-grammar="builtin:search" /">
    使得语音输入的内容尽量靠近搜索内容,去除多余的字符,例如「的」

这个功能相当有趣,实用就不敢恭维了,主要是因为适用范围太小啊,所以只能希望HTML5尽快统一并应用了。

Rhythmbox插件编写教程指北

2011.08.12 | 天气: | 标签: , , , , , , ,

写了个Rhythmbox的插件以后才发现这方面的中文教程简直是0的状态(百度连鸟语的都不知道),介于我是python新手,C语言全部还给老师了,所以不敢说这篇文章是指南,权当这是中文关于Rhythmbox插件编写的0.5篇文章吧。具体的最好还要参考Rhythmbox官方的指南
++++++++++++++
示例的源代码
++++++++++++++

首先,想好一个插件名字吧

教程里,我就用「RB_notify」。
要清楚用python写Rhythmbox的插件机制其实很简单——写好两个文件就可以成个插件
RB_notify.rb-plugin__init__.py
前者负责解释你这插件叫啥、作者是谁等,后者是程序的入口,把他们放到$HOME/.gnome2/rhythmbox/plugins/notify里面就可以运行了,很简单是吧。

翻翻notify.rb-plugin

[RB Plugin]
Loader=python
Module=RB_notify
IAge=1
Name=RB Plugin Example
Name[zh_CN]=RB插件例子
Description=This is an example of RB Plugin
Description[zh_CN]=这是个RB插件例子
Authors=Meng Zhuo
Copyright=2011 © Meng Zhuo
Website=http://mengzhuo.org/blog/

这个是插件描述文件,由于我们插件是python写的,所以前面的4个参数都不能修改,而Module后面的跟的是需要加载模块,这里和项目同名就好了。后面几个都不言自明了,所以很简单吧。光说你的插件是干啥的自然是不行,得用程序让Rhythmbox听话。

__init.py__程序登场

写过python程序的同学都清楚,大部分程序第一步是导入一定量的库,这样才能正常运行,我们的Rhythmbox程序也一样:

import rb

这个语句是必须的,因为这个库是Rhythmbox的缩写。其他的库像

  • gconf(需要配置的话)【教程】
  • gtk(需要图形的话)教程
  • gettext(推荐import,国际化用)教程同上

这里我们就只使用rb吧,这时候程序应该是这个样子的:

  • __init__函数是入口函数,每次插件运行的时候都先运行一遍里面的程序,里面一般第一句是添加self为RB插件的类。rb.Plugin.__init__(self)
  • activate函数是插件启动的时候执行的程序,这里就用简单的print吧
  • deactivate函数是插件关闭或者Rhythmbox退出的时候执行的程序,理论上之前创建了什么东西,就得销毁掉(用del命令),不赘述了。

检验成果的时候到了!

运行Rhythmbox -D RB_notify
打开插件栏,这时候就可以看见你的插件了。
启动插件后就会在刚才运行命令的终端里出现
(15:36:44) [0x6ea040] [RB_notify.activate] .gnome2/rhythmbox/plugins/RB_notify/__init__.py:15: Hello, This is a Example

做些有用的事

光是在终端里输出一些字符可不是什么有趣的事,所以要介绍RB牛X的地方,在于它的shell。在刚才的print后面添加
shell.props.shell_player.playpause(0)
这样,每次启动插件,这个RB就会暂停或者是播放。
当然这个shell没有这么简单,不只能控制播放、音量等,还能UI什么的,大家可以去他们的官网围观哈

PHP程序国际化小记[i18n]

2011.08.11 | 天气: | 标签: , , , , , , ,

Linux上的国际化基本都是由gettext来完成的,配合这.po.mo的使用,可以说是相当方便,PHP程序的国际化我还是第一次做,这里有篇文章讲得非常不错,我这就不存档了。
这里讲下我自己遇到的一些问题:

不能加载.mo文件

明明写好了.mo,路径也正确,却怎么也加载不上来。
得检查两个地方:

  • 主机是否支持这个翻译语言

    像我写程序和测试用的Ubuntu执行了locale -a后,只有寥寥几种en_US.utf8 zh_CN.utf8 zh_SG.utf8
    而在东哥的主机上测试的时候竟然有191种!而且细心的你可能注意到了,我的Ubuntu上只有两种中文:一个是简体zh_CN.utf8,和新马泰地区的zh_SG.utf8;而东哥的主机上有还有HK TW。所以测试的时候发现所有都写好了却不识别,要先看看主机是否支持。p.s.如果没有ssh,可以新开一个php文件,在里面写入
    echo system('locale -a');
    保存后访问即可

  • 编码问题

    编码国内常见的有utf8、gbk、gb2312三种,不过我个人觉得国标码太废柴了,写些别国的文字或者符号就直接趴下了,所以直接用utf8。
    setlocale(LC_ALL, $key.'.utf8');
    把这段代码加到php中,这样启用的语言和编码格式才能正确加载。注意utf8前还有一个点(这个小问题折腾了我至少10分钟才发现)

HTTP_ACCEPT_LANGUAGE读取问题

真心觉得这问题简直坑爹,因为浏览器传上来(即超级变量$_SERVER['HTTP_ACCEPT_LANGUAGE']里的值)的是「zh-cn」这样的格式,而gettext使用的却是「zh_CN」,大小写还不能搞错,还需要蛋疼地转化一下,这里我用了正则的替换
$name = preg_replace('/(\w+)-(\w+)?/e',"'\\1_'.strtoupper('\\2')", $name);
哈哈,聪明的你应该发现了,就算传上来像「zh」这样的函数,这条正则也会聪明地避开,反向引用和//e的使用,想必我不用多说了。

全部的源代码在这里

Rhythmbox小插件-耳机意外防止器

2011.06.29 | 天气: | 标签: , ,

不知道Rhythmbox是什么的童鞋,请无视这篇发布文章
用途请看图(画了1个小时……木有美术细胞没办法),其实这个问题我一直想找个插件,可是就是没有,只好自己做了。DEB下载地址

重新插上耳机的时候会自动地恢复播放

惯例一些废话:

  • 这个插件用的是Python+dbus,所以,如果你的耳机插孔没有被系统识别那我也没办法,目前我的X200上一切正常,理论上应该是支持所有耳机插孔的。
  • 插件有时会导致Rhythmbox卡死(原因未知……但不是BUG……),请清除插件目录下的.pyc文件,重启Rhythmbox。
  • 至于名字嘛……我真的想不出更好的了,有好的名字可以请发到我邮箱