#110 魔戒的世界

2016-01-15

托尔金

世界观

  1. 一神教的世界观,整个世界仿佛是上帝的一个沙盘游戏。
  2. 远古的历史是精灵族的视角记录下来的。甚至是一种口口相传的故事的感觉在描述,有存在冲突的地方。

这里的上帝叫做一如 Eru,或者伊露维塔 Ilúvitar。
一如在虚空中创建了时空(一亚),又在这个时空中创建了一个平面的世界阿尔达(天如穹庐,笼盖四野)。
帮助一如创世的是埃努,一如的意识,他们通过音乐(埃努的大乐章)来创造世界。
有一个是例外,一如独立创造了精灵和人类,给精灵的礼物是真善美,给人类的礼物是死亡。
为了继续完善这个世界,照顾好神的孩子,部分埃努离开一如,进入了阿尔达,其中力量强大的叫做维拉 (女性维拉也被称为维丽 Valier),有 15 位,普通的叫迈雅,数量比较多(包括神犬胡安和巨鹰)。
部分埃努黑化,其中包括维拉米尔寇 Melkor(后来叫做魔苟斯 Morgoth(黑暗暴君)),迈雅索伦。

阿尔达

霍比特人,魔戒,精灵宝钻发生的时间都比较晚,主要发生在中土大陆。

第二纪元,阿门洲被剥离出来,剩下的阿尔达被卷曲成了一个球形。无法直接从中洲走到阿门洲。

远古

魔王一直给埃努捣乱,破坏了给整个世界带来光明的两盏巨灯。
埃努就囚禁了魔王,又在阿门洲创造了两棵巨树,能照亮阿门洲的部分区域。
等精灵苏醒过来之后,带绝大部分精灵穿越大海,从中土来到阿门洲。

结果后来部分精灵被魔王蛊惑,对埃努心生不满,甚至产生内乱,离开阿门洲,返回中州。
埃努就开始不再干涉中洲的事情。

生物

中土世界的五个迈雅,有两位去了东方,在故事中没有出现,剩下三个:白袍巫师萨鲁曼,灰袍巫师甘道夫,褐袍巫师。

除了精灵和人类,其他的智慧生物:

  1. 矮人(Dwarves)由维拉奥力(大地之神)创造
  2. 霍比特人 Hobbits 是人类
  3. 半兽人 Goblin、奥克 Orcs,是魔王用精灵和人类培育出来的黑暗生物。
  4. 安格玛巫王 Witch-King of Angmar,就是戒灵,也就是被索伦控制的人类持戒者(曾经是人类)。
    在北面建立的安格玛王国,统治黑暗人类,半兽人,或其他黑暗生物。
  5. 恩特 Ents,树人,维拉雅凡娜创造,保护森林。
  6. 食人妖,魔王创造。
  7. 恶龙 Dragons,魔王创造。
  8. 恶狼 Wolves,黑暗生物。被当做坐骑的恶狼也叫座狼 Wargs。
  9. 巨型蜘蛛 Spiders,黑暗生物。远古恶灵乌苟立安特的后裔。乌苟立安特和魔王一起毁掉了圣树。

精灵宝钻 The Silmarillion

  1. 埃努的大乐章 The Ainulindale
  2. 维拉本纪 The Valaquenta
  3. 精灵宝钻争战史 The Quenta Silmarillion
  4. 努曼诺尔沦亡史 The Akallabeth
  5. 魔戒及第三纪元 Of the Rings of Power and the Third Age

霍比特人

  1. 意外之旅
  2. 史矛革之战
  3. 五军之战

魔戒、指环王

  1. 护戒同盟队
  2. 双塔奇兵
  3. 王者归来

地图

https://en.wikipedia.org/wiki/Middle-earth

  • 双灯纪元地图
  • 双树纪元地图
  • 贝尔兰的沉没(Beleriand)
  • 和我们这个世界的映射,大概对应欧亚大陆

时间线

  • 巨灯纪元,创世,神界一战,创造两盏巨灯,被毁,埃努移居阿门洲,创造巨树。
  • 巨树纪元,发生在阿门洲的故事,精灵宝钻打造出来,神树被毁,精灵族内乱,部分精灵返回中洲,创造太阳月亮。
  • 第一纪元,人类苏醒,最后埃努打败魔王。
  • 第二纪元,索伦起来,最后被人类精灵联军打败,戒指被人王拿走。
  • 第三纪元,霍比特人,魔戒的背景。最后索伦被彻底消灭。
  • 第四纪元。

参考资料与拓展阅读

#109 FTP, FTPS, SFTP

2016-01-14

FTP

  1. 文件传输协议,File Transfer Protocol
  2. 最古老的网络服务之一
  3. 默认端口 21
  4. 20 端口用于数据传输

https://en.wikipedia.org/wiki/File_Transfer_Protocol

B/S 模式,一个连接两个通道,命令通道传输控制指令以及响应,数据通道传输数据。

认证

S: 220 Welcome to markjour.cn FTP service.
C: USER admin
S: 331 Please specify the password.
C: PASS ****************
S: 230 Login successful.

主动、被动

  • 主动模式:PORT 命令连接服务器,服务器再创建一个连接,使用 20 端口连接客户端指定端口
  • 客户端从一个随机端口 A 连接服务器 21 端口,这是命令通道
  • 客户端监听另一个随机端口 B,并通过命令通道发送 PORT 命令(port B),告诉服务器客户端开放的数据端口
  • 服务器通过 20 端口连接到客户端数据端口
  • 被动模式:PASV 命令连接服务器,服务器随机选择一个端口,客户端就连接这个端口

IPv6 引入之后,有了两个新的指令(RFC#2428):

  • EPRT 命令
  • EPRT |<网络协议>|<IP>|<端口>|
  • 网络协议:1 IPv4;2 IPv6
  • EPSV 命令
  • 拓展被动模式 Extended Passive Mode
  • EPSV 1EPSV 2EPSV ALL

命令

https://en.wikipedia.org/wiki/List_of_FTP_commands

FTPS

FTP Secure,FTP over SSL
FTP + TLS

显式 TLS / 隐式 TLS

SFTP

Secure File Transfer Protocol,安全文件传送协议,SSH 的一部分。
需要借助 sshd 充当服务器端。

https://en.wikipedia.org/wiki/SSH_File_Transfer_Protocol

SFTP 和 FTPS 的区别就是分别使用 SSH 协议和 TLS 协议实现网络加密。

TFTP

  1. 小型文件传输协议,Trivial File Transfer Protocol
  2. 1981 年,RFC 783
  3. 只在 PXE 场景下见过

常用工具

其他文件传输协议

https://en.wikipedia.org/wiki/Comparison_of_file_transfer_protocols

  • FSP https://en.wikipedia.org/wiki/File_Service_Protocol

#108 二进制计算

2016-01-08
符号                
0 1 1 1 1 1 1 1 127
0 0 0 0 0 0 1 0 2
0 0 0 0 0 0 0 1 1
0 0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1 −1
1 1 1 1 1 1 1 0 −2
1 0 0 0 0 0 0 1 −127
1 0 0 0 0 0 0 0 −128

原码,反码,补码

  1. 正数的原码,反码,补码相同
  2. 负数的反码:符号位不变,其余位取反
  3. 负数的补码:反码 + 1

CPU 可以很快的计算加法,但是减法、乘法、除法就复杂得多。
减法的计算:1 - 1 = 1 + (-1)
如果带上符号,CPU 需要区分符号位,计算起来就复杂了。
1 + (-1) = [0001]原 + [1001]原 = [1010]原 = -2

所以发明反码,解决了符号位的问题。
1 + (-1) = [0001]反 + [1110]反 = [1111]反 = [1000]原 = -0
其背后肯定有计算机科学专家的严密论证。

原码和反码的问题:+0,-0
所以发明补码,将数据表示范围从 [-7, 7] -> [-8, 7]

为了方便,还是以四位二进制为例说明:

数字 原码 反码 补码
0 0000 0000 0000
1 0001 0001 0001
2 0010 0010 0010
3 0011 0011 0011
4 0100 0100 0100
5 0101 0101 0101
6 0110 0110 0110
7 0111 0111 0111
-1 1001 1110 1111
-2 1010 1101 1110
-3 1011 1100 1101
-4 1100 1011 1100
-5 1101 1010 1011
-6 1110 1001 1010
-7 1111 1000 1001

原码还剩最后一种组合:-0,也就是 1000,对应反码 1111。补码还剩 1000
但是补码 1000 在我们的 CPU 加法器中可以起到 -8 的作用:

(-1) + (-7) = [1111]补 + [1001]补 = [1000]补
(-2) + (-6) = [1110]补 + [1010]补 = [1000]补

补码的计算:
1 + (-1) = [0001]补 + [1111]补 = [0000]补 = [0000]原 = 0
背后肯定也是有严密论证的。

所以,现在,计算机内部的计算都是以补码形式进行

乘法的实现


除法的实现


取余的实现


逻辑运算

逻辑运算 数学表示 编程
$a \land b$ &
$a \lor b$ |
$\neg a$ !
异或 $a \oplus b$ ^
左移位 $a \ll 4$ <<
右移位 $a \gg 4$ >>

#107 蓝牙

2016-01-06

蓝牙(英语:Bluetooth),一种无线通讯技术标准,用来让固定与移动设备,在短距离间交换资料,以形成个人局域网(PAN)。其使用短波特高频(UHF)无线电波,经由 2.4 至 2.485 GHz 的 ISM 频段来进行通信。1994 年由电信商爱立信(Ericsson)发展出这个技术。它最初的设计,是希望创建一个 RS-232 数据线的无线通信替代版本。它能够链接多个设备,克服同步的问题。
蓝牙技术目前由蓝牙技术联盟(SIG)来负责维护其技术标准,其成员已超过三万,分布在电信、电脑、网络与消费性电子产品等领域。IEEE 曾经将蓝牙技术标准化为 IEEE 802.15.1,但是这个标准已经不再继续使用。

蓝牙版本 发布时间 最大传输速度 传输距离
蓝牙 5.3 2021 2 Mbit/s 300 米
蓝牙 5.2 2020 2 Mbit/s 300 米
蓝牙 5.1 2019 2 Mbit/s 300 米
蓝牙 5.0 2016 2 Mbit/s 300 米
蓝牙 4.2 2014 24 Mbit/s 50 米
蓝牙 4.1 2013 24 Mbit/s 50 米
蓝牙 4.0 2010 24 Mbit/s 50 米
蓝牙 3.0+HS 2009 24 Mbit/s 10 米
蓝牙 2.1+EDR 2007 3 Mbit/s 10 米
蓝牙 2.0+EDR 2004 2.1 Mbit/s 10 米
蓝牙 1.2 2003 1 Mbit/s 10 米
蓝牙 1.1 2002 810 Kbit/s 10 米
蓝牙 1.0 1998 723.1 Kbit/s 10 米

根据上面这个表提供的数据,现在主流的蓝牙 4 和 5,传输速率均低于 2 Mbit/s,距离均低于 300 米。

蓝牙的高速传输需要借助 WiFi,非常鸡肋。

EDR(Enhanced Data Rate)
HS(High Speed)

参考资料与拓展阅读

附:蓝牙 1.0 到 6.0 解释:蓝牙版本彼此之间有何不同?

您的所有设备都需要最新的蓝牙版本吗?

由卡尔文·万赫德
10 月 6, 2024

https://www.androidauthority.com/bluetooth-versions-3488170/

在短短几十年的时间里,蓝牙已经从一个小众的无线协议发展成为一种无处不在的技术,我们每天都依赖它来连接从耳机到智能家居设备的所有设备。它现在是短距离无线通信的首选标准,也许只有 Wi-Fi 能超越它的实用性和普及性。

但是,虽然蓝牙表面上看起来是一项相当稳定且平淡无奇的技术,但多年来该协议实际上已经发生了几次重大变化。事实上,一些较旧的蓝牙版本的好处仍然没有进入我们的设备。

幸运的是,我们的设备支持多个蓝牙版本,并根据可用性和用例自动选择最佳版本。但是每个主要和次要蓝牙版本有什么区别,哪个是最新的呢?以下是您需要了解的一切。

蓝牙 1.0:为什么发明蓝牙?

无需深入研究蓝牙的历史,该技术最初是为了将蜂窝连接集成到笔记本电脑中而发明的。在 1990 年代后期,IBM 和 Ericsson 的工程师意识到,由于高功率要求,将手机直接集成到笔记本电脑中是不可行的。因此,他们决定依靠 Ericsson 自 1994 年以来一直在开发的低功耗通信协议。他们从理论上推测,这项技术将允许手机和笔记本电脑进行短距离通信。

IBM 和 Ericsson 向其他公司开放了这项技术,这导致了蓝牙特别兴趣小组 (SIG) 的诞生。SIG 于 1999 年推出了第一个蓝牙版本,随后推出了展示该技术的免提手机。然而,目前市场上没有手机支持该技术。第一款配备蓝牙的手机仅在两年后的 2001 年发布。

蓝牙 1.0 是作为串行电缆的无线替代品而开发的。
尽管如此,爱立信开发蓝牙 1.0 主要是作为 RS-232 标准的无线替代品,RS-232 标准是当时计算机的常见功能。RS-232 串行电缆用于鼠标和键盘等外围设备以及用于拨号互联网的调制解调器连接。然而,这些端口又大又笨重。

所有这些都表明,1999 年的蓝牙与今天的蓝牙相差不远——一种用于无线连接设备的多功能、低功耗解决方案。主要动机是便利,即使在今天,无线耳塞取代了智能手机上古老的耳机插孔,情况仍然如此。

第一个版本的蓝牙存在一些缺陷,例如传输速度有限和最大范围仅为 10 米。

蓝牙 2.0 – 2.1:安全配对和快速数据传输

蓝牙的第二个版本于 2004 年发布,带来了一些急需的升级,其中最主要的功能是增强数据速率 (EDR)。后者使该技术能够实现高达 3 Mbps 的速度,从而支持无线音频等新用例。它还使一台计算机能够同时连接到多个设备,这意味着您可以同时使用蓝牙键盘、鼠标和打印机。

蓝牙 2.0 还能够比第一个版本传输更远的距离。它的最大射程为 30m,是原始标准的三倍。

2007 年,蓝牙 2.1 引入了一种称为安全简单配对 (SSP) 的新配对机制,极大地改善了用户体验和连接安全性。如果您曾经在配对两个蓝牙设备时比较并确认过 PIN,您可能已经熟悉 SSP。这为不安全的固定 PIN (如 0000)提供了一种更安全的替代方案,在蓝牙 2.1 发布之前,这些 PIN 通常用于配对。

蓝牙 3.0:更快的速度,有一个 catch

蓝牙 3.0 于 2009 年推出,由于一项称为高速 (HS) 的可选功能,引入了显着的速度提升。这使得蓝牙设备能够实现高达 24 Mbps 的数据传输速率,但有一个很大的警告:快速的实际数据传输不会通过蓝牙链接本身进行。相反,蓝牙仅用于配对和通信,而实际的数据传输是通过 Wi-Fi 进行的。

当然,高速数据传输要求设备同时包含蓝牙和 Wi-Fi 硬件。虽然此类设备确实已经存在,但很少有制造商采用该功能。蓝牙规范将蓝牙 3.0 的 HS 部分设为可选部分也无济于事。

蓝牙 3.0 最终比其他版本鲜为人知,尽管它为技术带来了有意义的升级。例如,当设备处于不同范围时,增强的功率控制为改进电源管理铺平了道路,并减少了不必要的电池消耗。

蓝牙 4.0 – 4.2:低功耗与经典

Galaxy Watch 4 与 Galaxy A51 手机配对。
当蓝牙 4.0 宣布并被 Bluetooth SIG 接受时,该技术已在便携式设备上变得司空见惯。然而,随着该技术开始用于在设备之间长时间传输数据,电池寿命是一个大问题。那时,始终连接的可穿戴设备和蓝牙耳塞的概念刚刚出现。

为了支持这些应用,Bluetooth SIG 决定将该技术的开发分为两条不同的路径。第一个被称为 Classic Bluetooth,从以前的版本继续,没有对协议进行重大更改。但是,4.0 版本还引入了低功耗蓝牙 (BLE),专为低功耗设备设计,可在保持连接的同时消耗尽可能少的功率。

低功耗蓝牙为现代可穿戴设备和无线音频产品铺平了道路。
低功耗蓝牙适用于需要短时间传输数据的设备,例如当您的可穿戴设备与手机同步步数数据时。蓝牙 4.2 等后来的修订版还针对智能家居行业带来了隐私和安全增强功能,允许传感器传达运动检测等触发器。然而,后者从未真正起飞——当今绝大多数消费类智能家居产品都使用 Zigbee 等竞争性无线标准,而不是 BLE。

尽管如此,低功耗蓝牙仍然改变了游戏规则。该技术旨在在纽扣电池上运行数月甚至数年,从而将具有外形尺寸的新设备推向市场。更好的是,设备可以同时支持 Bluetooth Classic 和 LE 变体,并根据需要在它们之间切换。

蓝牙 5 – 5.4:LE Audio 等

蓝牙 5 于 2016 年发布,占据主导地位。SIG 继续分别开发 Bluetooth Classic 和 LE,每个分支都获得了有用的功能。

例如,通过蓝牙 5 低功耗链路的传输速度是上一代的两倍,最高可达 2 Mbps。设备还可以牺牲数据速度来获得四倍的距离,在理想条件下最高可达 240 米。蓝牙 5 率先提供带宽灵活性 — 设备可以选择优先考虑更远的距离、低能耗使用或高传输速度。这意味着可以开发新的蓝牙编解码器来提高音频质量,同时仍受益于 BLE 的低功耗。

2019 年,蓝牙 5.1 引入了测向功能,可以精确追踪到几厘米。虽然超宽带 (UWB) 技术已成为智能追踪器的行业标准,但蓝牙现在可用于粒度较小的跟踪应用。

LC3 编解码器和 Auracast

仅仅一年后,我们就看到了蓝牙 5.2 和 LE Audio 标准的发布。后者包括一个新的低复杂度通信编解码器 (LC3)。LC3 以较低的比特率提供卓越的音频质量,同时还利用了蓝牙 LE 的低功耗。

到 2020 年,像 Apple AirPods 这样的真无线耳塞已经获得了巨大的发展势头。然而,Bluetooth Classic 老化的 SBC 编解码器在音频质量方面还有很多不足之处。LC3 以较低的比特率提供更好的质量,同时在此过程中延长电池寿命。

蓝牙 5.2 引入了 LE Audio 和用于高质量无线音频的新编解码器。

蓝牙 5.2 还引入了对音频广播或 Auracast 的支持。该功能允许一个蓝牙源将音频流式传输到多个接收器。这意味着您可以同时将手机的音频输出到朋友的耳塞和您自己的耳塞。该版本还增加了对助听器的支持——想象一下使用 Auracast 将音频从单个来源输出到分布在剧院或体育场的多个助听器。

蓝牙 5.3 和 5.4 分别于 2021 年和 2023 年发布,带来了稳定性和连接性的改进。虽然这些版本没有为该技术带来任何华丽的新功能,但蓝牙 5.4 引入了对带响应的定期广告 (PAwR) 的支持。该功能允许单个蓝牙信标同时向多达 7,000 台设备广播消息。这在哪些方面有用?在采用电子货架标签(通常是电子墨水)的大型商店中。以前的蓝牙版本需要每个标签的往返通信,这会导致大型商店的更新延迟。

蓝牙 6.0:新标准

智能手机上 AirTag Stock 照片 1 旁边的 Apple Find My 徽标
经过近十年的小版本更新,Bluetooth SIG 终于在 2024 年 8 月 27 日宣布了下一代主要蓝牙。这使得蓝牙 6.0 成为当今可用的最新版本,尽管您必须等待一段时间才能让消费设备采用它。

蓝牙 6.0 的亮点新功能是蓝牙信道探测,它允许设备准确测量彼此之间的物理距离。前几代人依靠信号强度来估计距离,这对于智能锁和车钥匙来说不够准确。蓝牙信道探测使用往返时间 (RTT) 和基于相位的测距 (PBR) 进行精确的距离测量,类似于 UWB。

蓝牙 6.0 从 UWB 的工资簿中汲取了一个诀窍。

在其他地方,蓝牙 6.0 为音频应用带来了更多的安全性和效率改进以及更低的延迟。第一批支持蓝牙 6.0 的设备应该会在 2025 年出现。

#106 ab 报告解析

2016-01-02

安装

CentOS 下的安装:

sudo yum install -y httpd-utils

Debian/Ubuntu 下的安装:

sudo apt install -y apache2-utils

使用

ab -n 请求数 -c 并发书 URL

常用参数:

  • -n 请求数
  • -c 并发数
  • -t 持续测试时间
  • -k 启用 HTTP KeepAlive
  • -H 设置请求头
  • -m 请求方式
  • -T 设置 Content-Type
  • -p 设置 POST 数据文件

如果 POST 请求:

echo 'key1=value1&key2=value2' > /tmp/postdata
-T 'application/x-www-form-urlencoded' -p postdata

echo '{"key1":"value1","key2":"value2"}' > /tmp/postdata
-T 'application/json' -p postdata

报告解读

执行 ab -n100 -c10 https://www.baidu.com/ 可以得到以下结果:

ab result image

需要重要关注的数据做了标记,分别是:

  • 失败数 Failed requests
    应该尽最大可能保证失败数为 0, 也就是成功数 100%
  • 吞吐量(QPS/TPS) (Requests per second)
  • 平均响应时间 (第一个 Time per request)
    应该等于:测试持续时间 / 请求数
    应该等于:并发数 / 吞吐量
  • 最长响应时间 (最后面那行,100% longest request)
    80%, 90%, 95% 响应时间, 也可作为重要参考。

测试方案

Update @ 2021-12-29

url="https://www.baidu.com/"

rm -rf /tmp/httpbench-*.log
for c in {1,2,3,4,5,6,7,8,9,10,20,30,40,50,60,70,80,90,100,150,200,250,300,350,400,450,500,600,700,800,900,1000};
do echo "==== Concurrency Level: $c ===="; let n=$((c * 100)); ab -n $n -c $c $url > /tmp/httpbench-$c.log; sleep 10; done;

然后用 Python 脚本解析 ab 输出生成报告。

Python 代码就不贴了, 如果感兴趣可以打开看看: abReport.py

如果觉得我的方案不妥当,非常欢迎提出意见或建议。

Update @ 2021-12-30:

又对 abReport.py 做了调整 (abReport2.py),现在可以输出一个 ECharts 图表了(尽整些花里胡哨的东西)。

doge

#105 时区

2016-01-01

时间是客观存在的,但我们对时间的认识却是主观的。
我们的计时方法深受我们的语言和文化的影响。

#104 Python 文件压缩方式汇总

2015-12-31
  • zlib — Compression compatible with gzip
  • gzip — Support for gzip files
  • bz2 — Support for bzip2 compression
  • lzma — Compression using the LZMA algorithm
  • zipfile — Work with ZIP archives
  • tarfile — Read and write tar archive files

#101 一则耐克广告

2015-11-30

这其实只是耐克嵌入影片的一段软广告,不过广告文案写得确实很赞,甩开国内那些硬插式广告几万光年了吧!