载入中…

文章标签 ‘折腾’

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的使用,想必我不用多说了。

全部的源代码在这里

Ubuntu创建桥接网络[极度简单]

2011.05.08 | 天气: | 标签: , , ,

最近寝室的有线ADSL到期了,台式游戏机就不能上网打EVE了,但是有WIFI接入功能的还可以用其他寝室的网络,然而那个疼的我的笔记本上只装了Ubuntu,可我又不会配置/etc/network/interfaces……

大致情况如图

阅读全文 »

飞机云-JS动画-HTML5小实践

2011.05.01 | 天气: | 标签: , , , ,

觉得静态的飞机云不够美,干脆搞成动态的,原理还是很非常简单,对背景的偏移量做出调整,用了JQuery选择器(这东西太好用了)和HTML5的本地存储(来保持动画的一致性)。
最终效果图 演示地址

首先准备两张背景图(GIF的alpha质量有问题,用了透明的PNG,IE6核心的直接无视了)

然后开始码代码

function head_animate(){
//speed = Math.round(618*Math.sin((i/114)));这条是实验渐入样式,发现不好看,姑且留着
var x = localStorage.offset_x;
var y = localStorage.offset_y;
speed = 3820-y;
x-=3;y--;//为什么是3:1请看下面的注意
localStorage.setItem('offset_x',x);
localStorage.setItem('offset_y',y);
x_y=x+'px '+y+'px';//Jquery对于简写的属性两个以上的变量不支持,所以用拼字符串
$('#page').css( {backgroundPosition: x_y} );
//$('#head_s i').html(' i:'+i + ' speed:'+speed );
if (y > 14){
//距离顶部还有14px的时候停下
var ht=setTimeout('head_animate()',speed);
//速度会越来越慢
}
}
/*Jquery的启动*/
$(document).ready(function(){
//header animate
//这两个是我主题的偏移量
if(('localStorage' in window) && window['localStorage'] !== null){
var x = localStorage.offset_x;
var y = localStorage.offset_y;

if (x == null || y == null){
//首次启动
x=628;y=110;
//存储值
localStorage.setItem('offset_x',x);
localStorage.setItem('offset_y',y);
}
var ht=setTimeout('head_animate()',5000);

}
else{
//IE!老浏览器随便给个地方算了
$('#page').css( {backgroundPosition: '500px 40px'} );
}
});

需要注意的是飞机云图片的角度,因为电脑是一个个像素点组成的,不能用非整数,用非整数的话飞机云就会跳动起来。角度折换成图片的宽高比,我的是3:1(1:1即45度效果是最好的,但是对头部的高度要求不是一般的高)。飞机云可以在最后放上渐变到消失,不过我现在还没这样的打算哈,因为这样图片会大得多。

因为使用HTML5的本地存储,所以飞机云一旦飞到一定高度之后以后永远停在上面了,所以哈,同志们朋友们要视这玩意作为陪衬哈

参考了 丸子的HTML5本地存储

博客调用QQ昵称的歪门邪道

2011.02.27 | 天气: | 标签: , , ,

大家可以到博客任何文章页面或者我的留言板邮箱那栏输入自己的”QQ号+@qq.com”,在名称那栏应该会自动填写你的QQ昵称。当然,如果你输入的不是QQ号(有字符的QQ邮箱),不会判断而是读取然后填写。

代码呢是非常简单,共计454Byte:下载qq_nick.js
要插到哪你应该懂的,要不然请看看w3shcool的javascript教程
至于这个方法真是非常聪明,当然这不是我想出来的,我哪有这么聪明,只是改装了一下,大神的帖子在:

alibobo.5d6d.com/thread-291-1-1.html

如果你有闲工夫可以听我给你说说整个故事

事情还得从上次搞了个从邮箱智能判断用户的javascript之后说起,有位大姐姐在我这用自己的QQ号留言了,一是暴露了自己的QQ号,二是太生硬了;所以我一直在想能不能调用QQ昵称。然后实验了各种方法,ajax异步调用资料失败,原因是Firefox和Chrome之流不允许跨站调用(IE这次倒是愣头青),所以呢,就只好用大神的方法了,大神的方法聪明之处在于他对那段url请求的返回的理解
比如262652047(我的Q号)返回值是
_Callback(
{"uin":262652047,
"qzone":1,
"nickname":"#!卓",
"offsetBirth":51,
"avatarUrl":"http://qlogo4.store.qq.com/qzone/262652047/262652047/100"});
返回了一个类似函数的东西,大神真是灵光,既然返回了一个函数,就不如用函数调用呗,所以就有了最开始的那个_Callback(函数(而且Firefox也认为这只是一个站外脚本调用,没卡死),然后把他们一一填写到各自的输入ID值里(input id),当然,返回值还有头像地址啊,空间啊什么的,不过在我的博客里不需要,所以我去掉了。

顺带解决原来版本的问题:

  1. 不能多次请求(其实是变着方构成新的函数)
  2. 没有出错处理(超时啊、没有办法获得用户名等问题)

小结一下

从调用QQ昵称的全新方法,可以看出活在一个聪明人比你多的世界真是种幸福啊。

才发现原来Javascript & DHTML Cookbook P56已经讲了这事,真是看书不仔细……