#145 Cmd Markdown 自定义样式
开发工具 2016-06-12作业部落,用来写 Markdown,挺好的,不过样式不太符合我的心意,好在提供自定义功能...
coding in a complicated world
作业部落,用来写 Markdown,挺好的,不过样式不太符合我的心意,好在提供自定义功能...
乐视超4 X50 Pro,2999 元。
阅读下面的漫画材料,根据要求写一篇不少于800字的文章。(60 分)
要求:结合材料的内容和寓意,选好角度,确定立意,明确文体,自拟标题;不要套作,不要抄袭。
$ curl -v "http://成都大运会.网址"
* Input domain encoded as `UTF-8'
* About to connect() to xn--6oqv8vrnhtp3c7hb.xn--ses554g port 80 (#0)
* Trying 202.173.11.233... connected
* Connected to 成都大运会.网址 (202.173.11.233) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.27.1 zlib/1.2.3 libidn/1.18 libssh2/1.4.2
> Host: xn--6oqv8vrnhtp3c7hb.xn--ses554g
> Accept: */*
>
< HTTP/1.1 301 Moved Permanently
< Server: openresty/1.21.4.3
< Date: Sat, 16 Dec 2023 06:09:33 GMT
< Content-Type: text/html; charset=utf-8
< Content-Length: 61
< Connection: keep-alive
< Location: http://www.2021chengdu.com
<
<a href="http://www.2021chengdu.com">Moved Permanently</a>.
* Connection #0 to host 成都大运会.网址 left intact
* Closing connection #0
中文域名,中文顶级域名都已经支持很多年了,虽然看到不多。
上面示例中的域名 成都大运会.网址
实际上在域名系统中是以 xn--6oqv8vrnhtp3c7hb.xn--ses554g
形式存在的。
这种编码方式叫做 Punycode,非 ASCII 字符会被按照 Unicode 编号转换成 ASCII 字符。
域名系统中允许的字符集基于 ASCII,不允许以母语或字母表示多种语言的名称和单词。
ICANN 批准了国际化域名(IDNA)系统,该系统通过一种称为 Punycode 的编码将应用程序用户界面中使用的 Unicode 字符串映射到有效的 DNS 字符集。
Example of Greek IDN with domain name in non-Latin alphabet: ουτοπία.δπθ.gr (Punycode is xn--kxae4bafwg.xn--pxaix.gr)
'I❤️U'.encode('punycode')
b'IU-ony8085h'
'baidu.com'.encode('idna').decode()
# baidu.com
'中国.com'.encode('idna').decode()
# 'xn--fiqs8s.com'
'编程.中国'.encode('idna').decode()
# 'xn--9nz56h.xn--fiqs8s'
先提取 ASCII 字符,再编码非 ASCII 字符。
默认是一个 ObjectId 对象,也可以手动设置。
使用 PyMongo:
# -*- coding: utf-8 -*-
from pymongo import MongoClient
client = MongoClient() # 连接到默认主机的默认端口:localhost:27017
db = client.test_db
collection = db.test_collection
collection.insert({"Hu" : "Ang", "Love" : [5, 'Sun', 'Xiu']})
collection.insert({"And" : 20, "Daughter" : True})
collection.insert({"GIRL": ',', "IS": "A GIRL", '_id': 123})
如果是 MongoDB 数据库操作,就应该是这样:
$ mongo
> use test_db
> db.test_collection.insert({"Hu" : "Ang", "Love" : [5, 'Sun', 'Xiu']})
> db.test_collection.insert({"And" : 20, "Daughter" : True})
> db.test_collection.insert({"GIRL": ',', "IS": "A GIRL", '_id': 123})
最后查到的结果显示如下:
> db.test_collection.find()
{ "_id" : ObjectId("5746c0f900e0990cfc600938"), "Love" : [ 5, "Sun", "Xiu" ], "Hu" : "Ang" }
{ "_id" : ObjectId("5746c0f900e0990cfc600939"), "And" : 20, "Daughter" : true }
{ "_id" : 123, "GIRL" : ",", "IS" : "A GIRL" }
_id
如果自己往里面传 _id
的话,要注意唯一性约束,如果里面存在这个 _id
值,那么就会报错:E11000 duplicate key error index
为什么没有采用像其他数据库一样的主键自增机制?
可能是因为 MongoDB 天生的分布式属性,导致其不愿耗费精力来处理自增主键的同步问题。
关于 ObjectId 字段,官方文档中对每个字节所表示内容的说明:
ObjectId is a 12-byte BSON type, constructed using:
- a 4-byte value representing the seconds since the Unix epoch,
- a 3-byte machine identifier,
- a 2-byte process id, and
- a 3-byte counter, starting with a random value.
ObjectId 占 12 个字节,其中:
举个例子,比如在 ObjectId("5746c0f900e0990cfc600939")
中 5746c0f9
就是时间戳,00e099
就是机器标识,0cfc
就是客户端进程编号,600939
就是随机字符串。
通过这个设计,保证不同机器的 mongod 服务、同一个机器上的不同 mongod 服务进程之间都不出现重复值的情况(可能性极低,如果出现,可能也有后续的处理办法)。
重点:ObjectId 在客户端生成!!!
我个人也觉得 ObjectId 在客户端生成比服务器端要好:
PyMongo 中就是使用 bson.objectid.ObjectId
生成的。可以阅读一下相关代码,了解这个 ID 的生成方法。
PS:比如,在我的 Ubuntu 环境中,代码文件就是 /usr/local/lib/python2.7/dist-packages/bson/objectid.py
。
使用 tailf 查看 MongoDB 日志时报错:无法添加 inotify 观察(达到了 inotify 观察数限制)
GRUB: GRand Unified Bootloader 统一引导程序
sudo vim /etc/default/grub
# 注释:GRUB_HIDDEN_TIMEOUT
# 修改:GRUB_HIDDEN_TIMEOUT= 秒数
sudo update-grub
记录一次 Linux 下清空磁盘的操作。
dd if=/dev/urandom of=/dev/sdb bs=1M status=progress
重装系统,记录安装过程,留给日后重建同样的开发环境作参考。
其实还有好多细节没有记录,日后慢慢补充完整。
bytes
类型
bytes
按索引取值得到的是整数。
b'abc'[0]
97
str
转 bytes
只需要编码一下就行了。反过来就是解码一下。
s = '你好'
b = bytes(s, 'utf-8')
# b'\xe4\xbd\xa0\xe5\xa5\xbd'
assert b.decode('utf-8') == s
bytes('hello')
TypeError: string argument without an encoding
bytes('hello', 'ascii')
b'hello'
'hello'.encode()
b'hello'
bytes('hello', 'utf-16')
b'\xff\xfeh\x00e\x00l\x00l\x00o\x00'
bytes('hello', 'utf-32')
b'\xff\xfe\x00\x00h\x00\x00\x00e\x00\x00\x00l\x00\x00\x00l\x00\x00\x00o\x00\x00\x00'
bytes
和 int
列表的转换。
list(b'abc')
[97, 98, 99]
bytes([97, 98, 99])
b'abc'
bytes([256])
ValueError: bytes must be in range(0, 256)
# 大端序
(2008).to_bytes(length=4, byteorder='big', signed=False)
b'\x00\x00\x07\xd8'
# 小端序
(2008).to_bytes(length=4, byteorder='little', signed=False)
b'\xd8\x07\x00\x00'
struct.pack('<I', 2008)
b'\xd8\x07\x00\x00'
int.from_bytes(b'\x00\x00\x07\xd8', 'big')
2008
int.from_bytes(b'\xd8\x07\x00\x00', 'little')
2008
int.from_bytes(b'abc', 'little')
6513249
int.from_bytes(b'cba', 'big')
6513249
PS:2020/11/02, 字节顺序(大端序、小端序)
Python2 字符串
# python2
print(repr('你好'))
'\xc4\xe3\xba\xc3'
print('\xc4\xe3\xba\xc3')
你好
# python3
print('\xc4\xe3\xba\xc3')
'ÄãºÃ'
print('\xc4\xe3\xba\xc3'.encode('latin-1'))
b'\xc4\xe3\xba\xc3'
print('\xc4\xe3\xba\xc3'.encode('latin-1').decode('gbk'))
'你好'