Recent Posts

SgDylan's avatar

DIY 显示器亮度自动调节

DIY 显示器亮度自动调节记录存档。

violet's avatar

Leetcode - Perfect Squares

https://leetcode.com/problems/perfect-squares/

Given a positive integer n, find the least number of perfect square numbers (for example, 1, 4, 9, 16, ...) which sum to n.

Example 1:

Input: n = 12
Output: 3 
Explanation: 12 = 4 + 4 + 4.

Example 2:

Input: n = 13
Output: 2
Explanation: 13 = 4 + 9.

 

violet's avatar

设计模式 - 工厂模式

意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。

主要解决:主要解决接口选择的问题。

何时使用:我们明确地计划不同条件下创建不同实例时。

如何解决:让其子类实现工厂接口,返回的也是一个抽象的产品。

 

violet's avatar

Leetcode - Hamming Distance

https://leetcode.com/problems/hamming-distance/

The Hamming distance between two integers is the number of positions at which the corresponding bits are different.

Given two integers x and y, calculate the Hamming distance.

Note:
0 ≤ x, y < 231.

Example:

Input: x = 1, y = 4

Output: 2

Explanation:
1   (0 0 0 1)
4   (0 1 0 0)
       ↑   ↑

The above arrows point to positions where the corresponding bits are different.

 

violet's avatar

Leetcode - Number of 1 Bits

https://leetcode.com/problems/number-of-1-bits/

Write a function that takes an unsigned integer and return the number of '1' bits it has (also known as the Hamming weight).

Example 1:

Input: 00000000000000000000000000001011
Output: 3
Explanation: The input binary string 00000000000000000000000000001011 has a total of three '1' bits.

 

violet's avatar

Leetcode - Palindrome Linked List

https://leetcode.com/problems/palindrome-linked-list/

Given a singly linked list, determine if it is a palindrome.

Example 1:

Input: 1->2
Output: false

Example 2:

Input: 1->2->2->1
Output: true

Follow up:
Could you do it in O(n) time and O(1) space?

 

violet's avatar

Leetcode - Remove Nth Node From End of List

https://leetcode.com/problems/remove-nth-node-from-end-of-list/

Given a linked list, remove the n-th node from the end of list and return its head.

Example:

Given linked list: 1->2->3->4->5, and n = 2.

After removing the second node from the end, the linked list becomes 1->2->3->5.

Note:

Given n will always be valid.

Follow up:

Could you do this in one pass?

 

violet's avatar

Leetcode - Valid Palindrome

https://leetcode.com/problems/valid-palindrome/

Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases.

Note: For the purpose of this problem, we define empty string as valid palindrome.

Example 1:

Input: "A man, a plan, a canal: Panama"
Output: true

Example 2:

Input: "race a car"
Output: false

 

violet's avatar

Leetcode - Count Complete Tree Nodes

https://leetcode.com/problems/count-complete-tree-nodes/

Given a complete binary tree, count the number of nodes.

Note:

Definition of a complete binary tree from Wikipedia:
In a complete binary tree every level, except possibly the last, is completely filled, and all nodes in the last level are as far left as possible. It can have between 1 and 2h nodes inclusive at the last level h.

Example:

Input: 
    1
   / \
  2   3
 / \  /
4  5 6

Output: 6

 

violet's avatar

Leetcode - Partition Labels

https://leetcode.com/problems/partition-labels/

A string S of lowercase English letters is given. We want to partition this string into as many parts as possible so that each letter appears in at most one part, and return a list of integers representing the size of these parts.

 

Example 1:

Input: S = "ababcbacadefegdehijhklij"
Output: [9,7,8]
Explanation:
The partition is "ababcbaca", "defegde", "hijhklij".
This is a partition so that each letter appears in at most one part.
A partition like "ababcbacadefegde", "hijhklij" is incorrect, because it splits S into less parts.

 

violet's avatar

Leetcode - Validate IP Address

https://leetcode.com/problems/validate-ip-address/

Write a function to check whether an input string is a valid IPv4 address or IPv6 address or neither.

IPv4 addresses are canonically represented in dot-decimal notation, which consists of four decimal numbers, each ranging from 0 to 255, separated by dots ("."), e.g.,172.16.254.1;

Besides, leading zeros in the IPv4 is invalid. For example, the address 172.16.254.01 is invalid.

IPv6 addresses are represented as eight groups of four hexadecimal digits, each group representing 16 bits. The groups are separated by colons (":"). For example, the address 2001:0db8:85a3:0000:0000:8a2e:0370:7334 is a valid one. Also, we could omit some leading zeros among four hexadecimal digits and some low-case characters in the address to upper-case ones, so 2001:db8:85a3:0:0:8A2E:0370:7334 is also a valid IPv6 address(Omit leading zeros and using upper cases).

 

violet's avatar

Leetcode - Serialize and Deserialize Binary Tree

https://leetcode.com/problems/serialize-and-deserialize-binary-tree/

Serialization is the process of converting a data structure or object into a sequence of bits so that it can be stored in a file or memory buffer, or transmitted across a network connection link to be reconstructed later in the same or another computer environment.

Design an algorithm to serialize and deserialize a binary tree. There is no restriction on how your serialization/deserialization algorithm should work. You just need to ensure that a binary tree can be serialized to a string and this string can be deserialized to the original tree structure.

Example: 

You may serialize the following tree:

    1
   / \
  2   3
     / \
    4   5

as "[1,2,3,null,null,4,5]"

 

violet's avatar

Leetcode - Find Median from Data Stream

https://leetcode.com/problems/find-median-from-data-stream/

Median is the middle value in an ordered integer list. If the size of the list is even, there is no middle value. So the median is the mean of the two middle value.

For example,

[2,3,4], the median is 3

[2,3], the median is (2 + 3) / 2 = 2.5

Design a data structure that supports the following two operations:

  • void addNum(int num) - Add a integer number from the data stream to the data structure.
  • double findMedian() - Return the median of all elements so far.

 

Example:

addNum(1)
addNum(2)
findMedian() -> 1.5
addNum(3) 
findMedian() -> 2

 

AlisterTT's avatar

板烧的LOGO

给板烧画了个水印用的LOGO,感觉有内味了,中文字体思源黑,英文字体Helvetica Black,感觉有内味儿了。

AlisterTT's avatar

吾有猫,其名为“板烧”

今年决定养只猫了,找到了一家靠谱的猫舍,店长每天都在勤勤恳恳的做着直播,目前观众还不是很多。

2020年6月5日,猫舍的小母猫铁扇公主生下了四只小猫,一只梵,一只蓝,板烧排行老三,以及排行老四、最可爱的蓝白妹妹。

板烧是四兄妹中最小的一只,但是很努力的在喝奶,这两天打开直播看到他,心里都在默默的说:“板烧,冲鸭!”

因为体型最小,所以也最努力喝奶的板烧

至于他为什么要叫板烧呢,开始想着如果选到了妹妹,就叫“茶茶”,选到了弟弟,就叫“信长”或者“秀吉”,可是朋友都觉得这俩名字太正经,于是探讨了大半天无果…后来小豆子建议选我最喜欢吃的食物,那当然是暴风雪或者麦旋风了,用来起名就欠了点,灵光一闪“板烧”这个名字就出来了,甚至已经做好了设定,等小朋友长大了就叫“大阪烧”(误)…

2020年6月12日晚上的板烧

小猫在妈妈身边要待六十天左右,估计八月份就能接回家了,板烧,一定要健康呀!!

farseerfc's avatar

系統中的大多數文件有多大?

你覺得,你的系統中大多數文件大概有多大?

這是一個很有意思的問題,你可以試着先猜一下。

基於對系統中保存文件的瞭解,可能有這樣的思考過程:

  • 我收藏了好多照片,每個有 2~5MiB 吧。
  • 我下載了好多漫畫,每個 100KiB 左右,這些大概佔了不少比例。
  • 我還收藏了不少動畫電影電視劇,雖然這些文件總數量可能不多?
  • 我下載了 Linux 的源碼,那裏面每個 C 代碼文件都幾千行,每行 100 字寬,平均也得有 30KiB 吧,有幾萬個源碼文件呢,佔比應該挺大的……

問題中「大多數」其實是個挺不精確的稱呼,換個精確點的問法:你覺得你的系統中 文件大小的中位數 大概在什麼範圍內?或者說,文件系統中 文件大小的分佈情況 一般是怎樣的曲線?

這個問題其實還有多種別的問法,比如:一個常見的桌面或者服務器系統中,多大的文件算大文件, 多小的文件算小文件,什麼範圍內的大小算是普通呢?

經歷過基本的科學教育的人 …

依云's avatar

终端色彩总结

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

终端转义序列里有一个 SGR 代码用于表示「粗体或者增加强度」的字体渲染。相当多的终端将其实现作更明亮的颜色而非粗体字,也有很多终端应用程序如此(比如 mutt 中的 brightXXX 颜色使用此代码;新一点的 mutt 支持使用 lightXXX 来表示亮色了)。

然而最近,GNOME 终端决定将这个「或」字去掉,让 SGR 代码 1 表示粗体,亮色使用另外的颜色代码来表示。这无疑导致了我看到的许多软件里出现粗体字。有时候看着还行(比如 systemd、htop 中的),有时候会让人觉得很不舒服(比如 zsh 里打着命令,字体一会儿变粗一会儿变普通粗细)。我就认真去查了一下相关信息,作出相应的配置更改,顺便做个总结笔记好了。

转义序列

「选择图形展现」(Select Graphic Rendition; SGR)序列用于设置字体的渲染方式。其格式为CSI (code ";")* code m。CSI 就是 ESC "["。一个序列里可以给出多个代码,使用分号分隔。如果一个都不给出,当作代码 0 解释。

八色

这是最基础的八种颜色,代码 30-37 设置前景色,40-47 设置背景色。

16色

这就是大多数终端设置里,那个14色的调色板所指定的色彩了。为什么只有14色呢?因为默认的前景色和背景色是单独的设置项。

如序言中所说,相当多的终端将代码 1 解释为亮色,也就是上述八色再加上对应的明亮版本。

自 GNOME 终端此次改革之后,代码 1 只管粗体。要亮色,使用代码 90-97 设置前景色,100-107 设置背景色。除了 GNOME 终端外,也有一些其它终端跟进,比如 alacritty。有些终端保留了将代码 1 解释为亮色的选项,而 GNOME 终端最近去掉了这个选项(但是还有一个将粗体字显示为亮色的选项)。

256色

16色怎么够?于是出现了256色。

ESC[38;5;<n>m用于设置前景色,ESC[48;5;<n>m用于设置背景色。其中,n 是一个数,0-7 同代码 30-37,是那最初八种颜色。8-15 是它们的亮色变种。16-231 是216种彩色,在RGB空间构成了一个6x6x6的立方体。232-255 是24个灰阶色彩。

一些标准中,这中间的分隔符使用冒号。

真彩色

现代显示器普遍使用8位值表示RGB中每一个通道、共计24位了,终端也不能落后呀。于是有些终端也支持了这个被称为「真彩色」的24位色彩了。

代码格式是256色的扩充。ESC[38;2;<r>;<g>;<b>m来设置前景色,ESC[48;2;<r>;<g>;<b>m设置背景色。这里的 r、g、b 当然就是RGB色彩空间的值了,每一项的取值范围是 0-255。

测试脚本

整合了我从各处收集到的展示方式,写了一个脚本,可以直观地感受终端对各种色彩的支持情况:

colors.py

参考资料

SgDylan's avatar

使用 VMAF 对静态图片进行质量评估

使用 VMAF 评估图片质量,测量算法性能。

SgDylan's avatar

DIY 显示器背景灯 Lightpack

最近自己弄了一套显示器背景光,在此稍微记录一下。

Jixun's avatar

移除游戏添加的美式英文键盘

很多 FPS 游戏(如 CS:GO)会在启动的时候添加一个美式英文键盘,但不会在结束游戏的时候卸载这个键盘。

在 Steam 社区找到一个批处理的解决方案,不过需要保存两个额外的 xml 文件在硬盘来调用。

研究了下相关的 API,用汇编做了个简单的小程序。

下载

GitHub | 历史版本

源码使用 BSD 3-Clause 协议授权,可以在 JixunMoe/RemoveUSKeyboardLayout 获取。

启动游戏并移除美式键盘

  • 此处使用的例子是“军团要塞2”。
  • 其他游戏的 Steam APPID 可以从其对应的商店地址找到。

将批处理与编译后的文件放在同一目录:

REM 启动游戏 start steam://rungameid/440 REM 等待游戏启动并添加键盘 timeout /t 5 REM 移除键盘 %~dp0\RemoveUSKeyboardLayout.exe

或,使用 VBScript 脚本启动来隐藏命令行窗口:

Set objShell = CreateObject("Shell.Application") Set objFSO = CreateObject("Scripting.FileSystemObject") Set objFile = objFSO.GetFile(Wscript.ScriptFullName) strFolder = objFSO.GetParentFolderName(objFile) ' 启动游戏 objShell.ShellExecute "steam://rungameid/440" ' 等待游戏启动并添加键盘 WScript.Sleep(5000) ' 移除美式键盘 objShell.ShellExecute strFolder & "\RemoveUSKeyboardLayout.exe"

移除游戏添加的美式英文键盘最先出现在Jixun 项目集

Jixun's avatar

FC 魂斗罗1 汉化

FC 上的《魂斗罗1》是我在 2016 年做的,很多内容已经找不到了唔…

汉化说明

人生第一个汉化的 FC 游戏。因为字数不算太多,就试着汉化了下。

汉化基于有剧情、有动画的日文版本制作。

汉化完后,发现以前汉化 FC 游戏的前辈真不容易啊~

汉化内容参考自英文翻译版、百科、贴吧以及网络上的各种资源,因为我看不懂游戏里的日文…

标题界面调色有点小问题,脸有点黑… 不要在意细节~

以上。

  • 标题画面
  • 剧情画面
  • 过场画面
FC《魂斗罗 1》汉化截图

下载

更新说明

  • v2 – 2016.08.04
    • 修复地图界面的卡顿 & 乱码。
    • 翻译了之前漏翻的隐藏信息。
    • 加强了断句信息的停顿。
  • v1- 2016.08.03 – 初版发布

碎碎念

汉化的时候折腾了好一段时间;因为网络上文章的丢失(很多做 FC 汉化的前辈的部落格都无法正常访问了),很多时候都是自己一个人在瞎折腾。还好最终给我折腾出来了

汉化日记可以在旧博客上找到(含目录),日期大概横穿了从立项到发布的日期哈哈。

对代码部分所做的代码更改则使用 BSD-3-Clause 授权协议,可以在 JixunMoe/ContraNES1TranslationPatch 获取。

过段时间把汉化日记补充道后续页面吧。

FC 魂斗罗1 汉化最先出现在Jixun 项目集

Jixun's avatar

QMC 解密

腾讯旗下的《QQ 音乐》所使用的音乐文件加密格式就是 QMC,本质上就是将整个文件读入后用 XOR 处理。

下载

GitHub | 历史版本

源码使用 MIT 协议授权,可以在 JixunMoe/qmc-decode 获取。

使用说明

使用解码程序对 .qmc 文件进行处理。

打开命令行,执行像上图一样的命令即可。

.\qmc_crypto.win64.exe .\周杰伦-青花瓷.qmcflac .\周杰伦-青花瓷.flac

具体调用方法:qmc_crypto.win64.exe "<qmc文件路径>" "<解密后文件路径>"

更新历史

  • v1.0.1 – 2019.07.16 – 修正 Linux 下无法编译的错误,感谢 @nswa-project 提交的 PR。
  • v1.0 – 2019.05.25 – 初版发布。

碎碎念

解密代码其实是从某个第三方 APK 里面提取的,里面有一个叫com.tencent.qqmusic.business.musicdownload.vipdownload.PayProcessor 的类。

这个类里面有两个函数,分别是 native_decryptnative_encrypt

估计就是从手机版《QQ 音乐》里面提取出来的了吧?

QMC 解密最先出现在Jixun 项目集

Jixun's avatar

100% 橙汁 – 资源解包工具 v1.1

100% 橙汁(100% Orange Juice)是一个类似大富翁的游戏。

支持类型

  • .dat 后缀文件解密
  • 伪装为 ZIP 压缩包,内部包含后缀名为 .dat 的加密文件(如 animation.pak
  • 将合并后的 ogg 拆分成单独的文件(如 bgm.pak
  • 将合并后的 wav 拆分成单独的文件(如 se.pak

使用方法

OrangeDecryptor <输入文件> <输出路径/目录> [模式]

如果不填写模式的话,将尝试自动识别。

下载

季寻储存 | GitHub | 历史版本

源码使用 BSD 3-Clause 协议授权,可以在 JixunMoe/OrangeDecryptor 获取。

更新记录

  • v1.1 – 2018.01.18 – 修正 XP 下的支援
  • v1.0 – 2018.01.?? – 最初版本发布

碎碎念

本来想顺便把源码放 GitHub 的,可惜用 Everything 一搜才发现找不到源码… 看来是某次重装的时候不小心删掉了呀。

在去年的一个系统备份里找到了

参考来源

这里的参考来源全凭记忆了,毕竟这东西写了有两年了。

  1. WAV 文件格式的说明:
    https://wiki.fileformat.com/audio/wav/ (存档)
  2. OGG 文件格式的说明:
    https://xiph.org/ogg/doc/framing.html (存档)

100% 橙汁 – 资源解包工具 v1.1最先出现在Jixun 项目集

Jixun's avatar

蓝光原盘压硬字幕并跳过前 10 秒

找到个未加密的原盘,里面有一堆字幕轨,发现第一轨(0:s:0)是需要的字幕。

字幕的前几秒是一些观影说明,也可以一同去掉(大约 10 秒长度)

蓝光里的音频倒是有一堆,直接用第一个音轨(0:a:0)就行。

目标播放设备不支援 x265 也不支援 10 bit,因此编码器选择的是 x264 以及 Profile 为 main@4.0

跟着网上找的说明,加上一些 B帧、引用帧的设定以及一些调整,最终的压制脚本如下:

#!/bin/sh set -ex INPUT_PATH="bluray:/path/to/disk" OUTPUT_PATH="/tmp/Film.name.YYYY.1080p-ENCODE.mp4" META_TITLE="中文名 - 外文名 (年份)" AUDIO_MAP="0:a:0" nice -n 15 -- \ ffmpeg -stats -i "${INPUT_PATH}" \ -filter_complex "[0:v:0][0:s:0]overlay=0:0:enable='gte(t,10)'" \ -metadata title="${META_TITLE}" \ -movflags +faststart \ -c:v libx264 \ -crf 20 \ -flags +loop \ -deblock 0:0 \ -bf 16 -b_strategy 2 -refs 6 -maxrate 12M \ -profile:v main -level 4.0 \ -preset slow -tune animation \ -c:a libfdk_aac -vbr 5 \ -map "0:v:0" -map "$AUDIO_MAP" \ "$OUTPUT_PATH"

如果是 Windows 环境,可能使用 AviSynth 脚本会比较好一些?调滤镜什么的也方便。

最后压出来的视频大概 2 个小时长,因为 B 帧 设定得比较大,每次快进都是 5 秒一跳;不过考虑到视频是拿来本地收藏用的,还是能够接受。

参考资料

  1. 介绍 ffmpeg 中对应的 x264 选项的文档:
    https://sites.google.com/site/linuxencoding/x264-ffmpeg-mapping
  2. 对 ffmpeg 中使用 -deblockalpha 参数却不能使用的解决方案:
    https://stackoverflow.com/a/23539599
  3. ffmpeg 百科对滤镜的教程:
    https://trac.ffmpeg.org/wiki/FilteringGuide
  4. ffmpeg 的滤镜文档:
    https://ffmpeg.org/ffmpeg-filters.html

蓝光原盘压硬字幕并跳过前 10 秒最先出现在Jixun 项目集

Jixun's avatar

仓库用度盘投稿助手

虽然说当初是为了某个仓库而做的辅助插件,没想到现在因为百度网盘的严打而再次热门起来 _(:3__

脚本安装

首先需要安装一个脚本管理器,推荐使用 暴力猴,然后安装脚本兼容版)。

推荐使用原版,兼容版做了一些转译操作来兼容旧内核浏览器而增加了体积。

源码使用 MIT 协议授权,可以在 JixunMoe/dupan-helper 获取。

脚本说明

安装脚本后,百度网盘的管理页面会多出一些功能:

  1. 自定义分享(提取密码)
  2. 批量重命名
  3. 标准提取码(秒传链接),分享再也不会失效啦 ^1
  • 批量重命名选中的文件
  • 自定义分享密码
  • 导入标准提取码

^1 取决于百度网盘是否针对文件特征码进行屏蔽。

支持的提取码

  • 「游侠」的「肚娘提取码」。 游侠格式的提取码一次只能添加一个,不能与其他格式混搭。
  • 梦姬标准提取码
  • PanDownload 的 bdpan:// 协议链接。

※ PanDownload 的作者于二〇二〇年四月被捕,请小心目前在网上流传的版本。

标准提取码生成器

标准提取码生成器以及相关说明请参见从「百度网盘标准提取码生成器」。

仓库用度盘投稿助手最先出现在Jixun 项目集

Jixun's avatar

百度网盘标准提取码生成器

配合脚本使用效果更佳!仓库用度盘投稿助手

软件非常的简单,打开后把文件拖放进来,然后按下「生成代码」就会生成提取码了。

标准提取码生成器的主界面

软件下载

下载:季寻储存 | 百度网盘:xxxx | GitHub

源码使用 BSD 3-Clause 协议授权,可以在 JixunMoe/mfcDuDownloadCodeGenerator 获取。

旧版本存档

这个是更早之前使用易语言做的了,分别是 v1 实现了游侠的格式,而 v2 则实现了标准提取码的格式。

此处提供的旧版本仅供研究,不推荐日常使用。而且因为是易语言做的,容易被杀毒软件报告为病毒…

下载:季寻储存 | 百度网盘:dddd(解压密码 jixun

VirusTotal 查毒报告

  • v1 – 23/72 个杀毒软件报告为危险。
  • v2 – 20/72 个杀毒软件报告为危险。
  • v3 – 4/72 个杀毒软件报告为危险。

标准提取码格式

一行一个,每一行的数据如下:

<完整 MD5> # <片段 MD5> # <文件长度> # <文件名>

字段的说明如下:

  • 完整 MD5: 文件的整体 MD5 校验数据。
  • 片段 MD5: 文件前 256KiB 的 MD5 校验数据。
  • 文件长度: 文件的字节长度,纯数字。
  • 文件名 : 导入的文件名称。

合并起来就是下面这个样子(提取码仅供测试用途):

855E7B1A30C30612AF4EF48E98ADA278#3DF18E7BF1E05C9E40EA5B6E061FE4D8#295682048#LibreOffice_6.2.4_Win_x64.msi
85F1F1A093F7645985C5B87DB9D0411B#AB3E81997FB8E223EF9FDEA99AC3CBEF#156026792#xampp-windows-x64-7.3.6-1-VC15-installer.exe
828D08946421B5B2215625DEF1C7745E#D3A1FB7C331013ADC3E7BA46CF22F9A2#111087432#MeGUI-2896-32.zip
1C06E48C6A85C2FD6D1C0CF8BD57ABAF#C97B8AF390F4E50B0C13A3C7A6CD9A9C#59287984#Wireshark-win64-3.0.2.exe
C654643F3BCFBC305CA61151ED407DDA#D79939D48BAC90ADE0CA8EE922FD6EF6#785958680#android-studio-ide-192.6241897-windows.exe
CF5D5D149E4A6ECF993B720D4C3D5FE9#8032F875BDA5C2C6EC8DFDF25BCD5B32#170460680#VirtualBox-6.0.14-133895-Win.exe
70FDFA614E781514C37E3A990A2E3821#A414B184565F7B48FD6B192290F7F9FD#50930768#eclipse-inst-win64.exe

百度网盘标准提取码生成器最先出现在Jixun 项目集

Jixun's avatar

利用 Docker 来静态编译 ffmpeg

这篇文章是关于在 Linux 下使用 Docker 编译适用于 x86_64 架构的 ffmpeg 可执行文件,不包括 Windows 相关的内容。也许以后会做也说不定。

常见问题

问:为什么要自己构建?
答:使用非自由non-free授权的编码器(如:fdk-aac)。

问:为什么要用 docker 来构建?
答:不用额外在宿主机配置环境,直接编译就行了。

问:如何确保编译出来的文件能跨平台运行?
答:使用静态构建Static Build,将所有依赖内嵌到可执行文件里。

问:如何加入自己的编译参数或依赖?
答:直接建立一个新的 Dockerfile 并引入这个项目,或建立一个分支然后配置。

注意事项

因为包含了 non-free 的编解码器,因此编译后的文件只能自用而不能分享。

Docker 镜像

你可以访问 JixunMoe/ffmpeg-builder 来获取构建镜像所使用的 Dockerfile,或是直接拉取在 Docker Hub 上自动构建的镜像:

docker pull jixun/ffmpeg-builder

镜像准备好后就可以开始编译了:

OUTDIR="$(pwd)/bin"
mkdir -p "${OUTDIR}"
docker run --rm -v "${OUTDIR}:/build/bin" jixun/ffmpeg-builder

默认编译的版本是镜像编译时的最新版(4.2.3),或者你也可以添加参数来指定想编译的版本(不保证能成功):

docker run --rm -v "${OUTDIR}:/build/bin" jixun/ffmpeg-builder 4.2.3

最后就能在 $OUTDIR 里找到编译好的 ffmpegffprobe 文件了。

查看包含的编解码器

$ ./bin/ffmpeg -codecs | grep fdk
ffmpeg version 4.2.3 Copyright (c) 2000-2020 the FFmpeg developers
built with gcc 7 (Ubuntu 7.5.0-3ubuntu1~18.04)
configuration: --prefix=/usr --pkg-config-flags=--static --extra-cflags='-static -Wl,-Bdynamic,-lgcc_s,-Bstatic' --extra-ldflags=-static --extra-libs='-lpthread -lm' --bindir=/build/bin --enable-static --enable-gpl --enable-gnutls --enable-libass --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libbluray --enable-nonfree
libavutil 56. 31.100 / 56. 31.100
libavcodec 58. 54.100 / 58. 54.100
libavformat 58. 29.100 / 58. 29.100
libavdevice 58. 8.100 / 58. 8.100
libavfilter 7. 57.100 / 7. 57.100
libswscale 5. 5.100 / 5. 5.100
libswresample 3. 5.100 / 3. 5.100
libpostproc 55. 5.100 / 55. 5.100
DEA.L. aac AAC (Advanced Audio Coding) (decoders: aac aac_fixed libfdk_aac ) (encoders: aac libfdk_aac )

参考资料

  1. ffmpeg 官方的编译指南:https://trac.ffmpeg.org/wiki/CompilationGuide/Ubuntu

利用 Docker 来静态编译 ffmpeg最先出现在Jixun 项目集

Jixun's avatar

iFun 去广告 & 增强

iF 视频是一个提供海外华人的视频点播的一个服务,免费用户可以看 480p 的视频。

这个脚本可以用来去除一些只有充值会员才能使用的功能,如去广告。

安装脚本

首先需要安装一个脚本管理器,推荐使用 暴力猴,然后安装脚本

脚本说明

  1. 脚本的实现原理是伪造登入账号的会员信息,因此你需要注册并登入一个账号。
  2. 如果一定要充值,请先关闭脚本或更换浏览器后操作;因为充值可能会读取到伪造的账号信息。
  3. 国内很多综艺节目(甚至是电影)可以在 YouTube 上免费观看高画质版本,如芒果台。善用搜索。
启用脚本并在网页登入后;特权标记为手动添加。

碎碎念

那个网站原本叫做「多瑙影院」,前段时间一看发现改名了,叫「iF 影视(iFun)」。

当初以为网站改成 Angular 后就比较难搞去广告了… 一番研究后发现伪造会员信息可能是最为方便的了。

在之前博客发布的内容:

iFun 去广告 & 增强最先出现在Jixun 项目集

's avatar

狗粮!唔嗯……想要……还要更多!咳!

Image by Mat Coulton from Pixabay

恋爱真是件美妙的事情呢。尽管要享受它,还必须得付出巨大的代价才行。得承担起两人份的责任,得照顾好对方的心情,得掌握好所有人的看法和态度,还得知道全方位的处理冲突的办法。但很幸运地,对于像黄鼠这样,不想付出代价又想吸收恋爱带来的甜美的人,我们还有替代方案——吃狗粮。

我们可以寻找虚构的故事。除了少数的例外,故事们一定都是被设计成读后会让人开心的。作家们用了全力,只为了将人物写得无比可爱,把交互写得超级幸福。即使有冲突,那也一定是会得到解决的,而在解决之时,他们也一定不会放弃机会,再让读者释放一次快乐的荷尔蒙。

黄鼠可以放心地、全力地喜欢虚构故事中的 CP 们,因为不用担心它们会令我失望——如果这是两个黄鼠不会喜欢的角色的话,那么从故事开始就会知道了。角色们的可爱是被刻意设计如此,因此是完全不用担心会消逝的。

而在现实中,我们也可以不劳而获地享受别人的恋爱带来的幸福感。现实中的情侣会秀恩爱,会撒狗粮——这是人之常情,得到了那样稀有的机会、付出了那样多的努力,黄鼠也一定会忍不住使劲炫耀的。

黄鼠通常来说,都认为自己是一个擅长接受狗粮的人。尽管有少数时候会有些许嫉妒,但那不重要,因为那是和自己无关的事情。面对别人的感情、别人的幸福,自己只要在周围开心的祝福就好了。狗粮发放者本人的的幸福,才是故事的主角。而自己能够免费蹭到这份幸福,是值得感谢的事情。

黄鼠看 YouTube ,在 YouTuber 们的镜头前,几乎每对人都是那样地美丽。他们互相扶持着,一同行进着,一起将美好展示给全世界的观众。在镜头之外也许仍然会有冲突,但那跟黄鼠无关,也无法获知,因此黄鼠不去思考它。

黄鼠看着 Veritasium 的 Derek 讲述自己的人生故事 ,那本身就是一篇很棒的、启发人的视频,而在其中 Derek 感谢到自己的妻子对自己的长期支持的时候,在提及两人相遇的时候,在视频中播放他们在从前求婚时在室外用手机录下的模糊录像的时候,那份狗粮是突然的,但是是美味的。幸福的感觉遍布了黄鼠全身,唯一能组织出来的语言,是“好棒啊,好想祝福”;唯一拥有的想法,就只有祝福他们在这样多年的时间后,依然能够持续这份幸福。

黄鼠看着 AkiJoey 的频道。看着这两位做着相似种类的视频的 YouTuber ,从乎不相干,到公布了跨越大洋的感情,再到现在生活在了一起,除了祝福他们以外,难道还有什么其他的事情可以思考吗?而在如今,两人已经频繁地在视频中互相出镜,互相提及一起做的事情,这样的生活成为了日常,这样的日常是多么令人向往呀。而黄鼠,除了感谢他们一直带来的有趣视频以外,就只有希望这美妙的日常可以继续下去了。

决不能忘记提及的是 Rachel and Jun 的频道。从这样的频道名称看来,还能指望更多的什么呢?几乎每一篇的视频,都是优质的狗粮。美妙的两人,被三只可爱的猫咪包围着。对着样的美妙生活,那是连嫉妒都难以做到的。

放下 YouTube ,黄鼠看了看自己所认识的人们,那也是一个大量的狗粮来源。黄鼠看着大家的幸福,自己也会被幸福感所感染。黄鼠自诩是一个思想开放的人,会接受各种各样关系,会理解他人各种各样的决定,会明白这是与自己无关,自己无权评判的事情。于是黄鼠享受着从他人借来的快乐,开心地祝福着他们。

至少,这是黄鼠认为自己应该做的事情,在所有时候。

但事实上,黄鼠并没有像自己想象中那样强的承受能力,也并没有能够完全保持开放的思想。黄鼠有时会私下评判别人的身份和行为,也会拿着自己个人的衡量标杆,去评判与自己完全无关、自己完全无权干涉的事情。黄鼠无法总是纯粹地享受狗粮而不添加自己的主见。

黄鼠会偷偷地给人打上“难以喜欢上”的标签,尽管这可能仅仅是依据于粗浅的认知。黄鼠会觉得某个人可能太高冷、太凶、说话不好听、做事太绝情。可是人家是独立、有权做自己的人,是不需要黄鼠的欣赏的。事实上,黄鼠的存在有可能令对方厌烦也说不定。

尽管是人家自己的事情,自己完全无权评判的事情,但是可笑地,黄鼠会觉得自己无法接受现实中一些人的配对。就像对虚构作品中自己不喜欢的 CP 一样,想“诶,为什么那两个人会在一起”。可是对虚构作品这样做是没关系的,因为他们是虚构的人,可是在现实中,每个人都是有自己独立的思想,有着自己的事才对。与谁在一起是别人自己思考做出的决定,这样子否定别人的人生决定,是太大的不尊重了。

黄鼠知道这是自己不该拥有的想法,所以想要尽量避免它。因为这样,黄鼠十分害怕获知自己在意的人的恋人。万一那是一个黄鼠“难以喜欢上”的人该怎么办?那样的话,黄鼠就会悄悄地否定它们了。尽管这一切都不是黄鼠有权去评判的事情。

黄鼠是充满控制欲的,不愿意面对不在自己控制中的事情。如果熟悉的人宣布了新开始的感情,却又不愿意让黄鼠了解他的恋人,黄鼠会觉得气愤。尽管黄鼠知道,这是人家自己的决定,人家自己私人的事情,不愿意分享明明是十分正常的。可是不平衡的内心,仍然会无法接受自己熟悉的人正在隐藏其十分重要的一面,并且将大量的经历与时间花费在这个隐藏的地方,黄鼠难以获知的事实。但显然,这样的想法是不能说出来的,只好让黄鼠自己活该地承受。

黄鼠更不愿意接受的,是来自特定的人的狗粮。

那其中包含着黄鼠对对方不了解的气愤。自己明明声称那样喜欢一个人,却不知道人家居然有认识来自其它地方的其他人。不能够完全了解一个人的信息来源,令黄鼠气得不断跺脚:“他们到底怎么认识的啊!为什么黄鼠不知道啊!”

黄鼠没有“为什么不是我”这样的想法,因为黄鼠明白,之所以不是自己,一定是有合理的原因的。黄鼠因此想要了解对方,希望能够使用和平的方式,来让自己内心的控制欲平衡一些。可是对方大概完全不会有想要被黄鼠了解的兴趣,更不用提黄鼠的动机了。

但这样的事情,能有什么经决方案呢?在黄鼠能够改变自己的想法之前,大概每次吃到那颗特定的狗粮后,只能够继续被这些禁忌的想法所围绕了。“为什么这个人能与这个人关系这样好”、“为什么我不能成为其中的一分子”,这些不该被提出,也不该被回答的问题,希望能够停止吧。黄鼠想要能够全心全意地吃狗粮,这是足够的,也是黄鼠唯一有权做的。


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

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

's avatar

Hackthebox - Scavenger - 10.10.10.155 - Writeup

Hack The Box - Scavenger 解题过程及思路 Writeup
's avatar

Hackthebox - Magic - 10.10.10.185 - Writeup

Hack The Box - Magic 解题过程及思路 Writeup
ホロ's avatar

Chromium OS 和 Crostini 初体验

日常动机不明瞎折腾……

所以 Chromium OS 是啥?

Chromium OS是Google Chrome OS的开放源代码开发版本。 自2009年11月19日开始,Chrome OS以Chromium OS为名陆续发布其开发源代码, 并在遵守着BSD授权条款不断有新版本发布,并试图能够提供绝大多数长时间浏览 万维网的用户一个快速、方便且安全的操作系统。

历史上Chromium OS曾经整体是创建在以Linux核心为主的Ubuntu 4.10版本上,而操作系统的的软件包管理系统则是使用Gentoo Linux的Portage。 但是现在实际上只是单纯利用了Gentoo Linux 的 Portage 而独立编译出来的特制化 GNU/Linux 操作系统,而这个系统本身也与 Gentoo Linux 无关。

Wikipedia: Chromium OS

愿意的话当作一个核心是 Chromium 浏览器的操作系统也行……

于是 Chromium OS 大概像这个样子(嗯?)

's avatar

心脏和人偶 —— 心臓と絡繰

这是一首 Kanzaki Iori 作曲作词,花谱(Kaf,花譜)演唱的曲子。 Kanzaki Iori (原名是全用片假名的),就是那个,那个 vocaloid P主,那首《被生命所厌恶。》(命に嫌われている。)

《被生命所厌恶。》针对的是一种轻视生命的行为,一种表面上重视、实际上却拿生命在开玩笑的行为。轻视生命的我们“被生命本身所厌恶”。唱着无论如何也要活下去,忍耐着、挣扎着、笑着、背负着活下去。这样的歌。因为歌词十分直白,所以比较好懂。

写这篇的理由是因为感觉我听的日语歌里,各种修饰性的语言频发,有点像村上春树的小说,有点让人抓不住头脑。所以如果,。这次想要介绍的《心脏和人偶》,虽然不是像《被生命所厌恶。》那么直白,但也是挺好懂的一首歌,当作起手式可能正好。我不是职业的音乐人,也做不出高深的分析,也不敢自称说的都是对的,再怎么说,这也只是我个人的理解。但如果这篇文章能让读者对这首歌本身、Kanzaki、抑或是花谱感到一点点兴趣,那就是我的荣幸。

AlisterTT's avatar

520的涂鸦

这两天在看寒蝉鸣泣之时,片子太血腥就干脆一边玩手机一边转移注意力,用sketches那个APP乱涂乱画,涂了个狐狸出来。

然后勾线上色,这粗手指头是真够累人的

刚好12点过了,到5月20日了,那就祝自己节日快乐好了,什么时候还能脱单嘛!!

依云's avatar

桥接无线网卡!

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

众所周知,大部分无线网卡是不支持桥接操作的。

但是 VirtualBox 就是能,因为它做了特殊处理:来回改 MAC。

那么,我的 LXCnetnsKVM 啥的也想这么玩,成不?

实际上不仅能成,而且 Debian Wiki 还给出了两个方案。方案一是用 ebtables 来回改 MAC。不过我失败了,可能是 ebtables 不支持改完 MAC 再把包发往另外的网络接口吧。

方案二是内核的一个叫 Proxy ARP 的功能。设置起来超级简单:往/proc/sys/net/ipv4/conf/all/proxy_arp里写1,然后给需要的 IP 地址加一条 /32 路由项就可以了。

这方案相比起 VirtualBox 来是非常手动了,也不支持 DHCP 自动配置的 IP 地址,但好歹能用。至少微信备份能用。(火狐的 Wi-Fi 远程调试已经坏掉了,倒是那个「USB 调试」其实只要 adb 连接上就能用,不一定要走 USB 线。)

ホロ's avatar

Windows Subsystem for Linux + DistroLauncher

利用 DistroLauncher 在 WSL 上运行自己喜欢的 GNU/Linux 发行版, ,例如还是咱喜欢的 Arch 🌝

复习(?):Windows Subsystem for Linux 是个啥玩意?

从 Windows 10 Insider Preview 开始,加入了 Windows Subsystem for Linux (适用于 Linux 的 Windows 子系统) 功能.

Windows Subsystem for Linux(简称WSL)是一个为在Windows 10上能够原生运行 Linux 二 进制可执行文件(ELF 格式)的兼容层。 它是由微软与 Canonical 公司合作开发,目标是使纯正的 …

依云's avatar

Linux 的进程优先级与 nice 值

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

假设有一个程序叫 use-cpu,它运行的时候会一直消耗一个 CPU 核心。试问,如果我开两个终端窗口,分别执行以下两个进程,其 CPU 会如何分配?

$ taskset 2 ./use-cpu
$ taskset 2 nice -n 10 ./use-cpu

两个进程都在1号CPU上运行,意味着它们必定争抢时间片。第二个进程使用 nice 命令设置其 nice 为 10,那么,是不是第二个进程会占用比较少的 CPU 呢?

很合情合理的推理,然而答案是否定的。

呃,也不一定。cat /proc/sys/kernel/sched_autogroup_enabled 看一下,这个开了的话,CPU 调度会多一个层级。默认是开的,所以这两个进程会均分 CPU 时间。

首先说好了呀,这里只讨论普通进程(SCHED_OTHER)的调度。实时进程啥的不考虑。当然啦,CPU 分配只发生在 R(Runnable)状态的进程之间,暂时用不到 CPU 的进程不管。

最上面的层级是 cgroups 了。按照 cgroup 层级,每一层的子组或者进程间按权重分配。对于 cgroups v1,权重文件是 cpu.shares;cgroups v2 则是 cpu.weight。不管用哪个版本的 cgroups,systemd 默认都没有做特别的设置的。对于 v1,大家全在根组里;对于 v2,CPU 控制器都没有启用。如果你去设置 systemd 单元的 CPUWeight 属性(或者旧的 CPUShares 属性),那么 systemd 就会开始用 cgroups 来分配 CPU 了。一个意外的状况是,使用 cgroups v2 时,systemd-run 不会自动启用上层组的 CPU 控制器,以至于如果上层未手动启用的话,设置不起作用。在使用 cgroups v1 时,用 systemd 设置 CPUWeight 或者 CPUShares 也不太好用,因为它并不会自动把进程挪到相应的层级里去……

其次就是这个默认会开的 autogroup。这个特性是为了提升交互式的桌面系统的性能而引入的,会把同一 session 的进程放一个组里。每个 autogroup 作为一个整体进行调度,每个 autogroup 也有个 nice 值,在 /proc/PID/autogroup 里可以看到,也可以 echo 一个想要的 nice 值进去。至于这个 session,不是 systemd 的那个 session,而是传统 UNIX 的那个 session,也是 setsid(2) 的那个 session。我一直以为它没多大作用,没想到在这里用上了。基本上,同一群进程会在同一个 session 里(比如一群火狐进程,或者一群 make 进程),同一个终端里跑的进程也都在一个 session 里(除非你 setsid 了)。

最后才是轮到进程。其实准确地讲是线程。同一个 autogroup 里的时间片如何分配,就看里边这些线程的 nice 值的大小了。所以其实,我系统里的那些高 nice 值的进程,由于 autogroup 的存在而它们又没有去设置 autogroup 的 nice 值,其实调度起来没什么差别的。

参考资料

  • man 7 sched
  • man 7 cgroups
imi415's avatar

STM32H7中的DMA

1. 概述

       STM32H7相比其他系列性能有着不小的提升,同时结构也有了较大的变化。这些变化如果不加注意则会影响DMA等功能的使用。本文通过对STM32H7的Bus Matrix及Cache/MPU两方面尝试分析不同点及对应的解决方案。

2.硬件平台

       本文中使用的硬件是STM32H750开发板,属于STM32H7 Value Line产品线,代码位于QSPI Flash中,通过XIP方式执行。

3. STM32H7的总线结构和访问规则

       STM32H7拥有三个不同的Bus Matrix,分别为D1,D2与D3。

  • D1区域为AXI  Interconnect Matrix,与CPU通过AXI总线相连,高速外设如Flash,QSPI,FMC等通过此AXI Bus连接到CPU,速度最快。
  • D2区域为AHB Multi-layer Bus Matrix,连接了大部分低速外设及另一部分SRAM,通过CPU的AHBP接口连接到CPU,速度其次。
  • D3区域为另一个AHB Bus Matrix,与前两个区域不同的是,它不与CPU直接连接,而是通过D2区域的一个AHB Master连接到D3区域。D3区域速度最慢,同时也连接了一部分低功耗外设,速度最慢。

三个区域的时钟及门控可独立控制,以实现低功耗与高性能间的平衡。

在H7的架构中,部分高速外设通过AXI总线连接到Master,相比只有Flash存储器连接到AXI接口的F7系列,外设访问速度也有了提升。

STM32H7的总线互联架构

从上图我们可以发现以下访问规律:

  • D1区域的Bus Master可以通过D1-to-D2 AHB bus访问D2域的地址范围,也可以通过D2-to-D3 AHB bus访问D3的地址范围。
  • D2区域的Bus Master可以通过D2-to-D3 AHB bus访问D3域的地址范围,也可以通过D2-to-D1 AHB bus反向访问D1域的地址范围。
  • D3区域没有连接到其他区域的Bus Master,因此只能访问D3区域的地址范围。

总结一下就是:

D1与D2中的Bus Master可以互访对方Slave, D3中的Master不能访问D1与D2 Slave

4. STM32H7中的DMA与存储器

STM32H7中有三种不同的DMA,分别为MDMA,DMA(DMA1/DMA2)以及BDMA,其特点如下所示:

  • MDMA可以通过AXI Interconnect的接口访问D1域,同时能通过专用的AHBS接口访问CPU中的I/DTCM存储器,速度最高。
  • DMA1/2位于D2域中,通过AHB接口访问D2域。由于D2域存在着连接到D1域的通路,因此DMA1/2依然可以访问D1域中的存储器及外设。
  • BDMA则位于D3域中,仅可以访问D3SRAM及对应的D3域外设,同时功能上也相对有限。

相似的,STM32H7中的存储器也分为了以下几种:

  • AXI SRAM(D1_RAM),QUADSPI,FMC,Flash:这些存储器连接到AXI Interconnect,可被能访问D1域的Bus Master访问。
  • AHB SRAM1/2 :这些存储器连接到D2域 AHB Bus Matrix,可被能访问D2域的Bus Master访问。
  • AHB SRAM3:这些存储器连接到D3域 AHB Bus Matrix,可被能访问D3域的Bus Master访问。
  • 特殊的,位于CPU内部的I/DTCM(指令/数据紧耦合存储器)在可被CPU访问的同时也可通过专用接口被MDMA访问。

由此,我们可以得出以下几点规则:

MDMA能访问包含TCM在内的所有存储器(几乎和CPU范围类似),DMA1/2不能访问TCM,BDMA仅可访问AHB SRAM3以及D3域外设。
特别需要注意的是,这些规则不仅应用于DMA控制器,同时也适用于其他Bus Master,如DMA2D,LTDC,Ethernet,SDMMC,USB等等拥有内部DMA的外设,使用时同样要保证用户buffer位于可访问区域内。

5. 关于L1 Cache及MPU

Cortex-M7相比于其他核心,增加了单独的L1 I/D Cache,为了保证DMA访问的内存不出现一致性问题,需要通过配置MPU的方式控制指定区域的缓存策略。

Cortex-M7的MPU通过Region的形式定义访问规则,这里通过STM32CubeMX的配置工具提供简单的缓存配置示例。

CubeMX的MPU配置界面

MPU的配置最好按照粒度从粗到细的顺序配置,示例中的默认配置是禁用缓存,允许全部访问,在QSPI Flash区域启用读缓存,并允许指令访问及共享。

6. 代码实现

在默认的Linker Script中,数据代码被放置在了DTCM中,如果想要通过DMA访问这部分数据,我们就只能通过MDMA访问,或者修改LDS使得数据放置在AXI SRAM或者AHB SRAM中。以下的修改可以将用户的buffer放置在D2域SRAM中:

  _SI_D2SRAM = LOADADDR(.d2_sram);
  .d2_sram :
  {
    . = ALIGN(4);
    _DMA_Buffer_Start = .;
    *(.d2_sram_buffer)
    . = ALIGN(4);
    _DMA_Buffer_End = .;
  } >RAM_D2 AT> FLASH /* Note: Not actually init, we need to copy manually before use */

然后我们即可初始化这部分数据:

    uint32_t bytes_to_copy = &_DMA_Buffer_End - &_DMA_Buffer_Start;
    if(bytes_to_copy != 0) {
        memcpy((void *)&_DMA_Buffer_Start, (void *)&_SI_D2SRAM, bytes_to_copy);
    }

之后通过DMA1或DMA2即可正确实现DMA传输。

依云's avatar

Intel GVT-g 初体验

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

准备 GVT-g

把 kvmgt vfio-iommu-type1 vfio-mdev 这仨加到 /etc/mkinitcpio.confMODULES 数组里去。mkinitcpio -P 重新生成一下 initramfs。

添加内核参数 i915.enable_gvt=1。比如是 grub 引导就去改 /etc/default/grub 里的 GRUB_CMDLINE_LINUX 变量,然后 grub-mkconfig ...

去把 /etc/systemd/system.conf 里的 DefaultLimitMEMLOCK 给改了。比如 DefaultLimitMEMLOCK=65536:1073741824

重启。

这个时候应该已经有 /sys/devices/pciXXXX:XX/XXXX:XXXX.X/mdev_supported_types 这个目录了。里边有好几个选项呢。选择一下合适的(查看 description 文件),然后往里边的 create 文件里写一个 UUID 就创建了。

启动 KVM 虚拟机

呃,如果你还没有磁盘镜像就自己 qemu-img 创建一个,然后装机。如果你有别的虚拟机的,也可以用 qemu-img 去转格式。

另外准备一下网络。我早就有个网桥了,所以直接用它了。在 /etc/qemu/bridge.conf 里写一句 allow br0 不然不给用的,毕竟我是普通用户权限而网络接口是要 root 权限操作的,得明确允许一下。

我尽可能地使用了 virtio,据说性能好(VirtualBox 也支持一部分了呢)。如果用已有的虚拟机系统但以前没用过 virtio 的话,记得用 fallback 那个 initramfs 启动,然后进系统之后重新生成一个。

我给分配了四个逻辑 CPU 核,4G 内存。VGA 要关掉,不然两个显卡用起来麻烦。为了避免部分内容显示到别处去(如果关了 VGA 的话就看不到,否则能在默认的那个上看到),要加上 ramfb=on,driver=vfio-pci-nohotplug 选项。

声音当然是要的。添加个 PulseAudio 后端,一张 HDA 声卡。我不懂声卡型号所以找了个顺眼的,能用就好。

合起来是这样子的(那两个省略号,一个是磁盘镜像路径,一个是创建 vGPU 用的 UUID):

#!/bin/bash -e

ulimit -l 1024000

exec qemu-system-x86_64 -enable-kvm \
       -name "ArchKDE" \
       -cpu host -smp 4 \
       -m 4G \
       -drive file=/.../ArchLinuxKDE.qcow2,if=virtio \
       -netdev bridge,id=eth0,br=br0 \
       -device virtio-net,netdev=eth0 \
       -device vfio-pci,sysfsdev=/sys/bus/mdev/devices/...,display=on,x-igd-opregion=on,ramfb=on,driver=vfio-pci-nohotplug \
       -vga none \
       -display gtk,gl=on \
       -audiodev pa,id=pa0,server=/run/user/$UID/pulse/native -device intel-hda -device hda-output,audiodev=pa0 \
       "$@"

如果你使用 GVT-g 显卡的时候整个系统都卡卡卡的话,去看一下宿主的内核日志,是不是有 vfio_pin_page_external: Task qemu-system-x86 (257364) RLIMIT_MEMLOCK (104857600) exceeded 这样的提示,然后去把 RLIMIT_MEMLOCK 给调大,大到它不再报这个错为止。我最后给了1000M才终于不报错地把 KDE 给跑起来了(默认是64K)。

当然如果你没有 GVT-g 支持的话,去掉那行配置,然后 -vga virtio 也能用。

参考链接

imi415's avatar

使用SystemView分析FreeRTOS应用

免费的RTOS Tracealyzer,SEGGER大法好
17windy's avatar

练手/找感觉 自制1080P壁纸收集与下载 汇总

要改掉练完就扔的坏习惯,慢慢积累一下。 /但是不会存源文件,因此都是很难重制。

夏夕 0614 For the Life (Remix) #明日方舟 For the Life #明日方舟 泰拉大地的挽歌 #明日方舟 泰拉大地的挽歌 #明日方舟 梦觉流莺。 去,不要说再见。 聚。 破。 挖矿与吃货。 薄暮之城。 傍晚时分。 傍晚时分。 五月病。 抗僵尸能力低下。
ホロ's avatar

切点洋葱 - 搭建一个洋葱服务

“如果你愿意一层一层剥开我的心……”

所以洋葱服务(Onion Service)是啥?

洋葱服务 (Onion Service ,旧名为“隐身服务/隐藏服务/ Hidden Service”) 是一种只能透过洋葱路由网络访问的网络服务 (例如网站)。

那么有人为啥要使用洋葱服务呢?

  • 洋葱服务在 Tor 网络中传递,因此可以隐藏服务器的真实地址(例如 IP 地址和地理位置等等)。
  • Tor 用户与洋葱服务之间所有的流量都是端到端加密的,所以汝不必担心像没有 HTTPS 这样的问题。
  • 洋葱服务的网址是为自动生成,因此网站的架设者或管理员无需另行购买网络域名。其网址皆是以 .onion 结尾的, 这样的设计可以让洋葱路由系统确保所有网络连接都通往正确的站点,并且其连接数据未被窜改。

访问一个洋葱服务网站时,除了一般 Tor 网络中会经过的节点以外,还会额外通过若干个中继。 (图上的是 DuckDuckGo 提供的洋葱服务 https://3g2upl4pq6kufc4m.onion/

我需要搭建一个洋葱服务么?

如果汝遇到了这些情况,那汝大概会对如何搭建一个洋葱服务引起兴趣(大概吧……):

  • 匿名、不被截获和篡改的传输一个文件。(正好有 OnionShare 可以帮忙这么做)。
  • 在没有公共 IP 地址(甚至没有域名)的情况下提供 Web 服务。
  • 匿名的和另一位匿名者交流。
  • 汝也重视汝的读者的隐私权。 (要是汝不是作者怎么办?)
  • 或者别的? (详见:Tor at the Heart

切洋葱之前当然要做好保护措施啊……

于是亦然(?),要搭建一个洋葱服务的话,首先要有一个能够正常连接的 Tor 。

介于应该没人会一直开着个浏览器(?),所以最好是有个独立的 Tor 在运行(就是那啥所谓的 Expert Bundle 啦……)。

以及现在用 GNU/Linux 提供 Web 服务的家伙应该不少吧,于是汝大概能从汝所使用的 GNU/Linux 发行版的 软件仓库中找到 tor:

准备一个 Web 服务

这个就看人下菜了(?),如果有只用洋葱服务访问的需要的话,可以调整 Web 服务器的配置文件, 让她只接受本地地址的连接。 例如 Nginx 和 Apache 的话,大概可以这么做:

listen localhost:8000;

不放心的话还可以用防火墙啊(x)

生成一个洋葱服务地址

洋葱服务使用的 .onion 地址是随机产生的,地址是在配置洋葱服务时用新生成的公钥计算而成的。 所以叫做“生成”而不是注册,以及虽然有方法可以提前算出来生成特定地址的公钥但是不建议尝试……

用汝最顺手的编辑器和 root 权限(?)打开 Tor 的配置文件(通常是 /etc/tor/torrc ), 然后加上这些:

# 每个不同的洋葱服务都需要一个独立的文件夹来存储其所需要的私钥和主机名,
# 要创建不同的洋葱服务时,需要修改 HiddenServiceDir 所指向的文件夹。
#(注:不要手动创建 HiddenServiceDir 的路径,否则会出现权限的错误而无法启动。
# 在配置完成后启动 Tor 后,程序会自动生成权限合适的对应文件夹。)

HiddenServiceDir /var/lib/tor/path_to_your_service

# HiddenServicePort {汝希望汝的洋葱服务开在哪个端口上} {汝这个端口的洋葱服务交给谁处理}

HiddenServicePort 80 127.0.0.1:8080

保存完毕后重新启动 Tor ,如果一切 OK 的话,可以在汝设置的 HiddenServiceDir 中看到一个 名为 hostname 的文件,里面就是汝新鲜的洋葱服务的域名啦~

同时提供普通网络服务和洋葱服务时?

  • 可以考虑让来自 Tor 的出口 IP 地址的连接自动重定向至洋葱服务地址,例如 这样
  • 也有可能需要调整汝的应用(或者主题什么别的)来适应洋葱服务和 Tor 浏览器。

更进一步?读读看这些文章

当然都只有英文版(汗)

你会鼻酸,你会流泪……

ホロ's avatar

在 Android 上创建 GNU/Linux 容器

那这次再说吧……

再一次提醒没有耐心和同理心的家伙们去用其它即用的工具像是 TermuxArch 和 Linux Deploy ……

所以这回咱们要干什么?

由于咱不可能把所有发行版都装一次,也不可能在各种手机上都测试一遍,于是咱只能拿 咱手边的家伙举个例子,例如咱手上的小米平板4 ……

  • 一部 aarch64 / arm64 设备

现在的手机 CPU 基本上都是 64 位了吧,不知道的话搜索一下手上 CPU 的型号应该就能看个大概。

  • 比较新的 Android 系统,最好有 root 权限和完整 busybox 支持。

如果汝已经动手给手机安装了第三方 ROM,那应该不是什么难事。 某蓝绿海厂等受害者可以尝试 UserLAnd……

  • 一些剩余存储空间 (这不是废话么)
  • 安装好终端模拟器和合适的键盘。

或者 Termux 也可以,在里面装上 tsu 以后可以让 Termux 里的 Bash 以 …

ホロ's avatar

在 Android 上使用 GNU/Linux 工具

虽然……

虽然汝可能从哪里听说过 Android 是基于 Linux 内核的啦,不过大多数时候汝大概没办法直接把汝爱用的 GNU/Linux 发行版上的 工具直接拿过来用,为啥咧?

  • 手机和电脑不是一种 CPU(PC 常见的就是 x86_64 , 手机上比较常见的是 arm64(有时也称作 aarch64)),因此 两边的二进制文件并不能直接拿来换着用。
  • 虽然 Android 用了 Linux 内核,但是和普通的 GNU/Linux 发行版还是有很大的区别的。例如以 bionic 取代glibc (C 函数库)、以 Skia 取代 Cairo (用于向量图形绘图)、再以 OpenCORE 取代 FFmpeg(常用于音视频的录影和转换)。 于是不少依赖它们的软件不好运行。
  • 以及随着越来越多的 GNU/Linux 发行版开始用 Systemd 作为初始化程序,很多程序或多或少就和 Systemd 有了些关联(或者依赖)。 不巧的是……

所以 Android 应用们不好用了么?

STAGE 0 - Android 上的终端(模拟器)

如果汝有用过一些需要在电脑上运行一个辅助程序的 Android 应用(像是 AppOps 这样的),汝其实已经离 Shell 很近了。

在手机和电脑连接以后,可以运行 adb shell 命令获得一个 shell:

(PC) $ adb shell
walleye:/ $

接下来就可以 cd ls 乱出了…… (啥?) 因为别的汝也干不了啊……

如果汝的手机有 root 权限的话,在 Shell 里运行 su 试试?第一次的话汝的手机上的 root 权限管理程序应该会提示汝授予权限什么的。

要想在手机上试试的话,也有差不多的终端模拟器程序可以选择。 例如这个?

STAGE 1 - 在 Android 上使用(部份) GNU/Linux 程序

只有个 shell 哪里够……

正好也有一群人这么想,于是它们把终端模拟器和一些常用的 GNU/Linux 应用程序组合起来,创造出了 Termux

(这个在电脑上显示 Android 设备画面的程序是 scrcpy 啦~)

这里面提到的 pkg 其实就是有点小包装的 apt 啦,熟悉 Debian / Ubuntu 的话应该不会陌生。

下面的 root / Unstable / x11 是额外的仓库,需要使用要求 root 权限或者图形界面的软件在里面。

  • Play 商店上也有几个 Termux 使用的插件,可以实现自定义字体、浮动窗口、快速运行脚本、访问手机内存设备 等功能。有几个是收费的,不过有别的地方可以免费下载(小声)
  • 键盘上面的特殊按键可以通过编辑 ~/.termux/termux.properties 文件中的 extra-keys 属性来修改, 特殊键的定义在这里。
  • 偷懒的话也可以直接安装一个有这些特殊键的输入法,例如 Hacker's Keyboard
  • 当然外接键盘也是可以的。

以及大概有人踩过了不少的坑的样子……

STAGE 2 - 在 Android 上运行(部份) GNU/Linux 容器

啊 pkg/apt 好不习惯……

怀念汝习惯的 GNU/Linux 发行版的原汁原味的包管理器和其它工具?可以考虑运行一个容器来解馋(?)

Linux® 容器是与系统其他部分隔离开的一系列进程。运行这些进程所需的所有文件都由另一个镜像提供, 这意味着从开发到测试再到生产的整个过程中,Linux 容器都具有可移植性和一致性。

RedHat : 什么是 Linux 容器?

实现这种操作的关键要素就是 chroot ,它针对正在运作的软件行程和它的子进程,改变它外显的根目录。 在使用 chroot 之后,进程就会认为设置的目录是根目录,就可以进行各种操作啦,例如隔离访问或者修复系统什么的。

当然这操作是要 root 权限的,至于后来有人写出用户空间中的 proot ,就是另一个故事啦……

  • 手机有 root 权限的话,可以用 chroot 安装一个 GNU/Linux 容器。也有像是 Linux Deploy 这样的应用可以简化这一过程。
  • 没有 root 权限的话,借助前面提起的 proot 也能实现差不多的操作。也有像是 UserLAndTermuxArch 这样的工具帮忙简化这一过程。

以及大概也有人踩过了不少的坑的样子……

那如果咱就是想从零(?)开始呢?

那下次再说吧……

OX's avatar

斐訊R1智障音箱通過adb調試介面安裝apk實現AirPlay和DLNA功能

因為揀垃圾是一件很快樂的事情,一年前(2019年)我特意從中國大陸的網站上購買了很多斐訊遺產,其中就包括斐訊R1音箱,通過重重困難飄洋過海轉運到了日本。

剛剛拿到手的R1音箱是沒有拆封的,不同時期生產的R1音箱,內置的韌體(ROM)版本是不一樣的,舊版本的韌體音質校準不是特別理想,需要通過DNS劫持、push工廠配置文件等等的方法升級到最新版本,網絡上有很多教程,有需要的人可以Google一下,應該馬上就可以找到。

廢話不多説,下面是正題:

如何通過adb調試介面安裝App?

首先要找到斐訊R1音箱的IP位址。

有很多方法,比如查看路由器的DHCP分配位址表:

Host Name是「Phicomm_R1」開頭的就是斐訊R1音箱

知道斐訊R1的IP位址之後,用adb連接它!

OX-Macbook:~ ox$ adb connect 192.168.0.40
connected to 192.168.0.40:5555

然後用adb push命令把需要安裝的apk推送到音箱上:

adb push [apk文件所在的本地路徑] /data/local/tmp/

// 比如這樣:
// adb push /Users/ox/Desktop/airplay.apk /data/local/tmp/

然後通過調用pm工具安裝剛才push的apk安裝包:

adb shell /system/bin/pm install -t /data/local/tmp/[文件名]
額外提醒

如果你不知道轉義字符是什麼東西,那你的文件名最好不要有奇怪的字符,比如空格和括號之類的。

安裝AirPlay接收端

「樂播投屏TV版」和「AirPin」還有「Media Center」我都在用。

AirPin 是收費的App,但是也有免費的版本(AirPin Lite),在R1上用的話已經足夠了。

樂播投屏TV版 是免費的App,但是會上傳MAC地址之類的隱私內容,有時候還會擅自更新,新版本的樂播投屏TV版每次新設備連接都需要點擊允許,沒有屏幕的R1音箱就只能通過scrcpy之類的工具連接到R1之後手動點擊允許,非常麻煩,介意的話可以安裝舊版本的同時在路由器上屏蔽樂播投屏的服務器(*.hpplay.cn)。

Media Center 是免費的App,不過似乎穩定性不是特別好,但是非常輕量。

安裝DLNA接受端

上面提到的三個Apps都支援DLNA功能,自己選一個用吧。

使用scrcpy操作R1音箱的UI介面

雖然用adb調試介面可以完成大多數操作,但是比如像更改AirPlay的顯示名稱之類的操作,還是需要GUI操作,因為R1沒有屏幕,所以需要用到一些可以遠端操作Android GUI介面的工具,比如scrcpy。

scrcpy的GitHub倉庫地址:https://github.com/Genymobile/scrcpy

Windows版本在這裏可以找到。

Linux和macOS可以通過包管理器很方便地安裝,具體參考這裏

使用方法極其簡單:以macOS為例,先用adb connect命令連接到R1音箱之後,再執行scrcpy就可以了。

比如像這樣:

OX-MacBook:~ ox$ adb connect 192.168.0.40
connected to 192.168.0.40:5555
OX-Macbook:~ ox$ scrcpy
使用scrapy連接斐訊R1音箱 更改Media Center的設備顯示名稱 打開Media Center的AirPlay功能和設定R1音箱啟動後自動打開AirPlay伺服器

三款App的下載地址

樂播投屏TV版舊版本:Download

AirPin Lite:Download

Media Center:Download

這篇文章 斐訊R1智障音箱通過adb調試介面安裝apk實現AirPlay和DLNA功能 最早出現於 OXの胡說八道

's avatar

我都写了些什么东西

虽然这个博客里的文章基本上都是凭兴趣写的,但是我也非常高兴有人来看。在这里我想讲解一下,我写了什么东西,抑或是为什么写的,如果这样能够增加各位读者的理解,或是对这些文章提起哪怕一丁点的兴趣,那也是我的荣幸。

梦日记并没有解说,这点就像《梦日记》一样。

4 月 1 日吉日

本文链接

三人成虎的典故大家都听说过,那么反过来是什么样子呢?当大家都不相信的时候,会不会使得本人也渐渐怀疑自己?这篇博客就是在讲述这样一个故事。

不过在故事里,还多了一个限制,就是魏莱是做梦梦见世界毁灭的,而梦里的记忆随着时间流逝在急速地消失。而到第二天,这份记忆就完全消失了。

#workshop,也就是《茸雪》(这里有一篇《茸雪》的(英文)随想,感兴趣的可以),《梦末》的开发,上个月出了系列的第三作《昙花》,但我才玩了前几章。《昙花》的主角也是一种患了奇妙的病,使得他非常健忘:生活、朋友、以及一切。他唯一印象深刻的是他在学校撞上的女主。后面……就不知道了。

吉日其实没有什么特殊含义。其实某种含义上每天都是黄道吉日,不过在吉日宣告世界毁灭,是不是有点突兀呢?如果有就好了。

某一个冬日的下午

本文链接

讲述了我为什么想喝热可可,又不想喝的故事。

恋爱喜剧害死人

本文链接

看恋爱喜剧轻小说的时候,会不会经常想:

这个女角也太好骗了吧。

又有新后宫了。

诸如此类。这是不是对人性的扭曲?对人权的侵害?如果是,那如果把主人公这一特异点去除,是不是就会解决问题?这篇博客就是在做这样的尝试。

A Paper Plane to the Past

本文链接(英文)

其实是橘子班的《12色的季节》的随想。在游戏里,纸飞机成为了穿越时空的媒介,也让错过的男主和女主重新相会。

玩了游戏的读者,是否会感觉章节的顺序其实也是一种暗示?如果有类似的感觉那我会非常高兴。

My Story

本文链接(英文)

这一篇其实是《你的故事》评论的预告一样的文章,虽然《你的故事》的评论 4 个月之后才出。感觉 n-buna 的歌《白雪》给了这篇文章很大影响,不如说这篇文章像是在进行《白雪》里的心理描写。

这里也贴一个原曲的链接

原曲是“我”在饮下毒药之前回忆起的,遇到的“你”的故事。“如果再努力一点去寻找你的话,是不是就能再踏出一步了呢。”在《你的故事》里面,也有类似的桥段。千寻从人群中看见久别的青梅竹马的脸庞,满心欢喜地前去寻觅,最后却是认错人。这一天下着暴雨。失意的他找到一个居酒屋,把自己灌醉。

如果听了这首歌,或是能够对《你的故事》有那么一点兴趣就好了。

Last Day

本文链接(英文)

这一篇其实是《景之海的 Apeiria》的预告。我努力描绘主角零一最后前往边界之塔,去结束一切的场景。最后一日的标题由此而来。

因为打完游戏也是两年多以前的事情了,所以细节我只是依稀记得。但《景之海》可以说是我打的为数不多的黄油里剧情我非常喜欢的一部作品了。

时间的回溯是游戏里反复出现的一个因素——在每一条线里,零一要去解决女主人公的问题,而他的最终目标则是打倒观察者(Observer),救回 Aperia,但前几次都因为某种原因而失败,导致时间回溯。从结构上来说,《景之海》非常类似《命运石之门》。

不过不像《命运石之门》的是,所有的悬念是在最后一口气解开,而且世界观其实也非常不同。

当你在窥视屏幕的时候,是否有一个人在屏幕之外观察着你?

虽然是我个人的品味(我比较喜欢有 meta 的作品),但是如果能引起共鸣那将是我的荣幸。

Compile Heart, Busted

本文链接(英文)

这是前年愚人节写的东西。那时候 Compile Heart 刚公布《勇者 Neptune(假定标题)》,将是一个由加拿大的工作室做的一个 2D RPG。

如果有哪位读者想玩——我也不拦就是了,毕竟我也没有玩。

Memories, Off

本文链接(英文)

标题取自秋之回忆(告别回忆)系列。当时 MO8 中文版的众筹刚刚结束,而 PC 版直到今年 4 月才上 Steam,可以说是物是人非了。

主要联系了几部作品——《我在7年后等着你》(游戏),《图书迷宫》(轻小说)和什么来着。

和《我不知道的恋爱喜剧》(轻小说)。

《图书迷宫》是 meta 的集合体。主人公不知为何失去了记忆,他能记住的,就只有写在一本名叫《最后的祈愿》的笔记上写下的内容。他只能依靠这本笔记,和在图书迷宫中发现并同行的吸血鬼女王亚历山德莉亚(抱歉,但这确实不是女性名字,我尽力了),尝试解开 5 年之前,自己的父亲被杀的谜团。

而在《我不知道的恋爱喜剧》中,主人公拥有穿越时空的能力,他一穿越,突然就有辣妹女朋友了,再一穿越,又没了。这样的故事。

两部轻小说都是比较挑读者的类型,所以如果有碰巧喜欢这两本书的同好,我会非常高兴。

虫子

本文链接

不用想也知道,这是 DDLC/心跳文学部的预告。但内容,正如后面写的一样,是在描绘出汗后浑身瘙痒的感觉。

如果看过纱世里在文化节上发表的那首诗,就会明白为什么会变成这样了。

一刀9999级的世界

本文链接

这可能是这个博客里所有搞笑玩意的起点了。

一刀 9999 级,魔法适应性 9999。难道 9999 就是最大的数字了吗?

在有些游戏里会有满级。比如《怪物猎人:世界》,满级是 999 级。在《女神异闻录5》里,满级是 99 级。Undertale 里这个数是 20 。在这些游戏里,或许是。但用一个不是游戏脑的,一般人的大脑去思考,9999 明显不是极限。

有没有可能给玩家送 9999 级是骗人的,一进游戏一看,里面都是像点击游戏里一样用 aa bb cc dd ee 来标记的等级的怪物?

文内的场景来自于旷野之息,但我不清楚那时候我有没有玩过游戏。如果看这一篇文章能够让眼镜因为超高的战斗力而炸掉,那将是我的荣幸。

ホロ's avatar

两次理想主义的尝试

几月不见甚是想念…… 会这么想的肯定是没看 咱的 Matters 啦…… (虽然那边也沉寂了好一阵子), 以及「集合啦!动物森友会」真好玩……

所以“两次理想主义的尝试”中的其中一次是什么?

在赞助了 Utopiosphere「本格异想录」 的会员计划之后,咱打算推出咱自己的会员计划了。

诶???

为啥开始寻求赞助啦?

因为穷.png

不像公众号、文章平台等可以"免费"存放内容(虽然汝和汝的读者可能会因为免费付出 其它的代价,例如自由和广告什么的……),独立博客是需要博主自己付出一定的成本来 维持运转的(例如域名和存放内容的地方)。

虽然咱前几个月终于悟出了 Likecoin 的赞赏键其实就是一个 iframe, 然后把它“移植” 到了这里,不过这几个月咱也没在这边写什么的样子,于是也形同虚设了(hmmmm)

最后还有咱自己的一点个人(?)原因,希望能得到一些声音(嗯?),咱当然也是有 回报可以拿出来的啦……

赞助者可以获得的回报有?

咱不知道还有啥词汇可以描述这群人了……

在写完这篇文章的时候,咱能够想到的大概有这些:

  • 优先阅读咱的拙作(诶?以及对于会员计划来说这好像很平常啊)

其实咱有好几次都是有好几个想法不知道先写那一篇,然后就咕咕咕了……这样大概 能让咱知道大家更想看到哪一篇,以及鞭策咱不要咕咕咕(x)

  • 某些方面的咨询服务(诶??)

只要是咱能够帮的上忙的地方,咱会努力。以及既然收了钱就会接纳(几乎全部)咱觉得 (有些)蠢的问题……

至于其它的嘛,让咱再想想……

赞助的方式?

还是草案(首先要有人愿意赞助……)
  • 「异想星空」 那边用了爱发电,看着就像有本地化的 Patreon ……
  • 在有了一些数字货币(就是 Likecoin 啦……)以后,也有意愿接收数字货币赞助 (但是有人愿意出嘛)
  • 以及可能会有优惠?

那另一次又是什么?

啊没错,咱又双想把 某个咱之前挖的大坑 的铲子捡起来了。

那么这个想法是怎么想起来的呢?

忘了……依稀还记得有一天吐槽过中文的 GNU/Linux 教程几乎都是默认用户只会用 GNU/Linux 来架设服务的那种。以及觉着 鸟哥的Linux私房菜 虽然写的很不错,但是是用的 CentOS 当作的教学范本……

于是就有想法写一部和 GNU/Linux 日常使用相关的手册的想法就这么产生了。

咱的目标是什么呢?

简单来说,咱有计划完成一部 GNU/Linux 桌面应用相关的手册,那具体有哪些方面呢?

  • 了解和 GNU/Linux 相关的一些概念
  • 自己动手安装 GNU/Linux 发行版
  • 使用 GNU/Linux 完成某些操作 (不只是运行服务)

具体的细节可以去看 咱之前的计划

自由的理想

作为 并不纯的 自由软件爱好者,咱也十分理想的想这么做:

  • 使用一个 完全自由的 GNU/Linux 发行版 作为范本,然而中途一度退而求其次的换掉了……
  • 以及尽可能的只用自由软件进行教学(?),虽然有些地方肯定不可能……
  • 以及想提醒大家稍稍关注一下隐私和安全意识(希望如此……)

但是……


大家快来投币(?)催咱不要咕咕咕啊……

想要了解两个之一(或全部)的更多细节的话,欢迎来咱的 Telegram 群交流更多细节:

链接在这里 ,如果链接失效的话 那就 @咱 请求链接好了。

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

https://afdian.net/@KenOokamiHoro
-----BEGIN PGP SIGNATURE-----

iHUEARYIAB0WIQQRcWZ9dT8okL6OyLwb09jRlMdzdQUCXpwxZgAKCRAb09jRlMdz
dVFQAQDjUk6b9H8MJaOV7+cX8ssyyBBdh3SsM1I/Sp2LK1S3fAD9HRR9ZzEv0CJR
OvdcglAV5zI9Lj1pRjGQvOti7VFaPwk=
=ygU/
-----END PGP SIGNATURE-----
Chawye Hsu's avatar

十款好评如潮的独立游戏与十张一定要听的原声带

class="tach-root">

十款好评如潮的独立游戏与十张一定要听的原声带

2020-04-10 22:22:00 杂谈
© 2015-2020 Chawye Hsu. Made with ❤︎︎ in Guangzhou
's avatar

天亮啦!动物森友会

一次在游戏中的合照,除最左村民外,从左至又依次是:芙兰,黄鼠,奎妮,萌狼, Cocoa

“动物之森?那样无聊的游戏,我还是不要浪费更多时间和金钱了吧”,第一次看到许多人为即将推出的新游戏《集合啦!动物森友会》兴奋时,黄鼠这样想到。

但这风潮似乎远比想象中更大,越来越多的玩家开始考虑是否要入手这部游戏,而其中的一些,已经开始他们的无人岛生活了。一位同样看到这场风潮,正在捉拿不定的朋友询问黄鼠会不会购买,不过黄鼠同样给出了否定的回答。

而黄鼠觉得这部游戏会无聊,也不仅是凭借粗浅从预告片看到的感觉呢。在蛮久之前,黄鼠曾使用 NDS 模拟器玩过一点《欢迎来到动物之森》,就觉得好无聊,没有玩很久就放弃了。所以这次在同样的系列发布新作的时候,黄鼠也继续认为新作会同样地无聊。

但是越来越多的人开始跳上前往无人岛的飞机了。在发售之后的一天下午,忍不住黄鼠一咬牙,决定也要冲动消费了!临时地赶在最近的百货商店关门之前,从货架上拎走了一盒《集合啦!动物森友会》。

在那之后,黄鼠的行为就变得和王镜泽一样了。

整一天的时间,几乎有做的唯一事情,就是在玩动物之森。本身就因为学校停课、整天呆在家里而变得混乱的作息,被动物之森加速成为几乎完全的黑白颠倒了。每天的睡觉时间成为了凌晨 7:00 ,起床时间成为了下午 16:30 (±3 小时)。在睡觉之前,黄鼠会望一眼窗外的天空,感叹道:“呀,天亮了呢。”


动物之森让黄鼠的作息更快坏掉、让黄鼠无法及时学习、让黄鼠整理房间的计划更加延后——这些游戏带来的坏影响,是实实在在的,不过在这里,黄鼠想要讨论的不是这些话题。

黄鼠想要讨论的,是关于人的话题。

无需质疑,动物之森使得许多平常几乎不会有交集的朋友得到了非常丰富的交流机会。平时完全没有理由说上一句话,在交流关于游戏的时候却有了许多的内容。即使只是简单的日常业务性对话,像是询问大头菜价格和交换水果,在这样的来往间,创造的羁绊大概也是存在的。

黄鼠得以了解许多可爱的人——动物之森是一个能够通过设计和搭配表达个性的游戏,每个人都拥有着的漂亮的室外景观和室内装饰,还有各种各样的可爱衣服可以收集。这是难得的体验。

可是在享受着玩家之间互相游玩的乐趣之后,黄鼠总是无法停止想到游戏所带来的排他性。在 Switch 持有者之间、在动物之森持有者之间,这部游戏让大家联系地更紧密,可是更多的没有游戏或没有主机的人,却被悄悄地排除在外了。

本身就不是联系很紧密的人群,现在被进一步分割成为了“动森玩家”和“非动森玩家”。而在意动森玩家的非动森玩家,在几乎所有人都在讨论一个自己不懂的事物的时候,大概会有很大的被排挤的感受吧。这样的感受也是黄鼠在许多人都在讨论技术话题的时候,不停地感受到的。对于本身就已经充满焦虑的人而言,这是最不想要的东西之一了。

黄鼠在意着非动森玩家的成员,但作为一个需要 Switch 主机才可以玩到的游戏,想要同时玩到实在是太大的投入了。黄鼠曾构思了一个可以让网络上的人远程玩 Switch 的计划,利用微控制器模拟手柄键入远程玩家的输入,同时利用采集卡或摄像头将画面实时传输给对方。那大概是一个可行的计划,但一定会很复杂吧,而且网络延迟也许会使游戏体验差到无法接受。似乎没有更多人有兴趣的计划,黄鼠也没有动力开始做了。

黄鼠在玩着动物之森。在接近着其他玩家的同时,却不知觉地也在同时疏远更多人呢。这样一个难得的交流的理由,却无法在更多在意的人身上使用。这样的事实,令人担心呢。


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

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

RecursiveG's avatar

WinRAR 恢复记录添加及使用教程

本文中的所有图片及文字均使用 CC0 发布,可任意转载使用。

本文属于疫情期间的摸鱼之作,旨在推广 RAR 压缩格式的正确压缩方法,让资源分享更轻松一些。

获取 WinRAR

先说一下为什么用 WinRAR 而不用 7zip, 因为 7zip 没有恢复记录。在百度网盘等平台分享文件时,文件可能发生损坏,没有恢复记录的话只能尝试重新下载浪费时间,而有恢复记录的话有大概率可以成功修复,正确解压。

国内特供版的 WinRAR 可以免费使用,但是有广告。如果不想要广告,你可以从以下链接下载官方无广告简体中文版

https://www.win-rar.com/fileadmin/winrar-versions/sc/sc20200409/rrlb/winrar-x64-590sc.exe

注意,如果你没有rarreg.key文件进行注册的话依然是有广告的。至于具体的注册方法请自行搜寻。

添加恢复记录

恢复记录需要在创建压缩文件时添加,你需要先勾选添加恢复记录复选框。

然后检查恢复记录的百分比设置。

对于大于 100MB 的大型文件文件来说,默认的 3% 足够使用。如果你的文件非常小,比如只有 几MB 或者 十几MB 你可以考虑增加到 5%。增大这项设置会同时增大文件体积,因此不建议设置得过大,尤其是对于几个 GB 的文件来说。如果你在压缩时忘记添加恢复记录或者是想要修改恢复记录的大小,也可以在事后进行操作:

损坏压缩文件的修复

如果你在解压时遇到“校验和错误”,那么你下载到的压缩文件就是损坏了:

你可以使用“工具”菜单尝试修复它。修复操作会生成一个新的,修复好的压缩包,你需要选择这个新文件的保存位置:

稍等片刻就会生成一个修复后的文件:

你也有可能在修复过程中遇到错误,但只要修复后的文件可以正确解压不报错,就没有问题。
但是只有添加了恢复记录的文件可以使用修复操作,因此所有人在压缩时都添加恢复记录是非常重要的。
如果修复后的文件依然不能正确解压,要么是损坏的部分过多无法修复,要么是资源发布者没有添加恢复记录。
在这种情况下就只能重新下载试试了。

给压缩文件加密

给压缩文件加密是防止文件被和谐的重要方法之一。

分卷压缩

如果你要分享一个非常巨大的压缩包,比如说十几个GB,直接作为一个文件分享一般不是一个好主意,因为下载者有可能下载到中途失败,不得不从头再来。将大压缩包切分成多个较小的文件可以有效减少这种情况的发生。

Linux 用户?

  • 很不幸地,创建或是修复带恢复记录的压缩包都需要rar而不是unrar
  • 如果遇到压缩包包含了文件名过长的文件,可以尝试创建一个 NTFS 格式的磁盘文件,用回环挂载,然后把文件解压进去。
AlisterTT's avatar

我们村的小伙贾洛斯

这两天在玩动物森友会,里面可以邀请很多小动物来岛上居住,其中有一只棕色的绵羊,穿的衣服颜色好像是刚果还是玻利维亚的国旗。

骚话特别多,家里的家具也特别多,特别阔绰,所以我称之为非洲王子。

岛上限制只能居住10个村民,我是一直打算把最后一个居民位留给amiibo的彭花(Rosie)的,结果彭花还没来,居民位已经满了,没办法只能赶走一个人。

正常流程是需要欺负居民,或者好感度非常高的时候对方才会搬走,这都是我不愿意看到的,刚好amiibo的特殊原因可以强制让居民迁走,就选择了才来没几天的杜美。

amiibo的强制交涉 杜美在收拾家具,第二天会离开

本来看到一个没怎么说话的村民要搬走,也没什么感觉,直到在村广场碰见了贾洛斯。他说,杜美要搬走了,希望以后还会相见,所以此时也不会说再见,而是想说一声谢谢。

心里十分不是滋味,尽管是个游戏而已,但还是莫名的愧疚和一点小难过,同时这个骚话不断的花花公子在我心中的形象也大大的改变了。之后一下午他都在裁缝铺门口给花浇水。

无意中做了一次恶霸,同时也发现了我们村的好小伙。

's avatar

4月1日吉日

20XX年4月1日吉日,魏莱从睡梦中惊起——他成为了一个有秘密的男人。

他伸手摸了摸被子——干的。他松了口气,为没有又增加了另外一个秘密而感到庆幸。但他随即意识到,现在不是放心的时候。

他从未来穿越到现在,而在未来,人类将迎来末日。

20XZ年,不明生物入侵地球。这种生物所过,寸草不生,而对人类来说,就算短暂的接触,也足以致命。几年以后,生物扩散至大半的地球。由于音讯不通,魏莱不知道其他地方的情况,但他所在的避难所只剩寥寥十数人。

但即使如此,人类也没放弃最后的希望——他们开发了能够将信息传送到过去的自己的装置,魏莱就是其实验者之一。


魏莱自己也觉得这件事有些过于超现实。但鲜明的记忆让他不得不相信确有其事。

不清楚和一起发送超时空消息的人们都怎么样了,他想。他甚至不知道那些同伴现在都在哪里。在那时候,谈论过去的事与揭伤口无异。魏莱开始后悔了,当时他应该要一两个人的家庭住址的。

到学校去碰碰运气吧,魏莱看了下表,现在是还是凌晨,想了想,有充足的睡眠才有精力找人,他又躺下了。


魏莱的好友金日找上了他。

“你知道吗?语文老师生病了,下节课自习!”金日洋洋得意地说道。或许是因为他们的语文老师作为班主任,经常带头占课;不过更有可能是因为金日昨天被叫到办公室臭训了一通,今天终于出了口恶气。

不过魏莱没放在心上,他在想他的那些同伴是不是会占领学校的广播站,用奇怪的摩斯电码,报导这一消息。

“你怎么啦?”直到金日在眼前摇晃手,他才回过神来。

“有件事跟你说,”魏莱抬起头。

“什么啊?”

“其实,人类就快濒临灭绝了。”

“哦。然后呢?”

“所以翘个一两节课也肯定没事。”

“哈哈,别当真,刚才骗你的。”

魏莱叫住了打算继续用这个把戏骗其他同学的金日。

“我是认真的,我有未来的记忆。”

魏莱大致讲述了本文第一节的内容。他没有提及被子是干的。

“我看你可能是做了一场梦,就当真了。你说的要是真的,要不试着联系联系那些同伴?如果你不是一个人回来的话。”金日叉起了腰。魏莱没有修正“回来”一词的用法。

“可我没有联系方式。”

“那你说什么。你去网上碰碰运气呗?搞不好他们也在找你呢。”

魏莱觉得有道理,午休时间偷偷摸进学校的机房,用午餐的时间,草草地写了一篇文章,放到了网上。

等他放学,饿着肚子又摸进机房看情况的时候,遗憾地,这篇文章没有一个人回应。大家或许都把这当成蹩脚的愚人节笑话了。

魏莱自己都开始觉得这事情有点不靠谱了。

魏莱觉得自己并不是那种好主动行动的人。他决定等同伴中的某个人上了新闻(他们肯定会这样联络自己),就去找他们。

“今天就先这样吧。”他对自己说。


一觉醒来,魏莱感觉自己忘记了什么事情。

“妈,昨天是什么日子?”他不抱希望地问到。

“昨天?不知道。”

翻看自己家的老黄历,今天是4月2日,昨天是4月1日,宜祭祀。

“靠,昨天忘记恶搞了。”他想。

SgDylan's avatar

批量重命名从 Pixiv 下载的图片文件

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)插入磁碟片間的位置 …

imi415's avatar

Archlinux上Buildroot的基础使用

如何使用Buildroot为自己量身定制Rootfs
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的方案。
終於。今天晚上無聊,自己摸索出解決方案,開機再也沒有煩人的提示音,叫它也不會再應答,符合我自己的使用場景,現在把方法分享出來,其實核心內容很簡單,就是通過adb調用pm命令把斐訊全家桶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掉,不然頂部的音量調節功能會失效。另外,為了讓開機的音效消失,需要把com.phicomm.speaker.device禁用,但是這樣按三下頂部按鈕開啟藍牙的功能就會失效

雖然隨時都可以通過執行adb shell /system/bin/pm unhide com.phicomm.speaker.device命令恢復藍牙的功能,但是每次這個app啟動,都會有很震耳的音效,每次執行命令之前都要注意R1的音量大小。

然後重新啟動就可以了:

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 如果徹底幹掉的話,想刷機就只能拆開,手工焊接上調試端口刷機了。

這篇文章 斐訊 R1 音箱關閉開機提示音 最早出現於 OXの胡說八道

依云'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,部分新剧情资源预载

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 是台达的 flex 电源,宽电压,最大输出 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 年计划?

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

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日凌晨)

這篇文章 寫在2019年年末 最早出現於 OXの胡說八道

ホロ'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 算是比较热门的两个滤镜,前者能借助卷积神经网络修复部分纹理,后者则能够提供优秀的锐化效果。
但遗憾的是,这两个滤镜并不能混合使用。本文即是以此为题展开的探索。

依云'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

90块的IPQ4019灵车,PCI-E能吃么
ホロ'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 官方移动客户端,还有这些东西值得注意

class="tach-root">

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

2019-11-16 0:15:00 杂谈
© 2015-2020 Chawye Hsu. Made with ❤︎︎ in Guangzhou
'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 都在用呀~

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 明明有各種免費的企業郵局,為什麼還要自建郵件服務器? 因為我域名太多了。另外我精力旺盛。自建一個屬於自 … 繼續閱讀 在家架設一台郵件伺服器的全套過程記錄

這篇文章 在家架設一台郵件伺服器的全套過程記錄 最早出現於 OXの胡說八道

ホロ'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三杰之二:真理。

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卡不支持硬解……

via these people and places