#750 同一台机器上配置多个 Git 账户
Git 开发工具 2022-01-17读到微信公众号文章 本地如何配置多个 GitHub/Gitee 账号?,想起了几年前,面对这样的需求,我自己也是这么操作的。
coding in a complicated world
读到微信公众号文章 本地如何配置多个 GitHub/Gitee 账号?,想起了几年前,面对这样的需求,我自己也是这么操作的。
常规的系统自带工具就不提了。
htop
代替 topjq
JSONbat
代替 catdog
DNS 查询tldr
替代 man 文档ack
ag 代替 grepfzf
fuck
mtr
代替 traceroutehttppie
代替 wget 和 curlncdu
代替 duduf
代替 dfpydf
代替 dffd
代替 findeva
代替 lsneovim
代替 vimlftp
代替 ftparia2
nnn
我拿到一串字符串:
"Client: \\344\\275\\240\\345\\245\\275\\357\\274\\214\\344\\270\\226\\347\\225\\214"
根据上下文,我知道这是 UTF-8。
print(b'Client: \344\275\240\345\245\275\357\274\214\344\270\226\347\225\214'.decode())
# 'Client: 你好,世界'
现在的问题是,我怎么把他转换成普通的字符串呢(unicode)?
这其实是一个比较普遍的问题,只要有过一段时间 Python 开发,可能就会偶尔碰到这样的问题:
a = "I Love 中国".encode('utf-8')
b = str(a)
# "b'I Love \\xe4\\xb8\\xad\\xe5\\x9b\\xbd'"
由于不同系统或者不同模块之间的衔接有问题(有可能部分组件只支持 ASCII),中间的过程不受我们控制,最后,我们就是拿到了这个 b,怎么给转换成 a?
s = "Client: \\344\\275\\240\\345\\245\\275\\357\\274\\214\\344\\270\\226\\347\\225\\214"
result = eval(f'b"{s}".decode("utf-8")')
print(result)
# Client: 你好,世界
但是这有点危险,改成 str.literal_eval
好一些:
s = "Client: \\344\\275\\240\\345\\245\\275\\357\\274\\214\\344\\270\\226\\347\\225\\214"
# b'Client: \xe4\xbd\xa0\xe5\xa5\xbd\xef\xbc\x8c\xe4\xb8\x96\xe7\x95\x8c'
import ast
print(ast.literal_eval(f'b"{s}"').decode('utf-8'))
In [1]: u'nihao 中国'.encode('raw_unicode_escape')
Out[1]: 'nihao \\u4e2d\\u56fd'
In [2]: u'nihao 中国'.encode('unicode_escape')
Out[2]: 'nihao \\u4e2d\\u56fd'
In [3]: re.sub('.', lambda x: r'\u%04X' % ord(x.group()), 'nihao 中国')
Out[3]: '\\u006E\\u0069\\u0068\\u0061\\u006F\\u0020\\u4E2D\\u56FD'
In [4]: ''.join(r'\u{:04X}'.format(ord(chr)) for chr in 'nihao 中国')
Out[4]: '\\u006E\\u0069\\u0068\\u0061\\u006F\\u0020\\u4E2D\\u56FD'
s = "Client: \\344\\275\\240\\345\\245\\275\\357\\274\\214\\344\\270\\226\\347\\225\\214"
# b'Client: \xe4\xbd\xa0\xe5\xa5\xbd\xef\xbc\x8c\xe4\xb8\x96\xe7\x95\x8c'
0o344 == 0xe4 == 228
pipx 和 pip 一样,也是来自 PyPA 的项目。
PS: PyPA 的知名项目包括 pipenv, pip, pipx, virtualenv, flit, twine。
pipx 的作用是将包安装在虚拟环境中(利用标准库中的 venv)。用来安装一些 Python 写的工具就很好,不需要关心这些工具的代码时。
我研究了半天之后感觉无法掌握 poetry,决定放弃,还是用我的 Pipenv。
Poetry 是一个 Python 虚拟环境管理器。
给 tmuxp 提了一个 Issue, 作者 @tony (Tony 老师?😜) 让我选择是自己写测试,还是他来写。
我表达我对 pytest 不熟之后,他给我一点建议:
所以我先学习学习,然后抽空把 test 自己写了。
相关阅读:Redis 拓展模块,其中用 RedisJSON 举例编译安装。
简单示例 (GET / SET):
127.0.0.1:6379> json.set abc . 123
OK
127.0.0.1:6379> json.get abc .
"123"
127.0.0.1:6379> json.set xyz . '{"a": 1, "b": true, "c": [{"name": "foo"}, {"name": "bar"}]}'
OK
json.get xyz .c[0]
"{\"name\":\"foo\"}"
127.0.0.1:6379> json.set xyz .a 2
OK
127.0.0.1:6379> json.get xyz .c[0].name
"\"foo\""
127.0.0.1:6379> json.set xyz .c[0].name '"loong"'
OK
127.0.0.1:6379> json.get xyz .a .c[0].name
"{\".c[0].name\":\"loong\",\".a\":2}"
现在还没有相关行业标准,RedisJSON 自己实现了一套(v1), 后来参考 JSONPath 语法又重新实现了一遍 (v2)。
至于 v1 和 v2 有什么区分,就不用深究了。
大致知道这样可以就行了:
.store.book[0].title
// 相当于 `V['store']['book'][0]['title']`
arrappend
arrindex
arrinsert
arrlen
arrpop
arrtrim
clear
debug
delete
get
/ jsonget
mget
/ jsonmget
numincrby
nummultby
objkeys
objlen
resp
set
/ jsonset
strappend
strlen
toggle
type
Python 库还有以下两个方法:
set_file(name, path, file_name, nx=False, xx=False, decode_keys=False)
return self.set(name, path, file_content, nx=nx, xx=xx, decode_keys=decode_keys)
1. set_path(json_path, root_folder, nx=False, xx=False, decode_keys=False)
file_path.split('.', 1)[0]
)set_file(file_name, json_path, file_path, nx=nx, xx=xx, decode_keys=decode_keys)
Python 最知名的 Redis 客户端库 redis-py 已经支持 RedisJSON 拓展指令。
import redis
from redis.commands.json import JSON
r = redis.Redis(host='localhost', port=6379, db=0)
jr = JSON(r)
jr.set('foo', '.', {"a": 1, "b": True, "c": [{"name": "foo"}, {"name": "bar"}]})
jr.numincrby('foo', 'a', 1)
jr.toggle('foo', '.b') # only works for booleans
jr.arrappend('foo', '.c', {"name": "air"})
print(jr.get('foo', '.'))
# {'a': 2, 'b': False, 'c': [{'name': 'foo'}, {'name': 'bar'}, {'name': 'air'}]}
print(jr.get('foo', '.c[-1].name'))
# air
就缺搜索了,如果加上 RediSearch,就完美了。
PS: RediSearch 的新版本已经优化了对 JSON 的支持。
Redis 官方其实还提供了以下拓展:
PS: 还有更多第三方拓展,参考 https://redis.io/modules。
Redis 是 BSD 协议,Redis 拓展模块是 AGPL 协议。
2018 年 8 月,为了防止云服务厂商的利益侵害,Redis 拓展模块授权协议切换到 Apache v2.0 modified with Commons Clause (官方声明)。其中 Common Clause 就是限制提供商业的 Reids 服务。
2019 年 2 月,Redis 拓展模块授权协议再次切换,改成 Redis Source Available License (RSAL),(官方声明)。因为认为当前协议不够明确,容易让人产生误解,而且对 Redis 公司的权益保障不到位。
这个协议对普通用户(个人或企业)没有限制,只是限制了直接利用 Redis 服务赚钱的云厂商。我觉得这是开发者的合理诉求,没有什么值得质疑的。
如果只是要体验一下,不想编译,可以去 https://redis.com/redis-enterprise-software/download-center/modules/ 下载试用。
xxx.so
loadmodule xxx.so
,然后重启 Redis 服务--loadmodule
参数动态加载模块。比如 ReJSON:
wget https://github.com/RedisJSON/RedisJSON/archive/refs/tags/v2.0.6.zip -O redisjson-v2.0.6.zip
unzip redisjson-v2.0.6.zip
cd RedisJSON-2.0.6/
# 安装需要用到官网没有提到的 libclang.so
# From: bindgen-0.59.2/src/lib.rs
sudo apt install libclang-dev
cargo build --release
cargo test --features test
# 需要先安装 Rust (请参考其他资料)
# 我了解到的其他模块大多数是 C 写的,RedisJSON 比较特殊,用 Rust 写的
redis-server --loadmodule target/release/librejson.so
相关文章:RedisJSON 体验
西安一码通半个月内两次宕机,值此西安疫情突发之时,可是严重的安全故障。相关负责人(西安大数据资源管理局局长)已经停职检查。
为确保系统运行更高效,他们将一张图片从1MB压缩到500KB,再从500KB优化到100KB。这样的工作看似简单,却蕴含着高技术含量,他们连续两天两夜守在电脑前,终于攻下难关。
维持之前的设定,走技术专家的路线。
第一点,今年会得到改进。
第二点,需要更长时间周期的投入才能见效。
第三点,比较泛,需要更多思考。
第四点,可能是最难的。我不知道该怎么做。