跳到主要内容

bit, byte, KB, GB, MG, TB, PB

· 阅读需 1 分钟

1bit 是计算机中最小的数据单位,1bit 就对应一个高低电位。

$$$ 1bit \times 8 = 1byte $$$

$$$ 1byte \times 1024 = 1KB (kilobyte) $$$

$$$ 1KB \times 1024 = 1MB (megabyte) $$$

$$$ 1MB \times 1024 = 1GB (gigabyte) $$$

$$$ 1GB \times 1024 = 1TB (terabyte) $$$

$$$ 1TB \times 1024 = 1PB (petabyte) $$$


在 UTF-8 编码中

  1. 一个 US-ASCII 字符只需要 1byte
  2. 带有变音符号的拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、叙利亚文等字符需要 2byte
  3. 其他语言(包括中日韩文字、东南亚文字、中东文字等)使用 3byte
  4. 极少数语言用 4byte

简单好用的 SemVer: 如何命名你的应用版本

· 阅读需 1 分钟

SemVer 是目前较为流行的命名版本的规范,它的全称是 Semantic Versioning Specification,语义化版本命名规范。

它对版本的命名构成主要为:

  • X,Major 版本,版本迭代,会有兼容问题
  • Y,Minor 版本,更新功能,不应该有兼容问题
  • Z,Patch 版本,修复 Bug,更小程度的变动,不会有兼容问题
  • Pre-release,预发布版本,主要是 alpha、beta、insiders,正式发布前的不稳定版本,用于内部、社区、提前体验的用户
  • Build,一般是打包构建时的 commit id

SemVer 的规则简单明了,学习成本极低,这大概就是为什么 SemVer 如此流行的原因了。

[1] https://semver.org/spec/v2.0.0.html [2] https://www.baeldung.com/cs/semantic-versioning

什么是 IP 欺骗?

· 阅读需 5 分钟

什么是 IP 欺骗?

伪装源地址的 IP 欺骗包(Spoofed IP packets)通常用于攻击中,它的目的是在攻击中避免源地址被侦测得到。

IP 欺骗是创建具有修改源地址的 Internet 协议 (IP) 数据包,以便隐藏发送者的身份、冒充另一个计算机系统或两者兼而有之。 这是一种经常被坏人用来对目标设备或周围基础设施发起 DDoS 攻击的技术。

发送和接收 IP 数据包是联网计算机和其他设备进行通信的主要方式,是现代互联网的基础。 所有 IP 数据包都包含一个位于数据包主体之前的标头,并包含重要的路由信息,包括源地址。 在普通数据包中,源IP地址是数据包发送者的地址。 如果数据包被欺骗,源地址将会被伪造。

ip-spoofing

IP 欺骗类似于攻击者发送一个数据包给某个人,这个人会拿到一个错误的返回地址。如果收到数据包的这个人想要停止发件人发送数据包,通过阻止虚假地址的数据包的手段是起不到作用的,因为地址相当容易更改。相关地,如果接收方想要响应返回地址,他们的响应包会去到别的地方,而不是真正的发送者。 伪装数据包地址的能力是许多 DDoS 攻击利用的核心漏洞。

DDoS 攻击通常会利用欺骗,目的是用流量淹没目标地址设备,同时掩盖恶意源地址的身份,阻止缓解措施。 如果源 IP 地址被伪造并不断随机化,阻止恶意请求变得相当困难。 IP 欺骗还使执法和网络安全团队难以追踪攻击的肇事者。

欺骗还用于伪装成另一个设备,以便将响应发送到该目标设备。 NTP 放大和 DNS 放大等容量攻击就是利用这个漏洞。 修改源 IP 的能力是 TCP/IP 设计所固有的,使其成为一个持续的安全问题。

与 DDoS 攻击相关联的是,欺骗攻击还可以伪装成另一个设备,以避开身份验证,获得访问或“劫持”用户会话的权限。

如何防止 IP 欺骗(包过滤)

虽然无法防止 IP 欺骗,但可以采取措施阻止欺骗数据包渗入网络。 一种非常常见的欺骗防御措施是入口过滤,在 BCP38(最佳通用实践文档)中进行了概述。 入口过滤是一种数据包过滤形式,通常在网络边缘(network edge)设备上实现,它检查传入的 IP 数据包并查看它们的源头。 如果这些数据包上的源头与它们的来源不匹配,或者它们看起来很可疑,则数据包将被拒绝。 一些网络还将实施出口过滤,它查看离开网络的 IP 数据包,确保这些数据包具有合法的源头,以防止网络中的某人使用 IP 欺骗发起出站恶意攻击。

Reference

[1] What is IP spoofing? https://www.cloudflare.com/learning/ddos/glossary/ip-spoofing/

不用中间变量实现数值交换

· 阅读需 2 分钟

介绍三种不用中间变量实现数值交换的方法,

1. 加减法

假设有变量

let a = 2, b = 5

交换

a = a + b // a = 7

b = a - b // b = 2

a = a - b // a = 5

缺点:

  • 只能处理数值
  • 数值太大相加的时候可能会溢出

2. 乘除法

有加减法那么就自然可以联想得到乘除法:

a = a * b // a = 10

b = a / b // b = 2

a = a / b // a = 5

缺点:

  • 会有精度损失
  • 被除数不能为 0

3. 异或法

异或是一种数学运算,不同为 1,相同为 0:

结果
000
011
101
110

在计算机中进行异或运算,需要先把数值换算成二进制,a 的二进制为 010b 的二进制为 101

a = a ^ b // 010 ^ 101 = 111

b = a ^ b // 111 ^ 101 = 010

a = a ^ b // 111 ^ 010 = 101

缺点:

  • 无法处理浮点型变量

总结

三种方法都是奇技淫巧,仅供学习使用,生产环境最好不要用。

并发和并行的简单区分

· 阅读需 3 分钟

刚开始学并发和并行时总是整得有点懵,现在终于下手来好好梳理着两者的关系了。

首先并发的单词是 Concurrency,词根 con - 的意思是“一起”,而 current - 词根的意思是“当前”,所以总的意思就是“一起发生的事情”

并行的单词是 Parallelism,词根 parallel - 是平行、并列的意思,所以总的意思就是“平行发生的事情”,也可以说“同时发生的事情”

举一个知乎答主提到的一个形象的例子:

你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行。

你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这说明你支持并发。

你吃饭吃到一半,电话来了,你一边打电话一边吃饭,这说明你支持并行。

并发的关键是你有处理多个任务的能力,不一定要同时。并行的关键是你有同时处理多个任务的能力。所以我认为它们最关键的点就是:是否是『** 同时 **』。

从这位知乎答主的我们其实就能够知道:并行是并发的一种特殊情况。 并发只要求有处理多个任务的能力,而并行要求有 ** 同时 ** 处理多个任务的能力

借此,我们来梳理一下多核 CPU 和单核 CPU 的并发、并行性

首先是针对单核 CPU,单核 CPU 很明确,一个时刻只能做一件事情,所以它不可能具备并行性,但它可能具备并发性(如果这台 CPU 支持处理多个任务的能力的话)

其次是多核 CPU,多核 CPU 就是多个单核 CPU 组成的,那么同一时刻处理多个任务就是一件轻而易举的事情了,也就是具有了并行性(有并行性就一定有并发性,前面我们已经说了并行性是并发性的一种特殊情况)

另一个角度看待对数

· 阅读需 1 分钟

之前一直对对数 $log$ 一直不太了解,最近看到算法图解中给对数的另一个解释,挺有意思的,在此记录一下,比如有一个对数:

$$ log_28 $$

它可以看做多少个 2 相乘等于 8,答案当然是 3,毕竟 $2^3=8$ 嘛

$$ 2\times2\times2=8 $$

上面的角度是以底数为主的,再推而广之一下,若以真数为主,也可以看作是 8 连续除以多少个 2 等于 1

$$ 8\div2\div2\div2=1 $$

简要介绍进制和 ASCII 码表

· 阅读需 5 分钟

1. 什么是进制

  • 进制 进制全称“进位计数制”,一种计数方式,比较常用的是十进制
    • 十进制 十进制就是逢十进一,所以十进制有 10 个数字表示——0,1,2,3,4,5,6,7,8

生活中除了十进制还有很多常见的进制,可能你没有注意到,比如时钟,秒数是 60 进制,秒针从 0 走到 59 后,再走一分钟逢 60 进一成为一分钟。

再说计算机,计算机中也可以采用十进制来代表数字,那为什么偏偏要用二进制呢?原因很简单,因为二进制只有 0 和 1,表示起来很简单。

那为什么说二进制为什么简单呢?因为计算机底层也是硬件,每次硬件在两条路径和十条路径中选择肯定前者来得轻松,只不过为了达到同样目的地,二进制需要多走几步。

2.话说二进制

我们先来看看十进制是怎么表示的,假设我们现在有一个十进制的数字 $(3107)_10$

注意

  1. 这里数字 $(3107)10$ 用括号括起来,下标是10,表示它是10进制 这个下标就是用来表明它是什么进制的,比如 $(3107)8$ ,==注意此时它的下标是 8,那它就不是十进制了==,而是八进制了 另外,为什么平时不这些写呢?因为十进制太通用了,不写默认它就是十进制
  2. 除了这种表示方法,常用的还有后缀字母表示法,你可能遇到过: 比如 3107H,在==数字后面加上字母H,表明它是个十六进制的数字==

这个 $(3107)_10$ 我们拆开来看的话:

$$ 3×10^3+1×10^2+0×10^1+7×10^0
$$

我们再来看一个二进制数字$(1101)_2$,它也可以表示为

$$ 1×2^3+1×2^2+0×2^1+1×2^0 $$

看到这里你应该能明白到为什么叫做十进制和二进制的原因了吗?

再说进制的转化,二进制转十进制很简单,你把

$$ 1×2^3+1×2^2+0×2^1+1×2^0 $$

接下来按十进制来计算

$$ 8+4+0+1 $$

就等于 $(13)_10$,直接写成 $(1101)2$=$(13)10$

3.什么是ASCII码

  • ASCII ((American Standard Code for Information Interchange)美国信息交换标准代码),名字怪长的,我们只着眼于代码这两个字就好了

我们知道,计算机表示数字是比较简单的,但如何表示文本呢?比如 a、b、c、d 这些英文,甚至是标点符号、汉字等等

前人做了一个很好的替换,就是先建一个表,表中存放着这些文本符号

文本符号
a
b
c

再给这些文本编个顺序

号码文本符号
0a
1b
2c

你要取的时候,按照号码来就好了,想要 a 输入 1,想要 b 输入 2,依次类推(这时你可能会明白一点“代码”的意思)

那么 ASCII 码表是作为较早期的符号表,多早呢?1967年,当时美国人发明的,要知道美国人用的语言就 26 个字母,再加上一些乱七八糟的符号等等,用 128 个字符就能够涵盖了

那为什么是 128 这个数字呢?在前面提到,计算机是用二进制表示的,从 0 号开始编码,一直到 127 号,刚好就是 128 个号码

那么最小号码是 0 号,最大号码是 127 号,那么如果我们能用数字表示最大的号码,那么比他小的号码也都能表示,而 $(1111111)_2$ 就等于 127,我们展开来看

$$ 1×2^6+1×2^5+1×2^4+1×2^3+1×2^2+1×2^1+1×2^0 $$

另外,这个$(1111111)_2$ 一共有7位,所以也可以说成用 7 位表示的ASCII码表

首字母大写规范指南

· 阅读需 7 分钟

不管是在生活写作中,还是创建 Pull Request,或者给开源项目提交 Issue 的时候,我们都需要用到英文标题,那么对于哪些部分需要首字母大写,则是一件头疼的事情,下面详细列出英文中首字母大写规范,此规范来自 Scribendi,这是一家超过 20 多年的对英文作品和文档进行编辑和校对的团队,其首字母大写规范吸纳了 Chicago, MLA, and APA 等首字母大写规范而成,极具参考价值。

@[toc]

一、人名,地名,物品 📍

人名、地名还有特定的物品和事件都需要首字母大写:

Example:

  • The Burj Khalifa is the tallest tower in the world.
  • In China, the Dragon Boat Festival is celebrated in late June.

二、季节,月份,方位 🍃

季节单独使用不需要首字母大写,和其他特定的人名或者事件结合在一起的话需要大写。

  • My favorite season is autumn. // 不需要大写
  • I love the Summer Olympic Games. // 需要大写

月份需要首字母大写:

  • I'm going on vacation in April.
  • The conference is scheduled for September.

方位和季节一样:

  • The café is five minutes south of the station.
  • The landscape in Northern Ontario is stunning.

三、职称 🧑‍💼

职称需要首字母大写:

  1. 作为人名的一部分,或者跟特定人联系在一起的时候。

    • Hi, Professor Clarke. How are you?
    • This is Quality Assurance Manager John Smith.
  2. 求职信

    • I am writing to apply for the Content Marketing position.
  3. 信的签名行:

Example
Sincerely,
Anna Garcia, Human Resources Manager
...

除上面的情况外,不需要首字母大写:

  • My professor drinks a concerning amount of coffee.
  • The man at the desk is John Smith, our quality assurance manager.

四、信封和电子邮件:开头语和结束语 ✉️

信封和电子邮件的开头语和结束语的第一个单词和主要单词都需要大写:

Exmaple
Dear Hiring Manager,
I am writing to apply for the Research Assistant position.
...
Best regards,
Jessica Turner
...

五、学术科目和课程名称 🧑‍🏫

对于学术科目涉及到,只首字母大写那些专有名词,比如语言、国家或者文化:

  • I like my Spanish literature class, but biology is where I truly shine.
  • This semester, I'm studying sociology, psychology, English, and French.

对于特定课程,需要首字母大写,并且其中的次要单词则不用:

  • Let's grab some coffee together after our East Asian Studies lecture.
  • Next semester, I really want to take the Introduction to Scandinavian Lanuages course.

普通的研究领域不需要首字母大写。

六、作品标题 📚

对于英语作品,比如书籍、文章,还有电影,首先,第一个单词首字母大写,然后,主要单词需要首字母大写,次要单词都不用,除非它是第一个或者最后一个:

  • I'm reading The Old Man and the Sea.
  • My presentation on Bury My Heart at Wounded Knee is due tomorrow!

6.1 带有连字符复合词的标题 🧲

对于带有连字符(-)的标题,首先,第一个单词首字母大写,然后,主要单词需要首字母大写:

  • I preordered Harry Potter and the Half-Blood Prince.
  • Can I borrow your copy of The Encyclopedia of Over-the-Counter Medicines?

6.2 带有拼写数字和分数的标题 📟

标题中的拼写数字和分数全都首字母大写:

  • Where's my copy of Twenty-First-Century Design Trends?
  • I'm writing my next book, Only Three-Quarters Left: A History of Office Lunch Thieves.

6.3 带有物种学名的标题 🐷

当带有物种学名,只需要首字母大写第一个单词:

  • My assigned reading today is Antilocapra americana: Its Habitat and Lifestyle.
  • I've added "Meep Meep": The Habits of Geococcyx californianus to my reading list.

七、冒号后面的首字母大写 🚧

如果冒号(:)后面有两个及以上的完整句子,句子第一个单词首字母必须大写。如果是一个句子的话,且句子第一个单词是专有名词时首字母大写。

  • Garlic is my roommate's favorite ingredient: She uses it in almost everything. I think she uses it a bit too much.

另外两种情况是不需要首字母大写:

  1. 冒号后面接的不是完整句子,不需要首字母大写,对于专有名词也是:
    • I add a secret ingredient to my meatballs: cinnamon.
  2. 冒号后面接的是一串术语名词,不需要首字母大写,除非是专有名词:
    • First aid kits should always contain a few basics: bandages, disinfectant, and sterile gloves.

八、分号后面的首字母大写 🚛

只有当分号(;)后面是专有名词时才需要首字母大写:

  • I love the rain; my cat clearly hates it.
  • Jeff starts every morning with a cup of coffee; Colombian brews are his favorite.

九、引用 🪗

如果引用("")中是完整句子,并且该完整句子是一个独立的从句,则第一个单词需首字母大写:

  • Einstein said, "Love is a better teacher than duty."
  • As my Great-Aunt Ethel used to say, "You should always pack an extra pair of socks."

如果不是,则不需要:

  • The BBC article reported that Queen Elizabeth "adores her pet corgis."
  • Multiple students complained about the new chairs, calling them "an affront to humanity."

附录

  • 完整句子 Complete Sentence:一个完整的句子至少包含主语和谓语。
  • 主要单词 Major Words:指名词、代词、动词、形容词,以及副词。
  • 次要单词 Minor Words:指冠词、连词,以及介词。

最后

GitHub 仓库 Capitalization Rules,仓库中包含 Scribendi 的规范 PDF,有需要的朋友可以自取 🤓。