macOS

Raycast

可以替代 Alfred 的快速启动和工作流工具,个人用户免费使用。它自带的扩展非常丰富,支持剪贴板历史、划词搜索、窗口排列等常见需求。少数派《能少一个是一个:我用 Raycast 替代了这些应用》值得一看。

Scroll Reverser

macOS 上鼠标、触控板滚动方向反转的免费小工具,可独立设置鼠标和触控板的滚动方向,尤其对于从 Windows 转向 macOS 的用户来说,简直是神器般存在的一个调整工具。

Hidden Bar

macOS 上轻量级的菜单栏图标隐藏工具,开源免费。对于轻度用户来说,可以替代收费的 Bartender。

Kap & LICEcap & ScreenToGif & OBS

macOS 上轻量级屏幕录像工具,可输出 gif 或 mp4 等格式,通过插件的支持,也可以把录屏 gif 上传到图片网站。另外一款轻量级的免费录屏工具是 LICEcap,它同时支持 Windows 和 macOS 双平台。对于 Windows 用户来说,还可以选择 ScreenToGif,简单好用且开源免费。如果对录屏有重度需求,可以选择开源的 OBS

DaisyDisk

macOS 上收费的磁盘空间分析工具,功能类似 Windows 上的 SpaceSniffer。DaisyDisk 以旭日形图的方式展示磁盘文件空间占用,以帮助查找或删除大文件。它的 快速查看 可显示文件预览,也可以直接在Finder中查看文件,以便将其删除或移动到其他位置。

KeyCastr

macOS 上实时显示按键的小工具,开源免费,特别适合录屏、投屏的时候展示一些按键组合。其他平台上分别有 Carnac (Windows)、Screenkey (Linux)。

腾讯柠檬

腾讯出品的一款 macOS 实用工具,集合了系统清理、软件卸载、启动项管理和磁盘文件占用分析功能以及状态栏小工具,清爽无广告。其中软件卸载清理可以替代老牌收费的 CleanMyMac,磁盘文件占用分析可以替代收费的 DaisyDisk,状态栏小工具作为收费 iStat Menus 和开源的 Stats 的简单替代。

Windows

Ditto

开源免费的 Windows 剪贴板历史工具,最常用的功能除了直接 Enter 粘贴外,还可以 Shift + Enter 粘贴纯文本。 Windows 上的同类工具有:

  1. 系统自带的 Win + V (Windows 10 以后系统),缺点:过于简单,没有保存,置顶;
  2. CopyQ,优点:开源免费,跨平台,支持 Windows/macOS/Linux,选项有点多,略复杂,当前版本(2023.03)对高分屏适配不太好。

Everything

Windows 平台上文件/文件夹快速查找的效率神器。支持通配符、文件类型、位置搜索,还支持搜索网络存储器上的文件。因为它依赖 NTFS 索引功能,所以需要磁盘类型是 NTFS。(Windows 系统磁盘类型已经默认 NTFS 了)

Move Mouse

开源的 Windows 鼠标自动移动工具,防止屏幕长时间自动锁屏,免安装。另外推荐的一个同样功能但设置更简洁的是 Auto Mouse Mover,但它是收费版本,提供试用。

JPEG & PNG Stripper

清除照片/图片中不需要的 metadata,小巧免费且免安装,只有 80 KB 大小。可以用在移除 PS 痕迹、相机型号、拍摄时间等 metadata。目前已经没有维护者了,备份文件可以在 这里 下载。

iOS

Where/When

iOS 上一款特别的位置签到 App,把位置记录以日程的形式保存到 iOS 日历中,只有这个功能,单调又简单。

Android

PingTool

一款集成 Ping Traceroute Whois Network Scanner Wi-Fi scanner 为一体的实用 App。尽管免费版本带有底部广告,也无法阻碍它的亮点。尤其使用 Network Scanner 功能查看局域网内的设备,非常实用。同类 App 还有 Fing,Fing 专注于局域网内设备探测和安全,亮点是同时支持 Android 和 iOS。

Web

PDF24 Tools

免费且实用的在线 PDF 工具集合,所有你能想到的 PDF 处理功能,几乎都可以在这里找到。尽管开发者保证数据安全,但对于有类似担心的用户来说,也可以使用它的离线 Windows 版本 PDF24 Creator

IT Tools

在线的 IT 开发者工具箱,开源免费无广告。包含了密码学工具、类型转换、Web 工具和编码、二维码生成与开发者辅助工具(例如 Crontab 生成器、JSON 和 SQL 格式化)。对于同类型的客户端,有以下软件可以选择:

  1. DevToys - Windows 平台,开源免费
  2. DevToysMac - macOS 平台,上对标 Windows DevToys,开源免费
  3. DevUtils - 收费,macOS 专属,宣称 Toolbox All-in-one,并且可以集成 Terminal Alfred Raycast

语法检查与写作润色

起步比较早并且有名的是 GrammarlyQuillbot,这两个的使用体验相当,从免费账户的功能上来说,Quillbot 要更慷慨一些。后起之秀有微软 Editor有道写作、腾讯的 Effidit 以及专业翻译服务 DeepL 推出的 Write

Grammarly、Quillbot 和 Editor 除了可以在 Web 上使用之外,都提供了浏览器扩展,方便性更好一些。有道写作和 Effidit 的超级网典功能对于查询词语的例句非常有帮助。DeepL 借助其专业机器学习能力,它的 Write 在写作润色上的体验也非常不错。不过,随着 ChatGPT 的发布,借助 AI 进行语法检查和润色的体验,已经超越了以上工具。

Cross Platform

LocalSend

一个跨平台的局域网文件传输工具,不依赖服务器,纯离线使用。替代 AirDrop、LANDrop。上一个这么优秀的工具还是 Dukto R6,可惜 Dukto 已经不再更新。

KeePass

开源的离线密码管理器,正因为其解密协议开源,可以找到很多优秀的 KeePass 应用。同时借助 Dropbox、OneDrive、坚果云 的同步功能,能达到 1Password 或 LastPass 的云端保存效果。在官方下载页面上链接了 N 多客户端,其中比较优秀的有这些:

  • KeePass Password Safe 官方发布的 Windows 版本,提供了免安装版本(好评);
  • MacPass macOS 上优秀的 KeePass 客户端,免费;
  • KeePassium iOS 上优秀的 KeePass 客户端,免费版本功能足够使用;
  • KeePass2Android Android 平台上开源的优秀 KeePass 客户端。亮点是支持 WebDav 协议,与坚果云的 WebDav 完美配合实现云同步;
  • KeeWeb 跨平台的开源 KeePass 客户端。提供 Web 版可以在线使用,同时提供了 macOS/Windows/Linux 打包后的客户端。

Snipaste

跨平台的截图 + 贴图 + 标注 + 取色工具。截图功能强大,支持自动检测界面,键盘控制边界像素移动。设置功能丰富,自定义文件名,自定义快捷键,一键使用上一次区域截图,也可以设置自动保存,轻松找回截图历史。免费版本已经足够满足日常使用。另外一款跨平台的截图工具 Flameshot,开源免费,对于 Linux 用户来说,是一个不错的选择。

FreeFileSync

文件夹比较和同步工具,对比时默认根据文件大小和时间判断是否相同,还可以选择哈希判断,同步时支持单向、双向,并且是差异化的增量同步。免费,开源,同时支持 Windows、macOS 和 Linux。

浏览器扩展

uBlock Origin

一款开源的高效广告过滤工具,以占用极低的内存和 CPU 著称。

SingleFile

一直以来,浏览器的页面另存功能太弱,因此有了这个扩展,可以完整地把网页保存成一个 HTML 文件。对于页面存档来说非常实用,开源免费。

Surfingkeys

使用键盘操作网页的一款辅助扩展,可以看作 Vimium 的增强版。Shift + ? 可以查看帮助。如果不喜欢它提供的 PDF 阅读器,可以使用 ; + s 组合键关闭该功能。

一、背景介绍

最初发现 TimelineJS 是在 2014 年。为了制造一个惊喜,用它做了一个与爱人从相识到结婚的时间线。

转眼 2020,TimelineJS 也有了第三个版本。

对于平时有记录习惯的人来说,拥有一个关于自己的易读美观的故事线是一件非常有成就感的事,我自己便属于这类人。另一方面,TimelineJS 仍然非常小众,而且国内几乎没有对它的介绍和使用说明。本文的目的是便是能够把它的使用方法描述清晰。

TimelineJS 能做什么

官网:https://timeline.knightlab.com/

TimelineJS 是 Northwestern University Knight Lab 社区的一个产品,它可以用来制作时间线(时间轴)的故事,元素支持文本、图片、音乐、视频、地图。官网罗列出的类型包括:

Twitter, Flickr, YouTube, Vimeo, Vine, Dailymotion, Google Maps, Wikipedia, SoundCloud, Document Cloud and more!

在官网上能看到几个示例,比如对美国歌手惠特妮·休斯顿的生平介绍:https://timeline.knightlab.com/examples/houston/index.html

whitneyhouston

本文适用的读者

TimelineJS 虽然适用简单,但如果你能够:

  • 懂点前端知识;
  • 懂点网站托管知识;
  • 最好熟悉 JSON 语法;
  • 最好能科学上网(不会也没关系,一样可以本地使用);

那么,TimelineJS 对你来说毫无门槛。

二、几种使用方法

要想使用 TimelineJS 制作故事线,需要从以下两个方面考虑:

  • 故事线的数据存放到哪里
  • 故事线的网页运行在哪里

幸运的是,这两个方面官方都考虑到了,使用 Google docs 来存放故事线的数据,Knight Lab 提供页面托管。只要按照这里的 4 个步骤 https://timeline.knightlab.com/#make 就能生成 Knight Lab 给你的一个链接。对于想尝试一下的人来说,这样就足够了,简单么!

但是,它实际上是支持以下三种组合使用的:

  1. Knight Lab + Google docs # 官方推荐,需科学上网
  2. 自己的页面 + Google docs # 可个性化定制页面,需科学上网
  3. 自己的页面 + JSON 文件 # 可个性化定制页面

第一种是上面官方推荐的用法。对于想要个性化定制页面的用户来说,就需要使用后两种方法了。对于不能使用 Google 服务的用户来说,就只能选择第三种方法了。

从隐私方面来考虑,一旦使用 Google docs 这种组合,就意味着需要把文档公开,所以对于不想公开故事线信息的人来说,最好的办法就是使用本地的 JSON 文件,也就是第三种组合。

接下来详细介绍一下后两种组合的使用方法。

三、详细使用

1. 自己的页面 + Google docs

按照 https://timeline.knightlab.com/#make 这里前两个步骤:

第一步、点击 这里复制一份时间线数据的表格模版

第二步、把你的表格发布到网络后,复制表格的 URL;

第三步、创建一个自己的 HTML 页面,把第 16 行的链接替换为你自己表格的 URL:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<!DOCTYPE html>
<html lang="en">

<head>
<title>Timeline</title>
<meta charset="utf-8">
<link title="timeline-styles" rel="stylesheet"
href="https://cdn.knightlab.com/libs/timeline3/latest/css/timeline.css">
</head>

<body>
<script src="https://cdn.knightlab.com/libs/timeline3/latest/js/timeline.js"></script>
<div id='timeline-embed' style="width: 100%; height: 600px"></div>
<script type="text/javascript">
timeline = new TL.Timeline('timeline-embed',
'https://docs.google.com/spreadsheets/d/1cWqQBZCkX9GpzFtxCWHoqFXCHg-ylTVUWlnrdYMzKUI/pubhtml');
</script>
</body>

</html>

这样,在本地打开这个页面,就可以看到自己的故事线了。

2. 自己的页面 + JSON 文件

为了直接能从本地引用 timeline.js 和 css 文件,从这里 https://cdn.knightlab.com/libs/timeline3/latest/timeline3.zip 下载官方的编译后压缩包,解压到本地网页目录,重命名为 build。这时,你的网页目录应该是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
.
└── build
├── css
│ ├── fonts
│ ├── icons
│ ├── themes
│ └── timeline.css
├── embed
│ └── index.html
└── js
├── library
├── locale
├── timeline-embed-cdn.js
├── timeline-embed.js
├── timeline-min.js
└── timeline.js

接下来,创建一个时间线的 JSON 文件,可以直接下载 惠特妮·休斯顿 的示例,放到网页目录中,重命名为 data.json

接下来,创建一个 HTML 文件,名字为 index.html,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<!DOCTYPE html>
<html lang="en">

<head>
<title>Timeline</title>
<meta charset="utf-8">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-touch-fullscreen" content="yes">

<!-- build:css https://cdn.knightlab.com/libs/timeline3/latest/css/timeline.css -->
<link title="timeline-styles" rel="stylesheet" href="./build/css/timeline.css">
<!-- endbuild -->
<!-- build:js https://cdn.knightlab.com/libs/timeline3/latest/js/timeline-min.js.js -->
<script src="./build/js/timeline-min.js"></script>
<!-- endbuild -->

<!-- Style-->
<style>
html, body {
height:100%;
padding: 0px;
margin: 0px;
}
</style>
</head>

<body>

<div id="timeline-embed">
<div id="timeline"></div>
</div>

<script>
$(document).ready(function () {
var embed = document.getElementById('timeline-embed');
embed.style.height = getComputedStyle(document.body).height;
window.timeline = new TL.Timeline('timeline-embed', 'data.json', {
hash_bookmark: false
});
window.addEventListener('resize', function () {
var embed = document.getElementById('timeline-embed');
embed.style.height = getComputedStyle(document.body).height;
timeline.updateDisplay();
})
});
</script>

</body>

</html>

这时,你的页面目录结构应该为:

1
2
3
4
5
6
7
.
├── build
│ ├── css
│ ├── embed
│ └── js
├── data.json
└── index.html

如果本地直接打开 index.html,会在页面的调试工具中看到跨域的错误:

1
Access to XMLHttpRequest at 'file:///path/to/your/data.json' from origin 'null' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https.

cors

跨域错误的原因是 timeline.js 读取的 json 文件是本地文件,不是 http 这种 URL 的。要解决这个问题,可以考虑使用 http server 把页面托管起来。Windows 用户可以选择 Web Server for Chrome 扩展,把网页目录托管起来。当然 Linux 和 Mac 用户也可以这样用,既然你都用 Linux 或 Mac 了,就跟着我一起折腾吧。

接下来,我们尝试一下 Nginx 来托管静态页面,无需编译安装 Nginx,直接用 Docker 来运行即可。(前置条件:你要自己安装 Docker for Linux or Docker for Mac)

在网页目录新建一个 start-nginx-docker.sh 文件,内容如下:

1
docker run --name timeline-nginx -v ${PWD}:/usr/share/nginx/html -p 8080:80 -d nginx

这时,你的网页目录应该是这样的:

1
2
3
4
5
6
7
8
.
├── build
│ ├── css
│ ├── embed
│ └── js
├── data.json
├── index.html
└── start-nginx-docker.sh

在该目录下,运行 sh start-nginx-docker.sh 命令,会自动下载 Nginx 最新的镜像并运行。

打开 http://127.0.0.1:8080 就能浏览了。

剩下的事,就是去修改你的 json 文件。

TimelineJS 的 JSON 中字段的意思都在这里进行了说明 https://timeline.knightlab.com/docs/json-format.html

四、个性化页面

自定义字体

TimelineJS 提供了几个预选字体集,如果使用内置的字体,可以在 HTML 中这样写:

1
2
<link title="timeline-styles" rel="stylesheet" href="https://cdn.knightlab.com/libs/timeline3/latest/css/timeline.css">
<link title="timeline-styles" rel="stylesheet" href="https://cdn.knightlab.com/libs/timeline3/latest/css/fonts/font.abril-droidsans.css">

font.abril-droidsans.css 可以替换为下面其他的字体:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
font.abril-droidsans.css
font.amatic-andika.css
font.bevan-pontanosans.css
font.bitter-raleway.css
font.clicker-garamond.css
font.dancing-ledger.css
font.default.css
font.fjalla-average.css
font.georgia-helvetica.css
font.knightlab.css
font.lustria-lato.css
font.medula-lato.css
font.oldstandard.css
font.opensans-gentiumbook.css
font.playfair-faunaone.css
font.playfair.css
font.pt.css
font.roboto-megrim.css
font.rufina-sintony.css
font.ubuntu.css
font.unicaone-vollkorn.css

自定义选项

定义 additionalOptions 并在实例化 Timeline 的时候作为第三个参数传入。详细的个性化选项可以参考 https://timeline.knightlab.com/docs/options.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<script type="text/javascript">
var additionalOptions = {
start_at_end: true,
default_bg_color: {
r: 0,
g: 0,
b: 0
},
timenav_height: 250
}

timeline = new TL.Timeline('timeline-embed',
'https://docs.google.com/spreadsheets/d/1cWqQBZCkX9GpzFtxCWHoqFXCHg-ylTVUWlnrdYMzKUI/pubhtml',
additionalOptions);
</script>

五、还有什么

页面 + JSON 文件方式除了可以本地浏览,也可以部署到网络上,比如 github pages。

六、参考

官方文档 https://timeline.knightlab.com/docs/index.html

HTML中使用 TimelineJS https://timeline.knightlab.com/docs/instantiate-a-timeline.html

Timeline JSON 字段说明 https://timeline.knightlab.com/docs/json-format.html

Timeline 个性化选项说明 https://timeline.knightlab.com/docs/options.html

0x00 简介

最近两年工作中对区块链技术接触较多,接下来可能要告一段落了。期间对 go-ethereum 进行过联盟链改造,使用 Raft 共识算法把以太坊的 TPS 提升到了 1K+。这里总结一下 Raft 算法,既是对自己经历对一种记录,也算是对他人对帮助。

Raft 算法是一个非常好理解(相比 Paxos 算法来说),也是一个非常受欢迎的共识算法,比如常用的服务发现、共享配置以及一致性保障的 etcd 和 Counsul 都使用了 Raft 算法来保证一致性。

0x01 什么是分布式共识算法

在分布式计算领域中有一个非常有名的 CAP 定理:一个分布式系统最多只能同时满足一致性(Consistency)、可用性(Availability)和分区容忍性(Partition tolerance)这三项中的两项。

一致性是指节点数据的一致,即所有节点在同一时间的数据完全一致。如果细分的话,一致性又可以分为强一致、弱一致和最终一致。比如我们经常使用的多副本关系型数据库满足的是强一致性,又因为要同时满足高可用,那么就弱化了分区容忍性(可以使用简单的网络拓扑来减少分区出错的可能);公有的比特币、以太坊网络是属于最终一致,因为它们必须优先满足可用性和分区容忍性。

分布式网络中所有节点要想达成一致,就需要一个算法来促成这个一致,这个算法就是共识算法。我们常听说的 挖矿、PoS、DPoS、PBFT、Raft 都属于解决一致性的算法。

0x02 理解 Raft

Raft 中,节点通过心跳消息来保持通信,一个节点只会处于以下三种状态中的一种:

  • Follower(跟从者)
  • Candidate(候选人)
  • Leader(领导者)

最开始时,所有的节点都是 follower,如果 follower 收不到 leader 的心跳消息,那么 follower 会变为 candidate,并向其他节点发起投票,如果该 candidate 节点收到了半数以上的选票(包括投给自己的一票),那么它就当选为新的 leader。这个过程被称为 leader 选举的过程。

接下来,leader 节点将带领所有节点对分布式网络中对数据更改达成一致,这个过程被称为日志同步

日志同步的过程如下:

  1. Leader 收到客户端到数据提交请求,leader 把请求作为一个条目(entry)加入到它到日志中,这个时候它不会立刻更新数据;
  2. Leader 向所有的 followers 节点发送这个条目,这个发送的过程被称为 Append Entries;
  3. Followers 节点收到 leader 的 Append Entries 请求后,向 leader 回复条目响应;
  4. Leader 节点收集了半数以上的条目响应后,向客户端响应条目已确认,这时它才会更新自身节点的数据,同时向所有 fwllowers 节点发送条目确认的消息;

0x03 特殊情况

Leader 选举过程中,如果没有收到半数以上的选票,该怎么办?

Raft 中,有两种超时机制:选举超时和心跳超时。

每个 follower 会随机生成一个选举超时时间。任意节点当自身的选举超时时间结束后还没有收到 leader 的消息,那么它就重置这轮选举,变为 candidate 向其他节点发起新一轮投票。这样,最终总会选举出一个 leader 节点来。

正常运行过程中,如果 leader 节点挂掉,会出现什么情况?

这种情况下,会用到心跳超时机制。当 followers 在心跳超时后仍旧没有收到 leader 节点的心跳消息,那么 followers 节点就会发起新一轮投票,直到选举出新的 leader 来。

网络分区的情况下会发生什么?

网络故障导致导致节点被分隔到多个不连通的区域,在被隔离的区域中又会触发新的 leader 选举,对于隔离区域中包含半数以上的节点,选举就可能成功。当网络恢复后,followers 接受最大任期(term)和最新日志的 leader。这个思路蕾丝比特币、以太坊网络分叉后以最长区块为准的解决方案,确保了最终一致性。

0x04 Raft 参考资料

0%