2015年1月1日

Shadowsocks + openSUSE

入墙回国之后,不能上 Dropbox 和 Gmail 非常头疼。原来用的大路货 GoAgent 现在也不能用了。本想买个 VPN 帐号但是都死贵,还限制一台设备登录。于是网上搜索一番,还是决定用 Shadowsocks 代理了。

Shadowsocks + Linode 东京 VPS,速度很快,可以看 YouTube 高清(720p)。 Linux, Windows, OS X, Android, iOS 都能用。由于是代理的形式,需要应用支持代理才行。大多数浏览器, Thunderbird 邮件客户端,以及 Dropbox 等都支持代理。可以满足基本上网需求了。

我的服务器操作系统和桌面操作系统都是 openSUSE ,也是这篇唯一的特色了。 继续阅读 →

2014年12月14日

次像素渲染:如何检测屏幕是RGB,GBR或其它类型?

为了在低分辨率显示器(比如笔记本14寸的1366×768分辨率显示器)上更平滑地显示字体,GNU/Linux采用了次像素渲染技术。次像素渲染的意思是,将一个像素看作RGB三个像素对待,进行更细微的显示控制。而由于人眼只能识别RGB混合的颜色,因此次像素渲染不会改变视觉颜色。 继续阅读 →

2014年8月12日

微软到底垄断在哪里

最近中国工商部门展开了对微软的大规模反垄断调查。对微软来说这在全世界都已经不是新鲜事了,普通民众也在很多年前就把微软和垄断联系在一起。但是普通人往往对垄断的认定存在误解。

有非常多的人相信,市场占有率就是垄断。这是一个严重的错误。

市场占有率高是一个结果,是表现形式。非垄断经营的企业也能达到很高的市场占有率。然而垄断企业之所以成为垄断企业,是在于他们采取了不正当的竞争手段打压对手。 继续阅读 →

2014年4月6日

在浙大玩机器人

在浙大的三年多都在玩机器人,完全的业余爱好。在浙大的环境中是非常有利的,有很多难得的机会和资源。

机器人协会

机器人协会也可以说是机器人俱乐部,是一个机器人同好会。和大多数科技社团不同,他们真的在玩技术。有教学,实践制作,还有比赛。

对于新生来说,最早接触机器人的机会就是进入机器人协会。机器人实验室和机器人比赛都是高年级才能参加的,而且需要技术基础。而加入社团是不需要基础的,每周有专门的小课堂,面向新生教学。

专业也并不是很重要。在机器人协会学到的技术和课程关联不大,完全可以从零学起。新生在学习机器人技术的时候,往往还没有接触过编程、电路和机械的课程,大家的起点是类似的。 继续阅读 →

2014年3月30日

如何在淘宝买电子模块

想做DIY,科研竞赛,或者一些课程,都会用到微控制器和电子模块。

如果住在深圳、广州这种地方,去店里找东西很方便。Arduino.cc曾说深圳是硬件的好莱坞。但是如果在杭州这种地方,想找个轮式机器人用的巡迹模块可不容易。淘宝就成为了唯一可行的选择。 继续阅读 →

2013年10月1日

WordPress主题本地化

目前大多数WordPress主题(皮肤)都是英文的。而对于中文或其他语言用户来说,为了与网站内容语言一致,需要将界面转化为本地化语言。

首先,要确定这个主题是否支持"国际本地化",即是否为翻译为多种语言而设计。在WordPress安装主题界面,可以筛选"支持多国语言翻译"条件的主题。支持国际本地化的主题的PHP代码有着明显的不同:

<button class="search-submit button small" type="submit" role="button">
  <?php _e( 'Search', 'corpo' ); ?>
</button>
<button class="search-submit button small" type="submit" role="button">
  Search
</button>

继续阅读 →

2013年9月23日

校内维基的构想与实现

在写下这一篇的时候,我们的维基还是一个知名度不高的校内网站。经过近一年的尝试调整,渐渐得到了发展的方向。去年的时候,我们开始构想一个校内百科。动机很简单,我们觉得每个大学都会需要一个百科全书样的东西。我们的参考目标是维基百科,依靠mediawiki和理想化的社群模式运作。而在这之前,至少有五个类似的网站已经失败。

开始的时候我们有一系列定位和发展规划。制订了内容收录规范,以及社群守则。因为蓝本是维基百科,所以我们觉得它会像维基百科一样依靠用户贡献发展。问题是很多事情不一样。

首先是网站本身的意义。学生们并不是非常需要了解学校的历史,建筑和人物。即便需要的时候,他们也会去查询谷歌搜索。基本的信息维基百科都可以包含,我们只是做了一个更详细的工作,却花费了太多时间。既然是内容主导的网站,什么样的内容最被需要才是关键。

然后说说用户群体。我们的用户群体,是本校学生和教师。我们希望大家能通过此平台分享知识,互助协作。然而师生对此理念并不了解,网站在大多数人眼里仍是一个放内容的工具。一个开始就没有内容的网站,如何让用户参与其中呢?他们会怀疑网站未来的延续问题。

在技术上同样存在麻烦。mediawiki的内容编辑是通过代码实现的,十分复杂,而且不够直观。这严重阻碍了一般用户的参与。

我们的运营也有不少失误。太多的限制和质量要求让早期的内容积累举步维艰。像版权问题,我们并没有能力去验证,实际上是形同虚设的要求。

后来我们陆续进行了几项改变。

收录内容范围扩充,计划成为校内资料库。包含校内信息,在线教材,学习经验,共享文件等。

组建内部编辑组,积累原始内容。我们还通过技术从其他网站导入信息。内容积累足够多,用户对它的认可度也会增加。

在可视化编辑器部署之前,我们通过提供简捷的帮助,降低用户参与的难度。

同时也取消了不可执行的规则,以促进早期的内容积累。

现在的校内维基,已经改变了很多。我们很希望它会是一个成功的网站。

2013年8月16日

中文维基学院在Wikimania 2013

我是在本次于香港举行的Wikimania 2013上发起了主题为《The Future of Chinese Wikiversity》(中文维基学院的未来)的讨论。

Lunch_time_in_Wikimania_2013

在讨论开始前的休息时间,我与一些中文维基人交流了对中文维基学院的看法。大部分中文维基人不了解维基学院,好像是第一次听说。我遇到了一位德国老爷爷,他知道维基学院计划。有一些维基人知道中文维基学院,但他们大多不看好中文维基学院。不看好的原因首先是中文维基学院的定位不明晰,其次是关注度过低。第一个原因造成了第二原因,而第二个原因也造成了第一个原因。这真的是一个"鸡生蛋,蛋生鸡"的问题。

很遗憾除我之外没有中文维基学院的维基人参与此次讨论。此次讨论的参与者都是对中文维基学院项目感兴趣的维基人。除了中国大陆、港澳、台湾的维基人之外,还有在中国工作、读书的外国维基人。不同的观点让这次讨论更有意义。

首先我向参加讨论的维基人介绍了中文维基学院的现状与目标。

维基学院最初是维基教科书的一个子计划,用于研习原创研究。后来维基学院成为了一个独立的计划,专注于探讨学习和原创研究。而后维基教科书不再接收原创研究。目前已经有十四种语言的独立维基学院,英文维基学院已有超过两万个研究课题。

中文维基学院目前仍在Wikiversity Beta上,尚未独立。目前的参与用户数量约有三十位,而活跃用户数量长期少于十位。已有的研究课题约一百个,而完整的课题很少。中文维基学院没有确定自己的方针指引,其发展方向也尚未在社群中达成共识。

我们没有找到最初关于维基学院构想的讨论,也就无法知晓它最初的目标是什么。在元维基(Meta-Wiki)上的维基学院页面说:

"Wikiversity is a centre for the creation and use of free learning materials and activities. Its primary priorities and goals are to:

Create and host a range of free-content, multilingual learning materials/resources, for all age groups and learner levels

Host learning and research projects and communities around existing and new materials."

意为:

"维基学院是一个创造和利用自由学习资源和活动的中枢。它的首要职责和目标是:

创建和汇集一系列自由内容的,多语言的学习材料和资源,适用于所有年龄层和学历。

汇集基于现有材料和心材料的学习和研究项目及社群。"

英文维基学院的介绍页面说:

"Wikiversity is a community devoted to collaborative learning. "

"维基学院是专注于协作学习的社群。"

每一个语言的维基学院都是独立的计划,可以有自己的独特方针,但不偏离维基学院的核心。我们得到的维基学院的目标是"Collaborative Learning and Research"(协作学习和研究)。得到广泛认同的一点是,维基学院是关于学习的。学习和研究都是以知识为中心的,通过维基让不同的人进行协作是维基学院的核心。中文维基学院也将追随这些基本理念。

中文维基学院目前的首要目标是项目独立与发展。这一目标实现的条件是内容积累和社群扩大。所以我们需要用户,需要维基人参与其中。中文维基学院用户之间的交流很不顺畅,在互助客栈及讨论页的讨论非常少,邮件列表和IRC无人问津。

而后参与讨论的维基人聊了很久,有不少重要的结论产生。

最开始大家的问题都集中在"维基学院是什么?"这个问题上。我们怎么区分维基学院和维基教科书?为什么不将内容放到维基百科上呢?维基教科书接纳非原创研究内容,即那些已经被广泛认可的成果。而维基学院接收原创研究,那些尚未获得广泛认可的知识。举一个例子,有一道很知名的中国菜——佛跳墙。我们可以在维基百科上建立一个页面介绍佛跳墙的历史典故和做法、特点。而在维基教科书上可以介绍其详细的做法,特殊技艺。而如果有人对传统做法做了改进,得到了一种不同风味的"佛跳墙",那么这个成果就属于原创研究,只能被维基学院接收。维基学院是对维基百科和维基教科书的补充,很多时候维基学院能接受的内容并不能被其他计划认可。

相比于现在的论坛,博客和社交网络,维基学院存在的意义是什么呢?论坛,博客,社交网络都是一种自我发布媒体。它们的作用是阐述作者自己的知识和观点,而无法如wiki一样促进协作成果的诞生。对维基学院来说,协作编辑是它最独特的地方。

中文维基学院会做很专业的研究,还是那些起点很低的研究?中文维基学院目前正在早期发展过程中,若只进行专业化的研究,则会失去很多用户。维基学院的用户具有各种各样的年龄和学历,研究不论简易高深,都是有意义的。我们需要热情地吸纳每一个用户的研究贡献,维基学院的贡献者大多是各行各业的普通人,他们的作用是非常关键的。中文维基学院需要一个低的门槛,让更多人加入社群。

伪科学和玄学,中文维基学院将怎样对待?不论中国还是其他地方,都曾经存在着以非科学的方法阐释自然的理论,如中国的风水,中医经络理论。中文维基学院吸纳相关的研究,但研究需要客观评述它们的理论及其无法证实性。玄学和宗教都是存在的,它们的研究只要客观,并且不试图去说服人们相信即可。就像我们可以给孩子讲神话故事,但需要告诉他们神话不是真的。而没有根据的玄学研究会因为无法印证而不被包容,因此维基学院不会成为一个伪科学泛滥的地方。

中文维基学院如何打破"没有用户参与-没有发展目标"的死循环呢?这是最困难的问题。因为没有用户参与,无法探索发展方向;反过来,正是因为没有明确的目标,用户不知道该如何参与。目前有一个方法是可行的,先吸引用户参与,在实验研究过程中不断探索,从而得到适合的发展方向。各个维基计划都曾经经历过探索时期。在最初我们可能会犯不少错误,有很多争议,这都是必要的。没有它们,我们无法知道怎样做才是正确可行的。不断有新的维基人加入,不断地编辑,是发展的必由之路。

有一位维基人问我为什么我会参与维基学院。我觉得这是一个很有意义的计划,它让世界上不同地方的人在一起,毫无功利心地共同探讨学习,发现新的知识,而不是关在自习室里读自己的书。这才是教育的目的。

2013年5月3日

使用键值对进行串口通讯

在Arduino与电脑/手机之间通过串口通讯,比较麻烦的地方有以下几点:

  • 确定一条指令的开始与结尾
  • 防止字节数据丢失引起的错误
  • 编码与解码

简单的办法通常是每个字节作为一个指令,也就是一个BYTE数值或字符。这样做的缺点是表示的数据范围小,而且不够灵活。如果要发送几种不同类型的指令,这种方法也不行。

而表示一个复合命令,则需要断开每一个字段。使用键值对是一个很便利的方式。能够表示大部分操作指令:

name,value;

我们以逗号和分号作为分隔符和结束标记,只要将指令表示成键值对发送就可以了。在接收的一端,按照分隔符将字串断开,获取名称和数值,然后进行解释。

示例代码如下:

char input;
String value;
String name;

const int NAME = 1;
const int VALUE = 2;

int readProcess = NAME;

void setup() {
  Serial.begin(9600);
  pinMode(13, OUTPUT);
}

void loop() {
  if(Serial.available()){
    input = Serial.read();
    process();
  }
}

void process() {
  if(input==','){
    readProcess = VALUE;
    Serial.println(name);
  }
  else if(input==';'){
    Serial.println(value);
    run(name, value);
    name = "";
    value = "";
    readProcess = NAME;
  }
  else if(readProcess==NAME){
    name+=input;
  }
  else if(readProcess==VALUE){
    value+=input;
  }
}

void run(String name, String value){
  if(name=="speed"){
    int num = value.toInt();
    if(num==-1023){
      digitalWrite(13, HIGH);
    }
    else{
      digitalWrite(13, LOW);
    }
  }
}

在run()方法里,是对键值对的解释程序。

有分隔符能够很有效地避免传递时丢失字节的问题,保证前面发生的错误不会影响后面数据的传递。一次传输错误最多只影响一个指令的执行,不会对后续的数据传递造成麻烦。