ARTS 第 6 周 - 如何打造个人知识库

Algorithm

这周做了一道 腾讯精选练习 50 题 中的简单题 整数反转,这题很简单,但还是有两点需要注意:

1 负数取模的结果还是负数:-1 % 2 == -1
2 溢出的判断还有两种情况, 因为一定不会成立,故省略:
(1) result == Integer.MAX_VALUE / 10 && digit > Integer.MAX_VALUE % 10
(2) result == Integer.MIN_VALUE / 10 && digit < Integer.MIN_VALUE % 10

class Solution {
public int reverse(int x) {
int result = 0;
while (x != 0) {
int digit = x % 10;
if (result > Integer.MAX_VALUE / 10 || result < Integer.MIN_VALUE / 10) {
return 0;
}
result = result * 10 + digit;
x /= 10;
}
return result;
}
}

Review

这周读了一篇 Medium 上 Netflix 公司的文章《 Metacat: Making Big Data Discoverable and Meaningful at Netflix》,这篇文章主要介绍一个叫做 Metacat 的服务,作为计算引擎和存储之前的中间层,提供统一的 API 给引擎,供引擎读写数据。Metacat 跟 Databricks 的 Delta Lake 有些类似,都是实现存储计算分离的关键服务,都有一定的中央管控能力,这种服务随着 Data Lake 的兴起也越来越多,后面我会专门写一篇文章来分析一下类似的服务。

Metacat 架构图(来自如上博客文章)

Tip

直接把客户端的输入拼接到 SQL 上面丢到数据库执行,容易被 Hack(SQL 注入),Java JDBC 接口中的 PreparedStatement 能在一定程度上避免 SQL 注入,因为它会在你要 set 的字符串两边添加单引号,还会将字符串中的单引号转义,可以看看这段测试程序体会一下,所以有一个简单的检测系统是否有 SQL 注入漏洞的方法:在输入中加一个单引号,有漏洞的系统一般会报错。

public class TestSqlInjection {
public static void main(String[] args) throws SQLException {
String name = "' or 1 = '1";
String sql = String.format("select * from person where name = '%s';", name);
try (
Connection connection = getConnection();
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery(sql)
) {
// get all records in this table
while (resultSet.next()) {
System.out.println(resultSet.getString("name"));
}
}

try (
Connection connection = getConnection();
PreparedStatement statement = getPreparedStatement(connection, name);
ResultSet resultSet = statement.executeQuery()
) {
// get records whose name = '\' or 1 = \'1'
while (resultSet.next()) {
System.out.println(resultSet.getString("name"));
}
}
}

private static Connection getConnection() throws SQLException {
return DriverManager.getConnection(
"jdbc:mysql://127.0.0.1:3306/test", "root", "");
}

private static PreparedStatement getPreparedStatement(
Connection connection, String name
) throws SQLException {
PreparedStatement statement = connection.prepareStatement(
"select * from person where name = ?");
statement.setString(1, name);
return statement;
}
}

Share

事物必须兼具入口和出口。一个人活得久了,总会主动被动接受许多东西,得出许多感慨。这是入口。敏感的心灵就在生活的泥淖里陷得深些,粗粝的心灵就陷得浅些;悲观的心灵就得出人生是徒劳的结论,乐观的心灵总相信我们终会前进。倘若只有一个入口,各色事物只有涌进而没有排泄的通道,总有一天大脑会炸掉。所以才会有倾诉,不能向亲近的人倾诉就向陌生人倾诉。这是出口,谁都需要。写作大概就是这么一个出口。

—— 村上春树《1973 年的子弹球》

Why

记得刚开始工作的时候,通过搜索引擎解决问题后,并不会做什么记录,导致下次遇到同样的问题还要重新搜索一遍,后来渐渐学会把解决问题的过程记录在印象笔记中,再遇到同样的问题看一下笔记就行了。有段时间,疯狂使用印象笔记的「剪藏」插件和公众号「我的印象笔记」囤积了大量所谓的「知识」,但是大都收藏完了就再没看过了,后来把那些自己可能不会再看的收藏全都删掉了,就像卖掉那些不会再看的书一样。很早就开始在印象笔记中记读书笔记,倒不如说是书中一些关键内容的摘抄,记完之后也就扔在那里,少有回去查看的时候,更不用提变成自己的知识了,后来渐渐意识到可能需要把学到的东西整理成文章。

最近一年来写公众号的经历,让我对写作有了切身的体会:写一篇言之有物、逻辑清晰的文章并不是一件很容易的事情,即使是我常写的那类观后感、读后感的文章也需要花费一番心思。写作依赖于思考,你需要将碎片化的信息组织成逻辑清晰的语言,所以写作也是锻炼思维能力的绝佳方式,通过写作这一提炼的过程,能够让你接触到的信息真正内化为自己的知识。

你不可能把所有杂乱的信息都记在大脑里,需要一个「外部的大脑」来存储,然后经过提炼形成知识,更近一步成为智慧,或者某种方法论,这就是个人知识库存在的意义。

How

意识

You take the blue pill, the story ends, you wake up in your bed and believe whatever you want to believe. You take the red pill, you stay in wonderland and I show you how deep the rabbit hole goes.

电影《黑客帝国》(The Matrix, 1999)中有个经典桥段,Morpheus 给 Neo 两个选择:蓝色药丸回到原来的生活,红色药丸继续追求真相的冒险。要过什么样的人生,相信每个人都有一定程度的选择的权利,说完全没得选我是不信的。是否要打造个人知识库,也是一种选择,每个人都有不同的管理知识的方式(或者直接不管理),但我个人认为,要获得持续成长,这样一个知识库是必要的。

践行

既然有了「我需要打造个人知识库」这样一种意识,那就开始做吧,开始提炼和积累知识,不可避免地又要谈到「坚持」这个话题了。我觉得「决心」和这个话题的关系似乎不大,倒是「兴趣」更切题一些,一件事情只有你喜欢做,才能做得好、做得长久,如何培养兴趣应该是因人而异的,不过如果你还有对这个世界的好奇心,这点应该不难吧。

工具

相比意识和践行,工具可能是最不重要的,有大把的工具来帮助你构建个人知识库,各种云笔记软件层出不穷,我也尝试过很多种。但在意识和践行到位的情况下,一个更好用的工具确实能让你事半功倍,经过最近的探索和尝试,我发现 Notion 确实是目前我用过的,最称手的个人知识库工具(个人看法),我录了一个视频来分享自己是如何使用 Notion 的,希望能给大家一些启发。

0%