• Steven Wolfram - Seeking the Productive Life - Literary Notes

    I read about Steven Wolfram’s personal infrastructure. He develops his approach to just about everything using the tools that he built. I’m guessing this approach works great for building Wolfram as a giant feedback loop but not directly transferable to others.

    Some of the ideas I liked were combining emails and notebooks as primary sources for working on various projects. The starting point and rallying point for all his work are notebooks though.

    Over the years, Iโ€™ve accumulated over a hundred thousand notebooks, representing product designs, plans, research, writings, and, basically, everything I do. All these notebooks are ultimately stored in my filesystem (yes, I sync with the cloud, use cloud files, and file servers, etc.) And I take pains to keep my filesystem organizedโ€”with the result I can typically find any notebook Iโ€™m looking for just by navigating my filesystem, faster than I could formulate a search for it.

    He files them all manually using a simple strategy of active vs archive laid out as projects. The filenames themselves are ordered but that’s about the extent of the filing schema.

    That seems like a more useful way of organizing things (what am I trying to do? or what am I trying to answer?) rather than generic buckets of “work”, “personal”, and “refile” like I use. Maybe it’s time to start bucketing things more intentionally (though for org-roam, I’ll stick with structure notes for that) and stop worrying about cross listing.

    He also talks about writing in notebooks, mixing them with screen captures and sometimes running computations in them. This reminds me of org-mode and using org-babel to evaluate code and display the results in the document (or even in-line using org-macros).

    There is an extensive indexing system he uses for personal search. This includes emails and notebooks, which again, seems very useful than the disjointed experience most of us have because our digital lives are siloed. He seems to have solved that for himself and building a company to do it (half joking).

    Then there is a personal dashboard that serves as a jumping off point between all of his resources that he revisits many times per day. I find that using org-agenda for work is starting to serve a similar role (for example, listing goals as well as tasks).


  • Some Brain Functions Might Be Quantum Processes

    An experiment suggests that quantum processes (entanglement) might be used by brain functions which could explain memory performance and conscious awareness.

    The researchers used a quantum gravity experiment to measure the proton spins in ‘brain water’ using an MRI. They deduced that the likely explanation for entanglement they observed is that the brain must have quantum process mediating it.

    If the brain has quantum processes the implications for AI research and quantum computing could be huge. The two fields might be more closely linked than we thought.

    See also:

    • This sort reminds me of the book Hard-Boiled Wonderland and the End of the Worldโ€”if the multiverse theory is correct, might we experience infinity in our thoughts?

  • Org-Mode Inline Macro in the Buffer

    In org-mode, macros can be used to expand text but are only visible when exported. However, by combining org-macro and emacs' built in font-locking system, you can expand macros inline in the buffer.

    For example, here’s a macro that expands to the text returned by an elisp expression which gets today’s date. In the buffer, you don’t get to see the expanded value (though it does show up if you export it).

    #+MACRO: today (eval (format-time-string "%m-%d-%Y"))
    
    * Today's date is {{{today}}}
    

    Adding the following to your init.el tells emacs to font-lock text in org-mode buffers when it sees triple curly braces. Using the display overrides the text shown when there is a match. Then the macro is expanded programatically the same way (for the most part) org-mode does it during export.

    ;; Display macros inline in buffers
    (add-to-list 'font-lock-extra-managed-props 'display)
    
    (font-lock-add-keywords
     'org-mode
     '(("\\({{{[a-zA-Z#%)(_-+0-9]+}}}\\)" 0
        `(face nil display
               ,(format "%s"
                        (let* ((input-str (match-string 0))
                              (el (with-temp-buffer
                                    (insert input-str)
                                    (goto-char (point-min))
                                    (org-element-context)))
                              (text (org-macro-expand el org-macro-templates)))
                          (if text
                              text
                            input-str)))))))
    

    Now you can see the macro expansion inline in the buffer.

    #+MACRO: today (eval (format-time-string "%m-%d-%Y"))
    
    * Today's date is 2022-10-29
    

  • You Can't Be Normal and Expect Abnormal Returns

    This quote by Jeffrey Pfeffer, professor at Stanford GSB, sums up the difficulty of achieving something different by doing the same things. You can apply this to “success” or any venture really. For example, it’s highly unlikely that Tony Hawk became the best skateboarder ever by living a conventional life.

    There is an important nuance that I think people forgetโ€”it’s not about personality, it’s about behavior. Emulating Steve Jobs personality completely misses the point, his moodiness and assholery did not a good product make. It was the cultivation of taste and building a cathedral with maniacal focus and decision making. He was extreme, but I highly doubt being an asshole was the essential part.

    See also:


  • Using Org-Agenda for Work

    This is a work-in-progress as I’m still refining an org-agenda centric workflow. Here’s what I’ve learned so far.

    The key problem I think this system should solve is 1) trust that something wasn’t lost or forgotten 2) what to do next. Everything else is nice to have.

    You can’t get everything into org-mode. There will always be some incompatibility like getting your calendar synced using GCal. If you don’t accept that, you’ll never actually use it.

    The default org-agenda has too much stuff going on if you have 100s of items. I realized I need multiple views of the same things to keep focus. One for the day and another for a fortnight. I look at the day view the most because it has mercifully few items. I look at the fortnight view to think ahead and plan.

    Having separate org files is a bit cumbersome. It’s best to always use org-agenda to interface with tasks. Otherwise, there is a lot of manual file opening and searching.

    Including goals at the top of the agenda to help focus my attention on what matters. I wrote a small function to inline macros in the buffer so I can see things like how many days are left to hit the goal.


  • Bill Belichick on Long Snappers

    I watched a press conference of Bill Belichick being asked about long snappers and whether it’s worth having a dedicated roster spot for a specialist. I don’t particularly care about this but I was struck by how thorough and detailed Bill’s answer was.

    He explains how the league started with more generalistsโ€”players who could do special teams and long snap. As strategies changed, it became more important to have a specialist long snapper who could block. If you saved a roster spot by having a player who performs more than one role well, there is a risk they could be injured. The league evolved to specialized roles for punters, kickers, and long snappers as a result.

    I watched all 10+ minutes of it because it reminds me there is infinite detail in just about everything. Things can seem so simple and but is more likely a failure of imagination of how deep it goes.


  • UI Rule of One

    There should only be one primary action the user can take on the screen at a time. When there is more than one action to take it becomes confusing. Which should I do first (ordering)? Which am I supposed to do (decisions)?

    As a simple analogy, think of the difference between a plane’s cockpit and a soap dispenser. The former is filled with knobs and switches for all sorts of functions, the latter has only one thing you can doโ€”get soap.

    If you want to make UI feel intuitive, requiring little to no explanation, distilling the interface into a series of single actions (choices) is your best bet.

    That doesn’t mean there isn’t a place for more complicated interfaces, but if you see this happening, you’ll know it increases the level of understanding needed by new users.


  • Tag Vocabulary

    Tags are used to create heterarchical systems that lets you iterate on retrieval. The tag names are abstractions like categories, projects, or ideas that are encoded on top of a set of items (like notes) to make it easy to find later.

    A built-in assumption with tag-based systems is that you will use tags consistentlyโ€”a tag vocabulary. That’s why tags are much easier to develop individually than as a group. It’s easier to map your way of retrieving information than having others agree on how to collectively retrieve information. Twitter hashtags are the exception, but I would argue these are a form of Schelling points.

    See also:

    • org-mode uses projects (hierarchy) and tags (heterarchy) to manage large numbers of tasks
    • My tag vocabulary is used for driving functionality rather than organizing topics

  • Schelling Point

    Coordination in the absence of communication. For example, two players in a game can’t talk to each other but they want to team up for a quest. They show up at a time that seems most likely (noon) on a day that is most likely (New Years) in a place that’s most likely (an inn). This works because people can use the shared context of their world to superimpose coordination.


  • List of Boring Technology

    The following list of things are my choices for boring technology.

    Backend programming languages:

    • Python
      • Frameworks:
        • Django
        • FastAPI
      • Package manager
        • pip

    Frontend programming languages:

    • Javascript (TypeScript is nearly there)
      • Frameworks:
        • React
        • React router
      • Package manager
        • npm
        • Use create-react-app for as along as humanly possible

    Databases:

    • Postgres
    • MySQL
    • Redis

    Deployment:

    • Ansible

    Hosting:

    • AWS

    Notes:

    • I’m hoping terraform to become boring. It looks like more engineers have experience with it, but few have set it up from scratch.
    • There are no boring package managers or build tools for the JavaScript ecosystem.
    • Redis used to be novel, but now it’s boring which is good. Try not to use it in novel ways though.

  • Founders Should Write the Check for All Expenses

    For as long as possible, in an early-stage startup, one of the founders should write the check for any expenses of the company. That includes payroll, vendors, SaaS subscriptions, professional services, and how much you’re paying accountants and bookkeepers (whom you may incorrectly think are looking out for the company’s cash).

    The reason this is so important is that expenses tend to grow very rapidly as the company grows. Left unchecked, you can get surprised by large bills and overpay for a long time. Every dollar going out is a dollar less in runway.

    It takes money to grow, but startup failure is nearly always due to running out of money. Shouldn’t you keep an eye on that?

    See also:


  • Getting to 1,000 Clicks per Month in Google Search

    My personal site now gets 1,000 clicks per month from Google searches. It took two and half years of consistently adding content nearly every day to get to this point. There are 884 pages indexed by Google and 186 that are not (for mysterious reasons). It takes ~24k impressions to deliver 1,000 clicks. The majority of the content comes from my published notes rather than longer form content like blog posts or essays.

    It’s kind of incredible how much content is needed to generate a comparatively small amount of traffic through SEO. This could be because the things I write about tend to be fairly niche and far ranging in topic.

    See also:


  • Using Grammarly With Emacs

    There’s now an official API for Grammarly and a language server. That means we can use eglot to get Grammarly in Emacs buffers. Here’s the setup which mostly works.

    Update: Grammarly announced they are discontinuing the API so this won’t work after January 10th, 2024. There are no good replacements. If I find one, I’ll add it here.

    You can get an Grammarly API client ID by creating an app here.

    Build the Grammarly VSCode extension:

    git clone git@github.com:znck/grammarly.git
    cd grammarly
    # Install pnpm if you don't have it installed already
    npm install -g pnpm
    # Build the extension and language server
    pnpm build
    

    Wrap the node based language server in a script:

    #!/bin/sh
    node /{PATH TO REPO}/grammarly/extension/dist/server/index.node.js --stdio
    

    Add it to the path or copy it to a global bin:

    cp /{PATH TO REPO}/grammarlylsp /usr/local/bin/grammarlylsp
    # Make it executable
    chmod +x grammarlylsp
    

    Configure eglot to use it when in markdown mode:

    (defclass eglot-grammarlylsp (eglot-lsp-server) ()
      :documentation "Grammarly Language Server.")
    
    (cl-defmethod eglot-initialization-options ((server eglot-grammarlylsp))
      "Passes the initializationOptions required to run
       the server."
      `(:clientId "{GRAMMARLY API CLIENT ID HERE"))
    
    (add-to-list 'eglot-server-programs
                 `(markdown-mode . (eglot-grammarlylsp ,(executable-find "grammarlylsp"))))