ZeroNet Blogs

Static ZeroNet blogs mirror

我们不买教训

- Posted in TypeBlog by with comments

在昨晚的电视新闻中,有人微笑着说:"你把检验不合格的厂商都揭露了,叫这些生意人怎么吃饭?" -- 龙应台 《中国人,你为什么不生气?》

我不想炒冷饭。可是前两天看见百度的事情,我又忍不住了。龙应台这篇文章,已经是多少年前的东西了,可是这江山易改,本性还真是难移啊。


今天下午我外婆去买虾。回家一称,短了不少斤两。外婆很生气,自己懊恼了半天。我妈知道以后跟她说,去找那个摊贩算账吧。外婆表示同意,拿起发票和东西就往门口走。走到一半自己就站住了,嘴里念叨

我这都回来了再去找他,他要是耍赖怎么办呢。

念叨着念叨着自己就犹豫了,脚步也变成了朝向远离门的方向。她跟我妈说

算了吧,我想我也说不过人家。花钱买个教训吧。

她俩又商量了好一会,我也没听清。最后这事就一笑了之了:

人家缺斤两,赚的钱也没咱多嘛。

这是今天下午发生的真事。不过,如果我们换一个场景,会怎么样呢 --

这病都好多年了,一直没好。几个月前百度搜了一下,发现百度结果首页有一家叫『XX』的医院好像有什么特效疗法,价格也不便宜。不管了,有法总比没有好。去了以后,开了一大堆药,到最后却发现合着这是个骗局?钱花了,结果自己也奄奄一息。想着是不是应该去投诉百度,可是我说的过百度吗?唉,花钱买个教训吧。

花钱买你妹的教训!

原谅我爆粗口。仔细想想看,你自己,你家人,你朋友,多少次说过这种话?请问,教训需要花钱买吗?花钱买得到教训吗?

永远买不到!

当你花钱被骗,当你的权益受到侵害的时候,你若是用这种自我安慰的话来妥协,你实际上是在帮助不法分子不断升级他们的技俩。你以为你买了个教训,实际上你在为这些人投资,骗术的升级比你得到教训的速度更快。今天你买了一个教训,明天你又买了个教训,您这一辈子难道只买教训吗?!

这种自我安慰的话语背后,是懦弱。你在维护自己的权益之前,就开始考虑对方会怎么样,就开始考虑你可能会遇到怎么样的困难。拜托,对方是不法分子,不是什么需要你的换位思考的人啊。你代替对方打败了自己,你败得落花流水。

这种自我安慰的话语背后,可能还有一种老不死的文化。老不死的什么文化呢?『隐忍』二字是也。也许你不懦弱,也许你下定了决心要得到真相,可是总有一些苍蝇蚊子在你耳边飞来飞去

算了吧,对方也不容易。忍一忍吧。

总有人想要告诉你,你应该忍一忍,你应该稀里糊涂让这种事情过去。大事化小,小事化了。所谓古人的智慧,所谓中国人的传统性格,我看,一点也不伟大啊。这不过是试图以牺牲自己的利益换取所谓的稳定和谐。可是,所有人的利益都被牺牲的时候,这稳定这和谐的价值在哪里?和谐是要为了每个人的利益服务的。所谓『这盛世,如你所愿』大概就是这种文化的最好的写照。

和朋友相处,他不触及你的底线,你可以『和为贵』,因为这不是商业交易。然而当侵犯你的权益的人大把大把数着钞票,吃香喝辣,美女相伴的时候,你这个受害者又怎么能够轻易妥协?我对他不生气,你对他不生气,那有谁会真的站出来,去与这些恶心的行为作斗争?又还有多少个无辜的魏则西要死在企业家的摇钱树下?

中国的互联网巨头们,尤其是百度之流,所犯下的恶行,也不是一天两天能洗刷清楚的了。可是到现在,我只在微博的技术圈子里面看见一群人在裱百度,我从来没看见技术圈外的人,哪怕只有一点点,对百度有意见。即便是在对百度不满意的人中,我也从来没看见有哪个人站出来带头抛弃这个恶心的搜索引擎,或者带头将百度的恶行公之于众。

我恳请你们,醒一醒!我们从来,也永远不会,花钱买教训!

ZeroNet 已经有了 可选文件 (optional files) 功能,这意味着当站点需要插入图片/文件资源时,可以把文件设为可选,然后插入网站,这样只有当浏览器请求这个文件时,文件才会被从其他节点下载。

但是,要在 ZeroBlog 上使用这个功能,还是比较麻烦。需要手动把文件复制到网站目录下,然后才能在文章中插入。有时候,作为一个懒癌,实在是都懒得动手打开个命令行或文件管理器😂。所以我决定给 ZeroBlog 的文章编辑器添加一个上传文件功能。


由于我是前端渣,所以这一个小功能折腾了有一会儿。效果如图

Screenshot_20160430-153650.png

就是在编辑器的底栏添加了一个 Upload file 按钮。点击后,将会触发浏览器提供的文件选择器。选择文件后将询问是否确认上传,一旦确认,文件就会被添加到网站的 data/res 目录,并以 Markdown 链接或图片的形式插入当前光标处。

要确保图片是可选文件,只需要在 content.json 把整个 data/res 目录加入 optional 列表即可

"optional": "data/res/.*"

每次发布新内容并签名后,ZeroNet 就会自动搞定以前需要手动做的一切工作。

这个功能是利用浏览器的 File API 实现的,所以在古董级浏览器上可能无法使用,我不能也不打算做任何兼容层。由于 FileReader 可以把文件内容以 Data URL 形式输出,其编码方式是 base64, 而 ZeroNet 的 API 又恰好接受 base64 编码后的文件,所以一切都变得简单多了。

上传前需要手动把文件名中的非 ASCII 字符去掉,否则可能失败,我也懒得在代码里做 escape 了 = =

要想使用这个扩展,你只需要把本站的 all.jsindex.html 打包拿走就行了。不过,这只适用于基于官方 ZeroBlog 的博客,对于其他各种修改版,你就不能直接覆盖文件了。不管怎么说,源代码我也已经丢在网站目录里了,可以拿去对照修改。

以上。

我们为什么要去中心化

- Posted in TypeBlog by with comments

有时候,过分去中心化是 bullshit

这是我去年说过的一句话。然而,现在的我却『义无反顾』地投入了 ZeroNet。于是,我就这么漂亮地打了自己一个耳光。

需要写在前面的是,去中心化并不完全等同于匿名化。Tor 就是一个典型的例子:虽然其网络(在理想情况下)是高度匿名化的,但是 Tor 上的隐藏服务仍然需要一个 中心服务器,离开了这样的中心,Tor 的网络也失去了意义。从这样的角度来看,Tor 就仅仅是一个匿名化的网络,而不是去中心化的网络。而 ZeroNet 就是一个高度去中心化的网络,但是,ZeroNet 本身并不比 BitTorrent 更加匿名。它必须借助 Tor 之类的匿名工具才能做到隐藏自己的 IP。


发布的自由

或曰:发布者的平等。你只要能访问网络,便可以平等地发布内容,不另外设置门槛,甚至在只有内网 IP 的条件下你也能自由地发布内容。你不需要购买昂贵的服务器,只要你所发布的内容有足够的价值。每个人都是平等的个体。

内容的自由

即:在一个去中心化的网络上,内容的传播是自由的。这不意味着传播者本身的自由,而是说,当内容被发布者发布之后,只要内容具有一定的价值,它便可以存活于互联网之上。它所依赖的是内容接受者的评定,而非某一个或几个中心的观点。当网络去中心化,(在理想的情况下)内容的存活与否只与内容本身的价值有关,内容的存活将无关乎任何权力机关,无关乎任何外部的审查。当世界各国和各大互联网公司都在努力争取互联网的控制权时,这样的网络便成为了世外桃源一般的存在。

永远在线

因为在去中心化的网络上,每个访客也必须是一个传播者,当访客越来越多,内容便不再依赖于某几台主机的在线与否。即使最初的发布者家里的网线已经被剪断,他所发布的内容仍然存活在这样一个网络上。只要网络还存活,传播节点还至少有一个,内容就不会死亡。内容的存在与否不依赖于一台或者几台中心服务器。这实际上也保证了内容的自由性:没有人可以通过干涉网络本身的方式来阻断内容的传播。

速度

这个问题好像不是什么大问题,但确实是一个大问题。在某些国家,国际出口带宽本来就不那么充足,又被奇怪的攻击流量占去了一大半,这无形中阻碍着人们访问国际互联网的自由。即使是完全合法合规的网站,也会因为奇奇怪怪的丢包问题而慢到无法忍受。这就促成了 CDN 的诞生。然而,去中心化的网络本身,从某种程度上说,就是最好的又是最廉价的 CDN。一个知名度足够高的去中心化站点,总会拥有遍布各地的传播节点,甚至可能就在你家楼下,或者就在同一个城市内。两个节点之间距离越近,越可能拥有较高的传输速率。当网站都能在弹指一挥间访问到的时候,又有什么能阻碍人们获取信息呢?

互联网哲学

也可以说是『互联网原教旨』,即相信互联网最初的目的就是去中心化,就是如上面三点一样的存在。看看近二十年前的互联网就知道,那才是一个高度去中心化的互联网。自由、平等、开放,也许只在那时的互联网里真正存在。只是,进入二十一世纪以后,各国家都在想方设法使互联网不再像当初那样自由、平等、开放。两个著名国家的两个名字由三个字母组成的机构就是最典型的例子。像 ZeroNet 这样的去中心化网络,带给人们的感觉便是像乘上了时光机,回到互联网最自由的年代。也许,这才是真正的互联网,这些项目的目的,仅仅是在互联网上实现真正能被称为互联网的互联网。

安全性

正如我前面所说,去中心化并不能等同于匿名化。在 ZeroNet 上,你无法直接保证你身份的匿名性。去中心化是为了自由,而匿名性是为了安全。所以,你如果觉得你在 ZeroNet 上的言论比较危险,你决不能没有安全意识。至少,虚拟机和 Tor,是必备的。另外,如果你想在 ZeroNet 上访问色情等内容,情一定记得 加密你的硬盘。我再说一次,去中心化不等于匿名!

而我,我使用这样的去中心化网络,大概只是为了这种自由的感觉吧。

第一个 ZeroNet 应用: +1s

- Posted in TypeBlog by with comments

其实我也并不想搞个大新闻把谁批判一番,我只是想写个东西学习下 ZeroNet 的 API,又没啥好写的,所以我就做了一个

+1s

简单介绍一下,正如名称所言,这是个 分布式+1s系统 , 通过用户数据存储总秒数并支持显示排行。基本上就是按照官方教程做的一个轮子,权当娱乐。

Well, 实际上,这完全是我给自己挖的大坑。

本来建立一个 ZeroNet 上的网站是很简单的,只要 clone 一个其他网站然后写点自己的内容就完事了。本来……然而出于爱折腾的本性,我决定自己从 GitHub 上拉取 ZeroBlog 的源代码自行从头部署。本来以为也就是 copy-paste 的事情,可是,为什么,为什么会变成这样呢……

初始内容

使用 siteCreate 命令建立好网站以后,在站点目录有一坨默认内容,当然是必须删掉的。然而,最初我以为,只要删掉这些默认内容,然后把 ZeroBlog 的文件拷贝过来,就算完事了。于是我就这么做了。当我签名好以后,尝试本地访问该站点,发现站点上什么也没有。重要的不是什么也没有,而是什么功能也不工作,新增文章、编辑标题等按钮无论怎么戳都没有反应。第一个坑就这么撞上了。

后来我折腾了一晚上,也没什么进展,导致我星期五晚上12点才睡觉,星期六一天都没精神。早上我才忽然想到,每个站点都应该有个 data 目录用于保存数据,而我这个新建的站点只有 data-default -- ZeroNet 并没有自动使用这默认数据。而当克隆一个站点时,这个目录内的数据将被用于生成默认数据库。没有数据的站点,自然没法正常工作了。

于是解决方法也非常明了了:复制一份 data-default 并命名为 data, 并且将 data/users/content-default.json 重命名为 content.json, 然后对站点重新签名再访问,一切都正常了。

评论登录

使用评论系统的前提,是在站点的 content.json 内加入

"includes": {
  "data/users/content.json": {
   "signers": [],
   "signers_required": 1
  }
 }

如果没有这一段,那么评论系统根本没有可能正常工作,会直接报错,也就连撞这个坑的机会都没有了。

ZeroBlog 默认的评论系统是依赖 ZeroID 的用户系统的。然而,当我终于让站点正常工作时,我却发现,一旦在评论处登录 ZeroID,站点会立马抛出异常而停止正常工作。当时报的是一个 Python 异常,大意是 UiWebsocket.py 中某处发生了类型错误。我以为是零网的 bug ,在源码中跟踪了半天,发现这个类型错误实际上是因为读取 data/users/content.json 的函数因失败而返回了 False。这个问题,我折腾了近五个小时,后来发现错误的根源是读取 data/users/content.json 时,程序无法找到 inner_path 这个 key,从而无法读取文件信息。我实际上并没有完全理解为何要有这个配置项的存在,因为只需要这样写

"inner_path": "data/users/content.json`

即指向这个配置文件自身,就好了。

评论发布

总算把登录折腾正常了,评论发布又出了问题。每次发布评论,小按钮就会转半天,然后提示发布失败。去命令行里查看错误提示,它说,文件非法 ( File invalid )。这就让我十分为难了:文件为何会非法?

Erkan 那里,我得到了答案: data/users/content.json 也是需要站主签名的。只需要对这个文件也执行签名

python2 zeronet.py siteSign sitehash --inner_path data/users/content.json --publish

再重新对整站签名即可。

用户存储

ZeroBlog 默认给每个用户分配的评论空间只有 10K,这简直不能忍。所以我们需要扩容:在 data/users/content.json 中把 max_size 改成更大的数值,然后对其重新签名即可。

BTW: 修改这些文件如果死活不生效,莫慌,重新开一下 ZeroNet 试试

其他

由于站点空间有限,你可以在 content.json 内设置 ignore(data/.*db|data/users/.*/.*),忽略不必要的文件。

以上。

Hello, world

- Posted in TypeBlog by with comments

Hello, the decentralized world of ZeroNet!