《也许你该找个人聊聊》读书笔记

怎么知道的这一本书

我已经忘记最初是怎么知道的这一本书了,好像是订阅的某人的 Newsletter,又或许是在豆瓣看到了别人的书评。但这本书已经被标记为待看了,就拿出来读了一下。

虽然看到豆瓣的上的评价已经排上了豆瓣 Top 250 中的 117 名,但阅读之前确实没有抱有很大的期待,但当我看了一半之后我才发了这一本书魅力。尤其是当哪位身患癌症为时不多的大学女教授,当她发现自己更喜欢超市收银员时义无反顾的去做时,我甚至是眼泛泪光的。还有看到那个送了多年的快递小哥受到作者感召决定会学校读书,最终成为一个建筑承包商的时候,我是感动的。这种力量是无形的,来自于生活最真实的鼓励。

关于作者

作者叫做洛莉·戈特利布(Lori Gottlieb),我原本对作者也并不是非常了解,但阅读的过程中也能在书中略微感受到一些,作者是一位心理治疗师。并且带着一位小孩,而这位小孩并不是作者结婚之后所生,而是通过购买精子而得。在书中的开篇也能读到作者自己因为和一位「仇童男」分手而陷入痛苦并找另一位心理治疗师治疗的过程。

几句话总结书的内容

这是一本心理治疗师写的回忆录,回顾几位来访者的故事,包括:

  • 一个沉迷于手机短信,防卫心较重的四十岁男人约翰,电视剧编剧和制片,事业成功,但自以为是。
    • 母亲因为救学生而被汽车撞倒,父亲是一位立志要成为作家的英语文学教授。
  • 一位 30 多岁,刚刚新婚被诊断出绝症的大学女教授。
    • 在她发现自己的生命只剩下一年的时候,依然决定去当超时收银员。
  • 二十四岁的女孩夏洛特,有着原生家庭创伤和酗酒问题,在爱情问题中频频受挫
  • 一位六十九岁的孤独老太太,离过三次婚,对生活缺少目标而且充满遗憾,声称如果生活不好转,将会在 70 岁生日的时候自杀

这一本书的组织架构并没有将这几个人的故事一一整理到一起,而是以时间序,穿插讲述,在一开始月阅读的时候还有一些不适,但是当我习惯了作者的叙事逻辑之后,发现非常易读。作者的文笔也非常细腻,生动,往往一件非常小的事情通过作者的叙述就能够在脑海里面构建出一副画面。

启发或想法

在阅读这一本书的时候,我不经回想起一部没有那么知名的韩剧 —- [[灵魂修缮工]],[[申河均]] 饰演的心理医生和 [[郑素敏]] 饰演的患有 BPD 边缘型人格障碍的患者,两人偶然相遇发生的各种故事。

申河均扮演的心理医生正是这本书中作者提到了那一类长期和病患一起生活并观察病患给出治疗方案的医生。而这样的医生也正是现代医疗体系做排斥的,医院需要医生 15 分钟完成一位患者的诊断,流水线的完成任务。这一部韩剧也是我看过的少数几部以心理医生为主角的「医疗剧」。都说现代人或多或少有一些心理疾病,但却鲜有剧集去表现。而这一本书,这一部剧的观看过程就是非常疗愈的过程。

《精神疾病诊断与统计手册》罗列了十种人格障碍。

  • A 群,具有古怪、奇异、反常的人格特质,偏执型人格障碍,分裂型人格障碍
  • B 群(具有戏剧化、不稳定的人格特质) 反社会型人格障碍,边缘型人格障碍,表演型人格障碍,自恋型人格障碍
  • C 群(具有焦虑、恐惧的人格特质)回避型人格障碍,依赖型人格障碍,强迫型人格障碍

[[荣格]] 创造了「集体无意识」这个词,指的是大脑中保存祖先记忆或全人类共有经验的部分。 [[弗洛伊德]] 才客观层面分析了梦境,即梦境的内容如何与做梦者的实际生活关联(包括人物的角色、特定的情境),而荣格心理学则是从主观层面解析梦境,去解释梦境如何与我们集体无意识中的共有主题相关联。

我们如何改变?

  • 答案藏在「与他人的相处中」。

谁应该看这本书

  • 我想这本书所有人都可以看,在任何时候,任何地点。

2022-07-28 psychology , reading , reading-2022 , reading-2022q3

Obsidian 中使用 Vim 模式并配置 Vimrc

一直在 [[Obsidian]] 中使用 Vim 模式,之前也安装了 Obsidian Vimrc 的插件,但一直没有好好研究,只简单的配置了几行。最近总想要实现在 Visual Mode 下给选中的内容两边加上 Grave(也被称为 backtick,就是键盘上 1 左边的按键,在 markdown 下通常用来作为 code) ,或者双引号,一直没有找到很好的办法,所以想来研究一下很否通过 Vimrc 来实现。

本文就记录一下在 Obsidian 下使用 Vim 键盘操作,以及在 Obsidian 下配置 Vimrc。

Prerequisite

文档内移动

基础移动

  • j/k/h/l
  • gg 移动光标到首行
  • G 移动到最后一行
  • w 移动到下一个 word 第一个字母
  • e 移动到 word 尾,ge 移动到上一个单词 word 尾
  • b 移动到上一个 word 第一个字母
  • 0 移动到行第一个字符
  • $ 移动到行尾
  • ^ 移动到行第一个非空白字符
  • % 跳转到匹配的 ()[]{} ,比如光标在 ( 那么 % 可以跳转到匹配的 )

垂直移动

上面提到过 j/k 可以跨行移动。

  • { 移动到上一个 paragraph
  • } 移动到下一个 paragraph
  • Ctrl+u/d 向上/下滚动窗口

搜索

  • /{pattern} 向后搜索,输入搜索词 Enter,然后使用 n 跳转下一个匹配,N 跳转上一个匹配
  • ?{pattern} 向前搜索

笔记间跳转

  • Ctrl-o Obsidian 默认, open quick switcher
  • Alt-[(在 macOS 下为 cmd+[) navigate back 跳转到前一个笔记
  • Alt-](在 macOS 下为 cmd+]) navigate forward 后一个笔记

这里推荐一个插件 Obsidian Better Command Palette ,安装完成之后映射到 Ctrl+p,然后就可以呼出 Palette:

  • /{search_keywords} 来搜索文档名
  • #{tag} 来搜索标签,然后在标签中搜索文档

我觉得 Better Command Palette 比默认的 Switcher 好的一点在于在搜索框中会显示文档的名字,原始名字和标签,而默认的只会显示文档名,而我的很多文档都是使用 alias 重命名过的,一般文档名都是英文名,而 alias 会起一个中文名。

切分 Panel

  • Ctrl+\ 垂直切分窗口,这个可以在设置中搜索 Split Vertically 设置
  • Ctrl+- 水平切分窗口,Split Horizontally

vimrc

vimrc 文件是 Vim 的配置文件,在 Obsidian 中可以通过 Obsidian Vimrc Support Plugin 来支持 vimrc。

可以在笔记库(vault) 根目录创建 .obsidian.vimrc,然后在其中配置。

特性:

  • exmap [commandName] [command ...] 用来映射 Ex commands 的命令。
  • obcommand 执行 Obsidian 命令
  • cmcommand 执行 CodeMirror 命令
  • surround 在 Visual 模式中给选择的文本添加内容,或者在 normal 模式中使用
  • pasteinto 粘贴板
  • jscommandjsfile

在添加命令到 Vimrc 文件之前,应该现在 Obsidian 的命令模式下尝试一下(在 Normal mode 下输入 : )。

" semicolon as colon
nmap ; :
" Have j and k navigate visual lines rather than logical ones
nmap j gj
nmap k gk
" I like using H and L for beginning/end of line
nmap H ^
nmap L $

这里举几个简单的例子:

  • 第一个配置,就是在 normal 模式下,将 ; 映射成 : ,这样进入 Vim 命令模式的时候就可以按相同的按键而不用按下 Shift 了
  • 第二个配置将 j 映射成 gjk 映射成 gk ,可以让 j/k 移动的时候按照视觉上的行数,而不是文本真实的换行,尤其是在笔记中可能有大量的段落的情况下非常有用
  • 第三个配置,将 H 映射成跳转到行首,L 映射成跳转到行尾

Obsidian Commands

安装 Vimrc 支持插件之后作者定义了一个 Ex command 叫做 obcommand 来执行不同的 Obsidian 命令。

在 Obsidian 中执行 : obcommand [commandName] 可以执行命令:

  • obcommand app: go-back
  • obcommand editor: insert-link
  • obcommand editor: toggle-comment
  • obcommand workspace: split-vertical

作者在 GitHub 上说在编辑器中执行 : obcommand 会展示出当前支持的 obcommand 命令列表,但我尝试之后并没有作用,把 Obsidian 升级到最新的 0.15.9 也不管用。

并且尝试使用 surround ,目前好像也有 BUG。

附录

目前支持的 obcommand 列表:

app:delete-file Delete current file –
app:go-back Navigate back Ctrl+Alt+ArrowLeft
app:go-forward Navigate forward Ctrl+Alt+ArrowRight
app:open-help Open help F1
app:open-settings Open settings Ctrl+,
app:open-vault Open another vault –
app:reload Reload app without saving –
app:show-debug-info Show debug info –
app:toggle-default-new?pane-mode Toggle default new pane mode –
app:toggle-left-sidebar Toggle left sidebar –
app:toggle-right-sidebar Toggle right sidebar –
backlink:open Backlinks: Show backlinks pane –
backlink:open-backlinks Backlinks: Open backlinks for the current file –
backlink:toggle-backlinks-in?document Backlinks: Toggle backlinks in document –
command-palette:open Command palette: Open command palette Ctrl+P
dataview:dataview-drop?cache Dataview: Drop All Cached File Metadata –
dataview:dataview-force?refresh-views Dataview: Force Refresh All Views and Blocks –
editor:attach-file Insert attachment –
editor:context-menu Show context menu under cursor –
editor:cycle-list-checklist Cycle bullet/checkbox –
editor:delete-paragraph Delete paragraph Ctrl+D
editor:focus Focus on last note –
editor:focus-bottom Focus on pane below –
editor:focus-left Focus on pane to the left –
editor:focus-right Focus on pane to the right –
editor:focus-top Focus on pane above –
editor:fold-all Fold all headings and lists –
editor:follow-link Follow link under cursor Alt+Enter
editor:insert-callout Insert callout –
editor:insert-embed Add embed –
editor:insert-link Insert Markdown link Ctrl+K
editor:insert-tag Add tag –
editor:insert-wikilink Add internal link –
editor:open-link-in-new-leaf Open link under cursor in new pane Ctrl+Alt+Enter
editor:open-search Search current file Ctrl+F
editor:open-search-replace Search & replace in current file Ctrl+H
editor:rename-heading Rename this heading... –
editor:save-file Save current file Ctrl+S
editor:set-heading Toggle heading –
editor:swap-line-down Move line down –
editor:swap-line-up Move line up –
editor:toggle-blockquote Toggle blockquote –
editor:toggle-bold Toggle bold Ctrl+B
editor:toggle-bullet-list Toggle bullet list –
editor:toggle-checklist?status Toggle checkbox status Ctrl+Enter
editor:toggle-code Toggle code –
editor:toggle-comments Toggle comment Ctrl+/
editor:toggle-fold Toggle fold on the current line –
editor:toggle-highlight Toggle highlight –
editor:toggle-italics Toggle italics Ctrl+I
editor:toggle-numbered-list Toggle numbered list –
editor:toggle-source Toggle Live Preview/Source mode –
editor:toggle-spellcheck Toggle spellcheck –
editor:toggle-strikethrough Toggle strikethrough –
editor:unfold-all Unfold all headings and lists –
file-explorer:move-file File explorer: Move file to another folder –
file-explorer:new-file Create new note Ctrl+N
file-explorer:new-file-in-new?pane Create note in new pane Ctrl+Shift+N
file-explorer:open File explorer: Show file explorer –
file-explorer:reveal-active- file
File explorer: Reveal active file in navigation
file-recovery:open File recovery: Open saved snapshots –
global-search:open Search: Search in all files Ctrl+Shift+F
graph:animate Graph view: Start graph timelapse animation
graph:open Graph view: Open graph view Ctrl+G
graph:open-local Graph view: Open local graph –
markdown-importer:open Format converter: Open format converter
markdown:toggle-preview Toggle reading view Ctrl+E
note-composer:extract?heading Note composer: Extract this heading... –
note-composer:merge-file Note composer: Merge current file with another file... –
note-composer:split-file Note composer: Extract current selection... –
open-with-default-app:open Open in default app –
open-with-default-app:show Show in system explorer –
outgoing-links:open Outgoing Links: Show outgoing links pane
outgoing-links:open-for?current Outgoing Links: Open outgoing links for the current file –
switcher:open Quick switcher: Open quick switcher Ctrl+O
theme:use-dark Use dark mode –
theme:use-light Use light mode –
window:toggle-always-on?top Toggle window always on top –
workspace:close Close active pane Ctrl+W
workspace:close-others Close all other panes –
workspace:copy-path Copy file path –
workspace:copy-url Copy Obsidian URL –
workspace:edit-file-title Edit file title F2
workspace:export-pdf Export to PDF –
workspace:move-to-new?window Move current pane to new window –
workspace:open-in-new?window Open current pane in new window –
workspace:split-horizontal Split horizontally –
workspace:split-vertical Split vertically –
workspace:toggle-pin Toggle pin –
workspace:undo-close-pane Undo close pane Ctrl+Shift+T

2022-07-24 obsidian , obsidain-plugin , obsidian-vim , obsidian-vimrc

记一次 iPhone 13 初始化设置 时隔 6 年我又转向了 iOS

大概 6,7 年前入手了 iPhone 7 ,当时第一次接触 iOS,当时的 iPhone 还有圆圆的 Home 键,还有指纹解锁。但如今的 iPhone 长了刘海,去掉了指纹解锁,增加了面容解锁,一样的 iOS 但确实有了一些变化。时隔 6 年之后,我又一次用回了 iOS,上个月 618 的时候买了一个最低配的 iPhone 13。在 iPhone 7 之后,我一直使用 OnePlus 7 Pro 至今,OnePlus 7 Pro 至今为止依然非常好的可以满足日常的工作生活,除了电池耐用性下降了之外。因为 OnePlus 7 Pro 还可以日常使用,所以重担不会落到 iPhone 13 上,128G 也够用了。

为何放弃了 OnePlus

OnePlus 的没落,自从卖身给了 OPPO,以及宣布了 Oxygen OS 和 OPPO 系统的合并,就断去了我再购买 OnePlus 的欲望,虽然这两年里面一加 7 Pro 的系统还在更新,日常的修复补丁还是会在推送,但一个不再维护的系统实在无法让人安心地继续使用下去。在 YouTube 也已经非常多人开始质疑 OnePlus,包括 MKBHDLinus ,虽然我没有遇到 Linus 视频中那么诡异的 BUG,但这么多年的使用中确实还是遇到过几次系统无响应的时候(有一次甚至是因为对 SD 卡读写频繁,而导致整个系统卡死的情况,因为使用 Syncthing 在局域网同步,直接以最高速度写 SD 卡导致)

Android 阵营的其他厂商,要么是在大陆水土不服的 Pixel,要么就是定价策略异常诡异的三星,而国内的华为,小米,OPPO,这些非常本地化的 OS,如果连浏览器关键字都要审查的系统,我是不敢用的。所以要不就是买小米刷欧版系统,要么就是直接用 Oxgyen OS。而 MIUI 系统,虽然用起来也能用,但就是在某些细节方面总会遇到一些不明不白的问题,就我周围人的使用经验来看,出现过相册选择不按照更新倒序排列,以至于发一个最新的照片需要翻页很久的情况;再比如系统粘贴板在某些应用中就是会失效,比如在微信中复制的内容,在淘宝中无法粘贴;再比如这个 下拉通知栏 中的音乐播放器,

miui notification music play

这个这么明显的设计问题,让我这个强迫症患者始终无法接受。

MIUI 这些问题虽然都不大吧,但总是会让我不开心。而我对国内厂商那种堆砌硬件而完全不顾外观设计的行为也非常不满意,为了画质上一点点的提升,而让整个后备突出一大块的摄像头设计,是完全看不下去的。

xiaomi ultra 11

不过还好,每年出的机型层出不穷,至少还有一些没有那么激进。小米 12 就还可以。

xiaomi 12

原本这一节的标题起的是「为何离开 Android 阵营」,但我想一想其实我是选择了放弃 OnePlus,Android 目前还是无法离开的,即使选择了 iPhone,但还是会很长一段时间内还依然在这个地方用到 Android,电子墨水屏的 Boox Note 2 就还是 Android 系统。

为何切换到了 iOS

过去几年里面,我已经把我产生的数据和特定的操作系统隔离了,我可以非常快速地迁移到另外一个平台而不用担心数据安全的问题。而这些年的发展又使得两个系统的操作习惯越来越贴近,我使用的大部分的应用,如果去掉状态栏和底部导航,几乎是没有办法区分是运行在 Android 还是 iOS 的。所以我还是可以无痛的切换到 iOS,登录系统账号,然后在 Mail 中登录 Google 账号,通讯录,邮件等等都回来了。装上 Bitwarden,装上应用登录账号,基本上立马就能上手使用。

原本我是想在这里提一下 iOS 的稳定性和易用性的,然而我想起了我当时为什么弃用 iPhone 7,就是因为更新系统之后不知为何应用总是会 闪退 ,重置系统,删除账号等等很多方法都试过无果。故放弃。我对 iOS 的态度一直是观望态度,所以如果是日常使用的机器,我只会升级稳定版本。并且会在推送更新很久一段时间之后再升级。

应用选择心路历程

今天早上翻看当时 那篇记录 ,很有趣的是,里面提到了应用的迁移,到 2022 年,我几乎把当时用的应用全部都替换了一遍:

除了 Google Photos 还继续在使用,但也仅作为备份中的一份存在,原始文档还是会备份到 NAS 中。

设置

下面按照 Settings 中的顺序记录一下设置。

Notifications Scheduled Summary

设定通知摘要,现在的应用有些时候会发送大量无效的通知,当然这个时候我就会选择关闭通知,但是也有一些应用通知介于非常有用和不需要那么即时去处理的,那么就可以使用 iOS 这个 Scheduled Summary (定时推送通知摘要)功能,打开这个功能之后 iOS 会收纳非紧急通知,在方便的时候以摘要形式接收。

Turn on Headphone Safety

在 Sounds & Haptics -> Headphone Safety 中打开耳机通知和降低高音量。在嘈杂的环境中降低声音的分贝保护听力。

Turn off background App refresh

在 General -> Backgroud App Refresh 中根据应用关闭后台刷新,节省电量。

Turn off Tracking

在 Privacy -> Tracking ,关闭请求跟踪。

App 无法跟踪使用痕迹。

Turn off Apple Advertising

在 Privacy -> Apple Advertising 关闭 Apple 个性化广告。这个只是减少了 Apple 推送和用户相关的广告,但是 Apple 在能推送广告的时候还是会推送的。

Back Tap

在 Settings-> Accessibility -> Touch -> Back Tap 中可以设置双击或三击 iPhone 后备执行的动作。这里面有丰富的动作可以设置,比如打开通知栏,打开相机,截图,设置静音,锁定屏幕。

我个人的设定

  • 双击:通知栏
  • 三击:打开相机

设置小鹤双拼

在输入法中选择双拼方案,小鹤双拼

Bitwarden

安装的第一个应用,密码管理器。有了他才能在之后的应用登录的时候非常顺畅。


2022-07-22 iphone , ios , review , apple

法国大革命前夕的舆论与谣言 读书笔记

怎么知道的这一本书

在疫情的初期,我非常厌恶一个词「辟谣」,原本这是一个非常正面的词语,用「正确」的事实来反驳谣言。而事实是,大量使用这个词的行政机构,把「辟谣」作为了一个收束话语权的工具,造成了社会只有一家之言。而这一家之言在大部分的情况下,也并不是事实。这就造成了社会上大量民众认知的失调。

至今为止,当我听到上面的这一段播报的时候也还是会不寒而栗。

当我不断被「谣言」,「辟谣」这些词汇轰炸的时候,在豆瓣上刚好看到了这一本叫做《法国大革命前夕的舆论与谣言》的书,很少有书能够在名字上如此贴近现实,就把他加入了待看列表。

什么是谣言

什么是谣言?英文是 rumour,牛津词典的解释是:

a piece of information, or a story, that people talk about, but that may not be true.

这里可以看到 may not be true,当然谣言是没有事实依据的传闻,但谣言之所以是谣言,是人们并没有足够的事实来佐证自己,只能道听途说,这其中必然可能产生错误,但禁止谣言,甚至禁止民众出声,那便是不对的。

[[密尔]] 在 [[论自由]] 中对压制思想和言论自由有如下的探讨,大致可以分成三种情况:

  • 被压制的言论可能是一个正确的意见,那么人类就失去了一个获得真理的机会
  • 被压制的可能是一个完全错误、荒谬的意见,如此,人类也可能失去一个机会,即从真理和错误冲突中产生出对于真理的更加清楚的认识和印象
  • 大部分情况下,被压制的言论可能部分是真理,部分是谬误,压制者所持有的观点也部分真理,部分错误,如此,压制自由就会导致既丧失获得真理的机会,又失去在错误冲突中完善真理的机会

法国学者让·诺埃尔•卡普费雷对谣言的论述可以帮助我们思考谣言的根本性质。

  • 由于害怕谣言而控制言论,正是产生谣言的重要根源之一;
  • 你可能不会相信谣言,但谣言会使你产生怀疑;
  • “虚假”的谣言是有根据的谣言必须付出的代价;
  • 谣言是不受控制的,因而意味着有可能接近秘密和找到被掩盖的事实;

在《谣言:世界最古老的传媒》一书中,作者提出,只有不受监控、约束和强迫的信息交流才是真实的交流,哪怕其可靠性会受到影响。1

关于书名

在看到澎湃的这一篇 文章 ,我才知道我被这个中文书名翻译给误导了。原名是「Dire et mal dire: L’opinion Publique au XVIIIe Siècle」,翻译成 18 世纪的舆论是比较准确。澎湃进一步补充了,这一本书不是一本揭示舆论和谣言造成法国大革命的书,二者之间并不是简单的因果关系。

关于作者

阿莱特·法尔热从事法国社会史研究,关注 18 世纪法国民众身份,两性关系和历史书写等问题。

几句话总结书的内容

作者通过法国革命前(18 实际)的大量舆论资料(编年史、报刊、回忆录、警方笔录、大量的手写新闻,还有巴士底狱的档案),为我们勾画了革命前夕法国的舆论背景,为我们了解法国大革命的起源具有重大参考价值。

整本书分为三个部分,第一部分整理了日记、报纸和警方记录;第二部分分析了谣言的形式和动机;第三部分则是梳理了在 1661 年到 1775 年之前反对国王的言论和巴士底狱的相关档案。

作者通过翔实的资料发现在 18 世纪中叶,巴黎民众在舆论和谣言的环境中逐渐发展起对公共政治的关心,以及对表达意见和观点的权力的渴望。

启发或想法

疫情一晃已经三年过去了,当前国内的舆论环境只能说比疫情前更糟糕,每当有「大事」发生再听不到从各个角度发出的声音,徐州八孩被铁链所在家中的悲剧从发生到消沉,很难相信竟然只有官方的通告,竟然没有一家媒体去报道她的近况;唐山被打女孩,那家火锅店主,竟然连谣言都已经不存在。在 18 世纪人们尚能通过手抄新闻的方式来传播信息,而如今自诩为信息时代的我们,甚至连关键字都无法发出。

就像作者在书中所写的那样,在「在这些舆论和谣言中,人民开始有了一种意识,了解政治的要求是合法的,对政治的知情权和批判权是必要的(284 页)」,尤其在涉及到公共事务时,人们不断地提出诉求,他们认为说话不仅仅是他们的能力,更应该是一项亟待确立的合法权利。

谁应该看这本书

  • 所有人
  1. 卡普费雷《谣言:世界最古老的传媒》,郑若麟译,上海人民出版社,2008 年 12 月 


2022-07-21 reading , reading-2022 , french-revolution , rumour

使用 glab 提交 Merge Request

glab 是一款使用 Go 语言实现的和 GitLab 实例交互的命令行工具。

之前是在 GitHub 上开发,但在 2022 年 11 月 22 之后,被 GitLab 官方采用,变成了官方支持的 cli 工具。

Installation

macOS & Linux 使用 Homebrew:

brew install glab

config

配置文件的地址在本地 ~/.config/glab-cli/

❯ cat .config/glab-cli/config.yml
# What protocol to use when performing git operations. Supported values: ssh, https
git_protocol: https
# What editor glab should run when creating issues, merge requests, etc.  This is a global config that cannot be overridden by hostname.
editor:
# What browser glab should run when opening links. This is a global config that cannot be overridden by hostname.
browser:
# Set your desired markdown renderer style. Available options are [dark, light, notty] or set a custom style. Refer to https://github.com/charmbracelet/glamour#styles
glamour_style: dark
# Allow glab to automatically check for updates and notify you when there are new updates
check_update: false
# Whether or not to display hyperlink escapes when listing things like issues or MRs
display_hyperlinks: false
# configuration specific for gitlab instances
hosts:
    gitlab.com:
        # What protocol to use to access the api endpoint. Supported values: http, https
        api_protocol: https
        # Configure host for api endpoint, defaults to the host itself
        api_host: gitlab.com
        # Your GitLab access token. Get an access token at https://gitlab.com/-/profile/personal_access_tokens
        token:
# Default GitLab hostname to use
    gitlab_host:
      token: glpxxx
      apt_host: gitlab_host
      git_protocol: https
      api_protocol: https
      user: gitlab_username
host: gitlab.com

附加填充里面的 token 等信息即可。

环境变量

GITLAB_URL=
# or GITLAB_HOST=
GITLAB_TOKEN=

zsh completion

glab completion -s zsh > /path/to/zsh/completion

可以通过 echo $FPATH 来查看本机 Zsh 的 completion 文件路径。

merge requests

创建 Merge Request:

glab mr create -a username -t "fix something"
glab mr create --autofill --labels bugfix
glab mr create --squash-before-merge --remove-source-branch -a username -t "feat: message"

合并

glab mr merge 123
glab mr note -m "needs to do before it can be merged" branch-foo

同意:

glab mr approve {id | branch} [flags]

glab mr approve 234
glab mr approve 234 456
glab mr approve branch-1
glab mr approve branch-1 branch-2

reference

[[2019-06-20-gitlab-cli-merge-request]]


2022-07-19 gitlab , git , cli , gitlab-cli , golang

Netdata outbound_packets_dropped_ratio 告警

一直使用 Netdata 来作为 VPS 的监控,配合 Netdata Cloud 来作为监控面板体验一直都不错。不过最近有一台机器经常发送邮件告警:

outbound_packets_dropped_ratio

看这个告警一头雾水,虽然每个词都懂,但就是不知道表示的什么含义。所以搜罗各种资料学习一下。

什么是 outbound packets dropped ratio

详细的解释 Netdata 也给了出来:

Details: ratio of outbound dropped packets for the network interface venet0 over the last 10 minutes

过去 10 分钟内网卡 venet0 出站的流量丢包率。

那具体什么是 dropped packets 呢?在 Linux 下有很多原因会出现丢包,有可能是网络不稳提,或者网络拥堵,或者应用无法处理负载。

Linux 下显示网络接口的 dropped packet

❯ sudo netstat -i
Kernel Interface table
Iface      MTU    RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
br-c834d  1500  7024713      0      0 0       5439423      0      0      0 BMU
br-f28aa  1500   446015      0      0 0       7656772      0      0      0 BMRU
br-f50ea  1500  5779300      0      0 0       6093954      0      0      0 BMRU
docker0   1500        0      0      0 0             0      0      0      0 BMU
lo       65536 38808638      0      0 0      38808638      0      0      0 LRU
venet0    1500 78213871      0      0 0      114697804      0  25737      0 BOPRU
venet0:0  1500      - no statistics available -                        BOPRU
vethd37c  1500   151555      0      0 0        209478      0      0      0 BMRU
vethe8b7  1500     8254      0      0 0        134561      0      0      0 BMRU

可以看到图中 venet0 这块网卡在 TX-DRP 上确实是有一定的丢包。

显示网卡的统计信息:

netstat -s
# 显示 tcp
netstat -s -t
# 显示 udp
netstat -s -u

netstat -s 的结果

Ip:
    Forwarding: 1          //开启转发
    31 total packets received    //总收包数
    0 forwarded            //转发包数
    0 incoming packets discarded  //接收丢包数
    25 incoming packets delivered  //接收的数据包数
    15 requests sent out      //发出的数据包数
Icmp:
    0 ICMP messages received    //收到的ICMP包数
    0 input ICMP message failed    //收到ICMP失败数
    ICMP input histogram:
    0 ICMP messages sent      //ICMP发送数
    0 ICMP messages failed      //ICMP失败数
    ICMP output histogram:
Tcp:
    0 active connection openings  //主动连接数
    0 passive connection openings  //被动连接数
    11 failed connection attempts  //失败连接尝试数
    0 connection resets received  //接收的连接重置数
    0 connections established    //建立连接数
    25 segments received      //已接收报文数
    21 segments sent out      //已发送报文数
    4 segments retransmitted    //重传报文数
    0 bad segments received      //错误报文数
    0 resets sent          //发出的连接重置数
Udp:
    0 packets received
    ...
TcpExt:
    11 resets received for embryonic SYN_RECV sockets  //半连接重置数
    0 packet headers predicted
    TCPTimeouts: 7    //超时数
    TCPSynRetrans: 4  //SYN重传数

或者可以使用 ip 命令:

❯ ip -s link show venet0
2: venet0: <BROADCAST,POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN mode DEFAULT group default 
    link/void 
    RX: bytes  packets  errors  dropped overrun mcast   
    30619319736 78217051 0       0       0       0       
    TX: bytes  packets  errors  dropped carrier collsns 
    32292008558 114701118 0       25738   0       0       

Why does linux drop packets?

为了找出 Linux 服务器为什么 drop packets 可以借助 dropwatch。这个工具可以用来诊断 Linux networking stack 的问题,主要是查看协议栈丢包问题。

dropwatch

安装必要的工具:

sudo apt-get install libpcap-dev libnl-3-dev libnl-genl-3-dev binutils-dev libreadline6-dev autoconf libtool pkg-config build-essential

安装完之后执行 libtoolize,这会拷贝,连接必要的脚本,包括 ltmain.sh

然后手动编译:

git clone https://github.com/nhorman/dropwatch
cd dropwatch
./autogen.sh
./configure
make
make install

如何修改告警策略

因为我是用 docker 安装,所以需要进入 netdata 容器:

docker exec -it netdata /bin/sh

然后执行:

/etc/netdata/edit-config health.d/net.conf

其中的第 107 行即可。

reference


2022-07-13 netdata , monitor , vps , network

工程代码挑战网站 CodeWars 使用体验

CodeWars 是一个面向工程的代码挑战网站。不同于 [[LeetCode]] 侧重于考察算法,CodeWars 更注重与工程代码,提供了基础的单元测试,以及不同语言的实现。

相较于 LeetCode CodeWars 上面的问题相对比较直接,有些甚至可以用来学习一些编程语言的特性。和 LeetCode 一样带有讨论版,可以通过讨论版来学习。

codewars

适合的场景

  • 学习新一门新语言,通过完成题目来熟悉基础的语法
  • 想通过解题来了解语言的特性,比如 Java 中 stream

CodeWars 中也包含一些基础的算法,随着 Rank 越来越高也会有比较难的题目。

不同的模式

在注册进入 CodeWars 之后,会让用户选择不同的模式。

  • Fundamentals
  • Rank Up
  • Practice and Repeat
  • Beta
  • Random

基础,升级,练习,Beta,随机。可以根据自己的需求选择。

总结

如果看完上面的介绍你觉得 CodeWars 不错的话,可以点击 这里 来注册。如果你觉得又可以分享的解题思路,也可以点个 关注 一起来讨论。


2022-07-12 codewars , leetcode , coding , programming

Eu.org 免费域名申请

eu.org 是欧盟组织下面的域名,EU 代表欧盟,Paul Mockapetris 在 1996 年的 9-10 月份创建了这个域名的 DNS 服务器。现在对个人和组织是免费注册的。

“EU.org, free domain names since 1996”。

eu.org 是 Google 认可的顶级域名。

优点:

  1. 历史悠久;
  2. 支持 NS 记录,意味着支持所有域名记录;
  3. 稳定,可长期使用;
  4. 没有任何限制

缺点:

eu.org 在国内使用 http 会被被强行重置,配合 HTTPS 才可正常访问。

注册账号

申请页面 https://nic.eu.org/arf/ 注册账号,验证邮箱。

申请域名

点击 New Domain 申请域名。

  • 输入想要注册的域名,包括后缀
  • 填写地址
  • 需要提前添加 DNS 服务器,需要把准备申请的域名添加

在申请域名的时候需要提前填写 DNS 信息,但是 Cloudflare 不能提前添加未注册的域名,所以不能用 Cloudflare。

这里可以使用:

  • https://dns.he.net/
  • dns.com
  • dnspod

Hurricane Electric Hosted DNS(HE) NS Records:

  • ns1.he.net
  • ns2.he.net
  • ns3.he.net
  • ns4.he.net
  • ns5.he.net

DNSPOD 的 NS Record 一般都是 XXX.dnspod.com

之后 EU.org 会开始验证 NS 记录。如果没有问题最后的日志会是 done

---- Servers and domain names check

Getting IP for PHIL.NS.CLOUDFLARE.COM: 108.162.193.137 172.64.33.137 173.245.59.137
Getting IP for PHIL.NS.CLOUDFLARE.COM: 2803:f800:50::6ca2:c189 2606:4700:58::adf5:3b89 2a06:98c1:50::ac40:2189
Getting IP for VERA.NS.CLOUDFLARE.COM: 172.64.32.147 108.162.192.147 173.245.58.147
Getting IP for VERA.NS.CLOUDFLARE.COM: 2803:f800:50::6ca2:c093 2a06:98c1:50::ac40:2093 2606:4700:50::adf5:3a93


No error, storing for validation...
Saved as request 202303xxxxxxxx-arf-3xxxx

Done

这个过程的时间不确定,可能会是 1 天,也可能好几个星期,最后注册邮箱中会收到 EU.org 发过来的邮件,标题一般是 request [20210906172103-arf-xxxx] (domain test.EU.ORG) accepted,这表示域名注册成功了。

中途遇到的问题

Eu.org 在验证 NS 的过程中可能会出现如下错误:

SOA from NS1.HE.NET at 216.218.130.2: Error: Answer not authoritative (148.835 ms)

这个时候注意在前面选项 Name Servers 中选择 server names 单选项。

将 eu.org 域名添加到 Cloudflare

当 eu.org 域名申请完毕,可以将域名添加到 Cloudflare 管理。

首先需要在 eu.org 管理后台中修改域名的 nameservers 修改成 Cloudflare 的 NS 地址。

通常是:

  • phil.ns.cloudflare.com
  • vera.ns.cloudflare.com

这两个地址可以在 Cloudflare 后台添加域名之后获得。

在 Cloudflare 添加新申请的域名,如果添加的时候提示:

eu.org is not a registered domain

或者提示这个域名没有注册,就等待一下 EU.org 刷新 WHOIS,然后等待一会儿再尝试添加。


2022-07-11 eu-org , domain , free-domain

利率史 读书笔记

怎么知道的这一本书

在看上一本 [[金融的本质]] 时突然对利率的变动比较好奇,所以就发现这一本《利率史》,一本关于利率变化历史的书籍。

在 [[金融的本质]] 一书中可以看到美联储可以通过影响隔夜拆借利率进而来影响整体市场的利率,从而通过利率来调控宏观经济。为什么利率对整个经济有如此巨大的影响?美联储加息成为了 2022 年全球经济的关键字。而国内房地产市场萧条,央行为什么通过调整房贷利率进而进一步影响房地产市场?这些问题都是我想通过这一本书想要了解的。

关于作者

本书的作者是[[悉尼 霍默]],债券经纪人,职业早期创办了自己的债券公司,开了固定收益分析的先河。霍默率先应用了相对价值分析、收益曲线以及金融世界与经济的关系等分析工具。他是使用金融市场资金流动分析的第一人,远远早于美联储正式采用这种分析手段。1961 年来到所罗门兄弟公司,后组建并管理第一个严格局限于固定收益的研究部门。霍默首次提出将债券和其利息剥离,分别销售。

作者于 1983 年去世,本书的第四版由理查德·西勒修订,在第三版的基础上新增了 1990 年到 2005 年的世界。

几句话总结书的内容

就如书名所述,这是一本关于利率历史的书。作者通过对古代(史前史,美索不达米亚,希腊,罗马),中世纪,文艺复兴,以及近现代近 4000 年的经济史来叙述全世界各个地区的利率变化,进而去观察地区经济,以及民族兴盛和衰亡的历史。

古代

公元前 1800 年,汉漠拉比法典就已经出现了对债务人和债权人相关的法律。 公元 600 年,希腊的索伦法典也对个人债务做出了规定,取消了利率的限制,豁免了过度的债务,以及取消个人劳役偿债。

公元前 450 年,罗马的《十二铜表法》也对信贷有所规定,贷款的利息被限制在每年不超过 8.333%,高于法定上限的利息将被处以 4 倍的赔偿。允许个人劳役偿债,但是得保证奴隶的健康。

公元 800 年《查理曼法典》,禁止一切贷款。

宗教改革之后,现代欧洲对收取利息合法化,利率成为了经济学家、金融家和政治家讨论的焦点,是放任自由还是国家控制。最终英国走了索伦的路子,废除了对利率的所有法律限制,而美国各州则在自己的高利贷法中确定了固定的利率上限,继承了汉谟拉比和古罗马的法律传统。

最高利率,伯林的 10000% ,最低纽约的 0.01% 。

20 世纪的美国 1900~1945

20 世纪前 90 年,多事之秋,四大政治事件

  • 1914~1918 第一次世界大战
  • 1933~1938 新政
  • 1939~1945 第二次世界大战
  • 1974~1989 冷战

三大经济事件:

  • 1914~1917 美联储的创建
  • 1929~1939 经济大萧条
  • 1965 年开始的大幅度通货膨胀

这些事件对美国经济和利率产生了巨大影响。

利率是各国政府最直接影响的价格之一,历史的最终裁决会将近几十年利率幅震荡的一部分原因与政治因素联系在一起。

1917 年开始美联储采用欧洲已经使用很久的方式来影响利率,从而根本上改变了美国货币市场结构。通过集中银行储备金、设立最后贷款人机制,该立法终结了短期利率的无规律上涨(过去,只要出现急需贷款额超过资金供应量,就会出现短期暴涨)。短期利率仍然随着信贷供求关系的变化而起伏,但是有了封顶保底。建立美联储主要是希望通过短期商业借贷来提供一种灵活货币以服务于贸易。然而第一次世界大战不久就爆发,巨额的政府新债改变了货币市场,提升了美联储的政治责任。在接下来的几十年中,政府债务取代了银行和美联储银行投资组合中的商业票据的地位。新政、大萧条和第二次世界大战强化了这种趋势。并且利用低利率来促进就业,已经成为了一种政治目标。1921 年以前,美国的利率通常平均远远高于长期债券收益率,而在 1921 年之后,短期利率通常平均低于长期债券的收益率。

20 世纪的美国 1946~1990

通胀在 1974 年达到两位数,OPEC 组织在 1973 年末实施石油价格急剧上涨措施,通胀蔓延到自由世界大部分地区。1974,1975 年的衰退降低里通胀率,但是 1979~1981 年通胀再次席卷而来,再次回到两位数,1979 年又一次石油价格飙升,物价飞涨,1980 年代的衰退对通胀几乎没有影响。利率上升到了美国历史上的最高水平,导致了 1981,1982 年的严重衰退,之后,通胀率在 80 年代后几年减弱到 3~5%。利率和收益率也随之下滑。

从 1946 年到 1981 年,美国经历了历史上最长的一个债券熊市,持续 35 年。

20 世纪美国利率

四件政治大事(一战、罗斯福新政、二战以及 1989 年前的冷战)和三大经济事件(建立美联储、经济大萧条以及 1965 年开始的大幅通胀)对于美国经济及美国利率产生了尤其重大的影响

日本

1970 年以后的 20 年里,日本发展成为世界金融大国,从 20 世纪 50 年代开始到 70 年代,政府确定了几个重点发展对象,包括炼油、化工、工业机械和电子电器。高速发展阶段,日本采用豁免利息税的储蓄账户来鼓励个人大量存款。然而,日本的金融市场远不如西欧和北美发达,利率相对比较高;金融业比较分散,而不是集中的形式,利率受到管制,与其他国家的金融交易也受到控制。

70 年代中期,日本发生金融改革,浮动汇率,1973 年第一次石油危机,造成了管制型旧金融系统的紧张,经济已经发展到了规模巨大、在国际上非常重要的成都,无法在严格管制、封闭的金融系统下继续。日本在 1975 年放松了金融系统的大部分管制。日本货币市场和债券市场得以发展,伴随日本股市的发展,越来越向国外开放。尤其是 1975 年政府通过发行债券进行了大规模的融资以弥补财政赤字。

90 年代开始,日本的金融自由完善了许多,日本已经不再是一个高利率的国家。而事实上 80 年代,日本就成为了利率最低的国家之一。

启发或想法

利率是什么

在谈论所有其他的概念之前,我们先来回答一个问题,什么是利率?

利率的英文叫做 interest rate, 是利息率的简称。在 Longman 词典中的解释是:

the percentage amount charged by a bank etc when you borrow money, or paid to you by a bank when you keep money in an account there

新闻中常常提到美联储加息或降息,很多人都会误认为美联储可以直接决定利率,而事实是美联储只能通过控制货币供给量来决定短期利率。但是影响经济最重要的是实际利率或者称为通胀调整利率(市场利率减去通胀率)。实际利率才是对资本决策最有实质性影响的。美联储影响长期实际利率的能力是间接的。实际利率受到经济因素影响,包括经济前景这些是不受美联储控制的。

作者试图通过漫漫历史长河的利率变化来给读者展示国家和文明的兴衰,作者认为在一个自由市场条件下,长期利率的趋势可以帮助分析这个国家的经济和政治状况。

利率如何影响经济

几乎在所有的教科书或百科上面都会提到,几乎所有的国家都会将利率作为调节宏观经济的重要工具,当经济过热,通胀上升的时候就提高利率,收紧信贷。当通胀得到控制,便把利率适当的调低。

缺点

就如作者所说,本书的目的并不是为了探讨利率波动对于社会和经济方面带来的后果,而只是要搜寻、记录并分析多个国家数世纪中通行利率。

在我个人看来本书的一大优点同样也是其最大的缺点,就是数据太翔实,大面积的原始数据,以至于欠缺了作者更深入的思考和总结。并且这些数据大大影响了阅读体验,不过如果是作为一本参考书来说,倒是非常不错的资料。

谁应该看这本书

  • 这本书更像是一本工具参考书,作者用大量翔实的数据介绍了各个时期各个地区的利率,非常适合页内人士按需查阅
  • 想了解利率对经济产生影响的人
  • 专业投资债券的人

印象深刻的 Quotes


2022-07-10 reading , reading-2022 , interest-rate , rate-history

Elasticsearch 导入数据

Elasticsearch 既然作为一个全文检索引擎,那么自然需要将数据导入,让 Elasticsearch 去索引。

Elasticsearch(后简写为 ES) 的基本单元是文档,使用 JSON 来描述。

有很多方法可以把数据导入到 ES:

  • RESTful 接口
  • Bulk API 批量导入
  • elasticsearch-dump
  • Logstash 将收集的数据导入

Prerequisite

导入数据前要了解的知识。

  • Cluster,集群,通常由多个节点组成 ES 集群
  • Index,通常称为索引,文档的属性
  • Document,文档,JSON 格式定义的数据
  • Shard,分片,索引会水平分片
  • Replicas,ES 允许用户创建索引和分片的 Replicas

RESTful 接口导入

如果数据文件比较简单,只有单层 JSON 结构,并且小于 1MB,可以使用 POST 请求直接将数据提交到 ES。

假设有数据 accounts.json

{"account_number":1,"balance":39225,"firstname":"Amber","lastname":"Duke","age":32,"gender":"M","address":"880 Holmes Lane","employer":"Pyrami","email":"[email protected]","city":"Brogan","state":"IL"}

然后可以使用如下命令导入:

curl -u admin:my_elastic_pass -H 'Content-Type: application/json' -XPOST 'http://localhost:9200/accounts/_doc/_bulk?pretty' --data-binary @accounts.json

返回:

{
  "_index" : "accounts",
  "_id" : "_bulk",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 0,
  "_primary_term" : 1
}

可以通过如下命令来查看所有索引的情况:

curl "localhost:9200/_cat/indices?v"

然后访问 Kibana,在后台就可以查询导入的内容:

kibana

Bulk

这里使用官方的样例数据:

wget https://download.elastic.co/demos/kibana/gettingstarted/accounts.zip
unzip accounts.zip
curl -XPOST 'localhost:9200/bank/account/_bulk?pretty' --data-binary @accounts.json

需要注意的是如果使用 Bulk 批量导入,那么格式需要按照:

action_and_meta_data\n
optional_source\n
action_and_meta_data\n
optional_source\n
....
action_and_meta_data\n
optional_source\n

或者可以在 Kibana 后台,点击侧边栏 Dev Tools,然后在编辑框中输入:

POST bank/_bulk
{"index":{"_id":"1"}}
{"account_number":1,"balance":39225,"firstname":"Amber","lastname":"Duke","age":32,"gender":"M","address":"880 Holmes Lane","employer":"Pyrami","email":"[email protected]","city":"Brogan","state":"IL"}
{"index":{"_id":"6"}}
{"account_number":6,"balance":5686,"firstname":"Hattie","lastname":"Bond","age":36,"gender":"M","address":"671 Bristol Street","employer":"Netagy","email":"[email protected]","city":"Dante","state":"TN"}
省略...

最后点击执行。

kibana devtool bulk import

执行成功后,可以运行 curl localhost:9200/bank/_search,如果返回值中 value 是导入的条数就表示成功了。

elasticsearch-dump

Logstash

Logstash 是开源的服务器端数据处理管道,能够同时从多个来源采集数据、转换数据,然后将数据发送到 Elasticsearch 中。Logstash 的官方文档请参见:https://www.elastic.co/guide/en/logstash/current/getting-started-with-logstash.html

reference

  • <https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html

2022-07-08 elasticsearch , kibana , import-data , csv

电子书

本站提供服务

最近文章

  • AI Shell 让 AI 在命令行下提供 Shell 命令 AI Shell 是一款在命令行下的 AI 自动补全工具,当你想要实现一个功能,敲一大段命令又记不住的时候,使用自然语言让 AI 给你生成一个可执行的命令,然后确认之后执行。
  • 最棒的 Navidrome 音乐客户端 Sonixd(Feishin) Sonixd 是一款跨平台的音乐播放器,可以使用 [[Subsonic API]],兼容 Jellyfin,[[Navidrome]],Airsonic,Airsonic-Advanced,Gonic,Astiga 等等服务端。 Sonixd 是一款跨平台的音乐播放器,可以使用 [[Subsonic API]],兼容 Jellyfin,[[Navidrome]],Airsonic,Airsonic-Advanced,Gonic,Astiga 等等服务端。
  • 中心化加密货币交易所 Gate 注册以及认证 Gate.io 是一个中心化的加密货币交易所。Gate 中文通常被称为「芝麻开门」,Gate 创立于 2013 年,前身是比特儿,是一家致力于安全、稳定的数字货币交易所,支持超过 1600 种数字货币的交易,提供超过 2700 个交易对。
  • 不重启的情况下重新加载 rTorrent 配置文件 因为我在 Screen 下使用 rTorrent,最近经常调试修改 rtorrent.rc 配置文件,所以想要找一个方法可以在不重启 rTorrent 的情况重新加载配置文件,网上调查了一下之后发现原来挺简单的。
  • Go 语言编写的网络穿透工具 chisel chisel 是一个在 HTTP 协议上的 TCP/UDP 隧道,使用 Go 语言编写,10.9 K 星星。