254 lines
23 KiB
Org Mode
254 lines
23 KiB
Org Mode
#+HUGO_BASE_DIR: ../
|
|
#+AUTHOR: Zachary Billman
|
|
#+hugo_paired_shortcodes: %sidenote %marginnote
|
|
#+macro: relref @@hugo:[@@ $1 @@hugo:]({{< relref "$2" >}})@@
|
|
|
|
* About me.
|
|
|
|
** About me.
|
|
:PROPERTIES:
|
|
:EXPORT_FILE_NAME: about-me
|
|
:EXPORT_DATE: 2022-04-03
|
|
:EXPORT_HUGO_CUSTOM_FRONT_MATTER: :weight 1
|
|
:END:
|
|
*** Welcome to my site!
|
|
My name is Zachary Billman. I'm an MD-PhD student at UNC Chapel Hill in Ed Miao's lab. The curious reader may be thinking: "But Zach, Ed Miao's lab is at Duke now! What does that make you?" What an astute question! I am a card-carrying UNC Microbiology and Immunology student who happens to have all of their research take place at Duke.
|
|
#+header: :trim-pre t :trim-post t
|
|
#+begin_sidenote
|
|
This move was quite a trial, especially when compounded with the onset of the pandemic. I suspect my research timeline suffered, though this is an extremely minor inconvenience compared to the tragedy the pandemic caused.
|
|
#+end_sidenote
|
|
This makes for very interesting basketball viewing parties with my Duke friends!
|
|
*** My research and scientific interests.
|
|
I am broadly interested in innate immunology. I am in the 4th year of my PhD studying the host-pathogen interaction between the intracellular fungus /Histoplasma capsulatum/ and macrophages. There are many unstudied curiosities regarding the innate immune response to /Histoplasma spp./ and other intracellular fungi that I think are quite interesting. Stay tuned, hopefully there is a major breakthrough to report here someday.
|
|
*** Hobbies I may write about.
|
|
Besides my science, I am interested in birding, baking sourdough bread (I swear I began years before the pandemic, though hearing of people baking bread brings me joy no matter when they first began!), board games, roasting coffee, and self-hosting free and open source software. Over the course of the pandemic, I have learned how to maintain a basic suite of services on a server I rent that have replaced my need for Google Photos and Google Drive.
|
|
#+header: :trim-pre t :trim-post t
|
|
#+begin_sidenote
|
|
I'm hoping to be able to move away from these platforms entirely soon. I think they provide a great service, but at a substantial cost to privacy. Hopefully more to be said about my thoughts on FOSS soon!
|
|
#+end_sidenote
|
|
I also transitioned my old, (and quite frankly, embarassingly slow) managed Wordpress site with this lean, static site made in Hugo that I host myself. Now that I have mangled together some CSS to get my precious sidenotes up and running again, I'm ready to begin putting some ideas to paper.
|
|
#+header: :trim-pre t :trim-post t
|
|
#+begin_sidenote
|
|
I love marginalia. I'm not sure if this is unique to me, but I seem to get caught up in parenthetical / tangential thoughts very often, and I think using an [[https://www.edwardtufte.com/bboard/q-and-a-fetch-msg?msg_id=0000ld][Edward Tufte-esque]] sidenote is a great way for me to communicate in this way without distracting the reader too much. It seems[[https://en.wikipedia.org/wiki/Marginalia][ marginalia]] such as this have been used throughout history, so perhaps it is normal, but most people can keep their thoughts focused better than me. The implementation I use is inspired by the [[https://github.com/edwardtufte/tufte-css][Tufte CSS project]] and largely taken from [[https://scripter.co/sidenotes-using-only-css/][this incredibly helpful post found at scripter.co]].
|
|
#+end_sidenote
|
|
I'm quite proud of my progress in administering my server and self-hosting useful services.
|
|
*** The future of this site.
|
|
On this site I plan to post updates about my journey through med school, grad school, and self-hosting I would like to share with the world. I have been helped immensely by many others' advice and I hope to impart similar tips to others someday. I suspect most posts will be about much lighter fare, like whatever hobbies tickle my fancy at the time.
|
|
|
|
* Self-hosting :@selfhosting:
|
|
|
|
** My selfhosting journey. :selfhosting:FOSS:
|
|
:PROPERTIES:
|
|
:EXPORT_HUGO_BUNDLE: my-selfhosting-journey
|
|
:EXPORT_FILE_NAME: index
|
|
:EXPORT_DATE: 2022-07-02
|
|
:END:
|
|
|
|
My interest in self-hosting began in my with my interests in internet privacy. Plastered all over the internet are stories about how much Google, Facebook and Amazon know about you. I deleted my Facebook account years ago, and I'm too paranoid to go back to the site because there's [[https://www.reddit.com/r/privacy/comments/6nmjfh/facebook_account_fully_recovered_3_years_after/][a real possibility that Facebook has cached my account, ready to spin it back up]] in case I try to login again. The ads served to me were too accurate for my liking.
|
|
#+header: :trim-pre t :trim-post t
|
|
#+begin_sidenote
|
|
This is despite almost never clicking on them!
|
|
#+end_sidenote
|
|
I have become convinced of the idea that, if you are not paying for the product, you are the product. From this assumption, it follows that anywhere I trust with my data that I am not paying for (like Google Drive, Google Photos, Dropbox, Facebook, Twitter) is using my data to earn money. We know that [[https://www.theverge.com/2020/11/11/21559930/google-train-ai-photos-image-labelling-app-android-update][Google uses the labels you add to Photos to train it's AI]], and [[https://ai.facebook.com/blog/seer-the-start-of-a-more-powerful-flexible-and-accessible-era-for-computer-vision/][Facebook uses (at least) Instagram photos to train it's AI]]. For some, the value proposition of allowing a company to use your data for a useful service in return is an acceptable one. I find this to be a reasonable stance, but I took my growing interest in internet privacy as a chance to learn about how I can take control of my data.
|
|
|
|
Initially, I lurked on forums like /r/privacy to learn what I could do to avoid big-tech's watchful eye. There were numerous comments along the lines of: "The only way to be in control of your data is to self-host your services." I had no idea what this meant!
|
|
#+header: :trim-pre t :trim-post t
|
|
#+begin_sidenote
|
|
Hard to believe that less than a year later, I learned to use (and love) Linux as my primary OS, and have happily replaced Google Photos, Google Drive and other services with my own self-hosted alternatives.
|
|
#+end_sidenote
|
|
Self-hosting, I have since learned, is when you run useful programs from your own computer. By doing so, you have complete knowledge of where and how your data is stored and how it is being used. It has the additional effect of being a bottomless time sink.
|
|
|
|
To begin, I needed an always-on computer to run these useful programs. I began with a humble Raspberry Pi.
|
|
|
|
#+CAPTION: My humble Raspberry Pi and it's hard drive. This dude currently tirelessly runs [[https://github.com/AdguardTeam/AdGuardHome][the excellent Adguard Home]] and downloads a backup of my data every night.
|
|
#+NAME: fig__rpi
|
|
[[./images/rpi.webp]]
|
|
|
|
These are tiny, but capable computers that are great for fiddling with. The projects [[https://www.reddit.com/r/RASPBERRY_PI_PROJECTS/][people develop for these are amazing and diverse.]] With RPi in hand, I began with the ambitious project of replacing Google Drive with [[https://nextcloud.com/][Nextcloud.]] After much frustration with a bare metal installation, I found the [[https://github.com/nextcloud/nextcloudpi][NextcloudPi project.]] Surprisingly, it went pretty okay! At first, I was intimidated by Linux defaults, but over time I grew to appreciate, and indeed, prefer Linux as an operating system.
|
|
#+header: :trim-pre t :trim-post t
|
|
#+begin_sidenote
|
|
My decision to use Linux over Windows/MacOS is because it is free and open source software (FOSS). This is a topic for a different post, but I think using FOSS when possible is a moral imperative of sorts.
|
|
#+end_sidenote
|
|
|
|
I used Nextcloud strictly from my home for a few months, without the ability to connect to it from the internet, to test the self-hosting waters. My first true cloud replacement spun up once I decided to access this lil' guy from the internet. To do so, I purchased a domain (not the one this site is hosted on) and pointed it to the IP of my house. I forwarded the appropriate ports of my router to the RPi.
|
|
|
|
This is when the real exploration began. I was able to access my files and images using Nextcloud, but the photo viewing service left something to be desired. No problem, why not spin up [[https://photoprism.app/][an instance of Photoprism?]] I use RSS feeds to keep on top of the latest science in the journals relevant to my field using Feedly. Why not host [[https://freshrss.org/][my own RSS feed aggregator]] so I can subscribe to as many feeds as I desire?
|
|
|
|
This cycle continued, and I accrued many cool applications, but in the back of my mind I worried about opening up my home network to the internet. I also struggled to run some programs because the RPi uses the arm64 architecture, and most services are written with amd64 in mind. These two forces eventually convinced me to purchase a server where I could manage all of my services remotely.
|
|
#+header: :trim-pre t :trim-post t
|
|
#+begin_sidenote
|
|
Some would say that not owning the hardware that is running your own services is not "true" self-hosting. I think this is needlessly exclusive. Let everyone self host, dangit! Someday, when I have more stable internet and a more permanent home, I hope to host everything from my own home, but until then, I'm extremely pleased with my current stack.
|
|
#+end_sidenote
|
|
|
|
And that is where I am now. I happily host numerous services on my virtual private server that entirely replace Google Photos, Google Drive and GitHub for me. Even better, there are specialized services that fill a need I never realized I had. What's more, if I ever want to spin up a new service, all I have to do is add it to my to docker-compose file and it will be up within minutes. What a world!
|
|
|
|
I thought about making this into a "guide" style post. I nixed that idea because, quite frankly, I feel like I don't know what I'm doing. I am really happy with my setup, but I don't feel like I have the authority to tell people how to administer their own services. If you are interested, allow me to point you toward the guide [[https://www.smarthomebeginner.com/traefik-docker-compose-guide-2022/][that really got me rolling: Ultimate Traefik Docker Compose Guide.]]
|
|
|
|
For those of you wondering [[https://www.zacharybillman.com/posts/zpb-current-selfhosted/][what I am currently hosting, check out my current list at the link]] and let me know what you think!
|
|
|
|
** TODO How I write this blog: or how I learned to love Emacs.
|
|
|
|
** What I'm currently selfhosting.
|
|
:PROPERTIES:
|
|
:EXPORT_HUGO_BUNDLE: zpb-current-selfhosted
|
|
:EXPORT_FILE_NAME: index
|
|
:EXPORT_DATE: 2022-07-02
|
|
:END:
|
|
/N.B.: I hope to add screenshots for each of these eventually. For now, I hope links to each services' website will suffice./
|
|
|
|
1. [[https://www.seafile.com/en/home/][Seafile]]
|
|
|
|
This is a great tool for managing files. I moved to this from Nextcloud because I am of the philosophy that I would prefer services that do one thing excellently instead of many things well. Nextcloud is an incredible Office365 replacement, but I found myself using a fraction of what it was capable of providing.
|
|
|
|
2. [[https://photoprism.app/][Photoprism]]
|
|
|
|
Nextcloud's implementation of photo management was a bit clumsy for my tastes, so I began on a hunt for a more feature complete option. I was very lucky to stumble upon Photoprism early on in my self hosting journey. I am a proud supporter of this project. It brings a ton to the table, and doesn't leave me missing Google Photos one bit. It is also actively developed, as of 2022-07-02, there was a recent update that improved scrolling a ton, which was one of my remaining quibbles with it's functionality. Some people complain that it doesn't scale up for libraries of 10,000+ photos, but my 2000 photo library works swimmingly. On my phone, I use the Folder Sync app to automatically send any pictures I take on my phone to the Photoprism imports folder. Within 15 minutes of snapping a photo, it is there on my Photoprism instance. I highly recommend giving it a go.
|
|
|
|
3. [[https://mealie.io/][Mealie]]
|
|
|
|
I have to admit that the name leaves something to be desired. Fortunately, the service itself doesn't fall short. Mealie is a recipe management application. It is able to parse your favorite recipe websites to create immortalized versions of the recipe. This helps fight detestable [[https://en.wikipedia.org/wiki/Link_rot][link rot]] that plagues the internet. It allows you to edit ingredient amounts, make comments about what you would change next time, and plan out your weekly meals. It helps that it is beautiful and intuitive to use. If only I could get my partner to use it...
|
|
#+header: :trim-pre t :trim-post t
|
|
#+begin_sidenote
|
|
I want to go on the record here and say that I think it is sensible that she doesn't trust my self hosted services that much. In the early days of my self hosting journey, let's just say that the up-time of my services were extremely finicky. I like to think they are more permanent now, especially because I am hosting everything on a VPS, but I certainly cannot compete with the stability of Google and Amazon. (Or pretty much any other paid service for that matter.)
|
|
#+end_sidenote
|
|
:wink:
|
|
|
|
4. [[https://gitea.io/en-us/][Gitea]]
|
|
|
|
Gitea is a community managed, lightweight code hosting solution written in Go. I use it to manage my data analysis (using privite repos) and even host [[https://gitea.zacharybillman.com/zpb/zacharybillman-hugo][the source code for this very website!]] Using Gitea has given me the surface level introduction to the behemoth that is git. Fortunately, that is all I need. Once I have removed any senitive data (like passwords, etc.) I will make my docker-compose file public.
|
|
#+header: :trim-pre t :trim-post t
|
|
#+begin_sidenote
|
|
The docker-compose file is where I determine which services I pick to host, and how to configure them to my liking.
|
|
#+end_sidenote
|
|
Hopefully someone fill find this useful.
|
|
|
|
5. [[https://syncthing.net/][Syncthing]]
|
|
|
|
If I could only tell someone to self host a single service, I would have to pick Syncthing. It is a continuous file synchronization program, which means it keeps a specific file or folder the same between any device running Syncthing. I use it to keep my [[https://keepassxc.org/][password database]] and my [[https://orgmode.org/][org-mode]] notes
|
|
#+header: :trim-pre t :trim-post t
|
|
#+begin_sidenote
|
|
Now org-mode might be the biggest rabbithole of them all, and definitely the topic for another blog post. I use it to manage my TODO list, my lab notebook, my shopping lists, write this blog, and maintain my [[https://zettelkasten.de/introduction/][Zettelkasten note database]]. It is an immensely powerful tool.
|
|
#+end_sidenote
|
|
up to date between all of my devices. With Syncthing, all of my data is stored on my own devices and encrypted in transit.
|
|
|
|
6. [[https://freshrss.org/][FreshRSS]]
|
|
|
|
I keep up to date on the science in my field by subscribing to relevant RSS feeds.
|
|
#+header: :trim-pre t :trim-post t
|
|
#+begin_sidenote
|
|
Yet another topic to write a post about. This really changed the game for my ability to keep on top of the latest research.
|
|
#+end_sidenote
|
|
FreshRSS replaced Feedly for me, as I ran up against the number of feeds I could subscribe to on a free account. Also, when self hosting, I can save as many articles as my heart desires (even if I will never look at them again :dizzy_face: ).
|
|
|
|
7. [[https://wallabag.org/en][Wallabag]]
|
|
|
|
Remember Pocket for Firefox? (Yes, I know it still exists, okay?) Give Wallabag a spin, it is great for storing articles you want to read later. I set up FreshRSS to save articles to my Wallabag instance to keep for later.
|
|
|
|
8. [[https://github.com/dgtlmoon/changedetection.io][ChangeDetection]]
|
|
|
|
Now this is a fun one! ChangeDetection.io is a service that loads a webpage and checks to see if something has changed since the last time. This might not sound useful at first, but I recently used this to check for when a hot item for my new coffee roasting hobby was back in stock. I got an email the other day to let me know it was in stock. Pretty cool!
|
|
|
|
9. [[https://gohugo.io/][Hugo]]
|
|
|
|
Hugo is the static site generator I use to make this here blog! I was amazed at how much more response my site was using Hugo compare to when I paid a company to host a WordPress site. I'm sure WordPress could be fast, but I just wanted a barebones, pure html experience, and Hugo made it easy.
|
|
|
|
10. [[https://github.com/souramoo/commentoplusplus][Commento++]]
|
|
|
|
You may have noticed that I have some pretty snazzy comments sections on my site. I initially used Disqus, which you may recognize from a ton of sites around the internet, but didn't like how it would serve ads through my comments section, and provided sign-ins using Google/Facebook/Twitter. I wanted to serve the simplest comments section I could, that still gave me the ability to migrate the comments to wherever I decide to keep my server. Go ahead and use the anonymous comment button, fill in your name, and you are off to the races.
|
|
|
|
11. Boring stuff that allows everything else to work!
|
|
- PostgreSQL database
|
|
- MariaDB database
|
|
- Traefik reverse proxy
|
|
- Umami privacy respecting site analytics
|
|
- Portainer for docker container management
|
|
- Redis in-memory data store
|
|
- Adminer database management
|
|
- Authelia for securing precious services (like the ones in this last section) behind Duo-like 2-factor authentication
|
|
- traefik-socket-proxy to prevent pesky backdoors to my server!
|
|
|
|
* Birding :@birding:
|
|
|
|
** The (un)common yellowthroat :masonfarm:yellowthroat:birding:
|
|
:PROPERTIES:
|
|
:EXPORT_HUGO_BUNDLE: the-uncommon-yellowthroat
|
|
:EXPORT_FILE_NAME: index
|
|
:EXPORT_DATE: 2022-05-01
|
|
:END:
|
|
|
|
My partner and I took a trip to the [[https://ncbg.unc.edu/visit/mason-farm-biological-reserve/][Mason Farm Biological Reserve]] the other day, and what a glorious day it was. This year, I've been quite busy in the lab, and missed a lot of the early spring warbler season, so I was very excited by the opportunity to check out the old stomping grounds.
|
|
|
|
I brought the camera with me despite the fact we were going to be there around midday when the birds are much less active. I'm glad I did, because I got the best look at a common yellowthroat I've ever had.
|
|
#+header: :trim-pre t :trim-post t
|
|
#+begin_sidenote
|
|
Normally these guys are flighty, staying close to the ground in small brush or tall grasses, but this one was putting on a proper show for the mating season. Even when you get a glimpse of one, it is usually just that, as they have jumped away before you can pull out the camera, taunting you with their [[https://ebird.org/species/comyel#Modal-playlist][iconic call]].
|
|
#+end_sidenote
|
|
I was very pleased to capture a few choice shots of the bird. Hopefully there are more to come. While we were out, I also got a nice picture of a hermit thrush and a king snake.
|
|
|
|
#+begin_export hugo
|
|
{{< gallery match="images/*" sortOrder="desc" rowHeight="150" margins="5" thumbnailResizeOptions="600x600 q90 Lanczos" showExif=true previewType="blur" embedPreview="true" >}}
|
|
#+end_export
|
|
|
|
These images have been compressed quite a bit for a lighter internet footprint. These have all been resized to 25% of their original size. If you would like the full sized images, let me know and I will send you a link!
|
|
|
|
* Board games
|
|
|
|
* Science :@science:
|
|
|
|
** Using RSS feeds to keep on top of science. :science:scitools:
|
|
:PROPERTIES:
|
|
:EXPORT_HUGO_BUNDLE: rss-feeds-to-find-science-papers
|
|
:EXPORT_FILE_NAME: index
|
|
:EXPORT_DATE: 2022-07-13
|
|
:END:
|
|
|
|
It is an age-old question: how can one keep up with the continuous output of science? I remember at the beginning of my PhD struggling to figure out how anyone found out when a new paper came out. :dizzy_face: Did they sit on nature.com and spam the refresh button? Did they know when each journal released their latest issue?
|
|
|
|
*** Behold the power of RSS!
|
|
|
|
Most websites have a page that contains information about each subpage in a computer-readable format called RSS (Really Simple Syndication). [[https://zacharybillman.com/index.xml][Mine has one right here!]] These pages can be parsed by a number of RSS feed aggregators. The way these pages are set up make it such that they add any new information hosted at that domain. This is useful in the science world because you can find the RSS feed of a given journal, subscribe to it, then have every new article published online be delivered right to you.
|
|
|
|
There are a plethora of RSS feed aggregators you can pick from manage your feeds. I have previously used [[https://feedly.com/][Feedly]] and [[https://www.inoreader.com/][Inoreader]], which are great free solutions, but have moved on to selfhosting my own instance of [[https://www.freshrss.org/][FreshRSS]].
|
|
|
|
After making an account at your friendly local RSS feed aggregator, you can add whatever feeds your heart desires. To find a journal's rss feed, I often just search "$JOURNAL_NAME rss feed" and poke around until I find something that looks right. Most of the aggregators will test the feed out first to make sure that you are trying to add a legitimate one. Here are a few of the heavy hitters to get you started:
|
|
|
|
1. http://feeds.nature.com/nature/rss/current
|
|
2. https://www.science.org/rss/express.xml
|
|
3. https://www.cell.com/cell/inpress.rss
|
|
|
|
Nothing like a constant stream of Cell, Science, and Nature to make your project feel like a real winner, eh?
|
|
|
|
Here is what my own site looks like.
|
|
|
|
#+CAPTION: My current FreshRSS setup. On the left I have my feeds separated into folders. In the middle you can see the titles of papers that appear in my feed.
|
|
#+NAME: fig__feed1
|
|
[[./images/feed1.webp][file:./images/feed1.webp]]
|
|
|
|
And after I hit =J= to move to the first item in the feed.
|
|
|
|
#+CAPTION: With a title selected, you can see the abstract and authors.
|
|
#+NAME: fig__feed2
|
|
[[./images/feed2.webp][file:./images/feed2.webp]]
|
|
|
|
After collecting all of your desired RSS feeds, you cannot forego your responsibility of actually reading them! Most RSS feed aggregators have shortcuts to move through titles quickly (Typically =J= to move on to the next one and =K= to move up.)
|
|
#+header: :trim-pre t :trim-post t
|
|
#+begin_sidenote
|
|
They always seem to use [[https://hea-www.harvard.edu/~fine/Tech/vi.html][vi keybindings]]. A bunch of computer nerds have really cornered the keybinding market. I have let them take over my computing life.
|
|
#+end_sidenote
|
|
Each morning when I get into the lab, I set up something, then head to my desk to hit =J= until the counter reaches zero.
|
|
|
|
*** But what about my very specific, small field?
|
|
|
|
You can subscribe to all of the journals you want, but that doesn't make the papers with your specific interests pop out. Fortunately, the NIH has this /exact/ circumstance in mind.
|
|
|
|
When you make a new search on PubMed you might notice the "Create RSS" button. Give it a click, then you will have a personal link you can add to your favorite RSS feed aggregator.
|
|
|
|
#+CAPTION: Somehow I never noticed this button until I needed it.
|
|
#+NAME: fig__feed3
|
|
[[./images/feed3.webp][file:./images/feed3.webp]]
|
|
|
|
This changed the game for me for keeping up with papers. Unfortunately, it doesn't solve the problem of library management. I will leave this as an exercise for the interested reader. I hope this helps you get your eyeballs on that science you crave.
|
|
|
|
* Coffee
|