以前在google appengine上搭建过一个twitter api proxy(貌似叫birdnest ?),然后一直使用这个,无论是choqok看推发推,还是命令行curl来调用,都很好很和谐。可是后来twitter升级为oauth了,这个API代理就杯具了,一度导致我发推前还得开浏览器,无比烦恼。后来好像也还用过其他的api proxy程序,貌似也不好用。

一直琢磨着,是否该研究研究twitter oauth,自己给自己写个api proxy。刚好最近要学习php, 于是顺便看了看twitter推荐的oauth php库twitteroauth。代码下载回来后,还有个很详细的test.php——竟然这个库用起来无比简单!基本上只需要这样:

1
2
3
$parameters = array('status' => 'new test status ...');
$connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, OAUTH_TOKEN, OAUTH_TOKEN_SECRET);
$response = $connection->post('statuses/update', $parameters);

而之前一直很纠结的oauth第一次要跳转到twitter验证的问题(没看那头疼的文档唉),忽然发现其实只是去获取token, token_secret罢了。于是直接预先填写到代码里(反正也只是我个人使用!),一切就简单方便了~~~

不过对于我这个php初学者来说,还有个问题。要想支持全部API代理(例如要给choqok用),写死’statuses/update’肯定是不行的。必然得用到url rewrite之类的。于是又研究了一下,发现可以这样写:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function get_twitter_op(){
    $doc = "^".$_SERVER['DOCUMENT_URI'];
    $uri = "^".$_SERVER['REQUEST_URI'];
    if (substr($doc, -1) !== "/") {
        $doc .= "$";
    } else {
        $doc = substr($doc, 0, -1) . '$';
    }

    $base_doc = str_replace('index.php$', '', $doc);
    $op = str_replace($base_doc, '', $uri);
    $op .= ".json";
    return explode('.', $op);
}

上面的函数就是从 ‘/twitterapi/statuses/update.json’ 这样的请求串中截取出 ‘statuses/update’命令和’json’格式。php的代码技巧完全不懂,上面的代码肯定写得很烂。莫笑。

所以,总结起来,这个极简的twitter api proxy,就是这么写(twitteroauth库里的俩文件OAuth.php, twitteroauth.php放在include/下),保存成index.php就能使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?php

require('include/twitteroauth.php');

define('CONSUMER_KEY', 'SFtcUBB5IImkmpff2ezVg');
define('CONSUMER_SECRET', 'MXMSnSTJMgUYWEE1vMLy9tVqJHK6Bcoszlalal');
define('OAUTH_TOKEN', '112133312-lalalal');
define('OAUTH_TOKEN_SECRET', 'lalalala');


function get_twitter_op(){
    $doc = "^".$_SERVER['DOCUMENT_URI'];
    $uri = "^".$_SERVER['REQUEST_URI'];
    if (substr($doc, -1) !== "/") {
        $doc .= "$";
    } else {
        $doc = substr($doc, 0, -1) . '$';
    }

    $base_doc = str_replace('index.php$', '', $doc);
    $op = str_replace($base_doc, '', $uri);
    $op .= ".json";
    return explode('.', $op);
}


$response = "request method is not support.";
$args = get_twitter_op();
$connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, OAUTH_TOKEN, OAUTH_TOKEN_SECRET);
$connection->decode_json = false;
$connection->format = $args[1];
if ($_SERVER['REQUEST_METHOD'] == 'GET'){
    $response = $connection->get($args[0], $_GET);
} else if ($_SERVER['REQUEST_METHOD'] == 'POST'){
    $response = $connection->post($args[0], $_POST);
}

echo $response;
?>

我用的服务器是nginx, 搭配的rewrite规则是:

1
if (!-e $request_filename){rewrite ^/toap/(.*)$ /toap/index.php last;}

代码丢在了github上的项目toap里, apache的rewrite规则文件也在其中。

, ,

11月某个周六。秋天。阳光明媚,天气甚好。快到中午时,先去某餐馆团购吃了一顿,然后搭地铁前往深圳会战中心观看高新技术成果交易会。

之前一次来看某展,只需递名片即可的,本次高交会门票¥50,还要简单填写信息表格。可见供不应求。
高交会门票

晃悠进去,是1号馆,大约是电器点子产品馆。才走不久,发现貌似展览军用笔记本的摊位,各种锤打、水浸、高频震动轮番虐待,果然展示了军用产品的强大。下图就是某本本在“瀑布”下,依旧欢快地播放电影呢。
高交会之一,军用笔记本

走着不久,又发现一个有意思的投影游戏。投影仪从天花板上往地板上投影出一篇水潭,里面有鱼不时游动。然后可以伸手进去“抓鱼”。手臂才伸进去,投影的水潭里就会像真水一样出现阵阵涟漪和水纹,而且那鱼貌似也会往旁边躲闪。很好玩啊。
高交会之二,投影抓鱼

然后又走到了上海区某摊位,展示的貌似是城市园林建筑科技。然后发现了这个石板,由石子们紧密团结在一起组成,然后有个水龙头哗哗地流水其上以展示其渗透性。看起来挺好的,只是不知道这些水渗下去之后会不会被胶水染上啥微量毒素?
高交会之三,精紧密团结的石子地板

会场挺大的,人也很多,走得也很累。抓拍一张人少一些的镜头。
高交会之四,路边

走完地区展馆,来到了大学展馆。忽然发现深圳大学的这个摊位在展示“磁悬浮”。一个铁球就这么悬浮在空中,很好玩啊。下面还“吸住”了一堆的硬币。不知道以后的人类社会的柜子啥的,会不会也是这样直接悬空的呢?
高交会之五,深圳大学的磁悬浮

然后,我就这么走啊走,也不晓得走到了哪个展馆。忽然之间眼前一亮,前面有个摊位竟然号称“黑店”!而且还是“中国第一黑店”!天啊,这种夸张的广告手法竟然用到了高新技术展馆里!而且果然有一票人被吸引住了……其实这只是卖竹炭而已嘛。。。
高交会之六,第一黑店!

再接着转悠,到了农产品技术展馆。然后发现一条两三米长的某瓜(丝瓜?黄瓜?不晓得这是啥农作物),就这样被人挂起来当装饰……
高交会之七,农产品

再然后,走到了TCL这里,发现竟然有3D电视!旁边也没有解说人员,不过似乎这电视是不需要特殊眼镜的?有一段视频,是几袈飞机飞呀飞的,立体效果不错;接着就是一堆钱币狂喷(下图),这效果就太晃眼了。。。
高交会之八,立体电视

当然啦,这种大型展馆,怎么会缺少美女模特呢??下面这个图就是某平板电脑的展览。。。据美女们说“有各种型号,任君选择”哦!
高交会之九,当然也需要美女衬托啦

才看完美女,乐滋滋地继续看,结果赫然发现有人体彩绘的!!OH, MY EYES!!这是展示神马高新技术啊!新涂料?不过恐怕无数围观群众只是盯着美女的裸体而已吧。。。(图片拍得甚是模糊,因为人实在是太多了。。。真挤啊)
高交会之十,甚至还有人体彩绘

然后就基本看完了。工业机床设备、机器人、医疗设备啥的就不贴了,貌似离一般人太遥远了。

也算是了解了行业的最新状况。不虚此行。

高交会之结局,明年再相见

(感谢我的朋友友情演出。)

昨天,我的fcitx 3.6.3又出现了用户词库段错误的问题。激活fcitx后,fcitx自动加载词库,然后就悲剧了。这些年来,这个问题出现了有4、5次了,于是决定fcitx-trunk-svn包,顺便也安装了图形化配置工具fcitx-config,开始了我的Fcitx4体验之旅。

=========== 很长很纠结的背景 =================

Fcitx4有许多变化。例如配置文件的编码都由gbk变成了UTF-8,用户配置也有了更新(所以旧配置可能不兼容了)。不过最直接的、第一眼就能发现的变化是——Fcitx4有了皮肤功能。

图中是Fcitx4的“default”主题(默认主题),候选字的颜色搭配有些诡异,亮黄色真的不适合……不过,自带的另外一个主题“dark”很是不错,浮动栏很有Mac的感觉,灰色系感觉很低调(真适合我)。而且这个主题是有半透明特效的(当然窗口管理器要支持,例如KDE4自身要开启桌面特效),真是给力啊!

当然,自带的三个主题中,剩下的一个是我最喜爱的“classic”主题。经典啊!!简约的选字框和浮动栏,白底蓝字,Fcitx的味道。

另外一个变化,就是浮动栏的右键菜单增强了。可以快速更改Fcitx4的主题,更改输入法方案等。

右键菜单中的“配置Fcitx”恐怕是很多人梦寐以求的功能吧??悲催的是,它直接调用了系统文本编辑器……不过,幸好csslayer同学还写了一个fcitx-config图形配置工具,安装了以后,“配置Fcitx”就会弹出图形配置工具了。不过遗憾的是,csslayer同学身为专业KDE党,竟然用GTK来写……无语了……

====== 离开华丽的外表,深入枯燥的内涵吧 =======

回到最初csslayer同学推荐Fcitx4的原因上。他说,Fcitx4支持了挂多个拼音词库,这个功能避免了每次更新新词汇时,都需要完整更新/usr/share/fcitx/data/pyphrase.mb文件的弊端——慢、大、繁。

允许挂在多词库后,我可以把搜狗的流行新词(约4000条)制作成一个小的top-sogou.mb文件,放在$HOME/.config/fcitx/pinyin/中作为额外词库加载。这个额外字库才170KB,Fcitx4加载后的内存占用也只是增加了1M(想我用了fcitx.googlecode.com上的phrase_small.mb,竟然耗费了85M内存),然后,“小月月”等词汇成功也出现了~~

外挂多词库的功能,基本上算是一个“自定义”词库的功能,用户可以根据具体需要挂载需要的词库,例如我就挂了(来自搜狗的)计算机词汇、流行新词、成语俗语等词库,然后感觉Fcitx的词库的词汇质量有了很大提升啊!太给力了!

目前,我正在欢快的使用Fcitx4撰写博客。。。嗯,舒服啊。。。