跳到主内容

琅環笔记

有博学强记者,尝为鹅厂从事。游于洞宫,遇一人于途,问逍遥曰:“君读书几何?”遥曰:“吾之未读者,则二十年内书盖有之也,若二十年外,则吾固已尽读之矣。”其人论议超然,遥颇内服,相与欢甚。因共至一处,大石中忽然有门,引遥入数歩,则别是天地,宫室嵯峨。引入一室中,陈书满架,其人曰:“此PL史也。”又至一室,则曰:“OS志也。”毎室各有奇书,惟一室屋宇颇高,封识甚严,有二犬守之。遥问故,答曰:“此皆操作系统、编程语言、算法分析、生发正骨诸秘籍。”指二犬曰:“此龙也。”历观诸室书,皆Windows以前事,多所未闻者,如「BeOS」、「Solaris」、「FreeBSD」、「LISP」亦皆在焉。遥心乐之,欲赁住数十日,其人笑曰:“君痴矣。此岂可赁地耶?”即命小童送出,遥问地名,对曰:“琅嬛福地也。”

文件分隔符之回车换行的故事

最初的打字机上,将打字位置 Carriage 从行末移动到行首叫做 Carriage Return,既CR,既回车,将纸张上滚一行,叫做换行 Linefeed。

来到计算机时代,分别为这两种操作都定义了 ASCII 码

  1. ASCII \n: CR,Carriage Return,UNIX 上是行分隔符,newline,取第一个字;macOS 也采用了此换行符;

  2. ASCII \r: LF,Linefeed,Classic Mac OS 中,文件换行符是这个;

  3. ASCII \r\n: CRLF,Carriage Return & Linefeed,Windows 最晚出现,为在 Windows 上能显示 Unix 和 Apple Mac OS 文件内容,弄出一个兼容的。

Python 世界的换行

为兼容各平台差异,Python 的 os 模块中弄出多个属性来处理,比如

  • linesep 行分隔符

  • sep 文件路径名分割符

  • pathsep 文件路径分隔符

  • curdir 当前工作目录

  • pardir 父目录

os 模块是处理好了这件事,但其它模块却不一定。

Python 2 的写文件

  1. open(),可能最早从 c 语言 fopen 学习的,未考虑编码参数

  2. codecs.open(),支持编码参数

  3. io.open(),支持编码参数的 open(),推荐使用

Python 3 的写文件

  1. open(),修正了 Python 2 时代的设计遗漏,支持 encoding 和 newline 参数

  2. codecs.open(),在读写文件时不推荐使用了,且此模块方法在 Windows 下有坑,文件换行符会弄成 LF

不同平台的差异随处可见

一定程度上反映了,人各有各的思想,分久必合,当人们无法忍受差异时,就会发展为统一。

1. os.path.isabs()

os.path.isabs() 的行为是:如果路径以 / 开头,或者在非类 Unix 平台上,以盘符跟一个 os.sep 开头,就返回 True;否则,就返回 False

这里要注意的是在 Windows 上,是支持两种斜线符号的,一种是Windows的斜线,但需要双写以转义 '\',另一种是类似 Unix 反写 '/'。

看如下代码,在 Windows 下的返回结果

Python 3.10.6 (tags/v3.10.6:9c7b4bd, Aug  1 2022, 21:53:49) [MSC v.1932 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.path.isabs('c:/abc')
True
>>> os.path.isabs('/abc')
True
>>> os.path.isabs('c:\abc') # 未转义,错误
False
>>> os.path.isabs('c:/abc')
True
>>> os.path.isabs('c:\\abc')
True
>>> os.path.isabs('\\abc')
True
>>> os.path.isabs('abc')
False

所以说,实际上这个方法在 Windows 并不好用,试着查看源代码,但实现并不是 Python 的,似乎有 macpath,posixpath,ntpath,但 ntpath 在 Windows 上返回就是上述值。

2. pathlib.Path().is_absolute() 在 Windows 上更好用

实际上判断是否绝对路径时,应该使用以下代码

import pathlib
pathlib.Path('/abc').is_absolute()

问题现象

无论怎么配置 Options 中 Emacs 的配置,M-v 都无法向上滚屏。

配置位置:Menu「Options」-> Edit Default Session... -> Dialog「Session Options - Default」 -> Tree「Category」-> Emulation -> Emacs -> CheckBox「Use ALT as meta key」

尝试修改各相关配置无效。

尝试搜索关键字,Google 中似乎类似问题很少人问。

解决方法

因为 Google 搜索关键字 SecureCRT Emacs ALT-V 没有类似提问,所以怀疑我的现象是特例 <-- 想到这一点非常重要。

特例说明,问题产生条件是我独有的,很大可能是我的环境引入的,就是说,不是内因,而是外因,是由于 SecureCRT 之外的程序导致的。

想到这一点后,我尝试逐个关闭电脑相关程序来排除,终于当我关闭「富途牛牛」时,在 Emacs 中,Alt+V 或说 M-v 生效了,可以成功向上滚动。

再查看「富途牛牛」的快捷键清单中,是截屏直播的快捷键。同理还有全屏直播 Alt+C,以及快捷键 Ctrl+1,Alt+1 也显示被其他软件占用。

不知是不是因为富途牛牛的产品经理视角狭隘,或者开发人员用的都是 macOS,要不怎么会设计出这些明显冲突的全局快捷键。

问题现象

EverEdit 4 内置 SFTP 插件连接 FreeBSD 13.2 SSH 时,提示如下:

[23:19:56]:Hostname was found in DNS cache
[23:19:56]:  Trying 192.168.2.81...
[23:19:56]:Adding handle: conn: 0x22356d0cfa0
[23:19:56]:Adding handle: send: 0
[23:19:56]:Adding handle: recv: 0
[23:19:56]:Curl_addHandleToPipeline: length: 1
[23:19:56]:- Conn 1 (0x22356d0cfa0) send_pipe: 1, recv_pipe: 0
[23:19:56]:Connected to 192.168.2.81 (192.168.2.81) port 22 (#1)
[23:19:56]:Failure establishing ssh session
[23:19:56]:Closing connection 1

而使用其他 SFTP 客户端是完全正常的。

解决方法

已提交给作者,还没找出解决办法。

在网上查找说是连接不上 FreeBSD 13.2 的 sftp,可能与 libcurl 有关。

但还没有时间写代码来调试。

待ee作者更新后,我再咨询。

参考

  1. https://curl.se/libcurl/c/sftpget.html

  2. https://curl-users.cool.haxx.narkive.com/ppppPXNc/curl-sftp-failure-establishing-ssh-session

步骤

  1. 安装 emacs,最新版已内置 Org mode
  2. 安装 nikola
  3. 安装 nikola orgmode 插件,并按插件目录下的 conf.py.sample 修改 conf.py
  4. 开始写笔记
nikola new_post -f orgmode -e
  1. 预览
nikola auto -a0.0.0.0
  1. 发布到 GitHub

设置 conf.py

GITHUB_SOURCE_BRANCH = 'sources'
GITHUB_DEPLOY_BRANCH = 'master'

发布

$ nikola github_deploy

其他

  1. 修改默认编辑器为 emacs
emacs ~/.profile
EDITOR=emacs
  1. 显示当前 Shell
echo $0

我在房间里洗个澡 同时在思考中国哪个rapper能比我屌


Nikola Tips

1. Nikola serve 自动刷新的命令行怎么写?

nikola auto

即使 conf.py 中已绑定非127.0.0.1的地址,上面的命令也只会在127.0.0.1启动调试。

没有去看源代码,可能这样实现从安全角度存在一定的合理性。

如果需要任意主机都能获得访问,可使用 -a 参数指定地址0.0.0.0

nikola auto -a0.0.0.0

2. Nikola Theme 如何定制 css

如果在模板中有代码

%if has_custom_css:
  <link href="/assets/css/custom.css" rel="stylesheet" type="text/css">
%endif

因此,增加 /assets/css/custom.css 文件即可。

3. Nikola 如何推送到 GitHub

先设置好 git 推送

git config --global --add safe.directory /usr/home/kaffa/web/note.tt4e.com
git config --global user.email "yourname@tt4e.com"
git config --global user.name "Your Name"

将以下内容保存为 aio.sh 脚本

#!/bin/bash
#
# nikola output push to github
cd ~/web/note.tt4e.com/
nikola build
git add .
git commit -am 'Kaffa'
git push

先 su 到 root 用户,然后运行以下命令,再 su 会当前用户

chown -R kaffa:wheel .git
chmod -R 777 ./aio.sh

如果遇到错误提示 Unable to create ** /.git/index.lock: Permission denied,则需要

chown -R kaffa:wheel .git

其中 用户名和所属组,可以用 groups 命令查看。

完成书上步骤后,则每次可以运行 aio.sh 来推送 GitHub,GitHub 收到推送后,会使用 GitHub Action 来处理发布。

使用以上方法是有效的,但却说明没有认真读 nikola 文档。

Nikola 官方支持推送到 GitHub

官方文档

解释一下:

  1. GITHUB_DEPLOY_BRANCH:发布分支,是 Nikola 产生的 HTML 文件,建议命名为 src。

  2. GITHUB_SOURCE_BRANCH:源码分支,建议在 GitHub 上设置为默认分支,建议命名为 main,而不是 master [1]

  3. GITHUB_REMOTE_NAME:远程仓库名;

  4. GITHUB_COMMIT_SOURCE:True,发布时会自动提交 src 分支。

补充:

采用这种方法时,Github Pages 的 Build and deployment 一节,source 下拉框中,要选择 Deploy from a branch,而不是 GitHub Actions。

nikola github_deploy

脚注

问题现象

当在 Windows Terminal 中运行 ssh 命令时,终端中提示:

'ssh'不是内部或外部命令,也不是可运行的程序或批处理文件

English Version

'ssh' is not recognized as an internal or external command, operable program or batch file.

解决方法

在 Windows 设置中安装 OpenSSH 客户端,且在环境变量 PATH 中加入:

C:\Windows\System32\OpenSSH

验证方法:检查以上目录中是否有 ssh.exe 文件。

『专家程序员经历多,遇到的坑也多。面对线程的话题,TA 们多半会说:线程很糟糕,你永远不应该使用它们。』

异步的结构

在 Python 中,不适合重量级使用线程。现在更适合使用异步模式,所涉及的库是 asyncio。

asyncio 的结构如下:

层级

概念

实现

9

网络:流

StreamReader, StreamWriter, asyncio.open_connection(), asyncio.start_server()

8

网络:TCP/UDP

Protocol

7

网络:传输

BaseTransport

6

工具

asyncio.Queue

5

子进程和线程

run_in_executor(), asyncio.subprocess

4

任务

asyncio.Task, asyncio.create_task()

3

未来对象

asyncio.Future

2

事件循环

asyncio.run(), BaseEventLoop

1

协程

async def, async with, async for, await

问题现象

在 SecureCRT 中使用 Emacs 或 Vim 方向键变成 ABCD,看起来是键盘的模式导致的。

解决方法

  1. 打开菜单 Options -> Edit Default Session...

  2. 在打开的窗口 Session Options - Default 中,点击左侧 Terminal -> Emulation -> Modes

  3. 右侧的 Emulation Modes 下,Numeric keypad 和 Application keypad 单选框组中,选择 Application keypad。

  4. 保存

笔记有什么内容?

  • 主要内容为编程语言、数据库、操作系统、算法、计算机科学相关内容

  • 开发中遇到的坑和 Tips

  • 开发手册或开发文档中有的,但不好找的内容

  • 文档中没提到,源码中有的内容

我为何选 Nikola?

  • 优点

    1. 支持 rst 格式,还支持 Org mode;

    2. 以 Python 开发,模板并不绑定 Jinja2 或 Mako,都支持;

    3. 支持的格式有

      • reStructuredText (default and pre-configured)

      • Markdown (pre-configured since v7.8.7)

      • Jupyter Notebook

      • HTML

      • PHP

      • anything Pandoc supports (including Textile, DocBook, LaTeX, MediaWiki, TWiki, OPML, Emacs Org-Mode, txt2tags, Microsoft Word .docx, EPUB, Haddock markup)

      如果包含插件的格式,还支持

      • AsciiDoc

      • BBCode

      • CommonMark

      • IRC logs

      • Markmin

      • MediaWiki (smc.mw)

      • Misaka

      • ODT

      • Emacs Org-Mode

      • reST with HTML 5 output

      • Textile

      • txt2tags

      • CreoleWiki

      • WordPress posts

    4. 由于 rst 的优势,天然支持混合词法分析器的代码高亮,比如 html+mako

      实际上支持的种类就是 pygments 所支持的,Demo 在 http://pygments.org/

      目前可用的如下:

      abap | abnf | ada, ada95, ada2005 | adl | agda | ahk, autohotkey | alloy | ampl | antlr-as, antlr-actionscript | antlr-cpp | antlr-csharp, antlr-c# | antlr-java | antlr-objc | antlr-perl | antlr-python | antlr-ruby, antlr-rb | antlr | apacheconf, aconf, apache | apl | applescript | arduino | as, actionscript | as3, actionscript3 | aspectj | aspx-cs | aspx-vb | asy, asymptote | at, ambienttalk, ambienttalk/2 | autoit | awk, gawk, mawk, nawk | basemake | bash, sh, ksh, shell | bat, batch, dosbatch, winbatch | bbcode | bc | befunge | blitzbasic, b3d, bplus | blitzmax, bmax | bnf | boo | boogie | brainfuck, bf | bro | bugs, winbugs, openbugs | c-objdump | c | ca65 | cadl | camkes, idl4 | cbmbas | ceylon | cfc | cfengine3, cf3 | cfm | cfs | chai, chaiscript | chapel, chpl | cheetah, spitfire | cirru | clay | clean | clojure, clj | clojurescript, cljs | cmake | cobol | cobolfree | coffee-script, coffeescript, coffee | common-lisp, cl, lisp | componentpascal, cp | console, shell-session | control, debcontrol | coq | cpp, c++ | cpp-objdump, c++-objdumb, cxx-objdump | cpsa | crmsh, pcmk | croc | cryptol, cry | csharp, c# | csound, csound-orc | csound-document, csound-csd | csound-score, csound-sco | css+django, css+jinja | css+erb, css+ruby | css+genshitext, css+genshi | css+lasso | css+mako | css+mako | css+mozpreproc | css+myghty | css+php | css+smarty | css | cucumber, gherkin | cuda, cu | cypher | cython, pyx, pyrex | d-objdump | d | dart | delphi, pas, pascal, objectpascal | dg | diff, udiff | django, jinja | docker, dockerfile | doscon | dpatch | dtd | duel, jbst, jsonml+bst | dylan-console, dylan-repl | dylan-lid, lid | dylan | earl-grey, earlgrey, eg | easytrieve | ebnf | ec | ecl | eiffel | elixir, ex, exs | elm | emacs, elisp, emacs-lisp | erb | erl | erlang | evoque | extempore | ezhil | factor | fan | fancy, fy | felix, flx | fish, fishshell | flatline | fortran | fortranfixed | foxpro, vfp, clipper, xbase | fsharp | gap | gas, asm | genshi, kid, xml+genshi, xml+kid | genshitext | glsl | gnuplot | go | golo | gooddata-cl | gosu | groff, nroff, man | groovy | gst | haml | handlebars | haskell, hs | haxeml, hxml | hexdump | hsail, hsa | html+cheetah, html+spitfire, htmlcheetah | html+django, html+jinja, htmldjango | html+evoque | html+genshi, html+kid | html+handlebars | html+lasso | html+mako | html+mako | html+myghty | html+php | html+smarty | html+twig | html+velocity | html | http | hx, haxe, hxsl | hybris, hy | hylang | i6t | idl | idris, idr | iex | igor, igorpro | inform6, i6 | inform7, i7 | ini, cfg, dosini | io | ioke, ik | irc | isabelle | j | jade | jags | jasmin, jasminxt | java | javascript+mozpreproc | jcl | jlcon | js+cheetah, javascript+cheetah, js+spitfire, javascript+spitfire | js+django, javascript+django, js+jinja, javascript+jinja | js+erb, javascript+erb, js+ruby, javascript+ruby | js+genshitext, js+genshi, javascript+genshitext, javascript+genshi | js+lasso, javascript+lasso | js+mako, javascript+mako | js+mako, javascript+mako | js+myghty, javascript+myghty | js+php, javascript+php | js+smarty, javascript+smarty | js, javascript | jsgf | json | jsonld, json-ld | jsp | julia, jl | kal | kconfig, menuconfig, linux-config, kernel-config | koka | kotlin | lagda, literate-agda | lasso, lassoscript | lcry, literate-cryptol, lcryptol | lean | less | lhs, literate-haskell, lhaskell | lidr, literate-idris, lidris | lighty, lighttpd | limbo | liquid | live-script, livescript | llvm | logos | logtalk | lsl | lua | make, makefile, mf, bsdmake | mako | mako | maql | mask | mason | mathematica, mma, nb | matlab | matlabsession | minid | modelica | modula2, m2 | monkey | moocode, moo | moon, moonscript | mozhashpreproc | mozpercentpreproc | mql, mq4, mq5, mql4, mql5 | mscgen, msc | mupad | mxml | myghty | mysql | nasm | ncl | nemerle | nesc | newlisp | newspeak | nginx | nimrod, nim | nit | nixos, nix | nsis, nsi, nsh | numpy | objdump-nasm | objdump | objective-c++, objectivec++, obj-c++, objc++ | objective-c, objectivec, obj-c, objc | objective-j, objectivej, obj-j, objj | ocaml | octave | odin | ooc | opa | openedge, abl, progress | pacmanconf | pan | parasail | pawn | perl, pl | perl6, pl6 | php, php3, php4, php5 | pig | pike | pkgconfig | plpgsql | postgresql, postgres | postscript, postscr | pot, po | pov | powershell, posh, ps1, psm1 | praat | prolog | properties, jproperties | protobuf, proto | ps1con | psql, postgresql-console, postgres-console | puppet | py3tb | pycon | pypylog, pypy | pytb | python, py, sage | python3, py3 | qbasic, basic | qml, qbs | qvto, qvt | racket, rkt | ragel-c | ragel-cpp | ragel-d | ragel-em | ragel-java | ragel-objc | ragel-ruby, ragel-rb | ragel | raw | rb, ruby, duby | rbcon, irb | rconsole, rout | rd | rebol | red, red/system | redcode | registry | resource, resourcebundle | rexx, arexx | rhtml, html+erb, html+ruby | roboconf-graph | roboconf-instances | robotframework | rql | rsl | rst, rest, restructuredtext | rts, trafficscript | rust | sass | sc, supercollider | scala | scaml | scheme, scm | scilab | scss | shen | silver | slim | smali | smalltalk, squeak, st | smarty | sml | snobol | sourceslist, sources.list, debsources | sp | sparql | spec | splus, s, r | sql | sqlite3 | squidconf, squid.conf, squid | ssp | stan | swift | swig | systemverilog, sv | tads3 | tap | tcl | tcsh, csh | tcshcon | tea | termcap | terminfo | terraform, tf | tex, latex | text | thrift | todotxt | trac-wiki, moin | treetop | ts, typescript | turtle | twig | typoscript | typoscriptcssdata | typoscripthtmldata | urbiscript | vala, vapi | vb.net, vbnet | vcl | vclsnippets, vclsnippet | vctreestatus | velocity | verilog, v | vgl | vhdl | vim | wdiff | x10, xten | xml+cheetah, xml+spitfire | xml+django, xml+jinja | xml+erb, xml+ruby | xml+evoque | xml+lasso | xml+mako | xml+mako | xml+myghty | xml+php | xml+smarty | xml+velocity | xml | xquery, xqy, xq, xql, xqm | xslt | xtend | xul+mozpreproc | yaml+jinja, salt, sls | yaml | zephir |

      可以通过以下命令查看

      pygmentize -L
      
      1. Nikola 如果是艾志恒,会不会唱:

        在房间里洗个澡
        同时在思考其它的jamstack哪个能比我屌
        Posts keep increasing
        你们格式都认不到
        我们code好
        但目前我还嫌自己PR的少
  • 缺点

    1. 主题的设计的感觉,不如 Hugo 的丰富

    2. 安装过程有小坑(等再次安装时会写一篇笔记记录)

Nikola