#731 OCSP 2: OpenSSL OCSP 校验

2022-01-22

上一篇:2021-08-08, OCSP 联机证书状态协议

OpenSSL 步骤

rm -rf /tmp/ocsptest/; mkdir -p /tmp/ocsptest/; cd /tmp/ocsptest/; ls

# 获取证书
openssl s_client -showcerts -connect markjour.com:443 < /dev/null | awk -v c=-1 '/-----BEGIN CERTIFICATE-----/{f=1;c++}f {print > ("l"c".crt")}/---END CERTIFICATE-----/{f=0}'
cat l*.crt > chain.crt

# 获取 OCSP URL
ocspUrl=$(openssl x509 -noout -text -in l0.crt | grep OCSP | xargs); ocspUrl=${ocspUrl#*URI:}; echo $ocspUrl;
# http://ocsp.digicert.com

# 获取证书序列号
serial=$(openssl x509 -serial -noout -in l0.crt); serial=${serial#*=}; echo $serial;
# 01F284D36E08179CF4CEB5D339FE95E9

# OCSP 校验
openssl ocsp -nonce -issuer l1.crt -CAfile chain.crt -url $ocspUrl -serial "0x${serial}"
# WARNING: no nonce in response
# Response verify OK
# 0x01F284D36E08179CF4CEB5D339FE95E9: good
#   This Update: Jan 21 08:15:01 2022 GMT
#   Next Update: Jan 28 07:30:01 2022 GMT

#730 输入法

2022-01-19

我用的最多的输入法:

  1. 搜狗
    搜狗在中文输入法方面确实是做的不错,没得说。
  2. 百度
    百度输入法是小米自带(我是一个资深小米用户),有时懒得换也就用了。而且百度输入法还有一个好的地方,就是如果手机接入物理键盘后,它会只显示一个横条,不占界面。
  3. RIME
    RIME 是我在 Linux 上的输入法, 一转眼就用了好几年了。

RIME 是一个开源项目,没有搜狗、百度那样的云服务(那种智能的全句输入)支持,在使用方面不如他们顺手,本地词库也确实有些单薄。话说回来,也够用了,几年的真实感受。

而且一旦习惯了 Linux 的折腾,这种全部在自己的掌控之中的感受就很上瘾。你要是熟悉 RIME 的话,你就懂我说的了,词库全部在掌握之中。
PS: Ubuntu 中的 IBUS 智能拼音(libpinyin/ibus-libpinyin)也是可以自己控制词库。

搜狗和百度都是封闭的,他们的用户词库都不支持导出(加密的不算)。我常常觉得要是可以把搜狗和百度中的词库导入 RIME 就好了。他们自己弄的那些个词库就不指望了,只是希望可以把我输入的那部分给我。

最近发现讯飞输入法效果不错,不输搜狗和百度,而且支持导出词库(目前只发现手机端可以导出,PC 端我已经在线反馈,等回复中)。

现在已经全部切入讯飞输入法。
PS: 讯飞的词库和搜狐比差太多,不见得比 Rime 强多少,但我相信运行一段时间之后会越来越好的。

关于讯飞输入法在 Debian/Ubuntu 上的安装

# Index of /deepin/pool/non-free/i/iflyime/
# ../
# iflyime_0.9.972_amd64.deb                          18-Dec-2019 13:31     27M
# iflyime_0.9.988_amd64.deb                          14-May-2020 17:49     49M

wget http://packages.deepin.com/deepin/pool/non-free/i/iflyime/iflyime_0.9.988_amd64.deb -P ~/Resources

gdebi ~/Resources/iflyime_0.9.988_amd64.deb
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Reading state information... Done
此软件包不可安装
Dependency is not satisfiable: fcitx-frontend-qt4

看起来是 Qt4 被砍掉了的缘故,应该可以解决。但是从上一次发版(2020/05/14)到现在已经一年半了,没有出新版本,可能是讯飞输入法 Linux 版项目被停了,所以就算了吧。

#728 Golang 观察

2022-01-18

InfoQ 的公众号文章《解读Go语言的2021:稳定为王》中引用 TIOBE Index 和 Google Trends 的数据来分析 Go 语言的发展趋势。
非常有意思,我找他的思路,直接去源头研究了一番。

Go 在 2009 年和 2016 年得了 TIOBE 年度语言。
PS: Go 是 2009 年 11 月发布。TIOBE 也是够捧场了,刚一出来就得了年度语言。

根据 TIOBE 的数据,Go 在 2016 年下半年大火了一波,随后热度消退,从 2018 年到现在一直比较稳定。

然后 Google Trends 的数据(2009/10/01 至今,全球)显示:

  • Go 在 2009 年诞生之后就慢慢攀升
  • 2012 年达到一个阶段
  • 2013 年 10 月又上一个台阶
  • 2014 年 5 月达到巅峰
  • 然后一直持续下跌到 2020 年底
  • 2021 年稍有复苏的迹象

最后再上这张图,看看 Go 在各个地区的火爆程度:

那篇文章,包括我之前在网上看到的其他文章,都在这个地方得出了一个结论:Go 在国内的热度远超国外,甚至有地方说 Go 语言的热度全靠国内开发者支撑。
我认为这是非常不严谨的。

其实 Google Trends 的数据是根据这个地方搜索相关词条的比例来计算的。而 Google 的中国用户已经被过滤过一道,应该是以开发者为主。所以这个热度数据的对比是不能说明什么问题的。而且由于一些上网方式的问题,国内的这部分统计数据应该是非常不可靠的。

#726 Linux 小工具汇总

2022-01-16

常规的系统自带工具就不提了。

  • htop 代替 top
  • jq JSON
  • bat 代替 cat
  • dog DNS 查询
  • tldr 替代 man 文档
  • ack ag 代替 grep
  • fzf
  • fuck
  • mtr 代替 traceroute
  • httppie 代替 wget 和 curl
  • ncdu 代替 du
  • duf 代替 df
  • pydf 代替 df
  • fd 代替 find
  • eva 代替 ls
  • neovim 代替 vim
  • lftp 代替 ftp
  • aria2
  • nnn

参考资料与拓展阅读

#725 一个编码转换问题

2022-01-15

问题

我拿到一串字符串:

"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'))

延伸

unicode_escape

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

#723 Poetry

2022-01-12

我研究了半天之后感觉无法掌握 poetry,决定放弃,还是用我的 Pipenv。

img

Poetry 是一个 Python 虚拟环境管理器。