Chrome 浏览器中的远程 DNS 解析

由于伟大的X火长城的存在,在境内进行 DNS 解析请求返回的报文不一定是靠谱的,有必要使用远程的服务器进行DNS 解析来缓解这个问题。根据 Google 的文档如果设置了 socks5 代理,URL 中的 hostname 将由代理服务器解析。

1
2
The --proxy-server="socks5://myproxy:8080" flag tells Chrome to send all http:// and https:// URL requests through the SOCKS proxy server "myproxy:8080",
using version 5 of the SOCKS protocol. The hostname for these URLs will be resolved by the proxy server, and not locally by Chrome.

但是由于 chrome 浏览器的 DNS prefetching 特性,即使设置了 socks5 代理 DNS prefetching 特性也会使用本地网络进行 DNS 解析。

1
2
3
4
The --proxy-server flag applies to URL loads only. 
There are other components of Chrome which may issue DNS resolves directly and hence bypass this proxy server.
The most notable such component is the "DNS prefetcher".
Hence if DNS prefetching is not disabled in Chrome then you will still see local DNS requests being issued by Chrome despite having specified a SOCKS v5 proxy server.

下面是禁用 DNS prefetching 的方法,新版本的 chrome 已经取消了直接针对 DNS prefetching 设置的选项,有一个预加载网页的选项,需要把这个选项关闭,具体设置方法为:

1
设置 -> 隐私设置和安全性 -> Cookie 及其他网站数据 -> 预加载网页,以便实现更快速的浏览和搜索

禁用 DNS prefetching 的方案是脆弱的,Chrome 可能在其他的地方使用 raw dns requsts ( Chrome 发送 DNS 请求报文), 绕过代理服务器直接使用本地网络进行 DNS 解析。

1
2
Disabling DNS prefetching would solve this problem, 
however it is a fragile solution since once needs to be aware of all the areas in Chrome which issue raw DNS requests.

所以最终的解决方案是使用 Google 文档中的命令行参数 --host-resolver-rules= ,经过测试可以使用下面的命令行来解决 DNS 远程解析

1
google-chrome --proxy-server="socks5://127.0.0.1:9999" --host-resolver-rules="MAP * 0.0.0.0, EXClUDE 127.0.0.1"

–host-resolver-rules 将阻止Chrome 使用本地网络发起 DNS 请求,具体的方式是将 DNS 请求转向一个不存在的地址,注意需要排除 sock5 代理的地址。

在实际使用过程中发现,如果不指定 –host-resolver-rules 命令行参数,有少量 DNS 请求会使用本地网络,比如 safebrowsing.googleapis.com

参考资料

https://www.chromium.org/developers/design-documents/network-stack/socks-proxy/

Logseq 使用小结 (三)

使用 Logseq 写笔记已经大半年了,Logseq 是这么多年来除了 vim 之外,唯一可以在使用上螺旋上升的软件。我把 Logseq 推荐给媳妇,她用来写会议纪要,写备忘录,管理待办事项,也用得挺好。

Logseq 的成功之处在于它降低了记录的成本,不需要大段大段的文字,也不需要太多的文章结构,随时都可以记录。Logseq 比较严重的问题是它的使用太灵活了,前后记录的标准、格式、标签等要素可能不一致,容易造成笔记凌乱。笔记一凌乱就没法有效的聚合,笔记的有效聚合形成一个有意义的想法群是 Logseq 等双链软件和其他笔记软件相比最有价值的地方。

我这半年来总结出笔记系统成功的关键是: 在同一个地方,用同样的格式和一致的标准记录你的洞见。但是由于 Logseq 缺乏有效的工作流,没法自动化提示必要的步骤,只能通过不断的练习来强化学习。另外 Logseq 中 page 和 tag 只是起到过滤笔记的作用,最关键的笔记之间的链接却很容易被忽视,tag 的数量一多又会开始笔记凌乱了。

总而言之,如果只是把 Logseq 作为备忘,或者简单作为信息记录,挺好用也不需要学习太多的东西,但是如果需要使用 Logseq 来实践卡片笔记法等 PKM 理论,恐怕还是需要花费一些功夫仔细琢磨一番。PKM 方面的书籍我强力推荐 《卡片笔记写作法》一书,中文翻译很不错,虽然书名是谈写作,里面的内容却涉及很广,我自己阅读后收益良多。

就实践卡片笔记法来说,浮墨是一个比较理想的工具,「少即是多,多则惑」,去掉一切不需要的功能,重点才能突出。Logseq 的野心挺大,不想只做一个双链笔记本,还想做得更多,这就要求我们想清楚使用其的主要目的是什么。现实中并不存在一个 all in one 的理想工具,什么工具合适就可以使用什么工具,各位施主不能 「着相」了。

上面说的是一些「道」层面的东西, Logseq 在「术」方面的东西也不少,下面将介绍一些前两篇尚未涉及的功能和使用技巧。

☆ 使用 properties

https://docs.logseq.com/#/page/term%2Fproperties

在 Logseq 中有两种 properties, page properties 和 block properties。

  • Page properties 在第一个 block 写 property:: value
  • Block properties 在每个 block 内使用 property:: value

在使用 block properties 时,需要输入 shift + Enter 来进行换行,换行后输入 :: Logseq 会自动提示已经使用过的 property。理解 properties 可以简单的把 block 看成数据库的一条记录, properties 就是不同的字段,可以通过 Logseq 的 query 来查询相关记录。在使用 properties 时可以引用 page 或者 tag,可以通过这种方法来索引这条记录。

例如,我将书籍的 block 都添加了 category:: Books 的属性,后续可以使用 {{query (property category Books) }} 来查询所有书籍了,感觉上有点类似 notion 的表格。

☆ 使用 /Scheduled 制定计划

使用 Schedule 的功能的方法比较简单,在写完一条 block 后,输入 shift + enter 换行后,输入 /Scheduled 在弹出的界面中选择时间周期即可。

在 Schedule 规定的时间内,Logseq 的 Journals 页面可以看到相关的内容。

☆ 使用模板 (Template)

https://docs.logseq.com/#/page/templates

使用模板的好处是可以避免重复性的劳动,比如你希望在 Journals 页面里按照 [[每日工作]] [[每日心得]] 的固定格式来记录,那么你需要在每天重复输入一次。但如果你制作一个固定模板,就可以使用 /Template 命令来完成自动化的输入。

制作模板的过程可以参考 Logseq 官方的动画,简单说就是写一个 block,这个 block 包含了必要的结构,在 block 前面的圆点点击鼠标右键 -> Make template,再输入模板的名字就完成了。在后续的使用过程中,输入 /Template 后在弹出的界面选择对应的模板名就可以完成自动化的输入。

☆ 一些好用的插件

插件可以拓展 Logseq 的功能,使用插件的方法在 Logseq 使用小结 (二) 中有详细介绍,这里就不再细说。

Logseq Plugin Tabs

https://github.com/pengx17/logseq-plugin-tabs

Plugin Tabs 像打开浏览器一样打开 pages 或者 blocks,对于内容比较多的 page,这个插件非常实用。

logseq-plugin-mark-map

https://github.com/vipzhicheng/logseq-plugin-mark-map

Mark map 可以自动化地把你的笔记用导图的形式输出,方便展示和记忆。

☆ 一些使用上的小技巧

  • Logseq content wide mode 可以使用快捷键切换 t w
  • Logseq 的 property 可以通过输入 :: 来触发自动补全操作,非常方便。
  • Logseq 使用快捷键 Cmd + Shift + i 可以打开 devtools
  • Logseq v0.68,自动补全提供两个快捷键 mod+pmod+n 比较方便了
  • Logseq 可以使用 command + command - 来放大或者缩小 Logseq 的字体大小
  • Logseq 0.7.1 新功能:Copy & Paste with rich-text formats,如果粘贴时不想保留格式 mod + shift + v
  • Logseq 移动光标的快捷键:mod + p 向上移动光标,mod + n 向下移动光标
  • Logseq Markdown 语法支持 Horizontal Rules,可以使用 ---分隔卡片笔记。

mod 在 windows 和 linux 系统中是 ctrl, 在 macOS 系统中是 command

☆ 参考链接

https://www.usmacd.com/cn/logseq/
https://www.usmacd.com/cn/logseq2/

Logseq 使用小结 (二)

用了 Logseq 一段时间了,做个简单的总结,国内的很多文章,在我看来还是不够简单明了, 本文大致介绍了 Logseq 比较常用的一些功能的使用。

Flashcards

可以把记录的知识点当作卡片来记忆,用过 Anki 的同学,应该都比较熟悉了,使用的记忆算法为 SM-5
要将一个 block 记为卡片非常简单,使用 #card 标签就可以了。

卡片组

有些卡片可能是归属同一个大类,这时候就可以使用卡片组了。像我上面这个例子中,要记忆的单词都在 英语单词积累下,就可以使用语法 {{cards 英语单词积累}} 效果如下图,
可以看出我已经积累了7张卡片了。

要背诵需要记忆的卡片时,单击左侧的 Flashcards 就可以了,使用方面没有什么特别的地方,有三个选项可以选择。

theme (皮肤)

皮肤就是青菜萝卜各有所爱了,推荐两款我自己比较喜欢的的皮肤。


Github 仓库地址如下:

https://github.com/pengx17/logseq-laurel-theme
https://github.com/tobealive/logseq-allday-theme

有两种方法可以设置皮肤:

  • custom.css
  • plugin system

使用 custom.css,打开 Settings -> General -> Custom theme 点击 custom.css 复制 css 内容,保存退出即可。
使用插件系统,则需要先把插件系统打开,Settings -> Advanced -> Plug-in system 。打开插件系统后,可以直接使用
Plugins -> Marketplace -> themes 选择你喜欢的 theme 点击 Install 就可以了

不过还是推荐使用 Logseq 自带的插件管理系统来安装,可以自动升级比较方便,切换皮肤可以点击右上角 三个点 -> Themes 选择皮肤。

plugin (插件)

使用 Logseq 插件同样是两种方法:

  • plugin system
  • Load unpacked plugin

使用插件系统的方法和上面安装皮肤的步骤大致相同,依次点击 Plugins -> Marketplace -> Plugins ,选择插件点击 Install 即可。要加载 unpacked plugin 首先要打开开发者模式 Settings -> Advanced -> Developer mode , 设置为打开。打开后使用插件管理系统 Plugins -> Installed -> Load unpacked plugin 选择相关目录就可以了。

具体的插件可以参考 https://github.com/logseq/awesome-logseq#Plugins 记录的插件都挺不错的。

值得一提的是,插件系统的网络不太稳定(总所周知的原因),使用代理会方便一些。

1
https_proxy=127.0.0.1:3128 ./Logseq --proxy-server=http://127.0.0.1:3128

安装插件可能会出现 timeout 错误,多重试几次就应该可以安装上了。

query

query 算是 Logseq 的高级功能了,我用的也不多,输入 /query 回车就可以自动进入 query 了,具体的语法很灵活可以参考:
https://logseq.github.io/#/page/queries

油管上有相关 video,大家可以参考一下:
https://www.youtube.com/watch?v=GDauxjx_bdA&ab_channel=OneStutteringMind
https://www.youtube.com/watch?v=qQ8DzumRZkM&ab_channel=OneStutteringMind

写在后面的话

Logseq 的功能还是挺多的,两篇文章也不可能全部介绍完,官方文档总是最好的资料:https://logseq.github.io/#/page/Contents

参考资料

https://logseq.github.io

https://www.usmacd.com/cn/logseq/
https://www.usmacd.com/cn/logseq3/

logseq 试用报告

最近双链笔记的概念比较火热, Roam Research 大概是第一个实现此功能的软件,后续 Notion、Obsidian、logseq 等软件大步跟进,这些软件各有千秋。下面这段是参考资料文章中的一小段,很有参考意义:

1
2
3
4
5
Roam 的突破在于,理论上,把软件设计理念与卡片盒笔记法紧紧捆绑:
卢曼(Niklas Luhmann)得益于卡片盒笔记法,从公务员成为德国当代重要的社会学家,
因此基于卡片盒笔记法的 Roam 也可以助力你的成功;
技术上,推出双向链接、可视化笔记间的联系、嵌入(Transclusion)等功能,
让生产、查找笔记更加高效,于此同时,还省却维护层级结构的麻烦。


上面两张图片就是卡片盒笔记法 最形象的表示了,个人觉得这种方法很适合自己。

为了体验双链笔记,我花费了不少时间,上面的几个软件都体验了一下,Roam 是收费软件,银子不够所以不选,Notion 笔记存储在云端,不符合我数据安全的要求也不选,剩下的就只有两个选项了 Obsidian 和 logseq 。

Obsidian

软件主页:https://obsidian.md/

挺多人选择用 Obsidian 的原因是它的 MarkDown 语法支持得比较好,MarkDown 语法有很多的使用者,类似 Typora 的 MarkDown 笔记软件是当前笔记软件的主流,这使得这些笔记软件的使用者过渡到 obsidian 会比较平滑。我是开源MarkDown 笔记软件 Vnote 的重度使用者,一度想使用 Obsidian 作为主力软件。

Obsidian 有挺多优点,比如它对个人用户永久免费,但是它不开源,而且 Link+to+blocks 的语法比较别扭。最终还是没有选择它,有人说Obsidian 插件非常丰富,我自己没有折腾过。

logseq

软件主页:https://logseq.com/
源码仓库:https://github.com/logseq/logseq

说了这么久终于到正主了,第一次知道双链笔记这个概念是因为有个网友在网上说使用效果不错,过渡很平滑。可能有先入为主的关系,另外我本人对开源软件一向有莫名的好感,所以主观意识上就很喜欢这个软件。logseq 的粒度足够,block reference 使用非常方便,另外 logseq 的 PDF 标记功能对于需要大量阅读论文的我来说非常好用。

但是 logseq 也不是没有缺点,logseq 对 markdown 语法的支持不是很好,即使直接导入 MarkDown 文件,最后显示的结果感觉也是有问题,各类标题直接转化成 block 了,这是有问题的。但是从这个角度说 logseq 就是一个纯粹的双链笔记软件而不是一个添加了双链功能的 MarkDown 笔记软件。

最终的笔记管理方法

说到这,问题就简化了,平时的文档记录仍然使用 MarkDown 笔记软件,只是在平时记录的时候使用双链笔记软件。这样的笔记管理方法看上去比较麻烦,其实却很完美,想写文章的时候直接用 VNote,平时知识积累记录的时候就用 logseq,根本就不用过渡,只需要启用一个新软件即可。

基于 block 的双链笔记最大的好处就是没有输出负担,一些很随意的想法都可以记录下来,因为大家确实不可能每次都有大段的想法可以输出。有人说用 logseq一年写了 30万字,我开始觉得有点夸张,但是使用一个多月发现可能属实,现在我自己都写了几万字了。每个想法 (block) 之间可能会有联系,不断记录想法,不断联系,慢慢的真能发现一些意想不到的东西之间居然有联系,而这些联系很有可能是一些关键的底层逻辑。平时在记录的时候手工划分目录,层次关系,其实已经将一些想法,概念给逻辑化了,这样的记录方法很难摆脱固有的认知,而基于 block 的双链笔记就自由的多,不断记录,不断整理,汇总就交给软件来完成吧。

我现在已经通过 logseq 的记录想清楚了一些问题,在平时的工作记录中也不断地稳步螺旋推进,在此向大家推荐这款笔记软件。

最后的话

其实工具并不是那么重要,最重要的还是平时要记录,要定期输出。IT 界有一个著名的段子,你以为你是在写 blog 其实你只是在折腾 wordpress :)

共勉。

参考资料

双链笔记软件推荐:Logseq 和它的五种用法
请不要神化双链笔记

https://www.usmacd.com/cn/logseq2/
https://www.usmacd.com/cn/logseq3/

Markdown 笔记软件: VNote

向大家安利一款 markdown 笔记软件, VNote https://github.com/vnotex/vnote
此软件目前已经 1300 多个commits 了,做为一个有些开源软件维护经历的人,深感不易。
用了太多 markdown 笔记软件,此软件使得最为顺手,尤其作为程序员 vim 模式 让我感到非常舒服,
大量图表的支持比如 UML 流程图,让我用起来很顺手。

Vnote 分为两个开发阶段,阶段一 vnote2 已经开发完成:https://github.com/vnotex/vnote/tree/vnote2
现在处于第二个开发阶段:https://github.com/vnotex/vnote

据说后续会出收费版本,但目前看还需要很长的一段时间了。

VNote

我前后尝试过各种笔记软件,我理想的软件有几点:

  • a. 支持文件管理
  • b. 不要乱改数据,容易迁移
  • c. 支持 markdown
  • d. 跨平台,支持 Mac 和 Linux

最后,终于发现了 VNote,有点惊喜。在 Linux 下编译 VNote 显示有明显改进,下面是编译的方法:

  1. 下载 QT SDK (最新的 vnotex 官方支持 Qt 5.15.2,可自行下载使用替换相应的版本即可)

https://mirrors4.tuna.tsinghua.edu.cn/qt/official_releases/qt/5.9/5.9.0/qt-opensource-linux-x64-5.9.0.run

将 Qt5.9 安装到 /home/henices/Qt5.9.0/

  1. 编译 fcitx-qt5 (如果使用的是 fcitx5,需要下载编译 fcitx5-qt)

git clone https://gitlab.com/fcitx/fcitx-qt5.git

准备编译脚本 build_linux.sh, 指定下载的QT

1
2
3
4
5
6
7
8
9
10
QTDIR="/home/henices/Qt5.9.0/5.9/gcc_64/"
PATH="$QTDIR/bin:$PATH"
LDFLAGS=-L$QTDIR/lib
CPPFLAGS=-I$QTDIR/include

rm -rf build
mkdir -p build
cd build
cmake ..
make -j8

使用下面命令编译

1
2
chmod a+x ./build_linux.sh
./build_linux.sh

将生成的 libfcitxplatforminputcontextplugin.so copy 到
/home/henices/Qt5.9.0/5.9/gcc_64/plugins/platforminputcontexts/

  1. 获取VNote 源码
1
2
3
git clone https://github.com/tamlok/vnote.git vnote.git
cd vnote.git
git submodule update --init
  1. 编译

build_linux.sh

1
2
3
4
5
6
7
8
9
10
11
QTDIR="/home/henices/Qt5.9.0/5.9/gcc_64/"
PATH="$QTDIR/bin:$PATH"
LDFLAGS=-L$QTDIR/lib
CPPFLAGS=-I$QTDIR/include

rm -rf build
mkdir -p build
cd build
qmake -v
qmake PREFIX=/usr/local CONFIG-=debug CONFIG+=release ../VNote.pro
make -j8

使用下面命令编译

1
2
chmod a+x ./build_linux.sh
./build_linux.sh
  1. 安装

sudo make install

诡异问题

Fedora 升级到 35 后,Vnote 出现了一系列问题

  1. vnote 的阅读模式不能正常显示 (Qt 5.12.11)

    解决这个问题需要禁用 Qtwebengine 的 sandbox

1
./vnote --no-sandbox
  1. 导出 pdf 文件 cpu 100% (Fedora 系统自带 Qt 5.15.2 编译)
  2. 官方提供的 Linux AppImage 文件无法打开 Fcitx5 输入法。

最终解决问题的方法是下载 Qt5.15.2 重新编译 Vnote, Qt 从 5.15 开始不提供离线安装包,非常不方便。
官方提供的在线升级包如果太新只能安装 Qt 6,所以必须下载老版本的 online installer
https://download.qt.io/archive/online_installers/4.0/qt-unified-linux-x64-4.0.1-1-online.run

具体内容可以参考 https://github.com/vnotex/vnote/issues/1942 的讨论

2022.8.2 更新

导出 pdf 文件 cpu 100% 的问题,我调试 Qt 5.15.5 代码时已经解决,可以参考:
https://github.com/vnotex/vnote/commit/53e2b3bfa8aff4f590471caf5e8cc55c8b8b538b

Qt 5.15.3

使用 Qt 5.15.3 编译 VNOte 后,出现下面的报错

1
[695784:695784:0401/181224.580254:ERROR:network_service_instance_impl.cc(286)] Network service crashed, restarting service.

bug 在这 https://bugreports.qt.io/browse/QTBUG-91715 可以先使用环境变量救急一下

1
QTWEBENGINE_DISABLE_SANDBOX=1 QTWEBENGINE_CHROMIUM_FLAGS=--lang=de ./vnote --no-sandbox --disable-gpu

2022.8.2 更新

Qt 5.15.5 已经修复了这个问题。

参考链接

https://tamlok.gitee.io/vnote/zh_cn/#!docs/%E5%BC%80%E5%8F%91%E8%80%85/%E6%9E%84%E5%BB%BAVNote.md