個好的筆記系統,應該能把你所學習到的任何資料串聯起來,形成一個知識系統,在你需要他們的時候,可以很容易找到,進而形成自己新的知識。
我在《用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小時內與您取得聯系。