局域网内高速端口向低速端口发送数据,流控不当会有严重的帧溢出风险,引发上层丢包、乱序、重放等问题导致 TCP 重传;从而导致对重传敏感的无线信道性能急剧劣化。建议正确的全链路配置802.3x
标准支持实现链路层流控,同时高速发送端使用对丢包不敏感的拥塞控制算法 BBR
。对于带无线接入的家庭环境,放弃 TrueNAS Core ,使用 TrueNAS SCALE 并配置BBR
。
NAS 使用 TrueNAS Core ,万兆 SFP+ 直连主路由( RB5009 ),AP 使用 U6 Enterprise ,2.5GbE 接入主路由。AP 下连客户端协商速率隔墙可达 1.7Gbps ,SMB 从 NAS 中下载文件速率不足 30MB/s ,视无线环境可能更糟,上行可以正常跑到 110MB/s 以上,最高可达 150MB/s ,iperf3 双向测速情况和 SMB 表现基本一致,多线程可缓解,有线条件下一切正常。降级到全千兆接入,问题也极大缓解。
网络拓扑如图所示:
下载:
上传:
问题最早发现的时候还不是这套无线设备,经过漫长的更换设备排查和观察定位,发现以下现象:
1 、主路由 SFP+ 口处发现海量 Rx Overflow
2 、客户端上抓包发现大量的 Dup ACK 和由此导致的 Retransmission ,还能看到很多 Out-of-Order 此处未截出
3 、TrueNAS Core 默认拥塞控制算法为 NewReno ,更换为 Cubic 之后好了一点,但很有限
基本可以确定是高速端口在向低速端口发送数据的时候,因为没有正确的流控导致交换设备出现严重的溢出;同时更上层的拥塞控制算法,因为对丢包过于敏感,未能将发送窗口协商至合理的链路带宽;加之无线信道对重传也敏感的多,多种因素综合导致了无线下行拥塞大爆炸,下行速率远劣于上行。问题找到了,于是动手解决:
1 、RouterOS 所有端口手动配置 Flow Control
(是的,默认未启用)
2 、更换 NAS 系统为 TrueNAS SCALE 并配置 BBR
下行立刻恢复至 130MB/s:
不建议无差别启用链路层流控
在我本人的例子中,Rx Overflow 发生在交换设备的高速端口处,按理说只要交换机和端口上游(即 NAS 的网卡和系统)支持并启用(我使用的 ESXi 虚拟化方案和 CX4 网卡,应该都默认启用了),就可以暂停这条链路上的发送了。
启用后确实遏制了万兆口处 Rx Overflow 的进一步增长,但对速度的提升效果没预期那么好。有可能这个时候卡点变成了 AP 的无线链路本身,这里的 Flow Control
行为我就不太能控制了,Unifi App 里自己的 Flow Control
设置似乎是针对它家交换机的。
而且 802.3x
还有另外的副作用,即会无差别暂停掉整个链路的发送,在多设备重负载场景下对链路稳定性有负面影响。这个特性行为简单,应该是用来减缓一些没有流控和完整性保证能力的简单协议的丢包的。像 TCP 这种传输层协议,最好还是传输层自己做流控的保证,选用合适的拥塞控制算法。从这个角度看,RouterOS 默认不启用链路层流控是很合理的,是否启用请读者自行评估。
首先进入Sharing
- Windows Shares (SMB)
, 选择希望对无访问权限用户的共享项,点击Edit
- ADVANCED OPTIONS
,勾选Access Based Share Enumeration
。 如果此处不可勾选则需要把Purpose
选为No Presets
。
启用Access Based Share Enumeration
后,该共享就不会对无访问权限的用户展示。但该权限并不是由ZFS Filesystem ACL
,而是由 Samba 实现的Windows ACLs
控制,需要另行编辑。
还是找到需要隐藏的共享项,打开Edit Share ACL
。修改ACL Entries
中的Everyone
为DOMAIN/NAME
即可,其中DOMAIN
一般为主机名,NAME
则为你希望授权对其展示的用户名,也可根据需要自行配置权限。填写这两项需要将SID
( Windows Security Identifier )留空。也可不填写DOMAIN/USERNAME
,直接填写SID
。系统中所有用户的SID
可以通过命令net usersidlist
获取。
当然在 CLI 下也可以通过sharesec
命令来配置 Share ACLs,附文档 :https://www.samba.org/samba/docs/current/man-html/sharesec.1.html
时隔三年的新文,懒得插图,各位将就着看吧。
]]>首先准备 Linux Server 一台,本文中使用的系统为 Ubuntu 16.04。
网上开源的 Tracker Server 实现有不少,经过对比,我们采用 bittorrent-tracker 这一项目作为我们的服务端。因为其同时支持 IPv4 和 IPv6 和 http、udp、websocket 等多种上报方式,且部署简单。
首先安装 nodejs 和包管理器 npm:
1 | $curl -sL https://deb.nodesource.com/setup_11.x | sudo -E bash - |
安装 bittorrent-tracker:
1 | $npm install -g bittorrent-tracker |
若只想搭建一个简单的 tracker,安装完毕后运行$bittorrent-tracker
即可开始使用,更多参数请自行探索。
个人比较常用 http 向 tracker 进行上报,但是现在已经到了 8102 年末了,http 这种明文协议不应该成为我们的选择。
所以我们使用 nginx 进行反向代理来反代 http 请求,同时使用 TLS 加密所有连接。
当然首先你需要有一个域名和对应的证书,推荐使用 Let’s encrypt 的免费证书。我使用它们家的证书 bot 来自动签发和管理 nginx 配置文件 TLS 部分内容。为了便于说明,下文中以TRACKER_DOMAIN
替代我使用的域名。
首先安装 nginx,因为后续需要使用一些特性,我们安装完整版的 nginx:
1 | $sudo apt install nginx-full |
编辑 nginx 配置文件:
1 | $sudo vim /etc/nginx/sites-enabled/tracker |
1 | server { |
配置完成后重启 nginx,并启动 bittorrent-tracker 即可:
1 | $service nginx restart |
注意因为 http 请求由 nginx 处理,所以服务端仅需要监听在127.0.0.1
即可。--trust-proxy
参数必须打开,用于保证服务端从X-Forwarded-For
字段获取客户端真实IP。
有时候出于安全和全球访问稳定性考虑,需要将服务器真实 IP 通过 CDN 隐藏起来,通过 CDN 转发所有请求到服务端。对于一般用户来说, Cloudflare 的免费套餐是一个好选择。但是 CDN 在转发请求时会导致 nginx 将 CDN 服务器地址一并加入X-Forwarded-For
字段转发给 Tracker 服务端,导致错误的记录。这需要使用 nginx 的 Realip 模块来将 CDN 的 IP 排除:
1 | server { |
WireGuard 是一个全新的隧道协议,其 Linux 实现工作在内核态下,即将被整合进 Linux 内核主线,同时也有用户态的不同平台实现。
WireGuard 官方公布的 WhitePaper 中自称为 Next Generation Kernel Network Tunnel,区别于传统 SSL VPN 和 IPSec VPN,配置极为简单,运行高效。
Linus 评价其为“ it’s a work of art.”
因为其要被整合进 Linux 内核主线的新闻,WireGuard 最近着实火了一把,我也慕名使用了一下。就我个人的使用体验来说,WireGuard 非常棒,虽然是抱着科学上网的想法去测试,但是在用过之后被它深深地折服了。WireGuard 把组网这件事做的简单到了极致,配置部署均非常简单,几乎可以和Shadowsocks 相比。再回过头看 OpenVPN、IPSec VPN 等协议的繁琐部署流程,WireGuard 太友好了,无愧于 Next Generation 之名。
同时 WireGuard 的性能也相当不错,就我个人测试在 ER-X 这种 MIPS 路由上也能做到很高的吞吐,同时可以有效利用多核。另有网友测试在 ASUS AC86U 这种路由上能够跑到 400Mbps+。
另外 Windows 下还没有官方的开源实现,一直是 coming soon,有一个第三方的闭源客户端 TunSafe,开发者是曾经 uTorrent 的开发者,但 WireGuard 作者在官网和Reddit上均表示极力不推荐使用(后续:TunSafe 现已开源)。
目前除了 Windows 外的绝大多数平台均有官方实现:https://www.wireguard.com/install/
1 | $ sudo add-apt-repository ppa:wireguard/wireguard |
如果你手动进行过更换内核等操作,在启动 WireGuard 时可能会遇到以下问题:
$ [#] ip link add wg0 type wireguard
$ RTNETLINK answers: Operation not supported
这是因为系统中缺失了相应版本内核的 Linux header,可以在这里下载对应内核版本的 linux-headers-all
和 linux-headers-generic
按顺序进行安装:
$ sudo dpkg -i downloaded_headers.deb
需要安装包管理器 Homebrew
$ brew install wireguard-tools
下载路由对应版本的 deb 文件:
https://github.com/Lochnair/vyatta-wireguard/releases
$ sudo dpkg -i ./yourfilename.deb
WireGuard 官方提供了一个快速配置部署的脚本,安装 WireGuard 完毕后可以直接使用 wg-quick
命令调用。
WireGuard 每个 Peer 都是平等的,可以接受或发起连接。每个 Peer 拥有一对公钥和私钥,私钥自己保管绝不泄露,公钥需要在两个建立连接的 Peer 间交换。
同时为了防止未来可能存在的量子攻击,WireGuard 还额外引入了 PreSharedKey Layer 对所有数据包进行对称加密,尽管短时间内量子攻击可能并不现实,但是可能无意间引入了对抗 GFW 审查的一种方式(类似 Shadowsocks,但 WireGuard 仍是有握手过程的,所以到底有没有效果笔者并不能确定,也未经过仔细思考,仅为臆测。)
首先需要在每个客户端上生成密钥对:
1 | $ wg genkey > privatekey |
仅需要生成一次 PreSharedKey,这个密钥同时部署在两端 Peer 上:
$ wg genpsk > psk
假设存在 Peer A、Peer B,在其之间建立一个 Tunnel:
我们假定连接端口均为 51820。
Peer A Config File:
1 | [Interface] |
Peer B Config File:
1 | [Interface] |
在两端机器上执行:
$ sudo wg-quick up $CONFIGFILE
若 Peer A 在 NAT 之后无法直接访问,可以删去 Peer B 文件中的 Endpoint 参数,仅由 Peer A 主动发起连接,也可以成功建立 Tunnel。
AllowedIPs 参数可以通过逗号分隔符继续添加,wg-quick 会自动帮你添加走该 interface 的路由表。
1 | $ wg genkey > /config/auth/privatekey |
本文作者Bret Stephens是一名美国记者,2013年曾获普利策奖,2017年4月加入《纽约时报》。本文是他9月23日在悉尼罗伊研究所媒体颁奖大会上的演说。
首先请允许我对罗伊研究所专门把我请到悉尼来以及今晚在这里对我的款待表示感谢。
我清楚地知道,你们选择我来发言,是面临很大压力的。我十分尊重科尔文家族的意愿,所以来到这里纪念马克·科尔文这位无畏的驻外记者、优秀的作家和主持人。我尤其要感谢研究所的所长迈克尔·弗利洛夫,他一直也没有撤回对我的邀请。
在美国的大学校园里,形成了一股令人沮丧的趋势。大量的演讲者都被撤回了邀请,他们在大学里的活动被迫强行取消,这里面包括前任国务卿亨利·基辛格和康多莉扎·赖斯,哈佛大学前校长拉里·萨默斯,演员亚历克·鲍德温,人权活动家阿亚安·希尔西·阿里(Ayaan Hirsi Ali),DNA的共同发现者詹姆斯·沃森,印度总理纳兰德拉·莫迪,制片人迈克尔·摩尔,普利策奖得主、保守派专栏作者安娜·昆德琳(Anna Quindlen)。这仅仅是其中几位而已。
这份名单上的名字都那么显赫,我现在想想,都有点后悔你们没有撤回对我的邀请。
今天我演讲的主题是“异议:一门消亡的艺术”。这个话题对我个人而言十分重要,因为我就是靠不同意见谋生的。异议本身对我也很重要,因为这是任何一个文明社会中必不可少的成分。
不管是同意加入一个组织,或者服从一个政治权威,或者皈依一个宗教信仰,“我同意”这几个字或许是每一个共同体的基石。但是,说出“我不同意”,“我拒绝”,“你是错的”,“虽千万人吾往矣”——这些却定义了我们的个性,赋予了我们自由,培养了我们的宽容,拓宽了我们的视野,推动了我们的进步,使我们的民主更加真实,给四海受压迫的人带去希望。伽利略、达尔文、曼德拉、哈维尔、刘晓波、罗莎·帕克斯,还有纳坦·夏兰斯基——持有异议的人,光辉地点缀着史册。
我认为现在的问题就是,我们在这方面失败了。
这听起来似乎很难理解。就美国来说吧,几十年来美国人的意见分歧从来没有这么强烈过。我们在种族问题、卫生间政策、医疗法案,以及我们的第四十五任总统(唐纳德·特朗普)这些议题上,都有各种各样的不同意见。我们在收音机和有线电视的咆哮声中表达我们的不同意见,而且表达的方式越来越恶毒。街上和校园里的示威越来越暴力,人们之间对话的火药味越来越浓。在这个时代,我们用自己的政治立场来在道德上评价他人。
这也不是一个刚刚才出现的现象。大量的调查数据表明,共和党人比二十年前右倾得多,民主党人则左倾得多,双方都越来越视对方为对国家发展的威胁。
这种极化也是地理上的,越来越多的人选择在居民与自己政治观点相近的地方生活。这种极化也是越来越针对个人的。整整百分之五十的共和党人不想让自己的孩子与民主党人结婚,三分之一的民主党人也这样想。跨党派婚姻取代了跨种族婚姻,成为新时代的家庭禁忌。
最后,这种极化也是数字化的。越来越多的美国民众生活在与世隔绝的泡泡里,只接受与他们自己意识形态相符的新闻和社交媒体。我们不仅仅持有自己的观点,而且根据不同媒体选材的不同,还持有自己创造的“事实”。上次大选期间,投票给特朗普的人有整整百分之四十表示福克斯新闻网(FOX News)是他们的主要新闻来源。这一点我们可要好好感谢一下澳大利亚。(福克斯新闻网的拥有者鲁伯特·默多克是澳大利亚人。——译注)
正常而言,我们做一件事越多,就越擅长这件事。但在异议这方面却恰恰相反:我们做的越多,质量就越差。我们如今的不同意见或许常常能让嗓音变得嘶哑,但却很少能让我们的思维变的敏锐,更不用说改变一个人的想法了。
我们应当问问为什么。
三十年前,在1987年,芝加哥大学有一位哲学教授叫阿兰·布鲁姆,当时以翻译柏拉图的《理想国》和卢梭的《爱弥儿》而闻名。那一年他出版了一本博学的著作,是关于美国高等教育的,叫做《走向封闭的美国精神》。
这本书出版的时候,我正在上高中。当时我读这本充斥着柏拉图、韦伯、海德格尔和施特劳斯的书,感到非常吃力。但我还是领会了这本书的精神——我应该努力考进芝加哥大学,去读那些名著。这也正是我所做的。
一个人从以名著为主的课程中学到了什么?肯定不是当代美国意义上的“保守主义”。我们没有学到去成为一个爱国者,或者虔诚的宗教信徒,或者去崇拜吉卜林口中的“市场之神”。我们也没有被灌输马克思主义的邪恶、资本主义的光辉,甚至也没有西方文明的优越。
现在回想起来,我的学校可以说什么也没有教给我们。我们所做的就是阅读那些提出有关人类境况的严肃问题的书籍,促使我们也去提出自己的严肃问题。教育从这种意义上来讲,并不是一个“教”的过程,也没有什么固定的课程。教育是一种思考的训练。
去倾听,去理解;去询问,去提出异议;不把任何主张奉若神明,不把任何异议视作亵渎;愿意去考虑不受欢迎的想法,培养开放的思维——这些是我在芝加哥大学的老师鼓励我去做的。这才是人们曾经所称的自由教育(liberal education)。
当时的芝加哥大学使我们看到,每一个伟大的思想,其实都只是另一个伟大思想的异议。苏格拉底不同意荷马,亚里士多德不同意柏拉图;洛克不同意霍布斯,卢梭他们两个都不同意;尼采不同意所有人,维特根斯坦不同意他自己。
这些不同意见从来都是对事不对人的。就政治的正常意义而言,它们也不是政治化的。有的时候,这些异见跨越了几十年甚至几百年的时间。
更重要的是,这些异见没有一个是建立在误解的基础之上。正相反,它们是建立在完全的理解之上:充分地咀嚼了对手的观点之后,方能正确地将其吐出来。
也就是说,要想很好地提出异议,必先很好地达成理解,必先深度阅读,仔细聆听,认真观察。要在道德上给自己的对手足够的尊重,对他的想法不存偏见,理解他的动机,参与他的思考,还要做好自己有可能被他说服的准备。
《走向封闭的美国精神》就是建立在这种不同意见的传统之上。20世纪60年代以来,美国的大学似乎很流行把那些“已死的欧洲白人”(指上面提到的哲学家们——译注)视为社会和政治压迫的工具。而阿兰·布鲁姆则坚持认为,恰恰相反,他们是精神解放的最佳途径。
他还认为,要维护自由民主,就需要经过了自由教育的人民,至少这一点是无可争议的。自由社会要想运转,开明思想不能仅仅是一个标语和教条,而必须成为一种个人习惯,尤其对待我们不同意的人,更要保有开明思想。
早在三十年前,这个习惯就已经走向消亡了。而如果你关注这几年美国校园的新闻的话,会发现情况又糟糕了许多。
布鲁金斯学会的最新调查显示,相对多数的大学生——整整44%——认为第一修正案不保护所谓“仇恨言论”(hate speech),但事实上它当然保护。更令人震惊的是,多数学生(51%)认为通过大声叫嚷来打断自己不同意的演讲者是“可以接受”的。还有20%的学生认为通过暴力来阻止一个人发言是可以接受的。
这种态度几乎每周都在美国的各大校园得以彰显。有的演讲者像以色列大使迈克尔·奥伦在加州大学欧文分校遭遇的那样,被有组织的示威者打断。还有的演讲者像保守派评论员本·夏皮罗(Ben Shapiro)那样,在斥资数十万的安保之下才敢进入校园。还有的演讲者,像希瑟·麦克唐纳(Heather McDonald,美国喜剧演员、作家)在克莱蒙特麦肯纳学院,被用野蛮暴力阻止登上讲台。甚至有一些教师,像耶鲁的艾丽卡(Erika)和尼古拉斯·克里斯塔基斯(Nicolas Christakis)夫妇,因为所谓“伤害了学生的感情”,就被学生百般凌辱,不堪其苦。
暴力事件也层出不穷。听听明德学院的教授艾莉森·斯坦格(Allison Stanger)讲述她三月在主持与自由意志主义学者查尔斯·穆雷(Charles Murray)的对话时的遭遇:
示威者成功地破坏了这场讲座。我们被迫转移到另一处地方,改用网络直播。但一些示威者发现了我们的新低点,就开始大声敲击窗户,并触发警报。随后,我和穆雷博士离开了这栋楼……后面一群暴民追着我们。
大多数的仇恨都是发泄在穆雷博士身上的,但当我抓住他的右臂想保护他的时候,人群就开始攻击我。有些人抓我的头发,还有人推搡我。我感觉自己有生命危险。我们进了车以后,每次我们停下车怕撞到他们,他们就爬上了车,砸毁车窗,摇动车体。我现在颈部还带着护具。之后我用了整整一周时间待在一个黑屋子里,从脑震荡中康复。
明德学院是美国顶尖的文理学院之一,录取率仅为16%,学费高达每年伍万美元。这样一所顶尖学院,怎么就变成了量产极权分子的工厂,刚愎自用,纵容欺凌和暴力?
没有一个确定的答案。但我们可以清楚地看到,错误教育是从很小的时候就开始的。我小时候受到的教育是:棍棒和石块会使人受伤,但言语不会。但是到了今天,人们相信,由于言语可以造成压力,而压力可以导致胜利影响,所以过分的言辞也是一种暴力。这是一个以巨婴化为代价来保护感情的时代。
错误教育在基础教育里得以延续。上述布鲁金斯学会的调查表明,美国的年轻人似乎根本不知道第一修正案说的是什么,更不用说第一修正案到底保护那些言论了。这是美国的公民教育严重缺失的明证,使年轻人尤其易于受极左和极右的蛊惑煽动。
然后就到了大学。大学里的主要政治模式是身份政治(identity politics)。评判一个观点的主要标准,不是这个观点及其思考的质量,而是说话人的文化、种族和性别。作为一个有色人种的女性,我认为X。作为一个同性恋,我认为Y。作为一个有特权的人,我为Z而道歉。这就是如今美国人的说话方式。个人的独立思考,以及真正进行思考所需要的努力,被装腔作势的态度所取代。
近年来,身份政治已经成为我们保护自己感情不受“伤害”、保护自己观点不受挑战的堡垒。这就是我们的“安全区”(safe space)。而这样的安全区是十分有害的,用萨尔曼·拉什迪的话说,是远离思考的安全区,而非为思考而设的安全区。
身份政治的另一个后果,是将论辩和冒犯之间的距离大大缩短了。如果你的观点被认为是“冒犯”了一个什么群体,那就完了。你的观点不仅仅会被认为是错误的,还会被认为是道德沦丧、不值一驳的。
这样做的结果就是,我们所迫切需要的异议,在被解决之前就已经在公共场域消失了。许多人原本会加入一场讨论,看看它如何使自己作出选择。但现在他们选择远离讨论,以免“说错了话”,被人指控犯了什么主义、什么恐惧症。为了避免冒犯别人,他们放弃了被说服的机会。
就拿你们澳大利亚正在激辩的同性婚姻来举例吧。大家都知道,我个人是支持同性婚姻的,我也希望支持一方取得令人信服的胜利。但是如果一定要我猜测的话,我认为反对一方最终的得票率会比现在的民调要高。这是因为,支持同性婚姻的人往往不是用逻辑理性来说服他人,而是仅仅把反对者指责为“抱有偏见”,而事实上就在几年前,反对者的观点还是整个政治光谱上的共识。很少有人会愿意公开自己会被认为是偏见的观点,所以即使是面对民调,他们也会隐藏自己的想法。这种情况在去年的英国脱欧公投和美国总统大选都发生了。看看我们现在落到何种田地。
如果你想要有说服力地支持同性婚姻,尤其是面对保守派的反对者的时候,那就把你的观点建立在保守主义的基础上:作为个人自由的保证,以及道德责任和社会尊重的途径。反对者会很难反驳这些。但如果你骂他们是傻逼和野蛮人,你所收获的只能是他们竖起的中指和攥紧的拳头。
关于身份政治还有最后一点:这一套两边都会玩。在美国,所谓“另类右翼”(alt-right)用以为他们的白人身份政治辩护的手段,都是从进步左翼那边暗中借来的。去年大选中最令人沮丧的一点就是,“ 白人工人阶级”成为了一个包罗万象的身份,所有那些境遇值得我们同情,但习惯和信仰我们不敢批判的人,都可以划归此类。结果就是白白送给了特朗普一个道德制高点。
我们现在的情况就是这样。有见识的异议是一个繁荣社会的命脉。但是我们美国成长中的下一代却不知道如何提出不同意见、为什么提出不同意见。他们认为言论自由是一个单向的权利。也就是说,他们有权对任何他们不喜欢的人取消邀请、粗鲁打断、肆意侮辱,以免面临听他们说上两句的巨大风险,甚至连别人听一听都不行。我们大学的危险境地,以及民主制度的残破,都是这种情况的后果。
我们能做得更好吗?
我今天这场演讲本来应该是关于媒体的。作为结尾,我也想讲一讲编辑和出版商为改善公共讨论、避免其衰亡,能做一些什么。我在开头说过,美国人从来没有像现在这样在这么多的议题上产生这么激烈的分歧。不过仔细想一想,这也不是事情的全貌。
没错,我们一直有着分歧。但我们的不同意见之所以如此有害,是因为我们甚至不愿与反对者交流眼神,去从他们的角度看待问题,或者寻找这种方案。相反,我们站在自己身份和意识形态的安全岛上互相攻击,只去倾听自己的回响。无论对方对我们说什么,我们都夸张做作地感到大受冒犯。我们抹去了整条思路,想要把外面的所有人(包括我在内)都开除球籍,连听上两句都不肯。
要想提出有见识的异议,我们要先闭嘴,认真倾听,停下来思考,然后再发表自己的意见。但这些我们都缺失了。或许造成这种情况的原因是,我们缺少优秀异见的模范。仅有的几个例子,比如纽约和伦敦的智能平方辩论(Intelligence Squared debate),以及法里德·扎卡利亚(Fareed Zakaria)在CNN上的节目,就像古典音乐一样,受众仅仅局限于一小部分精英。
福克斯新闻网以及其他有党派倾向的媒体已经表明,要获得巨额利润的终南捷径,就是提供一份充满水分、干货很少的民粹主义大餐。促进民主进程的理性异见没能通过市场检验。我们之中相信绝对自由的资本主义的人应该想一想这一点。
我不认为解决方案是加大对BBC这样的公共媒体的投资,至少在美国不是如此。公共媒体也一样因循一定的意识形态和记者的群体思维,竞争的缺乏也使他们对批评充耳不闻。我们也不能回到美国以前的“公平准则”(Fairness Doctrine)上,给所有不同观点以相同的曝光度。言论自由最终必须是自由的,无论公平与否。
但我的确认为公共利益也是人人有责。我们对公民,像管理层对股东一样,也负有诚信义务。新闻这个职业与运输、食品等所有其他职业都不同。一国可以像英国那样,在有辣鸡食物的同时有模范的政府;也可以像法国那样,有模范的食物和辣鸡的政府。但是,一个国家如果没有高质量的新闻媒体,就不可能有好的政府和健康的公共空间。高质量的新闻,要能够区分事实、信仰和观点,能理解一个观点的目的不是偏离事实(facts)而是通过事实去接近一个叫做“真理”(truth)的更大的思想,要能够相信“真理“这个终极目标足够大,像曼哈顿一样,从设计各异的不同道路都可以到达。也就是说,新闻基于事实,但充满了异议。
我相信,新闻界完全有可能,而且必须发挥这一作用,尤其是当其他制度不能有效发挥作用的时候。但这就要求媒体的所有者和出版者都能认识到,他们要做的不是推进某一党派的阵线,也不是去做Google和Facebook的奴隶,也不是去产出博人眼球的娱乐性新闻,也不是去援救他们喜欢的总统或总理。他们的任务是:明确讨论的内容,支持主动而客观的新闻报道,用开放思维的评论去改善讨论质量,挑战已有的成见,而非仅仅加强之。
这才是能维护自由的新闻。这里说的自由,既不是美国左翼意义上的自由,也不是澳大利亚右翼意义上的自由,而是说一个人不仅仅是一个身份符号,一个自由的人不需要被“保护起来”而不去接触令人不适的想法和不受欢迎的观点。我们现在恰恰最需要接触这样的想法和观点,这样才能复兴民主生活的基石——异议的艺术。
罗伊研究所今晚颁发的荣誉,就是向这个方向迈出的重要一步。他们所揭示出来供大家讨论的,就是我们的民主制度要想保持理性、公道和自由的唯一途径。
]]>目标检测是计算机视觉领域的传统任务。与较为单纯的图像识别问题不同,目标检测任务不仅要在给定的图像上识别出存在的物体,给出物体的所属类别,还需要将该物体的位置通过bounding box给出。在众多的计算机视觉任务中,目标检测处于一个非常重要与基础的地位,许多的工作都需要在目标检测的基础上进行展开。
目标检测任务对人来说是一个非常自然的过程,人脑可以在极短的时间内对给定的图像进行目标检测,给出相应物体的位置和分类,甚至还能从语义级进行精细的分割和描述。而与人不同,计算机中的图片的保存格式究根结底是一串由0和1组成的二进制数据。从更高层次来看,被呈现在显示器中的图片组成为一个个的像素点,每个像素点由数个0-255的数组组成。人脑尚且是个黑盒,如何处理计算机中的图片数据就成了一个巨大的问题。因为没有直接方法可以通过图像数据拿到图像中存在物体的高层次语义,也无法直接定位物体出现在图像的位置,因为图像是千变万化的,目标可能出现在图像的任何地方,出现的形态也有着很多的可能,背景也可能千差万别。所以对于计算机来说,目标检测直觉上是一个比较困难的问题。
传统的目标检测方法一般分为三个阶段:首先使用一些算法,如Selective Search算法[1],在给定的图像上进行区域选择,将那些潜在可能存在目标的区域选择出来。
然后对这些选择得到的区域进行特征提取。如在传统方法中,人脸检测常用Harr特征,而行人与普通目标检测常用HOG特征[6]等。但由于目标的形态、颜色、光照情况、背景的多样性,设计出相关鲁棒的特征是比较困难的。
最后使用提取的特征对所选定的区域进行分类,因此特征的提取情况直接影响到最终检测结果的好坏。常用的分类器有支持向量机等。
传统目标检测中,DPM(多尺度形变部件模型)表现的较为优秀。该方法将物体当作多个部件的组合体,如人脸由五官所组成,利用部件间的关系来描述物体[2]。因为符合许多非刚体特征,该方法在多个数据集上表现较好,连续夺得过VOC2007-2009年间的目标检测冠军。
值得一提的是Selective Search算法,因为该算法在后续基于深度方法的目标检测问题上也被广泛采用过用于初步区域选择,但因为复杂度太高,最终被被全网络的方法所取代。
Selective Search算法的输入为许多小region,其思路为计算所有region的两两相似度,选择相似度最高的一组进行合并,将合并后的region继续进行以上操作,直到整个图像合并成为一个region,由此得到了一个层次关系。对每个region分别进行打分,最后选择top k得分进行输出作为可能存在物体的区域,打分策略详见论文。
Selective Search算法的输入region由Graph-Based Image Segmentation方法给出。
1.计算所有像素不相似度(RGB距离、亮度距离等)
2.由小到大排序所有边
3.按顺序合并所有边连接顶点不属于同区域且不相似度不大于两区域内不相似度
4.更新阈值及类编号
5.重复直到遍历所有顶点
具体步骤如下:
初始化一个相似集合为空集: S=∅
计算所有相邻区域之间的相似度(相似度函数之后会重点分析),放入集合 S 中,集合 S 保存的其实是一个区域对以及它们之间的相似度。
找出 S 中相似度最高的区域对,将它们合并,并从 S 中删除与它们相关的所有相似度和区域对。重新计算这个新区域与周围区域的相似度,放入集合 S 中,并将这个新合并的区域放入集合 R 中。重复这个步骤直到 S 为空。
从 R 中找出所有区域的 bounding box(即包围该区域的最小矩形框),这些 box 就是物体可能的区域。
优先合并以下四种区域:
传统的目标检测存在一些问题,如区域检测的时间复杂度很高,且很难针对性的进行目标的搜寻。另一方面,手工设计的特征对于物体的多样性变化、复杂物体等的鲁棒性并不强,且随着检测任务的推广,设计特征变得越来越复杂。
近年来,随着计算机硬件进步,深度学习方法得到了极大发展。针对目标检测问题,特别是上文中提到的几个传统方法中存在的问题,深度学习均有着很好的表现。
整体来看,基于深度方法的目标检测算法可以分为两类,一类是将目标检测问题转化为分类问题来解决;另一类是将目标检测问题转化为回归问题来解决。
基于分类的方法比较有代表性的工作是Ross B. Girshick与2014年提出的R-CNN[3],该方法首次将卷积神经网络应用在目标检测领域,并通过 Fast R-CNN[4]、Faster R-CNN[5]这一系列后续工作,将目标识别任务从仅用CNN做特征提取,发展成为使用CNN进行特征提取、Softmax进行分类(Fast R-CNN),最后发展为使用神经网络直接完成从区域检测、特征提取、分类的所有工作并实现了End to End的训练,因为引入用于目标检测的RPN网络相较于Selective Search算法的优异性能表现,Faster R-CNN方法基本实现了接近实时的目标检测。
R-CNN模型使用Selective Search算法对输入图像进行候选区域的划分,对候选区域使用在大型数据集(如ImageNet ILSVC 2012)上预训练过的CNN模型进行特征提取,得到feature map;将该feature map送入SVM分类器进行分类工作,同时训练一个回归网络对候选区域的bounding box进行精修,让其更加贴合ground truth。
该模型在PASCAL VOC 2012 数据集上进行微调后,相对于联合语义分割器[8]和DPM检测器的SegDPM方法[7],使用同样Selective Search的UVA系统取得了巨大的进步。特别是对比于使用了Selective Search作为区域推荐算法的UVA系统,R-CNN模型在VOC 2012数据集上取得了53.7%的mAP,而使用densely sampled SIFT, Extended OpponentSIFT, RGBSIFT 等descriptor,SVM分类器的UVA系统的mAP
仅为35.1%。
R-CNN在ILSVRC2013数据集上依然取得了良好的结果,在ILSVRC2013比赛中,实现了31.4%的mAP,大幅领先于第二位OverFeat方法的24.3%[10]。
尽管R-CNN在检测性能上大幅度领先于传统方法,但是仍然存在着训练和检测耗时较长,流程繁琐等问题。针对以上问题,Ross等人在2015年推出了R-CNN的改进框架Fast R-CNN。
Fast R-CNN仍然使用Selective Search提取候选区域,但抛弃了原有的单独提取特征步骤,而是将输入图像使用预训练网络提取为feature map,将候选区域直接映射为feature map上的相应区域。引入K. He等提出的SSPnets的一种特例region of interest(RoI)layer将不同大小和比例的feature map上的区域统一映射为相同维度的特征向量,并抛弃SVM直接采用Softmax进行分类。
因为避免了大量重复的特征提取步骤,在论文测试条件下,Fast R-CNN模型相比于R-CNN的训练时间从84小时缩减为9.5小时,单张图片的检测时间快了146倍。同时在VOC 2012上取得了65.7%的mAP,高于R-CNN的53.7%,但在VOC 2010上的66.1%mAP略低于SegDeepM[12]的67.2%。
尽管Fast R-CNN在训练与检测速度上大幅领先于R-CNN,但是在实际的应用场景中,Fast R-CNN仍然无法满足对检测的实时性需求。在这种需求的推动下。Faster R-CNN应运而生。
Ross等[5]在对存在的系列方法进行分析后,发现区域推荐算法,如使用的最多的Selective Search算法,占据了大量的CPU时间,影响了算法的整体性能;于是他们提出了Region Proposal Networks(RPNs),将区域推荐也整合进了网络,实现了端到端的纯网络实现。
在共享卷积层的情况下,RPN的测试时开销小到可以忽略不计(10ms/图),远远领先于传统的区域推荐算法。同时全网络实现的结构能够在GPU中完成整个计算,大大提升了速度,节约了数据传递开销。
RPN带来的性能提升也是惊人的,在测试中,使用VGG16作为特征提取网络的RPN+FastR-CNN结构能够实现5fps的检测速度;而SS+FastR-CNN的速度仅为0.5fps。若将VGG替换为ZF[13],检测性能更是可以达到17fps,接近于实时检测的需求。
之前基于分类的目标检测算法采用的方案的思路大体上可以分为两步:首先在图像上检测出许多不同尺寸的bounding box,再通过相应的分类器对bounding box内的区域进行评估,确定是否存在某类物体。
而基于回归的方法不同,该类方法把目标检测问题当作回归问题进行处理,所以不需要显式地对其进行划分和分类,而是使用网络直接对输入图像进行处理,输出检测出目标的分类、位置和置信度。
基于回归的目标检测代表性方法有YOLO[14]和基于YOLO发展出来的SSD[15]。
YOLO将输入图像划分为SxS个网格,如果一个物体中心落在某网格内,则该网格负责检测该物体。训练和测试时,每个网格预测B个bounding boxes,其中包括该bounding box的坐标和对应分类的置信度。
YOLO的网络结构受到了GoogLeNet[18]的启发,采用了24个卷积层,2个全连接层,预训练阶段使用前20层进行预训练,如图所示:
在VOC 2007和VOC 2012数据集上YOLO在45FPS的检测速率下实现了63.4%的mAP,而其网络精简版Fast YOLO则实现了高达155FPS,mAP仍有52.7%,这一结果远远领先于Sadeghi等人先前提出的实时目标检测系统DPM[16],后者在30FPS速率下的mAP仅为26.1%。
YOLO模型虽然速度很快,但是存在着一些缺陷;如每个网格仅能预测一个目标,相邻目标容易产生漏检;对于物体的尺度较为敏感,对尺度变化较大的物体泛化能力差;对小目标检测效果不佳等[15]。
故SSD综合了YOLO和Faster R-CNN的anchor box思路,不再使用统一固定大小的cell,而是在不同层的feature map cell上划分出不同长宽比的default box,不同层的feature map上具有不同的感受野,这样能够有效兼顾不同尺度的目标。
这样的改进带来的效果是惊人的,SSD512模型在VOC与COCO[17]混合数据集上的表现高达80.0%mAP,相比Faster R-CNN的75.9%高出了4.1%。而在另一项VOC 2007的对比中,SSD512比Faster R-CNN高出了3.6%的mAP的同时,实现了22fps的检测速率,而Faster R-CNN仅有7fps。
这段时间主要细读的是R-CNN这一方法的发展历程,从R-CNN到Fast R-CNN到Faster R-CNN再到Mask R-CNN。这一方法的演进有着清晰的脉络,实现出来的效果也是非常棒的,几乎都是当时的state of the art,漂亮的解决了从目标检测到Segmentation的系列工作。
说一下思路的演进:
首先R-CNN引入CNN对SS算法得到的候选区域进行特征提取,提取得到的特征向量训练SVM进行分类。
R-CNN速度慢的主要瓶颈在于特征的重复提取,于是Fast R-CNN引入了RoI Layer,对于一张图片仅仅需要提取一次特征,将不同的区域按照CNN的比例放缩关系映射至特征图上,使用RoI layer将不同形状和大小的特征区域统一变换为相同的特征向量,再送入Softmax直接进行分类。
但是Fast R-CNN还是不够快,瓶颈在于复杂度高的SS算法上,在Faster R-CNN中,引入了RPN网络实现了全网络的算法实现。RPN使用滑动窗口机制,使用给定的滑动窗口在最高层feature map上进行一次滑动(本质上是一个卷积层),使用anchor机制生成覆盖原图的多长宽比的Region Proposal。
Anchor机制如下图,使用每个滑动窗口的中心点作为anchor,通过卷积关系将anchor映射回原图,使用给定好的比例和图像的大小标定anchor box。论文中,3x3的滑动窗口对应的每个特征区域同时预测输入图像3种尺度(128,256,512),3种长宽比(1:1,1:2,2:1)的Region Proposal。
从上图可以看出,RPN的滑动窗口机制天然地可以被一个卷积核为3x3的卷积层表示。然后分别送入两个全连接层进行分类,得到2k个分类结果,分别对应每个anchor box可能为前景与背景的概率。4k个回归结果,是anchor box相对于ground-truth bounding box坐标的偏移量。
接着,对所有的anchor box计算其与真实位置标签的IoU,即anchor box与真实标签所交面积与所并面积之比,即重叠度。按照以下规则对anchor box进行标记:
1.将与每个真实标记框(ground-truth bounding box)重叠最大的anchor box标记为正样本,这是为了保证每个ground-truth bounding box至少对应一个正例。
2.再把每个和ground-truth bounding box的IoU值超过0.7的anchor box标记为正例。
3.与所有ground-truth bounding box的IoU均不超过0.3的标记为负例,其余anchor box丢弃,跨越图片边界的也丢弃。
完成标记工作后,所得到的正负例就可用作训练集对RPN进行训练了。
为了应付一门课程作业做的人体小目标检测,使用了Faster R-CNN框架,Clone自yhenon/keras-frcnn。该实现使用的是Keras,非常方便快捷的库,推荐。
具体的改动与训练思路为:将论文中默认的anchor size:[128, 256, 512],修改为[64, 128, 256, 512]。因为考虑到小目标本身占图片面积较小,默认anchor size不能很好的覆盖相应的尺寸,故使用了一个更小的参数。另一方面,训练采用VOC 2012数据集,仅使用了Person这一标签的样本。
在NVIDIA P40上跑了大概20h,不得不吐槽的是Tensorflow比Caffe在速度上还是慢了不少,但最终训练出来的效果还是比较令人满意:
作为对比,这是Faster R-CNN作者提供的基于Caffe的原预训练模型检测效果:
[1] Van de Sande, Koen EA, et al. “Segmentation as selective search for object recognition.” Computer Vision (ICCV), 2011 IEEE International Conference on. IEEE, 2011.
[2] Felzenszwalb, Pedro, David McAllester, and Deva Ramanan. “A discriminatively trained, multiscale, deformable part model.” Computer Vision and Pattern Recognition, 2008. CVPR 2008. IEEE Conference on. IEEE, 2008.
[3] Girshick, Ross, et al. “Rich feature hierarchies for accurate object detection and semantic segmentation.” Proceedings of the IEEE conference on computer vision and pattern recognition. 2014.
[4] Girshick, Ross. “Fast r-cnn.” Proceedings of the IEEE international conference on computer vision. 2015.
[5] Ren, Shaoqing, et al. “Faster R-CNN: Towards real-time object detection with region proposal networks.” Advances in neural information processing systems. 2015.
[6] N. Dalal and B. Triggs. Histograms of oriented gradients for human detection. In CVPR, 2005.
[7] S. Fidler, R. Mottaghi, A. Yuille, and R. Urtasun. Bottom-up segmentation for top-down detection. In CVPR, 2013.
[8] J. Carreira, R. Caseiro, J. Batista, and C. Sminchisescu. Semantic segmentation with second-order pooling. In ECCV, 2012.
[9] J. Uijlings, K. van de Sande, T. Gevers, and A. Smeulders. Selective search for object recognition. IJCV, 2013.
[10] P. Sermanet, D. Eigen, X. Zhang, M. Mathieu, R. Fergus, and Y. LeCun. OverFeat: Integrated Recognition, Localization and Detection using Convolutional Networks. In ICLR, 2014.
[11] K. He, X. Zhang, S. Ren, and J. Sun. Spatial pyramid pooling in deep convolutional networks for visual recognition. In ECCV, 2014.
[12] Y. Zhu, R. Urtasun, R. Salakhutdinov, and S. Fidler. segDeepM: Exploiting segmentation and context in deep neural networks for object detection. In CVPR, 2015.
[13] M. D. Zeiler and R. Fergus, “Visualizing and understanding convolutional neural networks,” in European Conference on Computer Vision (ECCV), 2014.
[14] Redmon, J., Divvala, S., Girshick, R., Farhadi, A.: You only look once: Unified, real-time object detection. In: CVPR. (2016)
[15] Liu, Wei, et al. “Ssd: Single shot multibox detector.” European conference on computer vision. Springer, Cham, 2016.
[16] M. A. Sadeghi and D. Forsyth. 30hz object detection with dpm v5. In Computer Vision–ECCV 2014, pages 65–79. Springer, 2014.
[17] COCO: Common Objects in Context. http://mscoco.org/dataset/ #detections-leaderboard (2016) [Online; accessed 25-July-2016].
[18] C. Szegedy, W. Liu, Y. Jia, P. Sermanet, S. Reed,D. Anguelov, D. Erhan, V. Vanhoucke, and A. Rabinovich. Going deeper with convolutions. CoRR, abs/1409.4842, 2014.
转自好奇心日报,感谢你们的努力,侵删。
老太太在家里,她趴在二楼靠胡同的窗户上,探出头跟楼下打招呼。
偶尔有路过的人,她就问:“嘛呢?”接着下一句问:“搬哪儿去啊?”
碰到认识不认识的都问。
老太太 80 岁,北京人,和儿子、儿媳、孙女住在这里。
他们要搬去黄村,“离这里 15 里地。”问什么时候搬走,老太太说:“说话就搬。”
她的对面楼里租住着一家服装代工公司,废品散落满地,大部分都是服装布料,其中有一些布料是羊毛、羊绒质地的。有两家缝纫机,一张木头桌子,还有两件制衣专业器具。老板都不要了,运输成本太高,不要了。
在这家服装代工公司的斜对面有一位村民,租户都被清退,他们是房东,不用搬走。对面的老太太一家搬走是因为这里不让烧暖气,只能用电取暖,老人年纪太大了,挨不了冻。
这是北京,2017 年 11 月 25 日。
11 月 25 日下午新建村里正在被拆除的浴室
“说话就搬”的老太太住在北京大兴区西红门镇新建二村——新建村有一、二、三、四村,村民们习惯于叫一、二、三、四队,这是人民公社时期“生产队”这种叫法的延续。1955 年,当年的昌平县几个村整体迁移到此处,“新建”因此得名,老太太是此地最早的住户之一。
与老太太在新建二村漫长的 62 年相比,这一次搬家时间的紧迫程度可以精确到以小时为单位。这是一系列的决策和一个偶发事件共同作用的结果。
2016 年 11 月 1 日,北京根据《京津冀协同发展规划纲要》要求,开始了以疏解非首都功能为目的的清理低端业态的行动,与新建村息息相关的服装加工、仓储物流等行业面临外迁,大量租住在此地的外来务工人员面临迁移;因为越来越严峻的空气质量问题而强制执行的全市“无煤化”,而新建村属于棚改区,又在“煤改气”和“煤改电”的覆盖范围之外——这是一个不可以烧煤但又没有新取暖设施的冬天。
新建二村办公室发给村民微信群里的棚户区改造工作流程计划安排:1、2017 年 9 月 28 日至 10 月 15 日为入户调查清登日期;2、10 月 16 日至 31 日,由村镇两级进行宅基地确权工作,制定补偿方案和回迁安置房设计方案;3、11 月 1 日至 11 月 15 日进行签约前准备工作,初步谈户;4、11 月 16 日至 12 月 15 日进行实质性签约工作;5、12 月 16 日至 25 日为各部门档案整理;6、12 月 26 日至 1 月 31 日为选房和结算期。
这是原来的计划。
一个偶发事件是 11 月 18 日新建一村的大火。它打断,或者说加速了这个流程。
这起造成 19 人死亡的特大火灾直接引发了北京 40 天安全隐患大排查、大清理、大整治专项行动。
具体有多少人被牵涉其中,目前缺少官方的任何数字。
我们接下来要呈现的 33 个人、或长或短的故事,都与 11 月 25 日这个时间节点有关,大部分与政府决策和决策的后果有关。
还有,我们注意到一个细节。一家叫“易鑫达投资管理有限公司”的办公室。像很多这种个人信贷公司一样,它们办公室里有一个鱼缸,鱼缸里养着三条锦鲤。像所有在新建三村租办公室的公司一样,他们被强制腾退搬出。
25 日下午,这三条锦鲤还在。或许它们的主人会回来把它们移走,或许它们就与这个生不逢时的二层彩钢办公楼一起消失。
25 日凌晨 1 点半左右,她背着一个黑色皮质双肩包,站在一辆卡车旁边。车斗几乎都已经装满了,她的同伴还在从旁边的巷子里搬最后的东西,摞在一起的凳子、折叠桌之类。车上好几个人的东西混在一起。
她在一家服装厂工作,工厂有十几个人,老板要搬去河北,她不想去。
房东通知他们 24 日必须要搬完,但是白天车进不来,“几万人要搬走,都堵上了。”
她现在先搬去六环外的朋友那里借住。最后放上车的是用布包好的一个大包裹。“把我的泡菜坛子放放好。”
她来北京十年了。2007 年她 18 岁,工作是做女装。一开始在三环附近的草桥,后来随着服装厂往外搬,搬到五环。
最后确认了一下东西都搬完了,她和另外三个同伴一起准备上车离开。操着北方口音的司机在一旁说,本来他也不是做这个(搬家)的,这次是帮忙来了。
他们还有一辆电动车。她说:“我肯定是坐车啊,这么冷。”
她一直没有回答“今后打算怎样”这个问题,最后她说,“就回家吧,不在这待了”。
来不及收拾的空宿舍
11 月 24 日零点左右,新建村中线光明街街边的一间小服装加工厂门口,老板拉了今天最后一车。他说自己也没找到新厂房,只能先把货和设备拉去朋友的地方放着,没法开工。
在店里看门的是一对黄姓父子,儿子 30 多岁,在北京工作七八年了,期间把父亲接来。现在工作一个月赚四五千,有两个孩子,店里还有他儿子在幼儿园的奖状。他以前在丰台南三环附近工作,因为拆迁搬到新建村。
失火的时候他在店里什么都不知道,后来因为救援才知道出事了。具体情况也是在手机看视频看到的。3 天前,他们听说 25 日是最后期限,但儿子已经找了两个白天还没有找到去处。
两人都住在厂房里,在侧门那边搭了个简陋的厨房。刚搬完的厂房一片狼藉,但他们自己的地方收拾得挺干净。看天冷倒了开水,碗也还是干干净净的。
我们离开以后,他们从里面拉上了卷帘门。像旁边那些已经招牌破碎的店铺一样。
新建村以南约七公里车程,就是泥营村。村入口处有一座假山,假山左右面有十几个小型服装厂。加起来差不多五六百个工人,工作、吃住都在这十几个工厂里。
据工人们的描述,11 月 23 日下午 2 点,几十个保安把人全部赶了出来,接着封了厂子,要求工人当天搬走,厂主三天内搬走。工人们临时找不到地方,又怕人走开保安会进厂抢东西,有的去了附近宾馆,有的去了朋友家。但大部分人还是找不到住的地方,直接在厂前站了一晚上,或者在地上扎帐篷睡。当晚北京气温零下 4 度。
24 日下午 2 点左右,十几个工人还没找到住处,在门口等老板来付薪水。另外有二十几个坐在村委会一层的会议室里,有的睡觉,有的聊天。不过他们都非常谨慎,什么都不愿意说。村长不知去哪儿了,找不到。
下午 6 点,一个穿着黑羽绒服、带着驼色围巾、横跨一只皮背包的女厂长来了。十几个工人围上去,有点激动,问住哪儿、薪水什么时候付。这位厂长站在假山旁,一个个安慰,先对一个人说“你等一下,我让人开车送你去我大伯家住。我大伯在河北,离得近。”又转身对另一个人说,“我给你付,现在这里没网,一会儿找个网吧转钱给你。”
女厂长不接受采访,一个自称是他儿子的年轻人在旁阻拦。“你别问我们,我们心烦着呢。你们也帮不了什么,要采访去采对面劳保局的人。”他指着假山对面的十几个黑衣保安说。
6 点,这些保安又堵在了路口,防止有人偷跑回工厂睡觉。只有说“我是回去拿东西的”,才可以进厂。
我们在新建村的一家服装厂里捡到没有带走的品牌吊牌
24 日,他们收到房东电话,赶回来搬家。前几天工厂停工,他们去河北玩,搬迁通知就这样错过了。
失火当天,老板还和工人说到这事,两天后工厂也关了。吴说老板也挺辛苦的,夜里两点出发去河北找厂房,不过居然也找到了。
这对夫妇,男的姓周,83 年生;女的姓吴, 87 年生。今年是他们认识的第十年,两人都是来北京十多年,10 年前在北京同一个工厂工作时认识。7 年前生了孩子。他们每天的工作都要一起配合,两个人做水洗皮衣:拿到裁好的衣服面料,两人完成所有工序做出成衣,这里没有流水线。
像这里的其它小工厂一样,他们在厂里记件拿工资,薄的二十多块做一件,厚一点的三四十。
他们跟着北京的服务业一路往南搬。最早是木樨园(南三环),那会儿服装厂都在附近,之后去南小街、大红门、然后德茂庄。“就是快速公交这条线嘛,1 号线”,周说,他们四五年前搬到六环边上的新建村。
周说在这里的小工厂打工的人夫妻很多,两个人配合。他也是因为这个原因不愿意去大工厂流水线做工,周说“我们愿意辛苦的时候就多干一点,想休息的时候就放松一点”。
休息的意思只是做活慢一点,工作时间还是早上 8 点半开始到晚上 11 点,每个月 30 日拿工资,次月 1 日可以休息一天。
愿意留在北京是因为两人一年收入能有十几万,开支也不大,月租金 300、厂里包饭。房东自己烧的暖气 130 /月,但基本只开一个月。周说一个月日常开支 1500 的样子。吴又想了一下说,不出去玩的时候可能只要 1000。
几年前,他们花十几万在老家盖了套 200 平米的二层房子。
回江西的话,周算了一下,“少两三千,一个月。我们记件的,得厂里有活才行”。现在 7 岁的孩子只有暑假会来北京,在北京没法上小学。之前更小的时候可以放幼儿园,但自己 11 点下班也没时间带。
周边聊边擦着手里的插线板。屋里剩的东西不多,一张 1.5 米双人床,茶叶、水杯、餐具、衣物、被褥。还有一个小煤气炉子,说已经跟自己好几个地方了。
之前收废品来的时候,他卖了家里的一台老电视,5 块钱,液晶的也就 50 元一台收走。
不到一小时,两人用被褥裹着所有家当,搬去了厂里的宿舍。宿舍可以再多住一天人,第二天他们就要跟着制衣厂的设备一起去 60 公里以外的河北永清。
晚上 8 点,厂里还剩七八个女工围着一个电磁炉和铁锅在吃面。说是个厂,面积不会比一间小饭馆更宽裕。这是她们在北京的最后一餐,“明天可能就跟着老板走了,不过还不知道去哪儿”。
女工们都是安徽阜阳人,和老板是同乡,为大红门的服装批发市场以及一些淘宝店供货。2007 年到北京来,先是在南三环大红门附近做,后来因为房租涨价或者清退搬了几次,去年挪到了新建村。大火后,村委会要求 25 日前必须搬走,老板先把其它几个非同乡打工者的工资结了,但也就没钱付同乡们的工资,正在找新的地方租。
“也不好意思找老板要钱,老板比我们还可怜。我们一天工作十几个小时,一年也就挣 2 万。老板一年也只能挣 10 万。”
山西面馆炒菜店所在的公寓楼在新建村西侧最外延。
11 月 25 日凌晨 2 点,一辆卡车停在餐馆的门口。李师傅和两个帮手一起,进进出出地往车上搬东西,店里只剩下一些零碎的瓶瓶罐罐,冰柜、桌椅、锅碗瓢盆乃至案板都已经搬上车了,最后搬上去的还有小砧板、料酒、锅炉等。吕师傅站在车上接东西,他白天从天津把车开过来,来接李师傅几个人去天津郊区厂区的餐馆。
他们都是河南人,三个月前搬到新建村,店也是那时候开的。这里生意很好。
李师傅刚从一个拆迁的地方搬过来,他之前在十八里店开业,待了三年,之前在天津。
这是临街店铺中的一间, 200 平方米,二楼及二楼以上都是公寓。店里三个人平时住楼上。租房的时候,李师傅被告知这里是正规公寓,有产权。他们一次性交了半年的房租,算上装修投入了十多万,现在还没有收回成本。房东给退一部分房租,但是也有限。“你说炉子里能退出炭来吗?那退出来的都是灰。”
店铺 21 号就停业了,那天店铺的灯箱布就被人撕了,露出了晃眼的 LED 灯管。
不到凌晨三点,他们准备开车离开,到天津大约需要三个小时。一个穿睡衣的男人从几十米开外的公寓前台走出来,小李远远地喊:“过来验房!”
“我还验什么验啊!”男人应和了一声,走过去和小李他们告别。男人负责管理小李口中的那个“正规公寓”。
前台的房间还亮着灯,平时二十四小时有人值守,玻璃门上贴着一张落款为 11 月 22 日的告示,通知住户在七天之内搬走,之后就断水断电。那张告示旁边插了一张“兄弟搬家公司”的名片。
临街的餐馆,招牌已经被拆掉
罗辉 1998 年从重庆来到北京时,只有 19 岁。住在朝阳区东坝乡,20 多平米的平房,每月房租 500 元,给搬家公司打工。在这个平房里,他有了自己的家:2002 年和一个在民企做会计的山东姑娘结了婚,2007 年第一个孩子出生。那年,他也正式开始单干,成立了自己的搬家公司“兄弟”。
到 2012 年,房租涨到 1000 元。罗辉算了算,自己每月能挣五六千,媳妇能挣三四千,加起来也付得起。但遇上拆迁,也不得不走。
从 2012 年到 2017 年这五年,在北京干了 20 年搬家的罗辉自己一共搬了十几次家,朝阳、海淀、东城、西城都住过,最短半年,最长三年多。“我觉得只要不拆迁就长住,但这几年都在拆迁,每次搬也都是因为拆迁。”他也有点愁孩子上学的事,“大的 10 岁,在读四年级,学习还可以。但小的上不了学了,现在学校都不收外地人,要这证那证的”。
西红门新建村大火后,罗辉的生意多了起来,在大兴的旧宫镇、桥新店和海淀的西北望来回跑。平常工作 8 小时就差不多了,早上九十点出门,晚上五六点回家。过去四五天,每天要搬的次数增加到十几趟。
但罗辉说“价格涨不起去”,起步价还是 300 块,和大火前没什么不同,变化的是“最高没有个准”。跑长途的话,几千都有,“这几天北京市里面打工的人不少都搬去天津、河北了”。近的哪儿都有,几公里,或几十公里。很多人没想好该去哪里,罗辉就拉着他们四处兜圈、找住处。
罗辉自己最近也再次搬了家,这是第几次,他也数不过来了。一家四口原本住在海淀区西北旺一间公寓里,月租 2000,十五六平米的房子。20 号收到通知,说限期 22 号全部清空。罗辉一边帮人搬家,一边找,终于在颐和园附近找到条件差不多的公寓,也是月租 2000,20 平米。“还是太贵的,但再便宜的找不到啊。”
谈起以后,罗辉在电话那头叹了口气。“哎呀,以后……想长待也没地方了”。
王亮在大兴区西红门镇新建村和朋友合开一家 Spa 店。11 月 25 日,王亮开了车到店门口停下。这时是下午 3 点, Spa 店周围的店全都关着门。
有沉闷的器械声,50 米外,能看见两架挖掘机正在拆除房屋,已经快要拆完了,剩下一堆废墟。有两支水管对着拆除现场洒水,压制扬尘,对面马路上站着十几、二十个人在看。
有三个收废品的人,一路吆喝过来,看见王亮开门问他卖不卖空调。王亮说:“不卖。”
王亮是过来搬东西的,他把店里的空调拆下来装进一辆小货车的后备箱里,后备箱就满了。他店里还有很多东西都没有搬走,床、躺椅、被子、一架有点费电的热水器、吧台……做生意的时候都有用,现在连处理起来都费劲。他去卖那些被子,收废品的都表示不要。
王亮 3 岁跟着爸爸来北京。关于这场清退,他说以前也有类似的事,但从来没见过这样的。
“我是跟几个人合伙开的这个店,我除了这个还有别的生意,那没有别的生意的人呢?店里有三、四个员工,都走了。不是我们不想要他们,没办法啊。有的就直接回家了,这儿不让干,别的地方也不让干。”
“我隔壁这家,今年换了四个地方了。我问他你怎么还没走,他说没地方去了。”
“之前的四五天,你没有看到,街上全是搬东西要走的人。晚上有人就在这路两边的车里睡。”
“在大兴这里,以前 3000 块的两居室,现在涨到了 4800。就说一个月赚一万,拿一半的钱去租一套两居室的房子,剩下一半,要是还有老婆孩子呢。”
“这片地方一直给我们送快递的那个顺丰小哥,火灾前一天他老婆孩子刚来北京看他。结果老婆和 1 岁的孩子都死在火灾里了。他活着。”
“这一片全得拆,有房产证的也得拆。这里本来就要拆迁,明年就得拆,只是这一把火加快了。”
“这旁边这个楼马上要拆,是因为它是四层楼。这是他们为了拆迁在这个夏天建起来的。这地方是个村子,这些都是宅基地。我们的房东是个二房东,他租了很多房子一块儿往外出租。”
聊的时候,正好有两个房东的人过来问,搬得怎么样了。Spa 店的老板说:“快了,就把空调搬走就好了。”
夏老板经营新建村里最大的超市之一华联超市,1200 平方米,五个月翻新装修刚结束,店里“盛装开业”的招贴还在。
村里消防给的“48 小时内搬完”的期限已经过了,他还有最后一车东西要搬完。店门口的地上摆着一些整箱的旺仔牛奶、坛装白酒、雀巢矿泉水,一排靠墙的货架上还有一些面包。每当有村民走进去,店里就有人把人往外赶。
夏老板 2002 年从浙江来到北京,开了十五年超市。最早的一家店开在上地科技园,后来又开到密云。上地店 2014 年因为拆迁关店,同年,新建村这家超市开业,平均下来除去员工开支,每年收入 100 多万。到今年,夏投入 300 多万翻新。重新开业以后,还推行了会员制,目前有 4000 个会员。“有几个(不走的)本地村民问我要会员,我说店都没有了还有什么会员。”夏老板说。店门口角落里还堆着促销传单,一个来帮忙的中年女士说,拿一沓搬家的时候包花盆用。
11 月 21 日之后,夏老板和所有超市员工都被消防管理人员拉到超市外面。超市断电,不让进,“我就跟他们说唯一不要把我冷柜的电断掉,他们当然不管这个了”。
第二天晚上,夏老板才获准进入超市,冰柜里的水饺、大肉开始变质,雪糕融化。他们接到了通知:48 小时内全都搬走。“说我们消防不合格,一层经营二层住人,不行,但是我们也不知道啊。”他说,“我们在这里开四年了,所有证照也都齐全。”
他把超市里的货都拉到仓库。有几个愿意跟着去河北的员工,也会跟着去还没开业的新超市。那边货架、冰柜都有,因此这里的设施如何处理,也没有定论。
夏老板一直在接电话,他河北的新超市已经到了装修最后阶段。老板娘和店里的帮工则在重复:“跟你说也没什么用,你能解决什么吗?”
新建村内一片狼藉的超市
餐馆在与新建村一河之隔的三间房村,老板娘表示因为没有备货,土豆条、藕条都做不了。村里的服装厂都接到了通知,要在十天里关闭、搬走。老板娘说现在生意只能做一天算一天,不敢多备货。
这家湖北家常菜馆在三间房村开了 4 年,墙上的白板上写着今天的推荐菜:腊排骨火锅、柴鸡火锅、红菜苔。这里的消费不算低,招牌的腊排骨火锅 90 元,萝卜干炒腊肉 28 元。六七点钟,店里的七张桌子都坐满了人,老板娘一个人招呼客人,大部分时间还在后厨帮忙。
过一阵子她也准备回老家去。“过完年再回来看看。”她说。
11 月 24 日早上,有 100 多人来了。“有的穿着制服,有的没穿,记不清了,记不清了。他们来把店砸了,包括迎客用的玻璃门,还有旁边的两扇大窗户,就把门窗砸碎了,里面没进去砸。”
店里一片狼藉,还剩下一些供食客用的木椅子,乱七八糟地倒在地上。地上有很多垃圾,其中有一些是新鲜的蔬菜,半个南瓜落在地上,在从厨房出来朝向大门的地方,还挂着一堆塑料袋。
老板收拾着东西,跑去一间窗户空敞着的房间去找塑料袋,把手上的东西装好了,又把那一挂塑料口袋也装上。
11 月 24 日下午 2 点,他们已经把东西大略收好了,放在门口,就置在那些玻璃渣子上。他们准备搬去河北。只是把东西运去那里先存放,还不知道以后怎么打算。
门窗都被砸碎了
张蓉是河南人,一年前和丈夫在服装厂“奢时集团”对面开了家足疗店。24 日中午 1 点,这家店从外观上看铁门和入口处的钢架结构已全部被砸烂。朝街的一整面玻璃窗都没了,露出里面两张双层床。地上玻璃渣和衣服、日用品散落在一起,墙上还挂着一幅字,写着《兰亭集序》中的那句“惠风和畅”。夫妻俩忙着搬家,车上已经装了家具和锅碗瓢盆,另外还有些亲戚则忙着把店里被砸坏的家具搬出来丢掉。
张蓉 2007 年来北京,两个儿子一个去当兵,一个在北京上初中。两人先是在大兴旧宫镇南小街摆水果摊。2011 年 4 月南小街发大火,消防清退,他们就搬到了新建村摆摊。2016 年攒了七八十万,觉得“生活有了点起色”,所以拿这些钱租了间 100 多平米的店面,装修改造成足疗店。三四个亲戚也从老家过来帮忙,几个人都住在店里。
张蓉没有接到过要清退的通知。24 日凌晨四五点,十几个保安把门砸开,把他们从睡梦中拉到了门外,不过没人解释是为什么,就说“快出去、快出去”。冰箱、饮水机等值钱的大件被抢走了,热水器因为一下子拆不动所以没有抢。
行李眼看着就要打包完了。两个收废品的人这时来转了转,看有没有什么可以收走的。一个人看中了热水器,听说要价 100 元觉得太贵,转身要走,几个亲戚把他拉进去抽烟谈价。另一个是河北人,原本在大兴做公寓出租生意,被清退后搬到了河北固安,打算重操旧业,想低价收购家具,也被亲戚们拉进去抽烟谈价了。
张蓉打算带着初中上学的儿子,直接开十几个小时的车回河南老家。“北京现在不欢迎我们了,我们像逃难一样,跟要饭的有什么区别?走了走了。”
深夜还在搬运东西的叉车
王师傅有一辆小货车,自称已经在新建做了好几年搬家生意。火灾后第二天,他就收拾东西搬到离新建村不远的南海家园,住在一个正规的二居室里。
“这几天搬家的价格都在涨,去市里 450 一趟都有人走。我没心思涨价,赚这钱没良心,反正这几天要搬家的人很多,活都做不完。”
从新建村搬家到市里,他收 300 一趟,“我这个价格很实在了,这几天要搬家的人很多,搬到黄庄那边都要 150 到 200 一趟,你去市里怎么都要三个小时,收 300 很便宜了。”如果还需要处理废品,他承诺可以一起处理掉,但是“价格很低”,而且“不要问太多,反正会有人来收的”。
朱师傅的手机号码还留在新建村东侧的墙上,是黑色喷漆喷上去的那种。这堵墙离起火的公寓不到 100 米。11 月 25 日晚上九点半,我们拨通这个电话的时候,他正在长途汽车站,带着老婆和女儿准备回河南老家。
他的废品站已经被拆除。“之前就在整改了,这边都是棚户区,早就说要拆,但是大队里也不着急。结果大火烧了,政府就说几天之内要全部赶走。店都拆了,就不做了,回家过年去了。北京收废品的这行都不行了,没地方堆。”他说。
这个废品站之前在新建一村一间平房的院子里。
“昨天就来人把废品站全拆了。周三,大队和房东说了,这周就要拆掉,赶紧搬走。周四大队来人看了废品站,周五上午就全部拆掉了。”
“这会 40 天大检查,附近的废品站全部拆了,这行没法子做了。过完年再说吧,不定呐。“
他还知道有两个人能收,因为家里在别的地方还有点“场子”,“他们也不要太多的,你卖也是白给,以前能给100 块钱的东西,现在就给 10 块钱。你赶紧把东西送人都行。”
新建村墙上贴着留有杨女士的电话的纸条,“有房出租,拎包可住”。纸条很新。
她称自己是固安县正规的中介机构,但具体是哪一家中介,她并不愿意多说,只说是河北固安县当地的中介公司。前几天看到新闻里说这边着火了,政府在清理拆迁,很多人没地方住了。于是他们 11 月 20 日去新建村贴了出租房源的信息,然后就没再去过。
固安县位于新建村南边 30 公里的地方,已经属于河北省廊坊市,距离北京市区 2 个半小时车程。
“这边房子都是新盖的,新建这几天也陆续搬过来了一些人。昨天我接到一个客户电话,下午把房子的照片发给他看,他说他明天就会拉着东西过来。你放心,这边房子都很好,刚盖的新小区”。
高涛是 Spa 店老板王亮的朋友,11 月 24 日,王亮去店里拆空调,做“被清退”的收尾工作。高涛和另一位朋友也去店里帮忙。高涛不住在新建村,但他也被清退了,现在住在朋友家里。
他是大兴区的美团外卖配送员,自己在北京,老婆孩子在家乡。他说:“大兴区美团外卖配送员有 200 多人,这几天里大概有 180 多人都在找房子。”
他之前告诉过王亮,他这两天送外卖看见人在屋里哭,女人抱着孩子。
拿这话去跟他求证,他回答说:“那可不是!在大兴海子角那儿,因为光那个地方就有 20 多个公寓!一个公寓打 400 人算,多少人?打 300 人算,多少人?你想想吧?到哪儿找那么多地方住。我看到有两三家的人在哭。工作工资和租房不成正比了。等于是上班赔钱。”
“现在中介牛逼着呢,昨晚上中介签房签到 12 点。我爱我家、链家这样的,租或不租,后面有的是排队着的。”
“我在朋友那儿住到什么时候算什么时候吧。现在房子这么贵,我今天问一个小次卧,一个小次卧多少钱,1800。就在黄村里面,押一付三,以前八九百块钱,一千块钱,撑死了。你上黄村链家中介去问去,你说你想租房子,没有。有熟人还没有呢。”
“我昨天去眉州东坡酒楼大兴店,服务员下午没上班,都出去找房子去了。我每天去那儿取餐,他们昨天就剩了几个人做饭的和几个传菜的在店里。他们大概一共有 200 个服务员吧。(经核查:眉州东坡酒楼大兴店大概有 100 多位服务员。)
他是福建人,2008 年来北京打工,买卖建材。搬过很多次家,一般都是跟着工地走。有三个孩子,分别 13 岁、10 岁、6 岁。老大留在了老家,由父母带;老二、老三跟在身边,妻子是全职主妇。
他说建材这行挣钱没个准数,每月收入平均在 8000 元左右。“但这两年限购,建材不好干,感觉有点支撑不住了。也想过离开北京,但看全国的行情,去哪儿也都差不多。”
今年年初,他和妻子考虑到孩子入学问题,从城南丰台区的张仪村搬到了大兴西红门新建村的海兰公寓里。11 月 19 日聚福缘大火后,他们没接到过清退通知,但 24 日早上 9 点起床不久,几十个保安进来赶人。两人慌忙找了个面包车。车里最值钱的一件东西是冰箱,其它就是日用品、衣服和食用油。
装满行李和生活物品的货车
他们打算把杂物先运到一个开木材厂的福建同乡的库房里, 然后去找住的地方。25 日下午 3 点 40,他发来两个视频,画面上也是一个公寓,走廊里到处是杂物,人们正在往外搬家。这是团湖南村的天河家园,“本来说让住的,搬过去又说公寓都不让住了。有的公寓听说是新建村来的,说晦气。我们现在不知道该去哪儿了。”
下午 4 点,他和妻子最终暂住在大兴区旧宫镇的叔叔家,因为是楼房,所以没受到拆迁影响。“今年不找了,年后再考虑。”他在微信上说。
贴着搬走告示的玻璃门
匿名,公益组织主管,43 岁:
因为他承受了较大的压力,他要求为自己和所在的公益组织匿名。
他是湖南人,2009 年和妻子一起来北京,10 岁的儿子留在家乡,由哥哥嫂子照看。
2017 年 3 月,他在京郊开设了一个免费的打工者互助空间,没有额外的收入来源,主要依靠社会捐款。“可以打乒乓球,免费借还书,会修理电器的人帮忙修理电器,有时间的人帮忙照顾孩子。”
11 月 24 日下午三四点,这位主管在朋友圈和公众号发布了免费帮助“北漂工友们”的信息,说可以接纳行李,提供基本的住宿以及安排车辆免费帮忙搬家。
消息发布后,他没接到什么电话,也没有接到找不着住处的人。不过,晚上九十点钟,他接到派出所打来的电话,被告知自己没有资质接收人员。对方要求取消这个活动。11 月 25 日,陆续有求助电话打来,他只能表示拒绝。
他于是决定改成帮人找车搬家。不过这个决定也没能坚持多久。“有关部门”又找上门来,宣布关停这个打工者互助空间,同样是因为“没有资质”。
这位主管说,接下来他会想办法申请资质。
11 月 25 日下午 4 点,新建村金业大街路口。他站在街边,有时和堵在路口、三轮车骑不走的收废品师傅聊几句,有时和路过的老邻居讨论几句,更多的时候就是背着手站在街边,看着。
他说这个村是一个移民村。1956 年,因为房子要被收走,从昌平搬了八个村过来。“好多都是抗日老兵,我们小时候,他们老给我们讲。”他回忆道,“你看这些路都横平竖直,哪像一般农村。”
以前村里人都在附近的工厂上班,但他早先工作的水暖厂现在已经没了。
至于村里现在正在往外搬的工人和服装厂,他说那是十几年前来陆续过来的。在此之前因为没人租房,新建村还没有这么多加盖的二层楼。现在村里有一两百平米宅基地的都建了二层楼,楼下租给工厂或者店铺,楼上是群租公寓。
他自己家里没有这样的地出租,也不喜欢村里全是违建。但看着赶在三天期限最后一天往外搬迁的人流,他重复了几次,“操之过急啊”。
正说着,一位看上去很相熟的邻居走过来,和他说最近家里盐用完了,刚从生产队里拿了半包。另一位老邻居拎着一箱西红柿拉面方便面过来说,几百米外正在搬迁的大超市里只剩这一种食物了。
村里的大街上,已经看不到什么人了
11 月 25 日下午 5 点。新建四村卫生所是这里仅存的几个正常营业、门头完好的门面之一。
柜台里的药品摆放得稀稀疏疏。走进来,视线范围里最多的是感冒药,那也是这里销量最大的药品。负责人说因为这是生产大队的卫生所,自己还不用搬。
她说自己是本地人,原本在县卫生院工作,退休后身体不太好,但不是城市户口也没医保。院长帮她申请了一张经营平价药房的许可证。
平价的意思就是多少钱进来,就得多少钱卖出,不能加价。目前收入来自卫生院每月 3500 元的补贴,其中 1400 元每月都发,剩下的得看考核,包括每月进多少药。现在大部分药她已经不打算进了,租户都搬了也没人来看病。
柜台边上还放着一袋鸡蛋、蔬菜和一袋肉,邻居从临近的村里带来。现在新建村已经没有卖食物的店铺。
卫生所还在正常营业,但超市已经没有商品
11 月 24 日在着火点聚福缘公寓附近,刘利民的女婿说他家“下午房门刚被人砸了”。
刘利民家在新建村“二队”,有一个三层楼房。一家六口(刘利民夫妻、女儿女婿、两个孙女)住顶层,一二层对外出租。18 号大火次日,村委会要求三天之内必须清退租户,19 号已经掐水掐电,所以 22 号人已经全搬空,他们就把一二层锁了起来。
1955 年,刘利民的父亲作为第一批住户从昌平搬迁到这里。1990 年,村里给家里生男孩的分宅基地,刘利民分到 4 分地(14 X 14 米)。2003 年,西红门镇政府征用土地,成立了一个“五连环房地产公司”,接管四队共 4000 亩左右,当时提出的条件是“每户每亩每年分 1000 元利润,每年涨 30%,不过涨到 6000 元后就没有再涨了”,但据村民说法,这笔钱并没有拿到过。刘利民记得,五连环 2010 年左右对外标价是“2 万每亩每年”,后来涨了多少就没有公布了。
2009 年,一些服装工厂陆陆续续从三环搬到六环。据刘利民的说法,除了北京开服装厂的越来越多,另一个原因是 2011 年 4 月大兴旧宫镇南小街的一场大火,“也死了很多人,之后也消防清退”。刘利民自己给房子又加盖了两层,一二层租出去,三层自己住。一层 180 平米,整层租给服装厂老板,一年租金 2 万。
刘利民自己早年在供销社工作,后来供销社关门就开始开出租。为了能多陪孙女,又开过一阵子 29 路公交,不过时间不长。 2 年前,新建村开始大批招零时保安,有“上百人”,统一穿着看上去不太合身的黑衣服。村民把这些人称为“二狗子”。刘利民开公交时,经常遇到给保安们做饭的厨子,厨子说“规定里保安每人工资是三四千,但实际拿到手只有两三千,不知是不是给上面的人贪了。”
刘利民的妻子媳妇在家照顾孩子,儿子是村里的保安。租金仍然是主要收入来源。
按照刘利民的说法,11 月 24 日下午 4 点,他们一家人在三楼看电视,突然听到二楼有人砸门,边砸有个保安上来问“人都走完了吗”,得到答案后继续砸了一阵才走。二层有监控录像,但电脑里没有硬盘,所以无法看到回放。
刘利民妻子给我们出示了三份资料。一份是《致村民的一封信》,落款为西红门镇新建一村村民委员会,10 月 31 日。这份文件说,“我镇于 2017 年 9 月 28 日启动了新建四个村棚改工作,目前已完成了前期摸底调查、入户清理和数据分析”“根据《2017 年北京市农村地区村庄冬季清洁取暖工作方案》等相关文件要求,今年全市要实现‘无煤化’。因涉及棚改,新建四个村未实施‘煤改清洁能源’工程……为保证广大村民冬季取暖需求,结合棚改工作,请各位村民及时清退租户并与其解除租赁合同,抓紧时间找周转用房,尽早搬家。对于在 2017 年 11 月 15 日前登记搬家的村民,提前预发周转费,周转费分两档:清退租户并拆除燃煤取暖设施的,每个自然院落 10 万元;拆除燃煤取暖设施未清退租户的,每个自然院落 8 万元。”
另一份文件是《预付周转费协议》,刘利民妻子给“需要拆除腾退乙方在项目范围内所有的地上建筑物及附属物”这句画了红。
村民们对”周转费“这个说法很不满意,大部分来的人也都是还没签协议的。“周转费 10 万,意思是先找地方租,拆迁费到位再扣 10 万。谁知道拆了房子后还给不给钱,怎么安置。”另外,原本说是 2018 年 10 月腾退,后来改成 2018 年 3 月。村民们觉得这是为了少给拆迁费,因为按新规定,2018 年拆迁费又涨了。
刘利民说,“拆迁这件事 8 月份就提了,但 10 月份还没开始。几个村干部自己还在往里拉材料,加盖房屋,想拆迁的时候多拿点拆迁费。”另一个村民说,“五连环成立的时候找我们征地,说我们相当于就是股东,每年要给我们分红。现在和五连环公司签协议把自己赶走,算是怎么回事?”
第三份资料是新建二村办公室发到微信群里的一个棚户区改造工作流程计划安排:1、2017 年 9 月 28 日至 10 月 15 日为入户调查清登日期;2、10 月 16 日至 31 日,由村镇两级进行宅基地确权工作,制定补偿方案和回迁安置房设计方案;3、11 月 1 日至 11 月 15 日进行签约前准备工作,初步谈户;4、11 月 16 日至 12 月 15 日进行实质性签约工作;5、12 月 16 日至 25 日为各部门档案整理;6、12 月 26 日至 1 月 31 日为选房和结算期。
11 月 18 日的大火,打断也加速了这个流程。
在大兴之外,“大排查、大清理、大整治”也在北京各处同时进行。我们也呈现如下:
舒欣公寓位于丰台区南苑红房子村,五爱屯东街和南苑西路交叉口,紧挨着一家速 8 酒店。从外观上看,这只是一个台球厅;不过走到二楼,马上就能看到曲折的长廊和一个一个的小房间。墙上一张停水停电通知第一次表明了这个神秘空间的名字,“舒欣公寓”。
舒欣公寓门外贴了一张通知,限期 11 月 25 日前自行腾退疏解,落款是“南苑村村委会,11 月 15 日”。但根据住户描述, 这张通知 20 日左右才贴出来,很多人没注意到,中午接到房管电话才知道今晚必须搬走。
贴着尽快搬离告示的墙壁
11 月 24 日这天,南苑大队共四五十人一天来了三次,上午 10 点、下午 3 点、晚上 8 点,撵人、砸门。现场所有的屋子都没有门了,门板散落在走廊或者倒在室内。
屋子里的景象显示出住户们搬走时的匆忙,像逃难一样。
因为电已经被掐了,所以黑乎乎的,打手电才能看清。有的桌上摆着酱油、醋、吃到一半的辣酱,筷子还插在罐子里;床上的被子还是钻进被窝的形状;拖鞋、雨伞也都没来得及拿,散落在地上。一个像是女孩住过的房间里,墙壁上用气球拼出“happy”的字样,糊了粉色墙纸,挂了一幅用拼图拼成的童话城堡,但地上全是丢弃的衣物以及洒掉的葡萄干。另一个房间,据房管说是一个白领男生住,不像别的房间,收拾得很干净,什么也没留下,墙上贴了很多福字和十几张对联。
租户搬走后的临街店铺,摄于新建一村
房管今年 50 岁,不愿透露姓名。说自己去年才从老家呼伦贝尔过来,给同乡帮忙。这个同乡在老家开了家 4S 连锁店,挣了些钱,就到北京来做租房生意。2008 年左右,他作为二房东租下这栋空置的三层建筑,先改成了一个包括台球室、溜冰场在内的娱乐城,几年后又在二三层加隔断,变成群租房。租金在 350 - 700 元,每户 10 平米左右。一共住了 60 - 70 户,大多为外来打工的单身年轻人,也有一些中年夫妇。
晚上 9 点,人基本已经搬空,只剩下 4 个人找不到住处。房管允许他们住一晚,但凌晨 5 点必须搬走。有个平头中年男子在楼下等着帮一对夫妻搬家的人,但他也不知道一会儿要搬去哪儿。“他们还没想好吧,边走边想呗。”
11 月 24 日晚 9 点半,丰台区南苑红房子村的舒欣公寓三层已经完全搬空,电也已经掐了,什么都看不见。散落满地的杂物中,只剩两个穿着工作服的人还在工作。
一个高大健硕,刚把一台空调从房间里拉出来,正蹲在地上整理空调后拖着的一长截白色通风管。他头上绑了一只刺眼的白色照明灯,脸被灰染得黑乎乎的,只剩两只眼睛和头上的灯一样明亮。另一个更年轻瘦小,头发乱糟糟地竖起来,倚坐在走廊一侧红色的灭火器箱上,工作服背后印有“紫荆花空调修配”的字样。
两个人都操着山东口音。他们说自己在北京七八年了,没遇到过这么大规模的人搬迁。从 19 号西红门火灾到现在,一共收了 400 到 500 个空调,收购地点主要是火灾事发地新建村附近的几个村子,收购价格在 300 左右。
“收了也不知道卖不卖得出去,现在很多废品回收站也被关了。我能在网上卖一卖,卖不了的就只能卖去河北了,人都去河北了嘛。”高个子说,接着背起空调消失在三楼门口。
正在考虑拆掉空调的男人,摄于朝阳区郭家场村
他也住在舒欣公寓。
两年前他从山西到北京,送快递是到这儿后的第一份工作。每月工资还不错,有 7000 到 8000 元。但他挺节省,租了间 700 元带卫生间的户型,这两年也没搬过家,因为“公寓对面就是顺丰在南苑的站点,而且这里房租不怎么涨,两年只涨了 50 元”。他对住的要求不高,能睡就行,本来工作时间也很长,早 7 点到晚 10 点。
想到第二天一早就要搬走,他很着急地在手机上找住处,还没来得及换下身上红黑相间的工作服。不过,周围的宾馆都住满了。“本来一间 100 的涨到了 300,现在连找都找不到了。”
位于北京海淀的后厂村是前几年出名的滴滴村,对面就是百度科技大楼。当时,这里聚居着大量的外地司机每天用滴滴接单赚钱。
在后厂村,一名没透露姓名的美团外卖送餐员告诉我们,后厂村的腾退在 2017 年上半年就开始了,他说“村头那片平房都被封了,都是大队的房子。之前做成小房子租给外面的人。今年房子被封了,住的人都陆续搬走了。”
我们在好几栋平房门前都看到了封条,上面的日期最早有 4 月份的,最新的是 11 月 21 日。在后厂村街道的墙上贴着许多腾退登记通知,通知上写着要求房东解除群租户合约,尽快办理腾退手续。
“这里跑滴滴的人大部分都走了,去年网约车政策出来之后,这边就没人做滴滴了,剩下还没有走的人做起了搬家和拉货的生意。”
“能搬的今年都搬走了”,他最后说完这句话后也走了。
人都走光了,摄于 11 月 25 日凌晨新建三村
张先生 1992 年出生,在石家庄周边长大。最近两天他和老婆住在朋友的发廊,每天早上 10 点开完夜班车在沙发床上睡几个小时,然后去找房子,下午 4、5 点开始开专车。
一周之前他还和老婆一起住在天通苑的一间群租公寓里。11 月 22 日,房东对 70 间租户说收到通知,必须在第二天搬离。
他对那里的环境不怎么满意,门与门之间只隔着 1.5 米,房东也不太好打交道,他送了两条中华才办成手续简单的临时居住证。但那里便宜,每月房租 800 元、冬天供暖每月 200 元。
在此之前,他有过更宽裕的时候。
才 25 岁,张先生已经在北京工作了 8 年多,前两年在舅舅的玻璃厂打工,攒了两万块钱买了辆比亚迪 F3 在西红门开黑车。之后他又用开黑车赚的钱换了辆本田 CRV。
期间张先生还跟朋友一起当群众演员玩了 3 个月。每天在北影门口等着,如果被金杯车拉到片场,一天有 30 块钱和一餐盒饭。
转变发生在 2015 年,当时张先生开了个社区便利店,但没几个月时间被通知拆迁。时间紧急,他退了些货、退不掉的折价卖,赔了 2 万块钱。
去年他又花 6 万多买了辆二手的外地牌现代瑞纳开滴滴快车,但一年不到北京市开始禁止外牌网约车。一转手又赔了 2 万多。
今年 4 月开始,张先生给租车公司开滴滴专车,扣掉每月租金油钱 6000 元,一个月差不多能赚 6000 元。而最近他看到的一套两居室在大兴黄村的新安里,已经涨价到月租 2800。
“老小区,都不是双层玻璃。”他还在犹豫。
尽管他说自己对北京已经没有当初的好感了,但还是想尽可能留下来。“走的中年人很多干零工的。现在突然走,我们都不知道去哪儿。好几年了,哪怕远一点、贵一点,也只能待在北京。”
最近张先生把自己那辆本田 CRV 挂在瓜子二手车上,还没卖掉。
新建村里留下来的车子都在搬运行李
11 月 23 日,在蒲黄榆地铁站附近的果多美水果店碰见他。
他前一天刚刚从公寓清退出来。他本住在 111 文化产业园,这个地方在三环附近,靠近中国戏曲学院,在它的东南面。这个园区里有三四栋公寓楼。果多美的很多宿舍都在里面。11 月 21 日,公寓发了通知说要清退,让住户搬走说 22 号下午 6 点前就不让进人了,要贴封条。
“我们昨天就搬出来了,”现在他们住进了果多美的其他宿舍里。
红房子养老院在丰台区南苑机场的东北侧。
11 月 26 日,豆瓣有人发布消息说红房子养老院将要搬迁。
11 月 26 日下午,拨通养老院的电话,工作人员说,现在养老院已经不再收人了,因为要拆迁了。按规划,红房子养老院本来就要拆迁。 按规划,这里要变成绿地,明年这里就要拆除。但是新建村的火灾加速了拆迁。
11 月 25 日下午1 点通州区五环外的郭家场村,这家“成都小吃店”是为数不多还在营业的店铺之一,门店上还拉了横幅,写着“正常营业”。
小吃店所在的这条街,大部分已经贴了停业通知,要求11 月30 日前撤离完毕,一些贴了封条,日期是 11 月 24 日。
饭馆有营业执照,暂时没被贴封条,但贴了张“消防十个严令”。虽然有营业执照,也不知道还能坚持开多久,女店主说 1995 年来北京后就没离开过。“先开着吧,”她边结账边说。
不过原本租的房子已经不让住了,就是小吃店后面的公寓。25 日,他们急急忙忙在附近又找了新的地方,在小吃店百米外的另一个公寓。
新找的公寓和广州城中村握手楼相似,建得比较密集。房租在 400 至 1000 元以内,所有房型不含独立卫生间。
公寓门上贴了很多消防安全的告示,最新的一张落款是11 月20 日,房东手写了重要通知,最近要进行地毯式大搜查 40 天,不能使用电热毯、煤气罐、热的快等易燃物品。
今年这里要求“煤改气”,村里不让烧煤供暖,原来楼外烧煤的小屋早已封上。一个房东说,租房后要取暖的话,就要买正规的取暖器,“小太阳”那种简易取暖器是不能用的。
他们的店外有两只猫,一只在吃东西,一只蹲在铁皮架子上看着马路。这两只猫是隔壁店铺搬走时丢下的,他们顺手喂养了。门外抽烟的男店主说,如果想养的话可以带走。
贝贝住在通州张家湾的一栋公寓里。
11 月 22 日,她在社交网络上写,“警察限三天内公寓要强制清退,房东说没事,坐等三天后的情况,但愿别太糟”。
11 月 23 日,她说,她们公寓没有人搬走。她说有点担心,房东不给退钱怎么办。这一天,她给社交网络上一条信息点了赞,上面写:“我太俗气了,没有对抗生活被打破的勇气,比如这次北京强拆公寓看到还是心有余悸。精神养料再也给不了我踏实了,抓在手里的物质才有安全感。 ”
11 月 24 日,贝贝没有回复信息。
11 月 25 日下午,贝贝回复:“我们房东还在强撑,但是还是没电。”
新建村卫星示意图和火灾现场位置
11 月 18 日 18 时,北京大兴区西红门镇新建村“聚福缘公寓”突发火灾,死亡 19 人。
11 月 19 日,新建村村北侧沿街的大道鼎业街拆除。
11 月 20、21 日,房东开始通知租户搬家,一些房东告诉租户说 23 日必须走人,一些说截至 27 日。
11 月 24 日,新建一村临街店铺断水断电。
11 月 29 日,新建村西侧的新公寓租户搬走的最后期限。
注:谢金萍、张智伟、周韶宏、杨宽均参与此文采访
]]>~/Library/Fonts/
,却无法正确识别字幕中所指定的字体名的问题,该问题主要体现在东亚文字字体中。1 | [sub/ass] fontselect: Using default font family: (EPSON 太丸ゴシック体B, 700, 0) -> /System/Library/Fonts/Helvetica.ttc, -1, Helvetica-Bold |
这个问题是因为 mpv 采用了 libass 作为 ass 字幕的渲染器,libass 从 0.13.0 版起采用了 macOS 原生的 Coretext 作为 font selection backends。但很不幸的是,Coretext 进行字体选择是基于字体的 PostScriptName,而字幕组在制作字幕使用字体时均使用了字体的 FullName。
以方正准圆为例,其 FullName 为方正准圆_GBK
, PostScriptName 为FZY3K--GBK1-0
,字幕组使用前者的原因显而易见。
想要修复这个问题,需要禁用 libass 的 Coretext,更换为 fontconfig 方式,默认使用 FullName 匹配字体。
在命令行下执行,brew reinstall libass --with-fontconfig
,homebrew 就会使用--disable-coretext
参数来编译 libass。
编译安装完成后,在~/.config/mpv/
目录下新建fonts.conf
配置文件,文件内容可参考 fonts.conf。其中可以自己指定字体的 alias,和搜索路径等。不过我还没弄明白这个文件是否为必须,可以考虑先不添加。
如果你是使用brew install mpv
命令安装的 mpv,且字体安装在~/Library/Fonts/
或~/.local/share/fonts/
此时字体选择应该已正常。
如果你安装的是已编译打包好装入/Application
文件夹的程序, 如从官网下载或使用brew cask
方法安装。则需要手动替换软件包中的 libass library。
如果你不懂得如何编译,可以点击下载我编译好的 libass.9.dylib 文件完成替换。
以 IINA 为例:
使用编译好的 libass library/usr/local/Cellar/libass/0.13.7/lib/libass.9.dylib
,替换掉 IINA.app/Contents/Frameworks/libass.9.dylib
即可解决问题。mpv 也同理。
替换后打开应用可能会被提示未受信任的开发者开发的应用程序,这是因为对软件包的修改破坏了开发者签名,在安全性与隐私设置中同意即可使用。
————————-Update 2019.12.30—————————–
未安装 fontconfig 相关依赖的用户可能会导致替换文件后程序crash等问题,这是因为我编译的libass.9.dylib
中采用了绝对路径,这里提供一份 @LIznzn 提供的修复版本,使用方法同上,感谢 LIznzn 。
————————-Update 2019.12.30—————————–
修正前后的效果对比如下,强迫症终于可以舒服的看动画啦。
修正前:
修正后:
游戏在此:
受限于页面宽度可能显示不完全,请移步 https://www.sekai.co/trust/ 进行游戏。
]]>选取样本中给定数量的 k 个样本作为初始簇中心,遍历样本分别对每个聚类中心计算距离,将样本分配至距离最近的簇中。
更新每个簇中心为簇中全部样本的均值。
使用新的簇中心重新分配全部样本。
重复 2、3 步,直至簇不再发生变化。
以下是在上一篇文章所述的 e-hentai 数据集上实现的 k-means 算法:
1 | import time |
以下是随机选取 1000 条样本 k = 10 时的聚类结果。可以看出基于 tag 向量相似度的聚类结果的每个簇中,相对样本均值分类占比增益最大的分类,与样本的天然分类标签能够基本对应起来。这说明k-means 算法工作正常,且样本的 tag 与其分类有着较强的相关关系,这一结果也通过决策树与神经网络模型得到了验证,有时间再整理代码放上来吧。
1 | $ python3 k-means.py |
需要注意的是,k-means 是一个启发式算法,其优化目标函数是一个 NP-hard 问题(本文中采用了向量余弦距离,目标函数为 $max\sum\limits ^{k}_{i}\sum\limits _{x\in C_{i}} cosine( c_{i} ,x)$
),因此难以确定其是否会收敛至全局最优解,并且聚类结果相当依赖初始聚类中心的选择,对数据中异常点也比较敏感,一般在使用 k-means 算法时会选取不同的初始聚类中心进行多次聚类,选择其中较为优秀的结果。
同时,E 绅士因其囊括作品的数量、多样性、多语言版本、齐全而丰富的 tag 标注,成为了用于机器学习等领域的天然优秀数据集。
关于 e-hentai 数据集更多的论述请参考这篇博文:HHHentaiCollection☆!!! —— 一个ML数据集的设想。
同时,一个 E 绅士爬虫项目 E-HentaiCrawler 发布了其截至今年一月爬取到的所有数据,并发布了简单的统计报告:从 E 绅士(Ehentai)47 万条本子数据看各国死宅的兴趣爱好。
其中包括了约 47 万本作品不含图像的全部数据。但是其发布形式为 mysqldump 导出文件,使用起来不是很方便。于是我将数据整理去掉无用信息后,将其导入 Python ,每本作品信息分别保存在 dict 中,以 list 形式组织,并使用 pickle 模块保存为文件。
可以使用以下方法导入数据集:
1 | import pickle |
每个 dict 的结构如下:
1 | { |
为了演示数据集用法,也是从实际需求出发,使用向量余弦法判断两部作品 tag 的相似度,实现了一个基于简单相似度排序的推荐算法:
1 | import pickle |
代码中 gid 为 e-hentai 的作品 ID,是唯一的。两部作品在空间中 tag 向量的夹角越小,相似度越高,其夹角余弦值则越大。这段代码实现了在数据集中通过 gid 任选一部作品,通过判断 tag 向量夹角余弦值,推荐相似度最高的 20 部作品。
还可以考虑自己手动键入多个 tag,计算相似度并作推荐,代码我就懒得写了,有兴趣请自行发挥。另外计算向量余弦的时候没有使用 numpy,主要是因为 tag 的总量很大,约 10 万种(绝大部分 tag 出现次数极少)。若生成为 10 万维向量再求值,会浪费大量内存空间,故采取了模拟手算的方法,仅需考虑有效维。
进一步思考,为了提升推荐算法的效果,还可以考虑修改不同 tag 的权重,起到增强偏好、过滤多语言版本等效果。
数据集和以上代码可以在 Github 上 clone:ZRStea/ehdataset
下一步考虑使用该数据集进行一些机器学习算法的实践尝试。
]]>这篇文章简单介绍两个自由软件项目,用于实现非对称加密信息传递体系的 GPG 与基于点对点网络的去中心通信软件 Tox 。
GPG (GnuPG)是自由软件基金会主导开发的自由软件,用于代替商业化的 PGP 软件进行非对称加密、签名等工作,实现安全的信息传递,自其诞生以来得到了广泛的应用。
在macOS下可以使用homebrew很方便的安装gpg
brew install gpg
使用--full-gen-key
参数来生成密钥环:
gpg --full-gen-key
建议使用 2048 位以上的 RSA and RSA 。为了避免后期折腾,可以考虑将有效期设为无限。
这时候我们就获得了一个密钥环,其中包括两对公私钥,分别为主钥和从钥。主钥用于签名和验证,从钥用于加密和解密。
你可以选择将公钥上传至服务器:
gpg --keyserver keys.gnupg.net --send-keys <key ID>
不同的 GPG 服务器之间通过交换机制互相同步,最终所有GPG服务器中都会存在你的公钥。
当然公钥的上传是没有任何身份验证机制的,任何人都可以以你的名义上传公钥,这时候就需要你公布公钥的指纹,供下载者进行核对。
你可以点击这里下载我的公钥,来对我签名发布的文件进行校验,或是向我发送加密信息。下载时请注意浏览器安全提示,确认目前的 https 完整,以保证文件分发安全。
你也可以在任何 GPG 服务器中搜索 zrstea 来获得我的公钥。如 https://pgp.mit.edu/
使用 gpg --import filename
来导入,并检查指纹。
或是直接使用命令行搜索并导入:
gpg --keyserver hkp://pgp.mit.edu --search-keys zrstea
导入公钥后,指纹可以使用以下命令获得:
gpg --fingerprint <用户ID>
这里是我的公钥指纹 60F1 98DC 55F4 527E AE06 A491 4E8A 53BB 43EB BE2B
当持有对方公钥时,可以利用公钥加密文件发送给对方,该文件只能私钥持有者可以解密:
gpg --recipient [用户ID] --output filename.en.txt --encrypt filename.txt
解密命令:
gpg --decrypt demo.en.txt --output demo.de.txt
还可以进行签名和验证等操作,详请参见参考文章。
1 GPG入门教程 - 阮一峰的网络日志
2 使用GPG签名Git提交和标签
Tox 是使用 GPLv3 协议发布的一款即时通信软件,基于去中心的 P2P 网络,采用非对称加密手段进行身份鉴权,实现端到端加密,不需要任何中心服务器,任何中间人也无法窃听通信内容。该项目的目标是为所有人提供安全而方便的通信方式。
在 Tox 项目官网 可以下载相应平台的客户端。
在客户端中按照提示建立自己的用户档案,软件会生成一个 Tox ID 。将 Tox ID 分享给需要通信的人,他通过该 Tox ID 即可找到你,建立好友关系,建立完毕后即可进行安全通信。注意,因为没有中心服务器的原因,任何时候进行通信的双方必须同时在线,且正常接入了网络建立了连接,这往往需要等待一段时间。
下面附上我的 Tox ID ,欢迎添加:
D8D03A18FA48EE8191AC1D115B757AC18387F8D36EB1B8E7B2A263F2E8D5A60A5627391806BA
或者扫描二维码:
]]>现使用一月有余,做一个简评以供参考。
使用总体体验:满意,无线体验不是被线缆所束缚的过去所可以比拟的,非常方便,开盖即用,极大的扩展了活动范围。在经济条件许可,且苹果设备较多的情况下强烈推荐。可以较为方便的统一整个 Apple 平台,使用时仅需在相应设备上点击切换即可。
音质:受限于体积与无线,音质平平,但是并不差,稳稳持平或略超过了 EarPods ,已能够满足非烧友的博主所需。
续航:极佳,是博主使用过续航最好的蓝牙耳机,在音乐播放上毫无虚标,能够连续播放 5 个小时以上音乐。通话续航因为双向通信以及话筒的持续采集的原因会下降很多,不过也有双耳佩戴 2 个小时以上的连续通话能力,且可以采用使用单只耳机,另一只放进盒中充电的策略来保证持续不间断通话。很难想象苹果是如何在仅重 4g 的耳机中实现这样的续航能力的。如果这样还不能满足需求,配合充电盒与快充技术,可以在 15 分钟左右充满耳机。充电盒能够将耳机充满三次,能满足两天的高强度使用需求。
佩戴稳定性:很多人在担心 AirPods 是否会容易从耳朵上滑落,就博主本人使用体验来说,未发生过因运动造成的滑落,佩戴十分牢固,当然这个和耳廓结构有关,因人而异。
活动范围:直线连接范围超过 10m ,可以穿一堵非承重墙,完全满足单个房间内完全覆盖。
当然在这些优点背后,AirPods 的缺陷也是十分明显的:
外壳材质过软:任何坚硬物体可以轻易的在耳机及盒子表面留下划痕,仅一月使用下来,充电盒表面已成磨砂状,耳机几次失手掉落到木地板上,也出现了数个很深的磕痕。因为不影响使用,本人已看开,强迫症患者请慎重考虑。
操作不便:目前在 iOS10 系统下仅支持简单的轻敲耳机接听电话、呼出 Siri /开始暂停功能,比较要紧的音量调节等功能无法实现。不过在 iOS11 中苹果为 AirPods 增加了定义手势功能,较为期待。
切换速度较慢:在不同设备间需要手动切换,且需要等待10s 到 半分钟来完成发现设备+连接设备的工作。有时候甚至会出现连接bug,很久都连接不上,容易在接电话等时候掉链子,十分令人恼火。
通知音设置不独立: AirPods 会采用全局的通知音量设置,如果你习惯将 iPhone 的通知音量调至最大,在使用 AirPods 的时候很有可能会经常被通知声震到耳膜疼,目前没有很好的解决办法。
目前已知无法将 AirPods 改名为“AirPods”。下次连接时会自动变为修改前名称。
以上就是一月来的使用体会,仅供各位参考。
]]>最近闹的沸沸扬扬的 Shadowsocks 被针对检测的争论还未平息,混淆被认为是目前可能有效的针对流量检测手段,旨在提供强特征将流量伪装为常见协议如 HTTP 来绕过识别与 Qos 。因此在 shadowsocks-libev 中,开发者引入了 simple-obfs 的模块来提供 HTTP 与 TLS 方式的混淆。但经讨论认为这是“ a dirty hack for given ISP ”,因此在后续版本中将混淆模块单独拆出以插件形式提供。详见: Github issue
目前 Windows 平台并没有支持 simple-obfs 混淆插件的 Shadowsocks 客户端,那么只能自己动手了。修改或重写客户端的工程量太大,理想的方式是直接使用 shadowsocks-libev 内置的 ss-local
,那么需要一个 Linux 环境。
笔者首先尝试了在 Windows 10 自带的 Linux 子系统中安装 shadowsocks-libev ,该子系统原理是实时将 Linux 的系统调用转换为 Windows 的系统调用,但是不管是通过 apt 包管理器安装还是自行编译均会出错,可能是存在 Linux 内核上的依赖从而导致不能在该子系统中运行。
还有个办法是虚拟机,但是从头安装 Linux 虚拟机再配置网络实在是过于麻烦,完整的 Linux 也会无谓的拖慢系统,开销太大。所以轻量、部署简单的容器服务 docker 就成为了首选。
通过以下链接下载并按照提示安装 docker :
https://download.docker.com/win/stable/InstallDocker.msi
注:尽管 Windows 下的 docker 也是借助虚拟机实现,但是部署简单,在此场景下所占资源也能够接受。
docker 安装完毕后,以管理员身份打开命令提示符,执行以下命令
docker pull zrstea/docker-shadowsocks-libev-obfs-privoxy
这样就成功的把预构建好的镜像下载到了本地,可以直接使用。
接着用自己的配置修改以下命令并执行:
1 | docker run -p 127.0.0.1:1080:1080/tcp -p 127.0.0.1:1080:1080/udp \ |
这样就实现了在本地开启了一个开启了 HTTP 混淆的 Shadowsocks 客户端,同时利用 Privoxy 转换出一个 HTTP 代理,在浏览器代理中设置 SOCKS5 代理至127.0.0.1:1080
或 HTTP 代理至本地http://127.0.0.1:8118
即可。
更多配置参数请参考官方文档。
若有选择性代理需求的请参照 SwitchyOmega Wiki 在此不做赘述。
同理该镜像还支持在任意平台上(只要 docker 支持)快捷部署 Shadowsocks 服务端、客户端,你也可以从 Dockerfile 自己构建镜像,详见 Github 。
]]>一般来说,这个加密用的密钥是交给硬件上的 TPM 即可信任平台模块来管理的,一般用户无需操心,只要开启 Bitlocker 进行全盘加密即可,日常使用几乎是无感知的(加解密过程有硬件加速所以对电脑性能影响非常有限)。
而受限于某些法律法规和某些厂商的偷工减料,大部分国产的 Windows 平台电脑是不具备 TPM 模块的,默认无法开启系统所在驱动器的 Bitlocker 。
通过组策略可以在没有 TPM 的情况下在系统驱动器使用 Bitlocker 。具体教程有很多这里不多说。但是这种情况下,开机时必须自己输入加密密码,或者插入生成的 USB 启动密钥(在启用 Bitlocker 时只能二选一)。
我也按照这个方式将 Windows 设备开启了 Bitlocker ,选择密码方式,但是每次进入 Windows 引导之前都会被要求输入加密密码,而我的密码又是相当长的一个高强度密码,十分不便,自动更新等设备重启后若无人值守也无法直接进入桌面。
通过查询资料了解到使用 USB 启动密钥,如果电脑开启时插着 USB 密钥,是可以跳过手动输入密码这个环节的,但是我已选择了密码模式,怎么办呢。
尽管中文互联网上很少有见提到,但是微软的英文文档支持还算不错,通过查询找到了以下办法。
Manage-bde
命令是一个用于管理 Bitlocker 的命令行工具,功能十分丰富,微软的文档支持在此。
这里使用的是-protectors
这个模块,用于生成一个 USB 启动密钥(StartupKey)。
首先插入一个准备好的 U 盘。
在管理员模式的命令行下执行manage-bde -protectors -add C: -StartupKey X:
其中X是 U 盘的盘符。
命令执行完毕后会在 U 盘根目录中生成一个系统属性的 BEK
文件,平时将这个 U 盘插在电脑上,就可以实现开机跳过手动输入密码的步骤了。
众所周知微软在 Windows 10 中推出了新的激活模式,通过免费计划等方式升级的用户的 Windows 激活是与主板绑定的,通过主板的唯一标志来确定机器,这样保证了再重装系统之后可以实现联网自动激活。我的 Macbook 上次就是通过这种方法获得了正版的 Windows 10 专业版授权,但是苹果的 Bootcamp 底层虚拟了部分硬件,这就不能确定在抹掉重装之后是否还能自动激活。
先是费劲腾了 50G 以上的空间出来,然后数次重分区失败,不得已重启进入恢复模式用磁盘工具修复了错误后再次尝试,总算是装好了系统。
事实证明,在重装完毕联网之后 Windows 自动激活了,且在 Microsoft 账号的云端也能看到这台设备,显示的设备序列号也正是这台 Macbook 的真实序列号。
]]>http://bucketname.oss-cn-location.aliyuncs.com/filename
的链接用于访问资源,但是这个链接并不便于记忆,有时候我们可能想要用自己的域名来访问,但是如果设置了 CNAME 指向bucketname.oss-cn-location.aliyuncs.com
这个域名的话,访问时会报InvalidBucketName
错误。这是因为阿里 OSS 通过 HTTP 头字段 (HTTP header fields) 中的Host
字段来判断所访问域名再返回相应资源,通过 CNAME 访问时就会无法获取到正确的bucketname
而导致访问失败。还有一种办法就是通过 URL 转发来实现,但是我用的 DNS 服务商 DNSPOD 的显性 URL 服务要经过审核,延迟 24h 才能生效,而且多半无法通过,隐性 URL 服务更是要收费。而显性 URL 服务本质上就是一个 301 重定向,隐形 URL 则是服务端重定向。于是我考虑了一个通过自建服务器进行重定向的方法。
本文基于 Ubuntu 进行说明。
首先在自己的服务器上安装nginx
,这是一个优秀的 Web 服务器软件:
1 | $sudo apt-get update |
进入/etc/nginx/sites-enabled/
目录
编辑 default
文件
将其中server
项中改为如下
1 | server { |
server {
listen 80;
server_name oss.zrstea.com;
if ($host = ‘oss.zrstea.com’ ) {
rewrite ^/(.*)$ http://zrstea.oss-cn-shenzhen.aliyuncs.com/$1 pernament;}
}
pernament 代表 301 永久重定向 (Permanently Moved) ,也可以用 redirect 使用 302 临时重定向 (Temporarily Moved) 。这两种方式对本文场景下的应用来说是没有区别的。但是对搜索引擎来说 302 重定向是不友好的,可能会在权重上有所歧视,一般建议使用 301 重定向。保存退出,重启 nginx 服务:`$sudo service nginx restart `## 配置域名 A 记录将自己的域名的 A 记录配置为服务器的 IP 。## 测试这样访问> [http://oss.zrstea.com/ATfiled.jpg](http://oss.zrstea.com/ATfiled.jpg)就会自动重定向到`http://zrstea.oss-cn-shenzhen.aliyuncs.com/ATfiled.jpg`
]]>花了大概两天的时间去了解各个静态博客框架,最终选择了 hexo ,主要还是看中了其简单易用的特性,并且文档和各种插件、主题支持都相当完善。博客整体托管在 Github page 。用自己的域名不能上 https 还是比较难过。
折腾这个静态博客的过程中也难免踩了一些坑,但是得益于足够完善的文档和网络资料,这些问题都很快得到解决。
让我纠结了一个晚上的问题是 Next 主题中 social 部分配置了 Twitter 的链接竟然不显示,无论是使用 Safari 还是 Chrome 都不行。在 HTML 代码中也能看到其存在,但是就是不显示。最后发现是被Adblock默认屏蔽了…
目前还有auto_spacing
不能正常工作的问题未能解决,比较迷,暂时只能手动在中英文之间加空格了。
关于老博客方面,把博文都完整迁移过来了,图片目前储存在阿里云 OSS ,分类还存在,但是原来的 Wordpress 系统没有使用标签,所以旧博文的标签是缺失的。另一方面,因为使用多说来作为第三方评论系统,暂时无法进行迁移工作,好在以前博客留言寥寥,也没什么必要了。
数据统计方面使用了谷歌的分析工具,考虑到墙和使用习惯的问题,又加了个腾讯的。
]]>]]>有时候你像个傻子一样 与这个华丽的世界格格不入
有时候你那么厌恶你自己 不愿意再与他为伍
每一次拨通一个陌生的电话 呼吸都会变得很急促
你开始强迫自己 停止幻想那些 曾有过的伟大的抱负
你从来没有机会从任何规则里面 顺利地逃出
在遵循它的同时 诅咒它 忽略了此外的所有的幸福
有些时候你只好 躺在床上 背对着她偷偷地哭
因为你早就发现 这世上没有人能 代替你去痛苦
嘿 否定先生 没人在乎你的痛苦
嘿 否定先生 没人代替你去痛苦
你否定了 所有值得肯定和称颂的
只为证明你的无能为力 它并不孤独
有时候你偶尔疯狂一下 像个热情的少年爱上了她
姑娘们并非你想得那么伟大 不会轻易为你开花
望着自命不凡的自己的灵魂 还没绽放就已经枯萎
你必须警告自己 别再追逐那些 上天不愿给你的恩惠
你从来没有机会从任何规则里面 顺利地逃出
在遵循它的同时 诅咒它 忽略了此外的所有的幸福
有些时候你只好 躺在床上 背对着她偷偷地哭
因为你早就发现这世上没有人能 代替你去痛苦
嘿 否定先生 没人在乎你的痛苦
嘿 否定先生 没人代替你去痛苦
你否定了 所有值得肯定和称颂的
只为证明你的无能为力 它并不孤独
嘿 否定先生 没人在乎你的痛苦
嘿 否定先生 没人代替你去痛苦
你否定了 所有值得肯定和称颂的
只为证明你的无能为力 它并不孤独
有时候你像个傻子一样 与这个华丽的世界格格不入
有时候你那么厌恶你自己 不愿意再与他为伍
每个人面对一个同样的世界 为何你只能感受到不足
你甚至原谅自己 停止纠结那些曾犯过的无碍的错误
晚上闲下来之后,我想起自己的神船上有挺久以前装的 Vmware ,干脆拿来也这么整了一遭,给虚拟机分配了8个核心(这里我不清楚应该按照母机的物理核心4核来分配,还是应该算上了超线程技术的8核心来分配,姑且先分配了8核)。然后用Unixbench测了测性能,跑分结果如下:
---------------------------------------------------------------------Benchmark Run: Mon Oct 31 2016 10:04:18 - 10:32:328 CPUs in system; running 1 parallel copy of testsDhrystone 2 using register variables 36709669.1 lps (10.0 s, 7 samples)Double-Precision Whetstone 2696.6 MWIPS (9.9 s, 7 samples)Execl Throughput 2083.9 lps (30.0 s, 2 samples)File Copy 1024 bufsize 2000 maxblocks 1280512.5 KBps (30.0 s, 2 samples)File Copy 256 bufsize 500 maxblocks 361312.4 KBps (30.0 s, 2 samples)File Copy 4096 bufsize 8000 maxblocks 2454520.0 KBps (30.0 s, 2 samples)Pipe Throughput 2661895.1 lps (10.0 s, 7 samples)Pipe-based Context Switching 30884.3 lps (10.0 s, 7 samples)Process Creation 6813.4 lps (30.0 s, 2 samples)Shell Scripts (1 concurrent) 9503.3 lpm (60.0 s, 2 samples)Shell Scripts (8 concurrent) 3944.9 lpm (60.0 s, 2 samples)System Call Overhead 4198023.4 lps (10.0 s, 7 samples)System Benchmarks Index Values BASELINE RESULT INDEXDhrystone 2 using register variables 116700.0 36709669.1 3145.6Double-Precision Whetstone 55.0 2696.6 490.3Execl Throughput 43.0 2083.9 484.6File Copy 1024 bufsize 2000 maxblocks 3960.0 1280512.5 3233.6File Copy 256 bufsize 500 maxblocks 1655.0 361312.4 2183.2File Copy 4096 bufsize 8000 maxblocks 5800.0 2454520.0 4231.9Pipe Throughput 12440.0 2661895.1 2139.8Pipe-based Context Switching 4000.0 30884.3 77.2Process Creation 126.0 6813.4 540.7Shell Scripts (1 concurrent) 42.4 9503.3 2241.3Shell Scripts (8 concurrent) 6.0 3944.9 6574.8System Call Overhead 15000.0 4198023.4 2798.7 ========System Benchmarks Index Score 1444.1---------------------------------------------------------------------Benchmark Run: Mon Oct 31 2016 10:32:32 - 11:00:278 CPUs in system; running 8 parallel copies of testsDhrystone 2 using register variables 156209553.8 lps (10.0 s, 7 samples)Double-Precision Whetstone 18267.1 MWIPS (9.9 s, 7 samples)Execl Throughput 20028.6 lps (30.0 s, 2 samples)File Copy 1024 bufsize 2000 maxblocks 1118639.4 KBps (30.0 s, 2 samples)File Copy 256 bufsize 500 maxblocks 307208.7 KBps (30.0 s, 2 samples)File Copy 4096 bufsize 8000 maxblocks 2768817.2 KBps (30.0 s, 2 samples)Pipe Throughput 9990734.4 lps (10.0 s, 7 samples)Pipe-based Context Switching 1564748.1 lps (10.0 s, 7 samples)Process Creation 48640.6 lps (30.0 s, 2 samples)Shell Scripts (1 concurrent) 38393.3 lpm (60.0 s, 2 samples)Shell Scripts (8 concurrent) 4943.3 lpm (60.1 s, 2 samples)System Call Overhead 8248780.7 lps (10.0 s, 7 samples)System Benchmarks Index Values BASELINE RESULT INDEXDhrystone 2 using register variables 116700.0 156209553.8 13385.6Double-Precision Whetstone 55.0 18267.1 3321.3Execl Throughput 43.0 20028.6 4657.8File Copy 1024 bufsize 2000 maxblocks 3960.0 1118639.4 2824.8File Copy 256 bufsize 500 maxblocks 1655.0 307208.7 1856.2File Copy 4096 bufsize 8000 maxblocks 5800.0 2768817.2 4773.8Pipe Throughput 12440.0 9990734.4 8031.1Pipe-based Context Switching 4000.0 1564748.1 3911.9Process Creation 126.0 48640.6 3860.4Shell Scripts (1 concurrent) 42.4 38393.3 9055.0Shell Scripts (8 concurrent) 6.0 4943.3 8238.8System Call Overhead 15000.0 8248780.7 5499.2 ========System Benchmarks Index Score 5022.9======= Script description and score comparison completed! =======
这是调整为4Core的情况,看得出不管是整体性能还是单核性能相较于8Core都有所下降:
------------------------------------------------------------------------Benchmark Run: Tue Nov 01 2016 05:15:57 - 05:44:154 CPUs in system; running 1 parallel copy of testsDhrystone 2 using register variables 35798003.0 lps (10.0 s, 7 samples)Double-Precision Whetstone 2602.6 MWIPS (9.9 s, 7 samples)Execl Throughput 2520.9 lps (29.9 s, 2 samples)File Copy 1024 bufsize 2000 maxblocks 1156077.6 KBps (30.0 s, 2 samples)File Copy 256 bufsize 500 maxblocks 353214.5 KBps (30.0 s, 2 samples)File Copy 4096 bufsize 8000 maxblocks 2007012.8 KBps (30.0 s, 2 samples)Pipe Throughput 2588626.0 lps (10.0 s, 7 samples)Pipe-based Context Switching 29303.0 lps (10.0 s, 7 samples)Process Creation 6573.4 lps (30.0 s, 2 samples)Shell Scripts (1 concurrent) 9485.0 lpm (60.0 s, 2 samples)Shell Scripts (8 concurrent) 3283.0 lpm (60.0 s, 2 samples)System Call Overhead 4141853.2 lps (10.0 s, 7 samples)System Benchmarks Index Values BASELINE RESULT INDEXDhrystone 2 using register variables 116700.0 35798003.0 3067.5Double-Precision Whetstone 55.0 2602.6 473.2Execl Throughput 43.0 2520.9 586.3File Copy 1024 bufsize 2000 maxblocks 3960.0 1156077.6 2919.4File Copy 256 bufsize 500 maxblocks 1655.0 353214.5 2134.2File Copy 4096 bufsize 8000 maxblocks 5800.0 2007012.8 3460.4Pipe Throughput 12440.0 2588626.0 2080.9Pipe-based Context Switching 4000.0 29303.0 73.3Process Creation 126.0 6573.4 521.7Shell Scripts (1 concurrent) 42.4 9485.0 2237.0Shell Scripts (8 concurrent) 6.0 3283.0 5471.6System Call Overhead 15000.0 4141853.2 2761.2 ========System Benchmarks Index Score 1383.8------------------------------------------------------------------------Benchmark Run: Tue Nov 01 2016 05:44:15 - 06:12:334 CPUs in system; running 4 parallel copies of testsDhrystone 2 using register variables 125395491.8 lps (10.0 s, 7 samples)Double-Precision Whetstone 10174.8 MWIPS (10.0 s, 7 samples)Execl Throughput 16799.4 lps (30.0 s, 2 samples)File Copy 1024 bufsize 2000 maxblocks 1326749.6 KBps (30.0 s, 2 samples)File Copy 256 bufsize 500 maxblocks 369326.5 KBps (30.0 s, 2 samples)File Copy 4096 bufsize 8000 maxblocks 2735863.0 KBps (30.0 s, 2 samples)Pipe Throughput 9106903.3 lps (10.0 s, 7 samples)Pipe-based Context Switching 1328916.6 lps (10.0 s, 7 samples)Process Creation 41494.8 lps (30.0 s, 2 samples)Shell Scripts (1 concurrent) 31921.9 lpm (60.0 s, 2 samples)Shell Scripts (8 concurrent) 3878.5 lpm (60.0 s, 2 samples)System Call Overhead 9488815.2 lps (10.0 s, 7 samples)System Benchmarks Index Values BASELINE RESULT INDEXDhrystone 2 using register variables 116700.0 125395491.8 10745.1Double-Precision Whetstone 55.0 10174.8 1850.0Execl Throughput 43.0 16799.4 3906.8File Copy 1024 bufsize 2000 maxblocks 3960.0 1326749.6 3350.4File Copy 256 bufsize 500 maxblocks 1655.0 369326.5 2231.6File Copy 4096 bufsize 8000 maxblocks 5800.0 2735863.0 4717.0Pipe Throughput 12440.0 9106903.3 7320.7Pipe-based Context Switching 4000.0 1328916.6 3322.3Process Creation 126.0 41494.8 3293.2Shell Scripts (1 concurrent) 42.4 31921.9 7528.7Shell Scripts (8 concurrent) 6.0 3878.5 6464.2System Call Overhead 15000.0 9488815.2 6325.9 ========System Benchmarks Index Score 4492.2======= Script description and score comparison completed! =======]]>