Ubuntu 上安装 ibus云拼音输入法

May 17, 2011 2 comments

ibus云拼音 是一个可以利用在线词库的ibus 输入法。目前 Ubuntu 11.04 默认的输入法框架就是ibus。安装方法参考wiki,不过需要仔细看评论。我说一下目前我已知的  Ubuntu 上最简单的安装方法。

sudo apt-get install liblua5.1-0-dev liblua5.1-socket2 libsqlite3-dev libibus-dev libnotify-dev lua5.1 libgee-dev sqlite3 valac-0.10
sudo update-alternatives --config valac
svn checkout http://ibus-cloud-pinyin.googlecode.com/svn/trunk/ ibus-cloud-pinyin-read-only
cd ibus-cloud-pinyin-read-only
make
sudo make install

然后登出,重新登录,在ibus配置中应该能找到了。

说明一下,这个项目去年年底作者就没更新了,wiki 里面说的方法,现在有点问题。Ubuntu 的软件源上的valac 版本到了 0.12, 而ibus云拼音并不支持valac-0.11 以及以上版本,valac也没有保证向下兼容,所以apt 安装 valac 需要指定 0.10版本。我尝试过修改ibus-cloud-pinyin 项目代码,使其支持 valac-0.12,目前基本可用,但是不稳定,曾让我桌面两次崩溃并退出到登录界面。还有个问题,是valac依赖于 libnotify 0.7,ubuntu 上目前只有 libnotify 0.5,所以有些统计信息的展示我暂时去掉了(这个问题我还给ubuntu报了一个bug)。我修改的代码放在git 上了,有兴趣的同学可以帮忙改进一下。

Advertisements
Categories: Ubuntu

Dabr for weibo

April 30, 2011 5 comments

Last update: 2012/10/1

最近又更新了不少,另外我决定停止开放源代码。我直接在原文中删改。

Dabr for weibo 是一个新浪微博类似Dabr 的Mobile web第三方。做这个第三方应用的主要目的是尽量 减少新浪微博的信息重复和信息干扰。

Dabr for weibo 最开始是 @timyang 改的,我在他的基础上做了些完善。目前github 上代码已经停止更新。

最近做了一次更新,v2ex 上有些更新说明。

在这里我说一下使用这个第三方的理由吧。

1. 界面元素简单,加载速度快(审核通过后才能用上)。

上面提供的两个地址,服务器都是新浪云计算平台,说不定都在一个机房,网络延迟很小。dabr 本来就是为手机浏览器设计,加载的数据不多。绝不会出现新浪微博首页,加载N久,chrome 还在转圈圈。

2. 信息聚合

有些消息,比如时事新闻,很多情况是,你的 follower 中有多人 retweet 这个消息,于是重复的信息你会看n 遍。这大概是 twitter 主站仅支持保持全文 + 作者的官方 retweet 原因之一。于是一个消息,多人 retweet,你只需要看一次,然后看 retweet 次数得知消息的热度。我本人是对信息重复很反感,所以在 dabr-for-weibo 中加入了根据转发原文聚合。转发理由,仅完整显示最新转发人发的,不过也会有一个转发的关注人列表。

说下现有的问题。

1. 硬伤是新浪微薄  api v2 做了很多限制,暂时无法调用搜索、私信接口。

2. 因为审核相关的问题,不能改应用名称,以及来源地址。

3. 英文界面,无汉化版。这是上一次审核不通过的理由。

4. 暂时没做消息提示,认证用户标记等。

另外,新浪的SAE 在 dawbr.sinaapp.com 的登录时容易报内存不足。好像是因为代码中我用了 debug_backtrace() 函数,导致内存不足。后来我做了些调整。SAE 给php-cgi 进程的内存是不是少了点啊。。

 

Categories: Dabr, Weibo, 新浪

Android平台翻墙方案总结

April 10, 2011 6 comments

跟国家防火墙干上了有两年了,弄得本人都有点人格分裂。因为我长期不用Windows,PC上的方案我就不说了;Android平台我相对熟悉,所以简单总结一下。其实理论上都差不多,只是Windows 系统上,有一些商业公司提供的闭源翻墙工具。

1. 支持所有网络的 web proxy。一个典型的工具是 google 的移动设备的适配服务:http://gxc.google.com.hk/gwt/x?u=http%3A%2F%2Fdeveloper.android.com。类似的翻墙方式google translate的网页翻译也能实现。另外就是别的web proxy, 以前有发过总结这种项目/工具的总结 web-proxy 评测报告 。这种方式有局限,你不能触碰关键词(特别是 URL 中,这种代理一般是http的)。如果有支持 https 的web proxy 服务,就比较理想了。

2. 仅支持移动网络(如GSM, WCDMA)的 HTTP Proxy。这一般需要你在国内有一个主机,然面运行个如squid 的HTTP代理程序(我之前是在服务器上用 gappproxy 做的公共HTTP 代理,不过现在GAE已经连不上了);手机上的移动网络接入点设置中,填写HTTP代理ip以及端口。这种方式可以让自带的 chrome lite 浏览器走代理。其它的浏览器和应用程序不一定会使用这个代理。(Andorid 系统似乎可以在数据库中为每一个应用程序设置代理,但是能够保证应用程序一定使用这个代理吗?我估计不能。)

3. socks代理方案。典型的工具如是 TransProxy ,是一个简单设置全局代理的工具,可以配合connetbot 端口转发功能,做系统全局的透明代理。对于大陆用户,TransProxy 的缺陷在于不能处理dns劫持。目前我比较看好的一个项目是 sshtunnel,功能很强大,可以处理dns劫持。sshtunnel的配置有点复杂。有两种代理工作模式:a) 本地socks 代理,如果只有一个ssh帐号,需要开启这个方式;b) 远程socks代理,需要在服务器上开squid代理,这样做的优点在项目issue 里有说明:http://code.google.com/p/sshtunnel/issues/detail?id=8&can=1,不过文档不够清晰,还需完善。这种方案的原理可以看我上一篇日志中有说明,它的的好处是,可以保证应用程序使用你的代理;可问题在于,这个方案需要root权限用 iptable 做端口转发,对于普通用户门槛较高。

4. 国外VPN。目前而言,买个VPN自己用是最省心的翻墙方案,Android系统上可以直接配置。推荐下 @xiaodin店铺(非广告,纯友情链接)。

Categories: Android

使用 redsocks 作强制的系统全局代理

April 7, 2011 7 comments

本文介绍利用 redsocks 做强制的系统级全局代理,在Ubuntu 以及Android 系统上实现SSH翻墙。Ubuntu 上可以设置系统的网络代理,但是这只是一个系统配置,是否使用这些配置还是由应用层决定(如Firefox可以选择 “直接连接” 或者”使用系统代理设置”)。强制80、443端口走代理,可以省去应用层设置,这种方案可以用于 android 系统翻墙。本文主要介绍的PC上的安装方法,但是这种方案对于普通PC用户而言,对比简单ssh socks代理并无优势;本文的目的主要是为Android 系统翻墙提供一个可行的方案。

可以认为本文是 @bjin 的 redsocks on android指南(墙外) 的补充(我建议大家先看一遍原文再回来),针对原文中提到的 redsocks 方案中 dns解析问题,提供一个解决方法,并能够在PC上进行演示。我认为redsocks 方案中,不论何种代理类型,dns解析问题都会存在,因为是透明代理,dns解析都会在浏览器上直接进行。另外,“国内干净无污染的dns”很难找,不会有公共的,只能自己搭建一个。此前我特地考察了下 v2ex dns,是放在linode 上的,也不行(dns污染的原理,大概是监控所有出国的dns请求,如果发现“非法”域名的dns,gfw会抢先返回一个错误的结果,所以仅仅换用国外的dns 不能解决问题。详情参考:深入理解GFW:DNS污染, 墙外)

安装 redsocks

首先说下 redsocks 以及 iptables 安装、配置。编译 redsocks 过程很无痛的,仅仅依赖于 libevent:

mkdir /opt/src
cd /opt/src
git clone https://github.com/bjin/redsocks
cd redsocks
sudo apt-get install libevent
make

控制脚本(参考原文做了些改动)redsocks.sh:

#! /bin/sh

case "$1" in
  start|"")
    cd /opt/src/redsocks
    if [ -e redsocks.log ] ; then
      rm redsocks.log
    fi
    ./redsocks -p /opt/src/redsocks/redsocks.pid #set daemon = on in config file
    # start redirection
    iptables -t nat -A OUTPUT -p tcp --dport 80 -j REDIRECT --to 12345
    iptables -t nat -A OUTPUT -p tcp --dport 443 -j REDIRECT --to 12345
    ;;

  stop)
    cd /opt/src/redsocks
    if [ -e redsocks.pid ]; then
      kill `cat redsocks.pid`
      rm redsocks.pid
    else
      echo already killed, anyway, I will try killall
      killall -9 redsocks
    fi
    # stop redirection
    iptables -t nat -F OUTPUT
    ;;

  start_ssh)
    ssh -NfD 1234 user@example.cc #TODO: change it!!!
    ;;

  stop_ssh)
    ps aux|grep "ssh -NfD 1234"|awk '{print $2}'|xargs kill
    ;;

  clean_dns)
    iptables -A INPUT -p udp --sport 53 -m state --state ESTABLISHED -m gfw -j DROP -m comment --comment "drop gfw dns hijacks"

  *)
    echo "Usage: redsocks start|stop|start_ssh|stop_ssh|clean_dns" >&2
    exit 3
    ;;
esac

配置文件 redsocks.conf:

base {
	// debug: connection progress & client list on SIGUSR1
	log_debug = on;

	// info: start and end of client session
	log_info = on;

	/* possible `log' values are:
	 *   stderr
	 *   file:/path/to/file
	 *   syslog:FACILITY  facility is any of "daemon", "local0"..."local7"
	 */
	log = stderr;

	// detach from console
	daemon = on;

	/* Change uid, gid and root directory, these options require root
	 * privilegies on startup.
	 * Note, your chroot may requre /etc/localtime if you write log to syslog.
	 * Log is opened before chroot & uid changing.
	 */
	// user = nobody;
	// group = nobody;
	// chroot = "/var/chroot";

	/* possible `redirector' values are:
	 *   iptables   - for Linux
	 *   ipf        - for FreeBSD
	 *   pf         - for OpenBSD
	 *   generic    - some generic redirector that MAY work
	 */
	redirector = iptables;
}

redsocks {
	/* `local_ip' defaults to 127.0.0.1 for security reasons,
	 * use 0.0.0.0 if you want to listen on every interface.
	 * `local_*' are used as port to redirect to.
	 */
	local_ip = 127.0.0.1;
	local_port = 12345;

	// `ip' and `port' are IP and tcp-port of proxy-server
	ip = 127.0.0.1;
	port = 1234;

	// known types: socks4, socks5, http-connect, http-relay
	type = socks5;
}

启动:

./redsocks.sh start_ssh
./redsocks.sh start

关闭:

./redsocks.sh stop
./redsocks.sh stop_ssh

start_ssh 和 stop_ssh 两个动作是相对独立的,用于开关代理。只需要保证 redsocks 运行时,代理正常工作即可。android 手机上,ssh 隧道应该可以直接用 connnectbot 建立。

安装西厢的反DNS污染模块

redsocks 启动之后上国内网站基本没问题了。但是 twitter 可能还上不去。原因在于浏览器不知道你设置了代理,于是自己去解析dns,而dns解析用的53端口没有通过代理。因此我们还需要把dns 的问题解决掉。
目前来看,西厢计划中的反dns污染模块还是可以工作的。我们装上这个模块给装上,就不需要自己架无污染的dns服务器,绿色环保。
PC安装西厢,我今天自己做了一次,参考我的tumblr:记录一下Ubuntu 10.04 上西厢的安装过程
我把开启的命令也写在上面的控制脚本里了:./redsocks.sh clean_dns 。这一步建议做成开机自启动,因为一直开着也没坏处。
scholarzhang 项目的android 移植,参考 @tewilove 的 liujinyuan 项目,以及 @tewilove 这篇总结(为避免一些可能的麻烦,我把内容复制出来了;tumblr 上有原文链接)。另外,我希望能有人把西厢中的反dns污染代码单独抽离出来,放在github上单独维护,或许能简化安装过程,有志于参与开发的同学们也更容易理解。

Categories: Android

面对互联网的的内容管制,我们能做什么?

March 14, 2011 2 comments

标题说得不是很准确。我想问的是,作为互联网高端用户、以及互联网从业人员,我们可以一起做些什么事情,让互联网信息尽可能地真实、有效,并能够为普通用户产生价值。

从这个目标上来讲,很多由用户产生内容的网站,千方百计地保护、控制自己内容的行为,是很自私的。Google 一直提倡数据共享。网络关系以及平台中,最容易导出的是Google,twitter 和facebook 平台应用接入都不难。最难的是腾讯。我认为,正是因为这一点,腾讯的高端用户开始逐渐往新浪微博和豆瓣转移。

联系人仅仅是用户关系网络。而一个网站的价值,除了用户的付费行为、广告点击行为带来的价值,剩下的就是用户产生内容本身的价值了。

在一个封闭的社交网络里,用户内容本身的价值并不大。比如QQ空间。相对而言,用户分享的站外内容的质量相对要高。所以我这里先不讨论社交网络,而讨论下搜索引擎可以索引到的公开内容。

Twitter 和 Google 合作做实时搜索,应该是twitter 把数据主动给google 推送的。然后google 帮twitter 做索引,用户搜地震,就可以看到最新的twitter 消息了。

而新浪微博,我一直不理解的一点是,新浪宁愿花大价钱做实体平面广告,缺不愿意把数据开放给搜索引擎。前不久发现的一大悲剧是,新浪微博手机版(t.sina.cn)的 SEO 比Web版(t.sina.com.cn) 的还要好,但是普通的手机版浏览器不能直接打开(另外这种高 SEO 还是有安全漏洞的)。新浪微博第三方应用似乎也有开放搜索引擎的。所以,普通用户搜到微博的内容,若不是网站莫名其妙打不开,就是一个长满了广告的微博第三方。

这是一个很大的资源浪费。看CCTV过来的用户,普遍不如Google 搜来的用户质量高。

新浪微博的内容价值不可否认,它已经发展成为国内的一大相对自由的言论平台(比如相对高校BBS),也是一个可以跟业界各种V直接对话的地方。但是新浪微博一直不太喜欢开放自己平台的内容(似乎主要是害怕竞争对手的内容复制,但是这种行为在技术上来讲也不可能完全避免),因此我想给新浪微博做一个搜索引擎的入口。

https://github.com/liruqi/dabr-for-weibo

我计划把通过新浪认证的用户、以及dabr-for-weibo 用户的内容自己存储一份,然后对搜索引擎开放,提供rss输出。内容不做审核。

希望这种行为不犯法。

我另外的一个计划,是给 p2p 网络开一个 web 入口。这个是基于 simplecd 做的一个php版本。打算从这个做起。https://github.com/liruqi/lijingru

我希望通过搜索引擎就能到达这个世界任何一个黑暗的角落。

PS:本人十分乐意接受国外服务器的共享或者捐助。

PS2:本人最近身体不适,本文思路也比较混乱。大家将就着看吧。

Categories: Uncategorized

国家图书馆的中国国籍问题

March 12, 2011 1 comment

今天是我第一次来国图。主要原因是周末变得无所事事了。住处离国图又很近。

总体上来说,印象不错。上午一开始进的是旧馆。用了下电脑,然后中午办了张读者卡。后来去新馆。发现月初馆内的wifi 免费了。新馆的环境很赞。书很多我还没仔细翻。现在生活上对网络依赖很严重。其实我不过是找到了一个不错的“生活休闲”处而已。

说下中午在旧馆办卡那阵子看到的一个国籍问题。

一名年纪大概40多岁的中年男人,在大厅跟工作人员咨询办读书卡的事情。可能下面记录的字句不完全一致,但大概就这个意思。

男:请问非中国国籍,可以办读者卡吗?

女工作人员:只有中国国籍才能办;不过没读者卡也可以进阅览室,但不能外借图书。

男:台湾籍可以办卡吗?

女:台湾也属于中国,可以的。

男:那,国籍是澳洲呢?

女:澳洲就不算中国籍吧。

然后中年男走了。

台湾算不算中国暂且不说。这是我第一次体会到,持中国国籍在本土的优越感 😛

Categories: Uncategorized

给 wordpress.com 博客做反向代理

February 26, 2011 5 comments
做这个的起因是之前 @annsherry_ 希望给自己的博客(http://annsherry.wordpress.com/) 绑定一个独立域名。我看了下后台配置,发现 wordpress.com 不让用A记录的方式配置,要想绑定域名,需要把自己的域名 nameserver 改成 wordpress的,让wordpress 帮你解析。作为一名互联网工作者,这种霸王条款当然是深深伤害了像我这种高端用户的感情。所以研究了一下用自己的主机给 *.wordpress.com 做反向代理的方法。研究过程很纠结。我先把结论拿出来,然后大概解释下为什么。

比如,我希望把 annsherry.wordpress.com 绑定到 liruqi.me。步骤如下:

1. 重新编译 nginx, 加上 HttpSubModule(http://wiki.nginx.org/HttpSubModule) 模块。简而言之,是 ./configure 时加上参数 –with-http_sub_module 其它参数保持不变即可。
2. 修改Nginx 配置。在 http 块中加入 server:
server {
listen   80;
server_name liruqi.me;
location / {
proxy_set_header  X-Real-IP  $remote_addr;
proxy_set_header  Accept-Encoding  “”;
sub_filter annsherry.wordpress.com liruqi.me;
sub_filter_once off;
}
}

3. 启动 nginx 或者重新加载配置文件.

只要 域名 liruqi.me 是指向正确的主机ip, 反向代理就做好了。而且点链接不会跳回到 annsherry.wordpress.com 域名上。

大概说下原理。
a) *.wordpress.com 上的连接不少是绝对路径。如果直接proxy_pass ,再点一次连接就会回到 wordpress 域名上。所以这里做了一个简单的文本替换。

HttpSubModule 仅支持单模式的纯文本替换,不支持正则表达式。如果希望用正则,做一个更复杂的替换,可以考虑一个华人开发的 HttpSubsModule (http://wiki.nginx.org/HttpSubsModule) 第三方模块。

b) proxy_set_header  Accept-Encoding  “”;  这一项,可以让nginx 不法送 Accept-Encoding HTTP header。这个时候,wordpress 返回的页面是不做 gzip压缩的。因为gzip 压缩之后,文本替换就会失效了。
国外有VPS的同学(而且ip没被墙的),可以考虑用类似的方式给自己的 blogspot 或者其它博客做反向代理。
另外,我现在没有给自己的 liruqi.com 做反向代理了(之前是反向代理到 appspot 上的 micolog),而是直接跳转到 https://liruqi.wordpress.com/。另外,我也建议大家少自己折腾搭建博客,不止一次见过把博客做在 VPS 上,然后因各种原因丢数据。而数据的价值,远大于技术本身。
Categories: nginx