8451170c78fd834e6f3d43a3f1b3d14edd43921b — Andrew Zah 3 months ago 704923f
update shortcodes, refactor
M .gitignore => .gitignore +1 -0
@@ 5,3 5,4 @@ secret.env
  /public
  gutenberg
+ .env

M content/posts/008_programming_korean/index.md => content/posts/008_programming_korean/index.md +6 -6
@@ 27,14 27,14 @@ ]
  +++
  
- I was inspired to write this after reading *German for Programmers*.{{cite(num=0)}} It's quite likely that I'm just biased to see things a certain way because I work with programming languages for a living, but I often find myself drawing comparisons among Korean and programming.
+ I was inspired to write this after reading *German for Programmers*.{{cite(n=0)}} It's quite likely that I'm just biased to see things a certain way because I work with programming languages for a living, but I often find myself drawing comparisons among Korean and programming.
  
  <!-- more -->
  
  ## Hangeul Basics
  Before we can get into grammar, some explanation about Hangeul–the Korean alphabet–is needed. Korean is actually like English in that letters are put together, so you can read any Korean once you learn Hangeul. However, Korean letters join together in syllable blocks.
  
- You may have seen the infamous "Learn how to read Hangeul in 10 minutes" graphic. While Hangeul is indeed very easy to learn, it does have exceptions–quite a few actually. So maybe you can read 독립 (independence), but the actual pronunciation is different from what's written due to ㄹ following ㄱ. These are called 받침{{cite(num=1)}} rules and one just has to memorize 'em.
+ You may have seen the infamous "Learn how to read Hangeul in 10 minutes" graphic. While Hangeul is indeed very easy to learn, it does have exceptions–quite a few actually. So maybe you can read 독립 (independence), but the actual pronunciation is different from what's written due to ㄹ following ㄱ. These are called 받침{{cite(n=1)}} rules and one just has to memorize 'em.
  
  ### Grid System
  Unlike Chinese or Japanese, Korean syllable blocks take the Hangeul letters and make them into grids in a particular order.


@@ 48,7 48,7 @@   Some vowels can also be combined: `ㅚ` is `ㅜ` + `ㅣ`, `ㅙ` is `ㅗ` + `ㅐ`.
  
- For Korean fonts, all finished blocks (e.g. 쀍: ㅃㅜㅔㄹㄱ) have to be included because it's possible to construct them via grid rules, but a fair amount are just gibberish. Hangeul is represented by 5 unicode blocks in total and I recommend reading about how they get composed together.{{cite(num=2)}}
+ For Korean fonts, all finished blocks (e.g. 쀍: ㅃㅜㅔㄹㄱ) have to be included because it's possible to construct them via grid rules, but a fair amount are just gibberish. Hangeul is represented by 5 unicode blocks in total and I recommend reading about how they get composed together.{{cite(n=2)}}
  
  ## Subject Elision, especially -you-
  


@@ 221,7 221,7 @@ But what if you wanted to talk *about* that person? You could say "the girl *who* walked to school". In English, this these are known as relative causes. They can begin with `who`, `which`, `that`, `where`, etc, *following* the noun. Korean uses the `~는 것` nominalizer *before* the noun, which leads to:
  
  <p>
-   {{hll(c="pink", t="학교")}}{{hlrw(c="purple", t="로")}} {{hlw(c="blue",t="걸어")}} {{hlw(c="orange",t="간")}} {{hlrw(c="green",t="여자")}}!{{footnote(num=0)}}
+   {{hll(c="pink", t="학교")}}{{hlrw(c="purple", t="로")}} {{hlw(c="blue",t="걸어")}} {{hlw(c="orange",t="간")}} {{hlrw(c="green",t="여자")}}!{{fn(n=0)}}
  </p>
  
  Not that one would only say "the girl who walked to school" by itself, but we can now use the entire construct as a noun in other sentences:


@@ 289,11 289,11 @@ }
  ```
  
- Korean has seven speech levels {{cite(num=4)}}. When learning Korean, the `아/어/여요` and `~ㅂ/습니다` levels are commonly used, in that order. Using `아/어/여` (no `요`) to anyone other than close friends (who have agreed to use lowered speech) or young kids is rude. Foreigners get a pass at first but it's still impolite.
+ Korean has seven speech levels {{cite(n=4)}}. When learning Korean, the `아/어/여요` and `~ㅂ/습니다` levels are commonly used, in that order. Using `아/어/여` (no `요`) to anyone other than close friends (who have agreed to use lowered speech) or young kids is rude. Foreigners get a pass at first but it's still impolite.
  
  Plain (sometimes known as diary) form is also used, such as in diaries and books/novels.
  
- English lacks this concept, as we use the same conjugation for everyone – "the prisoner ate", "the king ate", and "a God ate". What English does have is different registers{{cite(num=5)}}, such as when you text versus when you write an academic paper or a business email. This includes overly polite language like "Might you be interested in eating, sir?", but nevertheless the verb remains the same.
+ English lacks this concept, as we use the same conjugation for everyone – "the prisoner ate", "the king ate", and "a God ate". What English does have is different registers{{cite(n=5)}}, such as when you text versus when you write an academic paper or a business email. This includes overly polite language like "Might you be interested in eating, sir?", but nevertheless the verb remains the same.
  
  #### Quoting Statements
  Quoting plain statements in Korean is very easy. All you need to do is take the sentence, conjugate the verb into plain form, and append `~고 (말)하다`. For verbs, `~ㄴ/는다` is the plain form. For adjectives, it's just `다`, or the base verb.

M content/posts/009_korean_series_1/index.md => content/posts/009_korean_series_1/index.md +11 -11
@@ 55,14 55,14 @@   ## Grammar Points
  ### ~아/어/야 놓다
- This indicates an action has been done and is still in that state. It's possible to translate it with the perfect tenses, but it doesn't map neatly to English. {{ cite(num=0) }}
+ This indicates an action has been done and is still in that state. It's possible to translate it with the perfect tenses, but it doesn't map neatly to English. {{ cite(n=0) }}
  
  * 문을 열**어 놓다**.
  * 집을 정리하려고 해서 이불을 **개 놓아** 주세요.
  * 엄마가 계란 볶음밥을 만들**어 놓았다**.
  
  ### ~ㄹ 뻔 하다
- Used when one almost started an action–i.e. "I almost fell". The action did not start, but almost did. {{ cite(num=1) }}
+ Used when one almost started an action–i.e. "I almost fell". The action did not start, but almost did. {{ cite(n=1) }}
  
  * 재가 거의 넘어질 뻔 했다.
  * 우리 사이가 어근나서 싸울 뻔 했다.


@@ 77,7 77,7 @@ * 소리가 컸다거나 하면 앞으로 조심하겠다.
  
  ### ~아/어/여 버리다
- Expresses that something has completely finished, and/or someone is relieved or upset/surprised at the result. {{ cite(num=2) }}
+ Expresses that something has completely finished, and/or someone is relieved or upset/surprised at the result. {{ cite(n=2) }}
  
  * 오늘도 늦게 일어나 버렸다.
  * 제가 달리는 동안 열쇠를 잃어 버렸다.


@@ 85,14 85,14 @@ * 지루한 대통령의 연설을 끝나 버렸다.
  
  ### ~(/ㄴ/는)다기보다는, (이)라기보다는
- "It's not that (x) but rather (y)". `다는` here often gets contracted to `단`. {{ cite(num=3) }}
+ "It's not that (x) but rather (y)". `다는` here often gets contracted to `단`. {{ cite(n=3) }}
  
  * 내가 한국인 사귀하고 싶다기보다는 그냥 한국에서 살아서 ㅇㅇ.
  * 촌스러웠다기보다는 그 옷에는 안 어울리는 것 같았다.
  * 그를 좋아한다기보다는 존경한다는 표현이 맞을 것이다.
  
  ### ~기는 하다
- 동사 + "but (x)". Sometimes it could be translated as "even though (x), (y)..". Typically gets used with ~는데 or ~지만. For 형용사s, it's ~한데. For 동사s, it's ~하는데. {{ cite(num=4) }}. `기는` here often gets abbreviated to `긴`.
+ 동사 + "but (x)". Sometimes it could be translated as "even though (x), (y)..". Typically gets used with ~는데 or ~지만. For 형용사s, it's ~한데. For 동사s, it's ~하는데. {{ cite(n=4) }}. `기는` here often gets abbreviated to `긴`.
  
  * 나는 소설 책을 읽기는 했지만 기억이 안 나다.
  * 나는 영국사람이기는 하지만 생선과 감자튀김을 전혀 안 먹다.


@@ 105,14 105,14 @@ * 까맣다, 꺼멓다
  
  ### ~ㄹ/을 테니까
- ~테 + ~니까. Used to make an assumption about something to justify or explain some clause/reasoning. {{ cite(num=5) }} {{ cite(num=6) }}
+ ~테 + ~니까. Used to make an assumption about something to justify or explain some clause/reasoning. {{ cite(n=5) }} {{ cite(n=6) }}
  
  * 많이 추**울 테니까** 조심하세요
  * 내일은 공부해야 **할 테니까** 오늘 만날까요?
  * 김밥 맛이 비슷**할 테니까** 굳이 그 식당 까지 안 가도 되다
  
  ### ~ㄹ/을 텐데
- Like ~테니까 but with ~는데. In certain sentences, it's awkward to use with yourself as the subject, since sometimes you know something and can't assume. Example: 나는 미국 사람일 텐데– totally weird to use with yourself as the subject, since you would know if you are American or not, typically. ~인데 would work there instead unless you were making an assumption about someone else. {{ cite(num=7) }} {{ cite(num=8) }}
+ Like ~테니까 but with ~는데. In certain sentences, it's awkward to use with yourself as the subject, since sometimes you know something and can't assume. Example: 나는 미국 사람일 텐데– totally weird to use with yourself as the subject, since you would know if you are American or not, typically. ~인데 would work there instead unless you were making an assumption about someone else. {{ cite(n=7) }} {{ cite(n=8) }}
  
  * 많이 추울 텐데 괜찮겠다?
  * 내가 했었을 텐데...


@@ 120,7 120,7 @@ * 시간이 있었다면 갔을 텐데.
  
  ### ~조차
- "Not even (n)", "not so much as (n"). Used in negative sentences. {{ cite(num=9) }}
+ "Not even (n)", "not so much as (n"). Used in negative sentences. {{ cite(n=9) }}
  
  * 그 남자의 이름조차 몰라요
  * 친구가 시험 준비할 생각조차 못 하는데 어떻게 합격하나요?


@@ 130,18 130,18 @@ Same as ~고 싶다 but used when referring to other peoples' desires.
  
  ### ~ㅁ/음에 따라(서)
- Similar to ~을 때, but means more like "as I (do something)". It stresses that there was some sort of process involved. {{ cite(num=10) }}
+ Similar to ~을 때, but means more like "as I (do something)". It stresses that there was some sort of process involved. {{ cite(n=10) }}
  
  * 제가 유럽에 여행함에 따라서 유럽문화에 관깁이 생겼어요.
  
  ### ~느냐에 따라(서)
- Used with a verb stem, this means "depending on (where/why/how)..." or "depending on if...". {{ cite(num=11) }}
+ Used with a verb stem, this means "depending on (where/why/how)..." or "depending on if...". {{ cite(n=11) }}
  
  * 우리가 내일 가느냐 안 가느냐에 따라서
  * 어떻게 공부하느냐에 따라 미래가 달라질 수 있다
  
  ### ~에 따라(서)
- 따르다 means to follow. ~에 따라서 means "following (x)", or more idiomatically, "according to"/"in accordance with ...". {{ cite(num=12) }}
+ 따르다 means to follow. ~에 따라서 means "following (x)", or more idiomatically, "according to"/"in accordance with ...". {{ cite(n=12) }}
  
  * 사람들은 그 나라의 문화에 따라 행동을 해 야 돼요
  * 길 안내에 따라서 우리는 저 쪽으로 가 야 돼요

M content/posts/010_korean_series_2/index.md => content/posts/010_korean_series_2/index.md +6 -6
@@ 50,7 50,7 @@   ## New Grammar Points
  ### ~ㄹ/을 때마다 
- Pretty simple grammar point: `~ㄹ/을` + `~마다`. {{ cite(num="0") }}
+ Pretty simple grammar point: `~ㄹ/을` + `~마다`. {{ cite(n="0") }}
  
  * 이 영화를 볼 때마다 너무 재미있다
  


@@ 66,7 66,7 @@   ## Topics
  ### 기분
- 기분 is derived from 한자 while 느낌 is pure Korean, derived from 느끼다. 기분 refers to feelings, and typically more like "good/bad". 느낌 can refer to feelings as well as sensations and has a broader range in usage. {{ cite(num="1") }}
+ 기분 is derived from 한자 while 느낌 is pure Korean, derived from 느끼다. 기분 refers to feelings, and typically more like "good/bad". 느낌 can refer to feelings as well as sensations and has a broader range in usage. {{ cite(n=1) }}
  
  * 기분이 좋다 <- [I'm feeling] good/happy.
  * 느낌이 좋다 <- [This feels] good/nice.


@@ 84,20 84,20 @@ * 누가 나를 보고 있는 것 같은 느낌이 들었었다
  
  ### 어쩌다
- The plain form can be used as an adverb in the beginning of `~게 되다` sentences. It's similar to `만약` in that sense. {{ cite(num="2") }}
+ The plain form can be used as an adverb in the beginning of `~게 되다` sentences. It's similar to `만약` in that sense. {{ cite(n=2) }}
  
  * 어쩌다 시험을 합격하게 되었다
  * 어쩌다 그녀를 버스에서 보게 되었다
  
  ### 어쩌면
- It's common in sentences that are unsure or guessing, i.e. `~ㄹ/을지(도)` or `~ㄹ 수도 있다` sentences. {{ cite(num="3") }}
+ It's common in sentences that are unsure or guessing, i.e. `~ㄹ/을지(도)` or `~ㄹ 수도 있다` sentences. {{ cite(n=3) }}
  
  * 어쩌면 그녀가 돌지도 모르다.
  * 어쩌면 우리가 내일 갈 수 있을지도 모르다.
  * 어쩌면 그녀의 남자친구가 그녀를 위해 선물을 모르다.
  
  ### 아무리
- "Regardless/even if". Can be put at the beginning of a sentence, just like `만약` or `어쩌다`. {{ cite(num="4") }}
+ "Regardless/even if". Can be put at the beginning of a sentence, just like `만약` or `어쩌다`. {{ cite(n=4) }}
  * 네가 나를 아무리 사랑해도 우리는 헤어져야 되다
  * 아무리 그 제품을 만값으로 줘도 나는 안 살 것이다
  


@@ 106,7 106,7 @@ With each/every purchase
  
  ### 어쩔 수 없다
- There's nothing that can be done {{ cite(num="5") }}
+ There's nothing that can be done {{ cite(n=5) }}
  
  ### 느낌이 있다
  [It] has a feel/vibe/atmosphere. Can be used with a restaurant, place, etc.

M content/posts/013_padrino_nested_forms/index.md => content/posts/013_padrino_nested_forms/index.md +1 -1
@@ 75,7 75,7 @@   ### Models
  
- The main model `Grammar` needs a tag, which differs by which ORM you're using. If it's Sequel, use the `nested_attributes` tag.{{cite(num=0)}} For ActiveRecord users, instead use `accepts_nested_attributes_for`.{{cite(num=1)}} Both accept the `allow_destroy: true` option. Padrino also needs the plugin to explicitly be enabled.
+ The main model `Grammar` needs a tag, which differs by which ORM you're using. If it's Sequel, use the `nested_attributes` tag.{{cite(n=0)}} For ActiveRecord users, instead use `accepts_nested_attributes_for`.{{cite(n=1)}} Both accept the `allow_destroy: true` option. Padrino also needs the plugin to explicitly be enabled.
  
  ```ruby
  # models/grammar.rb

M content/posts/015_remote_workflow_2019/index.md => content/posts/015_remote_workflow_2019/index.md +140 -49
@@ 2,7 2,6 @@ title = "My setup for remote programming on OSX in 2019"
  slug = "my-setup-remote-programming-osx-2019"
  date = 2019-04-26
- draft = true
  template = "post.html"
  
  [taxonomies]


@@ 15,6 14,14 @@ citations = [
    ["Definitive T430 Modding Guide", "https://medium.com/@n4ru/the-definitive-t430-modding-guide-3dff3f6a8e2e"]
  ]
+ 
+ footnotes = [
+   "I hate that I have to 'prove' my creds if I mention that I use OSX over a *nix system."
+ ]
+ 
+ references = [
+   ["SO: Why do Vim experts prefer buffers over tabs?", "https://stackoverflow.com/questions/26708822/why-do-vim-experts-prefer-buffers-over-tabs"]
+ ]
  +++
  
  {{image(


@@ 23,36 30,39 @@ t="Working remotely at WeWork, 강남, 서울 (Gangnam, Seoul)"
  )}}
  
- Hi! My name is Andrew, and I work remotely as a software developer. Currently I am in 서울, 대한민국– Seoul, South Korea.
+ Hi! My name is Andrew, and I work remotely as a software developer. Currently I am in 서울, 대한민국 – Seoul, South Korea.
  
  ## Development Machine
  
  Before we begin, why apple and osx?
  
  1. battery life
- 2. battery life
- 3. battery life
+ 1. battery life
+ 1. battery life
+ 1. unix-like environment
  1. display
- 1. proprietary apps: photoshop, premiere, affinity designer, sketch
+ 1. form factor
+ 
+ and to an extent, proprietary or osx-only apps: photoshop, premiere, affinity designer, and sketch.
  
- Before you scoff, I used arch linux on my home pc as a daily driver. I used a modded thinkpad t430 for a few months as well. I put in an i7-3632QM (quadcore) chip, a quieter heatsink, 2x8gb memory, a t420 old-style keyboard, and a 9 cell battery.
+ Before you scoff, I used freebsd and arch on my home pc as daily drivers. I used a modded thinkpad t430 for a few months as well.{{fn(n=0)}} I put in an i7-3632QM (quadcore) chip, a quieter heatsink, 2x8gb memory, a t420 old-style keyboard, and a 9 cell battery.
  
- It was sweet. Until I started lugging it around. 
+ It was sweet. Until I started lugging it around.
  
  Weight-wise it was slightly heavier than my 15" macbook, but the battery life made it unusable. I was getting 4-5 hours, max, and occasionally it would just die earlier than expected.
  
- Essentially I was always worried about my power source. What's the point of a laptop if you always need it to be plugged in?! I [live out of two backpacks][living] and work remotely while traveling, so battery life is pretty damn important to me.
+ Essentially I was always worried about my power source. What's the point of a laptop if you always need it to be plugged in?! I [live out of two backpacks][living] and work remotely while traveling, so to say that battery life is important to me is a huge understatement.
  
  My 2015 13" macbook pro's battery is still good to the point that I can easily work 6-7 hours with C# and Rust without worrying about charging. This doesn't happen often in practice but not having to worry about that is very important.
  
- I know someone's going to respond with "but oh, you should've just used power++ with x y z profile!". I -did- experiment with different settings with power++ and other arch and freebsd alternatives. I simply want to work, not fiddle about with battery tuning settings and be worried regardless.
+ I know someone's going to respond with "but oh, you should've just used power++ with x, y, z configurations!". I *did* experiment with different settings with power++ and other alternative tools–nothing seemed to help. Call me a grumpy old man but I want to work and get things done... not fiddle about with battery tuning settings and the like.
  
- Eventually I'll need to replace this mac. All post-2015 macbooks have been a dumpster fire so I'll probably go with a dell xps, a lenovo x1 thinkpad, or [a custom x62 thinkpad from China][thinkpad].
+ Eventually I'll need to replace this mac. All post-2015 macbooks have been a dumpster fire so I'll probably go with a dell xps, a lenovo x1 thinkpad, or [a custom x62 thinkpad from China, maybe..?][thinkpad] I just want a durable machine with an excellent battery that'll work years later and won't have me configuring things constantly.
  
  [living]: /posts/living-out-of-two-backpacks-a-three-month-retrospective/
  [thinkpad]: https://www.notebookcheck.net/Enthusiasts-bring-classic-ThinkPad-designs-to-the-modern-era.194630.0.html
  
- ## Setting up OSX
+ ## Configuring OSX & Tools
  
  The first thing I always do is install xcode-tools, iTerm2, brew, and zsh. Then I clone the osx branch of my [dotfiles repo][dotfiles] and symlink the files where they need to be. I should automate this part with a script, but making that script would take me far more more time than just doing it manually. Not worth it.
  


@@ 66,7 76,7 @@   After using i3 I will never go back to non-tiling windows. I long for the day that i3 works natively on osx. Sigh.
  
- I've somewhat replicated it with [chunkwm][chunkwm], [skhd][skhd], and [karabiner][karabiner]. Chunkwm is a tiling window manager, but it doesn't handle keyboard input. That's whereskhd comes in. I copy/pasted to my [khdrc][khdrc] but to be honest I don't use most of these hotkeys still.
+ I've somewhat replicated it with [chunkwm][chunkwm], [skhd][skhd], and [karabiner][karabiner]. Chunkwm is a tiling window manager, but it doesn't handle keyboard input. That's where skhd comes in. I copy/pasted to my [khdrc][khdrc] but to be honest I don't use most of these hotkeys still.
  
  [chunkwm]: https://koekeishiya.github.io/chunkwm/
  [karabiner]: https://github.com/tekezo/Karabiner


@@ 87,24 97,32 @@   ### poor man's workspaces
  
- I use 6 Spaces and I mapped hyper+num to swap to that workspace.
+ I use 10 Spaces. I added shortcuts to quickly focus them: hyper + 1-5, q-t.
  
- I disable "Automatically rearrange Spaces based on most recent use", in Settings -> Mission Control. This has got to be one of the worst options ever made.
+ I disable "Automatically rearrange Spaces based on most recent use", in Settings -> Mission Control. This has got to be one of the worst defaults ever made.
  
  My workspaces follow this order:
  
- 1. terminal
- 2. browser
- 3. Rider
+ 1. terminal (currently iterm2)
+ 2. browser (firefox)
+ 3. misc / Rider
  4. misc
  5. misc
- 6. Thunderbird
+ 6. [q] misc / desktop / vlc / signal
+ 7. [w] misc / discord
+ 8. [e] kakaotalk, messages app
+ 9. [r] anki
+ 10. [t] thunderbird
  
- Misc applications I generally use:
+ ### apps
+ 
+ I always have iterm2, firefox, kakaotalk, anki, and thunderbird running.
+ 
+ Misc tools I generally use:
  
  * DB Browser for SQLite
  * Insomnia (REST api testing)
- * Azure Data Studio (ms-sql query testing)
+ * Azure Data Studio (ms-sql querying)
  * Datagrip (reading stored procedures / db schemas)
  
  Task bar apps:


@@ 119,28 137,11 @@ * Signal (messaging)
  * Anki (flash card study)
  
- ## Workflow
- Everything starts and ends with meetings and slack. I work on different projects for clients and my team has a daily 5-30min call at 9am (10pm in Korea).
- 
- In Slack and our meetings we'll discuss what needs to be done. I or others will make bullet points of the most pertinent stuff that needs to be done. No agile or anything, [thank god][good-agile-bad-agile]. We previously used a few different ticket tracking systems and I've found that they all suck. [YouTrack][youtrack] sucks. The only decent system I've found is:
- 
- 1. make a list (or queue, if you prefer it that way) of pertinent things
- 1. do those things
- 1. discuss progress in daily call and/or on slack
- 1. repeat
- 
- On top of this, issues in github/gitlab/etc are also pretty good if you come up with good labels. Right now I'm experimenting with Github's Projects and semi-automated issues on our newest project.
- 
- ---
- 
- Since I'm 13 hours ahead, this occasionally poses small issues with working with other team members, but I solved this by going to sleep a bit later (about 1am or so) and watching slack for any pings. Having different things to work on is also important– if I'm ever blocked on something, such as waiting for a teammate to wake up and answer a question, I can just work on something else in the meantime.
- 
- [good-agile-bad-agile]: https://steve-yegge.blogspot.com/2006/09/good-agile-bad-agile_27.html
- [youtrack]: https://www.jetbrains.com/youtrack/
- 
  ### code editor
  
- For non-C# code, I use neovim, vim, or vi, in that order. I don't care what you use. I like neovim, so I use that. I just become disappointed when people reflexively dismiss it because has any learning curve, like at all. There's a *reason* why it has one, and it's not because Bram Moolenaar is masochistic. Even if you don't use vim, I urge you to read the manuals of the software that you do use. Small tidbits of knowledge add up over time, especially with common repetitive actions.
+ For non-C# code, I use neovim, vim, or vi, in that order. I don't care what you use. I like (neo)vim, so I use that. I just become disappointed when people reflexively dismiss it because has any learning curve, like at all. There's a *reason* why it has one, and it's not because Bram Moolenaar is masochistic. In particular, modal editing and buffers{{refer(n=0)}} test.
+ 
+ Even if you don't use vim, I urge you to read the manuals of the software that you do use. Small tidbits of knowledge add up over time, especially with common repetitive actions.
  
  It's also good to know a little `vi` when you mess up your FreeBSD installation and have to dip into an emergency shell. `nano` won't be accessible then.
  


@@ 152,13 153,13 @@   You can see my [neovim configuration here][initvim] here, although I need to prune it a bit. The biggest changes I've made are:
  
- * mapping jj to escape from insert mode, or otherwise using ctrl-[ otherwise to avoid repetitive strain from hitting escape
+ * mapping jj to escape from insert mode, or otherwise using ctrl-\[ otherwise to avoid repetitive strain from hitting escape
  * using [fzf][fzf] + [fzf.vim][fzf-vim] to fuzzy search through my files.
  * using [ale][ale] to asynchronously lint and fix files (but only on file save. I hate over-eager tools that complain when I'm halfway through writing code)
  * using [plug][plug] to manage plugins and lazily-load them
  * disabling vim's annoying swapfile system.
  
- Oh, and [gruvbox][gruvbox], arguably one of the best color schemes ever made. Every once in a while I experiment with a different scheme but I inevitably get drawn back to the GOAT. If someone made [Nord][nord] but with green as the main color instead of blue, I might use that.
+ Oh, and [gruvbox][gruvbox], possibly one of the best color schemes ever made. Every once in a while I experiment with a different scheme but I inevitably get drawn back to the king. If someone made [Nord][nord] but with green as the main color instead of blue, I might use that.
  
  {{image(
    url="https://s3.amazonaws.com/andrewzah.com/posts/015/nvim.png",


@@ 166,11 167,11 @@ t="neovim with four *buffers* open – and monaco font"
  )}}
  
- You know, I don't get why people go overboard with stuff like [powerline][powerline] and patched fonts. It's mostly superfluous information at best, and distracting at worst. But, you do you. I only look there to see the column number once in a blue moon.
+ You know, I don't get why people go overboard with stuff like [powerline][powerline] and patched fonts. It's mostly superfluous information at best, and distracting at worst. But, you do you.
  
  #### cons
  
- Vim's autocompletion... exists I guess. A while ago I looked into it but it seemed not worth the hassle to set up. Anyway, ctrl-p in `insert` mode brings up suggestions from open buffers. Good thing `p` is right next to `[`, which takes you out of `insert` mode.
+ Vim's autocompletion... exists I guess. A while ago I looked into it but it seemed not worth the hassle to set up. Anyway, ctrl-p in `insert` mode brings up suggestions from open buffers. Good thing `p` is right next to `[`, which takes you out of `insert` mode. /s
  
  [ale]: https://github.com/w0rp/ale
  [fzf-vim]: https://github.com/junegunn/fzf


@@ 181,18 182,108 @@ [plug]: https://github.com/junegunn/vim-plug
  [powerline]: https://github.com/powerline/powerline
  
- As an aside, did you know that `vim` displays `Type :quit<Enter> to exit Vim` if you hit ctrl-c? Is your joke outdated and unoriginal? Yes, yes it is.
+ As an aside, did you know that `vim` displays `Type :quit<Enter> to exit Vim` if you hit ctrl-c, and that it's done so for a long time? Is your joke very outdated and unoriginal? Yes, yes it is.
  
  ### code editor (for C#)
  
- I use [IntelliJ Rider][rider] on both osx and arch. I think the value is worth it. It's definitely nowhere near as snappy as vim but the autocompletions are excellent. The build profiles and test runners are pretty nice.
+ I use [IntelliJ Rider][rider] on both osx and arch. I think the value is worth it. It's definitely nowhere near as snappy as vim but the autocompletions are excellent. The build profiles and test runners are pretty nice. Modifying environment variables and profile configurations is tedious.
  
- The Intellij plugin ecosystem is great- you can easily install plugins in any of their editors, to my knowledge. There's even an official [rust plugin][rust-plugin], but I prefer using vim for Rust, or really any other language.
+ The Intellij plugin ecosystem is great- you can easily install plugins in any of their editors, to my knowledge. There's even an official [rust plugin][rust-plugin].
  
- *Not* making cmd-w close tabs is very, very stupid though. Who closes a tab with cmd-4??
+ However, cmd-4 is the shortcut to close windows..?!
  
  [rider]: https://www.jetbrains.com/rider/
  [rust-plugin]: https://intellij-rust.github.io/
  
+ 
+ ## Workflow
+ ### tasks
+ Everything starts and ends with meetings and slack. I work on different projects for clients and my team has a daily 5-30min call at 9am (10pm in Korea).
+ 
+ In Slack and our meetings we'll discuss what needs to be done. I or others will make bullet points of the most pertinent stuff that needs to be done. No agile or anything, [thank god][good-agile-bad-agile]. We previously used a few different ticket tracking systems and I've found that they all suck. [YouTrack][youtrack] sucks, but it was better than the proprietary abomination one of our clients made us use. The only good system I've found is:
+ 
+ 1. make a list (or queue, if you prefer it that way) of things
+ 1. roughly ballpark estimates, with the understanding that estimating things is notoriously difficult
+ 1. accurate prioritize those things (not everything is #1 urgency)
+ 1. work on those things
+ 1. discuss progress and blockers in daily call and/or slack
+ 1. repeat
+ 
+ That's it.
+ 
+ On top of this, issues in github/gitlab/etc are also pretty good if you come up with good labels. Right now I'm experimenting with Github's Projects and semi-automated issues on our newest project.
+ 
+ ---
+ 
+ Since I'm 13 hours ahead, this occasionally poses small issues with working with other team members, but I solved this by going to sleep a bit later (about 1am or so). I'm 23 so I stay up until ~1/2 am anyways ¯\\\_(ツ)_/¯. Having different things to work on is also important– if I'm ever blocked on something, such as waiting for a teammate to wake up and answer a question, I can just work on something else in the meantime.
+ 
+ [good-agile-bad-agile]: https://steve-yegge.blogspot.com/2006/09/good-agile-bad-agile_27.html
+ [youtrack]: https://www.jetbrains.com/youtrack/
+ 
+ ### logging my thoughts
+ 
+ The [Notational Velocity][nv] application changed my life. At its core, the idea is deceivingly simple.
+ 
+ > NOTIONAL VELOCITY is an application that **stores and retrieves notes**.
+ >
+ > It is an attempt to loosen the mental blockages to recording information and to scrape away the tartar of convention that handicaps its retrieval.
+ 
+ You store text in notes. There is only one search box–if a file doesn't exist for your search string, one will automatically be created.
+ 
+ I began to use it for just about everything, since any and all information I had written down could now be easily searched through and found.
+ 
+ * seldom-used vim tidbits
+ * miscellaneous knowledge about real languages (I study Korean)
+ * random snippets for programming languages (how do I open a file in ruby again?)
+ * tentative to-do lists
+ * niche, detailed information like serial numbers and specs for equipment that I bought
+ 
+ It was glorious. Except... it was, and still is, mac only. At home I use *nix systems or windows, so using it became tedious and I eventually stopped.
+ 
+ As I was writing this article, I discovered [nVALT][nvalt]–Brett Terpstra's fork. It has more functionality like markdown support and a better interface. No vim keybindings though, which made it unpleasant for me to use. Terpstra is working on [nvUltra][nvultra] currently which may fix this.
+ 
+ ---
+ 
+ {{image(
+   url="https://raw.githubusercontent.com/alok/notational-fzf-vim/master/screenshots/usage.gif",
+   desc="A gif showcasing how notational fzf vim works.",
+   t="Taken from https://github.com/Alok/notational-fzf-vim"
+ )}}
+ 
+ After I started writing this article, Alex Singh released [notational-fzf-vim][nvvim], which is basically notational velocity but in vim! As the name implies, fulltext searching is powered by [fzf][fzf], which in turn uses [ripgrep][ripgrep] by default. Both are excellent tools I use daily.
+ 
+ The preview window is amazing..!
+ 
+ In order to use it, you need to specify at least one directory for the plugin to search. This will be the primary directory where new notes will be saved, but you can search multiple directories.
+ 
+ ```vim
+ " notational fzf vim
+ let g:nv_search_paths =
+   \ ['~/Desktop/Sync/thoughts',
+     \ '~/Desktop/Sync/thoughts/korean',
+   \]
+ ```
+ 
+ and some example files that I've written to this week:
+ ```
+ packing-list.md
+ self-publishing.md
+ useful-shell-scripts.md
+ vim.md
+ watches.md
+ youtube-videos.md
+ korean/colloquial-or-slang.md
+ korean/color-names.md
+ korean/clothes-verbs.md
+ ```
+ 
+ 
+ [nv]: http://notational.net/
+ [nvalt]: https://brettterpstra.com/projects/nvalt/
+ [nvultra]: https://brettterpstra.com/2019/04/10/codename-nvultra/
+ [nvvim]: https://github.com/alok/notational-fzf-vim
+ [fzf]: https://github.com/junegunn/fzf
+ [ripgrep]: https://github.com/BurntSushi/ripgrep
+ 
  ## Conclusion
- This is my personal setup. It is by no means prescriptive– I merely wanted to share what works for me. I enjoy looking at other people's workflows to see how they handle things–usually I can take away a thing or two.
+ This is my personal setup. It is by no means prescriptive–I merely wanted to share what works for me. I enjoy looking at other people's workflows to see how they handle things. Usually I can take away a thing or two and improve my own workflow. I'm open to improving it!

M content/posts/016_things_to_avoid_in_anki/index.md => content/posts/016_things_to_avoid_in_anki/index.md +1 -1
@@ 81,7 81,7 @@   
  ## Having too many concepts per card
- A good anki card should have one concept. Avoid memorizing lists if you really have to. If you do have to memorize a list, turn it into an enumeration (1. 2. 3...). If you have multiple concepts, make multiple cards.{{cite(num=0)}}
+ A good anki card should have one concept. Avoid memorizing lists if you really have to. If you do have to memorize a list, turn it into an enumeration (1. 2. 3...). If you have multiple concepts, make multiple cards.{{cite(n=0)}}
  
  When memorizing foreign words it's really tempting to put every definition into one card. Don't do this. Putting related definitions together is fine, but if a word has multiple different meanings, it needs different cards.
  

M content/posts/017_anki_usage_guide/index.md => content/posts/017_anki_usage_guide/index.md +1 -6
@@ 13,11 13,6 @@ keywords = "anki memorization guide tutorial introduction memorize lanugage medicine medical school"
  summary = "Anki is a good app for memorization, but making some modifications turns it into a phenomenal app."
  
- 
- footnotes = [
-   ["test"]
- ]
- 
  references = [
    ["Guide to Anki Intervals and Learning Steps", "https://www.youtube.com/watch?v=1XaJjbCSXT0"],
    ["Enhancing learning and retarding forgetting: Choices and consequences, Pashler, Rohrer, Cepeda, & Carpenter (2007)", "https://s3.amazonaws.com/andrewzah.com/studies/Pashler.Rohrer.Cepeda.Carpenter_2007.pdf"],


@@ 64,7 59,7 @@   By default, Anki resets your progress to that of a new card. So even if you had worked the card up to a ~4 month interval, now you have to see it in  1 day, 2 days, 4 days, all over again...
  
- Even if you forget a card, you still had learned it at one point. Which means re-learning it is now significantly easier. By completely resetting the card's intervals, Anki is wasting your time. It slowly conditions you to be unwilling to press `Again`, which is not desireable at all.{{footnote(num=0)}}
+ Even if you forget a card, you still had learned it at one point. Which means re-learning it is now significantly easier. By completely resetting the card's intervals, Anki is wasting your time. It slowly conditions you to be unwilling to press `Again`, which is not desireable at all.{{fn(n=0)}}
  
  **Solution**: In your deck's options group under Lapses, change `New interval` to `70%`. This means if you forget a card, the new interval will be 70% of the old one. As for why I chose 70%, it just felt like an appropriate amount–feel free to play with different percentages to see what works best for you.
  

M content/posts/018_zola_caddy_automatic_deploy/index.md => content/posts/018_zola_caddy_automatic_deploy/index.md +5 -5
@@ 33,7 33,7 @@   #### Getting started
  
- Zola has a [getting started][zola-started] guide. For inspiration, you can look at the [source code for this very blog][source] or [different sites using Zola][zola-examples].{{footnote(num=0)}}
+ Zola has a [getting started][zola-started] guide. For inspiration, you can look at the [source code for this very blog][source] or [different sites using Zola][zola-examples].{{fn(n=0)}}
  
  #### My setup
  This is what my site's directory looks like:


@@ 56,7 56,7 @@ └── themes/
  ```
  
- `binary-data` is where I store all the screenshots, pdfs, and other binary data I refer to my posts. For the actual posts I upload these to an amazon S3 bucket, but I keep these as a backup, *outside* of git.{{footnote(num=1)}}
+ `binary-data` is where I store all the screenshots, pdfs, and other binary data I refer to my posts. For the actual posts I upload these to an amazon S3 bucket, but I keep these as a backup, *outside* of git.{{fn(n=1)}}
  
  `sass/` and `static/` are pretty easy: the former gets compiled to css, the latter gets copied directly to the `public/` directory during generation.
  


@@ 131,7 131,7 @@ {% endif %}
  ```
  ```html
- <!-- footnote.html -->
+ <!-- fn.html -->
  <a id="footnote-cite-{{num}}" href="#footnote-{{num}}">({{num}})</a>
  ```
  


@@ 160,11 160,11 @@   Let's create the Caddyfile:
  
- **NOTE**!! Use a port (like :2015) for local testing instead of the actual domain! If you run Caddy with this caddyfile locally without the `-disable-acme-auth`, caddy will repeatedly try to authorize, quickly **ratelimiting you from Let's Encrypt**!{{footnote(num=2)}}
+ **NOTE**!! Use a port (like :2015) for local testing instead of the actual domain! If you run Caddy with this caddyfile locally without the `-disable-acme-auth`, caddy will repeatedly try to authorize, quickly **ratelimiting you from Let's Encrypt**!{{fn(n=2)}}
  
  ```
  # Caddyfile
- andrewzah.com, andrei.kr {
+ yoursite.com, www.yoursite.com {
    gzip
    cache {
      default_max_age 10m

M sass/_misc.scss => sass/_misc.scss +22 -0
@@ 52,6 52,28 @@ margin-bottom: 1rem;
    }
  
+   ul {
+     margin-top: 0px;
+     margin-bottom: 0px;
+     margin-left: 1.5rem;
+   }
+ 
+   ol {
+     counter-reset: item;
+     margin-top: 0px;
+     margin-bottom: 0px;
+     margin-left: 1.5rem;
+ 
+     li {
+       display: block;
+       &:before {
+         content: counter(item) ". ";
+         counter-increment: item;
+         font-style: italic;
+       }
+     }
+   }
+ 
    h1,h2,h3,h4,h5,h6,p { color: $text; }
  
    p {

M templates/shortcodes/cite.html => templates/shortcodes/cite.html +1 -1
@@ 1,1 1,1 @@-<a id="refer-{{num}}" href="#reference-{{num}}">[{{num}}]</a>
+ <a id="refer-{{n}}" href="#reference-{{n}}">[{{n}}]</a>

A templates/shortcodes/fn.html => templates/shortcodes/fn.html +1 -0
@@ 0,0 1,1 @@
+ <a id="footnote-cite-{{n}}" href="#footnote-{{n}}">({{n}})</a>

D templates/shortcodes/footnote.html => templates/shortcodes/footnote.html +0 -1
@@ 1,1 0,0 @@-<a id="footnote-cite-{{num}}" href="#footnote-{{num}}">({{num}})</a>

A templates/shortcodes/refer.html => templates/shortcodes/refer.html +1 -0
@@ 0,0 1,1 @@
+ <a id="refer-{{n}}" href="#reference-{{n}}">({{n}})</a>