为Raspberry Pi 2编译内核模块

2015-04-21更新:原始的rpi-source项目已经由PeterOGB 接手维护,所以无须再用我下文中提到的我改过的rpi-source脚本,直接用原始的就可以了。其它文中提到的背景知识都仍然有效。


 

在Linux下使用“360随身WiFi 2”》一文的留言区中,曾经有人问过,为什么编译出来的模块insmod/modprobe时报“Exec format error”,我不假思索的回复,请他检查编译模块时用的内核头文件与实际运行的内核是否完全匹配。这个答案倒也不算错,不过其实并没有解决问题,因为遇到的这个问题的人一般都已经用了“正确”的方式去编译他的模块,就算再重新做几遍,还是会遇到一样的问题。

最近我给Raspberry Pi 2编译内核模块时,遇到了一样的问题,花了很多时间才真正解决,在这里总结一下。以下描述的方法和内容,对Raspberry Pi (A/A+/B/B+)和Raspberry Pi 2都适用。

准备编译模块需要的内核树的方法(适用于Raspbian):

1. 下载我改过的rpi-source脚本
$ wget https://raw.githubusercontent.com/lifanxi/rpi-source/master/rpi-source
&& chmod a+x rpi-source

2. 运行rpi-source
$ ./rpi-source

3. 好了,可以进入模块源代码的目录进行模块编译了。

疑难排解:

1. rpi-source报gcc版本不一致

截止2015-03-12,Raspbian最新的内核是用gcc 4.8编译的(可以查看/proc/version确认),而Raspbian中自带的gcc是4.6的,需要升级到4.8。因为4.8的gcc已经backport了,所以可以直接sudo apt-get install gcc-4.8 g++-4.8,然后用update-alternatives设置优先级即可[1]。

2. 如果用rpi-source –skip-gcc忽略gcc版本检查,并强行用4.6的gcc会编译模块怎么样?

我的试验结果是模块可以编译,但在加载模块时会造成kernel oops,然后再用insmod/modprobe/rmmod/lsmod等命令时会挂住,只能重启解决。如果你编的模块是会自动加载的,重启前先把它删掉,不然启动时就会挂住。

3. rpi-source无法正常下载内核代码或Modules.symvers文件

有可能是你的内核版本太老,rpi-source只支持Raspberry Pi 3.10.37以上的内核。对于Raspberry Pi 2,它只支持3.18.6以上的内核。解决办法是先运行sudo rpi-update更新内核和固件,更新后请重启系统,然后再重新运行rpi-source。

4. 编译模块时报找不到arch/armv6l或arch/armv7l目录

尝试在make命令前加ARCH=arm参数,或尝试把/lib/modules/`uname -r`/build/arch中的arm软链为armv6l或armv7l后再编译。

背景知识:

1. Raspbian的内核包

不要按照使用Debian的习惯去找什么linux-image、linux-source之类的包,Raspbian的内核包是raspberrypi-bootloader,里面包含了内核、模块和一些启动文件,但没有Module.symvers和头文件。

2. rpi-update是啥

rpi-update是Raspbian内置的更新内核和相关固件的脚本,它的逻辑是去https://github.com/Hexxeh/rpi-firmware这个仓库下载最新的内核和固件,替换现有的版本。更新完成后会更新/boot/.firmware_revision,记下最新版本对应的Git Hash,以后rpi-update或rpi-source都会根据这个Hash去GitHub找对应文件。

3. Raspberry Pi的官方内核去哪里找

http://github.com/raspberrypi,里面的linux对应内核源代码,firmware是编译好的内核和相关文件。而rpi-update用的https://github.com/Hexxeh/rpi-firmware其实是firmware中部分文件的一个镜像,分出一个镜像仓库可以让rpi-update脚本的实现变得比较简单[2]。

4. rpi-source做了些啥

根据rpi-update记录在/boot/.firmware_revision中的内核版本Git Hash(如果没有用rpi-update更新过内核,就从raspberrypi-bootloaderq包的changlog中解析出Hash),去raspberrypi/linux仓库中获取对应的源代码,把/lib/modules/`uname -r`/build和/lib/modules/`uname -r`/source对应的软链建好,从/proc/config.gz获取当前内核配置,去raspberrypi/firmware仓库中获取对应的Modules.symvers跟内核代码放在一起,然后make modules_prepare准备好编译模块所需要的内核树。

5. 你改的rpi-source改了些啥

rpi-source的作者已经宣布不再维护这个脚本,并且这个脚本不支持Raspberry Pi 2,所以我在GitHub上Fork了一份,做了以下改动:

  • 修改了脚本自动更新URL到我Fork出来的版本;
  • 检查/proc/cpuinfo,判断当前硬件是Raspberry Pi还是Raspberry Pi 2;
  • 可以通过-b参数强行指定Raspberry Pi的硬件版本;
  • 根据不同的硬件,下载不同版本的Modules.symvers;
  • 如果用参数指定了要求用默认配置来配置内核树,则对不同硬件版本的Raspberry Pi调用不同的命令[3]。

6. Raspberry Pi和Raspberry Pi 2的内核有啥区别

Raspberry Pi 2的SOC是BCM2709,基于ARM 7(armv7l),而一代是BCM2708,ARM 6(armv6l),所以二代的内核中用了一些armv7l中特有特性。目前在打包的时候两个版本内核文件是打包在一起的,只是用后缀7或v7来区别,启动的时候会按实际硬件选择。

7. Module.symvers是干嘛用的?

一句话讲不清,有兴趣请参考[4]。总之,没有Module.symvers或用错了Module.symvers都可能会造成你加载模块时报Exec format error。如果你遇到了这样的情况,请确认rpi-source的执行过程中有没有失败的步骤。armv7l和armv6l版本的内核用的Module.symvers是不通用的,在raspberrypi/firmware中分别命名为Module.symvers和Modules7.symvers,但放到内核树中使用时需要命名为Module.symvers,如果是你自己准备内核树,务必要小心,我自己在这个问题上犯了错误,浪费了很多时间。当然,如果用我改过的rpi-source,那它已经帮你搞定了这件事。

8. 我用了rpi-update和rpi-source后编出来的模块还是无法加载。

目前我用本文描述的方法编译了过天猫魔盘(rtl8192eu)、360随身WiFi 2(mt7601u)这两种无线网卡的驱动,都工作正常。如果你遇到了别的问题,不妨在这里留言,可以一起讨论一下。

另外,终级大法一定是重新完整的编译整个内核,不过如果你想在Raspberry Pi上完成这个工作,那必须等有充分的耐心。所以,最好是在PC上进行交叉编译[3]。

[1] https://github.com/notro/rpi-source/wiki

[2] https://github.com/Hexxeh/rpi-firmware/blob/master/README.md

[3] https://github.com/raspberrypi/documentation/blob/master/linux/kernel/building.md

[4] http://www.ibm.com/developerworks/cn/linux/l-cn-kernelmodules/

2015新年好

2014年,我做了这些事:

– (令人发指地只)写了4篇博客

博客空间总访问量58350 PageView(Google Analytics数据),比前一年下降32%,是最近几年以来首次PV下降,不好好维护就是这样的后果。首页、在Linux下使用“360随身WiFi 2”calibre常见问题这几个页面的PV占总PV的50%。饭否发消息187条,包括照片50张。

– 自由软件相关

GDG  Hangzhou的活动依然很丰富,但我几乎没有参加什么线下的活动,越来越有变宅的趋势。

五月份Richard Stallman来中国时,有缘相见。他的传记《Free as in Freedom》第一版中文版翻译工作已经完成,中文版正式命名为《若为自由故——自由软件之父理查德·斯托曼传》,目前还在二校阶段,有望在农历春节前出版。由于RMS本人反对出版第一版,希望能出第二版,所以2015内可能会继续整理出版该书的第二版。

– 几个IT产品

Synology DS-214play:群晖的NAS最大的特色在于它的配套软件,为了“不折腾”,直接买了白群晖。买了就投入使用,没有太折腾。目前为止很满意。配套软件DS Photo+、DS Video等在深度使用后,感觉有点低于期望值,但依然堪用。

Pebble Watch:去美国时正好遇到Pebble Watch降价,就入了一个。其实先前已经关注过这个智能手表,感觉它有很多软肋,但其平台的开放性还是对我有一些吸引力的。Pebble日常使用没有问题,但在我的ZTE手机上时常会有蓝牙连接意外断开的情况,目测是手机的问题,稍有困扰。

GoPro Hero 3:朋友送给我的,我实在不理解这个东西为什么能这么火。作为一个运动相机,它的应用范围实在是太狭窄了,除了在一些极限运动(跳伞、潜水、攀岩)中它有很强的不可替代性外,一般的跑步、登山、骑行用它录下来的视频都没啥可观赏性,可能是我对画质的要求太高了吧。

元征golo 3/4:元征尝试在“车联网”领域发力之作,通过OBD,对车辆进行检测,同时提供3G Wi-Fi热点、轨迹记录、车辆定位等功能。概念上还是不错的,产品一般般,但其配套软件做得实在不敢让人恭维。

乐视X60s电视:渣画质、渣音质、屏幕严重漏光,但在没有比较的情况下,这几点一般人都不会关注。片源丰富是它的最大优点,总体性能来说跟电视+乐视盒子差不多,自带的本地高清播放能力一般,放高清还是得专业盒子才好。

BandwagonHost的VPS:年付$3.99的VPS,安装Shadowsocks后的访问速度比月付$20的Linode VPS快N倍(当然Linode VPS依然是一个很不错的VPS,从功能、服务、稳定性等角度来说),最快的时候可以跑满我的20M中国电信带宽,在路由器上直接配置了Shadowsocks+iptables,上网各种安逸。

– 旅游

美国十九日游桂林四日游

国内铁路运转里程约850公里。体验了纽约地铁、芝加哥地铁。

2012年时所计划的60km以上暴走杭州计划一直没有实施,不过今年完成了一次环西湖群山毅行,路线为老和山-北高峰-石人岭-天竺山-十里郞当-五云山-林海亭-贵人峰-虎跑-玉皇山-凤皇山-云居山-吴山广场,山路行程25.19千米,耗时9.5小时。总体感受比平地徒步50km还是要轻松一点。

– 其它

与其他同事合作翻译出版了《Raspberry Pi创意项目制作》一书。

展望2015年:

2014,很多人、很多事都发生了变化。2015会有更多的变化等待着我,每一天都有更多新的东西等待着发现,加油!

关注2015维也纳新年音乐会

曾经关注过的那些维也纳新年音乐会:关注维也纳新年音乐会,2015年将是我第20次收看维也纳新年音乐会的直播。

今年真是破天荒了,往年都是会在11月中下旬由唱片公司或广播公司透露出次年新年音乐会的曲目单,而这次则是在9月中旬就由维也纳爱乐乐团的官方网站公布了新年音乐会的曲目单

上半场

01 Franz von Suppé – Ein Morgen, ein Mittag, ein Abend in Wien; Ouvertüre – 维也纳的早中晚序曲 – 1990,2000

02 Johann Strauss II – Marchen aus dem Orient Walzer, op.444 – 东方童话圆舞曲 – 2009

03 Josef Strauss – Wiener Leben; Polka francaise; op. 218 – 维也纳的生活法兰西波尔卡

04 Eduard Strauss – Wo man lacht und lebt; Polka schnell; op. 108 – 我们的欢笑与生活快速波尔卡

05 Joseph Strauss – Dorfschwalben aus Österreich, Walzer op.164 – 奥地利村燕圆舞曲 – 1963,1992,2001,2008

06 Johann Strauss II – Zugabe: Vom Donaustrande; Polka schenll; op.356 – 自多瑙河之滨快速波尔卡 – 2000

下半场

07 Johann Strauss II – Perpetuum mobile; Polka; op. 257 – 无穷动波尔卡 – 1954,1978,1980,1987,1988,1993,1995,1999,2002,2010

08 Johann Strauss II – Accelerationen; Walzer; op. 234 – 加速圆舞曲 – 1981,1989,1994,2004

09 Johann Strauss II – Electro-Magnetische; Polka; op. 110 – 电磁波尔卡

10 Eduard Strauss – Mit Dampf; Polka schnell; op. 70 – 蒸汽快速波尔卡

11 Johann Strauss II – An der Elbe; Walzer; op. 477 – 易北河畔圆舞曲

12 Hans Christian Lumbye – Champagner Galopp – 香槟加洛普 – 2010

13 Johann Strauss II – Studenten-Polka; Polka francaise; op. 263 – 大学生法兰西波尔卡

14 Johann Strauss I – Freiheits-Marsch; op. 226 – 自由进行曲

15 Johann Strauss II – Wein, Weib und Gesang; Walzer; op. 333 – 美酒、女人和歌圆舞曲 – 1979,2000,2010

16 Eduard Strauss – Mit Chic; Polka schnell; op. 221 – 雅致快速波尔卡 – 1994

加演曲目尚未公布,按惯例应该是一首波尔卡加上下面这两首雷打不动的曲目(确实是雷打不动,不过2004年底的海啸吹走了2005年新年音乐会上的拉德茨基进行曲):

18 Johann Strauss II, An der schönen blauen Donau, Walzer, op. 314 – 蓝色多瑙河圆舞曲

19 Johann Strauss I, Radetzky-Marsch, op. 228 – 拉德茨基进行曲

担任2015年维也纳新年音乐会指挥的是印度指挥家祖宾·梅塔,他曾于1990年、1995年、1998年、2007年指挥过维也纳新年音乐会。在2007年新年音乐会上,梅塔在威尼斯狂欢节的梦幻回忆一曲中与乐手们的搞怪互动,给人留下了深刻的印象。

由于这次不是唱片公司放出的曲目单,所以CD封面还尚未剧透出来。放一些梅塔曾经指挥过的新年音乐会的CD封面吧。

祖宾·梅塔指挥过的维也纳新年音乐会

祖宾·梅塔指挥过的维也纳新年音乐会

整理这个曲目单时给我留下的第一印象是:这次选择了好几首爱德华·施特劳斯的作品,细数一下,总共是3首,并且其中两首是第一次在新年音乐会上演奏的曲目(看资料也许在20世纪80年代以前演奏过,但是我不太了解),这应该是史无前例的。2015年是爱德华诞辰180周年,不知道与这个是不是有点关系。

今年的曲子不算多,19首,应该算是个比较合适的数字。在2012年的新年音乐会中,指挥杨松斯创记录的选了24首曲子,演下来真让人觉得他有点不从心。

总体来说,这个曲目单虽然颇有炒冷饭的嫌疑,而且大多还炒的是15年前的冷饭,但也算是中规中矩,不像最近几年有些很“出格”的安排。开场的序曲、奥地利村燕等乐曲都很有正统维也纳的气息,相信会很让人陶醉。倒是用无穷动作为下半场开场,让人觉得有点不太搭调。

2014年,克劳迪奥·阿巴多和洛林·马泽尔这两位曾经指挥过维也纳新年音乐会的指挥大师离开了人世。阿巴多曾经指挥过颇具争议的1988年和1991年维也纳新年音乐会,而马泽尔指挥过1980-1986、1994、1996、1999、2005年新年音乐会,是我最喜欢的指挥家之一。当我写起这篇文章,细数着过去20年多的新年音乐会,才又一次想起大师的离世,感受到遗憾和忧伤。2005年新年音乐会上,为了表达印度洋海啸的遇难者的哀思,取消了拉德茨基进行曲的演出,成了马泽尔一次像是没有画上句号的演出。那一年的演出中,在维也纳森林圆舞曲中小号手还罕见的出现了失误,多少有一些遗憾。虽然知道不太可能,但是我一直幻想着有一天马泽尔可以再次登上这个指挥台,为他在新年音乐会上的指挥生涯画上一个漂亮的句号。 整整10年过去了,幻想最终也破灭了,愿逝者安息,生者前行。

Richard Stallman杭州行

我是来给Blog除草的,写个流水账。

5月初,终于磕磕碰碰地把Richard Stallman的传记《Free as in Freedom》翻译完了给出版社交稿了,想找他老人家写个序。他的回答还真是干脆:“没问题,我有空一定写。不过你们别等我的序啊,指不定什么时候能写好。还有,你们能不能把这书在两周内给印出300本来啊,我马上要来中国做6场演讲,我要用!”

虽然我清楚的知道在两周内把一本刚翻译完连错别字都没改完的书出版出来是不可能的,不过还是马上与徐继哲联系了一下,看看有没有别的变通的方法。徐继哲和哲思社区是RMS这次中国的行程的策划者。很意外的得知,RMS这次不但要来杭州和南京,还要来阿里巴巴。于是,我联系了公司负责接待RMS来访的同事,争取到了协助组织这次活动的机会。

所谓协助组织,主要也就是协助审阅活动宣传文案、挑选RMS演讲的提问环节的问题。不过,也别小看这点事情,其实很多人并不了解RMS的自由软件运动,大部分人更是把自由软件运动和“开源”混为一谈。事实上,我很早以前就说过,我其实不喜欢RMS带有宗教气息的自由软件运动。不过既然是邀请人家来做演讲,那还是投其所好吧。我努力的把所有文案和问题都重新组织了一遍,尽可能避免“开源”等会让RMS情绪激动的词语的出现。

19日一早接到RMS一行,按活动流程,先带他参观园区并给他简要介绍一下阿里巴巴集团。直接就碰了第一鼻子灰:“介绍要花多久?我不想听,我的时间很宝贵。”不过这倒也给我减轻了不少压力,于是这个参观介绍环节就简化到了不到十分钟时间。

合个影,RMS表示说,如果在合影中出现公司的名字或Logo,就不能把照片公开发布。我开玩笑说,我们可以把公司的Logo“Photoshop”掉再发布。这话显然激怒了他,“你在说什么?Photoshop?你应该说,GIMP,GIMP,GIMP!”

途径阿里云的办公区域,我介绍说这是“Alibaba Cloud Computing ”。RMS立马批评说“Cloud Computing”是一个很含糊其辞的词语,我们不能这么说,blah,blah。事后我回忆了一下,19日一天内,他给不同人总共讲了四遍为什么“Cloud Computing”是一个不好的词。

途经连接两幢楼的连接平台,RMS和他的女朋友被平台上的植物和鲜花所吸引,停下来拍照。我又嘴贱了,我说,过会儿吃完午饭离下午的演讲还有一点时间,可以在园区散散步,还有更多美丽的植物和花。“我有很多工作要做,有很多Email要回复,我没有时间散步!”RMS说。

早上的小范围圆桌会议后,公司活动组织者开始请RMS在一些T恤和图书上签名,作为下午的演讲活动的礼物。这个事他们先前没有跟我商量,所以我也没想到要提醒他们注意事项,结果就是我意料之中的:RMS拒绝在非自由的图书上签名,也拒绝在印有公司Logo的T恤上签名。

还好我自己倒是有备而来,事先印刷了几本《Free as in Freedom》中文版草稿。因为这本书使用GFDL许可证,RMS欣然在上面签名,不过他反复强调,请出版原书第二版的中文版,别出第一版,因为第一版中有很多错误。可惜这个事不是我和他可以说了算的,所以就只好先搪塞过去了。RMS的女朋友对这本书很感兴趣,同时她似乎对GNU网站的翻译工作也很关心和了解,希望我们能把GNU网站的翻译工作做得更好,翻译更多RMS的作品。不管怎么说,签名版《Free as in Freedom》到手了。难道我会告诉大家这就是我对这次活动这么积极的原因吗?

RMS的签名和他的Pleasure Card

RMS的签名和他的Pleasure Card

午餐,RMS真是个吃货。嗯,吃饭时他还把他不离身的龙芯笔记本电脑垫在盘子下面,弄得全是油。

下午的演讲,参考我另外整理的演讲实录,没啥新意。不过拍卖环节气氛还挺热烈,RMS真会卖萌啊,于是一个Baby GNU公仔拍出了550元的价格。提问环节完全没有按流程来,现场提问时不时蹦出“开源”一词,惹得RMS很是生气。他大声说“I am for 自由软件!”,全场大笑。

与RMS同行的,还有一位日本朋友,Akira Urushibata。2008年我在上海复旦大学召开的哲思自由软件峰会上听过他有关汉字哲学的演讲,记忆犹新。所以,当大家的焦点都在RMS身上,完全无视Akira的存在时,我找到不少机会与他进行了交流。Akira虽然不太会说中文,但他对汉字以及中国文化还是有很深的认识。Akira下午没有进行演讲,而晚上我赶到浙江大学玉泉校区活动现场时,也已经错过了他的演讲,颇为遗憾。浙大的活动现场也很火爆,不过我已经没有兴趣再听一遍RMS的演讲了,所以RMS演讲时,我就在会场外面跟继续跟Akira聊天,他跟我讲了不少中国历史,很多我都不知道,非常汗颜。Akira还送了我一本他的书,签完名,他问我要不要在上面再给我写点什么。我一时语塞,他想了想说,“我给你写个‘庖丁解牛’”。

接待RMS一行花了我大半天时间,整理演讲内容摘要也花了不少时间,后果就是忙上加忙了。经验告诉我,我总是越忙越写Blog,所以本流水账也诞生了。嗯,这事儿应该就到此为止了。

Posted in

Richard Stallman演讲实录

这里收录的是Richard Stallman 2014年5月19日在杭州阿里巴巴西溪园区演讲的内容概要。应活动组织方的原本的期望,是需要完整听译的,但那样实在是一个比较费劲的工作,所以最后决定摘录了这些内容概要。同时我提供了一些参考资料的链接,对于演讲中的大部分主题,GNU网站上都可以找到详细阐述相关内容的文章。

录音下载地址(ogg格式):http://pan.baidu.com/s/1bnaRpi3 密码:mnep

开场白

如果你拍摄了照片,请不要发布到类似于Facebook的社交媒体上。因为这些网站会监控你的行为。

如果你录制了演讲的视频,请以ogg或WebM等自由的格式来发布,不要使用任何MP打头的格式,不要以Flash的形式发布,不要以Windows Media或QuickTime的格式发布,也不要发到Youtube上。

请确保其它人可以使用自由软件而不用额外的私有软件就可以下载这些视频。

参考阅读:

主题演讲

1. 什么是自由软件?

自由软件尊重用户和社区的自由。Free Software中的Free的含义是“自由”,而不是“免费”。

自由软件关乎使用者运行、复制、发布、研究、修改和改进该软件的自由。 更精确地说,自由软件赋予软件使用者四种自由:

  • 不论目的为何,有运行该软件的自由(自由之零)。
  • 有研究该软件如何运行,以及按需改写该软件的自由(自由之一)。取得该软件源代码为达成此目的之前提。
  • 有重新发布拷贝的自由,这样你可以借此来敦亲睦邻(自由之二)。
  • 有改进该软件,以及向公众发布改进的自由,这样整个社群都可受惠(自由之三)。取得该软件源码为达成此目的之前提。

所以,自由软件总是一个整体,不会有“部分自由”的软件。你对自由软件所做的修改,也必须是自由的。自由软件不是一个技术问题,而是关乎用户的自由,是一个社交与政治的问题。

参考阅读:

2. 为什么私有软件是不好的

私有软件在道德和社交上都存在问题,人们应该避免使用。开发一个自由软件是对社区的贡献,贡献的大小取决于这个软件有多有用。但开发私有软件不是对社区的贡献,私有软件限制了人们的自由,是有害的。

自由软件的运动的目标就是让大家可以自由的分享软件。如果使用了私有软件,你会面临两难的境地。比如,如果有朋友向你要一份私有软件的副本,你就得违反软件使用协议,或者拒绝朋友的请求。这时你应该选择错得太不严重的那个方式:违反软件使用协议。因为开发私有软件本身就是罪恶,必面要犯错时,就先得罪那些犯错在先的人。

解决这种两难境地的最好办法是避免使用私有软件,你手头没有私有软件,你的朋友也就不会要向你要副本。

参考阅读:

3. 为什么我们需要自由软件

自由软件可以帮助用户完全掌控自己的电脑,包括电脑本身和上面运行的软件。作为软件开发者,你需要保证你的软件的用户充分享有上面提到的四个维度的自由。

私有软件开发商常常会在软件中植入一个不好的东西,比如DRM,后门或监控用户行为的功能。所以,私有软件就是恶意软件。比如:Windows是一个恶意软件,因为它内置了DRM、后门和监控用户的程序。尤其是移动设备上的Windows 8,它只允许用户安装指定的应用程序。微软还可以通过Windows在你的电脑上自动安装系统更新程序,就这是一个后门,只有恶意软件才会这么做。

同样的,苹果的所有“i”系列产品也都是恶意的。开发者试图把用户都关进“监狱”,控制他们的一切,所以才有“越狱”行为的出现。

Flash Player是恶意软件,因为它有监控用户行为和DRM的功能。

Android是恶意软件,因为它会把用户位置发送给某些公司。

Kindle是恶意软件,因为它剥夺了人们阅读图书的自由。它会把阅读进度发送到Amazon,它还限制了你与朋友分享图书的自由。Amazon还留了个后门,可以远程的删除你设备上的图书。

在乔治·奥威尔的《1984》中描述了人们在无时不刻的监视下生活的故事,非常值得一读。

请引导你的朋友从一开始就不要犯错,尽可能远离这些充满恶意的软件系统。

手机也是一种危险的产品,很多运营商可以远程改写手机上所安装的软件,甚至把它变成一个行动跟踪和窃听设备。有些手机甚至关机也是假的,只要电池还在,它就不断会发出信号,更有些手机甚至不允许拆卸、更换电池。运营商可以随时知道你所在的位置。我不用手机,虽然这有点不太方便,但在方便和自由之间,我更珍视自由。

使用私有软件就可能使用了恶意软件,要保证安全,就应该选择自由软件,因为你可以自己去研究它的实现、改进它,在这个过程中即便真的发现了有恶意的功能,也可以很方便的把这些功能去掉。事实上自由软件作者不会在自由软件中植入恶意的功能,因为自由软件让这样植入无处藏身。

Ubuntu虽然包含了很多自由软件,但它也存在一些间谍软件的特性。请参考文章:https://www.gnu.org/philosophy/ubuntu-spyware.html

参考阅读:

4. 自由软件运动

1983自由软件运动发起的时候,那时几乎所有软件都是私有的,所以我决定重新创造一个自由的操作系统,重写所有的软件。作为软件的作者,我可以保证这些软件都是自由的。要保证整个系统都是自由软件,这个工作量很大,所以需要集合各种现有的力量来完成这个任务。保证与Unix的兼容,这样可以用这个自由的系统来替换Unix。

GNU是一个递归名词,是GNU’s Not Unix!的缩写。创造这个词的时候有两个想法:1.它是一个递归词,并表达了GNU不是Unix这个意思。2.GNU本身就是一个单词,是角马这种动物的名词。不过在说GNU工程时,发音要发为g’noo,而不是new。因为这个工程已经有20多年历史了,它不再“new”了(幽默)。

参考阅读:

5. GNU/Linux

Linux这个词常常被错用,正确的用法是在讨论这个操作系统时把它叫作“GNU/Linux”,因为Linux只是操作系统的内核,加上各种GNU的程序后,才构成了完整的操作系统。这种错用从1992就开始了,那时GNU还在开发自己的Hurd内核,但是Hurd的野心太大,一时半会儿完成不了。1992年Linus把Linux以GPL发布后,Linux就成了自由软件,所以GNU选择Linux作为系统的内核。因此,在讨论整个系统时,需要同时提到GNU和Linux,它们缺一不可。

GNU必须的是自由的,Linux则是Linus创造的,Linus本人并不反对私有软件,但他不应该误导人们只看到Linux而忽视GNU工程。应该让人们清楚的知道,GNU是一个自由的操作系统,GNU/Linux并不是Linus一个人的成果。

GNU的未来取决于我们的价值观,所以我们需要向所有人宣传我们的价值观。我们必须强调自由的和重要性,不然我们就无法告诉人们为什么我们要为GNU工程而努力。

参考阅读:

6. 开源

“开源”是一个会误导人的词语,它是1998年时自由软件社区中一个不乐意宣传自由软件运动精神的人创造的(指的是Eric Raymond),它们不乐意传播自由的理念,把我们的作品与我们的价值观分离。开源不讲自由的理念,自由软件关乎人们的道德,开源只管利益。

我不是“开源”的支持者。我们必须珍视我们崇尚自由的理念,向人们宣传我们的理念。

参考阅读:

7. 我们应该怎么做

大部分GNU/Linux发行版都包含了一些非自由的软件,它们引导用户去使用非自由的软件,这是不对的。我们应该使用真正自由的GNU/Linux发行版。比如:gNewSense。虽然使用完全自由的发行版可能会带来一些使用上的不方便,但是我们在方便和自由之间应该选择自由。自由和公正比方便更重要,这是我们应有的价值观和选择。

作为一个自由的操作系统,就应该保证系统的每个组件都是自由的。很多时候仅仅“开源”是不够的。Linux内核其实也不是完全自由的,因为它里面带有一些二进制的BLOB,虽然它们也是以“源代码”的形式出现,但它们本质上并不是自由的,Linus在“自由”和“方便”之间错误的选择了“方便”。所以GNU也有一个自由的Linux分支,名为Linux Libre去掉了Linux中那些不自由的东西。

Mozilla是开源的,但也不是完全自由的。因为它支持一些非自由的组件,包括DRM。大家应该联合起来谴责这种行为。

很多网页中也有非自由的JavaScript代码,JavaScript总是“开源”的,但是开发者仍然应该在代码中包含软件许可证,明确表明它们是自由的。我们有一个名为LibreJS的浏览器插件,可以自动阻止非自由的JavaScript代码运行(其中可能包含很多恶意的JavaScript代码),同时这个插件还可以帮你向网站开发者发出抱怨邮件,促使他们把JavaScript换成是自由的代码。所以,当你开发JavaScript代码时,请带上一个自由软件许可证。不要使用非自由的JavaScript库,如果必须要用,你可以考虑自己重写一个自由的版本。

避免使用SAAS服务,因为你没办法控制你的程序在什么样的系统上运行。

虽然Linux使用了GPLv2许可证,但这只是因为Linus本人想对代码有更多的控制权。但是我们应该使用“either version 3 of the License, or (at your option) any later version”,这样当有新版本GPL许可证发布时,你的代码就可以和自动允许其它人使用更新的许可证。你应该对自由软件基金会有充分的信任,如果你不信任自由软件基金会会维护人们的自由的权利,那也没有别的什么机构更值得信任了。

我们支持反向工程,因为这样可以创造出更多的自由软件。

如果要了解更多相关的信息,访问以下网站:www.gnu.orgwww.fsf.org

如果想帮助GNU工程,请访问:www.gnu.org/help。可以先从以下小事做起:用GNU/Linux来称呼使用Linux内核的发行版;避免使用“开源”一词,使用“自由软件”。加入自由软件基金会,成为一名准会员。

参考阅读:

问答

Q: 在中国,阿里巴巴在开源和自由软件事业上做了很多工作。但其它一些公司并不重视这个。如何来更好的提升自由软件的影响力。

A: 可以关注一下GNU AGPL许可证。这个许可证保证了Copyleft许可证在Web上运行时的适用条款。通过它可以推动更多的厂商开放他们的代码,向自由软件做出贡献。

参考阅读:http://www.gnu.org/licenses/why-affero-gpl.html

Q: 有些软件用“抽象层”的方式来隔离自己与“开源”软件,怎么看这个问题?

A: 我不是“开源”的支持者。抽象层的做法并不奏效,只要你的程序与自由软件是一个整体,GPL就能对你的程序产生约束,整个 程序都得是自由的。除非你的程序跟另一个自由软件只是在系统中同时运行,相互之间没有联系,这才可以对你的程序使用不同的许可证。但这种情况下,也不需要“抽象层”这个东西了。

Q: 开源软件一样可以让我们拥有“自由之一”,有啥不好的。

A: 开源会带来误解,开源会限制你的自由。开源只是让你可以看到源代码,在具体的使用条款上可能会有各种限制。

Q: “云计算”是恶意软件吗?

A: 请不要使用“云计算”这个词,因为它很不准确,得具体情况具体分析。如果是说“虚拟机租用”,只要服务商不限制你在虚拟机运行自由软件,那就是没有问题的。如果是说“SAAS”,那是一件不好的事情,前面已经提过。如果是说“云存储”,那就是不好的,因为你不应该把自己的东西存到别人那里,他们可能会滥用你的私人文件。除此以外,云计算这个词可能还有更多的应用场景,请不要使用这么含糊的词语。

参考阅读:http://www.gnu.org/philosophy/who-does-that-server-really-serve.html

Q: 硬件很多不是自由的,怎么办?

A: 目前没什么办法。我们只能尽量支持按自由理念来设计的硬件,但毕竟硬件需要工厂去生产,我们对此没有足够的控制力。

Q: 如果微软和苹果也开源的话……

A: 我不再回答有关开源的问题,我们不应该宣传“开源”这个词汇。我是为“自由软件”而生。你可以重新组织一下你的问题吗?

Q: 如果微软和苹果能把他们的软件变为自由软件的话……

A: 那我们当然可以使用。

Q: 为什么自由软件与非自由软件不能和谐相处,人们各取所需呢?有些私有软件也做得非常出色。

A: 曾经,奴隶与农场主也是“和谐”相处的。我不用私有软件,我会躲开他们,如果我用私有软件,他们会夺去我的自由。自由软件做得再差,也比没有好。私有软件做得再好,也比没有不好。所以我选择没有。

自由软件运动的目标就是让软件都变成自由的,GNU不希望你使用任何私有软件。现在我们已经取得了很多的成就,要实现完全自由计算的愿景,我们需要更多的自由软件。

也许私有软件能做不少有用的工作,但是开发私有软件依然是不对的。

参考阅读:http://www.gnu.org/philosophy/when_free_software_isnt_practically_better.html

Q: 现在跟上世纪80年代相比,对于自由软件有何不同?

A: 1980年代时,我们没有自由的操作系统。但那时的开发者还很诚实,他们开发用户想要的软件,不会开发恶意的系统。

现在,非自由的操作系统中,常常包含很多恶意的东西,还促使用户去信任系统,失去对系统的控制。

总体来说,现在的环境比80年代更差。不过,80年代时你没办法找到一个自由操作系统来在你的电脑上运行,现在,我们完全可以在自己的电脑上运行自由操作系统,从这点来说,环境是好了很多。

Posted in

2014新年好

2013年,我做了这些事:

– (只)写了8篇博客

博客空间总访问量85588 PageView(Google Analytics数据),比前一年上涨94%。首页、Kindle Paperwhite使用报告calibre常见问题这几个页面的PV占总PV的50%。2013年新写的文章虽然PV数其实也还行,但是由于排前面这几个实在是占比太高了,所以前50%中就没有它们了。饭否发消息269条,包括照片54张。

– 有关2013年的计划

跟前一年一样,又都没完成,以后再也不在新年Blog上立志了,通过接受群众监督来立志对我已经失效了。

– 自由软件相关

除了参加了几次GDG Hangzhou的活动和在浙大电脑节时在BA5AG老师的实验课上 瞎掰了一些Raspberry Pi的入门知识以外,就没啥了。当然,我还在努力完成自由软件运动领袖Richard Stallman的传记的翻译工作,这本书预计会在2014年内出版。

– 几个IT产品

Raspberry Pi:树莓派占据了2013年上半年的大部分业余时间,除了写了几篇相关的Blog,更重要的当然是翻译出版了《爱上Raspberry Pi》一书,这是我头一回正式出版图书。

Arduino:曾经我认定Arduino是一个不适合我的玩具,不过玩过Raspberry Pi以后,Arduino看上去也变得不是那么复杂了。

二手的Nikkor AF 24-85/2.8-4D镜头:代替了18-135的套头成了现在的挂机头,虽然损失了一些焦段,不过成像质量还是上了一个档次。虽然狗头变成小牛头,不过相机背后那个猪头依然如故。

Yamaha CLP-430电钢琴:虽然拥有一台键盘乐器(也就是说电子琴也行)是我十多年来的梦想,但是我深知自己无法坚持练习,所以一直就没有买。今年买回来以后发现,坚持练习确实是一件非常困难的事情。半年来的成果(其实主要就是半年内前半个月的成果)是能把巴赫的G大调小步舞曲完整流畅的弹下来了。但是,因为没有扎实的基本功训练,所以手型、力度、和弦整齐度和节奏稳定度都是惨不忍睹的。

– 旅游

英国十二日游济南两日游奉化两日游、武夷山三日游、厦门三日游、南京三次共五点五日游。

国内铁路运转里程约5818公里,英国铁路运转里程不详。自驾车行程约7000公里。体验了伦敦地铁,参观了位于英国约克郡的英国国家铁路博物馆。体验了宁杭高铁首发列车。

展望2014年:

上文说了,在这里立志无效了,所以,2014年就这样过着吧。

关注2014维也纳新年音乐会

继续维持传统,第十次写名为关注xxxx维也纳新年音乐会的Blog。前几篇在:2005 2006 2007 2008 2009 2010 2011 2012 2013

2014维也纳新年音乐会CD封面

2014维也纳新年音乐会CD封面

01 Eduard Strauss – Die Schöne Helena-Quadrille; op. 14 – 美丽的海伦四对舞 (2010)

02 Josef Strauss – Friedenspalmen, Walzer; op. 207 – 和平棕榈圆舞曲 作品 *

03 Johann Strauss I – Carolinen-Galopp; op. 21a – 卡罗琳娜加洛普 *

04 Johann Strauss II – Ägyptischer Marsch; op. 335 – 埃及进行曲 (1993)

05 Johann Strauss II – Seid umschlungen, Millionen; Walzer; op. 443 – 百万拥抱圆舞曲 (1988,2001)

06 Johann Strauss II – Stürmisch in Lieb und Tanz; Polka-schnell; op. 393 – 激烈的爱情与舞蹈快速波尔卡 (1991,2010)

07 Johann Strauss II – Waldmeister; Ouverture – 香车叶草序曲 (1983,1991,1996,2007)

08 Johann Strauss II – Klipp-Klapp-Galopp; op. 466 – 噼噼啪啪加洛普 (1993,2005)

09 Johann Strauss II – G’schichten aus dem Wienerwald; Walzer; op. 325 – 维也纳森林的故事圆舞曲 (1974,1983,1990,1994,1999,2005)

10 Joseph Hellmesberger – Vielliebchen; Polka-francaise – 心爱的法兰西波尔卡 *

11 Josef Strauss – Bouquet-Polka; op. 188 – 花束波尔卡 作品第188号 *

12 Richard Strauss – Capriccio: Mondscheinmusik – 月光场景(选自《随想曲》) *

13 Joseph Lanner – Die Romantiker; Walzer; op. 167 – 浪漫者圆舞曲 (1977)

14 Josef Strauss – Neckerei; Polka-Mazurka; op. 262 – 插科打诨玛祖卡波尔卡 作品第262号 *

15 Josef Strauss – Schabernack-Polka; op. 98 – 恶作剧快速波尔卡 *

16 Leo Delibes – Sylvia: Pizzicato  克莱芒·莱奥·德里布 拨弦曲(选自《西尔维亚》) *

17 Josef Strauss – Dynamiden; Walzer; op. 173 – 神秘引力圆舞曲 (1987,2007)

18 Josef Strauss – Ohne Sorgen; Polka-schnell; op. 271 – 无忧无虑快速波尔卡 (1974,1981,1987,1994,2001,2006)

19 Josef Strauss – Carriere-Polka; op. 200 – 驰骋快速波尔卡 (1997)

20 Johann Strauss II – An der schönen blauen Donau; Walzer; op. 314 – 蓝色多瑙河圆舞曲

21 Johann Strauss I – Radetzky-Marsch; op. 228 – 拉德茨基进行曲

2014年的维也纳新年音乐会将由丹尼尔·巴伦博伊姆执棒,这是他继2009年以后第二次亮相维也纳新年音乐会的指挥台。在2009年的新年音乐会上,巴伦博伊姆和维也纳爱乐乐团给乐迷们带来了6首第一次在新年音乐会上演出的乐曲,2014年则有7首全新的乐曲。其中,还包括了理查德·施特劳斯和克莱芒·莱奥·德里布两位作曲家的作品,这是他们的作品首次出现在新年音乐会的舞台上。

理查德·施特劳斯虽然也姓“施特劳斯”,但他可不是圆舞曲世家施特劳斯家族的一员,他是德国著名的作曲家、指挥家。写作了很多有名的交响诗和歌剧作品,比如《查拉图斯特拉如是说》就是其中很有名的一个作品。这次音乐会上选取的《随想曲》选段创作于1942年,是他的最后一部歌剧作品。

2014年是老约翰·施特劳斯诞辰210周年,不过音乐会上包括压轴的op. 228内也只有了两首老约翰的作品,有点小遗憾。在穆蒂指挥的2004年新年音乐会上,选取了6首老约翰的作品,很给人耳目一新的感觉。

自从巴伦博伊姆在2009年打破了以进行曲开场的惯例以后,今年的开场曲更是史无前例的选择了一首四对舞曲,而且是约瑟夫的作品,创新也是维也纳新年音乐会这个传统节目的每年不变的追求。

维也维的森林圆舞曲是一首旋律优美的圆舞曲作品,指挥大师洛林·马泽尔的最爱,在他执棒的1983、1994、1999和2005年的新年音乐会上都选用了这个曲目,并且马泽尔自己也拿起了小提琴,参与到了乐曲的演奏中。2014年,不知道巴伦博伊姆会给大家带来如何一种全新的演绎。

传统与创新并存,维也纳新年音乐会在每个新年的第一天,带来对新的一年最美好的祝愿。

解密GW-BASIC的加密文件

终于解密了一份1993年左右的BASIC代码,这么多年一直想看这份代码的内容,现在终于看到了,颇有一些唏嘘之感。

目前网上似乎搜不到中文资料介绍如何解密加密过的BASIC代码,我总结一下放在这里。聪明人可以直接跳到“解密方法二”阅读。

背景:

DOS下的GW-BASIC在保存代码时,可以存成tokenized、纯文本和加密三种格式,分别对应SAVE命令的默认参数、“,a”和“,p”参数。

对于用了,p参数保存的源代码,以后就只能LOAD到内存中执行,而不允许再LIST查看源代码了。本文介绍的就是用于解密查看,p参数保存的源代码的方法。

解密方法一:

参考GW-BASIC tokenised program format

原理是找到GW-BASIC中标记代码是否是加密的那个内存地址,然后用VAL命令的一个溢出Bug,修改这个内存地址的值。

第一步,运行一下如下的程序,找到加密标记的地址:

FOR I=1000 TO 16000:PRINT I: J=PEEK(I): POKE I,((J=0)AND 255) OR J: POKE I,J:NEXT I

这个程序会导致Illegal function call错误,记下出错前程序打印出来的数字。

第二步,正常用LOAD命令加载要加密的.BAS文件。

第三步,输入下面的程序,并把其中的a%[9]的值”1450″改为第一步中记录下来的数字。

dim a%[14]
a%[0]=0:a%[1]=&h2020:a%[2]=&h2020:a%[3]=&h2097
a%[4]=&h4553:a%[5]=&h2047:a%[6]=&H203A:a%[7]=&H2098
a%[8]=&H1C20:a%[9]=1450:a%[10]=&h112C
a%[11]=&h903A:a%[12]=0
b$=""
b$="123"+chr$(28)+":::"+chr$(137)+chr$(13)+mki$(varptr(a%[0]))+":"
print val(b$) 456

完成,现在已经可以用LIST命令正常列出解密后的代码了。

解密方法二:

当我还沉浸在成功解密了BAS文件的喜悦中时,无心的一次搜索让我又找到了更简单的解密方法

创建一个只有两个字节的UNPROT.BAS文件,这两个字节是0xFF 0x0A。

先LOAD要解密的.BAS,然后再LOAD一下这个UNPROT.BAS,然后就解密成功了。

如果是在DOS下要创建这么个文件还真有点麻烦,比较简单的做法是用DEBUG:

C:\>debug
-e 0100 ff 1a
-rcx
CX 0000
:0002
-n unprot.bas
-w
Writing 00002 bytes
-q

在Linux下使用“360随身WiFi 2”

某人说“360随身WiFi”价格还算良心,我也认同。昨天无意中看到2代开售,就随手撸了一个。当然,为了免邮费,不得不买了点别的东西凑单,于是还买了本价格是这个“360随身WiFi 2”近两倍《C语言点滴》回来看看。

到货,插到电脑上,Linux下没反应。Ralink的无线网卡系统不自带驱动我不惊呆,于是lsusb看了下。

Bus 001 Device 006: ID 148f:760b Ralink Technology, Corp.

好嘛,二代换芯片了,原来是RT5370的,现在换成不认识的了。不怕,把148f:760b放狗搜一下。不过搜完了就怕了,因为结果是0个。

打算先用Windows确认一下设备是好的,结果装了360官网的驱动后发现设备完全识别不出来……这可真是个大乌龙。到360官网的歪粉交流论坛上看看,有类似问题的看来不是个案。换了论坛上公布的新版本的驱动后Windows下工作正常。(截止我写这篇文章的时候,官网上的驱动已经更新成新的了,文件大小为10797000字节,论坛上讨论说设备识别不出来的那些贴子貌似也都直接消失了。)

继续回到Linux下折腾,可是不知道芯片是什么还是为难。从Ralink网站(现在叫Mediatek)上瞎找了几个Linux驱动,里面也没有符合760b这个idProduct的,抓瞎。

用百度搜了一下148f:760b,结果找到了360论坛上一篇新觧出炉的贴子,确认了芯片是MT7601。

剩下的事就简单了,在Ralink网站下载MT7601的Linux驱动,修改common/rtusb_dev_id.c文件,在

{USB_DEVICE(0x148f,0x7601)}, /* MT 6370 */

下面加一行

{USB_DEVICE(0x148f,0x760b)}, /* 360 Wifi */

按照README_STA_usb中的说明make和make install。然后modprobe一下mt7601Usta.ko这个内核模块,后面的事就妥妥的了。

还有个遗留问题,连不上WPA2 Enterprise的无线网络,暂时不管了,我对这个需求不强烈。

啥?这文章只说了怎么驱动这个网卡没说怎么在Linux实现AP的功能?哦,我本来也没打算用它在Linux下做AP来着。有兴趣的话可以试试hostapd/dnsmasq/iptables这老三样吧,我不知道能不能行,如果哪位朋友弄成了麻烦汇报一下,我很想学习学习,多谢了~

2013-10-12更新:MT7601的Linux驱动中似乎没有实现nl80211的接口,所以hostapd没法直接用。不知道还有什么办法能实现AP的功能,如有朋友知道,希望能不吝指教。

2014-08-12更新:留言区中的轩辕志瑜同学找到了一个支持AP模式的驱动,详细的信息请查看相关的文章:http://blog.csdn.net/sumang_87/article/details/38168877,github上的源代码:https://github.com/eywalink/mt7601u。感谢他的分享。

2015-03-12更新:如果是在Raspberry Pi上尝试编译驱动并且遇到困难,请参考《为Raspberry Pi 2编译内核模块

《爱上Raspberry Pi》诞生记

我的第一本译著《爱上Raspberry Pi》上个月底终于正式出版销售了。从开始有译书的想法到拿到成品书,正好5个月时间。我的Blog也正好长了这5个月的草,不过这之间没有因果关系。

《爱上Raspberry Pi》封面

《爱上Raspberry Pi》封面

今年上半年,闲暇的时间比较多,就玩了玩Raspberry Pi和Arduino,兴趣正浓时,看到论坛上有出版社的编辑在征集Raspberry Pi相关图书的译者,于是就与编辑联系了一下。那时正好看了几本Pi的英文书,第一次感觉到原来老外们也出了很多烂书,在看过的几本书中,Getting Started with Raspberry Pi这本书是那个时候内容相对说得过去的一本。由于编辑手头有几本书都已经找到译者,我就随口问了问这一本,没想到这位编辑正好在跟O’Reilly谈这本书的引进合同,真可谓无巧不成书了。

为了争取到翻译这本书的资格,我主动根据手头的电子书(盗版的,惭愧)先试译了一章,发给了编辑。于是,很顺利的,3月20日,我就与出版社签定了“委托翻译合同”。

“委托翻译合同”从名字就可以看出,译者的事就是翻译,翻完了就没你什么事了。稿费按不含空格的字数计算,每千字稿费低到难以想象。译稿的版权出版社以稿费的形式直接买断,译者只有属名权,出版后的书卖多卖少跟译者都无关了。出版社违约的话,只需部分支付稿费。现在大环境就是这个样子,也没啥办法。

4月15日,通过电子邮件联系了原书作者Matt Richardson,请他给写了个中文版序。后来才知道,出版社好像比较忌讳译者与作者直接联系,不过那时无知者无畏,反正中文版序是到手了。

合同交稿时间是4月20日,不过由于出版社到4月19日才拿到O’Reilly给的英文样书,而我又想根据英文纸书对译稿进行正式的审校,所以虽然那时翻译已经完成了,实际交稿的时间还是协商延迟到了5月15日,期间我自己把译稿通读了七八次,并请好友帮忙审阅了几轮。幸亏书不厚,才有机会这么细致的审核,不过看到最后,真是想吐了。

6月5日,出版社提供了打印出来的初校样,由译者进行审阅。实话说,这个初校样让我大跌眼镜,上面有各种排版错误,甚至还会出现原译稿中没有的错别字。校了3天,200多页的书中找出了100多处错误,其中属于原译稿错误的不到10处。

6月22日,我在家里的Raspberry Pi上用gor这个用Golang写的Blog系统搭建了一个小网站,用作本书的支持网站,提供勘误表和电路图,域名是http://rpi.freemindworld.com。不过后来为了保证网站稳定性,迁移到我的Linode上去了。Raspberry Pi上的那个Web服务换了个了域名,同步运行,域名改为http://rpirpi.freemindworld.com

7月中旬,进入三校阶段,遗憾的是三校的版本中依然是错误多多。咬着牙把三校版又仔细看了几遍,改了六七十处错误。8月上旬,核红稿校对中又发现了少量问题,不过总算错误数开始收敛了。

7月18日,出版社领到了书号:ISBN 978-7-03-038196-5。有了书号,我就在豆瓣上创建了相关的图书页面。

8月8日,又仔细把最后一个版本的核红稿给看了一遍,这次问题终于比较少了,修改了几个不痛不痒的小问题后,终于在8月8日下午进厂印刷。

8月19日,出版社拿到了印刷厂的校正本样书。8月25日,我拿到了第一本校正本样书,劳动终于结成了果实。

销售方面,各主要B2C电商中,8月23日,当当网第一个上架了此书,不过一直处于缺货状态,直到9月5日。其次是亚马逊中国,但很长一段时间上面只有第三方卖家出售,也是到9月初才开始有自营的。最早有现货可以正常发货的是北发图书网,而且还是所有B2C电商中售价最便宜的。

中文版图书的封面,最终是由O’Reilly来设计的,显然采用了与原书和这一系列书中文版一样的公版设计。7月底给了第一稿,按我的要求微调了一下以后,8月5日定稿。

总结一下出版过程,作为译者来说:与出版社编辑联系,确定翻译意向,试译,签定翻译合同,翻译,交稿,审校样,拿样书。

身边也有不少朋友表示对出书有兴趣,其实现在作译者与编辑那里存在一个信息不对称的问题。编辑们手上有很多书或选题找不到人来翻译或原创,而有心出书的人则不知道应该怎么去跟编辑联系。所以与编辑联系是整件事情的第一步,其实借助搜索引擎或微博,这件事情并不难完成。同时,与编辑之间建立友好、信任、合作的关系,会对整本书的出版过程起到重要推动作用。

最后帮我的编辑做个广告,目前还有几本有关Raspberry Pi的书在寻找合适的译者。书都不厚,如果想体验一下出书的乐趣和痛苦的朋友,可以通过我与编辑取得联系。 这几本书主要是Step-by-step的教一些Raspberry Pi的入门操作知识,技术含金量不高,但翻译起来会比较轻松。