openSUSE 下配合 nginx 搭建 qwebirc 网页 IRC

By marguerite | Published 2013 年 10 月 2 日 | 5 条评论

做这个的初衷很简单:IRC 对小白太远了。

它不像论坛,打开网页就能刷; 不像 QQ/Gtalk,软件是人都能找到,装上就能上。它需要专用客户端(比如 konversation),而且装完你还不能上,还有一堆命令等着你,何况还有 20 年早期互联网流传下来的各种名词、礼仪。总之它是一整个与世隔绝的黑客生态圈。

但是吧,不学还不行,你看哪个开发者不会使用 IRC 的?于是我想先降低一下它对小白们的陌生感,做一个给蠢人用的玩意。(成功把自己从其它蠢人中分离开以示区别哦耶!)

于是最蠢的来了:qwebirc,是一个自由开源的网页 IRC 客户端,最早是给 QuakeNet 游戏网开发的。这是目前我能找到的唯一一个开源的。

看了下,发现它居然不支持多语言!好吧,硬 hack 出了一个繁体中文版(别问为什么不用简体,因为硬 hack 就是只能使用一种语言,没有动态切换,那简体用户繁体一样能看懂,自豪吧?),语言文件下载点我。下载好覆盖就行,我用的是最新的 stable 版(2013-10-01),hg 版本号我写到文件夹里了,因为是硬 hack 的 js 文件,所以你换版本能不能用我真不知道。

安装依赖(openSUSE 下)

sudo zypper in nginx python-Twisted python-simplejson java-1_7_0-openjdk

下载

然后随便找个文件夹,因为 qwebirc 和 HTTP 服务器的关系不是常规那样的,常规是在 /srv/www/htdocs(又叫 webroot)下面放一些 html/php 文件,然后 HTTP 服务器让那个文件夹下面的东西能被访问,但是 qwebirc 其实是自己跑起来了一个专用的 http 服务器,为什么呢?据说是通用 HTTP 服务器设计不是用来服务大量的、长期活动的连接的,它们可以处理的是大量的但是都是一次性的连接,这种基于线程或者多进程的服务器(Apache 被点名了)没办法处理太多的这种连接,到时候会把你的网站一起拽下线呦!

但 qwebirc 的专用服务器是开在 9090 端口的,你不想访问 yourircserver.com:9090 这种丑丑的链接吧?所以你需要一个反向代理,还不能用被怒黑的 Apache。。。也就 nginx 了吧?好在我们别的服务器也是用的 nginx,因为 openSUSE 社区穷 VPS 内存小。。。

言归正传。找到文件夹了吧?然后在命令行下载最新的稳定版 qwebirc:

wget http://qwebirc.org/download-stable-zip

它没后缀但它是个 zip,解压:

unzip download-stable-zip

进入文件夹:

cd qwebirc-qwebirc-516de557ddc7

配置

把 config.py.example 复制为 config.py:

cp -r config.py.example config.py

打开

vi config.py

要改的我都写好:

  • 连接到的服务器

    IRCSERVER, IRCPORT = "chat.freenode.net", 6667
    

因为我们是网页客户端不是网页服务器端,我们要连一个服务器的…

  • REALNAME

    REALNAME = "http://irc.suse.org.cn/"
    

你要提供服务的那个网址

  • BASE_URL

    BASE_URL = "http://irc.suse.org.cn/"
    

同上

  • NETWORK_NAME = “openSUSE 中文”

你的客户端显示给客户看的「你叫什么名」字段。这里需要注意,如果你要用中文,要在这个页面的最上面加上这两行:

    #!/usr/bin/python
    # -*- coding: utf-8 -*-

因为它用 python2 写的,默认是英文编码…

  • Nginx 相关配置

    FORWARDED_FOR_HEADER="x-forwarded-for"
    FORWARDED_FOR_IPS=["127.0.0.1"]
    ARGS = "-i 127.0.0.1 -p 9090"
    

简单说就是在你 VPS 上的 127.0.0.1:9090 开一个网页 IRC,然后 Nginx 后面干的事就是把对你的某个网址比如 irc.suse.org.cn 的访问全中转给 127.0.0.1:9090 上。我不太懂,但听起来像是挺安全的,因为我觉得 127.0.0.1 只有登录到那台 VPS 才能用的嘛。

当然你也可以试试把前两个的 # 号继续留着,然后直接:

    ARGS = "-i 你的公网 IP -p 80"

没试验哦,估计这样就能直接开在你的 80 端口了,也不用 nginx 了。但这样做最大的问题就是你的那个公网 IP 也只能做网页 IRC 了。因为不管你怎么做域名解析,通过浏览器过来的都默认跑 80 端口就来到这里了,如果别的还用(我不懂网络那些哦),可能就会出现我前面 nginx 重定向配置错误时的情况,时而打开网页 IRC,时而打开你别的网站…

而用 nginx 做反向代理的话,那个 IP 还可以干别的。(我说的是 IP 不是域名哦,你不可能 irc.suse.org.cn 又当 wordpress 博客又当网页 IRC 的)

剩下的配置就留默认就好

编译和启动

这里其实我有点不能理解,它编译应该是把 *.py 编译为 *.pyc/pyo 才对,但事实上,你在 javascript 里面的硬翻译,也是由编译来管的…我刚开始先架设了一个英文的,然后本地翻译完,上传,我想 js 应该刷新网页就好了吧,结果不行…debug 了好久,后来在官网 Installation 指南看到

    Run compile.py to "compile the HTML/js/css"

整个人都呆掉了…

开始编译:

    ./compile.py

把它跑起来:

    ./run.py

它写的就比较有节操,自己会 fork 自己到后台,不像我之前写的那些 openshift 跑 python 的教程里面的脚本都要使用 nohup 来跑…

qwebirc 就配置好了。

Nginx 反向代理

    cd /etc/nginx

你是直接编辑 /etc/nginx/nginx.conf 还是建一个 /etc/nginx/vhosts.d/irc.suse.org.cn.conf 我管不着,反正里面是像这样的:

server {
listen 80;
listen [::]:80;

server_name webchat.domain.tld;

access_log /var/log/qwebirc.access.log;
error_log /var/log/qwebirc.error.log;

proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_buffering off;

location / {
    proxy_pass http://127.0.0.1:9090;
    }
}

它和 Nginx Wiki 上说的那个配置的唯一不同之处在于:

listen 80;
listen [::]:80;

Wiki 上用的是:

listen 127.0.0.1:80;
listen [::1]:80;

导致我在不明白其原理的时候狂刷 irc.suse.org.cn。。。。

后来才反应过来:Wiki 的教学的场景是说,你在本机(127.0.0.1)跑起来了一个 qwebirc,然后嫌用 127.0.0.1:9090 访问它比较的麻烦,于是做下反向代理让 127.0.0.1 可以直接访问到它。

但我们的场景是说,我在本机(127.0.0.1)跑起来了一个 qwebirc,然后想用 http://irc.suse.org.cn 直接访问它!127.0.0.1:9090 和我没一毛钱关系,因为我没在服务器上登录装图形界面开网页浏览器…

我们要让 Nginx 去监听对 irc.suse.org.cn 的 80 端口访问,然后把它扔给 VPS 上的 127.0.0.1:9090。。。所以直接监听 server_name 的 80 端口就好了嘛…

这个错误很难反应过来,尤其对我这种水货 SA!Nginx 还会正常跑,但你在 VPS 外面是访问不到它的:

  1. qwebirc 提供的服务在 127.0.0.1 不是你的公网 IP,所以你用 xxx.xxx.xxx.xxx:9090 根本打不开…甚至 Nginx 也不知道你在干啥,因为别的配置是没有用 9090 端口的,连 Fallback 这种安慰奖都没有…
  2. nginx 监听着你的内!网!IP!你访问 irc.suse.org.cn,是有这个配置,但是它找了一圈发现没有跟 irc.suse.org.cn: 有关的事啊,这个配置在管 127.0.0.1 呢…

还有注意:proxy_pass http://127.0.0.1:9090; 这个不要手贱把 127.0.0.1 改成 irc.suse.org.cn 了。。。因为那个域名的 A 记录是你的公网 IP,而 qwebirc 并没有对公网提供服务…血泪的教训!

接着重启下 Nginx 服务器:

sudo systemctl restart nginx.service

就 OK 了!

PS:终于有个顺手的 IRC 去调戏 #kde-cn 的 BadGirl 了…

openSUSE 特殊国情有关的 FAQ [with updates]

By marguerite | Published 2013 年 3 月 26 日 | 45 条评论

引子 —— 能解决的是技术,不能解决的是人心。

为什么我们开发者要用 Gtalk 和 IRC?

跟 Google 没一毛钱关系。我们需要一个全球性的网络,因为我们面对的不只是用户,还有其它国家地区的开发者。就 openSUSE 来说,我没有理由去要求台湾地区的开发者用 QQ,也没有理由去要求他们的用户在官方论坛转简体。我们需要开放而成熟的技术,以便于进行二次开发。二次开发就是「修复」一些原本没有「坏」的东西来满足自己的需要,非开放而不能为。Gtalk 后面的 XMPP 协议坏了吗?没有,但是我需要与 IRC #opensuse-cn 互通的机器人、需要群组机器人、需要网页的聊天记录,于是我「修复」了它。现在我们有了 talk at suse dot ws,有了 https://talk-marguerite.rhcloud.comUpdate: Gtalk 群组地址变更为 talk@suse.org.cn。(IRC/Gtalk/QQ 群三网合一),聊天记录地址变更为 https://forum.suse.org.cn/log.html

而 IRC 就像你们的 QQ 一样,我一样不爱用。我至今不会它的指令,也不会每天挂着。但是有需要我还是会去,就像开会要去会议室一样。你可以不参加会议,你可以选择不去会议室听自己非常想听的东西,但你不能要求别人围着你的桌子开会。

为什么我们要用论坛?

我们需要一个 default to open 的地方,能够存档我们回复过的东西,避免重复工作。

我们需要一个延时的地方。避免你滴滴滴滴吵到我们的工作和生活。

我们需要一个多人的氛围。

为什么我们要用维基、文档甚至 manpage?

我们需要一个说明书性质的东西。

说明书一个人是写不完的,在所有人都有权利去写的情况下,说维基、文档不全实际上是在骂你自己,不全?你干嘛了?

为什么我们不用 QQ 群?

Update:1. 勇敢地像现实低头 2. Gentoo 社区的 microcai 博士开发了搞定 QQ 的 avbot, Fcitx 社区的 csslayer 翁学天博士友善帮助在自己的服务器运行它,Ubuntu 社区的 shellexy 大神帮助推荐了印度阿三的人肉验证码识别服务 3. 我的一些个人思想转变。于是支持了。但是,QQ/贴吧永远只会是你 Linux 生涯的一个暂住之地,如果你非要永久居留,那你是体会不到 Linux 社区的魅力的。我们为你点亮了一盏灯,而不是帮你推倒窝棚鸟枪换炮,真正的风景在 openSUSE 官方中文论坛

它不是 default to open 的。

它是实时的。

它是工作场合用不了的。

它是外国用户用不了的。

我回答它的问题对于减轻我的工作没有意义。没有人把我的答复 document 到 wiki 上。没有第二个人听见。

一个人只能用她爱用的几样,抱歉 QQ 不在我的喜爱列表里。

This is not the SuSE way. 你不能新装 openSUSE,第一件事就是装 QQ,干什么呢?去 QQ 群提问。如果一直惯着这些 Windows way,那你帮助的人永远不能成为 SuSE 的贡献者,你的奉献没有意义。

论坛好慢啊…

你想不想解决发生在你身上的问题?

想,就去,不想,可以不用去。既想,又不想去,那即使我在人人网也帮不到你。

发生在自己身上的问题,别人没有责任替你铺路。

开源没有售后。脸长我头上,不用你赏。

openSUSE 不教你FQ。也不会给你买 VPN。

所以不要用全民问题去苛责一个操作系统。Windows 也没人类解放啊。

技术上,我可以做个国内论坛,也正在做。 但是初衷是自己觉得好玩,跟你没有关系。Update:openSUSE 官方中文论坛

Gtalk 身边没人用…

身边人能解决你的问题吗?

能解决你的问题的人在用,对于一个想解决问题的人来说,这理由不充分吗?

你「应该」干掉我的问题,所以你要迁就我。

openSUSE 我自己用的好好的,显卡没长我电脑上; 软件不是我开发的,bug 和我没关系,社区一份钱没 pay 过我,为什么我要迁就你?

求人要姿态低态度好。求人办事我也是孙子脸,别看我跟你横。

Google 说鸟语,我看不懂…

所以请去学英语。

不要幼稚地把个人问题赖到一个操作系统上。Windows 也没帮你找妹子啊,不然会修电脑,岂不是满大街都是愿意给你发卡的?

搜索到的东西太分散了…你告诉我不行吗

我也是那么分散的看过来才告诉你的。然后下次我就有了经验。

所以不要把自己应该做的事强加到别人身上,谋杀别人的生命。长本事长能耐的事情要自己来。

为什么我们不用百度贴吧?

它发不了带 https://zh.opensuse.org https://forums.opensuse.org https://software.opensuse.org 的任何东西。立刻删除,然后投诉会告诉你主帖没被删我们就不管。

我用百度贴吧唯一的成就就是解决了一个 fcitx bug。

为什么我们不用渣浪微博?

这个可以有。但是我不想让小白的提问污染我同事的时间线,也不想你能看到我的日常。也没有开小号的习惯。更没有每天被瘦腿袜阿迪鞋虐一百遍的习惯。也没有对着僵尸粉的棺材说话的想法。

维基找不到东西啊…

openSUSE 维基有自己的组织方式,我们的文章是放在一个个 Portal(专题)下面。不要用 Ubuntu way 去要求 openSUSE。我们是它的黑老大,不是狗仔。

我在醒目的位置做了一个「全站搜索」。只能帮你到这里了。

提问的人有责任把得到的答复 document 到维基,这是对回答者的行动感谢。

看到不新不全的文章,或文章出错,你有责任立刻去更新它,这是你对上一个编辑者的行动感谢。除非它没有帮到你或没有为你提供思路,这是你唯一需要联系我的情况,因为我作为管理员需要把它删掉。

如果你用 openSUSE 完成了一项工作,发现自己是第一个。那你更应该 document 到 wiki 而不是个人博客。这是你对一分钱没收你却帮助你完成了一项工作的 openSUSE 的行动感谢。另外 zh.opensuse.org 永远比你的博客访问量大。

界面和文档翻译

https://zh.opensuse.org/Portal:翻译

官方源好慢啊…

https://mirrors.opensuse.org

四月份的 hackweek 北京各大学的孩子们准备去 debug 这个问题。愿神眷顾他们。

Update:事实是没人去,我很失望。但神确实眷顾了另一个人:Zen Zhong,openSUSE升级由于curl网络不可达错误失败(持续更新)

openSUSE 有活动吗?

有,北京。Update:因为 SuSE 在国内只有全球第四大的研发中心。其它广州上海的都是 Novell 的,它们现在是不同的业务实体。

我想在本地办一个…

找我,出钱出资源请不要客气。

我身边没有 openSUSE 用户…

拉拢、转化、腐蚀他们。

为啥 YaST 加多源总是搞坏我的操作系统?!

在你没有学会 SuSE way 的时候用 SuSE 装 ×,这就是代价。

新手中规中矩用没说过这问题。

你丫为啥就是没有解码器?!

openSUSE 为北美欧洲注册的 NGO 实体。

在那些地方你不能不花钱取得受版权保护的东西。因为 MP3 是版权保护的,所以即使解码它的是开源实现的,也可以侵犯专利。openSUSE Project 没有钱成为被告。也没有钱为你付版权费。即使有,我们也不会资助那些试图囚禁人类的行为。

我捐款!

这个我爱听,打我卡上就行了。

近期准备开个支付宝社区帐号来收款。

因为林子翔同学借了一个 VPS 给社区。我想买下来。

Update:捐款方式是这个帖子里那个。

总之,不要为自己的懒惰和习惯找借口。Be brave to the world, and the world will care you.

另现接收各类序员的卖身投靠…有大事情做…

培育开源 NGO 的一些思考

By marguerite | Published 2013 年 3 月 23 日 | 9 条评论

这是周六北京 GNOME 小组活动 openSUSE 社区的讲稿。撰稿人是我。主讲人是来自 SuSE 的 Lance Wong。另有 PPT 在

大家来自不同的社区,面对的问题也不同。我这次先来拨一拨 openSUSE 中文社区这只洋葱。

首先提到 openSUSE,大家想到的应该是:

  • 华丽
  • 稳定
  • 用户少
  • 很少人讲
  • 千年老二。红帽的小弟。

一个华丽而稳定的系统,为什么 Linux 中文圈却没有声音?我能想到的有两方面:

  • 宣传不到位
  • 沉默的大多数

这就是我们的现状。为什么会有这些现状,玛格丽特有几篇选料生猛的文章。社区的管理者应该都有共鸣。我们试图解决这一问题。

宣传不到位

宣传不到位的常见原因有以下几种:

  • 投入不够
  • 政策错
  • 没有细分用户

投入不够

这里的投入不够不只是批评 SuSE,也在批评社区自己。SuSE 对 Linux 社区一直是有期待的,这种期待到了什么程度呢?如果你是一个来自其它社区的成员,想要去参与 openSUSE Conference,我们的 Travel team 出机票。SuSE 也曾为 openSUSE 在大陆的推广做过很多工作,「最漂亮的 Linux 发行版」,听说过吧,但是很遗憾,在一个没有培育出「我应该怎样」的国家,这些努力都可悲的失败了。这是所有开源活动都会面临的问题,玛格丽特总结的很好,大家都是站在泡沫上的,人家爱的就是你这股冒傻气似的不要钱。

金钱社会,奉献总是看得很轻。这就是为什么至今中国开源运动的中坚依然是 70 末 80 初这些人。因为理想已经被现实取代了,我们没法在用「开源是为人类解放」来招揽用户了。或者说,在一个全民追求「装逼又不贵」的社会,我们已经断代了。在这样的社会,用户的多少已经不能说明问题了。我们必须认识到:现在是末法时代,不是传教的时代,不是我扯起大旗就能拉帮结伙的时代,而是,我们要把我们的理想,贩卖,给我们想要卖的人。(此处停顿等掌声)

为什么要批评社区呢?因为中文社区没有发出过自己的声音。会哭的孩子有奶吃。Ubuntu 宣传的多,人家就认识它。你中文社区没有哭过,国际社区和 SuSE又怎么会知道你饿?

很幸运,现在这个问题已经开始着手解决了。SuSE 中国目前指定了两位 Site Manager,Sunny 和 Jia ju 来作为联系社区的纽带,再加上 SuSE Desktop Team 的协助,弹药的问题总算解决了,现在能拉起一个加强排还是一个加强连,就看社区能够吸引到多少大头兵了。

政策错。

这是很多社区都不愿承认的问题。Linux 社区总是基友少,嘴炮多,越活跃的,嘴炮越多。像 openSUSE/Fedora 这种完全没冲突的基友社区,少。但我想问一句,我们的理想不是一起的么?(此处停顿)

目前几乎所有的社区的定性思维就是:用户?(学三国杀司马懿,天命?)哈哈哈哈…

正如马晓骏在 Linuxtoy 说的那样,一群市场份额不到 1% 的在窝里斗。我们的星辰大海在哪里?在 Windows! 在 Mac!根本不在 Linux。所以每天去喷 RedHat 的 GNOME 输入法、去喷 Ubuntu 的 Mir,去八卦开发者之间的总总过节,其实是在自掘坟墓。

玛格丽特想让我代表,群嘲大家一句,你们非常幼稚可笑,幼稚可笑,幼稚,可笑。

Linux 应该是一个大家庭,是一个和 Windows/Mac 分庭抗礼的社区。是一个「我是一个 Linuxer 」在任何人面前说起来都自豪骄傲的社区。是一个所有发行版像兄弟姐妹一样团结有爱的社区。而不是一个相互挖角,转化对方用户,这个不行用那个,那个不行用这个的社区。不是一个用 Linux 不好意思说,像加入了邪教一样的社区。而不是一个鄙视 Windows/Mac 的社区。鄙视是因为自卑,不敢跟人家站在一起,才会拼命的说自己好。对,我用 Linux,我是一个 Linuxer,这是一个 bug 重重没事死给你看的系统,但是,那是完全属于我的系统,那是,我,的系统。而不是一个用了几年转投 Mac 的社区。亲!我们不是回收站 !(此处停顿等掌声)

没有细分用户。

好吧(摊手),大家都意识到了我们的问题出在那里。下面就让我简单教教大家该怎么卖吧。这是玛格丽特教的。她是搞金融的,滚雪球她最在行了。

首先是细分用户。

在座的诸位都非营销专业,这个应该不懂。所以我们都是犯了错的,都是有原罪的。

两个误区: 1. 用户就是社区 2. 用户就是用户

用户就是社区。这点 openSUSE 社区犯过错。用户不是社区。贡献者才是社区。

用户是,迎面而来的一片刀子,心胸有多大,就插多少刀子。(停顿)你做了 99% 的好事,一件事没让那帮爷满意,你就是千夫所指。这就是用户。丝毫不会想你没有收过一分钱,上班时间抽空照顾社区,下班整个人就交给社区,是多么的不容易,是多么的难能可贵,自己应该对你有多么的亏欠。理解都做不到!这就是用户。你就生来是他们的奴隶,开发他们的东西,他们吃饱一抹嘴开始挑捡你。这就是用户。我们也是人!不是服务器!更不是资源!(此处停顿等掌声)

贡献者与用户的不同,就在于理解。所以使用即支持,完全是屁话,有时候某些人使用完全是给你添堵!Fedora 的,问句,马同学在你们社区,你们堵吗?Ubuntu 的,问句,一堆嘴巴很脏的小白在你们社区,你们堵吗?看到你在厕所吃「饭」,会默默帮你把门带上的,这才是贡献者。想你所想,不明觉厉,就是理解。使用不是支持,理解才是支持!

用户就是用户。

用户不是一整块蛋糕,要么全吃掉,要么全别吃!用户是多种多样的,吃蛋糕,你爱吃鲜奶,可以把鲜奶吃了,爱吃水果,可以把水果吃了,爱吃蛋糕,可以把蛋糕吃了。没有爱吃蛋糕的?那就给 Windows 去吃嘛。

细分用户就是回答这样一个问题:

我想要什么样的使用者?

这个问题,openSUSE 社区就是当初没有思考过这个问题,才导致了现在这种「虚假繁荣」、「尾大不掉」、「百足之虫死而不僵」。为什么这么说呢? OpenSUSE 是一个国际性大社区,在中文圈用户也很多,但是为什么没有社区?因为你的使用者都是用户,而不是贡献者。简单说,你的使用者都是沉默的大多数,而非积极分子。要么是用 openSUSE 开发其它东西的,也即生产环境,要么是用 openSUSE 就为求方便求稳定不爱找事的。就是说,来你这儿的都是为了从你这拿东西的,而不是有借有还的。

有借有还才是一个社区,如果你的社区全是嗷嗷待哺的,要维基文章,要软件包,要新手指南。而没有几个正常的成年人。那么这是一个客服站台,而不是一个社区。再次强调,社区不是客服站台。如果你把社区当作客服站台来做,而不去引导使用者贡献,那么挨累是你活该。社区充其量是一个接站司机。把用户从不自由的微软接到 Linux,教会他游泳,之后汪洋大海任君驰骋。

这是 openSUSE 曾经犯过的错误。也就是说,一整个 Thruth 时代我们其实都在犯错,这个错误被吃饱了一抹嘴的用户总结为「用 openSUSE 就是用 Thruth」。王总多可悲啊,被一群抠脚大汉公用了好几年!

所以这种错误我们以后不会再犯。

细分用户就是把用户归类,然后选出你要的那类。

用户大致可以分为以下几类,是根据他们处在了解 Linux 的不同阶段划分的。这里面没有任何的身份地位,钱多钱少,学历高低,总之现实当中唯一的、在虚拟社会依然需要衡量的只有以下几点:

  • 人品
  • 修养

人品不好你不能让他管钱发礼品。修养不够你不能让他做新手的引导员。农民工一样可以成为社区的中坚力量,这点我们比现实中的教会要好的多。教会都能做那么大,我们凭什么不能?!

用户的分类是:

  • 完全小白。电脑上还是 Windows。知道 Linux,好奇,没用过。
  • 装机客。就是一张硬盘上面好几个操作系统的。
  • 双系统。Windows 和 Linux
  • 单系统。
  • 单系统开发。

其中完全小白是最方便勾引的。数量也最大。这里 openSUSE 和 Ubuntu 都有先天优势,那就是我们的 UI 做的漂亮。但是大家都很排斥这部分人。其实这部分人如果有一个耐心的大哥哥大姐姐引导,再有一些人陪他聊天,关怀他,一个 Release,就可以变成死忠用户。甚至都不会换发行版,因为他的所有 Linux 知识都来自于一个发行版。比如玛格丽特,她就知道 openSUSE 漂亮,那就是她的第一套。勾引这部分人其实非常简单:Linux 不中毒。Linux 漂亮。Linux 能装逼。Linux 不用关机,等等等等。勾引一个人的好奇心,远比勾引一个没有好奇心神秘感的人容易得多。唯一需要的,就是一点点耐心,一点点设身处地,和一些死机、崩溃处理的基本知识。这类人一旦选了某个发行版,都是因为自己解决不了的问题或没人搭理才被逼走的,而没有一个主动想走的。习惯是非常强大的力量!但是除了 Ubuntu,我们似乎都忽略了这些人。在这一点上,就算 Ubuntu 有千万不好,它的方向是对的。我们其它发行版也要自己去地里刨食吃,而不是等着偷鸡!

OpenSUSE 的愿景就是继续发扬自己的外观,以及像 Windows 一样的稳定,这是我们的先天条件,都不用去特意做就能达到,我们需要的是一些热心的用户,趴在论坛上,一些热心的用户,用简单的文字去写维基。然后说两句暖心的话,做一些基本的指引。我们社区的目标就是要建立这样的一个系统。

但是这样的系统需要牢牢记住我前面的那句话:社区不是客服站台!

目前的 80 后有不看说明书遇到问题不思考直接找人的臭毛病。如果听之任之,那么你就是客服站台。要学会说不,做社区呢,就是为了一个开心,把自己搞成奴隶或服务生、接线生的角色,那误人误己不如不做。也就是说,回答问题的时候一定不能直接说答案,是的,那样显得你很牛逼,但是牛逼的后果就是,能者多劳。要像数学考试一样,写清推理思路,直接写得数是没分的! 再说装机客。

目前各大 Linux 社区的主要拉拢对象都是这部分人。我的看法则正好相反。这部分人恰恰是你最不需要重视的一部分人。因为他们就没有一丝一豪的发行版忠诚度。

因为基本 Linux 知识和各大发行版的入门知识他们都懂,他们比较的完全是你发行版的底蕴,比如稳定性,维基文章和软件包数量,是否支持特定硬件,有没有特定开发工具,而人气在他们的考虑中权重相当低。因为他们懂得如何使用 bugzilla 直接联系开发者。所有的中间渠道对他们来说完全没用。这时的他们也不可能参与到特定发行版的中间渠道中去。简单说,如果你不是开发者,在论坛上回答这类人的问题,多余。因为他们只是 80 后的毛病作祟,回头人家自己就 google 到了。而他们关注的,恰恰是你在服务小白过程中大浪淘沙积累下的东西。如果把目标定位这类人,就好像和一个没国籍的人说爱国一样,事倍功半都是多的,完全就是徒劳。

而最后三类,完全是可遇而不可求的了,因为人家完全建立了自己的 Linux 价值观,有了固定的发行版。转换发行版只有在,自己的发行版深深伤了他的心,或者盛情难却同时受邀的发行版又确实比现在用的好或至少要不相上下,才会发生。简单说,我用着 openSUSE,你邀请我去用 puppy,这不是侮辱我智商呢么?是的,所有发行版的地位都是平等的,但是用户体验不一样呀!

好,简单分类清楚了。现在我们来讲原则。原则就是:

不要贪多嚼不烂。不要干自己能力不及的事情。

贪多嚼不烂就是要专一。你可以服务多个小白,但不能挑捡问题。如果做不到,那么只服务一个。

不要自己是普通用户试图去拉拢对方开发者。会被喷很惨,你解释不明白,反而给人家留下了坏印象。括弧,女生除外。

下面是小白的详细分类:

  • 理工科专业的在校小白。(计算机、通讯工程之类有 Bonus)
  • 个人能力非常强的外向型社会人员。(营销、市场、互联网行业有 Bonus)
  • 营销类、社会活动类在校小白。
  • 其他在校小白。
  • IT 公司程序员。
  • 其他社会人员对社区有兴趣的。
  • 其他社会人员对社区没兴趣的。

这些人的权重是不同的。理工科在校小白是火种。因为拿下他们你就拿下了这个学校。外向型社会人员。这是中坚。你拿到他们立刻就可以去办推广活动。比如我拿下一个 SuSE 的漂亮前台,那我立刻就进北邮搭台。剩下的权重逐级降低。在校生要优于社会人员,一是社会人员事情多,二是社会人员激情少。至于职业,在校生特别好问,社会人员只要他不做安利,一般也会回答的。

过程中你必须要建立起小白们有借有还的理念。比如「这个问题我和某某某探讨过,他遇到的是一模一样的情况,他答应后头 document 到维基上,要不你私信他一下?」建立他与社区之间的 connection,让他感受到被重视,于是才会有责任感去参与社区。你白帮忙,帮完了什么都不说,那你是雷锋,不是做社区。

沉默的大多数

特点:

  • 常年潜水(多数)
  • 说话必吐槽(少数)
  • 倚老卖老(极少数)

处理原则:

  • 潜水就当他不在。
  • 吐槽就当他不在。
  • 卖老就当他不在。

潜水用户除非你有深水炸弹,否则就请允许他们阴魂不散。而且如果是你上一个决策错误带来的潜水用户,他们冬眠也不见得是坏事。

吐槽用户基本是对系统的某一点特别不满。但是这种人常常忽略了一点就是,发行版的缺点除了内部整合问题和打包 bug,绝大部分来自上游。还忽略的一点就是,这可能是特定硬件问题。对于一个以偏概全的人,你的话是被曲解成狡辩的,而且中国人素质普遍较差,如果不是为了 debug troll,建议节省自己的口舌和生命。

卖老用户是吐槽用户进化的,Linuxtoy 上比较多见。特点就是 I know Linux from day one。你一不了解科技史的跟我瞎掰什么。他们是不知道只有有目的的做事的人才有资格掰社区的。而且经常会想象出一些虚无飘渺的权力与镇压,你是社区管理者是吧,那你为了手中的权力是一定会挥舞大棒的。而且还经常会捆绑民意,制造你欺压梁善的感觉。因为这种人一般很自卑很懒,不想干活又想要尊重。只能带着一种我是社区的代表的尊严法相来和你对抗才会找到自尊。典型的「人在心不在」的麻瓜却想假装一个「心在人不在」的撒手大佬。所以最简单的方法就是照章办事,触犯直接开革。这时不能讲究人情。因为他不会领你情的。反而你落下了一个软弱可欺的形象。

也许有人说,社区不是要民主吗?对,有限民主,建立在每个人都对自己说话负责,彼此尊重的基础上。因为反对而反对的人,如果大家都能够视而不见,那么就视而不见,否则有这样的队友参与社区事务讨论是不会产生任何建设性意见的,因为他做的事情就是水混好摸鱼。只有一个意见的社区,比起意见太多以至于拿不出意见的社区要好很多,因为至少无论正确错误,我们大方向上是在前进。而 Linux 社区,好就好在,它没有「错误的方向」。

openSUSE 的愿景

  • 一个对新人完全友好的发行版。(TODO)
  • 一个能让 Refugee 们一定程度上满意的发行版。(DONE)
  • 一个多核心的社区。单核心是极为不稳定的。(TODO)
  • 一个充满了「我觉得我该干点什么」的贡献者的社区。(TODO)
  • 一个团结有爱的 Linux 中文圈中的一份子。(PARTLY)

谢谢大家!

openSUSE 中文社区面临的若干问题

By marguerite | Published 2013 年 3 月 21 日 | 19 条评论

一直有人批评 openSUSE 的玛格丽特时代带了意识形态,还给我总结出两个凡是:凡是 openSUSE 的都是好的,凡是 openSUSE 上出现的问题都是用户不对。那我就来巴一些坏处,只有一个声音是不对的。但我巴坏处肯定是想让它好,毕竟我是玛格丽特女王大人。

(一) 中文社区

Ubuntu 肯定是最大的中文社区,Arch 肯定是最活跃的中文社区,Fedora 肯定是最爱交际的中文社区,openSUSE 肯定是最宅的中文社区。

首先我们应该没有多少活跃的大学用户。我们的用户据我观察应该是企业用户居多。这种人的优点在于他们都非常强,缺点在于他们都非常懒。如果我能解决自己的问题,而且我只用 openSUSE 挣口粮,那我为什么要帮助你使用 openSUSE?你能想象一群 Intel 员工,SuSE 员工,中兴的软件开发科长做你的成员,然后中文社区的基础设施是一个人生前 22 年没见过立式服务器的女生搭建的么?就像我在 Gtalk 群里怒喷的一样:你们呀,什么都会,就是不帮我,对吧。

其次我们一直是一个单核心的社区。我不是说开发,是说社区建设。开发牛人多了去了,我这种 CPP 指针数组都不会的肯定排不上号。苏哲时代(SuSE 9),我在上初中,但提 SuSE 9 老人都知道,几乎就是:Linux 是 SuSE 9 与硬件通信的工具。Thruth 时代,我在上大学,「用 SuSE 就是用 Thruth」,这也不是我说的。现在是缝缝补补吃老本的玛格丽特时代。我不会开发啊,只能根据长老们灌顶得到的经验盲修 bug,修好了,说明我逻辑和交际比较强。我一般是,看到 bug,用人类逻辑而不是机器逻辑去猜,不能开机?好,systemd,然后去找 Lennart; btrfs?去找 John; GNOME?Vincent/DimStar; Build Service?Adrian/Coolo; 输入法坏了?翁学天出列; Bash 支援?花花; Python?以前是 Hicro Kee 现在是 Felix Yan。懂了吧,openSUSE 的社区管理对我来说就是打牌,我就是拿着满手不情不愿看你是女生帮帮你的大王,用户出什么我都出大王,用户出大王?好,是用户你的不对,我不赢钱白跟你玩牌,你怎么能出大王赢我呢?

但我给自己的定位是 Coordinator,中文翻译为办公室主任。我希望 openSUSE 有几个强有力的男性领导,各管一摊,有推广的,有集会的,有开发的,有答疑的,有翻译的,有维基的…然后我就每天上线发 task 定 deadline 随手卖个萌就好。但是没有。于是手比较贱(处女座就是你骂我一句我下套也要还回去,不然今天就不完美了我睡不安稳),慢慢就都抓自己手上了。一个单核心的社区是没有活力和前途的。商业上是该给那个核心上巨额保险。但开源事业不行,我要钱干嘛?我就要东西。你能跑到保险公司去说哦如果玛格丽特不用 openSUSE 了你赔我一个能妥妥的骑住微软的 openSUSE 吗?

也许有人会说,没有你,openSUSE 不还是一样?那些年都怎么过来的。这种人活该你没有妹子,你一定不明白在心里怎么念 L.o.v.e。你没出现过的那些年你怎样我没资格管,但若你出现在了我的生活里,烙上了我的印记,那若我无法伴你终老,我一定要好好的把全身都是闪光点的你交到接盘侠手上,甚至让你在未来的生活中念我那无法复刻的传说。若干年后我可以对我的孩子说,你看到街角那个高贵冷艳的大叔没有,那是老娘的初恋。This is puppy love。当然如果你是从一个没有 dead soul 没有经历过社区成员的 RIP 的发行版转过来的,我说这些你可能不懂。但是我是记得,openSUSE 的 daemon(听 ID 就知道多牛逼了)升天堂时全网那种缅怀的气氛。整个开源圈有 70 以上的成员的社区也没几个吧,我们有。我尽量以后我也能有这种待遇。

第三,每一个活跃用户对我来说都很珍贵。但是在一个没有建立起「我应该怎样」的社会里谈奉献的人注定寂寞。而寂寞的人分散到各个城市又杯水车薪,这导致在没有社区背后的公司运作的情况下我们不太可能组织起自己的活动。也许 openSUSE 的人会说,公司支持不是很应该的吗?这种想法在我们社区里非常普遍。但请你想想 Arch。所以任何事情都有原因,人在社区,心不在社区,我们仍然欢迎来帮扩充用户基数,但谈到社区推广的时候您应该跟心在社区的人聊不到一块去。所以只能请下次同学们再想为 openSUSE 做点事的时候,面对这些困难,请问问你的本心,应该做的事情就一定要去做,在一个普遍没有理想的社会,能有点理想,虽然白痴,但似乎还不错的样子?

第四,我们现有的人不太会也不太可能成为社区实体 Body 的组织者。也就是说没有 LUG,没有 openSUSE Chinese Conference,没有 Release Party。只有一群每天在网上陪你扯还总暴粗的前辈。人间社会就是,不尊重前辈,前辈不给你机会,尊重前辈,做事情除了前辈没人记得你。不过好在我们的前辈还算很开明?steue,swyear,hillwood 都比我早,但似乎目前还没人给我下绊使坏嘛。比起 Ubuntu/Fedora,我们还算一个比较团结的社区吧。其它社区你可以想象成一群抠脚大汉到处使力,都分散掉了,所以人家面临的是如何凝聚的问题,而我们面临的是如何产生力这一物理学终极命题。

第五。个人原因。我在北京上班,在上海居住。周末北京有空,我在上海。上海也有空?对不起我在家就呆两天我不想出街。平时?抱歉我要上班。开源不给钞票啊亲!让我写 PPT 你出人讲?没问题。让我讲?网上讲行不行?不行?那抱歉我不想出街。我想其它做类似办公室工作的应该都有这个通病。电话网上讲得通的,那我人绝对不去。简单说,我们需要「外勤特工」,我们的「机关」搞内务的已经多到外面没人认识你了。

(二) 公司支援

很多人都说 SuSE 嘛,跟红帽一样在开源界的双核,数一数二的带头大哥,还是微软的战略伙伴,拥有最多的服务器认证,肯定给社区砸好多钱。错,至今中文社区好多东西,我还是能用免费用免费,能黑基友黑基友(比如服务器我用 openshift,发布我一般找 linuxtoy),就这样还每年给它花好多钱。但是做社区不是养儿子,我不能出工出力卖脸还搭钱吧!

所有人都认为 openSUSE 是 SuSE 儿子,但那是在国外。在中国是侄子。且不说 SuSE 中国只是一个办公室,大部分都是对 Linux 社区是啥都不知道的销售,开发也是开发不和最终用户接轨的软件你根本见不到人,整个中国大陆只有 5 个员工参与社区吧。我们没有社区经费,因为能批社区经费的 Site Manager 不在中国招。至于德国,可能给,但怎么给,通过 SuSE 中国?通过谁?那你是给人家升职还是给人家补钱?不然谁白做?我们没有 Legal,你想开个淘宝店?抱歉问德国。德国知道个屁的淘宝呀!甚至你想举报个中国境内的滥用 openSUSE 商标牟利,都要向德国举报。为毛?中国的 Legal 包给律所,普通员工不能联系,必须是市场部才能联系。但是 SuSE 在境内没有市场部,只有 Novell 的市场部,人家现在归了 attachmate 是两个 BU,我的工资没给我为你 SuSE 跑活的钱啊!

对 SuSE 中国的感觉是,中式办公室文化导致大家都不伸手,德国过问肯定问老外,老外被架空又不敢说,或者说可能老外也觉得我就是个在德国斗争失败被流放的,就挣工资没激情,也不主动要钱要物要人,看好企业版,腾讯淘宝缴费我就有业绩(这段我猜的)。导致我们是被自我隔离在国际社区之外的,国际社区想帮你也隔着千山万水。而中文社区又存在太多的不专业不接轨,导致人家对你兴趣也不是很多。比如,官方镜像?那你该找大学啊,但大学教育网,公网流量没多少还受开大会影响这事你和人家解释得明白吗?比如公仔?我德国有生产线,可以给你配齐,但你配到亚洲不到 10 个…好歹您当「办公用品」配别当「营销工具」配好不?老外是不明白公仔的抢手程度的,到中国,内部员工装修办公室先抢一遍,营销留几个,再被社区跪着要一两个…老外没学过国际贸易是想不明白我这儿烂大街的东西为啥到你那儿总报货源紧张?然后还经常丢失?比如官方商店,不 shipment 中国,为啥?你中国邮政不讲英文,中国快递也不讲英文还丢东西,别的国际物流你限制人家营业区域,你让我们怎么办?

所以至少我觉得,openSUSE 在国内的推广,一是靠社区自己的努力和在校生那可歌可叹的 passion,一是在 SuSE 指定负责亚洲甚至中文社区事务的专员,然后培养他们本土员工的开源意识,就是说我 SuSE 中国不止办公室里这几十号人,那几万不领工资的也是我「员工」,甚至他们比员工还高尚,所以我们要聆听他们的诉求。做市场也不能只推企业版,买不起的可以推荐社区版嘛,先把坑占上,那样有支付能力的时候肯定首选还是你。就是要自己养鸡,不能总到地里刨食。再次你进大学招工招实习的时候,可以优先考虑本社区和兄弟社区的成员啊。去一个大学,埋下些种子和希望啊。你说 SuSE 里有北邮的吗?肯定有啊,但为什么北邮没几个人听过 openSUSE?那肯定呗,你只找了最能干活的,没找最能引导自主干活的呗。

相信这样,前期可能不明显,过几个时代,比如后玛格丽特时代,hillwood 时代,甚至 douglarek 时代、multipe1902 时代、郭云鹤时代、hottea 时代什么的,总会开枝散叶。

(三)软件源

由于我们社区现有成员和在校学生没有办法建立联系。他们有 channel 但学生一般比较 shy,我们不 shy 但是没 channel,就是缺少一个身为学生的话事人。导致了现在国内高校的 openSUSE 源不少,但都不是官方源,可能就十几个、几十个人用。我建议都去把它申请成官方源,考虑到目前中文用户可能真的不是很多,额外的流量可能也不会太多。

而官方不推荐使用镜像源。因为官方使用的是一个名为 MirrorBrian 的我们自主研发的外星科技,被 KDE 社区使用。我不是服务器专精,所以不是很懂,原理大意就是它可以根据你的 IP 自动分配离你最近的源。也就是说 download.opensuse.org 这个开头在境内的下载流量根本不是国外的,而是 mirrors.opensuse.org 上列出的中国官方源之一。

而中国一是被 Debian 搞出来的镜像源会快的理念,二是可能这种技术应对国内网络环境真的有问题。(希望有同学去帮我抓包分析下,使用 download.o.o 默认 OSS 源的时候真正的软件包流量是来自境内镜像还是德国主服务器)。

所以导致几乎全网络的人都在说:哎呀没有境内源啊,慢啊,没有 Packman 啊种种。有时候我听了想笑。openSUSE 技术最先进了(两个「凡是」),咋不见骂 KDE?这都什么年代的老黄历了…然后这种思维导致我真的不愿意公开的去点名哪个或哪几个镜像快,因为 MirrorBrian 是根据人家镜像管理员跟主服务器管理员商议的权重来公平转发流量的。你浙大源刚建可能很快,但我要是点名了,可能两天后你镜像就挂了。这既不科学也不公平。

所以目前的折中方法就是:

希望真正懂的来帮助针对特殊国情 debug 一下,甚至 commit 一下。

需要快的镜像的人请去 mirrors.opensuse.org,选一个真正离你近的。可以 ping IP 然后去反查地理位置。Packman 在北交的镜像里有源。

另外需要特别提示的就是,OBS 源,除非你镜像管理员主动请求,否则是不推送的,因为更新太频繁。对你的服务器开销很大。中国大学都 90 年代的老硬盘,也没几个主动申请的。但南方用户可以用台湾的,北方用日本的,速度不错。大陆的镜像一般都是 ISO 下载+主源+升级源,没了。这可能就是为「灵活性」要必然付出的代价吧。至少用了这么久的我,要不是因为作为中文社区的 coordinator 必须要去关注新版发布,个人可能都不太需要新版发布。因为 zypper 你会用了之后想用什么新版有什么新版,滚动升级?嘿,Tumbleweed 没出来之前我就用 OBS 自己滚了一年多了…

好了。如果这些在你眼里都是小问题,甚至你突然热血上脑想要加入 openSUSE 为开源事业奋斗终身,那么,欢迎加入 openSUSE 社区。

OpenShift 搭建 rawdog 实现部落格聚合

By marguerite | Published 2013 年 3 月 19 日 | 评论

因为 Planet openSUSE 的管理员一直 unavailable,导致我无法正常的推送对 Planet 的修复和处理中文新成员的加入,考虑到中文博客又太多,总去找一个 unavailable 的人,两边都互相嫌嘛,于是就架设了这个:community.suse.ws Update: community.suse.org.cn

这篇文章中的教学其实我只完成了一半,python wsgi 前台是 Arch 维护者 Felix Yan 帮写的,所以在前面感谢一下 co-worker。

准备

你要去开一个新 Application,类型是 Python 2.7 Community Cartridge,然后要新添加一个 Cron 1.4 Cartridge。其它的 openshift 必要知识我假设你已经了解了,不了解的话请去看我之前的文章。

rawdog 架设

rawdog 是 KDE 社区开发的部落格聚合程序。简单说,这就是一个 python 程序,它只能获取 feed,并输出 HTML,至于怎么让 HTML 能被用户在互联网上看到,这就是 HTTP Server 需要做的事情了。而 openshift python 默认的 HTTP Server 就是 Apache + python wsgi。如果你用 VPS 还可以使用如 Apache,Nginx,Lighttpd 等配置 FastCGI 什么的。HTTP Server 这块我不懂,所以只能拿人家写好的 Server 出来讲。但是一定要记住,只配置好 rawdog 你才成功了一半。

另外这里我用的也不是原装的,是三转之后的 rawdog,就是被 Planet openSUSE 改了一次,我自己又改了一次的。代码在 Github/marguerite/susews-planet

ssh 进你的 application,然后

    cd $OPENSHIFT_DATA_DIR
    git clone https://github.com/marguerite/susews-planet.git
    cd susews-planet

这个你只能使用 openSUSE 的 bento 风格,想改风格请在本地 Git 捡出,然后修改 planetsuse/planet_template.htmlplanetsuse/feedlist_template.htmlwebsite/csswebsite/jswebsite/images 下的内容。

修改完成后依次使用 l10n-extract-from-templatel10n-merge.sh 提取翻译,去 locale 文件夹用 lokalize 翻译 .po 文件,翻译好后运行 l10n-compile-po.sh 生成 .mo 文件。

然后通过各种方法把它上传到上面所说的目录。

接着运行一次:

    ./compile.sh

这会编译 python 的 .pyc.pyo

然后修改 planetsuse/feeds 文件,加入要聚合的部落格:

    feed 15m http://www.marguerite.su/feed/
        define_name Marguerite Su
        define_nick marguerite
        define_face marguerite
        define_lang cn
        define_irc  marguerite
        define_member 1

这是一个比较全的单个 feed 配置。其中 define_face 会用在 website/hackergotchi/ 下的同名 .png 头像。define_member 是判断你是不是 openSUSE 社员。本质上你可以 define 任何关键词,只要你在前面的两个 template 里有对它们规定风格。

改好了 feeds 和上传了 hackergotchi 头像后。运行:

    ./update.sh

这会预取 feeds,也会提示一些比如 feed 301 重定向了,新 feed 在哪里的消息。

    ./write.sh

这会在 website/globalwebsite/<lang> 这样的文件夹下写入 HTML。

至此,rawdog 配置完成。

wsgi 伺服器架设

首先,在本地 git clone <openshift 给你的那个 ssh:// 的仓库地址>

然后修改 setup.py

    from setuptools import setup

    setup(name='openSUSE Chinese Community', version='1.0',
    description='OpenShift Python-2.7 Community Cartridge based application',
    author='Marguerite Su', author_email='marguerite@opensuse.org',
    url='http://www.python.org/sigs/distutils-sig/',

    #  Uncomment one or more lines below in the install_requires section
    #  for the specific client drivers/modules your application needs.
    install_requires=['greenlet', 'gevent', 'bottle',
        #  'MySQL-python',
        #  'pymongo',
        #  'psycopg2',
        ],
    )

重点要改的是 nameauthorauthor_email 和下面的 install_requires

接着修改 wsgi/application,这个是 Felix 的工作,我完全看不懂,不过你的 susews-planet/website 的位置和我的一样的话,可以直接复制粘贴:

    #!/usr/bin/env python
    import os
    from bottle import route, default_app, static_file, redirect, HTTPError

    root = os.environ['OPENSHIFT_HOMEDIR'] + 'app-root/runtime/data/susews-planet/website'


    @route('/')
    def homepage():
        redirect('/global/')


    @route('/<path:path>/')
    def static_dir(path):
        return static_file(path + "/index.html", root=root)


    @route('/<path:path>')
    def static(path):
        result = static_file(path, root=root)
        if isinstance(result, HTTPError):
            result = static_file(path + "/index.html", root=root)
            if not isinstance(result, HTTPError):
                redirect(path + "/")
         return result

    application = default_app()

然后我们还要做一件事,因为你的 planetsuse/feedswebsite/hackergotchi 都在你用 git 修改不到的地方,这给后续更新带来了麻烦,所以要修改下。

首先 ssh 登入把它们两个删掉。

然后把你本地的 planetsuse/feedswebsite/hackergotchi 复制到 git 根目录下。

接着编辑 .openshift/action_hooks/build,内容如下:

    ln -sf ${OPENSHIFT_REPO_DIR}/hackergotchi ${OPENSHIFT_DATA_DIR}/susews-planet/website/
    ln -sf ${OPENSHIFT_REPO_DIR}/feeds ${OPENSHIFT_DATA_DIR}/susews-planet/planetsuse/

就是把我们 git 上传的这两个文件软链接到它们应该在的地方去。

Cron Jobs

前面已经说了,rawdog 只管制作 HTML,但是我们需要这些 HTML 始终最新,所以需要用 cron jobs 每小时跑一次它来更新 feeds。

进入到 .openshift/cron/hourly 做一个 fetch.sh,内容如下:

    {
    $LOG_DATE=`date -R`
    echo -n "========== START $LOG_DATE =========="
    ${OPENSHIFT_DATA_DIR}/susews-planet/update.sh 2>&1
    ${OPENSHIFT_DATA_DIR}/susews-planet/write.sh 2>&1
    echo -n "========== END $LOG_DATE =========="
    } > "${OPENSHIFT_DATA_DIR}/log.txt" 2>&1

然后回退到 git 根目录:

    git add .
    git commit -m "add cron and soft link"
    git push

本教学到此就结束了,如果您想去绑定域名,请看我这篇文章:

如果您想弄个备份,请看我这篇文章:

Enjoy life!

2013-10-01 Update: Nginx 相关

Nginx 相对要简单一些,只需要本地捡出,然后相应修改,传到你的 htdocs/子文件夹。写对配置就可以,这是迁移到 community.suse.org.cn 后由我和 phonixlzx 共同修改的 nginx 配置,写到 /etc/nginx/nginx.conf 还是 /etc/nginx/vhosts.d/xxx.conf 要看你的需求了。

    server {
        server_name community.suse.org.cn;
        listen   80;
        listen   [::]:80;

        root /srv/www/htdocs/community.suse.org.cn/website/;
        index index.html;

        # Only match requests for /
        location = / {
            rewrite ^ /global permanent;
        }
    }

openshift 搭建和 IRC 频道互通的 Gtalk 群聊

By marguerite | Published 2013 年 3 月 17 日 | 7 条评论

Long long ago,大概八九个月前,看到翁学天的 ikde 群居然能和 IRC 互通,感觉很惊艳,于是也想弄一个替代现在的 opensuse_zh@im.partych.at。

Party Chat 是一个很好的免折腾 Gtalk 群聊主机服务,架设在 Amazon 上面,但是有以下缺点:

  • 不能和 IRC 互通。作为一个开源社区,要是没有利用上 IRC,总感觉少了点什么。
  • 在线时间不能保证。也就是说你没有 schduled_maintenance 的权利,只能它在线你就聊,它离线你就歇息。
  • 大于 300 人的群拒绝服务。也就是说你的群是顶着地雷的,到了 300 人整个群就会消失,因为 Party Chat 不能承担那些多出来的流量钱。你交钱也不给你提供额外服务。

所以几十个人的小社群还是可以应付的,但是人满了之后迁移成本特别大。所以就想着趁人少迁移到 ikde 那种高级群里去。

打听了一下,这种群聊是使用依云(@lilydjwg) 写的两个软件在 VPS 上搭建的,分别是 xmpptalkircbindxmpp

但问题出来了,我没有 VPS。当时 openshift 这种 PaaS 已经出现了,只是还比较新鲜,我不会用。于是去年 9 月的一次尝试就可耻地失败了。

当时(甚至至今)网上关于这两个软件的文章只有两篇:

  • 依云自己的介绍性文章,但是太粗略了。
  • StarBrilliant 的稍微详细一些的文章,但是还是有点犯了程序员的通病:普通用户不知所云。如果你是一个已有 VPS 的博主,看了也得折腾一会儿,要是麻瓜的话,恐怕也就只能看个热闹了。

于是逼迫我们群里的 douglarek 写了一篇在 openshift 上折腾它们的文章给我:

但实际上这篇文章很水。反正看过就知道啦,到处都是「凑合」。实际上你看它也根本架设不起来(好多致命细节都没说)。

当时我就是在这种情况下开始折腾的。

首先我开了 Do it yourself 应用,然后进去编译,结果很悲剧,红帽给的内存太小,mongodb 编译不成功; 后来我使用 Build Service 模拟了一个 openshift 环境(一个 x86_64 的 RHEL),然后编译编译,我犯懒了…

今年三月份挖出了作者,又折腾了一个多礼拜,总算搞定了。下面是正文:

注册一个 Do it yourself 应用

注册、配置 ssh 和怎么使用 ssh 登入服务器的教学见 douglarek 和我之前几篇讲 openshift 的教学,都是最基本的英文,基本能注册 GMail 的都会弄,不能注册 GMail 的基本你也不能在墙外看见我的文章。

编译

基本的 Do it yourself 应用是带有以下部分的:Git,bz2/gz 的解压软件。所以你这些是不需要的。

ssh 进去之后,cd $OPENSHIFT_DATA_DIR,这个文件夹的完整位置是在 app-root/runtime/data,当然你也可以使用 echo $OPENSHIFT_DATA_DIR 看到它的完整路径。

在这个文件夹里使用 wget URL 去下载源代码,git clone 捡出 git 仓库。这些我都假设你已经知道了。

所有的编译过程都是源自依云的 scripts/quick_install.sh,但是我更新了一些东西,所以最好还是看我的。

另外你也可以直接去 github.com/marguerite/openshift-xmpptalk-ircbindxmpp-bundle/ 抓取我编译好的来用。

编译 Python 2.7

下载 python 2.7.3 和 3.3 的源代码(你看到这篇的文章的时候可能已经更新了,所以请去 python.org 下载最新版)。然后解压。

编译 2.7.3 是因为后面我们有个程序要用 2to3 把针对 Python 2 gen 写的代码转义到 Python 3 gen。

    mkdir python2.7 (我们要把最终的 python 2.7 装进去,因为你没有权限往 /usr 装)
    cd Python-2.7.3
    // 依云原版的多了个 `--with-computed-gotos`,但这个选项已经没有了,变默认了。另外一个 `--with-wide-unicode` 作废了,现在默认就是 long。
    ./configure --enable-shared --with-threads --enable-ipv6 --with-system-expat --with-system-ffi --prefix=${OPENSHIFT_DATA_DIR}/python2.7/
    make -j4
    make install

这样 python2.7 里就有 python 了。

编译 Python 3.3

这才是主依赖,因为依云的代码是基于 3.2 版 Python 写的。

    mkdir python3.3
    cd Python-3.3
    ./configure --enable-shared --with-threads --with-computed-gotos --enable-ipv6 --with-system-expat --with-system-ffi --prefix=${OPENSHIFT_DATA_DIR}/python3.3/
    make -j4
    make install

需要注意的就是:--prefix=${OPENSHIFT_DATA_DIR}/pythonX.X/ 一定要有,而且必须写在最后,否则不起作用。至于原因我也不知道,openshift 就是这样的。如果你看了 douglarek 的文章的话,你可能会知道一个 ${OPENSHIFT_RUNTIME_DIR},这个也作废了。

编译 python3-distribute

去 PYPI 下载 distribute

这时编译需要用我们前面刚制作好的 python 3.3 来编译它。所以我们需要修改一下系统的 PATH 和 LD_LIBRARY_PATH 让系统能够找到 python3

    export PATH=${OPENSHIFT_DATA_DIR}/python3.3/bin:$PATH
    export LD_LIBRARY_PATH=${OPENSHIFT_DATA_DIR}/python3.3/lib:$LD_LIBRARY_PATH

这个 export 命令只对当前 Shell 有效,也就是说你 ssh logout 再登入,是要重新做的。

编译:

    cd distribute-0.6.35
    // 我们把所有的子模块都装到 python3.3 目录,下同
    python3 setup.py install --prefix=${OPENSHIFT_DATA_DIR}/python3.3/

编译 python3-dns

dnspython.org 下载 Python 3.x stable 对应的软件包。我这时是 1.10.0,解压用 unzip 命令。编译方法同 distribute。

编译 pyxmpp2

要用依云修改的:

    git clone https://github.com/lilydjwg/pyxmpp2.git

这时需要注意的是,最新版有问题,我们要使用 b3a01f03a10e319a833d2f57639bb696790c930e 这个 commit 的版本:

    git checkout b3a01f03a10e319a833d2f57639bb696790c930e pyxmpp2

以后的编译方法同 distribute。

编译 pymongo

下载在 PYPI

编译方法同 distribute。

安装 mongodb 的预制包

前面已经说了,在 openshift 上编译的话内存会耗尽,所以我们用编译好的。下载在 mongodb.org,要下载 Linux 64-bit 的版本。

然后解压,把 bin 目录下的所有东西都复制到 python3.3/bin 中去就可以了:

    cp -r mongodb-*/bin/* python3.3/bin/

用 Python 2.7.3 安装 mongokit

下载 github.com/namlook/mongokit.git

    git clone https://github.com/namlook/mongokit.git

因为要用 python 2.7.3 编译,所以我们要像前面一样把 python2.7/bin 和 python2.7/lib 导入到环境变量中去,具体方法见 distribute。

编译:

    // 就这个不是 python3
    python setup.py install --prefix=${OPENSHIFT_DATA_DIR}/python2.7/

接着我们要做 2to3,方法是:

    cd python2.7/lib/python2.7/site-packages/mongokit-*-py2.7.egg/mongokit
    2to3 -w .

然后把 mongokit-*-py2.7.egg 文件夹复制到 python3.3 的相应位置去:

            cp -r python2.7/lib/python2.7/site-packages/mongokit-*-py2.7.egg python3.3/lib/python3.3/site-packages/mongokit-*-py3.3.egg
            // * 的位置请自己补充

至此,xmpptalk 的依赖我们就安装完了。下面安装 ircbindxmpp 的。

编译 tornado

捡出地址在 github.com/facebook/tornado。编译方法同 distribute。

下面我们的操作都将在 python3.3/lib/python3.3/site-packages 下进行。

取得一些 winterpy 的小脚本

    git clone https://github.com/lilydjwg/winterpy.git

然后把里面的 pylib/myutils.pypylib/xmppbot.py 复制到 site-packages 目录下,winterpy 就可以删掉了。

至此,ircbindxmpp 的依赖安装完毕。下面获取它们两个。

site-packages 中捡出它们:

    git clone https://github.com/lilydjwg/xmpptalk
    git clone https://github.com/lilydjwg/ircbindxmpp

一些清理

如果你不准备未来升级你的程序的依赖,那么你可以把 python3.3 下除了 binlib 的文件夹全部干掉节省空间。也可以不干掉。

除了 python3.3 这个目录外的其它编译中间文件目录都可以 rm -rf 掉。

准备配置

你需要两个 xmpp 账户,一个用来做 Gtalk 群聊,比如 talk@suse.ws,另一个用来转发 IRC 上的消息,比如 irc@suse.ws。xmpp 账户怎么来你可以看 StarBrilliant 的文章学习配置 prosody,也可以像我一样直接在我的 Google Apps 里新建两个账户(Google 的服务据说发送太多链接和说话太勤对方会收不到,但是目前我还没遇到)。所以我就用 Google Apps 为例了。怎么使用 prosody 我也不会,我的 bundle 里也没有 prosody 的依赖和主包,估计 openshift 在你不绑定域名(见我搭建 wordpress 那篇文章)的情况下也跑不起来(因为要设 SRV 记录,红帽提供的二级域名肯定没这功能)。

注册 Google Apps,需要你有一个个人持有的域名。这个教学我省略了,因为太多了。只讲几个新建账户的注意事项:

你建完账户是 temporary password,可以在该账户的明细里看到,首次登入是会要你改的,所以不要建完就去配置了,那样不会成功。一定要登入改密码。

如果你用 Google Apps 弄过 Gtalk 就知道需要设置一个 DNS 的 SRV 记录,才能在非 Google 的客户端比如 Pidgin 上登入。但是这段 SRV 记录并不全,你之所以能在 Pidgin 上登入是你告诉了 Pidgin 我这就是 Google Talk。xmpptalk 是不知道的,它会一直 ping 你的域名的 A 记录,但那上面通常都是个博客或者别的什么,肯定不是 xmpp 服务器。所以你要多加下面一段 SRV 记录,和 Google 给的一起,加到你的 DNS 服务商比如 cloudns.net(不是每个 DNS 服务商都支持用 SRV 记录,至少我知道的免费的就这一个,反正你的域名注册商甚至共享主机商提供的 DNS 都不行),至于怎么改域名的 DNS 请自行搜索。

    _xmpp-client._tcp.你的域名. IN SRV 5 0 5222 xmpp-server.l.google.com.
    _xmpp-client._tcp.你的域名. IN SRV 20 0 5222 alt1.xmpp-server.l.google.com.
    _xmpp-client._tcp.你的域名. IN SRV 20 0 5222 alt2.xmpp-server.l.google.com.
    _xmpp-client._tcp.你的域名. IN SRV 20 0 5222 alt3.xmpp-server.l.google.com.
    _xmpp-client._tcp.你的域名. IN SRV 20 0 5222 alt4.xmpp-server.l.google.com.

至于各项的意思,搜索一下就能明白,反正 cloudns 是蛮简单的,就顺序填空…

等 DNS 刷新好了之后,然后请把两个账户相互加为好友。不然到了 ircbindxmpp 的时候,由于不是好友,转发机器人没法把 IRC 说的话转发到 Gtalk 群聊里去。

这样你的账户就准备好了。我们开始配置。

开始配置

我们需要改两个配置文件:site-packages 中的 xmpptalk/config.pyircbindxmpp/config.py。没有就把 config.py.example 复制一下:

    cp -r config.py.example config.py

下面先说 xmpptalk。

  • # TODO: your bot's JID: 这个是要写群聊机器人使用的账户,比如 talk@suse.ws/bot
  • # TODO: your JID:这个是管理员的 Gtalk 账户,比如我的 marguerite@opensuse.org
  • TODO: type a random string below:这个需要一个随机字符串,可以用 cat /dev/urandom | tr -dc A-Za-z0-9_ | fold -w 12 | head -5 得到一堆。
  • # nick_change_interval = datetime.timedelta(days=10):这个是群成员改昵称的间隔,默认是 10 天。
  • # TODO: select a database:这里唯一需要改的是 host,不能用 localhost,可以用 echo $OPENSHIFT_INTERNAL_IP 得到一个 IP 地址,用它。
  • warnv105 = True:这个改成 False,不然用 Gtalk 105 版的就会持续收到警告说你的客户端不安全之类的,但问题我们群里有台湾地区的用户,我们面临的问题人家不需要。
  • # TODO: the password of your bot:群聊机器人的密码。

这样就好了。其它的不用管(如果你用 Prosody 的话可能还需要管一个 # Which IP to connect?)。[Update] 依云酱说一般不需要,这个是给 Prosody 不支持 IPv6 准备的,一般填也填 IPv6 地址。

然后你还需要新建一个 xmpptalk/mongodb.conf,指定数据库的存放位置和日志的存放位置,完整见下:

    dbpath=/var/lib/openshift/513c7ceb5973cab51b0002c5/app-root/runtime/data/openshift-xmpptalk-ircbindxmpp-bundle/data
    logpath=/var/lib/openshift/513c7ceb5973cab51b0002c5/app-root/runtime/data/openshift-xmpptalk-ircbindxmpp-bundle/log/mongodb.log
    logappend=true
    #auth = true
    smallfiles = true
    nojournal = true
    bind_ip = 127.5.76.1

其中 /var/lib/openshift/513c7ceb5973cab51b0002c5/app-root/runtime/data/ 就是 $OPENSHIFT_DATA_DIR,可以用 echo $OPENSHIFT_DATA_DIR 得到,openshift-xmpptalk-ircbindxmpp-bundle 是我预制的那个 bundle(在 git 上),datalog 是我自己建的。那个 bind_ip 就是前面刚讲的 $OPENSHIFT_INTERNAL_IP。在配置文件中是不能使用 openshfit 预定义的宏的,因为使用这个配置的程序读不出。

然后新建一个 start_mongo.sh 来启动 mongod 的 daemon,内容如下:

    mongod --config ${OPENSHIFT_DATA_DIR}/openshift-xmpptalk-ircbindxmpp-bundle/lib/python3.3/site-packages/xmpptalk/mongodb.conf --fork

那个 --config 跟的也是 mongodb.conf 所在的完整路径。

ircbindxmpp 的配置:

  • targetJID = JID('talk@suse.ws'):这是你的群聊机器人的账户
  • BotJID = JID('irc@suse.ws/bot'):这是你的转发机器人的账户
  • 'channel': 'opensuse-cn',:你要互通的 IRC 频道
  • 'nick': 'SuSE-Lady':机器人在频道上的名字
  • 'realname': 'Gtalk Bot':机器人在频道说话时显示的名字,我们互通 Gtalk 自然叫 Gtalk
  • password = '':你的转发机器人的密码。

运行

export 环境变量(如果你已经登出了的话)。

进入 xmpptalk 文件夹:

    // 启动数据库
    chmod +x start_mongo.sh
    ./start_mongo.sh
    // 初始化数据库
    python3 dbman.py
    // 运行群聊机器人
    nohup python3 main.py &gt; ${OPENSHIFT_DATA_DIR}/openshift-xmpptalk-ircbindxmpp-bundle/log/xmpptalk.log 2&gt;&amp;1 &amp;

其中 nohup 是不让 python3 进程一直占用你的 shell,后面那一套是把返回在 shell 屏幕上的 runtime 日志给重定向到一个文件中去。不然的话,在你 ssh 退出之后,这些 python3 进程会被 openshift 杀死,你的群就掉线了。

这时您就可以加群聊机器人与其它人通过机器人聊天了。

进去 ircbindxmpp 文件夹:

    // 运行 IRC 转发机器人
    nohup python3 ircbindxmpp &gt; ${OPENSHIFT_DATA_DIR}/openshift-xmpptalk-ircbindxmpp-bundle/log/ircbindxmpp.log 2&gt;&amp;1 &amp;

原理同上。这时您就可以在 IRC 频道里看到你的机器人上线了。

停止机器人:

    killall python3

简单粗暴但行之有效。

你也可以做个重启脚本 restart.sh 放在根目录下面(一般 mongodb 跑起来就不用我们去管它了,所以不包括这个):

    export PATH=${OPENSHIFT_DATA_DIR}/openshift-xmpptalk-ircbindxmpp-bundle/bin:$PATH
    export LD_LIBRARY_PATH=${OPENSHIFT_DATA_DIR}/openshift-xmpptalk-ircbindxmpp-bundle/lib:$LD_LIBRARY_PATH
    killall python3
    #killall mongod
    #mongod --config ${OPENSHIFT_DATA_DIR}/openshift-xmpptalk-ircbindxmpp-bundle/lib/python3.3/site-packages/xmpptalk/mongodb.conf --fork
    nohup python3 ${OPENSHIFT_DATA_DIR}/openshift-xmpptalk-ircbindxmpp-bundle/lib/python3.3/site-packages/xmpptalk/main.py &gt; ${OPENSHIFT_DATA_DIR}/openshift-xmpptalk-ircbindxmpp-bundle/log/xmpptalk.log 2&gt;&amp;1 &amp;
    nohup python3 ${OPENSHIFT_DATA_DIR}/openshift-xmpptalk-ircbindxmpp-bundle/lib/python3.3/site-packages/ircbindxmpp/ircbindxmpp &gt; ${OPENSHIFT_DATA_DIR}/openshift-xmpptalk-ircbindxmpp-bundle/log/ircbindxmpp.log 2&gt;&amp;1 &amp;

uncomment mongod 那两行可以连 mongod 一起重启。

特殊注意

是不是以为万事大吉了?还没呢…红帽说了,后台程序(在网页访问不到的),两天就会被 idle。也就是说两天后两个机器人就都掉线了。怎么办呢?

Do-it-yourself 应用的 Git(就是网页上让你 clone 的那个 URL)里面有一个 diy 文件夹,里面是一个 ruby 写的超小网页服务器,我们把那个跑起来,不就有一个非后台应用在跑了么?

    git clone ssh://*************@talk-**********.rhcloud.com/~/git/talk.git/

然后啥也不用干,直接 touch 个什么东西,提交回去就行了: [Update] 要改 ./openshift/action_hooks/{start,stop},不然提交的时候会停掉服务器上正在跑的程序只跑一个 ruby 的网页服务器。

    cd talk/.openshift/action_hooks/

在 start 尾部添加以下几行:

    export PATH=${OPENSHIFT_DATA_DIR}/openshift-xmpptalk-ircbindxmpp-bundle/bin:$PATH
    export LD_LIBRARY_PATH=${OPENSHIFT_DATA_DIR}/openshift-xmpptalk-ircbindxmpp-bundle/lib:$LD_LIBRARY_PATH
    nohup python3 ${OPENSHIFT_DATA_DIR}/openshift-xmpptalk-ircbindxmpp-bundle/lib/python3.3/site-packages/xmpptalk/main.py &gt; ${OPENSHIFT_DATA_DIR}/openshift-xmpptalk-ircbindxmpp-bundle/log/xmpptalk.log 2&gt;&amp;1 &amp;
    nohup python3 ${OPENSHIFT_DATA_DIR}/openshift-xmpptalk-ircbindxmpp-bundle/lib/python3.3/site-packages/ircbindxmpp/ircbindxmpp &gt; ${OPENSHIFT_DATA_DIR}/openshift-xmpptalk-ircbindxmpp-bundle/log/ircbindxmpp.log 2&gt;&amp;1 &amp;

在 stop 里面的 exit 0 上面插入一行:

    killall python3

然后提交:

    git add .
    git commit -m "initial commit"
    git push

然后 .openshift/action_hooks/start 就会在服务器跑,就会把那个网页服务器跑起来了。

额外

Prosody

这个确实不懂。不过需要提醒大家注意的一点是,如果你打算在 openshift 上编译并搭建它,你需要了解 openshift 不是每个端口都可以对外的。大部分你熟悉的端口都已经在内外两边都为官方应用保留了,内部你只可以用 15000 – 35530,对外只可以 bind 到 ${OPENSHIFT_INTERNAL_PORT} 也就是 8080,会通过 80 端口转发给外部。

群日志

在 mongodb 数据库里。可以用 mongoexport 导出。

[Update] 今天他们非要一个 IRC 日志,我就直接把日志做成 cron jobs 放到我们之前跑起来的那个 ruby 网页服务器上了。

[Update1] 他们非要 HTML 格式的日志。好吧:https://talk-marguerite.rhcloud.com/index.html

把以下内容保存为 log_to_web.sh,放在 .openshfit/cron/hourlychmod +x 后提交:

    ${OPENSHIFT_DATA_DIR}/openshift-xmpptalk-ircbindxmpp-bundle/bin/mongoexport --host ${OPENSHIFT_INTERNAL_IP}:27017 -d talk -c log --csv -f time,jid,msg -o ${OPENSHIFT_REPO_DIR}/diy/chat.txt
    ${OPENSHIFT_DATA_DIR}/text2html.sh ${OPENSHIFT_REPO_DIR}/diy/chat.txt > ${OPENSHIFT_REPO_DIR}/diy/index.html
    rm -rf ${OPENSHIFT_REPO_DIR}/diy/chat.txt
    killall ruby
    nohup $OPENSHIFT_REPO_DIR/diy/testrubyserver.rb $OPENSHIFT_INTERNAL_IP $OPENSHIFT_REPO_DIR/diy > $OPENSHIFT_HOMEDIR/diy-0.1/logs/diy_server.log 2>&1 &

解释下就是导出 log,转为 HTML,然后重启网页服务器生效。

然后把以下内容保存为 text2html.sh,放在 $OPENSHIFT_DATA_DIR 下面然后 chmod +x

    #!/bin/bash
    echo "<!DOCTYPE html>
    <html>
    <head>
    <meta charset='utf-8'>
    <title>`date -R`</title>
    <style>
    body {
      background: #dbe1ed;
      font-family: "WenQuanYi Micro Hei",sans-serif;
      font-size: 16px;
      color: #333;
    }
    #content {
      max-width: 900px;
      margin: 5px auto;
    }
    p {
      border: 1px solid #aaa;
      padding: 2px 10px;
      border-radius: 8px;
      -moz-border-radius: 8px;
      box-shadow: 0 8px 6px -6px #999;
      line-height: 150%;
    }
    p:nth-child(odd) {
      background: #92d841;
      text-shadow: 0 1px 0 #adff4d;
    }
    p:nth-child(even) {
      background: #d3d3d3;
      text-shadow: 0 1px 0 #fff;
    }
    h2 {
      margin: 5px auto;
      text-shadow: 0 1px 0 #fff;
      color: #555;
      max-width: 900px;
      text-align: center;
    }
    span {
      display: block;
      font-size: 11px;
      color: #999;
      magin: 0 auto 15px auto;
      width: 900px;
      text-align: center;
      line-height: 200%;
      text-shadow: 0 1px 0 #fff;
    }
    </style>
    </head>
    <body>"
    echo '<h2>openSUSE 中文社團聊天記錄'
    echo "`date -R`"
    echo '</h2><div id='content'>'
    cat "$1" | while read p; do
      echo "<p>"
      echo $p
      echo "</p>"
    done
    echo '</div>
    <span>2013 版權所有 suse.ws。這是 openSUSE 中文社區的官方聊天室。</span>
    <span>添加 talk@suse.ws 爲 Gtalk 好友或 IRC 加入 #opensuse-cn 頻道即可參與。</span>
    </body>
    </html>'

备份方案

你当然可以使用我在之前搭建 wordpress 的文章里讲的 snapshot 方法。不过下面介绍一种自动的:使用 Dropbox-Uploader 配合 openshift 的 Cron Cartridge。

首先在网页版的 My Applications 里点进去,然后进入你的 Do-it-yourself 应用,点 add cartridge,加一个 Cron 1.4 的 cartridge。

然后 ssh 进你的应用程序:

    cd $OPENSHIFT_DATA_DIR
    git clone https://github.com/andreafabrizi/Dropbox-Uploader

然后把里面那个脚本复制到上级目录,文件夹可以删了。需要修改一个地方:

    sed -i "s/CONFIG_FILE=~/CONFIG_FILE=\./" ./dropbox_uploader.sh

不然会提示权限不够。再:

    chmod +x dropbox_uploader.sh
    ./dropbox_uploader.sh

一次,跟随设置。这样以后你就可以 ./dropbox_uploader.sh upload 文件 了。

先备份一下我们整个的 openshift-xmpptalk-ircbindxmpp-bundle 吧。注意,以下所有脚本都是在 ${OPENSHIFT_DATA_DIR} 运行的。这是 dump_all.sh 脚本的内容:

    pushd ${OPENSHIFT_DATA_DIR}
    # 压缩整个 openshift-xmpptalk-ircbindxmpp-bundle 文件夹
    tar -cjvf openshift-xmpptalk-ircbindxmpp-bundle-`date +%Y-%m-%d`.tar.bz2 openshift-xmpptalk-ircbindxmpp-bundle/
    # 上传到 Dropbox
    ./dropbox_uploader.sh upload `ls | grep tar.bz2`
    # 删除 tar
    rm -rf openshift-xmpptalk-ircbindxmpp-bundle-*.tar.bz2
    popd

然后我们编写一个 backup_data.sh 备份脚本,需要备份的有数据库,config.py,mongodb.conf,和 datalog 文件夹,以及 mongodump 导出的群消息日志:

    # 备份 mongodb
    ${OPENSHIFT_DATA_DIR}/openshift-xmpptalk-ircbindxmpp-bundle/bin/mongodump --host ${OPENSHIFT_INTERNAL_IP}:27017 -d talk -o ${OPENSHIFT_DATA_DIR}/backup/database/
    # 导出聊天记录
    ${OPENSHIFT_DATA_DIR}/openshift-xmpptalk-ircbindxmpp-bundle/bin/mongoexport --host ${OPENSHIFT_INTERNAL_IP}:27017 -d talk -c log --csv -f time,jid,msg -o ${OPENSHIFT_DATA_DIR}/backup/chatlog.csv
    # 备份 config(s)
    mkdir -p ${OPENSHIFT_DATA_DIR}/backup/config/
    cp -r ${OPENSHIFT_DATA_DIR}/openshift-xmpptalk-ircbindxmpp-bundle/lib/python3.3/site-packages/xmpptalk/config.py ${OPENSHIFT_DATA_DIR}/backup/config/xmpptalk.config.py
    cp -r ${OPENSHIFT_DATA_DIR}/openshift-xmpptalk-ircbindxmpp-bundle/lib/python3.3/site-packages/ircbindxmpp/config.py ${OPENSHIFT_DATA_DIR}/backup/config/ircbindxmpp.config.py
    cp -r ${OPENSHIFT_DATA_DIR}/openshift-xmpptalk-ircbindxmpp-bundle/lib/python3.3/site-packages/xmpptalk/mongodb.conf ${OPENSHIFT_DATA_DIR}/backup/config/
    # 备份 log(s)
    mkdir -p ${OPENSHIFT_DATA_DIR}/backup/log/
    cp -r ${OPENSHIFT_DATA_DIR}/openshift-xmpptalk-ircbindxmpp-bundle/log/* ${OPENSHIFT_DATA_DIR}/backup/log/
    # 备份裸数据库
    mkdir -p ${OPENSHIFT_DATA_DIR}/backup/raw/
    cp -r ${OPENSHIFT_DATA_DIR}/openshift-xmpptalk-ircbindxmpp-bundle/data/* ${OPENSHIFT_DATA_DIR}/backup/raw/
    # 改名
    mv ${OPENSHIFT_DATA_DIR}/backup ${OPENSHIFT_DATA_DIR}/backup-`date +%Y-%m-%d-%H_%M_%S`
    pushd ${OPENSHIFT_DATA_DIR}
    tar -cjf `ls | grep backup-20`.tar.bz2 backup-*/
    # 上传
    ./dropbox_uploader.sh upload *.tar.bz2
    # 清理
    rm -rf backup-20*
    popd

现在是 cron 设置了。还记得刚才你弄的那个 talk 的 Git 吗?用那个去搞(以下命令是在本地的):

    cd talk
    cd .openshift/cron

能够看到下面有 minutely 什么的这样的文件夹。openshift 的 cron 就是把脚本扔到这样的文件夹里,就会按照文件夹名所说的时间来跑。我们的 dump_all.sh 一个月执行一次就好了,而 backup_data.sh 可以每天执行一次。于是就把那两个脚本也放到相应的文件夹里去(服务器上的是给你手动跑的),不要忘记 chmod +x 哦!然后:

    git add .
    git commit -m "scheduled backup"
    git push

完成,enjoy!

呜谢

  • 依云酱
  • douglarek

openshift 安装 ownCloud 取代 Google Reader

By marguerite | Published 2013 年 3 月 15 日 | 21 条评论

Google Reader’s sunset is the dawn of ownCloud news.

翻译过来就是 GR 的夕阳正是 ownCloud 新闻订阅的佛晓。

相信 Google Reader 在 7 月 1 号关闭对大家都是一个打击,虽然大家的未读都是 1000+。但是一种生活方式突然变了,总归有点怅然。至少我听闻这个消息的时候第一反应就是:妈呀!我的那么多红心怎么办!

是小企鹅输入法的作者翁学天让我意识到了:哦,好在还有替代。虽然我是它的简体中文翻译者,但是我以前真的不知道嘿嘿。

首先这个替代目前装起来还是有一点困难的。所以需要一个这样的中文教学来教大家怎么才能装上有 News 的 ownCloud。

我们开始吧。(以 openSUSE 为例)

下载

首先我们需要 Git。因为现在只有 Git 版的 ownCloud Apps 才有这个功能。

    sudo zypper in git

安装好了 Git,我们需要下载这些源码

    git clone https://github.com/owncloud/core

这是核心组件。

    git clone https://github.com/owncloud/apps

这是带 News 的 apps。

    git clone https://github.com/owncloud/themes

这是新的 responsive 主题。

    git clone https://github.com/owncloud/3rdparty

这是一些第三方的比较好用的 apps。当然如果不用也可以不装(我装了也没发现有太大用)。

    cd apps
    git clone https://github.com/owncloud/mail

这是 ownCloud 新写的邮件收发界面,愿意尝试的可以下。

然后,把 apps, themes, 3rdparty 文件夹下的所有内容都放到 core 里相关文件夹下面。

于是你就有了完整版的 ownCloud 6.0 alpha。

注册 OpenShift 应用

下面去要去 openshift 申请一个账户。

然后在「我的应用程序」去新建一个应用程序。

选 PHP 5.3, 然后为你的 Web app 设置一个好记的网址。

注意下面的「Scaling」要设成「是」。OpenShift 默认可以建立三个应用程序,每个应用程序 1 GB 空间,但是 1 GB 空间对于一个个人网盘有点少。所以我们选了「是」就是说如果我装满了,就再挤占我另外的一个 Gear 的空间,直到三个都用光。

点「创建应用」,然后在右手边,会有一个添加「Cartridge」的按钮,进去添加一个 MySQL 的 Cartridge。

之后应该返回给你一个框,需要你的 SSH 公钥。Linux 下只需要

    ssh-keygen 

就可以在 $HOME/.ssh/isa.pub 生成一串公钥,把那个贴过去就好了。

安装

你需要用刚才装的 Git 去克隆 OpenShift 给你的那个 URL。

    git clone 那串 URL

下载来之后,执行以下操作:

    cd owncloud
    git rm -r php/index.php

然后添加一个远程 Git 仓库,抓取 openshift 的人调教好的 ownCloud。

    git remote add upstream -m master git://github.com/ichristo/owncloud-openshift-quickstart.git
    git pull -s recursive -X theirs upstream master

好了吧,但是这个是稳定版的,没有 News。我们就要把我们刚才准备好的 core 复制到 php/ 文件夹下面去覆盖它们:

    cp -r core/* owncloud/php/*

为什么要这么做,因为红帽改的这个有一些 openshift 专有的文件,可以直接让 owncloud 跑起来而不用我们去麻烦的设置。

下面上传

    git add .
    git commit -m "initial commit"
    git push

输入你刚才 ssh-keygen 时留的密码。然后就去你的网址使用吧。

背景

openshift 是红帽旗下的 PaaS(平台即服务),意思就是给你一个你账户几乎可以完全控制的在线空间,你可以装软件,跑服务什么的。

ownCloud 是 KDE 社区催生的一个 idea,意思就是为目前的 Dropbox 之类的商业网盘提供一个开源替代。所以和 KDE 整合的也不错,也有 Android/iPhone 客户端。但唯一让普通人忘而却步的就是,它需要一个个人空间才能装。

其它话题

ownCloud 相关

它有一个 MySQL bug,就是你如果服务器上已经有了 ownCloud,那再上传新的 ownCloud 的时候就会各种用户名已存在。我没有 debug 出来究竟在哪儿,不过那些东西没有写在它的 ownCloud 数据库里,而是在那个名为 mysql 数据库的 users 和 db 表里,在里面写了你已有的用户名。再次安装不会先删除这两个表里的用户名。

但是实际测试我发现,即使添加一个 phpMyAdmin cartridge 删掉了也装不上。原因是服务器上已经有了一个 config。所以你还要 ssh 到服务器上去

    ssh 刚才那个 git 地址里没有 git:// 一直到 rhcloud.com 那串

然后进入 runtime/repo/php/config 去把那个 config.php 删除。

但是实际上我这么做了也没有成功,估计是还有别的地方没找到。但实际上这样升级并不好,因为这样做实际上是新装一个 ownCloud。你现有的 ownCloud 里的东西你要使用备份功能导出,如果你 3GB 都用了呢?来回 6GB,你有那个网速么…

目前比较好的升级方法有一种。就是想办法获取你服务器上的应用程序的拷贝,拿回来填充你的 Git,这样你的本地应用程序和服务器上的总是同步的。填充好了之后,再用新的 ownCloud 去填充一次旧版,然后再提交。具体获取拷贝的方法在我openShift 搭建 wordpress 教程的最后有讲,而填充新版的教学在本文前面有讲。

Google Reader 相关

根据翁学天的扫盲。feed 只能返回最近的 10 篇文章。GR 之所以能够一直拉一直拉是因为 Google 缓存了在你之前订阅这个 feed 的人返回的那 10 篇。所以想通过 feed 取回我所有的红心是不可能了。

去 GR 发现它出了一个 takeout 功能,就是以前的导出,但是因为要关了嘛,所以能导出你以前的红心啊什么的个人历史为 JSON 格式。看了看,发现里面是很全的,但都是网址。而我的订阅里有些网址已经关站了,即使我求人写个 JSON 渲染程序也拉不到那个 URL 了(估计很快有会有程序员写这种程序了,比如 GR JSON 2 PDF 等)。

反正最后不知道你们怎么弄的,我是把 feed 手动加到 News 里(解决迁移问题),然后在 「GR 设置」- 「文件夹管理」里把红心设为 Public,接着用 Google Chrome 的网页截图扩展抓取整个网页抓了半个晚上把我的红心分页全部保存为图片,然后使用 ImageMagick 的 convert:

    convert images/* my-google-reader-fav.pdf

弄成一个 pdf 然后传到我刚弄好的 ownCloud 里去的。

好么,May the force be with you。

PS:按照 shellex 的说法:「任何时候都应该假设单一在线服务是不可靠的。当然,这与技术无关,只要将服务交与了某个服务提供商,就意味着正在失去对他们的控制力。」

「像 RMS 那样苦行僧般地活着我做不到也不会去做,像 Linux 那样的桌面我也不会有太多机会去用,但是并不代表他们就不重要。相反,他们很重要,他们的存在本身就是底线。只有支持他们,当我想从某个团体中收回控制时,才有选择的权力。」

我们是不是该考虑给自己的其它唯一的东西找一个替代呢。比如多为 openSUSE 做贡献之类的…或者,「说不定哪天 Google Talk 也关了,小姐请问我可以得到你的手机号码吗?」

SuSE 新年飨礼

By marguerite | Published 2013 年 3 月 8 日 | 4 条评论

亲爱的 openSUSE 贡献者们,

为了感谢您在过去的一年中为 openSUSE 项目所做的杰出贡献,值此新版发布在即,SuSE Desktop Team 的 FJKong 孔叔从 SUSE 市场部虎口夺食,抢到了一些礼品送给大家(实物图见下文)。礼品价值不是很高、数量也很少(因为我们没有社区经费,礼物也不是 SuSE 官方支出,纯属孔叔和市场部员工的个人情宜(?哈哈)得到的,所以我们会尽量把礼物交给已经证明最能呵护它们的贡献者),主要是为了表达一份微不足道的心意,openSUSE 没有忘记你们,正是你们或多或少的在他人眼里可能很怪很傻很宅的贡献,支持着 openSUSE 一直有勇气有动力面对不可知的未来,在这个 complicated 的世界里艰难前行。

同时新官上任的 SuSE Desktop Lead 梁辰晔(Da Liang)梁叔(原 SuSE 北京服务器组的 Senior)携 Desktop Team 全体同仁 Lance, 王伶卓,向 openSUSE 中文圈的用户们致意。(郑宇 jzheng 郑叔从 SuSE 暂时跳槽到 Canonical 准备创业中,但仍然在 openSUSE 社区和论坛上积极出没)

先上图(由于我个人并不参与此次礼品赠送,所以内部细节我可能描述的不是很清楚):

手包(似乎是装卡的,不知能否装钞票):

SuSE 卡包

水晶笔(似乎是 SuSE 标的中性笔杆):

SuSE 水晶笔

马克杯(去年我收到一个,图也是去年的):

Novell 杯具

数量:

  • 手包:6/8 个

  • 水晶笔:7/9 个

  • 马克杯:1 只

  • 公仔:0/1 只

领取人:

  • hillwood,重庆道桥,公仔一只

  • douglarek,英特尔北京,手包一只,笔一只

一些说明:

  • 公仔是可遇不可求的,因为这是 SuSE 中国的营销道具,至少需要提前一年预定(hillwood 是补去年的货,他也不参与今年的礼品赠送),稀缺到了什么程度呢,全日本就两只(SuSE JP 持有),全台湾据我所知个人持有的只有 swyear 一只。

  • 会尽量一只手包+一只水晶笔这样送,最后剩下的那只笔可能会送给最后一个人也就是一只手包+两只水晶笔,也可能会诠释一下礼轻情意重,几十块钱邮费投递给你一只几块钱的笔…所以目前可以领取的人数是 6人。如果人数太多,可能会再去市场部请求支援,或用没有 SuSE 标志的普通 U 盘弥补,但是这些不太靠谱。

领取资格:

肯定不能是空口无凭,说是 openSUSE 的人就送。至少要有在册的我知道的贡献,比如维基编辑和文档翻译(维基不是很好统计、中文文档组的人我会在 transifex 上发公告),以及官方的软件包维护,故障回报和修复,论坛积极帮助其他用户,以及现实生活中做过推广(这个需要简单核实,比如你建议你同学装了,那请让他给我 email 一封,相信不值钱的小物件也不值得你赌一把人品)。

有了贡献后,就是先到先得原则,不会因为贡献大小调整(要按贡献大小,那我就照单全收了…)。

领取方式:

论坛私信、电子邮件、推特、Gtalk 等你能想到我能收到的方式告知我你的通讯地址(能收到货的,当然也可以是马甲)。

投递范围:

中国大陆(不包括港澳)。

邮资给付:

SuSE 中国已结清。

另:公仔我们准备从 openSUSE 项目官方去请求设计图纸,然后在大陆境内找代工厂制作一批,开个社区淘宝店发售,来筹措一些经费来做推广。(只是前期想法,困难很多)详情请见晚些时候的《openSUSE 中文社区目前面临的一些问题》。

openSUSE 下的 Fcitx 输入法

By marguerite | Published 2013 年 3 月 5 日 | 6 条评论

这是给 openSUSE Marketing team 做的,大概会写到 news.opensuse.org 的 12.3 发布日志上。介绍了一些 Fcitx 的多语言支持和高级功能。

Youtube:

Youku:

Download:

http://115.com/u/26338483

openSUSE 下构建 RPM 软件包的教学

By marguerite | Published 2013 年 2 月 27 日 | 1 条评论

一个小时的人生:

Youtube:

优酷:

下载:http://115.com/u/26338483