Arch Linux 星球

November 11, 2019

中文社区新闻

关于新内核包和 mkinitcpio 挂钩的变动

我们的官方内核: linux, linux-lts, linux-zen 和 linux-hardened ,将不再直接把内核安装到 /boot 中去了。

安装和删除的步骤现在由 mkinitcpio 的挂钩(hook)和脚本(script)接管,因此无需手动干预升级过程。

此次变更的目的是想让内核包更独立(self-contained),并且让启动过程更灵活,同时保持向后兼容性。

目前只有 mkinitcpio 有挂钩负责处理安装删除内核,我们还没有为 dracut 提供类似的支持,不过今后 dracut 将会有类似的挂钩。

by farseerfc at November 11, 2019 03:23 AM

November 04, 2019

ヨイツの賢狼ホロ

一点点深入端到端加密 -- 公钥密码系统如何保护我们的信息?

来自 https://ssd.eff.org/en/module/deep-dive-end-end-encryption-how-do-public-key-encryption-systems-work

这个页面引用了 https://ssd.eff.org 的图片呐,汝可能需要根据情况调整汝浏览器 扩展的设置来查看它们。

如果使用得当,端到端加密可以保护汝的消息、文字甚至文件除了为汝期望的接收者以外 其他的家伙都看不到。它也能保证汝收到的消息确实来自汝所认识的那一位发件人(而不是 别的冒充他/她/它的谁),是呗~

过去的几年中,端到端加密工具如雨后春笋般在各个领域出现(而且达到了可用标准)。例如 像 Signal 这样支持文字消息、语音/视频通话和文件传送的 IM 就是其中的一种咯。这些工具让 监听者无法读取消息的内容(包括服务提供商自己)。

是不是觉得有些端到端加密的实现难以理解?在汝开始使用这些端到端加密工具以前,咱们推荐汝先花一点时间了解一下公钥密码学的基础。

这篇文章所讨论的公钥密码学正是端到端加密所依赖的基础。啥,汝想了解其它的加密类型?去翻翻咱们以前写(翻译)的 《当汝看到加密(encryption)时应该想到什么》 咯~

理解公钥密码学的基本原则(大概)能让汝更正确的使用那些工具,例如公钥加密可以做什么,不能做什么,和何时以及如何使用它。

太长不看版小结

  • 对称密码系统中,加密和解密使用相同的密钥。
  • 公钥密码系统中,参加信息交换的双方各自有自己的两对密钥,称作私钥和公钥。
  • 公钥可以公开,私钥需要安全保护。
  • 发件人用收件人的公钥加密消息,收件人用自己的私钥解密消息。
  • 发件人用自己的私钥签名消息,收件人用发件人的公钥验证消息。
  • 同样地,公钥密码系统保护的是消息的内容而不是元数据。

加密做什么?

当汝以加密的方式传输一些数据的时候:

  • 可以清楚的直接读取的消息(称作“明文”,例如“hello mum”)被加密的话会被混乱成轻易无法理解的形式(例如“OhsieW5ge+osh1aehah6”,称作“密文”)。
  • 这段看起来很像乱码的消息在网上传递。
  • 消息唯一的接收者可以通过某些方法把它还原成原来的形式(“hello mum”),这个过程称作“解密”。

对称加密:以一把密钥传递私密信息的故事

名字什么的最难起啦……以及平常的 Bob 和 Alice 呢?

汝不知道 Alice 和 Bob 是谁?

Julia 想写张小纸条告诉她的朋友 César “Meet me in the garden,”(在花园和我见面),不过她当然不想让她的同学也知道。

在多个人之间传递信息

(汝有没有在上课的时候给谁传过小纸条咧?)

Julia 的字条会在同学间传递好几次之后才能到 César 的手上。不排除中间有谁会在传递之前悄悄看上一眼, 或者自己抄一份然后记下 Julia 写字条的时间什么的。(汝在期望给汝传字条的同学不会多管闲事嘛?)

信息的传递过程可(ken)能(ding)会被偷窥

Julia 决定用密钥 “3” 来加密她们的消息,每个字母向后移动三位,例如 A->D, B->E 等等。 其实这简单的密钥加密以后的消息看起来像胡言乱语,别有用心的某人还是能够通过尝试所有的组合 的方式来“暴力破解”。换句话说,他们能为了得到解密的答案一直猜下去。

这种移位三个字母的方法其实是一种古老的加密方法,相传是罗马帝国的凯撒大帝发明的,所以也称作凯撒密码。 在这个例子中,字母移位的数量(3)被同时用于加密和解密,这被称作对称加密。

凯撒加密其实挺弱的(按现代的话来说,可以通过频率分析一类的手段破译出密钥(字母移位的数量))。 不过这么长时间过去了,在神奇的算法和电脑的帮助下,加密的密钥可以生成的越来越长,越来越难猜。 对称加密也用在越来越多的场景中。

(汝来想一想

对称加密

有没有问题?)


不过咧,对称加密还剩下一个问题。如果有人在 Julia 和 César 交换密钥的时候窃听,然后窃取密钥怎么办? (毕竟密钥没法再加密的传递出去……) 或者如果她们俩没法在现实见面呢?(例如离得相当远?)

于是让咱们跳过纷繁冗杂的学习过程,就当她们已经熟练掌握公钥加密了吧(大嘘)。 窃听者不太可能得到她俩解密消息的密钥——因为她们根本就不用分享呀。 在公钥加密的过程中,加密和解密的密钥是不同的。

公钥密码:密钥之双城记

拿上汝手边的放大镜(啥?),让咱们离问题更近一些:在有人窃听对话的前提下, 如何只把对称解密的密钥发送给接收者咧,特别是在双方的物理距离非常远的话?

公钥密码学(有时候汝也会看到非对称加密之类的说法,这俩是一样的)解决了这个问题。 它允许每个人在对话中创建两个密钥——通常称作公钥和私钥。两把密钥相互关联,通常是 具有某些特别的数学性质的特别大的数字。如果汝用谁的公钥编码了一段消息,那么他们就 可以用他们的私钥解码。

Julia 和 César 现在要用公钥密码发送加密的消息,于是之前传小纸条的同学们就理所当然的被 一台台电脑取代了呗。它们可能是她们俩之间的电脑,例如 Wi-Fi 接入点,ISP,她们所使用的邮箱的 服务器等等。自然它们也能复制双方传递的消息的内容和记录消息传递的时间。

在互联网上传递信息时,会经过多个中继

虽然她们不介意中间有人会看到她们的消息,不过自然的还是不想让别人看到消息的内容。

首先,Julia 需要 César 的公钥,于是 César 把她的公钥寄给了 Julia (例如通过邮件)。她并不 介意通过不安全的通道传递公钥,因为公钥本来就是她可以自由分享的东西。

需要注意的是,公钥和现实生活中的钥匙还有一些区别的。因为 César 可以把公钥拆分成几部分,然后通过不同的通道 发送出去。

César 发送公钥给 Julia

有了公钥以后,Julia 就能给她发送加密的信息了:

“Meet me in the garden.”

Julia 发出了只给 César 加密的消息。

私钥可以解密由同一人的公钥加密的消息

虽然她们都可以理解这条消息,剩下的人都认为消息的内容是乱码, 不过中间的人(或者电脑)还是能看到元数据,例如主题、时间、发件人和收件人。

元数据在信息的传递过程中不会被加密

因为消息是用 César 的公钥加密的,因此只有 César 和 Julia(因为是发件人)能阅读这条消息。

César 用她的私钥解密消息:

私钥可以解密由同一人的公钥加密的消息

简单的概括:

  • 公钥密码可以让汝(和其他人)在开放和不安全的通道中传递公钥。
  • 有了朋友的公钥以后,汝就可以给他们发送加密的信息。
  • 汝的私钥用来解密发送给汝的加密的信息。
  • 中间人——像是服务和网络提供商,在消息传递的过程中可以看到一些元数据,例如谁写了 这些消息,发送给谁,接收或者发送的时间和消息的主题等等。

(汝觉得现在可以高枕无忧了?)

还有一件事……如何识别假冒?

在上面的例子中,中间人能够看到整个过程中的元数据。

所以让咱们来耍点坏心眼,某个中间人想知道她们在谈论什么,因此在监听她们。

坏人能够用一些手段让 Julia 得到假的公钥。Julia 没注意到这不是 César 的公钥,还是用它加密了要发给 César 的消息。

随后坏人就得到了本该加密给 César 的消息,它可以看到消息的原始内容,然后再发送给 César 。

心怀恶意的中间人可以假冒某人发送消息

甚至可以篡改消息的内容:

心怀恶意的中间人可以假冒某人发送篡改的消息

于是 Julia 和 César 如约在花园见面,没想到这里已经有人守候多时了……

心怀恶意的中间人

这就是所谓的“中间人攻击”啦,其实攻击的家伙也不一定是人……幸运的是,公钥密码学有防御这种攻击的手段。

公钥密码学可以让汝通过一种称作“指纹验证”的方式来确认某把密钥确实属于汝认识的某人,(“指纹” 指的是公钥通过某种摘要算法计算出的一串字母,通常比公钥短的多) 这种过程最好在现实生活中完成。如果汝可以和谁面对面的话,汝可以检查双方拥有的公钥的指纹的每一个字母 是否一致。虽然一个一个的看很枯燥,但为了保证汝手上的某把私钥确实属于汝认识的某人的话,就稍微忍受一下吧……

其它的端到端加密应用也拥有类似的指纹验证机制,虽然可能方法各不相同。有些方式比较传统,汝要小心比较双方屏幕上显示的内容是否一致。 有的方法比较“新鲜”,例如用汝手上的设备扫描对方显示的二维码来“验证”某个设备。

支持扫描二维码验证的端到端加密应用

如果汝没法和对方见面的话( 担心有去无回么…… ),汝可以在其它已知安全的地方交换指纹,例如端到端加密的聊天软件,或者一个 HTTPS 网站。

通过其它方式传递指纹A 通过其它方式传递指纹B

总结一下:

  • 中间人攻击是指有人在某个双方之间拦截传递的消息,攻击者可以修改消息、或是只是简单地监听。
  • 公钥密码让汝通过验证发送者和接收者的身份来防御中间人攻击,这种方法被称作“指纹验证”。
  • 汝(或者汝的朋友)的公钥也包含一些被称作“指纹”的信息,汝可以通过指纹验证公钥持有人的身份。
  • 私钥用于解密发给汝的消息,也用来以汝的名义签名消息。

签名时代

公钥密码让汝不用冒险把解密密钥发送给汝私密消息的接收者,因为他们已经拥有了,就是他们的私钥。 因为公钥只用来加密而不能解密,因此汝(和汝消息的接收者)可以把公钥分享出去,汝发送私密信息所需要 的也只有接收者的公钥而已。

不过只有这样么……咱们已经知道了用特定公钥加密的消息只有用公钥对应的私钥解密。其实反过来也是, 用特定私钥加密的消息只能用私钥对应的公钥来解密。

啥,这有啥用?汝用汝自己的私钥加密一段消息然后让随便什么人用汝的公钥解密来看嘛…… 别那么着急嘛,再想想,例如汝写了一句话,然后用汝的私钥加密。大家都能解密汝的消息, 但只有持有汝私钥的人能写出这条消息。如果汝能小心翼翼的保护汝的私钥的话,多半只有汝 自己有汝自己的私钥,也就只有汝能发出这条消息了是呗~

通过用汝的私钥加密消息,汝确保了这条消息只会是汝所写的,是不是感觉哪里眼熟?没错,就和 实际生活中汝在某些地方签下汝自己的名字一样,汝对汝的数字消息完成了同样的操作。

签名同时也能防止篡改。毕竟大多数情况下,其他人不能用汝的私钥重新签名是吧…… 因此,已签名的消息可确保它来自某个特定来源,并且不会在传输过程中被搞得一团糟。

复习:关于公钥加密

公钥密码让汝可以把消息安全的发给知道对方公钥的人咯。

如果有人知道了汝的公钥:

  • 他们可以发送只有用汝的私钥解密的私密信息。
  • 汝可以用汝的私钥签名消息,而他们可以用公钥验证签名有效。

如果汝知道其他人的公钥:

  • 汝可以解密来自他/她/它的消息,而且可以验证消息确实来自那一位。

所以很明显啦,汝(或其他人)的公钥传播的越广,这个加密方式就越有用处是呗。既然 公钥可以分享,汝也可以以现实中的什么东西类比一下啦,例如通讯录或者电话黄页什么的: 它是公开的,人们知道哪里可以找到,汝也能广泛的分享它。

至于私钥呢,汝还是拿现实中的什么东西类比一下好了,例如开门或者各种锁的钥匙。汝的 私钥用来加密和解密消息,所以务必要像对待手上真正的钥匙一样对待它。

为啥汝的私钥明显的(如此)重要?如果汝丢了钥匙,汝就有可能打不开某处。公钥加密中私钥 也是如此,如果汝弄丢了私钥,汝就没法解密发送给汝的信息了。如果谁拿到了汝的钥匙,他就能 以汝的名义打开某些地方。如果其他人拿到了汝的私钥(例如物理接触到汝的电脑,通过恶意软件, 或者只是因为汝像个大笨驴一样把汝的私钥发了出来等等),他就能读取汝加密的信息,或者冒充汝 做些什么。

也曾经有听说过某些政府试图窃取某些人的私钥的经历(像是强行收缴电脑啊,钓鱼攻击或者想方设法的 安装恶意软件等等)。这当然是对公钥加密安全性的损害。 既然汝大多数时候遇不到那么交迫的情况,那咱们来换个栗子:有扒手在汝停下来休息的时候偷走了汝的 钥匙,然后去配了一把新的,把原来的钥匙悄悄地放回汝的口袋里。汝可能觉得什么都没发生,然后发 现有人光顾了汝的家门……

所以又到了老生常谈的威胁模型时间了:估算汝可能遇到的风险,并设计相应的应对措施。 例如既然汝担心谁觊觎汝的私钥的话,汝大概就不会使用某些浏览器中的端到端加密方案了吧,汝也会想方设法 确保汝的私钥只留在汝自己的电脑上而不是别处(例如其他人的服务器或所谓的云端)。

公钥密码学总结和典型实例: PGP

虽然咱们是分开演示的对称加密和公钥机密,不过公钥加密的过程中也有机会用到对称加密啦。 例如是记得操作中,公钥加密加密的是解密对称加密的消息的密钥。PGP 就是把对称加密和公钥加密 结合起来的典型例子。

(汝有时会看到像是 openPGP 或者 GnuPG 一类的家伙,是因为 PGP 本身是私有的啦,于是不少人开发了 类似的软件,它们都支持 openPGP 规范。而其中最常用的就是 GNU 开发的 GnuPG 咯……)

所以那些密钥到底是什么,它们是怎么结合在一起的?

公钥密码学基于有两把密钥这一前提,一个负责加密,一个负责解密。 基本上,汝可以把其中一把密钥在互联网这样的不安全通道上传递,这把称作公钥。 汝可以把公钥公开到随便哪里去而不会影响到加密信息的安全性。

密钥对的组成

(公钥和私钥构成一对密钥,有时也把它俩一起称作一个密钥对)

既然公钥可以分享,汝也可以以现实中的什么东西类比一下啦,例如通讯录或者电话黄页什么的: 它是公开的,人们知道哪里可以找到,汝也能广泛的分享它。

至于私钥呢,汝还是拿现实中的什么东西类比一下好了,例如开门或者各种锁的钥匙。汝的 私钥用来加密和解密消息,所以务必要像对待手上真正的钥匙一样对待它。

让咱们来看一看一种经常在公钥密码中用于生成密钥的算法,叫做 RSA (以发明这种算法的三位科学家 罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman) 的姓氏命名)。

公钥和私钥实际上是两组大数

(私钥由两组特别大的质数组成)

公钥和私钥实际上是两组大数_

(公钥是私钥的两组数的乘积,因为私钥是两组特别大的质数,所以在相当长的一段时间内很难猜出来)

公钥和私钥同生共死(?只是一起生成啦……),而且都依赖于特别大的秘密质数。私钥由两组特别大的质数组成, 而公钥就是它们的乘积。以公钥推算出私钥的两个质数的尝试十分困难。

为啥咧?因为现在还没有一个又快又稳定的分解质因数的算法啦……随着时间的推进,现代的加密套件也允许用户生成 更大更难猜的质数作为密钥。

(以及随着时间推进,更现代的加密算法也被发明出来,像是椭圆曲线加密算法(ECC)和 ElGamal 等等。)

这就是公钥加密的强大之处了,参加加密信息交换的双方在不安全的通道中交换的信息只有双方的公钥啦! 因为不需要交换私钥,所以(理想的情况下)私钥自然不会泄漏。

铭记:需要双方的公钥让公钥密码工作。

换种说法:公钥和私钥一起生成,像阴阳一样交织在一起。

公钥和私钥阴阳调和(大雾)

公钥可以搜索和分享,汝可以把它随便发送到哪里去。如果汝不介意暴露邮件地址的话,汝可以把它放在社交媒体 或是汝自己的网站上。

私钥需要安全的保护起来。因为越多的话保持安全和秘密就越困难,所以汝肯定只想留着一把(而且不要搞丢), 而不是把它分享出去或者弄得复件到处都是。(?)

PGP 如何工作

所以说了那么多,PGP 到底是如何工作的呢?假设汝要向 Aarav 发送一些私密消息:

  • Aarav 有一对密钥,像一个优秀的公钥密码用户一样,他把他的公钥放在了他有 HTTPS 的网站上。
  • 汝下载了他的公钥,用它加密了一些消息发送给他。
  • 因为只有他有他自己的私钥,所以只有他能解密发送给他的消息。

PGP(Pretty Good Privacy,优良保密协议)就是聚焦于创建和使用公钥和私钥这些细节的结合。 汝可以创建一对密钥,用密码保护私钥,以及用私钥和公钥加密和签名文本。

如果汝一定要总结一下的话:用足够强的密码短语保护汝的私钥,而且放在安全的地方。

元数据:公钥加密不是银弹

公钥加密的一切(秘密,一致性,防止篡改)都是在保护消息的内容。但这绝对不是汝唯一在 隐私上需要关注的问题,就像前面所说的一样,关于消息的信息(有时被称作“元数据”) 也可能暴露消息的内容。

某些情况下,仅仅是交换加密的信息也有可能让汝遇到危险。例如某些政权中的持不同政见者, 或者仅仅是拒绝解密消息。

伪装汝在和某人交流的事实也许会相当困难。在前面的 PGP 中,一种可行的方法是双方使用 通过匿名网络(例如 Tor )访问的匿名邮箱。在这种情况下, PGP 还是十分有用,无论是 在其他人间保护双方的私密消息,还是证明消息的作者和传递过程没被篡改。

说了那么多,不妨亲手试试看一些端到端加密的应用吧, 例如 可用于 iOS 和 Android 的 Signal

by ホロ at November 04, 2019 04:00 PM

October 28, 2019

百合仙子

Poker II 键盘调教记

本文来自依云's Blog,转载请注明。

Poker II 是一款可编程的61键机械键盘,是最小的那种,没有 F1-F12 那一行键。跟 HHKB 有些像。这是我第一次使用这么小的键盘,以前都用的84键的。选择它的原因是,更加小巧,没有旁边的光标移动键,使得打字的时候几乎不需要把手挪来挪去的。编程功能似乎也挺有意思的。我手上这把是红轴的,感觉手感也挺好,虽然没有了青轴那清脆的叫声。照片我就不放啦,网上能搜到的。

研究完说明书,发现它的编程功能并没有想像中的那么好。主要缺点如下:

  • 非默认层会一直亮着个灯,而默认层又不能编程。
  • 只能对非组合键,以及没有预设功能的 Fn 组合键编程。所以额外的 Pn 键很残废。
  • 编程结果无法导入导出。所以哪天不小心重置了键盘,这将导致重复而无趣的劳动。

不过也能凑合着用了。最后我的设置是这样的:

不再使用 xmodmap 来交换 Esc 和 Caps Lock。笔记本键盘改用 hwdb,Poker II 使用内建编程功能。于是我可以在别处(比如手机、BIOS、Win10)使用这把键盘而不感觉别扭与小心翼翼。xmodmap 依旧用来把右 Alt 映射为 Multi(Compose)键,用来输入特殊字符,因为我不知道这个键怎么用 hwdb 映射。哦还要在 /etc/vconsole.conf 里去掉之前给 tty 虚拟终端设置的交换 Caps Lock 和 Esc 的 keymap。

红、绿、蓝三个编程层。红层没什么用,暂时留作测试。绿层作为打字用布局,方向键使用 Fn 组合键完成,Esc 位放 `~。蓝层作为看视频的布局,方向键使用右下角的四个键完成,无处安放的 Pn 暂时放 Esc 位。其余共有映射为:

  • Caps Lock 位放 Esc。
  • 交换 Fn 和右 Alt 键。这样 Fn 键好按一点,反正右 Alt 很少用到。
  • 映射两组 Ctrl-PgUp/PgDn 分别到 Fn-Q/E 和 Fn-O/L。这快捷键非常常用,可以在火狐和 Telegram 切换标签页。

Poker II 编程时有个「编程延迟」设置,我一直没搞明白它要怎么用,也导致我的映射一直有问题,按一次出一到两次。直到后来找到这篇文章,才明白它不是个设置,而是个事件,按下它即导致出键码时延迟指定的时间。

另外我没能在 Poker II 上按出 SysRq 来,不知道是怎么回事。

hwdb 的配置方法来自 ArchWiki Map scancodes to keycodes 页面。我的配置如下:

evdev:atkbd:dmi:*
 KEYBOARD_KEY_01=capslock   # esc
 KEYBOARD_KEY_3a=esc        # capslock
 KEYBOARD_KEY_b7=rightmeta  # prtsc
 KEYBOARD_KEY_c5=print      # pause (Fn+P)

把配置放到 /etc/udev/hwdb.d 下的 .hwdb 后缀文件中,然后执行

sudo systemd-hwdb update
sudo udevadm trigger

就好了。

用了几天了。除了 LED 灯老亮着有些刺眼外,一切安好。也终于把 Caps Lock 的设置方法搬到更底层了。

by 依云 at October 28, 2019 09:26 AM

October 23, 2019

ヨイツの賢狼ホロ

Arch Linux 的衍生发行版们

有句不知道谁说的话说得好,“一千名读者中有一千个哈姆雷特”。放在 GNU/Linux 发行版上同样 也如此。有一群人对某个发行版的原则和理念不能完全认同,于是创造出了一个衍生发行版,或是 从零开始创建一个新的发行版,大概就是这个样子。

TL;DR

  • Arch Linux 也有很多衍生发行版,所诞生的原因和专注的方向也各有不同。
  • Arch Linux 官方 不为 Arch Linux 的衍生发行版提供支持。
  • 最好首先去衍生发行版各自的主要社区寻求支持。
  • 如果万不得已只能在 Arch Linux 的社区(例如群组和非官方论坛)询问的话, 请一定记得告诉大家自己用的是什么发行版。

所以先来回顾一下传说中(?)的 "The Arch Way" ?

完整内容还请参阅 ArchWiki: https://wiki.archlinux.org/index.php/Arch_Linux
  • Arch Linux 将简洁定义为:避免任何不必要的添加、修改和复杂增加。 它提供的软件都来自原始开发者(上游),仅进行和发行版(下游)相关的最小修改。
  • Arch尽全力保持软件处于最新的稳定版本,只要不出现系统软件包破损, 都尽量用最新版本。Arch采用滚动升级策略,安装之后可以持续升级。
  • Arch 注重实用性,避免意识形态之争。最终的设计决策都是由开发者的共识决定。 开发者依赖基于事实的技术分析和讨论,避免政治因素,不会被流行观点左右。
  • 许多 Linux 发行版都试图变得更“用户友好”,Arch Linux 则一直是,永远会是“以用户为中心”。 此发行版是为了满足贡献者的需求,而不是为了吸引尽可能多的用户。 Arch 适用于乐于自己动手的用户,他们愿意花时间阅读文档,解决自己的问题。

汝如果有下面这些情况的若干种,可能就没那么想用 Arch Linux 了呗:

  • 没有能力、时间、愿望去打理这样一个高度可定制的 GNU/Linux 发行版。
  • 需要非x86_64平台支持。
  • 汝是狂热的自由软件爱好者,自然只希望发行版提供 GNU 定义的自由软件。( 这不清真……
  • 汝认为好的操作系统应当是已经配置好的:安装介质应默认包含一套完整的应用软件、桌面环境——达到“开箱即用”。
  • 汝不需要使用滚动升级的发行版。
  • 汝对目前使用的操作系统感到满意,自然也没有太大的动力去换。

于是衍生发行版们登场了

有些人可能像汝一样,不能完全接受 Arch 的原则,于是就在 Arch 的基础上做成了别的发行版:

  • 安装过程太难?于是有 AnarchyLinux 这样的发行版提供一个简化的安装器。
  • 想要预装桌面环境? 于是有 Chakra 这样的为某个桌面环境特化的发行版。
  • 需要非x86_64平台支持? 于是有 Arch Linux 32Arch Linux ARM 这样的发行版把 Arch Linux 的理念 带到其它架构。
  • 只想用自由软件? 于是有 Parabola 这样专注自由的发行版。 (还获得了 GNU 的自由 GNU/Linux 发行版认证)
  • 对 Systemd 不满? 于是有 Artix 这样的发行版提供了 Systemd 以外 的 init 。
  • 不想那么新?于是有 ManjaroHyperbola ,致力于提供稍微稳定些的软件。
  • 想在非 GNU/Linux 上用简单的 pacman ?于是有 ArchHurd , MSYS2ArchMac , 努力的在其它系统上帮汝找到一点 pacman 的感觉(?)。

ArchWiki 上有一份比较完整的 Arch 衍生发行版列表: https://wiki.archlinux.org/index.php/Arch-based_distributions

为啥 Arch Linux 官方不为衍生发行版提供支持?

Arch 衍生发行版通常使用不一样的软件包、版本号、软件仓库,且有着部分难以察觉的定制。在 Arch 论坛对支持这些项目极其艰难。 社区技术支持只限于 Arch Linux 发行版和 Arch 用户软件仓库。所有关于衍生发行版或其他操作系统的帖子都会被关闭。

ArchWiki:Code of Conduct

这一句大概就够了。不过只是官方论坛/IRC/Wiki/Bug Tracker 不支持衍生发行版而已啦,其他地方似乎没有那么严厉的样子……

然而实际上支持衍生发行版有多困难?

“…Manjaro 的存在本身我觉得挺好的,毕竟是继承了 Arch 的包管理器,也是对 Arch 的支持了。 然而用户总是把它当 Arch 跑来论坛和群里问问题,有时候还不说明白自己用的是 Manjaro,很烦。…”

—来自某个 Arch Linux 群组的不愿意透露姓名的某人(?)

“客观而论,Manjaro 是很成功的发行版,但是请不要将它和 Arch Linux 弄混。 如果你喜欢的是简便的配置和滚动更新, 那么选择 Manjaro 是很合理的;但如果你喜欢的是简洁、自由和尽可能最新, 那请使用 Arch Linux,而不要安装一个 Manjaro 并以 Arch 用户自居。”

—来自某个 Arch Linux 群组的回忆中的某人(?)

(其实汝把里面的 Manjaro 换成别的 Arch Linux 衍生发行版也差不多,并不是指摘 Manjaro 的意思。 不过对 Manjaro 感到不满的 Arch Linux 用户也是存在的,例如 https://rentry.co/manjaro-controversies

其实最大的问题只有一个(?),就是大家在某个群组里就会或多或少有些隐含的预设。 例如在 Arch Linux 群组里就会默认大家都在用 Arch Linux,遇到问题的时候就会在这个 假设下进行解决。于是……

  • 如果汝用的是某个衍生发行版
  • 又没有提前说明自己用的不是 Arch Linux
  • 又赶上汝遇到的问题正好就因为某个汝正在使用的衍生发行版的定制的话……

于是汝就只能指望辛辛苦苦帮汝解决问题最后发现是衍生发行版的问题的那位不是咱了(?)……

然而要避免这种尴尬的情况发生的话,除了在一开始告诉大家自己使用的 GNU/Linux 发行版的话, 提前找到汝使用的 GNU/Linux 发行版用户主要集合的群组/论坛等场所然后在那里提问也是一种可行之策,是呗。

说了那么多,你用的又是啥呢?

咱啊…… Arch Linux 和 Parabola GNU/Linux Libre 都在用呀~

by ホロ at October 23, 2019 04:00 PM

October 16, 2019

中文社区新闻

要求更新到比较新的 libarchive

压缩算法 zstd 带来了更快的压缩解压时间,同时保持接近 xz 的压缩率。通过它我们能让 pacman 能更快地安装包,并且不会带来什么坏处。

即将到来的 pacman 5.2 更新将允许打包工具使用 zstd 压缩软件包。要安装这些包需要有 zstd 支持的 libarchive ,相关更新已经在 2018 年 9 月左右进入软件仓库。为了允许我们开始发布 zstd 压缩的软件包,我们要求所有用户更新到至少 libarchive 3.3.3-1 或以后的版本。该版本发布至今已经有一年了,我们期待你已经更新到了,如果还没更新那请尽快。

如果你维护自己的脚本,请确保它们不依赖硬编码的文件扩展名。用 zstd 的软件包将会使用 .pkg.tar.zst 的扩展名。

by farseerfc at October 16, 2019 01:11 PM

October 08, 2019

ヨイツの賢狼ホロ

给 GNU/Linux 萌新的 Arch Linux 安装指南 rev.B

给会用点 Windows 的彻头彻尾的 GNU/Linux 新手的 Arch Linux 安装指南 😣

为啥要搞这个?

因为 ArchWiki 上的 Beginner Guide 已经和 Installation Guide 合成一个啦😂, 然后有小白开始抱怨看不懂啦(误 (╯・∧・)╯ ┻━┻

其实咱最早看的也是 Beginner Guide ……

算了概念用到时再解释 😂

我是一个彻头彻尾的Linux新手,我应该用Arch吗?

如果你是新手,要使用 Arch 就必须愿意花时间学习新系统,接受 Arch 是一个 DIY 的系统,每个用户都是自己系统的组建者。

在开始问任何问题之前,自己先通过Google、Wiki或者论坛进行搜索。我们为你创建了这些资源并让你可以随时访问,上千志愿者为你提供了大量的信息资源。

推荐阅读: Arch terminology#RTFM

首先说点废话

  • Arch 这种经常更新内核的还是适合上实体机……

  • 看得懂英语的话最好还是看官方的 Installation Guide 吧(人家更新的比咱要勤快):

    https://wiki.archlinux.org/index.php/Installation_guide

  • 这里的目标是装好最简单的一个带有桌面的 Arch Linux ,对于部分特殊需求(例如无 GUI 的环境), 请直接参阅上方官方 Wiki 的安装指南装出基本系统,然后再参阅其他的文章呗~

备份……

万一手抖格错了盘别抱怨 GNU/Linux ……

但如果汝有备份的话,是不是已经下定决心把整个硬盘格式化掉了?(雾)

下载 ISO

https://www.archlinux.org/download/

BT 种子和磁力链接在上面,直接下载的话往下拉,找 China 下面的镜像网站挑一个下载就好。 (っ╹ ◡ ╹ )っ

如果是用 HTTP/HTTPS 下载的话,下载完以后最好验证一下文件的散列值来确定文件下载完了 (╯艹︿艹)╯ ┻━┻

Windows 上这样的工具有很多呐,例如 HashTab 和 FCIV。

但是如果汝正好没有这些工具或者从来没听说过散列(或者另一种译名叫哈希)的说法的话,可以用 Windows PowerShell 来完成:

# 例如获得某一个文件的 md5 散列值,用汝下载的 ISO 的路径换掉 <filepath>
Get-FileHash <filepath> -Algorithm MD5

# 尽管 md5 和 sha1 已经被认为是不安全的散列算法了(容易发生两个文件不同但散列值相同的情况,
也被称作散列碰撞”,然而 Arch Linux 的官方网站上还是只有这两种 😂, 先凑合着用吧……

至于下面那个 PGP 签名,又是个大坑,先鸽了(咕咕咕……)

确定启动类型

  • 首先打开设置 ( Windows 8/8.1 叫做 "电脑设置"),然后通过 "更新和恢复" -> "恢复" -> "高级启动" 重启电脑.

    Windows 10 的话,按住 Shift 再点击电源按钮里的重启也行……

如果是 UEFI 启动的话,大概是这个样子:

UEFI 系统启动之后大概像这样

没错就是有个 "使用设备" 的选项 😂

  • 或者同时按下键盘上的 Windows 徽标键(就是有 Windows 标志那个) 和 R 键,会打开“运行” 对话框。
“运行”对话框

在里面输入 msinfo32 然后回车(按 Enter 键)确认,打开”系统信息”应用。

“系统信息”窗口

看“BIOS模式”里是不是 UEFI 😂😂,还有下面那个 “安全启动状态”是不是“以关闭”(咱这台电脑的 UEFI 太旧所以显示的是不支持)

如果安全启动是打开的还需要自己进 UEFI 固件设置里手动关闭 😂

具体怎么关因为每种电脑的方法不一样于是汝要自己 STFW (Search the f**king Web,搜索一下) 了😂
  • 再或者打开磁盘管理(Windows 8 以后的系统可以通过按下 Windows + X 的菜单里找到 “磁盘管理”)
磁盘管理在这~

嗯,大概就是这样子的呗 (虽然具体的磁盘分区可能和咱的不一样)

大概长这样~

看汝的硬盘上有没有一个 EFI 系统分区 😂😂😂


还是搞不懂的下面也不用看了,准备下最后的晚餐吧 😋 (误

在硬盘上准备一块空闲空间

不然要把 Arch Linux 装到哪里去呐?

这里拿来演示的是 Windows 7 以后都自带的 “磁盘管理” 程序,应该能解决大多数问题 _(:з」∠)_

  • Windows 8 以后的系统可以通过按下 Windows + X 的菜单里找到 “磁盘管理”
磁盘管理在这~
  • 嗯,大概就是这样子的呗 (虽然具体的磁盘分区可能和咱的不一样)
大概长这样~
  • 汝哪个硬盘分区比较空闲? 右键点击它,有一个"压缩卷的选项"
”压缩卷“ 在这~
  • 输入压缩的大小 _(:з」∠)_
多少
  • 然后就多了一块未分配的空间 😂
多了一块未分配的空间

如果汝的硬盘分区有些刁钻而磁盘管理没法解决的话,AOMEI 家的分区助手不错, 这是官方网站 , 这是分区教程

制作启动盘

但前提是汝的电脑能从 U 盘启动 😂 (不过最近几年生产的电脑都应该可以了吧……

Windows 下咱比较推荐一个叫 rufus 的软件,官方网站在这

下载完以后双击运行,需要管理员权限,记得看有没有数字签名。(有数字签名时用户账户控制的对话框是蓝色的)

Rufus 自带多国语言(当然也包括中文啦),如果汝系统语言不是中文的话,点击那个地球图标就可以修改语言了啦~

选择语言

然后戳有点像光盘的按钮选择刚下载好的 ISO 镜像

选择映像

然后选择一种启动类型,UEFI 就选最后一个,不是的话就选第一个。

选择启动类型

写入方式选推荐的就好 (´_`)

选择写入方式

确认(要知道汝按下确认以后就没有回头路了,所以记得提前备份 U 盘上的资料 😂)

确认

然后坐等完成,完成以后汝的 U 盘卷标应该是 "ARCH_201610" 这样的 (后面四位年份和两位月份),不要改成别的,万一不对记得照 ISO 改回来 😂😂

准备启动

重启电脑,然后让电脑从 U 盘启动。

具体怎么搞还是要看电脑的硬件啦 😂

大多数的电脑都有一个在开机时按下一个按键来选择从哪里启动的选项(例如 Dell 和 ThinkPad 是 F12)。 UEFI 的话, 刚才提到的那个“使用设备” 的选项也可以。

还是去翻一翻汝自己的电脑生产商的说明书更快一点 ……

  • MBR 成功启动以后像这样
MBR

选第一项。😂 (除了 CPU 不支持的都应该用x86_64 😋)

后来 Arch Linux 不再支持 i686 啦,所以这里应该只会看见 x86_64 那一项(但是咱懒得换图片啦……)
  • UEFI 成功启动以后像这样
UEFI

还是选第一项。😂

然后等待一会以后会出现……

root@archiso ~ #

这就表示已经启动完毕啦 ~(>_<~)

root是用戶名,前面那個數字是上一個命令的exit status啦,如果正常結束的命令exit status是0,就不會顯示出來,你有 1 2 127 這種都是某種東西報錯了.

----现任 Arch Linux TU 之一的 farseerfchttps://www.zhihu.com/question/45329752/answer/98733823 中写到……

联网

因为 ArchISO 就是个重启就没了的 Live 环境,安装时需要的软件包都要另外下载。

首先当然是联网啦,如果是自动获取 IP 地址的有线网络,那么应该啥也不用做,ping 一下试试?

root@archiso ~ # ping archlinux.org
# 汝应该会看到像这样的东西 ……
PING archlinux.org (138.201.81.199) 56(84) bytes of data.
64 bytes from apollo.archlinux.org (138.201.81.199): icmp_seq=1 ttl=49 time=361 ms
……

(把电脑用网线接到家里的路由器上就有相同的效果)

如果没网的话…… 😂


  • 先用 ip link 确定一下网卡
root@archiso ~ # ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp4s0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN mode DEFAULT group default qlen 1000
    link/ether c8:9c:dc:a8:ab:c3 brd ff:ff:ff:ff:ff:ff
3: wlp0s29u1u1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DORMANT group default qlen 1000
    link/ether 44:94:fc:0f:63:b9 brd ff:ff:ff:ff:ff:ff

这个例子里,lo 是本地环回不用管它,enp 开头的是有线网卡,wlp 开头的是无线网卡。

如果汝明明有无线网卡却没识别的话,有可能汝是某无线网卡厂商受害者😂😂

这时可以:

  • 有 Android 手机的话,手机连 WiFi ,然后用“USB 网络共享”共享给电脑。
  • 找个 USB 无线网卡插上 😂
  • 连有线😂😂
  • 如果有无线网卡的话,试试连接到 WiFi ……

    如果汝的 WiFi 是用 WPA2-Enterpise 验证的(输入用户名和密码那种),还是放弃吧…… wifi-menu 现在还不支持这个(

** 输入 wifi-menu ,等一下会看到找到的 WiFi 网络的列表

WiFi 列表

** 选择一个网络,保存网络配置文件

保存配置文件

** 如果有密码的话,输入密码

WiFi 密码

** 然后按 Enter 确认,连到 WiFi 的话会返回 Shell。

谁叫 Arch 连不上网的话都装不了 😂

另外,如果汝连接的网络需要网页登录(Captive Portal),可以用 elinks 碰碰运气 😂

# 用汝的门户的 URL 替换 <your_captive_portal_url>
# 如果不知道的话,随便访问一个 HTTP 网站试试,应该就会被重定向到 Portal 了
root@archiso ~ # elinks http://<your_captive_portal_url>

时间同步

timedatectl set-ntp true 保证时间同步 。

root@archiso ~ # timedatectl set-ntp true
root@archiso ~ # timedatectl status
    Local time: Fri 2016-10-28 17:39:42 UTC
    Universal time: Fri 2016-10-28 17:39:42 UTC
    RTC time: Fri 2016-10-28 17:39:42
    Time zone: UTC (UTC, +0000)
Network time on: yes
NTP synchronized: no
RTC in local TZ: no

因为有不少操作需要准确的时间呐,例如 HTTPS 和 GnuPG 都需要准确的时间来验证证书的有效性。

但是如果因为各种原因没法同步的话,那就只好手动设置咯~

# timectl set-time "yyyy-MM-dd hh:mm:ss"
root@archiso ~ # timectl set-time "2016-10-28 17:39:42"

准备硬盘空间

这里用 cgdisk (UEFI)/ cfdisk (MBR) 来给硬盘分区。

首先输入 lsblk 看看汝的硬盘是哪个设备:

root@archiso ~ # lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda      8:0    0 463.9G  0 disk
├─sda1   8:1    0   512M  0 part
├─sda2   8:2    0    16M  0 part
├─sda3   8:3    0 103.4G  0 part
└─sda4   8:4    0 253.4G  0 part
sdb      8:16   1   7.5G  0 disk
└─sdb1   8:17   1   7.5G  0 part /run/archiso/bootmnt
sr0     11:0    1  1024M  0 rom
loop0    7:0    0 346.1M  1 loop /run/archiso/sfs/airootfs

如果那是一块新硬盘或者已经清空的硬盘的话,汝大概看不到 /dev/sda1 一类的分区。


如果汝没看到 /dev/sda 却看到了一些其它的东西的话:

  • /dev/nvme0n1 一类的:表示汝的电脑上有一块 NVMe SSD (发出了羡慕的目光(咳咳))
  • /dev/mmcblk0 一类的:表示汝的电脑上有 eMMC 存储(例如是早期的 Windows 8 平板电脑啥的)

这种时候的话可能汝 ArchISO 的 U 盘就跑到 sda 去了,在下面的操作时记得注意一下。

比如咱这里 sda 是咱的硬盘,于是运行 cgdisk 时加上 /dev/sda 这个参数:

/dev 是一个虚拟目录(也就是并不在硬盘上),它会把电脑上的设备映射成一个个文件 _(:з」∠)_

再学究的解释真不会了……

cgdisk

root@archiso ~ # cgdisk /dev/sda

如果汝在用 cgdisk 的话汝可能会看到这样的提示:

Warning! Non-GPT or damaged disk detected! This program will attempt to
convert to GPT form or repair damage to GPT data structures, but may not
succeed. Use gdisk or another disk repair tool if you have a damaged GPT
disk.


                                            Press any key to continue....

这表示 cdgisk 在这块硬盘上找不到 GPT 分区表。如果这是一块新硬盘或者已经清空的硬盘的话 不必担心,继续即可。否则请立即停下来检查一下硬盘(或者汝有这块硬盘的备份的话也可以继续)。

                                            cgdisk 1.0.1

                                        Disk Drive: /dev/sda
                                    Size: 972906545, 463.9 GiB

Part. #     Size        Partition Type            Partition Name
----------------------------------------------------------------
            1007.0 KiB  free space
1           512.0 MiB   EFI System                EFI system partition
2           16.0 MiB    Microsoft reserved        Microsoft reserved partition
3           103.4 GiB   Microsoft basic data      Basic data partition
4           253.4 GiB   Microsoft basic data      Basic data partition
            106.6 GiB   free space





    [ Align  ]  [ Backup ]  [  Help  ]  [  Load  ]  [  New   ]  [  Quit  ]  [ Verify ]  [ Write  ]

cgdisk 的界面大概像这样啦,用上下方向键把光标移动到汝之前的空闲空间上去(例如咱这里是最后一个)

新硬盘的话应该只有一个 free space 😂

用左右方向键把下面一排按钮上的光标移动到 New 上,然后按 Enter。

(这里看不出光标😂,黑色背景下光标应该是白的吧😂😂)

接下来会问几个问题(# 开头的是咱加上的注释😂):

# 数字可能和汝看到的不一样😂
# 起始扇区的位置,直接 Enter 就行
First sector (749424640-972906511, default = 749424640):
# 大小,可以是扇区数,也可以是实际的大小(例如 100M,20G一类的),要用掉整个剩余空闲空间的话,直接 Enter 就行。
Size in sectors or {KMGTP} (default = 223481872):
# 分区类型,默认的就好
# 但是如果要建立新的 EFI 系统分区的话 ,分区类型是 :code:`ef00`
# 但是如果要建立新的 交换空间(就是虚拟内存啦)的话 ,分区类型是 :code:`8200`
Current type is 8300 (Linux filesystem)
Hex code or GUID (L to show codes, Enter = 8300):
# 设置卷标,不设置也行。
Current partition name is ''
Enter new partition name, or <Enter> to use the current name:

然后汝应该会发现下面的空闲空间变成 Linux filesystem 了呗~

要保存分区表的话,用左右方向键把下面一排按钮上的光标移动到 Write 上,然后按 Enter。

Are you sure you want to write the partition table to disk? (yes or no):

        Warning!! This may destroy data on your disk!

在这里输入 yes (就是 yes,不是 y Y YES 啥的😂),然后按 Enter。

然后下面会闪过一行 "The operation has completed successfully" ,这时就可以退出了。

用左右方向键把下面一排按钮上的光标移动到 Quit 上,然后按 Enter。

cfdisk

如果汝在用 cfdisk 的话汝可能会看到这样的提示:

                        ┌ Select label type ───┐
                        │ gpt                  │
                        │ dos                  │
                        │ sgi                  │
                        │ sun                  │


        Device does not contain a recognized partition table.
Select a type to create a new label or press 'L' to load script file.

这表示 cfgisk 在这块硬盘上找不到可以识别的分区表。如果这是一块新硬盘或者已经清空的硬盘的话 不必担心,选择 dos 继续即可。否则请立即停下来检查一下硬盘(或者汝有这块硬盘的备份的话也可以继续)。

这就是 cfdisk 的主界面啦:

                                                    Disk: /dev/sdc
                                Size: 465.8 GiB, 500107862016 bytes, 976773168 sectors
                                        Label: dos, identifier: 0x178bfb32

    Device            Boot               Start              End          Sectors         Size       Id Type
>>  Free space                            2048        976773167        976771120       465.8G










┌──────────────────────────────────────────────────────────┐
│Filesystem UUID: 3AB8802AB87FE2B5                                                                                   │
│     Filesystem: ntfs                                                                                               │
└──────────────────────────────────────────────────────────┘
                            [   New  ]  [  Quit  ]  [  Help  ]  [  Write ]  [  Dump  ]


                                        Create new partition from free space

也是选择 new 然后输入大小:

Partition size:
# 然后可能会让汝选择是主分区还是扩展分区,按需选择就 OK
[primary]  [extended]

但是如果汝需要调整分区类型的话,选中要改变的分区然后把光标移动到 Type 上按 Enter,选择一个分区类型:

                                                    Disk: /dev/sdc
                                Size: 465.8 GiB, 500107862016 bytes, 976773168 sectors
                                        Label: dos, identifier: 0xe0a3ecf7

    Device           Boot               Start             End        Sectors        Size      Id Type
>>  /dev/sdc1                            2048         1050623        1048576        512M      ef EFI (FAT-12/16/32)
    /dev/sdc2                         1050624       976773167      975722544      465.3G      83 Linux










┌──────────────────────────────────────────────────────────┐
│Partition type: EFI (FAT-12/16/32) (ef)
└──────────────────────────────────────────────────────────┘
            [Bootable]  [ Delete ]  [ Resize ]  [  Quit  ]  [  Type  ]  [  Help  ]  [  Write ]  [  Dump  ]

要保存分区表的话,用左右方向键把下面一排按钮上的光标移动到 Write 上,然后按 Enter。

Are you sure you want to write the partition table to disk? (yes or no):

在这里输入 yes (就是 yes,不是 y Y YES 啥的😂),然后按 Enter。

然后下面会闪过一行 "The operation has completed successfully" ,这时就可以退出了。

用左右方向键把下面一排按钮上的光标移动到 Quit 上,然后按 Enter。


然而汝以为这样就结束了?还没格式化呢 (╯°Д°)╯︵/(.□ . )

创建文件系统+挂载

所以挂载是啥玩意?

GNU/Linux 不是用 Windows 那样的盘符来分区的啦,GNU/Linux 继承了 Unix 的整个目录结构 从根目录 / 开始。然后下面是各种子目录。

大多数的 GNU/Linux 发行版都遵循一个叫做“文件系统层次结构标准”(Filesystem Hierarchy Standard, 有时也简称作 FHS)的标准,汝可以 ls / 一下看看会不会发现一些例如 /bin /home /usr 一类的目录? 这就是拜这个标准所赐 😂

在 Windows 里,汝大概会把不同的文件放在不同的盘符下的硬盘分区里。 在 GNU/Linux 中,咱们通常就是把不同的分区 挂载到整个目录结构中的一处。向挂载好的目录写入的文件就会保存在被挂载的磁盘分区上。

首先还是用 lsblk 确定一下分区的名称,为了以防万一记得加上 -f 参数:

root@archiso ~ # lsblk -f
NAME   FSTYPE   LABEL       UUID                                 MOUNTPOINT
sda
├─sda1 vfat               3C44-B4ED
├─sda2
├─sda3 ntfs               42E243C5E243BBC3
├─sda4 ntfs   新加卷      58741F29741F0A00
└─sda5
sdb
└─sdb1 vfat   ARCH_201610 EAC8-F012                            /run/archiso/bootmnt
sr0
loop0  squashfs                                                  /run/archiso/sfs/airootfs

第一排分别表示设备名称,文件系统类型,卷标,UUID和挂载点。

咱这里的话 sda1 那个 vfat 分区就是 EFI 系统分区啦,sda5 就是刚刚新建的分区啦~(因为还没格式化所以没有文件系统😂)

mkfs.ext4 把那个分区格式化成 ext4 文件系统咯~

mkfs 可以格式化成某一个汝指定的文件系统(就像刚才那样 mkfs.ext4 可以格式化出一个 ext4 文件系统)

ext 家族大概是 GNU/Linux 最古老,应用的最广泛的文件系统了吧……

当然可以用的文件系统有很多啦,如果汝想再了解一些的话,可以去 ArchWiki 看一看:

https://wiki.archlinux.org/index.php/File_systems

记得自己看清楚是哪个分区别格式化错了 😂

root@archiso ~ # mkfs.ext4 /dev/sda5
mke2fs 1.43.3 (04-Sep-2016)
Creating filesystem with 27935234 4k blocks and 6987776 inodes
Filesystem UUID: a3943e57-6217-4a5f-8e57-ade5771315c0
Superblock backups stored on blocks:
    32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
    4096000, 7962624, 11239424, 20480000, 23887872

Allocating group tables: done
Writing inode tables: done
Creating journal (131072 blocks): done
Writing superblocks and filesystem accounting information: done

root@archiso ~ #

等一排文字闪过就格式化完了……

如果要格式化新的 EFI 系统分区的话,用 mkfs.vfat

如果要格式化新的 交换空间的话,用 mkswap

接下来用 mount 挂载分区啦~ (。>ω<)。

# mount <设备名称> <目标文件夹>
# /mnt 挺合适的
root@archiso ~ # mount /dev/sda5 /mnt
# 如果要挂载 EFI 系统分区的话,建议挂载到 /mnt/boot
# 所以先建立相应的文件夹
root@archiso ~ # mkdir /mnt/boot
root@archiso ~ # mount /dev/sda1 /mnt/boot
# 有交换空间的话不用挂载,用 swapon 命令。
root@archiso ~ # swapon /dev/sda6

选择软件仓库镜像

软件仓库(在Debian系发行版中,又叫做“软件源”)是软件包存储的地方。通常我们所说的软件仓库指在线软件仓库,亦即用户从互联网获取软件的地方。

用 nano 打开 /etc/pacman.d/mirrorlist

root@archiso ~ # nano /etc/pacman.d/mirrorlist


GNU nano 2.7.0                        File: /etc/pacman.d/mirrorlist

##
## Arch Linux repository mirrorlist
## Sorted by mirror score from mirror status page
## Generated on 2016-10-01
##

## Score: 0.2, France
Server = http://archlinux.polymorf.fr/$repo/os/$arch
## Score: 0.3, France
Server = http://arch.tamcore.eu/$repo/os/$arch
## Score: 0.3, Germany
Server = http://mirrors.cicku.me/archlinux/$repo/os/$arch
## Score: 0.3, Czech Republic
Server = http://ftp.sh.cvut.cz/arch/$repo/os/$arch
## Score: 0.3, Germany
Server = http://mirror.js-webcoding.de/pub/archlinux/$repo/os/$arch
## Score: 0.4, Netherlands
Server = http://ftp.nluug.nl/os/Linux/distr/archlinux/$repo/os/$arch
## Score: 0.4, Poland
                                        [ Read 517 lines ]
^G Get Help    ^O Write Out   ^W Where Is    ^K Cut Text    ^J Justify     ^C Cur Pos     ^Y Prev Page
^X Exit        ^R Read File   ^\ Replace     ^U Uncut Text  ^T To Spell    ^_ Go To Line  ^V Next Page

这是 GNU nano 的主界面,最简单的方法还是把下面那些 Mirrors 先全删掉然后输入一个新的, 用光标指向某一行以后同时按下 Ctrl+K 就好。然后自己输入一个 Mirror ,下面给出几个中国国内的 Mirror:

(所谓的 Ctrl+K 就是这两个键一起按😂)

# 网易
Server = http://mirrors.163.com/archlinux/$repo/os/$arch
# 清华大学 TUNA 协会
Server = https://mirrors.tuna.tsinghua.edu.cn/archlinux/$repo/os/$arch
# 中国科学技术大学
Server = https://mirrors.ustc.edu.cn/archlinux/$repo/os/$arch
# 西安交通大学
Server = https://mirrors.xjtu.edu.cn/archlinux/$repo/os/$arch

输入完以后按下 Ctrl+O 写入,按 Enter 确定,再按 Ctrl+X 退出。

然后用 pacman -Syy 刷新一下软件包数据库。

root@archiso ~ # pacman -Syy
:: Synchronizing package databases...
core                                  120.9 KiB  4.92M/s 00:00 [##################################] 100%
extra                                1755.6 KiB  5.24M/s 00:00 [##################################] 100%
community                               3.7 MiB  6.82M/s 00:01 [##################################] 100%
root@archiso ~ #

安装基本系统

用 pacstrap 安装基本系统:

  • 默认会安装 base 元包(包含基本系统所需的依赖)。

    如果汝在别的地方见到说 base 是个软件包组的说法,忘了它吧……

  • 然后大多数情况下,汝还需要一个内核。目前官方仓库里有这些:

    对于大多数情况下,汝可能会考虑安装固件包 linux-firmware 。

  • 以及一个文字编辑器,例如刚才用到的 nano

    诶,base 组不包含 live 环境中所有的软件包么?是的, https://projects.archlinux.org/archiso.git/tree/configs/releng/packages.x86_64 列出了在 ISO 中的 live 环境中安装的但不在 base 包中的软件包。

  • 以及一些文件系统工具,如果汝和咱这里一样用了 ext4 的话,安装 e2fsprogs 就好, 需要读写其它文件系统的话,可以在 https://wiki.archlinux.org/index.php/File_system 找到相应的用户空间工具。

  • 要通过 AUR 或者 ABS 编译安装软件包,还需要安装 base-devel 啦 (现在它还是个软件包组)。

  • 要通过刚才用到的 wifi_menu 连接无线网络的话,汝可能需要这些:

    netctl iw dialog wpa_supplicant wpa_actiond

于是一个栗子大概像这样

root@archiso ~ # pacstrap /mnt base base-devel linux nano e2fsprogs iw dialog wpa_supplicant wpa_actiond

其他软件以后会用 pacman 再安装啦~

安装完以后大概会是这个样子 (´・ω・`)

pacstrap /mnt base linux    29.09s user 2.61s system 85% cpu 37.271 total

准备进入 chroot 环境

生成 fstab 啦 ~

所以 fstab 又是个啥玩意?

fstab(5)文件可用于定义磁盘分区,各种其他块设备或远程文件系统应如何装入文件系统。

每个文件系统在一个单独的行中描述。这些定义将在引导时动态地转换为系统挂载单元,并在系统管理器的配置重新加载时转换。 在启动需要挂载的服务之前,默认设置会自动fsck和挂载文件系统。例如,systemd会自动确保远程文件系统挂载 (如NFS或Samba)仅在网络设置完成后启动。因此,在/etc/fstab中指定的本地和远程文件系统挂载应该是开箱即用的。

emmmmm

# genfstab
usage: genfstab [options] root

Options:
    -L             Use labels for source identifiers (shortcut for -t LABEL)
    -p             Exclude pseudofs mounts (default behavior)
    -P             Include printing mounts
    -t TAG         Use TAG for source identifiers
    -U             Use UUIDs for source identifiers (shortcut for -t UUID)

    -h             Print this help message

genfstab generates output suitable for addition to an fstab file based on the
devices mounted under the mountpoint specified by the given root.
root@archiso ~ # genfstab -U /mnt >> /mnt/etc/fstab

然后用 arch-chroot 向新系统出发~

因为还有些配置没完成嘛……
root@archiso ~ # arch-chroot -help
usage: arch-chroot chroot-dir [command]

    -h                  Print this help message
    -u <user>[:group]   Specify non-root user and optional group to use

If 'command' is unspecified, arch-chroot will launch /bin/bash.
root@archiso ~ # arch-chroot /mnt /bin/bash
[root@archiso /] #

设置基本系统

# 开头只表示以 root 用户运行,汝不用把 # 输入到终端里啦~
  • 设置时区(中国的时区是 Asia/Shanghai)
# ln -s <源文件> <目标> 创建一个符号链接

# ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
  • 设置时间标准 为 UTC,并调整 时间漂移:
# hwclock --systohc --utc

如果汝正在尝试安装双系统,在进入 Windows 以后可能会发现 Windows 的时间不对了 ,因为 Windows 默认的硬件时钟是 localtime(

可以用一条注册表键值让 Windows 使用 UTC 作为硬件时钟(在早于 Windows 7 的系统上发现过这样做会出现一些严重的问题: http://www.cl.cam.ac.uk/~mgk25/mswish/ut-rtc.html

reg add "HKEY_LOCAL_MACHINESystemCurrentControlSetControlTimeZoneInformation" /v RealTimeIsUniversal /d 1 /t REG_DWORD /f
  • /etc/locale.gen 是一个仅包含注释文档的文本文件。指定您需要的本地化类型,去掉对应行前面的注释符号(#)就可以啦,还是用 nano 打开,建议选择帶UTF-8的項:
# nano /etc/locale.gen

en_US.UTF-8 UTF-8
zh_CN.UTF-8 UTF-8
zh_TW.UTF-8 UTF-8
  • 执行 locale-gen 以生成 locale 讯息:
# locale-gen
  • 创建 locale.conf 并提交您的本地化选项:

    将系统 locale 设置为en_US.UTF-8,系统的 Log 就会用英文显示,这样更容易问题的判断和处理。用户可以设置自己的 locale。

    警告: 不推荐在此设置任何中文locale,或导致tty乱码。

# echo 用来输出某些文字,后面的大于号表示把输出保存到某个文件里啦~

# 或者可以用文字编辑器新建这个文件加上这一行。

# echo LANG=en_US.UTF-8 > /etc/locale.conf
  • 设置一个喜欢的主机名(用汝的主机名代替 myhostname ):
# echo myhostname > /etc/hostname
  • 设置 root 的密码(输入密码的时候就是啥也没有 ╮( ̄▽ ̄)╭ ):
[root@archiso /]# passwd
New password:
Retype new password:
passwd: password updated successfully

以及汝大多数时候应该是用不到这个密码的(

  • 安装启动加载器(例如 GRUB ):

    启动加载器是 BIOS 或 UEFI 启动的第一个程序。它负责使用正确的内核参数加载内核, 并根据配置文件加载初始化 RAM disk。

    如果对其它的启动管理器有兴趣的话,记得去看 https://wiki.archlinux.org/index.php/Arch_boot_process#Boot_loader

** UEFI 用户先再安装几个必要的软件包咯, efibootmgr 用于修改 UEFI 固件中的某些信息,

dosfstools 包含了操作 FAT/FAT32 文件系统所需的用户空间工具。

# pacman -S efibootmgr dosfstools

** 然后安装 GRUB (如果汝的硬盘上没有其它系统,那么可以不用装 os-prober )

# pacman -S grub os-prober

** 把 GRUB 安装到硬盘:

# MBR 用户这么做 (记得用汝自己硬盘的名称代替 sda ,不要带上表示分区的数字啦~):

# grub-install --target=i386-pc /dev/sda --recheck

# UEFI 用户这么做(如果汝没把 EFI 系统分区挂载到 /boot ,请自行修改 --efi-directory 的值):

# grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=grub --recheck

EFI 安装成功以后大概像这样 😂

[root@archiso /]# grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=grub --recheck
Installing for x86_64-efi platform.
Installation finished. No error reported.

然后生成必要的配置文件:

[root@archiso /]# grub-mkconfig -o /boot/grub/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-linux
Found initrd image(s) in /boot: initramfs-linux.img
Found fallback initrd image(s) in /boot: initramfs-linux-fallback.img
done

如果汝安装了 os-prober 然后看到这样的警告:

WARNING: Failed to connect to lvmetad. Falling back to device scanning.

这是因为在 chroot 环境里面 /run 是不可用的。只要每个步骤都做对了,这些警告不会影响系统启动, 汝可以放心继续进行下一步的系统安装咯。 如果汝重启之后没看到 Windows 的启动项,试着进入 Arch 之后再运行那条生成配置文件的命令。

因为 GRUB 是一个操作系统,它的配置和使用可能会非常复杂,可以在 https://wiki.archlinux.org/index.php/GRUB 上找到一些提示和疑难排解技巧。

设置 sudo

所以这又是个啥玩意? (´_`)

因为 root 用户的权力很大而且很危险,所以轻易不会用到它 (。>ω<)。

所以就有了 sudo(substitute user do) 使得系统管理员可以授权特定用户或用户组作为 root 或其他用户执行某些(或所有)命令,同时还能够对命令及其参数提供审核跟踪。

(话风突变)

sudo 应该已经作为 base-devel 的一部分装上去了,如果没有的话汝也可以自己手动安装一下:

[root@archiso /]# pacman -S sudo

sudo 的配置文件是 /etc/sudoers ,但是咱们不会直接去编辑它(因为一旦搞坏了不好修)。 所以有一个 visudo 的命令用来代理编辑它(就是先编辑一个临时文件,然后检查有没有错误, 一切 OK 后再覆盖)。

嗯…… visudo? 如果汝觉得 vi 哪里眼熟的话,没错! 这个命令默认会用 vi 去编辑那个文件。 如果汝想用其他的编辑器(例如刚刚用的 nano)的话,可以通过一个环境变量:

[root@archiso /]# EDITOR=nano visudo

现在大概像这个样子:

GNU nano 3.2                                        /etc/sudoers.tmp

## sudoers file.
##
## This file MUST be edited with the 'visudo' command as root.
## Failure to use 'visudo' may result in syntax or file permission errors
## that prevent sudo from running.
##
## See the sudoers man page for the details on how to write a sudoers file.
##

##
## Host alias specification
##
## Groups of machines. These may include host names (optionally with wildcards),
## IP addresses, network numbers or netgroups.
# Host_Alias    WEBSERVERS = www1, www2, www3

##
## User alias specification
##
                                                [ Read 97 lines ]
^G Get Help    ^O Write Out   ^W Where Is    ^K Cut Text    ^J Justify     ^C Cur Pos     M-U Undo       M-A Mark Text
^X Exit        ^R Read File   ^\ Replace     ^U Uncut Text  ^T To Spell    ^_ Go To Line  M-E Redo       M-6 Copy Text

虽然这个文件有很多行,但是咱们还是先从让它能够工作开始来最小的修改它。

找到下面的这一行,然后把 %wheel 前面的注释符号(#)去掉,不过百分号要留下:

## Uncomment to allow members of group wheel to execute any command
# %wheel ALL=(ALL) ALL

然后就可以保存退出啦~ (效果就是注释里说明的,给 wheel 组执行所有命令的权限)

如果汝不想每一次都在前面加上 EDITOR 来指定编辑器的话,可以加上这几行:

# 重设默认的环境变量
Defaults      env_reset
# 设置默认的编辑器,并使 visudo 不再读取环境变量 editor 的值。
Defaults      editor=/usr/bin/nano, !env_editor

如果汝想进一步了解 sudo 的配置的话,还是去看 ArchWiki: https://wiki.archlinux.org/index.php/Sudo

安装桌面环境

  • 安装桌面环境需要的基础包 (就是 xorg 啦)
[root@archiso /]# pacman -S xorg
:: There are 80 members in group xorg:
:: Repository extra
1) xf86-input-evdev  2) xf86-input-joystick  3) xf86-input-keyboard  4) xf86-input-libinput
5) xf86-input-mouse  6) xf86-input-synaptics  7) xf86-input-vmmouse  8) xf86-input-void
9) xf86-video-amdgpu  10) xf86-video-ark  11) xf86-video-ati  12) xf86-video-dummy
13) xf86-video-fbdev  14) xf86-video-glint  15) xf86-video-i128  16) xf86-video-intel
17) xf86-video-mach64  18) xf86-video-neomagic  19) xf86-video-nouveau  20) xf86-video-nv
21) xf86-video-openchrome  22) xf86-video-r128  23) xf86-video-savage  24) xf86-video-siliconmotion
25) xf86-video-sis  26) xf86-video-tdfx  27) xf86-video-trident  28) xf86-video-vesa
29) xf86-video-vmware  30) xf86-video-voodoo  31) xorg-bdftopcf  32) xorg-docs  33) xorg-font-util
34) xorg-fonts-100dpi  35) xorg-fonts-75dpi  36) xorg-fonts-encodings  37) xorg-iceauth
38) xorg-luit  39) xorg-mkfontdir  40) xorg-mkfontscale  41) xorg-server  42) xorg-server-common
43) xorg-server-devel  44) xorg-server-xdmx  45) xorg-server-xephyr  46) xorg-server-xnest
47) xorg-server-xvfb  48) xorg-server-xwayland  49) xorg-sessreg  50) xorg-setxkbmap
51) xorg-smproxy  52) xorg-x11perf  53) xorg-xauth  54) xorg-xbacklight  55) xorg-xcmsdb
56) xorg-xcursorgen  57) xorg-xdpyinfo  58) xorg-xdriinfo  59) xorg-xev  60) xorg-xgamma
61) xorg-xhost  62) xorg-xinput  63) xorg-xkbcomp  64) xorg-xkbevd  65) xorg-xkbutils  66) xorg-xkill
67) xorg-xlsatoms  68) xorg-xlsclients  69) xorg-xmodmap  70) xorg-xpr  71) xorg-xprop
72) xorg-xrandr  73) xorg-xrdb  74) xorg-xrefresh  75) xorg-xset  76) xorg-xsetroot  77) xorg-xvinfo
78) xorg-xwd  79) xorg-xwininfo  80) xorg-xwud

Enter a selection (default=all):

这时会让汝选择需要哪些软件包啦,其实大多数时候默认的就行……

  • 接下来挑一个喜欢的桌面环境包组装上咯~

    (咱这里就只举例 GNOME 、KDE 和 xfce 啦,其他官方支持的桌面环境可以去 https://wiki.archlinux.org/index.php/Desktop_environment_(简体中文) 查看)

    GNOME , 想要 GNOME 全家桶的话带上 gnome-extras

    # pacman -S gnome

    KDE Plasma , 想要 KDE 全家桶的话用 kde-applications-meta 代替 。 kde-applications 会提示汝选择要安装哪些包。

    以及一个显示管理器, KDE 和 sddm 一起使用最好。

    # pacman -S plasma sddm kde-applications

    或者只安装 kdebase 组,包含了一些基本组件(例如文件管理器和终端模拟器)。

    # pacman -S plasma sddm kdebase

    xfce4,xfce 不带显示管理器,所以要装个其他的(例如 lightdm,还要装一个 greeter)

    # pacman -S xfce4 xfce4-goodies lightdm lightdm-gtk-greeter

    桌面环境大多数使用 NetworkManager ,xfce 的话,记得安装 network-manager-applet, 一个控制 NetworkManager 的小工具:

    # pacman -S networkmanager

  • 然后安装中文字体( 同样的方法安装 😋)

    Google Noto Fonts 系列: noto-fonts noto-fonts-cjk noto-fonts-emoji

    思源黑体:adobe-source-han-sans-otc-fonts

    文泉驿:wqy-microhei wqy-zenhei

更多的字体可以在 https://wiki.archlinux.org/index.php/Fonts_(简体中文) 找到。

收尾工作

  • 新建一个用户

    -m 为新用户创建一个目录,-s 设置用户的登录 Shell -G 会把新建的用户追加到某个组中 (这里是刚刚 sudo 里的那个 wheel)

    记得最后是用户名就好 😂

    # useradd -m -G wheel horo

    然后设置密码(记得是输入两次,而且输入过程中不会有显示,不要以为是键盘坏了哦)

    # passwd horo

  • 激活需要的服务,例如一个显示管理器,在例如 gdm :

    # systemctl enable gdm

    当然还有 NetworkManager:

    # systemctl enable NetworkManager

    (这个里面有大写😂)

    systemd 是 Arch Linux 现在唯一的 init 程序,当内核加载完毕后,首先被加载的 就是 init (这里就是 systemd 啦)。然后 systemd 会接着加载剩下的部分。

    https://wiki.archlinux.org/index.php/systemd

  • 设置用户级别的 locale

    用 su 切换到刚建立的用户,然后编辑 ~/.config/locale.conf 修改自己的 Locale ,例如:

LANG=zh_CN.UTF-8
LC_CTYPE="zh_CN.UTF-8"
LC_NUMERIC="zh_CN.UTF-8"
LC_TIME="zh_CN.UTF-8"
LC_COLLATE="zh_CN.UTF-8"
LC_MONETARY="zh_CN.UTF-8"
LC_MESSAGES="zh_CN.UTF-8"
LC_PAPER="zh_CN.UTF-8"
LC_NAME="zh_CN.UTF-8"
LC_ADDRESS="zh_CN.UTF-8"
LC_TELEPHONE="zh_CN.UTF-8"
LC_MEASUREMENT="zh_CN.UTF-8"
LC_IDENTIFICATION="zh_CN.UTF-8"
LC_ALL=

或者可以重启以后用桌面环境的设置程序改 😂

完工啦

  • 离开 chroot 环境:

    # exit

  • 卸载挂载的分区,(其实不是必须的,因为马上就重启啦~)

    # umount -R /mnt

  • 重新启动,准备迎接新的系统吧 ~(>_<~)


欢迎来到 Arch Linux 的世界!

Cheers! 汝刚刚成功的安装 Arch Linux 到汝的电脑中了呐!

那接下来要干啥呢?

by ホロ at October 08, 2019 04:00 PM

October 06, 2019

中文社区新闻

`base` 元包替代了同名的包组并且要求安装,需要手动干预升级

原本的 base 包组(group)已经被替换为同名的元包(metapackage),我们建议所有用户安装这个新包(pacman -Syu base),因为从今往后事实上要求安装该包。
对寻求帮助和支持的用户,我们期待他们运行的系统安装了 base 包。

附加说明:
请注意,新的 base 包不再包含以下内容:

  • – 内核
  • – 编辑器
  • – 文件系统工具 (比如 e2fsprogs)

……以及可能还有别的你预期会有的包。对新安装的系统需要额外安装这些包。

by farseerfc at October 06, 2019 03:57 PM

October 03, 2019

百合仙子

红黑树到底是个什么树

本文来自依云's Blog,转载请注明。

红黑树使用得非常多,然而由于它不在我的本科教材上,我又不用自己实现它,所以我一直不知道它是什么样的。现在想了解一下,结果发现网上我看了好几篇的中文资料都是这种介绍方式——

假设要介绍的树叫梧桐树。文章会告诉你梧桐树会长多高,树叶长什么样,分叉有什么特征,它和棕榈树有什么不同,还会贴心地放一张或者多张梧桐树的照片给你看。

然而红黑树不是梧桐树啊!计算机科学也不是植物学啊!它是为特定目的人造的!所以你倒是说说它为什么会被设计成这个样子啊……

然后我去看了一眼英文维基百科上的介绍,才看了第一段就恍然大悟。

A red–black tree is a kind of self-balancing binary search tree in computer science. Each node of the binary tree has an extra bit, and that bit is often interpreted as the color (red or black) of the node. These color bits are used to ensure the tree remains approximately balanced during insertions and deletions.

意思是,红黑树是一种自平衡二叉树。每个节点有一个额外的比特,通常叫它颜色,并且是红的或者黑的。所以红黑树之所以叫红黑树,只是发明者为了方便叙述给加了点颜色,就跟数学里那些个着色问题(以及物理里夸克的颜色和味道)一样。为什么要加这些颜色呢?它们是用来保证树大致平衡的。

神奇了,为什么加了这么个颜色就能保证了?

Balance is preserved by painting each node of the tree with one of two colors in a way that satisfies certain properties, which collectively constrain how unbalanced the tree can become in the worst case. When the tree is modified, the new tree is subsequently rearranged and repainted to restore the coloring properties. The properties are designed in such a way that this rearranging and recoloring can be performed efficiently.

哦,是用特定的方法着色的,并且树被修改的时候会重新着色。神奇的算法使得这些操作非常高效。也算是用空间换时间了。

The leaf nodes of red–black trees do not contain data. These leaves need not be explicit in computer memory—a null child pointer can encode the fact that this child is a leaf—but it simplifies some algorithms for operating on red–black trees if the leaves really are explicit nodes.

红黑树的叶子节点总是黑色的,并且不包含额外的信息。所以实现的时候实际上不需要显式地存在,或者用同一个节点就好。它的存在只是为了简化算法描述而已。

红黑树的性质:

  1. 每个节点不是红色就是黑色。多出来一比特的信息,当然只有两种选择了。
  2. 根节点是黑色。
  3. 叶子节点是黑色。
  4. 红色节点的子节点是黑色。这是为什么非要加个不包含任何信息的黑色叶子节点了。不然弄出来红色叶子节点有点麻烦了。
  5. 任意节点到它下方的叶子节点,路径上的黑色节点数是相同的。再一次体现了黑色叶子节点的用处。

这些性质保证了,从根节点到所有叶子节点,最远的路径最多是最近的路径两倍远。不会特别远,甚至是退化成链表了。

然后是树上的操作。

查找就不用说了。二叉树的查找算法而已。

插入的时候,首先把新节点涂成红色,按二叉树的方式插进去,取代某个叶子节点,并自己长出两片叶子。然后修复一下。修复方案如下:

  1. 如果这是个根节点,那么涂黑就完事了。
  2. 如果它的上级节点是黑色,黑色节点下接红色节点,没事,不需要更多操作了。
  3. 如果它的上级节点是红色,并且它的上级邻节点是红色,这就坏事了,违反了性质4。那就把它们涂黑。可这样多了一层黑节点,又会违反性质5。那就把上上级节点涂红(由性质4,上上级节点之前肯定是黑色)。可如果上上级节点是根节点,又违反了性质2。不过上上级节点带的这部分子树肯定是没问题的,那就把整个上上级节点带的这棵子树当整体,递归修复一下好了。
  4. 如果它的上级节点是红色,并且它的上级邻节点是黑色,这还是破坏了性质4。而这个时候如果把上级节点涂黑,那么上上级节点不管涂不涂红,一边加了一个黑节点而另一边没有加,它这个子树本身就已经坏掉了,所以得想另外的办法。
    1. 第一步,如果上级节点在左边,而新加节点在右边,那就左旋。如果上级节点在右边,而新加节点在左边,那就右旋。其它情况不用动。由于是两个上下级红色节点在旋转,这样并不会再破坏任何性质。
    2. 第二步,两个红色节点和可以被取代的叶子节点已经准备好了,现在把上上级节点(也就是动过的子树的上级节点)用子树的根换掉,原来的挂到上一步空出来的叶子节点那里,并且把新根涂黑,把一开始那个碍事的黑色节点涂红。这样,两个红色节点就成了同一个黑色节点的子节点。性质4得到了保持,涂色过程只是把黑色上移取代之前的红色,一边的路径上少了个红色节点,另一边多了个红色节点而已,也不会破坏性质5。

删除就更复杂了。

  1. 如果被删除的节点有两个非叶子节点,按二叉树的方法删除节点,但是保持原来这个位置上节点的颜色。因为子树的根被保留颜色地替换了,所以这一步不会破坏性质。而少了的(被作为新子树根替换的)节点,递归这个删除算法就可以了,一直在深入,总能递归到没有两个非叶子节点的节点。
  2. 你不会想删叶子节点,也不能删它们。
  3. 所以剩下一种情况:被删除的节点最多有一个非叶子子节点。如果有的话就叫它 C 好了,没有就随便找个叶子节点当 C。那被删除的节点我们叫 M。
    1. 如果 M 是红色,那用 C 取代它即可。因为 C 肯定是黑色(而且是叶子节点)。
    2. 如果 M 是黑色,但 C 是红色,用 C 取代 M,并且把 C 涂黑。少了一个红色节点而已,没事的。
    3. 如果 M 和 C 都是黑色,这个时候 C 也一定是叶子节点。先用 C 取代 M,并叫新的 C 为 N,其上级节点为 P,P 的另一个子节点为 S。现在 N 这边少了个黑色节点,相对的,S 这边多了一个。
      1. 如果 N 是根节点(P 不存在),那么没事了。
      2. 如果 P 是黑色,并且 S 是红色,旋转一下,让 S 成为新的子树的根,并将 P 涂红。从颜色上看,只是红色从一个子节点跑到另一个,然后有棵子树从一边换到另一边了,性质不会被再度破坏。但之前被破坏的部分还没修复呢,现在是一个黑色下边有一个黑色的节点那里的路径上多了一个黑色节点,要走下边的步骤。
      3. 如果 P 和 S 都是黑色,N 那边不是被删掉了一个黑色节点吗,现在把 S 涂红,这样 P 的两边(N 和 S)都少了个黑色节点。子树没有问题,然而 P 这边的路径上少了个黑色节点。要么 P 是根节点,不用管了。要么 P 的邻节点那边的路径多了个黑色节点,情况就是一个子树,下方有一个黑色节点,并且这一边的路径上多了个黑色节点。如果子树的根是黑色,那么递归了,回去再走一遍上一步(3.3.2)就好。如果是红色,走下边的步骤。
      4. 如果 P 是红色,并且 S 和 S 的子节点都是黑色,把 P 和 S 的颜色交换一下,S 那边的路径少了个黑色节点,处理好了。
      5. 如果 P 是红色,N 位于左侧,并且 S 的左子节点是红色,右子节点是黑色。N 当然是黑色的啦。那么把 S 右旋,并且把旧 S 的左节点(新的子树根)涂黑,然后旧 S 自己(新右子节点)涂红。继续下边的步骤。
      6. 如果 P 是红色,N 位于左侧,并且 S 的左子节点是黑色,右子节点是红色,把 P 左旋一下,并把之前那个红色子节点涂黑。这样 N 那侧的路径多了个黑色节点。完成了。
      7. 如果 P 是红色,N 位于右侧。把上两步镜像一下就可以了。

总之就是各种涂色和旋转,来保持二叉树和红黑树的性质不被破坏(红黑树是二叉树,所以旋转需要点技巧,不是想旋转就一定能旋转的)。看着复杂,照着前人已经想好的步骤去做其实也并不难。然而中文网络上几乎没有人解释这些步骤的目的,以至于让人理解不能 :-(

by 依云 at October 03, 2019 08:04 AM

September 21, 2019

ヨイツの賢狼ホロ

和雨宫恋叶交换问题!

终于还是咕咕出来了?

(雨宫恋叶 == Chaotic Dimension == ShadowRZ == 布偶君) = True

雨宫恋叶的问题和咱的回答~

  • 对于你来说,你最希望拥有什么样的硬件?

    TL;DR: 真正属于自己的硬件(?)

    加长版:就想要所有硬件都由自由软件驱动,仅支持自由软件的 GNU/Linux 发行版用起来也 十分愉快的那种。如果不是强调轻薄的话最好可以自由更换标准部件,在比较长的一段时间 里可以通过升级硬件达到接近未来的性能。(咱到底是在说啥啊……)

  • Stallman 无数次强调 Free software 中的 Free 之表意,会不会与美国的语言文化有关?

    大概只和英语本身有关系(?):

    很多语言都拥有两个独立的单词来表示自由和免费。 例如,法语中有“libre”和“gratuit”。而英语则不是:在英语中确实有一个单词 “gratis”用于无歧义地表示免费,但没有普通的形容词用于无歧义地表示自由。

    以及大家都在说“free”,不管是自由软件开发者还是私有软件开发者:

    自由软件关乎自由而非价格。但是专有软件公司一般使用“free software”这一短语来指代价格。 有时它们的意思是您可以免费获得一份二进制副本;有时它们的意思是在您所购买的计算机上捆绑 了一份副本,而整台计算机的价格包含了二者各自的价格。不管是哪种方式,这都与我们在 GNU 计划中所指的自由软件无关。

    由于这种潜在的混淆,当一家软件公司宣称它的产品是“free software”的时候,务必查看实际 的发布条款以确认用户是否真正拥有自由软件所蕴含的所有基本自由。 有时它真的属于自由软件,有时它不是。

    至于中文的话,这两个概念倒是以“自由”和“免费”的名义区分开了……

  • 自由软件定义是否需要全面修订?

    知らんけど~

    首先咱没觉得现在的定义有啥不妥,

    然后这种基础的定义要修订起来通常都不容易(参考隔壁国际单位制,最近刚把基本单位 都定义成和物理常数有关的形式)。

    在然后咱也没有编修这些花里胡哨(?)的文字内容的功力啦,自然也没有什么建议。

  • 对于我的作品来说,你认为我目前的写作风格如何?

    “咱不认识字。”

    除了剧情很迷以外貌似没什么问题( 当然也没什么风格…… ),风格这种东西大概要 写成相当的规模的时候才能有印象吧(?)

  • 你有没有想对现实中的人隐藏,回避的某些东西?

    有,例如现在在做的事。(但其实也有现实中的朋友知道了,未来可能会在某个 不为现在知道的任何人所知的地方重新继续开始吧……)

  • 我感觉你是个 ReST 苦手(指不会用),之前看到你嵌入 Wikimedia Commons 的 SVG 时, 疑似因为 Pelican 的失误导致出了一个 <object> 嵌入 SVG。然而……正确在一个响应式设计里插入 SVG 应该用 <img>,你需要 Raw HTML…… 那么你最熟悉的标记语言是什么? 你为什么没有选择在 Pelican 里使用 Markdown??

    常用的 HTML 、reStructuredText 、Markdown 和 MediaWiki 里并没有哪个觉得特别熟 😂

    为啥没用 Markdown ? 因为当初从 farseerfc 那里听到 Pelican 然后开始用的时候 Pelican 还没支持 Markdown 鸭 …… 而且现在哪怕支持了,不少插件都是围着 reST 的模式 做的,也没有什么特别的动力换 Markdown 的样子……

    (不过倒是有打算用一个支持 Markdown 的博客软件/生成器啥的再全新开始一次(咕咕咕……))

  • 你讨厌某个人的存在本身吗?

    虽然有时会讨厌某些人的行为什么的,但是存在啥的就没必要如此耿耿于怀啦……

    (虽然还是会竭力不相往来就是了……)

那么下一个是?

其实还没想好 😂,如果咱友链里剩下的谁愿意自告奋勇也热烈欢迎啦 ……

熟悉的感觉……

by ホロ at September 21, 2019 04:00 PM

September 09, 2019

百合仙子

gdb 不肯加载调试信息怎么办?

本文来自依云's Blog,转载请注明。

更新完 buster,我的 morerssplz 崩了好几次了。第一次收到 Grafana 的通知时还以为出什么大事了呢,结果只是进程崩了。

这只 Debian 没有安装 systemd-coredumpctl 所以手动 ulimit -c unlimited 搞到了个 coredump。可随后问题来了:

(gdb) bt
#0  0x00007f9a5bd8b013 in ?? ()
#1  0x00007f9a5bd8bcfa in ?? ()
#2  0x0000000002bdb890 in ?? ()
#3  0x0000000000000000 in ?? ()

啥也没有?

我安装了 python3-dbg 啥的,它还是如此显示,以至于我一度认为 Debian 的 python3-dbg 包只包含调试版本的 Python 而没有 python3 包对应的调试信息。后来才发现不是这样的,因为直接加载 python3 是会读调试信息的:

>>> gdb python3
...
Reading symbols from python3...Reading symbols from /usr/lib/debug/.build-id/66/44f05b3a3ab9727ecee55c58681bc43b94d92e.debug...done.

然而 gdb 读这个 coredump 的时候压根就没尝试读取……即使我使用 symbol-file 命令加载了 python3 的调试信息也依旧如此。以至于我还以为函数调用栈被破坏了,但我越看越是感觉不像。

后来看到一个命令——sharedlibrary,让 gdb 加载动态链接库的调试信息的。这个也执行之后,终于能打出完整的调用栈了!

所以就是这程序崩在了动态链接库里,而 gdb 太懒根本不肯自动加载相关的调试信息,所以才什么都看不到的。

by 依云 at September 09, 2019 08:27 AM

September 04, 2019

百合仙子

关于称呼

本文来自依云's Blog,转载请注明。

总有一些人对我用一些不知道怎么来的称呼,所以我来写一下。以后不要不经过大脑乱用了啊。

不可接受的

✘ 老哥、大哥、兄弟、兄台、先生 ✘

使用以上称呼可能导致消息没有回复,或者相关消息被删除。

不建议的

大佬、老师、大大,等

建议

直接叫我「依云」就好啦,想那么多干嘛。

by 依云 at September 04, 2019 09:52 AM

September 03, 2019

百合仙子

NVIDIA PRIME 配置笔记

本文来自依云's Blog,转载请注明。

这是由 NVIDIA 官方提供的新的双显卡配置方案(官方文档),需要最新的驱动及 Xorg 支持。其中 nvidia 驱动已经位于 Arch Linux 官方仓库中(版本号 435.21)。相关 Xorg 补丁还在 git 上,并没有新版本放出,所以需要自行编译包含补丁的版本。这里有现成的 PKGBUILD。我打包好的版本也提供下载

我的硬件是 ThinkPad T470p,Intel Corporation HD Graphics 630 核显和 GeForce 940MX 独显。核显的特点是:省电、支持视频编解码加速。独显的特点是:Minecraft 能开光影,FPS 也要高一点。用来跑火狐的话可以正确渲染 FishGL

配置方法如下。

首先把 bbswitch 啥的都卸载了吧。虽然注意点不卸载也没事,但是毕竟装着没意义还容易出问题。然后看看 /etc/modprobe.d 下有没有黑名单 nvidia 的驱动,给它取消了。我有一个 options nvidia_drm modeset=1 的配置,不知道有没有影响。

Xorg 这边要加一段配置。就保存在 /etc/X11/xorg.conf.d/nvidia.conf 好了。

Section "ServerLayout"
  Identifier "layout"
  Screen 0 "iGPU"
  Option "AllowNVIDIAGPUScreens"
EndSection

Section "Device"
  Identifier "iGPU"
  Driver "modesetting"
  BusID "PCI:0:2:0"
EndSection

Section "Screen"
  Identifier "iGPU"
  Device "iGPU"
EndSection

Section "Device"
  Identifier "dGPU"
  Driver "nvidia"
EndSection

那个 BusID 的值要自己看着 lspci | grep VGA 来改。

如果你之前是用N卡跑 Xorg 的,需要把 xrandr --setprovideroutputsource modesetting NVIDIA-0 之类的设置去掉。

然后重启系统就可以了。请做好通过 tty 或者 ssh 修复配置的准备。

默认情况下,Xorg 及其上的程序运行于i卡。使用 __NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia 环境变量来指定使用N卡。为了方便起见,做一个别名好了:

alias nvrun="__NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia"

然后就可以 nvrun minecraft-launcher 啦~

Minecraft BSL 光影效果

对了,要注意一下的是,这两个环境变量对视频硬解也是有效的。比如我如果给 mpv 使用这两个环境变量的话,mpv 就会黑屏(我的N卡不支持硬解……

by 依云 at September 03, 2019 08:18 AM

September 02, 2019

中文社区新闻

astyle>=3.1-2 更新需要手动干预

astyle 包在 3.1-2 之前的版本缺少了一个动态库的链接。这个问题已经在 3.1-2 中修复,所以更新过程需要覆盖掉 ldconfig 创建出的未被 pacman 跟踪的链接文件。如果你在更新时遇到如下报错:

astyle: /usr/lib/libastyle.so.3 exists in filesystem

那么请使用如下命令

pacman -Suy --overwrite usr/lib/libastyle.so.3

来完成系统更新。

by farseerfc at September 02, 2019 01:34 AM

August 26, 2019

ヨイツの賢狼ホロ

香港之行s

这篇文章其实并不是去之后几天写的,期间的各种情况 可能 肯定 已经发生了各种变化,所以只能用来当作纪念了(?)

咱去深圳有很大的原因是为了这个(x)

通行证(中国内地公民限定)

只有中国内地居民前往香港需要准备一个叫做往来港澳通行证的证件才能前往 香港和澳门(其它国家或地区的公民需要什么准备才能前往香港咱就没有深究啦~)。

  • 如果汝的户籍所在地不能申请个人旅游签注也不用担心,团队旅游签注过关时 不再要求查验团队名单,所以可以直接用。
  • 深圳户籍居民另可办理一年多次赴港签注,每周最多可前往香港一次。
  • 介于某企鹅公司的总部在深圳的缘故(大雾),办理通行证需要预约, 而预约通行证办理需要在微信上完成 🌚

就当作 15 块钱买张去香港的门票好了(大雾)

落马洲支线管制站前

一些清单(?)

过境

从深圳前往香港的途径有好几种:

  • 福田口岸(4号线福田口岸站)和罗湖口岸(1号线罗湖站附近),通关 后前往港铁落马洲/罗湖站换乘东铁线。
  • 在深圳北站/福田站搭乘广深港高速铁路前往香港西九龙站。
  • 深圳湾口岸和皇岗口岸(但是咱没去过不知道细节)

通信

到了香港之后汝中国内地的手机卡就算是漫游了咯,虽然最近联通和电信在 搞啥“促销”(1元/M,25元后当日不计费,200M后限速),不过还是觉得不太够用?

  • 口岸周围或者网上好像可以买到若干日用的上网卡(但是咱没买过)
  • 港铁九龙塘/旺角东站有 SmarTone 的自助售货机,可以买到当地的储值卡(预付费 SIM 卡)。
  • 土豪玩家可以考虑 Google Fi(大嘘),或者当地的手机运营商合约(称作“上台”)。
港铁九龙塘站的自助售货机

如果有计划经常往返香港和内地,建议准备一张香港的手机卡,不仅能省钱还有其它用处(嘘……)

消费

虽然国内的几家大头(银联,支付宝和微信支付)在香港逐渐普及起来了,但是不少地方还是只收港币 现金的(例如港铁站的服务中心、街上的小型商店等等)。所以……

  • 可以在内地换好港币现金,可能会被收一笔有人会觉得很亏的手续费。
  • 也可以在内地通过线上购汇再转账的方式购入一定量的港币,在香港提取(例如通过中国银行的 Mastercard 借记卡)。不过取款和查询余额也要手续费……
  • ……

顺便也推荐办一张八达通啦,几乎到处都能用。(咱会说还能当 amusement IC 卡用嘛(x)

八达通 Octopus

一些印象

港铁

作为全球最繁忙的铁路系统之一(拼不过北京地铁的原因可能是北京人多(雾)), 咱首先的印象就是快。高峰期几乎一辆一辆的来(诶?)

港铁荃湾站分散的闸机

因为没有安检,所以车站的闸机可以设置的很松散。东铁线因为是在曾经九广铁路的 基础上发展起来的,不少车站都在地面上,甚至可以实现入闸后直接上车。

市区线的车厢

头一次见到带那么多灯的车厢(x

以及运营时间很长(普遍是从 05:30-次日01:30,某些情况下例外),除了东铁线的过境车站 (罗湖和落马洲,因为两个口岸开的晚关的早)

某次的票价

速度快加上人均 GDP 的差异带来的影响就是票价,和深圳地铁全程最高 14 元(不含乘坐 11 号线商务车厢的票价,说实话这个商务车厢的设计好像也是从港铁东铁线上学来的耶) 相比,港铁的票价……说多了都是泪啊 😂

(上面那张图里 40 多港币的票价大多数是因为东铁线过境车站(落马洲和罗湖) 的票价比剩下的都贵的缘故)

东铁线的头等车厢

东铁线的头等车厢,额外费用是是当程东铁线车费:

  • 或者东铁线最低票价,如果有核准头等车厢的记录但最短乘车途径不含东铁线的话。
  • 该程车程涉及马鞍山线车程而另一站不在大围以北(例如:车公庙↔乐富),则须缴付相等于该段东铁线(大围↔九龙塘) 的车程普通等车费作为“头等额外费”。
  • 头等车厢不设补票,如乘客未持有效头等车票(头等单程票和已取得头等确认的八达通) 而进入头等车厢,一旦被检票员发现,须一律缴交附加费 HK$500。

看深圳地铁11号线的商务车厢票价多简单,直接就是票价的两倍 (最短换乘路线中如果不包含11号线时除外,4元)……

此外港铁还有连接的换乘站(例如香港(东涌线和机场快线)和中环(荃湾线和港岛线),两个 车站的付费区互相连接),和不相连的换乘站(例如九龙(东涌线),柯士甸(西铁线)和香港西九龙(高速铁路))

(虽然好像没什么值得记的……)

顺便再提一句,北京地铁 4/14/16号线和大兴线,杭州地铁1/5号线和深圳地铁4号线都是 港铁内地的合资公司(北京京港地铁有限公司和杭州杭港地铁有限公司) 或全资子公司(港铁轨道交通(深圳)有限公司)运营的,汝些许能在这些 线路上面看到港铁的一些影子。

港铁甚至还能影响内地的地铁公司, 例如深圳地铁那个神似港铁的 Logo (大嘘)

高速铁路

就是广深港高速铁路的香港段啦,港铁称为“高速铁路”。(虽然从标志到 设施还是那熟悉的港铁味道(?))

The Austins 里的指向牌,上面有高速铁路的标志

The Austins 里的指向牌,上面有高速铁路的标志。

香港西九龙站的高速铁路售票机

香港西九龙站的高速铁路售票机,能用八达通付款同时也能为八达通增值。

港铁动感号高速动车组的外部

中国大陆唯一一款出口型高速动车组——港铁动感号高速动车组。

这车上是有 WiFi 的,但是内地段上需要内地手机号或微信登录才能使用, 而且不能浏览某些网站。香港段上就没有这些问题。
两岸口岸

一线之隔的内地和香港口岸,内地口岸相当于香港中的一块飞地(?)

准备上车

杂记

……

终于摸到原版机啦(大嘘),以及魔理沙怎么成 tama 猫了……

……

香港的街机就是用的 1HK$ 的辅币,每局价格 6-12 HK$ 不等 (SOUND VOLTEX 这里是 2HK$ = 1 CREDIT)

深海旗鱼酥

深海旗鱼酥,为啥咱看一次就想笑一次呢…… 🤣

停止工作

……已停止运行……


再见还是欢迎回来?

再见还是欢迎回来? 😂

by ホロ at August 26, 2019 04:00 PM

August 21, 2019

中文社区新闻

tensorflow>=1.14.0-5 更新需要手动干预

tensorflow 包在 1.14.0-5 之前的版本缺少几个动态库的链接。这个问题已经在 1.14.0-5 中修复,所以更新过程需要覆盖掉 ldconfig 创建出的未被 pacman 跟踪的链接文件。如果你在更新时遇到如下报错

tensorflow: /usr/lib/libtensorflow.so.1 exists in filesystem
tensorflow: /usr/lib/libtensorflow_cc.so.1 exists in filesystem
tensorflow: /usr/lib/libtensorflow_framework.so.1 exists in filesystem

那么请使用如下命令

pacman -Suy --overwrite=usr/lib/libtensorflow.so.1,usr/lib/libtensorflow_cc.so.1,usr/lib/libtensorflow_framework.so.1

来完成系统更新。

by farseerfc at August 21, 2019 02:15 AM

August 16, 2019

百合仙子

寻找最快的 GitHub IP

本文来自依云's Blog,转载请注明。

部分国内网络访问 GitHub 会很慢,严重拖慢了学习和开发效率。除了使用代理绕路之外,有没有什么简便的办法呢?最近我写了个脚本,用来测试所有已经的 GitHub IP 并计时,然后就可以挑一个访问快的写在 hosts 文件里了。

获取脚本请访问 gh-check。脚本依赖 Python 3 近期版本及 aiohttp。

中国大陆目前自然解析 github.com,通常会得到位于新加坡的 IP。然而这几个 IP 的访问速度经常不怎么好。我之前是手动尝试使用西雅图或者阿什本的 IP,但是它们也并不总是很流畅。现在,终于可以让数据说话了:

gh-check demo

IP 来源于四个 GitHub 区域域名的解析结果,以及另外两个我自己通过 DNS 发现的。

检查分为两种:HTTP 和 SSH。默认两者都测试,可如上图中那样通过参数指定只测试一种协议。HTTP 测试时,会验证服务器的 TLS 证书。

by 依云 at August 16, 2019 12:06 PM

July 25, 2019

百合仙子

火狐远程调试火狐

本文来自依云's Blog,转载请注明。

F12。F1。开启 chrome 调试。开启远程调试。汉堡菜单,Web 开发者,浏览器工具箱。

如上操作,就可以打开一个专用火狐实例,连接到之前的火狐上,用来调试火狐的界面(chrome)了。

然而这里有个问题:这样你没法调试任何独占式的弹出菜单。不管是各种右键菜单,还是地址栏补全、汉堡菜单,它们一出现,就会捕获键盘鼠标,你根本不能操作别的窗口了。

遇到这种占用整个 X 服务器的情况,一种策略就是我上一篇文章里调试 fcitx 时那样,通过 ssh 连过来调试。然而火狐的 devtools 显然需要一个 X 服务器才能运行的。所以可以在另一台电脑上调试。当然单机也是有办法的啦——xephyr 就是为此而生的。pacman -S xorg-server-xephyr 就可以了。然后 Xephyr :1 -screen 1024x768 启动。

可还有个问题:之前的 devtools 打开的时候没给机会指定它在哪个 X 服务器上运行呀。虽然 GTK 有能力把窗口从一个服务器转移到另一个,但那也是需要程序主动配合的。不过既然叫「远程调试」的,应该也能像 Firefox for Android 那样通过网络连接才对?

于是搜了一下,果然找到篇 MDN 的文章讲这个的。简单地说就是加个参数就好啦:

DISPLAY=:1 firefox-nightly -no-remote -profile tmp --start-debugger-server 6100

最后要加个端口号,因为默认是 6000,和 X 服务器的冲突了……(我是说怎么明明在监听怎么就是连不上呢,原来连错程序了 QAQ)

然后在另一个火狐实例里打开 about:debugging 去连接就好啦。本地(localhost)连接的话,不需要额外的配置也不需要确认的。如果不是本地连接,还需要去 about:config 改两个选项。


花了些时间,把显示成两行的地址栏补全给弄回来啦~

火狐地址栏两行补全

样式表在这里。想用的话记得要把 toolkit.legacyUserProfileCustomizations.stylesheets 设置为 true 才会加载 userChrome.css 哦。

by 依云 at July 25, 2019 09:25 AM

July 21, 2019

百合仙子

fcitx 扩展:使用键盘粘贴选区(以及X选区原理科普)

本文来自依云's Blog,转载请注明。

之前的文章中介绍过,X Window 中有个很方便的名叫 PRIMARY 的「剪贴板」,选中即复制,中键即粘贴。

然而问题来了:我在输入的过程中需要之前选中的内容怎么办?又或者我的内容是通过 xsel、Vim 等程序以键盘的方式选中的,我还要继续打字,要怎么粘贴才比较流畅呢?

我之前的解决方案是 fcitx 自带的 fcitx-clipboard 扩展。启用之后可以按 Ctrl-; 来显示几条最近复制的内容。如果启用了的话,第一条、第三至最后,都来自常见的 CLIPBOARD 选区,而第二条(如果用了够久,第一条及本条有的话)是 PRIMARY 选区的内容。于是我只需要按 Ctrl-; 2 就可以粘贴了。

这么用了很久之后,我读到了一篇讲 X Window 选区是如何工作的文章。然后突然意识到一个问题:fcitx-clipboard 是什么时候请求选区内容的呢?

这里先科普一下好了。X Window 的每一个选区,是由某个窗口作为所有者持有的,并且在被请求时输出内容。「复制」的时候,内容并不会被存起来放在某处,而是窗口跟 X 服务器说,「我现在是这个选区的所有者了!」至于是哪个,取决于应用程序(及用户的操作)。通常用户明确的「复制」操作(Ctrl-C 快捷键、菜单项等)会使用 CLIPBOARD 选区,而只是选中内容的话,会使用 PRIMARY 选区。我还没有见到有程序使用别的选区的。

如果使用的是 PRIMARY 选区,这个时候,旧的所有者(如果存在的话)会失去选区。在 Vim / GVim 里,可视区域会由「Visual」高亮组变为「VIsualNOS」高亮组(在我的主题里就是变灰了),而多数终端,选中的区域会失去高亮。下一次,有程序想要「粘贴」PRIMARY 选区,就会跟 X 服务器讲,请把 PRIMARY 选区的内容,以某个指定的格式写到指定窗口的指定属性上。然后 X 服务器把请求传给选区所有者,选区所有者就去按要求写属性。当然选区所有者也可能会拒绝请求,比如它拥有的是文本而请求方想要图片。当然后来大家要粘贴的内容比较大了,于是就有了 INCR 机制来一点一点地传数据。

这样的流程,也可以解释,为什么我往 Telegram 里粘贴图片,GIMP 却莫名其妙地挂掉了……

所以啦,在一个程序里复制之后,退出那个程序,你就粘贴不出来东西啦。可这样岂不是很不方便?是啊,所以又有了剪贴板管理器。它们的工作原理我还没有研究,猜想是支持 SAVE_TARGETS 的话,就等着对方退出之前把内容传过来,不支持的话一复制就传过来。

fcitx-clipboard 是这么干的:选区一有变化,它就获取其纯文本格式的内容,符合一定条件的就存起来。所以,当我在 Vim 里用键盘不断进入可视模式选东西进行各种操作时,因为我设置了 clipboard=autoselect 选项,Vim 会不断地通告「我拥有 PRIMARY 选区啦!」「我这边的 PRIMARY 选区又更新啦!」结果就是,fcitx-clipboard 会不断地把我在 Vim 中选中的内容给拿过去。

就那么点数据,本地传来传去当然没啥问题。但是,当我通过 ssh 使用的时候,我发现我在 Vim 里每一次扩大可视区域都如此地艰难。不得已只好关了 autoselect 选项。当时我还以为就选点文本,怎么就这么慢呢,谁曾想到,每一次更新可视区域,fcitx-clipboard 都会把我选中的文本请求一份……

那么好吧,不用 fcitx-clipboard 了。于是问题又回到了原点:怎么通过键盘粘贴 PRIMARY 选区呢?用程序把鼠标移过去点中键是不行的,因为程序不会知道当前光标在哪里。通过 xdotool type 也行,但是这样一个个字地输入,而且还不仅仅是 ASCII,鬼晓得有多少程序跟 Minecraft 一样会处理不过来而丢字?而且,怎么判断当前是否是输入文本的状态也是个问题。所以我还是走输入法这条路了。

其实这事完成并不难,从肥猫的傲娇扩展开始改,照猫画虎地注册热键,然后请求选区,提交文本。可我遇到一个很奇怪的 bug:扩展加载了,但是热键不生效。为了调试这问题,我通过手机 termux ssh 连过来,tmux attach 上,然后用蓝牙键盘对着屏幕里那只由于 fcitx 被 gdb 停下来了因此从电脑收不到键盘事件的 tmux 调试好久,最终发现热键怎么没注册上,才找到配置文件里一处没有被更新到的 tsundere 字样……

这个扩展名叫 fcitx-paste-primary,源码放 GitHub 上了。Arch Linux 用户可以通过 AUR 或者 archlinuxcn 仓库安装 fcitx-paste-primary-git。

对了,差点忘了说,这个扩展「粘贴」的时候,只是把会被粘贴的文本提交给应用程序,程序并不会认为是真的粘贴,所以在一些需要区分的程序里会出现问题。比如 Vim 和 zsh,都会把来自 fcitx-paste-primary 的文本当作用户输入而非粘贴而可能造成问题。

by 依云 at July 21, 2019 04:10 PM

July 18, 2019

ヨイツの賢狼ホロ

iPod -- 在 2019 年

现在汝会用什么听音乐?装有 Soptify / Google Play Music / Apple Music 等有串流播放应用的手机应该是大多数。但是咱偏不想这么搞:

  • “使用其他的例如手机这样的「智能设备」,容易分散做一件事情的注意力” -- Miracle Milk

例如用手机听音乐的时候,通知会降低媒体音量,特别是群里灌水时那此起彼伏的 通知声一响,基本就听不见音乐了(雾)。所以有必要单独整个播放音乐的设备。

  • 串流音乐服务都不太好用,而且还有地区墙(某些歌只有某些地方能听到)
  • 手机的存储空间不够大,特别是现在无损(?)音乐越来越普及的时候。 (手持 256G 闪存甚至更大容量手机的土豪请无视这一句)

那为什么是 iPod 呢?其实很大一部分原因是身边朋友首先推荐的是 iPod ……

在 9102 年买一台 iPod

iPod 其实是 Apple 出品的一系列音乐播放器,大致有这么几个产品线:

(iPod Shuffle 5th Gen、iPod Nano 6th Gen、iPod Classic、iPod Touch)

  • iPod Classic 系列 (但只有第六代(也是 Classic 最后一代被称作 “iPod Classic”) ,使用 1.8 寸微型硬盘作为存储介质。
  • iPod Mini 系列,比 iPod Classic 略小,使用 1 寸微型硬盘作为存储介质。 不过很短命的只发表了两代就被 iPod Nano 取代了。
  • iPod Nano 系列,比 iPod Mini 更小更薄,使用大小不等的闪存做为存储介质,后期型号 还加入了触摸屏支持。
  • iPod Shuffle 系列,和 Nano 系列的区别就是没有屏幕,而且容量都偏小。

以上系列均已停产(x),现在 Apple 还在销售的就是以 iOS 为基础的 iPod Touch 系列了……

咱是捡了一台二手的 iPod Video (iPod Classic 系列的第五代),至于为啥是这个待会儿会讲。

iTunes or Rockbox ?

既然是苹果家的设备, 通过 iTunes 同步就是基本的操作啦 (虽然 macOS Catalina 里 iTunes 消失了,原有的功能被 Finder 和新的若干个应用取代), 但是……

  • iTunes 不支持很多常用的音乐文件格式,例如 FLAC / CUE 啥的, 虽然能用一些工具转换但是还是好麻烦的样子……
  • 通过 macOS 格式化的 iPod 不能在 Windows 上使用,反之亦然。
  • ……

如果汝已经是 App$e 全家桶的受害者,或者 iTunes Store 里买了很多音乐的话,那倒是可以接着用。 但是咱不是, 所以碰巧听说了一个名为 Rockbox 的固件。

Rockbox is a free replacement firmware for digital music players.

https://www.rockbox.org/

虽然官网一副上个世纪的模样但其实还在更新……

Rockbox 支持的 Apple 设备中 ,iPod Video 大概是最新(?)的了(iPod Classic 的支持在 7/19 还是 unstable……)。

所以就是它啦(大嘘)

安装 Rockbox

其实挺简单的, Windows / macOS / GNU/Linux 上都有 Rockbox Utility , 下载安装然后按着提示操作就 OK 😂

不过需要 Windows 格式的 iPod ,如果汝手上的 iPod 是 macOS 格式的话需要用 Windows 的 iTunes 格式化一下,或者 参考 Rockbox Wiki 手动格式化一下。

安装完之后通常会自动重启进入 Rockbox ,如果在 Hold 开关锁定的情况下开机 就会进入原来的系统。

一些魔改(?)思路

iPod Video 使用的是 ZIF 接口的微型硬盘(说到底还是个 HDD), 汝甚至能有机会听到磁头在 iPod 里旋转的声音(x

所以现在流行起来了给 iPod 改存储,常见的方案有两种:

  • 改成 ZIF 接口的 SSD,如果是厚机(60-80G 版,或是自己换个厚壳)换上半高 SSD 以后还有机会改大电池。就是这种接口的 SSD 不太好找(淘宝上貌似某国产品牌居多?), 而且还贵(120G 的能卖到 500¥ 信不信?)
  • 通过 ZIF 转 CF 卡接口上 CF 卡,优点是便宜(如果用 microSD 卡转 CF 卡套说不定更便宜), 而且据说比 SSD 省电?(然后翻了两次车的某狼表示 emmm……)

具体的操作方法呢搜索一下大概就能找到,如果汝也和咱一样是 iPod Video 用户的话可以 从这几篇文章开始:

At last ......

My iPod

啊有人觉得 unifont 很难看? 自己编译一个别的就好啦(?)


感谢 好耶实验室的 Miracle Milk 的各种想法和在咱 买 iPod 到改机上提供的各种建议和帮助。

by ホロ at July 18, 2019 04:00 PM

July 14, 2019

ヨイツの賢狼ホロ

AOSCC 2019 游记

“安徽合肥,安徽合肥,AOSCC 又倒闭了……”

“安徽同志们终于来到了安徽(x)”

……

Day -2 - 为啥咱没写 2017 ?

因为咱没去鸭(x),可以去它们的网站上阅读总结: https://aosc.io/news/5959-aoscc-2017-re-cap

Day -1 - 为啥咱没写 2018 ?

还是因为咱没去呀(xx),而且那年因为某些不可抗力原因没有开成线下活动。 还是可以去它们的网站上阅读检讨: https://aosc.io/news/4606-aoscc-2018

Day 1 - Zzzz......

(因为刚坐了一夜的火车就直奔会场了, 所以没提到的部分……

  • 要么是睡过去了,
  • 要么是没听懂去闲逛了没留下照片
  • 要么是当事人不愿意露脸(?)
  • 要么是听得投入没拍照……

😂)

以及所有演讲的 Slide 可以在 AOSC OS 的仓库服务器 上找到。

Lecture 催眠力 +100%

祖传(?)易拉宝上线(雾)

祖传(?)易拉宝上线(雾)

AOSC Retro 展示设备

运行为旧硬件特化的 AOSC OS 的一些设备(PineBook(并不是 AOSC OS Retro 展示设备),PowerBook G4, iBook G3 和 Sony VAIO PCG-C1VN)。

“AOSC OS,关爱您、您的开发板、您的谜之处理器和您的史前遗产”—— imi415
AOSC OS 展示设备

与之相对的就是一些运行 AOSC OS 的“现代”设备啦~

好想上安徽女同志网啊……
贴纸

今年的贴纸, 在成为造梗发行版的路上越走越远……

可以在 AOSCC 的仓库 下载到 每一个贴纸的源代码(?)

直播准备中

直播准备中,“虽然不知道为什么每一次 AOSCC 都能遇上网络问题……”

果冻之谢罪

首先是来自 特首果冻 Jelly Mingcong Bai 的谢罪(雾),解释了为啥 AOSCC 2018 迫不得已(?)搞成了线上活动,还有最近两年的成果什么的。

常联系啊

“常联系,啊” -- Mingcong Bai

Junde Yhi

Junde Yhi 分享他编译和在 X200 上安装 Libreboot 的经验和心得。

“Libreboot 的构建工具好难用的……”

Play with OriginCode

见到 陈先生 橙喵 OriginCode 啦,开心 ~ 还互相交(mai)流(ruo)了下……

AOSC OS 7 -- Gumblex

顺便提一下,AOSC 下一个 Release(?) 的 Codename 是社区开发者之一的昵称 Gumblex 哦~

(虽然当事人当时并不在场)以及并没有在去哪里吃饭这个问题上达成一致。

チェン | 😸 | 🥬 | ExOrigin v15.8, [11.07.19 18:56]

話說午餐怎麼解決喵(

Mingcong Bai, [11.07.19 18:57]

[In reply to チェン | 😸 | 🥬 | ExOrigin v15.8]

饿着

没有……没有……没有……通过!

Day 2

@Gumblex
@Gumblex

新 Codename 登场! 😂

Gumblex 介绍了由他制作的 AOSC Packages 网站的功能,和 AOSC OS 软件包的质量检测和保障等等。

@Gumblex

刚将军与刚将军(

PowerBook G4 PowerBook G4

正在准备今天抽奖的奖品——PowerBook G4。

Apple Pencil

哇,有生之年第一次见到充电中的 Apple Pencil 耶(x

胶片相机

正在用胶片相机拍照的……

ThinkPads

AOSC ThinkPad 用户组再聚首(请无视旁边的 PineBook (x))

KexyBiscuit

Kexy Biscuit 给 AOSC 带来了 以敏捷流程优化社区开发工作的尝试的建议。

Day 3

Flashing coreboot

现场拆机刷 coreboot 中……

Junde Yhi x2

又是 Junde Yhi,先是因为各种咕咕咕了的 Installer 谢罪 检讨, 然后介绍了新 AOSC DeployKit 的计划。

Junde Yhi x2

咕咕咕预定(x

Mingcong Bai x2

特首的大抄(雾)

meet cuihao

另类面基证明(?)

USTC Mirrors

作为东道主(?)的 USTC 也有人来分享 USTC Mirrors 的心路历程。

Playing VOEZ

AOSC 人均单手神仙 tkpl(太可怕了)

confusing

迷惑行为大赏之保健粉笔(

不过还真的有中药加石膏制成的保健粉笔 😂

CN1071122A 一种药物保健粉笔的制作方法

Extras

江镇包子铺

主 谓 宾 (

欢迎饮品

要素察觉(

红茶

要素察觉x2(

emmm

能走上 (?) 19 楼塞下这个也是挺不容易的啦 😂

One More Extras

Junde Yhi, [14.07.19 20:21]
[In reply to アカネチャン]
您打音游的照片要放到新闻里去

アカネチャン, [14.07.19 20:21]
[In reply to Junde Yhi]
这信息量太大了吧(

Junde Yhi, [14.07.19 20:22]
我要向各位学习除下落式以外的音游

., [14.07.19 20:23]
[In reply to Junde Yhi]
向音游导师 @Kotonoha_Akane 学习

アカネチャン, [14.07.19 20:24]
导(gao)师(shi)

., [14.07.19 20:24]
果冻说的要是我是老师一个粉笔丢过去

アカネチャン, [14.07.19 20:24]


アカネチャン, [14.07.19 20:25]
然而它不是)

アカネチャン, [14.07.19 20:25]
所以我逃过一劫?😂

Mingcong Bai, [14.07.19 20:25]


liushuyu, [14.07.19 20:27]
别怕,是 保健粉笔(

Xiaoxing Ye, [14.07.19 20:28]
昏睡粉笔

アカネチャン, [14.07.19 20:28]
某种意义上真的会昏睡(

Neruthes AFB3373F5200DF38, [13.07.19 22:01]
那么有人要来开夜谈会吗

Neruthes AFB3373F5200DF38, [13.07.19 22:01]
欢迎来 2013

Neruthes AFB3373F5200DF38, [13.07.19 22:12]
cc @Staph @JeffBai etc

Mingcong Bai, [13.07.19 22:13]
Nope (

Neruthes AFB3373F5200DF38, [13.07.19 22:21]
没有,通过!

Neruthes AFB3373F5200DF38, [13.07.19 22:21]
去做大保健了

所以今年没有钦定 AOSCC 2020 的位置鸭(咕咕咕)

by ホロ at July 14, 2019 04:00 PM

July 11, 2019

中文社区新闻

libbloom>=1.6-2 更新需要手动干预

libbloom 包在 1.6-2 之前的版本缺少了一个动态库的链接。这个问题已经在 1.6-2 中修复, 所以更新过程需要覆盖掉 ldconfig 创建出的未被跟踪的链接文件。如果你在更新时遇到这样的报错:


libbloom: /usr/lib/libbloom.so.1 exists in filesystem

请通过:


pacman -Suy --overwrite usr/lib/libbloom.so.1

来完成更新

by farseerfc at July 11, 2019 01:12 PM

June 30, 2019

中文社区新闻

mariadb 10.4.x 更新需要手动干预

遵从上游的建议, mariadb 更新到 10.4.6-1 或者之后的版本需要改变配置文件的布局。
主配置文件的位置从 /etc/mysql/my.cnf (以及它的引入文件夹 /etc/mysql/my.cnf.d/ )移动到了 /etc/my.cnf (相应的 /etc/my.cnf.d/ )。请确保迁移您的配置。

逐实例的服务(像 mariadb@foo.service 这种)不再用单独的文件配置(像 /etc/mysql/myfoo.cnf 这种),而是移动到了主配置文件中的带群组后缀的配置块里面,每个服务一个带后缀的配置块。一个配置块看起来类似这样:


[mysqld.foo]
datadir = /var/lib/mysql-foo
socket = /run/mysqld/mysqld-foo.sock

和之前几次 mariadb 功能性升级一样的是,这一次也需要升级 data 文件夹。在修改好配置文件之后请运行以下命令进行升级:


systemctl restart mariadb.service && mariadb-upgrade -u root -p

by farseerfc at June 30, 2019 07:52 AM

June 03, 2019

Lainme

在CentOS 7上安装Dropbox

因为工作上的一些缘故必须使用centos 7,但现在dropbox必须要glibc2.19以上才能运行,还不能用旧版本。

去年的时候,这个问题还能用glibc版本号欺骗的方式绕过去,但现在一定要实际的glibc2.19以上才行。解决的办法只能是自己编译一个高版本的glibc供dropbox使用。具体方法参考了此文:https://gist.github.com/jazzl0ver/d896ddf16fe2c39fb7ab52df47dcd2f0

编译的glibc放到家目录或者/opt都行。以/opt为例,先准备配置文件

sudo mkdir -p /opt/glibc-2.27/etc/ld.so.conf.d
sudo cp /etc/ld.so.conf /opt/glibc-2.27/etc/
sudo cp /etc/ld.so.conf.d/kernel-$(uname -r).conf  /opt/glibc-2.27/etc/ld.so.conf.d

然后进行编译

wget https://ftp.gnu.org/gnu/glibc/glibc-2.27.tar.gz
tar xzvf glibc-2.27.tar.gz
cd glibc-2.27
mkdir build
cd build
../configure --prefix=/opt/glibc-2.27
sudo make
sudo make install

再安装dropox并用patchelf更改一些链接信息

cd ~ && wget -O - "https://www.dropbox.com/download?plat=lnx.x86_64" | tar xzf -
ver=`cat $HOME/.dropbox-dist/VERSION`
dir=$HOME/.dropbox-dist/dropbox-lnx.x86_64-$ver
patchelf --set-interpreter /opt/glibc-2.27/lib/ld-2.27.so  $dir/dropbox
patchelf --set-rpath /opt/glibc-2.27/lib $dir/dropbox

之后再链接一些系统的lib过来

ln -s /lib64/libgcc_s.so.1 $dir
ln -s /usr/lib64/libstdc++.so.6 $dir
ln -s /lib64/libz.so.1 $dir
ln -s /lib64/libgthread-2.0.so.0 $dir
ln -s /lib64/libglib-2.0.so.0 $dir

这样基本好了,不过只复制这些lib似乎并不能让GUI正常工作,只能用命令行的Python脚本来控制。命令行版下载地址:https://www.dropbox.com/download?dl=packages/dropbox.py

此外dropbox的启动也需要一些额外参数,最好建立一个bash脚本,方便调用

#/bin/bash
ver=`cat $HOME/.dropbox-dist/VERSION`
dir=$HOME/.dropbox-dist/dropbox-lnx.x86_64-$ver
LD_LIBRARY_PATH=$ver DISPLAY='' dropbox.py start

另外,现在dropbox更新的挺勤快,而且每次都要强迫升级客户端,否则就罢工,所以时不时就需要把patchelf后面的步骤重新操作一遍。真的很烦。可以考虑再写一个脚本,专门拿来更新dropbox,比如

upgradedropbox.sh
#!/bin/bash
 
cd ~ && wget -O - "https://www.dropbox.com/download?plat=lnx.x86_64" | tar xzf -
 
ver=`cat $HOME/.dropbox-dist/VERSION`
dir=$HOME/.dropbox-dist/dropbox-lnx.x86_64-$ver
 
patchelf --set-interpreter /opt/glibc-2.27/lib/ld-2.27.so  $dir/dropbox
patchelf --set-rpath /opt/glibc-2.27/lib $dir/dropbox
 
ln -s /lib64/libgcc_s.so.1 $dir
ln -s /usr/lib64/libstdc++.so.6 $dir
ln -s /lib64/libz.so.1 $dir
ln -s /lib64/libgthread-2.0.so.0 $dir
ln -s /lib64/libglib-2.0.so.0 $dir

by lainme (lainme@undisclosed.example.com) at June 03, 2019 12:16 PM

June 01, 2019

Phoenix Nemo

软件工程实践上的一点思考

曾经大学时对于软件工程这类理论课不屑一顾,认为这些课本都是只在大学里讲学而并不实际参与工程的教授写的东西。但是经过这些年从自己开发程序编写代码,到与公司团队同学、兴趣圈的朋友一起开发项目,也积累、总结了一些经验和教训。正巧昨晚在游戏建设里参与了这类讨论,于是记下一些思考免得忘记。

案例 1

命令方块是 Minecraft 里用于执行游戏命令、实现各种触发性或持续性功能的方块。在游戏地图中需要展示一些浮空的名称标签,便是用命令方块生成隐形盔甲架实现的。这些盔甲架参数复杂且需要在地图里很多特定位置生成,负责的同学便在每个生成的位置下面放了重新生成的命令方块,生成的坐标是相对坐标,因此写好标签的命令方块便可被无限复用。

由于盔甲架属于实体,而实体在 Minecraft 中被认为是不可靠的:有无数种可能这实体会被移动或被清除。
因此我的建议是:将这些命令方块全部放到控制室,坐标写成绝对坐标并加上统一标签,便可做到一键生成全部、一键清除全部。

该同学表示:不想写绝对坐标,因为很麻烦。

案例 2

由于游戏玩法的需要,编写了新的插件。几天后按照原计划应当可以准备第一次基本功能测试时,负责开发的同学表示只写了大约 1/4 的功能。进度很慢的原因是 Minecraft 的实现过于糟糕,而 Spigot 和 Paper 等修改版也没有很好封装 API 导致几乎所有的事件都需要手动处理。

接下来的协同开发中该同学又在反复尝试对配置文件中属性类似的部分使用同一个序列化/反序列化方法处理、对不同配置文件中的不同物品记录项也加上了一层包装来使得其能够被一个序列化/反序列化方法处理、在其他一些程序逻辑上也在尝试复用代码减少冗余度。

我说,你先专心把功能快速叠出来,然后再去想优化的事情。
这位同学表示不能接受,他认为代码应该从编写时就是整洁的。

论点:矫枉过正的代码复用

代码复用是很常见的代码结构优化方式。更少的代码冗余可以减少维护的复杂度,也降低出错的可能。

但是在案例 1 中,如此复用代码(放置同样的命令方块)却实际上造成了更多的冗余:如果要修改一个属性,就需要记录整个世界里每一个命令方块的位置,然后一个个去修改它。相反,由于游戏世界地图里的建筑几乎不可能变化(虽然现实需求很少会有这种条件),统一放在控制室、hard code
所有的坐标作为一个大方法调用,却是在这需求前提下的更好的实现方式。如果需要修改属性,可以只在一个地方修改所有的命令方块。

或者说,重复放置命令方块的过程,就是 copy’n’paste 冗余代码的过程。

而案例 2 则更具有代表性。在项目初期,是否应当关注代码质量?
我认为是应当关注的,但是这基于开发者的工程实践经验。优秀的、熟练的开发者应当在代码编写时就能灵活使用各种简单的优化手段减少初期的代码冗余,但是对于在校大学生没有足够的项目经验时,面对紧凑的项目时间安排应当集中更多精力实现功能。此时过分关注代码优化会被分心导致各种问题——例如这位同学编写的代码基本没有能够一次通过所有测试的情况,而且绝大多数的错误都看起来只是粗心,并不是不理解、写不出的问题。

论点:实现,调整,优化

“Make it work, make it right, make it fast.” – Kent Beck

这是很多软件工程推崇的敏捷开发指导方向。在案例 1 中,该同学只做了第一步——复用同样的、带有相对坐标的命令方块(方法)快速实现了所有的功能。但是从后续维护的角度来讲,这样的实现没有 make it right,更不用提 fast。

而在案例 2 中,这位同学将三个阶段在初期就全部揉进去,但是由于工程经验不足,在思考优化方案时花费了过多的精力,也导致了代码精度不够,反复修改也无法顺利通过测试。

从个人经验来看,前期的代码编写应注重功能实现,并在编码能力基础上直接编写清晰的代码结构。功能实现后,再根据需求和测试中的问题「重构」打磨细节、尝试更好的实现方式。这个过程不仅在完善整个程序,对自己的系统架构把握和设计经验也有很大的提升。最后一个阶段,则是针对性的优化少量代码使整个系统更加稳定、高效。

论点:架构的改动

这是一个比较小型的项目。需求和基本功能架构从一开始便已经讨论清楚。后续的调整不大,但是每当有少量的需求修改或架构微调,都导致了很大的代码变动。而按照这位同学的思路,每次改动都要重新思考代码结构,这浪费很多的时间。

从实际工程角度,需求变化并带来架构的微调甚至大改动都可以说是很常见的事情。在前期编码实现阶段如果揉入过多对于代码结构的过多考量,每次改动都可能会使这些思考的时间被浪费。因此,在前期编码时不应为架构考虑消耗过多的时间,而在重构过程中,由于已经完成基本的功能实现,且对已有代码还处在熟悉的热度,可以快速适配需要修改、调整的架构,并基于前期编码时的各种尝试和实验的结论选择最佳的实现方式。

以上是基于近期项目中的讨论,在软件工程层面上的思考。如有缺漏不当之处,欢迎指正。

曾经大学时对于软件工程这类理论课不屑一顾,认为这些课本都是只在大学里讲学而并不实际参与工程的教授写的东西。但是经过这些年从自己开发程序编写代码,到与公司团队同学、兴趣圈的朋友一起开发项目,也积累、总结了一些经验和教训。正巧昨晚在游戏建设里参与了这类讨论,于是记下一些思考免得忘记。

June 01, 2019 06:04 AM

May 26, 2019

ヨイツの賢狼ホロ

各自开始的新生活

总有一些开始和结束值得留念。

结束了。

布偶君 <shadowrz@disroot.org>
离别告知,能扩散多远就扩散多远
如果你们能看到这句话的话,
我告诉你们点东西。

以前的我,各种意义上都很正常。嗯,这很好。
也许是直到和你们接触开始,
家长发现我自己总是和别人有不一样的想法和性格。

然后,各种各样的矛盾接踵而至……
……我的性格影响了好多人——它变坏了。
……争执,吵闹,宛如发疯……

昨天我和父母吵了起来,他们一定要看我在用电话做什么。我要是不让他们看,就会觉得是电话害了我(我现在才发现)
然后我只有妥协的命(不然他们不会让我玩的,这样的话也会是离别)。
于是他们(只)看到了 #archlinux-cn-offtopic 的聊天记录,
然后……他们……
……觉得你们都是一群疯子……
希望我永远不要记起你们……
还说做不到就要不停吃药,死也可以……
还要彻底删掉你们,让你们碰不到我……

…………

为什么,为什么会变成这样啊!!!!
我和你们这些年……为什么让我变成了一个不能在世界存活(没人接受我的性格)的状态啊!!!!!!!

告诉我回答啊啊啊啊啊啊啊啊啊啊啊!!!!!!!!!!!!!!

--
布偶君 | 雨宫恋叶 | ShadowRZ (同一身份)
2019-05-22

Update (2019/05/23, ref https://wxw.moe/@ShadowRZ/102142677608282951 ):

我再声明几点:

1. 只是退群+不和你们往来而已
2. 不想反对父母,不要对我提这样的建议
3. 对话都给父母看了(除私信)
4. 以后不在处理任何通知,包括小号
5. 我不会再依存于你们
6. 现在父母也希望非常非常了解我

望周知。
2019-05-23
(为什么好好的告别,说了三天)

愿他安好。

(不知道以后还有没有机会在“没有黑暗的地方”相见……)

开始了。

开始了?

https://twitter.com/Ken_Ookami_Horo/status/1128784581400727553

  • 去深圳啦 ~
  • 在去之前买了很多稀奇古怪(?)的家伙(例如某地狱牌交换机,某粗粮牌玻璃板和某雨林牌泡面盖什么的 😂)
  • 见到了大学同学 x1 (以后说不定会有 x2 , x3 ?)
  • 当然不是去玩的 😢 (结束了长达六个月的失学无业辣鸡时光(x))
  • 从公司收到台新笔记本,然后发现手边的内存装不上去只好现买 😂
  • 说不定有机会……?
  • 就这样。

by ホロ at May 26, 2019 04:00 PM

May 08, 2019

Phoenix Nemo

WireGuard 真香

真是老了跟不上时代了,这么好的东西为什么我现在才开始用??

其实这东西刚出来就在关注了不过确实前段时间才有机会尝试折腾一下。优点很多,也有无数人写过文章介绍,所以就不再多废话。主要看中它的 PtP 特性(服务器之间)和支持漫游(服务器-客户端)。当然目前在梯子方面的表现,即便是优秀的隧道方案,但由于折腾的人多了,面对万里城墙,这谁顶得住哇。

所以本文只讨论 WireGuard 作为访问企业网的隧道方案,算是初步折腾的笔记。

服务器配置

一个基本的 PtP 配置结构 /etc/wireguard/wg0.conf

1
2
3
4
5
6
7
8
9
[Interface]
Address = 10.0.0.1/32
PrivateKey = [CLIENT PRIVATE KEY]

[Peer]

PublicKey = [SERVER PUBLICKEY]
AllowedIPs = 10.0.0.0/24, 10.123.45.0/24, 1234:4567:89ab::/48
Endpoint = [SERVER ENDPOINT]:48574
PersistentKeepalive = 25

生成私钥

1
2
wg genkey > privatekey
chmod 600 privatekey

基于私钥生成本机的公钥

1
wg pubkey < privatekey > publickey

或者一步完成的操作

1
wg genkey | tee privatekey | wg pubkey > publickey

额外生成预共享密钥来进一步增强安全性

1
wg genpsk > preshared

这样服务器之间的互联配置就基本完成了。使用 wg-quick up <config> 来快速启动 WireGuard。

如果要配合客户端使用,则需要配置 NAT。顺便如果客户端没有 IPv6,也可以通过此法来给客户端提供 IPv6 Enablement。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[Interface]
Address = 10.200.200.1/24
Address = fd42:42:42::1/64
SaveConfig = true
ListenPort = 51820
PrivateKey = [SERVER PRIVATE KEY]

# note - substitute eth0 in the following lines to match the Internet-facing interface
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE; ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

[Peer]

# client foo
PublicKey = [FOO's PUBLIC KEY]
PresharedKey = [PRE-SHARED KEY]
AllowedIPs = 10.200.200.2/32, fd42:42:42::2/128

[Peer]
# client bar
PublicKey = [BAR's PUBLIC KEY]

AllowedIPs = 10.200.200.3/32, fd42:42:42::3/128

在此例中需注意 Allowed IPs 不可 overlap 否则会造成包转发错误。

客户端

与上文中服务器配置相照应的客户端配置示例如下:

1
2
3
4
5
6
7
8
9
10
11
[Interface]
Address = 10.200.200.2/24
Address = fd42:42:42::2/64
PrivateKey = [FOO's PRIVATE KEY]
DNS = 1.1.1.1

[Peer]
PublicKey = [SERVER PUBLICKEY]
PresharedKey = [PRE-SHARED KEY]
AllowedIPs = 0.0.0.0/0, ::/0
Endpoint = [SERVER PUBLIC IP ADDRESS]:51820

客户端的 AllowedIPs 如果使用 catch-all 0.0.0.0/0, ::/0 也就会默认转发所有的流量到服务器。该选项实际作用是路由表,控制哪些流量需要经由服务器转发。

配置完毕即可使用 wg-quick up <config> 启动 WireGuard。如果一切顺利,通过路由追踪应该可以看到流量已经交由服务器转发。

总结

由于工作需要,经常合上笔记本动身前往其他地方。在接入传统企业网例如 L2TP/IPSec 甚至 AnyConnect 都无法保证设备下次进入工作状态时可以立即恢复连接。而 WireGuard 在不同网络、不同地域、不同网络中断时间等各种情况下均可在下次进入网络覆盖时立即恢复连接,再也不必担心网络中断恢复时手忙脚乱配置隧道或者不小心泄密啦。

目前唯一的不足,大概就是还没有 Windows 客户端,没有办法推广到非技术部门(虽然影响不到我…

总之,真香.jpg

Reference:

[1] https://wiki.archlinux.org/index.php/WireGuard

真是老了跟不上时代了,这么好的东西为什么我现在才开始用??

May 08, 2019 02:43 PM

April 19, 2019

ヨイツの賢狼ホロ

离开 Google 的 Android 之路

好聚好散?

要说现在流行的移动设备操作系统的话肯定有 Android 的一席之地,Google 在 AOSP 下 开放了 Android 的大部分源代码,吸引了众多硬件生产商和开发者。

如果汝是 Android 用户的话,有没有做过这些事情了呢?

  • 获得手机的 Root 权限(从 Zergrush 到 SuperSU 再到 Magisk?)
  • 安装第三方 Recovery 和 ROM(甚至自己移植流行的 ROM 到自己的手机上,从此 踏上了一条不归路……)
  • 各种方式修改系统(修改系统分区, Xposed 和 Magisk 等等)
  • 刷写或自制定制内核。
  • ……

然而时过境迁, Google 已经不是以前那个不做恶的 Google 了, Stallman 也撰文声讨过: https://stallman.org/google.html

所以 Google 使了哪些坏?

罄竹难书啊(大嘘)

  • Google 自己开发了一套私有的称作 Google Mobile Services 的软件包,包含了大多数 的 Google 应用,也有迹象表示 Google 正在把越来越多 AOSP 里的东西塞进 GMS 里。
  • Google 网站越来越依赖非自由的 JavaScript (虽然这大概是现在的趋势吧,唉……), 甚至登录和注册都需要。
  • 任何大体量的公司都容易被用于大规模监控, Google 也不例外。(人家也是要恰饭的不是?)
  • 有新闻报道称 Google 终止了转卖 Pixel 手机的用户的 Google 账户。(服务的使用条款能扩大到物理设备么)
  • Google 愈发向审查妥协,例如 不再支持域前置同意为部分政权提供审查支援 等等。

所以是时候放弃 Google 了(雾)

等等我们一直就没有用 Google 啊 -- 来自地球外的某处

开始之前?

开始之前的话,汝最好准备一部合适的 Android 手机,那么什么样叫做合适呢?

  • 最好有流行的第三方 Android ROM 适配(例如 LineageOS 等等)

    • 能解锁 Bootloader 大概是这个的充分条件。
    • 因为第三方 ROM 一般都不含 Gapps,所以适合用作基底。
    • 所以内置 GMS 的 ROM (例如 Pixel Experience) 不在推荐范围内。
    • 特别的,虽然 /e/ 在做的事情和咱现在做的事情类似,但是有不少人不推荐, 例如 https://ewwlo.xyz/evil
  • 至于哪些手机解锁 Bootloader 的难度,咱踩过的坑(?)有:

    • 早些年的不少手机是没有锁的,不在意性能的话可以考虑。(例如以前的小米和三星?)
    • 能通过一条命令( fastboot flashing unlock )解锁的设备 非常值得推荐,例如 Nexus/Pixel 和 OnePlus。
    • 像 Moto / LG / HTC 之类的主流厂商会要求汝去它们的网站上 提供一些信息生成一些解锁代码,有一点点麻烦,但又不是不能用~
    • 有些厂商解锁会失去一些功能(例如 SONY,解锁会使 TA 分区无法访问,典型 的副作用就是相机退化),如果汝不是很需要那些功能的话再考虑。
    • 有些厂商虽然允许解锁,但解锁条件过于刁钻(没错说的就是现在的小米)。 只有在汝能忍受那些恶心的条件的情况下才能考虑。
    • 有些厂商不给官方解锁,但奈何不了有些野路子(例如 HMD 的 Nokia),虽然 算作能解锁,但因为不容易的缘故,大概没有多少人为它开发。
    • 不能解锁的厂商当然不要考虑啦。 (蓝绿海军警告,以上)

在这篇和接下来的文章(如果有的话,咕咕咕)里咱就拿一台 OnePlus 3 作为演示机咯~

然后备份好所有的数据(这不是废话么)

microG - 自由的 Google Service Framework 实现

A free-as-in-freedom re-implementation of Google’s proprietary Android user space apps and libraries.

microG 是一组代替 Google 私有的 Android 程序和库的程序和库的合称。 像 Google 之类的服务大概很难一下完全放弃的, 那就慢慢来好了……

然而不少应用只认 Google 的 Google Play Service 的签名,所以咱们还需要摆弄一下系统 让它把 microG 的签名当作 Google 的。放在一起的话方法有很多:

在经历了各种方法把 microG 安装上以后,可以通过 microG 自己的 Self Check 确认 microG 的工作状态。

MicroG 的自检

接下来像普通的方法一样添加 Google 账户啦,不过咱用的时候有注意到几个问题:

  • 不能添加 G Suite 账户(?)
  • 咱不打开 microG 里的 Google Device Registration 的话没法保存 Google 账户的信息。

又不是不能用*2

如果汝哪一天下定决心完全告别 Google 的话,只要把这些东西卸载掉就 OK(大嘘)

Yalp Store - Google Play 商店的替代品

Yalp Store lets you download apps from Google Play Store as apk files. It can search for updates of installed apps and lets you search for other apps.

Yalp Store 可以直接下载 Play 商店上的应用,如果汝在里面登录了汝自己的 Google 账号, 可以下载汝购买的付费应用。

(虽然 Yalp Store 的开发者说这么干其实会违反 Google Play 商店的 TOS 因此有帐号被关闭 的风险,但是 Yalp Store 内置的 Google 帐号还存活,也没有听说过谁因为用了它被封号……)

可以在 F-Droid 上找到 Yalp Store ,或者 去它们的 Github 上下载 , Magisk 上有 Yalp Store 安装为系统应用的模组包。

F-Droid - 自由的 Android 应用程序仓库

F-Droid is an installable catalogue of FOSS (Free and Open Source Software) applications for the Android platform. The client makes it easy to browse, install, and keep track of updates on your device.

F-Droid 是一个应用目录应用,很像 Play 商店对不对?不过这里面收录的全是自由软件 (至少客户端是,虽然某些软件会有一些诸如会推广非自由服务的“反功能”)。 通过 F-Droid Priviliged Extension 可以做到自动安装应用等额外功能。

可以从这里下载 F-Droid :https://f-droid.org/en/ , Magisk 仓库中有 F-Droid Priviliged Extension 模块,NanoMod 也提供了 F-Droid 模组。

Guardian Project - 保护手机用户的隐私和自由

While we think that a secure, privacy-enhanced mobile phone is a good thing for just about anybody going about their daily lives, we like to also consider the extreme cases, where this technology might change the course of someones life.

Guardian Project 是一群开发保护手机用户隐私应用的开发者,最出名的作品是 Orbot 和 Orfox ,将 Tor 带到了 Android 的世界中。

除了 Play 商店以外,汝也可以添加它们的 F-Droid 仓库: https://guardianproject.info/fdroid/

旅途愉快 :-)

by ホロ at April 19, 2019 04:00 PM

April 09, 2019

百合仙子

T470p 使用N卡运行 Xorg

本文来自依云's Blog,转载请注明。

这么做的原因是:这样 minecraft 帧率高,不卡顿。

  • intel 显卡:帧率低,好像是20fps左右吧。开不了光影
  • optirun:坏了
  • primusrun:帧率高了一些,不多
  • nvidia-xrun:丝般顺滑,只是切换回我之前跑程序的 Xorg 时,发现我的 Awesome 已经没了。一开始是黑屏,经过配置之后倒是能得到 LightDM 的登录画图。另外 nvidia-xrun 无法卸载模块,因为被 Xorg 使用了,需要停止 lightdm。

那么,既然 nvidia-xrun 效率不错,我要是把整个桌面都搬上去呢?经过了一些折腾之后,取得了不错的结果。一个意料之外的好处是,播放视频、网页浏览器里滚动页面时常出现的画面撕裂好了~

当然这样做会费电,降低续航时间。不过既然是 T470p,一开始我就没打算整天带着它到处跑,所以无所谓啦。需要的时候再切回去好了。有个叫 optimus-manager 的软件,看介绍是帮助这么切换的。不过我对一切自动化程度太高的软件都心存疑虑,不确定它到底干了什么,会不会和我其他的配置相冲突。所以以后再看看啦。

最终的配置方案是这样的——

首先,把 bumblebeed.service 关掉并禁用。

然后,Xorg 配置一份,放 /etc/X11/xorg.conf.d/ 下就好。这份配置来自于惠狐的《Archlinux 下 Intel 和 NVIDIA 双显卡 de 折腾笔记》一文。

Section "OutputClass"
    Identifier "intel"
    MatchDriver "i915"
    Driver "modesetting"
EndSection

Section "OutputClass"
    Identifier "nvidia"
    MatchDriver "nvidia-drm"
    Driver "nvidia"
    Option "AllowEmptyInitialConfiguration"
    Option "PrimaryGPU" "yes"
    ModulePath "/usr/lib/nvidia/xorg"
    ModulePath "/usr/lib/xorg/modules"
EndSection

lightdm.conf 里在 [Seat:*] 里加一个 hook 配置,否则会黑屏的:

display-setup-script=/usr/local/bin/lightdm-setup

这个脚本内容如下:

#!/bin/bash -e

xrandr --setprovideroutputsource modesetting NVIDIA-0 || exit 0
xrandr --auto

写了一个 systemd service,用来启用 N 卡。因为默认它是关的。

[Unit]
Description=Switch On nvidia card
ConditionPathExists=/proc/acpi/bbswitch
Before=display-manager.service

[Service]
Type=oneshot
ExecStart=/bin/sh -c "echo ON > /proc/acpi/bbswitch"

[Install]
WantedBy=graphical.target

我之前在 ~/.xprofile 配置了视频的硬件加速,现在得删掉。GM108M [GeForce 940MX] 这个显卡的视频加速没法用的。

设置内核模块的选项 options nvidia_drm modeset=1,不然 xrandr --scale 时结果会不对。

暂时就这些了。


2019年07月20日更新:我又换回 Intel 显卡了。虽然这样性能差一点,滚动、视频时画面有点撕裂,外接屏幕中鼠标会闪,但是它稳定可靠啊!Nvidia 的驱动实在是崩得太闹心了(而且我那卡不支持视频硬解)。

2019年09月03日更新:我用上了 NVIDIA 新的 PRIME 方案,效果很好~

by 依云 at April 09, 2019 04:45 AM

April 04, 2019

Felix Yan

nspawn.org:简单的 systemd 发行版容器

如果你想要运行一个发行版容器,而又不想被 docker 一类的重量级方案打扰,现在有一个新的简单方案了。

nspawn.org 目前提供了 Arch、CentOS、Debian、Fedora、Ubuntu 的各版本镜像,并可以直接用 systemd-nspawn 的验证机制进行签名验证。

推荐的用法是使用其提供的 “nspawn” 工具。下面以创建一个 Fedora 30 容器为例:

1、获取工具:

$ wget https://raw.githubusercontent.com/nspawn/nspawn/master/nspawn
$ chmod +x nspawn

2、获取 Fedora 30 镜像:

$ sudo ./nspawn init fedora/30/tar

3、启动容器并获取 shell:

$ sudo machinectl start fedora-30-tar
$ sudo machinectl shell fedora-30-tar
Connected to machine fedora-30-tar. Press ^] three times within 1s to exit session.
[root@fedora30 ~]#

一些背景:容器默认的存储路径在 /var/lib/machines/。nspawn.org 的创建者是 shibumi,目前是 Arch Linux Trusted User。所有的镜像使用 mkosi 制作,定义文件均在 GitHub 上。除了 nspawn 容器镜像,这个站点还提供可引导的 GPT-UEFI 镜像。

by Felix Yan at April 04, 2019 10:03 PM

百合仙子

系统在解析哪些域名呢?

本文来自依云's Blog,转载请注明。

最近用 Rust 写了个叫 capture-dns 的小程序,实时显示 DNS 查询结果的。配合 ipmarkup 的效果是这样的:

>>> sudo capture-dns lo | ipmarkup
[sudo] lilydjwg 的密码:
github.com -> 52.74.223.119(新加坡Amazon数据中心)
github.com -> 13.229.188.59(新加坡Amazon数据中心)
github.com -> 13.250.177.223(新加坡Amazon数据中心)
live.github.com -> 192.30.253.125(美国弗吉尼亚州阿什本GitHub)
live.github.com -> 192.30.253.124(美国弗吉尼亚州阿什本GitHub)
collector.githubapp.com -> 34.193.248.191(美国弗吉尼亚州阿什本Amazon数据中心)
collector.githubapp.com -> 52.20.29.9(美国弗吉尼亚州阿什本Amazon数据中心)
collector.githubapp.com -> 34.197.57.23(美国弗吉尼亚州阿什本Amazon数据中心)
api.github.com -> 13.250.94.254(美国Amazon数据中心)
api.github.com -> 13.250.168.23(美国Amazon数据中心)
api.github.com -> 54.169.195.247(新加坡Amazon数据中心)
ocsp.digicert.com -> 117.18.237.29(澳大利亚美国MCI通信服务有限公司(韦里孙商业Verizon Business)EdgeCast亚太网络CDN节点)

可以看到本地的软件们都在查询哪些域名,得到的 IP 又是什么。抓取的是应答,所以没得到 IP 结果的不会显示。我抓取的是 lo 网络接口,因为我本地有用 dnsmasq 做缓存。

其实这个程序一开始不是这样子的。群里有人想抓取系统上进行的 DNS 查询的域名。一开始是用 tshark 抓取的,然而它太占用内存了。我粗略看了一下 Python 的 scapy 工具,也用掉了大几十M内存。那么,用 Rust 写一个好了,也顺便练习一下 Rust。

这个程序运行时只有几M的内存占用,CPU 占用也是非常低的。不过它并没有做完全的协议分析,而是假设抓得的包是以太网帧封装的 IPv4 报文封装的 UDP 数据包里包着 DNS 应答报文。所以如果你是在 eth0 上跑 PPPoE 的话,抓 eth0 上的包就不行了,得抓 ppp0 这种了。当然你要是 IPv6 啊 DoH、DoT 啥的就更抓不到了。

后来我用 bcc 的 tcpretrans 脚本查看我这里到哪些地方的 TCP 连接不太通畅,然而经常会看到一些我猜不到是干嘛的 IP。所以就把这个程序改了一下,把域名对应的解析结果显示出来了。

Rust 不仅节省资源,而且开发的体验真的很棒呢,编译成功之后就能按我预期的运行了。也不用担心什么时候遇到个有问题的报文导致程序崩掉,因为写的时候就已经处理好了出错的情况。不像 Python 写的脚本,刚写好,一跑就抛个异常出来,提示我哪里不小心写错了。好不容易调试好了,跑着跑着,遇到意外情况就挂掉了……

by 依云 at April 04, 2019 02:21 PM

April 03, 2019

百合仙子

正确的隐藏挂载点的方法

本文来自依云's Blog,转载请注明。

脚本需要挂载文件系统,但是不希望外部看到。正确的做法是:

mount --make-rprivate /

然后该干嘛干嘛。当然如果你不知道在执行之前先调用 unshare 或者等价的系统调用,说明这篇文章不适合你阅读。

错误的做法是在挂载的时候加 --make-private 或者把 / --make-private。这个标志(MS_PRIVATE)的意思是挂载/卸载事件在这里停止传播,而不是这个挂载点的事件是否传播出去。至于为什么需要使用 --make-rprivate(增加了 MS_REC 标志),暂时我还不理解。

这个用法是从 unshare 工具的 strace 结果里挖掘出来的。因为我的目的跟 unshare -m 一样嘛,当然首先想到的是看看它是怎么干的了。你问我为什么不用 unshare -m?你自己写脚本的时候试试看啰?

by 依云 at April 03, 2019 11:05 AM

April 02, 2019

ヨイツの賢狼ホロ

PackageKit:统一(?)GNU/Linux 发行版包管理器操作的前端

如果汝是 GNU/Linux 爱好者的话,一定有自己喜欢的 GNU/Linux 发行版了吧。 对那个发行版使用的软件包管理器的操作大概也已经谙熟于心了呗~

直到汝有时需要摆弄别的发行版的时候:

horo@debian:~ $ sudo pacman -Syu
sudo: pacman: command not found

emmm......

虽然 pacman 的话,有 pacapt 这样的工具来包装其它 软件包管理器的操作。但如果汝不适合这种状况呢(例如常用 Ubuntu ?(打死……) )?

PackageKit 出手相助~ 等等那是?

PackageKit is a system designed to make installing and updating software on your computer easier.

The primary design goal is to unify all the software graphical tools used in different distributions, and use some of the latest technology like PolicyKit.

https://www.freedesktop.org/software/PackageKit/pk-intro.html

PackageKit 是一个在不同的软件包管理器中统一操作的高阶前端(比 apt / dnf 一类的更高阶?), 当然没有打算取代各位的意思啦(笑)。

和 gcc 类似, PackageKit 通常也是由若干个前端和若干个后端组成的。

  • 后端通过一系列抽象工具和 packagekitd / libpackagekit 交互。
  • 前端为用户提供界面。例如 PackageKit 自己提供的 pkcon。

所以它怎么用?

基本操作和普通的软件包管理器差不多:

# pkcon install <package>
# 如果汝的账户具有管理员权限(在大多数桌面环境中认为 wheel 组的成员具有管理员权限),
# 安装时会询问汝的密码(通过 Polkit 完成)。
$ pkcon install tk
Resolving                     [=========================]
Finished                      [                         ] (0%)
The following packages have to be updated:
tk-8.6.9-2.x86_64   A windowing toolkit for use with tcl
Proceed with changes? [N/y]
Testing changes               [=========================]
Installing                    [=========================]
Installing updates            [=========================]
Finished                      [=========================]
# pkcon search <keyword>
$ pkcon search fcitx
Searching by details          [=========================]
Querying                      [=========================]
Finished                      [=========================]
Installed           fcitx-4.2.9.6-1.x86_64 (installed)                              Flexible Context-aware Input Tool with eXtension
Available           fcitx-anthy-0.2.3-1.x86_64 (community)                          Fcitx Wrapper for anthy.
Available           fcitx-chewing-0.2.3-2.x86_64 (community)                        Fcitx Wrapper for chewing
Available           fcitx-chewing-git-0.2.3.r4.ge4bb273-4.x86_64 (archlinuxcn)      Fcitx Wrapper for chewing
Available           fcitx-cloudpinyin-0.3.6-2.x86_64 (community)                    Standalone module for fcitx that uses pinyin API on the internet to provide additional input candidates
Installed           fcitx-configtool-0.4.10-3.x86_64 (installed)                    GTK based config tool for Fcitx
Available           fcitx-googlepinyin-0.1.6-6.x86_64 (community)                   Fcitx Wrapper for googlepinyin
Installed           fcitx-gtk2-4.2.9.6-1.x86_64 (installed)                         GTK2 IM Module for fcitx
Installed           fcitx-gtk3-4.2.9.6-1.x86_64 (installed)                         GTK3 IM Module for fcitx
......
# pkcon get-updates 可以检查更新
$ pkcon get-updates
Getting updates               [=========================]
Downloading list of packages  [=========================]
Finished                      [=========================]
Normal              adwaita-icon-theme-3.32.0-1.any (extra)                         GNOME standard icons
Normal              apache-2.4.39-1.x86_64 (extra)                                  A high performance Unix-based HTTP server
Normal              archlinux-appstream-data-20190320-1.any (extra)                 Arch Linux application database for AppStream-based software centers
Normal              archlinuxcn-keyring-20190315-2.any (archlinuxcn)                Arch Linux CN PGP keyring
Normal              babl-0.1.62-1.x86_64 (extra)                                    Dynamic, any to any, pixel format conversion library
......
# pkcon refresh 可以更新软件仓库列表。
$ pkcon refresh
# pkcon backend-details 可以查询 PackageKit 使用的后端的详细信息。
$ pkcon backend-details
Name:               alpm
Description:        alpm
Author:     Aleix Pol i Gonzàlez <aleixpol@kde.org>, Fabien Bourigault <bourigaultfabien@gmail.com>, Jonathan Conder <jonno.conder@gmail.com>

其它 pkcon 的命令可以通过查询手册页了解(pkcon(1))

那有没有图形前端?

当然有啦,例如 gnome-packagekit 和 apper, 它们通过 PackageKit 提供了安装,查找和卸载软件包的功能:

gnome-packagekit 的界面 apper 的界面

如果汝更中意类似应用商店的体验, GNOME 有 GNOME Software, KDE Plasma 有 Discover:

GMOME Software Discover

至于怎么用请参考它们和汝正在使用的 GNU/Linux 发行版的文档 (懒了……)

PackageKit 不是什么?

PackageKit 不能代替汝正在使用的软件包管理器(毕竟没了它们做后端这家伙啥也干不了)

emmm......

by ホロ at April 02, 2019 04:00 PM

March 31, 2019

百合仙子

迁移系统到 SSD

本文来自依云's Blog,转载请注明。

最近一段时间,不知道是磁盘、缓存相关算法的更新,还是我开的服务太多,又或者是新软件占用内存太高,我的系统越来越卡了,尤其是更新系统的时候(备份系统时也特别卡,然后我用限制内存占用的办法解决了)。我当然知道最主要的原因是因为机械硬盘的处理能力就那么多,于是经过一些了解和计划之后,还是决定换 SSD 了。

刚才查看了一下历史数据。从去年七八月份起,平均内存使用量从2G多升高到了3G多。大概是火狐更占内存了吧。我都尽量减少内容进程数量了……也可能是 PHP / MediaWiki 的锅,因为使用 SQLite 存储时,经常发生错误也是这段时间的事情。不过也可以理解为由于磁盘负载重导致的。算了不管了。

准备工作

当然首先要去买块 SSD 啦。我买的是 LITEON T11 Plus 512,512GB,800块。实际操作系统得到的空间是 477GiB,因为硬盘产业还在沿用1000进制的单位词头。它比我预期的要小不少呢,不过拿在手里感觉比一般同样大小的电路板要重。

拆开我的 T470p,把空闲接口旁边的螺丝下下来,然后 SSD 标签朝外插进去。我也不清楚这个接口叫什么。插进去之后它是翘起来的,难怪要用螺丝固定。然后用下下来的螺丝固定好,再把机器装好,就好了。启动系统,可以看到 /dev/nvme0n1 设备在了~GNOME 磁盘软件不能读取到 SMART 信息,用 smartctl -a /dev/nvme0n1 命令就好了。

设备没问题了,接下来当然是备份系统啦。

开始迁移

备份妥当之后,我就开始格式化 SSD。计划是 EFI 分区 512M,400G 给我的 Arch Linux,然后剩下 76G 左右的空间预留给我的 Win10。

然后这 400G,首先上一层 LUKS 加密,然后格式化为 btrfs 文件系统。其实我想要 btrfs 很久了,快照、去重、压缩都挺棒的。但是听说它的性能比较差,而我已经在受磁盘 I/O 能力不足的苦了,所以到现在有了 SSD,是时候换 btrfs 了!

其实之前 zfs(zfsonlinux)也是候选项,并且已经在工作本上使用过了。然而最近我的 zfs 备份两度出现问题(磁盘掉线之后 zfs 元数据损坏,导致一整个 zfs 文件系统一写就卡住;近期莫名其妙 rsync 跑着跑着就卡在那里不动了,磁盘也没有什么活动),再加上之前遇到的各种大小问题(ARC 被算进内存使用量中;挂载期间一旦磁盘离线就卡死;克隆出来的文件系统无法摆脱原文件系统;不支持 overlayfs;因为是树外模块所以需要专门准备的支持 zfs 的系统来执行安装),以及 TRIM 支持刚刚才加入,我已经停用 zfs 并将其排除考虑范围了。

然后就是规划子卷。参考了 openSUSE 的方案,最终决定分为这么几个子卷:/, /var/cache, /var/tmp, /var/log, /var/lib/lxc/lxc-debian/rootfs, /var/lib/lxc/lxc-centos6/rootfs, /home/lilydjwg, /home/lilydjwg/.cache。主要考虑的是快照。另外我给 /var/log/journal 和 /var/lib/postgres chattr +C 禁用了 CoW。这样也会禁用压缩,不过本来它们基本上就没什么可压缩的。需要排除的有:我的公开第三方源码和各类大文件用的 /ldata 还是放在机械硬盘上、/var/cache/pacman/pkg 缓存不要、/var/lib/pacman.fs 不用单独放连续的文件里了、/home/lilydjwg/.cache 缓存不要、/home/lilydjwg/.debug 这个 perf top 用的目录会有 libc 的硬链接,rsync 时会失败所以就不要了。

最终的同步命令如下:

sudo systemd-run -p MemoryMax=64M --scope \
  rsync -aviHAXKhPS --inplace --delete --exclude='*~' --one-file-system \
  / /mnt/root --exclude=/var/cache/pacman/pkg --exclude=/home/lilydjwg/.cache \
  --exclude=/var/lib/pacman.fs --exclude=/ldata --exclude=/home/lilydjwg/.debug

同步好之后,重启进入 live 系统再同步一次以保证最新数据也同步好了。然后把部分被排除的目录再同步一下:~/.cache/winetricks 这个以后不一定能够下到、~/.cache/sxiv 都是有效缓存(我有清理)而且生成耗 CPU、/var/lib/pacman 这个是被 --one-file-system 排除掉的。

然后是在 /etc/default/grub 里更新内核命令行 cryptdevice=/dev/disk/by-partlabel/ssd:ssd:allow-discards。这个 allow-discards 会轻微地降低安全性,不过在中国没什么用的。更新 /etc/fstab。

然后还有 /boot 要处理。其实就是把内核和 initrd 复制过去,然后重新安装 grub、生成 grub 配置。位于机械硬盘上的旧文件之后再删掉即可。

重启,使用 fallback 版 initrd 进入系统,开始修复各种问题。

首先是更新默认的 initrd。不过在更新它之前,我要修改一下我自己的 hook。之前这个 hook 里只有 partprobe 我解密之后的机械硬盘分区,因为我在它上边又分了 xfs 和 swap 两个区。现在因为 encrypt hook 解密的是 SSD 上的分区,所以这个机械硬盘上的加密分区的解密也要自己做。其实也很简单,给这个加密分区添加一下文件密钥,然后

cryptsetup open --type=luks --key-file=/etc/keys/hdd.luks /dev/disk/by-partlabel/main main

就可以了。不需要输入两次密码。

/ldata 使用 automount 延迟挂载,所以需要写 ldata.mount 和 ldata.automount 两个文件,然后 enable ldata.automount 那个。不知道写在 /etc/fstab 里是不是也行。然后把机械硬盘里的目录结构调整一下,把原来 /ldata 下的东西上移一级,旧的 / 里的其它东西都放到隐藏的 .oldroot 里去好了。

swap 本来我是保留着的,不过发现这样子我会时不时听到机械硬盘启动了。而且因为机械硬盘启动比较费时,所以系统会卡好一会儿(大概有一两秒)……所以我默认就不开 swap 了,但是 resume hook 还是保留,需要的时候打开 swap 就可以休眠了。这个 resume hook 也是我需要在启动的时候就解密机械硬盘上的加密分区的原因。

加了一个每周运行的 fstrim -v / cron 任务。没有使用 fstrim.timer 是因为它会 trim 所有设备。而我可不希望它去 trim 我挂载的机械硬盘上的 loop 设备,会造成大量碎片的。

还有一些小问题要处理。chattr +i /etc/resolv.conf 以避免 DNS 服务器被不知不觉修改了。我有用 dnsmasq 的所以这个文件不用动。我有一个 MediaWiki 实例的文件是使用 overlayfs 的,它现在挂载提示「failed to verify upper root origin」。后来才发现相关目录上有同步到几个 trusted. 开头的、overlayfs 使用的扩展属性。是它还挂载的时候被同步到的,不知道为什么最后一次同步时没有被清除掉。手动使用 setxattr 删除掉就好了。

rsync 还出了另外几个莫名其妙的问题。我在 /usr/local/sbin 下有个最近新加的文件的执行权限消失了,造成使用它的 systemd 服务失败。另外有个最近被删除的配置文件竟然还在。我不是有指定 --delete 选项吗?火狐缓存的网站图标也都没有了,需要访问之后才会重新出现。~/.cache 下有很多 root 所有的空目录,也许是我哪次忘记 --exclude 它然后又中断才加上?

Wine 有几个文件有几十 KiB 大的 user.wine.sd 扩展属性。太大了以至于 btrfs 里放不下,报「No space left on device」错误。我刚看到时还吓一跳,以为是我的 SSD 满了,仔细一看才发现只是扩展属性写不下而已。

我于是又带 --dry-run 参数同步了一次,确定再没有什么需要的东西被落下。这次 rsync 出现这些问题很是奇怪,不过我没有留日志,加上操作的时候其实是有不少修修改改的,所以就不深究了吧。

修好所有发现的问题,再次重启之后,systemctl status 和 systemctl --user status 没有失败项了~撒花 O(∩_∩)O~

后记

现在我的系统超快的!比如启动时间:

>>> systemd-analyze
Startup finished in 9.257s (firmware) + 1.466s (loader) + 15.110s (kernel) + 6.945s (userspace) = 32.780s 
graphical.target reached after 6.945s in userspace

firmware 和 loader 咱管不了。kernel 那儿包含了我输入密码解密,以及解密和探索机械硬盘上的分区,所以花了些时间。userspace 那里你别看花了好几秒,其实大部分时间都是花在联网上了。不依赖网络的服务在差不多一秒的时间内就全部启动好了。

之后我还要更新备份脚本,因为我用了 --one-file-system 而现在它们在不同的子卷上。再写一下每日快照的脚本,就不用一不小心删错文件啥的都要去备份里找了。

关于写入量,smartctl -a /dev/nvme0n1; sleep 300; smartctl -a /dev/nvme0n1 统计了一下,因为我开了 collectd 收集一些系统数据,每分钟大概会写入 60MiB 的数据。算下来,一年要写 20T 左右。这块 SSD 标称的是 280TBW,也就是可以写 280TB 的数据。这么算起来能用十年,所以就这样吧,不用再优化了。顺便说一下,SMART 信息里的「Data Units Written」数据,乘以 512000 之后是字节数。

就这样啦。最后还要说一句:SSD 超快的!

by 依云 at March 31, 2019 07:28 AM

March 02, 2019

百合仙子

使用 cgroups net_cls 来让 docker 走代理

本文来自依云's Blog,转载请注明。

我这里 docker hub 连不上或者连上了访问很慢,根本没法用。本来我常规代理的办法,要么是 proxychains,要么是用 iptables 代理特定的 IP 段。至于 docker 嘛,亚马逊的 IP 段那么多,它用到的域名我也不是很清楚,一点点加好麻烦。作为系统服务,用 proxychains 不仅得修改 systemd 服务配置,而且不知道会不会出什么幺蛾子。最近刚好在某个地方看到这一手,就试试啰。

其实用法很简单的。去 /sys/fs/cgroup/net_cls 下建立个目录,往 net_cls.classid 里写一个整数(支持十六进制的 0x 表示法),然后把 dockerd 的 pid 写到 cgroup.procs 里去。最后用 iptables 代理这部分流量即可。现在都用 443 端口啦,所以只要代理它便好,也避免影响了别的东西:

iptables -t nat -A OUTPUT -p tcp --dport 443 -m cgroup --cgroup 0x110001 -j REDIRECT --to-ports XXX

XXX 是 ss-redir 的端口啦。

注意不要把进程的 pid 往 tasks 文件里写。那里得写的是 task 的 id 而不是 process 的 id,也就是说(用内核的术语来说)是线程的 pid 而不是进程的 tgid(thread group id)。所以非要写 tasks 文件的话,得把 docker 所有的线程的 pid 都写进去才行。真是混乱呢……画个表格好了:

用户态 内核 相关系统调用
pid tgid getpid, kill
tid pid gettid, tgkill
process task group fork, clone without CLONE_THREAD
thread task clone with CLONE_THREAD

另外如果更新过内核的话,那句 iptables 有可能会找不到模块的。(所以更新内核之后还是重启一下以避免尴尬吧。)

by 依云 at March 02, 2019 04:15 PM

使用 cgroups 限制指定进程的内存使用

本文来自依云's Blog,转载请注明。

最近我的系统有这么个问题:在备份或者系统更新等高 I/O 负载的时候,系统整体性能下降严重,界面经常卡到动不了。经过分析发现此时比平常多了许多磁盘读操作。平常的时候磁盘读操作是很少的,会有大量的缓存命中,反倒是写操作一直都有(因为我本地搭了个监控系统)。啊对,分析用到的磁盘性能数据就是来自于这个监控系统。

所以原因很清楚了:备份和系统更新不仅造成了大量缓存未命中,还占用了本来存放着热数据的缓存,导致常规使用的缓存命中率也急速下降,结果我的机械硬盘就忙不过来了。

那么,要是能够限制这些操作占用的缓存,性能不就能好一点吗?那些新读进来的数据反正是短期内再也用不到了,缓存起来也只是浪费有限的内存空间啊。

研究了一下 /sys/fs/cgroup/memory/memory.stat,看起来 cgroups 内存限制是包含缓存部分的,于是就试试呗。正好 systemd 直接就能设置了:

$ sudo systemd-run -p MemoryMax=512M --scope pacman -Syu

本来我是设置的 256M 限制,结果发现 dkms 编译内核模块的时候超级慢,还用掉了不少 swap……于是分了 512M。效果还是不错的,常规操作偶尔还是卡一卡(毕竟还是有一些 I/O 操作),但比起不限制的时候要少很多。

要注意一点的是,不使用 cgroups v2 的话(Arch Linux 默认),这个命令不能加 --user 以在用户级的 systemd 下跑的。而使用 cgroups v2 的话,lxc 和 docker 都跑不了……

备份也是类似的,而且因为 rsync 自己用不到多少内存,这个效果更好:

$ systemd-run -p MemoryMax=256M --scope ./backup-my-system

终于又一次在半小时内完成了备份 QAQ 之前动不动就一两小时的。

我也不知道为什么这个问题近期才出现,总之现在是缓解了。(接下来有空继续计划换 SSD 硬盘的事情~

by 依云 at March 02, 2019 03:51 PM

February 23, 2019

farseerfc

东方歌词翻译迁移至 sak.uy

最近几个月在这个博客发了不少歌词翻译 似乎有要转型成音乐博主的趋势 ,前段时间买了个新域名 sak.uy ,准备专门用来放这些东方歌曲的歌词翻译,于是分设了单独的博客「 Sakuya的音乐盒 」。主博客这边右侧边栏会有到音乐盒的链接。

曾经在这边的那些歌尽量保持 URL 跳转过去,新的歌词翻译会发到那边去,还想继续听歌的话请继续订阅那边的 RSS 呀。

主博客这边还是像往常一样保持记录生活点滴和技术经验好了。说道介绍技术, 有人问过我那些日语歌词上给汉字标注的假名都是我一个个手输的么? 一开始是手输的,后来发现了不错的自动化方案,于是这里介绍一下。

首先是 python-furigana

这是个 python 写的小程序(严格说是库),可以把一段日文转换成标准的 HTML 形式的 <ruby> 标签的振假名( 振(ふ) り 仮名(かな) )。 它本身只是个方便的格式化库,实际工作是用 python-mecab 这个 binding 去查询 mecab 这个著名的日语语料分析库。要用它还得配合一些开源的 mecab 词典,这些在 [archlinuxcn] 都有打好的包了,直接安装:

$ sudo pacman -Syu python-furigana mecab-git python-mecab mecab-ipadic

装好之后用法也很直接,甚至没有 binary 直接调用 python 的 module 就可以:

$ python -m furigana.furigana "振り仮名の例"
<ruby><rb>振</rb><rt>ふ</rt></ruby>り<ruby><rb>仮名</rb><rt>かめい</rt></ruby>の<ruby><rb>例</rb><rt>れい</rt></ruby>

就是提供日语作为输入,然后输出 HTML 形式的 <ruby> 标签而已。 像上面的例子中出现的错误(「振り仮名」完整的一个词中「仮名」意思是「平仮名」应该发音「がな」而非意为「假的人名」的「かめい」) 可以看出其实标注的准确率还是有些问题的。嘛日语作为一个非常依赖上下文判断的语言, 经常日本人都会搞错某些汉字的发音,这些也不能强求机械化的算法能 100% 正确实现。 好在单纯的词典匹配也能满足大部分标注的需要了,用这个标注总体来说 95% 以上的情况都是正确的(歌词的话正确率低一些,毕竟歌词中古语啦当て字啦训読み这些情况很常见)。

把输出插入我的博客

然后我的博客用 reStructuredText 语法写,不能直接用 HTML 标签(虽然我加了 :html: 这个 行内角色(inline role) 但是大量用也不方便)。这个博客一开始用 Pelican 重写主题的时候 我就实现了个自己的 :ruby: 行内角色(inline role) 用来标发音,于是一段 sed 就能把 python-furigana 的输出转换成我用的 rst 语法:

$ which clipboard Co Ci Ct
clipboard: aliased to xclip -selection clipboard
Co: aliased to clipboard -o
Ci: aliased to clipboard -i
Ct () {
    t=$(mktemp /tmp/furigana-XXXX)
    python -m furigana.furigana $(Co) | sed 's@<ruby><rb>@ :ruby:`@g;s@</rb><rt>@|@g;s@</rt></ruby>@` @g' | sponge $t
    cat $t | tee /dev/tty | perl -pe 'chomp if eof' | Ci
}

上面这些 alias 在我的 .bashrc 中。有了这些之后, 我只要把需要标注的日语文本放入剪切版,执行 Ct ,再粘帖结果就好了。

$ echo "振り仮名の例" | Ci
$ Ct
:ruby:`振|ふ` り :ruby:`仮名|かめい` の :ruby:`例|れい`

然后所有那些歌词上标注的假名都是这样一句一句标注好之后,再手动校对修改的。

by farseerfc at February 23, 2019 11:37 PM

February 19, 2019

ヨイツの賢狼ホロ

和 FiveYellowMice 交换问题!

终于还是咕咕出来了?

所以这笔谈是个啥东西?

笔谈,是指人们在面对面的情况下不使用口头语言而是通过互相书面书写或键盘输入文字的方式,来传达彼此意思的沟通行为。 是汉字文化圈地域内不同母语的文人相互交流的方法之一。主要使用汉字以及文言文(汉文)的交流方式。

看这家伙已经懒到直接抄维基百科了……

🐁🐁🐁🐁🐁 的问题和咱的回答~

  • 看到萌狼有经常尝试非常正统的 GNU 操作系统,一点点不清真的东西也容不下的那种, 然后因为来自硬件和软件的支持都很少,用起来就很辛苦。虽然黄鼠也同样幻想着 GNU 能够成为被主流支持的东西,但是如果现实地讲,萌狼觉得纯正的 GNU 有怎样的意义呢? 比起其它的相对来说更接受非自由软件的存在的理念而言。

    如果 🐀 去翻翻以前的史话什么的,大概就会发现软件本来都是自由的啦。 RMS 也许只是在回归本源而已(笑)。以及现在计算机科学越来越发达了, 汝真的放心让那些私有的黑盒子走(kong)进(zhi)汝的生活嘛(😂)。

    // 关于自由软件的必要性和思想什么的, RMS 编辑的 Free Software, Free Society ( BLUG 哪边有中文翻译 https://beijinglug.club/fsfs-zh/ )整理了一些文章, 🐀 可以去看一看咯~

    // 至于完全自由的生活会不会比较难过(虽然咱其实还没达到), 咱现在觉得除了游戏基本上已经没有什么问题啦。不少领域里自由软件都已经达 到了可用甚至优秀的水平,也有不少可以自由驱动的硬件了(虽然都有点旧但是还能用)。 总之还是充满希望的啦~

  • 街机音游看起来很有趣呢。但比起在自己的设备上玩的游戏, 除了要碰运气才能够在自己生活的地方附近找到想玩的游戏以外,每次玩还都要付钱, 玩不了几次就会比买一份普通的 PC 或者主机游戏花得钱多了。 对这样按照回合收费的商业模式,萌狼有着怎样的看法呢?

    如果家里有矿的话可以自己买一台街机回家啊(大雾)

    怎么说呢,如果汝真的喜欢上了什么的话,那么在自己能力范围内的消费大概就会逐渐被 自己忽略了吧……还有啊,几乎大多数游戏类型里,想要提升自己的水平的话只 有靠长时间的练习对不对(当然有些时候也需要玩家间的交流和相互支持),当汝 看到自己从一开始手忙脚乱到后来能行云流水的游玩自己擅长的谱面的时候, 那股欣慰和成就感应该也能冲刷掉一点氪金的伤感(?)

    总之不管付费方式怎么样,遇到合适自己的游戏,玩家还是会心甘情愿的买单的不是?

  • 萌狼觉得自己在最近的几年,有着怎样的改变呐?

    觉得自己快成和以前不同的另一个(zhi)人(lang)了 😂

    可能就是从各种各样的第一次开始吧,开始思考一些以前觉得稀松平常的问题了 (例如隐私和安全什么的)。最直接的结果就是出门带上的东西成倍增加 😂

  • 萌狼是怎样知道「何でも言うことを聞いてくれる」的梗,又是为什么会喜欢上的呐?

    和朋友一起打 maimai 时听来的,然后就去搜索了下那首歌的 BGA , 莫名还挺好(mo)看(xing)的 ?以及茜酱超会听(fu)话(yan)的对不对~

  • 除了狼以外,觉得毛茸茸的四脚哺乳动物中,哪种最喜欢呢?

    🐱,因为自己只亲手摸过猫的样子? 😂

  • 觉得自己总体来说,是外向还是内向的人呢?在哪些地方是外向的,哪些地方是内向的?

    总体应该算是内向的吧(只是看起来而已,和咱一起久了的家伙都觉得咱挺活 (gao)泼(shi)的。要是问方面的话咱自己也不太能搞清楚的样子…… 😞

  • 做出和各种人交换笔谈的决定,黄鼠觉得会很辛苦呢。尤其是越到后面, 别人想问萌狼的问题也许很多都被问掉了,萌狼想问别人的问题也会很容易变得重复和单调。 这样的困难,萌狼准备怎样应对呐?

    其实咱一开始根本没有考虑到这一点 😂,大概就是突然有了这么做的想法就 付诸实施的样子。不过咱大概能做到打出的问题不至于太重复吧, 至于收到的问题是什么样的就 emmm (不过在这之前是不是该先考虑能找到几个愿意和咱 这样笔谈的笔友(?)的问题) 😮

  • 😋 ?

    😋!

那么下一个是?

其实还没想好 😂,如果咱友链里剩下的谁愿意自告奋勇也热烈欢迎啦 ……

by ホロ at February 19, 2019 04:00 PM

February 16, 2019

百合仙子

在 Linux 下整理磁盘碎片

本文来自依云's Blog,转载请注明。

磁盘碎片其实有两种:文件碎了,和空闲空间碎了。使用 FIEMAP 命令可以获取到文件在磁盘(的逻辑地址上)的分布情况。也是 filefrag -v 命令输出的东西。比如我的 pacman.log 就很碎:

Filesystem type is: 58465342
File size of /var/log/pacman.log is 11052443 (2699 blocks of 4096 bytes)
 ext:     logical_offset:        physical_offset: length:   expected: flags:
   0:        0..    2015:  170210423.. 170212438:   2016:
   1:     2016..    2017:  170567879.. 170567880:      2:  170212439:
   2:     2018..    2027:  170569969.. 170569978:     10:  170567881:
   3:     2028..    2030:  170574582.. 170574584:      3:  170569979:
   4:     2031..    2031:  170574631.. 170574631:      1:  170574585:
   5:     2032..    2033:  170592662.. 170592663:      2:  170574632:
....
 123:     2683..    2687:   56903805..  56903809:      5:   56906403:
 124:     2688..    2698:   56903011..  56903021:     11:   56903810: last,eof
/var/log/pacman.log: 125 extents found

整理的办法也很简单,复制一下,基本上就好了。只要剩余空间足够,小文件会变成一整块,大文件也是少数几块。如果非要弄一整块大的,比如我存放 pacman 数据库的那个小文件系统,可以用 fallocate -l 200M pacman.fs2 这样子的命令分配空间,然后把数据 dd 进去(cp 不行,因为它会先截断文件再写入,之前分配的空间就释放掉了)。

介绍完毕,重点来了:怎么找到那些被写得很碎很碎的文件呢?

对每个文件调用 filefrag 肯定太慢了,所以我写了个库和工具 fiemap-rs 直接调用 FIEMAP。它提供两个工具。一个是 fraghist,统计碎片数量分布直方图,用来了解一下某群文件有多碎。另一个是 fragmorethan,用来寻找碎到一定程度的文件。运行起来是这样子的:

/var/log:
# Number of samples = 712
# Min = 1
# Max = 297
#
# Mean = 11.338483146067423
# Standard deviation = 40.138129228003045
# Variance = 1611.0694179238724
#
# Each ∎ is a count of 13
#
  1 ..  31 [ 658 ]: ∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
 31 ..  61 [  11 ]:
 61 ..  91 [   9 ]:
 91 .. 121 [  10 ]:
121 .. 151 [   6 ]:
151 .. 181 [   5 ]:
181 .. 211 [   3 ]:
211 .. 241 [   2 ]:
241 .. 271 [   3 ]:
271 .. 301 [   5 ]:
/var/log/journal/00000000000000000000000000000000/system@xxx.journal: 271
/var/log/journal/00000000000000000000000000000000/system@xxx.journal: 277
/var/log/journal/00000000000000000000000000000000/system.journal: 274
/var/log/journal/00000000000000000000000000000000/system@xxx.journal: 297
/var/log/journal/00000000000000000000000000000000/system@xxx.journal: 274

我系统上最碎的两群文件是 journal 日志和 python2-carbon 的数据文件。carbon 优化做得挺不好的,明明是预分配的固定大小文件啊,不知道怎么的就弄得很碎了。部分程序的日志(如 pacman、getmail)和火狐的 SQLite 数据库也挺碎的。后边这些我已经处理掉了所以示例输出只好用 journal 的啦。

找到想要整理的过碎的文件之后,复制一下就好啦:

for f in $(<list); do sudo cp -a $f $f.new; sudo mv $f.new $f; done

啊对了,工具的编译方法是,获取源码并安装 Rust 之后,在项目根目录里 cargo build --release 然后就可以在 target/release 下找到新鲜的可执行文件了~顺便说一下,这东西是支持 Android 的哦。

by 依云 at February 16, 2019 08:54 AM

February 09, 2019

ヨイツの賢狼ホロ

舞律炫步体(tu)验(cao)

嗯…… 大概就是标题那样,在咕咕咕和没零件交错后咱玩到了 国行版的 DANCERUSH STARDOM ,中文名叫舞律炫步 😂

等等 DANCERUSH STARDOM 是什么东西?

DANCERUSH STARDOM 是KONAMI目前(2019年1月)最新的 BEMANI 系列游戏。 事先以 STEPSTAR, ShuffleDancerz, DANCE GENERATIONS, 和 DANCE RUSH 的名义进行了场测, 直到 JAEPO 2018 展会才以 DANCERUSH STARDOM 作为正式名义推出。

DANCERUSH STARDOM 是一款和舞蹈进化非常相似的跳舞机. 但并没有使用之前舞蹈进化使用的微软Kinect for Windows来捕捉玩家的动作, 而是采用了英特尔 RealSense 410 (RS410)作为新的动作感应器, DANCERUSH 还有一个非常大 的感应地板, 作为主游玩感应设备。

可以去它们的官方网站看到具体是啥样子

早些时候就有了世宇科技(?)要代理 DRS 的消息,还在中山展出过(可以叫场测嘛……), 虽然说的是一月开始铺货,但是因为下方的踏板没能和框体一起送到的缘故咕咕咕到 2 月 2 日才开始运营……

那么这游戏该怎么玩?

官方有教程视频

那国行有啥区别咧?

国行框体的标题画面

^ 国行框体的标题画面(那个“请在按下面按”是什么鬼?)

中国专用 e-amusement 了解一下?

  • 和以前引进的 BEMANI 街机一样,肯定不能连官方的 e-amusement 啦,于是就搞出了个 “中国专用 e-amusement” 那样的东西
  • 所以理所当然的砍掉了刷卡器和数字键盘。登录?又是微信扫码的日常套路……
扫码登录
  • 价格奇坑(待会儿再讲)
  • 既然某 Y 字头网站在国内不存在,自然没有录影功能。
  • 默认简体字界面,当然语音也中文化了。不过能在开始时选择其它语言,和官机一样。
  • 没有储星星等各种解禁元素,取而代之的是星星提升等级解禁……
  • 然而全曲只有 76 首(20190130),而且一如既往的删了些?(例如咱没见到 Butterfly)
  • emmm ......

为啥说国行价钱坑?

默认只有 1 Stage (官机哪怕是 LIGHT 也是两 Stage 保证咧),后来发现世宇还搞了个啥会员?

中国专用 e-amusement 的会员价格

就这个,不知道这会员是一个游戏一个游戏的卖还是和官方一样(e-amusement 是有 Subscription 的, 然后不同的游戏可能会单独卖个像会员的东西,例如 beatmania IIDX 的 Platium Members Card)。 顺便说一句这个 am 点是他们自己搞出来的啥,1 am 点 = 1 元人民币,看起来挺像 PASELI 的哈……

于是不氪 VIP 是进不了 EXTRA STAGE 的(官方的话是 STANDARD 模式两曲合计 180 分以上就能进,以及这游戏 满分是 100 分),更甚不氪会员都没法存档,嗯可以的……

drs这个收费 30和50都是废物.jpg -- 一位不愿意透露姓名的 L 姓玩家

以及氪了 VIP 的话 Gauge 不会下降?(EXTRA STAGE 本来是 10 次 Bad 就游戏结束的,咱打完发现一把 Bad 的后 开始怀疑这点了……)

那咱觉得怎么样呢?

啊有的玩已经很不容易了……

如果汝有音游基础(特别是街机音游玩家)或者舞蹈基础(推测?)的话,这个游戏还是挺简单的。 (反正咱玩了一下午可以瞎蹦蹦 9 级曲了,目前最难 10 级不敢试……)

游戏除了一般的教程的话还有几种常见动作的指导和训练,刚上手(严格来说是上足?)的时候建议玩玩看。

杂记

  • 虽然教程汉化了还是有路人直接跳过教程…… 于是就能见到 emmmm……
  • 和隔壁鹅舞形成了鲜明的对比……
鲜明的对比?

by ホロ at February 09, 2019 04:00 PM

February 08, 2019

Hexchain Tong

在 Linux 上使用 Docker 和 Java 开发酷 Q 插件

最近出于一些奇怪的原因,我需要写个 QQ 机器人。

酷 Q 是个比较常见且好用的机器人框架,但很可惜是 Windows only 的。虽然有官方支持的(使用 Wine 的) Linux Docker 镜像,但为了开发插件,还要设立交叉编译开发环境,十分麻烦。在论坛上发现酷 Q 有 Java 插件,就可以借助 JVM 使用各种原生的工具开发插件,然后扔进 Docker 里的 Wine 的 JRE 去运行。

获取 Docker 镜像和 Java 插件

首先要获取 CoolQ 的 Docker 镜像,并启动一次。这是为了建立基本的酷 Q 目录结构:

coolq/
├── app
│   ├── com.coxxs.music.cpk
│   ├── com.coxxs.start
│   │   └── start.cfg
│   ├── com.coxxs.start.cpk
│   ├── com.coxxs.status.cpk
│   └── moe.min.qa.cpk
├── bin
│   ├── CQP.dll
│   ├── gzip.dll
│   ├── htmlayout.dll
│   ├── libeay32.dll
│   ├── libiconv.dll
│   ├── sqlite3.dll
│   └── zlib1.dll
├── conf
└── CQA.exe

然后下载 酷 Q Java SDK 并按提示放入 coolq/app/ 目录中,启动酷 Q 并在插件管理器中启用 Java 插件。插件会提示找不到 JRE,暂时忽略。

下载 Windows JRE

然后,到 http://www.oracle.com/technetwork/java/javase/downloads/jre8-downloads-2133155.html 获取32 位的 Windows JRE 压缩包,如 jre-8u202-windows-i586.tar.gz。这里使用压缩包是为了避免额外的安装步骤。

然后将 tar 包解压至 coolq 目录下,解压之后应该有 jre1.8.0_202/bin 等目录。

编辑 coolq/data/app/com.sobte.cqp.jcq/conf/setting.ini 文件,修改 JrePath 指定 JRE 路径(Docker 中的根目录对应 wine 中的 Z:\):

[JavaVM]
JrePath=Z:\home\user\coolq\jre1.8.0_202\

然后重启酷 Q,此时插件应该能找到 JRE。

做插件

参考论坛提供的 Demo 写插件。需要注意 json 文件中的 appid 字段,和 appInfo() 的返回格式。

然后编译构建,将 jar 包和 json 按正确的名称复制到 coolq/app/com.sobte.cqp.jcq/app/ 下,重启酷 Q 就会生效。

使用 maven-assembly-plugin 可以将依赖打进最终生成的 jar 包中。

stdout(竟然)是可用的,可以简单的使用 println() 输出调试信息。但输出的中文会乱码,原因是 Java 在 Windows 上的输出并不是 UTF-8 编码的。参考 https://stackoverflow.com/a/29231668 修改 System.out 的编码后解决。

by hexchain at February 08, 2019 08:46 PM

February 07, 2019

百合仙子

docker 里几个基本概念的简单类比

本文来自依云's Blog,转载请注明。

首先说明一下,这是一位 docker 新手对于 docker 的粗浅理解。如有不对还请谅解。我很早之前就尝试过使用 docker,然而由于术语的差异,导致我每次运行东西时都傻乎乎地创建了一个新的容器……现在感觉用法终于是弄对了,所以整理一下,将其类比到 Linux 上的普通软件的概念上。

image
相当于软件分发中的软件(安装)包
Dockerfile
跟 PKGBUILD 类似,是用于制作一个 image 的打包脚本。用 docker build -t name:tag . 就可以制作。
container(容器)
一个容器就像是一个安装好了的软件包。该软件已经准备好,随时可以运行了。
docker run
安装」指定的 image。也就是从 image 制作出容器来,顺带着进行首次运行。如果反复使用,会把同一个软件给安装多次。
docker start
就像是「运行」一个已经安装好的软件,容器跑起来了。之前容器的状态(文件的修改)也会生效。
docker ps
列出运行中或者已安装(带 -a 参数)的软件们。前者和 UNIX 命令 ps 类似,后者则没什么相似之处了。
docker exec
在正在运行的软件的环境内执行命令。有点类似于 ssh。
repository
跟 Linux 的包含众多软件的软件源并不一样。这个东西跟软件名类似,用于标识为特定功能的 image 集。发布出来的 repository 名的格式通常是 `owner/name`,跟 GitHub 差不多的。
tag
软件的版本,跟什么 lite、pro、beta 之类区分类似。它并不是用于分类的标签,也不是 git 中对于指定版本的不变的称呼。它更像是 git 的分支在某些情况下的作用,比如 latest tag 就跟 git 仓库的 master 分支一样,总是指向最新的版本。

我经过以上这样的映射之后,docker 理解起来就容易多了,行为也更符合预期。

by 依云 at February 07, 2019 12:24 PM

February 06, 2019

farseerfc

用 usbip 转发 raspberry pi 的 USB 键盘鼠标给 Arch Linux 的 PC

惠狐 megumifox 写了篇 用PulseAudio将电脑的声音用手机放出来 ,文末提到想知道我怎么用树莓派转发 USB 的,于是写篇文章记录一下。

起因

家里有个装了 Arch Linux ARM 的树莓派3B 闲置着,装了 Arch Linux ARM 偶尔上电更新一下, 不过因为性能实在不适合做别的事情于是一直在吃灰。某日 给老婆安利幻想万华镜和老婆看片 的时候, 老婆不吃安利于是迁怒键盘鼠标键盘鼠标被长长的 USB 线扯着感觉很难受 ,于是偶发奇想,能不能利用一下树莓派的多达 4 个 USB 2.0 端口接鼠标键盘呢, 这样鼠标键盘就可以跟着树莓派来回走,不用拖着长长的 USB 线了。

上网搜了一下, Linux 环境有个 usbip 工具正好能做到这个。原理也很直观, usbip 能把 USB 端口上的数据封装成 IP 协议通过网络转发出去,从而两个网络间相互联通的电脑就可以远程转发 USB 了。 设置好的话,就像是一台 PC 多了几个位于树莓派上的 USB 端口,插上树莓派的 USB 设备统统作为 PC 的设备。

这篇文章假设有一个装了 Arch Linux 的 PC ,和一个装了 Arch Linux ARM 的树莓派, 并且两者间能通过网络互相访问到。别的发行版上大概也可以这么做,只是我没有试过。 usbip 工具似乎普遍被发行版打包了,除此之外需要的也只是 Linux 内核提供好的功能而已。

设置 Arch Linux ARM 的树莓派端

假设树莓派上面网络已经设置妥当,开机插电就能自动联网。接下来安装 usbip 工具:

$ sudo pacman -Syu usbip

然后需要记录一下树莓派的 IP 地址:

$ ip addr
3: wlan0: ......
inet 192.168.0.117/24 brd 192.168.0.255 scope global noprefixroute wlan0
......

接下来给 udev 添加一个规则,当插入 usb 设备的时候,执行我的脚本 usbipall.sh 把 usb 设备通过 usbip 共享出去:

$ cat /etc/udev/rules.d/usbipall.rules
ACTION=="add", SUBSYSTEM=="usb", RUN+="/usr/bin/bash /usr/local/bin/usbipall.sh"

这个 rules 文件 可以在我的 dotfiles 里面找到

然后规则调用的 usbipall.sh 我这么写的, 文件同样在我的 dotfiles 里面

#!/bin/sh
(
allusb=$(usbip list -p -l)
for usb in $allusb
do
    busid=$(echo "$usb" | sed "s|#.*||g;s|busid=||g")
    if [ "$busid" = "1-1.1" ]
    then
        # ignoring usb ethernet
        continue
    fi
    echo "$(date -Iseconds): Exporting $busid"
    usbip bind --busid="$busid"
done
) >>/var/log/usbipall.log 2>&1

这个脚本做了这样几件事。

  1. 调用 usbip list --local 列出本地所有 usb 设备。
  2. 针对每个设备
    1. 取出它的 busid
    2. 判断是不是树莓派的 USB 以太网卡,不是的话继续
    3. 通过 usbip bind --busid= 命令把这个 usb 设备导出到网上
  3. 最后把所有输出记录到 /var/log/usbipall.log 日志里面

树莓派这边设置就完成了。从此之后插入的 usb 设备就会统统导出出去。

这里需要注意一下,启用了 udev 规则之后,就没法插键盘鼠标到树莓派上控制它了……我都是从另一端 ssh 上树莓派操作的。如果有什么地方设置错误,可能需要把树莓派的 SD 卡拔下来插到电脑上,删除掉 rules 文件……

仔细检查设置正确了之后,重新载入 udev 规则,或者重启树莓派:

# systemctl restart systemd-udevd

这样树莓派这边就设置好了。

设置 Arch Linux 的 PC 端

同样假设 PC 这边也已经联网。接下来同样安装 usbip 工具:

$ sudo pacman -Syu usbip

然后我写了个小脚本去链接树莓派端, 这个文件 usbiprpi3.sh 也在我的 dotfiles

#!/bin/sh
rpi3="192.168.0.117"

modprobe vhci-hcd

allusb=$(usbip list -p -r $rpi3 | cut -d":" -f1 -s | sed 's|^[ \t]*||;/^$/d')
for busid in $allusb
do
    if [ "$busid" = "1-1.1" ]
    then
        # ignoring usb ethernet
        continue
    fi
    echo "Attaching $busid"
    usbip attach --remote=$rpi3 --busid="$busid"
done

其中脚本第一行填入上面记录下来的树莓派的 IP 地址,接下来脚本做了这么几件事:

  1. 用 modprobe 确认加载 vhci-hcd 通用虚拟键鼠驱动
  2. usbip list --remote= 列出远程设备上已经导出了的 USB 设备,取出他们的 busid
  3. 对每个设备用 usbip attach 接上该设备

然后就已经准备妥当,接下来是见证奇迹的时刻:

$ sleep 10; sudo ./usbiprpi3.sh
Attaching 1-1.4.3
Attaching 1-1.4.1

因为只有一套键盘鼠标,所以先 sleep 个 10 秒,在此期间快速把键鼠拔下来插到树莓派的 USB 口上去。 如果对自己手速没自信也可以把时间设长一点。然后用 root 权限执行 usbiprpi3.sh 。

一切正常的话,先能观测插上树莓派的键盘鼠标被树莓派初始化了一下,比如键盘灯会亮, 然后这些设备会被导出出去,从而键盘灯灭掉,然后 10 秒等待结束后他们被远程接到了 PC 端, 又会被初始化一下,同时 PC 端这边会有上述 Attaching 的输出。然后键盘鼠标就能像平常一样用啦。

使用体验

因为就是通过 IP 转发 USB 嘛,所以就和普通地接 USB 的体验差不多,当然前提是网络环境足够稳定。 在我家间隔 5 米到无线路由器的环境下,基本感觉不到网络延迟的影响。 通过这种方式聊天上网应该和直接接 USB 设备完全一样。本文就是在通过树莓派转发的前提下用键盘打字写的。

不过如果网络负载本身就很大的话,可能会一些延迟,比如我开着 OBS 直播打东方的时候,原本就手残 的我感觉更加手残了……

试过拿着树莓派在房间到处走,走到无线信号覆盖不到的地方, usbip 会断掉,PC 上的现象就像是 USB 设备被拔下来了……所以如果无线网络不稳的话,可能需要对上面脚本做个循环?不过那样可能会用起来很别扭吧。

以及,上述操作 usbip 是走 TCP 3240 端口,数据包大概完全没有加密,所以考虑安全性的话, 最好还是在内网环境使用。不过转念一想,万一有别人接上了我导出出去的 USB ,也就是截获我的键盘, PC 这边没法 attach 设备了,应该马上会发现吧。我敲打 sudo 之类命令的时候 shell 里面没有回显, 就不会再继续敲密码了。而且似乎对攻击者也没有什么好处?要是他 usb attach 到了我的设备上, 我就能控制他的键盘了耶~

by farseerfc at February 06, 2019 05:14 PM

January 19, 2019

ヨイツの賢狼ホロ

Arch Linux 中文社区仓库从使用到打包(大雾)

/me 自从用了 Arch Linux 以后,就有了那种想要做些什么的感觉了呢(大雾)

Arch Linux 中文社区仓库是啥,我该怎么用?

Arch Linux 中文社区仓库 是由 Arch Linux 中文社区驱动的非官方用户仓库,包含一些额外的软件包以及已有软件的 git 版本等变种。部分软件包的打包脚本来源于 AUR。

Emmmm 这个介绍应该够看了吧……

要使用的话,编辑 /etc/pacman.conf ,加入中文社区的仓库地址:

[archlinuxcn]
Server = https://cdn.repo.archlinuxcn.org/$arch

这个 Server 的 CDN 除了国内几乎都能用,国内的话可以去 https://github.com/archlinuxcn/mirrorlist-repo 看一下可用的镜像。

然后安装 keyring (不然汝是装不上里面的包的):

# pacman -Syyu archlinuxcn-keyring

如果在使用的过程中遇到了啥问题的话,除了 上社区交流群吹水 以外,也可以去 中文社区仓库在 Github 上的 Issues 页面 提问。(问之前记得看看模板和现有的问题,以及老生常谈的提问的智慧)

然而上面的这些都不是重点(雾),要是汝有心意的话,为啥不来一起打包呢(期待的眼神)

申请成为中文社区仓库的维护者

直接参考 https://github.com/archlinuxcn/repo/wiki/申请当维护者 就好啦~

如果汝有幸通过了的话,可以接着往下看了(滑稽)

向中文仓库新增软件包之开始之前

开始之前的话,有一些软件包需要装:

  • base-devel (这个应该在汝用 AUR 的时候就装上了吧)
  • devtools (可以生成一个干净的环境来编译软件包)
  • devtools-cn-git (上面的小修改版,如果汝的软件包的依赖有 [archlinuxcn] 的软件包时可以使用)
  • archcn-tools-meta (一些工具的合集的元包)

如果可以的话,最好打开 testing 和 community-testing 仓库 来提前为用户踩坑……

向中文仓库新增软件包之手动打包篇

既然汝有心意加包(?)了的话,应该对 makepkg 的使用很谙熟了吧,这里就 偷下懒不赘述了 😂

中文社区仓库对手动打包的要求大概是这样的:

如果是在本地打包,请将包文件上传至编译服务器自己主目录下的临时目录 ,上传完毕后移动到 /home/repo 目录,以避免网络中断或者其它原因造成不完整的包被添加到源中。

如果汝有翻过 wiki 的话会发现咱漏掉了在服务器上打包那部分对不对?(不要在意那些细节.webp.png) 在生成完软件包后,用 gpg 生成一个分离签名:

$ gpg --detach-sign /path/to/your/package.pkg.tar.xz

签名完毕以后汝就会在打好的软件包目录中发现同名的 sig 文件,把这个文件和软件包一起上传到编译机上就 OK 啦~

  • 不要直接上传到 ~/repo 中,而是先上传到汝的主文件夹的一个位置上再通过 ssh mv(移动) 过去 😂

向中文仓库新增软件包之紫丁香篇(?)

然而实际操作中手动打包的场合越来越少了,现在大家都会用一些技巧来自动的更新啦,例如 紫丁香 lilac。

Lilac 是 Arch Linux CN 目前主要的打包机器人,主要由百合负责开发 ( lilydjwg )。

要想找 lilac 帮忙的话,有两个文件不可少:

  • lilac.yaml , 一些诸如维护者和更新时机的元数据。
  • lilac.py , lilac 看到这个文件的时候才会尝试自动更新的哦~

lilac.yaml的详细结构和语法可以在 https://archlinuxcn.github.io/lilac/ 上找到。 如果不知道怎么写的话,翻翻仓库里已经有的 lilac.yaml 咯~

在提交前记得运行一下仓库里的 ./pre-commit 来检查一下自己的的 lilac 的设置有没有问题, 可以通过设置 git hooks 做到在提交之前自动运行(其实就是一个 ln)

ln -sr pre-commit .git/hooks/pre-commit

Lilac 常见问题 收集了一些大家在用 lilac 的时候遇到的问题,如果汝有遇到类似的问题的话可以参考,自己的经验也可以写在上面。

以收养(?) AUR 的软件包为例举一个使用 lilac 的栗子

AUR 里的包大概是 [archlinuxcn] 里的主要成分 😂

这里就用咱在 AUR 和 [archlinuxcn] 里都有维护的 parsoid 举例了 ~

首先从 AUR 获得 PKGBUILD 和一系列安装时会用到的文件,然后放在仓库的 archlinuxcn/ 文件夹中。

然后在里面新建一个 lilac.yaml:

# maintainers 就是这个包的维护者啦,如果编译遇到啥问题不通过的话
# lilac 会给相应的维护者发邮件哦~
# 基本上设置成汝 Github 的用户名就可以,如果汝没有设置公开邮件地址的话,
# 记得另外设置个 email 属性。
maintainers:
- github: KenOokamiHoro
# build_prefix 就是编译时要使用哪一个 devtools 里的命令啦(大概),
# 对于大多数包来说, extra-x86_64 就 OK。
# 可以使用的各种类型去翻 schema 啦
build_prefix: extra-x86_64
# pre_build 和 post_build 是 lilac 在编译之前和之后运行的函数,
# 对于大多数 AUR 的包, aur_pre_build 和 aur_post_build 就 OK。
pre_build: aur_pre_build
post_build: aur_post_build
# update_on 是更新来源的列表,对于想在 AUR 更新时更新的这种状况而言,
# - aur: <AUR 上的软件包名称> 就好啦~
# 记得第一项应当是软件的来源,剩下的是重新打包的时机。
update_on:
- github: wikimedia/parsoid
  use_max_tag: true
- aur: parsoid

然后新建一个空白的 lilac.py 用来提示(?) lilac 自动更新。

在自己编译 OK 和 pre-commit 测试通过以后就可以提交啦,lilac 会在每日北京时间1, 9, 17点17分在社区编译机上运行, 以检查软件的新版本及自动打包。

https://build.archlinuxcn.org/ 上可以查看软件包的编译状态和上次更新时间等相关信息。 在 #archlinux-cn 频道里可以通过 !cnbuild 命令看个大概(大嘘

所以那个 lilac.py 是一直都是空白的嘛?

如果汝要在编译之前执行某些操作,汝可能需要在 lilac.py 里写些东西,例如:

  • AUR 中的 PKGBUILD 已经 out-of-date ,但是希望通过 AUR 中的 PKGBUILD 来构建软件包,需要修改 pkgver 和 hash 值时;
  • AUR 中的 PKGBUILD 修改包括依赖、构建函数等才能正确构建软件包时;
  • 通过 sourceforge 等其他网站直接检查版本更新,但希望通过修改 AUR 中的 PKGBUILD 来构建软件包时。
  • ……

这里有一些例子 , 需要的话也可以翻翻仓库里不为空的 lilac.py 学习一下。

by ホロ at January 19, 2019 04:00 PM

January 18, 2019

ヨイツの賢狼ホロ

Sailfish OS 移植中(3)- 更新和各种杂务续篇

如果 Target 更新了该怎么办? _(:з」∠)_

更新 Target SDK

在 Platform SDK Shell 里运行:

# sdk-assistant 方式
$ sdk-assistant update <target-name>
# sdk-manage 方式
$ sdk-manage tooling update <name>
$ sdk-manage target update <name>

当然要是布星的话把 /srv/mer 删了重新来一遍也行啊 ……

更新源代码和 submodules

切换到 libybris 的目录,然后运行 repo sync --fetch-submodules

  • 记得先提交汝的修改。

还有一些 submodule 需要更新:

  • rpm/dhd
  • hybris/droid-configs/droid-configs-device
  • hybris/droid-hal-version-$VENDOR-$device/droid-hal-version

在这些目录里运行:

# git remote -v 获得远程分支
$ git remote -v
github      https://github.com/mer-hybris/droid-hal-configs (fetch)
github      https://github.com/mer-hybris/droid-hal-configs (push)

# 拉取远程的源代码
$ git fetch github
$ git pull github master

然后把 hybris-boot 和 droid-hal 重新打包一下就好(忘了怎么搞? 去翻翻以前的文章或者文档吧 😂)

跳过教程

每次刷机都要重新设置和看一遍教程很烦? 在教程画面从左上角顺时针点按屏幕即可跳过(大嘘

hybris-15.1 移植的相关事项

在编译 hybris-hal 之前:

cd $ANDROID_ROOT
mkdir -p hybris/mw
cd hybris/mw
git clone --recurse-submodules https://github.com/mer-hybris/libhybris.git -b android8-initial

以及不要在 build_package.sh 时编译 libhybris ,而是先手动单独编译:

rpm/dhd/helper/build_packages.sh  -b hybris/mw/libhybris/

然后再编译剩下的包(记得跳过 libhybris)。

When running build_package.sh always skip building libhybris and instead run in PLATFORM_SDK

接着把 https://github.com/mer-hybris/droid-config-sony-nile/tree/master/sparse/usr/libexec/droid-hybris/system/etc/init 复制到汝的 config repo 然后运行:

build_packages.sh -c

通过 adb 解压 tarball 和刷写内核映像

有时可能用得上?(例如不想整个重新来过的时候)

# adb push <汝本地的文件路径> <手机的文件路径>
$ adb push your_sailfishos_tarball.tar.gz /sdcard/
$ adb push out/target/product/$DEVICE/hybris-boot.img /sdcard/
adb shell
# 如果汝是在 TWRP 里运行的话默认就是 root 了,于是不需要 su 这一步
# (但是有可能需要先把 /data 挂载上)
su
# 解开 tarball
mkdir -p /data/.stowaways/sailfishos
tar --numeric-owner -xvzf /sdcard/our_sailfishos_tarball.tar.gz \
-C /data/.stowaways/sailfishos
# 汝可能需要自己确定一下汝手机 boot 分区在哪个设备上
dd if=/sdcard/hybris-boot.img of=/dev/block/platform/msm_sdcc.1/by-name/boot

在 Android 中操作 Sailfish OS 的 chroot

前提是汝的 /data 没有加密(不然是启动不了 Sailfish OS 的)

$ adb shell
# 这里只是表示进了 Android 的 shell 😂
(android) $ su
# 挂载各种虚拟文件系统
(android) # mount -o bind /dev /data/.stowaways/sailfishos/dev
(android) # mount -o bind /proc /data/.stowaways/sailfishos/proc
(android) # mount -o bind /sys /data/.stowaways/sailfishos/sys
# chroot 进去
(android) # chroot /data/.stowaways/sailfishos/ /bin/su -
# 生成 /etc/resolv.conf ,然后就能用 Android 的网络上网了。
(sailfish) # echo "nameserver 8.8.8.8" >/etc/resolv.conf

by ホロ at January 18, 2019 04:00 PM

January 10, 2019

Felix Yan

用脏办法解决 BLE 鼠标重连后指针不动的问题

我的蓝牙鼠标(雷柏 MT750)使用 BLE(Bluetooth Low Energy) 连接笔记本时,时常遇到自动重连后电脑这边认为已连接,而鼠标那边灯自动灭掉,鼠标指针无反应的问题。在网上反复搜索 bluez 相关问题找到了许多类似问题,鼠标类型也集中在罗技、ThinkPad 等 BLE 鼠标上。

偶然间发现每次重连后,如果手动用 bluetoothctl 发一个 “pair” 指令(会超时失败),就能令鼠标正常连接。给 bluez 报了一个 bug 后,我写了下面的简单脚本先绕过问题:

#!/usr/bin/python

import dbus
import dbus.mainloop.glib
from gi.repository import GLib

adapter = "hci0"
device = "xx:xx:xx:xx:xx:xx"
device_path = '/org/bluez/' + adapter + "/dev_" + device.replace(":", "_")

dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
system_bus = dbus.SystemBus()
device_object = system_bus.get_object('org.bluez', device_path)
device_interface = dbus.Interface(device_object, 'org.bluez.Device1')

def device_info(_arg0, event, _arg2):
    if event.get("Connected"):
        print("Mouse connected, attempt to pair...")
        try:
            device_interface.Pair()
        except dbus.exceptions.DBusException:
            pass

system_bus.add_signal_receiver(
    device_info,
    dbus_interface='org.freedesktop.DBus.Properties',
    signal_name="PropertiesChanged",
    arg0='org.bluez.Device1')

GLib.MainLoop().run()

保持在后台运行即可。我自己测试了一段时间,效果非常好。

PS: bluez 上游 bugzilla 堆满了各种没有回答的错误报告,目测不是那么好修的……

by Felix Yan at January 10, 2019 06:39 PM

January 09, 2019

ヨイツの賢狼ホロ

啥???三年了????

其实还是差几天😂

活动

  • 挖了一些新坑,例如把 Sailfish OS 移植到 Nexus 6 、随便翻译了些文章和软件的文档、和开始写一个连名字和基础发行版都没确定下来的 GNU/Linux 教程 😂
  • 向所谓的垃圾佬(?)迈出了第一步?
  • 自己作出了人生(?)中第一个重要(?)决定。(???)
  • 继续肝音游。(Emmmm
  • 认识了更多的人和地方(也有的地方好久没去过了的样子)
  • せやなー

问题

  • 文章的数量在下降?

    也许是因为有不少东西都放到别的地方写了的原因……

  • Seyana... Soyana... Sorena... Arena... わかる

计划?

  • 当然是填坑啦(虽然很有可能咕咕咕)
  • 一直有想法和友链的各位来一次笔谈呢,就是不知道该怎么开始 😔
  • 知らんけど~ 知らんがな~

新年的第一篇文章竟然就是篇水文?

せーやっ せーやっ せーやっ せーやっ せーやっ せーやっ

な。

by ホロ at January 09, 2019 04:00 PM

January 02, 2019

百合仙子

解析 zxinc IPv6 数据库

本文来自依云's Blog,转载请注明。

很久以前,我就开始使用纯真 IP 数据库来进行简单的 IP 归属查询。离线数据库的好处在于快速、可依赖,我可以使用 ipmarkup 程序来快速地给文本中的所有 IP 地址注解。

然后随着 IPv6 的普及,我越来越多地需要查询 IPv6 地址了。每次 whois 或者找 ipip.net 实在是太没效率了,还暴露隐私。于是看到这个IP地址查询网站提供离线数据库下载之后,就也做了一个和 LinuxToy 介绍的这个程序类似的工具。

数据格式部分参考《纯真IP数据库格式详解》以及该网站自带的简略说明。

ipdb 程序库(带命令行)使用截图:

ipdb 命令行使用截图

用于在文本中标注 IP 的 ipmarkup 工具链接开头给了。另外有一个 cip 可以根据情况调用 ipdb 或者 QQWry。

ipdb 解析部分只依赖 Python 3.5+,下载及更新部分会依赖我同一仓库中的 myutils 库。

顺便我也优化了一下 QQWry 模块:一是没必要保留一个低效率的版本,二是既然用 mmap 了,就去掉了所有的 seek 操作,目前大概是线程安全的了。这种跳转来跳转去的二进制格式,就算不用 mmap,也可以用 pread 来操作,免得要维护个当前文件位置,还线程不安全。

by 依云 at January 02, 2019 01:05 PM

December 27, 2018

ヨイツの賢狼ホロ

知识管理 ABC

Why, what, how? 😂

所以这是个啥玩意?

「咱可是贤狼啊。起码还是知道这世界上有很多东西是咱所不了解的。」

知识管理嘛,翻译成英文大概就是 Knowledge Management。汝在 Wikipedia 上大概能找到这样的定义:

Knowledge management (KM) is the process of creating, sharing, using and managing the knowledge and information of an organisation. It refers to a multidisciplinary approach to achieving organisational objectives by making the best use of knowledge.

内容管理指的是创建、分享、使用和管理知识和组织信息的过程。它指的是运用多种方法 充分利用知识实现有组织的目标的方法。

是不是很难懂,这么巧咱一向不擅长定义……

那为啥要管理知识呢?

「有句话是这么说的:『知道方法的人会求得工作,知道这些人为何要工作的人,则会成为雇主』。」

就咱自己的经(che)验(dan)来说呢,构建一个属于自己的知识库大概有这么几个好处:

  • 节省时间

    有很多内容,【不】需要全部都记在脑子里。在信息时代,这么干是不现实滴。 不过虽然汝可能不需要完完全全的记住,但肯定要记住一些关键点。 (例如汝可能不会记住光速的具体数值,但是汝可能会记下需要的时候上网搜索一下就 OK,是呗~)

    再进一步,如果汝有一个自己的知识库(暂且这么叫?)的话,汝找到自己需要的知识的速度也会在简单 的搜索网络上更快一级咯(因为搜索范围小了?)

  • 促进系统化

    在收集知识构建自己的知识库的过程中,汝也许会发现自己的知识结构有哪些不足之处,说不定会激励汝自己 去学习。

  • ......

嗯上面(和下面)都是咱瞎说的,有什么问题和建议的话记得让咱知道 😂 具体对汝有没有好处的话还需要汝自己尝试一段时间来验证一下。

实现知识管理面面观

如果要打造一个汝自己的知识库的话,汝可能会考虑下列因素:

  • 反应迅速,可以在汝需要时就立刻准备好。
  • 组织合理,有一套相对合理的组织结构(例如目录一样的树形结构、或者分类标签一类的网状结构)。 日后查找起来也会更得心应手。
  • (对自己来说)操作简便,有人习惯功能丰富的图形界面,有人习惯简单强大的源代码风格。不过 适合自己的就是最好的啦~
  • 运行灵活,可以在汝的各种设备上(例如手机和电脑等)查阅和修改。
  • 安全可靠,例如可以通过加密保护自己的知识库不被外人查看,支持备份可以防止丢失。
  • 等等……

而实现知识库的方法咱认为有很多啦,例如:

  • 文件型,就是简单的文件存储。
  • 笔记型:和传统的笔记本(不是电脑)类似。
  • 维基(Wiki)型,典型的例子就是维基百科。

实现知识管理之文件型

所谓的文件型,大概就是把汝收集来的各种知识稍微组织一下放在某个存储空间上吧(强行定义)。

  • 因为文件都在本地,所以找起来应该会很快。只是如果要找不同类型的文件的话预览可能会麻烦一些。
  • 至于组织嘛,目录就是天然的树形结构,然而标签那种的网状结构就 emmmm......
  • 至于操作,文件管理器不会用嘛 😂 如果要在各种设备上访问的话,可以找一个都能连上的电脑(例如 一台服务器)?
  • 加密和备份就和普通的文件一样咯 ~

实现知识管理之笔记型

首先汝来回忆一下笔记本,汝可能有一个或者多个笔记本带在身上,需要的时候就打开对应的笔记本查找内容, 或者再拿出笔来写些什么。

  • 所以博客有时也算笔记的一种?
  • 或者其它的一些专门的笔记软件,例如 Gnote 和 OneNote 等。
  • 基本上笔记本软件都支持多个笔记本和分区功能,有的还提供标签功能,算是提供了两种组织结构吧……
  • 笔记本文件可以单独加密并携带,或是上传到各种云端存储中同步存取。

实现知识管理之 Wiki 型

现在用浏览器打开维基百科看看?(虽然 Wiki 并不等于维基百科,但谁让维基百科太著名了呢)

  • 像维基百科使用的 MediaWiki 的分类既支持树形结构(字分类),又可以支持网状结构 (一个条目可以属于多个分类,就像博客软件常用的标签一样)
  • 以及这种 Web 应用只要有一个浏览器就能打开?
  • 加密和备份就是带上 wiki 的文件夹、数据库和 Web 服务器配置咯 ~

实际上呢?

实际上的话,汝完全可以把一种或者几种方法组合起来用啊。例如心智图作为梗概,笔记或 Wiki 放置文字内容。 然后在汝自己的知识库中放置各种文件。然后可以把它们一起加密起来备份到其他地方。

如果汝有能力而且愿意的话,完全可以自己写一个自己用起来顺手的知识管理系统咯(特别是汝自称是程序猿的话)。 或者自行创造一个新的知识管理流派(大雾)。

然而首先要汝自己肯动手去做才行……以及就算汝有了这些知识,要是不会使用的话…… 那不是百忙活了? 😂

by ホロ at December 27, 2018 04:00 PM

December 25, 2018

百合仙子

Ant Design 彩蛋事件之我见

本文来自依云's Blog,转载请注明。

事情是这样的:一个叫「Ant Design」的大概有挺多人用的前端框架加入了一个彩蛋,在12月25日这天会更改按钮样式并修改提示文字为无意义的消息。

由于使用广泛,此事搞得比较严重,听说有程序员因此被开除,还有不少老板在跟甲方解释。事发之后,作者发布了道歉,并称「这完全是我个人的一意孤行且愚蠢的决定」。

确实很愚蠢,因为当事人似乎还没有意识到自己为什么「愚蠢」。在程序库中加入未预期的行为,是十分不负责任的表现。

库应当提供机制而非策略,并且具有良好定义的行为。软件中彩蛋这种东西由来已久,为什么这次影响这么大呢?其根本原因不在于它是开源软件,也不在于使用广泛,而是在于——它是库。库能不能提供彩蛋呢?是可以的,只要它是以 opt-in 的形式提供的,并且有文档明确其行为,使用方需要显式启用就没有任何问题。库的作者不需要知道圣诞节还可能在1月,也不需要知道代码是运行在哪个国家,他的职责应当是提供清晰明确的行为,而不是某天给你耍个花招。只有最终面向用户的应用才知道什么样的彩蛋对于它的用户是合适的,所以决定权在于应用。

至于那些在 issue 下边滥骂的人,真是给中国人丢脸唉。

PS: 关于「洋节」,shell909090 有篇文章《关于抵制洋节》。关于阿里巴巴,shell909090 还有篇《最近的阿里月饼事件》。

PPS: 每当国外发生这种令程序员们关注的事件的时候,Internet ArchiveArchive.is 上都有会很多的存档来保留历史,而国内发生这种事件,却并没有多少人去存档。大概有保存意思的人们也只是自私地本地截图保存了吧。

by 依云 at December 25, 2018 06:11 AM

December 23, 2018

farseerfc

【听译】君さえいなけりゃよかった

君さえいなけりゃよかった 如果你从未出现过该多好
降り出した雨の中で 君に出会った时から 下起雨的那一刻 从遇到你那时起
君がいないということが 当たり前じゃなくなった 身边没有你的情况 就已经不再是平常
ああ こんなはずじゃない 啊 不应该是这样的
ずっと自分胜手にさ 过ごせたはずなのに 明明一直是散漫地过着自己的日子
まるで仆じゃないような仆が さらけ出されてくよ 就像是带出了不是我的另一面的我

君さえいなけりゃよかった こんな気持ちは知らないから 如果你从未出现过该多好 就不会知道这种心情
やらなくちゃいけないことが 手つかずのまま积もってく 一堆不得不做的事情 堆在手头越积越多
仆じゃなくてもいいのなら こっちを见て笑わないでよ 如果不是我也可以的话 就别看着我这边笑啊
大袈裟じゃなくてそれだけで 忘れられなくなるの 甚至那些不重要的事情 都变得难以忘记了

君の适当な话も 全部心に刺さります 你无意间随口说的话 全都刺在心头
気にしなけりゃいいのにな 残らずかき集めちゃうの 虽说只要不在意就可以了 却一句不剩全收集了起来
ああ こんなはずじゃない こんなはずじゃない 啊 不应该是这样的 不应该是这样的

君に出会わなきゃよかった こんなに寂しくなるのなら 如果没遇到过你该多好 就不会变得如此寂寞
君じゃなくてもいいことが もう见つからないの 已经找不到 和你无关也可以的情况了
忘れられないから 君じゃなかったら 无法忘记了 要不是你的话

いっそ见损なってしまうような そんなひとだったらなあ 干脆变成根本看不起的人 如果是那种人的话
でもそれでも どうせ无理そう 嫌いになれないや 但是即使如此 大概反正也不可能 无法变得讨厌

仆がいなくてもいいなら いっそ不幸になってしまえ 如果不是我也可以的话 干脆变得不幸吧
最后にまた仆の元に 泣きついてくればいい 最后还是会回到我身边 哭着凑过来的话就可以
君さえいなけりゃよかった こんな気持ちは知らないから 如果没有你该多好 就不会知道这种心情
やらなくちゃいけないことが 手つかずのまま积もってく 一堆不得不做的事情 堆在手头越积越多
仆じゃなくてもいいのなら こっちを见て笑わないでよ 如果不是我也可以的话 就别看着我这边笑啊
大袈裟じゃなくてそれだけで 甚至那些不重要的事情
君のこと 间违いなく 对你 毫无疑问
苦しいほど 好きになっちゃうよ 刻骨铭心地 变得喜欢上了啊

忘れられないから 君じゃなかったら 因为无法忘记 如果不是你的话
君に出会わなきゃ 仆じゃなかったら 要是没遇到过你 如果不是我的话
君さえいなけりゃよかった 如果你从未出现过该多好

by farseerfc at December 23, 2018 02:04 PM

December 16, 2018

ヨイツの賢狼ホロ

备份 GNU/Linux 操作系统的经(che)验(dan)合集

备份 GNU/Linux 操作系统的经(che)验(dan)合集

为啥要备份?

  • 防震减灾(雾),其实就是防止各种意外情况(例如硬盘坏掉,电脑丢失等)发生时手足无措……

    那备份的硬盘也坏了怎么办(先有鸡还是先有蛋?)

  • 方便迁移(例如买了新电脑的时候)

  • ……

Point 0: 要备份些啥?

一个典型的 GNU/Linux 的根文件系统大概像这个样子:

lrwxrwxrwx   1 root root     7 Aug 21 22:21 bin -> usr/bin
drwxr-xr-x   4 root root 16384 Jan  1  1970 boot
drwxr-xr-x  22 root root  3460 Dec 19 11:27 dev
drwxr-xr-x   1 root root  3464 Dec 19 14:13 etc
drwxr-xr-x   1 root root     8 Dec 19 10:55 home
lrwxrwxrwx   1 root root     7 Aug 21 22:21 lib -> usr/lib
lrwxrwxrwx   1 root root     7 Aug 21 22:21 lib64 -> usr/lib
drwxr-xr-x   1 root root   114 Dec 19 14:19 mnt
drwxr-xr-x   1 root root   138 Dec 17 09:19 opt
dr-xr-xr-x 298 root root     0 Dec 19 11:26 proc
drwxr-x---   1 root root   212 Dec 19 14:47 root
drwxr-xr-x  24 root root   640 Dec 19 14:13 run
lrwxrwxrwx   1 root root     7 Aug 21 22:21 sbin -> usr/bin
drwxr-xr-x   1 root root    14 Nov 20 23:34 srv
dr-xr-xr-x  13 root root     0 Dec 19 11:26 sys
drwxrwxrwt  15 root root  1460 Dec 19 14:46 tmp
drwxr-xr-x   1 root root    80 Dec 19 14:13 usr
drwxr-xr-x   1 root root   116 Dec 19 08:46 var

熟稔 FHS 的话应该知道有些目录其实是不在 硬盘上的(例如 /dev , /sys 和 /proc 等等),还有些目录下的文件没什么用(例如 /tmp , /var/tmp 等等)。

那么该备份哪些呢?

Point 1: rsync

rsync 是 Unix 下的一款应用软件,它能同步更新两处计算机的文件与目录, 并适当利用差分编码以减少数据传输量。

rsync 中的一项同类软件不常见的重要特性是每个目标的镜像只需发送一次。 rsync 可以拷贝 / 显示目录内容,以及拷贝文件,并可选压缩以及递归拷贝。

既然备份只是把文件从一个地方复制到另一个地方而已,本来只用 cp 说不定也行。 但是为了省事(例如只复制变化的部分),处理各种状况(例如文件属性和权限), 跨设备和网络复制(例如通过 SSH ),就有了 rsync 咯~

rsync 核心的用法和 cp 几乎一样:

rsync <source> <target>

例如要把 /home 下的内容复制到 /data:

rsync /home /data

当然为了应对各种情况, rsync 也有不同的参数:

  • --archive / -a :存档模式,等于 -rlptgoD (这些短参数是啥啦……), 会保留文件的大多数属性(例如不会留扩展属性、ACL 和硬链接)和符号链接。

    想要保留扩展属性 / ACL 和硬链接的话,可以分别使用 --xattrs (-X) , --acls (-A) 或 --hard-links (-H) 参数。

  • --one-file-system:只备份这一个文件系统的内容,于是就不会备份 /sys 啊 /proc 啊 /dev 啊 /tmp 这类目录了,当然如果汝和咱一样 /home 是单独挂载的话也会……

  • --numeric-ids:把用户名/组名处理成数字而不是实际的名称,跨不同的系统备份时 可能会有用。

  • --verbose:顾 GNU 参数列表思义的 “罗嗦” 模式,会详细输出正在传送的文件的信息。

  • --progress:显示一个传送文件的进度显示。

  • --exclude 和 --exclude-from:指定传送过程中排除哪些文件。 --exclude 用来明确地指出 排除哪些文件, --exclude-from 是一个包含文件名列表的文件。

    当然和 --exclude 相对的自然有 --include 和 --include-from,用法类似。

  • --dry-run / -n:模拟运行,防止手抖 😂

当然 rsync 的参数远不止这些啦,剩下的自己查手册页( man rsync )咯。于是咱自己备份的话通常是这样:

rsync --archive --acls --xattrs --verbose --progres /source /target

啥,汝问为啥没有 --one-file-system ?那是因为咱一般都会把根分区单独再挂载到别的地方再 rsync。 没有 --exclude 纯粹就是懒了 😂

Point 2: btrfs 的 subvolume

btrfs 的子卷(subvolume)看起来和普通的目录无异,但是可以通过不同的挂载参数让它作为单独的分区挂载, 例如挂载 /dev/sda2 上的子卷 ./root 到 /mnt :

当然汝也能在 -o 后面加上别的参数啦,例如 --compress=lzo 启用压缩什么的,记得不同的参数用 逗号分开。

# mount -o subvol=root /dev/sda2 /mnt

要创建一个子卷的话,可以用 btrfs subvolume create 命令:

# btrfs subvolume create <name_of_your_subvolume>

要列出子卷的列表的话,可以用 btrfs subvolume list 命令:

# btrfs subvolume list <path/to/your/volume>
root@yoitsu_optiplex /run/media/horo/External
# btrfs subvolume list .                                             :(
ID 257 gen 2007 top level 5 path data
ID 258 gen 2088 top level 5 path local
ID 294 gen 2016 top level 5 path backup
ID 295 gen 2012 top level 294 path backup/home_20181031
ID 328 gen 2086 top level 294 path backup/parabola_root_20181031
ID 353 gen 1998 top level 294 path backup/home_20181215
ID 360 gen 2005 top level 294 path backup/parabola_root_20181215
ID 373 gen 2086 top level 294 path backup/arch_optiplex
ID 432 gen 2089 top level 5 path temp

建立的子卷可以是某个子卷的快照:

# btrfs subvolume snapshot [-r] <source> <target>

-r 参数用来创建只读快照

可以通过 btrfs send 和 btrfs recieve 在两个 btrfs 卷之间传送子卷(或子卷的快照),不过要是 只读的才行:

# btrfs send <path/to/your/subvolume> | btrfs recieve <path/to/your/save/place>

如果创建快照时忘记设置只读,可以通过 btrfs property 命令设置上(当然也可以取消只读):

# btrfs property set -ts <path/to/your/subvolume> ro [true|false]

汝也可以传递增量快照,就像这样:

# btrfs send <path/to/your/subvolume> -p <path/to/your/parent_subvolume> | btrfs recieve <path/to/your/save/place>

不过汝要先把父快照传送到目标才行。

例如建立今天的快照然后以 2018 年 10 月 31 号的快照为基础发送出去:

date 命令返回今天的日期和时间,也可以指定一个格式字符串来按某个特定的格式输出。

以 $ 包围的命令会以它的结果填充,例如 echo "root_$(date +"%Y%m%d")" 的 结果是 20181219 (咱写完这篇文章的时间,汝自己运行的话结果肯定会和咱有变化)。

# btrfs subvolume snapshot -r root root_$(date +"%Y%m%d")

# btrfs send root_$(date +"%Y%m%d") -p root_20181031 | btrfs revieve /backup

Point 2: 使用 dm-crypt 加密分区

为啥要加密应该不用再解释了吧,毕竟汝主目录里是不是有不少公开或者隐私的数据是不是? 例如 cookies 和帐号配置啦,邮件啦,和聊天记录等等。

cryptsetup 是操作 dm-crypt 用的前端,可以这样创建一个加密的设备:

# cryptsetup luksFormat <设备文件的名称>

如果需要的话,可以在 luksFormat 之前加上一些选项呐:

参数的名称 这啥? 推荐是多少? 一些废话
--cipher 加密方式 aes-xts-plain64 AES 加密算法搭配 XTS 模式
--key-size 密钥长度 512 XTS 模式需要两对密钥, 每个的长度是256
--hash 散列算法 sha512  
--iter-time 迭代时间 >10000 单位是毫秒。该值越大,暴力破解越难; 但是相应的汝打开加密分区时就要等一下啦~

例如这样?

# cryptsetup --cipher aes-xts-plain64 --key-size 512 --hash sha512 --iter-time 10000 luksFormat /dev/nvme0n1p1

WARNING!
========
这将覆盖 /dev/nvme0n1p1 上的数据,该动作不可取消。

Are you sure? (Type uppercase yes):
# 上面要打大写的 YES
# 然后输入两遍加密分区的密码。
输入密码:
确认密码:

然后等一下就好咯~

然后用 cryptsetup open 打开分区:

# cryptsetup open <已经加密的设备文件名称> <映射名称>

解密的分区会映射到 /dev/mapper/<汝设置的映射名称> 呗~

例如咱解密 /dev/nvme0n1p1 ,然后映射到 /dev/mapper/sysroot :

# cryptsetup open /dev/nvme0n1p1 sysroot

接下来就像操作普通分区一样操作 /dev/mapper/sysroot 就好啦,例如创建文件系统:

# mkfs.btrfs /dev/mapper/sysroot

by ホロ at December 16, 2018 04:00 PM

December 14, 2018

Phoenix Nemo

制作 Arch Linux 内存系统启动盘

之前尝试过 Arch Linux in RAM 完全运行在内存中的轻量业务系统,最近在维护一些物理服务器看到没有安装系统的服务器不断重启,想到了可以制作类似的内存系统启动盘,以高效完成系统测试、安装、远程维护等任务。

这时候就要祭出 mkarchiso 大法了。这是自动化制作最新版 Arch Live 镜像的工具集,当然也可用于制作定制化的 Arch 镜像。

准备

首先安装 archiso

1
~> sudo pacman -Syy archiso

它提供了两种配置方案,一种是只包含基本系统的 baseline,一种是可以制作定制 ISO 的 releng。要制作维护用 ISO,当然是复制 releng 配置啦。

1
2
~> cp -r /usr/share/archiso/configs/releng/ archlive
~> cd archlive

定制

整个过程不要太简单。先来了解下各个文件的用途:

  • build.sh - 用于制作镜像的自动化脚本,可以在这里修改一些名称变量或制作过程的逻辑。
  • packages.x86_64 - 一份要安装的包列表,一行一个。
  • pacman.conf - pacman 的配置文件,不用多说了吧。
  • airootfs - Live 系统的 rootfs,除了安装的包之外,其他的定制(以及启动执行脚本等)都在这里。遵循 rootfs 的目录规则。
  • efiboot / syslinux / isolinux 用于设置 BIOS / EFI 启动的配置。

[archlinuxcn] 仓库加入 pacman.conf

1
2
[archlinuxcn]
Server = https://cdn.repo.archlinuxcn.org/$arch

然后修改 packages.x86_64,加入 archlinuxcn-keyring 和其他需要预安装的包:

1
2
3
4
5
archlinuxcn-keyring
htop
iftop
iotop
ipmitool

按需修改即可啦。

要启动为内存系统,需要加启动参数 copytoram

修改文件 syslinux/archiso_pxe.cfgsyslinux/archiso_sys.cfg 文件,在启动参数后加 copytoram,像这样:

1
2
3
4
5
6
7
8
9
10
11
INCLUDE boot/syslinux/archiso_head.cfg

LABEL arch64
TEXT HELP
Boot the Arch Linux (x86_64) live medium.
It allows you to install Arch Linux or perform system maintenance.
ENDTEXT
MENU LABEL Boot Arch Linux (x86_64)
LINUX boot/x86_64/vmlinuz
INITRD boot/intel_ucode.img,boot/amd_ucode.img,boot/x86_64/archiso.img
APPEND archisobasedir=%INSTALL_DIR% archisolabel=%ARCHISO_LABEL% copytoram

启动时即可将整个 SquashFS 文件复制到内存。如果内存比较小,也可以指定 copytoram_size 来限制 tmpfs 占用内存的最大数量。

同样,也需要修改 efiboot/loader/entries/archiso-x86_64-usb.conf 的启动参数。在 options 行添加

1
options archisobasedir=%INSTALL_DIR% archisolabel=%ARCHISO_LABEL% copytoram

制作

创建工作目录和输出目录

1
mkdir -p work out

最后一步,只需要以 root 权限执行 ./build.sh 就可以啦。

要看具体执行过程的话,加 -v-h 看所有参数。

完成后,即可在 out 目录得到准备好的 ISO 文件。将其 dd 到 USB 闪存盘,大功告成(‘・ω・’)

Ref:

  1. https://wiki.archlinux.org/index.php/Archiso
  2. https://git.archlinux.org/archiso.git/tree/docs/README.bootparams#n53

之前尝试过 Arch Linux in RAM 完全运行在内存中的轻量业务系统,最近在维护一些物理服务器看到没有安装系统的服务器不断重启,想到了可以制作类似的内存系统启动盘,以高效完成系统测试、安装、远程维护等任务。

December 14, 2018 04:40 AM

December 07, 2018

farseerfc

【译】使用 GNU stow 管理你的点文件

译注

这篇是翻译自 Brandon Invergo 的博客的英文文章 Using GNU Stow to manage your dotfiles 。 Brandon Invergo 的博客采用 CC-BY-SA 3.0 授权,因此本文也同样采用 CC-BY-SA 3.0 ,不同于其它我写的文章是 CC-BY-NC-SA 4.0 授权。

我自己已经使用此文中介绍的方案管理 我自己的 dotfiles 快 3 年了。最早想采用这样的管理方案是为了方便在多台 Arch Linux 系统之间同步配置, 后来逐渐主力系统也更新换代了一次,又同步到了自己的 vps 上去,目前管理多个 Arch Linux 上都多少都有这套配置。甚至装好 Arch Linux 添加好用户最初做的事情就是安装 stow git 然后 clone 了我自己的 dotfiles repo 下来,然后按需取想要的配置,快捷方便有效。

废话不多说,下面是原文和翻译。与之前的翻译一样,正文部分给出原文引用以便对照参考。

使用 GNU stow 管理你的点文件

我昨天偶然间发现一些我觉得值得分享的经验,就是那种「为毛我没有早点知道这个?」那一类的。 我将在这篇文章中介绍如何使用 GNU Stow 管理你的 GNU/Linux 系统中位于用户家目录里的各种配置文件 (通常又叫「点文件(dotfiles)」比如 .bashrc)。 I accidentally stumbled upon something yesterday that I felt like sharing, which fell squarely into the "why the hell didn't I know about this before?" category. In this post, I'll describe how to manage the various configuration files in your GNU/Linux home directory (aka "dotfiles" like .bashrc) using GNU Stow.
这件事的困难之处在于,如果能用版本管理系统(VCS, Version Control System)比如 Git, Mercurial(hg), Bazaar(bzr) 管理点文件的话会非常方便,但是这些点文件大部分都位于家目录的顶级目录下, 在这个位置不太适合初始化一个版本管理仓库。这些年下来我试过很多程序,设计目的在于解决这个问题, 帮你把这些配置文件安置在某个下级目录中,然后安装或者链接这些文件到它们应该在的位置。 尝试下来这些程序没有一个真正能打动我。它们要么有很多依赖(比如 Ruby 和一大坨库), 要么需要我记住如何用它,考虑到同步配置这种不算经常使用的场合,要记住用法真的挺难。 The difficulty is that it would be helpful to manage one's configuration files with a version control system like Git, Mercurial or Bazaar, but many/most dotfiles reside at the top-level of your home directory, where it wouldn't be a good idea to initialize a VCS repository. Over time I've come across various programs which aim to manage this for you by keeping all the files in a subdirectory and then installing or linking them into their appropriate places. None of those programs ever really appealed to me. They would require a ton of dependencies (like Ruby and a ton of libraries for it) or they would require me to remember how to use them, which is difficult when really for such a task you rarely use the program.
最近我在用 GNU Stow 来管理我从源代码在本地编译安装到 /​usr/​local/​ 中的一些程序。 基本上说,在这种常见用法下,是你把这些本地编译的包配置安装到 /​usr/​local/​stow/​${PKGNAME}-{PKGVERSION} 这样的位置,然后在 /​usr/​local/​stow/​ 目录中执行 # stow ${PKGNAME}-${PKGVERSION} ,然后它就会为程序所有的文件创建符号链接放在 /​usr/​local 中合适的地方。然后当你想用 Stow 卸载这个程序的时候,就不必再考虑会留下什么垃圾文件, 或者找不到安装时用的 Makefile 了。这种安装方式下也可以非常容易地切换一个程序的不同版本 (比如我想尝试不同配置选项下的 dwm 或者 st 的时候)。 Lately I've been using GNU Stow to manage programs I install from source to /usr/local/. Basically, in this typical usage, you install locally built packages to /usr/local/stow/${PKGNAME}-{PKGVERSION} and then from /usr/local/stow/ you run # stow ${PKGNAME}-${PKGVERSION} and the program generates symbolic links to all the programs' files into the appropriate places under /usr/local/. Then, when you uninstall a program via Stow, you don't have to worry about any stray files that you or a provide Makefile may have missed. It also makes handling alternate versions of a program quite easy (i.e. when I'm experimenting with different configurations of dwm or st).
前段时间在我扫邮件列表的时候,看到某个帖子中某人在说使用 Stow 管理安装他的点文件。 当时我没特别在意这个帖子,但是大概我大脑潜意识把它归档保存为今后阅读了。 昨天我想起来试试这种用法,试过后我不得不说,这比那些专门设计用来做这任务的点文件管理器要方便太多了, 虽然表面上看起来这种用法没那么显而易见。 Some time ago I happened across a mailing list posting where someone described using Stow to manage the installation of their dotfiles. I didn't pay much attention to it but my brain must have filed it away for later. Yesterday I decided to give it a try and I have to say that it is so much more convenient than those other dedicated dotfile-management programs, even if it wasn't an immediately obvious option.
方法很简单。我建了个 ${HOME}/​dotfiles 文件夹,然后在里面为我想管理的每个程序配置都 创建一个子文件夹。然后我把这些程序的配置从原本的家目录移动到这每一个对应的子文件夹中, 并保持它们在家目录中的文件夹结构。比如,如果某个文件原本应该位于家目录的顶层文件夹里, 那它现在应该放在这个程序名子目录的顶层文件夹。如果某个配置文件通常应该位于默认的 ${XDG_CONFIG_HOME}/​${PKGNAME} 位置 ( ${HOME}/​.config/​${PKGNAME} ), 那么现在它应该放在 ${HOME}/​dotfiles/​${PKGNAME}/​.config/​${PKGNAME} ,如此类推。然后在那个 dotfiles 文件夹里面,直接运行 $ stow $PKGNAME 命令, Stow 就会为你自动创建这些配置文件的符号链接到合适的位置。接下来就很容易为这个 dotfiles 目录初始化版本管理仓库,从而记录你对这些配置文件做的修改(并且这也可以极度简化在不同电脑之间 共享配置,这也是我想要这么做的主要原因)。 The procedure is simple. I created the ${HOME}/dotfiles directory and then inside it I made subdirectories for all the programs whose cofigurations I wanted to manage. Inside each of those directories, I moved in all the appropriate files, maintaining the directory structure of my home directory. So, if a file normally resides at the top level of your home directory, it would go into the top level of the program's subdirectory. If a file normally goes in the default ${XDG_CONFIG_HOME}/${PKGNAME} location (${HOME}/.config/${PKGNAME}), then it would instead go in ${HOME}/dotfiles/${PKGNAME}/.config/${PKGNAME} and so on. Finally, from the dotfiles directory, you just run $ stow $PKGNAME and Stow will symlink all the package's configuration files to the appropriate locations. It's then easy to make the dotfiles a VCS repository so you can keep track of changes you make (plus it makes it so much easier to share configurations between different computers, which was my main reason to do it).
举个例子,比如说你想管理 Bash, VIM, Uzbl 这三个程序的配置文件。Bash 会在家目录的顶层文件夹 放几个文件; VIM 通常会有在顶层文件夹的 .vimrc 文件和 .vim 目录;然后 Uzbl 的配置位于 ${XDG_CONFIG_HOME}/​uzbl 以及 ${XDG_DATA_HOME}/​uzbl 。于是在迁移配置前,你的家目录的文件夹结构应该看起来像这样: For example, let's say you want to manage the configuration for Bash, VIM and Uzbl. Bash has a couple files in the top-level directory; VIM typically has your .vimrc file on the top-level and a .vim directory; and Uzbl has files in ${XDG_CONFIG_HOME}/uzbl and ${XDG_DATA_HOME}/uzbl. So, your home directory looks like this:
home/
    brandon/
        .config/
            uzbl/
                [...some files]
        .local/
            share/
                uzbl/
                    [...some files]
        .vim/
            [...some files]
        .bashrc
        .bash_profile
        .bash_logout
        .vimrc
然后迁移配置的方式是,应该建一个 dotfiles 子目录,然后像这样移动所有配置文件: You would then create a dotfiles subdirectory and move all the files there:
home/
    /brandon/
        .config/
        .local/
            .share/
        dotfiles/
            bash/
                .bashrc
                .bash_profile
                .bash_logout
            uzbl/
                .config/
                    uzbl/
                        [...some files]
                .local/
                    share/
                        uzbl/
                            [...some files]
            vim/
                .vim/
                    [...some files]
                .vimrc
然后执行以下命令: Then, perform the following commands:
$ cd ~/dotfiles
$ stow bash
$ stow uzbl
$ stow vim
然后,瞬间,所有你的配置文件(的符号链接)就安安稳稳地放入了它们该在的地方,无论原本这些目录结构 有多么错综复杂,这样安排之后的 dotfiles 文件夹内的目录结构立刻整理得有条有理, 并且可以很容易地转换成版本控制仓库。非常有用的一点是,如果你有多台电脑,可能这些电脑并没有 安装完全一样的软件集,那么你可以手选一些你需要的软件配置来安装。在你的 dotfiles 文件夹中总是 可以找到所有的配置文件,但是如果你不需要某个程序的某份配置,那你就不对它执行 stow 命令,它就不会扰乱你的家目录。 And, voila, all your config files (well, symbolic links to them) are all in the correct place, however disorganized that might be, while the actual files are all neatly organized in your dotfiles directory, which is easily turned into a VCS repo. One handy thing is that if you use multiple computers, which may not have the same software installed on them, you can pick and choose which configurations to install when you need them. All of your dotfiles are always available in your dotfiles directory, but if you don't need the configuration for one program, you simply don't Stow it and thus it does not clutter your home directory.
嗯,以上就是整个用法介绍。希望能有别人觉得这个用法有用!我知道对我来说这个非常有帮助。 Well, that's all there is to it. Hopefully someone else out there finds this useful! I know I've found it to be a huge help.

by farseerfc at December 07, 2018 06:35 PM

December 05, 2018

ヨイツの賢狼ホロ

当汝看到加密(encryption)时应该想到什么

来自 https://ssd.eff.org/en/module/what-should-i-know-about-encryption

这个页面引用了 https://ssd.eff.org 的图片呐,汝可能需要根据情况调整汝浏览器 扩展的设置来查看它们。

汝大概已经从别的地方听说过“加密”这个词了呗,有时还和其他的单词组合在一起。 一般的,加密是指把一段数据转化为除了持有可以用来解密的密钥的人以外无法读取的形式 的一种数学过程。(这啥?)

放眼历史(嗯?)人们一直在用不同的方法加密消息,希望它们不会被除了接收者的其他人读到。 今天,借助计算机的力量,咱们不止可以用加密的方式传送消息。还可以达成其他的目的,例如 验证消息的发送者。

加密是在坏人,政府和服务提供商之间保护自己的信息的最加手段。 而且只要运用得当,几乎可以做到无懈可击(然而往往做不到完美的运用得当啦~)。

这篇指南里咱们会讨论到加密的两种主要应用方式:加密静态数据和流。

太长不看版小结

(来自 https://twitter.com/sissisiisi/status/1070522944298893312
  1. 全盘加密要小心冷启动攻击(Cold Boot Attack) ,全盘加密但是 RAM 没有加密, 因此解密的 master key 在 RAM 里面是明文出现.解决的办法嘛,用 Tails. 还有别在开机状态下被敌人物理的接触到电脑.

  2. 全盘加密的主要作用是为了防止 有能力物理接触 你的电脑的人, 比如你的家人,同事,商业间谍,FBI等等

  3. 传输加密 这块,这里要分清楚两个概念: 传输层加密,**端对端加密** 区别在于中间的服务器能不能看到加密内容

  4. 传输加密 不能加密元数据(metadata)比如发送端对端的信息的时候,对方的ID, 发送的时间,密文的长度等等

    所以高度敏感的人,应该想办法匿名.还有就是网络代理,比如你的敌人主要是本地 ISP 以及政府, 可以想办法比如利用 tor 的加密,然后发送端对端的加密邮件而不是直接发送. 这样本地的 ISP 只会看到链接 tor 的事实,而不会知道你发送了邮件.

加密静态数据

静态数据 就是存储在各种地方的数据啦。例如汝的电脑、手机、移动硬盘上的那些。 (因为上面的数据不会移动到别的介质上?)

全盘加密 (“full-disk”encryption,有时也被称作“设备加密”)是一种保护 这种静态数据的常见方法。当汝设置完成以后,就要使用密码(或其它的验证手段)解锁 来读取上面的数据。

智能手机和笔记本电脑上锁定屏幕的示例

在手机之类的移动设备上,它可能表现的就和普通的锁定屏幕一样。但锁定汝的设备不一定 表示汝启用了全盘加密……

记得检查汝操作系统中关于加密的设置来确认它有没有启用(因为不是所有的操作系统 在所有的情况下都会启用)。如果汝的设备没有加密的话,只要能解开汝设备上的锁定, 就能拿到上面的数据。

以及有些系统会把明文的数据保存在内存上,虽然内存是只要关机一会儿就会让上面的数据消失 的易失介质,但是高明的攻击者可能会尝试通过 冷启动攻击 获取内存上的数据。

全盘加密可以保护汝的数据不被能物理接触到汝设备的人获取,例如汝的室友啦、同事和雇员啦、 家人啦、各种官员(不管他们是来自学校政府还是法院)啦等等。对了还有当汝不小心弄丢了它的 时候。

除了全盘加密以外,还有诸如文件加密(加密指定的文件)和分区(磁盘?)加密(加密设备上指定的 一块区域)这样的加密方法。汝当然可以把它们组合起来使用。

除了 Surveillance Self-Defense 以外,汝还可以在其它地方找到各种有关加密设备的指南,不过要记得 检查它们是不是最新的哦~

加密传输中的数据

未加密的数据的传输流程

如果数据没有加密的话,把数据送到目标的全过程中间的环节都能看到,例如基站和服务商。

传输中的数据 是指通过网络从一处移动到另一处的数据。例如即时通讯应用中,汝编写的消息 从汝的设备中到达服务商的服务器再到接收者的设备上。又或者例如浏览网页,网站的服务器把网站 发送到汝的设备上。

有些流行的应用会提供一些诸如阅后即焚这样的看起来能保护消息的功能。然而只是给汝一种安全的 感觉 ,并不会意味着 安全的。毕竟传输过程中的设备还是能看到的不是?

有两种方式可以用来加密传输中的数据,传输层加密和端到端加密。验证汝的消息是用哪种方法加密 的和验证汝的消息是否被加密一样重要 😂 。服务提供商支持的加密类型可能 是决定哪些服务适合汝自己的重要因素,是呗~

传输层加密

传输层加密的数据的传输流程

一个传输层加密的例子,左侧的手机加密一条消息并将它发送到服务商的服务器。服务商(能够)解密消息, 再加密、发送到右侧的目标。最后目标手机解密消息。

传输层加密,有时也叫做传输层安全(TLS),保护你的数据不被汝和汝连接到的服务器中间的谁和 汝连接到的服务器到目标之间的谁读取。不过在中间,汝所使用的应用的服务商还是能看到(和保存)汝未加密的 明文消息,于是就有可能因为强制要求或被入侵而泄露……

传输层加密的一个例子:HTTPS

一个显示着 https 网址的地址栏

现在,抬起头来,看看汝浏览器上的地址栏,有没有看到 https:// 和一个绿色的锁啊 😂 HTTPS 就是传输层加密的一个汝经常能碰到的例子。为啥它比没加密的 HTTP 更安全呢? 因为 它使网络上的窃听者不能看到汝从服务器接收或向服务器发送的数据。

如果有窃听者视图获得用户正在访问的网站的数据,HTTP 连接不能提供保护,但 HTTPS 可以, 甚至能保护汝正在浏览的网站的路径。(例如这个时候窃听者就只能看到汝正在访问 https://ssd.eff.org

因为 HTTP 的问题太多了(例如可能会被注入、cookie / 用户名和密码被窃取、被针对性审查等等),所以现在 越来越多的网站都开始用 HTTPS 了。我们推荐使用电子前哨基金会制作的 HTTPS Everywhere 扩展,它可以在确定一个网站同时支持 HTTP 和 HTTPS 时强制使用 HTTPS 连接。

不过一个服务商提供了 HTTPS 网站不代表它会保护访问它网站的用户的隐私。例如心术不正的服务商 还是可以通过 cookies 在 HTTPS 网站上追踪用户,或是安装恶意软件。

传输层加密的一个例子:VPN

VPN(虚拟专用网络)是传输层加密的另一个例子,在使用 VPN 的情况下,汝的网络流量会以加密的形式经过汝的 ISP (互联网服务提供商)到达 VPN 服务商的服务器。如果有人(例如汝的 ISP?)想窃听汝的网络来了解汝访问了 些什么网站的话,它们会发现除了汝在用 VPN 这个事实以外并不会知道更多。

不过虽然使用 VPN 可以让汝对 ISP 隐藏汝的浏览历史,但是这些还是会被汝的 VPN 服务商看到(以及存储或修改, 如果它有这个打算的话)。所以信任汝的 VPN 服务商是一件要事。

SSD 也有一篇关于如何选择 VPN 的文章

端到端加密

端到端加密的一个例子

一个端到端加密的例子,左侧的手机加密一条消息并将它发送到服务商的服务器、再发送到右侧的目标。 最后目标手机解密消息。和传输层加密不同,只有终端(编写和接收消息的手机)持有解密消息的密钥, 因此剩下的地方(不管是基站还是服务商)都无法解密这条消息。

端到端加密在汝的消息从发件人到收件人之间全程保护。它可以保证汝的信息离开汝时会被加密而且只能被 汝的目标解密,包括汝正在使用的应用和中间的窃听者都不行。

汝自己读取端到端加密消息实际上意味着运营汝所使用的应用的公司也不能读取它们。 这是良好加密的核心特征:就算是设计和部署它们的家伙也不能破坏它,是呗。

Surveillance Self-Defense 中的 Communicating With Others 一节提供了一些支持端到端加密的聊天工具。

传输层加密还是端到端加密?

在汝考虑是选择传输层加密还是端到端加密时的问题只有三个:

  • 汝信任汝正在使用的应用和服务嘛?
  • 汝信任它的基础结构嘛?
  • (汝正在使用的服务)有没有政策防止执法请求,如果有的话,又是怎样做的?

只要汝有一个答案是“不”,那么汝就需要端到端加密,就是这样。

利用 OTR 进行端到端加密聊天的动画演示

我们制作了一个动画来演示端到端加密和传输层加密是如何保护汝传输中的消息的。 左侧是一个支持端到端加密(通过不留记录(OTR)实现)的聊天工具,右侧是支持传输层 加密的聊天对话框(Google Hangouts 支持 HTTPS)

在这个 GIF 中,用户首先通过 Google Hangouts 发送了一条消息:

“Hi! This is not end-to-end encrypted. Google can see our conversation.”

“嗨!这不是端到端加密, Gooole 能看到我们的对话。”

然后用户通过左侧的窗口启动了 OTR 聊天:

“Attempting to start a private conversation with [gmail account]. Private conversation with [gmail account] has started. However, their identity has not been verified.”

“正在尝试和 [gmail account] 进行私密聊天。 和 [gmail account] 的私密聊天已启动,但未验证对方的身份。”

同时, Google Hangouts 的对话框上出现了一些看起来像胡言乱语一样的消息。 表明了现在的消息都通过端到端加密来传输。

“Now the conversation is end-to-end encrypted, Google can see that we are chatting, but is unable to read what we'are actually saying.”

“现在这是个端到端加密的对话了, Google 能看到我们在聊天,却看不到我们到底在聊什么。”

“It looks like gibberish to anyone else.”

“对其他人来说就像胡言乱语一样”

“Yup, it looks like nonsense.”

“嗯,对它们丝毫没有用处。”

😃

加密传输中的数据不能做什么

加密不是万能药,汝加密的数据最终还是需要被和汝交谈的人解密并读取。 如果汝的目标被攻击(例如被威胁/被收买)或者汝的目标的设备被入侵, 这个加密通讯还是被破坏了。以及他/她/它还是可以通过一些手段(例如屏幕截图)来保存汝等的记录。

如果汝有把加密的对话备份到其他的地方的话,最好也加密那些备份。
消息的元数据不会被加密

传输中进行加密可以保护汝的消息,却不会加密汝消息的元数据。例如汝和汝的朋友虽然可以通过加密 保护聊天记录,但是加密不会隐藏:

  • 汝等在通过加密进行交流的事实

  • 和交流有关的其它数据,例如位置,时间和长度。

    如果因为担心加剧的监控(例如主动的监视)而只在敏感时期或特定情况使用加密却会让汝陷入危险之中, 为啥?因为只是一段时间内使用加密的话,就有可能把元数据和一些重要的日期和时间关联起来。

    所以就算是普通的日常活动也要记得使用加密来保护自己哦~

以及要是只有汝自己在使用加密的话,汝所产生的元数据可能会被认为是可疑的(?)。 这就是鼓励大家都尽可能的使用加密工具的原因:为真正需要加密的人泛化加密的使用。

放在一起?

把静态数据和传输中的数据一起加密可以为汝提供更全面的安全性,就是那些信息安全专家所说的 “深度防御”啦~ 通过利用多种方法来保护汝的数据,就可以实现更深层次的保护,是呗。

例如,要是汝通过加密的设备发送未加密的消息(只加密了静态数据),虽然这些消息没有汝设备的密码 就不能在汝的设备上存取,但是政府,服务提供商或高明的攻击者可以在网络上窃听和拦截它们。

反过来说,要是汝没加密的设备发送通过端到端加密的消息(只加密了传输中的数据),虽然消息不会被网络上 的谁窃听和拦截,但是能接触到汝的设备的家伙就能打开汝的设备读取这些消息。

在看完这两个例子以后,汝大概能明白加密传输中的数据和静态数据是保护汝自己免于广泛的潜在风险的理想方法 了吧……

汝想更深入的了解如何使用加密?请继续阅读 关于加密的关键概念

by ホロ at December 05, 2018 04:00 PM

December 02, 2018

Lainme

用EXCEL来记账

现在有不少记账的APP,我也用过一段时间。不过由于隐私方面的考虑,现在把数据全部删除了,同时参考网易有钱和一些EXCEL模板做了一个EXCEL的记账表出来。目前实现了下面几个功能:

  • 多币种:记账时可以选择币种,可以不同币种转账。但是汇率是手填的,没法自动更新。
  • 收支类别:自定义收支类别,并在记账时选择。只支持一级分类。
  • 资金账户:自定义资金账户,记账时可以选择。有三个特殊账户“借入账户”、“借出账户”和“报销账户”
  • 数据汇总:账户、收支、币种都有各自的汇总统计数据

下载: finance.xlsx

by lainme (lainme@undisclosed.example.com) at December 02, 2018 07:45 AM

November 25, 2018

ヨイツの賢狼ホロ

在 在 GNU/Linux 的桌面环境中设置自动切换壁纸 (GNOME 篇)

在 GNU/Linux 的桌面环境中设置壁纸,是怎么样的呢?

如何设置壁纸?

GNOME Tweaks 设置壁纸

GNOME 的话,可以用 Tweaks 设置。

汝是不是已经看见了那里设置的壁纸不是图片而是个 XML?😂

或者可以用 gsettings 设置:

gsettings set org.gnome.desktop.background picture-uri 'file:///path/to/my/picture.jpg'

所以那个 XML 是啥?

打开看一下不就知道了 ?😂

<background>
<starttime>
    <year>2011</year>
    <month>11</month>
    <day>24</day>
    <hour>7</hour>
    <minute>00</minute>
    <second>00</second>
</starttime>

<!-- This animation will start at 7 AM. -->

<!-- We start with sunrise at 7 AM. It will remain up for 1 hour. -->
<static>
<duration>3600.0</duration>
<file>/usr/share/backgrounds/gnome/adwaita-morning.jpg</file>
</static>

<!-- Sunrise starts to transition to day at 8 AM. The transition lasts for 5 hours, ending at 1 PM. -->
<transition type="overlay">
<duration>18000.0</duration>
<from>/usr/share/backgrounds/gnome/adwaita-morning.jpg</from>
<to>/usr/share/backgrounds/gnome/adwaita-day.jpg</to>
</transition>

<!-- It's 1 PM, we're showing the day image in full force now, for 5 hours ending at 6 PM. -->
<static>
<duration>18000.0</duration>
<file>/usr/share/backgrounds/gnome/adwaita-day.jpg</file>
</static>

<!-- It's 7 PM and it's going to start to get darker. This will transition for 6 hours up until midnight. -->
<transition type="overlay">
<duration>21600.0</duration>
<from>/usr/share/backgrounds/gnome/adwaita-day.jpg</from>
<to>/usr/share/backgrounds/gnome/adwaita-night.jpg</to>
</transition>

<!-- It's midnight. It'll stay dark for 5 hours up until 5 AM. -->
<static>
<duration>18000.0</duration>
<file>/usr/share/backgrounds/gnome/adwaita-night.jpg</file>
</static>

<!-- It's 5 AM. We'll start transitioning to sunrise for 2 hours up until 7 AM. -->
<transition type="overlay">
<duration>7200.0</duration>
<from>/usr/share/backgrounds/gnome/adwaita-night.jpg</from>
<to>/usr/share/backgrounds/gnome/adwaita-morning.jpg</to>
</transition>
</background>

这文件看起来好简单啊咱就不加注释了……

于是汝就能自己写一个脚本来生成这样的 XML (例如 https://pastebin.com/019G2rCy )

如果想更懒一些的话可以试试 Shotwell (选择想要的图片然后 File → Set as Desktop Slideshow)

是不是很简单鸭 😂

不是 GNOME ?

KDE Plasma 的话可以参考兔兔的 [Linux/KDE] 一步步教你给 KDE 用上 macOS 专属动态壁纸

虽然例子是 macOS 的那个沙漠,但是汝自己可以用别的啊 😂

其它桌面可以参考布偶君的 在 GNU/Linux 的桌面环境中设置自动切换壁纸

by ホロ at November 25, 2018 04:00 PM

November 24, 2018

百合仙子

通过 Cloudflare DNS 验证来申请 Let's Encrypt 证书

本文来自依云's Blog,转载请注明。

我本地的 MediaWiki 的证书过期啦,干脆申请个免费证书好了。之所以用 HTTPS,是因为 MediaWiki 不喜欢不加密的 HTTP,会登录不了……

在网上寻找时,发现 certbot 就有 Cloudflare 的插件呢!这下就方便了。首先 pacman -S certbot-dns-cloudflare 装上,然后把自己的 Cloudflare 凭证信息写到一个 ini 文件里:

dns_cloudflare_email = cloudflare@example.com
dns_cloudflare_api_key = 0123456789abcdef0123456789abcdef01234567

就这么两行。保存好,设置好权限,然后就可以申请证书了:

sudo certbot certonly -d 域名列表 --dns-cloudflare --dns-cloudflare-credentials 凭证ini文件路径

稍微回答几个问题,证书就在 /etc/letsencrypt/live 下准备好啦。在 nginx 里配置一下就好了。

然后还要加个 cron 任务来更新证书(dcron 格式):

@weekly         ID=cert-renew   certbot renew -q

这样就大功告成了。

by 依云 at November 24, 2018 07:30 AM