#238 重力加速度
物理 2018-02-03基础认知
- 速度单位:米每秒 $m/s$
- 加速度单位:米每平方秒 $m/s^2$
也等于牛顿每千克 $N/kg$ - 重力加速度就是天体重力产生的加速度,符号 $g$
有一个重力常数,符号是 $G$ - 地表附近的重力加速度约为 9.81
重力引起的标准加速度(或自由落体的标准加速度),有时缩写为标准重力,通常用 $ɡ_0$ 或 $ɡ_n$ 表示,是物体在地球表面附近真空中的标称重力加速度。
标准定义为 $9.80665 m/s^2$(约 $32.17405 ft/s^2$)。
该值由第三届国际度量衡大会确定,用于将物体的标准重量定义为其质量和标称加速度的乘积。
地球表面附近物体的加速度是由于重力和地球自转的离心加速度的综合作用(但后者足够小,在大多数情况下可以忽略不计);
两极的总重力(视重力)比赤道高约百分之二。
参见:标准重力
https://en.wikipedia.org/wiki/Standard_gravity
运动
#237 shar: Shell Archive
Linux b2a 2018-02-02sudo apt install sharutils
提供四个命令:
- shar: create a shell archive
- unshar: unpack a shar archive
- uudecode: decode an encoded file
- uuencode: encode a file into email friendly text
uuencode 是一种二进制转文本编码,类似 Base64
没想到还有些包依赖这个上世纪遗留下来的编码(包括 gcc):
apt rdepends sharutils
sharutils
Reverse Depends:
建议: file-roller
依赖: wide-dhcpv6-client
推荐: speechd-el
建议: patool
推荐: mgp
建议: lxqt-archiver
推荐: ldapscripts
依赖: kpatch-build
依赖: knews
建议: git-dpm
依赖: gcc-9-source
依赖: gcc-12-source
依赖: gcc-11-source
依赖: gcc-10-source
建议: engrampa
依赖: biabam
推荐: aespipe
python uuencode
import uu
uu.encode('/etc/passwd', '-')
注意:3.11 开始,python Deprecated 了这个 uu 模块, 可以改用 binascii.b2a_uu 代替。
import binascii
s = b''
with open('/etc/passwd', 'rb') as f:
buf = f.read(45)
while len(buf) > 0:
s += binascii.b2a_uu(buf, backtick=False)
buf = f.read(45)
print(s)
#236 Python 项目结构图
Python Pyreverse UML graphviz dot 2018-01-30常用的代码风格检查工具 pylint 中集成了 pyreverse, 这是一个用于生成 Python 的类图的工具。
#235 DOT 语言与 Graphviz 工具 [编辑中]
graphviz dot 2018-01-30:) 本文正在编辑中,暂时不提供浏览...
#234 CSS Reset
CSS 2018-01-27由于浏览器实现上的差异,导致相同的页面在不同浏览器下的呈现不同,甚至会有错乱。
所以,一般前端框架会使用一个重置样式打底,以确保不同浏览器下的显示效果统一。
reset.css对所有组件的默认样式进行统一定义
An unmodified copy of Eric Meyer's CSS reset.
https://www.npmjs.com/package/reset-css
normalize.css针对部分样式进行修补
https://www.npmjs.com/package/normalize-css
参考资料与拓展阅读
- 现代 CSS 解决方案:Modern CSS Reset
- The Best CSS Reset Stylesheets
- GitHub Search, reset css
- 100 Bytes of CSS to look great everywhere
html {
max-width: 70ch;
padding: 3em 1em;
margin: auto;
line-height: 1.75;
font-size: 1.25em;
}
Let’s break this down. I’ve adapted the original text with my own commentary.
max-width: 70ch: the “readable range” is usually 60-80 character widths, and CSS lets you express that directly with thechunit. I blogged more on line lengths last year.padding: 3em 1em: If the display’s width goes under themax-widthset above, then this padding prevents edge-to-edge text on mobile. We use3emto provide top/bottom whitespace.margin: auto: This is really all that is needed to center the page - applied onhtml, because Dan’s site doesnt have a semantic<main>tag and<html>is more likely to exist in most sites (no judgment pls, i’ve heard enough semantic HTML preaching). That the top tag centers itself relative to nothing is unintuitive, but thats how browsers do.line-height: 1.75: Spacing between the lines to help increase visual clarity. Always leave line height unitless because reasons.font-size: 1.5em: I’ve noticed that recent design trends and screen sizes have tended toward bigger font sizes. Or maybe I’m getting old. Preferemorremoverpxif you want to let users scale it.
Tushar points out that you can use :root instead of <html> to guarantee that there is some selector present, but its a touch too fancy for me and uses an extra character :)
Optional:
h1,
h2,
h3,
h4,
h5,
h6 {
margin: 3em 0 1em;
}
p,
ul,
ol {
margin-bottom: 2em;
color: #1d1d1d;
font-family: sans-serif;
}
- Being Picky about a CSS Reset for Fun & Pleasure
著名 CSS 作者 Chris Coyier 的最新文章,解释浏览器的 CSS 重置(CSS reset)每一行的意思。
#233 Windows 开机启动
Windows 2018-01-26我想开机启动 TIM,但是 TIM 的设置没有用,重启之后这个选项又自己取消了,只好另外寻找方法。
发现这个方法就挺好用,只需把应用程序的快捷方式复制到一个目录。
这三个方法都可以用资源管理器打开这个目录:
win + r然后shell:startup回车explorer %appdata%\Microsoft\Windows\Start Menu\Programs\Startupexplorer %userprofile%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
#232 Linux 文件系统
Linux 文件系统 2018-01-25物理结构
- 机械硬盘 Disk -> 盘片/盘面 Platter -> 磁道 Tracker -> 扇区 Physical Sector
- 光盘
- SSD -> NAND Package -> Die -> Plane -> Block -> Page
- 非易失性存储器(永久):NAND Flash
- 易失性存储器(临时):DRAM
扇区大小是厂商定的,一般是 512B 的倍数。
老的机械硬盘一般是 512B 扇区,新的机械硬盘一般是 4K 扇区(AF,Advanced Format)
光盘(CD/DVD)一般是 2K 扇区。
处于向前兼容的目的,其他类型存储设备的大小也一般是 512B。
逻辑结构
- 逻辑扇区 Logical Sector
- 块 Block
Windows 下叫做 簇 Cluster,或者磁盘分配单元。
PS:内存上的类似概念,是段 Segment 和页 Page
$ sudo fdisk /dev/sda -l
Disk /dev/sda: 40 GiB, 42949672960 bytes, 83886080 sectors
Disk model: VBOX HARDDISK
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 7EC7FA37-FE79-46C1-A404-56AA0E00CFAB
Device Start End Sectors Size Type
/dev/sda1 2048 4095 2048 1M BIOS boot
/dev/sda2 4096 4198399 4194304 2G Linux filesystem
/dev/sda3 4198400 83884031 79685632 38G Linux filesystem
格式化
https://zh.wikipedia.org/wiki/磁盘格式化
- 低级格式化、物理格式化
对于部分硬盘制造厂商,它也被称为初始化。
最早,低级格式化被用于指代对磁盘进行划分柱面、磁道、扇区的操作。
现今,随着软盘的逐渐退出日常应用,应用新的编址方法和接口的磁盘的出现,这个词已经失去了原本的含义,大多数的硬盘制造商将低级格式化定义为创建硬盘扇区(sector)使硬盘具备存储能力的操作。现在,人们对低级格式化存在一定的误解,多数情况下,提及低级格式化,往往是指硬盘的填零操作。
- 高级格式化、逻辑格式化
根据用户选定的文件系统,在磁盘的特定区域写入特定数据,以达到初始化磁盘或磁盘分区、清除原磁盘或磁盘分区中所有文件的一个操作。
高级格式化包括对主引导记录中分区表相应区域的重写、根据用户选定的文件系统,在分区中划出一片用于存放文件分配表、目录表等用于文件管理的磁盘空间,以便用户使用该分区管理文件。
常见文件系统类型
- FAT / FAT32 / exFAT
- NTFS
- EXT2 / EXT3 / EXT4
- BTRFS
- Apple HFS
参考资料与拓展阅读
- 知乎专栏,拆解固态硬盘结构
- Seagate,过渡到高级格式化 4K 扇区硬盘
#231 Python 多进程共同监听同一个端口
Python 网络编程 2018-01-23import socket
import signal
import sys
import os
def handle_connection(conn):
conn.close()
def worker(sock):
while True:
try:
conn, addr = sock.accept()
handle_connection(conn)
except OSError as e:
if e.errno == socket.ECONNABORTED:
# 忽略 ECONNABORTED 错误
pass
else:
raise
def main():
port = 8080
backlog = 10 # 连接队列长度(超出会拒绝或忽略)
num_workers = 4 # 子进程数
# 创建监听器
listener = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
listener.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
listener.bind(('localhost', port))
listener.listen(backlog)
sock.setblocking(False)
print(f"Listening on port {port}...")
# # “来一个连接,起一个进程”的模式
# def sig_handler(sig, frame):
# listener.close()
# sys.exit(0)
# signal.signal(signal.SIGINT, sig_handler)
# signal.signal(signal.SIGTERM, sig_handler)
# while True:
# conn, addr = listener.accept()
# pid = os.fork()
# if pid == 0:
# listener.close()
# handle_connection(conn)
# sys.exit(0)
# else:
# conn.close()
# 子进程放到进程组中
os.setpgrp()
# 多个 worker 子进程一同监听端口的模式
processes = []
for i in range(num_workers):
p = Process(target=worker, args=(sock,))
processes.append(p)
p.start()
# 通过 os.killpg 向进程组发送信号
signal.signal(signal.SIGINT, lambda signum, frame: os.killpg(0, signal.SIGINT))
signal.signal(signal.SIGTERM, lambda signum, frame: os.killpg(0, signal.SIGTERM))
signal.pause()
for p in processes:
p.terminate()
if __name__ == '__main__':
main()
惊群效应是指事件发生的时候,多个进程或线程竞争处理这个事件,导致系统负载出现一个尖峰。严重的情况下可能导致系统瘫痪。
虽然 accept 会阻塞住,只有一个抢到,但是惊群的问题应该还是存在。
进程组
os.setpgrp设置进程组os.killpg向进程组发送信号,如果没有设置进程组,这个操作没有意义os.set_inheritable继承文件描述符,然后可以独立使用和关闭
#230 Python 内存管理
Python 2018-01-22内存分配
- 堆内存 heap
- 垃圾回收:
- 引用计数
- 延迟回收(支持手动触发)
引用计数
- 标记清除
标记所有当前正在使用的对象,然后清除所有未被标记的对象来回收内存。
这个算法的缺点是当内存中有大量未被标记的垃圾时,清除过程可能会变得非常缓慢。
- 分代回收
将对象分为三代:
- 新创建的对象放在第 0 代
- 第 1 代包含一些活跃的对象
- 第 2 代包含一些非常稳定的对象
不同代执行不同的标记策略。
相关工具
Python 中有一些内置的工具可以用于检查内存使用、内存分配情况以及各类对象数量的统计,下面列举一些常用的方法:
- memory_profiler 模块可以检查内存使用情况
@profile装饰器 +-m memory_profiler参数,输出每个代码行的内存占用情况,以及整个程序的内存使用情况。- objgraph 模块可以检查内存中各类对象的数量
objgraph.show_refs()对象引用图objgraph.show_most_common_types()对象数量统计- gc 模块可以手动管理内存
gc.collect()手动触发垃圾回收gc.get_count()垃圾回收相关信息- pympler
- meliae
手动释放内存: