阿加莎・克里斯蒂自传

怎么知道的这一本书

虽然很早就已经知道阿加莎·克里斯蒂,也曾经看过一些她的作品,比如《无人生还》、《尼罗河上的惨案》这类非常脍炙人口的作品,但是对其人一直不是非常了解,直到去年偶然间在路上听了一期关于阿加莎·克里斯蒂的播客,直到讲到她的生平,经历两次世界大战,有传奇的婚姻,才逐渐对她产生了兴趣。她是有怎么样的人生经历才能够塑造出如此精彩的虚构人物?她又是有怎么样的新奇的遭遇才能构造出如此出人意料的作案手法?

关于作者

阿加莎出生于 1890 年的伦敦德文郡托基,是英国著名的侦探小说家,剧作家。她在第一次世界大战期间志愿成为了一名护工,战争结束之后创作了第一步侦探小说《斯泰尔斯庄园奇案》,几经周折之后在 1920 年出版,从此开启了克里斯蒂传奇而辉煌的创作生涯。阿加莎克里斯蒂创作生涯持续五十余年,一共创作了八十部小说,作品畅销全世界,被称为继柯南·道尔之后最伟大的侦探小说家。

几句话总结书的内容

全书一共分成了十一个章节,涵盖了阿加莎从小成长,到青年,成熟直至垂暮的所有人生故事。阿加莎在写自传时已经有 60 岁的高龄,写了 15 年才最终定稿。这和她自己在写作侦探小说时文思泉涌,连续写作几天成一本书的写作方式完全不同。但也正是因为如此耗时的写作才使得这部自传内容翔实。

启发或想法

关于战争

关于第一次世界大战、第二次世界大战,我更多的是在影视作品中通过视觉化的方式看到,很少有机会通过一手的文字信息去了解那些年真正在发生的事情。就像大部分人看到的战争一样,突然之间就爆发了,而这也影响到了青年时期的阿加莎克里斯蒂。

关于婚姻

阿加莎的一生中经历了两次婚姻,在 1926 年母亲去世的那一年,第一段婚姻因为丈夫的婚外情而结束,这也使得阿加莎曾经一度离家出走失踪。但也正是因为命运的多舛,才让阿加莎独自一人向东旅行,在途中遇到了第二任丈夫。

关于自传

过去很长一段时间我都不喜欢读名人的自传,有意地避开了很多,但是最近几年却越来越喜欢读一些自传,读过富兰克林的自传,读过微软 CEO 萨提亚 纳德拉,读过 Linus Torvalds 的自传《Just for Fun》,也读了巴菲特的自传,过去我常常想去读自传,不如去读这些人物的其他专题性作品,但读过之后才渐渐地意识到这些名人的成就也好,思想也好,都脱离不开那个时代,那个环境,他们在生活中的遭遇,以及他们人生的转折都只能在自传中窥见。而这些名人的形象,也只有我读完全书之后才能在我的脑海中变得立体,而平时他们只能是维基百科上的一副二维照片,而通常也只是某个年龄拍下的,而我读完这些自传记住的是十几岁离家出走到处漂泊的富兰克林,记住的是因为自己的兴趣而发布在 FTP 上 Linux 内核的青年时期的 Linux,记住的是那个从印度移民美国拥抱文化开放、照顾患病孩子父亲形象的纳德拉。而在这一部阿加莎的自传中,我能看到那个幽默、命运坎坷的阿加莎,她人生的每一次转折都在塑造她对世界的认识,也正是她见到的每个人,遭遇的每一个时代变化,才让她能在战争期间学到药剂知识,才能让她在离婚之后去周游世界,才能让她为了生计几十年写作。

谁应该看这本书

对阿加莎·克里斯蒂的作品感兴趣的人

印象深刻的句子

  • 人生中最大的错误莫过于所见所闻不得其时。大多数人是在学校里学习莎士比亚的,生生把名著毁了。
  • 构思一部小说的过程是一种奇怪的感受,在六七年之久的时间里,你心里始终明白,自己终有一天会把它写出来。
  • 我喜欢活着,我有时会绝望无比,会痛苦难耐,会饱受忧愁的折磨。可是当一切经历过去之后,我仍然很清楚地认识到,好好活着就是最了不起的事情。

2023-01-12 autobiography , reading-2023 , reading-2023q1

J3455 主板无法使用 PCIe 扩展 SATA 启动系统解决

把自己之前用 J3455-itx 主板组的 NAS 搬回了,但突然无法启动,这里就记录一下排错的过程。

最早启动的时候,无法进入系统,启动日志里面报错:

ata 7: COMRESET failed (errno=16)

开始怀疑是搬家的时候硬盘坏了。所以拆开主机,把其中的第四块硬盘 SATA 线拔掉了。重新启动主机,发现竟然能进入系统了。并且用 fdisk 查看,所有的其他硬盘都没有问题。

j3455 itx sata

这个时候我仔细的检查了一下 SATA 的连线,J3455-itx 这块主板只有 4 个 SATA 口,但是我使用 PCIe 扩展了 2 个 SATA 口,一共接了 5 块硬盘,1 块 SSD 安装了系统,4 块 HDD 机械硬盘。

为了腾位置给 SSD,所以我将一块 HDD 的 SATA 线连接到了扩展卡的 SATA 接口,就是将这个接口拔掉,才能够进入系统。这个时候我开始怀疑是不是扩展卡在搬运的过程中损坏了。于是加紧在京东又下单了一个全新的 PCIe 转 SATA 扩展卡。

今天终于把全新的扩展卡安装上来,但是发现这一块机械硬盘还是无法读取。一度又让我怀疑真的是磁盘坏了,为了排除这个嫌疑,我拿出了之前买过的 SATA 转 USB 的设备,拿了 Linux Mint 发现能正常读取这一块硬盘,因为四块机械硬盘是通过 [[MergerFS]] 合并成一块逻辑硬盘使用的,所以这一块硬盘上也能读取到部分的数据,证明机械硬盘是没有问题的。

这个时候我已经排除了机械硬盘的问题,扩展卡的问题,我又在怀疑难道是 PCIe 接口坏了。这个时候我就把 SSD 拆了下来,然后把四块机械硬盘连接到了主板上的四个 SATA 接口,通过 USB 来启动 SSD,过程中我发现系统完全启动正常,并且能够在 [[Proxmox VE]] 下安装的 [[OpenMediaVault]] 下正常挂载 4 块硬盘,读写也完全没有问题。

启动系统的过程中还遇到了 soft lockup 问题,这个时候还以为是磁盘的 IO 造成的。但后来仔细想想应该是通过 USB 启动的系统在读写上存在瓶颈导致的。

soft lockup

那剩下的问题就肯定出在 PCIe 这个接口上。我又换回了之前的扩展卡,然后重新在 BIOS 中查看,调整配置。当我将 SSD 连接到扩展卡,并启动的时候 J3455-itx 主板无法找到可启动的设备,直接进入了 BIOS。

这个时候我突然想起来用 J3455 和扩展卡在 Google 搜索了一下。于是就看到了 这个帖子 其中的一句话惊醒了我。

主板 BOIS 里打开 CSM 试试

我在 BIOS 里面找到 CSM 设置,启用,然后重启系统,竟然能够从 SSD 启动了,扩展卡没有坏,硬盘没有坏,只是 BIOS 里面的一行配置变了!

什么是 CSM

CSM 全称是 Compatibility Support Module,是 BIOS 用来启动旧版操作系统和其他旧软件的一种特性。可以让 UEFI BIOS 兼容 Legacy+MBR 启动模式。

我已经忘记了之前安装 Proxmox VE 的时候用的什么引导了,但启用了 CSM 的时候就能够找到磁盘上的引导程序,并成功启动系统了。

至此整个 Debug 的过程才算结束。没想到的是新年假期竟然花了半天时间 Debug 硬件,o<(=╯□╰=)>o


2023-01-02 j3455 , itx , openmediavault , proxmox , proxmox-ve

.idea 文件夹的内容梳理

使用 JetBrains 旗下的 IDE 创建项目都会在项目的根目录中自带一个隐藏的 .idea 文件夹,每一次遇到这个文件夹的时候都会犹豫一下是否需要下面的内容全部放入到 .gitignore 文件中,大部分的时候就直接全部忽略了。现在想过来再了解一下这个文件夹下的每个文件都代表什么内容,因为有一些数据库配置,还有一些插件的临时信息都会存放在这个目录下。

.idea 文件夹存放的内容都是 JetBrains 旗下的 IDE,比如 IntelliJ 等等项目独有的配置文件。这些文件包括项目独有的 VCS mapping 或运行或调试的配置文件,还有一些用户操作相关的文件,比如用户当前打开的文件,浏览历史记录,当前的配置等。

文件夹:

  • codeStyles 文件夹,包含项目所使用的代码风格
  • dictionaries 文件夹包含用户自定义的词典,IDE 用来检查单词拼写的时候会引用,文件下的内容以用户分隔,不应该提交版本控制,除非明确知道自己想做什么
  • dataSources 文件夹,数据库连接信息,不应该提交版本控制
  • libraries 文件夹,包含一系列的 XML 文件,不应该提交到版本控制,这些文件会从项目中自动生成

文件:

  • dataSources.xml 包含 IDE 中使用 Database 的数据库连接信息
  • encodings.xml 项目编码
  • vcs.xml 文件用来记录 VCS 相关的内部信息,启用了哪一个 VCS
  • indexLayout.xml 该文件是用来记录项目外包括的文件夹的。这些文件夹可以通过 Attach Existing Folder... 来加入
  • modules.xml 基于 Gradle 或 Maven 的项目生成的信息,可以被排除,会在导入的时候自动生成
  • vcs.xml 文件用来记录 VCS 相关的内部信息,启用了哪一个 VCS
  • runConfigurations 文件夹是用来存储 shared run configurations 的。
  • indexLayout.xml 该文件是用来记录项目外包括的文件夹的。这些文件夹可以通过 Attach Existing Folder... 来加入

有一些文件应该被提交到版本控制中,而有一些是需要被排除的。个人的习惯是直接排除掉 .idea 整个目录,貌似到目前为止还没有产生任何问题。

gitignore

如果不知道要在 gitignore 中填写什么什么,我一般会用如下的方式自动产生 .gitignore:

  • 使用 IDE 自带的功能,在项目上右击,选择 New -> .ignore File ->.gitignore 文件,然后会弹出选框,选择自己的系统,语言,IDE 就会自动产生
  • https://www.gitignore.io/ 在网站中根据自己的需要,输入系统,编程语言,IDE 等等,然后会自动生成一段 .gitignore,复制粘贴即可

reference


2022-12-27 idea , jetbrain , dotfiles

Java 11 新特性学习

Java 11 在 2018 年 9 月 25 日发布。这是 Java 8 之后首个长期版本。

安装

因为我本地使用 asdf 来管理 Java 的多个版本,所以直接使用 asdf 来安装:

asdf install java adoptopenjdk-11.0.17+8
asdf global java adoptopenjdk-11.0.17+8
java -version

HTTP Client 升级

Http Client 几乎被重写,支持异步非阻塞。

包名从 jdk.incubator.http 改为 java.net.http,通过 CompleteableFutures 提供非阻塞请求。新的 HTTP Client 提供了对 HTTP/2 的支持,兼容 HTTP/1.1 ,与主流的开源库(Apache HttpClient,Jetty, OkHttp)性能相差无几。

Java 在 Reactive-Stream 的实践,广泛使用了 Java Flow API。

模拟 GET 请求:

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
      .uri(URI.create("http://openjdk.java.net/"))
      .build();
client.sendAsync(request, BodyHandlers.ofString())
      .thenApply(HttpResponse::body)
      .thenAccept(System.out::println)
      .join();

Epsilon 低开销垃圾回收器

Epsilon 目标是开发一个内存控制器,不执行任何垃圾回收,提供完全消极的 GC 实现,最大限度降低内存占用和内存吞吐延迟时间。

通过 JVM 参数 -XX:+UseEpsilonGC 来开启。

为什么要开发一个不回收内存的垃圾回收器

一些特殊的场景可以不开启垃圾回收以方便进行比如性能测试,内存压力测试等等。

简化单个源代码文件的启动方法

Java 11 可以直接运行一个单一的源码文件,Java 解释器可以直接在内存中编译,然后执行。所有的类都必须定义在同一个 Java 文件中。

这个功能特别适合想要简单了解一下 Java,写一些脚本文件的时候非常有用。

本地变量类型推断

Lambda 参数的局部变量语法

Java 10 开始就引入了 var 关键字,允许局部变量推断。

但在 Java 10 中有几个限制:

  • 只能用于局部变量
  • 声明时必须初始化
  • 不能用于方法参数
  • 不能在 Lambda 表达式中

Java 11 中允许开发者直接在 Lambda 表达式中使用 var 进行参数声明。

低开销的 Heap Profiling

Java 11 中提供了一种低开销的 Java 堆分配采样方法,能够得到堆分配的 Java 对象信息,并能够通过 JVMTI 访问堆信息。

  • 低开销,可以默认开启
  • 定义好的程序接口访问
  • 堆所有堆分配区域进行采样
  • 给出正在和未被使用的 Java 对象信息

ZGC 可伸缩低延迟垃圾收集器

ZGC 是 Z Garbage Collector ,GC 停顿时间短,不超过 10ms,能处理 T 级别堆大小。

实验阶段,只在 Linux/x64 上可用,在编译时加入参数才可以启用,并且使用时需要增加 JVM 参数。

飞行记录器

低开销的事件信息收集框架。

启用参数:

-XX:StartFlightRecording

reference


2022-12-20 java , java-11 , jdk , openjdk

《天朝的崩溃:鸦片战争再研究》读书笔记

《天朝的崩溃:鸦片战争再研究》 是茅海建教授对于鸦片战争研究的集大成之作,是系统研究鸦片战争十余年所得的成果。在阅读之前,我本以为是一部非常学术的类似论文一样的著作,然而我只阅读了一章就改变了我的观点,作者以人物为核心,将历史事件以人物为核心串联,并收集各方面的文献材料,去还原历史的本来面貌,去摆正对一个历史人物的是非判断。并且作者的笔法流畅通顺,非常易读。

怎么知道的这一本书

这本书很早就在待看列表中,不断地有人在不同的场合曾经提到过,在豆瓣的时间线看到过,在 Twitter 上看到过有人推荐。鸦片战争几乎是中国人尽皆知的近代耻辱的开始,1840 年就像是一个烙印,相信很多人都记得。但唯独很多人不知道的是鸦片战争究竟是如何爆发的,又是如何一步步战败的。我们的教科书只是让我们对鸦片战争有了一个大概的印象,但每一个细节都缺失了。这也是让我对这一本副标题为「鸦片战争再研究」的书产生兴趣的一个原因。

关于作者

[[茅海建]],我还是第一次读这位教授的书,同样看介绍,这一本《天朝的崩溃》也是茅海建教授的成名之作。茅海建是华东师范大学历史系教授、北京大学历史学系兼职教授,师从陈旭麓教授。

几句话总结书的内容

这是一本还原鸦片战争前后相关人物、相关事件的历史著作,作者以翔实的文献材料,理性中立的评价,使得鸦片战争中的道光帝、林则徐、琦善、奕山等等人物形象跃然纸上。每次读到中途放下,就像是看电视剧中途休息,意犹未尽。

启发或想法

这本是一本讲述近 200 年前清王朝和英国的战争前因后果的历史著作,却不时的让我回想起过去三年的新冠疫情,主「剿」和主「抚」和如今的清零和开放;道光皇帝的优柔寡断,坚信祖宗留下来的制度尽善尽美只是朝廷存在诸多腐败的问题和如今左右摇摆的政策变化,动辄就以腐败问题查处高官,却从来似乎不曾真正解决问题;各地大臣欺瞒,克扣军饷和如今各地防疫政策,防疫数据以及通过疫情大赚核酸检测的钱。这一系列已经发生了近 200 年的事情再一次因为病毒而重新在这片大地上演,虽然因为科技发展,生活的变化,大多数事情的发生已经改变了其面貌,以前从广州到北京的一封奏折需要一个月,现在的通信技术发展只需要几毫秒,但欺瞒的手法却如此相同,知情不报,顾左右而言他。

另外一个让我非常敬佩的是作者在文献、参考资料上的引用数量,往往看完一个章节才意识到作者的脚注竟然会多达上百个。如此翔实,具体的,从这个方面收集的材料也使得这本历史著作在学术和可信度上更加可靠。

谁应该看这本书

所有想要更进一步了解鸦片战争的人。

印象深刻的句子

  • 这里绝无意为伊里布的谎言辩护,而是指出,对促发这种谎言的体制和君主也也应当批判。
  • 道德的批判最是无情。而批判一旦上升至道德的层面,事情的细节便失去了原有的意义,至于细节之中所包含的各种信息、教训更是成了毫无用处的废物。
  • 战争的现实就是这么冷酷,丝毫也不照顾正义的一方。
  • 战争的权威性,就在于强迫对方顺从。
  • 知识给人以力量,愚昧也给人以力量,有时甚至是更大的力量。

2022-12-16 reading , reading-2022 , reading-2022q4 , 读书笔记 , 鸦片战争

editorconfig 配置文件说明

在一些开源项目的根目录中会有一些 .editorconfig 文件,看名字也能大致猜出来是编辑器的配置文件,这个文件的主要内容就是编辑器编码、缩进等等配置。

editorconfig 可以跨不同编辑器,为不同的 IDE 维护一份一直的编码风格配置文件。

样式定义举例:

[*]
end_of_line = lf
insert_final_newline = true

第一行为通配符。

文件通配符

editorconfig 中可以使用正则来匹配文件,对匹配的文件使用之后定义的配置。

比如例子中的 [*] 就表示的是匹配所有的文件。

这个通配符类似正则表达式。

  • * 匹配除 / 之外的任意
  • ** 匹配任意字符
  • ? 匹配单个字符
  • [name] 匹配指定字符
  • [!name] 匹配非指定字符
  • {s1, s2, s3} 匹配多个字符
  • {num1..num2} 匹配 num1 和 num2 之间的任意字符。

指定文件

如果要指定为 Markfile 文件设定格式:

[Makefile]
indent_style = tab

也可以指定多个文件,使用 , 分隔:

[{package.json,.travis.yml}]

指定文件类型生效

如果要匹配所有的 Python 源文件和 JavaScript 源文件可以使用:

[*.{js,py}]

指定路径

指定路径下的所有文件:

[lib/**.js]
indent_style = space
indent_size = 2

配置语法

缩进风格:

indent_stype

可选值:

  • space 空格
  • tab Tab 制表符

缩进大小:

indent_size

通常会设定 2 字符或 4 字符。

换行符号类型:

end_of_line

可以是:

  • lf 换行,Unix 和 Linux 下的换行
  • cr 回车,macOS 下的
  • crlf 回车换行,Windows 和 Dos 下

编码格式:

charset

通常会:

  • utf-8
  • utf-8-bom
  • utf-16be
  • utf-16le

文件末尾是否插入空行:

insert_final_newline

如果配置 true 则在文件末尾插入空行。

常用的例子:

# top-most EditorConfig file
root = true

# all files
[*]
indent_style = tab
indent_size = 4
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true

# .md file
[*.md]
trim_trailing_whitespace = false

所有其他的配置可以见 官方 Wiki

IDEA 配置 editorconfig

JetBrains 的 IDEA 可以安装 editorconfig 插件。

Vim 配置 editorconfig 插件

在 Vim 下使用 vim-plug 插件管理器,添加 editorconfig-vim 插件

Plug 'editorconfig/editorconfig-vim'

source .vimrc ,然后 : PlugInstall 即可。

其他编辑器可以查看 官网

reference


2022-12-10 editorconfig , editor , ide , vscode , indent , code-format

发布和制作 torrent 文件

本文主要总结和记录一下制作和发布 torrent 的过程。

制作种子文件

制作一个种子文件的方式有很多,熟悉命令行的朋友可以直接使用命令行制作,如果在 Windows,或 macOS 下的朋友也可以使用 UI 界面,或相关的工具来制作。

种子文件是用来维护和协调文件下载和分享的一种文件格式。这种文件通常包含了文件的哈希值(即校验和)、文件名和文件大小等信息,以及用于协调文件下载的若干个服务器的地址。这些服务器的地址被称为 trackers。

在 BitTorrent 协议中,trackers 用于协调客户端之间的文件分享。当一个用户想要下载文件时,他可以打开种子文件并把其中的 tracker 服务器地址提交给客户端。客户端会向这些 tracker 服务器发送请求,然后 tracker 服务器会返回一组已经下载了文件的客户端地址。客户端可以通过这些地址找到其他已经下载了文件的用户,并从他们那里获取文件。

在制作种子文件的过程中有几个概念需要提前了解一下:

  • Trackers,协调客户端之间的文件分享
  • Private,种子文件中有一个 Private 标志,文件 Private 设置为 True 则表示文件的下载和分享只能在特定的 tracker 服务器或客户端之间进行

命令行制作种子

通过命令行制作种子,可以参考 这篇文章

主要借助的命令行工具是:

  • mktorrent
  • transmission-cli 中的 transmission-create

通过界面制作种子

通过 UI 界面制作种子一般需要本地安装一个 客户端 ,比如常用的 Transmission,或 qBittorrent,等等。

这里以 Transmission 客户端为例,来演示如何制作种子文件。首先准备需要分享的文件内容,记住其所在的位置。

首先打开 Transmission,点击左上角的 + 号,创建一个 torrent 文件。

create torrent in transmission

这个时候 Transmission 会要求你选择一个文件,或者选择一个文件夹,此时选择需要分享的文件(或文件夹)。

然后 Transmission 会弹出如下的弹窗。

transmission torrent

  • Trackers 中填入服务器提供的地址。
  • Comment 中可以任意填写
  • 勾选 Private
  • 选择 Torrent File 的位置

最后点击 Create 创建。

对于另外一些客户端,可能会要求用户选择区块的大小,如果文件大小比较适中,选择 4M 或 8M 即可,如果分享的文件内容超过 TB 级别,可以适当选择 16M 或更多。

上传种子文件

制作好种子文件,下一步就是将种子文件分享出去。登录一个 PT 站点, 比如 GTK ,然后访问 发布 页面。

编写标题

按照要求,一般在标题中填写资源的英文名称。

副标题中填写中文译名。

pt title rule

获取简介

PT-Gen

pt introduction

油猴脚本:豆瓣资源下载大师

可以通过在浏览器中安装 油猴脚本:豆瓣资源下载大师 ,然后在设置中开启「电影简介生成」。

douban userscript pt gen

刷新页面,就能在词条页面中看到 movieinfo

douban movie info

复制该信息即可。

如果怕豆瓣图片的防盗链机制,可以将海报封面重新上传到稳定的图床。[[电影海报网站]]

MovieInfoGen

电影信息查询脚本 是一个专注与通过豆瓣页面生成 PT 简介信息的用户脚本。

其他

获取 mediainfo

mediainfo 的内容一般会用 quote 代码框起来,比较美观

  • 使用 ffprobe 查看 Media Info
  • 使用 MediaInfo 软件生成
  • 一般在你源文件所在的 pt 站的种子页面会有
  • 可以用 ruTorrent 获取
  • PotPlayer 仅限 Windows

使用 ruTorrent 获取 mediainfo

  • 可以用 ruTorrent 获取
    • 点击种子,然后选择文件(Files)
    • 在文件上右击获取媒体信息(Media Info)

rutorrent media info

本地 PotPlayer 获取

仅限于 Windows。本地用 PotPlayer 打开媒体文件,右击,选择属性(Ctrl+F1),然后在文件信息中,将信息复制到粘贴板。

如果发布的是原盘,可以使用 bdinfo 软件获取。

[quote] Mediainfo/BDinfo [/quote]

发布种子

完成所有信息的填写,之后,点击发布。PT 站会自动重新下载一个新的种子,该种子包含了用户的个人信息,然后重载在客户端添加此种子,即可开始做种。

种子信息编辑

  • [[BEncode Editor]] Windows only
  • [[Torrent File Editor]] Windows, macOS

2022-12-09 torrent , mktorrent , tracker , private-tracker , transmission , rtorrent

动态规划问题梳理

很久以来一直没有好好地梳理一下 Dynamic Programming 的问题,虽然 DP (动态规划)的问题一直出现,但每次遇到总是会卡壳一下。既然前人已经将这一类问题总结成一个专有名词了,那就证明这一类的问题已经可以用一套现成的模式来解决,这篇文章就整理一下 DP 问题的常见模式。下面的部分内容是看了 MIT Dynamic Programming 的公开课之后总结得出,教授用一个 Fibonacci 的问题,自顶向下,自底向上,去系统的讲了什么是 DP。 DP 就是递归问题再加上把求解的子问题结果存储「记忆」。这个教授将什么是 DP 问题一下子就解释清楚了。

动态规划是一种分阶段求解问题的思想。用简单的话归纳动态规划就是 递推+记忆。通过子问题递推出原始问题,通过额外的空间来存储子问题解。

Simplifying a complicated problem by breaking it down into simpler sub-problems ( in a recursive manner)

类似递归问题,没有本质区别,但是动态规划的区别在于,只需要存最优的状态,推导出全局最优。

DP 算法最初由 Richard Bellman 发明。DP 就是 recursion(递归) + memorization (子问题结果记忆)

DP 问题如果从子问题开始往上推导,那么就可以将递归的写法变成循环的写法。这也就是为什么在讲斐波那契数列的递推的时候,通常会有两种写法。如果已经求解了子问题,那么从下往上递推,就可以使用循环(而非递归)来求解问题了。

Fibonacci

先来看看最经典的 Fibonacci 数列的求解方法。

如果使用递归,指数级复杂度 O(2^n)。

public int fib(int n) {
    if (n == 0 || n == 1) {
        return n;
    }
    return fib(n - 1) + fib(n - 2);
}

但是如果引入一个数组来存储以及计算过的结果,可以进一步降低时间复杂度,从指数级降到 O(n) 的复杂度。

更进一步可以将空间复杂度也从 O(n) 降到 O(1)

    public int fib(int n) {
        if (n == 0 || n == 1) return n;
        int[] dp = new int[2];
        dp[0] = 0;
        dp[1] = 1;
        for (int i = 2; i <= n; i++) {
            int temp = dp[0] + dp[1];
            dp[0] = dp[1];
            dp[1] = temp;
        }
        return dp[1];
    }

如果我们在脑海里模拟 Fib(n) 的原始求解步骤,自顶向下会发现是一棵向下的二叉树,求解 Fib(n) 首先要求解 Fib(n-1) 和 Fib(n-2),而与此同时又需要进一步求解 Fib(n-2), Fib(n-3) …….等等,并且向下求解的过程中我们会发现很多重复的计算过程。这个时候就需要看到 DP 问题的第二个特征,memorization(子问题的记忆化)。如果能够将子问题的结果保存下来,那就可以避免很多的重复计算过程。

Climbing Stairs

再来看一个相似的简单爬楼梯问题,假设有一个 n 阶的楼梯,每次可以爬 1 阶或 2 阶,问有几种方式可以爬到顶。

同样如果 n 是 2,那么可以是 1+1,或者 2。如果是 n 是 3,那就可以是在 n = 2 的时候往上爬 1 阶,加上 n = 1 的时候往上爬 2 阶。

Count the paths

再来看看延伸一些的问题,如果在一个 m * n 的棋盘上从左上角走到右下角,每次只能走右或下,请问有多少种走法。

将原始的问题拆分为子问题:

count path solution

编写伪代码:

int countPaths(boolean[][] grid, int row, int col) {
    if(!validSquare[grid, row, col]) return 0;
    if(isAtEnd(grid, row, col)) return 1;
    return countPaths(grid, row+1, col) + countPaths(grid, row, col+1);
}

状态转移方程:

opt[i, j] = opt[i+1, j] + opt[i, j+1];

if a[i,j] is 空地:
    opt[i,j] = opt[i+1, j]+opt[i,j+1]
else:
    opt[i,j] = 0

解决动态规划问题的一般思路

5 个步骤:

  • define subproblems 定义子问题,分治思想
  • guess (part of solution) 递推方程
  • relate subproblem solutions 子问题的解合并
  • recursive & memoize or build DP table bottom-up 递归和记忆,DP 状态表(存储中间状态),自底向上递推
  • 解决原始问题

如果要去学习和理解 DP 问题就必须打破原有的思维习惯,去理解机器思维,因为机器只能执行 if, while, for,条件,循环,递归等等。也必须要去锻炼拆分复杂问题的能力。


2022-12-09 dp , dynamic-programming , algorithm , computer-science

我们的尊严来自于自由

「自由」这一个词是一个非常抽象的词汇,最近这个词出现的频率越来越多,新闻自由,言论自由,信仰自由,政治自由,人们走向街头不断地呼喊自己所理解的「自由」。我们只有更好的理解我们所说的「自由」才能更有自信地去争取自由。

用英文去表达自由有两个词,freedom 和 liberty。

  • liberty
    • 在牛津词典中的解释是
      • freedom to live as you choose without too many restrictions from government or authority
      • the legal right and freedom to to something
    • 在 Longman 字典中的解释是
      • the freedom and the right to do whatever you want without asking permission or being afraid of authority
      • legal right
    • 在 American Heritage English 词典中:
      • Freedom from unjust or undue governmental control
  • freedom,再来看看字典上对 freedom 的解释
    • 牛津词典:
      • the right to do or say what you want without anyone stopping you
      • the state of being able to do what you want, without anything stopping you
      • 与之相对的就是 prisoner 或 slave
    • Longman 词典:
      • the right to do what you want without being controlled or restricted by anyone
    • American Heritage English 词典中进一步补充到:
      • Exemption from an unpleasant or onerous condition,免于不愉快,麻烦的状况
      • the capacity to exercise choice; free will,选择的能力

从这个英英的解释中我能够提取出来几个关键字,without restrictions from authoritythe capacity to exercise choice,自由意味着免于「任何人」,「任何组织」,「任何政府」的控制,自由的人可以根据自己的意愿选择做什么,说什么。在牛津字典中给出了两个自由的反例,恰好也回答了我们为什么要争取自由,不自由的两个例子就是 prisoner 或 slave。

但上面的解释都是字面的含义,真正的自由当然不是想做什么就做什么。

什么是自由

  • [[黑格尔]] 说,为了纯粹的明誉甘愿冒死决斗,才是人之为人的东西,这是自由的基础。
  • [[密尔]] 说,公民自由是社会所能合法施用于个人的权力的性质和限度。自由是对于政治统治者暴虐的防御。
    • 密尔在[[论自由]]一书中讨论的不是自由意志,而是「公民自由和社会自由」,即社会可以合法地施加于个人的权利之性质和界限。
  • [[卢梭]] 在 [[社会契约论]] 中说,只有服从了社会为自己所设之规定,谓之法律的,才叫做自由。
  • [[波普尔]] 在 [[通过知识获得解放]] 说,自由不单是观念形态,而是使生活更美好、更值得度过的一种生活方式。
  • [[康德]] 说,自由不是想干什么就干什么,而是想不干什么就不干什么。
    • 自律即自由
  • [[勒尼德·汉德]] 说,自由就是对「何为正确」不那么确定的精神。
  • [[罗斯福]] 总统提出过「四大自由」,[[言论自由]],信仰自由,免于匮乏的自由,免于恐惧的自由。
    • 每一个人对自己生命和公权力之前的关系,有稳定的、正当的预期。
  • [[赛亚 伯林 伯林]] 说,「自由的根本意义是摆脱枷锁、摆脱囚禁、摆脱他人奴役的自由。」
  • [[哈耶克]] 说,「愿意放弃自由来换取保障的人,他最终既得不到自由,也得不到保障。」
  • [[赛亚 伯林]] 更进一步将自由分成 [[消极自由]] 和 [[积极自由]],对应着英文的「free from」和 「free to」。消极自由指的是免于「干涉」的自由,我不想做什么就可以不做什么;而积极自由指的是我想做什么就可以做什么,实现目标的自由,成为自己的的主人。

言论自由、思想自由、出版自由

密尔在《论自由》中沿袭了密尔顿、洛克等英国自由主义传统,广泛的出版自由。密尔将人类获得真理视为绝对的善,因为获得真理可以使人进步,思想言论自由的价值并不在于它是个人的权利,而在于它能够有助于人类获得真理。

每个时代都曾持有很多被后代认为不仅错误而且荒谬的看法,可以确定的是,现在流行的很多看法将会被未来的时代所抛弃。只有经过讨论,错误的意见和行为才会逐渐屈服于事实和论证,这更一步地反证了只有思想自由才能促进社会进步。

即使我们认为我们已经掌握了真理,也要坚持言论自由,如果禁止对真理的挑战,真理就会僵化,变成死板的教条,最后丧失为自己辩护的能力。真理只有在谬误公开的冲突中得到考验,才能使真理充满活力,使大众对真理的认识更加全面、深刻。

[[霍姆斯大法官]] 为言论自由辩护,人们所希望的最终的善,最好通过思想的自由交流实现,对真理的最佳检验,在于思想在市场竞争中获得的力量。

霍姆斯认为政府没有必要,也没有能力,干预不同思想的之间的自由竞争,因为政府或者任何人都无法实现对真理的垄断。

霍姆斯甚至认为美国制度就是一场自由探索的实验,一种制度并不一直提供一劳永逸的乌托邦的思想,但可以为制度之下的人们走向真善美提供自由的机会。也只有不断的自由交流和公共讨论的过程中,这种制度才会修正错误,赢得稳定和活力。

真理自由观的问题在于,通过思想市场的自由探索是不是一定能够获得真理,或者实现真理战胜谬误。

言论在某种意义上是更好被操纵的,[[罗尔斯]]在政治自由主义中看到的那样,不能指望具有理性力量的人们,即使在自由讨论之后都达到同样的结论。

那这样真理自由的意义何在,我想最大的意义并非是能够找到某种确定的答案,而在于思想竞争和自由交流的过程本身,它们使得一个社会成为了开放的社会,使得一个人成为了开放的人,无论开放的社会有多少的问题,生活在开放的社会,总比生活在封闭的社会,对人的发展而言总要更加值得。

政治自由

政治自由,通常指的是公民有权利参与到公共事务,包括选举和被选举,对权力发表不同的意见,广义的政治自由还包括上面提及的出版自由,集会自由,结社自由,游行示威自由,无罪推论。1

自由的原则成为了民主的重要途径,公共事务必须交给公众决定,这并不是因为公众的意见本身是对的,或者有见地的,而是因为公众的意见不可忽视。

民主的决策很多时候无关专业科学的判断,而只关乎利益,立场的决择,所以让每个人都发出声音,这在进行民主决策时非常重要,这样依赖, 自由本身就蕴含着平等,甚至深化了民主的平等。

自由不仅意味着随心所欲,而且意味着公共责任,民主的自由观,之所以相信自由在民主生活中的价值,还有更深刻的理由,人的天赋,条件,能力,千差万别,只有通过自由的言说,自由的实践,才能为人的才能的发挥提供最大化的机会,才能使人们更理性,更明智,更有判断力,从而减少被统治者欺骗的可能。正确的看待政府与人民的关系,并且把人们从非理性的恐惧中解脱出来,人们曾经因为害怕巫婆就烧死女人,人民曾经因为激情盲目而选择了纳粹,正如美国 [[布兰代斯大法官]] 所言,对自由的最大威胁,在于人的惰性,不鼓励思想、希望和想象是危险的,恐惧会产生镇压,镇压会产生仇恨,仇恨会威胁政府的稳定,言论自由是有风险,但是压制言论自由的风险更大。

自由对理性责任精神的强调则蕴含着民主的有限政府理念。自由的重要性不仅在于不受政府和他人的干预,更在于通过积极的行动来推进公共政策,实现利益的妥协和社会的正义。

西方社会已经认识到,词语比刀剑更有影响力。完美的社会是不可能的,但是一些秩序要胜过一些秩序。立法的任务是允许每个个人的最大自由和其他人的最大自由并存。自由必须受到法律的限制。秩序是自由的必要平衡。

当社会本身就是暴君时,当社会集体凌驾于组成它的个体之上时,暴政的实施就不限于借助政治机构之手而行的各种措施。社会如果执行了错误而非正确的命令,或者对它根本不应干涉的事务发号施令,那么它便实行了一种比其他各种政治迫害更为可怕的社会暴政,不以严厉的惩罚为支撑,但却由于更深入地渗透到人们生活的细节,束缚了人的身心,从而使人们更加无法逃脱。

为什么要争取自由

从伯林对自由的分类正好可以总结出两点:

  • 免于被奴役,被控制
  • 追求自己的理想和目标

上至苏格拉底,到集大成者的康德,都强调自由代表了人的尊严和美德。人必须过一种神圣的、善的生活,没有这种内外统一的实践,人就不能称其为人,自由意志合乎道德的意志,「人是目的,而非手段」,人要理性自律,不能屈从他律。

reference

  • [[论自由]]
  • [[言论的边界 美国宪法第一修正案简史]]

2022-11-30 freedom , free , pree-freedom , political-liberty , liberty , freedom-of-speech , free-speech

在日本生活必备的应用收集整理

在上一篇梳理了一下如何 注册日区的 Apple ID ,其实主要是为了这一篇整理做准备,有很多的应用,如果不是日区就安装不了,并且如果要在日本生活有一些应用还是非常重要的,所以就提前梳理一下需要用到的应用。

免责声明,因为本人此刻并没有在日本长期生活过,下面的所有内容都是我个人在搜集资料的过程中,或因本人需要,或因为其他人推荐,才收集整理得出,可能会有一些偏差,如果有读者发现任何问题,可以随时留言告诉我,我会立即修正。 另外如果有朋友长期居住在日本,平时有用到一些不错的本土应用也欢迎留言告诉我,待我尝试之后我也会补充到文章中。 希望本文可以给想要去日本旅游,或者想要去日本常居的朋友一些帮助。

租房

  • SUUMO,日本最大的租房网站

交通

要加深对日本的印象就首先从地理位置上开始认识,而城市规划,尤其是公共交通的设计,在没有用乗換案内之前我都只能在网页版的 Google Maps 上一点点得搜站点的名字,然后查看其相对的位置。

我在出门旅行也好生活也好,通常都会提前看一个这个城市的轮廓,以及集中重点的景点的位置,在 Google Maps 上用 Star 标记一下,有时间了还会用 My Maps 规划一个最优的路线,以免在陌生的地方来回重复的走回头路。

  • 「Yahoo!乗換案内」,日本的电车非常发达,下载了一张东京都的地铁线路图得放大好几倍才能找到我想要查的站点,乘换案内解决了电车换乘的问题,当然用 Google Maps 也可以,但这个应用在换乘,列车到站时间等方面给的信息更多
    • 千万要注意,这个应用的图表是下图所示,中国区和美国区都有一些假冒的应用
    • yahoo transit
    • 在日区乘换案内名字的应用还挺多的,还有一个推荐较多的是一个红色 Logo 的,Jorudan Co. Ltd 出品的,我两个都下载试用了之后,还是果断推荐 Yahoo 的这个,界面设计好,并且 Yahoo 的还能提供地图线路,路线可以按照时间优先,换乘次数,以及金额排序
    • 还有一个叫做「乗換 NAVITIME」的应用,Logo 是一辆绿色的电车,使用起来体验也不错
  • Suica,电车票
  • DIDI,出行打车

翻译

  • Google Translate
  • Papago,去韩国的时候偶然间发现的一款翻译应用,多年用来感觉比 Google Translate 还顺手,主要是界面比较简洁

美食

外卖

  • Uber Eats,点外卖
  • HAYA,订外卖,注册送 3000 元券,3 KM 内免费配送,支持支付宝,微信,信用卡

美食排行

  • 食べログ,美食点评,类似大众点评
  • ぐるなび
  • ホットペッパーグルメ

其他

  • クックパッド,学习做菜,以及学习食材的日语
  • クラシル
搜索 {予約 よやく}{可 か} 可以筛选可以预约的餐厅。

日常生活

  • Yahoo!防災速報,第一时间通知这种自然灾害,或人为犯罪危害
    • NHK ニュース 防災 (ぼうさい) ,灾情相关通知以及新闻直播,可以用来学习日语
  • マルチコピー,打印,将文件上传到应用内,到便利店打印即可
  • SpaceMarket,租借场地,空间租赁,过生日,聚会,吃火锅比较合适
  • 楽天チケット Web 演唱会、音乐会购票
  • チケジャム, Web ,二手门票
  • SHEIN,衣服
  • アインズトルペ,AINZ TULPE,药妆店
  • ホットペッパー ビューティー(Hotpepper Beauty),美容美发美甲等等预约,男生也可以在这上面预约理发

旅行

  • じゃらん 官网 日本本土最大的旅游预订网站,汇集了日本各地景点,可以用来订酒店,订机票。因为 Jalan 会和众多的民宿、酒店合作,在上面搜索说不定能找到价廉物美的温泉酒店。

网购

  • Amazon JP
  • メルカリ,二手物品交易
    • 同类型的还有:
    • ヤフオク,Yahoo 旗下的二手拍卖网站 Web
    • ラクマ,乐天旗下 Web
  • 楽天市場, Web
  • Paypay,移动支付,使用之前需要注册账户,绑定银行或电子钱包。

2022-11-28 japan , applications , daily-life , japanese , japan-life

电子书

最近文章

  • 阿加莎・克里斯蒂自传 怎么知道的这一本书
  • J3455 主板无法使用 PCIe 扩展 SATA 启动系统解决 把自己之前用 J3455-itx 主板组的 NAS 搬回了,但突然无法启动,这里就记录一下排错的过程。
  • .idea 文件夹的内容梳理 使用 JetBrains 旗下的 IDE 创建项目都会在项目的根目录中自带一个隐藏的 .idea 文件夹,每一次遇到这个文件夹的时候都会犹豫一下是否需要下面的内容全部放入到 .gitignore 文件中,大部分的时候就直接全部忽略了。现在想过来再了解一下这个文件夹下的每个文件都代表什么内容,因为有一些数据库配置,还有一些插件的临时信息都会存放在这个目录下。
  • Java 11 新特性学习 Java 11 在 2018 年 9 月 25 日发布。这是 Java 8 之后首个长期版本。
  • 《天朝的崩溃:鸦片战争再研究》读书笔记 《天朝的崩溃:鸦片战争再研究》 是茅海建教授对于鸦片战争研究的集大成之作,是系统研究鸦片战争十余年所得的成果。在阅读之前,我本以为是一部非常学术的类似论文一样的著作,然而我只阅读了一章就改变了我的观点,作者以人物为核心,将历史事件以人物为核心串联,并收集各方面的文献材料,去还原历史的本来面貌,去摆正对一个历史人物的是非判断。并且作者的笔法流畅通顺,非常易读。