Recent Posts

violet's avatar

Leetcode - Remove Element

https://leetcode.com/problems/remove-element/

Given an array nums and a value val, remove all instances of that value in-place and return the new length.

Do not allocate extra space for another array, you must do this by modifying the input array in-place with O(1) extra memory.

The order of elements can be changed. It doesn't matter what you leave beyond the new length.

Given nums = [0,1,2,2,3,0,4,2], val = 2,

Your function should return length = 5, with the first five elements of nums containing 0, 1, 3, 0, and 4.

Note that the order of those five elements can be arbitrary.

It doesn't matter what values are set beyond the returned length.

 

violet's avatar

Leetcode - 4Sum

https://leetcode.com/problems/4sum/

Given an array nums of n integers and an integer target, are there elements a, b, c, and d in nums such that a + b + c + d = target? Find all unique quadruplets in the array which gives the sum of target.

Note:

The solution set must not contain duplicate quadruplets.

Example:

Given array nums = [1, 0, -1, 0, -2, 2], and target = 0.

A solution set is:
[
  [-1,  0, 0, 1],
  [-2, -1, 1, 2],
  [-2,  0, 0, 2]
]

 

violet's avatar

Leetcode - 3Sum

https://leetcode.com/problems/3sum/

Given an array nums of n integers, are there elements a, b, c in nums such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.

Note:

The solution set must not contain duplicate triplets.

Example:

Given array nums = [-1, 0, 1, 2, -1, -4],

A solution set is:
[
  [-1, 0, 1],
  [-1, -1, 2]
]

 

violet's avatar

Leetcode - Maximum Subarray

https://leetcode.com/problems/maximum-subarray/

Given an integer array nums, find the contiguous subarray (containing at least one number) which has the largest sum and return its sum.

Example:

Input: [-2,1,-3,4,-1,2,1,-5,4],
Output: 6
Explanation: [4,-1,2,1] has the largest sum = 6.

 

violet's avatar

读书笔记 - 字符串匹配

KMP 算法

利用 dfa 状态机。

对于长度为M的模式字符串和长度为N的文本,KMP算法查找算法访问的字符不会超过M+N个。

KMP算法为最坏情况提供的线性级别运行时间保证是一个重要的理论成果。在实际应用中,它比暴力算法的速度又是并不十分明显,因为极少有应用程序需要在重复性很高的文本中查找重复性很高的模式。

Boyer-Moore算法

Boyer-Moore 从右向左扫描字符串。

Rabin-Karp 指纹字符串查找算法

查找多个字符串匹配。

violet's avatar

Leetcode - Median of Two Sorted Arrays

https://leetcode.com/problems/median-of-two-sorted-arrays/

There are two sorted arrays nums1 and nums2 of size m and n respectively.

Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).

You may assume nums1 and nums2 cannot be both empty.

Example 1:

nums1 = [1, 3]
nums2 = [2]

The median is 2.0

 

violet's avatar

Leetcode - Two Sum III - Data structure design

https://leetcode.com/problems/two-sum-iii-data-structure-design/

Design and implement a TwoSum class. It should support the following operations: add and find.

add - Add the number to an internal data structure.
find - Find if there exists any pair of numbers which sum is equal to the value.

Example 1:

add(1); add(3); add(5);
find(4) -> true
find(7) -> false

 

violet's avatar

Leetcode - Longest Word in Dictionary

https://leetcode.com/problems/longest-word-in-dictionary/

Given a list of strings words representing an English Dictionary, find the longest word in words that can be built one character at a time by other words in words. If there is more than one possible answer, return the longest word with the smallest lexicographical order.

If there is no answer, return the empty string.

Input: 
words = ["a", "banana", "app", "appl", "ap", "apply", "apple"]
Output: "apple"
Explanation: 
Both "apply" and "apple" can be built from other words in the dictionary. However, "apple" is lexicographically smaller than "apply".

 

violet's avatar

Leetcode - Replace Words

https://leetcode.com/problems/replace-words/

In English, we have a concept called root, which can be followed by some other words to form another longer word - let's call this word successor. For example, the root an, followed by other, which can form another word another.

Now, given a dictionary consisting of many roots and a sentence. You need to replace all the successor in the sentence with the root forming it. If a successor has many roots can form it, replace it with the root with the shortest length.

You need to output the sentence after the replacement.

Example 1:

Input: dict = ["cat", "bat", "rat"]
sentence = "the cattle was rattled by the battery"
Output: "the cat was rat by the bat"

 

violet's avatar

Leetcode - Add and Search Word - Data structure design

https://leetcode.com/problems/add-and-search-word-data-structure-design/

Design a data structure that supports the following two operations:

void addWord(word)
bool search(word)

search(word) can search a literal word or a regular expression string containing only letters a-z or .. A . means it can represent any one letter.

Example:

addWord("bad")
addWord("dad")
addWord("mad")
search("pad") -> false
search("bad") -> true
search(".ad") -> true
search("b..") -> true

 

violet's avatar

Leetcode - 3Sum Smaller

https://leetcode.com/problems/3sum-smaller/

Given an array of n integers nums and a target, find the number of index triplets i, j, k with 0 <= i < j < k < n that satisfy the condition nums[i] + nums[j] + nums[k] < target.

Example:

Input: nums = [-2,0,1,3], and target = 2
Output: 2 
Explanation: Because there are two triplets which sums are less than 2:
             [-2,0,1]
             [-2,0,3]

 

violet's avatar

Leetcode - Two Sum Less Than K

https://leetcode.com/problems/two-sum-less-than-k/

Given an array A of integers and integer K, return the maximum S such that there exists i < j with A[i] + A[j] = S and S < K. If no i, j exist satisfying this equation, return -1.

 

Example 1:

Input: A = [34,23,1,24,75,33,54,8], K = 60
Output: 58
Explanation: 
We can use 34 and 24 to sum 58 which is less than 60.

 

IceHoney Blog's avatar

vue下使用jest进行单元测试

在前端开发逐渐复杂的今天,当然也需要对前端进行测试。单元测试主要用于白盒测试,检测程序的最小单位的正确性,通常来说就是验证函数的输入和输出。

vue 集成 jest

vue-cli 已经提供现成的插件,我们可以很方便的进行集成。官方文档也有讲述如何 debug。在使用 jest 之前,我们需要知道 jest 的测试代码不是像前端代码一样运行在浏览器环境,而是使用 node 运行,并且浏览器的 DOM 环境使用jsdom来模拟,所以在集成测试的时候需要解决不少问题。

jest 与 webpack

当今的前端开发都离不开 webpack 进行打包,我们使用各种各样的 loader 来处理代码,所以可以使用例如import语法来引用 JS 文件,但是 node 环境目前还不支持原生的 es6 import文件。所以在使用 jest 的时候,我们需要用 babel 进行代码转换,好在@vue/cli-plugin-unit-jest 都已经给配置好了,使用预置的 preset 就行。我是基于 TS 开发,所以用的 preset 是 @vue/cli-plugin-unit-jest/presets/typescript-and-babel。但是我们在代码里使用的一些 webpack 的特殊语法就不太好对应了,例如我有使用inline loader来打包特殊的 SVG 文件到代码中,但是在测试的时候就会遇到无法 import 的尴尬问题。这时候的解决方案就是使用moduleNameMapper:

moduleNameMapper: {
    '^!svg-inline-loader!@(.*)$': require.resolve('jest-transform-stub')
},

通过把 import 的资源文件映射为空,就能解决 jest 运行出错的问题,毕竟我们在做单元测试的时候不会检测资源文件。

jest mock vuex store

做单元测试的时候,mock 是非常常见的需求,例如我们在一个文件里引用了 store 的数据,但是要构造这个数据非常复杂,所以我们需要直接 mock 数据。这里需要注意的是,如果是 import 引入的话,我们需要先 mock 再使用动态引用的方式加载测试模块,保证是在 import 之前 mock 数据。

jest.doMock('@/store', () => ({
  state: {
    account: {
      hello: 'world'
    }
  }
}));
const { default: formatter } = await import('@/utils/formatter');

不过,mock 之后记得 reset:

beforeEach(() => {
  jest.resetModules();
});

jest mock navigator

有些测试用例中,我们需要 mock 用户的浏览器是不同语言,这个时候就需要使用spyOn来修改属性的返回值。示例代码如下:

describe('test i18n', () => {
  let languageGetter: jest.SpyInstance;
  beforeEach(() => {
    jest.resetModules();
    languageGetter = jest.spyOn(window.navigator, 'language', 'get');
  });

  it('set lang is zh-CN', () => {
    languageGetter.mockReturnValue('zh-CN');
    console.log(navigator.language); // zh-CN
  });
});

jest mock vue router

测试 Vue 组件主要依靠Vue Test Utils。官方文档也有介绍如何使用,这个仅给出一个例子来描述用法:

import { mount, createLocalVue } from '@vue/test-utils';
import VueRouter from 'vue-router';

import App from '@/App.vue';
import routes from '@/router/routes';
import HelloWorld from '@/views/HelloWorld.vue';

const localVue = createLocalVue();
localVue.use(VueRouter);

describe('Test index routes', () => {
  it('should find HelloWorld when router is HelloWorld', async () => {
    const router = new VueRouter({ routes, mode: 'history' });
    await router.push('/helloworld');

    const wrapper = mount(App, {
      localVue,
      router
    });

    expect(wrapper.find(HelloWorld).exists()).toBe(true);
  });
});

这里使用 localVue 的原因是项目中只有一个 Vue 实例,直接使用的话会污染原本的 Vue,所以要在测试代码里手动创建router。这里要注意的是,如果 find 是某个组件,需要在 Vue 组件里面显示声明name,否则在 Lazy Loading 的情况下是无法找到组件的。还有一个指得注意的是router.push 是一个 Promise 异步操作,所以如果写成同步的话,会一直找不到组件的。

总结

jest 集成了很多测试的工具,只装一个工具便可进行单元测试。但是由于不是运行在浏览器环境,导致jsdom不支持的特性都需要自己来处理。所以希望选择一个在浏览器运行单元测试的框架应该会少遇到很多坑吧。 特别是用了很多浏览器特性的前端项目,测试起来更加折腾。

引用

Using with webpack

Test Vue Router

farseerfc's avatar

SSD 就是大U盤?聊聊閃存類存儲的轉換層

上篇 「柱面-磁頭-扇區尋址的一些舊事」 整理了一下我對磁盤類存儲設備(包括軟盤、硬盤,不包括光盤、磁帶)的一些理解, 算是爲以後討論文件系統作鋪墊;這篇整理一下我對閃存類存儲設備的理解。

這裏想要討論的閃存類存儲是指 SSD 、SD卡、U盤、手機內置閃存等基於 NAND 又有閃存轉換層的存儲設備(下文簡稱閃存盤),但不包括裸 NAND 設備、3D Xpoint (Intel Optane)等相近物理結構但是沒有類似的閃存轉換層的存儲設備。 閃存類存儲設備這幾年發展迅猛,SD卡和U盤早就替代軟盤成爲數據交換的主流, SSD 大有替代硬盤的趨勢。 因爲發展迅速,所以其底層技術變革很快,不同於磁盤類存儲技術有很多公開資料可以獲取, 閃存類存儲的技術細節通常是廠商們的祕密,互聯網上能找到很多外圍資料, 但是關於其如何運作的細節卻很少提到。所以我想先整理一篇筆記,記下我蒐集到的資料,加上我自己的理解。 本文大部分信息來源是 Optimizing Linux with cheap flash drivesA Summary on …

RecursiveG's avatar

CMake 项目生成脚本

C++ 比较尴尬的一点就是缺少比较“傻瓜”的工具库,不得不依靠第三方来补充。想快速开始写个小的 Demo 的时候光找库就花去不少时间。于是糊了一个脚本去自动生成这些基础的东西。放在这里方便自己以后参考。

用到的库列表:

  • {fmt}:
farseerfc's avatar

柱面-磁頭-扇區尋址的一些舊事

在 SSD 這種新興存儲設備普及之前,很長一段時間硬盤是個人計算機的主要存儲設備。 更往前的磁帶機不常見於個人計算機,軟盤的地位很快被硬盤取代,到 SSD 出現爲止像 MiniDiscDVD-RAM 等存儲設備也從未能挑戰過硬盤的地位。硬盤作爲主要存儲設備,自然也影響了文件系統的設計。

這篇筆記稍微聊一聊硬盤這種存儲設備的尋址方式對早期文件系統設計的一些影響,特別是 柱面-磁頭-扇區尋址(Cylinder-head-sector addressing, 簡稱CHS尋址)的起源和發展。 大部分內容來自維基百科 Cylinder-head-sector 詞條 這裏只是記錄筆記。現今的硬盤已經不再採用 CHS 尋址,其影響卻還能在一些文件系統設計中看到影子。

柱面、磁頭、扇區以及相關術語

磁盤示意圖(來自維基百科 Cylinder-head-sector 詞條
chs-illustrate-trans.svg

如右圖所示,一塊硬盤(Hard Disk Drive, HDD)是一個圓柱體轉軸上套着一些磁碟片(platter), 然後有一條磁頭臂(actuator arm)插入磁碟片間的位置 …

's avatar

维护个人网站不易

额,截止到现在,这个网站都快 8 年的历史了。不过感觉不太好的事情就是,我对建站的兴趣已经消退了一大半。

技术

突然感觉,续费域名、检查自己的 CDN 证书情况、升级服务器软件、维护主题、确保网站 assets 工作正常……好 麻 烦 啊!

但是还不敢不干,毕竟如果不干就会发现,自己的网站放了很久,居然开始发霉了:比如忘记申请新的 CDN SSL 证书、assets CDN 停止服务、所用的服务器软件突然爆出高危漏洞等等。

内容

想写点什么,但是:

  • 有的碎碎念太短了,还是直接发到 Twitter 上更适合,或者直接跟群友们说
  • 有的想法不适合公开说出来
  • 想写点技术文章,但是发现自己遇到的问题竟然都是前辈踩过坑的,可以很容易的搜索到
  • 有的想法处于乱七八糟的状态,难以成文

于是,博客就没什么太多的更新了。毕竟跟某些人那样让自己博客充满破事水,只会浪费自己和别人的时间啊。

然后评论区也是需要打理的,毕竟可能会有奇怪的留言需要被处理掉。好在我给我的评论系统写了个 Telegram Bot,所有的最新留言都会被及时推送给我。

本博客的未来?

虽然如此,但我并不打算关闭这个博客。毕竟,有一个自己能写点什么的地盘还是不错的,在那些巨头们不断地把自家平台搞得越来越封闭的趋势下。

不过大家能够看到的就是,我的博客更新会越来越低,但至少不会变成零更新。

以及考虑搞个单独的日记本站点了,专门发表一些没有标题又不短不长的东西,同时提供 RSS。

@现在还活着的独立博客站长们:你们都是好样的,希望大家一起坚持下去。

imi415's avatar

Archlinux上Buildroot的基础使用

什么是Buildroot?好吃么?

Buildroot是一套用于构建定制化rootfs环境的工具集,可以通过简单步骤在嵌入式系统上快速构建rootfs环境用于应用部署。


为什么选择Buildroot?和发行版rootfs的区别是?

1.  架构支持广泛

大多数发行版rootfs只支持常见主流架构,不仅如此,发行版在架构支持方面本着兼容性原则,即便是支持的架构,最终依然会牺牲一部分性能(Hard Float,Architecture Specific的SIMD指令集支持等),Buildroot则可以自由选择工具链及编译参数,并且指定所需要的优化选项进行构建。

2. 体积小,工作稳定

发行版为了保证易用性,通常加入了大量功能与程序便于用户使用,同时为了开箱即用的特征,在网络配置等关键环节也会使用NetworkManager等高级工具进行管理,Init系统也大多使用Systemd,增大了系统的复杂程度,同时不可避免的要产生文件写入等操作,加速Flash等存储设备寿命损耗,降低设备使用年限。Buildroot则避免了上述种种问题,单一稳定的网络配置,可选的DHCP等组件,Busybox轻量级的初始化系统及CoreUtils,可以只读的文件系统支持都使得它对于小体积Flash,低写入寿命,长时间工作的嵌入式系统极其友好。

3. 定制程度高,配置简单

不需要使用包管理器,基于Kconfig的编译配置系统,软件支持也很齐全,只需要选择所需工具就可以构建上机即用的rootfs。


获取Buildroot及工具链

0. 了解硬件平台

为了构建出我们需要的可用的rootfs,我们首先需要了解我们的硬件平台。

IceHoney Blog's avatar

前端开发如何防止逆向以及对策

前端开发分析代码的途径最简单不过了,第一个途径是查看网页源代码,第二个途径是打开开发者工具审查元素。

防止查看源代码

现在网站的基本对策是禁用用户右键选项菜单来避免查看源代码。首先,源代码肯定是能查看到的。采取的措施也只不过是掩耳盗铃而已。解决对策也有很多,我随便说几个。

第一,针对Chrome浏览器,我们可以直接在地址栏里输入 view-source:https://www.google.com/ 这种方式来查看源代码。第二,我们可以使用其他工具,例如curl, wget来直接下载源代码。

这种是很初级的防范对策。

防止审查元素

现代化的前端开发,都是基于JS来渲染页面元素的,有时候我们查看源代码也只是看到了JS文件的引用。没有太大意义,所以需要浏览器渲染之后查看真正的DOM元素才有意义。这时候如何禁止审查元素就是另外一种对策了。 现在用来检测打开开发者工具主要是通过判断console.log的执行,因为不打开开发者工具的话console.log是不会执行的。所以有些网站就可以利用这个来阻止用户打开开发者工具审查元素和Debug代码。 下面给出一个例子来:


这是一个非常巧妙的例子,当执行console.log输出Image元素的时候,比如会访问id属性,从而触发后面的重定向URL代码。所以表现就是用户试图打开开发者面板就会被自动定位到首页。

要破解这个的话,只能在页面执行之前注入代码修改Image函数的使用:

window.Image = function() {};
Object.defineProperty(window, "Image", { writable: false} );

通过注入上面的代码,来规避自动跳转到首页。如何注入呢? 就需要利用Chrome的扩展功能,详细代码请参照bimibimi-hack

总结

前端代码逆向和反逆向,永远没有银弹。只能说是提高逆向的门槛,但想完全防止是不可能的。如果自己编译一个浏览器,修改浏览器的默认行为的话,就没有不能调试的网站。

引用

Find out whether Chrome console is open

Source code of bimibimi.tv

's avatar

某一个冬日的下午

走在雪后天晴的路上,子轩盯着地上被踩实的雪,想着下一步要不要踏在上面。

子轩穿的是运动鞋。鞋不是很厚,所以他总想着跺两脚,好像这样能让他暖和多少似的。除了跺两脚,他还想喝一杯热可可。其实喝热咖啡也没问题,但咖啡冲出来都是热的,所以子轩会说“我想喝热咖啡”而不是“我想喝热咖啡”。少了一个热字,就好象不是为了保暖而喝的了。语感很重要。

而且热可可甜。好喝。星冰乐也甜,也好喝,但是星冰乐是冰的。子轩想到这里,又跺了两下脚。

不过虽然子轩想着喝热咖啡,错了,热可可,热可可,想喝热可可(其实都可以喝,但主要是想喝热可可)。但他向前的脚步里却还是没有半点迟疑。倒不是因为前方有一家地标性的 58 年建的老牌咖啡店,在里面可以喝到可绕地球一圈的热可可;也不是因为前面有一家超市,超市里有卖可可粉,可以买一袋带回家去烧开水冲一杯。单纯是因为他没那么想喝。因为子轩不清楚附近的店铺,他需要掏出手机,在寒风中哆嗦着手搜索咖啡厅,然后还要在寒风中握着手机导航。总而言之就是很要命。如果碰巧路过一家就进去买一杯吧,子轩心想。

边想着,子轩路过了一个垃圾桶,不经意中瞟了一眼,他发现里面有一个咖啡杯。他一眼就看出来,这个杯子来自他不怎么去的斯达巴克斯。子轩想着这样读很搞笑,于是又来了一遍。斯——达——巴——克——斯——。他不小心笑了出来,嘴里冒出了一小团白雾。

子轩看了看周围,确认身边没有人。

子轩其实也想过和他人一起喝热可可的事。不过单纯是想想。

他想过,在某一个夏天的午后,已经停业的咖啡厅,和她喝着小卖部买来的柠檬汽水。

“好无聊啊。”

“嗯。”

然后只剩下无休止的蝉鸣。

子轩又四下张望。映在眼里的尽是雪。他拉紧了背包的肩带,又跺了两下脚,好像在确认脚下踩的是否还是冰。

他抬头一望,茫茫的天空已经透出了夜色。

“下次再喝吧。”他对自己说,现在他想的只是吃一顿好的晚饭。

farseerfc's avatar

Btrfs vs ZFS 實現 snapshot 的差異

zfs 這個東西倒是名不符實。叫 z storage stack 明顯更符合。 叫 fs 但不做 fs 自然確實會和 btrfs 有很大出入。
我反而以前還好奇為什麼 btrfs 不弄 zvol , 直到我意識到這東西真是一個 fs ,名符奇實。
—— 某不愿透露姓名的 Ext2FSD 開發者

Btrfs 和 ZFS 都是開源的寫時拷貝(Copy on Write, CoW)文件系統,都提供了相似的子卷管理和 快照(snapshot)的功能。網上有不少文章都評價 ZFS 實現 CoW FS 的創新之處,進而想說「 Btrfs 只是 Linux/GPL 陣營對 ZFS …

SgDylan's avatar

在 Photoshop 中使用赛璐璐动画风格

赛璐璐动画因其制作工艺有着独特的画面质感,以下是咱为了模拟这一风格的一点探索。

's avatar

猫咪!猫咪为什么这么可爱!

猫咪真是太棒了!圆圆的身体和脑袋,尖尖的、竖立着的耳朵,灵活机动的尾巴,宝石般闪亮发光、还含有长条瞳孔的眼睛,柔软却含有锋利爪子的脚掌。它们好奇的行为总是无法被人类理解,却仍然给我们带来了无尽的快乐荷尔蒙(如果没有闯祸的话)。它们抓着毛茸茸的草,追赶着毛茸茸的线团,最后翻滚在地上也变成一团形状不固定的毛茸茸。如果我更有经验也更有文笔的话大概能够写出更多,不过我想不必多说,猫咪超级可爱,应该是许多人都会认同的事情了。可是为什么,为什么它们会这么可爱呢?

准确地说,为什么许多人类会觉得猫咪非常可爱呢?

这是我在刚意识到猫咪的可爱的时候(大概是高中)还没有想过的问题,那时我面对可爱的反应最多还只是低头与闭上眼睛微笑,但这样的感情逐渐地,从起初的“呀,蛮可爱的”,变成了“喔,很可爱呢”,变成了在网上疯狂地阅览含有猫咪地图片和视频,然后又变成了抱着一块屏幕遮住脸发出毫无意义的呐喊这样的行为,最后到达了我现在的样子(无可救药了)。换句话说,就是“深陷泥潭,无法自拔”。后来,在一次日常地对猫咪的可爱做出感叹的时候,我才像每一个发厨的人类一样,做出了这样的感叹:猫咪!猫咪好可爱呀呀呀啊啊啊!猫咪为什么这么可爱!

在发厨完毕后,我才发觉,这可不是随便的发厨中的呐喊呀,这可是一个非常正经的问题,猫咪这么可爱,一定是有原因的,所以这个原因是什么呢?我从此在心中记上了这个问题,虽然还没有开始去主动寻找答案,但还是长期得带着这个问题,在生活中等待着答案。

然后懒惰又拖延的我就把这件事忘记,封存在记忆的地窖中了。

在一个平常地耍废看 YouTube 的夜晚,我遇到了这样一个视频,它是出自 Vsauce 频道的《Why Are Things Cute?》。 Vsauce 是我非常喜欢的讲述知识的频道,于是我便点开来观赏了。视频中说,我们之所以会觉得东西可爱,是因为它们具有人类婴儿的特征,像是好奇心、较小的身体,大大的眼睛,圆圆的脸蛋。因为只要看到婴儿就觉得可爱,于是便想要抱抱蹭蹭,想要保护与关怀,那是有助于婴儿的生存的,也就是有利于人类生命的延续的,所以人类便得以进化出了“觉得可爱”的能力。

可是这个视频没有说服我,因为按照这样说的话,我们都应该觉得人类的婴儿是世界上最可爱的东西才对,可是这对于我来说显然是不对的,婴儿那么吵又烦的东西,怎么可能有猫咪可爱!难道是我的神经有些异常,大多数人都是认为婴儿最可爱才对?可是认为猫咪或者其它宠物比人类婴儿可爱的人显然也不占少数,有这样多的人,那应该不能够用“个别的异常”来解释才对。所以问题还是没有完全解决,为什么猫咪这么可爱,比人类婴儿还要可爱呢?

那是在我近期阅读到的书《绑架本能的世界:影响所有决定的“超常刺激”理论》(英文维基百科: Supernormal Stimuli)才找到了答案的问题。那是由 YouTube 频道啾啾鞋在视频《悄悄潛入你我生活中的「超常刺激」你注意到了嗎? 》知乎链接)中讲述并推荐的一本书。

书中所说的“超常刺激”,是指的刺激了原始本能的人造模仿物,但是却比那个本能本该应对的自然中的事物更鲜明和夸张,所以反而更加具有吸引力。书中的开头举例了欧洲杜鹃,一种把蛋下在别的种类的鸟的巢穴中的鸟,小鸟寄生于那个巢穴的宿主,让它们来孵化和喂养。杜鹃的蛋一般都会比宿主鸟的蛋更大、更亮,小鸟的喙也更宽、更红。出于本能地,对宿主鸟来说,又大又亮的蛋和又宽又红的喙都是更加好的,因此宿主鸟不但没有认出那个寄生鸟,却反而给予它比自己真正的孩子更多的关怀。这种杜鹃地鸟蛋和小鸟,就是对于宿主的“超常刺激”。

作者是一名演化心理学家,那是一门把人类以与动物的同种方式来观察的学科。也就是说,既然动物会被假的鸟蛋所欺骗且更偏爱,那么人类也会做同样的事情,只是人类的超常刺激并不从外种来,而是人类的现代社会自己创造的。

书中讲到了性,因为 A 片中演绎的场景比现实更加刺激,所以人类非常喜欢看;书中讲到了外貌,因为万里挑一的模特与偶像比现实中能够见到的人更好看,所以人类会去更多地追求他们;书中讲到了小说,因为虚构的故事比现实更精彩,所以人类会沉迷与其中;书中讲到了垃圾食品,因为盐与卡路里在原始社会非常稀少,所以人类会本能地想要大量吃下;书中讲到了知识,因为了解得更多会让自己更容易在原始丛林中存货下来,所以人类会本能地无尽地对事物好奇(对,超常刺激不一定都是坏事)。

当然,书中也讲到了可爱。在阅读讲述可爱的章节的时候,我终于明白了。

之前提到的 Vsauce 的视频说得没错,可爱是为了让动物能够爱护自己的后代而产生的东西。我们面对可爱的东西产生的反应,那是本该对人类婴儿产生的。我们会认为是可爱的特征,也是本应该在人类婴儿或者幼年人类身上找到的。列举一些可爱的特征的话,大概是这样的:

  • 小身体
  • 大脑袋
  • 大眼睛
  • 小鼻子
  • 圆脸
  • 胖乎乎的四肢
  • 笨拙的协调性
  • 爱玩
  • 亲热
  • 好奇心
  • 无助的感觉
  • 想要被呵护

都是人类后代会拥有的特征,对吧?可是尽管这些特征都是从“人类后代”的模子里面出来的,世界上却存在一些东西,比人类后代更加显著地具有这些特征,那些比人类后代更加可爱的东西中之一就是——猫咪。猫咪有着圆圆的脑袋,亮晶晶的大眼睛,毛茸茸软乎乎,跳来跳去充满活力,带着满满的好奇心探索四周……列举出来的话许多特征都被满足了,而j几乎每一项都比在人类婴儿中能找到的特征更夸张,换句话说,更可爱。

也就是说,猫咪,是对我们人类的“可爱”反应的超常刺激呢。

当然啦,也许不是每个人都认为猫咪是最可爱的,那么狗狗呢?那个被人类驯化以来就在不断地被人类以对人类有益的特征筛选培育的物种,在很少需要放羊的现代,可爱就是最重要的特征了。狗狗的可爱,可以说是被“研制”出来的。如果不是特别喜欢宠物的话,那么皮卡丘呢?卡比呢?还有各种各样奇形怪状的吉祥物呢?还有请问您今天要来点兔子吗?那些由“可爱工程师”(也就是艺术家)们一笔一笔创造出来的可爱,怎么可能会不使大部分人类痴迷呢?要让真正的人类婴儿与它们相比较的话,也就太不公平了。

简而言之:猫咪为什么这么可爱?因为它具有我们的后代会拥有的特征,却更加显著和夸张。


看到这里,你有未觉得,把“可爱”描述成“本能”,站在用这样理性的方式去剖析,会不会使人觉得可爱很是件低下的事情,而一个理性的人是应该抛弃的呢?我不这样认为,人类是逃不掉被本能支配的,所以被“可爱”这样的本能支配完全不是坏事,倒不如说,我们来一起拥抱它吧~

对了,还有一件令人开心的事,那在生物学上被称作“幼态延续”,它是指一种生物在成年后仍然持有幼年特称的状况。野生的狼在幼年时与狗一样汪汪叫,而成年后就变成了嗷呜;在被驯化成为狗之后,便一直学不会嗷呜,成年之后也继续汪汪叫,这是幼态延续的成果。猩猩在成年后,鼻子部分的脸会更加突出,而幼年猩猩的脸要短很多;人类拥有现在这样的脸,也是猩猩幼态延续的结果。同样,人类所拥有的其他动物无与伦比的好奇心,也是幼态延续的结果。换句话说,人类就是幼齿的猩猩。幼齿使我们更具竞争力,更容易生存,生活越来越好。我们喜欢幼齿,以致于我们在寻找伴侣的时候,都会更加喜欢幼齿的人类。对,合法正太和萝莉最棒了!而且因为这样的择偶趋势,人类的幼态延续会继续下去,所以进化的趋势就是,人类会变得越来越可爱!

唔,因为是在凌晨快要到 4 点钟的时候完成这篇文章的,所以请原谅我在整篇文章中只加入了一张模糊的猫咪照片呢……

最后,猫咪可爱!喵!


除特殊说明外,本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。转载时请注明来自 FiveYellowMice's Blog ,以及原文链接

虽然 RSS 是一种很好的新闻获取方式,但是不同的 RSS 阅读器所显示的内容可能会有很大差距,有些甚至无法显示所有内容。所以为了能够获取到完整的内容,最好还是点开网页链接看。
之所以还是保留了 RSS 的全文输出,是因为摘要输出会被很多人讨厌……

farseerfc's avatar

ZFS 分層架構設計

2020年2月9日更新過

ZFS 在設計之初源自於 Sun 內部多次重寫 UFS 的嘗試,背負了重構 Solaris 諸多內核子系統的重任,從而不同於 Linux 的文件系統只負責文件系統的功能而把其餘功能(比如內存髒頁管理, IO調度)交給內核更底層的子系統, ZFS 的整體設計更層次化並更獨立,很多部分可能和 Linux/FreeBSD 內核已有的子系統有功能重疊。

似乎很多關於 ZFS 的視頻演講和幻燈片有講到子系統架構,但是找了半天也沒找到網上關於這個的說明文檔。 於是寫下這篇筆記試圖從 ZFS 的早期開發歷程開始,記錄一下 ZFS 分層架構中各個子系統之間的分工。 也有幾段 OpenZFS Summit 視頻佐以記錄那段歷史。

早期架構

早期 ZFS 在開發時大體可以分爲上下三層,分別是 ZPL, DMU 和 SPA ,這三層分別由三組人負責。

最初在 Sun 內部帶領 ZFS …

Kouga's avatar

使用 Linux network namespace 简化 VPN/BT 软件配置

  1. 前言

    因为家里的壮天鹅不想跑在 OpenWRT/树莓派 (ArchlinuxARM)上,导致我必须将 rtorrent 和 StrongSwan 都跑在 Gen8 上。因为 ESXi 各种坑的缘故,我又没给 Gen8 开启底层虚拟化,所以此时配置网络栈就比较蛋疼了。

    好在调查了一番之后,找到了 Network namespace 这个方法,它能在不同命名空间下跑完全隔离的 IP栈,这就让事情一下子简单了喵~

  2. 准备工作

  • Linux Server 一台(我这里是Gen8)
  • Kernel > 4.10 (其实版本低一点也没大问题,不过我这里要配置 XFRM 壮天鹅,所以必须高一点
  • iproute2 (新版本 IP 工具包,替换 ifconfig arp netstat route 等命令
  1. 网络规划

因为入户的 电信光猫 绕不开,所以我这里其实饶了些路喵~现在物理链路和IP段落如图所示:

graph TD
  I[Internet/ISP 光猫] -- 192.168.1.a --> R1[OpenWRT Router]
  Switch --> G8[Gen8]
  I -. 192.168.1.b .-> G8
  R1 -. 172.16.x.x .-> P[Phone & Other Device]
  R1 -- 172.16.x.x --> Switch
  Switch --> PC[PC & LAN DEVICE]
  1. 配置 VPN

利用 XFRM 和 ipsec 设备来做路由,比单纯的壮天鹅好配置多了,代价只是延迟稍微增加但是吞吐量没大影响喵~

ip netns add vpn

ip link add ipsec0 type xfrm dev eth0 if_id 495
ip link set ipsec0 netns vpn

ip netns exec vpn bash -c "ip link s-et ipsec0 up"

# 然后在该命名空间内导入各类路由表
ip netns exec vpn bash route.sh
  1. 配置 BT
ip netns add bt # 添加bt的ns

#因为 Wifi 链路不好直接迁移,所以用 macvlan 克隆一个vlan0设备
ip link add link wlp0sxxx name vlan0 type macvlan

ip link set vlan0 netns bt #移动克隆设备去 bt

# Inside bt netns stack. 执行初始化
ip netns exec bt bash -c "ip link set up vlan0; ip addr add 192.168.1.b/24 dev vlan0; ip r a default via 192.168.1.1 dev vlan0"

# 启动 BT 请用这种方式 ~~sudo 套娃~~ :
sudo ip netns exec bt sudo -u rtorrent rtorrent

OX's avatar

斐訊 R1 音箱關閉開機提示音

斐訊倒閉了,R1音箱早就不能正常用了。
前段時間有大神出了一個刷機的方案,但是要拆機自己焊接端口,比較麻煩,我只需要能播AirPlay就可以了,所以就沒有動力去拆機。
但是每次開機的那個提示音很吵很煩,有時候莫名其妙還會喚醒智障小訊,一直在想能不能把斐訊全家桶幹掉。
但是一直沒有出不拆機就能root的方案。
終於。今天晚上無聊,自己摸索出解決方案,開機再也沒有煩人的提示音,叫它也不會再應答,符合我自己的使用場景,現在把方法分享出來,其實核心內容很簡單,就是用adbpm命令把斐訊全家桶hide掉就可以了。

下面是具體方法

先用斐訊AI的App讓R1連上Wi-Fi,然後找到R1的IP地址,然後

adb connect [R1 IP地址]

然後運行下面的命令

adb shell /system/bin/pm hide com.phicomm.speaker.productiontest
adb shell /system/bin/pm hide com.phicomm.speaker.bugreport
adb shell /system/bin/pm hide com.phicomm.speaker.otaservice
adb shell /system/bin/pm hide com.phicomm.speaker.player
adb shell /system/bin/pm hide com.phicomm.speaker.device

需要留意的是,com.phicomm.speaker.launcher 不可以hide掉,不然頂部的音量調節功能會失效。

然後重新啟動就可以了:

adb shell reboot

想復原的話,只需要將命令的hide改為unhide,然後重啟就可以了。比如像這樣:

adb shell /system/bin/pm unhide com.phicomm.speaker.productiontest
adb shell /system/bin/pm unhide com.phicomm.speaker.bugreport
adb shell /system/bin/pm unhide com.phicomm.speaker.otaservice
adb shell /system/bin/pm unhide com.phicomm.speaker.player
adb shell /system/bin/pm unhide com.phicomm.speaker.device
adb shell reboot

題外話

如果想乾脆一點,可以用/system/bin/pm uninstall --user 0 命令把上面的全家桶徹底刪掉,但是這個操作不可恢復,特別是com.phicomm.speaker.otaservice 如果徹底幹掉的話,想刷機就只能拆開,手工焊接上調試端口刷機了。

依云's avatar

自制大上 Paperlike HD「驱动」

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

大上 Paperlike HD 使用有一段时间了,然而有一点我对其非常不满:它需要以 root 权限运行一个图形界面的程序。具体麻烦的地方是:

  • 图形界面的程序不方便使用 systemd 管理,那个窗口我得找个地方安放,并且在登出图形界面或者 Xorg 出问题时会随之关闭
  • 即使持续运行此程序,当几秒内不使用键盘或者鼠标的时候屏幕就会休眠。这导致我无法将此屏幕用于关注程序日志或者聊天工具的新消息。
  • 它持续不断地执行多个线程的任务(读取键盘事件、读取鼠标事件、通过 ioctl 与设备通讯),耗费了不少 CPU
  • 在屏幕尚未连接时,它的运行会导致内核不断输出日志「drm_dp_i2c_do_msg: 2 callbacks suppressed」

我曾多次想自己实现一个符合自己使用习惯的方案。

首先当然是 strace 上去啦。这会得到许多类似这样的消息:

ioctl(9</dev/i2c-1<char 89:1>>, _IOC(_IOC_NONE, 0x7, 0x7, 0), 0x7f47d8805b70) = 1
nanosleep({tv_sec=0, tv_nsec=100000000}, NULL) = 0
ioctl(9</dev/i2c-1<char 89:1>>, _IOC(_IOC_NONE, 0x7, 0x7, 0), 0x7f47d8805be0) = 1
nanosleep({tv_sec=0, tv_nsec=200000000},  <unfinished ...>

可以看到它在对 /dev/i2c-1 这个文件进行操作,但是具体内容是个指针,strace 看不到。

我尝试过使用大名鼎鼎的 IDA 的免费版本来分析其具体行为。但我对 IDA 并不熟悉,并且 IDA 只支持 Intel 语法的汇编,而我见的 AT&T 语法的比较多,Intel 的很多表示法我不太能看懂。

后来根据 ioctl 的请求参数找到这个文档,里边有这些 i2c 消息的结构体定义。于是想着先把 ioctl 的数据弄出来看看。一开始尝试用 gdb 去看那个地址的数据,但想到数据是变动的,再加上 gdb 查看太累了,就想起了通过 LD_PRELOAD 去 hook ioctl。

所以又要写 C 了?并没有呢!C 写起来那么不舒服,还是用 Rust 吧~然后搜了一下,还真有现成的用于写 LD_PRELOAD 库的 crate,比如我用的 redhook。不用自己去 dlopen,不用在各处写很多错误处理代码,很容易就写好了。代码链接

拿到了 ioctl 里用的消息,我不用理会它具体是什么意思,也没办法去猜测,自然是把它按大上提供的程序那个样子给发过去了。于是又一个 Rust 程序出来了。

一开始写的时候不小心往 unsafe 代码块里传了个悬空的指针,导致程序不工作,调试了好久,甚至我都把完整的整个流程给复刻了一遍。这要是用 C 写文本解析的逻辑可头疼了,不过 Rust 写起来就跟 Python 差不多的了~

至于那个 bug,是 Rust 语句中的临时对象(此例中是包含一个对象的数组)会在语句结束之后就释放导致的。有点坑,但也没什么好的办法。

程序运行起来之后就会保持 Paperlike HD 显示器可用,不会报错让装驱动,也不会过几秒就休眠了。我大幅降低了消息发送的频率(由差不多每秒三次改成了三秒才一次),再加上不需要读取键鼠输入,所以 CPU 占用也会大幅减少。另外内核也不会再打印「drm_dp_i2c_do_msg: 2 callbacks suppressed」的消息了,大概是因为消息频率降低了?重新连接显示器之后,和大上原版程序一样有概率出现显示器亮蓝灯、屏幕不工作的情况。拔插一下电源可解。

当然啦,如果有人要用这个程序的话,记得先确认一下你的 i2c 设备文件路径(去 lsof 大上原版程序就行)。另外,使用此程序后果自负,由此造成的任何设备损坏或者其它损失,我都不负责任的哦~

17windy's avatar

去海边:信使 游戏更新日志

V0.63 0124 版本更新日志

增加:
1,新增剧情关卡,大家春节快乐!

修复:
1,部分怪物AI修复

优化和调整:
1,目前可以获得的基础芯片可以堆叠了
2,角色平衡性微调

V0.625 0117 版本更新日志

修复:
1,修复了第二关狼BOSS可能会瞬间造成大量伤害的问题
2,修复了某个图标错误

优化和调整:
1,采用了新的关卡进度提示UI
2,普通怪物的血条显示修改为会自动隐藏

增加:
1,所有角色增加了不同的自回血能力

V0.62 0116 版本更新日志

优化和调整:
1,狼现在更倾向于灵活的中距离攻击与穿插,拥有灵活但不是特别精确的中距离普攻,拥有快速恢复的短距离冲刺
2,重制了狼的冲刺技能视觉效果
3,凤的技能伤害微调
4,谬的护盾技能恢复更快
5,降低了现有关卡的难度

增加:
1,帮助按钮现在可用
2,增加场景标题和相关过渡

V0.61 0115 版本更新日志

修复:
1,修复狼的二技能偶尔失效
2,修复界面按钮偶尔失效
3,修复背包按钮导致游戏持续暂停状态
4,修复背包按钮偶尔导致角色无法跳跃
5,修复关卡2的植被结构
6,修复关卡1的场景孔洞和出墙操作
7,修复关卡2三尾BOSS的攻击持续时间
8,修复关卡2结束攻略后的持续箭头

优化和调整:
1,优化部分UI设计
2,优化部分怪物AI
3,调整玩家角色狼的普攻范围
4,调整玩家角色凤的部分数据
5,整体调整玩家角色的生存数据

增加:
1,关卡1增加部分指引
2,现有怪物增加攻击前摇和攻击特效
3,部分新剧情资源预载

IceHoney Blog's avatar

前端部署之CDN的那些事情

现在的前端开发主流是PWA,简而言之就是像App一样使用。基于PWA技术可以离线访问,并且可以添加程序到菜单里。离线技术使用的是比较成熟的Service Workers。但是配合CDN就有很多不得不注意的事情。

CDN部署静态资源

现代化前端开发主要是把CSS,JS,图片等静态资源放在CDN上有效提高载入速度。把静态HTML文件放在服务器上,有利于更新网站最新状态,例如进入维护状态,直接把静态HTML文件替换为维护页面即可。

同源策略问题

正常情况下,资源文件和主网站不在同一个域名下,例如主网站是icehoney.me,资源网站是static.icehoney.me。当然了,资源文件使用GET方法浏览器自动载入,没有任何问题。但是注册Service Worker的JS文件是不能放在CDN上的,因为这是官方的规定。个人理解是出于安全因素的考虑。所以我们在主服务器上不仅要放静态的HTML文件,还要放一个serive-worker.js文件。

SVG symbol的使用问题

现在前端的开发针对很多小图标,都是采用SVG的方式来引用。其中SVG symbol特别好用,可以在页面里嵌入一个inline的SVG,然后在其他对方使用标签来引用。但是对于放在CDN上的SVG文件,不能直接使用下面的形式:


如果引用CDN的SVG浏览器会报错,解决方案是使用svg-inline-loader,手动在文档里面注入SVG文件。document.body.insertAdjacentHTML 方法可以注入inline的SVG。

Workbox配置

首先,PWA项目的路由都是由前端来处理,所以我们需要使用navigateFallback保证不管导航到哪个路由都能映射到缓存的HTML文件。然后是使用runtimeCaching配置缓存服务器请求。

总结

由于Service Workers的导入使得CDN部署变得有些麻烦,不过这些问题好在都能找到解决方案。还有一点是Chrome的Network面板里的offline模式不能测试Service Workers的离线。需要自己手动拔网线才能测试。

引用

Is it possible to serve service workers from CDN/remote origin?

Workbox webpack Plugins

RecursiveG's avatar

简易内核开发环境

近期尝试了一下写 Linux 内核代码,于是把折腾过程记录一下,方便以后参考。本文默认使用 x86_64 架构以及 Linux 作为宿主系统。

使用 QEMU 运行 Linux 内核

在开始写代码之前,我们需要先准备好模拟器用于运行 Linux。我这里用了QEMU,你也可以用 VirtualBox 之类的虚拟机。一般来说,我们需要一个内核可执行文件(内核本体)和一个 initramfs 镜像(提供用户态程序)。当内核被加载后,它会自动载入 initramfs 镜像,并执行其中的/init程序。由于这一节的重点是 QEMU 配置,所以我直接使用宿主机的内核和 initramfs。以我的 Archlinux 系统为例,内核文件是/boot/vmlinuz-linux,initramfs 文件是/boot/initramfs-linux.img。使用以下命令启动 QEMU,按Ctrl-A x退出。

1
2
3
4
5
6
7
qemu-system-x86_64 \
-kernel /boot/vmlinuz-linux \
-initrd /boot/initramfs-linux.img \
-nographic -append "console=ttyS0" \
-m 512 \
--enable-kvm \
-cpu host
  • -kernel 指定内核可执行文件。
  • -initrd 指定 initramfs disk 镜像文件。
  • -nographic -append "console=ttyS0" 禁用视频输出并使用串口作为终端。
  • -m 512 设定内存。
  • --enable-kvm 使用KVM。
  • -cpu host 使用宿主机的 CPU 特性。

你应该能看到一些系统启动的信息以及无法挂载根分区的报错,这是正常现象,因为我们没有提供任何磁盘文件。你应该可以进入一个紧急修复 Shell, 执行一些简单的如 ls cd 之类的命令。

's avatar

新的家庭服务器:MicroServer Gen10

我的上一代家庭服务器是一台技嘉的 GB-BXBT-2807。其实作为家庭服务器来说,它是个还行的选择,但是内部只能安装一块 2.5 寸 9.5mm 以下的 SATA 硬盘,而且只有一个 USB 3.0 和两个 USB 2.0 接口。

我家的上传速率其实还是可以的,而随着我开始尝到私有云的甜头,我陆续增加了三块硬盘。然而因为它只有一个 USB 3.0 接口,所以最后我的家庭服务器变成了这个样子。

看来,我需要一台真正的多盘位 NAS 服务器了。我一度考虑过以下方案:

  • 搞个蜗牛星际。但是在 KK 家摸到真机以后,我对它的做工倍感失望。
  • 买个迎广 MS04,自己从头攒一台 NAS 出来。但是这样的话,总支出大概不会跟买一台 Gen10 差太远,而且保修这个问题会变得比较复杂。

最终,我还是决定购买 HPE ProLiant MicroServer Gen10。

可以说,这款主机对我来说,几乎是完美的:

  • 4 盘位(虽然并不是热插拔)
  • 低功耗(x3216 的 TDP 只有 15w)
  • 主机本身是正常的 x86 PC,可以很方便的安装各种主流 Linux 发行版
  • 做工良好,可靠性强
  • 两个 PCI-E 插槽(分别为 x8 和 x1),未来升级万兆会很方便
  • 接口丰富:四个 USB 3.0、两个 USB 2.0、两个千兆以太网口、两个全尺寸 DP 和一个 VGA
  • 预装 8GB DDR4 ECC 内存
  • ……

就这样,我以 2.8k CNY 的价格在美亚拿下了这玩意。其实我一开始考虑从德亚买的,只要 2.5k(当时),但是并不能直邮到中国。为了省事,我就直接在美亚买了。

安装

近两周以后,它抵达了我家。到手的第一件事,当然是拆开检查一下了。箱子中并没有太多的东西(主机、美标品字电源线和一堆小册子),不过对于它的目标用户来说大概够了吧。

顺便那条品字电源线用的是带接地的美标插头,这使得它并不能在新国标的插线板上使用。所以如果你家没有多余的品字电源线,别忘了单独买一条!

PSU 是台达的小 1U 电源,宽电压,最大输出 200W;输出有 24pin x1、大 4P x1 和小 4P(软驱电源插头)x1。

接下来就要安装硬盘了。这玩意并没有独立的硬盘仓,所以你需要这样安装硬盘:

  1. 从硬盘仓顶部拧下来 4 颗螺丝
  2. 把这 4 颗螺丝拧到硬盘两侧最左面和最右面的孔位上
  3. 把硬盘正面朝右,稍微用力的推进硬盘仓。移除硬盘也是超级容易的(见硬盘仓左下角贴纸):

然后就开始安装系统 SSD 了。这玩意并没有 M.2 NVMe 插槽,但是在主板上提供了一个额外的 SATA 接口,所以我买了一块普通的 SATA SSD。

然而,Gen10 的 PSU 并没有多余的电源线,你能利用的只有那个小 4P 插头。所以你需要买这样的转接线:

我那个 Gamemax 机箱正好附送了一根这样的转接线,所以我就直接拿来用了。

至于 SSD 的固定……Gen10 上侧的那几个空位是给你固定笔记本光驱用的,所以你的 SSD 大概就只能这样放着。当然你可以再买个笔记本光驱位转硬盘位之类的东西,不过 NAS 这种东西本身也不需要经常挪动,再说 SSD 里面并没有活动的部件,所以我就无所谓了。

系统

我选用的是 Ubuntu 18.04 LTS。因为:

  • Ubuntu 是我熟悉的发行版系列
  • 我拥有充分的控制能力

安装过程没什么坑,一切都在预料之中。随后,我通过 apt 安装了各种我需要的软件(nginx、Aria2、Transmission 等),写好 /etc/fstab 表,就大功告成了。

目前,我的硬盘使用情况如下:

硬盘 安装位置 用途
东芝 240G SSD(TR200) 顶部 系统盘
东芝 2T 监控盘(DT01ABA200V) 硬盘仓 1 一般文件存储
西数 4T 蓝盘(WD40EZRZ) 硬盘仓 2 BT/PT 下载

同时,我还有一块 2T 的东芝移动硬盘用于冷备份;我会定期将它连接到 Gen10 上,运行我的脚本来进行 rsync。

嗯,我觉得目前就足够了。等将来有需求的话,再考虑加硬盘吧。

系统运行

我之前的确考虑过 CPU 的问题,毕竟这玩意是焊在主板上的。但我的需求不高(就是存取文件和下载啥的,顺便开个 web 服务器),即使是看动画的话,解码都在客户端完成,所以也就 Gen10 了。

实测我的 CPU 负载一般可以控制在 1.0 以下;如果我真的需要算力,大概我就直接拿主力机器搞事了。

随想

其实我设立家庭服务器的历史可以追溯到 2012 年。当时我没有办法购买虚拟主机,而免费空间的局限性太大。我发现我家的宽带提供了公网 IP,于是我拿我家的台式机成功的建立了自己的网站。但是因为母上大人反对我 7x24 小时开机,所以我后来开始考虑用其它的闲置硬件来做这样的事情,包括一部 Galaxy Note 10.1 平板……直到今天,我终于为了开设家庭服务器,而专门购买了一套全新的硬件。

时至今日,我早已不是当年那个热爱折腾的我了。现在我最喜欢的就是各种开箱即用的东西了!Gen10 就是一个几乎完美的典范了(对我来说)。不过如果你并不是那样的 Power User,想要更加的不折腾,其实群晖、威联通、海康威视等厂商的私有云硬件,大概会更好一些吧。

farseerfc's avatar

和萌狼交換問題

很抱歉萌狼很早就提過交換問題的事,被我一直咕咕了許久。 拖延症晚期有藥麼

我的提問和萌狼的回答

可以去萌狼的博客上看呀

Q1:除了博客的「关于」页面以外,还愿意再向咱介绍一下自己嘛?

介紹自己啊。 寫了刪刪了寫,不知道該介紹點啥 就說點自己的興趣?

喜歡自由開源軟件,喜歡 Arch Linux 。喜歡這些倒不是出於 RMS 和 FSF 那樣道義上的原因, 我覺得商業軟件公司要賺錢吃飯也是無可厚非的。

喜歡自由軟件是因爲,當我需要知道它到底怎麼工作的時候,有可能去挖代碼,必要的話能去改代碼。 當然我一個人肯定不能讀所有在用的軟件,但是我知道我有讀和修改代碼的權利的話, 那麼我認識的朋友們也同樣有這樣的權利,我不認識的廣大社區有千千萬萬的人也同樣有這樣的權利, 從而我相信當我遇到問題的時候不至於卡在某些人某些公司某些集體的決策上而無法解決。

基於這個理由,我對開源社區也同樣有公開全部細節的期待。我喜歡 Arch Linux 因爲即便它的內部決策只是一小波人,但是導致決策的討論以及決策的執行方式全是公開的,可以在網上翻閱, 可以追根溯源,這讓我有種安心感。就像我不喜歡 Manjaro 的一點是它有太多細節是翻閱不到的, 雖然它也是開源社區,但是打包細節翻閱不到,包列表翻閱不到,決策的制定和執行的過程也翻閱不到 …

Roy Binux's avatar

家居自动化

从 Google Assistant, Amazon Alexa, Apple Homekit 到米家,智能家居自动化已经不是什么新鲜的概念了。对于我来说,入坑的契机也非常简单:我不想下床关灯。然后随着想要自动化的场景增加,智能设备(可编程设备)就越来越多。这篇文章就根据自

Kouga's avatar

给 Ghost 添加语法高亮和图表支持

Ghost 比较讨厌的一点就是,各种基础东西都不存在,得通过各种方式(主要是插入代码)来添加功能……

  1. 准备工作
graph LR

A(打开 Ghost 后台管理)-->B(设置 Settings)
B-->C(代码注入 Code Injection) 

  1. 增加语法高亮 prism

语法高亮比较简单,我使用 CDNJS - prism 作为CDN源,并且使用了 prism-autoloader 来自动载入需要高亮的语法插件。

Site Footer 里插入下面代码:

<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.17.1/components/prism-core.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.17.1/plugins/autoloader/prism-autoloader.min.js"></script>

如果想要改变代码高亮风格,可以在 prism-themes 里寻找中意的主题,并插入到 Site Header 里面:

<link href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.17.1/themes/prism-tomorrow.min.css"  rel="stylesheet" />
  1. 增加图表支持 mermaid

同样是使用 CDNJS - mermaid, 不过这次代码稍微要做一下修改,因为我们已经用了 prism 来高亮语法,DOM 会被修改成 pre.language-mermaid>code.language-mermaid 状态,此时需要筛选一下DOM并替换一下样式表。

Site Header 里插入下面代码,主要是修复样式表:

<style>pre.language-mermaid {background: none;border: none;}</style>

Site Footer 里插入下面代码:

<script src="https://cdnjs.cloudflare.com/ajax/libs/mermaid/8.4.4/mermaid.min.js"></script>
<script>$(document).ready(()=>{mermaid.init({}, "code.language-mermaid")});</script>

这样我们就可以很简单的在文章里插入流程图了::

    ```mermaid
    graph LR

        A(打开 Ghost 后台管理)-->B(设置 Settings)
        B-->C(代码注入 Code Injection) 

    ```
ホロ's avatar

和 farseerfc 交换问题!

终于还是咕咕出来了?

虽然咱催了好久但是最后因为咱在年前把笔记本寄回去的原因结果自己咕了……

farseerfc 的问题和咱的回答~

Q1: 萌狼最開始是如何接觸到 Linux 的呢?有什麼契機導致使用 Linux 麼?

之前有订阅个叫电脑报的报纸来着,然后有一期介绍了 Ubuntu ,然后就下载来试了试。 (结果马上就把 Windows 的引导搞炸了 😂)

后来咱第一台笔记本运行 Windows 10 有点吃力的时候就往上面装了 Debian, 开始试着做主力了。再后来试着自己搭 Shadowsocks 的服务器,在 VPS 上用上了 CentOS。

看到了这篇文章 开始用 Arch Linux 了。最近是看到了 FSF 的自由发行版推荐,然后也开始用 Parabola 了 🤔

Q2: 這個筆談又是如何開始的呢?

不知道那一天的晚上咱更新友链的时候,就突然想到,友链归友链, 也想稍微深入的了解一下一个个名字后面的人呐,介于咱不想露面也不想出声,就退而求其次(?)的这样开始了。

只是咱提问的话,对方会不会觉得血亏 😂 于是就有了让咱回答对方提出的等量问题的决定(?)。

Q3: 音遊和 Linux 哪邊對萌狼而言更重要?

TL;DR: 两边不会因为各种原因顾此失彼。

一样重要,一个是咱为数不多的娱乐(尝试其它类型的游戏的尝试几乎都以发现自己苦手告终……), 一个咱还有兴趣乱钻(?)

或是一样不重要,一个因为成绩不及(不管是已经很强的还是后来居上的) 自闭,一个因为知识和经验不足(又轻易不敢胡乱提问(自闭。嘛反正都差不多就是了(

Q4: 如何看微軟喜歡 Open Source / Linux 整件事?

爱“开源”嘛,改不了它骨子里是个私有软件公司的本质鸭, 于是该黑的继续黑(大雾)。什么时候它们说自由化的时候再说吧(?)

Q5: 對我的印象如何?

完美潇洒的好(?)爸爸(??),咱认为是 #archlinux-cn 里为数不多向往自由的 GNU/Linux 用户,使(cai)用(keng)经验丰富, 经常能提出关键的建议,以及为数不多的能感受到咱的变化还能安慰咱的人。

Q6: 社區水聊時,什麼樣的話題會令萌狼覺得反感,以至於想離開社區避開討論?

(以下排名不分先后)

  • 群聊看着很火热但是咱一说话就完全没人搭理的时候;

  • 令不行禁不止的时候,例如群聊管理员在限定主题的群聊带头跑题还没有自觉的。

  • 居高临下的,例如轻易断定朽木不可雕然后劝退的(谁不是那么走过来的呢…… 也有可能是咱视野狭窄没见过那种天生神力的人)。

  • 强行安插印象的。(啥,例如说啥都会“奉承”自己的时候,还是不懂……)

  • 一言不合换掉的,就像啥桌面出问题都吹说换某桌面的。

  • 有人讨厌咱的时候,但是只要见不到就没什么大碍。

    (不过再想想,咱自己都不保证完全没有问题,也有不时说些怪话的时候,似乎没有什么权力要求别人的样子……)

Q7: 有什麼話想對我說嘛?

要努力当个好爸爸哟~ 以及咱们有没有<s 在没有黑暗的地方</s 见面的一天呢? (为什么咱每次说到见面都能想到那种地方2333……)

那么下一个是?

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

熟悉的感觉+=1……

's avatar

我的 2019

好耶,我终于把 2019 年瞎鸡巴过完了!

感觉今年反而是相当平淡的一年,所以其实并没有太多的要讲。都是无病呻吟

成就

  • 考到了 C1 驾照
  • 获得了 5000 元的奖学金(第一次!)

面基

今年去了广州、福州和深圳,在线下见到了 qwe7002(又一次)、whitebox、寿司同学和 kookxiang。

我们一起玩了马车 8,一起进行技术交流,还在 kookxiang 家参观了多种灵车。然后 tcdw 对蜗牛星际的做工倍感失望,一怒之下买了 HPE Microserver Gen10。

开心!

买买买

今年买到了不少很棒的新硬件:

  • Nintendo Switch
    相当便携;上面的第一方游戏真的太好玩了,还有很多不错的第三方游戏。吹爆!
  • Dell UltraSharp U2518D
    颜色非常舒适的 2K 显示器,还内置 USB Hub!
  • AOC P2491VWHE/BW
    还行的 1080p 显示器,功耗很低(我的实测只有 18w 左右)。最初是买来给宿舍用的,奈何我的桌子太小了,所以也搬回家里用了……Switch 大屏游戏?暂且算了吧 🤣
  • 小米 CC9e
    便宜,日常应用体验很流畅!虽然屏幕分辨率很低,不过对我的使用场景来说够用了(大概)。
  • 树莓派 4
    好耶,是千兆以太网和 USB 3.1 gen1。
  • Intel Core i7-3770(散片)
    我家那台戴尔应该可以再战几年了!
  • HPE Microserver Gen10(在撰写本博文时还在路上)

同时在文娱方面增加了不少支出;今年我购买了大量的音乐(139 张专辑和 EP,包括数字专辑、捡垃圾和海淘)。其中我非常喜欢的有:

以及我看着 Telegram 群里的大佬们买各种 灵车 买的不亦乐乎,结果我看了半天什么都没买……不过也没什么实际意义啊,而且没那么可靠吧(?)

博客

今年的确没有写很多博文。大概我对这种东西的兴趣也开始下降了吧,主要感觉很多事情不是不值得写就是不适合写……

不过放心,我目前还没有关掉这博客的打算呢。

稍后打算把我的域名都转移到 Cloudflare 了;name.com 续费死贵。

以及想写个新的博客主题了,但是没什么头绪……

2020 年计划?

待定!计划赶不上变化的。

's avatar

不破不立

明天就是新的一年了。

之前说过,我需要重新补一遍毕业设计,才能拿到毕业证书。我的家长对此是十分地关注、关心,也是十分愿意并且急于给我提供各种各样的帮助。我理解他们的好意,但是他们如此密集的关注和干涉使我过分地紧张,给我带来了十分严重以至于难以承受的压力。于是在 12 月的 2 日,在我的请求之下,我的家长带我去了北京大学第六医院,结果当然是确诊了。我也成为了一个得每天定时服药的人了。

我的家长其实十分不想让我公开说这件事情,因为担心这会影响到我的前程。但是我觉得,这种事情还是公开说出来比较好,一方面是想获取大家的关心和同情,另一方面我觉得会仅仅因此而拒绝我的组织很有可能本来就不适合我。

但是确实,由于种种复杂的原因,本学年内我是无法补毕业设计了。如果我还想补毕业设计的话,下一学年是最后的机会。不过在那之前,我有了至少半年的空白时间,我想用什么东西把这段时间填上。

Pikanote 再开

我的专栏 Pikanote已经太久没有动静了,接下来的几个月我打算试着把这个东西重新开起来。在正式的重开之前,我会花一段时间把内容搬到 Github pages 上去,在那之后我应该会在上面放一些新的技术文章。各位也许可以期待一下。

F70 workshop

几年前我提出 F70 workshop 这个名义的时候,是想用这个名义写一点游戏玩,不过由于课业和其他方面的压力,不得不搁置了。新的一年也许这个名义会有新动静,毕竟我还是蛮想尝试一下这个东西的。

其他可能会有的计划

我在图像和音频方面还有一些其他想要尝试的玩意儿,虽然我不太确定我会不会着手去做。

另外我现在算是处于无业游民状态,所以虽然这这里说可能没多大的用,我还是得声明一下我现在是 open for opportunity 的。虽然我短期内不会急于寻找一个正式工作,但是如果能有一个的话还是会好一些的。

最后

祝大家新年快乐。年份虽然只是一个人为规定的时间刻度,但是既然人们为其赋予了意义,那么新的一年里也许一切都会不一样了吧。

SgDylan's avatar

写在 2020 前

咱稍微回忆一下好了。


Kouga's avatar

Arduino 开发小记(一)

你看到这里有个(一)喵……那就说明……可能有 二?不存在的喵(X

优雅的使用中断

如果想要写一个 Arduino 库,然后发现库里面需要导出一些函数给中断(或者其它类似C回调)进行绑定,而且数量不定(由使用者指定),那么可以使用模板配合静态成员函数&变量来做。

举个栗子,这是一个启动后会针对指定针脚脉冲进行计数的片段:

#include "Arduino.h"

template <int pin>
class PulseCounter {
 public:
  PulseCounter() {}

  void begin() {
    pinMode(pin, INPUT_PULLUP);
    // 因为使用了模板,所以每个实例拥有自己的静态成员
    // 函数 PulseCounter<pin>::pulse_interrupt
    attachInterrupt(
      digitalPinToInterrupt(pin), 
      pulse_interrupt, CHANGE);
  }

  unsigned int getCount() { return pulse_count; }

 private:
  // 因为中断函数是静态成员函数,所以其使用到的成员变量都要是静态的
  static void pulse_interrupt() { ++pulse_count; }
  // 比较复杂成员结构建议使用 struct / public class
  static unsigned int pulse_count;
};

// 初始化静态变量
template <int pin>
unsigned int PulseCounter<pin>::pulse_count = 0;

这样在 Arduino 里使用的时候就可以很简单的这样运用了:

#include "PulseCounter.hpp"

//每个计数针脚都可以有一个对象,依次声明即可
PulseCounter<PULSE_COUNT_PIN> pin_counter;

void setup() {
  Serial.begin(9600);
  pin_counter.begin();
}

void loop() {
  Serial.println(pin_counter.getCount());
  delay(1000);
}

避免命名污染

要做一个大家都喜欢的库,如果只是纯函数和少量内置变量,推荐用 namespace 包裹起来,方便使用同时减少命名污染喵~

namespace MyLibrary {
extern int some_variable;
extern int other_variable;
...
}

void Callme(){
  using MyLibrary::some_variable;
  
  some_variable = ... ;
}
RecursiveG's avatar

AMD Threadripper 3960X 装机

眼看2019年就要结束了,发现自己的手竟然还在。于是决定连着胳膊一起剁掉。

CPU

没什么好说的,AMD YES 就完事儿了。

主板

主板选了微星的 TRX40 PRO 10G (我就是不喜欢 Asus 你来打我啊)。10G 版比 WIFI 少了无线模块,多了一张万兆以太网卡。不过不管哪样我都暂时用不上。另外还有一张 PCI-E x8 转两个 M.2 的转接卡,没那么多 SSD,同样用不上就是了。除此以外就是说明书、光污染线之类的玩意儿。

内存

极度非主流的内存配置,4根英睿达的 16G ECC 内存。型号为CT16G4WFD8266

于是先把 CPU 和内存装上主板:

一体式水冷

随便选的 九州神风堡垒360EX。少数几个当时能以合理价格买到的支持 TR4 的一体水冷。

另外现在的风扇都这么花哨了吗,怎么扇叶上都装扰流板了?

电源

随便选的 海韵 Focus GX-850。少数几个当时能以合理价格买到的便宜的 850W 电源。另外这电源还送了一个测试器,本质就是把 ATX 接头里的某两根线短接一下,用以测试电源本身能不能工作。但是我为什么不直接把它插到主板上去测试呢?

显卡

显卡方面,AMD 好像不是很香,但我还是选了 RX590。别问为什么,问就是 Fuck you NVIDIA

40Gbps

之前提到用不到万兆网卡,一是没有万兆交换机,二是有捡垃圾捡回来的 40G Infiniband 卡,台式机和 NAS 之间用 QSPF 线直连,速度反正比机械硬盘快就是了。顺带把旧机器上的系统盘也拆过来。

塞进机箱

机箱选了毫无灯光的 Fractal Design Define C,这个机箱没有前置的 USB Type-C 接口比较可惜。显卡的 PCI-E 供电线荡在那儿还是有点丑。

背面走线随便走走,机箱能合上就是胜利。

尾声

新机器插电一次亮,不过意料之中的,进不去系统。根据 Phoronix 的报道,需要在内核参数中添加mce=off才能正常启动。然后进 BIOS 把虚拟化、IOMMU、ECC 之类的都开起来,这机器就算装完了。随意跑了一下s-tui,48个线程满载还是蛮恐怖的。

一般空载整机功耗 100W 左右。单烤 CPU 全核频率在 4GHz 左右,整机功耗 400W,想必加上显卡后能轻松过 500W,电费也要开始燃烧了。另外这接近 80℃ 的温度感觉有点高,难道是水冷没装好?

装机总结:AMD YES

OX's avatar

寫在2019年年末

「2019年瞬間就結束了。」

人隨著年齡的增長,主觀上會慢慢地感到時間變快了。而我現正經歷這個變化過程,且是感受最強烈的階段。

認真回顧2019年——我做了些什麼事情,身邊發生了什麼事情?其實想説的事情有很多,無奈近年記憶力衰退得誇張,有些事情到底是否2019年發生的也不能肯定,某件事情具體是哪個月份發生的,現在的我其實也不特別在意,但其實是想要記起也記不清楚,只好「強迫」自己不去在意。雖也可以通過各種線索推導出相對正確的結果,但其實也並無這個必要。雖我有時候確忍不住在意這種細微事情,但現在單是要將這些事情整理出來就已要耗費我大量精力,而我現在其實並沒有太多這樣的精力。事情確是發生過,這一點是不會有錯的。

應該是年初,被一個患有憂鬱症的女生單方面絕交。這個事情其實對我打擊頗大,我因為這件事情,又一次開始審視自己的人際關係原則:

我開始思考,我這種「來者不拒」的社交原則是不是有很大的問題,在實踐中,出現的最尖鋭的矛盾就是我肯定並不能真的做到「來者不拒」,這也是理所當然。每個人都是有底線的,精力也有限度,當然忍耐力亦然。

因為「來者不拒」就意味我需要將我的精力不斷地透支、不平均地分配給我身邊的人。這對於我本人並沒有實質上的好處,我之所以堅持這麼多年,主要原因是我內心深處善良,而維持這種善良所需的虛榮心也和我付出的額外成本「收支平衡」,我知道社會上每個人都是不平等的,有人就是會有各種各樣的原因,讓他會被周圍人孤立,這種原因有時候可以很具體,亦有時候無論是他自己,或是孤立他的人都説不清楚;這種原因可以是先天的,事出有因的甚至也可以是表面上「平白無故」的,但很多時候當事人都無法通過一般的努力克服這種不利因素,結果就是他們會被很多人孤立。只是單純孤立的行為,其實無可厚非,但是終究我個人是不支持的,所以我希望我也可以用自己的實際行動貫徹我自己的理念,所以我刻意地要求自己做到相比其他人更加公平地照顧到身邊的每一個人,對於被孤立的人,我更是想要撥出有限且不多的精力與他們共享。

我的交友原則是不想孤立任何人。

雖然我經常感到疲憊,但是直到這件事發生前,總體上我算是能夠「收支平衡」,我透支了精力,但是我收穫了我期望的內心上的滿足,我滿足了自己的道德期望。我的同理心使我站在道德高點無時無刻地審視自己的行為,而虛榮心填補了我透支的精力。

本來這套系統本可以持續不斷地運行,就如《道德情操論》所説描述的一樣。

結果這個事件的發生,正正破壞了保證這個系統能夠維持下去最重要的兩部分的其中一部分,我非但沒能滿足虛榮心,我獲得虛榮心的其中一個重要途徑更被破壞——需要花時間建立的外在良好形象被污名化。

對方集中火力攻擊我的品格,而具體的理據當然是站不住腳的,身邊熟悉我的人對我品格認知也自然不會因為她的控訴而動搖。

但現實是:外在形象並不是以你週邊幾個人對你的認識而形成的,更多的是不熟悉你的人,甚至沒有見過面的人來定義的。謠言以我的個人能力無法控制,儘管我想要嘗試掌控局面。我也不知道結果怎樣,但是我敢肯定我的形象一定因此受損了。這很遺憾。

而她也損失了我本人本會在未來繼續分享給她的精力,這些「精力」對於她來説,本應該是最珍貴的人生財富,但是很可惜,她因為不受控制的病態精神狀況和偏執人格障礙將她自己逼到了絕境,將這些付諸東流。

我從這個事件中收穫了教訓:我付出的氾濫的同理心回報不總是能如我所望獲得等額或更多的虛榮心回報,這項投資不保本,更可能蝕大本。

違反社會規則,人為地過度幹預市場風險很高,儘管願景是好的,但就和共產主義一樣,期望的理想社會在現實中怎麼可能可以維持長久?


另外一個教訓就是對於抑鬱症患者,在交際過程中需要非常小心注意,保持相當的距離是非常重要的,留意對方有沒有按時按量服藥也很重要。

對嘗試通過自殺・自殘博得關注和同情的病人更是不能陷入他們創造的陷阱,敦促他們按時按量服藥,催促他們去心理門診獲得專業的醫療意見是我目前認為的作為普通人的唯一正確做法。在必要的時候給予最低限度的生命保護,作為普通人即可問之無愧。

將這兩個教訓,對映回我的人際關係原則上,就是未來需要謹慎處理有心病的人羣的交際,具體到憂鬱症病人上,特別是重度憂鬱症的人,不能妄想通過無限透支自己的精力一廂情願地期望他們可以走出疾病,或許其實可以,但是對於普通人來説風險過高,更有可能惹火燒身。

原則終歸是原則,並不是那麼容易動搖的,教訓帶給我的改變不觸動原則本身,只是實踐原則的時需要改善做法。對於患有重度憂鬱症的人,給予不亞於針對其他人普通人程度的關懷我即認為足夠。畢竟若果重度憂鬱症可通過人文關懷就可得到痊癒,憂鬱症的治療就不會來得這麼困難。


(等待更新 2019年12月24日凌晨)

ホロ's avatar

爱丽丝的树洞 - 在匿名网络(?)的一角

(一如既往的不擅长写最前面的摘要……其实只是把这里往 i2p 上搬了一份以后 的有感而发罢了。)

至于汝问咱这一个月咕咕咕到哪里去了的话,那肯定是没看前面那篇文章啦……

从深网到匿名网络

提到所谓的“深网”,大家最有印象的大概就是那张冰山图了吧:

普遍认为的深网指的是那些不能用普通的搜索引擎搜索到的内容,这个概念下就有很多啦。 像是各种内部网络的服务、需要登录的外部服务、需要付费解锁的服务甚至某微幕公众号等 等都可以叫做“深网”。

接下来,网络上有一些 IP 地址上看起来没有分配任何服务,因此网络上的流量不太可能 到达这种地区。因为和宇宙学中的黑洞差不多(没啥能从里面出来的?)于是这一段网络 有时也被称作“黑暗网络”。

再接下来,出于各种奇怪的目的(例如隐藏沟通各方的身份、缓解单点故障风险等等), 不少人利用现有的网络搭建了各种需要特殊手段才能进入的网络。再因为某些不可知的宣传 或者渲染恐惧等因素,这种网络一度被错误的称作“暗网”。两大知名匿名网络软件(Tor 和 i2p) 的开发者们也一直在努力的改正这个错误……

比较著名的匿名网络软件有 Tor (因为传输过程中解密流量的过程有点像剥洋葱有时被 称作“洋葱路由”)、i2p(有时和 Tor 对应的被称作“大蒜路由”)和 Freenet 自由网 等等。有的网络的功能要点在于分布式和去中心化而不是匿名,因此通常不被称作是匿名网络。 像是 ZeroNet 和 ipfs 等等。

出于使用经验在内的种种原因(意思就是这么多咱没都用过),咱就先介绍前两个 比较著名的好了……

兔子洞前的兔子?

Tor是实现匿名通信的自由软件。其名源于“The Onion Router”(洋葱路由器) 的英语缩写。用户可透过Tor接达由全球志愿者免费提供,包含7000+个中继 的覆盖网络,从而达至隐藏用户真实地址、避免网络监控及流量分析的目的。

Tor用户的互联网活动(包括浏览在线网站、帖子以及即时消息等通信形式) 相对较难追踪。Tor的设计原意在于保障用户的个人隐私,以及不受监控地进 行秘密通信的自由和能力。Tor透过在传输协议栈中的应用层进行加密,从而 实现洋葱路由这一种技术。

Tor会对包括下一个节点的IP地址在内的数据, 进行多次加密,并透过虚拟电路(包括随机选择的Tor节点)将其提交。 每个中继都会对一层加密的数据进行解密,以知道数据的下一个发送目的地, 然后将剩余的加密数据发送给它。最后的中继会解密最内层的加密数据, 并在不会泄露或得知源IP地址的情况下,将原始数据发送至目标地址。

值得注意的地方是(?),这个让各国政府和监控部门头痛不已的网络开发过程 中的主要赞助者也包括美国海军研究办公室和联邦政府等等政府部门。(自己 帮忙造了个烫手山芋么……)

I2P(Invisible Internet Project即“隐形网计划”),是一项混合授权的匿名网络项目。

I2P网络是由I2P路由器以大蒜路由方式组成的表层网络, 创建于其上的应用程序可以安全匿名的相互通信。它可以同时使用UDP及 TCP协议,支持UPnP映射。其应用包括匿名上网、聊天、撰写博客和文件传输。

I2P是可伸缩性强,具有自我组织与恢复能力的包切换匿名网络。 其上运行有多种不同的匿名安全程序,各程序可以自行决定匿名性、延迟、 流量平衡而不用考虑混淆式路由网络的具体实现。它们的数据活动可以与现有 的I2P用户的匿名数据相混合。

Tor 和 i2p 的区别主要在于路由上,Tor 所使用的“洋葱路由”使用同一条 网络链路实现数据的发送和接收,而 i2p 使用的“大蒜路由”使用多条网络链路 发送数据和接受数据。

以及为了获得网络中的中继列表, Tor 需要和某几个固定的目录服务器联系,于是 目录服务器就很容易成为审查者封锁的目标。相较之下, i2p 使用 Kad 算法获得网络中 节点的数据(就像 eMule 一样),因此只要客户端还能连接到一个中继,就能取得连接 需要的服务器信息,封锁难度也随之上升。

最后的最后(?), Tor 的主要目的是为了相对匿名(?)地访问常规网站,如果汝 去看 Tor 的流量统计的话,就会发现访问洋葱服务的流量只占 Tor 网络中总体流量 的小部分。

而 i2p 设计的主要目的就是构建一个匿名网络,因此不像 Tor 那样有很多的访问明网 (普通的互联网)的节点(经常只有一个,或者没有……)。以及由于通过多条链路发送 和接收数据的原因,速度也稍微慢一些。

i2p 自己有一份文档稍微区分了一下自己和 Tor: https://geti2p.net/zh-cn/comparison/tor

关于这两个匿名网络软件的使用方法嘛,并不是这里的重点(啥?)。 最好的教程还是 官方提供的:

众人拾柴火焰高 - 帮助匿名网络成长壮大

什么网络都要有足够多的人使用才能发展,就像现在的互联网一样。对于术业有专攻的 匿名网络来说更是如此。在汝使用过这些匿名网络工具之后,有没有想过助它一臂之力呢?

  • 宣传和修正错误观念

向朋友们宣传匿名网络的存在和它的重要性,以及他们了解到 匿名网络不只是某些破坏行为的栖息之所,它还是保护汝所珍视的某些事物的关键武器。

  • 架设匿名网络服务,或者把汝的普通网站调整成匿名网络友好

出于某些商业或政治因素,大多数网站对来自匿名网络的访问者有各种各样的限制 (例如要求输入验证码或者拒绝访问等等)。 如果汝是一个网站的所有者(像咱一样),汝可以考虑为匿名网络使用者放行(例如 如果汝有在使用 Cloudflare 的话,可以考虑为 Tor 的出口 IP 设置白名单),或者 更进一步,在匿名网络上放置汝的网站。(当然可能需要稍微调整一下汝的网站以适应 匿名网络的需求)

  • 架设或赞助匿名网络节点

匿名网络毕竟还要靠普通网络中的设备来驱动,通过增加匿名网络中的节点(无论 是汝自己亲力亲为还是提供资金给其它提供者),既可以部分提高(?)网络的速度, 也可以增强网络的健壮性。

  • 参与匿名网络软件开发

不一定是编写代码啦,撰写文档,提供翻译,参加测试和讨论也都是行之有效的方法呢。

Tor 和 i2p 都有自己的社区页面,从那里开始汝的第一步吧!


SgDylan's avatar

粘合 mpv 滤镜

mpv 算是跨平台的最强播放器了,有还算活跃的社区,也有很多可以用来给画面加料的滤镜。
FSRCNNX 和 Anime4K 算是比较热门的两个滤镜,前者能借助卷积神经网络修复部分纹理,后者则能够提供优秀的锐化效果。
但遗憾的是,这两个滤镜并不能混合使用。本文即是以此为题展开的探索。

IceHoney Blog's avatar

iOS12下Safari浏览器的BUG

新时代的前端开发遇上新时代的IE6, 没错我说的就是苹果的Safari浏览器,当年谷歌抛弃WebKit内核自立门户真是正确的选择。Chrome有很好的bug反馈机制,而Safari要想反馈bug首先得成为苹果的付费开发者。

事件穿透

当我们遇到一个特殊需求,有两个绝对定位的DIV(position:absolute)。如果指定了z-index必然会有上下的层级关系,值大的在上面,值小的在下面。但是我们需要上面的DIV不接受任何的事件,由下层的DIV捕获事件并处理。这时候可以使用一个神奇的CSSpointer-events: none;来解决。只要给上层DIV指定了这个CSS属性,上层DIV就不会接收任何事件,相对的下层就可以收到所有事件的响应。

测试用Demo

为此,我专门在codepen写了一个demo。当然,这个CSS属性主流浏览器都已经支持了。但是当上层DIV里包含了一个iframe的时候,iOS12下的Safari表现就变得奇怪了,demo中,我在Back DIV里监听了touchstartclick事件,正常情况下两个事件都会触发,但是在有iframe的时候,safari只会触发touchstart事件。

解决方案

既然少触发了一个事件,那我们的解决方案就是模拟点击事件,不过代码中必须通过User-Agent限制执行的范围,否则造成其他浏览器双击就不好了。模拟事件很简单,自己新建一个事件,然后在指定的DOM上dispatchEvent就好了。但是针对input输入框,即使模拟了click事件也不能出发iOS打开键盘激活输入,解决办法就是如果在input元素触发的touchstart事件,就执行input.focus()。 这样就可以激活输入的键盘了,不过要注意的是只有touchstart可以触发,测试发现touchend并不能触发。

总结

iOS下的Safari浏览器有很多BUG,经常找BUG的我也算是有点经验。最重要的方法就是排除法,删除多余的DOM。缩小影响因子,最后确定原因。

引用

The stacking context

Creating and triggering events

依云's avatar

Python 3.8 升级记录

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

Python 3.8 发布有好多天了,Arch Linux 也早就重新打包了一千多个包(感谢辛勤的肥猫猫),隔天就从 [staging] 进入 [testing] 了,四天之后进入正式仓库([extra] 和 [community])。

Python 3.8 进入官方仓库的次日,我本地进行了更新。之所以要等一天,自然是等 [archlinuxcn] 的更新啦。然后那些需要人工干预而又暂时没人理的我本地重新打包了。使用 pacman -Qo /usr/lib/python3.7/site-packages 查询尚未更新的软件包,然后对着对应的 PKGBUILD 一顿改(基本上也就是 pkgrel 加 0.1 而已),makepkg -si 就好了。

但是这样还没完事哦。

sudo updatedb 更新一下 mlocate 的数据库。然后 locate -be python3.7 | grep -v /var/lib/lxc 找到一些残留的文件,主要是 ~/.local/lib 下的,以及散落在管理之外的 venv 里的。~/.local/lib 下的都是我自己的项目,删掉然后重新去项目里 python setup.py develop --user 就好了。venv 的话,直接删掉吧……

然后是 locate -be python-37 | grep -v /var/lib/lxc | grep -v /usr/lib/python3.7/site-packages。这个是为了查 Python 3.7 的 pyc 文件,所以这次也排除了 Python 3.7 的 site-packages,避免尚未更新的 Python 包的干扰(有些暂时用不到的包我就懒得自己 makepkg 了),等更新完之后整个目录删掉。有些软件包(比如 gdb-common)没有使用标准的 Python 安装流程(比如因为并不是标准的 Python 库),打包者(比如著名的 Allan McRae)没有或者拒绝在打包时编译 pyc 文件,造成 Python 自行创建不被管理的 pyc 文件,软件包卸载或者 Python 升级后就残留下来了。

确认没有问题之后(比如有些软件可能自带了个旧版本的 Python,或者有些并不是 pyc 的文件也包含这个字符串),执行 locate -be python-37 | grep -v /var/lib/lxc | grep -v /usr/lib/python3.7/site-packages | sudo xargs rm -v 删除这些文件。当然如果有需要保留的文件自行从文件列表中删掉先。

pyc 清理之后,接下来清理一下空的 __pycache__ 目录啦。locate -be __pycache__ | sudo xargs rmdir -v 2>/dev/null 就可以了,非空目录不会被删掉的。

哦对了,我现在在用 mypy 了,所以还要 locate -we .mypy_cache/3.7 一下。

我之所以现在记录这事儿,「现在」的原因是,我要在另一个系统上再测试一遍再发布出来,「记录」的原因是,下一次我就不用想要执行哪些命令了。

imi415's avatar

灵车IPQ4019——R619AC

1. 简介

不多说,灵车,IPQ4019,OpenWrt没支持,国产X-Wrt不想用,拿ImageBuilder打Patch吧。

2. 系统

打Patch的话参见X-Wrt的commit,这个就差不多了。

但是PCIe并不能开箱即用。

要想PCIe能用的话还存在三个问题

  • 没设备树
  • 没电
  • 没REFCLK

miniPCIe接口3.3V AUX没电的问题可以看下图

miniPCIe的供电部分,缺焊元件为bypass电阻

恩山的方案是短路这个电阻,但是这需要一定的焊接,而且也不便使用,根据观察可以发现左侧SOP-8封装的器件为International Rectifier IRF7416PbF 功率MOSFET,封装如下:

IRF7416PbF Datasheet

这个MOSFET的源极和漏极接在整板3.3V与miniPCIe的供电3.3V中间,我们可以推断该MOSFET的用途是miniPCIe的供电控制,那么栅极推断应为SoC GPIO控制。

问题来了,这货有100个GPIO,我们如何找到正确的控制这个MOSFET的GPIO呢?

根据实际插入PCIe模块的情况及万用表测试的结果,该IO的状态只存在是两种可能:

  • 输出模式,高电平
  • 输入模式,内部上拉

那么范围缩小到了状态为输出高或者输入上拉,且没被其他外设占用的GPIO,

's avatar

伊里野的,以及我的夏天

写在前面

《伊里野的天空、UFO的夏天》可以说是我比较喜欢的一部轻小说了,所以我个人希望阅读原作之后再回来看这篇博客。当然,没有看过原作对这篇博客内容的理解也不会有什么影响,所以我并不是在要挟。

日文原版在カクヨム上有连载,如果有日语基础的朋友推荐一试。

夏天

夏天的一个好处就是衣服可以穿的很少。而且可以游泳。虽然我是旱鸭子。

夏天已经过去了,我在戴着手套一边瑟瑟发抖一边打字。好不痛苦。

但如果现在还是夏天的话,做些什么好?

吃冰淇淋,画勾。

出去转转,画勾。

夏天!天空!大海!画勾,画勾,忘了。

然后我想做的事情就没了。我想挽留夏天,就好像留住了夏天,就留住了青春一样。有的时候做梦,也会梦到和高中、大学的同学在一起,做些有的没的。具体做些什么,却朦朦胧胧想不起来。

这时候,我遇到了《伊里野的天空,UFO的夏天》。

梗概

我其实也有在之前的博客里说过,我纠结于是写会有更多人看的书目介绍,还是写我想写的东西。我倾向于写一些个人的东西,书评的好处和坏处都是形式上过于客观了,所以看了一个书评,人们往往会有一种想法——这是对书的客观评价,但不是想这是一个人对书的主观体验。因此我还是会简要介绍这个系列,但是会在千人一面的介绍之间,穿插一些感想。

中文维基页面(先不要点)很讨厌:它剧透了开头,剧透了结尾,就给人一种看完了整个系列的错觉。但我觉得,比起只看结局,更应该看到怎么一步步蓄势,升华,最后到达这样的结尾的。所以我自己来尝试介绍一下《伊里野》好了。

暑假最后一天的晚上,园原中学。浅羽直之从窝了一个半月的山上回来,除了各种各样山里生活用的行李以外什么都没有:别的地方没有去,暑假作业没有写,泳裤也没有带。浅野现在的心情,就和即将上刑场的死囚一样。

“还有13小时就会咣当,第二学期就会无情地开始了。理科老师、二年四班的班主任、35岁单身的河口泰藏,一定会让没交作业的学生们在讲台上排成一列,一面用科学的眼光怒视过来,一面科学地用出席簿吧当吧当敲每个人的头,一面要求科学地说明为什么连暑假作业都没法交的吧。”

决心及时行乐的浅羽,连自己没有带泳裤也不管了,晚上摸进中学准备偷游一番。没成想,泳池已经有先客了。

女孩子想学游泳,却迟迟不肯将脚伸进水中。浅羽费了九牛二虎之力才让她憋成气之后,一切都顺利了——一个小时不到,女孩子居然就能用浮板游了。

女孩子很奇怪:她不苟言笑,但兴奋起来就会流鼻血,而且最最不可思议的,还是埋在她手腕上的一对金属球。如果这也算还好的话,之后突然出现了一群黑衣人,说要送回家,浅羽遵从指令,上了面包车之后,就什么都不记得了。

“醒来之后,自己坐在家附近的公交站的座位上。衣服穿得好好的。本该停在录像带店的自行车也在。”浅羽想到这一个半月跟部长在深山里找UFO的经历。要么一切都是一场梦,要么自己是被外星人绑架了,浅羽想。

第二天开学,这个女孩堂堂出现在自己的教室,她竟然是转学生。她在黑板上写下的名字——伊里野加奈,怎么看怎么像伪名。她一定是外星人。

暑假结束了,但UFO的夏天还在继续。

主题

以上就是第一卷第一章的梗概了。应该没什么剧透风险,没有。

“也太长了吧?”毕竟想解释标题中“UFO的夏天”,没有一些篇幅还是会显得比较突兀。想知道“伊里野的天空”是什么意思,就请看原著吧。:)

对我来说,《伊里野》不仅是典型的 boy meets girl 的故事,也是浅羽成长、改变的故事。这样的主题在很多小说里都能看见。放到《你的故事》(对应文章,英文注意)里也是一样——浑浑噩噩,过去一片空白的天野千寻遇见夏凪灯花,失去夏凪灯花,在没有夏凪灯花的世界里继续负重前行的故事。还有很多作品——藤まる的《时薪300元的死神》、《明天,我将死去,你将复生》,佐野彻夜的《你在月夜里闪耀光芒》、《为这个世界献上i》……为什么一个作者经常写同一个类型的故事……具体浅羽是如何成长的,之后再提。

我无意多说世界系——我明白我说的再多,也只是复述自己从别的地方看来的东西,所以就简单的介绍一下,有兴趣的读者可以自行搜索其滥觞及变迁。

世界系这个词被用来形容有着类似背景、设定和描述风格的一些作品。世界系作品跳过社会,而将个人直接与世界联系起来:个人的举动会影响整个世界。在《伊里野》中,就有不明的外星生物入侵,人类只有黑蝠鲼(black manta) 这一战斗机能够抵御,而伊里野是唯一仅剩的黑蝠鲼的驾驶员;也就是说,她的乐意于否决定了人类的命运。除了《伊里野》,近期上映的天气之子也可以说是典型的世界系作品。

在此基础之上,作为21世纪初的小说,《伊里野》还在很大程度上受95年上映的《EVA》的影响:从大的角度上,世界的危机往往轻描淡写,而将镜头对准主人公的日常生活;从小的细节上,故事都发生在夏天,男主角都是弱受。

小小杂感

虽然浅羽是《伊里野》的主人公,但如果要问为什么浅羽平淡无奇的生活中为什么出来了一个UFO的夏天,那就不得不提园原中学新闻部部长水前寺了。

水前寺长得英俊,身高出众,成绩优秀,体育得意,惟一的缺点,就是他是一个怪人。这个怪人不喜欢女生、不喜欢交际、唯独喜欢研究超自然现象,并且每个季节就会换一个主题。在冬季,水前寺占领学校广播站,在上课时间做全校范围的ESP实验。而在春季,为了研究灵异现象,水前寺带着浅羽晚上跑到女厕所去调查是否幽灵出没;而到 6 月 24 日,当浅羽写好了关于校园灵异现象的文章准备发到社刊《园田电波新闻》的时候,迎接他的不是水前寺的赞许,却是一句:

「过时啦啊啊啊啊啊啊啊啊啊啊啊啊啊」

对水前寺来说,从 UFO 之日开始,灵异现象的春天早就结束,UFO的夏天就开始了。

即使这样,浅羽也毫无怨言,放弃了准备好的材料,默默地跟着水前寺跑到园田空军基地旁边的山上,找了一个暑假的UFO。

所以,当最后浅羽拒绝水前寺的时候,我知道他变得独立了。也知道,UFO的夏天,真真正正落下了它的帷幕。所以也用原文的这一小段,来做全文的总结吧。

结语

“就算只有我一个,我也要继续做下去。”

“做——是指做麦田怪圈吧。”

“是”

“就算只有你一个”

“是”

“无论如何”

“是”

然后,水前寺笑了起来。每年每年,不少的女生都会被这笑容诳骗,做出把贵重的纸资源变成情书塞进水前寺的鞋箱里这种最愚蠢的行径。

“随你喜欢吧”

浅羽脸上也浮现起笑容。

ホロ's avatar

状态回报 - 20191119

这啥?

嘛咱也不知道叫什么好 😂(汝翻翻之前起这种 slug 的文章?)

在不同的地方写不同的字

就像标题一样,咱要挖新的大坑啦(?)……

  • 约伊兹的萌狼乡手札 Another (名字什么的最难起了),在折腾了那么久博客软件和生成器后还是回到最早用的 WordPress 了…… (因为 Like Button 这时候只支持 Matters/Medium 和 WordPress 鸭……)之后好多图的文章大概会发到那里。

  • KenOokamiHoro @ Matters

    Matters 是一個以分佈式網絡為基礎、加密貨幣驅動的公共討論平台。

    所有在 Matters 上發佈的作品(不含評論),皆會上載到星際文件系統(InterPlanetary File System,IPFS)的節點上,實現作品內容的分佈式存儲,完成將數據回歸創作者的第一步。

    Matters 希望圍繞公共議題、知識生產,重構內容價值生態,搭建優質社群平台, 保護創作版權;以獨特算法令優質內容浮現,以數字貨幣讓創作者、參與者獲得持續回報。

    2019 年 10 月,Matters 和 LikeCoin 聯手,將 LikeCoin 這一基於寫作者創造力為衡量的 加密貨幣引入到 Matters 自由創作和公共討論空間之中,平台效應以收入的形式回饋給作者。

    Matters - 关于我们

    初期大概会把这边不会更新的文章放上去吧(因为 IPFS 的特性以致于 Matters 不能编辑已发表的文章), 以后可能会新写些什么。

    除了给文章点赞以外,大家也可以考虑 加入赞赏公民 , 助力咱和各位独立作者。

  • 至于这里嘛,咱只能讲短期内不会消失,不敢保证一直都在呐…… 这里应该还是以平时 折腾的记录为主了。 剩下有些关于朋友和生活的系列文章可能会先改在 Another 上发布。


大概就是这个样子……

Chawye Hsu's avatar

除了 GitHub 官方移动客户端,还有这些东西值得注意

不管是 GitHub Game Off,抑或是 HacktoberFest,都是 GitHub 近些年来,每年固定参与举办的活动。像去年的 HacktoberFest 我就有参与,虽然就是做个说难不难 PR 任务,相关文章 ——《历经数月,GitHub 章鱼猫寄来的 T 恤竟然……》,也是挺有趣的(今年的 HacktoberFest 我也参与了,Game Off 也挺想参与,但我一次 gamejam 都没玩过太水了)。

GitHub Universe 倒是一个更加正式的开发者大会,每届都会发布一些关于 GitHub 的新功能新特性,以及其合作友商的动(A)态(D)。不知道是不是我的错觉,总觉得被财大气粗的微软收购后的 GitHub,搞起各种事情来,就跟同样被微软收购的 Minecraft 搞起 MineCon 一样,越来越正式高端大气上档次了。不过也是因为这都已经是好几届过来的活动了,举办流程都颇为完善。


这次的 GitHub Universe 还是蛮有看点的,干货不少,不过好像都被 GitHub for mobile 这颗耀眼的星给掩盖了。毕竟是“千呼万唤”的官方移动客户端,大家终于等到了。其实除了 Official Mobile App 外,大会上还公布了好几个提升使用体验,值得被注意的新特性。

GitHub Universe Day One Keynote

重点还是在第一天的 Keynote,分为了三大主题:代码上云(Code to Cloud)、日常使用体验(Daily Experience)以及社区(Community)。其中第二部分最多干货,第三块有点惊喜。

TL;DR

主题 产品/特性
代码上云 CI/CD 产品 Actions 及包托管平台 Packages 全体用户免费可用
日常使用体验 官方移动客户端(GitHub for mobile)
桌面客户端迭代(GitHub Desktop)
代码导航(Code Navigation)
改进的搜索功能(Code Search)
代码审查智能派发(Code Review Assignment)
定时提醒器(Scheduled Reminders)
重新设计的通知功能(Notifications)
社区 Sponsors 迭代,支持团队/项目发起赞助
存档服务(Archive Program)及北极代码库(Arctic Code Vault)

代码上云

早前发布的两款重磅产品,GitHub Actions 和 GitHub Packages 正式发布,所有用户免费可用。

Actions and Packages

我实际试用了 Actions,用起来确实是非常赞的。可算是“一站式”解决你的 CI/CD 需求了。


日常使用体验

这一部分更新很多,都是些很能提升效率和体验的改进或者新特性。

1. 桌面客户端更新

GitHub Desktop

这一部分没什么特别亮眼的,就是比较常规的更新介绍。平时有使用 GUI 的话用起来应该会更加得心应手。

用 GitHub Desktop 你能省去很多 git 指令

2. 代码导航 & 改进的搜索功能

上来首先就介绍了两个很实用功能点。第一个是「代码导航」,这个功能其实早前已经有在测试了,可以让你在浏览仓库代码时,方便地在函数等定义之间跳转。现在还可以查看到函数被引用的位置。GitHub 内部用于分析代码找出定义的类库 semantic 也是开源的,不过代码导航这个功能目前只适用于少有的 Python、Ruby 以及 Go 几种语言(GitHub 上的头号热门语言 Javascript 没被支持,哈哈)。

Code Navigation

搜索功能被进行了一次大改,新的搜索终于可以做到大小写敏感、完整精确的匹配了。可以看下面两张对比结果感受一下。

改版前 改版后

搜索这个功能是我经常经常经常用到的。就我个人而言,这个真的是一个“杀手级”的更新,太实用了。搜索功能不好做一直都是技术圈里普遍认同的,特别是中文,更是如此。我有过一段学习自然语言处理的时光,里面的学问真的很多。

新的搜索功能可以在这里进行申请。

3. 代码审查智能派发 & 定时提醒器

这两个都是针对团队/组织的功能点。团队管理通过指定不同的代码审查派发模式,可以做到自动安排不同成员进行 Code Review,责任平均分配。

定时提醒则是整合 Slack。设置定时器后,可以按既定时间发送代码审查等信息到 Slack 中,更好地帮助团队进行工作。

4. 重新设计的通知功能

这个也是一个大的改进,在没有看到这个新设计的通知功能前,我是真没明着抱怨过 GitHub 的通知有多难用。但看到这个新界面后,我才从心里发出感慨 —— 原来通知页还能改得更好用的。直接在通知功能里面就能处理所有消息,终于不用点一下铃铛点一个消息,处理一下,再点铃铛处理其他消息了。

更方便地处理你的通知消息

5. 官方移动客户端

最后一个就是很多用户期待已久的移动 APP 了,这个是官方的、全功能、免费的、原生的客户端。

GitHub for mobile

作为 iOS 用户,我一直在用的是付费版的 CodeHub,听说 Android 用户比较多用的第三方客户端是 FastHub。这次 GitHub 推出官方客户端功能齐全,颜值看上去还高,想必会吸引到许多人去使用的。

随时随地处理你的拉取请求

而且还有暗黑模式,以及针对 iPad 设备优化了的展示形式。加上全功能的 Photoshop,iPad 的生产力这下真的是提升了很多很多了,虽然我朋友还是认为用来在被窝里看剧是最好的用法。

GitHub for mobile 的 Beta 测试可以在这个地址申请。


社区

除了介绍万年 Beta 期的 Sponsors 赞助功能开始支持组织/团队外,作为压轴公布了两个充满社会意义的项目 —— 存档服务(Archive Program)与北极代码库 (Arctic Code Vault)。

GitHub Archive Program 将会与斯坦福图书馆、互联网档案馆(Internet Archive)、 Long Now 基金会等合作,共同尽最大可能地为后代保留全人类的共同财产 —— 开源软件。

存档服务计划

同时 GitHub 还将会在 2020 年 2 月 2 日为所有活跃的公共存储库进行快照备份,利用寿命可达 1000 年的特制胶片存储这些备份,运送并保存到北极一个地下废弃煤矿中。著名的国际种子基因库,就坐落在这里 —— 斯瓦尔巴特群岛。

北极代码库计划

最后,以北极代码库的宣传片做个结尾。挺佩服和欣赏这些大公司,不再只有顾着在商业上发展,更有在为人类社会未来做出贡献。即使有发展公共关系的成分在里面,不论如何也都是值得被支持的。SpaceX、Microsoft(Minecraft、GitHub)、蚂蚁金服……

's avatar

在树莓派(Raspbian)上安装最新稳定版 nginx

如果需要在 Raspbian 上安装最新稳定版 nginx,其实官方是 提供了 Debian 的 apt 源 的,但是并没有提供 armhf 的二进制文件。

于是,我们只好自己通过 Debian 的方式编译安装了。

此方法优点

  • 安装好的 nginx,配置文件路径、维护方法等与官方 Debian 版 nginx 一致
  • 如果需要卸载 nginx,只需执行 sudo apt purge nginx

步骤

1. 安装添加官方 apt 源前所需的包

sudo apt install curl gnupg2 ca-certificates lsb-release

2. 添加官方 apt 源

# 添加官方 apt 源。与官方说明不同的是,由于我们需要源代码,这里添加的是 deb-src 而不是 deb
echo "deb-src http://nginx.org/packages/debian `lsb_release -cs` nginx" | sudo tee /etc/apt/sources.list.d/nginx.list

# 添加 PGP 公钥
curl -fsSL https://nginx.org/keys/nginx_signing.key | sudo apt-key add -
sudo apt-key fingerprint ABF5BD827BD9BF62

# 下载最新的软件包列表
sudo apt update

3. 安装 nginx 所需的依赖

sudo apt build-dep nginx

4. 下载 nginx 的源代码

# 建议单独建立文件夹来存放此次 nginx 编译所需文件,因为你的工作目录会多出若干文件
mkdir nginx_build
cd nginx_build

# 下载源代码
apt source nginx

5. 编译安装

此时我们检查目录下有什么文件:

drwxr-xr-x 10 tcdw tcdw    4096 Nov  5 03:20  nginx-1.16.1
-rw-r--r--  1 tcdw tcdw  114248 Aug 13 17:17  nginx_1.16.1-1~buster.debian.tar.xz
-rw-r--r--  1 tcdw tcdw    1510 Aug 13 17:17  nginx_1.16.1-1~buster.dsc
-rw-r--r--  1 tcdw tcdw 1032630 Aug 13 17:17  nginx_1.16.1.orig.tar.gz

由此可见,此次我们需要先进入 nginx-1.16.1 文件夹。实际文件夹名称可能会由于版本更新而与本文不一致,但应该只有那一个文件夹,且所有相关文件 / 文件夹均以 nginx- 开头。

cd nginx-1.16.1

开始编译安装:

dpkg-buildpackage -uc -b

完成后,返回上一层目录,发现我们的目录中出现了 nginx_1.16.1-1~buster_armhf.deb 文件。我们现在可以开始安装了:

sudo dpkg -i nginx_1.16.1-1~buster_armhf.deb

大功告成!

升级新版本

重复第 4 - 5 步即可。

ホロ's avatar

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

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

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

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

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

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

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

's avatar

攻防世界 PWN 新手区 Writeup *萌新向*

咕咕咕,咕咕咕咕咕咕,咕咕咕咕咕咕咕咕咕
依云's avatar

Poker II 键盘调教记

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

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

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

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

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

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

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

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

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

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

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

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

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

sudo systemd-hwdb update
sudo udevadm trigger

就好了。

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

17windy's avatar

17Windy的A18原创MOD合集-[近战包+枪械包] V1.1稳定版 (1107)

最近更新日期:11月7日

最近实在是太忙太忙太忙了 不上图了 大家自己进游戏体验吧 新武器也都是专属模型

PS:MOD的设计也有根据原版弹药不额外拓展口径的初衷,因此军武达人不要埋怨某武器口径不对2333

前言:

A18出了好多天了也没出个正理八经完美适配A18的武器包,只能自己动手。

该组合包都是由17windy基于A18的数据和MOD标准全新制作,非移植包。

该组合包的原则是基于对A18原始武器库的补充和完善,并不会去追求变态属性,各项武器参数都做了较为完善的平衡。

该组合包的适合难度为4或者5。

 

更新记录:

1107枪械包V1.2
添加了5把新武器:
1快速近战锐器 有几率触发大量流血特效
1短管霰弹枪 能够增加持有者的移动速度 弥补霰弹系列缺失
1支援用机关枪 降低持有者移动速度 巨大弹容 弥补支援用机关枪系列缺失
2狙击(其中一把为特殊贡献玩家专属,不掉落)

枪械包V1.1

武器属性再平衡。

近战包V1.25

武器属性再平衡和模型调整优化。

近战包V1.2

增加了一款试做剑盾类武器,属于防御装备,缓慢,高防御,同时享受大锤和剑刃技能加成(只能采用拳套的动画,因此一直举着盾挺挡视线的,适合坦克和乌龟流玩家);

重新设计的新的shader和调整了材质,各个武器更有质感;

修正了一点小bug,例如钢爪现在可以正确造成流血效果了。

近战包V1.1

增加了两款拳套类武器;

调整了拾取表,大幅度降低对枪械池的污染。

V1.0

初版

 

说明:

枪械包内的Vector野地秘行和鲤鱼王大锤未添加掉落列表,是作为优秀玩家的独特奖励存在的。

其他所有道具均可掉落,只是根据强度,掉率不同。

 

如何安装:

解压放进mods文件夹,注意看看路径别套娃。

 

获取:

搜刮和任务奖励。

 

如何汉化:

不需要,直接放进Mods文件夹就可以了,内置汉化文件。

 

转载须知:

本MOD由17windy制作,欢迎在国内七日杀网站转载或者整合包作者整合,转载或整合请备注该MOD作者17windy。

禁止转发到国外任何网站,开发组不给发官方中文支持,俺也懒得给他们英化。

 

关于更新:

本MOD更新周期暂定于A18版本生命周期,目前发布这个组合包版本趋于稳定,以后如果有时间才会添加新道具。

 

下载在哪:

1.1

链接:https://pan.baidu.com/s/1Gb9Cc5QjSC086CxidZGA_A

提取码:eqor

1.0

链接:https://pan.baidu.com/s/1r2ZHqb2r0nzQaRXWAZ-63w

提取码:9gir

 

PS:为什么枪械包里面会有铝热剑和弩炮啊?因为这俩比较现代化,所以归于枪械包了。

ホロ's avatar

Arch Linux 的衍生发行版们

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

TL;DR

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

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

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

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

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

于是衍生发行版们登场了

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

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

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

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

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

ArchWiki:Code of Conduct

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

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

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

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

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

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

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

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

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

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

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

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

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

IceHoney Blog's avatar

计算贝塞尔曲线的长度

贝塞尔曲线是工业上经常用的一种曲线,经常用用来汽车的外观设计。贝塞尔曲线根据控制点的不同可以分为:

  1. 一阶贝塞尔曲线(2 个控制点)
  2. 二阶贝塞尔曲线(3 个控制点)
  3. 三阶贝塞尔曲线(4 个控制点)
  4. n阶贝塞尔曲线(n+1个控制点)

二阶贝塞尔曲线

这次讲述的是二阶贝塞尔曲线的长度计算。首先计算曲线的长度之前,我们需要知道曲线的数学方程表达式,由于目前博客还未支持数学表达式的显示,所以我只能帖出wiki链接。求曲线的长度,本质上是很难计算出精确值的,但只要近似值的误差绝对小,在实际使用中也是足够的。求曲线的长度本质上是进行定积分的计算。

高斯求积

在定积分的数值计算中,高斯求积可以说是一个精度非常高的公式。

我们只需要把二阶贝塞尔曲线代入高斯求积公式中便可以计算出结果,求积公式的节点个数n越大,精度就越高。

不过高斯求积公式中节点个数对应的位置和权重表的计算,我还是没弄明白。

代码实现

已经有人给出了代码实现,所以大家可以直接去Github上查看bezier.js

并且有详细的解释:Arc length

总结

曲线的计算都可以归纳成对定积分的计算,只要知道曲线的数学方程式,就可以使用定积分的数值计算来计算出结果。

引用

A Primer on Bézier Curves

HY's avatar

Story of Seasons: Friends of Mineral Town

矿石镇重制版终于放出了,连着肝了好几天,在游戏内第一年结束前成功搞定诅咒农具+结婚。 这次的重制版整体来说还是 […]
17windy's avatar

[七日杀A18] 17windy的幻想风格武器包 Ver1.1

更新记录:

V1.1

增加了两款拳套类武器;

调整了拾取表,大幅度降低对枪械池的污染。

V1.0

初版

前言:

A18的枪械武器平衡很棒,近战武器略为弱势,种类也较少,简直逼疯懒人,好多天了也没出个正理八经完美适配A18的武器包,只能自己动手了。

说明:

武器包内包含11把适配各个近战天赋的新武器,属性各异,模型与人物适配度高,不是那种常见的塞一堆武器不管平衡和特色那种包(不包含拳套,这个调整起来麻烦,之后加)。

另外求弓、弩武器的A18文件与动画结构(官方太抠了)。

如何安装:

解压放进mods文件夹,注意看看路径别套娃。

武器获取:

搜刮和任务奖励。

如何汉化:

MOD文件夹内有Localization.txt

里面是汉化文本,请自行添加到7 Days To Die\Data\Config\Localization.txt文件的最后,就有汉化了。
(emmm,算是专门为a18开发的市面第一个近战武器模组了)

转载须知:

欢迎在国内七日杀网站转载或者整合包作者整合,转载或整合请备注该MOD作者17windy。

关于更新:

本MOD更新周期暂定于A18版本生命周期,会添加更多的武器和玩法,例如匕首+长棍合成矛等。

下载在哪:

链接:https://pan.baidu.com/s/1D8KrNdJj4iCItxEHyp6FvQ&shfl=sharepset
提取码:14s7

OX's avatar

在家架設一台郵件伺服器的全套過程記錄

Why 明明有各種免費的企業郵局,為什麼還要自建郵件服務器? 因為我域名太多了。另外我精力旺盛。自建一個屬於自 … 閱讀全文 在家架設一台郵件伺服器的全套過程記錄
ホロ's avatar

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

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

为啥要搞这个?

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

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

算了概念用到时再解释 😂

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

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

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

推荐阅读: Arch terminology#RTFM

首先说点废话

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

  • 看得懂英语的话最好还是看官方的 …

依云's avatar

红黑树到底是个什么树

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

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

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

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

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

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

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

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

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

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

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

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

红黑树的性质:

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

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

然后是树上的操作。

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

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

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

删除就更复杂了。

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

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

ホロ's avatar

和雨宫恋叶交换问题!

终于还是咕咕出来了?

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

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

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

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

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

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

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

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

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

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

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

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

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

    知らんけど~

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

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

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

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

    “咱不认识字。”

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

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

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

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

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

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

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

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

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

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

那么下一个是?

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

熟悉的感觉……

AlisterTT's avatar

古米

乌萨斯三杰算是都画完了…

AlisterTT's avatar

真理

乌萨斯hardbass三杰之二:真理。

IceHoney Blog's avatar

使用Docker运行node项目

null
IceHoney Blog's avatar

求经纬度两点距离

最近一直在做和地图相关的开发,所以一直在研究坐标系,投影相关的知识。整理下,供自己查阅。接下来就讲述描述地球的几种坐标系。

世界大地测量系统

世界大地测量系统(World Geodetic System)就是我们常说的经纬度,维度指得是当前地点和赤道的夹角。所以赤道的纬度(Latitude)是0,北极是正90,南极是负90. 经度是本初子午线(Prime meridian)为分界,东边是东经(正值),西边是西经(负值)。当经度为180度的时候,我们称之为对向子午线(antimeridian)。当跨过对向子午线的时候,很多相关计算都需要特殊处理,需要注意。这里计算两个坐标的距离的话,由于是球面,其实计算的是两个坐标沿着球面的弧线。本质思想是求出两个坐标的夹角,然后乘以地球半径得出结果。详细细节可以参考Calculate distance, bearing and more between Latitude/Longitude points

麦卡托投影

世界大地测量系统是三维描述地球的位置信息,对于导航或者显示来说很不方便。所以在平面上使用麦卡托投影(Mercator projection),可以把三维平铺到二维。但是注意,麦卡托投影会使面积发生变形。所以投影出来的坐标是不能直接用来计算距离的。维度越高,变形就越大。所以需要计算比例因子来纠正。但对于两个坐标纬度相差比较大的情况下,计算就更复杂了。所以不推荐使用麦卡托投影来计算距离。

笛卡尔坐标系

笛卡尔坐标系(Cartesian coordinate system)也称直角坐标系,是我们高中时学过的坐标系。我们可以通过经纬度和地球半径来计算出直接坐标系的X,Y,Z。然后通过直角坐标系中求两点距离公式,计算出两点距离,不过这个距离是直线距离。如果两点距离很远的情况下,可以看作是我们穿过地球的直线距离。可以借助Cesium的Cartesian3库方便的完成笛卡尔坐标系的转换和距离计算。

MapKit 投影

苹果的MapKit,基于麦卡托投影把经纬度转换成二维坐标。而且做了相关的数学运算,保证投影之后的数值可以像在平面坐标系一样计算距离。不过苹果的实现未知,我也无法在Web端使用。

总结

坐标系计算中有时候需要考虑坐标的高度信息计算距离,有时候需要计算已知坐标,角度和距离,求另一个坐标, 求两个坐标的插值。 目前还没有找到合适的计算库来解决这些问题。如果大家有相关的建议或者意见,欢迎评论。

参考:

geodesy

Displaying Maps

WGS84 To Mercator

AlisterTT's avatar

凛冬

这两天在肝明日方舟,就顺手用sketch涂了个乌萨斯大狗熊的头。我并不是凛冬厨,主要是土嗨的hardbass实在太带感了,等电脑腾出空间来一定要用garageband做一段出来…

依云's avatar

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

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

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

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

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

啥也没有?

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

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

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

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

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

依云's avatar

关于称呼

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

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

不可接受的

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

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

不建议的

大佬、老师、大大,等

建议

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

依云's avatar

NVIDIA PRIME 配置笔记

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

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

2019年11月25日更新:xorg-server 1.20.6 已经进入 Arch Linux 官方仓库,包含需要的补丁了。

2020年02月14日更新:现在也可以通过安装 nvidia-prime 直接配置好,就不用搞下边那些配置了。记得安装 nvidia(或者 nvidia-dkms 等)驱动包哦~

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

配置方法如下。

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

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

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

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

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

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

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

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

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

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

alias nvrun="__NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia"

然后就可以 nvrun minecraft-launcher 啦~

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

ホロ's avatar

香港之行s

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

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

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

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

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

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

一些清单(?)

过境

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

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

通信

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

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

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

消费

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

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

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

八达通 Octopus

一些印象

港铁

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

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

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

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

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

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

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

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

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

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

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

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

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

高速铁路

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

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

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

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

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

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

杂记

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

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

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

……已停止运行……


再见还是欢迎回来? 😂

's avatar

关于我被绑去中科大做学渣样本的事

60分刚好,一分不多,一分不少。 虽然有一种想把这句话当作座右铭的冲动,但是我明白对我来说,这充其量只是高考考了450的自嘲罢了。

网上翻了翻过去学校的分数线,在450附近的,感觉南阳理工学院还不错。学校录不少人,而且名字也好听。以后可以跟同学吹,自己是南阳理工的,反正他们十有八九也没听说过这个学校。

我躺在沙发上,幻想着多年以后高中同学会上的情形。六月下旬的太阳还是一如既往的毒辣,蝉还在外面聒噪,不过这都和在空调房里吃西瓜的我无关。

我今后的人生会不会就是进个60分的大学,找份60分的工作,过着60分的生活。其实也不赖,我想,只要不出意外的话。

正当我起身,去够茶几上的空调遥控器的时候,手机响了。

“您好,请问您是■ ■吗?”

是,我回答道。

接着电话告诉我我有一份 EMS 的信件,要我到楼下去拿。

我不知道送的是什么东西——最近半个月在网店上没买东西,618的活动页面上去转了一转,也没看到什么想买的。主要还是因为穷,穷限制了我的想象力。

我穿着拖鞋,一边咒骂着炎热的夏天和不能送上门的邮政,一边怀着对快递的期待,下了楼。


当 EMS 的名字传入我的耳朵里的时候,我就该想到这是文件而不是新手机或者什么炫酷玩意儿了。抱着半放弃的心情望向扁扁的信封,上面写着“中国科学技术大学”,下面的地址是安徽合肥的一个地方。

我现在才知道这大学在合肥。

不,我现在才知道有这大学。清华北大是家喻户晓,复旦上交我也略有耳闻,这个中国科学什么大学真的从来没进过我的耳朵。为什么冠着中国名称的大学却在合肥,我也不清楚。上网一搜,什么985、C9,听起来好像挺厉害的样子。

回到家里,我四下找了找小刀,没找到。就用钥匙了。

总而言之,这是一封录取通知书。

读完后,第一感觉是可疑。985大学为什么会给我发录取信?我也没有参加自主招生之类的东西,为什么会提前发过来。

晚饭的时候跟父母说了这回事。于是他们给招生办打了个电话。“你好,我们家孩子收到了你们学校的通知信……”“■ ■”“嗯”“噢”“这样”“好的”,然后挂了电话。

“学校说这是一个特别的项目,邀请像你一样的学生参加。”

“反正就去呗,也不会差到哪里去。”

“总比去什么技校好吧。”

再差也不会沦落到什么技校吧。


在火车上摇摇晃晃几小时后,又在公交车上摇摇晃晃半小时,终于到了学校的东区。马路这边是大门,那边是一家罗森,罗森好像在做什么活动,海报上画着一个卡通小女孩飘在空中,下面是炸鸡图片。

有点气势的长方形大门,走进一看,左半边拉着栅栏,只有右半边能进去,令人倍觉促狭。大概知道我是新生,门卫也没多问。

拖着行李又走了几步,感觉不太对。“这是什么味道?”我环顾周围,四下无人,只有蝉鸣。

丁字路口的地上有一个指路的海报,上面标了去往大礼堂的路:右拐,沿着路(这条路叫郭沫若路)一直往南就能看到了。路线简单点帮大忙了。

沿着郭沫若路又走了一会儿,路有点上坡,但走路没什么问题。

隐隐约约听到翻书的声音,越往前走,翻书的声音就越来越大。我突然感觉有点恐怖。我最终找到了声音的来源——一幢正面土红色的建筑物,像书本一样的东西从楼梯上方的门中喷涌而出。空气中的气味更加浓了。

这是什么鬼地方。

我有一种逃跑的冲动。

但好像有一种不可名状的的力量,拖着我的身体不由自主地往着书的冲积扇走去。我看向地上喷出的书,虽然书本不计其数,但是种类只有两种:电磁学千题解和——数学分析习题集。我感到一阵目眩。

“别动!”突然背后传来一声喊,没等我反应过来,我的手就被抓住了。

“快跑!”抓住我的手的人拉起我跑起来。行李被丢在原地。后来一合计,还好学校不给新生带电脑,不然就白给了。

当然跑的时候我没想这么多。顶多就是,她的头发飘到我脸上了,这种无关紧要的想法。

我们沿着来时的路往回跑,一路跑到了广场旁的一家白顶的小屋子才停下。推开玻璃门进去,我找了把椅子坐了下来。

“要不给你冲杯咖啡吧,边喝边说?”她看向柜台上的咖啡机。

看样子这是间咖啡店。

SgDylan's avatar

阿宅的霓虹之旅·东京篇

前篇中已写道本次旅行的重点实际上是 CM,因此东京才是舞台的中央。但因为各种不可预料相互叠加,最后以完全偏离预期结束。以下便是这几天的流水账。


SgDylan's avatar

阿宅的霓虹之旅·关西篇

算是作为新故事的铺垫,将一直因前途未定而搁置的旅行计划搬上了台面。原计划只是想去日本随便看看,顺便去体验一下全世界最大的同人展,但在粗略计算过开销后,发现仅在东京逛几天有些不值得,于是将行程拉长到一周,决定多走点想去的地方,就有了如下的内容。


依云's avatar

寻找最快的 GitHub IP

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

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

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

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

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

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

IceHoney Blog's avatar

Vue中如何设计面包屑

null
's avatar

驾照

今天我考了科目四,一次过关。

我从 2017 年 6 月就在驾校报名了,但是因为我的拖延症和一些客观原因,我的战线延续了整整两年:

  • 科目一:2017 年 8 月
  • 科目二:2019 年 1 月
  • 科目三:2019 年 7 月
  • 科目四:今天(7 月 26 日)

太丢人了,同样是 2017 年参加完高考的学生,我居然在两年后的夏天才拿本(捂脸

不过结果实现了,我也就这样变成了一位有证司机了,还是可喜可贺的。

依云's avatar

火狐远程调试火狐

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

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

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

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

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

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

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

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

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

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


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

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

Chawye Hsu's avatar

结合响应式图片实现更好的图片懒加载方案

作为在网页性能调优方面常被使用的技巧之一,懒加载或者说延迟加载是在谈及「前端性能优化」话题时不得不说的一项技术。
依云's avatar

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ホロ's avatar

iPod -- 在 2019 年

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

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

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

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

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

在 9102 年买一台 iPod

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

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

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

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

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

iTunes or Rockbox ?

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

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

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

Rockbox is a free replacement firmware for digital music players.

https://www.rockbox.org/

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

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

所以就是它啦(大嘘)

安装 Rockbox

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

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

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

一些魔改(?)思路

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

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

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

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

At last ......

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


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

's avatar

恋爱喜剧害死人

小千的一天从开始就很忙碌。

只听见她咚咚踏踏跑上楼,跑到一个卧室门前。

深深地呼气,深深地吸气。

用最大的嗓门喊:“起床了!!!哥哥!!!”

“今天的早餐是小千特制的培根煎饼和鸡蛋,记得吃哦。”她把装着早餐的盘子摆到餐桌上的空位前。

吃完早饭,整理好后,她对着门廊说:“我先走了。”

这就是小千的早晨。


小织是市立高中的二年级生,现在上完一上午课的她,正准备去吃午饭。

她收拾好桌面,抬起头,闯入视野的是她的两个好朋友,各自手里拿着午餐盒。一起吃吗,其中一个问道。

“哈哈……”她露出尴尬的微笑,但没说什么。

两个人互换了一下眼神。第一个人点了点头。

“你们去吃吧。”小织起身说道。

“回见。”点头的人说。

“保重。”另一个人说。

小织抱着午餐盒,慢慢悠悠地朝着社办走去。


课上,每个同学轮流朗读昨天留的作业:我的梦想。

轮到小夏的青梅竹马了,小夏看着他站起来,站得挺直,开始念道:

“我的梦想是成为一名消防员。这样在人们遇到危险的时候,我就能解救他们。

“在他们需要帮助的时候,我就能帮助他们。”

“我在电视上经常看到消防员们,他们舍己为人的精神深深感动了我,所以我也想像他们一样,成为一个消防员。”

……

当轮到小夏的时候,她醒了。小夏坐起来,环顾四周,她发现自己在学校旁公园的长椅上睡着了。

我当时的梦想是什么,是新娘吗?她问自己。

小夏笑了。夕阳在她背后,她一个人走在回家的路上。


小千回到家,发现餐桌上摆着一盘煎饼和鸡蛋。于是她倒掉了。

ホロ's avatar

AOSCC 2019 游记

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

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

……

Day -2 - 为啥咱没写 2017 ?

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

Day -1 - 为啥咱没写 2018 ?

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

Day 1 - Zzzz......

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

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

😂)

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

Lecture 催眠力 +100%

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

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

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

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

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

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

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

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

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

“常联系,啊” -- Mingcong Bai

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

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

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

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

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

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

話說午餐怎麼解決喵(

Mingcong Bai, [11.07.19 18:57]

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

饿着

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

Day 2


新 Codename 登场! 😂

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

刚将军与刚将军(

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

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

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

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

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

Day 3

现场拆机刷 coreboot 中……

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

咕咕咕预定(x

特首的大抄(雾)

另类面基证明(?)

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

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

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

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

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

Extras

主 谓 宾 (

要素察觉(

要素察觉x2(

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

One More Extras

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

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

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

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

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

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

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


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

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

Mingcong Bai, [14.07.19 20:25]


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

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

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

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

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

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

Mingcong Bai, [13.07.19 22:13]
Nope (

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

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

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

's avatar

空白的 2018

总而言之,Benpigchu 的整个 2018 年几乎什么像样的事情都没有做。如果是有心观察 Benpigchu 的人的话,大概已经发现这一点了吧。

现在看来过去的这一年和接下来的几个月会是人生中比较困难的一段时间了。

发生了什么

这个……我也不是很清楚,只能大概描述一下。下面的文字会比较混乱。

其实一直以来 Benpigchu 对于自己的未来一直处于迷茫,或者说是,逃避的态度,以至于没有为未来做任何的准备,所以也没有科研经验和实习经历。

而在 2017 年的后半,也就是大三下学期,迎来了 THU 计算机系的五大金刚课程(编译原理、网络原理、计算机组成结构、软件工程、信号处理原理)。这个学期可以说是榨干了我的行动力,虽然挺过来了,但是似乎也产生了一些不好的后果。

我们 THU 计算机系的保研安排是在大四下学期,在这之前我的家长因为看我犹豫不决,所以建议我争取保研,但是……总之我没有动力为这个目标去努力。到了暑假的后半,母上甚至来协助……或是强制我准备申请。这份好意我是理解的,但是在我的抗拒之下理所当然地失败了。

再之后就是这一年的后半,大四上学期。按理说我应该在此时通过秋季校园招聘找到一份工作,但是由于履历的缺失、简历投递少,我并没有获得一份 offer。然后就到了现在了。

过去的一年大概上就是这样的情况吧。

可是为什么不行动起来啊

你说得对,错的是我。

可是为什么我会是错的呢?我其实也不太清楚,但是似乎有一些线索在……确实感觉自己有些地方不太对。

一个……应该是比较低的自我评价。毕竟一方面自己没有什么建树,另一方面 THU 计算机系真是人才辈出,无论是什么方面都能找到能碾压你的人,自然就无法自信起来。更可怕的是这种思维一旦建立起来,就很难从外界改变,别人的赞美会被当做是恭维,而就算真的做到了什么也只会有“这不是大家都能搞定的事情么”而没有什么成就感。这种自我评价甚至还会自我应验,因为怀疑自己所以不敢尝试,因为没有尝试所以把事情搞砸。可以说算是一个蛮严重的问题的。

还有一个就是害怕和逃避未来吧。确实大学这几年来并没有思考过将来的打算,或者说是在害怕这种不确定性而不去做这种思考。事实上我能确定的比较大的计划仅仅是不去做某件事情而已。我不知道我的前路该如何走,我也不去考虑,所以我只能这样子混日子混下去。

于是我就成为了一个没有行动力的人。没有目的就没有推力,害怕结果就会产生阻力,最后当然什么也做不到。

于是,我的困境

现在的我是一个没有毕业去向的人。工作肯定是要找的,但是就算我是 THU 计算机系的,没有个像样经历,GPA 又低于半数同学,我能得到一个还可以的 offer 么?

由此引发而来的是来自家庭的压力。我既然是 THU 计算机系的,那肯定能有不错的前程。就算这句话以一种鼓励的语气说出来,也会被理解成一种过高的期许,甚至是一种嘲讽。我不知道我该如何回应这种鼓励,更不用说批评和鼓励了。

更重要的是我要如何修复这种糟糕的心态,毕竟长此以往就算有偶尔的成就,也于事无补的。

我要如何重回正轨?

我不知道。

也许我应该行动起来,但是我要如何行动起来,或者说有什么能让我行动起来?

我真的不知道要如何回答这个难题。

也许我写下这段文字就能帮助我解决一些问题,但是也许不会有什么实质性的效果。

总之祝我好运吧。也祝你们好运。

's avatar

你想救救BPC

总而言之,BPC 的毕业设计坠毁了,于是只能拿到结业证书。要想拿到毕业证和学位证需要再花一年时间重新进行毕业设计。

诶?

之前在这里讲过,过去的半年是 BPC 的人生当中比较困难的一段时期,于是果然 BPC 没有挺过来。由于毕设的导师是随机分配的,导师提出的毕设题目并不喜欢,而自己也没能想到更合适的题目。同时由于和导师沟通不善,进度一拖再拖,最后工作量上明显不够。于是毕业设计挂掉了。

在最后答辩的时候导师本来想帮我糊弄过去,但是我自己底气不足。果然该挂的还得挂嘛。

坏耶

坏耶

那 PingCAP 那边怎么样了

虽然没有在这里讲过,但是熟悉我的人应该清楚我去 PingCAP 实习了。实习期限是 3 月至 6 月,现在已经正常结束了。他们知道我毕设挂掉的情况,所以我们没有讨论更进一步的安排。来年我可能再去和他们联系吧。

实习前半还是进展良好的,不过中后段因为心理状态的问题有点吃力。同时可能是因为优先级问题 Mentor 也不太上心,一些东西比较拖。不过总体来讲 PingCAP 是家好公司,也想去实习的可以私下找我(?)。

值得一提的是他们的 Raft 实验的 README 是我写的,欢迎大家来做。

之后要怎么办呢

首要任务当然是毕设再生产顺利拿到毕业证。

至于其他计划,接下来一年里会有更多的空闲时间和更少的可支配资金,与之对应地各种未公开的计划也会发生微妙的调整,请等待之后的发表。

总之祝我好运吧。

Chawye Hsu's avatar

致五年 E3 青春:AMD YES! ITX 装机作业

哈哈哈,这次文章的标题有点假文艺。不过确实说的也是事实,在完成了这次整个平台的装机升级后,陪伴了我 5 年多的至强 E3-1230 v2 就被替下了,为性价比正式从牙膏厂跳到了按摩店。大学那年第一次 DIY 装机就选择了当时所谓的“一代神 U”、“卡吧标配”的 E3v2,从此开启了我的 DIY 装机“职业生涯” —— 哈哈说笑,也就可算是懂得了倒腾配置装机云云。
IceHoney Blog's avatar

GIthub如何省略每次输入验证信息

项目开发中经常会遇到CI自动拉取Github库的情况,我们个人使用的时候会手动输入账户密码信息,但是针对CI来说,我们一般会把敏感的认证信息放在环境变量里。所以针对认证信息的自动输入,需要做一些处理。

环境变量自动替换

针对 Travis CI,我们一般把认证信息放在环境变量里,所以在执行clone其他repo的时候,可以先设置认证信息。

git config --global url."https://${CI_USER_NAME}:${CI_USER_TOKEN}@github.com/".insteadOf "https://github.com/"'

这样设置的话,会自动替换git clone的网址。

URL里面写入认证信息

有时候需要以另外一个身份进行clone repo的时候,会直接在repo的URL前面加上认证信息。

git clone https://${USER_NAME}:${USER_TOKEN}@github.com/{username}/{repo}

这样可以很方便的clone信息,但是认证信息会存在当前库的git config文件里,有泄漏的风险。

netrc设置

netr文件用于存储网站的认证信息,一般位置在~/.netrc。格式是:

machine github.com
login username
password xxxxxxx

总结

总共有这么三种省略认证信息的方式,根据实际情况选择自己方便的一种认证方式即可。

参考:

GitHubでユーザ名・パスワード省略

Kouga's avatar

从 Ghost 0.x 升级到 2.x 的正确姿势

今天花费了一整天在这上面,终于成功了喵!趁着还没遗忘先整理一下正确的升级姿势供参考喵~

系统准备

注意!坑最大的竟然在这里喵!如果你的系统缺少一些组件会导致整个流程非常折腾喵……以下使用 Ubuntu 18.04 系统作为基准喵~

  • 安装必要软件包 apt install sudo build-essential curl (一些VPS登录就是 root 但是偏偏没 sudo 包……
  • 创建 Ghost 安装/维护账户:
sudo adduser {username}
sudo usermod -aG sudo {username}
sudo su {username}
  • 安装 NVM ,这一步很关键,因为 Ghost 的奇葩设计导致它只能在特定版本运行……
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash

升迁流程

  • 使用 NVM 安装 node 6.9.x 版本,nvm install v6.9.5 (Ghost 0.x 只能在该版本下运行

  • 启动 Ghost 0.x node index.js

  • 进入后台管理页面,在 Lab 里导出(Export) 全站 json ,在 Design 里下载主题 Theme

    当然你如果用的官方主题并且只是修改过 Disqus 的话,主题完全可以不用下载,直接去官网下载最新主题并插入修改的代码即可。

  • 做完备份后 Ctrl + C 停掉 Ghost 0.x 版本

  • 新建一个 ghost-xxx 目录,准备安装 Ghost 1.x 版本

    这里才是重点问题所在,Ghost 只能按照 0.x -> 1.x -> 2.x 的顺序升级,而 1.x 和 2.x 依赖的 node 版本竟然不一致(扶额

nvm install lts/carbon
npm i -g ghost-cli@latest
cd ghost-xxx
ghost install --v1 # --db=sqlite3 #如果使用 sqlite 数据库
vim config.production.json
  • 在开启的 vim 中仔细修改 config, 否则各种作死起不来……而且不兼容之前的 config.js 配置……我的配置供参考(密码密钥什么的是没有的喵~ :
{
  "url": "https://kouga.us",
  "server": {
    "socket": {
      "path": "./content/注意如果用 Linux socket,则路径必须在 content 下面否则权限错误",
      "permissions": "0666"
    }
  },
  "database": {
    "client": "sqlite3",
    "connection": {
      "filename": "./content/??????"
    }
  },
  "mail": {
    "transport": "SMTP",
    "options": {
      "service": "???",
      "auth": {
        "user": "???@???.???",
        "pass": "????????????????????????????????"
      }
    }
  },
  "logging": {
    "transports": [
      "file",
      "stdout"
    ]
  },
  "process": "systemd",
  "paths": {
    "contentPath": "升级的时候要注意这个绝对路径!"
  },
  "bootstrap-socket": {
    "port": ???,
    "host": "localhost"
  }
}
  • 使用 ghost run 尝试运行,如果成功,直接去站点后台 /ghost 路径完成初始化向导

  • 初始化完成后,直接在管理页点 Lab -> Import File -> Import ,等待完成

    这一步可能会出现大量警告,注意看警告都是哪些 Post,可能要用 vs code 一类能编辑大文件的工具来修正对应的 json 错误……(扶额),但是其中关于 duplicate content/theme 可以忽略,因为本来就导不进来

  • 导入完成后去 Posts 里看看文章是否正常,如果 OK 则再次进入 Lab 进行一次导出(避免后续升级失败再来一次 v0.x -> v1.x 数据转换……

  • 做完导出后 Ctrl + C 停掉 Ghost 1.x 版本,准备升迁到 Ghost 2.x

nvm install lts/dubnium
npm i -g ghost-cli@latest # yesterday once more
cd ghost-xxx
ghost update # 心惊胆颤的等它完成
ghost run
  • 在新启动的 Ghost 2.x 后台 /ghost/ 下登录,看看 Post 是否还在,主站现在可能是个 500 状态,因为主题还没安装;
  • 进入 Design 重新上传并激活主题
  • 进入 Lab 关掉旧API兼容等等不安全开关
  • 一切就绪后可以 nvm uninstall {version} 清理一下前面安装的多余 node 版本,并且 ghost brust 清理一下 yarn cache.

好,重新开始写作喵!

Phoenix Nemo's avatar

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

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

案例 1

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

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

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

案例 2

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

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

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

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

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

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

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

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

论点:实现,调整,优化

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

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

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

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

论点:架构的改动

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

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

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

ホロ's avatar

各自开始的新生活

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

结束了。

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

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

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

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

…………

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

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

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

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

我再声明几点:

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

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

愿他安好。

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

开始了。

开始了?

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

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

服务故障……

由于青色旋律的一些疏忽,导致博客有一段时间无法访问。现在已经修复……

至于何时恢复更新……

咕,咕咕咕?

Chawye Hsu's avatar

35 年后,竹内玛莉亚的《Plastic Love》有了官方 MV

今天我们来谈谈音乐吧,这是我很喜欢的一个话题。聊聊音乐趣事,当然可能会扯到些扩散话题。 旧事物总有一天会重新闯入你的生活,即使那不是你的过去 2019 年 5 月 16 日,日本华纳音乐(Warner Music Japan)在流媒体网站 YouTube 上传了竹内玛莉亚(竹内まりや)的单曲《Plastic Love(塑料爱情)》的一支先行版(Short ver.) MV[1]。这首在 2018 年引起病毒式传播的歌曲,在发布的 35 年后,“意外地”拥有了它的官方 MV。
's avatar

宿舍用小型 UPS 电源与新台灯

去年 11 月,我购买了一部二手的联想手机,把自己的电信米粉卡塞了进去,用来运行 Telegram SMS 和开热点。这部手机其实一切都好,但是有个问题:电池不耐用。因为我们会定时熄灯,导致手机并不能 24 小时充电,因此:

  • 如果一直开热点,第二天就没电了。
  • 如果按需开热点可以解决,但这部手机开热点的过程很麻烦,需要进入多级菜单。

我其实还考虑过使用充电宝,但是:

  • 我的品胜充电宝,如果重新插入电源,那么充电过程就会中止,必须手工再启动一次。
  • 我的紫米充电宝,尽管可以即插即用,但是如果在断电的情况下手机充满电,那么就会自动停止充电。
  • 我的 Anker 充电宝,容量太小了(只有 5000 毫安)。

虽然我理解这些充电宝的设计是有道理的,但显然不能满足我的需求。几个月以后,忍无可忍的我决定试试传说中的那种适合宿舍用路由器的 UPS。

几天以后,UPS 到了。

我选购的这款 UPS 可同时提供 USB、5V 和 9V / 12V 输出(可以通过开关切换 9V / 12V);最大输出电流为 2A(所有端口总和)。

同时,它使用 DC 输入,非常节约空间。

我把它接上了我的手机,让这部 UPS 为我的手机持续供电。效果还是不错的:我同时开着 Telegram SMS、代理软件和热点,也不用担心手机中途断电啦。


不久以后,我们团队在一个省级比赛获得了一等奖,每个人都得到了这样的奖品:飞利浦台灯。

因为这部台灯使用 12V 输入,功耗很低,我便把它接入了我的 UPS。这样,即使熄灯也可以使用啦。

⇧ 旧的『宿舍神灯』。

⇧ 新的飞利浦台灯。从我的实际感觉看,光线还是比那部『宿舍神灯』要舒服的,而且还有四档调光,非常灵活。

总之,很开心获得这么一套装备升级。我可以变得更懒惰了!

20190612 更新:一加 3T

我的联想电池鼓包了,连盖子都盖不上了。考虑到这部联想的坑爹之处,我买了一部二手一加 3T 作为 Telegram SMS 服务器使用。

目前来看,它的电池并不是很坑爹,所以只需要用普通的 2A 电源定时充电即可。

于是这 UPS 的供电目标就只剩下那个台灯了。不过不知道未来还会发生什么…… 😅

Phoenix Nemo's avatar

WireGuard 真香

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

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

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

服务器配置

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

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

[Peer]

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

生成私钥

1
2
wg genkey > privatekey
chmod 600 privatekey

基于私钥生成本机的公钥

1
wg pubkey < privatekey > publickey

或者一步完成的操作

1
wg genkey | tee privatekey | wg pubkey > publickey

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

1
wg genpsk > preshared

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

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

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

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

[Peer]

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

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

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

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

客户端

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

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

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

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

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

总结

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

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

总之,真香.jpg

Reference:

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

Chawye Hsu's avatar

利用 CSS 媒体查询让网页配色跟随 macOS 深色模式

苹果公司的操作系统 macOS 从 10.14 Mojave 版本开始,为用户提供了深色模式的可选外观。用户可以在系统中的通用设置里选择启用深色模式,整个系统的界面会全局变为暗色调。对于夜间使用场景而言,深色模式的界面可能会显得更加友好,也更能让用户集中注意力。

Office 365 Dark Mode (Twitter @derek_snook)

利用苹果公司提供的接口,各类原生桌面应用程序都开始陆续支持深色模式,可根据 macOS 用户的系统设置进行换肤,比如 Google Chrome、Microsoft Office 等。

但对于 Web 应用而言,似乎还没有什么讨论。好消息是 CSS 的媒体查询(media queries)新增加了一个叫做 prefers-color-scheme 的媒体特征,开发者可以通过该设置特征,让网站的配色随着 macOS 系统的界面外观色调改变而改变。

/* 常规浅色模式下的网页背景颜色及文本颜色 */
body {
  background: #fff;
  color: #222;
}

/* 深色模式下的网页背景颜色及文本颜色 */
@media (prefers-color-scheme: dark) {
  body {
    background-color: #222;
    color: #ddd;
  }
}

prefers-color-scheme 支持三个值,分别是 no-preferencelight、以及 dark,对应是“无指定”、“浅色主题”以及“深色主题”。详情可以查看 MDN 说明。

这个还在 CSS 草案阶段的媒体特征[1],显然尚未被主流浏览器大规模支持,不过已经开始受到部分浏览器支持了。可以从 MDN 或者 Can I Use 上看到,Firefox 67 以及 Safari 12.1 开始支持该媒体特征。

prefers-color-scheme 兼容性

如果你是 macOS 用户,又正巧使用的是支持该特征的浏览器的话,可以通过切换系统的外观色调,查看到我的博客配色跟随系统色调的变化。

配色跟随系统色调切换而变化

除了 Firefox 浏览器之外,也可以用 macOS 系统的 Safari 查看到效果。

浅色 深色

图中的文章见《总结下博客最近的调整》。不过其实 prefers-color-scheme 只是帮助做到随系统自动变化而已,网站的深浅配色系统本身还是要开发者预先设计好。


  1. https://drafts.csswg.org/mediaqueries-5/#descdef-media-prefers-color-scheme ↩︎

's avatar

Dream Diary - 2.5

我站在一个小巷前。面前有两盏灯。

一盏,挂在左手边的墙上,灯是蓝色的。灯下面是一张破旧的办公桌,不知道是谁不用了丢在那里的。

另外一盏,稍微靠后,挂在右手边的墙上,鲜红色的。灯照亮了下面的一扇门。但奇妙的是,不像蓝色的灯那样,有灰尘在其中飞舞,红色的灯光中没有灰尘。光柱反倒像是什么实体一样,散发出象牙般的光泽。

我上前去试探红色的灯。我的手触摸到了坚硬的物体——好像这不是灯光,而是一块巨大的红宝石。

有点麻烦了,我想。我手上拿着这扇门的钥匙,可灯光却阻挡着我进去。

我回到外面,试图找到一点线索。当我眼睛瞟过那张破旧办公桌的桌角的时候,一抹白色引起了注意。

我凑上前去端详。是一副 3D 眼镜。不像现在常用的那种墨镜一样的 3D 眼镜。这是一块纸板,夹上红色和蓝色的透明塑料片做成的那种简陋的 3D 眼镜。

现在怎么还有这种东西,我心想。

我捡了起来,翻来覆去地查看。没有什么异常。但没有异常就是最大的异常,这东西不属于这里。

我看向两块塑料片,红色和蓝色

搞不好是这样,我想。我带上了这副眼镜,除了世界变得单色以外,好像没有什么变化。不对。

起先发出光泽的红色灯光,现在失去了那份光泽。好像光泽转移了似的,蓝色的灯光开始带起光泽。

这个世界因为你所见而不同,我想起不知道谁说的一句话。

总之现在是可以通行了,我掏出钥匙,开锁进了屋子。


进了屋子,一股腥臭味扑鼻而来。

拿了东西就走,不在这里呆着了,我告诉自己。

可这股腥臭味实在是令人难以忍受,于是我寻找窗户,给屋子换气。

我到了厨房,厨房的窗户紧锁,上面落满了灰尘,从里面看不见外面。这房子是几十年没住人了,我一边感慨,一边打开锁,推开窗户。

出现在眼里的是尸体。人的尸体。像垃圾一样堆在外面。垃圾桶里更是趴满了软体动物一样的死人,血顺着垃圾桶流下,汇聚到下水道。我感到一阵寒战,空气里腥臭味仿佛更浓了。

我立马把窗户重新关上,试图将刚才的景象赶出脑海。

我要找的东西是一个小盒子,首饰盒那样的。我很快就找到它了——它被放在靠里的卧室的床头柜上。我转头,想赶快离开这个鬼地方。

“我等你很久了。”背后突然有女声叫住了我。回头。女性坐在窗台上,黑暗中看不清她的脸。

外面打起了闪电,她的影子直伸到我脚下。

's avatar

梦日记 02

写在前面

跟第一篇一样,也是把做的梦做了点加工,放在这里。有的地方过于臭屁,以至于无可救药的地步,也只能死马当活马医了。

这是 23 号晚上做的梦。离第一篇差不多正好 10 个月。

1

我面对这家里堆满杂物的角落。

没经过多少翻找,我就立即发现它了。箱子体积很大,虽然藏在最深的角落里,但不难发现。

箱子很沉。打开之后是一把步枪。

我拿了出来,看着它修长的枪身,一股熟悉的感觉油然而生。

上一次用这把枪是什么时候了呢?模模糊糊的想起那次在荒野,开枪时激起的飞扬的尘土。除此以外就什么也没有了。

我突然感到陌生。我还知道如何使用这把枪吗?我还会使用这把枪吗?

我不清楚,但至少我知道,我又回到这里了。

2

口袋里的手机震动了起来。

回来之后,我没有联系任何人,在这种情况下会联络的,肯定是他了。

我不情愿的按下接听键,将手机放在耳边。

那一头传来的依旧是那个声音。我不知道他是谁,也从未和他见过面。听他的声音,我的脑海里浮现的是一个小个子的,带着微笑面具的少年。

“唷,过得还好吗?”他问道。

“嗯。”我敷衍地答应。

“哈哈,你还是这副老样子,”他咳嗽了一声,“任务来了。”

……

“你怎么知道我回归的?”在对话的最后,我问他。

“这还用说,”他笑了,笑声里没有温度,“我一直在看着你啊。”

3

我趴在一所废弃教学楼的四楼,几张拼在一起的破旧课桌上,透过瞄准镜盯着百米开外,土包上目标所在的小屋。

天气晴朗,无风。视野开阔,没有障碍。

但是当目标出现时,我没能开枪。

倒不是因为目标是一个小女孩或是孕妇:他是一个稀松平常,胡子拉茬的中年男性。也不是因为他的左右还有两个警察——不如说这是预想到的,我需要在他自首前将他解决。

只是单纯的,突然的,扳机变得沉重,没有扣下去。

是一股神秘的、难以控制的力量阻止了我;或是我重又对剥夺别人生命这一行为产生了犹豫?

不过对任务来说,这种无用的思考是有害的。我眨了眨眼,重新看向了瞄准镜。

4

过了一会儿,目标重新出现在视野里的时候,他到坡下停着的警车只有十几米的距离了。

要解决就趁现在。我准备食指用力的时候。

一瞬间,他停下脚步,抬起头,看向这边。像是透过瞄准镜,直勾勾的盯着我一样。

我才是目标,我突然有这样一种不寒而栗的想法。

但没有时间了,我扣下了扳机。

最后,他张了张嘴,好像在说什么,但我没法听见,也无心在意了。

IceHoney Blog's avatar

使用WebAssembly编译C++到JS

实际项目开发中遇到了一些已经使用C++实现的功能,需要在新的Web客户端使用。由于主要是数学和算法的计算,没有平台依赖性。所以需要一个成本最低的移植方式,显然WebAssembly是一个非常好的方式。现在官方的编译工具是emscripten

移植方式

从C++编译到JS。官方提供了两种编译方式embindWebIDL Binder。这两种方式,一开始我也很困惑。不过现在也是有所了解了。向大家介绍一下如何选择。如果你的C++项目中有很多高级数据结构要使用,例如vector,map。那推荐使用embind,如果你的项目主要是简单数据类型,例如数字,字符串,bool,都可以简单的映射到JS,并且是用class封装的,那推荐使用WebIDL Binder。

封装处理

由于C++数据结构比JS复杂的多,很多时候没有直接暴露成JS函数。我们需要进行封装,例如C++中的引用调用,可以改变传入的参数的值。但是编译成JS的话,就不会生效。所以这时候我们需要写wrap函数,封装这些引用调用的C++函数,然后再单独写get函数,得到修改的值。

webpack打包

官方的demo是使用src的方式来引入,并且暴露成Module的全局变量。但是现代化的Web项目都是使用webpack打包,并且自动化引入的。所以我们也不想为了WebAssembly搞特殊。接下来就讲述如何配置来引入。首先,使用emscripten输出 mjs 文件,这样才可以作为模块被导入。具体的编译参数可以参照emcc。 首先,wasm格式并不能被webpack正确识别,我们需要添加loader

{
  test: /\.wasm$/,
  type: 'javascript/auto',
  loader: 'file-loader',
}

然后在项目中,分别 import mjs文件和 wasm文件。

import lib from './wasm.mjs';
import libWasm from './wasm.wasm';

const module = lib({
  locateFile(path) {
    if(path.endsWith('.wasm')) {
      return libWasm;
    }
    return path;
  }
});

然后在调用的时候替换掉默认的locateFile函数,即可完美导入到我们的项目中。

总结

编译C++到JS,不仅需要JS的知识,还需要C++知识,我们需要先把所有需要的C++文件,先全部编译到LLVM bitcode(.o 文件)。这里编译C++可以使用GCC的全部编译参数,推荐使用O3参数来优化代码。最后编译到JS文件的时候,需要按照emscripten的规范来书写胶水文件。

参考:

webpack-emscripten-wasm

Chawye Hsu's avatar

总结下博客最近的调整

Old Days

我建博客始于 2013 年,时间也不长。那会儿也不过是一个从 WordPress 加免费空间入坑的新手,免费空间关了就买了个域名和虚拟空间继续折腾。啊对,也改成了 Typecho 一段时间,仿过几个主题。之后便是在流行之下,一个 commit 换成了静态博客 Hexo。于是开始在这个“自留地/实验室”里摆弄各种新玩意,做做小试验。没写过几篇文章,却也一直延续至今。

Changes

A. 核心系统

将使用了近 4 年的 Hexo 换下是博客最近最大的改变,换上的是基于 Vue、Webpack 等当前主流技术的 Saber 静态博客系统。

以 React、Vue、Webpack 等当代主流前端技术为基础的静态网站生成器系统持续出现并开始崭露头角,Gatsby、Nuxt、VuePress[1],势必会抢占 Jekyll、Hexo 等以字符串模版为主的“更加静态[2]”的旧式静态博客系统,我相信这也是这个社群中的趋势。

在最初规划迭代的时候,预期是更换至 Gatsby 这个基于 React 技术栈的系统,其中的原因是受到 Daniel Eden(知名 CSS 动画框架 animate.css[3] 的作者)的博客改版影响。他在稍早的一段时间将他的博客 —— daneden.me 从 Jekyll 换成了 Gatsby。我的博客受其影响很大,即使到目前为止,在我博客中你仍然能够找到一些来源于他的博客的设计元素。最明显的是在文章图文排版上的借鉴,在大屏幕下,你可以在如《推特背后的 Notch 之道》等文章中看到左右溢出的插图。这个我非常喜欢的排版设计,便源于:「Design Elitism」,我博客的整个排版系统很大程度上受他影响,只是彼此经过多次迭代,已不太能找出相似点了。

Gatsby

没有选择 Gatsby 是因为在我对 React 生态的还不了解,头疼一连串硬啃 React、GraphQL 等技术的时候,VuePress 出世了,我还是更倾向于相对比较熟悉的 Vue。

VuePress

然而,在我尝试 VuePress 后,其更加面向于项目文档的设计,让我感觉从 Hexo 迁移显得力不从心。对比 Gatsby 这或许是因为还是刚起步阶段,生态还不完善吧,截至目前其博客方面的支持还在陆续开发中[4]

于是我便在等待/寻找一款能让我更加平滑地进行迁移的系统。然后 Peco 出现了,并在后来被现在的 Saber 所替代。我不想在此大谈如何迁移至 Saber 的,真要这样或许会另起一篇文章写这个。只想说,非常感谢 EGOIST 的开源工作,让大家能够用上前沿的技术。

B. 主题外观

得益于 Saber 的系统设计,将我的原有 Hexo 自用主题迁移至新系统并没有感觉到费力。迁移后整体上我还是使用此前的主题,只是在原有的基础上完成了一些更加细致的迭代,使其更符合我的现存观感。除了调整了列表的布局变得紧凑些、完善响应式文字排版设计外,最大的一点是从以前一直使用的 CSS 预处理器 Stylus 切换成了 SASS,并用上了原版 Bulma 框架。在生态上,果然还是 SASS 更胜一筹。

Bulma.io

期间学会了几个以前不了解、不常用的 CSS 属性,并应用到了主题中。

  • text-align: justify; —— 文字两端对齐,在单栏布局中排版差异尤为明显[5]
  • font-display: swap; —— 修改 Web 字体加载显示逻辑,可避免字体下载过程中闪白[6]

不过整个主题目前还是有缺陷,只能后续随着时间推移再慢慢优化。

C. 部署架构

在我刚开始使用 Hexo 或者说刚入坑静态博客系统的时候,我就已经在使用持续集成工具来帮助我进行构建和部署工作,一直在使用 Travis CI 的社区版。静态博客系统通过使用持续集成做自动构建部署,真的能省下不少重复劳动。

旧部署架构

旧架构如此的原因是以前部署到 GitHub Pages 上觉得速度不行,同时又不支持自定义域名使用 HTTPS,我也有一台闲置的香港 VPS,于是就通过 Webhook 触发 VPS 同步 GitHub Pages 的内容,然后在 VPS 上使用 Nginx 提供服务,这样能解决前述的两个问题。后来因为域名的 SSL 证书过期(那时还没用 Let's Encrypt)和 VPS 不稳定的原因,就加了层 CloudFlare。然后就没管了,一直这样。

新部署架构

调整后实际上就是将提供服务的后端从 VPS 迁移到了 Netlify。其一是图方便,Netlify 自动申请 Let's Encrypt 不用自己麻烦在 VPS 上设置,其二是 Netlify 自带 CDN,速度还不错,最后是因为我需要调整整个博客各页面的固定链接,同时希望旧有的链接能重定向到新的固定链接上,保留可用性。而刚好 Netlify 原生支持重定向服务 —— Netlify Redirect,这样就不用因为 CloudFlare 免费版只有 3 个 Page Rules 而显得拘谨。

构建文件依然推送到 GitHub Pages 分支上后再同步到 Netlify 的原因是,我希望保留能够在 GitHub 仓库中查看构建后的文件的功能,构建后直接推送到 Netlify 上我就看不到构建文件和历史变更了。

Wappalyzer 检查

故意加了个假的 Hexo Generator 的 Meta 标签,所以被检测出用 Hexo(大雾)。关于这个扩展程序,可以看我之前写的文章《我都在用些什么 Chrome 扩展程序》里有介绍。

D. 其它变化

整个核心架构变化,于是现在托管仓库的项目架构也有所调整,改成了 Monorepo 并用 Lerna 进行管理[7]

修改了内容授权协议,具体可见 About 页面。因为细想了一下,真有人取走内容的话大概也不会在意你的协议,于是干脆放飞自我。

RSS Feed 调整,增加 JSON Feed 的支持,路径 /feed/index.json,同时原有的 Atom Feed 的路径会从 /blog/atom.xml 调整为 /feed/atom.xml,原有路径会重定向至新路径。

完整的迁移记录可见仓库 Commit Log


  1. https://www.staticgen.com/ ↩︎

  2. https://vuepress.vuejs.org/zh/guide/#hexo ↩︎

  3. https://daneden.github.io/animate.css/ ↩︎

  4. https://github.com/vuejs/vuepress/issues/36 ↩︎

  5. https://developer.mozilla.org/zh-CN/docs/Web/CSS/text-align#Justify ↩︎

  6. https://developer.mozilla.org/zh-CN/docs/Web/CSS/@font-face/font-display ↩︎

  7. https://github.com/h404bi/www.h404bi.com/tree/592c99120e8452a816d51fbec6fb7eabf3f15448 ↩︎

ホロ's avatar

离开 Google 的 Android 之路

好聚好散?

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

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

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

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

via these people and places