个好的笔记系统,应该能把你所学习到的任何资料串联起来,形成一个知识系统,在你需要他们的时候,可以很容易找到,进而形成自己新的知识。
我在《用OneNote管理你的知识》这篇文章中介绍了如何用OneNote管理各种资料,虽然OneNote已经做的非常好了,依然存在以下问题无法达到我的要求:
这些问题开始驱使我寻求新的解决方案,新方案应该满足以下需求:
经过一番查找对比后,最终找到两个可以满足我需求的工具,Emacs orgmode和Tiddlywiki。虽然wiki工具非常多,比如Wikipedia使用的mediawiki之类,但这类系统过于庞大,要运行起来也很麻烦。
提到笔记系统,Emacs的orgmode总是绕不过去,当你想要找一个个人笔记系统的时候,在网上很容易看到大家对orgmode的盛赞,甚至很多人花长时间学习Emacs也是为了用orgmode。
orgmode神奇的魔力在这篇文章中体现的淋漓尽致:Org Mode - Organize Your Life In Plain Text!。简单来说,作者使用orgmode管理了他人生中的方方面面,比如写作系统、待办事项提醒、笔记系统等。得益于Emacs强大的定制开发能力,几乎你的一切需求都可以通过编写一些函数去扩展,这种扩展能力比VSCode/Vim/Sublime Text的插件系统等要强大的多。可以说,除了学习难度高,几乎没啥缺点了。它有以下特点:
Tiddlywiki是一款独特的非线性笔记本,用于捕获、组织和分享复杂信息。其设计思想是将信息通过一种名为Tiddler的单元分割,利用它们之间丰富的关系模型,从而最大化信息的可复用性。 然后,通过聚合和构思来把片段编排在一起,以呈现具有叙述性的故事。
它具备以下特点:
在这里可以看到一些人对这两个工具的对比评价。在花了几天时间学习了orgmode之后,我被它复杂强大的能力劝退了,所有选择了Tiddlywiki。
Tiddlywiki的使用和运行是极其简单的,就这点秒杀了orgmode。在这篇Learning文章中,你可以花费十几分钟了解下它的基本知识。
在上图右侧点击+号新增一个条目后:
右侧红色的保存按钮点击了后,你会发现直接下载了一个名为tiddlywiki.html的文件,用浏览器打开后,会发现和你刚才在网上的tiddlywiki一摸一样。当你再对这个本地tiddlywiki进行一番操作保存后发现它又给你下载了一个tiddlywiki.html,也就是说每当你保存的时候,都会通过下载副本的形式保存,因为它在浏览器中运行,不具备自己更新自己的能力,这种可以通过一个chrome的app来解决,下载tiddly-chrome-app,然后用此chrome app加载tiddlywiki.html即可自动更新了,当然也可以通过搭建Nodejs环境来实现自动保存,不过最简单的还是这种方式。
需要注意的有以下几点:
Capture是一个笔记系统很重要的能力,这方面OneNote做的很好,但是tiddlywiki做的却不好,不过可以有一些方法来解决。让我们先来重新思考下一个笔记记录的过程:
当我在用OneNote的时候,对于微信中的文章,我一般直接通过发送到公众号去保存,然后就忘了这个事情。而对于电脑端看到的一些资料,我会直接复制到OneNote中去。在某些时候我会整理一下这些资料,但是大多数它们就被遗忘了,甚至当我需要的时候,我都不记得之前保存过这些资料。
在这个场景中,暴露了以下这几个问题:
因为tiddlywiki本质是个网页,无法像OneNote一样可以直接复制一篇文章到里面去,而且这种复制手法会导致你的笔记越来越大,找寻有效信息变得越来越难。所以这本质是个习惯问题,资料必须被二次处理后才能进入笔记系统中,否则这个存储毫无意义,只需要存放一个链接即可了。
经过一些思考,我制定了自己资料长期归档的方式:
在我的Capture方案,对于网上阅读的一些资料,考虑到互联网信息丢失的速度,大部分文章存活的寿命并不长,为了能长期保存,我会把这些网页使用Wayback Machine备份,这样再也不会丢失了,我只需要把它的链接存储起来即可,对于需要单独存储的资料可以存放到笔记系统中。对于需要存储的图片,我会存放到AWS S3中,然后引用其链接即可,当然这类云存储方案很多,你也可以选择国内七牛云(需要域名备案)等。
20多年的历史,互联网的记忆,数字图书馆,网站时光机。这是一个非商业的项目,创立目的就是给整个互联网的网站做不停的备份,目前已经有4500多亿的缓存页面了,在这个网站你可以看到很多网站的历史,像时光机一样穿梭在网站的不同历史版本中去。
它具备以下能力:
在Markdown文档中当你想把网页的图片黏贴过去是件很麻烦的事情,首先你要把图片下载到本地(引用网页图片地址不太好,图片可能会神秘消失),然后在文档中使用相对路径引用这个图片,当图片很多的时候,这是个非常痛苦的过程。
能不能做到复制网页图片后,在VSCode中黏贴后自动插入一个S3的链接到Markdown文档中去呢?我找到一款插件,可以做到一键上传七牛/GitHub/sm.ms等,但是它没有提供S3的支持,所以我fork后加了这个功能,如果你也需要这个功能的话,可以在这里下载安装: markdown image paste
有了这个插件后,写wiki/md文件遇到图片复制后黏贴进去自动插入S3链接,这样图片永远存放到你的S3账号中去,还自带全球CDN加速。
公共wiki是重新整理后的知识资料集合,其中非文本的资源如图片、PDF、Office格式文件、Keynote等存放至Amazon S3/Aliyun OSS等云服务,网页等内容的快照可使用Wayback Machine备份,然后将这些链接存放至wiki系统。
wiki资料通过GitHub公共仓库托管,通过netlify生成静态网站。
我的wiki网站就是通过netlify自动发布,每次更新wiki后,push到GitHub,netlify自动发布,这个过程只需要不到十几秒。
私人备忘和工作涉及的私有非公开的资料集合,其中非文本的资源如图片、PDF、Office格式文件、Keynote等存放至Google Drive/Microsoft OneDrive。然后将这些链接存放至私有Markdown文件中,通过GitHub私有库托管。
密钥等信息通过1Password托管,重要的资料制作成md文件后通过Google Drive/Microsoft OneDrive等托管,经常需要的重要的资料可通过手机备忘录加密存放。
References
1.https://www.slant.co/versus/5116/8769/~tiddlywiki_vs_org-mode
2.https://github.com/bmpi-dev/wiki.bmpi.dev
3.https://web.archive.org/web/20191230143823/https://gigaom.com/2012/09/19/the-disappearing-web-information-decay-is-eating-away-our-history/
4.https://aws.amazon.com/cn/s3/
5.https://en.wikipedia.org/wiki/Wayback_Machine
6.https://wiki.bmpi.dev/#wayback%20machine
文/ThoughtWorks马大伟
在构建面向企业项目、多端的内容聚合类在线服务API设计的过程中,由于其定制特点,采用常规的restful开发模式,通常会导致大量雷同API重复开发的窘境,本文介绍一种GraphQL查询语言+网关编排联合的实践,解决大量重复定制的问题。
早期与车厂合作过程中,基于高德已有的数据、引擎能力和一些较为重要的相关CP服务(如停车场、加油站、天气等),形成的在线服务协作模式是针对客户需求,采用REST API提供针对每个车厂、每个项目以及每个终端提供不同的API实现,然而数据核心独立服务实际上就有十余种,然而由于车线业务维护周期长,定制多,2-3年下来,API规模已达几百个,而且持续发散级增长,这给持续开发和维护带来不小挑战。
分解业务开发过程,无非两类工作,业务需求能力数据的获取和非业务诉求但是必不可少的如鉴权等通用化能力,当前来看,其实这两个问题是几乎所有业务团队都会遇到的问题,因此解决方案也基本类似,如服务聚合、流程编排、API网关等。
本文简要介绍下车联网在线服务改造旧架构的一些实践。
车线业务在线服务旧架构如下:
面临以下问题:
针对上述问题,主要从以下几个方面思考改进:
下面分别介绍。
实现稳定、独立演进的原子能力服务
对已有的服务进行梳理,抽象出不同应该独立开发、部署演进的核心能力,对于引擎能力没有什么工作,重点是对于一些历史对接的外部CP,主要实现以下目标:
这部分工作主要是解决历史遗留的一些服务组合不合理,跟随业务过度定制的问题。
定制代码开发转换为定义查询语句
这里主要目的就是将服务聚合、定制逻辑等原来需要的代码开发转换为编写查询语言的方式实现,只需要编写出声明式的查询语句即完成服务发布,特性如下:
本文选择GraphQL作为查询语言基础,然而,直接采用GraphQL有这样两个主要问题需要解决:
需要通过嵌入简单的DSL实现:
这里嵌入DSL需要控制好度,因为DSL如果过于复杂,那么,使用者或者发布者无法快速写出查询的话,对比写代码提效就会打折扣,偏离本来的价值,所以基本原则是简单、可扩展。
由于之前每个API的定制开发基本所有功能混合在一起,能复用部分就是鉴权提供装饰器,常规性的响应格式定制提供一些工具函数,任何需求变更都需要变更代码,走发布流程,有了上面第一步的改造,这个步骤期望将非业务数据部分的定制功能抽象出处理链,每个处理节点提供多实现(包含通用和定制),通过数据库存储插件链实现编排。
车线业务由于鉴权方式需要根据客户定制,因此存在多样性,实现上是通过Web中间件实现多种鉴权插件:
对于API网关来说,这些鉴权插件并没有什么不同之处,只是工程要处理一些定制场景,比如对于不同车厂的JWK管理刷新策略,JWT验证策略等,具体需要根据业务诉求抽象建模,通过插件属性来实现配置控制。
另外,网关还实现了一些变换器,主要用于将GraphQL的输出变换为REST API接口透出,这一方面由于一些旧接口要做兼容支持,另外,一些重点客户的全球化架构背景下自己已经完全定义好了接口式样,目前主要实现了:
而插件的使用则通过控制台或API实现将插件配置信息存储于数据库中进行管理,使用时根据请求特征从DB中提取并缓存起来使用。
改造后的新架构如下:
通过上述改造,将车联网在线服务开发模式进行了升级,实现API控制台动态发布,大幅提升定制开发效率:
作者:高德技术小哥
题外话,世界运行的底层逻辑
物质世界有无机物和有机物组成
有机物与无机物的区别:
有机物是碳化合物,无机物由水和无机离子组成
有机物熔点低,不溶于水
无机物是良好的溶剂,反应快
有机物不溶于水,反应慢
回到问题,有机物通过复制延续
无机物通过转化延续
复制,与转化具有普遍性所以说是底层逻辑
复制的特点是简单、速度快、稳定
转化的特点复杂、不稳定
为何牵扯出了这些概念,以下就是博客发布
经历的几次转化
转化就代表了能量消耗
之所以有机物选择了复制,本质目的是减少能量的损耗
博客文件格式的几次转化
.org > .md > restApi > githubApi > workflow > .html
自动化发布在保存⑩添加了钩子,通过调用接口方式自动上传md文件到github
github设置了hugo发布钩子,监听发布动作,自动生产静态html页面
第一次转化 Org 文件转化为MarkDown文件 使用到emacs插件ox-hugo
第二次转化 使用的是github workflow
自己实现的部分是扩展ox-hugo,监听生成md文件后获取两个值
获取两个变量后,用elisp判断todo状态为完成
调用外部程序新起进程处理上传任务
上传实现可以参考我的java版本 post-blog项目
*请认真填写需求信息,我们会在24小时内与您取得联系。