Joplin 至今为止用过的最好的 Evernote 代替品

Joplin 是一个开源的笔记应用,曾经在调查 Evernote 代替品 的时候简单的看到过,但是当时也只是观望的态度,因为当时发现 Joplin 的插件有些不完美,有些网页 HTML 格式无法保证。

Joplin is a free, open source note taking and to-do application, which helps you write and organise your notes, and synchronise them between your devices.

但是时隔一些时间过来看,Joplin 发展已经超出我想象,不仅提供了各个平台的版本,还提供了命令行版本。虽然日常用 Vim,rg,fzf,git 来记录一些笔记,倒也还可以,但是毕竟有些管理上的问题,尤其是当笔记数量已经达到数百数千条的时候。

一些非常棒的特性:

  • 跨平台,横跨所有桌面端,移动端,甚至提供了命令行版本
  • 原生支持 markdown 格式
  • 所有的笔记都可以搜索,加标签,所有内容都保存在本地
  • Joplin 可以通过其他第三方同步工具 (Dropbox/NextCloud/OneDrive/WebDAV/etc) 进行备份以及同步
  • Web clipper, 之前就是因为无法逃脱好用的 WizNote 插件才没有转,现在用 Joplin 的扩展,非常好用了,很快,很精确
  • 纯文本文件保存支持方便导入导出

Installation

各个客户端的安装直接参考官方网站:

Client

桌面客户端没有什么可说的,从最早只支持 Markdown,到如今可以看网页原始 HTML,客户端也在进步。和大部分的笔记应用一样,左侧是笔记本,点开笔记本能查看笔记本中的内容,右侧主要部分就是笔记内容。

笔记本的层级关系支持树形结构,可以嵌套很多子目录,所以非常适合用来归类

更多内容可以查看我的笔记整理法则

在桌面版中,可以按下 Ctrl + G 然后输入笔记的标题来快速跳转到该笔记。或者在按下 Ctrl + G 后可以使用 # 跟着 Tag 名或者使用 @ 跟着笔记本标题来跳转。

External Editor

使用快捷键 Ctrl + E 或者直接点击工具栏的 External Editor 可以打开外部编辑器。个人推荐 Haroopad.

Chrome Extension

离不开 WizNote 和 Evernote 很重要的一点就是 Chrome 插件,在日常使用过程中,在 Chrome 下浏览咨询,工作的时间占用非常高,也经常需要收藏剪切一些资料。这个时候 WizNote 就成为了一个非常重要的资料保存箱。

在很早之前使用 Joplin 的时候,Chrome 插件不是完善,只能够将 HTML 剪切成 Markdown,并且很简陋,不能够满足我的日常使用。而这一次体验,发现 Chrome Extension 已经足够用,能够剪切选中内容,整个网页,截图保存,剪切网址等等,完全的覆盖了日常使用需求。不过有一点需要注意的是,Joplin 的 Chrome 插件是需要本地将 Joplin 开启一个服务的,并不是像 WizNote 先收藏到云端服务器,然后要使用时再从服务器中拉取的。

Terminal

命令行版本的安装也非常简单,界面布局和 GUI 版本相差不大。但是需要注意的是命令行版本和桌面版并不是共用的一套数据集,他们相互是独立的,在桌面版修改,并没有在命令行版本中。

Sync

关于同步是我最想说的,官方提供了 NextCloud,Dropbox,WebDav 等等同步方式,但是我个人推荐 Syncthing,在不同机器上都安装上,在服务器上也安装上,就完美的实现了 Dropbox,NextCloud 单点的问题,即使中心服务器挂了,也能够有多个备份能同步。

Conclusing

如今的 Joplin 已经能够满足日常使用了,所以我会渐渐的将 WizNote 笔记中的内容迁移到 Joplin 中。又将一个闭源产品迁移到开源工具,开心。


2019-10-28 evernote , notebook , joplin , note , note-taking

You quiz on the block 一则小感

总有那么一种节目,总会在不经意之间想起,《You quiz on the block》就是这样一个节目。因为刘在石,一路从无限挑战,Running Man 过来,在看过了太多室内综艺后开始对这个类型的节目有天然的抵制,街头随机采访路人,快速回答问题,最初的时候节目质量并不能维持一定的水准,但是节目在摸索的过程中渐渐进化。从原来的答题渐渐地向街头脱口秀进化,通过每一期不同的主题,将整个一集的进度链接起来。终于在上一期让我又有提起键盘写下这篇的动力。虽然每一次看《You Quiz》都会被生活在世界各个角落的普通人打动,从街头饭店的社长,到独自开理发店的老板,到为了考公务员边打工边学习的大学生,各色各样的普通人编织出不同的人生。而这一期,主题为 That’s Life,在上岩洞附近,在这个有着 25000 名电视台工作人员的地方,聚集着韩国主要的电视放送局,在电视艺能式微的今天,仍然坚守在自己热爱的岗位,淋雨拍摄的 MC,摄像,录音工作人员,熬夜编辑的 PD,后期制作,音效编辑,用一周的时间,给出 90 分钟的节目,周而复始。

或许很多人会被标题或者预告中的金泰浩 PD 和 罗英石 PD 吸引过来,但是真正让我感动的是,这两位令人最近的 PD,都是非常诚恳的普通人。金泰浩 PD 可能有些腹黑,罗英石 PD 可能有些害羞,但他们的成就对于向往 PD 这个职业,对电视台有着美好想象人来说无疑是一种鼓励。或许很多人会和我一样对 MBC 《我的小电视》助理 PD 印象深刻。在刘在石问到她想要成为一个什么样的 PD 时,这位只有着两年工作经历的 PD 说自己想要做那些不仅带来欢笑,也能带来社会意义的节目,像无限挑战一样,这一瞬间突然让我一下子出神了。让我想起了最近在看的 《Argon》,让我想起了《共犯者们》,让我想起了曾经的无限挑战,让我想起了为了新闻自由而奋斗过的各个 PD。可能对于现在的《小电视》来说只是简单的直播放送娱乐节目,但往往越被关注,需要担负的责任也越重,无挑无疑是一档为了搞笑而诞生的节目,但是其作为综艺史上的伟大作品,不仅曾经推动立法,甚至在环境保护等等各行各业给出了自己的态度。曾经追过《无挑》的人不会忘记 MBC 历史上的几次罢工,国内的新闻很少也不会特意的去报道,PD 们在背后的争取我们无从得知,但从他们的作品中我们或许能猜测到,自由的选题,自由的编辑,自由的放送,才让这个节目的名字印在历史上。也让后来的许许多多人向往着 PD 这个职业,即使知道艺能局艰辛,但依然不顾一切。或许这么说显得冠冕堂皇,那用罗英石朴素的答案来回答,当刘在石问成功的秘诀时,罗 PD 说,只是在原来擅长的基础上做一些创新,十年如一日的坚持,从最早的为各个节目打杂的助理,做到如今拥有无数档当红综艺的主 PD,他在背后的付出鲜有人知。也幸好有这样的节目,这样偶然的机会,让罗 PD 自己坐到了摄像机前。在聊天的过程中,这期的公共提问,是受到哪位公众人物的影响。金泰浩说的是刘在石,而罗 PD 说的是姜虎东,对他们赞美最多的就是如何能在这样不停变换的社会中坚持自己的职业,坚持自己的想法,从默默无闻做到如今的国名 MC。我不经想到我自己的生活,从学校步入社会,已经快 3 年,却依然还在徘徊,倒不是止步不前,但却像是在走 8 字,我无法想象往后 10 年,20 年,甚至 50 年。这一期的主题中还包含着 《You Quiz》PD 自己的私心,在如今被各种新兴媒体包围的电视上,如何还能收获足够的眼球,大部分的人早已经不看电视,被身边各种各样的内容包围,时间一旦不抓住就像水一样溜走了。如今也很少节目能真的做到如此用心,如此直白的说自己所面临的问题了。

最后要感谢 tvN 能够让这样一档节目播出,也感谢刘在石能够坚持,才能让我坐在电脑前看到,体验到世界那个角落的人的生活。也感谢制作这几十期内容的工作者们,这一集让我集中的看到了他们背后的付出。


2019-10-26 thinking

WordPress 主题收集

puock

puock 一款开源的,高颜值,自适应的 WordPress 主题,支持白天与黑夜模式、无刷新加载等

Mynote

Mynote 是一个给开发者的 WordPress 主题。特色就是简洁、简单。

YORp

Argon

Argon 是一个简洁大方的主题,还有 Hexo 版本。

Yn4N

Kratos

Kratos 是一个开源的响应式主题

动态加载版本:

Sakura

Sakura 樱花庄的白猫博客主题

Sakurairo

Sakurairo 一个多彩、轻松上手、体验完善,具有强大自定义功能的 WordPress 主题(基于 Sakura 主题,支持简繁英日多语言)

Type

Type 是一款入门的 WordPress 主题。

fjai

CoreNext

CoreNext 是一款使用 Vue 和 Element 混合开发的 WordPress 主题,售价 129 CNY。

P7iS9Z--4x

CorePress Pro

CorePress Pro 一款开源的 WordPress 主题。但是目前也提供两个不同的版本,Free 版和 Pro 版,Pro 版一次性付费 99 元。

WordPress Git

WordPressGit Git 主题,由云落基于 yusi 主题基础上二次开发的一款功能强大具有超强自定义能力的主题。 响应式,短代码,绿色,多彩,双栏,博客主题,小清新,代码高亮,强大,免费主题,CMS 主题,卡片式,图片主题

Independent Publish 2 是一款非常简洁的 WordPress 主题,由 Raam Dev 开发。

主题开发者

Anders Norén 是一位在 Sweden 斯德哥尔摩的设计师和开发者。他在博客上提供了很多免费的 WordPress 模板。

收费主题

ASTRA

ASTRA 是一个轻量,简介,快速的 WordPress 主题,高度可订制化。也可以通过此主题将网站快速转变成一个在线商城。

  • Astra Pro 49 USD
  • Essential Toolkit 79 USD

样例

Blocksy

blocksy 是一款非常强大的主题。

B2 主题

B2 主题是一款非常不错的商业用主题。

Cosy

Cosy 是一款付费主题,售价 699 CNY。

DUX

DUX 是一款商业化比较成功的主题,售价 799 终身。

themebetter 主题对 SEO 非常友好,国内流量前几的主机测评网站,都是使用 DUX 主题。

jnews

jnews 是一款适合内容发布者的 WordPress 主题,非常容易就可以用它来打造一个视频分享网站,付费阅读站, 播客站点。

Begin 主题

Begin 主题 知更鸟定制主题,售价 299 RMB。

Yse2

RiPro-V2

RiPro-V2 是一个 RiPro 主题的全新升级重构,首页拖拽布局,高级筛选,自带会员生态系统,超全支付接口。

适合资源,源码站点。599 RMB 购买 VIP 后使用。

XIU

XIU 主题,支持百度收录推送,评论算术验证码,适用于图片展示、多元化图片新闻展示、个人博客、资源分享站,扁平化设计、简洁风、全面 SEO 优化、多重列表展示方式

zibll 子比主题

zibll 是一款 WordPress 商城主题。包含付费商城,VIP 会员,社区论坛,用户权限等等功能。

Grace

Grace 主题是一款自适应的 WordPress 博客主题。目前的版本有 Grace 8.0


2019-10-24 wordpress , themes , php , design , blog

记一次修复安装 Magisk 模块后的 bootloop

昨天看到系统通知有 Android 10 的 OTA,就顺手把系统升级了,也知道可能有些 Magisk Module 不兼容,所以把所有的 Module 都先关闭了,升级的过程倒是非常顺利。所以也就没有多想就依次想试试 Magisk 模块能不能启用,尤其是 EdXposed。可是就是没有想到这个启用让手机停留在了 OnePlus 的开机 Logo 无限开机中。这个问题倒也不是很大,之前也就遇到过,只要刷入一个 uninstall 的包就可以了。所以就想要进入 recovery。

这里插入一下一加的几个组合按键。

  • 在开机状态下 Volume Up + Boot 按键长按可以强制关机
  • 在关机状态下 Volumn Down + Boot 按键长按可以进入 recovery 模式
  • 在关机状态下 Volumn Up + Volumn Down + Boot 三个按键同时按住可以进入 fastboot 模式

因为之前就刷入了 TWRP 的 recovery 所以也不是很怕,但是当我进入 TWRP 的 recovery 的时候,我发现 TWRP 没有要求我输入 PIN 密码,并且进入后也无法加载 data 分区,所以手机内部的所有内容都无法读取,这一下就有点慌了,因为我不想丢失数据。经过一番搜索,尝试了重新刷 boot.img,后来发现 Android 10 的 TWRP recovery 可能需要升级,所以在 xda 上找到了 unofficial 的 Android 10 的 recovery,刷入后果然能够解锁了。

然后再把 Magisk 的 uninstall 的包刷入,开机果然就没事了。然后不甘心,从头开始,重刷了最新的 TWRP 3.3.1-xx Unified Unofficial by mauronofrio,然后刷入 Magisk,不过没有启用任何 Module,然后一个个尝试启用 Module,果然 EdXposed 启用之后还是会卡在 Logo,但是这个时候我就不需要重新刷入 uninstall magisk 的包了,我只需要进入 recovery.

  • 进入 TWRP
  • Advanced > File Manager > data > adb > modules
  • 然后找到对应新安装的 module,进入文件夹,然后点击右下角的勾
  • 在弹出的对话框中选择 Delete

再重启进入系统即可。

reference


2019-10-20 magisk , oneplus-7-pro , android , recovery , root

Java 类加载器

虚拟机把描述类的数据从 Class 文件加载到内存中,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的 Java 类型,这就是 Java 虚拟机的类加载机制。

类加载的时机,整个生命周期包括:

  • Loading
  • Verification
  • Preparation
  • Resolution
  • Initialization 初始化
  • Using
  • Unloading

其中 Verification, Preparation, Resolution 三个部分称为 Linking。

四种情况必须对类进行“初始化”。

  • 遇到 new, getstatic, putstatic 或者 invokestatic 四条字节码指令时
  • 使用 java.lang.reflect 包方法对类进行反射调用时
  • 初始化类时,如果发现其父类没有初始化,则需要先触发其父类的初始化 auto
  • 当虚拟机启动时,用户需要指定一个执行的主类(包含 main 方法的那个类),虚拟机会初始化这个类

Loading

虚拟机会:

  • 通过一个类的全限定名获取定义此类的二进制字节流偶 iu
  • 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
  • Java 堆中生成一个代表这个类的 java.lang.Class 对象,作为方法区这些数据的访问入口

Verification

Linking 的第一步,为了确保 Class 文件字节流中包含的信息符合当前虚拟机的要求,并且不会危害到虚拟机自身的安全。

文件格式验证

验证字节流是否符合 Class 文件格式规划。

元数据验证

字节码描述的信息进行语义分析,以保证符合 Java 语言规范。

字节码验证

进行数据流和控制流分析。

符号应用验证

符号引用验证的目的是确保解析动作能正常执行,如果无法通过符号引用验证,会抛出一个 java.lang.IncompatibleClassChangeError 异常的子类,比如 java.lang.IllegalAccessError, java.lang.NoSuchFieldError, java.lang.NoSuchMethodError 等等。

Preparation

准备阶段正式为变量分配内存并设置类变量初始值的阶段,这些内存都将在方法区中进行分配。这个阶段中有两个容易产生混淆的概念,这个时候进行内存分配的仅仅包括类变量(被 static 修饰的变量),不包括实例变量。实例变量将会在对象实例化时随着对象一起分配在 Java 堆中。其次初始值“通常”指的是数据类型的零值。

public static int value = 123;

那么变量 value 在准备阶段后,初始化为 0 而不是 123. 但是

public static final int value = 123;

编译时 Javac 将会为 value 生成 ConstantValue 属性,在准备阶段虚拟机就会根据 ConstantValue 设置,将 value 值设置为 123.

Resolution

虚拟机将常量池内的符号引用替换为直接应用的过程。

初始化

到初始化阶段,才真正开始执行类中定义的 Java 程序代码。

初始化阶段是执行类构造器 clinit() 方法的过程。

双亲委派模型

Java 虚拟机角度,只存在两种不同的类加载器:

  • 启动类加载器 Bootstrap ClassLoader , C++ 实现
  • 其他类加载器,Java 实现,独立于虚拟机之外,继承抽象类 java.lang.ClassLoader.

工作过程,如果一个类加载器收到类加载的请求,将这个请求委派给父类加载器完成,每一个层次的类加载器都如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有当父加载器反馈无法完成这个加载请求时,子加载器才会尝试自己去加载。 实现双亲委派的代码都在 java.lang.ClassLoader 的 loadClass() 方法中。


2019-10-16 java , class , class-loader , jvm

解压和打包 jar 并手动上传到 Nexus 记录

解压和打包 jar 包,使用如下的方式。

unpack

jar xf filename.jar

pack

jar cf filename.jar path/to/dir

手动上传到 nexus

将打包好的 jar 包上传到 Nexus

mvn deploy:deploy-file -DgroupId=my.group.id \
	-DartifactId=my-artifact-id \
	-Dversion=1.0.1 \
	-Dpackaging=jar \
	-Dfile=realfilename.jar \
	-DgeneratePom=true \
	-DrepositoryId=my-repo \
	-Durl=http://my-nexus-server.com:8081/repository/maven-releases/

记住这里的 repositoryId 一定是 ~/.m2/settings.xml 文件中的 ID, 另外 url 也要区分一下 releases 和 snapshots.

<servers>
  <server>
	<id>my-repo</id>
	<username>admin</username>
	<password>admin123</password>
  </server>
</servers>

reference


2019-10-12 nexus , jar , maven , java

在 Linux 上测试硬盘读写速度

记录一下在 Linux 下测试硬盘读写速度的命令和方法。

dd

使用 dd 测试写速度,千万有注意 of 后接的文件必须是一个不存在的文件,否则可能造成数据丢失!

sync; dd if=/dev/zero of=/tmp/tempfile bs=1M count=1024; sync
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 2.55331 s, 421 MB/s

同样的道理,如果要测试一个外部存储,需要知道挂载点,然后用 dd 命令:

sync; dd if=/dev/zero of=/media/user/MyUSB/tempfile bs=1M count=1024; sync

使用 dd 测试读取速度,注意这里的 if 后需要接上一个命令生成的文件:

dd if=/tmp/tempfile of=/dev/null bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 0.271083 s, 4.0 GB/s

清楚 cache,准确的测试真实的读速度:

sudo /sbin/sysctl -w vm.drop_caches=3
dd if=/tmp/tempfile of=/dev/null bs=1M count=1024

hdparm

使用 hdparm 也可以对硬盘进行测试。

apt install hdparm

先用 lsblk 或者 fdisk -l 来查看设备信息,一般磁盘都是 /dev/sda 这样。

然后用如下命令测试:

sudo hdparm -Tt /dev/sda

/dev/sda:
 Timing cached reads:   31236 MB in  1.99 seconds = 15733.75 MB/sec
 Timing buffered disk reads: 504 MB in  3.01 seconds = 167.51 MB/sec

reference


2019-10-11 linux , dd , hdd , ssd

Syncthing 又一款同步工具

昨天在整理同步工具的时候接触到了 [[Syncthing]],简直秒杀了我现在使用的任何同步工具,所以不得不花一些篇幅来记录一下。

在看到 Syncthing 的介绍时,就非常好奇它的同步原理。也幸亏它的官方文档也有非常详细的 QA

几个比较重要的点:

  • 和 BitTorrent/Resilio Sync 的区别在于,Syncthing 开放源代码,使用开放协议,避免 Resilio Sync 闭源协议的安全问题
  • Syncthing 的同步原理,和 BT 类似,会将文件分片传输,当越多设备在线,那么共享速度越快
  • Syncthing 依赖于一个全局发现服务器,用来通过 Device ID 来发现设备 IP 和 端口,任何人都可以自己架设全局 Discovery 服务器,然后将自己的节点指向该服务器,这样就不必共享全局的服务器了,更甚至不需要依赖与因特网就能够实现局域网内文件同步
  • 关于安全性的说明 已经列举的非常详细了,所有内容通过 TLS 加密传输

下载安装

下载及安装过程不再赘述,官网已经非常详细了。

在 Ubuntu 下安装

Docker 安装

使用 Linuxserver 的镜像安装:

端口

Syncthing 有个端口需要注意一下

  • 8384 端口是网页 GUI 监听端口,默认监听 127.0.0.1
  • tcp://0.0.0.0:22000 服务监听地址
  • udp://0.0.0.0:21027 本地发现服务端口

配置文件

在 Unix 下在 $HOME/.config/syncthing

vi ~/.config/syncthing/config.xml

然后修改本地监听地址从 127.0.0.1 到 0.0.0.0.

设置 Syncthing 开机启动

如果熟悉 supervisord 可以使用官方提供的文档配置,如果在 Linux 下可以尝试使用 Systemd

sudo systemctl enable syncthing@yourname.service
sudo systemctl start syncthing@yourname.service

记得把 yourname 替换成用户名。

Syncthing 服务启动后端口是 8384.

推荐理由

推荐的理由:

  • 无需额外的服务器资源,以前使用 NextCloud 的时候,有一个很不方便的便是需要保证服务器 24h 不停地在线,放在家里 NAS 如果遇到停电就很不方便
  • 同步速度非常快,使用中心化的同步服务,中心服务器的网速限制了同步的速度,如果客户端越多速度越慢,但是 Syncthing 做到了点对点传输,也就意味着客户端越多那么同步速度越快,因为这一个节点的文件内容可以并行分片的从不同的节点获取
  • 丰富的客户端,除了 iOS 没有官方支持,三大桌面端,Android,路由器,NAS 几乎都有支持,因为 Go 写的嘛
  • Syncthing 完美的替换了 Dropbox 等等服务

Syncthing 配置本地 Discovery 服务器

有一种情况是,加入只想要在本地局域网中传输数据,那么可以关闭全局 Discovery 服务器,然后在设置中手动指定某一态服务器的 IP 和 端口,而不是使用默认的 dynamic。这样所有的数据就会在本地传输。

Syncthing File Versioning

Syncthing 支持文件的版本控制,当从 cluster 同步,删除或者同步一个新版本之后备份之前的老版本。File Versioning 是每一个文件夹,每一个设备可以单独控制的。默认情况下是 「No File Versioning」,也就意味着本地不回保存远程设备删除的文件。

Syncthing 有好几种文件版本控制策略:

  • Trash Can File Versioning
    • 模拟通常的垃圾箱的处理机制,当文件在远程设备上被删除或代替的时候,会将其移动到 .stversions 文件夹的垃圾箱中,如果垃圾箱中已经存在同名文件,将会被替换
    • 当配置 Trash Can 策略的时候可以设置清理天数,如果配置正数,则文件在设置天数之后会被清除,如果设置 0,则不会清理
  • Simple File Versioning
    • 当设置成该策略时,如果文件被远程设备删除或替换,文件将被移动到共享文件夹的 .stversions 文件夹中。选择此策略之后还可以设置“保留版本”选项,告诉 Syncthing 应该保留该文件的旧版本数量。例如,如果将此值设置为 5,则在远程设备上替换文件 5 次时,在共享相同文件夹的.stversions文件夹中将看到 5 个带有时间戳的文件版本。
  • Staggered File Versioning
    • 当远程设备上的文件被替换或删除时,文件也会被移动到不同的文件夹(就像“简单文件版本”一样),但是,如果版本超过了最大年龄或超过了间隔中允许的文件数量,则会自动删除版本。
    • 这种版本控制策略可以指定历史版本存储的位置,默认位置为文件夹路径中的 .stversions 文件夹。如果设置自定义版本路径,请确保它位于与共享文件夹路径相同的分区或文件系统上,否则移动文件可能会失败。您可以使用绝对路径(推荐)或相对路径。相对路径是相对于 Syncthing 当前或启动目录解释的。
  • External File Versioning
    • 这种版本控制策略是将 Syncthing 的版本控制交由外部的程序决定

Syncthing 使用过程中的一些问题

发送和接收模式

Syncthing 支持三种工作模式:1

  • 发送和接收,Send & Receive Folder,这是文件夹的默认模式,对文件夹的修改会发送,其他设备的修改也会同步回来
  • 仅发送 Send Only,这种模式表示仅仅将当前设备上的文件夹的改动发送到其他设备,用来隐式地表示其他同步设备上的文件不会被修改,或者其他设备上的修改可以被忽略。这种模式非常适合,将当前设备设定为工作设备,然后设定一台设备作为此设备的备份。
    • 在 Send Only 模式下,集群中其他设备的修改都会被忽略,修改依然会接收,文件夹可能会出现 「out of sync」,但是没有修改会被应用到本地
    • 当 Send Only 文件夹出现 out of sync,那么一个红色的 Override Changes 会出现在文件夹详情中,点击该按钮会强制将当前主机的状态同步到其他剩余节点。任何对文件的修改,都会被当前主机上的版本所覆盖,任何不存在于当前主机节点的文件都会被删除,其他类似
  • 仅接收 Receive Only,这种模式下所有的修改都会被接收并应用,然后重新分发给其他使用 send-receive 模式的设备。但是本地的修改不会被分发给其他设备。这种模式适合于建立备份镜像(replication mirrors),或者备份目的主机的场景,这些情况下不期望有本地修改或者本地的修改是不允许的
    • 当本地文件被删除时,Syncthing 会显示一个 Revert Local Changes 按钮。使用这个按钮会将本地的修改回撤,所有添加的文件会被删除,修改或删除的文件会重新从其他节点同步

比较容易理解,但是假如 A 设备设置仅发送,B 设备设置发送和接收,A 是不会同步 B 的更改的!

.stignore

忽略列表,和 gitignore 类似。每一台设备上的 .stignore 都是分别设置的,不会进行同步。

如果 A 的.stignore忽略了 test ,而 B 没有这样做,实际上会发生这样的事情:

  • A 不会扫描和通知 B(广播)关于 test 的变动;
  • B 对关于 test 的变动持开放的姿态,但不会收到任何关于 A 上面 test 的变动信息(可能接收到其它同步设备的);
  • B 会扫描 test 以及推送其关于 test 变动的信息,但会被 A 忽略,A 也会忽略其它同步设备关于 test 的信息;
  • B 会接收来自其它同步设备推送的关于 test 的信息;

这里有一个小提示,因为 .stignore 文件是不会同步的,每个设备都需要自行设置。如果想要同步这个配置,那么可以先创建一个 .globalstignore 文件,把需要忽略的内容写到这个文件中,然后在 Syncthing 中配置:

#include .globalstignore

一份常用的 .globalstignore:

//---Mac-specific---//
//Mac Comments, Finder Windows Size, Tags, ...
(?d).DS_Store
.DocumentRevisions-V100
//Mac Folder Icons, which will not sync to Windows
(?d)Icon*
.Spotlight-V100
.TemporaryItems
.Trashes
.fseventsd
(?d).localized
//Mac Temporary iCloud files while synching
.iCloud
//Mac OS Metadata on Windows or Linux filesystems
(?d)._*

//---Windows-Specific---//
(?d)desktop.ini
(?d)Thumbs.db
(?d)$RECYCLE.BIN
*.lnk

//---Linux-specific---//
.Trash-*

//---QNAP-specific---//
(?d).@__thumb
(?d).AppleDB

//---Synology-specific---//
(?d)@eaDir

//---Application-specific---//
//-Syncthing
(?d).stignore
(?d).stfolder
//-vi(m)
(?d)*.*.sw[a-p] # Thankys to Tom Hale!
//-Dropbox
.dropbox
.dropbox.attr
//-Microsoft Office temporary files/lock files
(?d)~*
//-KDE
.directory

//---OTHER---//
Microsoft-Benutzerdaten
Notizbuch von Wolf.url
Outlook-Dateien
RDC Connections
.parallels-vm-directory
Default.rdp

同步状态

管理后台显示的最后更改(Lastest Change)是指的,根据【别人的变动】【对自己做修改】的情况和时间。或许用英语来解释稍微易懂一些, The “Latest Change” on the folder only shows incoming changes.

管理后台显示的最后扫描或者 Last Scan 是指对【自己的目录】最后扫描的时间。

管理后台显示的 Out Of Sync 或者未同步指的是「尚未接他方推送的变动」,如果已收到对方关于变动的通知,但因为下载问题或者.stignore的设定而未能下载这些变动,就会出现这个情况。

Override Changes

Override Changes 或者撤销变动,中文译法有些不准确。出现这个提示的原因通常是设为仅发送的一方(A,master)认为自己的资料是最新的,认为对方(B)推送的变动是应该被撤销的,即使 B 关于特定资料的修订时间要晚于本地;点这个按钮会强迫 B 对方撤销自己的变动,以其收到的 A 的版本为准更改资料。

228/SECCOMP

当我在一台比较老的机器上安装 Syncthing, systemd status 发现无法启动 Syncthing,查看日志说是:228/SECCOMP 错误。

这个时候需要修改 sudo vi /lib/systemd/system/syncthing@.service,并将其中两行注释。

# SystemCallArchitectures=native
# MemoryDenyWriteExecute=true

然后重新 sudo systemctl daemon-reload,并重新启动 Syncthing:

sudo systemctl start syncthing@einverne.service

inotify limit

增加 inotify limit

添加到配置(重启后生效):

echo "fs.inotify.max_user_watches=204800" | sudo tee -a /etc/sysctl.conf

立即生效可以配置:

echo 204800 | sudo tee /proc/sys/fs/inotify/max_user_watches

Introducer 配置

在 Syncthing 的 Remote Devices 中会看到一个 Introducer 的配置,通过简单的配置选项大概能知道其作用就是用于自动添加新设备(节点)。但是 Syncthing 是以一个什么逻辑来 Introduce 新设备并没有深入的了解,这里就整理一下官方文档中关于 Introducer 部分的内容。

当两个设备连接的时候,他会会交换一个相互分享的文件列表以及设备连接到哪些共享文件夹。比如:

本地设备 L 设置了远程设备 R 作为一个 Introducer。 他们共享文件夹 “Pictures”,设备 R 还和 A 和 B 共享 “Pictures” 文件夹,但是 L 仅仅和 R 共享。 那么一旦 L 和 R 连接了,L 会自动添加 A 和 B 设备,就像 R 向 L 介绍了 A 和 B 一样 远程设备 R 和设备 C 共享 “Videos” 文件夹,但是没有和本地设备 L 共享。那么设备 C 不会被添加到 L ,因为 C 并没有和 L 和 R 的任何文件夹相连。

设备和设备的 Introduce 的过程包含着设备 IDs,标签,地址设置的自动配置,但是不包含设备本地的相关设置。设备的自动配置,仅会在连接到 Introducer 之后,或者重启时被应用一次,当设备连接到介绍器时就会完成。一旦完成自动配置,设备的设置将无法从 Introducer 那里收到任何更新。

当一个 introducer 添加或移除设备,或者修改共享文件夹,或者修改设备分享设定,这些修改会在下一次连接时被应用到设备。类似的,如果一个被介绍的设备不再出现,或者不再 fxl 共同的文件夹,该设备会自动在下一次连接是从集群(cluster)节点中被移除。

Introducer 状态是传递的,这意味着,Introducer 的 Introducer 也会成为 Introducer。

将两个设备相互设置成 Introducer 是不推荐的。当添加设备,移除设备时可能会造成问题,两个设备会相互不停的 re-introducing 移除的设备。

移动 Syncthing 同步文件夹位置

当发生空间不足,或者想要移动同步文件夹位置的时候。可以通过如下步骤完成:

  • 在 Syncthing 管理后台将文件夹移除
  • 然后在系统中移动文件夹内容
  • 在 Syncthing 后台将文件夹添加,并指定为新的位置。

建议只在同步完成的文件夹中操作。

reference


2019-10-11 syncthing , sync , tools , linux , cross-platform , application

同步工具整理总结

陆陆续续用过不少同步工具,资料备份,各个设备间同步文件,从商业化的工具到命令行工具,但总还是一直在寻找一款足于满足我所有需求的工具。这里就整理一下,顺便整理一下我自己的思路。不久前就一直在思考一个问题,数字文件的生命有多长,以前看到过一句话,几十年前父母写下的日记如今依然能从旧书柜中翻出,数十年前的胶卷照片依然还很清晰,但往往几年前的网络文章,或者数字照片可能如今随着网络服务的关闭,物理硬盘的损坏而无法恢复。有人尝试使用多地备份,有人尝试云服务备份,却都无法从根本上解决这个问题,当然现在的我依然没有办法完全的解决这个问题。

目前我从两个方面来规避这个问题,一方面物理备份一份,一方面网络存储一份。虽然可以从大部分情况下解决一些问题,不过并不能保证 100 % 数据安全。

中心化的同步工具

中心化的同步工具就像是那个时候的 SVN,使用体验完全依赖于中心服务器,网速,磁盘大小都决定了最后的使用体验。

Dropbox vs pCloud vs NextCloud

最早接触到同步工具应该就是 Dropbox 了,PC 上,手机上都是使用 Dropbox 来同步的,并且我的 Dropbox 利用率一直都还是很高。但是 Dropbox 因为网络问题原因,有些时候可能会比较慢。所以一直作为保留项目。

在 Dropbox 之后,也用过 pCloud 不过也并没有深度使用。

之后就是尝试在 VPS 上建了 NextCloud,然后买了 NAS 之后把内容备份到了 NAS 上,并且开始深度使用 NextCloud

不过以上这些工具都有一些问题,比如我都只用来同步一些相对比较小的文件,比如文件,图片,文档等等内容。因为受到同步服务器容量的限制,所以有些文件我会有意识的不同步。

去中心化的同步服务

去中心化的服务有很多,这些年陆陆续续也都用过很多。就我个人而言,如果使用命令行,我会用 rsync, 如果要有一个比较友好的界面,我会用 Syncthing。

Rsync

rsync 之前的文章 已经提到过,很多使用方法那篇文章中也有提及,这里就不赘述了。

unison

unison 没怎么用过,但是 unison 经常被用来和 rsync, syncthing 一起比较,想必也有他的过人之处。

Resilio Sync

曾经用过很长一段时间,说是去中心化的,但是国内把中心服务的节点屏蔽之后就很难连接上其他地址了,所以后来就放弃了。不过 NAS 上还一直留着,使用起来也非常不错。

如果想要分享只读大文件给很多人,不妨体验一下。

VerySync

之前也有写过一篇文章 威联通上使用 verySync,但是这个同步工具毕竟还是用的人少,并且还是国产闭源应用,可信度不高。作为 Resilio Sync 的国产代替品使用。

Syncthing

开源,跨平台,Go 语言编写,其他就不用多说了。这可能是这一次整理收获最大的一个工具。

添加 Linux 启动项,可以参考官方的文档,非常详细

这个工具足以代替 Dropbox 完成同步任务,支持增量备份,支持版本管理,各个平台都有完美的解决了同步的问题。

Other

insync 是一个可以将本地文件夹和 Google Drive 同步的工具,收费

GoodSync 又一款同步工具,支持很多平台,不过有些功能需要收费。

reference


2019-10-10 sync , tools , linux , rsync , btsync , syncthing

lsb init scripts

I found someone submit a pull-request to redis, which modify the init.d script. The modification make me curious about the init script. So this is the research result.

LSB stand for Linux Standard Base.

LSB-compliant init scripts need to:

  • provide, at least, the following actions: start, stop, restart, force-reload, and status.
  • return proper exit status codes
  • document runtime dependencies
  • [optionally] Log messages using the Init.d functions: log_success_msg, log_failure_msg and log_warning_msg

    #!/bin/sh ### BEGIN INIT INFO # Provides: scriptname # Required-Start: $all # Required-Stop: # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Start daemon at boot time # Description: Enable service provided by daemon. ### END INIT INFO

解释:

  • Provides 可识别名字
  • Required-Start 启动此程序前要先启动那个项目
  • Required-Stop 在哪一个项目前停止,可留白
  • Default-Start 在哪些 run level 下启动程序 ,比如 2 3 4 5
  • Default-Stop 在哪些 run level 下停止此程序,一般 0 1 6

几个虚设项目,以 $ 开头

  • $local_fs 本地文件系统被挂载,用到 /var 目录的启动项都需要依赖此
  • $network 网络被启用
  • $named 名称功能被启用
  • $remote_fs 所有文件系统被挂载,包含 /usr
  • $syslog 系统记录功能启用
  • $time 系统时间被设定
  • $all 所有项目

一般的 daemon 应该依赖 $remote_fs$syslog ,核心模块驱动程序等,需要依赖 $local_fs

Edit

/etc/init.d 目录下有一个 skeleton 文件,可以以此作为文件的基础来进行编辑。

Actions

一个脚本需要提供 start, stop, restart, force-reload, status 这几个动作。

reference


2019-10-09 lsb , init , debian , ubuntu , linux , startup , script

电子书

本站提供服务

最近文章

  • Dinox 又一款 AI 语音实时转录工具 前两天介绍过 [[Voicenotes]],也是一款 AI 转录文字的笔记软件,之前在调查 Voicenotes 的时候就留意到了 Dinox,因为是在小红书留意到的,所以猜测应该是国内的某位独立开发者的作品,整个应用使用起来也比较舒服,但相较于 Voicenotes,Dinox 更偏向于一个手机端的笔记软件,因为他整体的设计中没有将语音作为首选,用户也可以添加文字的笔记,反而在 Voicenotes 中,语音作为了所有笔记的首选,当然 Voicenotes 也可以自己编辑笔记,但是语音是它的核心。
  • 音流:一款支持 Navidrom 兼容 Subsonic 的跨平台音乐播放器 之前一篇文章介绍了Navidrome,搭建了一个自己在线音乐流媒体库,把我本地通过 [[Syncthing]] 同步的 80 G 音乐导入了。自己也尝试了 Navidrome 官网列出的 Subsonic 兼容客户端 [[substreamer]],以及 macOS 上面的 [[Sonixd]],体验都还不错。但是在了解的过程中又发现了一款中文名叫做「音流」(英文 Stream Music)的应用,初步体验了一下感觉还不错,所以分享出来。
  • 泰国 DTV 数字游民签证 泰国一直是 [[Digital Nomad]] 数字游民青睐的选择地,尤其是清迈以其优美的自然环境、低廉的生活成本和友好的社区氛围而闻名。许多数字游民选择在泰国清迈定居,可以在清迈租用廉价的公寓或民宿,享受美食和文化,并与其他数字游民分享经验和资源。
  • VoceChat 一款可以自托管的在线聊天室 VoceChat 是一款使用 Rust(后端),React(前端),Flutter(移动端)开发的,开源,支持独立部署的在线聊天服务。VoceChat 非常轻量,后端服务只有 15MB 的大小,打包的 Docker 镜像文件也只有 61 MB,VoceChat 可部署在任何的服务器上。
  • 结合了 Google 和 AI 的对话搜索引擎:Perplexity AI 在日本,因为 SoftBank 和 Perplexity AI 开展了合作 ,所以最近大量的使用 Perplexity ,这一篇文章就总结一下 Perplexity 的优势和使用技巧。