约伊兹的萌狼乡手札/2022-01-26T00:00:00+08:00咱和()的 2021 年2022-01-26T00:00:00+08:002022-01-26T00:00:00+08:00ホロtag:None,2022-01-26:/life/six_years.html<p>有些事情在慢慢变化的嘛,例如咱逐渐开始偷懒到只在 Matters 发表文章这件事。
以及换服务器玩脱了把咱自己的 Mastodon 搞爆炸了什么的……</p>
<p><a class="reference external" href="https://matters.news/@kenookamihoro">可以去那里看看咱这一年写了些什么,和发了什么牢骚 。(笑)</a></p>
<p>以及人老了就喜欢偷懒啦,所以后面大概主要会用那边的 WordPress 来写文章了。</p>
<p><a class="reference external" href="https://blog.horo.moe">在这里,名字还是一样的。</a></p>
<p>至于这里嘛,虽然后面可能不会再有大的更新了,不过咱应该还会尽力留着。
<del>万一哪天咱又有心情开始折腾了呢……</del></p>
<p>咱也谢谢和咱一起路过这六年的大伙儿了。</p>
怀旧手机游戏不正经研究 - 引子2021-11-22T00:00:00+08:002021-11-22T00:00:00+08:00Horotag:None,2021-11-22:/life/legacy_mobile_games_0.html<p>为啥人(?)老啦就喜欢怀旧咧?</p>
<h2>先回忆下咱的手游史</h2>
<p>咱最早在手机上玩游戏的时间大概能追溯到十多年前,当时咱住在咱的某一个亲戚家里,作为一个熊孩子(x),偶尔也会摆弄摆弄他的手机。以及到了现在咱还记得那台手机,三星 SGH-i718+。</p>
<p><img alt="Samsung SGH-i718" class="materialboxed responsive-img" src="/images/legacy_mobile_games_0/samsung-sgh-i718-02.jpg"/></p>
<p>刚才从网上搜索了下,大概就像这个样子。看到那个 Windows 键的话,~~老学校~~玩家应该已经知道了,这部手机搭载的是 Windows Mobile 系统。(以及搜索的时候不经意间发现网上说这是三星第一台国行 Windows Mobile 手机)</p>
<p><img alt="Bubble Breaker:Amazon.com:Appstore for Android" class="materialboxed responsive-img" src="/images/legacy_mobile_games_0/61kmM0DcyLL.jpg"/></p>
<p>虽然内置的游戏只有一个戳泡泡游戏来着(Bubble Breaker?),但是咱不知道怎么发现的(也许是忘了吧)这个手机可以上网,还可以下载 JavaME 游戏来玩,于是接下来的事情就可想而知了……</p>
<blockquote>
<p>唉,从五块钱 1M 或者 30M 走过来的表示说多了都是泪啊 😂</p>
<p>以及后来咱也从这位亲戚那里玩到了 Windows Phone 7/8 和 Android 手机 …</p></blockquote><p>为啥人(?)老啦就喜欢怀旧咧?</p>
<h2>先回忆下咱的手游史</h2>
<p>咱最早在手机上玩游戏的时间大概能追溯到十多年前,当时咱住在咱的某一个亲戚家里,作为一个熊孩子(x),偶尔也会摆弄摆弄他的手机。以及到了现在咱还记得那台手机,三星 SGH-i718+。</p>
<p><img alt="Samsung SGH-i718" class="materialboxed responsive-img" src="/images/legacy_mobile_games_0/samsung-sgh-i718-02.jpg"/></p>
<p>刚才从网上搜索了下,大概就像这个样子。看到那个 Windows 键的话,~~老学校~~玩家应该已经知道了,这部手机搭载的是 Windows Mobile 系统。(以及搜索的时候不经意间发现网上说这是三星第一台国行 Windows Mobile 手机)</p>
<p><img alt="Bubble Breaker:Amazon.com:Appstore for Android" class="materialboxed responsive-img" src="/images/legacy_mobile_games_0/61kmM0DcyLL.jpg"/></p>
<p>虽然内置的游戏只有一个戳泡泡游戏来着(Bubble Breaker?),但是咱不知道怎么发现的(也许是忘了吧)这个手机可以上网,还可以下载 JavaME 游戏来玩,于是接下来的事情就可想而知了……</p>
<blockquote>
<p>唉,从五块钱 1M 或者 30M 走过来的表示说多了都是泪啊 😂</p>
<p>以及后来咱也从这位亲戚那里玩到了 Windows Phone 7/8 和 Android 手机,虽然经常是他自己都搞不懂怎么用来请教咱的样子……</p>
</blockquote>
<p>后来咱搬去父母家了,虽然他们也忙着做生意经常不着家,于是为了联系方便,就给咱买了一部手机。 Nokia 6700 Slide。</p>
<p><img alt="Nokia 6700 slide" class="materialboxed responsive-img" src="/images/legacy_mobile_games_0/Nokia_6700_slide_silver_front.jpg"/></p>
<p>虽然那个时候的咱并不知道啥智能手机塞班系统什么的,但是它也能和咱最早玩到的那部手机一样可以安装游戏。</p>
<p>以及它竟然还支持 3G 网络,加上咱当时用的也是联通卡,于是流量和话费迅速消耗…</p>
<p>然后在不知道什么时候惨遭标准结局(丢了)…… 在挨了顿骂几个月以后,家里还是给买了新手机,还是诺基亚。</p>
<p><img alt="Nokia C7" class="materialboxed responsive-img" src="/images/legacy_mobile_games_0/nokia-c7-ofic-1.jpg"/></p>
<p>就是 Nokia C7 啦,后来才发现咱直接跳过了 S60v5 整个时代。(虽然咱还是能发现有同学买了 S60v5 系统的手机来着,例如堪称街机的 5230 )</p>
<p><img alt="Nokia 5230" class="materialboxed responsive-img" src="/images/legacy_mobile_games_0/nokia-5230-1.jpg"/></p>
<p>除了触屏这个显而易见的特性以外,C7 还有当时颇为珍贵的 Wi-Fi 功能。(以及后来才知道当时国内为了推广自有标准 WAPI 强行让国行手机阉割 Wi-Fi 这档事)于是找地方蹭网一度也是咱的活动之一,直到家里装了宽带和无线路由器。</p>
<p>虽然没有数字按键了,玩之前玩过的 Java 游戏有些不方便。但是咱靠它玩到了很多塞班 3 游戏啊,大部分的画面都比那些 Java 游戏好多了。(嗯,咱那时候完全没听说过 N-Gage……)</p>
<p><img alt="Asphalt 5 (2009 video game)" class="materialboxed responsive-img" src="/images/legacy_mobile_games_0/167950.jpg"/></p>
<p>例如现在还有更新的狂野飙车(Asphalt)系列,最早是 Gameloft 在 2004 年发表在 NDS 和 N-Gage 的游戏,后来也移植到了 iOS 、Android 等新的手机平台。图片上是咱记忆里在 C7 上玩的 Asphalt 5 。</p>
<p>再后来的某一天呢,咱父母的手机坏了,于是就以再给咱买一台作为交换换走了咱这台 C7。当时 Android 也开始流行起来了,于是鬼使神差间咱买了三星 Galaxy Tab 2 7.0 。</p>
<p><img alt="Samsung Galaxy Tab 2 7.0 P3100" class="materialboxed responsive-img" src="/images/legacy_mobile_games_0/samsung-galaxy-tab-2-2.jpg"/></p>
<p>没错,一台能打电话的平板!😂 所以咱那个时候怎么想到买它的呢。</p>
<p>于是接下来就是延续到现在的折腾 Android 的故事了, ~~就和咱接下来要聊的话题没太大关系了……~~</p>
<p>至于 iOS 嘛,咱买的第一部 iPhone 是 iPhone SE,于是就和怀旧更没啥关系了。</p>
<blockquote>
<p>好啦好啦,虽然老的 iOS 和 Android 游戏也有不少佳作啦,但是现在的新系统上面几乎都运行不了那些老游戏啦。</p>
<p>至于去淘一下老手机平板什么的, ~~经费有点不足……~~</p>
</blockquote>
<h2>那么接下来呢?</h2>
<p>在看了好几个同样爱好怀旧游戏的爱好者的视频以后,咱也被一股不可名状的引力所吸引开始在网上收购一些老手机了。(以及在自己和亲戚那淘一淘货)</p>
<p>于是接下来咱有点兴趣的问题就是,咱想玩 Java ME/Symbian/N-Gage 游戏的话,用哪部手机比较合适?</p>
<blockquote>
<p>当然啦,假如自己还有能用的手机的话,那肯定是用现成的最节省成本。于是问题就演变成了如果要淘一淘二手的话哪些型号性价比更高了。</p>
</blockquote>
<p>以及有些平台已经有差不多的模拟器了(例如模拟 JavaME 的 <a href="https://github.com/nikita36078/J2ME-Loader">J2ME Loader</a> 和模拟 Symbian 的 <a href="https://github.com/EKA2L1/EKA2L1">EKA2L1</a> ),那么在手机上用模拟器是否也还行呢?假如汝不是特别介意手指搓玻璃的话。</p>
<blockquote>
<p>以及带物理键盘的 Android 手机搭配模拟器会不会效果更好来着,例如上一篇文章里那台多亲 F21 Pro。其它的有按键的 Android 手机(像是三星的~~土豪专用~~心系天下系列和黑莓的最后几部键盘 Android 手机)应该也能类比。</p>
<p>~~其实还是没钱买~~</p>
</blockquote>
<p>那么是不是还可以扩展到其它的老电玩平台呢……像是 3DS/PSV 或者 PS3/Wii 之类的。</p>
<blockquote>
<p>这大概就是长期计划了……说来刚刚打开某软件搜索价格的时候发现咱之前两百块收的 PSTV 已经涨的飞起了,虽然并没有什么关系(x)</p>
</blockquote>
<p>于是接下来就是等快递了。 ~~(连鸽子都能说的这么清新脱俗)~~</p>带键盘的 Android 手机和多亲 F21 Pro 折腾记2021-10-28T00:00:00+08:002021-10-28T00:00:00+08:00ホロtag:None,2021-10-28:/tech_misc/keypad_android_phones.html
<p><del>因为人(?)老了就喜欢怀旧?</del> 😂</p>
<p>对咱这个高不成低不就不知道算不算老人的家伙来说呢,能够拿来怀旧的应该会有那些“古老”的
手机游戏了。(也没有多么老啦,就是差不多十年前那些 Java 手机游戏了,好像叫啥 J2ME?
算了不管了后面就都叫 Java 了,希望大家不会和现在还在的那个 Java 搞混。)</p>
<p>虽然现在也有像是 <a class="reference external" href="https://github.com/nikita36078/J2ME-Loader">J2ME-Loader</a>
这种 Android 上也可以用的 Java 模拟器了,但是在触摸屏上按虚拟按键完全没有感觉嘛……
所以咱也开始物色有键盘的 Android 手机了。</p>
<blockquote>
好啦咱知道去收购一些老的手机也是可行的解决方案,那下面的内容就完全没有必要写了。
<del>是不是咱可以鸽了 (x)</del></blockquote>
<div class="section" id="android">
<h2>举几个键盘 Android 手机的栗子</h2>
<p>虽然 Android 的操作更多的是以触屏为主,但是也不是没有有物理键盘的机型啦。
比如摩托罗拉里程碑之类的,但是那个好像太古老了点……</p>
<p>最近几年最能拿出来举的例子大概就是黑莓了,例如最后一部亲自操刀的 Priv 和后面授权 TCL
设计生产的 KeyOne …</p></div>
<p><del>因为人(?)老了就喜欢怀旧?</del> 😂</p>
<p>对咱这个高不成低不就不知道算不算老人的家伙来说呢,能够拿来怀旧的应该会有那些“古老”的
手机游戏了。(也没有多么老啦,就是差不多十年前那些 Java 手机游戏了,好像叫啥 J2ME?
算了不管了后面就都叫 Java 了,希望大家不会和现在还在的那个 Java 搞混。)</p>
<p>虽然现在也有像是 <a class="reference external" href="https://github.com/nikita36078/J2ME-Loader">J2ME-Loader</a>
这种 Android 上也可以用的 Java 模拟器了,但是在触摸屏上按虚拟按键完全没有感觉嘛……
所以咱也开始物色有键盘的 Android 手机了。</p>
<blockquote>
好啦咱知道去收购一些老的手机也是可行的解决方案,那下面的内容就完全没有必要写了。
<del>是不是咱可以鸽了 (x)</del></blockquote>
<div class="section" id="android">
<h2>举几个键盘 Android 手机的栗子</h2>
<p>虽然 Android 的操作更多的是以触屏为主,但是也不是没有有物理键盘的机型啦。
比如摩托罗拉里程碑之类的,但是那个好像太古老了点……</p>
<p>最近几年最能拿出来举的例子大概就是黑莓了,例如最后一部亲自操刀的 Priv 和后面授权 TCL
设计生产的 KeyOne / Key2 。<del>不过 TCL 也在 2020 年撒手不干了就是...</del></p>
<p>除了黑莓以外,也有几家公司设计过带物理键盘的 Android 手机,例如
<a class="reference external" href="https://www.unihertz.com/products/titan">Unhertz Titan</a> 和
<a class="reference external" href="https://www.fxtec.com/pro1x">F(x)tec</a> 。</p>
<p>不过上面这些还是有一个微妙的问题,它们都是传统的 QWERTY 键盘布局,所以按键普遍的都比较小。
方向键也都在一些奇妙的地方或者干脆就没了。虽然大部分 Java 手机游戏都能用数字键代替方向键来着,
等等,这些手机上的数字键基本也要靠 Fn 之类的组合键触发出来啊……</p>
<p>以及它们的性价比也不怎么漂亮。(家境贫寒.jpg)</p>
<p>后来上网瞎逛的时候就看到了标题说的那个
<a class="reference external" href="https://item.jd.com/100024191248.html#none">多亲 F21 Pro</a> 。
是常见的 12 键键盘布局,Helio A20 的性能虽然不强,但是满足咱这需求应该是够用的,
于是就买了一台 4G+64G 版本。</p>
<blockquote>
在咱开始写这篇文章的时候,才发现还有一个 F21 Pro+,平台换成了紫光展锐 T310。
同时可以选择学生版和标准版(标准版可以自由安装应用,学生版不行,F21 Pro 也不行),
不过只有 3G+32G 版本可选,如果汝不想像后面那样如此麻烦的话,去买那个就行。
3+32 应该也足够用了,除非汝往里面装了几万个游戏那样的(笑)。</blockquote>
</div>
<div class="section" id="id1">
<h2>借应用市场刀装第三方应用</h2>
<p>既然这都拿“学生手机”作为卖点了嘛,那自然不能自己安装应用就是设计使然而不是 Bug 咯。
这个系统貌似是魔改了系统的软件包安装程序,如果包名不在白名单里就会提示
“禁止安装第三方应用,请去应用市场安装”。 多亲似乎也从 2 Pro 那时学来了不少的反制措施,
例如封掉了 adb 安装,提前占了设备管理员应用的位置之类的。</p>
<p>不过后来有人发现系统自带的应用市场其实是能安装其它的应用的,只要把正在下载中的安装包换成汝想要的软件就行了。
就算后来的系统更新封堵了一阵子,也又被发现只要把旧版的应用市场装上就能绕过了……</p>
<p>也有人写出了能半自动操作的工具了,例如
<a class="reference external" href="https://github.com/MlgmXyysd/k61v1injector">MlgmXyysd/k61v1injector</a> 。
但是咱比较懒(上面那个依赖 PHP),所以就手动操作一把了。</p>
<ul class="simple">
<li>在 F21 Pro 上启动开发者选项里的 USB 调试。和普通的 Android 手机一样的方法咱就不用再啰嗦了吧?</li>
<li>接上电脑,在手机上授权电脑,然后打开一个终端。</li>
<li>清除手机上应用市场的数据。(这是为了接下来偷懒方便(x))</li>
<li>打开手机的应用市场,下载一个软件。考虑到下载的时间因素,建议选一个稍微大一点的软件,
或者限制一下手机的网速也是可行的。</li>
</ul>
<p>然后在终端上输入(汝应该知道要把哪里换成汝自己要安装的 APK 文件的路径,对吧?):</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># $() 可以把括号内的命令的结果替换到上层的输入里。</span></span>
<span class="code-line"><span class="c1"># 例如这里的 adb shell ls /sdcard/Android/data/com.duoqin.promarket/files/Download/</span></span>
<span class="code-line"><span class="c1"># 会列出这个目录(应用市场的下载目录)里的文件列表。</span></span>
<span class="code-line"><span class="c1"># 如果汝刚刚是清除了应用数据再下载的话,这里就只有汝当前正在下载的应用了。</span></span>
<span class="code-line"><span class="c1"># 于是瞒天过海大法发动(x)</span></span>
<span class="code-line"></span>
<span class="code-line">$ adb push /path/to/your/apk <span class="se">\</span></span>
<span class="code-line">/sdcard/Android/data/com.duoqin.promarket/files/Download/<span class="k">$(</span>adb shell ls /sdcard/Android/data/com.duoqin.promarket/files/Download/<span class="k">)</span></span>
</pre></div>
<p>不过这种方法唯一的缺陷就是,应用更新以后汝还是要这么来一遍,所以还是要研究一下怎么把这破烂限制解掉。
<del>奈何都喜欢藏着掖着……</del></p>
<img alt="安装第三方应用演示" class="materialboxed responsive-img" src="/images/Android/f21pro_aida64.png"/>
<p>效果大概就是这个样子。于是汝也可以把刚刚咱说的那个 Java 模拟器装上,再找来几个老游戏的 JAR。
就可以愉快的玩耍啦。</p>
<img alt="f21pro_j2meloader" class="materialboxed responsive-img" src="/images/Android/f21pro_j2meloader.png"/>
<p>因为 F21 Pro 的屏幕分辨率是 480x640 ,正好是以前最常见的 240x320 的两倍。
所以在模拟器里设置好全屏显示,再隐藏掉虚拟键盘以后的感觉就和以前差不多了。
至于按键手感嘛……这个只能说因人而异了。</p>
<img alt="f21pro_play" class="materialboxed responsive-img" src="/images/Android/f21pro_play.jpeg"/>
</div>
<div class="section" id="id2">
<h2>其它的小吐槽</h2>
<ul class="simple">
<li>如今很多 App 都不会给键盘做优化了啊,还好 F21 Pro 有触摸屏,用起来不会像之前流行
的 C558 那样麻烦。</li>
<li>以及该卡的国产“小而美”还是卡,刚装完能吃掉接近 1G 储存空间可还行……</li>
<li>fastboot flashing unlock 对这个是可用的,但是这个手机没有音量键没法确认啊 😂</li>
</ul>
<p>以及这里面手机的截图其实是截取的电脑用 scrcpy 连接到手机的画面,就这样吧。</p>
</div>
如何比较安全的配置 Web 服务器 - TLS 和 HTTPS2021-09-17T00:00:00+08:002021-09-17T00:00:00+08:00Horotag:None,2021-09-17:/security/web_server_configuration_0.html<blockquote>
<p>~~嗯?这家伙鸽了多久了?~~</p>
</blockquote>
<p>又是一次知道的已经做好了,不知道的对着他耳朵唠叨也不会去做的系列节目。(嗯?)
如果不想听咱啰嗦的话, <a href="https://infosec.mozilla.org/guidelines/web_security.html">直接去看 Mozilla Infosec 的相同主题的内容就好啦。</a></p>
<h2>HTTPS 和 TLS 到底是什么关系?</h2>
<p>HTTPS 其实就是包在 SSL/TLS 里的 HTTP 啦,考虑到 <a href="https://tools.ietf.org/html/rfc7568">SSL 3.0 早在 2015 年就废弃了</a>,现在基本上就只提 TLS 了。(虽然 TLS 1.0 和 1.1 也在 2020 年被废弃了就是。)</p>
<p>因为 HTTPS 能够加密所交换的数据、在传输的过程中保证数据的完整性,以及证明用户是在与目标网站进行通信。所以很多组织都在呼吁让整个互联网的流量都是加密的。
以及各大浏览器也在逐渐的将只支持 HTTP 的网站列入 …</p><blockquote>
<p>~~嗯?这家伙鸽了多久了?~~</p>
</blockquote>
<p>又是一次知道的已经做好了,不知道的对着他耳朵唠叨也不会去做的系列节目。(嗯?)
如果不想听咱啰嗦的话, <a href="https://infosec.mozilla.org/guidelines/web_security.html">直接去看 Mozilla Infosec 的相同主题的内容就好啦。</a></p>
<h2>HTTPS 和 TLS 到底是什么关系?</h2>
<p>HTTPS 其实就是包在 SSL/TLS 里的 HTTP 啦,考虑到 <a href="https://tools.ietf.org/html/rfc7568">SSL 3.0 早在 2015 年就废弃了</a>,现在基本上就只提 TLS 了。(虽然 TLS 1.0 和 1.1 也在 2020 年被废弃了就是。)</p>
<p>因为 HTTPS 能够加密所交换的数据、在传输的过程中保证数据的完整性,以及证明用户是在与目标网站进行通信。所以很多组织都在呼吁让整个互联网的流量都是加密的。
以及各大浏览器也在逐渐的将只支持 HTTP 的网站列入“不安全”的范围。(虽然也有人对这么做有没有作用存疑。)</p>
<h2>取得一份证书</h2>
<p>关于 TLS 的实现原理不是咱的重点(其实是咱也不是很懂,汝也许可以看看 <a href="https://tools.ietf.org/html/rfc8446">IETF 的 RFC</a>, 如果真的有必要的话。
汝现在需要知道的最重要的一点就是,要使用 HTTPS 的话,网站管理员要先从大家都信任的某些地方(就是 CA/数字证书认证机构 啦)取得一份带有私钥的证书才能继续接下来的步骤。</p>
<p>有不止一家企业和组织营运的 CA 负责签发证书,例如历史悠久的 Entrust 和 DigiCert ,和数个公司或组织为了普及 HTTPS 创办的 Let's Encrypt 等等。</p>
<p>如果汝还没有预算购买证书的话,<a href="https://letsencrypt.org/zh-cn/getting-started/">可以先从 Let's Encrypt 开始</a>。</p>
<blockquote>
<p>不过 Let's Encrypt 的证书有效期只有三个月,所以如果汝对自己的服务没有完整的命令行访问权限(例如比较常见的虚拟共享主机)的话,可能会稍微麻烦一些。</p>
<p>至于怎么申请证书嘛, Let's Encrypt 推荐使用它们制作的 certbot 帮助程序。
<a href="https://certbot.eff.org/instructions">可以在这里查阅文档</a>, ~~咱就先跳过了(笑)~~</p>
</blockquote>
<p>如果希望只允许特定的 CA 给汝的网站签发证书的话,可以通过 DNS 证书颁发机构授
权记录(简称 CAA)来实现,CA 会提供相应的指南告诉汝如何添加和修改这种记录。</p>
<h2>规划网站的兼容目标</h2>
<p>越新的标准越能提升安全性,越旧的浏览器就越有可能不支持,大概就是这个样子。所以根据自己网站的受众决定向后兼容的程度就很重要。<a href="https://wiki.mozilla.org/Security/Server_Side_TLS">Mozilla 的标准有三个等级:</a></p>
<ul>
<li>现代等级:只支持 TLS 1.3,适用于不需要向后兼容的新网站。</li>
<li>中等等级:支持 TLS 1.2 和 1.3,适用于大多数网站和估计近五年间的设备。</li>
<li>向后兼容等级:只有汝需要考虑支持像是 Windows XP 或者 Java 6 这种相当老的系统时才应该使用这个等级。</li>
</ul>
<p>它们分别兼容的最旧版本的浏览器和操作系统在下面:</p>
<table class="highlight stripped white black-text">
<thead>
<tr>
<th>等级</th>
<th>兼容的最旧版本</th>
</tr>
</thead>
<tbody>
<tr>
<td>现代</td>
<td>Firefox 63, Android 10.0, Chrome 70, Edge 75, Java 11, OpenSSL 1.1.1, Opera 57, and Safari 12.1</td>
</tr>
<tr>
<td>中级</td>
<td>Firefox 27, Android 4.4.2, Chrome 31, Edge, IE 11 on Windows 7, Java 8u31, OpenSSL 1.0.1, Opera 20, Safari 9</td>
</tr>
<tr>
<td>向后兼容(旧的)</td>
<td>Firefox 1, Android 2.3, Chrome 1, Edge 12, IE8 on Windows XP, Java 6, OpenSSL 0.9.8, Opera 5, and Safari 1</td>
</tr>
</tbody>
</table>
<p><a href="https://ssl-config.mozilla.org/">Mozilla 也提供一个线上配置生成器</a>,可以根据不同的等级和服务器软件生成合适的参考配置文件。
根据汝的需要稍加修改(例如证书的位置)应该就可以使用了。</p>
<h2>正确的重定向 HTTP 链接</h2>
<p>现在汝的网站有 HTTPS 版本了,很好。但只有用户主动的输入带有 <code>https://</code> 的地址的时候才能访问 HTTPS 版本,
于是汝还需要让用户通过 HTTP 访问的时候能自动重定向到 HTTPS 版本。</p>
<p>对于目前比较常见的 Apache 和 Nginx 来说,都挺简单的。</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="c1"># Nginx 示例配置。</span></code></span>
<span class="code-line"><span class="k">server</span> <span class="p">{</span></span>
<span class="code-line"> <span class="kn">listen</span> <span class="mi">80</span><span class="p">;</span></span>
<span class="code-line"></span>
<span class="code-line"> <span class="kn">return</span> <span class="mi">301</span> <span class="s">https://</span><span class="nv">$host$request_uri</span><span class="p">;</span></span>
<span class="code-line"><span class="p">}</span></span>
<span class="code-line"></span></pre></div>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="c"># Apache 的示例配置,记得把 foo.tld 换成汝自己的域名。</span></code></span>
<span class="code-line"><span class="nt"><VirtualHost</span> <span class="s">*:80</span><span class="nt">></span></span>
<span class="code-line"> <span class="nb">ServerName</span> foo.tld</span>
<span class="code-line"> <span class="nb">Redirect</span> permanent / https://foo.tld/</span>
<span class="code-line"><span class="nt"></VirtualHost></span></span>
<span class="code-line"></span></pre></div>
<h2>HTTP 严格传输安全 (HSTS)</h2>
<p>汝设置好了正确的重定向,这本来没有问题,直到攻击者劫持了访问汝的网站第一步的 HTTP 响应……
一场典型的 SSL 剥离攻击开始了。</p>
<p>所以 IETF 为了补救这个缺陷提出了 HTTP 严格传输安全标准,汝也许经常能看到它的缩写 HSTS 。</p>
<p>要实现 HTTP 严格传输安全,核心就是一个 HTTP 首部,例如下面的这个:</p>
<p><code>Strict-Transport-Security: max-age=31536000; includeSubDomains</code> </p>
<p>如果 <code>https://example.com</code> 的响应中有这段的话:</p>
<ul>
<li>在接下来的 31536000 秒(即一年)中,浏览器向 example.com 发送 HTTP 请求时,必须采用 HTTPS 来发起连接。
比如,用户点击超链接或在地址栏输入 http://example.com/ ,浏览器应当自动将 http 转写成 https,
然后直接向 https://example.com/ 发送请求。</li>
<li>在接下来的一年中,如果 example.com 服务器发送的TLS证书无效,用户不能忽略浏览器警告继续访问网站。</li>
<li>这也适用于 example.com 下面的子域名,例如 www.example.com 。</li>
</ul>
<p>以及这段只有在 HTTPS 响应中才会生效,那汝应该也会想那么第一次访问网站时怎么办。
各大浏览器的做法是维护一个预先加载列表,在列表上的网站总是会通过 HTTPS 访问。
汝可以参考<a href="https://hstspreload.org/">这个网站</a>来了解将自己的网站加入预先加载列表的要求。</p>
<h2>OCSP 装订</h2>
<p>汝也许听说过一个叫 OCSP(在线证书状态协议)的东西。浏览器每次连接支持 OCSP 的网站时,都会向 CA 发送请求查询这个证书的状态。
但这就带来了两个问题:</p>
<ul>
<li>OCSP 是明文发送的,汝和 CA 之间的任何人都能知道汝在访问哪个网站,虽然不能精确到 URL,但进行阻断的话已经足够了。</li>
<li>如果 CA 提供 OCSP 查询的服务器偷偷的留下了访问的记录……</li>
</ul>
<p>而 OCSP 装订则改为了服务器向 CA 获取 OCSP 响应并缓存一段时间,用户访问时只要验证从服务器发送来的 OCSP 响应的有效性即可。</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="c1"># Nginx 示例配置。</span></code></span>
<span class="code-line"><span class="k">server</span> <span class="p">{</span></span>
<span class="code-line"> <span class="kn">...</span> </span>
<span class="code-line"> <span class="c1"># OCSP stapling</span></span>
<span class="code-line"> <span class="s">ssl_stapling</span> <span class="no">on</span><span class="p">;</span></span>
<span class="code-line"> <span class="kn">ssl_stapling_verify</span> <span class="no">on</span><span class="p">;</span></span>
<span class="code-line"></span>
<span class="code-line"> <span class="c1"># 如果汝的 CA 没有提供 OCSP 使用的证书(例如 Let's Encrypt 就没有),</span></span>
<span class="code-line"> <span class="c1"># 那么不需要设置 ssl_trusted_certificate 属性。</span></span>
<span class="code-line"> <span class="kn">ssl_trusted_certificate</span> <span class="s">/path/to/root_CA_cert_plus_intermediates</span><span class="p">;</span></span>
<span class="code-line"></span>
<span class="code-line"> <span class="c1"># 设置成汝服务器使用的 DNS 服务器。</span></span>
<span class="code-line"> <span class="kn">resolver</span> <span class="mi">127</span><span class="s">.0.0.1</span><span class="p">;</span></span>
<span class="code-line"><span class="p">}</span></span>
<span class="code-line"></span></pre></div>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="c"># Apache 的示例配置。</span></code></span>
<span class="code-line"><span class="c"># OCSP 装订缓存的位置,</span></span>
<span class="code-line"><span class="nb">SSLStaplingCache</span> shmcb:/tmp/stapling_cache(128000)</span>
<span class="code-line"><span class="nt"><VirtualHost</span> <span class="s">*:443</span><span class="nt">></span></span>
<span class="code-line">...</span>
<span class="code-line"><span class="c"># 如果汝的 CA 没有提供 OCSP 使用的证书(例如 Let's Encrypt 就没有),</span></span>
<span class="code-line"><span class="c"># 那么不需要设置 SSLCertificateChainFile 属性。</span></span>
<span class="code-line"><span class="nb">SSLCertificateChainFile</span> <span class="sx">/path/to/DigiCertCA.crt</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="nb">SSLUseStapling</span> <span class="k">on</span></span>
<span class="code-line"><span class="nt"></VirtualHost></span></span>
<span class="code-line"></span></pre></div>
<h2>Referrer 策略</h2>
<p>Referrer 经常用来表示用户是从哪里来的,也有人担心它会泄露一些隐私信息。
Referrer-Policy 首部用来监管哪些访问来源信息——会在 Referer 中发送——应该被包含在生成的请求当中。</p>
<p>汝可以根据汝的网站和用户选择适合的模式。</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="err"># no-referrer-when-downgrade 是现代浏览器的默认设置,</span></code></span>
<span class="code-line"><span class="err"># 在同等安全级别的情况下,引用页面的地址会被发送(HTTPS->HTTPS),但是在降级的情况下不会被发送 (HTTPS->HTTP)。</span></span>
<span class="code-line"><span class="c">Referrer-Policy: no-referrer-when-downgrade</span></span>
<span class="code-line"><span class="err"># 只有原地址相同时才发送 Referrer。</span></span>
<span class="code-line"><span class="c">Referrer-Policy: same-origin</span></span>
<span class="code-line"><span class="err"># 对于同源的请求,会发送完整的URL作为引用地址;</span></span>
<span class="code-line"><span class="err"># 在同等安全级别的情况下,发送文件的源作为引用地址(HTTPS->HTTPS);在降级的情况下不发送此首部 (HTTPS->HTTP)。</span></span>
<span class="code-line"><span class="c">Referrer-Policy: strict-origin-when-cross-origin</span></span>
<span class="code-line"><span class="err"># 对不支持 strict-origin-when-cross-origin 的浏览器不发送首部。</span></span>
<span class="code-line"><span class="c">Referrer-Policy: no-referrer, strict-origin-when-cross-origin</span></span>
<span class="code-line"><span class="err"># 或者直接什么时候都不发送首部。</span></span>
<span class="code-line"><span class="c">Referrer-Policy: no-referrer</span></span>
<span class="code-line"></span></pre></div>
<h2>X-Content-Type-Options 、 X-Frame-Options 和 X-XSS-Protection</h2>
<p>X-Content-Type-Options 用来被服务器用来提示客户端一定要遵循在 Content-Type 首部中对 MIME 类型 的设定,
而不能对其进行修改。这就禁用了客户端的 MIME 类型嗅探行为。</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="err"># 防止浏览器不正确的识别文件类型,例如把非脚本文件识别成脚本。</span></code></span>
<span class="code-line"><span class="c">X-Content-Type-Options: nosniff</span></span>
<span class="code-line"></span></pre></div>
<p>The X-Frame-Options HTTP 响应头是用来给浏览器指示一个页面可否在框架中展现的标记。
(其实还有 <code><frame></code>, <code><embed></code> 和 <code><object></code> 的,但这些好像都被弃用了来着。)</p>
<p>站点可以通过确保网站没有被嵌入到别人的站点里面,从而避免被用来进行汝点击的不是实际的地方的那种 clickjacking 攻击。
除了 HTTP 首部以外,内容安全策略(CSP)里的 <code>frame-ancestors</code> 属性也能控制这种行为,但是那个好复杂啊……</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="err"># 阻止网页嵌入在框架中。</span></code></span>
<span class="code-line"><span class="err"># 第一行是通过 CSP 设置,第二行是传统的 HTTP 首部形式,它们的效果是相同的。</span></span>
<span class="code-line"><span class="c">Content-Security-Policy: frame-ancestors 'none'</span></span>
<span class="code-line"><span class="c">X-Frame-Options: DENY</span></span>
<span class="code-line"><span class="err"># 只允许相同域名的网页嵌入在框架中。</span></span>
<span class="code-line"><span class="c">Content-Security-Policy: frame-ancestors 'self'</span></span>
<span class="code-line"><span class="c">X-Frame-Options: SAMEORIGIN</span></span>
<span class="code-line"><span class="err"># 只允许特定来源的网页嵌入在框架中。</span></span>
<span class="code-line"><span class="err"># </span></span>
<span class="code-line"><span class="c">Content-Security-Policy: frame-ancestors https://framer.mozilla.org</span></span>
<span class="code-line"><span class="c">X-Frame-Options: DENY</span></span>
<span class="code-line"></span></pre></div>
<p>X-XSS-Protection 响应头是 Internet Explorer,Chrome 和 Safari 的一个特性,
当检测到跨站脚本攻击时,浏览器将停止加载页面。</p>
<p>若网站设置了良好的 Content-Security-Policy 来禁用内联 JavaScript ('unsafe-inline'),
现代浏览器不太需要这些保护, 但其仍然可以为尚不支持 CSP 的旧版浏览器的用户提供保护。</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="err"># 启用 X-XSS-Protection,如果 mode 为 block 的话,</span></code></span>
<span class="code-line"><span class="err"># 浏览器将在检测到可能的跨站脚本攻击时停止加载而不是清空页面。</span></span>
<span class="code-line"><span class="c">X-XSS-Protection: 1; mode=block</span></span>
<span class="code-line"></span></pre></div>
<p>至于那个最复杂的 CSP 嘛…… ~~下次再说了……~~</p>
<h2>更多资源</h2>
<p>除了上面提到的 Mozilla 的文档和配置生成器以外:</p>
<ul>
<li><a href="https://www.ssllabs.com/projects/documentation/">Qualys SSLlab</a> 可以帮汝测试汝的 HTTPS 配置,
也提供了一些可以参考的文档。</li>
<li><a href="https://badssl.com/">BadSSL</a>可以测试汝正在使用的浏览器遇到错误的 TLS 设置时的反应。</li>
</ul>Google 的 FLoC 是个糟糕透顶的主意2021-04-21T22:34:00+08:002021-04-21T22:34:00+08:00Horotag:None,2021-04-21:/translation/googles-floc-terrible-idea.html<blockquote>
<p>翻译自电子前哨基金会 (Electronic Frontier Foundation) DeepLink BLog 的
Google’s FLoC Is a Terrible Idea : https://www.eff.org/deeplinks/2021/03/googles-floc-terrible-idea ,
原作者 <a href="https://www.eff.org/about/staff/bennett-cyphers">Bennett Cyphers</a>。</p>
<p>EFF 网站的内容以知识共享 署名 4.0 协议授权,本译文也如此。</p>
</blockquote>
<p>2021 年 4 月 9 日追记:我们开设了一个名为
<a href="https://amifloced.org/">"Am I FLoCed"</a> 的网站,如果汝有在用 Google Chrome 浏览器的话,汝可以来看看汝有没有“幸运的”成为 …</p><blockquote>
<p>翻译自电子前哨基金会 (Electronic Frontier Foundation) DeepLink BLog 的
Google’s FLoC Is a Terrible Idea : https://www.eff.org/deeplinks/2021/03/googles-floc-terrible-idea ,
原作者 <a href="https://www.eff.org/about/staff/bennett-cyphers">Bennett Cyphers</a>。</p>
<p>EFF 网站的内容以知识共享 署名 4.0 协议授权,本译文也如此。</p>
</blockquote>
<p>2021 年 4 月 9 日追记:我们开设了一个名为
<a href="https://amifloced.org/">"Am I FLoCed"</a> 的网站,如果汝有在用 Google Chrome 浏览器的话,汝可以来看看汝有没有“幸运的”成为
Google 主导的新的“队列联合学习”(Federated Learning of Cohorts ,或者缩写成 FLoC)这一定向广告实验的小白鼠咯。</p>
<hr/>
<p>第三方 Cookie 正在消亡, Google 正尝试创造它的替代品。</p>
<p>没必要为这玩意表示哀悼。二十年来,第三方 Cookie 成了阴暗、肮脏的广告监控行业的关键部分,价值高达数十亿美元;咱们早该淘汰像跟踪 Cookies 这样的
持久的第三方标识符了。不过呢,广告业最大的“玩家”在基础发生变化的时候也不是毫无作为。</p>
<p>Google 正在用一套新技术引领取代第三方 Cookie 的变革。虽然它的提案中的某些部分表示他们并没有从对监控这一商业模型的持续的反对中吸取教训。
这篇文章关注的是提案之一的 <a href="https://github.com/WICG/floc">“队列联合学习”</a>,这也许是这其中最具野心,破坏性也最大的一部分。</p>
<p>FLoC 意为把原来那些第三方跟踪器做的那些事情转嫁给汝等的浏览器:在这种情况下,汝最近的浏览活动会被归纳为一个行为标签分享给广告商。
这种方法看起来解决了第三方 Cookies 曾经遇到的那些隐私问题,却又在这一过程中产生了新的问题。它也许还会加剧行为广告带来的许多严重的不和隐私相关发问题,像是歧视和劫掠目标。</p>
<p>作为“隐私倡导者”,Google 说 FLoC (和他们声称的<a href="https://www.blog.google/products/chrome/building-a-more-private-web">“隐私沙盒”</a>里的一
些其他元素)的表现会比现在任由“数据经纪人”和广告巨头肆无忌惮的跟踪和画像更好。
不过这个整个愿景的基础——我们只能从‘老式的跟踪方法’和‘新式的跟踪方法’之中选择一个——本身就是个伪命题。
这并不是个非此即彼的问题。与其重新发明跟踪轮子,咱们为啥不去想象一个没有目标投放广告(和它带来的无数问题)的更好的世界?</p>
<p>这是一条岔路,后方是第三方 Cookies,这也许是互联网发明以来最大的错误。咱们的前方则是两种选择。</p>
<p>一条是,用户可以决定与他们选择互动的每个网站分享什么信息。当用户下次打开一个标签页时,不必担心他们过去的浏览记录会反被用来操纵他们。</p>
<p>另一条则是,每个用户的行为被一目了然的从一个网站传送到另一个网站。他们最近的历史,被提炼成几个片段,被 "民主化",然后和参与每个网页服务的几十个
无名角色分享。用户在每次互动时,都会以“这是我这周的活动,请借此关照我”这种自招的告白开始。</p>
<p>用户和(真正的)隐私倡导者都要拒绝 FLoC 和其他的试图重新发明基于行为的定向广告的错误尝试。 希望 Google 放弃 FLoC 转而为构建真正的用户友好的互联而努力。</p>
<h2>FLoC 是个啥?</h2>
<p>2019 年,Google 提出了<a href="https://www.blog.google/products/chrome/building-a-more-private-web">“隐私沙盒”</a>,一种对网络隐私的未来愿景。
它的中心是一套满足现在第三方 Cookies 提供给广告商的诸多使用场景的协议,其中没有 Cookies。
在成立了一个主要由广告商组成的“ Web Advertising Business Group”(网络广告商务工作组?)以后,Google 又向 W3C 提交了这一系列的提案。其后的数个月,Google 和一众广告商又提交了一打以鸟类的名字命名的“技术标准”:
<a href="https://github.com/michaelkleber/pigin">PIGIN (这啥?)</a>,
<a href="https://github.com/WICG/turtledove">TURTLEDOVE (斑鸠?)</a>,
<a href="https://github.com/WICG/sparrow">SPARROW (麻雀?)</a>,
<a href="https://github.com/1plusX/swan">SWAN (天鹅?)</a>,
<a href="https://github.com/AdRoll/privacy/blob/main/SPURFOWL.md">SPURFOWL(白鹭?)</a>,
<a href="https://github.com/neustar/pelican">PELICAN (鹈鹕?</a>,
<a href="https://github.com/prebid/identity-gatekeeper/blob/master/proposals/PARRROT.md">PARROT (鹦鹉?)</a>,
以及<a href="https://github.com/w3c/web-advertising#ideas-and-proposals-links-outside-this-repo">更多不胜枚举</a>。
每一个“鸟”提案都在实现所谓的定向广告生态系统中一个目前由 Cookie 实现的功能。</p>
<p>FLoC 设计上用来帮助广告商不用第三方 Cookies 进行行为定位。启用 FLoC 的浏览器会收集用户浏览偏
具有相似偏好的用户(这里的“相似”要怎么定义?)会分组到同一队列中。每个用户的浏览器会和网站和广告商分享一份自己属于哪些群组的队列列表。根据他们的提案,每个队列中至少会有几千个用户(虽然没有保证)。</p>
<p>话太长不想看?那汝大可以这么想:汝的 FLoC ID 就是汝最近活动的简单摘要。</p>
<p>Google 的概念验证文档(Proof of Concept,PoC)用每个用户访问的网站的域名作为分组的依据。然后利用名为 <a href="https://en.wikipedia.org/wiki/SimHash">SimHash</a> 的算法来生成群组。
这个算法进行的计算可以在用户的设备上完成,因此不需要中心服务器去收集那些行为数据。但是“还是需要一个中心管理员来执行隐私保证”。为了防止队列为了识别用户规划的太小,
Google 提议由一个中心统计分配给每个群组的用户数量。如果有的群组用户太少,可以将其与其他类似的群组合并,直到每个群组有足够的用户。</p>
<blockquote>
<p>FLoC 对广告商有用的原因是,用户的队列群组会透露关于他们的行为的必要信息。</p>
</blockquote>
<p>虽然大部分的细节在提案中还没有定论。这份提案的草稿表示用户的队列 ID 可以通过 JavaScript 访问,但是并没有清楚的指出会不会对可以访问的对象有所限制,以及队列 ID 有无其它的共享方法。
FLoC 可以基于 URL 或页面的内容(而不是之前提起的域名)来集群,也可以使用基于联合学习的系统(它的名字不就是这么暗示的?)代替 SimHash 来生成群组。
它也没有明确队列群组的数量,Google 在实验中使用了 8 位长的队列标识符(也就是队列有 256 个),实际情况下的数量应该会更大;文档中<a href="https://github.com/WICG/floc#overview">建议</a>的长度是 16 位,
也就是四个十六进制数。队列越多,它们就越具体。更长的队列 ID 意味着广告商了解了更多用户的兴趣,也能更容易的描绘他们的指纹。</p>
<p>不过期限这件要素 ''是'' 约定好的,FLoC 队列会以每周为一个周期利用上周的浏览数据重新计算。这使得 FLoC (看起来)有些难以用于长期识别,但这也使它们更有力地计量了用户在一段时间内的行为。</p>
<h2>新的隐私问题</h2>
<p>FLoC 意在将定向广告带入保护隐私的未来。不过它的核心设计涉及到了会和广告伤分享新的信息。于是就不出所料的引入了新的隐私风险。</p>
<h3>指纹</h3>
<p>首先令人担忧的就是指纹。老生常谈的浏览器指纹就是通过收集用户浏览器中离散的信息为这个浏览器创建一个独特和稳定的标记的过程。
EFF 的 <a href="https://www.eff.org/deeplinks/2020/11/introducing-cover-your-tracks">“Cover Your Tracks”</a> 演示了这个过程是如何运作的。
一言以蔽之:汝的浏览器看起来越和其他人的不一样,就更容易制作一个独特的指纹。</p>
<p>Google “保证”说绝大多数的 FLoC 队列都会包含几千名用户,因此一个队列 ID 应该不能把汝从数千个同一队列中的其他用户区分出来。然而,这还是给指纹识别者带来了巨大的领先优势。
要是跟踪者从汝的队列 ID 出发的话,它就只需要从几千个(而不是上百万)浏览器中把汝挑出来了。
用信息论的术语来说的话,FLoC 队列包含几比特的<a href="https://zh.wikipedia.org/wiki/%E7%86%B5_(%E4%BF%A1%E6%81%AF%E8%AE%BA)">熵</a>,在 Google 的实验中最大是 8 bit。
鉴于这些信息不太可能与浏览器暴露的其他信息相关联,所有它们说不定更加有力。
跟踪者利用现有的独特指纹跟踪一个 FLoC 用户说不定更容易了呢。</p>
<p>Google 也明白这会是个挑战,不过他们却是承诺会在<a href="https://github.com/bslassey/privacy-budget">更长远的“隐私预算”计划中</a>来解决指纹的问题。
解决指纹问题是一个令人钦佩的目标,它的提案提供的捷径看起来也很有希望。
不过 <a href="https://github.com/bslassey/privacy-budget/blob/master/faq.md#whats-the-status-of-the-privacy-budget-what-browsers-support-it">FAQ 中</a>又说这“是个早期阶段的建议,目前还没有浏览器实现”,
于此同时,Google 在<a href="https://www.chromestatus.com/feature/5710139774468096">这个月</a>开始测试 FLoC。</p>
<p>指纹问题已经众所周知的难以阻止,像 Safari 和 Tor Browser 这样的浏览器为了减少指纹攻击面牺牲了大量功能,这个和追踪者进行的消耗战已经持续了数年之久。
缓解指纹追踪的方法一般都会是去除或者限制不必要的熵来源——然后 FLoC 成为了一种新的熵来源。在解决现有的指纹问题之前,Google 还要再制造一个新的问题吗?</p>
<h3>跨越内容的暴露</h3>
<p>第二个问题不太容易解释:这技术和已经在识别用户的追踪者分享了新的个人数据。FLoC 对广告商有用的原因是,用户的队列群组会透露关于他们的行为的必要信息。</p>
<p>这个项目的 GitHub 页面是这么描述的:</p>
<blockquote>
<p>这个 API 将个人的一般浏览历史(以及一般兴趣)的一些信息“民主化”,让任何选择加入的网站都能获得......
已经知晓某个人的网站(例如他/她/它通过电子邮件地址在这个网站注册)可以记录和展示他们的队列。这意味着有关个人兴趣的信息最终可能会被公开。</p>
</blockquote>
<p>就像上面描述的那样, FLoC 队列自己并不能作为标识符。不过能以其它方式标记用户的网站(例如“通过 Google 登录”)就能把通过 FLoC 了解到的信息和个人资料关联。</p>
<p>两类信息可能会因为这种方式暴露:</p>
<ol>
<li>关于浏览历史的具体信息。追踪者可能会通过逆向工程队列分配算法来确定任何属于特定群体的用户可能(或者一定?)会访问特定的网站。</li>
<li>观察者可能会了解到关于人口统计学或兴趣的一般信息。一般来说某一特定群体的成员很可能是某一特定类型的人。例如,某一特定群组可能会有很多年轻的黑人女性用户,或者中年共和党选民;或者 LGBTQ+ 青年。</li>
</ol>
<p>这就意味着汝访问的网站不需要提前在整个互联网中调查汝就能在第一次接触中知道汝是个什么样的家伙。除此以外,汝的 FLoC 队列会定期更新,能以其它方式标记汝的网站也能借此跟踪汝浏览行为的变化。
别忘了,一个 FLoC 群组就是对汝最近浏览活动的摘要,仅此而已。</p>
<p>汝应该有权在不同的语境中展示汝身份中不同的部分,例如汝在访问一个医疗信息网站的时候会允许它获得汝的健康状况,但是多半不想让它知道汝的政治倾向。
类似的,汝在逛零售网站的时候也多半不想让它知道汝最近有没有阅读关于治疗抑郁症的资料。
FLoC 就这样腐蚀了汝划分的各种语境,取而代之的是把同样的摘要分享给了和汝互动的每一位。</p>
<h2>隐私之外</h2>
<p>FLoC 被设计来防止通过跨越环境的标识实现个性化的特征分析这一具体问题。
它们的目标都是避免让追踪者获取可以与特定人联系起来的特定信息。
但就像咱们之前展示的那样,FLoC 也能在大量的环境中帮到追踪者。即使 Google 能够通过迭代设计防范这一风险,定向广告的危害并不限于侵犯隐私。
FLoC 的核心目标就和公民自由的其他部分相悖。</p>
<p>定向的力量也是歧视。从定义来看,有针对性的广告允许广告商达到某些种类的人,而排除掉其它的。定向系统可以像为鞋子做广告一样容易的决定谁能看到招聘信息或贷款提议。</p>
<p>这么多年以来,定向广告利用的最多的地方就是剥削、歧视和伤害。关于工作、住房和信贷的广告可以根据目标人群的种族、宗教、性别、年龄或能力等因素不同进行程度的辨别。
基于信用记录或相关历史性特征的定位让高息贷款广告铺天盖地。
基于人口统计学、地点和政治派别的定向广告帮助了一大批出于各种政治动机传播虚假信息和压制选民的传播者。所有类型的行为标的都在增加“令人信服的诈骗”的风险、</p>
<blockquote>
<p>与其重新发明跟踪轮子,咱们为啥不去想象一个没有目标投放广告(和它带来的无数问题)的更好的世界?</p>
</blockquote>
<p>Google、Facebook 和其它不少的大广告平台已经在设法控制对它们平台的某些用途。例如 Google 限制广告商收集<a href="https://support.google.com/adspolicy/answer/143465?hl=en">“敏感兴趣类别有关的信息”</a>。
但是没有什么作用,铁了心要这么做的人总能找到解决整个平台对<a href="https://www.propublica.org/article/facebook-ads-can-still-discriminate-against-women-and-older-workers-despite-a-civil-rights-settlement">某些类型的定向</a>
或<a href="https://theintercept.com/2016/10/07/google-said-it-would-ban-all-payday-loan-ads-it-didnt">某些类型的广告</a>的限制的变通方法。</p>
<p>即使平台有绝对的权力知晓哪些信息能用来针对谁,也往往无法阻止对技术的滥用。 FLoC 用一种<a href="https://en.wikipedia.org/wiki/Unsupervised_learning">无监督学习</a>算法来构建它的集群,所以没人能直接控制哪些人会被划分到一起。
(对于广告商的)理想状况来说,FLoC 会把有共同的行为和兴趣爱好的人划分到一起。但网络行为还会和各种敏感特征有关——
像是性别、种族、年龄和收入这样的<a href="https://ojs.aaai.org/index.php/ICWSM/article/view/14776">人口统计学</a>数据
和<a href="https://www.pnas.org/content/117/30/17680">“五大”人格特征</a>,甚至<a href="https://link.springer.com/chapter/10.1007/978-3-642-23620-4_22">心理健康状况</a>。
很有可能 FLoC 也会把具有相同的此类特征的人划分到一起,FLoC 的分组也可能直接反映到与药物滥用、经济困难或支持创伤幸存者有关的网站的访问状况。</p>
<p>Google <a href="https://github.com/WICG/floc#excluding-sensitive-categories">提议</a>称它可以通过监控系统的输出来检查和敏感类别的相关性。如果它发现某个队列与某个受保护群体的关系过于密切,管理服务器可以为算法选择新的参数,并告诉用户的浏览器重新分组。</p>
<p>这个解决方案听起来既奥威尔又西西弗,为了监控 FLoC 的分组和敏感分类有多么相关,Google 要用关于用户种族、性别、宗教、年龄、健康和财务状况的数据进行大量审计。每次发现关联太强的队列的时候,就不得不重新配置整个算法并再次尝试,希望新版本中没有其他 "敏感类别 "受到牵连。这个问题比之前在尝试解决的问题更加困难,而且每次解决的尝试都以失败告终。</p>
<p>如果 FLoC 大规模的应用,利用年龄、性别、收入等因素直接区分用户也许会更难,但还不无可能。
坐拥辅助信息的跟踪者可以通过观察和实验学习 FLoC 分组的“意义”——这队列中包含哪些人。
那些铁了心要这么做的人就饿能继续如此辨别用户。
此外,这种行为对于平台来说,将比现在更难监管。有不良意图的广告商必然会以合理的方式进行否认——毕竟它们只是根据行为(而不是那些“敏感的类别”)在接触人们。
整个系统对于用户和监管者来说也会愈发不透明。</p>
<h2>Google,别这么做</h2>
<p>我们在 Google <a href="https://www.eff.org/deeplinks/2019/08/dont-play-googles-privacy-sandbox-1">第一次提出这些提案</a>的时候曾经把 FLoC 叫做
“隐私保护技术的反面教材”。
我们希望标准流程能阐明 FLoC 的根本性缺陷,让 Google 能重新考虑推进。
事实上,Github 上的几个 Issue 也提出了我们在这里强调的同样的问题。
(例如<a href="https://github.com/WICG/floc/issues/36">这个</a>,<a href="https://github.com/WICG/floc/issues/16">这个</a>和<a href="https://github.com/WICG/floc/issues/40">这个</a>。
不过 Google 还是在基础几乎不变的情况下继续开发这个系统。以<a href="https://www.adexchanger.com/online-advertising/the-industry-reacts-to-googles-bold-claim-that-flocs-are-95-as-effective-as-cookies/">“95% 有效的”</a> Cookies 取代手段
向广告商夸口。<a href="https://www.chromestatus.com/features/schedule">发布于 3 月 2 日的 Chrome 89</a>已经开始<a href="https://blog.google/products/ads-commerce/2021-01-privacy-sandbox/">测试这一技术</a>。
有一小批 Chrome 用户(大概有上百万)将会(或已经)参加这一实验。</p>
<p>别搞错了,如果 Google 是在按计划在 Chrome 上实现 FLoC 的话,那应该会给大家“选项”。这个系统可能会让从中受益的广告商选择加入,而让觉得会受到损害的用户选择退出。
然后 Google 会在明知绝大多数用户完全不知道 FLoC 是啥,没啥人会选择关闭的的情况下吹捧说这是这是 "透明度和用户控制 "的一步。
自夸说自己终结了在它半生中帮自己<a href="https://www.eff.org/deeplinks/2020/03/google-says-it-doesnt-sell-your-data-heres-how-company-shares-monetizes-and">赚到上十亿美元的</a>
邪恶的第三方 Cookie,在互联网上开创了一个“新的私密时代”。</p>
<p>不一定非要这样。隐私沙盒中最重要的部分,譬如放弃第三方标识符和对抗指纹识别,将真正更好地改变网络的现状。Google 本可以把那些旧的监视脚手架拆掉的时候不再换上新的既独特又有害的家伙们的。</p>
<p>我们坚决反对 FLoC。那不是我们想要的,也不是用户应有的世界。 Google 该从第三方追踪的经历中学到正确的教训,为用户(而不是为了广告商)设计浏览器。</p>用 Hyper-V 玩些小花样2021-03-26T00:00:00+08:002021-03-26T00:00:00+08:00ホロtag:None,2021-03-26:/tech_misc/build_virtualization_stuffs_with_hyper_v.html<p>从前面那篇 <a class="reference external" href="/tech_misc/hyper_v_with_openwrt.html">Hyper-V 和 OpenWrt 搭建软路由</a>
开始咱就开始在 Windows 上用 Hyper-V 了。 <del>然后场面逐渐失控……</del></p>
<p>这篇文章就是把咱这几天遇到的各种问题和可能的解决方案记下来这个样子。</p>
<div class="section" id="id1">
<h2>汝应该尝试 Hyper-V 吗?</h2>
<p>如果汝有像咱一样的某些需求的话,那 Hyper-V 可能也很适合汝。</p>
<ul>
<li><p class="first">想在 Windows 开机时自动启动某个虚拟机。</p>
<blockquote>
<p>VMware Workstation 15 还可以用内置的共享虚拟机设置开机启动的,不过 16 开始弃用了。
VirtualBox 文档里有提用服务设置开机启动虚拟机。 <del>虽然咱一次都没成功过……</del></p>
</blockquote>
</li>
<li><p class="first">有用另一台电脑访问这台电脑上虚拟机的需求。</p>
</li>
<li><p class="first">在用 WSL 2,那其实汝已经算是启用了 Hyper-V 了嘛。</p>
</li>
<li><p class="first">(或者还有别的?)</p>
</li>
</ul>
<p>不过汝也许会因为这些原因不想尝试。</p>
<ul>
<li><p class="first">旧版 VMware Workstation 或 VirtualBox 用户。</p>
<blockquote>
<p>启用 Hyper-V 以后会导致旧版 …</p></blockquote></li></ul></div><p>从前面那篇 <a class="reference external" href="/tech_misc/hyper_v_with_openwrt.html">Hyper-V 和 OpenWrt 搭建软路由</a>
开始咱就开始在 Windows 上用 Hyper-V 了。 <del>然后场面逐渐失控……</del></p>
<p>这篇文章就是把咱这几天遇到的各种问题和可能的解决方案记下来这个样子。</p>
<div class="section" id="id1">
<h2>汝应该尝试 Hyper-V 吗?</h2>
<p>如果汝有像咱一样的某些需求的话,那 Hyper-V 可能也很适合汝。</p>
<ul>
<li><p class="first">想在 Windows 开机时自动启动某个虚拟机。</p>
<blockquote>
<p>VMware Workstation 15 还可以用内置的共享虚拟机设置开机启动的,不过 16 开始弃用了。
VirtualBox 文档里有提用服务设置开机启动虚拟机。 <del>虽然咱一次都没成功过……</del></p>
</blockquote>
</li>
<li><p class="first">有用另一台电脑访问这台电脑上虚拟机的需求。</p>
</li>
<li><p class="first">在用 WSL 2,那其实汝已经算是启用了 Hyper-V 了嘛。</p>
</li>
<li><p class="first">(或者还有别的?)</p>
</li>
</ul>
<p>不过汝也许会因为这些原因不想尝试。</p>
<ul>
<li><p class="first">旧版 VMware Workstation 或 VirtualBox 用户。</p>
<blockquote>
<p>启用 Hyper-V 以后会导致旧版 VMware Workstation 或 VirtualBox 无法启动虚拟机。</p>
<p>也有人觉得在开启 Hyper-V 的主机上开别的虚拟化软件时性能会下降什么的。</p>
</blockquote>
</li>
<li><p class="first">想在 Windows 上试用 GNU/Linux 桌面。</p>
<blockquote>
<p>Hyper-V 的 framebuffer 缓存(是这个意思吧?)只有 8M,于是开 GNU/Linux 桌面可能会很吃力。
(增强会话是基于 RDP 的,嗯……)</p>
</blockquote>
</li>
<li><p class="first"><del>Windows 10 家庭版用户 (也没法开)</del></p>
</li>
</ul>
<p>以及咱这几天下来对 Hyper-V 的槽点,大概就只有那个检查点了吧,
虽然有类似快照的“检查点”,但是不能让某个虚拟磁盘不在检查点里。(VMware 的独立虚拟磁盘或者 VirtualBox 的完全写入)</p>
</div>
<div class="section" id="id2">
<h2>环境准备</h2>
<p>如果是 Windows 10 专业版(或者专业工作站版/企业版/教育版啥的),就参考前面那篇文章了。</p>
<p>不过咱这回换成 Windows Server 2019 了,所以从服务器管理器安装 Hyper-V 角色就可以了。</p>
<p>以及如果汝只需要 Hyper-V 这一个功能的话,还可以选择用
<a class="reference external" href="https://www.microsoft.com/en-us/evalcenter/evaluate-hyper-v-server-2019">Hyper-V Server</a> ,
虽然这个没有图形界面,不过可以通过 Windows Admin Center 或者 Windows 远程管理来管理。</p>
</div>
<div class="section" id="windows-admin-center">
<h2>安装和使用 Windows Admin Center</h2>
<blockquote>
<p>Windows Admin Center 是本地部署的基于浏览器的应用,用于管理 Windows 服务器、
群集、超融合基础设施和 Windows 10 电脑。 它是免费产品,可供在生产中使用。</p>
<p><a class="reference external" href="https://docs.microsoft.com/zh-cn/windows-server/manage/windows-admin-center/overview">Windows Admin Center 概述 | Microsoft Docs</a></p>
</blockquote>
<p>Windows Admin Center 可以装在 Windows 10 上作为客户端,也可以装在 Windows Server 上作为网络服务,
咱这次就装在 Server 上了。有桌面体验的话直接从
<a class="reference external" href="https://www.microsoft.com/evalcenter/evaluate-windows-admin-center">Microsoft Evaluation Center</a>
下载和安装就好,如果是服务器核心模式或者 Hyper-V Server 的话,用 PowerShell 来下载和安装也是可以的。</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c"># PowerShell 里也是有 wget 的,虽然用法和 GNU/Linux 里面的不太一样。</span></span>
<span class="code-line"><span class="nb">wget </span><span class="n">-Uri</span> <span class="n">https</span><span class="err">:</span><span class="p">//</span><span class="n">aka</span><span class="p">.</span><span class="n">ms</span><span class="p">/</span><span class="n">WACDownload</span> <span class="n">-UseBasicParsing</span> <span class="n">-OutFile</span> <span class="n">c</span><span class="err">:</span><span class="p">\</span><span class="n">WindowsAdminCenter</span><span class="p">.</span><span class="n">msi</span></span>
<span class="code-line"><span class="c"># 用 msiexec 安装 Windows Admin Center,这里选择用自生成的证书。</span></span>
<span class="code-line"><span class="c"># SME_PORT 是 Windows Admin Center 的端口。</span></span>
<span class="code-line"><span class="c">## 不要使用点斜杠相对路径表示法(例如 .\<WindowsAdminCenterInstallerName>.msi)</span></span>
<span class="code-line"><span class="c">## 从 PowerShell 调用 msiexec。 该表示法不受支持,会导致安装失败。 请删除 .\ 前缀或指定 MSI 的完整路径。</span></span>
<span class="code-line"><span class="n">msiexec</span> <span class="p">/</span><span class="n">i</span> <span class="n">c</span><span class="err">:</span><span class="p">\</span><span class="n">WindowsAdminCenter</span><span class="p">.</span><span class="n">msii</span> <span class="p">/</span><span class="n">qn</span> <span class="p">/</span><span class="n">L</span><span class="p">*</span><span class="n">v</span> <span class="n">log</span><span class="p">.</span><span class="n">txt</span> <span class="n">SME_PORT</span><span class="p">=</span><span class="n">443</span> <span class="n">SSL_CERTIFICATE_OPTION</span><span class="p">=</span><span class="n">generate</span></span>
</pre></div>
<p>安装好后 Windows Admin Center 就会从 Windows Update 接收更新了。
然后从浏览器打开 Server 的 IP 地址:</p>
<blockquote>
Microsoft 推荐是用 Microsoft Edge 或者 Google Chrome 来访问 Windows Admin Center 啦。</blockquote>
<p>在输入服务器上管理员的用户名和密码登录以后,就能见到主界面啦。</p>
<img alt="Windows Admin Center 的主界面" class="materialboxed responsive-img" src="/images/build_virtualization_stuffs_with_hyper_v/windows_admin_center_login.png"/>
<p>选择要连接的服务器,就能看到服务器的各种状态。</p>
<img alt="主机状态" class="materialboxed responsive-img" src="/images/build_virtualization_stuffs_with_hyper_v/windows_admin_center_status.png"/>
<p>如果已经安装好 Hyper-V 的话,就能在这里管理虚拟机。</p>
<img alt="虚拟机管理器" class="materialboxed responsive-img" src="/images/build_virtualization_stuffs_with_hyper_v/windows_admin_center_hyper_v.png"/>
<p>也可以管理设置和远程连接虚拟机。</p>
<img alt="虚拟机连接。" class="materialboxed responsive-img" src="/images/build_virtualization_stuffs_with_hyper_v/windows_admin_center_login.png"/>
<p>不过用 Windows Admin Center 下载来的远程桌面连接的时候,要输入的是服务器的用户名和密码的样子。</p>
</div>
<div class="section" id="hyper-v-windows-winrm">
<h2>使用 Hyper-V 管理器和 Windows 远程管理(WinRM)管理虚拟机</h2>
<p>效果就是可以用 Windows 上的 Hyper-V 管理器连接到服务器,然后就像 Hyper-V 运行在本地一样。
不过也挺麻烦的就是了。</p>
<p>首先,在服务器上启动 Windows 远程管理服务,以及适当的前期配置。
下面的命令都是在以管理员身份运行的 PowerShell 里完成的。</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c"># 启动 WinRM 快速配置。</span></span>
<span class="code-line"><span class="c"># 这三步中间的询问按提示来就可以了。</span></span>
<span class="code-line"><span class="c"># 如果遇到因为公用网络无法设置防火墙规则的话,解决方法在下面。</span></span>
<span class="code-line"><span class="n">winrm</span> <span class="n">quickconfig</span></span>
<span class="code-line"><span class="c"># 启用 PowerShell 远程访问。</span></span>
<span class="code-line"><span class="nb">Enable-PSRemoting</span></span>
<span class="code-line"><span class="c"># 为凭据委派(咱也不知道这是啥)启用 CredSSP。</span></span>
<span class="code-line"><span class="nb">Enable-WSManCredSSP</span> <span class="n">-Role</span> <span class="n">server</span></span>
</pre></div>
<p>如果汝遇上因为公用网络无法设置防火墙规则的话,可以用 PowerShell 更改网络类型。</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c"># 用 Get-NetConnectionProfile 获得现在连接的网络适配器的信息</span></span>
<span class="code-line"><span class="nb">Get-NetConnectionProfile</span></span>
<span class="code-line"></span>
<span class="code-line"> <span class="n">Name</span> <span class="err">:</span> <span class="n">网络</span> <span class="n">2</span></span>
<span class="code-line"> <span class="n">InterfaceAlias</span> <span class="err">:</span> <span class="n">vEthernet</span> <span class="p">(</span><span class="n">Internal</span><span class="p">)</span></span>
<span class="code-line"> <span class="n">InterfaceIndex</span> <span class="err">:</span> <span class="n">8</span></span>
<span class="code-line"> <span class="n">NetworkCategory</span> <span class="err">:</span> <span class="n">Private</span></span>
<span class="code-line"> <span class="n">IPv4Connectivity</span> <span class="err">:</span> <span class="n">Internet</span></span>
<span class="code-line"> <span class="n">IPv6Connectivity</span> <span class="err">:</span> <span class="n">LocalNetwork</span></span>
<span class="code-line"></span>
<span class="code-line"> <span class="n">Name</span> <span class="err">:</span> <span class="n">网络</span></span>
<span class="code-line"> <span class="n">InterfaceAlias</span> <span class="err">:</span> <span class="n">vEthernet</span> <span class="p">(</span><span class="n">External</span><span class="p">)</span></span>
<span class="code-line"> <span class="n">InterfaceIndex</span> <span class="err">:</span> <span class="n">18</span></span>
<span class="code-line"> <span class="n">NetworkCategory</span> <span class="err">:</span> <span class="n">Public</span></span>
<span class="code-line"> <span class="n">IPv4Connectivity</span> <span class="err">:</span> <span class="n">Internet</span></span>
<span class="code-line"> <span class="n">IPv6Connectivity</span> <span class="err">:</span> <span class="n">Internet</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="c"># 用 Set-NetConnectionProfile 设置网络的类别,记得把 InterfaceIndex 换成汝需要更改的那个网络。</span></span>
<span class="code-line"><span class="nb">Set-NetConnectionProfile</span> <span class="n">-InterfaceIndex</span> <span class="n">18</span> <span class="n">-NetworkCategory</span> <span class="n">Private</span></span>
</pre></div>
<p>接下来这些操作在客户端上完成。</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c"># 首先就是把 Hyper-V 管理工具装上啦。</span></span>
<span class="code-line"><span class="c"># 用 “启用或关闭 Windows 功能” 也是可以的。</span></span>
<span class="code-line"><span class="nb">add-windowsfeature</span> <span class="n">rsat-hyper-v-tools</span></span>
<span class="code-line"><span class="c"># 然后在客户端启动 WinRM 快速配置。</span></span>
<span class="code-line"><span class="n">winrm</span> <span class="n">quickconfig</span></span>
<span class="code-line"><span class="c"># 设置客户端 WinRM 的信任的主机。</span></span>
<span class="code-line"><span class="c"># 记得把 fqdn-of-hyper-v-host 换成服务器的完全限定域名(FQDN Hostname)</span></span>
<span class="code-line"><span class="c"># 在 Windows 上的话, FQDN Hostname 就是服务器的计算机名加上连接特定的 DNS 后缀。</span></span>
<span class="code-line"><span class="c"># 这个后缀能用 ipconfig 命令看到。例如咱这里的 FQDN Hostname 就是 "WIN-0JL0BB72KFC.lan"。</span></span>
<span class="code-line"><span class="nb">Set-Item</span> <span class="n">WSMan</span><span class="err">:</span><span class="p">\</span><span class="n">localhost</span><span class="p">\</span><span class="n">Client</span><span class="p">\</span><span class="n">TrustedHosts</span> <span class="n">-Value</span> <span class="s2">"fqdn-of-hyper-v-host"</span></span>
<span class="code-line"><span class="c"># 启用客户端 CredSSP 认证。</span></span>
<span class="code-line"><span class="nb">Enable-WSManCredSSP</span> <span class="n">-Role</span> <span class="n">client</span> <span class="n">-DelegateComputer</span> <span class="s2">"fqdn-of-hyper-v-host"</span></span>
</pre></div>
<p>接着打开组策略对象编辑器(gpedit.msc),把
"计算机配置 >管理模板 >系统 >凭据委派 >允许向仅 NTLM 服务器身份验证分配全新凭据"
设置为启用,并在列表里添加 “wsman/汝服务器的 FQDN Hostname” 。像这个样子。</p>
<img alt="设定必要的策略" class="materialboxed responsive-img" src="/images/build_virtualization_stuffs_with_hyper_v/gpedit.png"/>
<p>打开 Hyper-V 管理器,选择“连接到服务器”,输入服务器的计算机名。以及把下面“以另一个用户身份登录”那项
选中。</p>
<img alt="设定服务器" class="materialboxed responsive-img" src="/images/build_virtualization_stuffs_with_hyper_v/hyper_v_connect_server.png"/>
<p>不过设置用户的时候,这里的用户名是“服务器的计算机名\用户名”的形式。</p>
<img alt="设定服务器的用户" class="materialboxed responsive-img" src="/images/build_virtualization_stuffs_with_hyper_v/hyper_v_user.png"/>
<p>如果一切顺利的话,Hyper-V 管理器应该就能连接到服务器了。</p>
<img alt="连接成功的效果" class="materialboxed responsive-img" src="/images/build_virtualization_stuffs_with_hyper_v/hyper_v_connected_server.png"/>
</div>
<div class="section" id="remoteapp-windows">
<h2>通过 RemoteApp 运行 Windows 虚拟机上的应用</h2>
<p>RemoteApp 就像 VMware 的 Unity 模式或者 VirtualBox 的无缝模式,
不过虚拟机不在运行 RemoteApp 的电脑上而是在远程连接上啦。</p>
<p>不过以官方的方法配置 RemoteApp 的话,汝需要设置远程桌面服务,购买相应的许可证,设置 Active Directory 等等操作。
咱这里就用一个第三方的开源小工具 <a class="reference external" href="https://github.com/kimmknight/remoteapptool">RemoteApp Tool</a> 好了。</p>
<blockquote>
可以在 <a class="reference external" href="https://github.com/kimmknight/remoteapptool/wiki/Windows-Compatibility">https://github.com/kimmknight/remoteapptool/wiki/Windows-Compatibility</a> 上看到兼容性列表,
基本就只有 Windows 的企业版和 Windows Server 支持了。(好像最新的 Windows 10 专业版也可以?)</blockquote>
<p>安装好 RemoteAppTool 然后打开,界面大概就是这个样子。</p>
<img alt="RemoteApp Tool 的界面" class="materialboxed responsive-img" src="/images/build_virtualization_stuffs_with_hyper_v/remoteapp_0.png"/>
<p>点击下面的绿色加号按钮添加要供远程访问的应用。</p>
<img alt="RemoteApp Tool 添加应用" class="materialboxed responsive-img" src="/images/build_virtualization_stuffs_with_hyper_v/remoteapp_1.png"/>
<p>然后点击右下角的 “Create Client Connection” 生成远程桌面连接文件。基本上只要修改远程
桌面连接的地址就好。</p>
<img alt="RemoteApp Tool 生成 RDP 文件" class="materialboxed responsive-img" src="/images/build_virtualization_stuffs_with_hyper_v/remoteapp_2.png"/>
<p>然后就可以用远程桌面连接客户端连接啦,虽然可能没有本机上的无缝模式流畅。</p>
<img alt="RemoteApp 效果演示" class="materialboxed responsive-img" src="/images/build_virtualization_stuffs_with_hyper_v/remoteapp_3.png"/>
<p>以及 Windows 对远程会话的数量是有限制的(Windows 1 个,Windows Server 没有 RDS 许可时 2 个),
不过应该够用吧……</p>
<hr class="docutils"/>
<p>以上。</p>
</div>
Hyper-V 和 OpenWrt 搭建软路由2021-03-15T00:00:00+08:002021-03-15T00:00:00+08:00ホロtag:None,2021-03-15:/tech_misc/hyper_v_with_openwrt.html<p>笔记本上虚拟机越开越多,于是怎么给它们划分网络就是一个问题,例如代理软件什么的。</p>
<p>因为咱不想每一个虚拟机上就单独设置一遍,就想起来了咱给咱手上不支持代理设置的设备
(例如游戏主机什么的)连的那个运行有代理软件的路由器了。然后发现已经有人尝试过了,那就开工咯。</p>
<blockquote>
<p>介于随便汝等说咱是更想授之以渔还是就是在偷懒都好的想法,咱不会给出事无巨细的操作方法。
当然如果汝也想跟着做的话,遇到问题时也可以来问咱(或者上网搜索一番)。</p>
<p>以及基于 Hyper-V 的特殊性,启用完以后可能会导致老的虚拟机软件无法启动。
嘛最新的 VMware Workstation 和 VirtualBox 应该是已经支持了的。</p>
</blockquote>
<div class="section" id="hyper-v">
<h2>准备工作 - Hyper-V 管理器、映像和创建虚拟机</h2>
<p>要使用 Hyper-V 的话,汝得有一个 Windows 8.1/10 专业版或者企业版,
或者 Windows Server 2012 以后的 Windows Server 才行。同时也要求汝的 CPU 支持必要的虚拟化技术。
(Intel VT-x …</p></div><p>笔记本上虚拟机越开越多,于是怎么给它们划分网络就是一个问题,例如代理软件什么的。</p>
<p>因为咱不想每一个虚拟机上就单独设置一遍,就想起来了咱给咱手上不支持代理设置的设备
(例如游戏主机什么的)连的那个运行有代理软件的路由器了。然后发现已经有人尝试过了,那就开工咯。</p>
<blockquote>
<p>介于随便汝等说咱是更想授之以渔还是就是在偷懒都好的想法,咱不会给出事无巨细的操作方法。
当然如果汝也想跟着做的话,遇到问题时也可以来问咱(或者上网搜索一番)。</p>
<p>以及基于 Hyper-V 的特殊性,启用完以后可能会导致老的虚拟机软件无法启动。
嘛最新的 VMware Workstation 和 VirtualBox 应该是已经支持了的。</p>
</blockquote>
<div class="section" id="hyper-v">
<h2>准备工作 - Hyper-V 管理器、映像和创建虚拟机</h2>
<p>要使用 Hyper-V 的话,汝得有一个 Windows 8.1/10 专业版或者企业版,
或者 Windows Server 2012 以后的 Windows Server 才行。同时也要求汝的 CPU 支持必要的虚拟化技术。
(Intel VT-x 或者 AMD-V 什么的)可以通过 PowerShell 里的 systeminfo 命令确定是否可以开启 Hyper-V 。</p>
<p>在满足了前置要求之后,可以这样启用 Hyper-V:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c"># 如果提示找不到命令的话,换以管理员身份运行的 PowerShell 窗口。</span></span>
<span class="code-line"><span class="nb">Enable-WindowsOptionalFeature</span> <span class="n">-Online</span> <span class="n">-FeatureName</span> <span class="n">Microsoft-Hyper-V</span> <span class="n">-All</span></span>
</pre></div>
<p>或者用“启用或关闭 Windows 功能”也是可以的。</p>
</div>
<div class="section" id="openwrt">
<h2>下载和转换 OpenWrt 映像</h2>
<p>接下来到 OpenWrt 的网站上下载映像
(这时候最新的版本是 19.07,于是链接就是 <a class="reference external" href="https://downloads.openwrt.org/releases/19.07.7/targets/x86/64/">https://downloads.openwrt.org/releases/19.07.7/targets/x86/64/</a> )</p>
<img alt="OpenWrt 下载页面的样子,这里咱们选择包含有内核和 rootfs 的 combined 映像。" class="materialboxed responsive-img" src="/images/hyper_v_with_openwrt/openwrt_web.jpeg"/>
<p>这里咱们选择包含有内核和 rootfs 的 combined 那俩,
区别在于 squashfs 那个安装好以后系统分区像在普通路由器一样是只读的,可以实现像是升级或者复位等功能。
不过咱大概会用检查点来实现这些,那就直接用 ext4 的好了。下载和解压以后汝大概就可以得到一个像是
openwrt-19.07.7-x86-64-combined-ext4.img 这样的文件了。</p>
<p>但是 Hyper-V 只能用微软自己的 VHD 或者 VHDX 格式,所以还需要转换一下。
转换的方法有很多,咱这里给出咱的一个例子。</p>
<p>创建一个虚拟磁盘。这里用了 diskpart 命令。如果汝更偏好用磁盘管理操作的话,
可以参考
<a class="reference external" href="https://docs.microsoft.com/zh-cn/windows-server/storage/disk-management/manage-virtual-hard-disks">这篇文章</a></p>
<div class="highlight"><pre><span class="code-line"><span></span>Microsoft DiskPart version 10.0.21332.1000</span>
<span class="code-line">Copyright (C) Microsoft Corporation.</span>
<span class="code-line">On computer: DESKTOP-H6MANBV</span>
<span class="code-line"></span>
<span class="code-line"># 创建一个虚拟磁盘文件</span>
<span class="code-line"># create vdisk file=<汝要存放虚拟磁盘文件的位置> maximum=<它的最大大小,以 MiB 为单位> type=expandable</span>
<span class="code-line"># 假如汝有充足的硬盘空间的话,可以把上面的 type=expandable 改为 type=fixed 创建一个固定大小的虚拟磁盘。</span>
<span class="code-line"># 可以提高一些虚拟磁盘的性能。当然动态扩展对 OpenWrt 来说也够用就是了……</span>
<span class="code-line">DISKPART> create vdisk file=c:\test.vhd maximum=8192 type=expandable</span>
<span class="code-line"> 100 percent completed</span>
<span class="code-line">DiskPart successfully created the virtual disk file.</span>
<span class="code-line"></span>
<span class="code-line"># 选择刚才创建的虚拟磁盘</span>
<span class="code-line"># select vdisk file=<汝要存放虚拟磁盘文件的位置></span>
<span class="code-line">DISKPART> select vdisk file=c:\test.vhd</span>
<span class="code-line">DiskPart successfully selected the virtual disk file.</span>
<span class="code-line"></span>
<span class="code-line"># 挂载刚才选择的虚拟磁盘。</span>
<span class="code-line">DISKPART> attach vdisk</span>
<span class="code-line"> 100 percent completed</span>
<span class="code-line">DiskPart successfully attached the virtual disk file.</span>
<span class="code-line"></span>
<span class="code-line"># 初始化虚拟磁盘为 MBR 分区表。</span>
<span class="code-line"># OpenWrt 官方编译的版本不支持 UEFI 启动,所以就用 MBR 了。</span>
<span class="code-line">DISKPART> convert mbr</span>
<span class="code-line">DiskPart successfully converted the selected disk to MBR format.</span>
<span class="code-line"></span>
<span class="code-line"># 在下一步操作完成之后卸载虚拟磁盘</span>
<span class="code-line">DISKPART> detach vdisk</span>
<span class="code-line">DiskPart successfully detached the virtual disk file.</span>
</pre></div>
<p>接下来把这个映像写入虚拟磁盘就 OK 啦。(以及咱发现 Rufus 能把虚拟磁盘识别出来)</p>
<img alt="Rufus 能给虚拟磁盘写入 RAW 映像。" class="materialboxed responsive-img" src="/images/hyper_v_with_openwrt/rufus_flash.png"/>
</div>
<div class="section" id="id2">
<h2>创建虚拟交换机和虚拟机</h2>
<p>有点像其它 Hypervisor 里的虚拟网络啦,虚拟交换机类型里的外部网络就相当于桥接,
内部就相当于仅主机网络。于是这里创建一个外部和一个内部交换机。</p>
<img alt="Hyper-V 里的虚拟交换机" class="materialboxed responsive-img" src="/images/hyper_v_with_openwrt/hyper_v_virtual_switch.png"/>
<p>留意外部交换机这里的“允许管理操作系统共享此网络适配器”这个选项,把这个选项取消选择以后,
这块网卡就只能由虚拟机访问了。等全部设置妥当以后,汝就可以把这个选项关掉让主机从虚拟机联网了。</p>
<img alt="Hyper-V 里的虚拟机代数,第一代是传统的 BIOS 引导" class="materialboxed responsive-img" src="/images/hyper_v_with_openwrt/hyper_v_generation.png"/>
<p>创建虚拟机的时候,因为刚才提起过的 OpenWrt 官方编译的版本不支持 UEFI 启动的问题,所以就用第一代了。</p>
<img alt="为虚拟机连接新的虚拟交换机" class="materialboxed responsive-img" src="/images/hyper_v_with_openwrt/hyper_v_network.png"/>
<p>以及新建虚拟机的时候只能添加一个网络适配器,那这里就先把上面新建的内部交换机加上好了。</p>
<img alt="在虚拟机设置为虚拟机连接新的虚拟交换机" class="materialboxed responsive-img" src="/images/hyper_v_with_openwrt/hyper_v_add_adapter.png"/>
<p>创建完成以后可以在虚拟机设置里添加新的网络适配器,虚拟硬盘就是刚刚转换好的磁盘映像(所以汝刚才卸载了没有?)。</p>
<p>在连接和启动虚拟机之后,汝大概就可以看到这样的界面:</p>
<img alt="OpenWrt x86 首次启动的界面" class="materialboxed responsive-img" src="/images/hyper_v_with_openwrt/openwrt_initial.png"/>
<p>所以当然是先用 passwd 命令设置 root 用户的密码啦。</p>
</div>
<div class="section" id="id3">
<h2>查看和调整网卡设定</h2>
<p>如果汝像咱刚才一样先添加的内部交换机, ip link 命令应该可以看到虚拟机从上游获得了 IP 地址,也可以正常的联网。</p>
<p>(为了节省空间,这里省略了获得的和本地 IPv6 地址)</p>
<div class="highlight"><pre><span class="code-line"><span></span>root@OpenWrt:~# ip a</span>
<span class="code-line"><span class="m">1</span>: lo: <LOOPBACK,UP,LOWER_UP> mtu <span class="m">65536</span> qdisc noqueue state UNKNOWN qlen <span class="m">1000</span></span>
<span class="code-line"> link/loopback <span class="m">00</span>:00:00:00:00:00 brd <span class="m">00</span>:00:00:00:00:00</span>
<span class="code-line"> inet <span class="m">127</span>.0.0.1/8 scope host lo</span>
<span class="code-line"> valid_lft forever preferred_lft forever</span>
<span class="code-line"> inet6 ::1/128 scope host</span>
<span class="code-line"> valid_lft forever preferred_lft forever</span>
<span class="code-line"><span class="m">2</span>: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu <span class="m">1500</span> qdisc mq master br-lan state UP qlen <span class="m">1000</span></span>
<span class="code-line"> link/ether <span class="m">00</span>:15:5d:0a:a9:01 brd ff:ff:ff:ff:ff:ff</span>
<span class="code-line"><span class="m">3</span>: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu <span class="m">1500</span> qdisc mq state UP qlen <span class="m">1000</span></span>
<span class="code-line"> link/ether <span class="m">00</span>:15:5d:0a:a9:02 brd ff:ff:ff:ff:ff:ff</span>
<span class="code-line"> inet <span class="m">192</span>.168.10.147/24 brd <span class="m">192</span>.168.10.255 scope global eth1</span>
<span class="code-line"> valid_lft forever preferred_lft forever</span>
<span class="code-line"><span class="m">4</span>: br-lan: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu <span class="m">1500</span> qdisc noqueue state UP qlen <span class="m">1000</span></span>
<span class="code-line"> link/ether <span class="m">00</span>:15:5d:0a:a9:01 brd ff:ff:ff:ff:ff:ff</span>
<span class="code-line"> inet <span class="m">192</span>.168.10.1/24 brd <span class="m">192</span>.168.10.255 scope global br-lan</span>
<span class="code-line"> valid_lft forever preferred_lft forever</span>
</pre></div>
<p>当然如果没有成功也别担心,记下界面名称(eth0 这样的)下面 link/ether 后面的文字,
这就是汝这个虚拟网卡的 MAC 地址啦。</p>
<img alt="在网络适配器的高级功能选项里查看虚拟网卡的 MAC 地址" class="materialboxed responsive-img" src="/images/hyper_v_with_openwrt/hyper_v_query_mac_address.png"/>
<p>然后在虚拟机设置里找到对应的适配器,高级设置里可以看到这个适配器的 MAC 地址。</p>
<p>于是在咱这里,要连到上游的接口就是 eth1 了。接下来用 vim 打开 /etc/config/network 文件。</p>
<blockquote>
它默认的里面只有 vim 让咱也很难办啊,如果汝对 VIM 的操作不是很熟练的话,记得准备一个操作指南在手边。</blockquote>
<div class="highlight"><pre><span class="code-line"><span></span>config interface 'loopback'</span>
<span class="code-line"> option ifname 'lo'</span>
<span class="code-line"> option proto 'static'</span>
<span class="code-line"> option ipaddr '127.0.0.1'</span>
<span class="code-line"> option netmask '255.0.0.0'</span>
<span class="code-line"></span>
<span class="code-line">config globals 'globals'</span>
<span class="code-line"> option ula_prefix 'fddb:38c5:4b0a::/48'</span>
<span class="code-line"></span>
<span class="code-line">config interface 'lan'</span>
<span class="code-line"> option type 'bridge'</span>
<span class="code-line"> # 把这里的 eth0 换成汝内部交换价连接的适配器上的接口</span>
<span class="code-line"> option ifname 'eth0'</span>
<span class="code-line"> option proto 'static'</span>
<span class="code-line"> # 默认是 192.168.1.1,如果担心和自己网络上已有的端冲突的话也可以修改一下。</span>
<span class="code-line"> option ipaddr '192.168.50.1'</span>
<span class="code-line"> option netmask '255.255.255.0'</span>
<span class="code-line"> option ip6assign '60'</span>
<span class="code-line"></span>
<span class="code-line">config interface 'wan'</span>
<span class="code-line"> # 把这里的 eth1 换成汝外部交换价连接的适配器上的接口</span>
<span class="code-line"> option ifname 'eth1'</span>
<span class="code-line"> option proto 'dhcp'</span>
<span class="code-line"></span>
<span class="code-line"># 如果汝的上游网络支持 IPv6,那可以添上这一段试试?</span>
<span class="code-line">config interface 'wan6'</span>
<span class="code-line"> option ifname 'eth1'</span>
<span class="code-line"> option proto 'dhcpv6'</span>
<span class="code-line"> option reqaddress 'try'</span>
<span class="code-line"> option reqprefix 'auto'</span>
</pre></div>
<p>保存完成以后可以重启网络服务,或者直接重启系统也行。一切顺利的话,
主机上的虚拟交换机应该能正确的获得 IP 地址:</p>
<div class="highlight"><pre><span class="code-line"><span></span>Ethernet adapter vEthernet (Internal):</span>
<span class="code-line"></span>
<span class="code-line"> Connection-specific DNS Suffix . : lan</span>
<span class="code-line"> IPv6 Address. . . . . . . . . . . : fd51:c6aa:1df:0:99e6:8496:55c7:733e</span>
<span class="code-line"> IPv6 Address. . . . . . . . . . . : fddb:38c5:4b0a::a32</span>
<span class="code-line"> IPv6 Address. . . . . . . . . . . : fddb:38c5:4b0a:0:99e6:8496:55c7:733e</span>
<span class="code-line"> Temporary IPv6 Address. . . . . . : fd51:c6aa:1df:0:b04a:f9d5:61bd:63e4</span>
<span class="code-line"> Temporary IPv6 Address. . . . . . : fddb:38c5:4b0a:0:8d12:c734:e2f0:8ec8</span>
<span class="code-line"> Link-local IPv6 Address . . . . . : fe80::99e6:8496:55c7:733e%26</span>
<span class="code-line"> IPv4 Address. . . . . . . . . . . : 192.168.50.145</span>
<span class="code-line"> Subnet Mask . . . . . . . . . . . : 255.255.255.0</span>
<span class="code-line"> Default Gateway . . . . . . . . . : fe80::215:5dff:fe0a:a901%26</span>
<span class="code-line"> fe80::215:5dff:fe0a:a907%26</span>
<span class="code-line"> 192.168.50.1</span>
</pre></div>
<p>接下来就像使用一个普通的有 OpenWrt 的路由器一样设置它吧,像是装上 luci 和代理软件什么的。</p>
<p>在所有的设置都妥当以后,除了上面提到的允许管理操作系统共享此网络适配器那个选项以外,
汝还可以考虑设置虚拟机开机启动。</p>
<p>(在“管理-自动启动操作”那里,可以设置成“总是”来让虚拟机在主机启动时自动启动。)</p>
</div>
咱和()的 2020 年?2021-03-11T00:00:00+08:002021-03-11T00:00:00+08:00ホロtag:None,2021-03-11:/life/five_years.html<p>就不要 <del>不合时宜的</del> 问为啥隔了接近三个月才写了…… (?)</p>
<p>以及第四年的总结
<a class="reference external" href="https://matters.news/@kenookamihoro/%E5%92%B1%E5%92%8C-%E7%9A%84-2019-%E5%B9%B4-zdpuAv9K8mhb7NUJ2o4pe9tjgnra82PuVfdpCtjfquAXp5BU1">在咱的 Matters 上。</a></p>
<div class="section" id="id2">
<h2>为啥这一年只写了八篇文章?</h2>
<p>啊这……咱写字的地方越来越分散了啊……</p>
<ul class="simple">
<li><a class="reference external" href="https://blog.horo.moe/">咱的 WordPress 上</a> 还有两篇文章。</li>
<li><a class="reference external" href="https://matters.news/@kenookamihoro">咱的 Matters 上</a> 除了只和 Matters 有关的文章以外,
还有大概十篇文章没写在这里。</li>
</ul>
<img alt="Google Search Console" class="materialboxed responsive-img" src="/images/five_years/google_search_console_2020.png"/>
<p>Google Search Console 的表现,是怎么样呢?</p>
</div>
<div class="section" id="id4">
<h2>这一年……?</h2>
<p>因为众所周知的原因(COVID-19 啦……),于是几乎都是呆在家里, <del>然后被批判一番不务正业……</del>
那就记一下这一年玩过的游戏好了。</p>
<ul class="simple">
<li>DJMax Respect V ,除了正式发售时突然降价引起抢先体验玩家不满和全程联网外加笨蛋反作弊插件以外,
只是 DJMax 这个老字号就能让咱接受前面的大部分缺点了。</li>
<li>女神异闻录5 皇家版,给女神异闻录系列出加强版是 ATLUS 老传统了。</li>
<li>集合啦!动物森友会,成功登上咱 Switch 游戏时间排行第一 …</li></ul></div><p>就不要 <del>不合时宜的</del> 问为啥隔了接近三个月才写了…… (?)</p>
<p>以及第四年的总结
<a class="reference external" href="https://matters.news/@kenookamihoro/%E5%92%B1%E5%92%8C-%E7%9A%84-2019-%E5%B9%B4-zdpuAv9K8mhb7NUJ2o4pe9tjgnra82PuVfdpCtjfquAXp5BU1">在咱的 Matters 上。</a></p>
<div class="section" id="id2">
<h2>为啥这一年只写了八篇文章?</h2>
<p>啊这……咱写字的地方越来越分散了啊……</p>
<ul class="simple">
<li><a class="reference external" href="https://blog.horo.moe/">咱的 WordPress 上</a> 还有两篇文章。</li>
<li><a class="reference external" href="https://matters.news/@kenookamihoro">咱的 Matters 上</a> 除了只和 Matters 有关的文章以外,
还有大概十篇文章没写在这里。</li>
</ul>
<img alt="Google Search Console" class="materialboxed responsive-img" src="/images/five_years/google_search_console_2020.png"/>
<p>Google Search Console 的表现,是怎么样呢?</p>
</div>
<div class="section" id="id4">
<h2>这一年……?</h2>
<p>因为众所周知的原因(COVID-19 啦……),于是几乎都是呆在家里, <del>然后被批判一番不务正业……</del>
那就记一下这一年玩过的游戏好了。</p>
<ul class="simple">
<li>DJMax Respect V ,除了正式发售时突然降价引起抢先体验玩家不满和全程联网外加笨蛋反作弊插件以外,
只是 DJMax 这个老字号就能让咱接受前面的大部分缺点了。</li>
<li>女神异闻录5 皇家版,给女神异闻录系列出加强版是 ATLUS 老传统了。</li>
<li>集合啦!动物森友会,成功登上咱 Switch 游戏时间排行第一。</li>
<li>Project DIVA MEGA39s,咱为什么要买它…… FTDX 加上 DLC 它不香么……</li>
<li>Fluffy Store 和 ATRI -My Dear Moments- ,两部被推荐来看后觉得不错的视觉小说。(所以
fault - SILENCE THE PEDANT 还是没有出)</li>
<li>Untitled Goose Game,其实 2019 年在 PS4 上玩过了,今年借着在 Steam 上发售又玩了一遍。
(然而并没有人一起玩更新的双人模式……)</li>
<li>妄想破绽和原神……一言难尽*2。</li>
<li>Halo: The Master Chief Collection,用手柄坑完了除了 ODST 以外的正常难度剧情,嗯……
至少咱的老笔记本还跑得动。</li>
<li>女神异闻录5 乱战 魅影攻手,第一次录下了全程 <del>然后给友人做素材工具人(?)</del></li>
<li>Cyberpunk 2077,除了分不清是 Bug 还是剧情演出以外还好啦。 <del>这话到底是赞美还是批评……</del></li>
<li>Spice & Wolf VR2, <a class="reference external" href="https://steamcommunity.com/id/048738940/recommended/1348700/">“什麼?你說今天12/10還有2077? 2077能有赫蘿嗎?”</a>
新的动画鉴赏模式虽然短了点……</li>
<li>Stellaris, <del>P社玩家没有一个无辜的……</del></li>
</ul>
<p>当然除了这些以外还有些一直在玩的老游戏,也就是那些音游什么的。PSN 给咱发年度报告的时候去年游玩时间最长的
游戏还是 FTDX ……</p>
<hr class="docutils"/>
<p>剩下的一时想不起来了,就先这样吧。</p>
</div>
Arch Linux 上的 GLNMP2021-03-01T00:00:00+08:002021-03-01T00:00:00+08:00ホロtag:None,2021-03-01:/arch-linux/glemp_on_arch.html<div class="section" id="id1">
<h2>前言</h2>
<p>请允许咱引用一下 <a class="reference external" href="/links.html#lilydjwg">lilydjwg</a> 的一段话:</p>
<blockquote>
我之所以现在记录这事儿,「现在」的原因是,我要在另一个系统上再测试一遍再发布出来,
「记录」的原因是,下一次我就不用想要执行哪些命令了。</blockquote>
<p>所以这篇文章更多是留给咱自己看的,绝对不可能适合所有人(例如万一有人是为了塞给 V2Ray
一类的代理软件用什么的)。</p>
<p>记得 Read the Fine Manual 是汝等的好伙伴就好啦。</p>
<div class="section" id="glnmp">
<h3>那为啥要叫 GLNMP ?</h3>
<p>如果汝会这么问的话,那应该是有听说过 LAMP/LNMP 系统吧,大概就是
Linux,Apache(或者 Nginx),MySQL(现在可能更多在用 MariaDB) 和 PHP(还有可能是
Python 甚至 Perl?)的组合。因为除了此上下文环境中的“Linux”实际上指的是 GNU/Linux 操作系统 …</p></div></div><div class="section" id="id1">
<h2>前言</h2>
<p>请允许咱引用一下 <a class="reference external" href="/links.html#lilydjwg">lilydjwg</a> 的一段话:</p>
<blockquote>
我之所以现在记录这事儿,「现在」的原因是,我要在另一个系统上再测试一遍再发布出来,
「记录」的原因是,下一次我就不用想要执行哪些命令了。</blockquote>
<p>所以这篇文章更多是留给咱自己看的,绝对不可能适合所有人(例如万一有人是为了塞给 V2Ray
一类的代理软件用什么的)。</p>
<p>记得 Read the Fine Manual 是汝等的好伙伴就好啦。</p>
<div class="section" id="glnmp">
<h3>那为啥要叫 GLNMP ?</h3>
<p>如果汝会这么问的话,那应该是有听说过 LAMP/LNMP 系统吧,大概就是
Linux,Apache(或者 Nginx),MySQL(现在可能更多在用 MariaDB) 和 PHP(还有可能是
Python 甚至 Perl?)的组合。因为除了此上下文环境中的“Linux”实际上指的是 GNU/Linux 操作系统。
所以咱就这么叫了。</p>
<hr class="docutils"/>
<p>接下来就从一个刚装好的 Arch Linux 开始了。</p>
</div>
</div>
<div class="section" id="nginx">
<h2>Nginx (先运行起来)</h2>
<p><a class="reference external" href="https://wiki.archlinux.org/index.php/Nginx">https://wiki.archlinux.org/index.php/Nginx</a></p>
<p>Nginx 官方有两个分支, mainline 和 stable。 看名字应该就能知道哪个更新哪个更稳定了。</p>
<p>安装好和启动服务之后,就可以打开 <a class="reference external" href="http://localhost">http://localhost</a> 看看默认的主页了(就那个 Welcome to Nginx 啥的),
当然现在这些肯定不够,所以先把剩下的装上再回来设置了。</p>
</div>
<div class="section" id="mariadb">
<h2>MariaDB</h2>
<p><a class="reference external" href="https://wiki.archlinux.org/index.php/MariaDB">https://wiki.archlinux.org/index.php/MariaDB</a></p>
<p>在 MySQL 被 Orcale 收购之后,一些对 MySQL 的未来表示担心的人发起了 MariaDB 这个项目。到现在越来越多的
WebApp 和 GNU/Linux 发行版都开始(或已经)用 MariaDB 代替 MySQL 了。</p>
<p>在安装完 mariadb 以后记得初始化一下:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1">## 安装 MariaDB 的基础数据</span></span>
<span class="code-line"><span class="c1"># mariadb-install-db --user=mysql --basedir=/usr --datadir=/var/lib/mysql</span></span>
<span class="code-line"><span class="c1">## 启动服务,进行第一次启动的设置,除了设置密码那一步的话基本上都能保持默认。</span></span>
<span class="code-line"><span class="c1">## 像是禁用 root 用户的远程登录,移除默认的 annoymous 用户和移除测试用的数据库和权限啥的。</span></span>
<span class="code-line"><span class="c1"># systemctl start mariadb</span></span>
<span class="code-line"><span class="c1"># mysql_secure_installation</span></span>
<span class="code-line"><span class="c1"># systemctl restart mariadb</span></span>
</pre></div>
<p>如果有需要的话,可以在 /etc/my.cnf.d/ 里修改适合自己的配置,例如:</p>
<div class="highlight"><pre><span class="code-line"><span></span># 让 mysqld 只使用本地 Unix Socket 连接。</span>
<span class="code-line">[mysqld]</span>
<span class="code-line">skip-networking</span>
<span class="code-line"></span>
<span class="code-line"># 默认使用 utf8mb4 编码。</span>
<span class="code-line">[client]</span>
<span class="code-line">default-character-set = utf8mb4</span>
<span class="code-line"></span>
<span class="code-line">[mysqld]</span>
<span class="code-line">collation_server = utf8mb4_unicode_ci</span>
<span class="code-line">character_set_server = utf8mb4</span>
<span class="code-line"></span>
<span class="code-line">[mysql]</span>
<span class="code-line">default-character-set = utf8mb4</span>
</pre></div>
<p>调整好设置以后,可以用 mysql 命令来测试连接:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># mysql -u root -p</span></span>
<span class="code-line">Enter password:</span>
<span class="code-line">Welcome to the MariaDB monitor. Commands end with <span class="p">;</span> or <span class="se">\g</span>.</span>
<span class="code-line">Your MariaDB connection id is <span class="m">3</span></span>
<span class="code-line">Server version: <span class="m">10</span>.5.9-MariaDB Arch Linux</span>
<span class="code-line"></span>
<span class="code-line">Copyright <span class="o">(</span>c<span class="o">)</span> <span class="m">2000</span>, <span class="m">2018</span>, Oracle, MariaDB Corporation Ab and others.</span>
<span class="code-line"></span>
<span class="code-line">Type <span class="s1">'help;'</span> or <span class="s1">'\h'</span> <span class="k">for</span> help. Type <span class="s1">'\c'</span> to clear the current input statement.</span>
<span class="code-line"></span>
<span class="code-line">MariaDB <span class="o">[(</span>none<span class="o">)]</span>></span>
</pre></div>
<p>例如创建一个数据库和用户,然后为刚创建的用户分配刚创建的数据库的所有权限:</p>
<div class="highlight"><pre><span class="code-line"><span></span>MariaDB> CREATE DATABASE mydb<span class="p">;</span></span>
<span class="code-line">MariaDB> CREATE USER <span class="s1">'user'</span>@<span class="s1">'localhost'</span> IDENTIFIED BY <span class="s1">'some_pass'</span><span class="p">;</span></span>
<span class="code-line">MariaDB> GRANT ALL PRIVILEGES ON mydb.* TO <span class="s1">'user'</span>@<span class="s1">'localhost'</span><span class="p">;</span></span>
<span class="code-line">MariaDB> FLUSH PRIVILEGES<span class="p">;</span></span>
<span class="code-line">MariaDB> quit</span>
</pre></div>
</div>
<div class="section" id="php">
<h2>PHP</h2>
<p><a class="reference external" href="https://wiki.archlinux.org/index.php/PHP">https://wiki.archlinux.org/index.php/PHP</a></p>
<p>Arch 习惯是只留最新的版本的,除非官方仓库中别的包在过渡的时候。虽然其它版本也能从 AUR 里装,
但是没有保证就是了……</p>
<p>以及有一些扩展也在仓库里,看汝使用的应用有什么要求就装上吧。</p>
<p>然后就是修改 PHP 的配置文件 (/etc/php/php.ini) 和 PHP-FPM 的配置文件 (/etc/php-fpm.d/)
了,基本上就是修改下上传文件的大小,启用扩展和其它的别的。</p>
</div>
<div class="section" id="let-s-encrypt">
<h2>Let's Encrypt</h2>
<blockquote>
<del>这都 1021 年了还需要人提醒给自己的网站上 TLS ?</del></blockquote>
<p>咱是参考 <a class="reference external" href="https://blog.lilydjwg.me/2018/11/24/apply-certificates-with-let-s-encrypt-verified-with-cloudflare-dns.213810.html">通过 Cloudflare DNS 验证来申请 Let's Encrypt 证书</a>
这篇文章用 Certbot 和 Cloudflare 来验证域名的,汝可能喜欢用像是 acme.sh 之类的别的方法的话,那照着
自己的喜好来的话也没有关系。</p>
</div>
<div class="section" id="id2">
<h2>组合配置</h2>
<blockquote>
DigitalOcean 有个 Nginx 配置文件生成器说不定有用: <a class="reference external" href="https://nginxconfig.io/">https://nginxconfig.io/</a></blockquote>
<p>比较常见的组织 Nginx 配置文件的方法就是用不同的配置文件区分不同的网站,像 /etc/nginx/sites-available
和 /etc/nginx/sites-enabled 这样的。</p>
<p>咱的话,习惯把配置文件中 PHP 和 TLS 的配置再拆出来共用的样子。</p>
<p>PHP 的配置大概像这样:</p>
<div class="highlight"><pre><span class="code-line"><span></span># /etc/nginx/include/php.conf</span>
<span class="code-line">location ~ \.php$ {</span>
<span class="code-line"> # 404</span>
<span class="code-line"> try_files $fastcgi_script_name =404;</span>
<span class="code-line"></span>
<span class="code-line"> # default fastcgi_params</span>
<span class="code-line"> include fastcgi_params;</span>
<span class="code-line"></span>
<span class="code-line"> # fastcgi settings</span>
<span class="code-line"> fastcgi_pass unix:/run/php-fpm/php-fpm.sock;</span>
<span class="code-line"> fastcgi_index index.php;</span>
<span class="code-line"> fastcgi_buffers 8 16k;</span>
<span class="code-line"> fastcgi_buffer_size 32k;</span>
<span class="code-line"></span>
<span class="code-line"> # fastcgi params</span>
<span class="code-line"> fastcgi_param DOCUMENT_ROOT $realpath_root;</span>
<span class="code-line"> fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;</span>
<span class="code-line"> #fastcgi_param PHP_ADMIN_VALUE "open_basedir=$base/:/usr/lib/php/:/tmp/";</span>
<span class="code-line">}</span>
</pre></div>
<p>TLS 的配置大概像这样,推荐参考 <a class="reference external" href="https://wiki.mozilla.org/Security/Server_Side_TLS">MoillaWiki:Server Side TLS</a> ,Mozilla
也有提供一个配置文件生成器的样子,咱目前使用的配置有些差别。</p>
<div class="highlight"><pre><span class="code-line"><span></span># /etc/nginx/include/ssl.conf</span>
<span class="code-line">ssl_protocols TLSv1.2 TLSv1.3;</span>
<span class="code-line">ssl_ciphers 'TLS-CHACHA20-POLY1305-SHA256:TLS-AES-256-GCM-SHA384:TLS-AES-128-GCM-SHA256:TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256';</span>
<span class="code-line">ssl_prefer_server_ciphers on;</span>
<span class="code-line">ssl_ecdh_curve secp384r1; # Requires nginx >= 1.1.0</span>
<span class="code-line">ssl_session_timeout 10m;</span>
<span class="code-line">ssl_session_cache shared:SSL:10m;</span>
<span class="code-line">ssl_session_tickets off; # Requires nginx >= 1.5.9</span>
<span class="code-line">ssl_stapling on; # Requires nginx >= 1.3.7</span>
<span class="code-line">ssl_stapling_verify on; # Requires nginx => 1.3.7</span>
<span class="code-line">add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";</span>
<span class="code-line">add_header X-Frame-Options sameorigin;</span>
<span class="code-line">add_header X-Content-Type-Options nosniff;</span>
<span class="code-line">add_header X-XSS-Protection "1; mode=block";</span>
<span class="code-line">add_header Referrer-Policy "no-referrer";</span>
<span class="code-line">server_tokens off;</span>
<span class="code-line">#add_header Content-Security-Policy "default-src https: ; object-src 'none'";</span>
<span class="code-line">#add_header X-Robots-Tag "none" ;</span>
<span class="code-line">#add_header X-Download-Options "noopen";</span>
<span class="code-line">#add_header X-Permitted-Cross-Domain-Policies "none";</span>
</pre></div>
<p>组合在一起的其中一个例子:</p>
<div class="highlight"><pre><span class="code-line"><span></span>server {</span>
<span class="code-line"> listen 443 ssl http2;</span>
<span class="code-line"> listen [::]:443 ssl http2;</span>
<span class="code-line"> server_name $_server;</span>
<span class="code-line"> include /etc/nginx/include/ssl.conf;</span>
<span class="code-line"> ssl_certificate /etc/letsencrypt/live/$_server/fullchain.pem;</span>
<span class="code-line"> ssl_certificate_key /etc/letsencrypt/live/$_server/privkey.pem;</span>
<span class="code-line"></span>
<span class="code-line"> root /home/horo/www/$_server;</span>
<span class="code-line">}</span>
</pre></div>
<p>在大部分都安排妥当以后,就可以设置让必要的服务在开机时自动启动啦。</p>
<hr class="docutils"/>
<p><del>差点就忘了 reStructuredText 怎么写……</del> ,虽然 Pelican 是有 markdown 支持的。</p>
</div>
如何可能正确的以大部分人可能会接受的方式提出电脑相关的问题2020-09-14T17:00:00+08:002020-09-14T17:00:00+08:00Horotag:None,2020-09-14:/life/ask_technical_questions.html<blockquote>
<p>汝问咱为啥标题起得这么长,那是因为咱不敢保证所有的人都乐于接受这种提问方法啊……</p>
<p>以及似乎能衍生到其它领域?那就靠汝自己斟酌了。</p>
</blockquote>
<p>本文参考了下面几篇文章的观点,某些文章可能正在经常的被提起。</p>
<ul>
<li><a href="https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/master/README-zh_CN.md">提问的智慧</a>,原文作者 Eric S. Raymond,以开放源代码运动(不是自由软件运动,这个的领导者是 Richard Stallman)的提出者和主要领导者为人所知的黑客。本指南将教你如何正确的提问以获得你满意的答案。</li>
<li><a href="https://www.chiark.greenend.org.uk/~sgtatham/bugs-cn.html">如何有效的报告 Bug</a>,以程序员的视角阐述如何提交一份足够准确的 Bug 报告</li>
<li><a href="https://coolshell.cn/articles/10804.html">X-Y 问题</a>,一种常见的令人疑惑的提问方式,至于为啥令人疑惑嘛……</li>
<li><a href="https://kenengba.com/post/3559.html">真的,再这样提问就没人理你了</a>,以提问的智慧的方法提出不一定是电脑相关的问题的方法,大概吧。</li>
</ul>
<h2>提问真的有那么多讲究的地方嘛?</h2>
<p>大多数时候如此,因为有一个大前提:</p>
<blockquote>
<p>“我们(在很大程度上)是自愿的,从繁忙的生活中抽出时间来解答疑惑,而且时常被提问淹没。所以我们无情的滤掉一些话题,特别是拋弃那些看起来像失败者的家伙,以便更高效的利用时间来回答<code>赢家(winner)</code>的问题。”</p>
</blockquote>
<p>大多数人其实都是出于各种志愿目的回答来自不知道何处的提问的,除非……(“我本来想这样拒绝他的,但是他给的钱实在是太多了……”)</p>
<blockquote>
<p>所以 …</p></blockquote><blockquote>
<p>汝问咱为啥标题起得这么长,那是因为咱不敢保证所有的人都乐于接受这种提问方法啊……</p>
<p>以及似乎能衍生到其它领域?那就靠汝自己斟酌了。</p>
</blockquote>
<p>本文参考了下面几篇文章的观点,某些文章可能正在经常的被提起。</p>
<ul>
<li><a href="https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/master/README-zh_CN.md">提问的智慧</a>,原文作者 Eric S. Raymond,以开放源代码运动(不是自由软件运动,这个的领导者是 Richard Stallman)的提出者和主要领导者为人所知的黑客。本指南将教你如何正确的提问以获得你满意的答案。</li>
<li><a href="https://www.chiark.greenend.org.uk/~sgtatham/bugs-cn.html">如何有效的报告 Bug</a>,以程序员的视角阐述如何提交一份足够准确的 Bug 报告</li>
<li><a href="https://coolshell.cn/articles/10804.html">X-Y 问题</a>,一种常见的令人疑惑的提问方式,至于为啥令人疑惑嘛……</li>
<li><a href="https://kenengba.com/post/3559.html">真的,再这样提问就没人理你了</a>,以提问的智慧的方法提出不一定是电脑相关的问题的方法,大概吧。</li>
</ul>
<h2>提问真的有那么多讲究的地方嘛?</h2>
<p>大多数时候如此,因为有一个大前提:</p>
<blockquote>
<p>“我们(在很大程度上)是自愿的,从繁忙的生活中抽出时间来解答疑惑,而且时常被提问淹没。所以我们无情的滤掉一些话题,特别是拋弃那些看起来像失败者的家伙,以便更高效的利用时间来回答<code>赢家(winner)</code>的问题。”</p>
</blockquote>
<p>大多数人其实都是出于各种志愿目的回答来自不知道何处的提问的,除非……(“我本来想这样拒绝他的,但是他给的钱实在是太多了……”)</p>
<blockquote>
<p>所以,你不必在技术上很在行才能吸引我们的注意,但你必须表现出能引导你变得在行的特质 -- 机敏、有想法、善于观察、乐于主动参与解决问题。如果你做不到这些使你与众不同的事情,我们建议你花点钱找家商业公司签个技术支持服务合同,而不是要求黑客个人无偿地帮助你。</p>
</blockquote>
<p>于是换做汝自己来回答的话,下面两种问题汝更倾向于回答哪一种?(假设汝有回答这个问题所需的能力的话):</p>
<ul>
<li>我从 foo 项目找来的源码没法编译。它怎么这么烂?</li>
<li>foo 项目代码在 Nulix 6.2 版下无法编译通过。我读过了 FAQ,但里面没有提到跟 Nulix 有关的问题。这是我编译过程的记录,我有什么做的不对的地方吗?</li>
</ul>
<p>可能不那么显然的,后面的提问者已经指明了环境,也读过了 FAQ,还列出了错误,并且他没有把问题的责任推到别人头上,他的问题值得被关注。</p>
<p>除此之外,对于黑客来说,如果能回答一个有挑战性的问题,或者能激发他们思维的好问题。对他们来说可能就不再是负担,而成了他们的一种乐趣。对黑客而言,"好问题!"是诚挚的大力称赞。(当然放在其它领域里也差不多啦。)</p>
<p>因为时间有限,所以不要活在别人的生活里。也是因为时间有限,于是大家都习惯的去忽略那些不愿思考、或者在发问前不做他们该做的事的人。汝在提问的时候一定不想被这样忽略,对吧?</p>
<blockquote>
<p>如果你决定向我们求助,当然你也不希望被视为失败者,更不愿成为失败者中的一员。能立刻得到快速并有效答案的最好方法,就是像赢家那样提问 -- 聪明、自信、有解决问题的思路,只是偶尔在特定的问题上需要获得一点帮助。</p>
</blockquote>
<h2>在汝遇到问题并决定提出问题之前</h2>
<blockquote>
<p>于是首先汝在什么地方有了麻烦……是呗?</p>
</blockquote>
<p>据完全不可靠的实践发现,大多数的问题都能在这几步方法全运用完之前得到解决……</p>
<h2>尝试阅读硬件或软件的说明文档找到答案</h2>
<p>硬件设计者和开发者遇到的问题大多数时候不会比汝少,有一部分他们曾经遇到的问题可能的解决方法都被他们写进了自己硬件或软件的说明书或其它地方里。</p>
<p>对于硬件的话,最常见的是说明书或者网站上的教学手册以及常见问题解答一类的。</p>
<p>对于常见的的桌面软件的话,可以在菜单中寻找“帮助”菜单,或者去软件的网站查找说明。</p>
<p>例如大多数 macOS 的软件的“帮助”菜单里可以找到部分说明。</p>
<p>如果是有点那么不常见的命令行软件的话,比较常用的获得说明的方法有两种:</p>
<p>一种是在后面加上 <code>--help</code> 再运行,会列出像是可以添加的参数一类的信息。</p>
<blockquote>
<p>部分程序也有可能是 <code>-h</code> 之类的短参数,或者其它别的(例如 Windows 里的 <code>/?</code> )</p>
</blockquote>
<div class="highlight"><pre><span class="code-line"><span></span><code>$ python3 --help</code></span>
<span class="code-line">usage: /usr/local/bin/python3 <span class="o">[</span>option<span class="o">]</span> ... <span class="o">[</span>-c cmd <span class="p">|</span> -m mod <span class="p">|</span> file <span class="p">|</span> -<span class="o">]</span> <span class="o">[</span>arg<span class="o">]</span> ...</span>
<span class="code-line">Options and arguments <span class="o">(</span>and corresponding environment variables<span class="o">)</span>:</span>
<span class="code-line">-b : issue warnings about str<span class="o">(</span>bytes_instance<span class="o">)</span>, str<span class="o">(</span>bytearray_instance<span class="o">)</span></span>
<span class="code-line"> and comparing bytes/bytearray with str. <span class="o">(</span>-bb: issue errors<span class="o">)</span></span>
<span class="code-line">-B : don<span class="err">'</span>t write .pyc files on import<span class="p">;</span> also <span class="nv">PYTHONDONTWRITEBYTECODE</span><span class="o">=</span>x</span>
<span class="code-line">-c cmd : program passed in as string <span class="o">(</span>terminates option list<span class="o">)</span></span>
<span class="code-line">-d : debug output from parser<span class="p">;</span> also <span class="nv">PYTHONDEBUG</span><span class="o">=</span>x</span>
<span class="code-line">-E : ignore PYTHON* environment variables <span class="o">(</span>such as PYTHONPATH<span class="o">)</span></span>
<span class="code-line">-h : print this <span class="nb">help</span> message and <span class="nb">exit</span> <span class="o">(</span>also --help<span class="o">)</span></span>
<span class="code-line"></span>
<span class="code-line">...</span>
<span class="code-line"></span></pre></div>
<p>另一种做法是查阅相应的手册页,这里需要用到 <code>man</code> 命令。最简单的用法像这样:</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>$ man 要查询的命令的名称</code></span>
<span class="code-line"></span></pre></div>
<blockquote>
<p>这个 man 是男人还是 manual 的缩写呢……</p>
</blockquote>
<p>典型的手册页大概像这个样子(还是拿刚才的 python 来举例),这里再加上一些解释?</p>
<blockquote>
<p>实际上 man 会调用系统设置的分页程序来打开手册页(比较常见的是 less),至于 less 的用法嘛……大家可以去查阅 less 的手册页,溜了溜了……</p>
</blockquote>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="n">PYTHON</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="n">PYTHON</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span></code></span>
<span class="code-line"></span>
<span class="code-line"></span>
<span class="code-line"><span class="p">#</span> <span class="err">程序的名字和一行简介</span></span>
<span class="code-line"><span class="n">NAME</span></span>
<span class="code-line"> <span class="n">python</span> <span class="o">-</span> <span class="n">an</span> <span class="n">interpreted</span><span class="p">,</span> <span class="n">interactive</span><span class="p">,</span> <span class="kt">object</span><span class="o">-</span><span class="n">oriented</span> <span class="n">programming</span> <span class="n">language</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="p">#</span> <span class="err">这里的</span> <span class="n">python</span> <span class="err">是一个命令,于是描述它如何运行,以及需要什么样的命令行参数。</span></span>
<span class="code-line"><span class="p">#</span> <span class="err">如果查阅的是函数的手册页,可以看到函数所需的参数,以及哪个头文件包含该函数的定义。</span></span>
<span class="code-line"><span class="n">SYNOPSIS</span></span>
<span class="code-line"> <span class="n">python</span> <span class="o">[</span> <span class="o">-</span><span class="n">B</span> <span class="o">]</span> <span class="o">[</span> <span class="o">-</span><span class="n">b</span> <span class="o">]</span> <span class="o">[</span> <span class="o">-</span><span class="n">d</span> <span class="o">]</span> <span class="o">[</span> <span class="o">-</span><span class="n">E</span> <span class="o">]</span> <span class="o">[</span> <span class="o">-</span><span class="n">h</span> <span class="o">]</span> <span class="o">[</span> <span class="o">-</span><span class="n">i</span> <span class="o">]</span> <span class="o">[</span> <span class="o">-</span><span class="n">I</span> <span class="o">]</span></span>
<span class="code-line"> <span class="o">[</span> <span class="o">-</span><span class="n">m</span> <span class="n">module</span><span class="o">-</span><span class="n">name</span> <span class="o">]</span> <span class="o">[</span> <span class="o">-</span><span class="n">q</span> <span class="o">]</span> <span class="o">[</span> <span class="o">-</span><span class="n">O</span> <span class="o">]</span> <span class="o">[</span> <span class="o">-</span><span class="n">OO</span> <span class="o">]</span> <span class="o">[</span> <span class="o">-</span><span class="n">s</span> <span class="o">]</span> <span class="o">[</span> <span class="o">-</span><span class="n">S</span> <span class="o">]</span> <span class="o">[</span> <span class="o">-</span><span class="n">u</span> <span class="o">]</span></span>
<span class="code-line"> <span class="o">[</span> <span class="o">-</span><span class="n">v</span> <span class="o">]</span> <span class="o">[</span> <span class="o">-</span><span class="n">V</span> <span class="o">]</span> <span class="o">[</span> <span class="o">-</span><span class="n">W</span> <span class="n">argument</span> <span class="o">]</span> <span class="o">[</span> <span class="o">-</span><span class="n">x</span> <span class="o">]</span> <span class="o">[</span> <span class="o">[</span> <span class="o">-</span><span class="n">X</span> <span class="k">option</span> <span class="o">]</span> <span class="o">-</span><span class="err">?</span> <span class="o">]</span></span>
<span class="code-line"> <span class="o">[</span> <span class="o">--</span><span class="n">check</span><span class="o">-</span><span class="n">hash</span><span class="o">-</span><span class="n">based</span><span class="o">-</span><span class="n">pycs</span> <span class="k">default</span> <span class="err">|</span> <span class="n">always</span> <span class="err">|</span> <span class="n">never</span> <span class="o">]</span></span>
<span class="code-line"> <span class="o">[</span> <span class="o">-</span><span class="n">c</span> <span class="n">command</span> <span class="err">|</span> <span class="n">script</span> <span class="err">|</span> <span class="o">-</span> <span class="o">]</span> <span class="o">[</span> <span class="n">arguments</span> <span class="o">]</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="p">#</span> <span class="err">更长的描述</span></span>
<span class="code-line"><span class="n">DESCRIPTION</span></span>
<span class="code-line"> <span class="n">Python</span> <span class="ow">is</span> <span class="n">an</span> <span class="n">interpreted</span><span class="p">,</span> <span class="n">interactive</span><span class="p">,</span> <span class="kt">object</span><span class="o">-</span><span class="n">oriented</span> <span class="n">programming</span> <span class="n">language</span> <span class="n">that</span></span>
<span class="code-line"> <span class="n">combines</span> <span class="n">remarkable</span> <span class="n">power</span> <span class="k">with</span> <span class="n">very</span> <span class="n">clear</span> <span class="n">syntax</span><span class="p">.</span> <span class="k">For</span> <span class="n">an</span> <span class="n">introduction</span> <span class="k">to</span> <span class="n">program</span><span class="o">-</span></span>
<span class="code-line"> <span class="n">ming</span> <span class="ow">in</span> <span class="n">Python</span><span class="p">,</span> <span class="n">see</span> <span class="n">the</span> <span class="n">Python</span> <span class="n">Tutorial</span><span class="p">.</span> <span class="n">The</span> <span class="n">Python</span> <span class="n">Library</span> <span class="n">Reference</span> <span class="n">documents</span></span>
<span class="code-line"> <span class="n">built</span><span class="o">-</span><span class="ow">in</span> <span class="ow">and</span> <span class="n">standard</span> <span class="n">types</span><span class="p">,</span> <span class="n">constants</span><span class="p">,</span> <span class="n">functions</span> <span class="ow">and</span> <span class="n">modules</span><span class="p">.</span> <span class="k">Finally</span><span class="p">,</span> <span class="n">the</span> <span class="n">Python</span></span>
<span class="code-line"> <span class="n">Reference</span> <span class="n">Manual</span> <span class="n">describes</span> <span class="n">the</span> <span class="n">syntax</span> <span class="ow">and</span> <span class="n">semantics</span> <span class="k">of</span> <span class="n">the</span> <span class="n">core</span> <span class="n">language</span> <span class="ow">in</span> <span class="p">(</span><span class="n">per</span><span class="o">-</span></span>
<span class="code-line"> <span class="n">haps</span> <span class="n">too</span><span class="p">)</span> <span class="n">much</span> <span class="n">detail</span><span class="p">.</span> <span class="p">(</span><span class="n">These</span> <span class="n">documents</span> <span class="n">may</span> <span class="n">be</span> <span class="n">located</span> <span class="n">via</span> <span class="n">the</span> <span class="n">INTERNET</span> <span class="n">RESOURCES</span></span>
<span class="code-line"> <span class="n">below</span><span class="err">;</span> <span class="n">they</span> <span class="n">may</span> <span class="n">be</span> <span class="n">installed</span> <span class="k">on</span> <span class="n">your</span> <span class="n">system</span> <span class="ow">as</span> <span class="n">well</span><span class="p">.)</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="p">#</span> <span class="err">可以在命令行下使用的参数以及参数</span></span>
<span class="code-line"><span class="n">COMMAND</span> <span class="n">LINE</span> <span class="n">OPTIONS</span></span>
<span class="code-line"> <span class="o">-</span><span class="n">B</span> <span class="n">Don</span><span class="c">'t write .pyc files on import. See also PYTHONDONTWRITEBYTECODE.</span></span>
<span class="code-line"></span>
<span class="code-line"> <span class="o">-</span><span class="n">b</span> <span class="n">Issue</span> <span class="n">warnings</span> <span class="n">about</span> <span class="n">str</span><span class="p">(</span><span class="n">bytes_instance</span><span class="p">),</span> <span class="n">str</span><span class="p">(</span><span class="n">bytearray_instance</span><span class="p">)</span> <span class="ow">and</span> <span class="n">com</span><span class="o">-</span></span>
<span class="code-line"> <span class="n">paring</span> <span class="n">bytes</span><span class="o">/</span><span class="n">bytearray</span> <span class="k">with</span> <span class="n">str</span><span class="p">.</span> <span class="p">(</span><span class="o">-</span><span class="n">bb</span><span class="p">:</span> <span class="n">issue</span> <span class="n">errors</span><span class="p">)</span></span>
<span class="code-line"></span>
<span class="code-line"> <span class="o">-</span><span class="n">c</span> <span class="n">command</span></span>
<span class="code-line"> <span class="n">Specify</span> <span class="n">the</span> <span class="n">command</span> <span class="k">to</span> <span class="n">execute</span> <span class="p">(</span><span class="n">see</span> <span class="k">next</span> <span class="n">section</span><span class="p">).</span> <span class="n">This</span> <span class="n">terminates</span> <span class="n">the</span></span>
<span class="code-line"> <span class="k">option</span> <span class="n">list</span> <span class="p">(</span><span class="n">following</span> <span class="n">options</span> <span class="n">are</span> <span class="n">passed</span> <span class="ow">as</span> <span class="n">arguments</span> <span class="k">to</span> <span class="n">the</span> <span class="n">command</span><span class="p">).</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="err">(下面其实还有很多的为了节省空间就省掉了……)</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="p">#</span> <span class="err">这一部分是</span> <span class="n">Python</span> <span class="err">的手册页特别的,介绍了解释器的接口</span></span>
<span class="code-line"><span class="n">INTERPRETER</span> <span class="k">INTERFACE</span></span>
<span class="code-line"> <span class="n">The</span> <span class="n">interpreter</span> <span class="k">interface</span> <span class="n">resembles</span> <span class="n">that</span> <span class="k">of</span> <span class="n">the</span> <span class="n">UNIX</span> <span class="n">shell</span><span class="p">:</span> <span class="k">when</span> <span class="n">called</span> <span class="k">with</span> <span class="n">stan</span><span class="o">-</span></span>
<span class="code-line"> <span class="n">dard</span> <span class="n">input</span> <span class="n">connected</span> <span class="k">to</span> <span class="n">a</span> <span class="n">tty</span> <span class="n">device</span><span class="p">,</span> <span class="n">it</span> <span class="n">prompts</span> <span class="k">for</span> <span class="n">commands</span> <span class="ow">and</span> <span class="n">executes</span> <span class="n">them</span></span>
<span class="code-line"> <span class="n">until</span> <span class="n">an</span> <span class="n">EOF</span> <span class="ow">is</span> <span class="n">read</span><span class="err">;</span> <span class="k">when</span> <span class="n">called</span> <span class="k">with</span> <span class="n">a</span> <span class="n">file</span> <span class="n">name</span> <span class="n">argument</span> <span class="ow">or</span> <span class="k">with</span> <span class="n">a</span> <span class="n">file</span> <span class="ow">as</span> <span class="n">stan</span><span class="o">-</span></span>
<span class="code-line"> <span class="n">dard</span> <span class="n">input</span><span class="p">,</span> <span class="n">it</span> <span class="n">reads</span> <span class="ow">and</span> <span class="n">executes</span> <span class="n">a</span> <span class="n">script</span> <span class="n">from</span> <span class="n">that</span> <span class="n">file</span><span class="err">;</span> <span class="k">when</span> <span class="n">called</span> <span class="k">with</span> <span class="o">-</span><span class="n">c</span> <span class="n">com</span><span class="o">-</span></span>
<span class="code-line"> <span class="n">mand</span><span class="p">,</span> <span class="n">it</span> <span class="n">executes</span> <span class="n">the</span> <span class="n">Python</span> <span class="n">statement</span><span class="p">(</span><span class="n">s</span><span class="p">)</span> <span class="n">given</span> <span class="ow">as</span> <span class="n">command</span><span class="p">.</span> <span class="n">Here</span> <span class="n">command</span> <span class="n">may</span> <span class="n">con</span><span class="o">-</span></span>
<span class="code-line"> <span class="n">tain</span> <span class="n">multiple</span> <span class="n">statements</span> <span class="n">separated</span> <span class="n">by</span> <span class="n">newlines</span><span class="p">.</span> <span class="n">Leading</span> <span class="n">whitespace</span> <span class="ow">is</span> <span class="n">significant</span></span>
<span class="code-line"> <span class="ow">in</span> <span class="n">Python</span> <span class="n">statements!</span> <span class="ow">In</span> <span class="n">non</span><span class="o">-</span><span class="n">interactive</span> <span class="n">mode</span><span class="p">,</span> <span class="n">the</span> <span class="n">entire</span> <span class="n">input</span> <span class="ow">is</span> <span class="n">parsed</span> <span class="n">before</span></span>
<span class="code-line"> <span class="n">it</span> <span class="ow">is</span> <span class="n">executed</span><span class="p">.</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="p">#</span> <span class="err">安装的文件和目录</span></span>
<span class="code-line"><span class="n">FILES</span> <span class="ow">AND</span> <span class="n">DIRECTORIES</span></span>
<span class="code-line"> <span class="n">These</span> <span class="n">are</span> <span class="n">subject</span> <span class="k">to</span> <span class="n">difference</span> <span class="n">depending</span> <span class="k">on</span> <span class="n">local</span> <span class="n">installation</span> <span class="n">conventions</span><span class="err">;</span> <span class="err">$</span><span class="p">{</span><span class="n">pre</span><span class="o">-</span></span>
<span class="code-line"> <span class="n">fix</span><span class="p">}</span> <span class="ow">and</span> <span class="err">$</span><span class="p">{</span><span class="n">exec_prefix</span><span class="p">}</span> <span class="n">are</span> <span class="n">installation</span><span class="o">-</span><span class="n">dependent</span> <span class="ow">and</span> <span class="n">should</span> <span class="n">be</span> <span class="n">interpreted</span> <span class="ow">as</span> <span class="k">for</span></span>
<span class="code-line"> <span class="n">GNU</span> <span class="n">software</span><span class="err">;</span> <span class="n">they</span> <span class="n">may</span> <span class="n">be</span> <span class="n">the</span> <span class="n">same</span><span class="p">.</span> <span class="n">The</span> <span class="k">default</span> <span class="k">for</span> <span class="n">both</span> <span class="ow">is</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">local</span><span class="p">.</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="p">#</span> <span class="err">可以设置的环境变量</span></span>
<span class="code-line"><span class="n">ENVIRONMENT</span> <span class="n">VARIABLES</span></span>
<span class="code-line"> <span class="n">PYTHONHOME</span></span>
<span class="code-line"> <span class="n">Change</span> <span class="n">the</span> <span class="n">location</span> <span class="k">of</span> <span class="n">the</span> <span class="n">standard</span> <span class="n">Python</span> <span class="n">libraries</span><span class="p">.</span> <span class="n">By</span> <span class="k">default</span><span class="p">,</span> <span class="n">the</span></span>
<span class="code-line"> <span class="n">libraries</span> <span class="n">are</span> <span class="n">searched</span> <span class="ow">in</span> <span class="err">$</span><span class="p">{</span><span class="n">prefix</span><span class="p">}</span><span class="o">/</span><span class="k">lib</span><span class="o">/</span><span class="n">python</span><span class="o"><</span><span class="n">version</span><span class="o">></span> <span class="ow">and</span> <span class="err">$</span><span class="p">{</span><span class="n">exec_pre</span><span class="o">-</span></span>
<span class="code-line"> <span class="n">fix</span><span class="p">}</span><span class="o">/</span><span class="k">lib</span><span class="o">/</span><span class="n">python</span><span class="o"><</span><span class="n">version</span><span class="o">></span><span class="p">,</span> <span class="n">where</span> <span class="err">$</span><span class="p">{</span><span class="n">prefix</span><span class="p">}</span> <span class="ow">and</span> <span class="err">$</span><span class="p">{</span><span class="n">exec_prefix</span><span class="p">}</span> <span class="n">are</span> <span class="n">installa</span><span class="o">-</span></span>
<span class="code-line"> <span class="n">tion</span><span class="o">-</span><span class="n">dependent</span> <span class="n">directories</span><span class="p">,</span> <span class="n">both</span> <span class="n">defaulting</span> <span class="k">to</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">local</span><span class="p">.</span> <span class="k">When</span> <span class="err">$</span><span class="n">PYTHONHOME</span></span>
<span class="code-line"> <span class="ow">is</span> <span class="k">set</span> <span class="k">to</span> <span class="n">a</span> <span class="k">single</span> <span class="n">directory</span><span class="p">,</span> <span class="n">its</span> <span class="n">value</span> <span class="n">replaces</span> <span class="n">both</span> <span class="err">$</span><span class="p">{</span><span class="n">prefix</span><span class="p">}</span> <span class="ow">and</span></span>
<span class="code-line"> <span class="err">$</span><span class="p">{</span><span class="n">exec_prefix</span><span class="p">}.</span> <span class="k">To</span> <span class="n">specify</span> <span class="n">different</span> <span class="n">values</span> <span class="k">for</span> <span class="n">these</span><span class="p">,</span> <span class="k">set</span> <span class="err">$</span><span class="n">PYTHONHOME</span> <span class="k">to</span></span>
<span class="code-line"> <span class="err">$</span><span class="p">{</span><span class="n">prefix</span><span class="p">}:</span><span class="err">$</span><span class="p">{</span><span class="n">exec_prefix</span><span class="p">}.</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="p">#</span> <span class="err">手册页的作者</span></span>
<span class="code-line"><span class="n">AUTHOR</span></span>
<span class="code-line"> <span class="n">The</span> <span class="n">Python</span> <span class="n">Software</span> <span class="n">Foundation</span><span class="p">:</span> <span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">www</span><span class="p">.</span><span class="n">python</span><span class="p">.</span><span class="n">org</span><span class="o">/</span><span class="n">psf</span><span class="o">/</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="p">#</span> <span class="err">一些在网上的资源的链接</span></span>
<span class="code-line"><span class="n">INTERNET</span> <span class="n">RESOURCES</span></span>
<span class="code-line"> <span class="n">Main</span> <span class="n">website</span><span class="p">:</span> <span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">www</span><span class="p">.</span><span class="n">python</span><span class="p">.</span><span class="n">org</span><span class="o">/</span></span>
<span class="code-line"> <span class="n">Documentation</span><span class="p">:</span> <span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">docs</span><span class="p">.</span><span class="n">python</span><span class="p">.</span><span class="n">org</span><span class="o">/</span></span>
<span class="code-line"> <span class="n">Developer</span> <span class="n">resources</span><span class="p">:</span> <span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">devguide</span><span class="p">.</span><span class="n">python</span><span class="p">.</span><span class="n">org</span><span class="o">/</span></span>
<span class="code-line"> <span class="n">Downloads</span><span class="p">:</span> <span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">www</span><span class="p">.</span><span class="n">python</span><span class="p">.</span><span class="n">org</span><span class="o">/</span><span class="n">downloads</span><span class="o">/</span></span>
<span class="code-line"> <span class="k">Module</span> <span class="nn">repository</span><span class="p">:</span> <span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">pypi</span><span class="p">.</span><span class="n">org</span><span class="o">/</span></span>
<span class="code-line"> <span class="n">Newsgroups</span><span class="p">:</span> <span class="n">comp</span><span class="p">.</span><span class="n">lang</span><span class="p">.</span><span class="n">python</span><span class="p">,</span> <span class="n">comp</span><span class="p">.</span><span class="n">lang</span><span class="p">.</span><span class="n">python</span><span class="p">.</span><span class="n">announce</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="p">#</span> <span class="err">许可协议信息</span></span>
<span class="code-line"><span class="n">LICENSING</span></span>
<span class="code-line"> <span class="n">Python</span> <span class="ow">is</span> <span class="n">distributed</span> <span class="n">under</span> <span class="n">an</span> <span class="n">Open</span> <span class="n">Source</span> <span class="n">license</span><span class="p">.</span> <span class="n">See</span> <span class="n">the</span> <span class="n">file</span> <span class="s">"LICENSE"</span> <span class="ow">in</span> <span class="n">the</span></span>
<span class="code-line"> <span class="n">Python</span> <span class="n">source</span> <span class="n">distribution</span> <span class="k">for</span> <span class="n">information</span> <span class="k">on</span> <span class="n">terms</span> <span class="o">&</span> <span class="n">conditions</span> <span class="k">for</span> <span class="n">accessing</span> <span class="ow">and</span></span>
<span class="code-line"> <span class="n">otherwise</span> <span class="k">using</span> <span class="n">Python</span> <span class="ow">and</span> <span class="k">for</span> <span class="n">a</span> <span class="n">DISCLAIMER</span> <span class="k">OF</span> <span class="n">ALL</span> <span class="n">WARRANTIES</span><span class="p">.</span></span>
<span class="code-line"></span>
<span class="code-line"></span>
<span class="code-line"></span>
<span class="code-line"> <span class="n">PYTHON</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span></span>
<span class="code-line"></span></pre></div>
<p>偶尔汝会在手册页见到 <code>malloc(3)</code> 这样的描述,这表示了特定区块的手册页。在 BSD 和 GNU/Linux 中,手册页通常被分作八个区块:</p>
<blockquote>
<p>1 一般命令
2 系统调用
3 库函数,涵盖C标准函数库
4 特殊文件(通常是/dev中的设备)和驱动程序
5 文件格式和约定
6 游戏和屏保
7 杂项
8 系统管理命令和守护进程</p>
</blockquote>
<p>于是要查阅特定区块的手册页的话,大概是这个样子(例如刚才的 <code>malloc(3)</code> ):</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>$ man <span class="m">3</span> malloc</code></span>
<span class="code-line"></span></pre></div>
<h2>尝试上网搜索找到答案</h2>
<p>有很多的问题也许不是第一次发生,那大抵汝也不会是第一次遇到的家伙。也许有人留下过类似的解决过程,如果汝找到了而且能成功地解决汝目前的问题,那这世界上就可能少了一个蠢问题(?)</p>
<p>可以搜索的地方也有很多,例如汝正在使用的软件或操作系统发行版的网站(如果汝没在上一步试图寻找的话)、论坛(有可能是官方名义的,或者是社区建立的)和邮件列表的存档,或者某个曾经解决过类似问题的家伙留下的文章等等。</p>
<p>至于搜索引擎要咋用,这个实在是太复杂了,咱也只能给出一些建议:</p>
<ul>
<li>选对一个好的搜索引擎就差不多成功了一半,嗯。</li>
<li>把程序提示汝的消息作为搜索关键词可能有奇效,例如 <code>Permission denied (publickey).</code> (当然太长的话可能会被搜索引擎剪掉,于是尝试一下找出关键的部分吧。</li>
<li>如果要自己决定关键词的话,首先不要用提问的方式,比如「我的电脑上不了网怎么办」,要寻找问题的线索,将线索变成关键词去搜索,一个关键词找不到就换另一个。啥?汝连这一步都懒得做?那么汝大抵有足够的资金找一个或者一群人帮汝解决汝现在遇到的问题,这就不在讨论范围内了……</li>
<li>介于现在的硬件和软件都大量使用英语,有时也可以试试用英文搜索。</li>
<li>……</li>
</ul>
<h2>尝试问一下汝身边熟悉的朋友?</h2>
<p>这个有很大一部分是感性原因,因为某个完全不可靠的证据表明,汝身边最亲近的朋友大抵是最能忍受来自汝自己的看着很蠢的问题的。至少会比一无所知的陌生人容忍度大一点点。</p>
<p>不过朋友毕竟也是人,耐性也是有限的。(汝要是来问咱的话大概耐性会更低)于是为了避免发生像是喋血街头一类的惨剧,还是不负责的建议先把功课做一做了再提问。</p>
<h2>天有不测风云?</h2>
<p>不过要是汝已经做过了之前的尝试但是问题还是没解决的话……</p>
<ul>
<li>坐下来放松,然后再来一次(?)。</li>
</ul>
<blockquote>
<p>不要指望几秒钟的 Google 搜索就能解决一个复杂的问题。在向专家求助之前,再阅读一下常见问题文件(FAQ)、放轻松、坐舒服一些,再花点时间思考一下这个问题。相信我们,他们能从你的提问看出你做了多少阅读与思考,如果你是有备而来,将更有可能得到解答。不要将所有问题一股脑拋出,只因你的第一次搜索没有找到答案(或者找到太多答案)</p>
</blockquote>
<ul>
<li>再次思考汝将要提出的问题。有不可靠的统计显示出寻求帮助前汝为解决问题所付出的努力程度和汝获得实质性的帮助的机率很大概率成正相关。</li>
</ul>
<blockquote>
<p>另一方面,表明你愿意在找答案的过程中做点什么是一个非常好的开端。<code>谁能给点提示?</code>、<code>我的这个例子里缺了什么?</code>以及<code>我应该检查什么地方</code>比<code>请把我需要的确切的过程贴出来</code>更容易得到答复。因为你表现出只要有人能指个正确方向,你就有完成它的能力和决心。</p>
</blockquote>
<ul>
<li>再收集一些更详细的信息。例如 POST 画面的提示,主板七划显示器上的字形,软件弹出的提示,汝在之前做了些什么等等。</li>
</ul>
<blockquote>
<p>https://wiki.archlinux.org/index.php/Bug_reporting_guidelines#Gather_useful_information 上也列出了哪些信息可能是有用的。</p>
</blockquote>
<ul>
<li>然后多想一下汝要在哪里提问。</li>
</ul>
<h2>我要在哪里提问?</h2>
<p>在网上比较常见的发问场所,大抵有聊天群组,论坛和邮件列表。不过无论在哪里,下面的建议似乎都非常实用。(但未经过详细的检验)</p>
<ul>
<li>不要在与主题不合的地方贴出汝的问题。例如在绘画群组里提问游戏技巧,多半没人会搭理。</li>
<li>不要在探讨进阶技术问题的论坛张贴非常初级的问题;反之亦然。至于怎么样算进阶怎么样算初级嘛,这个要自己掂量一下了。</li>
<li>不要在太多的不同地方上重复转贴同样的问题。有很大一部分原因是不同的地方有可能都是同一群人(大雾)。</li>
<li>别像机关枪似的一次"扫射"所有的帮助渠道,这就像大喊大叫一样会使人不快。要一个一个地来。</li>
<li>先特定后通用,例如先去特定发行版的论坛或邮件列表中提问,再到程序本身的论坛或邮件列表提问。</li>
<li>有些软件的网站上可能记载有官方支持和提交 Bug 报告的规则,如果有看到的话,照做就是了。</li>
<li>通过论坛或聊天群组来提供使用者支持服务有增长的趋势,电子邮件则大多为项目开发者间的交流而保留。所以最好先在论坛或聊天群组中寻求与该项目相关的协助。</li>
</ul>
<h2>别问蠢问题!以及……</h2>
<p>最常见的蠢问题大概有这么几种,至于为什么这些问题被觉得蠢……</p>
<ul>
<li>我能在哪找到 X 程序或 X 资源?</li>
</ul>
<p>就在咱找到它的地方啊,大笨驴 —— 搜索引擎的那一头。天哪!难道还有人不会用 <a href="http://www.google.com">Google</a> 吗?</p>
<ul>
<li>我怎样用 X 做 Y ?</li>
</ul>
<p>如果汝想解决的是 Y ,提问时别给出可能并不恰当的方法。这种问题说明提问者不但对 X 完全无知,也对 Y 要解决的问题糊涂,还被特定形势禁锢了思维。最好忽略这种人,等他们把问题搞清楚了再说。</p>
<ul>
<li>如何设定我的 shell 提示??</li>
</ul>
<blockquote>
<p>如果汝有足够的智慧提这个问题,汝也该有足够的智慧去 <a href="#RTFM">RTFM</a>,然后自己去找出来。</p>
</blockquote>
<ul>
<li>我可以用 Bass-o-matic 文件转换工具将 AcmeCorp 档案转换为 TeX 格式吗?</li>
</ul>
<blockquote>
<p>试试看就知道了。如果汝有试过的话,汝既知道了答案,也不用浪费我的时间了。</p>
</blockquote>
<ul>
<li>我的{程序/设定/SQL 语句}不工作</li>
</ul>
<blockquote>
<p>这不算是问题吧,咱有更有意思的事要做呢,对汝这还要再问二十句才能知道问题在哪的问题完全提不起劲。</p>
</blockquote>
<p>在看到这类问题的时候,大多数人的反应通常不外如下三种:</p>
<blockquote>
<p>你还有什么要补充的吗?| 真糟糕,希望你能搞定。| 这关我屁事?</p>
</blockquote>
<ul>
<li>我的 Windows 电脑有问题,你能帮我吗?</li>
</ul>
<blockquote>
<p>能啊,扔掉微软的辣鸡,换个像 GNU/Linux 或 BSD 的开放源代码的操作系统吧。</p>
</blockquote>
<p>注意:如果程序有官方 Windows 版本或者与 Windows 有互动(如 Samba),你<strong>可以</strong>问与 Windows 相关的问题, 只是别对问题是由 Windows 操作系统而不是程序本身造成的回复感到惊讶, 因为 Windows 对一般开发者来说实在太烂,这种说法通常都是对的。</p>
<ul>
<li>我的程序不会动了,我认为系统工具 X 有问题</li>
</ul>
<blockquote>
<p>汝完全有可能是第一个注意到被成千上万用户反复使用的系统调用与函数库档案有明显缺陷的家伙,或者汝完全没有根据。</p>
<p>不同凡响的说法需要不同凡响的证据,当汝这样声称的时候,汝大概已经有了清楚而详尽的报告作后盾了吧?</p>
</blockquote>
<ul>
<li>我在安装 Linux(或者 X )时有问题,你能帮我吗?</li>
</ul>
<blockquote>
<p>不能。</p>
<p>咱只有亲自在汝自己的电脑上动手才能找到毛病。要么试试寻求汝附近的 GNU/Linux 使用者群组的实际指导?</p>
</blockquote>
<p>注意:如果安装问题与某 Linux 的发行版有关,在它的邮件列表、论坛或本地使用者群组中提问也许是恰当的。此时,应描述问题的准确细节。在此之前,先用 <code>Linux</code> 和<strong>所有</strong>被怀疑的硬件作关键词仔细搜索。</p>
<ul>
<li>问题:我怎么才能破解 root 帐号/窃取 OP 特权/读别人的邮件呢?</li>
</ul>
<blockquote>
<p>想要这样做,说明了汝是个卑鄙小人;想找个黑客帮忙,说明汝是个不折不扣的大笨驴!</p>
</blockquote>
<p>以及不要问那种看着就很像家庭作业的问题,这些问题很明显要汝自己找到答案。尽管汝也许需要点提示,但不要指望能从别人那里得到完整答案。</p>
<h2>保持一个平和的正确态度</h2>
<ul>
<li>虽然骄傲是不行的,但是也不要走向另一个极端。尽可能清楚地描述背景条件和问题情况,这比低声下气更好地定位了汝自己的位置。</li>
<li>彬彬有礼,多用<code>请</code>和<code>谢谢您的关注</code>,或<code>谢谢你的关照</code>。让大家都知道汝对他们花时间免费提供帮助心存感激。当然这不是汝可以把报告写的粗心又含糊的借口。</li>
</ul>
<h2>使用有意义且描述明确的标题</h2>
<p>在这个领域,卖惨大概是最没有作用的行为之一,宣称<code>紧急</code>极有可能事与愿违:大多数黑客会直接删除无礼和自私地企图即时引起关注的问题。更严重的是,<code>紧急</code>这个字(或是其他企图引起关注的标题)通常会被垃圾信过滤器过滤掉 —— 这样汝所希望能看到汝的问题的人可能永远都看不到汝那看似紧急的问题。</p>
<p>于是来看一下下面的例子:</p>
<blockquote>
<p>救命啊!我的笔记本电脑不能正常显示了!</p>
<p>X.org 6.8.1 的鼠标光标会变形,某牌显卡 MV1005 芯片组。</p>
</blockquote>
<p>现在用上面的想法思考一下哪一个问题更蠢?再小声的说一句,大家都觉得“目标-差异”格式的标题往往最能吸引黑客,因为这样他们马上就能知道汝的环境和遇到的问题。试试看用更聪明的方法改写上面提问的标题?</p>
<h2>用清晰、正确、精准且语法正确的语句仔细组织汝的提问</h2>
<p>从经验中大家得出了一个结论,粗心的提问者通常也会粗心的写程序与思考。(真的如此吗,欢迎来证实或证伪)</p>
<ul>
<li>正确的拼写、标点符号和大小写是很重要的。汝说关注这个很麻烦?那好咱们也觉得思考汝那错词百出的问题很麻烦,于是就不回答了。</li>
<li>如果在非母语的论坛发问,尽管拼写错误之类的会宽容些,但还是不能怠于思考。以及拿不懂回复者使用的语言的话就用英文撰写问题。</li>
<li>清楚的表达汝的问题以及需求。繁忙的人往往厌恶那种漫无边际的空泛提问。</li>
</ul>
<blockquote>
<p>要理解专家们所处的世界,请把专业技能想像为充裕的资源,而回复的时间则是稀缺的资源。你要求他们奉献的时间越少,你越有可能从真正专业而且很忙的专家那里得到解答。</p>
</blockquote>
<ul>
<li>仔细、清楚地描述你的问题或 Bug 的症状。</li>
</ul>
<p>来看看这句话:“我运行了FooApp,它弹出一个警告窗口,我试着关掉它,它就崩溃了。”这种表述并不清晰,用户究竟关掉了哪个窗口?是警告窗口还是整个FooApp程序?如果这样说,“我运行FooApp程序时弹出一个警告窗口,我试着关闭警告窗口,FooApp崩溃了。”这样虽然罗嗦点,但是很清晰不容易产生误解。</p>
<ul>
<li>描述问题发生的环境(机器配置、操作系统、应用程序、以及相关的信息),提供发行版和版本号。</li>
<li>描述在提问前汝是怎样去研究和理解这个问题的。以及确定问题而采取的诊断步骤。</li>
</ul>
<p>简单介绍一下汝来提问之前都做了些什么,<code>我在 Google 中搜过下列句子但没有找到什么有用的东西</code> 之类的反馈也是有用的参考意见。</p>
<ul>
<li>描述最近做过什么可能相关的硬件或软件变更。</li>
</ul>
<blockquote>
<p>问题发生前的一系列操作,往往就是对找出问题最有帮助的线索。因此,你的说明里应该包含你的操作步骤,以及机器和软件的反应,直到问题发生。在命令行处理的情况下,提供一段操作记录(例如运行脚本工具所生成的),并引用相关的若干行(如 20 行)记录会非常有帮助。</p>
</blockquote>
<ul>
<li>尽可能的提供一个可以<code>重现这个问题的可控环境</code>的方法。</li>
</ul>
<blockquote>
<p>报告bug的最好的方法之一是“演示”给程序员看。让程序员站在电脑前,运行他们的程序,指出程序的错误。让他们看着您启动电脑、运行程序、如何进行操作以及程序对您的输入有何反应。</p>
<p>如果您必须报告bug,而此时程序员又不在您身边,那么您就要想办法让bug<em>重现</em>在他们面前。当他们亲眼看到错误时,就能够进行处理了。</p>
<p>确切地告诉程序员您做了些什么。如果是一个图形界面程序,告诉他们您按了哪个按钮,依照什么顺序按的。如果是一个命令行程序,精确的告诉他们您键入了什么命令。您应该尽可能详细地提供您所键入的命令和程序的反应。</p>
</blockquote>
<ul>
<li>如果汝做完前一步后发现整个问题显得太长(特别是复现的方法和样例太过复杂时),尽量将它剪裁得越小越好。</li>
</ul>
<blockquote>
<p>这样做的用处至少有三点。
第一,表现出你为简化问题付出了努力,这可以使你得到回答的机会增加;
第二,简化问题使你更有可能得到<strong>有用</strong>的答案;
第三,在精炼你的 bug 报告的过程中,你很可能就自己找到了解决方法或权宜之计。</p>
</blockquote>
<ul>
<li>除非汝非常、<strong>非常</strong>的有根据(例如有可以证明的测试或者修复的补丁),不要动辄声称找到了 Bug。最好写得像是自己做错了什么。</li>
</ul>
<blockquote>
<p>如果真的有 Bug,你会在回复中看到这点。这样做的话,如果真有 Bug,维护者就会向你道歉,这总比你惹恼别人然后欠别人一个道歉要好一点。</p>
</blockquote>
<ul>
<li>描述目标而不是过程。在一开始就清楚的表示出来汝想做什么,然后再描述问题在哪里。</li>
</ul>
<blockquote>
<p>经常寻求技术帮助的人在心中有个更高层次的目标,而他们在自以为能达到目标的特定道路上被卡住了,然后跑来问该怎么走,但没有意识到这条路本身就有问题。结果要费很大的劲才能搞定。</p>
</blockquote>
<p>所谓的 X-Y Problem 大抵如此,提出这种问题就是在一个根本错误的方向上浪费他人大量的时间和精力。这里有一个来自 CoolShell 的例子:</p>
<blockquote>
<p>Q)问一下大家,我如何得到一个文件的大小<em>
</em>A1) size = <code>ls -l $file | awk ‘{print $5}’</code><em>
</em>Q) 哦,要是这个文件名是个目录呢?<em>
</em>A2) 用du吧<em>
</em>A3) 不好意思,你到底是要文件的大小还是目录的大小?你到底要干什么?<em>
</em>Q) 我想把一个目录下的每个文件的每个块(第一个块有512个字节)拿出来做md5,并且计算他们的大小 ……<em>
</em>A1) 哦,你可以使用dd吧。<em>
</em>A2) dd不行吧。<em>
</em>A3) 你用md5来计算这些块的目的是什么?你究竟想干什么啊?<em>
</em>Q) 其实,我想写一个网盘,对于小文件就直接传输了,对于大文件我想分块做增量同步。<em>
</em>A2) 用rsync啊,你妹!*</p>
</blockquote>
<ul>
<li>描述症状,而不是汝的猜测。(如果汝的推断如此有效的话,那汝还用向别人求助吗?)</li>
</ul>
<blockquote>
<p>因此要确信你原原本本告诉了他们问题的症状,而不是你的解释和理论;让黑客们来推测和诊断。如果你认为陈述自己的猜测很重要,清楚地说明这只是你的猜测,并描述为什么它们不起作用。</p>
<p>针对诊断者而言,这并不是一种怀疑,而只是一种真实而有用的需求,以便让他们看到的是与你看到的原始证据尽可能一致的东西,而不是你的猜测与归纳的结论。所以,大方的展示给我们看吧!</p>
</blockquote>
<ul>
<li>然后去掉无意义的提问句,例如<code>有人能帮我吗?</code>或者<code>这有答案吗?</code>。除非汝想得到这样的回答:<code>没错,有人能帮你</code>或者<code>不,没答案</code>。</li>
</ul>
<h2>使用易于读取且标准的文件格式发送易于回复的问题</h2>
<p>没有人喜欢自找麻烦,难以阅读的问题让人没有阅读的欲望,难于回复的问题让人没有回答的热情。</p>
<p>首先不管在哪里提问,绝对,<strong>永远</strong>不要指望黑客们阅读使用封闭格式编写的文档,像微软公司的 Word 或 Excel 文件等。即便他们能够处理,他们也很厌恶这么做。</p>
<p>如果汝在邮件中提问,下面的建议可以参考:</p>
<ul>
<li>使用纯文字而不是 HTML (<a href="http://archive.birdhouse.org/etc/evilmail.html">关闭 HTML</a> 并不难)。</li>
<li>使用 MIME 附件通常是可以的,前提是真正有内容(譬如附带的源代码或 patch),而不仅仅是邮件程序生成的模板(譬如只是信件内容的拷贝)。</li>
<li>不要发送一段文字只是一行句子但自动换行后会变成多行的邮件(这使得回复部分内容非常困难)。设想你的读者是在 80 个字符宽的终端机上阅读邮件,最好设置你的换行分割点小于 80 字。</li>
<li>但是,对一些特殊的文件<strong>不要</strong>设置固定宽度(譬如日志档案拷贝或会话记录)。数据应该原样包含,让回复者有信心他们看到的是和你看到的一样的东西。</li>
</ul>
<p>如果汝在论坛中提问,下面的建议可以参考:</p>
<ul>
<li>一两个表情符号和彩色文本通常没有问题,但是<strong>不要滥用</strong>。</li>
</ul>
<blockquote>
<p>花哨的彩色文本倾向于使人认为你是个无能之辈。过滥地使用表情符号、色彩和字体会使你看来像个傻笑的小姑娘。这通常不是个好主意,除非你只是对性而不是对答案感兴趣。</p>
</blockquote>
<ul>
<li>别要求通过电子邮件回复。<blockquote>
<p>要求通过电子邮件回复是非常无礼的,除非你认为回复的信息可能比较敏感(有人会为了某些未知的原因,只让你而不是整个论坛知道答案)。如果你只是想在有人回复讨论串时得到电子邮件提醒,可以要求网页论坛发送给你。几乎所有论坛都支持诸如<code>追踪此讨论串</code>、<code>有回复时发送邮件提醒</code>等功能。</p>
</blockquote>
</li>
</ul>
<h2>古老和神圣的传统和它的亲戚 - RTFM 和 STFW</h2>
<blockquote>
<p>有一个古老而神圣的传统:如果你收到<code>RTFM (Read The Fucking Manual)</code>的回应,回答者认为你<strong>应该去读他妈的手册</strong>。当然,基本上他是对的,你应该去读一读。</p>
<p>RTFM 有一个年轻的亲戚。如果你收到<code>STFW(Search The Fucking Web)</code>的回应,回答者认为你<strong>应该到他妈的网上搜索</strong>。那人多半也是对的,去搜索一下吧。(更温和一点的说法是 <strong><a href="http://lmgtfy.com/">Google 是你的朋友</a></strong>!有时也许是别的样式,例如 LMGTFY 的链接或者“本群已和 Google 达成战略合作”等等。)</p>
<p>通常,用这两句之一回答你的人会给你一份包含你需要内容的手册或者一个网址,而且他们打这些字的时候也正在读着。这些答复意味着回答者认为</p>
<ul>
<li><strong>你需要的信息非常容易获得</strong>;</li>
<li><strong>你自己去搜索这些信息比灌给你,能让你学到更多</strong>。</li>
</ul>
<p>你不应该因此不爽;<strong>依照黑客的标准,他已经表示了对你一定程度的关注,而没有对你的要求视而不见</strong>。你应该对他祖母般的慈祥表示感谢。</p>
</blockquote>
<p>其实如果汝有努力的在提问前做好功课的话,应该不会收到这样的回复的吧……</p>
<h2>我得到一个回复,但这是啥?</h2>
<blockquote>
<p><code>看来似乎是 zentry 卡住了;你应该先清除它。</code></p>
</blockquote>
<p>如果汝看不懂回应,别立刻要求对方解释。先像以前试着自己解决问题时那样(利用手册,FAQ,网络,身边的高手),先试着去搞懂他的回应。如果真的需要对方解释,记得表现出汝已经从中学到了点什么。</p>
<blockquote>
<p><code>哦~~~我看过说明了但是只有 -z 和 -p 两个参数中提到了 zentries,而且还都没有清楚的解释如何清除它。你是指这两个中的哪一个吗?还是我看漏了什么?</code></p>
</blockquote>
<h2>我没得到答案,怎么办?</h2>
<blockquote>
<p>如果仍得不到回答,请不要以为我们觉得无法帮助你。有时只是看到你问题的人不知道答案罢了。没有回应不代表你被忽视,虽然不可否认这种差别很难区分。</p>
<p>总的来说,简单的重复张贴问题是个很糟的点子。这将被视为无意义的喧闹。有点耐心,知道你问题答案的人可能生活在不同的时区,可能正在睡觉,也有可能你的问题一开始就没有组织好。</p>
<p>你可以通过其他渠道获得帮助,这些渠道通常更适合初学者的需要。</p>
<p>有许多网上的以及本地的使用者群组,由热情的软件爱好者(即使他们可能从没亲自写过任何软件)组成。通常人们组建这样的团体来互相帮助并帮助新手。</p>
<p>另外,你可以向很多商业公司寻求帮助,不论公司大还是小。别为要付费才能获得帮助而感到沮丧!毕竟,假使你的汽车发动机汽缸密封圈爆掉了 —— 完全可能如此 —— 你还得把它送到修车铺,并且为维修付费。就算软件没花费你一分钱,你也不能强求技术支持总是免费的。</p>
<p>对像是 GNU/Linux 这种大众化的软件,每个开发者至少会对应到上万名使用者。根本不可能由一个人来处理来自上万名使用者的求助电话。要知道,即使你要为这些协助付费,和你所购买的同类软件相比,你所付出的也是微不足道的(通常私有软件的技术支持费用比开放源代码软件的要高得多,且内容也没那么丰富)。</p>
</blockquote>
<h2>我得到了能解决我的问题的答案,然后呢?</h2>
<p>问题解决以后,别忘了感谢拿些帮助过汝的人啦,以及:</p>
<ul>
<li>写一个补充说明,不用太长。这样做的好处不止可以为汝赢得声誉(以及可能在下次提问时尝到甜头),也可能会帮助到未来遇到相似问题的家伙们。</li>
<li>思考一下怎样才能避免他人将来也遇到类似的问题,思考一下写一份文件或加到常见问题(FAQ)中会不会有帮助。如果是的话就将它们发给文档维护者。</li>
</ul>
<blockquote>
<p>在黑客中,这种良好的后继行动实际上比传统的礼节更为重要,也是你如何透过善待他人而赢得声誉的方式,这是非常有价值的资产。</p>
</blockquote>Chromium OS 和 Crostini 初体验2020-05-23T00:00:00+08:002020-05-23T00:00:00+08:00ホロtag:None,2020-05-23:/tech_misc/chromiumos_and_crostini.html
<p><del>日常动机不明瞎折腾……</del></p>
<div class="section" id="chromium-os">
<h2><a class="toc-backref" href="#id6">所以 Chromium OS 是啥?</a></h2>
<blockquote>
<p>Chromium OS是Google Chrome OS的开放源代码开发版本。
自2009年11月19日开始,Chrome OS以Chromium OS为名陆续发布其开发源代码,
并在遵守着BSD授权条款不断有新版本发布,并试图能够提供绝大多数长时间浏览
万维网的用户一个快速、方便且安全的操作系统。</p>
<p>历史上Chromium OS曾经整体是创建在以Linux核心为主的Ubuntu
4.10版本上,而操作系统的的软件包管理系统则是使用Gentoo Linux的Portage。
但是现在实际上只是单纯利用了Gentoo Linux 的 Portage 而独立编译出来的特制化
GNU/Linux 操作系统,而这个系统本身也与 Gentoo Linux 无关。</p>
<p><a class="reference external" href="https://zh.wikipedia.org/zh-cn/Chromium_OS">Wikipedia: Chromium OS</a></p>
</blockquote>
<p><del>愿意的话当作一个核心是 Chromium 浏览器的操作系统也行……</del></p>
<img alt="Chromium OS 大概像这个样子" class="materialboxed responsive-img" src="/images/chromiumos/demo.png"/>
<p>于是 Chromium OS 大概像这个样子(嗯?)</p>
</div>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id7">先有装到硬盘上的 Chromium OS</a></h2>
<p>要安装 …</p></div>
<p><del>日常动机不明瞎折腾……</del></p>
<div class="section" id="chromium-os">
<h2><a class="toc-backref" href="#id6">所以 Chromium OS 是啥?</a></h2>
<blockquote>
<p>Chromium OS是Google Chrome OS的开放源代码开发版本。
自2009年11月19日开始,Chrome OS以Chromium OS为名陆续发布其开发源代码,
并在遵守着BSD授权条款不断有新版本发布,并试图能够提供绝大多数长时间浏览
万维网的用户一个快速、方便且安全的操作系统。</p>
<p>历史上Chromium OS曾经整体是创建在以Linux核心为主的Ubuntu
4.10版本上,而操作系统的的软件包管理系统则是使用Gentoo Linux的Portage。
但是现在实际上只是单纯利用了Gentoo Linux 的 Portage 而独立编译出来的特制化
GNU/Linux 操作系统,而这个系统本身也与 Gentoo Linux 无关。</p>
<p><a class="reference external" href="https://zh.wikipedia.org/zh-cn/Chromium_OS">Wikipedia: Chromium OS</a></p>
</blockquote>
<p><del>愿意的话当作一个核心是 Chromium 浏览器的操作系统也行……</del></p>
<img alt="Chromium OS 大概像这个样子" class="materialboxed responsive-img" src="/images/chromiumos/demo.png"/>
<p>于是 Chromium OS 大概像这个样子(嗯?)</p>
</div>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id7">先有装到硬盘上的 Chromium OS</a></h2>
<p>要安装 Chromium OS 的话,
<a class="reference external" href="https://www.chromium.org/chromium-os/build">可以参照官方的说明自己编译</a> 。
或者也可以捡现成的,例如 <a class="reference external" href="https://chromium.arnoldthebat.co.uk/index.php">https://chromium.arnoldthebat.co.uk/index.php</a></p>
<p>下载来是一个 raw img 映像,用 Rufus / Etcher 甚至 dd 啥的找个 U 盘写进去,
再从 U 盘启动电脑就能试用啦……</p>
<p><del>如果汝和咱一样是捡现成的然后还</del> 想要安装的话,按下 Ctrl + Alt + F2 进入 Developer shell,以 chronos 用户登录。
运行下面的命令就好啦(然而这会把汝选择的硬盘上的所有内容抹掉,小心操作)</p>
<blockquote>
sudo /usr/sbin/chromeos-install --dst /dev/sda</blockquote>
<p>当汝看到 "Please shutdown, remove the USB device, cross your fingers, and reboot."
这一句时就表示安装成功啦,可以重新启动然后拔掉 U 盘啦……</p>
</div>
<div class="section" id="chromium-os-gnu-linux">
<h2><a class="toc-backref" href="#id8">企鹅开采铬铁矿 - Chromium OS 中的 GNU/Linux 容器</a></h2>
<p>Crostini 是 Google的总括术语,用于使 GNU/Linux 应用程序支持易于使用,
并与Chrome操作系统很好地集成。</p>
<p><a class="reference external" href="https://support.google.com/chromebook/answer/9145439">Google 官方的配置指南在这里。</a></p>
<p>要启用 Linux (Beta 版)的话,首先要从设置里把这个选项打开,启动的时候
会下载一定量的文件。</p>
<img alt="启动 Chromium OS 中的 Crostini" class="materialboxed responsive-img" src="/images/chromiumos/crostini_init.png"/>
<p>配置完成之后起动器中会增加一个终端应用,日后安装的有 Desktop Entry 的 GNU/Linux 应用
会自动添加到那个 “Linux 应用” 文件夹里。</p>
<img alt="启动 Chromium OS 中的 Crostini" class="materialboxed responsive-img" src="/images/chromiumos/crostini_launcher.png"/>
<p>刚刚启动的地方也能共享文件夹和 USB 设备给容器:</p>
<img alt="容器设置" class="materialboxed responsive-img" src="/images/chromiumos/crostini_settings.png"/>
<p>不过当然缺少的功能还是有的
( <a class="reference external" href="https://chromium.googlesource.com/chromiumos/docs/+/master/containers_and_vms.md#Missing-Features">依官方的说法的话</a> ):</p>
<ul class="simple">
<li>除了 USB 以外的外部设备</li>
<li>图形加速</li>
<li>硬件加速解码</li>
<li>和输入法(虽然能通过某些奇怪的技巧绕过)</li>
</ul>
<p>因为咱把容器换成 Arch 啦,于是……</p>
<p>在默认的 Debian 容器上安装中文输入法的话可以
<a class="reference external" href="https://noob.tw/chromeos-vscode/">参考这篇文章</a></p>
</div>
<div class="section" id="crostini">
<h2><a class="toc-backref" href="#id9">替换 Crostini 的容器</a></h2>
<p>因为 Crostini 其实就是一个定制的带 LXC/LXD 的容器(大概吧,要是咱说
错了的话麻烦给咱一个改正的机会……),要把默认的 Debian 容器换掉也是比较容易的(嗯?)</p>
<p>想换成 Fedora 的话 <a class="reference external" href="https://asaba.sakuragawa.moe/2019/06/%E5%9C%9F%E8%A3%BD%E9%9B%99%E7%B3%BB%E7%B5%B1-chromebook-%E4%BD%BF%E7%94%A8%E9%AB%94%E9%A9%97%E8%88%87%E8%B8%A9%E5%9D%91/">可以参考这篇文章。</a></p>
<p>想和咱一样换成 Arch 的话可以 <a class="reference external" href="https://wiki.archlinux.org/index.php/Chrome_OS_devices/Crostini">参考 ArchWiki 的那篇文章。</a>
具体的操作大致如下:</p>
<p>按 Ctrl + Alt + T 打开 Crosh (Chromium OS 在 Chromium 里的 shell),
然后:</p>
<blockquote>
vmc container termina arch <a class="reference external" href="https://us.images.linuxcontainers.org">https://us.images.linuxcontainers.org</a> archlinux/current</blockquote>
<p>这个命令运行完后肯定会因为某个错误失败:</p>
<div class="highlight"><pre><span class="code-line"><span></span>Error: routine at frontends/vmc.rs:403 `container_setup_user(vm_name,</span>
<span class="code-line">user_id_hash,container_name,username)` failed: timeout while waiting</span>
<span class="code-line">for signal</span>
</pre></div>
<p>不要方(慌?)。在刚才的 crosh 里打开 Crostini 的容器里的 Shell :</p>
<div class="highlight"><pre><span class="code-line"><span></span>crosh> vsh termina</span>
<span class="code-line"><span class="o">(</span>termina<span class="o">)</span> chronos@localhost ~ $</span>
</pre></div>
<p>列出容器列表(可能需要几分钟才能看到刚建立的容器)</p>
<blockquote>
lxc list</blockquote>
<p>启动新建立的 Arch Linux 容器,以及在容器里打开一个 Shell:</p>
<blockquote>
<p>lxc start arch</p>
<p>lxc exec arch -- bash</p>
</blockquote>
<p>在 Arch Linux 容器的 Shell 里需要完成这些操作:</p>
<ul class="simple">
<li>创建用户(UID 1000 那位),以及修改 sudoers 配置(记得用 visudo)。</li>
<li>为了和 Chroium OS 的集成,安装 wayland xorg-server-xwayland 包,以及从
AUR 安装 cros-container-guest-tools-git 。记得启动相应的服务。</li>
</ul>
<div class="highlight"><pre><span class="code-line"><span></span>$ systemctl --user <span class="nb">enable</span> --now sommelier@0 sommelier-x@0 sommelier@1 sommelier-x@1</span>
</pre></div>
<ul class="simple">
<li>可以的话装些别的喜欢的,像是中文字体或者编译工具什么的。(就像新装一个 Arch 一样啦)</li>
</ul>
<p>最后在 Termina 的 Shell 里把新建的容器的名称改回 penguin (lxc rename arch penguin),
再重新启动容器。应该就能在 Chromium OS 起动器的终端里启动 Arch Linux 容器啦。</p>
<div class="section" id="fcitx">
<h3><a class="toc-backref" href="#id10">利用奇怪的技巧增加输入法支持(fcitx 啦)</a></h3>
<p>首先把 fcitx 、相应的输入法模块(偷懒的话就 fcitx-im)和输入法(例如 fcitx-rime)
装上。然后用配置工具(例如 fcitx-configtool)或者编辑配置文件的方法设置好输入方案。
(以及记得换个组合键,原来的 Ctrl + Space 已经被 Chromium 的输入法切换抢了狸……)</p>
<p>然后编辑 /etc/systemd/user/cros-garcon.service.d/cros-garcon-override.conf
文件,加上相应的环境变量:</p>
<div class="highlight"><pre><span class="code-line"><span></span>Environment="GTK_IM_MODULE=fcitx"</span>
<span class="code-line">Environment="QT_IM_MODULE=fcitx"</span>
<span class="code-line">Environment="XMODIFIERS=@im=fcitx"</span>
</pre></div>
<p>编辑 ~/.sommelierrc ,让容器在启动时运行 fcitx:</p>
<div class="highlight"><pre><span class="code-line"><span></span>/usr/bin/fcitx-autostart</span>
</pre></div>
<p>然后重新启动一下容器,是不是能在 Linux 应用里输入中文啦?</p>
<img alt="就像这样" class="materialboxed responsive-img" src="/images/chromiumos/crostini_ime.png"/>
<p>但是不知道为啥 Telegram Desktop 还是不吃这一套(emmmm)</p>
</div>
<div class="section" id="chromium">
<h3><a class="toc-backref" href="#id11">从 Chromium 访问容器的服务</a></h3>
<p>如果容器里的服务监听了 0.0.0.0 的话,在 Chromium 里可以通过
访问 penguin.linux.test 访问到。</p>
<img alt="就像这样" class="materialboxed responsive-img" src="/images/chromiumos/crostini_remote.png"/>
<p>没错这篇文章就是在这台 ”Chromebook“ 上写出来的……</p>
</div>
</div>
<div class="section" id="chromium-os-chrome-os">
<h2><a class="toc-backref" href="#id12">蓝色洗彩色(大雾) - 为 Chromium OS 加入 Chrome OS 功能</a></h2>
<p>和 Chromium OS 相比,Chrome OS 有 Google Play 支持,可以运行 Play 商店上的应用。
以及可以使用 Google 账户连接 Android 设备完成一些像是通过手机收发短信或者 Chromebook
打开手机热点之类的操作。</p>
<p>汝要是来了兴趣的话,
<del>那直接去买台 Chromebook 啊……</del> (笑)</p>
<p>如果只是想拿来尝试一下的话,有个名字叫做
<a class="reference external" href="https://github.com/imperador/chromefy">Chromefy (也叫 Project Croissant)</a>
的项目可以把 Chrome OS 的组件塞进一个 Chromium OS 映像里面。具体的操作方法去看他们的
README 啊 ……</p>
<p>咱是试过一次之后发现运行 Android 应用时 Core m5 不太能 Hold 的住就回去 Chromium OS
啦。</p>
</div>
Windows Subsystem for Linux + DistroLauncher2020-05-15T00:00:00+08:002020-05-15T00:00:00+08:00ホロtag:None,2020-05-15:/arch-linux/wsl_with_distro_launcher.html<p>利用 DistroLauncher 在 WSL 上运行自己喜欢的 GNU/Linux 发行版,
,例如还是咱喜欢的 Arch 🌝</p>
<div class="section" id="windows-subsystem-for-linux">
<h2>复习(?):Windows Subsystem for Linux 是个啥玩意?</h2>
<p>从 Windows 10 Insider Preview 开始,加入了 Windows Subsystem for Linux (适用于 Linux 的 Windows 子系统) 功能.</p>
<p>Windows Subsystem for Linux(简称WSL)是一个为在Windows 10上能够原生运行 Linux 二
进制可执行文件(ELF 格式)的兼容层。
它是由微软与 Canonical 公司合作开发,目标是使纯正的 …</p></div><p>利用 DistroLauncher 在 WSL 上运行自己喜欢的 GNU/Linux 发行版,
,例如还是咱喜欢的 Arch 🌝</p>
<div class="section" id="windows-subsystem-for-linux">
<h2>复习(?):Windows Subsystem for Linux 是个啥玩意?</h2>
<p>从 Windows 10 Insider Preview 开始,加入了 Windows Subsystem for Linux (适用于 Linux 的 Windows 子系统) 功能.</p>
<p>Windows Subsystem for Linux(简称WSL)是一个为在Windows 10上能够原生运行 Linux 二
进制可执行文件(ELF 格式)的兼容层。
它是由微软与 Canonical 公司合作开发,目标是使纯正的 Ubuntu 映像能下载和解压到用户的
本地计算机,并且映像内的工具和实用工具能在此子系统上原生运行。</p>
<p>时光荏苒, WSL 本身也有了第二次演进。
最初的 WSL 提供了一个微软开发的 Linux 兼容内核接口(不包含Linux代码),来自 Ubuntu
的用户模式二进制文件在其上运行。</p>
<p>WSL 2 中的 Linux 内核是根据最新的稳定版分支(基于 kernel.org 上提供的源代码)在内部
构建的。此内核专门针对 WSL 2 进行了优化。 (汝大概可以当作 M$ 专门整了个 Linux 内核
然后再塞进一个专门的虚拟机里来运行 WSL 和下面的一堆发行版)。</p>
<p>有关 WSL 1 和 2 的区别可以看 <a class="reference external" href="https://docs.microsoft.com/zh-cn/windows/wsl/compare-versions">M$ 官方的对比图。</a></p>
<p>WSL 的具体应用就是 Bash on Ubuntu on Windows 啦,在 Windows 上实现了一个 Ubuntu 子
系统。(当然后面也支持了几个别的发行版)</p>
</div>
<div class="section" id="id1">
<h2>开始之前</h2>
<p>这不是一篇教授如何使用 WSL 的教程,所以汝应该先把 WSL 装上,然后有一个可用的发行版。</p>
<p>接下来去把 Visual Studio 装上(担心空间不够就只先安装一个编辑器,
接下来打开 DistroLuncher 的时候应该会提醒汝装剩下的)</p>
<p>接着把 <a class="reference external" href="https://github.com/Microsoft/WSL-DistroLauncher">DistroLauncher</a>
下载(或者克隆下来),在 Visual Studio 里打开解决方案。</p>
</div>
<div class="section" id="tarball">
<h2>准备发行版 tarball</h2>
<blockquote>
考虑到 Microsoft Store 里有好几个打包好的发行版了(像是 Ubuntu/Debian/Fedora/
openSUSE 啥的),咱还是拿咱自己中意的 Arch 举例好了。</blockquote>
<p><a class="reference external" href="https://wiki.archlinux.org/index.php/Install_Arch_Linux_from_existing_Linux">以及可以参考 ArchWiki 上从现有 GNU/Linux 发行版安装的那一节。</a></p>
<p>然后用汝手上现有的 WSL 发行版来完成接下来的操作。(咱个人比较中意 Debian)</p>
<p>首先下载 Bootstrap 用的 tarball ,并把它解压到哪里去。(例如 /tmp 或者 /root )</p>
<blockquote>
# tar xzf <path-to-bootstrap-image>/archlinux-bootstrap-*-x86_64.tar.gz</blockquote>
<p>用文字编辑器打开 /root.x86_64/etc/pacman.d/mirrorlist ,选取一个镜像仓库。</p>
<p>如果汝所使用的发行版有 Bash 4,而且 unshared 支持 --fork 和 --pid 选项的话,可以
直接用 tarball 里面的 arch-chroot 命令进入 chroot 环境:</p>
<div class="highlight"><pre><span class="code-line"><span></span># 为了避免 error: could not determine cachedir mount point /var/cache/</span>
<span class="code-line"> pacman/pkg 错误,要把 tarball 的目录原地绑定挂载一遍。</span>
<span class="code-line"> (当然汝也可以通过修改 /etc/pacman.conf 关掉安装前的剩余空间检查来绕开</span>
<span class="code-line"> 这个问题,不过不推荐就是了……)</span>
<span class="code-line"># mount --bind /tmp/root.x86_64 /tmp/root.x86_64</span>
<span class="code-line"># /tmp/root.x86_64/bin/arch-chroot /tmp/root.x86_64/</span>
</pre></div>
<p>不然传统的方法也是能用的,例如:</p>
<div class="highlight"><pre><span class="code-line"><span></span># mount --bind /tmp/root.x86_64 /tmp/root.x86_64</span>
<span class="code-line"># cd /tmp/root.x86_64</span>
<span class="code-line"># cp /etc/resolv.conf etc</span>
<span class="code-line"># mount -t proc /proc proc</span>
<span class="code-line"># mount --make-rslave --rbind /sys sys</span>
<span class="code-line"># mount --make-rslave --rbind /dev dev</span>
<span class="code-line"># mount --make-rslave --rbind /run run</span>
<span class="code-line"># chroot /tmp/root.x86_64 /bin/bash</span>
</pre></div>
<p>初始化一下 pacman 的密钥环:</p>
<blockquote>
<p># pacman-key --init</p>
<p># pacman-key --populate archlinux</p>
</blockquote>
<p>更新,和安装一些别的软件包,看汝自己的需要啦(--needed 选项会跳过已是最新的
软件包而不是重新安装它们):</p>
<blockquote>
# pacman -Syu base base-devel nano --needed</blockquote>
<p>如果有需要的话,汝也可以在这个时候干些别的,例如修改 /etc/sudoers 或者把 linux
包卸载掉之类的 <del>(反正也用不上嘛……)</del></p>
<p>接着把修改好的 tarball 打包:</p>
<blockquote>
# tar --numeric-owner -cvzf /path/to/your/arch.tar.gz /tmp/root.x86_64/</blockquote>
<p>然后把 tarball 复制到汝的 DistroLauncher 下面备用,名字起作 install.tar.gz 。</p>
<ul class="simple">
<li>比较新的 Windows Insider Preview 的话能通过文件资源管理器直接访问 WSL 的
文件系统,大概像这个样子:</li>
</ul>
<img alt="WSL on Windows" class="materialboxed responsive-img" src="/images/WSL_Arch/view_wsl_filesystem_windows.jpg"/>
<ul>
<li><p class="first">不然的话,在 WSL 里复制出来也是 OK 的:</p>
<blockquote>
<p># cp arch.tar.gz /mnt/c/Users/Horo/source/repos/WSL-DistroLauncher/x64/install.tar.gz</p>
</blockquote>
</li>
</ul>
</div>
<div class="section" id="id2">
<h2>修改 DistroLauncher</h2>
<p>在 Visual Studio 里打开 DistroLauncher-Appx/MyDistro.appxmanifest , 、
修改一些基本属性(像是名字啥的)。不过别忘了在 Packaging 那里选择一个
打包用的测试证书(不管是现成的还是临时创建一个都 OK)</p>
<img alt="Packaging in Manifest" class="materialboxed responsive-img" src="/images/WSL_Arch/distrolauncher_manifest.jpg"/>
<p>打开 Launcher 下面的 DistributionInfo.h ,修改一些和汝的发行版相关的信息:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="k">namespace</span> <span class="n">DistributionInfo</span></span>
<span class="code-line"><span class="p">{</span></span>
<span class="code-line"> <span class="c1">// The name of the distribution. This will be displayed to the user via</span></span>
<span class="code-line"> <span class="c1">// wslconfig.exe and in other places. It must conform to the following</span></span>
<span class="code-line"> <span class="c1">// regular expression: ^[a-zA-Z0-9._-]+$</span></span>
<span class="code-line"> <span class="c1">//</span></span>
<span class="code-line"> <span class="c1">// WARNING: This value must not change between versions of your app,</span></span>
<span class="code-line"> <span class="c1">// otherwise users upgrading from older versions will see launch failures.</span></span>
<span class="code-line"> <span class="c1">// 在 WSL 中区别汝的发行版的名称,如果汝有计划分发自己制作的发行版,记得之后</span></span>
<span class="code-line"> <span class="c1">// 不能修改它。</span></span>
<span class="code-line"> <span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">wstring</span> <span class="n">Name</span> <span class="o">=</span> <span class="sa">L</span><span class="s">"Arch"</span><span class="p">;</span></span>
<span class="code-line"></span>
<span class="code-line"> <span class="c1">// The title bar for the console window while the distribution is installing.</span></span>
<span class="code-line"> <span class="c1">// 在运行时命令提示符窗口上方的标题。</span></span>
<span class="code-line"> <span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">wstring</span> <span class="n">WindowTitle</span> <span class="o">=</span> <span class="sa">L</span><span class="s">"Arch Linux"</span><span class="p">;</span></span>
<span class="code-line"></span>
<span class="code-line"> <span class="c1">// 下面两个函数在 DistributionInfo.cpp 里,默认是适合类 Ubuntu 系统的,</span></span>
<span class="code-line"> <span class="c1">// 稍后也会修改。</span></span>
<span class="code-line"></span>
<span class="code-line"> <span class="c1">// Create and configure a user account.</span></span>
<span class="code-line"> <span class="c1">// 初始化时创建新用户的函数。</span></span>
<span class="code-line"> <span class="kt">bool</span> <span class="nf">CreateUser</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">wstring_view</span> <span class="n">userName</span><span class="p">);</span></span>
<span class="code-line"></span>
<span class="code-line"> <span class="c1">// Query the UID of the user account.</span></span>
<span class="code-line"> <span class="c1">// 查询 UNIX 用户 ID 的函数</span></span>
<span class="code-line"> <span class="n">ULONG</span> <span class="nf">QueryUid</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">wstring_view</span> <span class="n">userName</span><span class="p">);</span></span>
<span class="code-line"><span class="p">}</span></span>
</pre></div>
<p>打开 Launcher 下面的 DistributionInfo.cpp ,接着修改和汝的发行版相关的信息:
(关键大概就是上面有提到的那个 CreateUser 函数)</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="kt">bool</span> <span class="n">DistributionInfo</span><span class="o">::</span><span class="n">CreateUser</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">wstring_view</span> <span class="n">userName</span><span class="p">)</span></span>
<span class="code-line"><span class="p">{</span></span>
<span class="code-line"> <span class="c1">// 创建用户账户的函数。</span></span>
<span class="code-line"> <span class="n">DWORD</span> <span class="n">exitCode</span><span class="p">;</span></span>
<span class="code-line"> <span class="c1">// std::wstring commandLine = L"/usr/sbin/adduser --quiet --gecos '' ";</span></span>
<span class="code-line"> <span class="c1">// Arch 这边没有 adduser ,所以用 useradd 和 passwd 代替。</span></span>
<span class="code-line"> <span class="c1">// 记得 commandLine 是要和用户名拼起来的,所以最后面要有个空格。</span></span>
<span class="code-line"> <span class="n">std</span><span class="o">::</span><span class="n">wstring</span> <span class="n">commandLine</span> <span class="o">=</span> <span class="sa">L</span><span class="s">"/usr/bin/useradd -m -s /bin/bash "</span><span class="p">;</span></span>
<span class="code-line"> <span class="n">commandLine</span> <span class="o">+=</span> <span class="n">userName</span><span class="p">;</span></span>
<span class="code-line"> <span class="n">HRESULT</span> <span class="n">hr</span> <span class="o">=</span> <span class="n">g_wslApi</span><span class="p">.</span><span class="n">WslLaunchInteractive</span><span class="p">(</span><span class="n">commandLine</span><span class="p">.</span><span class="n">c_str</span><span class="p">(),</span> <span class="nb">true</span><span class="p">,</span> <span class="o">&</span><span class="n">exitCode</span><span class="p">);</span></span>
<span class="code-line"></span>
<span class="code-line"> <span class="n">commandLine</span> <span class="o">=</span> <span class="sa">L</span><span class="s">"/usr/bin/passwd "</span><span class="p">;</span></span>
<span class="code-line"> <span class="n">commandLine</span> <span class="o">+=</span> <span class="n">userName</span><span class="p">;</span></span>
<span class="code-line"> <span class="n">hr</span> <span class="o">=</span> <span class="n">g_wslApi</span><span class="p">.</span><span class="n">WslLaunchInteractive</span><span class="p">(</span><span class="n">commandLine</span><span class="p">.</span><span class="n">c_str</span><span class="p">(),</span> <span class="nb">true</span><span class="p">,</span> <span class="o">&</span><span class="n">exitCode</span><span class="p">);</span></span>
<span class="code-line"> <span class="k">if</span> <span class="p">((</span><span class="n">FAILED</span><span class="p">(</span><span class="n">hr</span><span class="p">))</span> <span class="o">||</span> <span class="p">(</span><span class="n">exitCode</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">))</span> <span class="p">{</span></span>
<span class="code-line"> <span class="k">return</span> <span class="nb">false</span><span class="p">;</span></span>
<span class="code-line"> <span class="p">}</span></span>
<span class="code-line"></span>
<span class="code-line"> <span class="c1">// 把用户添加进合适的组中,这个也要看不同的发行版调整。</span></span>
<span class="code-line"> <span class="c1">// commandLine = L"/usr/sbin/usermod -aG adm,cdrom,sudo,dip,plugdev ";</span></span>
<span class="code-line"> <span class="n">commandLine</span> <span class="o">=</span> <span class="sa">L</span><span class="s">"/usr/bin/usermod -aG wheel "</span><span class="p">;</span></span>
<span class="code-line"> <span class="n">commandLine</span> <span class="o">+=</span> <span class="n">userName</span><span class="p">;</span></span>
<span class="code-line"> <span class="n">hr</span> <span class="o">=</span> <span class="n">g_wslApi</span><span class="p">.</span><span class="n">WslLaunchInteractive</span><span class="p">(</span><span class="n">commandLine</span><span class="p">.</span><span class="n">c_str</span><span class="p">(),</span> <span class="nb">true</span><span class="p">,</span> <span class="o">&</span><span class="n">exitCode</span><span class="p">);</span></span>
<span class="code-line"> <span class="k">if</span> <span class="p">((</span><span class="n">FAILED</span><span class="p">(</span><span class="n">hr</span><span class="p">))</span> <span class="o">||</span> <span class="p">(</span><span class="n">exitCode</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">))</span> <span class="p">{</span></span>
<span class="code-line"></span>
<span class="code-line"> <span class="c1">// 如果前面的两条命令失败的话,如何删除用户?</span></span>
<span class="code-line"> <span class="c1">// commandLine = L"/usr/sbin/deluser ";</span></span>
<span class="code-line"> <span class="n">commandLine</span> <span class="o">=</span> <span class="sa">L</span><span class="s">"/usr/bin/userdel "</span><span class="p">;</span></span>
<span class="code-line"> <span class="n">commandLine</span> <span class="o">+=</span> <span class="n">userName</span><span class="p">;</span></span>
<span class="code-line"> <span class="n">g_wslApi</span><span class="p">.</span><span class="n">WslLaunchInteractive</span><span class="p">(</span><span class="n">commandLine</span><span class="p">.</span><span class="n">c_str</span><span class="p">(),</span> <span class="nb">true</span><span class="p">,</span> <span class="o">&</span><span class="n">exitCode</span><span class="p">);</span></span>
<span class="code-line"> <span class="k">return</span> <span class="nb">false</span><span class="p">;</span></span>
<span class="code-line"> <span class="p">}</span></span>
<span class="code-line"></span>
<span class="code-line"> <span class="k">return</span> <span class="nb">true</span><span class="p">;</span></span>
<span class="code-line"><span class="p">}</span></span>
</pre></div>
<p>如果汝有意愿换个图标的话,把图标放进 /images 文件夹里。</p>
<p>编辑 DistroLauncher-Appx/DistroLauncher-Appx.vcxproj 文件,修改汝的发行版
的可执行文件的名称(例如 arch.exe ?)</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="nt"><PropertyGroup</span> <span class="na">Label=</span><span class="s">"Globals"</span><span class="nt">></span></span>
<span class="code-line"> ...</span>
<span class="code-line"> <span class="nt"><ProjectName></span>mydistro<span class="nt"></ProjectName></span></span>
<span class="code-line"><span class="nt"></PropertyGroup></span></span>
</pre></div>
<p>检查 DistroLauncher-Appx/MyDistro.appxmanifest 文件,确保……</p>
<ul class="simple">
<li><desktop:ExecutionAlias Alias="mydistro.exe" /> 是汝刚刚决定的名字,例如
<desktop:ExecutionAlias Alias="arch.exe" /></li>
<li>以及每一个 Executable 的值也是那个名字,例如
<Application Id="mydistro" Executable="arch.exe" EntryPoint="Windows.FullTrustApplication"></li>
</ul>
</div>
<div class="section" id="id3">
<h2>构建和测试</h2>
<p>用 Visual Studio 的“部署解决方案”生成 Appx:</p>
<img alt="部署解决方案" class="materialboxed responsive-img" src="/images/WSL_Arch/distrolauncher_deploy.jpg"/>
<p>假如一切顺利的话,新的应用会出现在汝的开始菜单里面:</p>
<img alt="新的应用会出现在汝的开始菜单里面" class="materialboxed responsive-img" src="/images/WSL_Arch/distrolauncher_startmenu.jpg"/>
<p>打开然后创建 UNIX 用户试一下?</p>
<img alt="效果?" class="materialboxed responsive-img" src="/images/WSL_Arch/distrolauncher_result.jpg"/>
</div>
切点洋葱 - 搭建一个洋葱服务2020-05-04T00:00:00+08:002020-05-04T00:00:00+08:00ホロtag:None,2020-05-04:/tech_misc/more_onion_to_web.html<p><del>“如果你愿意一层一层剥开我的心……”</del></p>
<div class="section" id="onion-service">
<h2>所以洋葱服务(Onion Service)是啥?</h2>
<blockquote>
洋葱服务 (Onion Service ,旧名为“隐身服务/隐藏服务/ Hidden Service”)
是一种只能透过洋葱路由网络访问的网络服务 (例如网站)。</blockquote>
</div>
<div class="section" id="id2">
<h2>那么有人为啥要使用洋葱服务呢?</h2>
<ul class="simple">
<li>洋葱服务在 Tor 网络中传递,因此可以隐藏服务器的真实地址(例如 IP 地址和地理位置等等)。</li>
<li>Tor 用户与洋葱服务之间所有的流量都是端到端加密的,所以汝不必担心像没有 HTTPS 这样的问题。</li>
<li>洋葱服务的网址是为自动生成,因此网站的架设者或管理员无需另行购买网络域名。其网址皆是以 .onion 结尾的,
这样的设计可以让洋葱路由系统确保所有网络连接都通往正确的站点,并且其连接数据未被窜改。</li>
</ul>
<p>访问一个洋葱服务网站时,除了一般 Tor 网络中会经过的节点以外,还会额外通过若干个中继。
(图上的是 DuckDuckGo 提供的洋葱服务 <a class="reference external" href="https://3g2upl4pq6kufc4m.onion/">https://3g2upl4pq6kufc4m.onion/</a> )</p>
<img alt="访问一个洋葱服务网站时" class="materialboxed responsive-img" src="/images/anonymous_networking/onion_service_example.png"/>
</div>
<div class="section" id="id3">
<h2>我需要搭建一个洋葱服务么?</h2>
<p>如果汝遇到了这些情况,那汝大概会对如何搭建一个洋葱服务引起兴趣(大概吧 …</p></div><p><del>“如果你愿意一层一层剥开我的心……”</del></p>
<div class="section" id="onion-service">
<h2>所以洋葱服务(Onion Service)是啥?</h2>
<blockquote>
洋葱服务 (Onion Service ,旧名为“隐身服务/隐藏服务/ Hidden Service”)
是一种只能透过洋葱路由网络访问的网络服务 (例如网站)。</blockquote>
</div>
<div class="section" id="id2">
<h2>那么有人为啥要使用洋葱服务呢?</h2>
<ul class="simple">
<li>洋葱服务在 Tor 网络中传递,因此可以隐藏服务器的真实地址(例如 IP 地址和地理位置等等)。</li>
<li>Tor 用户与洋葱服务之间所有的流量都是端到端加密的,所以汝不必担心像没有 HTTPS 这样的问题。</li>
<li>洋葱服务的网址是为自动生成,因此网站的架设者或管理员无需另行购买网络域名。其网址皆是以 .onion 结尾的,
这样的设计可以让洋葱路由系统确保所有网络连接都通往正确的站点,并且其连接数据未被窜改。</li>
</ul>
<p>访问一个洋葱服务网站时,除了一般 Tor 网络中会经过的节点以外,还会额外通过若干个中继。
(图上的是 DuckDuckGo 提供的洋葱服务 <a class="reference external" href="https://3g2upl4pq6kufc4m.onion/">https://3g2upl4pq6kufc4m.onion/</a> )</p>
<img alt="访问一个洋葱服务网站时" class="materialboxed responsive-img" src="/images/anonymous_networking/onion_service_example.png"/>
</div>
<div class="section" id="id3">
<h2>我需要搭建一个洋葱服务么?</h2>
<p>如果汝遇到了这些情况,那汝大概会对如何搭建一个洋葱服务引起兴趣(大概吧……):</p>
<ul class="simple">
<li>匿名、不被截获和篡改的传输一个文件。(正好有 OnionShare 可以帮忙这么做)。</li>
<li>在没有公共 IP 地址(甚至没有域名)的情况下提供 Web 服务。</li>
<li>匿名的和另一位匿名者交流。</li>
<li>汝也重视汝的读者的隐私权。 <del>(要是汝不是作者怎么办?)</del></li>
<li>或者别的? (详见:<a class="reference external" href="https://blog.torproject.org/category/tags/heart-internet-freedom">Tor at the Heart</a> )</li>
</ul>
</div>
<div class="section" id="id4">
<h2>切洋葱之前当然要做好保护措施啊……</h2>
<p>于是亦然(?),要搭建一个洋葱服务的话,首先要有一个能够正常连接的 Tor 。</p>
<p>介于应该没人会一直开着个浏览器(?),所以最好是有个独立的 Tor 在运行(就是那啥所谓的 Expert Bundle 啦……)。</p>
<p>以及现在用 GNU/Linux 提供 Web 服务的家伙应该不少吧,于是汝大概能从汝所使用的 GNU/Linux 发行版的
软件仓库中找到 tor:</p>
<ul class="simple">
<li>Debian 系的话,可以参考官方的文档添加官方的仓库 : <a class="reference external" href="https://www.torproject.org/docs/debian.html.en">https://www.torproject.org/docs/debian.html.en</a></li>
<li>Fedora / CentOS 的话,可以从 <a class="reference external" href="https://fedoraproject.org/wiki/EPEL">EPEL</a> 仓库中安装 tor :</li>
<li>Arch 、Gentoo 或者 LFS ? <del>汝都会用这些了那不用咱教怎么装了吧……</del></li>
<li>以及看情况修改 torrc 文件, <a class="reference external" href="https://2019.www.torproject.org/docs/tor-manual.html.en">还是记得看文档</a></li>
</ul>
</div>
<div class="section" id="web">
<h2>准备一个 Web 服务</h2>
<p>这个就看人下菜了(?),如果有只用洋葱服务访问的需要的话,可以调整 Web 服务器的配置文件,
让她只接受本地地址的连接。 例如 Nginx 和 Apache 的话,大概可以这么做:</p>
<blockquote>
listen localhost:8000;</blockquote>
<p><del>不放心的话还可以用防火墙啊(x)</del></p>
</div>
<div class="section" id="id6">
<h2>生成一个洋葱服务地址</h2>
<p>洋葱服务使用的 .onion 地址是随机产生的,地址是在配置洋葱服务时用新生成的公钥计算而成的。
所以叫做“生成”而不是注册,以及虽然有方法可以提前算出来生成特定地址的公钥但是不建议尝试……</p>
<p>用汝最顺手的编辑器和 root 权限(?)打开 Tor 的配置文件(通常是 /etc/tor/torrc ),
然后加上这些:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># 每个不同的洋葱服务都需要一个独立的文件夹来存储其所需要的私钥和主机名,</span></span>
<span class="code-line"><span class="c1"># 要创建不同的洋葱服务时,需要修改 HiddenServiceDir 所指向的文件夹。</span></span>
<span class="code-line"><span class="c1">#(注:不要手动创建 HiddenServiceDir 的路径,否则会出现权限的错误而无法启动。</span></span>
<span class="code-line"><span class="c1"># 在配置完成后启动 Tor 后,程序会自动生成权限合适的对应文件夹。)</span></span>
<span class="code-line"></span>
<span class="code-line">HiddenServiceDir /var/lib/tor/path_to_your_service</span>
<span class="code-line"></span>
<span class="code-line"><span class="c1"># HiddenServicePort {汝希望汝的洋葱服务开在哪个端口上} {汝这个端口的洋葱服务交给谁处理}</span></span>
<span class="code-line"></span>
<span class="code-line">HiddenServicePort <span class="m">80</span> <span class="m">127</span>.0.0.1:8080</span>
</pre></div>
<p>保存完毕后重新启动 Tor ,如果一切 OK 的话,可以在汝设置的 HiddenServiceDir 中看到一个
名为 hostname 的文件,里面就是汝新鲜的洋葱服务的域名啦~</p>
</div>
<div class="section" id="id7">
<h2>同时提供普通网络服务和洋葱服务时?</h2>
<ul class="simple">
<li>可以考虑让来自 Tor 的出口 IP 地址的连接自动重定向至洋葱服务地址,例如
<a class="reference external" href="https://github.com/placeholdr/nginx-tor-redirect">这样</a></li>
<li>也有可能需要调整汝的应用(或者主题什么别的)来适应洋葱服务和 Tor 浏览器。</li>
</ul>
</div>
<div class="section" id="id9">
<h2>更进一步?读读看这些文章</h2>
<blockquote>
当然都只有英文版(汗)</blockquote>
<ul class="simple">
<li><a class="reference external" href="https://riseup.net/en/security/network-security/tor/onionservices-best-practices">Tor 洋葱服务最佳实践</a>
,来自 Riseup 的洋葱服务运行提示。</li>
<li><a class="reference external" href="https://2019.www.torproject.org/docs/tor-onion-service.html.en">为 Tor 设置洋葱服务</a>
,Tor Project 官方的部署指南,第三部分以后提供了一些高级话题。</li>
<li><a class="reference external" href="https://blog.torproject.org/announcing-vanguards-add-onion-services">洋葱服务的 Vanguard 插件</a>
,Tor Project 提供的保护洋葱服务的插件。</li>
</ul>
<p><del>你会鼻酸,你会流泪……</del></p>
</div>
在 Android 上创建 GNU/Linux 容器2020-04-29T00:00:00+08:002020-04-29T00:00:00+08:00ホロtag:None,2020-04-29:/linux/build_linux_container_on_android.html<p><del>那这次再说吧……</del></p>
<blockquote>
再一次提醒没有耐心和同理心的家伙们去用其它即用的工具像是 TermuxArch 和 Linux Deploy ……</blockquote>
<div class="section" id="id1">
<h2>所以这回咱们要干什么?</h2>
<p>由于咱不可能把所有发行版都装一次,也不可能在各种手机上都测试一遍,于是咱只能拿
咱手边的家伙举个例子,例如咱手上的小米平板4 ……</p>
<ul class="simple">
<li>一部 aarch64 / arm64 设备</li>
</ul>
<p>现在的手机 CPU 基本上都是 64 位了吧,不知道的话搜索一下手上 CPU 的型号应该就能看个大概。</p>
<ul class="simple">
<li>比较新的 Android 系统,最好有 root 权限和完整 busybox 支持。</li>
</ul>
<p>如果汝已经动手给手机安装了第三方 ROM,那应该不是什么难事。
<del>某蓝绿海厂等受害者可以尝试 UserLAnd……</del></p>
<ul class="simple">
<li>一些剩余存储空间 <del>(这不是废话么)</del></li>
<li>安装好终端模拟器和合适的键盘。</li>
</ul>
<p>或者 Termux 也可以,在里面装上 tsu 以后可以让 Termux 里的 Bash 以 …</p></div><p><del>那这次再说吧……</del></p>
<blockquote>
再一次提醒没有耐心和同理心的家伙们去用其它即用的工具像是 TermuxArch 和 Linux Deploy ……</blockquote>
<div class="section" id="id1">
<h2>所以这回咱们要干什么?</h2>
<p>由于咱不可能把所有发行版都装一次,也不可能在各种手机上都测试一遍,于是咱只能拿
咱手边的家伙举个例子,例如咱手上的小米平板4 ……</p>
<ul class="simple">
<li>一部 aarch64 / arm64 设备</li>
</ul>
<p>现在的手机 CPU 基本上都是 64 位了吧,不知道的话搜索一下手上 CPU 的型号应该就能看个大概。</p>
<ul class="simple">
<li>比较新的 Android 系统,最好有 root 权限和完整 busybox 支持。</li>
</ul>
<p>如果汝已经动手给手机安装了第三方 ROM,那应该不是什么难事。
<del>某蓝绿海厂等受害者可以尝试 UserLAnd……</del></p>
<ul class="simple">
<li>一些剩余存储空间 <del>(这不是废话么)</del></li>
<li>安装好终端模拟器和合适的键盘。</li>
</ul>
<p>或者 Termux 也可以,在里面装上 tsu 以后可以让 Termux 里的 Bash 以 root 用户运行。</p>
<p>作为好几年的 Arch Linux <del>受害</del> 爱好者,咱当然就装一个 ArchLinux ARM 试试看啦
(虽然这不是官方分支,以及不是有 TermuxArch 了么……)</p>
<p>那么我们的目标是,<del>没有蛀牙</del> ……</p>
<ul class="simple">
<li>能够在 chroot 下基本正常工作</li>
</ul>
<p>例如正常的使用包管理器、安装软件以及用它们等等。</p>
<ul class="simple">
<li>能够访问网络和内存设备 (踩坑警告)</li>
<li>能够通过外部访问 (ssh 或者 vnc 啥的)</li>
</ul>
<p><del>如有任何不适还请装作没事</del></p>
</div>
<div class="section" id="nosuid">
<h2>天降大坑 nosuid ……(?)</h2>
<p>某些手机上的 /data 挂载的时候加上了 nosuid 选项,于是 sudo 就炸了……</p>
<blockquote>
sudo: effective uid is not 0, is /sbin/sudo on a file system with the
'nosuid' option set or an NFS file system without root privileges?</blockquote>
<p>这种情况可以考虑创建一个磁盘映像把容器放进去(大概吧……)</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># 找个地方创建一个映像文件</span></span>
<span class="code-line">dd <span class="k">if</span><span class="o">=</span>/dev/zero <span class="nv">of</span><span class="o">=</span>/path/to/root.img <span class="nv">bs</span><span class="o">=</span><span class="m">1048576</span> <span class="nv">count</span><span class="o">=</span><span class="m">4096</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="c1"># 给映像创建文件系统和挂载</span></span>
<span class="code-line">mke2fs -t ext4 -F /path/to/root.img</span>
<span class="code-line">mkdir -p /data/linux/arch</span>
<span class="code-line">mount -t ext4 -o loop /path/to/root.img /data/linux/arch</span>
</pre></div>
<p><del>如果肯定不用 sudo 的话能不能当做没事……</del></p>
</div>
<div class="section" id="id2">
<h2>要有空间,于是……</h2>
<blockquote>
丢了个 tarball 下来让汝自己 bootstrap 去(啥?)</blockquote>
<p>安装 GNU/Linux 发行版的过程,其实就是在解决一个先有鸡还是先有蛋的问题,这个过程就是 bootstrap。
大概就是……</p>
<ul class="simple">
<li>从别的什么可以启动的地方把要安装的 GNU/Linux 发行版的最小的部份下载回来,安装上。</li>
<li>通过一些方法进入这个最小的部份中(例如 chroot ),为目标设备特化配置。</li>
</ul>
<p>只不过大部分发行版的安装过程中被自动化了(Arch / Gentoo 等用户表示情绪稳定。)。
在 Android 上安装,同样要经过这个过程。</p>
<p>于是,首先咱们要下载 Arch Linux ARM 的 tarball ,可以在电脑上下载下来发送到手机上,也可以用手机
的浏览器直接下载,也可以用 curl 或者 wget:</p>
<blockquote>
wget <a class="reference external" href="http://os.archlinuxarm.org/os/ArchLinuxARM-aarch64-latest.tar.gz">http://os.archlinuxarm.org/os/ArchLinuxARM-aarch64-latest.tar.gz</a></blockquote>
<p>如果直接从官方仓库下载不够快的话,可以通过镜像网站下载,例如:</p>
<p><a class="reference external" href="https://mirrors.tuna.tsinghua.edu.cn/archlinuxarm/os/ArchLinuxARM-aarch64-latest.tar.gz">https://mirrors.tuna.tsinghua.edu.cn/archlinuxarm/os/ArchLinuxARM-aarch64-latest.tar.gz</a></p>
<p>然后创建一个目录存放解压出来的基本系统,再解压出来刚下载的 tarball:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># 因为 SD 卡可能放不下权限等神奇的原因,就放在内存设备上好了……</span></span>
<span class="code-line"><span class="c1"># mkdir -p /data/linux/arch</span></span>
<span class="code-line"><span class="c1"># 以及 Arch Linux ARM 官方是建议用 bsdtar 的,要是汝的手机上凑巧有(不管是</span></span>
<span class="code-line"><span class="c1"># 系统里的还是 Termux 的),就用上吧……</span></span>
<span class="code-line"><span class="c1"># bsdtar -xpf /path/to/ArchLinuxARM-aarch64-latest.tar.gz -C /path/to/mountpoint</span></span>
<span class="code-line"><span class="c1"># 不然 tar 也是可以的。</span></span>
<span class="code-line"><span class="c1"># tar -xzvf /path/to/ArchLinuxARM-aarch64-latest.tar.gz -C /path/to/mountpoint</span></span>
</pre></div>
</div>
<div class="section" id="chroot-on-android">
<h2>Chroot on Android</h2>
<p>在普通的 GNU/Linux 发行版上 chroot 时,咱们大抵会这么做:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># 切换到 chroot 的目标目录并挂载上 /dev /sys 这样的伪文件系统</span></span>
<span class="code-line"><span class="c1"># cd /location/of/new/root</span></span>
<span class="code-line"><span class="c1"># mount -t proc proc proc/</span></span>
<span class="code-line"><span class="c1"># mount --rbind /sys sys/</span></span>
<span class="code-line"><span class="c1"># mount --rbind /dev dev/</span></span>
<span class="code-line"><span class="c1"># 通过给定的 shell 进入 chroot</span></span>
<span class="code-line"><span class="c1"># chroot /location/of/new/root /bin/bash</span></span>
</pre></div>
<p>在 Android 上其实也差不多:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># mount -o bind /dev /data/linux/arch</span></span>
<span class="code-line"><span class="c1"># mount -o bind /sys /data/linux/arch/sys</span></span>
<span class="code-line"><span class="c1"># mount -o bind /proc /data/linux/arch/proc</span></span>
<span class="code-line"><span class="c1"># mount -t tmpfs tmpfs /data/linux/arch/tmp</span></span>
</pre></div>
<p>以及记得修改一下 chroot 里面的 /etc/resolv.conf , Arch 这个默认是到
/run/systemd/resolve/resolv.conf 的软链接。 <del>反正里面也没有 systemd 用</del> ,于是
删掉重建好了……</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># /data/linux/arch/etc/resolv.conf</span></span>
<span class="code-line"></span>
<span class="code-line">nameserver <span class="m">8</span>.8.8.8</span>
<span class="code-line">nameserver <span class="m">8</span>.8.4.4</span>
</pre></div>
<p>如果有必要的话,可以同时修改里面的镜像仓库地址。</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># /data/linux/arch/etc/pacman.d/mirrorlist</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="nv">Server</span> <span class="o">=</span> https://mirrors.ustc.edu.cn/archlinuxarm/<span class="nv">$arch</span>/<span class="nv">$repo</span></span>
</pre></div>
<p>然后就和平常一样 chroot 进去咯~</p>
<div class="highlight"><pre><span class="code-line"><span></span>clover:/data/linux <span class="c1"># chroot /data/linux/arch /bin/bash</span></span>
<span class="code-line"><span class="o">[</span>root@localhost /<span class="o">]</span><span class="c1">#</span></span>
</pre></div>
</div>
<div class="section" id="id3">
<h2>起始配置</h2>
<blockquote>
The bootstrap environment is really barebones (no nano or lvm2).
Therefore, we need to set up pacman in order to download other necessary packages.</blockquote>
<p>这下知道为啥要在外面改 /etc/resolv.conf 了吧(当然汝要是独辟蹊径的话那当咱没说……)</p>
<p>正如 <a class="reference external" href="https://archlinuxarm.org/platforms/armv8/generic">官方说明提示的一样</a>
,初始化 pacman 密钥环和获得密钥:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="o">[</span>root@localhost /<span class="o">]</span><span class="c1"># pacman-key --init</span></span>
<span class="code-line">gpg: /etc/pacman.d/gnupg/trustdb.gpg: trustdb created</span>
<span class="code-line">gpg: no ultimately trusted keys found</span>
<span class="code-line">gpg: starting migration from earlier GnuPG versions</span>
<span class="code-line">gpg: porting secret keys from <span class="s1">'/etc/pacman.d/gnupg/secring.gpg'</span> to gpg-agent</span>
<span class="code-line">gpg: migration succeeded</span>
<span class="code-line">gpg: Generating pacman keyring master key...</span>
<span class="code-line">gpg: key 56753AA14274D5A7 marked as ultimately trusted</span>
<span class="code-line">gpg: directory <span class="s1">'/etc/pacman.d/gnupg/openpgp-revocs.d'</span> created</span>
<span class="code-line">gpg: revocation certificate stored as <span class="s1">'/etc/pacman.d/gnupg/openpgp-revocs.d/46C9147EE071F7E5D16A085856753AA14274D5A7.rev'</span></span>
<span class="code-line">gpg: <span class="nv">Done</span></span>
<span class="code-line"><span class="o">==</span>> Updating trust database...</span>
<span class="code-line">gpg: marginals needed: <span class="m">3</span> completes needed: <span class="m">1</span> trust model: pgp</span>
<span class="code-line">gpg: depth: <span class="m">0</span> valid: <span class="m">1</span> signed: <span class="m">0</span> trust: <span class="m">0</span>-, 0q, 0n, 0m, 0f, 1u</span>
<span class="code-line"><span class="o">[</span>root@localhost /<span class="o">]</span><span class="c1"># pacman-key --populate archlinuxarm</span></span>
<span class="code-line"><span class="o">==</span>> Appending keys from archlinuxarm.gpg...</span>
<span class="code-line"><span class="o">==</span>> Locally signing trusted keys in keyring...</span>
<span class="code-line">-> Locally signing key 69DD6C8FD314223E14362848BF7EEF7A9C6B5765...</span>
<span class="code-line">-> Locally signing key 02922214DE8981D14DC2ACABBC704E86B823CD25...</span>
<span class="code-line">-> Locally signing key 9D22B7BB678DC056B1F7723CB55C5315DCD9EE1A...</span>
<span class="code-line"><span class="o">==</span>> Importing owner trust values...</span>
<span class="code-line">gpg: setting ownertrust to <span class="m">4</span></span>
<span class="code-line">gpg: inserting ownertrust of <span class="m">4</span></span>
<span class="code-line">gpg: setting ownertrust to <span class="nv">4</span></span>
<span class="code-line"><span class="o">==</span>> Updating trust database...</span>
<span class="code-line">gpg: marginals needed: <span class="m">3</span> completes needed: <span class="m">1</span> trust model: pgp</span>
<span class="code-line">gpg: depth: <span class="m">0</span> valid: <span class="m">1</span> signed: <span class="m">3</span> trust: <span class="m">0</span>-, 0q, 0n, 0m, 0f, 1u</span>
<span class="code-line">gpg: depth: <span class="m">1</span> valid: <span class="m">3</span> signed: <span class="m">1</span> trust: <span class="m">0</span>-, 0q, 0n, 3m, 0f, 0u</span>
<span class="code-line">gpg: depth: <span class="m">2</span> valid: <span class="m">1</span> signed: <span class="m">0</span> trust: <span class="m">1</span>-, 0q, 0n, 0m, 0f, 0u</span>
<span class="code-line"><span class="o">[</span>root@localhost /<span class="o">]</span><span class="c1">#</span></span>
</pre></div>
<p>接下来安装(和更新)基本系统,如果有别的需要的话也可以装别的。</p>
<blockquote>
[<a class="reference external" href="mailto:root@localhost">root@localhost</a> /]# pacman -Syu base base-devel nano --needed</blockquote>
<p>如果不幸遇到了像是 error: could not determine cachedir mount point /var/cache/pacman/pkg 这样的错误,
那在 /etc/pacman.conf 里把 Misc options 下面的 CheckSpace 注释掉应该能绕过
(于是有别的方法嘛)</p>
<p>基于正经的 GNU/Linux 用户不会日用 root 账户这一指导原则(啥?),咱们也要新建一个用户:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="o">[</span>root@localhost /<span class="o">]</span><span class="c1"># useradd -m -s /bin/bash horo</span></span>
<span class="code-line"><span class="o">[</span>root@localhost /<span class="o">]</span><span class="c1"># passwd horo</span></span>
</pre></div>
<p>有必要的话也可以修改 sudoers 文件(记得用 visudo),把汝刚刚创建的用户添加到 sudoers 中。</p>
<p>以及介于 Android 的魔改属性,只有特定的组可以进行像是访问网络或者访问 SD 卡等操作,于是
还要在 chroot 里新建相应的组,并把新建的用户加到这些组去:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># groupadd 可以用 -g 参数制定新增组的 id ,至于这些组分别是啥</span></span>
<span class="code-line"><span class="c1"># 看后面的组名应该就知道了吧……</span></span>
<span class="code-line">groupadd -g <span class="m">3001</span> android_bt</span>
<span class="code-line">groupadd -g <span class="m">3002</span> android_bt-net</span>
<span class="code-line">groupadd -g <span class="m">3003</span> android_inet</span>
<span class="code-line">groupadd -g <span class="m">3004</span> android_net-raw</span>
<span class="code-line">groupadd -g <span class="m">1015</span> sdcard-rw</span>
<span class="code-line">groupadd -g <span class="m">1028</span> sdcard-r</span>
<span class="code-line"><span class="c1"># 然后把新建的用户添加到合适的组中</span></span>
<span class="code-line">gpasswd -a horo android_bt</span>
<span class="code-line">gpasswd -a horo android_bt-net</span>
<span class="code-line">gpasswd -a horo android_inet</span>
<span class="code-line">gpasswd -a horo android_net-raw</span>
<span class="code-line">gpasswd -a horo sdcard-rw</span>
<span class="code-line">gpasswd -a horo sdcard-r</span>
</pre></div>
<p>最后(?),因为没有 systemd,所以请像新装 Arch Linux 的时候一样手动设置一下 locales:</p>
<ul class="simple">
<li>/etc/locale.gen 是一个仅包含注释文档的文本文件。指定您需要的本地化类型,去掉对应行前面的注释符号(#)就可以啦,还是用 nano 打开,建议选择帶UTF-8的項:</li>
</ul>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># nano /etc/locale.gen</span></span>
<span class="code-line"></span>
<span class="code-line">en_US.UTF-8 UTF-8</span>
</pre></div>
<ul class="simple">
<li>执行 locale-gen 以生成 locale 讯息:</li>
</ul>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># locale-gen</span></span>
</pre></div>
<ul class="simple">
<li>创建 locale.conf 并提交本地化选项:</li>
</ul>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># echo 用来输出某些文字,后面的大于号表示把输出保存到某个文件里啦~</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="c1"># 或者可以用文字编辑器新建这个文件加上这一行。</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="c1"># echo LANG=en_US.UTF-8 > /etc/locale.conf</span></span>
</pre></div>
<ul>
<li><p class="first">设置用户级别的 locale</p>
<blockquote>
<p>用 su 切换到刚建立的用户,然后编辑 ~/.bashrc 修改自己的 Locale ,例如:</p>
</blockquote>
</li>
</ul>
<div class="highlight"><pre><span class="code-line"><span></span><span class="nv">LANG</span><span class="o">=</span>en_US.UTF-8</span>
<span class="code-line"><span class="nv">LC_CTYPE</span><span class="o">=</span><span class="s2">"en_US.UTF-8"</span></span>
<span class="code-line"><span class="nv">LC_NUMERIC</span><span class="o">=</span><span class="s2">"en_US.UTF-8"</span></span>
<span class="code-line"><span class="nv">LC_TIME</span><span class="o">=</span><span class="s2">"en_US.UTF-8"</span></span>
<span class="code-line"><span class="nv">LC_COLLATE</span><span class="o">=</span><span class="s2">"en_US.UTF-8"</span></span>
<span class="code-line"><span class="nv">LC_MONETARY</span><span class="o">=</span><span class="s2">"en_US.UTF-8"</span></span>
<span class="code-line"><span class="nv">LC_MESSAGES</span><span class="o">=</span><span class="s2">"en_US.UTF-8"</span></span>
<span class="code-line"><span class="nv">LC_PAPER</span><span class="o">=</span><span class="s2">"en_US.UTF-8"</span></span>
<span class="code-line"><span class="nv">LC_NAME</span><span class="o">=</span><span class="s2">"en_US.UTF-8"</span></span>
<span class="code-line"><span class="nv">LC_ADDRESS</span><span class="o">=</span><span class="s2">"en_US.UTF-8"</span></span>
<span class="code-line"><span class="nv">LC_TELEPHONE</span><span class="o">=</span><span class="s2">"en_US.UTF-8"</span></span>
<span class="code-line"><span class="nv">LC_MEASUREMENT</span><span class="o">=</span><span class="s2">"en_US.UTF-8"</span></span>
<span class="code-line"><span class="nv">LC_IDENTIFICATION</span><span class="o">=</span><span class="s2">"en_US.UTF-8"</span></span>
<span class="code-line"><span class="nv">LC_ALL</span><span class="o">=</span></span>
</pre></div>
<p>(为啥不是 ~/.config/locale.conf 了啊…… <del>其实咱也不知道……</del> )</p>
<p>于是现在大概就有了这个样子:</p>
<img alt="于是现在大概就有了这个样子" class="materialboxed responsive-img" src="/images/linux_on_android/arch_01.png"/>
<p>(这个在终端里显示发行版等信息的软件是 screenfetch 啦,也有人喜欢另一个
小修改版 neofetch )</p>
</div>
<div class="section" id="ssh-sd">
<h2>设置 SSH 和 SD 卡访问</h2>
<p>SSH 的话,生成好主机密钥然后再启动 sshd 就可以:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1">## 在有 systemd 这样的 init 系统的发行版上启动 sshd 时会帮汝运行这一步,</span></span>
<span class="code-line"><span class="c1">## 不过这里就只有自己代劳啦……</span></span>
<span class="code-line"><span class="c1"># ssh-keygen -A</span></span>
<span class="code-line"><span class="c1">## 这里一定要是绝对路径,不然就会出 "sshd re-exec requires execution with an absolute path" 错误。</span></span>
<span class="code-line"><span class="c1"># /usr/bin/sshd</span></span>
</pre></div>
<p>然后就可以用一个新的终端模拟器窗口通过 ssh 连接进来啦……</p>
<div class="highlight"><pre><span class="code-line"><span></span>clover:/ $ ssh horo@127.0.0.1</span>
<span class="code-line">The authenticity of host '127.0.0.1 (127.0.0.1)' can't be established.</span>
<span class="code-line">ECDSA key fingerprint is SHA256: .</span>
<span class="code-line">Are you sure you want to continue connecting (yes/no/[fingerprint])? yes</span>
<span class="code-line">horo@127.0.0.1's password:</span>
<span class="code-line">[horo@localhost ~]$</span>
</pre></div>
<p>要是汝在登录时遇到了 PTY allocation failed on channel 0 这样的错误,在 chroot 里(重新)
挂载一下 /dev/pts 试试?</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># umount /dev/pts</span></span>
<span class="code-line"><span class="c1"># mount -t devpts devpts /dev/pts</span></span>
</pre></div>
<p>以及可以的话记得修改 /etc/sshd_config 把 sshd 限定到只允许本地连接?</p>
<p>要把 SD 卡挂载到哪里的话,在 chroot 的外面运行:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1">## 当然汝的 /sdcard 可能是汝的内存设备什么的,别忘了自己调整路径……</span></span>
<span class="code-line"><span class="c1"># mkdir /data/linux/arch/mnt/sdcard</span></span>
<span class="code-line"><span class="c1"># mount -o bind /sdcard /data/linux/arch/mnt/sdcard</span></span>
</pre></div>
</div>
<div class="section" id="vnc">
<h2>设置 VNC 访问</h2>
<p>首先安装桌面和 VNC Server ,考虑到两大桌面的资源需求和或多或少有点依赖 GNOME,比较合适的是 xfce:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1">## 当然汝可以看需要装些别的,像是中文字体什么的。</span></span>
<span class="code-line"><span class="c1"># pacman -S xorg xfce4 xfce4-goodies tigervnc</span></span>
</pre></div>
<p>接下来启动 vncserver,设置一个密码:</p>
<div class="highlight"><pre><span class="code-line"><span></span>[horo@localhost ~]$ vncserver</span>
<span class="code-line"></span>
<span class="code-line">You will require a password to access your desktops.</span>
<span class="code-line"></span>
<span class="code-line">Password:</span>
<span class="code-line">Verify:</span>
<span class="code-line"># 要创建一个只读桌面用的密码嘛?</span>
<span class="code-line">Would you like to enter a view-only password (y/n)?</span>
<span class="code-line">xauth: file /home/horo/.Xauthority does not exist</span>
<span class="code-line"></span>
<span class="code-line"># 桌面的位置</span>
<span class="code-line">New 'localhost:1 (horo)' desktop is localhost:1</span>
<span class="code-line"></span>
<span class="code-line">Creating default startup script /home/horo/.vnc/xstartup</span>
<span class="code-line">Creating default config /home/horo/.vnc/config</span>
<span class="code-line">Starting applications specified in /home/horo/.vnc/xstartup</span>
<span class="code-line">Log file is /home/horo/.vnc/localhost:1.log</span>
</pre></div>
<p>然后先用 vncserver -kill :1 中止掉现有的 VNC Server 进程,修改一下新生成的配置文件。</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># /home/horo/.vnc/xstartup</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="c1">#!/bin/sh</span></span>
<span class="code-line"><span class="nb">unset</span> SESSION_MANAGER</span>
<span class="code-line"><span class="nb">unset</span> DBUS_SESSION_BUS_ADDRESS</span>
<span class="code-line"><span class="nb">exec</span> xfce4-session</span>
<span class="code-line"></span>
<span class="code-line"><span class="c1"># /home/horo/.vnc/config</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="c1">## Supported server options to pass to vncserver upon invocation can be listed</span></span>
<span class="code-line"><span class="c1">## in this file. See the following manpages for more: vncserver(1) Xvnc(1).</span></span>
<span class="code-line"><span class="c1">## Several common ones are shown below. Uncomment and modify to your liking.</span></span>
<span class="code-line"><span class="c1">##</span></span>
<span class="code-line"><span class="c1"># securitytypes=vncauth,tlsvnc</span></span>
<span class="code-line"><span class="c1"># desktop=sandbox</span></span>
<span class="code-line"><span class="c1"># 可以在这里修改分辨率和限定本地连接,具体的参数可以查阅相应的手册页来了解。 (vncserver(1) Xvnc(1))</span></span>
<span class="code-line"><span class="nv">geometry</span><span class="o">=</span>1920x1080</span>
<span class="code-line"><span class="c1"># localhost</span></span>
<span class="code-line"><span class="c1"># alwaysshared</span></span>
</pre></div>
<p>如果一切正常的话应该会连上去之后有 xfce 的界面的,但是咱这回就只有 Unable to contact settings server 这个错误,以后再说吧(跑)
<del>不过隔壁 Linux Deploy 出的 Debian 是好的……</del></p>
</div>
<div class="section" id="id5">
<h2>总结?</h2>
<p>所以有 Linux Deploy 那样好用(?)的工具了为啥不直接拿来用呢(划掉)</p>
<p><del>以及纯粹是闲的,找一台正经的电脑装正经的 GNU/Linux 不好么 (x)</del></p>
</div>
在 Android 上使用 GNU/Linux 工具2020-04-28T00:00:00+08:002020-04-28T00:00:00+08:00ホロtag:None,2020-04-28:/linux/linux_on_android.html<div class="section" id="id1">
<h2>虽然……</h2>
<p>虽然汝可能从哪里听说过 Android 是基于 Linux 内核的啦,不过大多数时候汝大概没办法直接把汝爱用的 GNU/Linux 发行版上的
工具直接拿过来用,为啥咧?</p>
<ul class="simple">
<li>手机和电脑不是一种 CPU(PC 常见的就是 x86_64 , 手机上比较常见的是 arm64(有时也称作 aarch64)),因此
两边的二进制文件并不能直接拿来换着用。</li>
<li>虽然 Android 用了 Linux 内核,但是和普通的 GNU/Linux 发行版还是有很大的区别的。例如以 bionic 取代glibc
(C 函数库)、以 Skia 取代 Cairo (用于向量图形绘图)、再以 OpenCORE 取代 FFmpeg(常用于音视频的录影和转换)。
于是不少依赖它们的软件不好运行。</li>
<li>以及随着越来越多的 GNU …</li></ul></div><div class="section" id="id1">
<h2>虽然……</h2>
<p>虽然汝可能从哪里听说过 Android 是基于 Linux 内核的啦,不过大多数时候汝大概没办法直接把汝爱用的 GNU/Linux 发行版上的
工具直接拿过来用,为啥咧?</p>
<ul class="simple">
<li>手机和电脑不是一种 CPU(PC 常见的就是 x86_64 , 手机上比较常见的是 arm64(有时也称作 aarch64)),因此
两边的二进制文件并不能直接拿来换着用。</li>
<li>虽然 Android 用了 Linux 内核,但是和普通的 GNU/Linux 发行版还是有很大的区别的。例如以 bionic 取代glibc
(C 函数库)、以 Skia 取代 Cairo (用于向量图形绘图)、再以 OpenCORE 取代 FFmpeg(常用于音视频的录影和转换)。
于是不少依赖它们的软件不好运行。</li>
<li>以及随着越来越多的 GNU/Linux 发行版开始用 Systemd 作为初始化程序,很多程序或多或少就和 Systemd 有了些关联(或者依赖)。
不巧的是……</li>
</ul>
<p><del>所以 Android 应用们不好用了么?</del></p>
</div>
<div class="section" id="stage-0-android">
<h2>STAGE 0 - Android 上的终端(模拟器)</h2>
<p>如果汝有用过一些需要在电脑上运行一个辅助程序的 Android 应用(像是
<a class="reference external" href="https://appops.rikka.app/zh-hans/guide/">AppOps</a> 这样的),汝其实已经离 Shell 很近了。</p>
<p>在手机和电脑连接以后,可以运行 adb shell 命令获得一个 shell:</p>
<div class="highlight"><pre><span class="code-line"><span></span>(PC) $ adb shell</span>
<span class="code-line">walleye:/ $</span>
</pre></div>
<p><del>接下来就可以 cd ls 乱出了……</del> (啥?) 因为别的汝也干不了啊……</p>
<p>如果汝的手机有 root 权限的话,在 Shell 里运行 su 试试?第一次的话汝的手机上的
root 权限管理程序应该会提示汝授予权限什么的。</p>
<p>要想在手机上试试的话,也有差不多的终端模拟器程序可以选择。
<a class="reference external" href="https://play.google.com/store/apps/details?id=jackpal.androidterm">例如这个?</a></p>
</div>
<div class="section" id="stage-1-android-gnu-linux">
<h2>STAGE 1 - 在 Android 上使用(部份) GNU/Linux 程序</h2>
<blockquote>
只有个 shell 哪里够……</blockquote>
<p>正好也有一群人这么想,于是它们把终端模拟器和一些常用的 GNU/Linux 应用程序组合起来,创造出了
<a class="reference external" href="https://play.google.com/store/apps/details?id=com.termux&hl=zh">Termux</a>。</p>
<img alt="Termux 的启动界面" class="materialboxed responsive-img" src="/images/linux_on_android/termux_intro.png"/>
<p>(这个在电脑上显示 Android 设备画面的程序是
<a class="reference external" href="https://github.com/Genymobile/scrcpy">scrcpy</a> 啦~)</p>
<p>这里面提到的 pkg 其实就是有点小包装的 apt 啦,熟悉 Debian / Ubuntu 的话应该不会陌生。</p>
<p>下面的 root / Unstable / x11 是额外的仓库,需要使用要求 root 权限或者图形界面的软件在里面。</p>
<ul class="simple">
<li>Play 商店上也有几个 Termux 使用的插件,可以实现自定义字体、浮动窗口、快速运行脚本、访问手机内存设备
等功能。有几个是收费的,不过有别的地方可以免费下载(小声)</li>
<li>键盘上面的特殊按键可以通过编辑 ~/.termux/termux.properties 文件中的 extra-keys 属性来修改,
<a class="reference external" href="https://wiki.termux.com/wiki/Touch_Keyboard">特殊键的定义在这里。</a>。</li>
<li>偷懒的话也可以直接安装一个有这些特殊键的输入法,例如
<a class="reference external" href="https://play.google.com/store/apps/details?id=org.pocketworkstation.pckeyboard&hl=zh">Hacker's Keyboard</a></li>
<li>当然外接键盘也是可以的。</li>
</ul>
<p><a class="reference external" href="https://www.sqlsec.com/2018/05/termux.html">以及大概有人踩过了不少的坑的样子……</a></p>
</div>
<div class="section" id="stage-2-android-gnu-linux">
<h2>STAGE 2 - 在 Android 上运行(部份) GNU/Linux 容器</h2>
<blockquote>
<del>啊 pkg/apt 好不习惯……</del></blockquote>
<p>怀念汝习惯的 GNU/Linux 发行版的原汁原味的包管理器和其它工具?可以考虑运行一个容器来解馋(?)</p>
<blockquote>
<p>Linux® 容器是与系统其他部分隔离开的一系列进程。运行这些进程所需的所有文件都由另一个镜像提供,
这意味着从开发到测试再到生产的整个过程中,Linux 容器都具有可移植性和一致性。</p>
<p class="attribution">—<a class="reference external" href="https://www.redhat.com/zh/topics/containers/whats-a-linux-container">RedHat : 什么是 Linux 容器?</a></p>
</blockquote>
<p>实现这种操作的关键要素就是 chroot ,它针对正在运作的软件行程和它的子进程,改变它外显的根目录。
在使用 chroot 之后,进程就会认为设置的目录是根目录,就可以进行各种操作啦,例如隔离访问或者修复系统什么的。</p>
<p>当然这操作是要 root 权限的,至于后来有人写出用户空间中的
<a class="reference external" href="https://proot-me.github.io/">proot</a> ,就是另一个故事啦……</p>
<ul class="simple">
<li>手机有 root 权限的话,可以用 chroot 安装一个 GNU/Linux 容器。也有像是
<a class="reference external" href="https://github.com/meefik/linuxdeploy">Linux Deploy</a> 这样的应用可以简化这一过程。</li>
<li>没有 root 权限的话,借助前面提起的 proot 也能实现差不多的操作。也有像是
<a class="reference external" href="https://f-droid.org/zh_Hans/packages/tech.ula/">UserLAnd</a> 和
<a class="reference external" href="https://github.com/SDRausty/TermuxArch">TermuxArch</a> 这样的工具帮忙简化这一过程。</li>
</ul>
<p><a class="reference external" href="https://bbs.letitfly.me/d/1086">以及大概也有人踩过了不少的坑的样子……</a></p>
<blockquote>
那如果咱就是想从零(?)开始呢?</blockquote>
<p><del>那下次再说吧……</del></p>
</div>
两次理想主义的尝试2020-04-19T00:00:00+08:002020-04-19T00:00:00+08:00ホロtag:None,2020-04-19:/life/one_idealism_trial.html<p><del>几月不见甚是想念……</del> 会这么想的肯定是没看
<a class="reference external" href="https://matters.news/@kenookamihoro">咱的 Matters</a> 啦……
(虽然那边也沉寂了好一阵子), <del>以及「集合啦!动物森友会」真好玩……</del></p>
<div class="section" id="id2">
<h2>所以“两次理想主义的尝试”中的其中一次是什么?</h2>
<p>在赞助了 <a class="reference external" href="https://eatradish.github.io/member/">Utopiosphere</a>
和 <a class="reference external" href="https://astrianzheng.cn/sky-of-conjecture-member-plan.html">「本格异想录」</a>
的会员计划之后,咱打算推出咱自己的会员计划了。</p>
<blockquote>
诶???</blockquote>
<div class="section" id="id4">
<h3>为啥开始寻求赞助啦?</h3>
<p><del>因为穷.png</del></p>
<p>不像公众号、文章平台等可以"免费"存放内容(虽然汝和汝的读者可能会因为免费付出
其它的代价,例如自由和广告什么的……),独立博客是需要博主自己付出一定的成本来
维持运转的(例如域名和存放内容的地方)。</p>
<p>虽然咱前几个月终于悟出了 Likecoin 的赞赏键其实就是一个 iframe, 然后把它“移植”
到了这里,不过这几个月咱也没在这边写什么的样子,于是也形同虚设了(hmmmm)</p>
<p>最后还有咱自己的一点个人(?)原因,希望能得到一些声音(嗯?),咱当然也是有
回报可以拿出来的啦……</p>
</div>
<div class="section" id="id5">
<h3>赞助者可以获得的回报有 …</h3></div></div><p><del>几月不见甚是想念……</del> 会这么想的肯定是没看
<a class="reference external" href="https://matters.news/@kenookamihoro">咱的 Matters</a> 啦……
(虽然那边也沉寂了好一阵子), <del>以及「集合啦!动物森友会」真好玩……</del></p>
<div class="section" id="id2">
<h2>所以“两次理想主义的尝试”中的其中一次是什么?</h2>
<p>在赞助了 <a class="reference external" href="https://eatradish.github.io/member/">Utopiosphere</a>
和 <a class="reference external" href="https://astrianzheng.cn/sky-of-conjecture-member-plan.html">「本格异想录」</a>
的会员计划之后,咱打算推出咱自己的会员计划了。</p>
<blockquote>
诶???</blockquote>
<div class="section" id="id4">
<h3>为啥开始寻求赞助啦?</h3>
<p><del>因为穷.png</del></p>
<p>不像公众号、文章平台等可以"免费"存放内容(虽然汝和汝的读者可能会因为免费付出
其它的代价,例如自由和广告什么的……),独立博客是需要博主自己付出一定的成本来
维持运转的(例如域名和存放内容的地方)。</p>
<p>虽然咱前几个月终于悟出了 Likecoin 的赞赏键其实就是一个 iframe, 然后把它“移植”
到了这里,不过这几个月咱也没在这边写什么的样子,于是也形同虚设了(hmmmm)</p>
<p>最后还有咱自己的一点个人(?)原因,希望能得到一些声音(嗯?),咱当然也是有
回报可以拿出来的啦……</p>
</div>
<div class="section" id="id5">
<h3>赞助者可以获得的回报有?</h3>
<blockquote>
咱不知道还有啥词汇可以描述这群人了……</blockquote>
<p>在写完这篇文章的时候,咱能够想到的大概有这些:</p>
<ul class="simple">
<li>优先阅读咱的拙作(诶?以及对于会员计划来说这好像很平常啊)</li>
</ul>
<p>其实咱有好几次都是有好几个想法不知道先写那一篇,然后就咕咕咕了……这样大概
能让咱知道大家更想看到哪一篇,以及鞭策咱不要咕咕咕(x)</p>
<ul class="simple">
<li>某些方面的咨询服务(诶??)</li>
</ul>
<p>只要是咱能够帮的上忙的地方,咱会努力。以及既然收了钱就会接纳(几乎全部)咱觉得
(有些)蠢的问题……</p>
<p>至于其它的嘛,让咱再想想……</p>
</div>
<div class="section" id="id6">
<h3>赞助的方式?</h3>
<blockquote>
还是草案(首先要有人愿意赞助……)</blockquote>
<ul class="simple">
<li>「异想星空」 那边用了爱发电,看着就像有本地化的 Patreon ……</li>
<li>在有了一些数字货币(就是 Likecoin 啦……)以后,也有意愿接收数字货币赞助
(但是有人愿意出嘛)</li>
<li>以及可能会有优惠?</li>
</ul>
</div>
</div>
<div class="section" id="id7">
<h2>那另一次又是什么?</h2>
<p>啊没错,咱又双想把
<a class="reference external" href="https://github.com/KenOokamiHoro/it_has_not_get_a_name_yet">某个咱之前挖的大坑</a>
的铲子捡起来了。</p>
<div class="section" id="id9">
<h3>那么这个想法是怎么想起来的呢?</h3>
<p>忘了……依稀还记得有一天吐槽过中文的 GNU/Linux 教程几乎都是默认用户只会用
GNU/Linux 来架设服务的那种。以及觉着
<a class="reference external" href="https://linux.vbird.org/">鸟哥的Linux私房菜</a> 虽然写的很不错,但是是用的
CentOS 当作的教学范本……</p>
<p>于是就有想法写一部和 GNU/Linux 日常使用相关的手册的想法就这么产生了。</p>
</div>
<div class="section" id="id10">
<h3>咱的目标是什么呢?</h3>
<p>简单来说,咱有计划完成一部 GNU/Linux 桌面应用相关的手册,那具体有哪些方面呢?</p>
<ul class="simple">
<li>了解和 GNU/Linux 相关的一些概念</li>
<li>自己动手安装 GNU/Linux 发行版</li>
<li>使用 GNU/Linux 完成某些操作 (不只是运行服务)</li>
</ul>
<p>具体的细节可以去看 <a class="reference external" href="https://github.com/KenOokamiHoro/it_has_not_get_a_name_yet/blob/master/plans.md">咱之前的计划</a></p>
</div>
<div class="section" id="id12">
<h3>自由的理想</h3>
<p>作为 <del>并不纯的</del> 自由软件爱好者,咱也十分理想的想这么做:</p>
<ul class="simple">
<li>使用一个 <a class="reference external" href="https://www.gnu.org/distros/free-distros.html">完全自由的 GNU/Linux 发行版</a>
作为范本,然而中途一度退而求其次的换掉了……</li>
<li>以及尽可能的只用自由软件进行教学(?),虽然有些地方肯定不可能……</li>
<li>以及想提醒大家稍稍关注一下隐私和安全意识(希望如此……)</li>
</ul>
<p>但是……</p>
<hr class="docutils"/>
<p><del>大家快来投币(?)催咱不要咕咕咕啊……</del></p>
<p>想要了解两个之一(或全部)的更多细节的话,欢迎来咱的 Telegram 群交流更多细节:</p>
<p><a class="reference external" href="https://t.me/joinchat/NUTG11WyF6v5gRnOuaL69A">链接在这里</a> ,如果链接失效的话
那就 <a class="reference external" href="https://t.me/Ken_Ookami_Horo">@咱</a> 请求链接好了。</p>
<div class="highlight"><pre><span class="code-line"><span></span>-----BEGIN PGP SIGNED MESSAGE-----</span>
<span class="code-line">Hash: SHA256</span>
<span class="code-line"></span>
<span class="code-line">https://afdian.net/@KenOokamiHoro</span>
<span class="code-line">-----BEGIN PGP SIGNATURE-----</span>
<span class="code-line"></span>
<span class="code-line">iHUEARYIAB0WIQQRcWZ9dT8okL6OyLwb09jRlMdzdQUCXpwxZgAKCRAb09jRlMdz</span>
<span class="code-line">dVFQAQDjUk6b9H8MJaOV7+cX8ssyyBBdh3SsM1I/Sp2LK1S3fAD9HRR9ZzEv0CJR</span>
<span class="code-line">OvdcglAV5zI9Lj1pRjGQvOti7VFaPwk=</span>
<span class="code-line">=ygU/</span>
<span class="code-line">-----END PGP SIGNATURE-----</span>
</pre></div>
</div>
</div>
和 farseerfc 交换问题!2020-01-05T00:00:00+08:002020-01-05T00:00:00+08:00ホロtag:None,2020-01-05:/life/question_exchange_farseerfc.html<p>终于还是咕咕出来了?</p>
<blockquote>
虽然咱催了好久但是最后因为咱在年前把笔记本寄回去的原因结果自己咕了……</blockquote>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id5">咱的问题和 farseerfc 的回答~</a></h2>
<p><a class="reference external" href="https://farseerfc.me/question-exchange-horo.html">直接去他的 Blog 上看咯~</a></p>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id6">farseerfc 的问题和咱的回答~</a></h2>
<p>Q1: 萌狼最開始是如何接觸到 Linux 的呢?有什麼契機導致使用 Linux 麼?</p>
<blockquote>
<p>之前有订阅个叫电脑报的报纸来着,然后有一期介绍了 Ubuntu ,然后就下载来试了试。
(结果马上就把 Windows 的引导搞炸了 😂)</p>
<p>后来咱第一台笔记本运行 Windows 10 有点吃力的时候就往上面装了 Debian,
开始试着做主力了。再后来试着自己搭 Shadowsocks 的服务器,在 VPS 上用上了 CentOS。</p>
<p><a class="reference external" href="https://program-think.blogspot.com/2013/10/linux-distributions-guide.html">看到了这篇文章</a>
开始用 Arch Linux 了。最近是看到了 FSF 的自由发行版推荐,然后也开始用 Parabola 了 🤔</p>
</blockquote>
<p>Q2: 這個筆談又是如何開始的呢 …</p></div><p>终于还是咕咕出来了?</p>
<blockquote>
虽然咱催了好久但是最后因为咱在年前把笔记本寄回去的原因结果自己咕了……</blockquote>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id5">咱的问题和 farseerfc 的回答~</a></h2>
<p><a class="reference external" href="https://farseerfc.me/question-exchange-horo.html">直接去他的 Blog 上看咯~</a></p>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id6">farseerfc 的问题和咱的回答~</a></h2>
<p>Q1: 萌狼最開始是如何接觸到 Linux 的呢?有什麼契機導致使用 Linux 麼?</p>
<blockquote>
<p>之前有订阅个叫电脑报的报纸来着,然后有一期介绍了 Ubuntu ,然后就下载来试了试。
(结果马上就把 Windows 的引导搞炸了 😂)</p>
<p>后来咱第一台笔记本运行 Windows 10 有点吃力的时候就往上面装了 Debian,
开始试着做主力了。再后来试着自己搭 Shadowsocks 的服务器,在 VPS 上用上了 CentOS。</p>
<p><a class="reference external" href="https://program-think.blogspot.com/2013/10/linux-distributions-guide.html">看到了这篇文章</a>
开始用 Arch Linux 了。最近是看到了 FSF 的自由发行版推荐,然后也开始用 Parabola 了 🤔</p>
</blockquote>
<p>Q2: 這個筆談又是如何開始的呢?</p>
<blockquote>
<p>不知道那一天的晚上咱更新友链的时候,就突然想到,友链归友链,
也想稍微深入的了解一下一个个名字后面的人呐,介于咱不想露面也不想出声,就退而求其次(?)的这样开始了。</p>
<p>只是咱提问的话,对方会不会觉得血亏 😂 于是就有了让咱回答对方提出的等量问题的决定(?)。</p>
</blockquote>
<p>Q3: 音遊和 Linux 哪邊對萌狼而言更重要?</p>
<blockquote>
<p>TL;DR: 两边不会因为各种原因顾此失彼。</p>
<p>一样重要,一个是咱为数不多的娱乐(尝试其它类型的游戏的尝试几乎都以发现自己苦手告终……),
一个咱还有兴趣乱钻(?)</p>
<p>或是一样不重要,一个因为成绩不及(不管是已经很强的还是后来居上的)
自闭,一个因为知识和经验不足(又轻易不敢胡乱提问(自闭。嘛反正都差不多就是了(</p>
</blockquote>
<p>Q4: 如何看微軟喜歡 Open Source / Linux 整件事?</p>
<blockquote>
爱“开源”嘛,改不了它骨子里是个私有软件公司的本质鸭,
于是该黑的继续黑(大雾)。什么时候它们说自由化的时候再说吧(?)</blockquote>
<p>Q5: 對我的印象如何?</p>
<blockquote>
完美潇洒的好(?)爸爸(??),咱认为是 #archlinux-cn
里为数不多向往自由的 GNU/Linux 用户,使(cai)用(keng)经验丰富,
经常能提出关键的建议,以及为数不多的能感受到咱的变化还能安慰咱的人。</blockquote>
<p>Q6: 社區水聊時,什麼樣的話題會令萌狼覺得反感,以至於想離開社區避開討論?</p>
<blockquote>
<p>(以下排名不分先后)</p>
<ul>
<li><p class="first">群聊看着很火热但是咱一说话就完全没人搭理的时候;</p>
</li>
<li><p class="first">令不行禁不止的时候,例如群聊管理员在限定主题的群聊带头跑题还没有自觉的。</p>
</li>
<li><p class="first">居高临下的,例如轻易断定朽木不可雕然后劝退的(谁不是那么走过来的呢……
也有可能是咱视野狭窄没见过那种天生神力的人)。</p>
</li>
<li><p class="first">强行安插印象的。(啥,例如说啥都会“奉承”自己的时候,还是不懂……)</p>
</li>
<li><p class="first">一言不合换掉的,就像啥桌面出问题都吹说换某桌面的。</p>
</li>
<li><p class="first">有人讨厌咱的时候,但是只要见不到就没什么大碍。</p>
<p>(不过再想想,咱自己都不保证完全没有问题,也有不时说些怪话的时候,似乎没有什么权力要求别人的样子……)</p>
</li>
</ul>
</blockquote>
<p>Q7: 有什麼話想對我說嘛?</p>
<blockquote>
要努力当个好爸爸哟~ 以及咱们有没有<s 在没有黑暗的地方</s 见面的一天呢?
(为什么咱每次说到见面都能想到那种地方2333……)</blockquote>
</div>
<div class="section" id="id4">
<h2><a class="toc-backref" href="#id7">那么下一个是?</a></h2>
<p>其实还没想好 😂,如果咱友链里剩下的谁愿意自告奋勇也热烈欢迎啦 ……</p>
<p><del>熟悉的感觉+=1……</del></p>
</div>
爱丽丝的树洞 - 在匿名网络(?)的一角2019-12-12T00:00:00+08:002019-12-12T00:00:00+08:00ホロtag:None,2019-12-12:/tech_misc/anonymous_networking.html<p>(一如既往的不擅长写最前面的摘要……其实只是把这里往 i2p 上搬了一份以后
的有感而发罢了。)</p>
<p>至于汝问咱这一个月咕咕咕到哪里去了的话,那肯定是没看前面那篇文章啦……</p>
<div class="section" id="id2">
<h2>从深网到匿名网络</h2>
<p>提到所谓的“深网”,大家最有印象的大概就是那张冰山图了吧:</p>
<img alt="网络层次“冰山”图" class="materialboxed responsive-img" src="/images/anonymous_networking/deepweb.jpeg"/>
<p>普遍认为的深网指的是那些不能用普通的搜索引擎搜索到的内容,这个概念下就有很多啦。
像是各种内部网络的服务、需要登录的外部服务、需要付费解锁的服务甚至某微幕公众号等
等都可以叫做“深网”。</p>
<p>接下来,网络上有一些 IP 地址上看起来没有分配任何服务,因此网络上的流量不太可能
到达这种地区。因为和宇宙学中的黑洞差不多(没啥能从里面出来的?)于是这一段网络
有时也被称作“黑暗网络”。</p>
<p>再接下来,出于各种奇怪的目的(例如隐藏沟通各方的身份、缓解单点故障风险等等),
不少人利用现有的网络搭建了各种需要特殊手段才能进入的网络。再因为某些不可知的宣传
或者渲染恐惧等因素,这种网络一度被错误的称作“暗网”。两大知名匿名网络软件(Tor 和 i2p)
的开发者们也一直在努力的改正这个错误……</p>
<p>比较著名的匿名网络软件有 Tor (因为传输过程中解密流量的过程有点像剥洋葱有时被
称作“洋葱路由”)、i2p(有时和 …</p></div><p>(一如既往的不擅长写最前面的摘要……其实只是把这里往 i2p 上搬了一份以后
的有感而发罢了。)</p>
<p>至于汝问咱这一个月咕咕咕到哪里去了的话,那肯定是没看前面那篇文章啦……</p>
<div class="section" id="id2">
<h2>从深网到匿名网络</h2>
<p>提到所谓的“深网”,大家最有印象的大概就是那张冰山图了吧:</p>
<img alt="网络层次“冰山”图" class="materialboxed responsive-img" src="/images/anonymous_networking/deepweb.jpeg"/>
<p>普遍认为的深网指的是那些不能用普通的搜索引擎搜索到的内容,这个概念下就有很多啦。
像是各种内部网络的服务、需要登录的外部服务、需要付费解锁的服务甚至某微幕公众号等
等都可以叫做“深网”。</p>
<p>接下来,网络上有一些 IP 地址上看起来没有分配任何服务,因此网络上的流量不太可能
到达这种地区。因为和宇宙学中的黑洞差不多(没啥能从里面出来的?)于是这一段网络
有时也被称作“黑暗网络”。</p>
<p>再接下来,出于各种奇怪的目的(例如隐藏沟通各方的身份、缓解单点故障风险等等),
不少人利用现有的网络搭建了各种需要特殊手段才能进入的网络。再因为某些不可知的宣传
或者渲染恐惧等因素,这种网络一度被错误的称作“暗网”。两大知名匿名网络软件(Tor 和 i2p)
的开发者们也一直在努力的改正这个错误……</p>
<p>比较著名的匿名网络软件有 Tor (因为传输过程中解密流量的过程有点像剥洋葱有时被
称作“洋葱路由”)、i2p(有时和 Tor 对应的被称作“大蒜路由”)和 Freenet 自由网
等等。有的网络的功能要点在于分布式和去中心化而不是匿名,因此通常不被称作是匿名网络。
像是 ZeroNet 和 ipfs 等等。</p>
<blockquote>
出于使用经验在内的种种原因(意思就是这么多咱没都用过),咱就先介绍前两个
比较著名的好了……</blockquote>
</div>
<div class="section" id="id3">
<h2>兔子洞前的兔子?</h2>
<p>Tor是实现匿名通信的自由软件。其名源于“The Onion Router”(洋葱路由器)
的英语缩写。用户可透过Tor接达由全球志愿者免费提供,包含7000+个中继
的覆盖网络,从而达至隐藏用户真实地址、避免网络监控及流量分析的目的。</p>
<p>Tor用户的互联网活动(包括浏览在线网站、帖子以及即时消息等通信形式)
相对较难追踪。Tor的设计原意在于保障用户的个人隐私,以及不受监控地进
行秘密通信的自由和能力。Tor透过在传输协议栈中的应用层进行加密,从而
实现洋葱路由这一种技术。</p>
<p>Tor会对包括下一个节点的IP地址在内的数据,
进行多次加密,并透过虚拟电路(包括随机选择的Tor节点)将其提交。
每个中继都会对一层加密的数据进行解密,以知道数据的下一个发送目的地,
然后将剩余的加密数据发送给它。最后的中继会解密最内层的加密数据,
并在不会泄露或得知源IP地址的情况下,将原始数据发送至目标地址。</p>
<p>值得注意的地方是(?),这个让各国政府和监控部门头痛不已的网络开发过程
中的主要赞助者也包括美国海军研究办公室和联邦政府等等政府部门。(自己
帮忙造了个烫手山芋么……)</p>
<p>I2P(Invisible Internet Project即“隐形网计划”),是一项混合授权的匿名网络项目。</p>
<p>I2P网络是由I2P路由器以大蒜路由方式组成的表层网络,
创建于其上的应用程序可以安全匿名的相互通信。它可以同时使用UDP及
TCP协议,支持UPnP映射。其应用包括匿名上网、聊天、撰写博客和文件传输。</p>
<p>I2P是可伸缩性强,具有自我组织与恢复能力的包切换匿名网络。
其上运行有多种不同的匿名安全程序,各程序可以自行决定匿名性、延迟、
流量平衡而不用考虑混淆式路由网络的具体实现。它们的数据活动可以与现有
的I2P用户的匿名数据相混合。</p>
<p>Tor 和 i2p 的区别主要在于路由上,Tor 所使用的“洋葱路由”使用同一条
网络链路实现数据的发送和接收,而 i2p 使用的“大蒜路由”使用多条网络链路
发送数据和接受数据。</p>
<img alt="Tor 和 i2p 在路由上的区别。" class="materialboxed responsive-img" src="/images/anonymous_networking/i2pvstor_zh.png"/>
<p>以及为了获得网络中的中继列表, Tor 需要和某几个固定的目录服务器联系,于是
目录服务器就很容易成为审查者封锁的目标。相较之下, i2p 使用 Kad 算法获得网络中
节点的数据(就像 eMule 一样),因此只要客户端还能连接到一个中继,就能取得连接
需要的服务器信息,封锁难度也随之上升。</p>
<p>最后的最后(?), Tor 的主要目的是为了相对匿名(?)地访问常规网站,如果汝
去看 Tor 的流量统计的话,就会发现访问洋葱服务的流量只占 Tor 网络中总体流量
的小部分。</p>
<p>而 i2p 设计的主要目的就是构建一个匿名网络,因此不像 Tor 那样有很多的访问明网
(普通的互联网)的节点(经常只有一个,或者没有……)。以及由于通过多条链路发送
和接收数据的原因,速度也稍微慢一些。</p>
<blockquote>
i2p 自己有一份文档稍微区分了一下自己和 Tor: <a class="reference external" href="https://geti2p.net/zh-cn/comparison/tor">https://geti2p.net/zh-cn/comparison/tor</a></blockquote>
<p>关于这两个匿名网络软件的使用方法嘛,并不是这里的重点(啥?)。 最好的教程还是
官方提供的:</p>
<ul class="simple">
<li>Tor Browser 用户手册: <a class="reference external" href="https://tb-manual.torproject.org/zh-CN/">https://tb-manual.torproject.org/zh-CN/</a></li>
<li>i2p 常见问题: <a class="reference external" href="https://geti2p.net/zh-cn/faq">https://geti2p.net/zh-cn/faq</a></li>
</ul>
</div>
<div class="section" id="id4">
<h2>众人拾柴火焰高 - 帮助匿名网络成长壮大</h2>
<p>什么网络都要有足够多的人使用才能发展,就像现在的互联网一样。对于术业有专攻的
匿名网络来说更是如此。在汝使用过这些匿名网络工具之后,有没有想过助它一臂之力呢?</p>
<ul class="simple">
<li>宣传和修正错误观念</li>
</ul>
<p>向朋友们宣传匿名网络的存在和它的重要性,以及他们了解到
匿名网络不只是某些破坏行为的栖息之所,它还是保护汝所珍视的某些事物的关键武器。</p>
<ul class="simple">
<li>架设匿名网络服务,或者把汝的普通网站调整成匿名网络友好</li>
</ul>
<p>出于某些商业或政治因素,大多数网站对来自匿名网络的访问者有各种各样的限制
(例如要求输入验证码或者拒绝访问等等)。
如果汝是一个网站的所有者(像咱一样),汝可以考虑为匿名网络使用者放行(例如
如果汝有在使用 Cloudflare 的话,可以考虑为 Tor 的出口 IP 设置白名单),或者
更进一步,在匿名网络上放置汝的网站。(当然可能需要稍微调整一下汝的网站以适应
匿名网络的需求)</p>
<ul class="simple">
<li>架设或赞助匿名网络节点</li>
</ul>
<p>匿名网络毕竟还要靠普通网络中的设备来驱动,通过增加匿名网络中的节点(无论
是汝自己亲力亲为还是提供资金给其它提供者),既可以部分提高(?)网络的速度,
也可以增强网络的健壮性。</p>
<ul class="simple">
<li>参与匿名网络软件开发</li>
</ul>
<p>不一定是编写代码啦,撰写文档,提供翻译,参加测试和讨论也都是行之有效的方法呢。</p>
<p>Tor 和 i2p 都有自己的社区页面,从那里开始汝的第一步吧!</p>
<ul class="simple">
<li>Tor - Community: <a class="reference external" href="https://community.torproject.org/">https://community.torproject.org/</a></li>
<li>i2p - 参与进来: <a class="reference external" href="https://geti2p.net/zh-cn/get-involved">https://geti2p.net/zh-cn/get-involved</a></li>
</ul>
<hr class="docutils"/>
<ul class="simple">
<li>可以先试试访问这里的匿名网络网站,
<a class="reference external" href="http://qty3gmiq3zhs7whorla4ynvmndppmn5rgcuvsltgz7xl6xnxdxtp6zqd.onion/">http://qty3gmiq3zhs7whorla4ynvmndppmn5rgcuvsltgz7xl6xnxdxtp6zqd.onion/</a>
或者 <a class="reference external" href="http://stats.i2p/cgi-bin/jump.cgi?a=yoitsu.i2p/">http://stats.i2p/cgi-bin/jump.cgi?a=yoitsu.i2p/</a> 啦~</li>
<li>以及如果汝也有兴趣这样做的话,(咕咕咕)</li>
</ul>
</div>
状态回报 - 201911192019-11-19T00:00:00+08:002019-11-19T00:00:00+08:00ホロtag:None,2019-11-19:/life/status_20191119.html<div class="section" id="id2">
<h2>这啥?</h2>
<p>嘛咱也不知道叫什么好 😂(汝翻翻之前起这种 slug 的文章?)</p>
</div>
<div class="section" id="id3">
<h2>在不同的地方写不同的字</h2>
<p>就像标题一样,咱要挖新的大坑啦(?)……</p>
<ul>
<li><p class="first"><a class="reference external" href="https://blog.horo.moe/">约伊兹的萌狼乡手札 Another</a>
(名字什么的最难起了),在折腾了那么久博客软件和生成器后还是回到最早用的 WordPress 了……
(因为 Like Button 这时候只支持 Matters/Medium 和 WordPress 鸭……)之后好多图的文章大概会发到那里。</p>
</li>
<li><p class="first"><a class="reference external" href="https://matters.news/@kenookamihoro">KenOokamiHoro @ Matters</a></p>
<blockquote>
<p>Matters 是一個以分佈式網絡為基礎、加密貨幣驅動的公共討論平台。</p>
<p>所有在 Matters 上發佈的作品(不含評論),皆會上載到星際文件系統(InterPlanetary File
System,IPFS)的節點上,實現作品內容的分佈式存儲,完成將數據回歸創作者的第一步。</p>
<p>Matters 希望圍繞公共議題、知識生產,重構內容價值生態,搭建優質社群平台,
保護創作版權;以獨特算法令優質內容浮現,以數字貨幣讓創作者、參與者獲得持續回報 …</p></blockquote></li></ul></div><div class="section" id="id2">
<h2>这啥?</h2>
<p>嘛咱也不知道叫什么好 😂(汝翻翻之前起这种 slug 的文章?)</p>
</div>
<div class="section" id="id3">
<h2>在不同的地方写不同的字</h2>
<p>就像标题一样,咱要挖新的大坑啦(?)……</p>
<ul>
<li><p class="first"><a class="reference external" href="https://blog.horo.moe/">约伊兹的萌狼乡手札 Another</a>
(名字什么的最难起了),在折腾了那么久博客软件和生成器后还是回到最早用的 WordPress 了……
(因为 Like Button 这时候只支持 Matters/Medium 和 WordPress 鸭……)之后好多图的文章大概会发到那里。</p>
</li>
<li><p class="first"><a class="reference external" href="https://matters.news/@kenookamihoro">KenOokamiHoro @ Matters</a></p>
<blockquote>
<p>Matters 是一個以分佈式網絡為基礎、加密貨幣驅動的公共討論平台。</p>
<p>所有在 Matters 上發佈的作品(不含評論),皆會上載到星際文件系統(InterPlanetary File
System,IPFS)的節點上,實現作品內容的分佈式存儲,完成將數據回歸創作者的第一步。</p>
<p>Matters 希望圍繞公共議題、知識生產,重構內容價值生態,搭建優質社群平台,
保護創作版權;以獨特算法令優質內容浮現,以數字貨幣讓創作者、參與者獲得持續回報。</p>
<p>2019 年 10 月,Matters 和 LikeCoin 聯手,將 LikeCoin 這一基於寫作者創造力為衡量的
加密貨幣引入到 Matters 自由創作和公共討論空間之中,平台效應以收入的形式回饋給作者。</p>
<p class="attribution">—<a class="reference external" href="https://matters.news/about/">Matters - 关于我们</a></p>
</blockquote>
<p>初期大概会把这边不会更新的文章放上去吧(因为 IPFS 的特性以致于 Matters 不能编辑已发表的文章),
以后可能会新写些什么。</p>
<p>除了给文章点赞以外,大家也可以考虑 <a class="reference external" href="https://liker.land/civic?from=matters">加入赞赏公民</a> ,
助力咱和各位独立作者。</p>
</li>
<li><p class="first">至于这里嘛,咱只能讲短期内不会消失,不敢保证一直都在呐…… 这里应该还是以平时 <del>瞎</del> 折腾的记录为主了。
剩下有些关于朋友和生活的系列文章可能会先改在 Another 上发布。</p>
</li>
</ul>
<hr class="docutils"/>
<p><del>大概就是这个样子……</del></p>
</div>
一点点深入端到端加密 -- 公钥密码系统如何保护我们的信息?2019-11-05T00:00:00+08:002019-11-05T00:00:00+08:00ホロtag:None,2019-11-05:/translation/deep-dive-end-end-encryption-how-do-public-key-encryption-systems-work.html<p>来自 <a class="reference external" href="https://ssd.eff.org/en/module/deep-dive-end-end-encryption-how-do-public-key-encryption-systems-work">https://ssd.eff.org/en/module/deep-dive-end-end-encryption-how-do-public-key-encryption-systems-work</a></p>
<blockquote>
这个页面引用了 <a class="reference external" href="https://ssd.eff.org">https://ssd.eff.org</a> 的图片呐,汝可能需要根据情况调整汝浏览器
扩展的设置来查看它们。</blockquote>
<p>如果使用得当,端到端加密可以保护汝的消息、文字甚至文件除了为汝期望的接收者以外
其他的家伙都看不到。它也能保证汝收到的消息确实来自汝所认识的那一位发件人(而不是
别的冒充他/她/它的谁),是呗~</p>
<p>过去的几年中,端到端加密工具如雨后春笋般在各个领域出现(而且达到了可用标准)。例如
像 Signal 这样支持文字消息、语音/视频通话和文件传送的 IM 就是其中的一种咯。这些工具让
监听者无法读取消息的内容(包括服务提供商自己)。</p>
<p>是不是觉得有些端到端加密的实现难以理解?在汝开始使用这些端到端加密工具以前,咱们推荐汝先花一点时间了解一下公钥密码学的基础。</p>
<p>这篇文章所讨论的公钥密码学正是端到端加密所依赖的基础。啥,汝想了解其它的加密类型?去翻翻咱们以前写(翻译)的
<a class="reference external" href="/translation/what_should_i_know_about_encryption.html">《当汝看到加密 …</a></p><p>来自 <a class="reference external" href="https://ssd.eff.org/en/module/deep-dive-end-end-encryption-how-do-public-key-encryption-systems-work">https://ssd.eff.org/en/module/deep-dive-end-end-encryption-how-do-public-key-encryption-systems-work</a></p>
<blockquote>
这个页面引用了 <a class="reference external" href="https://ssd.eff.org">https://ssd.eff.org</a> 的图片呐,汝可能需要根据情况调整汝浏览器
扩展的设置来查看它们。</blockquote>
<p>如果使用得当,端到端加密可以保护汝的消息、文字甚至文件除了为汝期望的接收者以外
其他的家伙都看不到。它也能保证汝收到的消息确实来自汝所认识的那一位发件人(而不是
别的冒充他/她/它的谁),是呗~</p>
<p>过去的几年中,端到端加密工具如雨后春笋般在各个领域出现(而且达到了可用标准)。例如
像 Signal 这样支持文字消息、语音/视频通话和文件传送的 IM 就是其中的一种咯。这些工具让
监听者无法读取消息的内容(包括服务提供商自己)。</p>
<p>是不是觉得有些端到端加密的实现难以理解?在汝开始使用这些端到端加密工具以前,咱们推荐汝先花一点时间了解一下公钥密码学的基础。</p>
<p>这篇文章所讨论的公钥密码学正是端到端加密所依赖的基础。啥,汝想了解其它的加密类型?去翻翻咱们以前写(翻译)的
<a class="reference external" href="/translation/what_should_i_know_about_encryption.html">《当汝看到加密(encryption)时应该想到什么》</a> 咯~</p>
<p>理解公钥密码学的基本原则(大概)能让汝更正确的使用那些工具,例如公钥加密可以做什么,不能做什么,和何时以及如何使用它。</p>
<div class="section" id="id2">
<h2>太长不看版小结</h2>
<ul class="simple">
<li>对称密码系统中,加密和解密使用相同的密钥。</li>
<li>公钥密码系统中,参加信息交换的双方各自有自己的两对密钥,称作私钥和公钥。</li>
<li>公钥可以公开,私钥需要安全保护。</li>
<li>发件人用收件人的公钥加密消息,收件人用自己的私钥解密消息。</li>
<li>发件人用自己的私钥签名消息,收件人用发件人的公钥验证消息。</li>
<li>同样地,公钥密码系统保护的是消息的内容而不是元数据。</li>
</ul>
</div>
<div class="section" id="id3">
<h2>加密做什么?</h2>
<p>当汝以加密的方式传输一些数据的时候:</p>
<ul class="simple">
<li>可以清楚的直接读取的消息(称作“明文”,例如“hello mum”)被加密的话会被混乱成轻易无法理解的形式(例如“OhsieW5ge+osh1aehah6”,称作“密文”)。</li>
<li>这段看起来很像乱码的消息在网上传递。</li>
<li>消息唯一的接收者可以通过某些方法把它还原成原来的形式(“hello mum”),这个过程称作“解密”。</li>
</ul>
</div>
<div class="section" id="id4">
<h2>对称加密:以一把密钥传递私密信息的故事</h2>
<blockquote>
<p>名字什么的最难起啦……以及平常的 Bob 和 Alice 呢?</p>
<p><a class="reference external" href="https://en.wikipedia.org/wiki/Alice_and_Bob">汝不知道 Alice 和 Bob 是谁?</a></p>
</blockquote>
<p>Julia 想写张小纸条告诉她的朋友 César “Meet me in the garden,”(在花园和我见面),不过她当然不想让她的同学也知道。</p>
<img alt="在多个人之间传递信息" class="materialboxed responsive-img" src="https://ssd.eff.org/files/2018/05/14/1_0.png"/>
<p>(汝有没有在上课的时候给谁传过小纸条咧?)</p>
<p>Julia 的字条会在同学间传递好几次之后才能到 César 的手上。不排除中间有谁会在传递之前悄悄看上一眼,
或者自己抄一份然后记下 Julia 写字条的时间什么的。(汝在期望给汝传字条的同学不会多管闲事嘛?)</p>
<img alt="信息的传递过程可(ken)能(ding)会被偷窥" class="materialboxed responsive-img" src="https://ssd.eff.org/files/2018/05/14/2_0.png"/>
<p>Julia 决定用密钥 “3” 来加密她们的消息,每个字母向后移动三位,例如 A->D, B->E 等等。
其实这简单的密钥加密以后的消息看起来像胡言乱语,别有用心的某人还是能够通过尝试所有的组合
的方式来“暴力破解”。换句话说,他们能为了得到解密的答案一直猜下去。</p>
<p>这种移位三个字母的方法其实是一种古老的加密方法,相传是罗马帝国的凯撒大帝发明的,所以也称作凯撒密码。
在这个例子中,字母移位的数量(3)被同时用于加密和解密,这被称作对称加密。</p>
<p>凯撒加密其实挺弱的(按现代的话来说,可以通过频率分析一类的手段破译出密钥(字母移位的数量))。
不过这么长时间过去了,在神奇的算法和电脑的帮助下,加密的密钥可以生成的越来越长,越来越难猜。
对称加密也用在越来越多的场景中。</p>
<p>(汝来想一想</p>
<p>对称加密</p>
<p>有没有问题?)</p>
<hr class="docutils"/>
<p>不过咧,对称加密还剩下一个问题。如果有人在 Julia 和 César 交换密钥的时候窃听,然后窃取密钥怎么办?
(毕竟密钥没法再加密的传递出去……) 或者如果她们俩没法在现实见面呢?(例如离得相当远?)</p>
<p>于是让咱们跳过纷繁冗杂的学习过程,就当她们已经熟练掌握公钥加密了吧(大嘘)。
窃听者不太可能得到她俩解密消息的密钥——因为她们根本就不用分享呀。
在公钥加密的过程中,加密和解密的密钥是不同的。</p>
</div>
<div class="section" id="id5">
<h2>公钥密码:密钥之双城记</h2>
<p>拿上汝手边的放大镜(啥?),让咱们离问题更近一些:在有人窃听对话的前提下,
如何只把对称解密的密钥发送给接收者咧,特别是在双方的物理距离非常远的话?</p>
<p>公钥密码学(有时候汝也会看到非对称加密之类的说法,这俩是一样的)解决了这个问题。
它允许每个人在对话中创建两个密钥——通常称作公钥和私钥。两把密钥相互关联,通常是
具有某些特别的数学性质的特别大的数字。如果汝用谁的公钥编码了一段消息,那么他们就
可以用他们的私钥解码。</p>
<p>Julia 和 César 现在要用公钥密码发送加密的消息,于是之前传小纸条的同学们就理所当然的被
一台台电脑取代了呗。它们可能是她们俩之间的电脑,例如 Wi-Fi 接入点,ISP,她们所使用的邮箱的
服务器等等。自然它们也能复制双方传递的消息的内容和记录消息传递的时间。</p>
<img alt="在互联网上传递信息时,会经过多个中继" class="materialboxed responsive-img" src="https://ssd.eff.org/files/2018/05/14/4_0.png"/>
<p>虽然她们不介意中间有人会看到她们的消息,不过自然的还是不想让别人看到消息的内容。</p>
<p>首先,Julia 需要 César 的公钥,于是 César 把她的公钥寄给了 Julia (例如通过邮件)。她并不
介意通过不安全的通道传递公钥,因为公钥本来就是她可以自由分享的东西。</p>
<p>需要注意的是,公钥和现实生活中的钥匙还有一些区别的。因为 César 可以把公钥拆分成几部分,然后通过不同的通道
发送出去。</p>
<img alt="César 发送公钥给 Julia" class="materialboxed responsive-img" src="https://ssd.eff.org/files/2018/05/14/5_0.png"/>
<p>有了公钥以后,Julia 就能给她发送加密的信息了:</p>
<blockquote>
“Meet me in the garden.”</blockquote>
<p>Julia 发出了只给 César 加密的消息。</p>
<img alt="私钥可以解密由同一人的公钥加密的消息" class="materialboxed responsive-img" src="https://ssd.eff.org/files/2018/05/14/6_0.png"/>
<p>虽然她们都可以理解这条消息,剩下的人都认为消息的内容是乱码,
不过中间的人(或者电脑)还是能看到元数据,例如主题、时间、发件人和收件人。</p>
<img alt="元数据在信息的传递过程中不会被加密" class="materialboxed responsive-img" src="https://ssd.eff.org/files/2018/05/14/7_0.png"/>
<p>因为消息是用 César 的公钥加密的,因此只有 César 和 Julia(因为是发件人)能阅读这条消息。</p>
<p>César 用她的私钥解密消息:</p>
<img alt="私钥可以解密由同一人的公钥加密的消息" class="materialboxed responsive-img" src="https://ssd.eff.org/files/2018/05/14/8_0.png"/>
<p>简单的概括:</p>
<ul class="simple">
<li>公钥密码可以让汝(和其他人)在开放和不安全的通道中传递公钥。</li>
<li>有了朋友的公钥以后,汝就可以给他们发送加密的信息。</li>
<li>汝的私钥用来解密发送给汝的加密的信息。</li>
<li>中间人——像是服务和网络提供商,在消息传递的过程中可以看到一些元数据,例如谁写了
这些消息,发送给谁,接收或者发送的时间和消息的主题等等。</li>
</ul>
<p>(汝觉得现在可以高枕无忧了?)</p>
</div>
<div class="section" id="id6">
<h2>还有一件事……如何识别假冒?</h2>
<p>在上面的例子中,中间人能够看到整个过程中的元数据。</p>
<p>所以让咱们来耍点坏心眼,某个中间人想知道她们在谈论什么,因此在监听她们。</p>
<p>坏人能够用一些手段让 Julia 得到假的公钥。Julia 没注意到这不是 César 的公钥,还是用它加密了要发给 César 的消息。</p>
<p>随后坏人就得到了本该加密给 César 的消息,它可以看到消息的原始内容,然后再发送给 César 。</p>
<img alt="心怀恶意的中间人可以假冒某人发送消息" class="materialboxed responsive-img" src="https://ssd.eff.org/files/2018/05/14/9_0.png"/>
<p>甚至可以篡改消息的内容:</p>
<img alt="心怀恶意的中间人可以假冒某人发送篡改的消息" class="materialboxed responsive-img" src="https://ssd.eff.org/files/2018/05/14/10_0.png"/>
<p>于是 Julia 和 César 如约在花园见面,没想到这里已经有人守候多时了……</p>
<img alt="心怀恶意的中间人" class="materialboxed responsive-img" src="https://ssd.eff.org/files/2018/05/14/11_0.png"/>
<p>这就是所谓的“中间人攻击”啦,其实攻击的家伙也不一定是人……幸运的是,公钥密码学有防御这种攻击的手段。</p>
<p>公钥密码学可以让汝通过一种称作“指纹验证”的方式来确认某把密钥确实属于汝认识的某人,(“指纹”
指的是公钥通过某种摘要算法计算出的一串字母,通常比公钥短的多)
这种过程最好在现实生活中完成。如果汝可以和谁面对面的话,汝可以检查双方拥有的公钥的指纹的每一个字母
是否一致。虽然一个一个的看很枯燥,但为了保证汝手上的某把私钥确实属于汝认识的某人的话,就稍微忍受一下吧……</p>
<p>其它的端到端加密应用也拥有类似的指纹验证机制,虽然可能方法各不相同。有些方式比较传统,汝要小心比较双方屏幕上显示的内容是否一致。
有的方法比较“新鲜”,例如用汝手上的设备扫描对方显示的二维码来“验证”某个设备。</p>
<img alt="支持扫描二维码验证的端到端加密应用" class="materialboxed responsive-img" src="https://ssd.eff.org/files/2018/05/14/12_0.png"/>
<p>如果汝没法和对方见面的话( <del>担心有去无回么……</del> ),汝可以在其它已知安全的地方交换指纹,例如端到端加密的聊天软件,或者一个 HTTPS 网站。</p>
<img alt="通过其它方式传递指纹A" class="materialboxed responsive-img" src="https://ssd.eff.org/files/2018/05/14/13_0.png"/>
<img alt="通过其它方式传递指纹B" class="materialboxed responsive-img" src="https://ssd.eff.org/files/2018/05/14/14_0.png"/>
<p>总结一下:</p>
<ul class="simple">
<li>中间人攻击是指有人在某个双方之间拦截传递的消息,攻击者可以修改消息、或是只是简单地监听。</li>
<li>公钥密码让汝通过验证发送者和接收者的身份来防御中间人攻击,这种方法被称作“指纹验证”。</li>
<li>汝(或者汝的朋友)的公钥也包含一些被称作“指纹”的信息,汝可以通过指纹验证公钥持有人的身份。</li>
<li>私钥用于解密发给汝的消息,也用来以汝的名义签名消息。</li>
</ul>
</div>
<div class="section" id="id7">
<h2>签名时代</h2>
<p>公钥密码让汝不用冒险把解密密钥发送给汝私密消息的接收者,因为他们已经拥有了,就是他们的私钥。
因为公钥只用来加密而不能解密,因此汝(和汝消息的接收者)可以把公钥分享出去,汝发送私密信息所需要
的也只有接收者的公钥而已。</p>
<p>不过只有这样么……咱们已经知道了用特定公钥加密的消息只有用公钥对应的私钥解密。其实反过来也是,
用特定私钥加密的消息只能用私钥对应的公钥来解密。</p>
<p>啥,这有啥用?汝用汝自己的私钥加密一段消息然后让随便什么人用汝的公钥解密来看嘛……
别那么着急嘛,再想想,例如汝写了一句话,然后用汝的私钥加密。大家都能解密汝的消息,
但只有持有汝私钥的人能写出这条消息。如果汝能小心翼翼的保护汝的私钥的话,多半只有汝
自己有汝自己的私钥,也就只有汝能发出这条消息了是呗~</p>
<p>通过用汝的私钥加密消息,汝确保了这条消息只会是汝所写的,是不是感觉哪里眼熟?没错,就和
实际生活中汝在某些地方签下汝自己的名字一样,汝对汝的数字消息完成了同样的操作。</p>
<p>签名同时也能防止篡改。毕竟大多数情况下,其他人不能用汝的私钥重新签名是吧……
因此,已签名的消息可确保它来自某个特定来源,并且不会在传输过程中被搞得一团糟。</p>
</div>
<div class="section" id="id8">
<h2>复习:关于公钥加密</h2>
<p>公钥密码让汝可以把消息安全的发给知道对方公钥的人咯。</p>
<p>如果有人知道了汝的公钥:</p>
<ul class="simple">
<li>他们可以发送只有用汝的私钥解密的私密信息。</li>
<li>汝可以用汝的私钥签名消息,而他们可以用公钥验证签名有效。</li>
</ul>
<p>如果汝知道其他人的公钥:</p>
<ul class="simple">
<li>汝可以解密来自他/她/它的消息,而且可以验证消息确实来自那一位。</li>
</ul>
<p>所以很明显啦,汝(或其他人)的公钥传播的越广,这个加密方式就越有用处是呗。既然
公钥可以分享,汝也可以以现实中的什么东西类比一下啦,例如通讯录或者电话黄页什么的:
它是公开的,人们知道哪里可以找到,汝也能广泛的分享它。</p>
<p>至于私钥呢,汝还是拿现实中的什么东西类比一下好了,例如开门或者各种锁的钥匙。汝的
私钥用来加密和解密消息,所以务必要像对待手上真正的钥匙一样对待它。</p>
<blockquote>
<p>为啥汝的私钥明显的(如此)重要?如果汝丢了钥匙,汝就有可能打不开某处。公钥加密中私钥
也是如此,如果汝弄丢了私钥,汝就没法解密发送给汝的信息了。如果谁拿到了汝的钥匙,他就能
以汝的名义打开某些地方。如果其他人拿到了汝的私钥(例如物理接触到汝的电脑,通过恶意软件,
或者只是因为汝像个大笨驴一样把汝的私钥发了出来等等),他就能读取汝加密的信息,或者冒充汝
做些什么。</p>
<p>也曾经有听说过某些政府试图窃取某些人的私钥的经历(像是强行收缴电脑啊,钓鱼攻击或者想方设法的
安装恶意软件等等)。这当然是对公钥加密安全性的损害。
既然汝大多数时候遇不到那么交迫的情况,那咱们来换个栗子:有扒手在汝停下来休息的时候偷走了汝的
钥匙,然后去配了一把新的,把原来的钥匙悄悄地放回汝的口袋里。汝可能觉得什么都没发生,然后发
现有人光顾了汝的家门……</p>
</blockquote>
<p>所以又到了老生常谈的威胁模型时间了:估算汝可能遇到的风险,并设计相应的应对措施。
例如既然汝担心谁觊觎汝的私钥的话,汝大概就不会使用某些浏览器中的端到端加密方案了吧,汝也会想方设法
确保汝的私钥只留在汝自己的电脑上而不是别处(例如其他人的服务器或所谓的云端)。</p>
</div>
<div class="section" id="pgp">
<h2>公钥密码学总结和典型实例: PGP</h2>
<p>虽然咱们是分开演示的对称加密和公钥机密,不过公钥加密的过程中也有机会用到对称加密啦。
例如是记得操作中,公钥加密加密的是解密对称加密的消息的密钥。PGP 就是把对称加密和公钥加密
结合起来的典型例子。</p>
<p>(汝有时会看到像是 openPGP 或者 GnuPG 一类的家伙,是因为 PGP 本身是私有的啦,于是不少人开发了
类似的软件,它们都支持 openPGP 规范。而其中最常用的就是 GNU 开发的 GnuPG 咯……)</p>
</div>
<div class="section" id="id9">
<h2>所以那些密钥到底是什么,它们是怎么结合在一起的?</h2>
<p>公钥密码学基于有两把密钥这一前提,一个负责加密,一个负责解密。
基本上,汝可以把其中一把密钥在互联网这样的不安全通道上传递,这把称作公钥。
汝可以把公钥公开到随便哪里去而不会影响到加密信息的安全性。</p>
<img alt="密钥对的组成" class="materialboxed responsive-img" src="https://ssd.eff.org/files/2018/05/14/15_0.png"/>
<p>(公钥和私钥构成一对密钥,有时也把它俩一起称作一个密钥对)</p>
<p>既然公钥可以分享,汝也可以以现实中的什么东西类比一下啦,例如通讯录或者电话黄页什么的:
它是公开的,人们知道哪里可以找到,汝也能广泛的分享它。</p>
<p>至于私钥呢,汝还是拿现实中的什么东西类比一下好了,例如开门或者各种锁的钥匙。汝的
私钥用来加密和解密消息,所以务必要像对待手上真正的钥匙一样对待它。</p>
<p>让咱们来看一看一种经常在公钥密码中用于生成密钥的算法,叫做 RSA (以发明这种算法的三位科学家
罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)
的姓氏命名)。</p>
<img alt="公钥和私钥实际上是两组大数" class="materialboxed responsive-img" src="https://ssd.eff.org/files/2018/05/14/16_0.png"/>
<p>(私钥由两组特别大的质数组成)</p>
<img alt="公钥和私钥实际上是两组大数_" class="materialboxed responsive-img" src="https://ssd.eff.org/files/2018/05/14/17_0.png"/>
<p>(公钥是私钥的两组数的乘积,因为私钥是两组特别大的质数,所以在相当长的一段时间内很难猜出来)</p>
<p>公钥和私钥同生共死(?只是一起生成啦……),而且都依赖于特别大的秘密质数。私钥由两组特别大的质数组成,
而公钥就是它们的乘积。以公钥推算出私钥的两个质数的尝试十分困难。</p>
<p>为啥咧?因为现在还没有一个又快又稳定的分解质因数的算法啦……随着时间的推进,现代的加密套件也允许用户生成
更大更难猜的质数作为密钥。</p>
<p>(以及随着时间推进,更现代的加密算法也被发明出来,像是椭圆曲线加密算法(ECC)和 ElGamal 等等。)</p>
<p>这就是公钥加密的强大之处了,参加加密信息交换的双方在不安全的通道中交换的信息只有双方的公钥啦!
因为不需要交换私钥,所以(理想的情况下)私钥自然不会泄漏。</p>
<p>铭记:需要双方的公钥让公钥密码工作。</p>
<p>换种说法:公钥和私钥一起生成,像阴阳一样交织在一起。</p>
<img alt="公钥和私钥阴阳调和(大雾)" class="materialboxed responsive-img" src="https://ssd.eff.org/files/2018/05/14/18_0.png"/>
<p>公钥可以搜索和分享,汝可以把它随便发送到哪里去。如果汝不介意暴露邮件地址的话,汝可以把它放在社交媒体
或是汝自己的网站上。</p>
<p>私钥需要安全的保护起来。因为越多的话保持安全和秘密就越困难,所以汝肯定只想留着一把(而且不要搞丢),
而不是把它分享出去或者弄得复件到处都是。(?)</p>
</div>
<div class="section" id="id10">
<h2>PGP 如何工作</h2>
<p>所以说了那么多,PGP 到底是如何工作的呢?假设汝要向 Aarav 发送一些私密消息:</p>
<ul class="simple">
<li>Aarav 有一对密钥,像一个优秀的公钥密码用户一样,他把他的公钥放在了他有 HTTPS 的网站上。</li>
<li>汝下载了他的公钥,用它加密了一些消息发送给他。</li>
<li>因为只有他有他自己的私钥,所以只有他能解密发送给他的消息。</li>
</ul>
<p>PGP(Pretty Good Privacy,优良保密协议)就是聚焦于创建和使用公钥和私钥这些细节的结合。
汝可以创建一对密钥,用密码保护私钥,以及用私钥和公钥加密和签名文本。</p>
<blockquote>
如果汝一定要总结一下的话:用足够强的密码短语保护汝的私钥,而且放在安全的地方。</blockquote>
</div>
<div class="section" id="id11">
<h2>元数据:公钥加密不是银弹</h2>
<p>公钥加密的一切(秘密,一致性,防止篡改)都是在保护消息的内容。但这绝对不是汝唯一在
隐私上需要关注的问题,就像前面所说的一样,关于消息的信息(有时被称作“元数据”)
也可能暴露消息的内容。</p>
<p>某些情况下,仅仅是交换加密的信息也有可能让汝遇到危险。例如某些政权中的持不同政见者,
或者仅仅是拒绝解密消息。</p>
<p>伪装汝在和某人交流的事实也许会相当困难。在前面的 PGP 中,一种可行的方法是双方使用
通过匿名网络(例如 Tor )访问的匿名邮箱。在这种情况下, PGP 还是十分有用,无论是
在其他人间保护双方的私密消息,还是证明消息的作者和传递过程没被篡改。</p>
<p>说了那么多,不妨亲手试试看一些端到端加密的应用吧,
例如 <a class="reference external" href="https://signal.org/">可用于 iOS 和 Android 的 Signal</a></p>
</div>
Arch Linux 的衍生发行版们2019-10-24T00:00:00+08:002019-10-24T00:00:00+08:00ホロtag:None,2019-10-24:/arch-linux/arch_based_distributions.html<p>有句不知道谁说的话说得好,“一千名读者中有一千个哈姆雷特”。放在 GNU/Linux 发行版上同样
也如此。有一群人对某个发行版的原则和理念不能完全认同,于是创造出了一个衍生发行版,或是
从零开始创建一个新的发行版,大概就是这个样子。</p>
<div class="section" id="tl-dr">
<h2>TL;DR</h2>
<ul class="simple">
<li>Arch Linux 也有很多衍生发行版,所诞生的原因和专注的方向也各有不同。</li>
<li>Arch Linux <strong>官方</strong> <strong>不为</strong> Arch Linux 的衍生发行版提供支持。</li>
<li>最好首先去衍生发行版各自的主要社区寻求支持。</li>
<li>如果万不得已只能在 Arch Linux 的社区(例如群组和非官方论坛)询问的话,
请一定记得告诉大家自己用的是什么发行版。</li>
</ul>
</div>
<div class="section" id="the-arch-way">
<h2>所以先来回顾一下传说中(?)的 "The Arch Way" ?</h2>
<blockquote>
完整内容还请参阅 ArchWiki: <a class="reference external" href="https://wiki.archlinux.org/index.php/Arch_Linux">https://wiki.archlinux.org/index.php/Arch_Linux</a></blockquote>
<ul class="simple">
<li>Arch Linux 将简洁定义为 …</li></ul></div><p>有句不知道谁说的话说得好,“一千名读者中有一千个哈姆雷特”。放在 GNU/Linux 发行版上同样
也如此。有一群人对某个发行版的原则和理念不能完全认同,于是创造出了一个衍生发行版,或是
从零开始创建一个新的发行版,大概就是这个样子。</p>
<div class="section" id="tl-dr">
<h2>TL;DR</h2>
<ul class="simple">
<li>Arch Linux 也有很多衍生发行版,所诞生的原因和专注的方向也各有不同。</li>
<li>Arch Linux <strong>官方</strong> <strong>不为</strong> Arch Linux 的衍生发行版提供支持。</li>
<li>最好首先去衍生发行版各自的主要社区寻求支持。</li>
<li>如果万不得已只能在 Arch Linux 的社区(例如群组和非官方论坛)询问的话,
请一定记得告诉大家自己用的是什么发行版。</li>
</ul>
</div>
<div class="section" id="the-arch-way">
<h2>所以先来回顾一下传说中(?)的 "The Arch Way" ?</h2>
<blockquote>
完整内容还请参阅 ArchWiki: <a class="reference external" href="https://wiki.archlinux.org/index.php/Arch_Linux">https://wiki.archlinux.org/index.php/Arch_Linux</a></blockquote>
<ul class="simple">
<li>Arch Linux 将简洁定义为:避免任何不必要的添加、修改和复杂增加。
它提供的软件都来自原始开发者(上游),仅进行和发行版(下游)相关的最小修改。</li>
<li>Arch尽全力保持软件处于最新的稳定版本,只要不出现系统软件包破损,
都尽量用最新版本。Arch采用滚动升级策略,安装之后可以持续升级。</li>
<li>Arch 注重实用性,避免意识形态之争。最终的设计决策都是由开发者的共识决定。
开发者依赖基于事实的技术分析和讨论,避免政治因素,不会被流行观点左右。</li>
<li>许多 Linux 发行版都试图变得更“用户友好”,Arch Linux 则一直是,永远会是“以用户为中心”。
此发行版是为了满足贡献者的需求,而不是为了吸引尽可能多的用户。
Arch 适用于乐于自己动手的用户,他们愿意花时间阅读文档,解决自己的问题。</li>
</ul>
<p>汝如果有下面这些情况的若干种,可能就没那么想用 Arch Linux 了呗:</p>
<ul class="simple">
<li>没有能力、时间、愿望去打理这样一个高度可定制的 GNU/Linux 发行版。</li>
<li>需要非x86_64平台支持。</li>
<li>汝是狂热的自由软件爱好者,自然只希望发行版提供 GNU 定义的自由软件。( <del>这不清真……</del> )</li>
<li>汝认为好的操作系统应当是已经配置好的:安装介质应默认包含一套完整的应用软件、桌面环境——达到“开箱即用”。</li>
<li>汝不需要使用滚动升级的发行版。</li>
<li>汝对目前使用的操作系统感到满意,自然也没有太大的动力去换。</li>
</ul>
</div>
<div class="section" id="id1">
<h2>于是衍生发行版们登场了</h2>
<p>有些人可能像汝一样,不能完全接受 Arch 的原则,于是就在 Arch 的基础上做成了别的发行版:</p>
<ul class="simple">
<li>安装过程太难?于是有 <a class="reference external" href="https://github.com/AnarchyLinux/installer">AnarchyLinux</a>
这样的发行版提供一个简化的安装器。</li>
<li>想要预装桌面环境? 于是有 <a class="reference external" href="https://sourceforge.net/projects/chakra/">Chakra</a>
这样的为某个桌面环境特化的发行版。</li>
<li>需要非x86_64平台支持? 于是有 <a class="reference external" href="https://archlinux32.org/">Arch Linux 32</a>
和 <a class="reference external" href="https://archlinuxarm.org/">Arch Linux ARM</a> 这样的发行版把 Arch Linux 的理念
带到其它架构。</li>
<li>只想用自由软件? 于是有 <a class="reference external" href="https://www.parabola.nu/">Parabola</a> 这样专注自由的发行版。
(还获得了 GNU 的自由 GNU/Linux 发行版认证)</li>
<li>对 Systemd 不满? 于是有 <a class="reference external" href="https://artixlinux.org">Artix</a> 这样的发行版提供了 Systemd 以外
的 init 。</li>
<li>不想那么新?于是有 <a class="reference external" href="https://manjaro.org/">Manjaro</a>
和 <a class="reference external" href="https://www.hyperbola.info/">Hyperbola</a> ,致力于提供稍微稳定些的软件。</li>
<li>想在非 GNU/Linux 上用简单的 pacman ?于是有 <a class="reference external" href="https://archhurd.org/">ArchHurd</a>
, <a class="reference external" href="https://sourceforge.net/projects/msys2/">MSYS2</a> 和 <a class="reference external" href="https://github.com/archmac">ArchMac</a> ,
努力的在其它系统上帮汝找到一点 pacman 的感觉(?)。</li>
</ul>
<p>ArchWiki 上有一份比较完整的 Arch 衍生发行版列表: <a class="reference external" href="https://wiki.archlinux.org/index.php/Arch-based_distributions">https://wiki.archlinux.org/index.php/Arch-based_distributions</a></p>
</div>
<div class="section" id="id2">
<h2>为啥 Arch Linux 官方不为衍生发行版提供支持?</h2>
<blockquote>
<p>Arch 衍生发行版通常使用不一样的软件包、版本号、软件仓库,且有着部分难以察觉的定制。在 Arch 论坛对支持这些项目极其艰难。
社区技术支持只限于 Arch Linux 发行版和 Arch 用户软件仓库。所有关于衍生发行版或其他操作系统的帖子都会被关闭。</p>
<p class="attribution">—<a class="reference external" href="https://wiki.archlinux.org/index.php/Code_of_conduct">ArchWiki:Code of Conduct</a></p>
</blockquote>
<p>这一句大概就够了。不过只是官方论坛/IRC/Wiki/Bug Tracker 不支持衍生发行版而已啦,其他地方似乎没有那么严厉的样子……</p>
</div>
<div class="section" id="id3">
<h2>然而实际上支持衍生发行版有多困难?</h2>
<blockquote>
<p>“…Manjaro 的存在本身我觉得挺好的,毕竟是继承了 Arch 的包管理器,也是对 Arch 的支持了。
然而用户总是把它当 Arch 跑来论坛和群里问问题,有时候还不说明白自己用的是 Manjaro,很烦。…”</p>
<p class="attribution">—来自某个 Arch Linux 群组的不愿意透露姓名的某人(?)</p>
</blockquote>
<blockquote>
<p>“客观而论,Manjaro 是很成功的发行版,但是请不要将它和 Arch Linux 弄混。
如果你喜欢的是简便的配置和滚动更新,
那么选择 Manjaro 是很合理的;但如果你喜欢的是简洁、自由和尽可能最新,
那请使用 Arch Linux,而不要安装一个 Manjaro 并以 Arch 用户自居。”</p>
<p class="attribution">—来自某个 Arch Linux 群组的回忆中的某人(?)</p>
</blockquote>
<p>(其实汝把里面的 Manjaro 换成别的 Arch Linux 衍生发行版也差不多,并不是指摘 Manjaro 的意思。
不过对 Manjaro 感到不满的 Arch Linux 用户也是存在的,例如 <a class="reference external" href="https://rentry.co/manjaro-controversies">https://rentry.co/manjaro-controversies</a> )</p>
<p>其实最大的问题只有一个(?),就是大家在某个群组里就会或多或少有些隐含的预设。
例如在 Arch Linux 群组里就会默认大家都在用 Arch Linux,遇到问题的时候就会在这个
假设下进行解决。于是……</p>
<ul class="simple">
<li>如果汝用的是某个衍生发行版</li>
<li>又没有提前说明自己用的不是 Arch Linux</li>
<li>又赶上汝遇到的问题正好就因为某个汝正在使用的衍生发行版的定制的话……</li>
</ul>
<p>于是汝就只能指望辛辛苦苦帮汝解决问题最后发现是衍生发行版的问题的那位不是咱了(?)……</p>
<p>然而要避免这种尴尬的情况发生的话,除了在一开始告诉大家自己使用的 GNU/Linux 发行版的话,
提前找到汝使用的 GNU/Linux 发行版用户主要集合的群组/论坛等场所然后在那里提问也是一种可行之策,是呗。</p>
</div>
<div class="section" id="id4">
<h2>说了那么多,你用的又是啥呢?</h2>
<p>咱啊…… Arch Linux 和 Parabola GNU/Linux Libre 都在用呀~</p>
</div>
给 GNU/Linux 萌新的 Arch Linux 安装指南 rev.B2019-10-09T00:00:00+08:002020-07-02T00:00:00+08:00ホロtag:None,2019-10-09:/arch-linux/installing_arch_linux_for_complete_newbies.html
<p>给会用点 Windows 的彻头彻尾的 GNU/Linux 新手的 Arch Linux 安装指南 😣</p>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id25">为啥要搞这个?</a></h2>
<p>因为 ArchWiki 上的 Beginner Guide 已经和 Installation Guide 合成一个啦😂,
然后有小白开始抱怨看不懂啦(误 (╯・∧・)╯ ┻━┻</p>
<p><del>其实咱最早看的也是 Beginner Guide ……</del></p>
<p>算了概念用到时再解释 😂</p>
<blockquote>
<p>我是一个彻头彻尾的Linux新手,我应该用Arch吗?</p>
<p>如果你是新手,要使用 Arch 就必须愿意花时间学习新系统,接受 Arch 是一个 DIY 的系统,每个用户都是自己系统的组建者。</p>
<p>在开始问任何问题之前,自己先通过Google、Wiki或者论坛进行搜索。我们为你创建了这些资源并让你可以随时访问,上千志愿者为你提供了大量的信息资源。</p>
<p>推荐阅读: <a class="reference external" href="https://wiki.archlinux.org/index.php/Arch_terminology#RTFM">Arch terminology#RTFM</a></p>
</blockquote>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id26">首先说点废话</a></h2>
<ul>
<li><p class="first">Arch 这种经常更新内核的还是适合上实体机……</p>
</li>
<li><p class="first">看得懂英语的话最好还是看官方的 …</p></li></ul></div>
<p>给会用点 Windows 的彻头彻尾的 GNU/Linux 新手的 Arch Linux 安装指南 😣</p>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id25">为啥要搞这个?</a></h2>
<p>因为 ArchWiki 上的 Beginner Guide 已经和 Installation Guide 合成一个啦😂,
然后有小白开始抱怨看不懂啦(误 (╯・∧・)╯ ┻━┻</p>
<p><del>其实咱最早看的也是 Beginner Guide ……</del></p>
<p>算了概念用到时再解释 😂</p>
<blockquote>
<p>我是一个彻头彻尾的Linux新手,我应该用Arch吗?</p>
<p>如果你是新手,要使用 Arch 就必须愿意花时间学习新系统,接受 Arch 是一个 DIY 的系统,每个用户都是自己系统的组建者。</p>
<p>在开始问任何问题之前,自己先通过Google、Wiki或者论坛进行搜索。我们为你创建了这些资源并让你可以随时访问,上千志愿者为你提供了大量的信息资源。</p>
<p>推荐阅读: <a class="reference external" href="https://wiki.archlinux.org/index.php/Arch_terminology#RTFM">Arch terminology#RTFM</a></p>
</blockquote>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id26">首先说点废话</a></h2>
<ul>
<li><p class="first">Arch 这种经常更新内核的还是适合上实体机……</p>
</li>
<li><p class="first">看得懂英语的话最好还是看官方的 Installation Guide 吧(人家更新的比咱要勤快):</p>
<blockquote>
<p><a class="reference external" href="https://wiki.archlinux.org/index.php/Installation_guide">https://wiki.archlinux.org/index.php/Installation_guide</a></p>
</blockquote>
</li>
<li><p class="first">这里的目标是装好最简单的一个带有桌面的 Arch Linux ,对于部分特殊需求(例如无 GUI 的环境),
请直接参阅上方官方 Wiki 的安装指南装出基本系统,然后再参阅其他的文章呗~</p>
</li>
</ul>
</div>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id27">备份……</a></h2>
<p>万一手抖格错了盘别抱怨 GNU/Linux ……</p>
<blockquote>
但如果汝有备份的话,是不是已经下定决心把整个硬盘格式化掉了?(雾)</blockquote>
</div>
<div class="section" id="iso">
<h2><a class="toc-backref" href="#id28">下载 ISO</a></h2>
<p><a class="reference external" href="https://www.archlinux.org/download/">https://www.archlinux.org/download/</a></p>
<p>BT 种子和磁力链接在上面,直接下载的话往下拉,找 China 下面的镜像网站挑一个下载就好。 (っ╹ ◡ ╹ )っ</p>
<p>如果是用 HTTP/HTTPS 下载的话,下载完以后最好验证一下文件的散列值来确定文件下载完了 (╯艹︿艹)╯ ┻━┻</p>
<blockquote>
<p>Windows 上这样的工具有很多呐,例如 HashTab 和 FCIV。</p>
<p>但是如果汝正好没有这些工具或者从来没听说过散列(或者另一种译名叫哈希)的说法的话,可以用 Windows PowerShell 来完成:</p>
</blockquote>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c"># 例如获得某一个文件的 md5 散列值,用汝下载的 ISO 的路径换掉 <filepath></span></span>
<span class="code-line"><span class="nb">Get-FileHash</span> <span class="p"><</span><span class="n">filepath</span><span class="p">></span> <span class="n">-Algorithm</span> <span class="n">MD5</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="c"># 尽管 md5 和 sha1 已经被认为是不安全的散列算法了(容易发生两个文件不同但散列值相同的情况,</span></span>
<span class="code-line"><span class="n">也被称作</span><span class="err">“</span><span class="n">散列碰撞</span><span class="err">”,</span><span class="n">然而</span> <span class="n">Arch</span> <span class="n">Linux</span> <span class="n">的官方网站上还是只有这两种</span> <span class="err">😂,</span> <span class="n">先凑合着用吧</span><span class="err">……</span></span>
</pre></div>
<p>至于下面那个 PGP 签名,又是个大坑,先鸽了(咕咕咕……)</p>
</div>
<div class="section" id="id4">
<h2><a class="toc-backref" href="#id29">确定启动类型</a></h2>
<ul>
<li><p class="first">首先打开设置 ( Windows 8/8.1 叫做 "电脑设置"),然后通过 "更新和恢复" -> "恢复" -> "高级启动" 重启电脑.</p>
<blockquote>
<p>Windows 10 的话,按住 Shift 再点击电源按钮里的重启也行……</p>
</blockquote>
</li>
</ul>
<p>如果是 UEFI 启动的话,大概是这个样子:</p>
<img alt="UEFI 系统启动之后大概像这样" class="materialboxed responsive-img" src="/images/Linux_mixboot/0.png"/>
<p>没错就是有个 "使用设备" 的选项 😂</p>
<ul class="simple">
<li>或者同时按下键盘上的 Windows 徽标键(就是有 Windows 标志那个) 和 R 键,会打开“运行” 对话框。</li>
</ul>
<img alt="“运行”对话框" class="materialboxed responsive-img" src="/images/Arch_for_newbie/1.png"/>
<p>在里面输入 <code class="code">
msinfo32</code>
然后回车(按 Enter 键)确认,打开”系统信息”应用。</p>
<img alt="“系统信息”窗口" class="materialboxed responsive-img" src="/images/Arch_for_newbie/2.png"/>
<p>看“BIOS模式”里是不是 UEFI 😂😂,还有下面那个 “安全启动状态”是不是“以关闭”(咱这台电脑的 UEFI 太旧所以显示的是不支持)</p>
<p>如果安全启动是打开的还需要自己进 UEFI 固件设置里手动关闭 😂</p>
<blockquote>
具体怎么关因为每种电脑的方法不一样于是汝要自己 STFW (Search the f**king Web,搜索一下) 了😂</blockquote>
<ul class="simple">
<li>再或者打开磁盘管理(Windows 8 以后的系统可以通过按下 Windows + X 的菜单里找到 “磁盘管理”)</li>
</ul>
<img alt="磁盘管理在这~" class="materialboxed responsive-img" src="/images/Linux_mixboot/1.png"/>
<p>嗯,大概就是这样子的呗 (虽然具体的磁盘分区可能和咱的不一样)</p>
<img alt="大概长这样~" class="materialboxed responsive-img" src="/images/Linux_mixboot/2.png"/>
<p>看汝的硬盘上有没有一个 EFI 系统分区 😂😂😂</p>
<hr class="docutils"/>
<p>还是搞不懂的下面也不用看了,准备下最后的晚餐吧 😋 (误</p>
</div>
<div class="section" id="id5">
<h2><a class="toc-backref" href="#id30">在硬盘上准备一块空闲空间</a></h2>
<p>不然要把 Arch Linux 装到哪里去呐?</p>
<p>这里拿来演示的是 Windows 7 以后都自带的 “磁盘管理” 程序,应该能解决大多数问题 _(:з」∠)_</p>
<ul class="simple">
<li>Windows 8 以后的系统可以通过按下 Windows + X 的菜单里找到 “磁盘管理”</li>
</ul>
<img alt="磁盘管理在这~" class="materialboxed responsive-img" src="/images/Linux_mixboot/1.png"/>
<ul class="simple">
<li>嗯,大概就是这样子的呗 (虽然具体的磁盘分区可能和咱的不一样)</li>
</ul>
<img alt="大概长这样~" class="materialboxed responsive-img" src="/images/Linux_mixboot/2.png"/>
<ul class="simple">
<li>汝哪个硬盘分区比较空闲? 右键点击它,有一个"压缩卷的选项"</li>
</ul>
<img alt="”压缩卷“ 在这~" class="materialboxed responsive-img" src="/images/Linux_mixboot/3.png"/>
<ul class="simple">
<li>输入压缩的大小 _(:з」∠)_</li>
</ul>
<img alt="多少" class="materialboxed responsive-img" src="/images/Linux_mixboot/4.png"/>
<ul class="simple">
<li>然后就多了一块未分配的空间 😂</li>
</ul>
<img alt="多了一块未分配的空间" class="materialboxed responsive-img" src="/images/Linux_mixboot/5.png"/>
<p>如果汝的硬盘分区有些刁钻而磁盘管理没法解决的话,AOMEI 家的分区助手不错, <a class="reference external" href="http://disktool.cn">这是官方网站</a> ,
<a class="reference external" href="http://disktool.cn/jiaocheng/index.html">这是分区教程</a></p>
</div>
<div class="section" id="id8">
<h2><a class="toc-backref" href="#id31">制作启动盘</a></h2>
<p>但前提是汝的电脑能从 U 盘启动 😂 (不过最近几年生产的电脑都应该可以了吧……</p>
<p>Windows 下咱比较推荐一个叫 rufus 的软件,<a class="reference external" href="https://rufus.akeo.ie/">官方网站在这</a></p>
<p>下载完以后双击运行,需要管理员权限,记得看有没有数字签名。(有数字签名时用户账户控制的对话框是蓝色的)</p>
<p>Rufus 自带多国语言(当然也包括中文啦),如果汝系统语言不是中文的话,点击那个地球图标就可以修改语言了啦~</p>
<img alt="选择语言" class="materialboxed responsive-img" src="/images/Arch_for_newbie/3.png"/>
<p>然后戳有点像光盘的按钮选择刚下载好的 ISO 镜像</p>
<img alt="选择映像" class="materialboxed responsive-img" src="/images/Arch_for_newbie/4.png"/>
<p>然后选择一种启动类型,UEFI 就选最后一个,不是的话就选第一个。</p>
<img alt="选择启动类型" class="materialboxed responsive-img" src="/images/Arch_for_newbie/5.png"/>
<p>写入方式选推荐的就好 (´_`)</p>
<img alt="选择写入方式" class="materialboxed responsive-img" src="/images/Arch_for_newbie/6.png"/>
<p>确认(要知道汝按下确认以后就没有回头路了,所以记得提前备份 U 盘上的资料 😂)</p>
<img alt="确认" class="materialboxed responsive-img" src="/images/Arch_for_newbie/7.png"/>
<p>然后坐等完成,完成以后汝的 U 盘卷标应该是 "ARCH_201610" 这样的
(后面四位年份和两位月份),不要改成别的,万一不对记得照 ISO 改回来 😂😂</p>
</div>
<div class="section" id="id10">
<h2><a class="toc-backref" href="#id32">准备启动</a></h2>
<p>重启电脑,然后让电脑从 U 盘启动。</p>
<blockquote>
<p>具体怎么搞还是要看电脑的硬件啦 😂</p>
<p>大多数的电脑都有一个在开机时按下一个按键来选择从哪里启动的选项(例如 Dell 和 ThinkPad 是 F12)。
UEFI 的话, 刚才提到的那个“使用设备” 的选项也可以。</p>
<p>还是去翻一翻汝自己的电脑生产商的说明书更快一点 ……</p>
</blockquote>
<ul class="simple">
<li>MBR 成功启动以后像这样</li>
</ul>
<img alt="MBR" class="materialboxed responsive-img" src="/images/Arch_for_newbie/8.png"/>
<p>选第一项。😂 (除了 CPU 不支持的都应该用x86_64 😋)</p>
<blockquote>
后来 Arch Linux 不再支持 i686 啦,所以这里应该只会看见 x86_64 那一项(但是咱懒得换图片啦……)</blockquote>
<ul class="simple">
<li>UEFI 成功启动以后像这样</li>
</ul>
<img alt="UEFI" class="materialboxed responsive-img" src="/images/Arch_for_newbie/9.png"/>
<p>还是选第一项。😂</p>
<p>然后等待一会以后会出现……</p>
<div class="highlight"><pre><span class="code-line"><span></span>root@archiso ~ <span class="c1">#</span></span>
</pre></div>
<p>这就表示已经启动完毕啦 ~(>_<~)</p>
<blockquote>
<p>root是用戶名,前面那個數字是上一個命令的exit status啦,如果正常結束的命令exit status是0,就不會顯示出來,你有 1 2 127 這種都是某種東西報錯了.</p>
<p>----现任 Arch Linux TU 之一的 <a class="reference external" href="/links.html#farseerfc">farseerfc</a> 在 <a class="reference external" href="https://www.zhihu.com/question/45329752/answer/98733823">https://www.zhihu.com/question/45329752/answer/98733823</a> 中写到……</p>
</blockquote>
</div>
<div class="section" id="id11">
<h2><a class="toc-backref" href="#id33">联网</a></h2>
<blockquote>
因为 ArchISO 就是个重启就没了的 Live 环境,安装时需要的软件包都要另外下载。</blockquote>
<p>首先当然是联网啦,如果是自动获取 IP 地址的有线网络,那么应该啥也不用做,ping 一下试试?</p>
<blockquote>
<div class="highlight"><pre><span class="code-line"><span></span>root@archiso ~ <span class="c1"># ping archlinux.org</span></span>
<span class="code-line"><span class="c1"># 汝应该会看到像这样的东西 ……</span></span>
<span class="code-line">PING archlinux.org <span class="o">(</span><span class="m">138</span>.201.81.199<span class="o">)</span> <span class="m">56</span><span class="o">(</span><span class="m">84</span><span class="o">)</span> bytes of data.</span>
<span class="code-line"><span class="m">64</span> bytes from apollo.archlinux.org <span class="o">(</span><span class="m">138</span>.201.81.199<span class="o">)</span>: <span class="nv">icmp_seq</span><span class="o">=</span><span class="m">1</span> <span class="nv">ttl</span><span class="o">=</span><span class="m">49</span> <span class="nv">time</span><span class="o">=</span><span class="m">361</span> ms</span>
<span class="code-line">……</span>
</pre></div>
</blockquote>
<p>(把电脑用网线接到家里的路由器上就有相同的效果)</p>
<p>如果没网的话…… 😂</p>
<hr class="docutils"/>
<ul class="simple">
<li>先用 <code class="code">
ip link</code>
确定一下网卡</li>
</ul>
<div class="highlight"><pre><span class="code-line"><span></span>root@archiso ~ <span class="c1"># ip link</span></span>
<span class="code-line"><span class="m">1</span>: lo: <LOOPBACK,UP,LOWER_UP> mtu <span class="m">65536</span> qdisc noqueue state UNKNOWN mode DEFAULT group default qlen <span class="m">1</span></span>
<span class="code-line"> link/loopback <span class="m">00</span>:00:00:00:00:00 brd <span class="m">00</span>:00:00:00:00:00</span>
<span class="code-line"><span class="m">2</span>: enp4s0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu <span class="m">1500</span> qdisc fq_codel state DOWN mode DEFAULT group default qlen <span class="m">1000</span></span>
<span class="code-line"> link/ether c8:9c:dc:a8:ab:c3 brd ff:ff:ff:ff:ff:ff</span>
<span class="code-line"><span class="m">3</span>: wlp0s29u1u1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu <span class="m">1500</span> qdisc mq state UP mode DORMANT group default qlen <span class="m">1000</span></span>
<span class="code-line"> link/ether <span class="m">44</span>:94:fc:0f:63:b9 brd ff:ff:ff:ff:ff:ff</span>
</pre></div>
<p>这个例子里,lo 是本地环回不用管它,enp 开头的是有线网卡,wlp 开头的是无线网卡。</p>
<p>如果汝明明有无线网卡却没识别的话,有可能汝是某无线网卡厂商受害者😂😂</p>
<p>这时可以:</p>
<blockquote>
<ul class="simple">
<li>有 Android 手机的话,手机连 WiFi ,然后用“USB 网络共享”共享给电脑。</li>
<li>找个 USB 无线网卡插上 😂</li>
<li>连有线😂😂</li>
</ul>
</blockquote>
<ul>
<li><p class="first">如果有无线网卡的话,试试连接到 WiFi ……</p>
<blockquote>
<p>2020 年 7 月的 ArchISO 拿掉了 netctl,于是经典的 wifi-menu 也被 iwctl 取代了。</p>
<p><del>如果汝之前也能熟练使用 wpa_supplicant 啥的那当咱没说……</del></p>
</blockquote>
</li>
</ul>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># iwctl 命令来进入 iwd 的 shell。</span></span>
<span class="code-line">root@archiso ~ <span class="c1"># iwctl</span></span>
<span class="code-line"><span class="c1"># 以下的操作都在 iwctl 的 shell 中,输入 help 来获得可用的命令。</span></span>
<span class="code-line"><span class="o">[</span>iwd<span class="o">]</span><span class="c1"># help</span></span>
<span class="code-line"><span class="c1"># 列出无线网络设备</span></span>
<span class="code-line"><span class="o">[</span>iwd<span class="o">]</span><span class="c1"># device list</span></span>
<span class="code-line"><span class="c1"># 用所指定的设备扫描网络(用上一步的设备名称替换 device)</span></span>
<span class="code-line"><span class="o">[</span>iwd<span class="o">]</span><span class="c1"># station device scan</span></span>
<span class="code-line"><span class="c1"># 或者列出所有的网络</span></span>
<span class="code-line"><span class="o">[</span>iwd<span class="o">]</span><span class="c1"># station device get-networks</span></span>
<span class="code-line"><span class="c1"># 连接到网络, SSID 就是汝要连接的网络的 SSID 啦</span></span>
<span class="code-line"><span class="o">[</span>iwd<span class="o">]</span><span class="c1"># station device connect SSID</span></span>
<span class="code-line"><span class="c1"># 如果所连接的网络需要密码,则接下来会提示输入,汝当然也可以直接在 iwctl 命令中输入</span></span>
<span class="code-line">root@archiso ~ <span class="c1"># iwctl --passphrase passphrase station device connect SSID</span></span>
</pre></div>
<p>谁叫 Arch 连不上网的话都装不了 😂</p>
<p>另外,如果汝连接的网络需要网页登录(Captive Portal),可以用 <cite>elinks</cite> 碰碰运气 😂</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># 用汝的门户的 URL 替换 <your_captive_portal_url></span></span>
<span class="code-line"><span class="c1"># 如果不知道的话,随便访问一个 HTTP 网站试试,应该就会被重定向到 Portal 了</span></span>
<span class="code-line">root@archiso ~ <span class="c1"># elinks http://<your_captive_portal_url></span></span>
</pre></div>
</div>
<div class="section" id="id12">
<h2><a class="toc-backref" href="#id34">时间同步</a></h2>
<p>用 <code class="code">
timedatectl set-ntp true</code>
保证时间同步 。</p>
<div class="highlight"><pre><span class="code-line"><span></span>root@archiso ~ <span class="c1"># timedatectl set-ntp true</span></span>
<span class="code-line">root@archiso ~ <span class="c1"># timedatectl status</span></span>
<span class="code-line"> Local time: Fri <span class="m">2016</span>-10-28 <span class="m">17</span>:39:42 UTC</span>
<span class="code-line"> Universal time: Fri <span class="m">2016</span>-10-28 <span class="m">17</span>:39:42 UTC</span>
<span class="code-line"> RTC time: Fri <span class="m">2016</span>-10-28 <span class="m">17</span>:39:42</span>
<span class="code-line"> Time zone: UTC <span class="o">(</span>UTC, +0000<span class="o">)</span></span>
<span class="code-line">Network <span class="nb">time</span> on: yes</span>
<span class="code-line">NTP synchronized: no</span>
<span class="code-line">RTC in <span class="nb">local</span> TZ: no</span>
</pre></div>
<p>因为有不少操作需要准确的时间呐,例如 HTTPS 和 GnuPG 都需要准确的时间来验证证书的有效性。</p>
<p>但是如果因为各种原因没法同步的话,那就只好手动设置咯~</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># timectl set-time "yyyy-MM-dd hh:mm:ss"</span></span>
<span class="code-line">root@archiso ~ <span class="c1"># timectl set-time "2016-10-28 17:39:42"</span></span>
</pre></div>
</div>
<div class="section" id="id13">
<h2><a class="toc-backref" href="#id35">准备硬盘空间</a></h2>
<p>这里用 cgdisk (UEFI)/ cfdisk (MBR) 来给硬盘分区。</p>
<p>首先输入 <code class="code">
lsblk</code>
看看汝的硬盘是哪个设备:</p>
<div class="highlight"><pre><span class="code-line"><span></span>root@archiso ~ <span class="c1"># lsblk</span></span>
<span class="code-line">NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT</span>
<span class="code-line">sda <span class="m">8</span>:0 <span class="m">0</span> <span class="m">463</span>.9G <span class="m">0</span> disk</span>
<span class="code-line">├─sda1 <span class="m">8</span>:1 <span class="m">0</span> 512M <span class="m">0</span> part</span>
<span class="code-line">├─sda2 <span class="m">8</span>:2 <span class="m">0</span> 16M <span class="m">0</span> part</span>
<span class="code-line">├─sda3 <span class="m">8</span>:3 <span class="m">0</span> <span class="m">103</span>.4G <span class="m">0</span> part</span>
<span class="code-line">└─sda4 <span class="m">8</span>:4 <span class="m">0</span> <span class="m">253</span>.4G <span class="m">0</span> part</span>
<span class="code-line">sdb <span class="m">8</span>:16 <span class="m">1</span> <span class="m">7</span>.5G <span class="m">0</span> disk</span>
<span class="code-line">└─sdb1 <span class="m">8</span>:17 <span class="m">1</span> <span class="m">7</span>.5G <span class="m">0</span> part /run/archiso/bootmnt</span>
<span class="code-line">sr0 <span class="m">11</span>:0 <span class="m">1</span> 1024M <span class="m">0</span> rom</span>
<span class="code-line">loop0 <span class="m">7</span>:0 <span class="m">0</span> <span class="m">346</span>.1M <span class="m">1</span> loop /run/archiso/sfs/airootfs</span>
</pre></div>
<p>如果那是一块新硬盘或者已经清空的硬盘的话,汝大概看不到 /dev/sda1 一类的分区。</p>
<hr class="docutils"/>
<blockquote>
<p>如果汝没看到 /dev/sda 却看到了一些其它的东西的话:</p>
<ul class="simple">
<li>/dev/nvme0n1 一类的:表示汝的电脑上有一块 NVMe SSD (发出了羡慕的目光(咳咳))</li>
<li>/dev/mmcblk0 一类的:表示汝的电脑上有 eMMC 存储(例如是早期的 Windows 8 平板电脑啥的)</li>
</ul>
<p>这种时候的话可能汝 ArchISO 的 U 盘就跑到 sda 去了,在下面的操作时记得注意一下。</p>
</blockquote>
<p>比如咱这里 sda 是咱的硬盘,于是运行 cgdisk 时加上 /dev/sda 这个参数:</p>
<blockquote>
<p>/dev 是一个虚拟目录(也就是并不在硬盘上),它会把电脑上的设备映射成一个个文件 _(:з」∠)_</p>
<p><del>再学究的解释真不会了……</del></p>
</blockquote>
<div class="section" id="cgdisk">
<h3><a class="toc-backref" href="#id36">cgdisk</a></h3>
<div class="highlight"><pre><span class="code-line"><span></span>root@archiso ~ <span class="c1"># cgdisk /dev/sda</span></span>
</pre></div>
<p>如果汝在用 cgdisk 的话汝可能会看到这样的提示:</p>
<div class="highlight"><pre><span class="code-line"><span></span>Warning! Non-GPT or damaged disk detected! This program will attempt to</span>
<span class="code-line">convert to GPT form or repair damage to GPT data structures, but may not</span>
<span class="code-line">succeed. Use gdisk or another disk repair tool <span class="k">if</span> you have a damaged GPT</span>
<span class="code-line">disk.</span>
<span class="code-line"></span>
<span class="code-line"></span>
<span class="code-line"> Press any key to <span class="k">continue</span>....</span>
</pre></div>
<p>这表示 cdgisk 在这块硬盘上找不到 GPT 分区表。如果这是一块新硬盘或者已经清空的硬盘的话
不必担心,继续即可。否则请立即停下来检查一下硬盘(或者汝有这块硬盘的备份的话也可以继续)。</p>
<div class="highlight"><pre><span class="code-line"><span></span> cgdisk <span class="m">1</span>.0.1</span>
<span class="code-line"></span>
<span class="code-line"> Disk Drive: /dev/sda</span>
<span class="code-line"> Size: <span class="m">972906545</span>, <span class="m">463</span>.9 GiB</span>
<span class="code-line"></span>
<span class="code-line">Part. <span class="c1"># Size Partition Type Partition Name</span></span>
<span class="code-line">----------------------------------------------------------------</span>
<span class="code-line"> <span class="m">1007</span>.0 KiB free space</span>
<span class="code-line"><span class="m">1</span> <span class="m">512</span>.0 MiB EFI System EFI system partition</span>
<span class="code-line"><span class="m">2</span> <span class="m">16</span>.0 MiB Microsoft reserved Microsoft reserved partition</span>
<span class="code-line"><span class="m">3</span> <span class="m">103</span>.4 GiB Microsoft basic data Basic data partition</span>
<span class="code-line"><span class="m">4</span> <span class="m">253</span>.4 GiB Microsoft basic data Basic data partition</span>
<span class="code-line"> <span class="m">106</span>.6 GiB free space</span>
<span class="code-line"></span>
<span class="code-line"></span>
<span class="code-line"></span>
<span class="code-line"></span>
<span class="code-line"></span>
<span class="code-line"> <span class="o">[</span> Align <span class="o">]</span> <span class="o">[</span> Backup <span class="o">]</span> <span class="o">[</span> Help <span class="o">]</span> <span class="o">[</span> Load <span class="o">]</span> <span class="o">[</span> New <span class="o">]</span> <span class="o">[</span> Quit <span class="o">]</span> <span class="o">[</span> Verify <span class="o">]</span> <span class="o">[</span> Write <span class="o">]</span></span>
</pre></div>
<p>cgdisk 的界面大概像这样啦,用上下方向键把光标移动到汝之前的空闲空间上去(例如咱这里是最后一个)</p>
<p>新硬盘的话应该只有一个 free space 😂</p>
<p>用左右方向键把下面一排按钮上的光标移动到 New 上,然后按 Enter。</p>
<p>(这里看不出光标😂,黑色背景下光标应该是白的吧😂😂)</p>
<p>接下来会问几个问题(# 开头的是咱加上的注释😂):</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># 数字可能和汝看到的不一样😂</span></span>
<span class="code-line"><span class="c1"># 起始扇区的位置,直接 Enter 就行</span></span>
<span class="code-line">First sector <span class="o">(</span><span class="m">749424640</span>-972906511, <span class="nv">default</span> <span class="o">=</span> <span class="m">749424640</span><span class="o">)</span>:</span>
<span class="code-line"><span class="c1"># 大小,可以是扇区数,也可以是实际的大小(例如 100M,20G一类的),要用掉整个剩余空闲空间的话,直接 Enter 就行。</span></span>
<span class="code-line">Size in sectors or <span class="o">{</span>KMGTP<span class="o">}</span> <span class="o">(</span><span class="nv">default</span> <span class="o">=</span> <span class="m">223481872</span><span class="o">)</span>:</span>
<span class="code-line"><span class="c1"># 分区类型,默认的就好</span></span>
<span class="code-line"><span class="c1"># 但是如果要建立新的 EFI 系统分区的话 ,分区类型是 :code:`ef00`</span></span>
<span class="code-line"><span class="c1"># 但是如果要建立新的 交换空间(就是虚拟内存啦)的话 ,分区类型是 :code:`8200`</span></span>
<span class="code-line">Current <span class="nb">type</span> is <span class="m">8300</span> <span class="o">(</span>Linux filesystem<span class="o">)</span></span>
<span class="code-line">Hex code or GUID <span class="o">(</span>L to show codes, <span class="nv">Enter</span> <span class="o">=</span> <span class="m">8300</span><span class="o">)</span>:</span>
<span class="code-line"><span class="c1"># 设置卷标,不设置也行。</span></span>
<span class="code-line">Current partition name is <span class="s1">''</span></span>
<span class="code-line">Enter new partition name, or <Enter> to use the current name:</span>
</pre></div>
<p>然后汝应该会发现下面的空闲空间变成 Linux filesystem 了呗~</p>
<p>要保存分区表的话,用左右方向键把下面一排按钮上的光标移动到 Write 上,然后按 Enter。</p>
<div class="highlight"><pre><span class="code-line"><span></span>Are you sure you want to write the partition table to disk? <span class="o">(</span>yes or no<span class="o">)</span>:</span>
<span class="code-line"></span>
<span class="code-line"> Warning!! This may destroy data on your disk!</span>
</pre></div>
<p>在这里输入 <code class="code">
yes</code>
(就是 yes,不是 y Y YES 啥的😂),然后按 Enter。</p>
<p>然后下面会闪过一行 "The operation has completed successfully" ,这时就可以退出了。</p>
<p>用左右方向键把下面一排按钮上的光标移动到 Quit 上,然后按 Enter。</p>
</div>
<div class="section" id="cfdisk">
<h3><a class="toc-backref" href="#id37">cfdisk</a></h3>
<p>如果汝在用 cfdisk 的话汝可能会看到这样的提示:</p>
<div class="highlight"><pre><span class="code-line"><span></span> ┌ Select label <span class="nb">type</span> ───┐</span>
<span class="code-line"> │ gpt │</span>
<span class="code-line"> │ dos │</span>
<span class="code-line"> │ sgi │</span>
<span class="code-line"> │ sun │</span>
<span class="code-line"></span>
<span class="code-line"></span>
<span class="code-line"> Device does not contain a recognized partition table.</span>
<span class="code-line">Select a <span class="nb">type</span> to create a new label or press <span class="s1">'L'</span> to load script file.</span>
</pre></div>
<p>这表示 cfgisk 在这块硬盘上找不到可以识别的分区表。如果这是一块新硬盘或者已经清空的硬盘的话
不必担心,选择 dos 继续即可。否则请立即停下来检查一下硬盘(或者汝有这块硬盘的备份的话也可以继续)。</p>
<p>这就是 cfdisk 的主界面啦:</p>
<div class="highlight"><pre><span class="code-line"><span></span> Disk: /dev/sdc</span>
<span class="code-line"> Size: <span class="m">465</span>.8 GiB, <span class="m">500107862016</span> bytes, <span class="m">976773168</span> sectors</span>
<span class="code-line"> Label: dos, identifier: 0x178bfb32</span>
<span class="code-line"></span>
<span class="code-line"> Device Boot Start End Sectors Size Id Type</span>
<span class="code-line">>> Free space <span class="m">2048</span> <span class="m">976773167</span> <span class="m">976771120</span> <span class="m">465</span>.8G</span>
<span class="code-line"></span>
<span class="code-line"></span>
<span class="code-line"></span>
<span class="code-line"></span>
<span class="code-line"></span>
<span class="code-line"></span>
<span class="code-line"></span>
<span class="code-line"></span>
<span class="code-line"></span>
<span class="code-line"></span>
<span class="code-line">┌──────────────────────────────────────────────────────────┐</span>
<span class="code-line">│Filesystem UUID: 3AB8802AB87FE2B5 │</span>
<span class="code-line">│ Filesystem: ntfs │</span>
<span class="code-line">└──────────────────────────────────────────────────────────┘</span>
<span class="code-line"> <span class="o">[</span> New <span class="o">]</span> <span class="o">[</span> Quit <span class="o">]</span> <span class="o">[</span> Help <span class="o">]</span> <span class="o">[</span> Write <span class="o">]</span> <span class="o">[</span> Dump <span class="o">]</span></span>
<span class="code-line"></span>
<span class="code-line"></span>
<span class="code-line"> Create new partition from free space</span>
</pre></div>
<p>也是选择 new 然后输入大小:</p>
<div class="highlight"><pre><span class="code-line"><span></span>Partition size:</span>
<span class="code-line"><span class="c1"># 然后可能会让汝选择是主分区还是扩展分区,按需选择就 OK</span></span>
<span class="code-line"><span class="o">[</span>primary<span class="o">]</span> <span class="o">[</span>extended<span class="o">]</span></span>
</pre></div>
<p>但是如果汝需要调整分区类型的话,选中要改变的分区然后把光标移动到 Type 上按 Enter,选择一个分区类型:</p>
<div class="highlight"><pre><span class="code-line"><span></span> Disk: /dev/sdc</span>
<span class="code-line"> Size: <span class="m">465</span>.8 GiB, <span class="m">500107862016</span> bytes, <span class="m">976773168</span> sectors</span>
<span class="code-line"> Label: dos, identifier: 0xe0a3ecf7</span>
<span class="code-line"></span>
<span class="code-line"> Device Boot Start End Sectors Size Id Type</span>
<span class="code-line">>> /dev/sdc1 <span class="m">2048</span> <span class="m">1050623</span> <span class="m">1048576</span> 512M ef EFI <span class="o">(</span>FAT-12/16/32<span class="o">)</span></span>
<span class="code-line"> /dev/sdc2 <span class="m">1050624</span> <span class="m">976773167</span> <span class="m">975722544</span> <span class="m">465</span>.3G <span class="m">83</span> Linux</span>
<span class="code-line"></span>
<span class="code-line"></span>
<span class="code-line"></span>
<span class="code-line"></span>
<span class="code-line"></span>
<span class="code-line"></span>
<span class="code-line"></span>
<span class="code-line"></span>
<span class="code-line"></span>
<span class="code-line"></span>
<span class="code-line">┌──────────────────────────────────────────────────────────┐</span>
<span class="code-line">│Partition type: EFI <span class="o">(</span>FAT-12/16/32<span class="o">)</span> <span class="o">(</span>ef<span class="o">)</span> │</span>
<span class="code-line">└──────────────────────────────────────────────────────────┘</span>
<span class="code-line"> <span class="o">[</span>Bootable<span class="o">]</span> <span class="o">[</span> Delete <span class="o">]</span> <span class="o">[</span> Resize <span class="o">]</span> <span class="o">[</span> Quit <span class="o">]</span> <span class="o">[</span> Type <span class="o">]</span> <span class="o">[</span> Help <span class="o">]</span> <span class="o">[</span> Write <span class="o">]</span> <span class="o">[</span> Dump <span class="o">]</span></span>
</pre></div>
<p>要保存分区表的话,用左右方向键把下面一排按钮上的光标移动到 Write 上,然后按 Enter。</p>
<div class="highlight"><pre><span class="code-line"><span></span>Are you sure you want to write the partition table to disk? <span class="o">(</span>yes or no<span class="o">)</span>:</span>
</pre></div>
<p>在这里输入 <code class="code">
yes</code>
(就是 yes,不是 y Y YES 啥的😂),然后按 Enter。</p>
<p>然后下面会闪过一行 "The operation has completed successfully" ,这时就可以退出了。</p>
<p>用左右方向键把下面一排按钮上的光标移动到 Quit 上,然后按 Enter。</p>
<hr class="docutils"/>
<p>然而汝以为这样就结束了?还没格式化呢 (╯°Д°)╯︵/(.□ . )</p>
</div>
</div>
<div class="section" id="id14">
<h2><a class="toc-backref" href="#id38">创建文件系统+挂载</a></h2>
<blockquote>
<p>所以挂载是啥玩意?</p>
<p>GNU/Linux 不是用 Windows 那样的盘符来分区的啦,GNU/Linux 继承了 Unix 的整个目录结构
从根目录 / 开始。然后下面是各种子目录。</p>
<p>大多数的 GNU/Linux 发行版都遵循一个叫做“文件系统层次结构标准”(Filesystem Hierarchy Standard,
有时也简称作 FHS)的标准,汝可以 <cite>ls /</cite> 一下看看会不会发现一些例如 /bin /home /usr 一类的目录?
这就是拜这个标准所赐 😂</p>
<p>在 Windows 里,汝大概会把不同的文件放在不同的盘符下的硬盘分区里。 在 GNU/Linux 中,咱们通常就是把不同的分区
挂载到整个目录结构中的一处。向挂载好的目录写入的文件就会保存在被挂载的磁盘分区上。</p>
</blockquote>
<p>首先还是用 <code class="code">
lsblk</code>
确定一下分区的名称,为了以防万一记得加上 -f 参数:</p>
<div class="highlight"><pre><span class="code-line"><span></span>root@archiso ~ <span class="c1"># lsblk -f</span></span>
<span class="code-line">NAME FSTYPE LABEL UUID MOUNTPOINT</span>
<span class="code-line">sda</span>
<span class="code-line">├─sda1 vfat 3C44-B4ED</span>
<span class="code-line">├─sda2</span>
<span class="code-line">├─sda3 ntfs 42E243C5E243BBC3</span>
<span class="code-line">├─sda4 ntfs 新加卷 58741F29741F0A00</span>
<span class="code-line">└─sda5</span>
<span class="code-line">sdb</span>
<span class="code-line">└─sdb1 vfat ARCH_201610 EAC8-F012 /run/archiso/bootmnt</span>
<span class="code-line">sr0</span>
<span class="code-line">loop0 squashfs /run/archiso/sfs/airootfs</span>
</pre></div>
<p>第一排分别表示设备名称,文件系统类型,卷标,UUID和挂载点。</p>
<p>咱这里的话 sda1 那个 vfat 分区就是 EFI 系统分区啦,sda5 就是刚刚新建的分区啦~(因为还没格式化所以没有文件系统😂)</p>
<p>用 <code class="code">
mkfs.ext4</code>
把那个分区格式化成 ext4 文件系统咯~</p>
<blockquote>
<p>mkfs 可以格式化成某一个汝指定的文件系统(就像刚才那样 mkfs.ext4 可以格式化出一个 ext4 文件系统)</p>
<p>ext 家族大概是 GNU/Linux 最古老,应用的最广泛的文件系统了吧……</p>
<p>当然可以用的文件系统有很多啦,如果汝想再了解一些的话,可以去 ArchWiki 看一看:</p>
<p><a class="reference external" href="https://wiki.archlinux.org/index.php/File_systems">https://wiki.archlinux.org/index.php/File_systems</a></p>
<p>记得自己看清楚是哪个分区别格式化错了 😂</p>
</blockquote>
<div class="highlight"><pre><span class="code-line"><span></span>root@archiso ~ <span class="c1"># mkfs.ext4 /dev/sda5</span></span>
<span class="code-line">mke2fs <span class="m">1</span>.43.3 <span class="o">(</span><span class="m">04</span>-Sep-2016<span class="o">)</span></span>
<span class="code-line">Creating filesystem with <span class="m">27935234</span> 4k blocks and <span class="m">6987776</span> inodes</span>
<span class="code-line">Filesystem UUID: a3943e57-6217-4a5f-8e57-ade5771315c0</span>
<span class="code-line">Superblock backups stored on blocks:</span>
<span class="code-line"> <span class="m">32768</span>, <span class="m">98304</span>, <span class="m">163840</span>, <span class="m">229376</span>, <span class="m">294912</span>, <span class="m">819200</span>, <span class="m">884736</span>, <span class="m">1605632</span>, <span class="m">2654208</span>,</span>
<span class="code-line"> <span class="m">4096000</span>, <span class="m">7962624</span>, <span class="m">11239424</span>, <span class="m">20480000</span>, <span class="m">23887872</span></span>
<span class="code-line"></span>
<span class="code-line">Allocating group tables: <span class="k">done</span></span>
<span class="code-line">Writing inode tables: <span class="k">done</span></span>
<span class="code-line">Creating journal <span class="o">(</span><span class="m">131072</span> blocks<span class="o">)</span>: <span class="k">done</span></span>
<span class="code-line">Writing superblocks and filesystem accounting information: <span class="k">done</span></span>
<span class="code-line"></span>
<span class="code-line">root@archiso ~ <span class="c1">#</span></span>
</pre></div>
<p>等一排文字闪过就格式化完了……</p>
<blockquote>
<p>如果要格式化新的 EFI 系统分区的话,用 <code class="code">
mkfs.vfat</code>
</p>
<p>如果要格式化新的 交换空间的话,用 <code class="code">
mkswap</code>
</p>
</blockquote>
<p>接下来用 mount 挂载分区啦~ (。>ω<)。</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># mount <设备名称> <目标文件夹></span></span>
<span class="code-line"><span class="c1"># /mnt 挺合适的</span></span>
<span class="code-line">root@archiso ~ <span class="c1"># mount /dev/sda5 /mnt</span></span>
<span class="code-line"><span class="c1"># 如果要挂载 EFI 系统分区的话,建议挂载到 /mnt/boot</span></span>
<span class="code-line"><span class="c1"># 所以先建立相应的文件夹</span></span>
<span class="code-line">root@archiso ~ <span class="c1"># mkdir /mnt/boot</span></span>
<span class="code-line">root@archiso ~ <span class="c1"># mount /dev/sda1 /mnt/boot</span></span>
<span class="code-line"><span class="c1"># 有交换空间的话不用挂载,用 swapon 命令。</span></span>
<span class="code-line">root@archiso ~ <span class="c1"># swapon /dev/sda6</span></span>
</pre></div>
</div>
<div class="section" id="id15">
<h2><a class="toc-backref" href="#id39">选择软件仓库镜像</a></h2>
<blockquote>
<p>软件仓库(在Debian系发行版中,又叫做“软件源”)是软件包存储的地方。通常我们所说的软件仓库指在线软件仓库,亦即用户从互联网获取软件的地方。</p>
<p>以及新的 ArchISO 中内置了通过测速和筛选镜像服务器位置来选择镜像的 Reflector,
<a class="reference external" href="https://wiki.archlinux.org/index.php/Reflector_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)">使用方法在这里。</a></p>
</blockquote>
<p>用 nano 打开 <code class="code">
/etc/pacman.d/mirrorlist</code>
</p>
<div class="highlight"><pre><span class="code-line"><span></span>root@archiso ~ <span class="c1"># nano /etc/pacman.d/mirrorlist</span></span>
<span class="code-line"></span>
<span class="code-line"></span>
<span class="code-line">GNU nano <span class="m">2</span>.7.0 File: /etc/pacman.d/mirrorlist</span>
<span class="code-line"></span>
<span class="code-line"><span class="c1">##</span></span>
<span class="code-line"><span class="c1">## Arch Linux repository mirrorlist</span></span>
<span class="code-line"><span class="c1">## Sorted by mirror score from mirror status page</span></span>
<span class="code-line"><span class="c1">## Generated on 2016-10-01</span></span>
<span class="code-line"><span class="c1">##</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="c1">## Score: 0.2, France</span></span>
<span class="code-line"><span class="nv">Server</span> <span class="o">=</span> http://archlinux.polymorf.fr/<span class="nv">$repo</span>/os/<span class="nv">$arch</span></span>
<span class="code-line"><span class="c1">## Score: 0.3, France</span></span>
<span class="code-line"><span class="nv">Server</span> <span class="o">=</span> http://arch.tamcore.eu/<span class="nv">$repo</span>/os/<span class="nv">$arch</span></span>
<span class="code-line"><span class="c1">## Score: 0.3, Germany</span></span>
<span class="code-line"><span class="nv">Server</span> <span class="o">=</span> http://mirrors.cicku.me/archlinux/<span class="nv">$repo</span>/os/<span class="nv">$arch</span></span>
<span class="code-line"><span class="c1">## Score: 0.3, Czech Republic</span></span>
<span class="code-line"><span class="nv">Server</span> <span class="o">=</span> http://ftp.sh.cvut.cz/arch/<span class="nv">$repo</span>/os/<span class="nv">$arch</span></span>
<span class="code-line"><span class="c1">## Score: 0.3, Germany</span></span>
<span class="code-line"><span class="nv">Server</span> <span class="o">=</span> http://mirror.js-webcoding.de/pub/archlinux/<span class="nv">$repo</span>/os/<span class="nv">$arch</span></span>
<span class="code-line"><span class="c1">## Score: 0.4, Netherlands</span></span>
<span class="code-line"><span class="nv">Server</span> <span class="o">=</span> http://ftp.nluug.nl/os/Linux/distr/archlinux/<span class="nv">$repo</span>/os/<span class="nv">$arch</span></span>
<span class="code-line"><span class="c1">## Score: 0.4, Poland</span></span>
<span class="code-line"> <span class="o">[</span> Read <span class="m">517</span> lines <span class="o">]</span></span>
<span class="code-line">^G Get Help ^O Write Out ^W Where Is ^K Cut Text ^J Justify ^C Cur Pos ^Y Prev Page</span>
<span class="code-line">^X Exit ^R Read File ^<span class="se">\ </span>Replace ^U Uncut Text ^T To Spell ^_ Go To Line ^V Next Page</span>
</pre></div>
<p>这是 GNU nano 的主界面,最简单的方法还是把下面那些 Mirrors 先全删掉然后输入一个新的,
用光标指向某一行以后同时按下 Ctrl+K 就好。然后自己输入一个 Mirror ,下面给出几个中国国内的 Mirror:</p>
<p>(所谓的 Ctrl+K 就是这两个键一起按😂)</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># 网易</span></span>
<span class="code-line"><span class="nv">Server</span> <span class="o">=</span> http://mirrors.163.com/archlinux/<span class="nv">$repo</span>/os/<span class="nv">$arch</span></span>
<span class="code-line"><span class="c1"># 清华大学 TUNA 协会</span></span>
<span class="code-line"><span class="nv">Server</span> <span class="o">=</span> https://mirrors.tuna.tsinghua.edu.cn/archlinux/<span class="nv">$repo</span>/os/<span class="nv">$arch</span></span>
<span class="code-line"><span class="c1"># 中国科学技术大学</span></span>
<span class="code-line"><span class="nv">Server</span> <span class="o">=</span> https://mirrors.ustc.edu.cn/archlinux/<span class="nv">$repo</span>/os/<span class="nv">$arch</span></span>
<span class="code-line"><span class="c1"># 西安交通大学</span></span>
<span class="code-line"><span class="nv">Server</span> <span class="o">=</span> https://mirrors.xjtu.edu.cn/archlinux/<span class="nv">$repo</span>/os/<span class="nv">$arch</span></span>
</pre></div>
<p>输入完以后按下 Ctrl+O 写入,按 Enter 确定,再按 Ctrl+X 退出。</p>
<p>然后用 <code class="code">
pacman -Syy</code>
刷新一下软件包数据库。</p>
<div class="highlight"><pre><span class="code-line"><span></span>root@archiso ~ <span class="c1"># pacman -Syy</span></span>
<span class="code-line">:: Synchronizing package databases...</span>
<span class="code-line">core <span class="m">120</span>.9 KiB <span class="m">4</span>.92M/s <span class="m">00</span>:00 <span class="o">[</span><span class="c1">##################################] 100%</span></span>
<span class="code-line">extra <span class="m">1755</span>.6 KiB <span class="m">5</span>.24M/s <span class="m">00</span>:00 <span class="o">[</span><span class="c1">##################################] 100%</span></span>
<span class="code-line">community <span class="m">3</span>.7 MiB <span class="m">6</span>.82M/s <span class="m">00</span>:01 <span class="o">[</span><span class="c1">##################################] 100%</span></span>
<span class="code-line">root@archiso ~ <span class="c1">#</span></span>
</pre></div>
</div>
<div class="section" id="id17">
<h2><a class="toc-backref" href="#id40">安装基本系统</a></h2>
<p>用 pacstrap 安装基本系统:</p>
<ul>
<li><p class="first">默认会安装 base 元包(包含基本系统所需的依赖)。</p>
<blockquote>
<p>如果汝在别的地方见到说 base 是个软件包组的说法,忘了它吧……</p>
</blockquote>
</li>
<li><p class="first">然后大多数情况下,汝还需要一个内核。目前官方仓库里有这些:</p>
<blockquote>
<ul class="simple">
<li>linux : 当前的稳定版本内核</li>
<li>linux-lts : 当前的长期支持版本内核</li>
<li>linux-hardened : 来自 <a class="reference external" href="https://github.com/anthraxx/linux-hardened">https://github.com/anthraxx/linux-hardened</a> 的安全强化内核</li>
<li>linux-zen : 来自 <a class="reference external" href="https://github.com/zen-kernel">https://github.com/zen-kernel</a> 的预载一定量优化的内核, 有人觉得在心理上会觉得跑得比 linux 快.......</li>
</ul>
<p>对于大多数情况下,汝可能会考虑安装固件包 linux-firmware 。</p>
</blockquote>
</li>
<li><p class="first">以及一个文字编辑器,例如刚才用到的 <code class="code">
nano</code>
。</p>
<blockquote>
<p>诶,base 组不包含 live 环境中所有的软件包么?是的,
<a class="reference external" href="https://projects.archlinux.org/archiso.git/tree/configs/releng/packages.x86_64">https://projects.archlinux.org/archiso.git/tree/configs/releng/packages.x86_64</a>
列出了在 ISO 中的 live 环境中安装的但不在 base 包中的软件包。</p>
</blockquote>
</li>
<li><p class="first">以及一些文件系统工具,如果汝和咱这里一样用了 ext4 的话,安装 e2fsprogs 就好,
需要读写其它文件系统的话,可以在 <a class="reference external" href="https://wiki.archlinux.org/index.php/File_system">https://wiki.archlinux.org/index.php/File_system</a>
找到相应的用户空间工具。</p>
</li>
<li><p class="first">要通过 AUR 或者 ABS 编译安装软件包,还需要安装 base-devel 啦 (现在它还是个软件包组)。</p>
</li>
<li><p class="first">要通过刚刚用过的 iwctl 连接无线网络的话,记得安装 iwd 。</p>
</li>
</ul>
<p>于是一个栗子大概像这样</p>
<div class="highlight"><pre><span class="code-line"><span></span>root@archiso ~ <span class="c1"># pacstrap /mnt base base-devel linux linux-firmware nano e2fsprogs iwd</span></span>
</pre></div>
<p>其他软件以后会用 pacman 再安装啦~</p>
<p>安装完以后大概会是这个样子 (´・ω・`)</p>
<div class="highlight"><pre><span class="code-line"><span></span>pacstrap /mnt base linux <span class="m">29</span>.09s user <span class="m">2</span>.61s system <span class="m">85</span>% cpu <span class="m">37</span>.271 total</span>
</pre></div>
</div>
<div class="section" id="chroot">
<h2><a class="toc-backref" href="#id41">准备进入 chroot 环境</a></h2>
<p>生成 fstab 啦 ~</p>
<blockquote>
<p>所以 fstab 又是个啥玩意?</p>
<p>fstab(5)文件可用于定义磁盘分区,各种其他块设备或远程文件系统应如何装入文件系统。</p>
<p>每个文件系统在一个单独的行中描述。这些定义将在引导时动态地转换为系统挂载单元,并在系统管理器的配置重新加载时转换。
在启动需要挂载的服务之前,默认设置会自动fsck和挂载文件系统。例如,systemd会自动确保远程文件系统挂载
(如NFS或Samba)仅在网络设置完成后启动。因此,在/etc/fstab中指定的本地和远程文件系统挂载应该是开箱即用的。</p>
<p>emmmmm</p>
</blockquote>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># genfstab</span></span>
<span class="code-line">usage: genfstab <span class="o">[</span>options<span class="o">]</span> root</span>
<span class="code-line"></span>
<span class="code-line">Options:</span>
<span class="code-line"> -L Use labels <span class="k">for</span> <span class="nb">source</span> identifiers <span class="o">(</span>shortcut <span class="k">for</span> -t LABEL<span class="o">)</span></span>
<span class="code-line"> -p Exclude pseudofs mounts <span class="o">(</span>default behavior<span class="o">)</span></span>
<span class="code-line"> -P Include printing mounts</span>
<span class="code-line"> -t TAG Use TAG <span class="k">for</span> <span class="nb">source</span> identifiers</span>
<span class="code-line"> -U Use UUIDs <span class="k">for</span> <span class="nb">source</span> identifiers <span class="o">(</span>shortcut <span class="k">for</span> -t UUID<span class="o">)</span></span>
<span class="code-line"></span>
<span class="code-line"> -h Print this <span class="nb">help</span> message</span>
<span class="code-line"></span>
<span class="code-line">genfstab generates output suitable <span class="k">for</span> addition to an fstab file based on the</span>
<span class="code-line">devices mounted under the mountpoint specified by the given root.</span>
</pre></div>
<div class="highlight"><pre><span class="code-line"><span></span>root@archiso ~ <span class="c1"># genfstab -U /mnt >> /mnt/etc/fstab</span></span>
</pre></div>
<p>然后用 arch-chroot 向新系统出发~</p>
<blockquote>
因为还有些配置没完成嘛……</blockquote>
<div class="highlight"><pre><span class="code-line"><span></span>root@archiso ~ <span class="c1"># arch-chroot -help</span></span>
<span class="code-line">usage: arch-chroot chroot-dir <span class="o">[</span>command<span class="o">]</span></span>
<span class="code-line"></span>
<span class="code-line"> -h Print this <span class="nb">help</span> message</span>
<span class="code-line"> -u <user><span class="o">[</span>:group<span class="o">]</span> Specify non-root user and optional group to use</span>
<span class="code-line"></span>
<span class="code-line">If <span class="s1">'command'</span> is unspecified, arch-chroot will launch /bin/bash.</span>
</pre></div>
<div class="highlight"><pre><span class="code-line"><span></span>root@archiso ~ <span class="c1"># arch-chroot /mnt /bin/bash</span></span>
<span class="code-line"><span class="o">[</span>root@archiso /<span class="o">]</span> <span class="c1">#</span></span>
</pre></div>
</div>
<div class="section" id="id18">
<h2><a class="toc-backref" href="#id42">设置基本系统</a></h2>
<blockquote>
# 开头只表示以 root 用户运行,汝不用把 # 输入到终端里啦~</blockquote>
<ul class="simple">
<li>设置时区(中国的时区是 Asia/Shanghai)</li>
</ul>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># ln -s <源文件> <目标> 创建一个符号链接</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="c1"># ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime</span></span>
</pre></div>
<ul class="simple">
<li>设置时间标准 为 UTC,并调整 时间漂移:</li>
</ul>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># hwclock --systohc --utc</span></span>
</pre></div>
<p>如果汝正在尝试安装双系统,在进入 Windows 以后可能会发现 Windows 的时间不对了 ,因为 Windows 默认的硬件时钟是 localtime(</p>
<p>可以用一条注册表键值让 Windows 使用 UTC 作为硬件时钟(在早于 Windows 7 的系统上发现过这样做会出现一些严重的问题:
<a class="reference external" href="http://www.cl.cam.ac.uk/~mgk25/mswish/ut-rtc.html">http://www.cl.cam.ac.uk/~mgk25/mswish/ut-rtc.html</a> )</p>
<blockquote>
reg add "HKEY_LOCAL_MACHINESystemCurrentControlSetControlTimeZoneInformation" /v RealTimeIsUniversal /d 1 /t REG_DWORD /f</blockquote>
<ul class="simple">
<li>/etc/locale.gen 是一个仅包含注释文档的文本文件。指定您需要的本地化类型,去掉对应行前面的注释符号(#)就可以啦,还是用 nano 打开,建议选择帶UTF-8的項:</li>
</ul>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># nano /etc/locale.gen</span></span>
<span class="code-line"></span>
<span class="code-line">en_US.UTF-8 UTF-8</span>
<span class="code-line">zh_CN.UTF-8 UTF-8</span>
<span class="code-line">zh_TW.UTF-8 UTF-8</span>
</pre></div>
<ul class="simple">
<li>执行 locale-gen 以生成 locale 讯息:</li>
</ul>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># locale-gen</span></span>
</pre></div>
<ul>
<li><p class="first">创建 locale.conf 并提交您的本地化选项:</p>
<blockquote>
<p>将系统 locale 设置为en_US.UTF-8,系统的 Log 就会用英文显示,这样更容易问题的判断和处理。用户可以设置自己的 locale。</p>
<p>警告: 不推荐在此设置任何中文locale,或导致tty乱码。</p>
</blockquote>
</li>
</ul>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># echo 用来输出某些文字,后面的大于号表示把输出保存到某个文件里啦~</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="c1"># 或者可以用文字编辑器新建这个文件加上这一行。</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="c1"># echo LANG=en_US.UTF-8 > /etc/locale.conf</span></span>
</pre></div>
<ul class="simple">
<li>设置一个喜欢的主机名(用汝的主机名代替 myhostname ):</li>
</ul>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># echo myhostname > /etc/hostname</span></span>
</pre></div>
<ul class="simple">
<li>设置 root 的密码(输入密码的时候就是啥也没有 ╮( ̄▽ ̄)╭ ):</li>
</ul>
<div class="highlight"><pre><span class="code-line"><span></span><span class="o">[</span>root@archiso /<span class="o">]</span><span class="c1"># passwd</span></span>
<span class="code-line">New password:</span>
<span class="code-line">Retype new password:</span>
<span class="code-line">passwd: password updated successfully</span>
</pre></div>
<p>以及汝大多数时候应该是用不到这个密码的(</p>
<ul>
<li><p class="first">安装启动加载器(例如 GRUB ):</p>
<blockquote>
<p>启动加载器是 BIOS 或 UEFI 启动的第一个程序。它负责使用正确的内核参数加载内核,
并根据配置文件加载初始化 RAM disk。</p>
<p>如果对其它的启动管理器有兴趣的话,记得去看 <a class="reference external" href="https://wiki.archlinux.org/index.php/Arch_boot_process#Boot_loader">https://wiki.archlinux.org/index.php/Arch_boot_process#Boot_loader</a> 。</p>
</blockquote>
</li>
</ul>
<dl class="docutils">
<dt>** UEFI 用户先再安装几个必要的软件包咯, efibootmgr 用于修改 UEFI 固件中的某些信息,</dt>
<dd><p class="first">dosfstools 包含了操作 FAT/FAT32 文件系统所需的用户空间工具。</p>
<blockquote class="last">
# pacman -S efibootmgr dosfstools</blockquote>
</dd>
</dl>
<p>** 然后安装 GRUB (如果汝的硬盘上没有其它系统,那么可以不用装 os-prober )</p>
<blockquote>
# pacman -S grub os-prober</blockquote>
<p>** 把 GRUB 安装到硬盘:</p>
<blockquote>
<p># MBR 用户这么做 (记得用汝自己硬盘的名称代替 sda ,不要带上表示分区的数字啦~):</p>
<p># grub-install --target=i386-pc /dev/sda --recheck</p>
<p># UEFI 用户这么做(如果汝没把 EFI 系统分区挂载到 /boot ,请自行修改 --efi-directory 的值):</p>
<p># grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=grub --recheck</p>
</blockquote>
<p>EFI 安装成功以后大概像这样 😂</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="o">[</span>root@archiso /<span class="o">]</span><span class="c1"># grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=grub --recheck</span></span>
<span class="code-line">Installing <span class="k">for</span> x86_64-efi platform.</span>
<span class="code-line">Installation finished. No error reported.</span>
</pre></div>
<p>然后生成必要的配置文件:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="o">[</span>root@archiso /<span class="o">]</span><span class="c1"># grub-mkconfig -o /boot/grub/grub.cfg</span></span>
<span class="code-line">Generating grub configuration file ...</span>
<span class="code-line">Found linux image: /boot/vmlinuz-linux</span>
<span class="code-line">Found initrd image<span class="o">(</span>s<span class="o">)</span> in /boot: initramfs-linux.img</span>
<span class="code-line">Found fallback initrd image<span class="o">(</span>s<span class="o">)</span> in /boot: initramfs-linux-fallback.img</span>
<span class="code-line"><span class="k">done</span></span>
</pre></div>
<p>如果汝安装了 os-prober 然后看到这样的警告:</p>
<blockquote>
WARNING: Failed to connect to lvmetad. Falling back to device scanning.</blockquote>
<p>这是因为在 chroot 环境里面 /run 是不可用的。只要每个步骤都做对了,这些警告不会影响系统启动,
汝可以放心继续进行下一步的系统安装咯。
如果汝重启之后没看到 Windows 的启动项,试着进入 Arch 之后再运行那条生成配置文件的命令。</p>
<p><del>因为 GRUB 是一个操作系统</del>,它的配置和使用可能会非常复杂,可以在
<a class="reference external" href="https://wiki.archlinux.org/index.php/GRUB">https://wiki.archlinux.org/index.php/GRUB</a> 上找到一些提示和疑难排解技巧。</p>
</div>
<div class="section" id="sudo">
<h2><a class="toc-backref" href="#id43">设置 sudo</a></h2>
<blockquote>
<p>所以这又是个啥玩意? (´_`)</p>
<p>因为 root 用户的权力很大而且很危险,所以轻易不会用到它 (。>ω<)。</p>
<p>所以就有了 sudo(substitute user do) 使得系统管理员可以授权特定用户或用户组作为 root
或其他用户执行某些(或所有)命令,同时还能够对命令及其参数提供审核跟踪。</p>
<p>(话风突变)</p>
</blockquote>
<p>sudo 应该已经作为 base-devel 的一部分装上去了,如果没有的话汝也可以自己手动安装一下:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="o">[</span>root@archiso /<span class="o">]</span><span class="c1"># pacman -S sudo</span></span>
</pre></div>
<p>sudo 的配置文件是 /etc/sudoers ,但是咱们不会直接去编辑它(因为一旦搞坏了不好修)。
所以有一个 visudo 的命令用来代理编辑它(就是先编辑一个临时文件,然后检查有没有错误,
一切 OK 后再覆盖)。</p>
<p>嗯…… visudo? 如果汝觉得 vi 哪里眼熟的话,没错! 这个命令默认会用 vi 去编辑那个文件。
如果汝想用其他的编辑器(例如刚刚用的 nano)的话,可以通过一个环境变量:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="o">[</span>root@archiso /<span class="o">]</span><span class="c1"># EDITOR=nano visudo</span></span>
</pre></div>
<p>现在大概像这个样子:</p>
<div class="highlight"><pre><span class="code-line"><span></span>GNU nano 3.2 /etc/sudoers.tmp</span>
<span class="code-line"></span>
<span class="code-line">## sudoers file.</span>
<span class="code-line">##</span>
<span class="code-line">## This file MUST be edited with the 'visudo' command as root.</span>
<span class="code-line">## Failure to use 'visudo' may result in syntax or file permission errors</span>
<span class="code-line">## that prevent sudo from running.</span>
<span class="code-line">##</span>
<span class="code-line">## See the sudoers man page for the details on how to write a sudoers file.</span>
<span class="code-line">##</span>
<span class="code-line"></span>
<span class="code-line">##</span>
<span class="code-line">## Host alias specification</span>
<span class="code-line">##</span>
<span class="code-line">## Groups of machines. These may include host names (optionally with wildcards),</span>
<span class="code-line">## IP addresses, network numbers or netgroups.</span>
<span class="code-line"># Host_Alias WEBSERVERS = www1, www2, www3</span>
<span class="code-line"></span>
<span class="code-line">##</span>
<span class="code-line">## User alias specification</span>
<span class="code-line">##</span>
<span class="code-line"> [ Read 97 lines ]</span>
<span class="code-line">^G Get Help ^O Write Out ^W Where Is ^K Cut Text ^J Justify ^C Cur Pos M-U Undo M-A Mark Text</span>
<span class="code-line">^X Exit ^R Read File ^\ Replace ^U Uncut Text ^T To Spell ^_ Go To Line M-E Redo M-6 Copy Text</span>
</pre></div>
<p>虽然这个文件有很多行,但是咱们还是先从让它能够工作开始来最小的修改它。</p>
<p>找到下面的这一行,然后把 %wheel 前面的注释符号(#)去掉,不过百分号要留下:</p>
<div class="highlight"><pre><span class="code-line"><span></span>## Uncomment to allow members of group wheel to execute any command</span>
<span class="code-line"># %wheel ALL=(ALL) ALL</span>
</pre></div>
<p>然后就可以保存退出啦~ (效果就是注释里说明的,给 wheel 组执行所有命令的权限)</p>
<p>如果汝不想每一次都在前面加上 EDITOR 来指定编辑器的话,可以加上这几行:</p>
<div class="highlight"><pre><span class="code-line"><span></span># 重设默认的环境变量</span>
<span class="code-line">Defaults env_reset</span>
<span class="code-line"># 设置默认的编辑器,并使 visudo 不再读取环境变量 editor 的值。</span>
<span class="code-line">Defaults editor=/usr/bin/nano, !env_editor</span>
</pre></div>
<p>如果汝想进一步了解 sudo 的配置的话,还是去看 ArchWiki: <a class="reference external" href="https://wiki.archlinux.org/index.php/Sudo">https://wiki.archlinux.org/index.php/Sudo</a></p>
</div>
<div class="section" id="id19">
<h2><a class="toc-backref" href="#id44">安装桌面环境</a></h2>
<ul class="simple">
<li>安装桌面环境需要的基础包 (就是 xorg 啦)</li>
</ul>
<div class="highlight"><pre><span class="code-line"><span></span><span class="o">[</span>root@archiso /<span class="o">]</span><span class="c1"># pacman -S xorg</span></span>
<span class="code-line">:: There are <span class="m">80</span> members in group xorg:</span>
<span class="code-line">:: Repository extra</span>
<span class="code-line"><span class="m">1</span><span class="o">)</span> xf86-input-evdev <span class="m">2</span><span class="o">)</span> xf86-input-joystick <span class="m">3</span><span class="o">)</span> xf86-input-keyboard <span class="m">4</span><span class="o">)</span> xf86-input-libinput</span>
<span class="code-line"><span class="m">5</span><span class="o">)</span> xf86-input-mouse <span class="m">6</span><span class="o">)</span> xf86-input-synaptics <span class="m">7</span><span class="o">)</span> xf86-input-vmmouse <span class="m">8</span><span class="o">)</span> xf86-input-void</span>
<span class="code-line"><span class="m">9</span><span class="o">)</span> xf86-video-amdgpu <span class="m">10</span><span class="o">)</span> xf86-video-ark <span class="m">11</span><span class="o">)</span> xf86-video-ati <span class="m">12</span><span class="o">)</span> xf86-video-dummy</span>
<span class="code-line"><span class="m">13</span><span class="o">)</span> xf86-video-fbdev <span class="m">14</span><span class="o">)</span> xf86-video-glint <span class="m">15</span><span class="o">)</span> xf86-video-i128 <span class="m">16</span><span class="o">)</span> xf86-video-intel</span>
<span class="code-line"><span class="m">17</span><span class="o">)</span> xf86-video-mach64 <span class="m">18</span><span class="o">)</span> xf86-video-neomagic <span class="m">19</span><span class="o">)</span> xf86-video-nouveau <span class="m">20</span><span class="o">)</span> xf86-video-nv</span>
<span class="code-line"><span class="m">21</span><span class="o">)</span> xf86-video-openchrome <span class="m">22</span><span class="o">)</span> xf86-video-r128 <span class="m">23</span><span class="o">)</span> xf86-video-savage <span class="m">24</span><span class="o">)</span> xf86-video-siliconmotion</span>
<span class="code-line"><span class="m">25</span><span class="o">)</span> xf86-video-sis <span class="m">26</span><span class="o">)</span> xf86-video-tdfx <span class="m">27</span><span class="o">)</span> xf86-video-trident <span class="m">28</span><span class="o">)</span> xf86-video-vesa</span>
<span class="code-line"><span class="m">29</span><span class="o">)</span> xf86-video-vmware <span class="m">30</span><span class="o">)</span> xf86-video-voodoo <span class="m">31</span><span class="o">)</span> xorg-bdftopcf <span class="m">32</span><span class="o">)</span> xorg-docs <span class="m">33</span><span class="o">)</span> xorg-font-util</span>
<span class="code-line"><span class="m">34</span><span class="o">)</span> xorg-fonts-100dpi <span class="m">35</span><span class="o">)</span> xorg-fonts-75dpi <span class="m">36</span><span class="o">)</span> xorg-fonts-encodings <span class="m">37</span><span class="o">)</span> xorg-iceauth</span>
<span class="code-line"><span class="m">38</span><span class="o">)</span> xorg-luit <span class="m">39</span><span class="o">)</span> xorg-mkfontdir <span class="m">40</span><span class="o">)</span> xorg-mkfontscale <span class="m">41</span><span class="o">)</span> xorg-server <span class="m">42</span><span class="o">)</span> xorg-server-common</span>
<span class="code-line"><span class="m">43</span><span class="o">)</span> xorg-server-devel <span class="m">44</span><span class="o">)</span> xorg-server-xdmx <span class="m">45</span><span class="o">)</span> xorg-server-xephyr <span class="m">46</span><span class="o">)</span> xorg-server-xnest</span>
<span class="code-line"><span class="m">47</span><span class="o">)</span> xorg-server-xvfb <span class="m">48</span><span class="o">)</span> xorg-server-xwayland <span class="m">49</span><span class="o">)</span> xorg-sessreg <span class="m">50</span><span class="o">)</span> xorg-setxkbmap</span>
<span class="code-line"><span class="m">51</span><span class="o">)</span> xorg-smproxy <span class="m">52</span><span class="o">)</span> xorg-x11perf <span class="m">53</span><span class="o">)</span> xorg-xauth <span class="m">54</span><span class="o">)</span> xorg-xbacklight <span class="m">55</span><span class="o">)</span> xorg-xcmsdb</span>
<span class="code-line"><span class="m">56</span><span class="o">)</span> xorg-xcursorgen <span class="m">57</span><span class="o">)</span> xorg-xdpyinfo <span class="m">58</span><span class="o">)</span> xorg-xdriinfo <span class="m">59</span><span class="o">)</span> xorg-xev <span class="m">60</span><span class="o">)</span> xorg-xgamma</span>
<span class="code-line"><span class="m">61</span><span class="o">)</span> xorg-xhost <span class="m">62</span><span class="o">)</span> xorg-xinput <span class="m">63</span><span class="o">)</span> xorg-xkbcomp <span class="m">64</span><span class="o">)</span> xorg-xkbevd <span class="m">65</span><span class="o">)</span> xorg-xkbutils <span class="m">66</span><span class="o">)</span> xorg-xkill</span>
<span class="code-line"><span class="m">67</span><span class="o">)</span> xorg-xlsatoms <span class="m">68</span><span class="o">)</span> xorg-xlsclients <span class="m">69</span><span class="o">)</span> xorg-xmodmap <span class="m">70</span><span class="o">)</span> xorg-xpr <span class="m">71</span><span class="o">)</span> xorg-xprop</span>
<span class="code-line"><span class="m">72</span><span class="o">)</span> xorg-xrandr <span class="m">73</span><span class="o">)</span> xorg-xrdb <span class="m">74</span><span class="o">)</span> xorg-xrefresh <span class="m">75</span><span class="o">)</span> xorg-xset <span class="m">76</span><span class="o">)</span> xorg-xsetroot <span class="m">77</span><span class="o">)</span> xorg-xvinfo</span>
<span class="code-line"><span class="m">78</span><span class="o">)</span> xorg-xwd <span class="m">79</span><span class="o">)</span> xorg-xwininfo <span class="m">80</span><span class="o">)</span> xorg-xwud</span>
<span class="code-line"></span>
<span class="code-line">Enter a selection <span class="o">(</span><span class="nv">default</span><span class="o">=</span>all<span class="o">)</span>:</span>
</pre></div>
<p>这时会让汝选择需要哪些软件包啦,其实大多数时候默认的就行……</p>
<ul>
<li><p class="first">接下来挑一个喜欢的桌面环境包组装上咯~</p>
<blockquote>
<p>(咱这里就只举例 GNOME 、KDE 和 xfce 啦,其他官方支持的桌面环境可以去
<a class="reference external" href="https://wiki.archlinux.org/index.php">https://wiki.archlinux.org/index.php</a>/Desktop_environment_(简体中文)
查看)</p>
<p>GNOME , 想要 GNOME 全家桶的话带上 gnome-extras</p>
<p># pacman -S gnome</p>
<p>KDE Plasma , 想要 KDE 全家桶的话用 kde-applications-meta 代替 。
kde-applications 会提示汝选择要安装哪些包。</p>
<p>以及一个显示管理器, KDE 和 sddm 一起使用最好。</p>
<p># pacman -S plasma sddm kde-applications</p>
<p>或者只安装 kdebase 组,包含了一些基本组件(例如文件管理器和终端模拟器)。</p>
<p># pacman -S plasma sddm kdebase</p>
<p>xfce4,xfce 不带显示管理器,所以要装个其他的(例如 lightdm,还要装一个 greeter)</p>
<p># pacman -S xfce4 xfce4-goodies lightdm lightdm-gtk-greeter</p>
<p>桌面环境大多数使用 NetworkManager ,xfce 的话,记得安装 network-manager-applet,
一个控制 NetworkManager 的小工具:</p>
<p># pacman -S networkmanager</p>
</blockquote>
</li>
<li><p class="first">然后安装中文字体( 同样的方法安装 😋)</p>
<blockquote>
<p>Google Noto Fonts 系列: noto-fonts noto-fonts-cjk noto-fonts-emoji</p>
<p>思源黑体:adobe-source-han-sans-otc-fonts</p>
<p>文泉驿:wqy-microhei wqy-zenhei</p>
</blockquote>
</li>
</ul>
<p>更多的字体可以在 <a class="reference external" href="https://wiki.archlinux.org/index.php">https://wiki.archlinux.org/index.php</a>/Fonts_(简体中文) 找到。</p>
</div>
<div class="section" id="id20">
<h2><a class="toc-backref" href="#id45">收尾工作</a></h2>
<ul>
<li><p class="first">新建一个用户</p>
<blockquote>
<p>-m 为新用户创建一个目录,-s 设置用户的登录 Shell -G 会把新建的用户追加到某个组中
(这里是刚刚 sudo 里的那个 wheel)</p>
<p>记得最后是用户名就好 😂</p>
<p># useradd -m -G wheel horo</p>
<p>然后设置密码(记得是输入两次,而且输入过程中不会有显示,不要以为是键盘坏了哦)</p>
<p># passwd horo</p>
</blockquote>
</li>
<li><p class="first">激活需要的服务,例如一个显示管理器,在例如 gdm :</p>
<blockquote>
<p># systemctl enable gdm</p>
<p>当然还有 NetworkManager:</p>
<p># systemctl enable NetworkManager</p>
<p>(这个里面有大写😂)</p>
<p>systemd 是 Arch Linux 现在唯一的 init 程序,当内核加载完毕后,首先被加载的
就是 init (这里就是 systemd 啦)。然后 systemd 会接着加载剩下的部分。</p>
<p><a class="reference external" href="https://wiki.archlinux.org/index.php/systemd">https://wiki.archlinux.org/index.php/systemd</a></p>
</blockquote>
</li>
<li><p class="first">设置用户级别的 locale</p>
<blockquote>
<p>用 su 切换到刚建立的用户,然后编辑 ~/.config/locale.conf 修改自己的 Locale ,例如:</p>
</blockquote>
</li>
</ul>
<div class="highlight"><pre><span class="code-line"><span></span><span class="nv">LANG</span><span class="o">=</span>zh_CN.UTF-8</span>
<span class="code-line"><span class="nv">LC_CTYPE</span><span class="o">=</span><span class="s2">"zh_CN.UTF-8"</span></span>
<span class="code-line"><span class="nv">LC_NUMERIC</span><span class="o">=</span><span class="s2">"zh_CN.UTF-8"</span></span>
<span class="code-line"><span class="nv">LC_TIME</span><span class="o">=</span><span class="s2">"zh_CN.UTF-8"</span></span>
<span class="code-line"><span class="nv">LC_COLLATE</span><span class="o">=</span><span class="s2">"zh_CN.UTF-8"</span></span>
<span class="code-line"><span class="nv">LC_MONETARY</span><span class="o">=</span><span class="s2">"zh_CN.UTF-8"</span></span>
<span class="code-line"><span class="nv">LC_MESSAGES</span><span class="o">=</span><span class="s2">"zh_CN.UTF-8"</span></span>
<span class="code-line"><span class="nv">LC_PAPER</span><span class="o">=</span><span class="s2">"zh_CN.UTF-8"</span></span>
<span class="code-line"><span class="nv">LC_NAME</span><span class="o">=</span><span class="s2">"zh_CN.UTF-8"</span></span>
<span class="code-line"><span class="nv">LC_ADDRESS</span><span class="o">=</span><span class="s2">"zh_CN.UTF-8"</span></span>
<span class="code-line"><span class="nv">LC_TELEPHONE</span><span class="o">=</span><span class="s2">"zh_CN.UTF-8"</span></span>
<span class="code-line"><span class="nv">LC_MEASUREMENT</span><span class="o">=</span><span class="s2">"zh_CN.UTF-8"</span></span>
<span class="code-line"><span class="nv">LC_IDENTIFICATION</span><span class="o">=</span><span class="s2">"zh_CN.UTF-8"</span></span>
<span class="code-line"><span class="nv">LC_ALL</span><span class="o">=</span></span>
</pre></div>
<p>或者可以重启以后用桌面环境的设置程序改 😂</p>
</div>
<div class="section" id="id21">
<h2><a class="toc-backref" href="#id46">完工啦</a></h2>
<ul>
<li><p class="first">离开 chroot 环境:</p>
<blockquote>
<p># exit</p>
</blockquote>
</li>
<li><p class="first">卸载挂载的分区,(其实不是必须的,因为马上就重启啦~)</p>
<blockquote>
<p># umount -R /mnt</p>
</blockquote>
</li>
<li><p class="first">重新启动,准备迎接新的系统吧 ~(>_<~)</p>
</li>
</ul>
</div>
<hr class="docutils"/>
<div class="section" id="arch-linux">
<h2><a class="toc-backref" href="#id47">欢迎来到 Arch Linux 的世界!</a></h2>
<blockquote>
Cheers! 汝刚刚成功的安装 Arch Linux 到汝的电脑中了呐!</blockquote>
<p>那接下来要干啥呢?</p>
<ul class="simple">
<li><a class="reference external" href="https://wiki.archlinux.org/">ArchWiki</a> 是 Arch Linux 文档的集中地,
遇到了问题或是只想找些好玩的?去翻翻吧,例如
<a class="reference external" href="https://wiki.archlinux.org/index.php/General_recommendations_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)">常见操作</a>
和 <a class="reference external" href="https://wiki.archlinux.org/index.php/List_of_applications_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)">应用列表</a></li>
<li>Arch Linux 是由一群有爱的志愿者开发出来的,当然汝也有可能会是其中的一员。
去 <a class="reference external" href="https://wiki.archlinux.org/index.php/Getting_involved">Getting_involved</a> 看看哪里能帮的上忙吧,谢谢啦~</li>
<li>或者汝希望找个组织?可以来 <a class="reference external" href="http://fars.ee/~readme.html">中文社区交流群</a> ,
或者 <a class="reference external" href="https://wiki.archlinux.org/index.php/IRC_channel">更国际化(?)的 IRC 频道</a></li>
<li>...... (其实汝现在可以做的事情有很多啦 😄)</li>
</ul>
</div>
和雨宫恋叶交换问题!2019-09-22T00:00:00+08:002019-09-22T00:00:00+08:00ホロtag:None,2019-09-22:/life/question_exchange_shadowrz.html<p>终于还是咕咕出来了?</p>
<blockquote>
(雨宫恋叶 == Chaotic Dimension == ShadowRZ == 布偶君) = True</blockquote>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id5">咱的问题和雨宫恋叶的回答~</a></h2>
<p><a class="reference external" href="https://shadowrz.github.io/posts.d/2019/09/21/qa-with-horo.html">直接去它(?)的 Blog 上看咯~</a></p>
</div>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id6">雨宫恋叶的问题和咱的回答~</a></h2>
<ul>
<li><p class="first">对于你来说,你最希望拥有什么样的硬件?</p>
<blockquote>
<p>TL;DR: 真正属于自己的硬件(?)</p>
<p>加长版:就想要所有硬件都由自由软件驱动,仅支持自由软件的 GNU/Linux 发行版用起来也
十分愉快的那种。如果不是强调轻薄的话最好可以自由更换标准部件,在比较长的一段时间
里可以通过升级硬件达到接近未来的性能。(咱到底是在说啥啊……)</p>
</blockquote>
</li>
<li><p class="first">Stallman 无数次强调 Free software 中的 Free 之表意,会不会与美国的语言文化有关?</p>
<blockquote>
<p>大概只和英语本身有关系(?):</p>
<blockquote>
<p>很多语言都拥有两个独立的单词来表示自由和免费。
例如,法语中有“libre”和“gratuit”。而英语则不是:在英语中确实有一个单词
“gratis”用于无歧义地表示免费,但没有普通的形容词用于无歧义地表示自由。</p>
</blockquote>
<p>以及大家都在说 …</p></blockquote></li></ul></div><p>终于还是咕咕出来了?</p>
<blockquote>
(雨宫恋叶 == Chaotic Dimension == ShadowRZ == 布偶君) = True</blockquote>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id5">咱的问题和雨宫恋叶的回答~</a></h2>
<p><a class="reference external" href="https://shadowrz.github.io/posts.d/2019/09/21/qa-with-horo.html">直接去它(?)的 Blog 上看咯~</a></p>
</div>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id6">雨宫恋叶的问题和咱的回答~</a></h2>
<ul>
<li><p class="first">对于你来说,你最希望拥有什么样的硬件?</p>
<blockquote>
<p>TL;DR: 真正属于自己的硬件(?)</p>
<p>加长版:就想要所有硬件都由自由软件驱动,仅支持自由软件的 GNU/Linux 发行版用起来也
十分愉快的那种。如果不是强调轻薄的话最好可以自由更换标准部件,在比较长的一段时间
里可以通过升级硬件达到接近未来的性能。(咱到底是在说啥啊……)</p>
</blockquote>
</li>
<li><p class="first">Stallman 无数次强调 Free software 中的 Free 之表意,会不会与美国的语言文化有关?</p>
<blockquote>
<p>大概只和英语本身有关系(?):</p>
<blockquote>
<p>很多语言都拥有两个独立的单词来表示自由和免费。
例如,法语中有“libre”和“gratuit”。而英语则不是:在英语中确实有一个单词
“gratis”用于无歧义地表示免费,但没有普通的形容词用于无歧义地表示自由。</p>
</blockquote>
<p>以及大家都在说“free”,不管是自由软件开发者还是私有软件开发者:</p>
<blockquote>
<p>自由软件关乎自由而非价格。但是专有软件公司一般使用“free software”这一短语来指代价格。
有时它们的意思是您可以免费获得一份二进制副本;有时它们的意思是在您所购买的计算机上捆绑
了一份副本,而整台计算机的价格包含了二者各自的价格。不管是哪种方式,这都与我们在 GNU
计划中所指的自由软件无关。</p>
<p>由于这种潜在的混淆,当一家软件公司宣称它的产品是“free software”的时候,务必查看实际
的发布条款以确认用户是否真正拥有自由软件所蕴含的所有基本自由。
有时它真的属于自由软件,有时它不是。</p>
</blockquote>
<p>至于中文的话,这两个概念倒是以“自由”和“免费”的名义区分开了……</p>
</blockquote>
</li>
<li><p class="first">自由软件定义是否需要全面修订?</p>
<blockquote>
<p><del>知らんけど~</del></p>
<p>首先咱没觉得现在的定义有啥不妥,</p>
<p>然后这种基础的定义要修订起来通常都不容易(参考隔壁国际单位制,最近刚把基本单位
都定义成和物理常数有关的形式)。</p>
<p>在然后咱也没有编修这些花里胡哨(?)的文字内容的功力啦,自然也没有什么建议。</p>
</blockquote>
</li>
<li><p class="first">对于我的作品来说,你认为我目前的写作风格如何?</p>
<blockquote>
<p><del>“咱不认识字。”</del></p>
<p>除了剧情很迷以外貌似没什么问题( <del>当然也没什么风格……</del> ),风格这种东西大概要
写成相当的规模的时候才能有印象吧(?)</p>
</blockquote>
</li>
<li><p class="first">你有没有想对现实中的人隐藏,回避的某些东西?</p>
<blockquote>
<p>有,例如现在在做的事。(但其实也有现实中的朋友知道了,未来可能会在某个
不为现在知道的任何人所知的地方重新继续开始吧……)</p>
</blockquote>
</li>
<li><p class="first">我感觉你是个 ReST 苦手(指不会用),之前看到你嵌入 Wikimedia Commons 的 SVG 时,
疑似因为 Pelican 的失误导致出了一个 <object> 嵌入 SVG。然而……正确在一个响应式设计里插入
SVG 应该用 <img>,你需要 Raw HTML…… 那么你最熟悉的标记语言是什么?
你为什么没有选择在 Pelican 里使用 Markdown??</p>
<blockquote>
<p>常用的 HTML 、reStructuredText 、Markdown 和 MediaWiki 里并没有哪个觉得特别熟 😂</p>
<p>为啥没用 Markdown ? 因为当初从 <a class="reference external" href="/links.html#farseerfc">farseerfc</a> 那里听到 Pelican 然后开始用的时候
Pelican 还没支持 Markdown 鸭 …… 而且现在哪怕支持了,不少插件都是围着 reST 的模式
做的,也没有什么特别的动力换 Markdown 的样子……</p>
<p>(不过倒是有打算用一个支持 Markdown 的博客软件/生成器啥的再全新开始一次(咕咕咕……))</p>
</blockquote>
</li>
<li><p class="first">你讨厌某个人的存在本身吗?</p>
<blockquote>
<p>虽然有时会讨厌某些人的行为什么的,但是存在啥的就没必要如此耿耿于怀啦……</p>
<p>(虽然还是会竭力不相往来就是了……)</p>
</blockquote>
</li>
</ul>
</div>
<div class="section" id="id4">
<h2><a class="toc-backref" href="#id7">那么下一个是?</a></h2>
<p>其实还没想好 😂,如果咱友链里剩下的谁愿意自告奋勇也热烈欢迎啦 ……</p>
<p><del>熟悉的感觉……</del></p>
</div>
香港之行s2019-08-27T00:00:00+08:002019-08-27T00:00:00+08:00ホロtag:None,2019-08-27:/life/travel_on_hongkong.html<p>这篇文章其实并不是去之后几天写的,期间的各种情况 <del>可能</del> 肯定
已经发生了各种变化,所以只能用来当作纪念了(?)</p>
<p><del>咱去深圳有很大的原因是为了这个(x)</del></p>
<div class="section" id="id1">
<h2>通行证(中国内地公民限定)</h2>
<p>只有中国内地居民前往香港需要准备一个叫做往来港澳通行证的证件才能前往
香港和澳门(其它国家或地区的公民需要什么准备才能前往香港咱就没有深究啦~)。</p>
<ul class="simple">
<li>如果汝的户籍所在地不能申请个人旅游签注也不用担心,团队旅游签注过关时
不再要求查验团队名单,所以可以直接用。</li>
<li>深圳户籍居民另可办理一年多次赴港签注,每周最多可前往香港一次。</li>
<li>介于某企鹅公司的总部在深圳的缘故(大雾),办理通行证需要预约,
而预约通行证办理需要在微信上完成 🌚</li>
</ul>
<p><del>就当作 15 块钱买张去香港的门票好了(大雾)</del></p>
<img alt="落马洲支线管制站前" class="materialboxed responsive-img" src="/images/travel_on_hongkong/IMG_20190622_090831.jpg"/>
</div>
<div class="section" id="id2">
<h2>一些清单(?)</h2>
<div class="section" id="id3">
<h3>过境</h3>
<p>从深圳前往香港的途径有好几种:</p>
<ul class="simple">
<li>福田口岸(4号线福田口岸站)和罗湖口岸(1号线罗湖站附近),通关
后前往港铁落马洲/罗湖站换乘东铁线。</li>
<li>在深圳北站/福田站搭乘广深港高速铁路前往香港西九龙站。</li>
<li>深圳湾口岸和皇岗口岸(但是咱没去过不知道细节)</li>
</ul>
</div>
<div class="section" id="id4">
<h3>通信</h3>
<p>到了香港之后汝中国内地的手机卡就算是漫游了咯,虽然最近联通和电信在
搞啥“促销”(1元/M,25元后当日不计费,200M后限速 …</p></div></div><p>这篇文章其实并不是去之后几天写的,期间的各种情况 <del>可能</del> 肯定
已经发生了各种变化,所以只能用来当作纪念了(?)</p>
<p><del>咱去深圳有很大的原因是为了这个(x)</del></p>
<div class="section" id="id1">
<h2>通行证(中国内地公民限定)</h2>
<p>只有中国内地居民前往香港需要准备一个叫做往来港澳通行证的证件才能前往
香港和澳门(其它国家或地区的公民需要什么准备才能前往香港咱就没有深究啦~)。</p>
<ul class="simple">
<li>如果汝的户籍所在地不能申请个人旅游签注也不用担心,团队旅游签注过关时
不再要求查验团队名单,所以可以直接用。</li>
<li>深圳户籍居民另可办理一年多次赴港签注,每周最多可前往香港一次。</li>
<li>介于某企鹅公司的总部在深圳的缘故(大雾),办理通行证需要预约,
而预约通行证办理需要在微信上完成 🌚</li>
</ul>
<p><del>就当作 15 块钱买张去香港的门票好了(大雾)</del></p>
<img alt="落马洲支线管制站前" class="materialboxed responsive-img" src="/images/travel_on_hongkong/IMG_20190622_090831.jpg"/>
</div>
<div class="section" id="id2">
<h2>一些清单(?)</h2>
<div class="section" id="id3">
<h3>过境</h3>
<p>从深圳前往香港的途径有好几种:</p>
<ul class="simple">
<li>福田口岸(4号线福田口岸站)和罗湖口岸(1号线罗湖站附近),通关
后前往港铁落马洲/罗湖站换乘东铁线。</li>
<li>在深圳北站/福田站搭乘广深港高速铁路前往香港西九龙站。</li>
<li>深圳湾口岸和皇岗口岸(但是咱没去过不知道细节)</li>
</ul>
</div>
<div class="section" id="id4">
<h3>通信</h3>
<p>到了香港之后汝中国内地的手机卡就算是漫游了咯,虽然最近联通和电信在
搞啥“促销”(1元/M,25元后当日不计费,200M后限速),不过还是觉得不太够用?</p>
<ul class="simple">
<li>口岸周围或者网上好像可以买到若干日用的上网卡(但是咱没买过)</li>
<li>港铁九龙塘/旺角东站有 SmarTone 的自助售货机,可以买到当地的储值卡(预付费 SIM 卡)。</li>
<li>土豪玩家可以考虑 Google Fi(大嘘),或者当地的手机运营商合约(称作“上台”)。</li>
</ul>
<img alt="港铁九龙塘站的自助售货机" class="materialboxed responsive-img" src="/images/travel_on_hongkong/IMG_20190727_120609.jpg"/>
<p>如果有计划经常往返香港和内地,建议准备一张香港的手机卡,不仅能省钱还有其它用处(嘘……)</p>
</div>
<div class="section" id="id5">
<h3>消费</h3>
<p>虽然国内的几家大头(银联,支付宝和微信支付)在香港逐渐普及起来了,但是不少地方还是只收港币
现金的(例如港铁站的服务中心、街上的小型商店等等)。所以……</p>
<ul class="simple">
<li>可以在内地换好港币现金,可能会被收一笔有人会觉得很亏的手续费。</li>
<li>也可以在内地通过线上购汇再转账的方式购入一定量的港币,在香港提取(例如通过中国银行的
Mastercard 借记卡)。不过取款和查询余额也要手续费……</li>
<li>……</li>
</ul>
<p>顺便也推荐办一张八达通啦,几乎到处都能用。(咱会说还能当 amusement IC 卡用嘛(x)</p>
<p><a class="reference external" href="https://www.octopus.com.hk/">八达通 Octopus</a></p>
</div>
</div>
<div class="section" id="id6">
<h2>一些印象</h2>
<div class="section" id="id7">
<h3>港铁</h3>
<p>作为全球最繁忙的铁路系统之一(拼不过北京地铁的原因可能是北京人多(雾)),
咱首先的印象就是快。高峰期几乎一辆一辆的来(诶?)</p>
<img alt="港铁荃湾站分散的闸机" class="materialboxed responsive-img" src="/images/travel_on_hongkong/IMG_20190811_133029.jpg"/>
<p>因为没有安检,所以车站的闸机可以设置的很松散。东铁线因为是在曾经九广铁路的
基础上发展起来的,不少车站都在地面上,甚至可以实现入闸后直接上车。</p>
<img alt="市区线的车厢" class="materialboxed responsive-img" src="/images/travel_on_hongkong/IMG_20190709_183232.jpg"/>
<p><del>头一次见到带那么多灯的车厢(x</del></p>
<p>以及运营时间很长(普遍是从 05:30-次日01:30,某些情况下例外),除了东铁线的过境车站
(罗湖和落马洲,因为两个口岸开的晚关的早)</p>
<img alt="某次的票价" class="materialboxed responsive-img" src="/images/travel_on_hongkong/IMG_20190622_135809.jpg"/>
<p>速度快加上人均 GDP 的差异带来的影响就是票价,和深圳地铁全程最高 14 元(不含乘坐
11 号线商务车厢的票价,说实话这个商务车厢的设计好像也是从港铁东铁线上学来的耶)
相比,港铁的票价……说多了都是泪啊 😂</p>
<p>(上面那张图里 40 多港币的票价大多数是因为东铁线过境车站(落马洲和罗湖)
的票价比剩下的都贵的缘故)</p>
<img alt="东铁线的头等车厢" class="materialboxed responsive-img" src="https://upload.wikimedia.org/wikipedia/commons/4/45/HK_Kln_Tong_MTR_Station_%E4%B9%9D%E9%BE%8D%E5%A1%98%E7%AB%99_platform_%E9%A0%AD%E7%AD%89%E8%BB%8A_First_Class_Octopus_%E5%85%AB%E9%81%94%E9%80%9A_terminal_point_evening_Oct-2013.JPG"/>
<p>东铁线的头等车厢,额外费用是是当程东铁线车费:</p>
<ul class="simple">
<li>或者东铁线最低票价,如果有核准头等车厢的记录但最短乘车途径不含东铁线的话。</li>
<li>该程车程涉及马鞍山线车程而另一站不在大围以北(例如:车公庙↔乐富),则须缴付相等于该段东铁线(大围↔九龙塘)
的车程普通等车费作为“头等额外费”。</li>
<li>头等车厢不设补票,如乘客未持有效头等车票(头等单程票和已取得头等确认的八达通)
而进入头等车厢,一旦被检票员发现,须一律缴交附加费 HK$500。</li>
</ul>
<p>看深圳地铁11号线的商务车厢票价多简单,直接就是票价的两倍
(最短换乘路线中如果不包含11号线时除外,4元)……</p>
<p>此外港铁还有连接的换乘站(例如香港(东涌线和机场快线)和中环(荃湾线和港岛线),两个
车站的付费区互相连接),和不相连的换乘站(例如九龙(东涌线),柯士甸(西铁线)和香港西九龙(高速铁路))</p>
<p>(虽然好像没什么值得记的……)</p>
<p>顺便再提一句,北京地铁 4/14/16号线和大兴线,杭州地铁1/5号线和深圳地铁4号线都是
港铁内地的合资公司(北京京港地铁有限公司和杭州杭港地铁有限公司)
或全资子公司(港铁轨道交通(深圳)有限公司)运营的,汝些许能在这些
线路上面看到港铁的一些影子。</p>
<p>港铁甚至还能影响内地的地铁公司,
<a class="reference external" href="https://jkcreativedesign.blogspot.com/2015/08/logo.html">例如深圳地铁那个神似港铁的 Logo (大嘘)</a></p>
</div>
<div class="section" id="id8">
<h3>高速铁路</h3>
<p>就是广深港高速铁路的香港段啦,港铁称为“高速铁路”。(虽然从标志到
设施还是那熟悉的港铁味道(?))</p>
<img alt="The Austins 里的指向牌,上面有高速铁路的标志" class="materialboxed responsive-img" src="/images/travel_on_hongkong/IMG_20190818_185147.jpg"/>
<p>The Austins 里的指向牌,上面有高速铁路的标志。</p>
<img alt="香港西九龙站的高速铁路售票机" class="materialboxed responsive-img" src="/images/travel_on_hongkong/MVIMG_20190818_185936.jpg"/>
<p>香港西九龙站的高速铁路售票机,能用八达通付款同时也能为八达通增值。</p>
<img alt="港铁动感号高速动车组的外部" class="materialboxed responsive-img" src="/images/travel_on_hongkong/IMG_20190818_100742.jpg"/>
<p>中国大陆唯一一款出口型高速动车组——港铁动感号高速动车组。</p>
<blockquote>
这车上是有 WiFi 的,但是内地段上需要内地手机号或微信登录才能使用,
而且不能浏览某些网站。香港段上就没有这些问题。</blockquote>
<img alt="两岸口岸" class="materialboxed responsive-img" src="/images/travel_on_hongkong/IMG_20190818_104138.jpg"/>
<p>一线之隔的内地和香港口岸,内地口岸相当于香港中的一块飞地(?)</p>
<img alt="准备上车" class="materialboxed responsive-img" src="/images/travel_on_hongkong/IMG_20190818_191425.jpg"/>
</div>
</div>
<div class="section" id="id9">
<h2>杂记</h2>
<img alt="……" class="materialboxed responsive-img" src="/images/travel_on_hongkong/IMG_20190629_220616.jpg"/>
<p>终于摸到原版机啦(大嘘),<del>以及魔理沙怎么成 tama 猫了……</del></p>
<img alt="……" class="materialboxed responsive-img" src="/images/travel_on_hongkong/IMG_20190629_103403.jpg"/>
<p>香港的街机就是用的 1HK$ 的辅币,每局价格 6-12 HK$ 不等
(SOUND VOLTEX 这里是 2HK$ = 1 CREDIT)</p>
<img alt="深海旗鱼酥" class="materialboxed responsive-img" src="/images/travel_on_hongkong/IMG_20190629_142434.jpg"/>
<p>深海旗鱼酥,为啥咱看一次就想笑一次呢…… 🤣</p>
<img alt="停止工作" class="materialboxed responsive-img" src="/images/travel_on_hongkong/IMG_0547.jpg"/>
<p>……已停止运行……</p>
<hr class="docutils"/>
<img alt="再见还是欢迎回来?" class="materialboxed responsive-img" src="/images/travel_on_hongkong/IMG_20190709_221225.jpg"/>
<p>再见还是欢迎回来? 😂</p>
</div>
iPod -- 在 2019 年2019-07-19T00:00:00+08:002019-07-19T00:00:00+08:00ホロtag:None,2019-07-19:/tech_misc/ipod_at_2019.html<p>现在汝会用什么听音乐?装有 Soptify / Google Play Music / Apple Music
等有串流播放应用的手机应该是大多数。但是咱偏不想这么搞:</p>
<ul class="simple">
<li>“使用其他的例如手机这样的「智能设备」,容易分散做一件事情的注意力”
-- <a class="reference external" href="https://zhuanlan.zhihu.com/p/71851932">Miracle Milk</a></li>
</ul>
<p>例如用手机听音乐的时候,通知会降低媒体音量,特别是群里灌水时那此起彼伏的
通知声一响,基本就听不见音乐了(雾)。所以有必要单独整个播放音乐的设备。</p>
<ul class="simple">
<li>串流音乐服务都不太好用,而且还有地区墙(某些歌只有某些地方能听到)</li>
<li>手机的存储空间不够大,特别是现在无损(?)音乐越来越普及的时候。
(手持 256G 闪存甚至更大容量手机的土豪请无视这一句)</li>
</ul>
<p>那为什么是 iPod 呢?其实很大一部分原因是身边朋友首先推荐的是 iPod ……</p>
<div class="section" id="ipod">
<h2>在 9102 年买一台 iPod</h2>
<p>iPod 其实是 Apple 出品的一系列音乐播放器,大致有这么几个产品线:</p>
<p>(iPod Shuffle 5th Gen、iPod …</p></div><p>现在汝会用什么听音乐?装有 Soptify / Google Play Music / Apple Music
等有串流播放应用的手机应该是大多数。但是咱偏不想这么搞:</p>
<ul class="simple">
<li>“使用其他的例如手机这样的「智能设备」,容易分散做一件事情的注意力”
-- <a class="reference external" href="https://zhuanlan.zhihu.com/p/71851932">Miracle Milk</a></li>
</ul>
<p>例如用手机听音乐的时候,通知会降低媒体音量,特别是群里灌水时那此起彼伏的
通知声一响,基本就听不见音乐了(雾)。所以有必要单独整个播放音乐的设备。</p>
<ul class="simple">
<li>串流音乐服务都不太好用,而且还有地区墙(某些歌只有某些地方能听到)</li>
<li>手机的存储空间不够大,特别是现在无损(?)音乐越来越普及的时候。
(手持 256G 闪存甚至更大容量手机的土豪请无视这一句)</li>
</ul>
<p>那为什么是 iPod 呢?其实很大一部分原因是身边朋友首先推荐的是 iPod ……</p>
<div class="section" id="ipod">
<h2>在 9102 年买一台 iPod</h2>
<p>iPod 其实是 Apple 出品的一系列音乐播放器,大致有这么几个产品线:</p>
<p>(iPod Shuffle 5th Gen、iPod Nano 6th Gen、iPod Classic、iPod Touch)</p>
<ul class="simple">
<li>iPod Classic 系列
(但只有第六代(也是 Classic 最后一代被称作 “iPod Classic”)
,使用 1.8 寸微型硬盘作为存储介质。</li>
<li>iPod Mini 系列,比 iPod Classic 略小,使用 1 寸微型硬盘作为存储介质。
不过很短命的只发表了两代就被 iPod Nano 取代了。</li>
<li>iPod Nano 系列,比 iPod Mini 更小更薄,使用大小不等的闪存做为存储介质,后期型号
还加入了触摸屏支持。</li>
<li>iPod Shuffle 系列,和 Nano 系列的区别就是没有屏幕,而且容量都偏小。</li>
</ul>
<p>以上系列均已停产(x),现在 Apple 还在销售的就是以 iOS 为基础的 iPod Touch 系列了……</p>
<p>咱是捡了一台二手的 iPod Video (iPod Classic 系列的第五代),至于为啥是这个待会儿会讲。</p>
</div>
<div class="section" id="itunes-or-rockbox">
<h2>iTunes or Rockbox ?</h2>
<p>既然是苹果家的设备, 通过 iTunes 同步就是基本的操作啦
(虽然 macOS Catalina 里 iTunes 消失了,原有的功能被 Finder 和新的若干个应用取代),
但是……</p>
<ul class="simple">
<li>iTunes 不支持很多常用的音乐文件格式,例如 FLAC / CUE 啥的,
虽然能用一些工具转换但是还是好麻烦的样子……</li>
<li>通过 macOS 格式化的 iPod 不能在 Windows 上使用,反之亦然。</li>
<li>……</li>
</ul>
<p>如果汝已经是 App$e 全家桶的受害者,或者 iTunes Store 里买了很多音乐的话,那倒是可以接着用。
<del>但是咱不是,</del> 所以碰巧听说了一个名为 Rockbox 的固件。</p>
<blockquote>
<p>Rockbox is a free replacement firmware for digital music players.</p>
<p class="attribution">—<a class="reference external" href="https://www.rockbox.org/">https://www.rockbox.org/</a></p>
</blockquote>
<p><del>虽然官网一副上个世纪的模样但其实还在更新……</del></p>
<p>在 <a class="reference external" href="https://www.rockbox.org/manual.shtml">Rockbox 支持的 Apple 设备中</a> ,iPod Video
大概是最新(?)的了(iPod Classic 的支持在 7/19 还是 unstable……)。</p>
<p>所以就是它啦(大嘘)</p>
</div>
<div class="section" id="rockbox">
<h2>安装 Rockbox</h2>
<p>其实挺简单的, Windows / macOS / GNU/Linux 上都有
<a class="reference external" href="https://www.rockbox.org/download/">Rockbox Utility</a> ,
下载安装然后按着提示操作就 OK 😂</p>
<blockquote>
不过需要 Windows 格式的 iPod ,如果汝手上的 iPod 是
macOS 格式的话需要用 Windows 的 iTunes 格式化一下,或者
<a class="reference external" href="https://www.rockbox.org/wiki/IpodConversionToFAT32">参考 Rockbox Wiki</a>
手动格式化一下。</blockquote>
<p>安装完之后通常会自动重启进入 Rockbox ,如果在 Hold 开关锁定的情况下开机
就会进入原来的系统。</p>
</div>
<div class="section" id="id1">
<h2>一些魔改(?)思路</h2>
<p>iPod Video 使用的是 ZIF 接口的微型硬盘(说到底还是个 HDD),
汝甚至能有机会听到磁头在 iPod 里旋转的声音(x</p>
<p>所以现在流行起来了给 iPod 改存储,常见的方案有两种:</p>
<ul class="simple">
<li>改成 ZIF 接口的 SSD,如果是厚机(60-80G 版,或是自己换个厚壳)换上半高
SSD 以后还有机会改大电池。就是这种接口的 SSD 不太好找(淘宝上貌似某国产品牌居多?),
<del>而且还贵(120G 的能卖到 500¥ 信不信?)</del></li>
<li>通过 ZIF 转 CF 卡接口上 CF 卡,优点是便宜(如果用 microSD 卡转 CF 卡套说不定更便宜),
而且据说比 SSD 省电?(然后翻了两次车的某狼表示 emmm……)</li>
</ul>
<p>具体的操作方法呢搜索一下大概就能找到,如果汝也和咱一样是 iPod Video 用户的话可以
从这几篇文章开始:</p>
<ul class="simple">
<li><a class="reference external" href="https://www.ifixit.com/Guide/iPod+5th+Generation+(Video)+Hard+Drive+Replacement+with+a+CF+or+SDHC-SDXC+Memory+Card/7492">iPod 5th Generation (Video) Hard Drive Replacement with a CF or SDHC/SDXC Memory Card</a></li>
<li><a class="reference external" href="https://medium.com/@moreless/ipod-video-5-5g-%E5%8D%87%E7%BA%A7%E8%AE%B0-how-to-build-rockbox-b94dfb34fe30">ipod video 5.5g 升级记 + how to build rockbox</a></li>
</ul>
</div>
<div class="section" id="at-last">
<h2>At last ......</h2>
<img alt="My iPod" class="materialboxed responsive-img" src="/images/ipod.jpg"/>
<p>啊有人觉得 unifont 很难看?
<a class="reference external" href="https://zhuanlan.zhihu.com/p/70392435">自己编译一个别的就好啦(?)</a></p>
<hr class="docutils"/>
<p>感谢 <a class="reference external" href="https://zhuanlan.zhihu.com/eatradish">好耶实验室的 Miracle Milk</a> 的各种想法和在咱
买 iPod 到改机上提供的各种建议和帮助。</p>
</div>
AOSCC 2019 游记2019-07-15T00:00:00+08:002019-07-15T00:00:00+08:00ホロtag:None,2019-07-15:/aosc/aoscc_2019.html<p>“安徽合肥,安徽合肥,AOSCC 又倒闭了……”</p>
<p>“安徽同志们终于来到了安徽(x)”</p>
<p>……</p>
<div class="section" id="day-2-2017">
<h2>Day -2 - 为啥咱没写 2017 ?</h2>
<p>因为咱没去鸭(x),可以去它们的网站上阅读总结:
<a class="reference external" href="https://aosc.io/news/5959-aoscc-2017-re-cap">https://aosc.io/news/5959-aoscc-2017-re-cap</a></p>
</div>
<div class="section" id="day-1-2018">
<h2>Day -1 - 为啥咱没写 2018 ?</h2>
<p>还是因为咱没去呀(xx),而且那年因为某些不可抗力原因没有开成线下活动。
还是可以去它们的网站上阅读检讨:
<a class="reference external" href="https://aosc.io/news/4606-aoscc-2018">https://aosc.io/news/4606-aoscc-2018</a></p>
</div>
<div class="section" id="day-1-zzzz">
<h2>Day 1 - Zzzz......</h2>
<p>(因为刚坐了一夜的火车就直奔会场了,
所以没提到的部分……</p>
<ul class="simple">
<li>要么是睡过去了,</li>
<li>要么是没听懂去闲逛了没留下照片</li>
<li>要么是当事人不愿意露脸(?)</li>
<li>要么是听得投入没拍照……</li>
</ul>
<p>😂)</p>
<p>以及所有演讲的 Slide 可以在 <a class="reference external" href="https://repo.aosc.io/aosc-documentation/aoscc-2019/">AOSC OS 的仓库服务器</a>
上找到。</p>
<p><del>Lecture 催眠力 +100 …</del></p></div><p>“安徽合肥,安徽合肥,AOSCC 又倒闭了……”</p>
<p>“安徽同志们终于来到了安徽(x)”</p>
<p>……</p>
<div class="section" id="day-2-2017">
<h2>Day -2 - 为啥咱没写 2017 ?</h2>
<p>因为咱没去鸭(x),可以去它们的网站上阅读总结:
<a class="reference external" href="https://aosc.io/news/5959-aoscc-2017-re-cap">https://aosc.io/news/5959-aoscc-2017-re-cap</a></p>
</div>
<div class="section" id="day-1-2018">
<h2>Day -1 - 为啥咱没写 2018 ?</h2>
<p>还是因为咱没去呀(xx),而且那年因为某些不可抗力原因没有开成线下活动。
还是可以去它们的网站上阅读检讨:
<a class="reference external" href="https://aosc.io/news/4606-aoscc-2018">https://aosc.io/news/4606-aoscc-2018</a></p>
</div>
<div class="section" id="day-1-zzzz">
<h2>Day 1 - Zzzz......</h2>
<p>(因为刚坐了一夜的火车就直奔会场了,
所以没提到的部分……</p>
<ul class="simple">
<li>要么是睡过去了,</li>
<li>要么是没听懂去闲逛了没留下照片</li>
<li>要么是当事人不愿意露脸(?)</li>
<li>要么是听得投入没拍照……</li>
</ul>
<p>😂)</p>
<p>以及所有演讲的 Slide 可以在 <a class="reference external" href="https://repo.aosc.io/aosc-documentation/aoscc-2019/">AOSC OS 的仓库服务器</a>
上找到。</p>
<p><del>Lecture 催眠力 +100%</del></p>
<img alt="祖传(?)易拉宝上线(雾)" class="materialboxed responsive-img" src="/images/AOSCC/2019/0.jpg"/>
<p>祖传(?)易拉宝上线(雾)</p>
<img alt="AOSC Retro 展示设备" class="materialboxed responsive-img" src="/images/AOSCC/2019/1.jpg"/>
<p>运行为旧硬件特化的 AOSC OS 的一些设备(PineBook(并不是 AOSC OS Retro 展示设备),PowerBook G4, iBook G3 和
Sony VAIO PCG-C1VN)。</p>
<blockquote>
“AOSC OS,关爱您、您的开发板、您的谜之处理器和您的史前遗产”—— imi415</blockquote>
<img alt="AOSC OS 展示设备" class="materialboxed responsive-img" src="/images/AOSCC/2019/2.jpg"/>
<p>与之相对的就是一些运行 AOSC OS 的“现代”设备啦~</p>
<blockquote>
<del>好想上安徽女同志网啊……</del></blockquote>
<img alt="贴纸" class="materialboxed responsive-img" src="/images/AOSCC/2019/3.jpg"/>
<p>今年的贴纸, <del>在成为造梗发行版的路上越走越远……</del></p>
<p>可以在 <a class="reference external" href="https://github.com/AOSC-Dev/aoscc/tree/master/2019/stickers">AOSCC 的仓库</a> 下载到
每一个贴纸的源代码(?)</p>
<img alt="直播准备中" class="materialboxed responsive-img" src="/images/AOSCC/2019/4.jpg"/>
<p>直播准备中,<del>“虽然不知道为什么每一次 AOSCC 都能遇上网络问题……”</del></p>
<img alt="果冻之谢罪" class="materialboxed responsive-img" src="/images/AOSCC/2019/5.jpg"/>
<p>首先是来自 <del>特首果冻 Jelly</del> Mingcong Bai 的谢罪(雾),解释了为啥 AOSCC 2018
迫不得已(?)搞成了线上活动,还有最近两年的成果什么的。</p>
<img alt="常联系啊" class="materialboxed responsive-img" src="/images/AOSCC/2019/6.png"/>
<p>“常联系,啊” -- Mingcong Bai</p>
<img alt="Junde Yhi" class="materialboxed responsive-img" src="/images/AOSCC/2019/7.jpg"/>
<p>Junde Yhi 分享他编译和在 X200 上安装 Libreboot 的经验和心得。</p>
<p>“Libreboot 的构建工具好难用的……”</p>
<img alt="Play with OriginCode" class="materialboxed responsive-img" src="/images/AOSCC/2019/8.jpg"/>
<p>见到 <del>陈先生</del> 橙喵 OriginCode 啦,开心 ~ 还互相交(mai)流(ruo)了下……</p>
<img alt="AOSC OS 7 -- Gumblex" class="materialboxed responsive-img" src="/images/AOSCC/2019/9.jpg"/>
<p>顺便提一下,AOSC 下一个 Release(?) 的 Codename 是社区开发者之一的昵称 Gumblex 哦~</p>
<p>(虽然当事人当时并不在场)以及并没有在去哪里吃饭这个问题上达成一致。</p>
<blockquote>
<p>チェン | 😸 | 🥬 | ExOrigin v15.8, [11.07.19 18:56]</p>
<p>話說午餐怎麼解決喵(</p>
<p>Mingcong Bai, [11.07.19 18:57]</p>
<p>[In reply to チェン | 😸 | 🥬 | ExOrigin v15.8]</p>
<p>饿着</p>
</blockquote>
<p><del>没有……没有……没有……通过!</del></p>
</div>
<div class="section" id="day-2">
<h2>Day 2</h2>
<img alt="@Gumblex" class="materialboxed responsive-img" src="/images/AOSCC/2019/10.jpg"/>
<hr class="docutils"/>
<img alt="@Gumblex" class="materialboxed responsive-img" src="/images/AOSCC/2019/11.jpg"/>
<p>新 Codename 登场! 😂</p>
<p>Gumblex 介绍了由他制作的 AOSC Packages 网站的功能,和
AOSC OS 软件包的质量检测和保障等等。</p>
<img alt="@Gumblex" class="materialboxed responsive-img" src="/images/AOSCC/2019/26.jpg"/>
<p>刚将军与刚将军(</p>
<img alt="PowerBook G4" class="materialboxed responsive-img" src="/images/AOSCC/2019/12.jpg"/>
<img alt="PowerBook G4" class="materialboxed responsive-img" src="/images/AOSCC/2019/13.jpg"/>
<p>正在准备今天抽奖的奖品——PowerBook G4。</p>
<img alt="Apple Pencil" class="materialboxed responsive-img" src="/images/AOSCC/2019/14.jpg"/>
<p>哇,有生之年第一次见到充电中的 Apple Pencil 耶(x</p>
<img alt="胶片相机" class="materialboxed responsive-img" src="/images/AOSCC/2019/15.jpg"/>
<p>正在用胶片相机拍照的……</p>
<img alt="ThinkPads" class="materialboxed responsive-img" src="/images/AOSCC/2019/16.jpg"/>
<p>AOSC ThinkPad 用户组再聚首(请无视旁边的 PineBook (x))</p>
<img alt="KexyBiscuit" class="materialboxed responsive-img" src="/images/AOSCC/2019/17.jpg"/>
<p>Kexy Biscuit 给 AOSC 带来了 以敏捷流程优化社区开发工作的尝试的建议。</p>
</div>
<div class="section" id="day-3">
<h2>Day 3</h2>
<img alt="Flashing coreboot" class="materialboxed responsive-img" src="/images/AOSCC/2019/18.jpg"/>
<p>现场拆机刷 coreboot 中……</p>
<img alt="Junde Yhi x2" class="materialboxed responsive-img" src="/images/AOSCC/2019/19.jpg"/>
<p>又是 Junde Yhi,先是因为各种咕咕咕了的 Installer <del>谢罪</del> 检讨,
然后介绍了新 AOSC DeployKit 的计划。</p>
<img alt="Junde Yhi x2" class="materialboxed responsive-img" src="/images/AOSCC/2019/20.jpg"/>
<p>咕咕咕预定(x</p>
<img alt="Mingcong Bai x2" class="materialboxed responsive-img" src="/images/AOSCC/2019/21.jpg"/>
<p>特首的大抄(雾)</p>
<img alt="meet cuihao" class="materialboxed responsive-img" src="/images/AOSCC/2019/22.jpg"/>
<p>另类面基证明(?)</p>
<img alt="USTC Mirrors" class="materialboxed responsive-img" src="/images/AOSCC/2019/23.jpg"/>
<p>作为东道主(?)的 USTC 也有人来分享 USTC Mirrors 的心路历程。</p>
<img alt="Playing VOEZ" class="materialboxed responsive-img" src="/images/AOSCC/2019/24.jpg"/>
<p>AOSC 人均单手神仙 tkpl(太可怕了)</p>
<img alt="confusing" class="materialboxed responsive-img" src="/images/AOSCC/2019/25.jpg"/>
<p>迷惑行为大赏之保健粉笔(</p>
<blockquote>
<p>不过还真的有中药加石膏制成的保健粉笔 😂</p>
<p><a class="reference external" href="https://patents.google.com/patent/CN1071122A/zh">CN1071122A 一种药物保健粉笔的制作方法</a></p>
</blockquote>
</div>
<div class="section" id="extras">
<h2>Extras</h2>
<img alt="江镇包子铺" class="materialboxed responsive-img" src="/images/AOSCC/2019/-1.jpg"/>
<p>主 谓 宾 (</p>
<img alt="欢迎饮品" class="materialboxed responsive-img" src="/images/AOSCC/2019/-2.jpg"/>
<p>要素察觉(</p>
<img alt="红茶" class="materialboxed responsive-img" src="/images/AOSCC/2019/-4.jpg"/>
<p>要素察觉x2(</p>
<img alt="emmm" class="materialboxed responsive-img" src="/images/AOSCC/2019/-5.jpg"/>
<p>能走上 (?) 19 楼塞下这个也是挺不容易的啦 😂</p>
</div>
<div class="section" id="one-more-extras">
<h2>One More Extras</h2>
<div class="highlight"><pre><span class="code-line"><span></span>Junde Yhi, [14.07.19 20:21]</span>
<span class="code-line">[In reply to アカネチャン]</span>
<span class="code-line">您打音游的照片要放到新闻里去</span>
<span class="code-line"></span>
<span class="code-line">アカネチャン, [14.07.19 20:21]</span>
<span class="code-line">[In reply to Junde Yhi]</span>
<span class="code-line">这信息量太大了吧(</span>
<span class="code-line"></span>
<span class="code-line">Junde Yhi, [14.07.19 20:22]</span>
<span class="code-line">我要向各位学习除下落式以外的音游</span>
<span class="code-line"></span>
<span class="code-line">., [14.07.19 20:23]</span>
<span class="code-line">[In reply to Junde Yhi]</span>
<span class="code-line">向音游导师 @Kotonoha_Akane 学习</span>
<span class="code-line"></span>
<span class="code-line">アカネチャン, [14.07.19 20:24]</span>
<span class="code-line">导(gao)师(shi)</span>
<span class="code-line"></span>
<span class="code-line">., [14.07.19 20:24]</span>
<span class="code-line">果冻说的要是我是老师一个粉笔丢过去</span>
<span class="code-line"></span>
<span class="code-line">アカネチャン, [14.07.19 20:24]</span>
<span class="code-line">(</span>
<span class="code-line"></span>
<span class="code-line">アカネチャン, [14.07.19 20:25]</span>
<span class="code-line">然而它不是)</span>
<span class="code-line"></span>
<span class="code-line">アカネチャン, [14.07.19 20:25]</span>
<span class="code-line">所以我逃过一劫?😂</span>
<span class="code-line"></span>
<span class="code-line">Mingcong Bai, [14.07.19 20:25]</span>
<span class="code-line">(</span>
<span class="code-line"></span>
<span class="code-line">liushuyu, [14.07.19 20:27]</span>
<span class="code-line">别怕,是 保健粉笔(</span>
<span class="code-line"></span>
<span class="code-line">Xiaoxing Ye, [14.07.19 20:28]</span>
<span class="code-line">昏睡粉笔</span>
<span class="code-line"></span>
<span class="code-line">アカネチャン, [14.07.19 20:28]</span>
<span class="code-line">某种意义上真的会昏睡(</span>
</pre></div>
<hr class="docutils"/>
<div class="highlight"><pre><span class="code-line"><span></span>Neruthes AFB3373F5200DF38, [13.07.19 22:01]</span>
<span class="code-line">那么有人要来开夜谈会吗</span>
<span class="code-line"></span>
<span class="code-line">Neruthes AFB3373F5200DF38, [13.07.19 22:01]</span>
<span class="code-line">欢迎来 2013</span>
<span class="code-line"></span>
<span class="code-line">Neruthes AFB3373F5200DF38, [13.07.19 22:12]</span>
<span class="code-line">cc @Staph @JeffBai etc</span>
<span class="code-line"></span>
<span class="code-line">Mingcong Bai, [13.07.19 22:13]</span>
<span class="code-line">Nope (</span>
<span class="code-line"></span>
<span class="code-line">Neruthes AFB3373F5200DF38, [13.07.19 22:21]</span>
<span class="code-line">没有,通过!</span>
<span class="code-line"></span>
<span class="code-line">Neruthes AFB3373F5200DF38, [13.07.19 22:21]</span>
<span class="code-line">去做大保健了</span>
</pre></div>
<p>所以今年没有钦定 AOSCC 2020 的位置鸭(咕咕咕)</p>
</div>
各自开始的新生活2019-05-27T00:00:00+08:002019-05-27T00:00:00+08:00ホロtag:None,2019-05-27:/life/new_lifes.html<p>总有一些开始和结束值得留念。</p>
<div class="section" id="id2">
<h2>结束了。</h2>
<div class="highlight"><pre><span class="code-line"><span></span>布偶君 <shadowrz@disroot.org></span>
<span class="code-line">离别告知,能扩散多远就扩散多远</span>
<span class="code-line">如果你们能看到这句话的话,</span>
<span class="code-line">我告诉你们点东西。</span>
<span class="code-line"></span>
<span class="code-line">以前的我,各种意义上都很正常。嗯,这很好。</span>
<span class="code-line">也许是直到和你们接触开始,</span>
<span class="code-line">家长发现我自己总是和别人有不一样的想法和性格。</span>
<span class="code-line"></span>
<span class="code-line">然后,各种各样的矛盾接踵而至……</span>
<span class="code-line">……我的性格影响了好多人——它变坏了。</span>
<span class="code-line">……争执,吵闹,宛如发疯……</span>
<span class="code-line"></span>
<span class="code-line">昨天我和父母吵了起来,他们一定要看我在用电话做什么。我要是不让他们看,就会觉得是电话害了我(我现在才发现)</span>
<span class="code-line">然后我只有妥协的命(不然他们不会让我玩的,这样的话也会是离别)。</span>
<span class="code-line">于是他们(只)看到了 #archlinux-cn-offtopic 的聊天记录,</span>
<span class="code-line">然后……他们……</span>
<span class="code-line">……觉得你们都是一群疯子……</span>
<span class="code-line">希望我永远不要记起你们……</span>
<span class="code-line">还说做不到就要不停吃药,死也可以……</span>
<span class="code-line">还要彻底删掉你们,让你们碰不到我……</span>
<span class="code-line"></span>
<span class="code-line">…………</span>
<span class="code-line"></span>
<span class="code-line">为什么,为什么会变成这样啊!!!!</span>
<span class="code-line">我和你们这些年……为什么让我变成了一个不能在世界存活(没人接受我的性格)的状态啊 …</span></pre></div></div><p>总有一些开始和结束值得留念。</p>
<div class="section" id="id2">
<h2>结束了。</h2>
<div class="highlight"><pre><span class="code-line"><span></span>布偶君 <shadowrz@disroot.org></span>
<span class="code-line">离别告知,能扩散多远就扩散多远</span>
<span class="code-line">如果你们能看到这句话的话,</span>
<span class="code-line">我告诉你们点东西。</span>
<span class="code-line"></span>
<span class="code-line">以前的我,各种意义上都很正常。嗯,这很好。</span>
<span class="code-line">也许是直到和你们接触开始,</span>
<span class="code-line">家长发现我自己总是和别人有不一样的想法和性格。</span>
<span class="code-line"></span>
<span class="code-line">然后,各种各样的矛盾接踵而至……</span>
<span class="code-line">……我的性格影响了好多人——它变坏了。</span>
<span class="code-line">……争执,吵闹,宛如发疯……</span>
<span class="code-line"></span>
<span class="code-line">昨天我和父母吵了起来,他们一定要看我在用电话做什么。我要是不让他们看,就会觉得是电话害了我(我现在才发现)</span>
<span class="code-line">然后我只有妥协的命(不然他们不会让我玩的,这样的话也会是离别)。</span>
<span class="code-line">于是他们(只)看到了 #archlinux-cn-offtopic 的聊天记录,</span>
<span class="code-line">然后……他们……</span>
<span class="code-line">……觉得你们都是一群疯子……</span>
<span class="code-line">希望我永远不要记起你们……</span>
<span class="code-line">还说做不到就要不停吃药,死也可以……</span>
<span class="code-line">还要彻底删掉你们,让你们碰不到我……</span>
<span class="code-line"></span>
<span class="code-line">…………</span>
<span class="code-line"></span>
<span class="code-line">为什么,为什么会变成这样啊!!!!</span>
<span class="code-line">我和你们这些年……为什么让我变成了一个不能在世界存活(没人接受我的性格)的状态啊!!!!!!!</span>
<span class="code-line"></span>
<span class="code-line">告诉我回答啊啊啊啊啊啊啊啊啊啊啊!!!!!!!!!!!!!!</span>
<span class="code-line"></span>
<span class="code-line">--</span>
<span class="code-line">布偶君 | 雨宫恋叶 | ShadowRZ (同一身份)</span>
<span class="code-line">2019-05-22</span>
</pre></div>
<p>Update (2019/05/23, ref <a class="reference external" href="https://wxw.moe/@ShadowRZ/102142677608282951">https://wxw.moe/@ShadowRZ/102142677608282951</a> ):</p>
<div class="highlight"><pre><span class="code-line"><span></span>我再声明几点:</span>
<span class="code-line"></span>
<span class="code-line">1. 只是退群+不和你们往来而已</span>
<span class="code-line">2. 不想反对父母,不要对我提这样的建议</span>
<span class="code-line">3. 对话都给父母看了(除私信)</span>
<span class="code-line">4. 以后不在处理任何通知,包括小号</span>
<span class="code-line">5. 我不会再依存于你们</span>
<span class="code-line">6. 现在父母也希望非常非常了解我</span>
<span class="code-line"></span>
<span class="code-line">望周知。</span>
<span class="code-line">2019-05-23</span>
<span class="code-line">(为什么好好的告别,说了三天)</span>
</pre></div>
<p>愿他安好。</p>
<p>(不知道以后还有没有机会在“没有黑暗的地方”相见……)</p>
</div>
<div class="section" id="id3">
<h2>开始了。</h2>
<blockquote>
<p>开始了?</p>
<p><a class="reference external" href="https://twitter.com/Ken_Ookami_Horo/status/1128784581400727553">https://twitter.com/Ken_Ookami_Horo/status/1128784581400727553</a></p>
</blockquote>
<ul class="simple">
<li>去深圳啦 ~</li>
<li>在去之前买了很多稀奇古怪(?)的家伙(例如某地狱牌交换机,某粗粮牌玻璃板和某雨林牌泡面盖什么的 😂)</li>
<li>见到了大学同学 x1 (以后说不定会有 x2 , x3 ?)</li>
<li>当然不是去玩的 😢 (结束了长达六个月的失学无业辣鸡时光(x))</li>
<li>从公司收到台新笔记本,然后发现手边的内存装不上去只好现买 😂</li>
<li>说不定有机会……?</li>
<li>就这样。</li>
</ul>
</div>
离开 Google 的 Android 之路2019-04-20T00:00:00+08:002019-04-20T00:00:00+08:00ホロtag:None,2019-04-20:/tech_misc/android_without_google_0.html<div class="section" id="id1">
<h2>好聚好散?</h2>
<p>要说现在流行的移动设备操作系统的话肯定有 Android 的一席之地,Google 在 AOSP 下
开放了 Android 的大部分源代码,吸引了众多硬件生产商和开发者。</p>
<p>如果汝是 Android 用户的话,有没有做过这些事情了呢?</p>
<ul class="simple">
<li>获得手机的 Root 权限(从 Zergrush 到 SuperSU 再到 Magisk?)</li>
<li>安装第三方 Recovery 和 ROM(甚至自己移植流行的 ROM 到自己的手机上,从此
踏上了一条不归路……)</li>
<li>各种方式修改系统(修改系统分区, Xposed 和 Magisk 等等)</li>
<li>刷写或自制定制内核。</li>
<li>……</li>
</ul>
<p>然而时过境迁, Google 已经不是以前那个不做恶的 Google 了,
Stallman 也撰文声讨过: <a class="reference external" href="https://stallman.org/google.html">https://stallman …</a></p></div><div class="section" id="id1">
<h2>好聚好散?</h2>
<p>要说现在流行的移动设备操作系统的话肯定有 Android 的一席之地,Google 在 AOSP 下
开放了 Android 的大部分源代码,吸引了众多硬件生产商和开发者。</p>
<p>如果汝是 Android 用户的话,有没有做过这些事情了呢?</p>
<ul class="simple">
<li>获得手机的 Root 权限(从 Zergrush 到 SuperSU 再到 Magisk?)</li>
<li>安装第三方 Recovery 和 ROM(甚至自己移植流行的 ROM 到自己的手机上,从此
踏上了一条不归路……)</li>
<li>各种方式修改系统(修改系统分区, Xposed 和 Magisk 等等)</li>
<li>刷写或自制定制内核。</li>
<li>……</li>
</ul>
<p>然而时过境迁, Google 已经不是以前那个不做恶的 Google 了,
Stallman 也撰文声讨过: <a class="reference external" href="https://stallman.org/google.html">https://stallman.org/google.html</a></p>
</div>
<div class="section" id="google">
<h2>所以 Google 使了哪些坏?</h2>
<p>罄竹难书啊(大嘘)</p>
<ul class="simple">
<li>Google 自己开发了一套私有的称作 Google Mobile Services 的软件包,包含了大多数
的 Google 应用,也有迹象表示 Google 正在把越来越多 AOSP 里的东西塞进 GMS 里。</li>
<li>Google 网站越来越依赖非自由的 JavaScript (虽然这大概是现在的趋势吧,唉……),
甚至登录和注册都需要。</li>
<li>任何大体量的公司都容易被用于大规模监控, Google 也不例外。(人家也是要恰饭的不是?)</li>
<li><a class="reference external" href="https://www.theguardian.com/technology/2016/nov/17/google-suspends-customer-accounts-for-reselling-pixel-phones">有新闻报道称</a>
Google 终止了转卖 Pixel 手机的用户的 Google 账户。(服务的使用条款能扩大到物理设备么)</li>
<li>Google 愈发向审查妥协,例如 <a class="reference external" href="https://www.theverge.com/2018/5/1/17308508/amazon-web-services-signal-domain-fronting-ban-response">不再支持域前置</a> ,
<a class="reference external" href="http://www.theguardian.com/world/2016/jan/19/pakistans-youtube-ban-lifted-as-government-gets-say-over-content">同意为部分政权提供审查支援</a>
等等。</li>
</ul>
<p>所以是时候放弃 Google 了(雾)</p>
<blockquote>
等等我们一直就没有用 Google 啊 -- 来自地球外的某处</blockquote>
</div>
<div class="section" id="id5">
<h2>开始之前?</h2>
<p>开始之前的话,汝最好准备一部合适的 Android 手机,那么什么样叫做合适呢?</p>
<ul>
<li><p class="first">最好有流行的第三方 Android ROM 适配(例如 LineageOS 等等)</p>
<blockquote>
<ul class="simple">
<li>能解锁 Bootloader 大概是这个的充分条件。</li>
<li>因为第三方 ROM 一般都不含 Gapps,所以适合用作基底。</li>
<li>所以内置 GMS 的 ROM (例如 Pixel Experience) 不在推荐范围内。</li>
<li>特别的,虽然 /e/ 在做的事情和咱现在做的事情类似,但是有不少人不推荐,
例如 <a class="reference external" href="https://ewwlo.xyz/evil">https://ewwlo.xyz/evil</a></li>
</ul>
</blockquote>
</li>
<li><p class="first">至于哪些手机解锁 Bootloader 的难度,咱踩过的坑(?)有:</p>
<blockquote>
<ul class="simple">
<li>早些年的不少手机是没有锁的,不在意性能的话可以考虑。(例如以前的小米和三星?)</li>
<li>能通过一条命令( <cite>fastboot flashing unlock</cite> )解锁的设备
非常值得推荐,例如 Nexus/Pixel 和 OnePlus。</li>
<li>像 Moto / LG / HTC 之类的主流厂商会要求汝去它们的网站上
提供一些信息生成一些解锁代码,有一点点麻烦,但又不是不能用~</li>
<li>有些厂商解锁会失去一些功能(例如 SONY,解锁会使 TA 分区无法访问,典型
的副作用就是相机退化),如果汝不是很需要那些功能的话再考虑。</li>
<li>有些厂商虽然允许解锁,但解锁条件过于刁钻(没错说的就是现在的小米)。
只有在汝能忍受那些恶心的条件的情况下才能考虑。</li>
<li>有些厂商不给官方解锁,但奈何不了有些野路子(例如 HMD 的 Nokia),虽然
算作能解锁,但因为不容易的缘故,大概没有多少人为它开发。</li>
<li>不能解锁的厂商当然不要考虑啦。 <del>(蓝绿海军警告,以上)</del></li>
</ul>
</blockquote>
</li>
</ul>
<p>在这篇和接下来的文章(如果有的话,咕咕咕)里咱就拿一台 OnePlus 3 作为演示机咯~</p>
<p>然后备份好所有的数据(这不是废话么)</p>
</div>
<div class="section" id="microg-google-service-framework">
<h2>microG - 自由的 Google Service Framework 实现</h2>
<blockquote>
A free-as-in-freedom re-implementation of Google’s proprietary
Android user space apps and libraries.</blockquote>
<p>microG 是一组代替 Google 私有的 Android 程序和库的程序和库的合称。
像 Google 之类的服务大概很难一下完全放弃的, 那就慢慢来好了……</p>
<p>然而不少应用只认 Google 的 Google Play Service 的签名,所以咱们还需要摆弄一下系统
让它把 microG 的签名当作 Google 的。放在一起的话方法有很多:</p>
<ul class="simple">
<li>安装内置了 microG 的 ROM,例如 <a class="reference external" href="https://lineage.microg.org/">LineageOS for microG</a>
和 <a class="reference external" href="https://blissroms.com/">Bliss</a> 。</li>
<li>修改系统欺骗签名,例如通过 Xposed ,可以参考 <a class="reference external" href="https://www.blackyau.cc/4.html">MicroG安装与配置 | 蠢黑通行</a></li>
<li>也有人做出了 microG / F-Droid 和 欺骗内核签名等功能的整合包,例如 NanoMod:
<a class="reference external" href="https://forum.xda-developers.com/apps/magisk/module-nanomod-5-0-20170405-microg-t3584928">https://forum.xda-developers.com/apps/magisk/module-nanomod-5-0-20170405-microg-t3584928</a></li>
</ul>
<p>在经历了各种方法把 microG 安装上以后,可以通过 microG 自己的
Self Check 确认 microG 的工作状态。</p>
<img alt="MicroG 的自检" class="materialboxed responsive-img" src="/images/Android/microg_check.png"/>
<p>接下来像普通的方法一样添加 Google 账户啦,不过咱用的时候有注意到几个问题:</p>
<ul class="simple">
<li>不能添加 G Suite 账户(?)</li>
<li>咱不打开 microG 里的 Google Device Registration 的话没法保存 Google 账户的信息。</li>
</ul>
<p><del>又不是不能用*2</del></p>
<p>如果汝哪一天下定决心完全告别 Google 的话,只要把这些东西卸载掉就 OK(大嘘)</p>
</div>
<div class="section" id="yalp-store-google-play">
<h2>Yalp Store - Google Play 商店的替代品</h2>
<blockquote>
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.</blockquote>
<p>Yalp Store 可以直接下载 Play 商店上的应用,如果汝在里面登录了汝自己的 Google 账号,
可以下载汝购买的付费应用。</p>
<p>(虽然 Yalp Store 的开发者说这么干其实会违反 Google Play 商店的 TOS 因此有帐号被关闭
的风险,但是 Yalp Store 内置的 Google 帐号还存活,也没有听说过谁因为用了它被封号……)</p>
<p>可以在 F-Droid 上找到 Yalp Store ,或者 <a class="reference external" href="https://github.com/yeriomin/YalpStore/releases">去它们的 Github 上下载</a> ,
Magisk 上有 Yalp Store 安装为系统应用的模组包。</p>
</div>
<div class="section" id="f-droid-android">
<h2>F-Droid - 自由的 Android 应用程序仓库</h2>
<blockquote>
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.</blockquote>
<p>F-Droid 是一个应用目录应用,很像 Play 商店对不对?不过这里面收录的全是自由软件
(至少客户端是,虽然某些软件会有一些诸如会推广非自由服务的“反功能”)。
通过 F-Droid Priviliged Extension 可以做到自动安装应用等额外功能。</p>
<p>可以从这里下载 F-Droid :<a class="reference external" href="https://f-droid.org/en/">https://f-droid.org/en/</a> ,
Magisk 仓库中有 F-Droid Priviliged Extension 模块,NanoMod 也提供了 F-Droid 模组。</p>
</div>
<div class="section" id="guardian-project">
<h2>Guardian Project - 保护手机用户的隐私和自由</h2>
<blockquote>
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.</blockquote>
<p>Guardian Project 是一群开发保护手机用户隐私应用的开发者,最出名的作品是
Orbot 和 Orfox ,将 Tor 带到了 Android 的世界中。</p>
<p>除了 Play 商店以外,汝也可以添加它们的 F-Droid 仓库: <a class="reference external" href="https://guardianproject.info/fdroid/">https://guardianproject.info/fdroid/</a></p>
<p>旅途愉快 :-)</p>
</div>
PackageKit:统一(?)GNU/Linux 发行版包管理器操作的前端2019-04-03T00:00:00+08:002019-04-03T00:00:00+08:00ホロtag:None,2019-04-03:/linux/packagekit.html<p>如果汝是 GNU/Linux 爱好者的话,一定有自己喜欢的 GNU/Linux 发行版了吧。
对那个发行版使用的软件包管理器的操作大概也已经谙熟于心了呗~</p>
<p>直到汝有时需要摆弄别的发行版的时候:</p>
<div class="highlight"><pre><span class="code-line"><span></span>horo@debian:~ $ sudo pacman -Syu</span>
<span class="code-line">sudo: pacman: <span class="nb">command</span> not found</span>
</pre></div>
<p>emmm......</p>
<p>虽然 pacman 的话,有 <a class="reference external" href="https://github.com/icy/pacapt">pacapt</a> 这样的工具来包装其它
软件包管理器的操作。但如果汝不适合这种状况呢(例如常用 Ubuntu ?<del>(打死……)</del> )?</p>
<div class="section" id="packagekit">
<h2>PackageKit 出手相助~ 等等那是?</h2>
<blockquote>
<p>PackageKit is a system designed to make installing and updating
software on your computer easier …</p></blockquote></div><p>如果汝是 GNU/Linux 爱好者的话,一定有自己喜欢的 GNU/Linux 发行版了吧。
对那个发行版使用的软件包管理器的操作大概也已经谙熟于心了呗~</p>
<p>直到汝有时需要摆弄别的发行版的时候:</p>
<div class="highlight"><pre><span class="code-line"><span></span>horo@debian:~ $ sudo pacman -Syu</span>
<span class="code-line">sudo: pacman: <span class="nb">command</span> not found</span>
</pre></div>
<p>emmm......</p>
<p>虽然 pacman 的话,有 <a class="reference external" href="https://github.com/icy/pacapt">pacapt</a> 这样的工具来包装其它
软件包管理器的操作。但如果汝不适合这种状况呢(例如常用 Ubuntu ?<del>(打死……)</del> )?</p>
<div class="section" id="packagekit">
<h2>PackageKit 出手相助~ 等等那是?</h2>
<blockquote>
<p>PackageKit is a system designed to make installing and updating
software on your computer easier.</p>
<p>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.</p>
<p class="attribution">—<a class="reference external" href="https://www.freedesktop.org/software/PackageKit/pk-intro.html">https://www.freedesktop.org/software/PackageKit/pk-intro.html</a></p>
</blockquote>
<p>PackageKit 是一个在不同的软件包管理器中统一操作的高阶前端(比 apt / dnf 一类的更高阶?),
当然没有打算取代各位的意思啦(笑)。</p>
<p>和 gcc 类似, PackageKit 通常也是由若干个前端和若干个后端组成的。</p>
<ul class="simple">
<li>后端通过一系列抽象工具和 packagekitd / libpackagekit 交互。</li>
<li>前端为用户提供界面。例如 PackageKit 自己提供的 pkcon。</li>
</ul>
</div>
<div class="section" id="id1">
<h2>所以它怎么用?</h2>
<p>基本操作和普通的软件包管理器差不多:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># pkcon install <package></span></span>
<span class="code-line"><span class="c1"># 如果汝的账户具有管理员权限(在大多数桌面环境中认为 wheel 组的成员具有管理员权限),</span></span>
<span class="code-line"><span class="c1"># 安装时会询问汝的密码(通过 Polkit 完成)。</span></span>
<span class="code-line">$ pkcon install tk</span>
<span class="code-line">Resolving <span class="o">[=========================]</span></span>
<span class="code-line">Finished <span class="o">[</span> <span class="o">]</span> <span class="o">(</span><span class="m">0</span>%<span class="o">)</span></span>
<span class="code-line">The following packages have to be updated:</span>
<span class="code-line">tk-8.6.9-2.x86_64 A windowing toolkit <span class="k">for</span> use with tcl</span>
<span class="code-line">Proceed with changes? <span class="o">[</span>N/y<span class="o">]</span></span>
<span class="code-line">Testing changes <span class="o">[=========================]</span></span>
<span class="code-line">Installing <span class="o">[=========================]</span></span>
<span class="code-line">Installing updates <span class="o">[=========================]</span></span>
<span class="code-line">Finished <span class="o">[=========================]</span></span>
<span class="code-line"><span class="c1"># pkcon search <keyword></span></span>
<span class="code-line">$ pkcon search fcitx</span>
<span class="code-line">Searching by details <span class="o">[=========================]</span></span>
<span class="code-line">Querying <span class="o">[=========================]</span></span>
<span class="code-line">Finished <span class="o">[=========================]</span></span>
<span class="code-line">Installed fcitx-4.2.9.6-1.x86_64 <span class="o">(</span>installed<span class="o">)</span> Flexible Context-aware Input Tool with eXtension</span>
<span class="code-line">Available fcitx-anthy-0.2.3-1.x86_64 <span class="o">(</span>community<span class="o">)</span> Fcitx Wrapper <span class="k">for</span> anthy.</span>
<span class="code-line">Available fcitx-chewing-0.2.3-2.x86_64 <span class="o">(</span>community<span class="o">)</span> Fcitx Wrapper <span class="k">for</span> chewing</span>
<span class="code-line">Available fcitx-chewing-git-0.2.3.r4.ge4bb273-4.x86_64 <span class="o">(</span>archlinuxcn<span class="o">)</span> Fcitx Wrapper <span class="k">for</span> chewing</span>
<span class="code-line">Available fcitx-cloudpinyin-0.3.6-2.x86_64 <span class="o">(</span>community<span class="o">)</span> Standalone module <span class="k">for</span> fcitx that uses pinyin API on the internet to provide additional input candidates</span>
<span class="code-line">Installed fcitx-configtool-0.4.10-3.x86_64 <span class="o">(</span>installed<span class="o">)</span> GTK based config tool <span class="k">for</span> Fcitx</span>
<span class="code-line">Available fcitx-googlepinyin-0.1.6-6.x86_64 <span class="o">(</span>community<span class="o">)</span> Fcitx Wrapper <span class="k">for</span> googlepinyin</span>
<span class="code-line">Installed fcitx-gtk2-4.2.9.6-1.x86_64 <span class="o">(</span>installed<span class="o">)</span> GTK2 IM Module <span class="k">for</span> fcitx</span>
<span class="code-line">Installed fcitx-gtk3-4.2.9.6-1.x86_64 <span class="o">(</span>installed<span class="o">)</span> GTK3 IM Module <span class="k">for</span> fcitx</span>
<span class="code-line">......</span>
<span class="code-line"><span class="c1"># pkcon get-updates 可以检查更新</span></span>
<span class="code-line">$ pkcon get-updates</span>
<span class="code-line">Getting updates <span class="o">[=========================]</span></span>
<span class="code-line">Downloading list of packages <span class="o">[=========================]</span></span>
<span class="code-line">Finished <span class="o">[=========================]</span></span>
<span class="code-line">Normal adwaita-icon-theme-3.32.0-1.any <span class="o">(</span>extra<span class="o">)</span> GNOME standard icons</span>
<span class="code-line">Normal apache-2.4.39-1.x86_64 <span class="o">(</span>extra<span class="o">)</span> A high performance Unix-based HTTP server</span>
<span class="code-line">Normal archlinux-appstream-data-20190320-1.any <span class="o">(</span>extra<span class="o">)</span> Arch Linux application database <span class="k">for</span> AppStream-based software centers</span>
<span class="code-line">Normal archlinuxcn-keyring-20190315-2.any <span class="o">(</span>archlinuxcn<span class="o">)</span> Arch Linux CN PGP keyring</span>
<span class="code-line">Normal babl-0.1.62-1.x86_64 <span class="o">(</span>extra<span class="o">)</span> Dynamic, any to any, pixel format conversion library</span>
<span class="code-line">......</span>
<span class="code-line"><span class="c1"># pkcon refresh 可以更新软件仓库列表。</span></span>
<span class="code-line">$ pkcon refresh</span>
<span class="code-line"><span class="c1"># pkcon backend-details 可以查询 PackageKit 使用的后端的详细信息。</span></span>
<span class="code-line">$ pkcon backend-details</span>
<span class="code-line">Name: alpm</span>
<span class="code-line">Description: alpm</span>
<span class="code-line">Author: Aleix Pol i Gonzàlez <aleixpol@kde.org>, Fabien Bourigault <bourigaultfabien@gmail.com>, Jonathan Conder <jonno.conder@gmail.com></span>
</pre></div>
<p>其它 pkcon 的命令可以通过查询手册页了解(pkcon(1))</p>
</div>
<div class="section" id="id2">
<h2>那有没有图形前端?</h2>
<p>当然有啦,例如 gnome-packagekit 和 apper, 它们通过 PackageKit 提供了安装,查找和卸载软件包的功能:</p>
<img alt="gnome-packagekit 的界面" class="materialboxed responsive-img" src="https://upload.wikimedia.org/wikipedia/commons/6/6f/Gnome-packagekit_3.22_on_GNOME_Shell_3.22_--_2016%2C_09.png"/>
<img alt="apper 的界面" class="materialboxed responsive-img" src="https://upload.wikimedia.org/wikipedia/commons/c/c9/Kpackagekit.png"/>
<p>如果汝更中意类似应用商店的体验, GNOME 有 GNOME Software, KDE Plasma 有 Discover:</p>
<img alt="GMOME Software" class="materialboxed responsive-img" src="https://wiki.gnome.org/Apps/Software?action=AttachFile&do=get&target=gnome-software.png"/>
<img alt="Discover" class="materialboxed responsive-img" src="https://userbase.kde.org/images.userbase/8/8c/Discoverfront.png"/>
<p>至于怎么用请参考它们和汝正在使用的 GNU/Linux 发行版的文档 <del>(懒了……)</del></p>
</div>
<div class="section" id="id3">
<h2>PackageKit 不是什么?</h2>
<p>PackageKit 不能代替汝正在使用的软件包管理器(毕竟没了它们做后端这家伙啥也干不了)</p>
<p>emmm......</p>
</div>
和 FiveYellowMice 交换问题!2019-02-20T00:00:00+08:002019-02-20T00:00:00+08:00ホロtag:None,2019-02-20:/life/question_exchange_fiveyellowmice.html<p>终于还是咕咕出来了?</p>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id5">所以这笔谈是个啥东西?</a></h2>
<blockquote>
笔谈,是指人们在面对面的情况下不使用口头语言而是通过互相书面书写或键盘输入文字的方式,来传达彼此意思的沟通行为。
是汉字文化圈地域内不同母语的文人相互交流的方法之一。主要使用汉字以及文言文(汉文)的交流方式。</blockquote>
<p><del>看这家伙已经懒到直接抄维基百科了……</del></p>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id6">咱的问题和 🐁🐁🐁🐁🐁 的回答~</a></h2>
<p><a class="reference external" href="https://fiveyellowmice.com/posts/2019/02/question-exchange-with-moe-wolf.html">直接去它们(?)的 Blog 上看咯~</a></p>
</div>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id7">🐁🐁🐁🐁🐁 的问题和咱的回答~</a></h2>
<ul>
<li><p class="first">看到萌狼有经常尝试非常正统的 GNU 操作系统,一点点不清真的东西也容不下的那种,
然后因为来自硬件和软件的支持都很少,用起来就很辛苦。虽然黄鼠也同样幻想着 GNU
能够成为被主流支持的东西,但是如果现实地讲,萌狼觉得纯正的 GNU 有怎样的意义呢?
比起其它的相对来说更接受非自由软件的存在的理念而言。</p>
<blockquote>
<p>如果 🐀 去翻翻以前的史话什么的,大概就会发现软件本来都是自由的啦。
RMS 也许只是在回归本源而已(笑)。以及现在计算机科学越来越发达了,
汝真的放心让那些私有的黑盒子走(kong)进(zhi)汝的生活嘛(😂)。</p>
<p>// 关于自由软件的必要性和思想什么的, RMS 编辑的 Free Software, Free Society …</p></blockquote></li></ul></div><p>终于还是咕咕出来了?</p>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id5">所以这笔谈是个啥东西?</a></h2>
<blockquote>
笔谈,是指人们在面对面的情况下不使用口头语言而是通过互相书面书写或键盘输入文字的方式,来传达彼此意思的沟通行为。
是汉字文化圈地域内不同母语的文人相互交流的方法之一。主要使用汉字以及文言文(汉文)的交流方式。</blockquote>
<p><del>看这家伙已经懒到直接抄维基百科了……</del></p>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id6">咱的问题和 🐁🐁🐁🐁🐁 的回答~</a></h2>
<p><a class="reference external" href="https://fiveyellowmice.com/posts/2019/02/question-exchange-with-moe-wolf.html">直接去它们(?)的 Blog 上看咯~</a></p>
</div>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id7">🐁🐁🐁🐁🐁 的问题和咱的回答~</a></h2>
<ul>
<li><p class="first">看到萌狼有经常尝试非常正统的 GNU 操作系统,一点点不清真的东西也容不下的那种,
然后因为来自硬件和软件的支持都很少,用起来就很辛苦。虽然黄鼠也同样幻想着 GNU
能够成为被主流支持的东西,但是如果现实地讲,萌狼觉得纯正的 GNU 有怎样的意义呢?
比起其它的相对来说更接受非自由软件的存在的理念而言。</p>
<blockquote>
<p>如果 🐀 去翻翻以前的史话什么的,大概就会发现软件本来都是自由的啦。
RMS 也许只是在回归本源而已(笑)。以及现在计算机科学越来越发达了,
汝真的放心让那些私有的黑盒子走(kong)进(zhi)汝的生活嘛(😂)。</p>
<p>// 关于自由软件的必要性和思想什么的, RMS 编辑的 Free Software, Free Society
( BLUG 哪边有中文翻译 <a class="reference external" href="https://beijinglug.club/fsfs-zh/">https://beijinglug.club/fsfs-zh/</a> )整理了一些文章, 🐀 可以去看一看咯~</p>
<p>// 至于完全自由的生活会不会比较难过(虽然咱其实还没达到),
咱现在觉得除了游戏基本上已经没有什么问题啦。不少领域里自由软件都已经达
到了可用甚至优秀的水平,也有不少可以自由驱动的硬件了(虽然都有点旧但是还能用)。
总之还是充满希望的啦~</p>
</blockquote>
</li>
<li><p class="first">街机音游看起来很有趣呢。但比起在自己的设备上玩的游戏,
除了要碰运气才能够在自己生活的地方附近找到想玩的游戏以外,每次玩还都要付钱,
玩不了几次就会比买一份普通的 PC 或者主机游戏花得钱多了。
对这样按照回合收费的商业模式,萌狼有着怎样的看法呢?</p>
<blockquote>
<p>如果家里有矿的话可以自己买一台街机回家啊(大雾)</p>
<p>怎么说呢,如果汝真的喜欢上了什么的话,那么在自己能力范围内的消费大概就会逐渐被
自己忽略了吧……还有啊,几乎大多数游戏类型里,想要提升自己的水平的话只
有靠长时间的练习对不对(当然有些时候也需要玩家间的交流和相互支持),当汝
看到自己从一开始手忙脚乱到后来能行云流水的游玩自己擅长的谱面的时候,
那股欣慰和成就感应该也能冲刷掉一点氪金的伤感(?)</p>
<p>总之不管付费方式怎么样,遇到合适自己的游戏,玩家还是会心甘情愿的买单的不是?</p>
</blockquote>
</li>
<li><p class="first">萌狼觉得自己在最近的几年,有着怎样的改变呐?</p>
<blockquote>
<p>觉得自己快成和以前不同的另一个(zhi)人(lang)了 😂</p>
<p>可能就是从各种各样的第一次开始吧,开始思考一些以前觉得稀松平常的问题了
(例如隐私和安全什么的)。最直接的结果就是出门带上的东西成倍增加 😂</p>
</blockquote>
</li>
<li><p class="first">萌狼是怎样知道「何でも言うことを聞いてくれる」的梗,又是为什么会喜欢上的呐?</p>
<blockquote>
<p>和朋友一起打 maimai 时听来的,然后就去搜索了下那首歌的 BGA ,
莫名还挺好(mo)看(xing)的 ?以及茜酱超会听(fu)话(yan)的对不对~</p>
</blockquote>
</li>
<li><p class="first">除了狼以外,觉得毛茸茸的四脚哺乳动物中,哪种最喜欢呢?</p>
<blockquote>
<p>🐱,因为自己只亲手摸过猫的样子? 😂</p>
</blockquote>
</li>
<li><p class="first">觉得自己总体来说,是外向还是内向的人呢?在哪些地方是外向的,哪些地方是内向的?</p>
<blockquote>
<p>总体应该算是内向的吧(只是看起来而已,和咱一起久了的家伙都觉得咱挺活
(gao)泼(shi)的。要是问方面的话咱自己也不太能搞清楚的样子…… 😞</p>
</blockquote>
</li>
<li><p class="first">做出和各种人交换笔谈的决定,黄鼠觉得会很辛苦呢。尤其是越到后面,
别人想问萌狼的问题也许很多都被问掉了,萌狼想问别人的问题也会很容易变得重复和单调。
这样的困难,萌狼准备怎样应对呐?</p>
<blockquote>
<p>其实咱一开始根本没有考虑到这一点 😂,大概就是突然有了这么做的想法就
付诸实施的样子。不过咱大概能做到打出的问题不至于太重复吧,
至于收到的问题是什么样的就 emmm (不过在这之前是不是该先考虑能找到几个愿意和咱
这样笔谈的笔友(?)的问题) 😮</p>
</blockquote>
</li>
<li><p class="first">😋 ?</p>
<blockquote>
<p>😋!</p>
</blockquote>
</li>
</ul>
</div>
<div class="section" id="id4">
<h2><a class="toc-backref" href="#id8">那么下一个是?</a></h2>
<p>其实还没想好 😂,如果咱友链里剩下的谁愿意自告奋勇也热烈欢迎啦 ……</p>
</div>
舞律炫步体(tu)验(cao)2019-02-10T00:00:00+08:002019-02-10T00:00:00+08:00ホロtag:None,2019-02-10:/game/playing_dancerush_stardom_chinese.html<p>嗯…… 大概就是标题那样,在咕咕咕和没零件交错后咱玩到了
国行版的 DANCERUSH STARDOM ,中文名叫舞律炫步 😂</p>
<div class="section" id="dancerush-stardom">
<h2>等等 DANCERUSH STARDOM 是什么东西?</h2>
<p>DANCERUSH STARDOM 是KONAMI目前(2019年1月)最新的 BEMANI 系列游戏。
事先以 STEPSTAR, ShuffleDancerz, DANCE GENERATIONS, 和 DANCE RUSH 的名义进行了场测,
直到 JAEPO 2018 展会才以 DANCERUSH STARDOM 作为正式名义推出。</p>
<p>DANCERUSH STARDOM 是一款和舞蹈进化非常相似的跳舞机.
但并没有使用之前舞蹈进化使用的微软Kinect for Windows来捕捉玩家的动作,
而是采用了英特尔 RealSense 410 (RS410)作为新的动作感应器, DANCERUSH 还有一个非常大
的感应地板, 作为主游玩感应设备。</p>
<p><a class="reference external" href="https://p.eagate.573.jp/game/dan/1st/entrance.html">可以去它们的官方网站看到具体是啥样子 …</a></p></div><p>嗯…… 大概就是标题那样,在咕咕咕和没零件交错后咱玩到了
国行版的 DANCERUSH STARDOM ,中文名叫舞律炫步 😂</p>
<div class="section" id="dancerush-stardom">
<h2>等等 DANCERUSH STARDOM 是什么东西?</h2>
<p>DANCERUSH STARDOM 是KONAMI目前(2019年1月)最新的 BEMANI 系列游戏。
事先以 STEPSTAR, ShuffleDancerz, DANCE GENERATIONS, 和 DANCE RUSH 的名义进行了场测,
直到 JAEPO 2018 展会才以 DANCERUSH STARDOM 作为正式名义推出。</p>
<p>DANCERUSH STARDOM 是一款和舞蹈进化非常相似的跳舞机.
但并没有使用之前舞蹈进化使用的微软Kinect for Windows来捕捉玩家的动作,
而是采用了英特尔 RealSense 410 (RS410)作为新的动作感应器, DANCERUSH 还有一个非常大
的感应地板, 作为主游玩感应设备。</p>
<p><a class="reference external" href="https://p.eagate.573.jp/game/dan/1st/entrance.html">可以去它们的官方网站看到具体是啥样子</a> 。</p>
<p>早些时候就有了世宇科技(?)要代理 DRS 的消息,还在中山展出过(可以叫场测嘛……),
虽然说的是一月开始铺货,但是因为下方的踏板没能和框体一起送到的缘故咕咕咕到
2 月 2 日才开始运营……</p>
</div>
<div class="section" id="id2">
<h2>那么这游戏该怎么玩?</h2>
<p><a class="reference external" href="https://www.youtube.com/watch?v=M8d5Wjl9QtQ">官方有教程视频</a> 。</p>
</div>
<div class="section" id="id4">
<h2>那国行有啥区别咧?</h2>
<img alt="国行框体的标题画面" class="materialboxed responsive-img" src="/images/playing_dancerush_stardom_chinese/cabinet.jpg"/>
<p>^ 国行框体的标题画面(那个“请在按下面按”是什么鬼?)</p>
<p>中国专用 e-amusement 了解一下?</p>
<ul class="simple">
<li>和以前引进的 BEMANI 街机一样,肯定不能连官方的 e-amusement 啦,于是就搞出了个
“中国专用 e-amusement” 那样的东西</li>
<li>所以理所当然的砍掉了刷卡器和数字键盘。登录?又是微信扫码的日常套路……</li>
</ul>
<img alt="扫码登录" class="materialboxed responsive-img" src="/images/playing_dancerush_stardom_chinese/login.jpg"/>
<ul class="simple">
<li>价格奇坑(待会儿再讲)</li>
<li>既然某 Y 字头网站在国内不存在,自然没有录影功能。</li>
<li>默认简体字界面,当然语音也中文化了。不过能在开始时选择其它语言,和官机一样。</li>
<li>没有储星星等各种解禁元素,取而代之的是星星提升等级解禁……</li>
<li>然而全曲只有 76 首(20190130),而且一如既往的删了些?(例如咱没见到 Butterfly)</li>
<li>emmm ......</li>
</ul>
</div>
<div class="section" id="id5">
<h2>为啥说国行价钱坑?</h2>
<p>默认只有 1 Stage (官机哪怕是 LIGHT 也是两 Stage 保证咧),后来发现世宇还搞了个啥会员?</p>
<img alt="中国专用 e-amusement 的会员价格" class="materialboxed responsive-img" src="/images/playing_dancerush_stardom_chinese/eamucn_pricing.jpg"/>
<p>就这个,不知道这会员是一个游戏一个游戏的卖还是和官方一样(e-amusement 是有 Subscription 的,
然后不同的游戏可能会单独卖个像会员的东西,例如 beatmania IIDX 的 Platium Members Card)。
顺便说一句这个 am 点是他们自己搞出来的啥,1 am 点 = 1 元人民币,看起来挺像 PASELI 的哈……</p>
<p>于是不氪 VIP 是进不了 EXTRA STAGE 的(官方的话是 STANDARD 模式两曲合计 180 分以上就能进,以及这游戏
满分是 100 分),更甚不氪会员都没法存档,嗯可以的……</p>
<blockquote>
drs这个收费 30和50都是废物.jpg -- 一位不愿意透露姓名的 L 姓玩家</blockquote>
<p>以及氪了 VIP 的话 Gauge 不会下降?(EXTRA STAGE 本来是 10 次 Bad 就游戏结束的,咱打完发现一把 Bad 的后
开始怀疑这点了……)</p>
</div>
<div class="section" id="id6">
<h2>那咱觉得怎么样呢?</h2>
<p>啊有的玩已经很不容易了……</p>
<p>如果汝有音游基础(特别是街机音游玩家)或者舞蹈基础(推测?)的话,这个游戏还是挺简单的。
(反正咱玩了一下午可以瞎蹦蹦 9 级曲了,目前最难 10 级不敢试……)</p>
<p>游戏除了一般的教程的话还有几种常见动作的指导和训练,刚上手(严格来说是上足?)的时候建议玩玩看。</p>
</div>
<div class="section" id="id7">
<h2>杂记</h2>
<ul class="simple">
<li>虽然教程汉化了还是有路人直接跳过教程…… 于是就能见到 emmmm……</li>
<li>和隔壁鹅舞形成了鲜明的对比……</li>
</ul>
<img alt="鲜明的对比?" class="materialboxed responsive-img" src="/images/playing_dancerush_stardom_chinese/compare.jpg"/>
</div>
Arch Linux 中文社区仓库从使用到打包(大雾)2019-01-20T00:00:00+08:002019-01-20T00:00:00+08:00ホロtag:None,2019-01-20:/arch-linux/archlinuxcn_repo_packaging.html<p>/me 自从用了 Arch Linux 以后,就有了那种想要做些什么的感觉了呢(大雾)</p>
<div class="section" id="id1">
<h2>Arch Linux 中文社区仓库是啥,我该怎么用?</h2>
<blockquote>
Arch Linux 中文社区仓库 是由 Arch Linux
中文社区驱动的非官方用户仓库,包含一些额外的软件包以及已有软件的
git 版本等变种。部分软件包的打包脚本来源于 AUR。</blockquote>
<p>Emmmm 这个介绍应该够看了吧……</p>
<p>要使用的话,编辑 /etc/pacman.conf ,加入中文社区的仓库地址:</p>
<div class="highlight"><pre><span class="code-line"><span></span>[archlinuxcn]</span>
<span class="code-line">Server = https://cdn.repo.archlinuxcn.org/$arch</span>
</pre></div>
<p>这个 Server 的 CDN 除了国内几乎都能用,国内的话可以去
<a class="reference external" href="https://github.com/archlinuxcn/mirrorlist-repo">https://github.com/archlinuxcn/mirrorlist-repo …</a></p></div><p>/me 自从用了 Arch Linux 以后,就有了那种想要做些什么的感觉了呢(大雾)</p>
<div class="section" id="id1">
<h2>Arch Linux 中文社区仓库是啥,我该怎么用?</h2>
<blockquote>
Arch Linux 中文社区仓库 是由 Arch Linux
中文社区驱动的非官方用户仓库,包含一些额外的软件包以及已有软件的
git 版本等变种。部分软件包的打包脚本来源于 AUR。</blockquote>
<p>Emmmm 这个介绍应该够看了吧……</p>
<p>要使用的话,编辑 /etc/pacman.conf ,加入中文社区的仓库地址:</p>
<div class="highlight"><pre><span class="code-line"><span></span>[archlinuxcn]</span>
<span class="code-line">Server = https://cdn.repo.archlinuxcn.org/$arch</span>
</pre></div>
<p>这个 Server 的 CDN 除了国内几乎都能用,国内的话可以去
<a class="reference external" href="https://github.com/archlinuxcn/mirrorlist-repo">https://github.com/archlinuxcn/mirrorlist-repo</a>
看一下可用的镜像。</p>
<p>然后安装 keyring (不然汝是装不上里面的包的):</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># pacman -Syyu archlinuxcn-keyring</span></span>
</pre></div>
<p>如果在使用的过程中遇到了啥问题的话,除了 <a class="reference external" href="https://fars.ee/~readme.html">上社区交流群吹水</a>
以外,也可以去 <a class="reference external" href="https://github.com/archlinuxcn/repo/issues">中文社区仓库在 Github 上的 Issues 页面</a>
提问。(问之前记得看看模板和现有的问题,以及老生常谈的提问的智慧)</p>
<p>然而上面的这些都不是重点(雾),要是汝有心意的话,为啥不来一起打包呢(期待的眼神)</p>
</div>
<div class="section" id="id3">
<h2>申请成为中文社区仓库的维护者</h2>
<p>直接参考 <a class="reference external" href="https://github.com/archlinuxcn/repo/wiki/申请当维护者">https://github.com/archlinuxcn/repo/wiki/申请当维护者</a> 就好啦~</p>
<p>如果汝有幸通过了的话,可以接着往下看了(滑稽)</p>
</div>
<div class="section" id="id4">
<h2>向中文仓库新增软件包之开始之前</h2>
<p>开始之前的话,有一些软件包需要装:</p>
<ul class="simple">
<li>base-devel (这个应该在汝用 AUR 的时候就装上了吧)</li>
<li>devtools (可以生成一个干净的环境来编译软件包)</li>
<li>devtools-cn-git (上面的小修改版,如果汝的软件包的依赖有 [archlinuxcn] 的软件包时可以使用)</li>
<li>archcn-tools-meta (一些工具的合集的元包)</li>
</ul>
<p>如果可以的话,最好打开 testing 和 community-testing 仓库 <del>来提前为用户踩坑……</del></p>
</div>
<div class="section" id="id5">
<h2>向中文仓库新增软件包之手动打包篇</h2>
<blockquote>
既然汝有心意加包(?)了的话,应该对 makepkg 的使用很谙熟了吧,这里就
偷下懒不赘述了 😂</blockquote>
<p>中文社区仓库对手动打包的要求大概是这样的:</p>
<blockquote>
如果是在本地打包,请将包文件上传至编译服务器自己主目录下的临时目录 ,上传完毕后移动到
/home/repo 目录,以避免网络中断或者其它原因造成不完整的包被添加到源中。</blockquote>
<p>如果汝有翻过 wiki 的话会发现咱漏掉了在服务器上打包那部分对不对?(不要在意那些细节.webp.png)
在生成完软件包后,用 gpg 生成一个分离签名:</p>
<div class="highlight"><pre><span class="code-line"><span></span>$ gpg --detach-sign /path/to/your/package.pkg.tar.xz</span>
</pre></div>
<p>签名完毕以后汝就会在打好的软件包目录中发现同名的 sig 文件,把这个文件和软件包一起上传到编译机上就 OK 啦~</p>
<ul class="simple">
<li>不要直接上传到 ~/repo 中,而是先上传到汝的主文件夹的一个位置上再通过 ssh mv(移动) 过去 😂</li>
</ul>
</div>
<div class="section" id="id6">
<h2>向中文仓库新增软件包之紫丁香篇(?)</h2>
<p>然而实际操作中手动打包的场合越来越少了,现在大家都会用一些技巧来自动的更新啦,例如 <del>紫丁香</del> lilac。</p>
<p>Lilac 是 Arch Linux CN 目前主要的打包机器人,主要由百合负责开发 ( <a class="reference external" href="/links.html#lilydjwg">lilydjwg</a> )。</p>
<p>要想找 lilac 帮忙的话,有两个文件不可少:</p>
<ul class="simple">
<li>lilac.yaml , 一些诸如维护者和更新时机的元数据。</li>
<li>lilac.py , lilac 看到这个文件的时候才会尝试自动更新的哦~</li>
</ul>
<p>lilac.yaml的详细结构和语法可以在 <a class="reference external" href="https://archlinuxcn.github.io/lilac/">https://archlinuxcn.github.io/lilac/</a> 上找到。
如果不知道怎么写的话,翻翻仓库里已经有的 lilac.yaml 咯~</p>
<p>在提交前记得运行一下仓库里的 ./pre-commit 来检查一下自己的的 lilac 的设置有没有问题,
可以通过设置 git hooks 做到在提交之前自动运行(其实就是一个 ln)</p>
<blockquote>
ln -sr pre-commit .git/hooks/pre-commit</blockquote>
<p><a class="reference external" href="https://github.com/archlinuxcn/repo/wiki/lilac-%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98">Lilac 常见问题</a>
收集了一些大家在用 lilac 的时候遇到的问题,如果汝有遇到类似的问题的话可以参考,自己的经验也可以写在上面。</p>
</div>
<div class="section" id="aur-lilac">
<h2>以收养(?) AUR 的软件包为例举一个使用 lilac 的栗子</h2>
<blockquote>
AUR 里的包大概是 [archlinuxcn] 里的主要成分 😂</blockquote>
<p>这里就用咱在 AUR 和 [archlinuxcn] 里都有维护的 parsoid 举例了 ~</p>
<p>首先从 AUR 获得 PKGBUILD 和一系列安装时会用到的文件,然后放在仓库的 archlinuxcn/ 文件夹中。</p>
<p>然后在里面新建一个 lilac.yaml:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># maintainers 就是这个包的维护者啦,如果编译遇到啥问题不通过的话</span></span>
<span class="code-line"><span class="c1"># lilac 会给相应的维护者发邮件哦~</span></span>
<span class="code-line"><span class="c1"># 基本上设置成汝 Github 的用户名就可以,如果汝没有设置公开邮件地址的话,</span></span>
<span class="code-line"><span class="c1"># 记得另外设置个 email 属性。</span></span>
<span class="code-line"><span class="nt">maintainers</span><span class="p">:</span></span>
<span class="code-line"><span class="p p-Indicator">-</span> <span class="nt">github</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">KenOokamiHoro</span></span>
<span class="code-line"><span class="c1"># build_prefix 就是编译时要使用哪一个 devtools 里的命令啦(大概),</span></span>
<span class="code-line"><span class="c1"># 对于大多数包来说, extra-x86_64 就 OK。</span></span>
<span class="code-line"><span class="c1"># 可以使用的各种类型去翻 schema 啦</span></span>
<span class="code-line"><span class="nt">build_prefix</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">extra-x86_64</span></span>
<span class="code-line"><span class="c1"># pre_build 和 post_build 是 lilac 在编译之前和之后运行的函数,</span></span>
<span class="code-line"><span class="c1"># 对于大多数 AUR 的包, aur_pre_build 和 aur_post_build 就 OK。</span></span>
<span class="code-line"><span class="nt">pre_build</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">aur_pre_build</span></span>
<span class="code-line"><span class="nt">post_build</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">aur_post_build</span></span>
<span class="code-line"><span class="c1"># update_on 是更新来源的列表,对于想在 AUR 更新时更新的这种状况而言,</span></span>
<span class="code-line"><span class="c1"># - aur: <AUR 上的软件包名称> 就好啦~</span></span>
<span class="code-line"><span class="c1"># 记得第一项应当是软件的来源,剩下的是重新打包的时机。</span></span>
<span class="code-line"><span class="nt">update_on</span><span class="p">:</span></span>
<span class="code-line"><span class="p p-Indicator">-</span> <span class="nt">github</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">wikimedia/parsoid</span></span>
<span class="code-line"> <span class="nt">use_max_tag</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">true</span></span>
<span class="code-line"><span class="p p-Indicator">-</span> <span class="nt">aur</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">parsoid</span></span>
</pre></div>
<p>然后新建一个空白的 lilac.py 用来提示(?) lilac 自动更新。</p>
<p>在自己编译 OK 和 pre-commit 测试通过以后就可以提交啦,lilac 会在每日北京时间1, 9, 17点17分在社区编译机上运行,
以检查软件的新版本及自动打包。</p>
<p><a class="reference external" href="https://build.archlinuxcn.org/">https://build.archlinuxcn.org/</a> 上可以查看软件包的编译状态和上次更新时间等相关信息。
在 #archlinux-cn 频道里可以通过 !cnbuild 命令看个大概(大嘘</p>
</div>
<div class="section" id="lilac-py">
<h2>所以那个 lilac.py 是一直都是空白的嘛?</h2>
<p>如果汝要在编译之前执行某些操作,汝可能需要在 lilac.py 里写些东西,例如:</p>
<ul class="simple">
<li>AUR 中的 PKGBUILD 已经 out-of-date ,但是希望通过 AUR 中的 PKGBUILD 来构建软件包,需要修改 pkgver 和 hash 值时;</li>
<li>AUR 中的 PKGBUILD 修改包括依赖、构建函数等才能正确构建软件包时;</li>
<li>通过 sourceforge 等其他网站直接检查版本更新,但希望通过修改 AUR 中的 PKGBUILD 来构建软件包时。</li>
<li>……</li>
</ul>
<p><a class="reference external" href="https://github.com/archlinuxcn/lilac/tree/master/templates">这里有一些例子</a> ,
需要的话也可以翻翻仓库里不为空的 lilac.py 学习一下。</p>
</div>
Sailfish OS 移植中(3)- 更新和各种杂务续篇2019-01-19T00:00:00+08:002019-01-19T00:00:00+08:00ホロtag:None,2019-01-19:/sailfish/porting_sailfishos_3.html<p>如果 Target 更新了该怎么办? _(:з」∠)_</p>
<div class="section" id="target">
<h2><a class="toc-backref" href="#id2">咱该怎么知道 Target 更新了呢?</a></h2>
<p><a class="reference external" href="https://releases.sailfishos.org/sdk/targets/">https://releases.sailfishos.org/sdk/targets/</a> 有各个版本 SDK 的列表。</p>
</div>
<div class="section" id="target-sdk">
<h2><a class="toc-backref" href="#id3">更新 Target SDK</a></h2>
<p>在 Platform SDK Shell 里运行:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># sdk-assistant 方式</span></span>
<span class="code-line">$ sdk-assistant update <target-name></span>
<span class="code-line"><span class="c1"># sdk-manage 方式</span></span>
<span class="code-line">$ sdk-manage tooling update <name></span>
<span class="code-line">$ sdk-manage target update <name></span>
</pre></div>
<p><del>当然要是布星的话把 /srv/mer 删了重新来一遍也行啊 ……</del></p>
</div>
<div class="section" id="submodules">
<h2><a class="toc-backref" href="#id4">更新源代码和 submodules</a></h2>
<p>切换到 libybris 的目录 …</p></div><p>如果 Target 更新了该怎么办? _(:з」∠)_</p>
<div class="section" id="target">
<h2><a class="toc-backref" href="#id2">咱该怎么知道 Target 更新了呢?</a></h2>
<p><a class="reference external" href="https://releases.sailfishos.org/sdk/targets/">https://releases.sailfishos.org/sdk/targets/</a> 有各个版本 SDK 的列表。</p>
</div>
<div class="section" id="target-sdk">
<h2><a class="toc-backref" href="#id3">更新 Target SDK</a></h2>
<p>在 Platform SDK Shell 里运行:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># sdk-assistant 方式</span></span>
<span class="code-line">$ sdk-assistant update <target-name></span>
<span class="code-line"><span class="c1"># sdk-manage 方式</span></span>
<span class="code-line">$ sdk-manage tooling update <name></span>
<span class="code-line">$ sdk-manage target update <name></span>
</pre></div>
<p><del>当然要是布星的话把 /srv/mer 删了重新来一遍也行啊 ……</del></p>
</div>
<div class="section" id="submodules">
<h2><a class="toc-backref" href="#id4">更新源代码和 submodules</a></h2>
<p>切换到 libybris 的目录,然后运行 <code class="code">
repo sync --fetch-submodules</code>
。</p>
<ul class="simple">
<li>记得先提交汝的修改。</li>
</ul>
<p>还有一些 submodule 需要更新:</p>
<ul class="simple">
<li>rpm/dhd</li>
<li>hybris/droid-configs/droid-configs-device</li>
<li>hybris/droid-hal-version-$VENDOR-$device/droid-hal-version</li>
</ul>
<p>在这些目录里运行:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># git remote -v 获得远程分支</span></span>
<span class="code-line">$ git remote -v</span>
<span class="code-line">github https://github.com/mer-hybris/droid-hal-configs <span class="o">(</span>fetch<span class="o">)</span></span>
<span class="code-line">github https://github.com/mer-hybris/droid-hal-configs <span class="o">(</span>push<span class="o">)</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="c1"># 拉取远程的源代码</span></span>
<span class="code-line">$ git fetch github</span>
<span class="code-line">$ git pull github master</span>
</pre></div>
<p>然后把 hybris-boot 和 droid-hal 重新打包一下就好(忘了怎么搞?
去翻翻以前的文章或者文档吧 😂)</p>
</div>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id5">跳过教程</a></h2>
<p>每次刷机都要重新设置和看一遍教程很烦? 在教程画面从左上角顺时针点按屏幕即可跳过(大嘘</p>
</div>
<div class="section" id="hybris-15-1">
<h2><a class="toc-backref" href="#id6">hybris-15.1 移植的相关事项</a></h2>
<p>在编译 hybris-hal 之前:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="nb">cd</span> <span class="nv">$ANDROID_ROOT</span></span>
<span class="code-line">mkdir -p hybris/mw</span>
<span class="code-line"><span class="nb">cd</span> hybris/mw</span>
<span class="code-line">git clone --recurse-submodules https://github.com/mer-hybris/libhybris.git -b android8-initial</span>
</pre></div>
<p>以及不要在 build_package.sh 时编译 libhybris ,而是先手动单独编译:</p>
<div class="highlight"><pre><span class="code-line"><span></span>rpm/dhd/helper/build_packages.sh -b hybris/mw/libhybris/</span>
</pre></div>
<p>然后再编译剩下的包(记得跳过 libhybris)。</p>
<blockquote>
When running build_package.sh always skip building libhybris and instead run in PLATFORM_SDK</blockquote>
<p>接着把 <a class="reference external" href="https://github.com/mer-hybris/droid-config-sony-nile/tree/master/sparse/usr/libexec/droid-hybris/system/etc/init">https://github.com/mer-hybris/droid-config-sony-nile/tree/master/sparse/usr/libexec/droid-hybris/system/etc/init</a>
复制到汝的 config repo 然后运行:</p>
<div class="highlight"><pre><span class="code-line"><span></span>build_packages.sh -c</span>
</pre></div>
</div>
<div class="section" id="adb-tarball">
<h2><a class="toc-backref" href="#id7">通过 adb 解压 tarball 和刷写内核映像</a></h2>
<p>有时可能用得上?(例如不想整个重新来过的时候)</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># adb push <汝本地的文件路径> <手机的文件路径></span></span>
<span class="code-line">$ adb push your_sailfishos_tarball.tar.gz /sdcard/</span>
<span class="code-line">$ adb push out/target/product/<span class="nv">$DEVICE</span>/hybris-boot.img /sdcard/</span>
<span class="code-line">adb shell</span>
<span class="code-line"><span class="c1"># 如果汝是在 TWRP 里运行的话默认就是 root 了,于是不需要 su 这一步</span></span>
<span class="code-line"><span class="c1"># (但是有可能需要先把 /data 挂载上)</span></span>
<span class="code-line">su</span>
<span class="code-line"><span class="c1"># 解开 tarball</span></span>
<span class="code-line">mkdir -p /data/.stowaways/sailfishos</span>
<span class="code-line">tar --numeric-owner -xvzf /sdcard/our_sailfishos_tarball.tar.gz <span class="se">\</span></span>
<span class="code-line">-C /data/.stowaways/sailfishos</span>
<span class="code-line"><span class="c1"># 汝可能需要自己确定一下汝手机 boot 分区在哪个设备上</span></span>
<span class="code-line">dd <span class="k">if</span><span class="o">=</span>/sdcard/hybris-boot.img <span class="nv">of</span><span class="o">=</span>/dev/block/platform/msm_sdcc.1/by-name/boot</span>
</pre></div>
</div>
<div class="section" id="android-sailfish-os-chroot">
<h2><a class="toc-backref" href="#id8">在 Android 中操作 Sailfish OS 的 chroot</a></h2>
<p>前提是汝的 /data 没有加密(不然是启动不了 Sailfish OS 的)</p>
<div class="highlight"><pre><span class="code-line"><span></span>$ adb shell</span>
<span class="code-line"><span class="c1"># 这里只是表示进了 Android 的 shell 😂</span></span>
<span class="code-line"><span class="o">(</span>android<span class="o">)</span> $ su</span>
<span class="code-line"><span class="c1"># 挂载各种虚拟文件系统</span></span>
<span class="code-line"><span class="o">(</span>android<span class="o">)</span> <span class="c1"># mount -o bind /dev /data/.stowaways/sailfishos/dev</span></span>
<span class="code-line"><span class="o">(</span>android<span class="o">)</span> <span class="c1"># mount -o bind /proc /data/.stowaways/sailfishos/proc</span></span>
<span class="code-line"><span class="o">(</span>android<span class="o">)</span> <span class="c1"># mount -o bind /sys /data/.stowaways/sailfishos/sys</span></span>
<span class="code-line"><span class="c1"># chroot 进去</span></span>
<span class="code-line"><span class="o">(</span>android<span class="o">)</span> <span class="c1"># chroot /data/.stowaways/sailfishos/ /bin/su -</span></span>
<span class="code-line"><span class="c1"># 生成 /etc/resolv.conf ,然后就能用 Android 的网络上网了。</span></span>
<span class="code-line"><span class="o">(</span>sailfish<span class="o">)</span> <span class="c1"># echo "nameserver 8.8.8.8" >/etc/resolv.conf</span></span>
</pre></div>
</div>
啥???三年了????2019-01-10T00:00:00+08:002019-01-10T00:00:00+08:00ホロtag:None,2019-01-10:/life/three_years.html<p>其实还是差几天😂</p>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id5">活动</a></h2>
<ul class="simple">
<li>挖了一些新坑,例如把 Sailfish OS 移植到 Nexus 6
、随便翻译了些文章和软件的文档、和开始写一个连名字和基础发行版都没确定下来的
GNU/Linux 教程 😂</li>
<li>向所谓的垃圾佬(?)迈出了第一步?</li>
<li>自己作出了人生(?)中第一个重要(?)决定。(???)</li>
<li>继续肝音游。(Emmmm</li>
<li>认识了更多的人和地方(也有的地方好久没去过了的样子)</li>
<li>せやなー</li>
</ul>
</div>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id6">问题</a></h2>
<ul>
<li><p class="first">文章的数量在下降?</p>
<blockquote>
<p>也许是因为有不少东西都放到别的地方写了的原因……</p>
</blockquote>
</li>
<li><p class="first">Seyana... Soyana... Sorena... Arena... わかる</p>
</li>
</ul>
</div>
<div class="section" id="id4">
<h2><a class="toc-backref" href="#id7">计划?</a></h2>
<ul class="simple">
<li>当然是填坑啦(虽然很有可能咕咕咕)</li>
<li>一直有想法和友链的各位来一次笔谈呢,就是不知道该怎么开始 😔</li>
<li>知らんけど~ 知らんがな~</li>
</ul>
<hr class="docutils"/>
<p>新年的第一篇文章竟然就是篇水文?</p>
<blockquote>
<p>せーやっ せーやっ せーやっ せーやっ せーやっ せーやっ</p>
<p>な。</p>
</blockquote>
</div>
知识管理 ABC2018-12-28T00:00:00+08:002018-12-28T00:00:00+08:00ホロtag:None,2018-12-28:/life/knowledge_manage_0.html<p>Why, what, how? 😂</p>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id7">所以这是个啥玩意?</a></h2>
<blockquote>
「咱可是贤狼啊。起码还是知道这世界上有很多东西是咱所不了解的。」</blockquote>
<p>知识管理嘛,翻译成英文大概就是 Knowledge Management。汝在 Wikipedia
上大概能找到这样的定义:</p>
<blockquote>
<p>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.</p>
<p>内容管理指的是创建 …</p></blockquote></div><p>Why, what, how? 😂</p>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id7">所以这是个啥玩意?</a></h2>
<blockquote>
「咱可是贤狼啊。起码还是知道这世界上有很多东西是咱所不了解的。」</blockquote>
<p>知识管理嘛,翻译成英文大概就是 Knowledge Management。汝在 Wikipedia
上大概能找到这样的定义:</p>
<blockquote>
<p>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.</p>
<p>内容管理指的是创建、分享、使用和管理知识和组织信息的过程。它指的是运用多种方法
充分利用知识实现有组织的目标的方法。</p>
</blockquote>
<p>是不是很难懂,这么巧咱一向不擅长定义……</p>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id8">那为啥要管理知识呢?</a></h2>
<blockquote>
「有句话是这么说的:『知道方法的人会求得工作,知道这些人为何要工作的人,则会成为雇主』。」</blockquote>
<p>就咱自己的经(che)验(dan)来说呢,构建一个属于自己的知识库大概有这么几个好处:</p>
<ul>
<li><p class="first">节省时间</p>
<p>有很多内容,【不】需要全部都记在脑子里。在信息时代,这么干是不现实滴。
不过虽然汝可能不需要完完全全的记住,但肯定要记住一些关键点。
(例如汝可能不会记住光速的具体数值,但是汝可能会记下需要的时候上网搜索一下就 OK,是呗~)</p>
<p>再进一步,如果汝有一个自己的知识库(暂且这么叫?)的话,汝找到自己需要的知识的速度也会在简单
的搜索网络上更快一级咯(因为搜索范围小了?)</p>
</li>
<li><p class="first">促进系统化</p>
<p>在收集知识构建自己的知识库的过程中,汝也许会发现自己的知识结构有哪些不足之处,说不定会激励汝自己
去学习。</p>
</li>
<li><p class="first">......</p>
</li>
</ul>
<p>嗯上面(和下面)都是咱瞎说的,有什么问题和建议的话记得让咱知道 😂
具体对汝有没有好处的话还需要汝自己尝试一段时间来验证一下。</p>
</div>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id9">实现知识管理面面观</a></h2>
<p>如果要打造一个汝自己的知识库的话,汝可能会考虑下列因素:</p>
<ul class="simple">
<li>反应迅速,可以在汝需要时就立刻准备好。</li>
<li>组织合理,有一套相对合理的组织结构(例如目录一样的树形结构、或者分类标签一类的网状结构)。
日后查找起来也会更得心应手。</li>
<li>(对自己来说)操作简便,有人习惯功能丰富的图形界面,有人习惯简单强大的源代码风格。不过
适合自己的就是最好的啦~</li>
<li>运行灵活,可以在汝的各种设备上(例如手机和电脑等)查阅和修改。</li>
<li>安全可靠,例如可以通过加密保护自己的知识库不被外人查看,支持备份可以防止丢失。</li>
<li>等等……</li>
</ul>
<p>而实现知识库的方法咱认为有很多啦,例如:</p>
<ul class="simple">
<li>文件型,就是简单的文件存储。</li>
<li>笔记型:和传统的笔记本(不是电脑)类似。</li>
<li>维基(Wiki)型,典型的例子就是维基百科。</li>
</ul>
</div>
<div class="section" id="id4">
<h2><a class="toc-backref" href="#id10">实现知识管理之文件型</a></h2>
<p>所谓的文件型,大概就是把汝收集来的各种知识稍微组织一下放在某个存储空间上吧(强行定义)。</p>
<ul class="simple">
<li>因为文件都在本地,所以找起来应该会很快。只是如果要找不同类型的文件的话预览可能会麻烦一些。</li>
<li>至于组织嘛,目录就是天然的树形结构,然而标签那种的网状结构就 emmmm......</li>
<li>至于操作,文件管理器不会用嘛 😂 如果要在各种设备上访问的话,可以找一个都能连上的电脑(例如
一台服务器)?</li>
<li>加密和备份就和普通的文件一样咯 ~</li>
</ul>
</div>
<div class="section" id="id5">
<h2><a class="toc-backref" href="#id11">实现知识管理之笔记型</a></h2>
<p>首先汝来回忆一下笔记本,汝可能有一个或者多个笔记本带在身上,需要的时候就打开对应的笔记本查找内容,
或者再拿出笔来写些什么。</p>
<ul class="simple">
<li>所以博客有时也算笔记的一种?</li>
<li>或者其它的一些专门的笔记软件,例如 Gnote 和 OneNote 等。</li>
<li>基本上笔记本软件都支持多个笔记本和分区功能,有的还提供标签功能,算是提供了两种组织结构吧……</li>
<li>笔记本文件可以单独加密并携带,或是上传到各种云端存储中同步存取。</li>
</ul>
</div>
<div class="section" id="wiki">
<h2><a class="toc-backref" href="#id12">实现知识管理之 Wiki 型</a></h2>
<p>现在用浏览器打开维基百科看看?(虽然 Wiki 并不等于维基百科,但谁让维基百科太著名了呢)</p>
<ul class="simple">
<li>像维基百科使用的 MediaWiki 的分类既支持树形结构(字分类),又可以支持网状结构
(一个条目可以属于多个分类,就像博客软件常用的标签一样)</li>
<li>以及这种 Web 应用只要有一个浏览器就能打开?</li>
<li>加密和备份就是带上 wiki 的文件夹、数据库和 Web 服务器配置咯 ~</li>
</ul>
</div>
<div class="section" id="id6">
<h2><a class="toc-backref" href="#id13">实际上呢?</a></h2>
<p>实际上的话,汝完全可以把一种或者几种方法组合起来用啊。例如心智图作为梗概,笔记或 Wiki 放置文字内容。
然后在汝自己的知识库中放置各种文件。然后可以把它们一起加密起来备份到其他地方。</p>
<p>如果汝有能力而且愿意的话,完全可以自己写一个自己用起来顺手的知识管理系统咯(特别是汝自称是程序猿的话)。
或者自行创造一个新的知识管理流派(大雾)。</p>
<p>然而首先要汝自己肯动手去做才行……以及就算汝有了这些知识,要是不会使用的话…… 那不是百忙活了? 😂</p>
</div>
备份 GNU/Linux 操作系统的经(che)验(dan)合集2018-12-17T00:00:00+08:002018-12-17T00:00:00+08:00ホロtag:None,2018-12-17:/linux/backup_system_0.rst.html<p>备份 GNU/Linux 操作系统的经(che)验(dan)合集</p>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id3">为啥要备份?</a></h2>
<ul>
<li><p class="first">防震减灾(雾),其实就是防止各种意外情况(例如硬盘坏掉,电脑丢失等)发生时手足无措……</p>
<blockquote>
<p>那备份的硬盘也坏了怎么办(先有鸡还是先有蛋?)</p>
</blockquote>
</li>
<li><p class="first">方便迁移(例如买了新电脑的时候)</p>
</li>
<li><p class="first">……</p>
</li>
</ul>
</div>
<div class="section" id="point-0">
<h2><a class="toc-backref" href="#id4">Point 0: 要备份些啥?</a></h2>
<p>一个典型的 GNU/Linux 的根文件系统大概像这个样子:</p>
<div class="highlight"><pre><span class="code-line"><span></span>lrwxrwxrwx 1 root root 7 Aug 21 22:21 bin -> usr/bin</span>
<span class="code-line">drwxr-xr-x 4 root root 16384 Jan 1 1970 boot</span>
<span class="code-line">drwxr-xr-x 22 root …</span></pre></div></div><p>备份 GNU/Linux 操作系统的经(che)验(dan)合集</p>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id3">为啥要备份?</a></h2>
<ul>
<li><p class="first">防震减灾(雾),其实就是防止各种意外情况(例如硬盘坏掉,电脑丢失等)发生时手足无措……</p>
<blockquote>
<p>那备份的硬盘也坏了怎么办(先有鸡还是先有蛋?)</p>
</blockquote>
</li>
<li><p class="first">方便迁移(例如买了新电脑的时候)</p>
</li>
<li><p class="first">……</p>
</li>
</ul>
</div>
<div class="section" id="point-0">
<h2><a class="toc-backref" href="#id4">Point 0: 要备份些啥?</a></h2>
<p>一个典型的 GNU/Linux 的根文件系统大概像这个样子:</p>
<div class="highlight"><pre><span class="code-line"><span></span>lrwxrwxrwx 1 root root 7 Aug 21 22:21 bin -> usr/bin</span>
<span class="code-line">drwxr-xr-x 4 root root 16384 Jan 1 1970 boot</span>
<span class="code-line">drwxr-xr-x 22 root root 3460 Dec 19 11:27 dev</span>
<span class="code-line">drwxr-xr-x 1 root root 3464 Dec 19 14:13 etc</span>
<span class="code-line">drwxr-xr-x 1 root root 8 Dec 19 10:55 home</span>
<span class="code-line">lrwxrwxrwx 1 root root 7 Aug 21 22:21 lib -> usr/lib</span>
<span class="code-line">lrwxrwxrwx 1 root root 7 Aug 21 22:21 lib64 -> usr/lib</span>
<span class="code-line">drwxr-xr-x 1 root root 114 Dec 19 14:19 mnt</span>
<span class="code-line">drwxr-xr-x 1 root root 138 Dec 17 09:19 opt</span>
<span class="code-line">dr-xr-xr-x 298 root root 0 Dec 19 11:26 proc</span>
<span class="code-line">drwxr-x--- 1 root root 212 Dec 19 14:47 root</span>
<span class="code-line">drwxr-xr-x 24 root root 640 Dec 19 14:13 run</span>
<span class="code-line">lrwxrwxrwx 1 root root 7 Aug 21 22:21 sbin -> usr/bin</span>
<span class="code-line">drwxr-xr-x 1 root root 14 Nov 20 23:34 srv</span>
<span class="code-line">dr-xr-xr-x 13 root root 0 Dec 19 11:26 sys</span>
<span class="code-line">drwxrwxrwt 15 root root 1460 Dec 19 14:46 tmp</span>
<span class="code-line">drwxr-xr-x 1 root root 80 Dec 19 14:13 usr</span>
<span class="code-line">drwxr-xr-x 1 root root 116 Dec 19 08:46 var</span>
</pre></div>
<p>熟稔 <a class="reference external" href="https://wiki.linuxfoundation.org/lsb/fhs">FHS</a> 的话应该知道有些目录其实是不在
硬盘上的(例如 /dev , /sys 和 /proc 等等),还有些目录下的文件没什么用(例如 /tmp , /var/tmp 等等)。</p>
<p>那么该备份哪些呢?</p>
</div>
<div class="section" id="point-1-rsync">
<h2><a class="toc-backref" href="#id5">Point 1: rsync</a></h2>
<blockquote>
<p>rsync 是 Unix 下的一款应用软件,它能同步更新两处计算机的文件与目录,
并适当利用差分编码以减少数据传输量。</p>
<p>rsync 中的一项同类软件不常见的重要特性是每个目标的镜像只需发送一次。
rsync 可以拷贝 / 显示目录内容,以及拷贝文件,并可选压缩以及递归拷贝。</p>
</blockquote>
<p>既然备份只是把文件从一个地方复制到另一个地方而已,本来只用 cp 说不定也行。
但是为了省事(例如只复制变化的部分),处理各种状况(例如文件属性和权限),
跨设备和网络复制(例如通过 SSH ),就有了 rsync 咯~</p>
<p>rsync 核心的用法和 cp 几乎一样:</p>
<blockquote>
rsync <source> <target></blockquote>
<p>例如要把 /home 下的内容复制到 /data:</p>
<blockquote>
rsync /home /data</blockquote>
<p>当然为了应对各种情况, rsync 也有不同的参数:</p>
<blockquote>
<ul>
<li><p class="first">--archive / -a :存档模式,等于 -rlptgoD (这些短参数是啥啦……),
会保留文件的大多数属性(例如不会留扩展属性、ACL 和硬链接)和符号链接。</p>
<blockquote>
<p>想要保留扩展属性 / ACL 和硬链接的话,可以分别使用 --xattrs (-X) ,
--acls (-A) 或 --hard-links (-H) 参数。</p>
</blockquote>
</li>
<li><p class="first">--one-file-system:只备份这一个文件系统的内容,于是就不会备份
/sys 啊 /proc 啊 /dev 啊 /tmp 这类目录了,当然如果汝和咱一样 /home
是单独挂载的话也会……</p>
</li>
<li><p class="first">--numeric-ids:把用户名/组名处理成数字而不是实际的名称,跨不同的系统备份时
可能会有用。</p>
</li>
<li><p class="first">--verbose:顾 GNU 参数列表思义的 “罗嗦” 模式,会详细输出正在传送的文件的信息。</p>
</li>
<li><p class="first">--progress:显示一个传送文件的进度显示。</p>
</li>
<li><p class="first">--exclude 和 --exclude-from:指定传送过程中排除哪些文件。 --exclude 用来明确地指出
排除哪些文件, --exclude-from 是一个包含文件名列表的文件。</p>
<blockquote>
<p>当然和 --exclude 相对的自然有 --include 和 --include-from,用法类似。</p>
</blockquote>
</li>
<li><p class="first">--dry-run / -n:模拟运行,防止手抖 😂</p>
</li>
</ul>
</blockquote>
<p>当然 rsync 的参数远不止这些啦,剩下的自己查手册页( man rsync )咯。于是咱自己备份的话通常是这样:</p>
<blockquote>
rsync --archive --acls --xattrs --verbose --progres /source /target</blockquote>
<p>啥,汝问为啥没有 --one-file-system ?那是因为咱一般都会把根分区单独再挂载到别的地方再 rsync。
没有 --exclude 纯粹就是懒了 😂</p>
</div>
<div class="section" id="point-2-btrfs-subvolume">
<h2><a class="toc-backref" href="#id6">Point 2: btrfs 的 subvolume</a></h2>
<p>btrfs 的子卷(subvolume)看起来和普通的目录无异,但是可以通过不同的挂载参数让它作为单独的分区挂载,
例如挂载 /dev/sda2 上的子卷 ./root 到 /mnt :</p>
<blockquote>
<p>当然汝也能在 -o 后面加上别的参数啦,例如 --compress=lzo 启用压缩什么的,记得不同的参数用
逗号分开。</p>
<p># mount -o subvol=root /dev/sda2 /mnt</p>
</blockquote>
<p>要创建一个子卷的话,可以用 btrfs subvolume create 命令:</p>
<blockquote>
# btrfs subvolume create <name_of_your_subvolume></blockquote>
<p>要列出子卷的列表的话,可以用 btrfs subvolume list 命令:</p>
<blockquote>
# btrfs subvolume list <path/to/your/volume></blockquote>
<div class="highlight"><pre><span class="code-line"><span></span>root@yoitsu_optiplex /run/media/horo/External</span>
<span class="code-line"><span class="c1"># btrfs subvolume list . :(</span></span>
<span class="code-line">ID <span class="m">257</span> gen <span class="m">2007</span> top level <span class="m">5</span> path data</span>
<span class="code-line">ID <span class="m">258</span> gen <span class="m">2088</span> top level <span class="m">5</span> path <span class="nb">local</span></span>
<span class="code-line">ID <span class="m">294</span> gen <span class="m">2016</span> top level <span class="m">5</span> path backup</span>
<span class="code-line">ID <span class="m">295</span> gen <span class="m">2012</span> top level <span class="m">294</span> path backup/home_20181031</span>
<span class="code-line">ID <span class="m">328</span> gen <span class="m">2086</span> top level <span class="m">294</span> path backup/parabola_root_20181031</span>
<span class="code-line">ID <span class="m">353</span> gen <span class="m">1998</span> top level <span class="m">294</span> path backup/home_20181215</span>
<span class="code-line">ID <span class="m">360</span> gen <span class="m">2005</span> top level <span class="m">294</span> path backup/parabola_root_20181215</span>
<span class="code-line">ID <span class="m">373</span> gen <span class="m">2086</span> top level <span class="m">294</span> path backup/arch_optiplex</span>
<span class="code-line">ID <span class="m">432</span> gen <span class="m">2089</span> top level <span class="m">5</span> path temp</span>
</pre></div>
<p>建立的子卷可以是某个子卷的快照:</p>
<blockquote>
<p># btrfs subvolume snapshot [-r] <source> <target></p>
<p>-r 参数用来创建只读快照</p>
</blockquote>
<p>可以通过 btrfs send 和 btrfs recieve 在两个 btrfs 卷之间传送子卷(或子卷的快照),不过要是
只读的才行:</p>
<blockquote>
# btrfs send <path/to/your/subvolume> | btrfs recieve <path/to/your/save/place></blockquote>
<p>如果创建快照时忘记设置只读,可以通过 btrfs property 命令设置上(当然也可以取消只读):</p>
<blockquote>
# btrfs property set -ts <path/to/your/subvolume> ro [true|false]</blockquote>
<p>汝也可以传递增量快照,就像这样:</p>
<blockquote>
# btrfs send <path/to/your/subvolume> -p <path/to/your/parent_subvolume> |
btrfs recieve <path/to/your/save/place></blockquote>
<p>不过汝要先把父快照传送到目标才行。</p>
<p>例如建立今天的快照然后以 2018 年 10 月 31 号的快照为基础发送出去:</p>
<blockquote>
<p>date 命令返回今天的日期和时间,也可以指定一个格式字符串来按某个特定的格式输出。</p>
<p>以 $ 包围的命令会以它的结果填充,例如 echo "root_$(date +"%Y%m%d")" 的
结果是 20181219 (咱写完这篇文章的时间,汝自己运行的话结果肯定会和咱有变化)。</p>
<p># btrfs subvolume snapshot -r root root_$(date +"%Y%m%d")</p>
<p># btrfs send root_$(date +"%Y%m%d") -p root_20181031 | btrfs revieve /backup</p>
</blockquote>
</div>
<div class="section" id="point-2-dm-crypt">
<h2><a class="toc-backref" href="#id7">Point 2: 使用 dm-crypt 加密分区</a></h2>
<blockquote>
为啥要加密应该不用再解释了吧,毕竟汝主目录里是不是有不少公开或者隐私的数据是不是?
例如 cookies 和帐号配置啦,邮件啦,和聊天记录等等。</blockquote>
<p>cryptsetup 是操作 dm-crypt 用的前端,可以这样创建一个加密的设备:</p>
<blockquote>
# cryptsetup luksFormat <设备文件的名称></blockquote>
<p>如果需要的话,可以在 luksFormat 之前加上一些选项呐:</p>
<blockquote>
<table border="1" class="stripped docutils highlight black-text white">
<colgroup>
<col width="14%"/>
<col width="18%"/>
<col width="20%"/>
<col width="48%"/>
</colgroup>
<thead valign="bottom">
<tr><th class="head">参数的名称</th>
<th class="head">这啥?</th>
<th class="head">推荐是多少?</th>
<th class="head"><del>一些废话</del></th>
</tr>
</thead>
<tbody valign="top">
<tr><td>--cipher</td>
<td>加密方式</td>
<td>aes-xts-plain64</td>
<td>AES 加密算法搭配 XTS 模式</td>
</tr>
<tr><td>--key-size</td>
<td>密钥长度</td>
<td>512</td>
<td>XTS 模式需要两对密钥,
每个的长度是256</td>
</tr>
<tr><td>--hash</td>
<td>散列算法</td>
<td>sha512</td>
<td> </td>
</tr>
<tr><td>--iter-time</td>
<td>迭代时间</td>
<td>>10000</td>
<td>单位是毫秒。该值越大,暴力破解越难;
但是相应的汝打开加密分区时就要等一下啦~</td>
</tr>
</tbody>
</table>
</blockquote>
<p>例如这样?</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># cryptsetup --cipher aes-xts-plain64 --key-size 512 --hash sha512 --iter-time 10000 luksFormat /dev/nvme0n1p1</span></span>
<span class="code-line"></span>
<span class="code-line">WARNING!</span>
<span class="code-line"><span class="o">========</span></span>
<span class="code-line">这将覆盖 /dev/nvme0n1p1 上的数据,该动作不可取消。</span>
<span class="code-line"></span>
<span class="code-line">Are you sure? <span class="o">(</span>Type uppercase yes<span class="o">)</span>:</span>
<span class="code-line"><span class="c1"># 上面要打大写的 YES</span></span>
<span class="code-line"><span class="c1"># 然后输入两遍加密分区的密码。</span></span>
<span class="code-line">输入密码:</span>
<span class="code-line">确认密码:</span>
</pre></div>
<p>然后等一下就好咯~</p>
<p>然后用 cryptsetup open 打开分区:</p>
<blockquote>
# cryptsetup open <已经加密的设备文件名称> <映射名称></blockquote>
<p>解密的分区会映射到 /dev/mapper/<汝设置的映射名称> 呗~</p>
<p>例如咱解密 /dev/nvme0n1p1 ,然后映射到 /dev/mapper/sysroot :</p>
<blockquote>
# cryptsetup open /dev/nvme0n1p1 sysroot</blockquote>
<p>接下来就像操作普通分区一样操作 /dev/mapper/sysroot 就好啦,例如创建文件系统:</p>
<blockquote>
# mkfs.btrfs /dev/mapper/sysroot</blockquote>
</div>
<hr class="docutils"/>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id8">推荐阅读</a></h2>
<ul class="simple">
<li><a class="reference external" href="https://blog.lilydjwg.me/2013/12/29/rsync-btrfs-dm-crypt-full-backup.42219.html">rsync+btrfs+dm-crypt 备份整个系统 - 依云's Blog</a></li>
<li><a class="reference external" href="https://nova.moe/encrypt-disk-with-luks/">保护数据,用 LUKS 给磁盘全盘加密 | Nova Kwok's Awesome Blog</a></li>
</ul>
</div>
当汝看到加密(encryption)时应该想到什么2018-12-06T00:00:00+08:002018-12-06T00:00:00+08:00ホロtag:None,2018-12-06:/translation/what_should_i_know_about_encryption.html<p>来自 <a class="reference external" href="https://ssd.eff.org/en/module/what-should-i-know-about-encryption">https://ssd.eff.org/en/module/what-should-i-know-about-encryption</a></p>
<blockquote>
这个页面引用了 <a class="reference external" href="https://ssd.eff.org">https://ssd.eff.org</a> 的图片呐,汝可能需要根据情况调整汝浏览器
扩展的设置来查看它们。</blockquote>
<p>汝大概已经从别的地方听说过“加密”这个词了呗,有时还和其他的单词组合在一起。
一般的,加密是指把一段数据转化为除了持有可以用来解密的密钥的人以外无法读取的形式
的一种数学过程。(这啥?)</p>
<p>放眼历史(嗯?)人们一直在用不同的方法加密消息,希望它们不会被除了接收者的其他人读到。
今天,借助计算机的力量,咱们不止可以用加密的方式传送消息。还可以达成其他的目的,例如
验证消息的发送者。</p>
<p>加密是在坏人,政府和服务提供商之间保护自己的信息的最加手段。
而且只要运用得当,几乎可以做到无懈可击(然而往往做不到完美的运用得当啦~)。</p>
<p>这篇指南里咱们会讨论到加密的两种主要应用方式:加密静态数据和流。</p>
<div class="section" id="id1">
<h2>太长不看版小结</h2>
<blockquote>
(来自 <a class="reference external" href="https://twitter.com/sissisiisi/status/1070522944298893312">https://twitter.com/sissisiisi/status/1070522944298893312</a> )</blockquote>
<ol class="arabic">
<li><p class="first">全盘加密要小心冷启动攻击 …</p></li></ol></div><p>来自 <a class="reference external" href="https://ssd.eff.org/en/module/what-should-i-know-about-encryption">https://ssd.eff.org/en/module/what-should-i-know-about-encryption</a></p>
<blockquote>
这个页面引用了 <a class="reference external" href="https://ssd.eff.org">https://ssd.eff.org</a> 的图片呐,汝可能需要根据情况调整汝浏览器
扩展的设置来查看它们。</blockquote>
<p>汝大概已经从别的地方听说过“加密”这个词了呗,有时还和其他的单词组合在一起。
一般的,加密是指把一段数据转化为除了持有可以用来解密的密钥的人以外无法读取的形式
的一种数学过程。(这啥?)</p>
<p>放眼历史(嗯?)人们一直在用不同的方法加密消息,希望它们不会被除了接收者的其他人读到。
今天,借助计算机的力量,咱们不止可以用加密的方式传送消息。还可以达成其他的目的,例如
验证消息的发送者。</p>
<p>加密是在坏人,政府和服务提供商之间保护自己的信息的最加手段。
而且只要运用得当,几乎可以做到无懈可击(然而往往做不到完美的运用得当啦~)。</p>
<p>这篇指南里咱们会讨论到加密的两种主要应用方式:加密静态数据和流。</p>
<div class="section" id="id1">
<h2>太长不看版小结</h2>
<blockquote>
(来自 <a class="reference external" href="https://twitter.com/sissisiisi/status/1070522944298893312">https://twitter.com/sissisiisi/status/1070522944298893312</a> )</blockquote>
<ol class="arabic">
<li><p class="first">全盘加密要小心冷启动攻击(Cold Boot Attack) ,全盘加密但是 RAM 没有加密,
因此解密的 master key 在 RAM 里面是明文出现.解决的办法嘛,用 Tails.
还有别在开机状态下被敌人物理的接触到电脑.</p>
</li>
<li><p class="first">全盘加密的主要作用是为了防止 <strong>有能力物理接触</strong> 你的电脑的人,
比如你的家人,同事,商业间谍,FBI等等</p>
</li>
<li><p class="first">在 <strong>传输加密</strong> 这块,这里要分清楚两个概念: <strong>传输层加密</strong>,**端对端加密**
区别在于中间的服务器能不能看到加密内容</p>
</li>
<li><p class="first"><strong>传输加密</strong> 不能加密元数据(metadata)比如发送端对端的信息的时候,对方的ID,
发送的时间,密文的长度等等</p>
<p>所以高度敏感的人,应该想办法匿名.还有就是网络代理,比如你的敌人主要是本地 ISP 以及政府,
可以想办法比如利用 tor 的加密,然后发送端对端的加密邮件而不是直接发送.
这样本地的 ISP 只会看到链接 tor 的事实,而不会知道你发送了邮件.</p>
</li>
</ol>
</div>
<div class="section" id="id2">
<h2>加密静态数据</h2>
<p><strong>静态数据</strong> 就是存储在各种地方的数据啦。例如汝的电脑、手机、移动硬盘上的那些。
(因为上面的数据不会移动到别的介质上?)</p>
<p><strong>全盘加密</strong> (“full-disk”encryption,有时也被称作“设备加密”)是一种保护
这种静态数据的常见方法。当汝设置完成以后,就要使用密码(或其它的验证手段)解锁
来读取上面的数据。</p>
<img alt="智能手机和笔记本电脑上锁定屏幕的示例" class="materialboxed responsive-img" src="https://ssd.eff.org/files/2018/11/26/2._encryptedlaptop.png"/>
<p>在手机之类的移动设备上,它可能表现的就和普通的锁定屏幕一样。但锁定汝的设备不一定
表示汝启用了全盘加密……</p>
<blockquote>
<p>记得检查汝操作系统中关于加密的设置来确认它有没有启用(因为不是所有的操作系统
在所有的情况下都会启用)。如果汝的设备没有加密的话,只要能解开汝设备上的锁定,
就能拿到上面的数据。</p>
<p>以及有些系统会把明文的数据保存在内存上,虽然内存是只要关机一会儿就会让上面的数据消失
的易失介质,但是高明的攻击者可能会尝试通过
<a class="reference external" href="https://en.wikipedia.org/wiki/Cold_boot_attack">冷启动攻击</a>
获取内存上的数据。</p>
</blockquote>
<p>全盘加密可以保护汝的数据不被能物理接触到汝设备的人获取,例如汝的室友啦、同事和雇员啦、
家人啦、各种官员(不管他们是来自学校政府还是法院)啦等等。对了还有当汝不小心弄丢了它的
时候。</p>
<p>除了全盘加密以外,还有诸如文件加密(加密指定的文件)和分区(磁盘?)加密(加密设备上指定的
一块区域)这样的加密方法。汝当然可以把它们组合起来使用。</p>
<p>除了 Surveillance Self-Defense 以外,汝还可以在其它地方找到各种有关加密设备的指南,不过要记得
检查它们是不是最新的哦~</p>
</div>
<div class="section" id="id4">
<h2>加密传输中的数据</h2>
<img alt="未加密的数据的传输流程" class="materialboxed responsive-img" src="https://ssd.eff.org/files/2018/11/26/noencryptionintransit.jpg"/>
<p>如果数据没有加密的话,把数据送到目标的全过程中间的环节都能看到,例如基站和服务商。</p>
<p><strong>传输中的数据</strong> 是指通过网络从一处移动到另一处的数据。例如即时通讯应用中,汝编写的消息
从汝的设备中到达服务商的服务器再到接收者的设备上。又或者例如浏览网页,网站的服务器把网站
发送到汝的设备上。</p>
<blockquote>
有些流行的应用会提供一些诸如阅后即焚这样的看起来能保护消息的功能。然而只是给汝一种安全的
<em>感觉</em> ,并不会意味着 <em>是</em> 安全的。毕竟传输过程中的设备还是能看到的不是?</blockquote>
<p>有两种方式可以用来加密传输中的数据,传输层加密和端到端加密。验证汝的消息是用哪种方法加密
的和验证汝的消息是否被加密一样重要 😂 。服务提供商支持的加密类型可能
是决定哪些服务适合汝自己的重要因素,是呗~</p>
</div>
<div class="section" id="id5">
<h2>传输层加密</h2>
<img alt="传输层加密的数据的传输流程" class="materialboxed responsive-img" src="https://ssd.eff.org/files/2018/11/26/4.transport-layer-alternate.png"/>
<p>一个传输层加密的例子,左侧的手机加密一条消息并将它发送到服务商的服务器。服务商(能够)解密消息,
再加密、发送到右侧的目标。最后目标手机解密消息。</p>
<p>传输层加密,有时也叫做传输层安全(TLS),保护你的数据不被汝和汝连接到的服务器中间的谁和
汝连接到的服务器到目标之间的谁读取。不过在中间,汝所使用的应用的服务商还是能看到(和保存)汝未加密的
明文消息,于是就有可能因为强制要求或被入侵而泄露……</p>
<div class="section" id="https">
<h3>传输层加密的一个例子:HTTPS</h3>
<img alt="一个显示着 https 网址的地址栏" class="materialboxed responsive-img" src="https://ssd.eff.org/files/2018/11/26/5.httpsbrowser-ssd.png"/>
<p>现在,抬起头来,看看汝浏览器上的地址栏,有没有看到 <cite>https://</cite> 和一个绿色的锁啊 😂
HTTPS 就是传输层加密的一个汝经常能碰到的例子。为啥它比没加密的 HTTP 更安全呢? 因为
它使网络上的窃听者不能看到汝从服务器接收或向服务器发送的数据。</p>
<p>如果有窃听者视图获得用户正在访问的网站的数据,HTTP 连接不能提供保护,但 HTTPS 可以,
甚至能保护汝正在浏览的网站的路径。(例如这个时候窃听者就只能看到汝正在访问 <a class="reference external" href="https://ssd.eff.org">https://ssd.eff.org</a> )</p>
<p>因为 HTTP 的问题太多了(例如可能会被注入、cookie / 用户名和密码被窃取、被针对性审查等等),所以现在
越来越多的网站都开始用 HTTPS 了。我们推荐使用电子前哨基金会制作的
<a class="reference external" href="https://www.eff.org/https-everywhere">HTTPS Everywhere</a> 扩展,它可以在确定一个网站同时支持 HTTP 和
HTTPS 时强制使用 HTTPS 连接。</p>
<blockquote>
不过一个服务商提供了 HTTPS 网站不代表它会保护访问它网站的用户的隐私。例如心术不正的服务商
还是可以通过 cookies 在 HTTPS 网站上追踪用户,或是安装恶意软件。</blockquote>
</div>
<div class="section" id="vpn">
<h3>传输层加密的一个例子:VPN</h3>
<p>VPN(虚拟专用网络)是传输层加密的另一个例子,在使用 VPN 的情况下,汝的网络流量会以加密的形式经过汝的
ISP (互联网服务提供商)到达 VPN 服务商的服务器。如果有人(例如汝的 ISP?)想窃听汝的网络来了解汝访问了
些什么网站的话,它们会发现除了汝在用 VPN 这个事实以外并不会知道更多。</p>
<p>不过虽然使用 VPN 可以让汝对 ISP 隐藏汝的浏览历史,但是这些还是会被汝的 VPN 服务商看到(以及存储或修改,
如果它有这个打算的话)。所以信任汝的 VPN 服务商是一件要事。</p>
<p><a class="reference external" href="https://ssd.eff.org/en/module/choosing-vpn-thats-right-you">SSD 也有一篇关于如何选择 VPN 的文章</a></p>
</div>
</div>
<div class="section" id="id6">
<h2>端到端加密</h2>
<img alt="端到端加密的一个例子" class="materialboxed responsive-img" src="https://ssd.eff.org/files/2018/11/26/6.end-to-end-alternate.png"/>
<p>一个端到端加密的例子,左侧的手机加密一条消息并将它发送到服务商的服务器、再发送到右侧的目标。
最后目标手机解密消息。和传输层加密不同,只有终端(编写和接收消息的手机)持有解密消息的密钥,
因此剩下的地方(不管是基站还是服务商)都无法解密这条消息。</p>
<p>端到端加密在汝的消息从发件人到收件人之间全程保护。它可以保证汝的信息离开汝时会被加密而且只能被
汝的目标解密,包括汝正在使用的应用和中间的窃听者都不行。</p>
<p>汝自己读取端到端加密消息实际上意味着运营汝所使用的应用的公司也不能读取它们。
这是良好加密的核心特征:就算是设计和部署它们的家伙也不能破坏它,是呗。</p>
<p>Surveillance Self-Defense 中的
<a class="reference external" href="https://ssd.eff.org/en/module/communicating-others">Communicating With Others</a>
一节提供了一些支持端到端加密的聊天工具。</p>
</div>
<div class="section" id="id7">
<h2>传输层加密还是端到端加密?</h2>
<p>在汝考虑是选择传输层加密还是端到端加密时的问题只有三个:</p>
<ul class="simple">
<li>汝信任汝正在使用的应用和服务嘛?</li>
<li>汝信任它的基础结构嘛?</li>
<li>(汝正在使用的服务)有没有政策防止执法请求,如果有的话,又是怎样做的?</li>
</ul>
<p>只要汝有一个答案是“不”,那么汝就需要端到端加密,就是这样。</p>
<img alt="利用 OTR 进行端到端加密聊天的动画演示" class="materialboxed responsive-img" src="https://ssd.eff.org/files/2018/11/26/8._otr-client.gif"/>
<p>我们制作了一个动画来演示端到端加密和传输层加密是如何保护汝传输中的消息的。
左侧是一个支持端到端加密(通过不留记录(OTR)实现)的聊天工具,右侧是支持传输层
加密的聊天对话框(Google Hangouts 支持 HTTPS)</p>
<p>在这个 GIF 中,用户首先通过 Google Hangouts 发送了一条消息:</p>
<blockquote>
<p>“Hi! This is not end-to-end encrypted. Google can see our conversation.”</p>
<p>“嗨!这不是端到端加密, Gooole 能看到我们的对话。”</p>
</blockquote>
<p>然后用户通过左侧的窗口启动了 OTR 聊天:</p>
<blockquote>
<p>“Attempting to start a private conversation with [gmail account].
Private conversation with [gmail account] has started.
However, their identity has not been verified.”</p>
<p>“正在尝试和 [gmail account] 进行私密聊天。
和 [gmail account] 的私密聊天已启动,但未验证对方的身份。”</p>
</blockquote>
<p>同时, Google Hangouts 的对话框上出现了一些看起来像胡言乱语一样的消息。
表明了现在的消息都通过端到端加密来传输。</p>
<blockquote>
<p>“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.”</p>
<p>“现在这是个端到端加密的对话了, Google 能看到我们在聊天,却看不到我们到底在聊什么。”</p>
<p>“It looks like gibberish to anyone else.”</p>
<p>“对其他人来说就像胡言乱语一样”</p>
<p>“Yup, it looks like nonsense.”</p>
<p>“嗯,对它们丝毫没有用处。”</p>
<p>😃</p>
</blockquote>
</div>
<div class="section" id="id8">
<h2>加密传输中的数据不能做什么</h2>
<p>加密不是万能药,汝加密的数据最终还是需要被和汝交谈的人解密并读取。
如果汝的目标被攻击(例如被威胁/被收买)或者汝的目标的设备被入侵,
这个加密通讯还是被破坏了。以及他/她/它还是可以通过一些手段(例如屏幕截图)来保存汝等的记录。</p>
<blockquote>
如果汝有把加密的对话备份到其他的地方的话,最好也加密那些备份。</blockquote>
<img alt="消息的元数据不会被加密" class="materialboxed responsive-img" src="https://ssd.eff.org/files/2018/11/26/9._endtoendencryptionmetadata.png"/>
<p>传输中进行加密可以保护汝的消息,却不会加密汝消息的元数据。例如汝和汝的朋友虽然可以通过加密
保护聊天记录,但是加密不会隐藏:</p>
<ul>
<li><p class="first">汝等在通过加密进行交流的事实</p>
</li>
<li><p class="first">和交流有关的其它数据,例如位置,时间和长度。</p>
<blockquote>
<p>如果因为担心加剧的监控(例如主动的监视)而只在敏感时期或特定情况使用加密却会让汝陷入危险之中,
为啥?因为只是一段时间内使用加密的话,就有可能把元数据和一些重要的日期和时间关联起来。</p>
<p>所以就算是普通的日常活动也要记得使用加密来保护自己哦~</p>
</blockquote>
</li>
</ul>
<p>以及要是只有汝自己在使用加密的话,汝所产生的元数据可能会被认为是可疑的(?)。
这就是鼓励大家都尽可能的使用加密工具的原因:为真正需要加密的人泛化加密的使用。</p>
</div>
<div class="section" id="id9">
<h2>放在一起?</h2>
<p>把静态数据和传输中的数据一起加密可以为汝提供更全面的安全性,就是那些信息安全专家所说的
“深度防御”啦~ 通过利用多种方法来保护汝的数据,就可以实现更深层次的保护,是呗。</p>
<p>例如,要是汝通过加密的设备发送未加密的消息(只加密了静态数据),虽然这些消息没有汝设备的密码
就不能在汝的设备上存取,但是政府,服务提供商或高明的攻击者可以在网络上窃听和拦截它们。</p>
<p>反过来说,要是汝没加密的设备发送通过端到端加密的消息(只加密了传输中的数据),虽然消息不会被网络上
的谁窃听和拦截,但是能接触到汝的设备的家伙就能打开汝的设备读取这些消息。</p>
<p>在看完这两个例子以后,汝大概能明白加密传输中的数据和静态数据是保护汝自己免于广泛的潜在风险的理想方法
了吧……</p>
<p>汝想更深入的了解如何使用加密?请继续阅读
<a class="reference external" href="https://ssd.eff.org/en/module/key-concepts-encryption">关于加密的关键概念</a> 。</p>
</div>
在 在 GNU/Linux 的桌面环境中设置自动切换壁纸 (GNOME 篇)2018-11-26T00:00:00+08:002018-11-26T00:00:00+08:00ホロtag:None,2018-11-26:/linux/setting_up_wallpapers.html<p>在 GNU/Linux 的桌面环境中设置壁纸,是怎么样的呢?</p>
<div class="section" id="id1">
<h2>如何设置壁纸?</h2>
<img alt="GNOME Tweaks 设置壁纸" class="materialboxed responsive-img" src="/images/setting_up_wallpaper/tweaks.png"/>
<p>GNOME 的话,可以用 Tweaks 设置。</p>
<blockquote>
汝是不是已经看见了那里设置的壁纸不是图片而是个 XML?😂</blockquote>
<p>或者可以用 <cite>gsettings</cite> 设置:</p>
<blockquote>
gsettings set org.gnome.desktop.background picture-uri '<a class="reference external" href="file:///path/to/my/picture.jpg">file:///path/to/my/picture.jpg</a>'</blockquote>
</div>
<div class="section" id="xml">
<h2>所以那个 XML 是啥?</h2>
<p>打开看一下不就知道了 ?😂</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="nt"><background></span></span>
<span class="code-line"><span class="nt"><starttime></span></span>
<span class="code-line"> <span class="nt"><year></span>2011<span class="nt"></year></span></span>
<span class="code-line"> <span class="nt"><month></span>11<span class="nt"></month></span></span>
<span class="code-line"> <span class="nt"><day></span>24<span class="nt"></day></span></span>
<span class="code-line"> <span class="nt"><hour></span>7<span class="nt"></hour></span></span>
<span class="code-line"> <span class="nt"><minute></span>00<span class="nt"></minute …</span></span></pre></div></div><p>在 GNU/Linux 的桌面环境中设置壁纸,是怎么样的呢?</p>
<div class="section" id="id1">
<h2>如何设置壁纸?</h2>
<img alt="GNOME Tweaks 设置壁纸" class="materialboxed responsive-img" src="/images/setting_up_wallpaper/tweaks.png"/>
<p>GNOME 的话,可以用 Tweaks 设置。</p>
<blockquote>
汝是不是已经看见了那里设置的壁纸不是图片而是个 XML?😂</blockquote>
<p>或者可以用 <cite>gsettings</cite> 设置:</p>
<blockquote>
gsettings set org.gnome.desktop.background picture-uri '<a class="reference external" href="file:///path/to/my/picture.jpg">file:///path/to/my/picture.jpg</a>'</blockquote>
</div>
<div class="section" id="xml">
<h2>所以那个 XML 是啥?</h2>
<p>打开看一下不就知道了 ?😂</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="nt"><background></span></span>
<span class="code-line"><span class="nt"><starttime></span></span>
<span class="code-line"> <span class="nt"><year></span>2011<span class="nt"></year></span></span>
<span class="code-line"> <span class="nt"><month></span>11<span class="nt"></month></span></span>
<span class="code-line"> <span class="nt"><day></span>24<span class="nt"></day></span></span>
<span class="code-line"> <span class="nt"><hour></span>7<span class="nt"></hour></span></span>
<span class="code-line"> <span class="nt"><minute></span>00<span class="nt"></minute></span></span>
<span class="code-line"> <span class="nt"><second></span>00<span class="nt"></second></span></span>
<span class="code-line"><span class="nt"></starttime></span></span>
<span class="code-line"></span>
<span class="code-line"><span class="c"><!-- This animation will start at 7 AM. --></span></span>
<span class="code-line"></span>
<span class="code-line"><span class="c"><!-- We start with sunrise at 7 AM. It will remain up for 1 hour. --></span></span>
<span class="code-line"><span class="nt"><static></span></span>
<span class="code-line"><span class="nt"><duration></span>3600.0<span class="nt"></duration></span></span>
<span class="code-line"><span class="nt"><file></span>/usr/share/backgrounds/gnome/adwaita-morning.jpg<span class="nt"></file></span></span>
<span class="code-line"><span class="nt"></static></span></span>
<span class="code-line"></span>
<span class="code-line"><span class="c"><!-- Sunrise starts to transition to day at 8 AM. The transition lasts for 5 hours, ending at 1 PM. --></span></span>
<span class="code-line"><span class="nt"><transition</span> <span class="na">type=</span><span class="s">"overlay"</span><span class="nt">></span></span>
<span class="code-line"><span class="nt"><duration></span>18000.0<span class="nt"></duration></span></span>
<span class="code-line"><span class="nt"><from></span>/usr/share/backgrounds/gnome/adwaita-morning.jpg<span class="nt"></from></span></span>
<span class="code-line"><span class="nt"><to></span>/usr/share/backgrounds/gnome/adwaita-day.jpg<span class="nt"></to></span></span>
<span class="code-line"><span class="nt"></transition></span></span>
<span class="code-line"></span>
<span class="code-line"><span class="c"><!-- It's 1 PM, we're showing the day image in full force now, for 5 hours ending at 6 PM. --></span></span>
<span class="code-line"><span class="nt"><static></span></span>
<span class="code-line"><span class="nt"><duration></span>18000.0<span class="nt"></duration></span></span>
<span class="code-line"><span class="nt"><file></span>/usr/share/backgrounds/gnome/adwaita-day.jpg<span class="nt"></file></span></span>
<span class="code-line"><span class="nt"></static></span></span>
<span class="code-line"></span>
<span class="code-line"><span class="c"><!-- It's 7 PM and it's going to start to get darker. This will transition for 6 hours up until midnight. --></span></span>
<span class="code-line"><span class="nt"><transition</span> <span class="na">type=</span><span class="s">"overlay"</span><span class="nt">></span></span>
<span class="code-line"><span class="nt"><duration></span>21600.0<span class="nt"></duration></span></span>
<span class="code-line"><span class="nt"><from></span>/usr/share/backgrounds/gnome/adwaita-day.jpg<span class="nt"></from></span></span>
<span class="code-line"><span class="nt"><to></span>/usr/share/backgrounds/gnome/adwaita-night.jpg<span class="nt"></to></span></span>
<span class="code-line"><span class="nt"></transition></span></span>
<span class="code-line"></span>
<span class="code-line"><span class="c"><!-- It's midnight. It'll stay dark for 5 hours up until 5 AM. --></span></span>
<span class="code-line"><span class="nt"><static></span></span>
<span class="code-line"><span class="nt"><duration></span>18000.0<span class="nt"></duration></span></span>
<span class="code-line"><span class="nt"><file></span>/usr/share/backgrounds/gnome/adwaita-night.jpg<span class="nt"></file></span></span>
<span class="code-line"><span class="nt"></static></span></span>
<span class="code-line"></span>
<span class="code-line"><span class="c"><!-- It's 5 AM. We'll start transitioning to sunrise for 2 hours up until 7 AM. --></span></span>
<span class="code-line"><span class="nt"><transition</span> <span class="na">type=</span><span class="s">"overlay"</span><span class="nt">></span></span>
<span class="code-line"><span class="nt"><duration></span>7200.0<span class="nt"></duration></span></span>
<span class="code-line"><span class="nt"><from></span>/usr/share/backgrounds/gnome/adwaita-night.jpg<span class="nt"></from></span></span>
<span class="code-line"><span class="nt"><to></span>/usr/share/backgrounds/gnome/adwaita-morning.jpg<span class="nt"></to></span></span>
<span class="code-line"><span class="nt"></transition></span></span>
<span class="code-line"><span class="nt"></background></span></span>
</pre></div>
<p><del>这文件看起来好简单啊咱就不加注释了……</del></p>
<p>于是汝就能自己写一个脚本来生成这样的 XML (例如 <a class="reference external" href="https://pastebin.com/019G2rCy">https://pastebin.com/019G2rCy</a> )</p>
<p>如果想更懒一些的话可以试试 Shotwell (选择想要的图片然后 File → Set as Desktop Slideshow)</p>
<p>是不是很简单鸭 😂</p>
</div>
<div class="section" id="gnome">
<h2>不是 GNOME ?</h2>
<p>KDE Plasma 的话可以参考兔兔的
<a class="reference external" href="https://blog.brucezhang.cf/2018/12/07/kde-dynamic-wallpaper.html">[Linux/KDE] 一步步教你给 KDE 用上 macOS 专属动态壁纸</a></p>
<p>虽然例子是 macOS 的那个沙漠,但是汝自己可以用别的啊 😂</p>
<p>其它桌面可以参考布偶君的
<a class="reference external" href="https://shadowrz.github.io/posts.d/2018/12/01/dynamic-wallpaper.html">在 GNU/Linux 的桌面环境中设置自动切换壁纸</a></p>
</div>
利用 XMPP 和 OTR 进行私密聊天2018-10-09T00:00:00+08:002018-10-09T00:00:00+08:00ホロtag:None,2018-10-09:/tech_misc/using_xmpp_and_otr_for_secret_chats.html
<p>基本上就是某篇文章的翻版……</p>
<p><a class="reference external" href="https://hardenedlinux.github.io/cryptography/2018/02/01/pidgin_xmpp_otr_debian.html">https://hardenedlinux.github.io/cryptography/2018/02/01/pidgin_xmpp_otr_debian.html</a></p>
<p>关于 OTR 的原理啥的因为咱不懂,于是就接着抛这同一块砖引不同的玉了 😂</p>
<blockquote>
以及数了数发现文章数量年趋下降?(可能是因为不少东西开始往别的地方写了的缘故)</blockquote>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id8">演示环境</a></h2>
<p>PC :Parabola GNU/Linux Libre</p>
<blockquote>
其实有 Pidgin 用的发行版就 OK 😂 ,安装 pidgin,
pidgin-otr 和 pidgin-xmpp-receipts 软件包(可能随发行版不同而不同)</blockquote>
<p>Android:Xabber</p>
<blockquote>
虽然 Conversations 也支持但是只有 Conversations 侧发起 OTR 会话才能用,好迷 😂</blockquote>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id9">启动加密</a></h2>
<p>从工具 - 插件中启用 OTR:</p>
<img alt="Pidgin 通过插件可以支持 OTR" class="materialboxed responsive-img" src="/images/XMPP/pidgin_load_plugin.png"/>
<p>然后就可以在会话中发现 OTR …</p></div>
<p>基本上就是某篇文章的翻版……</p>
<p><a class="reference external" href="https://hardenedlinux.github.io/cryptography/2018/02/01/pidgin_xmpp_otr_debian.html">https://hardenedlinux.github.io/cryptography/2018/02/01/pidgin_xmpp_otr_debian.html</a></p>
<p>关于 OTR 的原理啥的因为咱不懂,于是就接着抛这同一块砖引不同的玉了 😂</p>
<blockquote>
以及数了数发现文章数量年趋下降?(可能是因为不少东西开始往别的地方写了的缘故)</blockquote>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id8">演示环境</a></h2>
<p>PC :Parabola GNU/Linux Libre</p>
<blockquote>
其实有 Pidgin 用的发行版就 OK 😂 ,安装 pidgin,
pidgin-otr 和 pidgin-xmpp-receipts 软件包(可能随发行版不同而不同)</blockquote>
<p>Android:Xabber</p>
<blockquote>
虽然 Conversations 也支持但是只有 Conversations 侧发起 OTR 会话才能用,好迷 😂</blockquote>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id9">启动加密</a></h2>
<p>从工具 - 插件中启用 OTR:</p>
<img alt="Pidgin 通过插件可以支持 OTR" class="materialboxed responsive-img" src="/images/XMPP/pidgin_load_plugin.png"/>
<p>然后就可以在会话中发现 OTR 菜单。</p>
<img alt="Pidgin 会话中的 OTR 菜单" class="materialboxed responsive-img" src="/images/XMPP/pidgin_otr_menu.png"/>
<img alt="OTR 会话已启动" class="materialboxed responsive-img" src="/images/XMPP/pidgin_otr_session.png"/>
<p>启动以后的 OTR 会话大概就是这个样子。</p>
<p>如果汝眼睛注意到的话,会发现菜单栏上的图标上有个感叹号,以及下面会提示未验证(Unverified)。
这个问题一会儿再解决 😂</p>
<p>Xabber 的话,点击下方锁形图标里的“启动加密”。</p>
<img alt="在 Xabber 中启动 OTR" class="materialboxed responsive-img" src="/images/XMPP/xabber_start_otr.png"/>
<p>加密连接建立成功后,锁会闭合。不过里面有个问号表示 OTR 指纹未验证。</p>
<img alt="在 Xabber 中启动 OTR" class="materialboxed responsive-img" src="/images/XMPP/xabber_otr.png"/>
</div>
<div class="section" id="otr">
<h2><a class="toc-backref" href="#id10">验证 OTR 指纹 - 概述</a></h2>
<p>为啥要验证 OTR 指纹呢,因为汝不能确定汝收到的指纹对应的私钥的持有者和
汝收到的消息的发送者是不是同一个人嘛 😂 (毕竟大部分 XMPP 服务器只通过用户名
和密码进行认证,密码强度不够的话还是很容易被盗用的)</p>
<p>而验证显然不能通过刚建立的 OTR 会话来完成验证(先有鸡还是先有蛋?),所以需要借助一些外部手段完成验证啦~</p>
<img alt="Pidgin 中支持的验证方式" class="materialboxed responsive-img" src="/images/XMPP/pidgin_otr_verification.png"/>
<p>Pidgin 和 Xabber 支持 OTR 标准的三种验证途径(这个菜单可以从 OTR - Authenticate buddy 中打开):</p>
<ul class="simple">
<li>通过指纹手动验证。</li>
<li>通过共享的秘密进行验证</li>
<li>通过问答进行验证</li>
</ul>
</div>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id11">手动验证</a></h2>
<p>手动验证是最简单的方式,画面中会展示汝和对方的 OTR 指纹,在确认两边显示的指纹相同时,
汝可以标记为该指纹已通过验证。</p>
<img alt="Pidgin 中的 指纹验证" class="materialboxed responsive-img" src="/images/XMPP/pidgin_fingerprints.png"/>
<ul class="simple">
<li>因为要求通过另一个安全的信道交换指纹,所以能够当面验证当然是最好的啦,毕竟不会受到其它因素干扰。</li>
<li>如果做不到的话,就看汝自己的需求和安全性要求啦,例如通过电话和加密的邮件也是种选择</li>
</ul>
<p>通过验证以后 Pidgin 会提示“私密对话已建立”,而 Xabber 中锁形标志中间会变成对勾表示验证完毕。</p>
</div>
<div class="section" id="id4">
<h2><a class="toc-backref" href="#id12">通过共享的秘密/提问和回答进行验证</a></h2>
<img alt="Pidgin 中通过共享的秘密验证" class="materialboxed responsive-img" src="/images/XMPP/pidgin_share_secrets.png"/>
<img alt="Pidgin 中通过问题验证" class="materialboxed responsive-img" src="/images/XMPP/pidgin_question.png"/>
<p>共享的秘密和提问验证的核心是,汝和朋友拥有相同的秘密,如果对方能回答出和这个秘密
有关的问题,那么对方很有可能就是和汝拥有相同秘密的那位朋友啦~</p>
<p>不过,这个验证的过程中双方不会看到对方的输入,只是如果双方的输入相同(共享的秘密)或者
对方的答案和汝设置的答案是相同的(提问和回答),双方的指纹就会标记成已信任。</p>
<p>其实这个方法并没有直接验证指纹来的实用……</p>
</div>
<div class="section" id="id5">
<h2><a class="toc-backref" href="#id13">多份指纹或者指纹发生了改变?</a></h2>
<p>如果汝在多个设备上登录了一个 XMPP 账户,那汝就会有多个 OTR 指纹,重新登录也会使 OTR
指纹发生变化,汝的朋友也是如此。</p>
<p>如果汝在一开始只验证了部分指纹,而对方开始用新设备和汝进行 OTR 聊天时,汝会重新发现
验证提示的。</p>
<p>这时汝可以像以前一样进行验证,或者要求对方通过已经验证的实例把新设备的 OTR 指纹给汝发送一份,例如:</p>
<blockquote>
“汝今天这设备上的 OTR 指纹咱好像不认识啊,方便用咱俩
验证过的那部设备把这个设备上的 OTR 指纹发给咱嘛?”</blockquote>
<p>如果汝双方有验证过 openPGP 密钥的话,也可以让对方用汝认识的密钥签名他的 OTR 指纹后把签名后的消息
发给汝,作用是相同的。</p>
<p>不过实际操作时要注意,记得是让对方把指纹发给汝,而不是把汝要验证的指纹发给对方。</p>
</div>
<div class="section" id="id6">
<h2><a class="toc-backref" href="#id14">准备一份指纹清单</a></h2>
<p>如果汝日常会在好几部设备上使用 XMPP ,可以考虑整理一份指纹清单,在第一次验证时就让
汝的好友把汝现有的指纹验证完毕。</p>
<p>消息的主题大概像这样:</p>
<div class="highlight"><pre><span class="code-line"><span></span>I hereby claim:</span>
<span class="code-line"></span>
<span class="code-line">* I am bob, who owns the following PGP key(s):</span>
<span class="code-line"></span>
<span class="code-line"> 6B25C1C7 7E739D1B 6C5E86B0 D3CED892 A6AEB68B</span>
<span class="code-line"></span>
<span class="code-line">* At the same time, I am the owner of the following OTR key(s):</span>
<span class="code-line"></span>
<span class="code-line"> 3340D56D 2C750734 F9869A1B 26CFAC08 04823F52</span>
<span class="code-line"> 1063A0B9 F9EE4D3B 06250142 2A720531 DD2D0DC4</span>
<span class="code-line"></span>
<span class="code-line">* The following OTR key(s) are used for mobile phone,</span>
<span class="code-line"> they may get revoked at any time.</span>
<span class="code-line"></span>
<span class="code-line"> 49AF52C4 53FF6323 635728B6 9325628C 0FF2E547</span>
<span class="code-line"></span>
<span class="code-line">* And I declare revocation of the following OTR key(s), their</span>
<span class="code-line"> private keys are destroyed, please don't trust them:</span>
<span class="code-line"></span>
<span class="code-line"> 8DF79391 B8082682 42D5483E 976503B8 E458AEA8</span>
<span class="code-line"></span>
<span class="code-line">* To prove the claims above, this message is signed by my PGP key</span>
<span class="code-line"> mentioned above.</span>
<span class="code-line"></span>
<span class="code-line">You could also collect all fingerprints linked to your frequently</span>
<span class="code-line">used xmpp accounts into a list like this, clear-sign it with gnupg,</span>
<span class="code-line">and send it to your trustful friends, in order for them to trust you.</span>
</pre></div>
<p>然后把这则消息通过 gpg 进行明文签名,效果大概像这样(下面这条消息也是咱的指纹清单):</p>
<div class="highlight"><pre><span class="code-line"><span></span>-----BEGIN PGP SIGNED MESSAGE-----</span>
<span class="code-line">Hash: SHA256</span>
<span class="code-line"></span>
<span class="code-line">I hereby claim:</span>
<span class="code-line"></span>
<span class="code-line"> * I am KenOokamiHoro, who owns the following PGP key(s):</span>
<span class="code-line"></span>
<span class="code-line"> C41D545A 576AC1FE 4DBE90C9 B6CF41D1 879E8002</span>
<span class="code-line"></span>
<span class="code-line"> * At the same time, I am the owner of the following OTR key(s):</span>
<span class="code-line"></span>
<span class="code-line"> B9A0DE73 1F9689D7 856F1C40 41C6D1D0 059A2E70</span>
<span class="code-line"> EC63BC9D FAFC37FA C4331842 1357CCF6 D67961F9</span>
<span class="code-line"></span>
<span class="code-line"> * The following OTR key(s) are used for less stable mobile devices,</span>
<span class="code-line"> they may get revoked at any time.</span>
<span class="code-line"></span>
<span class="code-line"> 49AF52C4 53FF6323 635728B6 9325628C 0FF2E547</span>
<span class="code-line"> EFEBAF65 78722ED3 3FB5A8C5 B20B4B14 2A20F48E</span>
<span class="code-line"></span>
<span class="code-line"> * To prove the claims above, this message is signed by my PGP key</span>
<span class="code-line"> mentioned above.</span>
<span class="code-line"></span>
<span class="code-line">You could also collect all fingerprints linked to your frequently</span>
<span class="code-line">used xmpp accounts into a list like this, clear-sign it with gnupg,</span>
<span class="code-line">and send it to your trustful friends, in order for them to trust you.</span>
<span class="code-line">-----BEGIN PGP SIGNATURE-----</span>
<span class="code-line"></span>
<span class="code-line">iHUEARYIAB0WIQQjv2kr4UE70DFaNrtMlLVI0dRI/gUCW6n1sQAKCRBMlLVI0dRI</span>
<span class="code-line">/n5PAQDobS25Xn06yBI+HhOQpi97J9JZuyvPOGbc6L8bm0t/1AD/Ye4xvA9+9NPt</span>
<span class="code-line">zh9i9QVrupW3FvINUd8q/M9Y1wqOsQI=</span>
<span class="code-line">=knz+</span>
<span class="code-line">-----END PGP SIGNATURE-----</span>
</pre></div>
<p>有一个问题是某些客户端会对消息排版(如 Pidgin 会用 html 排版),而这会破坏 clear-sign 的一致性。
一个有效的解决方法是用gpg --store -a将 clear-sign 的文本编码成不怕排版的 radix-64 形式,
用gpg -d即可还原。该命令默认会对输入作透明的压缩,故比压缩再 base64 的“传统”做法操作更简便。</p>
<p>就像这样:</p>
<div class="highlight"><pre><span class="code-line"><span></span>-----BEGIN PGP MESSAGE-----</span>
<span class="code-line"></span>
<span class="code-line">owF1U0uS2zYQ9Zqn6GWSkS1+QcJVXoAfSLQ9+o48GXtFSZCEiCQ0ACmZvltOkE3O</span>
<span class="code-line">kVOkRdmpisvmAkR14/V7rxv465/1i09//v3i5fWLs1E+gdloBst8NMlSuM+WSzbK</span>
<span class="code-line">+qQ1LszhNSzHzA2IZeVwEFqsO9iUhaxeWxbAb5BDUcE7UU/VsajkWGk1gMtBgbrU</span>
<span class="code-line">BpqDgJ0qS3WR9b5nOYruF/NrjwVIfCcN/IBBEBKWODwDP40zaicUYpJwzDoQhTSL</span>
<span class="code-line">bNu9sbGmr2mKSkAjKzG48V9jSCg0qN13pNOHxf9JY8rsNAs9cDglEU1DiALCncS3</span>
<span class="code-line">wXcSkjqpDXZAmZuFdg/IEuLFCU2BM554IWeo2/OcyHfB8YIwSTiBlISUYMGbyoef</span>
<span class="code-line">KIBCC2iN2GJWQymMAdMU61JApdYSf1txlhthBj0v+uigKjrYiwa0OKsjAosGirrr</span>
<span class="code-line">vb+6+fEp44Gb+BB4nBPP9YCgKjeKCVAP5+ZGCdicu1nghzc/PIsZJwGEUei6WeqB</span>
<span class="code-line">x+OARUkAsWvHfuz44DLX5n6UffWj4KTVWfSt7YdvoFhjYIARaaBCJ8VeAG6N3Nco</span>
<span class="code-line">Ey9J1X0beM9aibqR6prrkSj+SbWwUW2JkdIo3Jal2KC9soQd9k3ok5Z1Y6CU9dV5</span>
<span class="code-line">o6BTrYadFs8tFis7q2/l5+p0gmKDla6HEaGgQIxpcDmKXuAARYtCv7yKA9nARTYH</span>
<span class="code-line">2NftaT+winoLRuCC8W8UjW5Ns2tRh5aYQrysQekt3q/r4LAL1fVsf+yKeGX94C2x</span>
<span class="code-line">h9Xi6zOy5HiVscVTzmL7MZ/P/zi7R+2v8IKlvJjo5r58/yG3t4t8uF8lj6R2zJy9</span>
<span class="code-line">Sxbxf3FrWAczNk/VeukGv9c26eL8bnyYzk+Shm/p249td55NR+sNeR+tK7sZOiwd</span>
<span class="code-line">Pgn/85nROzqZNdaXA5V0/kG3p0ePk3M+WW2j5+E9fXIuz1Mzz99Yb471l7ubkWyS</span>
<span class="code-line">/sjGvw==</span>
<span class="code-line">=jMb7</span>
<span class="code-line">-----END PGP MESSAGE-----</span>
</pre></div>
<p>如果使用这个方法的话,就算现在建立的 OTR 通道没被信任也不要紧(如果汝信任对方的 PGP 密钥的话)</p>
</div>
<div class="section" id="id7">
<h2><a class="toc-backref" href="#id15">组合验证</a></h2>
<p>这好几种方法其实是可以组合在一起的:</p>
<ul>
<li><p class="first">如果正好遇上了或者约定好了要见面(例如参加 PGP Signing Party时),可以顺便完成验证指纹。</p>
<blockquote>
<p>不过根据汝的威胁模型,可能要加入窃听者的威胁。</p>
</blockquote>
</li>
<li><p class="first">如果汝或者汝信任的第三方信任对方的 PGP 公钥,可以用 PGP 完成指纹验证呗~</p>
</li>
<li><p class="first">如果安全要求稍低的话,可以使用电话,短信或者其它 IM 完成(例如 Wire 或 Signal?)</p>
</li>
<li><p class="first">可以的话也可以继续拆分多通道信息交换,通过多个通道获得的信息的组合组成最终的共享秘密。
不过需要注意尽量不要在某一通道内提到通过其他通道交换的消息的内容。</p>
</li>
</ul>
</div>
扫盲 XMPP(Jabber) - 一个自由开放的即时消息协议2018-09-28T00:00:00+08:002018-09-28T00:00:00+08:00ホロtag:None,2018-09-28:/tech_misc/using_xmpp_for_chats.html
<p>这标题的命名方式哪里眼熟……</p>
<p>想和谁在网上聊天的话,可以用的 IM 软件有不少,当然槽点也很多(这家伙要求真多.png):</p>
<ul class="simple">
<li>WhatsApp , Line 之流: 从客户端到协议都是私有的,以及似乎有向审查屈服的倾向?</li>
<li>Telegram ,服务端是私有的,官方客户端的源代码经常咕咕咕……</li>
<li>Signal 和 Wire ,虽然服务端和客户端都是自由的,但是有人成功运行起来自己的服务端嘛 🤔</li>
</ul>
<p>……</p>
<p>于是是时候试试看 XMPP 啦(编不下去了.webp.png 😂)</p>
<div class="section" id="xmpp">
<h2><a class="toc-backref" href="#id11">XMPP 是啥?</a></h2>
<p>可扩展消息与存在协议(XMPP,全称为Extensible Messaging and Presence Protocol,前称Jabber)
是一种以XML为基础的开放式即时通信协议,是经由互联网工程工作小组(IETF)通过的互联网标准。</p>
<p>Jabber是一个开放源代码形式组织产生的网络即时通信协议。XMPP原本是为即时通讯而量身定制,
但由于XML Stanza本身是XML元素,在基于XML灵活发展的特性下,使得XMPP也可以适用其他方面,
已经得到了IETF的批准。XMPP与IMPP、PRIM …</p></div>
<p>这标题的命名方式哪里眼熟……</p>
<p>想和谁在网上聊天的话,可以用的 IM 软件有不少,当然槽点也很多(这家伙要求真多.png):</p>
<ul class="simple">
<li>WhatsApp , Line 之流: 从客户端到协议都是私有的,以及似乎有向审查屈服的倾向?</li>
<li>Telegram ,服务端是私有的,官方客户端的源代码经常咕咕咕……</li>
<li>Signal 和 Wire ,虽然服务端和客户端都是自由的,但是有人成功运行起来自己的服务端嘛 🤔</li>
</ul>
<p>……</p>
<p>于是是时候试试看 XMPP 啦(编不下去了.webp.png 😂)</p>
<div class="section" id="xmpp">
<h2><a class="toc-backref" href="#id11">XMPP 是啥?</a></h2>
<p>可扩展消息与存在协议(XMPP,全称为Extensible Messaging and Presence Protocol,前称Jabber)
是一种以XML为基础的开放式即时通信协议,是经由互联网工程工作小组(IETF)通过的互联网标准。</p>
<p>Jabber是一个开放源代码形式组织产生的网络即时通信协议。XMPP原本是为即时通讯而量身定制,
但由于XML Stanza本身是XML元素,在基于XML灵活发展的特性下,使得XMPP也可以适用其他方面,
已经得到了IETF的批准。XMPP与IMPP、PRIM、SIP(SIMPLE)合称四大IM协议主流,在此4大协议中,XMPP是最灵活的。</p>
<p>(从维基百科抄的(雾))</p>
<p>有不少聊天软件是 XMPP 的实现,例如 Google Talk 和 Facebook Messenger,以及 AOL 和 一些网络游戏的聊天等。</p>
<p>因为传送的是 XML 嘛,所以 XMPP 协议本身十分灵活,不过传送二进制文件来就稍微有些困难了(不过有不同的扩展
可以提供文件上传等功能)。</p>
<p>和电子邮件一样, XMPP 也是非中心化的协议,可以均衡负载和对抗封锁。当然有可以多处登录啦, XMPP 通过优先级来
区分不同的设备,优先级高的设备会收到相应的消息(有人认为这是个缺点,于是有了 MAM 在不同的设备间同步消息)。</p>
<p>XMPP/Jabber实现多人聊天(MUC,Multiply User Chat)是采用聊天室的方式实现的,形如 <a class="reference external" href="mailto:room@domain.tld">room@domain.tld</a> 的形式,
用户可以添加这个聊天室进行群聊,不过介于不少客户端不支持群聊加密,于是 XMPP 更多的还是以私聊为主。</p>
</div>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id12">注册一个 XMPP/Jabber 帐号</a></h2>
<p>因为 XMPP 是个自由开放的协议啦,所以网上有很多公开的 XMPP 服务,
<a class="reference external" href="https://www.jabberes.org/servers/servers_by_proxy_bytestreams.html">这里</a> 有一个大而全的列表。
但是如果汝只是想找个速度合适的服务器的话,BLUG 整理出了一个
<a class="reference external" href="https://beijinglug.club/wiki/doku.php?id=projects:xmpp">经过测试的部分 XMPP 服务器清单</a> 。</p>
<p>可以看到大多数的 XMPP 服务器对注册没有任何要求,只需要汝选择一个 Jabber ID 然后输入密码就 OK 啦,
当然这么做的后果之一就是忘记密码就不能找回了,所以创建一个强密码并记住它特别重要。</p>
<p>除了在网页上注册以外,不少服务器也支持在客户端上注册,所以……</p>
</div>
<div class="section" id="id4">
<h2><a class="toc-backref" href="#id13">安装一个 XMPP 客户端</a></h2>
<p>不同平台上可以推荐的客户端有很多:</p>
<ul class="simple">
<li>比如跨平台的 Pidgin (顺便还可以跨协议,但是 Pidgin 支持 XMPP 是挺优秀的)。 Windows
可以从 <a class="reference external" href="https://pidgin.im/download/">https://pidgin.im/download/</a> 下载安装包,GNU/Linux 可以从包管理器安装,或者下载源代码编译</li>
<li>macOS 用户可以安装 Adium,可以从 <a class="reference external" href="https://adium.im">https://adium.im</a> 下载。</li>
<li>iOS 用户推荐 ChatSecure,可以从 App Store 下载安装。</li>
<li>Android 用户推荐 <a class="reference external" href="https://f-droid.org/en/packages/com.xabber.androiddev/">Xabber</a> 和
<a class="reference external" href="https://f-droid.org/en/packages/eu.siacs.conversations/">Conversations</a> 前者支持 XMPP 中常用的 OTR 端到端加密,
后者支持 MUC 和新的 OMEMO 和 openPGP 加密。</li>
</ul>
<p>每一个 XMPP 客户端的登录和注册方法都不尽相同,但都比较简单。这里就偷个懒不指导啦 😂</p>
</div>
<div class="section" id="id5">
<h2><a class="toc-backref" href="#id14">和好友聊天或进行群聊</a></h2>
<p>添加汝好友或群聊的 Jabber ID 就 OK 啦~</p>
<img alt="大概长这样" class="materialboxed responsive-img" src="/images/XMPP/buddies.png"/>
</div>
<div class="section" id="id6">
<h2><a class="toc-backref" href="#id15">加密聊天</a></h2>
<blockquote>
主要说的是端到端加密,毕竟 8102 年了,传输加密已经是刚需了吧 😂</blockquote>
<p>目前 XMPP 中常用的端到端加密方式有三种 ,都是通过非对称加密实现的:</p>
<ul class="simple">
<li><a class="reference external" href="https://otr.cypherpunks.ca/">OTR(Off-the-Record Messaging,不留记录即时通讯)</a> 是
XMPP 中最常用的端到端加密方式,被大多数客户端所支持。加密迅速而且前向安全。
缺点是更换客户端或重新登录时 OTR 指纹会发生变化,
可能会无法保证消息身份的一致性而需要重新验证。以及对文件的加密尚未标准化(不同客户端加密的文件
可能无法相互存取,因此习惯是发送文件的链接),另外称为下一代 OTR 的 <a class="reference external" href="https://github.com/otrv4/otrv4">OTRv4</a> 正在开发中。</li>
</ul>
<img alt="Pidgin 通过插件可以支持 OTR" class="materialboxed responsive-img" src="/images/XMPP/pidgin_otr.png"/>
<p>Pidgin 通过插件可以支持 OTR,上面介绍的客户端中除了 Conversations 都支持 OTR。</p>
<ul class="simple">
<li><a class="reference external" href="https://conversations.im/omemo/">OMEMO(OMEMO Multi-End Message and Object Encryption,OMEMO 多终端消息和对象加密)</a> 是
一种新型的端到端加密协议,可以跨设备同步加密的消息记录和文件,验证起来也比较简单( <del>因为都盲目信任了?</del> )。
不过除了 Conversations 以外好像都没支持好的样子……</li>
<li>openPGP 也能用于 XMPP 的端到端加密,不过毕竟是面向邮件的非对称加密,客户端不一定都支持
(Gajim、Psi+ 和 mcabber 支持)速度可能没那么快,还有可能把服务器娘累坏(雾)。</li>
</ul>
</div>
<div class="section" id="id7">
<h2><a class="toc-backref" href="#id16">一些注意事项?</a></h2>
<ul class="simple">
<li>因为大多数 XMPP 服务没有提供找回密码的功能,** 所以所以创建一个强密码并记住它!**</li>
<li>传输加密是必须的,端到端加密最好也用上。</li>
<li>端到端加密最好验证下双方的身份,除了传统的指纹验证以外 OTR 还可以通过共享秘密和问答验证。</li>
<li>只使用自由开源的客户端, <del>这个不解释。</del></li>
</ul>
</div>
<div class="section" id="id8">
<h2><a class="toc-backref" href="#id17">自己搭建 XMPP 服务器</a></h2>
<p>好啊好啊,这就是非中心化服务的优势之一呢~</p>
<p>比较推荐的是 <a class="reference external" href="https://prosody.im/">Prosody</a> 和 <a class="reference external" href="https://www.ejabberd.im/">ejabberd</a> ,
前者轻量,配置简单。后者功能丰富,扩展性强。
<a class="reference external" href="/arch-linux/prosody_on_archlinux.html">咱就用 Prosody 搭了一个</a></p>
</div>
<div class="section" id="id10">
<h2><a class="toc-backref" href="#id18">读点别的?</a></h2>
<p><a class="reference external" href="https://tonghuix.io/2015/03/xmpp-chat/">https://tonghuix.io/2015/03/xmpp-chat/</a></p>
<p>⇪网页标题:弃用QQ和微信!全面转向基于XMPP(Jabber)的即时聊天</p>
<p>这篇文章简单的介绍了下 XMPP 的基本特点,也推荐了些不同平台的客户端。</p>
<p><a class="reference external" href="https://beijinglug.club/wiki/lib/exe/fetch.php?media=xmpp-guide.pdf">https://beijinglug.club/wiki/lib/exe/fetch.php?media=xmpp-guide.pdf</a></p>
<p>⇪网页标题:XMPP(Jabber) 聊天快速指南</p>
<p>由北京 GNU/Linux 用户组(BLUG)成员编写的 XMPP 入门指南,图文并茂值得一读(?)</p>
<p><a class="reference external" href="https://hardenedlinux.github.io/cryptography/2018/02/01/pidgin_xmpp_otr_debian.html">https://hardenedlinux.github.io/cryptography/2018/02/01/pidgin_xmpp_otr_debian.html</a></p>
<p>⇪网页标题:Debian/Ubuntu 用户使用基于 XMPP 即时通信协议的 OTR 保护隐私的标准化部署流程</p>
<p>介绍了 OTR 的原理, Debian 上使用 Pidgin 进行 OTR 聊天的流程,以及验证身份的一些技巧。</p>
</div>
听着节拍敲手指2018-09-19T00:00:00+08:002018-09-19T00:00:00+08:00ホロtag:None,2018-09-19:/life/playing_rhythm_game.html
<p>这标题哪里眼熟……(划掉)</p>
<blockquote>
<p>要是有一种游戏,它的唯一玩法就是按着音乐的节奏敲手指,要是有这样的游戏就好了。
但当时的我没有去做任何了解,只是将这个想法憋在了肚子里。
因为我觉得,这需求太小众了,才不会有人做这样的游戏的。</p>
<p>结果显然我错了,这样的游戏不但有,而且还有一大堆!
它们就叫做「音乐游戏」,简称「音游」。</p>
<p><a class="reference external" href="https://fiveyellowmice.com/posts/2018/04/tap-fingers-with-rhythm.html">听着节拍敲手指 - FiveYellowMice's Blog</a></p>
</blockquote>
<p>不过按照维基百科的说法的话,音乐游戏其实还包括乐器模拟一类的游戏。而大家比较常说
的跟着节奏敲手指的那一类游戏的话,有一个更狭义的名称叫做节奏(动作)游戏 😂</p>
<p>所以下面所说的都是这种啦……</p>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id10">入坑</a></h2>
<p>大概是六年前的时候,咱入手了咱的第一部 Android 系统的智能手机(Motorola XT535)。
随着 iPhone 和一批 Android 手机的出现,手机游戏的画质和体验突然就进步了起来
(和 Java 和 Symbian 时期的游戏相比)。于是当时有不少优秀的手机游戏出现了,
(和不少推荐的文章)。</p>
<p>大概某一天咱在浏览游戏推荐文章的时候看到了 Cytus …</p></div>
<p>这标题哪里眼熟……(划掉)</p>
<blockquote>
<p>要是有一种游戏,它的唯一玩法就是按着音乐的节奏敲手指,要是有这样的游戏就好了。
但当时的我没有去做任何了解,只是将这个想法憋在了肚子里。
因为我觉得,这需求太小众了,才不会有人做这样的游戏的。</p>
<p>结果显然我错了,这样的游戏不但有,而且还有一大堆!
它们就叫做「音乐游戏」,简称「音游」。</p>
<p><a class="reference external" href="https://fiveyellowmice.com/posts/2018/04/tap-fingers-with-rhythm.html">听着节拍敲手指 - FiveYellowMice's Blog</a></p>
</blockquote>
<p>不过按照维基百科的说法的话,音乐游戏其实还包括乐器模拟一类的游戏。而大家比较常说
的跟着节奏敲手指的那一类游戏的话,有一个更狭义的名称叫做节奏(动作)游戏 😂</p>
<p>所以下面所说的都是这种啦……</p>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id10">入坑</a></h2>
<p>大概是六年前的时候,咱入手了咱的第一部 Android 系统的智能手机(Motorola XT535)。
随着 iPhone 和一批 Android 手机的出现,手机游戏的画质和体验突然就进步了起来
(和 Java 和 Symbian 时期的游戏相比)。于是当时有不少优秀的手机游戏出现了,
(和不少推荐的文章)。</p>
<p>大概某一天咱在浏览游戏推荐文章的时候看到了 Cytus,画面看起来很漂亮,音乐也很动听。
于是就下载来试了试,就这样,一个新坑挖开了…… 😂</p>
<blockquote>
<p>Cytus是款音樂節奏遊戲,遊戲方式簡單直覺,隨著歌曲旋律畫面上出現節奏拍點,
而玩家要做的就是配合動態掃描線的上下移動抓準時機點擊拍點。
遊戲畫面為細膩的手繪風格,同時網羅多位大牌日本樂師陣容參與音樂製作,
包括知名音樂遊戲的樂師Tsukasa,BMS同人編曲師Naotyu-、樂師Sta等人,
多樣化的曲風、高質感的畫面,是雷亞遊戲的自信力作。</p>
<p>(以上是官方介绍)</p>
</blockquote>
<img alt="Cytus 的游戏截图" class="materialboxed responsive-img" src="/images/rhythm_game/cytus.png"/>
<p>这就是 Cytus 的画面啦,音乐播放的时候,中间那条黑色的线(称作扫描线)会循环的上下移动,
汝要做的就是在扫描线和目标(像泡泡一样的)重合时触摸目标啦 ~ 按下的时机越准,分数就会越高呐~</p>
<blockquote>
<p>后来这个游戏更新了数次,多了不少的新曲,甚至还出了续作)</p>
<p><a class="reference external" href="https://play.google.com/store/apps/details?id=com.rayark.Cytus.full">https://play.google.com/store/apps/details?id=com.rayark.Cytus.full</a></p>
</blockquote>
<p>借这个机会,咱也了解到了这个游戏的开发商 Rayark,一家台湾游戏公司。在 Cytus 之后,它们还制作了
数部音乐游戏作品,例如 Deemo 和 VOEZ。游戏的品质都属上乘,咱偶尔也会玩一玩(为啥是偶尔呢?)……</p>
</div>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id11">提速</a></h2>
<p>后来咱买了第一部可以被称为“平板电脑”的家伙,就是 Samsung Galaxy Tab 2 啦,然后发现平板的
屏幕更大,同时可以用更多手指。<del>可以说是玩音游的利器……</del></p>
<p>又是浏览游戏推荐文章的时候,发现有一篇文章除了提到咱玩过的 Cytus 和 Deemo 以外,还提到了另外两个游戏,
Dynamix 和 OverRapid 。</p>
<img alt="OverRapid 的游戏截图" class="materialboxed responsive-img" src="/images/rhythm_game/overrapid.png"/>
<p>OverRapid 是一群韩国人开发的下落式音乐游戏(就是判定线不动,目标从上往下落下的类型,
这是音乐游戏的一种经典玩法)。不过这个游戏貌似主打的是高速(Rapid?),以及中间的两个
轨道有时会落下红色 note ( note 是音乐游戏对需要点击或按下的目标的一种习惯的表述方式),
这个时候就需要在判定线上滑动了,和普通的下落式游戏有些区别不是?</p>
<blockquote>
<p>C4Cat推出的首款游戏Dynamix,是一款三重下落式音乐手机游戏。与一般下落式音乐游戏不同,
Dynamix分为左、中、右3个下落方向的区域,每个区域作为一个乐器的音轨。
三区的设计令游戏更具变化,为游戏提供更有趣和更高难度的挑战。
另外,同时处理三个音轨也令玩家有亲身演奏整首音乐的临场感,加强音乐节拍。</p>
<p>(以上还是官方介绍)</p>
</blockquote>
<img alt="Dynamix 的游戏截图" class="materialboxed responsive-img" src="/images/rhythm_game/dynamix.png"/>
<p>(三条轨道是不是很刺激?)(笑)咱一开始玩的时候也是手忙脚乱的呢,不过玩的久了就习惯了。
(虽然现在智能开着 Bleed 打打 12 以下的难度养老了, Event 肝不动啦……)</p>
<p>这两个游戏开始有一定难度了呢,不过咱还是会偶尔打开玩一阵的。</p>
</div>
<div class="section" id="id4">
<h2><a class="toc-backref" href="#id12">偶像的力量(雾)</a></h2>
<p>曾经一阵很喜欢初音未来一系列的 VOCALOID 家族,(当然现在也很喜欢啦,不过现在更喜欢各大音乐游戏的原创曲了)
听歌的时候也接触到了以她们为主题的音乐游戏,就是 Project DIVA 系列啦~</p>
<img alt="Project DIVA Future Tone 的游戏截图" class="materialboxed responsive-img" src="/images/rhythm_game/divaft.jpg"/>
<p>又是一种新的玩法,在画面上的目标和飞来的目标重合时按下对应的按键。也有长按和同时按等一系列的特殊音符。</p>
<p>既然叫做“初音未来 Project DIVA”系列嘛,自然收录的都是 Crypton 家的 VOCALOIDs 的曲目(3DS 版的 Project Mirai 有几首
INTERNET 家的 GUMI 客串出场)。每首歌都有特别制作的 PV (或者有时会偷懒直接拿原来的 PV),画面漂亮,就是偶尔
会光顾着看 PV 漏按了几个(雾),咱的 PSV 和 PS4 就是为了玩这个系列买的呢(然后又了解到了不少好游戏,又入了不同的坑)</p>
</div>
<div class="section" id="id5">
<h2><a class="toc-backref" href="#id13">新世界的大门</a></h2>
<p>然后过了两三年。</p>
<p>有一天咱去街机游戏厅的时候,偶然瞥见了一台看起来很像洗衣机的街机(大概可以知道是啥了)。
有两位玩家正在游玩,还有一群人在围观。咱也凑近去看了一眼,感受到了熟悉的感觉,那个
随着音乐拍打按键的感觉……</p>
<p>一局游戏结束以后,有老玩家看到咱很有兴趣,便让出位置让咱来尝试一下。当时的感觉是记不清楚了,
只是觉得比手机上的那些不知道难了多少倍的样子……特别是看到老玩家们打高难度的歌曲时那行云流水的
样子,更是投下了羡慕的目光。</p>
<p>后来知道了这个游戏叫 maimai,当时还有个中文名叫做“舞萌”。这个名字听起来挺不错的,毕竟自己玩的
时候跟着音乐拍按键或者在屏幕上滑动的时候,真的和跳舞很像。不过咱当时还没有要深入的决心。</p>
<p>又过了一阵子,咱发现了家旁边的另一家游戏厅,于是便去看了看。这次除了 maimai 以外,还发现了其它的
音乐游戏街机。比如一个有按键两边还有盘子的(Beatmania IIDX)和看起来像弹吉他的(GutiarFreaks)。</p>
<p>这次不知道是为什么咱就去尝试了,虽然结果惨不忍睹到连 Beginner 难度都过不去( Beatmania IIDX 的
最简单的难度)。不过倒是喜欢上了,后来就经常去玩了。不知不觉就成了咱的兴趣之一了呢……</p>
<img alt="IIDX 的游戏截图" class="materialboxed responsive-img" src="/images/rhythm_game/iidx.jpg"/>
<p>这就是 Beatmania IIDX 的游戏画面啦,没想到这个游戏竟然已经有接近 20 年的历史了呢~</p>
<img alt="Maimai 的玩法介绍" class="materialboxed responsive-img" src="/images/rhythm_game/maimai.png"/>
<p>Maimai 的玩法介绍,目标靠近屏幕边缘时敲击屏幕周围的按键或者触摸屏幕边缘就好啦~</p>
<p>是不是很简单呢(露出了不怀好意的笑容.png)</p>
<img alt="太鼓达人的玩法介绍" class="materialboxed responsive-img" src="/images/rhythm_game/taiko.png"/>
<p>像敲太鼓一样游玩的太鼓达人,除了街机版以外在 PSP/PSV/PS4/3DS/Nintendo Switch 等各种
平台上还有家用版。</p>
</div>
<div class="section" id="id6">
<h2><a class="toc-backref" href="#id14">遍地开花</a></h2>
<p>后来了解信息的渠道越来越多,玩到的音乐游戏也越来越多。</p>
<p>在 Bilibili 上关注了些玩音乐游戏的 UP 主,接触到了不少优秀的音乐游戏,例如……</p>
<blockquote>
<p>“和蔼的纯白色光芒,正在那失落世界的旋律斗争中等待着你。”</p>
<p>在这个挑战性十足的街机风格音乐游戏中随着旋律而触碰、按压与滑动;
聆听来自以日本为首的世界各地作曲者所写的歌曲!</p>
<p>体验全新的音符种类「音弧」:淋漓尽致地利用屏幕空间来滑动并跟随流动的旋律。
在这光芒与斗争相互纠缠的失落世界中遗失自我。</p>
</blockquote>
<img alt="Arcaea 的游戏截图" class="materialboxed responsive-img" src="/images/rhythm_game/arcaea.png"/>
<p>特别像某个街机音游 SOUND VOLTEX 的 Arcaea,在普通的下落式的基础上加了第二条轨道,
玩起来完全是另一番景象。是咱现在经常玩的游戏之一。</p>
<p><a class="reference external" href="https://play.google.com/store/apps/details?id=moe.low.arc">https://play.google.com/store/apps/details?id=moe.low.arc</a></p>
<blockquote>
扮演主角探索地图,以音乐游戏进行「调律」,让黑白无声的世界恢复生机。</blockquote>
<img alt="Lanota 的游戏截图" class="materialboxed responsive-img" src="/images/rhythm_game/lanota.png"/>
<p>圆形的下落式音乐游戏,剧情和收录曲都很优秀。(然而咱才刚开始玩……)</p>
<p><a class="reference external" href="https://play.google.com/store/apps/details?id=com.Noxygames.Lanota">https://play.google.com/store/apps/details?id=com.Noxygames.Lanota</a></p>
<img alt="Tone Sphere 的游戏截图" class="materialboxed responsive-img" src="/images/rhythm_game/tonesphere.png"/>
<p>由 Bit192 Labs (其实只有 <a class="reference external" href="https://twitter.com/naclbbr">Sta</a> 一个人)开发的音乐游戏,
看起来很像 osu! ,不过完成度似乎还可以。还是感叹又会画画又会作曲还能自己写游戏的 Sta 好天才啊……</p>
<p><a class="reference external" href="https://play.google.com/store/apps/details?id=com.bit192labs.tonesphere">https://play.google.com/store/apps/details?id=com.bit192labs.tonesphere</a></p>
<img alt="osu! 的游戏截图" class="materialboxed responsive-img" src="/images/rhythm_game/osu.jpg"/>
<p><del>俄亥俄州立大学专用播放器(雾)</del></p>
<p>一个结合了多种游戏模式的音乐游戏,曲库和谱面在玩家的努力下正在茁壮成长。</p>
<p>(其实优秀的音乐游戏还有不少啦,咱就先偷个懒…… 😂)</p>
</div>
<div class="section" id="id7">
<h2><a class="toc-backref" href="#id15">音乐游戏对咱的影响?</a></h2>
<p>大概有:</p>
<ul class="simple">
<li>音乐播放器里的列表里都成了音乐游戏里玩过的曲目……</li>
<li>因为在游戏里玩过某一部动画的曲目然后就去追了)</li>
<li>听音乐时脑内会浮现出谱面(或者想象谱面)</li>
<li>……</li>
</ul>
</div>
<div class="section" id="id8">
<h2><a class="toc-backref" href="#id16">一些想法</a></h2>
<p>玩了这么久的音乐游戏,还是觉得自己没入门……特别是看到其他人优秀的成绩的时候,心里还是会小别扭一下。
然后就继续练习去了……</p>
<p>音乐游戏玩家又被分成了不少更小的圈子呢,比如玩过街机音乐游戏的可以算上是“核心玩家”的一群人中的个别经常
会看不起只玩手机游戏的“休闲玩家”,反过来也有玩了某几部游戏以后就到处宣扬“** 天下第一”等等的(这种人好像
有些时候叫做睿智?)</p>
<p>然而周围的人看到自己在玩音乐游戏总是会问是不是节奏大师(&^$$^%^W^%$$^&......)</p>
<p>快取得突破的时候(例如要 Full Combo(没有失误)或者满分的时候)突然被打断,
又以“不就是游戏嘛”等一系列理由敷衍的时候……</p>
<p>在群聊打招呼的时候都说自己很弱然后突然发送了一张成绩很好的截图(大佬卖弱是音游玩家的一环?)</p>
<p>又说了不少的废话呢……</p>
</div>
<div class="section" id="id9">
<h2><a class="toc-backref" href="#id17">如果要咱推荐音乐游戏的话……</a></h2>
<p>推荐手机上的音乐游戏的话:</p>
<ul class="simple">
<li>核心向(接近街机音乐游戏的游玩体验,有些挑战性):Arcaea,OverRapid,Dynamix,GROOVE COASTER 2 Original Style</li>
<li>剧情向(画面出色,有一个好故事):Deemo,Lanota ,Tone Sphere,Cytus II</li>
<li>听歌向(选曲优秀,简单上手):Cytus,VOEZ,MUSYNX</li>
</ul>
<p>其实上面提到的游戏不止这一个方面有优势啦……</p>
<p>至于想体验街机音乐游戏的呢,(没想好)</p>
<p>😂</p>
<hr class="docutils"/>
<p>以上的游戏或网站截图来自各游戏的开发商。</p>
</div>
Sailfish OS 移植中(2)- droid-hal 和根文件系统2018-09-01T00:00:00+08:002018-09-01T00:00:00+08:00ホロtag:None,2018-09-01:/sailfish/porting_sailfishos_2.html
<p>Droid HAL,对应 HADK 文档的第七,第八和第十章 _(:з」∠)_</p>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id5">为新设备生成必要的模板</a></h2>
<p>进入 Platform SDK (sfossdk),引入需要的环境变量(如果汝没有写进 bash_profile 或 bashrc 的话)。</p>
<p>接下来就是依样画葫芦啦 😂</p>
<div class="highlight"><pre><span class="code-line"><span></span>PLATFORM_SDK $</span>
<span class="code-line"></span>
<span class="code-line"><span class="nb">cd</span> <span class="nv">$ANDROID_ROOT</span></span>
<span class="code-line">mkdir rpm</span>
<span class="code-line"><span class="nb">cd</span> rpm</span>
<span class="code-line">git init</span>
<span class="code-line"><span class="c1"># 引入必要的 submodules (例如这里的 dhd)</span></span>
<span class="code-line">git submodule add https://github.com/mer-hybris/droid-hal-device dhd</span>
<span class="code-line"><span class="c1"># 必要的替换成汝的手机型号和品牌</span></span>
<span class="code-line">sed -e <span class="s2">"s/@DEVICE@/shamu/"</span> <span class="se">\</span></span>
<span class="code-line">-e …</span></pre></div></div>
<p>Droid HAL,对应 HADK 文档的第七,第八和第十章 _(:з」∠)_</p>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id5">为新设备生成必要的模板</a></h2>
<p>进入 Platform SDK (sfossdk),引入需要的环境变量(如果汝没有写进 bash_profile 或 bashrc 的话)。</p>
<p>接下来就是依样画葫芦啦 😂</p>
<div class="highlight"><pre><span class="code-line"><span></span>PLATFORM_SDK $</span>
<span class="code-line"></span>
<span class="code-line"><span class="nb">cd</span> <span class="nv">$ANDROID_ROOT</span></span>
<span class="code-line">mkdir rpm</span>
<span class="code-line"><span class="nb">cd</span> rpm</span>
<span class="code-line">git init</span>
<span class="code-line"><span class="c1"># 引入必要的 submodules (例如这里的 dhd)</span></span>
<span class="code-line">git submodule add https://github.com/mer-hybris/droid-hal-device dhd</span>
<span class="code-line"><span class="c1"># 必要的替换成汝的手机型号和品牌</span></span>
<span class="code-line">sed -e <span class="s2">"s/@DEVICE@/shamu/"</span> <span class="se">\</span></span>
<span class="code-line">-e <span class="s2">"s/@VENDOR@/moto/"</span> <span class="se">\</span></span>
<span class="code-line">-e <span class="s2">"s/@DEVICE_PRETTY@/Nexus 6/"</span> <span class="se">\</span></span>
<span class="code-line">-e <span class="s2">"s/@VENDOR_PRETTY@/Motorola/"</span> <span class="se">\</span></span>
<span class="code-line">dhd/droid-hal-@DEVICE@.spec.template > droid-hal-shamu.spec</span>
<span class="code-line"><span class="c1"># 然后提交到汝自己对应的 git 仓库中</span></span>
<span class="code-line"><span class="c1"># 最好提前检查一下新生成的文件中的内容</span></span>
<span class="code-line">git add .</span>
<span class="code-line">git commit -m <span class="s2">"[dhd] Initial content"</span></span>
<span class="code-line"><span class="c1"># 如果汝偏好使用 SSH ,换成 git@github.com:myname/your_repo_name</span></span>
<span class="code-line"><span class="c1"># 例如 git@github.com:myname/droid-hal-shamu</span></span>
<span class="code-line"><span class="c1"># 以及别忘了把 myname 换成汝自己的用户名,下同……</span></span>
<span class="code-line">git remote add myname https://github.com/myname/droid-hal-shamu.git</span>
<span class="code-line">git push myname master</span>
<span class="code-line"><span class="nb">cd</span> -</span>
<span class="code-line"><span class="c1"># 下面的其实也差不多 😂</span></span>
<span class="code-line">mkdir -p hybris/droid-configs</span>
<span class="code-line"><span class="nb">cd</span> hybris/droid-configs</span>
<span class="code-line">git init</span>
<span class="code-line">git submodule add https://github.com/mer-hybris/droid-hal-configs <span class="se">\</span></span>
<span class="code-line">droid-configs-device</span>
<span class="code-line">mkdir rpm</span>
<span class="code-line">sed -e <span class="s2">"s/@DEVICE@/shamu/"</span> <span class="se">\</span></span>
<span class="code-line">-e <span class="s2">"s/@VENDOR@/moto/"</span> <span class="se">\</span></span>
<span class="code-line">-e <span class="s2">"s/@DEVICE_PRETTY@/Nexus 6/"</span> <span class="se">\</span></span>
<span class="code-line">-e <span class="s2">"s/@VENDOR_PRETTY@/Motorola/"</span> <span class="se">\</span></span>
<span class="code-line">droid-configs-device/droid-config-@DEVICE@.spec.template > <span class="se">\</span></span>
<span class="code-line">rpm/droid-config-shamu.spec</span>
<span class="code-line"><span class="c1"># Please review rpm/droid-config-shamu.spec before committing!</span></span>
<span class="code-line">git add .</span>
<span class="code-line">git commit -m <span class="s2">"[dcd] Initial content"</span></span>
<span class="code-line"><span class="c1"># Create this repository under your GitHub home</span></span>
<span class="code-line">git remote add myname https://github.com/myname/droid-config-shamu.git</span>
<span class="code-line">git push myname master</span>
<span class="code-line"><span class="nb">cd</span> -</span>
<span class="code-line">rpm/dhd/helpers/add_new_device.sh</span>
<span class="code-line"><span class="c1"># On Nexus 6 the output of the last command is:</span></span>
<span class="code-line"><span class="c1"># Creating the following nodes:</span></span>
<span class="code-line"><span class="c1"># sparse/</span></span>
<span class="code-line"><span class="c1"># patterns/</span></span>
<span class="code-line"><span class="c1"># patterns/jolla-configuration-shamu.yaml</span></span>
<span class="code-line"><span class="c1"># patterns/jolla-hw-adaptation-shamu.yaml</span></span>
<span class="code-line"><span class="nb">cd</span> hybris/droid-configs</span>
<span class="code-line"><span class="nv">COMPOSITOR_CFGS</span><span class="o">=</span>sparse/var/lib/environment/compositor</span>
<span class="code-line">mkdir -p <span class="nv">$COMPOSITOR_CFGS</span></span>
</pre></div>
<p>把手机连接到电脑上,从日志输出中找到汝的触屏是哪一个设备(例如 /dev/input/event0),
然后新建一个 $COMPOSITOR_CFGS/droid-hal-device.conf :</p>
<div class="highlight"><pre><span class="code-line"><span></span># Config for $VENDOR/$DEVICE</span>
<span class="code-line">EGL_PLATFORM=hwcomposer</span>
<span class="code-line">QT_QPA_PLATFORM=hwcomposer</span>
<span class="code-line"># 用汝获得的 /dev/input/event 替换 /dev/input/event0,还有记得这是一行</span>
<span class="code-line">LIPSTICK_OPTIONS=-plugin evdevtouch:/dev/input/event0 -plugin evdevkeyboard:keymap=/usr/share/qt5/keymaps/droid.qmap</span>
</pre></div>
<p>然后继续建立 Git 仓库:</p>
<div class="highlight"><pre><span class="code-line"><span></span>git add .</span>
<span class="code-line">git commit -m <span class="s2">"[dcd] Patterns and compositor config"</span></span>
<span class="code-line">git push myname master</span>
<span class="code-line"><span class="nb">cd</span> -</span>
<span class="code-line">mkdir -p hybris/droid-hal-version-shamu</span>
<span class="code-line"><span class="nb">cd</span> hybris/droid-hal-version-shamu</span>
<span class="code-line">git init</span>
<span class="code-line">git submodule add https://github.com/mer-hybris/droid-hal-version</span>
<span class="code-line">mkdir rpm</span>
<span class="code-line">sed -e <span class="s2">"s/@DEVICE@/shamu/"</span> <span class="se">\</span></span>
<span class="code-line">-e <span class="s2">"s/@VENDOR@/moto/"</span> <span class="se">\</span></span>
<span class="code-line">-e <span class="s2">"s/@DEVICE_PRETTY@/Nexus 6/"</span> <span class="se">\</span></span>
<span class="code-line">-e <span class="s2">"s/@VENDOR_PRETTY@/Motorola/"</span> <span class="se">\</span></span>
<span class="code-line">droid-hal-version/droid-hal-version-@DEVICE@.spec.template > <span class="se">\</span></span>
<span class="code-line">rpm/droid-hal-version-shamu.spec</span>
<span class="code-line"><span class="c1"># Please review rpm/droid-hal-version-shamu.spec before committing!</span></span>
<span class="code-line">git add .</span>
<span class="code-line">git commit -m <span class="s2">"[dvd] Initial content"</span></span>
<span class="code-line"><span class="c1"># Create this repository under your GitHub home</span></span>
<span class="code-line">git remote add myname <span class="se">\</span></span>
<span class="code-line">https://github.com/myname/droid-hal-version-shamu.git</span>
<span class="code-line">git push myname master</span>
</pre></div>
<p>全部完成以后,别忘了修改汝自己的 manifest 文件,加上相应的仓库:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="nt"><project</span> <span class="na">path=</span><span class="s">"rpm/"</span></span>
<span class="code-line"> <span class="na">name=</span><span class="s">"myname/droid-hal-hammerhead"</span> <span class="na">revision=</span><span class="s">"master"</span> <span class="nt">/></span></span>
<span class="code-line"><span class="nt"><project</span> <span class="na">path=</span><span class="s">"hybris/droid-configs"</span></span>
<span class="code-line"> <span class="na">name=</span><span class="s">"myname/droid-config-hammerhead"</span> <span class="na">revision=</span><span class="s">"master"</span> <span class="nt">/></span></span>
<span class="code-line"><span class="nt"><project</span> <span class="na">path=</span><span class="s">"hybris/droid-hal-version-hammerhead"</span></span>
<span class="code-line"> <span class="na">name=</span><span class="s">"myname/droid-hal-version-hammerhead"</span> <span class="na">revision=</span><span class="s">"master"</span> <span class="nt">/></span></span>
</pre></div>
<p>等汝的移植工作完成而且可用的时候,可以去向官方的 manifest 仓库提交一个汝的设备的 Pull Request :-)</p>
</div>
<div class="section" id="droid-hal-device">
<h2><a class="toc-backref" href="#id6">打包 droid-hal-device</a></h2>
<p>其实只有一步:</p>
<blockquote>
rpm/dhd/helpers/build_packages.sh</blockquote>
<p>以后要是汝改了什么地方的话,记得再运行一次就 OK 啦~</p>
<p>如果汝遇到了 Installed (but unpackaged) file(s) found 错误的话,记下不在包中的文件,
把文件名添加到 rpm/droid-hal-$DEVICE.spec 的 %include 之前,例如:</p>
<div class="highlight"><pre><span class="code-line"><span></span>%define straggler_files \</span>
<span class="code-line">/init.mmi.boot.sh \</span>
<span class="code-line">/init.mmi.touch.sh \</span>
<span class="code-line">/init.qcom.ssr.sh \</span>
<span class="code-line">/selinux_version \</span>
<span class="code-line">/service_contexts \</span>
<span class="code-line">%{nil}</span>
</pre></div>
<p>然后在 droid-configs/patterns/jolla-hw-adaptation-$DEVICE.yaml 中加上 "- droid-hal-$DEVICE-detritus"。</p>
<p>再次打包就好。</p>
</div>
<div class="section" id="sailfish-os">
<h2><a class="toc-backref" href="#id7">打包 Sailfish OS 的根文件系统</a></h2>
<p>生成 KickStart 文件:</p>
<div class="highlight"><pre><span class="code-line"><span></span>rpm2cpio droid-local-repo/<span class="nv">$DEVICE</span>/droid-configs/droid-config-<span class="nv">$DEVICE</span>-ssu-kickstarts-1-1.armv7hl.rpm <span class="p">|</span> cpio -idmv</span>
<span class="code-line"></span>
<span class="code-line"><span class="nv">HA_REPO</span><span class="o">=</span><span class="s2">"repo --name=adaptation-community-common-</span><span class="nv">$DEVICE</span><span class="s2">-@RELEASE@"</span></span>
<span class="code-line"><span class="nv">HA_DEV</span><span class="o">=</span><span class="s2">"repo --name=adaptation-community-</span><span class="nv">$DEVICE</span><span class="s2">-@RELEASE@"</span></span>
<span class="code-line"><span class="nv">KS</span><span class="o">=</span><span class="s2">"Jolla-@RELEASE@-</span><span class="nv">$DEVICE</span><span class="s2">-@ARCH@.ks"</span></span>
<span class="code-line">sed <span class="se">\</span></span>
<span class="code-line"> <span class="s2">"/</span><span class="nv">$HA_REPO</span><span class="s2">/i</span><span class="nv">$HA_DEV</span><span class="s2"> --baseurl=file:\/\/</span><span class="nv">$ANDROID_ROOT</span><span class="s2">\/droid-local-repo\/</span><span class="nv">$DEVICE</span><span class="s2">"</span> <span class="se">\</span></span>
<span class="code-line"> <span class="nv">$ANDROID_ROOT</span>/usr/share/kickstarts/<span class="nv">$KS</span> <span class="se">\</span></span>
<span class="code-line"> > <span class="nv">$KS</span></span>
</pre></div>
<p>使用 MIC 生成安装包:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># 选择一个版本,例如写这篇文章时最新的 2.2.0.29</span></span>
<span class="code-line"><span class="nv">RELEASE</span><span class="o">=</span><span class="m">2</span>.2.0.29</span>
<span class="code-line"><span class="c1"># 设置一个自定义名称,用来区分汝自己的不同版本,不过不能用 "."。</span></span>
<span class="code-line"><span class="nv">EXTRA_NAME</span><span class="o">=</span>-my1</span>
<span class="code-line"><span class="c1"># 生成需要的 patterns 。</span></span>
<span class="code-line"><span class="c1"># 最后一定会抛出一个 AttributeError: "'NoneType' object has no attribute 'px_proxy_fa..</span></span>
<span class="code-line"><span class="c1"># 异常,可以安全的忽略掉。</span></span>
<span class="code-line">hybris/droid-configs/droid-configs-device/helpers/process_patterns.sh</span>
<span class="code-line"><span class="c1"># 用 Mic 生成根文件系统安装包</span></span>
<span class="code-line">sudo mic create fs --arch<span class="o">=</span><span class="nv">$PORT_ARCH</span> <span class="se">\</span></span>
<span class="code-line"> --tokenmap<span class="o">=</span>ARCH:<span class="nv">$PORT_ARCH</span>,RELEASE:<span class="nv">$RELEASE</span>,EXTRA_NAME:<span class="nv">$EXTRA_NAME</span> <span class="se">\</span></span>
<span class="code-line"> --record-pkgs<span class="o">=</span>name,url <span class="se">\</span></span>
<span class="code-line"> --outdir<span class="o">=</span>sfe-<span class="nv">$DEVICE</span>-<span class="nv">$RELEASE$EXTRA_NAME</span> <span class="se">\</span></span>
<span class="code-line"> --pack-to<span class="o">=</span>sfe-<span class="nv">$DEVICE</span>-<span class="nv">$RELEASE$EXTRA_NAME</span>.tar.bz2 <span class="se">\</span></span>
<span class="code-line"> <span class="nv">$ANDROID_ROOT</span>/Jolla-@RELEASE@-<span class="nv">$DEVICE</span>-@ARCH@.ks</span>
</pre></div>
<p>如果一切 OK 的话,汝就会在汝的 $ANDROID_ROOT 文件夹下发现一个 sfe-$DEVICE-$RELEASE$EXTRA_NAME
文件夹里面放着一个 sfe-$DEVICE-$RELEASE$EXTRA_NAME.zip ,这就是汝的根文件系统的刷机包咯~</p>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id8">刷入测试</a></h2>
<p>进入汝手机的第三方 Recovery (例如 TWRP),把汝 hybris 对应的 LineageOS 的底包
和刚刚生成的根文件系统复制到汝的手机上并安装。或者 adb sideload 也行。</p>
<ul class="simple">
<li>如果一切都 OK 的话,汝应该能见到 Sailfish OS 的开机画面,试着完成设置看看吧~</li>
<li>要是不行的话,在看看 <a class="reference external" href="https://wiki.merproject.org/wiki/Adaptations/faq-hadk">HADK FAQ</a> 找找问题,
或者上 IRC 问一下其他人吧 _(:з」∠)_</li>
</ul>
</div>
<hr class="docutils"/>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id9">在启动早期和手机建立连接</a></h2>
<p>如果手机和电脑相连以及 hybris 能成功加载的话,汝的电脑上应该会多出一个网络适配器,
和 Android 启动 USB 网络共享类似。 GNU/Linux 的话可以通过 ip 命令确认。</p>
<p>可以用 telnet 连接到早期启动阶段的手机:</p>
<blockquote>
telnet 192.168.2.15</blockquote>
<p>如果连接不上,可能是 Sailfish OS 已经在加载但是显示不出界面。
这个时候 telnet 的端口是 2323。</p>
<p>连接上以后,可以用 devel-su 命令进入 root shell:</p>
<blockquote>
devel-su</blockquote>
<p>然后就可以通过 dmesg 或者 journalctl 等命令查看日志啦,在调试的时候可能会派上用场。</p>
</div>
<div class="section" id="id4">
<h2><a class="toc-backref" href="#id10">如果反复重新启动</a></h2>
<p>反复重新启动有这么几种情况:</p>
<ul>
<li><p class="first">启动后立刻重启(或进入 Recovery 模式):大概是 SELinux 的问题 _(:з」∠)_</p>
<blockquote>
<p>所有基于 CyanogenMod 11 以后(Android 4.4)的移植都必须停用 SELinux。
尝试在编译内核的选项中停用 SELinux ,或者设置 CONFIG_SECURITY_SELINUX_BOOTPARAM=y ,
然后在启动参数中加上 selinux=0 (启动参数通常在 $ANDROID_ROOT/device/$VENDOR/<em>/BoardConfig</em>.mk
中的 BOARD_KERNEL_CMDLINE 中)</p>
</blockquote>
</li>
<li><p class="first">启动后数分钟后重启:尝试停用 ofono 服务,启动时尽快通过 telnet 进入 root shell:</p>
<blockquote>
<p>ln -s /dev/null /etc/systemd/system/ofono.service</p>
</blockquote>
</li>
<li><p class="first">……</p>
</li>
</ul>
</div>
和 Android 玩耍的那些日子2018-08-08T00:00:00+08:002018-08-08T00:00:00+08:00ホロtag:None,2018-08-08:/tech_misc/playing_with_android.html
<p>也可以说是 root Android 的过程 ……</p>
<p>最近 Android Pie 发布了,于是随便写写杂感 (雾)</p>
<div class="section" id="android-2-x-zergrush">
<h2><a class="toc-backref" href="#id1">Android 2.x :蛮荒时代和 ZergRush</a></h2>
<p>(记得那是咱自己的第一部 Android 手机, Motorola Defy XT535)
拿来的时候还是 Android 2.3,当然是不能用现在的审美去看 Gingerbread
的界面啦……(不过 2.3 时期的 TouchWiz 是真的比 Motorola 那几乎没怎么改
的漂亮,虽然现在……)至于当时怎么想到去 root 了呢,动机大概是
想不起来了,大概只是为了移除某些系统应用而已 😂 。2.x 时期最著名的
大概就是 ZergRush 漏洞了 …</p></div>
<p>也可以说是 root Android 的过程 ……</p>
<p>最近 Android Pie 发布了,于是随便写写杂感 (雾)</p>
<div class="section" id="android-2-x-zergrush">
<h2><a class="toc-backref" href="#id1">Android 2.x :蛮荒时代和 ZergRush</a></h2>
<p>(记得那是咱自己的第一部 Android 手机, Motorola Defy XT535)
拿来的时候还是 Android 2.3,当然是不能用现在的审美去看 Gingerbread
的界面啦……(不过 2.3 时期的 TouchWiz 是真的比 Motorola 那几乎没怎么改
的漂亮,虽然现在……)至于当时怎么想到去 root 了呢,动机大概是
想不起来了,大概只是为了移除某些系统应用而已 😂 。2.x 时期最著名的
大概就是 ZergRush 漏洞了,通吃大多数 2.2-2.3 版本……</p>
<p>后记:那 XT535 后来收到了 4.0.4 更新,然后又坚持了两年,最后掉了……</p>
</div>
<div class="section" id="android-3-x">
<h2><a class="toc-backref" href="#id2">Android 3.x :没用过</a></h2>
<p>于是跳过 😂</p>
</div>
<div class="section" id="android-4-x-cyanogenmod-cwm-cf-auto-root-superuser-supersu-xposed">
<h2><a class="toc-backref" href="#id3">Android 4.x:CyanogenMod,CWM,CF-Auto-Root,Superuser,SuperSU 和 Xposed</a></h2>
<p>和 XT535 同时入手的其实还有 Samsung Galaxy Tab2,当时那上面已经是 Android
4.0.3 了。虽然三星魔改的很厉害,但是乍一看就和旁边的 2.3 不一样不是? 😂</p>
<p>以及到了 4.0 时代, ZergRush 就不能用咯。当时咱还处于一种啥都不懂的状态
(当然现在也只是懂些皮毛而已啦),上网搜索到了一个叫做 CF-Auto-Root 的家伙。
( <a class="reference external" href="https://autoroot.chainfire.eu/">https://autoroot.chainfire.eu/</a> )</p>
<p>用过三星手机的应该都知道,人家是没有 fastboot 模式的,但是有个 Download 模式
(因为早些时候的 Download 模式上有个施工造型的 Android 机器人,所以有时有人
也把它叫做挖煤模式)。然后需要用到一个叫做 odin 的工具刷机。</p>
<img alt="大概长这样" class="materialboxed responsive-img" src="https://odindownload.com/images/odin-download.jpg"/>
<p>当时 root 手机的方法,基本上都是先把一个称作 Recovery 的东西放在手机上,
然后利用一个小 zip 包把 su 可执行文件放在对应的位置上,再安装一个应用来控制
root 权限就 OK 啦~</p>
<blockquote>
其实汝的手机上是有一个 Recovery 的,重置或者系统更新的时候会需要。不过
官方的 Recovery 通常功能不多而且会检查更新的签名,所以就需要刷入一个第三方
的 Recovery 来实现更多功能。比较著名的第三方 Recovery 的话,以前有 ClockWorkMod
(简称 CWM),现在有 Team Win Recovery Project(简称 TWRP)</blockquote>
<p>而 CF-Auto-Root 把这些过程简化到一个供 odin 刷入的 tar 包中,于是咱当时就用它 root 了。</p>
<p>至于 Root 权限管理应用的话,当时比较流行的是 Superuser (忘了是谁开发的了)
和 SuperSU (Chainfire,也是 CF-Auto-Root 的作者,虽然已经是前开发者了)。两个当时都很优秀
(虽然现在都凉了)</p>
<p>然后有一次咱尝试系统加密玩脱了,系统进不去了,于是死马当活马医的装了个 CyanogenMod 进去,
打开了新世界的大门(雾)。</p>
<blockquote>
以至于现在咱用不习惯任何非类原生 Android 界面了 😂</blockquote>
<p>大概是 4.4 时期,有了个叫做 Xposed 的东西。大概是一个通用的系统框架,
可以实现上至系统界面调节下到应用权限控制等一系列千奇百怪的功能。咱当时也
装了不少的模块用了一阵子。</p>
<p>后记:那个 Galaxy Tab 2 一直坚持到 CyanogenMod 13.0 ( Android 6.0.1),性能是真的不行了,
于是就闲置在家里,然后屏幕外面的玻璃被压碎了……</p>
</div>
<div class="section" id="android-5-x-6-0">
<h2><a class="toc-backref" href="#id4">Android 5.x - 6.0 时期:没啥特别的</a></h2>
<p>大概是 15 年的时候买了台 Galaxy A8 ,然后兴致勃勃的用以前的方法 root 的时候,
遇到了一个叫做 KNOX 的神奇大坑。</p>
<blockquote>
4.3 以前的三星手机刷入自定义操作系统以后,启动时会显示一个感叹号三角形,
Download 模式里也会记录刷入了自定义操作系统。不过当时可以很轻松的去掉
(例如用 Triangle Away)。后来有了 KNOX 以后,修改操作系统的行为会导致
KNOX WARRANTY VOID 变成 0x1 从而失去保修。以及某些功能将无法使用(例如
My Knox 和后来的 S Health,Samsung Pay 等等),而且据说因为这是个硬件
设计于是不可逆……</blockquote>
<p>自此咱就再也没买过新的三星 Android 手机……</p>
<p>如果不考虑那些的话,还有一个问题,修改过系统分区的话,就不能收到厂商的系统更新了。
于是不动 /system 的 system-less root 方法应运而生,典型的方法是修改内核映像(boot.img)……</p>
<p>以及那时候自从 ART 代替 Dalvik 以后, Xposed 适配新版本的速度慢了下来。</p>
</div>
<div class="section" id="android-7-x-8-x-safetynet-magisk-lineageos-project-treble">
<h2><a class="toc-backref" href="#id5">Android 7.x - 8.x 时期:SafetyNet,Magisk ,LineageOS 和 Project Treble</a></h2>
<p>7.0 一上来就是猛料,比如所谓的 SafetyNet ,反正咱现在也没搞清楚这是啥……
以及不知道是不是 7.0 的 Xposed 鸽了太久的原因, 有人写出了 Magisk。 和 Xposed
大概具有类似的功能,但是不动系统分区,于是接收 OTA 更新能稍微容易一点……
以及介于 Superuser 年久失修和 Chainfire 宣布不再参与 SuperSU 开发以后,
Magisk 还有一个 Root 权限管理程序。总之也有不少人用啦~</p>
<p>这个时期也出现了很多不必须 root 权限的系统管理工具,例如 Brevent 和 AppOps,
它们都是通过 adb 启动一个外部脚本来协助完成某些任务,给了不 root 或没法 root
手机的人一些选择。</p>
<p>以及那年商业化失败的 CyanogenMod 宣布关闭,不过过了一阵子以后又有一群有志之士
成立了 LineageOS 社区,目前正在活跃开发中。</p>
<p>Oreo 时有了 Project Treble 和 A/B 无缝系统更新,前者把 Android 系统的部件和 OEM
定制的部分分开,声称能使 OEM 适配最新版 Android 系统的速度提升。后者可以做到更新时可以
继续使用设备,而且不容易坏(笑)。</p>
<p>对于喜欢搞机的开发者们呢?看起来 Project Treble 使第三方 ROM 移植起来稍微容易了一些,
比如汝可以在 xda 上找到 Treble 兼容的 AOSP 和 LineageOS 的通用系统映像(GSI),然后
刷入进汝支持 Treble 的手机上,大多数的功能应该都能运作。 不过 A/B 无缝更新可能就是个
美丽的麻烦了,因为没有了单独的 Recovery 分区,所以给这种手机适配 TWRP 的进度似乎慢了下来。</p>
</div>
<div class="section" id="android-p">
<h2><a class="toc-backref" href="#id6">Android P ?</a></h2>
<p>咱现在用的是 Nokia 7 plus ,当时有官方的 Android P Beta 支持,于是咱就这么用了下去。
除了前几个 DP 每次都要全新安装以外其实海星 😂 。 Magisk 在 Android P 上也比较稳,原来
不少需要魔改的功能也或多或少的集成进系统里了。然而以前那个愉快的折腾的日子似乎回不来了呢……</p>
</div>
<div class="section" id="ps-when-i-buy-a-phone">
<h2><a class="toc-backref" href="#id7">PS: #when_I_buy_a_phone</a></h2>
<p>如果咱要换手机的话:</p>
<ul class="simple">
<li>能解 Bootloader 锁的通常很快都会有 LineageOS 适配,优先考虑。</li>
<li>上面一条不满足的话,如果是类原生系统的体验也可以考虑。</li>
<li>最好不是异形屏幕(就是所谓的刘海啥的),屏幕比例最好是普通的 16:9/16:10 一类。</li>
<li>有物理键盘最好。</li>
</ul>
<p>于是现在(这篇文章完成的时候)这么下来,貌似就不剩几个了吧 😂</p>
</div>
su, sudo, pkexec 和 root 的二三事2018-08-01T00:00:00+08:002018-08-01T00:00:00+08:00ホロtag:None,2018-08-01:/linux/su_sudo_and_pkexec.html
<p>到底有啥区别 _(:з」∠)_</p>
<div class="section" id="root">
<h2><a class="toc-backref" href="#id1">什么是 root 权限?</a></h2>
<p>这里的 root 权限,实际上指的是名为 root 的账户所具有的权限。“获取 root 权限”,指的实际是获取 root 账户的使用权。
root 是系统中权限最高的用户。和 Windows 的 Administrator 相比,权限不知道高到哪里去了。
(注:在 Windows 中想获取较高的权限,可以使用 NSudo)举个例子:Administrator 是删除不了 explorer.exe 文件的,
而 root 可以删除你当前正在使用的 shell 甚至整个系统 。</p>
<p>在 GNU/Linux 上 切换到 root …</p></div>
<p>到底有啥区别 _(:з」∠)_</p>
<div class="section" id="root">
<h2><a class="toc-backref" href="#id1">什么是 root 权限?</a></h2>
<p>这里的 root 权限,实际上指的是名为 root 的账户所具有的权限。“获取 root 权限”,指的实际是获取 root 账户的使用权。
root 是系统中权限最高的用户。和 Windows 的 Administrator 相比,权限不知道高到哪里去了。
(注:在 Windows 中想获取较高的权限,可以使用 NSudo)举个例子:Administrator 是删除不了 explorer.exe 文件的,
而 root 可以删除你当前正在使用的 shell 甚至整个系统 。</p>
<p>在 GNU/Linux 上 切换到 root 用户的方法大有三种:</p>
</div>
<div class="section" id="su-switch-user">
<h2><a class="toc-backref" href="#id2">su - 其实是切换用户 (switch user)</a></h2>
<blockquote>
su [options] [-] [user [argument...]]</blockquote>
<p>su 其实是用来切换用户的啦~ 如果没参数的话,默认是切换到 root 的,所以会询问 root 的密码。</p>
<p>以及 su 默认只改变 HOME 和 SHELL 变量,可以用 --login (或者更短些的 - )来规避混合环境变量的副作用:</p>
<blockquote>
su -</blockquote>
<p>直到离开 shell 之前都能保持 root 权限。</p>
</div>
<div class="section" id="sudo">
<h2><a class="toc-backref" href="#id3">sudo - 家庭常备(误)</a></h2>
<p>sudo(substitute user do) 使得系统管理员可以授权特定用户或用户组作为 root 或他用户执行某些(或所有)命令,
同时还能够对命令及其参数提供审核跟踪。</p>
<p>一个典型的 sudo 操作大概像这样:</p>
<div class="highlight"><pre><span class="code-line"><span></span>$ sudo pacman -Syu</span>
<span class="code-line"><span class="c1"># sudo 会请求当前用户的密码</span></span>
<span class="code-line"><span class="o">[</span>sudo<span class="o">]</span> password <span class="k">for</span> horo:</span>
<span class="code-line"><span class="c1"># 然后就可以用 root 权限执行某些操作啦~</span></span>
<span class="code-line">:: Synchronizing package databases...</span>
</pre></div>
<p>不过不是所有能用 sudo 这一个命令的家伙都能获得 root 权限的啦~
sudo 君有一个小名单,只有名单上的人才可以使用 sudo。这个名单就是 /etc/sudoers 。</p>
<p>为了确保正确的更改 /etc/sudoers 文件,通常会使用 visudo 命令。
visudo会锁住 sudoers 文件,保存修改到临时文件,然后检查文件格式,
确保正确后才会覆盖 sudoers 文件。</p>
</div>
<div class="section" id="pkexec-systemd">
<h2><a class="toc-backref" href="#id4">pkexec - Systemd 全家桶内置(误)</a></h2>
<blockquote>
pkexec allows an authorized user to execute PROGRAM as another user.
If PROGRAM is not specified.the default shell will be run.
If username is not specified, then the program will be executed as
the administrative super user, root.</blockquote>
<p>pkexec 用法上和 sudo 大概差不多:</p>
<div class="highlight"><pre><span class="code-line"><span></span>$ pkexec <command></span>
</pre></div>
<p>不过这个貌似桌面环境里用的比较多,在桌面环境上接下来会弹出一个对话框,
提示汝输入汝自己的密码,大概像这样(GNOME 大概像这样……):</p>
<img alt="pkexec" class="materialboxed responsive-img" src="/images/pkexec.png"/>
<p>所以这仨到底有啥区别还是没搞清楚 _(:з」∠)_</p>
</div>
咕咕咕2018-07-25T00:00:00+08:002018-07-25T00:00:00+08:00ホロtag:None,2018-07-25:/life/status_20180725.html
<p><del>咕咕咕咕咕,咕咕咕,咕咕咕咕,咕咕咕……</del></p>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id6">挖坑一时爽,填坑火葬场(咕)</a></h2>
<ul class="simple">
<li>某无名魔法书(?)因为名字始终没决定就咕了(偏谁呢~)</li>
<li>前两篇提到的给 Nexus 6 移植 SailfishOS 的工作其实已经接近完成了(大概只剩手机网络和蓝牙了,
不过后来更新 2.2.0.29 (大概是这个版本号吧)以后就炸了 😂</li>
<li><del>这就是汝咕了接近两个月的理由?</del></li>
</ul>
</div>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id7">最近?</a></h2>
<ul class="simple">
<li>人(?)在[数据删除] (😂)</li>
<li>在用 MediaWiki 搞大新闻(这一行删掉)</li>
<li>正在缩小计划的 Android 第三方 ROM 横评(?)的范围
( <a class="reference external" href="https://twitter.com/Ken_Ookami_Horo/status/1011314945198211074">https://twitter.com/Ken_Ookami_Horo/status/1011314945198211074</a> ),咕咕咕……</li>
</ul>
</div>
<div class="section" id="id4">
<h2><a class="toc-backref" href="#id8">并没有收广告费的广告</a></h2>
<blockquote>
<p>有人群的地方就需要信仰,在這廣大的姬家也不例外,所以就讓我們一起信奉 …</p></blockquote></div>
<p><del>咕咕咕咕咕,咕咕咕,咕咕咕咕,咕咕咕……</del></p>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id6">挖坑一时爽,填坑火葬场(咕)</a></h2>
<ul class="simple">
<li>某无名魔法书(?)因为名字始终没决定就咕了(偏谁呢~)</li>
<li>前两篇提到的给 Nexus 6 移植 SailfishOS 的工作其实已经接近完成了(大概只剩手机网络和蓝牙了,
不过后来更新 2.2.0.29 (大概是这个版本号吧)以后就炸了 😂</li>
<li><del>这就是汝咕了接近两个月的理由?</del></li>
</ul>
</div>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id7">最近?</a></h2>
<ul class="simple">
<li>人(?)在[数据删除] (😂)</li>
<li>在用 MediaWiki 搞大新闻(这一行删掉)</li>
<li>正在缩小计划的 Android 第三方 ROM 横评(?)的范围
( <a class="reference external" href="https://twitter.com/Ken_Ookami_Horo/status/1011314945198211074">https://twitter.com/Ken_Ookami_Horo/status/1011314945198211074</a> ),咕咕咕……</li>
</ul>
</div>
<div class="section" id="id4">
<h2><a class="toc-backref" href="#id8">并没有收广告费的广告</a></h2>
<blockquote>
<p>有人群的地方就需要信仰,在這廣大的姬家也不例外,所以就讓我們一起信奉「山景城的始祖鳥〜谷鴿」吧!
參拜時別忘了添香油錢哦!也請大家多多介紹本神社給其他信眾,
別讓巫女「+ 雪月秋水」沒事可做喔!希望本神社能成為姬家的信仰中心,祝福大家好運隨你身,有參拜有保佑。</p>
<p>人群れがあれば、信仰が必要であり、こんな広いG+でも外されないです。だから私達はいっしょにこの
「マウンテンビューの始祖島~グーグル」を信奉しましょう。参拝する時、お賽銭を忘れないでくださいね!
皆さんにぜひ林靜(リンジン)神社を紹介しなければならなくください。巫女(+雪月秋水) は信者のために祈ります!
我々は、この神社をG+の信仰のセンターになることを願います!すべての信者は、幸運を得ることができます。</p>
<p>Where there are people, there is faith. On Google+, we have built a Jinja (Shinto shrine)
to collect wishes and good luck. We believe that the Jinja
can be a place where people can spread love and peace, rather than a religious site.
In this community, we encourage communication among different cultures
as well as sharing your wishes and expressing good faith.
You can also post your short-term or long-term goals here,
and many people will come to encourage you and wish you good luck.
Yukizuki Akimizu, our miko (Shinto priestess) is waiting for your arrival at the entry.
Please make donations to the Jinja to support the daily expense such as food and drinks for the miko.</p>
<p class="attribution">—林静神社 - <a class="reference external" href="https://plus.google.com/communities/117905230530560564263">https://plus.google.com/communities/117905230530560564263</a></p>
</blockquote>
</div>
<div class="section" id="id5">
<h2><a class="toc-backref" href="#id9">并没有收广告费的广告 02</a></h2>
<blockquote>
<del>广告位招租……</del></blockquote>
<hr class="docutils"/>
<p>😂</p>
</div>
Sailfish OS 移植中(1)- hybris-hal2018-06-07T00:00:00+08:002018-06-07T00:00:00+08:00ホロtag:None,2018-06-07:/sailfish/porting_sailfishos_1.html
<p>Android HAL _(:з」∠)_</p>
<p>从这个阶段开始汝可能会遇到各种神奇的问题 😂,要是遇到了啥问题的话,不妨到这俩地方来问一问:</p>
<ul class="simple">
<li><a class="reference external" href="https://t.me/jollacn">Telegram 上的 Jolla-Sailfish OS 中文交流群</a></li>
<li>irc.freenode.net 上的 #sailfishos-porters (记得看 topic)</li>
</ul>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id2">取得挂载点信息</a></h2>
<p>看 <a class="reference external" href="https://sailfishos.org/wp-content/uploads/2017/09/SailfishOS-HardwareAdaptationDevelopmentKit-2.0.1.pdf#section.5.3">HADK 文档里</a> 讲的:</p>
<blockquote>
Systemd:怪我咯 😂</blockquote>
<p>打开 hybris/hybris-boot/fixup-mountpoints ,大概像这样:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="ch">#!/bin/sh</span></span>
<span class="code-line"><span class="c1"># Fix up mount points device node names.</span></span>
<span class="code-line"><span class="c1">#</span></span>
<span class="code-line"><span class="c1"># /data needs to be mounted in initrd, but there …</span></span></pre></div></div>
<p>Android HAL _(:з」∠)_</p>
<p>从这个阶段开始汝可能会遇到各种神奇的问题 😂,要是遇到了啥问题的话,不妨到这俩地方来问一问:</p>
<ul class="simple">
<li><a class="reference external" href="https://t.me/jollacn">Telegram 上的 Jolla-Sailfish OS 中文交流群</a></li>
<li>irc.freenode.net 上的 #sailfishos-porters (记得看 topic)</li>
</ul>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id2">取得挂载点信息</a></h2>
<p>看 <a class="reference external" href="https://sailfishos.org/wp-content/uploads/2017/09/SailfishOS-HardwareAdaptationDevelopmentKit-2.0.1.pdf#section.5.3">HADK 文档里</a> 讲的:</p>
<blockquote>
Systemd:怪我咯 😂</blockquote>
<p>打开 hybris/hybris-boot/fixup-mountpoints ,大概像这样:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="ch">#!/bin/sh</span></span>
<span class="code-line"><span class="c1"># Fix up mount points device node names.</span></span>
<span class="code-line"><span class="c1">#</span></span>
<span class="code-line"><span class="c1"># /data needs to be mounted in initrd, but there is no udev that early,</span></span>
<span class="code-line"><span class="c1"># which means there is no /dev/block/platform/*/by-name/* (or bootdevice).</span></span>
<span class="code-line"><span class="c1"># This file is a map from the "by-name" path to /dev/mmcblkMpN.</span></span>
<span class="code-line"><span class="c1"># It also serves dhd to convert fstab and *.rc mount entries to systemd units,</span></span>
<span class="code-line"><span class="c1"># because at that boot stage there is still no udev "by-name" paths, even when</span></span>
<span class="code-line"><span class="c1"># systemd starts to execut the "*.mount" units.</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="nv">DEVICE</span><span class="o">=</span><span class="nv">$1</span></span>
<span class="code-line"><span class="nb">shift</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="nb">echo</span> <span class="s2">"Fixing mount-points for device </span><span class="nv">$DEVICE</span><span class="s2">"</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="k">case</span> <span class="s2">"</span><span class="nv">$DEVICE</span><span class="s2">"</span> in</span>
<span class="code-line"> <span class="c1"># 中间省去若干行 ……</span></span>
<span class="code-line"> <span class="s2">"shamu"</span><span class="o">)</span></span>
<span class="code-line"> sed -i <span class="se">\</span></span>
<span class="code-line"> -e <span class="s1">'s block/platform/msm_sdcc.1/by-name/aboot mmcblk0p7 '</span> <span class="se">\</span></span>
<span class="code-line"> -e <span class="s1">'s block/platform/msm_sdcc.1/by-name/abootBackup mmcblk0p13 '</span> <span class="se">\</span></span>
<span class="code-line"> -e <span class="s1">'s block/platform/msm_sdcc.1/by-name/boot mmcblk0p37 '</span> <span class="se">\</span></span>
<span class="code-line"> -e <span class="s1">'s block/platform/msm_sdcc.1/by-name/cache mmcblk0p38 '</span> <span class="se">\</span></span>
<span class="code-line"> -e <span class="s1">'s block/platform/msm_sdcc.1/by-name/cid mmcblk0p29 '</span> <span class="se">\</span></span>
<span class="code-line"> -e <span class="s1">'s block/platform/msm_sdcc.1/by-name/ddr mmcblk0p6 '</span> <span class="se">\</span></span>
<span class="code-line"> -e <span class="s1">'s block/platform/msm_sdcc.1/by-name/frp mmcblk0p18 '</span> <span class="se">\</span></span>
<span class="code-line"> -e <span class="s1">'s block/platform/msm_sdcc.1/by-name/keystore mmcblk0p24 '</span> <span class="se">\</span></span>
<span class="code-line"> -e <span class="s1">'s block/platform/msm_sdcc.1/by-name/kpan mmcblk0p36 '</span> <span class="se">\</span></span>
<span class="code-line"> -e <span class="s1">'s block/platform/msm_sdcc.1/by-name/logo mmcblk0p30 '</span> <span class="se">\</span></span>
<span class="code-line"> -e <span class="s1">'s block/platform/msm_sdcc.1/by-name/logs mmcblk0p25 '</span> <span class="se">\</span></span>
<span class="code-line"> -e <span class="s1">'s block/platform/msm_sdcc.1/by-name/mdm1dhob mmcblk0p28 '</span> <span class="se">\</span></span>
<span class="code-line"> -e <span class="s1">'s block/platform/msm_sdcc.1/by-name/mdm1hob mmcblk0p27 '</span> <span class="se">\</span></span>
<span class="code-line"> -e <span class="s1">'s block/platform/msm_sdcc.1/by-name/mdm1m9kefs1 mmcblk0p19 '</span> <span class="se">\</span></span>
<span class="code-line"> -e <span class="s1">'s block/platform/msm_sdcc.1/by-name/mdm1m9kefs2 mmcblk0p20 '</span> <span class="se">\</span></span>
<span class="code-line"> -e <span class="s1">'s block/platform/msm_sdcc.1/by-name/mdm1m9kefs3 mmcblk0p21 '</span> <span class="se">\</span></span>
<span class="code-line"> -e <span class="s1">'s block/platform/msm_sdcc.1/by-name/mdm1m9kefsc mmcblk0p33 '</span> <span class="se">\</span></span>
<span class="code-line"> -e <span class="s1">'s block/platform/msm_sdcc.1/by-name/metadata mmcblk0p2 '</span> <span class="se">\</span></span>
<span class="code-line"> -e <span class="s1">'s block/platform/msm_sdcc.1/by-name/misc mmcblk0p31 '</span> <span class="se">\</span></span>
<span class="code-line"> -e <span class="s1">'s block/platform/msm_sdcc.1/by-name/modem mmcblk0p1 '</span> <span class="se">\</span></span>
<span class="code-line"> -e <span class="s1">'s block/platform/msm_sdcc.1/by-name/oem mmcblk0p39 '</span> <span class="se">\</span></span>
<span class="code-line"> -e <span class="s1">'s block/platform/msm_sdcc.1/by-name/padA mmcblk0p11 '</span> <span class="se">\</span></span>
<span class="code-line"> -e <span class="s1">'s block/platform/msm_sdcc.1/by-name/padB mmcblk0p22 '</span> <span class="se">\</span></span>
<span class="code-line"> -e <span class="s1">'s block/platform/msm_sdcc.1/by-name/padC mmcblk0p40 '</span> <span class="se">\</span></span>
<span class="code-line"> -e <span class="s1">'s block/platform/msm_sdcc.1/by-name/padD mmcblk0p32 '</span> <span class="se">\</span></span>
<span class="code-line"> -e <span class="s1">'s block/platform/msm_sdcc.1/by-name/persist mmcblk0p26 '</span> <span class="se">\</span></span>
<span class="code-line"> -e <span class="s1">'s block/platform/msm_sdcc.1/by-name/recovery mmcblk0p35 '</span> <span class="se">\</span></span>
<span class="code-line"> -e <span class="s1">'s block/platform/msm_sdcc.1/by-name/rpm mmcblk0p8 '</span> <span class="se">\</span></span>
<span class="code-line"> -e <span class="s1">'s block/platform/msm_sdcc.1/by-name/rpmBackup mmcblk0p14 '</span> <span class="se">\</span></span>
<span class="code-line"> -e <span class="s1">'s block/platform/msm_sdcc.1/by-name/sbl1 mmcblk0p3 '</span> <span class="se">\</span></span>
<span class="code-line"> -e <span class="s1">'s block/platform/msm_sdcc.1/by-name/sbl1bak mmcblk0p12 '</span> <span class="se">\</span></span>
<span class="code-line"> -e <span class="s1">'s block/platform/msm_sdcc.1/by-name/sdi mmcblk0p4 '</span> <span class="se">\</span></span>
<span class="code-line"> -e <span class="s1">'s block/platform/msm_sdcc.1/by-name/sec mmcblk0p5 '</span> <span class="se">\</span></span>
<span class="code-line"> -e <span class="s1">'s block/platform/msm_sdcc.1/by-name/sp mmcblk0p23 '</span> <span class="se">\</span></span>
<span class="code-line"> -e <span class="s1">'s block/platform/msm_sdcc.1/by-name/ssd mmcblk0p34 '</span> <span class="se">\</span></span>
<span class="code-line"> -e <span class="s1">'s block/platform/msm_sdcc.1/by-name/system mmcblk0p41 '</span> <span class="se">\</span></span>
<span class="code-line"> -e <span class="s1">'s block/platform/msm_sdcc.1/by-name/tz mmcblk0p10 '</span> <span class="se">\</span></span>
<span class="code-line"> -e <span class="s1">'s block/platform/msm_sdcc.1/by-name/tzBackup mmcblk0p16 '</span> <span class="se">\</span></span>
<span class="code-line"> -e <span class="s1">'s block/platform/msm_sdcc.1/by-name/userdata mmcblk0p42 '</span> <span class="se">\</span></span>
<span class="code-line"> -e <span class="s1">'s block/platform/msm_sdcc.1/by-name/utags mmcblk0p9 '</span> <span class="se">\</span></span>
<span class="code-line"> -e <span class="s1">'s block/platform/msm_sdcc.1/by-name/utagsBackup mmcblk0p15 '</span> <span class="se">\</span></span>
<span class="code-line"> -e <span class="s1">'s block/platform/msm_sdcc.1/by-name/versions mmcblk0p17 '</span> <span class="se">\</span></span>
<span class="code-line"> <span class="s2">"</span><span class="nv">$@</span><span class="s2">"</span></span>
<span class="code-line"> <span class="p">;;</span></span>
<span class="code-line"> *<span class="o">)</span></span>
<span class="code-line"> cat <span class="s"><<EOF</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="s">****************************************************************</span></span>
<span class="code-line"><span class="s">****************************************************************</span></span>
<span class="code-line"><span class="s">ERROR: $DEVICE does not have mountpoint fixup data - see</span></span>
<span class="code-line"><span class="s"> Sailfish OS HADK for details on how to fix this.</span></span>
<span class="code-line"><span class="s">****************************************************************</span></span>
<span class="code-line"><span class="s">****************************************************************</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="s">EOF</span></span>
<span class="code-line"> <span class="nb">exit</span> <span class="m">1</span></span>
<span class="code-line"> <span class="p">;;</span></span>
<span class="code-line"><span class="k">esac</span></span>
</pre></div>
<p>大概就是:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="s2">"{{汝设备的代号}}"</span><span class="o">)</span></span>
<span class="code-line"> sed -i <span class="se">\</span></span>
<span class="code-line"> -e <span class="s1">'s block/xxx xxx '</span> <span class="se">\</span></span>
<span class="code-line"> ......</span>
<span class="code-line"> <span class="s2">"</span><span class="nv">$@</span><span class="s2">"</span></span>
<span class="code-line"> <span class="p">;;</span></span>
</pre></div>
<p>这个样子 😂</p>
<p>那么中间一大把 -e 怎么生成呢?</p>
<p>把汝的手机接到电脑上,运行一下 adb :</p>
<div class="highlight"><pre><span class="code-line"><span></span>$ adb shell</span>
<span class="code-line">$ shamu:/ $ ls -l /dev/block/platform/</span>
<span class="code-line"><span class="c1"># 在这里按一下 TAB 补全一下:</span></span>
<span class="code-line">$ shamu:/ $ ls -l /dev/block/platform/msm_sdcc.1/by-name/</span>
<span class="code-line">total <span class="m">0</span></span>
<span class="code-line">lrwxrwxrwx <span class="m">1</span> root root <span class="m">20</span> <span class="m">1970</span>-02-24 <span class="m">06</span>:55 aboot -> /dev/block/mmcblk0p7</span>
<span class="code-line">lrwxrwxrwx <span class="m">1</span> root root <span class="m">21</span> <span class="m">1970</span>-02-24 <span class="m">06</span>:55 abootBackup -> /dev/block/mmcblk0p13</span>
<span class="code-line">lrwxrwxrwx <span class="m">1</span> root root <span class="m">21</span> <span class="m">1970</span>-02-24 <span class="m">06</span>:55 boot -> /dev/block/mmcblk0p37</span>
<span class="code-line">lrwxrwxrwx <span class="m">1</span> root root <span class="m">21</span> <span class="m">1970</span>-02-24 <span class="m">06</span>:55 cache -> /dev/block/mmcblk0p38</span>
<span class="code-line">lrwxrwxrwx <span class="m">1</span> root root <span class="m">21</span> <span class="m">1970</span>-02-24 <span class="m">06</span>:55 cid -> /dev/block/mmcblk0p29</span>
<span class="code-line">lrwxrwxrwx <span class="m">1</span> root root <span class="m">20</span> <span class="m">1970</span>-02-24 <span class="m">06</span>:55 ddr -> /dev/block/mmcblk0p6</span>
<span class="code-line">lrwxrwxrwx <span class="m">1</span> root root <span class="m">21</span> <span class="m">1970</span>-02-24 <span class="m">06</span>:55 frp -> /dev/block/mmcblk0p18</span>
<span class="code-line">lrwxrwxrwx <span class="m">1</span> root root <span class="m">21</span> <span class="m">1970</span>-02-24 <span class="m">06</span>:55 keystore -> /dev/block/mmcblk0p24</span>
<span class="code-line">lrwxrwxrwx <span class="m">1</span> root root <span class="m">21</span> <span class="m">1970</span>-02-24 <span class="m">06</span>:55 kpan -> /dev/block/mmcblk0p36</span>
<span class="code-line">lrwxrwxrwx <span class="m">1</span> root root <span class="m">21</span> <span class="m">1970</span>-02-24 <span class="m">06</span>:55 logo -> /dev/block/mmcblk0p30</span>
<span class="code-line">lrwxrwxrwx <span class="m">1</span> root root <span class="m">21</span> <span class="m">1970</span>-02-24 <span class="m">06</span>:55 logs -> /dev/block/mmcblk0p25</span>
<span class="code-line">lrwxrwxrwx <span class="m">1</span> root root <span class="m">21</span> <span class="m">1970</span>-02-24 <span class="m">06</span>:55 mdm1dhob -> /dev/block/mmcblk0p28</span>
<span class="code-line">lrwxrwxrwx <span class="m">1</span> root root <span class="m">21</span> <span class="m">1970</span>-02-24 <span class="m">06</span>:55 mdm1hob -> /dev/block/mmcblk0p27</span>
<span class="code-line">lrwxrwxrwx <span class="m">1</span> root root <span class="m">21</span> <span class="m">1970</span>-02-24 <span class="m">06</span>:55 mdm1m9kefs1 -> /dev/block/mmcblk0p19</span>
<span class="code-line">lrwxrwxrwx <span class="m">1</span> root root <span class="m">21</span> <span class="m">1970</span>-02-24 <span class="m">06</span>:55 mdm1m9kefs2 -> /dev/block/mmcblk0p20</span>
<span class="code-line">lrwxrwxrwx <span class="m">1</span> root root <span class="m">21</span> <span class="m">1970</span>-02-24 <span class="m">06</span>:55 mdm1m9kefs3 -> /dev/block/mmcblk0p21</span>
<span class="code-line">lrwxrwxrwx <span class="m">1</span> root root <span class="m">21</span> <span class="m">1970</span>-02-24 <span class="m">06</span>:55 mdm1m9kefsc -> /dev/block/mmcblk0p33</span>
<span class="code-line">lrwxrwxrwx <span class="m">1</span> root root <span class="m">20</span> <span class="m">1970</span>-02-24 <span class="m">06</span>:55 metadata -> /dev/block/mmcblk0p2</span>
<span class="code-line">lrwxrwxrwx <span class="m">1</span> root root <span class="m">21</span> <span class="m">1970</span>-02-24 <span class="m">06</span>:55 misc -> /dev/block/mmcblk0p31</span>
<span class="code-line">lrwxrwxrwx <span class="m">1</span> root root <span class="m">20</span> <span class="m">1970</span>-02-24 <span class="m">06</span>:55 modem -> /dev/block/mmcblk0p1</span>
<span class="code-line">lrwxrwxrwx <span class="m">1</span> root root <span class="m">21</span> <span class="m">1970</span>-02-24 <span class="m">06</span>:55 oem -> /dev/block/mmcblk0p39</span>
<span class="code-line">lrwxrwxrwx <span class="m">1</span> root root <span class="m">21</span> <span class="m">1970</span>-02-24 <span class="m">06</span>:55 padA -> /dev/block/mmcblk0p11</span>
<span class="code-line">lrwxrwxrwx <span class="m">1</span> root root <span class="m">21</span> <span class="m">1970</span>-02-24 <span class="m">06</span>:55 padB -> /dev/block/mmcblk0p22</span>
<span class="code-line">lrwxrwxrwx <span class="m">1</span> root root <span class="m">21</span> <span class="m">1970</span>-02-24 <span class="m">06</span>:55 padC -> /dev/block/mmcblk0p40</span>
<span class="code-line">lrwxrwxrwx <span class="m">1</span> root root <span class="m">21</span> <span class="m">1970</span>-02-24 <span class="m">06</span>:55 padD -> /dev/block/mmcblk0p32</span>
<span class="code-line">lrwxrwxrwx <span class="m">1</span> root root <span class="m">21</span> <span class="m">1970</span>-02-24 <span class="m">06</span>:55 persist -> /dev/block/mmcblk0p26</span>
<span class="code-line">lrwxrwxrwx <span class="m">1</span> root root <span class="m">21</span> <span class="m">1970</span>-02-24 <span class="m">06</span>:55 recovery -> /dev/block/mmcblk0p35</span>
<span class="code-line">lrwxrwxrwx <span class="m">1</span> root root <span class="m">20</span> <span class="m">1970</span>-02-24 <span class="m">06</span>:55 rpm -> /dev/block/mmcblk0p8</span>
<span class="code-line">lrwxrwxrwx <span class="m">1</span> root root <span class="m">21</span> <span class="m">1970</span>-02-24 <span class="m">06</span>:55 rpmBackup -> /dev/block/mmcblk0p14</span>
<span class="code-line">lrwxrwxrwx <span class="m">1</span> root root <span class="m">20</span> <span class="m">1970</span>-02-24 <span class="m">06</span>:55 sbl1 -> /dev/block/mmcblk0p3</span>
<span class="code-line">lrwxrwxrwx <span class="m">1</span> root root <span class="m">21</span> <span class="m">1970</span>-02-24 <span class="m">06</span>:55 sbl1bak -> /dev/block/mmcblk0p12</span>
<span class="code-line">lrwxrwxrwx <span class="m">1</span> root root <span class="m">20</span> <span class="m">1970</span>-02-24 <span class="m">06</span>:55 sdi -> /dev/block/mmcblk0p4</span>
<span class="code-line">lrwxrwxrwx <span class="m">1</span> root root <span class="m">20</span> <span class="m">1970</span>-02-24 <span class="m">06</span>:55 sec -> /dev/block/mmcblk0p5</span>
<span class="code-line">lrwxrwxrwx <span class="m">1</span> root root <span class="m">21</span> <span class="m">1970</span>-02-24 <span class="m">06</span>:55 sp -> /dev/block/mmcblk0p23</span>
<span class="code-line">lrwxrwxrwx <span class="m">1</span> root root <span class="m">21</span> <span class="m">1970</span>-02-24 <span class="m">06</span>:55 ssd -> /dev/block/mmcblk0p34</span>
<span class="code-line">lrwxrwxrwx <span class="m">1</span> root root <span class="m">21</span> <span class="m">1970</span>-02-24 <span class="m">06</span>:55 system -> /dev/block/mmcblk0p41</span>
<span class="code-line">lrwxrwxrwx <span class="m">1</span> root root <span class="m">21</span> <span class="m">1970</span>-02-24 <span class="m">06</span>:55 tz -> /dev/block/mmcblk0p10</span>
<span class="code-line">lrwxrwxrwx <span class="m">1</span> root root <span class="m">21</span> <span class="m">1970</span>-02-24 <span class="m">06</span>:55 tzBackup -> /dev/block/mmcblk0p16</span>
<span class="code-line">lrwxrwxrwx <span class="m">1</span> root root <span class="m">21</span> <span class="m">1970</span>-02-24 <span class="m">06</span>:55 userdata -> /dev/block/mmcblk0p42</span>
<span class="code-line">lrwxrwxrwx <span class="m">1</span> root root <span class="m">20</span> <span class="m">1970</span>-02-24 <span class="m">06</span>:55 utags -> /dev/block/mmcblk0p9</span>
<span class="code-line">lrwxrwxrwx <span class="m">1</span> root root <span class="m">21</span> <span class="m">1970</span>-02-24 <span class="m">06</span>:55 utagsBackup -> /dev/block/mmcblk0p15</span>
<span class="code-line">lrwxrwxrwx <span class="m">1</span> root root <span class="m">21</span> <span class="m">1970</span>-02-24 <span class="m">06</span>:55 versions -> /dev/block/mmcblk0p17</span>
</pre></div>
<p>以第一行为例,大概可以这样写:</p>
<blockquote>
-e 's block/platform/msm_sdcc.1/by-name/aboot mmcblk0p7 ' </blockquote>
<p>以此类推,可以考虑写个脚本简化这一过程,不过记住最后的反斜线后面应该是啥都没有的 😂
(说多了都是眼泪啊……)</p>
</div>
<div class="section" id="hybris-hal">
<h2><a class="toc-backref" href="#id3">编译 hybris-hal</a></h2>
<p>设置相应的环境变量:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># 就是汝上一节写的那个啦</span></span>
<span class="code-line">$ <span class="nb">source</span> ~/.hadk.env</span>
<span class="code-line">$ <span class="nb">cd</span> <span class="nv">$ANDROID_ROOT</span></span>
<span class="code-line"><span class="c1"># 换 python2</span></span>
<span class="code-line">$ <span class="nb">source</span> venv/bin/activate</span>
<span class="code-line"><span class="c1"># 如果硬盘够用的话,可以考虑用 ccache 缓存中间文件加速编译</span></span>
<span class="code-line">$ <span class="nb">export</span> <span class="nv">USE_CCACHE</span><span class="o">=</span><span class="m">1</span></span>
<span class="code-line"><span class="c1"># 设置编译 Android 的环境变量</span></span>
<span class="code-line">$ <span class="nb">source</span> build/envsetup.sh</span>
<span class="code-line">$ <span class="nb">export</span> <span class="nv">LC_ALL</span><span class="o">=</span>C</span>
<span class="code-line">$ breakfast <span class="nv">$DEVICE</span></span>
</pre></div>
<p>然后开始编译:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># 和其它编译类似,可以通过 -j 并行编译提高速度。</span></span>
<span class="code-line">$ make -j4 hybris-hal</span>
</pre></div>
<p>检查内核配置是否符合 hybris 的需要:</p>
<div class="highlight"><pre><span class="code-line"><span></span>$ hybris/mer-kernel-check/mer_verify_kernel_config ./out/target/product/<span class="nv">$DEVICE</span>/obj/KERNEL_OBJ/.config</span>
<span class="code-line"></span>
<span class="code-line">WARNING: CONFIG_CGROUP_MEM_RES_CTLR_KMEM is invalid</span>
<span class="code-line">It is <span class="nb">unset</span></span>
<span class="code-line">Allowed values : y, !</span>
<span class="code-line">Comment says: systemd <span class="o">(</span>optional<span class="o">)</span>: http://0pointer.de/blog/projects/cgroups-vs-cgroups.html</span>
<span class="code-line"></span>
<span class="code-line">WARNING: CONFIG_SECURITY_SELINUX_BOOTPARAM is invalid</span>
<span class="code-line">It is <span class="nb">unset</span></span>
<span class="code-line">Allowed values : y, !</span>
<span class="code-line">Comment says: Required by hybris, SELinux needs to be disabled.</span>
<span class="code-line">Leave as not set, <span class="k">if</span> you have <span class="nb">unset</span> AUDIT <span class="o">(</span><span class="nb">read</span> more about the CONFIG_AUDIT flag<span class="o">)</span></span>
<span class="code-line"></span>
<span class="code-line">WARNING: CONFIG_CGROUP_MEM_RES_CTLR_SWAP is invalid</span>
<span class="code-line">It is <span class="nb">unset</span></span>
<span class="code-line">Allowed values : y, !</span>
<span class="code-line">Comment says: systemd <span class="o">(</span>optional<span class="o">)</span>: http://0pointer.de/blog/projects/cgroups-vs-cgroups.html</span>
<span class="code-line"></span>
<span class="code-line">WARNING: CONFIG_CGROUP_MEM_RES_CTLR is invalid</span>
<span class="code-line">It is <span class="nb">unset</span></span>
<span class="code-line">Allowed values : y, !</span>
<span class="code-line">Comment says: systemd <span class="o">(</span>optional<span class="o">)</span>: http://0pointer.de/blog/projects/cgroups-vs-cgroups.html</span>
<span class="code-line"></span>
<span class="code-line">WARNING: CONFIG_FW_LOADER_USER_HELPER is invalid</span>
<span class="code-line">Value is: y</span>
<span class="code-line">Allowed values : n, !</span>
<span class="code-line">Comment says: it<span class="err">'</span>s actually needed by some Lollipop based devices<span class="p">;</span></span>
<span class="code-line">systemd<span class="o">(</span>optional<span class="o">)</span>: http://cgit.freedesktop.org/systemd/systemd/commit/README?id<span class="o">=</span>713bc0cfa477ca1df8769041cb3dbc83c10eace2</span>
</pre></div>
<p>可(ken)能(ding)会出一些 ERROR 和 WARNING ,按提示去改汝的 defconfig 去吧……</p>
<blockquote>
<p>啥?汝不知道汝的 defconfig 是哪个?这里有几种确定的方法:</p>
<ul class="simple">
<li>看 $ANDROID_ROOT/device/$VENDOR/*/BoardConfig*.mk 里的 TARGET_KERNEL_CONFIG</li>
<li>或者去 kernel/arch/arm/configs 里按 codename 瞅瞅? 😂</li>
</ul>
</blockquote>
<p>编辑完以后 make -j4 hybris-boot 重新生成内核再来一遍。
以及因为内核配置可能有依赖关系和这个检测脚本有点老的缘故,有时汝改了 defconfig 警告还是有 😂,
只要没有 ERROR 多半就 OK 😂</p>
<p>如果已经尽力消除所有 ERROR 和大多数 or 全部 WARNING以后,运行 make hybris-recovery 生成恢复内核。</p>
<hr class="docutils"/>
<p>未完待续 *2 😂</p>
</div>
Sailfish OS 移植中(0)- 挖坑2018-06-05T00:00:00+08:002018-08-01T00:00:00+08:00ホロtag:None,2018-06-05:/sailfish/porting_sailfishos_0.html
<p>心血来潮,能不能成功还是个未知数 _(:з」∠)_</p>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id6">那么问题来了……</a></h2>
<blockquote>
Sailfish OS 是啥来着?</blockquote>
<p>(此处应有斜眼)</p>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id7">先决条件</a></h2>
<ul class="simple">
<li>一部支持 Cyanogenmod/LineageOS 的手机</li>
<li><dl class="first docutils">
<dt>一台电脑,至少要有 4 GiB 内存和 16 GiB 硬盘的电脑</dt>
<dd><ul class="first last">
<li>如果用 ccache 的话需要更多硬盘</li>
<li>当然是多多益善啦~</li>
</ul>
</dd>
</dl>
</li>
<li><a class="reference external" href="https://sailfishos.org/wp-content/uploads/2017/09/SailfishOS-HardwareAdaptationDevelopmentKit-2.0.1.pdf">SailfishOS-HardwareAdaptationDevelopmentKit,官方的移植文档</a></li>
<li>一个网速 OK 的梯子</li>
</ul>
</div>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id8">事前准备</a></h2>
<blockquote>
咱是在 Parabola GNU/Linux Libre 上编译的,于是 Arch GNU/Linux 应该也可以用。
其它发行版就自行按图索骥好了 😂</blockquote>
<p>安装编译 LineageOS 需要的软件
(因为现在移植到 Android …</p></div>
<p>心血来潮,能不能成功还是个未知数 _(:з」∠)_</p>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id6">那么问题来了……</a></h2>
<blockquote>
Sailfish OS 是啥来着?</blockquote>
<p>(此处应有斜眼)</p>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id7">先决条件</a></h2>
<ul class="simple">
<li>一部支持 Cyanogenmod/LineageOS 的手机</li>
<li><dl class="first docutils">
<dt>一台电脑,至少要有 4 GiB 内存和 16 GiB 硬盘的电脑</dt>
<dd><ul class="first last">
<li>如果用 ccache 的话需要更多硬盘</li>
<li>当然是多多益善啦~</li>
</ul>
</dd>
</dl>
</li>
<li><a class="reference external" href="https://sailfishos.org/wp-content/uploads/2017/09/SailfishOS-HardwareAdaptationDevelopmentKit-2.0.1.pdf">SailfishOS-HardwareAdaptationDevelopmentKit,官方的移植文档</a></li>
<li>一个网速 OK 的梯子</li>
</ul>
</div>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id8">事前准备</a></h2>
<blockquote>
咱是在 Parabola GNU/Linux Libre 上编译的,于是 Arch GNU/Linux 应该也可以用。
其它发行版就自行按图索骥好了 😂</blockquote>
<p>安装编译 LineageOS 需要的软件
(因为现在移植到 Android 手机上的 Sailfish OS 是在 Android 上用 hybris 跑起来一个 GNU/Linux 的
用户空间嘛), AUR 上有个 lineageos-devel 的 metapackage。</p>
<blockquote>
可以参考 <a class="reference external" href="https://wiki.archlinux.org/index.php/Android#Building">https://wiki.archlinux.org/index.php/Android#Building</a></blockquote>
<p>因为要拖源代码回来,所以装个 git 和 repo ,然后设置一下汝的名称和邮箱(如果汝以前用过 Git 的话可以跳过这一步):</p>
<blockquote>
<p>git config --global user.name "Your Name"</p>
<p>git config --global user.email "<a class="reference external" href="mailto:you@example.com">you@example.com</a>"</p>
</blockquote>
</div>
<div class="section" id="id4">
<h2><a class="toc-backref" href="#id9">设置相应的环境变量</a></h2>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># ~/.hadk.env</span></span>
<span class="code-line"><span class="c1"># Mer SDK 的位置</span></span>
<span class="code-line"><span class="nb">export</span> <span class="nv">MER_ROOT</span><span class="o">=</span>/srv/mer</span>
<span class="code-line"><span class="nb">export</span> <span class="nv">PLATFORM_SDK_ROOT</span><span class="o">=</span><span class="nv">$MER_ROOT</span></span>
<span class="code-line"><span class="c1"># 移植到的目标手机的厂商和代号,可以去 LineageOS Wiki 上找到</span></span>
<span class="code-line"><span class="nb">export</span> <span class="nv">VENDOR</span><span class="o">=</span><span class="s2">"moto"</span></span>
<span class="code-line"><span class="nb">export</span> <span class="nv">DEVICE</span><span class="o">=</span><span class="s2">"shamu"</span></span>
<span class="code-line"><span class="c1"># 移植的架构,和手机有关</span></span>
<span class="code-line"><span class="nb">export</span> <span class="nv">PORT_ARCH</span><span class="o">=</span><span class="s2">"armv7hl"</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="c1"># 要移植的 hybris 和 Sailfish OS 版本</span></span>
<span class="code-line"><span class="nb">export</span> <span class="nv">ROOMSERVICE_BRANCHES</span><span class="o">=</span><span class="s2">"cm-14.1"</span></span>
<span class="code-line"><span class="nb">export</span> <span class="nv">HYBRIS_BRANCH</span><span class="o">=</span><span class="s2">"hybris-14.1"</span></span>
<span class="code-line"><span class="nb">export</span> <span class="nv">SAILFISH_VERSION</span><span class="o">=</span><span class="m">2</span>.1.4.13</span>
<span class="code-line"></span>
<span class="code-line"><span class="c1"># 源代码放在哪</span></span>
<span class="code-line"><span class="nb">export</span> <span class="nv">ANDROID_ROOT</span><span class="o">=</span>/home/repo/libhybris</span>
</pre></div>
</div>
<div class="section" id="id5">
<h2><a class="toc-backref" href="#id10">下载源代码</a></h2>
<p>初始化仓库:</p>
<div class="highlight"><pre><span class="code-line"><span></span>$ mkdir -p <span class="nv">$ANDROID_ROOT</span></span>
<span class="code-line">$ <span class="nb">cd</span> <span class="nv">$ANDROID_ROOT</span></span>
<span class="code-line">$ repo init -u git://github.com/mer-hybris/android.git -b <span class="nv">$HYBRIS_BRANCH</span></span>
</pre></div>
<p>设置本地清单,用汝喜欢的文字编辑器打开 $ANDROID_ROOT/.repo/local_manifests
(需要的话就新建一个),然后建立一个 {{汝设备的代号}}.xml ,加入适当的 repo :</p>
<ul class="simple">
<li>至少需要 Device 和 kernel ,在 Github 上搜索一下 “android_[device,kernel]_$VENDOR_$DEVICE”看看?</li>
</ul>
<p>例如咱的 shamu :</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="cp"><?xml version="1.0" encoding="UTF-8"?></span></span>
<span class="code-line"><span class="nt"><manifest></span></span>
<span class="code-line"> <span class="nt"><project</span> <span class="na">path=</span><span class="s">"device/moto/shamu"</span> <span class="na">remote=</span><span class="s">"private"</span> <span class="na">name=</span><span class="s">"KenOokamihoro/android_device_moto_shamu"</span></span>
<span class="code-line"> <span class="na">revision=</span><span class="s">"cm-14.1"</span> <span class="nt">/></span></span>
<span class="code-line"> <span class="nt"><project</span> <span class="na">path=</span><span class="s">"kernel/moto/shamu"</span> <span class="na">remote=</span><span class="s">"private"</span> <span class="na">name=</span><span class="s">"KenOokamiHoro/android_kernel_moto_shamu"</span></span>
<span class="code-line"> <span class="na">revision=</span><span class="s">"cm-14.1"</span> <span class="nt">/></span></span>
<span class="code-line"> <span class="nt"><project</span> <span class="na">name=</span><span class="s">"TheMuppets/proprietary_vendor_motorola"</span> <span class="na">path=</span><span class="s">"vendor/motorola"</span> <span class="na">revision=</span><span class="s">"cm-14.1"</span> <span class="nt">/></span></span>
<span class="code-line"> <span class="nt"><project</span> <span class="na">path=</span><span class="s">"rpm/"</span> <span class="na">name=</span><span class="s">"KenOokamiHoro/droid-hal-shamu"</span> <span class="na">revision=</span><span class="s">"master"</span> <span class="nt">/></span></span>
<span class="code-line"> <span class="nt"><project</span> <span class="na">path=</span><span class="s">"hybris/droid-configs"</span> <span class="na">name=</span><span class="s">"KenOokamiHoro/droid-config-shamu"</span> <span class="na">revision=</span><span class="s">"master"</span> <span class="nt">/></span></span>
<span class="code-line"> <span class="nt"><project</span> <span class="na">path=</span><span class="s">"hybris/droid-hal-version-shamu"</span> <span class="na">name=</span><span class="s">"KenOokamiHoro/droid-hal-version-shamu"</span></span>
<span class="code-line"> <span class="na">revision=</span><span class="s">"master"</span></span>
<span class="code-line"> <span class="nt">/></span></span>
<span class="code-line"><span class="nt"></manifest></span></span>
</pre></div>
<p>然后同步一下代码:</p>
<div class="highlight"><pre><span class="code-line"><span></span>$ repo sync --fetch-submodules</span>
</pre></div>
<ul class="simple">
<li>同步可能需要很长的时间,甚至有可能会失败,失败的话就多试几次 😂</li>
</ul>
</div>
<div class="section" id="python2">
<h2><a class="toc-backref" href="#id11">设置一个 Python2 虚拟环境</a></h2>
<blockquote>
因为 Android 这套工具还认为 python 是 python2 😂</blockquote>
<p>用汝喜欢的虚拟环境工具就 Ok 啦,例如 python2-virtualenv :</p>
<div class="highlight"><pre><span class="code-line"><span></span>$ virtualenv2 /path/to/your/virtualenv</span>
<span class="code-line"><span class="c1"># 以后要用的话:</span></span>
<span class="code-line">$ <span class="nb">source</span> /path/to/your/virtualenv/bin/activate</span>
</pre></div>
</div>
<div class="section" id="platform-sdk">
<h2><a class="toc-backref" href="#id12">安装 Platform SDK</a></h2>
<blockquote>
从官方文档里抄的 😂</blockquote>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># 下载并解压 SDK 的 chroot</span></span>
<span class="code-line"><span class="nb">export</span> <span class="nv">PLATFORM_SDK_ROOT</span><span class="o">=</span>/srv/mer</span>
<span class="code-line">curl -k -O http://releases.sailfishos.org/sdk/installers/latest/Jolla-latest-SailfishOS_Platform_SDK_Chroot-i486.tar.bz2 <span class="p">;</span></span>
<span class="code-line">sudo mkdir -p <span class="nv">$PLATFORM_SDK_ROOT</span>/sdks/sfossdk <span class="p">;</span></span>
<span class="code-line">sudo tar --numeric-owner -p -xjf Jolla-latest-SailfishOS_Platform_SDK_Chroot-i486.tar.bz2 -C <span class="nv">$PLATFORM_SDK_ROOT</span>/sdks/sfossdk <span class="p">;</span></span>
<span class="code-line"><span class="c1"># 为 .bashrc 设置相应的 PS1 ,alias 和环境变量 (其它 Shell 用户请自行依样画葫芦)</span></span>
<span class="code-line"><span class="nb">echo</span> <span class="s2">"export PLATFORM_SDK_ROOT=</span><span class="nv">$PLATFORM_SDK_ROOT</span><span class="s2">"</span> >> ~/.bashrc</span>
<span class="code-line"><span class="nb">echo</span> <span class="s1">'alias sfossdk=$PLATFORM_SDK_ROOT/sdks/sfossdk/mer-sdk-chroot'</span> >> ~/.bashrc <span class="p">;</span> <span class="nb">exec</span> bash <span class="p">;</span></span>
<span class="code-line"><span class="nb">echo</span> <span class="s1">'PS1="PlatformSDK $PS1"'</span> > ~/.mersdk.profile <span class="p">;</span></span>
<span class="code-line"><span class="nb">echo</span> <span class="s1">'[ -d /etc/bash_completion.d ] && for i in /etc/bash_completion.d/*;do . $i;done'</span> >> ~/.mersdk.profile <span class="p">;</span></span>
<span class="code-line"><span class="c1"># 进去 😂</span></span>
<span class="code-line">sfossdk</span>
</pre></div>
<p>下载工具:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># 安装工具链</span></span>
<span class="code-line">sudo zypper in android-tools-hadk tar</span>
<span class="code-line"><span class="c1"># 安装通用工具链</span></span>
<span class="code-line"><span class="c1"># sdk-manage target install <name> <url> --tooling <name> --toolchain <name></span></span>
<span class="code-line">sdk-manage target install SailfishOS-latest-armv7hl http://releases.sailfishos.org/sdk/latest/Jolla-latest-Sailfish_SDK_Target-armv7hl.tar.bz2 <span class="se">\</span></span>
<span class="code-line"> --tooling SailfishOS-latest --tooling-url http://releases.sailfishos.org/sdk/latest/Jolla-latest-Sailfish_SDK_Tooling-i486.tar.bz2</span>
<span class="code-line"><span class="c1"># 安装汝设备使用的工具链</span></span>
<span class="code-line"><span class="c1"># target 的名称命名为 $VENDOR-$DEVICE-$PORT_ARCH,tooling 的名称则是 $VENDOR-$DEVICE</span></span>
<span class="code-line">sdk-manage target install moto-shamu-armv7hl http://releases.sailfishos.org/sdk/latest/Jolla-latest-Sailfish_SDK_Target-armv7hl.tar.bz2 --tooling moto-shamu --tooling-url http://releases.sailfishos.org/sdk/latest/Jolla-latest-Sailfish_SDK_Tooling-i486.tar.bz2</span>
<span class="code-line"></span>
<span class="code-line"><span class="c1"># 更新 chroot</span></span>
<span class="code-line"><span class="c1"># 更新到最新的版本 (写这篇文章的时候最新的是 2.2.0.29)</span></span>
<span class="code-line">sudo ssu re <span class="m">2</span>.2.0.29</span>
<span class="code-line">sudo zypper ref</span>
<span class="code-line">sudo zypper dup</span>
</pre></div>
<hr class="docutils"/>
<p>未完待续 😂</p>
</div>
把电脑上的 Shadowsocks 配置分享给手机使用的一点思路2018-05-09T00:00:00+08:002018-05-09T00:00:00+08:00ホロtag:None,2018-05-09:/tech_misc/convert_ss_config_to_link.html
<p><del>限于 shadowsocks-libev</del> 😂</p>
<div class="section" id="id1">
<h2>问题</h2>
<p>手机上的 Shadowsocks 客户端只能从 ss:// 开头的链接读取配置,
并不能直接用 libev 的配置文件 😂</p>
</div>
<div class="section" id="windows">
<h2>Windows</h2>
<p>Windows 的 <a class="reference external" href="https://github.com/shadowsocks/shadowsocks-windows">Shadowsocks-windows</a> 是可以生成
ss:// 的链接的,还可以生成二维码,于是不在本文的讨论范围内 (雾</p>
</div>
<div class="section" id="id2">
<h2>生成链接</h2>
<p>一个普通的 Shadowsocks-libev 的配置文件大概长这样:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="p">{</span></span>
<span class="code-line"><span class="nt">"server"</span><span class="p">:</span><span class="s2">"server_address"</span><span class="p">,</span></span>
<span class="code-line"><span class="nt">"server_port"</span><span class="p">:</span><span class="mi">9999</span><span class="p">,</span></span>
<span class="code-line"><span class="nt">"local_address"</span><span class="p">:</span> <span class="s2">"127.0.0.1"</span><span class="p">,</span></span>
<span class="code-line"><span class="nt">"local_port"</span><span class="p">:</span><span class="mi">8888</span><span class="p">,</span></span>
<span class="code-line"><span class="nt">"password"</span><span class="p">:</span><span class="s2">"some_password"</span><span class="p">,</span></span>
<span class="code-line"><span class="nt">"timeout"</span><span class="p">:</span><span class="mi">300</span><span class="p">,</span></span>
<span class="code-line"><span class="nt">"method"</span><span class="p">:</span><span class="s2">"aes-128-gcm"</span><span class="p">,</span></span>
<span class="code-line"><span class="p">}</span></span>
</pre></div>
<p>在 Python 里可以用 json.read() 把 JSON 文件转换成一个字典 …</p></div>
<p><del>限于 shadowsocks-libev</del> 😂</p>
<div class="section" id="id1">
<h2>问题</h2>
<p>手机上的 Shadowsocks 客户端只能从 ss:// 开头的链接读取配置,
并不能直接用 libev 的配置文件 😂</p>
</div>
<div class="section" id="windows">
<h2>Windows</h2>
<p>Windows 的 <a class="reference external" href="https://github.com/shadowsocks/shadowsocks-windows">Shadowsocks-windows</a> 是可以生成
ss:// 的链接的,还可以生成二维码,于是不在本文的讨论范围内 (雾</p>
</div>
<div class="section" id="id2">
<h2>生成链接</h2>
<p>一个普通的 Shadowsocks-libev 的配置文件大概长这样:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="p">{</span></span>
<span class="code-line"><span class="nt">"server"</span><span class="p">:</span><span class="s2">"server_address"</span><span class="p">,</span></span>
<span class="code-line"><span class="nt">"server_port"</span><span class="p">:</span><span class="mi">9999</span><span class="p">,</span></span>
<span class="code-line"><span class="nt">"local_address"</span><span class="p">:</span> <span class="s2">"127.0.0.1"</span><span class="p">,</span></span>
<span class="code-line"><span class="nt">"local_port"</span><span class="p">:</span><span class="mi">8888</span><span class="p">,</span></span>
<span class="code-line"><span class="nt">"password"</span><span class="p">:</span><span class="s2">"some_password"</span><span class="p">,</span></span>
<span class="code-line"><span class="nt">"timeout"</span><span class="p">:</span><span class="mi">300</span><span class="p">,</span></span>
<span class="code-line"><span class="nt">"method"</span><span class="p">:</span><span class="s2">"aes-128-gcm"</span><span class="p">,</span></span>
<span class="code-line"><span class="p">}</span></span>
</pre></div>
<p>在 Python 里可以用 json.read() 把 JSON 文件转换成一个字典:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># 偷点懒不单独写一行开文件啦……</span></span>
<span class="code-line"><span class="kn">import</span> <span class="nn">json</span></span>
<span class="code-line"><span class="n">config</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="nb">open</span><span class="p">(</span><span class="s2">"/path/to/config.json"</span><span class="p">))</span></span>
</pre></div>
<p>一个普通的 ss:// 链接大概像这样</p>
<blockquote>
ss://{base64编码过的加密方式和密码,中间用冒号分开}@服务器:端口?插件;插件选项#配置名称</blockquote>
<p>如果服务器是个 IPv6 地址,那么两边包上中括号……</p>
<p>对一个字符串直接 encode() 就有二进制流,反过来对着二进制流 decode() 就可以有字符串(感觉这说法好不正经 😂)</p>
<p>以及可以用 base64 模块对二进制流进行 base64 编码和解码:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="kn">import</span> <span class="nn">base64</span></span>
<span class="code-line"><span class="n">encoded</span> <span class="o">=</span> <span class="n">base64</span><span class="o">.</span><span class="n">encodebytes</span><span class="p">(</span><span class="s2">"some_string"</span><span class="o">.</span><span class="n">encode</span><span class="p">())</span></span>
</pre></div>
<p>当然出来的也是个二进制流,需要的话可以再整成字符串,以及消除空白 😂</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="n">encoded_string</span> <span class="o">=</span> <span class="n">encoded</span><span class="o">.</span><span class="n">decode</span><span class="p">()</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span></span>
</pre></div>
<p>其它的选项从配置文件里直接读就好,配置名称需要的话就写一个。</p>
</div>
<div class="section" id="id3">
<h2>生成二维码</h2>
<p>方法有很多 😂 例如用 pypi 里的 qrcode:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="kn">import</span> <span class="nn">qrcode</span></span>
<span class="code-line"><span class="n">img</span> <span class="o">=</span> <span class="n">qrcode</span><span class="o">.</span><span class="n">make</span><span class="p">(</span><span class="s2">"some_text"</span><span class="p">)</span></span>
</pre></div>
<p>需要的话可以把这个图像保存到某个地方,然后打开它:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="n">img</span><span class="o">.</span><span class="n">save</span><span class="p">(</span><span class="s2">"/path/to/images"</span><span class="p">)</span></span>
</pre></div>
<p>要在 Python 里运行其它程序?最简单的方法是 os.system() 😂 稍微复杂一点的可以试试 Subprocess:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="kn">import</span> <span class="nn">os</span></span>
<span class="code-line"><span class="kn">import</span> <span class="nn">subprocess</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="n">os</span><span class="o">.</span><span class="n">system</span><span class="p">(</span><span class="s2">"xdg-open /path/to/images"</span><span class="p">)</span></span>
<span class="code-line"><span class="n">subprocess</span><span class="o">.</span><span class="n">Call</span><span class="p">([</span><span class="s2">"xdg-open"</span><span class="p">,</span><span class="s2">"/path/to/images"</span><span class="p">])</span></span>
</pre></div>
<p>这样就会用默认的图片查看器打开刚生成的二维码啦,用汝的手机扫一下看看? 😂</p>
<p><del>水文 +1……</del></p>
</div>
GNU/Linux 中为不同的应用程序设置代理2018-04-17T00:00:00+08:002018-04-17T00:00:00+08:00ホロtag:None,2018-04-17:/linux/gnu_linux_setup_proxy.html
<p>方法挺多……</p>
<div class="section" id="web-firefox-chromium">
<h2><a class="toc-backref" href="#id2">Web 浏览器(例如 Firefox 和 Chromium)</a></h2>
<p>Firefox 可以在设置中自行设置
(参见 <a class="reference external" href="https://support.mozilla.org/en-US/kb/connection-settings-firefox">https://support.mozilla.org/en-US/kb/connection-settings-firefox</a> )。</p>
<p>Chromium 默认会用系统的代理设置,不过可以用一个命令行选项强行在这次会话中使用代理,例如:</p>
<blockquote>
chromium --proxy-server="socks5://127.0.0.1:1080" --host-resolver-rules="MAP * 0.0.0.0 , EXCLUDE localhost"</blockquote>
<p>不过也可以用个代理扩展,例如 <a class="reference external" href="https://github.com/FelisCatus/SwitchyOmega">SwitchyOmega</a></p>
</div>
<div class="section" id="gnome-3">
<h2><a class="toc-backref" href="#id3">GNOME 3</a></h2>
<p>可以从设置-网络-网络代理中设置:</p>
<img alt="GNOME 3 的代理设置" class="materialboxed responsive-img" src="/images/GNU_Linux_Proxies/setting_up_proxy_gnome.png"/>
</div>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id4">某些其它应用(是哪些 😂)</a></h2>
<p>(例如 wget 和 curl),会使用形如 …</p></div>
<p>方法挺多……</p>
<div class="section" id="web-firefox-chromium">
<h2><a class="toc-backref" href="#id2">Web 浏览器(例如 Firefox 和 Chromium)</a></h2>
<p>Firefox 可以在设置中自行设置
(参见 <a class="reference external" href="https://support.mozilla.org/en-US/kb/connection-settings-firefox">https://support.mozilla.org/en-US/kb/connection-settings-firefox</a> )。</p>
<p>Chromium 默认会用系统的代理设置,不过可以用一个命令行选项强行在这次会话中使用代理,例如:</p>
<blockquote>
chromium --proxy-server="socks5://127.0.0.1:1080" --host-resolver-rules="MAP * 0.0.0.0 , EXCLUDE localhost"</blockquote>
<p>不过也可以用个代理扩展,例如 <a class="reference external" href="https://github.com/FelisCatus/SwitchyOmega">SwitchyOmega</a></p>
</div>
<div class="section" id="gnome-3">
<h2><a class="toc-backref" href="#id3">GNOME 3</a></h2>
<p>可以从设置-网络-网络代理中设置:</p>
<img alt="GNOME 3 的代理设置" class="materialboxed responsive-img" src="/images/GNU_Linux_Proxies/setting_up_proxy_gnome.png"/>
</div>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id4">某些其它应用(是哪些 😂)</a></h2>
<p>(例如 wget 和 curl),会使用形如 "proto_proxy" 的环境变量用来设置代理啦
(当然也有可能是全部大写的),例如:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># export var=value</span></span>
<span class="code-line"><span class="nb">export</span> <span class="nv">http_proxy</span><span class="o">=</span>http://10.203.0.1:5187/</span>
<span class="code-line"><span class="nb">export</span> <span class="nv">https_proxy</span><span class="o">=</span><span class="nv">$http_proxy</span></span>
<span class="code-line"><span class="nb">export</span> <span class="nv">ftp_proxy</span><span class="o">=</span><span class="nv">$http_proxy</span></span>
<span class="code-line"><span class="nb">export</span> <span class="nv">rsync_proxy</span><span class="o">=</span><span class="nv">$http_proxy</span></span>
<span class="code-line"><span class="nb">export</span> <span class="nv">no_proxy</span><span class="o">=</span><span class="s2">"localhost,127.0.0.1,localaddress,.localdomain.com"</span></span>
</pre></div>
<p>就设置成了 10.203.0.1:5187 作为 HTTP 代理,HTTPS、FTP 和 rsync 使用相同的代理。</p>
<p>于是可以把这样的语句写进一个脚本里在需要使用代理的时候 source 一下 😂</p>
<p>不过这样设置的环境变量一切换用户(例如 sudo)以后就没啦…… sudo 的话,可以用 -E 选项保持
环境变量,或者修改 /etc/sudoers 指定保持哪些环境变量:</p>
<div class="highlight"><pre><span class="code-line"><span></span>Defaults env_keep += "http_proxy https_proxy ftp_proxy no_proxy"</span>
</pre></div>
</div>
<div class="section" id="socks5">
<h2><a class="toc-backref" href="#id5">socks5 代理</a></h2>
<p>curl 和 pacman 可以设置 all_proxy 变量直接使用:</p>
<blockquote>
export all_proxy="socks5://your.proxy:1080"</blockquote>
<p>那剩下的怎么办 😂</p>
</div>
<div class="section" id="proxychains-socks5">
<h2><a class="toc-backref" href="#id6">用 proxychains 让应用使用 socks5 代理</a></h2>
<p>字如其名就是个链式代理工具啦 😂 Arch Linux 的话装上 proxychains-ng 就 OK 啦~</p>
<p>然后去修改 /etc/proxychains.conf ,选项有很多,
但是大多数时候只需要把最后一行换成汝自己的 socks5 代理的 IP 地址和端口就行😂</p>
<p>然后就可以像平常(?)一样:</p>
<blockquote>
proxychains -q /path/to/program</blockquote>
<p>有关 proxychains 的更多用法可以去参考它的文档: <a class="reference external" href="http://proxychains.sourceforge.net/">http://proxychains.sourceforge.net/</a></p>
</div>
<div class="section" id="privoxy-socks5-http">
<h2><a class="toc-backref" href="#id7">用 privoxy 把 socks5 代理转化成 http 代理</a></h2>
<blockquote>
<p>Privoxy是一款不进行网页缓存且自带过滤功能的代理服务器,针对HTTP、HTTPS协议。
通过其过滤功能,用户可以保护隐私、对网页内容进行过滤、管理Cookie,以及拦阻各种广告等。
Privoxy可以单机使用,也可以应用到多用户的网络。
它也可以与其他代理相连(通常与Squid一起使用),更可以突破互联网审查。</p>
<p class="attribution">—<a class="reference external" href="https://zh.wikipedia.org/wiki/Privoxy">https://zh.wikipedia.org/wiki/Privoxy</a></p>
</blockquote>
<p>同样 Arch Linux 上装上 privoxy 就 OK 😂</p>
<p>然后去修改 /etc/privoxy/config ,选项还是有很多 😂,
但是大多数情况下只需要加上一行:</p>
<div class="highlight"><pre><span class="code-line"><span></span># forward-socks5 target_pattern socks_proxy:port http_proxy:port</span>
<span class="code-line"># target_pattern 是 . 的话表示对所有域名适用</span>
<span class="code-line"># http_proxy 是 . 的话表示继续不使用 HTTP 代理转发……</span>
<span class="code-line">forward-socks5 . localhost:1080 .</span>
</pre></div>
<p>然后启动 privoxy 服务,把 HTTP 代理设置成 localhost:8118 就好 😂</p>
<p>有关 Privoxy 的更多用法可以去参考它的文档: <a class="reference external" href="http://www.privoxy.org/user-manual/">http://www.privoxy.org/user-manual/</a></p>
</div>
在 GNU/Linux 下制作 Windows 的安装 USB2018-04-10T00:00:00+08:002018-04-10T00:00:00+08:00ホロtag:None,2018-04-10:/linux/build_windows_install_medium_through_gnu_linux.html
<p>嗯……</p>
<div class="section" id="uefi">
<h2><a class="toc-backref" href="#id1">UEFI</a></h2>
<p>最简单的方法是把 U 盘格式化成 FAT32 文件系统,然后把 ISO 里的文件复制到 U 盘上。
(不是把那一个 ISO 文件复制到 U 盘上啦~)</p>
</div>
<div class="section" id="bios">
<h2><a class="toc-backref" href="#id2">BIOS</a></h2>
<p>貌似直接 dd 不起作用……</p>
<p>有人说 unetbootin 可行,但是咱装好以后一片空白…… 😂</p>
<p>或者开个 Windows 虚拟机试试 rufus 或者巨硬的 Media Creation Tool ?(……)</p>
<p>于是就 ms-sys 了(不是 msys 😂,是 <a class="reference external" href="http://ms-sys.sourceforge.net/">http://ms-sys.sourceforge.net/</a> )</p>
<ul>
<li><p class="first">首先把汝的 U 盘格式化成 MBR 分区表,然后新建一个 NTFS …</p></li></ul></div>
<p>嗯……</p>
<div class="section" id="uefi">
<h2><a class="toc-backref" href="#id1">UEFI</a></h2>
<p>最简单的方法是把 U 盘格式化成 FAT32 文件系统,然后把 ISO 里的文件复制到 U 盘上。
(不是把那一个 ISO 文件复制到 U 盘上啦~)</p>
</div>
<div class="section" id="bios">
<h2><a class="toc-backref" href="#id2">BIOS</a></h2>
<p>貌似直接 dd 不起作用……</p>
<p>有人说 unetbootin 可行,但是咱装好以后一片空白…… 😂</p>
<p>或者开个 Windows 虚拟机试试 rufus 或者巨硬的 Media Creation Tool ?(……)</p>
<p>于是就 ms-sys 了(不是 msys 😂,是 <a class="reference external" href="http://ms-sys.sourceforge.net/">http://ms-sys.sourceforge.net/</a> )</p>
<ul>
<li><p class="first">首先把汝的 U 盘格式化成 MBR 分区表,然后新建一个 NTFS 分区并把它设置成活动分区 (cfdisk 一气呵成(误))</p>
<blockquote>
<p>于是假设它是 /dev/sdb ,如果 mkfs.ntfs 的时候太慢的话可以加个 -Q 试试(</p>
</blockquote>
</li>
<li><p class="first">然后把 Windows 的安装 ISO 挂载上,里面的文件复制到 U 盘上。</p>
</li>
<li><p class="first">把 Windows 7 的 MBR 写进 U 盘里去:</p>
<blockquote>
<p>sudo ms-sys -7 /dev/sdb</p>
</blockquote>
</li>
<li><p class="first">把 NTFS 的 PBR 写进 U 盘的第一个分区(大概也是唯一一个)里去:</p>
<blockquote>
<p>sudo ms-sys -n /dev/sdb1</p>
</blockquote>
</li>
</ul>
<p>大概就可以用啦 😂 <del>于是咱又水了一次……</del></p>
</div>
所谓的近况2??2018-03-27T00:00:00+08:002018-03-27T00:00:00+08:00ホロtag:None,2018-03-27:/life/status_20180327.html<!-- PELICAN_BEGIN_SUMMARY
啥??😂😂 -->
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id6">从摸鱼中惊醒</a></h2>
<p>1月和2月,几乎全部家当都在学校(包括唯一一台放着登录 Github 和 VPS 的 SSH 私钥
和 GPG 私钥的笔记本),然后就咸了)</p>
<p>3月回学校以后又回到了以前沉迷游戏不能自拔的日子,又咸了……</p>
<p>😂</p>
</div>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id7">关于故人</a></h2>
<p>其实每个月都有不少人去世(参照 <a class="reference external" href="https://zh.wikipedia.org/wiki/Portal">https://zh.wikipedia.org/wiki/Portal</a>:讣闻 ),
不过听说霍金去和爱因斯坦谈笑风生(那天其实也是爱因斯坦诞辰)时还是有点震惊(误)。
虽然咱也就是翻过《时间简史》和《果壳中的宇宙》而已😞</p>
<p>然后过几天看到了这个:</p>
<blockquote class="twitter-tweet" data-lang="en">
<p dir="ltr" lang="zh">
<a href="https://twitter.com/ayakaneko?ref_src=twsrc%5Etfw">@ayakaneko</a>
已确定在下午两点自杀并抢救失败(信息来源于她父母)
</p>
— 羽毛💔 (@zhangyubaka)
<a href="https://twitter.com/zhangyubaka/status/977476026749009920?ref_src=twsrc%5Etfw">March 24, 2018</a>
</blockquote>
<script async="" charset="utf-8" src="https://platform.twitter.com/widgets.js"></script><p><del>其实和这俩人不能算是太熟</del> 😔 ,不过在几天之前 @zhangyubaka 就一直在寻求帮助了,
还试图去找 @ayakaneko …</p></div><!-- PELICAN_BEGIN_SUMMARY
啥??😂😂 -->
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id6">从摸鱼中惊醒</a></h2>
<p>1月和2月,几乎全部家当都在学校(包括唯一一台放着登录 Github 和 VPS 的 SSH 私钥
和 GPG 私钥的笔记本),然后就咸了)</p>
<p>3月回学校以后又回到了以前沉迷游戏不能自拔的日子,又咸了……</p>
<p>😂</p>
</div>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id7">关于故人</a></h2>
<p>其实每个月都有不少人去世(参照 <a class="reference external" href="https://zh.wikipedia.org/wiki/Portal">https://zh.wikipedia.org/wiki/Portal</a>:讣闻 ),
不过听说霍金去和爱因斯坦谈笑风生(那天其实也是爱因斯坦诞辰)时还是有点震惊(误)。
虽然咱也就是翻过《时间简史》和《果壳中的宇宙》而已😞</p>
<p>然后过几天看到了这个:</p>
<blockquote class="twitter-tweet" data-lang="en">
<p dir="ltr" lang="zh">
<a href="https://twitter.com/ayakaneko?ref_src=twsrc%5Etfw">@ayakaneko</a>
已确定在下午两点自杀并抢救失败(信息来源于她父母)
</p>
— 羽毛💔 (@zhangyubaka)
<a href="https://twitter.com/zhangyubaka/status/977476026749009920?ref_src=twsrc%5Etfw">March 24, 2018</a>
</blockquote>
<script async="" charset="utf-8" src="https://platform.twitter.com/widgets.js"></script><p><del>其实和这俩人不能算是太熟</del> 😔 ,不过在几天之前 @zhangyubaka 就一直在寻求帮助了,
还试图去找 @ayakaneko (虽然最后好像还是受到了威胁)。嘛现在就愿 Neko 安好吧~</p>
<p>有关事件的部分信息可以去看看某篇知乎专栏文章: <a class="reference external" href="https://zhuanlan.zhihu.com/p/34901959">https://zhuanlan.zhihu.com/p/34901959</a></p>
<p>呜呜……说不出话来,只能说咱没经历过不太懂得受到的伤害 😭</p>
</div>
<div class="section" id="id4">
<h2><a class="toc-backref" href="#id8">关于音乐游戏</a></h2>
<p>从一个跟风总结开始 😂</p>
<blockquote class="twitter-tweet" data-lang="en">
<p dir="ltr" lang="zh">
/me 跟风来总结一下咱自己玩过的吧😂<br/>现在经常玩的: IIDX,SDVX,Jubeat,maimai,Groove Coaster,Arcaea,Dynamix,Project DIVA Future Tone<br/>
现在在玩的;Cytus(1+2),OverRapid,Tone Sphere,Deemo,Superbeat XONIC,VOEZ<br/>
(未完待续)
<a href="https://t.co/4c0sWUz9K1">https://t.co/4c0sWUz9K1</a>
</p>
— ホロ 🐺 (@Ken_Ookami_Horo)
<a href="https://twitter.com/Ken_Ookami_Horo/status/978487109806800896?ref_src=twsrc%5Etfw">March 27, 2018</a>
</blockquote>
<script async="" charset="utf-8" src="https://platform.twitter.com/widgets.js"></script><p>休闲了好几年…… 😂 顺便给新的 <a class="reference external" href="https://t.me/mug_zh">https://t.me/mug_zh</a> 打个广告 (划掉</p>
</div>
<div class="section" id="id5">
<h2><a class="toc-backref" href="#id9">关于无名计划</a></h2>
<p>说的就是 <a class="reference external" href="https://github.com/KenOokamiHoro/it_have_not_get_a_name_yet">https://github.com/KenOokamiHoro/it_have_not_get_a_name_yet</a> 啦😂</p>
<p>感觉当初定下来的目标太大了的样子,又要 GNU/Linux ,还要兼顾一些隐私和安全保护相关
的知识……加上咱有没有那么多技能点……</p>
<p>曾经一度想用一个 GNU 钦定的 GNU/Linux 发行版(参见 <a class="reference external" href="https://www.gnu.org/distros/free-distros.html">https://www.gnu.org/distros/free-distros.html</a> ),
最后还是放弃了,Debian 其实也海星 😂</p>
<p><del>嘛总之还是慢慢填吧……</del></p>
</div>
啥??两年了???2017-12-31T00:00:00+08:002017-12-31T00:00:00+08:00ホロtag:None,2017-12-31:/life/two_years.html<!-- PELICAN_BEGIN_SUMMARY
其实还差几天😂 -->
<p>其实还差几天😂</p>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id6">状况</a></h2>
<blockquote>
其实咱四月才装上 Piwik ,于是下面的数据都是四月以后的了……</blockquote>
<img alt="PV" class="materialboxed responsive-img" src="/images/two_years/hits.png"/>
<p>嗯……每天大概有二三十个人来看咱的样子(</p>
<img alt="地图" class="materialboxed responsive-img" src="/images/two_years/maps.png"/>
<p>嗯……</p>
<img alt="设备s" class="materialboxed responsive-img" src="/images/two_years/devices.png"/>
<p>嗯……大概知道这个 vivo 是谁撑起来的了 😂</p>
<img alt="操作系统谱系" class="materialboxed responsive-img" src="/images/two_years/os.png"/>
<p>嗯……用 Android 和 GNU/Linux 的越来越多了嘛,不知道有没有一天能超过 Windows 用户)</p>
<img alt="os_and_browsers.png" class="materialboxed responsive-img" src="/images/two_years/os_and_browsers.png"/>
<p>嗯……和大局一样,Chrome依旧领跑。(怎么还有 QQ 浏览器和 MIUI ??😂</p>
<p>嗯…… 😂</p>
</div>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id7">活动</a></h2>
<ul class="simple">
<li>今年写的文章只有去年的一半……看来摸了不少🐟啊😂</li>
<li>搞了个 X230,自己刷上了 Coreboot 换上了新的无线网卡,装上了 Parabola( <del>似乎走上了一条不归路……</del> 😂)</li>
<li>自己建的 Telegram 群全都解散啦😂看来咱就是没有管理的能力啊……</li>
<li>突然从 FT 跳进了一个更大的坑,没错就是 …</li></ul></div><!-- PELICAN_BEGIN_SUMMARY
其实还差几天😂 -->
<p>其实还差几天😂</p>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id6">状况</a></h2>
<blockquote>
其实咱四月才装上 Piwik ,于是下面的数据都是四月以后的了……</blockquote>
<img alt="PV" class="materialboxed responsive-img" src="/images/two_years/hits.png"/>
<p>嗯……每天大概有二三十个人来看咱的样子(</p>
<img alt="地图" class="materialboxed responsive-img" src="/images/two_years/maps.png"/>
<p>嗯……</p>
<img alt="设备s" class="materialboxed responsive-img" src="/images/two_years/devices.png"/>
<p>嗯……大概知道这个 vivo 是谁撑起来的了 😂</p>
<img alt="操作系统谱系" class="materialboxed responsive-img" src="/images/two_years/os.png"/>
<p>嗯……用 Android 和 GNU/Linux 的越来越多了嘛,不知道有没有一天能超过 Windows 用户)</p>
<img alt="os_and_browsers.png" class="materialboxed responsive-img" src="/images/two_years/os_and_browsers.png"/>
<p>嗯……和大局一样,Chrome依旧领跑。(怎么还有 QQ 浏览器和 MIUI ??😂</p>
<p>嗯…… 😂</p>
</div>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id7">活动</a></h2>
<ul class="simple">
<li>今年写的文章只有去年的一半……看来摸了不少🐟啊😂</li>
<li>搞了个 X230,自己刷上了 Coreboot 换上了新的无线网卡,装上了 Parabola( <del>似乎走上了一条不归路……</del> 😂)</li>
<li>自己建的 Telegram 群全都解散啦😂看来咱就是没有管理的能力啊……</li>
<li>突然从 FT 跳进了一个更大的坑,没错就是 <del>NIMABE</del> BEMANI 😂</li>
<li>然后突然又和某个如梦方醒的学长一起学算法去了……</li>
<li>给别人安利音乐游戏然后自己被虐成渣…… 😂</li>
<li>剩下的全忘啦😂</li>
</ul>
</div>
<div class="section" id="id4">
<h2><a class="toc-backref" href="#id8">计划</a></h2>
<blockquote>
其实有没有计划好像都没啥区别😂</blockquote>
<ul class="simple">
<li>想考虑放个 PayPal 捐款链接上去(就是不知道哪里获取……)</li>
<li>或者像 uva 一样放个 coinhive js 上去(不过好像不少人讨厌的样子……)</li>
<li>不知道该写些啥……</li>
</ul>
</div>
<div class="section" id="id5">
<h2><a class="toc-backref" href="#id9">期望</a></h2>
<p>不只要成为回忆而已~</p>
<p>(诶咱在说些啥)</p>
</div>
X230 + Coreboot + me_cleaner + ...... = ?2017-12-11T00:00:00+08:002017-12-11T00:00:00+08:00ホロtag:None,2017-12-11:/tech_misc/x230_with_coreboot_and_me_cleaner.html
<p>为 ThinkPad X230 刷 Coreboot (</p>
<div class="section" id="id1">
<h2>预备知识</h2>
<ul class="simple">
<li>coreboot,原名LinuxBIOS,是一个旨在取代大多数计算机中专有韧体(BIOS或UEFI)的软件项目,
它采用轻量级固件设计,只执行加载和运行现代32位或64位操作系统所需的最少量任务。</li>
<li>me_cleaner 是一个移除固件中 Intel Management Engine 中非关键部分的 Python 脚本,
可以和 coreboot 结合使用。</li>
<li>Intel Management Engine 是一個擁有從底層控制硬件能力的、獨立與處理器和操作系統的框架,
它對於操作系統也是隱形的。簡單點說就是擁有極高的權限。
其中 Intel Active Management Technology(英特爾主動管理技術)
是運行與 ME 框架上的應用的一個例子。
(因为权限大又没有审计又经常爆出漏洞偶尔被戏称为 Malicious Engine)</li>
</ul>
<p>关于 Intel <del>Malicious</del> Management Engine 的问题
<a class="reference external" href="https://v2bv.net/2017/intel-me">某只咸鱼 …</a></p></div>
<p>为 ThinkPad X230 刷 Coreboot (</p>
<div class="section" id="id1">
<h2>预备知识</h2>
<ul class="simple">
<li>coreboot,原名LinuxBIOS,是一个旨在取代大多数计算机中专有韧体(BIOS或UEFI)的软件项目,
它采用轻量级固件设计,只执行加载和运行现代32位或64位操作系统所需的最少量任务。</li>
<li>me_cleaner 是一个移除固件中 Intel Management Engine 中非关键部分的 Python 脚本,
可以和 coreboot 结合使用。</li>
<li>Intel Management Engine 是一個擁有從底層控制硬件能力的、獨立與處理器和操作系統的框架,
它對於操作系統也是隱形的。簡單點說就是擁有極高的權限。
其中 Intel Active Management Technology(英特爾主動管理技術)
是運行與 ME 框架上的應用的一個例子。
(因为权限大又没有审计又经常爆出漏洞偶尔被戏称为 Malicious Engine)</li>
</ul>
<p>关于 Intel <del>Malicious</del> Management Engine 的问题
<a class="reference external" href="https://v2bv.net/2017/intel-me">某只咸鱼</a> 写的还算清楚,推荐去读一读。</p>
<p><del>其实就是想去掉原厂 BIOS 里的白名单而已……</del></p>
</div>
<div class="section" id="id3">
<h2>开始前要准备些啥?</h2>
<ul class="simple">
<li>一台 X230 (这不是废话嘛)</li>
<li>知道这样做可能会把电脑搞砖的风险(</li>
<li>一个编程器</li>
<li>另一台电脑(用于编译 coreboot 和操作编程器)</li>
<li>热风和焊接工具(用于取下 BIOS IC)</li>
<li>或者 SOP-8 测试夹(如果对自己的焊接技术没信心的话,<del>比如咱……</del> )</li>
</ul>
</div>
<div class="section" id="coreboot-flashrom">
<h2>取得 coreboot 和 flashrom 的源代码和制作工具链</h2>
<p>日常 git 两连:</p>
<blockquote>
<p>git clone <a class="reference external" href="https://review.coreboot.org/coreboot.git">https://review.coreboot.org/coreboot.git</a></p>
<p>git clone <a class="reference external" href="https://review.coreboot.org/flashrom.git">https://review.coreboot.org/flashrom.git</a></p>
</blockquote>
<p>安装制作工具链需要的依赖(如果是 Arch 的话,其他的系统就只好自己发挥了 😂)</p>
<blockquote>
pacman -S base-devel gcc-ada nasm</blockquote>
<p>从 AUR 装 uefitool-git(后面提取 VGA BIOS 需要)</p>
<p>然后在 coreboot 的目录下制作工具链:</p>
<blockquote>
make crossgcc</blockquote>
<p>其它的选项和用法去看看 make help 咯 😂</p>
</div>
<div class="section" id="blob">
<h2>备份原有固件和取出其中的 Blob</h2>
<p>拆开电脑的掌托,揭开防静电贴纸就能看到两块 BIOS 芯片啦……</p>
<img alt="两块 BIOS 芯片的位置" class="materialboxed responsive-img" src="/images/x230_with_coreboot_and_me_cleaner/chip.png"/>
<p>然后拿出编程器在另一台电脑上开始 Dump 固件吧,例如这样:</p>
<blockquote>
<p>flashrom 命令依编程器而异,不要照抄 😂</p>
<p>flashrom -p linux_spi:dev=/dev/spidev0.0 -r top.rom -c MX25L3206E/MX25L3208E</p>
<p>flashrom -p linux_spi:dev=/dev/spidev0.0 -r bottom.rom -c MX25L6406E/</p>
</blockquote>
<p>然后接起来:</p>
<blockquote>
cat bottom.rom top.rom > complete.rom</blockquote>
<p>最好多做几次然后验证一下散列值(为了确保备份的固件不是坏的?)</p>
<p>使固件可写(ifdtool 在 coreboot/utils 里)</p>
<div class="highlight"><pre><span class="code-line"><span></span>$ ~/repo/coreboot/util/ifdtool/ifdtool -u complete.rom</span>
<span class="code-line">File complete.rom is <span class="m">12582912</span> bytes</span>
<span class="code-line">Writing new image to complete.rom.new</span>
</pre></div>
<p>用 me_cleaner 清除非必需 ME 固件(也在 coreboot/utils 里)</p>
<div class="highlight"><pre><span class="code-line"><span></span>$ ~/repo/coreboot/util/me_cleaner/me_cleaner.py complete.rom.new</span>
<span class="code-line">Full image detected</span>
<span class="code-line">The ME/TXE region goes from 0x3000 to 0x500000</span>
<span class="code-line">Found FPT header at 0x3010</span>
<span class="code-line">Found <span class="m">23</span> partition<span class="o">(</span>s<span class="o">)</span></span>
<span class="code-line">Found FTPR header: FTPR partition spans from 0x183000 to 0x24d000</span>
<span class="code-line">ME/TXE firmware version <span class="m">8</span>.1.30.1350</span>
<span class="code-line">Removing extra partitions...</span>
<span class="code-line">Removing extra partition entries in FPT...</span>
<span class="code-line">Removing EFFS presence flag...</span>
<span class="code-line">Correcting checksum <span class="o">(</span>0x7b<span class="o">)</span>...</span>
<span class="code-line">Reading FTPR modules list...</span>
<span class="code-line">UPDATE <span class="o">(</span>LZMA , 0x1cf4f2 - 0x1cf6b0<span class="o">)</span>: removed</span>
<span class="code-line">ROMP <span class="o">(</span>Huffman, fragmented data <span class="o">)</span>: NOT removed, essential</span>
<span class="code-line">BUP <span class="o">(</span>Huffman, fragmented data <span class="o">)</span>: NOT removed, essential</span>
<span class="code-line">KERNEL <span class="o">(</span>Huffman, fragmented data <span class="o">)</span>: removed</span>
<span class="code-line">POLICY <span class="o">(</span>Huffman, fragmented data <span class="o">)</span>: removed</span>
<span class="code-line">HOSTCOMM <span class="o">(</span>LZMA , 0x1cf6b0 - 0x1d648b<span class="o">)</span>: removed</span>
<span class="code-line">RSA <span class="o">(</span>LZMA , 0x1d648b - 0x1db6e0<span class="o">)</span>: removed</span>
<span class="code-line">CLS <span class="o">(</span>LZMA , 0x1db6e0 - 0x1e0e71<span class="o">)</span>: removed</span>
<span class="code-line">TDT <span class="o">(</span>LZMA , 0x1e0e71 - 0x1e7556<span class="o">)</span>: removed</span>
<span class="code-line">FTCS <span class="o">(</span>Huffman, fragmented data <span class="o">)</span>: removed</span>
<span class="code-line">ClsPriv <span class="o">(</span>LZMA , 0x1e7556 - 0x1e7937<span class="o">)</span>: removed</span>
<span class="code-line">SESSMGR <span class="o">(</span>LZMA , 0x1e7937 - 0x1f6240<span class="o">)</span>: removed</span>
<span class="code-line">The ME minimum size should be <span class="m">1667072</span> bytes <span class="o">(</span>0x197000 bytes<span class="o">)</span></span>
<span class="code-line">The ME region can be reduced up to:</span>
<span class="code-line"><span class="m">00003000</span>:00199fff me</span>
<span class="code-line">Checking the FTPR RSA signature... VALID</span>
<span class="code-line">Done! Good luck!</span>
</pre></div>
<p>用 ich_descriptors_tool 取出 blob(这个在 flashrom/util 里):</p>
<div class="highlight"><pre><span class="code-line"><span></span>$ ~/repo/flashrom/util/ich_descriptors_tool/ich_descriptors_tool -f complete.rom.new -d</span>
<span class="code-line">The flash image has a size of <span class="m">12582912</span> <span class="o">[</span>0xc00000<span class="o">]</span> bytes.</span>
<span class="code-line">Assuming chipset <span class="s1">'6 series Cougar Point'</span>.</span>
<span class="code-line"><span class="o">===</span> Content <span class="nv">Section</span> <span class="o">===</span></span>
<span class="code-line">FLVALSIG 0x0ff0a55a</span>
<span class="code-line">FLMAP0 0x03040103</span>
<span class="code-line">FLMAP1 0x12100206</span>
<span class="code-line">FLMAP2 0x00210120</span>
<span class="code-line"></span>
<span class="code-line">--- Details ---</span>
<span class="code-line">NR <span class="o">(</span>Number of Regions<span class="o">)</span>: <span class="m">4</span></span>
<span class="code-line">FRBA <span class="o">(</span>Flash Region Base Address<span class="o">)</span>: 0x040</span>
<span class="code-line">NC <span class="o">(</span>Number of Components<span class="o">)</span>: <span class="m">2</span></span>
<span class="code-line">FCBA <span class="o">(</span>Flash Component Base Address<span class="o">)</span>: 0x030</span>
<span class="code-line">ISL <span class="o">(</span>ICH/PCH Strap Length<span class="o">)</span>: <span class="m">18</span></span>
<span class="code-line">FISBA/FPSBA <span class="o">(</span>Flash ICH/PCH Strap Base Address<span class="o">)</span>: 0x100</span>
<span class="code-line">NM <span class="o">(</span>Number of Masters<span class="o">)</span>: <span class="m">3</span></span>
<span class="code-line">FMBA <span class="o">(</span>Flash Master Base Address<span class="o">)</span>: 0x060</span>
<span class="code-line">MSL/PSL <span class="o">(</span>MCH/PROC Strap Length<span class="o">)</span>: <span class="m">1</span></span>
<span class="code-line">FMSBA <span class="o">(</span>Flash MCH/PROC Strap Base Address<span class="o">)</span>: <span class="nv">0x200</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="o">===</span> Component <span class="nv">Section</span> <span class="o">===</span></span>
<span class="code-line">FLCOMP 0x4990001c</span>
<span class="code-line">FLILL 0x00000000</span>
<span class="code-line"></span>
<span class="code-line">--- Details ---</span>
<span class="code-line">Component <span class="m">1</span> density: <span class="m">8</span> MB</span>
<span class="code-line">Component <span class="m">2</span> density: <span class="m">4</span> MB</span>
<span class="code-line">Read Clock Frequency: <span class="m">20</span> MHz</span>
<span class="code-line">Read ID and Status Clock Freq.: <span class="m">33</span> MHz</span>
<span class="code-line">Write and Erase Clock Freq.: <span class="m">33</span> MHz</span>
<span class="code-line">Fast Read is supported.</span>
<span class="code-line">Fast Read Clock Frequency: <span class="m">50</span> MHz</span>
<span class="code-line">No forbidden opcodes.</span>
<span class="code-line"></span>
<span class="code-line"><span class="o">===</span> Region <span class="nv">Section</span> <span class="o">===</span></span>
<span class="code-line">FLREG0 0x00000000</span>
<span class="code-line">FLREG1 0x0bff0500</span>
<span class="code-line">FLREG2 0x04ff0003</span>
<span class="code-line">FLREG3 0x00020001</span>
<span class="code-line"></span>
<span class="code-line">--- Details ---</span>
<span class="code-line">Region <span class="m">0</span> <span class="o">(</span>Descr. <span class="o">)</span> 0x00000000 - 0x00000fff</span>
<span class="code-line">Region <span class="m">1</span> <span class="o">(</span>BIOS <span class="o">)</span> 0x00500000 - 0x00bfffff</span>
<span class="code-line">Region <span class="m">2</span> <span class="o">(</span>ME <span class="o">)</span> 0x00003000 - 0x004fffff</span>
<span class="code-line">Region <span class="m">3</span> <span class="o">(</span>GbE <span class="o">)</span> 0x00001000 - <span class="nv">0x00002fff</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="o">===</span> Master <span class="nv">Section</span> <span class="o">===</span></span>
<span class="code-line">FLMSTR1 0xffff0000</span>
<span class="code-line">FLMSTR2 0xffff0000</span>
<span class="code-line">FLMSTR3 0x08080118</span>
<span class="code-line"></span>
<span class="code-line">--- Details ---</span>
<span class="code-line"> Descr. BIOS ME GbE Platf.</span>
<span class="code-line">BIOS rw rw rw rw rw</span>
<span class="code-line">ME rw rw rw rw rw</span>
<span class="code-line">GbE <span class="nv">rw</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="o">===</span> Upper Map <span class="nv">Section</span> <span class="o">===</span></span>
<span class="code-line">FLUMAP1 0x000018df</span>
<span class="code-line"></span>
<span class="code-line">--- Details ---</span>
<span class="code-line">VTL <span class="o">(</span>length in DWORDS<span class="o">)</span> <span class="o">=</span> <span class="m">24</span></span>
<span class="code-line">VTBA <span class="o">(</span>base address<span class="o">)</span> <span class="o">=</span> 0x000df0</span>
<span class="code-line"></span>
<span class="code-line">VSCC Table: <span class="m">12</span> entries</span>
<span class="code-line"><span class="nv">JID0</span> <span class="o">=</span> 0x001620c2</span>
<span class="code-line"><span class="nv">VSCC0</span> <span class="o">=</span> 0x20052005</span>
<span class="code-line"> Manufacturer ID 0xc2, Device ID 0x2016</span>
<span class="code-line"> <span class="nv">BES</span><span class="o">=</span>0x1, <span class="nv">WG</span><span class="o">=</span><span class="m">1</span>, <span class="nv">WSR</span><span class="o">=</span><span class="m">0</span>, <span class="nv">WEWS</span><span class="o">=</span><span class="m">0</span>, <span class="nv">EO</span><span class="o">=</span>0x20</span>
<span class="code-line"><span class="nv">JID1</span> <span class="o">=</span> 0x001720c2</span>
<span class="code-line"><span class="nv">VSCC1</span> <span class="o">=</span> 0x20052005</span>
<span class="code-line"> Manufacturer ID 0xc2, Device ID 0x2017</span>
<span class="code-line"> <span class="nv">BES</span><span class="o">=</span>0x1, <span class="nv">WG</span><span class="o">=</span><span class="m">1</span>, <span class="nv">WSR</span><span class="o">=</span><span class="m">0</span>, <span class="nv">WEWS</span><span class="o">=</span><span class="m">0</span>, <span class="nv">EO</span><span class="o">=</span>0x20</span>
<span class="code-line"><span class="nv">JID2</span> <span class="o">=</span> 0x001820c2</span>
<span class="code-line"><span class="nv">VSCC2</span> <span class="o">=</span> 0x20052005</span>
<span class="code-line"> Manufacturer ID 0xc2, Device ID 0x2018</span>
<span class="code-line"> <span class="nv">BES</span><span class="o">=</span>0x1, <span class="nv">WG</span><span class="o">=</span><span class="m">1</span>, <span class="nv">WSR</span><span class="o">=</span><span class="m">0</span>, <span class="nv">WEWS</span><span class="o">=</span><span class="m">0</span>, <span class="nv">EO</span><span class="o">=</span>0x20</span>
<span class="code-line"><span class="nv">JID3</span> <span class="o">=</span> 0x001640ef</span>
<span class="code-line"><span class="nv">VSCC3</span> <span class="o">=</span> 0x20052005</span>
<span class="code-line"> Manufacturer ID 0xef, Device ID 0x4016</span>
<span class="code-line"> <span class="nv">BES</span><span class="o">=</span>0x1, <span class="nv">WG</span><span class="o">=</span><span class="m">1</span>, <span class="nv">WSR</span><span class="o">=</span><span class="m">0</span>, <span class="nv">WEWS</span><span class="o">=</span><span class="m">0</span>, <span class="nv">EO</span><span class="o">=</span>0x20</span>
<span class="code-line"><span class="nv">JID4</span> <span class="o">=</span> 0x001740ef</span>
<span class="code-line"><span class="nv">VSCC4</span> <span class="o">=</span> 0x20052005</span>
<span class="code-line"> Manufacturer ID 0xef, Device ID 0x4017</span>
<span class="code-line"> <span class="nv">BES</span><span class="o">=</span>0x1, <span class="nv">WG</span><span class="o">=</span><span class="m">1</span>, <span class="nv">WSR</span><span class="o">=</span><span class="m">0</span>, <span class="nv">WEWS</span><span class="o">=</span><span class="m">0</span>, <span class="nv">EO</span><span class="o">=</span>0x20</span>
<span class="code-line"><span class="nv">JID5</span> <span class="o">=</span> 0x001840ef</span>
<span class="code-line"><span class="nv">VSCC5</span> <span class="o">=</span> 0x20052005</span>
<span class="code-line"> Manufacturer ID 0xef, Device ID 0x4018</span>
<span class="code-line"> <span class="nv">BES</span><span class="o">=</span>0x1, <span class="nv">WG</span><span class="o">=</span><span class="m">1</span>, <span class="nv">WSR</span><span class="o">=</span><span class="m">0</span>, <span class="nv">WEWS</span><span class="o">=</span><span class="m">0</span>, <span class="nv">EO</span><span class="o">=</span>0x20</span>
<span class="code-line"><span class="nv">JID6</span> <span class="o">=</span> 0x0016ba20</span>
<span class="code-line"><span class="nv">VSCC6</span> <span class="o">=</span> 0x20052005</span>
<span class="code-line"> Manufacturer ID 0x20, Device ID 0xba16</span>
<span class="code-line"> <span class="nv">BES</span><span class="o">=</span>0x1, <span class="nv">WG</span><span class="o">=</span><span class="m">1</span>, <span class="nv">WSR</span><span class="o">=</span><span class="m">0</span>, <span class="nv">WEWS</span><span class="o">=</span><span class="m">0</span>, <span class="nv">EO</span><span class="o">=</span>0x20</span>
<span class="code-line"><span class="nv">JID7</span> <span class="o">=</span> 0x0017ba20</span>
<span class="code-line"><span class="nv">VSCC7</span> <span class="o">=</span> 0x20052005</span>
<span class="code-line"> Manufacturer ID 0x20, Device ID 0xba17</span>
<span class="code-line"> <span class="nv">BES</span><span class="o">=</span>0x1, <span class="nv">WG</span><span class="o">=</span><span class="m">1</span>, <span class="nv">WSR</span><span class="o">=</span><span class="m">0</span>, <span class="nv">WEWS</span><span class="o">=</span><span class="m">0</span>, <span class="nv">EO</span><span class="o">=</span>0x20</span>
<span class="code-line"><span class="nv">JID8</span> <span class="o">=</span> 0x0018ba20</span>
<span class="code-line"><span class="nv">VSCC8</span> <span class="o">=</span> 0x20052005</span>
<span class="code-line"> Manufacturer ID 0x20, Device ID 0xba18</span>
<span class="code-line"> <span class="nv">BES</span><span class="o">=</span>0x1, <span class="nv">WG</span><span class="o">=</span><span class="m">1</span>, <span class="nv">WSR</span><span class="o">=</span><span class="m">0</span>, <span class="nv">WEWS</span><span class="o">=</span><span class="m">0</span>, <span class="nv">EO</span><span class="o">=</span>0x20</span>
<span class="code-line"><span class="nv">JID9</span> <span class="o">=</span> 0x0016701c</span>
<span class="code-line"><span class="nv">VSCC9</span> <span class="o">=</span> 0x20052005</span>
<span class="code-line"> Manufacturer ID 0x1c, Device ID 0x7016</span>
<span class="code-line"> <span class="nv">BES</span><span class="o">=</span>0x1, <span class="nv">WG</span><span class="o">=</span><span class="m">1</span>, <span class="nv">WSR</span><span class="o">=</span><span class="m">0</span>, <span class="nv">WEWS</span><span class="o">=</span><span class="m">0</span>, <span class="nv">EO</span><span class="o">=</span>0x20</span>
<span class="code-line"><span class="nv">JID10</span> <span class="o">=</span> 0x0017701c</span>
<span class="code-line"><span class="nv">VSCC10</span> <span class="o">=</span> 0x20052005</span>
<span class="code-line"> Manufacturer ID 0x1c, Device ID 0x7017</span>
<span class="code-line"> <span class="nv">BES</span><span class="o">=</span>0x1, <span class="nv">WG</span><span class="o">=</span><span class="m">1</span>, <span class="nv">WSR</span><span class="o">=</span><span class="m">0</span>, <span class="nv">WEWS</span><span class="o">=</span><span class="m">0</span>, <span class="nv">EO</span><span class="o">=</span>0x20</span>
<span class="code-line"><span class="nv">JID11</span> <span class="o">=</span> 0x0018701c</span>
<span class="code-line"><span class="nv">VSCC11</span> <span class="o">=</span> 0x20052005</span>
<span class="code-line"> Manufacturer ID 0x1c, Device ID 0x7018</span>
<span class="code-line"> <span class="nv">BES</span><span class="o">=</span>0x1, <span class="nv">WG</span><span class="o">=</span><span class="m">1</span>, <span class="nv">WSR</span><span class="o">=</span><span class="m">0</span>, <span class="nv">WEWS</span><span class="o">=</span><span class="m">0</span>, <span class="nv">EO</span><span class="o">=</span><span class="nv">0x20</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="o">===</span> <span class="nv">Softstraps</span> <span class="o">===</span></span>
<span class="code-line">--- North/MCH/PROC <span class="o">(</span><span class="m">1</span> entries<span class="o">)</span> ---</span>
<span class="code-line"><span class="nv">STRP0</span> <span class="o">=</span> 0x00000000</span>
<span class="code-line"></span>
<span class="code-line">--- South/ICH/PCH <span class="o">(</span><span class="m">18</span> entries<span class="o">)</span> ---</span>
<span class="code-line"><span class="nv">STRP0</span> <span class="o">=</span> 0x4810d782</span>
<span class="code-line"><span class="nv">STRP1</span> <span class="o">=</span> 0x0000010f</span>
<span class="code-line"><span class="nv">STRP2</span> <span class="o">=</span> 0x00000000</span>
<span class="code-line"><span class="nv">STRP3</span> <span class="o">=</span> 0x00000000</span>
<span class="code-line"><span class="nv">STRP4</span> <span class="o">=</span> 0x00c8e102</span>
<span class="code-line"><span class="nv">STRP5</span> <span class="o">=</span> 0x00000000</span>
<span class="code-line"><span class="nv">STRP6</span> <span class="o">=</span> 0x00000000</span>
<span class="code-line"><span class="nv">STRP7</span> <span class="o">=</span> 0x00000000</span>
<span class="code-line"><span class="nv">STRP8</span> <span class="o">=</span> 0x00000000</span>
<span class="code-line"><span class="nv">STRP9</span> <span class="o">=</span> 0x30000b80</span>
<span class="code-line"><span class="nv">STRP10</span> <span class="o">=</span> 0x00410044</span>
<span class="code-line"><span class="nv">STRP11</span> <span class="o">=</span> 0x99000097</span>
<span class="code-line"><span class="nv">STRP12</span> <span class="o">=</span> 0x00000000</span>
<span class="code-line"><span class="nv">STRP13</span> <span class="o">=</span> 0x00000000</span>
<span class="code-line"><span class="nv">STRP14</span> <span class="o">=</span> 0x00000000</span>
<span class="code-line"><span class="nv">STRP15</span> <span class="o">=</span> 0x0000437e</span>
<span class="code-line"><span class="nv">STRP16</span> <span class="o">=</span> 0x00000000</span>
<span class="code-line"><span class="nv">STRP17</span> <span class="o">=</span> 0x00000002</span>
<span class="code-line"></span>
<span class="code-line">Detailed South/ICH/PCH information is probably not reliable, printing anyway.</span>
<span class="code-line">--- PCH ---</span>
<span class="code-line">Chipset configuration Softstrap <span class="m">1</span>: <span class="m">1</span></span>
<span class="code-line">Intel ME SMBus Select is enabled.</span>
<span class="code-line">SMLink0 segment is enabled.</span>
<span class="code-line">SMLink1 segment is enabled.</span>
<span class="code-line">SMLink1 Frequency: <span class="m">100</span> kHz</span>
<span class="code-line">Intel ME SMBus Frequency: <span class="m">100</span> kHz</span>
<span class="code-line">SMLink0 Frequency: reserved</span>
<span class="code-line">GPIO12 is used as LAN_PHY_PWR_CTRL.</span>
<span class="code-line">LinkSec is disabled.</span>
<span class="code-line">DMI RequesterID Checks are disabled.</span>
<span class="code-line">BIOS Boot-Block size <span class="o">(</span>BBBS<span class="o">)</span>: <span class="m">256</span> kB.</span>
<span class="code-line">Chipset configuration Softstrap <span class="m">3</span>: 0xf</span>
<span class="code-line">Chipset configuration Softstrap <span class="m">2</span>: 0x1</span>
<span class="code-line">ME SMBus ASD address is disabled.</span>
<span class="code-line">ME SMBus Controller ASD Target address: 0x00</span>
<span class="code-line">ME SMBus MCTP Address is disabled.</span>
<span class="code-line">ME SMBus MCTP target address: 0x00</span>
<span class="code-line">ME SMBus I2C address is disabled.</span>
<span class="code-line">ME SMBus I2C target address: 0x00</span>
<span class="code-line">Intel PHY is connected.</span>
<span class="code-line">GbE MAC SMBus address is enabled.</span>
<span class="code-line">GbE MAC SMBus address: 0x70</span>
<span class="code-line">GbE PHY SMBus address: 0x64</span>
<span class="code-line">Intel ME SMBus Subsystem Vendor ID: 0x0000</span>
<span class="code-line">Intel ME SMBus Subsystem Device ID: 0x0000</span>
<span class="code-line">PCI Express Port Configuration Strap <span class="m">1</span>: 4x1 Ports <span class="m">1</span>-4 <span class="o">(</span>x1<span class="o">)</span></span>
<span class="code-line">PCI Express Port Configuration Strap <span class="m">2</span>: 4x1 Ports <span class="m">5</span>-8 <span class="o">(</span>x1<span class="o">)</span></span>
<span class="code-line">PCIe Lane Reversal <span class="m">1</span>: PCIe Lanes <span class="m">0</span>-3 are not reserved.</span>
<span class="code-line">PCIe Lane Reversal <span class="m">2</span>: PCIe Lanes <span class="m">4</span>-7 are not reserved.</span>
<span class="code-line">DMI Lane Reversal: DMI Lanes <span class="m">0</span>-3 are not reserved.</span>
<span class="code-line">ME Debug status writes over SMBUS are disabled.</span>
<span class="code-line">ME Debug SMBus Emergency Mode address: 0x00 <span class="o">(</span>raw<span class="o">)</span></span>
<span class="code-line">Default PHY PCIe Port is <span class="m">4</span>.</span>
<span class="code-line">Integrated MAC/PHY communication over PCIe is enabled.</span>
<span class="code-line">PCIe ports Subtractive Decode Agent is disabled.</span>
<span class="code-line">GPIO74 is used as PCHHOT#.</span>
<span class="code-line">Management Engine will boot from ROM, <span class="k">then</span> flash.</span>
<span class="code-line">ME Debug SMBus Emergency Mode is disabled.</span>
<span class="code-line">ME Debug SMBus Emergency Mode Address: 0x00</span>
<span class="code-line">Integrated Clocking Configuration used: <span class="m">0</span></span>
<span class="code-line">PCH Signal CL_RST1# does not assert when Intel ME performs a reset.</span>
<span class="code-line">ICC Profile is selected by BIOS.</span>
<span class="code-line">Deep SX is supported on the platform.</span>
<span class="code-line">ME Debug LAN Emergency Mode is enabled.</span>
<span class="code-line">SMLink1 GP Address is enabled.</span>
<span class="code-line">SMLink1 controller General Purpose Target address: 0x4b</span>
<span class="code-line">SMLink1 I2C Target address is enabled.</span>
<span class="code-line">SMLink1 I2C Target address: 0x4c</span>
<span class="code-line">Chipset configuration Softstrap <span class="m">6</span>: <span class="m">0</span></span>
<span class="code-line">Integrated wired LAN is disabled.</span>
<span class="code-line">Chipset configuration Softstrap <span class="m">5</span>: <span class="m">0</span></span>
<span class="code-line">SMLink1 provides temperature from the CPU, PCH and DIMMs.</span>
<span class="code-line">GPIO29 is used as SLP_LAN#.</span>
<span class="code-line">Integrated Clock: Full Integrated Clock Mode</span>
<span class="code-line"></span>
<span class="code-line">The MAC address might be at offset 0x1000: 3c:97:0e:ac:31:c1</span>
<span class="code-line"><span class="o">===</span> Dumping region <span class="nv">files</span> <span class="o">===</span></span>
<span class="code-line">Dumping <span class="m">4096</span> bytes of the Descriptor region from 0x00000000-0x00000fff to complete.rom.new.Descriptor.bin... <span class="k">done</span>.</span>
<span class="code-line">Dumping <span class="m">7340032</span> bytes of the BIOS region from 0x00500000-0x00bfffff to complete.rom.new.BIOS.bin... <span class="k">done</span>.</span>
<span class="code-line">Dumping <span class="m">5230592</span> bytes of the ME region from 0x00003000-0x004fffff to complete.rom.new.ME.bin... <span class="k">done</span>.</span>
<span class="code-line">Dumping <span class="m">8192</span> bytes of the GbE region from 0x00001000-0x00002fff to complete.rom.new.GbE.bin... <span class="k">done</span>.</span>
</pre></div>
<p>用 UEFITool 打开 complete.rom.new.BIOS.bin,搜索 “VGA compatible”(记得取消选择 Unicode),
大概会找到一 64 KB 的块,用 extract body 解压它,这就是汝的 VGA BIOS 啦 ~</p>
<p>然后把这些文件放在一起:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># 在汝的 coreboot 目录下新建一个存放 blob 的文件夹</span></span>
<span class="code-line">mkdir -p ~/repo/coreboot/3rdparty/blobs/mainboard/lenovo/x230/</span>
<span class="code-line"><span class="c1"># 然后把刚取出的文件赋值过去</span></span>
<span class="code-line">cp complete.rom.new.Descriptor.bin ~/repo/coreboot/3rdparty/blobs/mainboard/lenovo/x230/descriptor.bin</span>
<span class="code-line">cp complete.rom.new.ME.bin ~/repo/coreboot/3rdparty/blobs/mainboard/lenovo/x230/me.bin</span>
<span class="code-line">cp complete.rom.new.GBE.bin ~/repo/coreboot/3rdparty/blobs/mainboard/lenovo/x230/gbe.bin</span>
<span class="code-line">cp vbios.bin ~/repo/coreboot/pci8086,0166.rom</span>
</pre></div>
</div>
<div class="section" id="make-menuconfig">
<h2>make menuconfig</h2>
<p>在 coreboot 目录下运行 make menuconfig :</p>
<img alt="make_menuconfig" class="materialboxed responsive-img" src="/images/x230_with_coreboot_and_me_cleaner/menuconfig.png"/>
<p>是不是和编译内核时很像? 😂
然后在 General Setup 里选中 Allow use of binary-only repoistory:</p>
<img alt="Allow use of binary-only repoistory" class="materialboxed responsive-img" src="/images/x230_with_coreboot_and_me_cleaner/menuconfig_binary.png"/>
<p>然后在 Board 一节里选择 Lenovo X230:</p>
<img alt="Board" class="materialboxed responsive-img" src="/images/x230_with_coreboot_and_me_cleaner/menuconfig_board.png"/>
<p>在 Chipset 中选择 Add Intel descriptor.bin file, Add Intel ME/TXE firmware 和
Add gigabit ethernet firmware,如果汝不是按刚才咱那样复制的话,记得改一下每一项
下面的文件位置选项:</p>
<img alt="Chipset" class="materialboxed responsive-img" src="/images/x230_with_coreboot_and_me_cleaner/menuconfig_chipset.png"/>
<p>在 Display 一节中选择 Add a VGA BIOS image,如果汝不是按刚才咱那样复制的话,
记得改一下每一项下面的文件位置选项:</p>
<img alt="vgabios" class="materialboxed responsive-img" src="/images/x230_with_coreboot_and_me_cleaner/menuconfig_vgabios.png"/>
<p>在 Generic Drivers 一节里选中 PS/2 keyboard init (有需要的话可以顺便启用一下 TPM 支持):</p>
<img alt="device" class="materialboxed responsive-img" src="/images/x230_with_coreboot_and_me_cleaner/menuconfig_device.png"/>
<p>在 Payload 一节选择一个合适的 Payload (大概是启动管理器)?</p>
<ul class="simple">
<li>默认的 SeaBIOS 是一个自由的 BIOS 引导实现。</li>
<li>也可以让 coreboot 引导 GRUB2 或者直接启动 Linux 内核(使用 grub 或者 linux payload,
前提是 BIOS 芯片里还有地方……)</li>
<li>Tianocore 是一个开放源代码的 UEFI 实现。</li>
</ul>
<img alt="payload" class="materialboxed responsive-img" src="/images/x230_with_coreboot_and_me_cleaner/menuconfig_payload.png"/>
<p>于是咱就用了 Tianocore ……</p>
<img alt="tianocore" class="materialboxed responsive-img" src="/images/x230_with_coreboot_and_me_cleaner/menuconfig_tianocore.png"/>
<p>最后保存配置文件:</p>
<img alt="save" class="materialboxed responsive-img" src="/images/x230_with_coreboot_and_me_cleaner/menuconfig_save.png"/>
<p>然后运行 make 编译汝的 ROM 吧(最后会在 build/coreboot.rom 里)。</p>
</div>
<div class="section" id="id4">
<h2>刷入……</h2>
<p>首先把 ROM 拆开成两个芯片大小,用 dd 就可以搞定:</p>
<blockquote>
<p>dd of=top.rom bs=1M if=coreboot.rom skip=8</p>
<p>dd of=bottom.rom bs=1M if=coreboot.rom count=8</p>
</blockquote>
<p>然后再接上编程器,首先刷入上面的芯片,看看可不可以正常开机 😂</p>
<blockquote>
flashrom -p linux_spi:dev=/dev/spidev0.0 -w top.rom -c MX25L3206E/MX25L3208E</blockquote>
<p>如果可以的话,再刷入下面一块:</p>
<blockquote>
flashrom -p linux_spi:dev=/dev/spidev0.0 -w bottom.rom -c MX25L6406E/MX25L6408E</blockquote>
<p>如果可以正常启动的话,Cheers!汝已经成功装上 coreboot 啦(白名单和 ME 的大部分功能也没啦……)</p>
<p>😂</p>
</div>
<div class="section" id="id5">
<h2>参考资料</h2>
<ul class="simple">
<li><a class="reference external" href="https://www.lugs.ch/lib/vortraege/x230_coreboot_neuted_me.pdf">ThinkPad X230 coreboot and me_cleaner</a></li>
<li><a class="reference external" href="https://steemit.com/tutorial/@joeyd/run-don-t-walk-from-the-blob">Flashing the X230 with coreboot while slaying Intel-ME</a></li>
<li><a class="reference external" href="https://www.coreboot.org/Board:lenovo/x230">https://www.coreboot.org/Board:lenovo/x230</a></li>
</ul>
</div>
如何在 IRC 上请求支援2017-11-02T00:00:00+08:002017-11-02T00:00:00+08:00ホロtag:None,2017-11-02:/translation/get_help_on_irc.html
<p>来自 <a class="reference external" href="https://workaround.org/getting-help-on-irc/">https://workaround.org/getting-help-on-irc/</a></p>
<p>IRC 是一种即时聊天工具,在不同的频道上有不同的话题进行讨论。</p>
<p>现在最大的 IRC 网络 irc.freenode.net 上有很多讨论操作系统,应用程序和开放源代码项目的 IRC 频道。
同时也成了获得帮助和支持的好地方。IRC 历史悠久而且还在持续进化,虽然有点像一群疯子的聚居地(雾)。</p>
<p>这篇文章希望能帮助汝理解 IRC 社群的工作原理并赐予汝充分利用它的力量的能力呗~</p>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id17">#1 – 别问“能不能问”问题</a></h2>
<p>不要以“有人在吗?”,“我能在这里提问嘛?”一类的问题开始。
虽然在真实社交中这会让汝觉得彬彬有礼,但是 IRC 上没这个必要。
直接提出汝的问题就好(虽然很可能需要组织一下问题)。</p>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id18">#2 – 准确第一</a></h2>
<p>“我的打印机坏了”,“我的邮件服务器发不出邮件”这样的问题完全会让人抓狂好不好~
这样其他人怎么帮忙嘛,所以最好保证汝的话包含这几点:</p>
<ul class="simple">
<li>汝要干啥?(咱想用 POP3 …</li></ul></div>
<p>来自 <a class="reference external" href="https://workaround.org/getting-help-on-irc/">https://workaround.org/getting-help-on-irc/</a></p>
<p>IRC 是一种即时聊天工具,在不同的频道上有不同的话题进行讨论。</p>
<p>现在最大的 IRC 网络 irc.freenode.net 上有很多讨论操作系统,应用程序和开放源代码项目的 IRC 频道。
同时也成了获得帮助和支持的好地方。IRC 历史悠久而且还在持续进化,虽然有点像一群疯子的聚居地(雾)。</p>
<p>这篇文章希望能帮助汝理解 IRC 社群的工作原理并赐予汝充分利用它的力量的能力呗~</p>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id17">#1 – 别问“能不能问”问题</a></h2>
<p>不要以“有人在吗?”,“我能在这里提问嘛?”一类的问题开始。
虽然在真实社交中这会让汝觉得彬彬有礼,但是 IRC 上没这个必要。
直接提出汝的问题就好(虽然很可能需要组织一下问题)。</p>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id18">#2 – 准确第一</a></h2>
<p>“我的打印机坏了”,“我的邮件服务器发不出邮件”这样的问题完全会让人抓狂好不好~
这样其他人怎么帮忙嘛,所以最好保证汝的话包含这几点:</p>
<ul class="simple">
<li>汝要干啥?(咱想用 POP3 协议接收邮件)</li>
<li>哪里不对劲?(但是咱收不到)</li>
<li>汝在用啥?(咱在 KDE 3.4 上用 kmail 1.8)(原文如此啦)</li>
<li>汝已经试着做些啥了嘛?(咱确定咱的设置没有问题)</li>
<li>有没有日志或者错误消息?(错误消息提示咱 “SSL negotiation failed.”)</li>
<li>它曾经工作过嘛?汝改了哪些?(咱换了邮件提供商,前一家没问题)</li>
</ul>
<p>包含的信息越多貌似汝的问题更容易被人关注到呗~</p>
</div>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id19">#3 – 讲出汝在做些啥</a></h2>
<p>旁人只知道汝告诉他们的一切(就是汝不说别人不知道啦)。
“我改了某些地方然后遇到了别的问题”一类的话最容易让人放弃治疗啦 😂。
取得帮助的前提是合作啦~</p>
</div>
<div class="section" id="topic">
<h2><a class="toc-backref" href="#id20">#4 – 去读 /topic</a></h2>
<p>汝的 IRC 客户端应该会在汝进入频道时显示频道的主题(topic)呗,
一个频道的主题通常包含大量信息(最常见的是 FAQ 和文档的链接)。
汝不想因为问 topic 或者 FAQ 中已经有答案的问题而被当作笨蛋,是呗~
所以要是 topic 里有 FAQ 的地址的话,先花些时间去那里找找咯。</p>
</div>
<div class="section" id="id4">
<h2><a class="toc-backref" href="#id21">#5 – 别依赖谁</a></h2>
<p>别指望谁会一直陪着汝在线直到汝的问题解决。IRC 是个无状态介质,于是谁啥时候都能下线。
那些留着的人只是他/她们乐意这样做而已啦,而且毕竟汝也没因为这个付费,是呗。</p>
</div>
<div class="section" id="msg">
<h2><a class="toc-backref" href="#id22">#6 – 别胡乱 /msg 其他人</a></h2>
<p>汝可以在频道中公开的交谈,或者用 /msg 一类的命令和谁私聊。
不过随便和人搭讪容易被当作无礼,而且别只和一个人说话,
说不定其他人有兴趣或者有能力给汝一个解决方案呐~</p>
</div>
<div class="section" id="id5">
<h2><a class="toc-backref" href="#id23">#7 – 无意的无礼</a></h2>
<p>有时汝大概会收到这样的回复:“重新安装”,“重启”,“去读 /usr/share/doc/mysoftware/README 里的文档”
一类的回复。虽然它短小精悍(也许带点火药味),不过别觉得被冒犯啦,也许给汝回答的人已经回答这样的问题
好多遍啦(庆幸他/她/它还没觉得厌烦),这样做最节省双方的时间而已。</p>
</div>
<div class="section" id="id6">
<h2><a class="toc-backref" href="#id24">#8 – 别重复自己</a></h2>
<p>别一次次的问,要是一直没人说话的话,多半是时间不对(比如在吃饭或者睡觉),
大部分人在回来时看到聊天记录(如果他们的客户端支持的话),就能看到汝的问题了呗~</p>
</div>
<div class="section" id="id7">
<h2><a class="toc-backref" href="#id25">#9 – 讲英语(大多数情况下)</a></h2>
<p>大多数频道只讲英语(不过也有例外,例如 #debian-fr 就讲法语,#archlinux-cn 讲中文,等等),
所以汝最好也讲英语,不要太担心自己英语水平不足啦(说不定不少人和汝差不多)。
当然,要是在讲非母语的频道里见到老乡(雾),别马上换成汝的母语继续说
(这样大多数频道里的人就看不懂啦)。</p>
</div>
<div class="section" id="id8">
<h2><a class="toc-backref" href="#id26">#10 – 别偷懒,去读文档</a></h2>
<p>要是有人让汝去读文档的话,别像个大笨驴一样说些既然他知道不如直接告诉我怎么解决
一类的话,不然汝就等着被所有人忽略吧……</p>
<p>不过要是汝在看他提供的文档却一头雾水不知如何下手时说不定可以问问,例如
“咱看了汝给咱的文档的第三章第一节,现在咱明白虚拟域名如何工作了,不过咱怎么把
虚拟域名和非虚拟域名组合到一起使用咧?”</p>
</div>
<div class="section" id="id9">
<h2><a class="toc-backref" href="#id27">#11 – 留下来给人机会回答</a></h2>
<p>就算汝十万火急,也留些时间等等好啦~ 有些时候汝可能马上就有答案了,然而不一定汝每次
都是幸运儿,多等一会儿说不定会有懂得如何解决汝问题的人出现咯:</p>
<blockquote>
<p>10:07 Foo joins</p>
<p>10:07 Foo> How can I install the shripdibble module?</p>
<p>10:09 Foo quit</p>
</blockquote>
<p>要是汝像这样问完就跑的话,后面有明白 shripdibble 的人来都不知道。</p>
</div>
<div class="section" id="id10">
<h2><a class="toc-backref" href="#id28">#12 – 如果可能的话,留下来</a></h2>
<p>用 IRC 就像索取和给予的过程。一开始汝大概是问题比答案多,于是就提问然后因为有人注意到
或者回答了而心怀感激。而帮汝的人甚至都没期望收获一个“谢谢”。</p>
<p>如果汝可以的话,最好留下来帮助其他人。从这个过程中,汝大概可以得到更多知识,
或许也能了解到怎么和人聊天(就算是虚拟的也没有关系)。</p>
</div>
<div class="section" id="id11">
<h2><a class="toc-backref" href="#id29">#13 – 回答汝所问的问题?</a></h2>
<p>IRC 有些不太好跟踪所有的对话。但是有时想帮忙的人可能会向汝提出一些问题。
别忽略它们(除非汝想被人忽略),而且最好答其所问。汝自己保持对自己的问题关注的话,
说不定能更快的解决。</p>
</div>
<div class="section" id="id12">
<h2><a class="toc-backref" href="#id30">#14 – 说出汝的解决办法</a></h2>
<p>要是汝后来自己解决了,别简单的说一句自己已经解决了就跑。
告诉大家汝是怎么解决的问题,这样都能从中学到些啥。
汝是不会被当作大笨驴的啦,相信咱~</p>
</div>
<div class="section" id="id13">
<h2><a class="toc-backref" href="#id31">#15 – 不要盲从</a></h2>
<p>小心甄别汝收到的回复,其间可能夹杂着瞎猜(或者有根据的猜测),
或者有些人为了好玩讲的玩笑话(比如一个格式化硬盘的命令)等等 😂。
如果不确定的话,就去问问别人(不排除汝太大笨驴以至于整个频道在线的人都在调戏汝的可能)😂</p>
</div>
<div class="section" id="id14">
<h2><a class="toc-backref" href="#id32">#16 – 别向频道发洪水,用剪贴板服务</a></h2>
<p>有时汝会考虑发送一行以上的消息(可能是配置文件或者日志),
不过别直接把文字复制到输入框里。记得使用一个 Pastebin 服务
(一种存放文字然后供其他人以 URL 形式访问的网站),当然也别直接贴个链接就算了
(说点啥啊 😂),例如“咱装了 foo 以后 bar 就挂了,这是 bar 日志的输出 <a class="reference external" href="http://">http://</a>…”</p>
</div>
<div class="section" id="id15">
<h2><a class="toc-backref" href="#id33">参阅</a></h2>
<p><a class="reference external" href="https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/master/README-zh_CN.md">提问的智慧</a> (虽然咱知道汝可能已经看腻了这个了)</p>
</div>
LEDE + iptables6 + Shadowsocks = ?2017-10-28T00:00:00+08:002017-10-28T00:00:00+08:00ホロtag:None,2017-10-28:/tech_misc/lede_and_nat6_and_ss_redir.html
<p>利用支持 LEDE 的路由器 + shadowsocks + iptables6 组建 nat6 + 透明代理 AP
<del>接着搞大新闻……</del> 😂</p>
<div class="section" id="lede">
<h2><a class="toc-backref" href="#id4">所以 LEDE 又是个啥?😂</a></h2>
<p>Linux嵌入式开发环境项目(Linux Embedded Development Environment,LEDE),
是OpenWRT专案的一个分支专案,继承原来OpenWRT的开发目标。
OpenWRT开发者社区内因各种决定迟迟未能在达成一致意见,导致长时间没有大幅更新,
这使得一群OpenWRT核心贡献者感到不满,而他们于2016年5月,决定另立新专案。
这个专案在一年后才正式定名为LEDE。LEDE的内核原始码基本继承自原OpenWRT,
但相应的开发者社区采用新的讨论规定和决议流程。
2017年6月,LEDE社区和OpwnWRT社区均通过决定,将原OpenWRT专案合并至LEDE专案之中。</p>
<p><a class="reference external" href="https://lede-project.org">https://lede-project.org</a></p>
</div>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id5">最后的效果大概是?</a></h2>
<ul class="simple">
<li>连接到路由器的设备可以访问纯 IPv6 网站(通过 nat6)</li>
<li>通过透明代理访问被墙网站</li>
</ul>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id6">下载,安装和设置 LEDE</a></h2>
<ul class="simple">
<li>了解汝的路由器有木有资瓷以及下载 :<a class="reference external" href="https://lede-project.org/supported_devices">https://lede-project.org/supported_devices …</a></li></ul></div>
<p>利用支持 LEDE 的路由器 + shadowsocks + iptables6 组建 nat6 + 透明代理 AP
<del>接着搞大新闻……</del> 😂</p>
<div class="section" id="lede">
<h2><a class="toc-backref" href="#id4">所以 LEDE 又是个啥?😂</a></h2>
<p>Linux嵌入式开发环境项目(Linux Embedded Development Environment,LEDE),
是OpenWRT专案的一个分支专案,继承原来OpenWRT的开发目标。
OpenWRT开发者社区内因各种决定迟迟未能在达成一致意见,导致长时间没有大幅更新,
这使得一群OpenWRT核心贡献者感到不满,而他们于2016年5月,决定另立新专案。
这个专案在一年后才正式定名为LEDE。LEDE的内核原始码基本继承自原OpenWRT,
但相应的开发者社区采用新的讨论规定和决议流程。
2017年6月,LEDE社区和OpwnWRT社区均通过决定,将原OpenWRT专案合并至LEDE专案之中。</p>
<p><a class="reference external" href="https://lede-project.org">https://lede-project.org</a></p>
</div>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id5">最后的效果大概是?</a></h2>
<ul class="simple">
<li>连接到路由器的设备可以访问纯 IPv6 网站(通过 nat6)</li>
<li>通过透明代理访问被墙网站</li>
</ul>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id6">下载,安装和设置 LEDE</a></h2>
<ul class="simple">
<li>了解汝的路由器有木有资瓷以及下载 :<a class="reference external" href="https://lede-project.org/supported_devices">https://lede-project.org/supported_devices</a></li>
<li>或者自己编译一个 :<a class="reference external" href="https://lede-project.org/docs/guide-developer/start">https://lede-project.org/docs/guide-developer/start</a></li>
</ul>
<p>如果自己编译的话,可以考虑添加这些依赖(然而咱忘了都在哪了 😂):</p>
<div class="highlight"><pre><span class="code-line"><span></span>libgcc <span class="c1"># LEDE:target/cpu型号/package目录下</span></span>
<span class="code-line">libpthread <span class="c1"># 同上</span></span>
<span class="code-line">libpcre <span class="c1"># package</span></span>
<span class="code-line">libev <span class="c1"># package</span></span>
<span class="code-line">libsodium <span class="c1"># package 最新版本需要libsodium版本 >= 1.0.12</span></span>
<span class="code-line">libmbedtls <span class="c1"># package</span></span>
<span class="code-line">libcares</span>
<span class="code-line">ip <span class="c1"># base</span></span>
<span class="code-line">ipset</span>
<span class="code-line">iptables-mod-tproxy <span class="c1"># 代理 UDP 流量需要</span></span>
<span class="code-line"><span class="c1"># nat6 需要这两个</span></span>
<span class="code-line">ip6tables</span>
<span class="code-line">kmod-ipt-nat6</span>
</pre></div>
<p>刷入以后 ssh 上去(一般是 <a class="reference external" href="mailto:root@192.168.1.1">root@192.168.1.1</a> ),设置一下密码。</p>
<hr class="docutils"/>
<p>如果要用透明代理的话,没编译的话去装依赖啦 😂:</p>
<blockquote>
<p># opkg 是一个小型的软件包管理器 😂</p>
<p>opkg install ip-full ipset iptables-mod-tproxy libev libpthread libpcre libmbedtls</p>
</blockquote>
<p>接下来下载软件,注意需要根据自己的CPU内核架构来进行选择。可使用如下命令查看架构类型:</p>
<blockquote>
opkg print-architecture</blockquote>
<p>然后去 <a class="reference external" href="http://openwrt-dist.sourceforge.net/packages/LEDE/">http://openwrt-dist.sourceforge.net/packages/LEDE/</a> 下载些 ipk:</p>
<div class="highlight"><pre><span class="code-line"><span></span>libcares_x.xx-x_xxxx.ipk</span>
<span class="code-line">libsodium_x.x.xx-x_xxxx.ipk</span>
<span class="code-line">shadowsocks-libev_x.x.x-x_xxxx.ipk</span>
<span class="code-line">dns-forwarder_x.x.x-x_xxxx.ipk</span>
<span class="code-line">ChinaDNS_x.x.x-x_xxxx.ipk</span>
<span class="code-line">luci-app-shadowsocks_x.x.x-x_all.ipk</span>
<span class="code-line">luci-app-chinadns_x.x.x-x_all.ipk</span>
<span class="code-line">luci-app-dns-forwarder_x.x.x-x_all.ipk</span>
</pre></div>
<p>将下载的包通过sftp之类的工具上传至路由器的 /tmp 目录。(可能需要安装 openssh-sftpserver)</p>
<p>最后就是安装啦:</p>
<div class="highlight"><pre><span class="code-line"><span></span>opkg install libcares*.ipk libsodium*.ipk</span>
<span class="code-line">opkg install shadowsocks-libev*.ipk luci-app-shadowsocks*.ipk</span>
<span class="code-line">opkg install ChinaDNS*.ipk luci-app-chinadns*.ipk</span>
<span class="code-line">opkg install dns-forwarder*.ipk luci-app-dns-forwarder*.ipk</span>
</pre></div>
</div>
<div class="section" id="iptables6">
<h2><a class="toc-backref" href="#id7">设置 iptables6</a></h2>
<blockquote>
需要准备个自己上手的编辑器 😂 LEDE 内置的是 vi,喜欢 vim/nano 的话可以通过
opkg 安装或者编译时加上。</blockquote>
<ul>
<li><p class="first">修改 /etc/config/network , 加上或者修改这一段(ULA前缀):</p>
<blockquote>
<p>NAT6转换的ULA网段要求是2fff::/64网段,因此把ULA前缀改为2fff::/64内的任意网段,
为了让客户端尽可能使用 IPv6 需要修改这个 😂</p>
</blockquote>
</li>
</ul>
<div class="highlight"><pre><span class="code-line"><span></span>config globals 'globals'</span>
<span class="code-line"> option ula_prefix '2fff::/64'</span>
</pre></div>
<ul class="simple">
<li>修改 /etc/config/dhcp 在 LAN 接口上启用宣告默认路由:</li>
</ul>
<div class="highlight"><pre><span class="code-line"><span></span>config dhcp 'lan'</span>
<span class="code-line"> option ra_default '1'</span>
</pre></div>
<ul>
<li><p class="first">然后查看一下默认网关:</p>
<blockquote>
<p>ip -6 route | grep "default from"</p>
<p>大概会得到这样的</p>
<p>default from (ipv6 range) via (gateway) dev (intf) proto static metric 512</p>
<p>就需要向下一级宣告默认网关,括号的内容自行替换为上面结果。</p>
<p>ip -6 r add default via (gateway) dev (intf)</p>
<p>比如咱的结果是这样:</p>
<p>default from 2001:da8:a005:218::/64 via fe80::72ba:efff:fe82:c654 dev eth1 metric 512</p>
<p>那咱就这么写:</p>
<p>ip -6 r add default via fe80::72ba:efff:fe82:c654 dev eth1</p>
</blockquote>
</li>
<li><p class="first">用 ip6tables 设置 NAT</p>
<blockquote>
<p>ip6tables -t nat -A POSTROUTING -o (intf) -j MASQUERADE</p>
<p>记得把 intf 换成相应的界面名称(例如咱的eth1),然后拿起连接到这个网络的设备
试一下 IPv6 能不能用了呗~</p>
</blockquote>
</li>
<li><p class="first">最后可以考虑写个脚本自动化这个过程 (其实咱是抄的 😂) :</p>
</li>
</ul>
<div class="highlight"><pre><span class="code-line"><span></span><span class="ch">#!/bin/sh</span></span>
<span class="code-line"><span class="c1"># filename: /etc/hotplug.d/iface/90-ipv6</span></span>
<span class="code-line"><span class="c1"># please make sure this file has permission 644</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="c1"># check if it is the intf which has a public ipv6 address like "2001:da8:100d:aaaa:485c::1/64"</span></span>
<span class="code-line"><span class="c1"># interface_pulbic 是带有公网IPV6地址的接口地址,大多数情况下是 wan6</span></span>
<span class="code-line"><span class="nv">interface_public</span><span class="o">=</span><span class="s2">"wan6"</span></span>
<span class="code-line"><span class="o">[</span> <span class="s2">"</span><span class="nv">$INTERFACE</span><span class="s2">"</span> <span class="o">=</span> <span class="s2">"</span><span class="nv">$interface_public</span><span class="s2">"</span> <span class="o">]</span> <span class="o">||</span> <span class="nb">exit</span> <span class="m">0</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="nv">res</span><span class="o">=</span><span class="sb">`</span>ip -6 route <span class="p">|</span> grep <span class="s2">"default from"</span><span class="sb">`</span></span>
<span class="code-line"><span class="nv">gateway</span><span class="o">=</span><span class="sb">`</span><span class="nb">echo</span> <span class="nv">$res</span> <span class="p">|</span> awk <span class="s1">'{print $5}'</span><span class="sb">`</span></span>
<span class="code-line"><span class="nv">interface</span><span class="o">=</span><span class="sb">`</span><span class="nb">echo</span> <span class="nv">$res</span> <span class="p">|</span> awk <span class="s1">'{print $7}'</span><span class="sb">`</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="k">if</span> <span class="o">[</span> <span class="s2">"</span><span class="nv">$ACTION</span><span class="s2">"</span> <span class="o">=</span> ifup <span class="o">]</span><span class="p">;</span> <span class="k">then</span></span>
<span class="code-line"> ip -6 r add default via <span class="nv">$gateway</span> dev <span class="nv">$interface</span></span>
<span class="code-line"> <span class="k">if</span> !<span class="o">(</span>ip6tables-save -t nat <span class="p">|</span> grep -q <span class="s2">"v6NAT"</span><span class="o">)</span><span class="p">;</span> <span class="k">then</span></span>
<span class="code-line"> ip6tables -t nat -A POSTROUTING -o <span class="nv">$interface</span> -m comment --comment <span class="s2">"v6NAT"</span> -j MASQUERADE</span>
<span class="code-line"> <span class="k">fi</span></span>
<span class="code-line"><span class="k">else</span></span>
<span class="code-line"> ip6tables -t nat -D POSTROUTING -o <span class="nv">$interface</span> -m comment --comment <span class="s2">"v6NAT"</span> -j MASQUERADE</span>
<span class="code-line"> ip -6 r del default via <span class="nv">$gateway</span> dev <span class="nv">$interface</span></span>
<span class="code-line"><span class="k">fi</span></span>
</pre></div>
<p>把这个脚本放进 /etc/hotplug.d/iface/90-ipv6 ,设置好权限(例如644),
效果就是每次ipv6连接和断开就自动添加和删除路由规则 😂</p>
</div>
<div class="section" id="shadowsocks">
<h2><a class="toc-backref" href="#id8">设置 Shadowsocks</a></h2>
<blockquote>
😂 嗯……</blockquote>
<p>用 Luci 设置(和需要更多设置)的话请参考最后参考来源那篇文章
(咱要求低到能用就行 😂)</p>
<p>打开或修改 /etc/config/shadowsocks</p>
<div class="highlight"><pre><span class="code-line"><span></span># 基本设置</span>
<span class="code-line">config general</span>
<span class="code-line"> # 启动延迟</span>
<span class="code-line"> option startup_delay '0'</span>
<span class="code-line"></span>
<span class="code-line"># 透明代理设置</span>
<span class="code-line">config transparent_proxy</span>
<span class="code-line"> # UDP 中继服务器是哪个,没有的话就是 nil</span>
<span class="code-line"> # 然而内部用的啥名字咱没看明白 😂 于是还是用 Luci 改了</span>
<span class="code-line"> option udp_relay_server 'nil'</span>
<span class="code-line"> # 透明代理的本地端口和 mtu</span>
<span class="code-line"> option local_port '1234'</span>
<span class="code-line"> option mtu '1492'</span>
<span class="code-line"> list main_server 'cfg104a8f'</span>
<span class="code-line"> list main_server 'cfg0c4a8f'</span>
<span class="code-line"></span>
<span class="code-line"># 设置 socks5 代理</span>
<span class="code-line">config socks5_proxy</span>
<span class="code-line"> list server 'nil'</span>
<span class="code-line"> option local_port '1080'</span>
<span class="code-line"> option mtu '1492'</span>
<span class="code-line"></span>
<span class="code-line"># 设置端口转发</span>
<span class="code-line">config port_forward</span>
<span class="code-line"> list server 'nil'</span>
<span class="code-line"> option local_port '5300'</span>
<span class="code-line"> option destination '8.8.4.4:53'</span>
<span class="code-line"> option mtu '1492'</span>
<span class="code-line"></span>
<span class="code-line"># 访问控制</span>
<span class="code-line">config access_control</span>
<span class="code-line"> # 路由器自身的代理类型 (1 好像是普通代理)</span>
<span class="code-line"> option self_proxy '1'</span>
<span class="code-line"> # 直连地址列表</span>
<span class="code-line"> option wan_bp_list '/etc/chinadns_chnroute.txt'</span>
<span class="code-line"> # 强制使用代理的 IP 地址列表,一行一个。</span>
<span class="code-line"> list wan_fw_ips '8.8.8.8'</span>
<span class="code-line"> list wan_fw_ips '8.8.4.4'</span>
<span class="code-line"> option lan_target 'SS_SPEC_WAN_AC'</span>
<span class="code-line"> # 强制直连的 IP 地址列表,一行一个。</span>
<span class="code-line"> list wan_bp_ips '59.67.0.0/9'</span>
<span class="code-line"> list wan_bp_ips '172.18.0.0/9'</span>
<span class="code-line"></span>
<span class="code-line"># 设置服务器(和 Shadowsocks 客户端一样)</span>
<span class="code-line">config servers</span>
<span class="code-line"> option alias 'example'</span>
<span class="code-line"> option fast_open '1'</span>
<span class="code-line"> option no_delay '0'</span>
<span class="code-line"> option server 'ip_address'</span>
<span class="code-line"> option server_port '80'</span>
<span class="code-line"> option timeout '60'</span>
<span class="code-line"> option password 'password'</span>
<span class="code-line"> option encrypt_method 'aes-256-cfb'</span>
<span class="code-line"> option plugin 'obfs-local'</span>
<span class="code-line"> option plugin_opts ''</span>
</pre></div>
</div>
<div class="section" id="dns-forwarder">
<h2><a class="toc-backref" href="#id9">设置 DNS-forwarder</a></h2>
<blockquote>
把 DNS 请求转发给特定的端口~</blockquote>
<p>创建或修改 /etc/network/dns-forwarder :</p>
<div class="highlight"><pre><span class="code-line"><span></span>config dns-forwarder</span>
<span class="code-line"> # 上游 DNS 服务器</span>
<span class="code-line"> option dns_servers '8.8.8.8'</span>
<span class="code-line"> # 开不开 😂</span>
<span class="code-line"> option enable '1'</span>
<span class="code-line"> # 本地的地址和端口</span>
<span class="code-line"> option listen_port '5311'</span>
<span class="code-line"> option listen_addr '127.0.0.1'</span>
</pre></div>
<p>创建或修改 /etc/network/chaindns :</p>
<blockquote>
通过比较国内和国外 DNS 解析的差别区分是不是国内网站~</blockquote>
<div class="highlight"><pre><span class="code-line"><span></span>config chinadns</span>
<span class="code-line"> # 国内路由表的位置</span>
<span class="code-line"> option chnroute '/etc/chinadns_chnroute.txt'</span>
<span class="code-line"> # ChinaDNS 的端口(和上面的 DNS 转发要不一样)</span>
<span class="code-line"> option port '5353'</span>
<span class="code-line"> # 开不开 😂</span>
<span class="code-line"> option enable '1'</span>
<span class="code-line"> # 双向过滤 😂</span>
<span class="code-line"> option bidirectional '1'</span>
<span class="code-line"> # 上游服务器,第一个是汝 ISP 的DNS(</span>
<span class="code-line"> option server '0.0.0.0,127.0.0.1#5311'</span>
</pre></div>
<p>修改 /etc/network/dhcp :</p>
<div class="highlight"><pre><span class="code-line"><span></span>config dnsmasq</span>
<span class="code-line"> # 加一行 ChinaDNS 的服务器:</span>
<span class="code-line"> list server '127.0.0.1#5353'</span>
</pre></div>
<p>然后重启路由器应该就 OK (😂</p>
</div>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id10">参考来源</a></h2>
<ul class="simple">
<li><a class="reference external" href="https://lixingcong.github.io/2017/04/24/ipv6-nat-lede/">LEDE下的ipv6 NAT6</a></li>
<li><a class="reference external" href="https://cokebar.info/archives/664">Shadowsocks + ChnRoute 实现 OpenWRT / LEDE 路由器自动翻墙</a></li>
</ul>
</div>
常见的双因素验证类型2017-10-02T00:00:00+08:002017-10-02T00:00:00+08:00ホロtag:None,2017-10-02:/tech_misc/common_2fa_auth.html
<p><del>这就是咱鸽了两个月的理由 ?😂</del></p>
<p>Two-factor authentication (or 2FA) is one of the biggest-bang-for-your-buck
ways to improve the security of your online accounts.
Luckily, it's becoming much more common across the web. With often just a few
clicks in a given account's settings,
2FA adds an extra layer of security to your online accounts …</p>
<p><del>这就是咱鸽了两个月的理由 ?😂</del></p>
<p>Two-factor authentication (or 2FA) is one of the biggest-bang-for-your-buck
ways to improve the security of your online accounts.
Luckily, it's becoming much more common across the web. With often just a few
clicks in a given account's settings,
2FA adds an extra layer of security to your online accounts on top of your password.</p>
<p>双因素认证(Two-factor authentication,有时也缩写成 2FA)是保护汝在线账户安全的有力工具之一。
值得高兴的是,越来越多的服务和网站开始支持这一功能,设置起来也越来越简单。
(大多数时候只要在网站的账户设置页面上按步骤点击几下鼠标敲击几下键盘就好啦)
双因素认证在汝的密码之上对账户增加了另一层保护。</p>
<p>In addition to requesting something you know to log in (in this case, your password),
an account protected with 2FA will also request information from something you have
(usually your phone or a special USB security key).
Once you put in your password, you'll grab a code from a text or app on your phone or
plug in your security key before you are allowed to log in.
Some platforms call 2FA different things—Multi-Factor Authentication (MFA),
Two Step Verification (2SV), or Login Approvals—but no matter the name, the idea is the same:
Even if someone gets your password, they won't be able to access your accounts
unless they also have your phone or security key.</p>
<p>如果汝启用了双因素认证,在一般的登录工作完成以后(在这个环境下是汝输入完密码以后)
会要求其它的信息(通常在汝的手机上,或者是一个特殊的 USB 安全密钥)。
然后汝可能就会从手机短信或者应用上获得一串代码(或者插入安全密钥)来完成这一登录过程。
不同的地方可能对双因素认证有不同的称呼(汝可能听说过多因素认证,两步认证或是登录批准一类的词了呐~)
但不同名字下的目的却是相同的:即使有人得到了汝的密码,没有汝的手机或者安全密钥也是无法登录的呗~</p>
<p>There are four main types of 2FA in common use by consumer websites,
and it's useful to know the differences. Some sites offer only one option;
other sites offer a few different options. We recommend checking twofactorauth.org
to find out which sites support 2FA and how,
and turning on 2FA for as many of your online accounts as possible.
For more visual learners, this infographic from Access Now offers additional information.</p>
<p>这里举出了常见的四种双因素认证的例子,知道它们的区别还是有些用处的啦~
有些网站只提供一种选项,有些会提供好几种。汝如果可以上 <a class="reference external" href="https://twofactorauth.org">https://twofactorauth.org</a>
确认一下哪些网站提供双因素认证,而且尽可能的在汝使用的网站上打开双因素认证的话最好啦~
不够生动?<a class="reference external" href="https://www.accessnow.org/cms/assets/uploads/2017/09/Choose-the-Best-MFA-for-you.png">Access Now</a>
有一张介绍各种双因素验证方式优劣的图,汝最好也去看看呗~</p>
<p>Finally, the extra layer of protection from 2FA doesn't mean you should use a weak password.
Always make unique, strong passwords for each of your accounts,
and then put 2FA on top of those for even better log-in security.</p>
<p>最后,不要认为有了双因素验证的保护就可以用个弱密码啦 😡 ,还是和平常教导的一样,
为汝的每一个账户使用一个独立而且安全性足够强的密码,然后使用双因素认证多添一层保护咯~</p>
<div class="section" id="sms-2fa">
<h2><a class="toc-backref" href="#id9">SMS 2FA (基于短信的双因素认证)</a></h2>
<p>When you enable a site's SMS 2FA option, you'll often be asked to provide a phone number.
Next time you log in with your username and password, you'll also be asked to enter a short code
(typically 5-6 digits) that gets texted to your phone. This is a very popular option for sites to implement,
since many people have an SMS-capable phone number and it doesn't require installing an app.
It provides a significant step up in account security relative to just a username and password.</p>
<p>汝启用这样的双因素验证方式时便会像网站提供一个手机号码。
下次登录的时候除了用户名和密码以外汝还会要求输入一个从手机收到的代码(一般是五六个数字)。
这是种很常见的双因素验证的方法,因为大多数人的手机都能收短信(雾),而且实现起来也容易。
关键是效果显著啊(看起来比只输入用户名和密码安全)。</p>
<p>There are some disadvantages, however. Some people may not be comfortable giving their phone number—a piece of
potentially identifying information—to a given website or platform. Even worse,
some websites, once they have your phone number for 2FA purposes, will use it for other purposes,
like targeted advertising, conversion tracking, and password resets.
Allowing password resets based on a phone number provided for 2FA is an especially egregious problem,
because it means attackers using phone number takeovers could
get access to your account without even knowing your password.</p>
<p>当然这种方法的缺点也是有的:</p>
<ul>
<li><p class="first">有些人不想泄露自己的手机号(或者其他可能关联到自己身份的物件)给网站</p>
</li>
<li><p class="first">现在网站有了汝的手机号,怎么利用就看它们的人品了(例如可能会用来点对点投放广告……)</p>
</li>
<li><p class="first">如果这种方法能重置密码的话,攻击者只需要拿到汝的手机就能在不知道汝的账户的情况下重置密码然后控制汝的账户啦~</p>
<blockquote>
<p>详情可以看 <a class="reference external" href="https://www.theregister.co.uk/2017/07/10/att_falls_for_hacker_tricks/">这篇</a> 和
<a class="reference external" href="https://blog.cloudflare.com/the-four-critical-security-flaws-that-resulte/">另一篇</a> 报道。</p>
</blockquote>
</li>
</ul>
<p>Further, you can't log in with SMS 2FA if your phone is dead or can't connect to a mobile network.
This can especially be a problem when travelling abroad. Also,
it's often possible for an attacker to trick your phone company into assigning your phone number to a different SIM card,
allowing them to receive your 2FA codes. Flaws in the SS7 telephony protocol can allow the same thing.
Note that both of these attacks only reduce the security of your account to the security of your password.</p>
<p>再多想点,要是汝的手机坏了或者收不到信号(例如汝正在旅行)就收不到验证码了诶。
有小心机的攻击者可以用手段骗过运营商把汝的手机号转移给他,更高明的话可以
<a class="reference external" href="https://www.wired.com/2017/05/fix-ss7-two-factor-authentication-bank-accounts/">利用通信协议的漏洞</a> 。
这样汝的验证码就无声无息的被它们收到了哦~</p>
</div>
<div class="section" id="authenticator-app-totp-2fa">
<h2><a class="toc-backref" href="#id10">Authenticator App / TOTP 2FA (验证器应用 / 基于时间的一次性密码)</a></h2>
<p>Another phone-based option for 2FA is to use an application that generates codes locally based on a secret key.
Google Authenticator is a very popular application for this; FreeOTP is a free software alternative.
The underlying technology for this style of 2FA is called Time-Based One Time Password (TOTP),
and is part of the Open Authentication (OATH) architecture
(not to be confused with OAuth, the technology behind "Log in with Facebook" and "Log in with Twitter" buttons).</p>
<p>另外一种基于手机的验证就是生成验证代码的应用啦,例如 Google Authenticator (相当流行) 或者 FreeOTP (一个自由软件实现)。
驱动这一种双因素认证的技术是“基于时间的一次性代码”(Time-Based One Time Password ,缩写成TOTP),它也是开放认证
( Open Authentication)结构的一部分。</p>
<blockquote>
不过别和 OAUTH 搞混啦(就是网站上那些 “使用 Facebook 登录” “使用 Twitter 登录” 按钮背后的技术)</blockquote>
<p>If a site offers this style of 2FA, it will show you a QR code containing the secret key.
You can scan that QR code into your application.
If you have multiple phones you can scan it multiple times;
you can also save the image to a safe place or print it out if you need a backup.
Once you've scanned such a QR code, your application will produce a new 6-digit code every 30 seconds.
Similar to SMS 2FA, you'll have to enter one of these codes in addition to your username and password in order to log in.</p>
<p>如果汝正在使用的网站提供这种验证方法的话,汝会按要求扫描网站提供的二维码
(或者在生成器应用中输入一个密钥,其实二维码的内容就是这个密钥)。
当然汝也可以在汝的好几个不同的手机上重复同样的操作,也可以把二维码或者密钥打印出来放在个安全的地方备用。
汝的生成器应用会每隔一段时间提供一个新的代码(比较常见的是30秒?),和基于短信的
双因素认证类似,汝会在输入完用户名和密码后输入生成器生成的代码。</p>
<p>This style of 2FA improves on SMS 2FA because you can use it
even when your phone is not connected to a mobile network,
and because the secret key is stored physically on your phone.
If someone redirects your phone number to their own phone,
they still won't be able to get your 2FA codes. It also has some disadvantages:
If your phone dies or gets stolen,
and you don't have printed backup codes or a saved copy of the original QR code,
you can lose access to your account. For this reason,
many sites will encourage you to enable SMS 2FA as a backup. Also,
if you log in frequently on different computers,
it can be inconvenient to unlock your phone, open an app, and type in the code each time.</p>
<p>基于时间的一次性密码比基于短信的双因素认证好的一点是就算汝的手机没有连接到网络也可以使用。
而且因为密钥存储在你的手机上,所以得到了汝的手机号码的人也没法获得汝的验证代码。
当然缺点也不是没有:</p>
<ul class="simple">
<li>如果汝的手机出了点状况(例如坏了,丢了等等),汝就没办法获得验证代码啦…… 所以不少网站会建议汝添加一个手机号码备用。</li>
<li>另外如果汝经常在不同的电脑上登录的话,打开手机-解锁-打开验证器应用这一串过程可能会觉得有点麻烦(lll¬ω¬)</li>
</ul>
</div>
<div class="section" id="push-based-2fa">
<h2><a class="toc-backref" href="#id11">Push-based 2FA (基于推送通知的双因素认证)</a></h2>
<p>Some systems, like Duo Push and Apple's Trusted Devices method,
can send a prompt to one of your devices during login.
This prompt will indicate that someone (possibly you) is trying to log in,
and an estimated location for the login attempt. You can then approve or deny the attempt.</p>
<p>Duo Push 和 Apple 的“信任的设备”功能可以在登录时像汝的设备发送一条提示,
提示有人(当然可能是汝自己啦)在尝试登录。同时会提供一个估计的地址。汝可以选择批准或拒绝登录。</p>
<p>This style of 2FA improves on authenticator apps in two ways:
Acknowledging the prompt is slightly more convenient than typing in a code,
and it is somewhat more resistant to phishing. With SMS and authenticator apps,
a phishing site can simply ask for your code in addition to your password,
and pass that code along to the legitimate site when logging in as you.
Because push-based 2FA generally displays an estimated location based
on the IP address from which a login was originated, and most phishing
attacks don't happen to be operated from the same IP address ranges as their victims,
you may be able to spot a phishing attack in progress by noticing that
the estimated location differs from your actual location. However,
this requires that you pay close attention to a subtle security indicator.
And since location is only estimated, it's tempting to ignore any anomalies.
So the additional phishing protection provided by push-based 2FA is limited.</p>
<p>相对于基于时间的一次性密码,这种方式的优点有:
* 点个通知比敲几个数字或者字母少动手(
* 一定程度上可以防范一定程度高深的钓鱼网站(雾</p>
<p>手法高明的钓鱼网站可以画一个和真网站一样的输入验证码的界面迷惑用户,再坑点还能
把登录信息提交到真网站并把受害者重定向到真网站上去(嘿嘿嘿……</p>
<p>不过由于推送通知一般会包含登录地点的估计地址(通常通过 IP 地址估计),
而大多数情况下钓鱼网站不会和用户是一个 IP 地址,因此可能会被识别出来。
然而地址是估计的嘛所以也没有多少保护力 (╯‵□′)╯︵┻━┻</p>
<p>Disadvantages of push-based 2FA:
It's not standardized, so you can't choose from a variety of authenticator apps,
and can't consolidate all your push-based credentials in a single app.
Also, it requires a working data connection on your phone,
while Authenticator apps don't require any connection, and SMS can work on an SMS-only phone plane
(or in poor signal areas).</p>
<p>再相对的这个也有缺点:
* 标准还没统一,这就意味着汝没得选替代应用,也没法让多个账户使用一个应用。
* 需要汝的手机有网络连接(lll¬ω¬),然而 SMS 可以在没有手机网络连接的地方工作(验证器的应用连网络都不要)……</p>
</div>
<div class="section" id="fido-u2f-security-keys-fido">
<h2><a class="toc-backref" href="#id12">FIDO U2F / Security Keys (FIDO 通用双重因素 / 安全密钥)</a></h2>
<p>Universal Second Factor (U2F) is a relatively new style of 2FA,
typically using small USB, NFC or Bluetooth Low Energy (BTLE) devices often called "security keys."
To set it up on a site, you register your U2F device. On subsequent logins,
the site will prompt you to connect your device and tap it to allow the login.</p>
<p>通用双重因素(U2F)是一种新兴的双因素验证方法。常见的是 USB,NFC 或者蓝牙低功耗设备。(有时它们也被叫做“安全密钥)
汝在网站上注册了设备以后,下次登录时汝会被要求连接汝的设备然后按下上面的按钮来允许登录。</p>
<p>Like push-based 2FA, this means you don't have to type any codes. Under the hood, the U2F device recognizes the site you are on and responds with a code (a signed challenge) that is specific to that site. This means that U2F has a very important advantage over the other 2FA methods: It is actually phishing-proof, because the browser includes the site name when talking to the U2F device, and the U2F device won't respond to sites it hasn't been registered to. U2F is also well-designed from a privacy perspective: You can use the same U2F device on multiple sites, but you have a different identity with each site, so they can't use a single unique device identity for tracking.</p>
<p>和基于推送通知的双因素认证一样,汝不用多输入些啥。在幕后,汝的 U2F 设备记得汝注册的网站并与它交涉(?)。
这就是 U2F 的一个显著优点,它能更有效的防御钓鱼攻击(因为它不认识钓鱼网站,因此拒绝沟通(lll¬ω¬))。
U2F 也可以做到保护隐私:汝可以一个 U2F 设备打天下,但是需要的话也可以买好几个各司其职 <em>★,°</em>:.☆( ̄▽ ̄):<em>.°★</em> 。</p>
<p>The main downsides of U2F are browser support, mobile support, and cost.
Right now only Chrome supports U2F, though Firefox is working on an implementation.
The W3C is working on further standardizing the U2F protocol for the web,
which should lead to further adoption. Additionally, mobile support is challenging, because most U2F devices use USB.</p>
<p>摆在 U2F 面前的主要障碍就是浏览器和移动设备的支持以及花费。
目前只有 Chrome 支持 U2F (不过 Firefox 也在努力赶上啦)。
另外 W3C 也在加紧标准化 U2F 协议咯~
不过手机上好像还是很艰难的 o(><;)oo(因为大多数都是 USB 设备?)</p>
<p>There are a handful of U2F devices that work with mobile phones over NFC and BTLE.
NFC is supported only on Android. On iOS,
Apple does not currently allow apps to interact with the NFC hardware,
which prevents effective use of NFC U2F.
BTLE is much less desirable because a BTLE U2F device requires a battery,
and the pairing experience is less intuitive that tapping an NFC device.
However, poor mobile support doesn't mean that using U2F prevents you from logging in on mobile.
Most sites that support U2F also support TOTP and backup codes.
You can log in once on your mobile device using one of those options,
while using your phishing-proof U2F device for logins on the desktop.
This is particularly effective for mobile sites and apps that only require you to log in once,
and keep you logged in.</p>
<p>有些 U2F 设备通过 NFC 或者 蓝牙低功耗一类的技术支持移动设备(但是 Apple 一直不给应用用 NFC 所以……),
不过这并不能阻止咱们用 U2F (笑),因为提供 U2F 登录的网站大多数也会同时提供 TOTP 或者备份代码验证。
而且大多数移动应用只需要登陆一次就可以在手机上记住登录状态,
所以汝大可以在手机上用传统的方式登录,而在电脑上照插不误((lll¬ω¬))。</p>
<p>Lastly, most other 2FA methods are free, assuming you already have a smartphone. Most U2F devices cost money. Brad Hill has put together a review of various U2F devices, which generally cost USD $10-$20. GitHub has written a free, software-based U2F authenticator for macOS, but using this as your only U2F device would mean that losing your laptop could result in losing access to your account.</p>
<p>最后,如果假设汝有一部智能手机的话,其它的双因素验证方法可以说没有额外开销。
但是 U2F 要稍微的投资一下(大概在 10-20 $ 之间?),
<a class="reference external" href="https://github.com/hillbrad/U2FReviews/blob/master/README.md">Brad Hill 有一篇评测不同 U2F 设备的文章值得一读</a> 。
如果汝在使用 MacOS 的话,
可以考虑试试 <a class="reference external" href="https://github.com/github/SoftU2F">GitHub 编写的软 U2F 应用</a> 工具,
不过还是不要把鸡蛋放在一个篮子里就是啦~</p>
</div>
<div class="section" id="bonus-backup-codes">
<h2><a class="toc-backref" href="#id13">Bonus: Backup Codes (追加提示:备份代码 / 恢复代码)</a></h2>
<p>Sites will often give you a set of ten backup codes to print out
and use in case your phone is dead or you lose your security key.
Hard-copy backup codes are also useful when traveling,
or in other situations where your phone may not have signal or reliable charging.
No matter which 2FA method you decide is right for you,
it's a good idea to keep these backup codes in a safe place to make
sure you don't get locked out of your account when you need them.</p>
<p>在完成双因素验证设置时网站会提供一些备份代码给汝呗,一般是十个一组。
如果汝的手机或者安全密钥出现了一些情况(例如坏了,没有信号,或者丢了 😂)
或者没这么坏(例如只是汝出门旅行手机没电 or 没信号时……),就到了这些备份代码发挥自己的
价值的时候啦(雾)。
不过不管汝选择的是哪一种双因素验证方式,务必像对待汝的密码一样对待这些备份代码啦~
把它们放到一个只有汝知道又方便取用的地方吧。
(期望不要用到就是了)</p>
<hr class="docutils"/>
<blockquote>
<p>翻译自 <a class="reference external" href="https://www.eff.org">电子前哨基金会</a> 的
<a class="reference external" href="https://www.eff.org/deeplinks/2017/09/guide-common-types-two-factor-authentication-web">A Guide to Common Types of Two-Factor Authentication on the Web</a> ,
以 <a class="reference external" href="https://creativecommons.org/licenses/by/3.0/us/">知识共享 署名 3.0 US 协议</a> 授权。</p>
<p>电子前哨基金会是一个维护互联网上的公民自由的民权组织,汝可以通过 <a class="reference external" href="https://supporters.eff.org/donate">捐款</a>,
<a class="reference external" href="https://supporters.eff.org/join">成为会员</a> , 或者 <a class="reference external" href="https://www.eff.org/helpout">更多其它途径</a> 支持他们的工作咯~</p>
</blockquote>
</div>
某胡言乱语的 IRC 教程2017-08-03T00:00:00+08:002017-08-03T00:00:00+08:00ホロtag:None,2017-08-03:/tech_misc/a_abracadabra_irc_guide.html
<p><del>某个胡言乱语爪牙无措不知所云的 IRC 教程</del></p>
<div class="section" id="id1">
<h2>所以 IRC 是个啥?</h2>
<blockquote>
<p>因特网中继聊天(英语:Internet Relay Chat,缩写即IRC)是一种历史悠久、
应用广泛、成熟稳定的网络即时通讯协议,被广泛地应用于在线通讯和网络聊天中。
IRC最早由芬兰人雅尔口·欧伊卡林恁(Jarkko Oikarinen)
1988年8月创造以取代一个叫做MUT的程序,随后便一直在互联网中扮演重要角色。
凡是支持互联网的操作系统,几乎都可以使用IRC。虽然在2003年以后,
许多功能更加丰富的聊天程序和服务取代了只能进行纯文字交流的IRC,
许多曾经的大型IRC服务器日渐式微,但对于许多应用来说,依然是一种方便可靠的通讯方式。</p>
<p>IRC是一种RFC标准公开规定的,分布式的主从式架构——
即服务端对客户端进行服务的网络即时通讯协议,采用TCP和SSL协议。在IRC协议中,
不同的独立服务器可以互相进行中继,组成一个整体,提供更加大型聊天网络服务,
这也是IRC名字中“中继”的由来。</p>
<p>IRC是一种协议,或者说仅仅是提供了聊天的一种方式,
而不是指单一具体的某个聊天电脑程序、软件或者网络服务器。
换句话说,只要有服务器和客户端软件实现了IRC协议,
就能够以IRC设计的方式进行在线聊天。
例如,IRC服务器可以是某个组织公开所运营的大型网络,不需要客户注册和登录即可使用 …</p></blockquote></div>
<p><del>某个胡言乱语爪牙无措不知所云的 IRC 教程</del></p>
<div class="section" id="id1">
<h2>所以 IRC 是个啥?</h2>
<blockquote>
<p>因特网中继聊天(英语:Internet Relay Chat,缩写即IRC)是一种历史悠久、
应用广泛、成熟稳定的网络即时通讯协议,被广泛地应用于在线通讯和网络聊天中。
IRC最早由芬兰人雅尔口·欧伊卡林恁(Jarkko Oikarinen)
1988年8月创造以取代一个叫做MUT的程序,随后便一直在互联网中扮演重要角色。
凡是支持互联网的操作系统,几乎都可以使用IRC。虽然在2003年以后,
许多功能更加丰富的聊天程序和服务取代了只能进行纯文字交流的IRC,
许多曾经的大型IRC服务器日渐式微,但对于许多应用来说,依然是一种方便可靠的通讯方式。</p>
<p>IRC是一种RFC标准公开规定的,分布式的主从式架构——
即服务端对客户端进行服务的网络即时通讯协议,采用TCP和SSL协议。在IRC协议中,
不同的独立服务器可以互相进行中继,组成一个整体,提供更加大型聊天网络服务,
这也是IRC名字中“中继”的由来。</p>
<p>IRC是一种协议,或者说仅仅是提供了聊天的一种方式,
而不是指单一具体的某个聊天电脑程序、软件或者网络服务器。
换句话说,只要有服务器和客户端软件实现了IRC协议,
就能够以IRC设计的方式进行在线聊天。
例如,IRC服务器可以是某个组织公开所运营的大型网络,不需要客户注册和登录即可使用;
也可以是私自架设的内部IRC服务器,公司内部使用IRC进行交流。</p>
<p class="attribution">—<a class="reference external" href="https://zh.wikibooks.org/wiki/IRC">https://zh.wikibooks.org/wiki/IRC</a></p>
</blockquote>
<p>(话说本来想把这个教程写进 Wikibooks 去的但是就是严肃不起来啦 😂)</p>
<p>所以 IRC 就是一个 IM 协议啦,和 XMPP ,Matrix 一类的差不多。
虽然古老但是经久耐用啊(跑</p>
<blockquote>
<p>后面都连最大的 IRC 服务器 <a class="reference external" href="https://freenode.net">https://freenode.net</a> 好了 😂</p>
<p><a class="reference external" href="irc://irc.freenode.net:7000">irc://irc.freenode.net:7000</a></p>
<p>更多的端口和连法(例如 plain、Tor )请参阅 <a class="reference external" href="https://freenode.net/kb/answer/chat">https://freenode.net/kb/answer/chat</a></p>
</blockquote>
</div>
<div class="section" id="irc-an-li">
<h2>各种 IRC 客户端推(an)荐(li)兼连接教程 😂</h2>
<p>因为 IRC 协议开放,于是就有很多客户端可以用啦。
<a class="reference external" href="https://en.wikipedia.org/wiki/Comparison_of_Internet_Relay_Chat_clients">Wikipedia 上的这个页面</a>
有各种 IRC 客户端的比较,咱就只挑几个介绍一下怎么连接好了(跑</p>
<div class="section" id="webchat-freenode-net">
<h3>webchat.freenode.net</h3>
<p>freenode 的网页版,临时用下还好,不过还是用个客户端好呐~</p>
<blockquote>
<a class="reference external" href="https://webchat.freenode.net">https://webchat.freenode.net</a></blockquote>
<img alt="freenode_web" class="materialboxed responsive-img" src="/images/IRC_Guide/freenode_web.png"/>
<p>从上到下分别是昵称,频道,是否使用认证和 Google 的验证码,填好后一把梭 connect 就行 😂</p>
</div>
<div class="section" id="circ">
<h3>CIRC</h3>
<p>可以从 Chrome web store 下载:
<a class="reference external" href="https://chrome.google.com/webstore/detail/circ/bebigdkelppomhhjaaianniiifjbgocn?hl=zh-CN">https://chrome.google.com/webstore/detail/circ/bebigdkelppomhhjaaianniiifjbgocn?hl=zh-CN</a></p>
<img alt="circ" class="materialboxed responsive-img" src="/images/IRC_Guide/circ_1.png"/>
<p>用 /nick 指定一个昵称啦~</p>
<img alt="circ" class="materialboxed responsive-img" src="/images/IRC_Guide/circ_2.png"/>
<p>然后跟着指示操作就成?</p>
<p><a class="reference external" href="https://github.com/flackr/circ/">https://github.com/flackr/circ/</a> <- 文档在这里 😂</p>
</div>
<div class="section" id="chatzilla">
<h3>ChatZilla</h3>
<p>是 Firefox 的一个扩展啦:
<a class="reference external" href="https://addons.mozilla.org/en-US/firefox/addon/chatzilla/">https://addons.mozilla.org/en-US/firefox/addon/chatzilla/</a></p>
<p>如果需要汉化的话:
<a class="reference external" href="https://addons.mozilla.org/en-US/firefox/addon/chatzilla-zh-cn-language-pack/">https://addons.mozilla.org/en-US/firefox/addon/chatzilla-zh-cn-language-pack/</a></p>
<img alt="chatzilla" class="materialboxed responsive-img" src="/images/IRC_Guide/chatzilla_1.png"/>
<p>可以先戳左边的昵称改一下昵称(默认是用户名)然后戳那个 freenode 连接啦~</p>
<img alt="chatzilla" class="materialboxed responsive-img" src="/images/IRC_Guide/chatzilla_2.png"/>
<p><a class="reference external" href="http://chatzilla.hacksrus.com/intro">http://chatzilla.hacksrus.com/intro</a> <- 文档在这里(?) 😂</p>
</div>
<div class="section" id="polari">
<h3>Polari</h3>
<p>GNOME 的一部分:
<a class="reference external" href="https://wiki.gnome.org/Apps/Polari">https://wiki.gnome.org/Apps/Polari</a> <- 文档也在这(?) 😂</p>
<img alt="polari" class="materialboxed responsive-img" src="/images/IRC_Guide/polari_1.png"/>
<p>直接戳那个 + ~</p>
<img alt="polari" class="materialboxed responsive-img" src="/images/IRC_Guide/polari_2.png"/>
<p>可以看到 Polari 内置 freenode 啦 ~</p>
<img alt="polari" class="materialboxed responsive-img" src="/images/IRC_Guide/polari_3.png"/>
<p>有需要的话右键网络名称改下昵称呗~</p>
<img alt="polari" class="materialboxed responsive-img" src="/images/IRC_Guide/polari_4.png"/>
<p>然后就可以接着戳 + 加入聊天室啦 😂</p>
<img alt="polari" class="materialboxed responsive-img" src="/images/IRC_Guide/polari_5.png"/>
</div>
<div class="section" id="thunderbird">
<h3>Thunderbird</h3>
<p>喂喂咱只是个邮件客户端啊 😂</p>
<img alt="thunderbird" class="materialboxed responsive-img" src="/images/IRC_Guide/thunderbird_1.png"/>
<p>创建聊天账户(或者戳“聊天”然后添加账户)</p>
<img alt="thunderbird" class="materialboxed responsive-img" src="/images/IRC_Guide/thunderbird_2.png"/>
<p>选择聊天网络(当然是 IRC 啦 ……)</p>
<img alt="thunderbird" class="materialboxed responsive-img" src="/images/IRC_Guide/thunderbird_3.png"/>
<p>用户名和服务器(</p>
<img alt="thunderbird" class="materialboxed responsive-img" src="/images/IRC_Guide/thunderbird_4.png"/>
<p>这里应该填 SASL 的密码(?),不过现在啥都没有就直接下一步吧 😂</p>
<img alt="thunderbird" class="materialboxed responsive-img" src="/images/IRC_Guide/thunderbird_5.png"/>
<p>高级选项,应该写的够清楚了吧。只要保证用 SSL 就行(</p>
<img alt="thunderbird" class="materialboxed responsive-img" src="/images/IRC_Guide/thunderbird_6.png"/>
<p>保存!</p>
<img alt="thunderbird" class="materialboxed responsive-img" src="/images/IRC_Guide/thunderbird_7.png"/>
<p>在 Thunderbird 中加入频道的话,在聊天标签页中戳“加入聊天”,
然后输入相应的频道名称就好啦~</p>
<p><a class="reference external" href="https://support.mozilla.org/en-US/kb/instant-messaging-and-chat">https://support.mozilla.org/en-US/kb/instant-messaging-and-chat</a> <- 文档在这里 😂</p>
</div>
<div class="section" id="weechat">
<h3>WeeChat</h3>
<p>喵喵喵?</p>
<img alt="weechat" class="materialboxed responsive-img" src="/images/IRC_Guide/weechat_0.png"/>
<p>大概像这个样子……看咱 connect 一把梭啦 😂</p>
<blockquote>
<p># 设置服务器和端口</p>
<p>/set irc.server.freenode.addresses "chat.freenode.net/7000"</p>
<p># 开 SSL</p>
<p>/set irc.server.freenode.ssl on</p>
<p># 设置昵称和备用昵称 (默认是汝的用户名)</p>
<p>/set irc.server.freenode.nicks "mynick,mynick2,mynick3,mynick4,mynick5"</p>
<p># 设置自动连接</p>
<p>/set irc.server.freenode.autoconnect on</p>
<p># 连接</p>
<p>/connect freenode</p>
</blockquote>
<p><a class="reference external" href="/tech_misc/weechat_glowingbear_irc.html">或者可以像咱一样搞个 relay 😂</a></p>
<p><a class="reference external" href="https://freenode.net/kb/answer/registration">https://freenode.net/kb/answer/registration</a></p>
<p>官方的速成指南: <a class="reference external" href="https://weechat.org/files/doc/stable/weechat_quickstart.en.html">https://weechat.org/files/doc/stable/weechat_quickstart.en.html</a></p>
<p>或者更详(luo)细(suo)的文档:</p>
<p><a class="reference external" href="https://weechat.org/files/doc/stable/weechat_user.en.html">https://weechat.org/files/doc/stable/weechat_user.en.html</a></p>
</div>
</div>
<div class="section" id="id2">
<h2>更换和注册昵称</h2>
<p><a class="reference external" href="https://freenode.net/kb/answer/registration">https://freenode.net/kb/answer/registration</a></p>
<p>有时汝可能会收到这样的消息:</p>
<blockquote>
<p>This nickname is registered. Please choose a different nickname,</p>
<p>or identify via /msg NickServ identify <password>.</p>
</blockquote>
<p>这就表示汝现在使用的 nickname 已经有人占啦 😂 这种时候汝首先应该换一个 nickname,
像这样(大部分 IRC 客户端应该都支持):</p>
<blockquote>
/nick Foo</blockquote>
<p>然后汝是不是也想注册一个 nickname 呢?那首先汝先 /nick 一个没别人占而且合适的
nickname,然后:</p>
<blockquote>
/msg NickServ REGISTER password <a class="reference external" href="mailto:youremail@example.com">youremail@example.com</a></blockquote>
<p>把 password 换成汝自己设置的密码,<a class="reference external" href="mailto:youremail@example.com">youremail@example.com</a> 换成汝的一个邮箱。</p>
<blockquote>
顺便说一句大部分 IRC 客户端里 /msg 可以向一个用户发送 Private Message (私聊消息)?</blockquote>
<p>然后应该会说些话(具体是啥咱忘了 😂),嘛打开汝的邮箱找 freenode.net 发来的邮件咯。
邮件里应该会有这一行:</p>
<blockquote>
/msg NickServ VERIFY REGISTER nick token</blockquote>
<p>nick 是汝注册的 nickname ,token 是一串字母。把这行复制下来发出去就 OK 啦 😄</p>
<p>下次再登录的时候用 /msg NickServ identify <password> 验证(</p>
<p>一个账号上也可以注册多个 nickname:</p>
<ul class="simple">
<li>首先先登录上现有的昵称。</li>
<li>然后使用 /nick 命令 切换到另一个昵称。</li>
<li>最后用 /msg NickServ GROUP 归组昵称。</li>
</ul>
<p>如果客户端支持的话,可以参考 <a class="reference external" href="https://freenode.net/kb/answer/sasl">https://freenode.net/kb/answer/sasl</a> 的文档启用 SASL
登录,就不用每次都输入密码啦 😂 (或者让客户端记住密码)</p>
<p>可以与 NickServ 私聊时输入 HELP 获得更多用法。</p>
</div>
<div class="section" id="id3">
<h2>加入频道</h2>
<blockquote>
<a class="reference external" href="https://freenode.net/kb/answer/findingchannels">https://freenode.net/kb/answer/findingchannels</a>
像这样搜索频道,不过大多数人应该目标明确……</blockquote>
<p>大部分的客户端都可以用 /join #channel 的命令来加入频道,或者有加入频道的按钮。</p>
<p>进不去? 有的频道有不同的要求(例如只允许注册用户,强制 SSL ,需要邀请等等),
自己看客户端的报错咯 😂</p>
<blockquote>
其实还有可能是汝被 ban 啦,但是新人只要不乱说话应该不会 😂 ……</blockquote>
<p>加入频道之后请马上看 topic (可能在加入时以一条消息的方式显示,
或者在客户端的某个位置。或者可以用 /topic 命令查看)。 一个频道的 topic 一般包含
了这个频道的基本规则,新消息和可用的资源(例如相关联的项目的官方网站)。如果汝是
去提问的,可能会在链接的资源里找到答案 :-)</p>
</div>
<div class="section" id="id4">
<h2>交流</h2>
<ul>
<li><dl class="first docutils">
<dt>大部分的频道都建议直奔主题,所以不要问“在不在”,“有人吗”之类的问题,直接提出问题就好啦~</dt>
<dd><p class="first last">不过还是要记得提问的智慧……</p>
</dd>
</dl>
</li>
<li><dl class="first docutils">
<dt>要提及某个用户(类似于其它 IM 上的 @),习惯上是这样:</dt>
<dd><p class="first">要提及用户的昵称: 消息文本</p>
<p>大多数的 IRC 客户端会在这种情况下通知被提及的用户,有的客户端只要消息中有用户的
昵称就会通知 😂,不过记得不要滥用(有人觉得频繁的被通知是一种骚扰)</p>
<p class="last">有的客户端会帮汝补全昵称(自动或者按 Tab 键补全),或者点击昵称就会自动添加上面
那样的提及语句,如果有的话可以利用一下。</p>
</dd>
</dl>
</li>
<li><dl class="first docutils">
<dt>多数IRC客户端具备信息记录功能。不过 IRC 服务器不会。</dt>
<dd><p class="first last">再不过有的频道会使用某些方式(例如机器人)对记录进行存档(可能会在 Topic 上写出来),有需要的话可以问问。</p>
</dd>
</dl>
</li>
<li><dl class="first docutils">
<dt>千万别刷屏!😂 也就是不要短时间内发好几条消息(或者一条太长的消息)。</dt>
<dd><p class="first">各个频道具体的限制的话可以去看看 Topic ,或者去问问管理员
(Operator,有时会缩写成 op,汝的 IRC 客户端应该会特别的表示它们)。</p>
<p>刷屏可能(哦不,是一定)会使汝被频道封禁,严重的话可能会被服务器封禁。</p>
<p class="last">如果想发送文件或者一长段文字(例如软件的日志)的话,请使用 Pastebin 服务(一会儿再说)。</p>
</dd>
</dl>
</li>
<li><p class="first">有的频道里会有机器人,记得遵守频道里怎么用和啥时候用机器人的规则。</p>
</li>
<li><p class="first">然后,遵守 <a class="reference external" href="https://freenode.net/policies">freenode 一般规则</a> ,频道的其它规则和普通的礼仪 😂</p>
</li>
</ul>
</div>
<div class="section" id="pastebin">
<h2>使用 Pastebin 类服务</h2>
<p>Pastebin 是一类服务的称呼,可以叫“网络剪贴板”?</p>
<p>汝可以把信息发表到 Pastebin 上,会得到一个链接。然后把对应的网站链接发表在IRC频道内,解决刷屏问题。</p>
<p>解决刷屏问题。有些Pastebin还支持程序代码高亮,或者张贴图片,这样就可以解决IRC分享图片的问题啦~</p>
<p>嘛咱用过这两个:</p>
<ul class="simple">
<li>elimage 和 vimergy , 都是 <a class="reference external" href="https://github.com/Vim-cn">https://github.com/Vim-cn</a> 做的,一个贴图一个贴代码。</li>
<li>pb ( <a class="reference external" href="https://github.com/ptpb/pb">https://github.com/ptpb/pb</a> )</li>
</ul>
<p>其实类似的服务有不少,例如
<a class="reference external" href="https://pastebin.com">Pastebin.com</a> (但是被墙了),
各种自由软件项目通常也都会有自己的 Pastebin ,例如
<a class="reference external" href="https://paste.gnome.org">GNOME</a>, 和
<a class="reference external" href="https://paste.opensuse.org">openSUSE</a> 。</p>
<p>嘛 Pastebin 的网站上一般都有用法介绍,咱就不啰嗦啦 😂</p>
</div>
<div class="section" id="id5">
<h2>创建和注册频道</h2>
<p>嘛不知道汝有啥动机要创建频道那就直接上了 😂</p>
<p>加入个没人的频道会让汝自动获得 Operator 权限,但是一掉就丢了……
所以需要注册一下:</p>
<div class="section" id="id6">
<h3>注册前速查表?</h3>
<ul>
<li><p class="first">汝已经在 freenode 上注册了?</p>
</li>
<li><p class="first">要注册个啥频道?</p>
<blockquote>
<ul class="simple">
<li><a class="reference external" href="https://freenode.net/kb/answer/namespaces">https://freenode.net/kb/answer/namespaces</a></li>
<li>以 # 开头的是主要(Primary)频道(实在想不出怎么翻译了 😂),
注册这种频道可能需要一个在 freenode 上注册的组织 (
<a class="reference external" href="https://freenode.net/groupreg">https://freenode.net/groupreg</a> )。</li>
<li>以 ## 开头的是话题(Topical)频道,好像没有啥特殊要求?</li>
</ul>
</blockquote>
</li>
<li><p class="first">合不合乎频道政策(<a class="reference external" href="https://freenode.net/changuide">https://freenode.net/changuide</a>)
和指导(<a class="reference external" href="https://freenode.net/changuide">https://freenode.net/changuide</a>)?</p>
</li>
</ul>
</div>
<div class="section" id="id7">
<h3>注册频道</h3>
<p>首先先加入想要注册的频道,这时汝该会自动获得 Operator 权限。</p>
<p>然后和 ChanServ 私聊一下就好:</p>
<blockquote>
/msg ChanServ REGISTER ##channel</blockquote>
<p>大概会收到这样的消息:</p>
<blockquote>
<p>##channel is now registered to nickname.</p>
<p>Channel guidelines can be found on the freenode website:
<a class="reference external" href="http://freenode.net/changuide">http://freenode.net/changuide</a></p>
<p>This is an "about" channel as per
<a class="reference external" href="http://freenode.net/policies#channel-ownership">http://freenode.net/policies#channel-ownership</a></p>
</blockquote>
<p>这样就表示注册成功啦~</p>
<p>当汝下次加入这个频道时,可以和 ChanServ 私聊重新拿回 Operator 权限。</p>
<blockquote>
/msg ChanServ OP ##channel nickname</blockquote>
<p>频道的 Operator 可以用 /mode 命令为频道设置不同的模式
(参见 <a class="reference external" href="https://freenode.net/kb/answer/channelmodes">https://freenode.net/kb/answer/channelmodes</a> )。</p>
<p>和 NickServ 类似,可以与 ChanServ 私聊时输入 HELP 获得更多用法。</p>
<hr class="docutils"/>
<p>最后记得 <a class="reference external" href="https://freenode.net/kb/all">Freenode 的知识库</a> 是汝的 friends 哦(雾</p>
</div>
</div>
用内置硬盘安装 Arch Linux2017-07-31T00:00:00+08:002017-07-31T00:00:00+08:00ホロtag:None,2017-07-31:/arch-linux/installing_arch_linux_without_a_usb_stick.html
<p>用内置硬盘安装 Arch Linux,但是为啥不去买个 U 盘呢?😂</p>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id3">准备原材料</a></h2>
<ul class="simple">
<li>就一个 ArchISO 😂</li>
<li>用磁盘管理(或者其它汝中意的分区软件)分出一个比 ISO 大的分区,然后格式化成 FAT32。</li>
</ul>
</div>
<div class="section" id="windows-esp">
<h2><a class="toc-backref" href="#id4">在 Windows 中挂载 ESP</a></h2>
<p>用 diskpart 就好啦 ……</p>
<div class="highlight"><pre><span class="code-line"><span></span>diskpart</span>
<span class="code-line">list disk # 列出硬盘</span>
<span class="code-line">select disk 0 # 选择一块硬盘 (一般内置硬盘都是第0块)</span>
<span class="code-line">list partition # 列出分区</span>
<span class="code-line">select partition 1 # 选择一个分区</span>
<span class="code-line">assign letter=b # 分配一个盘符</span>
<span class="code-line">exit</span>
</pre></div>
<p>或者 mountvol 😂</p>
<div class="highlight"><pre><span class="code-line"><span></span>mountvol b: /s # 把 …</span></pre></div></div>
<p>用内置硬盘安装 Arch Linux,但是为啥不去买个 U 盘呢?😂</p>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id3">准备原材料</a></h2>
<ul class="simple">
<li>就一个 ArchISO 😂</li>
<li>用磁盘管理(或者其它汝中意的分区软件)分出一个比 ISO 大的分区,然后格式化成 FAT32。</li>
</ul>
</div>
<div class="section" id="windows-esp">
<h2><a class="toc-backref" href="#id4">在 Windows 中挂载 ESP</a></h2>
<p>用 diskpart 就好啦 ……</p>
<div class="highlight"><pre><span class="code-line"><span></span>diskpart</span>
<span class="code-line">list disk # 列出硬盘</span>
<span class="code-line">select disk 0 # 选择一块硬盘 (一般内置硬盘都是第0块)</span>
<span class="code-line">list partition # 列出分区</span>
<span class="code-line">select partition 1 # 选择一个分区</span>
<span class="code-line">assign letter=b # 分配一个盘符</span>
<span class="code-line">exit</span>
</pre></div>
<p>或者 mountvol 😂</p>
<div class="highlight"><pre><span class="code-line"><span></span>mountvol b: /s # 把 b: 换成一个没在用的盘符</span>
</pre></div>
<p>然后以管理员身份重启文件资源管理器(不然写不进去 😂)</p>
<div class="highlight"><pre><span class="code-line"><span></span>taskkill /im explorer.exe /f</span>
<span class="code-line">explorer.exe</span>
</pre></div>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id5">准备文件</a></h2>
<ul class="simple">
<li>把 Arch ISO 的文件复制到新的分区上,然后照着 ISO 改一下卷标 😂</li>
</ul>
<img alt="改卷标……" class="materialboxed responsive-img" src="/images/QVM_Arch/15.png"/>
<ul>
<li><p class="first">把 Arch ISO 里的 EFI/boot/bootx64.efi 复制到 ESP 的EFI/boot/bootx64.efi 上(记得备份),需要的话也可以把 EFI Shell 复制过来。</p>
</li>
<li><p class="first">把 Arch ISO 里的 arch/boot/x86_64 文件夹原样复制到 ESP 上(需要 microcode 更新的可以带上 arch/boot/intel-ucode.img</p>
</li>
<li><p class="first">把 Arch ISO 里的 loader 文件夹原样复制到 ESP 上 😂</p>
<blockquote>
<p>如果没复制 arch/boot/intel-ucode.img 的话,去 archiso-x86-64.conf 把 initrd /arch/boot/intel_ucode.img 删掉(</p>
</blockquote>
</li>
</ul>
<hr class="docutils"/>
<p>然后重启试试? 😂</p>
</div>
存在理论和堕落之狼(2017-07-22T00:00:00+08:002017-07-22T00:00:00+08:00ホロtag:None,2017-07-22:/life/status_20170728.html
<p>嗯没错这标题是瞎连的 😂</p>
<p>啊又鸽了一个月啦……</p>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id5">挖坑不填去摸鱼(</a></h2>
<p>除了之前就开了然后一直没填的一把坑以外又在妄想扩写提问的智慧了……</p>
<p>然而自己似乎智慧不足的样子 😭</p>
<p><a class="reference external" href="https://wiki.yoitsu.moe/wiki/Portal:Ask">https://wiki.yoitsu.moe/wiki/Portal:Ask</a> 🌲🍃</p>
<p>^ 就是这个……</p>
<p>还用更新的 Telegram Bot API 糊了一个 Titlebot ,然后瞬间被更圆的轮子打败,
于是弃坑……</p>
<blockquote>
#uselessasme</blockquote>
</div>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id6">堕落之中被惊醒(</a></h2>
<blockquote>
“你这样是学不到东西的!” -- 某个地方的某人</blockquote>
<p>是啊,所以 IIDX 打到 SP 五段并没有什么用处(哪怕皆了又有啥用,
更何况咱这种十分之一吊子还没有皆传的能力 😔)</p>
<p>最近周围开始有人打赛尔达传说了呢,然而咱不管是 3DS 还是 Switch 都没有啊 😂</p>
<p>LL 和 CGSS 不会组卡啊~</p>
<p>所以咱连个休闲玩家都算不上……</p>
<blockquote>
#badskillasme</blockquote>
</div>
<div class="section" id="id4">
<h2><a class="toc-backref" href="#id7">计划? 不存在的)</a></h2>
<ul>
<li><p class="first">反正不会计划</p>
</li>
<li><p class="first">计划了也不会去实施</p>
</li>
<li><p class="first">实施了也不一定达到目标 …</p></li></ul></div>
<p>嗯没错这标题是瞎连的 😂</p>
<p>啊又鸽了一个月啦……</p>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id5">挖坑不填去摸鱼(</a></h2>
<p>除了之前就开了然后一直没填的一把坑以外又在妄想扩写提问的智慧了……</p>
<p>然而自己似乎智慧不足的样子 😭</p>
<p><a class="reference external" href="https://wiki.yoitsu.moe/wiki/Portal:Ask">https://wiki.yoitsu.moe/wiki/Portal:Ask</a> 🌲🍃</p>
<p>^ 就是这个……</p>
<p>还用更新的 Telegram Bot API 糊了一个 Titlebot ,然后瞬间被更圆的轮子打败,
于是弃坑……</p>
<blockquote>
#uselessasme</blockquote>
</div>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id6">堕落之中被惊醒(</a></h2>
<blockquote>
“你这样是学不到东西的!” -- 某个地方的某人</blockquote>
<p>是啊,所以 IIDX 打到 SP 五段并没有什么用处(哪怕皆了又有啥用,
更何况咱这种十分之一吊子还没有皆传的能力 😔)</p>
<p>最近周围开始有人打赛尔达传说了呢,然而咱不管是 3DS 还是 Switch 都没有啊 😂</p>
<p>LL 和 CGSS 不会组卡啊~</p>
<p>所以咱连个休闲玩家都算不上……</p>
<blockquote>
#badskillasme</blockquote>
</div>
<div class="section" id="id4">
<h2><a class="toc-backref" href="#id7">计划? 不存在的)</a></h2>
<ul>
<li><p class="first">反正不会计划</p>
</li>
<li><p class="first">计划了也不会去实施</p>
</li>
<li><p class="first">实施了也不一定达到目标</p>
</li>
<li><p class="first">😂</p>
<blockquote>
<p>#noplanasme</p>
</blockquote>
</li>
</ul>
<hr class="docutils"/>
<p>所以干点啥好呢……</p>
</div>
当汝有个 DualShock 4 时……2017-06-28T00:00:00+08:002017-06-28T00:00:00+08:00ホロtag:None,2017-06-28:/tech_misc/when_you_have_a_ds4.html
<p><del>当有 DualShock 4 的 friends 焦躁不安时……</del></p>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id4">啥是 DualShock 4 ?</a></h2>
<p>就是 PlayStation 4 的控制器啦 😂</p>
<blockquote>
<p><a class="reference external" href="https://asia.playstation.com/chs-hk/accessories/dualshock4/">https://asia.playstation.com/chs-hk/accessories/dualshock4/</a></p>
<p>⇪网页标题: 接口设备 | DUALSHOCK 4 | PlayStation</p>
<p>关于 DualShock 4 的介绍在这里 😂</p>
</blockquote>
</div>
<div class="section" id="steam-friends">
<h2><a class="toc-backref" href="#id5">玩 Steam 的 friends ?</a></h2>
<p>首先打开 Steam 的大屏幕模式啦~</p>
<img alt="大屏幕模式大概位于用户名的旁边。" class="materialboxed responsive-img" src="/images/DS4_Arch/0.png"/>
<p>然后把控制器设置中的 “PlayStation 4 控制器支持” 打开。</p>
<img alt="启动 Steam 的 PlayStation 4 控制器支持" class="materialboxed responsive-img" src="/images/DS4_Arch/1.png"/>
<p>有那个心情的话可以去调整一下偏好设置(</p>
<img alt="某些偏好设置" class="materialboxed responsive-img" src="/images/DS4_Arch/2.png"/>
<p>支持控制器的游戏会有一个控制器图标 😂</p>
<img alt="支持控制器的游戏会有一个控制器图标" class="materialboxed responsive-img" src="/images/DS4_Arch/3.png"/>
<p>需要的话就调整游戏对应的控制器设置</p>
<img alt="游戏对应的控制器设置的位置" class="materialboxed responsive-img" src="/images/DS4_Arch/4.png"/>
<p>但是咱不承接按键配置服务(如果有人送咱想设置的游戏的话咱倒是可以试试 😂</p>
</div>
<div class="section" id="windows">
<h2><a class="toc-backref" href="#id6">Windows ?</a></h2>
<p>可以试试一个叫 <a class="reference external" href="http://ds4windows.com/">DS4Windows</a> 的小工具 …</p></div>
<p><del>当有 DualShock 4 的 friends 焦躁不安时……</del></p>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id4">啥是 DualShock 4 ?</a></h2>
<p>就是 PlayStation 4 的控制器啦 😂</p>
<blockquote>
<p><a class="reference external" href="https://asia.playstation.com/chs-hk/accessories/dualshock4/">https://asia.playstation.com/chs-hk/accessories/dualshock4/</a></p>
<p>⇪网页标题: 接口设备 | DUALSHOCK 4 | PlayStation</p>
<p>关于 DualShock 4 的介绍在这里 😂</p>
</blockquote>
</div>
<div class="section" id="steam-friends">
<h2><a class="toc-backref" href="#id5">玩 Steam 的 friends ?</a></h2>
<p>首先打开 Steam 的大屏幕模式啦~</p>
<img alt="大屏幕模式大概位于用户名的旁边。" class="materialboxed responsive-img" src="/images/DS4_Arch/0.png"/>
<p>然后把控制器设置中的 “PlayStation 4 控制器支持” 打开。</p>
<img alt="启动 Steam 的 PlayStation 4 控制器支持" class="materialboxed responsive-img" src="/images/DS4_Arch/1.png"/>
<p>有那个心情的话可以去调整一下偏好设置(</p>
<img alt="某些偏好设置" class="materialboxed responsive-img" src="/images/DS4_Arch/2.png"/>
<p>支持控制器的游戏会有一个控制器图标 😂</p>
<img alt="支持控制器的游戏会有一个控制器图标" class="materialboxed responsive-img" src="/images/DS4_Arch/3.png"/>
<p>需要的话就调整游戏对应的控制器设置</p>
<img alt="游戏对应的控制器设置的位置" class="materialboxed responsive-img" src="/images/DS4_Arch/4.png"/>
<p>但是咱不承接按键配置服务(如果有人送咱想设置的游戏的话咱倒是可以试试 😂</p>
</div>
<div class="section" id="windows">
<h2><a class="toc-backref" href="#id6">Windows ?</a></h2>
<p>可以试试一个叫 <a class="reference external" href="http://ds4windows.com/">DS4Windows</a> 的小工具,
不管是下载还是安装都在那了 😂</p>
</div>
<div class="section" id="arch-linux">
<h2><a class="toc-backref" href="#id7">Arch Linux ?</a></h2>
<blockquote>
其它发行版应该也可以 😂</blockquote>
<p>可以试试一个叫 <a class="reference external" href="https://github.com/chrippa/ds4drv">ds4drv</a> 的小工具,
Arch 的话可以从 AUR 里装(</p>
<p>接着在 ~/.config/ds4drv.conf 写个配置文件,可以看看
<a class="reference external" href="https://github.com/chrippa/ds4drv/blob/master/ds4drv.conf">官方的样例</a>
或者 <a class="reference external" href="https://wiki.yoitsu.moe/wiki/Ds4drv_config">咱写的</a> 😂</p>
<p>写完了就启动一下试试?</p>
<hr class="docutils"/>
<blockquote>
对咱又水了一篇 😂</blockquote>
</div>
用 Arch Live 修 Arch 的某些姿势2017-05-31T00:00:00+08:002017-05-31T00:00:00+08:00ホロtag:None,2017-05-31:/arch-linux/repair_arch_thorugh_live.html
<p>修电脑三年(划掉 😂</p>
<div class="section" id="live-arch">
<h2><a class="toc-backref" href="#id3">啥时候需要 Live 介质修 Arch ?</a></h2>
<p>比如:</p>
<ul class="simple">
<li>笨蛋 Windows 升级以后把 bootloader 赶跑了</li>
<li>内核炸了没法启动又没有备用内核</li>
<li>基础库炸了(例如 glibc )</li>
<li>pacman 自己因为某种原因炸了(还是例如 glibc 炸了)</li>
<li>忘了密码……</li>
</ul>
<p>等等…… 😂</p>
</div>
<div class="section" id="live-live">
<h2><a class="toc-backref" href="#id4">准备 Live 介质和进入 Live 环境</a></h2>
<p>这个应该不用多说了吧 😂 简而言之 MBR 就 dd UEFI 就格式化完直接把 ISO 里的文件
复制到 U 盘上咯~</p>
<p>如果有 Windows 的话就用 rufus 😂</p>
<p>然后启动进去进行必要的配置
( <a class="reference external" href="/arch-linux/installing_arch_linux_for_complete_newbies.html">例如参考咱原来写的那个?</a> ),
不过因为只是修复而已,连上网设置好镜像就行(如果汝原来的系统里的 pacman …</p></div>
<p>修电脑三年(划掉 😂</p>
<div class="section" id="live-arch">
<h2><a class="toc-backref" href="#id3">啥时候需要 Live 介质修 Arch ?</a></h2>
<p>比如:</p>
<ul class="simple">
<li>笨蛋 Windows 升级以后把 bootloader 赶跑了</li>
<li>内核炸了没法启动又没有备用内核</li>
<li>基础库炸了(例如 glibc )</li>
<li>pacman 自己因为某种原因炸了(还是例如 glibc 炸了)</li>
<li>忘了密码……</li>
</ul>
<p>等等…… 😂</p>
</div>
<div class="section" id="live-live">
<h2><a class="toc-backref" href="#id4">准备 Live 介质和进入 Live 环境</a></h2>
<p>这个应该不用多说了吧 😂 简而言之 MBR 就 dd UEFI 就格式化完直接把 ISO 里的文件
复制到 U 盘上咯~</p>
<p>如果有 Windows 的话就用 rufus 😂</p>
<p>然后启动进去进行必要的配置
( <a class="reference external" href="/arch-linux/installing_arch_linux_for_complete_newbies.html">例如参考咱原来写的那个?</a> ),
不过因为只是修复而已,连上网设置好镜像就行(如果汝原来的系统里的 pacman 没坏的
话,就连上网就行咯~)</p>
<p>然后把原来的 Arch 挂载到某个目录 (例如 /mnt )。</p>
</div>
<div class="section" id="chroot">
<h2><a class="toc-backref" href="#id5">chroot 修复</a></h2>
<p>当然是 arch-chroot 一把梭咯 😂</p>
<blockquote>
arch-chroot /mnt</blockquote>
<p>然后遇到啥问题就治啥咯~</p>
</div>
<div class="section" id="pacman">
<h2><a class="toc-backref" href="#id6">修坏掉的 pacman</a></h2>
<p>用 live 的 pacman 操作原来的系统的话,记得带上 --root 和 --dbpath 选项。</p>
<p>例如这样重装 pacman :</p>
<blockquote>
pacman -S pacman --root /mnt --dbpath /mnt/var/lib/pacman</blockquote>
<p>或者这样隔空滚系统(雾:</p>
<blockquote>
pacman -Syu --root /mnt --dbpath /mnt/var/lib/pacman</blockquote>
<p>或者这样重装所有包(大雾:</p>
<blockquote>
pacman -S $(pacman -Qq --dbpath /mnt/var/lib/pacman) --root /mnt --dbpath /mnt/var/lib/pacman</blockquote>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id7">记得看看这些 😋</a></h2>
<ul>
<li><p class="first"><a class="reference external" href="https://wiki.archlinux.org/index.php/Pacman/Tips_and_tricks">https://wiki.archlinux.org/index.php/Pacman/Tips_and_tricks</a></p>
</li>
<li><p class="first"><a class="reference external" href="https://wiki.archlinux.org/index.php/Installation_guide">https://wiki.archlinux.org/index.php/Installation_guide</a></p>
<blockquote>
<p>如果没法治疗的话,还可以重装啊(跑 😂</p>
</blockquote>
</li>
</ul>
</div>
群体中的人和气氛2017-05-18T00:00:00+08:002017-05-18T00:00:00+08:00ホロtag:None,2017-05-18:/life/community_environments.html
<p>那些咱讨厌的气氛,剩下的应该都喜欢 (或者至少不讨厌 😂</p>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id4">一份苍白无力的「免责声明」</a></h2>
<blockquote>
@ <a class="reference external" href="/links.html#tcdw">tcdw</a> (跑 😂</blockquote>
<ul class="simple">
<li>咱不喜欢不代表大多数人不喜欢(有人说不定还喜欢 🤦)</li>
<li>并不想针对某个群体或某个人 <del>如果真对号入座了还请装作没看见……</del></li>
<li>然而有时咱自己也做了同样的事( <del>这不是双重标准么……</del> )</li>
<li><del>还不是因为咱太敏感了……</del></li>
</ul>
</div>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id5">讨厌的气氛 (程度不分先后🤦</a></h2>
<blockquote>
可能以后还会更新…… 😂</blockquote>
<ul>
<li><p class="first">一上来或者一言不合就菊苣啦大佬啦大神啦一类的叫。</p>
<blockquote>
<p>嗯地球上最不会灭绝的物种就这些了……</p>
</blockquote>
</li>
<li><p class="first">/me 提问然后没人搭理,一种被阿卡林附身的感觉 😂</p>
<blockquote>
<p>就算不知道说不知道也好啊(虽然有人认为不知道就保持沉默没什么问题……</p>
</blockquote>
</li>
<li><p class="first">解决问题时跑题跑的漫无边际,最后问题也没解决……</p>
<blockquote>
<p>先解决当下的问题再来优化好不好 ……</p>
</blockquote>
</li>
<li><p class="first">新人来提问然后被甩一脸提问的智慧然后被吓跑</p>
<blockquote>
<p>别忘了咱和汝曾经也是新手过嘛,态度温和点呗……</p>
<p><del>虽然大家都很忙不想在朽木上浪费时间……</del></p>
</blockquote>
</li>
<li><p class="first">太早的给某人下判断,<del>例如笨蛋智障一类的</del></p>
<blockquote>
<p>🤦……</p>
</blockquote>
</li>
<li><p class="first">在主题群里跑题跑的漫无边际 😂</p>
</li>
<li><p class="first">Don't feed ……</p>
<blockquote>
<p>the trolls ! 😂</p>
</blockquote>
</li>
<li><p class="first">没有共同语言……</p>
<blockquote>
<p>那咱进去干什么……</p>
</blockquote>
</li>
</ul>
<p>好吧一时就想起来这些…… 😂😂</p>
</div>
Raspberry Pi + Arch Linux ARM + Shadowsocks = ?2017-05-09T00:00:00+08:002017-05-09T00:00:00+08:00ホロtag:None,2017-05-09:/arch-linux/alarm_and_ss_redir.html
<p>利用树莓派+Arch Linux ARM+shadowsocks-透明代理 AP <del>搞大新闻……</del></p>
<p>…… (此处应有风滚草 😂</p>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id3">首先是致谢(画风不太对劲……</a></h2>
<ul class="simple">
<li>百合仙子 <a class="reference external" href="/links.html#lilydjwg">lilydjwg</a> 的
<a class="reference external" href="https://blog.lilydjwg.me/2016/9/13/wi-fi-share-in-linux.205870.html">Linux 下的 Wi-Fi 分享</a></li>
<li><a class="reference external" href="/links.html#petercxy">petercxy</a> 的
<a class="reference external" href="https://typeblog.net/set-up-shadowsocks-with-iptables-and-ipset-on-archlinux/">在 ArchLinux 上配置 shadowsocks + iptables + ipset 实现自动分流</a></li>
<li>百合和夏狼 <a class="reference external" href="/links.html#sherlock_holo">sherlock_holo</a> 还帮咱纠正了点 iptables 的配置。</li>
</ul>
<p>谢谢啦~ 😋</p>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id4">一些准备工作</a></h2>
<ul>
<li><p class="first">去买块树莓派,<del>吃了</del> 装好 Arch Linux ARM :</p>
<blockquote>
<p>例如 <a class="reference external" href="https://archlinuxarm.org/platforms/armv8/broadcom/raspberry-pi-3">https://archlinuxarm.org/platforms/armv8/broadcom/raspberry-pi-3</a> ?</p>
</blockquote>
</li>
<li><p class="first">用 hostapd 做好热点 …</p></li></ul></div>
<p>利用树莓派+Arch Linux ARM+shadowsocks-透明代理 AP <del>搞大新闻……</del></p>
<p>…… (此处应有风滚草 😂</p>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id3">首先是致谢(画风不太对劲……</a></h2>
<ul class="simple">
<li>百合仙子 <a class="reference external" href="/links.html#lilydjwg">lilydjwg</a> 的
<a class="reference external" href="https://blog.lilydjwg.me/2016/9/13/wi-fi-share-in-linux.205870.html">Linux 下的 Wi-Fi 分享</a></li>
<li><a class="reference external" href="/links.html#petercxy">petercxy</a> 的
<a class="reference external" href="https://typeblog.net/set-up-shadowsocks-with-iptables-and-ipset-on-archlinux/">在 ArchLinux 上配置 shadowsocks + iptables + ipset 实现自动分流</a></li>
<li>百合和夏狼 <a class="reference external" href="/links.html#sherlock_holo">sherlock_holo</a> 还帮咱纠正了点 iptables 的配置。</li>
</ul>
<p>谢谢啦~ 😋</p>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id4">一些准备工作</a></h2>
<ul>
<li><p class="first">去买块树莓派,<del>吃了</del> 装好 Arch Linux ARM :</p>
<blockquote>
<p>例如 <a class="reference external" href="https://archlinuxarm.org/platforms/armv8/broadcom/raspberry-pi-3">https://archlinuxarm.org/platforms/armv8/broadcom/raspberry-pi-3</a> ?</p>
</blockquote>
</li>
<li><p class="first">用 hostapd 做好热点。</p>
</li>
<li><p class="first">在树莓派上设置好 shadowsocks 的自动分流。</p>
<blockquote>
<p>不过要修改 ss-redir 的配置文件,让 ss-redir 监听在 0.0.0.0 上 😂</p>
</blockquote>
</li>
</ul>
<p>这时连接汝的 AP 时应该能正常访问没被墙的网站,树莓派上也能访问被墙的网站( curl 一下试试?)</p>
</div>
<div class="section" id="iptables">
<h2><a class="toc-backref" href="#id5">就是多几行 iptables 规则而已 😂</a></h2>
<p>如果汝和咱一样用了
<a class="reference external" href="https://github.com/PeterCxy/shadowsocks-auto-redir.sh">PeterCxy 的简单粗暴的脚本</a>
的话,打开那个脚本 (应该在 /opt/shadowsocks-auto-redir/shadowsocks-auto-redir )。</p>
<p>然后找到这一行 ,在下面加上一行:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># Redirect to ss-redir port</span></span>
<span class="code-line"><span class="nv">LOCAL_PORT</span><span class="o">=</span><span class="sb">`</span>jq -r <span class="s2">".local_port"</span> <span class="nv">$CONFIG_PATH</span><span class="sb">`</span></span>
<span class="code-line"></span>
<span class="code-line">do_iptables -t nat -A SHADOWSOCKS -p tcp -j REDIRECT --to-port <span class="nv">$LOCAL_PORT</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="c1"># do_iptables -t nat -A PREROUTING -i <汝 AP 的接口名称> -p tcp -j REDIRECT --to-ports $LOCAL_PORT</span></span>
<span class="code-line"><span class="c1"># 这一行大概就是把来自汝 AP 的 TCP 连接转发给 $LOCAL_PORT 端口的 ss-redir 来处理?</span></span>
<span class="code-line">do_iptables -t nat -A PREROUTING -i wlan0_ap -p tcp -j REDIRECT --to-ports <span class="nv">$LOCAL_PORT</span></span>
</pre></div>
<p>感觉自己还是用要学习一个 iptables 呐~</p>
<blockquote>
<a class="reference external" href="http://ipset.netfilter.org/iptables.man.html">http://ipset.netfilter.org/iptables.man.html</a></blockquote>
<p>保存以后重新启动一下服务来试试效果呗~</p>
</div>
为 MediaWiki 安装 RESTBase 和显示数学公式2017-05-04T00:00:00+08:002017-05-04T00:00:00+08:00ホロtag:None,2017-05-04:/mediawiki/restbase_and_math_for_mediawiki.html
<p>为MediaWiki安装来自 <a class="reference external" href="https://wikimediafoundation.org">维基媒体基金会</a> 的
<a class="reference external" href="https://www.mediawiki.org/wiki/RESTBase">RESTBase</a> 和顺便显示下数学公式…… 😂.</p>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id5">按常规先来解释下这些东西是啥 😂</a></h2>
<blockquote>
<p>RESTBase is a caching / storing API proxy backing the Wikimedia REST API.
Its configuration is based on Swagger specs,
and its primary storage backend is using Cassandra. It powers "rest_v1",
the Wikimedia REST content API used by VisualEditor to retrieve page HTML for editing …</p></blockquote></div>
<p>为MediaWiki安装来自 <a class="reference external" href="https://wikimediafoundation.org">维基媒体基金会</a> 的
<a class="reference external" href="https://www.mediawiki.org/wiki/RESTBase">RESTBase</a> 和顺便显示下数学公式…… 😂.</p>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id5">按常规先来解释下这些东西是啥 😂</a></h2>
<blockquote>
<p>RESTBase is a caching / storing API proxy backing the Wikimedia REST API.
Its configuration is based on Swagger specs,
and its primary storage backend is using Cassandra. It powers "rest_v1",
the Wikimedia REST content API used by VisualEditor to retrieve page HTML for editing.</p>
<p class="attribution">—<a class="reference external" href="https://www.mediawiki.org/wiki/RESTBase">https://www.mediawiki.org/wiki/RESTBase</a></p>
</blockquote>
<p>嘛,大概就是给 MediaWiki 提供一层 RESTful API 方便各种应用访问(例如 VisualEditor
和 Mathoid ……)</p>
<p>然后偷张 WMF 自己画的结构图:</p>
<object class="responsive-video" data="https://upload.wikimedia.org/wikipedia/commons/a/ab/Restbase_request_flow.svg" type="image/svg+xml">
Parsoid的工作原理</object>
<p>具体的效果大家可以先去 <a class="reference external" href="https://www.mediawiki.org/api/rest_v1/">MediaWiki.org</a> 瞅一眼…… 😂</p>
<p>而 Mathoid 嘛:</p>
<blockquote>
<p>Mathoid is an application which takes various forms of math input and converts it to MathML + SVG or PNG output.</p>
<p class="attribution">—<a class="reference external" href="https://www.mediawiki.org/wiki/Mathoid">https://www.mediawiki.org/wiki/Mathoid</a></p>
</blockquote>
<p>本来 MediaWiki 是支持 latex 显示数学公式的,不过咱这里一直没出来 😂 然后就用这个了……</p>
<blockquote>
(立 flag)啥时候把这些东西搞进 AUR 啊……</blockquote>
</div>
<div class="section" id="mathoid">
<h2><a class="toc-backref" href="#id6">安装 Mathoid</a></h2>
<p><a class="reference external" href="https://www.mediawiki.org/wiki/Mathoid">https://www.mediawiki.org/wiki/Mathoid</a> <- 官方的文档……</p>
<p>首先先装上 nodejs 和 npm (装过 VisualEditor 的应该就有了啦)</p>
<p>还有 Mathoid 的依赖,在 Arch 上大概是这些:</p>
<blockquote>
<p># pacman -S librsvg pkg-config</p>
<p>然后从 AUR 装 <a href="https://aur.archlinux.org/packages/?O=0&K=nodejs-mocha" title="在 AUR 上搜索nodejs-mocha">nodejs-mocha <sup>AUR</sup> </a></p>
</blockquote>
<p>然后新建个文件夹 <del>喜闻乐见 npm install ......</del></p>
<blockquote>
<p>npm install mathoid</p>
<p>cd node_modules/mathoid</p>
<p>npm test</p>
<p>node server.js</p>
</blockquote>
<p>没问题的话 Mathoid 就应该跑在 <a class="reference external" href="http://localhost:10044">http://localhost:10044</a> 上了,<del>算了抄个 systemd 系统单元好了……</del></p>
<div class="highlight"><pre><span class="code-line"><span></span>[Unit]</span>
<span class="code-line">Description=Mediawiki Mathoid Service</span>
<span class="code-line">Documentation=https://www.mediawiki.org/wiki/Mathoid</span>
<span class="code-line">Wants=local-fs.target network.target</span>
<span class="code-line">After=local-fs.target network.target</span>
<span class="code-line"></span>
<span class="code-line">[Install]</span>
<span class="code-line">WantedBy=multi-user.target</span>
<span class="code-line"></span>
<span class="code-line">[Service]</span>
<span class="code-line">Type=simple</span>
<span class="code-line">User=nobody</span>
<span class="code-line">Group=nobody</span>
<span class="code-line">WorkingDirectory=/path/to/mathoid</span>
<span class="code-line">ExecStart=/usr/bin/node /path/to/mathoid/server.js</span>
<span class="code-line">KillMode=process</span>
<span class="code-line">Restart=on-success</span>
<span class="code-line">PrivateTmp=true</span>
<span class="code-line">StandardOutput=syslog</span>
</pre></div>
</div>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id7">安装 RESTBase</a></h2>
<p><a class="reference external" href="https://www.mediawiki.org/wiki/Content_translation/cxserver/Setup#RESTBase_Server">https://www.mediawiki.org/wiki/Content_translation/cxserver/Setup#RESTBase_Server</a> <- 官方的文档……</p>
<p>然后找个地方 clone 一下 RESTBase 的版本库,然后 <del>喜闻乐见 npm install ......</del> ,
再把样例配置文件复制一份出来备用:</p>
<blockquote>
<p>git clone <a class="reference external" href="https://github.com/wikimedia/restbase.git">https://github.com/wikimedia/restbase.git</a></p>
<p>cd restbase</p>
<p>npm install</p>
<p>cp config.example.yaml config.yaml</p>
</blockquote>
<p>接着改些字段,注意 yml 和 Python 一样要求一致的缩进 😂</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># 跳过前面的一大把注释……</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="nt">services</span><span class="p">:</span></span>
<span class="code-line"><span class="p p-Indicator">-</span> <span class="nt">name</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">restbase</span></span>
<span class="code-line"> <span class="l l-Scalar l-Scalar-Plain">module</span><span class="p p-Indicator">:</span> <span class="l l-Scalar l-Scalar-Plain">hyperswitch</span></span>
<span class="code-line"> <span class="l l-Scalar l-Scalar-Plain">conf</span><span class="p p-Indicator">:</span></span>
<span class="code-line"> <span class="nt">port</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">7231</span></span>
<span class="code-line"> <span class="nt">salt</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">secret</span></span>
<span class="code-line"> <span class="nt">default_page_size</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">125</span></span>
<span class="code-line"> <span class="nt">user_agent</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">RESTBase</span></span>
<span class="code-line"> <span class="nt">ui_name</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">RESTBase</span></span>
<span class="code-line"> <span class="nt">ui_url</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">https://www.mediawiki.org/wiki/RESTBase</span></span>
<span class="code-line"> <span class="nt">ui_title</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">RESTBase docs</span></span>
<span class="code-line"> <span class="nt">spec</span><span class="p">:</span></span>
<span class="code-line"> <span class="nt">x-request-filters</span><span class="p">:</span></span>
<span class="code-line"> <span class="p p-Indicator">-</span> <span class="nt">path</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">lib/security_response_header_filter.js</span></span>
<span class="code-line"> <span class="nt">x-sub-request-filters</span><span class="p">:</span></span>
<span class="code-line"> <span class="p p-Indicator">-</span> <span class="nt">type</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">default</span></span>
<span class="code-line"> <span class="l l-Scalar l-Scalar-Plain">name</span><span class="p p-Indicator">:</span> <span class="l l-Scalar l-Scalar-Plain">http</span></span>
<span class="code-line"> <span class="l l-Scalar l-Scalar-Plain">options</span><span class="p p-Indicator">:</span></span>
<span class="code-line"> <span class="nt">allow</span><span class="p">:</span></span>
<span class="code-line"> <span class="c1"># 设置允许哪些来源访问。</span></span>
<span class="code-line"> <span class="c1"># 至少要把汝 wiki 的 API 和 Parsoid 的位置写进去。</span></span>
<span class="code-line"> <span class="c1"># 一会儿还要把 Mathoid 的位置写进去</span></span>
<span class="code-line"> <span class="p p-Indicator">-</span> <span class="nt">pattern</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">http://localhost/w/api.php</span></span>
<span class="code-line"> <span class="l l-Scalar l-Scalar-Plain">forward_headers</span><span class="p p-Indicator">:</span> <span class="l l-Scalar l-Scalar-Plain">true</span></span>
<span class="code-line"> <span class="p p-Indicator">-</span> <span class="nt">pattern</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">http://localhost:10044</span></span>
<span class="code-line"> <span class="l l-Scalar l-Scalar-Plain">forward_headers</span><span class="p p-Indicator">:</span> <span class="l l-Scalar l-Scalar-Plain">true</span></span>
<span class="code-line"> <span class="p p-Indicator">-</span> <span class="nt">pattern</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">http://localhost:8000</span></span>
<span class="code-line"> <span class="l l-Scalar l-Scalar-Plain">forward_headers</span><span class="p p-Indicator">:</span> <span class="l l-Scalar l-Scalar-Plain">true</span></span>
<span class="code-line"> <span class="c1"># 这行是默认的,大概是允许所有 HTTPS 连接?</span></span>
<span class="code-line"> <span class="p p-Indicator">-</span> <span class="nt">pattern</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">/^https?:\/\//</span></span>
<span class="code-line"> <span class="nt">paths</span><span class="p">:</span></span>
<span class="code-line"> <span class="c1"># 汝 wiki 的域名,像设置 Parsoid 时一样。</span></span>
<span class="code-line"> <span class="l l-Scalar l-Scalar-Plain">/{domain:wiki.yoitsu.moe}</span><span class="p p-Indicator">:</span></span>
<span class="code-line"> <span class="nt">x-modules</span><span class="p">:</span></span>
<span class="code-line"> <span class="p p-Indicator">-</span> <span class="nt">path</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">projects/example.yaml</span></span>
<span class="code-line"> <span class="l l-Scalar l-Scalar-Plain">options</span><span class="p p-Indicator">:</span></span>
<span class="code-line"> <span class="nt">action</span><span class="p">:</span></span>
<span class="code-line"> <span class="c1"># 汝 wiki api.php 的位置</span></span>
<span class="code-line"> <span class="nt">apiUriTemplate</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">https://wiki.yoitsu.moe/w/api.php</span></span>
<span class="code-line"> <span class="c1"># RESTBase URI,默认像这个样子……</span></span>
<span class="code-line"> <span class="nt">baseUriTemplate</span><span class="p">:</span> <span class="s">"{{'http://{domain}:7231/{domain}/v1'}}"</span></span>
<span class="code-line"> <span class="c1"># 咱搞的像这个样子(暂时的)</span></span>
<span class="code-line"> <span class="nt">baseUriTemplate</span><span class="p">:</span> <span class="s">"{{'http://localhost:7231/{domain}/v1'}}"</span></span>
<span class="code-line"> <span class="nt">parsoid</span><span class="p">:</span></span>
<span class="code-line"> <span class="c1"># 汝的 Parsoid 的位置</span></span>
<span class="code-line"> <span class="nt">host</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">http://localhost:8000</span></span>
<span class="code-line"> <span class="c1"># 只有需要 Mathoid 时需要这一段,把汝的 Mathoid 的位置写进去。</span></span>
<span class="code-line"> <span class="nt">mathoid</span><span class="p">:</span></span>
<span class="code-line"> <span class="nt">host</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">http://localhost:10044</span></span>
<span class="code-line"> <span class="nt">table</span><span class="p">:</span></span>
<span class="code-line"> <span class="nt">backend</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">sqlite</span></span>
<span class="code-line"> <span class="nt">dbname</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">db.sqlite3</span></span>
<span class="code-line"> <span class="nt">pool_idle_timeout</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">20000</span></span>
<span class="code-line"> <span class="nt">retry_delay</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">250</span></span>
<span class="code-line"> <span class="nt">retry_limit</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">10</span></span>
<span class="code-line"> <span class="nt">show_sql</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">false</span></span>
<span class="code-line"></span>
<span class="code-line"> <span class="c1"># 要搞 Mathoid 的贴上这一段。</span></span>
<span class="code-line"> <span class="c1"># 咱不知道为啥能用 ……</span></span>
<span class="code-line"> <span class="l l-Scalar l-Scalar-Plain">/{domain:wikimedia.org}</span><span class="p p-Indicator">:</span></span>
<span class="code-line"> <span class="nt">x-modules</span><span class="p">:</span></span>
<span class="code-line"> <span class="p p-Indicator">-</span> <span class="nt">path</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">projects/wikimedia.org.yaml</span></span>
<span class="code-line"> <span class="nt">options</span><span class="p">:</span></span>
<span class="code-line"> <span class="nt">action</span><span class="p">:</span></span>
<span class="code-line"> <span class="c1"># 汝 wiki api.php 的位置</span></span>
<span class="code-line"> <span class="nt">apiUriTemplate</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">https://wiki.yoitsu.moe/w/api.php</span></span>
<span class="code-line"> <span class="c1"># RESTBase URI,默认像这个样子……</span></span>
<span class="code-line"> <span class="nt">baseUriTemplate</span><span class="p">:</span> <span class="s">"{{'http://{domain}:7231/{domain}/v1'}}"</span></span>
<span class="code-line"> <span class="c1"># 咱搞的像这个样子(暂时的)</span></span>
<span class="code-line"> <span class="nt">baseUriTemplate</span><span class="p">:</span> <span class="s">"{{'http://localhost:7231/{domain}/v1'}}"</span></span>
<span class="code-line"> <span class="nt">parsoid</span><span class="p">:</span></span>
<span class="code-line"> <span class="c1"># 汝的 Parsoid 的位置</span></span>
<span class="code-line"> <span class="nt">host</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">http://localhost:8000</span></span>
<span class="code-line"> <span class="nt">mathoid</span><span class="p">:</span></span>
<span class="code-line"> <span class="c1"># 汝的 Mathoid 的位置</span></span>
<span class="code-line"> <span class="nt">host</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">http://localhost:10044</span></span>
<span class="code-line"> <span class="nt">table</span><span class="p">:</span></span>
<span class="code-line"> <span class="nt">backend</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">sqlite</span></span>
<span class="code-line"> <span class="nt">dbname</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">db.sqlite3</span></span>
<span class="code-line"> <span class="nt">pool_idle_timeout</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">20000</span></span>
<span class="code-line"> <span class="nt">retry_delay</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">250</span></span>
<span class="code-line"> <span class="nt">retry_limit</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">10</span></span>
<span class="code-line"> <span class="nt">show_sql</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">false</span></span>
<span class="code-line"></span>
<span class="code-line"></span>
<span class="code-line"><span class="c1"># Finally, a standard service-runner config.</span></span>
<span class="code-line"><span class="nt">info</span><span class="p">:</span></span>
<span class="code-line"><span class="nt">name</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">restbase</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="nt">logging</span><span class="p">:</span></span>
<span class="code-line"><span class="nt">name</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">restbase</span></span>
<span class="code-line"><span class="nt">level</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">info</span></span>
</pre></div>
<p>保存然后 npm start 🌕</p>
<p>如果汝不是通过远程访问执行的命令,可以在浏览器上打开 <code class="code">
http://localhost:7231</code>
来进行测试.试着加载 <code class="code">
http://localhost:7231/汝设置的域名/v1/</code>
试试呗~</p>
<p>或者祭出 curl :</p>
<blockquote>
curl <a class="reference external" href="http://localhost:7231">http://localhost:7231</a>/汝设置的域名/v1/page/html/汝wiki上的一个页面</blockquote>
<p>成功的话会看到汝那个页面的 HTML 代码。</p>
<p><del>再抄个 systemd 系统单元好了……</del></p>
<div class="highlight"><pre><span class="code-line"><span></span>[Unit]</span>
<span class="code-line">Description=Mediawiki RESTBase Service</span>
<span class="code-line">Documentation=https://www.mediawiki.org/wiki/RESTBase</span>
<span class="code-line">Wants=local-fs.target network.target</span>
<span class="code-line">After=local-fs.target network.target</span>
<span class="code-line"></span>
<span class="code-line">[Install]</span>
<span class="code-line">WantedBy=multi-user.target</span>
<span class="code-line"></span>
<span class="code-line">[Service]</span>
<span class="code-line">Type=simple</span>
<span class="code-line">User=nobody</span>
<span class="code-line">Group=nobody</span>
<span class="code-line">WorkingDirectory=/path/to/restbase</span>
<span class="code-line">ExecStart=/usr/bin/node /path/to/restbase/server.js</span>
<span class="code-line">KillMode=process</span>
<span class="code-line">Restart=on-success</span>
<span class="code-line">PrivateTmp=true</span>
<span class="code-line">StandardOutput=syslog</span>
</pre></div>
<p>然后启动这两个服务。</p>
</div>
<div class="section" id="localsettings-php">
<h2><a class="toc-backref" href="#id8">设置 LocalSettings.php</a></h2>
<div class="highlight"><pre><span class="code-line"><span></span><span class="x"># $wgVisualEditorRestbaseURL 大概像 http://汝RESTBase服务的位置/汝wiki的域名/v1/page/html/</span></span>
<span class="code-line"><span class="x">$wgVisualEditorRestbaseURL = "http://localhost:7321/wiki.yoitsu.moe/v1/page/html/";</span></span>
<span class="code-line"><span class="x"># $wgVisualEditorFullRestbaseURL 大概像 http://汝RESTBase服务的位置/汝wiki的域名/</span></span>
<span class="code-line"><span class="x">$wgVisualEditorFullRestbaseURL = "http://localhost:7321/wiki.yoitsu.moe/";</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="x"># 首先加载 Math 扩展</span></span>
<span class="code-line"><span class="x">require_once "$IP/extensions/Math/Math.php";</span></span>
<span class="code-line"><span class="x"># 设置渲染方式为源代码和 MathML</span></span>
<span class="code-line"><span class="x">$wgMathValidModes = array( 'source' ,'mathml');</span></span>
<span class="code-line"><span class="x"># 设置默认使用 MathML</span></span>
<span class="code-line"><span class="x">$wgDefaultUserOptions['math'] = 'mathml';</span></span>
<span class="code-line"><span class="x"># 汝的 Mathoid 服务的地址</span></span>
<span class="code-line"><span class="x">$wgMathMathMLUrl = 'http://localhost:10044/';</span></span>
<span class="code-line"><span class="x"># 如果汝用了咱上面那种糊法,$wgMathFullRestbaseURL 这么写 🤦♀️</span></span>
<span class="code-line"><span class="x">$wgMathFullRestbaseURL= 'http://localhost:7231/wikimedia.org/';</span></span>
</pre></div>
<p>如果需要的话运行下维护脚本。</p>
<hr class="docutils"/>
<p>最后的效果大概像这样:</p>
<img alt="RESTBase 效果" class="materialboxed responsive-img" src="/images/restbase/1.png"/>
<p>两个编辑器之间的切换更顺畅了 😂</p>
<blockquote>
<a class="reference external" href="https://www.mediawiki.org/wiki/2017_wikitext_editor">2017 维基文本编辑器</a> : 😌</blockquote>
<img alt="RESTBase 效果 2" class="materialboxed responsive-img" src="/images/restbase/0.png"/>
<p>公式出来了 😂</p>
<blockquote>
下面的乐谱靠的是 <a class="reference external" href="https://www.mediawiki.org/wiki/Extension:Score">https://www.mediawiki.org/wiki/Extension:Score</a> 啦 😂</blockquote>
<p>🤦 不过介于 RESTBase 本身还在开发,所以小心翻车……</p>
</div>
Project Wolves (仮)先行稼动开始~2017-05-02T00:00:00+08:002017-05-02T00:00:00+08:00ホロtag:None,2017-05-02:/life/anounce_project_wolves.html
<p>推出 Project Wolves(虽然名字还是暂定)😋</p>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id4">所以这是啥?</a></h2>
<p>其实就是个 Telegram Channel 啦 🤦 ,虽然有个奇怪的名字,
还随便用 bot 糊了把 mastodon / Twitter 同步 😂</p>
</div>
<div class="section" id="channel">
<h2><a class="toc-backref" href="#id5">这 Channel 有啥特别之处?</a></h2>
<p>😂 好像真没啥特别的(毕竟才建起来?)</p>
<p>硬塞一个特点的话就是 Writer 都是狼?😂</p>
<p>算了以后慢慢塑造好了……</p>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id6">那么入口呢?</a></h2>
<p>哇汝想来了啊 😋 <del>勇气可嘉……</del></p>
<ul>
<li><p class="first">如果有 Telegram 的话 :<a class="reference external" href="https://t.me/Project_Wolves">https://t.me/Project_Wolves</a></p>
</li>
<li><p class="first">或者 Twitter :<a class="reference external" href="https://twitter.com/WolvesOfYoitsu">https://twitter.com/WolvesOfYoitsu</a></p>
<blockquote>
<p>Twitter 字数限制比 Mastodon 少啦~</p>
</blockquote>
</li>
<li><p class="first">或者 Mastodon : <a class="reference external" href="https://sn.angry.im/@wolves">https://sn.angry …</a></p></li></ul></div>
<p>推出 Project Wolves(虽然名字还是暂定)😋</p>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id4">所以这是啥?</a></h2>
<p>其实就是个 Telegram Channel 啦 🤦 ,虽然有个奇怪的名字,
还随便用 bot 糊了把 mastodon / Twitter 同步 😂</p>
</div>
<div class="section" id="channel">
<h2><a class="toc-backref" href="#id5">这 Channel 有啥特别之处?</a></h2>
<p>😂 好像真没啥特别的(毕竟才建起来?)</p>
<p>硬塞一个特点的话就是 Writer 都是狼?😂</p>
<p>算了以后慢慢塑造好了……</p>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id6">那么入口呢?</a></h2>
<p>哇汝想来了啊 😋 <del>勇气可嘉……</del></p>
<ul>
<li><p class="first">如果有 Telegram 的话 :<a class="reference external" href="https://t.me/Project_Wolves">https://t.me/Project_Wolves</a></p>
</li>
<li><p class="first">或者 Twitter :<a class="reference external" href="https://twitter.com/WolvesOfYoitsu">https://twitter.com/WolvesOfYoitsu</a></p>
<blockquote>
<p>Twitter 字数限制比 Mastodon 少啦~</p>
</blockquote>
</li>
<li><p class="first">或者 Mastodon : <a class="reference external" href="https://sn.angry.im/@wolves">https://sn.angry.im/@wolves</a></p>
<blockquote>
<p>首先感谢 <a class="reference external" href="/links.html#petercxy">petercxy</a> 的 instance 😊</p>
<p>然后转发到 Mastodon 的机器人是咱最近糊出来的,所以可能会炸…… 😂</p>
</blockquote>
</li>
</ul>
<hr class="docutils"/>
<blockquote>
<p>[xmppbot] [Lisa] KenOokamiHoro: 老板问我今天晚上加班么我说不加,问我为啥,我说有约。问我是上回周五约我那个么,我说不是,我每周五都有不同的人约。老板想了一下说:你约完把他们都杀了么。</p>
<p>[[HoroServ]] 他们都被吃掉了</p>
<p>[ヨイツの賢狼ホロ 😋(🍎🍏👤*)] 😋😋😋</p>
<p>[Chino 🐇 (Frantic1048 )] 这很萌狼(</p>
</blockquote>
<p>😂</p>
</div>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id7">接下来画啥饼?</a></h2>
<ul class="simple">
<li>接入 IRC / RSS 支持?</li>
<li>……</li>
</ul>
</div>
使用 SSH 远程连接运行 GNU/Linux 的计算机2017-04-23T00:00:00+08:002017-04-23T00:00:00+08:00ホロtag:None,2017-04-23:/linux/connect_through_ssh.html
<p>约等于 Windows 的远程桌面……</p>
<p>本文里用到的是 GNU/Linux 发行版一般都会有的 ssh 命令啦~</p>
<div class="section" id="ssh">
<h2><a class="toc-backref" href="#id8">SSH 是啥?</a></h2>
<blockquote>
<p>Secure Shell(縮寫为SSH),由IETF的網路工作小組(Network Working Group)所制定;SSH為一项建立在应用层和传输层基础上的安全协议,为计算机上的Shell(壳层)提供安全的传输和使用环境。</p>
<p>而SSH是目前较可靠,專为远程登录会话和其他网络服务提供安全性的协议。利用SSH协议可以有效防止远程管理过程中的信息泄露问题。透過SSH可以對所有传输的数据进行加密,也能够防止DNS欺骗和IP欺骗。</p>
<p>SSH之另一項優點為其传输的数据可以是经过压缩的,所以可以加快传输的速度。SSH有很多功能,它既可以代替Telnet,又可以为FTP、POP、甚至为PPP提供一个安全的「通道」。</p>
</blockquote>
<p>当然现在用的更多的是 SSH 的一种叫做 OpenSSH 的自由实现啦~</p>
</div>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id9">做点准备工作</a></h2>
<p>首先要把 openssh 装上啦,具体看发行版了呗(比如有些是把客户端和服务端拆分成
openssh-client 和 openssh-server …</p></div>
<p>约等于 Windows 的远程桌面……</p>
<p>本文里用到的是 GNU/Linux 发行版一般都会有的 ssh 命令啦~</p>
<div class="section" id="ssh">
<h2><a class="toc-backref" href="#id8">SSH 是啥?</a></h2>
<blockquote>
<p>Secure Shell(縮寫为SSH),由IETF的網路工作小組(Network Working Group)所制定;SSH為一项建立在应用层和传输层基础上的安全协议,为计算机上的Shell(壳层)提供安全的传输和使用环境。</p>
<p>而SSH是目前较可靠,專为远程登录会话和其他网络服务提供安全性的协议。利用SSH协议可以有效防止远程管理过程中的信息泄露问题。透過SSH可以對所有传输的数据进行加密,也能够防止DNS欺骗和IP欺骗。</p>
<p>SSH之另一項優點為其传输的数据可以是经过压缩的,所以可以加快传输的速度。SSH有很多功能,它既可以代替Telnet,又可以为FTP、POP、甚至为PPP提供一个安全的「通道」。</p>
</blockquote>
<p>当然现在用的更多的是 SSH 的一种叫做 OpenSSH 的自由实现啦~</p>
</div>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id9">做点准备工作</a></h2>
<p>首先要把 openssh 装上啦,具体看发行版了呗(比如有些是把客户端和服务端拆分成
openssh-client 和 openssh-server 一类的,有的就直接是一个大包 openssh 了呗~ )</p>
<p>然后服务器上生成一下主机密钥咯,这个操作大概启动 sshd (ssh daemon 的缩写?)服务
时多半就会自动完成了吧…… 大概像这样?</p>
<blockquote>
<p>有 Systemd 的发行版:</p>
<p># systemctl start sshd</p>
<p>有 sysVinit 或者 upStart 的发行版:</p>
<p># /etc/init.d/sshd start</p>
</blockquote>
<p>然后记下来服务器的 IP 地址咯~</p>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id10">最简单的连接</a></h2>
<blockquote>
ssh [<用户名>@]<主机名或者IP地址></blockquote>
<p>如果没有用户名的话,就会用汝当前的用户名作为连接到服务器时使用的用户名咯~</p>
<blockquote>
<p>下面的例子里咱其实是自己连自己了……</p>
<p>$ ssh <a class="reference external" href="mailto:horo@localhost">horo@localhost</a></p>
</blockquote>
<p>第一次连接时大概像这样:</p>
<div class="highlight"><pre><span class="code-line"><span></span>The authenticity of host <span class="s1">'localhost (::1)'</span> can<span class="err">'</span>t be established.</span>
<span class="code-line">ECDSA key fingerprint is SHA256:ZrEikKJj6wqLk8Cqgs6JWXGX3FgS2iQI6aK73GTCHVk.</span>
<span class="code-line">Are you sure you want to <span class="k">continue</span> connecting <span class="o">(</span>yes/no<span class="o">)</span>?</span>
</pre></div>
<p>大概的意思就是“咱好像不记得汝要去的这个地方呐~”,毕竟是第一次连接嘛。</p>
<blockquote>
如果汝在连接其它人的服务器的话,可以让他/她/它把服务器的指纹发来确认一下。</blockquote>
<p>如果确认了以后,就输入 yes 让 ssh 客户端记下来。</p>
<p>然后:</p>
<div class="highlight"><pre><span class="code-line"><span></span>Warning: Permanently added <span class="s1">'localhost'</span> <span class="o">(</span>ECDSA<span class="o">)</span> to the list of known hosts.</span>
<span class="code-line">horo@localhost<span class="err">'</span>s password:</span>
</pre></div>
<p>这里输入密码。记得输入密码时就是什么都没有,不用担心键盘坏了啦~</p>
<div class="highlight"><pre><span class="code-line"><span></span>Last login: Thu Mar <span class="m">9</span> <span class="m">23</span>:00:10 <span class="m">2017</span></span>
<span class="code-line"><span class="o">[</span>horo@Yoitsu_SurfaceBook horo<span class="o">]</span> $</span>
</pre></div>
<p>这样大概就是登录成功了呗,如果工作做完了以后,记得关闭连接呐~</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="o">[</span>horo@Yoitsu_SurfaceBook horo<span class="o">]</span> $ <span class="nb">exit</span></span>
<span class="code-line">Connection to localhost closed.</span>
</pre></div>
</div>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id11">使用密钥连接</a></h2>
<p>为啥要用密钥登录?其实咱也说不清楚……</p>
<blockquote>
<p>大概是因为不容易泄漏和不容易暴力破解?</p>
<p>或者上 <a class="reference external" href="https://security.stackexchange.com/questions/69407/why-is-using-an-ssh-key-more-secure-than-using-passwords">Stack Exchange</a> 问问?</p>
</blockquote>
<p>首先生成一对密钥:</p>
<blockquote>
<p>$ ssh-keygen -t rsa -b 4096</p>
<p>其中的 -t rsa 表示加密算法的类型是 RSA
其中的 -b 4096 表示密钥是 4096 bit</p>
<p>注意不同加密算法的位数是没有可比性的啦~
对于 RSA 加密算法而言, >2048 bit 应该足够安全了呗~
(然而默认是 1024 bit 的,只好手动加点……)</p>
</blockquote>
<p>整个过程大概像这样:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="o">[</span>horo@Yoitsu_SurfaceBook ~<span class="o">]</span>$ ssh-keygen -t rsa</span>
<span class="code-line">Generating public/private rsa key pair.</span>
<span class="code-line"><span class="c1"># 密钥存在哪?</span></span>
<span class="code-line">Enter file in which to save the key <span class="o">(</span>/home/horo/.ssh/id_rsa<span class="o">)</span>:</span>
<span class="code-line"><span class="c1"># 为私钥设置一个密码</span></span>
<span class="code-line">Enter passphrase <span class="o">(</span>empty <span class="k">for</span> no passphrase<span class="o">)</span>:</span>
<span class="code-line">Enter same passphrase again:</span>
<span class="code-line">Your identification has been saved in /home/horo/.ssh/id_rsa.</span>
<span class="code-line">Your public key has been saved in /home/horo/.ssh/id_rsa.pub.</span>
<span class="code-line">The key fingerprint is:</span>
<span class="code-line"><span class="c1"># 这是密钥的指纹啦~</span></span>
<span class="code-line">SHA256:nySil+IhkH0yDg1eYFIOdY8Zq7j3vxo6Wlab9znx17Q horo@Yoitsu_SurfaceBook</span>
<span class="code-line">The key<span class="err">'</span>s randomart image is:</span>
<span class="code-line">+---<span class="o">[</span>RSA <span class="m">2048</span><span class="o">]</span>----+</span>
<span class="code-line"><span class="p">|</span><span class="nv">o</span><span class="o">=</span>o o <span class="p">|</span></span>
<span class="code-line"><span class="p">|</span>oo.. * <span class="p">|</span></span>
<span class="code-line"><span class="p">|</span>. ..+ . <span class="p">|</span></span>
<span class="code-line"><span class="p">|</span>.*.. <span class="p">|</span></span>
<span class="code-line"><span class="p">|</span><span class="o">=</span>.* o . S . <span class="p">|</span></span>
<span class="code-line"><span class="p">|</span> <span class="o">=</span> <span class="o">=</span> + o.+ . . <span class="p">|</span></span>
<span class="code-line"><span class="p">|</span>. * B + oo o . <span class="p">|</span></span>
<span class="code-line"><span class="p">|</span> +.<span class="o">=</span> * .... . E <span class="p">|</span></span>
<span class="code-line"><span class="p">|</span>....+oo.o. . <span class="p">|</span></span>
<span class="code-line">+----<span class="o">[</span>SHA256<span class="o">]</span>-----+</span>
</pre></div>
<p>把这对密钥的公钥( /home/horo/.ssh/id_rsa.pub )添加到 authorized_keys 里:</p>
<blockquote>
<p>$ cat /home/horo/.ssh/id_rsa.pub > /home/horo/.ssh/authorized_keys</p>
<p>因为 sshd 默认会从 authorized_keys 里寻找接受哪些密钥连接啦~</p>
</blockquote>
<p>把私钥 (/home/horo/.ssh/id_rsa )复制到汝自己的电脑上咯~</p>
<p>然后连接服务器时,用 -i 参数指定使用哪一个私钥文件:</p>
<blockquote>
$ ssh [<用户名>@]<主机名或者IP地址> -i <私钥文件的路径></blockquote>
<p>如果汝遇到了这样的错误:</p>
<div class="highlight"><pre><span class="code-line"><span></span>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@</span>
<span class="code-line">@ WARNING: UNPROTECTED PRIVATE KEY FILE! @</span>
<span class="code-line">@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@</span>
<span class="code-line">Permissions 0755 for '/home/horo/.ssh/id_rsa' are too open.</span>
<span class="code-line">It is required that your private key files are NOT accessible by others.</span>
<span class="code-line">This private key will be ignored.</span>
<span class="code-line">Load key "/home/horo/.ssh/id_rsa": bad permissions</span>
</pre></div>
<p>这表示汝的私钥的权限设置的不对啦 >_<</p>
<p>对于私钥文件这种只需要读取的文件来说,自己能读就足够啦~</p>
<blockquote>
<p>$ chmod 400 <私钥文件的路径></p>
<p>类 Unix 系统的权限位大多数都是像这样的八进制数啦,三位从左向右
分别表示文件的所有者,所属于的组,和其它人分别拥有的权限。</p>
<p>而其中 4 表示读,2表示写,1表示执行啦~</p>
<p>所以 400 = 自己只能读,所属的组和其它人看都不能看!</p>
<p>关于文件权限的更多内容,就先从维基百科开始咯~:</p>
<p><a class="reference external" href="https://en.wikipedia.org/wiki/File_system_permissions">https://en.wikipedia.org/wiki/File_system_permissions</a></p>
<p>而保护私钥文件的措施,推荐这篇文章:</p>
<p><a class="reference external" href="https://martin.kleppmann.com/2013/05/24/improving-security-of-ssh-private-keys.html">https://martin.kleppmann.com/2013/05/24/improving-security-of-ssh-private-keys.html</a></p>
</blockquote>
<p>如果汝设置了私钥密码的话,需要在连接时输入私钥的密码(而不再是汝用户的密码了呐~)</p>
<p>如果可以成功登录了的话,就可以关掉密码登录了呗:</p>
<blockquote>
<p>用汝喜欢的文字编辑器(和 root 权限)打开 /etc/ssh/sshd_config 文件,
找到 PasswordAuthentication 这一行,把后面的 yes 改成 no 。</p>
<p>如果没有的话就自己加一行 PasswordAuthentication no 咯~</p>
</blockquote>
<p>顺便可以禁止用 root 登录:</p>
<blockquote>
<p>找到 PermitRootLogin 这一行,把后面的 yes 改成 no 。</p>
<p>如果没有的话就自己加一行 PermitRootLogin no 咯~</p>
</blockquote>
<p>然后保存,记得需要重新启动 sshd 服务才能生效咯~</p>
</div>
<div class="section" id="id4">
<h2><a class="toc-backref" href="#id12">用不同的端口连接</a></h2>
<p>可以稍微防止被扫描到?</p>
<blockquote>
<p>用汝喜欢的文字编辑器(和 root 权限)打开 /etc/ssh/sshd_config 文件,
找到 #Port 22 这一行,去掉前面的 # 号,然后自己设定一个数。</p>
<p>保存,记得需要重新启动 sshd 服务才能生效咯~</p>
<p>另外,大多数配置文件中 # 开头的行都是为了方便记忆和理解写下的注释,
虽然程序不会用到,但是有时也很有用呐~</p>
</blockquote>
<p>如果设置了不同的端口,连接时加上 -p 选项:</p>
<blockquote>
$ ssh [<用户名>@]<主机名或者IP地址> -i <私钥文件的路径> -p <汝所设置的端口></blockquote>
<p>其实 ssh 的选项很多啦(不过咱就会这几个……),其它的选项怎么用,
汝可以 man 一下咯~</p>
<blockquote>
$ man ssh</blockquote>
</div>
<div class="section" id="id5">
<h2><a class="toc-backref" href="#id13">本地写点配置文件方便连接</a></h2>
<p>随着命令越来越复杂,写的也越来越长,对记忆力也是个考验了呐~</p>
<p>所以 ssh 客户端可以通过配置文件来简化一些操作呐~</p>
<p>用汝喜欢的文字编辑器打开汝主文件夹下的 .ssh/config 文件,
(如果没有的话就自己建立一个咯~</p>
<p>然后每一个服务器这样写:</p>
<div class="highlight"><pre><span class="code-line"><span></span>Host <这里可以起一个名字,一会儿会用到></span>
<span class="code-line"> HostName <服务器的主机名或 IP 地址></span>
<span class="code-line"> Port <端口></span>
<span class="code-line"> User <用户名></span>
<span class="code-line"> PreferredAuthentications publickey</span>
<span class="code-line"> # 偏好的验证方法,这里选择公钥验证</span>
<span class="code-line"> IdentityFile <汝的私钥文件路径></span>
</pre></div>
<p>然后汝可以通过 ssh <刚刚设置的别名> 来连接了哦~</p>
</div>
<div class="section" id="id6">
<h2><a class="toc-backref" href="#id14">有时可能……</a></h2>
<p>有时汝可能会遇到这样的错误呗~</p>
<div class="highlight"><pre><span class="code-line"><span></span> @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@</span>
<span class="code-line"> @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @</span>
<span class="code-line"> @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@</span>
<span class="code-line"> IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!</span>
<span class="code-line"> Someone could be eavesdropping on you right now (man-in-the-middle attack)!</span>
<span class="code-line"> It is also possible that a host key has just been changed.</span>
<span class="code-line"> The fingerprint for the ECDSA key sent by the remote host is</span>
<span class="code-line"> SHA256:S8zGzMsXj0FbOyrTM9OTalx8pbddwmMdxeVXaKQaaA0.</span>
<span class="code-line"> Please contact your system administrator.</span>
<span class="code-line"> Add correct host key in /home/horo/.ssh/known_hosts to get rid of this message.</span>
<span class="code-line"> Offending ECDSA key in /home/horo/.ssh/known_hosts:2</span>
<span class="code-line"> ECDSA host key for localhost has changed and you have requested strict checking.</span>
<span class="code-line"> Host key verification failed.</span>
<span class="code-line"></span>
<span class="code-line">这表示服务器发送来的主机密钥和汝 known_hosts 中的不相同呗~</span>
<span class="code-line">有可能是遇到了中间人攻击,或者只是汝重装了系统或者重新生成了主机密钥而已……</span>
<span class="code-line"></span>
<span class="code-line">如果汝在连接其它人的服务器的话,最好还是确认一下为好~</span>
<span class="code-line"></span>
<span class="code-line">要真的是汝重装了系统了的话,就把新的主机密钥记下来呗~找到 known_hosts 对应的那一行修改一下就好了啦~</span>
</pre></div>
</div>
<div class="section" id="id7">
<h2><a class="toc-backref" href="#id15">最后……</a></h2>
<p>其实保护服务器只靠这些还是不够啦~,可以考虑使用一些防暴力攻击的软件,或者防火墙
(例如 ufw ),当然上网搜索一些前人的姿势也大有裨益咯~</p>
</div>
某个自白和告白书2017-04-23T00:00:00+08:002017-04-23T00:00:00+08:00ホロtag:None,2017-04-23:/life/status_20170423.html
<p>今天又是崩坏的日常呢……</p>
<p>又一次在退了 #archlinux-cn-offtopic 的 Telegram 分部以后退掉了所有 Telegram 群。</p>
<p>又一次辜负了大家对咱的信任呐~</p>
<p>特别是一直在努力关照咱的 <a class="reference external" href="/links.html#void001">void001</a> 呢 😭</p>
<p>好像这一次大家的怒火也终于爆发出来了(=咱彻底被讨厌了)的样子……</p>
<blockquote>
夏娜对不起 😭 (虽然这一次真的是得不到原谅了……</blockquote>
<div class="section" id="id2">
<h2>所以呢?</h2>
<p>大概这就是咱让人讨厌的地方吧:</p>
<ul class="simple">
<li>什么都不懂,却总想被关照……</li>
<li>莫名其妙的讨厌一些其它人认为习以为常的事物</li>
<li>心理脆弱不堪(不知道这样的行为已经是第几次了可还是毫无知觉</li>
<li>伤得最深的往往是最关注的人……</li>
<li>一时冲动闹出不少笑话</li>
<li>想的太多做的太少</li>
<li>尽管如此还是逞强挤出一副一眼被看穿的笑容</li>
<li>然后又一次伤了最关注的人</li>
<li>总是想寻求存在感却不会争取</li>
<li>然后被后来居上,被嘲笑,被遗忘……</li>
<li>喜欢自己定些毫无依据的规则,还要强行套在其它人身上</li>
<li>最后自己也没得执行只能不了了之</li>
<li>随便给人贴标签,然后一次次的……</li>
<li>……</li>
<li>知道如此却不会改正,咱就是这么悲哀啊……</li>
</ul>
</div>
用 dm-crypt 加密一下 Parabola2017-04-17T00:00:00+08:002017-04-17T00:00:00+08:00ホロtag:None,2017-04-17:/parabola/encrypt_parabola_with_dm_crypt.html
<p>用 dm-crypt 加密一下 btrfs 上的 Parabola……</p>
<p><del>纯粹是闲的无聊……</del></p>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id9">为啥要加密?</a></h2>
<p>简单说:文件加密可以防范失窃,保护隐私or备份数据,和提防某些人……</p>
<p>复杂点的话……
<a class="reference external" href="https://program-think.blogspot.com/2011/05/file-encryption-overview.html">看看这个咯~</a></p>
</div>
<div class="section" id="dm-crypt">
<h2><a class="toc-backref" href="#id10">为啥是 dm-crypt?</a></h2>
<p>因为是 Linux 内核内置哒~ (好没有说服力的借口呐)</p>
</div>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id11">加密开始前的准备工作</a></h2>
<ul>
<li><p class="first">准备一个外部硬盘(放加密过程中备份的系统啦)</p>
</li>
<li><p class="first">一个 Live USB (因为中间要格掉原来的系统……)</p>
</li>
<li><p class="first">然后备份一下系统。</p>
<blockquote>
<p>btrfs 的话可以用发送快照的方式呗~</p>
<ul>
<li><p class="first">首先创建一个只读快照:</p>
<blockquote>
<p># btrfs subvolume snapshot -r <源位置> <目标位置></p>
<p>例如 btrfs subvolume snapshot -r / /root_backup 就会在 /root_backup 新建一个 / 的快照~</p>
</blockquote>
</li>
<li><p class="first">然后发送出去:</p>
<blockquote>
<p># btrfs send …</p></blockquote></li></ul></blockquote></li></ul></div>
<p>用 dm-crypt 加密一下 btrfs 上的 Parabola……</p>
<p><del>纯粹是闲的无聊……</del></p>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id9">为啥要加密?</a></h2>
<p>简单说:文件加密可以防范失窃,保护隐私or备份数据,和提防某些人……</p>
<p>复杂点的话……
<a class="reference external" href="https://program-think.blogspot.com/2011/05/file-encryption-overview.html">看看这个咯~</a></p>
</div>
<div class="section" id="dm-crypt">
<h2><a class="toc-backref" href="#id10">为啥是 dm-crypt?</a></h2>
<p>因为是 Linux 内核内置哒~ (好没有说服力的借口呐)</p>
</div>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id11">加密开始前的准备工作</a></h2>
<ul>
<li><p class="first">准备一个外部硬盘(放加密过程中备份的系统啦)</p>
</li>
<li><p class="first">一个 Live USB (因为中间要格掉原来的系统……)</p>
</li>
<li><p class="first">然后备份一下系统。</p>
<blockquote>
<p>btrfs 的话可以用发送快照的方式呗~</p>
<ul>
<li><p class="first">首先创建一个只读快照:</p>
<blockquote>
<p># btrfs subvolume snapshot -r <源位置> <目标位置></p>
<p>例如 btrfs subvolume snapshot -r / /root_backup 就会在 /root_backup 新建一个 / 的快照~</p>
</blockquote>
</li>
<li><p class="first">然后发送出去:</p>
<blockquote>
<p># btrfs send <快照名称> | btrfs receive <目标位置></p>
<p>例如咱把一个硬盘挂载到了 /mnt 的话:</p>
<p># btrfs send /root_backup | btrfs receive /mnt/</p>
</blockquote>
</li>
</ul>
<p>不是 btrfs 的话就自行发挥想象力咯~ (比如
<a class="reference external" href="/arch-linux/get_surface_book.html">和咱以前一样用 rsync</a> ~ )</p>
</blockquote>
</li>
</ul>
</div>
<div class="section" id="id4">
<h2><a class="toc-backref" href="#id12">创建加密分区</a></h2>
<p>如果汝一开始不是安装了整个 core 组的话,先把 cryptsetup 装上咯~ _(:з」∠)_</p>
<p>然后创建加密分区:</p>
<blockquote>
# cryptsetup luksFormat <设备文件的名称></blockquote>
<p>如果需要的话,可以在 luksFormat 之前加上一些选项呐:</p>
<blockquote>
<table border="1" class="stripped docutils highlight black-text white">
<colgroup>
<col width="14%"/>
<col width="18%"/>
<col width="20%"/>
<col width="48%"/>
</colgroup>
<thead valign="bottom">
<tr><th class="head">参数的名称</th>
<th class="head">这啥?</th>
<th class="head">推荐是多少?</th>
<th class="head"><del>一些废话</del></th>
</tr>
</thead>
<tbody valign="top">
<tr><td>--cipher</td>
<td>加密方式</td>
<td>aes-xts-plain64</td>
<td>AES 加密算法搭配 XTS 模式</td>
</tr>
<tr><td>--key-size</td>
<td>密钥长度</td>
<td>512</td>
<td>XTS 模式需要两对密钥,
每个的长度是256</td>
</tr>
<tr><td>--hash</td>
<td>散列算法</td>
<td>sha512</td>
<td> </td>
</tr>
<tr><td>--iter-time</td>
<td>迭代时间</td>
<td>>10000</td>
<td>单位是毫秒。该值越大,暴力破解越难;
但是相应的汝打开加密分区时就要等一下啦~</td>
</tr>
</tbody>
</table>
</blockquote>
<p>例如这样?</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># cryptsetup --cipher aes-xts-plain64 --key-size 512 --hash sha512 --iter-time 10000 luksFormat /dev/nvme0n1p1</span></span>
<span class="code-line"></span>
<span class="code-line">WARNING!</span>
<span class="code-line"><span class="o">========</span></span>
<span class="code-line">这将覆盖 /dev/nvme0n1p1 上的数据,该动作不可取消。</span>
<span class="code-line"></span>
<span class="code-line">Are you sure? <span class="o">(</span>Type uppercase yes<span class="o">)</span>:</span>
<span class="code-line"><span class="c1"># 上面要打大写的 YES</span></span>
<span class="code-line"><span class="c1"># 然后输入两遍加密分区的密码。</span></span>
<span class="code-line">输入密码:</span>
<span class="code-line">确认密码:</span>
</pre></div>
<p>然后等一下就好咯~</p>
</div>
<div class="section" id="id5">
<h2><a class="toc-backref" href="#id13">打开加密分区</a></h2>
<blockquote>
# cryptsetup open <已经加密的设备文件名称> <映射名称></blockquote>
<p>解密的分区会映射到 /dev/mapper/<汝设置的映射名称> 呗~</p>
<p>例如咱解密 /dev/nvme0n1p1 ,然后映射到 /dev/mapper/sysroot :</p>
<blockquote>
# cryptsetup open /dev/nvme0n1p1 sysroot</blockquote>
<p>接下来就像操作普通分区一样操作 /dev/mapper/sysroot 就好啦~</p>
<p>然后把刚刚备份好的系统再搬回来 _(:з」∠)_</p>
<blockquote>
<p>如果汝也是用 btrfs send receive 搬回来的,别忘了让快照可写:</p>
<blockquote>
# btrfs property set -ts <快照的位置> ro false</blockquote>
</blockquote>
</div>
<div class="section" id="id6">
<h2><a class="toc-backref" href="#id14">重新设置一下系统 ~</a></h2>
<p>相比与原来的系统,现在的变化就是分区和启动方式改变了呐~</p>
<p>下面咱就假设它在 /mnt 啦 ~</p>
<div class="section" id="fstab-chroot">
<h3><a class="toc-backref" href="#id15">fstab + chroot</a></h3>
<p>首先重新生成一下 fstab :</p>
<blockquote>
# genfstab -U -p /mnt >> /mnt/etc/fstab</blockquote>
<p>然后打开它,检查一下有没有问题 ( ⚆ _ ⚆ )</p>
<p>接着 chroot 进去:</p>
<blockquote>
# arch-chroot /mnt</blockquote>
</div>
<div class="section" id="mkinitcpio">
<h3><a class="toc-backref" href="#id16">mkinitcpio</a></h3>
<p>因为加密了嘛,所以要让内核知道怎么解开咯~ (就是带上 encrypt HOOK 啦……</p>
<p>打开 /etc/mkinitcpio.conf :</p>
<blockquote>
<ul>
<li><p class="first">为了用键盘加上 keyboard</p>
</li>
<li><p class="first">如果汝有用 systemd hooks 的话,把 sd-encrypt 添加到 block 和 filesystems 之间咯,像这样:</p>
<blockquote>
<p>HOOKS="base systemd autodetect keyboard modconf block sd-encrypt filesystems fsck"</p>
</blockquote>
</li>
<li><p class="first">不是的话加上 encrypt 咯~</p>
<blockquote>
<p>HOOKS="base udev autodetect keyboard consolefont modconf block encrypt filesystems fsck"</p>
</blockquote>
</li>
</ul>
</blockquote>
<p>最后重新生成一下 initramfs :</p>
<blockquote>
# mkinitcpio -p linux</blockquote>
<p>如果汝在用其它内核的话,用内核的名称(例如 linux-mainline ) 换掉 linux 呐~</p>
</div>
<div class="section" id="sysytemd">
<h3><a class="toc-backref" href="#id17">内核参数 (非 sysytemd )</a></h3>
<blockquote>
如果汝用了 sd-encrypt HOOK,跳过看下面的 >_<</blockquote>
<p>这时就需要 cryptdevices 参数啦~,大概这么写:</p>
<blockquote>
cryptdevices=<加密的分区>:<解密后使用的映射></blockquote>
<p>例如咱解密 /dev/nvme0n1p1 ,然后映射到 /dev/mapper/sysroot 的话:</p>
<blockquote>
cryptdevices=/dev/nvme0n1p1:sysroot</blockquote>
<p>如果有不止一个加密分区的话,就挨个写,然后用分号分开,就像这样:</p>
<blockquote>
cryptdevices=/dev/nvme0n1p1:sysroot;/dev/nvme0n1p2:sysext</blockquote>
<p>如果汝是手动设置的 root 参数的话,记得换成刚刚写的映射位置:</p>
<blockquote>
root=/dev/mapper/sysroot</blockquote>
</div>
<div class="section" id="id7">
<h3><a class="toc-backref" href="#id18">内核参数 ( sysytemd )</a></h3>
<blockquote>
用了 sd-encrypt HOOK 来看啦~</blockquote>
<p>首先汝需要加密分区的 UUID,lsblk -f 看一下就好啦~</p>
<p>然后写一个 luks.name 参数:</p>
<blockquote>
luks.name=<加密的分区的UUID>=<解密后使用的映射></blockquote>
<p>像这样?</p>
<blockquote>
luks.name=160577ec-674c-4792-bdf5-3f4edd4aa00c=sysroot</blockquote>
<p>如果汝是手动设置的 root 参数的话,记得换成刚刚写的映射位置:</p>
<blockquote>
root=/dev/mapper/sysroot</blockquote>
</div>
<div class="section" id="bootloaders">
<h3><a class="toc-backref" href="#id19">bootloaders</a></h3>
<p>GRUB 的话可以把刚刚的内核参数加到 /etc/default/grub 的 GRUB_CMDLINE_LINUX 参数里,
然后重新生成下配置文件咯</p>
<p>systemd-boot 的话,把刚刚写的内核参数加进 conf 文件里的 options 参数咯~</p>
</div>
</div>
<div class="section" id="id8">
<h2><a class="toc-backref" href="#id20">收尾工作</a></h2>
<blockquote>
<p>卸载然后关闭加密分区:</p>
<blockquote>
<p># umount -R <某个挂载点></p>
<p># cryptsetup close <映射名称></p>
</blockquote>
</blockquote>
<p>如果需要的话,擦除一下刚刚用的备份分区 ( ⚆ _ ⚆ )</p>
<hr class="docutils"/>
<p>然后重新启动就好啦~</p>
</div>
systemd-boot 从安装到吃电脑(误2017-04-16T00:00:00+08:002017-04-16T00:00:00+08:00ホロtag:None,2017-04-16:/arch-linux/using_systemd_boot.html
<p>systemd-boot 从安装到吃电脑(误 😂</p>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id8">Systemd-boot 是啥?</a></h2>
<blockquote>
<p>systemd-boot (以前被称为gummiboot)
是可以执行 EFI 镜像文件的简单 UEFI 启动管理器。
启动的内容可以通过一个配置(glob)或者屏幕菜单选择。Arch 默认安装的 systemd 提供了这个功能。</p>
<p>配置很简单,但是只能启动 EFI 可执行程序,
例如 Linux 内核 EFISTUB, UEFI Shell, GRUB, Windows Boot Manager等。</p>
</blockquote>
<p>Systemd: 😋 => gummiboot</p>
<p>现在 Arch 的安装 ISO 在 UEFI 启动时用的就是这个启动管理器 😂</p>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id9">安装之前</a></h2>
<ul>
<li><p class="first"><strong>这是个 UEFI 启动管理器,于是 BIOS 系统是不能用的</strong> 😂</p>
</li>
<li><p class="first"><strong>首先汝的 …</strong></p></li></ul></div>
<p>systemd-boot 从安装到吃电脑(误 😂</p>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id8">Systemd-boot 是啥?</a></h2>
<blockquote>
<p>systemd-boot (以前被称为gummiboot)
是可以执行 EFI 镜像文件的简单 UEFI 启动管理器。
启动的内容可以通过一个配置(glob)或者屏幕菜单选择。Arch 默认安装的 systemd 提供了这个功能。</p>
<p>配置很简单,但是只能启动 EFI 可执行程序,
例如 Linux 内核 EFISTUB, UEFI Shell, GRUB, Windows Boot Manager等。</p>
</blockquote>
<p>Systemd: 😋 => gummiboot</p>
<p>现在 Arch 的安装 ISO 在 UEFI 启动时用的就是这个启动管理器 😂</p>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id9">安装之前</a></h2>
<ul>
<li><p class="first"><strong>这是个 UEFI 启动管理器,于是 BIOS 系统是不能用的</strong> 😂</p>
</li>
<li><p class="first"><strong>首先汝的 EFI 系统分区最好足够大而且挂载在 /boot 上……</strong> 😂</p>
<blockquote>
<ul class="simple">
<li>用 UEFI 该知道 EFI 系统分区是啥了吧😂</li>
<li>(不知道从哪里听说的)推荐大小是 512M ,Windows 自动创建的应该也够用( ~260M? )</li>
</ul>
</blockquote>
</li>
<li><p class="first">Arch Linux 的话还要安装上 efibootmgr 和 dosfstools 这两个包。</p>
</li>
</ul>
</div>
<div class="section" id="systemd-boot-efi">
<h2><a class="toc-backref" href="#id10">请 systemd-boot 入 EFI 系统分区 😋</a></h2>
<blockquote>
<p># bootctl install --path=/boot</p>
<p>⬆️ 像这样安装 systemd-boot 咯,--path 是 EFI 系统分区的位置。</p>
<p>如果不在电脑的内置硬盘上安装的话,加上 --no-variables ,就不会碰本机的 efivars 啦 😄</p>
<p>(下面可都当作把 EFI 系统分区挂载在 /boot 了咯~</p>
</blockquote>
</div>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id11">配置文件怎么写?</a></h2>
<p>(教会 systemd-boot 去哪里找汝的 GNU/Linux 系统的内核和如何启动等其它参数咯 😃</p>
<p>systemd-boot 的配置文件都放在 /boot/loader 呐~ ,里面还有一个 entries 文件夹
用来存放不同的启动项。</p>
<blockquote>
如果存在的话,bootctl 会自动为 "Windows Boot Manager (Windows 启动管理器)"
(\EFI\Microsoft\Boot\Bootmgfw.efi), "EFI Shell" (\shellx64.efi) 和
"EFI Default Loader" (\EFI\Boot\bootx64.efi) 增加启动选项哦。于是就不用写这三个了呐~</blockquote>
<p>基本配置 /boot/loader/loader.conf 像这样:</p>
<div class="highlight"><pre><span class="code-line"><span></span>default arch <- 默认启动选项的文件名(没有 .conf 哦</span>
<span class="code-line">timeout <span class="m">4</span> <- 选择启动选项的时间(如果没有这一项的话,启动时就不会弹出菜单</span>
<span class="code-line"> 而是直接启动默认启动项呐~不过启动时按住按键还是会显示启动菜单的啦😸</span>
<span class="code-line">editor <span class="m">0</span> <- 要不要允许在启动选项前按 e 键来更改启动选项呢?</span>
</pre></div>
<p>一个 systemd-boot 配置文件大概像这样:</p>
<div class="highlight"><pre><span class="code-line"><span></span>title 在启动管理器中显示的标题</span>
<span class="code-line">version 内核版本,只在有多个 title 时需要.</span>
<span class="code-line">machine-id 通过 /etc/machine-id用于区分不同设备的名称, 只在有多个title 和 version 时需要</span>
<span class="code-line">efi 要启动的EFI应用程序的位置,以 EFI 系统分区为相对路径哦<span class="p">;</span></span>
<span class="code-line"> 例如 /vmlinuz-linux (记住 systemd-boot 不会找 EFI 系统分区以外的分区上的文件 >_<</span>
<span class="code-line">options 传递给 EFI 应用程序或内核启动的参数,可选.</span>
<span class="code-line"> 比如启动 linux 内核就需要 <span class="nv">initrd</span><span class="o">=</span>efipath 和 <span class="nv">root</span><span class="o">=</span>dev 选项呐~</span>
</pre></div>
<p>不过汝要是启动 Linux 内核的话,可以不用 efi 而这么写</p>
<div class="highlight"><pre><span class="code-line"><span></span>linux < vmlinuz的位置 ></span>
<span class="code-line">initrd path-to-initramfs</span>
</pre></div>
<p>initrd 会自动转换成 efi path 和 options initrd=path 咯~</p>
<p>– 这个语法只是为了方便,在功能上并没有区别的啦 (つ°ω°)つ</p>
</div>
<div class="section" id="id4">
<h2><a class="toc-backref" href="#id12">动手写配置文件啦~ 🤣</a></h2>
<p>首先用 lsblk 确定汝的根分区是哪一个设备:</p>
<div class="highlight"><pre><span class="code-line"><span></span>$ lsblk</span>
<span class="code-line">NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT</span>
<span class="code-line">nvme0n1 <span class="m">259</span>:0 <span class="m">0</span> <span class="m">238</span>.5G <span class="m">0</span> disk</span>
<span class="code-line">├─nvme0n1p1 <span class="m">259</span>:1 <span class="m">0</span> 260M <span class="m">0</span> part /boot</span>
<span class="code-line">├─nvme0n1p2 <span class="m">259</span>:2 <span class="m">0</span> 128M <span class="m">0</span> part</span>
<span class="code-line">├─nvme0n1p3 <span class="m">259</span>:3 <span class="m">0</span> <span class="m">50</span>.1G <span class="m">0</span> part</span>
<span class="code-line">├─nvme0n1p4 <span class="m">259</span>:4 <span class="m">0</span> 60G <span class="m">0</span> part</span>
<span class="code-line">├─nvme0n1p5 <span class="m">259</span>:5 <span class="m">0</span> 900M <span class="m">0</span> part</span>
<span class="code-line">├─nvme0n1p6 <span class="m">259</span>:6 <span class="m">0</span> 124G <span class="m">0</span> part /</span>
<span class="code-line">└─nvme0n1p7 <span class="m">259</span>:7 <span class="m">0</span> <span class="m">3</span>.1G <span class="m">0</span> part</span>
</pre></div>
<p>比如咱的是 /dev/nvme0n1p7 (就是哪一个的 MOUNTPOINT 是 / 咯) 😂</p>
<p>然后获得它的 PARTUUID 😋</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># blkid -s PARTUUID -o value /dev/nvme0n1p6</span></span>
<span class="code-line">d39fe55a-0aa1-455e-84d7-0325e917b47b</span>
</pre></div>
<p>所以下面咱就用 d39fe55a-0aa1-455e-84d7-0325e917b47b 作为咱的 PARTUUID 咯~</p>
<blockquote>
汝的一定和咱的不一样,所以别一个字不差的照抄! 😡</blockquote>
<div class="section" id="id5">
<h3><a class="toc-backref" href="#id13">最简单的配置文件</a></h3>
<p>如果汝的 / 既不是 LVM 又没加密的话:</p>
<div class="highlight"><pre><span class="code-line"><span></span>title Arch Linux</span>
<span class="code-line">linux /vmlinuz-linux</span>
<span class="code-line">initrd /initramfs-linux.img</span>
<span class="code-line">options <span class="nv">root</span><span class="o">=</span><span class="nv">PARTUUID</span><span class="o">=</span>d39fe55a-0aa1-455e-84d7-0325e917b47b rw</span>
</pre></div>
<ul class="simple">
<li>可以把 title 换成汝喜欢的名字,如果汝用了其它内核(例如 linux-mainline ),
记得修改一下 linux 和 initrd 选项。</li>
<li>如果需要加载 Intel microcode 的话,就再来一行 initrd 咯~</li>
<li>如果还有其它的内核参数,加在 rw 后面咯~</li>
</ul>
</div>
<div class="section" id="lvm">
<h3><a class="toc-backref" href="#id14">用了 LVM?</a></h3>
<blockquote>
😣 等等!如果汝 LVM 逻辑卷组的外面没有一个单独的 /boot 的话就不能用 systemd-boot 了~</blockquote>
<div class="highlight"><pre><span class="code-line"><span></span>title Arch Linux <span class="o">(</span>LVM<span class="o">)</span></span>
<span class="code-line">linux /vmlinuz-linux</span>
<span class="code-line">initrd /initramfs-linux.img</span>
<span class="code-line">options <span class="nv">root</span><span class="o">=</span>/dev/mapper/<VolumeGroup-LogicalVolume> rw</span>
</pre></div>
<p>记得把 VolumeGroup 和 LogicalVolume 换成汝自己的 LVM 逻辑卷的卷组和卷名称啊~</p>
<p>当然用 UUID 也可以啦~</p>
</div>
<div class="section" id="id6">
<h3><a class="toc-backref" href="#id15">加密的 / ?</a></h3>
<div class="highlight"><pre><span class="code-line"><span></span>title Arch Linux Encrypted</span>
<span class="code-line">linux /vmlinuz-linux</span>
<span class="code-line">initrd /initramfs-linux.img</span>
<span class="code-line">options <span class="nv">cryptdevice</span><span class="o">=</span><span class="nv">PARTUUID</span><span class="o">=</span>d39fe55a-0aa1-455e-84d7-0325e917b47b:<mapped-name> <span class="nv">root</span><span class="o">=</span>/dev/mapper/<mapped-name> quiet rw</span>
</pre></div>
<p>mapped-name 是解密后的分区映射到的位置咯~,只要 cryptdevice 和 root 里的一样就行!~</p>
</div>
<div class="section" id="btrfs">
<h3><a class="toc-backref" href="#id16">btrfs 子卷?</a></h3>
<div class="highlight"><pre><span class="code-line"><span></span>title Arch Linux</span>
<span class="code-line">linux /vmlinuz-linux</span>
<span class="code-line">initrd /initramfs-linux.img</span>
<span class="code-line">options <span class="nv">root</span><span class="o">=</span><span class="nv">PARTUUID</span><span class="o">=</span>d39fe55a-0aa1-455e-84d7-0325e917b47b rw <span class="nv">rootflags</span><span class="o">=</span><span class="nv">subvol</span><span class="o">=</span>ROOT</span>
</pre></div>
<p>记得用汝自己的子卷名称换掉 rootflags=subvol=ROOT 里的 ROOT 啦 ~</p>
</div>
<div class="section" id="uefi">
<h3><a class="toc-backref" href="#id17">其它 UEFI 应用程序?</a></h3>
<p>例如 EFI Shell ?</p>
<div class="highlight"><pre><span class="code-line"><span></span>title UEFI Shell x86_64 v2</span>
<span class="code-line">efi /EFI/shellx64_v2.efi</span>
</pre></div>
</div>
</div>
<div class="section" id="id7">
<h2><a class="toc-backref" href="#id18">参考来源</a></h2>
<ul class="simple">
<li><a class="reference external" href="https://wiki.archlinux.org/index.php/Systemd-boot">ArchWiki:Systemd-boot</a></li>
<li><a class="reference external" href="http://www.freedesktop.org/wiki/Software/systemd/systemd-boot/">http://www.freedesktop.org/wiki/Software/systemd/systemd-boot/</a></li>
</ul>
</div>
所谓的近况?2017-04-15T00:00:00+08:002017-04-15T00:00:00+08:00ホロtag:None,2017-04-15:/life/status_20170415.html<!-- PELICAN_BEGIN_SUMMARY
啥?😂
一年过去了咱还是不会说话,于是直接开始咯~ -->
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id6">在完整和坏掉之间徘徊?</a></h2>
<p>(咱就是那么容易坏掉啊……当然也很容易修好就是了 😂</p>
<p>所以还是多多关照~</p>
</div>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id7">最近?</a></h2>
<p><del>说 blog 要关门啥的好像不是不可能......</del> 😂</p>
<p>其实最近又开始玩物丧志了…… 😂</p>
<blockquote>
<p><a class="reference external" href="http://p.eagate.573.jp/game/eac2dx/infinitas/p/common/top.html">http://p.eagate.573.jp/game/eac2dx/infinitas/p/common/top.html</a></p>
<p>⬆ 没错就是它, beatmania IIDX INFINITAS 😂</p>
</blockquote>
<p>(然而还是很菜就是了,另外这不是让这长草的借口 😂</p>
<p>其实是想写点啥的,例如 ssh 的用法什么的……不过好像大家都会的样子……</p>
</div>
<div class="section" id="id4">
<h2><a class="toc-backref" href="#id8">评论框消失了?</a></h2>
<p>换成 GitLab 了,于是评论就废了 (其实是懒得整 Gitlab 的API 😂</p>
<p><del>另外也没有用其它评论框的想法(还是懒……</del> 算了还是先用着Disqus了 😂</p>
<p>所以找咱的话,邮件/Twitter 都可以啦~</p>
</div>
<div class="section" id="id5">
<h2><a class="toc-backref" href="#id9">其它杂记</a></h2>
<p>最近在看 <a class="reference external" href="https://github.com/renormalizable/ircbot">gauge …</a></p></div><!-- PELICAN_BEGIN_SUMMARY
啥?😂
一年过去了咱还是不会说话,于是直接开始咯~ -->
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id6">在完整和坏掉之间徘徊?</a></h2>
<p>(咱就是那么容易坏掉啊……当然也很容易修好就是了 😂</p>
<p>所以还是多多关照~</p>
</div>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id7">最近?</a></h2>
<p><del>说 blog 要关门啥的好像不是不可能......</del> 😂</p>
<p>其实最近又开始玩物丧志了…… 😂</p>
<blockquote>
<p><a class="reference external" href="http://p.eagate.573.jp/game/eac2dx/infinitas/p/common/top.html">http://p.eagate.573.jp/game/eac2dx/infinitas/p/common/top.html</a></p>
<p>⬆ 没错就是它, beatmania IIDX INFINITAS 😂</p>
</blockquote>
<p>(然而还是很菜就是了,另外这不是让这长草的借口 😂</p>
<p>其实是想写点啥的,例如 ssh 的用法什么的……不过好像大家都会的样子……</p>
</div>
<div class="section" id="id4">
<h2><a class="toc-backref" href="#id8">评论框消失了?</a></h2>
<p>换成 GitLab 了,于是评论就废了 (其实是懒得整 Gitlab 的API 😂</p>
<p><del>另外也没有用其它评论框的想法(还是懒……</del> 算了还是先用着Disqus了 😂</p>
<p>所以找咱的话,邮件/Twitter 都可以啦~</p>
</div>
<div class="section" id="id5">
<h2><a class="toc-backref" href="#id9">其它杂记</a></h2>
<p>最近在看 <a class="reference external" href="https://github.com/renormalizable/ircbot">gauge 的 varia 的代码</a> ,
也想自己写一个……叫什么名字好呢?</p>
</div>
换到了 Parabola GNU/Linux Libre2017-04-06T00:00:00+08:002017-04-06T00:00:00+08:00ホロtag:None,2017-04-06:/parabola/switch_to_parabola.html
<p>在 <del>清真</del> 自由之路越走越远……</p>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id4">什么是 Parabola GNU/Linux Libre?</a></h2>
<blockquote>
<p>Parabola GNU/Linux-libre 是一个基于 Arch Linux 的自由软件项目,旨在提供完全自由的 GNU/Linux 发行版,并针对 i686,x86_64, ARM 三种 CPU 进行了优化。 Parabola 旨在保持包管理工具的简单化。其主要目的是为了让用户完全掌控自己的系統以及100%的自由软件。 作为一个完全自由的发行版,Parabola GNU/Linux-libre 被列在自由软件基金会上。</p>
<p>Parabola 发展的重点是简洁,优雅,源代码的正确性和最前沿的自由软件之间的平衡。</p>
<p>它轻量简约的设计使它易于扩展,可以根据自己的需求来塑造系统。</p>
</blockquote>
<p>就是自由化的 Arch Linux 咯~</p>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id5">怎么换?</a></h2>
<p><a class="reference external" href="https://wiki.parabola.nu/Migration_from_Arch_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87">https://wiki.parabola.nu …</a></p></div>
<p>在 <del>清真</del> 自由之路越走越远……</p>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id4">什么是 Parabola GNU/Linux Libre?</a></h2>
<blockquote>
<p>Parabola GNU/Linux-libre 是一个基于 Arch Linux 的自由软件项目,旨在提供完全自由的 GNU/Linux 发行版,并针对 i686,x86_64, ARM 三种 CPU 进行了优化。 Parabola 旨在保持包管理工具的简单化。其主要目的是为了让用户完全掌控自己的系統以及100%的自由软件。 作为一个完全自由的发行版,Parabola GNU/Linux-libre 被列在自由软件基金会上。</p>
<p>Parabola 发展的重点是简洁,优雅,源代码的正确性和最前沿的自由软件之间的平衡。</p>
<p>它轻量简约的设计使它易于扩展,可以根据自己的需求来塑造系统。</p>
</blockquote>
<p>就是自由化的 Arch Linux 咯~</p>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id5">怎么换?</a></h2>
<p><a class="reference external" href="https://wiki.parabola.nu/Migration_from_Arch_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87">https://wiki.parabola.nu/Migration_from_Arch_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87</a>)</p>
<p>Wiki 写的挺详细的 (咱顺手糊了翻译…… 😂</p>
</div>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id6">然后呢? 😂</a></h2>
<ul class="simple">
<li>只比 Arch Linux 少了个无线网卡诶(😂其实本来 Arch 就没剩下多少……,找个 USB 无线网卡插上凑合一下……</li>
<li>不少官方源的包和 <a class="reference external" href="https://www.parabola.nu/packages/libre/any/your-freedom/">your-freedom</a> 冲突, <del>被批判了一番……</del> ,然后被卸载了。</li>
<li>Firefox 和 ThunderBird 因为 Mozilla 的商标问题换成了 Iceweasel 和 IceDove ,然而 Firefox 那蜜汁 Emoji 显示…… 😂</li>
</ul>
</div>
<div class="section" id="del-del">
<h2><a class="toc-backref" href="#id7"><del>没错又水了篇文章……</del></a></h2>
<p>嗯……😂😂😂</p>
</div>
再续自绝后路之旅2017-03-29T00:00:00+08:002017-03-29T00:00:00+08:00ホロtag:None,2017-03-29:/life/in_return.html<!-- PELICAN_BEGIN_SUMMARY
就是这样。 -->
<p>咱成功的被忘掉了呢~</p>
<p>那就继续一个人走下去咯~</p>
<p>啦啦啦~</p>
<hr class="docutils"/>
<ul>
<li><p class="first">前两篇扔进 draft 文件夹了,想取笑咱的可以去看 :</p>
<blockquote>
<p><a class="reference external" href="https://gitlab.com/KenOokamiHoro/pelican-yoitsu/tree/master">https://gitlab.com/KenOokamiHoro/pelican-yoitsu/tree/master</a></p>
</blockquote>
</li>
<li><p class="first">换成 GitLab 了,于是评论就废了(反正也没人来了……</p>
<blockquote>
<p>真的想找咱的话就给咱发邮件: echo aG9yb0B5b2l0c3UubW9lCg== | base64 -d</p>
<p>目前还没有用或者造轮子的想法……</p>
</blockquote>
</li>
<li><p class="first">......</p>
<blockquote>
<p>在这看不到的地方向 #archlinux-cn 和 #dev-horo 的曾经的友人说声抱歉吧,不过也没有必要原谅咱。</p>
</blockquote>
</li>
</ul>
入手 Surface Book (续集)2017-02-22T00:00:00+08:002017-02-22T00:00:00+08:00ホロtag:None,2017-02-22:/arch-linux/get_surface_book_2.html
<p>为 Surface Book 添加触屏和电磁笔支持😂</p>
<p>感谢 <a class="reference external" href="https://github.com/ipts-linux-org/ipts-linux-new">https://github.com/ipts-linux-org/ipts-linux-new</a>
和 <a class="reference external" href="https://github.com/jimdigriz/debian-mssp4">https://github.com/jimdigriz/debian-mssp4</a> 的资源😂</p>
<div class="section" id="windows">
<h2><a class="toc-backref" href="#id3">还是搞 Windows _(:з」∠)_</a></h2>
<p>从 Windows 中把系统盘的 Windows/INF/PreciseTouch/Intel 文件夹复制出来备用。</p>
</div>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id4">装内核 😂</a></h2>
<p>从 AUR 安装 <a href="https://aur.archlinux.org/packages/?O=0&K=linux-surface-pro-4-git" title="在 AUR 上搜索linux-surface-pro-4-git">linux-surface-pro-4-git <sup>AUR</sup> </a></p>
<p>然而这个内核有两个问题😂:</p>
<ul class="simple">
<li>如果是在键盘和屏幕分离时启动会 Kernel Panic</li>
<li>如果没设置好接下来的 ipts 会在关机或重启时 Kernel Panic</li>
</ul>
<p>😂</p>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id5">链接驱动文件 😂</a></h2>
<p>首先把刚刚从 Windows 偷来的文件复制到相应的位置上:</p>
<blockquote>
<p># mkdir …</p></blockquote></div>
<p>为 Surface Book 添加触屏和电磁笔支持😂</p>
<p>感谢 <a class="reference external" href="https://github.com/ipts-linux-org/ipts-linux-new">https://github.com/ipts-linux-org/ipts-linux-new</a>
和 <a class="reference external" href="https://github.com/jimdigriz/debian-mssp4">https://github.com/jimdigriz/debian-mssp4</a> 的资源😂</p>
<div class="section" id="windows">
<h2><a class="toc-backref" href="#id3">还是搞 Windows _(:з」∠)_</a></h2>
<p>从 Windows 中把系统盘的 Windows/INF/PreciseTouch/Intel 文件夹复制出来备用。</p>
</div>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id4">装内核 😂</a></h2>
<p>从 AUR 安装 <a href="https://aur.archlinux.org/packages/?O=0&K=linux-surface-pro-4-git" title="在 AUR 上搜索linux-surface-pro-4-git">linux-surface-pro-4-git <sup>AUR</sup> </a></p>
<p>然而这个内核有两个问题😂:</p>
<ul class="simple">
<li>如果是在键盘和屏幕分离时启动会 Kernel Panic</li>
<li>如果没设置好接下来的 ipts 会在关机或重启时 Kernel Panic</li>
</ul>
<p>😂</p>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id5">链接驱动文件 😂</a></h2>
<p>首先把刚刚从 Windows 偷来的文件复制到相应的位置上:</p>
<blockquote>
<p># mkdir -p /usr/lib/firmware/intel/ipts</p>
<p># cp /path/to/Windows/INF/PreciseTouch/Intel /usr/lib/firmware/intel/ipts/</p>
</blockquote>
<p>然后链接相应的文件(如果提示目标已存在,就删掉再试一次咯😂</p>
<blockquote>
<p># ln -s iaPreciseTouchDescriptor.bin /lib/firmware/intel/ipts/intel_desc.bin</p>
<p># ln -s SurfaceTouchServicingDescriptorMSHW0076.bin /lib/firmware/intel/ipts/vendor_desc.bin</p>
<p># ln -s SurfaceTouchServicingKernelSKLMSHW0076.bin /lib/firmware/intel/ipts/vendor_kernel.bin</p>
<p># ln -s SurfaceTouchServicingSFTConfigMSHW0076.bin /lib/firmware/intel/ipts/config.bin</p>
<p>/me 有 0076/0078/0079 ,其中 0076 可用,0078 没法加载,0079 触屏方向相反了😂</p>
</blockquote>
<hr class="docutils"/>
<p>好了,重启一下试试?😂</p>
</div>
/dev/horo ~2017-02-20T00:00:00+08:002017-02-20T00:00:00+08:00ホロtag:None,2017-02-20:/horok/dev_horo_launch.html<!-- PELICAN_BEGIN_SUMMARY
Device as a Wolf!
将赫萝放入你的电脑,与(Cheng)她(Wei)愉(Ta)快(De)玩(Shi)耍(Wu)吧! 😋 -->
<p>在 <a class="reference external" href="/links.html#void001">void001</a> 的推动下这个 <ruby><rb>玩具</rb><rp>(</rp><rt>挖坑</rt><rp>)</rp></ruby> 项目终于开始做了呢 😂</p>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id2">那么这个到底是啥? 😂</a></h2>
<blockquote>
<p>FiveYellowMice:可以成为萌狼的食物主人。</p>
<p>lilydjwg:@FiveYellowMice: s/主人/奴隶/</p>
</blockquote>
<p>现在做的像是一个设备文件咯😂,然后可以通过 echo / cat 一类的命令和她沟通呐~</p>
<img alt="Examples" class="materialboxed responsive-img" src="https://wiki.yoitsu.moe/w/images/3/31/Dev-horo.jpg"/>
<hr class="docutils"/>
<p><del>没错今天就是来安利顺便凑数的😂</del></p>
<p>其实最需要的还是脑洞😂,所以召集新用(shi)户(wu)中😋</p>
<blockquote>
<p>😋 /dev/horo 绝赞开发中~</p>
<p>Device as a Wolf!</p>
<p>将赫萝放入你的电脑,与(Cheng)她(Wei)愉(Ta)快(De)玩(Shi)耍(Wu)吧! 😋</p>
<p><a class="reference external" href="https://github.com/VOID001/dev.horo">https://github.com …</a></p></blockquote></div><!-- PELICAN_BEGIN_SUMMARY
Device as a Wolf!
将赫萝放入你的电脑,与(Cheng)她(Wei)愉(Ta)快(De)玩(Shi)耍(Wu)吧! 😋 -->
<p>在 <a class="reference external" href="/links.html#void001">void001</a> 的推动下这个 <ruby><rb>玩具</rb><rp>(</rp><rt>挖坑</rt><rp>)</rp></ruby> 项目终于开始做了呢 😂</p>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id2">那么这个到底是啥? 😂</a></h2>
<blockquote>
<p>FiveYellowMice:可以成为萌狼的食物主人。</p>
<p>lilydjwg:@FiveYellowMice: s/主人/奴隶/</p>
</blockquote>
<p>现在做的像是一个设备文件咯😂,然后可以通过 echo / cat 一类的命令和她沟通呐~</p>
<img alt="Examples" class="materialboxed responsive-img" src="https://wiki.yoitsu.moe/w/images/3/31/Dev-horo.jpg"/>
<hr class="docutils"/>
<p><del>没错今天就是来安利顺便凑数的😂</del></p>
<p>其实最需要的还是脑洞😂,所以召集新用(shi)户(wu)中😋</p>
<blockquote>
<p>😋 /dev/horo 绝赞开发中~</p>
<p>Device as a Wolf!</p>
<p>将赫萝放入你的电脑,与(Cheng)她(Wei)愉(Ta)快(De)玩(Shi)耍(Wu)吧! 😋</p>
<p><a class="reference external" href="https://github.com/VOID001/dev.horo">https://github.com/VOID001/dev.horo</a></p>
<p><a class="reference external" href="https://wiki.yoitsu.moe/wiki/Portal:Dev.horo">https://wiki.yoitsu.moe/wiki/Portal:Dev.horo</a></p>
<p>😋😋😋</p>
<p><a class="reference external" href="https://t.me/joinchat/AAAAAEIBdwBe63jlCgq_XQ">https://t.me/joinchat/AAAAAEIBdwBe63jlCgq_XQ</a> <- Telegram 水群</p>
<p><a class="reference external" href="//webchat.freenode.net/?channels=dev-horo">#dev-horo</a> <- IRC 连接到主群😂</p>
</blockquote>
</div>
在 Arch Linux 上用 Prosody 搭建 XMPP 服务器2017-02-05T00:00:00+08:002017-02-05T00:00:00+08:00ホロtag:None,2017-02-05:/arch-linux/prosody_on_archlinux.html
<p>在 Arch Linux 上用 Prosody 搭建 XMPP 服务器😋</p>
<div class="section" id="xmpp">
<h2><a class="toc-backref" href="#id4">XMPP 是啥?</a></h2>
<p>😂 连这个都不知道?</p>
<blockquote>
<p><a class="reference external" href="https://tonghuix.io/2015/03/xmpp-chat/">https://tonghuix.io/2015/03/xmpp-chat/</a></p>
<p>⇪网页标题:弃用QQ和微信!全面转向基于XMPP(Jabber)的即时聊天</p>
</blockquote>
<p>这篇文章简单的介绍了下 XMPP 的基本特点,也推荐了些不同平台的客户端。</p>
</div>
<div class="section" id="prosody">
<h2><a class="toc-backref" href="#id5">为啥是 Prosody ?</a></h2>
<p>因为好像大家都推荐😂</p>
</div>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id6">😂 那么怎么搞?</a></h2>
<p>按惯例先上 ArchWiki : <a class="reference external" href="https://wiki.archlinux.org/index.php/Prosody">https://wiki.archlinux.org/index.php/Prosody</a> 😂</p>
<p>和 Prosody 自己的文档: <a class="reference external" href="https://prosody.im/doc/">https://prosody.im/doc/</a></p>
<p>首先安装 Prodosy (和它的依赖):</p>
<blockquote>
# pacman …</blockquote></div>
<p>在 Arch Linux 上用 Prosody 搭建 XMPP 服务器😋</p>
<div class="section" id="xmpp">
<h2><a class="toc-backref" href="#id4">XMPP 是啥?</a></h2>
<p>😂 连这个都不知道?</p>
<blockquote>
<p><a class="reference external" href="https://tonghuix.io/2015/03/xmpp-chat/">https://tonghuix.io/2015/03/xmpp-chat/</a></p>
<p>⇪网页标题:弃用QQ和微信!全面转向基于XMPP(Jabber)的即时聊天</p>
</blockquote>
<p>这篇文章简单的介绍了下 XMPP 的基本特点,也推荐了些不同平台的客户端。</p>
</div>
<div class="section" id="prosody">
<h2><a class="toc-backref" href="#id5">为啥是 Prosody ?</a></h2>
<p>因为好像大家都推荐😂</p>
</div>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id6">😂 那么怎么搞?</a></h2>
<p>按惯例先上 ArchWiki : <a class="reference external" href="https://wiki.archlinux.org/index.php/Prosody">https://wiki.archlinux.org/index.php/Prosody</a> 😂</p>
<p>和 Prosody 自己的文档: <a class="reference external" href="https://prosody.im/doc/">https://prosody.im/doc/</a></p>
<p>首先安装 Prodosy (和它的依赖):</p>
<blockquote>
# pacman -S prosody lua51-sec</blockquote>
<p>lua51-sec 为 Prosody 提供了加密支持。所以还是装上它呗~</p>
<p>然后修改下配置文件 /etc/prosody/prosody.cfg.lua :</p>
<blockquote>
顺便说一句 Lua 的注释是每一行前面的连字号呐~</blockquote>
<p>下面写些咱做的修改😂</p>
<ul class="simple">
<li>在 modules_enabled 中取消启用 version 和 uptime 模块,顺便启动些其他的模块。</li>
<li>如果需要允许在客户端上注册的话,把 allow_registration 设置成 true 。</li>
<li>开启 TLS 加密:</li>
</ul>
<div class="highlight"><pre><span class="code-line"><span></span><span class="n">ssl</span> <span class="o">=</span> <span class="p">{</span></span>
<span class="code-line"> <span class="c1">--- 私钥文件的路径</span></span>
<span class="code-line"> <span class="n">key</span> <span class="o">=</span> <span class="s2">"/etc/prosody/certs/privkey.pem"</span><span class="p">;</span></span>
<span class="code-line"> <span class="c1">--- 证书文件的路径</span></span>
<span class="code-line"> <span class="n">certificate</span> <span class="o">=</span> <span class="s2">"/etc/prosody/certs/fullchain.pem"</span><span class="p">;</span></span>
<span class="code-line"> <span class="c1">--- 要点是证书和私钥要对 prosody 用户可读😂</span></span>
<span class="code-line"> <span class="c1">--- 咱一开始就是没搞对然后 prosody 默默的以不加密模式运行了 😂</span></span>
<span class="code-line"> <span class="c1">--- 可以使用的协议,Prosody 0.10以上版本,可以使用"tlsv1_2+";</span></span>
<span class="code-line"> <span class="c1">--- 若是较旧版本,可以使用"sslv23"开启所有协议支持,</span></span>
<span class="code-line"> <span class="c1">--- 然后在options中关闭除TLSv1.2之外的协议支持。</span></span>
<span class="code-line"> <span class="c1">--- 但是咱因为兼容性需要用的还是 tlsv1+ 😂</span></span>
<span class="code-line"> <span class="n">protocol</span> <span class="o">=</span> <span class="s2">"tlsv1+"</span><span class="p">;</span></span>
<span class="code-line"> <span class="c1">--- 加密选项,</span></span>
<span class="code-line"> <span class="n">options</span> <span class="o">=</span> <span class="p">{</span></span>
<span class="code-line"> <span class="c1">--- 旧版加上这几行关掉老协议</span></span>
<span class="code-line"> <span class="s2">"no_tlsv1"</span><span class="p">,</span></span>
<span class="code-line"> <span class="s2">"no_tlsv1_1"</span><span class="p">,</span></span>
<span class="code-line"> <span class="s2">"no_sslv2"</span><span class="p">,</span></span>
<span class="code-line"> <span class="s2">"no_sslv3"</span><span class="p">,</span></span>
<span class="code-line"> <span class="c1">--- 剩下的其实是 prosody 的默认选项😂</span></span>
<span class="code-line"> <span class="s2">"no_ticket"</span><span class="p">,</span></span>
<span class="code-line"> <span class="s2">"no_compression"</span><span class="p">,</span></span>
<span class="code-line"> <span class="s2">"cipher_server_preference"</span><span class="p">,</span></span>
<span class="code-line"> <span class="s2">"single_dh_use"</span><span class="p">,</span></span>
<span class="code-line"> <span class="s2">"single_ecdh_use"</span></span>
<span class="code-line"> <span class="p">};</span></span>
<span class="code-line"> <span class="c1">--- 为客户端到服务器(c2s)和服务器到服务器(s2s)打开认证</span></span>
<span class="code-line"> <span class="n">verify</span> <span class="o">=</span> <span class="p">{</span> <span class="s2">"peer"</span><span class="p">,</span> <span class="s2">"peer"</span> <span class="p">};</span></span>
<span class="code-line"> <span class="c1">--- ciphers 是所使用的加密算法,写法就是 openSSL 的 cipher string 😂</span></span>
<span class="code-line"> <span class="c1">--- 这是默认配置</span></span>
<span class="code-line"> <span class="n">ciphers</span> <span class="o">=</span> <span class="s2">"HIGH+kEDH:HIGH+kEECDH:HIGH:!PSK:!SRP:!3DES:!aNULL"</span><span class="p">;</span></span>
<span class="code-line"> <span class="c1">--- 某个全是前向安全算法的配置 😂</span></span>
<span class="code-line"> <span class="c1">--- 有没有大佬推荐个更好的配置啊 😂</span></span>
<span class="code-line"> <span class="n">ciphers</span> <span class="o">=</span> <span class="s2">"EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH"</span><span class="p">;</span></span>
<span class="code-line"> <span class="c1">--- dhparam 文件的路径,要对 prosody 用户可读😂</span></span>
<span class="code-line"> <span class="n">dhparam</span> <span class="o">=</span> <span class="s2">"/etc/prosody/certs/dhparams.pem"</span><span class="p">;</span></span>
<span class="code-line"><span class="p">}</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="c1">-- Force clients to use encrypted connections? This option will</span></span>
<span class="code-line"><span class="c1">-- prevent clients from authenticating unless they are using encryption.</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="c1">-- 对客户端到服务器强制启用加密</span></span>
<span class="code-line"><span class="n">c2s_require_encryption</span> <span class="o">=</span> <span class="kc">true</span></span>
<span class="code-line"><span class="c1">-- 对服务器到服务器强制启用加密</span></span>
<span class="code-line"><span class="n">s2s_require_encryption</span> <span class="o">=</span> <span class="kc">true</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="c1">-- Force certificate authentication for server-to-server connections?</span></span>
<span class="code-line"><span class="c1">-- This provides ideal security, but requires servers you communicate</span></span>
<span class="code-line"><span class="c1">-- with to support encryption AND present valid, trusted certificates.</span></span>
<span class="code-line"><span class="c1">-- NOTE: Your version of LuaSec must support certificate verification!</span></span>
<span class="code-line"><span class="c1">-- For more information see https://prosody.im/doc/s2s#security</span></span>
<span class="code-line"><span class="c1">-- 是否验证远程服务器的证书?</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="n">s2s_secure_auth</span> <span class="o">=</span> <span class="kc">true</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="c1">-- Many servers don't support encryption or have invalid or self-signed</span></span>
<span class="code-line"><span class="c1">-- certificates. You can list domains here that will not be required to</span></span>
<span class="code-line"><span class="c1">-- authenticate using certificates. They will be authenticated using DNS.</span></span>
<span class="code-line"><span class="c1">-- 为某些不资瓷加密或者没设置好的辣鸡服务器换用DNS验证……</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="c1">--s2s_insecure_domains = { "gmail.com" }</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="c1">-- Even if you leave s2s_secure_auth disabled, you can still require valid</span></span>
<span class="code-line"><span class="c1">-- certificates for some domains by specifying a list here.</span></span>
<span class="code-line"><span class="c1">-- 如果 s2s_secure_auth = false ,可以在这里设置那些服务器一定启用验证</span></span>
<span class="code-line"><span class="c1">--s2s_secure_domains = { "jabber.org" }</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="c1">-- Select the authentication backend to use. The 'internal' providers</span></span>
<span class="code-line"><span class="c1">-- use Prosody's configured data storage to store the authentication data.</span></span>
<span class="code-line"><span class="c1">-- To allow Prosody to offer secure authentication mechanisms to clients, the</span></span>
<span class="code-line"><span class="c1">-- default provider stores passwords in plaintext. If you do not trust your</span></span>
<span class="code-line"><span class="c1">-- server please see https://prosody.im/doc/modules/mod_auth_internal_hashed</span></span>
<span class="code-line"><span class="c1">-- for information about using the hashed backend.</span></span>
<span class="code-line"><span class="c1">-- 认证方式,"internal_hashed" 一般情况下就够了。</span></span>
<span class="code-line"><span class="n">authentication</span> <span class="o">=</span> <span class="s2">"internal_hashed"</span></span>
</pre></div>
<ul>
<li><p class="first">某些其它设置……</p>
<blockquote>
<p>--- 新用户注册通知,会发到管理员的帐号上。
registration_notification = "User $username just registered on $host from $ip"
--- 如果启用了 welcome 插件,在这里自定义欢迎消息
welcome_message = ""</p>
</blockquote>
</li>
</ul>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id7">试用😂</a></h2>
<p>然后测试下配置文件对不对(啥输出都没有就正常😂)</p>
<blockquote>
lua -p /etc/prosody/prosody.cfg.lua</blockquote>
<p>一切正常的话就启动服务试试呗~</p>
<blockquote>
# systemctl start prosody</blockquote>
<p>如果没开启允许客户端注册的话,用 prosodyctl 注册账户</p>
<blockquote>
# prosodyctl adduser <JID></blockquote>
</div>
<hr class="docutils"/>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id8">参考来源 😂</a></h2>
<blockquote>
<p><a class="reference external" href="https://wiki.archlinux.org/index.php/Prosody">https://wiki.archlinux.org/index.php/Prosody</a></p>
<p>⇪网页标题:Prosody - ArchWiki</p>
<p><a class="reference external" href="https://blog.ayanami.re/archives/3/">https://blog.ayanami.re/archives/3/</a></p>
<p>⇪网页标题:自建 XMPP 的二三事 - El Virilea via Kralisch</p>
</blockquote>
</div>
啥?一年了??2017-01-17T00:00:00+08:002017-01-17T00:00:00+08:00ホロtag:None,2017-01-17:/life/one_year.html<!-- PELICAN_BEGIN_SUMMARY
真的么😂 -->
<p>啥?这样一年就过去了??😂</p>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id4">咱这一年都干了啥?</a></h2>
<ul>
<li><p class="first"><del>觅食……</del> 😋</p>
</li>
<li><p class="first">注册了个 Telegram 帐号,然后去 #archlinux-cn 吹水, <del>再删号</del> ……</p>
</li>
<li><p class="first">买了 Surface Book ,又从社团借(?)来不少好玩的东西。</p>
</li>
<li><p class="first">一个小时里总有那么几十分钟在迷茫😂,然后干了不少可笑的事(比如把 GitHub 帐号删了几天以后又重新注册这样的……)</p>
</li>
<li><p class="first">沉迷音游不能自拔(虽然手残……)😂</p>
</li>
<li><p class="first">为了 Project DIVA Future Tone 买了 PS4 😂</p>
<blockquote>
<img alt="就是这个" class="materialboxed responsive-img" src="/images/PDFT.jpg"/>
<p>⬆️ 就是这个😂</p>
</blockquote>
</li>
<li><p class="first">赶工粗制滥造了两套 Pelican 主题(根本就没有达到可以复用的层次……)😂</p>
</li>
<li><p class="first">挖了不知道多少坑没填 😂😭</p>
</li>
</ul>
</div>
<div class="section" id="future-tone">
<h2><a class="toc-backref" href="#id5">最近沉迷 Future Tone 不能自拔 😂</a></h2>
<p>虽然一直被虐……</p>
<img alt="就是这个" class="materialboxed responsive-img" src="/images/one_year/2.jpg"/>
<p><del>一定是因为玩这个的人不多……</del></p>
<img alt="就是这个" class="materialboxed responsive-img" src="/images/one_year/3.jpg"/>
<p>/me 手残没法治😂</p>
<img alt="Extreme 就只有被虐的份😂" class="materialboxed responsive-img" src="/images/one_year/4.png"/>
<p>Extreme 就只有被虐的份😂</p>
</div>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id6">接下来咱要干啥?</a></h2>
<ul class="simple">
<li><del>接着觅食……</del> 😋</li>
<li>整理下长草的 wiki …</li></ul></div><!-- PELICAN_BEGIN_SUMMARY
真的么😂 -->
<p>啥?这样一年就过去了??😂</p>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id4">咱这一年都干了啥?</a></h2>
<ul>
<li><p class="first"><del>觅食……</del> 😋</p>
</li>
<li><p class="first">注册了个 Telegram 帐号,然后去 #archlinux-cn 吹水, <del>再删号</del> ……</p>
</li>
<li><p class="first">买了 Surface Book ,又从社团借(?)来不少好玩的东西。</p>
</li>
<li><p class="first">一个小时里总有那么几十分钟在迷茫😂,然后干了不少可笑的事(比如把 GitHub 帐号删了几天以后又重新注册这样的……)</p>
</li>
<li><p class="first">沉迷音游不能自拔(虽然手残……)😂</p>
</li>
<li><p class="first">为了 Project DIVA Future Tone 买了 PS4 😂</p>
<blockquote>
<img alt="就是这个" class="materialboxed responsive-img" src="/images/PDFT.jpg"/>
<p>⬆️ 就是这个😂</p>
</blockquote>
</li>
<li><p class="first">赶工粗制滥造了两套 Pelican 主题(根本就没有达到可以复用的层次……)😂</p>
</li>
<li><p class="first">挖了不知道多少坑没填 😂😭</p>
</li>
</ul>
</div>
<div class="section" id="future-tone">
<h2><a class="toc-backref" href="#id5">最近沉迷 Future Tone 不能自拔 😂</a></h2>
<p>虽然一直被虐……</p>
<img alt="就是这个" class="materialboxed responsive-img" src="/images/one_year/2.jpg"/>
<p><del>一定是因为玩这个的人不多……</del></p>
<img alt="就是这个" class="materialboxed responsive-img" src="/images/one_year/3.jpg"/>
<p>/me 手残没法治😂</p>
<img alt="Extreme 就只有被虐的份😂" class="materialboxed responsive-img" src="/images/one_year/4.png"/>
<p>Extreme 就只有被虐的份😂</p>
</div>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id6">接下来咱要干啥?</a></h2>
<ul class="simple">
<li><del>接着觅食……</del> 😋</li>
<li>整理下长草的 wiki 然后放点东西上去……</li>
<li>写些小程序(和微信那个啥关系都没有……)</li>
<li>为社团下学期 GNU/Linux 桌面培训(自称)准备讲义😂</li>
<li><del>继续玩 Project DIVA Future Tone ……</del></li>
</ul>
</div>
在腾讯云服务器中重装 Windows 系统为 Arch Linux2016-12-28T00:00:00+08:002016-12-28T00:00:00+08:00ホロtag:None,2016-12-28:/arch-linux/cvm_with_arch_linux.html
<p>灵感来自 <a class="reference external" href="https://danknest.org/install-linux-on-qcloud-windows-cvm">https://danknest.org/install-linux-on-qcloud-windows-cvm</a> 😂</p>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id7">为啥?😂</a></h2>
<blockquote>
<p>腾讯云只给 Linux 系统的云服务器赠送 <del>8G</del> 20G 系统盘以强行推销数据盘,
而 <del>由于这样抠门的限制在 Windows 系统上是显然行不通的,</del> 给 Windows 系统赠送 50G 系统盘。</p>
<p>😒</p>
<p>所以…… 😏</p>
</blockquote>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id8">前期准备</a></h2>
<p>准备 Arch Linux 和 Debian 的安装 ISO 就行 😹</p>
<img alt="前期工作……" class="materialboxed responsive-img" src="/images/QVM_Arch/2.png"/>
<p>然后打开 控制面板-网络连接 记下现在的网络信息 (谁叫没有 DHCP 用😂</p>
<img alt="网络信息" class="materialboxed responsive-img" src="/images/QVM_Arch/1.png"/>
<p>然后照 <a class="reference external" href="/arch-linux/installing_arch_linux_for_complete_newbies.html#id4">这里</a></p>
<p>准备一个新分区出来,大小比 Arch Linux ISO 大点,然后记得格式化成 FAT32 😂</p>
<img alt="分区" class="materialboxed responsive-img" src="/images/QVM_Arch/5.png"/>
<p>接着把两个 ISO 挂载上 …</p></div>
<p>灵感来自 <a class="reference external" href="https://danknest.org/install-linux-on-qcloud-windows-cvm">https://danknest.org/install-linux-on-qcloud-windows-cvm</a> 😂</p>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id7">为啥?😂</a></h2>
<blockquote>
<p>腾讯云只给 Linux 系统的云服务器赠送 <del>8G</del> 20G 系统盘以强行推销数据盘,
而 <del>由于这样抠门的限制在 Windows 系统上是显然行不通的,</del> 给 Windows 系统赠送 50G 系统盘。</p>
<p>😒</p>
<p>所以…… 😏</p>
</blockquote>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id8">前期准备</a></h2>
<p>准备 Arch Linux 和 Debian 的安装 ISO 就行 😹</p>
<img alt="前期工作……" class="materialboxed responsive-img" src="/images/QVM_Arch/2.png"/>
<p>然后打开 控制面板-网络连接 记下现在的网络信息 (谁叫没有 DHCP 用😂</p>
<img alt="网络信息" class="materialboxed responsive-img" src="/images/QVM_Arch/1.png"/>
<p>然后照 <a class="reference external" href="/arch-linux/installing_arch_linux_for_complete_newbies.html#id4">这里</a></p>
<p>准备一个新分区出来,大小比 Arch Linux ISO 大点,然后记得格式化成 FAT32 😂</p>
<img alt="分区" class="materialboxed responsive-img" src="/images/QVM_Arch/5.png"/>
<p>接着把两个 ISO 挂载上。</p>
<img alt="挂载 ISO" class="materialboxed responsive-img" src="/images/QVM_Arch/6.png"/>
</div>
<div class="section" id="debian">
<h2><a class="toc-backref" href="#id9">用 Debian 安装程序加载器生成启动项</a></h2>
<p>用兼容性选项设置 Debian 安装盘下的 setup.exe 以 Windows Vista 运行(不然会报错说不支持 Windows NT 6.x
( 好像只支持 Vista 就是 6.0 的样子 😂 )</p>
<img alt="兼容性设置" class="materialboxed responsive-img" src="/images/QVM_Arch/7.png"/>
<p>然后运行,不过先别忙着重启……</p>
<img alt="running……" class="materialboxed responsive-img" src="/images/QVM_Arch/9.png"/>
<p>这个时候把 Arch ISO 的文件复制到新的分区上,然后照着 ISO 改一下卷标 😂</p>
<img alt="改卷标……" class="materialboxed responsive-img" src="/images/QVM_Arch/15.png"/>
</div>
<div class="section" id="id4">
<h2><a class="toc-backref" href="#id10">改启动项 + 重启</a></h2>
<p>把 ISO 或者硬盘上 /arch/boot/x86_64/ 里的 vmlinuz 和 archiso.img 复制到
C 盘的根目录,必要的话改成小写</p>
<img alt="这" class="materialboxed responsive-img" src="/images/QVM_Arch/17.png"/>
<img alt="那" class="materialboxed responsive-img" src="/images/QVM_Arch/18.png"/>
<p>然后打开 C:/win32-loader/grub.cfg 改成这样 (记得把卷标换成汝自己的):</p>
<blockquote>
<p>linux /vmlinuz archisobasedir=arch archisolabel=ARCH_201612</p>
<p>initrd /archiso.img</p>
<p>boot</p>
</blockquote>
<img alt="😂" class="materialboxed responsive-img" src="/images/QVM_Arch/19.png"/>
<p>最后重启,用 CVM 的控制台登录,选 Debian 啥的那项😂:</p>
<img alt="😂" class="materialboxed responsive-img" src="/images/QVM_Arch/21.png"/>
<p>等若干秒:</p>
<img alt="😂" class="materialboxed responsive-img" src="/images/QVM_Arch/22.png"/>
<p>😂😂</p>
</div>
<div class="section" id="id5">
<h2><a class="toc-backref" href="#id11">连上网</a></h2>
<p>(之前说过企鹅云不给 DHCP 😂</p>
<p>于是拿出刚刚抄下来的网络信息备用。</p>
<p>首先,用 ip link 确定一下接口 (咱是ens3 😂</p>
<img alt="ip link" class="materialboxed responsive-img" src="/images/QVM_Arch/23.png"/>
<p>然后添加 IP 地址:</p>
<blockquote>
<p>ip addr add {用 CIDR 表示的 IP 地址} dev {汝的网卡名称}</p>
<p>(CIDR = <a class="reference external" href="https://zh.wikipedia.org/wiki/无类别域间路由">无类别域间路由</a> )</p>
</blockquote>
<p>例如咱的子网掩码是 255.255.192.0 就这么写:</p>
<blockquote>
ip addr add 10.141.60.78/18 dev ens3</blockquote>
<p>接着添加网关:</p>
<blockquote>
ip route add default via {网关 IP 地址}</blockquote>
<p>最后编辑 /etc/resolv.conf 改成抄下来的 DNS 服务器地址 😂:</p>
<img alt="/etc/resolv.conf" class="materialboxed responsive-img" src="/images/QVM_Arch/24.png"/>
<p>然后联网试试?😂</p>
<img alt="😂" class="materialboxed responsive-img" src="/images/QVM_Arch/25.png"/>
<hr class="docutils"/>
<p>然后在 CVM 上直接装或者打开 sshd 用自己的电脑连上去啥的就自己围观 ArchWiki 好啦:</p>
<p><a class="reference external" href="https://wiki.archlinux.org/index.php/Installation_guide">https://wiki.archlinux.org/index.php/Installation_guide</a></p>
<p><a class="reference external" href="https://wiki.archlinux.org/index.php/Install_from_SSH">https://wiki.archlinux.org/index.php/Install_from_SSH</a></p>
</div>
这不是结束2016-12-14T00:00:00+08:002016-12-14T00:00:00+08:00ホロtag:None,2016-12-14:/life/it_is_not_a_end.html<!-- PELICAN_BEGIN_SUMMARY
:del:`因为根本就没有开始……`
借口都已经找好了呢(😂) -->
<p><del>这不是结束,</del></p>
<blockquote>
<p><del>因为根本就没有开始。</del></p>
<p><del>那场短暂的梦境,是时候该醒来了。</del></p>
<p><del>就这样吧,再见了。</del></p>
</blockquote>
<p><del>(下一次会在哪里开始,又是以什么样开始呢,咱不知道……</del></p>
<hr class="docutils"/>
<p>借口都已经找好了呢(😂),对没错就是重新画了个主题😂😂</p>
编译 OpenWrt 和加入 Alljoyn Framework 支持2016-12-13T00:00:00+08:002016-12-13T00:00:00+08:00ホロtag:None,2016-12-13:/tech_misc/compile_openwrt_and_add_alljoyn_framwork.html
<p>编译 OpenWrt 和加入 Alljoyn Framework 支持(纯粹是为了完成任务……)😂</p>
<div class="section" id="openwrt-alljoyn">
<h2><a class="toc-backref" href="#id5">OpenWrt 和 Alljoyn 分别是啥?</a></h2>
<blockquote>
<p>OpenWrt是适合于嵌入式设备的一个Linux发行版。</p>
<p>相对原厂固件而言,OpenWrt不是一个单一、静态的固件,而是提供了一个可添加软件包的可写的文件系统。
这使使用者可以自由的选择应用程序和配置,而不必受设备提供商的限制,并且可以使用一些适合某方面应用的软件包来定制你的设备。
对于开发者来说,OpenWrt是一个框架,开发者不必麻烦的构建整个固件就能得到想要的应用程序;
对于使用者来说,这意味着完全定制的能力,与以往不同的方式使用设备,OPKG包含超过3500个软件。
默认使用LuCI作为web交互界面。</p>
<p><a class="reference external" href="https://openwrt.org">OpenWrt</a></p>
<p>AllJoyn,由高通公司主导的高通创新中心(Qualcomm Innovation Center)所开发的开放原始码专案,
主要用于近距离无线传输,透过Wifi或蓝牙技术,进行定位与点对点档案传输。</p>
<p>后来成为了 Linux 基金会赞助的项目之一。</p>
<p><a class="reference external" href="https://allseenalliance.org/">AllSeen Alliance</a></p>
</blockquote>
</div>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id6">第一步:准备编译环境</a></h2>
<p>OpenWrt 官方的文档在这: <a class="reference external" href="https://wiki.openwrt.org/doc/howto/buildroot.exigence">https://wiki.openwrt.org …</a></p></div>
<p>编译 OpenWrt 和加入 Alljoyn Framework 支持(纯粹是为了完成任务……)😂</p>
<div class="section" id="openwrt-alljoyn">
<h2><a class="toc-backref" href="#id5">OpenWrt 和 Alljoyn 分别是啥?</a></h2>
<blockquote>
<p>OpenWrt是适合于嵌入式设备的一个Linux发行版。</p>
<p>相对原厂固件而言,OpenWrt不是一个单一、静态的固件,而是提供了一个可添加软件包的可写的文件系统。
这使使用者可以自由的选择应用程序和配置,而不必受设备提供商的限制,并且可以使用一些适合某方面应用的软件包来定制你的设备。
对于开发者来说,OpenWrt是一个框架,开发者不必麻烦的构建整个固件就能得到想要的应用程序;
对于使用者来说,这意味着完全定制的能力,与以往不同的方式使用设备,OPKG包含超过3500个软件。
默认使用LuCI作为web交互界面。</p>
<p><a class="reference external" href="https://openwrt.org">OpenWrt</a></p>
<p>AllJoyn,由高通公司主导的高通创新中心(Qualcomm Innovation Center)所开发的开放原始码专案,
主要用于近距离无线传输,透过Wifi或蓝牙技术,进行定位与点对点档案传输。</p>
<p>后来成为了 Linux 基金会赞助的项目之一。</p>
<p><a class="reference external" href="https://allseenalliance.org/">AllSeen Alliance</a></p>
</blockquote>
</div>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id6">第一步:准备编译环境</a></h2>
<p>OpenWrt 官方的文档在这: <a class="reference external" href="https://wiki.openwrt.org/doc/howto/buildroot.exigence">https://wiki.openwrt.org/doc/howto/buildroot.exigence</a></p>
<p>首先需要保证汝的硬盘上还剩下至少 4GiB 左右的剩余空间啦~</p>
<p>然后安装编译所需的工具,Arch 的话大概 <code class="code">
base-devel</code>
组就够了吧 😂</p>
<blockquote>
# pacman -S base-devel git</blockquote>
<p>官方文档 “Table of known prerequisites and their corresponding packages”
一节列出了编译不同组件各自需要的软件包,
还是装上吧😂,用 <code class="code">
--needed</code>
参数跳过已经安装的包。</p>
<blockquote>
# pacman -S asciidoc bash bc binutils bzip2 fastjar flex git
gcc util-linux gawk gtk2 intltool zlib make cdrkit ncurses patch
perl-extutils-makemaker python2 rsync ruby sdcc unzip wget gettext
libxslt zlib boost libusb bin86 sharutils jdk7-openjdk</blockquote>
<p>除了编译 lilo 需要的 bcc <- 这个在 AUR: <a class="reference external" href="https://aur.archlinux.org/packages/bcc/">https://aur.archlinux.org/packages/bcc/</a></p>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id7">第二步:准备源代码</a></h2>
<p>这个时候就要打开汝的终端啦😋</p>
<p>和其它项目类似,不同的 git 分支也是不同的版本呗~:</p>
<blockquote>
<p>git clone git://github.com/openwrt/openwrt.git</p>
<p>(master 分支,也就是 openwrt 的 trunk 版本)</p>
<p>git clone -b chaos_calmer git://github.com/openwrt/openwrt.git</p>
<p>(openwrt 的 chaos_calmer (15.05) 版本)</p>
<p>git clone -b barrier_breaker git://github.com/openwrt/openwrt.git</p>
<p>(openwrt 的 barrier_breaker (14.09) 版本)</p>
</blockquote>
<p>如果要像咱一样添加第三方软件(例如 Alljoyn)的话,用文字编辑器打开汝的 <code class="code">
feeds.conf</code>
(有可能是 <code class="code">
feeds.conf.default</code>
,记得编辑完保存成 <code class="code">
feeds.conf</code>
),加上适当的feed:</p>
<p>(咱还是用 Alljoyn 做例子呐~)</p>
<blockquote>
<p>src-git alljoyn <a class="reference external" href="https://git.allseenalliance.org/gerrit/core/openwrt_feed;barrier_breaker">https://git.allseenalliance.org/gerrit/core/openwrt_feed;barrier_breaker</a></p>
<p>(因为咱是 barrier_breaker 啦,官方还支持 Attitude Adjustment 和 12.09,像下面那样)</p>
<p>src-git alljoyn <a class="reference external" href="https://git.allseenalliance.org/gerrit/core/openwrt_feed;attitude_adjustment">https://git.allseenalliance.org/gerrit/core/openwrt_feed;attitude_adjustment</a></p>
<p>(Attitude Adjustment)</p>
<p>src-git alljoyn <a class="reference external" href="https://git.allseenalliance.org/gerrit/core/openwrt_feed;openwrt_12.09">https://git.allseenalliance.org/gerrit/core/openwrt_feed;openwrt_12.09</a></p>
<p>(official OpenWrt v12.09 tagged release)</p>
</blockquote>
<p>记住按汝自己的版本选择一个添加进去就好😂</p>
<p>然后更新 feeds 列表:</p>
<blockquote>
<p>./scripts/feeds update -a</p>
<p>PS: 有拉黑过 Wosign 和 StartCom 证书的用户会在 clone Alljoyn 仓库时遇到证书错误,像这样😂:</p>
<blockquote>
fatal: unable to access '<a class="reference external" href="https://git.allseenalliance.org/gerrit/core/openwrt_feed/">https://git.allseenalliance.org/gerrit/core/openwrt_feed/</a>':
SSL certificate problem: unable to get local issuer certificate</blockquote>
<p>( Linux Foundation 竟然没用自己赞助的 Let's Encrypt 😹)</p>
<p>所以只好委曲求全先让 git 对证书错误睁一只眼闭一只眼吧 😿:</p>
<blockquote>
<p>export GIT_SSL_NO_VERIFY=true</p>
<p>./scripts/feeds update -a</p>
<p>unset GIT_SSL_NO_VERIFY</p>
</blockquote>
</blockquote>
<p>然后安装需要的包,安装以后稍后的 <code class="code">
make menuconfig</code>
中就可以见到了 😂</p>
<blockquote>
<p>./scripts/feeds install {package_name}</p>
<p>要偷懒的话可以先全装上 😂</p>
<p>./scripts/feeds install -a</p>
<p>和咱一样要装 Alljoyn 的就再这样 😂😂</p>
<p>./scripts/feeds install -a -p alljoyn</p>
</blockquote>
</div>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id8">第三步:设置编译选项</a></h2>
<p>(咱不知道 menuconfig 怎么说😂)</p>
<p>接下来运行 <code class="code">
make menuconfig</code>
打开设置界面:</p>
<img alt="大概像这个样子😂" class="materialboxed responsive-img" src="/images/openwrt/menuconfig.png"/>
<p>⬆️大概像这个样子,自己编译过 Linux 内核的话应该不会陌生吧😂</p>
<p>然而选项太多所以还是需要自己选择 😂</p>
<ul>
<li><p class="first">Target System 选择成汝路由器的平台,这个可以在 <a class="reference external" href="https://wiki.openwrt.org/toh/start">https://wiki.openwrt.org/toh/start</a> 的每个型号的 TechData 中找到。</p>
</li>
<li><p class="first">Target Profile 选择汝路由器的型号,或者保留默认的 Default Profile (all drivers) 选项,不过这会生成所有设备的映像😂</p>
<blockquote>
<p>对于选择的选项:</p>
<blockquote>
<p>[*] built-in ,表示这项功能内置在生成的映像中(小心映像空间爆炸装不上😂)</p>
<p>[ ] excluded ,就是不含啦😂</p>
<p><M> module ,这项功能会在编译时生成将来能通过 opkg 安装的软件包呗~</p>
<p>< > module capable (😂,这啥……)</p>
</blockquote>
<p>和咱一样要装 Alljoyn 的话,Alljoyn 在 Network 一节里。</p>
</blockquote>
</li>
</ul>
<p>编辑完成以后就用下边的 Save 选项保存呗~</p>
<blockquote>
<p>*** End of the configuration.</p>
<p>*** Execute 'make' to start the build or try 'make help'.</p>
</blockquote>
<p>应该会有这么两行😂</p>
</div>
<div class="section" id="id4">
<h2><a class="toc-backref" href="#id9">第四步:开始编译</a></h2>
<p>接下来就开始编译呗:</p>
<blockquote>
make</blockquote>
<p>或者后台编译:</p>
<blockquote>
ionice -c 3 nice -n19 make -j 2</blockquote>
<p>或者打开喋喋不休模式😂:</p>
<blockquote>
make V=s</blockquote>
<p>然后可以洗洗睡了(雾😹</p>
<hr class="docutils"/>
<p><del>转天早上醒来如果没出错的话就能在 <buildroot_dir>/bin ( <buildroot_dir> 换成汝 OpenWrt 目录的文件夹)</buildroot_dir></buildroot_dir></del>
<del>看到生成的映像了呗~</del></p>
</div>
#archlinux-cn 活动手册(?)2016-11-22T00:00:00+08:002016-11-22T00:00:00+08:00ホロtag:None,2016-11-22:/arch-linux/archlinux_cn_channel_guide.html
<p>Arch Linux 中文社区聊天频道 #archlinux-cn <del>伪</del> 活动手册 😋</p>
<p><del>话说又一个月啥也没写了啊……果然不够才思泉涌……</del></p>
<p>最近 #archlinux-cn 的新人越来越多了呐~ <del>(这不是很好么,咱就不愁没的吃了是呗~)</del> 😋</p>
<p>于是为了 <ruby><rb>帮助新人</rb><rp>(</rp><rt>凑数</rt><rp>)</rp></ruby> 这篇文章就出炉啦 😂</p>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id5">前言</a></h2>
<p>如果还不知道 Arch Linux 中文社区是啥的话……😋</p>
<p>去看看这个呗
<a class="reference external" href="https://blog.yoitsu.moe/arch-linux/life/archlinux_cn_community_unoffical_newbie_guide.html">Arch Linux 中文社区非官方生存手册</a></p>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id6">各个接入点</a></h2>
<blockquote>
<del>我们的同志遍布五湖四海,甚至打入了某些组织的内部……</del></blockquote>
<p>简单说就是连接到 Arch Linux 中文社区聊天频道的方法有很多啦……</p>
<ul>
<li><p class="first">IRC</p>
<blockquote>
<p>IRC(Internet Relay Chat的缩写,“因特网中继聊天”)是一种通过网络的即时聊天方式。
其主要用于群体聊天,但同样也可以用于个人对个人的聊天。</p>
<p>就是 <a class="reference external" href="//webchat.freenode.net/?channels=archlinux-cn">#archlinux-cn</a> 啦~</p>
<p>直接戳上面的链接会打开 freenode 的 webchat 界面 …</p></blockquote></li></ul></div>
<p>Arch Linux 中文社区聊天频道 #archlinux-cn <del>伪</del> 活动手册 😋</p>
<p><del>话说又一个月啥也没写了啊……果然不够才思泉涌……</del></p>
<p>最近 #archlinux-cn 的新人越来越多了呐~ <del>(这不是很好么,咱就不愁没的吃了是呗~)</del> 😋</p>
<p>于是为了 <ruby><rb>帮助新人</rb><rp>(</rp><rt>凑数</rt><rp>)</rp></ruby> 这篇文章就出炉啦 😂</p>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id5">前言</a></h2>
<p>如果还不知道 Arch Linux 中文社区是啥的话……😋</p>
<p>去看看这个呗
<a class="reference external" href="https://blog.yoitsu.moe/arch-linux/life/archlinux_cn_community_unoffical_newbie_guide.html">Arch Linux 中文社区非官方生存手册</a></p>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id6">各个接入点</a></h2>
<blockquote>
<del>我们的同志遍布五湖四海,甚至打入了某些组织的内部……</del></blockquote>
<p>简单说就是连接到 Arch Linux 中文社区聊天频道的方法有很多啦……</p>
<ul>
<li><p class="first">IRC</p>
<blockquote>
<p>IRC(Internet Relay Chat的缩写,“因特网中继聊天”)是一种通过网络的即时聊天方式。
其主要用于群体聊天,但同样也可以用于个人对个人的聊天。</p>
<p>就是 <a class="reference external" href="//webchat.freenode.net/?channels=archlinux-cn">#archlinux-cn</a> 啦~</p>
<p>直接戳上面的链接会打开 freenode 的 webchat 界面,
输入昵称然后完成Google 的 NoCaptcha 验证后,点击连接(Connect)就可以进入本IRC频道啦~</p>
<p>正在使用某种 IRC 客户端的话参阅汝所使用的 IRC 客户端的文档在 irc.freenode.net 上加入
#archlinux-cn 就可以啦~</p>
<p>想进一步了解 IRC 的使用方法的话推荐下维基百科的教程呗:</p>
<p><a class="reference external" href="https://zh.wikipedia.org/wiki/Wikipedia:IRC%E6%95%99%E7%A8%8B">Wikipedia:IRC教程</a></p>
</blockquote>
</li>
<li><p class="first">XMPP</p>
<blockquote>
<p>XMPP(Extensible Messaging and Presence Protocol,前称Jabber)
是一种以XML为基础的开放式即时通讯协定,是经由网际网路工程工作小组(IETF)通过的网际网路标准。</p>
<p>习惯 XMPP 的用户可以添加 <a class="reference external" href="mailto:talk@archlinuxcn.org">talk@archlinuxcn.org</a> 为联系人,成功添加以后会收到一条消息呗~</p>
<blockquote>
<p><a class="reference external" href="mailto:talk@archlinuxcn.org">talk@archlinuxcn.org</a>: 欢迎加入 Arch Linux 中文 XMPP 群!</p>
<p>注意!非Arch系统的问题请提前声明系统</p>
<p>你的昵称默认为「<这里应该是个随机昵称然而咱不记得是啥了……>」,
使用「-nick 新昵称」来修改。</p>
</blockquote>
<p>设置一个新昵称然后打下招呼吧 😄</p>
</blockquote>
</li>
<li><p class="first">Telegram</p>
<blockquote>
<p>Telegram Messenger 是一个跨平台的即时通讯软件,它的客户端是自由及开放源代码软件,
但是它的服务器是专有软件。</p>
<p>使用者可以相互交换加密与自解构的讯息,以及相片、影片、文件,支援所有的档案类型。</p>
<p>官方提供移动端(Android、iOS、Windows Phone)、
桌面端(Windows、macOS、Linux)和网页端(Web version)应用;</p>
<p>同时官方开放应用程序接口,因此会有一些第三方的客户端。</p>
<p>后来为了防止破坏 Telegram 的群链接就取消啦,所以先用其它的方法进入频道,
把自己的 Telegram Username 告诉其它人,再让已经在 Telegram 群里的人邀请呗~</p>
</blockquote>
</li>
<li><p class="first">Gitter</p>
<blockquote>
<p>用 Github 或者 Twitter 账户登录,然后加入
<a class="reference external" href="https://gitter.im/archlinuxcn/generic">https://gitter.im/archlinuxcn/generic</a> 这个聊天室呗~</p>
</blockquote>
</li>
<li><p class="first">Martix</p>
<blockquote>
<p>用汝自己的 Martix 客户端 (比较常见的是以前叫做 vector 的 Riot)添加
#freenode_#archlinux-cn:matrix.org
这个房间就可以啦~</p>
</blockquote>
</li>
</ul>
</div>
<div class="section" id="topic">
<h2><a class="toc-backref" href="#id7">熟读 topic 确保人身安全 (雾 😂</a></h2>
<p>Topic set by farseerfc
(<a class="reference external" href="mailto:~farseerfc@archlinux/tu/farseerfc">~farseerfc@archlinux/tu/farseerfc</a>) on Fri, 04 Nov 2016 21:11:36</p>
<p>Arch Linux 欢迎喵 *^-^* | <del>卖萌</del></p>
<p>不是 arch 请事先声明发行版 | 因为大家默认都是 Arch 😂 另外衍生发行版也要明确</p>
<p>ttf-dejavu 注意新闻 | FFmpeg 3.1.1 | 中间大概会插两行官网的新闻和新的软件包</p>
<p><a class="reference external" href="https://wiki.archlinux.org">https://wiki.archlinux.org</a> | ArchWiki</p>
<p><a class="reference external" href="https://bbs.archlinuxcn.org">https://bbs.archlinuxcn.org</a> | 中文论坛</p>
<p><a class="reference external" href="https://github.com/archlinuxcn">https://github.com/archlinuxcn</a> | 中文社区软件仓库</p>
<p>长文 <a class="reference external" href="https://cfp.vim-cn.com">https://cfp.vim-cn.com</a> | 因为 IRC 没断行于是直接贴长文会刷屏😂,用法见那个网站</p>
<p>贴图 <a class="reference external" href="https://img.vim-cn.com">https://img.vim-cn.com</a> | 😂 如果用 Telegram 或者 Martix 的话可以直接发图,传话机器人能完成转换</p>
<p>不要对着 teleboto xmppbot 说话,它们都是桥接机器人,人类的名字在它们后面 | 桥接机器人就是打通各个聊天软件的机器人啦~ 😋</p>
</div>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id8">机器人列表</a></h2>
<p>除了上面说的桥接机器人以外,目前待命中的机器人还有(括号里是操作者的名字):</p>
<p>具体的功能还是各位慢慢发掘呗~</p>
<ul class="simple">
<li>xmppbot 里的 Lisa ( lilydjwg )</li>
<li>varia ( gauge )</li>
<li>labots ( lastavengers )</li>
<li>Horobot ( FiveYellowMice )</li>
<li>MoBot ( Youmu )</li>
</ul>
</div>
<div class="section" id="id4">
<h2><a class="toc-backref" href="#id9">分支频道</a></h2>
<ul class="simple">
<li><a class="reference external" href="//webchat.freenode.net/?channels=archlinux-cn-offtopic">#archlinux-cn-offtopic</a> ,计划中的水群频道,然而一直没实现 😂</li>
</ul>
<hr class="docutils"/>
<p>说好的 FAQ 呢 (╯‵_′)╯ ┻━┻ ??</p>
</div>
Windows Subsystem for Linux + Arch Linux2016-10-04T00:00:00+08:002016-10-04T00:00:00+08:00ホロtag:None,2016-10-04:/arch-linux/wsl_with_arch_linux.html
<p>把 Bash on Ubuntu on Windows 上的 Ubuntu 换成 Arch Linux 😋</p>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id4">这啥?😂</a></h2>
<p>从 Windows 10 Insider Preview 开始,加入了 Windows Subsystem for Linux (适用于 Linux 的 Windows 子系统) 功能.</p>
<p>Windows Subsystem for Linux(简称WSL)是一个为在Windows 10上能够原生运行 Linux 二进制可执行文件(ELF 格式)的兼容层。
它是由微软与 Canonical 公司合作开发,目标是使纯正的 Ubuntu Trusty Tahr映像能下载和解压到用户的本地计算机,并且映像内的工具和实用工具能在此子系统上原生运行。</p>
<p>WSL提供了一个微软开发的 …</p></div>
<p>把 Bash on Ubuntu on Windows 上的 Ubuntu 换成 Arch Linux 😋</p>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id4">这啥?😂</a></h2>
<p>从 Windows 10 Insider Preview 开始,加入了 Windows Subsystem for Linux (适用于 Linux 的 Windows 子系统) 功能.</p>
<p>Windows Subsystem for Linux(简称WSL)是一个为在Windows 10上能够原生运行 Linux 二进制可执行文件(ELF 格式)的兼容层。
它是由微软与 Canonical 公司合作开发,目标是使纯正的 Ubuntu Trusty Tahr映像能下载和解压到用户的本地计算机,并且映像内的工具和实用工具能在此子系统上原生运行。</p>
<p>WSL提供了一个微软开发的 Linux 兼容内核接口(不包含Linux代码),来自 Ubuntu 的用户模式二进制文件在其上运行</p>
<p>WSL 的具体应用就是 Bash on Ubuntu on Windows 啦,在 Windows 上实现了一个 Ubuntu 子系统。</p>
<p>和常见的 Windows 上运行 Linux 的一系列方法相比:</p>
<ul class="simple">
<li>相比虚拟机,不必运行整个系统,相应减少了资源占用(当然不保证提高编译效率🌚</li>
<li>相比 Cygwin,Msys2 一类的解决方案,运行在 Ubuntu 上的软件(可能)不需要重新编译就能在 Bash on Ubuntu on Windows 上使用,也能使用 Ubuntu 软件仓库提供的软件包</li>
<li>……</li>
</ul>
<p>听起来是不是很诱人啊😋</p>
<p>然而……
------------------------------‘</p>
<p>上面的子系统是 Ubuntu…… (╯•̀-•́)╯ ┻━┻</p>
<p>上面的子系统是 Ubuntu…… (╯・﹏・)╯ ┻━┻</p>
<p>上面的子系统是 Ubuntu…… (╯@△@)╯ ┻━┻</p>
<p><del>重要的事情说三遍</del> 😂😂</p>
<p>于是把里面的 Ubuntu 换成其它系统的想法就应运而生了……</p>
<p>其实已经有人这么做过了虽然并不完美 😂:
<a class="reference external" href="https://github.com/Microsoft/BashOnWindows/issues/992">https://github.com/Microsoft/BashOnWindows/issues/992</a></p>
<p>直到最近 Insider Preview 更新到 14396,终于实现了 chroot 系统调用
( <a class="reference external" href="https://msdn.microsoft.com/en-us/commandline/wsl/release_notes">-> Change Log</a> ),
才使得在 WSL 上运行其它发行版的可用性更近了一步😂</p>
<p>作为现 Arch Linux 用户,当然想在 WSL 上运行 Arch Linux 啦😋</p>
<blockquote>
在好多年之后,不光 bash 换成了 wsl,系统也放在了一些更难发现的地方里,所以下面的方法不一定还能用了…… Microsoft 官方也建议用 DistroLauncher 生成自定义发行版了。</blockquote>
</div>
<hr class="docutils"/>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id5">开工 😏</a></h2>
<p>首先得首先是要把 Bash on Ubuntu on Windows 装上 😂</p>
<blockquote>
<ul class="simple">
<li>更新到最新的 Windows 10 Insider Preview (现在是 14396.1000 )</li>
<li>从”设置-更新与恢复-适用于开发人员“中把开发人员模式打开。</li>
<li>从”控制面板-程序和功能-启用或关闭 Windows 功能“中打开”适用于 Linux 的 Windows 子系统“</li>
<li>重新启动,打开命令提示符或者 Windows PowerShell ,输入 bash 回车然后按提示完成安装……</li>
</ul>
</blockquote>
<p>首先需要一个现成的 Arch Linux ,在上面用 arch-install-scripts 装好一个新的 Arch Linux,然后打包成 Tarball。</p>
<p>然后进入 Bash on Ubuntu on Windows ,把刚刚的 Tarball 解开到某个位置。</p>
<blockquote>
<p>如果汝手边没有可用的 Linux 系统的话,也可以试试 ArchISO 的 rootfs:</p>
<ul class="simple">
<li>从 ArchISO 中提取出 /arch/x86_64/airoot.sfs 文件放在 Bash on Ubuntu on Windows 能读取的目录下,然后复制/移动到能写入的目录。</li>
<li>安装 squashfs-tools ,然后以 root 用户运行 <code class="code">
unsquashfs airoot.sfs</code>
,把 ArchISO 的 Live 系统提取出来。</li>
</ul>
</blockquote>
<p>然后把 Bash 窗口关掉,到 C:\Users\<这是汝的用户名>\AppData\Local\Lxss 文件夹中。</p>
<blockquote>
这个文件夹可能在文件资源管理器里看不到咧?可以选择在文件夹选项
中把“隐藏受保护的操作系统文件”选项取消,或者直接在导航栏输入路径打开。</blockquote>
<p>rootfs 文件夹就是 Bash 中的 / 啦,从里面找到刚解压出来的 tarball 的文件夹放在 lxss 目录下。</p>
<p>把原来的 rootfs 文件夹重命名一下,再把刚解压出来的 tarball 的文件夹重命名为rootfs。</p>
<p>打开命令提示符或者 Windows PowerShell ,<del>输入 bash</del> 等等先别着急打开 bash ,
先用 <code class="code">
lxrun /setdefaultuser root</code>
把默认的用户换成root
(或者其它已经在 tarball 的 /etc/passwd 里的用户,例如 AOSC 的 tarball 里默认还会有一个 aosc 用户)</p>
<p>然后再打开 bash ,Duang~</p>
<img alt="WSL with Arch Linux" class="materialboxed responsive-img" src="/images/WSL_Arch/1.png"/>
<p>那个 screenfetch 是咱后来装的 😂</p>
</div>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id6">现在还有点小问题 😂</a></h2>
<p>fakeroot 在 WSL 里有点问题(可是咱忘了记下来日志了觉得咱自己好菜啊),只好写个假的 fakeroot 糊弄过去 😂:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="ch">#!/bin/bash</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="k">if</span> <span class="o">[</span> <span class="s2">"</span><span class="nv">$1</span><span class="s2">"</span> <span class="o">=</span> <span class="s2">"-v"</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span></span>
<span class="code-line"> <span class="nb">echo</span> <span class="m">1</span>.0</span>
<span class="code-line"> <span class="nb">exit</span></span>
<span class="code-line"><span class="k">fi</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="nb">export</span> <span class="nv">FAKEROOTKEY</span><span class="o">=</span><span class="m">1</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="nb">exec</span> <span class="s2">"</span><span class="nv">$@</span><span class="s2">"</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="nb">unset</span> FAKEROOTKEY</span>
</pre></div>
<p>现在记得在 /etc/pacman.conf 里忽略 fakeroot 包 _(:з」∠)_</p>
<p>按 <a class="reference external" href="https://msdn.microsoft.com/en-us/commandline/wsl/release_notes">WSL 的 Change Log</a> ,现在最新的 Build 14396
会在某些 Socket 连接(例如 ssh / X )时蓝屏报错 “ATTEMPTED EXECUTE OF NOEXECUTE MEMORY” ,这个只能等他们修复了_(:з」∠)_</p>
<!-- ……
不知道说什么好。
还是不知道该说啥。
算啦,谁何尝不是另一个人世界中的过客,
少了咱一个又怎么样。
嗯…… -->
</div>
从零开始的 GnuPG 学习笔记 [1] - 创建密钥对2016-09-29T00:00:00+08:002016-09-29T00:00:00+08:00ホロtag:None,2016-09-29:/security/gpg_from_zero_1.html<!-- PELICAN_BEGIN_SUMMAY -->
<p>在 GNU/Linux 上用 gpg 创建自己的密钥对~</p>
<p>对于 Windows 用户,可以试试 <a class="reference external" href="https://www.gpg4win.org/">Gpg4win</a> ,
Gpg4win 提供了一套 Windows 下可用的 GPG 解决方案.</p>
<p>Gpg4win内置的是 Kleopatra ,
<a class="reference external" href="https://docs.kde.org/stable/en/kdepim/kleopatra/index.html">官方文档在这</a> ,
其它人写的教程 Google 一下应该也找的到.</p>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id5">创建密钥对</a></h2>
<p>从终端中运行 <code class="code">
gpg --full-gen-key --expert</code>
:</p>
<blockquote>
<p>--full-gen-key 是使用完整的步骤创建密钥对.</p>
<p class="attribution">—expert 顾名思义就是 <del>砖</del> 专家模式啦,
例如可以选择更多种(例如新式的)加密方式呗~</p>
</blockquote>
<blockquote>
有些发行版可能会用 gpg2 来代表版本 2+ 的 gpg.</blockquote>
<div class="highlight"><pre><span class="code-line"><span></span>$ gpg --full-gen-key --expert</span>
<span class="code-line">gpg <span class="o">(</span>GnuPG<span class="o">)</span> <span class="m">2</span>.1 …</span></pre></div></div><!-- PELICAN_BEGIN_SUMMAY -->
<p>在 GNU/Linux 上用 gpg 创建自己的密钥对~</p>
<p>对于 Windows 用户,可以试试 <a class="reference external" href="https://www.gpg4win.org/">Gpg4win</a> ,
Gpg4win 提供了一套 Windows 下可用的 GPG 解决方案.</p>
<p>Gpg4win内置的是 Kleopatra ,
<a class="reference external" href="https://docs.kde.org/stable/en/kdepim/kleopatra/index.html">官方文档在这</a> ,
其它人写的教程 Google 一下应该也找的到.</p>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id5">创建密钥对</a></h2>
<p>从终端中运行 <code class="code">
gpg --full-gen-key --expert</code>
:</p>
<blockquote>
<p>--full-gen-key 是使用完整的步骤创建密钥对.</p>
<p class="attribution">—expert 顾名思义就是 <del>砖</del> 专家模式啦,
例如可以选择更多种(例如新式的)加密方式呗~</p>
</blockquote>
<blockquote>
有些发行版可能会用 gpg2 来代表版本 2+ 的 gpg.</blockquote>
<div class="highlight"><pre><span class="code-line"><span></span>$ gpg --full-gen-key --expert</span>
<span class="code-line">gpg <span class="o">(</span>GnuPG<span class="o">)</span> <span class="m">2</span>.1.15<span class="p">;</span> Copyright <span class="o">(</span>C<span class="o">)</span> <span class="m">2016</span> Free Software Foundation, Inc.</span>
<span class="code-line">This is free software: you are free to change and redistribute it.</span>
<span class="code-line">There is NO WARRANTY, to the extent permitted by law.</span>
<span class="code-line"></span>
<span class="code-line">请选择您要使用的密钥种类:</span>
<span class="code-line"> <span class="o">(</span><span class="m">1</span><span class="o">)</span> RSA and RSA <span class="o">(</span>default<span class="o">)</span></span>
<span class="code-line"> <span class="o">(</span><span class="m">2</span><span class="o">)</span> DSA and Elgamal</span>
<span class="code-line"> <span class="o">(</span><span class="m">3</span><span class="o">)</span> DSA <span class="o">(</span>仅用于签名<span class="o">)</span></span>
<span class="code-line"> <span class="o">(</span><span class="m">4</span><span class="o">)</span> RSA <span class="o">(</span>仅用于签名<span class="o">)</span></span>
<span class="code-line"> <span class="o">(</span><span class="m">7</span><span class="o">)</span> DSA <span class="o">(</span>自定义用途<span class="o">)</span></span>
<span class="code-line"> <span class="o">(</span><span class="m">8</span><span class="o">)</span> RSA <span class="o">(</span>自定义用途<span class="o">)</span></span>
<span class="code-line"> <span class="o">(</span><span class="m">9</span><span class="o">)</span> ECC and ECC</span>
<span class="code-line"> <span class="o">(</span><span class="m">10</span><span class="o">)</span> ECC <span class="o">(</span>sign only<span class="o">)</span></span>
<span class="code-line"> <span class="o">(</span><span class="m">11</span><span class="o">)</span> ECC <span class="o">(</span><span class="nb">set</span> your own capabilities<span class="o">)</span></span>
<span class="code-line">您的选择?</span>
</pre></div>
<p>可能汝和咱的有些不一样(因为 ECC 加密算法在 gpg 2.14 才开始支持).</p>
<p>ECC 又称椭圆曲线密码学,主要优势是在某些情况下
它比其他的方法使用更小的密钥——比如RSA加密算法——提供相当的或更高等级的安全。</p>
<p>不过有些地方还不能用这种新加密算法,这里示范咱就只用默认的 RSA 啦😂</p>
<p>输入密钥种类前面的数字(不带括号),然后确认.</p>
<div class="highlight"><pre><span class="code-line"><span></span>RSA 密钥长度应在 <span class="m">1024</span> 位与 <span class="m">4096</span> 位之间。</span>
<span class="code-line">您想要用多大的密钥尺寸?<span class="o">(</span><span class="m">2048</span><span class="o">)</span></span>
</pre></div>
<p>在这里设置一个密钥长度,默认的长度应该足够安全了.如果有需要,也可以增加.</p>
<div class="highlight"><pre><span class="code-line"><span></span>RSA 密钥长度应在 <span class="m">1024</span> 位与 <span class="m">4096</span> 位之间。</span>
<span class="code-line">What keysize <span class="k">do</span> you want <span class="k">for</span> the subkey? <span class="o">(</span><span class="m">2048</span><span class="o">)</span></span>
</pre></div>
<p>然后为子密钥设置密钥长度.</p>
<blockquote>
<p>是不是想问啥是子密钥 (subkey) ?</p>
<p>一个密钥对下可以添加不同的子密钥,这样做的好处有啥咧?</p>
<ul class="simple">
<li>区分目的:例如一个子密钥用于加密,另一个子密钥用于电子邮件签名等等......</li>
<li>区分设备:比如某些安全性稍差的设备(例如手机),汝可以只把一对专用的子密钥放到里面.</li>
<li>保护主密钥:如果子密钥泄漏,只要吊销相应的子密钥就好,而主密钥依然安全~</li>
</ul>
</blockquote>
<div class="highlight"><pre><span class="code-line"><span></span>请设定这把密钥的有效期限。</span>
<span class="code-line"> <span class="nv">0</span> <span class="o">=</span> 密钥永不过期</span>
<span class="code-line"> <n> <span class="o">=</span> 密钥在 n 天后过期</span>
<span class="code-line"> <n>w <span class="o">=</span> 密钥在 n 周后过期</span>
<span class="code-line"> <n>m <span class="o">=</span> 密钥在 n 月后过期</span>
<span class="code-line"> <n>y <span class="o">=</span> 密钥在 n 年后过期</span>
<span class="code-line">密钥的有效期限是?<span class="o">(</span><span class="m">0</span><span class="o">)</span></span>
</pre></div>
<p>接下来为密钥设置有效期啦~</p>
<p>不用担心密钥过期啦,因为在密钥过期前汝还是可以用 gpg --edit-key 命令来重新设置有效期呗~</p>
<p>设定完过期时间以后输入 y 确认.</p>
</div>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id6">标识密钥对</a></h2>
<div class="highlight"><pre><span class="code-line"><span></span>You need a user ID to identify your key<span class="p">;</span> the software constructs the user ID</span>
<span class="code-line">from the Real Name, Comment and Email Address in this form:</span>
<span class="code-line"> <span class="s2">"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"</span></span>
<span class="code-line"></span>
<span class="code-line">真实姓名:</span>
<span class="code-line">电子邮件地址:</span>
<span class="code-line">注释:</span>
</pre></div>
<p>在这里用姓名,电子邮件地址和注释标识这把密钥吧~</p>
<p>gpg 会用这些信息生成特定的用户 ID ,以后对密钥进行操作都需要用到用户 ID 呐~</p>
<div class="highlight"><pre><span class="code-line"><span></span>您选定了这个用户标识:</span>
<span class="code-line"> “ThisIsAName <span class="o">(</span>Comment<span class="o">)</span> <mailaddress@domain.tld>”</span>
<span class="code-line"></span>
<span class="code-line">更改姓名<span class="o">(</span>N<span class="o">)</span>、注释<span class="o">(</span>C<span class="o">)</span>、电子邮件地址<span class="o">(</span>E<span class="o">)</span>或确定<span class="o">(</span>O<span class="o">)</span>/退出<span class="o">(</span>Q<span class="o">)</span>?</span>
</pre></div>
<p>在输入完成之后会有一次确认的机会,觉得没问题就输入 O 继续吧~</p>
<p>接下来会弹出一个对话框,提示汝输入一个密码来保护私钥.至于如何创建一个强密码......</p>
<p>然后.....</p>
<blockquote>
我们需要生成大量的随机字节。这个时候您可以多做些琐事(像是敲打键盘、移动
鼠标、读写硬盘之类的),这会让随机数字发生器有更好的机会获得足够的熵数。</blockquote>
<p>于是随便做些啥吧~</p>
</div>
<div class="section" id="id4">
<h2><a class="toc-backref" href="#id7">完工啦~</a></h2>
<div class="highlight"><pre><span class="code-line"><span></span>gpg: 密钥 A4A7BA4D077C612F 被标记为绝对信任</span>
<span class="code-line">gpg: revocation certificate stored as</span>
<span class="code-line"><span class="s1">'/home/horo/.gnupg/openpgp-revocs.d/2A35F5ED3FB328E39DFADA2AA4A7BA4D077C612F.rev'</span></span>
<span class="code-line">公钥和私钥已经生成并经签名。</span>
<span class="code-line"></span>
<span class="code-line">pub rsa2048 <span class="m">2016</span>-09-29 <span class="o">[</span>SC<span class="o">]</span></span>
<span class="code-line"> 2A35F5ED3FB328E39DFADA2AA4A7BA4D077C612F</span>
<span class="code-line"> uid ThisIsAName <span class="o">(</span>Comment<span class="o">)</span> <mailaddress@domain.tld></span>
<span class="code-line"> sub rsa2048 <span class="m">2016</span>-09-29 <span class="o">[</span>E<span class="o">]</span></span>
</pre></div>
<p>这个时候就表示密钥生成好啦~</p>
<p>像 A4A7BA4D077C612F 这样的就是汝的用户 ID 啦,有时也会用到下面那个比较长的 ID.</p>
<p>同时会在 .gnupg/openpgp-revocs.d/ 文件夹下生成一份吊销证书,当汝因为某些原因
丢失了私钥或者怀疑密钥被窃时,可以用这个吊销证书来吊销汝的密钥.</p>
<p>这样一对密钥就创建好啦~,下次再细水长流密钥的应用咯 😂</p>
</div>
利用 CUPS 和 Samba 在 Arch Linux 和 Windows 间共享打印机2016-09-14T00:00:00+08:002016-09-14T00:00:00+08:00ホロtag:None,2016-09-14:/arch-linux/cups_sharing_printer.html
<p>社团新买的打印机到啦,于是就要设置一下呗~ 😋</p>
<div class="section" id="cups-samba">
<h2><a class="toc-backref" href="#id4">CUPS,Samba 都是些啥?</a></h2>
<blockquote>
<p>CUPS(以前为 Common Unix Printing System,UNIX 通用打印系统的缩写,但现无官方全名)
是一个类Unix操作系统的组合式印刷系统,允许一台电脑作为打印服务器。
CUPS接受一个客户端的电脑进程,并送到相应的打印机。</p>
<p>虽然有其他的打印程序包例如LPRNG,但CUPS是相当流行和相对容易使用的。
它是Arch linux及许多其他Linux发行版缺省的打印系统。</p>
<p class="attribution">—<a class="reference external" href="https://wiki.archlinux.org/index.php/CUPS_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)">ArchWiki:CUPS</a></p>
</blockquote>
<blockquote>
<p>Samba是一个用于局域网中的计算机间文件共享的软件,这么说您大概还摸不着头脑,那么网上邻居您听说过吧?
对,Samba就是干这个的。当年那个有点软公司设计了一套局域网计算机间的文件共享协议,
起名叫做SMB,就是Server Message Block的缩写。当时所有的Windows系统就都集成这种协议,
因此这个协议在局域网系统中的影响还比较大。后来,国际互联网,也就是Internet逐渐流行了起来,
有点软公司希望他们的这个协议能够一个用在Internet上,因此对其进行的整理,
更名为CIFS,也就是Common Internet File System。从名字可以看出,他们的期望是很高的
,不过实际呢……反正 …</p></blockquote></div>
<p>社团新买的打印机到啦,于是就要设置一下呗~ 😋</p>
<div class="section" id="cups-samba">
<h2><a class="toc-backref" href="#id4">CUPS,Samba 都是些啥?</a></h2>
<blockquote>
<p>CUPS(以前为 Common Unix Printing System,UNIX 通用打印系统的缩写,但现无官方全名)
是一个类Unix操作系统的组合式印刷系统,允许一台电脑作为打印服务器。
CUPS接受一个客户端的电脑进程,并送到相应的打印机。</p>
<p>虽然有其他的打印程序包例如LPRNG,但CUPS是相当流行和相对容易使用的。
它是Arch linux及许多其他Linux发行版缺省的打印系统。</p>
<p class="attribution">—<a class="reference external" href="https://wiki.archlinux.org/index.php/CUPS_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)">ArchWiki:CUPS</a></p>
</blockquote>
<blockquote>
<p>Samba是一个用于局域网中的计算机间文件共享的软件,这么说您大概还摸不着头脑,那么网上邻居您听说过吧?
对,Samba就是干这个的。当年那个有点软公司设计了一套局域网计算机间的文件共享协议,
起名叫做SMB,就是Server Message Block的缩写。当时所有的Windows系统就都集成这种协议,
因此这个协议在局域网系统中的影响还比较大。后来,国际互联网,也就是Internet逐渐流行了起来,
有点软公司希望他们的这个协议能够一个用在Internet上,因此对其进行的整理,
更名为CIFS,也就是Common Internet File System。从名字可以看出,他们的期望是很高的
,不过实际呢……反正,你现在用网上邻居上搜狐么?当然,不管怎样,CIFS或者说SMB协议在局域网中传输文件还是非常方便的。
当然,我们Linux系统之间也有很好的局域网共享文件的协议,叫做NFS,
网络文件系统的缩写。但无奈那该死的查皮不支持这个协议嘛,所以要想网络上的查皮和我之间能共享文件的话,
要么我这里有人能懂CIFS协议,要么查皮那里有软件能解析NFS协议。
然而毕竟还是我这里的软件大度一些,所以就有了用于支持SMB协议的软件——Samba。</p>
<p class="attribution">—<a class="reference external" href="http://forum.ubuntu.org.cn/viewtopic.php?f=112&t=162040">笨兔兔的故事 - Ubuntu中文论坛</a></p>
</blockquote>
</div>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id5">首先……😋</a></h2>
<p>在 Windows 上连接好打印机,安装上驱动,再通过“设备与打印机”共享这个打印机,Windows 上的设置就完成啦~</p>
<p>记得记下来 Windows 电脑的 IP 地址和打印机的名称,还有给共享打印机的账户设置个密码。</p>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id6">然后……😋😋</a></h2>
<p>打开汝的 Arch Linux ,先安装必要的软件包:</p>
<blockquote>
# pacman -S cups, ghostscript gsfonts samba</blockquote>
<p>然后激活并启动 CUPS 服务:</p>
<blockquote>
# systemctl enable org.cups.cupsd.service --now</blockquote>
<p>这个时候就可以通过 <a class="reference external" href="http://localhost:631">http://localhost:631</a> 访问到 CUPS 的 Web 界面啦~</p>
<img alt="CUPS Web 界面" class="materialboxed responsive-img" src="/images/cups_sharing_printer/-1.png"/>
</div>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id7">添加打印机 😋😋😋</a></h2>
<p>首先点击 "Administration" 打开管理界面:</p>
<img alt="CUPS Administration 界面" class="materialboxed responsive-img" src="/images/cups_sharing_printer/0.png"/>
<p>然后点击 "Add printer",这时会要求汝登录.咱只试过 root 登录能成功.....</p>
<img alt="登录到管理界面" class="materialboxed responsive-img" src="/images/cups_sharing_printer/1.png"/>
<p>接下来选择要连接到哪种打印机啦,连接 Windows 打印机就选择
"Windows Printer via SAMBA" (通过 Samba 连接 Windows 打印机) 呗~</p>
<img alt="选择一种协议" class="materialboxed responsive-img" src="/images/cups_sharing_printer/2.png"/>
<p>接下来输入打印机的 URI 啦,
对于 Windows 打印机 ,URI 大概像这样:</p>
<blockquote>
<code class="code">
smb://{用户名}:{密码}@{Windows 的 IP 地址}/{打印机名称}</code>
</blockquote>
<img alt="要连接到哪个打印机?" class="materialboxed responsive-img" src="/images/cups_sharing_printer/2b.png"/>
<p>接着用人类的语言描述一下这台打印机(例如名字和位置啦)~</p>
<img alt="描述这台打印机" class="materialboxed responsive-img" src="/images/cups_sharing_printer/3.png"/>
<p>然后依照打印机的品牌和型号选择适合的驱动程序呗:</p>
<blockquote>
<p>咱这台 Samsung M2070 的打印机要从三星的网站上下载驱动 _(:з」∠)_</p>
<p><a class="reference external" href="http://www.samsung.com/printersetup">http://www.samsung.com/printersetup</a></p>
</blockquote>
<img alt="选择打印机驱动程序" class="materialboxed responsive-img" src="/images/cups_sharing_printer/4.png"/>
<p>接着修改默认打印参数,保存,新的打印机就添加好啦~ 😋</p>
<img alt="修改默认打印参数" class="materialboxed responsive-img" src="/images/cups_sharing_printer/5.png"/>
<p>为了测试打印机,可以从 Maintaince 菜单中选择 “Print Test Page” 打印一张测试页试试 😋</p>
<img alt="Maintaince 菜单" class="materialboxed responsive-img" src="/images/cups_sharing_printer/6.png"/>
<p>还有记得添加汝自己成为可以使用打印机的用户:</p>
<img alt="Administration 菜单" class="materialboxed responsive-img" src="/images/cups_sharing_printer/7.png"/>
<img alt="添加允许使用打印机的用户" class="materialboxed responsive-img" src="/images/cups_sharing_printer/8.png"/>
<p>然后桌面环境下的程序应该可以看到打印机了啦~(例如 GNOME)</p>
<img alt="GNOME 下的打印机菜单" class="materialboxed responsive-img" src="/images/cups_sharing_printer/9.png"/>
<p>😋</p>
</div>
知乎自答两则2016-08-20T00:00:00+08:002016-08-20T00:00:00+08:00ホロtag:None,2016-08-20:/life/zhihu_answers.html
<p>学 <a class="reference external" href="/links.html#farseerfc">farseerfc</a> ,顺便测试一下咱写的 creatissue 脚本 😂😂</p>
<p>懒得加内文里的链接了呢~</p>
<div class="section" id="arch-linux">
<h2><a class="toc-backref" href="#id3">使用 Arch Linux 做桌面有何优势和注意事项?</a></h2>
<p><a class="reference external" href="https://www.zhihu.com/question/46322733/answer/101649684">https://www.zhihu.com/question/46322733/answer/101649684</a></p>
<p>既然是前 Debian Testing 用户,就认为汝有一定的 Linux 发行版使用经验呗~</p>
<p>顺便猜汝问的是“日常使用 Arch Linux”呗.</p>
<ol class="arabic simple">
<li>Arch Linux 有啥特性?</li>
</ol>
<p>其实 Arch Linux 和其它发行版一样就只是一个发行版呐~然而每一个发行版的生态不一样,
Arch 这边信奉的是以 “Keep It Simple, Stupid” 为核心的 Arch 之道啦。哦对了,还有一个名字叫做 Pacman …</p></div>
<p>学 <a class="reference external" href="/links.html#farseerfc">farseerfc</a> ,顺便测试一下咱写的 creatissue 脚本 😂😂</p>
<p>懒得加内文里的链接了呢~</p>
<div class="section" id="arch-linux">
<h2><a class="toc-backref" href="#id3">使用 Arch Linux 做桌面有何优势和注意事项?</a></h2>
<p><a class="reference external" href="https://www.zhihu.com/question/46322733/answer/101649684">https://www.zhihu.com/question/46322733/answer/101649684</a></p>
<p>既然是前 Debian Testing 用户,就认为汝有一定的 Linux 发行版使用经验呗~</p>
<p>顺便猜汝问的是“日常使用 Arch Linux”呗.</p>
<ol class="arabic simple">
<li>Arch Linux 有啥特性?</li>
</ol>
<p>其实 Arch Linux 和其它发行版一样就只是一个发行版呐~然而每一个发行版的生态不一样,
Arch 这边信奉的是以 “Keep It Simple, Stupid” 为核心的 Arch 之道啦。哦对了,还有一个名字叫做 Pacman 的软件包管理器。
滚动更新算不算是一个特性咧?</p>
<ol class="arabic simple" start="2">
<li>Arch Linux 的优势?</li>
</ol>
<p>应该是软件更新速度快和(更新时)比较稳定? (可以说都是拜 Arch 的滚动发行版属性所赐呗~)</p>
<p>还有比较完善的 Wiki ~</p>
<p>还有比较完善的 Wiki ~</p>
<p>还有比较完善的 Wiki ~
(重要的话说三遍2333)</p>
<p>Arch compared to other distributions (简体中文) 上有 Arch Linux 和几个发行版的比较,去看下呗~</p>
<ol class="arabic simple" start="3">
<li>安装 Arch Linux 要注意啥?</li>
</ol>
<p>Beginners' guide (简体中文) 和 Installation guide (简体中文) 都是非常好的参考来源呐~
按 wiki 的说法,前者适合新安装 Arch Linux 的用户,后者适合有经验的 Linux 用户呗。</p>
<ol class="arabic simple" start="4">
<li>使用 Arch Linux 时要注意啥?</li>
</ol>
<p>首先要学习如何使用 Arch Linux 的招牌(?) pacman 啦。
Pacman (简体中文) 上有些常用命令,如果汝有使用其它软件包管理器 (例如 Debian 里的 apt)的经验,可以看一下 Pacman/Rosetta ,
那里列出了几种不同的软件包管理器的不同命令的比较。</p>
<p>关于各种操作(例如安装各类软件,外观定制,系统维护等等) General recommendations 里有各种操作的索引,去看一下呗~</p>
<p>如果遇到了问题,ArchWiki ,Arch Linux Forums , Arch Linux 中文论坛 和 IRC channels (简体中文) 都是解决问题的合适的地方咯~ (当然要遵守各自的规则啦)</p>
<ol class="arabic simple" start="5">
<li>啥?有人说 Arch Linux 容易滚挂?</li>
</ol>
<p>到底是从啥时候开始有这个说法的</p>
<p>怎样才能尽量避免archlinux滚挂? - Arch Linux 这里的几个回答非常棒,咱就简单的总结一下呗~</p>
<p>System maintenance (简体中文) 有些系统维护的常见技巧。</p>
<p>大家都认为长期不更新的 Arch Linux 更容易挂……所以至少要记得定期更新一下系统吧~</p>
<p>订阅 Arch Linux 新闻 (邮件列表 arch-announce 或者RSS: <a class="reference external" href="https://www.archlinux.org/feeds/news/">https://www.archlinux.org/feeds/news/</a> )消息不是很频繁,一般是在有重大更新时会提醒大家。</p>
<p>不要在一无所知的情况下打开 [testing] 仓库。如果想打开的话,
Arch Linux TU 兼 Developer 成员 @晏然FelixYan 写了篇 Arch Linux [testing] 系列仓库简介 可以参考。</p>
<p>有时 pacman 会提示生成了一些 .pacnew 文件,这是为了避免覆盖一个之前被修改过的已存在文件呐
,汝最好在更新完毕以后马上合并这些改动啦~(如果不处理,不当的配置可能导致软件功能出问题,甚至完全无法使用。)</p>
<p>不要使用某些 pacman 命令 (例如 --force,但是官方发通告要求这样做时除外~)</p>
<p>最后,手边最好准备一个 Live 环境(万一一不小心把系统搞挂了……)</p>
<ol class="arabic simple" start="6">
<li>最后……</li>
</ol>
<p>每个人都可以为 Arch Linux 贡献自己的一分力量,如果汝有意愿的话, wiki 上的 Getting involved 页面有各种贡献的途径呐~</p>
<p>还有一件事…… 欢迎来 Arch Linux 中文社区玩!
( IRC 频道 #archlinux-cn @ freenode 是中心,同时还有 Telegram , XMPP,Tox 和 Gitter 多平台联通,可能是第二水的 IRC 中文频道?)
其他平台的加入方式在 IRC 上问问其他人就好啦~</p>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id4">Arch Linux的用户都有理想主义倾向吗?</a></h2>
<p><a class="reference external" href="https://www.zhihu.com/question/49439472/answer/116599094">https://www.zhihu.com/question/49439472/answer/116599094</a></p>
<p>(话说知乎啥时候能内置水平线标记……)</p>
<p>其实不止 Arch Linux ,几大主流发行版不都是一群有着相同理想主义倾向的用户/开发者们一手构建起来的呗~</p>
<p>Debian :以创建一个自由的类 Unix 操作系统为己任,大部分尽可能的采用自由软件
(后来从 Debian 衍生出的完全自由的发行版 gNewSense 获得了自由软件基金会的赞助 )。</p>
<p>Fedora :和 Debian 同样更多的专注于自由软件。和 Debian 偏向稳定不同,
Fedora 的开发者更多的会和上游紧密协作,尽可能的快速推动新技术的应用和完善。</p>
<p>openSUSE:这个咱没用过,只知道他/她/它们做了个很出色的系统配置工具 YaST ,
还有能给 openSUSE 和其他各种发行版构建软件包的 Open Build Service (OBS)。
至于 openSUSE 为啥没有其它发行版那么流行的原因,活跃于 openSUSE 社区的苏姐的回答应该解释的比较全面 :
openSUSE 的人气为何远不如 Ubuntu 和 Fedora ? - 瑪麗蘇的回答</p>
<p>Gentoo:应该是除了 LFS (Linux From Scratch)以外定制程度最高的 Linux 发行版,
用户可以自由的选择自己喜欢的组件,无论是安装方式,需要的程序,
以至于init 程序( Gentoo 是目前为数不多的不默认采用 Systemd 的 Linux 发行版之一)。
许多用户喜欢的就是 Gentoo 的高度可定制性,
例如 长期使用Arch,Gentoo等滚动更新的发行版是怎样的一种体验? - 李小的回答 和
长期使用Arch,Gentoo等滚动更新的发行版是怎样的一种体验? - ZX Huo 的回答 。</p>
<p>Arch Linux:自称 " a lightweight and flexible Linux® distribution that tries to Keep It Simple." ,
一个轻量化,可定制,试图遵循 KISS 原则 ( Keep It Simple, Stupid,对应中文为“保持简单,且一目了然”)的 Linux 发行版。
简洁,现代,实用和以用户为中心构成了 Arch Linux 用户和开发者们一贯共识的 “Arch 之道”(Arch Linux - ArchWiki)</p>
<p>(Ubuntu ?那是啥,好吃吗?啦啦啦……)</p>
<p>关于 Arch Linux 的可定制性,现任 Trusted User 之一的 fc farseer 这么写到:</p>
<blockquote>
<p>我自己用 Ubuntu 從 8.04 經歷多次版本升級升到 12.04 ,期間雙系統裝裹 OpenSuSE 和Arch ,
然後在 OpenSuSE 上完成了畢業設計(那時候只有suse提供了Xen補丁內核,這是我的畢業設計需要),
之後本科畢業後新臺機直接裝 Arch,現在3年多了一切穩定完好。這 3 年多我經歷了 Arch 從 rc.conf 到 systemd 的轉變,
經歷了 grub legacy 到 grub 2 的轉變,換過好幾個 DE 和 WM 然後現在穩定在 Awesome3.4 兩年多,
系統分區從原本的 ext4 換到過 btrfs 分區然後現在組 btrfs raid1 ,我換過顯卡,換過好幾塊硬盤,
期間滾掛過好幾次然後都修好了,自己作死折騰btrfs壞過也從備份中恢復好了。重要的是這個系統一直活着而且活得很好,
pacman.log裏的裝機歷史能一直追溯到3年前裝的第一個包,我知道這裏面只有我需要的包,
只有我做過的配置,發生任何問題我都知道是系統的哪裏的問題。這是 Arch給我的安心感,
是Ubuntu不能給我的。反觀我用Ubuntu的那段時間,每次 dist-upgrade 都要麼立刻掛掉要麼用一段時間掛掉,
要麼就是升級的方案實在太將就然後換新的重裝。都說 debian穩定ubuntu穩定,
而那時的我沒有任何穩定的感覺,那時的我害怕每一個小包的升級,因爲我不知道升級了一個包之後會對別的包造成什麼不可預知的後果。
服務器系統那種有管理員管理的計算機集羣需要的穩定性,和桌面用戶需要的穩定性,在我看來是不同的概念。
我不怕一個升級之後東西壞掉然後需要我花兩個小時找方案把它修好,
但是我怕爲了某個新版本的庫而不得不升級的時候,
整個系統都變得面目全非導致我不得不花兩個小時重裝系統,然後這個全新的系統我不再認識了。</p>
<p class="attribution">—长期使用Arch,Gentoo等滚动更新的发行版是怎样的一种体验? - fc farseer 的回答</p>
</blockquote>
<p>所以嘛,既然选择了滚动更新的发行版,就要学会适应这种快速的变化呗~</p>
<p>另外还有一句,Arch Linux 的滚动更新模型是不支持部分升级的。</p>
<p><a class="reference external" href="https://wiki.archlinux.org/index.php/System_maintenance#Partial_upgrades_are_unsupported">https://wiki.archlinux.org/index.php/System_maintenance#Partial_upgrades_are_unsupported</a></p>
<p>还有,Archer 哪里说要秒杀各大软件公司了啦 ?明明咱们连有多少用户都不怎么在意:</p>
<blockquote>
<p>许多 Linux 发行版都试图变得更“用户友好”,Arch Linux 则一直是,永远会是“以用户为中心”。
此发行版是为了满足贡献者的需求,而不是为了吸引尽可能多的用户。
Arch 适用于乐于自己动手的用户,他们愿意花时间阅读文档,解决自己的问题。</p>
<p>报告问题、完善 Wiki 社区文档、为其它用户提供技术支持。
Arch 用户仓库 收集用户贡献的软件包。Arch 开发者都是志愿者,活跃的贡献者很快就能称为开发人员。</p>
</blockquote>
<p>不要以偏概全好不好……</p>
</div>
从零开始的 GnuPG 学习笔记 [0] - PGP,GPG 等相关概念扫盲2016-08-06T00:00:00+08:002016-08-06T00:00:00+08:00ホロtag:None,2016-08-06:/security/gpg_from_zero_0.html<!-- PELICAN_BEGIN_SUMMAY -->
<p>GnuPG 密钥从创建到注销,顺便丢一只雷姆 (雾 <a class="footnote-reference" href="#id2" id="id1">[1]</a></p>
<table class="stripped docutils footnote highlight black-text white" frame="void" id="id2" rules="none">
<colgroup><col class="label"/><col/></colgroup>
<tbody valign="top">
<tr><td class="label"><a class="fn-backref" href="#id1">[1]</a></td><td>雷姆(レム/Rem)是动画 「Re:从零开始的异世界生活 」(日文:Re:ゼロから始める異世界生活)的角色之一。</td></tr>
</tbody>
</table>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id4">为啥需要密码学技术?</a></h2>
<blockquote>
<p>对于计算机的使用后果,没人比乔治·奥威尔在《1984》中的预言错得更离谱了。到目前为止,计算机创造的几乎所有实际的可能性空间都表明,计算机是权威的终结而非权威的开始。</p>
<p class="attribution">—《失控》</p>
</blockquote>
<p>在计算机和互联网的领域,自由和开放大概是主流。那些试图管制和封闭互联网的方法几乎都失败了呗~</p>
<p>类似 <a class="reference external" href="https://www.torproject.org">Tor</a> ,<a class="reference external" href="https://geti2p.net">I2p</a> 一类的匿名网络访问工具正被无数人(可能汝也是其中之一😋)用来因为各种原因隐藏自己的身份。
而类似 <a class="reference external" href="https://zeronet.io/">ZeroNet</a> 的新兴软件更多的用到了 Bitorrent 一类的分布式技术。</p>
<p>而这些工具要如何安全的进行数据交换呢,就需要用到各种密码学技术了呐,
其实在上网的过程中,汝已经不知不觉的和各种密码学技术打交道了呢~</p>
<blockquote>
<ul class="simple">
<li>在浏览各种 <a class="reference external" href="https://">https://</a> 网站 (例如咱这里)时,汝的浏览器会和网站的服务器进行认证来保证汝要访问的服务器真的是这个网站所使用的服务器呐 …</li></ul></blockquote></div><!-- PELICAN_BEGIN_SUMMAY -->
<p>GnuPG 密钥从创建到注销,顺便丢一只雷姆 (雾 <a class="footnote-reference" href="#id2" id="id1">[1]</a></p>
<table class="stripped docutils footnote highlight black-text white" frame="void" id="id2" rules="none">
<colgroup><col class="label"/><col/></colgroup>
<tbody valign="top">
<tr><td class="label"><a class="fn-backref" href="#id1">[1]</a></td><td>雷姆(レム/Rem)是动画 「Re:从零开始的异世界生活 」(日文:Re:ゼロから始める異世界生活)的角色之一。</td></tr>
</tbody>
</table>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id4">为啥需要密码学技术?</a></h2>
<blockquote>
<p>对于计算机的使用后果,没人比乔治·奥威尔在《1984》中的预言错得更离谱了。到目前为止,计算机创造的几乎所有实际的可能性空间都表明,计算机是权威的终结而非权威的开始。</p>
<p class="attribution">—《失控》</p>
</blockquote>
<p>在计算机和互联网的领域,自由和开放大概是主流。那些试图管制和封闭互联网的方法几乎都失败了呗~</p>
<p>类似 <a class="reference external" href="https://www.torproject.org">Tor</a> ,<a class="reference external" href="https://geti2p.net">I2p</a> 一类的匿名网络访问工具正被无数人(可能汝也是其中之一😋)用来因为各种原因隐藏自己的身份。
而类似 <a class="reference external" href="https://zeronet.io/">ZeroNet</a> 的新兴软件更多的用到了 Bitorrent 一类的分布式技术。</p>
<p>而这些工具要如何安全的进行数据交换呢,就需要用到各种密码学技术了呐,
其实在上网的过程中,汝已经不知不觉的和各种密码学技术打交道了呢~</p>
<blockquote>
<ul class="simple">
<li>在浏览各种 <a class="reference external" href="https://">https://</a> 网站 (例如咱这里)时,汝的浏览器会和网站的服务器进行认证来保证汝要访问的服务器真的是这个网站所使用的服务器呐~</li>
<li>在登录到各类网络服务时,总不能明文(就是按原样)传输汝的个人信息(其中可能会有汝的密码哦)吧?这时就需要客户端和服务器约定一种相互理解的方法来加密/解密各类数据呗~</li>
<li>……</li>
</ul>
</blockquote>
<p>而各类密码学技术和工具正是帮助汝在这个无法完全(或是根本不能)信任的互联网中相对安全的传递数据的帮手咯~</p>
<p>好啦好啦……其实咱并不是密码学专家啦😋</p>
</div>
<div class="section" id="pgp-openpgp-gpg-gnupg">
<h2><a class="toc-backref" href="#id5">PGP,OpenPGP 和 GPG(GnuPG)都是些啥玩意?</a></h2>
<p>(啥,汝到现在连这三个词都没听说过?😂😂)</p>
<p>良好隐私密码法(英语:Pretty Good Privacy,缩写为PGP),一套用于讯息加密、验证的应用程序,采用IDEA的散列算法作为加密与验证之用。</p>
<p>PGP的主要开发者是菲尔·齐默尔曼(Phil Zimmermann)。齐默曼于1991年将PGP在互联网上免费发布。</p>
<p>后来,PGP 被 Symantec 公司收购成为了商业软件。</p>
<p>OpenPGP 是一套标准,大多数 PGP 软件(例如 GnuPG)都遵循这一标准。</p>
<p>GNU Privacy Guard(GnuPG或GPG)是一种加密软件,它是PGP加密软件的满足GPL的替代物。GnuPG依照由IETF订定的OpenPGP技术标准设计。GnuPG用于加密、数字签名及产生非对称匙对的软件。</p>
<p>GnuPG是自由软件基金会的GNU计划的一部分,目前受德国政府资助。以GNU通用公共许可证第三版授权。</p>
<p>而大多数 Linux 发行版中内置(或者在软件仓库中)的应该都是 GnuPG 啦。汝可以在终端里输入 <code class="code">
gpg --version</code>
来查看一下版本呗~(如果已经安装了的话)</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1">#咱的 gpg --version 大概像这样,某些发行版(例如 Ubuntu )里可能还会有 gpg2~</span></span>
<span class="code-line">gpg <span class="o">(</span>GnuPG<span class="o">)</span> <span class="m">2</span>.1.14</span>
<span class="code-line">libgcrypt <span class="m">1</span>.7.2</span>
<span class="code-line">Copyright <span class="o">(</span>C<span class="o">)</span> <span class="m">2016</span> Free Software Foundation, Inc.</span>
<span class="code-line">License GPLv3+: GNU GPL version <span class="m">3</span> or later <https://gnu.org/licenses/gpl.html></span>
<span class="code-line">This is free software: you are free to change and redistribute it.</span>
<span class="code-line">There is NO WARRANTY, to the extent permitted by law.</span>
<span class="code-line"></span>
<span class="code-line">Home: /home/horo/.gnupg</span>
<span class="code-line">支持的算法:</span>
<span class="code-line">公钥:RSA, ELG, DSA, ECDH, ECDSA, EDDSA</span>
<span class="code-line">对称加密:IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256,</span>
<span class="code-line"> TWOFISH, CAMELLIA128, CAMELLIA192, CAMELLIA256</span>
<span class="code-line">散列:SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224</span>
<span class="code-line">压缩:不压缩, ZIP, ZLIB, BZIP2</span>
</pre></div>
</div>
<div class="section" id="gnupg">
<h2><a class="toc-backref" href="#id6">GnuPG 的作用是?</a></h2>
<p>至少咱自己经历过的作用有这两种呗~</p>
<ul>
<li><p class="first">签名</p>
<blockquote>
<p>用来证明这个文件是某个人创建的,而且在到达汝的过程中没有被篡改呗~</p>
<p>大部分 Linux 发行版的软件包管理器已经用上这个用途了呐~
(所以咱推测 gpg 应该已经安装在汝的系统上了呗~)</p>
</blockquote>
</li>
<li><p class="first">加密</p>
<blockquote>
<p>在某处用汝自己的密钥对加密某些文字,或是文件。然后传输到某个地方以后再使用汝自己的密钥对解密这些内容,在传输的过程中,如果私钥不泄露的话,其他人只会看到约等于无意义的乱码而已呐~</p>
</blockquote>
</li>
</ul>
<p>然后请允许咱从维基百科上抄一张图下来😂😂</p>
<img alt="PGP 加密/解密的原理图" class="materialboxed responsive-img" src="/images/PGP_diagram_.png"/>
<hr class="docutils"/>
<p>于是这另一个新坑就挖好了呢(雾😂😂,下次就文字直播生成一个汝自己的密钥对好啦~</p>
</div>
一瞥 Arch Linux 中的 filesystem 软件包2016-07-25T00:00:00+08:002016-07-25T00:00:00+08:00ホロtag:None,2016-07-25:/arch-linux/filesystem_package.html
<p>闲来无事,然后就没有然后啦😂</p>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id5">动机?</a></h2>
<p>今天看了看知乎上的某个问题:
<a class="reference external" href="https://www.zhihu.com/question/37720991">长期使用Arch,Gentoo等滚动更新的发行版是怎样的一种体验?</a></p>
<p>好几个 Arch Linux 用户都是在一开始列出了 <code class="code">
/var/log/pacman.log</code>
的第一行,用的是 <code class="code">
head</code>
命令。</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># 咱没有各位的历史悠久啦~</span></span>
<span class="code-line">$ head -1 /var/log/pacman.log</span>
<span class="code-line"><span class="o">[</span><span class="m">2014</span>-11-18 <span class="m">19</span>:37<span class="o">]</span> installed filesystem <span class="o">(</span><span class="m">2014</span>.10-1<span class="o">)</span></span>
</pre></div>
<p>然后这个 filesystem 是啥咧?</p>
<p>然后 <a class="reference external" href="/links.html#farseerfc">farseerfc</a> 这么写到:</p>
<blockquote>
pacman -Ql filesystem 看下它都有什麼唄。
這個包就是提供最基礎的 Arch Linux 的目錄結構和一些不屬於任何別的包的配置文件。
這樣 Arch Linux …</blockquote></div>
<p>闲来无事,然后就没有然后啦😂</p>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id5">动机?</a></h2>
<p>今天看了看知乎上的某个问题:
<a class="reference external" href="https://www.zhihu.com/question/37720991">长期使用Arch,Gentoo等滚动更新的发行版是怎样的一种体验?</a></p>
<p>好几个 Arch Linux 用户都是在一开始列出了 <code class="code">
/var/log/pacman.log</code>
的第一行,用的是 <code class="code">
head</code>
命令。</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># 咱没有各位的历史悠久啦~</span></span>
<span class="code-line">$ head -1 /var/log/pacman.log</span>
<span class="code-line"><span class="o">[</span><span class="m">2014</span>-11-18 <span class="m">19</span>:37<span class="o">]</span> installed filesystem <span class="o">(</span><span class="m">2014</span>.10-1<span class="o">)</span></span>
</pre></div>
<p>然后这个 filesystem 是啥咧?</p>
<p>然后 <a class="reference external" href="/links.html#farseerfc">farseerfc</a> 这么写到:</p>
<blockquote>
pacman -Ql filesystem 看下它都有什麼唄。
這個包就是提供最基礎的 Arch Linux 的目錄結構和一些不屬於任何別的包的配置文件。
這樣 Arch Linux 裏面任何系統文件都在 pacman 管轄範圍內了。</blockquote>
<p>嗯……😋</p>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id6">😋 开始行动</a></h2>
<p>那就首先照着 fc 的写法来一遍呗~</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="o">[</span>horo@yoitsu-surfacebook ~<span class="o">]</span>$ pacman -Ql filesystem</span>
<span class="code-line">filesystem /bin</span>
<span class="code-line">filesystem /boot/</span>
<span class="code-line">filesystem /dev/</span>
<span class="code-line">filesystem /etc/</span>
<span class="code-line">filesystem /etc/arch-release</span>
<span class="code-line">filesystem /etc/crypttab</span>
<span class="code-line">filesystem /etc/fstab</span>
<span class="code-line">filesystem /etc/group</span>
<span class="code-line">filesystem /etc/gshadow</span>
<span class="code-line">filesystem /etc/host.conf</span>
<span class="code-line">filesystem /etc/hosts</span>
<span class="code-line">filesystem /etc/issue</span>
<span class="code-line">filesystem /etc/ld.so.conf</span>
<span class="code-line">filesystem /etc/ld.so.conf.d/</span>
<span class="code-line">filesystem /etc/motd</span>
<span class="code-line">filesystem /etc/mtab</span>
<span class="code-line">filesystem /etc/nsswitch.conf</span>
<span class="code-line">filesystem /etc/passwd</span>
<span class="code-line">filesystem /etc/profile</span>
<span class="code-line">filesystem /etc/profile.d/</span>
<span class="code-line">filesystem /etc/profile.d/locale.sh</span>
<span class="code-line">filesystem /etc/resolv.conf</span>
<span class="code-line">filesystem /etc/securetty</span>
<span class="code-line">filesystem /etc/shadow</span>
<span class="code-line">filesystem /etc/shells</span>
<span class="code-line">filesystem /etc/skel/</span>
<span class="code-line">filesystem /home/</span>
<span class="code-line">filesystem /lib</span>
<span class="code-line">filesystem /lib64</span>
<span class="code-line">filesystem /mnt/</span>
<span class="code-line">filesystem /opt/</span>
<span class="code-line">filesystem /proc/</span>
<span class="code-line">filesystem /root/</span>
<span class="code-line">filesystem /run/</span>
<span class="code-line">filesystem /sbin</span>
<span class="code-line">filesystem /srv/</span>
<span class="code-line">filesystem /srv/ftp/</span>
<span class="code-line">filesystem /srv/http/</span>
<span class="code-line">filesystem /sys/</span>
<span class="code-line">filesystem /tmp/</span>
<span class="code-line">filesystem /usr/</span>
<span class="code-line">filesystem /usr/bin/</span>
<span class="code-line">filesystem /usr/include/</span>
<span class="code-line">filesystem /usr/lib/</span>
<span class="code-line">filesystem /usr/lib/modprobe.d/</span>
<span class="code-line">filesystem /usr/lib/modprobe.d/usb-load-ehci-first.conf</span>
<span class="code-line">filesystem /usr/lib/os-release</span>
<span class="code-line">filesystem /usr/lib64</span>
<span class="code-line">filesystem /usr/local/</span>
<span class="code-line">filesystem /usr/local/bin/</span>
<span class="code-line">filesystem /usr/local/etc/</span>
<span class="code-line">filesystem /usr/local/games/</span>
<span class="code-line">filesystem /usr/local/include/</span>
<span class="code-line">filesystem /usr/local/lib/</span>
<span class="code-line">filesystem /usr/local/man/</span>
<span class="code-line">filesystem /usr/local/sbin/</span>
<span class="code-line">filesystem /usr/local/share/</span>
<span class="code-line">filesystem /usr/local/share/man</span>
<span class="code-line">filesystem /usr/local/src/</span>
<span class="code-line">filesystem /usr/sbin</span>
<span class="code-line">filesystem /usr/share/</span>
<span class="code-line">filesystem /usr/share/man/</span>
<span class="code-line">filesystem /usr/share/man/man1/</span>
<span class="code-line">filesystem /usr/share/man/man2/</span>
<span class="code-line">filesystem /usr/share/man/man3/</span>
<span class="code-line">filesystem /usr/share/man/man4/</span>
<span class="code-line">filesystem /usr/share/man/man5/</span>
<span class="code-line">filesystem /usr/share/man/man6/</span>
<span class="code-line">filesystem /usr/share/man/man7/</span>
<span class="code-line">filesystem /usr/share/man/man7/archlinux.7.gz</span>
<span class="code-line">filesystem /usr/share/man/man8/</span>
<span class="code-line">filesystem /usr/share/misc/</span>
<span class="code-line">filesystem /usr/src/</span>
<span class="code-line">filesystem /var/</span>
<span class="code-line">filesystem /var/cache/</span>
<span class="code-line">filesystem /var/empty/</span>
<span class="code-line">filesystem /var/games/</span>
<span class="code-line">filesystem /var/lib/</span>
<span class="code-line">filesystem /var/lib/misc/</span>
<span class="code-line">filesystem /var/local/</span>
<span class="code-line">filesystem /var/lock</span>
<span class="code-line">filesystem /var/log/</span>
<span class="code-line">filesystem /var/log/old/</span>
<span class="code-line">filesystem /var/mail</span>
<span class="code-line">filesystem /var/opt/</span>
<span class="code-line">filesystem /var/run</span>
<span class="code-line">filesystem /var/spool/</span>
<span class="code-line">filesystem /var/spool/mail/</span>
<span class="code-line">filesystem /var/tmp/</span>
</pre></div>
<p>嗯 filesystem 的作用大概有这几个:</p>
<ul>
<li><p class="first">首先摆好一个 Linux 发行版基本的目录结构。</p>
<blockquote>
<p>大多数 Linux 发行版的目录结构都是遵循 <a class="reference external" href="https://zh.wikipedia.org/zh/文件系统层次结构标准">文件系统层次结构标准</a>
的啦,Arch 也不例外~</p>
</blockquote>
</li>
<li><p class="first">然后放些 Arch 特有的文件</p>
<blockquote>
<p>例如默认设置啦( <del>这不是废话么</del> ),甚至还有一个手册页(汝不妨试试 <code class="code">
man archlinux</code>
?)</p>
</blockquote>
</li>
</ul>
</div>
<div class="section" id="id4">
<h2><a class="toc-backref" href="#id7">所以嘛……</a></h2>
<ul>
<li><p class="first">这下所有的文件都在 pacman 的纪录之下了呗~</p>
<blockquote>
<p><a class="reference external" href="https://wiki.archlinux.org/index.php/Pacman/Tips_and_tricks#Identify_files_not_owned_by_any_package">ArchWiki 上有篇条目写着如何寻找不属于任何软件包的文件</a></p>
</blockquote>
</li>
<li><p class="first"><del>所以咱很无聊咯~</del> 😂😂</p>
</li>
</ul>
</div>
AOSCC 2016 游记 - 第三天2016-07-24T00:00:00+08:002016-07-24T00:00:00+08:00ホロtag:None,2016-07-24:/aosc/aoscc_2016_3.html
<p>AOSCC 2016 围观日记最终章(大雾</p>
<p>去 AOSCC 会场围观了下,然后拖延症又发作了 *3 😂</p>
<blockquote>
怪了,今天有人没出席拖延症患者互助协会的活动。</blockquote>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id5">第三天......</a></h2>
<p>还是多图杀猫+原谅咱的渣照相技术😂</p>
<img alt="前奏" class="materialboxed responsive-img" src="/images/AOSCC/Day3/1.jpg"/>
<p>今天是个平常的一天,大家都在各自摸鱼🐟,甚至又玩起了 UNO 牌😂</p>
<img alt="又玩起了 UNO 牌😂" class="materialboxed responsive-img" src="/images/AOSCC/Day3/2.jpg"/>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id6">😐 果冻特首的打包教室</a></h2>
<img alt="Install AOSC OS on Deepin" class="materialboxed responsive-img" src="/images/AOSCC/Day3/3.jpg"/>
<p>特首试图用 Deepin 的 LiveUSB 安装 AOSC OS (然后失败了😂</p>
<img alt="这是色彩校正" class="materialboxed responsive-img" src="/images/AOSCC/Day3/4.jpg"/>
<p>这个看起来和摄像头类似的物体竟然是用来校正色彩的 🤦</p>
<img alt="ThinkPad 信仰充值中心二分部 😂" class="materialboxed responsive-img" src="/images/AOSCC/Day3/5.jpg"/>
<p>ThinkPad 信仰充值中心二分部 😂</p>
<img alt="换大屏幕" class="materialboxed responsive-img" src="/images/AOSCC/Day3/10.jpg"/>
<p>换大屏幕以后就舒服多了~</p>
<img alt="现场修 issue" class="materialboxed responsive-img" src="/images/AOSCC/Day3/11.jpg"/>
<p>特首施展了现场修 issue 技能 😂</p>
</div>
<div class="section" id="ast">
<h2><a class="toc-backref" href="#id7">😅 AST 讨论区兼微软信仰充值中心 😂</a></h2>
<img alt="画风突变" class="materialboxed responsive-img" src="/images/AOSCC/Day3/6.jpg"/>
<p>画风突变😂😂</p>
<img alt="来排排坐" class="materialboxed responsive-img" src="/images/AOSCC/Day3/8.jpg"/>
<p>AOSCC 微软信仰充值中心 😂</p>
</div>
<div class="section" id="aosc-os">
<h2><a class="toc-backref" href="#id8">😯 AOSC OS 要成为模拟器系统么 (雾</a></h2>
<img alt="新鲜出炉的 vba-m" class="materialboxed responsive-img" src="/images/AOSCC/Day3/24.jpg"/>
<p>新鲜出炉的 vba-m 😂</p>
<img alt="隔壁 OS X 来砸场啦" class="materialboxed responsive-img" src="/images/AOSCC/Day3/13.jpg"/>
<p>OS X 来砸场啦 😂</p>
<img alt="NDSL" class="materialboxed responsive-img" src="/images/AOSCC/Day3/12.jpg"/>
<p>真机笑而不语 …</p></div>
<p>AOSCC 2016 围观日记最终章(大雾</p>
<p>去 AOSCC 会场围观了下,然后拖延症又发作了 *3 😂</p>
<blockquote>
怪了,今天有人没出席拖延症患者互助协会的活动。</blockquote>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id5">第三天......</a></h2>
<p>还是多图杀猫+原谅咱的渣照相技术😂</p>
<img alt="前奏" class="materialboxed responsive-img" src="/images/AOSCC/Day3/1.jpg"/>
<p>今天是个平常的一天,大家都在各自摸鱼🐟,甚至又玩起了 UNO 牌😂</p>
<img alt="又玩起了 UNO 牌😂" class="materialboxed responsive-img" src="/images/AOSCC/Day3/2.jpg"/>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id6">😐 果冻特首的打包教室</a></h2>
<img alt="Install AOSC OS on Deepin" class="materialboxed responsive-img" src="/images/AOSCC/Day3/3.jpg"/>
<p>特首试图用 Deepin 的 LiveUSB 安装 AOSC OS (然后失败了😂</p>
<img alt="这是色彩校正" class="materialboxed responsive-img" src="/images/AOSCC/Day3/4.jpg"/>
<p>这个看起来和摄像头类似的物体竟然是用来校正色彩的 🤦</p>
<img alt="ThinkPad 信仰充值中心二分部 😂" class="materialboxed responsive-img" src="/images/AOSCC/Day3/5.jpg"/>
<p>ThinkPad 信仰充值中心二分部 😂</p>
<img alt="换大屏幕" class="materialboxed responsive-img" src="/images/AOSCC/Day3/10.jpg"/>
<p>换大屏幕以后就舒服多了~</p>
<img alt="现场修 issue" class="materialboxed responsive-img" src="/images/AOSCC/Day3/11.jpg"/>
<p>特首施展了现场修 issue 技能 😂</p>
</div>
<div class="section" id="ast">
<h2><a class="toc-backref" href="#id7">😅 AST 讨论区兼微软信仰充值中心 😂</a></h2>
<img alt="画风突变" class="materialboxed responsive-img" src="/images/AOSCC/Day3/6.jpg"/>
<p>画风突变😂😂</p>
<img alt="来排排坐" class="materialboxed responsive-img" src="/images/AOSCC/Day3/8.jpg"/>
<p>AOSCC 微软信仰充值中心 😂</p>
</div>
<div class="section" id="aosc-os">
<h2><a class="toc-backref" href="#id8">😯 AOSC OS 要成为模拟器系统么 (雾</a></h2>
<img alt="新鲜出炉的 vba-m" class="materialboxed responsive-img" src="/images/AOSCC/Day3/24.jpg"/>
<p>新鲜出炉的 vba-m 😂</p>
<img alt="隔壁 OS X 来砸场啦" class="materialboxed responsive-img" src="/images/AOSCC/Day3/13.jpg"/>
<p>OS X 来砸场啦 😂</p>
<img alt="NDSL" class="materialboxed responsive-img" src="/images/AOSCC/Day3/12.jpg"/>
<p>真机笑而不语😏</p>
</div>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id9">各种小插曲......</a></h2>
<img alt="Icenowy" class="materialboxed responsive-img" src="/images/AOSCC/Day3/7.jpg"/>
<img alt="Icenowy" class="materialboxed responsive-img" src="/images/AOSCC/Day3/15.jpg"/>
<p><del>被特首抢了观众的</del> Icenowy 在默默的继续调试自己的板子……</p>
<img alt="Icenowy" class="materialboxed responsive-img" src="/images/AOSCC/Day3/23.jpg"/>
<p>(好像有啥奇怪的东西混进来了😂</p>
<img alt="现场直播白学" class="materialboxed responsive-img" src="/images/AOSCC/Day3/9.jpg"/>
<p>白学家进入现场, <del>打死!</del></p>
<img alt="围观狮子赶工社区网站" class="materialboxed responsive-img" src="/images/AOSCC/Day3/16.jpg"/>
<p>🙄 围观狮子赶工社区网站中……</p>
<img alt="FSF" class="materialboxed responsive-img" src="/images/AOSCC/Day3/17.jpg"/>
<img alt="FSF" class="materialboxed responsive-img" src="/images/AOSCC/Day3/18.jpg"/>
<p>听说有人要加入 FSF 神教? 😂</p>
<img alt="Coding.net x GitCafe" class="materialboxed responsive-img" src="/images/AOSCC/Day3/22.jpg"/>
<p>GitCafe 的精神继任 Coding.net 借尸还魂啦😂</p>
</div>
<div class="section" id="del-del">
<h2><a class="toc-backref" href="#id10"><del>这不清真</del> 😂</a></h2>
<img alt="这不清真" class="materialboxed responsive-img" src="/images/AOSCC/Day3/19.jpg"/>
<img alt="这不清真 Act 2" class="materialboxed responsive-img" src="/images/AOSCC/Day3/20.jpg"/>
<img alt="这不清真 Act 3" class="materialboxed responsive-img" src="/images/AOSCC/Day3/21.jpg"/>
<p>糟糕!你们竟然昏了头脑把圣战者公审了!他引爆了藏在衣服里的炸弹,和所有人同归于尽了 #圣战者胜。😂</p>
</div>
<div class="section" id="id4">
<h2><a class="toc-backref" href="#id11">然后……</a></h2>
<p>Jelly Bai 在 BroncoTc 的提醒下发现忘记像去年一样照集体照了 🤣😂</p>
<blockquote>
<p>BroncoTc | Keybase√, [18.07.16 19:16]
卧槽</p>
<p>BroncoTc | Keybase√, [18.07.16 19:16]
我们忘了拍合影。</p>
<p>liushuyu 🐟, [18.07.16 19:16]
GG</p>
<p>liushuyu 🐟, [18.07.16 19:17]
建议开始 AOSCC 2017 的筹划</p>
<p>Mingcong Bai, [18.07.16 19:17]
Oh sh*t.</p>
<p>ヨイツの賢狼ホロ 😋(*), [18.07.16 19:18]
下一次第一天就拍合影吼不吼啊😂</p>
<p>Mingcong Bai, [18.07.16 19:18]
[In reply to ヨイツの賢狼ホロ 😋(*)]
吼啊</p>
<p>gumblex, [18.07.16 19:18]
[In reply to BroncoTc | Keybase√]
🌚这应该是第一天中午的事情</p>
<p>Mogician Yang, [18.07.16 19:18]
滋磁一个</p>
<p>Jactry Zeng, [18.07.16 19:19]
[In reply to Mingcong Bai]
这次会续了不少啊 xD</p>
<p>ヨイツの賢狼ホロ 😋(*), [18.07.16 19:19]
[In reply to Mingcong Bai]
😂 /me 然而下一次来不来难说了</p>
<p>KayMW | Syntax-Breaker | 不想猎取灵魂的咸鱼不是好灵魂画手 | 0x547E5906116A1966, [18.07.16 19:19]
[In reply to ヨイツの賢狼ホロ 😋(*)]
还真应该这样……有时候不知道谁就突然不见了(比如今天中午的A2</p>
<p>KayMW | Syntax-Breaker | 不想猎取灵魂的咸鱼不是好灵魂画手 | 0x547E5906116A1966, [18.07.16 19:20]
[In reply to KayMW | Syntax-Breaker | 不想猎取灵魂的咸鱼不是好灵魂画手 | 0x547E5906116A1966]
还有昨天还是前天的 Bob Cao(</p>
<p>Icenowy 请大家不要在 SoC 上套用 PC 的 GPU 概念, [18.07.16 19:20]
[In reply to KayMW | Syntax-Breaker | 不想猎取灵魂的咸鱼不是好灵魂画手 | 0x547E5906116A1966]
a2 最后回来啦</p>
<p>IMisakaTransferFrame4e21 神乐坂美蒋, [18.07.16 19:21]
应该和AOSCC 2015一样,人没到齐就合多张</p>
<p>KayMW | Syntax-Breaker | 不想猎取灵魂的咸鱼不是好灵魂画手 | 0x547E5906116A1966, [18.07.16 19:21]
[In reply to Icenowy 请大家不要在 SoC 上套用 PC 的 GPU 概念]
然而那个时候人基本走光啦(</p>
</blockquote>
</div>
AOSCC 2016 游记 - 第二天2016-07-23T00:00:00+08:002016-07-23T00:00:00+08:00ホロtag:None,2016-07-23:/aosc/aoscc_2016_2.html
<p>AOSCC 2016 围观日记续集(误</p>
<p>去 AOSCC 会场围观了下,然后拖延症又发作了 *2 😂</p>
<blockquote>
你是拖延症患者,每天除了摸鱼🐟什么都不干,你很忧心,为此加入了拖延症患者互助协会。</blockquote>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id3">第二天......</a></h2>
<p>还是多图杀猫+原谅咱的渣照相技术😂</p>
<img alt="前奏:出发~" class="materialboxed responsive-img" src="/images/AOSCC/Day2/0.jpg"/>
<p><del>「昨晚,秘密警察突然失踪,说不定是有人报复?想必是凶多吉少了……」酒店老板在收了一笔可观的小费之后,告诉了大家这个情报。</del></p>
<img alt="还是A2的游戏直播" class="materialboxed responsive-img" src="/images/AOSCC/Day2/1.jpg"/>
<p>还是老样子,开始前先玩会儿游戏~</p>
</div>
<div class="section" id="gumblex">
<h2><a class="toc-backref" href="#id4">🐷 Gumblex 的表情高清重制直播</a></h2>
<img alt="Gumblex 的表情高清重制直播" class="materialboxed responsive-img" src="/images/AOSCC/Day2/2.jpg"/>
<p>(道具是自由且开源的 Inkscape 哦~)</p>
<img alt="Gumblex 的表情高清重制直播" class="materialboxed responsive-img" src="/images/AOSCC/Day2/3.jpg"/>
<img alt="Gumblex 的表情高清重制直播" class="materialboxed responsive-img" src="/images/AOSCC/Day2/4.jpg"/>
<p>这张用了 <ruby><rb>全景</rb><rp>(</rp><rt>不能</rt><rp>)</rp></ruby> 变焦以后更糊了 😂</p>
<img alt="Gumblex 的表情高清重制直播" class="materialboxed responsive-img" src="/images/AOSCC/Day2/6.jpg"/>
</div>
<div class="section" id="junde-yhi">
<h2><a class="toc-backref" href="#id5">😯 Junde Yhi 关于安同开始程序的介绍</a></h2>
<p>安同开始程序(Anthon Starter Kit),可以去 repo.aosc.io 获取演讲时用到的幻灯片。</p>
<blockquote>
(原谅咱真找不到更合适的词啦,况且 LibreOffice Impress …</blockquote></div>
<p>AOSCC 2016 围观日记续集(误</p>
<p>去 AOSCC 会场围观了下,然后拖延症又发作了 *2 😂</p>
<blockquote>
你是拖延症患者,每天除了摸鱼🐟什么都不干,你很忧心,为此加入了拖延症患者互助协会。</blockquote>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id3">第二天......</a></h2>
<p>还是多图杀猫+原谅咱的渣照相技术😂</p>
<img alt="前奏:出发~" class="materialboxed responsive-img" src="/images/AOSCC/Day2/0.jpg"/>
<p><del>「昨晚,秘密警察突然失踪,说不定是有人报复?想必是凶多吉少了……」酒店老板在收了一笔可观的小费之后,告诉了大家这个情报。</del></p>
<img alt="还是A2的游戏直播" class="materialboxed responsive-img" src="/images/AOSCC/Day2/1.jpg"/>
<p>还是老样子,开始前先玩会儿游戏~</p>
</div>
<div class="section" id="gumblex">
<h2><a class="toc-backref" href="#id4">🐷 Gumblex 的表情高清重制直播</a></h2>
<img alt="Gumblex 的表情高清重制直播" class="materialboxed responsive-img" src="/images/AOSCC/Day2/2.jpg"/>
<p>(道具是自由且开源的 Inkscape 哦~)</p>
<img alt="Gumblex 的表情高清重制直播" class="materialboxed responsive-img" src="/images/AOSCC/Day2/3.jpg"/>
<img alt="Gumblex 的表情高清重制直播" class="materialboxed responsive-img" src="/images/AOSCC/Day2/4.jpg"/>
<p>这张用了 <ruby><rb>全景</rb><rp>(</rp><rt>不能</rt><rp>)</rp></ruby> 变焦以后更糊了 😂</p>
<img alt="Gumblex 的表情高清重制直播" class="materialboxed responsive-img" src="/images/AOSCC/Day2/6.jpg"/>
</div>
<div class="section" id="junde-yhi">
<h2><a class="toc-backref" href="#id5">😯 Junde Yhi 关于安同开始程序的介绍</a></h2>
<p>安同开始程序(Anthon Starter Kit),可以去 repo.aosc.io 获取演讲时用到的幻灯片。</p>
<blockquote>
(原谅咱真找不到更合适的词啦,况且 LibreOffice Impress 也叫“幻灯片” 😂😂</blockquote>
<p><a class="reference external" href="https://repo.aosc.io/aosc-documentation/aoscc-2016/junde-yhi-ast-startup-kit/speech-anthon-starter.pdf">https://repo.aosc.io/aosc-documentation/aoscc-2016/junde-yhi-ast-startup-kit/speech-anthon-starter.pdf</a></p>
<img alt="唔~" class="materialboxed responsive-img" src="/images/AOSCC/Day2/-1.png"/>
<p>唔~</p>
<img alt="AST Speech" class="materialboxed responsive-img" src="/images/AOSCC/Day2/17.jpg"/>
<img alt="Uno😂" class="materialboxed responsive-img" src="/images/AOSCC/Day2/10.jpg"/>
<p>然后后面有人玩起了 Uno 牌😂</p>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id6">😂 插曲:狮子产效果拔群的绿化器</a></h2>
<img alt="狮子产效果拔群的绿化器" class="materialboxed responsive-img" src="/images/AOSCC/Day2/14.jpg"/>
<p><del>效果拔群</del></p>
</div>
<div class="section" id="junde-yhi-liushuyu-abbs">
<h2><a class="toc-backref" href="#id7">😋 Junde Yhi 和 liushuyu 🐟 关于分布式 ABBS 的构想</a></h2>
<p>ABBS ,全称 AutoBuild Build Service 。是 AOSC OS 管理软件包编译配置树的工具(目前是这样</p>
<p>还是老样子,演讲时的幻灯片在这:</p>
<p><a class="reference external" href="https://repo.aosc.io/aosc-documentation/aoscc-2016/junde-yhi-distributed-abbs/distributed-abbs.pdf">https://repo.aosc.io/aosc-documentation/aoscc-2016/junde-yhi-distributed-abbs/distributed-abbs.pdf</a></p>
<img alt="DABBS_1" class="materialboxed responsive-img" src="/images/AOSCC/Day2/8.jpg"/>
<img alt="DABBS_2" class="materialboxed responsive-img" src="/images/AOSCC/Day2/11.jpg"/>
<img alt="DABBS_3" class="materialboxed responsive-img" src="/images/AOSCC/Day2/12.jpg"/>
<img alt="DABBS_4" class="materialboxed responsive-img" src="/images/AOSCC/Day2/13.jpg"/>
<p>(瓶装毒品😂😂)</p>
</div>
<div class="section" id="icenowy-gnu-linux-arm">
<h2><a class="toc-backref" href="#id8">🙄 Icenowy 关于 GNU/Linux 向 ARM 移植的相关介绍</a></h2>
<p>然而咱只拍了一张照片,而且用了 <ruby><rb>全景</rb><rp>(</rp><rt>不能</rt><rp>)</rp></ruby> 变焦以后更糊了 😂</p>
<p><a class="reference external" href="https://repo.aosc.io/aosc-documentation/aoscc-2016/xingda-zheng-way-to-gnu-linux-on-arm/Way%20to%20ARM%20Linux.pdf">https://repo.aosc.io/aosc-documentation/aoscc-2016/xingda-zheng-way-to-gnu-linux-on-arm/Way%20to%20ARM%20Linux.pdf</a></p>
<img alt="Icenowy's GNU/Linux on ARM" class="materialboxed responsive-img" src="/images/AOSCC/Day2/19.jpg"/>
</div>
<div class="section" id="extra">
<h2><a class="toc-backref" href="#id9">照例还是 Extra:</a></h2>
<img alt="Arthur2e5 is playing NEKOPARA ~" class="materialboxed responsive-img" src="/images/AOSCC/Day2/7.jpg"/>
<p><del>这回怪了,没人投票?你们终于意识到投票杀人是不人道的了吗?</del></p>
<p><del>夜幕降临,人们都活在恐惧中,彻夜难眠。这漫长的夜晚竟然......还是有好几个小时</del> 😂😂</p>
<p>😋</p>
</div>
AOSCC 2016 游记 - 第一天2016-07-22T00:00:00+08:002016-07-22T00:00:00+08:00ホロtag:None,2016-07-22:/aosc/aoscc_2016.html
<p>AOSCC 2016 围观日记 (误</p>
<p>去 AOSCC 会场围观了下,然后拖延症又发作了😂😂</p>
<div class="section" id="aosc-c">
<h2><a class="toc-backref" href="#id2">AOSC(C) 是啥?</a></h2>
<p>AOSC ,全称 <del>Always Overuse Shell Community</del> Anthon Open Source Community ,安同开源社区。
是一个主要学生组成的开源社区,主要致力于 AOSC OS 的开发工作。</p>
<p>AOSC OS 是安同开源社区的主要项目,它是一个“白”手起家(?),采用 dpkg 作为软件包管理器的 Linux 发行版,
按照 <a class="reference external" href="/links.html#jeffbai">jeffbai</a>: 可爱的特首(误) Jelly Bai 的想法:</p>
<blockquote>
“在我们的发行版真的拿得出手前(希望至少能和 Arch 比比整洁度),真不希望我们像 …</blockquote></div>
<p>AOSCC 2016 围观日记 (误</p>
<p>去 AOSCC 会场围观了下,然后拖延症又发作了😂😂</p>
<div class="section" id="aosc-c">
<h2><a class="toc-backref" href="#id2">AOSC(C) 是啥?</a></h2>
<p>AOSC ,全称 <del>Always Overuse Shell Community</del> Anthon Open Source Community ,安同开源社区。
是一个主要学生组成的开源社区,主要致力于 AOSC OS 的开发工作。</p>
<p>AOSC OS 是安同开源社区的主要项目,它是一个“白”手起家(?),采用 dpkg 作为软件包管理器的 Linux 发行版,
按照 <a class="reference external" href="/links.html#jeffbai">jeffbai</a>: 可爱的特首(误) Jelly Bai 的想法:</p>
<blockquote>
“在我们的发行版真的拿得出手前(希望至少能和 Arch 比比整洁度),真不希望我们像 Deepin 一样被捧来捧去......”</blockquote>
<p>而后面加个 C (Conference) 就是一年一度的见面会啦~ (今年好像是第二届?</p>
<p>然后作为在其间打酱油的咱怎么会想到去参加这个呢? (难道是因为被调侃了?</p>
<blockquote>
<p>liushuyu 🐟, [09.07.16 17:52]
萌狼跟谁住啊(</p>
<p>ヨイツの賢狼ホロ 😋(*), [09.07.16 17:55]
🌚</p>
<p>Cheng Cao, [09.07.16 17:57]
[In reply to liushuyu 🐟]
会发生什么</p>
<p>ヨイツの賢狼ホロ 😋(*), [09.07.16 18:03]
[In reply to Cheng Cao]
😋</p>
<p>liushuyu 🐟, [09.07.16 18:05]
[In reply to Cheng Cao]
旭日初升,恶臭四溢。AOSCC 与会人员们寻着气味而走,赫然发现【xxx】身首异处,躯体被撕成了碎片。这回糟了!</p>
<p>KayMW | Syntax-Breaker | 不想猎取灵魂的咸鱼不是好灵魂画手 | 0x547E5906116A1966, [09.07.16 18:17]
[In reply to Cheng Cao]
会被吃</p>
<p>KayMW | Syntax-Breaker | 不想猎取灵魂的咸鱼不是好灵魂画手 | 0x547E5906116A1966, [09.07.16 18:17]
[In reply to liushuyu 🐟]
萌狼:“下一个吃谁呢~”</p>
<p>ヨイツの賢狼ホロ 😋(*), [09.07.16 18:18]
😂</p>
</blockquote>
<p><del>请听题:上面要补多少个括号?</del> 😂😂</p>
</div>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id3">第一天......</a></h2>
<p>多图杀猫+原谅咱的渣照相技术😂</p>
<img alt="前奏:当地桥好像很多的样子......" class="materialboxed responsive-img" src="/images/AOSCC/Day1/1.jpg"/>
<p>(当地桥好像很多的样子~)</p>
<img alt="前奏:这是啥?" class="materialboxed responsive-img" src="/images/AOSCC/Day1/4.jpg"/>
<p>(当心电离辐射......#滑稽)</p>
<img alt="前奏:导向牌" class="materialboxed responsive-img" src="/images/AOSCC/Day1/6.jpg"/>
<p>(简朴的导向标志)</p>
<p><del>AOSCC 与会人员们聚集在会场 —— 大家都如释重负,因为昨晚似乎无人受袭。</del></p>
<img alt="正在打游戏的 A2 ww~" class="materialboxed responsive-img" src="/images/AOSCC/Day1/7.jpg"/>
<img alt="正在打游戏的 A2 ww~" class="materialboxed responsive-img" src="/images/AOSCC/Day1/8.jpg"/>
<p>在白特首来之前先来围观下 A2 ~</p>
<img alt="维他柠檬茶" class="materialboxed responsive-img" src="/images/AOSCC/Day1/9.jpg"/>
<p>夭寿辣,会场聚众吸毒啦😂😂</p>
<img alt="locale-gen" class="materialboxed responsive-img" src="/images/AOSCC/Day1/10.jpg"/>
<p>现场生成 locale 中(貌似 AOSC 没给 /etc/locale.gen 上注释😂</p>
<img alt="ThinkPads" class="materialboxed responsive-img" src="/images/AOSCC/Day1/11.jpg"/>
<p>ThinkPad 信仰充值中心一分部 😂 (画面中间的是果冻特首的 W541 ,旁边的是 A2 的 X1 Carbon)</p>
<img alt="Longson" class="materialboxed responsive-img" src="/images/AOSCC/Day1/13.jpg"/>
<p>还有特首的龙芯笔记本~</p>
<img alt="WhiteBoard" class="materialboxed responsive-img" src="/images/AOSCC/Day1/14.jpg"/>
<p>Hmm...清真猪肉公共许可证, <del>嗯可以,这很清真</del></p>
<img alt="Raspberrypi" class="materialboxed responsive-img" src="/images/AOSCC/Day1/15.jpg"/>
<p>现场装 X 中的树莓派 (然而不久有人把线碰掉然后就关机了, <del>毕竟出来混迟早是要还的嘛</del> 😂)</p>
<img alt="AOSCC17" class="materialboxed responsive-img" src="/images/AOSCC/Day1/19.jpg"/>
<img alt="AOSCC201" class="materialboxed responsive-img" src="/images/AOSCC/Day1/20.jpg"/>
<p>AOSCC 2017,下一站广州!😋</p>
<img alt="AOSCC Core 4" class="materialboxed responsive-img" src="/images/AOSCC/Day1/22.jpg"/>
<p>AOSCC 2016 与会者选出的 AOSC OS Core 4 的开发代号是 "Duang-Duang"(努力保持严肃……);</p>
<p><del>夜幕降临,人们都活在恐惧中,彻夜难眠。这漫长的夜晚竟然有几个小时!</del> 😂😂</p>
</div>
<div class="section" id="extra">
<h2><a class="toc-backref" href="#id4">Extra</a></h2>
<img alt="Naive Blue" class="materialboxed responsive-img" src="/images/AOSCC/Day1/18.jpg"/>
<p>😂😂</p>
</div>
在 Windows 中写 C 程序2016-06-13T00:00:00+08:002016-06-13T00:00:00+08:00ホロtag:None,2016-06-13:/tech_misc/write_c_program_in_windows.html
<p>说着说着一个学年就要过去了啦~</p>
<p>要说这半年(现在不是六月了么)印象最深刻的是啥,就是帮忙解决了身边不少同学的相同的问题……</p>
<p><del>--farseerfc 果然是先知啊(雾</del></p>
<blockquote>
<p>ヨイツの賢狼ホロ 😋, [11.06.16 20:43]
😂😂</p>
<p>ヨイツの賢狼ホロ 😋, [11.06.16 20:43]
/me 刚刚解决了些问题👍</p>
<p>ヨイツの賢狼ホロ 😋, [11.06.16 20:44]
解决了些社团同学的问题😂</p>
<p>farseerfc 😂, [11.06.16 20:44]
[In reply to ヨイツの賢狼ホロ 😋]
感覺牙縫裡還夾著頭髮(</p>
<p>ヨイツの賢狼ホロ 😋, [11.06.16 20:44]
[In reply to farseerfc …</p></blockquote>
<p>说着说着一个学年就要过去了啦~</p>
<p>要说这半年(现在不是六月了么)印象最深刻的是啥,就是帮忙解决了身边不少同学的相同的问题……</p>
<p><del>--farseerfc 果然是先知啊(雾</del></p>
<blockquote>
<p>ヨイツの賢狼ホロ 😋, [11.06.16 20:43]
😂😂</p>
<p>ヨイツの賢狼ホロ 😋, [11.06.16 20:43]
/me 刚刚解决了些问题👍</p>
<p>ヨイツの賢狼ホロ 😋, [11.06.16 20:44]
解决了些社团同学的问题😂</p>
<p>farseerfc 😂, [11.06.16 20:44]
[In reply to ヨイツの賢狼ホロ 😋]
感覺牙縫裡還夾著頭髮(</p>
<p>ヨイツの賢狼ホロ 😋, [11.06.16 20:44]
[In reply to farseerfc 😂]
😂啥</p>
<p>莉莉艾塔·K·A (Лилы-Айта К.А.) , [11.06.16 20:44]
[In reply to farseerfc 😂]
?!</p>
<p>farseerfc 😂, [11.06.16 20:44]
[In reply to ヨイツの賢狼ホロ 😋]
一些骨頭在萌狼肚子裡(解決</p>
<p>ヨイツの賢狼ホロ 😋, [11.06.16 20:45]
😂</p>
<p>Felix Yan, [11.06.16 20:45]
太可怕了</p>
<p>Felix Yan, [11.06.16 20:45]
狼最近食欲很好啊</p>
</blockquote>
<p>好了玩笑开完了(再纠结这个的话要不要亲自体验一下?😋)。其实就是因为这学期的 C 语言课,然后就栽在用啥写程序这个问题上了……</p>
<p>然而那些搞得咱想 <ruby><rb>**</rb><rp>(</rp><rt>😋</rt><rp>)</rp></ruby> 的老师竟然还在用 VC6?? 对,就是那个老掉牙的而且在 Windows 7 以后的系统不好装的 Visual C++ 6 (╯^﹏^)╯ ┻━┻</p>
<p>所以在 <ruby><rb>问的不耐烦</rb><rp>(</rp><rt>实在吃不下</rt><rp>)</rp></ruby> 之后,咱决定写点啥了……</p>
<div class="section" id="linux">
<h2><a class="toc-backref" href="#id3">最简单的方法:换 Linux 啦~</a></h2>
<blockquote>
此处 Linux = 基于 Linux 内核的操作系统 😂</blockquote>
<p>确实 Linux 上写 C 程序更方便些啦~</p>
<ul class="simple">
<li>大多数的 Linux 发行版上都带有 GCC (啥?汝不会连 GCC 都不知道是啥吧 , <a class="reference external" href="https://zhwp.org/GCC">赶紧补习一下吧~</a></li>
<li>可能还会有手册页,包括标准库的大多数内容.</li>
<li>另外,如果想继续深入学习的话,Linux 应该也算一门技能吧......</li>
</ul>
<p>然而:</p>
<ul class="simple">
<li>Linux 是个操作系统,这就注定了汝可能要花好长的时间先去学习如何使用这个操作系统😂</li>
<li>......</li>
</ul>
<p>所以咧?</p>
<p>如果汝有心情在这一领域深入下去 (而不是为了通过考试) ,可以尝试一下~ 😋</p>
</div>
<div class="section" id="windows-unix">
<h2><a class="toc-backref" href="#id4">或者在 Windows 上搭建一个类 Unix 子系统?</a></h2>
<p>最适合觉得装在真机或者虚拟机上太麻烦的人啦~</p>
<p>类 Unix 子系统其实就是运行在 Windows 上的一个程序啦~ 它用来提供POSIX系统调用的API,
这样在 Linux 等类 Unix 系统上写成的程序就可以通过重新编译来在 Windows 下运行啦~</p>
<p>目前名气最大的类 Unix 子系统有两个,分别是 <a class="reference external" href="https://cygwin.com/">Cygwin</a> 和 <a class="reference external" href="https://msys2.github.io/">MSYS2</a> ,
如果非要咱钦定一个的话......那一定是 MSYS2 啦,因为有咱喜欢的 pacman 😋</p>
<p>考虑到长度的关系具体怎么安装咱下次再说吧 (挖坑的节奏......)</p>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id5">挑一个合适的集成开发环境?</a></h2>
<blockquote>
<p>集成开发环境(Integrated Development Environment,简称IDE)是一种辅助程式开发人员开发软体的应用软体,
在开发工具内部就可以辅助编写原始码文本、并编译打包成为可用的程序,有些甚至可以设计图形介面。</p>
<p>IDE通常包括程式语言编辑器、自动构建工具、通常还包括除错器。有些IDE包含编译器/直译器,
如微软的Microsoft Visual Studio,有些则不包含,如Eclipse、SharpDevelop等,
这些IDE是通过调用第三方编译器来实现代码的编译工作的。有时IDE还会包含版本控制系统和一些可以设计图形用户界面的工具。
许多支援物件导向的现代化IDE还包括了类别浏览器、物件检视器、物件结构图。
虽然目前有一些IDE支援多种程式语言(例如Eclipse、NetBeans、Microsoft Visual Studio),但是一般而言
,IDE主要还是针对特定的程式语言而量身打造(例如Visual Basic)。</p>
<p>---- <a class="reference external" href="https://zh.wikipedia.org/wiki/%E9%9B%86%E6%88%90%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83">Wikipedia:集成开发环境</a></p>
</blockquote>
<p>所以已经有先人想到了这个问题制作了很多(?)的集成开发环境啦~
然而咱并没用过 (咱都是直接用 Arch Linux 的😏) ,这里列出几个咱见过的集成开发环境.</p>
<ul class="simple">
<li><a class="reference external" href="http://www.programarts.com/cfree_ch/">C-Free</a> 好像是中国人开发的 IDE,好想要付费的样子 🤔</li>
<li><a class="reference external" href="http://www.codeblocks.org/">Code::Blocks</a> 跨平台的自由软件。</li>
<li><a class="reference external" href="http://www.bloodshed.net/devcpp.html">Dev-Cpp</a> 也是跨平台的自由软件. (话说学校的电脑里明明装着 Dev-Cpp 为啥还用 VC6 (╯ ̄﹏ ̄)╯ ┻━┻ )</li>
<li><a class="reference external" href="https://www.zhihu.com/question/40929777/answer/90029159">Visual Studio</a> ,这其实是个大型 IDE,对初学者来讲太重了些。不过最近更新的 Visual Studio 2015 Update 1 加入了 clang 作为编译器的功能,也可以拿来做 C 编译器啦~</li>
</ul>
</div>
<div class="section" id="gcc">
<h2><a class="toc-backref" href="#id6">GCC+文字编辑器?</a></h2>
<p>其实上面提到的 IDE 里面一定是有编译器的,多半是GCC😂</p>
<p>其实 GCC 是有向 Windows 移植的,就是 MinGW 啦:</p>
<blockquote>
<p>MinGW(Minimalist GNU for Windows),又称mingw32,是将GCC编译器和GNU Binutils移植到Win32平台下的产物,包括一系列头文件(Win32API)、库和可执行文件。</p>
<p>另有可用于产生32位及64位Windows可执行文件的MinGW-w64项目,是从原本MinGW产生的分支。如今已经独立发展.</p>
<p>---- <a class="reference external" href="https://zh.wikipedia.org/wiki/MinGW">Wikipedia:MinGW</a></p>
</blockquote>
<p>实际应用上咧,多半会有已经打包好的 MinGW,可以帮助汝快速的准备工作啦~,例如 <a class="reference external" href="https://www.zhihu.com/question/40929777/answer/90015056">tdm-gcc</a></p>
<p>然后就是找个合适的文字编辑器啦~ 无论是 <a class="reference external" href="https://atom.io">Atom</a> ,
<a class="reference external" href="https://www.visualstudio.com/products/code-vs">Visual Studio Code</a> ,
或者 <a class="reference external" href="https://notepad-plus-plus.org/">Notepad++</a> 等等,挑一个自己顺手的就行啦~</p>
<hr class="docutils"/>
<p>好吧咱又算 <ruby><rb>抛砖引玉</rb><rp>(</rp><rt>挖坑</rt><rp>)</rp></ruby> 了一次 😂😂😂</p>
</div>
MediaWiki 网站搬家记2016-05-30T00:00:00+08:002016-05-30T00:00:00+08:00ホロtag:None,2016-05-30:/mediawiki/mediawiki_move_note.html
<p>如何把 MediaWiki 网站搬到另外一个服务器上?</p>
<p><del>这篇纯粹是来凑数的2333~</del></p>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id5">第一步:备份数据库 ......</a></h2>
<p>说实话咱只用过 MySQL/MariaDB 😂,所以 <code class="code">
mysqldump</code>
解决 😂</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># 这里用了一个重定向标准输出到某个文件</span></span>
<span class="code-line"><span class="c1"># mysqldump [连接数据库的各种选项,例如用户名啥的] [数据库名称] > somefile.sql</span></span>
<span class="code-line">$ mysqldump -u wikiuser -p somedb > somefile.sql</span>
</pre></div>
<p>然后输入密码,稍等片刻就会发现汝的当前目录下多了个文件 (例如 somefile.sql ),这就是导出的数据库啦~</p>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id6">第二步:传输文件</a></h2>
<p>假设汝的 MediaWiki 安装在 <code class="code">
/path/to/mediawiki</code>
😂</p>
<p>如果汝能物理访问汝的两台服务器,
那就直接把 <code class="code">
/path/to/mediawiki</code>
和上一步备份的 SQL 转储复制过去不就好啦~ (╯・ω・)╯ ┻━┻</p>
<p>或者如果汝能用 …</p></div>
<p>如何把 MediaWiki 网站搬到另外一个服务器上?</p>
<p><del>这篇纯粹是来凑数的2333~</del></p>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id5">第一步:备份数据库 ......</a></h2>
<p>说实话咱只用过 MySQL/MariaDB 😂,所以 <code class="code">
mysqldump</code>
解决 😂</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># 这里用了一个重定向标准输出到某个文件</span></span>
<span class="code-line"><span class="c1"># mysqldump [连接数据库的各种选项,例如用户名啥的] [数据库名称] > somefile.sql</span></span>
<span class="code-line">$ mysqldump -u wikiuser -p somedb > somefile.sql</span>
</pre></div>
<p>然后输入密码,稍等片刻就会发现汝的当前目录下多了个文件 (例如 somefile.sql ),这就是导出的数据库啦~</p>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id6">第二步:传输文件</a></h2>
<p>假设汝的 MediaWiki 安装在 <code class="code">
/path/to/mediawiki</code>
😂</p>
<p>如果汝能物理访问汝的两台服务器,
那就直接把 <code class="code">
/path/to/mediawiki</code>
和上一步备份的 SQL 转储复制过去不就好啦~ (╯・ω・)╯ ┻━┻</p>
<p>或者如果汝能用 SSH 连接两台服务器的话,可以试试这个:</p>
<div class="highlight"><pre><span class="code-line"><span></span>tar czf - /path/to/mediawiki <span class="p">|</span> ssh username@server tar xzf - -C /path/to/mediawiki</span>
</pre></div>
<p>这一行命令做了这些:</p>
<ul class="simple">
<li><dl class="first docutils">
<dt>把 /path/to/mediawiki 打包成归档文件,不过输出到标准输出.</dt>
<dd><del>(千万别说汝不知道啥叫管道以及管道怎么用)</del> 😂</dd>
</dl>
</li>
<li>通过 ssh 连接到目标服务器.后面是连接到服务器上以后执行的命令.</li>
<li>后面的 tar 命令解开一个归档文件,中间孤独的 hyphen ("-") 表示要解开的文件来自标准输入. <code class="code">
-C</code>
参数用于改变解开到的目录.</li>
</ul>
<p>别忘了把转储的数据库文件也 copy 过去😂</p>
<p>然后输入密码,稍等片刻 again ......</p>
<p>如果不行的话,那就传统的 FTP Copy 过去,就是可能慢点 😂</p>
</div>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id7">第三步: 还原数据库备份</a></h2>
<p>mysql (MariaDB 也是这个命令):</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># 这里用了一个重定向某个文件到标准输入</span></span>
<span class="code-line"><span class="c1"># mysql -u [用户名] -p [数据库名] < somefile.sql</span></span>
<span class="code-line">$ mysql -u wikiuser -p somedb < somefile.sql</span>
</pre></div>
</div>
<div class="section" id="id4">
<h2><a class="toc-backref" href="#id8">一些收尾工作</a></h2>
<ul class="simple">
<li>数据库连接信息变了就去 <code class="code">
LocalSettings.php</code>
里改😏</li>
<li>连外网的就去改 DNS 😂</li>
</ul>
<p>好了大概就是这个 <del>鬼</del> 样子😂😂</p>
</div>
入手 Surface Book2016-05-11T00:00:00+08:002016-05-13T00:00:00+08:00ホロtag:None,2016-05-11:/arch-linux/get_surface_book.html
<p><del>这可不是oo什么的......</del> 😂😂</p>
<p>简单说就是咱搞了台 Surface Book 回来 (不是顶配所以不要说咱土豪啦😂😂</p>
<div class="section" id="windows">
<h2><a class="toc-backref" href="#id2">搞 Windows _(:з」∠)_</a></h2>
<ul class="simple">
<li>升级到了最新的预览版 ( 用 Microsoft 账户登录就好)</li>
<li>装了 Office 2016 (汝会明白为啥的😏</li>
<li>把 osu! 复制到了 Surface Book 上 (用 Surface Pen 玩 osu! 的感觉真是酸爽😏</li>
</ul>
<p>当然作为 Arch Linux 用户怎么不会去装 Arch Linux 呐?</p>
<ul>
<li><p class="first">于是和 <a class="reference external" href="https://blog.yoitsu.moe/linux/linux_newbie_mixboot.html">上篇文章</a> 一样,用 Windows 内置的磁盘管理收缩了一个空闲分区出来. <(ノ=﹁"﹁=)ノ┻━┻</p>
</li>
<li><p class="first">因为懒得用 hashtool 给内核签名,于是咱直接关了安全启动 …</p></li></ul></div>
<p><del>这可不是oo什么的......</del> 😂😂</p>
<p>简单说就是咱搞了台 Surface Book 回来 (不是顶配所以不要说咱土豪啦😂😂</p>
<div class="section" id="windows">
<h2><a class="toc-backref" href="#id2">搞 Windows _(:з」∠)_</a></h2>
<ul class="simple">
<li>升级到了最新的预览版 ( 用 Microsoft 账户登录就好)</li>
<li>装了 Office 2016 (汝会明白为啥的😏</li>
<li>把 osu! 复制到了 Surface Book 上 (用 Surface Pen 玩 osu! 的感觉真是酸爽😏</li>
</ul>
<p>当然作为 Arch Linux 用户怎么不会去装 Arch Linux 呐?</p>
<ul>
<li><p class="first">于是和 <a class="reference external" href="https://blog.yoitsu.moe/linux/linux_newbie_mixboot.html">上篇文章</a> 一样,用 Windows 内置的磁盘管理收缩了一个空闲分区出来. <(ノ=﹁"﹁=)ノ┻━┻</p>
</li>
<li><p class="first">因为懒得用 hashtool 给内核签名,于是咱直接关了安全启动:</p>
<blockquote>
<p>开机时按住音量加键和电源键进入 Sueface UEFI,在 "Security" 一节里把 "Secure Boot" 设置成 "Disabled" 就好.</p>
</blockquote>
</li>
</ul>
</div>
<div class="section" id="arch-linux">
<h2><a class="toc-backref" href="#id3">装 Arch Linux ~(>_<~)</a></h2>
<p>因为咱原来有个装着 Arch Linux 的移动硬盘,所以咱就计划直接把移动硬盘上的 Arch Linux 复制到 Surface Book 上.</p>
<p>但是因为 Linux 里其实是有些虚拟文件系统 ( 例如 <code class="code">
/dev</code>
, <code class="code">
/proc</code>
一类的 ),
所以只好先用另一个 Arch Linux 的 Live ISO 启动 (╯ ̄皿 ̄)╯ ┻━┻</p>
<blockquote>
截至咱写这篇文章的时候, Arch ISO 里的内核 ( 像是4.4? ) 没法驱动 Surface Book 的键盘底座,所以坠吼搞一个 USB 键盘 😂</blockquote>
<ul class="simple">
<li>首先按照 <a class="reference external" href="https://wiki.archlinux.org/index.php/Beginners%27_guide">ArchWiki 的 Beginning Guide</a> ,把刚刚分配出来的空闲空间新建一个分区.</li>
<li>然后把原来的 Arch Linux 分区和新的分区挂载到两个位置 (假设源分区是 <code class="code">
/mnt</code>
,目标分区是 <code class="code">
/target</code>
)</li>
<li>接下来用 rsync 来同步内容:</li>
</ul>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># rsync的 -a 参数表示 "归档" 选项.</span></span>
<span class="code-line"><span class="c1"># -A 是保留 :ruby:`ACL|访问控制列表`</span></span>
<span class="code-line"><span class="c1"># -X 是保留扩展属性</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="c1"># rsync -aAX /mnt/ /target</span></span>
</pre></div>
<ul class="simple">
<li>然后如果有需要,参照 <a class="reference external" href="https://wiki.archlinux.org/index.php/Installation_guide">Installation Guide</a> 调整一下其他的参数.</li>
<li>后来从 AUR 编译了 <a href="https://aur.archlinux.org/packages/?O=0&K=linux-surfacepro3" title="在 AUR 上搜索linux-surfacepro3">linux-surfacepro3 <sup>AUR</sup> </a> 内核,键盘和触控板就可以用了. 😶</li>
</ul>
<p>最后上一张图 😂</p>
<img alt="最后上一张图" class="materialboxed responsive-img" src="/images/surfacebook.jpg"/>
</div>
浅说基于 Linux 内核的操作系统 (7) - 双系统 Tips & Tricks2016-05-09T00:00:00+08:002016-05-09T00:00:00+08:00ホロtag:None,2016-05-09:/linux/linux_newbie_mixboot.html
<p>终于决定跳出虚拟机啦~</p>
<div class="section" id="linux">
<h2><a class="toc-backref" href="#id6">到底是啥原因让汝决定在自己的电脑上装 Linux 咧?</a></h2>
<p>简单来说有下面两点:</p>
<ul class="simple">
<li>虚拟机的性能不足 <del>(卡卡的很贴心)</del></li>
<li>认为自己积累了一定的经验,希望再向前一步呗~</li>
</ul>
</div>
<div class="section" id="act-1-bios-uefi">
<h2><a class="toc-backref" href="#id7">Act 1:该知道汝的电脑是 BIOS 还是 UEFI 启动了呗~</a></h2>
<p>如果不知道的话,😋</p>
<ul class="simple">
<li>首先打开设置 ( Windows 8/8.1 叫做 "电脑设置"),然后通过 "更新和恢复" -> "恢复" -> "高级启动" 重启电脑.</li>
</ul>
<p>如果是 UEFI 启动的话,大概是这个样子:</p>
<img alt="UEFI 系统启动之后大概像这样" class="materialboxed responsive-img" src="/images/Linux_mixboot/0.png"/>
<p>没错就是有个 "使用设备" 的选项 😂</p>
</div>
<div class="section" id="act-2">
<h2><a class="toc-backref" href="#id8">Act 2:在硬盘上准备一块空闲空间</a></h2>
<p>不然要把 Linux 装到哪里去呐?</p>
<p>这里拿来演示的是 Windows 7 以后都自带的 “磁盘管理” 程序,应该能解决大多数问题 _ …</p></div>
<p>终于决定跳出虚拟机啦~</p>
<div class="section" id="linux">
<h2><a class="toc-backref" href="#id6">到底是啥原因让汝决定在自己的电脑上装 Linux 咧?</a></h2>
<p>简单来说有下面两点:</p>
<ul class="simple">
<li>虚拟机的性能不足 <del>(卡卡的很贴心)</del></li>
<li>认为自己积累了一定的经验,希望再向前一步呗~</li>
</ul>
</div>
<div class="section" id="act-1-bios-uefi">
<h2><a class="toc-backref" href="#id7">Act 1:该知道汝的电脑是 BIOS 还是 UEFI 启动了呗~</a></h2>
<p>如果不知道的话,😋</p>
<ul class="simple">
<li>首先打开设置 ( Windows 8/8.1 叫做 "电脑设置"),然后通过 "更新和恢复" -> "恢复" -> "高级启动" 重启电脑.</li>
</ul>
<p>如果是 UEFI 启动的话,大概是这个样子:</p>
<img alt="UEFI 系统启动之后大概像这样" class="materialboxed responsive-img" src="/images/Linux_mixboot/0.png"/>
<p>没错就是有个 "使用设备" 的选项 😂</p>
</div>
<div class="section" id="act-2">
<h2><a class="toc-backref" href="#id8">Act 2:在硬盘上准备一块空闲空间</a></h2>
<p>不然要把 Linux 装到哪里去呐?</p>
<p>这里拿来演示的是 Windows 7 以后都自带的 “磁盘管理” 程序,应该能解决大多数问题 _(:з」∠)_</p>
<ul class="simple">
<li>Windows 8 以后的系统可以通过按下 Windows + X 的菜单里找到 “磁盘管理”</li>
</ul>
<img alt="磁盘管理在这~" class="materialboxed responsive-img" src="/images/Linux_mixboot/1.png"/>
<ul class="simple">
<li>嗯,大概就是这样子的呗 (虽然具体的磁盘分区可能和咱的不一样)</li>
</ul>
<img alt="大概长这样~" class="materialboxed responsive-img" src="/images/Linux_mixboot/2.png"/>
<ul class="simple">
<li>汝哪个硬盘分区比较空闲? 右键点击它,有一个"压缩卷的选项"</li>
</ul>
<img alt="”压缩卷“ 在这~" class="materialboxed responsive-img" src="/images/Linux_mixboot/3.png"/>
<ul class="simple">
<li>输入压缩的大小 _(:з」∠)_</li>
</ul>
<img alt="多少" class="materialboxed responsive-img" src="/images/Linux_mixboot/4.png"/>
<ul class="simple">
<li>然后就多了一块未分配的空间 😂</li>
</ul>
<img alt="多了一块未分配的空间" class="materialboxed responsive-img" src="/images/Linux_mixboot/5.png"/>
<p>如果汝的硬盘分区有些刁钻而磁盘管理没法解决的话,AOMEI 家的分区助手不错, <a class="reference external" href="http://disktool.cn">这是官方网站</a> ,
<a class="reference external" href="http://disktool.cn/jiaocheng/index.html">这是分区教程</a></p>
</div>
<div class="section" id="act-3">
<h2><a class="toc-backref" href="#id9">Act 3:准备安装介质</a></h2>
<p>其实基本上用的都是 U盘啦~</p>
<p>于是继续推荐编程随想的
<a class="reference external" href="https://program-think.blogspot.com/2013/12/create-bootable-usb-stick-from-iso.html">如何用 ISO 镜像制作 U 盘安装盘(通用方法、无需 WinPE)</a></p>
<p><del>啥时候咱自己写一篇类似的......</del> 😂😂</p>
</div>
<div class="section" id="act-4-uefi">
<h2><a class="toc-backref" href="#id10">Act 4:(UEFI 专属环节 (雾)) 关掉安全启动</a></h2>
<div class="section" id="id3">
<h3><a class="toc-backref" href="#id11">啥是安全启动? 为啥要关掉咧?</a></h3>
<blockquote>
<p>安全启动是一个由电脑行业的成员开发的安全标准,它有助于确保仅使用受制造商信任的软件启动你的电脑。</p>
<p>当电脑启动时,固件会检查每个启动软件的数字签名,包括固件驱动器(选项 ROM)和操作系统。如果签名正常,则电脑启动,而且固件会将控制权交给操作系统。</p>
</blockquote>
<p>然而默认情况下预装 Windows 的电脑中只会默认带有 Microsoft 的签名,而不是所有的 Linux 发行版都有能力获得签名的 Pia!<(=o ‵-′)ノ☆</p>
<p>所以就要关掉啦~ 😂😂</p>
</div>
<div class="section" id="id4">
<h3><a class="toc-backref" href="#id12">那么怎么关咧?</a></h3>
<p>不过各种硬件实在是太多啦,咱实在是没法一一列举嘛~</p>
<ul class="simple">
<li><a class="reference external" href="https://technet.microsoft.com/zh-cn/library/dn481258.aspx">Microsoft 提供的概述</a></li>
<li>对于预装 Windows 的电脑,最好去看看生产商的支持网站.</li>
<li>或者可以 Google 一下 ~(>_<~)</li>
</ul>
<hr class="docutils"/>
<p>然后就是开始安装啦~如果遇到问题的话,先学习一下
<a class="reference external" href="https://github.com/FredWe/How-To-Ask-Questions-The-Smart-Way/blob/master/README-zh_CN.md">提问的智慧</a> ,
然后去汝安装的发行版的支持论坛问问呗~</p>
</div>
</div>
火狐娘兼职 RSS 阅读器~2016-04-28T00:00:00+08:002016-04-28T00:00:00+08:00ホロtag:None,2016-04-28:/tech_misc/firefox_rss_reader.html
<p><del>火狐娘也可以兼职做 RSS 阅读器呐~</del></p>
<p>Firefox 67 已经砍掉 RSS 的支持啦,所以这篇文章就没用了……</p>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id4">啥? 又来问啥是 RSS ??</a></h2>
<p>如果连 RSS 是啥都不知道那这篇文章就不用看了 (╯>_<)╯ ┻━┻</p>
<blockquote>
「自知之明者,谓之贤也。」</blockquote>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id5">让火狐娘兼职 RSS 阅读器的好处和问题是啥咧?</a></h2>
<ul class="simple">
<li>好处:又可以少开一个应用啦~ ( 不过对于用 Owncloud News 的咱来说好像没啥区别😂😂</li>
<li>问题:好像没有大多数 RSS 阅读器那样把所有的文章安排在一个流里的功能 _(:з」∠)_</li>
</ul>
</div>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id6">咱们来开始呗~</a></h2>
<p>首先打开汝的 Firefox 😂😂 , 在右边的长条菜单里找到那个孤零零 (?) 的 "定制" 选项.</p>
<img alt="定制在这~" class="materialboxed responsive-img" src="/images/Firefox_rss/1.png"/>
<p>在左边就可以看到"订阅"按钮啦,把它拉到工具栏或者菜单里呗~ <del>(订阅:我在这快来拉我~)</del></p>
<img alt="订阅:我在这快来拉我~" class="materialboxed responsive-img" src="/images/Firefox_rss/2.png"/>
<p>然后打开一个博客 ( 例如 百合仙子 …</p></div>
<p><del>火狐娘也可以兼职做 RSS 阅读器呐~</del></p>
<p>Firefox 67 已经砍掉 RSS 的支持啦,所以这篇文章就没用了……</p>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id4">啥? 又来问啥是 RSS ??</a></h2>
<p>如果连 RSS 是啥都不知道那这篇文章就不用看了 (╯>_<)╯ ┻━┻</p>
<blockquote>
「自知之明者,谓之贤也。」</blockquote>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id5">让火狐娘兼职 RSS 阅读器的好处和问题是啥咧?</a></h2>
<ul class="simple">
<li>好处:又可以少开一个应用啦~ ( 不过对于用 Owncloud News 的咱来说好像没啥区别😂😂</li>
<li>问题:好像没有大多数 RSS 阅读器那样把所有的文章安排在一个流里的功能 _(:з」∠)_</li>
</ul>
</div>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id6">咱们来开始呗~</a></h2>
<p>首先打开汝的 Firefox 😂😂 , 在右边的长条菜单里找到那个孤零零 (?) 的 "定制" 选项.</p>
<img alt="定制在这~" class="materialboxed responsive-img" src="/images/Firefox_rss/1.png"/>
<p>在左边就可以看到"订阅"按钮啦,把它拉到工具栏或者菜单里呗~ <del>(订阅:我在这快来拉我~)</del></p>
<img alt="订阅:我在这快来拉我~" class="materialboxed responsive-img" src="/images/Firefox_rss/2.png"/>
<p>然后打开一个博客 ( 例如 百合仙子 <a class="reference external" href="/links.html#lilydjwg">lilydjwg</a> 的 <a class="reference external" href="https://blog.lilydjwg.me">https://blog.lilydjwg.me</a> )</p>
<img alt="举一个栗子~" class="materialboxed responsive-img" src="/images/Firefox_rss/4.png"/>
<p>如果这个网站有 RSS 的话 , RSS 那个图标就会亮起来,就像上面那样~</p>
<hr class="docutils"/>
<blockquote>
<p>那么这个具体是咋实现的呢? 原理就在于这段 HTML 代码上~</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="p"><</span><span class="nt">link</span> <span class="na">href</span><span class="o">=</span><span class="s">"https://blog.lilydjwg.me/posts.rss"</span> <span class="na">rel</span><span class="o">=</span><span class="s">"alternate"</span> <span class="na">title</span><span class="o">=</span><span class="s">"Blog RSS"</span> <span class="na">type</span><span class="o">=</span><span class="s">"application/rss+xml"</span> <span class="p">/></span></span>
</pre></div>
<p>这段链接到了一个 MIME 类型是 application/rss+xml 的文件呐~ 所以火狐娘看到这个就知道这个网站有 RSS 可以看了呢~</p>
<p>除了 RSS 以外火狐娘还认得 <ruby><rb>Atom Syndication Format</rb><rp>(</rp><rt>Atom供稿格式</rt><rp>)</rp></ruby> 的标准哟~ ( 虽然也是 RSS 阅读器们的必修课 ~(>_<~) ), 像这样:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="p"><</span><span class="nt">link</span> <span class="na">href</span><span class="o">=</span><span class="s">"/feeds/all.atom.xml"</span> <span class="na">type</span><span class="o">=</span><span class="s">"application/atom+xml"</span> <span class="na">rel</span><span class="o">=</span><span class="s">"alternate"</span> <span class="na">title</span><span class="o">=</span><span class="s">"约伊兹的萌狼乡手札 Full Atom Feed"</span> <span class="p">/></span></span>
</pre></div>
</blockquote>
<p>如果有时 RSS 源不止一个,就挑一个呗~ ( 比如第一个 )</p>
<img alt="有时 RSS 源不止一个......" class="materialboxed responsive-img" src="/images/Firefox_rss/5.png"/>
<p>然后汝就会打开一个这样的页面呗~ 其实还可以支持其它方式 ( 例如 Owncloud 新闻阅读器 ) 订阅收取点,不过这次咱就用火狐娘的固有技能 "实时书签" 呗~</p>
<img alt="FireFox 解析的 RSS 页面~" class="materialboxed responsive-img" src="/images/Firefox_rss/6.png"/>
<hr class="docutils"/>
<img alt='使用 "实时书签" 订阅收取点' class="materialboxed responsive-img" src="/images/Firefox_rss/7.png"/>
<p>实时书签大概像这样,如果汝订阅的网站更新了的话文件夹和每篇文章旁边的 RSS 图标会亮起来的啦~</p>
<img alt="实时书签长这样~" class="materialboxed responsive-img" src="/images/Firefox_rss/8.png"/>
<p>当然如果汝习惯 RSS 那种文章流,把 RSS 页面加为书签呗~</p>
<img alt="把 RSS 页面加为书签呗~" class="materialboxed responsive-img" src="/images/Firefox_rss/9.png"/>
</div>
权限的边界-关于社区的一些无关思考2016-04-26T00:00:00+08:002016-04-26T00:00:00+08:00ホロtag:None,2016-04-26:/life/privilege_border.html
<p>权限到底有没有边界?如果有的话,又在哪里?</p>
<div class="section" id="ooxx">
<h2><a class="toc-backref" href="#id6">为了避免oo和xx,先来个前提声明呗~</a></h2>
<ul class="simple">
<li>咱绝对没有炮轰文中提到的人 <del>(或非人)</del> 的意思,虽然他/她/它们之间曾经 (或是现在正在) 有过节. <del>但是这和咱又有啥关系呐~</del></li>
<li>建议汝先读读 <a class="reference external" href="https://program-think.blogspot.com/2014/02/freedom-of-speech.html?m=0">政治常识扫盲:澄清“言论自由”的各种误区</a> 这篇文章来扫除一下汝内心中可能存在的几个误区呗~</li>
<li>由于各种原因这篇文章可能写的很长?</li>
<li>......</li>
</ul>
</div>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id7">从一件小事开始?</a></h2>
<p>前几天 <a class="reference external" href="//webchat.freenode.net/?channels=archlinux-cn">#archlinux-cn</a> 的 <a class="reference external" href="/links.html#farseerfc">farseerfc</a> 在 Telegram 上创建了一个日语学习群,虽然一开始加的人挺多的,但是......</p>
<p>请原谅咱一字不落的贴出聊天记录 ( 至少是现在,如果将来有人要求删掉又是另一回事了</p>
<p>Star Brilliant , [27.04.16 04:50]
刚刚是谁踢我的</p>
<p>Star Brilliant , [27.04.16 04:50]
某卷 …</p></div>
<p>权限到底有没有边界?如果有的话,又在哪里?</p>
<div class="section" id="ooxx">
<h2><a class="toc-backref" href="#id6">为了避免oo和xx,先来个前提声明呗~</a></h2>
<ul class="simple">
<li>咱绝对没有炮轰文中提到的人 <del>(或非人)</del> 的意思,虽然他/她/它们之间曾经 (或是现在正在) 有过节. <del>但是这和咱又有啥关系呐~</del></li>
<li>建议汝先读读 <a class="reference external" href="https://program-think.blogspot.com/2014/02/freedom-of-speech.html?m=0">政治常识扫盲:澄清“言论自由”的各种误区</a> 这篇文章来扫除一下汝内心中可能存在的几个误区呗~</li>
<li>由于各种原因这篇文章可能写的很长?</li>
<li>......</li>
</ul>
</div>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id7">从一件小事开始?</a></h2>
<p>前几天 <a class="reference external" href="//webchat.freenode.net/?channels=archlinux-cn">#archlinux-cn</a> 的 <a class="reference external" href="/links.html#farseerfc">farseerfc</a> 在 Telegram 上创建了一个日语学习群,虽然一开始加的人挺多的,但是......</p>
<p>请原谅咱一字不落的贴出聊天记录 ( 至少是现在,如果将来有人要求删掉又是另一回事了</p>
<p>Star Brilliant , [27.04.16 04:50]
刚刚是谁踢我的</p>
<p>Star Brilliant , [27.04.16 04:50]
某卷?</p>
<p>teleboto, [27.04.16 04:50]
[u] 同被踢</p>
<p>ヨイツの賢狼ホロ 😋(🍎*), [27.04.16 04:50]
😂</p>
<p>Star Brilliant , [27.04.16 04:50]
搞得好像那群是他家似的</p>
<p>Star Brilliant , [27.04.16 04:50]
我进到群里看到他在说话都没说什么</p>
<p>Star Brilliant , [27.04.16 04:50]
大不了不打理得了</p>
<p>Star Brilliant , [27.04.16 04:51]
私事公办很不对吧</p>
<p>ヨイツの賢狼ホロ 😋(🍎*), [27.04.16 04:51]
😂😂😂</p>
<p>Henry King, [27.04.16 04:51]
@m13253 他的意思是你进群之后秀水平了</p>
<p>Star Brilliant , [27.04.16 04:51]
[In reply to Henry King]
哦?</p>
<p>ヨイツの賢狼ホロ 😋(🍎*), [27.04.16 04:52]
[In reply to jm33_m0]
😂😂</p>
<p>Star Brilliant , [27.04.16 04:52]
因为我“有一点基础所以不应该学习”</p>
<p>Star Brilliant , [27.04.16 04:52]
如果那个群他是管理员我就不管了</p>
<p>farseerfc 😂 0xC13D4796, [27.04.16 04:52]
他是管理員啊,我和他一起開的……</p>
<p>Star Brilliant , [27.04.16 04:52]
或者说如果那个群是他办的我就无所谓了</p>
<p>Star Brilliant , [27.04.16 04:52]
[In reply to farseerfc 😂 0xC13D4796]
那我就不管了</p>
<p>Star Brilliant , [27.04.16 04:53]
总之我和他有仇</p>
<p>ヨイツの賢狼ホロ 😋(🍎*), [27.04.16 04:53]
/me 默默的围观就好了😂</p>
<p>Star Brilliant , [27.04.16 04:53]
而我现在出现在 #archlinux-cn 的原因,正是因为这个群不是他自己加的</p>
<p>Star Brilliant , [27.04.16 04:53]
自己家的</p>
<p>teleboto, [27.04.16 04:53]
[u] 我进去似乎不到一分钟……</p>
<p>ヨイツの賢狼ホロ 😋(🍎*), [27.04.16 04:53]
(但是话说回来咱可没秀水平啊😂</p>
<p>Star Brilliant , [27.04.16 04:53]
“开始踢人”,砰!消失了</p>
<p>ヨイツの賢狼ホロ 😋(🍎*), [27.04.16 04:54]
[In reply to Star Brilliant ]
和 @acgtyrant 一样 😂</p>
<p>Star Brilliant , [27.04.16 04:54]
[In reply to ヨイツの賢狼ホロ 😋(🍎*)]
我想你不知道5年前那个盖子/opensuse事件</p>
<p>ヨイツの賢狼ホロ 😋(🍎*), [27.04.16 04:55]
[In reply to Star Brilliant ]
/me 咱就是把Telegram放在后台一会儿😂</p>
<p>ヨイツの賢狼ホロ 😋(🍎*), [27.04.16 04:55]
[In reply to Star Brilliant ]
前一阵子翻暴君的老Arch博客来着😂</p>
<p>wicast C, [27.04.16 04:56]
群关了!!?</p>
<p>wicast C, [27.04.16 04:56]
洗个碗就不见了🌚</p>
<p>Henry King, [27.04.16 04:56]
[In reply to Star Brilliant ]
😅 五年前啊。那个时候我还没怎么用 G+。</p>
<p>逐光入暗 TJM ¦ PGP 9F6B2D7D, [27.04.16 04:56]
[In reply to Star Brilliant ]
求科普</p>
<p>teleboto, [27.04.16 04:56]
[LastAvengers] u: 日语群么?</p>
<p>Star Brilliant , [27.04.16 04:56]
[In reply to 逐光入暗 TJM ¦ PGP 9F6B2D7D]
这里不方便说</p>
<p>paco tacitus, [27.04.16 04:57]
[In reply to Star Brilliant ]
啥事件?</p>
<p>ヨイツの賢狼ホロ 😋(🍎*), [27.04.16 04:57]
五年前咱还是Debian用户😂</p>
<p>逐光入暗 TJM ¦ PGP 9F6B2D7D, [27.04.16 04:57]
[In reply to Star Brilliant ]
口以私了</p>
<p>Star Brilliant , [27.04.16 04:57]
[In reply to 逐光入暗 TJM ¦ PGP 9F6B2D7D]
我建议你问盖子本人</p>
<p>paco tacitus, [27.04.16 04:57]
我私聊不了</p>
<p>逐光入暗 TJM ¦ PGP 9F6B2D7D, [27.04.16 04:57]
[In reply to Star Brilliant ]
O.O</p>
<p>Star Brilliant , [27.04.16 04:57]
因为我不知道事情的(完整)前因,但是知道后果</p>
<p>paco tacitus, [27.04.16 04:57]
[In reply to Star Brilliant ]
能google吗</p>
<p>高坂 きりの, [27.04.16 04:58]
五年前是2011吗</p>
<p>Star Brilliant , [27.04.16 04:58]
[In reply to paco tacitus]
ない,大部分文字记录被“逼迫要求删除”了</p>
<p>高坂 きりの, [27.04.16 04:58]
关键字搜不到啊</p>
<p>Star Brilliant , [27.04.16 04:59]
大部分情况下,我会选择少一点人际关系的问题</p>
<p>Star Brilliant , [27.04.16 04:59]
钻研技术就好</p>
<p>Felix Yan, [27.04.16 04:59]
🌚 五年前……那时候盖子还很小吧(捂脸</p>
<p>teleboto, [27.04.16 05:01]
[u] LastAvengers: tg太伤人了😢😢</p>
<p>teleboto, [27.04.16 05:03]
[phoenixlzx] 我已經不知道该说什么好了,一个认真的学习群一群人在里面开始瞎扯,被踢了就开始自己瞎猜然后翻我旧账,翻旧帐也就罢了这么多年了也没查证过到底是谁的问题</p>
<p>Star Brilliant , [27.04.16 05:04]
“瞎扯”</p>
<p>paco tacitus, [27.04.16 05:06]
就搜到了关于yum作者去世的事。。比尔盖子?</p>
<p>Star Brilliant , [27.04.16 05:07]
[In reply to paco tacitus]
都是徒劳,该毁灭的都毁灭了</p>
<p>Star Brilliant , [27.04.16 05:07]
我还留存一份然而可能找不到了</p>
<p>Star Brilliant , [27.04.16 05:07]
没必要翻旧账了</p>
<p>paco tacitus, [27.04.16 05:07]
奇怪</p>
<p>paco tacitus, [27.04.16 05:07]
好吧</p>
<p>Star Brilliant , [27.04.16 05:07]
因为我不想劝说任何人改变对任何人/事物的看法</p>
<p>teleboto, [27.04.16 05:07]
[phoenixlzx] 然而刚才你就在这么做</p>
<p>Star Brilliant , [27.04.16 05:08]
我不希望你们因为听说了这些事情而对中国开源社区产生什么不好的印象</p>
<p>teleboto, [27.04.16 05:08]
[phoenixlzx] 而且五年前你也在这么做</p>
<p>paco tacitus, [27.04.16 05:08]
🌚👍</p>
<p>teleboto, [27.04.16 05:10]
[phoenixlzx] 再回来说这个日语群,本来也只是我自己想学而已,死皮赖脸去找fc前辈来带路,结果突然就来了一群人在聊东聊西,还有自以为比别人优秀就在秀的,这个群还怎么学习</p>
<p>teleboto, [27.04.16 05:11]
[phoenixlzx] 一堆呆在日本几年的人拉进来帮忙的,都还没说话呢</p>
<p>Star Brilliant , [27.04.16 05:11]
简直</p>
<p>David Huang, [27.04.16 05:11]
🌚</p>
<p>teleboto, [27.04.16 05:12]
[phoenixlzx] 不要太把自己当大爷了</p>
<p>paco tacitus, [27.04.16 05:12]
好吧。。我搜到那个事了🌚</p>
<p>paco tacitus, [27.04.16 05:12]
有点过分</p>
<p>ヨイツの賢狼ホロ 😋(🍎*), [27.04.16 05:12]
[ 😂 (sticker) ]</p>
<p>Star Brilliant , [27.04.16 05:14]
[In reply to teleboto]
我想告诉你的是,因为种种原因,我B了你,然而我在群里看到你存在的时候都“宽容”(暂且这么说)地忍了,你的做法真的合适么?</p>
<p>Star Brilliant , [27.04.16 05:14]
“聊东聊西”得说出点证据</p>
<p>Star Brilliant , [27.04.16 05:14]
至于某旧账,我也不想多说</p>
<p>Star Brilliant , [27.04.16 05:15]
本来我是想点到为止,你自己一个人知道就好</p>
<p>Star Brilliant , [27.04.16 05:15]
毕竟群里其他人都不知道这个事情</p>
<p>Star Brilliant , [27.04.16 05:15]
有人问我这个事情到底怎么回事的时候我也没说</p>
<p>teleboto, [27.04.16 05:15]
[phoenixlzx] 首先这个群是我和fc开的,我B你的时候你还没B我呢知道伐?本来我也可以看到你进来就直接踢掉你然而还是觉得既然来学习也就算了</p>
<p>teleboto, [27.04.16 05:16]
[phoenixlzx] 结果呢</p>
<p>Star Brilliant , [27.04.16 05:16]
你应该知道我b人一般不会点击“b”</p>
<p>Star Brilliant , [27.04.16 05:16]
而是肉眼打码</p>
<p>Star Brilliant , [27.04.16 05:16]
结果怎么</p>
<p>teleboto, [27.04.16 05:16]
[phoenixlzx] 我不管你怎么样 那是你自己的权利和我无关</p>
<p>Star Brilliant , [27.04.16 05:16]
结果我说了什么跑题的话了么?</p>
<p>Star Brilliant , [27.04.16 05:17]
那就无关好了</p>
<p>Star Brilliant , [27.04.16 05:18]
我不想刁难你</p>
<p>Star Brilliant , [27.04.16 05:18]
我也不希望你刁难</p>
<p>Star Brilliant , [27.04.16 05:18]
我</p>
<p>Star Brilliant , [27.04.16 05:19]
过往的恩怨也无所谓</p>
</div>
<div class="section" id="id4">
<h2><a class="toc-backref" href="#id8">那么,来大致梳理一下情况呗~</a></h2>
<ul class="simple">
<li>farseerfc 在 Telegram 上创建了一个日语学习群.然后在 #archlinux-cn 邀请加入.</li>
<li>因为 fc 的邀请有好几个人加入了 (比如咱)</li>
<li>一开始在试着用日语交流,还挺正常. (不过咱就是一直在发表情 😂😂)</li>
<li>(然后咱把 Telegram 最小化到后台了一阵子)</li>
<li>再打开发现咱已经被移除出群了 (当然不止咱一个)</li>
<li>然后就是上面那些聊天记录了😂😂</li>
</ul>
</div>
<div class="section" id="id5">
<h2><a class="toc-backref" href="#id9">一些不负责小分析 _(:з」∠)_</a></h2>
<ul>
<li><p class="first">那个群是 farseerfc 开的, 然后给了 phoenixlzx Administrator,姑且算他俩的私人空间</p>
<blockquote>
<p>因为不满足公共空间的第一个特征:"不属于任何个人,不属于任何组织/机构。"</p>
</blockquote>
</li>
<li><p class="first">很显然,因为是私人空间,所以其他人有没有言论自由,要看管理员是否愿意给.</p>
</li>
<li><p class="first">然后,因为是学习向群组,一定不希望被无关内容打扰.(这个好像大家都默许)</p>
</li>
<li><p class="first">最后,因为太多人开始跑题于是 phoenixlzx 开始把某些她认为造成跑题的人移出群.</p>
</li>
<li><p class="first">对此创建者 farseerfc 既没有表示反对又没有采取补救措施?</p>
<blockquote>
<p>当然也是因为被移除的人都没有要求再回去的缘故,所以咱认为这不是 fc 的锅</p>
</blockquote>
</li>
<li><p class="first">就是这样, <del>事实已经说明了一切</del></p>
</li>
</ul>
<p>于是咱自己的结论如下:</p>
<ul>
<li><p class="first">如果只发表情和 sticker 算是对消息流的干扰而导致咱被移除的话,那是咱的错.</p>
</li>
<li><p class="first">但是如果 phoenixlzx 能给个更准确的解释说不定更好?</p>
<blockquote>
<p>或者他希望通过私聊解释只是因为不是双向联系人做不到 (Telegram 一大天坑 😂😂😂 )</p>
</blockquote>
</li>
<li><p class="first">不管怎么样,咱并没有对 phoenixlzx 的做法表示不满,毕竟:</p>
<blockquote>
<p>"在【别人的】私人空间有没有言论自由捏?这就要看那个私人空间的主人是否给你言论自由。如果空间的主人允许,你就有;反之,则没有。"</p>
</blockquote>
</li>
</ul>
</div>
<div class="section" id="del-del">
<h2><a class="toc-backref" href="#id10"><del>好吧下面进入自问自答环节 😂</del></a></h2>
<p>但是仔细想想还是先把问题列出来再分开回答吧 <del>(才不是没时间了呐~)</del></p>
<p>Q1 : 社区或群组要不要有规则,如果有的话,谁来制定,怎样制定?</p>
<p>Q2 : 有比一般用户更高权限的用户是否该有更高的限制?</p>
<p>Q3 : 在群组中防止信息流被无关信息干扰是不是共识,具体操作起来呐?</p>
<p>Q4 : 关于封禁或移除之类的措施要不要在事后由操作者给相关人员一个看似合理的解释?</p>
<p>Q5 : 曾经在某个项目有过节的两人能不能在另一个项目上重归于好?</p>
<p>......</p>
<hr class="docutils"/>
<p>暂时想到的就这么多,欢迎各位在下方的评论里给出自己的解答或是邮件联系咱呗~</p>
</div>
闲聊技术文章的写作姿势2016-04-23T00:00:00+08:002016-04-23T00:00:00+08:00ホロtag:None,2016-04-23:/life/talking_write_tech_blog.html
<p>不过真的有一种正确的姿势么 _(:з」∠)_</p>
<p>其实咱为啥写这个 <del>几乎全是瞎扯</del> 的博客的一个主要原因就是有时找不到合适的文章或文档 😂😂</p>
<div class="section" id="tt">
<h2><a class="toc-backref" href="#id14">所以,技术文章怎么啦~ (╯T︿T)╯ ┻━┻</a></h2>
<p>擅长前端的 <del>老司机</del> 卡夫 ( <a class="reference external" href="/links.html#frantic1048">frantic1048</a> ) 推荐了一篇叫做
<a class="reference external" href="http://remotesynthesis.com/general/2016/02/11/common-problems-with-technical-articles/">技术文章常见的 5 个问题</a>
的文章. o(* ̄3 ̄)o</p>
<p>里面提到了撰写技术文章遇到的常见的问题:</p>
<blockquote>
<ul class="simple">
<li>目的不明确。“所以,搞着些玩意儿是要干啥?”</li>
<li>文章内容太过狭窄。“噢,这篇文章只面向 20 岁的见习风系魔法学徒使用,不看了”</li>
<li>贴代码没注释。“这个野生的咒语是干啥的?”</li>
<li>前后不一致的口吻。“我感觉快要精分了 ~(>_<~)”</li>
<li>写到最后没有个结论。“(..•˘_˘•..)”</li>
</ul>
<p class="attribution">—<a class="reference external" href="https://www.zhihu.com/question/40716838/answer/88209954">frantic1048 in 知乎</a></p>
</blockquote>
<p>( ,,´・ω・)ノ"(´っω・`。)</p>
<blockquote>
提前注明一下 : 下面的栗子纯属虚构呐~ 如有雷同..... (放心这不会发生的 …</blockquote></div>
<p>不过真的有一种正确的姿势么 _(:з」∠)_</p>
<p>其实咱为啥写这个 <del>几乎全是瞎扯</del> 的博客的一个主要原因就是有时找不到合适的文章或文档 😂😂</p>
<div class="section" id="tt">
<h2><a class="toc-backref" href="#id14">所以,技术文章怎么啦~ (╯T︿T)╯ ┻━┻</a></h2>
<p>擅长前端的 <del>老司机</del> 卡夫 ( <a class="reference external" href="/links.html#frantic1048">frantic1048</a> ) 推荐了一篇叫做
<a class="reference external" href="http://remotesynthesis.com/general/2016/02/11/common-problems-with-technical-articles/">技术文章常见的 5 个问题</a>
的文章. o(* ̄3 ̄)o</p>
<p>里面提到了撰写技术文章遇到的常见的问题:</p>
<blockquote>
<ul class="simple">
<li>目的不明确。“所以,搞着些玩意儿是要干啥?”</li>
<li>文章内容太过狭窄。“噢,这篇文章只面向 20 岁的见习风系魔法学徒使用,不看了”</li>
<li>贴代码没注释。“这个野生的咒语是干啥的?”</li>
<li>前后不一致的口吻。“我感觉快要精分了 ~(>_<~)”</li>
<li>写到最后没有个结论。“(..•˘_˘•..)”</li>
</ul>
<p class="attribution">—<a class="reference external" href="https://www.zhihu.com/question/40716838/answer/88209954">frantic1048 in 知乎</a></p>
</blockquote>
<p>( ,,´・ω・)ノ"(´っω・`。)</p>
<blockquote>
提前注明一下 : 下面的栗子纯属虚构呐~ 如有雷同..... (放心这不会发生的😋</blockquote>
</div>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id15">技术文章问题之一 : 目的不明确 <(=﹁"﹁=)></a></h2>
<p><del>由于深受语文教育的毒害</del> ,一般都会认为一篇文章都要有一个主要表达的意图或是观点呗
( 没错就是那个众人寻他千百度却在灯火阑珊处的中心思想😂😂 ),
当然汝说的如果是一篇 <del>形散神聚的</del> 散文那就又是另一个怎么也解释不清的玄学了
<del>(明明是我先的......</del></p>
<p>然而实际情况是,有时容易搞不清楚文章的主题,典型的情况就是...... ( 咱给忘了 (つд⊂)</p>
<p>试想一下一个希望看到某个主题的读者在看到全篇都在讲另一个主题的时候的感觉, <del>真的好想把浪费咱时间的作者咬死 😂😂</del></p>
</div>
<div class="section" id="id4">
<h2><a class="toc-backref" href="#id16">技术文章问题之二 : 文章内容过于狭窄 ~(>_<~)</a></h2>
<p>内容过于狭窄就容易给读者 "这篇文章不适合咱" 的错觉,于是就关掉了......</p>
<p>有可能是因为很多时候自己的博客有点像自己的笔记,解决一个问题以后写一篇,于是整片文章都在讨论如何解决某一个具体的
问题,看着就 "内容过于狭窄" 了 | ω・`)</p>
<blockquote>
在这里咱要好好反省一下自己,因为咱好像一直在写像是教程一类的东西于是就没有多少深度 😂</blockquote>
</div>
<div class="section" id="id5">
<h2><a class="toc-backref" href="#id17">技术文章问题之三 : 贴代码没注释 (╯>_<)╯ ┻━┻</a></h2>
<p>写代码没注释就像汝拿着一本魔法书却不知道怎么使用呐~</p>
<blockquote>
“这个野生的咒语是干啥的?” _(:з」∠)_</blockquote>
<p>比如上面那个歪果仁提的栗子:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c"><!-- offset 2 --></span></span>
<span class="code-line">{{ range $index, $element := .Site.Pages }}</span>
<span class="code-line"> {{ if gt $index 1 }}</span>
<span class="code-line"> <span class="p"><</span><span class="nt">li</span><span class="p">></span></span>
<span class="code-line"> <span class="p"><</span><span class="nt">span</span> <span class="na">class</span><span class="o">=</span><span class="s">"date"</span><span class="p">></span>{{ .Date.Format "Jan" }}</span>
<span class="code-line"> <span class="p"><</span><span class="nt">strong</span><span class="p">></span>{{ .Date.Format "2"}}<span class="p"></</span><span class="nt">strong</span><span class="p">></</span><span class="nt">span</span><span class="p">></span></span>
<span class="code-line"> <span class="p"><</span><span class="nt">h3</span><span class="p">><</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">"link"</span><span class="p">></span>{{ .Title }}<span class="p"></</span><span class="nt">a</span><span class="p">></</span><span class="nt">h3</span><span class="p">></span></span>
<span class="code-line"> <span class="p"><</span><span class="nt">p</span><span class="p">></span>{{.Description}}<span class="p"></</span><span class="nt">p</span><span class="p">></span></span>
<span class="code-line"> <span class="p"></</span><span class="nt">li</span><span class="p">></span></span>
<span class="code-line"> {{ end }}</span>
<span class="code-line">{{ end }}</span>
</pre></div>
<p>尽管因为咱以前用过 Jinja2 所以知道这是 Jinja 模板的一部分,但肯定有好多人看到 HTML 就一阵惊慌失措啦
( 更别提 HTML 里还有一堆大括号啦 (╯>▽<)╯ ┻━┻ )</p>
<blockquote>
<p>在这里咱要好好反省一下自己*2,好像咱也经常忘记写注释......</p>
<p>顺便给 <a class="reference external" href="/links.html#frantic1048">frantic1048</a> 点个赞 ( <a class="reference external" href="http://frantic1048.logdown.com/posts/517113-test-redux-application-windowfetch-api-request">例如这篇</a> )</p>
<p>o(* ̄3 ̄)o</p>
</blockquote>
</div>
<div class="section" id="id7">
<h2><a class="toc-backref" href="#id18">技术文章问题之四 : 前后不一致的措辞 ( ̄ε(# ̄)☆╰╮( ̄▽ ̄///)</a></h2>
<p>比如前面用 "我" 后面不知道到了哪里就变成了 "我们" 这一类的问题,</p>
<p>读起来感觉自己都要精分啦 (╯@﹏@)╯ ┻━┻</p>
</div>
<div class="section" id="id8">
<h2><a class="toc-backref" href="#id19">技术文章问题之五 : 没有总结 “(..•˘_˘•..)”</a></h2>
<p>......</p>
<p><del>上面就是一个绝佳的栗子 😂😂</del></p>
</div>
<div class="section" id="id9">
<h2><a class="toc-backref" href="#id20">那么啥样的姿势比较好咧? ~(>_<~)</a></h2>
<p>其实上面那篇文章里也给出了四个建议 😂😂</p>
</div>
<div class="section" id="id10">
<h2><a class="toc-backref" href="#id21">建议之一 : 拥有个性 (σ≧∀≦)σ</a></h2>
<p>要知道汝写的是文章而不是 <del>死板的</del> API 文档呐~
一个好的写作风格说不定可以帮汝拉来新读者哟~ 😋</p>
</div>
<div class="section" id="id11">
<h2><a class="toc-backref" href="#id22">建议之二 : 但是也不要个性过了头 <(ノ=﹁"﹁=)ノ┻━┻</a></h2>
<p>既然是技术博客嘛,一定的严谨和专业性还是有必要的啦~ ( 比如不要有太多的错别字啦 (╯@_>@)╯ ┻━┻ )</p>
</div>
<div class="section" id="id12">
<h2><a class="toc-backref" href="#id23">建议之三 : 主线要有主线的存在感 ʃ ̂͜•̄ ̱̩ ̄͜►</a></h2>
<p>不要把主线搞得像阿卡林一样没有存在感啦~</p>
<p>即使要插支线剧情也要以不同的形式让读者能轻易分辨,不要和主线混在一起,以及别太长。</p>
</div>
<div class="section" id="id13">
<h2><a class="toc-backref" href="#id24">建议之四 : 基本的排版 (・∀・)</a></h2>
<p>文章分节的标题之类的可以帮助读者能够快速了解文章大体内容啦~</p>
<hr class="docutils"/>
<p>介于咱也不是什么写博客的菊苣,咱也就只能抛个砖引个玉.欢迎各位大触前来指教呗~</p>
</div>
浅说基于 Linux 内核的操作系统 (6) - 安装 Debian2016-04-19T00:00:00+08:002016-04-19T00:00:00+08:00ホロtag:None,2016-04-19:/linux/linux_install_debian.html
<p>接着咱再来装 Debian ~(>_<~)</p>
<div class="section" id="debian">
<h2><a class="toc-backref" href="#id5">下载 Debian</a></h2>
<p><del>话说 Debian 从官网到 Wiki 都有一种年久失修的气息😂😂</del></p>
<p><a class="reference external" href="https://www.debian.org/distrib/">这是官方的下载页面</a></p>
<p>嗯……看不懂的话直接去崔土豪源吧😂😂</p>
<p>DVD : <a class="reference external" href="https://mirrors.ustc.edu.cn/debian-cd/8.4.0/amd64/iso-dvd/">https://mirrors.ustc.edu.cn/debian-cd/8.4.0/amd64/iso-dvd/</a></p>
<p>( 不用下载带 Update 的 iso )</p>
<p>Live DVD : <a class="reference external" href="https://mirrors.ustc.edu.cn/debian-cd/8.4.0-live/amd64/iso-hybrid/">https://mirrors.ustc.edu.cn/debian-cd/8.4.0-live/amd64/iso-hybrid/</a></p>
<p>( 后面的 xxxx-desktop 表示的是某种环境的 Live 系统 )</p>
<p>然而咱并没有找到 Debian 的系统需求啊 …</p></div>
<p>接着咱再来装 Debian ~(>_<~)</p>
<div class="section" id="debian">
<h2><a class="toc-backref" href="#id5">下载 Debian</a></h2>
<p><del>话说 Debian 从官网到 Wiki 都有一种年久失修的气息😂😂</del></p>
<p><a class="reference external" href="https://www.debian.org/distrib/">这是官方的下载页面</a></p>
<p>嗯……看不懂的话直接去崔土豪源吧😂😂</p>
<p>DVD : <a class="reference external" href="https://mirrors.ustc.edu.cn/debian-cd/8.4.0/amd64/iso-dvd/">https://mirrors.ustc.edu.cn/debian-cd/8.4.0/amd64/iso-dvd/</a></p>
<p>( 不用下载带 Update 的 iso )</p>
<p>Live DVD : <a class="reference external" href="https://mirrors.ustc.edu.cn/debian-cd/8.4.0-live/amd64/iso-hybrid/">https://mirrors.ustc.edu.cn/debian-cd/8.4.0-live/amd64/iso-hybrid/</a></p>
<p>( 后面的 xxxx-desktop 表示的是某种环境的 Live 系统 )</p>
<p>然而咱并没有找到 Debian 的系统需求啊 (╯•̀∧•́)╯ ┻━┻</p>
<p>后面咱就用 DVD 映像啦 ~(>_<~)</p>
</div>
<div class="section" id="mbr-uefi">
<h2><a class="toc-backref" href="#id6">区分 MBR 和 UEFI 系统 | ω・`)</a></h2>
<p>MBR 系统启动安装映像之后大概像这样 _(:з」∠)_</p>
<img alt="MBR 系统启动之后大概像这样" class="materialboxed responsive-img" src="/images/Installing_Debian/1.png"/>
<ul class="simple">
<li>Install : 基于终端的安装界面</li>
<li>Graphical Install : 基于 GUI 的安装界面 | ω・`)</li>
<li>Advanced Options : 高级选项......</li>
<li>Help : 帮助</li>
<li>Install with speech synchesis : 在文字转语音支持下安装 ( 然而估计用不到 😂😂 )</li>
</ul>
<p>( 对于 Live ISO ,会多一个 "Start Debian Live" 的选项,可以来进行测试 o(* ̄3 ̄)o</p>
<p>而 UEFI 启动大概像这样 (´・ω・`)</p>
<img alt="UEFI啦~" class="materialboxed responsive-img" src="/images/Installing_Debian/2.png"/>
<p>那么 Advanced Options 都有哪些咧 ?</p>
<img alt="这是高级选项 _(:з」∠)_" class="materialboxed responsive-img" src="/images/Installing_Debian/3.png"/>
<ul class="simple">
<li>Expert Install : 以 Expert Mode 进行安装 ( <ruby><rb>专家</rb><rp>(</rp><rt>啰嗦</rt><rp>)</rp></ruby> 模式 )</li>
<li>Rescue Mode : 修复当前系统的急救模式</li>
<li>Automated Install : 自动安装 ( 然而咱没用过 😂😂 )</li>
</ul>
<p>( 下面三个带 Graphical 的选项就是图形界面下的啦~ )</p>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id7">第一阶段:语言和区域,设置网络和创建用户</a></h2>
<ul class="simple">
<li>选择语言,在安装程序中选择的语言会是汝安装好的系统的语言呗~</li>
</ul>
<img alt="选择语言" class="materialboxed responsive-img" src="/images/Installing_Debian/4.png"/>
<ul class="simple">
<li>例行提示所选语言的翻译不完整 _(:з」∠)_</li>
</ul>
<img alt="提示翻译不完整……" class="materialboxed responsive-img" src="/images/Installing_Debian/5.png"/>
<ul class="simple">
<li>选择汝的区域,一般选择汝所在的位置就好啦~</li>
</ul>
<img alt="选择区域" class="materialboxed responsive-img" src="/images/Installing_Debian/6.png"/>
<ul class="simple">
<li>配置键盘映射,默认的应该就合适 <(=﹁"﹁=)></li>
</ul>
<img alt="键盘映射" class="materialboxed responsive-img" src="/images/Installing_Debian/7.png"/>
<ul>
<li><p class="first">探测网络设备,偶尔会提示缺少某些驱动,先记下来.</p>
<blockquote>
<p>( VirtualBox 不缺驱动所以没截图 😂😂 )</p>
</blockquote>
</li>
<li><p class="first">探测连接,没有的直接按取消吧 😂😂</p>
</li>
</ul>
<img alt="探测网络连接" class="materialboxed responsive-img" src="/images/Installing_Debian/9.png"/>
<ul class="simple">
<li>探测网络连接失败,接着选 "现在不进行网络设置" 然后下一步.</li>
</ul>
<img alt="探测网络连接失败 _(:з」∠)_" class="materialboxed responsive-img" src="/images/Installing_Debian/8.png"/>
<ul class="simple">
<li>设置一个主机名,一般可以随便些~</li>
</ul>
<img alt="设置主机名" class="materialboxed responsive-img" src="/images/Installing_Debian/10.png"/>
<ul>
<li><p class="first">这里可以选择为 root 用户设置一个密码,也可以不设置</p>
<blockquote>
<p>考虑到安全性还是不要设置的好 <(=﹁"﹁=)></p>
</blockquote>
</li>
</ul>
<img alt="可选为 root 用户设置个密码" class="materialboxed responsive-img" src="/images/Installing_Debian/12.png"/>
<ul class="simple">
<li>接着创建一个用户,因为 root 没有密码,所以这个用户可以通过 sudo 获得 root 权限 ~(>_<~)</li>
</ul>
<img alt="创建新用户" class="materialboxed responsive-img" src="/images/Installing_Debian/13.png"/>
<img alt="创建新用户" class="materialboxed responsive-img" src="/images/Installing_Debian/14.png"/>
<img alt="为新用户设置密码" class="materialboxed responsive-img" src="/images/Installing_Debian/15.png"/>
<p>然后又到最坑的环节啦 😂😂</p>
</div>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id8">第二阶段 : 磁盘分区和安装基本系统 Σ( ° △ °|||)</a></h2>
<ul class="simple">
<li>选择一种分区方式,为了不坑选择手动 ʃ ̂͜•̄ ̱̩ ̄͜►</li>
</ul>
<img alt="选择一种分区方式" class="materialboxed responsive-img" src="/images/Installing_Debian/16.png"/>
<ul>
<li><p class="first">如果汝计划在一块新硬盘上安装系统的话,先创建一下分区表呗~</p>
<blockquote>
<p>点击设备名称来创建分区表 <(ノ=﹁"﹁=)ノ┻━┻</p>
</blockquote>
</li>
</ul>
<img alt="分区菜单" class="materialboxed responsive-img" src="/images/Installing_Debian/18.png"/>
<img alt="为设备创建分区表" class="materialboxed responsive-img" src="/images/Installing_Debian/19.png"/>
<ul class="simple">
<li>接下来点击那个新的 "空闲空间" 创建一个新分区呗~</li>
</ul>
<img alt="创建新分区" class="materialboxed responsive-img" src="/images/Installing_Debian/20.png"/>
<ul class="simple">
<li>设置新分区的大小.</li>
</ul>
<img alt="新分区的大小" class="materialboxed responsive-img" src="/images/Installing_Debian/21.png"/>
<ul class="simple">
<li>调整新分区的属性,一般设置挂载点就好 ( <code class="code">
/</code>
是必须的 (╯ˊ_>ˋ)╯ ┻━┻ )</li>
</ul>
<img alt="编辑分区的详细信息" class="materialboxed responsive-img" src="/images/Installing_Debian/22.png"/>
<ul class="simple">
<li>然后效果大概像这样 _(:з」∠)_</li>
</ul>
<img alt="分区的详细信息" class="materialboxed responsive-img" src="/images/Installing_Debian/23.png"/>
<ul class="simple">
<li>对于 UEFI 系统,还需要一个 EFI 系统分区呗~</li>
</ul>
<img alt="创建一个 EFI 系统分区" class="materialboxed responsive-img" src="/images/Installing_Debian/24.png"/>
<img alt="包括 EFI 系统分区的分区表" class="materialboxed responsive-img" src="/images/Installing_Debian/25.png"/>
<ul>
<li><p class="first">单击 "分区设定结束并将设置写入磁盘" ,这时会提示没有创建交换空间 😂😂</p>
<blockquote>
<p>对于 RAM 小于 1GB 的用户,交换空间通常是推荐的 ( 一般推荐是RAM 的两倍...... ),但是对于拥有大量的物理内存的用户来说是否使用主要看个人口味了 (尽管它对于休眠到硬盘支持是必须的)。</p>
<p>自己看着办呗~ ......</p>
<p><del>大土壕 hjc 这样说:</del></p>
<p>David Huang 🌚, [16.04.16 04:38]
有啊</p>
<p>David Huang 🌚, [16.04.16 04:38]
能把更冷的内存压缩后放磁盘上,将腾出来的空间用于更热的缓存</p>
<p>David Huang 🌚, [16.04.16 04:39]
比如我chrome泄露了50个G的内存</p>
<p>David Huang 🌚, [16.04.16 04:39]
我总共有64G内存</p>
<p>David Huang 🌚, [16.04.16 04:39]
这个时候系统就会把这50G压缩后放在硬盘上</p>
<p>David Huang 🌚, [16.04.16 04:40]
然后这些空间用于缓存</p>
<p>David Huang 🌚, [16.04.16 04:40]
明显提高系统运行速度</p>
<p>David Huang 🌚, [16.04.16 04:40]
→_→</p>
</blockquote>
</li>
</ul>
<img alt="提示没有交换空间 ......" class="materialboxed responsive-img" src="/images/Installing_Debian/26.png"/>
<ul>
<li><p class="first">接着该确认了.</p>
<blockquote>
<p>一旦选了是,就没有回头路了呐~</p>
</blockquote>
</li>
</ul>
<img alt="确认提交对硬盘分区的更改" class="materialboxed responsive-img" src="/images/Installing_Debian/27.png"/>
<ul class="simple">
<li>开始安装基本系统,去喝杯咖啡呗~ 😂</li>
</ul>
</div>
<div class="section" id="dvd">
<h2><a class="toc-backref" href="#id9">只有 DVD 安装需要的第三阶段 : 设置软件包管理器</a></h2>
<ul class="simple">
<li>只有在汝有其他的 DVD 映像的时才需要扫描呐~</li>
</ul>
<img alt="插别的 DVD ?" class="materialboxed responsive-img" src="/images/Installing_Debian/28.png"/>
<ul class="simple">
<li>虽然可以在这里选择网络映像,但前提汝要有足够的网速和时间 😂😂</li>
</ul>
<img alt="使用网络镜像" class="materialboxed responsive-img" src="/images/Installing_Debian/29.png"/>
<ul class="simple">
<li>要不要参加软件包流行度调查随便啦~</li>
</ul>
<img alt="参加软件包流行度调查?" class="materialboxed responsive-img" src="/images/Installing_Debian/31.png"/>
<ul class="simple">
<li>选择安装的软件包组,一般就是再选一个桌面环境 😂</li>
</ul>
<img alt="选择软件包集" class="materialboxed responsive-img" src="/images/Installing_Debian/32.png"/>
<ul class="simple">
<li>然后接着装(可以去把刚刚泡的咖啡喝了 😂</li>
</ul>
<img alt="安装软件包" class="materialboxed responsive-img" src="/images/Installing_Debian/33.png"/>
</div>
<div class="section" id="mbr-grub">
<h2><a class="toc-backref" href="#id10">只有 MBR 安装需要的第三阶段 : 安装 GRUB 启动管理器</a></h2>
<p>( 其实 UEFI 安装也有这一步啦。只是不需要汝手动设置啦~ )</p>
<ul class="simple">
<li>要把 GRUB 安装到 MBR 上吗? ( 当然是要啦~ )</li>
</ul>
<img alt="要把 GRUB 安装到 MBR 上吗?" class="materialboxed responsive-img" src="/images/Installing_Debian/34.png"/>
<ul class="simple">
<li>然后选择要安装到的硬盘上呗~</li>
</ul>
<img alt="然后选择要安装到的硬盘" class="materialboxed responsive-img" src="/images/Installing_Debian/35.png"/>
</div>
<div class="section" id="id4">
<h2><a class="toc-backref" href="#id11">最后 ......</a></h2>
<ul class="simple">
<li>收工重启 ......</li>
</ul>
<img alt="重启" class="materialboxed responsive-img" src="/images/Installing_Debian/38.png"/>
<ul class="simple">
<li>两个选项,分别是启动系统和高级选项 _(:з」∠)_</li>
</ul>
<img alt="GRUB" class="materialboxed responsive-img" src="/images/Installing_Debian/39.png"/>
<ul class="simple">
<li>高级选项的两个选项,第一和刚刚的第一个一样,第二个是进入恢复模式 (╯T皿T)╯ ┻━┻</li>
</ul>
<img alt="高级选项" class="materialboxed responsive-img" src="/images/Installing_Debian/40.png"/>
<ul class="simple">
<li>该登录啦~</li>
</ul>
<img alt="登录" class="materialboxed responsive-img" src="/images/Installing_Debian/41.png"/>
<hr class="docutils"/>
<p><del>咱要不要再装个 openSUSE 😂😂</del></p>
</div>
入手 Raspberry Pi 32016-04-12T00:00:00+08:002016-04-12T00:00:00+08:00ホロtag:None,2016-04-12:/arch-linux/get_raspberry_pi_3.html
<p>社团为了完成某个和咱没有关系的项目买了块树莓派3诶,然而不妨碍咱玩就是了~</p>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id10">汝不会连树莓派是啥都不知道吧 😂😂</a></h2>
<blockquote>
<p>树莓派(英语:Raspberry Pi),是一款基于Linux的单板机电脑。它由英国的树莓派基金会所开发,目的是以低价硬件及自由软件刺激在学校的基本计算机科学教育。</p>
<p>树莓派基金会提供了基于ARM架构的Debian、Arch Linux和Fedora等的发行版供大众下载,还计划提供支持Python作为主要编程语言,支持BBC BASIC(通过RISC OS映像或者Linux的"Brandy Basic"克隆)、C语言和Perl等编程语言。</p>
<p>---- <a class="reference external" href="https://zh.wikipedia.org/zh-cn/%E6%A0%91%E8%8E%93%E6%B4%BE">Wikipedia:树莓派</a></p>
</blockquote>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id11">若干准备动作 _(:з」∠)_</a></h2>
<p>树莓派3的配置大概像这样:</p>
<blockquote>
<ul class="simple">
<li><ruby><rb>SoC</rb><rp>(</rp><rt>系统单晶片</rt><rp>)</rp></ruby> : Broadcom BCM2837(CPU,GPU DSP和SDRAM、USB)</li>
<li>CPU : ARM Cortex-A53 64位 (ARMv8系列) 1.2GHz (四核心)</li>
<li>GPU :Broadcom VideoCore IV</li>
<li>RAM …</li></ul></blockquote></div>
<p>社团为了完成某个和咱没有关系的项目买了块树莓派3诶,然而不妨碍咱玩就是了~</p>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id10">汝不会连树莓派是啥都不知道吧 😂😂</a></h2>
<blockquote>
<p>树莓派(英语:Raspberry Pi),是一款基于Linux的单板机电脑。它由英国的树莓派基金会所开发,目的是以低价硬件及自由软件刺激在学校的基本计算机科学教育。</p>
<p>树莓派基金会提供了基于ARM架构的Debian、Arch Linux和Fedora等的发行版供大众下载,还计划提供支持Python作为主要编程语言,支持BBC BASIC(通过RISC OS映像或者Linux的"Brandy Basic"克隆)、C语言和Perl等编程语言。</p>
<p>---- <a class="reference external" href="https://zh.wikipedia.org/zh-cn/%E6%A0%91%E8%8E%93%E6%B4%BE">Wikipedia:树莓派</a></p>
</blockquote>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id11">若干准备动作 _(:з」∠)_</a></h2>
<p>树莓派3的配置大概像这样:</p>
<blockquote>
<ul class="simple">
<li><ruby><rb>SoC</rb><rp>(</rp><rt>系统单晶片</rt><rp>)</rp></ruby> : Broadcom BCM2837(CPU,GPU DSP和SDRAM、USB)</li>
<li>CPU : ARM Cortex-A53 64位 (ARMv8系列) 1.2GHz (四核心)</li>
<li>GPU :Broadcom VideoCore IV</li>
<li>RAM : 1GB</li>
<li>和上一代比多内置了了无线网卡和蓝牙模块</li>
</ul>
</blockquote>
<p>当然因为只是块板子嘛,还要准备些外设:</p>
<ul class="simple">
<li>一个显示器 ( 当然其实可以用 <ruby><rb>GPIO</rb><rp>(</rp><rt>通用输入/输出</rt><rp>)</rp></ruby> 连接串口 ) 和 HDMI 线</li>
<li>一张 MicroSD 卡</li>
<li>USB 接口的鼠标和键盘</li>
<li>至少 5V/2A 的电源适配器和 Micro USB 线 ( 这个给汝的手机充电的插座和数据线应该能满足呗~ )</li>
<li>以太网线 ( 如果汝打算用有线连接 )</li>
</ul>
<p>于是在准备完成以后......</p>
</div>
<div class="section" id="arch-linux-arm">
<h2><a class="toc-backref" href="#id12">为树莓派写入系统 ( Arch Linux ARM )</a></h2>
<p>作为 Arch Linux 用户,当然最好是接着用 Arch 啦,还好有 Arch Linux ARM 😂</p>
<p>在 <a class="reference external" href="https://archlinuxarm.org/platforms/armv8/broadcom/raspberry-pi-3#installation">Arch Linux ARM 文档</a>
的光辉照耀下,一切正常.</p>
<p>然后把写入好系统的 MicroSD 卡插入树莓派,连上显示器和电源,开机.</p>
</div>
<div class="section" id="raspbian">
<h2><a class="toc-backref" href="#id13">为树莓派写入系统 ( Raspbian )</a></h2>
<p>Rsapbian 是基于 Debian 修改成的,树莓派基金会官方支持的操作系统啦~</p>
<p><a class="reference external" href="https://www.raspberrypi.org/downloads/raspbian/">下载在这里</a> , <a class="reference external" href="https://www.raspberrypi.org/documentation/installation/installing-images/README.md">安装教程在这里</a> .</p>
<p><del>然而后面的操作都是在 Arch Linux ARM 上的 😂😂</del></p>
</div>
<div class="section" id="xfce">
<h2><a class="toc-backref" href="#id14">安装 Xfce 桌面环境</a></h2>
<p>首先要连上网,准备好接受 ArchWiki <del>的圣光</del> 呗~</p>
<blockquote>
<ul class="simple">
<li><a class="reference external" href="https://wiki.archlinux.org/index.php/Network_configuration">有线网络</a></li>
<li><a class="reference external" href="https://wiki.archlinux.org/index.php/Wireless_network_configuration">无线网络</a></li>
</ul>
</blockquote>
<p>默认的 alarm 用户竟然没有 sudo 权限 Pia!<(=o ‵-′)ノ☆ , 不过没啥关系,
<a class="reference external" href="https://wiki.archlinux.org/index.php/Sudo">接着被圣光笼罩呗~</a></p>
<p>默认的 <a class="reference external" href="http://mirror.archlinuxarm.org/">http://mirror.archlinuxarm.org/</a> 会自动解析到离用户较近的镜像,
也可以手动换成 <ruby><rb>中科大</rb><rp>(</rp><rt>崔土豪</rt><rp>)</rp></ruby> 源, <a class="reference external" href="https://lug.ustc.edu.cn/wiki/mirrors/help/archlinuxarm">方法在这</a> .</p>
<p>换好源以后更新一下系统 ( 记得两个 y 是强制刷新~ )</p>
<div class="highlight"><pre><span class="code-line"><span></span>$ sudo pacman -Syyu</span>
</pre></div>
<p>然后安装需要的软件 ( xorg xfce 和一个登录管理器,这里是 lightdm )</p>
<div class="highlight"><pre><span class="code-line"><span></span>$ sudo pacman -S xorg xfce lightdm lightdm-greeter</span>
</pre></div>
<p>至于如何配置 lightdm 咱就偷下懒推荐一下百合仙子 <a class="reference external" href="/links.html#lilydjwg">lilydjwg</a> 的 <a class="reference external" href="http://lilydjwg.is-programmer.com/2015/11/4/from-slim-to-lightdm.187512.html">从 slim 到 lightdm</a> 啦~</p>
<p>然后启动 <code class="code">
lightdm</code>
服务:</p>
<div class="highlight"><pre><span class="code-line"><span></span>$ sudo systemctl start lightdm</span>
</pre></div>
<p>树莓派3的性能写写博客还是可以的啦~</p>
<p><del>只是在生成 HTML 的时候系统负载会飙升 😂😂</del></p>
<img alt="rpi3 写博客中~" class="materialboxed responsive-img" src="/images/rpi3_blogging.png"/>
</div>
浅说基于 Linux 内核的操作系统 (5) - 安装 Fedora2016-04-09T00:00:00+08:002016-04-09T00:00:00+08:00ホロtag:None,2016-04-09:/linux/linux_install_fedora.html
<p>汝是不是想说'废话少说快教我怎么装 Linux 发行版'啦~</p>
<p>如果汝已经在运行一个 Linux 发行版的话,那么可以跳过接下来的几节.</p>
<p>如果汝有些心虚,想在虚拟机上先尝试一下,可以先去读一下
<a class="reference external" href="https://program-think.blogspot.com/2012/10/system-vm-0.html#index">扫盲操作系统虚拟机系列@ 编程随想的博客</a></p>
<p>如果汝要直接装在电脑上,先做个USB启动盘啦~</p>
<p>( 啥? 不会? <a class="reference external" href="https://program-think.blogspot.com/2013/12/create-bootable-usb-stick-from-iso.html">看看这个 ?</a> )</p>
<div class="section" id="fedora-workstation">
<h2><a class="toc-backref" href="#id7">下载 Fedora Workstation</a></h2>
<blockquote>
<p>Fedora Workstation Live 镜像让您可以为自己电脑制作完整的立即可用的 Fedora Workstation 系统介质。您可以使用 Live 镜像测试、体验 Fedora,同时无需改动硬盘内容。当您满意之后,您可以从 Live 镜像安装 Fedora 到您的硬盘。</p>
<p>要使用该镜像,您需要可创建或刻录 DVD 的驱动器或者至少跟镜像大小一样的 USB 闪存盘。</p>
<p class="attribution">—<a class="reference external" href="https://getfedora.org/zh_CN/workstation/download/">这是官方的下载页面</a></p>
</blockquote>
</div>
<div class="section" id="fedora-23-workstation">
<h2><a class="toc-backref" href="#id8">Fedora 23 Workstation 系统需求 …</a></h2></div>
<p>汝是不是想说'废话少说快教我怎么装 Linux 发行版'啦~</p>
<p>如果汝已经在运行一个 Linux 发行版的话,那么可以跳过接下来的几节.</p>
<p>如果汝有些心虚,想在虚拟机上先尝试一下,可以先去读一下
<a class="reference external" href="https://program-think.blogspot.com/2012/10/system-vm-0.html#index">扫盲操作系统虚拟机系列@ 编程随想的博客</a></p>
<p>如果汝要直接装在电脑上,先做个USB启动盘啦~</p>
<p>( 啥? 不会? <a class="reference external" href="https://program-think.blogspot.com/2013/12/create-bootable-usb-stick-from-iso.html">看看这个 ?</a> )</p>
<div class="section" id="fedora-workstation">
<h2><a class="toc-backref" href="#id7">下载 Fedora Workstation</a></h2>
<blockquote>
<p>Fedora Workstation Live 镜像让您可以为自己电脑制作完整的立即可用的 Fedora Workstation 系统介质。您可以使用 Live 镜像测试、体验 Fedora,同时无需改动硬盘内容。当您满意之后,您可以从 Live 镜像安装 Fedora 到您的硬盘。</p>
<p>要使用该镜像,您需要可创建或刻录 DVD 的驱动器或者至少跟镜像大小一样的 USB 闪存盘。</p>
<p class="attribution">—<a class="reference external" href="https://getfedora.org/zh_CN/workstation/download/">这是官方的下载页面</a></p>
</blockquote>
</div>
<div class="section" id="fedora-23-workstation">
<h2><a class="toc-backref" href="#id8">Fedora 23 Workstation 系统需求 😂</a></h2>
<p>这是最低需求啦~</p>
<blockquote>
<ul class="simple">
<li>CPU : 1Ghz 及以上</li>
<li>内存 : 1GB 及以上 ( 如果汝不需要桌面环境可以少些 ~(>_<~) )</li>
<li>硬盘空间 : 10GB 或更多的剩余空间</li>
</ul>
</blockquote>
<p>如果汝希望使用硬件加速 3D 图形,汝需要:</p>
<blockquote>
<ul>
<li><p class="first">GMA9xx/GeForce FX5xxx /Radeon 9500 或更新的显卡 _(:з」∠)_ 或者</p>
</li>
<li><p class="first">汝的 CPU 支持 SSE2 指令集,这样就可以通过 LLVMpipe 利用 CPU 加速 3D 图形.</p>
<blockquote>
<p>看看汝的 <code class="code">
/proc/cpuinfo</code>
的 code:<cite>flags</cite> 一节里有没有 code:<cite>SSE2</cite> 啦~</p>
</blockquote>
</li>
</ul>
</blockquote>
</div>
<div class="section" id="windows-iso">
<h2><a class="toc-backref" href="#id9">在 Windows 下检查 ISO 的散列值</a></h2>
<p>1, 从 <a class="reference external" href="https://fedoraproject.org/verify">https://fedoraproject.org/verify</a> 根据选用的映像下载需要的散列值文件,
并把它们放在一起啦~</p>
<p>2, 打开 Windows PowerShell.切换到放置映像和散列值文件的文件夹.</p>
<p>3, 收集计算散列值需要的信息.</p>
<div class="highlight"><pre><span class="code-line"><span></span>> <span class="nv">$image</span> <span class="o">=</span> <span class="s2">"<此处是汝的 ISO 文件的名称>"</span></span>
<span class="code-line">> <span class="nv">$checksum_file</span> <span class="o">=</span> <span class="s2">"<此处是汝的 ISO 文件的散列值文件名称>"</span></span>
<span class="code-line">> <span class="nv">$sha256</span> <span class="o">=</span> New-Object -TypeName System.Security.Cryptography.sha256CryptoServiceProvider</span>
<span class="code-line">> <span class="nv">$expected_checksum</span> <span class="o">=</span> <span class="o">((</span>Get-Content <span class="nv">$checksum_file</span> <span class="p">|</span> Select-String -Pattern <span class="nv">$image</span><span class="o">)</span> -split <span class="s2">" "</span><span class="o">)[</span><span class="m">0</span><span class="o">]</span>.ToLower<span class="o">()</span></span>
</pre></div>
<p>4, 计算 ISO 的散列值,放轻松些 ( 可以去煮杯咖啡~ )</p>
<div class="highlight"><pre><span class="code-line"><span></span>> <span class="nv">$download_checksum</span> <span class="o">=</span> <span class="o">[</span>System.BitConverter<span class="o">]</span>::ToString<span class="o">(</span><span class="nv">$sha256</span>.ComputeHash<span class="o">([</span>System.IO.File<span class="o">]</span>::ReadAllBytes<span class="o">(</span><span class="s2">"</span><span class="nv">$PWD</span><span class="s2">\$image"</span><span class="o">)))</span>.ToLower<span class="o">()</span> -replace <span class="s1">'-'</span>, <span class="s1">''</span></span>
</pre></div>
<p>5, 然后比较~</p>
<div class="highlight"><pre><span class="code-line"><span></span>> <span class="nb">echo</span> <span class="s2">"Download Checksum: </span><span class="nv">$download_checksum</span><span class="s2">"</span></span>
<span class="code-line">> <span class="nb">echo</span> <span class="s2">"Expected Checksum: </span><span class="nv">$expected_checksum</span><span class="s2">"</span></span>
<span class="code-line">> <span class="k">if</span> <span class="o">(</span> <span class="nv">$download_checksum</span> -eq <span class="s2">"</span><span class="nv">$expected_checksum</span><span class="s2">"</span> <span class="o">)</span> <span class="o">{</span></span>
<span class="code-line"><span class="nb">echo</span> <span class="s2">"Checksum test passed!"</span></span>
<span class="code-line"><span class="o">}</span> <span class="k">else</span> <span class="o">{</span></span>
<span class="code-line"><span class="nb">echo</span> <span class="s2">"Checksum test failed."</span></span>
<span class="code-line"><span class="o">}</span></span>
</pre></div>
</div>
<div class="section" id="mbr-uefi">
<h2><a class="toc-backref" href="#id10">区分 MBR 和 UEFI 系统 | ω・`)</a></h2>
<p>MBR 系统启动安装映像之后大概像这样 _(:з」∠)_</p>
<img alt="MBR 系统启动之后大概像这样" class="materialboxed responsive-img" src="/images/Installing_Fedora/1.png"/>
<ul class="simple">
<li>Start Fedora Live : 启动 Fedora 的 Live 环境,可以试用或是进行安装.</li>
<li>Troubleshooting : 供排解问题使用的额外选项 | ω・`)</li>
<li>按下 Tab 键可以在启动前修改内核参数 <del>( 然而啥是内核参数咧 😂😂 )</del></li>
</ul>
<p>那么 Troubleshooting 都有哪些咧 ?</p>
<img alt="这是疑难解答选项 _(:з」∠)_" class="materialboxed responsive-img" src="/images/Installing_Fedora/2.png"/>
<ul class="simple">
<li>Start Fedora Live in basic graphics mode : 以基本图形 (不启用硬件加速模式) 启动 Fedora 的 Live 环境.</li>
<li>Test this media & start Fedora Live : 在启动 Fedora 的 Live 环境之前先检查一下安装介质的完整性 Σ( ° △ °|||)</li>
<li>Run a memory test : 运行内存测试.....</li>
<li>Boot from local drive : 从本地硬盘启动操作系统.....</li>
</ul>
<p>而 UEFI 启动大概像这样 (´・ω・`)</p>
<img alt="UEFI啦~" class="materialboxed responsive-img" src="/images/Installing_Fedora/26.png"/>
<p>那还等啥? 直接 "Start Fedora Live" 啦~</p>
<img alt="准备安装啦~" class="materialboxed responsive-img" src="/images/Installing_Fedora/3.png"/>
<p>如果汝选择的是 "Try Fedora" , 从左侧的 <ruby><rb>Activities</rb><rp>(</rp><rt>活动</rt><rp>)</rp></ruby> 中可以找到安装程序 (╯ ̄- ̄)╯ ┻━┻</p>
<img alt="从左侧的 Activities (活动) 中可以找到安装程序 (╯ ̄- ̄)╯ ┻━┻" class="materialboxed responsive-img" src="/images/Installing_Fedora/4.png"/>
<p>就是这里啦~ (用鼠标往左上角推)</p>
<img alt="Install Fedora to disk 在这里啦~" class="materialboxed responsive-img" src="/images/Installing_Fedora/5.png"/>
</div>
<div class="section" id="id4">
<h2><a class="toc-backref" href="#id11">开始安装 (σ≧∀≦)σ</a></h2>
<p>首先选择安装时使用的语言啦~</p>
<img alt="选择安装时使用的语言" class="materialboxed responsive-img" src="/images/Installing_Fedora/6.png"/>
<p>接下来进入安装程序摘要,一般来说只要选择 "安装位置" 来调整存储设备就好.</p>
<img alt="安装程序摘要" class="materialboxed responsive-img" src="/images/Installing_Fedora/8.png"/>
<hr class="docutils"/>
<div class="tag info fg-white compound">
<p class="compound-first">咱是在 VirtualBox 中演示的安装,汝的屏幕上显示的内容可能和咱的不一样.</p>
<p class="compound-last">不过还是小心些好~</p>
</div>
<hr class="docutils"/>
<img alt='"准备存储设备"菜单' class="materialboxed responsive-img" src="/images/Installing_Fedora/9.png"/>
<p>先从上方选择汝的硬盘,然后选择 "我要手动配置分区" ( 毕竟汝不大可能在一块全新的硬盘上安装吧~ ),
再点击 "完成" 进入下一步.</p>
<img alt='"准备存储设备"菜单again~' class="materialboxed responsive-img" src="/images/Installing_Fedora/10.png"/>
<div class="section" id="mbr">
<h3><a class="toc-backref" href="#id12">对于 MBR 系统</a></h3>
<p>至少要有一个根分区 ( <code class="code">
/</code>
) _(:з」∠)_</p>
<p>点击下面的 + 号图标来创建一个新的分区:</p>
<blockquote>
<img alt="创建一个新的分区~" class="materialboxed responsive-img" src="/images/Installing_Fedora/12.png"/>
</blockquote>
<p>选择挂载点和容量,然后确定.</p>
</div>
<div class="section" id="uefi">
<h3><a class="toc-backref" href="#id13">对于 UEFI 系统</a></h3>
<p>除了根分区以外还需要一个 EFI 系统分区~</p>
<img alt="UEFI 分区举例" class="materialboxed responsive-img" src="/images/Installing_Fedora/28.png"/>
<p>( 咱偷懒用了自动分区 😂😂😂 )</p>
<hr class="docutils"/>
<p>准备好分区后,按 "完成" 提交汝的更改呗~</p>
<img alt="提交更改" class="materialboxed responsive-img" src="/images/Installing_Fedora/14.png"/>
</div>
</div>
<div class="section" id="o">
<h2><a class="toc-backref" href="#id14">这才是真正的开始安装啦 o(*≧▽≦)ツ</a></h2>
<p>这时汝会发现最下面的 "开始安装" 可以点击了诶~</p>
<img alt='"开始安装" 可以点击了诶~' class="materialboxed responsive-img" src="/images/Installing_Fedora/17.png"/>
<img alt="开始安装" class="materialboxed responsive-img" src="/images/Installing_Fedora/18.png"/>
<p>接下来就开始安装啦~ 但是还需要再做两件事 _(:з」∠)_</p>
<ul>
<li><p class="first">为 root用户设置密码:</p>
<blockquote>
<div class="tag success fg-white compound">
<p class="compound-first">root 用户和 Windows 中的 Administrator 账户类似,都具有控制整个系统的权限,</p>
<p class="compound-last">因此汝要设置一个安全的密码并保管好它哟~</p>
</div>
</blockquote>
</li>
</ul>
<img alt="设置 root 用户的密码" class="materialboxed responsive-img" src="/images/Installing_Fedora/19.png"/>
<ul class="simple">
<li>然而由于 root 的权限太大,所以一般不建议用 root 进行日常操作,下一步就是创建一个普通用户,并为它设置一个密码.</li>
</ul>
<img alt="创建一个新用户并设置密码" class="materialboxed responsive-img" src="/images/Installing_Fedora/20.png"/>
<div class="tag info fg-white compound">
<p class="compound-first">如果汝选择 "将此用户设置为管理员" 那么这个用户就可以通过 <code class="code">
sudo</code>
命令来获得管理员权限.</p>
<p class="compound-last">( 有点像 Windows 里的用户账户控制 😂😂 )</p>
</div>
<p>然后稍等一会儿就好啦~</p>
<img alt="安装完成啦~" class="materialboxed responsive-img" src="/images/Installing_Fedora/22.png"/>
</div>
<div class="section" id="fedora">
<h2><a class="toc-backref" href="#id15">重启进入新安装的 Fedora</a></h2>
<p>要从 Live 环境重新启动,点击右上角,再点击电源图标,选择 "重启" _(:з」∠)_</p>
<img alt="重启" class="materialboxed responsive-img" src="/images/Installing_Fedora/23.png"/>
<p>重启以后就会进入到这个 <ruby><rb>简洁</rb><rp>(</rp><rt>简陋</rt><rp>)</rp></ruby> 的启动选项界面啦~</p>
<p>一般选第一个 ( 第二个是恢复模式 _(:з」∠)_ )</p>
<img alt="选择启动选项" class="materialboxed responsive-img" src="/images/Installing_Fedora/24.png"/>
<p>然后稍候片刻进入登录画面,用汝刚刚创建的用户和密码登录吧~</p>
<img alt="登录界面" class="materialboxed responsive-img" src="/images/Installing_Fedora/25.png"/>
</div>
<div class="section" id="id5">
<h2><a class="toc-backref" href="#id16">参考资料</a></h2>
<ul class="simple">
<li><a class="reference external" href="https://docs.fedoraproject.org">Fedora 文档</a></li>
</ul>
</div>
自定 Pelican 主题2016-03-30T00:00:00+08:002016-03-30T00:00:00+08:00ホロtag:None,2016-03-30:/pelican/pelican_theming.html
<p><del>论颜值的重要性 (雾</del></p>
<p>谁叫这是个看脸的世界呢~</p>
<p>Pelican 的默认主题的效果是啥, <a class="reference external" href="http://blog.getpelican.com/">大概像这个样子 (╯>_<)╯ ┻━┻</a></p>
<p>觉得不爽,那就改它呗~</p>
<p>首先把默认的 <ruby><rb>simple</rb><rp>(</rp><rt>什么都没有</rt><rp>)</rp></ruby> 主题复制出来,接下来就基于它来修改呗~</p>
<blockquote>
<p># cp 的 -R (--recursive) 参数表示递归的复制文件夹中的文件.</p>
<p># 如果汝的 Python 安装在不同的目录下,记得改了.</p>
<p>cp -R /usr/lib/python3.5/site-packages/pelican/themes/simple /path/to/your/pelican/</p>
</blockquote>
<p>不过话说回来为啥不直接看 Pelican 官方的文档咧?</p>
<blockquote>
<a class="reference external" href="http://docs.getpelican.com/en/3.6.3/themes.html">Creating themes</a></blockquote>
<div class="section" id="step-1-pelican">
<h2><a class="toc-backref" href="#id2">Step 1 : 了解一下 Pelican 主题的结构</a></h2>
<p>典型的 Pelican 主题大概像这样:</p>
<div class="highlight"><pre><span class="code-line"><span></span>├── static …</span></pre></div></div>
<p><del>论颜值的重要性 (雾</del></p>
<p>谁叫这是个看脸的世界呢~</p>
<p>Pelican 的默认主题的效果是啥, <a class="reference external" href="http://blog.getpelican.com/">大概像这个样子 (╯>_<)╯ ┻━┻</a></p>
<p>觉得不爽,那就改它呗~</p>
<p>首先把默认的 <ruby><rb>simple</rb><rp>(</rp><rt>什么都没有</rt><rp>)</rp></ruby> 主题复制出来,接下来就基于它来修改呗~</p>
<blockquote>
<p># cp 的 -R (--recursive) 参数表示递归的复制文件夹中的文件.</p>
<p># 如果汝的 Python 安装在不同的目录下,记得改了.</p>
<p>cp -R /usr/lib/python3.5/site-packages/pelican/themes/simple /path/to/your/pelican/</p>
</blockquote>
<p>不过话说回来为啥不直接看 Pelican 官方的文档咧?</p>
<blockquote>
<a class="reference external" href="http://docs.getpelican.com/en/3.6.3/themes.html">Creating themes</a></blockquote>
<div class="section" id="step-1-pelican">
<h2><a class="toc-backref" href="#id2">Step 1 : 了解一下 Pelican 主题的结构</a></h2>
<p>典型的 Pelican 主题大概像这样:</p>
<div class="highlight"><pre><span class="code-line"><span></span>├── static // 各类静态数据</span>
<span class="code-line">│ ├── css // 例如 CSS.....</span>
<span class="code-line">│ └── images // 和图像</span>
<span class="code-line">└── templates // 用来生成页面的模板</span>
<span class="code-line"> ├── base.html // 模板的基础</span>
<span class="code-line"> ├── archives.html // 文章归档</span>
<span class="code-line"> ├── period_archives.html // 分时段的文章归档</span>
<span class="code-line"> ├── article.html // 文章</span>
<span class="code-line"> ├── author.html // 按作者分类的文章归档</span>
<span class="code-line"> ├── authors.html // 作者列表</span>
<span class="code-line"> ├── categories.html // 分类列表</span>
<span class="code-line"> ├── category.html // 按分类的文章归档</span>
<span class="code-line"> ├── index.html // 首页</span>
<span class="code-line"> ├── page.html // 页面</span>
<span class="code-line"> ├── tag.html // 标签</span>
<span class="code-line"> ├── pagination.html // 分页</span>
<span class="code-line"> └── tags.html // 标签列表</span>
</pre></div>
<p>如果觉得哪个用不到,直接删掉好了~</p>
<p>另外,像首页啦,分类列表,标签列表这些直接生成一个页面的模板 ( 区分于文章和页面这样的模板 ),如果汝有用到其他的,记得在
<code class="code">
pelican.conf</code>
里设置:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># 直接生成的页面的列表,不用加上 .html 的扩展名.</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="n">DIRECT_TEMPLATES</span> <span class="o">=</span> <span class="p">((</span><span class="s1">'index'</span><span class="p">,</span> <span class="s1">'archives'</span><span class="p">,</span> <span class="s1">'search'</span><span class="p">))</span></span>
</pre></div>
</div>
<div class="section" id="step-2-base-html">
<h2><a class="toc-backref" href="#id3">Step 2 : 修改基础模板 ( base.html )</a></h2>
<p>(请允许咱不厌其烦的把 html 代码贴在上面 _(:з」∠)_ )</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="cp"><!DOCTYPE html></span></span>
<span class="code-line"> <span class="c"><!--</span></span>
<span class="code-line"><span class="c"> 像这样用大括号包围起来的是变量啦,可以来自 pelicanconf.py</span></span>
<span class="code-line"><span class="c"> 文章,页面,和分类也提供了一些变量呐~</span></span>
<span class="code-line"><span class="c"> --></span></span>
<span class="code-line"> <span class="p"><</span><span class="nt">html</span> <span class="na">lang</span><span class="o">=</span><span class="s">"{{ DEFAULT_LANG }}"</span><span class="p">></span></span>
<span class="code-line"> <span class="p"><</span><span class="nt">head</span><span class="p">></span></span>
<span class="code-line"> <span class="c"><!--</span></span>
<span class="code-line"><span class="c"> 其它模板页面可以扩展或是替换掉 block 中的内容呗~</span></span>
<span class="code-line"><span class="c"> --></span></span>
<span class="code-line"> {% block head %}</span>
<span class="code-line"> <span class="p"><</span><span class="nt">title</span><span class="p">></span>{% block title %}{{ SITENAME }}{% endblock title %}<span class="p"></</span><span class="nt">title</span><span class="p">></span></span>
<span class="code-line"> <span class="p"><</span><span class="nt">meta</span> <span class="na">charset</span><span class="o">=</span><span class="s">"utf-8"</span> <span class="p">/></span></span>
<span class="code-line"> <span class="c"><!--</span></span>
<span class="code-line"><span class="c"> Python 中的 if 语句,如果后面的变量有内容的话,显示块中的内容呗~</span></span>
<span class="code-line"><span class="c"> --></span></span>
<span class="code-line"> {% if FEED_ALL_ATOM %}</span>
<span class="code-line"> ......</span>
<span class="code-line"> {% endblock head %}</span>
<span class="code-line"><span class="p"></</span><span class="nt">head</span><span class="p">></span></span>
<span class="code-line"></span>
<span class="code-line"><span class="p"><</span><span class="nt">body</span> <span class="na">id</span><span class="o">=</span><span class="s">"index"</span> <span class="na">class</span><span class="o">=</span><span class="s">"home"</span><span class="p">></span></span>
<span class="code-line"> <span class="p"><</span><span class="nt">header</span> <span class="na">id</span><span class="o">=</span><span class="s">"banner"</span> <span class="na">class</span><span class="o">=</span><span class="s">"body"</span><span class="p">></span></span>
<span class="code-line"> <span class="p"><</span><span class="nt">h1</span><span class="p">><</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">"{{ SITEURL }}/"</span><span class="p">></span>{{ SITENAME }} <span class="p"><</span><span class="nt">strong</span><span class="p">></span>{{ SITESUBTITLE }}<span class="p"></</span><span class="nt">strong</span><span class="p">></</span><span class="nt">a</span><span class="p">></</span><span class="nt">h1</span><span class="p">></span></span>
<span class="code-line"> <span class="p"></</span><span class="nt">header</span><span class="p">></span><span class="c"><!-- /#banner --></span></span>
<span class="code-line"> <span class="p"><</span><span class="nt">nav</span> <span class="na">id</span><span class="o">=</span><span class="s">"menu"</span><span class="p">><</span><span class="nt">ul</span><span class="p">></span></span>
<span class="code-line"> <span class="c"><!--</span></span>
<span class="code-line"><span class="c"> Python 中的 for 循环 <(=﹁"﹁=)></span></span>
<span class="code-line"><span class="c"> --></span></span>
<span class="code-line"> {% for title, link in MENUITEMS %}</span>
<span class="code-line"> <span class="p"><</span><span class="nt">li</span><span class="p">><</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">"{{ link }}"</span><span class="p">></span>{{ title }}<span class="p"></</span><span class="nt">a</span><span class="p">></</span><span class="nt">li</span><span class="p">></span></span>
<span class="code-line"> {% endfor %}</span>
<span class="code-line"> {% block content %}</span>
<span class="code-line"> {% endblock %}</span>
<span class="code-line"> <span class="p"><</span><span class="nt">footer</span> <span class="na">id</span><span class="o">=</span><span class="s">"contentinfo"</span> <span class="na">class</span><span class="o">=</span><span class="s">"body"</span><span class="p">></span></span>
<span class="code-line"> <span class="p"><</span><span class="nt">address</span> <span class="na">id</span><span class="o">=</span><span class="s">"about"</span> <span class="na">class</span><span class="o">=</span><span class="s">"vcard body"</span><span class="p">></span></span>
<span class="code-line"> Proudly powered by <span class="p"><</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">"http://getpelican.com/"</span><span class="p">></span>Pelican<span class="p"></</span><span class="nt">a</span><span class="p">></span>,</span>
<span class="code-line"> which takes great advantage of <span class="p"><</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">"http://python.org"</span><span class="p">></span>Python<span class="p"></</span><span class="nt">a</span><span class="p">></span>.</span>
<span class="code-line"> <span class="p"></</span><span class="nt">address</span><span class="p">></span><span class="c"><!-- /#about --></span></span>
<span class="code-line"> <span class="p"></</span><span class="nt">footer</span><span class="p">></span><span class="c"><!-- /#contentinfo --></span></span>
<span class="code-line"><span class="p"></</span><span class="nt">body</span><span class="p">></span></span>
<span class="code-line"><span class="p"></</span><span class="nt">html</span><span class="p">></span></span>
</pre></div>
<p>因为 Pelican 用的是 Jinja2 模板引擎嘛,所以 <a class="reference external" href="http://jinja.pocoo.org/docs/dev/">先去看看 Jinja 的文档嘛~</a></p>
<p>如果看不懂的话,pia 啦~ (╯・﹏・)╯ ┻━┻ 这里只举一个加入 CSS 的栗子:</p>
<p>首先把 CSS 放到 <code class="code">
static/css</code>
文件夹里,然后修改 <code class="code">
base.html</code>
</p>
<div class="highlight"><pre><span class="code-line"><span></span>{% block head %}</span>
<span class="code-line"> <span class="c"><!-- static 文件夹输出以后就是 /theme 啦~ --></span></span>
<span class="code-line"> <span class="p"><</span><span class="nt">link</span> <span class="na">href</span><span class="o">=</span><span class="s">"{{ SITEURL }}/theme/css/metro.css"</span> <span class="na">rel</span><span class="o">=</span><span class="s">"stylesheet"</span><span class="p">></span></span>
<span class="code-line"></span>
<span class="code-line">{% endblock head %}</span>
</pre></div>
<p>就这样 ~(>_<~)</p>
</div>
<div class="section" id="step-3">
<h2><a class="toc-backref" href="#id4">Step 3 : 修改子模板</a></h2>
<p>再举一个文章的栗子 (´・ω・`)</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c"><!-- entends 就是扩展啦,后面是基于的模板页面的名称 --></span></span>
<span class="code-line">{% extends "base.html" %}</span>
<span class="code-line">{% block head %}</span>
<span class="code-line"><span class="c"><!-- 用 super () 来包含 block 默认的内容 --></span></span>
<span class="code-line">{{ super() }}</span>
<span class="code-line">{% for keyword in article.keywords %}</span>
<span class="code-line"><span class="p"><</span><span class="nt">meta</span> <span class="na">name</span><span class="o">=</span><span class="s">"keywords"</span> <span class="na">content</span><span class="o">=</span><span class="s">"{{keyword}}"</span> <span class="p">/></span></span>
<span class="code-line">{% endfor %}</span>
<span class="code-line"></span>
<span class="code-line">{% endblock %}</span>
<span class="code-line">{% block content %}</span>
<span class="code-line"><span class="c"><!-- 这里加上需要的内容 --></span></span>
<span class="code-line">{% endfor %}</span>
<span class="code-line"><span class="p"></</span><span class="nt">dl</span><span class="p">></span></span>
<span class="code-line">{% endblock %}</span>
</pre></div>
<p>本来打算贴出模板里能用的变量的,不过咱有了要翻译 Pelican 文档的想法了呐~ ( todo list 要爆炸的节奏 )</p>
</div>
Weechat + Glowing Bear 打造一个网页版 IRC2016-03-27T00:00:00+08:002016-03-27T00:00:00+08:00ホロtag:None,2016-03-27:/tech_misc/weechat_glowingbear_irc.html
<p>Weechat + Glowing Bear 打造一个网页版 IRC ,这样在哪里都可以聊天了呐~</p>
<div class="section" id="irc">
<h2><a class="toc-backref" href="#id4">为啥要自己搭建一个网页版 IRC 咧?</a></h2>
<ul class="simple">
<li>不是啥设备都有聊天软件客户端呐~ (比如 PS Vita ) (╯@Д@)╯ ┻━┻</li>
<li><a class="reference external" href="https://webchat.freenode.net">freenode 的 WebIRC</a> 很不错,但是验证码是 Google 的,于是又引出了怎么翻墙的问题 ~</li>
</ul>
</div>
<div class="section" id="weechat">
<h2><a class="toc-backref" href="#id5">为啥是 WeeChat ?</a></h2>
<p>多半是 <a class="reference external" href="/links.html#farseerfc">farseerfc</a> 的安利呗~</p>
</div>
<div class="section" id="prolgue-weechat">
<h2><a class="toc-backref" href="#id6">Prolgue: 安装 weechat</a></h2>
<p>weechat 在好几个平台上都有二进制包啦~</p>
<ul class="simple">
<li>Arch Linux: pacman -S weechat</li>
<li>Cygwin (Windows): select WeeChat packages in setup.exe</li>
<li>Debian 及其衍生发行版: apt-get install weechat-curses …</li></ul></div>
<p>Weechat + Glowing Bear 打造一个网页版 IRC ,这样在哪里都可以聊天了呐~</p>
<div class="section" id="irc">
<h2><a class="toc-backref" href="#id4">为啥要自己搭建一个网页版 IRC 咧?</a></h2>
<ul class="simple">
<li>不是啥设备都有聊天软件客户端呐~ (比如 PS Vita ) (╯@Д@)╯ ┻━┻</li>
<li><a class="reference external" href="https://webchat.freenode.net">freenode 的 WebIRC</a> 很不错,但是验证码是 Google 的,于是又引出了怎么翻墙的问题 ~</li>
</ul>
</div>
<div class="section" id="weechat">
<h2><a class="toc-backref" href="#id5">为啥是 WeeChat ?</a></h2>
<p>多半是 <a class="reference external" href="/links.html#farseerfc">farseerfc</a> 的安利呗~</p>
</div>
<div class="section" id="prolgue-weechat">
<h2><a class="toc-backref" href="#id6">Prolgue: 安装 weechat</a></h2>
<p>weechat 在好几个平台上都有二进制包啦~</p>
<ul class="simple">
<li>Arch Linux: pacman -S weechat</li>
<li>Cygwin (Windows): select WeeChat packages in setup.exe</li>
<li>Debian 及其衍生发行版: apt-get install weechat-curses</li>
<li>Fedora Core: dnf install weechat</li>
<li>Gentoo: emerge weechat</li>
<li>Mandriva/RedHat (或其他基于 RPM 包管理器的发行版): rpm -i /path/to/weechat-x.y.z-1.i386.rpm</li>
<li>openSUSE: zypper in weechat</li>
<li>Sourcemage: cast weechat</li>
<li>OS X + Homebrew : brew install weechat --with-python --with-perl</li>
</ul>
<p>如果需要编译的话 , <a class="reference external" href="https://weechat.org/files/doc/stable/weechat_user.en.html#source_package">去看 weechat 的文档啦~</a></p>
</div>
<div class="section" id="act-0-ssl">
<h2><a class="toc-backref" href="#id7">Act 0 : 准备 SSL 证书</a></h2>
<p>首先运行一次 weechat 来生成需要的文件,然后输入 <code class="code">
/quit</code>
来退出.</p>
<blockquote>
$ weechat && mkdir -p ~/.weechat/ssl</blockquote>
<div class="tag info fg-white compound">
<p class="compound-first">如果汝有自己的域名的话,为何不试试 <a class="alert-link reference external" href="https://letsencrypt.org/">Let's Encrypt</a> ?</p>
<p class="compound-last">如果没有的话,那就只好自己签名一个证书啦 _(:з」∠)_</p>
</div>
<ul>
<li><p class="first">如果汝自己有证书:</p>
<blockquote>
<p>把证书和私钥保存成一个文件:</p>
<p>$ cat /path/to/your/cert /path/to/your/privkey >> ~/.weechat/ssl/relay.pem</p>
</blockquote>
</li>
<li><p class="first">如果没有域名的话,只好自己生成一个证书啦 (╯´ー`)╯ ┻━┻</p>
<blockquote>
<p>$ cd ~/.weechat/ssl</p>
<p>$ openssl req -nodes -newkey rsa:2048 -keyout relay.pem -x509 -days 365 -out relay.pem</p>
</blockquote>
</li>
<li><p class="first">接下来运行一下 weechat 来设置一下 relay:</p>
<blockquote>
<p># 咱不知道怎么把 weechat 设置成服务,于是就用 screen 了 😂😂</p>
<p>$ screen weechat</p>
<p># 加载证书和私钥</p>
<p>/relay sslcertkey</p>
<p># 为 relay 设置一个密码 ( 用实际的密码替换 "mypassword" )</p>
<p>/set relay.network.password "mypassword"</p>
<p># 打开中继</p>
<p>/relay add ssl.weechat 9001</p>
<p>然后可以用 Ctrl + a + d 断开 screen 了 (´・ω・`)</p>
</blockquote>
</li>
</ul>
</div>
<div class="section" id="act-1-relay">
<h2><a class="toc-backref" href="#id8">Act 1 : 连接到 relay</a></h2>
<p>如果汝不想自己搭建的话,可以用 glowing-bear 自己的呗~</p>
<p><a class="reference external" href="https://www.glowing-bear.org/">链接在这: https://www.glowing-bear.org/</a></p>
<p>按照上面的指南来连接吧~</p>
<p>如果汝要自己搭建一个的话,首先需要一个 Web 服务器啦~ ( Apache 和 Nginx 都不错,ArchWiki 上能找到文档~)</p>
<dl class="docutils">
<dt>然后从</dt>
<dd><p class="first"><a class="reference external" href="https://github.com/glowing-bear/glowing-bear">glowing-bear 的 Github 项目页面上参考上面的提示把 glowing-bear 下载到本地呐~</a></p>
<p class="last">就是这样?</p>
</dd>
</dl>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id9">常用操作一览</a></h2>
<ul>
<li><p class="first">指定一个服务器:</p>
<blockquote>
<p>/server add <名称>/<端口> <irc服务器的域名> [ -ssl ( 启用SSL ) ] [ -autoconnect 在启动时自动连接 ]</p>
<p>/server add freenode chat.freenode.net/6697 -ssl -autoconnect</p>
</blockquote>
</li>
<li><p class="first">连接到服务器:</p>
<blockquote>
<p>/connect <名称></p>
<p>/connect freenode</p>
</blockquote>
</li>
<li><p class="first">修改昵称</p>
<blockquote>
<p>/nick <新昵称></p>
</blockquote>
</li>
<li><p class="first">加入一个频道</p>
<blockquote>
<p>/join <频道名称></p>
</blockquote>
</li>
</ul>
</div>
<hr class="docutils"/>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id10">(´・ω・`)</a></h2>
</div>
浅说基于 Linux 内核的操作系统 (4) - 八卦一下软件包管理器2016-03-26T00:00:00+08:002016-03-26T00:00:00+08:00ホロtag:None,2016-03-26:/linux/linux_newbie_package_managers.html
<p>软件包管理器差不多是 Linux 发行版的标准配置了吧~</p>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id6">软件包和软件包管理器是啥?</a></h2>
<p>软件包是对于一种软件所进行打包的方式。一般来说一个软件包包含这些内容呐~</p>
<ul class="simple">
<li>软件的源代码或可执行文件.</li>
<li>一些供其它应用 ( 例如软件包管理器 ) 解析的元数据. (例如软件的名称,描述,版本,等等......)</li>
<li>一组用来执行安装前后事务的脚本.</li>
</ul>
<p>而软件包管理器,当然就是来安装/卸载/更新软件包的一组应用程序咯~</p>
<p>软件包管理器是在电脑中自动安装、配制、卸载和升级软件包的工具组合,
在各种系统软件和应用软件的安装管理中均有广泛应用。</p>
<p>一般来说,一个软件包管理器有这样的功能:</p>
<ul class="simple">
<li>从软件仓库中查询软件包的信息,并在需要时下载.</li>
<li>同时处理软件包需要的其它软件 ( 常常称作"依赖" )</li>
<li>验证下载的文件的完整性 ( 例如通过散列值或是数字签名 )</li>
<li>通过归档工具解开软件包,然后把文件安放到正确的位置上.</li>
<li>其它方便用户的功能 ( 例如软件包组,自动检查更新等等 )</li>
</ul>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id7">为啥需要个软件包管理器?</a></h2>
<p>首先大家先来回忆一下在 Windows 里是如何装软件的呗~</p>
<ul class="simple">
<li>打开搜索引擎搜索一下</li>
<li>找到个没被墙的下载网站.....</li>
<li>从网页上数十个硕大而带有欺骗性的广告的缝隙中找到真正的下载链接.</li>
<li>然后下载......</li>
<li>下完以后运行,挑掉一堆勾😂😂,一路下一步直到完成 _(:з …</li></ul></div>
<p>软件包管理器差不多是 Linux 发行版的标准配置了吧~</p>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id6">软件包和软件包管理器是啥?</a></h2>
<p>软件包是对于一种软件所进行打包的方式。一般来说一个软件包包含这些内容呐~</p>
<ul class="simple">
<li>软件的源代码或可执行文件.</li>
<li>一些供其它应用 ( 例如软件包管理器 ) 解析的元数据. (例如软件的名称,描述,版本,等等......)</li>
<li>一组用来执行安装前后事务的脚本.</li>
</ul>
<p>而软件包管理器,当然就是来安装/卸载/更新软件包的一组应用程序咯~</p>
<p>软件包管理器是在电脑中自动安装、配制、卸载和升级软件包的工具组合,
在各种系统软件和应用软件的安装管理中均有广泛应用。</p>
<p>一般来说,一个软件包管理器有这样的功能:</p>
<ul class="simple">
<li>从软件仓库中查询软件包的信息,并在需要时下载.</li>
<li>同时处理软件包需要的其它软件 ( 常常称作"依赖" )</li>
<li>验证下载的文件的完整性 ( 例如通过散列值或是数字签名 )</li>
<li>通过归档工具解开软件包,然后把文件安放到正确的位置上.</li>
<li>其它方便用户的功能 ( 例如软件包组,自动检查更新等等 )</li>
</ul>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id7">为啥需要个软件包管理器?</a></h2>
<p>首先大家先来回忆一下在 Windows 里是如何装软件的呗~</p>
<ul class="simple">
<li>打开搜索引擎搜索一下</li>
<li>找到个没被墙的下载网站.....</li>
<li>从网页上数十个硕大而带有欺骗性的广告的缝隙中找到真正的下载链接.</li>
<li>然后下载......</li>
<li>下完以后运行,挑掉一堆勾😂😂,一路下一步直到完成 _(:з」∠)_</li>
</ul>
<p>是不是很痛苦? 不过通过软件包管理器,汝就可以把安装软件的过程简化到 "安装某个软件" 就可以啦~</p>
<p>而且大多数软件包管理器都是从特定的软件仓库下载软件包,一般不用担心会夹带私货等问题 o(* ̄3 ̄)o</p>
</div>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id8">大家经常说的软件源,镜像源是啥?</a></h2>
<p>软件包管理器会自动上网去下载软件,但他可不是四处瞎找,而是去固定的地方找。</p>
<p>这个固定的地方有个名字,叫做软件源。那里专门提供各
种打包好的软件以及相关的信息介绍,供软件包管理器们下载。</p>
<p>这样的软件源有很多,遍布世界各地,软件包管理器应该去哪个呢?其实他自己也不知道,</p>
<p>他需要一个列表,一个软件源列表。软件包管理器工作的时候,就会去一个软件源列表记录的地方去下载软件。</p>
<p>有的人可能离的挺近,去默认的源就很方便,有的人去默认的源可能就很费劲,没准得绕过半个地
球才行。默认的源不够快,自然就需要找个快一点的源来代替。</p>
<p>然后世界各地的 Linux 用户们就会去建设不同的镜像源来方便本地的 Linux 用户呐~ ( 例如有爱的崔土豪 <a class="reference external" href="/links.html#cuihao">cuihao</a> ~)</p>
</div>
<div class="section" id="id4">
<h2><a class="toc-backref" href="#id9">典型的软件包管理器的工作方式 _(:з」∠)_</a></h2>
<p>咱来举个安装软件包的栗子~</p>
<blockquote>
<p>用户 : 我想安装foo</p>
<p>软件包管理器 : 先让咱在软件仓库里找一下 (´・ω・`)</p>
<p>如果找不到的话,软件包管理器就会告诉用户 "咱找不到汝说的 foo 软件包呐~"</p>
<p>如果找的到的话:</p>
<blockquote>
<p>"咱在软件仓库里找到 foo 了呐~,不过 foo 说要带上它的助手 baz 才会来嘛~</p>
<p>( 就是说要安装 foo 需要同时安装它的依赖项 baz )</p>
<p>如果用户同意了的话,软件包管理器就会去软件仓库把 foo 和 baz 带回来
( 也就是下载这两个软件包 )</p>
<p>接着软件包管理器会检查下载来的软件包是否和数据库中的描述 (散列值 ) 一致,
如果相同的话就会开始安装啦~</p>
</blockquote>
<p>在安装结束后,软件包管理器一般都会把具体过程写到自己的日记 (日志) 里方便以后使用呗~</p>
</blockquote>
<p>当然啦,不同的软件包管理器有不同的表现呐~</p>
</div>
<div class="section" id="id5">
<h2><a class="toc-backref" href="#id10">几种常见的软件包管理器 (及其前端)</a></h2>
<div class="section" id="dpkg-debian-package-manager-debian">
<h3><a class="toc-backref" href="#id11">dpkg ( Debian Package Manager, Debian 软件包管理器 )</a></h3>
<p>dpkg是Debian软件包管理器的基础,它被伊恩·默多克创建于1993年。
用于安装、卸载和供给和.deb软件包相关的信息。</p>
<p>dpkg本身是一个底层的工具。上层的工具,像是APT,被用于从远程获取软件包以及处理复杂的软件包关系。</p>
<p>apt-get / apt / aptitude 和 Synaptic (新立得软件包管理器) 是流行的 dpkg 前端.</p>
<p>基于 Debian 的发行版 (例如 Ubuntu 和 Linux Mint ) 也采用 dpkg 作为包管理器.</p>
</div>
<div class="section" id="rpm-the-rpm-package-manager-rpm">
<h3><a class="toc-backref" href="#id12">RPM ( The RPM Package Manager,RPM 包管理器)</a></h3>
<p>RPM包管理员(简称RPM,全称为The RPM Package Manager)是在Linux下广泛使用的软件包管理器。</p>
<p>RPM此名词可能是指.rpm的文件格式的软件包,也可能是指其本身的软件包管理器(RPM Package Manager)。</p>
<p>最早由Red Hat研制,现在也由开源社区开发。RPM通常随附于Linux发行版,但也有单独将RPM作为应用软件发行的发行版(例如Gentoo)</p>
<p>不过和 dpkg 不一样的是使用 RPM 的 Linux 发行版都喜欢自己造轮子呐~</p>
<ul>
<li><p class="first">Yum(Yellow dog Updater, Modified),最常见的 RPM 前端.</p>
<blockquote>
<p>由Duke University团队,修改Yellow Dog Linux的Yellow Dog Updater开发而成.
Yellow Dog Linux本身,Fedora (22 以前)、Red Hat Enterprise Linux,和 CentOS 都在使用它作为前端.</p>
</blockquote>
</li>
<li><p class="first">DNF,全称Dandified Yum,是RPM发行版的软件包管理器 Yellowdog Updater, Modified(yum)的下一代版本。Fedora 22 开始成为默认的 RPM 前端.</p>
</li>
<li><p class="first">ZYpp (或称 libzypp ) 是一个软件包管理引擎,通常在 openSUSE/SUS E以 YaST 、Zypper 为前端使用。不像其他的软件包管理器,它提供一个强力的可满足性求解器来计算软件包相依性,也提供了一组方便的软件包管理API.它是一个由 Novell 所赞助的开放源代码且为自由软件的项目,采用GNU通用公共许可证第二版或更新授权。</p>
</li>
<li><p class="first">urpmi 是 Mageia/Mandriva Linux 及其派生发行版的软件包管理系统,它解决了RPM包管理员容易让用户经常遇到相依性地狱的问题,也可以从官方或非官方的来源获得软件包.</p>
</li>
</ul>
</div>
<div class="section" id="pacman">
<h3><a class="toc-backref" href="#id13">pacman</a></h3>
<p>pacman软件包管理器是 Arch Linux 的一大亮点。它将一个简单的二进制包格式和易用的构建系统结合了起来。
不管软件包是来自官方的 Arch 库还是用户自己创建,pacman 都能方便得管理。</p>
<p>pacman 通过和主服务器同步软件包列表来进行系统更新,
这使得注重安全的系统管理员的维护工作成为轻而易举的事情。</p>
<p>这种服务器/客户端模式可以使用一条命令就下载/安装软件包,同时安装必需的依赖包。
pacman 用 C 语言编写,使用 .pkg.tar.xz 打包格式。</p>
<p>Arch Linux 和 基于 Arch Linux 的发行版使用 pacman 作为软件包管理器.</p>
<p>( 最早 pacman 既是前端又是后端,后来为了方便 pacman 和其它程序协作,分离出 libalpm 作为后端 )</p>
<p>作为现 Arch Linux 用户,自然要挺一下 Pacman 啦~ ,这里贴出 Arch Linux Trust User <a class="reference external" href="/links.html#farseerfc">farseerfc</a>
在知乎上的一篇回答呗~</p>
<p><a class="reference external" href="https://www.zhihu.com/question/40297380/answer/85848637">为什么说Arch Linux的pacman包管理系统更先进?相比与apt或rpm等好在哪里呢? - fc farseer 的回答 - 知乎</a></p>
</div>
<div class="section" id="portage">
<h3><a class="toc-backref" href="#id14">Portage</a></h3>
<p>Portage是Gentoo Linux所使用的包管理器,基于ports collection机制。Portage的高度灵活性令Gentoo独立于操作系统并获得了元发行版的称号。</p>
<p>Portage主要特色是从源码编译用户所需要安装的软件包。此过程中用户可以调整编译器和目标程序的选项以符合系统需要或自己的喜好。与系统管理相关的功能包括:允许平行版本安装、追踪跨软件包依赖、维护记录已安装软件的数据库、提供本地ebuild库、使本地库与远程库相同步。与个别软件包安装相关的功能有:为目标机器指定编译选项、定制构成软件包的组件。</p>
<p>只是作为基于源代码的软件包管理器,即时编译很消耗 CPU 和 时间 😂😂😂</p>
<hr class="docutils"/>
<p>由于软件包管理器的命令都不相同,咱接下来的文章中会用到 apt / dnf / pacman 当作例子呗~</p>
<p><a class="reference external" href="https://wiki.archlinux.org/index.php/Pacman/Rosetta">ArchWiki 上的 Pacman/Rosetta 页面</a> 有几种常见的软件包管理器的命令比较呗~</p>
<p>按照汝的发行版学习一些基本的操作吧 (下次咱要说啥咧?)</p>
</div>
</div>
浅说基于 Linux 内核的操作系统 (3) - 选择一个发行版2016-03-25T00:00:00+08:002016-03-25T00:00:00+08:00ホロtag:None,2016-03-25:/linux/linux_newbie_choose_a_distro.html
<p>有这么多 Linux 发行版,咱该选哪个呢?</p>
<p>Linux 的发行版实在是太多啦~,光是比较知名的就有数十种
( <a class="reference external" href="http://distrowatch.com/">DistroWatch 是个比较各种发行版流行程度的网站~</a> ).</p>
<p>如何选择真是个难题呐~ (╯@_>@)╯ ┻━┻</p>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id8">萌新选择发行版的第一奥义 (๑•̀ㅂ•́)و✧</a></h2>
<p>萌新选择发行版的第一奥义是......</p>
<blockquote>
一定要选择一个成熟的发行版~</blockquote>
<p>大多数成熟的发行版都具有这样的特征:</p>
<ul>
<li><p class="first">用户和活跃的开发者很多呐~</p>
<blockquote>
<p>成熟的发行版名气都比较大,自然用户就很多呗~</p>
<p>用户可是有可能转变成 (大多数) 不吃人的开发者呐~</p>
<p>成熟的发行版通常都会有很多新人遇到几乎相同的问题,于是就有了第二个特征~</p>
</blockquote>
</li>
<li><p class="first">有详尽的文档</p>
<blockquote>
<p><del>被要求控制自己的本能的</del> 开发者为了方便回答各种萌新向问题,就会写出各种各样的文档啦~</p>
<p>成熟的发行版通常都会有完善的文档 (有些发行版还有多语言版的文档呐~)</p>
</blockquote>
</li>
<li><p class="first">有一群有爱的开发者~</p>
<blockquote>
<p>成熟的发行版一般都会有一群有爱的开发者啦~</p>
<p>他/她/它们编织代码和文档,尽心尽力的回答用户的问题,
努力跟踪上游的更改.Ta们可是很辛苦的哟~</p>
<p>别害怕啦,Ta们 (多数) 不会吃人啦~</p>
</blockquote>
</li>
</ul>
</div>
<div class="section" id="act-2">
<h2><a class="toc-backref" href="#id9">Act 2 : 选择发行版时要考虑的几个因素</a></h2>
<p>说了这么多,那么选择发行版时到底要考虑哪些因素咧? o …</p></div>
<p>有这么多 Linux 发行版,咱该选哪个呢?</p>
<p>Linux 的发行版实在是太多啦~,光是比较知名的就有数十种
( <a class="reference external" href="http://distrowatch.com/">DistroWatch 是个比较各种发行版流行程度的网站~</a> ).</p>
<p>如何选择真是个难题呐~ (╯@_>@)╯ ┻━┻</p>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id8">萌新选择发行版的第一奥义 (๑•̀ㅂ•́)و✧</a></h2>
<p>萌新选择发行版的第一奥义是......</p>
<blockquote>
一定要选择一个成熟的发行版~</blockquote>
<p>大多数成熟的发行版都具有这样的特征:</p>
<ul>
<li><p class="first">用户和活跃的开发者很多呐~</p>
<blockquote>
<p>成熟的发行版名气都比较大,自然用户就很多呗~</p>
<p>用户可是有可能转变成 (大多数) 不吃人的开发者呐~</p>
<p>成熟的发行版通常都会有很多新人遇到几乎相同的问题,于是就有了第二个特征~</p>
</blockquote>
</li>
<li><p class="first">有详尽的文档</p>
<blockquote>
<p><del>被要求控制自己的本能的</del> 开发者为了方便回答各种萌新向问题,就会写出各种各样的文档啦~</p>
<p>成熟的发行版通常都会有完善的文档 (有些发行版还有多语言版的文档呐~)</p>
</blockquote>
</li>
<li><p class="first">有一群有爱的开发者~</p>
<blockquote>
<p>成熟的发行版一般都会有一群有爱的开发者啦~</p>
<p>他/她/它们编织代码和文档,尽心尽力的回答用户的问题,
努力跟踪上游的更改.Ta们可是很辛苦的哟~</p>
<p>别害怕啦,Ta们 (多数) 不会吃人啦~</p>
</blockquote>
</li>
</ul>
</div>
<div class="section" id="act-2">
<h2><a class="toc-backref" href="#id9">Act 2 : 选择发行版时要考虑的几个因素</a></h2>
<p>说了这么多,那么选择发行版时到底要考虑哪些因素咧? o(* ̄3 ̄)o</p>
<div class="section" id="or">
<h3><a class="toc-backref" href="#id10">发行版的制作群 : 社区发行版 or 商业发行版</a></h3>
<p>汝以为以为"非营利组织"的研发能力不如"商业公司"?</p>
<p>其实不然——非营利组织也可以做出精品。想想浏览器的例子:非营利组织开发的 Firefox 远远好于(头号软件公司)微软开发的 IE。</p>
<p>对于这两者的选择,主要的考虑因素是:隐私。</p>
<p>商业发行版在隐私保护方面不如社区发行版。举个栗子 ヨイツの賢狼ホロ, _(:з」∠)_
Ubuntu 属于商业发行版(其后台是 Canonical公司)。Ubuntu曾经爆了一个丑闻:其桌面搜索功能存在隐私泄露风险(相关报道在 <a class="reference external" href="https://www.eff.org/deeplinks/2012/10/privacy-ubuntu-1210-amazon-ads-and-data-leaks">这里</a> )</p>
<p>简而言之: 如果汝在意自己的隐私,那么建议用社区发行版呐~</p>
</div>
<div class="section" id="id3">
<h3><a class="toc-backref" href="#id11">发行版的定位 : 通用 or 专用</a></h3>
<p>所谓的"通用发行版",顾名思义就是:这个发行版可以派上各种用场;反之,"专用发行版"是为特定用途设计,只能用于某些特定场合。</p>
<p>两种各有优缺点——通用发行版虽然用途广,但汝需要自己定制一下啦~。专用发行版虽然用途单一,但很多软件和配置预先都帮你设置好了,可以达到 "开箱即用" 的标准呗~</p>
<p>所以:</p>
<ul>
<li><p class="first">如果汝第一次尝试 Linux?</p>
<blockquote>
<p>建议先尝试"面向桌面"的专用发行版。它们的用户数都比较大,门槛都比较低,上手相对容易。</p>
<p>用了一段时间之后,如果汝觉得要进一步学习的话,不妨来试试那些通用发行版呗~</p>
</blockquote>
</li>
<li><p class="first">已经在用某个 Linux 发行版,想进一步提高?</p>
<blockquote>
<p>去试试通用发行版呗~
一般通用发行版的文档都很齐备,有问题可以先去查查文档,也可以提高汝的英语水平呐~</p>
</blockquote>
</li>
</ul>
<p>( 汝问哪个发行版算通用/专用 ,待会儿告诉汝啊~所以现在先别着急 😂😂😂 )</p>
</div>
<div class="section" id="id4">
<h3><a class="toc-backref" href="#id12">软件的更新速度 : 保守型 or 激进型</a></h3>
<p>简单来说,保守型的发行版通常更在意系统和软件的稳定性/可靠性/安全性。
为了做到这点,适当地牺牲了"新功能"。所以,它们通常都不会采用最新版本的内核或软件。而是采用不太新,但久经考验的版本。</p>
<p>而激进型的呢,这类发行版优先保证"新功能"。所以它们总是第一时间升级内核版本或软件版本。</p>
<p>所以:</p>
<p>如果汝比较关注安全性/稳定性,就选择保守型的发行版. 喜欢新功能就选择激进型的发行版呗~</p>
</div>
<div class="section" id="id5">
<h3><a class="toc-backref" href="#id13">发行版的发布周期 : 基于版本发布 or 滚动更新</a></h3>
<p>按版本发布的发行版,就像Windows 和 OS X 一样,按周期发布一个新版本 (只是有些发行版升级版本时经常挂掉以至于只好重装......)。</p>
<p>但是有少部分发行版采用滚动发布,对于"滚动发布"的模式,不存在版本号,也不需要重装系统。对于这类系统,你只需要安装一次,以后只要通过更新就可以更新系统啦~</p>
<p>采用滚动方式发布的 Linux,通常都是激进型的啦 ( ̄ε(# ̄)☆╰╮( ̄▽ ̄///)</p>
<p>简而言之:</p>
<p>看汝的喜好啦~</p>
</div>
</div>
<div class="section" id="id6">
<h2><a class="toc-backref" href="#id14">说了这么多,到底该选择哪个发行版咧? <(ノ=﹁"﹁=)ノ┻━┻</a></h2>
<p>下面咱就推荐一些发行版咯~ 汝可以根据上面几个因素,挑出几个汝认为合适的发行版试试呗~</p>
<p>(按字母顺序排序,顺便夹杂一些咱自己的偏见 😂😂😂 )</p>
<div class="section" id="arch-linux">
<h3><a class="toc-backref" href="#id15">Arch Linux</a></h3>
<p>属性:激进的社区发行版</p>
<blockquote>
<p>Arch Linux 是一个针对 i686/x86-64 平台独立开发的 GNU/Linux 发行版,遵循轻量、简洁、优雅的开发原则,借灵活的架构应用于各种环境。Arch 安装后只提供最基本的系统,用户可以根据自己的需求来搭建不同的系统环境。官方并不提供图形化的配置工具,多数系统配置是通过修改文本文件来进行的。Arch 尽力提供最新稳定版本的软件。</p>
<p>Arch Linux 采用“滚动升级”策略,这样可以实现“一次安装,永久更新”。升级到下一个“版本”的 Arch Linux 几乎不需要重新安装系统,只需一行命令,你就能轻松的享受到最新的 Arch Linux。</p>
<p>Arch Linux 努力和上游软件源码保持一致,只有使程序能够在 Arch Linux 正常编译运行的补丁才会被加入更新中。</p>
<p>总之, Arch Linux 是一个灵活、简洁的、满足有一定经验的 Linux® 用户的需求的发行版。它强大且易于管理的特性,使其成为可以完美胜任服务器和工作站的发行版。它可以变成任何你想要的样子。如果你也认为这是一个 GNU/Linux 发行版该做的,欢迎你来自由使用并参与其中,为社区做出贡献,欢迎来到 Arch Linux!</p>
<p>---- <a class="reference external" href="https://www.archlinuxcn.org">Arch Linux 中文社区</a></p>
</blockquote>
<p>( PS : 咱现在在用这个 o(* ̄3 ̄)o ,目前感觉良好~ )</p>
</div>
<div class="section" id="debian">
<h3><a class="toc-backref" href="#id16">Debian</a></h3>
<p>属性:偏保守的社区发行版</p>
<blockquote>
<p>Debian 计划是一个致力于创建一个自由操作系统的合作组织。我们所创建的这个操作系统名为 Debian。</p>
<p>操作系统是使计算机运行的基本程序和工具的集合,其中最主要的部分称为内核 (kernel)。内核是计算机中最重要的程序,负责一切基本的调度工作,并让您运行其他程序。</p>
<p>Debian 系统目前采用 Linux 内核或者 FreeBSD 内核。 Linux 是一个最初由 Linus Torvalds 创建,目前由全球成千上万的程序师共同维护的软件。 FreeBSD 是一个包括内核和其它软件的操作系统。</p>
<p>我们所创建的这个操作系统中的大部分基本工具来自于 GNU 工程;因此我们把它们命名为 GNU/Linux 。这些工具同样都是自由的。</p>
<p>当然,人们真正需要的是应用软件,也就是帮助他们完成工作的程序:从文档编辑,到电子商务,到游戏娱乐,到软件开发。Debian 带来了超过 43000 个 软件包 (为了能在您的机器上轻松的安装,这些软件包都已经被编译包装为一种方便的格式) — 这些全部都是自由软件。</p>
<p>这有点像一个高塔:在最底层的是内核,在内核上面的是所有的基本工具,然后是所有您在计算机上运行的软件。最后,在这个高塔顶端的就是 Debian — 把每件事情谨慎的组织和配合在一起,使得它们能够在一起和谐地运作。</p>
<p>---- <a class="reference external" href="https://www.debian.org/intro/about.zh-cn.html">Debian.org</a></p>
</blockquote>
<p>( PS : 咱在 Arch 前就在用 Debian,后来为了使用新软件和因为升级版本时挂了才换的 Arch ~ )</p>
</div>
<div class="section" id="fedora">
<h3><a class="toc-backref" href="#id17">Fedora</a></h3>
<p>属性:偏激进的社区发行版</p>
<blockquote>
<p>Fedora 是一个基于 Linux 的操作系统,旨在为用户提供稳定、安全且易于使用和管理的自由和开源软件。Fedora 发行版是 Fedora 项目的各种自由软件创造中最大的一个。由于其与生俱来的优势,"Fedora" 这个单词通常可以用于表达 Fedora 项目或 Fedora 发行版二者之中的任意一个。</p>
<p>我们尝试总是做正确的事情,并只提供自由开源的软件。我们积极努力保护和推广任何人都可以自由使用和重新发布的解决方案。为此,Fedora 本身的基础设施均由自由软件强力驱动。有鉴于此,所有的开发人员都专注的与 上游开发团队一起紧密工作,于是所有人都能从我们的工作中受益,并尽可能快地获得我们所做的改变。由于 Fedora 推动了大量的 创新项目,这个重点已经有显著和持久的影响。</p>
<p>我们认为软件专利是有害的,它是阻碍软件创新的拦路虎,且不符合自由开源软件的价值观。尽管通过紧密集成专有软件或专利组件可能在表面上改进易用性,但这决不是长久之计。在短期的易用和自由软件的长期发展之间,Fedora 始终倾向于后者。</p>
<p>---- <a class="reference external" href="https://fedoraproject.org/wiki/Overview/zh-cn">Fedora Project Wiki</a></p>
</blockquote>
</div>
<div class="section" id="gentoo-linux">
<h3><a class="toc-backref" href="#id18">Gentoo Linux</a></h3>
<p>属性:激进的社区发行版</p>
<blockquote>
<p>首先,欢迎使用Gentoo,您将会进入一个选择自由和性能至上的世界。Gentoo的一切都是为了自由选择。在安装Gentoo时就数次明确表明了这一特点——用户可以自己选择想要编译的一切内容、选择安装Gentoo的方式、选择想用的系统日志程序等等。</p>
<p>Gentoo 是一个快速、现代化的元发行版,它的设计简洁、灵活。Gentoo 围绕自由软件建立,它不会对它的用户隐瞒“引擎盖下的细节”。Gentoo 所使用的软件包维护系统 Portage 是用 Python 编写的,这意味着用户可以轻松地查看和修改它的源代码。 Gentoo 的软件包管理系统使用源代码包(虽然也支持预编译软件包),并通过标准的文本文件配置Gentoo。换句话说,开放无处不在。</p>
<p>“自由选择”是 Gentoo 运行的关键,这点很重要,大家要理解。我们尽量不强迫用户去做任何他们不喜欢的事情。</p>
<p>---- <a class="reference external" href="https://wiki.gentoo.org/wiki/Handbook:AMD64/Full/Installation/zh-cn">Gentoo Wiki</a></p>
</blockquote>
</div>
<div class="section" id="opensuse">
<h3><a class="toc-backref" href="#id19">openSUSE</a></h3>
<p>属性:可保守可激进的社区发行版</p>
<blockquote>
<p>openSUSE 发行版是一个稳定、易用和完整的多用途发行版,适用于从普通用户到开发者,从个人电脑到服务器,从初学者、有经验的用户到超级极客,总而言之,她适用于任何人!</p>
<p>最近发布的 openSUSE 13.2 ,更新了所有的应用程序的版本,包括服务器的应用程序和桌面的应用程序,并引入一些新的特性,目前她吸纳了1000多个的开源项目。</p>
<p>此外,openSUSE 还是 SUSE 公司屡获大奖的 SUSE Linux 企业版 的产品基础。</p>
<p>---- <a class="reference external" href="https://zh.opensuse.org/Portal:Distribution">openSUSE wiki</a></p>
</blockquote>
<p>openSUSE 有 接近滚动更新的 Tumbleweed ( 风滚草 ) 分支和偏保守的 Leap 分支.</p>
<p>它的一个特色功能是 YaST。这玩意儿类似 Windows 的控制面板,帮你搞定一大堆系统管理的杂事(比如:硬盘分区、软件升级、用户管理、网络配置、等等)</p>
</div>
<div class="section" id="ubuntu-desktop">
<h3><a class="toc-backref" href="#id20">Ubuntu Desktop</a></h3>
<p>属性 : 跟保守的比偏激进、跟激进的比偏保守,所以不知道该算是激进还是保守的商业发行版</p>
<blockquote>
<p>Ubuntu是基于Debian发行版和GNOME桌面环境,与Debian的不同在于它每6个月会发布一个新版本(即每年的四月与十月),每2年发布一个LTS长期支援版本。</p>
<p>普通的桌面版可以获得发布后18个月内的支援,标为LTS(长期支持)的桌面版可以获得更长时间的支援。例如,Ubuntu 8.04 LTS(代号Hardy Heron),其桌面应用系列可以获得为期3年的技术支援,伺服器版可以获得为期5年的技术支援。</p>
<p>而自Ubuntu 12.04 LTS开始,桌面版和伺服器版均可获得为期5年的技术支援。2013年3月有消息指出,Ubuntu计划在4月25日Ubuntu 13.04发布后,将非LTS版本的支援时间自18个月缩短至9个月,并采用滚动发布模式,允许开发者在不升级整个发行版的情况下升级单个核心套件。</p>
<p>---- <a class="reference external" href="https://zh.wikipedia.org/zh-hans/Ubuntu">Wikipedia:Ubuntu</a></p>
</blockquote>
<hr class="docutils"/>
<p>其实 Linux 发行版远不只这几个啦~ 维基百科上有一篇叫做 <a class="reference external" href="https://zh.wikipedia.org/wiki/Linux%E5%8F%91%E8%A1%8C%E7%89%88">Linux 发行版</a> 的条目,上面有更丰富的介绍呐~</p>
<p>那么汝现在赶紧去挑一个发行版啦~ 下一次咱会八卦一下 Linux 的软件包管理器呗~</p>
</div>
</div>
浅说基于 Linux 内核的操作系统 (2) - 萌新向学习建议2016-03-24T00:00:00+08:002016-03-24T00:00:00+08:00ホロtag:None,2016-03-24:/linux/linux_newbie_how_to_learn.html
<p>咱到底该如何使用基于 Linux 内核的操作系统咧?</p>
<p>本来想八卦一下 Linux 的历史来着,但是考虑到oo和oo,就决定 <a class="reference external" href="http://forum.ubuntu.org.cn/viewtopic.php?f=112&t=162040&start=60">放个传送门</a> ~</p>
<p>为了省点字,接下来咱提到的 "Linux" 就是 "基于 Linux 内核的操作系统" 啦~</p>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id5">首先咱来排解一下几种常见的误区呗~</a></h2>
<div class="section" id="linux">
<h3><a class="toc-backref" href="#id6">哇,大家提到的都是命令,Linux 是不是很难学?</a></h3>
<p>的确命令行界面 ( 而不是图形用户界面 ) 是 Linux 的精髓没错,但是汝不要因为这个就望而却步呐~</p>
<p>有一些面向桌面的发行版就通过图形化的设置和管理界面和简单的设置指南赢得了 "用户友好的发行版"的 美誉(?)</p>
<p>什么? 汝在怀疑 Linux 的易用性? <del>(拖出去砍了~)</del></p>
<p>汝不妨去看看现在流行的 Android 系统,它就是基于 Linux 内核的哟~</p>
</div>
<div class="section" id="id3">
<h3><a class="toc-backref" href="#id7">那么 Linux 是不是学起来很容易?</a></h3>
<p>容易的话就用不到咱写这些了呗~</p>
<p>为啥很多人有这种想法捏?主要是被"急功近利 …</p></div></div>
<p>咱到底该如何使用基于 Linux 内核的操作系统咧?</p>
<p>本来想八卦一下 Linux 的历史来着,但是考虑到oo和oo,就决定 <a class="reference external" href="http://forum.ubuntu.org.cn/viewtopic.php?f=112&t=162040&start=60">放个传送门</a> ~</p>
<p>为了省点字,接下来咱提到的 "Linux" 就是 "基于 Linux 内核的操作系统" 啦~</p>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id5">首先咱来排解一下几种常见的误区呗~</a></h2>
<div class="section" id="linux">
<h3><a class="toc-backref" href="#id6">哇,大家提到的都是命令,Linux 是不是很难学?</a></h3>
<p>的确命令行界面 ( 而不是图形用户界面 ) 是 Linux 的精髓没错,但是汝不要因为这个就望而却步呐~</p>
<p>有一些面向桌面的发行版就通过图形化的设置和管理界面和简单的设置指南赢得了 "用户友好的发行版"的 美誉(?)</p>
<p>什么? 汝在怀疑 Linux 的易用性? <del>(拖出去砍了~)</del></p>
<p>汝不妨去看看现在流行的 Android 系统,它就是基于 Linux 内核的哟~</p>
</div>
<div class="section" id="id3">
<h3><a class="toc-backref" href="#id7">那么 Linux 是不是学起来很容易?</a></h3>
<p>容易的话就用不到咱写这些了呗~</p>
<p>为啥很多人有这种想法捏?主要是被"急功近利"的风气影响,变得浮躁了呐~</p>
<blockquote>
<p>「像汝这么聪明的人,只要学会审情度势,一般的事情都能做得很好。不过呢,无论谁都有适合和不适合的事情。虽说是咱让汝做的,但看来汝可能不太适合这一行,感觉这不是汝所期望的。」</p>
<p>「汝若真想和那些家伙一较高下的话,早就最大限度地利用上咱了。」</p>
<p>「汝更希望能稳健地,一步一个脚印地前进,咱也认为这样更适合汝。而在咱所指引的前方,则是完全相反的结局。不是吗?」</p>
</blockquote>
</div>
<div class="section" id="oo-windows-linux-linux">
<h3><a class="toc-backref" href="#id8">oo 在 Windows 上能用 Linux 上就不行, Linux 真难用 ......</a></h3>
<p>Linux : 怪我咯? 😂😂😂😂😂😂😂</p>
<p>一般硬件厂商会优先开发市场占有率最高的那个系统的驱动程序,哪个系统?目前来说,就是 Windows 啦。而 Linux 就经常遇到一些无法使用的硬件,很多人还抱怨 Linux 无能,这不是冤枉么~~~</p>
<blockquote>
<p>「比起在书上抹墨水,汝会更热衷于在咱脸上抹黑。」</p>
<p>「……你觉得自己说这句话很妙吗?」</p>
<p>「因为汝这种人说谎不眨眼的啊。一定会有的没的乱写一通。真是的,汝究竟打算写什么书啊?」</p>
<p>「你是不是想说我的脸皮跟书一样厚?」</p>
</blockquote>
</div>
</div>
<div class="section" id="id4">
<h2><a class="toc-backref" href="#id9">那么到底该如何渐进的学习 Linux 咧?</a></h2>
<blockquote>
<p>「汝的脑筋虽然转得快,但经验还是不够。」</p>
<p>「但是反过来说,只要经过岁月的累积就可以变成有智慧的人。」</p>
<p>「你是说几百年后吗?」</p>
<p>「哈哈哈哈哈,汝的脑筋转得真快。」</p>
</blockquote>
<p>( 这是咱的一种建议,仅供参考哦,如果汝有更好地建议的话,不妨来告诉咱呗~ )</p>
<ul>
<li><p class="first">先从虚拟机开始尝试,等熟练以后再安装在实体机上</p>
<blockquote>
<p>虚拟机,顾名思义,是"虚拟的"啦。即使是格式化了虚拟机的硬盘,都不会影响到汝的实体机呐~(Host OS)</p>
<p>在汝摸索的阶段,可以充分利用虚拟机的"快照功能"哦~"快照功能"就如同"后悔药"。
万一汝不小心搞坏了系统,直接回退到这个快照,系统就恢复原样啦。</p>
<p>常见的虚拟机软件(比如 VirtualBox、VMware),在虚拟系统(Guest OS)中仿真出来的虚拟硬件,往往是比较常见的硬件。
因为是比较常见的虚拟硬件,Linux 通常都能直接识别出那些虚拟硬件啦~ 这就避免了折腾硬件驱动的麻烦。</p>
<p>如果不知道怎样用虚拟机的话 ,`看看编程随想的 "扫盲操作系统虚拟机" 系列呗~ <<a class="reference external" href="https://program-think.blogspot.com/2012/10/system-vm-0.html">https://program-think.blogspot.com/2012/10/system-vm-0.html</a>>`_</p>
</blockquote>
</li>
<li><p class="first">从图形界面开始,一步一步掌握各种命令呗~</p>
<blockquote>
<p>首先汝试着先用图形界面完成日常化的操作呗~</p>
<p>可以先从图形界面入手。先通过图形界面,了解 Linux 的各种功能。等到慢慢熟悉了,再逐步学习命令行界面的使用。</p>
</blockquote>
</li>
</ul>
<p> 命令行界面是 Linux 的精髓之一。善于使用命令行,汝的效率会成倍提高的呐~。</p>
<p> 所以,总有一天汝是要面对命令行界面的啦~。</p>
<ul>
<li><p class="first">先从系统默认的配置开始,再逐渐 DIY 出属于汝自己的配置呗~</p>
<blockquote>
<p>有些"傻瓜化"的发行版,它会内置各种汝需要的软件。</p>
<p>一旦装好系统之后,(只需使用它的默认设置)就可以完成日常操作了。显然,这类发行版更容易上手呐~。</p>
</blockquote>
</li>
</ul>
<p> 但是,如果汝想在 Linux 领域有所深入,想要充分发挥其特长,不应该仅仅停留在"傻瓜化"的层面;</p>
<p> 汝需要逐渐的摸索,不断地折腾,搞定各种"DIY"。在折腾的过程中,汝自然会学到很多东西呐~ ( 折腾是生命的动力......) 。</p>
<hr class="docutils"/>
<blockquote>
<p>「应该只是你的脑袋用了太久,变得老旧不堪用吧。」</p>
<p>「呵呵呵呵。汝知道狼为什么要在山里头袭击人类吗?」</p>
<p>「那是因为狼想吃人类的脑袋,好得到人类的智慧。」</p>
<p>「汝还太嫩了,根本不是咱的对手。」</p>
</blockquote>
<hr class="docutils"/>
<p>大概就这些? 下次咱再教汝选择一个合适的发行版呐~</p>
</div>
浅说基于 Linux 内核的操作系统 (1) - 一些名词解释2016-03-23T00:00:00+08:002016-03-31T00:00:00+08:00ホロtag:None,2016-03-23:/linux/linux_newbie_concepts.html
<p>是不是有时觉得 Linux 中的概念有点天花乱坠 _(:з」∠)_</p>
<p>这篇文章会随着系列的更新介绍咱用到的术语的意思呐,也许汝不一定都要知道~有更新时会通知汝啦~</p>
<p>但是咱不是专业的啦,如果汝正好是个 Linux 高手的话, 来评论里或是直接和咱交流下呗~</p>
<p>本文 <ruby><rb>部分</rb><rp>(</rp><rt>几乎全部</rt><rp>)</rp></ruby> 内容来自于维基百科 o(* ̄3 ̄)o ( 不过和咱一样都是知识共享 署名-相同方式共享 3.0协议授权啦~ )</p>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id8">基本中的基本概念 _(:з」∠)_</a></h2>
<div class="section" id="id2">
<h3><a class="toc-backref" href="#id9">操作系统</a></h3>
<p>操作系统(英语:operating system,缩写:OS)是管理计算机硬件与软件资源的计算机程序,同时也是计算机系统的核心与基石。
操作系统需要处理如管理与配置内存、决定系统资源供需的优先次序、控制输入与输出装置、操作网络与管理文件系统等基本事务。
操作系统也提供一个让使用者与系统互动的操作界面。
操作系统的型态非常多样,不同机器安装的操作系统可从简单到复杂,可从非智慧型手机的嵌入式系统到超级电脑的大型作业系统。
许多操作系统制造者对它涵盖范畴的定义也不尽一致,例如有些操作系统整合了图形用户界面,而有些仅使用命令行界面,而将图形用户界面视为一种非必要的应用程式 …</p></div></div>
<p>是不是有时觉得 Linux 中的概念有点天花乱坠 _(:з」∠)_</p>
<p>这篇文章会随着系列的更新介绍咱用到的术语的意思呐,也许汝不一定都要知道~有更新时会通知汝啦~</p>
<p>但是咱不是专业的啦,如果汝正好是个 Linux 高手的话, 来评论里或是直接和咱交流下呗~</p>
<p>本文 <ruby><rb>部分</rb><rp>(</rp><rt>几乎全部</rt><rp>)</rp></ruby> 内容来自于维基百科 o(* ̄3 ̄)o ( 不过和咱一样都是知识共享 署名-相同方式共享 3.0协议授权啦~ )</p>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id8">基本中的基本概念 _(:з」∠)_</a></h2>
<div class="section" id="id2">
<h3><a class="toc-backref" href="#id9">操作系统</a></h3>
<p>操作系统(英语:operating system,缩写:OS)是管理计算机硬件与软件资源的计算机程序,同时也是计算机系统的核心与基石。
操作系统需要处理如管理与配置内存、决定系统资源供需的优先次序、控制输入与输出装置、操作网络与管理文件系统等基本事务。
操作系统也提供一个让使用者与系统互动的操作界面。
操作系统的型态非常多样,不同机器安装的操作系统可从简单到复杂,可从非智慧型手机的嵌入式系统到超级电脑的大型作业系统。
许多操作系统制造者对它涵盖范畴的定义也不尽一致,例如有些操作系统整合了图形用户界面,而有些仅使用命令行界面,而将图形用户界面视为一种非必要的应用程式。</p>
<p>操作系统理论在计算机科学中,为历史悠久而又活跃的分支;而操作系统的设计与实现则是软件工业的基础与核心。</p>
<p>(下面是一幅典型的操作系统架构图~)</p>
<img alt="典型的操作系统结构图" class="materialboxed responsive-img" src="/images/Linux/1280px-Operating_system_architecture.svg.png"/>
<p>操作系统位于底层硬件与用户之间,是两者沟通的桥梁。用户可以通过操作系统的用户界面,输入命令。操作系统则对命令进行解释,驱动硬件设备,实现用户要求。以现代标准而言,一个标准PC的操作系统应该提供以下的功能:</p>
<ul class="simple">
<li>进程管理(Processing management)</li>
<li>内存管理(Memory management)</li>
<li>文件系统(File system)</li>
<li>网络通信(Networking)</li>
<li>安全机制(Security)</li>
<li>用户界面(User interface)</li>
<li>驱动程序(Device drivers)</li>
</ul>
</div>
<div class="section" id="id3">
<h3><a class="toc-backref" href="#id10">操作系统内核</a></h3>
<p>在計算機科學中,内核(英语:Kernel),又稱核心,是一個電腦程式,用來管理軟體發出的資料I/O(輸入與輸出)要求,將這些要求轉譯為資料處理的指令,
交由中央處理器(CPU)及電腦中其他電子元件進行處理,是現代操作系统中最基本的部分。它是为众多应用程序提供对计算机硬件的安全访问的一部分软件,
这种访问是有限的,并由内核决定一个程序在什么时候对某部分硬件操作多长时间。直接对硬件操作是非常复杂的。所以内核通常提供一种硬件抽象的方法,
来完成这些操作。通过进程间通信机制及系统调用,应用进程可间接控制所需的硬件资源(特别是处理器及IO设备)。</p>
<p>严格地说,内核并不是计算机系统中必要的组成部分。程序可以直接地被调入计算机中执行;这样的设计,
说明了设计者不希望提供任何硬件抽象和操作系统的支持;它常见于早期计算机系统的设计中。最终,一些辅助性程序,例如程序加载器和调试器,
被设计到机器核心当中,或者写入在只读记忆体里。这些变化发生时,操作系统内核的概念就渐渐明晰起来了。</p>
<p>所谓的"操作系统内核",就是操作系统最核心最关键的部件啦。它负责一些最基本的工作,比如:管理硬件驱动、管理内存、管理文件系统、管理进程、等等。这些工作只要少了任何一样,整个操作系统都没法运转。</p>
</div>
</div>
<div class="section" id="linux">
<h2><a class="toc-backref" href="#id11">Linux 相关 ~(>_<~)</a></h2>
<div class="section" id="id4">
<h3><a class="toc-backref" href="#id12">Linux 内核</a></h3>
<p>Linux内核(英语:Linux kernel),是一种计算机操作系统内核,以C语言和汇编语言写成,符合POSIX标准,以GNU通用公共许可证釋出。Linux内核最早是由芬兰黑客林納斯·托瓦茲为尝试在自己的英特尔x86架构计算机上提供自由免费的类Unix系统而开发的。该计划开始于1991年,林納斯·托瓦茲当时在Usenet新闻组comp.os.minix登载帖子[7],这份著名的帖子標示着Linux内核计划的正式开始。</p>
<p>在计划的早期有一些Minix的黑客提供了协助,而今天全球有无数程序员正在为该计划无偿提供帮助。</p>
<p>从技术上说Linux只是一个内核。“内核”指的是一个提供硬件抽象层、磁盘及文件系统控制、多任务等功能的系统软件。一个内核并不是一套完整的操作系统。有一套基于Linux内核的完整操作系统叫作Linux操作系统,或是GNU/Linux(在该系统中包含了很多GNU计划的系统组件)。</p>
<p>Linux 内核的特点是:彻底的开放性。所谓的"开放性"包括如下几方面:</p>
<ol class="arabic simple">
<li>任何人都可以随意获取(可以从 Linux Kernel 官网直接下)</li>
<li>任何人都可以免费获取(完全不用花银子)</li>
<li>任何人都可以参与开发(阿猫阿狗都可以向 Linux 社区提交代码,只要你提交的代码符合要求,就会被合并到内核主线)</li>
</ol>
</div>
<div class="section" id="id5">
<h3><a class="toc-backref" href="#id13">Linux 操作系统</a></h3>
<p>Linux 是一種自由和開放源碼的類UNIX作業系統。该操作系统的内核由林纳斯·托瓦兹在1991年10月5日首次发布。
在加上使用者空間的應用程式之後,成為Linux作業系統。Linux也是自由软件和开放源代码软件发展中最著名的例子。
只要遵循GNU通用公共许可证,任何个人和机构都可以自由地使用Linux的所有底层源代码,也可以自由地修改和再发布。
大多數Linux系統還包括像提供GUI的X Window之類的程序。除了一部分專家之外,大多數人都是直接使用Linux發行版,而不是自己選擇每一樣組件或自行設置。</p>
<p>严格来讲,术语Linux只表示操作系统内核本身,但通常采用Linux内核来表达该意思。Linux则常用来指基于Linux内核的完整操作系统,
包括GUI组件和许多其他实用工具。由于这些支持用户空间的系统工具和库主要由理查德·斯托曼于1983年发起的GNU计划提供,自由软件基金会提议将该组合系统命名为GNU/Linux,但Linux不屬於GNU計劃。</p>
</div>
<div class="section" id="id6">
<h3><a class="toc-backref" href="#id14">Linux 发行版</a></h3>
<p>Linus 领导的开源社区只负责开发内核,不开发其它的东西(比如:运行库、图形界面、应用软件、等)。</p>
<p>这就引出一个问题——光有一个赤裸裸的内核,用户是没法用的(就好比你光拿到一个汽车引擎,你是没法开车的)。为此,就有一大帮开源社区或商业公司,在这个裸露的内核外面,再包上一些东西(比如:运行库、应用软件)。经过这样包装之后,就成为"发行版"。</p>
<p>在这种模式下,会有各种各样的发行版,正好可以覆盖千奇百怪的需求;其次,同质化的发行版之间会产生竞争,最终只有优秀的发行版会存活,差劲的发行版会逐渐消亡——这就是开源生态圈的"达尔文主义"。</p>
<p>如果用一个词来形容 Linux 的优点,那就是——多元化。内核的开发是多元化的(任何人都可以参与),发行版是多元化的(任何人都可以搞发行版)。</p>
</div>
</div>
<div class="section" id="id7">
<h2><a class="toc-backref" href="#id15">硬盘相关</a></h2>
<div class="section" id="mbr-master-boot-record">
<h3><a class="toc-backref" href="#id16">MBR ( Master Boot Record , 主引导记录 )</a></h3>
<p>主引导记录(Master Boot Record,缩写:MBR),又叫做主引导扇区,是计算机开机后访问硬盘时所必须要读取的首个扇区,它在硬盘上的三维地址为(柱面,磁头,扇区)=(0,0,1)。在深入讨论主引导扇区内部结构的时候,有时也将其开头的446字节内容特指为“主引导记录”(MBR),其后是4个16字节的“磁盘分区表”(DPT),以及2字节的结束标志(55AA)。因此,在使用“主引导记录”(MBR)这个术语的时候,需要根据具体情况判断其到底是指整个主引导扇区,还是主引导扇区的前446字节。</p>
<p>从主引导记录的结构可以知道,它仅仅包含一个64个字节的硬盘分区表。由于每个分区信息需要16个字节,所以对于采用MBR型分区结构的硬盘,最多只能识别4个主要分区(Primary partition)。所以对于一个采用此种分区结构的硬盘来说,想要得到4个以上的主要分区是不可能的。这里就需要引出扩展分区了。扩展分区也是主要分区的一种,但它与主分区的不同在于理论上可以划分为无数个逻辑分区。[2]</p>
<p>扩展分区中逻辑驱动器的引导记录是链式的。每一个逻辑分区都有一个和MBR结构类似的扩展引导记录(EBR),其分区表的第一项指向该逻辑分区本身的引导扇区,第二项指向下一个逻辑驱动器的EBR,分区表第三、第四项没有用到。</p>
<p>Windows系统默认情况下,一般都是只划分一个主分区给系统,剩余的部分全部划入扩展分区。这里有下面几点需要注意:</p>
<ul class="simple">
<li>在MBR分区表中最多4个主分区或者3个主分区+1个扩展分区,也就是说扩展分区只能有一个,然后可以再细分为多个逻辑分区。</li>
<li>在Linux系统中,硬盘分区命名为sda1-sda4或者hda1-hda4(其中a表示硬盘编号可能是a、b、c等等)。在MBR硬盘中,分区号1-4是主分区(或者扩展分区),逻辑分区号只能从5开始。</li>
<li>在MBR分区表中,一个分区最大的容量为2T,且每个分区的起始柱面必须在这个disk的前2T内。你有一个3T的硬盘,根据要求你至少要把它划分为2个分区,且最后一个分区的起始扇区要位于硬盘的前2T空间内。[3]如果硬盘太大则必须改用GPT。</li>
</ul>
</div>
<div class="section" id="uefi-unified-extensible-firmware-interface">
<h3><a class="toc-backref" href="#id17">UEFI ( Unified Extensible Firmware Interface, 统一可扩展固件界面)</a></h3>
<p>统一可扩展固件界面(Unified Extensible Firmware Interface, UEFI)是一种个人电脑系统规格,用来定义作业系统与系统固件之间的软件界面,作为BIOS的替代方案[1]。可扩展固件接口负责加电自检(POST)、连系作业系统以及提供连接作业系统与硬体的介面。</p>
<p>UEFI的前身是Intel在1998年开始开发的Intel Boot Initiative,后来被重命名为可延伸韧体介面(Extensible Firmware Interface, EFI)。Intel在2005年将其交由统一可扩展固件接口论坛(Unified EFI Forum)来推广与发展,为了凸显这一点,EFI也更名为UEFI(Unified EFI)。UEFI论坛的创始者是11家知名电脑公司,包括Intel、IBM等硬件厂商,软件厂商Microsoft,及BIOS厂商AMI、Insyde及Phoenix。</p>
</div>
</div>
为啥汝不放弃不自由?2016-03-22T00:00:00+08:002016-03-22T00:00:00+08:00ホロtag:None,2016-03-22:/life/why_not_give_up_non_free.html
<p>是什么让汝甘愿选择被不自由限制而不是放弃封闭走向自由?</p>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id6">这个算不算引子?</a></h2>
<blockquote>
<p>解放一个习惯于被奴役的民族比奴役一个习惯于自由的民族更难</p>
<p>----孟德斯鸠 (启蒙思想家)</p>
</blockquote>
<p><a class="reference external" href="//webchat.freenode.net/?channels=archlinux-cn">#archlinux-cn</a> 里的 <a class="reference external" href="/links.html#farseerfc">farseerfc</a> 说自己要离开 Telegram 了,于是用 fishroom 换掉了兢兢业业若干年 <del>虽然偶尔会黑化</del> 的阿卡林......</p>
<p>原因好像是 Telegram 有要变的封闭的趋势:</p>
<blockquote>
<p>Peter Cai - PGP C297B594, [21.03.16 20:53]
我不认为他们会开</p>
<p>Peter Cai - PGP C297B594, [21.03.16 20:53]
我也不希望开源。。</p>
<p>farseerfc 😂 0xC13D4796, [21.03.16 20:53]
從一開始就說要開,然後到現在連協議都封閉了,只有官方授權的客戶端開發者能看到最新協議……</p>
<p>wicast …</p></blockquote></div>
<p>是什么让汝甘愿选择被不自由限制而不是放弃封闭走向自由?</p>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id6">这个算不算引子?</a></h2>
<blockquote>
<p>解放一个习惯于被奴役的民族比奴役一个习惯于自由的民族更难</p>
<p>----孟德斯鸠 (启蒙思想家)</p>
</blockquote>
<p><a class="reference external" href="//webchat.freenode.net/?channels=archlinux-cn">#archlinux-cn</a> 里的 <a class="reference external" href="/links.html#farseerfc">farseerfc</a> 说自己要离开 Telegram 了,于是用 fishroom 换掉了兢兢业业若干年 <del>虽然偶尔会黑化</del> 的阿卡林......</p>
<p>原因好像是 Telegram 有要变的封闭的趋势:</p>
<blockquote>
<p>Peter Cai - PGP C297B594, [21.03.16 20:53]
我不认为他们会开</p>
<p>Peter Cai - PGP C297B594, [21.03.16 20:53]
我也不希望开源。。</p>
<p>farseerfc 😂 0xC13D4796, [21.03.16 20:53]
從一開始就說要開,然後到現在連協議都封閉了,只有官方授權的客戶端開發者能看到最新協議……</p>
<p>wicast C, [21.03.16 20:53]
开源也没啥卵用感觉…</p>
<p>Peter Cai - PGP C297B594, [21.03.16 20:53]
除非能出现第二个freenode</p>
<p>Peter Cai - PGP C297B594, [21.03.16 20:53]
不然开了等于没用</p>
<p>wicast C, [21.03.16 20:54]
卧槽…连协议都封闭了么…</p>
<p>teleboto, [21.03.16 20:54]
[toxsync] (quininer) 其实不如把现有功能做成 xmpp 插件</p>
<p>Peter Cai - PGP C297B594, [21.03.16 20:54]
我看文档和以前一样</p>
<p>wicast C, [21.03.16 20:54]
吃枣药丸</p>
<p>Peter Cai - PGP C297B594, [21.03.16 20:54]
反正本来就看不懂</p>
<p>teleboto, [21.03.16 20:55]
[toxsync] (yatseni) 是freenode是悲剧吗</p>
<p>farseerfc 😂 0xC13D4796, [21.03.16 20:55]
cutegram 的開發者抱怨了很久了,所以現在二步驗證什麼的都還在從開源出的客戶端代碼慢慢逆向協議</p>
<p>Peter Cai - PGP C297B594, [21.03.16 20:55]
<a class="reference external" href="https://core.telegram.org/mtproto">https://core.telegram.org/mtproto</a></p>
<p>teleboto, [21.03.16 20:55]
[xmppbot] [Lisa] teleboto: ⇪网页标题: MTProto Mobile Protocol</p>
<p>Peter Cai - PGP C297B594, [21.03.16 20:55]
🌚这个一直是这样</p>
<p>teleboto, [21.03.16 20:55]
[toxsync] (quininer) 中心服务爱好者快转 wire 吧</p>
<p>Peter Cai - PGP C297B594, [21.03.16 20:56]
wire有什么好转的。。</p>
<p>Peter Cai - PGP C297B594, [21.03.16 20:56]
。。还不如转WhatsApp</p>
<p>teleboto, [21.03.16 20:56]
[toxsync] (quininer) wire 很好啊 =-=</p>
<p>wicast C, [21.03.16 20:56]
[In reply to farseerfc 😂 0xC13D4796]
有不开源的部分?</p>
<p>teleboto, [21.03.16 20:56]
[toxsync] (quininer) wire 是完整的 axolotl 协议实现</p>
<p>teleboto, [21.03.16 20:57]
[toxsync] (yatseni) qtox 1.3.0有什么改进?</p>
<p>teleboto, [21.03.16 20:57]
[toxsync] (quininer) yatseni: markdown 支持?</p>
<p>farseerfc 😂 0xC13D4796, [21.03.16 20:57]
<a class="reference external" href="https://core.telegram.org/schema">https://core.telegram.org/schema</a> 這邊公開到 layer 23 , cutegram 支持到 layer 25</p>
<p>teleboto, [21.03.16 20:57]
[xmppbot] [Lisa] teleboto: ⇪网页标题: Current TL-schema</p>
<p>Peter Cai - PGP C297B594, [21.03.16 20:57]
telegram至少还有bot API</p>
<p>wicast C, [21.03.16 20:57]
真是吃枣药丸🌚</p>
<p>farseerfc 😂 0xC13D4796, [21.03.16 20:58]
[In reply to wicast C]
這倒沒有的樣子,總之協議現在在代碼裏……</p>
<p>wicast C, [21.03.16 20:58]
Tg也就前端的东西做的还行</p>
<p>teleboto, [21.03.16 20:58]
[toxsync] (quininer) bot api 这部分是完全闭源的吧?</p>
<p>Peter Cai - PGP C297B594, [21.03.16 20:59]
是的。</p>
<p>Peter Cai - PGP C297B594, [21.03.16 20:59]
但是至少有。。</p>
<p>Peter Cai - PGP C297B594, [21.03.16 20:59]
其他中心化服务哪个有。。</p>
<p>Peter Cai - PGP C297B594, [21.03.16 20:59]
wire这玩意连自己艹都没办法</p>
<p>farseerfc 😂 0xC13D4796, [21.03.16 21:00]
<a class="reference external" href="https://github.com/telegramdesktop/tdesktop/blob/master/Telegram/SourceFiles/mtproto/mtpCoreTypes.h#L371">https://github.com/telegramdesktop/tdesktop/blob/master/Telegram/SourceFiles/mtproto/mtpCoreTypes.h#L371</a> 現在 tdesktop 在 layer 49 了已經……</p>
<p>David Huang, [21.03.16 21:00]
[In reply to Peter Cai - PGP C297B594]
telegram总有一天要走向封闭的(</p>
<p>teleboto, [21.03.16 21:00]
[toxsync] (quininer) 不用说"总有一天",一直是封闭的</p>
<p>Peter Cai - PGP C297B594, [21.03.16 21:01]
[Forwarded from teleboto]
[toxsync] (quininer) 不用说"总有一天",一直是封闭的</p>
</blockquote>
<p>然后咱突然想到了百合姐的某篇文章:</p>
<blockquote>
<p>在那个世界里我活得很好。即使是遭受重大的人生挫折时也不曾对那个世界感到疲惫,依旧会写代码,写博客。</p>
<p>可现在,我累了。</p>
<p>其实我有好些想写博客的材料,但是都没有写。我也有好些项目的想法,可是它们还在我的 TODO wiki 里。Arch Linux 中文社区还有许多要做的事情,可我也不想去做了。</p>
<p>我不知道是为什么。也许是孤单吧。一直以来都只有自己。即使 Arch Linux 社区,在做事的人也渐渐少了。而曾经在网上认识的朋友,渐渐地都有了自己的生活。随着 Google Hangout 取代 Google Talk、新浪微博取代 Twitter,还有微信,这些封闭的东西取代了自由的工具,可以放有用或者有意思的机器人的地方却越来越荒芜了。</p>
<p>也许是年纪渐渐大了。青春越来越少,而我却依旧在飘荡。</p>
<p>---- <a class="reference external" href="http://lilydjwg.is-programmer.com/posts/179502.html">依云's Blog:我想我失去了最后的领地</a></p>
</blockquote>
<p>连咱也何尝不是如此? 虽然咱会用像 XMPP , Tox 和 GNU/Linux 一类的自由软件,也曾经试图以 Richard Stallman 为目标,然而还是没法做到. Pia!<(=o ‵-′)ノ☆</p>
<p>最后咱还是不得不承认咱没办法完全放弃不自由呐~ 那么到底是为啥咧?</p>
</div>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id7">自由对自己的代价太大 _(:з」∠)_</a></h2>
<p>( 也就是获得自由带来的损失比不自由所带来的限制更大? )</p>
<p>举一个咱自己的栗子 (´・ω・`) :</p>
<p>前几天入手一部预装 <ruby><rb>Windows</rb><rp>(</rp><rt>Windoge</rt><rp>)</rp></ruby> 10 的平板,想当然的咱想装上 Arch Linux 啦,结果当咱装上以后:</p>
<ul class="simple">
<li>触屏和网卡是废的 ( (╯T∧T)╯ ┻━┻ 装 Arch Linux 时没有网可是致命的 )</li>
<li>分辨率太高以致于默认的字太小😂😂😂 ( GNOME 的 HiDPI 只能整数倍调整差评,KDE plasma 调一调倒是能看了...... )</li>
</ul>
<p>于是只好留着 Windows 😂😂😂</p>
</div>
<div class="section" id="id4">
<h2><a class="toc-backref" href="#id8">所谓的自由根本没法实现?</a></h2>
<p>比如 iOS 和 Windows Phone ,汝都没法更换上面的操作系统,也不知道上面的系统都干了些啥......</p>
<p>尽管 Telegram 越来越封闭 , 现在它还有相对开放的 Client / Bot API,而更 "流行" 的 QQ / 微信 / WhatsAPP / Skype /.... 咧?</p>
<p>尽管 Android 手机 / Windows 设备可以刷机,然而流行的硬件却没有一个是彻底开放的,谁能相信后门不会在固件或是硬件上?</p>
<blockquote>
(╯°△°)╯ ┻━┻</blockquote>
</div>
<div class="section" id="id5">
<h2><a class="toc-backref" href="#id9">没法带领身边的朋友逃离不自由?</a></h2>
<p>还是举咱自己的栗子? (╯>▽<)╯ ┻━┻ :</p>
<ul>
<li><p class="first">尽管咱卸载了 QQ ,但还是装在了另一台手机上......</p>
<blockquote>
<p>周围的人和学校的辅导员都还在用 QQ , 咱试图向社团的同学安利 Telegram ,然而......</p>
<blockquote>
<p>(╯=﹁"﹁=)╯ ┻━┻ <del>(亏还把自己称作计算机精英协会......干脆全吃掉然后解散好了(雾))</del></p>
</blockquote>
</blockquote>
</li>
<li><p class="first">虽然咱自己很少用 Windows 了,然而经常被拉去修 Windows 电脑:</p>
<blockquote>
<p>Baka Windows 总是会越来越慢,而原因基本上都是招来了病毒,木马或是oo全家桶😂😂</p>
<p>就算咱耐心的一个一个卸载,过几天还是会以同样的理由被拉回去重修......</p>
<p>以后就干脆直接重装系统了 (╯´︿`)╯ ┻━┻</p>
<p>/me <del>再遇到这样的事干脆直接砸了好了</del></p>
</blockquote>
</li>
<li><p class="first">明明有那么多种纯文字的标记语言可以用可咱还是要用 Office (ノ=Д=)ノ┻━┻</p>
<blockquote>
<p>(╯T▽T)╯ ┻━┻ 哪怕是 LibreOffice 也好啊 (然而并没有)</p>
<p>(╯=﹁"﹁=)╯ ┻━┻ 没 LibreOffice 哪怕是新版的 Microsoft Office 能部分兼容 OpenDocument 也好啊 (然而几乎全都是 03 )</p>
<p>嘿嘿嘿......像造点大新闻了呐~</p>
<p><del>某学校 M$ Office 用户一夜间全部失踪</del> ( 雾 again~ )</p>
</blockquote>
</li>
</ul>
<p>等等等等......</p>
<hr class="docutils"/>
<blockquote>
<p>「真是太感谢了。我终于能融入这个新世界了。」</p>
<p>「我们没法像过去那样自由自在了,但是……」</p>
<p>「但是,这个世上还有我们的位置,还有我们的任务。虽然故乡还未曾得见,但不要哭鼻子哦?不能给这个年轻人添麻烦。」</p>
</blockquote>
<p>给渴望自由的人的空间越来越少了呐~所谓的自由,大概一直在路上吧......</p>
</div>
发布 Pelican 博客的几种方式2016-03-19T00:00:00+08:002016-03-19T00:00:00+08:00ホロtag:None,2016-03-19:/pelican/pelican_output.html
<p>汝的 Pelican 博客有几篇文章了没?想不想让其他人也看到?</p>
<p>如果汝在一开始使用了 <code class="code">
pelican-quickstart</code>
来创建汝的博客的话,后面可能会方便点呗~
( 因为它帮汝生成了一个 Makefile 呐~ 然而 baka Windows 并不能用 Makefile (ノ=Д=)ノ┻━┻ )</p>
<div class="section" id="pelican-quickstart-makefile">
<h2><a class="toc-backref" href="#id6">没用 pelican-quickstart ? 可以自己来写一个 Makefile 呗~</a></h2>
<p>样例在这:</p>
<script src="https://gist.github.com/KenOokamiHoro/223974ff5884c6eb82a5.js"></script><p>(这里用到了 Github Gist 嘛,如果看不到的话, <a class="reference external" href="https://gist.github.com/KenOokamiHoro/223974ff5884c6eb82a5">链接在这</a> )</p>
<p>对于喜欢自己动手的 <del>菊苣</del> 来说, Makefile 里的命令稍加改造就可以直接执行呐~</p>
<p>在下面的例子中,上面是 Make 规则,下面是实际运行的命令呗~</p>
<p>( <code class="code">
/path/to/your/content/</code>
是汝的内容存放的目录, <code class="code">
path/to/your/settings …</code></p></div>
<p>汝的 Pelican 博客有几篇文章了没?想不想让其他人也看到?</p>
<p>如果汝在一开始使用了 <code class="code">
pelican-quickstart</code>
来创建汝的博客的话,后面可能会方便点呗~
( 因为它帮汝生成了一个 Makefile 呐~ 然而 baka Windows 并不能用 Makefile (ノ=Д=)ノ┻━┻ )</p>
<div class="section" id="pelican-quickstart-makefile">
<h2><a class="toc-backref" href="#id6">没用 pelican-quickstart ? 可以自己来写一个 Makefile 呗~</a></h2>
<p>样例在这:</p>
<script src="https://gist.github.com/KenOokamiHoro/223974ff5884c6eb82a5.js"></script><p>(这里用到了 Github Gist 嘛,如果看不到的话, <a class="reference external" href="https://gist.github.com/KenOokamiHoro/223974ff5884c6eb82a5">链接在这</a> )</p>
<p>对于喜欢自己动手的 <del>菊苣</del> 来说, Makefile 里的命令稍加改造就可以直接执行呐~</p>
<p>在下面的例子中,上面是 Make 规则,下面是实际运行的命令呗~</p>
<p>( <code class="code">
/path/to/your/content/</code>
是汝的内容存放的目录, <code class="code">
path/to/your/settings.py</code>
是汝设置文件的目录,
记得用汝实际的位置替换呗~ )</p>
<blockquote>
make html</blockquote>
<hr class="docutils"/>
<blockquote>
pelican /path/to/your/content/ -s path/to/your/settings.py</blockquote>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id7">首先当然是要生成汝的博客啦~</a></h2>
<p>如果加上 <code class="code">
-r</code>
或者 <code class="code">
--autoreload</code>
参数, Pelican 就会在源文件更改时自动更新输出哟~</p>
<p>如果汝在一开始使用了 <code class="code">
pelican-quickstart</code>
,会生成一个发布时使用的 <code class="code">
publishconf.py</code>
文件呐~</p>
<p>(需要时就用它呗)</p>
<blockquote>
make html</blockquote>
<hr class="docutils"/>
<blockquote>
pelican /path/to/your/content/ [-s path/to/your/settings.py]</blockquote>
</div>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id8">接下来先在本机上预览一下~</a></h2>
<p>如果出了错再重新上传一遍岂不是很痛苦 (╯>_<)╯ ┻━┻</p>
<p>如果汝在一开始使用了 <code class="code">
pelican-quickstart</code>
会在汝的文件夹下生成一个 <code class="code">
developer_server.sh</code>
文件,像这样?</p>
<script src="https://gist.github.com/KenOokamiHoro/011731f75ee363ef4460.js"></script><p>(这里用到了 Github Gist 嘛,如果看不到的话, <a class="reference external" href="https://gist.github.com/KenOokamiHoro/011731f75ee363ef4460">链接在这 again~</a> )</p>
<p>如果是这样的话让它帮忙就好了啦~</p>
<blockquote>
<p># 一共有 start | stop | restart 三个选项,该知道是啥了吧 (´・ω・`)</p>
<p>sh developer_server.sh start</p>
</blockquote>
<p>或者切换到输出的目录,然后直接运行 <code class="code">
pelican.server</code>
</p>
<blockquote>
python -m pelican.server</blockquote>
<p>在汝的浏览器上打开 <code class="code">
http://localhost:8000</code>
看看效果呗~</p>
<p>如果一切 OK 的话,用 <code class="code">
publishconf.py</code>
生成发布时用的文件呗~</p>
</div>
<div class="section" id="id4">
<h2><a class="toc-backref" href="#id9">如果汝用自己的服务器?</a></h2>
<p>如果汝用自己的服务器的话,修改汝的 Makefile 的这一段:</p>
<p>如果汝在用FTP : ( 不过为啥还在用不安全的 FTP 啊 (╯‵Д′)╯ ┻━┻ )</p>
<blockquote>
<p>FTP_HOST=localhost # 这是主机的域名或者 IP 地址</p>
<p>FTP_USER=anonymous # 这是用户名</p>
<p>FTP_TARGET_DIR=/ # 这是上传到的文件夹</p>
</blockquote>
<p>然后安装 lftp ( Makefile 里用的是这个 )</p>
<p>如果汝在用 SFTP (SCP/SSH) :</p>
<blockquote>
<p>SSH_HOST=localhost # 这是主机的域名或者 IP 地址</p>
<p>SSH_PORT=22 # 如果主机的 SSH 端口不是默认的记得改~</p>
<p>SSH_USER=root # 这是用户名</p>
<p>SSH_TARGET_DIR=/var/www # 这是上传到的文件夹</p>
</blockquote>
<p>然后安装 scp ( Makefile 里用的是这个 )</p>
<p>接下来只要直接 Make 相应的目标就可以啦~</p>
<blockquote>
make ssh_upload</blockquote>
<hr class="docutils"/>
<blockquote>
<p>pelican /path/to/your/content/ -s path/to/your/publishconf.py</p>
<p>scp -P $(SSH_PORT) -r $(OUTPUTDIR)/* $(SSH_USER)@$(SSH_HOST):$(SSH_TARGET_DIR)</p>
</blockquote>
<hr class="docutils"/>
<blockquote>
make ftp_upload</blockquote>
<hr class="docutils"/>
<blockquote>
<p>pelican /path/to/your/content/ -s path/to/your/publishconf.py</p>
<p>lftp <a class="reference external" href="ftp://$(FTP_USER)@$(FTP_HOST">ftp://$(FTP_USER)@$(FTP_HOST</a>) -e "mirror -R $(OUTPUTDIR) $(FTP_TARGET_DIR) ; quit"</p>
</blockquote>
</div>
<div class="section" id="github-pages">
<h2><a class="toc-backref" href="#id10">如果汝打算用 Github Pages ?</a></h2>
<p><a class="reference external" href="/links.html#farseerfc">farseerfc</a> 写过一篇利用 Travis 生成 Github Pages 的教程:</p>
<blockquote>
<a class="reference external" href="http://farseerfc.me/travis-push-to-github-pages-blog.html">用 Travis-CI 生成 Github Pages 博客</a></blockquote>
<hr class="docutils"/>
<p>要上传到像 Amazon S3 ,Dropbox 一类的地方 , <a class="reference external" href="http://docs.getpelican.com/en/3.6.3/publish.html">还是看Pelican官方的文档吧</a></p>
</div>
浅说基于 Linux 内核的操作系统 (0) - 写在前面2016-03-18T00:00:00+08:002016-03-18T00:00:00+08:00ホロtag:None,2016-03-18:/linux/linux_newbie_preface.html
<p>挖了个新坑,就是这样 _(:з」∠)_</p>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id4">挖这个坑的动机</a></h2>
<p>咱这学期以"二周目成员"的形式加入了学院的计算机社团,然后就是"三周目成员"的招募啦~,接着就要开始学习C语言啦,然而配置环境就是个复杂的工程呗.</p>
<blockquote>
<p>"要啥Windows啦,换Linux多好."</p>
<p>----咱是这么想的.</p>
</blockquote>
<p>然而当他们告诉咱没用过Linux时,😂😂😂(咱想不到该说什么了)</p>
<p>接着咱去看了几本关于Linux的书,发现国内出版的书正交性不够(只针对特定的发行版),国外的书的话咱的同学看着会很痛苦😂</p>
<p>于是咱就有了写这系列文章的动机,然而却一直拖着 (´・ω・`) ,直到社长说要让咱做一次基于 Linux 内核的操作系统的讲座 (╯•̀﹏•́)╯ ┻━┻</p>
<blockquote>
<p>「基本上,得记住的文字种类太多了。还有呐,莫名其妙的组合也太多了。虽然人类会说只要照着说话规则写字就好,但是这显然是骗人的呗。」</p>
<p>---- 咱的水平明明还没那么高啊~</p>
</blockquote>
<p>然后在 <a class="reference external" href="//webchat.freenode.net/?channels=archlinux-cn">#archlinux-cn</a> 又受到了调侃 (╯@_@)╯ ┻━┻</p>
<blockquote>
<p>ヨイツの賢狼ホロ, [19.03.16 05:20]
/me 社长叫咱准备一期 Linux 相关的讲座 …</p></blockquote></div>
<p>挖了个新坑,就是这样 _(:з」∠)_</p>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id4">挖这个坑的动机</a></h2>
<p>咱这学期以"二周目成员"的形式加入了学院的计算机社团,然后就是"三周目成员"的招募啦~,接着就要开始学习C语言啦,然而配置环境就是个复杂的工程呗.</p>
<blockquote>
<p>"要啥Windows啦,换Linux多好."</p>
<p>----咱是这么想的.</p>
</blockquote>
<p>然而当他们告诉咱没用过Linux时,😂😂😂(咱想不到该说什么了)</p>
<p>接着咱去看了几本关于Linux的书,发现国内出版的书正交性不够(只针对特定的发行版),国外的书的话咱的同学看着会很痛苦😂</p>
<p>于是咱就有了写这系列文章的动机,然而却一直拖着 (´・ω・`) ,直到社长说要让咱做一次基于 Linux 内核的操作系统的讲座 (╯•̀﹏•́)╯ ┻━┻</p>
<blockquote>
<p>「基本上,得记住的文字种类太多了。还有呐,莫名其妙的组合也太多了。虽然人类会说只要照着说话规则写字就好,但是这显然是骗人的呗。」</p>
<p>---- 咱的水平明明还没那么高啊~</p>
</blockquote>
<p>然后在 <a class="reference external" href="//webchat.freenode.net/?channels=archlinux-cn">#archlinux-cn</a> 又受到了调侃 (╯@_@)╯ ┻━┻</p>
<blockquote>
<p>ヨイツの賢狼ホロ, [19.03.16 05:20]
/me 社长叫咱准备一期 Linux 相关的讲座😂😂</p>
<p>archcnbot, [19.03.16 05:21]
[KaseiWang] 狼主席什么时候上位啊</p>
<p>ヨイツの賢狼ホロ, [19.03.16 05:22]
[In reply to archcnbot]
咱可不是主席😂😂</p>
<p>archcnbot, [19.03.16 05:22]
[Shirasaka-Hazumi] 要上台</p>
<p>cuihao, [19.03.16 05:22]
狼主席!</p>
<p>archcnbot, [19.03.16 05:22]
(quininer) 狼主席!</p>
<p>StarDuster, [19.03.16 05:22]
狼主席</p>
<p>archcnbot, [19.03.16 05:22]
[Shirasaka-Hazumi] Chair Lang</p>
<p>archcnbot, [19.03.16 05:23]
[felixonmars] 狼主席什么时候上位啊</p>
<p>archcnbot, [19.03.16 05:23]
[felixonmars] 我突然发现</p>
<p>ヨイツの賢狼ホロ, [19.03.16 05:23]
😂😂😂</p>
<p>archcnbot, [19.03.16 05:23]
(quininer) 突然发现</p>
<p>archcnbot, [19.03.16 05:23]
[felixonmars] 有个很厉害的搜索引擎,叫狼内存</p>
<p>archcnbot, [19.03.16 05:24]
(quininer) 'google 狼内存</p>
<p>archcnbot, [19.03.16 05:24]
[varia] quininer: Wolfram 中文名| Mathematica小组| 果壳网科技有意思 [ <a class="reference external" href="http://www.guokr.com/post/653834/">http://www.guokr.com/post/653834/</a> ]</p>
<p>archcnbot, [19.03.16 05:24]
[Lisa] varia: ⇪网页标题: Wolfram 中文名 | Mathematica小组 | 果壳网 科技有意思</p>
<p>StarDuster, [19.03.16 05:24]
噗</p>
</blockquote>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id5">咱参考了哪些内容?</a></h2>
<p>咱参考了这些内容,先道个谢~</p>
<ul class="simple">
<li><a class="reference external" href="https://program-think.blogspot.com">编程随想的博客</a> (他开了个头)</li>
<li><a class="reference external" href="http://linux.vbird.org/">鸟哥的 Linux 私房菜</a> (写的比较透彻,值得一读)</li>
<li><a class="reference external" href="http://forum.ubuntu.org.cn/viewtopic.php?f=112&t=162040">笨兔兔的故事@Ubuntu中文论坛</a> (基于Ubuntu8.04完成的一篇故事,咱会说是卖萌向?)</li>
</ul>
<hr class="docutils"/>
<p>既然是 "写在前面" 嘛,就不能说的太多 <del>其实是还没想好怎么写~</del> , 那么下次再见了😂😂</p>
</div>
这是所谓的时间管理浅说 _(:з」∠)_2016-03-18T00:00:00+08:002016-03-18T00:00:00+08:00ホロtag:None,2016-03-18:/life/time_management_nutshell.html
<p>时间管理到底是啥咱也不太知道呐~ <del>不过还是谢邀</del></p>
<p>灵感来自前几天 <a class="reference external" href="//webchat.freenode.net/?channels=archlinux-cn">#archlinux-cn</a> 的对话:</p>
<blockquote>
<p>ヨイツの賢狼ホロ, [14.03.16 22:23]
/me 下一篇文章的方向是啥咧😂</p>
<p>farseerfc 😂 0xC13D4796, [14.03.16 22:23]
想看看萌狼聊時間/計劃管理</p>
<p>pandada8, [14.03.16 22:24]
时间管理 aka 怎样关掉im</p>
<p>ヨイツの賢狼ホロ, [14.03.16 22:24]
[In reply to farseerfc 😂 0xC13D4796]
……</p>
<p>ヨイツの賢狼ホロ, [14.03.16 22:24]
现在纯粹是因为咱比较闲而已啦😂😂</p>
<p>Frantic1048 …</p></blockquote>
<p>时间管理到底是啥咱也不太知道呐~ <del>不过还是谢邀</del></p>
<p>灵感来自前几天 <a class="reference external" href="//webchat.freenode.net/?channels=archlinux-cn">#archlinux-cn</a> 的对话:</p>
<blockquote>
<p>ヨイツの賢狼ホロ, [14.03.16 22:23]
/me 下一篇文章的方向是啥咧😂</p>
<p>farseerfc 😂 0xC13D4796, [14.03.16 22:23]
想看看萌狼聊時間/計劃管理</p>
<p>pandada8, [14.03.16 22:24]
时间管理 aka 怎样关掉im</p>
<p>ヨイツの賢狼ホロ, [14.03.16 22:24]
[In reply to farseerfc 😂 0xC13D4796]
……</p>
<p>ヨイツの賢狼ホロ, [14.03.16 22:24]
现在纯粹是因为咱比较闲而已啦😂😂</p>
<p>Frantic1048, [14.03.16 22:26]
[In reply to farseerfc 😂 0xC13D4796]
+1</p>
<p>Kasei Wang, [14.03.16 22:26]
想知道萌狼早上怎么起来的</p>
<p>ヨイツの賢狼ホロ, [14.03.16 22:27]
[In reply to Kasei Wang]
直觉?😂</p>
<p>Frantic1048, [14.03.16 22:27]
论如何能够保持大一的作息水平 ~(>_<~)</p>
<p>Kasei Wang, [14.03.16 22:29]
[In reply to ヨイツの賢狼ホロ]
讲一下怎么做到早起吧(今天起来十点半多了</p>
<p>Frantic1048, [14.03.16 22:29]
[In reply to Kasei Wang]
9 点起的 +1</p>
<p>ヨイツの賢狼ホロ, [14.03.16 22:29]
怎么都那么晚😂😂</p>
<p>Frantic1048, [14.03.16 22:30]
[In reply to pandada8]
不管怎么放都能连出自己都无法相信的纯熟的关闹钟手法 (´_`)</p>
<p>pandada8, [14.03.16 22:30]
我觉得你总不至于下床后再上床睡觉</p>
<p>farseerfc 😂 0xC13D4796, [14.03.16 22:30]
[In reply to Frantic1048]
然後5分鐘內忘記並睡死</p>
<p>---- Telegram 默认复制出来的格式就这样 😂😂😂</p>
</blockquote>
<p>其实咱对时间管理没有啥研究啦,这篇文章估计也只是简单地说说咱的 <ruby><rb>经验</rb><rp>(</rp><rt>瞎掰</rt><rp>)</rp></ruby> 而已 😂😂</p>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id12">时间管理到底是啥玩意?</a></h2>
<blockquote>
<p>时间管理(Time Management)就是用技巧、技术和工具帮助人们完成工作,实现目标。
时间管理并不是要把所有事情做完,而是更有效的运用时间。
时间管理的目的除了要决定你该做些什么事情之外,另一个很重要的目的也是决定什么事情不应该做;
时间管理不是完全的掌控,而是降低变动性。时间管理最重要的功能是透过事先的规划,做为一种提醒与指引。</p>
<p>---- <a class="reference external" href="https://zh.wikipedia.org/wiki/%E6%97%B6%E9%97%B4%E7%AE%A1%E7%90%86">Wikipedia:时间管理</a></p>
</blockquote>
<p>如此长的定义看的咱都要睡着了诶😴,如果咱没理解错的话,时间管理就是尽可能的提高时间利用率,在有限的时间里做最有效的事呗~</p>
<blockquote>
<p>「那个时候的咱呢,的确是不谙世事。相信世间看不惯的事情全都有解决的方法。
讨厌被依赖崇敬的话就去旅行,没有朋友去交就好了。
而且,从心底里相信温水般的快乐时间会永远持续下去。
不过也经常因此哭鼻子就是。那也许很合汝的胃口呐。
呵呵……不过呢,越是回想起苦涩的回忆,脸上就笑得越开心。」</p>
<p>---- <del>时间管理的重要性(雾)</del></p>
</blockquote>
<p>从时间管理下还衍生出 <a class="reference external" href="https://en.wikipedia.org/wiki/Project_management">项目管理</a> 和 <a class="reference external" href="https://en.wikipedia.org/wiki/Attention_management">Attention management (注意力管理?)</a> (´・ω・`)</p>
</div>
<div class="section" id="id4">
<h2><a class="toc-backref" href="#id13">坊间流传的几种时间管理分析方法</a></h2>
<p>关于坊间流传的几种时间管理分析方法咧, <a class="reference external" href="https://en.wikipedia.org/wiki/Time_management">英文维基百科</a> 上提到了几种</p>
<p>(中文的坑好像还没填 (ノ=Д=)ノ┻━┻)</p>
<p><del>就这样?</del></p>
</div>
<div class="section" id="q1-kasei-wang">
<h2><a class="toc-backref" href="#id14">Q1:Kasei Wang:想知道萌狼早上怎么起来的</a></h2>
<blockquote>
~ Frantic1048:论如何能够保持大一的作息水平 ~(>_<~)</blockquote>
<p>这个...... 咱不知道该怎么说好了 (╯°Д°)╯ ┻━┻</p>
<p>如果咱要硬解释一下的话,可能就是老套的 "早点睡觉" 了~(>_<~)</p>
<p>晚上早点睡 ~(>_<~) ,就是这样 😂😂</p>
<blockquote>
<p>「听说,上天是把我们的身体塑造成一天只需要睡一次觉。」</p>
<p>「咱是狼呐。」</p>
<p>「又没有人起床,也只能睡觉呗。不睡觉只会觉得冷,而且还会饿肚子。」</p>
<p>「嗯,毕竟现在这季节比较冷清。不过,还真是怪异。」"</p>
<p>---- 这个时候说这个是不是不太合适 😂😂</p>
</blockquote>
<p>由此可以得出这样的结论 (雾):</p>
<ul>
<li><p class="first">不要睡回笼觉 (╯ ̄Д ̄)╯ ┻━┻</p>
<blockquote>
<p>但是如果汝觉得下午容易犯困的话,中午小憩一刻也无妨 (只是不要睡过头...... )</p>
</blockquote>
</li>
<li><p class="first">起床整理完以后记得吃早餐哟~ (´・ω・`)</p>
<blockquote>
<p>记得食用富含蛋白质的食物呐~</p>
</blockquote>
</li>
<li><p class="first">如果汝有能力的话,可以拉拢和汝在一起的人也早起咯~ <del>不从的话就吃掉好了</del></p>
</li>
</ul>
</div>
<div class="section" id="q2">
<h2><a class="toc-backref" href="#id15">Q2:为啥说咱很高产?</a></h2>
<p>真相是咱不像 <a class="reference external" href="/links.html#lilydywg">lilydywg</a> , <a class="reference external" href="/links.html#acgtyrent">acgtyrent</a> 和 <a class="reference external" href="/links.html#farseerfc">farseerfc</a> 那样写的出相对比较有深度的文章啦~ ( 倒是萌新向教程比较多 😂😂 )</p>
<blockquote>
「咱可是贤狼啊。起码还是知道这世界上有很多东西是我所不了解的。」</blockquote>
<p>如果真要说出啥原因的话,咱觉得应该有这几种:</p>
<ul>
<li><p class="first">现在纯粹是因为咱没有工作因此比较闲而已啦~</p>
</li>
<li><p class="first">平常想法比较多?</p>
<blockquote>
<p>比如在写这篇文章之前咱还计划过其他的主题呐~ ( (╯•̀_>•́)╯ ┻━┻ 虽然到现在还没付诸实施就是了 )</p>
</blockquote>
</li>
<li><p class="first">没被太多强加的事情干预?</p>
<blockquote>
<blockquote>
<p>「要如何看待事情是自己控制的。既然咱想要回到北方,不管怎样都得离开那里。既然没有人要拉住咱,咱用后脚踢砂子离开就是了,这样也比较能够死心。不过,咱不可能就这么安安静静离开。」</p>
</blockquote>
<p>就像这样? ( 然而想不做被强加的事情似乎很难的样子呢~ )</p>
</blockquote>
</li>
<li><p class="first">写博客算是一种真正的兴趣?</p>
<blockquote>
<blockquote>
<p>如果你够幸运的话,还可以让“自己的兴趣”成为“自己的职业”——这是很幸福的事情 :)</p>
<p>如此一来,就把“工作”和“娱乐”合为一体。你将不再有“工作时间”和“业余时间”的差异——不论是“工作时间”还是“业余时间”,对你而言都是“娱乐时间”。很爽的!</p>
<p>当这两者统一之后,还有更多其它的好处。比如说,你在自己的工作中,就可以比别人走得更远,因此也就更有可能成为该领域的【优秀】者。</p>
<p>---- <a class="reference external" href="https://program-think.blogspot.com/2015/12/Hobbies-and-Interests.html">编程随想的博客:什么是【真正的】兴趣爱好?以及它有啥好处?</a></p>
</blockquote>
<p>至少现在来说,写博客算是咱的一个兴趣吧 ~(>_<~)</p>
</blockquote>
</li>
<li><p class="first">不常刷微博和 SNS ?</p>
<blockquote>
<p>自从看了 <a class="reference external" href="https://program-think.blogspot.com/2012/02/microblog-and-time-management.html">为啥俺不常用微博——兼谈时间管理心得</a>
和 <a class="reference external" href="https://program-think.blogspot.com/2015/02/Is-Blogging-Dead.html">“传统博客”过时了吗?——兼谈各种媒介形态的优缺点</a>
再加上咱用 IFTTT 帮咱发文章更新,咱已经不知道有多久没上 Twitter 和 Google+ 了 (。>ω<)。</p>
</blockquote>
</li>
</ul>
<p>大概就这些 (っ╹ ◡ ╹ )っ?</p>
</div>
<div class="section" id="id9">
<h2><a class="toc-backref" href="#id16">推荐一些时间管理相关的资源?</a></h2>
<p>解释这些,当然要找专业的来啦 o(* ̄3 ̄)o</p>
<ul class="simple">
<li><a class="reference external" href="https://www.zhihu.com/topic/19550921/top-answers">知乎上的 "时间管理" 话题</a> ,干货丰富,注意前方争论出没 😂😂</li>
<li><a class="reference external" href="http://www.mifengtd.cn/">褪墨</a> ,翻译和分享时间管理和个人提升等等主题上的内容和经验的网站,看起来比较专精 (´_`)</li>
</ul>
</div>
简单总结一下咱自己用过的一些 CMS2016-03-14T00:00:00+08:002016-03-14T00:00:00+08:00ホロtag:None,2016-03-14:/life/some_cms_opinion.html
<p>仔细数数咱也用过不少 <ruby><rb>CMS</rb><rp>(</rp><rt>内容管理系统</rt><rp>)</rp></ruby> 了呐~,或许咱应该小小的总结一下?</p>
<p>PS:本文会带有大量个人的主观意见😂😂</p>
<div class="section" id="wordpress-cms">
<h2><a class="toc-backref" href="#id3">WordPress:大众和普通的CMS</a></h2>
<p>WordPress 的大名想必各位都知道吧。</p>
<blockquote>
<p>WordPress是一个注重美学、易用性和网络标准的个人信息发布平台。WordPress虽为免费的开源软件,但其价值无法用金钱来衡量。</p>
<p>WordPress的图形设计在性能上易于操作、易于浏览;在外观上优雅大方、风格清新、色彩诱人。</p>
<p>使用WordPress可以搭建功能强大的网络信息发布平台,但更多的是应用于个性化的博客。
针对博客的应用,WordPress能让您省却对后台技术的担心,集中精力做好网站的内容。</p>
<p>---- <a class="reference external" href="https://cn.wordpress.org">WordPress 中文首页</a></p>
</blockquote>
<p>WordPress 也是咱第一个用的内容管理系统啦,作为希望用户专注于内容的 CMS ,WordPress 有几点做的非常棒:</p>
<ul class="simple">
<li>内置可视化编辑器,无需掌握大量标记语法就可以开始写文章。</li>
<li>每次大版本更新都会更新一套主题 (Twenty 系列),都非常赞~</li>
<li>五分钟安装向导名副其实 (真的只要五分钟一个 WordPress 网站就可以投入使用了2333)</li>
</ul>
<p>当然缺点也是有的 :</p>
<ul class="simple">
<li>作为用 <del>世界最好的</del> PHP 语言编写的 Web应用,需要一个资瓷 …</li></ul></div>
<p>仔细数数咱也用过不少 <ruby><rb>CMS</rb><rp>(</rp><rt>内容管理系统</rt><rp>)</rp></ruby> 了呐~,或许咱应该小小的总结一下?</p>
<p>PS:本文会带有大量个人的主观意见😂😂</p>
<div class="section" id="wordpress-cms">
<h2><a class="toc-backref" href="#id3">WordPress:大众和普通的CMS</a></h2>
<p>WordPress 的大名想必各位都知道吧。</p>
<blockquote>
<p>WordPress是一个注重美学、易用性和网络标准的个人信息发布平台。WordPress虽为免费的开源软件,但其价值无法用金钱来衡量。</p>
<p>WordPress的图形设计在性能上易于操作、易于浏览;在外观上优雅大方、风格清新、色彩诱人。</p>
<p>使用WordPress可以搭建功能强大的网络信息发布平台,但更多的是应用于个性化的博客。
针对博客的应用,WordPress能让您省却对后台技术的担心,集中精力做好网站的内容。</p>
<p>---- <a class="reference external" href="https://cn.wordpress.org">WordPress 中文首页</a></p>
</blockquote>
<p>WordPress 也是咱第一个用的内容管理系统啦,作为希望用户专注于内容的 CMS ,WordPress 有几点做的非常棒:</p>
<ul class="simple">
<li>内置可视化编辑器,无需掌握大量标记语法就可以开始写文章。</li>
<li>每次大版本更新都会更新一套主题 (Twenty 系列),都非常赞~</li>
<li>五分钟安装向导名副其实 (真的只要五分钟一个 WordPress 网站就可以投入使用了2333)</li>
</ul>
<p>当然缺点也是有的 :</p>
<ul class="simple">
<li>作为用 <del>世界最好的</del> PHP 语言编写的 Web应用,需要一个资瓷 PHP 的 Web 服务器来运行😂😂</li>
<li>树大招风,WordPress 也容易成为垃圾评论和骇客的目标 ( 前几星期的 Linux Mint 事件 就是骇客通过 WordPress入侵了他们的服务器 😂😂😂 )</li>
<li>用默认主题显得同质化,自定义主题又太复杂......</li>
</ul>
<p>所以咱最后还是换掉了 WordPress 😂😂😂😂</p>
</div>
<div class="section" id="mediawiki-wiki">
<h2><a class="toc-backref" href="#id4">MediaWiki:潜力无限的Wiki平台</a></h2>
<p>没听过 MediaWiki 汝总该听说过维基百科吧,维基百科就是运行在维基媒体基金会开发的 MediaWiki 上呐~</p>
<blockquote>
<p>MediaWiki是一个最初为维基百科量身打造的自由wiki套件,用PHP语言写成。</p>
<p>现在,非营利的维基媒体基金会下辖的所有wiki项目、互联网上的众多其他wiki网站也基于此套软件搭建。</p>
<p>---- <a class="reference external" href="https://www.mediawiki.org">MediaWiki.org</a></p>
</blockquote>
<p>简单来说 MediaWiki 是一套 Wiki 系统,不过通过扩展也可以实现各种其他功能 ( 例如 <a class="reference external" href="https://www.wikidata.org">WikiData</a> ) .</p>
<p>咱要说 MediaWiki 又有啥优点咧?</p>
<ul class="simple">
<li>因为是 Wiki 系统嘛,所以方便 <ruby><rb>协作</rb><rp>(</rp><rt>一同填坑</rt><rp>)</rp></ruby> 😂😂</li>
<li>文档丰富,基本上覆盖了大部分内容 ( 给用户的帮助在重写ing~ )</li>
<li>扩展丰富,可以实现更多功能</li>
</ul>
<p>当然还是老样子,缺点也是有的:</p>
<ul class="simple">
<li>和 WordPress 一样,作为用 <del>世界最好的</del> PHP 语言编写的 Web应用,需要一个资瓷 PHP 的 Web 服务器来运行😂😂</li>
<li>(可能是唯一?) 不太适合博客型网站 (因为不方便生成RSS)</li>
<li>部件繁杂,不知道哪里出问题就吐核了 (不过会有堆栈跟踪,偶尔会派上些用场😂😂)</li>
<li><del>没有权限汪们想要的精确到条目的权限控制😂😂</del></li>
<li>MediaWiki 标记太复杂啦 (╯・_・)╯ ┻━┻ ( 或者可以 <a class="reference external" href="/tech/visualeditor_for_mediawiki.html">安装可视化编辑器</a> ,可还是好复杂 (╯X﹏X)╯ ┻━┻ )</li>
</ul>
<p>不过咱还在坚持用它当咱自己的资料库呗~</p>
</div>
<div class="section" id="ghost">
<h2><a class="toc-backref" href="#id5">Ghost:轻博客的开端?</a></h2>
<blockquote>
<p>Ghost是用JavaScript编写的博客平台,基于MIT许可证开放源代码。Ghost的设计主旨是简化个人网站发布以及网上出版的过程。</p>
<p>Ghost是一款个人博客系统,它是使用Node.js语言和MySQL数据库开发的,同时支持MySQL、MariaDB、SQLite和PostgreSQL。用户可以在支持Node.js的服务器上使用自己的博客。</p>
<p class="attribution">—<a class="reference external" href="https://zh.wikipedia.org/wiki/Ghost_%28%E5%8D%9A%E5%AE%A2%E5%B9%B3%E5%8F%B0%29">Wikipedia 上的 "Ghost (博客平台)" 条目</a></p>
</blockquote>
<p>咱曾经 <a class="reference external" href="/tech/ghost_blog_archlinux.html">安装过 Ghost</a> ,安装过程看着挺吓人,但是按照官方的文档来也可以一次成功~</p>
<p>咱的第一印象就是:比 WordPress 轻多了,真的.</p>
<p>Ghost 最大的优点是原生支持 Markdown 和 HTML ,汝就可以愉快的书写咯~~</p>
<p>不过 Ghost 是 Node.js 应用,安装 Node.js 首先就是个大公程。</p>
<p>另外作为开发中的软件,还有很大的空间……</p>
</div>
<div class="section" id="pelican">
<h2><a class="toc-backref" href="#id6">Pelican:笔记本?</a></h2>
<p>第一次接触到 Pelican 是 <a class="reference external" href="/links.html#farseerfc">farseerfc</a> 的博客+安利 (雾),
然后正为 MediaWiki 的 RSS 扩展苦手的咱干脆就换成了 Pelican.</p>
<p>farseerfc 说 Pelican 有这些优点:</p>
<ul>
<li><p class="first">純 Python 實現。 這意味着我可以換用任何 Python 解釋器而不必擔心兼容性問題。比如我就換成了 PyPy。</p>
<blockquote>
<p>因为是纯 Python 实现,可以 <a class="reference external" href="http://farseerfc.me/travis-push-to-github-pages-blog.html">通过Travis-CI 自动生成 html</a>,
也可以通过 msys2 在 Windows 上运行.没有方便的 Linux 环境再也不是偷懒的理由了呐~</p>
</blockquote>
</li>
<li><p class="first">多語言支持。因爲 Pelican 的作者似乎是個法國人。不過這個似乎大部分人不需要…… 我是想儘量把一篇博客寫成三種語言作爲鍛鍊吧。</p>
<blockquote>
<p>fc 的博客就有三个语言啦~(虽然咱现在没用到)</p>
</blockquote>
</li>
<li><p class="first">ReST 。這樣我就可以用 Leo 的 @auto-rst 直接寫 ReST了。簡單方便快捷有效。</p>
<blockquote>
<p>ReST 的学习曲线有些陡峭,但掌握之后就是一马平川了哟☺🙂😄</p>
</blockquote>
</li>
</ul>
<p>咱说 Pelican 还有这些优点:</p>
<ul class="simple">
<li>生成的是静态网站,找个 Web 服务器就可以放 (或者放在 Github Pages 上,极客风格 (?) 十足 )😂😂😂</li>
<li>使用的是 jinja 模板引擎 (咱照着默认的 simple 主题做了现在这套主题, <del>虽然只是能看而已</del> 😂😂😂)</li>
</ul>
<p>不过 Pelican 也不是完美的:</p>
<ul class="simple">
<li>静态网站的评论是个难题啊 ( 只能靠第三方服务,例如 Disqus )</li>
<li>没有类似 WordPress , MediaWiki 和 Ghost 的文章编辑界面 ( 虽然 retext 很好用~ )</li>
<li>Linux 风格的 Makefile 让迁移有些小小的难度 ( 不然为啥会在Windows 上用msys2...... )</li>
</ul>
<p>不过现在咱还要接着用 Pelican 呐~😂😂</p>
</div>
在 Windows 上编织 Pelican 博客 -- MSYS2篇2016-03-04T21:00:00+08:002016-03-04T21:00:00+08:00ホロtag:None,2016-03-04:/pelican/pelican_on_windows_msys2.html
<p>用 Windows 那是迫不得已……</p>
<p><del>人生赢家</del> <a class="reference external" href="/links.html#farseerfc">farseerfc</a> 这样写到......</p>
<blockquote>
<p>寄宿在 Github Pages 上的静态博客通常有两种方案,其一是使用 Jekyll 方式撰写,
这可以利用 Github Pages 原本就有的 Jekyll支持 生成静态网站。
另一种是在 本地 也就是自己的电脑上生成好,然后把生成的 HTML 网站 push 到 Github Pages ,
这种情况下 Github Pages 就完全只是一个静态页面宿主环境。</p>
<p>我用 Pelican 生成博客,当然就只能选择后一种方式了。
这带来一些不便,比如本地配置 pelican 还是有一点点复杂的,所以不能随便找台电脑就开始写博客。
有的时候只是想修正一两个错别字, 这时候必须打开某台特定的电脑才能编辑博客就显得不太方便了。
再比如 pelican 本身虽然是 python 写的所以跨平台,但是具体到博客的配置方面 …</p></blockquote>
<p>用 Windows 那是迫不得已……</p>
<p><del>人生赢家</del> <a class="reference external" href="/links.html#farseerfc">farseerfc</a> 这样写到......</p>
<blockquote>
<p>寄宿在 Github Pages 上的静态博客通常有两种方案,其一是使用 Jekyll 方式撰写,
这可以利用 Github Pages 原本就有的 Jekyll支持 生成静态网站。
另一种是在 本地 也就是自己的电脑上生成好,然后把生成的 HTML 网站 push 到 Github Pages ,
这种情况下 Github Pages 就完全只是一个静态页面宿主环境。</p>
<p>我用 Pelican 生成博客,当然就只能选择后一种方式了。
这带来一些不便,比如本地配置 pelican 还是有一点点复杂的,所以不能随便找台电脑就开始写博客。
有的时候只是想修正一两个错别字, 这时候必须打开某台特定的电脑才能编辑博客就显得不太方便了。
再比如 pelican 本身虽然是 python 写的所以跨平台,但是具体到博客的配置方面, Windows 环境和 Linux/OSX/Unix-like 环境下还是有 些许出入 的。
还有就是没有像 wordpress 那样的基于 web 的编辑环境,在手机上就不能随便写一篇博客发表出来
(不知道有没有勇士尝试过在 Android 的 SL4A 环境下的 python 中跑 pelican ,还要配合一个 Android 上的 git 客户端 )。</p>
<p>---- <a class="reference external" href="https://farseerfc.me/travis-push-to-github-pages-blog.html">Farseerfc.me:用 Travis-CI 生成 Github Pages 博客</a></p>
</blockquote>
<p>确实,Pelican 虽然是跨平台的,但是......</p>
<p>如果汝用了 <code class="code">
pelican-quickstart</code>
,汝的目录下会有一个 <code class="code">
Makefile</code>
文件,那么问题来了,
Windows 里上哪读 Makefile 啦(ノ=Д=)ノ┻━┻</p>
<p>所以只好在 Windows 里搞个类 <ruby><rb>Unix</rb><rp>(</rp><rt>Linux</rt><rp>)</rp></ruby> 环境了(´・ω・`)</p>
<p><del>某人:其实把 Makefile 魔改成批处理文件也是可以的$#W#@$##%$^&%^%^$^%&%</del></p>
<div class="section" id="msys2">
<h2><a class="toc-backref" href="#id6">为啥是msys2?</a></h2>
<blockquote>
<a class="reference external" href="/links.html#quininer">quininer</a> :明明是 OneGet + PowerShell 大法好嘛~</blockquote>
<p>在 Windows 世界里最出名的类 Unix 环境不是 <a class="reference external" href="http://cygwin.com/">Cygwin</a> 么?</p>
<blockquote>
<p>因为 msys2 有 pacman 啦~</p>
<p>因为 msys2 有 pacman 啦 ~ (╯T▽T)╯ ┻━┻</p>
<p>因为 msys2 有 pacman 啦 ~ (ノ=Д=)ノ┻━┻</p>
<p class="attribution">—<del>重要的事情说三遍</del> (๑•̀ㅂ•́)و✧</p>
</blockquote>
<p>总之为了 pacman 咱最后选了 msys2 😂😂😂</p>
</div>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id7">安装和设置 msys2</a></h2>
<p>去 <a class="reference external" href="http://msys2.github.io/">官方网站</a> 或是 <a class="reference external" href="http://mirrors.ustc.edu.cn/msys2/Base/">崔主席的镜像源</a> 下载基本组件包啦~ ( <a class="reference external" href="/links.html#cuihao">cuihao</a> 好棒~ )</p>
<p>如果需要, <a class="reference external" href="https://lug.ustc.edu.cn/wiki/mirrors/help/msys2">把软件仓库换成崔主席的镜像呗~</a></p>
<p>接下来更新msys2和安装基本工具 ( 咱用了 Github 所以再装个 Git ):</p>
<blockquote>
pacman -Syu
pacman -S base-devel make git</blockquote>
<div class="tag warning fg-white compound">
<p class="compound-first">截至写这篇文章时,咱从pacman安装的 pip ( <code class="code">
mingw-w64-x86_64-python3-pip</code>
) 会因为一个 ImportError 没法装任何软件包呐~ ( pia之 (╯@ω@)╯ ┻━┻ )</p>
<p class="compound-last">所以只好装个 Windows 版的 Python 😂</p>
</div>
</div>
<div class="section" id="pelican-windows-python">
<h2><a class="toc-backref" href="#id8">安装 pelican 和 Windows 版 Python</a></h2>
<p><a class="reference external" href="https://www.python.org/downloads/windows/">去 Python.org 下载啦~</a> ,记得把 <code class="code">
python</code>
和 <code class="code">
pip</code>
添加到系统的 <code class="code">
PATH</code>
中.( msys2 好像可以用 Windows 的 PATH ~)</p>
<p>接下来打开 msys2 shell (其实就是 Bash 啦 😂) 把 Windows 里的 python 软连接到 <code class="code">
/usr/bin/python</code>
上</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># 不知道在哪? 用 whereis 命令查一下啦~</span></span>
<span class="code-line">$ whereis python</span>
<span class="code-line">/c/python35/python.exe</span>
<span class="code-line"><span class="c1"># 用 ln -s <源路径> <目标路径> 创建一个符号链接.</span></span>
<span class="code-line">$ ln -s /c/python35/python.exe /usr/bin/python</span>
</pre></div>
<p>然后用 pip 安装 pelican _(:з」∠)_</p>
<blockquote>
pip install pelican</blockquote>
</div>
<div class="section" id="id5">
<h2><a class="toc-backref" href="#id9">试验</a></h2>
<p>先用各种不同的方法把汝的 pelican 文件夹复制到 msys2 的主文件夹里啦~ ( 在汝安装 msys2 的文件夹中有一个 <code class="code">
home/<汝 Windows 系统的用户名>/</code>
的文件夹啦 (╯°∧°)╯ ┻━┻ )</p>
<p>如果汝用了 <code class="code">
pelican-quickstart</code>
生成了 develop_server.sh 那它喂给 sh 啦~</p>
<blockquote>
sh develop_server.sh start</blockquote>
<p>如果没有的话,那就自己 make 呗~</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># 生成html</span></span>
<span class="code-line">make html</span>
<span class="code-line"><span class="c1"># 运行测试服务器</span></span>
<span class="code-line">make serve</span>
</pre></div>
<p>有时汝可能用到一些其它程序,那么汝只好通过 pacman 安装或者自己编译啦 (╯‵﹏′)╯ ┻━┻</p>
<p><del>这篇文章其实是在 Arch Linux 上完成的所以并没有啥截图😂😂😂</del></p>
</div>
装完 Arch Linux 再装 Windows 然后修引导~2016-02-22T17:00:00+08:002016-02-22T17:00:00+08:00ホロtag:None,2016-02-22:/tech_misc/windows_grub_recuse.html
<p>装完 Arch Linux 再装 Windows 以后 GRUB 没啦~ Windows 出来背锅 _(:з」∠)_</p>
<p><del>要啥 Windows 啊~</del></p>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id3">准备工作</a></h2>
<ul class="simple">
<li>一个可启动的 Linux 的 Live USB ( 咱是用的 Arch Linux 的安装 ISO )</li>
</ul>
<p>好像没啥了诶~(最好要连上网,可以参阅 <a class="reference external" href="https://wiki.archlinux.org/index.php/Beginners'_guide">ArchWiki</a> 呗~ ).</p>
<p>如果汝使用 UEFI 主板,且 UEFI 启动模式(优于 BIOS/Legacy 模式)已启用,CD/USB 会自动通过systemd-boot 启动 Arch Linux。要确认是否已进入UEFI模式 …</p></div>
<p>装完 Arch Linux 再装 Windows 以后 GRUB 没啦~ Windows 出来背锅 _(:з」∠)_</p>
<p><del>要啥 Windows 啊~</del></p>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id3">准备工作</a></h2>
<ul class="simple">
<li>一个可启动的 Linux 的 Live USB ( 咱是用的 Arch Linux 的安装 ISO )</li>
</ul>
<p>好像没啥了诶~(最好要连上网,可以参阅 <a class="reference external" href="https://wiki.archlinux.org/index.php/Beginners'_guide">ArchWiki</a> 呗~ ).</p>
<p>如果汝使用 UEFI 主板,且 UEFI 启动模式(优于 BIOS/Legacy 模式)已启用,CD/USB 会自动通过systemd-boot 启动 Arch Linux。要确认是否已进入UEFI模式,检查下面目录是否有文件呗~:</p>
<blockquote>
# ls /sys/firmware/efi/efivars</blockquote>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id4">确定设备名称,然后挂载</a></h2>
<p>用 <code class="code">
lsblk</code>
确定汝 Linux 安装到哪个磁盘里呐~</p>
<blockquote>
<p>NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT</p>
<p>sda 8:0 0 298.1G 0 disk</p>
<p>├─sda1 8:1 0 40G 0 part</p>
<p>├─sda2 8:2 0 256.1G 0 part</p>
<p>└─sda3 8:3 0 2G 0 part</p>
</blockquote>
<p>咱这个栗子是 <code class="code">
/dev/sda1</code>
,MBR 模式的. <code class="code">
sda1</code>
是 <code class="code">
/</code>
,:code:<cite>sda2</cite> 是 <code class="code">
/home</code>
(´・ω・`).</p>
<p>然后挂载上, archiso 里有个天然的适合的挂载点~</p>
<blockquote>
<p># mount /dev/sda1 /mnt</p>
<p># mount /dev/sda2 /mnt/home</p>
</blockquote>
</div>
<div class="section" id="chrooting">
<h2><a class="toc-backref" href="#id5">chrooting......</a></h2>
<p>用 <code class="code">
arch-chroot</code>
chroot 进目标系统:</p>
<blockquote>
# arch-chroot /mnt /bin/bash</blockquote>
</div>
<div class="section" id="mbr-grub">
<h2><a class="toc-backref" href="#id6">MBR 安装 GRUB (´・ω・`)</a></h2>
<p>这样(记得用汝实际的磁盘名称替换 <code class="code">
sda</code>
,不要后面的数字.)</p>
<blockquote>
<p># grub-install --target=i386-pc --recheck --debug /dev/sda</p>
<p># grub-mkconfig -o /boot/grub/grub.cfg</p>
</blockquote>
</div>
<div class="section" id="uefi-grub">
<h2><a class="toc-backref" href="#id7">UEFI 安装 GRUB _(:з」∠)_</a></h2>
<p>这样(某些系统的 <code class="code">
--efi-directory</code>
可能是 :code`/boot/EFI` ,不管啦 (ノ=Д=)ノ┻━┻ )</p>
<blockquote>
<p># grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=grub --recheck</p>
<p># grub-mkconfig -o /boot/grub/grub.cfg</p>
</blockquote>
<hr class="docutils"/>
<p>最后离开 chroot 环境然后重启,记得拔掉U盘~</p>
<blockquote>
<p># exit</p>
<p># reboot</p>
</blockquote>
<p>所以嘛,要啥 Windows 呐~ (ノ=Д=)ノ┻━┻</p>
</div>
凤凰卷家的 vps.to 的 OpenVZ VPS 试用小记2016-02-22T00:00:00+08:002016-02-22T00:00:00+08:00ホロtag:None,2016-02-22:/life/vpsto_openvz.html
<p>论感情牌+吐槽的必要性~(雾</p>
<p>凤凰卷( <a class="reference external" href="/links.html#phoenixlzx">phoenixlzx</a> )家的 <a class="reference external" href="http://vps.to">vps.to</a> <a class="footnote-reference" href="#id2" id="id1">[1]</a> 最近新上线了 OpenVZ 架构的 VPS .卷说不会超售,咱相信她 (谁叫咱认为她是个好人咧~)</p>
<table class="stripped docutils footnote highlight black-text white" frame="void" id="id2" rules="none">
<colgroup><col class="label"/><col/></colgroup>
<tbody valign="top">
<tr><td class="label"><a class="fn-backref" href="#id1">[1]</a></td><td>其实和喵窝一样,真正的大 boss 藏在后面~ (逃~</td></tr>
</tbody>
</table>
<p>因为没人搭理她,她还在 <a class="reference external" href="//webchat.freenode.net/?channels=#archlinux-cn">##archlinux-cn</a> 里吐槽了一番:</p>
<blockquote>
<p>[phoenixlzx] 没人理会透明卷</p>
<p>[phoenixlzx] 还是滚去睡觉好了</p>
<p>(quininer) 凤凰怎么了</p>
<p>[phoenixlzx] 心情不好</p>
<p>(quininer) momo</p>
<p>[phoenixlzx] 当时要做的时候都说做做做做好了买买买</p>
<p>[phoenixlzx] 然后现在做好了都不吱声了</p>
<p>[phoenixlzx] 订单呢?订单呢?</p>
<p>[phoenixlzx] 真是不靠谱</p>
</blockquote>
<p>不过说到底还是在吐槽 OpenVZ 架构……</p>
<div class="section" id="openvz">
<h2><a class="toc-backref" href="#id8">说到底还是在吐槽 OpenVZ …</a></h2></div>
<p>论感情牌+吐槽的必要性~(雾</p>
<p>凤凰卷( <a class="reference external" href="/links.html#phoenixlzx">phoenixlzx</a> )家的 <a class="reference external" href="http://vps.to">vps.to</a> <a class="footnote-reference" href="#id2" id="id1">[1]</a> 最近新上线了 OpenVZ 架构的 VPS .卷说不会超售,咱相信她 (谁叫咱认为她是个好人咧~)</p>
<table class="stripped docutils footnote highlight black-text white" frame="void" id="id2" rules="none">
<colgroup><col class="label"/><col/></colgroup>
<tbody valign="top">
<tr><td class="label"><a class="fn-backref" href="#id1">[1]</a></td><td>其实和喵窝一样,真正的大 boss 藏在后面~ (逃~</td></tr>
</tbody>
</table>
<p>因为没人搭理她,她还在 <a class="reference external" href="//webchat.freenode.net/?channels=#archlinux-cn">##archlinux-cn</a> 里吐槽了一番:</p>
<blockquote>
<p>[phoenixlzx] 没人理会透明卷</p>
<p>[phoenixlzx] 还是滚去睡觉好了</p>
<p>(quininer) 凤凰怎么了</p>
<p>[phoenixlzx] 心情不好</p>
<p>(quininer) momo</p>
<p>[phoenixlzx] 当时要做的时候都说做做做做好了买买买</p>
<p>[phoenixlzx] 然后现在做好了都不吱声了</p>
<p>[phoenixlzx] 订单呢?订单呢?</p>
<p>[phoenixlzx] 真是不靠谱</p>
</blockquote>
<p>不过说到底还是在吐槽 OpenVZ 架构……</p>
<div class="section" id="openvz">
<h2><a class="toc-backref" href="#id8">说到底还是在吐槽 OpenVZ 架构</a></h2>
<blockquote>
<p>OpenVZ是基于Linux内核和作业系统的操作系统级虚拟化技术。OpenVZ允许物理服务器运行多个操作系统,被称虚拟专用服务器(VPS,Virtual Private Server)或虚拟环境(VE,Virtual Environment)。</p>
<p>与VMware这种虚拟机和Xen这种硬件辅助虚拟化技术相比,OpenVZ的主机与客户系统都必须是Linux(虽然在不同的虚拟环境里可以用不同的Linux发行版)。但是,OpenVZ声称这样做有性能上的优势。根据OpenVZ网站的说法,使用OpenVZ与使用独立的实体服务器相比,性能只会有1-3%的损失。</p>
<p>OpenVZ是SWsoft, Inc.公司开发的专有软件Virtuozzo的基础。OpenVZ的授权为GPLv2。</p>
<p>OpenVZ由两部分组成,一个经修改过的操作系统核心与一套用户工具。</p>
<p class="attribution">—<a class="reference external" href="https://zh.wikipedia.org/wiki/OpenVZ">Wikipedia:OpenVZ</a></p>
</blockquote>
<p>简单来说,OpenVZ 架构不是像 KVM Vmware 一类的完全虚拟化.而且 <ruby><rb>容易</rb><rp>(</rp><rt>几乎总是</rt><rp>)</rp></ruby> 被服务商超售(不然咋会卖那么便宜😂😂).</p>
<p>不过由于和 <ruby><rb>主机</rb><rp>(</rp><rt>母鸡</rt><rp>)</rp></ruby> 共享内核,听说会有性能优势?</p>
</div>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id9">购买时的一点吐槽</a></h2>
<p><a class="reference external" href="https://portal.vpsto.com/cart.php?gid=9">链接在这,标准的 WHMCS 面板.</a></p>
<p>可是为啥服务开通的确认邮件被 Yandex Mail 当作 spam 了啊 (ノ=Д=)ノ┻━┻</p>
<p>除了这个其它还OK,VPS 的管理界面也是标准的 SolusVM 面板。</p>
<p><del>真的是太标准了好像连主题都没改😂😂</del></p>
<p>另外没有咱喜欢的 Arch Linux 还是很遗憾呐~(卷把锅甩给了OpenVZ,因为母鸡定制的内核太老 (2.6.x) 😂😂</p>
<p>顺便提一下这次咱买的是最便宜的那个(一个月也要99😂😂),配置大概像这样:</p>
<blockquote>
<p>1 Core CPU</p>
<p>1 GB Guaranteed RAM</p>
<p>25 GB HDD</p>
<p>400 GB Premium Traffic @ 100Mbps Bandwidth</p>
<p>SoftLayer Hong Kong Datacenter</p>
</blockquote>
</div>
<div class="section" id="id4">
<h2><a class="toc-backref" href="#id10">日常</a></h2>
<p>刚开通时的系统是 CentOS 6 , <del>吓的咱赶紧换成了 Debian 8</del>,VPS 控制面板上就重装系统,大概一两分钟左右吧.</p>
<p>登录,先 apt update 一下,连的好像是 Debian 官方的仓库,速度不够快.</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># apt update</span></span>
<span class="code-line">.....</span>
<span class="code-line">Fetched <span class="m">528</span> kB in 5s <span class="o">(</span><span class="m">94</span>.2 kB/s<span class="o">)</span></span>
</pre></div>
<p>接下来更新系统,速度在 2M/s 左右,还可以(懒得换镜像源了😂😂</p>
<div class="highlight"><pre><span class="code-line"><span></span>root@s17931102:~# apt full-upgrade</span>
<span class="code-line">Reading package lists... Done</span>
<span class="code-line">Building dependency tree</span>
<span class="code-line">Reading state information... Done</span>
<span class="code-line">Calculating upgrade... Done</span>
<span class="code-line">The following NEW packages will be installed:</span>
<span class="code-line"> e2fsprogs init libss2</span>
<span class="code-line">The following packages will be upgraded:</span>
<span class="code-line"> cpio libc-bin libc6 libgcrypt20 locales multiarch-support</span>
<span class="code-line"><span class="m">6</span> upgraded, <span class="m">3</span> newly installed, <span class="m">0</span> to remove and <span class="m">0</span> not upgraded.</span>
<span class="code-line">Need to get <span class="m">11</span>.5 MB of archives.</span>
<span class="code-line">After this operation, <span class="m">3327</span> kB of additional disk space will be used.</span>
<span class="code-line">Do you want to <span class="k">continue</span>? <span class="o">[</span>Y/n<span class="o">]</span></span>
<span class="code-line">...</span>
<span class="code-line">Fetched <span class="m">11</span>.5 MB in 4s <span class="o">(</span><span class="m">2705</span> kB/s<span class="o">)</span></span>
<span class="code-line">...</span>
</pre></div>
</div>
<div class="section" id="id5">
<h2><a class="toc-backref" href="#id11">胡乱的性能测试</a></h2>
<p><a class="reference external" href="http://www.freehao123.com/vps-cpu-io-unixbench/">咱照着这篇文章小小的测试了一下😂😂</a></p>
<p>CPU 是 Intel(R) Xeon(R) CPU E5-2650 v3 @ 2.30GHz .</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># cat /proc/cpuinfo</span></span>
<span class="code-line">processor : <span class="m">0</span></span>
<span class="code-line">vendor_id : GenuineIntel</span>
<span class="code-line">cpu family : <span class="m">6</span></span>
<span class="code-line">model : <span class="m">63</span></span>
<span class="code-line">model name : Intel<span class="o">(</span>R<span class="o">)</span> Xeon<span class="o">(</span>R<span class="o">)</span> CPU E5-2650 v3 @ <span class="m">2</span>.30GHz</span>
<span class="code-line">stepping : <span class="m">2</span></span>
<span class="code-line">microcode : <span class="m">45</span></span>
<span class="code-line">cpu MHz : <span class="m">2300</span>.033</span>
<span class="code-line">cache size : <span class="m">25600</span> KB</span>
<span class="code-line">......</span>
</pre></div>
<p><code class="code">
free -m</code>
了一下:</p>
<div class="highlight"><pre><span class="code-line"><span></span>root@s17931102:~# free -m</span>
<span class="code-line"> total used free shared buffers cached</span>
<span class="code-line">Mem: <span class="m">1024</span> <span class="m">315</span> <span class="m">708</span> <span class="m">14</span> <span class="m">0</span> <span class="m">292</span></span>
<span class="code-line">-/+ buffers/cache: <span class="m">23</span> <span class="m">1000</span></span>
<span class="code-line">Swap: <span class="m">0</span> <span class="m">0</span> <span class="m">0</span></span>
</pre></div>
<p>Debian 8 Minimal,还没有装任何软件时大概用掉了23M 内存.</p>
<p><code class="code">
dd</code>
了两下,速度不错:</p>
<div class="highlight"><pre><span class="code-line"><span></span>root@s17931102:~# dd <span class="k">if</span><span class="o">=</span>/dev/zero <span class="nv">of</span><span class="o">=</span><span class="nb">test</span> <span class="nv">bs</span><span class="o">=</span>64k <span class="nv">count</span><span class="o">=</span>4k <span class="nv">oflag</span><span class="o">=</span>dsync</span>
<span class="code-line"><span class="m">4096</span>+0 records in</span>
<span class="code-line"><span class="m">4096</span>+0 records out</span>
<span class="code-line"><span class="m">268435456</span> bytes <span class="o">(</span><span class="m">268</span> MB<span class="o">)</span> copied, <span class="m">1</span>.08052 s, <span class="m">248</span> MB/s</span>
<span class="code-line">root@s17931102:~# dd <span class="k">if</span><span class="o">=</span>/dev/zero <span class="nv">of</span><span class="o">=</span><span class="nb">test</span> <span class="nv">bs</span><span class="o">=</span>8k <span class="nv">count</span><span class="o">=</span>256k <span class="nv">conv</span><span class="o">=</span>fdatasync</span>
<span class="code-line"><span class="m">262144</span>+0 records in</span>
<span class="code-line"><span class="m">262144</span>+0 records out</span>
<span class="code-line"><span class="m">2147483648</span> bytes <span class="o">(</span><span class="m">2</span>.1 GB<span class="o">)</span> copied, <span class="m">2</span>.51345 s, <span class="m">854</span> MB/s</span>
</pre></div>
<p>下载一个来自 Cachefly 的测速文件,差不多跑满了 100Mb 的带宽:</p>
<div class="highlight"><pre><span class="code-line"><span></span>root@s17931102:~# wget http://cachefly.cachefly.net/100mb.test</span>
<span class="code-line">Resolving cachefly.cachefly.net <span class="o">(</span>cachefly.cachefly.net<span class="o">)</span>... <span class="m">205</span>.234.175.175</span>
<span class="code-line">Connecting to cachefly.cachefly.net <span class="o">(</span>cachefly.cachefly.net<span class="o">)</span><span class="p">|</span><span class="m">205</span>.234.175.175<span class="p">|</span>:80... connected.</span>
<span class="code-line">HTTP request sent, awaiting response... <span class="m">200</span> OK</span>
<span class="code-line">Length: <span class="m">104857600</span> <span class="o">(</span>100M<span class="o">)</span> <span class="o">[</span>application/octet-stream<span class="o">]</span></span>
<span class="code-line">Saving to: <span class="s1">'100mb.test'</span></span>
<span class="code-line"></span>
<span class="code-line">100mb.test <span class="m">100</span>%<span class="o">[===================================================</span>><span class="o">]</span> <span class="m">100</span>.00M <span class="m">11</span>.7MB/s in <span class="m">9</span>.0s</span>
<span class="code-line"></span>
<span class="code-line"><span class="m">2016</span>-02-22 <span class="m">02</span>:52:54 <span class="o">(</span><span class="m">11</span>.1 MB/s<span class="o">)</span> - <span class="s1">'100mb.test'</span> saved <span class="o">[</span><span class="m">104857600</span>/104857600<span class="o">]</span></span>
</pre></div>
<p>从 <a class="reference external" href="/links.html#cuihao">cuihao</a> 的镜像源下载 Arch Linux 的安装映像,也能跑满百兆带宽:</p>
<div class="highlight"><pre><span class="code-line"><span></span>root@s17931102:~# wget https://mirrors.ustc.edu.cn/archlinux/iso/2016.02.01/archlinux-2016.02.01-dual.iso</span>
<span class="code-line">Resolving mirrors.ustc.edu.cn <span class="o">(</span>mirrors.ustc.edu.cn<span class="o">)</span>... <span class="m">202</span>.141.176.110, <span class="m">2001</span>:da8:d800:95::110</span>
<span class="code-line">Connecting to mirrors.ustc.edu.cn <span class="o">(</span>mirrors.ustc.edu.cn<span class="o">)</span><span class="p">|</span><span class="m">202</span>.141.176.110<span class="p">|</span>:443... connected.</span>
<span class="code-line">HTTP request sent, awaiting response... <span class="m">200</span> OK</span>
<span class="code-line">Length: <span class="m">735051776</span> <span class="o">(</span>701M<span class="o">)</span> <span class="o">[</span>application/octet-stream<span class="o">]</span></span>
<span class="code-line">Saving to: <span class="s1">'archlinux-2016.02.01-dual.iso'</span></span>
<span class="code-line"></span>
<span class="code-line">archlinux-2016.02.01-dual.iso <span class="m">100</span>%<span class="o">[===================================================</span>><span class="o">]</span> <span class="m">701</span>.00M <span class="m">11</span>.7MB/s in 63s</span>
<span class="code-line"></span>
<span class="code-line"><span class="m">2016</span>-02-22 <span class="m">02</span>:57:09 <span class="o">(</span><span class="m">11</span>.2 MB/s<span class="o">)</span> - <span class="s1">'archlinux-2016.02.01-dual.iso'</span> saved <span class="o">[</span><span class="m">735051776</span>/735051776<span class="o">]</span></span>
</pre></div>
<p>由于没装web服务器所以先不测试出口带宽......</p>
<p>运行了一个小脚本来测速,噫可赛艇~:</p>
<p><a class="reference external" href="http://freevps.us/downloads/bench.sh">http://freevps.us/downloads/bench.sh</a></p>
<div class="highlight"><pre><span class="code-line"><span></span>Speedtest <span class="o">(</span>IPv4 only<span class="o">)</span></span>
<span class="code-line">---------------------</span>
<span class="code-line">Your public IPv4 is foo</span>
<span class="code-line"></span>
<span class="code-line">Location Provider Speed</span>
<span class="code-line">CDN Cachefly <span class="m">11</span>.1MB/s</span>
<span class="code-line"></span>
<span class="code-line">Atlanta, GA, US Coloat <span class="m">7</span>.26MB/s</span>
<span class="code-line">Dallas, TX, US Softlayer <span class="m">8</span>.13MB/s</span>
<span class="code-line">Seattle, WA, US Softlayer <span class="m">10</span>.6MB/s</span>
<span class="code-line">San Jose, CA, US Softlayer <span class="m">9</span>.82MB/s</span>
<span class="code-line">Washington, DC, US Softlayer <span class="m">9</span>.11MB/s</span>
<span class="code-line"></span>
<span class="code-line">Tokyo, Japan Linode <span class="m">11</span>.2MB/s</span>
<span class="code-line">Singapore Softlayer <span class="m">11</span>.5MB/s</span>
<span class="code-line"></span>
<span class="code-line">Rotterdam, Netherlands id3.net <span class="m">6</span>.91MB/s</span>
<span class="code-line">Haarlem, Netherlands Leaseweb <span class="m">7</span>.45MB/s</span>
</pre></div>
<p>综上所述,网速棒棒哒~</p>
<p>编译来自 <a class="reference external" href="http://lnmp.org">lnmp.org</a> 的LNMP 一键安装包......</p>
<p>用了40多分钟,算不算快咧 _(:з」∠)_</p>
</div>
<div class="section" id="id7">
<h2><a class="toc-backref" href="#id12">一点总结</a></h2>
<p>总之卷的 VPS 还是很棒呐~(๑•̀ㅂ•́)و✧,不过真的还是有些贵😂😂,对于只想搭个梯子的人来讲花销有些大 (´・ω・`).</p>
<p><del>为了接着用 Arch Linux,咱还是回去用 conoha 吧 _(:з」∠)_</del></p>
</div>
MediaWiki 设置SMTP发送邮件2016-02-18T15:20:00+08:002016-02-18T15:20:00+08:00ホロtag:None,2016-02-18:/mediawiki/smtp_for_mediawiki.html
<p>为 MediaWiki 设置通过 SMTP 发送邮件.就是这样 _(:з」∠)_</p>
<div class="section" id="smtp">
<h2><a class="toc-backref" href="#id2">为啥要搞 SMTP 发信?</a></h2>
<ul class="simple">
<li>邮件功能在重置密码和通知时非常重要 (・ω・)</li>
<li>听说用 PHP 的 mail() 函数发送的邮件容易被当成垃圾邮件(然而咱压根没收到😂</li>
</ul>
<p>所以才要搞 SMTP 呗~</p>
</div>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id3">安装需要的库</a></h2>
<p>PHP 7 木有 pear 啦 (Arch Linux 官方源在 PHP7 升级后从官方源里移除了 <code class="code">
php-pear</code>
)~,所以通过 composer 安装呗~</p>
<p>首先安装上 composer ,如果汝在用 Arch Linux 的话:</p>
<blockquote>
sudo pacman -S php-composer</blockquote>
<p>其它系统的话,可以参照 …</p></div>
<p>为 MediaWiki 设置通过 SMTP 发送邮件.就是这样 _(:з」∠)_</p>
<div class="section" id="smtp">
<h2><a class="toc-backref" href="#id2">为啥要搞 SMTP 发信?</a></h2>
<ul class="simple">
<li>邮件功能在重置密码和通知时非常重要 (・ω・)</li>
<li>听说用 PHP 的 mail() 函数发送的邮件容易被当成垃圾邮件(然而咱压根没收到😂</li>
</ul>
<p>所以才要搞 SMTP 呗~</p>
</div>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id3">安装需要的库</a></h2>
<p>PHP 7 木有 pear 啦 (Arch Linux 官方源在 PHP7 升级后从官方源里移除了 <code class="code">
php-pear</code>
)~,所以通过 composer 安装呗~</p>
<p>首先安装上 composer ,如果汝在用 Arch Linux 的话:</p>
<blockquote>
sudo pacman -S php-composer</blockquote>
<p>其它系统的话,可以参照 <a class="reference external" href="https://getcomposer.org/download/">Composer 官方的安装指南</a> 进行安装呗~</p>
<p>在安装上 composer 以后安装 mail 和 smtp 包:</p>
<blockquote>
composer require --update-no-dev pear/mail pear/net_smtp</blockquote>
<p>如果汝像咱一样安装的是 alpha 版(从 Git 下载的,去掉 <code class="code">
--update-no-dev</code>
选项.</p>
<p>还在用 PHP 5? 用 pear 安装:</p>
<blockquote>
sudo pear install Mail Net_SMTP</blockquote>
</div>
<div class="section" id="wgsmtp-wgpasswordsender">
<h2><a class="toc-backref" href="#id4">设置 $wgSMTP 和 $wgPasswordSender 变量</a></h2>
<p><a class="reference external" href="https://www.mediawiki.org/wiki/Manual:$wgSMTP">MediaWiki.org 的指南</a></p>
<p><code class="code">
$wgSMTP</code>
大概像这样:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="x">$wgSMTP = array(</span></span>
<span class="code-line"><span class="x"> 'host' => "mail.example.com", // SMTP 服务器的地址 (或IP).如果使用了SSL,记得加上 ssl://</span></span>
<span class="code-line"><span class="x"> 'IDHost' => "example.com", // 汝的域名,可选.如果不设置的话会设置成 $wgServer 的值.</span></span>
<span class="code-line"><span class="x"> 'port' => 25, // 端口(一般是25,SSL是465,StartTLS是587)</span></span>
<span class="code-line"><span class="x"> 'auth' => true, // 是否需要 SMTP 认证 (多半都需要呗~)</span></span>
<span class="code-line"><span class="x"> 'username' => "my_user_name", // SMTP 认证的用户名.</span></span>
<span class="code-line"><span class="x"> 'password' => "my_password" // SMTP 认证的密码.</span></span>
<span class="code-line"><span class="x">);</span></span>
</pre></div>
<p>举个栗子 _(:з」∠)_ :</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="x">$wgSMTP = array(</span></span>
<span class="code-line"><span class="x"> 'host' => "smtp.yandex.com", // 咱用的是 Yandex 的 Domain mail~</span></span>
<span class="code-line"><span class="x"> 'port' => 587, // StartTLS =w=</span></span>
<span class="code-line"><span class="x"> 'auth' => true, // 需要登录 😂</span></span>
<span class="code-line"><span class="x"> 'username' => "sender@yoitsu.moe", // 用户名啦~</span></span>
<span class="code-line"><span class="x"> 'password' => "foo" // 密码啦~</span></span>
<span class="code-line"><span class="x">);</span></span>
</pre></div>
<p>有些时候 SMTP 服务器要求外发邮件地址中的发件人和实际一致 (例如 Yandex ),这时需要设置 <code class="code">
$wgPasswordSender</code>
变量:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="x">$wgPasswordSender="sender@yoitsu.moe";</span></span>
</pre></div>
<p>修改完以后用某个功能(例如修改邮件地址测试一下呗~):</p>
<img alt="SMTP发信测试" class="materialboxed responsive-img" src="images/smtptest.png"/>
</div>
在 Arch Linux 上安装 Ghost 博客系统2016-02-14T00:00:00+08:002016-02-14T00:00:00+08:00ホロtag:None,2016-02-14:/arch-linux/ghost_blog_archlinux.html
<p>先祝大家 <ruby><rb>情人节</rb><rp>(</rp><rt>烧烤节</rt><rp>)</rp></ruby> 快乐~ (2333</p>
<p><del>为了让旅伴发发牢骚,就装了一个 Ghost 博客系统咯~</del></p>
<div class="section" id="ghost">
<h2><a class="toc-backref" href="#id7">汝连啥是 Ghost 都不知道?</a></h2>
<blockquote>
<p>Ghost是用JavaScript编写的博客平台,基于MIT许可证开放源代码。Ghost的设计主旨是简化个人网站发布以及网上出版的过程。</p>
<p>Ghost是一款个人博客系统,它是使用Node.js语言和MySQL数据库开发的,同时支持MySQL、MariaDB、SQLite和PostgreSQL。用户可以在支持Node.js的服务器上使用自己的博客。</p>
<p class="attribution">—<a class="reference external" href="https://zh.wikipedia.org/wiki/Ghost_%28%E5%8D%9A%E5%AE%A2%E5%B9%B3%E5%8F%B0%29">Wikipedia 上的 "Ghost (博客平台)" 条目</a></p>
</blockquote>
<p>简单来说,Ghost 是一套博客平台,是一套博客平台,是一套博客平台! <del>(重要的事情说三遍😂😂)</del></p>
</div>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id8">要安装 Ghost 需要啥?</a></h2>
<p>因为 Ghost 是用 Node.js 写成的,所以要安装 Ghost , 汝需要先装上 Node.js 和 npm …</p></div>
<p>先祝大家 <ruby><rb>情人节</rb><rp>(</rp><rt>烧烤节</rt><rp>)</rp></ruby> 快乐~ (2333</p>
<p><del>为了让旅伴发发牢骚,就装了一个 Ghost 博客系统咯~</del></p>
<div class="section" id="ghost">
<h2><a class="toc-backref" href="#id7">汝连啥是 Ghost 都不知道?</a></h2>
<blockquote>
<p>Ghost是用JavaScript编写的博客平台,基于MIT许可证开放源代码。Ghost的设计主旨是简化个人网站发布以及网上出版的过程。</p>
<p>Ghost是一款个人博客系统,它是使用Node.js语言和MySQL数据库开发的,同时支持MySQL、MariaDB、SQLite和PostgreSQL。用户可以在支持Node.js的服务器上使用自己的博客。</p>
<p class="attribution">—<a class="reference external" href="https://zh.wikipedia.org/wiki/Ghost_%28%E5%8D%9A%E5%AE%A2%E5%B9%B3%E5%8F%B0%29">Wikipedia 上的 "Ghost (博客平台)" 条目</a></p>
</blockquote>
<p>简单来说,Ghost 是一套博客平台,是一套博客平台,是一套博客平台! <del>(重要的事情说三遍😂😂)</del></p>
</div>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id8">要安装 Ghost 需要啥?</a></h2>
<p>因为 Ghost 是用 Node.js 写成的,所以要安装 Ghost , 汝需要先装上 Node.js 和 npm 呗~</p>
<div class="tag warning fg-white compound">
<p class="compound-first">截至写这篇文章时,Arch Linux 官方源里 Node.js 的版本是 5.6.0 ,而 Ghost 的计划是只支持 Node.js 的 <ruby><rb>LTS</rb><rp>(</rp><rt>长期支援</rt><rp>)</rp></ruby> 版本, 而 Node.js 的长期支援版本是 0.10x,0.12x和4.2 .所以嘛......</p>
<p class="compound-last">这里(和咱在 AUR 的 ghost 软件包里)用到了一个环境变量 <code class="code">
GHOST_NODE_VERSION_CHECK=false</code>
来不让 ghost 来检查 node 的版本,在 Node.js 下一个 LTS 版本(6.x)出来前先凑合一下呗~</p>
</div>
<p>于是先安装 <a class="reference external" href="https://www.archlinux.org/packages/?name=nodejs">nodejs</a> 和 <a class="reference external" href="https://www.archlinux.org/packages/?name=npm">npm</a> :</p>
<div class="highlight"><pre><span class="code-line"><span></span>sudo pacman -S nodejs npm</span>
</pre></div>
<p>如果汝认为自己的博客会做的比较大,需要一个数据库系统的话,咱推荐 <a class="reference external" href="https://www.archlinux.org/packages/?name=mariadb">mariadb</a> 呗~</p>
</div>
<div class="section" id="aur-ghost">
<h2><a class="toc-backref" href="#id9">从 AUR 安装 Ghost</a></h2>
<p>然后从 AUR 安装 <a href="https://aur.archlinux.org/packages/?O=0&K=ghost" title="在 AUR 上搜索ghost">ghost <sup>AUR</sup> </a> (这个包是咱更新的,有问题尽管 pia 咱~).</p>
<p>如果汝有 yaourt 的话, <code class="code">
yaourt -S ghost</code>
</p>
<p>这会把 ghost 安装在 <code class="code">
/srv/ghost/</code>
目录,由于创建的 ghost 用户不能通过 shell 登录,要修改这个目录的文件的话:</p>
<ul>
<li><p class="first">修改 <code class="code">
/etc/passwd</code>
文件:</p>
<blockquote>
<p>ghost:x:738:738::/srv/ghost:/usr/bin/nologin</p>
<p>把 <code class="code">
/usr/bin/nologin</code>
换成 <code class="code">
/bin/bash</code>
,保存.</p>
<p>这样以后可以通过 <code class="code">
sudo su ghost</code>
切换到 ghost 用户对 /srv/ghost 目录写入了.</p>
</blockquote>
</li>
<li><p class="first">通过下面的命令以 ghost 用户运行一条命令:</p>
<blockquote>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># su 后面的 -s 参数可以制定切换用户后运行的 shell ,</span></span>
<span class="code-line"><span class="c1"># -c 参数可以指定要运行的命令.</span></span>
<span class="code-line"></span>
<span class="code-line">sudo su ghost -s /bin/bash -c <span class="s2">"此处是汝的命令,记得带上引号"</span></span>
</pre></div>
</blockquote>
</li>
</ul>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id10">通过源代码安装 Ghost</a></h2>
<p>首先把 ghost 的源代码下载下来并解开:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># 这时最新的版本是0.7.6.</span></span>
<span class="code-line">wget https://ghost.org/zip/ghost-0.7.6.zip</span>
<span class="code-line">unzip ghost-0.7.6.zip</span>
<span class="code-line"><span class="nb">cd</span> ghost-0.7.6</span>
</pre></div>
<p>接下来通过 npm 安装需要的依赖,因为上面的提示嘛~</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="nv">GHOST_NODE_VERSION_CHECK</span><span class="o">=</span><span class="nb">false</span> npm install</span>
</pre></div>
</div>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id11">修改配置文件</a></h2>
<p>如果是通过 AUR 安装的,配置文件位于 <code class="code">
/srv/ghost/config.js</code>
</p>
<p>如果是通过源代码安装的,从目录中先复制一份样例出来呗~</p>
<blockquote>
<div class="highlight"><pre><span class="code-line"><span></span>cp config.example.js config.js</span>
</pre></div>
</blockquote>
<p>这里的例子是修改 <code class="code">
Production</code>
一节
(这一节是汝的 Ghost 实际运行时的配置,下面的 Development 一节是开发时的配置)</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="nx">config</span> <span class="o">=</span> <span class="p">{</span></span>
<span class="code-line"> <span class="c1">// ### Production</span></span>
<span class="code-line"> <span class="c1">// When running Ghost in the wild, use the production environment.</span></span>
<span class="code-line"> <span class="c1">// Configure your URL and mail settings here</span></span>
<span class="code-line"> <span class="nx">production</span><span class="o">:</span> <span class="p">{</span></span>
<span class="code-line"> <span class="c1">// 汝的网址?</span></span>
<span class="code-line"> <span class="nx">url</span><span class="o">:</span> <span class="s1">'http://localhost'</span><span class="p">,</span></span>
<span class="code-line"> <span class="nx">mail</span><span class="o">:</span> <span class="p">{},</span></span>
<span class="code-line"> <span class="c1">// 汝想使用那种数据库?</span></span>
<span class="code-line"> <span class="c1">// 下面的例子是 sqlite3 数据库,配置文件中还有设置 MariaDB 数据库 的样例</span></span>
<span class="code-line"> <span class="nx">database</span><span class="o">:</span> <span class="p">{</span></span>
<span class="code-line"> <span class="nx">client</span><span class="o">:</span> <span class="s1">'sqlite3'</span><span class="p">,</span></span>
<span class="code-line"> <span class="nx">connection</span><span class="o">:</span> <span class="p">{</span></span>
<span class="code-line"> <span class="nx">filename</span><span class="o">:</span> <span class="nx">path</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="nx">__dirname</span><span class="p">,</span> <span class="s1">'/content/data/ghost.db'</span><span class="p">)</span></span>
<span class="code-line"> <span class="p">},</span></span>
<span class="code-line"> <span class="nx">debug</span><span class="o">:</span> <span class="nx">falseProduction</span></span>
<span class="code-line"> <span class="p">},</span></span>
<span class="code-line"></span>
<span class="code-line"> <span class="nx">server</span><span class="o">:</span> <span class="p">{</span></span>
<span class="code-line"> <span class="nx">host</span><span class="o">:</span> <span class="s1">'127.0.0.1'</span><span class="p">,</span></span>
<span class="code-line"> <span class="nx">port</span><span class="o">:</span> <span class="s1">'2368'</span></span>
<span class="code-line"> <span class="p">}</span></span>
<span class="code-line"> <span class="p">},</span></span>
</pre></div>
</div>
<div class="section" id="id4">
<h2><a class="toc-backref" href="#id12">如果汝的 Ghost 和汝进行操作的电脑是同一个</a></h2>
<p>通过下面的命令来测试汝的 Ghost 呗~</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="nb">cd</span> /path/to/ghost</span>
<span class="code-line"><span class="nv">GHOST_NODE_VERSION_CHECK</span><span class="o">=</span><span class="nb">false</span></span>
</pre></div>
<p>如果汝是从 AUR 安装的,可以通过 Systemd 来启动</p>
<div class="highlight"><pre><span class="code-line"><span></span>sudo systemctl start ghost</span>
</pre></div>
<p>现在打开 <code class="code">
http://localhost:2368</code>
看看效果呗~</p>
</div>
<div class="section" id="id5">
<h2><a class="toc-backref" href="#id13">如果汝的 Ghost 和汝进行操作的电脑不是同一个</a></h2>
<p>比如汝在 VPS 上安装了 Ghost,就需要用一个 web服务器通过反向代理来访问呗~</p>
<p>首先修改 <code class="code">
config.js</code>
把 Production 中的 URL 换成汝的网址啦~</p>
<p>如果汝在用 Nginx, 把这一段增加到汝的 <code class="code">
server</code>
块中:</p>
<div class="highlight"><pre><span class="code-line"><span></span>location / {</span>
<span class="code-line"> proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;</span>
<span class="code-line"> proxy_set_header Host $http_host;</span>
<span class="code-line"> proxy_set_header X-Forwarded-Proto $scheme;</span>
<span class="code-line"> proxy_pass http://127.0.0.1:2368;</span>
<span class="code-line"> # 汝的更多自定义设置</span>
<span class="code-line">}</span>
</pre></div>
<p>如果汝在用 Apache, 把下面一段添加到汝的 httpd.conf 的 vhost 段中(首先要启用 mod_proxy 模块~):</p>
<div class="highlight"><pre><span class="code-line"><span></span>ProxyPass / http://localhost:2368/</span>
<span class="code-line">ProxyPassReverse / http://localhost:2368/</span>
<span class="code-line">ProxyHTMLURLMap http://localhost:2368/ /</span>
<span class="code-line">RequestHeader set X-Forwarded-For $proxy_add_x_forwarded_for</span>
<span class="code-line">RequestHeader set Host $host</span>
<span class="code-line">RequestHeader set X-Forwarded-Proto $scheme</span>
</pre></div>
<p>然后重新启动 ghost 和 web 服务器以后试试通过汝的网址访问?</p>
<p>打开 <code class="code">
http://汝的ghost网址/ghost/</code>
开始设置汝的 Ghost 博客呗~</p>
</div>
<div class="section" id="id6">
<h2><a class="toc-backref" href="#id14">参考资料</a></h2>
<ul class="simple">
<li><a class="reference external" href="http://support.ghost.org/developers">Ghost Blog 文档</a></li>
<li><a class="reference external" href="http://httpd.apache.org/docs/2.4/mod/mod_proxy.html">Apache httpd mod_proxy 文档</a></li>
</ul>
</div>
AUR 纯萌新向入门教学(3)-提交软件包到AUR2016-02-05T00:00:00+08:002016-02-05T00:00:00+08:00ホロtag:None,2016-02-05:/arch-linux/aur_sumbiting_guidebook.html
<p>通过上一次的 <a class="reference external" href="/aur_packaging_guidebook.html">「创建一个软件包」</a> ,
汝应该已经创建了一个 <del>(或是 N 个)</del> 软件包了吧,如果汝想分享给其它人的话,上传到 AUR 其实是最方便的方法呗~</p>
<div class="tag info fg-white compound">
<p>前几天被 <a class="alert-link reference external" href="//webchat.freenode.net/?channels=archlinux-cn">#archlinux-cn</a> 的各位吐槽了中文和英文之间空格的问题,原谅咱写文章时太随性😂</p>
</div>
<div class="section" id="arch-user-repository">
<h2><a class="toc-backref" href="#id5">再来回顾一下 Arch User Repository 的打包规范呗~</a></h2>
<p><del>不合规范的软件包可能会在不经过提醒的话直接删除.</del></p>
<ul>
<li><p class="first"><a class="reference external" href="https://wiki.archlinux.org/index.php/Arch_packaging_standards_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)">Arch Linux 打包标准</a></p>
<blockquote>
<p>对于某些特定平台的软件包(例如 Web 应用)有不同的打包规范,记得看哦~</p>
</blockquote>
</li>
<li><p class="first"><a class="reference external" href="https://wiki.archlinux.org/index.php/Arch_User_Repository_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)#.E6.8F.90.E4.BA.A4.E8.BD.AF.E4.BB.B6.E5.8C.85.E7.9A.84.E8.A7.84.E5.88.99">提交软件包到 AUR 的规则</a></p>
</li>
</ul>
<hr class="docutils"/>
<p>看了 Wiki 以后,是否觉得自己的软件包符合规范了?</p>
<p>如果确定的话,接着往下看呗~</p>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id6">第一步:注册一个 AUR 帐号</a></h2>
<p>去 <a class="reference external" href="https://aur.archlinux.org/register/">https://aur.archlinux.org/register/</a> 注册一个帐号呗 …</p></div>
<p>通过上一次的 <a class="reference external" href="/aur_packaging_guidebook.html">「创建一个软件包」</a> ,
汝应该已经创建了一个 <del>(或是 N 个)</del> 软件包了吧,如果汝想分享给其它人的话,上传到 AUR 其实是最方便的方法呗~</p>
<div class="tag info fg-white compound">
<p>前几天被 <a class="alert-link reference external" href="//webchat.freenode.net/?channels=archlinux-cn">#archlinux-cn</a> 的各位吐槽了中文和英文之间空格的问题,原谅咱写文章时太随性😂</p>
</div>
<div class="section" id="arch-user-repository">
<h2><a class="toc-backref" href="#id5">再来回顾一下 Arch User Repository 的打包规范呗~</a></h2>
<p><del>不合规范的软件包可能会在不经过提醒的话直接删除.</del></p>
<ul>
<li><p class="first"><a class="reference external" href="https://wiki.archlinux.org/index.php/Arch_packaging_standards_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)">Arch Linux 打包标准</a></p>
<blockquote>
<p>对于某些特定平台的软件包(例如 Web 应用)有不同的打包规范,记得看哦~</p>
</blockquote>
</li>
<li><p class="first"><a class="reference external" href="https://wiki.archlinux.org/index.php/Arch_User_Repository_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)#.E6.8F.90.E4.BA.A4.E8.BD.AF.E4.BB.B6.E5.8C.85.E7.9A.84.E8.A7.84.E5.88.99">提交软件包到 AUR 的规则</a></p>
</li>
</ul>
<hr class="docutils"/>
<p>看了 Wiki 以后,是否觉得自己的软件包符合规范了?</p>
<p>如果确定的话,接着往下看呗~</p>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id6">第一步:注册一个 AUR 帐号</a></h2>
<p>去 <a class="reference external" href="https://aur.archlinux.org/register/">https://aur.archlinux.org/register/</a> 注册一个帐号呗~</p>
</div>
<div class="section" id="aur-ssh">
<h2><a class="toc-backref" href="#id7">第二步:为 AUR 准备一个 SSH 密钥</a></h2>
<p>因为 AUR 现在用 Git 提交,所以没有一个 SSH 密钥是不行的呐~,
建议为 AUR 生成一个新的证书,这样一旦发现问题就可以直接吊销诶(不要把鸡蛋放在一个篮子里~)</p>
<p>可以用 <code class="code">
ssh-keygen</code>
命令生成新的密钥:</p>
<div class="highlight"><pre><span class="code-line"><span></span>$ ssh-keygen</span>
<span class="code-line">Generating public/private rsa key pair.</span>
<span class="code-line"><span class="c1"># 为汝的公钥和私钥决定一个存放的位置呗~</span></span>
<span class="code-line">Enter file in which to save the key <span class="o">(</span>/home/horo/.ssh/id_rsa<span class="o">)</span>:</span>
<span class="code-line">/home/horo/.ssh/example</span>
<span class="code-line"><span class="c1"># 为私钥设置一个密码,可以省略,但是为了安全还是设置一个呐~</span></span>
<span class="code-line">Enter passphrase <span class="o">(</span>empty <span class="k">for</span> no passphrase<span class="o">)</span>:</span>
<span class="code-line">Enter same passphrase again:</span>
<span class="code-line"><span class="c1"># 汝的私钥保存在汝决定的路径中</span></span>
<span class="code-line">Your identification has been saved in /home/horo/.ssh/example.</span>
<span class="code-line"><span class="c1"># 汝的公钥保存在汝决定的路径中,不过扩展名为.pub</span></span>
<span class="code-line">Your public key has been saved in /home/horo/.ssh/example.pub.</span>
<span class="code-line"><span class="c1"># 这是汝的密钥指纹,用来区分不同的密钥</span></span>
<span class="code-line">The key fingerprint is:</span>
<span class="code-line">SHA256:mwk7FvA2E0ycw+E8NYOr1+OL3+0qnF6PFMZ/Ndxuw84 horo@Yotisu</span>
<span class="code-line">The key<span class="err">'</span>s randomart image is:</span>
<span class="code-line">+---<span class="o">[</span>RSA <span class="m">2048</span><span class="o">]</span>----+</span>
<span class="code-line"><span class="p">|</span> oo++ <span class="p">|</span></span>
<span class="code-line"><span class="p">|</span> <span class="o">=</span>*. o <span class="p">|</span></span>
<span class="code-line"><span class="p">|</span> . *o <span class="p">|</span></span>
<span class="code-line"><span class="p">|</span> o.o . . .<span class="p">|</span></span>
<span class="code-line"><span class="p">|</span> .B.S + oo<span class="p">|</span></span>
<span class="code-line"><span class="p">|</span> ...*o<span class="o">=</span> o .o.<span class="p">|</span></span>
<span class="code-line"><span class="p">|</span> .+o+oo . .oo<span class="p">|</span></span>
<span class="code-line"><span class="p">|</span> . <span class="nv">o</span><span class="o">=</span>+ + .o..<span class="p">|</span></span>
<span class="code-line"><span class="p">|</span> .o+o+o+ E <span class="p">|</span></span>
<span class="code-line">+----<span class="o">[</span>SHA256<span class="o">]</span>-----+</span>
</pre></div>
<p>然后在 AUR Web 界面上点击 "My Account (我的账户)" ,把汝的公钥里的内容填进 "SSH Public Key:" 一节中,保存.</p>
<p>接下来编辑 <code class="code">
~/.ssh/config</code>
,
告诉ssh命令连接到 <code class="code">
aur.archlinux.org</code>
用汝新创建的密钥呗~</p>
<div class="highlight"><pre><span class="code-line"><span></span>Host aur.archlinux.org</span>
<span class="code-line"> IdentityFile ~/.ssh/example <span class="c1"># 记得用汝自己的私钥路径</span></span>
<span class="code-line"> User foo <span class="c1"># 记得换成汝自己的用户名.</span></span>
</pre></div>
</div>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id8">第三步:提交软件包到 AUR</a></h2>
<p>用下面的命令创建一个新的仓库:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># 用汝希望的名称替换foobar.</span></span>
<span class="code-line"><span class="c1"># 从不存在的仓库中克隆或推送,将会自动创建此仓库。</span></span>
<span class="code-line">git clone ssh://aur@aur.archlinux.org/foobar.git</span>
</pre></div>
<p>这时汝的当前目录下会多出一个以汝的软件包名命名的文件夹(例如 <code class="code">
foobar</code>
),
把汝的软件包需要的文件(PKGBUILD,有时还有些其他的文件)放到这个文件夹内.</p>
<p>接着记得写一个 <code class="code">
.SRCINFO</code>
(供 AUR Web 界面解析的元数据),
可以通过 <a class="reference external" href="https://www.archlinux.org/packages/?name=pkgbuild-introspection">pkgbuild-introspection</a> 包内的 <code class="code">
mksrcinfo</code>
工具生成.</p>
<div class="tag warning fg-white compound">
<p>每一次提交都要包含最新的 <code class="code">
.SRCINFO</code>
文件!不然服务器会 <del>傲娇的</del> 拒绝汝的提交呐~</p>
</div>
<p>然后普通的使用 Git 来提交呗~</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># 还是老话,不要照抄,按汝实际的状况来.</span></span>
<span class="code-line">git add .</span>
<span class="code-line">git commit -m <span class="s2">"Example"</span></span>
<span class="code-line">git push</span>
</pre></div>
<p>在 AUR 上搜索汝的软件包试试?(像这样 <a href="https://aur.archlinux.org/packages/?O=0&K=parsoid-git" title="在 AUR 上搜索parsoid-git">parsoid-git <sup>AUR</sup> </a>)</p>
</div>
<div class="section" id="id4">
<h2><a class="toc-backref" href="#id9">可能的后续工作</a></h2>
<p>汝以为把软件包提交上就结束了?</p>
<ul class="simple">
<li>一旦上游更新了,汝就要及时的更新诶(年久失修的包会被删除)</li>
<li>关注下方的评论,聆听用户的 <ruby><rb>建议</rb><rp>(</rp><rt>抱怨</rt><rp>)</rp></ruby> 并试着改进汝的软件包呗~</li>
<li>发觉自己没有精力维护某个软件包?可以通过AURweb界面 disown 一个软件包或是在AUR邮件列表发条消息.</li>
</ul>
</div>
AUR 纯萌新向入门教学(2)-创建一个软件包2016-02-03T00:00:00+08:002016-02-03T00:00:00+08:00ホロtag:None,2016-02-03:/arch-linux/aur_packaging_guidebook.html
<p>上一次咱说了 <a class="reference external" href="/aur_fresh_guidebook.html">「从AUR中安装软件包」</a> ,其实如果汝足够 <del>触</del> 的话,不妨自己创建个软件包呗~</p>
<div class="section" id="archwiki">
<h2><a class="toc-backref" href="#id15">首先为啥不读读ArchWiki咧?</a></h2>
<p><del>ArchWiki ,短小精悍,汝值得拥有呐~</del></p>
<ul class="simple">
<li><a class="reference external" href="https://wiki.archlinux.org/index.php/Creating_packages_%28%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87%29">创建软件包</a></li>
<li><a class="reference external" href="https://wiki.archlinux.org/index.php/PKGBUILD_%28%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87%29">PKGBUILD</a></li>
<li><a class="reference external" href="https://wiki.archlinux.org/index.php/Arch_packaging_standards_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)">Arch Linux 打包标准</a></li>
</ul>
<p>如果因为各种原因看了Wiki还不明白的话,接着往下看呗~</p>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id16">第一步:以普通的方式安装软件</a></h2>
<p>看看 <code class="code">
base-devel</code>
装了没?</p>
<div class="highlight"><pre><span class="code-line"><span></span>sudo pacman -S base-devel --needed</span>
</pre></div>
<p>从上游把软件的源代码下载下来,按照上游的文档编译和安装(典型的例子像这样):</p>
<div class="highlight"><pre><span class="code-line"><span></span>./configure</span>
<span class="code-line">make</span>
<span class="code-line">make install</span>
</pre></div>
<p>如果汝为了顺利安装做了任何的调整(比如改了些源码或者打上了补丁),记下来操作步骤,待会儿编写PKGBUILD时要用到哟~</p>
</div>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id17">第二步:编写PKGBUILD文件</a></h2>
<blockquote>
<p>PKGBUILD是一个shell脚本,包含 Arch Linux 在构建软件包时需要的信息.</p>
<p>Arch Linux 用 makepkg 创建软件包 …</p></blockquote></div>
<p>上一次咱说了 <a class="reference external" href="/aur_fresh_guidebook.html">「从AUR中安装软件包」</a> ,其实如果汝足够 <del>触</del> 的话,不妨自己创建个软件包呗~</p>
<div class="section" id="archwiki">
<h2><a class="toc-backref" href="#id15">首先为啥不读读ArchWiki咧?</a></h2>
<p><del>ArchWiki ,短小精悍,汝值得拥有呐~</del></p>
<ul class="simple">
<li><a class="reference external" href="https://wiki.archlinux.org/index.php/Creating_packages_%28%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87%29">创建软件包</a></li>
<li><a class="reference external" href="https://wiki.archlinux.org/index.php/PKGBUILD_%28%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87%29">PKGBUILD</a></li>
<li><a class="reference external" href="https://wiki.archlinux.org/index.php/Arch_packaging_standards_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)">Arch Linux 打包标准</a></li>
</ul>
<p>如果因为各种原因看了Wiki还不明白的话,接着往下看呗~</p>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id16">第一步:以普通的方式安装软件</a></h2>
<p>看看 <code class="code">
base-devel</code>
装了没?</p>
<div class="highlight"><pre><span class="code-line"><span></span>sudo pacman -S base-devel --needed</span>
</pre></div>
<p>从上游把软件的源代码下载下来,按照上游的文档编译和安装(典型的例子像这样):</p>
<div class="highlight"><pre><span class="code-line"><span></span>./configure</span>
<span class="code-line">make</span>
<span class="code-line">make install</span>
</pre></div>
<p>如果汝为了顺利安装做了任何的调整(比如改了些源码或者打上了补丁),记下来操作步骤,待会儿编写PKGBUILD时要用到哟~</p>
</div>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id17">第二步:编写PKGBUILD文件</a></h2>
<blockquote>
<p>PKGBUILD是一个shell脚本,包含 Arch Linux 在构建软件包时需要的信息.</p>
<p>Arch Linux 用 makepkg 创建软件包.当 makepkg 运行时,它会在当前目录寻找 PKGBUILD 文件,并依照其中的指令去获取依赖文件,编译出 pkgname.pkg.tar.xz 文件.生成的包内有二进制文件和安装指令,可以使用 pacman 进行安装.</p>
<p>pkgname,pkgver,pkgrel和arch是必须包含的变量.license在构建包时并不强制要求,但若要分享 PKGBUILD文件,推荐加上该变量,否则 makepkg 会有警告.</p>
<p class="attribution">—<a class="reference external" href="https://wiki.archlinux.org/index.php/PKGBUILD_%28%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87%29">ArchWiki:PKGBUILD</a></p>
</blockquote>
<div class="section" id="id4">
<h3><a class="toc-backref" href="#id18">获得原型</a></h3>
<p>ArchWiki上关于PKGBUILD的介绍已经很详细啦~,从 <code class="code">
/usr/share/pacman/</code>
找个合适的原型复制下来:</p>
<ul class="simple">
<li>PKGBUILD.proto (经典原型😂)</li>
<li>PKGBUILD-vcs.proto (如果汝的源码来自像SubVersion,Git,Mercurial一类的 <ruby><rb>SCCS</rb><rp>(</rp><rt>源代码控制系统</rt><rp>)</rp></ruby> 的话,看下这份原型呗~)</li>
<li>PKGBUILD-split.proto (如果汝要做一个分包的话)</li>
<li>proto.install (希望在安装之前/之后运行一些别的命令?看看这份原型呗~)</li>
</ul>
<p>阅读原型上的注释,然后删掉(随汝心意啦,但是如果汝想上传软件包的话,[Maintainer/偶尔会有的Contributor]是必须的😂)</p>
</div>
<div class="section" id="id5">
<h3><a class="toc-backref" href="#id19">起个名字</a></h3>
<p>软件包的名字保存在pkgname里,只能用小写字母、数字和@ . _ + - 这些字符,且不允许用.或者-作开头。</p>
<p>别和 AUR 或官方仓库里面的软件包重名了哟~</p>
</div>
<div class="section" id="id6">
<h3><a class="toc-backref" href="#id20">挑个许可协议</a></h3>
<p>为了不造轮子,`传送门在此~ <<a class="reference external" href="https://wiki.archlinux.org/index.php/PKGBUILD_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87">https://wiki.archlinux.org/index.php/PKGBUILD_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87</a>)#license>`_</p>
</div>
<div class="section" id="id7">
<h3><a class="toc-backref" href="#id21">编译和安装时的命令</a></h3>
<p>makepkg的运行顺序大概像这样(从上到下):</p>
<ul>
<li><p class="first">获得,解压和检查源代码的散列值.</p>
</li>
<li><p class="first">pkgver():在汝的源代码来自各种SCCS时会有用,用来更新软件包的版本号.</p>
<blockquote>
<p><a class="reference external" href="https://wiki.archlinux.org/index.php/VCS_package_guidelines#The_pkgver.28.29_function">ArchWiki:VCS_package_guidelines</a> 有一些范例,可以看看呗~</p>
<p>不过记得得给 <code class="code">
pkgver</code>
变量随便赋个值先......</p>
</blockquote>
</li>
<li><p class="first">prepare():一些预处理源文件以进行构建的命令,比如打补丁......</p>
<blockquote>
<p>把汝为了让源代码顺利编译而运行的操作加到这里.不过首先要切换到源码目录呗~</p>
<p>如果汝在编译前不需要干任何事情,这个函数可以不用.</p>
</blockquote>
</li>
<li><p class="first">build():真正 <del>撸起袖子</del> 开始编译软件包的过程.</p>
<blockquote>
<p>如果汝的软件包啥都不用编译,这个函数可以不用.</p>
<p>对于普通的configure-make-make install三部曲来说,build()可以写成这样(汝来决定那些注释的去留呗~)</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># 切换到源码目录</span></span>
<span class="code-line"><span class="nb">cd</span> <span class="s2">"</span><span class="nv">$srcdir</span><span class="s2">/</span><span class="nv">$pkgname</span><span class="s2">-</span><span class="nv">$pkgver</span><span class="s2">"</span></span>
<span class="code-line"><span class="c1"># configure 和 make ,按照Arch Linux的规范,软件包都装在/usr目录</span></span>
<span class="code-line"><span class="c1"># 汝也许要按照上游的指示添加别的参数呐~</span></span>
<span class="code-line">./configure --prefix<span class="o">=</span>/usr</span>
<span class="code-line">make</span>
</pre></div>
<p>不要在这个函数中让用户进行交互,见 <a class="reference external" href="https://bugs.archlinux.org/task/13214">某个bug报告</a></p>
</blockquote>
</li>
<li><p class="first">check():用来执行make check和其他一些例行测试的地方,有时需要.</p>
</li>
<li><p class="first">package():把生成的文件打包成软件包的函数, <strong>只有这个函数是必须的.</strong></p>
<blockquote>
<p>pkg目录复制了根目录下软件安装路径的继承关系.
如果汝需要手动把文件放到根目录下,那么在这里你需要把文件放在pkg下相同的文件层级结构中诶~.
比如,把一个文件安装到/usr/bin,那么在伪root环境中对应的路径为$pkgdir/usr/bin.</p>
<p>对于普通的configure-make-make install三部曲来说,package()可以写成这样:</p>
<div class="highlight"><pre><span class="code-line"><span></span>make <span class="nv">DESTDIR</span><span class="o">=</span><span class="s2">"</span><span class="nv">$pkgdir</span><span class="s2">/"</span> install</span>
</pre></div>
<p>在一些很罕见的情况下,软件只有安装在单一目录下时才能运行.在这种情况下汝还是老老实实把它安装到$pkgdir/opt下吧.</p>
<p>通常,软件在安装过程中会在pkg目录下先创建一系列子目录.如果没有的话,makepkg会报错,记得先在build()函数中提前手动创建这些目录哟.</p>
<p>同build(),不要在这个函数中让用户进行交互.</p>
</blockquote>
</li>
</ul>
</div>
<div class="section" id="id8">
<h3><a class="toc-backref" href="#id22">安装前后有事要做?</a></h3>
<p>如果汝要在安装/升级/卸载前后运行其它命令,可以写个.install文件:</p>
<ul class="simple">
<li>pre_install - 安装前运行的脚本,可以传递版本号为参数.</li>
<li>post_install - 安装后运行的脚本,可以传递版本号为参数.</li>
<li>pre_upgrade - 升级前运行的脚本,可以按新版本号,旧版本号的顺序传递参数.</li>
<li>post_upgrade - 升级后运行的脚本,可以按新版本号,旧版本号的顺序传递参数.</li>
<li>pre_remove - 卸载前运行的脚本,可以传递版本号为参数.</li>
<li>post_remove - 卸载后运行的脚本,可以传递版本号为参数.</li>
</ul>
<p>这些函数运行的也是Bash脚本哦~</p>
<p>然后在PKGBUILD中把 <code class="code">
install</code>
变量指向汝的 <code class="code">
.install</code>
文件的位置呗~</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># 一般来说,.install的文件名应该和软件包名一致.</span></span>
<span class="code-line"><span class="nv">install</span><span class="o">=</span><span class="s1">'foo.install'</span></span>
</pre></div>
</div>
<div class="section" id="id9">
<h3><a class="toc-backref" href="#id23">需要用到配置文件?</a></h3>
<p>如果汝的软件包要有些用户编写的配置文件,记得添加到backups变量里.</p>
<p>例如如果汝的配置文件是 <code class="code">
/etc/foo</code>
:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="nv">backup</span><span class="o">=(</span>etc/foo<span class="o">)</span></span>
</pre></div>
<p>记得是相对于 <code class="code">
/</code>
的路径.</p>
<p>这样pacman就会在软件包升级时提醒用户合并新的和旧的文件,在卸载软件包时这些文件会被保留(除非用了 <code class="code">
pacman -Rn</code>
)</p>
</div>
<div class="section" id="id10">
<h3><a class="toc-backref" href="#id24">依赖,依赖,依赖!</a></h3>
<p><del>重要的事情说三遍--</del></p>
<p>架构相关的变量可以通过下划线加架构的方式指定:depends_x86_64=(), optdepends_x86_64=().</p>
<p>依赖相关的变量有这些:</p>
<ul>
<li><p class="first">depends: <strong>真</strong> 运行时依赖</p>
<blockquote>
<p>运行时 <strong>必须</strong> 的软件包列表,可以使用比较运算符来描述版本限制,如:depends=('foobar>=1.8.0').</p>
<p>不过如果A依赖B,B又依赖C的话,A的depend里不用加上C😂😂</p>
</blockquote>
</li>
<li><p class="first">optdepends:运行时的可选依赖</p>
<blockquote>
<p>一组不影响软件主要功能,但能提供额外特性的软件包.应该简要说明每个包所能提供的额外功能.有些可选依赖如果不安装,软件包的个别程序可能无法正常使用.</p>
<p>optdepends可以这样写:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="nv">optdepends</span><span class="o">=(</span></span>
<span class="code-line"> <span class="s1">'foo: some description'</span></span>
<span class="code-line"><span class="o">)</span></span>
</pre></div>
<p>尽可能给每个可选依赖一个简洁的描述来方便用户决定装不装~</p>
</blockquote>
</li>
<li><p class="first">makedepends:只在编译时需要的依赖</p>
<blockquote>
<p>仅在软件编译时需要的软件包列表.可以像depends序列里提到的一样指定最小版本依赖.</p>
<p>不过不要包含 <del>base-devel</del> 组的软件包! (要运行makepkg的话这个软件包组应该已经装上了)</p>
</blockquote>
</li>
<li><p class="first">checkdepends:只在测试时需要的依赖</p>
<blockquote>
<p>运行测试组件时需要,而运行时不需要的包列表.和makedepends一样,不要包含 <del>base-devel</del> 组的软件包.</p>
<p>只有编写了check()时再填这个变量哟~</p>
</blockquote>
</li>
</ul>
<p>makedepends和checkdepends中的软件包会因为makepkg的 -r 选项而在安装完成后删除.</p>
</div>
<div class="section" id="id11">
<h3><a class="toc-backref" href="#id25">散列值:安全第一</a></h3>
<p>记得加上文件的散列值,makepkg会在编译前检查文件的散列值(和PKGBUILD中的散列值比较),一定程度上确保源代码不会篡改.</p>
<p>写法大概像这样:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="o">{</span>这里是汝选择的散列算法<span class="o">}=(</span><span class="s1">'{散列值}'</span><span class="o">)</span></span>
</pre></div>
<p>散列值的顺序取决于汝的sources变量,例如如果汝选择sha512sum的话:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="nv">sha512sums</span><span class="o">=(</span><span class="s2">"....."</span><span class="o">)</span></span>
</pre></div>
<p>建议使用sha256sums(或更高的位数),md5已经发现有 <a class="reference external" href="https://en.wikipedia.org/wiki/MD5">碰撞漏洞</a> ,sha1已经发现Preimage漏洞(已知校验和的情况下,可以生成一段字符串产生相同的校验和,)</p>
<p>如果汝的源代码来自SCCS的话,因为文件在不断变化,所以需要让makepkg跳过散列值检查:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="nv">sha512sums</span><span class="o">=(</span><span class="s2">"SKIP"</span><span class="o">)</span></span>
</pre></div>
<p>记得在修改某个文件以后用新的散列值这个变量呗~</p>
</div>
</div>
<div class="section" id="id13">
<h2><a class="toc-backref" href="#id26">测试,测试,再测试</a></h2>
<div class="tag info fg-white compound">
<p><del>如果只是汝自己用的话,就不必做这个质量保证了,因为只有汝一个人需要忍受这些错误呗~.</del></p>
</div>
<p>运行下makepkg命令来确保没有问题。如果PKGBUILD没有错误,将会生成一个包,但是如果PKGBUILD被破坏或未完成,它会抛出一个错误。</p>
<p>如果运行makepkg 成功,会生成一个名为$pkgname-$pkgver.pkg.tar.gz的新文件。
这个文件可以使用pacman -U 安装一下试试呗~,不过,一个包被构建并不代表你的工作就完成了!
只有当所有文件的结构都正确才能确保完成,例如前缀不对就不行。
可以使用pacman的查询功能显示软件包包含的文件及依赖的文件,然后将它于你认为正确的对比。"pacman -Qlp <package file>" 和"pacman -Qip <package file>" 可以完成这项工作。</p>
<p>如果包看起来是正确的,那汝的工作就完成了。但是如果汝打算发布这个包或PKGBUILD,还是需要确认确认再确认包的依赖关系。</p>
<p>同样要确保安装的软件确实很完美的运行!就算汝释放了一个包括所有必需文件的包,但是由于一些配置选项使它不能很好的工作,这真是让人恼火。</p>
<p>可以用namcap帮助检查软件包的依赖是否正确:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># 检查PKGBUILD文件</span></span>
<span class="code-line">$ namcap PKGBUILD</span>
<span class="code-line"><span class="c1"># 检查某个软件包</span></span>
<span class="code-line">$ namcap <package file name>.pkg.tar.xz</span>
</pre></div>
<p>Namcap会帮汝干这些事:</p>
<blockquote>
<ol class="arabic simple">
<li>检查PKGBUILD文件里的一些常见错误</li>
<li>用ldd扫描包中所有的ELF文件,自动报告缺失或可去除的依赖。</li>
<li>启发式搜寻缺失或冗余的依赖。</li>
</ol>
</blockquote>
<p>理想的情况是没有输出(真的么?),如果遇到了错误,去ArchWiki上查找对应的解决方案呗~: <a class="reference external" href="https://wiki.archlinux.org/index.php/Namcap">https://wiki.archlinux.org/index.php/Namcap</a></p>
</div>
<div class="section" id="id14">
<h2><a class="toc-backref" href="#id27">生成源码包</a></h2>
<p>用下面的命令生成一个源码包:</p>
<div class="highlight"><pre><span class="code-line"><span></span>makepkg --source</span>
</pre></div>
<p>这会在当前目录生成一个 <code class="code">
.src.tar.gz</code>
文件,汝可以在上传到AUR前先分享给其他人帮汝检查一下呗~</p>
<p>到这里汝应该完成了一个软件包了呗~,下次咱会告诉汝怎么把汝创建的软件包提交到AUR上呗~</p>
</div>
AUR 纯萌新向入门教学(1)-从AUR安装软件包2016-01-29T00:00:00+08:002016-02-01T00:00:00+08:00ホロtag:None,2016-01-29:/arch-linux/aur_fresh_guidebook.html
<p><del>没玩过AUR好意思说自己是Arch Linux用户?</del></p>
<p>尽管Arch Linux官方软件仓库里的软件包够多了,连MediaWiki或者OwnCloud一类的用 <del>最好的编程语言</del> PHP写的应用都有对应的软件包啦~( <del>TU:反正闲着也没事干,打个包呗~</del> ), 但是汝是不是有时试图pacman的时候:</p>
<div class="highlight"><pre><span class="code-line"><span></span>error: target not found: <span class="o">{</span> 此处用汝希望安装的软件包名称替换呗~ <span class="o">}</span></span>
</pre></div>
<p>这时咋办咧?就该AUR上场了呗~</p>
<div class="section" id="aur-arch-user-repository-arch">
<h2><a class="toc-backref" href="#id4">什么是AUR(Arch User Repository,Arch 用户软件仓库)?</a></h2>
<blockquote>
<p>Arch用户软件仓库(Arch User Repository,AUR)是为用户而建、由用户主导的Arch软件仓库。AUR中的软件包以软件包生成脚本(PKGBUILD)的形式提供,用户自己通过makepkg生成包,再由pacman安装。创建AUR的初衷是方便用户维护和分享新软件包,并由官方定期从中挑选软件包进入community仓库。</p>
<p>许多官方仓库软件包都来自AUR。通过AUR,大家相互分享新的软件包生成脚本(PKGBUILD和其他相关文件)。用户还可以为软件包投票。如果一个软件包投票足够多、没有协议问题、打包质量好,那么它就很有希望被收录进官方[community]仓库(以后就可以直接通过pacman …</p></blockquote></div>
<p><del>没玩过AUR好意思说自己是Arch Linux用户?</del></p>
<p>尽管Arch Linux官方软件仓库里的软件包够多了,连MediaWiki或者OwnCloud一类的用 <del>最好的编程语言</del> PHP写的应用都有对应的软件包啦~( <del>TU:反正闲着也没事干,打个包呗~</del> ), 但是汝是不是有时试图pacman的时候:</p>
<div class="highlight"><pre><span class="code-line"><span></span>error: target not found: <span class="o">{</span> 此处用汝希望安装的软件包名称替换呗~ <span class="o">}</span></span>
</pre></div>
<p>这时咋办咧?就该AUR上场了呗~</p>
<div class="section" id="aur-arch-user-repository-arch">
<h2><a class="toc-backref" href="#id4">什么是AUR(Arch User Repository,Arch 用户软件仓库)?</a></h2>
<blockquote>
<p>Arch用户软件仓库(Arch User Repository,AUR)是为用户而建、由用户主导的Arch软件仓库。AUR中的软件包以软件包生成脚本(PKGBUILD)的形式提供,用户自己通过makepkg生成包,再由pacman安装。创建AUR的初衷是方便用户维护和分享新软件包,并由官方定期从中挑选软件包进入community仓库。</p>
<p>许多官方仓库软件包都来自AUR。通过AUR,大家相互分享新的软件包生成脚本(PKGBUILD和其他相关文件)。用户还可以为软件包投票。如果一个软件包投票足够多、没有协议问题、打包质量好,那么它就很有希望被收录进官方[community]仓库(以后就可以直接通过pacman 或 abs 安装了)。</p>
<p class="attribution">—<a class="reference external" href="https://wiki.archlinux.org/index.php/Arch_User_Repository_%28%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87%29">ArchWiki:Arch User Repository</a></p>
</blockquote>
</div>
<div class="section" id="aur">
<h2><a class="toc-backref" href="#id5">安装AUR里的软件包前要做好哪些准备咧?</a></h2>
<p>其实只有一项,安装 <code class="code">
base-devel</code>
软件包组,内含编译软件包所需要的工具.</p>
<div class="highlight"><pre><span class="code-line"><span></span>sudo pacman -S base-devel</span>
</pre></div>
<p>对于汝个人而言,需要 <strong>会使用</strong> 终端和 <strong>看得懂bash脚本</strong> (因为PKGBUILD其实就是bash脚本啦~,为了安全起见建议在安装时检查PKGBUILD呗~)</p>
<p>下面是一句没啥用处的警告:</p>
<div class="tag warning fg-white compound">
<p class="compound-first">AUR packages are user produced content. Any use of the provided files is at your own risk.</p>
<p class="compound-last">AUR中的软件包是由用户上传的,使用即表示汝愿意风险自担呗~</p>
</div>
</div>
<div class="section" id="pkgbuild">
<h2><a class="toc-backref" href="#id6">第一步:寻找和获得软件包的PKGBUILD文件</a></h2>
<p>这里是AUR的网址呗~: <a class="reference external" href="https://aur.archlinux.org/">https://aur.archlinux.org/</a> 打开后大概像这样:</p>
<img alt="AUR 首页" class="materialboxed responsive-img" src="/images/aur_mainpage.png"/>
<p>可以在另一侧的"English"那里的下拉菜单里将AUR web 界面的语言修改成中文呗~</p>
<div class="tag info fg-white compound">
<p>建议先 <a class="alert-link reference external" href="https://aur.archlinux.org/register/">注册一个账户</a> ,
这样便可以使用更多功能呗~</p>
</div>
<p>然后在搜索框里输入需要的软件包的名称就可以搜索呗~</p>
<img alt="在AUR里搜索软件包" class="materialboxed responsive-img" src="/images/aur_search.png"/>
<p>点击对应软件包的名称就可以进入软件包的详细信息呗~</p>
<img alt="软件包的详细信息" class="materialboxed responsive-img" src="/images/aur_packageinfo.png"/>
<p>点击右侧的"Download snapshot"就可以下载到软件包的快照.(比如pypi-pip.tar.gz)
一般包含PKGBUILD,有些软件包中可能包含其它文件(例如Systemd 单元啥的)
可以用tar来解开它呗~</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># 如果汝不知道tar 怎么用的话,man一下呗~ (man tar)</span></span>
<span class="code-line">tar xzf pypi-pip.tar.gz</span>
</pre></div>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id7">安装软件包</a></h2>
<p>首先切换到软件包的目录,然后检查一下PKGBUILD:</p>
<!-- code-block::bash
# 用汝喜欢的编辑器替换$EDITOR呗~
$EDITOR PKGBUILD -->
<div class="tag warning fg-white compound">
<p>务必认真检查所有文件!
PKGBUILD和所有.install文件都是shell脚本文件,包含若干函数,由makepkg调用并执行。
这些函数可以调用任何命令,可能包含恶意或危险代码。
makepkg将通过fakeroot(意为“假root”)执行这些命令,能在一定程度防止恶意代码损坏系统,但还是小心为好。
如有疑问,可以到论坛或邮件列表询问。</p>
</div>
<p>在 <ruby><rb>仔细</rb><rp>(</rp><rt>几乎没有</rt><rp>)</rp></ruby> 检查完所有文件以后,运行makepkg来创建并安装软件包呗~</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># 下面的三个选项分别是</span></span>
<span class="code-line"><span class="c1"># (i) 在编译完成后安装,</span></span>
<span class="code-line"><span class="c1"># (s) 安装编译时需要的依赖关系,</span></span>
<span class="code-line"><span class="c1"># (r) 在安装完成后删除只在编译时需要的软件包</span></span>
<span class="code-line"><span class="c1"># 关于makepkg的更多帮助,可以查看手册页(man makepkg)</span></span>
<span class="code-line"><span class="c1"># 或者在ArchWiki上查阅呗~</span></span>
<span class="code-line">makepkg -rsi</span>
</pre></div>
<p>不过经常会出现这样的状况:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="o">==</span>> 正在创建软件包:pypy-pip <span class="m">8</span>.0.2-1 <span class="o">(</span>2016年 01月 30日 星期六 <span class="m">15</span>:18:38 CST<span class="o">)</span></span>
<span class="code-line"><span class="o">==</span>> 正在检查运行时依赖关系...</span>
<span class="code-line"><span class="o">==</span>> <span class="nv">正在检查编译时依赖关系</span></span>
<span class="code-line"><span class="o">==</span>> 正在安装缺少的依赖关系...</span>
<span class="code-line">错误:未找到目标:pypy-setuptools</span>
<span class="code-line">错误:未找到目标:pypy3-setuptools</span>
<span class="code-line"><span class="o">==</span>> 错误: <span class="s1">'pacman'</span> 无法安装缺少的依赖关系。</span>
</pre></div>
<p>这表示这个软件包依赖的某些包也在AUR里,汝只好先把它们装上呗~,或者用个AUR Helper(一会儿咱会介绍一个AUR Helper)</p>
<p>在安装完需要的依赖以后再运行下makepkg,大概像这样~:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="o">==</span>> 正在创建软件包:pypy-pip <span class="m">8</span>.0.2-1 <span class="o">(</span>2016年 01月 30日 星期六 <span class="m">15</span>:27:02 CST<span class="o">)</span></span>
<span class="code-line"><span class="o">==</span>> 正在检查运行时依赖关系...</span>
<span class="code-line"><span class="o">==</span>> <span class="nv">正在检查编译时依赖关系</span></span>
<span class="code-line"><span class="o">==</span>> 获取源代码......</span>
<span class="code-line"> -> 正在下载 pip-8.0.2.tar.gz...</span>
<span class="code-line"><span class="o">==</span>> 正在验证源代码文件 sha256sums...</span>
<span class="code-line"> pip-8.0.2.tar.gz ... <span class="nv">通过</span></span>
<span class="code-line"><span class="o">==</span>> 正在释放源码......</span>
<span class="code-line"> -> 正在解压缩 pip-8.0.2.tar.gz,使用 <span class="nv">bsdtar</span></span>
<span class="code-line"><span class="o">==</span>> 正在进入 fakeroot 环境...</span>
<span class="code-line"><span class="o">==</span>> 正在开始 package_pypy-pip<span class="o">()</span>...</span>
<span class="code-line"> <span class="c1"># 省掉编译的过程.....</span></span>
<span class="code-line"><span class="o">==</span>> 正在清理安装...</span>
<span class="code-line"> -> 正在清除不打算要的文件...</span>
<span class="code-line"> -> 正在删除 libtool 文件...</span>
<span class="code-line"> -> 正在移除静态库文件……</span>
<span class="code-line"> -> 正在压缩 man 及 info 文档...</span>
<span class="code-line"> -> 正在从二进制文件和库中清除不需要的系统符号...</span>
<span class="code-line"><span class="o">==</span>> 正在创建软件包<span class="s2">"pypy-pip"</span>......</span>
<span class="code-line"> -> 正在生成 .PKGINFO 文件...</span>
<span class="code-line"> -> 正在生成 .MTREE 文件......</span>
<span class="code-line"> -> 正在压缩软件包...</span>
<span class="code-line"><span class="o">==</span>> 正在离开 fakeroot 环境。</span>
<span class="code-line"><span class="o">==</span>> 完成创建:pypy-pip <span class="m">8</span>.0.2-1 <span class="o">(</span>2016年 01月 30日 星期六 <span class="m">15</span>:27:40 CST<span class="o">)</span></span>
<span class="code-line"><span class="o">==</span>> 正在安装 pypy-pip 软件包组,使用 pacman -U...</span>
</pre></div>
<p>如果汝有sudo的能力的话,接下来输入密码,然后像原来一样安装软件包呗~</p>
<p>是不是感觉自己处理依赖关系和一遍遍的makepkg已经让汝开始挠头了么,接着往下看.</p>
</div>
<div class="section" id="aur-helper">
<h2><a class="toc-backref" href="#id8">使用AUR helper简化安装过程</a></h2>
<div class="tag warning fg-white compound">
<p>Arch官方永远不会提供安装AUR(和其他不受支持)软件包的便利工具,<strong>AUR用户应当对软件编译有一定了解。</strong></p>
</div>
<p>然而官方不做并不代表没有😂😂,有一个叫做yaourt的工具在Archer间口口相传.yaourt就是一个AUR helper.</p>
<p><a class="reference external" href="https://aur.archlinux.org/packages/yaourt/">yaourt on AUR</a></p>
<p>先用上面的方法安装好yaourt,然后像用pacman一样运行yaourt就好(除了不要以root用户运行)</p>
<div class="highlight"><pre><span class="code-line"><span></span>yaourt -S foo</span>
</pre></div>
<p>yaourt会帮汝下载PKGBUILD,安装需要的依赖,运行makepkg等一系列操作哟~</p>
<div class="tag warning fg-white compound">
<p>2月1号Pacman更新到了5.0,和yaourt的兼容性还不明确……</p>
</div>
</div>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id9">登录到AUR以后可以进行的操作</a></h2>
<p>登录到AUR以后,软件包描述页面右侧的"软件包操作"的若干命令就可以使用了:</p>
<ul>
<li><p class="first">将这个包标记为过期</p>
<blockquote>
<p>如果汝发现上游更新了而AUR没更新的话,可以通过这样提醒维护者更新,长时间无人维护的软件包可能被删除.</p>
</blockquote>
</li>
<li><p class="first">为这个软件包投票</p>
<blockquote>
<p>觉得Ta好就给投一票呗~,票数多而且符合
<a class="reference external" href="https://wiki.archlinux.org/index.php/Arch_packaging_standards">Arch Linux 软件包规范</a>
的软件包可能会被TU收录到官方软件仓库诶~</p>
</blockquote>
</li>
<li><p class="first">当有新评论的时候提醒我</p>
<blockquote>
<p>评论可以用来回报软件包的问题或是改进建议等等,如果这个选项启用的话,当评论更新时汝就会收到通知呗~</p>
</blockquote>
</li>
<li><p class="first">提交请求</p>
<blockquote>
<p>可以提交像是合并,更名或是移除软件包的请求.</p>
</blockquote>
</li>
</ul>
<p>诶好像有些长了呐~,所以下一次咱再说如何创建软件包并提交到AUR上呗~</p>
</div>
Arch Linux 中文社区非官方生存手册2016-01-28T00:00:00+08:002016-11-22T00:00:00+08:00ホロtag:None,2016-01-28:/life/archlinux_cn_community_unoffical_newbie_guide.html
<p>汝要入坑Arch Linux了吗?那还不赶紧加入Arch Linux中文社区~</p>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id12">什么是Arch Linux?</a></h2>
<blockquote>
<p>Arch Linux 是一个针对 i686/x86-64 平台独立开发的 GNU/Linux 发行版,遵循轻量、简洁、优雅的开发原则,借灵活的架构应用于各种环境。Arch 安装后只提供最基本的系统,用户可以根据自己的需求来搭建不同的系统环境。官方并不提供图形化的配置工具,多数系统配置是通过修改文本文件来进行的。Arch 尽力提供最新稳定版本的软件。</p>
<p>Arch Linux 使用 Pacman 作为包管理器,它在提供了一个简单的包管理器同时,也提供了一个易用的包构建系统,使用户能够轻松地管理和定制官方提供的、用户自己制作的、甚至是来自第三方的各种软件包。仓库系统也能够让用户轻松的构建和维护自己的编译脚本、软件包和仓库,这样将有助于社区的成长和建设。</p>
<p>Arch Linux 的基本安装包由 [core] 软件库提供。此外 [extra], [community] 和 [testing] 软件库则提供了大量的的高品质软件以满足你的需求 …</p></blockquote></div>
<p>汝要入坑Arch Linux了吗?那还不赶紧加入Arch Linux中文社区~</p>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id12">什么是Arch Linux?</a></h2>
<blockquote>
<p>Arch Linux 是一个针对 i686/x86-64 平台独立开发的 GNU/Linux 发行版,遵循轻量、简洁、优雅的开发原则,借灵活的架构应用于各种环境。Arch 安装后只提供最基本的系统,用户可以根据自己的需求来搭建不同的系统环境。官方并不提供图形化的配置工具,多数系统配置是通过修改文本文件来进行的。Arch 尽力提供最新稳定版本的软件。</p>
<p>Arch Linux 使用 Pacman 作为包管理器,它在提供了一个简单的包管理器同时,也提供了一个易用的包构建系统,使用户能够轻松地管理和定制官方提供的、用户自己制作的、甚至是来自第三方的各种软件包。仓库系统也能够让用户轻松的构建和维护自己的编译脚本、软件包和仓库,这样将有助于社区的成长和建设。</p>
<p>Arch Linux 的基本安装包由 [core] 软件库提供。此外 [extra], [community] 和 [testing] 软件库则提供了大量的的高品质软件以满足你的需求。Arch Linux 同时也通过 Arch 用户软件仓库(AUR)提供了 [unsupported] 软件库,里面有大量的编译脚本,用户可以通过 <cite>makepkg</cite> 工具轻松地从源码中编译软件。</p>
<p>Arch Linux 采用“滚动升级”策略,这样可以实现“一次安装,永久更新”。升级到下一个“版本”的 Arch Linux 几乎不需要重新安装系统,只需一行命令,你就能轻松的享受到最新的 Arch Linux。</p>
<p>Arch Linux 努力和上游软件源码保持一致,只有使程序能够在 Arch Linux 正常编译运行的补丁才会被加入更新中。</p>
<p>总之, Arch Linux 是一个灵活、简洁的、满足有一定经验的 Linux® 用户的需求的发行版。它强大且易于管理的特性,使其成为可以完美胜任服务器和工作站的发行版。它可以变成任何你想要的样子。如果你也认为这是一个 GNU/Linux 发行版该做的,欢迎你来自由使用并参与其中,为社区做出贡献,欢迎来到 Arch Linux!</p>
<p class="attribution">—<a class="reference external" href="https://www.archlinuxcn.org/about/">Arch Linux 中文社区</a> ,翻译自 <a class="reference external" href="https://www.archlinux.org/about/">Archlinux.org</a> .</p>
</blockquote>
</div>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id13">先把Arch Linux装上先~</a></h2>
<p>ArchWiki的文档应该算比较详细的啦~</p>
<ul class="simple">
<li>第一次安装Arch Linux的新手建议看看 <a class="reference external" href="https://wiki.archlinux.org/index.php/Beginners'_guide_%28%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87%29">Beginners' guide</a></li>
<li>有经验的用户可以看看 <a class="reference external" href="https://wiki.archlinux.org/index.php/Installation_guide_%28%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87%29">Installation guide</a></li>
<li>想找交互式的安装程序? 可以试试 <a class="reference external" href="https://wiki.archlinux.org/index.php/Archboot">ArchBoot</a></li>
</ul>
</div>
<div class="section" id="id4">
<h2><a class="toc-backref" href="#id14">加入Arch Linux中文社区论坛呗~</a></h2>
<p>用Arch Linux时发现了些问题?英文水平不足担心发到 <a class="reference external" href="https://bbs.archlinux.org">官方论坛</a> 泥牛入海? 来中文论坛呗~</p>
<p>中文论坛在这~: <a class="reference external" href="https://bbs.archlinuxcn.org/">https://bbs.archlinuxcn.org/</a></p>
<p>和参加其他的论坛讨论一样,先读读 <a class="reference external" href="/links.html#phoenixlzx">phoenixlzx</a> 写的 <a class="reference external" href="https://bbs.archlinuxcn.org/viewtopic.php?id=1072">Arch Linux 中文社区 新手生存指南</a> , <a class="reference external" href="https://wiki.archlinux.org/index.php/Forum_etiquette_%28%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87%29">官方编写的论坛礼仪指南</a> 也可以作为参考呗~</p>
</div>
<div class="section" id="id8">
<h2><a class="toc-backref" href="#id15">加入中文社区的聊天频道呗~</a></h2>
<p>和论坛相比,中文社区聊天频道更 <ruby><rb>活跃</rb><rp>(</rp><rt>洪水</rt><rp>)</rp></ruby> 呗~</p>
<p>在多才多艺的百合仙子 <a class="reference external" href="/links.html#lilydjwg">lilydjwg</a> , <del>Tox传教士 quininer</del> (后来 toxsync 去了 #archlinux-cn-offtopic ) ,和 PhD <a class="reference external" href="/links.html#farseerfc">farseerfc</a> 的协力下,社区交流群实现了irc+Telegram+xmpp+Tox的多通道联通,撒花~</p>
<div class="section" id="irc">
<h3><a class="toc-backref" href="#id16">加入irc频道</a></h3>
<p>Web界面在这: <a class="reference external" href="//webchat.freenode.net/?channels=archlinux-cn">#archlinux-cn</a></p>
<p>如果汝使用irc客户端的话:</p>
<blockquote>
<p>irc服务器: <code class="code">
irc.freenode.net</code>
</p>
<p>端口: <code class="code">
7000</code>
(SSL) / <code class="code">
6667</code>
(Plain)</p>
</blockquote>
</div>
<div class="section" id="xmpp">
<h3><a class="toc-backref" href="#id17">通过XMPP加入</a></h3>
<p>使用XMPP帐号添加 <code class="code">
talk@archlinuxcn.org</code>
为好友即可加入。成功加入将收到欢迎信息。</p>
</div>
<div class="section" id="tox">
<h3><a class="toc-backref" href="#id18">通过Tox加入</a></h3>
<p>添加下面那个Tox ID为好友,然后按照它的提示操作呗~</p>
<blockquote>
34922396155AA49CE6845A2FE34A73208F6FCD
6190D981B1DBBC816326F26C6CDF3581F697E7</blockquote>
</div>
<div class="section" id="telegram">
<h3><a class="toc-backref" href="#id19">通过Telegram加入</a></h3>
<p>hmmm.....为保护群组不被外星人攻击,所以这里就不贴上链接啦~</p>
<p>汝可以通过其它方法加入,贴上汝在Telegram的用户名呗~(其它已经在群里的用户会帮汝拉进来......)</p>
<p><del>或者,在Telegram上添加@Jqs7Bot这个机器人,通过群组查询中的Linux分类找到#archlinux-cn(irc)的链接再加入呗~</del></p>
<p>(后来链接被撤销了)</p>
</div>
<div class="section" id="id9">
<h3><a class="toc-backref" href="#id20">群内的一般原则</a></h3>
<ul class="simple">
<li><del>要优雅,不要污~</del></li>
<li>(irc/xmpp/tox) 推荐一个由百合仙子帮忙的图床 <a class="reference external" href="https://img.vim-cn.com/">https://img.vim-cn.com/</a> 呗~</li>
<li>(Telegram) 发没压缩的图片和声音的话irc可是收不到的哟~</li>
</ul>
</div>
</div>
<div class="section" id="id10">
<h2><a class="toc-backref" href="#id21">如果汝的英语水平也不错的话......</a></h2>
<p>如果汝的英语水平不错的话,太棒啦~,社区正需要汝这样的人呐~</p>
<p>汝可以......</p>
<ul class="simple">
<li>帮助翻译ArchWiki,可以在 <a class="reference external" href="https://wiki.archlinux.org/index.php/ArchWiki_Translation_Team_%28%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87%29">ArchWiki上翻到相应页面呗~</a></li>
<li>创建软件包并提交到 <a class="reference external" href="https://wiki.archlinux.org/index.php/Arch_User_Repository">AUR(Arch Linux User Repository)</a> ,高质量的软件包可能会被TU(授信用户)收录到官方软件仓库呗~</li>
<li><a class="reference external" href="https://wiki.archlinux.org/index.php/Getting_involved">参与开发</a> , <del>然后成为下一个像felixonmars一样的领袖😂😂😂</del></li>
</ul>
</div>
Tox新手入门2016-01-21T00:00:00+08:002016-01-21T00:00:00+08:00ホロtag:None,2016-01-21:/tech_misc/tox_trainee_guide.html
<p>Tox,一种新型的聊天协议.如果汝关注安全和隐私,不妨来看看呗~</p>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id9">再说一遍Tox是啥?</a></h2>
<p>Tox是一种新型的通讯协议,它的目标是——提供一个无法监控的 Skype 替代品——彻底的加密,没有后门,无需中间服务器。</p>
<p>由于Tox就是一个协议框架,不同的开发者开发了不同的软件呗~</p>
<p><a class="reference external" href="https://wiki.tox.chat/clients">Tox 官方维护的wiki上可以找到不同平台可用的客户端列表呐</a></p>
<p>在下面的例子中咱会先拿 <a class="reference external" href="https://github.com/tux3/qTox">qtox</a> 来示范一下,汝可以从上面的列表中选择一个适合自己的客户端呗~</p>
<p>首先按照上游的指南装好客户端呗~</p>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id10">新建一个Tox个人资料</a></h2>
<p>运行qtox,会弹出这样的窗口:</p>
<img alt="qTox欢迎画面" class="materialboxed responsive-img" src="/images/qtox_welcome.png"/>
<p>因为咱已经有一个Tox Profile所以是这样啦,汝直接按"New Profile"就好:</p>
<img alt="qTox-新建个人资料" class="materialboxed responsive-img" src="/images/qtox_addprofile.png"/>
<p>在Username那挑个用户名,Password那输入个密码呗~</p>
<div class="tag info fg-white compound">
<p>如果用SSH远程访问做类比的话,汝的Profile就是私钥,密码就是私钥的保护口令呗~</p>
</div>
<div class="tag warning fg-white compound">
<p class="compound-first">汝输入的密码非常重要!</p>
<p class="compound-middle">1.挑一个好的密码,如果不怀好意的骇客同时得到了汝的密码和profile,就可以冒充汝发送消息了诶.</p>
<p class="compound-last">2,记住汝的密码!虽然安全性很重要,但是一旦汝忘了密码,基本上就无法恢复了呗~</p>
</div>
<p>确认完毕之后就会进入到qtox的主画面了呗~(旁边一圈是咱加上的注释,原谅咱不怎么会用GIMP......)</p>
<img alt="qTox_main" class="materialboxed responsive-img" src="/images/qtox_main.png"/>
</div>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id11">修改个人资料 …</a></h2></div>
<p>Tox,一种新型的聊天协议.如果汝关注安全和隐私,不妨来看看呗~</p>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id9">再说一遍Tox是啥?</a></h2>
<p>Tox是一种新型的通讯协议,它的目标是——提供一个无法监控的 Skype 替代品——彻底的加密,没有后门,无需中间服务器。</p>
<p>由于Tox就是一个协议框架,不同的开发者开发了不同的软件呗~</p>
<p><a class="reference external" href="https://wiki.tox.chat/clients">Tox 官方维护的wiki上可以找到不同平台可用的客户端列表呐</a></p>
<p>在下面的例子中咱会先拿 <a class="reference external" href="https://github.com/tux3/qTox">qtox</a> 来示范一下,汝可以从上面的列表中选择一个适合自己的客户端呗~</p>
<p>首先按照上游的指南装好客户端呗~</p>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id10">新建一个Tox个人资料</a></h2>
<p>运行qtox,会弹出这样的窗口:</p>
<img alt="qTox欢迎画面" class="materialboxed responsive-img" src="/images/qtox_welcome.png"/>
<p>因为咱已经有一个Tox Profile所以是这样啦,汝直接按"New Profile"就好:</p>
<img alt="qTox-新建个人资料" class="materialboxed responsive-img" src="/images/qtox_addprofile.png"/>
<p>在Username那挑个用户名,Password那输入个密码呗~</p>
<div class="tag info fg-white compound">
<p>如果用SSH远程访问做类比的话,汝的Profile就是私钥,密码就是私钥的保护口令呗~</p>
</div>
<div class="tag warning fg-white compound">
<p class="compound-first">汝输入的密码非常重要!</p>
<p class="compound-middle">1.挑一个好的密码,如果不怀好意的骇客同时得到了汝的密码和profile,就可以冒充汝发送消息了诶.</p>
<p class="compound-last">2,记住汝的密码!虽然安全性很重要,但是一旦汝忘了密码,基本上就无法恢复了呗~</p>
</div>
<p>确认完毕之后就会进入到qtox的主画面了呗~(旁边一圈是咱加上的注释,原谅咱不怎么会用GIMP......)</p>
<img alt="qTox_main" class="materialboxed responsive-img" src="/images/qtox_main.png"/>
</div>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id11">修改个人资料</a></h2>
<p>点击头像的区域就可以修改自己的个人资料了呗~</p>
<img alt="qTox_profile" class="materialboxed responsive-img" src="/images/qtox_profile.png"/>
<div class="tag info fg-white compound">
<p>就像界面介绍的那样,Name和Status是公开的信息,所以仔细考虑一下选择一个合适的呗~</p>
</div>
<p>不过问题来啦,木有好友咧?</p>
</div>
<div class="section" id="id4">
<h2><a class="toc-backref" href="#id12">添加好友</a></h2>
<p>要添加好友的话,先让汝的好友把Ta的Tox ID用其他的手段让汝知道呗~</p>
<blockquote>
<p>E1F1C7DEA73D8126A1DEE9EAE5B45E21FB17E75F2319B7823A346B8C427EB272C80A89B69B4E</p>
<p class="attribution">—Tox ID 是像这样的十六进制数呗~</p>
</blockquote>
<p>然后到添加好友的界面把Tox ID输入进去.必要的话,附上一段消息让Ta知道汝是谁呗~</p>
<img alt="qtox_addfriend" class="materialboxed responsive-img" src="/images/qtox_addfriend.png"/>
<p>一开始时汝的好友列表只会显示对方的Tox ID呐,像这样:</p>
<img alt="qtox_addfriend_Pending" class="materialboxed responsive-img" src="/images/qtox_addfriend2.png"/>
<p>当Ta同意汝的好友请求以后,汝的好友列表上就会显示Ta的Name和Status呗~</p>
<img alt="qtox_addfriend_success" class="materialboxed responsive-img" src="/images/qtox_addfriend3.png"/>
<p>然后像平常一样聊天呗~</p>
<div class="tag info fg-white compound">
<p>要想让其他人和汝成为好友的话,把汝自己的Tox ID告诉Ta,让Ta像这样添加汝为好友呗~</p>
</div>
</div>
<div class="section" id="id5">
<h2><a class="toc-backref" href="#id13">发起群聊</a></h2>
<p>Tox也是可以发起群聊的哟~首先创建一个(qtox里点击下方"创建群聊"按钮就可以了诶~)</p>
<img alt="qtox_groupchat" class="materialboxed responsive-img" src="/images/qtox_groupchat.png"/>
<p>汝也可以邀请好友加入群聊呗~(qtox中右键点击某个好友-邀请加入群聊-汝的群聊名称呗~)</p>
<p>只不过万一汝退出了tox,下次登录时是不会加入上次加入的群聊的,汝只好让好友再邀请汝一次呗~</p>
</div>
<div class="section" id="id6">
<h2><a class="toc-backref" href="#id14">导出Tox的配置文件</a></h2>
<p>必要时可以导出汝的配置文件,这样就可以在其他地方连接到汝的Tox用户了呗~</p>
<p>qtox的话,可以在Profiles页面通过"导出"选项导出汝的配置文件呗~</p>
</div>
<div class="section" id="id7">
<h2><a class="toc-backref" href="#id15">最后</a></h2>
<p>这些就是tox基本的用法啦~,对于其他的客户端的话,不妨去阅读对应的文档呗~</p>
<p>如果汝有意帮助开发Tox的话, <a class="reference external" href="https://wiki.tox.chat/users/contributing">来这看看呗~</a></p>
<p>哦,差点忘记啦,这是咱的Tox ID,大家可以试试看呗~</p>
<blockquote>
7BC803F7F9B8A7230EE181AB45CA909DE446D36A7BC3A275D5576439E0CF7546FF4E2C4665CC</blockquote>
</div>
新约伊兹的萌狼乡手札诞生全过程伪实录2016-01-18T09:35:00+08:002016-01-18T09:35:00+08:00ホロtag:None,2016-01-18:/pelican/new_yoitsu_birth_notes.html
<p>说好的下一期来啦~,新的"约伊兹的萌狼乡手札"是怎么样诞生呐~马上就告诉汝呗~</p>
<div class="section" id="pelican">
<h2><a class="toc-backref" href="#id5">安装Pelican然后进行初始设置</a></h2>
<p>在咱写这篇文章时, <a class="reference external" href="/links.html#farsserfc">farsserfc</a> 已经把Pelican打好包放进Arch Linux 官方软件仓库啦好棒~</p>
<p>Arch Linux用户可以这样安装:</p>
<div class="highlight"><pre><span class="code-line"><span></span>sudo pacman -S pelican</span>
</pre></div>
<p>其它操作系统可以通过pip安装:</p>
<div class="highlight"><pre><span class="code-line"><span></span>sudo pip install pelican</span>
</pre></div>
<p>接着运行设置程序建立一个工作文件夹:</p>
<div class="highlight"><pre><span class="code-line"><span></span>pelican-quickstart</span>
</pre></div>
<p>接着开始挖坑呗~,用 <a class="reference external" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> 或 <a class="reference external" href="http://wowubuntu.com/markdown/">Markdown</a> 开始写文章然后放到 <code class="code">
contents</code>
文件夹里,像这样:</p>
<p>(reStructuredText)</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="gh">这里是标题</span></span>
<span class="code-line"><span class="gh">===========================================</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="nc">:lang:</span> 这里填语言</span>
<span class="code-line"><span class="nc">:date:</span> 写文章的日期</span>
<span class="code-line"><span class="nc">:Category:</span> 分类</span>
<span class="code-line"></span>
<span class="code-line">这里是内容</span>
</pre></div>
<p>(Markdown)</p>
<div class="highlight"><pre><span class="code-line"><span></span>Title: 这里是标题</span>
<span class="code-line">date: 写文章的日期</span>
<span class="code-line">Category: 分类</span>
<span class="code-line"></span>
<span class="code-line">这里是内容 …</span></pre></div></div>
<p>说好的下一期来啦~,新的"约伊兹的萌狼乡手札"是怎么样诞生呐~马上就告诉汝呗~</p>
<div class="section" id="pelican">
<h2><a class="toc-backref" href="#id5">安装Pelican然后进行初始设置</a></h2>
<p>在咱写这篇文章时, <a class="reference external" href="/links.html#farsserfc">farsserfc</a> 已经把Pelican打好包放进Arch Linux 官方软件仓库啦好棒~</p>
<p>Arch Linux用户可以这样安装:</p>
<div class="highlight"><pre><span class="code-line"><span></span>sudo pacman -S pelican</span>
</pre></div>
<p>其它操作系统可以通过pip安装:</p>
<div class="highlight"><pre><span class="code-line"><span></span>sudo pip install pelican</span>
</pre></div>
<p>接着运行设置程序建立一个工作文件夹:</p>
<div class="highlight"><pre><span class="code-line"><span></span>pelican-quickstart</span>
</pre></div>
<p>接着开始挖坑呗~,用 <a class="reference external" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> 或 <a class="reference external" href="http://wowubuntu.com/markdown/">Markdown</a> 开始写文章然后放到 <code class="code">
contents</code>
文件夹里,像这样:</p>
<p>(reStructuredText)</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="gh">这里是标题</span></span>
<span class="code-line"><span class="gh">===========================================</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="nc">:lang:</span> 这里填语言</span>
<span class="code-line"><span class="nc">:date:</span> 写文章的日期</span>
<span class="code-line"><span class="nc">:Category:</span> 分类</span>
<span class="code-line"></span>
<span class="code-line">这里是内容</span>
</pre></div>
<p>(Markdown)</p>
<div class="highlight"><pre><span class="code-line"><span></span>Title: 这里是标题</span>
<span class="code-line">date: 写文章的日期</span>
<span class="code-line">Category: 分类</span>
<span class="code-line"></span>
<span class="code-line">这里是内容</span>
</pre></div>
<p>然后运行一个命令来测试</p>
<div class="highlight"><pre><span class="code-line"><span></span>make html <span class="c1"># 生成html</span></span>
<span class="code-line">make serve <span class="c1"># 在127.0.0.1:8000 运行一个测试服务器.</span></span>
</pre></div>
<p>然后打开浏览器输入 <code class="code">
localhost:8000</code>
,你就能看到一个初生的很 <ruby><rb>简洁</rb><rp>(</rp><rt>难看</rt><rp>)</rp></ruby> 的博客了,不过不要担心,它是只丑小鸭,很快就会像天鹅般美丽(真的么?)。</p>
</div>
<div class="section" id="ruby-rb-rb-rp-rp-rt-rt-rp-rp-ruby-pelican">
<h2><a class="toc-backref" href="#id6"><ruby><rb>修改</rb><rp>(</rp><rt>调教</rt><rp>)</rp></ruby> Pelican的主题</a></h2>
<p>可能是一时抽风没找到合适的Material Design风格的框架,<del>于是走上了Metro UI CSS的不归路......</del></p>
<p>Metro UI CSS的项目主页在这里 <a class="reference external" href="http://metroui.org.ua">http://metroui.org.ua</a></p>
<p>咱拿了pelican内置的simple主题做起步,把Metro UI CSS文件夹里的 <code class="code">
/css</code>
和 <code class="code">
/js</code>
复制到主题的 <code class="code">
/statics</code>
文件夹里.</p>
<p>现在的文件夹结构大概像这样:</p>
<pre><span class="code-line"></span>
<span class="code-line"><span style="color:blue;font-weight:bold;">.</span></span>
<span class="code-line">├── <span style="color:blue;font-weight:bold;">cache</span> 生成頁面的 pickle 緩存</span>
<span class="code-line">├── <span style="color:blue;font-weight:bold;">content</span> 讀取的全部內容</span>
<span class="code-line">│ ├── <span style="color:blue;font-weight:bold;"><categories></span> 按分類存放的文章</span>
<span class="code-line">│ ├── <span style="color:blue;font-weight:bold;">pages</span> 像 About 這樣的固定頁面</span>
<span class="code-line">│ └── <span style="color:blue;font-weight:bold;">static</span> 文章內用到的靜態內容</span>
<span class="code-line">├── <span style="color:blue;font-weight:bold;">drafts</span> 文章的草稿箱</span>
<span class="code-line">├── <span style="color:green;font-weight:bold;">Makefile</span> 生成用的 makefile</span>
<span class="code-line">├── <span style="color:green;font-weight:bold;">pelicanconf.py</span> 測試時用的快速 Pelican 配置</span>
<span class="code-line">├── <span style="color:green;font-weight:bold;">publishconf.py</span> 部署時用的耗時 Pelican 配置</span>
<span class="code-line">├── <span style="color:teal;font-weight:bold;">output</span> -> <span style="color:blue;font-weight:bold;">../kenookamihoro.github.io</span></span>
<span class="code-line">├── <span style="color:teal;font-weight:bold;">plugins</span> -> <span style="color:blue;font-weight:bold;">../plugins</span></span>
<span class="code-line">└── <span style="color:teal;font-weight:bold;">theme</span> -> <span style="color:blue;font-weight:bold;">../yoitsu</span></span>
</pre><p>然后这个内容 repo 中的三个符号链接分别指向三个子 repo(为啥没用 <code class="code">
git submodule</code>
? 因为咱技术不精还不会用......)。
theme 指向 <a class="reference external" href="https://github.com/KenOokamiHoro/yoitsu">yoitsu</a> ,是咱修改过的 pelican 主题啦。
plugins 指向 <a class="reference external" href="https://github.com/getpelican/pelican-plugins">pelican-plugins</a>
最后 output 指向 <a class="reference external" href="https://github.com/KenOokamiHoro/kenookamihoro.github.io">kenookamihoro.github.io</a> 也就是发布的静态网站啦。</p>
<p>而主题文件夹的结构大概像这样:</p>
<pre><span class="code-line"></span>
<span class="code-line"><span style="color:blue;font-weight:bold;">.</span></span>
<span class="code-line">├── <span style="color:blue;font-weight:bold;">static</span> 主题中用到的静态文件,例如js和css</span>
<span class="code-line">├── <span style="color:blue;font-weight:bold;">templates</span> 供jinja使用的模板页面</span>
<span class="code-line">│ ├── <span style="color:blue;font-weight:bold;">archives.html</span> 文章归档</span>
<span class="code-line">│ ├── <span style="color:blue;font-weight:bold;">article.html</span> 每个文章</span>
<span class="code-line">│ ├── <span style="color:blue;font-weight:bold;">author.html</span> 作者</span>
<span class="code-line">│ ├── <span style="color:blue;font-weight:bold;">base.html</span> 所有模板的基础</span>
<span class="code-line">│ ├── <span style="color:blue;font-weight:bold;">category.html</span> 分类</span>
<span class="code-line">│ ├── <span style="color:blue;font-weight:bold;">index.html</span> 首页</span>
<span class="code-line">│ ├── <span style="color:blue;font-weight:bold;">page.html</span> 每个页面</span>
<span class="code-line">│ ├── <span style="color:blue;font-weight:bold;">pageination.html</span> 分页</span>
<span class="code-line">│ ├── <span style="color:blue;font-weight:bold;">search.html</span> 搜索</span>
<span class="code-line">│ └── <span style="color:blue;font-weight:bold;">tag.html</span> 标签</span>
<span class="code-line">└──</span>
<span class="code-line"></span>
</pre><p>然后记得修改pelican.conf告诉Pelican那些页面是模板那些页面是直接生成的呐~</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># DIRECT_TEMPLATES 告诉Pelican哪些页面是直接用来生成特定页面的......</span></span>
<span class="code-line"><span class="n">DIRECT_TEMPLATES</span> <span class="o">=</span> <span class="p">((</span><span class="s1">'index'</span><span class="p">,</span> <span class="s1">'archives'</span><span class="p">,</span> <span class="s1">'search'</span><span class="p">))</span></span>
</pre></div>
<p>接下来开始调教主题呗~,直接给出官方的教程呗~ <a class="reference external" href="http://docs.getpelican.com/en/3.6.3/themes.html">Pelican doc:Creating Themes</a></p>
<p>经过一番 <ruby><rb>仔细</rb><rp>(</rp><rt>无脑</rt><rp>)</rp></ruby> 调教以后,就成了汝等现在看到的样子了呐~</p>
<p>PS:咱自己做的这套主题还木有到能拿来复用的程度(原因主要是咱有很多是直接写死在主题里的设置),所以这又是一个坑呗~</p>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id7">装插件</a></h2>
<p>作为一套博客系统,Pelican自然有很多的插件可以安装呐~,不信的话去看看`pelican-plugins里有多少插件呗~ <<a class="reference external" href="https://github.com/getpelican/pelican-plugins">https://github.com/getpelican/pelican-plugins</a>>`_</p>
<p>咱启用的插件有这些:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="n">PLUGINS</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"better_codeblock_line_numbering"</span><span class="p">,</span></span>
<span class="code-line"> <span class="s1">'tipue_search'</span><span class="p">,</span></span>
<span class="code-line"> <span class="s1">'neighbors'</span><span class="p">,</span></span>
<span class="code-line"> <span class="s1">'series'</span><span class="p">,</span></span>
<span class="code-line"> <span class="s2">"render_math"</span><span class="p">,</span></span>
<span class="code-line"> <span class="s1">'extract_toc'</span><span class="p">,</span></span>
<span class="code-line"> <span class="s1">'tag_cloud'</span><span class="p">,</span></span>
<span class="code-line"> <span class="s1">'sitemap'</span><span class="p">,</span></span>
<span class="code-line"> <span class="s1">'summary'</span><span class="p">,</span></span>
<span class="code-line"> <span class="s1">'bootstrapify'</span><span class="p">,</span></span>
<span class="code-line"> <span class="s1">'twitter_bootstrap_rst_directives'</span><span class="p">]</span></span>
</pre></div>
<p>具体的设置流程嘛,请允许咱引用一下 <a class="reference external" href="http://farseerfc.me/redesign-pelican-theme.html#pelican-restructuredtext">farseerfc.me:重新設計了 Pelican 的主題與插件</a> 呗~</p>
</div>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id8">实现动态格言</a></h2>
<p>动态格言的实现来自 <a class="reference external" href="/links.html#fiveyellowmice">fiveyellowmice</a> 啦~(咱不是JavaScript专家呐~,就不谈具体的实现了呗~)</p>
<p>首先是一段修改某一个元素的类的JavaScript(当然还需要 <a class="reference external" href="http://julian.com/research/velocity/">velocity</a> ):</p>
<div class="highlight"><pre><span class="code-line"><span></span> <span class="p"><</span><span class="nt">script</span> <span class="na">src</span><span class="o">=</span><span class="s">"/theme/js/velocity.min.js"</span><span class="p">></</span><span class="nt">script</span><span class="p">></span></span>
<span class="code-line"></span>
<span class="code-line"> <span class="p"><</span><span class="nt">script</span><span class="p">></span></span>
<span class="code-line"> <span class="nb">document</span><span class="p">.</span><span class="nx">addEventListener</span><span class="p">(</span><span class="s2">"DOMContentLoaded"</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span></span>
<span class="code-line"> <span class="nx">$</span><span class="p">(</span><span class="s2">".menu-button"</span><span class="p">).</span><span class="nx">on</span><span class="p">(</span><span class="s2">"touchstart"</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span></span>
<span class="code-line"> <span class="nx">$</span><span class="p">(</span><span class="s2">".menu-wrapper"</span><span class="p">).</span><span class="nx">removeClass</span><span class="p">(</span><span class="s2">"trigger"</span><span class="p">);</span></span>
<span class="code-line"> <span class="k">if</span> <span class="p">(</span> <span class="nx">$</span><span class="p">(</span><span class="s2">".nav-items"</span><span class="p">).</span><span class="nx">is</span><span class="p">(</span><span class="s2">":visible"</span><span class="p">)</span> <span class="p">)</span> <span class="p">{</span></span>
<span class="code-line"> <span class="nx">$</span><span class="p">(</span><span class="s2">".nav-items"</span><span class="p">).</span><span class="nx">velocity</span><span class="p">(</span><span class="s2">"finish"</span><span class="p">)</span></span>
<span class="code-line"> <span class="p">.</span><span class="nx">velocity</span><span class="p">(</span><span class="s2">"slideUp"</span><span class="p">,</span> <span class="p">{</span> <span class="nx">delay</span><span class="o">:</span> <span class="mi">200</span><span class="p">,</span> <span class="nx">duration</span><span class="o">:</span> <span class="mi">400</span><span class="p">,</span> <span class="nx">easing</span><span class="o">:</span> <span class="s2">"easeInQuad"</span> <span class="p">})</span></span>
<span class="code-line"> <span class="p">.</span><span class="nx">velocity</span><span class="p">(</span><span class="s2">"fadeOut"</span><span class="p">,</span> <span class="p">{</span> <span class="nx">delay</span><span class="o">:</span> <span class="mi">200</span><span class="p">,</span> <span class="nx">duration</span><span class="o">:</span> <span class="mi">400</span><span class="p">,</span> <span class="nx">easing</span><span class="o">:</span> <span class="s2">"easeInQuad"</span><span class="p">,</span> <span class="nx">queue</span><span class="o">:</span> <span class="kc">false</span> <span class="p">});</span></span>
<span class="code-line"> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span></span>
<span class="code-line"> <span class="nx">$</span><span class="p">(</span><span class="s2">".nav-items"</span><span class="p">).</span><span class="nx">velocity</span><span class="p">(</span><span class="s2">"finish"</span><span class="p">)</span></span>
<span class="code-line"> <span class="p">.</span><span class="nx">velocity</span><span class="p">(</span><span class="s2">"slideDown"</span><span class="p">,</span> <span class="p">{</span> <span class="nx">delay</span><span class="o">:</span> <span class="mi">200</span><span class="p">,</span> <span class="nx">duration</span><span class="o">:</span> <span class="mi">400</span><span class="p">,</span> <span class="nx">easing</span><span class="o">:</span> <span class="s2">"easeOutQuad"</span> <span class="p">})</span></span>
<span class="code-line"> <span class="p">.</span><span class="nx">velocity</span><span class="p">(</span><span class="s2">"fadeIn"</span><span class="p">,</span> <span class="p">{</span> <span class="nx">delay</span><span class="o">:</span> <span class="mi">200</span><span class="p">,</span> <span class="nx">duration</span><span class="o">:</span> <span class="mi">400</span><span class="p">,</span> <span class="nx">easing</span><span class="o">:</span> <span class="s2">"easeOutQuad"</span><span class="p">,</span> <span class="nx">queue</span><span class="o">:</span> <span class="kc">false</span> <span class="p">});</span></span>
<span class="code-line"> <span class="p">}</span></span>
<span class="code-line"> <span class="p">});</span></span>
<span class="code-line"> <span class="p">});</span></span>
<span class="code-line"><span class="p"></</span><span class="nt">script</span><span class="p">></span></span>
</pre></div>
<p>然后新建一个 Github gist 填上动态格言,像这样(大括号里的内容可以添加多个):</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="p">[</span></span>
<span class="code-line"> <span class="p">{</span></span>
<span class="code-line"> <span class="nt">"content"</span><span class="p">:</span><span class="s2">"example"</span><span class="p">,</span></span>
<span class="code-line"> <span class="nt">"author"</span><span class="p">:</span><span class="s2">"someone"</span></span>
<span class="code-line"> <span class="p">},</span></span>
<span class="code-line"><span class="p">]</span></span>
</pre></div>
<p>再写个JavaScript来从JSON中提取格言然后填到html里:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="p"><</span><span class="nt">script</span><span class="p">></span></span>
<span class="code-line"> <span class="nb">document</span><span class="p">.</span><span class="nx">addEventListener</span><span class="p">(</span><span class="s2">"DOMContentLoaded"</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span></span>
<span class="code-line"> <span class="nx">$</span><span class="p">(</span><span class="s2">".site-description"</span><span class="p">).</span><span class="nx">after</span><span class="p">(</span><span class="nx">$</span><span class="p">(</span><span class="s2">"<blockquote>"</span><span class="p">).</span><span class="nx">attr</span><span class="p">(</span><span class="s2">"id"</span><span class="p">,</span> <span class="s2">"fortune"</span><span class="p">).</span><span class="nx">css</span><span class="p">(</span><span class="s2">"display"</span><span class="p">,</span> <span class="s2">"none"</span><span class="p">));</span></span>
<span class="code-line"> <span class="nx">$</span><span class="p">(</span><span class="s2">".site-description"</span><span class="p">).</span><span class="nx">after</span><span class="p">(</span><span class="nx">$</span><span class="p">(</span><span class="s2">"<blockquote>"</span><span class="p">).</span><span class="nx">attr</span><span class="p">(</span><span class="s2">"id"</span><span class="p">,</span> <span class="s2">"fortune"</span><span class="p">).</span><span class="nx">css</span><span class="p">(</span><span class="s2">"line-height"</span><span class="p">,</span> <span class="s2">"1.4rem"</span><span class="p">));</span></span>
<span class="code-line"></span>
<span class="code-line"> <span class="nx">$</span><span class="p">.</span><span class="nx">getJSON</span><span class="p">(</span> <span class="s2">"https://api.github.com/gists/07ca2edea6e507bf40f5"</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">data</span><span class="p">)</span> <span class="p">{</span></span>
<span class="code-line"></span>
<span class="code-line"> <span class="nx">fortunes</span> <span class="o">=</span> <span class="nx">JSON</span><span class="p">.</span><span class="nx">parse</span><span class="p">(</span><span class="nx">data</span><span class="p">.</span><span class="nx">files</span><span class="p">[</span><span class="s2">"quotes.json"</span><span class="p">].</span><span class="nx">content</span><span class="p">);</span></span>
<span class="code-line"> <span class="nx">randomFortune</span> <span class="o">=</span> <span class="nx">fortunes</span><span class="p">[</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">floor</span><span class="p">(</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">random</span><span class="p">()</span> <span class="o">*</span> <span class="nx">fortunes</span><span class="p">.</span><span class="nx">length</span> <span class="p">)</span> <span class="p">];</span></span>
<span class="code-line"> <span class="k">if</span> <span class="p">(</span> <span class="nx">randomFortune</span><span class="p">.</span><span class="nx">author</span> <span class="o">===</span> <span class="kc">undefined</span> <span class="p">)</span> <span class="p">{</span></span>
<span class="code-line"> <span class="nx">$</span><span class="p">(</span><span class="s2">"#fortune"</span><span class="p">).</span><span class="nx">html</span><span class="p">(</span> <span class="s2">"<p>"</span><span class="o">+</span><span class="nx">randomFortune</span><span class="p">.</span><span class="nx">content</span><span class="o">+</span><span class="s2">"</p>"</span> <span class="p">);</span></span>
<span class="code-line"> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span></span>
<span class="code-line"> <span class="nx">$</span><span class="p">(</span><span class="s2">"#fortune"</span><span class="p">).</span><span class="nx">html</span><span class="p">(</span> <span class="s2">"<p>"</span><span class="o">+</span><span class="nx">randomFortune</span><span class="p">.</span><span class="nx">content</span><span class="o">+</span><span class="s2">"</p>"</span> <span class="o">+</span> <span class="s2">"<small>"</span> <span class="o">+</span> <span class="nx">randomFortune</span><span class="p">.</span><span class="nx">author</span> <span class="o">+</span> <span class="s2">"</small>"</span><span class="p">);</span></span>
<span class="code-line"> <span class="p">}</span></span>
<span class="code-line"></span>
<span class="code-line"> <span class="nx">$</span><span class="p">(</span><span class="s2">"#fortune"</span><span class="p">).</span><span class="nx">velocity</span><span class="p">(</span><span class="s2">"slideDown"</span><span class="p">,</span> <span class="p">{</span> <span class="nx">duration</span><span class="o">:</span> <span class="mi">400</span><span class="p">,</span> <span class="nx">easing</span><span class="o">:</span> <span class="s2">"easeOutQuad"</span> <span class="p">});</span></span>
<span class="code-line"> <span class="p">});</span></span>
<span class="code-line"> <span class="p">});</span></span>
<span class="code-line"> <span class="p"></</span><span class="nt">script</span><span class="p">></span></span>
</pre></div>
<p>最后的效果汝也应该看到了呗~</p>
</div>
<div class="section" id="id4">
<h2><a class="toc-backref" href="#id9">发布</a></h2>
<p>通过几条命令可以发布~</p>
<div class="highlight"><pre><span class="code-line"><span></span>make publish</span>
</pre></div>
<p>然后用git提交到Github就好......</p>
<p>好吧这就是咱的全过程啦(雾)</p>
</div>
为MediaWiki安装可视化编辑器2016-01-17T09:35:00+08:002016-08-10T00:00:00+08:00ホロtag:None,2016-01-17:/mediawiki/visualeditor_for_mediawiki.html
<p>为MediaWiki安装来自 <a class="reference external" href="https://www.mediawiki.org/wiki/VisualEditor">维基媒体基金会</a> 的 <a class="reference external" href="https://www.mediawiki.org/wiki/VisualEditor">可视化编辑器</a> .</p>
<div class="section" id="hold">
<h2><a class="toc-backref" href="#id10">连维基百科都要Hold不住啦~</a></h2>
<blockquote>
<p>许多新用户不会着手大幅度修改,而只是做些细节调整,不过仅仅阅读源代码就必须学标记语言了。当我们的用户在演示操作时,这把他们吓走了。</p>
<p>早在 2004 年,社群开始一再认识到必须采用更好的编辑方式。因为人们的请求,更重要的是他们的需要,所以我们开发了可视化编辑器。</p>
<p>Wiki 标记语言让新人害怕,这种程度会随着其他站点的迁离而加剧。如果我们不开发可视化编辑器,那么图表的走势会在接下来五年中变得更加糟糕。</p>
<p class="attribution">—<a class="reference external" href="https://www.mediawiki.org/wiki/VisualEditor/Portal/Why/zh">MediaWiki.org</a></p>
</blockquote>
<p>所以他们才 <del>痛定思痛</del> 决定开发可视化编辑器么😂</p>
</div>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id11">开始之前-检查一下要求</a></h2>
<p>可视化编辑器(下面就说VisualEditor呗~)还需要一个叫
<a class="reference external" href="https://www.mediawiki.org/wiki/VisualEditor/Portal/Why/zh">Parsoid</a>
的程序来承担把wiki标记转化成html的任务啦(看下图)~,所以需要服务器来运行它呐~</p>
<img alt="Parsoid的工作原理" class="materialboxed responsive-img" src="/images/Parsoid_HTML-RDFa_content_model.svg.png"/>
</div>
<div class="section" id="parsoid-ubuntu-14-debian-7">
<h2><a class="toc-backref" href="#id12">安装Parsoid(Ubuntu 14+ / Debian 7+ )</a></h2>
<p>上游的指南在这(好好学英语呗~) <a class="reference external" href="https://www.mediawiki.org/wiki/Parsoid/Setup">https://www.mediawiki.org/wiki/Parsoid/Setup</a></p>
<p>Ubuntu和Debian系统的话直接添加MediaWiki …</p></div>
<p>为MediaWiki安装来自 <a class="reference external" href="https://www.mediawiki.org/wiki/VisualEditor">维基媒体基金会</a> 的 <a class="reference external" href="https://www.mediawiki.org/wiki/VisualEditor">可视化编辑器</a> .</p>
<div class="section" id="hold">
<h2><a class="toc-backref" href="#id10">连维基百科都要Hold不住啦~</a></h2>
<blockquote>
<p>许多新用户不会着手大幅度修改,而只是做些细节调整,不过仅仅阅读源代码就必须学标记语言了。当我们的用户在演示操作时,这把他们吓走了。</p>
<p>早在 2004 年,社群开始一再认识到必须采用更好的编辑方式。因为人们的请求,更重要的是他们的需要,所以我们开发了可视化编辑器。</p>
<p>Wiki 标记语言让新人害怕,这种程度会随着其他站点的迁离而加剧。如果我们不开发可视化编辑器,那么图表的走势会在接下来五年中变得更加糟糕。</p>
<p class="attribution">—<a class="reference external" href="https://www.mediawiki.org/wiki/VisualEditor/Portal/Why/zh">MediaWiki.org</a></p>
</blockquote>
<p>所以他们才 <del>痛定思痛</del> 决定开发可视化编辑器么😂</p>
</div>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id11">开始之前-检查一下要求</a></h2>
<p>可视化编辑器(下面就说VisualEditor呗~)还需要一个叫
<a class="reference external" href="https://www.mediawiki.org/wiki/VisualEditor/Portal/Why/zh">Parsoid</a>
的程序来承担把wiki标记转化成html的任务啦(看下图)~,所以需要服务器来运行它呐~</p>
<img alt="Parsoid的工作原理" class="materialboxed responsive-img" src="/images/Parsoid_HTML-RDFa_content_model.svg.png"/>
</div>
<div class="section" id="parsoid-ubuntu-14-debian-7">
<h2><a class="toc-backref" href="#id12">安装Parsoid(Ubuntu 14+ / Debian 7+ )</a></h2>
<p>上游的指南在这(好好学英语呗~) <a class="reference external" href="https://www.mediawiki.org/wiki/Parsoid/Setup">https://www.mediawiki.org/wiki/Parsoid/Setup</a></p>
<p>Ubuntu和Debian系统的话直接添加MediaWiki.org的软件源然后通过apt安装就好了啦~</p>
<p>首先添加MediaWiki.org的GPG公钥:</p>
<div class="highlight"><pre><span class="code-line"><span></span>sudo apt-key advanced --keyserver keys.gnupg.net --recv-keys 664C383A3566A3481B942F007A322AC6E84AFDD2</span>
</pre></div>
<p>然后添加Parsoid源:</p>
<div class="highlight"><pre><span class="code-line"><span></span>sudo <span class="nb">echo</span> <span class="s2">"deb https://releases.wikimedia.org/debian jessie-mediawiki main"</span> > /etc/apt/sources.list.d/parsoid.list</span>
</pre></div>
<p>安装需要的软件包:</p>
<div class="highlight"><pre><span class="code-line"><span></span>sudo apt-get update <span class="o">&&</span> sudo apt-get install curl parsoid</span>
</pre></div>
<p>然后看下下面一节的内容修改一下配置文件呗~</p>
</div>
<div class="section" id="id4">
<h2><a class="toc-backref" href="#id13">其它系统?手动安装呗~</a></h2>
<p>上游的指南在这(还是要好好学英语呗~) <a class="reference external" href="https://www.mediawiki.org/wiki/Parsoid/Developer_Setup">https://www.mediawiki.org/wiki/Parsoid/Developer_Setup</a></p>
<p>首先汝要装上Nodejs(>0.8,建议0.10或更新的版本呐~),还有git.
具体的安装方法为了避免降低正交性 <del>(其实是系统太多不好写......)</del>,就麻烦汝自己去找了呐~</p>
<blockquote>
「呵。咱是贤狼,不是神呐。如果汝开始会期待起咱能够泄露天机给汝,那咱就得从汝眼前消失了呗。」</blockquote>
<div class="highlight"><pre><span class="code-line"><span></span>node --version <span class="c1"># 如果是Debian或Ubuntu ,输入 nodejs --version</span></span>
</pre></div>
<p>然后用git克隆版本库呗~</p>
<div class="highlight"><pre><span class="code-line"><span></span>git clone https://gerrit.wikimedia.org/r/p/mediawiki/services/parsoid</span>
</pre></div>
<p>用npm安装上相应的依赖:</p>
<div class="highlight"><pre><span class="code-line"><span></span>npm install</span>
</pre></div>
<p>然后看下面一节的内容修改一下配置文件呗~</p>
</div>
<div class="section" id="id5">
<h2><a class="toc-backref" href="#id14">修改配置文件</a></h2>
<blockquote>
<p>如果是通过软件源安装的,配置文件位于 <code class="code">
/etc/mediawiki/parsoid/config.yaml</code>
</p>
<p>如果是通过git下载的,从parsoid目录中先复制一份样例出来呗~</p>
<div class="highlight"><pre><span class="code-line"><span></span>cp config.example.yaml config.yaml</span>
</pre></div>
</blockquote>
<p>打开配置文件,找到这一段内容,然后改它~:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="nt">mwApis</span><span class="p">:</span></span>
<span class="code-line"> <span class="p p-Indicator">-</span> <span class="c1"># This is the only required parameter,</span></span>
<span class="code-line"> <span class="c1"># the URL of you MediaWiki API endpoint.</span></span>
<span class="code-line"> <span class="nt">uri</span><span class="p">:</span> <span class="s">'http://localhost/w/api.php'</span></span>
<span class="code-line"> <span class="c1"># The "domain" is used for communication with Visual Editor</span></span>
<span class="code-line"> <span class="c1"># and RESTBase. It defaults to the hostname portion of</span></span>
<span class="code-line"> <span class="c1"># the `uri` property below, but you can manually set it</span></span>
<span class="code-line"> <span class="c1"># to an arbitrary string.</span></span>
<span class="code-line"> <span class="nt">domain</span><span class="p">:</span> <span class="s">'localhost'</span> <span class="c1"># optional</span></span>
</pre></div>
<p>其中"uri"对应汝的wiki的api.php的位置,"domain"是汝的域名啦~. <del>"prefix"可以自己起一个(反正因为换了API也没用啦~,不过测试时可能用得到)</del> Prefix 真的没了……</p>
</div>
<div class="section" id="id6">
<h2><a class="toc-backref" href="#id15">启动服务</a></h2>
<div class="section" id="id7">
<h3><a class="toc-backref" href="#id16">从软件源安装的?</a></h3>
<div class="highlight"><pre><span class="code-line"><span></span>sudo systemctl start parsoid <span class="c1"># Debian Jessie ,用Systemd启动</span></span>
<span class="code-line"></span>
<span class="code-line">sudo service parsoid start <span class="c1"># Debian Wheezy 或Ubuntu ,用init.d脚本启动.</span></span>
</pre></div>
<p>如果汝不是通过远程访问执行的命令,可以在浏览器上打开 <code class="code">
http://localhost:8142</code>
来进行测试.试着加载 <code class="code">
http://localhost:8142/汝设置的前缀/汝的wiki上的一个页面</code>
试试呗~</p>
</div>
<div class="section" id="git">
<h3><a class="toc-backref" href="#id17">用git安装的?</a></h3>
<div class="highlight"><pre><span class="code-line"><span></span>npm start</span>
</pre></div>
<p>或者:</p>
<div class="highlight"><pre><span class="code-line"><span></span>node bin/server.js</span>
</pre></div>
<p>可以用screen一类的工具让Parsoid在后台运行~</p>
<p>或者可以自己写一个 Systemd 单元 (听说这样更清真?</p>
<p>咱自己写了一个在这: <a class="reference external" href="https://gist.github.com/KenOokamiHoro/44d6e1b20f5bad4a0f56e9e225d2049a">https://gist.github.com/KenOokamiHoro/44d6e1b20f5bad4a0f56e9e225d2049a</a></p>
<p>如果汝不是通过远程访问执行的命令,可以在浏览器上打开 <code class="code">
http://localhost:8000</code>
来进行测试.试着加载 <code class="code">
http://localhost:8000/汝设置的前缀/汝的wiki上的一个页面</code>
试试呗~</p>
</div>
<div class="section" id="id8">
<h3><a class="toc-backref" href="#id18">修改监听地址便于远程测试</a></h3>
<p>改这一段:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="c1"># Allow override of port/interface:</span></span>
<span class="code-line"><span class="c1">#serverPort: 8000</span></span>
<span class="code-line"><span class="c1">#serverInterface: '127.0.0.1'</span></span>
</pre></div>
<p>反注释最后一行并改成0.0.0.0,就可以通过 <code class="code">
http://服务器的IP地址:8000</code>
访问啦~</p>
</div>
</div>
<div class="section" id="visualeditor">
<h2><a class="toc-backref" href="#id19">安装VisualEditor扩展</a></h2>
<p>上游的指南在这: <a class="reference external" href="https://www.mediawiki.org/wiki/Extension:VisualEditor">https://www.mediawiki.org/wiki/Extension:VisualEditor</a></p>
<p>首先从 <a class="reference external" href="https://www.mediawiki.org/wiki/Special:ExtensionDistributor/VisualEditor">这里</a> 获得扩展然后上传到汝的wiki上的extensions目录呗~</p>
<p>然后修改汝的LocalSettings.php:</p>
<div class="highlight"><pre><span class="code-line"><span></span>require_once "$IP/extensions/VisualEditor/VisualEditor.php";</span>
<span class="code-line"></span>
<span class="code-line">// 反注释下一行来默认启用可视化编辑器</span>
<span class="code-line">#$wgDefaultUserOptions['visualeditor-enable'] = 1;</span>
<span class="code-line"></span>
<span class="code-line">// 反注释下一行来启用测试中的功能</span>
<span class="code-line">#$wgDefaultUserOptions['visualeditor-enable-experimental'] = 1;</span>
<span class="code-line"></span>
<span class="code-line">//在除了主名字空间以外的名字空间中也启用可视化编辑器(下面的例子是用户名字空间)</span>
<span class="code-line">$wgVisualEditorNamespaces=array_merge($wgContentNamespaces,array( NS_USER ));</span>
</pre></div>
<p>完整的设置选项可以在扩展页面上找到.</p>
<p>然后在汝的wiki上试试看呗~</p>
<img alt="VisualEditor效果" class="materialboxed responsive-img" src="/images/visualeditor-test.png"/>
</div>
新的"约伊兹的萌狼乡手札"诞生啦~2016-01-16T09:35:00+08:002016-01-16T09:35:00+08:00ホロtag:None,2016-01-16:/pelican/new_yoitsu_birth.html
<p>就像标题描述的一样,新的"约伊兹的萌狼乡手札"以Pelican之姿再次出发啦~</p>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id7">为啥要重做?</a></h2>
<p>原来的 <a class="reference external" href="https://wiki.yoitsu.moe/">约伊兹的萌狼乡手札</a> 是基于MediaWiki搭建的,但是MediaWiki的本来用途并不是来做博客的呐~,不过咱还是一直拖着......直到 <a class="reference external" href="https://www.archlinux.org/news/php-70-packages-released/">Arch Linux 宣布PHP7进入官方软件仓库</a> ,咱升级以后两个关键的RSS扩展都坏掉啦~(应该都知道RSS对于博客型网站的重要性呗~),于是咱痛定思痛决定升级😂</p>
</div>
<div class="section" id="pelican">
<h2><a class="toc-backref" href="#id8">为啥是Pelican?</a></h2>
<p>主要的原因是 <del>人生赢家</del> <a class="reference external" href="/links.html#farseerfc">farseerfc</a> 用的也是Pelican,这样咱可以照着他的经历少走一些弯路......</p>
<p>为啥不用Hexo,Ghost一类的博客系统呢?因为咱不太会设置Node.js(想当初给MediaWiki装可视化编辑器就折腾了半天)😂😂😂</p>
</div>
<div class="section" id="id4">
<h2><a class="toc-backref" href="#id9">那么有哪些问题咧?</a></h2>
<p>首先Pelican用的标记语言是rst(重组的文本)或是MarkDown,不过看情况Markdown是刚加入进来的,处理的还不够好,就先用rst呗~</p>
<p>然而咱并不会rst的语法......只好找来个 <a class="reference external" href="http://docutils.sourceforge.net/docs/ref/rst/restructuredtext.html">语法指南</a> 先照着看......</p>
</div>
<div class="section" id="id6">
<h2><a class="toc-backref" href="#id10">关于旧站的打算?</a></h2>
<p>介于原来的网站也是咱折腾了一阵子才出来的,于是决定先留着.(这个新站的评论要靠它呐~)</p>
<p>咱以后也会继续折腾MediaWiki,顺便在这记下来一些过程和经验呗~</p>
<p>作为新博客的第一篇博文就说到这里,咱具体是怎么做的 <del>请听下回分解</del> 😂😂😂</p>
</div>