Skip to content

Instantly share code, notes, and snippets.

@jeroenvandijk
Last active May 8, 2020 22:26
Show Gist options
  • Save jeroenvandijk/6713bf0af4fe5bc82ebf4a261766537b to your computer and use it in GitHub Desktop.
Save jeroenvandijk/6713bf0af4fe5bc82ebf4a261766537b to your computer and use it in GitHub Desktop.
Export analysis json dump
(ns athens.import.json
(:require #?(:clj [cheshire.core :as json])))
#?(:clj
(do
(defn pp-str [data]
(with-out-str (clojure.pprint/pprint data)))
(defn pp-spit [f data]
(spit f (pp-str data)))))
;; Export from https://roamresearch.com/#/app/ego/page/eJ14YtH2G
(def json-file "/Users/jeroen/Downloads/ego.json")
(def key-exceptions
#{"width" "height" "image-size" "x" "y" "selected"
"native" ;; something with emotions
"nil" ;; for user emails
})
;; https://github.com/athensresearch/athens/blob/master/src/cljs/athens/db.cljs#L8
(def str-kw-mappings
"Maps attributes from \"Export All as JSON\" to original datascript attributes."
{"children" :block/children
"create-email" :create/email
"create-time" :create/time
"edit-email" :edit/email
"edit-time" :edit/time
"email" :user/email
"emoji" :ent/emoji
"emojis" :ent/emojis
"props" :block/props
"string" :block/string
"text-align" :block/text-align
"time" :create/time ;; emojis
"title" :node/title
"uid" :block/uid
;"users" nil
"heading" :block/heading
"id" :block/uid
"from" :block/uid
"to" :block/uid
"member-ids" [:array :block/uid]
"users" [:array :user]})
(defn email? [x]
(when (re-find #".+@.+\.com" x)
x))
(->>
(slurp "/Users/jeroen/Downloads/ego.json")
(json/parse-string)
(clojure.walk/postwalk
(fn [x]
(if (map? x)
(reduce-kv
(fn [acc k v]
(assoc acc
(or
(get str-kw-mappings k)
(get key-exceptions k)
(email? k)
(let [m (get x k)]
(cond
(and (map? m)
#_(or (contains? m "width")
(contains? m "height"))) k
:else
(throw (ex-info "Could not find key " {:x x
:m m
:k k})))))
v))
{}
x)
x)))
(pp-spit "output.edn"))
This file has been truncated, but you can view the full file.
({:create/email "tangjih@gmail.com",
:create/time 1582030610649,
:node/title "https://en.wikipedia.org/wiki/Consciousness",
:block/children
[{:block/string "Keywords: Wikipedia consciousness",
:create/email "tangjih@gmail.com",
:create/time 1582030625631,
:block/uid "4jPwLlxWl",
:edit/time 1587394188796,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Consciousness at its simplest is \"sentience or awareness of internal or external existence\".[1] Despite centuries of analyses, definitions, explanations and debates by philosophers and scientists, **consciousness remains puzzling and controversial,[2] being \"at once the most familiar and most mysterious aspect of our lives\".**[3] Perhaps the only widely agreed notion about the topic is the intuition that it exists.[4] Opinions differ about what exactly needs to be studied and explained as consciousness. Sometimes it is synonymous with 'the mind', other times just an aspect of mind. In the past it was one's \"inner life\", the world of introspection, of private thought, imagination and volition.[5] Today, with modern research into the brain it often includes any kind of experience, cognition, feeling or perception. It may be 'awareness', or 'awareness of awareness', or self-awareness.[6] There might be different levels or \"orders\" of consciousness,[7] or different kinds of consciousness, or just one kind with different features.[8] Other questions include whether only humans are conscious or all animals or even the whole universe. The disparate range of research, notions and speculations raises doubts whether the right questions are being asked.",
:create/email "tangjih@gmail.com",
:create/time 1582030687922,
:block/uid "LnM4BtC38",
:edit/time 1587394198895,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Issues of interest include phenomena such as subliminal perception, blindsight, denial of impairment, and altered states of consciousness produced by alcohol and other drugs, or spiritual or meditative techniques.",
:create/email "tangjih@gmail.com",
:create/time 1582031305870,
:block/children
[{:block/string
"[[https://en.wikipedia.org/wiki/Altered_state_of_consciousness]]",
:create/email "tangjih@gmail.com",
:create/time 1582031427169,
:block/uid "UM4u2s90P",
:edit/time 1582031430432,
:edit/email "tangjih@gmail.com"}],
:block/uid "aNlIxzJmQ",
:edit/time 1587394238200,
:edit/email "tangj1122@gmail.com"}
{:block/string
"One of the most influential contributions to this question was an essay written in 1950 by pioneering computer scientist Alan Turing, titled [[Computing Machinery and Intelligence]]",
:create/email "tangjih@gmail.com",
:create/time 1582030775345,
:block/uid "rk12Cm2eG",
:edit/time 1587394232179,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangjih@gmail.com",
:create/time 1582031255910,
:block/uid "h94GuJjhf",
:edit/time 1582031255910,
:edit/email "tangjih@gmail.com"}],
:edit/time 1582030610654,
:edit/email "tangjih@gmail.com"}
{:create/email "tangjih@gmail.com",
:create/time 1582031222363,
:node/title "Computing Machinery and Intelligence",
:block/children
[{:block/string "Keywords: Alan Turing artificial intelligence",
:create/email "tangjih@gmail.com",
:create/time 1582032265614,
:block/children
[{:block/string
"URL: https://academic.oup.com/mind/article-pdf/LIX/236/433/9866119/433.pdf",
:create/email "tangjih@gmail.com",
:create/time 1582032400093,
:block/uid "f45ofvUVH",
:edit/time 1587394280984,
:edit/email "tangj1122@gmail.com"}
{:block/string "October, 1950",
:create/email "tangjih@gmail.com",
:create/time 1582032276466,
:block/uid "lFjN5B64v",
:edit/time 1582032318878,
:edit/email "tangjih@gmail.com"}
{:block/string
"\"Mind, a Quarterly Review of Psychology and Philosophy\"",
:create/email "tangjih@gmail.com",
:create/time 1582032330839,
:block/uid "u-lHxSdA0",
:edit/time 1582033025268,
:edit/email "tangjih@gmail.com"}],
:block/uid "e3wpwigax",
:edit/time 1587394232179,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangjih@gmail.com",
:create/time 1582033181935,
:block/uid "4cLRAHGZK",
:edit/time 1582033181935,
:edit/email "tangjih@gmail.com"}
{:block/string
"https://en.wikipedia.org/wiki/Computing_Machinery_and_Intelligence",
:create/email "tangjih@gmail.com",
:create/time 1582033025960,
:block/uid "qnd40x0n3",
:edit/time 1582033052895,
:edit/email "tangjih@gmail.com"}
{:block/string "The Imitation Game",
:create/email "tangjih@gmail.com",
:create/time 1582032320076,
:block/children
[{:block/string "\"Can machines think?\"",
:create/email "tangjih@gmail.com",
:create/time 1582032487056,
:block/uid "S0f7mOA6K",
:edit/time 1582032521794,
:edit/email "tangjih@gmail.com"}
{:block/string
"played by 3 people, a man (A), a woman (B), and an interrogator (C)",
:create/email "tangjih@gmail.com",
:create/time 1582032522435,
:block/uid "CIUtrjnlT",
:edit/time 1582032692627,
:edit/email "tangjih@gmail.com"}
{:block/string
"goal of C: determine who is a man and who is a woman",
:create/email "tangjih@gmail.com",
:create/time 1582032718617,
:block/uid "XX6j2kCxw",
:edit/time 1582032816058,
:edit/email "tangjih@gmail.com"}
{:block/string "goal of A: cause C to make wrong identification",
:create/email "tangjih@gmail.com",
:create/time 1582032746604,
:block/uid "eeMVFGYdZ",
:edit/time 1582032834072,
:edit/email "tangjih@gmail.com"}
{:block/string "goal of B: help C",
:create/email "tangjih@gmail.com",
:create/time 1582032697540,
:block/uid "1fXmDoDy7",
:edit/time 1582032847462,
:edit/email "tangjih@gmail.com"}
{:block/string "C cannot see/hear A or B directly",
:create/email "tangjih@gmail.com",
:create/time 1582032849960,
:block/uid "HQ-yo2GR3",
:edit/time 1582032865281,
:edit/email "tangjih@gmail.com"}
{:block/string "What if A is played by a machine?",
:create/email "tangjih@gmail.com",
:create/time 1582032854647,
:block/uid "yK_S-5OTY",
:edit/time 1582033035991,
:edit/email "tangjih@gmail.com"}],
:block/uid "oEAPB6LYo",
:edit/time 1582032439511,
:edit/email "tangjih@gmail.com"}
{:block/string "9 Common Objections",
:create/email "tangjih@gmail.com",
:create/time 1582033054091,
:block/children
[{:block/string "Religious Objection",
:create/email "tangjih@gmail.com",
:create/time 1582033311786,
:block/uid "xaDvpEPDo",
:edit/time 1582033311822,
:edit/email "tangjih@gmail.com"}
{:block/string "'Heads in the Sand' Objection",
:create/email "tangjih@gmail.com",
:create/time 1582033311786,
:block/uid "6oYYYQjBC",
:edit/time 1582033311822,
:edit/email "tangjih@gmail.com"}
{:block/string "Mathematical Objections",
:create/email "tangjih@gmail.com",
:create/time 1582033311786,
:block/uid "kJRWqF258",
:edit/time 1582033311823,
:edit/email "tangjih@gmail.com"}
{:block/string
"Argument From Consciousness: This argument, suggested by Professor Geoffrey Jefferson in his 1949 Lister Oration states that \"not until a machine can write a sonnet or compose a concerto because of thoughts and emotions felt, and not by the chance fall of symbols, could we agree that machine equals brain.\"[12] Turing replies by saying that we have no way of knowing that any individual other than ourselves experiences emotions, and that therefore we should accept the test. He adds, \"I do not wish to give the impression that I think there is no mystery about consciousness ... [b]ut I do not think these mysteries necessarily need to be solved before we can answer the question [of whether machines can think].\" (This argument, that a computer can't have conscious experiences or understanding, would be made in 1980 by philosopher John Searle in his Chinese room argument. Turing's reply is now known as the \"other minds reply\". See also Can a machine have a mind? in the philosophy of AI.)[13]",
:create/email "tangjih@gmail.com",
:create/time 1582033311786,
:block/uid "Kcf-00qTl",
:edit/time 1587394284953,
:edit/email "tangj1122@gmail.com"}
{:block/string "Arguments from various disabilities",
:create/email "tangjih@gmail.com",
:create/time 1582033311786,
:block/uid "1hzTYBYYN",
:edit/time 1582033348306,
:edit/email "tangjih@gmail.com"}
{:block/string "Lady Lovelace's Objection",
:create/email "tangjih@gmail.com",
:create/time 1582033311786,
:block/uid "_UeZNXqg7",
:edit/time 1582033311823,
:edit/email "tangjih@gmail.com"}
{:block/string "Argument from continuity in the nervous system",
:create/email "tangjih@gmail.com",
:create/time 1582033311786,
:block/uid "1pNrH1c1E",
:edit/time 1582033311823,
:edit/email "tangjih@gmail.com"}
{:block/string "Argument from the informality of behaviour",
:create/email "tangjih@gmail.com",
:create/time 1582033311786,
:block/uid "dU5l0E5kF",
:edit/time 1582033311823,
:edit/email "tangjih@gmail.com"}
{:block/string "Extra-sensory perception",
:create/email "tangjih@gmail.com",
:create/time 1582033311786,
:block/uid "mgY5iD-0n",
:edit/time 1582033311823,
:edit/email "tangjih@gmail.com"}],
:block/uid "nSmHw37ze",
:edit/time 1582033174638,
:edit/email "tangjih@gmail.com"}],
:edit/time 1582031222372,
:edit/email "tangjih@gmail.com"}
{:create/email "tangjih@gmail.com",
:create/time 1582031430439,
:node/title
"https://en.wikipedia.org/wiki/Altered_state_of_consciousness",
:block/children
[{:block/string
"Keywords: altered states of consciousness ASC ((mIoZTskXR))",
:create/email "tangjih@gmail.com",
:create/time 1582031458104,
:block/uid "Ui98lyVsp",
:edit/time 1587394241629,
:edit/email "tangj1122@gmail.com"}
{:block/string "History",
:create/email "tangjih@gmail.com",
:create/time 1582031539876,
:block/children
[{:block/string "History of utiliztion of ASCs",
:create/email "tangjih@gmail.com",
:create/time 1582031771265,
:block/children
[{:block/string
"Altered states of consciousness might have been employed by humans as early as 30,000 years ago.[10] Mind-altering plants and/or excessive dancing were used to attain an ecstatic or mystic state.[13] Examples of early religious use of altered states of consciousness are the rites of Dionysos and the Eleusinian Mysteries,[14] as well as Yoga and Meditation.[10] Followers of various shamanic traditions \"enter altered states of consciousness in order to serve their community.\"[14] Terence McKenna has suggested that the use of psychedelic mushrooms in prehistoric times has led to the \"evolution of human language and symbol use\".[15] Some theorists propose that mind-altering substances, such as Soma, might have pushed the formation of some of the world's main religions. ",
:create/email "tangjih@gmail.com",
:create/time 1582031542026,
:block/uid "KOiul_hw6",
:edit/time 1587394271512,
:edit/email "tangj1122@gmail.com"}],
:block/uid "IrrnSbU0v",
:edit/time 1582031771265,
:edit/email "tangjih@gmail.com"}
{:block/string "History of the science and theoretical-modelling",
:create/email "tangjih@gmail.com",
:create/time 1582031606974,
:block/children
[{:block/string "William James",
:create/email "tangjih@gmail.com",
:create/time 1582031777386,
:block/uid "k_g5_l2n7",
:edit/time 1587394277235,
:edit/email "tangj1122@gmail.com"}
{:block/string
"The social change of the turbulent 1960s has decisively led to a change of the scientific perspective to the point that introspection as a scientific method and ASCs as valid realms of experience became more widely accepted.[21] Foundations for the research have been laid out by various scientists such as Abraham Maslow, Walter N. Pahnke, Stanislav Grof and Charles Tart.[22] They focused on seemingly beneficial aspects of ASCs such as their potential to \"promote creativity or treat addiction\".[9] Rather oppressive states such as dissociation from trauma were neglected.",
:create/email "tangjih@gmail.com",
:create/time 1582031831437,
:block/uid "uJzguWvDe",
:edit/time 1582031848503,
:edit/email "tangjih@gmail.com"}
{:block/string
"The findings of the famous Good Friday Experiment by Pahnke suggest that mystical experiences can be triggered by psilocybin. Later investigations by Rick Doblin found that participants valued those experiences as \"spiritual high points of their lives\"",
:create/email "tangjih@gmail.com",
:create/time 1582031869766,
:block/uid "_qVo26ytJ",
:edit/time 1582031872519,
:edit/email "tangjih@gmail.com"}],
:block/uid "BKs9CNDYc",
:edit/time 1582031776191,
:edit/email "tangjih@gmail.com"}],
:block/uid "mIoZTskXR",
:edit/time 1582031540310,
:edit/email "tangjih@gmail.com"}
{:block/string "Classification",
:create/email "tangjih@gmail.com",
:create/time 1582031907852,
:block/children
[{:block/string
"A classification with five categories was suggested by Vaitl[25] to distinguish ASCs according to how they were induced:",
:block/children
[{:block/string
"Spontaneous (day-dreaming and near death experience)",
:block/uid "fzFks_qI3",
:edit/time 1582031930579,
:edit/email "tangjih@gmail.com"}
{:block/string "Physical and physiological (fasting and sex)",
:block/uid "F9SfmpUTw",
:edit/time 1582031930579,
:edit/email "tangjih@gmail.com"}
{:block/string "Psychological (music, meditation, hypnosis)",
:block/uid "a2JFn-2x_",
:edit/time 1582031930579,
:edit/email "tangjih@gmail.com"}
{:block/string "Pathological (Epilepsy, brain damage)",
:block/uid "hMPtHDa42",
:edit/time 1582031930579,
:edit/email "tangjih@gmail.com"}
{:block/string "Pharmacological (psychoactive substances)",
:block/uid "zdmYDf-c_",
:edit/time 1582031930580,
:edit/email "tangjih@gmail.com"}],
:block/uid "pUv8aCaZ2",
:edit/time 1582031938973,
:edit/email "tangjih@gmail.com"}],
:block/uid "Uin3lzZe9",
:edit/time 1582031910730,
:edit/email "tangjih@gmail.com"}
{:block/string "Induction Methods",
:create/email "tangjih@gmail.com",
:create/time 1582031466359,
:block/children
[{:block/string "Pharmacological",
:create/email "tangjih@gmail.com",
:create/time 1582031487463,
:block/children
[{:block/string
"psychoactive drugs, which are defined as chemical substances that pass through the blood and disturb brain function, causing changes in awareness, attitude, consciousness, and behavior.",
:create/email "tangjih@gmail.com",
:create/time 1582031992871,
:block/uid "638BYZs10",
:edit/time 1582032027845,
:edit/email "tangjih@gmail.com"}
{:block/string "cannabis",
:create/email "tangjih@gmail.com",
:create/time 1582032029584,
:block/uid "YErR5DbbG",
:edit/time 1582032034653,
:edit/email "tangjih@gmail.com"}
{:block/string "MDMA",
:create/email "tangjih@gmail.com",
:create/time 1582032034620,
:block/uid "mWLPkiaJf",
:edit/time 1582032036200,
:edit/email "tangjih@gmail.com"}
{:block/string "opioids",
:create/email "tangjih@gmail.com",
:create/time 1582032036170,
:block/uid "qpHuWWm9M",
:edit/time 1582032037746,
:edit/email "tangjih@gmail.com"}
{:block/string "cocaine",
:create/email "tangjih@gmail.com",
:create/time 1582032037721,
:block/uid "7h4We2zsx",
:edit/time 1582032040392,
:edit/email "tangjih@gmail.com"}
{:block/string "albohol",
:create/email "tangjih@gmail.com",
:create/time 1582032040369,
:block/uid "O09uQlvDL",
:edit/time 1582032042150,
:edit/email "tangjih@gmail.com"}],
:block/uid "R9pa7zpf0",
:edit/time 1582031992883,
:edit/email "tangjih@gmail.com"}
{:block/string "Non-pharmacological",
:create/email "tangjih@gmail.com",
:create/time 1582032044209,
:block/children
[{:block/string "Meditation",
:create/email "tangjih@gmail.com",
:create/time 1582032085071,
:block/uid "Tjixmm48F",
:edit/time 1582032085096,
:edit/email "tangjih@gmail.com"}
{:block/string "Spiritual experience",
:create/email "tangjih@gmail.com",
:create/time 1582032085071,
:block/uid "oO1NXI88H",
:edit/time 1582032085096,
:edit/email "tangjih@gmail.com"}
{:block/string "Learning",
:create/email "tangjih@gmail.com",
:create/time 1582032085071,
:block/uid "Yf5z6TY-J",
:edit/time 1582032085096,
:edit/email "tangjih@gmail.com"}
{:block/string "Insight",
:create/email "tangjih@gmail.com",
:create/time 1582032085071,
:block/uid "1qeh_LYXA",
:edit/time 1582032085096,
:edit/email "tangjih@gmail.com"}
{:block/string "Understanding",
:create/email "tangjih@gmail.com",
:create/time 1582032085071,
:block/uid "QWv6CaKJy",
:edit/time 1582032085096,
:edit/email "tangjih@gmail.com"}
{:block/string "Emotional development",
:create/email "tangjih@gmail.com",
:create/time 1582032085071,
:block/uid "4GCXoEd50",
:edit/time 1582032085096,
:edit/email "tangjih@gmail.com"}
{:block/string "Sensitivity training",
:create/email "tangjih@gmail.com",
:create/time 1582032085071,
:block/uid "JtuS00lyF",
:edit/time 1582032085096,
:edit/email "tangjih@gmail.com"}
{:block/string "Mental development",
:create/email "tangjih@gmail.com",
:create/time 1582032085071,
:block/uid "oPIaprPaf",
:edit/time 1582032085097,
:edit/email "tangjih@gmail.com"}
{:block/string "Recreational",
:create/email "tangjih@gmail.com",
:create/time 1582032085071,
:block/uid "MSmO21Usp",
:edit/time 1582032085098,
:edit/email "tangjih@gmail.com"}],
:block/uid "ZgMfl54om",
:edit/time 1582032051908,
:edit/email "tangjih@gmail.com"}
{:block/string "Pathologies/other",
:create/email "tangjih@gmail.com",
:create/time 1582032101353,
:block/uid "uZuQEpg2O",
:edit/time 1582032106241,
:edit/email "tangjih@gmail.com"}
{:block/string "Traumatic experience",
:create/email "tangjih@gmail.com",
:create/time 1582032106211,
:block/uid "JJYptdIK4",
:edit/time 1582032112027,
:edit/email "tangjih@gmail.com"}
{:block/string "Epilepsy",
:create/email "tangjih@gmail.com",
:create/time 1582032111998,
:block/uid "JK6O6DdgS",
:edit/time 1582032115827,
:edit/email "tangjih@gmail.com"}
{:block/string "Oxygen deficiency",
:create/email "tangjih@gmail.com",
:create/time 1582032115805,
:block/uid "vRWvI9X4H",
:edit/time 1582032119866,
:edit/email "tangjih@gmail.com"}
{:block/string "Infections",
:create/email "tangjih@gmail.com",
:create/time 1582032119835,
:block/uid "pYlcNLL8t",
:edit/time 1582032121154,
:edit/email "tangjih@gmail.com"}
{:block/string "Sleep deprivation",
:create/email "tangjih@gmail.com",
:create/time 1582032121140,
:block/uid "w5aj9PIuR",
:edit/time 1582032123206,
:edit/email "tangjih@gmail.com"}
{:block/string "Fasting",
:create/email "tangjih@gmail.com",
:create/time 1582032123172,
:block/uid "v8ioeRMM3",
:edit/time 1582032124525,
:edit/email "tangjih@gmail.com"}
{:block/string "Psychosis",
:create/email "tangjih@gmail.com",
:create/time 1582032126411,
:block/uid "_5WVkDdL-",
:edit/time 1582032129762,
:edit/email "tangjih@gmail.com"}],
:block/uid "fw9_FbDLW",
:edit/time 1582031487478,
:edit/email "tangjih@gmail.com"}
{:block/string "See also",
:create/email "tangjih@gmail.com",
:create/time 1582032150053,
:block/children
[{:block/string "Induction techniques",
:block/children
[{:block/string
"[Breathwork](https://en.wikipedia.org/wiki/Breathwork)",
:block/uid "-GuehQDG4",
:edit/time 1582032160928,
:edit/email "tangjih@gmail.com"}
{:block/string "[Dance](https://en.wikipedia.org/wiki/Dance)",
:block/uid "hUONicExL",
:edit/time 1582032160928,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Category:Devices to alter consciousness](https://en.wikipedia.org/wiki/Category:Devices_to_alter_consciousness)",
:block/uid "QpjdADC-v",
:edit/time 1582032160928,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Fasting](https://en.wikipedia.org/wiki/Fasting)",
:block/uid "NsiWHKX4M",
:edit/time 1582032160928,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Hypnosis](https://en.wikipedia.org/wiki/Hypnosis)",
:block/uid "1XJkpDRrE",
:edit/time 1582032160928,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Immersion (virtual reality)](https://en.wikipedia.org/wiki/Immersion_(virtual_reality))",
:block/uid "Xvd_4_y7o",
:edit/time 1582032160928,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Lucid dreaming](https://en.wikipedia.org/wiki/Lucid_dreaming)",
:block/uid "B-hh30yjm",
:edit/time 1582032160928,
:edit/email "tangjih@gmail.com"}
{:block/string "[Mantra](https://en.wikipedia.org/wiki/Mantra)",
:block/uid "12enzlnN0",
:edit/time 1582032160928,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Meditation](https://en.wikipedia.org/wiki/Meditation)",
:block/uid "6ewGIi8Gb",
:edit/time 1582032160928,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Music therapy](https://en.wikipedia.org/wiki/Music_therapy)",
:block/uid "EKVsmUJEb",
:edit/time 1582032160928,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Physical exercise](https://en.wikipedia.org/wiki/Physical_exercise)",
:block/uid "Zg9uw12SO",
:edit/time 1582032160928,
:edit/email "tangjih@gmail.com"}
{:block/string "[Prayer](https://en.wikipedia.org/wiki/Prayer)",
:block/uid "yi6uQKZiJ",
:edit/time 1582032160928,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Psychoactive drug](https://en.wikipedia.org/wiki/Psychoactive_drug)",
:block/uid "6vCNIpFjQ",
:edit/time 1582032160928,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Psychonautics § Methods](https://en.wikipedia.org/wiki/Psychonautics#Methodology)",
:block/uid "ni4vziGiA",
:edit/time 1582032160928,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Religious ritual](https://en.wikipedia.org/wiki/Religious_ritual)",
:block/uid "PrihY9FVr",
:edit/time 1582032160929,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Sensory deprivation](https://en.wikipedia.org/wiki/Sensory_deprivation)",
:block/uid "xmbYGjCW5",
:edit/time 1582032160929,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Sexual intercourse](https://en.wikipedia.org/wiki/Sexual_intercourse)",
:block/uid "j7kYd5UZP",
:edit/time 1582032160929,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Shuckling](https://en.wikipedia.org/wiki/Shuckling)",
:block/uid "gYy6u04NP",
:edit/time 1582032160929,
:edit/email "tangjih@gmail.com"}
{:block/string "[Sleep](https://en.wikipedia.org/wiki/Sleep)",
:block/uid "c9sFaFyVo",
:edit/time 1582032160929,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Sleep deprivation](https://en.wikipedia.org/wiki/Sleep_deprivation)",
:block/uid "XPJA2XJpR",
:edit/time 1582032160929,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Sweat lodge](https://en.wikipedia.org/wiki/Sweat_lodge)",
:block/uid "9ECb0U4Eo",
:edit/time 1582032160929,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Trance § Trance induction and sensory modality](https://en.wikipedia.org/wiki/Trance#Trance_induction_and_sensory_modality)",
:block/uid "dX_4HwFll",
:edit/time 1582032160929,
:edit/email "tangjih@gmail.com"}],
:block/uid "M5dNzSIvi",
:edit/time 1582032160929,
:edit/email "tangjih@gmail.com"}
{:block/string "Other topics",
:block/children
[{:block/string
"[Anxiety](https://en.wikipedia.org/wiki/Anxiety)",
:block/uid "rc_MXpoOh",
:edit/time 1582032160918,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Autoscopy](https://en.wikipedia.org/wiki/Autoscopy)",
:block/uid "pVWdnUcgR",
:edit/time 1582032160918,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Brainwave entrainment](https://en.wikipedia.org/wiki/Brainwave_entrainment)",
:block/uid "v8p2dAmjO",
:edit/time 1582032160918,
:edit/email "tangjih@gmail.com"}
{:block/string "[Coma](https://en.wikipedia.org/wiki/Coma)",
:block/uid "lYvaRa0Ed",
:edit/time 1582032160918,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Convulsion](https://en.wikipedia.org/wiki/Convulsion)",
:block/uid "bBzkc44tD",
:edit/time 1582032160918,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Daydream](https://en.wikipedia.org/wiki/Daydream)",
:block/uid "gyTzrK8Fe",
:edit/time 1582032160918,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Delirium](https://en.wikipedia.org/wiki/Delirium)",
:block/uid "1E1AN0X2Q",
:edit/time 1582032160918,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Dementia](https://en.wikipedia.org/wiki/Dementia)",
:block/uid "9yaEzAbLR",
:edit/time 1582032160918,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Depersonalization](https://en.wikipedia.org/wiki/Depersonalization)",
:block/uid "wfbmf70aq",
:edit/time 1582032160918,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Derealization](https://en.wikipedia.org/wiki/Derealization)",
:block/uid "Egi8Vwy9N",
:edit/time 1582032160918,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Ecstasy (emotion)](https://en.wikipedia.org/wiki/Ecstasy_(emotion))",
:block/uid "jowtCvKvR",
:edit/time 1582032160918,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Ecstasy (religious)](https://en.wikipedia.org/wiki/Religious_ecstasy)",
:block/uid "xOW7SyJro",
:edit/time 1582032160919,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Ego death](https://en.wikipedia.org/wiki/Ego_death)",
:block/uid "gr4Q-nSmd",
:edit/time 1582032160919,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Energy (esotericism)](https://en.wikipedia.org/wiki/Energy_(esotericism))",
:block/uid "ozbNt94Wb",
:edit/time 1582032160919,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Euphoria](https://en.wikipedia.org/wiki/Euphoria)",
:block/uid "7w1V6AUUn",
:edit/time 1582032160919,
:edit/email "tangjih@gmail.com"}
{:block/string "[Fear](https://en.wikipedia.org/wiki/Fear)",
:block/uid "tduDsZSU2",
:edit/time 1582032160919,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Flow (psychology)](https://en.wikipedia.org/wiki/Flow_(psychology))",
:block/uid "esL6PXJuE",
:edit/time 1582032160919,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Hydrogen narcosis](https://en.wikipedia.org/wiki/Hydrogen_narcosis)",
:block/uid "XJEnkIsyK",
:edit/time 1582032160919,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Hypnagogia](https://en.wikipedia.org/wiki/Hypnagogia)",
:block/uid "iVOVbzL66",
:edit/time 1582032160919,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Hypnopompia](https://en.wikipedia.org/wiki/Hypnopompia)",
:block/uid "sU2o8VvFQ",
:edit/time 1582032160919,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Hysteria](https://en.wikipedia.org/wiki/Hysteria)",
:block/uid "SHxPZfys8",
:edit/time 1582032160919,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Kundalini syndrome](https://en.wikipedia.org/wiki/Kundalini_syndrome)",
:block/uid "PqJycmuxh",
:edit/time 1582032160920,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Major depressive disorder](https://en.wikipedia.org/wiki/Major_depressive_disorder)",
:block/uid "fpTkQZL4F",
:edit/time 1582032160920,
:edit/email "tangjih@gmail.com"}
{:block/string "[Mania](https://en.wikipedia.org/wiki/Mania)",
:block/uid "CguXBDaFv",
:edit/time 1582032160920,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Mind at large](https://en.wikipedia.org/wiki/Mind_at_large)",
:block/uid "WNx9Kmpnk",
:edit/time 1582032160920,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Mystical psychosis](https://en.wikipedia.org/wiki/Mystical_psychosis)",
:block/uid "o_WSTkuDW",
:edit/time 1582032160920,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Mysticism](https://en.wikipedia.org/wiki/Mysticism)",
:block/uid "5lpQ9VZuY",
:edit/time 1582032160920,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Near death experience](https://en.wikipedia.org/wiki/Near_death_experience)",
:block/uid "yn3ylCcZM",
:edit/time 1582032160921,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Neurotheology](https://en.wikipedia.org/wiki/Neurotheology)",
:block/uid "ESrDgxz8E",
:edit/time 1582032160921,
:edit/email "tangjih@gmail.com"}
{:block/string
"[New Age](https://en.wikipedia.org/wiki/New_Age)",
:block/uid "dMRQl7bmg",
:edit/time 1582032160921,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Nitrogen narcosis](https://en.wikipedia.org/wiki/Nitrogen_narcosis)",
:block/uid "bEJ8VCVGB",
:edit/time 1582032160921,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Out-of-body experience](https://en.wikipedia.org/wiki/Out-of-body_experience)",
:block/uid "LwIivw_EI",
:edit/time 1582032160921,
:edit/email "tangjih@gmail.com"}
{:block/string "[Panic](https://en.wikipedia.org/wiki/Panic)",
:block/uid "A6AFAIM0p",
:edit/time 1582032160921,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Parapsychology](https://en.wikipedia.org/wiki/Parapsychology)",
:block/uid "Na0ysP-5A",
:edit/time 1582032160921,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Peak experience](https://en.wikipedia.org/wiki/Peak_experience)",
:block/uid "izSyOyQWB",
:edit/time 1582032160921,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Presyncope](https://en.wikipedia.org/wiki/Presyncope)",
:block/uid "Gkizrfz_5",
:edit/time 1582032160923,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Psychedelia](https://en.wikipedia.org/wiki/Psychedelia)",
:block/uid "gd3beif3l",
:edit/time 1582032160923,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Psychedelic experience](https://en.wikipedia.org/wiki/Psychedelic_experience)",
:block/uid "bk6k3Qwwg",
:edit/time 1582032160923,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Psychology of religion](https://en.wikipedia.org/wiki/Psychology_of_religion)",
:block/uid "kwf9tiJkM",
:edit/time 1582032160923,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Psychonautics](https://en.wikipedia.org/wiki/Psychonautics)",
:block/uid "EWNTduVYl",
:edit/time 1582032160923,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Psychosis](https://en.wikipedia.org/wiki/Psychosis)",
:block/uid "9y56rDb_P",
:edit/time 1582032160923,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Religious experience](https://en.wikipedia.org/wiki/Religious_experience)",
:block/uid "Uh6en_Kx9",
:edit/time 1582032160923,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Runner's high](https://en.wikipedia.org/wiki/Runner%27s_high)",
:block/uid "rym5KUqzk",
:edit/time 1582032160923,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Sleep paralysis](https://en.wikipedia.org/wiki/Sleep_paralysis)",
:block/uid "654UeekXm",
:edit/time 1582032160924,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Syncope](https://en.wikipedia.org/wiki/Syncope_(medicine))",
:block/uid "P-BxtWWIW",
:edit/time 1582032160924,
:edit/email "tangjih@gmail.com"}
{:block/string "[Trance](https://en.wikipedia.org/wiki/Trance)",
:block/uid "kHYaj7Xrc",
:edit/time 1582032160924,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Wakefulness](https://en.wikipedia.org/wiki/Wakefulness)",
:block/uid "kCx-bUUGs",
:edit/time 1582032160924,
:edit/email "tangjih@gmail.com"}],
:block/uid "4uRcJ3wJk",
:edit/time 1582032160924,
:edit/email "tangjih@gmail.com"}
{:block/string "People",
:block/children
[{:block/string
"[Bonny, Helen](https://en.wikipedia.org/wiki/Helen_Bonny)",
:block/uid "LYny-prgu",
:edit/time 1582032160924,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Bourguignon, Erika](https://en.wikipedia.org/wiki/Erika_Bourguignon)",
:block/uid "fGoBWxzo_",
:edit/time 1582032160924,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Castaneda, Carlos](https://en.wikipedia.org/wiki/Carlos_Castaneda)",
:block/uid "frcimjmly",
:edit/time 1582032160924,
:edit/email "tangjih@gmail.com"}
{:block/string
"[de Ropp, Robert](https://en.wikipedia.org/wiki/Robert_S_de_Ropp)",
:block/uid "3B3SuPxr1",
:edit/time 1582032160924,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Eisner, Bruce](https://en.wikipedia.org/wiki/Bruce_Eisner)",
:block/uid "Hu4o9cm-N",
:edit/time 1582032160924,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Golas, Thaddeus](https://en.wikipedia.org/wiki/Thaddeus_Golas)",
:block/uid "ktRlW5iwF",
:edit/time 1582032160924,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Gowan, John Curtis](https://en.wikipedia.org/wiki/John_Curtis_Gowan)",
:block/uid "0impDmKiO",
:edit/time 1582032160924,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Grof, Stanislav](https://en.wikipedia.org/wiki/Stanislav_Grof)",
:block/uid "wGVIK_UDa",
:edit/time 1582032160924,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Huxley, Aldous](https://en.wikipedia.org/wiki/Aldous_Huxley)",
:block/uid "o5-h4Gj9A",
:edit/time 1582032160924,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Josephson, Ernst](https://en.wikipedia.org/wiki/Ernst_Josephson)",
:block/uid "9Mo_s9Gve",
:edit/time 1582032160925,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Leary, Timothy](https://en.wikipedia.org/wiki/Timothy_Leary)",
:block/uid "hkSy5ui9x",
:edit/time 1582032160925,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Lilly, John C.](https://en.wikipedia.org/wiki/John_C._Lilly)",
:block/uid "NDkhQ8wFL",
:edit/time 1582032160927,
:edit/email "tangjih@gmail.com"}
{:block/string
"[McKenna, Terence](https://en.wikipedia.org/wiki/Terence_McKenna)",
:block/uid "850vLY9AT",
:edit/time 1582032160927,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Naranjo, Claudio](https://en.wikipedia.org/wiki/Claudio_Naranjo)",
:block/uid "A6ff0SKaY",
:edit/time 1582032160927,
:edit/email "tangjih@gmail.com"}
{:block/string
"[Tart, Charles](https://en.wikipedia.org/wiki/Charles_Tart)",
:block/uid "KWhi4Rxf-",
:edit/time 1582032160927,
:edit/email "tangjih@gmail.com"}],
:block/uid "zwiaS8k_j",
:edit/time 1582032160927,
:edit/email "tangjih@gmail.com"}],
:block/uid "MZfF7tfVS",
:edit/time 1582032152494,
:edit/email "tangjih@gmail.com"}],
:edit/time 1582031430455,
:edit/email "tangjih@gmail.com"}
{:node/title "February 21st, 2020",
:block/children
[{:block/string "",
:create/email "tangjih@gmail.com",
:create/time 1582334854150,
:block/uid "WLzH4ncEM",
:edit/time 1582334854150,
:edit/email "tangjih@gmail.com"}],
:edit/time 1582334853367,
:edit/email "tangjih@gmail.com"}
{:node/title "March 20th, 2020",
:block/children
[{:block/string "",
:create/email "tangjih@gmail.com",
:create/time 1584758671606,
:block/uid "pX5uKMm-4",
:edit/time 1584758671606,
:edit/email "tangjih@gmail.com"}
{:block/string "",
:create/email "tangjih@gmail.com",
:create/time 1584758671893,
:block/uid "O014sWfuL",
:edit/time 1584758671893,
:edit/email "tangjih@gmail.com"}
{:block/string "",
:create/email "tangjih@gmail.com",
:create/time 1584758672204,
:block/uid "4fs-Gl4WP",
:edit/time 1584758672204,
:edit/email "tangjih@gmail.com"}
{:block/string "",
:create/email "tangjih@gmail.com",
:create/time 1584758668605,
:block/uid "QpYpTBmaB",
:edit/time 1584825832370,
:edit/email "tangjih@gmail.com"}],
:edit/time 1584757207925,
:edit/email "tangjih@gmail.com"}
{:node/title "March 21st, 2020",
:edit/time 1584819466452,
:edit/email "tangjih@gmail.com"}
{:node/title "March 22nd, 2020",
:edit/time 1584913568119,
:edit/email "tangjih@gmail.com"}
{:node/title "March 23rd, 2020",
:block/children
[{:block/string "",
:create/email "tangjih@gmail.com",
:create/time 1584996712325,
:block/uid "je3afxwky",
:edit/time 1584996712325,
:edit/email "tangjih@gmail.com"}],
:edit/time 1584996704075,
:edit/email "tangjih@gmail.com"}
{:node/title "March 24th, 2020",
:edit/time 1585095361424,
:edit/email "tangjih@gmail.com"}
{:node/title "March 25th, 2020",
:edit/time 1585142120219,
:edit/email "tangjih@gmail.com"}
{:node/title "March 26th, 2020",
:edit/time 1585237503570,
:edit/email "tangjih@gmail.com"}
{:node/title "March 28th, 2020",
:edit/time 1585423097466,
:edit/email "tangjih@gmail.com"}
{:node/title "March 29th, 2020",
:edit/time 1585518450893,
:edit/email "tangjih@gmail.com"}
{:create/email "tangjih@gmail.com",
:create/time 1585518449198,
:node/title "March 27th, 2020",
:edit/time 1585518450856,
:edit/email "tangjih@gmail.com"}
{:create/email "tangjih@gmail.com",
:create/time 1585518767965,
:node/title "",
:edit/time 1585518768029,
:edit/email "tangjih@gmail.com"}
{:node/title "March 30th, 2020",
:edit/time 1585596374106,
:edit/email "tangj1122@gmail.com"}
{:node/title "April 1st, 2020",
:edit/time 1585758203494,
:edit/email "tangjih@gmail.com"}
{:node/title "April 2nd, 2020",
:block/children
[{:block/string "",
:create/email "tangjih@gmail.com",
:create/time 1585853991225,
:block/uid "Ll8iQTl-3",
:edit/time 1587394359544,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1585853938324,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangjih@gmail.com",
:create/time 1585854003608,
:node/title "Athens",
:edit/time 1585854003630,
:edit/email "tangjih@gmail.com"}
{:create/email "tangjih@gmail.com",
:create/time 1585854041054,
:node/title "Open Source",
:edit/time 1586002840205,
:edit/email "tangjih@gmail.com"}
{:create/email "tangjih@gmail.com",
:create/time 1585854048452,
:node/title "Roam",
:edit/time 1586002840218,
:edit/email "tangjih@gmail.com"}
{:create/email "tangjih@gmail.com",
:create/time 1585854058533,
:node/title "[[Open Source]] [[Roam]]",
:edit/time 1585854058545,
:edit/email "tangjih@gmail.com"}
{:node/title "April 4th, 2020",
:block/children
[{:block/string "[[Parser Tests]]",
:create/email "tangjih@gmail.com",
:create/time 1586002835642,
:block/uid "FUgXpPxDL",
:edit/time 1587394567012,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1586002793600,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangjih@gmail.com",
:create/time 1586002840174,
:node/title "Open[[Athens[[Roam]]]]",
:edit/time 1586002840185,
:edit/email "tangjih@gmail.com"}
{:create/email "tangjih@gmail.com",
:create/time 1586002840174,
:node/title "Athens[[Roam]]",
:edit/time 1586002840185,
:edit/email "tangjih@gmail.com"}
{:create/email "tangjih@gmail.com",
:create/time 1586002840200,
:node/title "[[Open Source]] Roam",
:edit/time 1586002840205,
:edit/email "tangjih@gmail.com"}
{:create/email "tangjih@gmail.com",
:create/time 1586002840213,
:node/title "Open Source [[Roam]]",
:edit/time 1586002840218,
:edit/email "tangjih@gmail.com"}
{:create/email "tangjih@gmail.com",
:create/time 1586002840241,
:node/title "Athen],s",
:edit/time 1586002840246,
:edit/email "tangjih@gmail.com"}
{:create/email "tangjih@gmail.com",
:create/time 1586002840251,
:node/title "Athens [ATH",
:edit/time 1586002840256,
:edit/email "tangjih@gmail.com"}
{:node/title "April 7th, 2020",
:edit/time 1586259923690,
:edit/email "tangj1122@gmail.com"}
{:node/title "April 16th, 2020",
:edit/time 1587053117203,
:edit/email "tangj1122@gmail.com"}
{:node/title "Using Your Roam DB with Athens",
:block/children
[{:block/string
"source:: https://www.youtube.com/watch?v=F-kKVYoQ0AE",
:create/email "tangj1122@gmail.com",
:create/time 1587139986515,
:block/uid "ot0V19PMG",
:edit/time 1587480144714,
:edit/email "tangj1122@gmail.com"}
{:block/string "source:: https://athensresearch.github.io/athens/",
:create/email "tangj1122@gmail.com",
:create/time 1588159629838,
:block/uid "ABneMU_hW",
:edit/time 1588159631747,
:edit/email "tangj1122@gmail.com"}
{:block/string "type:: tutorial",
:create/email "tangj1122@gmail.com",
:create/time 1587141031416,
:block/uid "G0YJ81oMb",
:edit/time 1587480150243,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1587142177761,
:block/uid "r8j1qjwRo",
:edit/time 1587142177761,
:edit/email "tangj1122@gmail.com"}
{:block/string "Three Easy Steps",
:create/email "tangj1122@gmail.com",
:create/time 1587053134230,
:block/children
[{:block/string "in Roam",
:create/email "tangj1122@gmail.com",
:create/time 1587136677441,
:block/children
[{:block/string "```:q [:find ?e ?a ?v :where [?e ?a ?v]]```",
:create/email "tangj1122@gmail.com",
:create/time 1587053216814,
:block/uid "l02w9dfMR",
:edit/time 1588972106442,
:edit/email "jeroentjevandijk@gmail.com"}
{:block/string "Tips",
:create/email "tangj1122@gmail.com",
:create/time 1587140100307,
:block/children
[{:block/string "Might not work if your DB is too big",
:create/email "tangj1122@gmail.com",
:create/time 1587140036737,
:block/uid "pqDK3lLZl",
:edit/time 1587140044200,
:edit/email "tangj1122@gmail.com"}
{:block/string "Don't export as markdown or JSON",
:create/email "tangj1122@gmail.com",
:create/time 1587140041935,
:block/uid "J2n8MEx9a",
:edit/time 1587140041935,
:edit/email "tangj1122@gmail.com"}
{:block/string "Don't use `window.alphaAPI`",
:create/email "tangj1122@gmail.com",
:create/time 1587140043175,
:block/uid "LINRTNke_",
:edit/time 1587140046282,
:edit/email "tangj1122@gmail.com"}],
:block/uid "JxRMn37Ez",
:edit/time 1587140102061,
:edit/email "tangj1122@gmail.com"}],
:block/uid "9Jxz_RZi6",
:edit/time 1587140034262,
:edit/email "tangj1122@gmail.com"}
{:block/string "at the command line",
:create/email "tangj1122@gmail.com",
:create/time 1587139988453,
:block/children
[{:block/string "```pbpaste > ~/Downloads/my-db.json```",
:create/email "tangj1122@gmail.com",
:create/time 1587140012345,
:block/uid "6u_Pak0Rj",
:edit/time 1588899769710,
:edit/email "ian@egghead.io"}
{:block/string "(but don't enter it in yet!)",
:create/email "tangj1122@gmail.com",
:create/time 1587152384474,
:block/uid "BKXefLA7i",
:edit/time 1587152393982,
:edit/email "tangj1122@gmail.com"}],
:block/uid "8fKY9jDs0",
:edit/time 1587140012353,
:edit/email "tangj1122@gmail.com"}
{:block/string "in the browser console",
:create/email "tangj1122@gmail.com",
:create/time 1587140002440,
:block/children
[{:block/string
"```copy(Array.from(document.getElementsByTagName('td')).map(x => x.innerText))```",
:create/email "tangj1122@gmail.com",
:create/time 1587139923136,
:block/uid "6_paVM0zr",
:edit/time 1588968529058,
:edit/email "marnunna2@gmail.com"}],
:block/uid "Q-Y-WeMMD",
:edit/time 1587140002440,
:edit/email "tangj1122@gmail.com"}],
:block/uid "KbkhmpnSx",
:edit/time 1587140083986,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1587139989379,
:block/uid "yr0SSLo5d",
:edit/time 1587139989379,
:edit/email "tangj1122@gmail.com"}
{:block/string "Query below. Please close me when done :)",
:create/email "tangj1122@gmail.com",
:create/time 1587053142326,
:block/children
[{:block/string ":q [:find ?e ?a ?v :where [?e ?a ?v]]",
:create/email "tangj1122@gmail.com",
:create/time 1587053138273,
:block/uid "-gZm03011",
:edit/time 1588179550914,
:edit/email "tangj1122@gmail.com"}],
:block/uid "UDXg7zIPC",
:edit/time 1588179626414,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1587142154401,
:edit/email "tangj1122@gmail.com"}
{:node/title "April 17th, 2020",
:edit/time 1587136608379,
:edit/email "tangj1122@gmail.com"}
{:node/title "April 18th, 2020", :edit/time 1587195848805}
{:node/title "April 20th, 2020",
:block/children
[{:block/string
"12:35 finally doing [[Roam]] course: [[[[Nat Eliason]]: Effortless Output with Roam]]",
:create/email "tangj1122@gmail.com",
:create/time 1587400506379,
:block/uid "eydIqhWw2",
:edit/time 1587403511952,
:edit/email "tangj1122@gmail.com"}
{:block/string "13:00 writing [[Athens FAQ]]",
:create/email "tangj1122@gmail.com",
:create/time 1587394612917,
:block/uid "dP1_dbCTM",
:edit/time 1587480304606,
:edit/email "tangj1122@gmail.com"}
{:block/string "[[Athens Change Log]]",
:create/email "tangj1122@gmail.com",
:create/time 1587480312847,
:block/children
[{:block/string "begin drafting [[Athens FAQ]]",
:create/email "tangj1122@gmail.com",
:create/time 1587480316950,
:block/uid "-0_2aKg7z",
:edit/time 1588083601554,
:edit/email "tangj1122@gmail.com"}
{:block/string "update README.md to have an actual description",
:create/email "tangj1122@gmail.com",
:create/time 1587480353657,
:block/uid "QlNULyBFe",
:edit/time 1588083602997,
:edit/email "tangj1122@gmail.com"}
{:block/string "add a CODE_OF_CONDUCT.md",
:create/email "tangj1122@gmail.com",
:create/time 1587480357277,
:block/uid "en07e4n1k",
:edit/time 1588083604388,
:edit/email "tangj1122@gmail.com"}],
:block/uid "gNuRiTsHa",
:edit/time 1587480316953,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1587394100380,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587394386840,
:node/title "Parser Tests",
:block/children
[{:block/string "",
:create/email "tangjih@gmail.com",
:create/time 1585854005212,
:block/uid "g7QNGWuA-",
:edit/time 1587394570336,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangjih@gmail.com",
:create/time 1585854029114,
:block/uid "oetAI_6Ok",
:edit/time 1587394570334,
:edit/email "tangj1122@gmail.com"}
{:block/string "[[Athens]]",
:create/email "tangjih@gmail.com",
:create/time 1585854041028,
:block/uid "ouzDpjwW9",
:edit/time 1587394570335,
:edit/email "tangj1122@gmail.com"}
{:block/string "[[[[Open Source]] [[Roam]]]]",
:create/email "tangjih@gmail.com",
:create/time 1585854430003,
:block/children
[{:block/string "[[Open Source]]",
:create/email "tangjih@gmail.com",
:create/time 1585854027713,
:block/uid "uofTB-OWX",
:edit/time 1587394570335,
:edit/email "tangj1122@gmail.com"}
{:block/string "[[Roam]]",
:create/email "tangjih@gmail.com",
:create/time 1585854043600,
:block/uid "EfEXm9xn-",
:edit/time 1587394570335,
:edit/email "tangj1122@gmail.com"}],
:block/uid "fuSLMy2-5",
:edit/time 1587394570335,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangjih@gmail.com",
:create/time 1585854048416,
:block/uid "5DBdwysla",
:edit/time 1587394570335,
:edit/email "tangj1122@gmail.com"}
{:block/string "#Athens",
:create/email "tangjih@gmail.com",
:create/time 1585854089587,
:block/children
[{:block/string "#[[[[Open Source]] [[Roam]]]]",
:create/email "tangjih@gmail.com",
:create/time 1585854422776,
:block/uid "22M2mKGfk",
:edit/time 1587394570335,
:edit/email "tangj1122@gmail.com"}
{:block/string "#[[Open Source]]",
:create/email "tangjih@gmail.com",
:create/time 1585854442383,
:block/uid "7I9n3ShLp",
:edit/time 1587394570335,
:edit/email "tangj1122@gmail.com"}
{:block/string "#Roam",
:create/email "tangjih@gmail.com",
:create/time 1585854445017,
:block/uid "xUI5RbEe6",
:edit/time 1587394570335,
:edit/email "tangj1122@gmail.com"}],
:block/uid "QMzKdE_Xw",
:edit/time 1587394570335,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangjih@gmail.com",
:create/time 1585854421673,
:block/uid "2oX8O3ENh",
:edit/time 1587394570335,
:edit/email "tangj1122@gmail.com"}
{:block/string "Deeply",
:create/email "tangjih@gmail.com",
:create/time 1585854113829,
:block/children
[{:block/string "nested",
:create/email "tangjih@gmail.com",
:create/time 1585854111443,
:block/children
[{:block/string "text",
:create/email "tangjih@gmail.com",
:create/time 1585854094271,
:block/children
[{:block/string "#Athens",
:create/email "tangjih@gmail.com",
:create/time 1585854101494,
:block/uid "_bQy9kdDf",
:edit/time 1587394570335,
:edit/email "tangj1122@gmail.com"}
{:block/string "yeet",
:block/uid "lB9pr2nQt",
:edit/time 1587394570335,
:edit/email "tangj1122@gmail.com"}],
:block/uid "XDQooxShl",
:edit/time 1587394570335,
:edit/email "tangj1122@gmail.com"}],
:block/uid "BhEEYkWp4",
:edit/time 1587394570335,
:edit/email "tangj1122@gmail.com"}],
:block/uid "Mv2qPpzoU",
:edit/time 1587394570335,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangjih@gmail.com",
:create/time 1585854377859,
:block/uid "6ho-W34o-",
:edit/time 1587394570335,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangjih@gmail.com",
:create/time 1585854140082,
:block/uid "RYrVbJz_K",
:edit/time 1587394570335,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangjih@gmail.com",
:create/time 1585854140261,
:block/uid "_lqJCwDXC",
:edit/time 1587394570336,
:edit/email "tangj1122@gmail.com"}
{:block/string "recursion is cool ",
:create/email "tangjih@gmail.com",
:create/time 1585854138647,
:block/children
[{:block/string "((loYcT0quv))",
:block/children
[{:block/string "((Op4PmlWR4))",
:block/children
[{:block/string "((Ps7JGIDZl))",
:block/children
[{:block/string "((nYTO6kDtc))",
:block/children
[{:block/string "((e8K1FSxvx))",
:block/uid "vg2TX_oB-",
:edit/time 1587394570336,
:edit/email "tangj1122@gmail.com"}],
:block/uid "e8K1FSxvx",
:edit/time 1587394570336,
:edit/email "tangj1122@gmail.com"}],
:block/uid "Op4PmlWR4",
:edit/time 1587394570336,
:edit/email "tangj1122@gmail.com"}],
:block/uid "nYTO6kDtc",
:edit/time 1587394570336,
:edit/email "tangj1122@gmail.com"}],
:block/uid "Ps7JGIDZl",
:edit/time 1587394570336,
:edit/email "tangj1122@gmail.com"}],
:block/uid "loYcT0quv",
:edit/time 1587394570336,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangjih@gmail.com",
:create/time 1585854202450,
:block/uid "PXCpaWN2s",
:edit/time 1587394570336,
:edit/email "tangj1122@gmail.com"}
{:block/string "transclusion is cooler: ((loYcT0quv))",
:create/email "tangjih@gmail.com",
:create/time 1585854200000,
:block/uid "NFzIVzykq",
:edit/time 1587394570336,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangjih@gmail.com",
:create/time 1585854349742,
:block/uid "FiLK03ISG",
:edit/time 1587394570336,
:edit/email "tangj1122@gmail.com"}
{:block/string "how about block embeds",
:create/email "tangjih@gmail.com",
:create/time 1585854341686,
:block/children
[{:block/string "{{embed: ((loYcT0quv))}}",
:create/email "tangjih@gmail.com",
:create/time 1585854354319,
:block/uid "9GGNcEn5l",
:edit/time 1587394570336,
:edit/email "tangj1122@gmail.com"}],
:block/uid "Ix92oBkJL",
:edit/time 1587394570336,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangjih@gmail.com",
:create/time 1585854504013,
:block/uid "nC3NfODAq",
:edit/time 1587394570336,
:edit/email "tangj1122@gmail.com"}
{:block/string "Athens",
:create/email "tangj1122@gmail.com",
:create/time 1585935842410,
:block/uid "L16mPEyqP",
:edit/time 1587394397228,
:edit/email "tangj1122@gmail.com"}
{:block/string "[[Athens]]",
:create/email "tangj1122@gmail.com",
:create/time 1585935816504,
:block/uid "1L8mO2hR6",
:edit/time 1587394397226,
:edit/email "tangj1122@gmail.com"}
{:block/string "[[Athens[[]]",
:create/email "tangj1122@gmail.com",
:create/time 1585935725100,
:block/uid "uiZLftp3F",
:edit/time 1587394397227,
:edit/email "tangj1122@gmail.com"}
{:block/string "[[Open[[Athens[[Roam]]]]]]",
:create/email "tangj1122@gmail.com",
:create/time 1585938819774,
:block/uid "bNx8N5YPK",
:edit/time 1587394397227,
:edit/email "tangj1122@gmail.com"}
{:block/string "[[Athens[[",
:create/email "tangj1122@gmail.com",
:create/time 1585935732006,
:block/uid "ZNObXqzTk",
:edit/time 1587394397227,
:edit/email "tangj1122@gmail.com"}
{:block/string "[[[[Open Source]] Roam]]",
:create/email "tangj1122@gmail.com",
:create/time 1585937201002,
:block/uid "FlpRlEM6B",
:edit/time 1587394397227,
:edit/email "tangj1122@gmail.com"}
{:block/string "[[Open Source [[Roam]]]]",
:create/email "tangj1122@gmail.com",
:create/time 1585937196410,
:block/uid "_X1kZjHfe",
:edit/time 1587394397227,
:edit/email "tangj1122@gmail.com"}
{:block/string "[[[[Open Source]] [[Roam]]]]",
:create/email "tangj1122@gmail.com",
:create/time 1585935825112,
:block/uid "5L3ii5zce",
:edit/time 1587394397227,
:edit/email "tangj1122@gmail.com"}
{:block/string "[[Athen],s]]",
:create/email "tangj1122@gmail.com",
:create/time 1585937234874,
:block/uid "U8ESdEt0-",
:edit/time 1587394397227,
:edit/email "tangj1122@gmail.com"}
{:block/string "[[Athens [ATH]]]",
:create/email "tangj1122@gmail.com",
:create/time 1585943626232,
:block/uid "sydt7uZeK",
:edit/time 1587394397227,
:edit/email "tangj1122@gmail.com"}
{:block/string "abcdef]] ]]",
:create/email "tangj1122@gmail.com",
:create/time 1585966717532,
:block/uid "wW7y3M73R",
:edit/time 1587394397227,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1587394567012,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587398989814,
:node/title "Roam White Paper",
:block/children
[{:block/string
"source:: https://roamresearch.com/#/app/help/page/Vu1MmjinS",
:create/email "tangj1122@gmail.com",
:create/time 1587399340743,
:block/uid "hncmHplhJ",
:edit/time 1587404188786,
:edit/email "tangj1122@gmail.com"}
{:block/string "type:: notes",
:create/email "tangj1122@gmail.com",
:create/time 1587479831113,
:block/uid "qnOuSuP_J",
:edit/time 1587479833167,
:edit/email "tangj1122@gmail.com"}
{:block/string "Comments",
:create/email "tangj1122@gmail.com",
:create/time 1587399343934,
:block/children
[{:block/string
"Roam is superficially competing with Notion or Evernote. At its most ambitious, Roam is competing with Wikipedia and Google.",
:create/email "tangj1122@gmail.com",
:create/time 1587403687948,
:block/children
[{:block/string "((AEpNgEnfl))",
:create/email "tangj1122@gmail.com",
:create/time 1587403683775,
:block/uid "u7s-UPBzN",
:edit/time 1587403687950,
:edit/email "tangj1122@gmail.com"}],
:block/uid "mZmSLEfQQ",
:edit/time 1587404704819,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Most technologies utilize a [[file cabinet]] design. Some have tags. Both these organizational techniques are appendages.",
:create/email "tangj1122@gmail.com",
:create/time 1587404470327,
:block/children
[{:block/string "((ZpnZnJv4p))",
:create/email "tangj1122@gmail.com",
:create/time 1587403736222,
:block/uid "7neW89TxQ",
:edit/time 1587404506182,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Bi-directional links blur the distinction between tags and links. A tag becomes a page, a link becomes a page.",
:create/email "tangj1122@gmail.com",
:create/time 1587404512369,
:block/uid "xjIynmbX1",
:edit/time 1587404551974,
:edit/email "tangj1122@gmail.com"}],
:block/uid "dMcfIKdGN",
:edit/time 1587404470854,
:edit/email "tangj1122@gmail.com"}
{:block/string "The case for [[transclusions]]",
:create/email "tangj1122@gmail.com",
:create/time 1587404452856,
:block/children
[{:block/string "((uewt2CFSI))",
:create/email "tangj1122@gmail.com",
:create/time 1587404450507,
:block/uid "NXZRMgmQg",
:edit/time 1587404451959,
:edit/email "tangj1122@gmail.com"}],
:block/uid "lIPiyw4yp",
:edit/time 1587404491426,
:edit/email "tangj1122@gmail.com"}
{:block/string "Can't selectively share subgraphs yet ¯\\_(ツ)_/¯",
:create/email "tangj1122@gmail.com",
:create/time 1587404603291,
:block/children
[{:block/string "((1JerDhKK_))",
:create/email "tangj1122@gmail.com",
:create/time 1587404612245,
:block/uid "JDkED2wmv",
:edit/time 1587404613398,
:edit/email "tangj1122@gmail.com"}],
:block/uid "D0yvzY628",
:edit/time 1587404623650,
:edit/email "tangj1122@gmail.com"}
{:block/string "Graphs are the most flexible [[data structure]]",
:create/email "tangj1122@gmail.com",
:create/time 1587405137022,
:block/children
[{:block/string "((UhwDw_Nu5))",
:create/email "tangj1122@gmail.com",
:create/time 1587405163910,
:block/uid "mQ9B5KTvr",
:edit/time 1587405191510,
:edit/email "tangj1122@gmail.com"}
{:block/string
"A singly-linked list is a subset of trees. Trees are a subset of graphs.",
:create/email "tangj1122@gmail.com",
:create/time 1587405191495,
:block/uid "Zf-JZEtn2",
:edit/time 1587405218029,
:edit/email "tangj1122@gmail.com"}
{:block/string
"[[Notion]]/[[Airtable]] tables should be able to be composed from Roam blocks and pages.",
:create/email "tangj1122@gmail.com",
:create/time 1587405220037,
:block/uid "iQBW_YFSA",
:edit/time 1587405241206,
:edit/email "tangj1122@gmail.com"}],
:block/uid "qfh5UEohM",
:edit/time 1587405163913,
:edit/email "tangj1122@gmail.com"}
{:block/string
"For Roam's power users, the amount of noise is getting overwhelming. Noise in the form of sibling pages (why users feature request synonyms), and noise in term of search results (users now doing advanced queries).",
:create/email "tangj1122@gmail.com",
:create/time 1587405347408,
:block/children
[{:block/string "((YYzt4DOfO))",
:create/email "tangj1122@gmail.com",
:create/time 1587405361336,
:block/uid "xVhwPw_m9",
:edit/time 1587405363364,
:edit/email "tangj1122@gmail.com"}],
:block/uid "SogsOoY8Q",
:edit/time 1587406477122,
:edit/email "tangj1122@gmail.com"}
{:block/string
"The case for generalists (or what I like to call polymaths-in-training)",
:create/email "tangj1122@gmail.com",
:create/time 1587405458659,
:block/children
[{:block/string "((7SfYyQhq_))",
:create/email "tangj1122@gmail.com",
:create/time 1587405461437,
:block/uid "LN4DHC00K",
:edit/time 1587405462832,
:edit/email "tangj1122@gmail.com"}],
:block/uid "9vmkQDzy6",
:edit/time 1587405485663,
:edit/email "tangj1122@gmail.com"}
{:block/string
"[[wisdom of the crowd]] vs [[tyranny of the majority]]",
:create/email "tangj1122@gmail.com",
:create/time 1587405715124,
:block/uid "iDNlQwa0L",
:edit/time 1587406455779,
:edit/email "tangj1122@gmail.com"}],
:block/uid "Nc_FwXdy3",
:edit/time 1587403445925,
:edit/email "tangj1122@gmail.com"}
{:block/string "Contents",
:create/email "tangj1122@gmail.com",
:create/time 1587399342043,
:block/children
[{:block/string
"While this exponential growth presents enormous opportunities for individuals and society at large, neither the human brain nor current technologies are equipped to harness it to its full potential.",
:create/email "tangj1122@gmail.com",
:create/time 1587403446108,
:block/uid "AEpNgEnfl",
:edit/time 1587403681316,
:edit/email "tangj1122@gmail.com"}
{:block/string
"While we are presented with a plethora of choices for organizing knowledge, almost every technology follows the same basic **‘file cabinet’** format: A unit of knowledge is saved to a certain file path, which places it within a taxonomy of folders, chapters or categories. **Tags** may be applied when an item relates to many things, but each file is generally only stored within one nested hierarchy. To access the information, **the user must remember where they stored the file, what they tagged it with, or use a search function to locate it.**",
:create/email "tangj1122@gmail.com",
:create/time 1587404390634,
:block/uid "LiYoaPmWS",
:edit/time 1587404407986,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Unlike the brain, the file cabinet approach makes it difficult or impossible to remix or reuse the same piece of information. Each time a change is made to any given file, it has to be tracked down and updated in every location in which it exists. This leads to redundancy, with a cluttering of near-identical ideas, and significant work any time a system-wide change is required.",
:create/email "tangj1122@gmail.com",
:create/time 1587404444679,
:block/uid "uewt2CFSI",
:edit/time 1587404444891,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Current solutions also lack interconnectivity. Many files are divorced from context; cast into a drawer, rather than methodically fitted into a broader framework of knowledge. Knowledge trees can create pseudo-relationships between files nested within a given hierarchy, but these are not explicit, and can ^^**only describe a vertical ‘parent and child’ taxonomy.**^^ Some tools, such as web pages and **wikis, also allow for orthogonal linking between related files, but this takes place in an ad hoc fashion, and again, there is no ability to explicitly define relationships.**",
:create/email "tangj1122@gmail.com",
:create/time 1587403746549,
:block/uid "ZpnZnJv4p",
:edit/time 1587995988785,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Large-scale collaboration requires a more flexible [[data structure]] than the classic file tree. Roam is built on a knowledge graph that maps all possible relationships, with ‘smart’ links between defined concepts. Users can connect similar ideas in multiple overlapping hierarchies, remix them without overwriting the original context, and **selectively share parts of the graph with others to collaborate on specific sub-questions.**",
:create/email "tangj1122@gmail.com",
:create/time 1587404575492,
:block/uid "1JerDhKK_",
:edit/time 1587404593182,
:edit/email "tangj1122@gmail.com"}
{:block/string
"The interconnectivity of the Roam knowledge graph constantly creates opportunities for serendipity to blossom. Each node in the network can be viewed in **several graphical displays**, allowing users to see related ideas, scan **up and down the vertical hierarchy**, **examine nearby clusters of nodes**, and observe patterns. ",
:create/email "tangj1122@gmail.com",
:create/time 1587404595415,
:block/uid "UhwDw_Nu5",
:edit/time 1587405187186,
:edit/email "tangj1122@gmail.com"}
{:block/string
"The Roam search function can be calibrated to include as much or as little ‘noise’ as the user desires. While looking for a specific passage or note, search is narrow enough to find exactly what the user has in mind. However, it can also be broadened out for ‘**fishing trips’ aimed at surfacing categories of ideas**. Some search results will consist of notes that the user might otherwise have **forgotten about, some will be noise, and others will spark ideas the user didn’t even know they were looking for**.",
:create/email "tangj1122@gmail.com",
:create/time 1587405291734,
:block/uid "YYzt4DOfO",
:edit/time 1587405323489,
:edit/email "tangj1122@gmail.com"}
{:block/string
"The synthesis and cross-pollination of ideas from diverse fields presents low-hanging fruit for both individuals and society. **The investment of time and effort required to become a specialist quickly runs into a point of diminishing returns**. By contrast, accumulating a **‘talent stack’ of dilettante-level knowledge or skills** can unlock insights and opportunities that have not been capitalised on by experts with a narrower focus.",
:create/email "tangj1122@gmail.com",
:create/time 1587405292384,
:block/uid "7SfYyQhq_",
:edit/time 1587405449949,
:edit/email "tangj1122@gmail.com"}
{:block/string
"While the individual use case for Roam stands on its own merits, ^^**the ultimate goal is to create a platform for collaborative research and learning**^^. Current **protocols** are bound by the assumption of necessary consensus. The flexibility of a **curated knowledge graph** allows for a more **pluralistic** approach, with the ability to weight conflicting opinions and separate signal from noise without resorting to either [[autocracy]] or [[democracy]]. ",
:create/email "tangj1122@gmail.com",
:create/time 1587405525844,
:block/uid "pmlWQCSBi",
:edit/time 1587405607857,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Simple popularity contests do not always move us closer to the truth, but they are useful in that they tell us what we believe.",
:create/email "tangj1122@gmail.com",
:create/time 1587405583534,
:block/uid "3T8vBotsE",
:edit/time 1587405712016,
:edit/email "tangj1122@gmail.com"}
{:block/string
"The project of human knowledge, as it stands today, is a vast ocean of ephemeral and fragmented information and ideas, much of it inaccurate, some of it malicious, with the best sources either restricted by gatekeepers, or near-impossible to locate. The volume of information is growing exponentially, which promises enormous opportunities if the underlying coordination problems can be resolved.",
:create/email "cwhitesullivan@gmail.com",
:create/time 1564786451152,
:block/uid "1cIOjY5lJ",
:edit/time 1587405927715,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Clearly a fundamentally different approach is required. ^^The Roam vision for human knowledge is a collective, **open-source intelligence**, constantly rearranging, iterating and evolving in the** pursuit of truth.**^^  Each of us would become a node within this collective intelligence, forging links and creating networks, sharing the very best each has to offer, improving ourselves even as we improve others, and advancing the interests of humanity as a whole.",
:create/email "cwhitesullivan@gmail.com",
:create/time 1564786451152,
:block/uid "iWmBJaChO",
:edit/time 1587405969315,
:edit/email "tangj1122@gmail.com"}],
:block/uid "dI28kO8RR",
:edit/time 1587403286677,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1587398989815,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587400520741,
:node/title "Nat Eliason",
:edit/time 1587400520754,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587400539086,
:node/title "[[Nat Eliason]]: Effortless Output with Roam",
:block/children
[{:block/string
"source:: https://learn.nateliason.com/p/effortless-output-with-roam",
:create/email "tangj1122@gmail.com",
:create/time 1587479842520,
:block/uid "VlIPj__6J",
:edit/time 1587479842520,
:edit/email "tangj1122@gmail.com"}
{:block/string "source:: https://www.nateliason.com/blog/roam",
:create/email "tangj1122@gmail.com",
:create/time 1587403550242,
:block/uid "FH948VHgh",
:edit/time 1587479844334,
:edit/email "tangj1122@gmail.com"}
{:block/string "type:: notes",
:create/email "tangj1122@gmail.com",
:create/time 1587479846081,
:block/uid "JfUQ7Ue3E",
:edit/time 1587479848110,
:edit/email "tangj1122@gmail.com"}
{:block/string "Contents",
:create/email "tangj1122@gmail.com",
:create/time 1587400568987,
:block/children
[{:block/string "Welcome",
:create/email "tangj1122@gmail.com",
:create/time 1587400554213,
:block/uid "Aut87e1og",
:edit/time 1587400562964,
:edit/email "tangj1122@gmail.com"}
{:block/string "Intro to Roam: Core Functions",
:create/email "tangj1122@gmail.com",
:create/time 1587400562961,
:block/children
[{:block/string "The Daily Note",
:create/email "tangj1122@gmail.com",
:create/time 1587400636660,
:block/uid "TFgmeK6aX",
:edit/time 1587400638543,
:edit/email "tangj1122@gmail.com"}
{:block/string "Todos & Tasks",
:create/email "tangj1122@gmail.com",
:create/time 1587400638541,
:block/uid "6cTG1q7NU",
:edit/time 1587400642962,
:edit/email "tangj1122@gmail.com"}
{:block/string "The Date Picker",
:create/email "tangj1122@gmail.com",
:create/time 1587400642960,
:block/uid "j3RufWWrN",
:edit/time 1587400645666,
:edit/email "tangj1122@gmail.com"}
{:block/string "Linking Between Pages and Basic Tag Usage",
:create/email "tangj1122@gmail.com",
:create/time 1587400645663,
:block/uid "BFmKmjr6D",
:edit/time 1587400651119,
:edit/email "tangj1122@gmail.com"}
{:block/string "Using the Sidebar",
:create/email "tangj1122@gmail.com",
:create/time 1587400651117,
:block/uid "UUdMRMXJc",
:edit/time 1587400653015,
:edit/email "tangj1122@gmail.com"}
{:block/string "Filtering",
:create/email "tangj1122@gmail.com",
:create/time 1587400653012,
:block/uid "Ptkj0_fNo",
:edit/time 1587400653919,
:edit/email "tangj1122@gmail.com"}
{:block/string "Capturing Ideas on the Go",
:create/email "tangj1122@gmail.com",
:create/time 1587400653917,
:block/uid "99-MHbL6Y",
:edit/time 1587400657090,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Referencing and Embedding Blocks on Other Pages",
:create/email "tangj1122@gmail.com",
:create/time 1587400658256,
:block/uid "XqI5FPX0e",
:edit/time 1587400664301,
:edit/email "tangj1122@gmail.com"}
{:block/string "Working with Images in Roam",
:create/email "tangj1122@gmail.com",
:create/time 1587400664299,
:block/uid "V9gxittoC",
:edit/time 1587400667085,
:edit/email "tangj1122@gmail.com"}
{:block/string "Using the Context Menu",
:create/email "tangj1122@gmail.com",
:create/time 1587400667082,
:block/uid "6QWaNNqWz",
:edit/time 1587400670027,
:edit/email "tangj1122@gmail.com"}],
:block/uid "u8c_3YAtQ",
:edit/time 1587400567690,
:edit/email "tangj1122@gmail.com"}
{:block/string "[[Personal Knowledge Management]] in Roam",
:create/email "tangj1122@gmail.com",
:create/time 1587400567688,
:block/children
[{:block/string "Attributes and Metadata",
:create/email "tangj1122@gmail.com",
:create/time 1587400675493,
:block/uid "zxEsuYZRI",
:edit/time 1587400679933,
:edit/email "tangj1122@gmail.com"}
{:block/string "Adding Articles Notes to Roam",
:create/email "tangj1122@gmail.com",
:create/time 1587400678882,
:block/uid "-RyeXwEO6",
:edit/time 1587400683824,
:edit/email "tangj1122@gmail.com"}
{:block/string "Adding Kindle Notes to Roam",
:create/email "tangj1122@gmail.com",
:create/time 1587400683822,
:block/uid "z0f33tX44",
:edit/time 1587400686878,
:edit/email "tangj1122@gmail.com"}
{:block/string "Adding Physical Book Notes to Roam",
:create/email "tangj1122@gmail.com",
:create/time 1587400686875,
:block/uid "Od8FmOX3u",
:edit/time 1587400692370,
:edit/email "tangj1122@gmail.com"}
{:block/string "[[Progressive Summarization]] in Roam",
:create/email "tangj1122@gmail.com",
:create/time 1587400692368,
:block/children
[{:block/string
"applying [[Tiago Forte]]'s [method](https://fortelabs.co/blog/progressive-summarization-a-practical-technique-for-designing-discoverable-notes/) to Roam",
:create/email "tangj1122@gmail.com",
:create/time 1587400824738,
:block/uid "zDabiF7Aw",
:edit/time 1587400892964,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Crystallize the important content from a source in successive layers, opportunistically ",
:create/email "tangj1122@gmail.com",
:create/time 1587400847397,
:block/children
[{:block/string "Ingest source content",
:create/email "tangj1122@gmail.com",
:create/time 1587400963031,
:block/children
[{:block/string "article text",
:create/email "tangj1122@gmail.com",
:create/time 1587401205270,
:block/uid "UVEMwcuFW",
:edit/time 1587401252175,
:edit/email "tangj1122@gmail.com"}
{:block/string "your random thoughts",
:create/email "tangj1122@gmail.com",
:create/time 1587401211969,
:block/uid "ZejMTGwqk",
:edit/time 1587401257861,
:edit/email "tangj1122@gmail.com"}
{:block/string "a file",
:create/email "tangj1122@gmail.com",
:create/time 1587401220432,
:block/uid "S6Lbm4uZj",
:edit/time 1587401222110,
:edit/email "tangj1122@gmail.com"}
{:block/string "kindle highlights",
:create/email "tangj1122@gmail.com",
:create/time 1587401222290,
:block/uid "VFiOoH4U5",
:edit/time 1587401224948,
:edit/email "tangj1122@gmail.com"}
{:block/string "email",
:create/email "tangj1122@gmail.com",
:create/time 1587401225503,
:block/uid "LgQO-l2Jv",
:edit/time 1587401238543,
:edit/email "tangj1122@gmail.com"}],
:block/uid "fcizycPeg",
:edit/time 1587401205274,
:edit/email "tangj1122@gmail.com"}
{:block/string "Bold the most important parts",
:create/email "tangj1122@gmail.com",
:create/time 1587401012517,
:block/uid "gkULS--mG",
:edit/time 1587401076740,
:edit/email "tangj1122@gmail.com"}
{:block/string "Highlight the most important parts",
:create/email "tangj1122@gmail.com",
:create/time 1587401017083,
:block/uid "-U95h2NqG",
:edit/time 1587401023747,
:edit/email "tangj1122@gmail.com"}
{:block/string "Summarize in your own words",
:create/email "tangj1122@gmail.com",
:create/time 1587401028667,
:block/uid "nY_ig6r0W",
:edit/time 1587401041722,
:edit/email "tangj1122@gmail.com"}
{:block/string "Remix and generate your own content",
:create/email "tangj1122@gmail.com",
:create/time 1587401032856,
:block/uid "psxzlp5fu",
:edit/time 1587401100737,
:edit/email "tangj1122@gmail.com"}],
:block/uid "EtrsCwdTW",
:edit/time 1587401188520,
:edit/email "tangj1122@gmail.com"}
{:block/string "Prog Summ in Roam is just using links",
:create/email "tangj1122@gmail.com",
:create/time 1587401109248,
:block/uid "BCgxVjgWg",
:edit/time 1587401132477,
:edit/email "tangj1122@gmail.com"}],
:block/uid "4VJ3p7-m8",
:edit/time 1587400699207,
:edit/email "tangj1122@gmail.com"}
{:block/string "Taking Smart Notes in Roam",
:create/email "tangj1122@gmail.com",
:create/time 1587400697567,
:block/children
[{:block/string
"applying [[How to Take Smart Notes]] by \n[[Sönke Ahrens]] to Roam",
:create/email "tangj1122@gmail.com",
:create/time 1587401341725,
:block/children
[{:block/string
"which is based off of [[Niklas Luhmann]]'s [[Zettelkasten]]",
:create/email "tangj1122@gmail.com",
:create/time 1587401376809,
:block/uid "-gd8jpBfu",
:edit/time 1587401414681,
:edit/email "tangj1122@gmail.com"}],
:block/uid "rScacf1Mj",
:edit/time 1587401375910,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Create an Ideas section (equivalent to a Summary) of the ideas from a book",
:create/email "tangj1122@gmail.com",
:create/time 1587401428336,
:block/uid "UNKW2tuDb",
:edit/time 1587401776877,
:edit/email "tangj1122@gmail.com"}
{:block/string
"For each idea block, append the original source as a link (using a text editor like Sublime)",
:create/email "tangj1122@gmail.com",
:create/time 1587401778197,
:block/children
[{:block/string
"![](https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2FdDaARtTet7?alt=media&token=a9c8cf01-6fe9-400c-98a3-b7a8eb84b654)",
:create/email "tangj1122@gmail.com",
:create/time 1587401921317,
:block/uid "ep4T8VbMK",
:edit/time 1587401922957,
:edit/email "tangj1122@gmail.com"}
{:block/string
"You want to do this, according to Smart Notes, because links should be as close to the individual idea/context as possible, rather than as a bibliography at the end",
:create/email "tangj1122@gmail.com",
:create/time 1587401830041,
:block/uid "DCx1LEi7i",
:edit/time 1587401984060,
:edit/email "tangj1122@gmail.com"}],
:block/uid "P9tZLhTJJ",
:edit/time 1587401828728,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Then copy each idea block to other contexts/pages/sources",
:create/email "tangj1122@gmail.com",
:create/time 1587401995042,
:block/uid "B96NjLnXg",
:edit/time 1587402638004,
:edit/email "tangj1122@gmail.com"}],
:block/uid "viB_z4CWE",
:edit/time 1587401423045,
:edit/email "tangj1122@gmail.com"}
{:block/string "Organizing Your Notes into Head Pages",
:create/email "tangj1122@gmail.com",
:create/time 1587400703758,
:block/children
[{:block/string
"Summaries for your Roam itself, because you eventually accumulate so much content and so many links/pages an on area of knowledge",
:create/email "tangj1122@gmail.com",
:create/time 1587402178729,
:block/uid "47oUuyvHK",
:edit/time 1587402476601,
:edit/email "tangj1122@gmail.com"}
{:block/string "Essentially an entrypoint",
:create/email "tangj1122@gmail.com",
:create/time 1587402190660,
:block/uid "f67cnzCfW",
:edit/time 1587402587590,
:edit/email "tangj1122@gmail.com"}],
:block/uid "CbkjDSDQ6",
:edit/time 1587400708915,
:edit/email "tangj1122@gmail.com"}
{:block/string "How to Take Video Notes in Roam",
:create/email "tangj1122@gmail.com",
:create/time 1587400708913,
:block/uid "UNFdQGdKv",
:edit/time 1587403233727,
:edit/email "tangj1122@gmail.com"}],
:block/uid "XyOWNEQbI",
:edit/time 1587400590633,
:edit/email "tangj1122@gmail.com"}
{:block/string "Writing in Roam",
:create/email "tangj1122@gmail.com",
:create/time 1587400564047,
:block/children
[{:block/string "Outlining an Article in Roam",
:create/email "tangj1122@gmail.com",
:create/time 1587400713254,
:block/uid "JbbRFB5xI",
:edit/time 1587401471296,
:edit/email "tangj1122@gmail.com"}
{:block/string "Writing a Draft in Roam",
:create/email "tangj1122@gmail.com",
:create/time 1587400722402,
:block/uid "FuvU_Zbtb",
:edit/time 1587400725030,
:edit/email "tangj1122@gmail.com"}
{:block/string "Writing a Newsletter in Roam",
:create/email "tangj1122@gmail.com",
:create/time 1587400725027,
:block/uid "Q89ELN5Kp",
:edit/time 1587400729982,
:edit/email "tangj1122@gmail.com"}],
:block/uid "L41ltyb9H",
:edit/time 1587400598958,
:edit/email "tangj1122@gmail.com"}
{:block/string "Productivity in Roam",
:create/email "tangj1122@gmail.com",
:create/time 1587400598956,
:block/children
[{:block/string "Intro to Roam Productivity",
:create/email "tangj1122@gmail.com",
:create/time 1587400730714,
:block/uid "XO2xW7OGh",
:edit/time 1587400735217,
:edit/email "tangj1122@gmail.com"}
{:block/string "Goal Tracking in Roam",
:create/email "tangj1122@gmail.com",
:create/time 1587400735215,
:block/uid "fkwqVND7i",
:edit/time 1587400737583,
:edit/email "tangj1122@gmail.com"}
{:block/string "Project Tracking in Roam",
:create/email "tangj1122@gmail.com",
:create/time 1587400737577,
:block/uid "cXtlCRrgQ",
:edit/time 1587400740889,
:edit/email "tangj1122@gmail.com"}
{:block/string "Weekly Planning in Roam",
:create/email "tangj1122@gmail.com",
:create/time 1587400740887,
:block/uid "oItSGAYI_",
:edit/time 1587400743664,
:edit/email "tangj1122@gmail.com"}
{:block/string "The Inbox and Lingering Tasks",
:create/email "tangj1122@gmail.com",
:create/time 1587400743660,
:block/uid "Ch7ZCgcYc",
:edit/time 1587400746908,
:edit/email "tangj1122@gmail.com"}
{:block/string "Daily Task Management",
:create/email "tangj1122@gmail.com",
:create/time 1587400746905,
:block/uid "cGr-JfJN6",
:edit/time 1587400750366,
:edit/email "tangj1122@gmail.com"}],
:block/uid "sCCXggomN",
:edit/time 1587400601365,
:edit/email "tangj1122@gmail.com"}
{:block/string "Roam as a CRM",
:create/email "tangj1122@gmail.com",
:create/time 1587400601361,
:block/children
[{:block/string "Why Roam as a Personal CRM",
:create/email "tangj1122@gmail.com",
:create/time 1587400750572,
:block/uid "SWIvdvw9y",
:edit/time 1587400755952,
:edit/email "tangj1122@gmail.com"}
{:block/string "Creating People for Your CRM",
:create/email "tangj1122@gmail.com",
:create/time 1587400755949,
:block/uid "Wgmy0VGxH",
:edit/time 1587400759661,
:edit/email "tangj1122@gmail.com"}
{:block/string "Progressively Updating Your CRM",
:create/email "tangj1122@gmail.com",
:create/time 1587400759658,
:block/uid "wq_YtKGX4",
:edit/time 1587400764355,
:edit/email "tangj1122@gmail.com"}
{:block/string "Searching Your CRM with Advanced Filtering",
:create/email "tangj1122@gmail.com",
:create/time 1587400765710,
:block/uid "ctvE4h5ez",
:edit/time 1587400775355,
:edit/email "tangj1122@gmail.com"}],
:block/uid "yAFTcPtkO",
:edit/time 1587400605552,
:edit/email "tangj1122@gmail.com"}
{:block/string "Roam for Journaling",
:create/email "tangj1122@gmail.com",
:create/time 1587400605550,
:block/children
[{:block/string "Morning Pages in Roam",
:create/email "tangj1122@gmail.com",
:create/time 1587400775981,
:block/uid "Ng7WWwn4k",
:edit/time 1587400778900,
:edit/email "tangj1122@gmail.com"}],
:block/uid "J7ATB0s3h",
:edit/time 1587400621343,
:edit/email "tangj1122@gmail.com"}
{:block/string "Advanced Topics",
:create/email "tangj1122@gmail.com",
:create/time 1587400621340,
:block/children
[{:block/string "Using Queries for Advanced Filtering",
:create/email "tangj1122@gmail.com",
:create/time 1587400779346,
:block/uid "LShUrybAG",
:edit/time 1587400783245,
:edit/email "tangj1122@gmail.com"}
{:block/string "Creating Diagrams to Organize Your Notes",
:create/email "tangj1122@gmail.com",
:create/time 1587400783242,
:block/uid "qt8FL2Kb7",
:edit/time 1587400789537,
:edit/email "tangj1122@gmail.com"}
{:block/string "Making Tables in Roam",
:create/email "tangj1122@gmail.com",
:create/time 1587400789535,
:block/uid "if4CS-NOD",
:edit/time 1587400793010,
:edit/email "tangj1122@gmail.com"}
{:block/string "Doing Calculations in Roam",
:create/email "tangj1122@gmail.com",
:create/time 1587400793007,
:block/uid "Eq2KkDuNf",
:edit/time 1587400795792,
:edit/email "tangj1122@gmail.com"}
{:block/string "Encrypting Sensitive Data",
:create/email "tangj1122@gmail.com",
:create/time 1587400795790,
:block/uid "N446sVpob",
:edit/time 1587400804004,
:edit/email "tangj1122@gmail.com"}],
:block/uid "YMyI_FqP1",
:edit/time 1587400623716,
:edit/email "tangj1122@gmail.com"}
{:block/string "Bonus Use Cases",
:create/email "tangj1122@gmail.com",
:create/time 1587400628551,
:block/children
[{:block/string "Recipes and Cooking in Roam",
:create/email "tangj1122@gmail.com",
:create/time 1587400804266,
:block/uid "sYlxyk_vt",
:edit/time 1587400808948,
:edit/email "tangj1122@gmail.com"}],
:block/uid "MAlr0BU0N",
:edit/time 1587400631694,
:edit/email "tangj1122@gmail.com"}],
:block/uid "NKivBABfB",
:edit/time 1587400575687,
:edit/email "tangj1122@gmail.com"}
{:block/string "Comments",
:create/email "tangj1122@gmail.com",
:create/time 1587402580729,
:block/children
[{:block/string "((47oUuyvHK))",
:create/email "tangj1122@gmail.com",
:create/time 1587402680419,
:block/children
[{:block/string
"If you're constantly updating it (which you should be), may fulfill a similar role to [[evergreen notes]] (although it reduces multiple ideas, rather than being one atomic idea)",
:create/email "tangj1122@gmail.com",
:create/time 1587402582601,
:block/uid "R5QfsCw6-",
:edit/time 1587402589677,
:edit/email "tangj1122@gmail.com"}],
:block/uid "FKxcSMaG8",
:edit/time 1587402680419,
:edit/email "tangj1122@gmail.com"}
{:block/string "((B96NjLnXg))",
:create/email "tangj1122@gmail.com",
:create/time 1587402647308,
:block/children
[{:block/string
"Personally I would just block ref so you you have the idea in both pages or in multiple pages",
:create/email "tangj1122@gmail.com",
:create/time 1587402591280,
:block/uid "0-hyeYmSm",
:edit/time 1587402631493,
:edit/email "tangj1122@gmail.com"}],
:block/uid "U0CFKDXbS",
:edit/time 1587402648195,
:edit/email "tangj1122@gmail.com"}],
:block/uid "isf6PfJye",
:edit/time 1587402582603,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1587403511952,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587400590637,
:node/title "Personal Knowledge Management",
:edit/time 1587400590641,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587400696787,
:node/title "Progressive Summarization",
:edit/time 1587400696789,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587400842580,
:node/title "Tiago Forte",
:edit/time 1587400842581,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587401305144,
:node/title "Niklas Luhmann",
:edit/time 1587401305146,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587401361737,
:node/title "Sönke Ahrens",
:edit/time 1587401361738,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587401366438,
:node/title "How to Take Smart Notes",
:edit/time 1587401366438,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587401414682,
:node/title "Zettelkasten",
:edit/time 1587401414683,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587402558700,
:node/title "evergreen notes",
:edit/time 1587402558714,
:edit/email "tangj1122@gmail.com"}
{:node/title "April 21st, 2020",
:block/children
[{:block/string
"10:36 recreate a [[type]] attribute for structured attribute tables: [[type]]",
:create/email "tangj1122@gmail.com",
:create/time 1587479928778,
:block/uid "fNKxUujwt",
:edit/time 1587481600353,
:edit/email "tangj1122@gmail.com"}
{:block/string
":((( lost 90% of my writing from yesterday on the FAQ and lost all of [[Why you should learn Clojure - my first month as a Clojurian]]",
:create/email "tangj1122@gmail.com",
:create/time 1587479787864,
:block/uid "knwQAU8sD",
:edit/time 1587494389518,
:edit/email "tangj1122@gmail.com"}
{:block/string
"people are pretty interested in querying their database with Datascript/Datalog. Maybe I'll write a library to make this easier since a the raw Datascript query in Roam is limited and buggy",
:create/email "tangj1122@gmail.com",
:create/time 1587479969763,
:block/uid "NtGjfp99s",
:edit/time 1587480248887,
:edit/email "tangj1122@gmail.com"}
{:block/string "[[Athens Change Log]]",
:create/email "tangj1122@gmail.com",
:create/time 1587480044071,
:block/children
[{:block/string "add a CONTRIBUTING.md",
:create/email "tangj1122@gmail.com",
:create/time 1587480371323,
:block/uid "5FrCnC6FS",
:edit/time 1588083598728,
:edit/email "tangj1122@gmail.com"}],
:block/uid "Y36uAra27",
:edit/time 1587480371326,
:edit/email "tangj1122@gmail.com"}
{:block/string "[[[[Datascript]] FAQ]]",
:create/email "tangj1122@gmail.com",
:create/time 1587481273713,
:block/uid "4Hk0qIOLF",
:edit/time 1588015318491,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1587455454368,
:edit/email "unlearntodaycom@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587403614595,
:node/title "source",
:block/children
[{:block/string "{{attr-table: [[source]]}}",
:create/email "tangj1122@gmail.com",
:create/time 1588358746988,
:block/uid "UCPFrPRTq",
:edit/time 1588358756302,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1588358756297,
:block/uid "23IyJjw3t",
:edit/time 1588358756297,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1587403614596,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587404024749,
:node/title "file cabinet",
:edit/time 1587404024763,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587404491428,
:node/title "transclusions",
:edit/time 1587404491431,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587404580563,
:node/title "data structure",
:edit/time 1587404580564,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587405229820,
:node/title "Notion",
:edit/time 1587405229821,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587405231666,
:node/title "Airtable",
:edit/time 1587405231666,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587405607022,
:node/title "autocracy",
:edit/time 1587405607029,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587405607858,
:node/title "democracy",
:edit/time 1587405607859,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587405723628,
:node/title "wisdom of the crowd",
:edit/time 1587405723629,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587405737404,
:node/title "tyranny of the majority",
:edit/time 1587405737405,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587410707184,
:node/title "Venkatesh Rao",
:edit/time 1587410707197,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587410716561,
:node/title "The Rhetoric of the Hyperlink",
:block/children
[{:block/string
"source:: https://www.ribbonfarm.com/2009/07/01/the-rhetoric-of-the-hyperlink/",
:create/email "tangj1122@gmail.com",
:create/time 1587410734187,
:block/uid "4oOob9WkL",
:edit/time 1587410739509,
:edit/email "tangj1122@gmail.com"}
{:block/string "#[[Venkatesh Rao]] #[[ribbonfarm]] #Hyperlink",
:create/email "tangj1122@gmail.com",
:create/time 1587410785185,
:block/uid "ybccVUSxg",
:edit/time 1587778402776,
:edit/email "tangj1122@gmail.com"}
{:block/string "Content",
:create/email "tangj1122@gmail.com",
:create/time 1587410727942,
:block/children
[{:block/string
"The hyperlink is the most elemental of the bundle of ideas that we call the Web. If the bit is the quark of information, the hyperlink is the hydrogen molecule.",
:create/email "tangj1122@gmail.com",
:create/time 1587410750387,
:block/uid "gHCKfrghZ",
:edit/time 1587410750387,
:edit/email "tangj1122@gmail.com"}
{:block/string
"It shapes the microstructure of information today.",
:create/email "tangj1122@gmail.com",
:create/time 1587410729677,
:block/uid "4D_9zjyml",
:edit/time 1587410752198,
:edit/email "tangj1122@gmail.com"}],
:block/uid "dBs9OJ5Xm",
:edit/time 1587410729681,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1587410716562,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587410798053,
:node/title "ribbonfarm",
:edit/time 1587410798055,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587411215224,
:node/title "James P. Carse",
:edit/time 1587411215226,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587411223636,
:node/title "Finite and Infinite Games",
:block/children
[{:block/string "Contents",
:create/email "tangj1122@gmail.com",
:create/time 1587411234023,
:block/children
[{:block/string
"We do not relate to others as the persons we are; we are who we are in relating to others.",
:create/email "tangj1122@gmail.com",
:create/time 1587411235519,
:block/uid "9wSe1KotV",
:edit/time 1587411236639,
:edit/email "tangj1122@gmail.com"}],
:block/uid "mriMq7p-8",
:edit/time 1587411235523,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1587411223637,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587412808581,
:node/title "athens",
:edit/time 1587412808582,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587413251645,
:node/title "Athens FAQ",
:block/children
[{:block/string "type:: [[documentation]]",
:create/email "tangj1122@gmail.com",
:create/time 1587479818428,
:block/uid "6f_4BReoO",
:edit/time 1587923075091,
:edit/email "tangj1122@gmail.com"}
{:block/string "Github: https://github.com/athensresearch/athens",
:create/email "tangj1122@gmail.com",
:create/time 1587575380673,
:block/uid "HJMBcfwRz",
:edit/time 1587933198816,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Roam Slack invite link (join the #athens channel): https://roamresearch.slack.com/join/shared_invite/enQtODg3NjIzODEwNDgwLTdhMjczMGYwN2YyNmMzMDcyZjViZDk0MTA2M2UxOGM5NTMxNDVhNDE1YWVkNTFjMGM4OTE3MTQ3MjEzNzE1MTA",
:create/email "tangj1122@gmail.com",
:create/time 1587577030810,
:block/uid "8mZgP0oYu",
:edit/time 1587577057845,
:edit/email "tangj1122@gmail.com"}
{:block/string "Why open-source?",
:create/email "tangj1122@gmail.com",
:create/time 1587394810566,
:block/children
[{:block/string
"Firstly, I wouldn't be surprised if Roam was eventually open-sourced.",
:create/email "tangj1122@gmail.com",
:create/time 1587408648438,
:block/children
[{:block/string
"The conclusion of the [[Roam White Paper]] states that Roam's vision is a collective, \"open-source\" intelligence.",
:create/email "tangj1122@gmail.com",
:create/time 1587408464965,
:block/children
[{:block/string "((iWmBJaChO))",
:create/email "tangj1122@gmail.com",
:create/time 1587398984978,
:block/uid "WKWPPSYQa",
:edit/time 1587408461268,
:edit/email "tangj1122@gmail.com"}],
:block/uid "ZOxwo0K_7",
:edit/time 1587408923279,
:edit/email "tangj1122@gmail.com"}
{:block/string
"In the Roam Slack, I recall Conor saying one eventual goal is to work on a protocol that affords interoperability between open source alternatives. I would share the message but can't find it because of Slack's 10k message limit.",
:create/email "tangj1122@gmail.com",
:create/time 1587408984520,
:block/uid "VQ-ybRmNh",
:edit/time 1587409663155,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Suffice it to say that Roam being open-source is undeniably something that the team has already considered. Why is it not open-source already? You'd have to ask the Roam team, but Roam, a business, is not obligated to open-source anything.",
:create/email "tangj1122@gmail.com",
:create/time 1587399059363,
:block/uid "gVINXaN8Y",
:edit/time 1587576615126,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Ultimately, we don't know when/if Roam will be open-sourced, but it's possible that Athens could accelerate or catalyze this. Regardless, there will always be some who are open-source maximalists and some who want to self-host, because that's probably really the most secure thing you can do (if you know what you're doing).",
:create/email "tangj1122@gmail.com",
:create/time 1587409137223,
:block/uid "PGGS8MFH_",
:edit/time 1587412930551,
:edit/email "tangj1122@gmail.com"}],
:block/uid "jbiKpcmIX",
:edit/time 1587409250064,
:edit/email "tangj1122@gmail.com"}
{:block/string
"The short answer is the security and privacy of your data.",
:create/email "tangj1122@gmail.com",
:create/time 1587394981333,
:block/uid "GNaf3XzpE",
:edit/time 1587410026041,
:edit/email "tangj1122@gmail.com"}
{:block/string
"The longer answer is that I believe the humble link is arguably the most important protocol to the Web itself. Even if Roam doesn't become open-source, we need to be thinking about bi-directional links as an open standard more deeply and publicly. #Hyperlink",
:create/email "tangj1122@gmail.com",
:create/time 1587410871452,
:block/children
[{:block/string
"The link is the fundamental parameter that drives the most valuable algorithm in the world, Google's PageRank.",
:create/email "tangj1122@gmail.com",
:create/time 1587409104003,
:block/uid "rtNqzJU10",
:edit/time 1587412333209,
:edit/email "tangj1122@gmail.com"}
{:block/string
"[[Venkatesh Rao]], in [[The Rhetoric of the Hyperlink]], writes: ((gHCKfrghZ))",
:create/email "tangj1122@gmail.com",
:create/time 1587410339531,
:block/uid "FBSTouuY2",
:edit/time 1587411388584,
:edit/email "tangj1122@gmail.com"}
{:block/string
"[[James P. Carse]], in [[Finite and Infinite Games]], writes: ((9wSe1KotV))",
:create/email "tangj1122@gmail.com",
:create/time 1587411199096,
:block/uid "QLhYQnUyA",
:edit/time 1587411315462,
:edit/email "tangj1122@gmail.com"}
{:block/string
"The Internet is a __network__ of computers. Society is a __network__ of humans. But unlike computers, there is no \"atomic\" individual. We are defined necessarily through our relationships.",
:create/email "tangj1122@gmail.com",
:create/time 1587411356410,
:block/uid "tR2Wna0ir",
:edit/time 1587412481766,
:edit/email "tangj1122@gmail.com"}
{:block/string
"I hope Athens can play some role in answering the question of how we can design an open protocol for bi-directional links.",
:create/email "tangj1122@gmail.com",
:create/time 1587411592255,
:block/uid "iD4dVwEIR",
:edit/time 1587411985481,
:edit/email "tangj1122@gmail.com"}
{:block/string
"And there is no better time than quaran-time to be reimagining the fabric of our social infrastructure, particularly of what I believe is the most important infrastructure of society today: the Web and the Internet more broadly.",
:create/email "tangj1122@gmail.com",
:create/time 1587411985477,
:block/uid "aK4gKd6Eq",
:edit/time 1587412529275,
:edit/email "tangj1122@gmail.com"}
{:block/string "So let's imagine",
:create/email "tangj1122@gmail.com",
:create/time 1587479203481,
:block/children
[{:block/string
"I can see `<a href=\"www.twitter.com/tangjeff0\" **bidirectional**>Jeff's Twitter</a>` being interesting, `<a href=\"www.twitter.com\" **bidirectional**>Twitter</a>` not so much. The same goes for blogging and social networks generally.",
:create/email "tangj1122@gmail.com",
:create/time 1587394988940,
:block/uid "Rah4b1g0Z",
:edit/time 1587479203485,
:edit/email "tangj1122@gmail.com"}
{:block/string
"What if iMessage, Gmail, and [insert any other app] had bi-directional links?",
:create/email "tangj1122@gmail.com",
:create/time 1587395144822,
:block/children
[{:block/string
"More interestingly, what if they had bi-directional links between one another?",
:create/email "tangj1122@gmail.com",
:create/time 1587395295268,
:block/uid "39RZ5buhi",
:edit/time 1587478259494,
:edit/email "tangj1122@gmail.com"}],
:block/uid "xYunO5c0w",
:edit/time 1587412660063,
:edit/email "tangj1122@gmail.com"}],
:block/uid "Sb9neCBj1",
:edit/time 1587479203481,
:edit/email "tangj1122@gmail.com"}
{:block/string
"I'm not a protocol-designer by any means, but I do think we are standing on the shoulders of giants with regards to the [IETF's RFCs](https://en.wikipedia.org/wiki/List_of_RFCs) and the [[Semantic Web]]. More recently, we've seen a renaissance in open protocol design from the blockchain world. [Drachma](https://en.wikipedia.org/wiki/Greek_drachma) ICO anyone?",
:create/email "tangj1122@gmail.com",
:create/time 1587412679443,
:block/uid "L5GIcpfst",
:edit/time 1588083376962,
:edit/email "tangj1122@gmail.com"}
{:block/string
"If you are interested in this conversation, join us in the #athens channel of the Roam Slack or ping me on Twitter.",
:create/email "tangj1122@gmail.com",
:create/time 1587412773943,
:block/uid "e6K3mCb74",
:edit/time 1587413158276,
:edit/email "tangj1122@gmail.com"}],
:block/uid "6oHUcLKYA",
:edit/time 1587778489739,
:edit/email "tangj1122@gmail.com"}],
:block/uid "BjIm6GeRP",
:edit/time 1587394890601,
:edit/email "tangj1122@gmail.com"}
{:block/string "Why Clojure?",
:create/email "tangj1122@gmail.com",
:create/time 1587394620805,
:block/children
[{:block/string "Ensures possibility of feature parity with Roam.",
:create/email "tangj1122@gmail.com",
:create/time 1587641014871,
:block/children
[{:block/string
"While Clojure is not necessary to develop an application, an application that promises a knowledge graph probably should be built off of a graph database.",
:create/email "tangj1122@gmail.com",
:create/time 1587995768626,
:block/uid "lxMRAb5Y5",
:edit/time 1587996293386,
:edit/email "tangj1122@gmail.com"}],
:block/uid "GZLRVsreB",
:edit/time 1587641024313,
:edit/email "tangj1122@gmail.com"}
{:block/string
"For a deeper breakdown of the technology [[Athens vs Roam Tech Stack]]",
:create/email "tangj1122@gmail.com",
:create/time 1587413354237,
:block/uid "3eptV2Zpm",
:edit/time 1587660114118,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Clojure is great, read [[Why you should learn Clojure - my first month as a Clojurian]]",
:create/email "tangj1122@gmail.com",
:create/time 1587478287983,
:block/uid "42KTGQUyp",
:edit/time 1587576017441,
:edit/email "tangj1122@gmail.com"}],
:block/uid "gEDJF5na2",
:edit/time 1587641032226,
:edit/email "tangj1122@gmail.com"}
{:block/string "What's the roadmap?",
:create/email "tangj1122@gmail.com",
:create/time 1587479157080,
:block/children
[{:block/string "[[Create a Minimal Viable Alternative to Roam]]",
:create/email "tangj1122@gmail.com",
:create/time 1587479160983,
:block/uid "wzJ0kQzXX",
:edit/time 1587746901849,
:edit/email "tangj1122@gmail.com"}
{:block/string "Design and implement a cloud hosted Athens",
:create/email "tangj1122@gmail.com",
:create/time 1587479264330,
:block/uid "S94gjS2Ig",
:edit/time 1587746827511,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Design and implement a React Native mobile client",
:create/email "tangj1122@gmail.com",
:create/time 1587479276739,
:block/uid "Ip9U2KEdq",
:edit/time 1587746870185,
:edit/email "tangj1122@gmail.com"}
{:block/string
"[[Begin RFCs for an open protocol for bi-directional links]] that affords interopability between Roam, Athens, and other applications",
:create/email "tangj1122@gmail.com",
:create/time 1587479282332,
:block/children
[{:block/string "((L5GIcpfst))",
:create/email "tangj1122@gmail.com",
:create/time 1587479588416,
:block/uid "200PVRGaK",
:edit/time 1587479589333,
:edit/email "tangj1122@gmail.com"}],
:block/uid "VF-u1hbXF",
:edit/time 1587480611261,
:edit/email "tangj1122@gmail.com"}],
:block/uid "6mgsvrfj9",
:edit/time 1587479160989,
:edit/email "tangj1122@gmail.com"}
{:block/string "Have you heard about X?",
:create/email "tangj1122@gmail.com",
:create/time 1587995456826,
:block/children
[{:block/string
"There are many other great projects in this space! Checkout:",
:create/email "tangj1122@gmail.com",
:create/time 1587995459436,
:block/children
[{:block/string
"[org-roam](https://github.com/jethrokuan/org-roam)",
:create/email "tangj1122@gmail.com",
:create/time 1587995481242,
:block/uid "XT8svnebx",
:edit/time 1587995558477,
:edit/email "tangj1122@gmail.com"}
{:block/string
"[TiddlyRoam](https://joekroese.github.io/tiddlyroam/)",
:create/email "tangj1122@gmail.com",
:create/time 1587995559171,
:block/uid "NZXZR4v6y",
:edit/time 1587995574452,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1587995575574,
:block/uid "8Zu7tDRus",
:edit/time 1587995575574,
:edit/email "tangj1122@gmail.com"}
{:block/string
"https://nesslabs.com/roam-research-alternatives",
:create/email "tangj1122@gmail.com",
:create/time 1587995654063,
:block/uid "fhL48iiBy",
:edit/time 1587995767620,
:edit/email "tangj1122@gmail.com"}],
:block/uid "w1yDyW7CD",
:edit/time 1587996034435,
:edit/email "tangj1122@gmail.com"}
{:block/string "((lxMRAb5Y5))",
:block/uid "OeDMpsJPo",
:edit/time 1587996347511,
:edit/email "tangj1122@gmail.com"}],
:block/uid "kbrRsiO53",
:edit/time 1587995459440,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1587413251647,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587479786060,
:node/title "type",
:block/children
[{:block/string "type:: table",
:create/email "tangj1122@gmail.com",
:create/time 1587479811266,
:block/uid "bxSm3GcxC",
:edit/time 1587481729103,
:edit/email "tangj1122@gmail.com"}
{:block/string "Background",
:create/email "tangj1122@gmail.com",
:create/time 1587481518837,
:block/children
[{:block/string
"All the things worth checking out will be given a [[type]] attribute.",
:create/email "tangj1122@gmail.com",
:create/time 1587480887156,
:block/uid "cBGfUE1iz",
:edit/time 1587481515779,
:edit/email "tangj1122@gmail.com"}
{:block/string
"[[type]] is the most global level attribute. It applies to both knowledge pages (e.g. notes, writings, and documentation) as well as action pages (e.g. objectives, projects)",
:create/email "tangj1122@gmail.com",
:create/time 1587481452734,
:block/uid "O__1q9Yry",
:edit/time 1587575269160,
:edit/email "tangj1122@gmail.com"}],
:block/uid "6ucEp0qy0",
:edit/time 1587481522183,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1587485745460,
:block/children
[{:block/string "{{attr-table: [[type]]}}",
:create/email "tangj1122@gmail.com",
:create/time 1587480898743,
:block/uid "04rtG1jTu",
:edit/time 1587481616528,
:edit/email "tangj1122@gmail.com"}],
:block/uid "auTYPHsYi",
:edit/time 1587485745460,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1587479786062,
:edit/email "tangj1122@gmail.com"}
{:node/title "asda",
:block/children
[{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1587480089774,
:block/uid "0LgoaE3Re",
:edit/time 1587480113717,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1587480112166,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587480236294,
:node/title
"Why you should learn Clojure - my first month as a Clojurian",
:block/children
[{:block/string "type:: [[writing]]",
:create/email "tangj1122@gmail.com",
:create/time 1587491939193,
:block/uid "a21IGxOZB",
:edit/time 1587923086358,
:edit/email "tangj1122@gmail.com"}
{:block/string "#[[Clojure]]",
:create/email "tangj1122@gmail.com",
:create/time 1587568469205,
:block/uid "L3g5SICq_",
:edit/time 1587568472688,
:edit/email "tangj1122@gmail.com"}
{:block/string "word count: ~1800",
:create/email "tangj1122@gmail.com",
:create/time 1587569052237,
:block/uid "CGqTX0TUz",
:edit/time 1587569075859,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1587569072589,
:block/uid "uDB0m2gGR",
:edit/time 1587569072588,
:edit/email "tangj1122@gmail.com"}
{:block/string
"https://twitter.com/tangjeff0/status/1234688533367050244?s=20",
:create/email "tangj1122@gmail.com",
:create/time 1587491988429,
:block/uid "BLf_VJJjK",
:edit/time 1587493686958,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1587493687120,
:block/uid "qv_FFoFOE",
:edit/time 1587493687120,
:edit/email "tangj1122@gmail.com"}
{:block/string "Intro",
:create/email "tangj1122@gmail.com",
:create/time 1587491949061,
:block/children
[{:block/string
"About a month ago and a half ago I tweeted the chart above. Before that, I wasn't sure I wanted to learn Clojure. The response from the Clojure community was pretty compelling, though, and the more I looked into it, the more I was convinced that it would be a good decision, regardless if I stuck with Clojure long-term. Well, I'm here today to tell you that I'm extremely pleased with the results of this experiment. I plan to stick with Clojure for the foreseeable future. And quite honestly, I would not be sad if I never had to write another line of JavaScript or Python again.",
:create/email "tangj1122@gmail.com",
:create/time 1587493231802,
:block/uid "7H83w86jd",
:edit/time 1587569192771,
:edit/email "tangj1122@gmail.com"}
{:block/string
"But I don't want to make this about imperative or object-oriented vs functional programming. Tribalism is a big problem in the programming world (and the real world). I think rising above the flame wars and taking the best from each side and dropping the worst is ultimately how one can avoid a local optima. You should play with Vim, Emacs, and VS Code; you should learn OOP, FP, and [[logic programming]]; you should use DuckDuckGo and Google, Firefox and Chrome; you should use Linux, Apple, NixOS, and Win-- okay I won't go that far.",
:create/email "tangj1122@gmail.com",
:create/time 1587495059090,
:block/uid "Il572SJzP",
:edit/time 1587568590089,
:edit/email "tangj1122@gmail.com"}],
:block/uid "2b7GlO7Ht",
:edit/time 1587493231805,
:edit/email "tangj1122@gmail.com"}
{:block/string "What convinced me to learn Clojure",
:create/email "tangj1122@gmail.com",
:create/time 1587517947174,
:block/children
[{:block/string "The chart",
:create/email "tangj1122@gmail.com",
:create/time 1587491943787,
:block/children
[{:block/string
"The chart I tweeted is from the [2019 Stack Overflow Survey](https://insights.stackoverflow.com/survey/2019#work-_-salary-and-experience-by-developer-type).",
:create/email "tangj1122@gmail.com",
:create/time 1587495786131,
:block/uid "Owg9BQRd0",
:edit/time 1587495786131,
:edit/email "tangj1122@gmail.com"}
{:block/string
"The responses to my tweet were fairly balanced between the former and the latter. Ultimately, I don't know the answer to the question, but I don't think it really matters. The chart is compressing the experiences of 88,883 software developers. At best it can only tell us correlation. But that's all you need to know.",
:create/email "tangj1122@gmail.com",
:create/time 1587495727926,
:block/uid "VHxDLVv_D",
:edit/time 1587497844677,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Experience and money are correlated, duh. But Clojure correlates with experience! I couldn't stop thinking about this fact.",
:create/email "tangj1122@gmail.com",
:create/time 1587495632267,
:block/uid "gQ2VzPQGe",
:edit/time 1587496290355,
:edit/email "tangj1122@gmail.com"}
{:block/string
"You see, the biggest change for me in the past year or so has been a shift in my decision-making towards longer-term thinking. I'm 23, so I'm young enough that compound interest actually applies to me and old enough to actually care.",
:create/email "tangj1122@gmail.com",
:create/time 1587496290352,
:block/uid "1lwt8gNXX",
:edit/time 1587569256318,
:edit/email "tangj1122@gmail.com"}
{:block/string
"The truth is, the longer you stick with something, the more you intrinsically love it. And the data was there. Clojurians love it.",
:create/email "tangj1122@gmail.com",
:create/time 1587496617979,
:block/uid "basHDqB0Y",
:edit/time 1587497892327,
:edit/email "tangj1122@gmail.com"}
{:block/string
"I think this is generally an under-appreciated fact about software engineering and computer science: all contributions to these two fields are less than 70 years old. We don't have great traditions as in philosophy, mathematics, and literature that reach back centuries or millennia, and even within engineering, software is the youngest discipline. But the works we produce will far outlast any physical works (assuming the electronics and energy guys keep the lights on). If your dinky little JS bundle is scraped by Google or the Internet Archive, it's going to be remembered forever.",
:create/email "tangj1122@gmail.com",
:create/time 1587496839274,
:block/uid "k9772P9h0",
:edit/time 1587569323138,
:edit/email "tangj1122@gmail.com"}
{:block/string
"I for one would want a language that champions posterity and longevity, which in developer-terms might be backwards-compatibility, reliability, maintainability, and accretion. Clojure and Datomic do just that.",
:create/email "tangj1122@gmail.com",
:create/time 1587497037145,
:block/uid "AgyVXzaLb",
:edit/time 1587569343554,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Finally, on the money piece, I don't think Clojurians care that much about it. I believe Clojurians are more so craftsmen and practitioners who intrinsically love what they do. Besides, we know if you just want \"a job\", you should do JS, Java, or .NET. In this case, you'll have far more jobs to apply to and compete with far more people, solidifying your status as a labor commodity.",
:create/email "tangj1122@gmail.com",
:create/time 1587493802016,
:block/uid "-zuCkYLzL",
:edit/time 1587569367318,
:edit/email "tangj1122@gmail.com"}],
:block/uid "pK5yhuRXu",
:edit/time 1587514834325,
:edit/email "tangj1122@gmail.com"}
{:block/string "[[Paul Graham]]",
:create/email "tangj1122@gmail.com",
:create/time 1587495318755,
:block/children
[{:block/string
"Something that has never left me was Paul Graham's [[Beating the Averages]]. I read this post around 4 years ago, when I was first getting into startups and before I even knew how to code. What stuck with me was not that he believed Lisp was the most powerful language, but that programmers could never know what the most powerful language was unless they used it.",
:create/email "tangj1122@gmail.com",
:create/time 1587498187789,
:block/uid "zi9Q4BAuk",
:edit/time 1587500133100,
:edit/email "tangj1122@gmail.com"}
{:block/string "((mRdm8AlH_)) #[[programming languages]] #Lisp",
:create/email "tangj1122@gmail.com",
:create/time 1587499823749,
:block/uid "pA0IQEBQ4",
:edit/time 1587569823724,
:edit/email "tangj1122@gmail.com"}
{:block/string
"In the same way that I believe all programmers should learn several paradigms and text editors, I believe everyone should learn to code if they have the opportunity. Not for some generic economic reason, but because it changes the way you think and it changes the way you learn. #[[meta-cognition]]",
:create/email "tangj1122@gmail.com",
:create/time 1587500281803,
:block/uid "FdQzJuY6m",
:edit/time 1587569448233,
:edit/email "tangj1122@gmail.com"}
{:block/string
"I think most programmers would agree with the latter. But then many fail to extend this logic to learning a different paradigm or a sufficiently different language.",
:create/email "tangj1122@gmail.com",
:create/time 1587500341776,
:block/uid "bVeeaJL79",
:edit/time 1587501722111,
:edit/email "tangj1122@gmail.com"}
{:block/string
"If you want to change your consciousness, learn Clojure. You heard it here first, folks. Clojure is a mind-altering activity. Almost as good as meditation.",
:create/email "tangj1122@gmail.com",
:create/time 1587501755124,
:block/uid "EV-2xQph4",
:edit/time 1587514751603,
:edit/email "tangj1122@gmail.com"}],
:block/uid "jw_A-xv5b",
:edit/time 1587499695957,
:edit/email "tangj1122@gmail.com"}
{:block/string "((eAOpGbnAK))",
:create/email "tangj1122@gmail.com",
:create/time 1587491955000,
:block/children
[{:block/string
"The final thing that convinced me to begin learning Clojure were these two anecdotes of how little code you needed to write.",
:create/email "tangj1122@gmail.com",
:create/time 1587515694073,
:block/uid "bTAEM2qxG",
:edit/time 1587516947526,
:edit/email "tangj1122@gmail.com"}
{:block/string
"In Gene Kim's [[Love Letter To Clojure]], he talks about rewriting an app 3 times:",
:create/email "tangj1122@gmail.com",
:create/time 1587515803034,
:block/children
[{:block/string "((GOaW3BFue))",
:block/uid "F5OpOlgxr",
:edit/time 1587516884513,
:edit/email "tangj1122@gmail.com"}
{:block/string "((xO_sLMBdG))",
:block/uid "A7EOoqOKx",
:edit/time 1587516884513,
:edit/email "tangj1122@gmail.com"}
{:block/string "((O6KSKNcle))",
:block/uid "k4pzLOYWf",
:edit/time 1587516919115,
:edit/email "tangj1122@gmail.com"}],
:block/uid "iLeBk02Xr",
:edit/time 1587516913821,
:edit/email "tangj1122@gmail.com"}
{:block/string
"From the podcast [[Functional Programming with Jessica Kerr]] on Software Engineering Daily:",
:create/email "tangj1122@gmail.com",
:create/time 1587515050581,
:block/children
[{:block/string
"When asked about the benefits of Clojure, Jess says: ((UDS_Ydpai))",
:create/email "tangj1122@gmail.com",
:create/time 1587568344497,
:block/uid "W5fMjrlJ5",
:edit/time 1587568356709,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Later on, when talking about deployment and software more generally, Jess says: ((eAOpGbnAK))",
:create/email "tangj1122@gmail.com",
:create/time 1587568187909,
:block/uid "sdz4zfYdJ",
:edit/time 1587568396111,
:edit/email "tangj1122@gmail.com"}],
:block/uid "4Rw_6ZmhV",
:edit/time 1587568342895,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Now obviously you can tell Gene's bias from his article title. Jessica, on the other hand, is a functional programming polyglot, and in the podcast talks about her experiences with not only Clojure but also Elixir, Elm, Haskell, and Scala.",
:create/email "tangj1122@gmail.com",
:create/time 1587516937860,
:block/uid "HL0vOg_gV",
:edit/time 1587569544460,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Regardless, I was astonished that [Gene](https://twitter.com/RealGeneKim) and [Jess](https://twitter.com/jessitron), who both have decades of experience in industry and pretty large followings as technical influencers, cited Clojure as having two orders of magnitude less code than other languages.",
:create/email "tangj1122@gmail.com",
:create/time 1587517004607,
:block/uid "7wQZQ-LGx",
:edit/time 1587569593235,
:edit/email "tangj1122@gmail.com"}
{:block/string
"I mean... that's unbelievable, and if that doesn't convince you, I'm not quite sure what will.",
:create/email "tangj1122@gmail.com",
:create/time 1587517658118,
:block/uid "qp5QXv52G",
:edit/time 1587569608738,
:edit/email "tangj1122@gmail.com"}],
:block/uid "pu-PeEYBj",
:edit/time 1587568265447,
:edit/email "tangj1122@gmail.com"}],
:block/uid "PHPIc_k49",
:edit/time 1587517956163,
:edit/email "tangj1122@gmail.com"}
{:block/string "Why I'm staying",
:create/email "tangj1122@gmail.com",
:create/time 1587517959795,
:block/children
[{:block/string
"One measure of how ferociously you are on the learning curve is the velocity of revelations you have. The two periods of my programming career where I had the most back-to-back revelations were when I was learning Vim and this past month learning Clojure. And if you're wondering what I mean by a revelation, I mean an insight, an a-ha moment so profound it stirs something in your soul. Ya I wouldn't mind optimizing for revelations.",
:create/email "tangj1122@gmail.com",
:create/time 1587517964033,
:block/uid "sXRV-MeDw",
:edit/time 1587564520727,
:edit/email "tangj1122@gmail.com"}
{:block/string "The REPL",
:create/email "tangj1122@gmail.com",
:create/time 1587518155624,
:block/children
[{:block/string
"Take 15 minutes and watch this video by Val. You will never want to program without a REPL again. https://vvvvalvalval.github.io/posts/what-makes-a-good-repl.html",
:create/email "tangj1122@gmail.com",
:create/time 1587518279947,
:block/uid "_ocoAJipp",
:edit/time 1587569647395,
:edit/email "tangj1122@gmail.com"}],
:block/uid "07I9E9lYX",
:edit/time 1587518208740,
:edit/email "tangj1122@gmail.com"}
{:block/string "Datomic, Datascript, and Datalog",
:create/email "tangj1122@gmail.com",
:create/time 1587493826866,
:block/children
[{:block/string
"I don't even know where to begin. Datomic is so far in the future, so ahead of the curve, it feels like cheating (this is a common feeling I experience writing Clojure). Datomic might actually be Clojure's best-kept secret.",
:create/email "tangj1122@gmail.com",
:create/time 1587518893608,
:block/uid "lPljcuvMY",
:edit/time 1587520204153,
:edit/email "tangj1122@gmail.com"}
{:block/string
"This section deserves its own article, and I will link it here when I learn more, but the TL;DR is:",
:create/email "tangj1122@gmail.com",
:create/time 1587520134286,
:block/children
[{:block/string
"Datalog is a [[logic programming]] query language that uses set logic.",
:create/email "tangj1122@gmail.com",
:create/time 1587519876467,
:block/uid "eSOmFR58b",
:edit/time 1587568606956,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Datascript is a frontend port of Datomic, which functions as a frontend store that handles application state (think redux). One way to query the store is with Datalog.",
:create/email "tangj1122@gmail.com",
:create/time 1587519919994,
:block/uid "C9ix_e9Xs",
:edit/time 1587568631477,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Datomic is a durable storage service that can be self-hosted or hosted on AWS.",
:create/email "tangj1122@gmail.com",
:create/time 1587520021508,
:block/children
[{:block/string
"It is distributed yet fully ACID-compliant, because it unbundles the database. It decouples reading, writing, and caching into separate processes.",
:create/email "tangj1122@gmail.com",
:create/time 1587520360484,
:block/uid "MPhgHzt_k",
:edit/time 1587520493168,
:edit/email "tangj1122@gmail.com"}
{:block/string
"It is immutable and accumulate-only, like git or a blockchain. This notion of time provides the following:",
:create/email "tangj1122@gmail.com",
:create/time 1587520912845,
:block/children
[{:block/string
"You can query the database at different points in time.",
:create/email "tangj1122@gmail.com",
:create/time 1587519319524,
:block/uid "uRb301anI",
:edit/time 1587520919169,
:edit/email "tangj1122@gmail.com"}
{:block/string "You can query the db `since` a time.",
:create/email "tangj1122@gmail.com",
:create/time 1587521073166,
:block/uid "K82bIVDCi",
:edit/time 1587521136038,
:edit/email "tangj1122@gmail.com"}
{:block/string "You can query the db `as-of` time.",
:create/email "tangj1122@gmail.com",
:create/time 1587521126030,
:block/uid "SG3HKQujD",
:edit/time 1587521140809,
:edit/email "tangj1122@gmail.com"}
{:block/string
"You can query the db `with` a transaction, letting you diff the databse: what is the before and after if I do this transaction.",
:create/email "tangj1122@gmail.com",
:create/time 1587568681055,
:block/uid "3X37ZIv3a",
:edit/time 1587568718649,
:edit/email "tangj1122@gmail.com"}
{:block/string
"You can query for the schema at different point in history.",
:create/email "tangj1122@gmail.com",
:create/time 1587520633944,
:block/uid "FZTnpLSd-",
:edit/time 1587521182493,
:edit/email "tangj1122@gmail.com"}],
:block/uid "UaVIE5uVT",
:edit/time 1588100083631,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Datomic's version of a \"record\" is a Datom, a 5-tuple with the fields:",
:create/email "tangj1122@gmail.com",
:create/time 1587520502266,
:block/children
[{:block/string "entity",
:create/email "tangj1122@gmail.com",
:create/time 1587520539657,
:block/uid "YBDMhvmsQ",
:edit/time 1587520540729,
:edit/email "tangj1122@gmail.com"}
{:block/string "attribute",
:create/email "tangj1122@gmail.com",
:create/time 1587520540727,
:block/uid "tHyE4n_iz",
:edit/time 1587520541757,
:edit/email "tangj1122@gmail.com"}
{:block/string "value",
:create/email "tangj1122@gmail.com",
:create/time 1587520541754,
:block/uid "rjKX48U6n",
:edit/time 1587520542825,
:edit/email "tangj1122@gmail.com"}
{:block/string "transaction",
:create/email "tangj1122@gmail.com",
:create/time 1587520542823,
:block/uid "WKpCmb5pX",
:edit/time 1587520544528,
:edit/email "tangj1122@gmail.com"}
{:block/string "operation type",
:create/email "tangj1122@gmail.com",
:create/time 1587520544526,
:block/uid "IMDKtjKXi",
:edit/time 1587520547777,
:edit/email "tangj1122@gmail.com"}],
:block/uid "rTFH_65_t",
:edit/time 1587520697872,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Datoms as the building block provide flexibility:",
:create/email "tangj1122@gmail.com",
:create/time 1587520566560,
:block/children
[{:block/string
"You don't need to pre-define the schema to add attributes.",
:create/email "tangj1122@gmail.com",
:create/time 1587520719129,
:block/uid "xrI9f7lc3",
:edit/time 1587520739642,
:edit/email "tangj1122@gmail.com"}
{:block/string
"You can update the schema through transactions (no more migrations!!!).",
:create/email "tangj1122@gmail.com",
:create/time 1587520622018,
:block/uid "NwDkwNHWF",
:edit/time 1587568769375,
:edit/email "tangj1122@gmail.com"}
{:block/string "((FZTnpLSd-))",
:create/email "tangj1122@gmail.com",
:create/time 1587520618887,
:block/uid "hNm8UCMGe",
:edit/time 1587568807061,
:edit/email "tangj1122@gmail.com"}
{:block/string
"You can join any datom(s) with any datom(s). You don't need to define single-to-many or many-to-many relationships.",
:create/email "tangj1122@gmail.com",
:create/time 1587520612919,
:block/uid "6QWdb5Gjy",
:edit/time 1587568782588,
:edit/email "tangj1122@gmail.com"}
{:block/string
"You can trivially make recursive queries.",
:create/email "tangj1122@gmail.com",
:create/time 1587521223745,
:block/uid "eiU8Mytvc",
:edit/time 1587521294571,
:edit/email "tangj1122@gmail.com"}
{:block/string
"You can trivially make reverse lookups (graph db use-case).",
:create/email "tangj1122@gmail.com",
:create/time 1587521231636,
:block/uid "aFF4W6qRp",
:edit/time 1587568827870,
:edit/email "tangj1122@gmail.com"}],
:block/uid "FaBxdbuDn",
:edit/time 1587520701417,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Datomic is indexed 4 different ways such that you can model the other major access styles",
:create/email "tangj1122@gmail.com",
:create/time 1588100303975,
:block/children
[{:block/string "row indexing (e.g. SQL)",
:create/email "tangj1122@gmail.com",
:create/time 1588100308431,
:block/uid "VuvAbwn0A",
:edit/time 1588100495018,
:edit/email "tangj1122@gmail.com"}
{:block/string "key/value indexing (e.g. redis)",
:create/email "tangj1122@gmail.com",
:create/time 1588100312382,
:block/uid "xZZVKYsqU",
:edit/time 1588100496921,
:edit/email "tangj1122@gmail.com"}
{:block/string "column indexing (e.g. Cassandra)",
:create/email "tangj1122@gmail.com",
:create/time 1588100315400,
:block/uid "jyPa9Wcbj",
:edit/time 1588100498118,
:edit/email "tangj1122@gmail.com"}
{:block/string "graph (e.g. Neo4j)",
:create/email "tangj1122@gmail.com",
:create/time 1588100323546,
:block/uid "wfih6EYOu",
:edit/time 1588100499844,
:edit/email "tangj1122@gmail.com"}
{:block/string "document indexing (e.g. MongoDB)",
:create/email "tangj1122@gmail.com",
:create/time 1588100101290,
:block/uid "IID9QGyjL",
:edit/time 1588100502493,
:edit/email "tangj1122@gmail.com"}
{:block/string "From [[Day of Datomic Cloud 2018]]:",
:create/email "tangj1122@gmail.com",
:create/time 1588100514105,
:block/children
[{:block/string "((Lmvn3PUmO))",
:create/email "tangj1122@gmail.com",
:create/time 1588100342752,
:block/uid "8HSJl8gzB",
:edit/time 1588100514109,
:edit/email "tangj1122@gmail.com"}],
:block/uid "aR0fq0B3e",
:edit/time 1588100514105,
:edit/email "tangj1122@gmail.com"}],
:block/uid "U5CPEtCXQ",
:edit/time 1588100303975,
:edit/email "tangj1122@gmail.com"}],
:block/uid "PKfimgAAO",
:edit/time 1587520295788,
:edit/email "tangj1122@gmail.com"}],
:block/uid "QRupZN0ih",
:edit/time 1587520214639,
:edit/email "tangj1122@gmail.com"}],
:block/uid "XNNkXzwZ9",
:edit/time 1587518221673,
:edit/email "tangj1122@gmail.com"}
{:block/string "Spec",
:create/email "tangj1122@gmail.com",
:create/time 1587518208738,
:block/children
[{:block/string
"A common complaint of Clojure is being dynamically typed and the downsides associated with that. I haven't used it yet, but Clojure spec addresses this and more. I am so so so excited to use Spec in my daily life. I never want to have to write a test again.",
:create/email "tangj1122@gmail.com",
:create/time 1587561678577,
:block/uid "Z6p1nZAxl",
:edit/time 1587569680478,
:edit/email "tangj1122@gmail.com"}
{:block/string "{{embed: ((e7YNjG-Nw))}}",
:create/email "tangj1122@gmail.com",
:create/time 1587561482423,
:block/uid "6BzwKVW0n",
:edit/time 1587561491443,
:edit/email "tangj1122@gmail.com"}],
:block/uid "h_pblnYyw",
:edit/time 1587566108780,
:edit/email "tangj1122@gmail.com"}
{:block/string "Macros",
:create/email "tangj1122@gmail.com",
:create/time 1587562402614,
:block/children
[{:block/string
"From [[Clojure from the Ground Up]], an amazing intro to Clojure: ((3o_vM-iKq))",
:create/email "tangj1122@gmail.com",
:create/time 1587564032252,
:block/uid "BThF5gBq0",
:edit/time 1587564372523,
:edit/email "tangj1122@gmail.com"}
{:block/string
"[[Paul Graham]] on using macros at Viaweb ((YnJmwrzqm))",
:create/email "tangj1122@gmail.com",
:create/time 1587564291573,
:block/uid "xFaCEjf5v",
:edit/time 1587564304776,
:edit/email "tangj1122@gmail.com"}],
:block/uid "K0SljPHiS",
:edit/time 1587564259648,
:edit/email "tangj1122@gmail.com"}
{:block/string "[[Good Artists Copy; Great Artists Steal]]",
:create/email "tangj1122@gmail.com",
:create/time 1587562403473,
:block/children
[{:block/string
"[Better destructuring than Javascript](https://clojure.org/guides/destructuring#_associative_destructuring)",
:create/email "tangj1122@gmail.com",
:create/time 1587493751377,
:block/uid "pxuqGG7RM",
:edit/time 1587563676108,
:edit/email "tangj1122@gmail.com"}
{:block/string
"[Better list comprehension than Python](https://clojuredocs.org/clojure.core/for)",
:create/email "tangj1122@gmail.com",
:create/time 1587493768920,
:block/uid "bTpntdRbB",
:edit/time 1587563673687,
:edit/email "tangj1122@gmail.com"}
{:block/string
"[Better go routines than Go](https://blog.drewolson.org/clojure-go-comparison)",
:create/email "tangj1122@gmail.com",
:create/time 1587493763160,
:block/children
[{:block/string
"I don't actually know if Clojure's concurrency library, `core.async`, is better than go's go routines. I haven't used either in a running application, but they seem comparable based off a Google search. What I can say is that Clojure implemented Go's defining feature and namesake as a library. That's the power of [[macros]], baby.",
:create/email "tangj1122@gmail.com",
:create/time 1587563437023,
:block/uid "bp0qOqCVj",
:edit/time 1587563963779,
:edit/email "tangj1122@gmail.com"}],
:block/uid "oAiFMx8Ji",
:edit/time 1587563672364,
:edit/email "tangj1122@gmail.com"}],
:block/uid "yEm-bRl-g",
:edit/time 1588447082582,
:edit/email "tangj1122@gmail.com"}],
:block/uid "_JzCJBB89",
:edit/time 1587517963013,
:edit/email "tangj1122@gmail.com"}
{:block/string "Things I don't like",
:create/email "tangj1122@gmail.com",
:create/time 1587493227649,
:block/children
[{:block/string
"There are too many libraries! So many routers and [HTTP servers](https://purelyfunctional.tv/mini-guide/clojure-web-servers/). Just start with Ring and Compojure. #[[Clojure Routers - PurelyFunctional.tv]]",
:create/email "tangj1122@gmail.com",
:create/time 1587491973935,
:block/uid "EcZ_xn3rd",
:edit/time 1587650592349,
:edit/email "tangj1122@gmail.com"}
{:block/string
"There are so many resources and books, aimed at various levels. See ((E_5c_0i5K)) for how I've been learning the fundamentals.",
:create/email "tangj1122@gmail.com",
:create/time 1587493359049,
:block/uid "QRt_m4g1T",
:edit/time 1587565910121,
:edit/email "tangj1122@gmail.com"}
{:block/string
"There are a lot of IDEs too. ((Io_c3KFrS)) gives a nice starter kit for Emacs, but going beyond that requires tinkering with Emacs. Not sure how VS Code and Vim plugins are, but I'm about to try the Intelli-J plugin Cursive.",
:create/email "tangj1122@gmail.com",
:create/time 1587493299434,
:block/uid "lEUkNfWTZ",
:edit/time 1587566482129,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Error messages can also be too much and sometimes not super informative, Clojure being dynamically typed and outputting Clojure and Java stack traces. I think ((h_pblnYyw)) will help with this, ((PWIY2m3bK)) has a fantastic section on debugging, and ((07I9E9lYX)) is your friend.",
:create/email "tangj1122@gmail.com",
:create/time 1587566095628,
:block/uid "v7ofRelv3",
:edit/time 1587566589816,
:edit/email "tangj1122@gmail.com"}],
:block/uid "JDaA7c2By",
:edit/time 1587493230017,
:edit/email "tangj1122@gmail.com"}
{:block/string "Beginner Resources",
:create/email "tangj1122@gmail.com",
:create/time 1587493492754,
:block/children
[{:block/string "Clojure from the Ground Up",
:create/email "tangj1122@gmail.com",
:create/time 1587565048785,
:block/children
[{:block/string
"Not exhaustive but the most succinct and conceptually concise intro I've found so far.",
:create/email "tangj1122@gmail.com",
:create/time 1587493494116,
:block/uid "21lSGF9Zt",
:edit/time 1587565102946,
:edit/email "tangj1122@gmail.com"}
{:block/string "Can do in a few days.",
:create/email "tangj1122@gmail.com",
:create/time 1587565112535,
:block/uid "T0Cka8CvN",
:edit/time 1587568846997,
:edit/email "tangj1122@gmail.com"}],
:block/uid "PWIY2m3bK",
:edit/time 1587565048785,
:edit/email "tangj1122@gmail.com"}
{:block/string "Clojure for the Brave and True",
:create/email "tangj1122@gmail.com",
:create/time 1587565171431,
:block/children
[{:block/string
"A much broader intro than Ground Up. Very playful and approachable.",
:create/email "tangj1122@gmail.com",
:create/time 1587493499380,
:block/uid "2AK9Ccje-",
:edit/time 1587568866616,
:edit/email "tangj1122@gmail.com"}
{:block/string "Can do over the course of a few weeks.",
:create/email "tangj1122@gmail.com",
:create/time 1587565237760,
:block/uid "Hkj-vB30K",
:edit/time 1587565237760,
:edit/email "tangj1122@gmail.com"}
{:block/string
"I learned enough to where I could I build stuff and then skipped around and returned to skipped chapters as needed.",
:create/email "tangj1122@gmail.com",
:create/time 1587565121737,
:block/uid "Fbz9ihEPs",
:edit/time 1587565249894,
:edit/email "tangj1122@gmail.com"}],
:block/uid "Io_c3KFrS",
:edit/time 1587565171431,
:edit/email "tangj1122@gmail.com"}
{:block/string "http://www.4clojure.com/",
:create/email "tangj1122@gmail.com",
:create/time 1587565256254,
:block/children
[{:block/string "Test-driven / koan-driven learning.",
:create/email "tangj1122@gmail.com",
:create/time 1587565283639,
:block/uid "RHeLeKS8L",
:edit/time 1587565407031,
:edit/email "tangj1122@gmail.com"}
{:block/string
"I've done about half of the 156 questions. Seems like second half turns into leetcode advanced problems, i.e. somewhat contrived.",
:create/email "tangj1122@gmail.com",
:create/time 1587565340526,
:block/uid "eOUJ98Vbi",
:edit/time 1587565401766,
:edit/email "tangj1122@gmail.com"}],
:block/uid "RATYZiCsy",
:edit/time 1587565422991,
:edit/email "tangj1122@gmail.com"}],
:block/uid "E_5c_0i5K",
:edit/time 1587568950518,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1587694159859,
:block/uid "w9xgcDHRp",
:edit/time 1587694159859,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1587494389518,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587480316954,
:node/title "Athens Change Log",
:block/children
[{:block/string "type:: [[documentation]]",
:create/email "tangj1122@gmail.com",
:create/time 1587480378814,
:block/uid "T35qF9SYQ",
:edit/time 1587923033168,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1587480392453,
:block/uid "yf763u1Wu",
:edit/time 1587480392453,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1587480316955,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587480611265,
:node/title
"Begin RFCs for an open protocol for bi-directional links",
:block/children
[{:block/string "type:: [[Objective]]",
:create/email "tangj1122@gmail.com",
:create/time 1587480668192,
:block/uid "mSMywpHJl",
:edit/time 1587493043848,
:edit/email "tangj1122@gmail.com"}
{:block/string "#[[Hyperlink]]",
:create/email "tangj1122@gmail.com",
:create/time 1587780268804,
:block/uid "PMOuDBm3f",
:edit/time 1587780283474,
:edit/email "tangj1122@gmail.com"}
{:block/string "Notes",
:create/email "tangj1122@gmail.com",
:create/time 1587780283471,
:block/children
[{:block/string "might need a blockchain",
:create/email "tangj1122@gmail.com",
:create/time 1587780306286,
:block/children
[{:block/string "((fng0afASL))",
:block/uid "L3so1upt9",
:edit/time 1587780311434,
:edit/email "tangj1122@gmail.com"}],
:block/uid "Lh5wZzwzk",
:edit/time 1587780316964,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1587780316960,
:block/uid "sKawEF79o",
:edit/time 1587780316960,
:edit/email "tangj1122@gmail.com"}],
:block/uid "TSfYySgRv",
:edit/time 1587780306292,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1587481005149,
:block/uid "L3l3g_LgW",
:edit/time 1587753027362,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1587481080585,
:block/uid "oyLKm8bXS",
:edit/time 1587481080585,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1587480611266,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587480975950,
:node/title "Objective",
:block/children
[{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1587492326298,
:block/uid "OXKPeVz3Z",
:edit/time 1587492369510,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1587492308501,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587481073172,
:node/title "actionable",
:block/children
[{:block/string "type:: table",
:create/email "tangj1122@gmail.com",
:create/time 1587481557776,
:block/uid "blJPlYbdo",
:edit/time 1587481718765,
:edit/email "tangj1122@gmail.com"}
{:block/string "{{attr-table: [[actionable]]}}",
:create/email "tangj1122@gmail.com",
:create/time 1587481563389,
:block/uid "iPJSbBvcU",
:edit/time 1587481564142,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1587481564791,
:block/uid "QfvnMZSBb",
:edit/time 1587481564791,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1587481073173,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587481781087,
:node/title "knowledge",
:block/children
[{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1587481784338,
:block/uid "yKGmV1DBm",
:edit/time 1587481786622,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1587481781088,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587486138135,
:node/title "[[Datascript]] FAQ",
:block/children
[{:block/string "type:: [[documentation]]",
:create/email "tangj1122@gmail.com",
:create/time 1587486198790,
:block/uid "euH3KuNNr",
:edit/time 1587923045125,
:edit/email "tangj1122@gmail.com"}
{:block/string
"This [Notion table](https://www.notion.so/tangjeff0/de6dff06d1804129bdc846352a85355c?v=18f602aa3ffb4758a21309cadab26b0a) has a list of all the attributes with documentation.",
:create/email "tangj1122@gmail.com",
:create/time 1588028602123,
:block/uid "kvuGqQm5i",
:edit/time 1588511100168,
:edit/email "tangj1122@gmail.com"}
{:block/string
"The default \"Export with JSON\" from Roam has several missing attributes",
:create/email "tangj1122@gmail.com",
:create/time 1587486149798,
:block/children
[{:block/string "All page-ids are not present (pretty important!)",
:create/email "tangj1122@gmail.com",
:create/time 1587486222682,
:block/uid "ZI7vksCuk",
:edit/time 1588000816454,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Many pages and blocks have missing `create-time` and `create-email`",
:create/email "tangj1122@gmail.com",
:create/time 1587486228608,
:block/uid "zLCh437nC",
:edit/time 1587486251886,
:edit/email "tangj1122@gmail.com"}],
:block/uid "F6TD3Pbkv",
:edit/time 1588000806069,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1588015318491,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587498301409,
:node/title "Beating the Averages",
:block/children
[{:block/string "type:: notes",
:create/email "tangj1122@gmail.com",
:create/time 1587498303365,
:block/uid "POLJ3kQ4G",
:edit/time 1587498306123,
:edit/email "tangj1122@gmail.com"}
{:block/string "source:: http://www.paulgraham.com/avg.html",
:create/email "tangj1122@gmail.com",
:create/time 1587498306120,
:block/uid "AyeGGNBcn",
:edit/time 1587498313312,
:edit/email "tangj1122@gmail.com"}
{:block/string "#[[Paul Graham]]",
:create/email "tangj1122@gmail.com",
:create/time 1587498313591,
:block/uid "RXslYQGzn",
:edit/time 1587498319542,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1587498320059,
:block/uid "hf8o4uGEy",
:edit/time 1587498320059,
:edit/email "tangj1122@gmail.com"}
{:block/string "Contents",
:create/email "tangj1122@gmail.com",
:create/time 1587498319540,
:block/children
[{:block/string
"What's so great about Lisp? And if Lisp is so great, why doesn't everyone use it? These sound like rhetorical questions, but actually they have straightforward answers.",
:create/email "tangj1122@gmail.com",
:create/time 1587500204161,
:block/uid "JohQCBx7W",
:edit/time 1587500204161,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Lisp is so great not because of some magic quality visible only to devotees, but because ^^**it is simply the most powerful language available.**^^ And the reason everyone doesn't use it is that **programming languages are not merely technologies,** ^^**but habits of mind as well, and nothing changes slower**^^. Of course, both these answers need explaining.",
:create/email "tangj1122@gmail.com",
:create/time 1587499106091,
:block/uid "mRdm8AlH_",
:edit/time 1587500204199,
:edit/email "tangj1122@gmail.com"}
{:block/string
"I'll begin with a shockingly controversial statement: ^^**programming languages vary in power.**^^",
:create/email "tangj1122@gmail.com",
:create/time 1587498394185,
:block/uid "xA4m2Jtu9",
:edit/time 1587499131824,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Everyone knows **it's a mistake to write your whole program by hand in machine language**. What's less often understood is that there is a more general principle here: that if you have a choice of several languages, it is, all other things being equal, **a mistake to program in anything but the most powerful one.**",
:create/email "tangj1122@gmail.com",
:create/time 1587498486603,
:block/uid "1D2kMT-Df",
:edit/time 1587498517643,
:edit/email "tangj1122@gmail.com"}
{:block/string
"**There are many exceptions to this rule**. If you're writing a program that has to work very closely with a program written in a certain language, it might be a good idea to write the new program in the same language. If you're writing a program that only has to do something very simple, like number crunching or bit manipulation, you may as well use a less abstract language, especially since it may be slightly faster. And if you're writing a short, throwaway program, you may be better off just using whatever language has the best library functions for the task. But in general, for application software, you want to be using the most powerful (reasonably efficient) language you can get, and using anything else is a mistake, of exactly the same kind, though possibly in a lesser degree, as programming in machine language.",
:create/email "tangj1122@gmail.com",
:create/time 1587498506259,
:block/uid "OpgbTVDO5",
:edit/time 1587498541114,
:edit/email "tangj1122@gmail.com"}
{:block/string
"You can see that machine language is very low level. But, at least **as a kind of social convention, high-level languages are often all treated as equivalent. They're not.** Technically the term \"high-level language\" doesn't mean anything very definite. There's no dividing line with machine languages on one side and all the high-level languages on the other. Languages fall along a continuum [4] of abstractness, from the most powerful all the way down to machine languages, which themselves vary in power.",
:create/email "tangj1122@gmail.com",
:create/time 1587498542215,
:block/uid "kVi4Cqabd",
:edit/time 1587498570182,
:edit/email "tangj1122@gmail.com"}
{:block/string
"This idea is rarely followed to its conclusion, though. **After a certain age, programmers rarely switch languages voluntarily**. Whatever language people happen to be used to, they tend to consider just good enough.",
:create/email "tangj1122@gmail.com",
:create/time 1587498571609,
:block/uid "0sHdW20qY",
:edit/time 1587498591399,
:edit/email "tangj1122@gmail.com"}
{:block/string
"^^**Programmers get very attached to their favorite languages**^^, and I don't want to hurt anyone's feelings, so to explain this point I'm going to use a hypothetical language called Blub. Blub falls right in the middle of the abstractness continuum. It is not the most powerful language, but it is more powerful than Cobol or machine language.",
:create/email "tangj1122@gmail.com",
:create/time 1587498588208,
:block/uid "NyyEtVem8",
:edit/time 1587499147697,
:edit/email "tangj1122@gmail.com"}
{:block/string
"As long as our hypothetical Blub programmer is looking down the power continuum, he knows he's looking down. Languages less powerful than Blub are obviously less powerful, because they're missing some feature he's used to. **But when our hypothetical Blub programmer looks in the other direction, up the power continuum, he doesn't realize he's looking up**. What he sees are merely weird languages. He probably considers them about equivalent in power to Blub, but with all this other hairy stuff thrown in as well. Blub is good enough for him, because he thinks in Blub.",
:create/email "tangj1122@gmail.com",
:create/time 1587498601410,
:block/uid "JTXGNH2Rj",
:edit/time 1587498682886,
:edit/email "tangj1122@gmail.com"}
{:block/string
"By induction, **the only programmers in a position to see all the differences in power between the various languages are those who understand the most powerful one**. (This is probably what Eric Raymond meant about Lisp making you a better programmer.) You can't trust the opinions of the others, because of the Blub paradox: they're satisfied with whatever language they happen to use, because it dictates the way they think about programs.",
:create/email "tangj1122@gmail.com",
:create/time 1587498652711,
:block/uid "Wcy-t7JlC",
:edit/time 1587498693292,
:edit/email "tangj1122@gmail.com"}
{:block/string
"The five languages that Eric Raymond recommends to hackers fall at various points on the power continuum. Where they fall relative to one another is a sensitive topic. **What I will say is that I think Lisp is at the top**. And to support this claim I'll tell you about one of the things I find missing when I look at the other four languages. ^^**How can you get anything done in them, I think, without macros? [5]**^^",
:create/email "tangj1122@gmail.com",
:create/time 1587498695562,
:block/uid "PW89nGc49",
:edit/time 1587499161013,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Many languages have something called a macro. But **Lisp macros are unique. And believe it or not, what they do is related to the parentheses**. The designers of Lisp didn't put all those parentheses in the language just to be different. To the Blub programmer, Lisp code looks weird. But those parentheses are there for a reason. They are the outward evidence of a fundamental difference between Lisp and other languages.",
:create/email "tangj1122@gmail.com",
:create/time 1587498718580,
:block/uid "WeoezjkfB",
:edit/time 1587498736934,
:edit/email "tangj1122@gmail.com"}
{:block/string
"If you understand how compilers work, what's really going on is not so much that Lisp has a strange syntax as that Lisp has no syntax. You write programs in the parse trees that get generated within the compiler when other languages are parsed. But these parse trees are fully accessible to your programs. You can write programs that manipulate them. In Lisp, these programs are called macros. ^^**They are programs that write programs.**^^",
:create/email "tangj1122@gmail.com",
:create/time 1587498737335,
:block/uid "JB_Wn2NxN",
:edit/time 1587499175818,
:edit/email "tangj1122@gmail.com"}
{:block/string
"But I think I can give a kind of argument that might be convincing.^^ **The source code of the Viaweb editor was probably about 20-25% macros**^^. Macros are harder to write than ordinary Lisp functions, and it's considered to be bad style to use them when they're not necessary. So every macro in that code is there because it has to be. **What that means is that at least 20-25% of the code in this program is doing things that you can't easily do in any other language. **However skeptical the Blub programmer might be about my claims for the mysterious powers of Lisp, this ought to make him curious. We weren't writing this code for our own amusement. We were a tiny startup, programming as hard as we could in order to put technical barriers between us and our competitors. #macros #Lisp ",
:create/email "tangj1122@gmail.com",
:create/time 1587498769384,
:block/uid "YnJmwrzqm",
:edit/time 1587569765446,
:edit/email "tangj1122@gmail.com"}
{:block/string
"But ^^**I don't expect to convince anyone over 25 to go out and learn Lisp**^^. The purpose of this article is not to change anyone's mind, but to reassure people already interested in using Lisp-- people who know that Lisp is a powerful language, but worry because it isn't widely used. In a competitive situation, that's an advantage. Lisp's power is multiplied by the fact that your competitors don't get it.",
:create/email "tangj1122@gmail.com",
:create/time 1587498798511,
:block/uid "p6da0CLoL",
:edit/time 1587499188514,
:edit/email "tangj1122@gmail.com"}
{:block/string
"If you think of using Lisp in a startup, ^^**you shouldn't worry that it isn't widely understood. You should hope that it stays that way. And it's likely to**.^^ It's the nature of programming languages to make most people satisfied with whatever they currently use. Computer hardware changes so much faster than personal habits that programming practice is usually ten to twenty years behind the processor. At places like MIT they were writing programs in high-level languages in the early 1960s, but many companies continued to write code in machine language well into the 1980s. I bet a lot of people continued to write machine language until the processor, like a bartender eager to close up and go home, finally kicked them out by switching to a risc instruction set.",
:create/email "tangj1122@gmail.com",
:create/time 1587498841878,
:block/uid "MnBhwC5yI",
:edit/time 1587499196023,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Ordinarily technology changes fast. But **programming languages are different: programming languages are not just technology, but what programmers think in. ** ^^**They're half technology and half religion**.^^[6] And so the median language, meaning whatever language the median programmer uses, moves as slow as an iceberg. ^^**Garbage collection, introduced by Lisp in about 1960, is now widely considered to be a good thing. Runtime typing, ditto, is growing in popularity. Lexical closures, introduced by Lisp in the early 1970s, are now, just barely, on the radar screen. Macros, introduced by Lisp in the mid 1960s, are still terra incognita.**^^",
:create/email "tangj1122@gmail.com",
:create/time 1587498882694,
:block/uid "_X5PY1gXi",
:edit/time 1587499246183,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Obviously, **the median language has enormous momentum**. I'm not proposing that you can fight this powerful force. What I'm proposing is exactly the opposite: that, **like a practitioner of Aikido, you can use it against your opponents.**",
:block/uid "FuPGMfYxy",
:edit/time 1587499009938,
:edit/email "tangj1122@gmail.com"}
{:block/string
"If you work for a big company, this may not be easy. You will have a hard time convincing the pointy-haired boss to let you build things in Lisp, when he has just read in the paper that some other language is poised, like Ada was twenty years ago, to take over the world. But **if you work for a startup that doesn't have pointy-haired bosses yet, you can, like we did, turn the Blub paradox to your advantage: you can use technology that your competitors, glued immovably to the median language, will never be able to match.**",
:block/uid "5DVqR9AbG",
:edit/time 1587499019196,
:edit/email "tangj1122@gmail.com"}
{:block/string
"If you ever do find yourself working for a startup, here's a handy tip for evaluating competitors. **Read their job listings**. Everything else on their site may be stock photos or the prose equivalent, but the job listings have to be specific about what they want, or they'll get the wrong candidates.",
:block/uid "ZrMqb7gJa",
:edit/time 1587499026798,
:edit/email "tangj1122@gmail.com"}
{:block/string
"During the years we worked on Viaweb I read a lot of job descriptions. A new competitor seemed to emerge out of the woodwork every month or so. **The first thing I would do, after checking to see if they had a live online demo, was look at their job listings**. After a couple years of this I could tell which companies to worry about and which not to. The more of an IT flavor the job descriptions had, the less dangerous the company was. The safest kind were the ones that wanted Oracle experience. You never had to worry about those. **You were also safe if they said they wanted C++ or Java developers. If they wanted Perl or Python programmers, that would be a bit frightening-**- that's starting to sound like a company where the technical side, at least, is run by real hackers. **If I had ever seen a job posting looking for Lisp hackers, I would have been really worried.**",
:create/email "tangj1122@gmail.com",
:create/time 1587498897443,
:block/uid "n_sKUAbrU",
:edit/time 1587499048134,
:edit/email "tangj1122@gmail.com"}],
:block/uid "RcQboc-_D",
:edit/time 1587498321628,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1587498301410,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587498319543,
:node/title "Paul Graham",
:edit/time 1587498319544,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587500402719,
:node/title "meta-cognition",
:edit/time 1587500402721,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587515823478,
:node/title "Love Letter To Clojure",
:block/children
[{:block/string
"source:: https://itrevolution.com/love-letter-to-clojure-part-1",
:create/email "tangj1122@gmail.com",
:create/time 1587515828061,
:block/uid "JcqBWkLzt",
:edit/time 1587515834068,
:edit/email "tangj1122@gmail.com"}
{:block/string "type:: notes",
:create/email "tangj1122@gmail.com",
:create/time 1587515915488,
:block/uid "eHqIjJvpT",
:edit/time 1587515917531,
:edit/email "tangj1122@gmail.com"}
{:block/string "#[[Gene Kim]] #[[Clojure]]",
:create/email "tangj1122@gmail.com",
:create/time 1587515892575,
:block/uid "lkcVmVeOb",
:edit/time 1587516084908,
:edit/email "tangj1122@gmail.com"}
{:block/string "Contents",
:create/email "tangj1122@gmail.com",
:create/time 1587515913411,
:block/children
[{:block/string
"Without doubt, **Clojure was one of the most difficult things I’ve learned professionally**, but it has also been one of the most rewarding. **It brought the joy of programming back into my life**. For the first time in my career, as **I’m nearing fifty years old, I’m finally able to write programs** that do what I want them to do, and am able to build upon them for years without them collapsing like a house of cards, as has been my normal experience.",
:create/email "tangj1122@gmail.com",
:create/time 1587515834065,
:block/uid "UYitCrn47",
:edit/time 1587515975052,
:edit/email "tangj1122@gmail.com"}
{:block/string
"The famous French philosopher Claude Lévi-Strauss would say of certain tools, “Is it good to think with?” For reasons that I will try to explain in this post, Clojure embraces a set of design principles and sensibilities that were new to me: functional programming, immutability, an astonishingly strong sense of conservative minimalism (e.g., **hardly any breaking changes in ten years**!), and much more…",
:create/email "tangj1122@gmail.com",
:create/time 1587515890245,
:block/uid "egD7n36jV",
:edit/time 1587515931047,
:edit/email "tangj1122@gmail.com"}
{:block/string
"For most of the twenty years of my professional career, **I have self-identified primarily as an Ops person**. This is despite getting my masters degree in computer science in 1995—the courses I loved the most were high-speed compilers (main lesson: don’t read files more than once) and high-speed networking (main lesson: avoid making memory copies entirely, if you can).",
:create/email "tangj1122@gmail.com",
:create/time 1587515966591,
:block/uid "9teXCHTl-",
:edit/time 1587516048391,
:edit/email "tangj1122@gmail.com"}
{:block/string
"But something changed. For three years, I now self-identify as a developer! **Without a doubt, it’s because I learned the Clojure programming language**. I mentioned above that it was one of the most difficult things I’ve learned professionally—before I wrote my first line of working code, I must have spent forty hours reading books and blog posts, as well as watching videos, before I was able to write my first real non-trivial program.",
:create/email "tangj1122@gmail.com",
:create/time 1587516040154,
:block/uid "bT5F2PBAg",
:edit/time 1587516061559,
:edit/email "tangj1122@gmail.com"}
{:block/string
"A big reason is that it’s a [[LISP]] programming language, which I had never used before. Another reason is that Clojure is a functional programming language that embraces and encourages immutability, which means that you’re not allowed to mutate variables, which is another thing I’ve never been exposed to before.",
:create/email "tangj1122@gmail.com",
:create/time 1587516062551,
:block/uid "i2LTTtigR",
:edit/time 1587516076845,
:edit/email "tangj1122@gmail.com"}
{:block/string
"My first significant Clojure project revealed something stunning to me. I’m fortunate to have participated in helping write and rewrite an application called [TweetScriber](https://tweetscriber.com/) three times. It’s a program that a bunch of us wrote in 2012 to allow us to take notes and tweet at the same time on an iPad—it turns out that this is a very useful thing to do when you’re writing a book, as it forces you to take notes, write things succinctly enough so that you can tweet it out (which forces a certain pithy and terse style), and get feedback by observing what tweets get people’s attention. (The tweets that got the most retweets inevitably found their way into a presentation or a book.)",
:block/children
[{:block/string
"In 2012, Flynn and Raechel Little wrote the first version as an iPad app in Objctive-C—it was about **3,000 lines of code**. (They did such an awesome job!! It worked splendidly until iOS 7 or so, when something broke terribly and it wouldn’t even start up anymore.)",
:block/uid "GOaW3BFue",
:edit/time 1587516126254,
:edit/email "tangj1122@gmail.com"}
{:block/string
"In 2015, I rewrote it as a **JavaScript/React** application, and it was about **1,500 lines of code**.",
:block/uid "xO_sLMBdG",
:edit/time 1587516133191,
:edit/email "tangj1122@gmail.com"}
{:block/string
"In 2017, I rewrote it again as a **ClojureScript** application, and it was only **500 lines of code**! Holy cow!!!",
:block/uid "O6KSKNcle",
:edit/time 1587516139006,
:edit/email "tangj1122@gmail.com"}],
:block/uid "Fv9DNa0ZE",
:edit/time 1587516119153,
:edit/email "tangj1122@gmail.com"}
{:block/string
"What has been the most astonishing to me is that **I’ve been able to keep adding functionality to TweetScriber, year after year.** Right before the last DevOps Enterprise Summit, I added a way to add photos to tweets without leaving the app; I experimented with saving the tweet ids in a database instead of just text. It was easy to experiment with adding these features without blowing everything else up.",
:create/email "tangj1122@gmail.com",
:create/time 1587516140911,
:block/uid "m5Gp329MH",
:edit/time 1587516189813,
:edit/email "tangj1122@gmail.com"}
{:block/string
"It’s now nearly 5,000 lines of code, and I’m still able to understand it, and add things I want to it without it falling over like a house of cards.",
:create/email "tangj1122@gmail.com",
:create/time 1587516185501,
:block/uid "l_0mHgqah",
:edit/time 1587516195393,
:edit/email "tangj1122@gmail.com"}
{:block/string
"I think this is relevant to many people in technology—I’ve observed that many people in the technology field started their careers coding, but then **as their career progressed, they started coding less**—sometimes it’s to go into people management, project management, information security, or product management, or into the business functions.",
:create/email "tangj1122@gmail.com",
:create/time 1587516196060,
:block/uid "4VS3kx0Fz",
:edit/time 1587516230145,
:edit/email "tangj1122@gmail.com"}
{:block/string
"![](https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2FpWnICeDWa7?alt=media&token=54472ee6-9c02-436a-94f2-dce6d88b4c8f)",
:create/email "tangj1122@gmail.com",
:create/time 1587516223073,
:block/uid "DjmcKTJz_",
:edit/time 1587516267872,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Over the years, I’ve read many articles about functional program extolling the value of **pure functions and immutability**—these are two of the characteristics often associated with functional programming languages, such as **Haskell, OCaml, Erlang, Elm, Elixir, Scala, PureScript, F#, and of course, Clojure.**",
:create/email "tangj1122@gmail.com",
:create/time 1587516268872,
:block/uid "54GLX6gHh",
:edit/time 1587516375029,
:edit/email "tangj1122@gmail.com"}
{:block/string
"[[John Carmack]]: No matter what language you work in, programming in a functional style provides benefits. You should do it whenever it is convenient, and you should think hard about the decision when it isn’t convenient. You can learn about lambdas, monads, currying, composing lazily evaluated functions on infinite sets, and all the other aspects of explicitly functionally oriented languages later if you choose.",
:create/email "tangj1122@gmail.com",
:create/time 1587516364188,
:block/uid "ktM0Jzzav",
:edit/time 1587516438103,
:edit/email "tangj1122@gmail.com"}
{:block/string
"I’ve bought almost every book on Clojure that I could find—I like every one one of them.",
:create/email "tangj1122@gmail.com",
:create/time 1587516440952,
:block/uid "svREcgtpf",
:edit/time 1587516806987,
:edit/email "tangj1122@gmail.com"}],
:block/uid "7-BPGSRAN",
:edit/time 1587515914587,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1587515823479,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587515895846,
:node/title "Gene Kim",
:edit/time 1587515895846,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587516076846,
:node/title "LISP",
:edit/time 1587516076847,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587516084908,
:node/title "Clojure",
:edit/time 1587516084909,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587516438105,
:node/title "John Carmack",
:edit/time 1587516438106,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587557599182,
:node/title "Functional Programming with Jessica Kerr",
:block/children
[{:block/string
"source:: https://softwareengineeringdaily.com/2015/09/09/functional-programming-with-jessica-kerr",
:create/email "tangj1122@gmail.com",
:create/time 1587557601764,
:block/uid "Rxy-J15iI",
:edit/time 1587557611796,
:edit/email "tangj1122@gmail.com"}
{:block/string "Contents",
:create/email "tangj1122@gmail.com",
:create/time 1587557611794,
:block/children
[{:block/string "18:20",
:create/email "tangj1122@gmail.com",
:create/time 1587567570941,
:block/children
[{:block/string "JM: What are some benefits to using Clojure?",
:create/email "tangj1122@gmail.com",
:create/time 1587567601315,
:block/uid "lfQyhRJVG",
:edit/time 1587567601315,
:edit/email "tangj1122@gmail.com"}
{:block/string
"JK: The biggest benefit to using Clojure is that it's fast to write. It's fast it's very flexible, and yet the language is opinionated so unlike Scala, when you want to do something in Clojure, you will find one way to do it that people use regularly and that the language encourages. And Clojure being a dynamic language is very low overhead.",
:create/email "tangj1122@gmail.com",
:create/time 1587567788804,
:block/uid "KIYMqR965",
:edit/time 1587567788804,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Clojure code is incredibly dense. **If I have a file with 30 lines of code, it might as well be 1000 lines of java.** I'm not exaggerating. The code does a whole lot in a few words and once you're comfortable with Clojure, man you can whip out a web service really fast.",
:create/email "tangj1122@gmail.com",
:create/time 1587566816953,
:block/uid "UDS_Ydpai",
:edit/time 1587568285216,
:edit/email "tangj1122@gmail.com"}],
:block/uid "9kizqdgv6",
:edit/time 1587567570941,
:edit/email "tangj1122@gmail.com"}
{:block/string "44:50",
:create/email "tangj1122@gmail.com",
:create/time 1587567984503,
:block/children
[{:block/string "JM: Do you use Amazon's ECS service?",
:create/email "tangj1122@gmail.com",
:create/time 1587567444056,
:block/uid "rOIuJO6NY",
:edit/time 1587568030665,
:edit/email "tangj1122@gmail.com"}
{:block/string
"JK: We're not. One of the challenges of building this and one of the things I think Monsanto is doing well is when something like that comes out we put it on the list. Okay, now that this general tool is available, can we use this to replace some of the stuff we've written internally.",
:create/email "tangj1122@gmail.com",
:create/time 1587567449241,
:block/uid "46rtmPLZj",
:edit/time 1587568072652,
:edit/email "tangj1122@gmail.com"}
{:block/string
"What we need isn't out there. But when what we need is out there in an industry-standard way, it's time for us to throw away our code. That can be hard for people but it's a great idea.",
:create/email "tangj1122@gmail.com",
:create/time 1587567504919,
:block/uid "CdNjkUE-6",
:edit/time 1587568122791,
:edit/email "tangj1122@gmail.com"}
{:block/string "**Every line of code is technical debt.**",
:create/email "tangj1122@gmail.com",
:create/time 1587567552137,
:block/uid "eAOpGbnAK",
:edit/time 1587568185850,
:edit/email "tangj1122@gmail.com"}],
:block/uid "kvk4paR4U",
:edit/time 1587568032448,
:edit/email "tangj1122@gmail.com"}],
:block/uid "pAyjw436x",
:edit/time 1587557615485,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1587557599185,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587559849866,
:node/title
"\"Agility & Robustness: Clojure spec\" by Stuart Halloway",
:block/children
[{:block/string
"source:: https://www.youtube.com/watch?v=VNTQ-M_uSo8",
:create/email "tangj1122@gmail.com",
:create/time 1587559853778,
:block/uid "PFXQKMA0j",
:edit/time 1587559858735,
:edit/email "tangj1122@gmail.com"}
{:block/string "type:: video",
:create/email "tangj1122@gmail.com",
:create/time 1587559859469,
:block/uid "EWU9_TrWo",
:edit/time 1587559867863,
:edit/email "tangj1122@gmail.com"}
{:block/string "#[[Stuart Halloway]]",
:create/email "tangj1122@gmail.com",
:create/time 1587561447972,
:block/uid "UbJw0H7-K",
:edit/time 1587561457707,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1587561457705,
:block/uid "nRE8j-p8G",
:edit/time 1587561457705,
:edit/email "tangj1122@gmail.com"}
{:block/string "Contents",
:create/email "tangj1122@gmail.com",
:create/time 1587559867861,
:block/children
[{:block/string
"collections - Typing lets you define the types within a collection. Spec lets you define types + size bounds + uniqueness + **any arbitrary rules** (because you can create and compose these rules with functions) ",
:create/email "tangj1122@gmail.com",
:create/time 1587560474340,
:block/children
[{:block/string
"![](https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2FmGEve1fO1G?alt=media&token=19fb4a45-0a68-46ed-9c64-4e48f932eb78)",
:create/email "tangj1122@gmail.com",
:create/time 1587560476018,
:block/uid "eJiFtXXDL",
:edit/time 1587560477593,
:edit/email "tangj1122@gmail.com"}],
:block/uid "Ri3aQRFYR",
:edit/time 1587561944570,
:edit/email "tangj1122@gmail.com"}
{:block/string
"OOP interfaces with spec - properties are a map of keys",
:create/email "tangj1122@gmail.com",
:create/time 1587560171679,
:block/children
[{:block/string
"![](https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2FIwP5VcLxVi?alt=media&token=6c586931-c7cd-49c4-a6c0-3102b399f9ff)",
:create/email "tangj1122@gmail.com",
:create/time 1587559954778,
:block/uid "xW6hPOG85",
:edit/time 1587560264922,
:edit/email "tangj1122@gmail.com"}],
:block/uid "8MtFOeZV7",
:edit/time 1587560653352,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Functions - typing lets you define the types of the arguments and return value. Spec lets you do that + any arbitrary rules + **map out the entire decision tree of potential outcomes**.",
:create/email "tangj1122@gmail.com",
:create/time 1587560193314,
:block/children
[{:block/string
"![](https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2F1Ee3CIXC1I?alt=media&token=67f292e6-16b9-4cf3-8b38-ec04cf0de57f)",
:block/props
{"image-size"
{"https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2F1Ee3CIXC1I?alt=media&token=67f292e6-16b9-4cf3-8b38-ec04cf0de57f"
{"width" 452, "height" nil}}},
:create/email "tangj1122@gmail.com",
:create/time 1587559961259,
:block/uid "bB3vpeA6e",
:edit/time 1587560005021,
:edit/email "tangj1122@gmail.com"}
{:block/string
"![](https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2FKulfCtcwF6?alt=media&token=22b79cf9-4958-4399-9d19-90cb1b626f90)",
:create/email "tangj1122@gmail.com",
:create/time 1587560859223,
:block/uid "wnMLNBTv0",
:edit/time 1587560861012,
:edit/email "tangj1122@gmail.com"}],
:block/uid "lPqYTVg-u",
:edit/time 1587561963604,
:edit/email "tangj1122@gmail.com"}
{:block/string "auto-documentation is a given",
:create/email "tangj1122@gmail.com",
:create/time 1587560852417,
:block/uid "a68VmDCFm",
:edit/time 1587561376990,
:edit/email "tangj1122@gmail.com"}
{:block/string "generative function inputs and outputs",
:create/email "tangj1122@gmail.com",
:create/time 1587560962384,
:block/children
[{:block/string
"![](https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2FptAqicVy6B?alt=media&token=eaf94f93-ed15-4082-b25e-aff6e77a171c)",
:create/email "tangj1122@gmail.com",
:create/time 1587560077461,
:block/uid "ZEQ900fme",
:edit/time 1587560962386,
:edit/email "tangj1122@gmail.com"}],
:block/uid "oDfsQec-o",
:edit/time 1587561124025,
:edit/email "tangj1122@gmail.com"}
{:block/string "generative testing",
:create/email "tangj1122@gmail.com",
:create/time 1587561134481,
:block/children
[{:block/string
"![](https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2F4gvr85WTyN?alt=media&token=c00a5abf-a62c-4eef-9d0c-2eebfc741866)",
:create/email "tangj1122@gmail.com",
:create/time 1587561139232,
:block/uid "3vROhEJJw",
:edit/time 1587561151223,
:edit/email "tangj1122@gmail.com"}],
:block/uid "m24QiOtrq",
:edit/time 1587561139234,
:edit/email "tangj1122@gmail.com"}
{:block/string "table: tests vs types vs spec",
:create/email "tangj1122@gmail.com",
:create/time 1587560156351,
:block/children
[{:block/string
"![](https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2FDUJJJgCCVr?alt=media&token=7d78c5eb-d6a1-4450-88a8-44c3f6b710d5)",
:block/props
{"image-size"
{"https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2FDUJJJgCCVr?alt=media&token=7d78c5eb-d6a1-4450-88a8-44c3f6b710d5"
{"width" 464, "height" nil}}},
:create/email "tangj1122@gmail.com",
:create/time 1587559869777,
:block/uid "Rm8Oq7kid",
:edit/time 1587559887362,
:edit/email "tangj1122@gmail.com"}],
:block/uid "18tSgFKCV",
:edit/time 1587561199739,
:edit/email "tangj1122@gmail.com"}
{:block/string "table: spec features",
:create/email "tangj1122@gmail.com",
:create/time 1587560759373,
:block/children
[{:block/string
"![](https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2FmUJhZtBndP?alt=media&token=65a11fe7-dd8f-40e2-9f1f-b5356c5636f6)",
:block/props
{"image-size"
{"https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2FmUJhZtBndP?alt=media&token=65a11fe7-dd8f-40e2-9f1f-b5356c5636f6"
{"width" 442, "height" nil}}},
:create/email "tangj1122@gmail.com",
:create/time 1587560036544,
:block/uid "zuIw8smHN",
:edit/time 1587560137823,
:edit/email "tangj1122@gmail.com"}],
:block/uid "QcCGRZWrQ",
:edit/time 1587561202842,
:edit/email "tangj1122@gmail.com"}],
:block/uid "e7YNjG-Nw",
:edit/time 1587559869779,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1587559849868,
:edit/email "tangj1122@gmail.com"}
{:node/title "April 22nd, 2020",
:block/children
[{:block/string "[[Athens Change Log]]",
:create/email "tangj1122@gmail.com",
:create/time 1587644609254,
:block/children
[{:block/string
"write [[Why you should learn Clojure - my first month as a Clojurian]]",
:create/email "tangj1122@gmail.com",
:create/time 1587644620920,
:block/uid "qpTj61P96",
:edit/time 1588083596354,
:edit/email "tangj1122@gmail.com"}],
:block/uid "zlJ1P4_t9",
:edit/time 1587644620923,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1587560696682,
:edit/email "jack@baty.net"}
{:create/email "tangj1122@gmail.com",
:create/time 1587561457708,
:node/title "Stuart Halloway",
:block/children
[{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1587561464244,
:block/uid "OTSJ4x8as",
:edit/time 1587561471232,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1587561457719,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587563653732,
:node/title "macros",
:edit/time 1587563653747,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587564050029,
:node/title "Clojure from the Ground Up",
:block/children
[{:block/string "type:: notes",
:create/email "tangj1122@gmail.com",
:create/time 1587564132250,
:block/uid "TnSJ_0cn6",
:edit/time 1587564134367,
:edit/email "tangj1122@gmail.com"}
{:block/string
"source:: https://aphyr.com/tags/Clojure-from-the-ground-up",
:create/email "tangj1122@gmail.com",
:create/time 1587564134365,
:block/uid "BrSCE8E9V",
:edit/time 1587564146739,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1587564148204,
:block/uid "aze3Xmd6v",
:edit/time 1587564148204,
:edit/email "tangj1122@gmail.com"}
{:block/string "Contents",
:create/email "tangj1122@gmail.com",
:create/time 1587564052657,
:block/children
[{:block/string "welcome",
:create/email "tangj1122@gmail.com",
:create/time 1586872439781,
:block/uid "6wFvntDFW",
:edit/time 1587564126479,
:edit/email "tangj1122@gmail.com"}
{:block/string "types",
:create/email "tangj1122@gmail.com",
:create/time 1586822249709,
:block/children
[{:block/string "types are nouns. functions are verbs",
:create/email "tangj1122@gmail.com",
:create/time 1586872462957,
:block/uid "I_CmEBr9N",
:edit/time 1587564126476,
:edit/email "tangj1122@gmail.com"}
{:block/string "a group of values that work the same way",
:create/email "tangj1122@gmail.com",
:create/time 1586822955502,
:block/uid "ExY3HYxF9",
:edit/time 1587564126471,
:edit/email "tangj1122@gmail.com"}
{:block/string "some types overlap and intersect",
:create/email "tangj1122@gmail.com",
:create/time 1586822964880,
:block/children
[{:block/string "cats are animals and are fuzzy",
:create/email "tangj1122@gmail.com",
:create/time 1586822973642,
:block/uid "UqF0KdFPH",
:edit/time 1587564126471,
:edit/email "tangj1122@gmail.com"}
{:block/string
"but there are animals that are not fuzzy, like crocodiles",
:create/email "tangj1122@gmail.com",
:create/time 1586822982552,
:block/uid "z6AKXQ5YJ",
:edit/time 1587564126471,
:edit/email "tangj1122@gmail.com"}
{:block/string
"and things that are fuzzy that are not animals, like moss or velvet",
:create/email "tangj1122@gmail.com",
:create/time 1586822990989,
:block/uid "s1gRa9poZ",
:edit/time 1587564126471,
:edit/email "tangj1122@gmail.com"}],
:block/uid "jgxQ1XCS0",
:edit/time 1587564126471,
:edit/email "tangj1122@gmail.com"}
{:block/string "some types completely subsume another",
:create/email "tangj1122@gmail.com",
:create/time 1586822998865,
:block/children
[{:block/string "tabbies > housecats > felidae > animals",
:create/email "tangj1122@gmail.com",
:create/time 1586823014716,
:block/uid "6TDacGOSk",
:edit/time 1587564126471,
:edit/email "tangj1122@gmail.com"}],
:block/uid "2K8s9kKW1",
:edit/time 1587564126471,
:edit/email "tangj1122@gmail.com"}
{:block/string
"sometimes hierarchical makes sense, like animals",
:create/email "tangj1122@gmail.com",
:create/time 1586823162967,
:block/uid "m5PF9kh6p",
:edit/time 1587564126471,
:edit/email "tangj1122@gmail.com"}
{:block/string "sometimes not, like fuzziness",
:create/email "tangj1122@gmail.com",
:create/time 1586823299300,
:block/uid "2ODFhlIrc",
:edit/time 1587564126471,
:edit/email "tangj1122@gmail.com"}
{:block/string "integers",
:create/email "tangj1122@gmail.com",
:create/time 1586823542141,
:block/children
[{:block/string
"`(INC Long/MAX_VALUE)` -> integer `ArithmeticException integer overflow` ",
:create/email "tangj1122@gmail.com",
:create/time 1586823174228,
:block/children
[{:block/string "dope",
:create/email "tangj1122@gmail.com",
:create/time 1586823341330,
:block/uid "bny77p_80",
:edit/time 1587564126475,
:edit/email "tangj1122@gmail.com"}],
:block/uid "XbDRhnXZy",
:edit/time 1587564126475,
:edit/email "tangj1122@gmail.com"}
{:block/string
"can use `bigint` for arbitrary-precision integers",
:create/email "tangj1122@gmail.com",
:create/time 1586823342385,
:block/uid "-9UAPMo-Y",
:edit/time 1587564126475,
:edit/email "tangj1122@gmail.com"}
{:block/string
"wow. can use `short` for small numbers. and `byte`. try `/MAX_VALUE` for any of them",
:create/email "tangj1122@gmail.com",
:create/time 1586823445086,
:block/uid "XDCSVE118",
:edit/time 1587564126475,
:edit/email "tangj1122@gmail.com"}],
:block/uid "zQijqcA6T",
:edit/time 1587564126475,
:edit/email "tangj1122@gmail.com"}
{:block/string "fractional numbers",
:create/email "tangj1122@gmail.com",
:create/time 1586823483539,
:block/children
[{:block/string "floats",
:create/email "tangj1122@gmail.com",
:create/time 1586823561578,
:block/uid "Ejd9mKkDK",
:edit/time 1587564126471,
:edit/email "tangj1122@gmail.com"}
{:block/string "doubles",
:create/email "tangj1122@gmail.com",
:create/time 1586823563770,
:block/uid "CML6762N0",
:edit/time 1587564126471,
:edit/email "tangj1122@gmail.com"}
{:block/string
"can use ratios for exact fractions `(type 1/3)` #Clojure",
:create/email "tangj1122@gmail.com",
:create/time 1586823611345,
:block/uid "jxBGq4TyM",
:edit/time 1587564126471,
:edit/email "tangj1122@gmail.com"}
{:block/string "`=` is exact, `==` is approximation",
:create/email "tangj1122@gmail.com",
:create/time 1586823621388,
:block/children
[{:block/string "counterintuitive coming from javascript",
:create/email "tangj1122@gmail.com",
:create/time 1586823678434,
:block/uid "Z-Q_DfUIi",
:edit/time 1587564126471,
:edit/email "tangj1122@gmail.com"}],
:block/uid "VtBefqQpV",
:edit/time 1587564126474,
:edit/email "tangj1122@gmail.com"}],
:block/uid "qsIrZQh7N",
:edit/time 1587564126474,
:edit/email "tangj1122@gmail.com"}
{:block/string
"\"Putting the verb __first__ in each list allows us to add or multiply more than one number in the same step:\" #Clojure",
:create/email "tangj1122@gmail.com",
:create/time 1586823708677,
:block/children
[{:block/string
"wow that is something i knew but never articulated or formulated clearly in my head",
:create/email "tangj1122@gmail.com",
:create/time 1586823711147,
:block/uid "KWLB-dDIE",
:edit/time 1587564126475,
:edit/email "tangj1122@gmail.com"}
{:block/string
"this also lets you define identities with 0-arity and 1-arity",
:create/email "tangj1122@gmail.com",
:create/time 1586823730564,
:block/uid "M1E4yWA8u",
:edit/time 1587564126475,
:edit/email "tangj1122@gmail.com"}
{:block/string "`(+)` => 0",
:create/email "tangj1122@gmail.com",
:create/time 1586823814461,
:block/uid "etrE1ro0t",
:edit/time 1587564126475,
:edit/email "tangj1122@gmail.com"}
{:block/string "`(*)` => 1",
:create/email "tangj1122@gmail.com",
:create/time 1586823822366,
:block/uid "ongaEDAO2",
:edit/time 1587564126475,
:edit/email "tangj1122@gmail.com"}
{:block/string "`(- 2)` => -2",
:create/email "tangj1122@gmail.com",
:create/time 1586823829070,
:block/uid "iIktXF37d",
:edit/time 1587564126475,
:edit/email "tangj1122@gmail.com"}],
:block/uid "CkPjnNoNh",
:edit/time 1587564126475,
:edit/email "tangj1122@gmail.com"}
{:block/string
"`(<= 1 2 3 )` holy fuck this tells you if the whole list is sorted ",
:create/email "tangj1122@gmail.com",
:create/time 1586823843324,
:block/children
[{:block/string
"`(< 1 1 2)` holy fuck tells you if sorted and unique #Clojure",
:create/email "tangj1122@gmail.com",
:create/time 1586823886166,
:block/uid "wAbQeRCAQ",
:edit/time 1587564126475,
:edit/email "tangj1122@gmail.com"}],
:block/uid "-WvZMjovU",
:edit/time 1587564126475,
:edit/email "tangj1122@gmail.com"}
{:block/string "Symbols",
:create/email "tangj1122@gmail.com",
:create/time 1586824015403,
:block/children
[{:block/string "bare strings of characters",
:create/email "tangj1122@gmail.com",
:create/time 1586824295912,
:block/uid "xIDquLpLw",
:edit/time 1587564126475,
:edit/email "tangj1122@gmail.com"}
{:block/string
"full (fully qualified) or short names (local)",
:create/email "tangj1122@gmail.com",
:create/time 1586824299677,
:block/uid "Fm4DQTLAr",
:edit/time 1587564126475,
:edit/email "tangj1122@gmail.com"}
{:block/string "`(class 'str)`",
:create/email "tangj1122@gmail.com",
:create/time 1586824191787,
:block/uid "3Hto-AUgo",
:edit/time 1587564126475,
:edit/email "tangj1122@gmail.com"}
{:block/string "`(= str clojure.core/str)`",
:create/email "tangj1122@gmail.com",
:create/time 1586824253745,
:block/uid "09Ppxfvt-",
:edit/time 1587564126475,
:edit/email "tangj1122@gmail.com"}
{:block/string
"most common use: as references/lookups to point to other values",
:create/email "tangj1122@gmail.com",
:create/time 1586824359923,
:block/uid "8KhQwjIoX",
:edit/time 1587564126475,
:edit/email "tangj1122@gmail.com"}],
:block/uid "V0WaIrlNB",
:edit/time 1587564126475,
:edit/email "tangj1122@gmail.com"}
{:block/string "Keywords",
:create/email "tangj1122@gmail.com",
:create/time 1586823876277,
:block/children
[{:block/string "labels and identifiers",
:create/email "tangj1122@gmail.com",
:create/time 1586824456418,
:block/uid "XORn7aeA0",
:edit/time 1587564126475,
:edit/email "tangj1122@gmail.com"}
{:block/string "powerful with maps",
:create/email "tangj1122@gmail.com",
:create/time 1586824464113,
:block/uid "NQoeuazfa",
:edit/time 1587564126475,
:edit/email "tangj1122@gmail.com"}],
:block/uid "LbH8Wz6iF",
:edit/time 1587564126475,
:edit/email "tangj1122@gmail.com"}
{:block/string "vectors",
:create/email "tangj1122@gmail.com",
:create/time 1586824474224,
:block/children
[{:block/string "can index with (vec idx) like a function",
:create/email "tangj1122@gmail.com",
:create/time 1586824627529,
:block/uid "N8uk64me8",
:edit/time 1587564126475,
:edit/email "tangj1122@gmail.com"}],
:block/uid "HDsraBEEz",
:edit/time 1587564126475,
:edit/email "tangj1122@gmail.com"}
{:block/string "maps",
:create/email "tangj1122@gmail.com",
:create/time 1586824689281,
:block/children
[{:block/string
"map can be verb, keyword can be, or use `get`! #Clojure",
:create/email "tangj1122@gmail.com",
:create/time 1586824690236,
:block/children
[{:block/string
"it just feels like you're breaking the rules sometimes with Clojure... master the rules like a pro, break them like an artist #quote",
:create/email "tangj1122@gmail.com",
:create/time 1586824886565,
:block/uid "M0UjN2Ywc",
:edit/time 1587564126475,
:edit/email "tangj1122@gmail.com"}],
:block/uid "Camcc0xfD",
:edit/time 1587564126475,
:edit/email "tangj1122@gmail.com"}
{:block/string "`({:jeff 1 :dros 2} :jeff)` => 1",
:create/email "tangj1122@gmail.com",
:create/time 1586824698460,
:block/uid "T-KBDsfPX",
:edit/time 1587564126475,
:edit/email "tangj1122@gmail.com"}
{:block/string "`(:jeff {:jeff 1 :dros 2})` => 1",
:create/email "tangj1122@gmail.com",
:create/time 1586824709598,
:block/uid "Ueso8ALYW",
:edit/time 1587564126475,
:edit/email "tangj1122@gmail.com"}
{:block/string "`(get {:jeff 1 :dros 2} :jeff)` => 1",
:create/email "tangj1122@gmail.com",
:create/time 1586824719190,
:block/children
[{:block/string
"can take a default value to return smth other than nil",
:create/email "tangj1122@gmail.com",
:create/time 1586824729150,
:block/uid "1XTOv12ex",
:edit/time 1587564126475,
:edit/email "tangj1122@gmail.com"}],
:block/uid "qXgblNetU",
:edit/time 1587564126475,
:edit/email "tangj1122@gmail.com"}
{:block/string
"im pretty sure data type can be a key in Clojure... #Clojure",
:create/email "tangj1122@gmail.com",
:create/time 1586824833221,
:block/uid "0aNmDKIOY",
:edit/time 1587564198363,
:edit/email "tangj1122@gmail.com"}],
:block/uid "PGPPtEZNU",
:edit/time 1587564126476,
:edit/email "tangj1122@gmail.com"}
{:block/string "can `(type type)`",
:create/email "tangj1122@gmail.com",
:create/time 1586825119900,
:block/uid "8RQ05MheO",
:edit/time 1587564126476,
:edit/email "tangj1122@gmail.com"}],
:block/uid "PCmU_RYjE",
:edit/time 1587564126476,
:edit/email "tangj1122@gmail.com"}
{:block/string "functions",
:create/email "tangj1122@gmail.com",
:create/time 1586825275754,
:block/children
[{:block/string
"`let` bindings override existing definitions for symbols at that point",
:create/email "tangj1122@gmail.com",
:create/time 1586825280242,
:block/uid "qaWduzfpc",
:edit/time 1587564126476,
:edit/email "tangj1122@gmail.com"}
{:block/string
"`(let [+ -] (+ 2 3))` => -1 HOW IS THIS LEGAL #Clojure",
:create/email "tangj1122@gmail.com",
:create/time 1586825392220,
:block/uid "xGP_LI4IF",
:edit/time 1587564126476,
:edit/email "tangj1122@gmail.com"}
{:block/string "is the whole universe one giant `let`?",
:create/email "tangj1122@gmail.com",
:create/time 1586825400389,
:block/children
[{:block/string "no. we have `var`s, defined with `def`",
:create/email "tangj1122@gmail.com",
:create/time 1586826000212,
:block/uid "lPqTb4liq",
:edit/time 1587564126476,
:edit/email "tangj1122@gmail.com"}],
:block/uid "ZtQcE--Fk",
:edit/time 1587564126476,
:edit/email "tangj1122@gmail.com"}
{:block/string
"you can use `(doc first)` to find docs. can also use `(meta #'first)` to look at the metadata of the __var__ https://clojure.org/guides/weird_characters#_var_quote",
:create/email "tangj1122@gmail.com",
:create/time 1586826012914,
:block/uid "VIhSDjyXQ",
:edit/time 1587564126476,
:edit/email "tangj1122@gmail.com"}
{:block/string
"wow. i completely glossed over var. i didnt even realize that was what was being returned (a `#'ns/var-name`) when i used a `(def var-name var-value)`",
:create/email "tangj1122@gmail.com",
:create/time 1586827135724,
:block/uid "haRL5lS7w",
:edit/time 1587564126476,
:edit/email "tangj1122@gmail.com"}
{:block/string "`type` is a type",
:create/email "tangj1122@gmail.com",
:create/time 1586827270917,
:block/uid "VM593X_-l",
:edit/time 1587564126476,
:edit/email "tangj1122@gmail.com"}
{:block/string "can run `(supers (type type))`",
:create/email "tangj1122@gmail.com",
:create/time 1586827422614,
:block/uid "bSUTTNyDn",
:edit/time 1587564126476,
:edit/email "tangj1122@gmail.com"}
{:block/string "wow what the fuck",
:create/email "tangj1122@gmail.com",
:create/time 1586827429679,
:block/children
[{:block/string
"`meta` tells you when the meta-data defined in a map, but also the line, column, etc.",
:create/email "tangj1122@gmail.com",
:create/time 1586827667917,
:block/uid "OVnXxiJs1",
:edit/time 1587564126476,
:edit/email "tangj1122@gmail.com"}
{:block/string
"and then `source` literally gives you the fucking source code #Clojure",
:create/email "tangj1122@gmail.com",
:create/time 1586827582694,
:block/uid "jE5_s4FD7",
:edit/time 1587564126476,
:edit/email "tangj1122@gmail.com"}],
:block/uid "Pr4E2dmk5",
:edit/time 1587564126476,
:edit/email "tangj1122@gmail.com"}
{:block/string "`(source +)` has interesting stuff in it",
:create/email "tangj1122@gmail.com",
:create/time 1586827665369,
:block/children
[{:block/string "what is `nary-inline`? ",
:create/email "tangj1122@gmail.com",
:create/time 1586827965747,
:block/uid "U_oJ-oYER",
:edit/time 1587564126476,
:edit/email "tangj1122@gmail.com"}
{:block/string "`reduce`?",
:create/email "tangj1122@gmail.com",
:create/time 1586827973362,
:block/uid "8-NGOaRqf",
:edit/time 1587564126476,
:edit/email "tangj1122@gmail.com"}
{:block/string "`add` ?",
:create/email "tangj1122@gmail.com",
:create/time 1586827975760,
:block/uid "Fj4C2-nbM",
:edit/time 1587564126476,
:edit/email "tangj1122@gmail.com"}],
:block/uid "hZCa58_zs",
:edit/time 1587564126476,
:edit/email "tangj1122@gmail.com"}
{:block/string
"special forms are the fundamental constructs - cant go any further",
:create/email "tangj1122@gmail.com",
:create/time 1586827979246,
:block/children
[{:block/string "`(source def)` nada",
:create/email "tangj1122@gmail.com",
:create/time 1586828074050,
:block/uid "47kMidWtS",
:edit/time 1587564126476,
:edit/email "tangj1122@gmail.com"}],
:block/uid "EyAoxKtGJ",
:edit/time 1587564126476,
:edit/email "tangj1122@gmail.com"}
{:block/string
"`partial #(Math/pow %2 %1)` just ridiculous that u can do this to form a lexical closure curry #Clojure",
:create/email "tangj1122@gmail.com",
:create/time 1586833914225,
:block/uid "6qd_DNKo0",
:edit/time 1587564126476,
:edit/email "tangj1122@gmail.com"}],
:block/uid "kSNMLzM6-",
:edit/time 1587564126476,
:edit/email "tangj1122@gmail.com"}
{:block/string "sequences",
:create/email "tangj1122@gmail.com",
:create/time 1586872469861,
:block/children
[{:block/string
"can create map, filter, reduce, all with basic recursion",
:create/email "tangj1122@gmail.com",
:create/time 1586874104464,
:block/children
[{:block/string
"and you can create map and filter from reduce, no?",
:create/email "tangj1122@gmail.com",
:create/time 1586877075399,
:block/children
[{:block/string "map",
:create/email "tangj1122@gmail.com",
:create/time 1586877406410,
:block/children
[{:block/string
"`(defn my-map [f coll]\n (reduce (fn [acc x]\n (conj acc (f x)))\n []\n coll))`",
:create/email "tangj1122@gmail.com",
:create/time 1586877247476,
:block/uid "GPKIDjbAK",
:edit/time 1587564126476,
:edit/email "tangj1122@gmail.com"}],
:block/uid "f0FZQ1VIG",
:edit/time 1587564126476,
:edit/email "tangj1122@gmail.com"}
{:block/string "filter",
:create/email "tangj1122@gmail.com",
:create/time 1586877410739,
:block/children
[{:block/string
"`(defn my-filter [f coll]\n (reduce (fn [acc x]\n (if (f x)\n (conj acc x)\n acc))\n []\n coll))`",
:create/email "tangj1122@gmail.com",
:create/time 1586877413144,
:block/uid "jRW5g5WHj",
:edit/time 1587564126476,
:edit/email "tangj1122@gmail.com"}],
:block/uid "TUQPv7Pu5",
:edit/time 1587564126476,
:edit/email "tangj1122@gmail.com"}
{:block/string "((Upwsqpbt7))",
:create/email "tangj1122@gmail.com",
:create/time 1586877608410,
:block/uid "04mbGXpiJ",
:edit/time 1587564126476,
:edit/email "tangj1122@gmail.com"}],
:block/uid "xQzWcWkoA",
:edit/time 1587564126476,
:edit/email "tangj1122@gmail.com"}],
:block/uid "YFiSP0GPG",
:edit/time 1587564126476,
:edit/email "tangj1122@gmail.com"}
{:block/string
"`iterate` - builds off previous: `x`, `(f x)`, `(f (f x))` just like in recursion",
:create/email "tangj1122@gmail.com",
:create/time 1586874151995,
:block/children
[{:block/string "**side effect free**",
:create/email "tangj1122@gmail.com",
:create/time 1586874370697,
:block/uid "F2OFAlt5R",
:edit/time 1587564126476,
:edit/email "tangj1122@gmail.com"}],
:block/uid "-ANVZRE4E",
:edit/time 1587564126476,
:edit/email "tangj1122@gmail.com"}
{:block/string "`take`",
:create/email "tangj1122@gmail.com",
:create/time 1586874154569,
:block/uid "r-ZoMQAaw",
:edit/time 1587564126477,
:edit/email "tangj1122@gmail.com"}
{:block/string "`repeat` and `repeatedly`",
:create/email "tangj1122@gmail.com",
:create/time 1586874114878,
:block/children
[{:block/string
"`(take 5 (repeat (rand)))` - same `rand` reused",
:create/email "tangj1122@gmail.com",
:create/time 1586874132248,
:block/uid "0ESZCJ1Wg",
:edit/time 1587564126476,
:edit/email "tangj1122@gmail.com"}
{:block/string
"`(repeatedly rand)` recomputes function each time - diff `rand` each time",
:create/email "tangj1122@gmail.com",
:create/time 1586874241169,
:block/uid "TT_xxpwGJ",
:edit/time 1587564126476,
:edit/email "tangj1122@gmail.com"}
{:block/string "`rand` **impure**",
:create/email "tangj1122@gmail.com",
:create/time 1586874273815,
:block/uid "hdg_qjpBF",
:edit/time 1587564126476,
:edit/email "tangj1122@gmail.com"}],
:block/uid "GKRrwst_s",
:edit/time 1587564126476,
:edit/email "tangj1122@gmail.com"}
{:block/string "`range` of course, v similar to python",
:create/email "tangj1122@gmail.com",
:create/time 1586874379928,
:block/uid "QcWLGM6-_",
:edit/time 1587564126477,
:edit/email "tangj1122@gmail.com"}
{:block/string "`cycle` is nasty holy",
:create/email "tangj1122@gmail.com",
:create/time 1586874409538,
:block/uid "kJ2LI-mTA",
:edit/time 1587564126477,
:edit/email "tangj1122@gmail.com"}
{:block/string
"\"If one sequence is bigger than another, map stops at the end of the smaller one. We can exploit this to combine finite and infinite sequences.\"",
:create/email "tangj1122@gmail.com",
:create/time 1586874414115,
:block/children
[{:block/string
"this is default behavior for map, zipmap, interleave, etc. i always knew it ended with the shorter seq, but never made the connection to infinite and finite seqs #Clojure",
:create/email "tangj1122@gmail.com",
:create/time 1586874953986,
:block/uid "DBFkh7Sn0",
:edit/time 1587564126477,
:edit/email "tangj1122@gmail.com"}],
:block/uid "dvwYk57BL",
:edit/time 1587564126477,
:edit/email "tangj1122@gmail.com"}
{:block/string
"oh there's a `shuffle` coll function. must be impure",
:create/email "tangj1122@gmail.com",
:create/time 1586874990259,
:block/uid "9D3XwKlOM",
:edit/time 1587564126477,
:edit/email "tangj1122@gmail.com"}
{:block/string "subseq",
:create/email "tangj1122@gmail.com",
:create/time 1586875832327,
:block/children
[{:block/string "`take` and `drop` for subseq beginning",
:create/email "tangj1122@gmail.com",
:create/time 1586875374699,
:block/uid "8yuD3CDSL",
:edit/time 1587564126477,
:edit/email "tangj1122@gmail.com"}
{:block/string "`take-last` and `drop-last` for end",
:create/email "tangj1122@gmail.com",
:create/time 1586875771553,
:block/uid "NG9LQzoVN",
:edit/time 1587564126477,
:edit/email "tangj1122@gmail.com"}
{:block/string "`take-while` and `drop-while` use a fn",
:create/email "tangj1122@gmail.com",
:create/time 1586875778382,
:block/uid "Oefnuscez",
:edit/time 1587564126477,
:edit/email "tangj1122@gmail.com"}
{:block/string "`split-at` an index",
:create/email "tangj1122@gmail.com",
:create/time 1586875836477,
:block/uid "MUQRG6aII",
:edit/time 1587564126477,
:edit/email "tangj1122@gmail.com"}
{:block/string "`split-with` uses a fn",
:create/email "tangj1122@gmail.com",
:create/time 1586875842078,
:block/uid "CD0b2Nb6K",
:edit/time 1587564126477,
:edit/email "tangj1122@gmail.com"}
{:block/string "`filter` if true, `remove` the complement",
:create/email "tangj1122@gmail.com",
:create/time 1586875848130,
:block/uid "OGx_gLB1p",
:edit/time 1587564126477,
:edit/email "tangj1122@gmail.com"}
{:block/string "`partition n` and `partition-by f`",
:create/email "tangj1122@gmail.com",
:create/time 1586876288187,
:block/children
[{:block/string "hollllllly molyyyyy",
:create/email "tangj1122@gmail.com",
:create/time 1586876296478,
:block/uid "CGBJFkbSB",
:edit/time 1587564126477,
:edit/email "tangj1122@gmail.com"}
{:block/string
"annihilates problems 30 and 31 on [[4Clojure]]",
:create/email "tangj1122@gmail.com",
:create/time 1586876707744,
:block/uid "JvPYeyqY4",
:edit/time 1587564126477,
:edit/email "tangj1122@gmail.com"}],
:block/uid "wP7GHRH9F",
:edit/time 1587564126477,
:edit/email "tangj1122@gmail.com"}],
:block/uid "oWokPLap1",
:edit/time 1587564126477,
:edit/email "tangj1122@gmail.com"}
{:block/string "collapsing sequences",
:create/email "tangj1122@gmail.com",
:create/time 1586876723539,
:block/children
[{:block/string "`group-by`",
:create/email "tangj1122@gmail.com",
:create/time 1586876795246,
:block/uid "naiLpPf6G",
:edit/time 1587564126477,
:edit/email "tangj1122@gmail.com"}
{:block/string "`frequencies`",
:create/email "tangj1122@gmail.com",
:create/time 1586876796967,
:block/uid "QwwCbK0tI",
:edit/time 1587564126477,
:edit/email "tangj1122@gmail.com"}
{:block/string "`reduce` and `reductions`!!",
:create/email "tangj1122@gmail.com",
:create/time 1586876832372,
:block/uid "ZKKZyMu0l",
:edit/time 1587564126477,
:edit/email "tangj1122@gmail.com"}
{:block/string
"can `reduce conj data structure`, or use the fn made specifically for this `into`!",
:create/email "tangj1122@gmail.com",
:create/time 1586876881892,
:block/uid "772pGUjor",
:edit/time 1587564126477,
:edit/email "tangj1122@gmail.com"}
{:block/string
"ooh `reduced` for early termination (say for infinite seqs)",
:create/email "tangj1122@gmail.com",
:create/time 1586876973866,
:block/uid "d8sc74Nwl",
:edit/time 1587564126477,
:edit/email "tangj1122@gmail.com"}],
:block/uid "AYBv6fPdK",
:edit/time 1587564126477,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Almost any operation on a sequence can be expressed in terms of a reduce–though for various reasons, many of the Clojure sequence functions are not written this way #Clojure",
:create/email "tangj1122@gmail.com",
:create/time 1586877537107,
:block/uid "Upwsqpbt7",
:edit/time 1587564126477,
:edit/email "tangj1122@gmail.com"}],
:block/uid "gxV8AeYi8",
:edit/time 1587564126477,
:edit/email "tangj1122@gmail.com"}
{:block/string "macros",
:create/email "tangj1122@gmail.com",
:create/time 1586872471085,
:block/children
[{:block/string
"functions rewrite values, macros rewrite code #macros",
:create/email "tangj1122@gmail.com",
:create/time 1586882305278,
:block/uid "V8h0tM7c9",
:edit/time 1587564126477,
:edit/email "tangj1122@gmail.com"}
{:block/string
"lisp is its own [[metalanguage]] [[homoiconic]]",
:create/email "tangj1122@gmail.com",
:create/time 1586882326177,
:block/uid "jrYIR-sLU",
:edit/time 1587564126477,
:edit/email "tangj1122@gmail.com"}
{:block/string
"there's procedural macro system (Clojure), templating expressions ([[Scheme]]), and even more powerful [[f-expressions]]",
:create/email "tangj1122@gmail.com",
:create/time 1586883153927,
:block/uid "hD9wCdFS7",
:edit/time 1587564126477,
:edit/email "tangj1122@gmail.com"}
{:block/string
"[[Scala]] has macros, but the syntax tree looks nothing like the code itself",
:create/email "tangj1122@gmail.com",
:create/time 1586883258231,
:block/uid "KfrxCbIBB",
:edit/time 1587564126477,
:edit/email "tangj1122@gmail.com"}
{:block/string "[[special forms]]",
:create/email "tangj1122@gmail.com",
:create/time 1586883290957,
:block/children
[{:block/string "fixed in Ruby, JS, etc.",
:create/email "tangj1122@gmail.com",
:create/time 1586883444060,
:block/uid "AKg9Fo_IQ",
:edit/time 1587564126477,
:edit/email "tangj1122@gmail.com"}
{:block/string "just macros in Clojure that you can redefine",
:create/email "tangj1122@gmail.com",
:create/time 1586883449052,
:block/uid "KiT7G6cyq",
:edit/time 1587564126477,
:edit/email "tangj1122@gmail.com"}],
:block/uid "qlFmTExzu",
:edit/time 1587564126477,
:edit/email "tangj1122@gmail.com"}
{:block/string
"` syntax quote: like normal quote - defining data, don't eval - but can be unquoted to evaluate expressions",
:create/email "tangj1122@gmail.com",
:create/time 1586883480996,
:block/uid "4bpPi_WKR",
:edit/time 1587564126477,
:edit/email "tangj1122@gmail.com"}
{:block/string "`~` unquote",
:create/email "tangj1122@gmail.com",
:create/time 1586883500769,
:block/uid "xze19Nlzc",
:edit/time 1587564126477,
:edit/email "tangj1122@gmail.com"}
{:block/string "`~@` unquote-splice: explodes a list",
:create/email "tangj1122@gmail.com",
:create/time 1586883506810,
:block/children
[{:block/string
"particularly great for taking arbitrary number of args or recursive expansions",
:create/email "tangj1122@gmail.com",
:create/time 1586883511819,
:block/uid "ZA6111n39",
:edit/time 1587564126477,
:edit/email "tangj1122@gmail.com"}],
:block/uid "b5a91DU5o",
:edit/time 1587564126477,
:edit/email "tangj1122@gmail.com"}
{:block/string
"`or__5516__auto__ generated to prevent naming conflicts/collisions with local namespace`",
:create/email "tangj1122@gmail.com",
:create/time 1586884313855,
:block/children
[{:block/string
"can youse `gensym` similarly to generate new symbols",
:create/email "tangj1122@gmail.com",
:create/time 1586884317386,
:block/uid "1OA6_veiS",
:edit/time 1587564126477,
:edit/email "tangj1122@gmail.com"}],
:block/uid "JE3Y-tJVm",
:edit/time 1587564126477,
:edit/email "tangj1122@gmail.com"}
{:block/string
"escape hatch: can override local variable with `~'foo` instead of `foo#`",
:create/email "tangj1122@gmail.com",
:create/time 1586884495923,
:block/children
[{:block/string
"aka symbol capture, anaphoric, unhygenic macro",
:create/email "tangj1122@gmail.com",
:create/time 1586884508882,
:block/uid "rB1hgUdTG",
:edit/time 1587564126478,
:edit/email "tangj1122@gmail.com"}],
:block/uid "HACmO85wv",
:edit/time 1587564126478,
:edit/email "tangj1122@gmail.com"}
{:block/string
"`or` `and` `if` all macros that do not obey normal execution order",
:create/email "tangj1122@gmail.com",
:create/time 1586884911238,
:block/children
[{:block/string
"they can short-circuit and manage control flow",
:create/email "tangj1122@gmail.com",
:create/time 1586884940962,
:block/uid "CtuKT_M1j",
:edit/time 1587564126478,
:edit/email "tangj1122@gmail.com"}],
:block/uid "s3ONYp5Hw",
:edit/time 1587564126478,
:edit/email "tangj1122@gmail.com"}
{:block/string "recursion",
:create/email "tangj1122@gmail.com",
:create/time 1586884962773,
:block/children
[{:block/string
"when memory cannot be freed up from the stack, because it needs the deeper functions to return",
:create/email "tangj1122@gmail.com",
:create/time 1586885603972,
:block/uid "YqvFGzdvE",
:edit/time 1587564126478,
:edit/email "tangj1122@gmail.com"}
{:block/string "[[tail-recursive]] function with `recur`",
:create/email "tangj1122@gmail.com",
:create/time 1586885624535,
:block/uid "ctuj1EmL3",
:edit/time 1587564126478,
:edit/email "tangj1122@gmail.com"}
{:block/string "lol you can use without `loop`",
:create/email "tangj1122@gmail.com",
:create/time 1586885830174,
:block/uid "_ciE0gAiE",
:edit/time 1587564126478,
:edit/email "tangj1122@gmail.com"}
{:block/string
"but you can think of `loop` \"like a recursive `let`\"",
:create/email "tangj1122@gmail.com",
:create/time 1586885846350,
:block/uid "P9dEaQTLb",
:edit/time 1587564126478,
:edit/email "tangj1122@gmail.com"}],
:block/uid "9M8z7NScr",
:edit/time 1587564126478,
:edit/email "tangj1122@gmail.com"}
{:block/string "laziness",
:create/email "tangj1122@gmail.com",
:create/time 1586885865893,
:block/children
[{:block/string
"When using lazy-seq and its partner lazy-cat, you don’t have to use recur–or even be tail-recursive. The macros interrupt each level of recursion, preventing stack overflows.",
:create/email "tangj1122@gmail.com",
:create/time 1586886012873,
:block/children
[{:block/string "?????",
:create/email "tangj1122@gmail.com",
:create/time 1586886019906,
:block/uid "ocOy6DFbh",
:edit/time 1587564126478,
:edit/email "tangj1122@gmail.com"}],
:block/uid "4vZQnAgsH",
:edit/time 1587564126478,
:edit/email "tangj1122@gmail.com"}],
:block/uid "uOI8qtB_s",
:edit/time 1587564126478,
:edit/email "tangj1122@gmail.com"}
{:block/string "`for`",
:create/email "tangj1122@gmail.com",
:create/time 1586886534406,
:block/children
[{:block/string
"can use `:when` for filter, `:while` for exit condition, `:let` for binding",
:create/email "tangj1122@gmail.com",
:create/time 1586886021251,
:block/uid "t4waZPxpf",
:edit/time 1587564126478,
:edit/email "tangj1122@gmail.com"}],
:block/uid "lNxqs2Mbt",
:edit/time 1587564126478,
:edit/email "tangj1122@gmail.com"}
{:block/string "threading macro",
:create/email "tangj1122@gmail.com",
:create/time 1586886549362,
:block/children
[{:block/string "wow.",
:create/email "tangj1122@gmail.com",
:create/time 1586886769583,
:block/uid "5WZ6AupPi",
:edit/time 1587564126478,
:edit/email "tangj1122@gmail.com"}
{:block/string
"`macroexpand` just blowing my mind, showing me what these macros turn into",
:create/email "tangj1122@gmail.com",
:create/time 1586886781147,
:block/uid "gLuBwJjHY",
:edit/time 1587564126478,
:edit/email "tangj1122@gmail.com"}
{:block/string
"`(macroexpand\n '(->> (range 10)\n (filter odd?)\n (reduce +)))\n;; => (reduce + (filter odd? (range 10)))`",
:create/email "tangj1122@gmail.com",
:create/time 1586886957047,
:block/uid "hUC1WG7Gy",
:edit/time 1587564126478,
:edit/email "tangj1122@gmail.com"}
{:block/string
"`(macroexpand\n '(-> {:proton :fermion}\n (assoc :photon :boson)\n (assoc :neutrino :fermion)))\n;; => (assoc (assoc {:proton :fermion} :photon :boson) :neutrino :fermion)`",
:create/email "tangj1122@gmail.com",
:create/time 1586886800475,
:block/uid "sJwDhqm4M",
:edit/time 1587564126478,
:edit/email "tangj1122@gmail.com"}],
:block/uid "hlBOrwlNE",
:edit/time 1587564126478,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Clojure isn’t just function-oriented in its syntax; it can be object-oriented, and stack-oriented, and array-oriented, and so on–and __mix all of these styles freely, in a controlled way__. If you don’t like the way the language fits a certain problem, **you can write a macro which defines a __new__ language, specifically for that subproblem.** #Clojure #macros",
:block/uid "3o_vM-iKq",
:edit/time 1587569716410,
:edit/email "tangj1122@gmail.com"}
{:block/string
"cond, condp and case, for example, express a language for branching based on predicates. ->, ->>, and doto express object-oriented and other expression-chaining languages.",
:block/children
[{:block/string
"[core.match](https://github.com/clojure/core.match) is a set of macros which express powerful __pattern-matching__ and substitution languages.",
:block/uid "w5PmYJP0F",
:edit/time 1587564126478,
:edit/email "tangj1122@gmail.com"}
{:block/string
"[core.logic](https://github.com/clojure/core.logic) expresses syntax for __logic programming__, for finding values which satisfy complex constraints.",
:block/uid "LDRFkvlaB",
:edit/time 1587564126478,
:edit/email "tangj1122@gmail.com"}
{:block/string
"[core.async](http://clojure.com/blog/2013/06/28/clojure-core-async-channels.html) restructures Clojure code into __asynchronous__ forms so they can do many things at once.",
:block/uid "wv9Bemxvj",
:edit/time 1587564126478,
:edit/email "tangj1122@gmail.com"}
{:block/string
"For those with a twisted sense of humor, [Swiss Arrows](https://github.com/rplevy/swiss-arrows) extends the threading macros into evil–but delightfully concise!–forms.",
:block/uid "pZ3kqXBgC",
:edit/time 1587564126478,
:edit/email "tangj1122@gmail.com"}],
:block/uid "MQRy5Sl9Y",
:edit/time 1587564126478,
:edit/email "tangj1122@gmail.com"}
{:block/string
"{{[[TODO]]}} read https://aphyr.com/posts/268-language-power [[macros]]",
:create/email "tangj1122@gmail.com",
:create/time 1586887167757,
:block/uid "4o8xemV0G",
:edit/time 1587564126478,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1586887173347,
:block/uid "klWXoOFA7",
:edit/time 1587564126478,
:edit/email "tangj1122@gmail.com"}],
:block/uid "p94ckAXmh",
:edit/time 1587564126478,
:edit/email "tangj1122@gmail.com"}
{:block/string "state",
:create/email "tangj1122@gmail.com",
:create/time 1586872471987,
:block/children
[{:block/string
"In Clojure, new functions \"close over\" all variables -- except their arguments which are provided at invocation",
:create/email "tangj1122@gmail.com",
:create/time 1586908064976,
:block/uid "Qb9xk5IoO",
:edit/time 1587564126478,
:edit/email "tangj1122@gmail.com"}
{:block/string
"because fns close over arguments, their evaluation can be deferred",
:create/email "tangj1122@gmail.com",
:create/time 1586908201988,
:block/uid "2EupgPGf0",
:edit/time 1587564126478,
:edit/email "tangj1122@gmail.com"}
{:block/string
"currying functions (function factories) allow you to eval expression outside normal sequential order [[concurrency]]",
:create/email "tangj1122@gmail.com",
:create/time 1586908324980,
:block/uid "LkFhW8A6u",
:edit/time 1587564126478,
:edit/email "tangj1122@gmail.com"}
{:block/string "delays: lazy",
:create/email "tangj1122@gmail.com",
:create/time 1586909879972,
:block/uid "B_Oojbpqs",
:edit/time 1587564126478,
:edit/email "tangj1122@gmail.com"}
{:block/string "futures: parallel",
:create/email "tangj1122@gmail.com",
:create/time 1586909883974,
:block/uid "MdAOc7pV9",
:edit/time 1587564126479,
:edit/email "tangj1122@gmail.com"}
{:block/string
"promises: concurrency without specifying evaluation",
:create/email "tangj1122@gmail.com",
:create/time 1586909887563,
:block/children
[{:block/string
"\"delays and futures built on top of promises, in a way\"",
:create/email "tangj1122@gmail.com",
:create/time 1586909880125,
:block/uid "YEAqKnPFx",
:edit/time 1587564126479,
:edit/email "tangj1122@gmail.com"}],
:block/uid "3d2_tos-w",
:edit/time 1587564126479,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1586908384325,
:block/uid "M0qdrAS7L",
:edit/time 1587564126478,
:edit/email "tangj1122@gmail.com"}
{:block/string "vars, `^:dynamic` `binding`",
:create/email "tangj1122@gmail.com",
:create/time 1586908036059,
:block/uid "V7twWoRoo",
:edit/time 1587564126478,
:edit/email "tangj1122@gmail.com"}
{:block/string "atoms",
:create/email "tangj1122@gmail.com",
:create/time 1586908044721,
:block/children
[{:block/string
"`swap!` consecutive, transactional, observable by all",
:create/email "tangj1122@gmail.com",
:create/time 1586959696624,
:block/uid "-YXVj1TqG",
:edit/time 1587564126478,
:edit/email "tangj1122@gmail.com"}
{:block/string "swap! takes in a strictly pure fn",
:create/email "tangj1122@gmail.com",
:create/time 1586959719225,
:block/uid "j5M44c4nk",
:edit/time 1587564126478,
:edit/email "tangj1122@gmail.com"}
{:block/string
"other languages need locks and shit. super easy with clojure bc immutable data structures, immutable variables, and pure fns",
:create/email "tangj1122@gmail.com",
:create/time 1586960026585,
:block/uid "YPumqaosm",
:edit/time 1587564126478,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Atoms are a great way to represent state, but they are only linearizable __individually__.",
:create/email "tangj1122@gmail.com",
:create/time 1586908046285,
:block/uid "-9HN5lsay",
:edit/time 1587564126478,
:edit/email "tangj1122@gmail.com"}],
:block/uid "WYlbVOmtR",
:edit/time 1587564126478,
:edit/email "tangj1122@gmail.com"}
{:block/string "refs",
:create/email "tangj1122@gmail.com",
:create/time 1586960087828,
:block/children
[{:block/string
"what if you have multiple places of state, that need to update in sync? e.g. banking transactions",
:create/email "tangj1122@gmail.com",
:create/time 1586960125742,
:block/uid "YkshouF3y",
:edit/time 1587564126479,
:edit/email "tangj1122@gmail.com"}
{:block/string "group transactions with `dosync`",
:create/email "tangj1122@gmail.com",
:create/time 1586960090585,
:block/uid "qa3p3Tb1_",
:edit/time 1587564126479,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Refs are a powerful construct, and make it easier to write complex transactional logic safely. However, that safety comes at a cost: **refs are typically an order of magnitude slower to update than atoms.**",
:create/email "tangj1122@gmail.com",
:create/time 1586960108978,
:block/uid "QDAhaaUsp",
:edit/time 1587564126479,
:edit/email "tangj1122@gmail.com"}
{:block/string "`ensure`",
:create/email "tangj1122@gmail.com",
:create/time 1586970725515,
:block/uid "bsFozdlAw",
:edit/time 1587564126479,
:edit/email "tangj1122@gmail.com"}
{:block/string "`commute` commutative property",
:create/email "tangj1122@gmail.com",
:create/time 1586970727116,
:block/uid "4lBO_vhJv",
:edit/time 1587564126479,
:edit/email "tangj1122@gmail.com"}
{:block/string "`alter`",
:create/email "tangj1122@gmail.com",
:create/time 1586970731425,
:block/uid "jaVfzC3CK",
:edit/time 1587564126479,
:edit/email "tangj1122@gmail.com"}],
:block/uid "sOSTu2A4G",
:edit/time 1587564126479,
:edit/email "tangj1122@gmail.com"}
{:block/string
"![](https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fjefftang%2FJG5DMDiqEh?alt=media&token=afeaa267-102c-4d13-9147-d7a9cbf91a2d)",
:create/email "tangj1122@gmail.com",
:create/time 1586960781822,
:block/uid "wj_vJcG-l",
:edit/time 1587564126479,
:edit/email "tangj1122@gmail.com"}],
:block/uid "b4-DpayDM",
:edit/time 1587564126479,
:edit/email "tangj1122@gmail.com"}
{:block/string "logistics",
:create/email "tangj1122@gmail.com",
:create/time 1586872472527,
:block/children
[{:block/string
"a bit of lein, some testing, mainly just data processing tho",
:create/email "tangj1122@gmail.com",
:create/time 1586903744888,
:block/uid "Cf6yNSpmm",
:edit/time 1587564126479,
:edit/email "tangj1122@gmail.com"}
{:block/string
"[[FP]]s like [[Erlang]], [[Modula-2]], [[Haskell]], [[Perl]], or [[ML]] have namespaces/modules/packages with 100s of functions",
:create/email "tangj1122@gmail.com",
:create/time 1586903779906,
:block/uid "ibKTwMD1H",
:edit/time 1587564126479,
:edit/email "tangj1122@gmail.com"}
{:block/string
"[[OOP]] languages will have 100s of classes, some with only one function/method within",
:block/uid "mxc6p170z",
:edit/time 1587564126479,
:edit/email "tangj1122@gmail.com"}],
:block/uid "nmeXMIqQN",
:edit/time 1587564126479,
:edit/email "tangj1122@gmail.com"}
{:block/string "modeling",
:create/email "tangj1122@gmail.com",
:create/time 1586872474191,
:block/children
[{:block/string "models rocket science lol",
:create/email "tangj1122@gmail.com",
:create/time 1586907927551,
:block/uid "X1oUcnJVR",
:edit/time 1587564126479,
:edit/email "tangj1122@gmail.com"}],
:block/uid "JAEz11v4s",
:edit/time 1587564126479,
:edit/email "tangj1122@gmail.com"}
{:block/string "roadmap",
:create/email "tangj1122@gmail.com",
:create/time 1586872475068,
:block/children
[{:block/string "only does debugging :(",
:create/email "tangj1122@gmail.com",
:create/time 1586907941908,
:block/uid "sIsllDkEt",
:edit/time 1587564126479,
:edit/email "tangj1122@gmail.com"}],
:block/uid "BCKmqYRR6",
:edit/time 1587564126479,
:edit/email "tangj1122@gmail.com"}
{:block/string "[[debugging]]",
:create/email "tangj1122@gmail.com",
:create/time 1586822145994,
:block/children
[{:block/string
"stack traces are hints. its a trail you gotta sniff",
:create/email "tangj1122@gmail.com",
:create/time 1586822235228,
:block/uid "0n3LQoTZX",
:edit/time 1587564126479,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Programming languages and us, their users, are engaged in a continual dialogue. We may speak more formally, verbosely, with many types and defensive assertions–or we may speak quickly, generally, in fuzzy terms. The more precise we are with the specifications of our program’s types, the more the program can assist us when things go wrong. Conversely, those specifications __harden__ our programs into strong but __rigid__ forms, and rigid structures are harder to bend into new shapes.",
:block/uid "si83Fva05",
:edit/time 1587564126479,
:edit/email "tangj1122@gmail.com"}
{:block/string
"In Clojure we strike a more dynamic balance: we speak in generalities, but we pay for that flexibility. Our errors are harder to trace to their origins",
:block/uid "P083Js7WE",
:edit/time 1587564126479,
:edit/email "tangj1122@gmail.com"}],
:block/uid "Ily61twT8",
:edit/time 1587564126479,
:edit/email "tangj1122@gmail.com"}],
:block/uid "6cHYMhCqQ",
:edit/time 1587564054370,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1587564050030,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587564126737,
:node/title "quote",
:edit/time 1587564126738,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587564126797,
:node/title "4Clojure",
:edit/time 1587564126798,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587564126810,
:node/title "metalanguage",
:edit/time 1587564126811,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587564126810,
:node/title "homoiconic",
:edit/time 1587564126811,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587564126813,
:node/title "Scheme",
:edit/time 1587564126814,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587564126813,
:node/title "f-expressions",
:edit/time 1587564126814,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587564126817,
:node/title "Scala",
:edit/time 1587564126817,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587564126819,
:node/title "special forms",
:edit/time 1587564126819,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587564126834,
:node/title "tail-recursive",
:edit/time 1587564126835,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587564126857,
:node/title "TODO",
:edit/time 1587564126858,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587564126870,
:node/title "concurrency",
:edit/time 1587564126870,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587564126886,
:node/title "OOP",
:edit/time 1587564126887,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587564126889,
:node/title "FP",
:edit/time 1587564126891,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587564126889,
:node/title "Erlang",
:edit/time 1587564126891,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587564126889,
:node/title "Modula-2",
:edit/time 1587564126891,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587564126889,
:node/title "Haskell",
:edit/time 1587564126891,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587564126889,
:node/title "Perl",
:edit/time 1587564126891,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587564126889,
:node/title "ML",
:edit/time 1587564126891,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587564126898,
:node/title "debugging",
:edit/time 1587564126899,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587568590090,
:node/title "logic programming",
:edit/time 1587568590092,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587569765448,
:node/title "Lisp",
:edit/time 1587569765450,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587569820036,
:node/title "programming languages",
:edit/time 1587569820038,
:edit/email "tangj1122@gmail.com"}
{:node/title "Links",
:block/children
[{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1587575369501,
:block/uid "3VzF4bh6V",
:edit/time 1587575369491,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1587575369503,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587641045989,
:node/title "Athens vs Roam Tech Stack",
:block/children
[{:block/string "type:: [[documentation]]",
:create/email "tangj1122@gmail.com",
:create/time 1587642183593,
:block/uid "_hwva76Ne",
:edit/time 1587923027409,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1587643664782,
:block/uid "raIhL_deZ",
:edit/time 1587643664782,
:edit/email "tangj1122@gmail.com"}
{:block/string "{{table}}",
:create/email "tangj1122@gmail.com",
:create/time 1587645284685,
:block/children
[{:block/string "---",
:create/email "tangj1122@gmail.com",
:create/time 1587645828567,
:block/children
[{:block/string "Roam",
:create/email "tangj1122@gmail.com",
:create/time 1587645366202,
:block/children
[{:block/string "Athens",
:create/email "tangj1122@gmail.com",
:create/time 1587645364119,
:block/uid "ygfeB69D_",
:edit/time 1587645366206,
:edit/email "tangj1122@gmail.com"}],
:block/uid "mpirnKZA5",
:edit/time 1587645368174,
:edit/email "tangj1122@gmail.com"}],
:block/uid "8hV_DBmz8",
:edit/time 1587645838636,
:edit/email "tangj1122@gmail.com"}
{:block/string "**---frontend---**",
:create/email "tangj1122@gmail.com",
:create/time 1587645840725,
:block/uid "fhEIzgoN6",
:edit/time 1587645846630,
:edit/email "tangj1122@gmail.com"}
{:block/string "CLJS tooling",
:create/email "tangj1122@gmail.com",
:create/time 1587645295154,
:block/children
[{:block/string "shadow-cljs",
:create/email "tangj1122@gmail.com",
:create/time 1587645468983,
:block/children
[{:block/string "shadow-cljs",
:create/email "tangj1122@gmail.com",
:create/time 1587645473040,
:block/uid "I30mBLImQ",
:edit/time 1587645474440,
:edit/email "tangj1122@gmail.com"}],
:block/uid "cjJjUUJRS",
:edit/time 1587645472073,
:edit/email "tangj1122@gmail.com"}],
:block/uid "6c0kodoIa",
:edit/time 1587645741138,
:edit/email "tangj1122@gmail.com"}
{:block/string "async",
:create/email "tangj1122@gmail.com",
:create/time 1587648713079,
:block/children
[{:block/string "cljs.core.async",
:create/email "tangj1122@gmail.com",
:create/time 1587648715400,
:block/children
[{:block/string "cljs.core.async",
:create/email "tangj1122@gmail.com",
:create/time 1587648719571,
:block/uid "UhxDNNKR7",
:edit/time 1587648720988,
:edit/email "tangj1122@gmail.com"}],
:block/uid "-IkH3hCkT",
:edit/time 1587648719219,
:edit/email "tangj1122@gmail.com"}],
:block/uid "Gw_lpK5GU",
:edit/time 1587648715422,
:edit/email "tangj1122@gmail.com"}
{:block/string "parser",
:create/email "tangj1122@gmail.com",
:create/time 1587645325251,
:block/children
[{:block/string "instaparse",
:create/email "tangj1122@gmail.com",
:create/time 1587645479248,
:block/children
[{:block/string "instaparse",
:create/email "tangj1122@gmail.com",
:create/time 1587645483627,
:block/uid "_Rv5v0X3l",
:edit/time 1587645484349,
:edit/email "tangj1122@gmail.com"}],
:block/uid "F5DW8QN9Y",
:edit/time 1587645482192,
:edit/email "tangj1122@gmail.com"}],
:block/uid "VGlIK-ruk",
:edit/time 1587645327572,
:edit/email "tangj1122@gmail.com"}
{:block/string "testing",
:create/email "tangj1122@gmail.com",
:create/time 1587645961618,
:block/children
[{:block/string "cljs.test",
:create/email "tangj1122@gmail.com",
:create/time 1587645964710,
:block/children
[{:block/string "cljs.test",
:create/email "tangj1122@gmail.com",
:create/time 1587645968953,
:block/uid "E8KwAvxRo",
:edit/time 1587645970462,
:edit/email "tangj1122@gmail.com"}],
:block/uid "t0vpJepjk",
:edit/time 1587645968956,
:edit/email "tangj1122@gmail.com"}],
:block/uid "K1_6Vhbvb",
:edit/time 1587645964714,
:edit/email "tangj1122@gmail.com"}
{:block/string "spec",
:create/email "tangj1122@gmail.com",
:create/time 1587645970458,
:block/children
[{:block/string "cljs.spec + expound",
:create/email "tangj1122@gmail.com",
:create/time 1587645973692,
:block/children
[{:block/string "cljs.spec + expound",
:create/email "tangj1122@gmail.com",
:create/time 1587645979392,
:block/uid "iuTA0MCxu",
:edit/time 1587646065857,
:edit/email "tangj1122@gmail.com"}],
:block/uid "TvQCvdD1E",
:edit/time 1587646064037,
:edit/email "tangj1122@gmail.com"}],
:block/uid "-H7cKoBhV",
:edit/time 1587645973376,
:edit/email "tangj1122@gmail.com"}
{:block/string "router",
:create/email "tangj1122@gmail.com",
:create/time 1587645291500,
:block/children
[{:block/string "secretary",
:create/email "tangj1122@gmail.com",
:create/time 1587645429378,
:block/children
[{:block/string "reitit",
:create/email "tangj1122@gmail.com",
:create/time 1587645416032,
:block/uid "QGGga1ywS",
:edit/time 1587645421039,
:edit/email "tangj1122@gmail.com"}],
:block/uid "iAeG45Ek7",
:edit/time 1587645467470,
:edit/email "tangj1122@gmail.com"}],
:block/uid "iEAHS7uhf",
:edit/time 1587645736446,
:edit/email "tangj1122@gmail.com"}
{:block/string "state management",
:create/email "tangj1122@gmail.com",
:create/time 1587645385652,
:block/children
[{:block/string "reagent + datascript + posh",
:create/email "tangj1122@gmail.com",
:create/time 1587645485291,
:block/children
[{:block/string "reagent + datascript + re-frame + re-posh",
:create/email "tangj1122@gmail.com",
:create/time 1587645515481,
:block/uid "bkL2Ulp_E",
:edit/time 1587646341051,
:edit/email "tangj1122@gmail.com"}],
:block/uid "CJ1DpQldQ",
:edit/time 1587646336985,
:edit/email "tangj1122@gmail.com"}],
:block/uid "vUXj99azM",
:edit/time 1587645510523,
:edit/email "tangj1122@gmail.com"}
{:block/string "**---backend---**",
:create/email "tangj1122@gmail.com",
:create/time 1587645812027,
:block/uid "jKq26U1ea",
:edit/time 1587645850927,
:edit/email "tangj1122@gmail.com"}
{:block/string "database",
:create/email "tangj1122@gmail.com",
:create/time 1587645327569,
:block/children
[{:block/string
"Most likely [datafire](https://github.com/filipesilva/datafire)",
:create/email "tangj1122@gmail.com",
:create/time 1587645563920,
:block/children
[{:block/string "Datomic",
:create/email "tangj1122@gmail.com",
:create/time 1587645565247,
:block/uid "1IO7Cvs2B",
:edit/time 1587647161901,
:edit/email "tangj1122@gmail.com"}],
:block/uid "sQ3YKndyx",
:edit/time 1588179366083,
:edit/email "tangj1122@gmail.com"}],
:block/uid "WQ-NriGtX",
:edit/time 1587645390863,
:edit/email "tangj1122@gmail.com"}
{:block/string "server",
:create/email "tangj1122@gmail.com",
:create/time 1587647187678,
:block/children
[{:block/string "Firebase",
:create/email "tangj1122@gmail.com",
:create/time 1587645663066,
:block/children
[{:block/string "aleph + sente + datsync",
:create/email "tangj1122@gmail.com",
:create/time 1587645669905,
:block/uid "2aMyaDZyq",
:edit/time 1587647239828,
:edit/email "tangj1122@gmail.com"}],
:block/uid "AIInQOOTj",
:edit/time 1587646180323,
:edit/email "tangj1122@gmail.com"}],
:block/uid "CtljIa9Mc",
:edit/time 1587647199187,
:edit/email "tangj1122@gmail.com"}],
:block/uid "mLYVMiBgH",
:edit/time 1587645291504,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Read [[How I reverse-engineered roamresearch.com]] to see how I got here",
:create/email "tangj1122@gmail.com",
:create/time 1587647315255,
:block/uid "KsQyWwUkZ",
:edit/time 1587649947587,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1587649882244,
:block/uid "f_4uHFSkD",
:edit/time 1587649882244,
:edit/email "tangj1122@gmail.com"}
{:block/string "Where the stacks differ",
:create/email "tangj1122@gmail.com",
:create/time 1587647927983,
:block/children
[{:block/string "routers: ((iAeG45Ek7)) vs ((QGGga1ywS))",
:create/email "tangj1122@gmail.com",
:create/time 1587650029450,
:block/children
[{:block/string
"The number one criteria, according to Eric Normand, is ((8F_qkxLS_))",
:create/email "tangj1122@gmail.com",
:create/time 1587650109937,
:block/uid "BGGeIlrwg",
:edit/time 1587650752819,
:edit/email "tangj1122@gmail.com"}
{:block/string "Normand goes on to say ((7cl7tozAQ))",
:create/email "tangj1122@gmail.com",
:create/time 1587650715370,
:block/uid "yUdH2j8Hw",
:edit/time 1587650762465,
:edit/email "tangj1122@gmail.com"}
{:block/string
"He recommends Reitit for production and Compojure for side projects.",
:create/email "tangj1122@gmail.com",
:create/time 1587650881446,
:block/children
[{:block/string "{{embed: ((ZB_FnflzV))}}",
:create/email "tangj1122@gmail.com",
:create/time 1587650763745,
:block/uid "oCX6dJX3c",
:edit/time 1587650860357,
:edit/email "tangj1122@gmail.com"}],
:block/uid "ymnxjkFIJ",
:edit/time 1587650894297,
:edit/email "tangj1122@gmail.com"}],
:block/uid "dOctcv5H0",
:edit/time 1587650117396,
:edit/email "tangj1122@gmail.com"}
{:block/string "state management: ((CJ1DpQldQ)) vs ((bkL2Ulp_E))",
:create/email "tangj1122@gmail.com",
:create/time 1587647332409,
:block/children
[{:block/string "{{diagram}}",
:block/props
{"diagram"
{"nodes"
{"Rq8x5hiWn"
{"width" 200,
"height" 48,
:block/uid "Rq8x5hiWn",
"x" -545.715600187429,
"y" -351.20615623417666},
"ICTsrnLd0"
{"width" 200,
"height" 48,
:block/uid "ICTsrnLd0",
"x" 0,
"y" 0},
"kxVvNKEAx"
{"width" 200,
"height" 48,
:block/uid "kxVvNKEAx",
"x" -713.5326108825248,
"y" 168.80332973518358},
"czErmQH_U"
{"width" 200,
"height" 48,
:block/uid "czErmQH_U",
"x" 62.69749298730039,
"y" -125.39498597460044},
"3ulk8jUlZ"
{"width" 200,
"height" 48,
:block/uid "3ulk8jUlZ",
"x" 0,
"y" 50},
"j-xw6ibT9"
{"width" 200,
"height" 48,
:block/uid "j-xw6ibT9",
"x" 971.2349014966983,
"y" -510.79618720429033},
"MaI8l5ZWm"
{"width" 200,
"height" 48,
:block/uid "MaI8l5ZWm",
"x" 380.33458920086457,
"y" -545.6787852808832},
"KUzLkkuIy"
{"width" 100,
"height" 40,
:block/uid "KUzLkkuIy",
"x" -209.71358602204742,
"y" 101.39985769370003},
"TKMcvlGCq"
{"width" 200,
"height" 48,
:block/uid "TKMcvlGCq",
"x" 177.78446529866858,
"y" -166.23866473769112},
"XfyX-a9_O"
{"width" 200,
"height" 48,
:block/uid "XfyX-a9_O",
"x" 203.89200789692865,
"y" 181.55073573432196},
"YhnE6HrC_"
{"width" 100,
"height" 40,
:block/uid "YhnE6HrC_",
"x" -230.79981673228292,
"y" 126.88060930443248},
"1SQ3o5DC6"
{"width" 200,
"height" 48,
:block/uid "1SQ3o5DC6",
"x" -519.7166833362282,
"y" -431.29246434998726},
"jp39tu4Zr"
{"width" 200,
"height" 48,
:block/uid "jp39tu4Zr",
"x" -303.7236300784555,
"y" -63.92918796005185},
"kghUY_kRP"
{"width" 100,
"height" 40,
:block/uid "kghUY_kRP",
"x" -456.29438752756613,
"y" 33.13917982031501},
"8RbivdY75"
{"width" 100,
"height" 40,
:block/uid "8RbivdY75",
"x" 305.5470268489575,
"y" 1.078785665235955},
"cU8c3GeGD"
{"width" 200,
"height" 48,
:block/uid "cU8c3GeGD",
"x" 250.09938262757146,
"y" -16.301150240593188},
"xfUrdGWrF"
{"width" 100,
"height" 40,
:block/uid "xfUrdGWrF",
"x" -47.06188537668308,
"y" 115.08660823468438},
"OLZZQe55q"
{"width" 100,
"height" 40,
:block/uid "OLZZQe55q",
"x" -40.45880631515189,
"y" 11.935021658615},
"sW6iAiVh-"
{"width" 200,
"height" 48,
:block/uid "sW6iAiVh-",
"x" -549.1893109326086,
"y" 274.5296465872616},
"8sR6VD7th"
{"width" 200,
"height" 48,
:block/uid "8sR6VD7th",
"x" 0,
"y" 0},
"HTDmtYyBK"
{"width" 200,
"height" 48,
:block/uid "HTDmtYyBK",
"x" -543.904761808758,
"y" 184.73312599056018},
"MoBelHztG"
{"width" 200,
"height" 48,
:block/uid "MoBelHztG",
"x" 854.0357828229637,
"y" 80.10184321782617},
"Xuf52vzqn"
{"width" 200,
"height" 48,
:block/uid "Xuf52vzqn",
"x" 164.3649014776695,
"y" -354.814764883213},
"tHomyGlzn"
{"width" 200,
"height" 48,
:block/uid "tHomyGlzn",
"x" -99.23418319517918,
"y" 183.40288073077423}},
"links"
{"uuid601b392f-4ca7-41fa-9e4c-416520a9a034"
#:block{:uid "fRzLRnVhE"},
"uuid8a5c4458-51df-4ed2-93fe-7e22d2d76176"
#:block{:uid "OLZZQe55q"},
"uuidfb3a5f06-136f-4caa-998c-258c582af38f"
#:block{:uid "xfUrdGWrF"},
"uuid0443a9a7-7ed7-46bc-9ddc-556aea96eb5f"
#:block{:uid "8RbivdY75"},
"uuid72000b3a-9415-4fcf-9c3f-ef656e60d56e"
#:block{:uid "8RbivdY75"},
"uuid98794f21-5e86-4773-ac6e-27c493ef824a"
#:block{:uid "KUzLkkuIy"},
"uuiddcea91ec-a140-4d0f-a477-1aed8eb01118"
#:block{:uid "xfUrdGWrF"}},
"groups"
{"uuideae83193-eb7e-4790-9c2f-14b8ee7f79fc"
{:block/uid "uuideae83193-eb7e-4790-9c2f-14b8ee7f79fc",
[:array :block/uid] [],
"x" 142.54036814604302,
"y" 109.07727161832923,
"width" 1.7254814671640588,
"height" 0}},
"selected" []}},
:create/email "tangj1122@gmail.com",
:create/time 1587652375607,
:block/children
[{:block/string "react",
:create/email "tangj1122@gmail.com",
:create/time 1587653111319,
:block/uid "kghUY_kRP",
:edit/time 1587653112922,
:edit/email "tangj1122@gmail.com"}
{:block/string "reagent",
:create/email "tangj1122@gmail.com",
:create/time 1587652917402,
:block/uid "KUzLkkuIy",
:edit/time 1587653152513,
:edit/email "tangj1122@gmail.com"}
{:block/string "datascript",
:create/email "tangj1122@gmail.com",
:create/time 1587652920048,
:block/uid "YhnE6HrC_",
:edit/time 1587652930005,
:edit/email "tangj1122@gmail.com"}
{:block/string "re-frame",
:create/email "tangj1122@gmail.com",
:create/time 1587652421116,
:block/uid "OLZZQe55q",
:edit/time 1587652543449,
:edit/email "tangj1122@gmail.com"}
{:block/string "posh",
:create/email "tangj1122@gmail.com",
:create/time 1587652935382,
:block/uid "xfUrdGWrF",
:edit/time 1587652969763,
:edit/email "tangj1122@gmail.com"}
{:block/string "re-posh",
:create/email "tangj1122@gmail.com",
:create/time 1587652930842,
:block/uid "8RbivdY75",
:edit/time 1587652934045,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/time 1587829812037,
:block/uid "MaI8l5ZWm",
:edit/time 1587829812037}
{:block/string "",
:create/email "palash.karia@gmail.com",
:create/time 1587872112645,
:block/uid "Xuf52vzqn",
:edit/time 1587872112645,
:edit/email "palash.karia@gmail.com"}
{:block/string "",
:create/email "dmrdohan@gmail.com",
:create/time 1587952200299,
:block/uid "XfyX-a9_O",
:edit/time 1587952200299,
:edit/email "dmrdohan@gmail.com"}
{:block/string "",
:create/time 1588244583171,
:block/uid "TKMcvlGCq",
:edit/time 1588244583171}
{:block/string "",
:create/time 1588244583581,
:block/uid "tHomyGlzn",
:edit/time 1588244583581}
{:block/string "",
:create/email "mqlrod@e.email",
:create/time 1588267915485,
:block/uid "czErmQH_U",
:edit/time 1588267915485,
:edit/email "mqlrod@e.email"}
{:block/string "",
:create/email "mqlrod@e.email",
:create/time 1588267916187,
:block/uid "HTDmtYyBK",
:edit/time 1588267916187,
:edit/email "mqlrod@e.email"}
{:block/string "",
:create/time 1588377689538,
:block/uid "jp39tu4Zr",
:edit/time 1588377689538}
{:block/string "",
:create/email "kad1an@outlook.com",
:create/time 1588779464660,
:block/uid "ICTsrnLd0",
:edit/time 1588779464660,
:edit/email "kad1an@outlook.com"}
{:block/string "",
:create/time 1588812033018,
:block/uid "3ulk8jUlZ",
:edit/time 1588812033018}
{:block/string "",
:create/time 1588812033686,
:block/uid "kxVvNKEAx",
:edit/time 1588812033686}
{:block/string "",
:create/email "roamresearch@jan.vlnas.cz",
:create/time 1588837063654,
:block/uid "1SQ3o5DC6",
:edit/time 1588837063654,
:edit/email "roamresearch@jan.vlnas.cz"}
{:block/string "",
:create/email "ian@egghead.io",
:create/time 1588897740161,
:block/uid "cU8c3GeGD",
:edit/time 1588897740161,
:edit/email "ian@egghead.io"}
{:block/string "",
:create/email "ian@egghead.io",
:create/time 1588897740660,
:block/uid "MoBelHztG",
:edit/time 1588897740660,
:edit/email "ian@egghead.io"}
{:block/string "",
:create/email "chris.duncan.arauz+roam@protonmail.com",
:create/time 1588900627161,
:block/uid "j-xw6ibT9",
:edit/time 1588900627161,
:edit/email "chris.duncan.arauz+roam@protonmail.com"}
{:block/string "",
:create/time 1588907313572,
:block/uid "sW6iAiVh-",
:edit/time 1588907313572}
{:block/string "",
:create/time 1588913748129,
:block/uid "8sR6VD7th",
:edit/time 1588913748129}
{:block/string "",
:create/time 1588918890234,
:block/uid "Rq8x5hiWn",
:edit/time 1588918890233}],
:block/uid "3qHs9ZqyJ",
:edit/time 1587652421118,
:edit/email "tangj1122@gmail.com"}
{:block/string "`reagent` is a CLJS wrapper around `react`.",
:create/email "tangj1122@gmail.com",
:create/time 1587650964286,
:block/uid "GYrmwW9Aw",
:edit/time 1587653448919,
:edit/email "tangj1122@gmail.com"}
{:block/string
"`re-frame` is essentially CLJS's `react-redux` (but a lot better).",
:create/email "tangj1122@gmail.com",
:create/time 1587651019197,
:block/uid "6lF6_316p",
:edit/time 1587652306619,
:edit/email "tangj1122@gmail.com"}
{:block/string "((C9ix_e9Xs))",
:create/email "tangj1122@gmail.com",
:create/time 1587651010549,
:block/uid "y6Bn1wwuf",
:edit/time 1587651019200,
:edit/email "tangj1122@gmail.com"}
{:block/string
"`posh` lets you work with `datascript` and `reagent`, i.e. if your store updates, only the relevant UI components also update, the `react` way.",
:create/email "tangj1122@gmail.com",
:create/time 1587651095813,
:block/uid "ysTlSOSsW",
:edit/time 1587652201096,
:edit/email "tangj1122@gmail.com"}
{:block/string
"`re-posh` lets you work with `datascript` and `re-frame`. It is a pretty lightweight wrapper that just adds a few functions to `re-frame`.",
:create/email "tangj1122@gmail.com",
:create/time 1587651145321,
:block/uid "kGirdq5F9",
:edit/time 1587653307950,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Ultimately, I chose `re-frame` over vanilla `reagent` because I believe a global store is eventually needed for larger applications. I chose `re-frame` over other global stores primarily because it is spiritually similar to [redux](https://github.com/day8/re-frame#why-should-you-care), which I'm already familiar with.",
:create/email "tangj1122@gmail.com",
:create/time 1587651159986,
:block/uid "t4oM0lyW0",
:edit/time 1587654893727,
:edit/email "tangj1122@gmail.com"}
{:block/string "Other frameworks and libraries I looked at:",
:create/email "tangj1122@gmail.com",
:create/time 1587654907924,
:block/children
[{:block/string
"[Om](https://github.com/omcljs/om) is no longer being actively developed, and recommends `fulcro`.",
:create/email "tangj1122@gmail.com",
:create/time 1587654637971,
:block/uid "V9LvaDd7h",
:edit/time 1587654637971,
:edit/email "tangj1122@gmail.com"}
{:block/string
"[Fulcro](https://github.com/fulcrologic/fulcro) is a fullstack framework.",
:create/email "tangj1122@gmail.com",
:create/time 1587654641243,
:block/uid "ztFAIXyD_",
:edit/time 1587654727909,
:edit/email "tangj1122@gmail.com"}
{:block/string
"[Rum](https://github.com/tonsky/rum), brought to you by [[Tonsky]] the author of `datascript`, \"is arguably smaller, simpler and more straightforward than React itself\" and is unopinonated about state management. Could be worth taking a deeper look at!",
:create/email "tangj1122@gmail.com",
:create/time 1587654409376,
:block/uid "YGt8Uzfvz",
:edit/time 1587655189791,
:edit/email "tangj1122@gmail.com"}
{:block/string
"[[Conaw]] told me to also checkout [Helix](https://github.com/Lokeh/helix), which makes use of React Hooks.",
:create/email "tangj1122@gmail.com",
:create/time 1587654532802,
:block/uid "e1brWX7_C",
:edit/time 1587655242991,
:edit/email "tangj1122@gmail.com"}],
:block/uid "FFH0hShcG",
:edit/time 1587654916718,
:edit/email "tangj1122@gmail.com"}],
:block/uid "r_kxFHGpX",
:edit/time 1587650121875,
:edit/email "tangj1122@gmail.com"}
{:block/string "database: ((sQ3YKndyx)) vs ((1IO7Cvs2B))",
:create/email "tangj1122@gmail.com",
:create/time 1587647305645,
:block/children
[{:block/string
"Firebase has two database options: [Firestore and the Realtime DB](https://firebase.google.com/docs/database/rtdb-vs-firestore). Originally, I thought that Roam used the Realtime DB.",
:create/email "tangj1122@gmail.com",
:create/time 1587655732603,
:block/children
[{:block/string "{{embed: ((uyF67kQKU))}}",
:create/email "tangj1122@gmail.com",
:create/time 1587656206706,
:block/uid "zgi1ImdAz",
:edit/time 1587656222520,
:edit/email "tangj1122@gmail.com"}],
:block/uid "NdNhojy_t",
:edit/time 1587655732603,
:edit/email "tangj1122@gmail.com"}
{:block/string
"But from the minified files we can see that Roam uses both Firestore and the Realtime DB.",
:create/email "tangj1122@gmail.com",
:create/time 1587655337068,
:block/children
[{:block/string "{{embed: ((((-bwTE3DQz))))}}",
:create/email "tangj1122@gmail.com",
:create/time 1587655576275,
:block/uid "cAWE7Y3KR",
:edit/time 1587655638007,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1587655638005,
:block/uid "HjUvyQzn9",
:edit/time 1587655638005,
:edit/email "tangj1122@gmail.com"}],
:block/uid "p2E09B-RA",
:edit/time 1587656232031,
:edit/email "tangj1122@gmail.com"}],
:block/uid "j5dhnNH6r",
:edit/time 1587650130375,
:edit/email "tangj1122@gmail.com"}
{:block/string "server: ((AIInQOOTj)) vs ((2aMyaDZyq))",
:create/email "tangj1122@gmail.com",
:create/time 1587650088595,
:block/children
[{:block/string
"{{[[TODO]]}} Still need to do a lot more research on database and server, but Datomic does have an open-source license, there are Docker images for easy setup, and you can use ",
:create/email "tangj1122@gmail.com",
:create/time 1587656512209,
:block/uid "dv9U8BZ_v",
:edit/time 1587656717762,
:edit/email "tangj1122@gmail.com"}
{:block/string "Aleph is a Clojure web server.",
:create/email "tangj1122@gmail.com",
:create/time 1587656846467,
:block/uid "JDkMx8jqp",
:edit/time 1588119181578,
:edit/email "tangj1122@gmail.com"}
{:block/string "Sente is a websocket library.",
:create/email "tangj1122@gmail.com",
:create/time 1587656855737,
:block/uid "YXwnlFybi",
:edit/time 1587656859881,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Datsync synchronizes `datomic` with `datascript`.",
:create/email "tangj1122@gmail.com",
:create/time 1587656859878,
:block/uid "GfsUYGkMo",
:edit/time 1587656897418,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Another option to consider is [datahike](https://github.com/replikativ/datahike)!",
:create/email "tangj1122@gmail.com",
:create/time 1588119185617,
:block/uid "chvBYQumB",
:edit/time 1588119201976,
:edit/email "tangj1122@gmail.com"}],
:block/uid "3o0R3-pUv",
:edit/time 1587650133662,
:edit/email "tangj1122@gmail.com"}],
:block/uid "c_ExPHGHi",
:edit/time 1587651938162,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1587641045992,
:edit/email "tangj1122@gmail.com"}
{:node/title "April 23rd, 2020",
:block/children
[{:block/string "[[Athens Change Log]]",
:create/email "tangj1122@gmail.com",
:create/time 1587644596728,
:block/children
[{:block/string "first draft: [[Athens vs Roam Tech Stack]]",
:create/email "tangj1122@gmail.com",
:create/time 1587644605508,
:block/uid "7whMgG1Kq",
:edit/time 1587694676574,
:edit/email "tangj1122@gmail.com"}
{:block/string
"first draft: [[How I reverse-engineered roamresearch.com]]",
:create/email "tangj1122@gmail.com",
:create/time 1587649768183,
:block/uid "hLA-uePKF",
:edit/time 1587694680120,
:edit/email "tangj1122@gmail.com"}],
:block/uid "GcrTwKzyj",
:edit/time 1587644605511,
:edit/email "tangj1122@gmail.com"}
{:block/string "[[Day of Datomic Cloud 2018]]",
:create/email "tangj1122@gmail.com",
:create/time 1587665098331,
:block/uid "cUBaYtEbE",
:edit/time 1587677293367,
:edit/email "tangj1122@gmail.com"}
{:block/string "[[Day of Datomic On-Prem 2016]]",
:create/email "tangj1122@gmail.com",
:create/time 1587677290371,
:block/uid "RCTRAAEZU",
:edit/time 1587677301394,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1587644596113,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587647276708,
:node/title "ClojureScript",
:edit/time 1587647276711,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587649219458,
:node/title "How I reverse-engineered roamresearch.com",
:block/children
[{:block/string "type:: [[documentation]]",
:create/email "tangj1122@gmail.com",
:create/time 1587649245971,
:block/uid "wRL4LYuzv",
:edit/time 1587923020716,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1587655950417,
:block/uid "hvgYxpBdo",
:edit/time 1587655957410,
:edit/email "tangj1122@gmail.com"}
{:block/string
"![](https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2FanyTU0HZD6?alt=media&token=d4b97366-79fe-4c8d-ae8b-e16a20a2418c)",
:create/email "tangj1122@gmail.com",
:create/time 1587641345327,
:block/uid "TEss-LBRt",
:edit/time 1587641489912,
:edit/email "tangj1122@gmail.com"}
{:block/string
"If you open `Chrome DevTools > Sources`, you can inspect some of the `HTML/CSS/JS` for the Roam website. We are mainly interested in:",
:create/email "tangj1122@gmail.com",
:create/time 1587641315449,
:block/children
[{:block/string
"`js/compiled/main.js`: https://roamresearch.com/js/compiled/main.js",
:create/email "tangj1122@gmail.com",
:create/time 1587641340952,
:block/uid "MZEbME2k0",
:edit/time 1587642375135,
:edit/email "tangj1122@gmail.com"}
{:block/string
"`(no domain)/js/compiled/route-app.js`: https://roamresearch.com/js/compiled/route-app.js",
:create/email "tangj1122@gmail.com",
:create/time 1587641049921,
:block/uid "_mn_Yvoy7",
:edit/time 1587642365131,
:edit/email "tangj1122@gmail.com"}],
:block/uid "e7Qk2chs_",
:edit/time 1587642959851,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Most modern web applications use compilers/transpilers like Babel and bundlers like Webpack to distribute and minify their code.",
:create/email "tangj1122@gmail.com",
:create/time 1587642997220,
:block/children
[{:block/string
"Compilers are necessary to convert a non-JS frontend language like ClojureScript, CoffeeScript, or TypeScript to Javascript.",
:create/email "tangj1122@gmail.com",
:create/time 1587643002078,
:block/uid "6BC0DNY7k",
:edit/time 1587643180003,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Transpilers are necessary if using newer ECMAScript features that are not yet fully supported by all browsers, such as `let` or `import`. Check out this [compatability table](https://kangax.github.io/compat-table/es6/) to see what I mean.",
:create/email "tangj1122@gmail.com",
:create/time 1587643070434,
:block/uid "CpmhUBGdL",
:edit/time 1587643352148,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Bundlers like Webpack use these transpilers and additionally provide other services like code size optimization through **minification** and **hot module replacement** for quick reloads of the code during development.",
:create/email "tangj1122@gmail.com",
:create/time 1587642639864,
:block/uid "Idt1v5WdY",
:edit/time 1587643755135,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Compiling and minification are handled for us in [[ClojureScript]] by default with the [Google Closure Compiler](https://clojurescript.org/reference/google-closure-library). HMR, on the other hand, can be handled a few ways, such as with `figwheel-main` `lein-figwheel` or `shadow-cljs`.",
:create/email "tangj1122@gmail.com",
:create/time 1587643777427,
:block/uid "yhoWhoHK5",
:edit/time 1587647276706,
:edit/email "tangj1122@gmail.com"}],
:block/uid "Qx4cgbbDP",
:edit/time 1587648631580,
:edit/email "tangj1122@gmail.com"}
{:block/string
"You can save these files, prettify them, and read the minified code to partially reverse-engineer the Roam website. I've copied some interesting bits below. You can find the entirety of the prettified files at this [Github gist](https://gist.github.com/tangjeff0/07bbb2dbe260b483fffed746bdd2d717). You should probably download them as a zip as they have 110k and 80k lines of code.",
:create/email "tangj1122@gmail.com",
:create/time 1587641491269,
:block/uid "sF9bt48BO",
:edit/time 1587648470114,
:edit/email "tangj1122@gmail.com"}
{:block/string "`main.js` dependencies -- lines 46425 - 46450",
:create/email "tangj1122@gmail.com",
:create/time 1587645251732,
:block/children
[{:block/string
"```var ca = \"cljs.core\",\n ea = \"cljs.spec.alpha\",\n fa = \"cljs.spec.gen.alpha\",\n ia = \"cljs.test\",\n ja = \"clojure.string\",\n ka = \"datascript.pull-api\", // <--- datascript\n la = \"expound.alpha\",\n ma = \"expound.paths\",\n na = \"expound.printer\",\n oa = \"reagent.ratom\", // <--- reagent\n pa = \"relemma.core\",\n qa = \"relemma.fire.core\",\n ra = \"relemma.fire.link.core\",\n sa = \"relemma.fire.link.local-store\",\n ua = \"relemma.fire.link.migrations\",\n va = \"relemma.fire.link.utils\",\n wa = \"relemma.fire.router\",\n xa = \"relemma.router\",\n ya = \"relemma.routes.app.events\",\n Aa = \"relemma.shared.logic.datascript.reactive\",\n Ba = \"relemma.shared.logic.sentry\",\n Ca = \"relemma.shared.specs\",\n Da = \"secretary.core\", // <--- router\n k,\n Ea = Ea || {},\n Fa = this || self;```",
:create/email "tangj1122@gmail.com",
:create/time 1587646583912,
:block/uid "pD6VwsL4X",
:edit/time 1588260464481,
:edit/email "paulius870@gmail.com"}],
:block/uid "AVi5uiLDm",
:edit/time 1587648356594,
:edit/email "tangj1122@gmail.com"}
{:block/string
"`main.js` Firebase dependencies -- lines 9279 - 9294",
:create/email "tangj1122@gmail.com",
:create/time 1587646919915,
:block/children
[{:block/string
"```c =\n ((n = {}),\n (n[\"@firebase/app\"] = \"fire-core\"),\n (n[\"@firebase/analytics\"] = \"fire-analytics\"),\n (n[\"@firebase/auth\"] = \"fire-auth\"),\n (n[\"@firebase/database\"] = \"fire-rtdb\"), // <-- Realtime DB\n (n[\"@firebase/functions\"] = \"fire-fn\"),\n (n[\"@firebase/installations\"] = \"fire-iid\"),\n (n[\"@firebase/messaging\"] = \"fire-fcm\"),\n (n[\"@firebase/performance\"] = \"fire-perf\"),\n (n[\"@firebase/remote-config\"] = \"fire-rc\"),\n (n[\"@firebase/storage\"] = \"fire-gcs\"),\n (n[\"@firebase/firestore\"] = \"fire-fst\"), // <--- Firestore\n (n[\"fire-js\"] = \"fire-js\"),\n (n[\"firebase-wrapper\"] = \"fire-js-all\"),\n n),base-wrapper\"] = \"fire-js-all\"),\n n),```",
:create/email "tangj1122@gmail.com",
:create/time 1587646928916,
:block/uid "yOmm8QnAn",
:edit/time 1588801879455,
:edit/email "neonstudios14@gmail.com"}],
:block/uid "-bwTE3DQz",
:edit/time 1587648347058,
:edit/email "tangj1122@gmail.com"}
{:block/string "`route-app.js` dependencies -- lines 6967 - 6993",
:create/email "tangj1122@gmail.com",
:create/time 1587646726406,
:block/children
[{:block/string
"```var FP = \"cljs.tools.reader\",\n FEa = \"instaparse.gll\", // <--- instaparse\n GP = \"relemma.fire.queue\",\n HP = \"relemma.routes.app.components.attrs.table\",\n IP = \"relemma.routes.app.components.import\",\n JP = \"relemma.routes.app.components.log\",\n KP = \"relemma.routes.app.components.mentions\",\n LP = \"relemma.routes.app.components.multiselect\",\n MP = \"relemma.routes.app.components.multiselect.events\",\n NP = \"relemma.routes.app.components.multiselect.util\",\n GEa = \"relemma.routes.app.components.outline.block.image\",\n OP = \"relemma.routes.app.components.outline.block.input\",\n HEa = \"relemma.routes.app.components.outline.block.main\",\n PP = \"relemma.routes.app.components.outline.controls\",\n QP = \"relemma.routes.app.components.outline.filters\",\n RP = \"relemma.routes.app.components.outline.main\",\n SP = \"relemma.routes.app.components.parse.markdown\",\n TP = \"relemma.routes.app.components.parser.diagram\",\n UP = \"relemma.routes.app.components.parser.xparser\",\n IEa = \"relemma.routes.app.components.right-sidebar.events\",\n JEa = \"relemma.routes.app.components.title\",\n VP = \"relemma.routes.app.logic.attr.util\",\n KEa = \"relemma.routes.app.logic.parse.util\",\n WP = \"relemma.routes.app.logic.paste\",\n XP = \"relemma.routes.app.page\",\n YP = \"relemma.shared.components.svg\",\n LEa = [];```",
:create/email "tangj1122@gmail.com",
:create/time 1587646825439,
:block/uid "X8rK8Ulw4",
:edit/time 1587646869579,
:edit/email "tangj1122@gmail.com"}],
:block/uid "GmDi-Wo41",
:edit/time 1587648349870,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Note that these sections do not contain the exhaustive list of dependencies. Sometimes I guessed and `grep`'d or `ctrl-f`'d for a library. For instance, `posh` is not found in any of these sections, but it was very likely they would be using it, and, indeed, there are references to `posh` elsewhere in `main.js`.",
:create/email "tangj1122@gmail.com",
:create/time 1587648280086,
:block/uid "mYRwbEQ-C",
:edit/time 1587649446591,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Another thing I did was search for the `core` pattern, since it's conventional in Clojure(script) to define your main namespace as `your-namespace.core`.",
:create/email "tangj1122@gmail.com",
:create/time 1587648800805,
:block/uid "G18zxKzrD",
:edit/time 1587649053886,
:edit/email "tangj1122@gmail.com"}
{:block/string
"This is my first time actually trying to read minified code. I'm sure there are other techniques I don't know about.",
:create/email "tangj1122@gmail.com",
:create/time 1587649739493,
:block/uid "v8NKAPcg8",
:edit/time 1587649739493,
:edit/email "tangj1122@gmail.com"}
{:block/string
"But I think this is a good start. Dependencies are higher leverage than implementation logic.",
:create/email "tangj1122@gmail.com",
:create/time 1587649638542,
:block/uid "pbJ4Ckp7O",
:edit/time 1587649739495,
:edit/email "tangj1122@gmail.com"}
{:block/string
"I'm not sure how valuable it would be to look at the JS logic itself since it's getting compiled from CLJS anyways. Also, minified JS is wack.",
:create/email "tangj1122@gmail.com",
:create/time 1587649496694,
:block/uid "CVPdD0BiF",
:edit/time 1587649835777,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1587655944106,
:block/uid "SutXbGujz",
:edit/time 1587655944106,
:edit/email "tangj1122@gmail.com"}
{:block/string "Networking Tab",
:create/email "tangj1122@gmail.com",
:create/time 1587655943929,
:block/children
[{:block/string
"For those wondering why it takes so long for Roam to load, it is because Roam sends your entire DB as a JSON through websockets.",
:create/email "tangj1122@gmail.com",
:create/time 1587656016951,
:block/uid "TxKloCB2p",
:edit/time 1587656066689,
:edit/email "tangj1122@gmail.com"}
{:block/string
"This is also the reason why queries are instantaneous.",
:create/email "tangj1122@gmail.com",
:create/time 1587656067260,
:block/uid "pVtrZP2SN",
:edit/time 1587656120612,
:edit/email "tangj1122@gmail.com"}
{:block/string
"![](https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2FtUDcxFx7nN?alt=media&token=69aa0186-5afb-4b7d-8628-b1d7302085c0)",
:block/props
{"image-size"
{"https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2FtUDcxFx7nN?alt=media&token=69aa0186-5afb-4b7d-8628-b1d7302085c0"
{"width" 580, "height" nil}}},
:create/email "tangj1122@gmail.com",
:create/time 1587655963325,
:block/uid "Z2Hbt4STN",
:edit/time 1587655967626,
:edit/email "tangj1122@gmail.com"}],
:block/uid "uyF67kQKU",
:edit/time 1587655963329,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1587649219460,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587650261458,
:node/title "Clojure Routers - PurelyFunctional.tv",
:block/children
[{:block/string "type:: notes",
:create/email "tangj1122@gmail.com",
:create/time 1587650263577,
:block/uid "Uq-IZCef9",
:edit/time 1587650266392,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1587650266390,
:block/uid "N1tdBnFt2",
:edit/time 1587650266390,
:edit/email "tangj1122@gmail.com"}
{:block/string
"source:: https://purelyfunctional.tv/mini-guide/clojure-routers/",
:create/email "tangj1122@gmail.com",
:create/time 1587650339357,
:block/uid "QPqpi5VQ_",
:edit/time 1587650341723,
:edit/email "tangj1122@gmail.com"}
{:block/string "Contents",
:create/email "tangj1122@gmail.com",
:create/time 1587650330223,
:block/children
[{:block/string "Criteria",
:create/email "tangj1122@gmail.com",
:create/time 1587650315641,
:block/children
[{:block/string "1. Does it work in Clojure and ClojureScript?",
:create/email "tangj1122@gmail.com",
:create/time 1587650313804,
:block/uid "8F_qkxLS_",
:edit/time 1587650313820,
:edit/email "tangj1122@gmail.com"}
{:block/string "2. How are routes defined?",
:create/email "tangj1122@gmail.com",
:create/time 1587650313804,
:block/uid "-5T3B260e",
:edit/time 1587650313820,
:edit/email "tangj1122@gmail.com"}
{:block/string "3. What format are the routes defined in?",
:create/email "tangj1122@gmail.com",
:create/time 1587650313804,
:block/uid "F_4W9wA4c",
:edit/time 1587650313820,
:edit/email "tangj1122@gmail.com"}
{:block/string "4. Is it bidirectional?",
:create/email "tangj1122@gmail.com",
:create/time 1587650313804,
:block/uid "O5rqJi3zQ",
:edit/time 1587650313820,
:edit/email "tangj1122@gmail.com"}
{:block/string "5. Does it do more than routing?",
:create/email "tangj1122@gmail.com",
:create/time 1587650313804,
:block/uid "7qUSIBoCG",
:edit/time 1587650313820,
:edit/email "tangj1122@gmail.com"}],
:block/uid "jJUXl9SU0",
:edit/time 1587650329530,
:edit/email "tangj1122@gmail.com"}
{:block/string
"These are **my two top picks** for routers as of September 2019. I had to pick two because both of them are good for different purposes.",
:create/email "tangj1122@gmail.com",
:create/time 1587650441918,
:block/children
[{:block/string
"**Reitit** is great for a high-performance, industrial-strength, full-control router—the kind of thing you could build a company on.",
:create/email "tangj1122@gmail.com",
:create/time 1587650445338,
:block/uid "aEpZuMuKb",
:edit/time 1587650445338,
:edit/email "tangj1122@gmail.com"}
{:block/string
"**Compojure** is great, too, but it’s more for convenience than anything else. If you want something for a side project that you don’t think will get much traffic, Compojure will suit you well.",
:create/email "tangj1122@gmail.com",
:create/time 1587650373547,
:block/uid "MQ5pcZCXh",
:edit/time 1587650445341,
:edit/email "tangj1122@gmail.com"}],
:block/uid "ZB_FnflzV",
:edit/time 1587650480661,
:edit/email "tangj1122@gmail.com"}
{:block/string "Also acceptable",
:create/email "tangj1122@gmail.com",
:create/time 1587650452358,
:block/children
[{:block/string "bidi",
:create/email "tangj1122@gmail.com",
:create/time 1587650452358,
:block/uid "qlvdGX1S8",
:edit/time 1587650452365,
:edit/email "tangj1122@gmail.com"}
{:block/string "Pedestal (GitHub)",
:create/email "tangj1122@gmail.com",
:create/time 1587650452358,
:block/uid "O_5GL6c9W",
:edit/time 1587650452365,
:edit/email "tangj1122@gmail.com"}
{:block/string "ataraxy",
:create/email "tangj1122@gmail.com",
:create/time 1587650452358,
:block/uid "-4s0nNR6r",
:edit/time 1587650452365,
:edit/email "tangj1122@gmail.com"}
{:block/string "Calfpath",
:create/email "tangj1122@gmail.com",
:create/time 1587650452358,
:block/uid "RNbIm1Z3c",
:edit/time 1587650452365,
:edit/email "tangj1122@gmail.com"}],
:block/uid "zezUBiYK9",
:edit/time 1587650452365,
:edit/email "tangj1122@gmail.com"}
{:block/string "Not recommended",
:create/email "tangj1122@gmail.com",
:create/time 1587650452358,
:block/children
[{:block/string "Clout",
:create/email "tangj1122@gmail.com",
:create/time 1587650452358,
:block/uid "CbLUQeb5m",
:edit/time 1587650452365,
:edit/email "tangj1122@gmail.com"}
{:block/string "Secretary",
:create/email "tangj1122@gmail.com",
:create/time 1587650452358,
:block/children
[{:block/string
"Secretary was an early ClojureScript-only router. Stick with one of the Clojure+ClojureScript ones instead of this one.",
:create/email "tangj1122@gmail.com",
:create/time 1587650452358,
:block/uid "7cl7tozAQ",
:edit/time 1587650452366,
:edit/email "tangj1122@gmail.com"}],
:block/uid "_AedDy_-b",
:edit/time 1587650452365,
:edit/email "tangj1122@gmail.com"}
{:block/string "bide",
:create/email "tangj1122@gmail.com",
:create/time 1587650452358,
:block/uid "mwokNwWwy",
:edit/time 1587650452366,
:edit/email "tangj1122@gmail.com"}
{:block/string "Sibiro",
:create/email "tangj1122@gmail.com",
:create/time 1587650452358,
:block/uid "LQQMokDm6",
:edit/time 1587650452366,
:edit/email "tangj1122@gmail.com"}
{:block/string "Moustache",
:create/email "tangj1122@gmail.com",
:create/time 1587650452358,
:block/uid "cYL5Ojp4b",
:edit/time 1587650452366,
:edit/email "tangj1122@gmail.com"}
{:block/string "Route One",
:create/email "tangj1122@gmail.com",
:create/time 1587650452358,
:block/uid "uWotukett",
:edit/time 1587650452366,
:edit/email "tangj1122@gmail.com"}
{:block/string "Trout",
:create/email "tangj1122@gmail.com",
:create/time 1587650452358,
:block/uid "AtiO-bZN7",
:edit/time 1587650452366,
:edit/email "tangj1122@gmail.com"}
{:block/string "gudu",
:create/email "tangj1122@gmail.com",
:create/time 1587650452358,
:block/uid "L3tHMcAQq",
:edit/time 1587650452366,
:edit/email "tangj1122@gmail.com"}
{:block/string "Silk",
:create/email "tangj1122@gmail.com",
:create/time 1587650452358,
:block/uid "wxKFKojVp",
:edit/time 1587650452366,
:edit/email "tangj1122@gmail.com"}
{:block/string "clj-routing",
:create/email "tangj1122@gmail.com",
:create/time 1587650452358,
:block/uid "gniD_u9v9",
:edit/time 1587650452366,
:edit/email "tangj1122@gmail.com"}
{:block/string "routes-clj",
:create/email "tangj1122@gmail.com",
:create/time 1587650452358,
:block/uid "yyGCJwWiR",
:edit/time 1587650452366,
:edit/email "tangj1122@gmail.com"}],
:block/uid "v5yAAIfV4",
:edit/time 1587650452365,
:edit/email "tangj1122@gmail.com"}],
:block/uid "fzWCORF3S",
:edit/time 1587650333107,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1587650261460,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587655189793,
:node/title "Tonsky",
:edit/time 1587655189796,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587655218315,
:node/title "Conaw",
:edit/time 1587655218316,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587665305107,
:node/title "Day of Datomic Cloud 2018",
:block/children
[{:block/string "type:: notes",
:create/email "tangj1122@gmail.com",
:create/time 1587665306954,
:block/uid "EcsMhu1an",
:edit/time 1587665308762,
:edit/email "tangj1122@gmail.com"}
{:block/string
"source:: https://www.youtube.com/playlist?list=PLjyLzdfdsKwqF9I1XSX_Y4TXAo8pYXbOv",
:create/email "tangj1122@gmail.com",
:create/time 1587665308759,
:block/uid "G9nlk0jZg",
:edit/time 1587676053285,
:edit/email "tangj1122@gmail.com"}
{:block/string
"source:: https://github.com/cognitect-labs/day-of-datomic-cloud",
:create/email "tangj1122@gmail.com",
:create/time 1587665319414,
:block/uid "urhKkYkXO",
:edit/time 1587676060204,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1587676060679,
:block/uid "CVyYh1jeL",
:edit/time 1587676060679,
:edit/email "tangj1122@gmail.com"}
{:block/string "Content",
:create/email "tangj1122@gmail.com",
:create/time 1587665319148,
:block/children
[{:block/string "Intro",
:create/email "tangj1122@gmail.com",
:create/time 1587665361740,
:block/children
[{:block/string "Information Model",
:create/email "tangj1122@gmail.com",
:create/time 1587665341586,
:block/children
[{:block/string "transactional",
:create/email "tangj1122@gmail.com",
:create/time 1587665366103,
:block/children
[{:block/string
"What is a database? Why do we need it? We need to be able store and retrieve information.",
:create/email "tangj1122@gmail.com",
:create/time 1587665599262,
:block/uid "yvqGgW8Ir",
:edit/time 1587665618927,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Is a hard disk a database? Is a file a database? You can store and retrieve data from both of these, but we generally do not think about them as a database.",
:create/email "tangj1122@gmail.com",
:create/time 1587665545285,
:block/uid "ZFk5VlkpL",
:edit/time 1587665651953,
:edit/email "tangj1122@gmail.com"}
{:block/string
"There used to be a consensus on how we store data: SQL.",
:create/email "tangj1122@gmail.com",
:create/time 1587665589362,
:block/children
[{:block/string "SQL has [[ACID]] properties.",
:create/email "tangj1122@gmail.com",
:create/time 1587665700349,
:block/children
[{:block/string
"Atomic: batches of transactions happen atomically, i.e. bank account transfers must all execute at the same time between the accounts.",
:create/email "tangj1122@gmail.com",
:create/time 1587665733631,
:block/uid "jcRirT5SK",
:edit/time 1587665776486,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Consistent: participants of the system should be able to the same order.",
:create/email "tangj1122@gmail.com",
:create/time 1587665780444,
:block/uid "7EqGOUSIk",
:edit/time 1587665801223,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Isolated: you should not be able to see other processes.",
:create/email "tangj1122@gmail.com",
:create/time 1587665802068,
:block/uid "L7e-14epM",
:edit/time 1587665826463,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Durable: once you put data in the database, you can get it back.",
:create/email "tangj1122@gmail.com",
:create/time 1587665811834,
:block/uid "yGBcJEuxM",
:edit/time 1587665818771,
:edit/email "tangj1122@gmail.com"}],
:block/uid "6c30UK4z5",
:edit/time 1587665708138,
:edit/email "tangj1122@gmail.com"}
{:block/string
"By the ACID definition, we see that a file is not a database.",
:create/email "tangj1122@gmail.com",
:create/time 1587665850868,
:block/uid "CVarwVzwr",
:edit/time 1587665899648,
:edit/email "tangj1122@gmail.com"}],
:block/uid "Vq3zUY2SZ",
:edit/time 1587665849380,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Transaction make it a lot easier to reason about databases.",
:create/email "tangj1122@gmail.com",
:create/time 1587665399903,
:block/uid "95pffbbeT",
:edit/time 1587665925331,
:edit/email "tangj1122@gmail.com"}
{:block/string "But what about data retrieval?",
:create/email "tangj1122@gmail.com",
:create/time 1587665925327,
:block/uid "M3nhtsmfT",
:edit/time 1587665961658,
:edit/email "tangj1122@gmail.com"}],
:block/uid "2lAfLeXrg",
:edit/time 1587665368861,
:edit/email "tangj1122@gmail.com"}
{:block/string "logical",
:create/email "tangj1122@gmail.com",
:create/time 1587665368851,
:block/children
[{:block/string
"If you retrieved data with a nested for-loop, you wouldn't call it database access. This is imperative, not declarative, rigid, and error-prone.",
:create/email "tangj1122@gmail.com",
:create/time 1587665410474,
:block/uid "xbwGQ7AEB",
:edit/time 1587666146791,
:edit/email "tangj1122@gmail.com"}
{:block/string
"SQL is [[logic programming]]. You don't specify how you retrieve data, you just get it. We take the burden of optimization and tuning off developers and put it on the database.",
:create/email "tangj1122@gmail.com",
:create/time 1587666071474,
:block/uid "p1ibFanS2",
:edit/time 1587666106414,
:edit/email "tangj1122@gmail.com"}
{:block/string "Everyone was happy for a while.",
:create/email "tangj1122@gmail.com",
:create/time 1587666228137,
:block/children
[{:block/string "SQL worked well with millions of things.",
:create/email "tangj1122@gmail.com",
:create/time 1587666231553,
:block/uid "qN3pgLXUr",
:edit/time 1587666235844,
:edit/email "tangj1122@gmail.com"}
{:block/string "SQL worked well with billions of things.",
:create/email "tangj1122@gmail.com",
:create/time 1587666241524,
:block/uid "b251tV0ym",
:edit/time 1587666241524,
:edit/email "tangj1122@gmail.com"}
{:block/string "Less well with trillions of things.",
:create/email "tangj1122@gmail.com",
:create/time 1587666244466,
:block/uid "5M_-gB9C5",
:edit/time 1587666244466,
:edit/email "tangj1122@gmail.com"}
{:block/string
"And not well with quadrillions of things.",
:create/email "tangj1122@gmail.com",
:create/time 1587666113002,
:block/uid "0ZuJvtxFn",
:edit/time 1587666318847,
:edit/email "tangj1122@gmail.com"}],
:block/uid "1StHztaJ2",
:edit/time 1587666228137,
:edit/email "tangj1122@gmail.com"}
{:block/string
"People began to create write-scale systems because SQL didn't handle huge write volumes well. NoSQL rises!",
:create/email "tangj1122@gmail.com",
:create/time 1587666283860,
:block/children
[{:block/string "MongoDB",
:create/email "tangj1122@gmail.com",
:create/time 1587666321463,
:block/uid "nBHB53zwP",
:edit/time 1587666323345,
:edit/email "tangj1122@gmail.com"}
{:block/string "Riak",
:create/email "tangj1122@gmail.com",
:create/time 1587666323335,
:block/uid "4uJNoO-On",
:edit/time 1587666324632,
:edit/email "tangj1122@gmail.com"}
{:block/string "Cassandra",
:create/email "tangj1122@gmail.com",
:create/time 1587666324630,
:block/uid "rYFSBYi74",
:edit/time 1587666326033,
:edit/email "tangj1122@gmail.com"}
{:block/string "DynamoDB",
:create/email "tangj1122@gmail.com",
:create/time 1587666334504,
:block/uid "YgMIFH6z5",
:edit/time 1587666336232,
:edit/email "tangj1122@gmail.com"}],
:block/uid "JwTzWFDJr",
:edit/time 1587666372917,
:edit/email "tangj1122@gmail.com"}
{:block/string
"NoSQL doesn't affect most of us. But it was important for us to change our mental model of what a database could be.",
:create/email "tangj1122@gmail.com",
:create/time 1587666379813,
:block/uid "Ao1j3vdHX",
:edit/time 1587666403793,
:edit/email "tangj1122@gmail.com"}
{:block/string
"The number one tradeoff we made: **Datomic is not interested in solving the write-scale problem.**",
:create/email "tangj1122@gmail.com",
:create/time 1587666336229,
:block/uid "VmTExwKQf",
:edit/time 1587666431667,
:edit/email "tangj1122@gmail.com"}
{:block/string "Many other people working on this.",
:create/email "tangj1122@gmail.com",
:create/time 1587666411154,
:block/uid "VXv2RQ3iJ",
:edit/time 1587666437368,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Other things we were interested in solving in:",
:create/email "tangj1122@gmail.com",
:create/time 1587666437364,
:block/children
[{:block/string "relational, hierarchical data",
:create/email "tangj1122@gmail.com",
:create/time 1587666442658,
:block/uid "3THozY5Xz",
:edit/time 1587667225222,
:edit/email "tangj1122@gmail.com"}],
:block/uid "7F4thQCjC",
:edit/time 1587666442661,
:edit/email "tangj1122@gmail.com"}],
:block/uid "3cv2i3fwE",
:edit/time 1587665369949,
:edit/email "tangj1122@gmail.com"}
{:block/string "hierarchical",
:create/email "tangj1122@gmail.com",
:create/time 1587665369934,
:block/children
[{:block/string
"JOINs on tables feel stretched when modeling hierarchy.",
:create/email "tangj1122@gmail.com",
:create/time 1587666473314,
:block/uid "proLvqH_e",
:edit/time 1587666623900,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Hierarchy is the tip of the iceberg of **flexibility**.",
:create/email "tangj1122@gmail.com",
:create/time 1587666625320,
:block/uid "NMVpIrRIZ",
:edit/time 1587666638468,
:edit/email "tangj1122@gmail.com"}],
:block/uid "Nvro390ln",
:edit/time 1587665371677,
:edit/email "tangj1122@gmail.com"}
{:block/string "flexible",
:create/email "tangj1122@gmail.com",
:create/time 1587665382272,
:block/children
[{:block/string
"When you pre-define rigid slots of information, you lose a lot of capabilities.",
:create/email "tangj1122@gmail.com",
:create/time 1587666641724,
:block/uid "aQkr-JHUo",
:edit/time 1587666666921,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Once you commit to those slots, you have \"future sadness\".",
:create/email "tangj1122@gmail.com",
:create/time 1587666673946,
:block/uid "VswTOXsRZ",
:edit/time 1587666690064,
:edit/email "tangj1122@gmail.com"}
{:block/string
"You will find information in the real world will not fit those slots.",
:create/email "tangj1122@gmail.com",
:create/time 1587666690062,
:block/uid "uywY6aGLG",
:edit/time 1587666703423,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Some people will have more slots. Some will not have slots.",
:create/email "tangj1122@gmail.com",
:create/time 1587666704310,
:block/uid "RJ2Dfidlp",
:edit/time 1587666896251,
:edit/email "tangj1122@gmail.com"}
{:block/string
"This rigidity doubles down if you use object-oriented programming in the typical way.",
:create/email "tangj1122@gmail.com",
:create/time 1587666787694,
:block/uid "uOGnk9Zis",
:edit/time 1587666976028,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Is this better or worse if you have a lot of slots?",
:create/email "tangj1122@gmail.com",
:create/time 1587666716952,
:block/children
[{:block/string
"Imagine a system that has 10,000 possible slots of information about a person.",
:create/email "tangj1122@gmail.com",
:create/time 1587666724242,
:block/uid "32-B0CulL",
:edit/time 1587666754177,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Imagine an inventory system. You have facts about glue items. Facts about clothing items. But in the inventory context, they should be treated similarly.",
:create/email "tangj1122@gmail.com",
:create/time 1587666754174,
:block/uid "wx3Sgkq81",
:edit/time 1587666926544,
:edit/email "tangj1122@gmail.com"}],
:block/uid "axIJwHtJ4",
:edit/time 1587666724141,
:edit/email "tangj1122@gmail.com"}
{:block/string "Doesn't compose well.",
:create/email "tangj1122@gmail.com",
:create/time 1587666840381,
:block/children
[{:block/string "Address table. Twitter account table.",
:create/email "tangj1122@gmail.com",
:create/time 1587666845938,
:block/uid "ICJzGZQ7j",
:edit/time 1587667012628,
:edit/email "tangj1122@gmail.com"}
{:block/string "Then we have to join them. Why?",
:create/email "tangj1122@gmail.com",
:create/time 1587666856626,
:block/uid "Kejh8NBq1",
:edit/time 1587667173833,
:edit/email "tangj1122@gmail.com"}],
:block/uid "ftl3FbVOY",
:edit/time 1587667164077,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Conclusion: slots are bad for hierarchical or flexible data, and a lot of data in the world is flexible.",
:create/email "tangj1122@gmail.com",
:create/time 1587667186954,
:block/uid "wBYBIo-Jf",
:edit/time 1587667215850,
:edit/email "tangj1122@gmail.com"}],
:block/uid "A82z7Dku7",
:edit/time 1587665382272,
:edit/email "tangj1122@gmail.com"}
{:block/string "indelible",
:create/email "tangj1122@gmail.com",
:create/time 1587665371667,
:block/children
[{:block/string
"Memory used to be precious. If we learned a new fact, it had to replace the previous fact.",
:create/email "tangj1122@gmail.com",
:create/time 1587667230123,
:block/children
[{:block/string "Shadow tables in SQL.",
:create/email "tangj1122@gmail.com",
:create/time 1587667251457,
:block/uid "_Jo5pZ1T4",
:edit/time 1587667277647,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Different queries for normal and shadow tables.",
:create/email "tangj1122@gmail.com",
:create/time 1587667277641,
:block/uid "0xuL20rzx",
:edit/time 1587667286411,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Different queries for current state and previous state of database. -- \"This is terrible and it's just wrong. In 50 years database won't work this way.\"",
:create/email "tangj1122@gmail.com",
:create/time 1587667288573,
:block/uid "ErwlYIV9a",
:edit/time 1587667355273,
:edit/email "tangj1122@gmail.com"}],
:block/uid "PeepZy8Es",
:edit/time 1587667274846,
:edit/email "tangj1122@gmail.com"}
{:block/string
"When you put things in a database, you should be able to remember it.",
:create/email "tangj1122@gmail.com",
:create/time 1587667333280,
:block/uid "NSJIg7-1t",
:edit/time 1587667375148,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Each of you has a personal, indelible database on your computer right now: **git**.",
:create/email "tangj1122@gmail.com",
:create/time 1587667375566,
:block/uid "QMgzqXYu7",
:edit/time 1587667396268,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Would you want to forget what your source code looked like 6 months ago? Even if you had a bug, you wouldn't want to. __Especially__ if you had a bug.",
:create/email "tangj1122@gmail.com",
:create/time 1587667396265,
:block/uid "Za01Rp68_",
:edit/time 1587667483136,
:edit/email "tangj1122@gmail.com"}
{:block/string
"When you put new stuff in, it accretes. #accretion",
:create/email "tangj1122@gmail.com",
:create/time 1587667439329,
:block/uid "wmbHl02pr",
:edit/time 1587667475371,
:edit/email "tangj1122@gmail.com"}],
:block/uid "vMddFLg7G",
:edit/time 1587665382979,
:edit/email "tangj1122@gmail.com"}
{:block/string "chronological",
:create/email "tangj1122@gmail.com",
:create/time 1587665375687,
:block/children
[{:block/string
"When you have indelible, you get chronological for free.",
:create/email "tangj1122@gmail.com",
:create/time 1587665388069,
:block/uid "MCWK8_LzX",
:edit/time 1587667457123,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1587667457121,
:block/uid "Y7OQVf15v",
:edit/time 1587667457121,
:edit/email "tangj1122@gmail.com"}],
:block/uid "mXoUvsglT",
:edit/time 1587665379094,
:edit/email "tangj1122@gmail.com"}],
:block/uid "rw1cRt0On",
:edit/time 1587665359948,
:edit/email "tangj1122@gmail.com"}
{:block/string "The Cloud",
:create/email "tangj1122@gmail.com",
:create/time 1587667517017,
:block/children
[{:block/string
"We don't want to run our own data centers now.",
:create/email "tangj1122@gmail.com",
:create/time 1587667531171,
:block/children
[{:block/string
"We don't want to look into an actual broken machine when it goes down.",
:create/email "tangj1122@gmail.com",
:create/time 1587667550899,
:block/uid "molVfRSsk",
:edit/time 1587667563997,
:edit/email "tangj1122@gmail.com"}],
:block/uid "zJogaD7_7",
:edit/time 1587667550902,
:edit/email "tangj1122@gmail.com"}
{:block/string "AWS promises high availability",
:create/email "tangj1122@gmail.com",
:create/time 1587667519147,
:block/uid "3oBH00j53",
:edit/time 1587667547463,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Elastic autoscaling. We can't start more machines when you have more usage. We can scale down when you don't.",
:create/email "tangj1122@gmail.com",
:create/time 1587667565516,
:block/uid "hALpnLVob",
:edit/time 1587667593172,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Security. Do you think you're going to be as secure as AWS? On-balance, AWS is going to be more secure",
:create/email "tangj1122@gmail.com",
:create/time 1587667593170,
:block/uid "ppEQrnt41",
:edit/time 1587667627803,
:edit/email "tangj1122@gmail.com"}
{:block/string "Usage-based pricing.",
:create/email "tangj1122@gmail.com",
:create/time 1587667628473,
:block/uid "T7H1Xr11z",
:edit/time 1587667684751,
:edit/email "tangj1122@gmail.com"}
{:block/string
"All you have to do is copy your data center software to the cloud and press play!",
:create/email "tangj1122@gmail.com",
:create/time 1587667700395,
:block/children
[{:block/string
"WRONG. You have so many cloud primitives that have nothing to do with file configs for Linux or SQL.",
:create/email "tangj1122@gmail.com",
:create/time 1587667712426,
:block/uid "KQ0alfPi-",
:edit/time 1587667907702,
:edit/email "tangj1122@gmail.com"}
{:block/string "Lambdas, VPC, KMS, Auto-Scaling, IAM...",
:create/email "tangj1122@gmail.com",
:create/time 1587667745936,
:block/uid "Tplxl090C",
:edit/time 1587667764504,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Datomic is distributed on **AWS Marketplace** as a CloudFormation template.",
:create/email "tangj1122@gmail.com",
:create/time 1587667764502,
:block/uid "PEmrPgwbq",
:edit/time 1587668294679,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Many people do not put a db on AWS because it's a service. For Datomic it runs on your account, not a service.",
:create/email "tangj1122@gmail.com",
:create/time 1587667833600,
:block/children
[{:block/string "Elaborated below: ((AqnXTnLJg))",
:create/email "tangj1122@gmail.com",
:create/time 1587668233262,
:block/uid "ZXBtdrqUi",
:edit/time 1587668246924,
:edit/email "tangj1122@gmail.com"}],
:block/uid "CGusdFQgd",
:edit/time 1587668224564,
:edit/email "tangj1122@gmail.com"}],
:block/uid "qa3quop-3",
:edit/time 1587667712154,
:edit/email "tangj1122@gmail.com"}],
:block/uid "cicZlee0q",
:edit/time 1587667519150,
:edit/email "tangj1122@gmail.com"}
{:block/string "How to Use",
:create/email "tangj1122@gmail.com",
:create/time 1587667944955,
:block/children
[{:block/string "Solo Topology",
:create/email "tangj1122@gmail.com",
:create/time 1587667929212,
:block/children
[{:block/string "one compute resource",
:create/email "tangj1122@gmail.com",
:create/time 1587667931697,
:block/uid "l-25V5Man",
:edit/time 1587668002963,
:edit/email "tangj1122@gmail.com"}
{:block/string "for personal, development, testing",
:create/email "tangj1122@gmail.com",
:create/time 1587667966796,
:block/uid "WX833vTQt",
:edit/time 1587667975335,
:edit/email "tangj1122@gmail.com"}
{:block/string "$1/day to run 24/7",
:create/email "tangj1122@gmail.com",
:create/time 1587667954949,
:block/uid "eqdPctiig",
:edit/time 1587667962535,
:edit/email "tangj1122@gmail.com"}
{:block/string
"triply durable to DynamoDB, S3, EFS (which are all already redundant)",
:create/email "tangj1122@gmail.com",
:create/time 1587667976188,
:block/uid "FlBIDbx47",
:edit/time 1587668008917,
:edit/email "tangj1122@gmail.com"}
{:block/string "access through a bastion server",
:create/email "tangj1122@gmail.com",
:create/time 1587667993759,
:block/uid "NiTYLIZSg",
:edit/time 1587668000216,
:edit/email "tangj1122@gmail.com"}
{:block/string "what will be used in this tutorial",
:create/email "tangj1122@gmail.com",
:create/time 1587668009770,
:block/uid "3ZP0PXvGw",
:edit/time 1587668015500,
:edit/email "tangj1122@gmail.com"}
{:block/string "architecture",
:create/email "tangj1122@gmail.com",
:create/time 1587668030830,
:block/children
[{:block/string
"![](https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2FdVmAK6MmtA?alt=media&token=78d1379e-2d8a-48ea-874a-736441dd4685)",
:block/uid "jEOQzYu0Z",
:edit/time 1587668051810,
:edit/email "tangj1122@gmail.com"}],
:block/uid "fVmoLKUcp",
:edit/time 1587668155251,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Like using S3, the only difference from it being a service is that there's a bastion server. We don't want to put DBs on the internet. When you run Datomic on your account, it's running in a VPC that nobody can get to.",
:create/email "tangj1122@gmail.com",
:create/time 1587668159409,
:block/uid "AqnXTnLJg",
:edit/time 1587668267013,
:edit/email "tangj1122@gmail.com"}
{:block/string
"When you want to put in production, Bastion opens up an SSH tunnel for you.",
:create/email "tangj1122@gmail.com",
:create/time 1587668203463,
:block/uid "6_lv7NtL6",
:edit/time 1587668284435,
:edit/email "tangj1122@gmail.com"}
{:block/string "Features",
:create/email "tangj1122@gmail.com",
:create/time 1587668313527,
:block/children
[{:block/string "console dashboard",
:create/email "tangj1122@gmail.com",
:create/time 1587668303034,
:block/uid "vcY7kA-Rv",
:edit/time 1587668319621,
:edit/email "tangj1122@gmail.com"}
{:block/string "integrated logging",
:create/email "tangj1122@gmail.com",
:create/time 1587668305008,
:block/uid "LqHt3kh9I",
:edit/time 1587668318539,
:edit/email "tangj1122@gmail.com"}
{:block/string "integrated tagging for finding resources",
:create/email "tangj1122@gmail.com",
:create/time 1587668306973,
:block/uid "Q7RK2fxy0",
:edit/time 1587668329692,
:edit/email "tangj1122@gmail.com"}
{:block/string "integrated security",
:create/email "tangj1122@gmail.com",
:create/time 1587668329690,
:block/children
[{:block/string "HMAC (AWS best practice)",
:create/email "tangj1122@gmail.com",
:create/time 1587668377160,
:block/uid "4f_n7oF2x",
:edit/time 1587668393326,
:edit/email "tangj1122@gmail.com"}
{:block/string "AWS IAM",
:create/email "tangj1122@gmail.com",
:create/time 1587668343561,
:block/uid "o74_DItkW",
:edit/time 1587668377162,
:edit/email "tangj1122@gmail.com"}
{:block/string "encryption at rest",
:create/email "tangj1122@gmail.com",
:create/time 1587668355880,
:block/uid "n6-5Gp3_4",
:edit/time 1587668358653,
:edit/email "tangj1122@gmail.com"}
{:block/string "isolated by VPC",
:create/email "tangj1122@gmail.com",
:create/time 1587668370307,
:block/uid "bkY5GeGKt",
:edit/time 1587668373057,
:edit/email "tangj1122@gmail.com"}],
:block/uid "DKx5uGSIZ",
:edit/time 1587668332945,
:edit/email "tangj1122@gmail.com"}],
:block/uid "wVKne6aUR",
:edit/time 1587668315064,
:edit/email "tangj1122@gmail.com"}
{:block/string "Stratified Durability",
:create/email "tangj1122@gmail.com",
:create/time 1587668403124,
:block/children
[{:block/string
"You want storage that is low-latency, low-cost, ACID, and reliable. You cannot get those all at once. But Datomic provides all of them in different ways. How? The \"Magic Sauce\" is [[immutability]].",
:create/email "tangj1122@gmail.com",
:create/time 1587668407817,
:block/uid "wn136lE-y",
:edit/time 1587668510270,
:edit/email "tangj1122@gmail.com"}
{:block/string
"When things don't change, it's easy and sensible to copy them.",
:create/email "tangj1122@gmail.com",
:create/time 1587668495409,
:block/children
[{:block/string "low-latency: to your local SSD, EFS",
:create/email "tangj1122@gmail.com",
:create/time 1587668524230,
:block/uid "REHDHZh2f",
:edit/time 1587668545577,
:edit/email "tangj1122@gmail.com"}
{:block/string "low-cost: S3 + EFS",
:create/email "tangj1122@gmail.com",
:create/time 1587668531638,
:block/uid "JbBjdqYq7",
:edit/time 1587668552101,
:edit/email "tangj1122@gmail.com"}
{:block/string "ACID: DynamoDB",
:create/email "tangj1122@gmail.com",
:create/time 1587668552099,
:block/uid "Mx3a1TLoN",
:edit/time 1587668557734,
:edit/email "tangj1122@gmail.com"}
{:block/string "reliability: DynamoDB, then S3 + EFS",
:create/email "tangj1122@gmail.com",
:create/time 1587668560346,
:block/uid "6lbN-HnJV",
:edit/time 1587668566826,
:edit/email "tangj1122@gmail.com"}],
:block/uid "_qyPpKcF7",
:edit/time 1587668524232,
:edit/email "tangj1122@gmail.com"}
{:block/string
"When things can't be changed, you don't have to coordinate.",
:create/email "tangj1122@gmail.com",
:create/time 1587668570740,
:block/uid "-fpB4u9G_",
:edit/time 1587668579370,
:edit/email "tangj1122@gmail.com"}
{:block/string "Autoscaling Storage",
:create/email "tangj1122@gmail.com",
:create/time 1587668579618,
:block/children
[{:block/string
"Don't care about for S3, but do care about DynamoDB because it's expensive.",
:create/email "tangj1122@gmail.com",
:create/time 1587668621520,
:block/uid "U7AuNyLth",
:edit/time 1587668640042,
:edit/email "tangj1122@gmail.com"}],
:block/uid "1z376DKCk",
:edit/time 1587668600138,
:edit/email "tangj1122@gmail.com"}],
:block/uid "Svkr_GgiR",
:edit/time 1587668407821,
:edit/email "tangj1122@gmail.com"}],
:block/uid "l-PXJlTmE",
:edit/time 1587667931700,
:edit/email "tangj1122@gmail.com"}
{:block/string "Production Topology",
:create/email "tangj1122@gmail.com",
:create/time 1587668657990,
:block/children
[{:block/string "architecture",
:create/email "tangj1122@gmail.com",
:create/time 1587668772533,
:block/children
[{:block/string
"![](https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2FNHkpBmfPcO?alt=media&token=f87e0903-b546-4e86-9c71-a538469cb9ca)",
:block/uid "9YyKpH-VQ",
:edit/time 1587668770664,
:edit/email "tangj1122@gmail.com"}],
:block/uid "qwuaqKs64",
:edit/time 1587668774438,
:edit/email "tangj1122@gmail.com"}
{:block/string "everything in ((l-PXJlTmE)) AND",
:create/email "tangj1122@gmail.com",
:create/time 1587668660456,
:block/uid "R-sSVgsXc",
:edit/time 1587668789847,
:edit/email "tangj1122@gmail.com"}
{:block/string "Clusters",
:create/email "tangj1122@gmail.com",
:create/time 1587668675955,
:block/uid "E8TW7Gwa4",
:edit/time 1587668707520,
:edit/email "tangj1122@gmail.com"}
{:block/string "Load Balancing",
:create/email "tangj1122@gmail.com",
:create/time 1587668678972,
:block/uid "02Lstu9WV",
:edit/time 1587668704210,
:edit/email "tangj1122@gmail.com"}
{:block/string "Autoscaling Groups",
:create/email "tangj1122@gmail.com",
:create/time 1587668683996,
:block/children
[{:block/string
"rather than having separate ETL jobs, data backups, etc. we have independent groups",
:create/email "tangj1122@gmail.com",
:create/time 1587668813811,
:block/uid "4331KRfe7",
:edit/time 1587668838454,
:edit/email "tangj1122@gmail.com"}],
:block/uid "vePbBw3wh",
:edit/time 1587668813791,
:edit/email "tangj1122@gmail.com"}
{:block/string "Query Groups",
:create/email "tangj1122@gmail.com",
:create/time 1587668689128,
:block/children
[{:block/string "dedicated jobs",
:create/email "tangj1122@gmail.com",
:create/time 1587668846740,
:block/uid "ZcWtUEq21",
:edit/time 1587668852397,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Some people shard because they can't do reads fast enough. Terrible. Introduces more structure to get to data.",
:create/email "tangj1122@gmail.com",
:create/time 1587668858836,
:block/uid "_yajSiz2Y",
:edit/time 1587668905630,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Makes sense for write-scale, not read-scale.",
:create/email "tangj1122@gmail.com",
:create/time 1587668911040,
:block/uid "xLwo1aA40",
:edit/time 1587668921846,
:edit/email "tangj1122@gmail.com"}
{:block/string
"No need to shard for Datomic, just scale out compute and copy data.",
:create/email "tangj1122@gmail.com",
:create/time 1587668948354,
:block/uid "HQW6MipOW",
:edit/time 1587668979259,
:edit/email "tangj1122@gmail.com"}
{:block/string "Groups for",
:create/email "tangj1122@gmail.com",
:create/time 1587669011236,
:block/children
[{:block/string "dev",
:create/email "tangj1122@gmail.com",
:create/time 1587669016579,
:block/uid "BbOk87xID",
:edit/time 1587669017636,
:edit/email "tangj1122@gmail.com"}
{:block/string "staging",
:create/email "tangj1122@gmail.com",
:create/time 1587669012449,
:block/uid "aUrnh8EVQ",
:edit/time 1587669018733,
:edit/email "tangj1122@gmail.com"}
{:block/string "CI",
:create/email "tangj1122@gmail.com",
:create/time 1587669013757,
:block/uid "bwfIs6tzm",
:edit/time 1587669015631,
:edit/email "tangj1122@gmail.com"}
{:block/string "prod",
:create/email "tangj1122@gmail.com",
:create/time 1587669019420,
:block/uid "LsF_YikGV",
:edit/time 1587669020689,
:edit/email "tangj1122@gmail.com"}],
:block/uid "3-JlhiLls",
:edit/time 1587669012452,
:edit/email "tangj1122@gmail.com"}],
:block/uid "1ofi4QEqR",
:edit/time 1587668846041,
:edit/email "tangj1122@gmail.com"}],
:block/uid "Fepu56lGU",
:edit/time 1587668660458,
:edit/email "tangj1122@gmail.com"}],
:block/uid "-2JLGSe4g",
:edit/time 1587667946893,
:edit/email "tangj1122@gmail.com"}
{:block/string "Datomic Ions",
:create/email "tangj1122@gmail.com",
:create/time 1587669136135,
:block/children
[{:block/string "Datomic shipped in 2012, Datomic Cloud 2017",
:create/email "tangj1122@gmail.com",
:create/time 1587669047549,
:block/uid "6CtUnOWA8",
:edit/time 1587669447273,
:edit/email "tangj1122@gmail.com"}
{:block/string
"What Cloud customers found out was that they now needed to overcome all the cloud hurdles for their application ->> Datomic Ions to the rescue.",
:create/email "tangj1122@gmail.com",
:create/time 1587669501857,
:block/uid "zRZ8bbbmb",
:edit/time 1587669530779,
:edit/email "tangj1122@gmail.com"}
{:block/string
"You don't have to worry about security, scaling, all cloud ops, etc., just put your Clojure code next to Datomic",
:create/email "tangj1122@gmail.com",
:create/time 1587669151405,
:block/uid "TYpPlMmTP",
:edit/time 1587669501861,
:edit/email "tangj1122@gmail.com"}
{:block/string "Bastion for development access",
:create/email "tangj1122@gmail.com",
:create/time 1587669227823,
:block/uid "V3e7vKz2C",
:edit/time 1587669231430,
:edit/email "tangj1122@gmail.com"}
{:block/string "And Ions for prod entrypoints",
:create/email "tangj1122@gmail.com",
:create/time 1587669219040,
:block/uid "vpbP-5Qfq",
:edit/time 1587669549101,
:edit/email "tangj1122@gmail.com"}
{:block/string
"UNLIKE lambdas, you have in-memory access to your database.",
:create/email "tangj1122@gmail.com",
:create/time 1587669254220,
:block/uid "Xhk8YLF6J",
:edit/time 1587669265627,
:edit/email "tangj1122@gmail.com"}
{:block/string
"This was the advantage of the Peer model pre-cloud: app code shares memory with Datomic.",
:create/email "tangj1122@gmail.com",
:create/time 1587669265624,
:block/children
[{:block/string "Don't need to make RPC calls",
:create/email "tangj1122@gmail.com",
:create/time 1587669316061,
:block/uid "-hP9NwA9f",
:edit/time 1587669324396,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Don't need to worry about the [[n+1]] problem: making n+1 roundtrips to get more information about subdetails for a data query.",
:create/email "tangj1122@gmail.com",
:create/time 1587669323004,
:block/uid "5k2BoMi2J",
:edit/time 1587669350329,
:edit/email "tangj1122@gmail.com"}],
:block/uid "LNx4ylqki",
:edit/time 1587669316063,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Ions bring benefit of Peer model back to the cloud.",
:create/email "tangj1122@gmail.com",
:create/time 1587669362281,
:block/uid "A1e2UvHUE",
:edit/time 1587669564993,
:edit/email "tangj1122@gmail.com"}],
:block/uid "Tc1-hkh6A",
:edit/time 1587669452378,
:edit/email "tangj1122@gmail.com"}],
:block/uid "Uax5wvXQI",
:edit/time 1587669587982,
:edit/email "tangj1122@gmail.com"}
{:block/string "Information Model: Universal Schema",
:create/email "tangj1122@gmail.com",
:create/time 1587669572297,
:block/children
[{:block/string "Notation",
:create/email "tangj1122@gmail.com",
:create/time 1587670325134,
:block/children
[{:block/string "More relevant to people new to Clojure",
:create/email "tangj1122@gmail.com",
:create/time 1587670102633,
:block/uid "fM4rHnB9i",
:edit/time 1587670430655,
:edit/email "tangj1122@gmail.com"}
{:block/string
"[[EDN]]: extensible data notation, a subset of Clojure that describes data",
:create/email "tangj1122@gmail.com",
:create/time 1587670403435,
:block/uid "BPhc1M1A0",
:edit/time 1587670425838,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Have you ever programmed in JSON? It's so bad that even YAML is better. Both are insufficient for writing programs.",
:create/email "tangj1122@gmail.com",
:create/time 1587670444440,
:block/uid "OEMmLaLZF",
:edit/time 1587670474120,
:edit/email "tangj1122@gmail.com"}
{:block/string "primitives",
:create/email "tangj1122@gmail.com",
:create/time 1587670753366,
:block/children
[{:block/string
"![](https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2Fqeu6oNfXM-?alt=media&token=cde135bf-1e16-4b27-a285-4accf77e4646)",
:block/uid "DmLFLFo4X",
:edit/time 1587670639911,
:edit/email "tangj1122@gmail.com"}
{:block/string "symbol",
:create/email "tangj1122@gmail.com",
:create/time 1587670590602,
:block/children
[{:block/string
"[[Clojure]] is rare in that it has two symbolic types: symbols and keywords.",
:create/email "tangj1122@gmail.com",
:create/time 1587670647511,
:block/uid "F67B4Yset",
:edit/time 1587670784460,
:edit/email "tangj1122@gmail.com"}
{:block/string "Ruby has 1 symbolic type.",
:create/email "tangj1122@gmail.com",
:create/time 1587670663733,
:block/uid "gWGF3-fE2",
:edit/time 1587670699596,
:edit/email "tangj1122@gmail.com"}
{:block/string "Java has 0 symbolic types.",
:create/email "tangj1122@gmail.com",
:create/time 1587670666768,
:block/uid "hEM7sbQa2",
:edit/time 1587670695289,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Very enabling when using a data DSL as a query language.",
:create/email "tangj1122@gmail.com",
:create/time 1587670700493,
:block/uid "ns3nrC-2r",
:edit/time 1587670728097,
:edit/email "tangj1122@gmail.com"}],
:block/uid "2cGwf1_VJ",
:edit/time 1587670647404,
:edit/email "tangj1122@gmail.com"}],
:block/uid "PzONhsyIM",
:edit/time 1587670756291,
:edit/email "tangj1122@gmail.com"}
{:block/string "collections",
:create/email "tangj1122@gmail.com",
:create/time 1587670728094,
:block/children
[{:block/string
"![](https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2FOb926Wa5FG?alt=media&token=322f0e40-732d-42d5-b753-1ec5fdbd80b8)",
:block/uid "-9DV41GYE",
:edit/time 1587670751930,
:edit/email "tangj1122@gmail.com"}],
:block/uid "tH9hSfDXZ",
:edit/time 1587670796645,
:edit/email "tangj1122@gmail.com"}
{:block/string
"generic extensibility through custom datatypes",
:create/email "tangj1122@gmail.com",
:create/time 1587670915340,
:block/children
[{:block/string
"```#name edn-form\n\n;; the two built-in Datomic data types\n\n#inst \"rfc-3339-format\" ;; Datomic's time type\n\n#uuid \"jd91jd21-sa812-123a-2313\"```",
:create/email "tangj1122@gmail.com",
:create/time 1587670928974,
:block/uid "GwWvLIhFm",
:edit/time 1587671033526,
:edit/email "tangj1122@gmail.com"}
{:block/string "recursively defined",
:create/email "tangj1122@gmail.com",
:create/time 1587670942548,
:block/children
[{:block/string
"made a comment on why this is cool, but Idk why ~ 7:00",
:create/email "tangj1122@gmail.com",
:create/time 1587671056227,
:block/uid "maNOa0jh4",
:edit/time 1587671071207,
:edit/email "tangj1122@gmail.com"}],
:block/uid "4WOOnXrJz",
:edit/time 1587671056233,
:edit/email "tangj1122@gmail.com"}],
:block/uid "1ZeLxwvUo",
:edit/time 1587670977242,
:edit/email "tangj1122@gmail.com"}],
:block/uid "dX7CEET-q",
:edit/time 1587670325134,
:edit/email "tangj1122@gmail.com"}
{:block/string "Datoms",
:create/email "tangj1122@gmail.com",
:create/time 1587670322509,
:block/children
[{:block/string "granular, atomic fact",
:create/email "tangj1122@gmail.com",
:create/time 1587671080181,
:block/uid "4_zBdPAfR",
:edit/time 1587671085543,
:edit/email "tangj1122@gmail.com"}
{:block/string "immutable",
:create/email "tangj1122@gmail.com",
:create/time 1587671085676,
:block/uid "AoFaCo76Q",
:edit/time 1587671088821,
:edit/email "tangj1122@gmail.com"}
{:block/string "5-tuple",
:create/email "tangj1122@gmail.com",
:create/time 1587670286513,
:block/children
[{:block/string "entity",
:create/email "tangj1122@gmail.com",
:create/time 1587671092267,
:block/uid "j3KOK0eq4",
:edit/time 1587671094705,
:edit/email "tangj1122@gmail.com"}
{:block/string "attribute",
:create/email "tangj1122@gmail.com",
:create/time 1587671094703,
:block/uid "it33Qo1Vr",
:edit/time 1587671096086,
:edit/email "tangj1122@gmail.com"}
{:block/string "value",
:create/email "tangj1122@gmail.com",
:create/time 1587671096083,
:block/uid "k6X4BUued",
:edit/time 1587671096696,
:edit/email "tangj1122@gmail.com"}
{:block/string "transaction",
:create/email "tangj1122@gmail.com",
:create/time 1587671096694,
:block/children
[{:block/string
"transactions are also objects in the database that can be referenced",
:create/email "tangj1122@gmail.com",
:create/time 1587671285517,
:block/uid "oV0ir_uYe",
:edit/time 1587671309338,
:edit/email "tangj1122@gmail.com"}
{:block/string "`git` has reified transactions",
:create/email "tangj1122@gmail.com",
:create/time 1587671315608,
:block/children
[{:block/string "can reference other commits",
:create/email "tangj1122@gmail.com",
:create/time 1587671340559,
:block/uid "ASdrt1KCt",
:edit/time 1587671344270,
:edit/email "tangj1122@gmail.com"}
{:block/string "can have a message",
:create/email "tangj1122@gmail.com",
:create/time 1587671344267,
:block/uid "1PHsd49mc",
:edit/time 1587671346519,
:edit/email "tangj1122@gmail.com"}
{:block/string "can be tagged",
:create/email "tangj1122@gmail.com",
:create/time 1587671346514,
:block/uid "5xA82vZF5",
:edit/time 1587671349062,
:edit/email "tangj1122@gmail.com"}],
:block/uid "tvWkaRbDF",
:edit/time 1587671379102,
:edit/email "tangj1122@gmail.com"}
{:block/string
"you can talk about transactions in an open-ended way (can't do that with SQL)",
:create/email "tangj1122@gmail.com",
:create/time 1587671349059,
:block/uid "COmCdON-s",
:edit/time 1587671405729,
:edit/email "tangj1122@gmail.com"}],
:block/uid "EMi_TBfjd",
:edit/time 1587671098272,
:edit/email "tangj1122@gmail.com"}
{:block/string "op",
:create/email "tangj1122@gmail.com",
:create/time 1587671098259,
:block/children
[{:block/string
"are we adding fact to system or removing it",
:create/email "tangj1122@gmail.com",
:create/time 1587671418055,
:block/uid "R42iWMS5i",
:edit/time 1587671430130,
:edit/email "tangj1122@gmail.com"}],
:block/uid "cOmNWBL33",
:edit/time 1587671099301,
:edit/email "tangj1122@gmail.com"}],
:block/uid "Ta76zMG6b",
:edit/time 1587670322516,
:edit/email "tangj1122@gmail.com"}
{:block/string "example",
:create/email "tangj1122@gmail.com",
:create/time 1587671458746,
:block/children
[{:block/string
"![](https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2FtJrcgd_7CA?alt=media&token=adfacfdd-15de-4ac0-b439-daf0e73fc5ab)",
:block/uid "HzX4ruNsw",
:edit/time 1587671456069,
:edit/email "tangj1122@gmail.com"}
{:block/string
"there is no deletion. you just update the fact.",
:create/email "tangj1122@gmail.com",
:create/time 1587671468503,
:block/uid "Wl9vkAybw",
:edit/time 1587671476853,
:edit/email "tangj1122@gmail.com"}
{:block/string
"\"Jane\" is not actually an entity id, but an entity value",
:create/email "tangj1122@gmail.com",
:create/time 1587671501984,
:block/uid "LywiV3ejy",
:edit/time 1587671526190,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Attributes are not actually named, but are also values in the database",
:create/email "tangj1122@gmail.com",
:create/time 1587671548945,
:block/uid "lDDEF6Rkn",
:edit/time 1587671561037,
:edit/email "tangj1122@gmail.com"}
{:block/string
"![](https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2F5KZYtKY9oI?alt=media&token=80304afd-0d64-4e38-aa04-96b94acd0adc)",
:block/uid "ISVnUaK2i",
:edit/time 1587671499171,
:edit/email "tangj1122@gmail.com"}],
:block/uid "1A-CTTJjb",
:edit/time 1587671460523,
:edit/email "tangj1122@gmail.com"}],
:block/uid "u5UJISkSX",
:edit/time 1587670322509,
:edit/email "tangj1122@gmail.com"}
{:block/string "Databases",
:create/email "tangj1122@gmail.com",
:create/time 1587670287377,
:block/children
[{:block/string "Universal Relation vs Specific Relation",
:create/email "tangj1122@gmail.com",
:create/time 1587671607192,
:block/children
[{:block/string "a table is a Specific Relation",
:create/email "tangj1122@gmail.com",
:create/time 1587671618696,
:block/uid "1vzWDyTTV",
:edit/time 1587671623351,
:edit/email "tangj1122@gmail.com"}
{:block/string "a set of datoms is a Universal Relation",
:create/email "tangj1122@gmail.com",
:create/time 1587671626354,
:block/uid "fUQeIHy6H",
:edit/time 1587671631379,
:edit/email "tangj1122@gmail.com"}
{:block/string "efficient storage",
:create/email "tangj1122@gmail.com",
:create/time 1587671640223,
:block/children
[{:block/string "we store numeric ids",
:create/email "tangj1122@gmail.com",
:create/time 1587671731095,
:block/uid "qxX36min2",
:edit/time 1587671737006,
:edit/email "tangj1122@gmail.com"}
{:block/string
"in contrast to a naive [[RDF]]-implementation, requires a globally unique name for each entity",
:create/email "tangj1122@gmail.com",
:create/time 1587671737002,
:block/uid "DdZrdYfhd",
:edit/time 1587671775943,
:edit/email "tangj1122@gmail.com"}],
:block/uid "H92ovOh-O",
:edit/time 1587671645459,
:edit/email "tangj1122@gmail.com"}
{:block/string "many sort orders / indexes",
:create/email "tangj1122@gmail.com",
:create/time 1587671645457,
:block/children
[{:block/string "((eOQ1W814p))",
:create/email "tangj1122@gmail.com",
:create/time 1587671980130,
:block/uid "OjFlqu823",
:edit/time 1587671981197,
:edit/email "tangj1122@gmail.com"}],
:block/uid "KXDwJFEki",
:edit/time 1587671971980,
:edit/email "tangj1122@gmail.com"}
{:block/string "accumulate-only (not append-only)",
:create/email "tangj1122@gmail.com",
:create/time 1587671649083,
:block/uid "u05Bmf3U5",
:edit/time 1587671654273,
:edit/email "tangj1122@gmail.com"}],
:block/uid "FWd8pQbR9",
:edit/time 1587671618698,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Universal Relation allows you to essentially model all other access styles ",
:create/email "tangj1122@gmail.com",
:create/time 1587670316572,
:block/children
[{:block/string "row (SQL)",
:create/email "tangj1122@gmail.com",
:create/time 1587671820914,
:block/children
[{:block/string "EAVT",
:create/email "tangj1122@gmail.com",
:create/time 1587672101439,
:block/uid "CxxdxfsKV",
:edit/time 1587672103944,
:edit/email "tangj1122@gmail.com"}
{:block/string
"leads by entity. everything about this record is separate from other records",
:create/email "tangj1122@gmail.com",
:create/time 1587672089879,
:block/uid "CFqE0fttT",
:edit/time 1587672117403,
:edit/email "tangj1122@gmail.com"}],
:block/uid "sxKrM_4ah",
:edit/time 1587671918450,
:edit/email "tangj1122@gmail.com"}
{:block/string "column (Cassandra)",
:create/email "tangj1122@gmail.com",
:create/time 1587671822501,
:block/children
[{:block/string "AEVT",
:create/email "tangj1122@gmail.com",
:create/time 1587672124253,
:block/uid "HXo3kMPqN",
:edit/time 1587672128813,
:edit/email "tangj1122@gmail.com"}
{:block/string
"leads by attributes. I don't care about the entities as much.",
:create/email "tangj1122@gmail.com",
:create/time 1587672128811,
:block/uid "HsBPbRPU7",
:edit/time 1587672149017,
:edit/email "tangj1122@gmail.com"}],
:block/uid "gpSj3ZAr0",
:edit/time 1587671921709,
:edit/email "tangj1122@gmail.com"}
{:block/string "key-value store (redis)",
:create/email "tangj1122@gmail.com",
:create/time 1587671823667,
:block/children
[{:block/string "AVET",
:create/email "tangj1122@gmail.com",
:create/time 1587672099533,
:block/uid "gUGCsqi8f",
:edit/time 1587672100767,
:edit/email "tangj1122@gmail.com"}
{:block/string "keys are A's",
:create/email "tangj1122@gmail.com",
:create/time 1587672036523,
:block/uid "97ZhLKv3f",
:edit/time 1587672041884,
:edit/email "tangj1122@gmail.com"}
{:block/string "values are like V's",
:create/email "tangj1122@gmail.com",
:create/time 1587672041882,
:block/uid "h3ND382z9",
:edit/time 1587672150057,
:edit/email "tangj1122@gmail.com"}],
:block/uid "buQRsDBYS",
:edit/time 1587672056359,
:edit/email "tangj1122@gmail.com"}
{:block/string "document (MongoDB)",
:create/email "tangj1122@gmail.com",
:create/time 1587671844767,
:block/children
[{:block/string "more subtle",
:create/email "tangj1122@gmail.com",
:create/time 1587672150989,
:block/uid "keoHCQFN8",
:edit/time 1587672153931,
:edit/email "tangj1122@gmail.com"}
{:block/string "EAVT, components",
:create/email "tangj1122@gmail.com",
:create/time 1587672156111,
:block/uid "dGlcNxrT1",
:edit/time 1587672158576,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Datomic has a `component` schema attribute",
:create/email "tangj1122@gmail.com",
:create/time 1587672158573,
:block/uid "aFypX6wJB",
:edit/time 1587672183869,
:edit/email "tangj1122@gmail.com"}
{:block/string
"e.g. a line item of an order. always part of an order, never needs to be its own entity",
:create/email "tangj1122@gmail.com",
:create/time 1587672186620,
:block/uid "aDM8toupH",
:edit/time 1587672204669,
:edit/email "tangj1122@gmail.com"}],
:block/uid "9ugxgrUp4",
:edit/time 1587671926039,
:edit/email "tangj1122@gmail.com"}
{:block/string "graph (Neo4j)",
:create/email "tangj1122@gmail.com",
:create/time 1587671824939,
:block/children
[{:block/string "VAET",
:create/email "tangj1122@gmail.com",
:create/time 1587672212837,
:block/uid "XxZJHL0Ps",
:edit/time 1587672214697,
:edit/email "tangj1122@gmail.com"}
{:block/string "work backwards from value to entity",
:create/email "tangj1122@gmail.com",
:create/time 1587672215186,
:block/uid "NN1tJNy1v",
:edit/time 1587672222258,
:edit/email "tangj1122@gmail.com"}
{:block/string
"I can look at all Stu's friends, or go to that person and see if they are a friend of Stu",
:create/email "tangj1122@gmail.com",
:create/time 1587672224699,
:block/uid "2ewRy5Ml-",
:edit/time 1587672255511,
:edit/email "tangj1122@gmail.com"}],
:block/uid "2aIURt6No",
:edit/time 1587671930130,
:edit/email "tangj1122@gmail.com"}
{:block/string
"![](https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2FMozZqpCTV5?alt=media&token=3f67aa9a-5331-45d9-a52d-096773ebcec1)",
:block/uid "Lmvn3PUmO",
:edit/time 1587672023627,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Note: none of the above matters when you make a query. Datomic knows when to use which index.",
:create/email "tangj1122@gmail.com",
:create/time 1587672295299,
:block/uid "fcjvM7VIF",
:edit/time 1587672309615,
:edit/email "tangj1122@gmail.com"}],
:block/uid "eOQ1W814p",
:edit/time 1587672319388,
:edit/email "tangj1122@gmail.com"}
{:block/string "Time aware",
:create/email "tangj1122@gmail.com",
:create/time 1587672322939,
:block/children
[{:block/string
"![](https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2FIWO4dtbjZe?alt=media&token=4afd2c0b-00ee-4847-af94-5180c587ed77)",
:block/uid "HMuCeaEQg",
:edit/time 1587672334150,
:edit/email "tangj1122@gmail.com"}
{:block/string
"tx report: when you submit a transaction, you get a before and after of the database, with which datoms were accreted",
:create/email "tangj1122@gmail.com",
:create/time 1587672324828,
:block/uid "QEHb0Q2k2",
:edit/time 1587672407860,
:edit/email "tangj1122@gmail.com"}
{:block/string
"what do you usually get from a normal database?",
:create/email "tangj1122@gmail.com",
:create/time 1587672407854,
:block/children
[{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1587672423693,
:block/uid "txRPBBjta",
:edit/time 1587672423693,
:edit/email "tangj1122@gmail.com"}],
:block/uid "PX-_kYdG2",
:edit/time 1587672421005,
:edit/email "tangj1122@gmail.com"}
{:block/string
"`with`: if we ran this tx, what would happen",
:create/email "tangj1122@gmail.com",
:create/time 1587672501179,
:block/uid "Ei4Og7OjJ",
:edit/time 1587672509696,
:edit/email "tangj1122@gmail.com"}
{:block/string "`history`: audit trails",
:create/email "tangj1122@gmail.com",
:create/time 1587672509691,
:block/uid "QXGUuHefQ",
:edit/time 1587672515397,
:edit/email "tangj1122@gmail.com"}],
:block/uid "MvEnf7jHV",
:edit/time 1587672324830,
:edit/email "tangj1122@gmail.com"}],
:block/uid "kEuZfgyBH",
:edit/time 1587670289234,
:edit/email "tangj1122@gmail.com"}
{:block/string "Entities",
:create/email "tangj1122@gmail.com",
:create/time 1587670289231,
:block/children
[{:block/string
"things in the world: a Person, an Inventory item",
:create/email "tangj1122@gmail.com",
:create/time 1587670373930,
:block/uid "Jd8Q-OOMi",
:edit/time 1587670388380,
:edit/email "tangj1122@gmail.com"}
{:block/string "immutable",
:create/email "tangj1122@gmail.com",
:create/time 1587672524658,
:block/uid "6_bD-DTuh",
:edit/time 1587672526885,
:edit/email "tangj1122@gmail.com"}
{:block/string "associative",
:create/email "tangj1122@gmail.com",
:create/time 1587672526883,
:block/uid "Ji2bbT6lQ",
:edit/time 1587672530316,
:edit/email "tangj1122@gmail.com"}
{:block/string
"advantage of SQL: ensures all values are there before you accept it (validation)",
:create/email "tangj1122@gmail.com",
:create/time 1587672625238,
:block/uid "fSYeqr3G7",
:edit/time 1587672641259,
:edit/email "tangj1122@gmail.com"}
{:block/string "how often does that lead to brittleness?",
:create/email "tangj1122@gmail.com",
:create/time 1587672641255,
:block/uid "f_3Cmmhjj",
:edit/time 1587672647291,
:edit/email "tangj1122@gmail.com"}
{:block/string
"then we turn the SQL database into objects with ORMs, and we spend an entire career never actually working with the data",
:create/email "tangj1122@gmail.com",
:create/time 1587672647287,
:block/uid "IkleapuPC",
:edit/time 1587672704803,
:edit/email "tangj1122@gmail.com"}
{:block/string "who likes ORMs?",
:create/email "tangj1122@gmail.com",
:create/time 1587672685143,
:block/uid "TckYiG6l3",
:edit/time 1587672713730,
:edit/email "tangj1122@gmail.com"}
{:block/string
"no [[impedance]]: only one way to map attributes and values to datoms",
:create/email "tangj1122@gmail.com",
:create/time 1587672692411,
:block/uid "1E1sqy0GZ",
:edit/time 1587672793801,
:edit/email "tangj1122@gmail.com"}],
:block/uid "JVMeS7_Up",
:edit/time 1587670290275,
:edit/email "tangj1122@gmail.com"}
{:block/string "Schema",
:create/email "tangj1122@gmail.com",
:create/time 1587670290273,
:block/children
[{:block/string "schema adds power",
:create/email "tangj1122@gmail.com",
:create/time 1587670390826,
:block/uid "sg9HNOLjK",
:edit/time 1587672827528,
:edit/email "tangj1122@gmail.com"}
{:block/string
"when you say your data is schema-less, what you mean is that the schema is not in your data but ambiently somewhere in your program",
:create/email "tangj1122@gmail.com",
:create/time 1587672836699,
:block/uid "GQH2p2XJW",
:edit/time 1587672853554,
:edit/email "tangj1122@gmail.com"}
{:block/string "schema only talks about attributes",
:create/email "tangj1122@gmail.com",
:create/time 1587672853551,
:block/children
[{:block/string
"there's an attribute in the world called `:name` with type `string`",
:create/email "tangj1122@gmail.com",
:create/time 1587672885308,
:block/uid "m9J5m5p9r",
:edit/time 1587672899932,
:edit/email "tangj1122@gmail.com"}],
:block/uid "_bWXiVIxi",
:edit/time 1587672885311,
:edit/email "tangj1122@gmail.com"}
{:block/string
"![](https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2FeoFM0GfHPY?alt=media&token=597efb64-068b-4a3e-93d6-6197347e55e8)",
:block/uid "WQClkv9ki",
:edit/time 1587672939779,
:edit/email "tangj1122@gmail.com"}
{:block/string
"if attribute has one-cardinality, and it already has a value, Datomic will retract earlier value and add new fact",
:create/email "tangj1122@gmail.com",
:create/time 1587672899929,
:block/uid "b_q18qZRH",
:edit/time 1587673056184,
:edit/email "tangj1122@gmail.com"}
{:block/string "schema is data, just maps",
:create/email "tangj1122@gmail.com",
:create/time 1587673338378,
:block/uid "QLkik8275",
:edit/time 1587673353173,
:edit/email "tangj1122@gmail.com"}],
:block/uid "d4ZIX8IwJ",
:edit/time 1587670291734,
:edit/email "tangj1122@gmail.com"}
{:block/string "Client API",
:create/email "tangj1122@gmail.com",
:create/time 1587673580111,
:block/children
[{:block/string "async API",
:create/email "tangj1122@gmail.com",
:create/time 1587673626696,
:block/children
[{:block/string
"pagination of results via multiple chunks, transducible #[[transducers]]",
:create/email "tangj1122@gmail.com",
:create/time 1587673635047,
:block/uid "Jz_vL63P3",
:edit/time 1587673653219,
:edit/email "tangj1122@gmail.com"}
{:block/string "errors as information (not exceptions)",
:create/email "tangj1122@gmail.com",
:create/time 1587673710423,
:block/uid "rQLu-6U1N",
:edit/time 1587673715075,
:edit/email "tangj1122@gmail.com"}
{:block/string
"![](https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2F7Q4ox4_Rrb?alt=media&token=4f4aa6a0-7842-4dde-ab50-d4bdee73deaa)",
:block/children
[{:block/string
"computes global frequency of all attributes with a transducer, never needing to have entire database in-memory at once",
:create/email "tangj1122@gmail.com",
:create/time 1587673983495,
:block/uid "wsVYQinoK",
:edit/time 1587674014422,
:edit/email "tangj1122@gmail.com"}],
:block/uid "fhTmUdYqb",
:edit/time 1587673843270,
:edit/email "tangj1122@gmail.com"}],
:block/uid "FnpMdDNft",
:edit/time 1587673806904,
:edit/email "tangj1122@gmail.com"}
{:block/string "sync API",
:create/email "tangj1122@gmail.com",
:create/time 1587673654882,
:block/children
[{:block/string
"`(client/pull db '{:eid [:name \"jane\"] :select [*]})`",
:create/email "tangj1122@gmail.com",
:create/time 1587673752930,
:block/uid "qTKKDQ1un",
:edit/time 1587673775511,
:edit/email "tangj1122@gmail.com"}
{:block/string "errors as exception",
:create/email "tangj1122@gmail.com",
:create/time 1587673715424,
:block/uid "czfaw-3w7",
:edit/time 1587673821012,
:edit/email "tangj1122@gmail.com"}],
:block/uid "YwZ1pSmRZ",
:edit/time 1587673814498,
:edit/email "tangj1122@gmail.com"}
{:block/string "anomalies / errors",
:create/email "tangj1122@gmail.com",
:create/time 1587674074098,
:block/children
[{:block/string "~40:30",
:create/email "tangj1122@gmail.com",
:create/time 1587674077881,
:block/uid "f4lpgkjAT",
:edit/time 1587674103116,
:edit/email "tangj1122@gmail.com"}
{:block/string
"all errors have a corresponding Hall and Oates song title",
:create/email "tangj1122@gmail.com",
:create/time 1587674103112,
:block/uid "jS85CKGlJ",
:edit/time 1587674124884,
:edit/email "tangj1122@gmail.com"}
{:block/string
"![](https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2FkBgzvJoElX?alt=media&token=7a65cd4f-57e9-43d7-9c27-c3f8857c9c7f)",
:block/uid "JL0BlbCKT",
:edit/time 1587674115723,
:edit/email "tangj1122@gmail.com"}
{:block/string "if using sync API: ((czfaw-3w7))",
:create/email "tangj1122@gmail.com",
:create/time 1587674209392,
:block/uid "cLoHIzeU9",
:edit/time 1587674212184,
:edit/email "tangj1122@gmail.com"}
{:block/string "if using async API: ((rQLu-6U1N))",
:create/email "tangj1122@gmail.com",
:create/time 1587674212182,
:block/uid "XMkZ2tgMw",
:edit/time 1587674224039,
:edit/email "tangj1122@gmail.com"}
{:block/string "why?",
:create/email "tangj1122@gmail.com",
:create/time 1587674224016,
:block/children
[{:block/string
"it would be easy to assume, hey we're in clojure instead of java, we're using datomic instead of sql, and we did datalog instead of relational algebra, that we have some huge \"not invented here\" syndrome going on at the Datomic team. and that is not true at all. we have worked heroically to try to use existing tech, which is why clojure runs on java, its why datomic embraces AWS... but the other opportuntieis in this area dont quite work",
:create/email "tangj1122@gmail.com",
:create/time 1587674225264,
:block/uid "1GL07P1PG",
:edit/time 1587674319890,
:edit/email "tangj1122@gmail.com"}
{:block/string
"http status codes are not terrible, but they dont cover the space if you never talked to the server. also they evoloved over time and they have a lot of status codes that dont make sense",
:create/email "tangj1122@gmail.com",
:create/time 1587674319886,
:block/uid "f8EkAiwKn",
:edit/time 1587674399243,
:edit/email "tangj1122@gmail.com"}
{:block/string
"exceptions java style kinda do this but also kinda broken. they are open",
:create/email "tangj1122@gmail.com",
:create/time 1587674399241,
:block/uid "DI67-kRV2",
:edit/time 1587674438416,
:edit/email "tangj1122@gmail.com"}
{:block/string
"the point is to have a fixed set of errors you could branch on, if you have these 3 anomalies happen do this if you have these 4 do that",
:create/email "tangj1122@gmail.com",
:create/time 1587674426291,
:block/uid "XY17GjAzI",
:edit/time 1587674480046,
:edit/email "tangj1122@gmail.com"}],
:block/uid "Twm9FVXDO",
:edit/time 1587674225280,
:edit/email "tangj1122@gmail.com"}
{:block/string "lab: data modeling",
:create/email "tangj1122@gmail.com",
:create/time 1587674480043,
:block/children
[{:block/string "do assertion tutorial and read tutorial",
:create/email "tangj1122@gmail.com",
:create/time 1587674516936,
:block/uid "pR4qtQoRi",
:edit/time 1587674520848,
:edit/email "tangj1122@gmail.com"}
{:block/string "design a schema",
:create/email "tangj1122@gmail.com",
:create/time 1587674520846,
:block/children
[{:block/string "pick small domain you know well",
:create/email "tangj1122@gmail.com",
:create/time 1587674525014,
:block/uid "_y55ud97O",
:edit/time 1587674532773,
:edit/email "tangj1122@gmail.com"}
{:block/string "draw entity/relationship diagram",
:create/email "tangj1122@gmail.com",
:create/time 1587674532756,
:block/uid "XXmfAfYhg",
:edit/time 1587674536466,
:edit/email "tangj1122@gmail.com"}
{:block/string "write schema as edn",
:create/email "tangj1122@gmail.com",
:create/time 1587674536455,
:block/uid "sNnAcFrSG",
:edit/time 1587674540174,
:edit/email "tangj1122@gmail.com"}
{:block/string "transact into db",
:create/email "tangj1122@gmail.com",
:create/time 1587674540172,
:block/uid "YPz-hXv6g",
:edit/time 1587674542733,
:edit/email "tangj1122@gmail.com"}],
:block/uid "HSimaZXv9",
:edit/time 1587674522976,
:edit/email "tangj1122@gmail.com"}],
:block/uid "c2hj8poAU",
:edit/time 1587674516315,
:edit/email "tangj1122@gmail.com"}],
:block/uid "h0E47v01B",
:edit/time 1587674077883,
:edit/email "tangj1122@gmail.com"}],
:block/uid "ZyPXQb67c",
:edit/time 1587673582173,
:edit/email "tangj1122@gmail.com"}],
:block/uid "mVajpEzoJ",
:edit/time 1587669595075,
:edit/email "tangj1122@gmail.com"}
{:block/string "Transaction Model: ACID",
:create/email "tangj1122@gmail.com",
:create/time 1587669595071,
:block/uid "jES2I9rP1",
:edit/time 1587669599371,
:edit/email "tangj1122@gmail.com"}
{:block/string "Query Model: Datalog and Pull",
:create/email "tangj1122@gmail.com",
:create/time 1587669599368,
:block/uid "rnjw4JJ_k",
:edit/time 1587670127113,
:edit/email "tangj1122@gmail.com"}
{:block/string "Programming Model: Datomic Ions",
:create/email "tangj1122@gmail.com",
:create/time 1587669603928,
:block/uid "YxdBd-eiN",
:edit/time 1587670124002,
:edit/email "tangj1122@gmail.com"}
{:block/string "Operation: leverage AWS, seamless scaling",
:create/email "tangj1122@gmail.com",
:create/time 1587669608660,
:block/uid "58Aobnrew",
:edit/time 1587669619222,
:edit/email "tangj1122@gmail.com"}
{:block/string "Comments",
:create/email "tangj1122@gmail.com",
:create/time 1587668093787,
:block/uid "hOflSSaat",
:edit/time 1587668201658,
:edit/email "tangj1122@gmail.com"}],
:block/uid "g4pTMbkK9",
:edit/time 1587665341591,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1587677287939,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587665706533,
:node/title "ACID",
:edit/time 1587665706534,
:edit/email "tangj1122@gmail.com"}
{:node/title "April 24th, 2020",
:block/children
[{:block/string "[[Athens Change Log]]",
:create/email "tangj1122@gmail.com",
:create/time 1587752725173,
:block/children
[{:block/string
"draft [[Create a Minimal Viable Alternative to Roam]]",
:create/email "tangj1122@gmail.com",
:create/time 1587752710740,
:block/uid "Gw-eFClM3",
:edit/time 1588448400529,
:edit/email "tangj1122@gmail.com"}],
:block/uid "Z3qbFMYsq",
:edit/time 1587752725173,
:edit/email "tangj1122@gmail.com"}
{:block/string "[[Open-Source Governance]]",
:create/email "tangj1122@gmail.com",
:create/time 1587752717655,
:block/uid "bgkqk6RUa",
:edit/time 1588448399933,
:edit/email "tangj1122@gmail.com"}
{:block/string "[[Hyperlink]]",
:create/email "tangj1122@gmail.com",
:create/time 1587778373849,
:block/uid "fBnJfVKqa",
:edit/time 1587778380502,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1587666992671}
{:create/email "tangj1122@gmail.com",
:create/time 1587667475372,
:node/title "accretion",
:edit/time 1587667475390,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587668510271,
:node/title "immutability",
:edit/time 1587668510274,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587669334050,
:node/title "n+1",
:edit/time 1587669334051,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587670409729,
:node/title "EDN",
:edit/time 1587670409745,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587671743176,
:node/title "RDF",
:edit/time 1587671743177,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587672784666,
:node/title "impedance",
:edit/time 1587672784668,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587673653220,
:node/title "transducers",
:edit/time 1587673653221,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587677301396,
:node/title "Day of Datomic On-Prem 2016",
:block/children
[{:block/string "type:: notes",
:create/email "tangj1122@gmail.com",
:create/time 1587677348477,
:block/uid "zD3NJTHsl",
:edit/time 1588517524421,
:edit/email "tangj1122@gmail.com"}
{:block/string
"source:: https://docs.datomic.com/on-prem/day-of-datomic.html",
:create/email "tangj1122@gmail.com",
:create/time 1587677346145,
:block/uid "bkdAxHZze",
:edit/time 1587677358770,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1587677400106,
:block/uid "UZiQrgyys",
:edit/time 1587677400106,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Going to assume 2016 covers the same content as in [[Day of Datomic Cloud 2018]]",
:create/email "tangj1122@gmail.com",
:create/time 1587677365307,
:block/children
[{:block/string "- cloud stuff",
:create/email "tangj1122@gmail.com",
:create/time 1587677429229,
:block/uid "sewoUaxnV",
:edit/time 1587677431977,
:edit/email "tangj1122@gmail.com"}
{:block/string "+ on-prem stuff",
:create/email "tangj1122@gmail.com",
:create/time 1587677431974,
:block/uid "wZw4V4_6b",
:edit/time 1587677435164,
:edit/email "tangj1122@gmail.com"}],
:block/uid "6iX8bCfxw",
:edit/time 1587677429012,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1587677352502,
:block/uid "OphwA4HvJ",
:edit/time 1587677352502,
:edit/email "tangj1122@gmail.com"}
{:block/string "Contents",
:create/email "tangj1122@gmail.com",
:create/time 1587677313237,
:block/children
[{:block/string "Intro",
:create/email "tangj1122@gmail.com",
:create/time 1587677316125,
:block/uid "s_d3LLx83",
:edit/time 1587677318665,
:edit/email "tangj1122@gmail.com"}
{:block/string "Information Model",
:create/email "tangj1122@gmail.com",
:create/time 1587677318662,
:block/uid "h6eovGGZX",
:edit/time 1587677323096,
:edit/email "tangj1122@gmail.com"}
{:block/string "Transactions",
:create/email "tangj1122@gmail.com",
:create/time 1587677323093,
:block/uid "iaWWl_8it",
:edit/time 1587677328958,
:edit/email "tangj1122@gmail.com"}
{:block/string "Query and Pull",
:create/email "tangj1122@gmail.com",
:create/time 1587677328955,
:block/uid "apzkym0rG",
:edit/time 1587677332707,
:edit/email "tangj1122@gmail.com"}
{:block/string "Operation & System Planning",
:create/email "tangj1122@gmail.com",
:create/time 1587677332705,
:block/children
[{:block/string "peers",
:create/email "tangj1122@gmail.com",
:create/time 1587677452495,
:block/children
[{:block/string
"Datomic distributes query to one or more peers, or one or more peer servers",
:create/email "tangj1122@gmail.com",
:create/time 1587677686242,
:block/children
[{:block/string
"Peer - intimately sharing memory with the JVM",
:create/email "tangj1122@gmail.com",
:create/time 1587677727614,
:block/uid "BqIZnzGWd",
:edit/time 1587677772322,
:edit/email "tangj1122@gmail.com"}
{:block/string "Peer Server - who clients connect to",
:create/email "tangj1122@gmail.com",
:create/time 1587677750879,
:block/uid "yc0XcqwkJ",
:edit/time 1587677763564,
:edit/email "tangj1122@gmail.com"}],
:block/uid "SvVL-5sNE",
:edit/time 1587677726863,
:edit/email "tangj1122@gmail.com"}
{:block/string "peers colocate query with app",
:create/email "tangj1122@gmail.com",
:create/time 1587677779142,
:block/children
[{:block/string "BYO query fns",
:create/email "tangj1122@gmail.com",
:create/time 1587677806973,
:block/uid "3mmjBwTxq",
:edit/time 1587677812362,
:edit/email "tangj1122@gmail.com"}
{:block/string "BYO transactions fns",
:create/email "tangj1122@gmail.com",
:create/time 1587677840991,
:block/children
[{:block/string "i.e. instead not just `add` or `retract`",
:create/email "tangj1122@gmail.com",
:create/time 1587677964912,
:block/uid "094h9qLZN",
:edit/time 1587677997850,
:edit/email "tangj1122@gmail.com"}
{:block/string "runs __inside__ txs",
:create/email "tangj1122@gmail.com",
:create/time 1587678080496,
:block/uid "wBe9LMceW",
:edit/time 1587678088074,
:edit/email "tangj1122@gmail.com"}
{:block/string
"superpower of tx ops: they have access to entire db",
:create/email "tangj1122@gmail.com",
:create/time 1587678018324,
:block/uid "5rE7WzKha",
:edit/time 1587678094226,
:edit/email "tangj1122@gmail.com"}
{:block/string "you can use Java, Scala, other langs",
:create/email "tangj1122@gmail.com",
:create/time 1587678094804,
:block/uid "GMlTRVWCA",
:edit/time 1587678162920,
:edit/email "tangj1122@gmail.com"}
{:block/string
"![](https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2Fy-dqlK_s7S?alt=media&token=aabec2e6-6a17-447e-9d07-e08b16c9934d)",
:block/uid "_2rQh-LnN",
:edit/time 1587678157923,
:edit/email "tangj1122@gmail.com"}],
:block/uid "JZ7EsGATV",
:edit/time 1587678077857,
:edit/email "tangj1122@gmail.com"}
{:block/string
"lazy entity API - good for \"wandering around\" your data ",
:create/email "tangj1122@gmail.com",
:create/time 1587677843513,
:ent/emojis
[{:ent/emoji {"native" "🧐"},
[:array :user]
[{:create/time 1587677912236,
:user/email "tangj1122@gmail.com"}]}],
:block/children
[{:block/string "pull better when in production",
:create/email "tangj1122@gmail.com",
:create/time 1587677866925,
:block/uid "B3ZkJt7QO",
:edit/time 1587677870953,
:edit/email "tangj1122@gmail.com"}],
:block/uid "xyCWuvjJk",
:edit/time 1587677881351,
:edit/email "tangj1122@gmail.com"}
{:block/string
"reflections against database orders of magnitude faster",
:create/email "tangj1122@gmail.com",
:create/time 1587677921002,
:block/uid "pRbuWlhFT",
:edit/time 1587677930106,
:edit/email "tangj1122@gmail.com"}
{:block/string "cross-db joins",
:create/email "tangj1122@gmail.com",
:create/time 1587677930103,
:block/uid "twWOvJN_3",
:edit/time 1587677932861,
:edit/email "tangj1122@gmail.com"}
{:block/string
"partition controls with structural, not just string, temp ids",
:create/email "tangj1122@gmail.com",
:create/time 1587677943921,
:block/uid "BJIyNrAkR",
:edit/time 1587677955684,
:edit/email "tangj1122@gmail.com"}],
:block/uid "t9zr4yWvC",
:edit/time 1587677801535,
:edit/email "tangj1122@gmail.com"}
{:block/string "tradeoffs",
:create/email "tangj1122@gmail.com",
:create/time 1587678258937,
:block/children
[{:block/string "bigger memory footprint",
:create/email "tangj1122@gmail.com",
:create/time 1587678226993,
:block/children
[{:block/string "already in JVM",
:create/email "tangj1122@gmail.com",
:create/time 1587678229740,
:block/uid "TQ9v2yG9L",
:edit/time 1587678233495,
:edit/email "tangj1122@gmail.com"}
{:block/string "but also bigger cache",
:create/email "tangj1122@gmail.com",
:create/time 1587678233493,
:block/uid "_9bjBHEeX",
:edit/time 1587678239113,
:edit/email "tangj1122@gmail.com"}
{:block/string "needs access to transactor and storage",
:create/email "tangj1122@gmail.com",
:create/time 1587678242898,
:block/uid "mpNQhJRZj",
:edit/time 1587678254559,
:edit/email "tangj1122@gmail.com"}],
:block/uid "ZM8lAkgGo",
:edit/time 1587678229743,
:edit/email "tangj1122@gmail.com"}
{:block/string "synchronous API",
:create/email "tangj1122@gmail.com",
:create/time 1587678279015,
:block/children
[{:block/string
"you have to write your own policy for max in-flight functions because it's in your control now",
:create/email "tangj1122@gmail.com",
:create/time 1587678281228,
:block/uid "_b0O8RZkf",
:edit/time 1587678341183,
:edit/email "tangj1122@gmail.com"}],
:block/uid "60xr8udHP",
:edit/time 1587678281230,
:edit/email "tangj1122@gmail.com"}
{:block/string "Q: Why don't you autoscale?",
:create/email "tangj1122@gmail.com",
:create/time 1587678383708,
:block/children
[{:block/string "We got caught by the cloud twice.",
:create/email "tangj1122@gmail.com",
:create/time 1587678387969,
:block/uid "PwNiS0dxh",
:edit/time 1587678537964,
:edit/email "tangj1122@gmail.com"}
{:block/string
"There wasn't a storage service we needed. We built an internal DynamoDB. 2 weeks before we were gonna launch Datomic, Amazon launched actual DynamoDB.",
:create/email "tangj1122@gmail.com",
:create/time 1587678394039,
:block/uid "5n0J3Oi1a",
:edit/time 1587678557831,
:edit/email "tangj1122@gmail.com"}
{:block/string "We switched to DynamoDB.",
:create/email "tangj1122@gmail.com",
:create/time 1587678468170,
:block/uid "nl-YjY0fR",
:edit/time 1587678478448,
:edit/email "tangj1122@gmail.com"}
{:block/string "Customers said they didn't use DynamoDB.",
:create/email "tangj1122@gmail.com",
:create/time 1587678478542,
:block/uid "VQqQvd9a_",
:edit/time 1587678563402,
:edit/email "tangj1122@gmail.com"}
{:block/string
"But we had a protocol now, that lets customers use any storage service.",
:create/email "tangj1122@gmail.com",
:create/time 1587678482285,
:block/uid "7eyi4LOKh",
:edit/time 1587678565180,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Thing about protocols is that it makes autoscaling incredibly hard.",
:create/email "tangj1122@gmail.com",
:create/time 1587678508119,
:block/uid "Rettvz6sF",
:edit/time 1587678577099,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Customers were evenly distributed in terms of storage services.",
:create/email "tangj1122@gmail.com",
:create/time 1587678517672,
:block/uid "4sReV5aF8",
:edit/time 1587678529582,
:edit/email "tangj1122@gmail.com"}
{:block/string
"For AWS Cloud, we would like that to go in that direction.",
:create/email "tangj1122@gmail.com",
:create/time 1587678592155,
:block/children
[{:block/string
"(As of today, Datomic does auto-scale, nice!)",
:create/email "tangj1122@gmail.com",
:create/time 1587678602812,
:block/uid "j2IaOC65L",
:edit/time 1587678620460,
:edit/email "tangj1122@gmail.com"}],
:block/uid "CtxTpbSLE",
:edit/time 1587678602814,
:edit/email "tangj1122@gmail.com"}],
:block/uid "YVeSixQnz",
:edit/time 1587678630786,
:edit/email "tangj1122@gmail.com"}],
:block/uid "vW1U-FDLr",
:edit/time 1587678261039,
:edit/email "tangj1122@gmail.com"}],
:block/uid "s2Od8T1a2",
:edit/time 1587677584915,
:edit/email "tangj1122@gmail.com"}
{:block/string "caching",
:create/email "tangj1122@gmail.com",
:create/time 1587677584907,
:block/children
[{:block/string
"![](https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2FYqIghgm9Zc?alt=media&token=d45cf23d-fbc7-4715-8ac4-61ec83077ca1)",
:block/uid "Vnc1OEko5",
:edit/time 1587678663761,
:edit/email "tangj1122@gmail.com"}
{:block/string
"TX Records return entire value of DB before and after TX. DBs are big. How is this possible? Multiple layers of caching.",
:create/email "tangj1122@gmail.com",
:create/time 1587678650689,
:block/children
[{:block/string
"Peers have in-memory Object Cache. Literally Java Objects that implement Datom interface",
:create/email "tangj1122@gmail.com",
:create/time 1587678755484,
:block/uid "C4MMMMUZc",
:edit/time 1587678881344,
:edit/email "tangj1122@gmail.com"}
{:block/string
"{{[[TODO]]}} memcached - ? I don't understand his explanation",
:create/email "tangj1122@gmail.com",
:create/time 1587678731334,
:block/uid "S92rSd0WG",
:edit/time 1587678951710,
:edit/email "tangj1122@gmail.com"}
{:block/string "Segment Storage",
:create/email "tangj1122@gmail.com",
:create/time 1587678944438,
:block/uid "LKytrAklN",
:edit/time 1587679215281,
:edit/email "tangj1122@gmail.com"}],
:block/uid "ehw6NTF46",
:edit/time 1587678831691,
:edit/email "tangj1122@gmail.com"}
{:block/string "Caching",
:create/email "tangj1122@gmail.com",
:create/time 1587679011661,
:block/children
[{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1587679099770,
:block/uid "-Xa3X3XLu",
:edit/time 1587679099770,
:edit/email "tangj1122@gmail.com"}],
:block/uid "nTp9ibyNw",
:edit/time 1587679015239,
:edit/email "tangj1122@gmail.com"}
{:block/string "only one knob: how much",
:create/email "tangj1122@gmail.com",
:create/time 1587679015236,
:block/uid "_2oXlcm2p",
:edit/time 1587679115715,
:edit/email "tangj1122@gmail.com"}
{:block/string
"stored as segments (1000s of datoms), not individual datoms",
:create/email "tangj1122@gmail.com",
:create/time 1587679021119,
:block/uid "B2VkCXIkY",
:edit/time 1587679035156,
:edit/email "tangj1122@gmail.com"}
{:block/string
"avoids [[n+1]] problem by amortizing cost of roundtrip, pulling segments",
:create/email "tangj1122@gmail.com",
:create/time 1587679035552,
:block/uid "RkjLZHzkn",
:edit/time 1587679125617,
:edit/email "tangj1122@gmail.com"}
{:block/string "segments immutable, never expire",
:create/email "tangj1122@gmail.com",
:create/time 1587679088260,
:block/uid "ebmbGmGTG",
:edit/time 1587679099775,
:edit/email "tangj1122@gmail.com"}
{:block/string
"![](https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2FcUw9bumNEl?alt=media&token=7ccb3ec2-8fb7-4969-8195-6c7ad5075e1a)",
:block/props
{"image-size"
{"https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2FcUw9bumNEl?alt=media&token=7ccb3ec2-8fb7-4969-8195-6c7ad5075e1a"
{"width" 328, "height" nil}}},
:block/uid "ZmbeqSVOI",
:edit/time 1587679139504,
:edit/email "tangj1122@gmail.com"}],
:block/uid "we35az8h_",
:edit/time 1587677585744,
:edit/email "tangj1122@gmail.com"}
{:block/string "indexing",
:create/email "tangj1122@gmail.com",
:create/time 1587677585738,
:block/children
[{:block/string
"![](https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2FksTmOE8bNs?alt=media&token=bc60c66b-24e3-4f70-8b4b-1321d5cc57e8)",
:block/uid "aovAt2U9o",
:edit/time 1587679271195,
:edit/email "tangj1122@gmail.com"}
{:block/string
"If you had an append-only db where you had to rewrite the durable storage tree on every tx, would be slow.",
:create/email "tangj1122@gmail.com",
:create/time 1587679230125,
:block/uid "zO_I8mOcN",
:edit/time 1587679324275,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Instead, maintain recent history in in-memory process, ~32GB of Java Objects",
:create/email "tangj1122@gmail.com",
:create/time 1587679324272,
:block/uid "ByTLZ4G4B",
:edit/time 1587679339751,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Rewriting index trees every 32MB rather than every tx, in background.",
:create/email "tangj1122@gmail.com",
:create/time 1587679340852,
:block/uid "6fgMDpjgn",
:edit/time 1587679520278,
:edit/email "tangj1122@gmail.com"}
{:block/string
"None of concerns of append-only databases have applied because we thought about it since the beginning.",
:create/email "tangj1122@gmail.com",
:create/time 1587679371131,
:block/uid "wso_QUwmN",
:edit/time 1587679398876,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Done on the transactor, a beefier machine, 3-4+ threads",
:create/email "tangj1122@gmail.com",
:create/time 1587679398873,
:block/uid "GctLgPjfG",
:edit/time 1587679420461,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Write to log on each TX, don't rebuild tree on each TX. Duh",
:create/email "tangj1122@gmail.com",
:create/time 1587679420460,
:block/uid "o7aGt23yU",
:edit/time 1587679502123,
:edit/email "tangj1122@gmail.com"}
{:block/string "Each Peer will rebuild the most recent tree",
:create/email "tangj1122@gmail.com",
:create/time 1587679502879,
:block/uid "JfMbGLDQ4",
:edit/time 1587679529459,
:edit/email "tangj1122@gmail.com"}
{:block/string "index trees",
:create/email "tangj1122@gmail.com",
:create/time 1587679542286,
:block/children
[{:block/string "persistent persistent data structures",
:create/email "tangj1122@gmail.com",
:create/time 1587679544471,
:block/children
[{:block/string "1. durable",
:create/email "tangj1122@gmail.com",
:create/time 1587679551485,
:block/uid "wIq4JRhyW",
:edit/time 1587679632008,
:edit/email "tangj1122@gmail.com"}
{:block/string
"2. accumulate only, new versions include previous versions, like Clojure",
:create/email "tangj1122@gmail.com",
:create/time 1587679556396,
:block/uid "1AMrpIJks",
:edit/time 1587679642202,
:edit/email "tangj1122@gmail.com"}],
:block/uid "vY7Xmzb8U",
:edit/time 1587679629430,
:edit/email "tangj1122@gmail.com"}
{:block/string
"but branching factor bigger: 1000 branches per level, 3 levels -> 1 billion nodes",
:create/email "tangj1122@gmail.com",
:create/time 1587679590887,
:block/uid "wxWNA-cVo",
:edit/time 1587679652205,
:edit/email "tangj1122@gmail.com"}
{:block/string
"> 1 BN root node gets fat because it doesn't split",
:create/email "tangj1122@gmail.com",
:create/time 1587679658714,
:block/uid "9_ocwELtN",
:edit/time 1587679669980,
:edit/email "tangj1122@gmail.com"}
{:block/string "100BN is about the capacity of one Datomic",
:create/email "tangj1122@gmail.com",
:create/time 1587679607761,
:block/uid "fKXjYa9n_",
:edit/time 1587679850250,
:edit/email "tangj1122@gmail.com"}],
:block/uid "S2EmV5IAt",
:edit/time 1587679544473,
:edit/email "tangj1122@gmail.com"}],
:block/uid "vObdRCtCy",
:edit/time 1587677586541,
:edit/email "tangj1122@gmail.com"}
{:block/string "storage",
:create/email "tangj1122@gmail.com",
:create/time 1587677586538,
:block/children
[{:block/string "dev - local disk",
:create/email "tangj1122@gmail.com",
:create/time 1587679850999,
:block/uid "cdSm-D61z",
:edit/time 1587679861546,
:edit/email "tangj1122@gmail.com"}
{:block/string "prod",
:create/email "tangj1122@gmail.com",
:create/time 1587679896964,
:block/children
[{:block/string "DynamoDB",
:create/email "tangj1122@gmail.com",
:create/time 1587679853598,
:block/uid "L1ydSy_s2",
:edit/time 1587679864680,
:edit/email "tangj1122@gmail.com"}
{:block/string "Cassandra",
:create/email "tangj1122@gmail.com",
:create/time 1587679869169,
:block/uid "CjwmAHRmA",
:edit/time 1587679870798,
:edit/email "tangj1122@gmail.com"}
{:block/string "SQL (any JDBC)",
:create/email "tangj1122@gmail.com",
:create/time 1587679864677,
:block/children
[{:block/string "Oracle",
:create/email "tangj1122@gmail.com",
:create/time 1587679874095,
:block/uid "asxvVAU-k",
:edit/time 1587679875471,
:edit/email "tangj1122@gmail.com"}
{:block/string "Postgres",
:create/email "tangj1122@gmail.com",
:create/time 1587679875468,
:block/uid "DYHgAm4yE",
:edit/time 1587679877372,
:edit/email "tangj1122@gmail.com"}
{:block/string "SqlServer",
:create/email "tangj1122@gmail.com",
:create/time 1587679908859,
:block/uid "cM2C7He2H",
:edit/time 1587679911230,
:edit/email "tangj1122@gmail.com"}
{:block/string "MySQL",
:create/email "tangj1122@gmail.com",
:create/time 1587679877369,
:block/uid "t2zTPNSPA",
:edit/time 1587679879062,
:edit/email "tangj1122@gmail.com"}],
:block/uid "VcLksXU8c",
:edit/time 1587679873362,
:edit/email "tangj1122@gmail.com"}
{:block/string "legacy",
:create/email "tangj1122@gmail.com",
:create/time 1587679937049,
:block/children
[{:block/string "RIAK",
:create/email "tangj1122@gmail.com",
:create/time 1587679938482,
:block/uid "0uWUe09OL",
:edit/time 1587679939396,
:edit/email "tangj1122@gmail.com"}
{:block/string "CouchBase",
:create/email "tangj1122@gmail.com",
:create/time 1587679939393,
:block/uid "EJtVixlRF",
:edit/time 1587679943649,
:edit/email "tangj1122@gmail.com"}],
:block/uid "FSWLOjWxf",
:edit/time 1587679938484,
:edit/email "tangj1122@gmail.com"}],
:block/uid "7T1EFgDed",
:edit/time 1587679900988,
:edit/email "tangj1122@gmail.com"}
{:block/string "choosing storage",
:create/email "tangj1122@gmail.com",
:create/time 1587679965798,
:block/children
[{:block/string "more important",
:create/email "tangj1122@gmail.com",
:create/time 1587680083064,
:block/children
[{:block/string
"familiarity - choose the one you know how to operate",
:create/email "tangj1122@gmail.com",
:create/time 1587679968245,
:block/uid "bSXg0f9LY",
:edit/time 1587679988148,
:edit/email "tangj1122@gmail.com"}
{:block/string "manageability - basically same as above",
:create/email "tangj1122@gmail.com",
:create/time 1587679992094,
:block/uid "ssBa3OybU",
:edit/time 1587680099911,
:edit/email "tangj1122@gmail.com"}
{:block/string "reliability",
:create/email "tangj1122@gmail.com",
:create/time 1587679989915,
:block/uid "I7K4eM-tL",
:edit/time 1587679992098,
:edit/email "tangj1122@gmail.com"}],
:block/uid "JRqF2PhP9",
:edit/time 1587680085344,
:edit/email "tangj1122@gmail.com"}
{:block/string "less important",
:create/email "tangj1122@gmail.com",
:create/time 1587680004596,
:block/children
[{:block/string
"Datomic insulates storage from reads with memcached",
:create/email "tangj1122@gmail.com",
:create/time 1587680007093,
:block/uid "kSFfQOj71",
:edit/time 1587680022682,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Datomic insulates storage from writes because transactor is a single-write system",
:create/email "tangj1122@gmail.com",
:create/time 1587680023237,
:block/uid "0ufnIK44q",
:edit/time 1587680048536,
:edit/email "tangj1122@gmail.com"}],
:block/uid "9kWk9xJ2z",
:edit/time 1587680007096,
:edit/email "tangj1122@gmail.com"}],
:block/uid "lqdrGbbH2",
:edit/time 1587679968247,
:edit/email "tangj1122@gmail.com"}],
:block/uid "1AZJeDvc1",
:edit/time 1587677587845,
:edit/email "tangj1122@gmail.com"}
{:block/string "transactors",
:create/email "tangj1122@gmail.com",
:create/time 1587677587842,
:block/children
[{:block/string
"You probably want 2 transactor processes at once.",
:create/email "tangj1122@gmail.com",
:create/time 1587680270121,
:block/uid "LRb_OAdU7",
:edit/time 1587680289366,
:edit/email "tangj1122@gmail.com"}
{:block/string "One is active, one is standby.",
:create/email "tangj1122@gmail.com",
:create/time 1587680292078,
:block/uid "skVHno2lB",
:edit/time 1587680347775,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Both check status with conditionals on storage beacon.",
:create/email "tangj1122@gmail.com",
:create/time 1587680346634,
:block/uid "4bpUQ0UH2",
:edit/time 1587680423920,
:edit/email "tangj1122@gmail.com"}
{:block/string "If one fails, other takes over.",
:create/email "tangj1122@gmail.com",
:create/time 1587680359476,
:block/uid "6PgS0WU0c",
:edit/time 1587680442068,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Couldn't write both at the same time, worst-case is lack of availability.",
:create/email "tangj1122@gmail.com",
:create/time 1587680442065,
:block/uid "OY9p_cRtR",
:edit/time 1587680465961,
:edit/email "tangj1122@gmail.com"}],
:block/uid "J2vIfPdz2",
:edit/time 1587677589794,
:edit/email "tangj1122@gmail.com"}
{:block/string "monitoring",
:create/email "tangj1122@gmail.com",
:create/time 1587677589791,
:block/uid "vn118W2as",
:edit/time 1587677590883,
:edit/email "tangj1122@gmail.com"}
{:block/string "capacity planning and tradeoffs",
:create/email "tangj1122@gmail.com",
:create/time 1587677590880,
:block/children
[{:block/string
"Datomic main trade-off: ACID-compliance over availability.",
:create/email "tangj1122@gmail.com",
:create/time 1587680470401,
:block/uid "LqccxrZRT",
:edit/time 1587680488231,
:edit/email "tangj1122@gmail.com"}
{:block/string
"there is no hard limit, but don't put 100 billion datoms in Datomic",
:create/email "tangj1122@gmail.com",
:create/time 1587680559303,
:block/uid "6S4eVeXo8",
:edit/time 1587680599692,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Good fit for read-scale system: information for record. Asking new and different questions about your data",
:create/email "tangj1122@gmail.com",
:create/time 1587680599689,
:block/children
[{:block/string "tx data",
:create/email "tangj1122@gmail.com",
:create/time 1587680830424,
:block/uid "_av4vfPBp",
:edit/time 1587680833589,
:edit/email "tangj1122@gmail.com"}
{:block/string "business records",
:create/email "tangj1122@gmail.com",
:create/time 1587680833587,
:block/uid "NwGWjUUHV",
:edit/time 1587680835191,
:edit/email "tangj1122@gmail.com"}
{:block/string "medical records",
:create/email "tangj1122@gmail.com",
:create/time 1587680835189,
:block/uid "qphpG3lJW",
:edit/time 1587680837424,
:edit/email "tangj1122@gmail.com"}
{:block/string "financial records",
:create/email "tangj1122@gmail.com",
:create/time 1587680837421,
:block/uid "bratj4yl6",
:edit/time 1587680840140,
:edit/email "tangj1122@gmail.com"}
{:block/string "scientific records",
:create/email "tangj1122@gmail.com",
:create/time 1587680840138,
:block/uid "c6JE0c2CP",
:edit/time 1587680842469,
:edit/email "tangj1122@gmail.com"}
{:block/string "inventory",
:create/email "tangj1122@gmail.com",
:create/time 1587680842466,
:block/uid "RG-Y5NlPp",
:edit/time 1587680843749,
:edit/email "tangj1122@gmail.com"}
{:block/string "config",
:create/email "tangj1122@gmail.com",
:create/time 1587680843746,
:block/uid "aQ806GygB",
:edit/time 1587680844503,
:edit/email "tangj1122@gmail.com"}
{:block/string "web apps",
:create/email "tangj1122@gmail.com",
:create/time 1587680844500,
:block/uid "3CSDgtmNL",
:edit/time 1587680845605,
:edit/email "tangj1122@gmail.com"}
{:block/string "cloud apps",
:create/email "tangj1122@gmail.com",
:create/time 1587680845603,
:block/uid "G6CLBr7Fv",
:edit/time 1587680846832,
:edit/email "tangj1122@gmail.com"}
{:block/string "departmental data",
:create/email "tangj1122@gmail.com",
:create/time 1587680846830,
:block/uid "FZrV-YzL4",
:edit/time 1587680851305,
:edit/email "tangj1122@gmail.com"}],
:block/uid "L3oK66iXj",
:edit/time 1587680923534,
:edit/email "tangj1122@gmail.com"}
{:block/string "Poor fit for write-scale system",
:create/email "tangj1122@gmail.com",
:create/time 1587680785854,
:block/children
[{:block/string
"capture everything and some day it will matter",
:create/email "tangj1122@gmail.com",
:create/time 1587680643361,
:ent/emojis
[{:ent/emoji {"native" "🤔"},
[:array :user]
[{:create/time 1587680696551,
:user/email "tangj1122@gmail.com"}]}],
:block/uid "uTStpTozN",
:edit/time 1587680894082,
:edit/email "tangj1122@gmail.com"}
{:block/string
"media storage (unstructured docs, audio, video)",
:create/email "tangj1122@gmail.com",
:create/time 1587680793662,
:block/uid "BpCl0xHxa",
:edit/time 1587680810530,
:edit/email "tangj1122@gmail.com"}
{:block/string "churn (hit counter)",
:create/email "tangj1122@gmail.com",
:create/time 1587680797857,
:block/uid "ZKF4XrNxs",
:edit/time 1587680803241,
:edit/email "tangj1122@gmail.com"}],
:block/uid "A1qGJ76VL",
:edit/time 1587680897460,
:edit/email "tangj1122@gmail.com"}],
:block/uid "OmHYSVgSY",
:edit/time 1587680964749,
:edit/email "tangj1122@gmail.com"}
{:block/string "buzzwords",
:create/email "tangj1122@gmail.com",
:create/time 1587680990431,
:block/children
[{:block/string
"![](https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2FgLqH7MKRzF?alt=media&token=7186968c-3f75-4fb1-8d28-ce94de56d80b)",
:block/uid "pJ6oYAdNX",
:edit/time 1587680990433,
:edit/email "tangj1122@gmail.com"}],
:block/uid "Admjy6aGi",
:edit/time 1587680990431,
:edit/email "tangj1122@gmail.com"}],
:block/uid "9w94kq-MC",
:edit/time 1587677340146,
:edit/email "tangj1122@gmail.com"}],
:block/uid "RFyH1FPz4",
:edit/time 1587677316085,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1587677301398,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587746901851,
:node/title "Create a Minimal Viable Alternative to Roam",
:block/children
[{:block/string "type:: [[Objective]]",
:create/email "tangj1122@gmail.com",
:create/time 1587746928611,
:block/uid "a62Hc7Hkf",
:edit/time 1587746932414,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1588713351994,
:block/uid "qxPOCB-q8",
:edit/time 1588713351994,
:edit/email "tangj1122@gmail.com"}
{:block/string
"EDIT: most of the content within this block is not up to date. Instead, refer to the block after.",
:create/email "tangj1122@gmail.com",
:create/time 1588445302939,
:block/children
[{:block/string
"See [Feature Comparison: Roam vs Athens](https://www.notion.so/tangjeff0/5bee1e28345e459697292c2ada581aad?v=56c0f23f3e154a5b8337a0edc6a0fb16) Notion table.",
:create/email "tangj1122@gmail.com",
:create/time 1587746949103,
:block/uid "e_OM5cZil",
:edit/time 1588713359127,
:edit/email "tangj1122@gmail.com"}
{:block/string "Specifications",
:create/email "tangj1122@gmail.com",
:create/time 1587746932921,
:block/children
[{:block/string "{{[[DONE]]}} plaintext-only",
:create/email "tangj1122@gmail.com",
:create/time 1587747134239,
:block/uid "uYf1hhwyo",
:edit/time 1587774057619,
:edit/email "tangj1122@gmail.com"}
{:block/string
"{{[[DONE]]}} single-player: no shared permissions, not publicly viewable",
:create/email "tangj1122@gmail.com",
:create/time 1587747231057,
:block/uid "2Qf_F-cRc",
:edit/time 1587774070377,
:edit/email "tangj1122@gmail.com"}
{:block/string
"{{[[DONE]]}} only supports import with the process specified in [[Using Your Roam DB with Athens]]",
:create/email "tangj1122@gmail.com",
:create/time 1587747458742,
:block/children
[{:block/string "((dVxq5nTWd))",
:create/email "tangj1122@gmail.com",
:create/time 1587750135951,
:block/uid "B5JVZJN-z",
:edit/time 1587750150175,
:edit/email "tangj1122@gmail.com"}],
:block/uid "gTlfkOA87",
:edit/time 1587774078125,
:edit/email "tangj1122@gmail.com"}
{:block/string "{{[[TODO]]}} search",
:create/email "tangj1122@gmail.com",
:create/time 1587746984853,
:block/children
[{:block/string "{{[[TODO]]}} search bar",
:create/email "tangj1122@gmail.com",
:create/time 1587774168776,
:block/uid "-B0sYer9x",
:edit/time 1587774171068,
:edit/email "tangj1122@gmail.com"}
{:block/string
"{{[[TODO]]}} show suggestions when typing links",
:create/email "tangj1122@gmail.com",
:create/time 1587774158958,
:block/uid "CFUKHnlOj",
:edit/time 1587774448565,
:edit/email "tangj1122@gmail.com"}
{:block/string
"{{[[TODO]]}} show suggestions when typing block refs",
:block/uid "2wwIS0A0A",
:edit/time 1587774446754,
:edit/email "tangj1122@gmail.com"}],
:block/uid "r4hm2cYx2",
:edit/time 1587774168780,
:edit/email "tangj1122@gmail.com"}
{:block/string "{{[[TODO]]}} same link behavior as Roam",
:create/email "tangj1122@gmail.com",
:create/time 1587746982273,
:block/children
[{:block/string "{{[[TODO]]}} valid links",
:create/email "tangj1122@gmail.com",
:create/time 1587747303773,
:block/children
[{:block/string "{{[[DONE]]}} normal tags\n```#tag```",
:create/email "tangj1122@gmail.com",
:create/time 1587747071491,
:block/uid "shbJaSSLq",
:edit/time 1588670622036,
:edit/email "rjagodic@gmail.com"}
{:block/string "{{[[DONE]]}} normal links\n```[[link]]```",
:create/email "tangj1122@gmail.com",
:create/time 1587774232945,
:block/uid "zvImO45RS",
:edit/time 1587774328554,
:edit/email "tangj1122@gmail.com"}
{:block/string
"{{[[TODO]]}} long tag\n```#[[long tags]]```",
:create/email "tangj1122@gmail.com",
:create/time 1587774224821,
:block/uid "1cdx17TbF",
:edit/time 1588743725774,
:edit/email "jake@jakelunniss.com"}
{:block/string
"{{[[TODO]]}} recursive/nested links\n```[[recursive [[link]]]]```",
:create/email "tangj1122@gmail.com",
:create/time 1587774241810,
:block/uid "7aE8qHlW5",
:edit/time 1588863738871,
:edit/email "kangland.yang@gmail.com"}],
:block/uid "8HYy4jvjK",
:edit/time 1587773993593,
:edit/email "tangj1122@gmail.com"}
{:block/string
"{{[[TODO]]}} typing a link that hasn't been created yet will create a page",
:create/email "tangj1122@gmail.com",
:create/time 1587747321582,
:block/uid "0yMwWM5Kw",
:edit/time 1587773997892,
:edit/email "tangj1122@gmail.com"}],
:block/uid "zl6XIW4s1",
:edit/time 1587774050879,
:edit/email "tangj1122@gmail.com"}
{:block/string "{{[[TODO]]}} same block behavior as Roam",
:create/email "tangj1122@gmail.com",
:create/time 1587747370162,
:block/children
[{:block/string "{{[[TODO]]}} draggable",
:create/email "tangj1122@gmail.com",
:create/time 1587747034360,
:block/uid "79gfjW5Ad",
:edit/time 1587774045731,
:edit/email "tangj1122@gmail.com"}
{:block/string
"{{[[TODO]]}} can toggle open/close state of blocks",
:create/email "tangj1122@gmail.com",
:create/time 1587747037908,
:block/uid "hb3RA3NMT",
:edit/time 1587774047395,
:edit/email "tangj1122@gmail.com"}
{:block/string "{{[[DONE]]}} deep transclusions",
:create/email "tangj1122@gmail.com",
:create/time 1587750026557,
:block/children
[{:block/string "((TjboRvvlm))",
:create/email "tangj1122@gmail.com",
:create/time 1587750030165,
:block/children
[{:block/string "((WShS08tGx))",
:create/email "tangj1122@gmail.com",
:create/time 1587750045400,
:block/uid "tfRDkmmhS",
:edit/time 1587750049840,
:edit/email "tangj1122@gmail.com"}],
:block/uid "WShS08tGx",
:edit/time 1587750045403,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Athens only has one level of transclusion currently",
:create/email "tangj1122@gmail.com",
:create/time 1587774391619,
:block/uid "eFS7vZFWe",
:edit/time 1587774532227,
:edit/email "tangj1122@gmail.com"}],
:block/uid "TjboRvvlm",
:edit/time 1588276441155,
:edit/email "tangj1122@gmail.com"}],
:block/uid "UxbY48ffJ",
:edit/time 1587773984755,
:edit/email "tangj1122@gmail.com"}
{:block/string "{{[[TODO]]}} responsive design",
:create/email "tangj1122@gmail.com",
:create/time 1587747056838,
:block/children
[{:block/string
"{{[[TODO]]}} pick a design system CSS library such as Bulma, Tachyon, or Tailwind",
:create/email "tangj1122@gmail.com",
:create/time 1587774661200,
:block/uid "bscuC5hUh",
:edit/time 1587774843426,
:edit/email "tangj1122@gmail.com"}
{:block/string
"But styling, other than for layout and dev experience, does not need to be done until the very end.",
:create/email "tangj1122@gmail.com",
:create/time 1587774989893,
:block/uid "PmIYZGiMH",
:edit/time 1587998371766,
:edit/email "tangj1122@gmail.com"}],
:block/uid "957B-Np01",
:edit/time 1587774478106,
:edit/email "tangj1122@gmail.com"}
{:block/string
"{{[[TODO]]}} can run on normal hardware, i.e. can run a database, server, and browser without too much trouble",
:create/email "tangj1122@gmail.com",
:create/time 1587747199291,
:block/uid "yBVTBE4kJ",
:edit/time 1588098701364,
:edit/email "tangj1122@gmail.com"}],
:block/uid "wzBJGmbyo",
:edit/time 1588098512010,
:edit/email "tangj1122@gmail.com"}
{:block/string "Explicit Exclusions",
:create/email "tangj1122@gmail.com",
:create/time 1587746932411,
:block/children
[{:block/string "No slash commands",
:create/email "tangj1122@gmail.com",
:create/time 1587747141094,
:block/children
[{:block/string "TODO",
:create/email "tangj1122@gmail.com",
:create/time 1587747945998,
:block/uid "saOCPguQW",
:edit/time 1587747946131,
:edit/email "tangj1122@gmail.com"}
{:block/string "Page Reference",
:create/email "tangj1122@gmail.com",
:create/time 1587747945998,
:block/uid "_zcH6i1Ke",
:edit/time 1587747946133,
:edit/email "tangj1122@gmail.com"}
{:block/string "Upload an Image",
:create/email "tangj1122@gmail.com",
:create/time 1587747945998,
:block/uid "bmwDU5V94",
:edit/time 1587747946133,
:edit/email "tangj1122@gmail.com"}
{:block/string "Block Reference",
:create/email "tangj1122@gmail.com",
:create/time 1587747945998,
:block/uid "1JSANzP3p",
:edit/time 1587747946133,
:edit/email "tangj1122@gmail.com"}
{:block/string "Slider",
:create/email "tangj1122@gmail.com",
:create/time 1587747945998,
:block/uid "Cg6s7sO85",
:edit/time 1587747946134,
:edit/email "tangj1122@gmail.com"}
{:block/string "Block Embed",
:create/email "tangj1122@gmail.com",
:create/time 1587747945998,
:block/uid "gnZg5tTJa",
:edit/time 1587747946136,
:edit/email "tangj1122@gmail.com"}
{:block/string "Current Time",
:create/email "tangj1122@gmail.com",
:create/time 1587747945998,
:block/uid "pOkorrVn9",
:edit/time 1587747946136,
:edit/email "tangj1122@gmail.com"}
{:block/string "Date Picker",
:create/email "tangj1122@gmail.com",
:create/time 1587747945998,
:block/uid "qY-cbHt_z",
:edit/time 1587747946137,
:edit/email "tangj1122@gmail.com"}
{:block/string "Today",
:create/email "tangj1122@gmail.com",
:create/time 1587747945998,
:block/uid "x2C00Wzru",
:edit/time 1587747946137,
:edit/email "tangj1122@gmail.com"}
{:block/string "Tomorrow",
:create/email "tangj1122@gmail.com",
:create/time 1587747945998,
:block/uid "IpP51WhET",
:edit/time 1587747946140,
:edit/email "tangj1122@gmail.com"}
{:block/string "Yesterday",
:create/email "tangj1122@gmail.com",
:create/time 1587747945998,
:block/uid "rcM89I8k2",
:edit/time 1587747946140,
:edit/email "tangj1122@gmail.com"}
{:block/string "Embed Youtube Video",
:create/email "tangj1122@gmail.com",
:create/time 1587747945998,
:block/uid "zxloCmg9l",
:edit/time 1587747946140,
:edit/email "tangj1122@gmail.com"}
{:block/string "External Link",
:create/email "tangj1122@gmail.com",
:create/time 1587747945998,
:block/uid "1lLe_4y3m",
:edit/time 1587747946140,
:edit/email "tangj1122@gmail.com"}
{:block/string "Bold",
:create/email "tangj1122@gmail.com",
:create/time 1587747945998,
:block/uid "xAV9jILrg",
:edit/time 1587747946145,
:edit/email "tangj1122@gmail.com"}
{:block/string "Cmd-b",
:create/email "tangj1122@gmail.com",
:create/time 1587747945998,
:block/uid "cWj09mIVs",
:edit/time 1587747946145,
:edit/email "tangj1122@gmail.com"}
{:block/string "Italics",
:create/email "tangj1122@gmail.com",
:create/time 1587747945998,
:block/uid "0rL4Ll5nJ",
:edit/time 1587747946146,
:edit/email "tangj1122@gmail.com"}
{:block/string "Cmd-i",
:create/email "tangj1122@gmail.com",
:create/time 1587747945998,
:block/uid "OVLS1yqeF",
:edit/time 1587747946146,
:edit/email "tangj1122@gmail.com"}
{:block/string "Strikethrough",
:create/email "tangj1122@gmail.com",
:create/time 1587747945998,
:block/uid "GXfZejjP1",
:edit/time 1587747946149,
:edit/email "tangj1122@gmail.com"}
{:block/string "Code Inline",
:create/email "tangj1122@gmail.com",
:create/time 1587747945998,
:block/uid "R2sInU6pX",
:edit/time 1587747946149,
:edit/email "tangj1122@gmail.com"}
{:block/string "Latex",
:create/email "tangj1122@gmail.com",
:create/time 1587747945998,
:block/uid "J5h9XTtrj",
:edit/time 1587747946149,
:edit/email "tangj1122@gmail.com"}
{:block/string "Code Block",
:create/email "tangj1122@gmail.com",
:create/time 1587747945998,
:block/uid "G5iseKbNT",
:edit/time 1587747946149,
:edit/email "tangj1122@gmail.com"}
{:block/string "Image Markdown",
:create/email "tangj1122@gmail.com",
:create/time 1587747945998,
:block/uid "kopSKulOm",
:edit/time 1587747946153,
:edit/email "tangj1122@gmail.com"}
{:block/string "Table",
:create/email "tangj1122@gmail.com",
:create/time 1587747945998,
:block/uid "Oe80OV32P",
:edit/time 1587747946153,
:edit/email "tangj1122@gmail.com"}
{:block/string "Page Mentions",
:create/email "tangj1122@gmail.com",
:create/time 1587747945998,
:block/uid "jPmfFUbk2",
:edit/time 1587747946153,
:edit/email "tangj1122@gmail.com"}
{:block/string "Block Mentions",
:create/email "tangj1122@gmail.com",
:create/time 1587747945998,
:block/uid "88T63gDoD",
:edit/time 1587747946153,
:edit/email "tangj1122@gmail.com"}
{:block/string "Word Count",
:create/email "tangj1122@gmail.com",
:create/time 1587747945998,
:block/uid "ZHjF_okev",
:edit/time 1587747946156,
:edit/email "tangj1122@gmail.com"}
{:block/string "Find orphan blocks",
:create/email "tangj1122@gmail.com",
:create/time 1587747945998,
:block/uid "WPoKFVT1V",
:edit/time 1587747946156,
:edit/email "tangj1122@gmail.com"}],
:block/uid "L1TXjj9KT",
:edit/time 1587747762107,
:edit/email "tangj1122@gmail.com"}
{:block/string "No context-menu and any features it has",
:create/email "tangj1122@gmail.com",
:create/time 1587749245791,
:block/children
[{:block/string "Copy block ref",
:create/email "tangj1122@gmail.com",
:create/time 1587749495760,
:block/uid "5YD2qNaoa",
:edit/time 1587749495770,
:edit/email "tangj1122@gmail.com"}
{:block/string "Open in sidebar",
:create/email "tangj1122@gmail.com",
:create/time 1587749495760,
:block/uid "xN4oqxeaI",
:edit/time 1587749495770,
:edit/email "tangj1122@gmail.com"}
{:block/string "Expand all",
:create/email "tangj1122@gmail.com",
:create/time 1587749495760,
:block/uid "AFA3nWcOd",
:edit/time 1587749495770,
:edit/email "tangj1122@gmail.com"}
{:block/string "Collapse all",
:create/email "tangj1122@gmail.com",
:create/time 1587749495760,
:block/uid "5XopcGF02",
:edit/time 1587749495770,
:edit/email "tangj1122@gmail.com"}
{:block/string "Zoom In",
:create/email "tangj1122@gmail.com",
:create/time 1587749495760,
:block/uid "uB2ZunLFC",
:edit/time 1587749740479,
:edit/email "tangj1122@gmail.com"}
{:block/string "Add reaction",
:create/email "tangj1122@gmail.com",
:create/time 1587749495760,
:ent/emojis
[{:ent/emoji {"native" "😢"},
[:array :user]
[{:create/time 1587751802172,
:user/email "tangj1122@gmail.com"}]}],
:block/uid "zDjAHp-Ci",
:edit/time 1587749495770,
:edit/email "tangj1122@gmail.com"}
{:block/string "Make TODO",
:create/email "tangj1122@gmail.com",
:create/time 1587749495760,
:block/uid "KxyZ-MEvZ",
:edit/time 1587749495770,
:edit/email "tangj1122@gmail.com"}
{:block/string "Add version",
:create/email "tangj1122@gmail.com",
:create/time 1587749495760,
:block/children
[{:block/string "v1",
:create/email "tangj1122@gmail.com",
:create/time 1587749677288,
:block/uid "MwI16mKtl",
:edit/time 1587749695606,
:edit/email "tangj1122@gmail.com"}],
:block/uid "19nn9OWvG",
:edit/time 1587749495770,
:edit/email "tangj1122@gmail.com"}
{:block/string "ctrl-comma",
:create/email "tangj1122@gmail.com",
:create/time 1587749495760,
:block/uid "6e2hyG7S9",
:edit/time 1587749495770,
:edit/email "tangj1122@gmail.com"}
{:block/string "View as Numbered List",
:create/email "tangj1122@gmail.com",
:create/time 1587749495760,
:block/children
[{:block/string "1",
:create/email "tangj1122@gmail.com",
:create/time 1587749651846,
:block/uid "hT-q_tx3h",
:edit/time 1587749652528,
:edit/email "tangj1122@gmail.com"}
{:block/string "2",
:create/email "tangj1122@gmail.com",
:create/time 1587749652524,
:block/uid "gJYb41Fze",
:edit/time 1587749653339,
:edit/email "tangj1122@gmail.com"}],
:block/uid "iFX80m4TH",
:edit/time 1587749495770,
:edit/email "tangj1122@gmail.com"}
{:block/string "View as Document",
:create/email "tangj1122@gmail.com",
:create/time 1587749495760,
:block/children
[{:block/string "I'm a Document",
:create/email "tangj1122@gmail.com",
:create/time 1587749657572,
:block/uid "AJmropAjE",
:edit/time 1587749671536,
:edit/email "tangj1122@gmail.com"}],
:block/uid "iuJHWahQA",
:edit/time 1587749495770,
:edit/email "tangj1122@gmail.com"}
{:block/string "Headers",
:create/email "tangj1122@gmail.com",
:create/time 1587749502303,
:block/heading 1,
:block/uid "rI8f-6P6I",
:edit/time 1587749503849,
:edit/email "tangj1122@gmail.com"}],
:block/uid "dfHdZ0EjJ",
:edit/time 1587749525972,
:edit/email "tangj1122@gmail.com"}
{:block/string
"No markdown-esque formatting. Too many edge-cases, even Roam's parser is inconsistent here",
:create/email "tangj1122@gmail.com",
:create/time 1587747434450,
:block/children
[{:block/string "**bold**",
:create/email "tangj1122@gmail.com",
:create/time 1587748975812,
:block/uid "w9L3U8MFX",
:edit/time 1587748996189,
:edit/email "tangj1122@gmail.com"}
{:block/string "__italics__",
:create/email "tangj1122@gmail.com",
:create/time 1587748996186,
:block/uid "Zz77pw07l",
:edit/time 1587749000506,
:edit/email "tangj1122@gmail.com"}
{:block/string "~~strikethrough~~",
:create/email "tangj1122@gmail.com",
:create/time 1587749000503,
:block/uid "0nE4vSxu_",
:edit/time 1587749003833,
:edit/email "tangj1122@gmail.com"}
{:block/string "^^highlighting^^",
:create/email "tangj1122@gmail.com",
:create/time 1587749003830,
:block/uid "y4bpTL_ZO",
:edit/time 1587749063300,
:edit/email "tangj1122@gmail.com"}
{:block/string "`code`",
:create/email "tangj1122@gmail.com",
:create/time 1587749063294,
:block/uid "gZKo_BjFo",
:edit/time 1587749064528,
:edit/email "tangj1122@gmail.com"}],
:block/uid "koL2ZRsF3",
:edit/time 1587749374724,
:edit/email "tangj1122@gmail.com"}
{:block/string "TODO",
:create/email "tangj1122@gmail.com",
:create/time 1587747942441,
:block/uid "BGdPD2tqK",
:edit/time 1587747942465,
:edit/email "tangj1122@gmail.com"}
{:block/string "No special UI",
:create/email "tangj1122@gmail.com",
:create/time 1587749755854,
:block/children
[{:block/string "table",
:create/email "tangj1122@gmail.com",
:create/time 1587749757461,
:block/children
[{:block/string "{{table}}",
:create/email "tangj1122@gmail.com",
:create/time 1587749870476,
:block/children
[{:block/string "none",
:create/email "tangj1122@gmail.com",
:create/time 1587749872788,
:block/children
[{:block/string "of",
:create/email "tangj1122@gmail.com",
:create/time 1587749875421,
:block/children
[{:block/string "this",
:create/email "tangj1122@gmail.com",
:create/time 1587749877636,
:block/uid "ZCG7_qYZf",
:edit/time 1587749878875,
:edit/email "tangj1122@gmail.com"}],
:block/uid "pznO4KP09",
:edit/time 1587749877611,
:edit/email "tangj1122@gmail.com"}],
:block/uid "hzq7vHe_h",
:edit/time 1587749875424,
:edit/email "tangj1122@gmail.com"}],
:block/uid "H1mbry20K",
:edit/time 1587749872791,
:edit/email "tangj1122@gmail.com"}],
:block/uid "ju7ADpU0s",
:edit/time 1587749757461,
:edit/email "tangj1122@gmail.com"}
{:block/string "board",
:create/email "tangj1122@gmail.com",
:create/time 1587749758853,
:block/uid "cii_WeP-9",
:edit/time 1587749758853,
:edit/email "tangj1122@gmail.com"}
{:block/string "sliders",
:create/email "tangj1122@gmail.com",
:create/time 1587747137311,
:block/children
[{:block/string "{{[[slider]]}}",
:block/props
{"slider"
{"tangj1122@gmail.com" 0,
"stojanovicigi@gmail.com" 5,
"jake@jakelunniss.com" 10,
"nil" 2}},
:create/email "tangj1122@gmail.com",
:create/time 1587749827259,
:block/uid "HR3NqDHGN",
:edit/time 1587749833973,
:edit/email "tangj1122@gmail.com"}],
:block/uid "AdZ_3o4Dk",
:edit/time 1587749760406,
:edit/email "tangj1122@gmail.com"}
{:block/string "diagrams",
:create/email "tangj1122@gmail.com",
:create/time 1587749760403,
:block/children
[{:block/string "{{diagram}}",
:block/props
{"diagram"
{"nodes"
{"bgnn0K9_m"
{"width" 100,
"height" 45,
:block/uid "bgnn0K9_m",
"x" -176.44838092065734,
"y" 97.90006123221184},
"nkYltj9wp"
{"width" 100,
"height" 45,
:block/uid "nkYltj9wp",
"x" 36.551632079831734,
"y" 99.90006123221184},
"OjqSB9N_z"
{"width" 200,
"height" 48,
:block/uid "OjqSB9N_z",
"x" -272.17850456141196,
"y" 30.581854445102465},
"MgXpNRx7z"
{"width" 200,
"height" 48,
:block/uid "MgXpNRx7z",
"x" -272.17850456141196,
"y" 30.581854445102465},
"k5PvQ2Fnx"
{"width" 200,
"height" 48,
:block/uid "k5PvQ2Fnx",
"x" -272.17850456141196,
"y" 30.581854445102465},
"xw_NdUN0c"
{"width" 409.1976130157735,
"height" 305.06486345158606,
:block/uid "xw_NdUN0c",
"x" 111.49092013060545,
"y" 218.6979307379467},
"OsJzMjLjY"
{"width" 200,
"height" 48,
:block/uid "OsJzMjLjY",
"x" -268.9664701626442,
"y" 421.0083426021487},
"fl8I6dzc_"
{"width" 200,
"height" 48,
:block/uid "fl8I6dzc_",
"x" 629.3070883761193,
"y" 184.058375904864}},
"links"
{"uuid5aaec060-721b-46bd-84bc-c65ab9ec86cd"
#:block{:uid "nkYltj9wp"}},
"groups"
{"uuid5483dced-547a-4910-a543-29f3feacbd2c"
{:block/uid "uuid5483dced-547a-4910-a543-29f3feacbd2c",
[:array :block/uid]
["bgnn0K9_m"
"nkYltj9wp"
"OjqSB9N_z"
"MgXpNRx7z"
"k5PvQ2Fnx"],
"x" -184.44838140893862,
"y" 76.90006123221184,
"width" 335.00002044677854,
"height" 112}},
"selected" []}},
:create/email "tangj1122@gmail.com",
:create/time 1587749761311,
:block/children
[{:block/string "none of",
:create/email "tangj1122@gmail.com",
:create/time 1587749774573,
:block/uid "bgnn0K9_m",
:edit/time 1587749811867,
:edit/email "tangj1122@gmail.com"}
{:block/string "this",
:create/email "tangj1122@gmail.com",
:create/time 1587749792083,
:block/uid "nkYltj9wp",
:edit/time 1587749800392,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/time 1588437468218,
:block/uid "OjqSB9N_z",
:edit/time 1588437468218}
{:block/string "",
:create/time 1588463988375,
:block/uid "MgXpNRx7z",
:edit/time 1588463988375}
{:block/string "",
:create/time 1588463989328,
:block/uid "k5PvQ2Fnx",
:edit/time 1588463989328}
{:block/string "",
:create/time 1588681212725,
:block/uid "xw_NdUN0c",
:edit/time 1588681212725}
{:block/string "",
:create/time 1588731476243,
:block/uid "OsJzMjLjY",
:edit/time 1588731476243}
{:block/string "",
:create/time 1588863601704,
:block/uid "fl8I6dzc_",
:edit/time 1588863601704}],
:block/uid "BYIemAR6X",
:edit/time 1587749770751,
:edit/email "tangj1122@gmail.com"}],
:block/uid "JvdOXb-1x",
:edit/time 1587749864273,
:edit/email "tangj1122@gmail.com"}
{:block/string "block embeds",
:create/email "tangj1122@gmail.com",
:create/time 1587750061413,
:block/uid "FkDXTxRDL",
:edit/time 1587751732875,
:edit/email "tangj1122@gmail.com"}],
:block/uid "1VI9Cmu5O",
:edit/time 1587749755854,
:edit/email "tangj1122@gmail.com"}
{:block/string "Page Reference",
:create/email "tangj1122@gmail.com",
:create/time 1587747942441,
:block/uid "wLZft4zTS",
:edit/time 1587747942465,
:edit/email "tangj1122@gmail.com"}
{:block/string "No code blocks",
:create/email "tangj1122@gmail.com",
:create/time 1587749101222,
:block/children
[{:block/string "```none of this```",
:create/email "tangj1122@gmail.com",
:create/time 1587749064523,
:block/uid "HvId-tk7s",
:edit/time 1588863556850,
:edit/email "jake@jakelunniss.com"}],
:block/uid "-nxAHfX36",
:edit/time 1587749101222,
:edit/email "tangj1122@gmail.com"}
{:block/string "Upload an Image",
:create/email "tangj1122@gmail.com",
:create/time 1587747942441,
:block/uid "VooTyd085",
:edit/time 1587747942465,
:edit/email "tangj1122@gmail.com"}
{:block/string "No \"secret features\"",
:create/email "tangj1122@gmail.com",
:create/time 1587752875151,
:block/children
[{:block/string "Datascript queries",
:create/email "tangj1122@gmail.com",
:create/time 1587752879128,
:block/uid "lrwtgYjaL",
:edit/time 1587752883823,
:edit/email "tangj1122@gmail.com"}
{:block/string "Hiccup queries",
:create/email "tangj1122@gmail.com",
:create/time 1587752883819,
:block/uid "Xc7okEXqm",
:edit/time 1587752885436,
:edit/email "tangj1122@gmail.com"}
{:block/string "Normal queries with",
:create/email "tangj1122@gmail.com",
:create/time 1587752885434,
:block/uid "mEGn10BdQ",
:edit/time 1587752925944,
:edit/email "tangj1122@gmail.com"}],
:block/uid "medUZkWc3",
:edit/time 1587752880114,
:edit/email "tangj1122@gmail.com"}
{:block/string "Block Reference",
:create/email "tangj1122@gmail.com",
:create/time 1587747942441,
:block/uid "24vx2vyLb",
:edit/time 1587747942465,
:edit/email "tangj1122@gmail.com"}
{:block/string
"No inline images with `![]()`; no automatic picture generation when copying images",
:create/email "tangj1122@gmail.com",
:create/time 1587748984043,
:block/uid "ibaGH9KtK",
:edit/time 1587749587054,
:edit/email "tangj1122@gmail.com"}
{:block/string "Slider",
:create/email "tangj1122@gmail.com",
:create/time 1587747942441,
:block/uid "GovdX2zTc",
:edit/time 1587747942465,
:edit/email "tangj1122@gmail.com"}
{:block/string "No markdown links with `[]()`",
:create/email "tangj1122@gmail.com",
:create/time 1587749111434,
:block/uid "wB9JZCALX",
:edit/time 1587749546061,
:edit/email "tangj1122@gmail.com"}
{:block/string "Block Embed",
:create/email "tangj1122@gmail.com",
:create/time 1587747942441,
:block/uid "XoLDba8Za",
:edit/time 1587747942465,
:edit/email "tangj1122@gmail.com"}
{:block/string
"No keyboard modifications for `[` or `(` that auto-balances parentheses. Can use a chrome extension first like in https://chrome.google.com/webstore/detail/prokeys/ekfnbpgmmeahnnlpjibofkobpdkifapn/reviews",
:create/email "tangj1122@gmail.com",
:create/time 1587750217525,
:block/uid "cBUTd24i2",
:edit/time 1587750261930,
:edit/email "tangj1122@gmail.com"}
{:block/string "No filters on links at the page level",
:create/email "tangj1122@gmail.com",
:create/time 1587747611617,
:block/uid "kzZjRRKzp",
:edit/time 1587749620571,
:edit/email "tangj1122@gmail.com"}
{:block/string "Current Time",
:create/email "tangj1122@gmail.com",
:create/time 1587747942441,
:block/uid "UPlpqFWKW",
:edit/time 1587747942465,
:edit/email "tangj1122@gmail.com"}
{:block/string "No graph view at the page or global level",
:create/email "tangj1122@gmail.com",
:create/time 1587747613886,
:block/uid "OpdJQsMfu",
:edit/time 1587749369959,
:edit/email "tangj1122@gmail.com"}
{:block/string "Date Picker",
:create/email "tangj1122@gmail.com",
:create/time 1587747942441,
:block/uid "3IxjBtLUe",
:edit/time 1587747942465,
:edit/email "tangj1122@gmail.com"}
{:block/string "Today",
:create/email "tangj1122@gmail.com",
:create/time 1587747942441,
:block/uid "SrNcckwa_",
:edit/time 1587747942465,
:edit/email "tangj1122@gmail.com"}
{:block/string "{{[[DONE]]}} No TODO/DONE checkboxes",
:create/email "tangj1122@gmail.com",
:create/time 1587750317343,
:block/uid "OpuXJytEY",
:edit/time 1587751720562,
:edit/email "tangj1122@gmail.com"}
{:block/string "No mobile-specific features like Quick Capture",
:create/email "tangj1122@gmail.com",
:create/time 1587747160981,
:block/uid "nexCbwNzA",
:edit/time 1587749906318,
:edit/email "tangj1122@gmail.com"}
{:block/string "Tomorrow",
:create/email "tangj1122@gmail.com",
:create/time 1587747942441,
:block/uid "cARdJWtR0",
:edit/time 1587747942465,
:edit/email "tangj1122@gmail.com"}
{:block/string "No keyboard shortcuts",
:create/email "tangj1122@gmail.com",
:create/time 1587747777758,
:block/uid "F49P5WlXC",
:edit/time 1587747789092,
:edit/email "tangj1122@gmail.com"}
{:block/string "Yesterday",
:create/email "tangj1122@gmail.com",
:create/time 1587747942441,
:block/uid "xX79KVzUS",
:edit/time 1587747942465,
:edit/email "tangj1122@gmail.com"}
{:block/string "No favorites in the left sidebar",
:create/email "tangj1122@gmail.com",
:create/time 1587747620820,
:block/uid "-k_ejxVYF",
:edit/time 1587752620490,
:edit/email "tangj1122@gmail.com"}
{:block/string "Embed Youtube Video",
:create/email "tangj1122@gmail.com",
:create/time 1587747942441,
:block/uid "xmLfRpJGJ",
:edit/time 1587747942465,
:edit/email "tangj1122@gmail.com"}
{:block/string "No import with JSON",
:create/email "tangj1122@gmail.com",
:create/time 1587747008285,
:block/children
[{:block/string
"Exporting JSON from Roam does not include `page-ids` yet. We should not be generating `page-ids`. We should be working with original Roam data with native Datoms as closely as possible first, as demonstrated in [[Using Your Roam DB with Athens]].",
:create/email "tangj1122@gmail.com",
:create/time 1587747494267,
:block/uid "dVxq5nTWd",
:edit/time 1587749357317,
:edit/email "tangj1122@gmail.com"}],
:block/uid "k-jVKUh49",
:edit/time 1587749306783,
:edit/email "tangj1122@gmail.com"}
{:block/string "External Link",
:create/email "tangj1122@gmail.com",
:create/time 1587747942441,
:block/uid "ZoR7KkRDI",
:edit/time 1587747942465,
:edit/email "tangj1122@gmail.com"}
{:block/string "Bold",
:create/email "tangj1122@gmail.com",
:create/time 1587747942441,
:block/uid "08Qs00cTo",
:edit/time 1587747942465,
:edit/email "tangj1122@gmail.com"}
{:block/string "Cmd-b",
:create/email "tangj1122@gmail.com",
:create/time 1587747942441,
:block/uid "y3cG0TZaY",
:edit/time 1587747942465,
:edit/email "tangj1122@gmail.com"}
{:block/string "Italics",
:create/email "tangj1122@gmail.com",
:create/time 1587747942441,
:block/uid "Gyg2RrE5x",
:edit/time 1587747942465,
:edit/email "tangj1122@gmail.com"}
{:block/string "Cmd-i",
:create/email "tangj1122@gmail.com",
:create/time 1587747942441,
:block/uid "AfUOcUsTf",
:edit/time 1587747942465,
:edit/email "tangj1122@gmail.com"}
{:block/string "Strikethrough",
:create/email "tangj1122@gmail.com",
:create/time 1587747942441,
:block/uid "ZxQSun7hx",
:edit/time 1587747942465,
:edit/email "tangj1122@gmail.com"}
{:block/string "Code Inline",
:create/email "tangj1122@gmail.com",
:create/time 1587747942441,
:block/uid "lHuR_WeZD",
:edit/time 1587747942465,
:edit/email "tangj1122@gmail.com"}
{:block/string "Latex",
:create/email "tangj1122@gmail.com",
:create/time 1587747942441,
:block/uid "XSpSZyHK2",
:edit/time 1587747942465,
:edit/email "tangj1122@gmail.com"}
{:block/string "Code Block",
:create/email "tangj1122@gmail.com",
:create/time 1587747942441,
:block/uid "--bCBxxvF",
:edit/time 1587747942465,
:edit/email "tangj1122@gmail.com"}
{:block/string "Image Markdown",
:create/email "tangj1122@gmail.com",
:create/time 1587747942441,
:block/uid "OaMbhvvXl",
:edit/time 1587747942465,
:edit/email "tangj1122@gmail.com"}
{:block/string "Table",
:create/email "tangj1122@gmail.com",
:create/time 1587747942441,
:block/uid "s2n4TFT0z",
:edit/time 1587747942465,
:edit/email "tangj1122@gmail.com"}
{:block/string "Page Mentions",
:create/email "tangj1122@gmail.com",
:create/time 1587747942441,
:block/uid "vqP1dMNwe",
:edit/time 1587747942465,
:edit/email "tangj1122@gmail.com"}
{:block/string "Block Mentions",
:create/email "tangj1122@gmail.com",
:create/time 1587747942441,
:block/uid "GwMPSU0gt",
:edit/time 1587747942465,
:edit/email "tangj1122@gmail.com"}
{:block/string "Word Count",
:create/email "tangj1122@gmail.com",
:create/time 1587747942441,
:block/uid "8IIeZk79t",
:edit/time 1587747942465,
:edit/email "tangj1122@gmail.com"}
{:block/string "Find orphan blocks",
:create/email "tangj1122@gmail.com",
:create/time 1587747942441,
:block/uid "xlLUx9DBE",
:edit/time 1587747942465,
:edit/email "tangj1122@gmail.com"}],
:block/uid "0f487hyla",
:edit/time 1587746995790,
:edit/email "tangj1122@gmail.com"}
{:block/string "Undecided",
:create/email "tangj1122@gmail.com",
:create/time 1587746996585,
:block/children
[{:block/string
"Daily Note: solid feature but dates have a lot of logic around them",
:create/email "tangj1122@gmail.com",
:create/time 1587747001635,
:block/uid "N2KCg5Inp",
:edit/time 1587752549871,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Right side bar for viewing other pages: good feature but unsure if it's the best way to view multiple notes",
:create/email "tangj1122@gmail.com",
:create/time 1587747006299,
:block/uid "0Rj-gcxsP",
:edit/time 1587752804839,
:edit/email "tangj1122@gmail.com"}
{:block/string
"**attributes::** these are a good idea, but still very experimental according to Conor. Some global table mechanism is necessary but not sure if this the right approach.",
:create/email "tangj1122@gmail.com",
:create/time 1587747654080,
:block/uid "FZAknFGIN",
:edit/time 1588445270981,
:edit/email "tangj1122@gmail.com"}],
:block/uid "Bj8uasUnO",
:edit/time 1588032710818,
:edit/email "tangj1122@gmail.com"}
{:block/string "Phases.",
:create/email "tangj1122@gmail.com",
:create/time 1588098512865,
:block/children
[{:block/string "Phase 1: read-only (frontend only)",
:create/email "tangj1122@gmail.com",
:create/time 1588098514256,
:block/children
[{:block/string "((-B0sYer9x))",
:block/uid "govE-nBuj",
:edit/time 1588098571109,
:edit/email "tangj1122@gmail.com"}
{:block/string "((TjboRvvlm))",
:block/uid "aRtzN0zGN",
:edit/time 1588098619017,
:edit/email "tangj1122@gmail.com"}
{:block/string "((1cdx17TbF))",
:block/uid "jpD2Qfd9V",
:edit/time 1588098580695,
:edit/email "tangj1122@gmail.com"}
{:block/string "((7aE8qHlW5))",
:block/uid "YJ34d9gGy",
:edit/time 1588098590149,
:edit/email "tangj1122@gmail.com"}
{:block/string "((957B-Np01))",
:create/email "tangj1122@gmail.com",
:create/time 1588098632235,
:block/uid "ofiTSbcl2",
:edit/time 1588098633709,
:edit/email "tangj1122@gmail.com"}],
:block/uid "AMCtSF1SB",
:edit/time 1588098712986,
:edit/email "tangj1122@gmail.com"}
{:block/string "Phase 2: read+write (backend required)",
:create/email "tangj1122@gmail.com",
:create/time 1588098518275,
:block/children
[{:block/string "((CFUKHnlOj))",
:block/uid "T5YZyWZmN",
:edit/time 1588098752255,
:edit/email "tangj1122@gmail.com"}
{:block/string "((2wwIS0A0A))",
:block/uid "v2BNEicrx",
:edit/time 1588098752255,
:edit/email "tangj1122@gmail.com"}
{:block/string "((hb3RA3NMT))",
:block/uid "jvAGtvwqH",
:edit/time 1588098683418,
:edit/email "tangj1122@gmail.com"}
{:block/string "((79gfjW5Ad))",
:block/uid "qdGchaMUR",
:edit/time 1588098679347,
:edit/email "tangj1122@gmail.com"}
{:block/string "((0yMwWM5Kw))",
:block/uid "hyBOBFKKQ",
:edit/time 1588098670410,
:edit/email "tangj1122@gmail.com"}
{:block/string "((yBVTBE4kJ))",
:block/uid "0SRoUQ2zV",
:edit/time 1588098704544,
:edit/email "tangj1122@gmail.com"}],
:block/uid "gHMSIedSG",
:edit/time 1588098532568,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1588443657816,
:block/uid "SvnoUSqPF",
:edit/time 1588443691662,
:edit/email "tangj1122@gmail.com"}],
:block/uid "8C51U4cqn",
:edit/time 1588445298407,
:edit/email "tangj1122@gmail.com"}],
:block/uid "ZH0bpybiV",
:edit/time 1588713702046,
:edit/email "tangj1122@gmail.com"}
{:block/string "**README: I am more up-to-date**",
:create/email "tangj1122@gmail.com",
:create/time 1588713442665,
:block/children
[{:block/string "https://whimsical.com/TCeXP1dpRkdT8rpMvYci2P ",
:create/email "tangj1122@gmail.com",
:create/time 1588713504394,
:block/children
[{:block/string
"![](https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2FxMp0qGi79d.png?alt=media&token=0ee88d6d-ea94-4a6b-a023-8852f3481ac0)",
:block/props
{"image-size"
{"https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2FxMp0qGi79d.png?alt=media&token=0ee88d6d-ea94-4a6b-a023-8852f3481ac0"
{"width" 580, "height" nil}}},
:create/email "tangj1122@gmail.com",
:create/time 1588713531204,
:block/uid "FrPj9nltB",
:edit/time 1588713532976,
:edit/email "tangj1122@gmail.com"}
{:block/string
"There are 4 broad phases to Athens development.",
:create/email "tangj1122@gmail.com",
:create/time 1588713441744,
:block/children
[{:block/string "Read-Only",
:create/email "tangj1122@gmail.com",
:create/time 1588713576441,
:block/uid "aJzRDCetB",
:edit/time 1588713582700,
:edit/email "tangj1122@gmail.com"}
{:block/string "Read and Write",
:create/email "tangj1122@gmail.com",
:create/time 1588713582695,
:block/uid "1IAXDdXmG",
:edit/time 1588713584837,
:edit/email "tangj1122@gmail.com"}
{:block/string "Local Persistence",
:create/email "tangj1122@gmail.com",
:create/time 1588713584833,
:block/uid "gz6pSArZl",
:edit/time 1588713586760,
:edit/email "tangj1122@gmail.com"}
{:block/string "Remote Persistence",
:create/email "tangj1122@gmail.com",
:create/time 1588713586755,
:block/uid "aLc-f7Lq5",
:edit/time 1588713591894,
:edit/email "tangj1122@gmail.com"}],
:block/uid "NPIRkJ0IX",
:edit/time 1588713504398,
:edit/email "tangj1122@gmail.com"}],
:block/uid "W8OPkhDlD",
:edit/time 1588713512568,
:edit/email "tangj1122@gmail.com"}
{:block/string
"For more specific detail on the progress of development, [Athens Github](https://github.com/athensresearch/athens) is probably your best bet.",
:create/email "tangj1122@gmail.com",
:create/time 1588713592067,
:block/uid "51OhRO2Z9",
:edit/time 1588713661085,
:edit/email "tangj1122@gmail.com"}],
:block/uid "K3pl3KlGK",
:edit/time 1588715612002,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1587746901853,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587749833974,
:node/title "slider",
:edit/time 1587749833989,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587751720563,
:node/title "DONE",
:edit/time 1587751720564,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587752816264,
:node/title "**attributes",
:edit/time 1587752816265,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587753665202,
:node/title "Open-Source Governance",
:block/children
[{:block/string "type:: notes",
:create/email "tangj1122@gmail.com",
:create/time 1587756978375,
:block/uid "OhGCNB96X",
:edit/time 1587756982774,
:edit/email "tangj1122@gmail.com"}
{:block/string "Leadership and Governance",
:create/email "tangj1122@gmail.com",
:create/time 1587753633549,
:block/children
[{:block/string
"source:: https://opensource.guide/leadership-and-governance/",
:create/email "tangj1122@gmail.com",
:create/time 1587756505382,
:block/uid "FIyen32Ph",
:edit/time 1587756507459,
:edit/email "tangj1122@gmail.com"}
{:block/string "Examples of formal roles",
:create/email "tangj1122@gmail.com",
:create/time 1587753638349,
:block/children
[{:block/string "maintainer",
:create/email "tangj1122@gmail.com",
:create/time 1587753687498,
:block/children
[{:block/string
"A maintainer doesn’t necessarily have to be someone who writes code for your project. It could be someone who’s done a lot of work evangelizing your project, or written documentation that made the project more accessible to others.",
:create/email "tangj1122@gmail.com",
:create/time 1587753733192,
:block/uid "W08OnODAd",
:edit/time 1587753745458,
:edit/email "tangj1122@gmail.com"}],
:block/uid "fzpoMeqSp",
:edit/time 1587753690027,
:edit/email "tangj1122@gmail.com"}
{:block/string "contributor",
:create/email "tangj1122@gmail.com",
:create/time 1587753685104,
:block/children
[{:block/string
"could be anyone who comments on an issue or pull request, people who add value to the project (whether it’s triaging issues, writing code, or organizing events), or anybody with a merged pull request",
:create/email "tangj1122@gmail.com",
:create/time 1587753760137,
:block/uid "X1vbJhZlb",
:edit/time 1587753775031,
:edit/email "tangj1122@gmail.com"}],
:block/uid "5b7_QuSR3",
:edit/time 1587753687501,
:edit/email "tangj1122@gmail.com"}
{:block/string "committer",
:create/email "tangj1122@gmail.com",
:create/time 1587753690024,
:block/children
[{:block/string
"The term “committer” might be used to distinguish commit access, which is a specific type of responsibility, from other forms of contribution.",
:create/email "tangj1122@gmail.com",
:create/time 1587753756144,
:block/uid "jQKuoceTJ",
:edit/time 1587753758493,
:edit/email "tangj1122@gmail.com"}],
:block/uid "Wa3xz3fkM",
:edit/time 1587753704864,
:edit/email "tangj1122@gmail.com"}],
:block/uid "YkLBMvYI7",
:edit/time 1587753685108,
:edit/email "tangj1122@gmail.com"}
{:block/string "Formalizing leadership roles",
:create/email "tangj1122@gmail.com",
:create/time 1587753785240,
:block/children
[{:block/string
"If your project has a very active contributor community, you might form a “core team” of maintainers, or even subcommittees of people who take ownership of different issue areas (for example, security, issue triaging, or community conduct). **Let people self-organize and volunteer for the roles they’re most excited about, rather than assigning them.**",
:create/email "tangj1122@gmail.com",
:create/time 1587753790340,
:block/uid "2ubfFuQ-H",
:edit/time 1587753808007,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Once you’ve established leadership roles, don’t forget to document how people can attain them! **Establish a clear process for how someone can become a maintainer** or join a subcommittee in your project, and write it into your GOVERNANCE.md.",
:create/email "tangj1122@gmail.com",
:create/time 1587753810302,
:block/uid "grzrZGqtY",
:edit/time 1587753832661,
:edit/email "tangj1122@gmail.com"}
{:block/string
"{{[[DONE]]}} Finally, if your project is on GitHub, consider **moving your project from your personal account to an Organization and adding at least one backup admin**. GitHub Organizations make it easier to manage permissions and multiple repositories and protect your project’s legacy through shared ownership.",
:create/email "tangj1122@gmail.com",
:create/time 1587753823470,
:block/uid "E_ZrYJmbw",
:edit/time 1588851643913,
:edit/email "tangj1122@gmail.com"}],
:block/uid "8cf3YT6GI",
:edit/time 1587753790345,
:edit/email "tangj1122@gmail.com"}
{:block/string "When should I give someone commit access?",
:create/email "tangj1122@gmail.com",
:create/time 1587753845088,
:block/children
[{:block/string
"you can use protected branches to manage who can push to a particular branch, and under which circumstances",
:create/email "tangj1122@gmail.com",
:create/time 1587753865198,
:block/uid "njzmgojHX",
:edit/time 1587753887775,
:edit/email "tangj1122@gmail.com"}],
:block/uid "FJxE46X_W",
:edit/time 1587753865201,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Common governance structures for open source projects",
:create/email "tangj1122@gmail.com",
:create/time 1587753891936,
:block/children
[{:block/string "[[BDFL]]",
:create/email "tangj1122@gmail.com",
:create/time 1587753898961,
:block/uid "MskTJpNe5",
:edit/time 1587753905774,
:edit/email "tangj1122@gmail.com"}
{:block/string "Meritocracy",
:create/email "tangj1122@gmail.com",
:create/time 1587753905771,
:block/uid "4ah5YyfYu",
:edit/time 1587753907590,
:edit/email "tangj1122@gmail.com"}
{:block/string "Liberal contribution",
:create/email "tangj1122@gmail.com",
:create/time 1587753907587,
:block/uid "yia3iz2sx",
:edit/time 1587753910744,
:edit/email "tangj1122@gmail.com"}],
:block/uid "S7WEr8Y_p",
:edit/time 1587753898964,
:edit/email "tangj1122@gmail.com"}],
:block/uid "BV39YlyFl",
:edit/time 1587756518497,
:edit/email "tangj1122@gmail.com"}
{:block/string "Governance Models",
:create/email "tangj1122@gmail.com",
:create/time 1587754076337,
:block/children
[{:block/string
"source:: http://oss-watch.ac.uk/resources/governancemodels",
:create/email "tangj1122@gmail.com",
:create/time 1587756487714,
:block/uid "uPY-Mtr8e",
:edit/time 1587756490106,
:edit/email "tangj1122@gmail.com"}
{:block/string
"it is the governance model that prevents an open source project from descending into chaos",
:create/email "tangj1122@gmail.com",
:create/time 1587754077812,
:block/uid "4engsrg94",
:edit/time 1587754103446,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Governance models range from centralised control by a single individual or organisation (benevolent dictatorship) to distributed control awarded in recognition of contributions (meritocracy",
:create/email "tangj1122@gmail.com",
:create/time 1587754104032,
:block/uid "YCcTe530K",
:edit/time 1587754147558,
:edit/email "tangj1122@gmail.com"}
{:block/string
"It’s interesting to note that a particular governance style doesn’t automatically imply a particular contribution model, although **projects do tend to start as cathedral-style benevolent dicatotorships and move towards bazaar-style contribution or meritocratic-style governance (or both) as they mature**. #[[The Cathedral and the Bazaar]]",
:create/email "tangj1122@gmail.com",
:create/time 1587754148258,
:block/uid "9vhC5QDFV",
:edit/time 1587754244050,
:edit/email "tangj1122@gmail.com"}
{:block/string
"![](https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2FiB0S7MbLS0?alt=media&token=9eff62c6-afa2-494b-8b64-033fff2ddbea)",
:create/email "tangj1122@gmail.com",
:create/time 1587754218947,
:block/uid "ti-op6FMc",
:edit/time 1587754265250,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Linux is Raymond’s classic “Bazaar”, encouraging contributions from anyone, making releases early and often. It is governed by [[Linus Torvalds]], who has the final say on which contributions are included in a release.",
:block/uid "ST82_wwYh",
:edit/time 1587754336590,
:edit/email "tangj1122@gmail.com"}
{:block/string
"GNU [[Emacs]] is Raymond’s classic “Cathedral”, with a small team of committed contributors and less frequent releases, and governed by [[Richard Stallman]]. It is worth noting, however, that Stallman no longer has the same role that he had when Raymond write his essay, and the current lead maintainers run the project with a more open contribution model.",
:block/uid "VIjyO4x0k",
:edit/time 1587754361312,
:edit/email "tangj1122@gmail.com"}
{:block/string "Barriers to Adopting a Governance Model",
:create/email "tangj1122@gmail.com",
:create/time 1587754363767,
:block/children
[{:block/string "red tape",
:create/email "tangj1122@gmail.com",
:create/time 1587754438237,
:block/children
[{:block/string
"a governance model should make the process of making and evaluating third party contributions easier, not harder. It should remove the uncertainty that can lead to wasted time for everyone involved.",
:create/email "tangj1122@gmail.com",
:create/time 1587754601884,
:block/uid "JGZzUt7Ql",
:edit/time 1587754602387,
:edit/email "tangj1122@gmail.com"}],
:block/uid "jTyKm5y3k",
:edit/time 1587754444017,
:edit/email "tangj1122@gmail.com"}
{:block/string "loss of direction",
:create/email "tangj1122@gmail.com",
:create/time 1587754444195,
:block/children
[{:block/string
"A good governance model will actually increase the agility of the project, as it defines how new contributors can take the project in unexpected directions without interfering with its core goals.",
:create/email "tangj1122@gmail.com",
:create/time 1587754640224,
:block/uid "iBtT-aOWo",
:edit/time 1587754640765,
:edit/email "tangj1122@gmail.com"}],
:block/uid "rUVVMChdC",
:edit/time 1587754449666,
:edit/email "tangj1122@gmail.com"}
{:block/string "loss of control",
:create/email "tangj1122@gmail.com",
:create/time 1587754449662,
:block/children
[{:block/string
"When deciding on the level of control required by your project team, consider how the efforts of the team are to be sustained. If, for example, the project is producing a high-profit product that will be exploited commercially, there is some benefit in maintaining control while encouraging collaboration. It is true that choosing a centralised model ensures that product evolution is optimised for the chosen exploitation route. However, it does limit the breadth and depth of contributors likely to take an interest in the project, as their strategic goals may differ.",
:block/uid "SyI_9ZY0y",
:edit/time 1587754731718,
:edit/email "tangj1122@gmail.com"}
{:block/string
"On the other hand, if the project is producing a component part that, in itself, is of low commercial value, the aim is usually to ensure that the component is as widely used as possible. In those circumstances, the goal would be to maximise participation by allowing all interested and active partners to participate in strategic planning.",
:block/uid "0SEmMcuwX",
:edit/time 1587754731718,
:edit/email "tangj1122@gmail.com"}],
:block/uid "jCV3EleuZ",
:edit/time 1587754455993,
:edit/email "tangj1122@gmail.com"}
{:block/string "communities splitting/forking",
:create/email "tangj1122@gmail.com",
:create/time 1587754457052,
:block/children
[{:block/string
"One of the strengths of the open source licensing model is that anyone has the right to take the code and develop it independently of the copyright holder. This is called [[forking]]. This means that **the control exerted by the project leadership is only as strong as the support the community gives that leadership.**",
:create/email "tangj1122@gmail.com",
:create/time 1587754767068,
:block/uid "emdJoWO9s",
:edit/time 1587754786610,
:edit/email "tangj1122@gmail.com"}],
:block/uid "ORcjcW8fl",
:edit/time 1587754468036,
:edit/email "tangj1122@gmail.com"}
{:block/string "project is too young or small",
:create/email "tangj1122@gmail.com",
:create/time 1587754464298,
:block/children
[{:block/string
"It is very common for projects to feel that a governance model is not yet necessary, but this, in our opinion, is never the case.",
:block/uid "Hu5NrwkoT",
:edit/time 1587754817231,
:edit/email "tangj1122@gmail.com"}
{:block/string
"**It is never too soon to define a suitable governance model**. Without one, the chances of third parties wishing to contribute are considerably reduced. This is for a number of reasons:",
:block/children
[{:block/string
"potential contributors will not know how to contribute",
:block/uid "zsD4ggUOy",
:edit/time 1587754817231,
:edit/email "tangj1122@gmail.com"}
{:block/string
"they will not be sure what will happen to their contribution",
:block/uid "FBr6o6PG7",
:edit/time 1587754817231,
:edit/email "tangj1122@gmail.com"}
{:block/string
"the project will not look serious about engaging with third parties",
:block/uid "-zdKJrchg",
:edit/time 1587754817231,
:edit/email "tangj1122@gmail.com"}
{:block/string
"there is no visible assurance that contributions will be managed in such a way that they will remain of value to the original contributor",
:block/uid "jVKKAbOR3",
:edit/time 1587754817231,
:edit/email "tangj1122@gmail.com"}],
:block/uid "v4eYGf9lK",
:edit/time 1587754823634,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Since you never know when a contributor might stumble upon your project, **it is important to be ready from the earliest possible date**. Each missed opportunity to attract contributors damages the sustainability of the project",
:create/email "tangj1122@gmail.com",
:create/time 1587754874722,
:block/uid "YTmdeAhNy",
:edit/time 1587754882078,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Another common misconception is that there are not enough potential users or contributors to make it worth courting them. Again, we would contend that a single contribution that improves the quality and usability of the product is worth having. **The effort involved in creating an adequate governance model is usually less than the effort involved in all but the smallest of contributions.**",
:create/email "tangj1122@gmail.com",
:create/time 1587754882414,
:block/uid "NxIrU6Sef",
:edit/time 1587754901047,
:edit/email "tangj1122@gmail.com"}
{:block/string
"A final concern that is often raised is that the project is too small to cope with an influx of third-party users and contributors. This illustrates a lack of understanding of how open development works: **firstly, even the largest of projects do not attract more than a handful of active developers at any one time. Secondly, a well-managed community will be largely self-supporting. This is particularly true for decentralised communities.** #[[decentralization]]",
:create/email "tangj1122@gmail.com",
:create/time 1587754903217,
:block/uid "hwM-LT1Nc",
:edit/time 1587754958625,
:edit/email "tangj1122@gmail.com"}],
:block/uid "GJDrJKtSh",
:edit/time 1587754481866,
:edit/email "tangj1122@gmail.com"}],
:block/uid "eCk_dimG-",
:edit/time 1587754441948,
:edit/email "tangj1122@gmail.com"}
{:block/string "How Do Open Development Projects Make Decisions?",
:create/email "tangj1122@gmail.com",
:create/time 1587754961717,
:block/children
[{:block/string
"Many people know, for example, how difficult it can be for a committee to reach a decision. **Documenting the process by which decisions are made is therefore a key part of a governance model**, and it is worth taking a little time to explore the various approaches commonly taken to **prevent deadlock situations** from occurring in open development communities",
:create/email "tangj1122@gmail.com",
:create/time 1587754988682,
:block/uid "mnicTzhyt",
:edit/time 1587755286406,
:edit/email "tangj1122@gmail.com"}
{:block/string "[[BDFL]]",
:create/email "tangj1122@gmail.com",
:create/time 1587755286649,
:block/children
[{:block/string
"A benevolent dictator is responsible for determining the general direction of the project and making the **final decisions when the community is in disagreement.**",
:create/email "tangj1122@gmail.com",
:create/time 1587755380207,
:block/uid "YqqYSX_ka",
:edit/time 1587755411873,
:edit/email "tangj1122@gmail.com"}
{:block/string
"As more and more members join the community, the benevolent dictator strives to ensure that these decisions are in the best **interests of the project, rather than the interests of any particular individual or organisation.**",
:create/email "tangj1122@gmail.com",
:create/time 1587755383959,
:block/uid "mfoRHnojp",
:edit/time 1587755393790,
:edit/email "tangj1122@gmail.com"}
{:block/string
"A good benevolent dictator needs to be able to balance the conflicting requirements of community members. This is no easy task. Before you set yourself up as a benevolent dictator you should ask: ‘[Can I be a good benevolent dictator?](http://producingoss.com/html-chunk/social-infrastructure.html#benevolent-dictator-qualifications)’",
:create/email "tangj1122@gmail.com",
:create/time 1587755362562,
:block/children
[{:block/string "((e_9zqpX8X))",
:create/email "tangj1122@gmail.com",
:create/time 1587757077003,
:block/uid "FWu1N18Cr",
:edit/time 1587757088093,
:edit/email "tangj1122@gmail.com"}],
:block/uid "nMO5UpY6i",
:edit/time 1587755600984,
:edit/email "tangj1122@gmail.com"}
{:block/string
"an effective benevolent dictator gradually takes on the role of arbitrator and coordinator. They do not, as a rule, take sides in any particular debate. ‘I’d much rather have 15 people arguing about something than 15 people splitting into two camps, each side convinced it’s right and not talking to the other,’ says [[Linus Torvalds]]. ",
:create/email "tangj1122@gmail.com",
:create/time 1587755669789,
:block/uid "HB_x8zENr",
:edit/time 1587755738109,
:edit/email "tangj1122@gmail.com"}],
:block/uid "-wZZe2OXj",
:edit/time 1587755323624,
:edit/email "tangj1122@gmail.com"}
{:block/string "Meritocracies",
:create/email "tangj1122@gmail.com",
:create/time 1587755323621,
:block/children
[{:block/string
"While some projects maintain tight control over the decision making process, others feel it is more effective to allow the community as a whole to make decisions. **In this case, there is an increased need for a formal decision making process, since there is no single person able to break a deadlock.**",
:create/email "tangj1122@gmail.com",
:create/time 1587755774394,
:block/uid "tv1wumg8G",
:edit/time 1587755781018,
:edit/email "tangj1122@gmail.com"}
{:block/string
"The membership structure of such communities typically looks flatter than in those led by a benevolent dictator. However, **contributors who have earned the respect of the community through frequent and useful contributions tend to have a ‘louder voice’**. This means that leadership figures will still emerge and those figures must, like the benevolent dictators, wield their perceived authority with care. This model of earning authority through contribution is often called the meritocratic model.",
:create/email "tangj1122@gmail.com",
:create/time 1587755781445,
:block/uid "JCWdKDXxg",
:edit/time 1587755814376,
:edit/email "tangj1122@gmail.com"}
{:block/string
"in many cases there is no need for discussion, since the correct path is obvious. In this case, it is sufficient to simply state one’s intentions and allow time for someone to object. **In the absence of an objection, it is assumed that the community agrees with the proposed action**. This is sometimes called ‘[[lazy consensus’]].",
:create/email "tangj1122@gmail.com",
:create/time 1587755803681,
:block/uid "Zs5WcYaPW",
:edit/time 1587755861593,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1587755852638,
:block/uid "Fh7rqAhaZ",
:edit/time 1587755852638,
:edit/email "tangj1122@gmail.com"}],
:block/uid "uzMl-WBcd",
:edit/time 1587755331228,
:edit/email "tangj1122@gmail.com"}],
:block/uid "LVol0QI9r",
:edit/time 1587754981501,
:edit/email "tangj1122@gmail.com"}
{:block/string "How To Draw Up A Governance Document",
:create/email "tangj1122@gmail.com",
:create/time 1587755934980,
:block/children
[{:block/string "Two Templates",
:create/email "tangj1122@gmail.com",
:create/time 1587755952582,
:block/children
[{:block/string
"{{[[TODO]]}} read Benevolent Dictator Governance Model: http://oss-watch.ac.uk/resources/benevolentdictatorgovernancemodel",
:create/email "tangj1122@gmail.com",
:create/time 1587755966370,
:block/uid "21v5Kin7x",
:edit/time 1587756368375,
:edit/email "tangj1122@gmail.com"}
{:block/string
"{{[[TODO]]}} read Meritocratic Governance Model: http://oss-watch.ac.uk/resources/meritocraticgovernancemodel",
:create/email "tangj1122@gmail.com",
:create/time 1587755957612,
:block/uid "fBuxODFOd",
:edit/time 1587756371809,
:edit/email "tangj1122@gmail.com"}],
:block/uid "qMWP1Oope",
:edit/time 1587756321686,
:edit/email "tangj1122@gmail.com"}
{:block/string
"The main sections of a typical governance document include:",
:block/children
[{:block/string "Overview",
:block/children
[{:block/string
"This overview section of the governance document should provide a brief summary of the project **objectives** and how it is managed, linking forward to each individual section as appropriate. It should also provide key information, such as the **licence** covering the project outputs, who the **copyright** holder is, and **how users can become involved** with the development of the project.",
:create/email "tangj1122@gmail.com",
:create/time 1587756027488,
:block/uid "PytzD7UFs",
:edit/time 1587756053905,
:edit/email "tangj1122@gmail.com"}],
:block/uid "NGcCXtCYF",
:edit/time 1587755948484,
:edit/email "tangj1122@gmail.com"}
{:block/string "Roles and responsibilities",
:block/children
[{:block/string
"The defined roles may be quite general, such as ‘user’, ‘contributor’, ‘committer’ or ‘project management committee member’, or they may be very specific, such as ‘release manager’, ‘bug manager’, ‘community manager’, ‘product manager’, and so on. Generally, the more detail provided, the more likely it is that people will be able to identify things they can do to contribute",
:create/email "tangj1122@gmail.com",
:create/time 1587756054847,
:block/uid "UNw4JfK2C",
:edit/time 1587756112757,
:edit/email "tangj1122@gmail.com"}],
:block/uid "01T3sWa0N",
:edit/time 1587755948484,
:edit/email "tangj1122@gmail.com"}
{:block/string "Support",
:block/uid "z3U3xiv8Q",
:edit/time 1587756176735,
:edit/email "tangj1122@gmail.com"}
{:block/string "Decision making process",
:block/children
[{:block/string
"The efficiency and transparency of the decision making process should be the main focus of this section of the governance document. It is this process that assures potential contributors that their efforts will be handled fairly by the project and will remain of value in the future",
:create/email "tangj1122@gmail.com",
:create/time 1587756184318,
:block/uid "Oy4LLZWo3",
:edit/time 1587756194102,
:edit/email "tangj1122@gmail.com"}],
:block/uid "H5HOE8adH",
:edit/time 1587755948484,
:edit/email "tangj1122@gmail.com"}
{:block/string "Contribution process",
:block/children
[{:block/string
"Clear processes relating to contribution are necessary for two key reasons:",
:block/children
[{:block/string "to guide contributors to the project",
:block/uid "aAUXuVSAq",
:edit/time 1587756233322,
:edit/email "tangj1122@gmail.com"}
{:block/string
"to reassure potential users that the quality control and legal oversight of all contributions is sufficiently robust to produce a reliable and legally sound software output",
:block/uid "gsoesLzbL",
:edit/time 1587756233323,
:edit/email "tangj1122@gmail.com"}],
:block/uid "Lo1W6ePF8",
:edit/time 1587756233323,
:edit/email "tangj1122@gmail.com"}
{:block/string
"This section of the governance document should therefore describe the expectations the project has with respect to **copyrights management, coding standards and documentation**. It should also **describe what happens once a contribution has been made by a third party, including details of the process that is followed when a contribution is deemed unsuitable for the project.**",
:create/email "tangj1122@gmail.com",
:create/time 1587756246203,
:block/uid "acguJSiyW",
:edit/time 1587756256159,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1587756256700,
:block/uid "lID7BOL20",
:edit/time 1587756256700,
:edit/email "tangj1122@gmail.com"}],
:block/uid "wyATlJsO3",
:edit/time 1587755948484,
:edit/email "tangj1122@gmail.com"}],
:block/uid "-P9ZEvkf0",
:edit/time 1587755948484,
:edit/email "tangj1122@gmail.com"}],
:block/uid "aBRbXRtL4",
:edit/time 1587755936702,
:edit/email "tangj1122@gmail.com"}],
:block/uid "qck5aUyRX",
:edit/time 1587756486609,
:edit/email "tangj1122@gmail.com"}
{:block/string "[[Producing Open Source Software]]",
:create/email "tangj1122@gmail.com",
:create/time 1587755609754,
:block/uid "6hbpfIx5n",
:edit/time 1588448517458,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1587756983007,
:block/uid "k4ESkueeP",
:edit/time 1587756983007,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1587753665203,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587753905775,
:node/title "BDFL",
:edit/time 1587753905775,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587754204877,
:node/title "The Cathedral and the Bazaar",
:block/children
[{:block/string "type:: [[notes]]",
:create/email "tangj1122@gmail.com",
:create/time 1588385080875,
:block/uid "GCVcydC1X",
:edit/time 1588385096476,
:edit/email "tangj1122@gmail.com"}
{:block/string
"source:: http://www.catb.org/~esr/writings/cathedral-bazaar/cathedral-bazaar/",
:create/email "tangj1122@gmail.com",
:create/time 1588387837744,
:block/uid "i653vL-1z",
:edit/time 1588387858266,
:edit/email "tangj1122@gmail.com"}
{:block/string "by #[[Eric S. Raymond]]",
:create/email "tangj1122@gmail.com",
:create/time 1588385145267,
:block/uid "-hVi9rEHh",
:edit/time 1588554662993,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1588387912365,
:block/uid "3iUoD96PY",
:edit/time 1588554660910,
:edit/email "tangj1122@gmail.com"}
{:block/string "Contents",
:create/email "tangj1122@gmail.com",
:create/time 1588387728950,
:block/children
[{:block/string "The Cathedral and the Bazaar",
:create/email "tangj1122@gmail.com",
:create/time 1588387855927,
:block/children
[{:block/string
"Linux overturned much of what I thought I knew. I had been preaching the Unix gospel of small tools, rapid prototyping and evolutionary programming for years. But I also believed there was a certain critical complexity above which a more centralized, a priori approach was required. I believed that the most important software (operating systems and really large tools like the [[Emacs]] programming editor) needed to be built like **cathedrals, carefully crafted by individual wizards or small bands of mages working in splendid isolation, with no beta to be released before its time.**",
:create/email "tangj1122@gmail.com",
:create/time 1588388045368,
:block/uid "ygyc904eg",
:edit/time 1588388091819,
:edit/email "tangj1122@gmail.com"}
{:block/string
"[[Linus Torvalds]]'s style of development—**release early and often, delegate everything you can, be open to the point of promiscuity**—came as a surprise. No quiet, reverent cathedral-building here—rather, the Linux community seemed to resemble **a great babbling bazaar of differing agendas and approaches** (aptly symbolized by the Linux archive sites, who'd take submissions from anyone) out of which a coherent and stable system could seemingly emerge only by a succession of miracles.",
:create/email "tangj1122@gmail.com",
:create/time 1588388040472,
:block/uid "XCbU5RPG2",
:edit/time 1588388082056,
:edit/email "tangj1122@gmail.com"}],
:block/uid "iXKN6qK2-",
:edit/time 1588387855947,
:edit/email "tangj1122@gmail.com"}
{:block/string "The Mail Must Get Through",
:create/email "tangj1122@gmail.com",
:create/time 1588387855927,
:block/children
[{:block/string
"1. Every good work of software starts by scratching a developer's personal itch. #[[The Cathedral and the Bazaar]]",
:create/email "tangj1122@gmail.com",
:create/time 1588388184442,
:block/uid "RQZ_pzaec",
:edit/time 1588554459463,
:edit/email "tangj1122@gmail.com"}
{:block/string
"**too often software developers spend their days grinding away for pay at programs they neither need nor love. **But not in the [[Linux]] world—which may explain why the average quality of software originated in the Linux community is so high.",
:create/email "tangj1122@gmail.com",
:create/time 1588388193057,
:block/uid "USV5aV7IA",
:edit/time 1588388507175,
:edit/email "tangj1122@gmail.com"}
{:block/string
"2. Good programmers know what to write. Great ones know what to rewrite (and reuse). While I don't claim to be a great programmer, I try to imitate one. #[[The Cathedral and the Bazaar]]",
:create/email "tangj1122@gmail.com",
:create/time 1588388230059,
:block/uid "BP1VNG7hG",
:edit/time 1588554455237,
:edit/email "tangj1122@gmail.com"}
{:block/string
"3. Plan to throw one away; you will, anyhow. (Fred Brooks, [[The Mythical Man-Month]], Chapter 11)",
:create/email "tangj1122@gmail.com",
:create/time 1588388278643,
:block/uid "q0jvS-Duc",
:edit/time 1588388400739,
:edit/email "tangj1122@gmail.com"}
{:block/string
"4. If you have the right attitude, interesting problems will find you.",
:create/email "tangj1122@gmail.com",
:create/time 1588388248887,
:block/uid "OgpTAxHk2",
:edit/time 1588388476015,
:edit/email "tangj1122@gmail.com"}
{:block/string
"5. When you lose interest in a program, your last duty to it is to hand it off to a competent successor. #succession ",
:create/email "tangj1122@gmail.com",
:create/time 1588388476980,
:block/uid "HEHzs24CW",
:edit/time 1588388497379,
:edit/email "tangj1122@gmail.com"}],
:block/uid "NKJBxu65X",
:edit/time 1588387855947,
:edit/email "tangj1122@gmail.com"}
{:block/string "The Importance of Having Users",
:create/email "tangj1122@gmail.com",
:create/time 1588387855927,
:block/children
[{:block/string
"6. Treating your users as co-developers is your least-hassle route to rapid code improvement and effective debugging.",
:create/email "tangj1122@gmail.com",
:create/time 1588388589137,
:block/uid "efNq1euys",
:edit/time 1588388595758,
:edit/email "tangj1122@gmail.com"}
{:block/string
"In fact, I think Linus's cleverest and most consequential hack was not the construction of the Linux kernel itself, but rather his invention of the **Linux development model**. When I expressed this opinion in his presence once, he smiled and quietly repeated something he has often said: \"I'm basically a very lazy person who likes to get credit for things other people actually do.'' Lazy like a fox. Or, as Robert Heinlein famously wrote of one of his characters, too lazy to fail. #fox #[[Linus Torvalds]]",
:create/email "tangj1122@gmail.com",
:create/time 1588388599085,
:block/uid "xGSKy0mD3",
:edit/time 1588554497354,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Users of MATLAB and other products with a similar structure invariably report that the action, the ferment, the innovation mostly takes place in the open part of the tool where a large and varied community can tinker with it.",
:create/email "tangj1122@gmail.com",
:create/time 1588388670742,
:block/uid "67QHP63os",
:edit/time 1588388743555,
:edit/email "tangj1122@gmail.com"}],
:block/uid "NPfSyTpRk",
:edit/time 1588388597334,
:edit/email "tangj1122@gmail.com"}
{:block/string "[[Release Early, Release Often]]",
:create/email "tangj1122@gmail.com",
:create/time 1588387855927,
:block/children
[{:block/string
"7. Release early. Release often. And listen to your customers.",
:create/email "tangj1122@gmail.com",
:create/time 1588388810530,
:block/uid "TpiooN2Jj",
:edit/time 1588388876041,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Linus's innovation wasn't so much in doing quick-turnaround releases incorporating lots of user feedback (something like this had been Unix-world tradition for a long time), but in scaling it up to a level of intensity that matched the complexity of what he was developing. In those early times (around 1991) **it wasn't unknown for him to release a new kernel more than once a __day!__** Because he cultivated his base of co-developers and leveraged the Internet for collaboration harder than anyone else, this worked.",
:create/email "tangj1122@gmail.com",
:create/time 1588388902604,
:block/uid "e6ZCjQ3uR",
:edit/time 1588388915193,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Linus is not (or at least, not yet) an innovative genius of design in the way that, say, Richard Stallman or James Gosling (of NeWS and Java) are. Rather, Linus seems to me to be a genius of engineering and implementation, with a sixth sense for avoiding bugs and development dead-ends and a true knack for finding the minimum-effort path from point A to point B. Indeed, the whole design of Linux breathes this quality and mirrors Linus's essentially conservative and simplifying design approach. #[[Linus Torvalds]] #Linux",
:create/email "tangj1122@gmail.com",
:create/time 1588388960310,
:block/uid "-EI1mmQ6x",
:edit/time 1588388980992,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Put that way, the question answers itself. Linus was keeping his hacker/users constantly stimulated and rewarded—**stimulated by the prospect of having an ego-satisfying piece of the action**, rewarded by the sight of constant (even __daily__) improvement in their work. #ego",
:create/email "tangj1122@gmail.com",
:create/time 1588389009975,
:block/uid "hkfYMy1zI",
:edit/time 1588389035904,
:edit/email "tangj1122@gmail.com"}
{:block/string " #[[Linus's Law]]",
:create/email "tangj1122@gmail.com",
:create/time 1588389265216,
:block/children
[{:block/string
"8. Given a large enough beta-tester and co-developer base, almost every problem will be characterized quickly and the fix obvious to someone... \"Given enough eyeballs, all bugs are shallow.\"",
:create/email "tangj1122@gmail.com",
:create/time 1588389026413,
:block/uid "fvqYPN_v6",
:edit/time 1588389263437,
:edit/email "tangj1122@gmail.com"}
{:block/string
"In Linus's Law, I think, lies the core difference underlying the cathedral-builder and bazaar styles. In the cathedral-builder view of programming, **bugs and development problems are tricky, insidious, deep phenomena**. It takes months of scrutiny by a dedicated few to develop confidence that you've winkled them all out. Thus the long release intervals, and the inevitable disappointment when long-awaited releases are not perfect.\nIn the bazaar view, on the other hand, you assume that bugs are generally shallow phenomena—or, at least, that they turn **shallow pretty quickly when exposed to a thousand eager co-developers pounding on every single new release**. Accordingly you release often in order to get more corrections, and as a beneficial side effect you have less to lose if an occasional botch gets out the door.",
:block/uid "HcVESsGHS",
:edit/time 1588389222858,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Linus's Law can be rephrased as \"Debugging is parallelizable''. Although debugging requires debuggers to communicate with some coordinating developer,** it doesn't require significant coordination between debuggers. Thus it doesn't fall prey to the same quadratic complexity and management costs that make adding developers problematic.**",
:create/email "tangj1122@gmail.com",
:create/time 1588389273515,
:block/uid "rXEONgWbi",
:edit/time 1588389415859,
:edit/email "tangj1122@gmail.com"}
{:block/string
"In case there are serious bugs, Linux kernel version are numbered in such a way that potential users can make a choice either to run the last version designated \"stable'' or to ride the cutting edge and risk bugs in order to get new features. This tactic is not yet systematically imitated by most Linux hackers, but perhaps it should be; **the fact that either choice is available makes both more attractive.** #[[autonomy]]",
:create/email "tangj1122@gmail.com",
:create/time 1588389757919,
:block/uid "StMuv7gjg",
:edit/time 1588389777589,
:edit/email "tangj1122@gmail.com"}],
:block/uid "fcRd7CVSe",
:edit/time 1588389266541,
:edit/email "tangj1122@gmail.com"}],
:block/uid "Ednefibq2",
:edit/time 1588388810409,
:edit/email "tangj1122@gmail.com"}
{:block/string "How Many Eyeballs Tame Complexity",
:create/email "tangj1122@gmail.com",
:create/time 1588387855927,
:block/children
[{:block/string
"One key to understanding is to realize exactly why it is that the kind of bug report non–source-aware users normally turn in tends not to be very useful. Non–source-aware users tend to report only surface symptoms; they take their environment for granted, so they (a) omit critical background data, and (b) seldom include a reliable recipe for reproducing the bug.",
:create/email "tangj1122@gmail.com",
:create/time 1588389847538,
:block/uid "6uJ4Vkm0L",
:edit/time 1588389848832,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Practically, there is a huge difference in leverage for the developer between the kind of bug report that just reports externally-visible symptoms and the kind that hooks directly to the developer's source-code–based mental representation of the program",
:create/email "tangj1122@gmail.com",
:create/time 1588389848829,
:block/uid "VOA8YPvak",
:edit/time 1588389868975,
:edit/email "tangj1122@gmail.com"}
{:block/string
"When someone among your beta-testers can point out, \"there's a boundary problem in line nnn\", or even just \"under conditions X, Y, and Z, this variable rolls over\", a quick look at the offending code often suffices to pin down the exact mode of failure and generate a fix.",
:create/email "tangj1122@gmail.com",
:create/time 1588389869892,
:block/uid "wnG3HeZaP",
:edit/time 1588389910999,
:edit/email "tangj1122@gmail.com"}
{:block/string
"[[Brooks's Law]] is founded on experience that bugs tend strongly to cluster at the interfaces between code written by different people, and that communications/coordination overhead on a project tends to rise with the number of interfaces between human beings.",
:create/email "tangj1122@gmail.com",
:create/time 1588389910995,
:block/uid "szKs02vqB",
:edit/time 1588389970237,
:edit/email "tangj1122@gmail.com"}
{:block/string
"The Brooks's Law analysis (and the resulting fear of large numbers in development groups) rests on a hidden assummption: that the communications structure of the project is necessarily a complete graph, that everybody talks to everybody else. But on open-source projects, the halo developers work on what are in effect separable parallel subtasks and interact with each other very little; code changes and bug reports stream through the core group, and only within that small core group do we pay the full Brooksian overhead.",
:create/email "tangj1122@gmail.com",
:create/time 1588389997810,
:block/uid "tsvmqPvg2",
:edit/time 1588389998185,
:edit/email "tangj1122@gmail.com"}
{:block/string
"There are are still more reasons that source-code–level bug reporting tends to be very efficient. They center around the fact that a single error can often have multiple possible symptoms, manifesting differently depending on details of the user's usage pattern and environment. Such errors tend to be exactly the sort of complex and subtle bugs (such as dynamic-memory-management errors or nondeterministic interrupt-window artifacts) that are hardest to reproduce at will or to pin down by static analysis, and which do the most to create long-term problems in software.",
:create/email "tangj1122@gmail.com",
:create/time 1588390088258,
:block/uid "l4OxDRskH",
:edit/time 1588390090243,
:edit/email "tangj1122@gmail.com"}
{:block/string
"**trace-path difficulty for multiple symptoms of the same bug varies \"exponentially**\" (which I take to mean on a Gaussian or Poisson distribution, and agree seems very plausible). If it is experimentally possible to get a handle on the shape of this distribution, that would be extremely valuable data. Large departures from a flat equal-probability distribution of trace difficulty would suggest that **even solo developers should emulate the bazaar strategy by bounding the time they spend on tracing a given symptom before they switch to another**. Persistence may not always be a virtue",
:create/email "tangj1122@gmail.com",
:create/time 1588391219842,
:block/uid "p6kLneF2l",
:edit/time 1588391244150,
:edit/email "tangj1122@gmail.com"}],
:block/uid "ju-cpvVzB",
:edit/time 1588387855947,
:edit/email "tangj1122@gmail.com"}
{:block/string "When Is a Rose Not a Rose?",
:create/email "tangj1122@gmail.com",
:create/time 1588387855927,
:block/children
[{:block/string
"Carl Harris's implementation was very sound, but exhibited a kind of unnecessary complexity common to many C programmers. He treated the code as central and the data structures as support for the code. As a result, the code was beautiful but the data structure design ad-hoc and rather ugly (at least by the high standards of this veteran LISP hacker). #LISP #[[C Lang]]",
:create/email "tangj1122@gmail.com",
:create/time 1588445333175,
:block/uid "UVWdpYMwc",
:edit/time 1588445517656,
:edit/email "tangj1122@gmail.com"}
{:block/string
"9. Smart data structures and dumb code works a lot better than the other way around. [[The Cathedral and the Bazaar]] #[[Functional Programming]]",
:create/email "tangj1122@gmail.com",
:create/time 1588445560163,
:block/uid "4XEJCY9tW",
:edit/time 1588445608725,
:edit/email "tangj1122@gmail.com"}
{:block/string "Eric the growth hacker",
:create/email "tangj1122@gmail.com",
:create/time 1588445610352,
:block/children
[{:block/string
"I released early and often (almost never less often than every ten days; during periods of intense development, once a day).",
:create/email "tangj1122@gmail.com",
:create/time 1588445717395,
:block/uid "-RnmaM5ym",
:edit/time 1588445717395,
:edit/email "tangj1122@gmail.com"}
{:block/string
"I grew my beta list by adding to it everyone who contacted me about fetchmail.\n",
:create/email "tangj1122@gmail.com",
:create/time 1588445719534,
:block/uid "1g8kAjMgY",
:edit/time 1588445719534,
:edit/email "tangj1122@gmail.com"}
{:block/string
"I sent chatty announcements to the beta list whenever I released, encouraging people to participate.",
:create/email "tangj1122@gmail.com",
:create/time 1588445714300,
:block/uid "IPiiLEPqY",
:edit/time 1588445721033,
:edit/email "tangj1122@gmail.com"}
{:block/string
"And I listened to my beta-testers, polling them about design decisions and stroking them whenever they sent in patches and feedback.",
:create/email "tangj1122@gmail.com",
:create/time 1588445686790,
:block/uid "mPq4-9cH_",
:edit/time 1588445714303,
:edit/email "tangj1122@gmail.com"}],
:block/uid "G8nRE5-5r",
:edit/time 1588445686797,
:edit/email "tangj1122@gmail.com"}
{:block/string
"10. If you treat your beta-testers as if they're your most valuable resource, they will respond by becoming your most valuable resource.",
:create/email "tangj1122@gmail.com",
:create/time 1588445748921,
:block/uid "ydipywNtU",
:edit/time 1588445752356,
:edit/email "tangj1122@gmail.com"}],
:block/uid "eoLkqeOrD",
:edit/time 1588387855947,
:edit/email "tangj1122@gmail.com"}
{:block/string "Popclient becomes Fetchmail",
:create/email "tangj1122@gmail.com",
:create/time 1588387855927,
:block/children
[{:block/string
"11. The next best thing to having good ideas is recognizing good ideas from your users. Sometimes the latter is better.",
:create/email "tangj1122@gmail.com",
:create/time 1588445805076,
:block/uid "Oj4NKeNs5",
:edit/time 1588445898808,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Interestingly enough, you will quickly find that if you are completely and self-deprecatingly truthful about how much you owe other people, the world at large will treat you as though you did every bit of the invention yourself and are just being becomingly modest about your innate genius. We can all see how well this worked for Linus!",
:create/email "tangj1122@gmail.com",
:create/time 1588445898897,
:block/uid "7iiPPEC_G",
:edit/time 1588445965430,
:edit/email "tangj1122@gmail.com"}
{:block/string
"12. Often, the most striking and innovative solutions come from realizing that your concept of the problem was wrong.",
:create/email "tangj1122@gmail.com",
:create/time 1588445965427,
:block/uid "NjQIW5P2c",
:edit/time 1588445967131,
:edit/email "tangj1122@gmail.com"}
{:block/string
"When you hit a wall in development—when you find yourself hard put to think past the next patch—it's often time to ask **not whether you've got the right answer, but whether you're asking the right question**. Perhaps the problem needs to be reframed. #[[design]] #[[Framing]] #[[First Principles]]",
:create/email "tangj1122@gmail.com",
:create/time 1588445995216,
:block/uid "gmnZpn8Bb",
:edit/time 1588446058235,
:edit/email "tangj1122@gmail.com"}
{:block/string
"13. \"Perfection (in [[design]]) is achieved not when there is nothing more to add, but rather when there is nothing more to take away.''",
:create/email "tangj1122@gmail.com",
:create/time 1588446003572,
:block/uid "n6GVL64u4",
:edit/time 1588446146822,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Even at a higher level of design, it can be very valuable to have lots of co-developers random-walking through the design space near your product. Consider the way a puddle of water finds a drain, or better yet how ants find food: exploration essentially by diffusion, followed by exploitation mediated by a scalable communication mechanism. #[[collective intelligence]]",
:create/email "tangj1122@gmail.com",
:create/time 1588446148459,
:block/uid "8ad7QwEEV",
:edit/time 1588446416002,
:edit/email "tangj1122@gmail.com"}],
:block/uid "zc5voEZ41",
:edit/time 1588445577801,
:edit/email "tangj1122@gmail.com"}
{:block/string "Fetchmail Grows Up",
:create/email "tangj1122@gmail.com",
:create/time 1588387855927,
:block/children
[{:block/string
"Andy Tanenbaum had the original idea to build a simple native Unix for IBM PCs, for use as a teaching tool (he called it Minix). [[Linus Torvalds]] **pushed the Minix concept further than Andrew probably thought it could go**—and it grew into something wonderful. In the same way (though on a smaller scale), I took some ideas by Carl Harris and Harry Hochheiser and **pushed them hard**. ^^**Neither of us was \"original'**^^ in the romantic way people think is genius. But then, **most science and engineering and software development isn't done by original genius**, hacker mythology to the contrary. #[[Good Artists Copy; Great Artists Steal]]",
:create/email "tangj1122@gmail.com",
:create/time 1588446417303,
:block/uid "mqVOwySgB",
:edit/time 1588447867771,
:edit/email "tangj1122@gmail.com"}
{:block/string
"14. Any tool should be useful in the expected way, but a truly great tool lends itself to uses you never expected. #[[The Cathedral and the Bazaar]]",
:create/email "tangj1122@gmail.com",
:create/time 1588447131894,
:block/uid "yBGO7EWh2",
:edit/time 1588447245316,
:edit/email "tangj1122@gmail.com"}
{:block/string
"15. When writing gateway software of any kind, take pains to disturb the data stream as little as possible—and never throw away information unless the recipient forces you to!",
:create/email "tangj1122@gmail.com",
:create/time 1588447245311,
:block/uid "dwFLEWfT_",
:edit/time 1588447562002,
:edit/email "tangj1122@gmail.com"}],
:block/uid "nVfJfwRta",
:edit/time 1588387855947,
:edit/email "tangj1122@gmail.com"}
{:block/string "A Few More Lessons from Fetchmail",
:create/email "tangj1122@gmail.com",
:create/time 1588387855927,
:block/children
[{:block/string
"16. When your language is nowhere near Turing-complete, syntactic sugar can be your friend.",
:create/email "tangj1122@gmail.com",
:create/time 1588447552596,
:block/uid "hD6kl2Zqd",
:edit/time 1588447760482,
:edit/email "tangj1122@gmail.com"}
{:block/string
"17. A security system is only as secure as its secret. Beware of pseudo-secrets.",
:create/email "tangj1122@gmail.com",
:create/time 1588447794461,
:block/uid "cFih_ed8s",
:edit/time 1588447798350,
:edit/email "tangj1122@gmail.com"}
{:block/string "[[Innovation]]",
:create/email "tangj1122@gmail.com",
:create/time 1588448183848,
:block/children
[{:block/string
"But there is a more fundamental error in the implicit assumption that the __cathedral model__ (or the bazaar model, or any other kind of management structure) can somehow make innovation happen reliably. This is nonsense. Gangs don't have breakthrough insights—**even volunteer groups of bazaar anarchists are usually incapable of genuine originality**, let alone corporate committees of people with a survival stake in some status quo ante. **__Insight comes from individuals.__** The most their surrounding social machinery can ever hope to do is to be __responsive__ to breakthrough insights—to nourish and reward and rigorously test them instead of squashing them.",
:block/uid "pM9AYpiqj",
:edit/time 1588448208209,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Some will characterize this as a romantic view, a reversion to outmoded lone-inventor stereotypes. Not so; I am not asserting that groups are incapable of __developing__ breakthrough insights once they have been hatched; indeed, we learn from the peer-review process that such development groups are essential to producing a high-quality result. Rather I am pointing out that every such group development starts from—is necessarily sparked by—one good idea in one person's head. Cathedrals and bazaars and other social structures can catch that lightning and refine it, but they cannot make it on demand.",
:block/uid "vpIN6Bu8L",
:edit/time 1588448187813,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Therefore the root problem of innovation (in software, or anywhere else) is indeed how not to squash it—but, even more fundamentally, it is **__how to grow lots of people who can have insights in the first place__.** #[[The Cathedral and the Bazaar]]",
:block/uid "b1zCUYYJW",
:edit/time 1588448255846,
:edit/email "tangj1122@gmail.com"}],
:block/uid "73UkudyAn",
:edit/time 1588448187031,
:edit/email "tangj1122@gmail.com"}],
:block/uid "HBoKZcuyL",
:edit/time 1588387855947,
:edit/email "tangj1122@gmail.com"}
{:block/string "Necessary Preconditions for the Bazaar Style",
:create/email "tangj1122@gmail.com",
:create/time 1588387855927,
:block/children
[{:block/string
"When you start community-building, what you need to be able to present is a __plausible promise__. Your program doesn't have to work particularly well. It can be crude, buggy, incomplete, and poorly documented. What it must not fail to do is (a) run, and (b) convince potential co-developers that it can be evolved into something really neat in the foreseeable future. #[[Open-Source]]",
:create/email "tangj1122@gmail.com",
:create/time 1588448286423,
:block/uid "0vlbD4mEe",
:edit/time 1588448306511,
:edit/email "tangj1122@gmail.com"}
{:block/string
"I think it is not critical that the coordinator be able to originate designs of exceptional brilliance, but it is absolutely critical that the coordinator be able to recognize good design ideas from others. ",
:create/email "tangj1122@gmail.com",
:create/time 1588448306507,
:block/uid "y1iVQ022b",
:edit/time 1588448456480,
:edit/email "tangj1122@gmail.com"}
{:block/string "[[BDFL]]",
:create/email "tangj1122@gmail.com",
:create/time 1588448703768,
:block/children
[{:block/string
"There is another kind of skill not normally associated with software development which I think is **as important as design cleverness to bazaar projects—and it may be more important. A bazaar **project coordinator or leader must have good people and communications skills.",
:create/email "tangj1122@gmail.com",
:create/time 1588448666157,
:block/uid "b6i2JobDK",
:edit/time 1588448865133,
:edit/email "tangj1122@gmail.com"}
{:block/string
"This should be obvious. In order to build a development community, you need to attract people, interest them in what you're doing, and keep them happy about the amount of work they're doing. Technical sizzle will go a long way towards accomplishing this, but it's far from the whole story. The personality you project matters, too.",
:create/email "tangj1122@gmail.com",
:create/time 1588448691317,
:block/uid "NQC4xFb8R",
:edit/time 1588448692293,
:edit/email "tangj1122@gmail.com"}
{:block/string
"It is not a coincidence that Linus is a nice guy who makes people like him and want to help him. It's not a coincidence that I'm an energetic extrovert who enjoys working a crowd and has some of the delivery and instincts of a stand-up comic. To make the bazaar model work, it helps enormously if you have at least a little skill at charming people.",
:create/email "tangj1122@gmail.com",
:create/time 1588448722402,
:block/uid "F5-ycIKYg",
:edit/time 1588448722875,
:edit/email "tangj1122@gmail.com"}],
:block/uid "AxYp4c4QV",
:edit/time 1588448709146,
:edit/email "tangj1122@gmail.com"}],
:block/uid "NDWUWrYq-",
:edit/time 1588387855947,
:edit/email "tangj1122@gmail.com"}
{:block/string "The Social Context of Open-Source Software",
:create/email "tangj1122@gmail.com",
:create/time 1588387855927,
:block/children
[{:block/string
"18. To solve an interesting problem, start by finding a problem that is interesting to you.",
:create/email "tangj1122@gmail.com",
:create/time 1588449029764,
:block/uid "d69EjH6go",
:edit/time 1588449034718,
:edit/email "tangj1122@gmail.com"}
{:block/string
"The bazaar method, by harnessing the full power of the \"egoless programming'' effect, strongly mitigates the effect of [[Brooks's Law]]. The principle behind Brooks's Law is not repealed, but given a large developer population and cheap communications **its effects can be swamped by competing nonlinearities** that are not otherwise visible. This resembles the relationship between Newtonian and Einsteinian physics—the older system is still valid at low energies, but **if you push mass and velocity high enough you get surprises like nuclear explosions or Linux.**",
:create/email "tangj1122@gmail.com",
:create/time 1588449034714,
:block/uid "CKfAy9ThO",
:edit/time 1588449319450,
:edit/email "tangj1122@gmail.com"}
{:block/string
"The developer who uses only his or her own brain in a closed project is going to fall behind the developer who knows how to create an open, evolutionary context in which feedback exploring the design space, code contributions, bug-spotting, and other improvements come from from hundreds (perhaps thousands) of people. #[[Evolution]] #[[collective intelligence]]",
:create/email "tangj1122@gmail.com",
:create/time 1588449366018,
:block/uid "6IRd3LUQ_",
:edit/time 1588449491249,
:edit/email "tangj1122@gmail.com"}
{:block/string
"The **peer-to-peer part is essential to the community's astonishing productivity**. The point Kropotkin was trying to make about power relationships is developed further by the `SNAFU Principle': \"**True communication is possible only between equals**, because inferiors are more consistently rewarded for telling their superiors pleasant lies than for telling the truth.'' Creative teamwork utterly depends on true communication and is thus very **seriously hindered by the presence of power relationships**. The open-source community, effectively free of such power relationships, is teaching us by contrast how dreadfully much they cost in bugs, in lowered productivity, and in lost opportunities. #[[P2P]] ",
:create/email "tangj1122@gmail.com",
:create/time 1588449911362,
:block/uid "UPbEkISaa",
:edit/time 1588449965994,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Earlier I referred to the \"Delphi effect'' as a possible explanation for Linus's Law. But more powerful analogies to adaptive systems in biology and economics also irresistably suggest themselves. **The Linux world behaves in many respects like a free market or an ecology, a collection of selfish agents attempting to maximize utility which in the process produces a self-correcting spontaneous order more elaborate and efficient than any amount of central planning could have achieved**. #[[Game Theory]] #[[Evolutionary Biology]]",
:block/uid "N5swmPlT0",
:edit/time 1588450313609,
:edit/email "tangj1122@gmail.com"}
{:block/string
"The \"utility function'' Linux hackers are maximizing is not classically economic, but is the **intangible of their own ego satisfaction and reputation among other hackers**. (One may call their motivation \"altruistic'', but this ignores the fact that altruism is itself a form of ego satisfaction for the altruist). Voluntary cultures that work this way are not actually uncommon; one other in which I have long participated is science fiction fandom, which unlike hackerdom has long explicitly recognized \"egoboo'' (ego-boosting, or the enhancement of one's reputation among other fans) as the basic drive behind volunteer activity.",
:block/uid "6S3VB-oI1",
:edit/time 1588450358267,
:edit/email "tangj1122@gmail.com"}
{:block/string
"19: Provided the development coordinator has a communications medium at least as good as the Internet, and knows how to lead without coercion, many heads are inevitably better than one.",
:create/email "tangj1122@gmail.com",
:create/time 1588449978042,
:block/uid "xbIJdjVwo",
:edit/time 1588450131358,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Perhaps in the end the open-source culture will triumph not because cooperation is morally right or software ``hoarding'' is morally wrong (assuming you believe the latter, which neither Linus nor I do), but simply because the closed-source world cannot win an evolutionary arms race with open-source communities that can put orders of magnitude more skilled time into a problem.",
:create/email "tangj1122@gmail.com",
:create/time 1588450170916,
:block/uid "94jipjs6_",
:edit/time 1588450171378,
:edit/email "tangj1122@gmail.com"}],
:block/uid "BKMt6AuKJ",
:edit/time 1588387855947,
:edit/email "tangj1122@gmail.com"}
{:block/string "On Management and the Maginot Line",
:create/email "tangj1122@gmail.com",
:create/time 1588387855927,
:block/children
[{:block/string
"In fact, there have been open-source projects that maintained a coherent direction and an effective maintainer community over quite long periods of time **without the kinds of incentive structures or institutional controls** that conventional management finds essential. The development of the GNU [[Emacs]] editor is an extreme and instructive example; it has absorbed the efforts of hundreds of contributors over 15 years into a unified architectural vision, despite high turnover and the fact that only one person (its author) has been continuously active during all that time. No closed-source editor has ever matched this longevity record. ",
:create/email "tangj1122@gmail.com",
:create/time 1588450379588,
:block/uid "GPYMvHEH2",
:edit/time 1588450493010,
:edit/email "tangj1122@gmail.com"}
{:block/string
"So what is all that management overhead buying?",
:create/email "tangj1122@gmail.com",
:create/time 1588450495013,
:block/uid "3DigOQ3m8",
:edit/time 1588450588661,
:edit/email "tangj1122@gmail.com"}
{:block/string
"A woman I know who seems to be very good at this job says software project management has five functions:",
:block/children
[{:block/string
"To __define goals__ and keep everybody pointed in the same direction",
:block/children
[{:block/string
"Can we save __defining goals__ as a justification for the overhead of conventional software project management? Perhaps; but to do so, we'll need good reason to believe that management committees and corporate roadmaps are more successful at defining worthy and widely shared goals than the project leaders and tribal elders who fill the analogous role in the open-source world.",
:create/email "tangj1122@gmail.com",
:create/time 1588451031231,
:block/uid "iUE47PWEY",
:edit/time 1588451032397,
:edit/email "tangj1122@gmail.com"}],
:block/uid "_7qa_YVyO",
:edit/time 1588450970128,
:edit/email "tangj1122@gmail.com"}
{:block/string
"To __monitor__ and make sure crucial details don't get skipped",
:block/children
[{:block/string
"the strongest argument the open-source community has is that decentralized peer review trumps all the conventional methods for trying to ensure that details don't get slipped.",
:create/email "tangj1122@gmail.com",
:create/time 1588451051635,
:block/uid "gZE8CLZ_S",
:edit/time 1588451052225,
:edit/email "tangj1122@gmail.com"}],
:block/uid "20tGLy2Vg",
:edit/time 1588450970128,
:edit/email "tangj1122@gmail.com"}
{:block/string
"To __motivate__ people to do boring but necessary drudgework",
:block/children
[{:block/string
"This answer usually travels with a claim that the open-source community can only be relied on only to do work that is \"sexy\" or technically sweet; anything else will be left undone (or done only poorly) unless it's **churned out by money-motivated cubicle peons with managers cracking whips over them**",
:create/email "tangj1122@gmail.com",
:create/time 1588451106383,
:block/uid "Kv-GVEoJ2",
:edit/time 1588451133917,
:edit/email "tangj1122@gmail.com"}],
:block/uid "CUpid2tFs",
:edit/time 1588450970128,
:edit/email "tangj1122@gmail.com"}
{:block/string
"To __organize__ the deployment of people for best productivity",
:block/children
[{:block/string
"That being the case, it's doubly important that open-source hackers __organize themselves__ for maximum productivity by self-selection—and the social milieu selects ruthlessly for competence. My friend, familiar with both the open-source world and large closed projects, believes that open source has been successful partly because its culture only accepts the most talented 5% or so of the programming population. She spends most of her time organizing the deployment of the other 95%, and has thus observed first-hand the well-known variance of a factor of one hundred in productivity between the most able programmers and the merely competent. #[[Self-Organization]] #[[Self-Selection]]",
:create/email "tangj1122@gmail.com",
:create/time 1588451320911,
:block/uid "75YS6B1FH",
:edit/time 1588451396245,
:edit/email "tangj1122@gmail.com"}],
:block/uid "17dgJaVK2",
:edit/time 1588450970128,
:edit/email "tangj1122@gmail.com"}
{:block/string
"To __marshal resources__ needed to sustain the project",
:block/children
[{:block/string
"But **open-source developers are volunteers, self-selected for both interest and ability** to contribute to the projects they work on (and this remains generally true even when they are being paid a salary to hack open source.) The volunteer ethos tends to take care of the \"attack\" side of resource-marshalling automatically; **people bring their own resources to the table**. And there is little or no need for a manager to \"play defense\" in the conventional sense.",
:create/email "tangj1122@gmail.com",
:create/time 1588451200143,
:block/uid "AZ9kpVS15",
:edit/time 1588451247949,
:edit/email "tangj1122@gmail.com"}],
:block/uid "EJs6UTfj0",
:edit/time 1588450970128,
:edit/email "tangj1122@gmail.com"}],
:block/uid "Fu6Nunvi3",
:edit/time 1588450970128,
:edit/email "tangj1122@gmail.com"}],
:block/uid "JHjSS44sf",
:edit/time 1588387855947,
:edit/email "tangj1122@gmail.com"}
{:block/string "Epilog: [[Netscape]] Embraces the Bazaar",
:create/email "tangj1122@gmail.com",
:create/time 1588387855927,
:block/children
[{:block/string
"However, it has not yet garnered the massive development effort from outside Netscape that the [[Mozilla]] founders had originally hoped for. The problem here seems to be that for a long time the Mozilla distribution actually broke one of the basic rules of the bazaar model; it didn't ship with something potential contributors could easily run and see working. (Until more than a year after release, **building Mozilla from source required a license for the proprietary Motif library**.)",
:create/email "tangj1122@gmail.com",
:create/time 1588451433283,
:block/uid "wjXz-Ei62",
:edit/time 1588451575176,
:edit/email "tangj1122@gmail.com"}],
:block/uid "l6ZjZoS_r",
:edit/time 1588451556649,
:edit/email "tangj1122@gmail.com"}
{:block/string "Notes",
:create/email "tangj1122@gmail.com",
:create/time 1588387855927,
:block/uid "PqHtxSDzs",
:edit/time 1588387855948,
:edit/email "tangj1122@gmail.com"}
{:block/string "Bibliography",
:create/email "tangj1122@gmail.com",
:create/time 1588387855927,
:block/uid "YrBds6Pxq",
:edit/time 1588387855948,
:edit/email "tangj1122@gmail.com"}
{:block/string "Acknowledgements",
:create/email "tangj1122@gmail.com",
:create/time 1588387855927,
:block/uid "ZKyBnS8gt",
:edit/time 1588387855948,
:edit/email "tangj1122@gmail.com"}],
:block/uid "yw2K4SPUb",
:edit/time 1588387820969,
:edit/email "tangj1122@gmail.com"}
{:block/string "Comments",
:create/email "tangj1122@gmail.com",
:create/time 1588385098970,
:block/children
[{:block/string
"Roam is a cult tool because it encourages users to tinker ... with everything ... but the source ;)",
:create/email "tangj1122@gmail.com",
:create/time 1588388794139,
:block/children
[{:block/string "((67QHP63os))",
:create/email "tangj1122@gmail.com",
:create/time 1588385092178,
:block/uid "lrAPG43Jh",
:edit/time 1588388795252,
:edit/email "tangj1122@gmail.com"}],
:block/uid "Fdyvm9r0E",
:edit/time 1588554604706,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Amazing. Bazaar's are the foil to the [[The Mythical Man-Month]].",
:create/email "tangj1122@gmail.com",
:create/time 1588389419747,
:block/children
[{:block/string "((rXEONgWbi))",
:create/email "tangj1122@gmail.com",
:create/time 1588389452613,
:block/uid "61xaeF5eC",
:edit/time 1588389453613,
:edit/email "tangj1122@gmail.com"}
{:block/string "((CKfAy9ThO))",
:create/email "tangj1122@gmail.com",
:create/time 1588449354581,
:block/uid "x5D2UVh31",
:edit/time 1588449355527,
:edit/email "tangj1122@gmail.com"}],
:block/uid "ObFknriMN",
:edit/time 1588389452495,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Do you want to wear the blue jacket or the red jacket?",
:create/email "tangj1122@gmail.com",
:create/time 1588389784647,
:block/children
[{:block/string "((StMuv7gjg))",
:create/email "tangj1122@gmail.com",
:create/time 1588389793751,
:block/uid "gp260FxOJ",
:edit/time 1588389794612,
:edit/email "tangj1122@gmail.com"}],
:block/uid "CwpJ2JY94",
:edit/time 1588389793163,
:edit/email "tangj1122@gmail.com"}
{:block/string
"This was my hypothesis. [[Linus's Law]] applies generally, that you are amortizing and distributing effort over many programmers. But Open-Source was an especially good match for the OS because of the nature of C kernel bugs, namely, sneaky memory management errors. What classes of bugs are common to Clojure? The bugs associated with dynamic languages!",
:create/email "tangj1122@gmail.com",
:create/time 1588390101648,
:block/children
[{:block/string "((l4OxDRskH))",
:create/email "tangj1122@gmail.com",
:create/time 1588390107352,
:block/uid "vFVCVBv2M",
:edit/time 1588390108285,
:edit/email "tangj1122@gmail.com"}],
:block/uid "Cp-Zh9WJ2",
:edit/time 1588391048406,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Super interesting, though, because Clojure leans __heavily__ towards the Cathedral, for an open-source project. I suppose not everyone can be Rich though...",
:create/email "tangj1122@gmail.com",
:create/time 1588391251429,
:block/uid "vCmIXT4nR",
:edit/time 1588554755685,
:edit/email "tangj1122@gmail.com"}
{:block/string "Reactions to reactions...",
:create/email "tangj1122@gmail.com",
:create/time 1588391304474,
:block/children
[{:block/string "((mqVOwySgB))",
:create/email "tangj1122@gmail.com",
:create/time 1588447880342,
:block/uid "z1OybH_Fn",
:edit/time 1588447881215,
:edit/email "tangj1122@gmail.com"}],
:block/uid "eGi9VtSAe",
:edit/time 1588447888578,
:edit/email "tangj1122@gmail.com"}
{:block/string "Mirrors [[Producing Open Source Software]]",
:create/email "tangj1122@gmail.com",
:create/time 1588448463398,
:block/children
[{:block/string "CATB: ((y1iVQ022b))",
:create/email "tangj1122@gmail.com",
:create/time 1588448499054,
:block/uid "JnIOFz56H",
:edit/time 1588448559348,
:edit/email "tangj1122@gmail.com"}
{:block/string "POSS: ((JCpuHZU3u))",
:create/email "tangj1122@gmail.com",
:create/time 1588448483422,
:block/uid "M9zdQe_Uu",
:edit/time 1588448557006,
:edit/email "tangj1122@gmail.com"}],
:block/uid "paCYGms0j",
:edit/time 1588448548768,
:edit/email "tangj1122@gmail.com"}],
:block/uid "taCX3pIq1",
:edit/time 1588385100404,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1587754204878,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587754336595,
:node/title "Linus Torvalds",
:edit/time 1587754336604,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587754353810,
:node/title "Richard Stallman",
:edit/time 1587754353811,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587754361314,
:node/title "Emacs",
:edit/time 1587754361315,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587754786611,
:node/title "forking",
:edit/time 1587754786612,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587754958627,
:node/title "decentralization",
:edit/time 1587754958628,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587755852439,
:node/title "lazy consensus’",
:edit/time 1587755852440,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587756661114,
:node/title "GNU GPL",
:edit/time 1587756661116,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587757547747,
:node/title "writing",
:edit/time 1587757547747,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587757566453,
:node/title "leverage",
:edit/time 1587757566454,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587778380504,
:node/title "Hyperlink",
:block/children
[{:block/string "type:: notes",
:create/email "tangj1122@gmail.com",
:create/time 1587823698714,
:block/uid "7ZHM9WBJ4",
:edit/time 1587823701324,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1587823701321,
:block/uid "YDTpf-rMy",
:edit/time 1587823701321,
:edit/email "tangj1122@gmail.com"}
{:block/string "https://en.wikipedia.org/wiki/Hyperlink",
:create/email "tangj1122@gmail.com",
:create/time 1587778408408,
:block/children
[{:block/string
"In some hypertext, hyperlinks can be bidirectional: they can be followed in two directions, so both ends act as anchors and as targets. More complex arrangements exist, such as many-to-many links.",
:create/email "tangj1122@gmail.com",
:create/time 1587778382800,
:block/uid "ekpvuMWbj",
:edit/time 1587778415812,
:edit/email "tangj1122@gmail.com"}
{:block/string
"The effect of following a hyperlink may vary with the hypertext system and may sometimes depend on the link itself; for instance, on the World Wide Web most hyperlinks cause the target document to replace the document being displayed, but some are marked to cause the target document to open in a new window (or, perhaps, in a new tab[2]). Another possibility is [[transclusion]], for which the link target is a document fragment that replaces the link anchor within the source document. Not only persons browsing the document follow hyperlinks. These hyperlinks may also be followed automatically by programs. A program that traverses the hypertext, following each hyperlink and gathering all the retrieved documents is known as a Web spider or crawler.",
:create/email "tangj1122@gmail.com",
:create/time 1587778418503,
:block/uid "sXHI5FK64",
:edit/time 1587778564990,
:edit/email "tangj1122@gmail.com"}
{:block/string
"A **fat link** (also known as a \"one-to-many\" link, an \"extended link\"[4]) or a \"multi-tailed link\" [5] is a **hyperlink which leads to multiple endpoints**; the link is a multivalued function.",
:create/email "tangj1122@gmail.com",
:create/time 1587778561968,
:block/uid "RrYc_7MPT",
:edit/time 1587778656046,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Webgraph is a graph, formed from web pages as vertices and hyperlinks, as directed edges.",
:create/email "tangj1122@gmail.com",
:create/time 1587778642513,
:block/uid "YDDdtGRlI",
:edit/time 1587778740569,
:edit/email "tangj1122@gmail.com"}
{:block/string
"**Permalinks** are URLs that are intended to remain unchanged for many years into the future, yielding hyperlink that are less susceptible to **link rot**. Permalinks are often rendered simply, that is, as friendly URLs, so as to be easy for people to type and remember. Permalinks are used in order to point and redirect readers to the same Web page, blog post or any online digital media[9].",
:create/email "tangj1122@gmail.com",
:create/time 1587778740564,
:block/uid "-egRK52sJ",
:edit/time 1587779165287,
:edit/email "tangj1122@gmail.com"}
{:block/string
"The scientific literature is a place where link persistence is crucial to the public knowledge. A 2013 study in BMC Bioinformatics analyzed 15,000 links in abstracts from Thomson Reuters’ Web of Science citation index, founding that **the median lifespan of Web pages was 9.3 years, and just 62% were archived**.[10] The median lifespan of a Web page constitutes high-degree variable, but its order of magnitude usually is of some months.[11]",
:create/email "tangj1122@gmail.com",
:create/time 1587778935289,
:block/uid "Dc63ZgNzb",
:edit/time 1587779146483,
:edit/email "tangj1122@gmail.com"}
{:block/string
"It uses the HTML element \"a\" with the attribute \"href\" (HREF is an abbreviation for \"**Hypertext REFerence**\"[12]) and optionally also the attributes \"title\", \"target\", and \"class\" or \"id\"",
:create/email "tangj1122@gmail.com",
:create/time 1587779122088,
:block/uid "eqEXIPpP9",
:edit/time 1587779338629,
:edit/email "tangj1122@gmail.com"}
{:block/string
" database program [[HyperCard]] was released in 1987 for the Apple Macintosh that allowed hyperlinking between various pages within a document, and was probably the first use of the word \"hyperlink",
:create/email "tangj1122@gmail.com",
:create/time 1587779336960,
:block/uid "kqTCXm_yU",
:edit/time 1587779486571,
:edit/email "tangj1122@gmail.com"}
{:block/string
"The first widely used open protocol that included hyperlinks from any Internet site to any other Internet site was the **Gopher protocol** from 1991. It was soon eclipsed by HTML after the 1993 release of the [[Mosaic]] browser (which could handle Gopher links as well as HTML links). HTML's advantage was the ability to mix graphics, text, and hyperlinks, unlike Gopher, which just had menu-structured text and hyperlinks",
:create/email "tangj1122@gmail.com",
:create/time 1587779123700,
:block/uid "shz0NlaMi",
:edit/time 1587779500440,
:edit/email "tangj1122@gmail.com"}
{:block/string
"While hyperlinking among webpages is an intrinsic feature of the web, some websites object to being linked by other websites; some have claimed that linking to them is not allowed without permission.",
:create/email "tangj1122@gmail.com",
:create/time 1587779466016,
:block/uid "Wt3tKYZDA",
:edit/time 1587780071761,
:edit/email "tangj1122@gmail.com"}],
:block/uid "VzPuJjfd2",
:edit/time 1587778416389,
:edit/email "tangj1122@gmail.com"}
{:block/string "https://en.wikipedia.org/wiki/Backlink",
:create/email "tangj1122@gmail.com",
:create/time 1587780071758,
:block/children
[{:block/string
"**Backlinks are offered in Wikis, but usually only within the bounds of the Wiki itself and enabled by the database backend. **MediaWiki, specifically offers the \"What links here\" tool, some older Wikis, especially the first WikiWikiWeb, had the backlink functionality exposed in the page title.",
:create/email "tangj1122@gmail.com",
:create/time 1587780072761,
:block/uid "fng0afASL",
:edit/time 1587780102737,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Search engines often use the number of backlinks that a website has as one of the most important factors for determining that website's search engine ranking, popularity and importance. Google's description of its PageRank system, for instance, notes that \"Google interprets a link from page A to page B as a vote, by page A, for page B.",
:create/email "tangj1122@gmail.com",
:create/time 1587780103762,
:block/uid "FpUyVEMN1",
:edit/time 1587780389985,
:edit/email "tangj1122@gmail.com"}],
:block/uid "H0FXP0c3Q",
:edit/time 1587780072421,
:edit/email "tangj1122@gmail.com"}
{:block/string "Linkback",
:create/email "tangj1122@gmail.com",
:create/time 1587780390749,
:block/children
[{:block/string
"A linkback is a method for Web authors to obtain notifications when other authors link to one of their documents. This enables authors to keep track of who is linking to, or referring to, their articles. The four methods (Refback, Trackback, Pingback and Webmention) differ in how they accomplish this task.",
:create/email "tangj1122@gmail.com",
:create/time 1587780562921,
:block/uid "C6FO9Giqn",
:edit/time 1587780566837,
:edit/email "tangj1122@gmail.com"}],
:block/uid "JGR1uZgy0",
:edit/time 1587780706957,
:edit/email "tangj1122@gmail.com"}
{:block/string "Trackback",
:create/email "tangj1122@gmail.com",
:create/time 1587780703514,
:block/children
[{:block/string
"A trackback is an acknowledgment. This acknowledgment is sent via a network signal (XML-RPC ping) from the originating site to the receiving site. The receptor often publishes a link back to the originator indicating its worthiness. **Trackback requires both sites to be trackback-enabled in order to establish this communication.**",
:create/email "tangj1122@gmail.com",
:create/time 1587780712509,
:block/uid "hOCOOluZ8",
:edit/time 1587780722636,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Some individuals or companies have abused the TrackBack feature to insert spam links on some blogs. This is similar to comment spam but avoids some of the safeguards designed to stop the latter practice. As a result, TrackBack spam filters similar to those implemented against comment spam now exist in many weblog publishing systems. Many blogs have stopped using trackbacks because dealing with spam became too much of a burden",
:create/email "tangj1122@gmail.com",
:create/time 1587780723263,
:block/uid "_avg0uZuz",
:edit/time 1587780798154,
:edit/email "tangj1122@gmail.com"}],
:block/uid "wS-AtXyHn",
:edit/time 1587780710159,
:edit/email "tangj1122@gmail.com"}
{:block/string "Pingback",
:create/email "tangj1122@gmail.com",
:create/time 1587780799840,
:block/children
[{:block/string
"In March 2014, Akamai published a report about a widely seen exploit involving Pingback that targets vulnerable WordPress sites.[1] This exploit led to massive abuse of legitimate blogs and websites and turned them into unwilling participants in a DDoS attack.[2] Details about this vulnerability have been publicized since 2012.[3]",
:create/email "tangj1122@gmail.com",
:create/time 1587780824993,
:block/uid "XyesVee2k",
:edit/time 1587780854481,
:edit/email "tangj1122@gmail.com"}],
:block/uid "JBFk5Uc7r",
:edit/time 1587780824996,
:edit/email "tangj1122@gmail.com"}
{:block/string "Webmention",
:create/email "tangj1122@gmail.com",
:create/time 1587780854478,
:block/children
[{:block/string
"Similar to pingback, Webmention is one of four types of linkbacks, but was designed to be simpler than the XML-RPC protocol that pingback relies upon, by instead only using HTTP and x-www-urlencoded content.[2]. Beyond previous linkback protocols, Webmention also specifies protocol details for when a page that is the source of a link is deleted, or updated with new links or removal of existing links",
:create/email "tangj1122@gmail.com",
:create/time 1587781001403,
:block/uid "cU-OjOmW8",
:edit/time 1587781030618,
:edit/email "tangj1122@gmail.com"}
{:block/string
"published as a W3C working draft on January 12, 2016.[3] As of January 12, 2017 it is a W3C recommendation",
:create/email "tangj1122@gmail.com",
:create/time 1587781045076,
:block/uid "z54AwF39K",
:edit/time 1587781045655,
:edit/email "tangj1122@gmail.com"}],
:block/uid "ni62Bz4oU",
:edit/time 1587781001407,
:edit/email "tangj1122@gmail.com"}
{:block/string "Refback",
:create/email "tangj1122@gmail.com",
:create/time 1587781069555,
:block/children
[{:block/string
"A Refback is simply the usage of the HTTP referrer header to discover incoming links. Whenever a browser traverses an incoming link from Site A (originator) to Site B (receptor) the browser will send a referrer value indicating the URL from where the user came. Site B might publish a link to Site A after visiting Site A and extracting relevant information from Site A such as the title, meta information, the link text, and so on.[1]\n\n",
:create/email "tangj1122@gmail.com",
:create/time 1587781088158,
:block/uid "KIgUMwz54",
:edit/time 1587781088967,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1587781089483,
:block/uid "Bvexgultr",
:edit/time 1587781089483,
:edit/email "tangj1122@gmail.com"}],
:block/uid "SXpTdaKTw",
:edit/time 1587781071905,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1587778380506,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587778564991,
:node/title "transclusion",
:edit/time 1587778564992,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587779486573,
:node/title "HyperCard",
:edit/time 1587779486574,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587779495945,
:node/title "Mosaic",
:edit/time 1587779495946,
:edit/email "tangj1122@gmail.com"}
{:node/title "April 25th, 2020",
:block/children
[{:block/string
"[[[[Datomic]]: [[Event Sourcing]] without the hassle]]",
:create/email "tangj1122@gmail.com",
:create/time 1587823705202,
:block/uid "WNkp8_jEO",
:edit/time 1587999528005,
:edit/email "tangj1122@gmail.com"}
{:block/string "[[Notes from [[Dynamicland]]: [[Geokit]]]]",
:create/email "tangj1122@gmail.com",
:create/time 1587823794354,
:block/uid "ETk3jfpxS",
:edit/time 1587922727643,
:edit/email "tangj1122@gmail.com"}
{:block/string "[[[[Distributed Systems]] and the End of the API]]",
:create/email "tangj1122@gmail.com",
:create/time 1587922641939,
:block/uid "VhLGQoPJN",
:edit/time 1587923319404,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1587806587204,
:edit/email "eloi.poch@gmail.com"}
{:node/title "April 26th, 2020",
:block/children
[{:block/string "[[Athens Change Log]]",
:create/email "tangj1122@gmail.com",
:create/time 1587919792725,
:block/children
[{:block/string
"transfer Github ownership from tangjeff0 to athensresearch: https://github.com/athensresearch/athens",
:create/email "tangj1122@gmail.com",
:create/time 1587919797621,
:block/uid "3CGV05h-Q",
:edit/time 1588083584239,
:edit/email "tangj1122@gmail.com"}],
:block/uid "wbzYBXDFZ",
:edit/time 1587919797628,
:edit/email "tangj1122@gmail.com"}
{:block/string
"[[[[Future of Coding]] Podcast #46 - 2020 Community Survey]]",
:create/email "tangj1122@gmail.com",
:create/time 1587947733443,
:block/uid "ADDBNMG9o",
:edit/time 1587947854362,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1587947803079,
:block/uid "R372ZV-Xu",
:edit/time 1587947803079,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1587889503723,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587823791725,
:node/title "[[Datomic]]: [[Event Sourcing]] without the hassle",
:block/children
[{:block/string
"source:: https://vvvvalvalval.github.io/posts/2018-11-12-datomic-event-sourcing-without-the-hassle.html",
:create/email "tangj1122@gmail.com",
:create/time 1587924500182,
:block/uid "QWtDC_dxr",
:edit/time 1587924509018,
:edit/email "tangj1122@gmail.com"}
{:block/string "type:: notes",
:create/email "tangj1122@gmail.com",
:create/time 1587924509015,
:block/uid "xx6WsRK_l",
:edit/time 1587924511666,
:edit/email "tangj1122@gmail.com"}
{:block/string "Contents",
:create/email "tangj1122@gmail.com",
:create/time 1587924536903,
:block/children
[{:block/string
"[[Event Sourcing]] consists of keeping track not of the current state, but of the entire sequence of state transitions which led to it. These state transitions are called Events, and are the \"source of truth\" of the system, from which the current state (or any past state) is inferred (hence the name Event Sourcing).",
:create/email "tangj1122@gmail.com",
:create/time 1587924534598,
:block/uid "RU-xD_iwA",
:edit/time 1587924570892,
:edit/email "tangj1122@gmail.com"}
{:block/string
"The sequence of events is stored in an Event Log, and it's important to understand that this Event Log is accumulate-only: events are (normally) only ever appended to the Log, never modified or erased.",
:create/email "tangj1122@gmail.com",
:create/time 1587924534598,
:block/uid "nzozrLovb",
:edit/time 1587924534611,
:edit/email "tangj1122@gmail.com"}
{:block/string "Benefits of Event Sourcing:",
:create/email "tangj1122@gmail.com",
:create/time 1587924534598,
:block/children
[{:block/string
"You don't lose information (since you only ever add to the data you have already written); in particular, **it's possible to reproduce a past state of the system.**",
:create/email "tangj1122@gmail.com",
:create/time 1587924534598,
:block/uid "VpneGrCVo",
:edit/time 1587924583960,
:edit/email "tangj1122@gmail.com"}
{:block/string
"**Data synchronization is easier**: since you can determine what data has been recently added, you can propagate novelty to other components of the system, which lets you build materialized views (e.g representing your data in search or analytics-optimized query engines such as ElasticSearch), send notifications (e.g to a browser UI), etc.",
:create/email "tangj1122@gmail.com",
:create/time 1587924534598,
:block/uid "wDPBXurpW",
:edit/time 1587924605980,
:edit/email "tangj1122@gmail.com"}],
:block/uid "w6YsMfdXT",
:edit/time 1587924534611,
:edit/email "tangj1122@gmail.com"}
{:block/string
"At the time of writing, the conventional way of implementing Event Sourcing is as follows:",
:create/email "tangj1122@gmail.com",
:create/time 1587924534598,
:block/children
[{:block/string
"You design a set of **Event Types** suited to your domain. (For instance: UserCreatedQuestion, UserUpdatedQuestion, UserCreatedAnswer, UserVotedOnQuestion, etc.).",
:create/email "tangj1122@gmail.com",
:create/time 1587924534598,
:block/uid "lgCNrqrai",
:edit/time 1587924621469,
:edit/email "tangj1122@gmail.com"}
{:block/string
"**Each Event is a record containing an Event Type**, a timestamp (when it was added to the Log), and data attributes specific to that Event Type (e.g question_id, user_id etc.).",
:create/email "tangj1122@gmail.com",
:create/time 1587924534598,
:block/uid "_GZmiQh8K",
:edit/time 1587924625295,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Downstream of the Event Log, **events are processed by Event Handlers** to maintain Aggregates of the data (for instance, a document store containing one document per Question), or trigger Reactions to events (e.g sending an email to a User when one of her questions was answered). Importantly, for technological reasons, this processing of events is typically asynchronous, with the implication that the Aggregates are at best eventually consistent with the Log (Aggregates \"lag behind\" the Log).",
:create/email "tangj1122@gmail.com",
:create/time 1587924534598,
:block/uid "k3TkrZYg2",
:edit/time 1587924632537,
:edit/email "tangj1122@gmail.com"}],
:block/uid "YGa0WTMpo",
:edit/time 1587924534611,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Life is not so easy with conventional Event Sourcing, because you have to anticipate every change you're going to want to apply to your state, design an Event Type for it, and implement the Event Handlers for this Event Type. Ad hoc writes are especially difficult, because any new way to write calls for new code.",
:create/email "tangj1122@gmail.com",
:create/time 1587924534598,
:block/uid "hzqFzfX7X",
:edit/time 1587924534611,
:edit/email "tangj1122@gmail.com"}
{:block/string
"I think the lesson here is that an enumeration of application-defined Event Types is a weak language for describing change.",
:create/email "tangj1122@gmail.com",
:create/time 1587924534598,
:block/uid "h87lBDH-s",
:edit/time 1587924534611,
:edit/email "tangj1122@gmail.com"}
{:block/string
"We need query power to determine how an Event affects the downstream Aggregates, but **an Event Log on its own offers very little query power.**",
:create/email "tangj1122@gmail.com",
:create/time 1587924534598,
:block/uid "gsGsTN92n",
:edit/time 1587924658053,
:edit/email "tangj1122@gmail.com"}
{:block/string
"**transactions are hardly compatible with eventually consistent writes, which is what you get by default when processing the Event Log asynchronously.** #[[Eventual Consistency]]",
:create/email "tangj1122@gmail.com",
:create/time 1587924534598,
:block/uid "Dlx0CWhih",
:edit/time 1587924704932,
:edit/email "tangj1122@gmail.com"}
{:block/string
"conventional Event Sourcing tempts you to forget the essential distinctions between Commands and Events",
:create/email "tangj1122@gmail.com",
:create/time 1587924534598,
:block/uid "5F9cm4GQi",
:edit/time 1587924534611,
:edit/email "tangj1122@gmail.com"}
{:block/string
"A Command is a request for change. It's usually formulated in the imperative mood (e.g AddItemToCart). You typically want them to be ephemeral and processed exactly once.",
:create/email "tangj1122@gmail.com",
:create/time 1587924534598,
:block/uid "ZlBASjPBU",
:edit/time 1587924534611,
:edit/email "tangj1122@gmail.com"}
{:block/string
"An Event, as we already mentioned, describes a change that happened. It's usually formulated in the past tense and indicative mood (e.g ItemAddedToCart). You typically want them to be durable, and processed as many times as you like.",
:create/email "tangj1122@gmail.com",
:create/time 1587924534598,
:block/uid "McBfVga3v",
:edit/time 1587924534611,
:edit/email "tangj1122@gmail.com"}
{:block/string
"From this perspective, **a transactional engine is a process which turns Commands into Events.**",
:create/email "tangj1122@gmail.com",
:create/time 1587924534598,
:block/uid "tAuO-npmw",
:edit/time 1587924681346,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Now we start to see the deep similarities between Datomic and the Event Sourcing notions we've laid out so far:",
:create/email "tangj1122@gmail.com",
:create/time 1587924534598,
:block/children
[{:block/string "Transaction Requests correspond to Commands",
:create/email "tangj1122@gmail.com",
:create/time 1587924534598,
:block/uid "BApvUPr6Y",
:edit/time 1587924534611,
:edit/email "tangj1122@gmail.com"}
{:block/string "Transactions correspond to Events",
:create/email "tangj1122@gmail.com",
:create/time 1587924534598,
:block/uid "hP03q3ZtI",
:edit/time 1587924534611,
:edit/email "tangj1122@gmail.com"}
{:block/string "a Datomic database corresponds to an Event Log",
:create/email "tangj1122@gmail.com",
:create/time 1587924534598,
:block/uid "SB_Mu-jMC",
:edit/time 1587924534611,
:edit/email "tangj1122@gmail.com"}],
:block/uid "NyP-UW9o4",
:edit/time 1587924534611,
:edit/email "tangj1122@gmail.com"}
{:block/string "We also see some important differences:",
:create/email "tangj1122@gmail.com",
:create/time 1587924534598,
:block/children
[{:block/string
"Events consist of a combination of fine-grained Datoms;** there is no Event Type with a prescribed structure.**",
:create/email "tangj1122@gmail.com",
:create/time 1587924534598,
:block/uid "tq25UpAGM",
:edit/time 1587924754667,
:edit/email "tangj1122@gmail.com"}],
:block/uid "LFt7oX1Th",
:edit/time 1587924534611,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Events are directly not produced by application code; Transaction Requests (Commands) are.",
:create/email "tangj1122@gmail.com",
:create/time 1587924534598,
:block/uid "Xbu3hFjFT",
:edit/time 1587924534611,
:edit/email "tangj1122@gmail.com"}
{:block/string
"you may want to keep track of what User caused the change",
:create/email "tangj1122@gmail.com",
:create/time 1587924534598,
:block/uid "OJH8OJFd_",
:edit/time 1587924534612,
:edit/email "tangj1122@gmail.com"}
{:block/string
"you may want to know from what UI action the change originated",
:create/email "tangj1122@gmail.com",
:create/time 1587924534598,
:block/uid "NMfywqYAu",
:edit/time 1587924534612,
:edit/email "tangj1122@gmail.com"}
{:block/string
"The recommended way to do that with Datomic is using [[Reified Transactions]]: Datomic Transactions being Entities themselves, you can add facts about them.",
:create/email "tangj1122@gmail.com",
:create/time 1587924534598,
:block/uid "Z2HRTDNHP",
:edit/time 1587924797829,
:edit/email "tangj1122@gmail.com"}],
:block/uid "Q3vzbRZsr",
:edit/time 1587924538391,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1587924500188,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587922641943,
:node/title "Notes from [[Dynamicland]]: [[Geokit]]",
:block/children
[{:block/string
"source:: https://rsnous.com/posts/notes-from-dynamicland-geokit/",
:create/email "tangj1122@gmail.com",
:create/time 1587922691451,
:block/uid "f75wR46mR",
:edit/time 1587922691451,
:edit/email "tangj1122@gmail.com"}
{:block/string "type:: notes",
:create/email "tangj1122@gmail.com",
:create/time 1587922999244,
:block/uid "MJz_Up7OY",
:edit/time 1587923000650,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1587923000648,
:block/uid "u8itCdEXh",
:edit/time 1587923000647,
:edit/email "tangj1122@gmail.com"}
{:block/string "Comments",
:create/email "tangj1122@gmail.com",
:create/time 1587922988577,
:block/children
[{:block/string
"How else could we show multiple views of links and blocks? Excel pivot tables, Airtable come to mind",
:create/email "tangj1122@gmail.com",
:create/time 1587922666864,
:block/children
[{:block/string "((_akrybTvZ))",
:create/email "tangj1122@gmail.com",
:create/time 1587922965232,
:block/uid "oevM3Wbnf",
:edit/time 1587922966107,
:edit/email "tangj1122@gmail.com"}],
:block/uid "3d_3U2SdE",
:edit/time 1587922959124,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Software is so much more ephemeral. It is more of a process, a [[tool for thought]] than a finalized artifact",
:create/email "tangj1122@gmail.com",
:create/time 1587922666864,
:block/children
[{:block/string "((Qh68OVcYz))",
:create/email "tangj1122@gmail.com",
:create/time 1587922855862,
:block/uid "KgrQ9f1YV",
:edit/time 1587922856582,
:edit/email "tangj1122@gmail.com"}],
:block/uid "itZnNyQiQ",
:edit/time 1587922841303,
:edit/email "tangj1122@gmail.com"}],
:block/uid "rlvDzAOXK",
:edit/time 1587922998178,
:edit/email "tangj1122@gmail.com"}
{:block/string "Contents",
:create/email "tangj1122@gmail.com",
:create/time 1587922647013,
:block/children
[{:block/string
"In both of these cases these just-dynamic-enough maps were places at the party, **just like the appetizers table and the piano**, where people could casually gather, play and converse",
:create/email "tangj1122@gmail.com",
:create/time 1587922666864,
:block/uid "RSqDj_YGk",
:edit/time 1587922710733,
:edit/email "tangj1122@gmail.com"}
{:block/string
"[[Realtalk]] is the programming system that runs inside Dynamicland. It includes a superset of the [[Lua]] programming language. You do 'pure' computation in Lua, but you use special Realtalk extensions to do all communication with other pages and with the outside world.",
:create/email "tangj1122@gmail.com",
:create/time 1587922666864,
:block/uid "OaTdA4a_L",
:edit/time 1587922733081,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Suppose you were implementing this tilelayer manipulation in traditional software. You'd probably make a list of tilelayers, with (+) and (-) buttons. You might put a check box next to each tilelayer. You'd have to implement drag and drop, and you'd have to handle events every time the user reordered the layers.",
:create/email "tangj1122@gmail.com",
:create/time 1587922666864,
:block/uid "phG-hPPn-",
:edit/time 1587922666894,
:edit/email "tangj1122@gmail.com"}
{:block/string
"This step starts to illustrate the power of the Realtalk model, in a way that I've tweeted about before. Look at how I've handled layers. Each layer is a page, and you put the layer down and point it to enable it and set its position. Nobody had to implement a checkbox or handle a drag event or synchronize an array with a UI view.",
:create/email "tangj1122@gmail.com",
:create/time 1587922666864,
:block/uid "I14QY2jcq",
:edit/time 1587922666894,
:edit/email "tangj1122@gmail.com"}
{:block/string
"One way to think about Realtalk is that **a lot of code in the outside world is about displaying lists and letting people pick from lists.**",
:create/email "tangj1122@gmail.com",
:create/time 1587922666864,
:block/uid "0PkkoivCo",
:edit/time 1587922754784,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Mapping software has to show a list of layers, and make them checkable and uncheckable, and make them draggable, and handle all the events, and remember what the state is.",
:create/email "tangj1122@gmail.com",
:create/time 1587922666864,
:block/uid "Jz2B01ZG2",
:edit/time 1587922666894,
:edit/email "tangj1122@gmail.com"}
{:block/string
"A photo app shows you a list of photos, and then you open one, and then you see a toolbox of operations you can apply, and then you pick one...",
:create/email "tangj1122@gmail.com",
:create/time 1587922666864,
:block/uid "bVOIXdqfQ",
:edit/time 1587922666895,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Even command-line programs let you ask for a list of source branches or a list of disk partitions or a list of files or whatever, and have some set of subcommands you can apply to your object of choice.",
:create/email "tangj1122@gmail.com",
:create/time 1587922666864,
:block/uid "X8wjXlFjA",
:edit/time 1587922666895,
:edit/email "tangj1122@gmail.com"}
{:block/string
"In Realtalk, most of that code falls away – provided that you represent your objects as individual physical pages. Once you have physical pages, you automatically get the operations of the physical world: placing and picking up objects, moving and grouping objects in space, pointing objects at each other, and so on.",
:create/email "tangj1122@gmail.com",
:create/time 1587922666864,
:block/uid "91OTXzogN",
:edit/time 1587922666895,
:edit/email "tangj1122@gmail.com"}
{:block/string
"We have a rule of thumb that **no program should be longer than a page (73 lines!) **If you have a longer program, you're probably doing something wrong, and you should split it up into little pages that work together.",
:create/email "tangj1122@gmail.com",
:create/time 1587922666864,
:block/uid "lTaxmWmlo",
:edit/time 1587922777482,
:edit/email "tangj1122@gmail.com"}
{:block/string
"These rules suggest that there's a distinct [[Realtalk]] idiom, which is very different from just writing Lua for projectors and cameras. **It's something like objects or actors (where the pages are objects), and reactive programming, and reusing functionality from the real world wherever possible.**",
:create/email "tangj1122@gmail.com",
:create/time 1587922666864,
:block/uid "82NAuJNLF",
:edit/time 1587922801897,
:edit/email "tangj1122@gmail.com"}
{:block/string
"In Dynamicland, software is supposed to be this simple or simpler. Software in [[Dynamicland]] is meant to be continually read and tweaked and discarded by users; that's why each page has its source code printed on it.",
:create/email "tangj1122@gmail.com",
:create/time 1587922666864,
:block/uid "Qh68OVcYz",
:edit/time 1587922812607,
:edit/email "tangj1122@gmail.com"}
{:block/string
"I think maps highlight the advantages of breaking out of the screen. We insult an entire tradition of large, information-rich maps when we cram them onto tiny phone screens, then crowd around them and make finger gestures to squeeze answers out bit by bit. #maps",
:create/email "tangj1122@gmail.com",
:create/time 1587922666864,
:block/uid "s62EsVu0v",
:edit/time 1587922881331,
:edit/email "tangj1122@gmail.com"}
{:block/string
"I figured that in Dynamicland, we could have maps that actually looked like maps. **We could have multiple people sitting around a map at a table, sharing a large view, but also applying computational filters and derivations to get at their individual interests**. You could explore many places and ideas at once, and keep track of them on the table in front of you, instead of constantly sacrificing context on a limited screen. #maps #[[data-driven programming]]",
:create/email "tangj1122@gmail.com",
:create/time 1587922666864,
:block/uid "_akrybTvZ",
:edit/time 1587922947222,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Dynamicland is great at [[spatial interfaces]], and maps are spatial. You get tools like dot tracking, page tracking, whiskers, and rotation, as well as whatever else you can tie in from the physical world.",
:create/email "tangj1122@gmail.com",
:create/time 1587922666864,
:block/uid "aHtFbSCk5",
:edit/time 1587922971761,
:edit/email "tangj1122@gmail.com"}
{:block/string
"There was a fear that people would fixate on details and copy them blindly while missing the values, as happened to the Xerox Alto GUI. #[[Xerox PARC]]",
:create/email "tangj1122@gmail.com",
:create/time 1587922666864,
:block/uid "xrTgub3dx",
:edit/time 1587922983403,
:edit/email "tangj1122@gmail.com"}],
:block/uid "RfxQ_hyW3",
:edit/time 1587922693724,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1587922727643,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587922716450,
:node/title "Realtalk",
:edit/time 1587922716451,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587922727649,
:node/title "Dynamicland",
:edit/time 1587922727653,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587922727649,
:node/title "Geokit",
:edit/time 1587922727653,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587922733083,
:node/title "Lua",
:edit/time 1587922733085,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587922832667,
:node/title "tool for thought",
:edit/time 1587922832668,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587922878309,
:node/title "maps",
:edit/time 1587922878310,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587922947223,
:node/title "data-driven programming",
:edit/time 1587922947224,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587922971764,
:node/title "spatial interfaces",
:edit/time 1587922971765,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587922983404,
:node/title "Xerox PARC",
:edit/time 1587922983405,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587923020732,
:node/title "documentation",
:block/children
[{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1588358875784,
:block/uid "8mazF7SMa",
:edit/time 1588358901480,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1587923020733,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587923314302,
:node/title "[[Distributed Systems]] and the End of the API",
:block/children
[{:block/string
"source:: https://writings.quilt.org/2014/05/12/distributed-systems-and-the-end-of-the-api",
:create/email "tangj1122@gmail.com",
:create/time 1587923319401,
:block/uid "cX7aPMWcW",
:edit/time 1587923334878,
:edit/email "tangj1122@gmail.com"}
{:block/string "type:: notes",
:create/email "tangj1122@gmail.com",
:create/time 1587923334873,
:block/uid "2ID4mBORd",
:edit/time 1588517536451,
:edit/email "tangj1122@gmail.com"}
{:block/string "Contents",
:create/email "tangj1122@gmail.com",
:create/time 1587923387370,
:block/children
[{:block/string
"Here is a rough, temporal progression of the major network API technologies that have seen wide use:",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/children
[{:block/string
"`RPC → #{DCOM, CORBA} → RMI → XML-RPC → SOAP → REST → #{‘REST’, Thrift}`",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/uid "SFFhMDak5",
:edit/time 1587923403038,
:edit/email "tangj1122@gmail.com"}],
:block/uid "hHdXO9HPQ",
:edit/time 1587923376511,
:edit/email "tangj1122@gmail.com"}
{:block/string
"As far as addressing the problems of distributed systems go, these are all fundamentally equivalent.",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/children
[{:block/string "a request/response lifecycle",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/uid "PnwLrDliX",
:edit/time 1587923376511,
:edit/email "tangj1122@gmail.com"}
{:block/string "always synchronous",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/uid "EP8fVg79_",
:edit/time 1587923376511,
:edit/email "tangj1122@gmail.com"}
{:block/string
"presume a point-to-point communication topology (i.e. two party, client/server communication)",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/uid "n9qBH7-zH",
:edit/time 1587923376511,
:edit/email "tangj1122@gmail.com"}
{:block/string
"operations provided by these mechanisms are nearly always imperative, implying mutable data models and side-effecting operations",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/uid "leon02Atw",
:edit/time 1587923376511,
:edit/email "tangj1122@gmail.com"}
{:block/string
"few constraints placed on acceptable data models or representations are imposed",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/uid "si9qw3BbU",
:edit/time 1587923376511,
:edit/email "tangj1122@gmail.com"}],
:block/uid "UiZ3jRP9l",
:edit/time 1587923376511,
:edit/email "tangj1122@gmail.com"}
{:block/string
"These characteristics are shared by the programming language heritage that originally defined the notion of “an API”: one caller invoking operations synchronously on one callee, providing a request (arguments) in exchange for a response (a return value, sometimes), where the data involved can effectively be anything — very often mutable structures that are modified in-place — all while causing some side effect. Unfortunately, these characteristics are a large part of why APIs are a fatally bad mismatch for **the job of supporting the communications between actors in a distributed system, which are frequently not best characterized as request/response, more commonly asynchronous than not, are often not ideally point-to-point, and which suffer as much or more from mutable data models and side-effecting operations as “regular”, single-process, non-networked programs**.",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/uid "oBExCUICm",
:edit/time 1587923474843,
:edit/email "tangj1122@gmail.com"}
{:block/string
"In each of these cases, nominal concerns are paramount, but network and other operational semantics, failure modes, notions of causality and consistency are entirely unaccounted-for by the different API mechanisms. These unstated costs are implicitly retained by the programmer that happily uses these mechanisms, and must be balanced by either manual accommodations, error handling, and deep considerations of application-specific causality and consistency invariants…or user-visible and business-tangible failures.",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/uid "ZsHOOOTfU",
:edit/time 1587923376511,
:edit/email "tangj1122@gmail.com"}
{:block/string
"“The API” as the fundamental point of integration between parts of a distributed system is an anachronism, a hold-over from other, simpler programming contexts that predate “distributed systems” as a discrete concept:",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/uid "ceEmz94em",
:edit/time 1587923376511,
:edit/email "tangj1122@gmail.com"}
{:block/string
"APIs necessitate an intense coupling between actors in many ways, principally:",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/children
[{:block/string
"By admitting only two-party client/server architectures, despite the actual myriad of application and network topologies that exist; anything else needs to be constructed out of this point-to-point primitive, or pushed into silos that do provide for more complex topologies (e.g. queues, system busses, etc).",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/uid "HOJ2sYMaA",
:edit/time 1587923376514,
:edit/email "tangj1122@gmail.com"}
{:block/string
"By allowing arbitrary data representations to be used: in order to talk to your API, I need to reconcile how my client represents data with what your server expects and produces. It is impossible to later talk to another equivalent API without repeating this process.",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/uid "kjgc16hPn",
:edit/time 1587923376514,
:edit/email "tangj1122@gmail.com"}],
:block/uid "PHZSFSa4k",
:edit/time 1587923376511,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Common computational tasks necessitate asynchrony. Though some patterns and common workarounds exist, APIs are fundamentally always synchronous.",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/uid "vN7C4Z90t",
:edit/time 1587923376514,
:edit/email "tangj1122@gmail.com"}
{:block/string
"APIs, as a class of technology, disavow the fundamental complexities of distributed systems:",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/uid "yL95w2f0L",
:edit/time 1587923376514,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Coping with network failure modes (latency, disconnection, offline contexts)",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/uid "0C4aPoxro",
:edit/time 1587923376514,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Making consistency choices relevant to our applications, and being aware of the choices being made for us by our underlying technology",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/uid "FPmDwXD2m",
:edit/time 1587923376514,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Being aware of the impact that our consistency choices have on availability",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/uid "3QbC8aoTI",
:edit/time 1587923376514,
:edit/email "tangj1122@gmail.com"}
{:block/string
"How our data models and data representations influence and sometimes determine what is and is not possible in terms of concurrent activity by different actors",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/children
[{:block/string
"![](https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2F6YIqxxDWSG?alt=media&token=cdd632be-3689-47ed-9a90-8a8640d24589)",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/uid "Ze1PXYlJl",
:edit/time 1587923552697,
:edit/email "tangj1122@gmail.com"}],
:block/uid "g8DxHckOR",
:edit/time 1587923376514,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Your network’s problems are your system’s problems. The corollary of this is: **My network’s problems are your system’s problems.**",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/uid "zLR0zjLV_",
:edit/time 1587923580207,
:edit/email "tangj1122@gmail.com"}
{:block/string
"That is, the networks used to reach the people and devices and vendors at the edges of your system are almost never owned and operated by you, yet your system is subject to their failures as well.",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/uid "3NlKIlK36",
:edit/time 1587923376514,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Different technologies and different data models will provide greater or lesser inherent protection from the capriciousness of networks. Of course, network API mechanisms provide exactly none, and the data representations that are commonly shipped over those mechanisms (e.g. JSON, XML, YAML, plain text, and so on) are equally of no help.",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/uid "QA4KjtLcB",
:edit/time 1587923376514,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Consistency decisions affect everything. the most common cases as far as I can tell include:",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/children
[{:block/string
"**Strict linearizability, where all actors in a system synchronously acknowledge each write to any shared data, yielding a global total order of all operations**. Systems with this characteristic act as if their entire state is held within a single atomic reference, as found in many programming languages with such a concurrency primitive. This is incredibly expensive in terms of computational and communication overhead, but perhaps corresponds most closely with our intuitions about what happens when, and where.",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/uid "s62GpxEDe",
:edit/time 1587923614562,
:edit/email "tangj1122@gmail.com"}
{:block/string
"**Causal consistency, where logically temporal relationships between dependent changes to shared data are tracked, yielding a partial order of all operations**. Causal consistency requires much less consensus overhead for any given request to proceed (compared to strict linearizability), but ensures many desirable properties within a system with such a guarantee. One of these is the ability to read your own writes; without some mechanism to enforce causal consistency, it is possible for e.g. a web client to write a value through an HTTP API, and then see the previous value when it performs a read or query some time afterwards.",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/uid "a2AoKDIYF",
:edit/time 1587923637182,
:edit/email "tangj1122@gmail.com"}
{:block/string
"**Eventual consistency, where concurrent writes converge (perhaps with conflicts) such that different readers will all eventually see the same result** at some point in the future when all prior writes have been applied. This implies no order at all to operations within a system; in effect, the only guarantee of eventual consistency is that of liveness, a term used in distributed systems literature to imply that all actors within a system will continue to propagate writes until all actors have seen every write.",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/uid "SbRZQXoCl",
:edit/time 1587923674430,
:edit/email "tangj1122@gmail.com"}],
:block/uid "KqOPFDIAt",
:edit/time 1587923628933,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Likewise, while plain text does offer some meagre ways to address concurrent inconsistent changes (e.g. two actors modifying the same text document concurrently can often be resolved sanely via a diff mechanism), **the “richer” data representations that are favoured by most API services and clients (again, JSON, XML, etc) are fundamentally opaque and in general make reconciling independent changes impossible in a consistent way without special, often domain-specific intervention**. Further, typical implementations of data structures in our programming languages provide no ways to represent or reconcile concurrent changes at all. Together, this means that concurrent actors moving state around or representing operations using these data structures and representations have no generally applicable way of resolving conflicting concurrent changes. This forces programmers to regularly re-implement such resolution mechanisms; or, more commonly, rely completely upon centralized backend databases to allow concurrency and enforce consistency, semantics that become less reliable further away from those centralized authorities.",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/uid "00_bVQInv",
:edit/time 1587923695045,
:edit/email "tangj1122@gmail.com"}
{:block/string
"I’m at peace with that, but I defy anyone to claim that programming networked services and applications is easy. **Or that the interactions between e.g. disparate databases, application servers, caching services, load balancers, client browsers, a couple of message queues, four vendor services APIs, and that nutty Hadoop job are understandable**. Or that errors stemming from the incidental complexity of the technologies involved in building such a system are rare. Or that when something does go wrong in that easy-to-build, understandable, rarely-failing distributed system, it’s easy to diagnose the problem.",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/uid "y4TItJKR-",
:edit/time 1587923720112,
:edit/email "tangj1122@gmail.com"}
{:block/string
"None of these things are true. Of course, I’m not saying that building distributed systems will ever be as easy or as simple as other types of programming and engineering. Further, I’m not even saying that APIs are themselves the root of all of this difficulty and complexity (though they play their part); APIs just happen to be a convenient, familiar, and obvious pain point that exemplifies the primitive nature of the raw materials we’ve imported from other programming contexts to build distributed systems.",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/uid "8OAQ94A54",
:edit/time 1587923376514,
:edit/email "tangj1122@gmail.com"}
{:block/string
"In any distributed system we build, we want two things:",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/children
[{:block/string
"**Communication** — the ability to **share data** among the various actors participating in our system",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/uid "2KqFCc_t2",
:edit/time 1587923798293,
:edit/email "tangj1122@gmail.com"}
{:block/string
"**Computation** — the ability to **consume and transform that data**, producing new data as a result that is perhaps itself communicated",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/uid "dsK2dE2k6",
:edit/time 1587923796442,
:edit/email "tangj1122@gmail.com"}],
:block/uid "FLdD1YSzl",
:edit/time 1587923376514,
:edit/email "tangj1122@gmail.com"}
{:block/string
"**Everything else about building distributed systems is incidental.**",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/uid "_B0KzDVWB",
:edit/time 1587923780614,
:edit/email "tangj1122@gmail.com"}
{:block/string
"The history of programming languages has seen many analogous transitions.",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/uid "p-vMdPtPl",
:edit/time 1587923771621,
:edit/email "tangj1122@gmail.com"}
{:block/string
"```assembly/C : Java/Python/Clojure :: APIs : ???```",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/uid "7jKTdEyAt",
:edit/time 1587923765492,
:edit/email "tangj1122@gmail.com"}
{:block/string
"In both contexts, what we find to be confusing and error prone — e.g. **userland goto, manual memory allocation, and in-place mutation of objects** in the case of programming languages, and things like accommodating **network failure modes and implementing appropriate consensus mechanisms and consistency levels** in distributed systems — are exactly the things that we need to abstract away from in day-to-day concerns in order to make progress.",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/uid "6j9SrAUFn",
:edit/time 1587923833523,
:edit/email "tangj1122@gmail.com"}
{:block/string
"In many ways, [[Leslie Lamport]]’s 1978 paper Time, Clocks, and the Ordering of Events in a Distributed System was the starting shot for serious, principled research into the challenges of distributed systems. (And the beginning of a body of work which contributed significantly to Mr. Lamport’s receipt of the Turing Award earlier this year.) What I appreciate most about this paper is that he talks about the difficulties of communication among concurrent, distributed actors as a physics problem. Contemplating the challenges of a distributed system reveals this as more than a convenient analogy, and closer to actual fact: the essential qualities of the distance between separate actors and the progression of time that paces their communications define what is and is not possible",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/uid "-AgkvosFG",
:edit/time 1587923846808,
:edit/email "tangj1122@gmail.com"}
{:block/string
"**Most people view concurrency as a programming problem or a language problem. I regard it as a physics problem.** #[[Leslie Lamport]] #concurrency #physics",
:create/email "tangj1122@gmail.com",
:create/time 1587923899806,
:block/uid "iiCUBQaTx",
:edit/time 1587923917636,
:edit/email "tangj1122@gmail.com"}
{:block/string
"there is some comfort to be had that a thoughtful approach to distributed systems problems should flow from **a more reliable basis than even the most well-designed library, framework, or language**. The emphasis being on provable formalisms over clever engineering and implementation details gives me hope that solutions to these problems, once found, may be as reliable as the mathematics and understanding of physics upon which they are built.",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/uid "j9e3vTSF1",
:edit/time 1587923933716,
:edit/email "tangj1122@gmail.com"}
{:block/string
"As I foreshadowed earlier, what’s essential about both of these approaches is not novel engineering, but the provable formalisms upon which they are premised: [[CALM]] has its roots in temporal logic, while [[CRDTs]] depend upon the algebra of semilattices. You should understand these formalisms, at least in passing, if you are to leverage their concrete implementations with confidence and to good effect.",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/uid "hTaKs-qUH",
:edit/time 1587923942859,
:edit/email "tangj1122@gmail.com"}
{:block/string
"A set semilattice with a join relation of union will never lose information: the value of each member will always increase in size as joins are performed over time, across participants sharing the semilattice. Said another way, this is critical within the context of distributed systems because it means that you can have concurrent modifications being made to a structure like this that is logically shared by many different actors, and those modifications will always yield the same value when joined. #accretion",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/uid "sXzFB-YYH",
:edit/time 1587923376515,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Algebraically, join and meet operations for any semilattice must satisfy three axiomatic properties",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/children
[{:block/string
"associativity: `f(f(a, b), c) == f(a, f(b, c))`",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/uid "AJh_E4uaN",
:edit/time 1587923969933,
:edit/email "tangj1122@gmail.com"}
{:block/string "commutativity: `f(a, b) == f(b, a)`",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/uid "VSrKSI3-7",
:edit/time 1587923967078,
:edit/email "tangj1122@gmail.com"}
{:block/string "idempotence: `f(f(a)) == f(a)`",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/uid "bhKZOW1hX",
:edit/time 1587923963838,
:edit/email "tangj1122@gmail.com"}],
:block/uid "CLvz1RD3T",
:edit/time 1587923376515,
:edit/email "tangj1122@gmail.com"}
{:block/string
"The astute observer might point out that not all useful operations are associative, commutative, and idempotent; removing items from a set is one easy example, but anything that might be characterized as causing a loss of information over time (removals, deletions, subtractions, etc) would qualify. The key here is that **only the primitive operations over semilattices and CRDTs must satisfy those axioms**; other operations can be implemented in terms of those primitives, thus yielding the key characteristics we seek",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/uid "2NcQ_1meB",
:edit/time 1587923979579,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Despite the algebraic invariants that semilattices dictate, CRDTs can and have been built representing a wide array of data types, including:",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/children
[{:block/string "counters",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/uid "H-aV1tyow",
:edit/time 1587923376515,
:edit/email "tangj1122@gmail.com"}
{:block/string "registers",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/uid "EVFWIoxyx",
:edit/time 1587923376515,
:edit/email "tangj1122@gmail.com"}
{:block/string "sets",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/uid "GGLhY-mN8",
:edit/time 1587923376515,
:edit/email "tangj1122@gmail.com"}
{:block/string "(multi)maps",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/uid "lVKKrioH9",
:edit/time 1587923376515,
:edit/email "tangj1122@gmail.com"}
{:block/string "dense and sparse lists/vectors",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/uid "3R7Fy3KWD",
:edit/time 1587923376515,
:edit/email "tangj1122@gmail.com"}
{:block/string "partially-ordered sequences",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/uid "OQBegy151",
:edit/time 1587923376515,
:edit/email "tangj1122@gmail.com"}
{:block/string "trees",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/uid "s9FjexGDi",
:edit/time 1587923376515,
:edit/email "tangj1122@gmail.com"}
{:block/string "graphs",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/uid "Hy_qspkR8",
:edit/time 1587923376515,
:edit/email "tangj1122@gmail.com"}],
:block/uid "9UvKXAX4T",
:edit/time 1587923376515,
:edit/email "tangj1122@gmail.com"}
{:block/string
"This means that, when using CRDTs to tie your system together, you don’t need to resort to using impoverished representations that simply never come anywhere near the representational power of the data structures you use in your programs at runtime. Instead of working out a way to distill your model data into JSON or XML so it can be shared with other actors in your system, you simply add the data in question to a CRDT, and let its replication implementation carry it abroad, with exactly zero loss of representational fidelity.",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/uid "fxtUciKQu",
:edit/time 1587923376515,
:edit/email "tangj1122@gmail.com"}
{:block/string
"A further bit of good news for those of us that appreciate functional programming is that semilattices naturally encourage [[immutability]]. Insofar as each element within the set that forms a semilattice always “grows” relative to its predecessors and inputs, the most naive approach to implementing CRDTs (and a reasonable mental model regardless of actual implementations) is to maintain an immutable log of operations being applied or state being added. This means things like histories, rollbacks, and consistent snapshot — features and operations that are typically considered “advanced” today because of the incidental complexity of implementing them using the data and communication substrates that are generally in use — all come effectively for free.",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/uid "_RY9RvKEp",
:edit/time 1587924000111,
:edit/email "tangj1122@gmail.com"}
{:block/string
"The transformation is a simple one: change imperative, side-effecting calls like this one:",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/children
[{:block/string "`api.setName(personId, \"Chas\");`",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/uid "h4rcHI82k",
:edit/time 1587924029030,
:edit/email "tangj1122@gmail.com"}],
:block/uid "ny-VX1Jfn",
:edit/time 1587923376516,
:edit/email "tangj1122@gmail.com"}
{:block/string
"into reified data that you add to a CRDT, which is thus replicated from a “client” to other actors (perhaps a single “server”, if you so choose): #[[Reified Transactions]]",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/children
[{:block/string "`{:person-id person-id :name \"Chas\"}`",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/uid "n47OcSe8w",
:edit/time 1587924033632,
:edit/email "tangj1122@gmail.com"}],
:block/uid "X6EdXoZPt",
:edit/time 1587924818243,
:edit/email "tangj1122@gmail.com"}
{:block/string
"The change is subtle, but has a tectonic effects. “Operations”, when cast as data, become computable: you can copy them, route them, reorder them freely, manipulate them and apply programs to them, at any level of your system. People familiar with message queues will think this is very natural: after all, producers don’t invoke operations on or connect directly to the consumers of a queue. Rather, the whole point of a queue is to decouple producer and consumer, so “operations” are characterized as messages, and thus become as pliable as any other data. All of the same leverage applies when you replace APIs with CRDTs.",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/uid "LUffTaAAM",
:edit/time 1587923376516,
:edit/email "tangj1122@gmail.com"}
{:block/string
"CRDT implementations have generally materialized as libraries, not specialized runtimes or languages, so you can readily use whatever programming language you like with a CRDT",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/uid "k3wDEkSi3",
:edit/time 1587923376516,
:edit/email "tangj1122@gmail.com"}
{:block/string
"On the other hand, there are certain approaches to distributed systems that, in attempting to address their unique challenges, propose a total and holistic shift in programming practice. Bloom — the programming language that has been used to research and prototype the CALM theorem — is an effort in this direction. The vast majority of data structures that you manipulate as a matter of course in Bloom are lattices or other monotonic constructs. The tradeoff here is that while Bloom can statically identify which parts of your program are non-monotonic — in join semilattice terms, where your program state descends in the partial order, and thus is exposed to e.g. common network failure modes — Bloom is the only place where you can reap the benefits of that analysis.",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/uid "LwB1iDDJb",
:edit/time 1587923376516,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Languages aside, I think there are a number of programming models that are particularly well-suited to the sorts of computation and domains to which the largest distributed systems are often applied:",
:create/email "tangj1122@gmail.com",
:create/time 1587923376442,
:block/children
[{:block/string "[[Event sourcing]]",
:create/email "tangj1122@gmail.com",
:create/time 1587924383310,
:block/uid "zY-yJN3cG",
:edit/time 1587924391961,
:edit/email "tangj1122@gmail.com"}
{:block/string
"[[[[Datomic]]: [[Event Sourcing]] without the hassle]]",
:create/email "tangj1122@gmail.com",
:create/time 1587924394698,
:block/uid "-ejAtqgis",
:edit/time 1587924500188,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Stream-based computation (e.g. [[Apache Storm]])",
:create/email "tangj1122@gmail.com",
:create/time 1587924383310,
:block/uid "Fi2bdE7FJ",
:edit/time 1587924420860,
:edit/email "tangj1122@gmail.com"}
{:block/string
"I’m particularly interested in tuple spaces (typified by [[Linda]], of which many implementations exist for modern programming languages) and other sorts of blackboard systems, which I think provide a very useful metaphor for characterizing scale-invariant concurrent distributed computation.",
:create/email "tangj1122@gmail.com",
:create/time 1587924383310,
:block/uid "-IrYH-YMG",
:edit/time 1587924424392,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Reactive patterns of all sorts have grown in popularity and caché of late, such as [[FRP]]. Many of these reactive approaches are quite at home in a distributed context, where you might characterize computational services in general as operations that are triggered in response to data arriving in a local CRDT that matches a pattern or satisfies a query over the data being replicated in from other actors, similar to how triggers in relational databases are fired when a new result is found for a SQL query.",
:create/email "tangj1122@gmail.com",
:create/time 1587924383310,
:block/uid "DoXwgrzN0",
:edit/time 1587924432080,
:edit/email "tangj1122@gmail.com"}],
:block/uid "0FGLx-24G",
:edit/time 1587923376516,
:edit/email "tangj1122@gmail.com"}
{:block/string
"It is imperative that CRDT implementations ensure that their operations adhere to the algebraic axioms of semilattices. (I think it is no accident that many CRDT implementors also happen to be very interested in things like property-based testing [e.g. QuickCheck, QuickCheck, test.check, double-check, and so on] and theorem provers like Coq, both of which are good tools for defining and verifying strict invariants like these.",
:create/email "tangj1122@gmail.com",
:create/time 1587924383310,
:block/uid "mpZOv4vr1",
:edit/time 1587924383317,
:edit/email "tangj1122@gmail.com"}
{:block/string
"both the CALM theorem and CRDTs have only existed as discrete named concepts for the last few years. The first practical implementations of them are even newer than that. Significant bits of theory and implementation details are still up for grabs (e.g. CRDT “garbage collection” is a bit of a hot topic right now as these things go), so act accordingly. This is powerful stuff, and its potential is immense, but **there will be rough waters between now and when CALM implementations and CRDTs are thought of as indispensable and obvious choices**",
:create/email "tangj1122@gmail.com",
:create/time 1587924383310,
:block/uid "uCDOj6dR9",
:edit/time 1587924448835,
:edit/email "tangj1122@gmail.com"}],
:block/uid "tp_P101xd",
:edit/time 1587923389384,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1587923319404,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587923319406,
:node/title "Distributed Systems",
:edit/time 1587923319407,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587923846810,
:node/title "Leslie Lamport",
:edit/time 1587923846811,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587923899809,
:node/title "physics",
:edit/time 1587923899810,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587923939255,
:node/title "CALM",
:edit/time 1587923939256,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587923942861,
:node/title "CRDTs",
:edit/time 1587923942862,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587924391963,
:node/title "Event sourcing",
:edit/time 1587924391963,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587924420863,
:node/title "Apache Storm",
:edit/time 1587924420864,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587924424394,
:node/title "Linda",
:edit/time 1587924424395,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587924432082,
:node/title "FRP",
:edit/time 1587924432084,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587924500189,
:node/title "Datomic",
:edit/time 1587924500192,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587924500189,
:node/title "Event Sourcing",
:edit/time 1587924500192,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587924700410,
:node/title "Eventual Consistency",
:edit/time 1587924700441,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587924774745,
:node/title "Reified Transactions",
:edit/time 1587924774746,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587947812359,
:node/title
"[[Future of Coding]] Podcast #46 - 2020 Community Survey",
:block/children
[{:block/string "type:: podcast",
:create/email "tangj1122@gmail.com",
:create/time 1587947822344,
:block/uid "E558cyzfC",
:edit/time 1587947827046,
:edit/email "tangj1122@gmail.com"}
{:block/string "Contents",
:create/email "tangj1122@gmail.com",
:create/time 1587947827041,
:block/children
[{:block/string
"There were 134 responses to the survey, which is pretty good. According to Slack’s analytics, there are roughly 230 people who check the Slack in any given week, and about 70 people who post.",
:create/email "tangj1122@gmail.com",
:create/time 1587947863296,
:block/uid "Np_ZPB7Rm",
:edit/time 1587947890473,
:edit/email "tangj1122@gmail.com"}
{:block/string "Mixed thoughts on [[Bret Victor]]",
:create/email "tangj1122@gmail.com",
:create/time 1587948499578,
:block/children
[{:block/string
"![](https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2FIg6V8MXDxl?alt=media&token=cc0f5a7c-e80b-413e-9caa-918e44ee15c0)",
:create/email "tangj1122@gmail.com",
:create/time 1587947888818,
:block/uid "z77sJN3IO",
:edit/time 1587948492176,
:edit/email "tangj1122@gmail.com"}],
:block/uid "p-rLxV44j",
:edit/time 1587948506427,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Question Thirteen: What FoC topics interest you most?\n #[[Tools for Thought]]",
:create/email "tangj1122@gmail.com",
:create/time 1587948557634,
:block/children
[{:block/string
"![](https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2FXYAak0ybZ2?alt=media&token=0344971c-d2ba-4a88-a6dd-841176a1d8e9)",
:create/email "tangj1122@gmail.com",
:create/time 1587948493158,
:block/uid "i1a5ZF1Zx",
:edit/time 1587948557642,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Not on the list: Descent computing (using computer throughout societal collapse), personal information management /w knowledge graphs, Linked Open Data, Design Intent Ontology",
:create/email "tangj1122@gmail.com",
:create/time 1587947834219,
:block/uid "YN-KCRPxB",
:edit/time 1587948658070,
:edit/email "tangj1122@gmail.com"}],
:block/uid "6KwVzEydi",
:edit/time 1587949539532,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Question Fourteen: Thoughts on Slack? #[[Slack]] #Discourse #Zulip ",
:create/email "tangj1122@gmail.com",
:create/time 1587948730762,
:block/children
[{:block/string
"![](https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2FhLbNAP83-Q?alt=media&token=4db7f931-bb15-4c3d-8e0e-be0118bb11e0)",
:create/email "tangj1122@gmail.com",
:create/time 1587948734213,
:block/uid "DQNeWXLm0",
:edit/time 1587949579728,
:edit/email "tangj1122@gmail.com"}
{:block/string
"So I think we need to address the shortcomings of Slack in a different way. We have our list of complaints: the loss of history, the poor search, the fact that Slack threads aren’t good facilitators of deep discussion, etcetera. A few of us have made various attempts to address these issues in the past. Steve Krouse made [a history search](https://observablehq.com/@stevekrouse/future-of-coding-slack-search) using the Slack API, which works in a pinch but could definitely use refinement. (Though it’s not working for me as I type this, and others have reported similar issues in the past, so YMMV.) A few people have tried to set up wikis, so that we can capture the references and concepts and projects that come up in our discussions. There’s Mariano’s newsletter, which sort of doubles as a folk history of our community.",
:block/uid "WGj6TlNFn",
:edit/time 1587948855177,
:edit/email "tangj1122@gmail.com"}
{:block/string
"So I think we need to address the shortcomings of Slack in a different way. We have our list of complaints:",
:create/email "tangj1122@gmail.com",
:create/time 1587948870881,
:block/children
[{:block/string "the loss of history",
:create/email "tangj1122@gmail.com",
:create/time 1587948874196,
:block/uid "dW_k0dsL_",
:edit/time 1587948874196,
:edit/email "tangj1122@gmail.com"}
{:block/string "the poor search,",
:create/email "tangj1122@gmail.com",
:create/time 1587949613132,
:block/uid "E_X4pJdsw",
:edit/time 1587949613132,
:edit/email "tangj1122@gmail.com"}
{:block/string
"the fact that Slack threads aren’t good facilitators of deep discussion,",
:create/email "tangj1122@gmail.com",
:create/time 1587948881485,
:block/uid "xMsZ0ns_k",
:edit/time 1587949615168,
:edit/email "tangj1122@gmail.com"}],
:block/uid "dqBh8tk9k",
:edit/time 1587948870881,
:edit/email "tangj1122@gmail.com"}
{:block/string
"If we’re going to stick with Slack, I think we should take whatever effort we’d otherwise need to invest in moving to a new platform, and instead invest it in tools that will help our community thrive despite the shortcomings of Slack. There’s a [community Github organization](http://github.com/futureofcoding) that you are welcome to join and publish your projects through. We have a handful of experimental programming tools that could surely be put to good use in building some tools for our community. So I think that’s the direction we should go.",
:block/uid "TUEBlabVs",
:edit/time 1587948855177,
:edit/email "tangj1122@gmail.com"}
{:block/string
"A few of us have made various attempts to address these issues in the past. Steve Krouse made a **history search using the Slack API**, which works in a pinch but could definitely use refinement. (Though it’s not working for me as I type this, and others have reported similar issues in the past, so YMMV.) **A few people have tried to set up wikis, so that we can capture the references and concepts and projects that come up in our discussions**. There’s Mariano’s **newsletter**, which sort of doubles as a folk history of our community.",
:create/email "tangj1122@gmail.com",
:create/time 1587948860347,
:block/uid "lODqqUxUk",
:edit/time 1587948907426,
:edit/email "tangj1122@gmail.com"}],
:block/uid "uvdVtJO0G",
:edit/time 1587949595178,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Question Nineteen: What would you like to see the community do more of?",
:create/email "tangj1122@gmail.com",
:create/time 1587948975608,
:block/children
[{:block/string
"Dream bigger. **There are few moonshots in here**. Less bias, in someways it feels like products before being even presented to the industry are chosen already while still being in beta.",
:create/email "tangj1122@gmail.com",
:create/time 1587948983540,
:block/uid "AdFMwpiOj",
:edit/time 1587949669472,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Topic discussion / article. Longer form. emails. We **can’t think in slack/Twitter.**",
:create/email "tangj1122@gmail.com",
:create/time 1587949045264,
:block/uid "KBjmTTMxN",
:edit/time 1587949656345,
:edit/email "tangj1122@gmail.com"}
{:block/string
"a **wiki** would be handy. some way to **document the body of knowledge**. so slack is **good for announcements and discussion, but is not so good at giving an overview or drill down into a topic.**",
:create/email "tangj1122@gmail.com",
:create/time 1587949084577,
:block/uid "hHA5xLyXb",
:edit/time 1587949701672,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Archive of all communications between members that it easy to search and refer to. Thoughts on different topics are the most valuable that I can get from this community – not easy to search now. I love to have a **space, where I could pinpoint different comments. Refer back to them**.",
:create/email "tangj1122@gmail.com",
:create/time 1587949129108,
:block/uid "D7zv9fLIY",
:edit/time 1587949729133,
:edit/email "tangj1122@gmail.com"}
{:block/string
"I don’t have time to read through the Slack channels so something more like a **message board with weekly digests would be ideal**. A sub-Reddit or Hacker News style app would also be useful for **filtering good stuff from the community.**",
:create/email "tangj1122@gmail.com",
:create/time 1587949142817,
:block/uid "Nw1l-vWLd",
:edit/time 1587949741577,
:edit/email "tangj1122@gmail.com"}
{:block/string
"The signal to noise of Slack is low. **I don’t see how another medium would make that better.**",
:create/email "tangj1122@gmail.com",
:create/time 1587949149471,
:block/uid "JSxZNbwfx",
:edit/time 1587949748942,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Not easy, but I’d love if we could get better at **documenting our collective knowledge**. I __really__ liked The Whole Code Catalog.",
:create/email "tangj1122@gmail.com",
:create/time 1587949160105,
:block/uid "ElwJPKPg2",
:edit/time 1587949756050,
:edit/email "tangj1122@gmail.com"}
{:block/string
"build a **base of knowledge which can be referred to**, rather than just say the same things back and forth in chats forever. (also: set clearer expectations on appropriate conversation, so blow-hards don’t blow quite as hard.)",
:create/email "tangj1122@gmail.com",
:create/time 1587949165840,
:block/uid "ykI1plpub",
:edit/time 1587949762812,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Some kind of integration or **directed feedback with communities** like gitcoin - and many others. **A map of people / institutes or efforts in the space.**",
:create/email "tangj1122@gmail.com",
:create/time 1587949176591,
:block/uid "KzYZJNwXE",
:edit/time 1587949810635,
:edit/email "tangj1122@gmail.com"}
{:block/string
"**concrete, permanent artifacts** produced from our efforts (especially lists and directories of projects)",
:create/email "tangj1122@gmail.com",
:create/time 1587949190638,
:block/uid "woEXxGYye",
:edit/time 1587949822388,
:edit/email "tangj1122@gmail.com"}
{:block/string "Not use slack",
:create/email "tangj1122@gmail.com",
:create/time 1587949199505,
:block/uid "rc8YzyDxa",
:edit/time 1587949199714,
:edit/email "tangj1122@gmail.com"}],
:block/uid "fHUHZIjKO",
:edit/time 1587948983543,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Question Twenty-One: What does “[[Future of Coding]]” mean to you? In other words, what are sorts of things are on-topic (or off-topic) for our community?",
:create/email "tangj1122@gmail.com",
:create/time 1587949252594,
:block/children
[{:block/string
"It means thinking about going beyond what we currently have so we someday solve **currently intractable problems**",
:create/email "tangj1122@gmail.com",
:create/time 1587949255324,
:block/uid "3qXW1RusG",
:edit/time 1587949831064,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Anything **visionary that changes the politics or paradigms** involved in building or adapting software",
:create/email "tangj1122@gmail.com",
:create/time 1587949317553,
:block/uid "VV82fJbKS",
:edit/time 1587949836726,
:edit/email "tangj1122@gmail.com"}
{:block/string
"I feel like type systems and some of the similar low level discussions are not about the future. The future means things **exponentially better** than now. It means **big vision.**",
:create/email "tangj1122@gmail.com",
:create/time 1587949323330,
:block/uid "qLN4nk6Up",
:edit/time 1587949844955,
:edit/email "tangj1122@gmail.com"}
{:block/string
"For me at this point it’s pretty much anything considered as **“wild”, “unpractical” or “too academical**” from the point of view of conventional / mainstream programmers. What I especially appreciate about this community is its focus on the history and evolution of programming and intent to learn from that history. It’s especially refreshing compared to the general overhype in the industry where superficial changes are branded as “revolutionary” every 6 months or so. All without any interest to more substantially change the status quo.",
:create/email "tangj1122@gmail.com",
:create/time 1587949351290,
:block/uid "_JxnpxG9f",
:edit/time 1587949873439,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Honestly, it’s not encouraging. It feels like a place **corrupted by mediocracy. Moonshot ideas are far and few,** while incremental ideas are promoted often. I would bet that **a product that splashes hard in the industry won’t be part of this community.**",
:create/email "tangj1122@gmail.com",
:create/time 1587949371301,
:block/uid "EvGzY43ok",
:edit/time 1587949894819,
:edit/email "tangj1122@gmail.com"}
{:block/string
"**A 10X (or more) simplification of programming**. Dramatic improvement in fewer increments vs status quo (“Present of programming”) where progress is debatable or happens in very small increments over longer periods of time.",
:create/email "tangj1122@gmail.com",
:create/time 1587949402468,
:block/uid "tN8htYcsp",
:edit/time 1587949907908,
:edit/email "tangj1122@gmail.com"}
{:block/string
"“Future of Coding” is a vast and fluid notion to me. The most condensed distillation I can come up with is: computing allowed and could further enable crucial social benefits, but this incarnation cannot continue for long. Its baroque complexity makes it way too fragile, and it is operating in an environment of mounting instability which threatens catastrophic knowledge loss. I count as members of the wider Future of Coding community those who recognize the implications of the storm brewing and are working to retool for resilience, under banners such as small is beautiful.",
:create/email "tangj1122@gmail.com",
:create/time 1587949430016,
:block/uid "0sboZVHpT",
:edit/time 1587949493830,
:edit/email "tangj1122@gmail.com"}
{:block/string
"This community is about figuring out how we (as in us, as creators) can design better ways of enabling people to produce computational artifacts (i.e. with some degree of interactivity or responsiveness). I think our visions need to **start from fundamentals, rather than incremental improvements (e.g. IDEs).** I think our community follows this spirit.",
:create/email "tangj1122@gmail.com",
:create/time 1587949494642,
:block/uid "jNqIsG6WZ",
:edit/time 1587949958229,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1587949960360,
:block/uid "9VcfXUTi9",
:edit/time 1587949960360,
:edit/email "tangj1122@gmail.com"}],
:block/uid "oMicxDnKe",
:edit/time 1587949273932,
:edit/email "tangj1122@gmail.com"}],
:block/uid "WoL2L0s38",
:edit/time 1587947863302,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1587947854362,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587947834224,
:node/title "Future of Coding",
:edit/time 1587947834225,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587948506429,
:node/title "Bret Victor",
:edit/time 1587948506432,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587948580644,
:node/title "Tools for Thought",
:edit/time 1587948580645,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587948734133,
:node/title "Slack",
:edit/time 1587948734135,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587948752853,
:node/title "Discourse",
:edit/time 1587948752856,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1587948752853,
:node/title "Zulip",
:edit/time 1587948752856,
:edit/email "tangj1122@gmail.com"}
{:node/title "April 27th, 2020",
:block/children
[{:block/string "[[Athens Change Log]]",
:create/email "tangj1122@gmail.com",
:create/time 1588013792838,
:block/children
[{:block/string "begin documenting [[Github Workflow]]",
:create/email "tangj1122@gmail.com",
:create/time 1587999250167,
:block/uid "V8ZjUYc-k",
:edit/time 1588028747535,
:edit/email "tangj1122@gmail.com"}
{:block/string
"document Datascript attributes in [[[[Datascript]] FAQ]] and [Notion](https://www.notion.so/tangjeff0/de6dff06d1804129bdc846352a85355c?v=18f602aa3ffb4758a21309cadab26b0a)",
:create/email "tangj1122@gmail.com",
:create/time 1588013790949,
:block/uid "xLsD9m2cN",
:edit/time 1588075824508,
:edit/email "tangj1122@gmail.com"}
{:block/string
"create first legit [issues](https://github.com/athensresearch/athens/issues) for myself and contributors",
:create/email "tangj1122@gmail.com",
:create/time 1588013820351,
:block/uid "M-RFCMxlt",
:edit/time 1588028751319,
:edit/email "tangj1122@gmail.com"}
{:block/string
"begin using https://www.loom.com/ for video recordings",
:create/email "tangj1122@gmail.com",
:create/time 1588015063387,
:block/children
[{:block/string
"[convert mp4 to gifs](https://superuser.com/a/1256459)",
:create/email "tangj1122@gmail.com",
:create/time 1588015101332,
:block/children
[{:block/string
"`ffmpeg -i input.mp4 -filter_complex 'fps=10,scale=480:-1:flags=lanczos,split [o1] [o2];[o1] palettegen [p]; [o2] fifo [o3];[o3] [p] paletteuse' out.gif`",
:create/email "tangj1122@gmail.com",
:create/time 1588704255900,
:block/uid "zzC_nzq0x",
:edit/time 1588704268410,
:edit/email "tangj1122@gmail.com"}
{:block/string "``````",
:create/email "tangj1122@gmail.com",
:create/time 1588704257755,
:block/uid "zHarMcp_u",
:edit/time 1588704260232,
:edit/email "tangj1122@gmail.com"}],
:block/uid "uSphQI2jJ",
:edit/time 1588015118823,
:edit/email "tangj1122@gmail.com"}],
:block/uid "qQeoc5OVj",
:edit/time 1588028758330,
:edit/email "tangj1122@gmail.com"}],
:block/uid "aTRce_q5P",
:edit/time 1588013795274,
:edit/email "tangj1122@gmail.com"}
{:block/string "try out [[Babashka]]",
:create/email "tangj1122@gmail.com",
:create/time 1588015216292,
:block/uid "qXM7MYp1P",
:edit/time 1588028768335,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1587939902388,
:edit/email "eloi.poch@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588012152256,
:node/title "Github Workflow",
:block/children
[{:block/string "type:: [[documentation]]",
:create/email "tangj1122@gmail.com",
:create/time 1588012614048,
:block/uid "ZwpFwXxdj",
:edit/time 1588012619705,
:edit/email "tangj1122@gmail.com"}
{:block/string "labels",
:create/email "tangj1122@gmail.com",
:create/time 1588012751314,
:block/children
[{:block/string
"[good first issue](https://github.com/athensresearch/athens/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22): particularly for someone new to Clojure, would probably be creating a `re-frame` component. Successfully developing a component ideally demonstrates understanding of:",
:create/email "tangj1122@gmail.com",
:create/time 1588012165390,
:block/children
[{:block/string
"How to setup a frontend dev environment, i.e. a browser-connected REPL with hot module replacement.",
:create/email "tangj1122@gmail.com",
:create/time 1588001130809,
:block/children
[{:block/string "`lein`",
:create/email "tangj1122@gmail.com",
:create/time 1588001154353,
:block/uid "w0q3SCICr",
:edit/time 1588012159066,
:edit/email "tangj1122@gmail.com"}
{:block/string "`shadow-cljs`",
:create/email "tangj1122@gmail.com",
:create/time 1588000965925,
:block/uid "PTi5fyBDY",
:edit/time 1588012159066,
:edit/email "tangj1122@gmail.com"}
{:block/string "`nREPL`",
:create/email "tangj1122@gmail.com",
:create/time 1588001155329,
:block/uid "IcuOeqVCV",
:edit/time 1588012159066,
:edit/email "tangj1122@gmail.com"}
{:block/string "https://github.com/binaryage/cljs-devtools",
:create/email "tangj1122@gmail.com",
:create/time 1588107595867,
:block/uid "JFmNjRQvT",
:edit/time 1588107604169,
:edit/email "tangj1122@gmail.com"}],
:block/uid "FankXq1fR",
:edit/time 1588012787242,
:edit/email "tangj1122@gmail.com"}
{:block/string "How to use Chrome DevTools for CLJS",
:create/email "tangj1122@gmail.com",
:create/time 1588011788407,
:block/children
[{:block/string
"knowing how to print and read CLJS data structures and functions in the Console tab",
:create/email "tangj1122@gmail.com",
:create/time 1588003172143,
:block/uid "FpC5Mj-OB",
:edit/time 1588012866812,
:edit/email "tangj1122@gmail.com"}
{:block/string "how to set breakpoints in the Sources tab",
:create/email "tangj1122@gmail.com",
:create/time 1588003211678,
:block/uid "hkBcWQuNu",
:edit/time 1588012864539,
:edit/email "tangj1122@gmail.com"}],
:block/uid "fX5uq-C-m",
:edit/time 1588012814746,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Application state management with [re-frame](https://purelyfunctional.tv/guide/re-frame-building-blocks/)",
:create/email "tangj1122@gmail.com",
:create/time 1588001002758,
:block/children
[{:block/string
"State: creating an event, subscription, and a [form-2 component](https://github.com/reagent-project/reagent/blob/master/doc/CreatingReagentComponents.md)",
:create/email "tangj1122@gmail.com",
:create/time 1588001265523,
:block/uid "9Su_k5Zp7",
:edit/time 1588012319340,
:edit/email "tangj1122@gmail.com"}
{:block/string
"UI: [hiccup](https://github.com/reagent-project/reagent/blob/master/doc/UsingHiccupToDescribeHTML.md) [syntax](https://purelyfunctional.tv/guide/reagent/)",
:create/email "tangj1122@gmail.com",
:create/time 1588001300273,
:block/uid "78wH6ioZl",
:edit/time 1588012464069,
:edit/email "tangj1122@gmail.com"}],
:block/uid "Jr19hFtWH",
:edit/time 1588012432791,
:edit/email "tangj1122@gmail.com"}
{:block/string
"`datascript` query syntax, pull syntax, and making transactions with Datoms",
:create/email "tangj1122@gmail.com",
:create/time 1588001246915,
:block/children
[{:block/string
"go through [learndatalogtoday](http://www.learndatalogtoday.org/)",
:create/email "tangj1122@gmail.com",
:create/time 1588012891028,
:block/uid "pYuAL6Iml",
:edit/time 1588012930119,
:edit/email "tangj1122@gmail.com"}
{:block/string
"refer to [datascript-playground](https://github.com/markbastian/datascript-playground/) for help",
:create/email "tangj1122@gmail.com",
:create/time 1588012536461,
:block/uid "r08CX6NLC",
:edit/time 1588012953724,
:edit/email "tangj1122@gmail.com"}],
:block/uid "2uFBHan0f",
:edit/time 1588012997603,
:edit/email "tangj1122@gmail.com"}
{:block/string "Debugging with `re-frame-10x`",
:create/email "tangj1122@gmail.com",
:create/time 1588001260247,
:block/uid "oRRLlI9a9",
:edit/time 1588012159068,
:edit/email "tangj1122@gmail.com"}],
:block/uid "2SYuzqCDc",
:edit/time 1588012771160,
:edit/email "tangj1122@gmail.com"}],
:block/uid "YwqiAhdUk",
:edit/time 1588012752911,
:edit/email "tangj1122@gmail.com"}
{:block/string "{{[[TODO]]}} How to write issues",
:create/email "tangj1122@gmail.com",
:create/time 1588012560139,
:block/uid "w9mHHZElf",
:edit/time 1588012643213,
:edit/email "tangj1122@gmail.com"}
{:block/string "{{[[TODO]]}} How to write commits",
:create/email "tangj1122@gmail.com",
:create/time 1588012651735,
:block/uid "-jYk4NaYx",
:edit/time 1588012653396,
:edit/email "tangj1122@gmail.com"}
{:block/string "{{[[TODO]]}} How to submit and merge Pull Requests",
:create/email "tangj1122@gmail.com",
:create/time 1588012589174,
:block/children
[{:block/string "Squashing commits",
:create/email "tangj1122@gmail.com",
:create/time 1588012592943,
:block/uid "BvzJ5Q8Pk",
:edit/time 1588012601889,
:edit/email "tangj1122@gmail.com"}
{:block/string "Review Process",
:create/email "tangj1122@gmail.com",
:create/time 1588012601886,
:block/uid "FGzl4E_Fp",
:edit/time 1588012604784,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1588012604763,
:block/uid "aQngL1k9F",
:edit/time 1588012604763,
:edit/email "tangj1122@gmail.com"}],
:block/uid "w5lrsOO3F",
:edit/time 1588012666021,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Implement block functionality: open, close, and re-order",
:create/email "tangj1122@gmail.com",
:create/time 1588013572788,
:block/children
[{:block/string
"if a block has child blocks, it will have an **arrow** that lets you toggle **open state**",
:create/email "tangj1122@gmail.com",
:create/time 1588013851886,
:block/children
[{:block/string "child1",
:create/email "tangj1122@gmail.com",
:create/time 1588013620021,
:block/uid "NGuQj-hUT",
:edit/time 1588013626171,
:edit/email "tangj1122@gmail.com"}
{:block/string "child2",
:create/email "tangj1122@gmail.com",
:create/time 1588013623841,
:block/uid "6SwN5O3zz",
:edit/time 1588013866844,
:edit/email "tangj1122@gmail.com"}],
:block/uid "qqechwtn6",
:edit/time 1588014217533,
:edit/email "tangj1122@gmail.com"}
{:block/string
"you can re-order blocks by dragging and dropping them",
:create/email "tangj1122@gmail.com",
:create/time 1588013659525,
:block/uid "ZvC9C10JR",
:edit/time 1588013875281,
:edit/email "tangj1122@gmail.com"}],
:block/uid "8lipIYzG-",
:edit/time 1588013584875,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1588105642593,
:block/uid "O9gxDp0sx",
:edit/time 1588105642593,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Not sure where to put this but this is a great resource: https://github.com/intermine/bluegenes",
:create/email "tangj1122@gmail.com",
:create/time 1588105639608,
:block/uid "6DKnk4CTI",
:edit/time 1588105661770,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1588012152258,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588015318494,
:node/title "Datascript",
:edit/time 1588015318495,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588017074233,
:node/title "Babashka",
:block/children
[{:block/string
"source:: https://www.youtube.com/watch?v=Nw8aN-nrdEk",
:create/email "tangj1122@gmail.com",
:create/time 1588017078464,
:block/uid "Y7ZZBo1PP",
:edit/time 1588017080214,
:edit/email "tangj1122@gmail.com"}
{:block/string "type:: notes",
:create/email "tangj1122@gmail.com",
:create/time 1588028463980,
:block/uid "ZupRuJ__-",
:edit/time 1588028466877,
:edit/email "tangj1122@gmail.com"}
{:block/string "#Clojure",
:create/email "tangj1122@gmail.com",
:create/time 1588028468324,
:block/uid "7dkRUOmbl",
:edit/time 1588028476497,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1588028476494,
:block/uid "7plcc_lYC",
:edit/time 1588028476494,
:edit/email "tangj1122@gmail.com"}
{:block/string "Contents",
:create/email "tangj1122@gmail.com",
:create/time 1588017080410,
:block/children
[{:block/string "comparison to other scripting solutions",
:create/email "tangj1122@gmail.com",
:create/time 1588017223576,
:block/children
[{:block/string
"![](https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2F-Bs4Ql4Ma_?alt=media&token=19ea282d-fb34-4ad2-896e-76f07beabf89)",
:block/uid "jePBF0Yvr",
:edit/time 1588017088710,
:edit/email "tangj1122@gmail.com"}],
:block/uid "wNvVlEXkM",
:edit/time 1588017230174,
:edit/email "tangj1122@gmail.com"}
{:block/string "Babashka Goals",
:create/email "tangj1122@gmail.com",
:create/time 1588017220825,
:block/children
[{:block/string
"![](https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2FLFEnStQcDW?alt=media&token=122fbe1a-42b0-4d2e-a8b1-f90ba78309f2)",
:block/uid "hw0-sIssp",
:edit/time 1588017220828,
:edit/email "tangj1122@gmail.com"}],
:block/uid "xEVhFHVrU",
:edit/time 1588017237495,
:edit/email "tangj1122@gmail.com"}
{:block/string "predefine and preload functions",
:create/email "tangj1122@gmail.com",
:create/time 1588017244134,
:block/children
[{:block/string
"![](https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2F63eKM5ln4m?alt=media&token=d70d50b3-6096-4daf-8588-86cc955627aa)",
:block/uid "nMGtGS3G_",
:edit/time 1588017244136,
:edit/email "tangj1122@gmail.com"}],
:block/uid "0-tW3texW",
:edit/time 1588017244134,
:edit/email "tangj1122@gmail.com"}
{:block/string "#[[GraalVM]]",
:create/email "tangj1122@gmail.com",
:create/time 1588017101278,
:block/uid "q6xrCiY6F",
:edit/time 1588017258141,
:edit/email "tangj1122@gmail.com"}
{:block/string "can add libraries with CLASSPATH variable",
:create/email "tangj1122@gmail.com",
:create/time 1588017149948,
:block/uid "pB8MQE_sG",
:edit/time 1588017430750,
:edit/email "tangj1122@gmail.com"}
{:block/string
"implemented edamame and Small Clojure Interpreter to make babashka",
:create/email "tangj1122@gmail.com",
:create/time 1588017425455,
:block/uid "q-HaSwhTD",
:edit/time 1588017533308,
:edit/email "tangj1122@gmail.com"}],
:block/uid "IPh6xuTIi",
:edit/time 1588017090439,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1588017074235,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588017127801,
:node/title "GraalVM",
:edit/time 1588017127802,
:edit/email "tangj1122@gmail.com"}
{:node/title "April 28th, 2020",
:block/children
[{:block/string "[[Future of Coding]] Meta Channel",
:create/email "tangj1122@gmail.com",
:create/time 1588075983115,
:block/children
[{:block/string
"[[Christopher Alexander]]: Whenever we have a tree structure, it means that within this structure no piece of any unit is ever connected to other units, except through the medium of that unit as a whole.",
:create/email "tangj1122@gmail.com",
:create/time 1588075993623,
:block/children
[{:block/string
"[[A City is Not a Tree]] [[A Pattern Language]]",
:create/email "tangj1122@gmail.com",
:create/time 1588082406065,
:block/uid "Mh2gWQZ0O",
:edit/time 1588082522625,
:edit/email "tangj1122@gmail.com"}],
:block/uid "6dQs_VjQL",
:edit/time 1588082436172,
:edit/email "tangj1122@gmail.com"}
{:block/string
"I think the underdeveloped skill in our industry that could also potentially be augmented with better tools is our capacity to work with several dimensions (different tree approximations of the same semi-lattice) at once as well as how easy we can jump back and forth between different levels of complexity (the depth within those trees), __up and down the ladder of abstraction__.",
:create/email "tangj1122@gmail.com",
:create/time 1588076368223,
:block/uid "snPfv6wxS",
:edit/time 1588076930320,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Anyway, the metaphor works and I think I understand that part. Would you agree that the connection to trees and lattices then is this: time domain or decomposition in subsystems (program structure) is one tree approximation, frequency domain or decomposition in regimes (invariants?) is a different tree approximation, but both trees stem from the same program, therefore likely a more complex lattice structure?",
:create/email "tangj1122@gmail.com",
:create/time 1588076567304,
:block/uid "RaUo_Y5mS",
:edit/time 1588076567685,
:edit/email "tangj1122@gmail.com"}
{:block/string
"MG: [OT] what a great thread, sadly most of people on FoC will miss it and we collectively will miss it in a few months, this looks really valuable and reminds me of reading back and forths in the c2 wiki :slightly_smiling_face:\n\nWhat I would love for a tool (of thought :stuck_out_tongue:) is the ability of the people in this conversation to go back, summarize and highlight parts of the conversation for people comming to it later to get a gist or a refinement of the conversation after it happened since I think most of the participants have a clearer idea at the end than at the beginning and the clearest idea just after finishing the conversation, after that the subtelties will fade out (like tears in the rain :stuck_out_tongue:). I've been thinking about a slack/wiki hybrid where you start from threads and start refining them into articles, you can still jump back to previous iterations of the article and the raw conversation, but the entry point is an organized summary.",
:create/email "tangj1122@gmail.com",
:create/time 1588076795209,
:block/children
[{:block/string
"https://futureofcoding.slack.com/archives/C5U3SEW6A/p1574674319319600?thread_ts=1574069038.213900&cid=C5U3SEW6A",
:create/email "tangj1122@gmail.com",
:create/time 1588076808090,
:block/uid "XTyKKBLeF",
:edit/time 1588076808090,
:edit/email "tangj1122@gmail.com"}],
:block/uid "IAmG-0GLq",
:edit/time 1588076904727,
:edit/email "tangj1122@gmail.com"}
{:block/string
"JE: The more pressing issue to me is that Slack is a terrible place to have conversations that last more than a day",
:create/email "tangj1122@gmail.com",
:create/time 1588080181814,
:block/uid "h4xPcWiRU",
:edit/time 1588080181814,
:edit/email "tangj1122@gmail.com"}],
:block/uid "2K-tXfYHE",
:edit/time 1588075993515,
:edit/email "tangj1122@gmail.com"}
{:block/string "[[transclusions]] for data #[[Microsoft Fluid]]",
:create/email "tangj1122@gmail.com",
:create/time 1588080198751,
:block/children
[{:block/string "type:: video",
:create/email "tangj1122@gmail.com",
:create/time 1588080208661,
:block/uid "hFBj4EQIZ",
:edit/time 1588080211916,
:edit/email "tangj1122@gmail.com"}
{:block/string "https://youtu.be/RMzXmkrlFNg?t=140",
:create/email "tangj1122@gmail.com",
:create/time 1588080937792,
:block/uid "KH6K8YPQi",
:edit/time 1588080937792,
:edit/email "tangj1122@gmail.com"}],
:block/uid "E6V1krgH7",
:edit/time 1588080198751,
:edit/email "tangj1122@gmail.com"}
{:block/string "[[Gwern]] Tweet took me down a rabbithole",
:create/email "tangj1122@gmail.com",
:create/time 1588082305761,
:block/children
[{:block/string "[[Whatever Happened to the [[Semantic Web]]?]]",
:create/email "tangj1122@gmail.com",
:create/time 1588080939081,
:block/uid "kDV0PIYlM",
:edit/time 1588081034406,
:edit/email "tangj1122@gmail.com"}
{:block/string
"https://twitter.com/gwern/status/1251635131598671874?s=20",
:create/email "tangj1122@gmail.com",
:create/time 1588082322769,
:block/uid "AAVWKs56k",
:edit/time 1588082322997,
:edit/email "tangj1122@gmail.com"}],
:block/uid "ibu1fiUz_",
:edit/time 1588082334503,
:edit/email "tangj1122@gmail.com"}
{:block/string "[[Athens Change Log]]",
:create/email "tangj1122@gmail.com",
:create/time 1588076779437,
:block/children
[{:block/string
"break [[Create a Minimal Viable Alternative to Roam]] down into two phases: read and write",
:create/email "tangj1122@gmail.com",
:create/time 1588083623147,
:block/uid "bKjTK3g3a",
:edit/time 1588098941498,
:edit/email "tangj1122@gmail.com"}
{:block/string "setup [[DevCards]]",
:create/email "tangj1122@gmail.com",
:create/time 1588083659750,
:block/children
[{:block/string
"source:: https://github.com/athensresearch/athens/issues/6",
:create/email "tangj1122@gmail.com",
:create/time 1588162075029,
:block/uid "Dfq4p7UUX",
:edit/time 1588162079628,
:edit/email "tangj1122@gmail.com"}
{:block/string "type:: [[documentation]]",
:create/email "tangj1122@gmail.com",
:create/time 1588358857378,
:block/uid "cSEnEZ9WG",
:edit/time 1588358864740,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Only partially. I'm reading `cards.html` as a `file://`, whereas I believe it should be served from a `shadow-cljs` server, but I won't mess around with it anymore until it becomes a problem.",
:create/email "tangj1122@gmail.com",
:create/time 1588110648914,
:block/uid "VQ0ZRxdtU",
:edit/time 1588111329401,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Regardless, after setting it up, I realized that it was more suited to pure, stateless components or `reagent` components with localized atom data, not necessarily `re-frame` components that interact with the global store through `subscribe` and `dispatch`. After quick googling, indeed, the [[re-frame]] README.me says:",
:create/email "tangj1122@gmail.com",
:create/time 1588110844840,
:block/children
[{:block/string
"\"Having said that, re-frame remains a work in progress and it falls short in a couple of ways - for example **it doesn't work as well as we'd like with devcards,** because it is a framework, rather than a library. We're still puzzling over some aspects and tweaking as we go. All designs represent a point in the possible design space, with pros and cons.\"",
:create/email "tangj1122@gmail.com",
:create/time 1588110718922,
:block/uid "HNbqluVWA",
:edit/time 1588110855583,
:edit/email "tangj1122@gmail.com"}],
:block/uid "a58yqahTE",
:edit/time 1588111391345,
:edit/email "tangj1122@gmail.com"}
{:block/string
"At the end of this [issue](https://github.com/bhauman/devcards/issues/105) is someone claiming they have a solution that uses a separate re-frame namespace for state. This is certainly something that can be tried.",
:create/email "tangj1122@gmail.com",
:create/time 1588110791687,
:block/uid "LMy7WZWqb",
:edit/time 1588110952582,
:edit/email "tangj1122@gmail.com"}
{:block/string
"What this has taught me, though, is that the **components should be dumb and ideally framework-agnostic**. They are simply HTML views, so if we switched to ,say [[fulcro]], DevCards should work all the same. At the very least, the data subscription should be decoupled from the render -> __pure__ components.",
:create/email "tangj1122@gmail.com",
:create/time 1588110935938,
:block/uid "fgGgbBj4F",
:edit/time 1588111693221,
:edit/email "tangj1122@gmail.com"}
{:block/string
"I could definitely refactor the smaller component such that this were true. But what about `dispatch`es? If the global store is modified, that is necessarily impure, and it delves into the territory of the framework.",
:create/email "tangj1122@gmail.com",
:create/time 1588111039213,
:block/uid "wBRSnWTcE",
:edit/time 1588111515924,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Athens is read-only, yes, but even changing the `route` requires changes to application state, even if it's not persisted. Same goes for a search bar.",
:create/email "tangj1122@gmail.com",
:create/time 1588111166775,
:block/uid "u6AnNrLog",
:edit/time 1588111529610,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Any changes to blocks or pages, even if you just zoom in on one, makes changes to Datoms, which are acknowledged in the database. I can make components dumb by feeding them vectors and maps of datoms rather than what I'm doing now which is feeding them `id`s they then make `subscribe`s on. But in terms of interaction, most interaction will be global.",
:create/email "tangj1122@gmail.com",
:create/time 1588111225601,
:block/uid "HZ0mxxz-k",
:edit/time 1588111977343,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Furthermore, interactivity __should__ be tested, even if they are dumb. Which means the predicament is such: how to test \"dumb\" components that are \"powerful\", i.e. that lead to side-effects?",
:create/email "tangj1122@gmail.com",
:create/time 1588111978073,
:block/uid "ajCGj07rJ",
:edit/time 1588112075407,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Everything that changes the location or route are effectful.",
:create/email "tangj1122@gmail.com",
:create/time 1588112051037,
:block/uid "pbf4V0Jj-",
:edit/time 1588112255437,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Changes to open/close of a block create are effectful.",
:create/email "tangj1122@gmail.com",
:create/time 1588112128989,
:block/uid "cPoH9I2_I",
:edit/time 1588112259721,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Searching in the typeahead are effectful, if autocomplete/suggestions show.",
:create/email "tangj1122@gmail.com",
:create/time 1588112159814,
:block/uid "bTTUoVqrx",
:edit/time 1588112265339,
:edit/email "tangj1122@gmail.com"}
{:block/string
"When I'm working on a component, I want to see the raw EDN it's rendering from, and diffs on db transactions. I can accomplish the former but the latter would be more difficult. `re-frame-10x` only shows the events and the diff on the atom, but it doesn't play very nicely with `re-posh`. This is unfortunate because diffs from the transaction is one the nicest parts about `Datomic`.",
:create/email "tangj1122@gmail.com",
:create/time 1588112233386,
:block/uid "J3xIkSGOz",
:edit/time 1588116613746,
:edit/email "tangj1122@gmail.com"}
{:block/string "...",
:create/email "tangj1122@gmail.com",
:create/time 1588119258956,
:block/uid "Vz7CVUzAr",
:edit/time 1588119258956,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Decoupling subscription from view didn't work super well for a few reasons:",
:create/email "tangj1122@gmail.com",
:create/time 1588119288542,
:block/children
[{:block/string
"The way the components are organized are such that they get the minimal amount of information. That is, the blocks, pages, and children are only passed their id. Then they have to query datascript for everything else. Which means each component would have to be fragmented into two. All the components make queries.",
:create/email "tangj1122@gmail.com",
:create/time 1588116600297,
:block/uid "Hf_cd4u8f",
:edit/time 1588119363808,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Second, all components have children. Which means they make subsequent `subscribe` calls, which breaks devcards. I do believe `subscribe`s can be rewritten to minimize round-trips, but that doesn't help devcards",
:create/email "tangj1122@gmail.com",
:create/time 1588119352654,
:block/uid "YY2d15Zc5",
:edit/time 1588161442751,
:edit/email "tangj1122@gmail.com"}],
:block/uid "FLOtVHIc8",
:edit/time 1588119288542,
:edit/email "tangj1122@gmail.com"}
{:block/string "...",
:create/email "tangj1122@gmail.com",
:create/time 1588161442981,
:block/uid "lIH5IqRKC",
:edit/time 1588161497146,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1588161498248,
:block/uid "LrrFoXu4h",
:edit/time 1588161498248,
:edit/email "tangj1122@gmail.com"}],
:block/uid "zfU95NXld",
:edit/time 1588162075035,
:edit/email "tangj1122@gmail.com"}],
:block/uid "mvPy_ApY5",
:edit/time 1588083540642,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1588030750506,
:edit/email "eloi.poch@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588080198765,
:node/title "Microsoft Fluid",
:edit/time 1588080198767,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588080994727,
:node/title "Whatever Happened to the [[Semantic Web]]?",
:block/children
[{:block/string
"source:: https://twobithistory.org/2018/05/27/semantic-web.html",
:create/email "tangj1122@gmail.com",
:create/time 1588080996898,
:block/uid "cugCwabEU",
:edit/time 1588081000991,
:edit/email "tangj1122@gmail.com"}
{:block/string "type:: notes",
:create/email "tangj1122@gmail.com",
:create/time 1588081001324,
:block/uid "C0TH091GA",
:edit/time 1588081002954,
:edit/email "tangj1122@gmail.com"}
{:block/string
"#[[Gwern]] #[[Cory Doctorow]] #[[World Wide Web Consortium (W3C)]]",
:create/email "tangj1122@gmail.com",
:create/time 1588081273154,
:block/uid "0Q2kdC3iR",
:edit/time 1588082287668,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1588081276854,
:block/uid "tMXJHqC2y",
:edit/time 1588081276854,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1588081272187,
:block/uid "W01DCrVdD",
:edit/time 1588081272187,
:edit/email "tangj1122@gmail.com"}
{:block/string "Comments",
:create/email "tangj1122@gmail.com",
:create/time 1588081228413,
:block/children
[{:block/string
"Metadata requires deliberate gardening, something few people actually care to do. There are some blogs and Wikipedia, but that's about it.",
:create/email "tangj1122@gmail.com",
:create/time 1588081236761,
:block/uid "RvX_hpTZa",
:edit/time 1588081295709,
:edit/email "tangj1122@gmail.com"}],
:block/uid "6IVjGmaF2",
:edit/time 1588081236766,
:edit/email "tangj1122@gmail.com"}
{:block/string "Contents",
:create/email "tangj1122@gmail.com",
:create/time 1588081002950,
:block/children
[{:block/string
"Some might still protest that the web and the internet are two different things, but the distinction gets less clear all the time. The web we have today is slowly becoming a glorified app store, just the easiest way among many to download software that communicates with distant servers using closed protocols and schemas, making it functionally identical to the software ecosystem that existed before the web. How did we get here? If the effort to build a Semantic Web had succeeded, would the web have looked different today? Or have there been so many forces working against a decentralized web for so long that the Semantic Web was always going to be stillborn?",
:create/email "tangj1122@gmail.com",
:create/time 1588081169509,
:block/uid "ronQa1SEP",
:edit/time 1588081172721,
:edit/email "tangj1122@gmail.com"}
{:block/string
"The basic idea behind the Semantic Web was that everyone would use a new set of standards to annotate their webpages with little bits of XML. These little bits of XML would have no effect on the presentation of the webpage, but they could be read by software programs to divine meaning that otherwise would only be available to humans.",
:create/email "tangj1122@gmail.com",
:create/time 1588081174494,
:block/uid "_4TluJQFP",
:edit/time 1588081192323,
:edit/email "tangj1122@gmail.com"}
{:block/string
"The bits of XML were a way of expressing __metadata__ about the webpage. We are all familiar with metadata in the context of a file system: When we look at a file on our computers, we can see when it was created, when it was last updated, and whom it was originally created by. Likewise, webpages on the Semantic Web would be able to tell your browser who authored the page and perhaps even where that person went to school, or where that person is currently employed. In theory, this information would allow Semantic Web browsers to answer queries across a large collection of webpages. In their article for Scientific American, Berners-Lee and his co-authors explain that you could, for example, use the Semantic Web to look up a person you met at a conference whose name you only partially remember.",
:create/email "tangj1122@gmail.com",
:create/time 1588081199950,
:block/uid "ZqxMF2RdH",
:edit/time 1588081210588,
:edit/email "tangj1122@gmail.com"}
{:block/string
"The long effort to build the [[Semantic Web]] has been said to consist of **four phases.**7 The first phase, which lasted from 2001 to 2005, was the golden age of Semantic Web activity. Between 2001 and 2005, the W3C issued a slew of new standards laying out the foundational technologies of the Semantic future.",
:create/email "tangj1122@gmail.com",
:create/time 1588081688949,
:block/uid "JeSDuwYwu",
:edit/time 1588081737861,
:edit/email "tangj1122@gmail.com"}
{:block/string
"First Phase of the Semantic Web: The most important of these [standards] was the Resource Description Framework ([[RDF]]).",
:create/email "tangj1122@gmail.com",
:create/time 1588081200479,
:block/children
[{:block/string
"RDF in Attributes (RDFa) defines how RDF can be embedded in HTML so that browsers, search engines, and other programs can glean meaning from a webpage.",
:create/email "tangj1122@gmail.com",
:create/time 1588081764762,
:block/uid "N0gqFwWbG",
:edit/time 1588081764762,
:edit/email "tangj1122@gmail.com"}
{:block/string
"RDF Schema and another standard called OWL allows RDF authors to demarcate the boundary between valid and invalid RDF statements in their RDF documents. **RDF Schema and OWL, in other words, are tools for creating what are known as ontologies, explicit specifications of what can and cannot be said within a specific domain** #[[ontology]]",
:create/email "tangj1122@gmail.com",
:create/time 1588081717702,
:block/uid "8KfpUtOYE",
:edit/time 1588081787858,
:edit/email "tangj1122@gmail.com"}],
:block/uid "M8Zin29Ed",
:edit/time 1588081735269,
:edit/email "tangj1122@gmail.com"}
{:block/string "Second phase:",
:create/email "tangj1122@gmail.com",
:create/time 1588081681906,
:block/children
[{:block/string
"In 2006, Tim Berners-Lee posted a short article in which he argued that the existing work on Semantic Web standards needed to be supplemented by a concerted effort to make semantic data available on the web [[[[Tim Berners-Lee]]: [[Linked Data]]]]",
:create/email "tangj1122@gmail.com",
:create/time 1588081822731,
:block/uid "Jq03AS6eZ",
:edit/time 1588081862479,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Berners-Lee’s article launched the second phase of the Semantic Web’s development, where the focus shifted from setting standards and building toy examples to creating and popularizing large RDF datasets. Perhaps the most successful of these datasets was [[DBpedia]], a giant repository of RDF triplets extracted from Wikipedia articles. DBpedia, which made heavy use of the Semantic Web standards that had been developed in the first half of the 2000s, was a standout example of what could be accomplished using the W3C’s new formats. Today DBpedia describes 4.58 million entities and is used by organizations like the NY Times, BBC, and IBM, which employed DBpedia as a knowledge source for IBM Watson, the Jeopardy-winning artificial intelligence system.",
:create/email "tangj1122@gmail.com",
:create/time 1588081895961,
:block/uid "xp85r3_Lr",
:edit/time 1588081895961,
:edit/email "tangj1122@gmail.com"}],
:block/uid "VZWuBSqSE",
:edit/time 1588081694473,
:edit/email "tangj1122@gmail.com"}
{:block/string "Third Phase",
:create/email "tangj1122@gmail.com",
:create/time 1588081907052,
:block/children
[{:block/string
"The third phase of the Semantic Web’s development involved adapting the W3C’s standards to fit the actual practices and preferences of web developers. By 2008, JSON had begun its meteoric rise to popularity. Whereas XML came packaged with a bunch of associated technologies of indeterminate purpose (XLST, XPath, XQuery, XLink), JSON was just JSON. It was less verbose and more readable. Manu Sporny, an entrepreneur and member of the W3C, had already started using JSON at his company and wanted to find an easy way for RDFa and JSON to work together.11 The result would be [[JSON-LD]], which in essence was **RDF reimagined for a world that had chosen JSON over XML**. Sporny, together with his CTO, Dave Longley, issued a draft specification of JSON-LD in 2010. For the next few years, JSON-LD and an updated RDF specification would be the primary focus of Semantic Web work at the W3C. JSON-LD could be used on its own or it could be embedded within a <script> tag on an HTML page, making it an alternative to both RDF and RDFa.",
:create/email "tangj1122@gmail.com",
:create/time 1588081935751,
:block/uid "VtPTDy2Vo",
:edit/time 1588081945556,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Work on JSON-LD coincided with the development of schema.org, a centralized collection of simple schemas for describing things that might exist on the web. [[schema.org]] was started by Google, Bing, and Yahoo with the express purpose of delivering better search results by agreeing to a common set of vocabularies. schema.org vocabularies, together with JSON-LD, are now used to drive features like Google’s Knowledge Graph. The approach was a more practical and less abstract one, where immediate applications in search results were the focus. The schema.org team are careful to state on their website that they **are not attempting to create a “universal ontology**.”12",
:create/email "tangj1122@gmail.com",
:create/time 1588081979254,
:block/uid "lSE4G-Xwk",
:edit/time 1588081979254,
:edit/email "tangj1122@gmail.com"}],
:block/uid "1I4L4E5KL",
:edit/time 1588081907052,
:edit/email "tangj1122@gmail.com"}
{:block/string
"And so the Semantic Web, as colorfully described by one person, is “as **dead as last year’s roadkill**.”14 At least, the version of the Semantic Web originally proposed by Tim Berners-Lee, which once seemed to be the imminent future of the web, is unlikely to emerge soon. That said, many of the technologies and ideas that were developed amid the push to create the Semantic Web have been repurposed and live on in various applications.",
:create/email "tangj1122@gmail.com",
:create/time 1588082080157,
:block/children
[{:block/string
"As already mentioned, Google relies on Semantic Web technologies—now primarily JSON-LD—to generate useful conceptual summaries next to search results. schema.org maintains a list of “vocabularies” that web developers can use to publish easily understood data for a wide audience—it is a new, more practical imagining of what a public, shared ontology might look like.",
:create/email "tangj1122@gmail.com",
:create/time 1588082084771,
:block/uid "KgdCniYkX",
:edit/time 1588082084771,
:edit/email "tangj1122@gmail.com"}
{:block/string
"And to some degree, the many REST APIs now available constitute a diminished Semantic Web. What wasn’t possible in 2001 now is: You can easily build applications that make use of data from across the web. The difference is that you must sign up for each API one by one beforehand, which in addition to being wearisome also gives whoever hosts the API enormous control over how you access their data.",
:create/email "tangj1122@gmail.com",
:create/time 1588082098684,
:block/uid "l31eVVGls",
:edit/time 1588082098684,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Another modern application of Semantic Web technologies, perhaps the most popular and successful in recent years outside of Google, is Facebook’s [[OpenGraph]] protocol. The OpenGraph protocol defines a schema that web developers can use (via RDFa) to determine how a web page is displayed when shared in a social media application. For example, a web developer working at the New York Times might use OpenGraph to specify the title and thumbnail that should appear when a New York Times article is shared in Facebook. In one sense, this is an application of Semantic Web technologies true to the Semantic Web’s origins in research on metadata. Tagging a webpage with extra information about who wrote it and what it is about is exactly the kind of metadata authoring the Semantic Web was going to depend on. But in another sense, **OpenGraph is an application of Semantic Web technologies to further a purpose somewhat at odds with the philosophy of the web**. The metadata isn’t meant to be general-purpose, after all. People tag their webpages using OpenGraph because they want links to their content to unfurl properly in Facebook. And the more information Facebook knows about your website, the closer **Facebook gets to simply reproducing your entire website within Facebook**, portending a future where the open web is a mythical land beyond Facebook’s towering blue walls.",
:create/email "tangj1122@gmail.com",
:create/time 1588082143369,
:block/uid "FwkNRsrBv",
:edit/time 1588082155443,
:edit/email "tangj1122@gmail.com"}
{:block/string
"What’s fascinating about JSON-LD and OpenGraph is that you can use them without knowing anything about subject-predicate-object triplets, RDF, RDF Schema, ontologies, OWL, or really any other Semantic Web technologies—you don’t even have to know XML. Manu Sporny has even said that the JSON-LD working group at W3C **made a special effort to avoid references to RDF in the JSON-LD specification**.15 This is almost certainly why these technologies have succeeded and continue to be popular. **Nobody wants to use a tool that can only be fully understood by reading a whole family of specifications.**",
:create/email "tangj1122@gmail.com",
:create/time 1588082190699,
:block/uid "K4chPq55C",
:edit/time 1588082190699,
:edit/email "tangj1122@gmail.com"}
{:block/string
"To host your own website, you need to buy a domain name from ICANN, configure it correctly using DNS, and then pay someone to host your content if you don’t already have a server of your own. We shouldn’t be surprised if the average person finds it **easier to enter their information into a giant, corporate data repository**. And in a web of giant, corporate data repositories, there are no compelling use cases for Semantic Web technologies",
:create/email "tangj1122@gmail.com",
:create/time 1588082232212,
:block/uid "teImC6YQO",
:edit/time 1588082232212,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Imagine a web where, rather than filling out the same tedious form every time you register for a service, you were somehow able to authorize services to get that information from your own website. Imagine a Facebook that keeps your list of friends, hosted on your own website, up-to-date, rather than vice-versa. Basically, the Semantic Web was going to be a web where **everyone gets to have their own personal REST API**, whether they know the first thing about computers or not. Conceived of that way, it’s easy to see why the Semantic Web hasn’t yet been realized. There are so many engineering and security issues to sort out between here and there. **But it’s also easy to see why the dream of the Semantic Web seduced so many people.**\n\n\n",
:create/email "tangj1122@gmail.com",
:create/time 1588081887903,
:block/uid "p90242Uq1",
:edit/time 1588082276912,
:edit/email "tangj1122@gmail.com"}],
:block/uid "7V7MyJQLa",
:edit/time 1588082080157,
:edit/email "tangj1122@gmail.com"}],
:block/uid "2UahvQlfG",
:edit/time 1588081169513,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1588081034406,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588081034410,
:node/title "Semantic Web",
:edit/time 1588081034412,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588081276859,
:node/title "Gwern",
:edit/time 1588081276861,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588081356916,
:node/title "Cory Doctorow",
:edit/time 1588081356917,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588081443636,
:node/title "World Wide Web Consortium (W3C)",
:edit/time 1588081443637,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588081596678,
:node/title "Tim Berners-Lee",
:edit/time 1588081862482,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588081787860,
:node/title "ontology",
:edit/time 1588081787862,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588081862480,
:node/title "[[Tim Berners-Lee]]: [[Linked Data]]",
:block/children
[{:block/string
"source:: https://www.w3.org/DesignIssues/LinkedData.html",
:create/email "tangj1122@gmail.com",
:create/time 1588081873291,
:block/uid "ndUIMtUjp",
:edit/time 1588081874851,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1588081875100,
:block/uid "7NIMe3lRQ",
:edit/time 1588081875100,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1588081862482,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588081862480,
:node/title "Linked Data",
:edit/time 1588081862482,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588081893206,
:node/title "DBpedia",
:edit/time 1588081893208,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588081941541,
:node/title "JSON-LD",
:edit/time 1588081941543,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588081977292,
:node/title "schema.org",
:edit/time 1588081977293,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588082128107,
:node/title "OpenGraph",
:edit/time 1588082128109,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588082410404,
:node/title "Christopher Alexander",
:edit/time 1588082410408,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588082424297,
:node/title "A City is Not a Tree",
:block/children
[{:block/string
"source:: https://www.patternlanguage.com/archive/cityisnotatree.html",
:create/email "tangj1122@gmail.com",
:create/time 1588082431526,
:block/uid "-jdu6vWBX",
:edit/time 1588082433451,
:edit/email "tangj1122@gmail.com"}
{:block/string "by [[Christopher Alexander]]",
:create/email "tangj1122@gmail.com",
:create/time 1588082433448,
:block/uid "2_xvqTcjI",
:edit/time 1588532959700,
:edit/email "tangj1122@gmail.com"}
{:block/string "Contents",
:create/email "tangj1122@gmail.com",
:create/time 1588532972550,
:block/children
[{:block/string "Part 1",
:create/email "tangj1122@gmail.com",
:create/time 1588532959697,
:block/children
[{:block/string
"Siena, Liverpool, Kyoto, Manhattan are examples of natural cities. ",
:create/email "tangj1122@gmail.com",
:create/time 1588533017653,
:block/uid "eH6s-Cs_v",
:edit/time 1588533017653,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Levittown, Chandigarh and the British New Towns are examples of artificial cities.",
:create/email "tangj1122@gmail.com",
:create/time 1588533003755,
:block/uid "SGA37PiNe",
:edit/time 1588533017655,
:edit/email "tangj1122@gmail.com"}
{:block/string
"It is more and more widely recognized today that there is some essential ingredient missing from artificial cities. When compared with ancient cities that have acquired the patina of life, our modern attempts to create cities artificially are, from a human point of view, entirely unsuccessful.",
:create/email "tangj1122@gmail.com",
:create/time 1588533037836,
:block/uid "sESfUDY6k",
:edit/time 1588533038051,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Both the tree and the semilattice are ways of thinking about how a large collection of many small systems goes to make up a large and complex system. More generally, they are both names for structures of sets.",
:create/email "tangj1122@gmail.com",
:create/time 1588533048940,
:block/uid "8tgRNQuDF",
:edit/time 1588533049457,
:edit/email "tangj1122@gmail.com"}
{:block/string
"When the elements of a set belong together because they co-operate or work together somehow, we call the set of elements a system",
:create/email "tangj1122@gmail.com",
:create/time 1588533091132,
:block/uid "SEEHxFJLn",
:edit/time 1588533091575,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Now, a collection of subsets which goes to make up such a picture is not merely an amorphous collection. Automatically, merely because relationships are established among the subsets once the subsets are chosen, the collection has a definite structure.",
:create/email "tangj1122@gmail.com",
:create/time 1588533092656,
:block/uid "8_qierPPg",
:edit/time 1588533184553,
:edit/email "tangj1122@gmail.com"}
{:block/string
"However, in this chapter we are not so much concerned with the fact that a tree happens to be a semilattice, but with the difference between trees and those more general semilattices which are not trees because they do contain overlapping units. We are concerned with the difference between structures in which no overlap occurs, and those structures in which overlap does occur.",
:create/email "tangj1122@gmail.com",
:create/time 1588533185928,
:block/uid "kvCQjeZOo",
:edit/time 1588533404937,
:edit/email "tangj1122@gmail.com"}
{:block/string
"It is not merely the overlap which makes the distinction between the two important. Still more important is the fact that the semilattice is potentially a much more complex and subtle structure than a tree. We may see just how much more complex a semilattice can be than a tree in the following fact: a tree based on 20 elements can contain at most 19 further subsets of the 20, while a semilattice based on the same 20 elements can contain more than 1,000,000 different subsets. This enormously greater variety is an index of the great structural complexity a semilattice can have when compared with the structural simplicity of a tree.** It is this lack of structural complexity, characteristic of trees, which is crippling our conceptions of the city.**",
:create/email "tangj1122@gmail.com",
:create/time 1588533406643,
:block/uid "mK05YNc9K",
:edit/time 1588533440657,
:edit/email "tangj1122@gmail.com"}
{:block/string
"![](https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2FDcuYQ5Sz5w.png?alt=media&token=48a1ba71-b6ba-4c71-ae8f-9549a40334ec)",
:create/email "tangj1122@gmail.com",
:create/time 1588533789438,
:block/uid "dbKhF7I3C",
:edit/time 1588533811552,
:edit/email "tangj1122@gmail.com"}
{:block/string
"![](https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2FO3k9xBc_1O.png?alt=media&token=15d20b16-a4a1-4b57-9dcb-cf42579a5fee)",
:create/email "tangj1122@gmail.com",
:create/time 1588533812290,
:block/uid "SUcfMEHj8",
:edit/time 1588533821589,
:edit/email "tangj1122@gmail.com"}
{:block/string
"In a traditional society, if we ask a man to name his best friends and then ask each of these in turn to name their best friends, they will all name each other so that they form a closed group. A village is made up of a number of separate closed groups of this kind.",
:block/uid "Z_3UD7DLV",
:edit/time 1588533782229,
:edit/email "tangj1122@gmail.com"}
{:block/string
"But today's social structure is utterly different. If we ask a man to name his friends and then ask them in turn to name their friends, they will all name different people, very likely unknown to the first person; these people would again name others, and so on outwards. There are virtually no closed groups of people in modern society. The reality of today's social structure is thick with overlap—the systems of friends and acquaintances form a semilattice, not a tree (Figure 10).",
:block/uid "bA1koD1iw",
:edit/time 1588533782229,
:edit/email "tangj1122@gmail.com"}],
:block/uid "wlIbu9Rjn",
:edit/time 1588532967214,
:edit/email "tangj1122@gmail.com"}
{:block/string "Part 2",
:create/email "tangj1122@gmail.com",
:create/time 1588532967211,
:block/children
[{:block/string
"The units of which an artificial city is made up are always organized to form a tree. So that we get a really clear understanding of what this means, and shall better see its implications, let us define a tree once again. Whenever we have a tree structure, it means that within this structure no piece of any unit is ever connected to other units, except through the medium of that unit as a whole.",
:create/email "tangj1122@gmail.com",
:create/time 1588533863595,
:block/uid "cuXslvzey",
:edit/time 1588533864035,
:edit/email "tangj1122@gmail.com"}
{:block/string
"The enormity of this restriction is difficult to grasp. It is a little as though the members of a family were not free to make friends outside the family, except when the family as a whole made a friendship.",
:create/email "tangj1122@gmail.com",
:create/time 1588533945830,
:block/uid "CaeFUibwi",
:edit/time 1588533946037,
:edit/email "tangj1122@gmail.com"}
{:block/string
"In simplicity of structure the tree is comparable to the compulsive desire for neatness and order that insists the candlesticks on a mantelpiece be perfectly straight and perfectly symmetrical about the centre. The [[semilattice]], by comparison, is the structure of a complex fabric; it is the structure of living things, of great paintings and symphonies. It must be emphasized, lest the orderly mind shrink in horror from anything that is not clearly articulated and categorized in tree form, that the idea of overlap, ambiguity, multiplicity of aspect and the semilattice are not less orderly than the rigid tree, but more so. They represent a thicker, tougher, more subtle and more complex view of structure",
:create/email "tangj1122@gmail.com",
:create/time 1588534026238,
:block/uid "oV7VwPl5G",
:edit/time 1588703110753,
:edit/email "tangj1122@gmail.com"}
{:block/string
"As you can see at once, the different units do not coincide. Yet neither are they disjoint. They overlap. We cannot get an adequate picture of what Middlesbrough is, or of what it ought to be, in terms of 29 large and conveniently integral Chunks called neighbourhoods. When we describe the city in terms of neighbourhoods, we implicitly assume that the smaller elements within any one of these neighbourhoods belong together so tightly that they only interact with elements in other neighbourhoods through the medium of the neighbourhoods to which they themselves belong. Ruth Glass herself shows clearly that this is not the case.",
:create/email "tangj1122@gmail.com",
:create/time 1588534026866,
:block/uid "40tg8HTSy",
:edit/time 1588534281301,
:edit/email "tangj1122@gmail.com"}
{:block/string "[[Play]]",
:create/email "tangj1122@gmail.com",
:create/time 1588534285497,
:block/children
[{:block/string
"Another favourite concept of the CIAM theorists and others is the separation of recreation from everything else. This has crystallized in our real cities in the form of playgrounds. The playground, asphalted and fenced in, is nothing but a pictorial acknowledgment of the fact that 'play' exists as an isolated concept in our minds. It has nothing to do with the life of play itself. Few self-respecting children will even play in a playground.",
:block/uid "XDZBlo7Qj",
:edit/time 1588534633556,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Play itself, the play that children practise, goes on somewhere different every day. One day it may be indoors, another day in a friendly gas station, another day down by the river, another day in a derelict building, another day on a construction site which has been abandoned for the weekend. Each of these play activities, and the objects it requires, forms a system. It is not true that these systems exist in isolation, cut off from the other systems of the city. The different systems overlap one another, and they overlap many other systems besides. The units, the physical places recognized as play places, must do the same.",
:block/uid "zITfrDItj",
:edit/time 1588534633556,
:edit/email "tangj1122@gmail.com"}],
:block/uid "clJCiwtSi",
:edit/time 1588534633042,
:edit/email "tangj1122@gmail.com"}
{:block/string
"But this tree, and the idea of a single hierarchy of urban cores which is its parent, do not illuminate the relations between art and city life. They are merely born of the mania every simple-minded person has for putting things with the same name into the same basket.",
:create/email "tangj1122@gmail.com",
:create/time 1588534720484,
:block/uid "kM0F4ER6E",
:edit/time 1588534721430,
:edit/email "tangj1122@gmail.com"}
{:block/string
"This second structure, which is informal, working within the framework of the first, is what really controls public action. It varies from week to week, even from hour to hour, as one problem replaces another. Nobody's sphere of influence is entirely under the control of any one superior; each person is under different influences as the problems change. Although the organization chart in the Mayor's office is a tree, the actual control and exercise of authority is semilattice-like.",
:create/email "tangj1122@gmail.com",
:create/time 1588534843208,
:block/uid "YAtsB-3R1",
:edit/time 1588534843448,
:edit/email "tangj1122@gmail.com"}
{:block/string
"because designers, limited as they must be by the capacity of the mind to form intuitively accessible structures, cannot achieve the complexity of the semilattice in a single mental act.",
:create/email "tangj1122@gmail.com",
:create/time 1588534843770,
:block/uid "811JwGBKL",
:edit/time 1588534853225,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Let me begin with an example. Suppose I ask you to remember the following four objects: an orange, a watermelon, a football and a tennis ball. How will you keep them in your mind, in your mind's eye? However you do it, you will do it by grouping them. Some of you will take the two fruits together, the orange and the watermelon, and the two sports balls together, the football and the tennis ball. Those of you who tend to think in terms of physical shape may group them differently, taking the two small spheres together—the orange and the tennis ball and the two large and more egg-shaped objects—the watermelon and the football. Some of you will be aware of both.",
:block/uid "3i8KMTyp5",
:edit/time 1588534974781,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Either grouping taken by itself is a tree structure. The two together are a semilattice. Now let us try and visualize these groupings in the mind's eye. I think you will find that you cannot visualize all four sets simultaneously—because they overlap. You can visualize one pair of sets and then the other, and you can alternate between the two pairs extremely fast, so that you may deceive yourself into thinking you can visualize them all together. But in truth, you cannot conceive all four sets at once in a single mental act. You cannot bring the semilattice structure into a visualizable form for a single mental act. In a single mental act you can only visualize a tree.",
:block/uid "-FqSanm4O",
:edit/time 1588534981905,
:edit/email "tangj1122@gmail.com"}
{:block/string
"![](https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2F68GD6siSil.png?alt=media&token=76f1be3e-0624-444e-88bd-0fe4b3127bce)",
:block/props
{"image-size"
{"https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2F68GD6siSil.png?alt=media&token=76f1be3e-0624-444e-88bd-0fe4b3127bce"
{"width" 330, "height" nil}}},
:block/uid "30iNbvBVV",
:edit/time 1588534993672,
:edit/email "tangj1122@gmail.com"}
{:block/string
"It is known today that grouping and categorization are among the most primitive psychological processes. Modern psychology treats thought as a process of fitting new situations into existing slots and pigeonholes in the mind. Just as you cannot put a physical thing into more than one physical pigeonhole at once, so, by analogy, the processes of thought prevent you from putting a mental construct into more than one mental category at once. Study of the origin of these processes suggests that they stem essentially from the organism's need to reduce the complexity of its environment by establishing barriers between the different events that it encounters. #[[Psychology]]",
:create/email "tangj1122@gmail.com",
:create/time 1588535029342,
:block/uid "isKod1REp",
:edit/time 1588535046724,
:edit/email "tangj1122@gmail.com"}
{:block/string
"These experiments suggest strongly that people have an underlying tendency, when faced by a complex organization, to reorganize it mentally in terms of non-overlapping units. The complexity of the semilattice is replaced by the simpler and more easily grasped tree form.",
:create/email "tangj1122@gmail.com",
:create/time 1588535129948,
:block/uid "znJl-9xav",
:edit/time 1588535130508,
:edit/email "tangj1122@gmail.com"}
{:block/string "Triangle Experiment",
:create/email "tangj1122@gmail.com",
:create/time 1588535450299,
:block/children
[{:block/string
"![](https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2FRQiFT1Chgu.png?alt=media&token=558b7cbf-8652-4728-9f68-034cd4e89fb3)",
:block/uid "OMV5UWySb",
:edit/time 1588535448659,
:edit/email "tangj1122@gmail.com"}
{:block/string
"![](https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2FHWIF2b1NZ8.png?alt=media&token=c3f1b534-9f8b-4751-b554-82058fa4ace6)",
:block/uid "7tXElU17r",
:edit/time 1588535441759,
:edit/email "tangj1122@gmail.com"}
{:block/string
"One can perhaps make the physical consequences of overlap more comprehensible by means of an image. The painting illustrated is a work by Simon Nicholson (Figure 18). The fascination of this painting lies in the fact that, although constructed of rather few simple triangular elements, these elements unite in many different ways to form the large units of the painting—in such a way indeed that, if we make a complete inventory of the perceived units in the painting, we find that each triangle enters into four or five completely different kinds of unit, none contained in the others, yet all overlapping in that triangle.",
:create/email "tangj1122@gmail.com",
:create/time 1588535427061,
:block/uid "2DnWCaB11",
:edit/time 1588535427315,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Thus, if we number the triangles and pick out the sets of triangles which appear as strong visual units, we get the semilattice shown inFigure 19.",
:block/uid "5rFTs8Nmy",
:edit/time 1588535422745,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Three and 5 form a unit because they work together as a rectangle; 2 and 4 because they form a parallelogram; 5 and 6 because they are both dark and pointing the same way; 6 and 7 because one is the ghost of the other shifted sideways; 4 and 7 because they are symmetrical with one another; 4 and 6 because they form another rectangle; 4 and 5 because they form a sort of Z; 2 and 3 because they form a rather thinner kind of Z; 1 and 7 because they are at opposite corners; 1 and 2 because they are a rectangle; 3 and 4 because they point the same way as 5 and 6, and form a sort of off-centre reflection; 3 and 6 because they enclose 4 and 5; 1 and S because they enclose 2, 3 and 4. I have only listed the units of two triangles. The larger units are even more complex. The white is more complex still and is not even included in the diagram because it is harder to be sure of its elementary pieces.",
:block/uid "787nQhqcH",
:edit/time 1588535422745,
:edit/email "tangj1122@gmail.com"}],
:block/uid "wsdP2JS5U",
:edit/time 1588535453811,
:edit/email "tangj1122@gmail.com"}
{:block/string
"When we think in terms of trees we are trading the humanity and richness of the living city for a conceptual simplicity which benefits only designers, planners, administrators and developers. Every time a piece of a city is torn out, and a tree made to replace the semilattice that was there before, the city takes a further step toward dissociation.",
:create/email "tangj1122@gmail.com",
:create/time 1588535132211,
:block/uid "8im0vj5wO",
:edit/time 1588535354490,
:edit/email "tangj1122@gmail.com"}
{:block/string
"For the human mind, the tree is the easiest vehicle for complex thoughts. But the city is not, cannot and must not be a tree. The city is a receptacle for life. If the receptacle severs the overlap of the strands of life within it, because it is a tree, it will be like a bowl full of razor blades on edge, ready to cut up whatever is entrusted to it. In such a receptacle life will be cut to pieces. If we make cities which are trees, they will cut our life within to pieces.",
:create/email "tangj1122@gmail.com",
:create/time 1588535392683,
:block/uid "_3e9S2BKB",
:edit/time 1588535401786,
:edit/email "tangj1122@gmail.com"}],
:block/uid "afuI3yVjE",
:edit/time 1588532968235,
:edit/email "tangj1122@gmail.com"}],
:block/uid "9ogLctmuY",
:edit/time 1588532974111,
:edit/email "tangj1122@gmail.com"}
{:block/string "Comments",
:create/email "tangj1122@gmail.com",
:create/time 1588533864802,
:block/children
[{:block/string
"Clojure and Datomic are backed by a persistent data structure, a shallow but high branching tree. It is a discrete tree under the hood, but all the data structures defined from it share the tree together. So beautiful.",
:create/email "tangj1122@gmail.com",
:create/time 1588533866769,
:block/uid "HvHRlPXZh",
:edit/time 1588533932827,
:edit/email "tangj1122@gmail.com"}
{:block/string
"The decay of society is spearheaded by the decline of the village and rise of the nuclear family and existential individual.",
:create/email "tangj1122@gmail.com",
:create/time 1588533948027,
:block/uid "m4tlcc1bk",
:edit/time 1588533989261,
:edit/email "tangj1122@gmail.com"}],
:block/uid "IW9f10FRI",
:edit/time 1588533866772,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1588082424298,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588082522632,
:node/title "A Pattern Language",
:edit/time 1588082522634,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588110648813,
:node/title "DevCards",
:block/children
[{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1588162113851,
:block/uid "QXbCSyXAo",
:edit/time 1588162113851,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1588110648815,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588110835575,
:node/title "re-frame",
:edit/time 1588110835576,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588111014883,
:node/title "fulcro",
:edit/time 1588111014885,
:edit/email "tangj1122@gmail.com"}
{:node/title "April 29th, 2020",
:block/children
[{:block/string
"Continued thoughts on ((zfU95NXld)) from yesterday. #[[DevCards]]",
:create/email "tangj1122@gmail.com",
:create/time 1588160039885,
:block/children
[{:block/string "Positives:",
:create/email "tangj1122@gmail.com",
:create/time 1588161626905,
:block/children
[{:block/string
"Thought about the composition of function components and decoupling `subscribe` from view in order to be framework-agnostic and composable. Unfortunately, \"framework-agnostic\" is somewhat contradictory, as the key difference between frameworks and libraries is that the former is definitionally opinionated while the latter is composable.",
:create/email "tangj1122@gmail.com",
:create/time 1588161671491,
:block/children
[{:block/string "((HNbqluVWA))",
:create/email "tangj1122@gmail.com",
:create/time 1588161828635,
:block/uid "2qyJEoHtO",
:edit/time 1588161829455,
:edit/email "tangj1122@gmail.com"}],
:block/uid "YtIENfHLT",
:edit/time 1588161919508,
:edit/email "tangj1122@gmail.com"}],
:block/uid "Fuvq1sPct",
:edit/time 1588162112548,
:edit/email "tangj1122@gmail.com"}
{:block/string "Negatives:",
:create/email "tangj1122@gmail.com",
:create/time 1588161631391,
:block/children
[{:block/string
"DevCards don't work super well with `re-frame`. ",
:create/email "tangj1122@gmail.com",
:create/time 1588161521825,
:block/uid "i8FCKIeF5",
:edit/time 1588161630094,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Perhaps a premature optimization, as there really aren't that many components.",
:create/email "tangj1122@gmail.com",
:create/time 1588161634655,
:block/uid "zKDDhiCHI",
:edit/time 1588161670277,
:edit/email "tangj1122@gmail.com"}],
:block/uid "BaVNZlWl2",
:edit/time 1588161633624,
:edit/email "tangj1122@gmail.com"}],
:block/uid "xBXPGuzVa",
:edit/time 1588162106384,
:edit/email "tangj1122@gmail.com"}
{:block/string "[[The Mythical Man-Month]]",
:create/email "tangj1122@gmail.com",
:create/time 1588162184948,
:block/uid "D-E6yhiQw",
:edit/time 1588163070206,
:edit/email "tangj1122@gmail.com"}
{:block/string "[[Clojurian]] Slack",
:create/email "tangj1122@gmail.com",
:create/time 1588171104604,
:block/children
[{:block/string
"jeff tang 8:46 AM\nHi, does anyone know how RH/Cognitect/Datomic do product development/management? Reading The Mythical Man-Month right now has me thinking about it :slightly_smiling_face:",
:create/email "tangj1122@gmail.com",
:create/time 1588171171396,
:block/children
[{:block/string "[[Alex Miller]]",
:create/email "tangj1122@gmail.com",
:create/time 1588175095270,
:block/children
[{:block/string
"alexmiller 9:14 AM\nit's not really different than anything else we do. write down your problem as clearly as you can, use tables to investigate alternatives, use pictures to explain designs, etc\n:fire: 1",
:create/email "tangj1122@gmail.com",
:create/time 1588171173115,
:block/uid "kFqrMbju7",
:edit/time 1588171380029,
:edit/email "tangj1122@gmail.com"}
{:block/string
"jeff tang 9:51 AM\nThat makes sense for the design/architecture piece. I’m wondering more about execution specifics: do you make time estimations? how big is a project/task and how many people collaborate on it? perhaps my initial question was too vague. I’m looking for something more in the realm of Agile, XP, and something more concrete than [[hammock-driven development]] :laughing: (edited) \n:hammock: 2",
:create/email "tangj1122@gmail.com",
:create/time 1588171176657,
:block/uid "02pdb_pvP",
:edit/time 1588171363794,
:edit/email "tangj1122@gmail.com"}
{:block/string
"alexmiller 10:01 AM\nI'm probably not the best to comment on the details of this, but I'd say as a general thing, **it's rare for anything to be driven by time estimations**. determining what to work on is a meta version of the process above - what is the most important problem to solve (b/c user needs, market strategy or whatever). come up with a bunch of alternatives for that and examine their tradeoffs, choose a plan, do the work. sometimes that work takes a day, sometimes 3 months.\n:squirrel: 1\n",
:create/email "tangj1122@gmail.com",
:create/time 1588171316314,
:block/uid "YnDoPwTiP",
:edit/time 1588171316314,
:edit/email "tangj1122@gmail.com"}
{:block/string
"**there are only 4 people doing all of the dev on Datomic, Clojure**, etc combined so we are a tiny team of very experienced people using high leverage tools. I'm not sure this is directly relevant to most software teams in general (but Clojure projects do probably tend to be more that, and less big teams)",
:create/email "tangj1122@gmail.com",
:create/time 1588171319980,
:block/uid "zm_Ft2Iim",
:edit/time 1588171339086,
:edit/email "tangj1122@gmail.com"}
{:block/string
"10:10\n**Mythical man month is really from the perspective of someone working on teams of like 50-100 people, which is a totally different world** #[[The Mythical Man-Month]]\n:+1: 1",
:create/email "tangj1122@gmail.com",
:create/time 1588171326084,
:block/uid "1hj4D4YhS",
:edit/time 1588171336983,
:edit/email "tangj1122@gmail.com"}
{:block/string
"alexmiller 10:17 AM\nno matter how big your team is, the important thing is to **connect what people are doing with business value**. as team size gets bigger, you inevitably are going to spend a lot **more time communicating what to do and what has been done, which is inherently less efficient**. So bigger teams need to put in more active effort to optimize that communication flow.\n\n",
:create/email "tangj1122@gmail.com",
:create/time 1588171329108,
:block/uid "2SCz0Ye5S",
:edit/time 1588171329108,
:edit/email "tangj1122@gmail.com"}
{:block/string
"10:20\nTools like Clojure and Datomic are designed to let a small team get higher leverage and **do more with less, both in initial development AND over time as requirements and software changes** (caring about this latter bit is imo something Rich pays way more attention to than most), which lets you stay small and avoid taking the efficiency hit in scaling longer than other tools.",
:create/email "tangj1122@gmail.com",
:create/time 1588171309516,
:block/uid "KJ1BJzw-x",
:edit/time 1588171331991,
:edit/email "tangj1122@gmail.com"}
{:block/string
"10:22\n**when you're at the point of talking in person-months, you've already lost agility** :) #agility\n",
:create/email "tangj1122@gmail.com",
:create/time 1588171288672,
:block/uid "Fdo9F4qU7",
:edit/time 1588175107666,
:edit/email "tangj1122@gmail.com"}],
:block/uid "1Kqbf5igw",
:edit/time 1588175101885,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Someone recommended [[Marty Cagan]]'s top posts",
:create/email "tangj1122@gmail.com",
:create/time 1588175115449,
:block/children
[{:block/string "Behind Every Great Product",
:create/email "tangj1122@gmail.com",
:create/time 1588175139274,
:block/children
[{:block/string
"source:: https://svpg.com/behind-every-great-product/",
:create/email "tangj1122@gmail.com",
:create/time 1588175144418,
:block/uid "9yHJgCxv2",
:edit/time 1588175149302,
:edit/email "tangj1122@gmail.com"}
{:block/string "type:: notes",
:create/email "tangj1122@gmail.com",
:create/time 1588175874860,
:block/uid "TdYz92BWt",
:edit/time 1588175877194,
:edit/email "tangj1122@gmail.com"}
{:block/string "Comments",
:create/email "tangj1122@gmail.com",
:create/time 1588175719006,
:block/children
[{:block/string
"If I had a startup, I would want to minimize ambiguity but maximize autonomy. I would want inner drive, not external pressure. I would want to push people to their limits to do things they never thought they were capable of, while avoiding burnout. How?",
:create/email "tangj1122@gmail.com",
:create/time 1588175799594,
:block/children
[{:block/string "((uuVApeBiA))",
:create/email "tangj1122@gmail.com",
:create/time 1588175720032,
:block/uid "n9ixM6cVW",
:edit/time 1588175730366,
:edit/email "tangj1122@gmail.com"}],
:block/uid "YdDI_dgzL",
:edit/time 1588176011156,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Leadership, [[product management]], and vision-setting is primarily about reality-distortion through the act and art of framing. Narrative and storytelling is an instantiation of framing. Notice how Marty doesn't explain what product management is. Rather, he tells 6 stories, 6 [[Hero's Journey]]s. #[[Reality Distortion Field]] #[[Framing]]",
:create/email "tangj1122@gmail.com",
:create/time 1588176127530,
:block/uid "U-ABobq-F",
:edit/time 1588176324850,
:edit/email "tangj1122@gmail.com"}],
:block/uid "kymv3rGtz",
:edit/time 1588175720035,
:edit/email "tangj1122@gmail.com"}
{:block/string "Contents",
:create/email "tangj1122@gmail.com",
:create/time 1588175713335,
:block/children
[{:block/string
"Normally I do this by explaining the critical responsibilities and the necessary character traits and skills, but in this article I will be taking a very different approach.  I want to instead introduce you to real people.",
:create/email "tangj1122@gmail.com",
:create/time 1588175149731,
:block/children
[{:block/string "WORD FOR MAC – Martina Lauchengco",
:create/email "tangj1122@gmail.com",
:create/time 1588175357442,
:block/children
[{:block/string
"The result was that in a couple of months, they produced a 6.1 release that was sent to every registered user with an apology letter – signed by Martina – along with a discount coupon for future purchases.",
:block/uid "zNxPlH52k",
:edit/time 1588176453869,
:edit/email "tangj1122@gmail.com"}
{:block/string
"The release succeeded in fixing the perception problems, but more importantly, it genuinely made the version dramatically better for the Macintosh – a product the Mac team could actually be proud of, and what the team felt they should have delivered to market in the first place.",
:block/uid "3JOl1rCuA",
:edit/time 1588176453869,
:edit/email "tangj1122@gmail.com"}],
:block/uid "V_BUD0oiR",
:edit/time 1588175368248,
:edit/email "tangj1122@gmail.com"}
{:block/string "NETFLIX – Kate Arnold",
:create/email "tangj1122@gmail.com",
:create/time 1588175368244,
:block/children
[{:block/string
"They knew they needed to somehow get customers to want a blend of expensive and less expensive titles.  Necessity being the mother of invention, this is where the queue, the ratings system, and the recommendation engine all came from.   Those were the technology-powered innovations that enabled the new, much more desirable business model. (a subscription service)",
:create/email "tangj1122@gmail.com",
:create/time 1588176691021,
:block/uid "ueI480hoB",
:edit/time 1588176710861,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Between working with the co-founders on the strategy, validating concepts with the users, assessing the analytics, driving features and functionality with the team, and working with finance on the new business model, marketing on acquisition, and the warehouse on fulfillment, you can imagine the workload Kate faced on a daily basis.",
:create/email "tangj1122@gmail.com",
:create/time 1588176668201,
:block/uid "JTOQF_jHg",
:edit/time 1588176668424,
:edit/email "tangj1122@gmail.com"}
{:block/string
"I would argue that without a Kate driving for the technology-based solutions that could actually power this business, there’s a good chance Netflix as we know it never would have happened.  This was also a great example of a product manager needing to work across the entire company to come up with not just product solutions but business solutions that work.",
:create/email "tangj1122@gmail.com",
:create/time 1588176656257,
:block/uid "wS_DHM4aE",
:edit/time 1588176657721,
:edit/email "tangj1122@gmail.com"}],
:block/uid "KpVa6Z-Vc",
:edit/time 1588175377769,
:edit/email "tangj1122@gmail.com"}
{:block/string "GOOGLE ADWORDS – Jane Manning",
:create/email "tangj1122@gmail.com",
:create/time 1588175377765,
:block/children
[{:block/string
"Sales was nervous that this idea of a self-service advertising platform would diminish the value of what the sales team was trying to sell.",
:block/uid "42TujC75G",
:edit/time 1588176956483,
:edit/email "tangj1122@gmail.com"}
{:block/string
"And the engineers, which had been working so hard to provide highly relevant search results, were undersandably very worried that users would be confused and frustrated by ads getting in the way of their search results.",
:block/uid "g-5QVpfdS",
:edit/time 1588176956483,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Once Jane understood the constraints and concerns she was able to advocate for a solution that she believed would address the issues yet enable countless small businesses to get a much more effective advertising solution.  Jane also was able to persuade one of Google’s earliest and most respected engineers, Georges Harik, of the idea’s potential, and he helped to bring along other engineers.",
:create/email "tangj1122@gmail.com",
:create/time 1588176959335,
:block/uid "cIXA5Tgwz",
:edit/time 1588177022309,
:edit/email "tangj1122@gmail.com"}],
:block/uid "ni8_xNVKU",
:edit/time 1588175387526,
:edit/email "tangj1122@gmail.com"}
{:block/string "BBC MOBILE – Alex Pressland",
:create/email "tangj1122@gmail.com",
:create/time 1588175387521,
:block/uid "PMbSSASZ_",
:edit/time 1588175394685,
:edit/email "tangj1122@gmail.com"}
{:block/string "APPLE ITUNES – Camille Hearst",
:create/email "tangj1122@gmail.com",
:create/time 1588175394681,
:block/uid "6WCPUE_BK",
:edit/time 1588175401180,
:edit/email "tangj1122@gmail.com"}
{:block/string "ADOBE CREATIVE CLOUD – Lea Hickman",
:create/email "tangj1122@gmail.com",
:create/time 1588175401176,
:block/uid "M1sYsUe5b",
:edit/time 1588175406686,
:edit/email "tangj1122@gmail.com"}],
:block/uid "Kcr_7iHDO",
:edit/time 1588175356909,
:edit/email "tangj1122@gmail.com"}
{:block/string "SUMMARY",
:create/email "tangj1122@gmail.com",
:create/time 1588175406683,
:block/children
[{:block/string
"1) Product Management is absolutely distinct from the other disciplines.  It’s **clearly different than the contribution of the designers**, so please let’s stop having all the misguided discussions of overlap between those roles.  It’s also **clearly not a project manager**.  There is some amount of project management inevitably involved just as there is for all leadership positions, but to characterize this as a project manager is to completely miss the essence of the role.  The role I would argue that the product manager is **most similar to is the role of the CEO**.  But with the obvious difference that **unlike the CEO, nobody reports to the product manager**.",
:create/email "tangj1122@gmail.com",
:create/time 1588175423766,
:block/uid "LCLvewJ2t",
:edit/time 1588175544954,
:edit/email "tangj1122@gmail.com"}
{:block/string
"2) Like a CEO, the Product Manager **must deeply understand all aspects of the business**.  The Product Manager **needs to ensure a business outcome, not just ensure a product gets defined**. This requires a good understanding of the many inter-related parts and constraints of the business – **financial, marketing, sales, legal, partnership, service, the customer environment, the technical capabilities, the user’s experience**, and figure out a solution that **works for the customers as well as the business**. But don’t think this means an MBA is required – actually not one of the impressive product managers I described has an MBA – or that you need to have all these skills yourself; you must simply have a broad understanding of how a product can affect a business, and work with people from your team and across your company to cover everything that’s important.",
:block/uid "WWDYR9OIt",
:edit/time 1588175603833,
:edit/email "tangj1122@gmail.com"}
{:block/string
"3) I hoped you noticed that in literally every one of these examples, the **winning solutions didn’t come from users or sales**; rather great products require an **intense collaboration with design and engineering** to solve real problems for our users and customers, in ways that meet the needs of your business.  In each of these examples, the **users had no idea the solution they fell in love with was actually possible.**",
:block/uid "BDHanEimT",
:edit/time 1588175753268,
:edit/email "tangj1122@gmail.com"}
{:block/string
"4) Like a successful CEO, the successful product manager must be the **very best versions of smart, creative and persistent**. By smart I mean using **new technologies** to reach new audiences or enable **new business models**. By creative, I mean thinking **outside the normal product box** of features to solve business problems.  And persistent — as in pushing companies **way beyond their comfort zone **with compelling evidence, constant communication and building bridges across functions in the face of stubborn resistance.  Being a great product manager means having **extraordinary grit.**",
:block/uid "uuVApeBiA",
:edit/time 1588175691297,
:edit/email "tangj1122@gmail.com"}
{:block/string
"5) Finally, I hope you can see that true leadership is a big part of what separates the great product people from the merely good ones. ** So no matter your title or level, if you aspire to be great, don’t be afraid to lead.**",
:block/uid "_nbM7uox1",
:edit/time 1588175708955,
:edit/email "tangj1122@gmail.com"}],
:block/uid "7e7htRScL",
:edit/time 1588175419612,
:edit/email "tangj1122@gmail.com"}],
:block/uid "jLzO1U35F",
:edit/time 1588175714860,
:edit/email "tangj1122@gmail.com"}],
:block/uid "g8nqSPyQr",
:edit/time 1588175143710,
:edit/email "tangj1122@gmail.com"}
{:block/string "Product Fail",
:create/email "tangj1122@gmail.com",
:create/time 1588177041968,
:block/uid "lktOx7T40",
:edit/time 1588177042208,
:edit/email "tangj1122@gmail.com"}
{:block/string "Product Success",
:create/email "tangj1122@gmail.com",
:create/time 1588177043019,
:block/children
[{:block/string "source:: https://svpg.com/product-success/",
:create/email "tangj1122@gmail.com",
:create/time 1588178134409,
:block/uid "WibZkBeEZ",
:edit/time 1588178135768,
:edit/email "tangj1122@gmail.com"}
{:block/string "Contents",
:create/email "tangj1122@gmail.com",
:create/time 1588178126111,
:block/children
[{:block/string
"Just as I described the ten biggest problems in the context of the Waterfall model, I described the ten attributes of successful teams in the context of the [[Continuous Discovery and Delivery]] model (also known as Dual Track Agile, or Discovery Sprints and Delivery Sprints).",
:create/email "tangj1122@gmail.com",
:create/time 1588177207739,
:block/children
[{:block/string "Empowered Product Teams",
:create/email "tangj1122@gmail.com",
:create/time 1588177265744,
:block/children
[{:block/string
"First, it’s essential that the team is durable; the members are not meant to be moved around like chess pieces.  If they want to actually innovate, they need the time to get to know each other, their technology, their customers, and the business context.",
:create/email "tangj1122@gmail.com",
:create/time 1588177311320,
:block/uid "-R4Oglfde",
:edit/time 1588177311835,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Second, the chemistry of the members of the team is key.  This means that the know and respect each other enough that every member of the team feels comfortable contributing and raising suggestions, and challenging themselves and each other to do better.",
:create/email "tangj1122@gmail.com",
:create/time 1588177312609,
:block/uid "2ujSmYx6I",
:edit/time 1588177319532,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Third, this means that teams have the necessary skill-set diversity, which is typically product management, user experience design, and engineering.  In many cases we would add to this list data analysis and user research.",
:block/uid "mMAnFhrfd",
:edit/time 1588177328148,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Finally, despite being a sensitive topic for many companies, it is hard to argue with the advantages of a co-located team.  Co-location means that the product manager, product designer, and the engineers (or at least the tech lead) all sit right next to each other.  We can’t always achieve co-location for all of our teams, but we try.  And just to be clear, having teams in multiple locations is not the issue, it’s when a single team is split up that causes the negative impact to both velocity and especially innovation.",
:block/uid "5ebkjeUJQ",
:edit/time 1588177328148,
:edit/email "tangj1122@gmail.com"}],
:block/uid "Fpxl5UqAB",
:edit/time 1588177295139,
:edit/email "tangj1122@gmail.com"}
{:block/string "Product Vision and Strategy",
:create/email "tangj1122@gmail.com",
:create/time 1588177349398,
:block/children
[{:block/string
"The product vision describes the world we are trying to create, typically somewhere between 2 and 5 years out (longer for hardware efforts).",
:create/email "tangj1122@gmail.com",
:create/time 1588177355270,
:block/uid "kujHkBZij",
:edit/time 1588177370985,
:edit/email "tangj1122@gmail.com"}
{:block/string
"The product vision must be inspiring.  When done well, it is one of our most effective recruiting tools, and motivates people to come to work every day.  Strong technology people are drawn to an inspiring vision.  They want to work on something meaningful.",
:create/email "tangj1122@gmail.com",
:create/time 1588177374866,
:block/uid "IVXBmEUgv",
:edit/time 1588177382929,
:edit/email "tangj1122@gmail.com"}],
:block/uid "USlYhqzH3",
:edit/time 1588177354057,
:edit/email "tangj1122@gmail.com"}
{:block/string "Focus on Business Outcomes",
:create/email "tangj1122@gmail.com",
:create/time 1588177248512,
:block/children
[{:block/string
"The OKR (Objectives and Key Results) system is intended to facilitate precisely this. #[[OKRs]]",
:create/email "tangj1122@gmail.com",
:create/time 1588177430657,
:block/uid "l8OMJ4kbz",
:edit/time 1588177512844,
:edit/email "tangj1122@gmail.com"}
{:block/string
"The two principles that are behind these performance management techniques are: first, **teams will perform better if you give them the problems you need them to solve, rather than give them the solutions**; and second, the team is measured by results, not output.  **Shipping features on a roadmap is output, solving business problems are results**.",
:create/email "tangj1122@gmail.com",
:create/time 1588177470273,
:block/uid "FBm1tNM9j",
:edit/time 1588177510810,
:edit/email "tangj1122@gmail.com"}],
:block/uid "9GEHuoAQ7",
:edit/time 1588177429928,
:edit/email "tangj1122@gmail.com"}
{:block/string "Competent Product Manager",
:create/email "tangj1122@gmail.com",
:create/time 1588177522461,
:block/children
[{:block/string
"Sadly many engineers have never had the opportunity to work with a capable product manager. #[[product management]]",
:create/email "tangj1122@gmail.com",
:create/time 1588177532846,
:block/uid "ikZXf1MQG",
:edit/time 1588177555923,
:edit/email "tangj1122@gmail.com"}
{:block/string
"There are really three options to how teams work.",
:create/email "tangj1122@gmail.com",
:create/time 1588177608285,
:block/children
[{:block/string
"One is that the CEO or some other exec decides everything.",
:create/email "tangj1122@gmail.com",
:create/time 1588177613361,
:block/uid "Nc1WVZr_c",
:edit/time 1588177613361,
:edit/email "tangj1122@gmail.com"}
{:block/string
"The second is that the weak product manager schedules a big meeting and invites all the executives into a room and they argue it out – this is called design by committee – which consistently produces weak results.",
:create/email "tangj1122@gmail.com",
:create/time 1588177616915,
:block/uid "AVO7iCtDx",
:edit/time 1588177616915,
:edit/email "tangj1122@gmail.com"}
{:block/string
"The third is that the product manager does her job and learns these constraints, and brings them to the team so that the team can figure out the best way to solve the problem.",
:create/email "tangj1122@gmail.com",
:create/time 1588177555920,
:block/uid "CcsfymoJk",
:edit/time 1588177616918,
:edit/email "tangj1122@gmail.com"}],
:block/uid "lmn1k-wEd",
:edit/time 1588177608285,
:edit/email "tangj1122@gmail.com"}],
:block/uid "TkzXYE0Y5",
:edit/time 1588177532482,
:edit/email "tangj1122@gmail.com"}
{:block/string "Collaboration-driven Solutions",
:create/email "tangj1122@gmail.com",
:create/time 1588177620845,
:block/children
[{:block/string
"product, design and engineering – truly collaborate to solve the problems. This is because with good solutions, the technology drives the functionality as much as the functionality driving technology.   The technology enables design options as much as design drives technology selection.  And design direction drives functionality as much as the other way around",
:create/email "tangj1122@gmail.com",
:create/time 1588177647109,
:block/uid "Rk3QleTyK",
:edit/time 1588177687052,
:edit/email "tangj1122@gmail.com"}
{:block/string
"The need for these collaboration-driven solutions is the single biggest reason why co-located teams consistently out-perform distributed teams. #[[remote work]]",
:create/email "tangj1122@gmail.com",
:create/time 1588177687835,
:block/uid "4KwcSAsTr",
:edit/time 1588177711844,
:edit/email "tangj1122@gmail.com"}],
:block/uid "hhM3tOrCX",
:edit/time 1588177646557,
:edit/email "tangj1122@gmail.com"}
{:block/string "Product Discovery: Learn Fast #",
:create/email "tangj1122@gmail.com",
:create/time 1588177701479,
:block/children
[{:block/string
"Much of great product boils down to the ability for the team to try out lots of ideas quickly.  We want to quickly separate the good ideas from the bad.  Product discovery is a broad set of techniques intended to help us learn quickly which ideas will fly and which are not so great.  Some ideas are big and some are small.  Some are risky and some are expensive.  Sometimes we need proof, and sometimes we just need evidence.",
:block/uid "EnoKL2DCz",
:edit/time 1588177778387,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Lots of people describe this is different ways.  Some like to describe this as “fake it before you make it” and some like to emphasize the “build things that don’t scale” point.  The key is we need to learn fast and minimize waste.",
:block/uid "Q2NZq1CZX",
:edit/time 1588177778387,
:edit/email "tangj1122@gmail.com"}
{:block/string
"**Using the engineering team to build and release actual products in order to try out an idea is considered the slowest, most expensive way to learn.**",
:block/uid "ooFrCrKBW",
:edit/time 1588177804203,
:edit/email "tangj1122@gmail.com"}],
:block/uid "9bLH6rR_8",
:edit/time 1588177811873,
:edit/email "tangj1122@gmail.com"}
{:block/string "Focus on Key Risks",
:create/email "tangj1122@gmail.com",
:create/time 1588177831830,
:block/children
[{:block/string "four key risks:",
:create/email "tangj1122@gmail.com",
:create/time 1588177896034,
:block/children
[{:block/string
"value risk – would anyone buy this or choose to use it?",
:create/email "tangj1122@gmail.com",
:create/time 1588177899358,
:block/uid "6wJ7CYPrL",
:edit/time 1588177901308,
:edit/email "tangj1122@gmail.com"}
{:block/string
"usability risk – would they be able to figure out how to use it?",
:create/email "tangj1122@gmail.com",
:create/time 1588177910744,
:block/uid "Bim6uTdnl",
:edit/time 1588177910744,
:edit/email "tangj1122@gmail.com"}
{:block/string
"feasibility risk – can our engineers build this with the technology available, the time available, and the skill-sets available on the team?",
:create/email "tangj1122@gmail.com",
:create/time 1588177903689,
:block/uid "yIKE6JliN",
:edit/time 1588177910760,
:edit/email "tangj1122@gmail.com"}
{:block/string
"and stakeholder risk – are the different parts of the company ok with this proposed solution?",
:create/email "tangj1122@gmail.com",
:create/time 1588177883910,
:block/uid "dXnnJDz8l",
:edit/time 1588177903692,
:edit/email "tangj1122@gmail.com"}],
:block/uid "0GpxzrOtt",
:edit/time 1588177896034,
:edit/email "tangj1122@gmail.com"}],
:block/uid "xZ9GlY-_6",
:edit/time 1588177883592,
:edit/email "tangj1122@gmail.com"}
{:block/string "The Role of an MVP",
:create/email "tangj1122@gmail.com",
:create/time 1588177934866,
:block/children
[{:block/string
"The concept of an MVP is one of the most important concepts in product yet it’s also one of the most abused and misunderstood concepts. #[[MVP]]",
:create/email "tangj1122@gmail.com",
:create/time 1588177943030,
:block/uid "DMmhRDWkk",
:edit/time 1588177946498,
:edit/email "tangj1122@gmail.com"}
{:block/string
"It’s always dangerous to generalize, but I’m going to go out on a limb here and argue that **an MVP should never be a product**.  In every single case I have ever encountered, when the team spent the time and the money to build an actual QA’d product as their MVP, I have always been able to show them afterwards how they could have accomplished the same learning at much less cost and waste.",
:create/email "tangj1122@gmail.com",
:create/time 1588177946494,
:block/uid "yId_KpVoP",
:edit/time 1588177989002,
:edit/email "tangj1122@gmail.com"}],
:block/uid "53Q5AISyt",
:edit/time 1588177935065,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Product Delivery: Release with Confidence",
:create/email "tangj1122@gmail.com",
:create/time 1588177990803,
:block/children
[{:block/string
"I’m suggesting here that when it comes to software that your customers are actually depending on to run their business, you should not compromise",
:create/email "tangj1122@gmail.com",
:create/time 1588178075275,
:block/uid "sU0IGzXsK",
:edit/time 1588178075648,
:edit/email "tangj1122@gmail.com"}],
:block/uid "kY9z7N5Vm",
:edit/time 1588178000527,
:edit/email "tangj1122@gmail.com"}
{:block/string "Obsess Over Customers",
:create/email "tangj1122@gmail.com",
:create/time 1588178075829,
:block/children
[{:block/string
"Do team members know customers by name?",
:create/email "tangj1122@gmail.com",
:create/time 1588178113166,
:block/uid "X7RgZ2peo",
:edit/time 1588178113515,
:edit/email "tangj1122@gmail.com"}],
:block/uid "MbyORCFPi",
:edit/time 1588178079930,
:edit/email "tangj1122@gmail.com"}],
:block/uid "pB1aPBeqw",
:edit/time 1588177263987,
:edit/email "tangj1122@gmail.com"}],
:block/uid "2Wguv1Jv0",
:edit/time 1588178127706,
:edit/email "tangj1122@gmail.com"}],
:block/uid "8HyeJV0i3",
:edit/time 1588177207345,
:edit/email "tangj1122@gmail.com"}],
:block/uid "3LTU9GoID",
:edit/time 1588175138848,
:edit/email "tangj1122@gmail.com"}],
:block/uid "fwdVEbDCm",
:edit/time 1588171383584,
:edit/email "tangj1122@gmail.com"}],
:block/uid "k5trmkDlS",
:edit/time 1588175100081,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Getting [[Cursive]] to work with [[ClojureScript]] and [[shadow-cljs]]",
:create/email "tangj1122@gmail.com",
:create/time 1588189066586,
:block/children
[{:block/string "type:: [[documentation]]",
:create/email "tangj1122@gmail.com",
:create/time 1588358812261,
:block/uid "j8u_-G9SJ",
:edit/time 1588358819964,
:edit/email "tangj1122@gmail.com"}
{:block/string
"source:: https://andrearichiardi.com/blog/posts/clojurescript-cursive-shadow-setup.html",
:create/email "tangj1122@gmail.com",
:create/time 1588189093143,
:block/uid "3ZuD0Zj3P",
:edit/time 1588189096842,
:edit/email "tangj1122@gmail.com"}],
:block/uid "GWK_SgktY",
:edit/time 1588189093146,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Move from `cljs-ajax` to `cljs-http` to use [[core.async]] hotness. His example uses [[re-natal]]",
:create/email "tangj1122@gmail.com",
:create/time 1588189096866,
:block/children
[{:block/string
"source:: https://increasinglyfunctional.com/2019/06/25/http-fx-for-re-frame-on-react-native.html",
:create/email "tangj1122@gmail.com",
:create/time 1588197194937,
:block/uid "5w-3_8eRT",
:edit/time 1588197197835,
:edit/email "tangj1122@gmail.com"}],
:block/uid "o1zW9k46f",
:edit/time 1588358838630,
:edit/email "tangj1122@gmail.com"}
{:block/string
"How I setup a file reader in [[re-frame]] (removed these comments from code)",
:create/email "tangj1122@gmail.com",
:create/time 1588197198469,
:block/children
[{:block/string
"https://reactjs.org/docs/uncontrolled-components.html#the-file-input-tag",
:create/email "tangj1122@gmail.com",
:create/time 1588197255043,
:block/uid "Ar8sEpBN5",
:edit/time 1588197255058,
:edit/email "tangj1122@gmail.com"}
{:block/string
"https://codepen.io/tangsauce/pen/pojyOyV?editors=0010",
:create/email "tangj1122@gmail.com",
:create/time 1588197255043,
:block/uid "vTJOjgKnF",
:edit/time 1588197255059,
:edit/email "tangj1122@gmail.com"}
{:block/string
"https://github.com/reagent-project/reagent/blob/master/doc/FAQ/UsingRefs.md",
:create/email "tangj1122@gmail.com",
:create/time 1588197255043,
:block/uid "QfNz6iKLd",
:edit/time 1588197255059,
:edit/email "tangj1122@gmail.com"}
{:block/string
"https://developer.mozilla.org/en-US/docs/Web/API/File/Using_files_from_web_applications",
:create/email "tangj1122@gmail.com",
:create/time 1588197255043,
:block/uid "RxmRTdf4w",
:edit/time 1588197255059,
:edit/email "tangj1122@gmail.com"}],
:block/uid "jo_ufm_9L",
:edit/time 1588199878202,
:edit/email "tangj1122@gmail.com"}
{:block/string "[[Athens Change Log]]",
:create/email "tangj1122@gmail.com",
:create/time 1588199848013,
:block/children
[{:block/string
"Now when you upload a different JSON, the table of links will update as well.",
:create/email "tangj1122@gmail.com",
:create/time 1588199851300,
:block/uid "ZUO_odPP9",
:edit/time 1588199870615,
:edit/email "tangj1122@gmail.com"}],
:block/uid "gKsuLXseW",
:edit/time 1588199851304,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1588111200096,
:edit/email "eloi.poch@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588163070208,
:node/title "The Mythical Man-Month",
:block/children
[{:block/string "type:: [[book]]",
:create/email "tangj1122@gmail.com",
:create/time 1588163072243,
:block/uid "PEXblRqOh",
:edit/time 1588163081597,
:edit/email "tangj1122@gmail.com"}
{:block/string "Quotes from Goodreads",
:create/email "tangj1122@gmail.com",
:create/time 1588163081746,
:block/children
[{:block/string
"“As time passes, the system becomes less and less well-ordered. Sooner or later the fixing cease to gain any ground. Each forward step is matched by a backward one. Although in principle usable forever, the system has worn out as a base for progress. ...A brand-new, from-the-ground-up redesign is necessary.” [[complexity]]",
:create/email "tangj1122@gmail.com",
:create/time 1588163085967,
:block/uid "moBrkdY0q",
:edit/time 1588163444402,
:edit/email "tangj1122@gmail.com"}
{:block/string
"“Adding manpower to a late software project, makes it later.”",
:create/email "tangj1122@gmail.com",
:create/time 1588163159185,
:block/uid "KixBD8CkR",
:edit/time 1588163214636,
:edit/email "tangj1122@gmail.com"}
{:block/string
"“Systems program building is an **entropy-decreasing process, hence inherently metastable**. Program maintenance is an **entropy-increasing** process, and even its most skillful execution only delays the subsidence of the system into unfixable obsolescence.”",
:create/email "tangj1122@gmail.com",
:create/time 1588163214631,
:block/uid "skjcGSFkD",
:edit/time 1588163434946,
:edit/email "tangj1122@gmail.com"}
{:block/string
"“A baseball manager recognizes a nonphysical talent, [[hustle]], as an essential gift of great players and great teams. It is the characteristic of running faster than necessary, moving sooner than necessary, trying harder than necessary. It is essential for great programming teams, too.”",
:create/email "tangj1122@gmail.com",
:create/time 1588163236282,
:block/uid "2sYlgiSxF",
:edit/time 1588163421368,
:edit/email "tangj1122@gmail.com"}
{:block/string
"“The general tendency is to **over-design the second system**, using all the ideas and frills that were cautiously sidetracked on the first one.”",
:create/email "tangj1122@gmail.com",
:create/time 1588163217603,
:block/uid "9AKDaicyU",
:edit/time 1588163399310,
:edit/email "tangj1122@gmail.com"}
{:block/string
"“The programmer, like the poet, works **only slightly removed from pure thought-stuff**. He builds his castles in the air, from air, creating by exertion of the imagination.”",
:create/email "tangj1122@gmail.com",
:create/time 1588163238279,
:block/uid "wzeXtx_fP",
:edit/time 1588163395460,
:edit/email "tangj1122@gmail.com"}
{:block/string
"“The management question, therefore, is not whether to build a pilot system and throw it away. You will do that. The only question is whether to plan in advance to build a throwaway, or to promise to deliver the throwaway to customers.”",
:create/email "tangj1122@gmail.com",
:create/time 1588163252668,
:block/uid "oDS0gs7Cr",
:edit/time 1588163263663,
:edit/email "tangj1122@gmail.com"}
{:block/string
"“For the human makers of things, the **incompletenesses and inconsistencies of our ideas become clear only during implementation**.”",
:create/email "tangj1122@gmail.com",
:create/time 1588163263658,
:block/uid "JXI-NAvKT",
:edit/time 1588163384596,
:edit/email "tangj1122@gmail.com"}
{:block/string
"“The challenge and the mission are to find real solutions to real problems on actual schedules with available resources.”",
:create/email "tangj1122@gmail.com",
:create/time 1588163299572,
:block/uid "VWeoBVkqR",
:edit/time 1588163313008,
:edit/email "tangj1122@gmail.com"}
{:block/string
"“Today I am more convinced than ever. Conceptual integrity is central to product quality. Having a system architect is the most important single step toward conceptual integrity. These principles are by no means limited to software systems, but to the design of any complex construct, whether a computer, an airplane, a Strategic Defense Initiative, a Global Positioning System. After teaching a software engineering laboratory more than 20 times, I came to insist that student **teams as small as four people choose a manager and a separate architect**. Defining distinct roles in such small teams may be a little extreme, but I have observed it to work well and to contribute to design success even for small teams.”",
:create/email "tangj1122@gmail.com",
:create/time 1588163313002,
:block/uid "aM8xnKtxC",
:edit/time 1588163375615,
:edit/email "tangj1122@gmail.com"}
{:block/string
"“An omelette, promised in two minutes, may appear to be progressing nicely. But when it has not set in two minutes, the customer has two choices—wait or eat it raw. Software customers have had the same choices. The cook has another choice; he can turn up the heat. The result is often an omelette nothing can save—burned in one part, raw in another.”",
:create/email "tangj1122@gmail.com",
:create/time 1588163367497,
:block/uid "LK9A3yHVw",
:edit/time 1588163600618,
:edit/email "tangj1122@gmail.com"}
{:block/string
"“Study after study shows that the very **best designers produce structures that are faster, smaller, simpler, cleaner, and produced with less effort**. The differences between the great and the average approach an order of magnitude.”",
:create/email "tangj1122@gmail.com",
:create/time 1588163600611,
:block/uid "V9NE8rGj-",
:edit/time 1588163613769,
:edit/email "tangj1122@gmail.com"}
{:block/string
"“Organizations which design systems are constrained to produce systems which are copies of the communication structures of these organizations.” #[[Conway's Law]]",
:create/email "tangj1122@gmail.com",
:create/time 1588163607909,
:block/uid "XughOl7ty",
:edit/time 1588163646456,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1588163646451,
:block/uid "9h5FW2hhW",
:edit/time 1588163646451,
:edit/email "tangj1122@gmail.com"}],
:block/uid "ZqbSBICDR",
:edit/time 1588170137248,
:edit/email "tangj1122@gmail.com"}
{:block/string "Comments",
:create/email "tangj1122@gmail.com",
:create/time 1588172533624,
:block/children
[{:block/string
"Progress is invariant with respect to time. #[[Wardley Mapping]]",
:create/email "tangj1122@gmail.com",
:create/time 1588172543592,
:block/children
[{:block/string "((snIQBANH8))",
:create/email "tangj1122@gmail.com",
:create/time 1588172534633,
:block/uid "ufZbg02lr",
:edit/time 1588172543595,
:edit/email "tangj1122@gmail.com"}],
:block/uid "A6yl0JZrU",
:edit/time 1588172571747,
:edit/email "tangj1122@gmail.com"}
{:block/string
"If you add communication costs progress is even worse slower.",
:create/email "tangj1122@gmail.com",
:create/time 1588172692202,
:block/children
[{:block/string "Communication of training: unpartitionable",
:create/email "tangj1122@gmail.com",
:create/time 1588172778308,
:block/uid "BrSJEWNhh",
:edit/time 1588172793264,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Intercommunication, if pairwise, grows exponentially: `n(n-1)/2`",
:create/email "tangj1122@gmail.com",
:create/time 1588172793260,
:block/uid "o1egDSidV",
:edit/time 1588172840742,
:edit/email "tangj1122@gmail.com"}],
:block/uid "qiZiJHVOB",
:edit/time 1588172778312,
:edit/email "tangj1122@gmail.com"}
{:block/string
"You should twice as much time on planning and design than coding. You should spend thrice as much time on testing (unit + e2e) than coding.",
:create/email "tangj1122@gmail.com",
:create/time 1588173041165,
:block/children
[{:block/string "{{embed: ((EZ8Z93GvQ))}}",
:create/email "tangj1122@gmail.com",
:create/time 1588173067591,
:block/uid "8C73g2Jz7",
:edit/time 1588173070937,
:edit/email "tangj1122@gmail.com"}],
:block/uid "yTTDTwsVT",
:edit/time 1588173629812,
:edit/email "tangj1122@gmail.com"}
{:block/string
"{{[[TODO]]}} Experiment with trying to quantify developer productivity [Evidence Based Scheduling](https://www.joelonsoftware.com/2007/10/26/evidence-based-scheduling/)",
:create/email "tangj1122@gmail.com",
:create/time 1588173717091,
:block/children
[{:block/string "{{embed: ((_RDpHd07Q))}}",
:create/email "tangj1122@gmail.com",
:create/time 1588173724481,
:block/uid "HkT6xoiUj",
:edit/time 1588173727270,
:edit/email "tangj1122@gmail.com"}],
:block/uid "7D0DdxxhX",
:edit/time 1588173779739,
:edit/email "tangj1122@gmail.com"}
{:block/string "gas: ((5hV1tRJDr))",
:create/email "tangj1122@gmail.com",
:create/time 1588174024111,
:block/uid "eL9Y9BNn7",
:edit/time 1588208204340,
:edit/email "tangj1122@gmail.com"}
{:block/string
"But how does this change when it comes to open-source?",
:create/email "tangj1122@gmail.com",
:create/time 1588208526720,
:block/children
[{:block/string "((6fMRy1QqR))",
:create/email "tangj1122@gmail.com",
:create/time 1588208547425,
:block/uid "MlnMBLEil",
:edit/time 1588208548379,
:edit/email "tangj1122@gmail.com"}],
:block/uid "fx_8C0_02",
:edit/time 1588208547439,
:edit/email "tangj1122@gmail.com"}],
:block/uid "tHNgFSjyW",
:edit/time 1588172534637,
:edit/email "tangj1122@gmail.com"}
{:block/string "Contents",
:create/email "tangj1122@gmail.com",
:create/time 1588170140224,
:block/children
[{:block/string "The Tar Pit",
:create/email "tangj1122@gmail.com",
:create/time 1588170144782,
:block/children
[{:block/string "The Programming Systems Product",
:create/email "tangj1122@gmail.com",
:create/time 1588170579508,
:block/children
[{:block/string
"![](https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2FkjofC7HU5-?alt=media&token=8322d870-47f3-4ecf-882c-6097b0ac3659)",
:block/props
{"image-size"
{"https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2FkjofC7HU5-?alt=media&token=8322d870-47f3-4ecf-882c-6097b0ac3659"
{"width" 315, "height" nil}}},
:block/uid "vohb1MzW4",
:edit/time 1588170628500,
:edit/email "tangj1122@gmail.com"}
{:block/string "a program.",
:create/email "tangj1122@gmail.com",
:create/time 1588170616383,
:block/children
[{:block/string
"It is complete in itself, ready to be run by the author on the system on which it was developed. That is the thing commonly produced in garages, and that is the object the individual programmer uses in estimating productivity.",
:create/email "tangj1122@gmail.com",
:create/time 1588170419432,
:block/uid "-XS4dPcCF",
:edit/time 1588170446674,
:edit/email "tangj1122@gmail.com"}],
:block/uid "ClF9RT268",
:edit/time 1588170621167,
:edit/email "tangj1122@gmail.com"}
{:block/string "a programming product. ",
:create/email "tangj1122@gmail.com",
:create/time 1588170473183,
:block/children
[{:block/string
"This is a program that can be run, tested, repaired, and extended by anybody. It is usable in many operating environments, for many sets of data.",
:create/email "tangj1122@gmail.com",
:create/time 1588170468322,
:block/uid "j3FOoAqJ-",
:edit/time 1588170473188,
:edit/email "tangj1122@gmail.com"}],
:block/uid "gZp_u9eEh",
:edit/time 1588170473183,
:edit/email "tangj1122@gmail.com"}
{:block/string "a programming system. ",
:create/email "tangj1122@gmail.com",
:create/time 1588170490543,
:block/children
[{:block/string
"This is a collection of interacting programs, coordinated in function and disciplined in format, so that the assemblage constitutes an entire facility for large tasks.",
:create/email "tangj1122@gmail.com",
:create/time 1588170487594,
:block/uid "FuKHjjDQW",
:edit/time 1588170490547,
:edit/email "tangj1122@gmail.com"}],
:block/uid "Vmqj3S5WC",
:edit/time 1588170490543,
:edit/email "tangj1122@gmail.com"}
{:block/string "programming systems product.",
:create/email "tangj1122@gmail.com",
:create/time 1588170533362,
:block/children
[{:block/string
"This differs from the simple program in all of the above ways. It costs nine times as much. But it is the truly useful object, the intended product of most system programming efforts.",
:create/email "tangj1122@gmail.com",
:create/time 1588170499181,
:block/uid "2JM5Qts9g",
:edit/time 1588170538092,
:edit/email "tangj1122@gmail.com"}],
:block/uid "e7eO0tWrY",
:edit/time 1588170533362,
:edit/email "tangj1122@gmail.com"}],
:block/uid "vGWOdYEvh",
:edit/time 1588170584415,
:edit/email "tangj1122@gmail.com"}
{:block/string "The Joys of the Craft",
:create/email "tangj1122@gmail.com",
:create/time 1588170592983,
:block/children
[{:block/string
"First is the sheer joy of making things. As the child delights in his mud pie, so the adult enjoys building things, especially things of his own design. I think this delight must be **an image of God's delight in making things**, a delight shown in the distinctness and newness of **each leaf and each snowflake**.",
:create/email "tangj1122@gmail.com",
:create/time 1588170604416,
:block/uid "WHcEJW_-r",
:edit/time 1588170665158,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Second is the pleasure of making things that are useful to other people. **Deep within, we want others to use our work and to find it helpful**. In this respect the programming system is not essentially different from the child's first clay pencil holder \"for Daddy's office.\"",
:create/email "tangj1122@gmail.com",
:create/time 1588170647689,
:block/uid "ycYxYPqYC",
:edit/time 1588170678390,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Third is the fascination of fashioning **complex puzzle-like objects of interlocking moving parts** and watching them work in subtle cycles, playing out the consequences of principles built in from the beginning. The programmed computer has all the fascination of the pinball machine or the jukebox mechanism, carried to the ultimate.",
:create/email "tangj1122@gmail.com",
:create/time 1588170678385,
:block/uid "XuDjjh_So",
:edit/time 1588170707436,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Fourth is the joy of **always learning**, which springs from the nonrepeating nature of the task. In one way or another the problem is ever new, and its solver learns something: **sometimes practical, sometimes theoretical, and sometimes both.**",
:create/email "tangj1122@gmail.com",
:create/time 1588170709026,
:block/uid "89LFXDPWO",
:edit/time 1588170721019,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Finally, there is the **delight** of working in such a tractable medium. **The programmer, like the poet, works only slightly removed from pure thought-stuff**. He builds his castles in the air, from air, creating by exertion of the imagination. Few media of creation are so flexible, so easy to polish and rework, so readily capable of realizing grand conceptual structures. (As we shall see later, this very tractability has its own problems.) Yet the program construct, unlike the poet's words, is real in the sense that it moves and works, producing visible outputs separate from the construct itself. It prints results, draws pictures, produces sounds, moves arms. The magic of myth and legend has come true in our time. One types the correct incantation on a keyboard, and a display screen comes to life, showing things that never were nor could be.",
:create/email "tangj1122@gmail.com",
:create/time 1588170722508,
:block/uid "lNghZNpUn",
:edit/time 1588170760469,
:edit/email "tangj1122@gmail.com"}],
:block/uid "TuNLK46uJ",
:edit/time 1588170604052,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Programming then is fun because it gratifies creative longings built deep within us and delights sensibilities we have in common with all men. #[[programming]]",
:create/email "tangj1122@gmail.com",
:create/time 1588170757896,
:block/uid "u3IMYaH6i",
:edit/time 1588170805039,
:edit/email "tangj1122@gmail.com"}
{:block/string "The Woes of the Craft",
:create/email "tangj1122@gmail.com",
:create/time 1588170811321,
:block/children
[{:block/string
"First, one must perform perfectly. The computer resembles the magic of legend in this respect, too. If one character, one pause, of the incantation is not strictly in proper form, the magic doesn't work. Human beings are not accustomed to being perfect",
:create/email "tangj1122@gmail.com",
:create/time 1588170814790,
:block/uid "GAT9OeEXn",
:edit/time 1588170879859,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Next, other people set one's objectives, provide one's resources, and furnish one's information. One rarely controls the circumstances of his work, or even its goal",
:create/email "tangj1122@gmail.com",
:create/time 1588170881078,
:block/uid "HP6KpTpDt",
:edit/time 1588170918991,
:edit/email "tangj1122@gmail.com"}
{:block/string
"He depends upon other people's programs. These are often maldesigned, poorly implemented, incompletely delivered (no source code or test cases), and **poorly documented**",
:create/email "tangj1122@gmail.com",
:create/time 1588170925387,
:block/uid "MfwdJFQzZ",
:edit/time 1588170944390,
:edit/email "tangj1122@gmail.com"}
{:block/string
"The next woe is that designing grand concepts is fun; finding nitty little bugs is just work. With any creative activity come **dreary hours of tedious, painstaking labor**, and programming is no exception.",
:create/email "tangj1122@gmail.com",
:create/time 1588170946425,
:block/uid "j1BKXPn5w",
:edit/time 1588171003728,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Next, one finds that debugging has a linear convergence, or worse, where one somehow expects a quadratic sort of approach to the end. So testing drags on and on, **the last difficult bugs taking more time to find than the first.**",
:create/email "tangj1122@gmail.com",
:create/time 1588170977562,
:block/uid "ubM2XNtxV",
:edit/time 1588170985560,
:edit/email "tangj1122@gmail.com"}
{:block/string
"The last woe, and sometimes the last straw, is that the product over which one has labored so long appears to be **obsolete upon (or before) completion**. Already colleagues and competitors are in hot pursuit of new and better ideas. Already the displacement of one's thought-child is not only conceived, but scheduled.",
:create/email "tangj1122@gmail.com",
:create/time 1588170972524,
:block/uid "WZ5ijhOjS",
:edit/time 1588170989810,
:edit/email "tangj1122@gmail.com"}],
:block/uid "1FlK37k4j",
:edit/time 1588170814793,
:edit/email "tangj1122@gmail.com"}],
:block/uid "wenLgD-zD",
:edit/time 1588170168186,
:edit/email "tangj1122@gmail.com"}
{:block/string "The Mythical Man-Month",
:create/email "tangj1122@gmail.com",
:create/time 1588170171846,
:block/children
[{:block/string
"Good cooking takes time. If you are made to wait, it is to serve you better, and to please you. - MENU OF RESTAURANT ANTOINE. NEW ORLEANS",
:create/email "tangj1122@gmail.com",
:create/time 1588171682821,
:block/uid "sM-ZDb63t",
:edit/time 1588171694303,
:edit/email "tangj1122@gmail.com"}
{:block/string
"More software projects have gone awry for lack of calendar time than for all other causes combined. Why is this cause of disaster so common?",
:block/children
[{:block/string
"First, our techniques of estimating are poorly developed. More seriously, they reflect an **unvoiced assumption which is quite untrue, i.e., that all will go well.**",
:block/children
[{:block/string
"The pervasiveness of optimism among programmers deserves more than a flip analysis. Dorothy Sayers, in her excellent book, __The Mind of the Maker,__ **divides creative activity into three stages: the idea, the implementation, and the interaction**. A book, then, or a computer, or a program comes into existence first as an ideal construct, built **outside time and space, but complete in the mind of the author**. It is realized in time and space, by pen, ink, and paper, or by wire, silicon, and ferrite. The creation is complete when someone reads the book, uses the computer, or runs the program, thereby interacting with the mind of the maker.",
:create/email "tangj1122@gmail.com",
:create/time 1588172091799,
:block/uid "Gp7gEi_Yp",
:edit/time 1588172197521,
:edit/email "tangj1122@gmail.com"}
{:block/string
"For the human makers of things, **the incompletenesses and inconsistencies of our ideas become clear only during implementation**. Thus it is that writing, experimentation, \"working out\" are essential disciplines for the theoretician. #[[REPL]] #[[uncertainty]]",
:create/email "tangj1122@gmail.com",
:create/time 1588172097020,
:block/uid "MDiU825L4",
:edit/time 1588172228449,
:edit/email "tangj1122@gmail.com"}
{:block/string
"In a single task, the assumption that all will go well has a probabilistic effect on the schedule. It might indeed go as planned, for there is a probability distribution for the delay that will be encountered, and \"no delay\" has a finite probability. A large programming effort, however, consists of many tasks, some **chained end-to-end**. The probability that each will go well becomes vanishingly small. #[[The Goal]]",
:create/email "tangj1122@gmail.com",
:create/time 1588172275017,
:block/uid "ikFHgUF8p",
:edit/time 1588172343905,
:edit/email "tangj1122@gmail.com"}],
:block/uid "0u8P4OV-Z",
:edit/time 1588171775585,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Second, our estimating techniques **fallaciously confuse effort with progress**, hiding the assumption that **men and months are interchangeable.**",
:block/children
[{:block/string
"Cost does indeed vary as the product of the number of men and the number of months. Progress does not. Hence the man-month as a unit for measuring the size of a job is a dangerous and deceptive myth. It implies that men and months are interchangeable. #[[The Mythical Man-Month]]",
:create/email "tangj1122@gmail.com",
:create/time 1588172508720,
:block/uid "snIQBANH8",
:edit/time 1588172528892,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Men and months are interchangeable commodities only when a task can be partitioned among many workers __with no communication among them__ (Fig. 2.1). This is true of reaping wheat or picking cotton; it is not even approximately true of systems programming.",
:create/email "tangj1122@gmail.com",
:create/time 1588172586204,
:block/children
[{:block/string
"![](https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2FO3GuvAyV2f?alt=media&token=47505a81-d9e1-47b6-9903-2f377073edd1)",
:block/uid "ToJDUNb8J",
:edit/time 1588172617669,
:edit/email "tangj1122@gmail.com"}
{:block/string
"![](https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2F8ul6aIdl4R?alt=media&token=80e41e08-2ebe-48c2-91a0-8a813646f44b)",
:block/uid "MoSPWjovn",
:edit/time 1588172633617,
:edit/email "tangj1122@gmail.com"}
{:block/string
"![](https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2FKMzQ7SxMjw?alt=media&token=7bc8b3e3-43d0-434b-a4df-3f3fab0f31b5)",
:block/uid "LZY2M32dv",
:edit/time 1588172674564,
:edit/email "tangj1122@gmail.com"}
{:block/string
"![](https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2FWYGHt5zr99?alt=media&token=830d6e2c-78c8-4299-bebf-9c076874cae7)",
:block/uid "7S7mXkZ2p",
:edit/time 1588172873173,
:edit/email "tangj1122@gmail.com"}],
:block/uid "a16jzAfth",
:edit/time 1588172587341,
:edit/email "tangj1122@gmail.com"}],
:block/uid "1mhJEe1Zy",
:edit/time 1588171789842,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Third, because we are uncertain of our estimates, software managers often lack the courteous stubbornness of Antoine's chef.",
:block/uid "92YqQKPgp",
:edit/time 1588171753592,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Fourth, schedule progress is poorly monitored. Techniques proven and routine in **other engineering disciplines** are considered radical innovations in software engineering.",
:block/uid "24AsgsAqj",
:edit/time 1588171809894,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Fifth, when schedule slippage is recognized, the natural (and traditional) response is to add manpower. Like dousing a fire with gasoline, **this makes matters worse, much worse**. More fire requires more gasoline, and thus begins a regenerative cycle which ends in disaster.",
:block/uid "6gvvUNen5",
:edit/time 1588171835604,
:edit/email "tangj1122@gmail.com"}],
:block/uid "RmUw0HQIg",
:edit/time 1588171753592,
:edit/email "tangj1122@gmail.com"}
{:block/string "Systems Test",
:create/email "tangj1122@gmail.com",
:create/time 1588172945112,
:block/children
[{:block/string
"Because of optimism, we usually expect the number of bugs to be smaller than it turns out to be. Therefore **testing is usually the most mis-scheduled part of programming.**",
:create/email "tangj1122@gmail.com",
:create/time 1588172947609,
:block/uid "qP-dORQoj",
:edit/time 1588172954377,
:edit/email "tangj1122@gmail.com"}
{:block/string
"For some years I have been successfully using the following rule of thumb for scheduling a software task:",
:block/children
[{:block/string "**1/3 planning**",
:block/uid "Esp8xVrGm",
:edit/time 1588173013324,
:edit/email "tangj1122@gmail.com"}
{:block/string "**1/6 coding**",
:block/uid "G7GXqYAN2",
:edit/time 1588172999392,
:edit/email "tangj1122@gmail.com"}
{:block/string "1/4 component test and early system test",
:block/uid "_avmqxf6z",
:edit/time 1588172987695,
:edit/email "tangj1122@gmail.com"}
{:block/string "1/4 system test, all components in hand.",
:block/uid "nIF9xSliZ",
:edit/time 1588172989266,
:edit/email "tangj1122@gmail.com"}],
:block/uid "EZ8Z93GvQ",
:edit/time 1588172969699,
:edit/email "tangj1122@gmail.com"}
{:block/string
"This differs from conventional scheduling in several important ways:",
:block/children
[{:block/string
"The fraction devoted to planning is larger than normal. Even so, it is barely enough to produce a detailed and solid specification, and not enough to include research or exploration of totally new techniques.",
:block/uid "4ri22HF2j",
:edit/time 1588172967347,
:edit/email "tangj1122@gmail.com"}
{:block/string
"The __half__ of the schedule devoted to debugging of completed code is much larger than normal.",
:block/uid "LagPsgplt",
:edit/time 1588172967347,
:edit/email "tangj1122@gmail.com"}
{:block/string
"The part that is easy to estimate, i.e., coding, is given only one-sixth of the schedule.",
:block/uid "wV4OezmSS",
:edit/time 1588172967347,
:edit/email "tangj1122@gmail.com"}],
:block/uid "d4_LAxQSC",
:edit/time 1588172977438,
:edit/email "tangj1122@gmail.com"}],
:block/uid "KoA9-Xndp",
:edit/time 1588172947613,
:edit/email "tangj1122@gmail.com"}
{:block/string "Gutless Estimating",
:create/email "tangj1122@gmail.com",
:create/time 1588173660944,
:block/children
[{:block/string
"It is very difficult to make a vigorous, plausible, and job-risking defense of an estimate that is derived by **no quantitative method**, supported by little data, and certified chiefly by the hunches of the managers.",
:block/uid "_z2CnIoUE",
:edit/time 1588173706030,
:edit/email "tangj1122@gmail.com"}
{:block/string
"We need to develop and publicize productivity figures, bug-incidence figures, estimating rules, and so on.",
:block/uid "KRV2G1P2g",
:edit/time 1588173708745,
:edit/email "tangj1122@gmail.com"}],
:block/uid "_RDpHd07Q",
:edit/time 1588173663028,
:edit/email "tangj1122@gmail.com"}
{:block/string "Regenerative Scheduling Disaster",
:create/email "tangj1122@gmail.com",
:create/time 1588173954603,
:block/children
[{:block/string
"Adding manpower to a late software project makes it later. #[[Brooks's Law]] #[[The Mythical Man-Month]]",
:block/uid "8GiO3ajM4",
:edit/time 1588173996846,
:edit/email "tangj1122@gmail.com"}
{:block/string
"This then is the demythologizing of the man-month. The number of months of a project depends upon its sequential constraints.",
:create/email "tangj1122@gmail.com",
:create/time 1588174013324,
:block/uid "94JfPE_BE",
:edit/time 1588174013324,
:edit/email "tangj1122@gmail.com"}
{:block/string
"**The maximum number of men depends upon the number of independent subtasks.**",
:block/uid "5hV1tRJDr",
:edit/time 1588174014758,
:edit/email "tangj1122@gmail.com"}],
:block/uid "SqdbGRVTC",
:edit/time 1588173961007,
:edit/email "tangj1122@gmail.com"}],
:block/uid "qnesiMLqd",
:edit/time 1588170175049,
:edit/email "tangj1122@gmail.com"}
{:block/string "The Surgical Team",
:create/email "tangj1122@gmail.com",
:create/time 1588170175045,
:block/children
[{:block/string
"These studies revealed large individual differences between high and low performers, often by an order of magnitude. - SACKMAN. ERIKSON. AND GRANT1 ",
:create/email "tangj1122@gmail.com",
:create/time 1588174057742,
:block/uid "AidkbhDtX",
:edit/time 1588208391408,
:edit/email "tangj1122@gmail.com"}
{:block/string
"In short the $20,000/year programmer may well be 10 times as productive as the $10,000/year one.",
:create/email "tangj1122@gmail.com",
:create/time 1588208397406,
:block/uid "XeUFDgqvB",
:edit/time 1588208470309,
:edit/email "tangj1122@gmail.com"}
{:block/string
"the sheer number of minds to be coordinated affects the cost of the effort, for a major part of the cost is communication and correcting the ill effects of miscom-munication (system debugging). This, too**, suggests that one wants the system to be built by as few minds as possible.**",
:create/email "tangj1122@gmail.com",
:create/time 1588208515602,
:block/uid "6fMRy1QqR",
:edit/time 1588208520721,
:edit/email "tangj1122@gmail.com"}
{:block/string
"For efficiency and conceptual integrity, one prefers a few good minds doing design and construction. Yet for large systems one wants a way to bring considerable manpower to bear, so that the product can make a timely appearance. How can these two needs be reconciled?",
:create/email "tangj1122@gmail.com",
:create/time 1588208711228,
:block/uid "RDjHUs1B_",
:edit/time 1588208711542,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Absolutely vital to Mills's concept is the transformation of programming \"from private art to public practice\" by making __all__ the computer runs visible to all team members and identifying all programs and data as team property, not private property.",
:create/email "tangj1122@gmail.com",
:create/time 1588208931678,
:block/uid "_wDGHwdNk",
:edit/time 1588208937471,
:edit/email "tangj1122@gmail.com"}
{:block/string
"[[Mills's Proposal]]: each segment of a large job be tackled by a team, but that the team be organized like a **surgical team rather than a hog-butchering team**. That is, instead of each member cutting away on the problem, one does the cutting and the others give him every support that will enhance his effectiveness and productivity.",
:create/email "tangj1122@gmail.com",
:create/time 1588208712069,
:block/children
[{:block/string "surgeon = chief programmer",
:create/email "tangj1122@gmail.com",
:create/time 1588208779737,
:block/children
[{:block/string "+10 yrs experience",
:create/email "tangj1122@gmail.com",
:create/time 1588208821496,
:block/uid "X38Q38FSl",
:edit/time 1588208826920,
:edit/email "tangj1122@gmail.com"}],
:block/uid "5e-4GdSR7",
:edit/time 1588208794282,
:edit/email "tangj1122@gmail.com"}
{:block/string "copilot = alter ego of surgeon",
:create/email "tangj1122@gmail.com",
:create/time 1588208806796,
:block/children
[{:block/string "slightly worse version of surgeon",
:create/email "tangj1122@gmail.com",
:create/time 1588208827622,
:block/uid "ZXIkjSXpr",
:edit/time 1588208833501,
:edit/email "tangj1122@gmail.com"}
{:block/string "liason to rest of team",
:create/email "tangj1122@gmail.com",
:create/time 1588208842699,
:block/uid "NISaMmc7C",
:edit/time 1588208848059,
:edit/email "tangj1122@gmail.com"}
{:block/string "insurance if surgeon dies",
:create/email "tangj1122@gmail.com",
:create/time 1588208851480,
:block/uid "L8QzpQEYs",
:edit/time 1588208858768,
:edit/email "tangj1122@gmail.com"}],
:block/uid "_6Nn83lIK",
:edit/time 1588208818069,
:edit/email "tangj1122@gmail.com"}
{:block/string "administrator",
:create/email "tangj1122@gmail.com",
:create/time 1588208861747,
:block/uid "cpk7sG7fj",
:edit/time 1588208865991,
:edit/email "tangj1122@gmail.com"}
{:block/string "editor",
:create/email "tangj1122@gmail.com",
:create/time 1588208865985,
:block/children
[{:block/string "documentation",
:create/email "tangj1122@gmail.com",
:create/time 1588208882770,
:block/uid "62UZp-III",
:edit/time 1588208890994,
:edit/email "tangj1122@gmail.com"}],
:block/uid "tPx_6tuND",
:edit/time 1588208882774,
:edit/email "tangj1122@gmail.com"}
{:block/string
"The program clerk. He is responsible for maintaining all the technical records of the team in a programming-product library. The clerk is trained as a secretary and has responsibility for both machine-readable and human-readable files.",
:create/email "tangj1122@gmail.com",
:create/time 1588208915835,
:block/uid "lt59r6D8j",
:edit/time 1588208927323,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Two secretaries. The administrator and the editor will each need a secretary; the administrator's secretary will handle project correspondence and non-product files.",
:create/email "tangj1122@gmail.com",
:create/time 1588208900394,
:block/uid "X_U7m4kEx",
:edit/time 1588208910982,
:edit/email "tangj1122@gmail.com"}
{:block/string
"toolsmith, responsible for ensuring this adequacy of the basic service and for constructing, maintaining, and upgrading special tools",
:create/email "tangj1122@gmail.com",
:create/time 1588208943814,
:block/uid "1NxSgcmiX",
:edit/time 1588209030405,
:edit/email "tangj1122@gmail.com"}
{:block/string "Tester",
:create/email "tangj1122@gmail.com",
:create/time 1588209031920,
:block/uid "L7z0iQMDw",
:edit/time 1588209036525,
:edit/email "tangj1122@gmail.com"}
{:block/string "Language lawyer",
:create/email "tangj1122@gmail.com",
:create/time 1588209036520,
:block/uid "UCiye5_d9",
:edit/time 1588209040319,
:edit/email "tangj1122@gmail.com"}],
:block/uid "yu60MV_Dq",
:edit/time 1588208778240,
:edit/email "tangj1122@gmail.com"}],
:block/uid "_XKDd3UEb",
:edit/time 1588170177448,
:edit/email "tangj1122@gmail.com"}
{:block/string "Aristocracy, Democracy, and System Design",
:create/email "tangj1122@gmail.com",
:create/time 1588170177441,
:block/children
[{:block/string "Conceptual Integrity",
:create/email "tangj1122@gmail.com",
:create/time 1588209373134,
:block/children
[{:block/string
"I will contend that conceptual integrity is __the__ most important consideration in system design. It is better to have a system omit certain anomalous features and improvements, but to reflect one set of design ideas, than to have one that contains many good but independent and uncoordinated ideas.",
:create/email "tangj1122@gmail.com",
:create/time 1588209617817,
:block/uid "lhIzMmiJG",
:edit/time 1588209618570,
:edit/email "tangj1122@gmail.com"}
{:block/string
"the external description of a programming system is ten to twenty times as large as the external description of the computer system itself.",
:create/email "tangj1122@gmail.com",
:create/time 1588209620121,
:block/uid "J1LH_3jYA",
:edit/time 1588209661981,
:edit/email "tangj1122@gmail.com"}
{:block/string
"__Simplicity__ is not enough. Mooers's TRAC language and Algol 68 achieve simplicity as measured by the number of distinct elementary concepts. They are not, however, __straightforward__",
:create/email "tangj1122@gmail.com",
:create/time 1588209799416,
:block/uid "by4RZKtHW",
:edit/time 1588209799630,
:edit/email "tangj1122@gmail.com"}],
:block/uid "TpXV_MTsp",
:edit/time 1588209617821,
:edit/email "tangj1122@gmail.com"}
{:block/string "Aristocracy",
:create/email "tangj1122@gmail.com",
:create/time 1588209800277,
:block/children
[{:block/string
"Now we can deal with the deeply emotional question of aristocracy versus democracy. Are not the architects a new aristocracy, an intellectual elite, set up to tell the poor dumb implementers what to do? Has not all the creative work been sequestered for this elite, leaving the implementers as cogs in the machine? Won't one get a better product by getting the good ideas from all the team, following a democratic philosophy, rather than by restricting the development of specifications to a few?",
:create/email "tangj1122@gmail.com",
:create/time 1588210085225,
:block/uid "fpeQVFnfG",
:edit/time 1588210085681,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Often the fresh concept does come from an implementer or from a user. However, all my own experience convinces me, and I have tried to show, that the conceptual integrity of a system determines its ease of use. Good features and ideas that do not integrate with a system's basic concepts are best left out.",
:create/email "tangj1122@gmail.com",
:create/time 1588210133485,
:block/uid "cGt8bDoPJ",
:edit/time 1588210146455,
:edit/email "tangj1122@gmail.com"}
{:block/string
"there must be few architects, their product must endure longer than that of an implementer, and the architect sits at the focus of forces which he must ultimately resolve in the user's interest.",
:create/email "tangj1122@gmail.com",
:create/time 1588210285343,
:block/uid "xWYSskarr",
:edit/time 1588210297594,
:edit/email "tangj1122@gmail.com"}
{:block/string
"The design of an implementation, given an architecture, requires and allows as much design creativity, as many new ideas, and as much technical brilliance as the design of the external specifications",
:create/email "tangj1122@gmail.com",
:create/time 1588210297591,
:block/uid "JVjDzAaGL",
:edit/time 1588210297943,
:edit/email "tangj1122@gmail.com"}],
:block/uid "QARU7TwXM",
:edit/time 1588210085228,
:edit/email "tangj1122@gmail.com"}],
:block/uid "jQMskdPj3",
:edit/time 1588170182371,
:edit/email "tangj1122@gmail.com"}
{:block/string "The Second-System Effect",
:create/email "tangj1122@gmail.com",
:create/time 1588170182367,
:block/uid "7cU13o_-k",
:edit/time 1588170185647,
:edit/email "tangj1122@gmail.com"}
{:block/string "Passing the Word",
:create/email "tangj1122@gmail.com",
:create/time 1588170185642,
:block/uid "aY0X_H9sc",
:edit/time 1588170187466,
:edit/email "tangj1122@gmail.com"}
{:block/string "Why Did the Tower of Babel Fail?",
:create/email "tangj1122@gmail.com",
:create/time 1588170187462,
:block/uid "2qgqw4vSk",
:edit/time 1588174103334,
:edit/email "tangj1122@gmail.com"}
{:block/string "Calling the Shot",
:create/email "tangj1122@gmail.com",
:create/time 1588170191842,
:block/uid "wp2osFh4g",
:edit/time 1588170194175,
:edit/email "tangj1122@gmail.com"}
{:block/string "Ten Pounds in a Five-Pound Sack",
:create/email "tangj1122@gmail.com",
:create/time 1588170194170,
:block/uid "kC5wG2x5Z",
:edit/time 1588170198899,
:edit/email "tangj1122@gmail.com"}
{:block/string "The Documentary Hypothesis",
:create/email "tangj1122@gmail.com",
:create/time 1588170198895,
:block/uid "ijr96sG3h",
:edit/time 1588170202647,
:edit/email "tangj1122@gmail.com"}
{:block/string "Plan to Throw One Away",
:create/email "tangj1122@gmail.com",
:create/time 1588170202642,
:block/uid "6Uh_8nRlV",
:edit/time 1588170207630,
:edit/email "tangj1122@gmail.com"}
{:block/string "Sharp Tools",
:create/email "tangj1122@gmail.com",
:create/time 1588170207626,
:block/uid "xdTq4KyhX",
:edit/time 1588170209856,
:edit/email "tangj1122@gmail.com"}
{:block/string "The Whole and the Parts",
:create/email "tangj1122@gmail.com",
:create/time 1588170209841,
:block/uid "488tHKZ2i",
:edit/time 1588170250182,
:edit/email "tangj1122@gmail.com"}
{:block/string "Hatching a Catastrophe",
:create/email "tangj1122@gmail.com",
:create/time 1588170213002,
:block/uid "NV2ELzN2c",
:edit/time 1588170216215,
:edit/email "tangj1122@gmail.com"}
{:block/string "The Other Face",
:create/email "tangj1122@gmail.com",
:create/time 1588170216210,
:block/uid "mq6irjFF0",
:edit/time 1588170217924,
:edit/email "tangj1122@gmail.com"}
{:block/string "No Silver Bullet -- Essence and Accident",
:create/email "tangj1122@gmail.com",
:create/time 1588170217919,
:block/uid "Pllo9ei37",
:edit/time 1588170224003,
:edit/email "tangj1122@gmail.com"}
{:block/string "\"No Silver Bullet\" Refired",
:create/email "tangj1122@gmail.com",
:create/time 1588170223995,
:block/uid "SXDU30Mxf",
:edit/time 1588170229241,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Propsitions of the Mythical Man-Month: True or False?",
:create/email "tangj1122@gmail.com",
:create/time 1588170229237,
:block/uid "8eLxWzX1l",
:edit/time 1588170238032,
:edit/email "tangj1122@gmail.com"}
{:block/string "The Mythical Man-Month after 20 years",
:create/email "tangj1122@gmail.com",
:create/time 1588170238028,
:block/uid "kj50lg8di",
:edit/time 1588170244230,
:edit/email "tangj1122@gmail.com"}],
:block/uid "n9z7IP6Jr",
:edit/time 1588170141648,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1588163070210,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588163081600,
:node/title "book",
:edit/time 1588163081603,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588163408557,
:node/title "hustle",
:edit/time 1588163408571,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588163444403,
:node/title "complexity",
:edit/time 1588163444404,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588163646457,
:node/title "Conway's Law",
:edit/time 1588163646461,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588170805041,
:node/title "programming",
:edit/time 1588170805056,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588171108550,
:node/title "Clojurian",
:edit/time 1588171108563,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588171302174,
:node/title "agility",
:edit/time 1588171302177,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588171363796,
:node/title "hammock-driven development",
:edit/time 1588171363799,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588171389468,
:node/title "Alex Miller",
:edit/time 1588171389469,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588172222769,
:node/title "REPL",
:edit/time 1588172222785,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588172228451,
:node/title "uncertainty",
:edit/time 1588172228452,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588172296752,
:node/title "The Goal",
:block/children
[{:block/string "type:: [[book]]",
:block/uid "C5Ohc-FsQ",
:edit/time 1588172307767,
:edit/email "tangj1122@gmail.com"}
{:block/string "by [[Eliyahu M. Goldratt]]",
:block/uid "UC2HdA9dI",
:edit/time 1588172319999,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1588172296753,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588172315654,
:node/title "Eliyahu M. Goldratt",
:edit/time 1588172315655,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588172571748,
:node/title "Wardley Mapping",
:edit/time 1588172571750,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588173975873,
:node/title "Brooks's Law",
:edit/time 1588173975889,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588175133639,
:node/title "Marty Cagan",
:edit/time 1588175133641,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588176273634,
:node/title "Hero's Journey",
:edit/time 1588176273636,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588176290362,
:node/title "product management",
:edit/time 1588176290363,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588176312585,
:node/title "Reality Distortion Field",
:edit/time 1588176312588,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588176312585,
:node/title "Framing",
:edit/time 1588176312588,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588177263989,
:node/title "Continuous Discovery and Delivery",
:edit/time 1588177263992,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588177446228,
:node/title "OKRs",
:edit/time 1588177446229,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588177711849,
:node/title "remote work",
:edit/time 1588177711851,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588177946499,
:node/title "MVP",
:edit/time 1588177946500,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588189070835,
:node/title "Cursive",
:edit/time 1588189070837,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588189093147,
:node/title "shadow-cljs",
:edit/time 1588189093148,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588197210477,
:node/title "core.async",
:edit/time 1588197210479,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588197297498,
:node/title "re-natal",
:edit/time 1588197297531,
:edit/email "tangj1122@gmail.com"}
{:node/title "April 30th, 2020",
:block/children
[{:block/string "[[OpenCrux]] and [[datahike]] appear! ",
:create/email "tangj1122@gmail.com",
:create/time 1588251094783,
:block/uid "OPfFNcPPS",
:edit/time 1588263243878,
:edit/email "tangj1122@gmail.com"}
{:block/string "{{[[DONE]]}} implement [[debux]]",
:create/email "tangj1122@gmail.com",
:create/time 1588263243966,
:block/children
[{:block/string
"didn't need to do this, [[re-frame]] tracing already takes care of this",
:create/email "tangj1122@gmail.com",
:create/time 1588265621293,
:block/uid "U42kvGuOS",
:edit/time 1588265636408,
:edit/email "tangj1122@gmail.com"}],
:block/uid "MUuXKDQKp",
:edit/time 1588265617394,
:edit/email "tangj1122@gmail.com"}
{:block/string
"{{[[DONE]]}} work on [[Deep Transclusions]] and [[Nested [[Links]]]]",
:create/email "tangj1122@gmail.com",
:create/time 1588263262794,
:block/children
[{:block/string "Nested anchor tags actually break [[W3C]] rules",
:create/email "tangj1122@gmail.com",
:create/time 1588266968809,
:block/children
[{:block/string
"https://stackoverflow.com/questions/18666915/why-are-nested-anchor-tags-illegal",
:create/email "tangj1122@gmail.com",
:create/time 1588266840402,
:block/uid "DX9Vjm1q4",
:edit/time 1588266968834,
:edit/email "tangj1122@gmail.com"}
{:block/string
"https://codepen.io/tangsauce/pen/rNOGNWJ?editors=1100",
:create/email "tangj1122@gmail.com",
:create/time 1588266862911,
:block/uid "fc9XFlrmw",
:edit/time 1588266970900,
:edit/email "tangj1122@gmail.com"}],
:block/uid "aPPWF1reu",
:edit/time 1588266968809,
:edit/email "tangj1122@gmail.com"}
{:block/string "Converting HTML to Hiccup",
:create/email "tangj1122@gmail.com",
:create/time 1588270977396,
:block/children
[{:block/string "http://html2hiccup.buttercloud.com/ ",
:create/email "tangj1122@gmail.com",
:create/time 1588270994696,
:block/children
[{:block/string "problem: has a bunch of random `\\n\\s+`",
:create/email "tangj1122@gmail.com",
:create/time 1588270996777,
:block/uid "zoASuSxiZ",
:edit/time 1588271010892,
:edit/email "tangj1122@gmail.com"}
{:block/string "solution: `:%s//g` with Vim",
:create/email "tangj1122@gmail.com",
:create/time 1588271012684,
:block/uid "WvZ1aRZlp",
:edit/time 1588271032631,
:edit/email "tangj1122@gmail.com"}],
:block/uid "ta6oZuh_G",
:edit/time 1588270995842,
:edit/email "tangj1122@gmail.com"}
{:block/string "https://htmltohiccup.herokuapp.com/",
:create/email "tangj1122@gmail.com",
:create/time 1588270967876,
:block/children
[{:block/string
"problem: classes are strings rather than hiccup shortcut syntax",
:create/email "tangj1122@gmail.com",
:create/time 1588270983570,
:block/uid "UZHLBZEe5",
:edit/time 1588510641827,
:edit/email "tangj1122@gmail.com"}],
:block/uid "9gYSZemcA",
:edit/time 1588270975602,
:edit/email "tangj1122@gmail.com"}],
:block/uid "h5N5pCPnm",
:edit/time 1588357136518,
:edit/email "tangj1122@gmail.com"}],
:block/uid "6zru4b9lD",
:edit/time 1588358786764,
:edit/email "tangj1122@gmail.com"}
{:block/string
"[[re-posh]] and [[re-frame]] syntax sugar `:<- [:event]` messed me up for so long. The reason why I was confused was because I never ever used it, since most of the time I'm always making queries with a `:block/uids` ",
:create/email "tangj1122@gmail.com",
:create/time 1588263269883,
:block/uid "fKgKp2_tv",
:edit/time 1588295232790,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1588201591796,
:edit/email "eloi.poch@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588208769213,
:node/title "Mills's Proposal",
:edit/time 1588208769216,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588251783374,
:node/title "OpenCrux",
:edit/time 1588251783379,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588251800982,
:node/title "datahike",
:edit/time 1588251800996,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588265617402,
:node/title "debux",
:edit/time 1588265617418,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588266853204,
:node/title "W3C",
:edit/time 1588266853207,
:edit/email "tangj1122@gmail.com"}
{:node/title "Nested [[Links]]",
:block/children
[{:block/string "content",
:create/email "tangj1122@gmail.com",
:create/time 1588277343550,
:block/uid "xao2_1hFC",
:edit/time 1588281497468,
:edit/email "tangj1122@gmail.com"}
{:block/string
"arbitrary content 1!@#$%^&*()-_=+[]{}\\|;',./<>?:\"",
:create/email "tangj1122@gmail.com",
:create/time 1588277481893,
:block/uid "yqKWLSAkH",
:edit/time 1588281821941,
:edit/email "tangj1122@gmail.com"}
{:block/string "[content]",
:create/email "tangj1122@gmail.com",
:create/time 1588281945567,
:block/uid "FyyXZ9mFF",
:edit/time 1588282038144,
:edit/email "tangj1122@gmail.com"}
{:block/string "(content)",
:create/email "tangj1122@gmail.com",
:create/time 1588281948602,
:block/uid "Y9Dp5gXqd",
:edit/time 1588282040369,
:edit/email "tangj1122@gmail.com"}
{:block/string "{content}",
:create/email "tangj1122@gmail.com",
:create/time 1588281955385,
:block/uid "ByGii7FlU",
:edit/time 1588282043480,
:edit/email "tangj1122@gmail.com"}
{:block/string "[[content]",
:create/email "tangj1122@gmail.com",
:create/time 1588281960828,
:block/uid "YozYQgrkb",
:edit/time 1588282063818,
:edit/email "tangj1122@gmail.com"}
{:block/string "[content]]",
:create/email "tangj1122@gmail.com",
:create/time 1588281973700,
:block/uid "KrsWK45x_",
:edit/time 1588282067180,
:edit/email "tangj1122@gmail.com"}
{:block/string "[[content [[ content",
:create/email "tangj1122@gmail.com",
:create/time 1588282186529,
:block/uid "lDRpMoQPE",
:edit/time 1588282256380,
:edit/email "tangj1122@gmail.com"}
{:block/string "[[content ]",
:create/email "tangj1122@gmail.com",
:create/time 1588282210141,
:block/uid "rk2UqypDe",
:edit/time 1588282258068,
:edit/email "tangj1122@gmail.com"}
{:block/string "]] content",
:create/email "tangj1122@gmail.com",
:create/time 1588282223967,
:block/uid "jTrC-s2xt",
:edit/time 1588282259112,
:edit/email "tangj1122@gmail.com"}
{:block/string "content ]]",
:create/email "tangj1122@gmail.com",
:create/time 1588282245263,
:block/uid "SPSXkiE1h",
:edit/time 1588282260385,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1588282247523,
:block/uid "Tq_QYG4eY",
:edit/time 1588282247523,
:edit/email "tangj1122@gmail.com"}
{:block/string "[[Random [ Bracket]]",
:create/email "tangj1122@gmail.com",
:create/time 1588281979809,
:block/uid "SiVF2p36C",
:edit/time 1588282238559,
:edit/email "tangj1122@gmail.com"}
{:block/string "#hashtag",
:create/email "tangj1122@gmail.com",
:create/time 1588281498727,
:block/uid "lkmvCZiiS",
:edit/time 1588281502206,
:edit/email "tangj1122@gmail.com"}
{:block/string "#[[long hashtag]]",
:create/email "tangj1122@gmail.com",
:create/time 1588281515273,
:block/uid "WRPSu1DSB",
:edit/time 1588281723267,
:edit/email "tangj1122@gmail.com"}
{:block/string "[[link]]",
:create/email "tangj1122@gmail.com",
:create/time 1588281502201,
:block/uid "xXx2MsbeV",
:edit/time 1588281504908,
:edit/email "tangj1122@gmail.com"}
{:block/string "[[Nested [[Links]]]]",
:create/email "tangj1122@gmail.com",
:create/time 1588277460485,
:block/uid "xvNrXPKoQ",
:edit/time 1588277476843,
:edit/email "tangj1122@gmail.com"}
{:block/string "((xao2_1hFC))",
:create/email "tangj1122@gmail.com",
:create/time 1588281607624,
:block/uid "3Z6C7XL1c",
:edit/time 1588281608604,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1588281504901,
:block/uid "pEMmgiNoS",
:edit/time 1588281504901,
:edit/email "tangj1122@gmail.com"}
{:block/string "content + #hashtag ",
:create/email "tangj1122@gmail.com",
:create/time 1588277346601,
:block/uid "StcMCBIa_",
:edit/time 1588281709056,
:edit/email "tangj1122@gmail.com"}
{:block/string "content + #[[long hashtag]]",
:create/email "tangj1122@gmail.com",
:create/time 1588277353826,
:block/uid "MjYXaiDee",
:edit/time 1588281849645,
:edit/email "tangj1122@gmail.com"}
{:block/string "content + [[link]]",
:create/email "tangj1122@gmail.com",
:create/time 1588277446781,
:block/uid "yn_vxvImS",
:edit/time 1588281535025,
:edit/email "tangj1122@gmail.com"}
{:block/string "content + [[link]]",
:create/email "tangj1122@gmail.com",
:create/time 1588277457818,
:block/uid "Gq1gGgbnC",
:edit/time 1588281732092,
:edit/email "tangj1122@gmail.com"}
{:block/string "content + [[Nested [[Links]]]]",
:create/email "tangj1122@gmail.com",
:create/time 1588277476840,
:block/uid "GxxgaGD9e",
:edit/time 1588281541444,
:edit/email "tangj1122@gmail.com"}
{:block/string "content + transclusion: ((xao2_1hFC))",
:create/email "tangj1122@gmail.com",
:create/time 1588277498231,
:block/uid "zBCD4VBk1",
:edit/time 1588281561373,
:edit/email "tangj1122@gmail.com"}
{:block/string "transcluded link: ((xXx2MsbeV))",
:create/email "tangj1122@gmail.com",
:create/time 1588281592053,
:block/uid "QTHquHef_",
:edit/time 1588281602420,
:edit/email "tangj1122@gmail.com"}
{:block/string "transcluded content + link: ((GxxgaGD9e))",
:create/email "tangj1122@gmail.com",
:create/time 1588277518713,
:block/uid "CST1lHCqS",
:edit/time 1588282454786,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1588281702303,
:block/uid "vWSdbxQ_w",
:edit/time 1588281702303,
:edit/email "tangj1122@gmail.com"}
{:block/string "{{[[TODO]]}}",
:create/email "tangj1122@gmail.com",
:create/time 1588282051249,
:block/uid "3FWb6VJG1",
:edit/time 1588282308381,
:edit/email "tangj1122@gmail.com"}
{:block/string "{{[[DONE]]}}",
:create/email "tangj1122@gmail.com",
:create/time 1588282054048,
:block/uid "Qm0ovC-18",
:edit/time 1588282315409,
:edit/email "tangj1122@gmail.com"}
{:block/string "{{[[TODO]]}} content",
:create/email "tangj1122@gmail.com",
:create/time 1588282311549,
:block/uid "Pr_OI4iQY",
:edit/time 1588282318598,
:edit/email "tangj1122@gmail.com"}
{:block/string "{{[[DONE]]}} content",
:create/email "tangj1122@gmail.com",
:create/time 1588282313640,
:block/uid "RJxksfSia",
:edit/time 1588282337436,
:edit/email "tangj1122@gmail.com"}
{:block/string "{{button}}",
:create/email "tangj1122@gmail.com",
:create/time 1588281958434,
:block/uid "crrukRIdb",
:edit/time 1588282046805,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1588282330845,
:block/uid "6LG6pQjF3",
:edit/time 1588282413468,
:edit/email "tangj1122@gmail.com"}
{:block/string "attribute::",
:create/email "tangj1122@gmail.com",
:create/time 1588277343349,
:block/uid "JaIXsfEtg",
:edit/time 1588281664174,
:edit/email "tangj1122@gmail.com"}
{:block/string "attribute:: attribute",
:create/email "tangj1122@gmail.com",
:create/time 1588267246958,
:block/uid "-MUd5EKMe",
:edit/time 1588281666463,
:edit/email "tangj1122@gmail.com"}
{:block/string "attribute:: [[attribute]]",
:create/email "tangj1122@gmail.com",
:create/time 1588277325735,
:block/uid "fK9ppuM-X",
:edit/time 1588281668405,
:edit/email "tangj1122@gmail.com"}
{:block/string "attribute:: #attribute",
:create/email "tangj1122@gmail.com",
:create/time 1588277334134,
:block/uid "F_bcWW5Qy",
:edit/time 1588281670542,
:edit/email "tangj1122@gmail.com"}
{:block/string "attribute:: attribute [[attribute]] #attribute",
:create/email "tangj1122@gmail.com",
:create/time 1588267249756,
:block/uid "UL3222zn6",
:edit/time 1588282093265,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1588267240219,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588268689275,
:node/title "Deep Transclusions",
:block/children
[{:block/string "level 0: no transclusion",
:create/email "tangj1122@gmail.com",
:create/time 1588268706444,
:block/children
[{:block/string "level 1: ((NzBvaE197))",
:create/email "tangj1122@gmail.com",
:create/time 1588268709908,
:block/children
[{:block/string "level 2: ((7o8SUCjPC))",
:create/email "tangj1122@gmail.com",
:create/time 1588268728490,
:block/children
[{:block/string "level 3: ((7T6pzL5kf))",
:create/email "tangj1122@gmail.com",
:create/time 1588268744118,
:block/uid "y-Z5q3tDy",
:edit/time 1588269061841,
:edit/email "tangj1122@gmail.com"}],
:block/uid "7T6pzL5kf",
:edit/time 1588268744122,
:edit/email "tangj1122@gmail.com"}],
:block/uid "7o8SUCjPC",
:edit/time 1588268735929,
:edit/email "tangj1122@gmail.com"}],
:block/uid "NzBvaE197",
:edit/time 1588268734560,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1588268689276,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588277324617,
:node/title "link",
:edit/time 1588277324619,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588277395457,
:node/title "hashtag",
:edit/time 1588277395458,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588277406608,
:node/title "long hashtag",
:block/children
[{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1588281723263,
:block/uid "kmkNC8BpN",
:edit/time 1588281723263,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1588281723267,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588277421878,
:node/title "attribute",
:edit/time 1588277421879,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588281997816,
:node/title "Random [ Bracket",
:edit/time 1588282012549,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588286130587,
:node/title "re-posh",
:edit/time 1588346782360,
:edit/email "tangj1122@gmail.com"}
{:node/title "May 1st, 2020",
:block/children
[{:block/string
"[[[[re-frame-10x]] subscriptions with [[re-posh]]]]",
:create/email "tangj1122@gmail.com",
:create/time 1588342590421,
:block/uid "MNP6sdxb3",
:edit/time 1588346782347,
:edit/email "tangj1122@gmail.com"}
{:block/string "[[Athens Change Log]]",
:create/email "tangj1122@gmail.com",
:create/time 1588382507427,
:block/children
[{:block/string "Deep transclusions work",
:create/email "tangj1122@gmail.com",
:create/time 1588382514267,
:block/children
[{:block/string "((5WNJ5-u1k))",
:create/email "tangj1122@gmail.com",
:create/time 1588382525066,
:block/children
[{:block/string "((datRoaMvu))",
:create/email "tangj1122@gmail.com",
:create/time 1588382528845,
:block/uid "eXJJpoSyk",
:edit/time 1588382532076,
:edit/email "tangj1122@gmail.com"}],
:block/uid "datRoaMvu",
:edit/time 1588382528854,
:edit/email "tangj1122@gmail.com"}],
:block/uid "5WNJ5-u1k",
:edit/time 1588382521401,
:edit/email "tangj1122@gmail.com"}],
:block/uid "_Dtt3Hqhc",
:edit/time 1588382510333,
:edit/email "tangj1122@gmail.com"}
{:block/string "[[The Cathedral and the Bazaar]]",
:create/email "tangj1122@gmail.com",
:create/time 1588382534671,
:block/uid "LzaSdKyZU",
:edit/time 1588385078705,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1588284005385,
:edit/email "eloi.poch@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588342612905,
:node/title "re-frame-10x",
:edit/time 1588346782360,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588346782349,
:node/title "[[re-frame-10x]] subscriptions with [[re-posh]]",
:block/children
[{:block/string "type:: [[documentation]]",
:create/email "tangj1122@gmail.com",
:create/time 1588343682163,
:block/uid "6ySSHzVe3",
:edit/time 1588358779355,
:edit/email "tangj1122@gmail.com"}
{:block/string "#[[re-frame]]",
:create/email "tangj1122@gmail.com",
:create/time 1588343693109,
:block/uid "pkd7W6daa",
:edit/time 1588343696710,
:edit/email "tangj1122@gmail.com"}
{:block/string
"if you rewrite the query to use `re-frame`, the query input will be shown, but not the output",
:create/email "tangj1122@gmail.com",
:create/time 1588342700740,
:block/children
[{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1588342739568,
:block/uid "-nd-6jQCc",
:edit/time 1588343710982,
:edit/email "tangj1122@gmail.com"}
{:block/string
"![](https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2F0Mt9r25iYB?alt=media&token=267e867b-8284-46e7-88ea-46aaaf6847f3)",
:block/uid "-BUZjREq1",
:edit/time 1588344091622,
:edit/email "tangj1122@gmail.com"}
{:block/string
"![](https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2FLpWG6faYU5?alt=media&token=d6410fc1-bcf3-43c1-9793-b015e4ab0e36)",
:block/uid "S4moARTrB",
:edit/time 1588343850928,
:edit/email "tangj1122@gmail.com"}
{:block/string
"![](https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2FLHUYw8Sbys?alt=media&token=f9cef24c-ab5b-4188-a5cf-676813ea1786)",
:block/uid "onjOB9cL6",
:edit/time 1588343946276,
:edit/email "tangj1122@gmail.com"}
{:block/string
"![](https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2Fv2j1Sun535?alt=media&token=d818baef-c0be-4c1e-abf8-83a7003e4236)",
:block/uid "WZ8I-ZBxq",
:edit/time 1588343848164,
:edit/email "tangj1122@gmail.com"}
{:block/string
"![](https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2Fae--16o583?alt=media&token=47be8e22-bf08-4706-8a3c-5f5f97b570ba)",
:block/uid "gjL6sZ9_E",
:edit/time 1588343550130,
:edit/email "tangj1122@gmail.com"}
{:block/string
"don't understand why sometimes `re-posh/layer3` doesn't work for `:block/_children2` but should use `re-frame` calls when trying to work with `re-frame-10x`",
:create/email "tangj1122@gmail.com",
:create/time 1588343833343,
:block/uid "tZzq-C80K",
:edit/time 1588344339554,
:edit/email "tangj1122@gmail.com"}],
:block/uid "ZzZG-xTFg",
:edit/time 1588344093890,
:edit/email "tangj1122@gmail.com"}
{:block/string
"```;; normal re-posh syntax. result: \"Subscription not run yet, so no value is available\"\n(reg-pull-sub\n :re-posh/reg-pull-sub\n '[:block/uid :block/string :block/order {:block/children ...}])\n\n;; same as above\n(re-posh/reg-sub\n :re-posh/reg-sub\n (fn [_ [_ id]]\n {:type :pull\n :pattern '[:block/uid :block/string :block/order {:block/children ...}]\n :id id}))\n\n;; shows query input, but not output\n(re-frame/reg-sub\n :re-frame/reg-sub\n (fn [_ [_ id]]\n {:type :pull\n :pattern '[:block/uid :block/string :block/order {:block/children ...}]\n :id id}))\n\n;; output is shown! (but UI still says \"Not Ran\")\n(re-frame/reg-sub\n :re-frame/layer3\n (fn [[_ id] _]\n (subscribe [:block/children id]))\n (fn [x _]\n x))\n\n(re-frame/reg-sub\n :re-posh/layer3\n (fn [[_ id] _]\n (subscribe [:block/children id]))\n (fn [x _]\n x))```",
:create/email "tangj1122@gmail.com",
:create/time 1588343619355,
:block/uid "FYEQawXrA",
:edit/time 1588346789039,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1588346782360,
:edit/email "tangj1122@gmail.com"}
{:node/title "May 2nd, 2020",
:block/children
[{:block/string "[[Athens Change Log]]",
:create/email "tangj1122@gmail.com",
:create/time 1588510688879,
:block/children
[{:block/string
"Document Roam's datascript attributes more thoroughly in a Notion table. Link in [[[[Datascript]] FAQ]].",
:create/email "tangj1122@gmail.com",
:create/time 1588510693042,
:block/children
[{:block/string "((kvuGqQm5i))",
:create/email "tangj1122@gmail.com",
:create/time 1588511152394,
:block/uid "Hab0OKLDu",
:edit/time 1588511153517,
:edit/email "tangj1122@gmail.com"}],
:block/uid "uUattoFWT",
:edit/time 1588511493752,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Create a feature comparison Notion table for roadmapping and progress tracking. Link in [[Create a Minimal Viable Alternative to Roam]].",
:create/email "tangj1122@gmail.com",
:create/time 1588511260111,
:block/children
[{:block/string "((e_OM5cZil))",
:create/email "tangj1122@gmail.com",
:create/time 1588511428043,
:block/uid "ccGo09Oz8",
:edit/time 1588511428841,
:edit/email "tangj1122@gmail.com"}],
:block/uid "HjEUkL8ys",
:edit/time 1588511472058,
:edit/email "tangj1122@gmail.com"}],
:block/uid "AwFLe_JCk",
:edit/time 1588510693045,
:edit/email "tangj1122@gmail.com"}
{:block/string
"[[\"Controlling Time and Space: understanding the many formulations of [[FRP]]\" by [[Evan Czaplicki]]]]",
:create/email "tangj1122@gmail.com",
:create/time 1588432839997,
:block/uid "UlZGXE1aP",
:edit/time 1588432908756,
:edit/email "tangj1122@gmail.com"}
{:block/string
"[[Reactive [[Datalog]] for [[Datomic]] - Nikolas Göbel]]",
:create/email "tangj1122@gmail.com",
:create/time 1588436372303,
:block/uid "c5GyCMe32",
:edit/time 1588436384376,
:edit/email "tangj1122@gmail.com"}
{:block/string
"[[It's About Time: An Introduction to [[Timely Dataflow]] | Clockworks]]",
:create/email "tangj1122@gmail.com",
:create/time 1588439694911,
:block/uid "5m53seHk0",
:edit/time 1588439701210,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1588375367746,
:edit/email "eloi.poch@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588385096478,
:node/title "notes",
:edit/time 1588385096480,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588385164737,
:node/title "Eric S. Raymond",
:block/children
[{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1588387809533,
:block/uid "l80eTrN7G",
:edit/time 1588387809533,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1588387809538,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588385174829,
:node/title "Open-Source",
:edit/time 1588385174830,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588386501215,
:node/title "Ken Thompson",
:edit/time 1588386501232,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588386515185,
:node/title "Dennis Ritchie",
:edit/time 1588386515187,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588386515185,
:node/title "C Lang",
:edit/time 1588386515187,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588386515185,
:node/title "Bell Labs",
:edit/time 1588386515187,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588386541165,
:node/title "Unix",
:edit/time 1588386541167,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588386637208,
:node/title "BASIC",
:edit/time 1588386637209,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588386648631,
:node/title "ARPAnet",
:edit/time 1588386648632,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588386679259,
:node/title "Usenet",
:edit/time 1588386679260,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588386686270,
:node/title "CMU",
:edit/time 1588386686270,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588386688231,
:node/title "SAIL",
:edit/time 1588386688232,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588386877254,
:node/title "GNU",
:edit/time 1588386877257,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588386988161,
:node/title "hacker",
:edit/time 1588386988163,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588387060150,
:node/title "Sun Microsystems",
:edit/time 1588387060152,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588387144284,
:node/title "MS-DOS",
:edit/time 1588387144285,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588387237816,
:node/title "Microsoft",
:edit/time 1588387237820,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588387469535,
:node/title "Continuous Delivery",
:edit/time 1588387469536,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588387522462,
:node/title "Evolution",
:edit/time 1588387522464,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588387743626,
:node/title "A Brief History of Hackerdom",
:block/children
[{:block/string
"source:: http://www.catb.org/~esr/writings/cathedral-bazaar/hacker-history/index.html",
:create/email "tangj1122@gmail.com",
:create/time 1588387741364,
:block/uid "OIskkeuL_",
:edit/time 1588387752806,
:edit/email "tangj1122@gmail.com"}
{:block/string "#[[Eric S. Raymond]]",
:create/email "tangj1122@gmail.com",
:create/time 1588387793787,
:block/uid "3SIL0jOIz",
:edit/time 1588387816789,
:edit/email "tangj1122@gmail.com"}
{:block/string "Contents",
:create/email "tangj1122@gmail.com",
:create/time 1588385097032,
:block/children
[{:block/string "Prologue: The Real Programmers",
:create/email "tangj1122@gmail.com",
:create/time 1588385121552,
:block/children
[{:block/string
"The `Real Programmer' culture, though, was heavily associated with batch (and especially batch scientific) computing. It was eventually eclipsed by the rise of interactive computing, the universities, and the networks. These gave birth to another engineering tradition that, eventually, would evolve into today's open-source hacker culture.",
:create/email "tangj1122@gmail.com",
:create/time 1588385795336,
:block/uid "1FjvzFMzC",
:edit/time 1588385799326,
:edit/email "tangj1122@gmail.com"}],
:block/uid "fAwqUEpGj",
:edit/time 1588385177589,
:edit/email "tangj1122@gmail.com"}
{:block/string "The Early Hackers",
:create/email "tangj1122@gmail.com",
:create/time 1588385121552,
:block/children
[{:block/string
"The beginnings of the hacker culture as we know it today can be conveniently dated to 1961, the year MIT acquired the first PDP-1.",
:create/email "tangj1122@gmail.com",
:create/time 1588385837713,
:block/uid "sLftyboey",
:edit/time 1588385839998,
:edit/email "tangj1122@gmail.com"}
{:block/string
"The [[ARPAnet]] was the first transcontinental, high-speed computer network. It was built by the Defense Department as an experiment in digital communications, but grew to link together hundreds of universities and defense contractors and research laboratories.",
:block/uid "G4ozXjlas",
:edit/time 1588386648627,
:edit/email "tangj1122@gmail.com"}
{:block/string
"But the ARPAnet did something else as well. Its electronic highways brought together hackers all over the U.S. in a critical mass; instead of remaining in isolated small groups each developing their own ephemeral local cultures, they discovered (or re-invented) themselves as a networked tribe.",
:block/uid "2s-Qk3Q1E",
:edit/time 1588385938940,
:edit/email "tangj1122@gmail.com"}
{:block/string "the Jargon File -> New Hacker's Dictionary",
:create/email "tangj1122@gmail.com",
:create/time 1588385967732,
:block/uid "1Uf9a_CvC",
:edit/time 1588386074331,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Hackerdom flowered at the universities connected to the net, especially (though not exclusively) in their computer science departments. MIT's AI and LCS labs made it first among equals from the late 1960s. But Stanford University's Artificial Intelligence Laboratory ([[SAIL]]) and Carnegie-Mellon University ([[CMU]]) became nearly as important",
:create/email "tangj1122@gmail.com",
:create/time 1588386152287,
:block/uid "AsSlmVEua",
:edit/time 1588386688229,
:edit/email "tangj1122@gmail.com"}
{:block/string
"MIT, though it used the same PDP-10s as everyone else, took a slightly different path; they rejected DEC's software for the PDP-10 entirely and built their own operating system, the fabled ITS.",
:create/email "tangj1122@gmail.com",
:create/time 1588386231976,
:block/uid "UerV2NhNK",
:edit/time 1588386232187,
:edit/email "tangj1122@gmail.com"}
{:block/string
"ITS itself was written in assembler, but many ITS projects were written in the AI language LISP. LISP was far more powerful and flexible than any other language of its day; in fact, it is still a better design than most languages of __today__, twenty-five years later. LISP freed ITS's hackers to think in unusual and creative ways. It was a major factor in their successes, and remains one of hackerdom's favorite languages. #[[LISP]]",
:create/email "tangj1122@gmail.com",
:create/time 1588386251270,
:block/uid "V8C9A-ow7",
:edit/time 1588386256296,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Many of the ITS culture's technical creations are still alive today; the EMACS program editor is perhaps the best-known. And much of ITS's folklore is still `live' to hackers, as one can see in the [Jargon File](http://www.tuxedo.org/jargon). #[[Emacs]]",
:create/email "tangj1122@gmail.com",
:create/time 1588386256293,
:block/uid "K1SOaV5iJ",
:edit/time 1588386278026,
:edit/email "tangj1122@gmail.com"}
{:block/string
"For more than a decade, from the early 1970s into the mid-1980s, PARC yielded an astonishing volume of groundbreaking hardware and software innovations. The modern mice, windows, and icons style of software interface was invented there. So was the laser printer, and the local-area network; and PARC's series of D machines anticipated the powerful personal computers of the 1980s by a decade. Sadly, these prophets were without honor in their own company; so much so that it became **a standard joke to describe PARC as a place characterized by developing brilliant ideas for everyone else**. Their influence on hackerdom was pervasive. #[[Xerox PARC]]",
:create/email "tangj1122@gmail.com",
:create/time 1588386271665,
:block/uid "tms5MMAXz",
:edit/time 1588386385257,
:edit/email "tangj1122@gmail.com"}],
:block/uid "ZlNAauwlL",
:edit/time 1588385121572,
:edit/email "tangj1122@gmail.com"}
{:block/string "The Rise of Unix",
:create/email "tangj1122@gmail.com",
:create/time 1588385121552,
:block/children
[{:block/string
"Traditionally, operating systems had been written in tight assembler to extract the absolute highest efficiency possible out of their host machines. Thompson and Ritchie were among the first to realize that hardware and compiler technology had become good enough that an entire operating system could be written in C, and by 1978 the whole environment had been successfully ported to several machines of different types. #[[Ken Thompson]] #[[Dennis Ritchie]] #[[C Lang]] #[[Bell Labs]] #[[Unix]]",
:create/email "tangj1122@gmail.com",
:create/time 1588386387829,
:block/uid "IwiNUaSAk",
:edit/time 1588386541163,
:edit/email "tangj1122@gmail.com"}
{:block/string
"A few Unix sites were on the ARPAnet themselves. The PDP-10 and [[Unix]]/[[Usenet]] cultures began to meet and mingle at the edges, but they didn't mix very well at first. The PDP-10 hackers tended to consider the Unix crowd a bunch of upstarts, using tools that looked ridiculously primitive when set against the **baroque, lovely complexities of LISP** and ITS. ``Stone knives and bearskins!'' they muttered. #[[LISP]]",
:create/email "tangj1122@gmail.com",
:create/time 1588386637203,
:block/uid "9JQ9Zal7i",
:edit/time 1588386943661,
:edit/email "tangj1122@gmail.com"}
{:block/string
"And there was yet a third current flowing. The first personal computer had been marketed in 1975; Apple was founded in 1977, and advances came with almost unbelievable rapidity in the years that followed. The potential of microcomputers was clear, and attracted yet another generation of bright young hackers. Their language was BASIC, so primitive that PDP-10 partisans and Unix aficionados both considered it beneath contempt. #[[BASIC]]",
:create/email "tangj1122@gmail.com",
:create/time 1588386515181,
:block/uid "1_gV_tf2V",
:edit/time 1588386639031,
:edit/email "tangj1122@gmail.com"}],
:block/uid "yOTc9qxy0",
:edit/time 1588385121572,
:edit/email "tangj1122@gmail.com"}
{:block/string "The End of Elder Days",
:create/email "tangj1122@gmail.com",
:create/time 1588385121552,
:block/children
[{:block/string
"Stallman's grandest scheme neatly epitomized the transition hackerdom underwent in the early eighties—in 1982 he began the construction of an entire clone of Unix, written in C and available for free. His project was known as the GNU (Gnu's Not Unix) operating system, in a kind of recursive acronym. GNU quickly became a major focus for hacker activity. Thus, the spirit and tradition of ITS was preserved as an important part of the newer, Unix and VAX-centered hacker culture. Stallman's design finished what Berkeley had started, fusing the remains of the PDP-10 hacker culture with the Unix crowd. #[[Richard Stallman]] #[[GNU]]",
:create/email "tangj1122@gmail.com",
:create/time 1588386740259,
:block/uid "pXMaQ97yB",
:edit/time 1588386883946,
:edit/email "tangj1122@gmail.com"}],
:block/uid "asuBa8kh1",
:edit/time 1588385121573,
:edit/email "tangj1122@gmail.com"}
{:block/string "The Proprietary-Unix Era",
:create/email "tangj1122@gmail.com",
:create/time 1588385121552,
:block/children
[{:block/string
"It was also around this time that serious cracking episodes were first covered in the mainstream press—and journalists began to misapply the term ``hacker'' to refer to computer vandals, an abuse which sadly continues to this day. #[[hacker]]",
:create/email "tangj1122@gmail.com",
:create/time 1588386977250,
:block/uid "2A-V7Bu4B",
:edit/time 1588386992729,
:edit/email "tangj1122@gmail.com"}
{:block/string
"There were several attempts to tame workstation graphics. The one that prevailed was the X window system, developed at MIT with contributions from hundreds of individuals at dozens of companies. **A critical factor in its success was that the X developers were willing to give the sources away for free in accordance with the hacker ethic, and able to distribute them over the Internet.** X's victory over proprietary graphics systems (including one offered by Sun itself) was an important harbinger of changes which, a few years later, would profoundly affect Unix as a whole. #[[Open-Source]] #[[Sun Microsystems]]",
:create/email "tangj1122@gmail.com",
:create/time 1588386997040,
:block/uid "17vaVYpkM",
:edit/time 1588387060148,
:edit/email "tangj1122@gmail.com"}
{:block/string
"The MS-DOS world remained blissfully ignorant of all this. Though those early microcomputer enthusiasts quickly expanded to a population of DOS and Mac hackers orders an magnitude greater than that of the ``network nation'' culture, they never become a self-aware culture themselves. The pace of change was so fast that fifty different technical cultures grew and died as rapidly as mayflies, never achieving quite the stability necessary to develop a common tradition of jargon, folklore, and mythic history. The absence of a really pervasive network comparable to UUCP or Internet prevented them from becoming a network nation themselves. #[[MS-DOS]]",
:create/email "tangj1122@gmail.com",
:create/time 1588387134193,
:block/uid "eJ0z1aV8O",
:edit/time 1588387144283,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Worse, by the early 1990s it was becoming clear that ten years of effort to commercialize proprietary Unix was ending in failure. Unix's promise of cross-platform portability got lost in bickering among half a dozen proprietary Unix versions. The proprietary-Unix players proved so ponderous, so blind, and so inept at marketing that Microsoft was able to grab away a large part of their market with the shockingly inferior technology of its Windows operating system. #[[Microsoft]]",
:create/email "tangj1122@gmail.com",
:create/time 1588387144279,
:block/uid "A2pRtUgJN",
:edit/time 1588387237810,
:edit/email "tangj1122@gmail.com"}],
:block/uid "dyBoAEh6g",
:edit/time 1588385121573,
:edit/email "tangj1122@gmail.com"}
{:block/string "The Early Free Unixes",
:create/email "tangj1122@gmail.com",
:create/time 1588385121552,
:block/children
[{:block/string
"Into the gap left by the Free Software Foundation's uncompleted HURD had stepped a Helsinki University student named [[Linus Torvalds]]",
:create/email "tangj1122@gmail.com",
:create/time 1588387263461,
:block/uid "Z8BpoE8UB",
:edit/time 1588387312174,
:edit/email "tangj1122@gmail.com"}
{:block/string
"The most important feature of Linux, however, was not **technical but sociological**. Until the Linux development, everyone believed that any software as complex as an operating system had to be developed in a carefully coordinated way by a relatively small, tightly-knit group of people. This model was and still is typical of both commercial software and the great free-software cathedrals built by the Free Software Foundation in the 1980s; also of the freeBSD/netBSD/OpenBSD projects that spun off from the Jolitzes' original 386BSD port.",
:create/email "tangj1122@gmail.com",
:create/time 1588387338449,
:block/uid "D1tn5MFaA",
:edit/time 1588387347168,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Linux evolved in a completely different way. From nearly the beginning, it was rather casually hacked on by huge numbers of volunteers coordinating only through the Internet. Quality was maintained not by rigid standards or autocracy but by the **naively simple strategy of releasing every week and getting feedback from hundreds of users within days,** creating a sort of rapid Darwinian selection on the mutations introduced by developers. To the amazement of almost everyone, this worked quite well. #[[Continuous Delivery]] #[[Evolution]]",
:create/email "tangj1122@gmail.com",
:create/time 1588387380995,
:block/uid "BCgaLDVPR",
:edit/time 1588387579850,
:edit/email "tangj1122@gmail.com"}],
:block/uid "byhpg9oed",
:edit/time 1588385121573,
:edit/email "tangj1122@gmail.com"}
{:block/string "The Great Web Explosion",
:create/email "tangj1122@gmail.com",
:create/time 1588385121552,
:block/uid "UHssf1TFN",
:edit/time 1588387718947,
:edit/email "tangj1122@gmail.com"}
{:block/string "Bibliography",
:create/email "tangj1122@gmail.com",
:create/time 1588385121552,
:block/uid "JwJSNZBmA",
:edit/time 1588385121573,
:edit/email "tangj1122@gmail.com"}],
:block/uid "P1eQFvNyy",
:edit/time 1588385098984,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1588387743628,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588388497380,
:node/title "succession",
:edit/time 1588388497382,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588388507177,
:node/title "Linux",
:edit/time 1588388507177,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588388650992,
:node/title "fox",
:edit/time 1588388650993,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588388810410,
:node/title "Release Early, Release Often",
:edit/time 1588388810412,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588389035906,
:node/title "ego",
:edit/time 1588389035907,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588389088091,
:node/title "Linus's Law",
:edit/time 1588389088092,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588389777591,
:node/title "autonomy",
:edit/time 1588389777606,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588432845235,
:node/title
"\"Controlling Time and Space: understanding the many formulations of [[FRP]]\" by [[Evan Czaplicki]]",
:block/children
[{:block/string "type:: video",
:create/email "tangj1122@gmail.com",
:create/time 1588432921397,
:block/uid "UPLy2LGic",
:edit/time 1588432925215,
:edit/email "tangj1122@gmail.com"}
{:block/string
"source:: https://www.youtube.com/watch?v=Agu6jipKfYw&t=44s",
:create/email "tangj1122@gmail.com",
:create/time 1588432925657,
:block/uid "zPsyAp7VH",
:edit/time 1588432930107,
:edit/email "tangj1122@gmail.com"}
{:block/string "Comments",
:create/email "tangj1122@gmail.com",
:create/time 1588433935097,
:block/children
[{:block/string
"10 - what strikes me is how similar it looks to redux and re-frame. the html is way nicer too, like hiccup",
:create/email "tangj1122@gmail.com",
:create/time 1588433936605,
:block/uid "qRw-LMJO3",
:edit/time 1588433970214,
:edit/email "tangj1122@gmail.com"}
{:block/string
"11 the hot-swapping is beautiful. I don't think you can do this in re-frame. You can maintain state, but not change the program while running. hot swapping > hot module reloading. Same idea demoed in [[Inventing on Principle]]. Changing program variables while maintaining time-travel. Beautiful.",
:create/email "tangj1122@gmail.com",
:create/time 1588433938805,
:block/uid "1aqumBXhH",
:edit/time 1588434249782,
:edit/email "tangj1122@gmail.com"}],
:block/uid "de8Q9Y7z2",
:edit/time 1588433936609,
:edit/email "tangj1122@gmail.com"}
{:block/string "Contents",
:create/email "tangj1122@gmail.com",
:create/time 1588432937302,
:block/children
[{:block/string "Creator of [[Elm]]",
:create/email "tangj1122@gmail.com",
:create/time 1588432853238,
:block/uid "dbAQhhlqb",
:edit/time 1588432867991,
:edit/email "tangj1122@gmail.com"}
{:block/string "First-Order FRP",
:create/email "tangj1122@gmail.com",
:create/time 1588432919226,
:block/children
[{:block/string
"user takes action -> input to signal graph -> UI change",
:create/email "tangj1122@gmail.com",
:create/time 1588433002944,
:block/uid "hLXB8jPQO",
:edit/time 1588433019118,
:edit/email "tangj1122@gmail.com"}
{:block/string "input to signal graph",
:create/email "tangj1122@gmail.com",
:create/time 1588433268218,
:block/children
[{:block/string "transformations",
:create/email "tangj1122@gmail.com",
:create/time 1588433078683,
:block/uid "taPUsUi0s",
:edit/time 1588433268223,
:edit/email "tangj1122@gmail.com"}
{:block/string "merge",
:create/email "tangj1122@gmail.com",
:create/time 1588433260805,
:block/uid "s7jJSxu_7",
:edit/time 1588433272468,
:edit/email "tangj1122@gmail.com"}
{:block/string "lift",
:create/email "tangj1122@gmail.com",
:create/time 1588433270277,
:block/uid "JlffYXcxq",
:edit/time 1588433271443,
:edit/email "tangj1122@gmail.com"}],
:block/uid "GfP6NR3ry",
:edit/time 1588433268218,
:edit/email "tangj1122@gmail.com"}
{:block/string "core design",
:create/email "tangj1122@gmail.com",
:create/time 1588433274026,
:block/children
[{:block/string "signals are connect directly to world",
:create/email "tangj1122@gmail.com",
:create/time 1588433529651,
:block/uid "wb3EQ9cN5",
:edit/time 1588433544775,
:edit/email "tangj1122@gmail.com"}
{:block/string "signals are infinite",
:create/email "tangj1122@gmail.com",
:create/time 1588433536562,
:block/uid "XX7op8mDD",
:edit/time 1588433540356,
:edit/email "tangj1122@gmail.com"}
{:block/string "signal graphs are static",
:create/email "tangj1122@gmail.com",
:create/time 1588433616701,
:block/uid "rq8W3VV4J",
:edit/time 1588433619911,
:edit/email "tangj1122@gmail.com"}
{:block/string "synchronous by default",
:create/email "tangj1122@gmail.com",
:create/time 1588433619907,
:block/uid "3ZmKSxkQz",
:edit/time 1588433628069,
:edit/email "tangj1122@gmail.com"}],
:block/uid "IhnoMde2J",
:edit/time 1588433529736,
:edit/email "tangj1122@gmail.com"}],
:block/uid "Mt5o4mM13",
:edit/time 1588432945351,
:edit/email "tangj1122@gmail.com"}
{:block/string "Reconfigurable Signal Graph",
:create/email "tangj1122@gmail.com",
:create/time 1588434330588,
:block/children
[{:block/string
"Higher-Order FRP. Surely higher must be better!",
:create/email "tangj1122@gmail.com",
:create/time 1588434334024,
:block/children
[{:block/string "{{embed: ((IhnoMde2J))}}",
:create/email "tangj1122@gmail.com",
:create/time 1588434353239,
:block/uid "OHIXqEk3H",
:edit/time 1588434384086,
:edit/email "tangj1122@gmail.com"}
{:block/string "core design but ~~signal graphs are static~~",
:create/email "tangj1122@gmail.com",
:create/time 1588434393619,
:block/uid "jstMVb6nO",
:edit/time 1588434419055,
:edit/email "tangj1122@gmail.com"}
{:block/string "join: signal of signals",
:create/email "tangj1122@gmail.com",
:create/time 1588434415114,
:block/uid "q020tkJVx",
:edit/time 1588434484886,
:edit/email "tangj1122@gmail.com"}
{:block/string "probably Haskell",
:create/email "tangj1122@gmail.com",
:create/time 1588435579744,
:block/uid "QMUeennSa",
:edit/time 1588435583795,
:edit/email "tangj1122@gmail.com"}
{:block/string "because Functional, must be same value",
:create/email "tangj1122@gmail.com",
:create/time 1588435079782,
:block/children
[{:block/string "restrict infinite look back",
:create/email "tangj1122@gmail.com",
:create/time 1588434484882,
:block/uid "N-KX70C6M",
:edit/time 1588434862735,
:edit/email "tangj1122@gmail.com"}
{:block/string "linear memory growth?",
:create/email "tangj1122@gmail.com",
:create/time 1588434717751,
:block/uid "7RLnWJbbi",
:edit/time 1588434727550,
:edit/email "tangj1122@gmail.com"}
{:block/string "history must be \"safe\"",
:create/email "tangj1122@gmail.com",
:create/time 1588434742331,
:block/uid "NQP9DiZ7M",
:edit/time 1588434746116,
:edit/email "tangj1122@gmail.com"}],
:block/uid "1LWDPf90v",
:edit/time 1588435088165,
:edit/email "tangj1122@gmail.com"}
{:block/string
"not totally sold - requires more complex typing",
:create/email "tangj1122@gmail.com",
:create/time 1588434867368,
:block/uid "YHnO2Kkkw",
:edit/time 1588434872642,
:edit/email "tangj1122@gmail.com"}],
:block/uid "kl1sRQmD2",
:edit/time 1588434392320,
:edit/email "tangj1122@gmail.com"}
{:block/string "Asynchronous Dataflow",
:create/email "tangj1122@gmail.com",
:create/time 1588434339173,
:block/children
[{:block/string "design, only: ((wb3EQ9cN5))",
:create/email "tangj1122@gmail.com",
:create/time 1588434872995,
:block/uid "sxKW3wPvW",
:edit/time 1588435361394,
:edit/email "tangj1122@gmail.com"}
{:block/string "flatten",
:create/email "tangj1122@gmail.com",
:create/time 1588434961871,
:block/uid "cFzyG-vUK",
:edit/time 1588435585725,
:edit/email "tangj1122@gmail.com"}
{:block/string "Reactive extensions",
:create/email "tangj1122@gmail.com",
:create/time 1588435141435,
:block/uid "ueU-1W7kB",
:edit/time 1588435144535,
:edit/email "tangj1122@gmail.com"}
{:block/string "probably Imperative",
:create/email "tangj1122@gmail.com",
:create/time 1588435586606,
:block/uid "ZW6YucTHM",
:edit/time 1588435590622,
:edit/email "tangj1122@gmail.com"}
{:block/string
"because Imperative, can create a new signal each time",
:create/email "tangj1122@gmail.com",
:create/time 1588435073348,
:block/children
[{:block/string
"introduces hot and cold signals, where hot is constantly producing effects",
:create/email "tangj1122@gmail.com",
:create/time 1588435070009,
:block/uid "cFNoAiQHh",
:edit/time 1588435140328,
:edit/email "tangj1122@gmail.com"}],
:block/uid "kRNaq7HiR",
:edit/time 1588435104239,
:edit/email "tangj1122@gmail.com"}],
:block/uid "xYp3phrCu",
:edit/time 1588434343810,
:edit/email "tangj1122@gmail.com"}
{:block/string "Arrowized FRP",
:create/email "tangj1122@gmail.com",
:create/time 1588434343806,
:block/children
[{:block/string
"design, ~~signals are connect directly to world~~ and ~~signal graphs are static~~",
:create/email "tangj1122@gmail.com",
:create/time 1588435151074,
:block/uid "2yoYPhVvu",
:edit/time 1588435615082,
:edit/email "tangj1122@gmail.com"}
{:block/string "neither Imperative nor Functional",
:create/email "tangj1122@gmail.com",
:create/time 1588435593685,
:block/uid "-KqTjwk2n",
:edit/time 1588435605656,
:edit/email "tangj1122@gmail.com"}
{:block/string
"no way to talk about mouse position. more of a way to structure code",
:create/email "tangj1122@gmail.com",
:create/time 1588435383041,
:block/uid "6ToriFEAq",
:edit/time 1588435411172,
:edit/email "tangj1122@gmail.com"}],
:block/uid "u8tUI6JZ9",
:edit/time 1588434350875,
:edit/email "tangj1122@gmail.com"}],
:block/uid "DHUta-Aru",
:edit/time 1588434334028,
:edit/email "tangj1122@gmail.com"}
{:block/string
"![](https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2Fqzg_s7XhHM.png?alt=media&token=7728276a-dd10-4113-9435-e33054c56d98)",
:block/uid "WEbTiRgLI",
:edit/time 1588435638724,
:edit/email "tangj1122@gmail.com"}],
:block/uid "hI7npD22L",
:edit/time 1588432940407,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1588432852619,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588432852622,
:node/title "Evan Czaplicki",
:edit/time 1588432852625,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588432867994,
:node/title "Elm",
:edit/time 1588432867997,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588434117422,
:node/title "Inventing on Principle",
:edit/time 1588434117436,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588436374323,
:node/title "Reactive [[Datalog]] for [[Datomic]] - Nikolas Göbel",
:block/children
[{:block/string
"source:: https://www.youtube.com/watch?v=ZgqFlowyfTA&t=81s",
:create/email "tangj1122@gmail.com",
:create/time 1588436384372,
:block/uid "nL679gA3C",
:edit/time 1588436387610,
:edit/email "tangj1122@gmail.com"}
{:block/string "type:: video",
:create/email "tangj1122@gmail.com",
:create/time 1588436387860,
:block/uid "k5WYj7zpM",
:edit/time 1588436389523,
:edit/email "tangj1122@gmail.com"}
{:block/string "Contents",
:create/email "tangj1122@gmail.com",
:create/time 1588436389519,
:block/children
[{:block/string "advsior is [[Frank McSherry]]",
:create/email "tangj1122@gmail.com",
:create/time 1588436395605,
:block/uid "R9eI11nbj",
:edit/time 1588436412842,
:edit/email "tangj1122@gmail.com"}
{:block/string "Reactive System?",
:create/email "tangj1122@gmail.com",
:create/time 1588436433464,
:block/children
[{:block/string "rules engines",
:create/email "tangj1122@gmail.com",
:create/time 1588436454600,
:block/uid "5WyxDH_Wy",
:edit/time 1588436457347,
:edit/email "tangj1122@gmail.com"}
{:block/string "stream processors",
:create/email "tangj1122@gmail.com",
:create/time 1588436461380,
:block/uid "oZQyukJNQ",
:edit/time 1588436465528,
:edit/email "tangj1122@gmail.com"}
{:block/string "live dashboards",
:create/email "tangj1122@gmail.com",
:create/time 1588436457343,
:block/uid "EX_M1B9Rr",
:edit/time 1588436460810,
:edit/email "tangj1122@gmail.com"}],
:block/uid "GUyA5bL7P",
:edit/time 1588436453554,
:edit/email "tangj1122@gmail.com"}
{:block/string "Cites [[The Web After Tomorrow]]",
:create/email "tangj1122@gmail.com",
:create/time 1588436513623,
:block/uid "Z6NLrGn33",
:edit/time 1588436526144,
:edit/email "tangj1122@gmail.com"}
{:block/string "data -> computation, not vice versa",
:create/email "tangj1122@gmail.com",
:create/time 1588436481959,
:block/children
[{:block/string
"\"run a query\" turns into \"subscribe to query\"",
:create/email "tangj1122@gmail.com",
:create/time 1588436611771,
:block/uid "wBMCC-Gk2",
:edit/time 1588436627709,
:edit/email "tangj1122@gmail.com"}
{:block/string
"re-run subscription on data change (propagation)",
:create/email "tangj1122@gmail.com",
:create/time 1588436641619,
:block/uid "Euns2-7KI",
:edit/time 1588436660183,
:edit/email "tangj1122@gmail.com"}],
:block/uid "kG6ufXsI7",
:edit/time 1588436491852,
:edit/email "tangj1122@gmail.com"}
{:block/string "[[3DF]]",
:create/email "tangj1122@gmail.com",
:create/time 1588436660180,
:block/children
[{:block/string "only propagates changes",
:create/email "tangj1122@gmail.com",
:create/time 1588437455344,
:block/uid "Y_ncFeNiR",
:edit/time 1588437474891,
:edit/email "tangj1122@gmail.com"}
{:block/string "sits on top of a durable storage, e.g. Datomic",
:create/email "tangj1122@gmail.com",
:create/time 1588437474885,
:block/uid "Se65LO2OF",
:edit/time 1588437508367,
:edit/email "tangj1122@gmail.com"}
{:block/string
"![](https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2FtqSd8xqAxz.png?alt=media&token=9f359a0e-6dc8-4fd8-9904-3e9939dc254d)",
:block/uid "_TTWkON-B",
:edit/time 1588437559584,
:edit/email "tangj1122@gmail.com"}
{:block/string "a stream processor, not a query engine",
:create/email "tangj1122@gmail.com",
:create/time 1588437571127,
:block/uid "0EEKtT2hN",
:edit/time 1588437590032,
:edit/email "tangj1122@gmail.com"}
{:block/string
"how to be performant? incremental computation. how to do incremental computation?",
:create/email "tangj1122@gmail.com",
:create/time 1588437813238,
:block/uid "Q68a-0iBq",
:edit/time 1588437835382,
:edit/email "tangj1122@gmail.com"}],
:block/uid "3ZXYdWfyr",
:edit/time 1588437455351,
:edit/email "tangj1122@gmail.com"}
{:block/string "[[Differential Dataflow]]",
:create/email "tangj1122@gmail.com",
:create/time 1588437919198,
:block/children
[{:block/string "partially-ordered times",
:create/email "tangj1122@gmail.com",
:create/time 1588437929990,
:block/children
[{:block/string "(tx_time, loop_counter)",
:create/email "tangj1122@gmail.com",
:create/time 1588438043035,
:block/children
[{:block/string "(t0, 0)",
:create/email "tangj1122@gmail.com",
:create/time 1588438050024,
:block/uid "Mz70Zx4Bd",
:edit/time 1588438053589,
:edit/email "tangj1122@gmail.com"}
{:block/string "(t0, 1)",
:create/email "tangj1122@gmail.com",
:create/time 1588438053585,
:block/uid "nEvxmrvMC",
:edit/time 1588438056451,
:edit/email "tangj1122@gmail.com"}
{:block/string "...",
:create/email "tangj1122@gmail.com",
:create/time 1588438056577,
:block/uid "wYcH4P5xI",
:edit/time 1588439679688,
:edit/email "tangj1122@gmail.com"}],
:block/uid "LyqzluX-8",
:edit/time 1588438050027,
:edit/email "tangj1122@gmail.com"}],
:block/uid "2fLFHBx_1",
:edit/time 1588438073379,
:edit/email "tangj1122@gmail.com"}],
:block/uid "60S57Uied",
:edit/time 1588437926612,
:edit/email "tangj1122@gmail.com"}],
:block/uid "77SduHwNE",
:edit/time 1588436392753,
:edit/email "tangj1122@gmail.com"}
{:block/string "Comments",
:create/email "tangj1122@gmail.com",
:create/time 1588436392749,
:block/uid "euJ7vVPyc",
:edit/time 1588436393768,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1588436393763,
:block/uid "iYJ0ZIsls",
:edit/time 1588436393763,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1588436384376,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588436384378,
:node/title "Datalog",
:edit/time 1588436384387,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588436402185,
:node/title "Frank McSherry",
:block/children
[{:block/string "Frank ",
:create/email "tangj1122@gmail.com",
:create/time 1588436421887,
:block/uid "DWao4VP1u",
:edit/time 1588436429686,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1588436412842,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588436526148,
:node/title "The Web After Tomorrow",
:edit/time 1588436526152,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588437455357,
:node/title "3DF",
:edit/time 1588437455358,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588437926613,
:node/title "Differential Dataflow",
:edit/time 1588437926615,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588439696838,
:node/title
"It's About Time: An Introduction to [[Timely Dataflow]] | Clockworks",
:block/children
[{:block/string "Contents",
:create/email "tangj1122@gmail.com",
:create/time 1588439701737,
:block/children
[{:block/string
"how can we have asynchronous, parallel-processing properties (Kafka) while having nice database capabilities like joins, recursive queries, reverse-lookups (Datomic)",
:create/email "tangj1122@gmail.com",
:create/time 1588439721881,
:block/uid "dZolzuO6f",
:edit/time 1588439764008,
:edit/email "tangj1122@gmail.com"}
{:block/string "main mechanism: progress checking",
:create/email "tangj1122@gmail.com",
:create/time 1588439705875,
:block/uid "ZGFSkT9un",
:edit/time 1588439720611,
:edit/email "tangj1122@gmail.com"}
{:block/string "distributed cyclic computation",
:create/email "tangj1122@gmail.com",
:create/time 1588439720628,
:block/uid "IrISlszhs",
:edit/time 1588439776063,
:edit/email "tangj1122@gmail.com"}
{:block/string
"![](https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2FsV9KeZo4Wi.png?alt=media&token=a3af65d0-241b-4220-8641-7cc838be4f2b)",
:block/children
[{:block/string
"initial construction of a graph is on par with current technologies, with 1 core vs 128... ",
:create/email "tangj1122@gmail.com",
:create/time 1588439776060,
:block/uid "xlOdi4TfF",
:edit/time 1588440974727,
:edit/email "tangj1122@gmail.com"}
{:block/string
"but the crazy part is the update... the other technologies would have to recompute from scratch on an update",
:create/email "tangj1122@gmail.com",
:create/time 1588440979166,
:block/uid "s9AutxVS8",
:edit/time 1588440994787,
:edit/email "tangj1122@gmail.com"}],
:block/uid "zIGKXZ7wc",
:edit/time 1588440955970,
:edit/email "tangj1122@gmail.com"}
{:block/string
"[[Differential Dataflow]] is built on-top of [[Timely Dataflow]]",
:create/email "tangj1122@gmail.com",
:create/time 1588440994784,
:block/uid "9oL3fviT8",
:edit/time 1588441226836,
:edit/email "tangj1122@gmail.com"}
{:block/string
"![](https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2FtnAcezT7Xc.png?alt=media&token=e3a0977c-96c6-4810-9668-2e2fe28754ad)",
:block/uid "jQ5Y8RQRo",
:edit/time 1588441217993,
:edit/email "tangj1122@gmail.com"}],
:block/uid "sw9fCRAMV",
:edit/time 1588439705878,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1588439701210,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588439701211,
:node/title "Timely Dataflow",
:edit/time 1588439701212,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588445608727,
:node/title "Functional Programming",
:edit/time 1588445608729,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588446003576,
:node/title "design",
:edit/time 1588446003578,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588446058237,
:node/title "First Principles",
:edit/time 1588446058238,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588446408380,
:node/title "collective intelligence",
:edit/time 1588446408381,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588447082594,
:node/title "Good Artists Copy; Great Artists Steal",
:edit/time 1588447082595,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588448187032,
:node/title "Innovation",
:edit/time 1588448187033,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588448517460,
:node/title "Producing Open Source Software",
:block/children
[{:block/string
"source:: https://producingoss.com/html-chunk/index.html",
:create/email "tangj1122@gmail.com",
:create/time 1587755611323,
:block/uid "uLArFjTlS",
:edit/time 1587756532707,
:edit/email "tangj1122@gmail.com"}
{:block/string "Contents",
:create/email "tangj1122@gmail.com",
:create/time 1587756565086,
:block/children
[{:block/string "Intro",
:create/email "tangj1122@gmail.com",
:create/time 1587756567429,
:block/uid "hBS0duwwR",
:edit/time 1587756569693,
:edit/email "tangj1122@gmail.com"}
{:block/string "Getting Started",
:create/email "tangj1122@gmail.com",
:create/time 1587756569685,
:block/uid "obsNd-HXV",
:edit/time 1587756572729,
:edit/email "tangj1122@gmail.com"}
{:block/string "Technical Infrastructure",
:create/email "tangj1122@gmail.com",
:create/time 1587756572726,
:block/uid "lWzWvQ6aj",
:edit/time 1587756577724,
:edit/email "tangj1122@gmail.com"}
{:block/string "Social and Political Infrastructure",
:create/email "tangj1122@gmail.com",
:create/time 1587756577721,
:block/children
[{:block/string "Forkability",
:create/email "tangj1122@gmail.com",
:create/time 1587756760348,
:block/children
[{:block/string
"The paradoxical thing is that **the possibility of forks is usually a much greater force in free software projects than actual forks, which are very rare**. Because a fork is usually bad for everyone (for reasons examined in detail in the section called “Forks”), the more serious the threat of a fork becomes, the more willing people are to compromise to avoid it.",
:create/email "tangj1122@gmail.com",
:create/time 1587756885110,
:block/uid "SSQKv8d4g",
:edit/time 1587756898007,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Forks, or rather the potential for forks, are **the reason there are no true dictators in free software projects**. This may seem like a surprising claim, considering how common it is to hear someone called the \"dictator\" (sometimes softened to \"benevolent dictator\") in a given open source project. But this kind of dictatorship is special, quite different from the conventional understanding of the word. **Imagine a king whose subjects could copy his entire kingdom at any time and move to the copy to rule as they see fit. Would not such a king govern very differently from one whose subjects were bound to stay under his rule no matter what he did?** #BDFL",
:create/email "tangj1122@gmail.com",
:create/time 1587756898887,
:block/uid "EikUTk62b",
:edit/time 1587757105565,
:edit/email "tangj1122@gmail.com"}],
:block/uid "YI9plPzma",
:edit/time 1587756762265,
:edit/email "tangj1122@gmail.com"}
{:block/string "Benevolent Dictators",
:create/email "tangj1122@gmail.com",
:create/time 1587756762263,
:block/children
[{:block/string
"The __benevolent dictator__ model is exactly what it sounds like: **final decision-making authority rests with one person**, who, by virtue of personality and experience, is expected to use it wisely.",
:block/uid "EJBNPeAs7",
:edit/time 1587757194562,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Although \"benevolent dictator\" (or __BD__) is the standard term for this role, it would be **better to think of it as \"community-approved arbitrator\" or \"judge\".** Generally, benevolent dictators do not actually make all the decisions, or even most of the decisions. It's unlikely that one person could have enough expertise to make consistently good decisions across all areas of the project, and anyway, quality developers won't stay around unless they have some influence on the project's direction. Therefore, **benevolent dictators commonly do not dictate much. Instead, they let things work themselves out through discussion and experimentation whenever possible**. They participate in those discussions themselves, but as regular developers, often deferring to an area maintainer who has more expertise. Only when it is clear that no consensus can be reached, and that most of the group __wants__ someone to guide the decision so that development can move on, does she put her foot down and say \"This is the way it's going to be.\" **Reluctance to make decisions by fiat is a trait shared by almost all successful benevolent dictators; it is one of the reasons they manage to keep the role.**",
:block/uid "hYcNElUNT",
:edit/time 1587757246180,
:edit/email "tangj1122@gmail.com"}
{:block/string "Who Can Be a Good Benevolent Dictator?",
:create/email "tangj1122@gmail.com",
:create/time 1587757246632,
:block/children
[{:block/string
"Being a BD requires a combination of traits. It needs, first of all, a **well-honed sensitivity to one's own influence in the project, which in turn brings self-restraint**. In the early stages of a discussion, **one should not express opinions and conclusions with so much certainty** that others feel like it's pointless to dissent. **People must be free to air ideas, even stupid ideas**. It is inevitable that the BD will post a stupid idea from time to time too, of course, and therefore the role also requires **an ability to recognize and acknowledge when one has made a bad decision** — though this is simply a trait that __any__ good developer should have, especially if she stays with the project a long time. But the difference is that **the BD can afford to slip from time to time without worrying about long-term damage to her credibility**. Developers with less seniority may not feel so secure, so the BD should phrase critiques or contrary decisions with some sensitivity for how much weight her words carry, **both technically and psychologically.**",
:block/uid "Vp574UFQH",
:edit/time 1587757310099,
:edit/email "tangj1122@gmail.com"}
{:block/string
"The BD **does __not__ need to have the sharpest technical skills** of anyone in the project. She must be skilled enough to work on the code herself, and to understand and comment on any change under consideration, but that's all. **The BD position is neither acquired nor held by virtue of intimidating coding skills**. What __is__ important is **experience and overall design sense** — not necessarily the ability to produce good design on demand, but the ability to recognize and endorse good design, whatever its source.",
:block/uid "JCpuHZU3u",
:edit/time 1587757341165,
:edit/email "tangj1122@gmail.com"}
{:block/string
"It is **common for the benevolent dictator to be a founder of the project, but this is more a correlation than a cause**. The sorts of qualities that make one able to successfully start a project — technical competence, ability to persuade other people to join, and so on — are exactly the qualities any BD would need. And of course, founders start out with a sort of automatic seniority, which can often be enough to make benevolent dictatorship by the founder appear the path of least resistance for all concerned.",
:block/uid "8VOXRZ0Y1",
:edit/time 1587757361028,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Remember that the potential to fork goes both ways. A BD can fork a project just as easily as anyone else, and some have occasionally done so, when they felt that the direction they wanted to take the project was different from where the majority of other developers wanted to go. Because of forkability, it does not matter whether the benevolent dictator has control over the currently accepted \"master\" project repository. **People sometimes talk of repository control as though it were the ultimate source of power in a project, but in fact it is irrelevant**. The ability to add or remove people's commit passwords for one project on a particular hosting site affects only that copy of the project on that site. Prolonged abuse of that power, whether by the BD or someone else, would simply lead to development moving to a different copy of the project.",
:block/uid "FZY6F3Z9V",
:edit/time 1587757396418,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Whether your project should have a benevolent dictator, or would run better with some less centralized form of governance, largely depends on who is available to fill the role. **As a general rule, if it's simply obvious to everyone who should be the BD, then that's the way to go**. But if no candidate for BD is immediately obvious, then the project should probably use a decentralized decision-making process, as described in the next section.",
:block/uid "fI1WhlOA-",
:edit/time 1587757417161,
:edit/email "tangj1122@gmail.com"}],
:block/uid "BvjofM2Rf",
:edit/time 1587757247357,
:edit/email "tangj1122@gmail.com"}],
:block/uid "e_9zqpX8X",
:edit/time 1587757117479,
:edit/email "tangj1122@gmail.com"}
{:block/string "Consensus-based Democracy",
:create/email "tangj1122@gmail.com",
:create/time 1587756770971,
:block/uid "w8GhbhAVi",
:edit/time 1587757464102,
:edit/email "tangj1122@gmail.com"}],
:block/uid "JyuQAjNv0",
:edit/time 1587756585178,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Participating as a Business, Non-Profit, or Government Agency",
:create/email "tangj1122@gmail.com",
:create/time 1587756585175,
:block/children
[{:block/string "The Economics of Open Source",
:create/email "tangj1122@gmail.com",
:create/time 1587756723328,
:block/uid "M4jv7h_DW",
:edit/time 1587756729556,
:edit/email "tangj1122@gmail.com"}],
:block/uid "isVO9njEk",
:edit/time 1587756594836,
:edit/email "tangj1122@gmail.com"}
{:block/string "Communications",
:create/email "tangj1122@gmail.com",
:create/time 1587756594833,
:block/children
[{:block/string "Written Culture",
:create/email "tangj1122@gmail.com",
:create/time 1587756707645,
:block/children
[{:block/string
"**The ability to write clearly is perhaps the most important skill one can have in an open source environment. In the long run it matters more than programming talent.** A great programmer with lousy communications skills can get only one thing done at a time, and even then may have trouble convincing others to pay attention. But a lousy programmer with good communications skills can coordinate and persuade many people to do many different things, and thereby have a significant effect on a project's direction and momentum. #writing #leverage ",
:create/email "tangj1122@gmail.com",
:create/time 1587757540698,
:block/uid "WvNbVqf4Y",
:edit/time 1587757577881,
:edit/email "tangj1122@gmail.com"}
{:block/string
"**There does not seem to be much correlation, in either direction, between the ability to write good code and the ability to communicate with one's fellow human beings**. There is some correlation between programming well and describing technical issues well, but describing technical issues is only a tiny part of the communications in a project. ^^**Much more important is the ability to empathize with one's audience, to see one's own posts and comments as others see them, and to cause others to see their own posts with similar objectivity**^^. Equally important is noticing when a given medium or communications method is no longer working well, perhaps because it doesn't scale as the number of users increases, and taking the time to do something about it.",
:create/email "tangj1122@gmail.com",
:create/time 1587757593221,
:block/uid "JozlTeDuj",
:edit/time 1587757641565,
:edit/email "tangj1122@gmail.com"}
{:block/string
"All of which is obvious in theory — **what makes it hard in practice is that free software development environments are bewilderingly diverse both in audiences and in communications mechanisms**. Should a given thought be expressed in a post to the mailing list, as an annotation in the bug tracker, or as a comment in the code? When answering a question in a public forum, how much knowledge can you assume on the part of the reader, given that \"the reader\" is not only the one who asked the question in the first place, but all those who might see your response? How can the developers stay in constructive contact with the users, without getting swamped by feature requests, spurious bug reports, and general chatter? How do you tell when a medium has reached the limits of its capacity, and what do you do about it?",
:create/email "tangj1122@gmail.com",
:create/time 1587757622612,
:block/uid "E-WzciToK",
:edit/time 1587757689673,
:edit/email "tangj1122@gmail.com"}],
:block/uid "rcBo3bG9J",
:edit/time 1587756712533,
:edit/email "tangj1122@gmail.com"}
{:block/string "You Are What You Write",
:create/email "tangj1122@gmail.com",
:create/time 1587757486047,
:block/children
[{:block/string
"Don't fall into the trap of writing everything as though it were a cell phone text message. Write in complete sentences, capitalizing the first word of each sentence, and use paragraph breaks where needed. This is most important in emails and other composed writings. **In IRC or similarly ephemeral forums, it's generally okay to leave out capitalization, use compressed forms of common expressions, etc. Just don't carry those habits over into more formal, persistent forums**. Emails, documentation, bug reports, and other pieces of writing that are intended to have a **permanent life should be written using standard grammar and spelling, and have a coherent narrative structure**. This is not because there's anything inherently good about following arbitrary rules, but rather that these rules are __not__ arbitrary: they evolved into their present forms because they make text more readable, and you should adhere to them for that reason. Readability is desirable not only because it means more people will understand what you write, but because it makes you look like the sort of person who takes the time to communicate clearly: that is, someone worth paying attention to.",
:create/email "tangj1122@gmail.com",
:create/time 1587757774246,
:block/uid "oTM3BKCtI",
:edit/time 1587757799881,
:edit/email "tangj1122@gmail.com"}
{:block/string "Content",
:create/email "tangj1122@gmail.com",
:create/time 1587757962672,
:block/children
[{:block/string
"Wherever possible, your posts should provide information in the form most convenient for readers. If you have to spend an extra two minutes to dig up the URL to a particular thread in the mailing list archives, in order to save your readers the trouble of doing so, it's worth it. If you have to spend an extra 5 or 10 minutes summarizing the conclusions so far of a complex thread, in order to give people context in which to understand your post, then do so.",
:create/email "tangj1122@gmail.com",
:create/time 1587757806154,
:block/uid "8gn_IDzpT",
:edit/time 1587757896166,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Don't engage in hyperbole. Exaggerating in online posts is a classic arms race",
:create/email "tangj1122@gmail.com",
:create/time 1587757910159,
:block/children
[{:block/string
"Compared to other forms of miscommunication, hyperbole is not globally damaging — it hurts mainly the perpetrator. The recipients can compensate, it's just that the sender loses a little more credibility each time",
:create/email "tangj1122@gmail.com",
:create/time 1587757937871,
:block/uid "vsauM4tw2",
:edit/time 1587757938921,
:edit/email "tangj1122@gmail.com"}],
:block/uid "RWI2tVyY0",
:edit/time 1587757910535,
:edit/email "tangj1122@gmail.com"}
{:block/string
"__Edit twice.__ For any message longer than a medium-sized paragraph, reread it from top to bottom before sending it but after you think it's done the first time",
:create/email "tangj1122@gmail.com",
:create/time 1587757951562,
:block/uid "7cgmi6EeZ",
:edit/time 1587757952345,
:edit/email "tangj1122@gmail.com"}],
:block/uid "5-fP88Blq",
:edit/time 1587757964133,
:edit/email "tangj1122@gmail.com"}
{:block/string "Tone",
:create/email "tangj1122@gmail.com",
:create/time 1587757968299,
:block/children
[{:block/string
"A degree of terseness that would be unacceptable in normal social interactions is simply the default for free software hackers",
:create/email "tangj1122@gmail.com",
:create/time 1587757977090,
:block/uid "8ho4YtOhb",
:edit/time 1587758007910,
:edit/email "tangj1122@gmail.com"}
{:block/string
"A strategically placed smiley face or other emoticlue can often be enough to reassure an interlocutor, too.",
:create/email "tangj1122@gmail.com",
:create/time 1587758031567,
:block/uid "bi4kosStu",
:edit/time 1587758031835,
:edit/email "tangj1122@gmail.com"}],
:block/uid "YW9nGBeI1",
:edit/time 1587757977092,
:edit/email "tangj1122@gmail.com"}],
:block/uid "SwHnk4rUx",
:edit/time 1587757531097,
:edit/email "tangj1122@gmail.com"}],
:block/uid "1Q78vi8K4",
:edit/time 1587756597975,
:edit/email "tangj1122@gmail.com"}
{:block/string "Packaging, Releasing, and Daily Development",
:create/email "tangj1122@gmail.com",
:create/time 1587756597973,
:block/uid "ulwRvuhAV",
:edit/time 1587756616112,
:edit/email "tangj1122@gmail.com"}
{:block/string "Managing Participants",
:create/email "tangj1122@gmail.com",
:create/time 1587756605801,
:block/children
[{:block/string "Treat every user as a potential participant",
:create/email "tangj1122@gmail.com",
:create/time 1587756692104,
:block/uid "UOEIqY6aV",
:edit/time 1587756699540,
:edit/email "tangj1122@gmail.com"}
{:block/string "[[forking]]",
:create/email "tangj1122@gmail.com",
:create/time 1587756676409,
:block/uid "RVphAzsXC",
:edit/time 1587756691494,
:edit/email "tangj1122@gmail.com"}],
:block/uid "wJOoqyhmc",
:edit/time 1587756611306,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Legal Matters: Licenses, Copyrights, Trademarks, and Patents",
:create/email "tangj1122@gmail.com",
:create/time 1587756619615,
:block/children
[{:block/string "[[GNU GPL]]",
:create/email "tangj1122@gmail.com",
:create/time 1587756651534,
:block/uid "j9XuvGcaW",
:edit/time 1587756661112,
:edit/email "tangj1122@gmail.com"}],
:block/uid "iu7fgKHtp",
:edit/time 1587756628768,
:edit/email "tangj1122@gmail.com"}],
:block/uid "zNEPxEpyU",
:edit/time 1587756566788,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1588448517474,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588449950965,
:node/title "P2P",
:edit/time 1588449950978,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588450268465,
:node/title "Game Theory",
:edit/time 1588450268478,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588450268465,
:node/title "Evolutionary Biology",
:edit/time 1588450268478,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588451384581,
:node/title "Self-Organization",
:edit/time 1588451384583,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588451396247,
:node/title "Self-Selection",
:edit/time 1588451396248,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588451556652,
:node/title "Netscape",
:edit/time 1588451556655,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588451562592,
:node/title "Mozilla",
:edit/time 1588451562593,
:edit/email "tangj1122@gmail.com"}
{:node/title "May 3rd, 2020",
:block/children
[{:block/string "[[Athens Change Log]]",
:create/email "tangj1122@gmail.com",
:create/time 1588510671853,
:block/children
[{:block/string "[[Querying Datalog from a Cursive REPL]]",
:create/email "tangj1122@gmail.com",
:create/time 1588544361713,
:block/uid "RWUgvw9Zo",
:edit/time 1588544493500,
:edit/email "tangj1122@gmail.com"}],
:block/uid "N756Cul_q",
:edit/time 1588510675081,
:edit/email "tangj1122@gmail.com"}
{:block/string "[[[[Convival Computing Salon]] 2020]]",
:create/email "tangj1122@gmail.com",
:create/time 1588518840495,
:block/uid "snK_hWLmI",
:edit/time 1588518962335,
:edit/email "tangj1122@gmail.com"}
{:block/string
"[[The Origins of Pattern Theory, The Future of the Theory, and The Generation of a Living World]]",
:create/email "tangj1122@gmail.com",
:create/time 1588518969508,
:block/uid "mFud44xgS",
:edit/time 1588532861598,
:edit/email "tangj1122@gmail.com"}
{:block/string "[[A City is Not a Tree]]",
:create/email "tangj1122@gmail.com",
:create/time 1588532887068,
:block/uid "L0Rwb58EM",
:edit/time 1588544360443,
:edit/email "tangj1122@gmail.com"}],
:edit/time 1588457029768,
:edit/email "eloi.poch@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588518953629,
:node/title "Convival Computing Salon",
:edit/time 1588518962340,
:edit/email "tangj1122@gmail.com"}
{:create/email "tangj1122@gmail.com",
:create/time 1588518962337,
:node/title "[[Convival Computing Salon]] 2020",
:block/children
[{:block/string "type:: event",
:create/email "tangj1122@gmail.com",
:create/time 1588519051749,
:block/uid "zKNX0mJ3M",
:edit/time 1588519057505,
:edit/email "tangj1122@gmail.com"}
{:block/string
"source:: https://docs.google.com/spreadsheets/d/1tuyRit9qQN1kwckS3rND8GmvSKPo-qBJW8aroEIwFt8/edit#gid=0",
:create/email "tangj1122@gmail.com",
:create/time 1588519057595,
:block/uid "y14kL28pR",
:edit/time 1588519063943,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1588519065567,
:block/uid "mI2236tOr",
:edit/time 1588519065567,
:edit/email "tangj1122@gmail.com"}
{:block/string
"[[Wildcard]]: Spreadsheet-Driven Customization of Web Applications",
:create/email "tangj1122@gmail.com",
:create/time 1588518993207,
:block/children
[{:block/string "[[Geoffrey Litt]], Daniel Jackson",
:create/email "tangj1122@gmail.com",
:create/time 1588518871793,
:block/uid "iPSQxCa08",
:edit/time 1588694433101,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1588694434993,
:block/uid "gT2izuAL2",
:edit/time 1588694434993,
:edit/email "tangj1122@gmail.com"}
{:block/string
"How to customize multiple websites with one extension?",
:create/email "tangj1122@gmail.com",
:create/time 1588694700566,
:block/uid "AElfoBjQS",
:edit/time 1588694723531,
:edit/email "tangj1122@gmail.com"}
{:block/string "Instacart shopping cart very limited UI",
:create/email "tangj1122@gmail.com",
:create/time 1588694678991,
:block/children
[{:block/string
"no sorting on any attributes: price, name, quantity",
:create/email "tangj1122@gmail.com",
:create/time 1588694770971,
:block/uid "DN42n2LEf",
:edit/time 1588694811285,
:edit/email "tangj1122@gmail.com"}],
:block/uid "dw75ijn_Q",
:edit/time 1588694777601,
:edit/email "tangj1122@gmail.com"}
{:block/string "Wildcard",
:create/email "tangj1122@gmail.com",
:create/time 1588694812595,
:block/children
[{:block/string "arbitrary sorting",
:create/email "tangj1122@gmail.com",
:create/time 1588694818353,
:block/uid "rKxfAsdCy",
:edit/time 1588694877203,
:edit/email "tangj1122@gmail.com"}
{:block/string "note-taking",
:create/email "tangj1122@gmail.com",
:create/time 1588694821120,
:block/uid "kFKQnIlBg",
:edit/time 1588694824148,
:edit/email "tangj1122@gmail.com"}
{:block/string "spreadsheet <> UI 2-way data binding",
:create/email "tangj1122@gmail.com",
:create/time 1588694878151,
:block/uid "-It-ZFLrO",
:edit/time 1588694885796,
:edit/email "tangj1122@gmail.com"}
{:block/string
"saved in localStorage - sorting and notes stored",
:create/email "tangj1122@gmail.com",
:create/time 1588694847214,
:block/uid "EOd37RYTH",
:edit/time 1588694859343,
:edit/email "tangj1122@gmail.com"}
{:block/string
"groupBy department name not possible in UI, but the data is there. can use that too",
:create/email "tangj1122@gmail.com",
:create/time 1588694887551,
:block/uid "FIHV60avR",
:edit/time 1588694971262,
:edit/email "tangj1122@gmail.com"}],
:block/uid "D6tF-dqEd",
:edit/time 1588694818359,
:edit/email "tangj1122@gmail.com"}
{:block/string "System Architecture",
:create/email "tangj1122@gmail.com",
:create/time 1588694965185,
:block/children
[{:block/string
"![](https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2FR9A5IAzZFx.png?alt=media&token=c28918bb-3efc-44f2-ab99-aba4ef4ac31e)",
:block/uid "bxvXfMEVy",
:edit/time 1588695342459,
:edit/email "tangj1122@gmail.com"}
{:block/string "Site adapter",
:create/email "tangj1122@gmail.com",
:create/time 1588695016827,
:block/children
[{:block/string
"does require some scraping scripts, hopefully eventually an open library of these",
:create/email "tangj1122@gmail.com",
:create/time 1588695085208,
:block/uid "iS26omMxq",
:edit/time 1588695107126,
:edit/email "tangj1122@gmail.com"}],
:block/uid "UQsANLdyk",
:edit/time 1588695031236,
:edit/email "tangj1122@gmail.com"}
{:block/string "Formulas",
:create/email "tangj1122@gmail.com",
:create/time 1588695107122,
:block/children
[{:block/string
"Estimating HackerNews article read time using ReadTimeInSeconds API, then rendering these labels on the homepage itself",
:create/email "tangj1122@gmail.com",
:create/time 1588695445196,
:block/children
[{:block/string
"![](https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2FQ72vLVhUGP.png?alt=media&token=df853ad9-a790-4dd4-babf-a85828b4375d)",
:block/uid "eOonYUSG-",
:edit/time 1588695760951,
:edit/email "tangj1122@gmail.com"}],
:block/uid "f6GCKM4G-",
:edit/time 1588695508619,
:edit/email "tangj1122@gmail.com"}],
:block/uid "rrJVwnukh",
:edit/time 1588695442970,
:edit/email "tangj1122@gmail.com"}
{:block/string "Cell Editors",
:create/email "tangj1122@gmail.com",
:create/time 1588695442965,
:block/children
[{:block/string "polymorphic user interface instruments",
:create/email "tangj1122@gmail.com",
:create/time 1588695551463,
:block/uid "5qjRF-aY5",
:edit/time 1588695556691,
:edit/email "tangj1122@gmail.com"}
{:block/string
"each text editor on the internet is different. can we use the same one on all websites?",
:create/email "tangj1122@gmail.com",
:create/time 1588695604224,
:block/uid "EbY_dm0sv",
:edit/time 1588695653814,
:edit/email "tangj1122@gmail.com"}
{:block/string
"using your own Google calendar as a date picker for each website that has a date picker",
:create/email "tangj1122@gmail.com",
:create/time 1588695653971,
:block/uid "qZe96CD4A",
:edit/time 1588695687876,
:edit/email "tangj1122@gmail.com"}],
:block/uid "goy3ryC9S",
:edit/time 1588695444977,
:edit/email "tangj1122@gmail.com"}],
:block/uid "y3v2zS3Wm",
:edit/time 1588695016837,
:edit/email "tangj1122@gmail.com"}
{:block/string "Design Principles",
:create/email "tangj1122@gmail.com",
:create/time 1588695690033,
:block/children
[{:block/string "expose universal structure",
:create/email "tangj1122@gmail.com",
:create/time 1588695701314,
:block/children
[{:block/string "structure",
:create/email "tangj1122@gmail.com",
:create/time 1588695790518,
:block/children
[{:block/string "e.g. Unix",
:create/email "tangj1122@gmail.com",
:create/time 1588695705274,
:block/uid "n_4LZixJN",
:edit/time 1588695762149,
:edit/email "tangj1122@gmail.com"}
{:block/string "Wildcard: flat table",
:create/email "tangj1122@gmail.com",
:create/time 1588695731575,
:block/uid "7ufoynuDn",
:edit/time 1588695753096,
:edit/email "tangj1122@gmail.com"}
{:block/string "very simple, e.g. not Semantic Web",
:create/email "tangj1122@gmail.com",
:create/time 1588695762977,
:block/uid "Ft0LhrCvL",
:edit/time 1588695767122,
:edit/email "tangj1122@gmail.com"}
{:block/string "one to many?",
:create/email "tangj1122@gmail.com",
:create/time 1588695775351,
:block/uid "awm48zR8D",
:edit/time 1588695777169,
:edit/email "tangj1122@gmail.com"}
{:block/string
"unified schema / JOIN across multiple websites",
:create/email "tangj1122@gmail.com",
:create/time 1588695777162,
:block/uid "ZOhewHv8v",
:edit/time 1588695786616,
:edit/email "tangj1122@gmail.com"}],
:block/uid "pd9WrtOnt",
:edit/time 1588695792590,
:edit/email "tangj1122@gmail.com"}
{:block/string "universal",
:create/email "tangj1122@gmail.com",
:create/time 1588695786612,
:block/children
[{:block/string "e.g. not AppleScript",
:create/email "tangj1122@gmail.com",
:create/time 1588695802389,
:block/uid "Emi33J7kH",
:edit/time 1588695823863,
:edit/email "tangj1122@gmail.com"}
{:block/string "start with data, not UI",
:create/email "tangj1122@gmail.com",
:create/time 1588695838261,
:block/uid "sSkvorTXP",
:edit/time 1588695840716,
:edit/email "tangj1122@gmail.com"}],
:block/uid "oeZVenvMF",
:edit/time 1588695802413,
:edit/email "tangj1122@gmail.com"}],
:block/uid "fDSSpqOQZ",
:edit/time 1588695705279,
:edit/email "tangj1122@gmail.com"}
{:block/string "design for community of users",
:create/email "tangj1122@gmail.com",
:create/time 1588695840712,
:block/children
[{:block/string
"![](https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2Fego%2Fr8JIT1xRVx.png?alt=media&token=dbc64eab-4ee3-4561-8ade-f810c8d3ed17)",
:block/uid "1O9Iy8zK9",
:edit/time 1588695886227,
:edit/email "tangj1122@gmail.com"}
{:block/string
"programmers should not be constraining casual end users, who are can put the plugins together like building blocks",
:create/email "tangj1122@gmail.com",
:create/time 1588695850187,
:block/uid "798QO_DYA",
:edit/time 1588695974019,
:edit/email "tangj1122@gmail.com"}],
:block/uid "3nS7Ta7CZ",
:edit/time 1588695850193,
:edit/email "tangj1122@gmail.com"}
{:block/string "[[Low floor, high ceiling]]",
:create/email "tangj1122@gmail.com",
:create/time 1588695977189,
:block/children
[{:block/string
"What if there are completely new UIs for each website haha",
:create/email "tangj1122@gmail.com",
:create/time 1588695992726,
:block/uid "sW-MiQ92J",
:edit/time 1588696058550,
:edit/email "tangj1122@gmail.com"}],
:block/uid "9k3SQnivx",
:edit/time 1588695992733,
:edit/email "tangj1122@gmail.com"}],
:block/uid "9lKc3vsoa",
:edit/time 1588695700209,
:edit/email "tangj1122@gmail.com"}
{:block/string
"Response by [Mariana Mărășoiu](https://mariana.marasoiu.com/research/): There's something interesting about spreadsheets",
:create/email "tangj1122@gmail.com",
:create/time 1588696382286,
:block/children
[{:block/string "intermediate results",
:create/email "tangj1122@gmail.com",
:create/time 1588697013552,
:block/uid "V_UWpDI06",
:edit/time 1588697016882,
:edit/email "tangj1122@gmail.com"}
{:block/string "continuous execution",
:create/email "tangj1122@gmail.com",
:create/time 1588697016875,
:block/uid "AN3NIMZCQ",
:edit/time 1588697021859,
:edit/email "tangj1122@gmail.com"}
{:block/string "integration of input, output, program",
:create/email "tangj1122@gmail.com",
:create/time 1588697021855,
:block/uid "vu27AqStM",
:edit/time 1588697026287,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1588697027107,
:block/uid "RoAjWKJ45",
:edit/time 1588697027107,
:edit/email "tangj1122@gmail.com"}
{:block/string "Tabular Canvas",
:create/email "tangj1122@gmail.com",
:create/time 1588696379924,
:block/children
[{:block/string
"drag-and-fill encourages this. basically a copy+paste",
:create/email "tangj1122@gmail.com",
:create/time 1588696397711,
:block/uid "DPOiN5Vms",
:edit/time 1588696874574,
:edit/email "tangj1122@gmail.com"}],
:block/uid "KATxdxLx0",
:edit/time 1588696382296,
:edit/email "tangj1122@gmail.com"}
{:block/string
"cell reference naming schema given to user, e.g. A1",
:create/email "tangj1122@gmail.com",
:create/time 1588696405677,
:block/children
[{:block/string "deixis?",
:create/email "tangj1122@gmail.com",
:create/time 1588696578691,
:block/uid "o6JtO8FiD",
:edit/time 1588696585277,
:edit/email "tangj1122@gmail.com"}],
:block/uid "N4nSODLZM",
:edit/time 1588696577461,
:edit/email "tangj1122@gmail.com"}
{:block/string "primary and secondary notation basically same",
:create/email "tangj1122@gmail.com",
:create/time 1588696585271,
:block/children
[{:block/string
"whitespace, formatting, comments have meaning",
:create/email "tangj1122@gmail.com",
:create/time 1588696714498,
:block/uid "3twGiz9sW",
:edit/time 1588696799479,
:edit/email "tangj1122@gmail.com"}
{:block/string "can have multiple datasets in one sheet",
:create/email "tangj1122@gmail.com",
:create/time 1588696719225,
:block/children
[{:block/string "freeing and dangerous",
:create/email "tangj1122@gmail.com",
:create/time 1588696736135,
:block/uid "LdCAOQ-Zg",
:edit/time 1588696765873,
:edit/email "tangj1122@gmail.com"}],
:block/uid "1Ke299OQW",
:edit/time 1588696736119,
:edit/email "tangj1122@gmail.com"}],
:block/uid "kxb-2LFit",
:edit/time 1588696689138,
:edit/email "tangj1122@gmail.com"}
{:block/string "input is editable",
:create/email "tangj1122@gmail.com",
:create/time 1588696880528,
:block/children
[{:block/string "very easy to generate data, do \"what if\"s",
:create/email "tangj1122@gmail.com",
:create/time 1588696884119,
:block/uid "Z2FLD7U-q",
:edit/time 1588696962679,
:edit/email "tangj1122@gmail.com"}
{:block/string "",
:create/email "tangj1122@gmail.com",
:create/time 1588696962676,
:block/uid "qJuVu3iJX",
:edit/time 1588696962676,
:edit/email "tangj1122@gmail.com"}],
:block/uid "877hknDdr",
:edit/time 1588696884125,
:edit/email "tangj1122@gmail.com"}],
:block/uid "x6YuQiIu9",
:edit/time 1588698360587,
:edit/email "tangj1122@gmail.com"}
{:block/string "Questions",
:create/email "tangj1122@gmail.com",
:create/time 1588697369933,
:block/children
[{:block/string
"maintainability? websites could update at a moments notice",
:create/email "tangj1122@gmail.com",
:create/time 1588697370823,
:block/uid "TGOGBmbzy",
:edit/time 1588697378589,
:edit/email "tangj1122@gmail.com"}
{:block/string
"can you track interactions, or trigger interaction from table",
:create/email "tangj1122@gmail.com",
:create/time 1588697378571,
:block/children
[{:block/string
"track - how long you look at each IG post lol",
:create/email "tangj1122@gmail.com",
:create/time 1588697737094,
:block/uid "41YSul7WZ",
:edit/time 1588697786707,
:edit/email "tangj1122@gmail.com"}
{:block/string
"trigger - e.g. favorite 5 AirBnbs at once batched rather than one by one",
:create/email "tangj1122@gmail.com",
:create/time 1588697708665,
:block/uid "xG4ZCBx58",
:edit/time 1588697754312,
:edit/email "tangj1122@gmail.com"}],
:block/uid "QKN7KgXDd",
:edit/time 1588697708036,
:edit/email "tangj1122@gmail.com"}
{:block/string
"adversarial - scraping pricing is something that websites go to great length to prevent",
:create/email "tangj1122@gmail.com",
:create/time 1588697892684,
:block/uid "JD7sol24n",
:edit/time 1588697909283,
:edit/email "tangj1122@gmail.com"}
{:block/string
"browsers themselves are not un-adversarial. APIs for Firefox/Chrome extensions prone to change",
:create/email "tangj1122@gmail.com",
:create/time 1588698012003,
:block/uid "63SD1wICE",
:edit/time 1588698047167,
:edit/email "tangj1122@gmail.com"}
{:block/string "helena-lang.org for example-driven coding: ",
:create/email "tangj1122@gmail.com",
:create/time 1588698278882,
:block/children
[{:block/string "using multiple paths",
:create/email "tangj1122@gmail.com",
:create/time 1588698286969,
:block/uid "fWaF5vAoY",
:edit/time 1588698291579,
:edit/email "tangj1122@gmail.com"}],
:block/uid "3TnResETX",
:edit/time 1588698293368,
:edit/email "tangj1122@gmail.com"}],
:block/uid "EarpJtJSt",
:edit/time 1588697370831,
:edit/email "tangj1122@gmail.com"}],
:block/uid "ZoTYtRpmq",
:edit/time 1588694428568,
:edit/email "tangj1122@gmail.com"}
{:block/string "Bicycles for the mind have to be see-through",
:create/email "tangj1122@gmail.com",
:create/time 1588518998144,
:block/children
[{:block/string "Kartik Agaram",
:cr
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment