#111 Python 常见后缀

2016-01-21

.gitignore 常见的 *.py[cod]

参考 gitignore.io

  • .py
  • .pyc 编译过后生成的字节码文件
  • .pyo 经过优化的字节码文件。Python2 时代常见,Python3 不再使用。现在是 .opt-1.pyc, opt-2.pyc
    PS:关于这个优化到底是做什么以后再好好研究。
  • .pyd
  • .pyi Python Stub 文件,IDE 中为了提供更好的提示会带一些这样的文件,只是所有方法都是空的。
    ps: 现在的 PyCharm 好像带的 stub 文件都是 py 后缀了。
  • .pyw Windows 专供,py 文件由 python.exe 解析,pyw 文件由 pythonw.exe 执行
    他们不同之处就是,python.exe 会导致一个命令行窗口的出现,而,pythonw.exe 不会,所以常用在 GUI 程序上。
  • .pth 自定义路径导入规则的文件,参考:.pth 文件和 site 模块

#110 bc 计算器

2016-01-18

可能这是 Linux 命令行使用频率最高的一个计算器工具了。

其语法可以说比较复杂,可以定义变量,有各种逻辑控制语句,甚至可以定义函数,简直可以拿来做程序设计了。但是我们一般可能用不了这么多功能,就用来做一些简单计算就行。

PS:奇怪的是,有这么多复杂的功能,竟然没有包含位运算。

bc <<< "1 + 3 + 5 + 7 + 9"
26

bc <<< "scale=3; 1 / 3"
.333

bc <<< "obase=2; 14"
1110

bc <<< "ibase=16;obase=2; FF - 1A"
11100101

#109 Shell:长字符串切割成数组

2016-01-16
long_string="line 1
line 2
line 3"

# bash ========
# readarray -t lines <<< "$long_string"
# IFS=$'\n' lines=($long_string)

# zsh =========
# lines=("${(@f)long_string}")
setopt sh_word_split

for line in "${lines[@]}"
do
    echo "$line =="
done

#108 魔戒的世界

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)
  • 和我们这个世界的映射,大概对应欧亚大陆

时间线

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

参考资料与拓展阅读

#107 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

#106 二进制计算

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$ >>