From c5ff5538a6659075c8a3a011341a7327318eb6ab Mon Sep 17 00:00:00 2001 From: Brandon Rozek Date: Thu, 5 Jan 2023 14:04:45 -0500 Subject: [PATCH] Medium syndication information --- content/blog/DebuggingAndPerformance.md | 1 + .../GPS-EXIF-data-from-photos-decimal-format.md | 1 + ...nforcing-model-predictions-inaturalist-seek.md | 1 + content/blog/algorithmiclatex.md | 1 + content/blog/antenna-basics.md | 1 + content/blog/appimage.md | 1 + content/blog/appsusinginternet.md | 1 + content/blog/archiving-toots.md | 1 + content/blog/archivingsites.md | 1 + content/blog/aspell.md | 1 + content/blog/asynccallbacks.md | 1 + content/blog/audioreplace.md | 1 + content/blog/auto-updating-podman-containers.md | 1 + content/blog/autodeploydockerapps.md | 1 + content/blog/autodeployterraform.md | 1 + content/blog/autopurgedocker.md | 1 + content/blog/autostartdesktopapps.md | 1 + content/blog/bandwidthlimitingapps.md | 1 + content/blog/bashflags.md | 1 + content/blog/bashpartialargparse.md | 1 + content/blog/bashprocesses.md | 1 + content/blog/bashtcpudp.md | 1 + content/blog/bashvalidateip.md | 1 + content/blog/bat.md | 1 + content/blog/bdaymusic.md | 1 + content/blog/blogroll-from-subscriptions.md | 11 ++++++----- content/blog/blogworkflow.md | 1 + content/blog/borgbackup.md | 1 + content/blog/capturing-quoted-string-sed.md | 11 ++++++----- content/blog/checkinstall.md | 1 + content/blog/chirp.md | 1 + content/blog/chrootvirtfilesystem.md | 1 + content/blog/clearingsystemdlogs.md | 1 + content/blog/cloc.md | 1 + content/blog/codeinbeamer.md | 1 + content/blog/codeoutputlatex.md | 1 + content/blog/collabpandocbeamer.md | 1 + content/blog/colormanipulation.md | 1 + content/blog/common-mistake-induction-proofs.md | 1 + content/blog/comparatorlogicgate.md | 1 + content/blog/composesystemd.md | 1 + content/blog/concatenating-pdf-linux.md | 10 ++++++---- content/blog/conditional-assignment-bash.md | 1 + content/blog/convert-djvu-to-pdf.md | 1 + content/blog/copydecorator.md | 1 + content/blog/copytoram.md | 1 + .../blog/corecursion-unfold-infinite-sequences.md | 1 + content/blog/coredns.md | 1 + content/blog/cppoverloads.md | 1 + content/blog/creatingqrcodesfromterminal.md | 1 + content/blog/cryptogames.md | 1 + content/blog/ctf.md | 1 + content/blog/custom-system-fonts.md | 1 + content/blog/customexec.md | 1 + content/blog/customudev.md | 1 + content/blog/dafny-3-3-countermodel.md | 1 + content/blog/dafny-loops.md | 1 + content/blog/dbcli.md | 1 + content/blog/ddforiso.md | 1 + ...ralized-currency-and-issues-with-custodians.md | 12 +++++++----- .../blog/decentralized-identity-pgp-keyoxide.md | 11 +++++++---- content/blog/decentralized-pgp-keys-wkd.md | 13 ++++++++----- content/blog/deep-recursion.md | 1 + .../deploying-hugo-website-through-gh-actions.md | 14 ++++++++------ content/blog/detectpythonversion.md | 1 + content/blog/diceware.md | 1 + content/blog/different-views-of-fold.md | 1 + content/blog/digitalmodes.md | 1 + content/blog/discgolfpymc.md | 1 + content/blog/discoveringhamradio.md | 1 + content/blog/displaying-a-toot-hugo.md | 1 + content/blog/displaying-hikes-with-gpxstudio.md | 1 + content/blog/do-while-other-lang.md | 1 + content/blog/doapi.md | 1 + content/blog/docker-image-bash.md | 1 + content/blog/docker-secrets.md | 1 + content/blog/dockermacvlan.md | 1 + content/blog/document-formats-and-plaintext.md | 1 + content/blog/downloadchanges.md | 1 + content/blog/drawing-trees-with-tikz-latex.md | 13 ++++++++----- content/blog/espeak.md | 1 + content/blog/exportpydecorator.md | 1 + content/blog/externalmediaformats.md | 1 + content/blog/extract.md | 1 + content/blog/fakewebcam.md | 1 + content/blog/finding-cool-people-on-mastodon.md | 1 + content/blog/finding-cuda-errors.md | 1 + content/blog/firefoxprivacyconfigs.md | 1 + content/blog/fmdigitalmodes.md | 1 + content/blog/fold-not-only-reduces.md | 1 + content/blog/gevent.md | 1 + content/blog/git-bisect-broken-builds.md | 1 + content/blog/git-diff-by-words.md | 1 + content/blog/git-partial-clones.md | 1 + content/blog/git-pushing-multiple-remotes.md | 1 + content/blog/gitbundle.md | 1 + content/blog/gitcredentialstore.md | 1 + content/blog/gitdropcommits.md | 1 + content/blog/gitlabcicd.md | 1 + content/blog/gitlineendings.md | 1 + content/blog/gitpatch.md | 1 + content/blog/goaccess.md | 13 ++++++------- content/blog/gpgagentasssh.md | 1 + content/blog/gpgcard.md | 1 + content/blog/gpgkeygen.md | 1 + content/blog/groupssimplified.md | 1 + content/blog/gstreamer.md | 1 + content/blog/haskellrealsequences.md | 12 +++++++----- content/blog/hugo-hiding-section-from-listing.md | 1 + content/blog/human-readable-sizes.md | 1 + .../blog/identifying-plants-with-inaturalist.md | 1 + content/blog/immutable-bfs-unfold.md | 15 ++++++++------- .../blog/intensional-logic-extends-first-order.md | 1 + content/blog/internalca.md | 1 + content/blog/introrfpoweramp.md | 1 + content/blog/ipaddressesinpython.md | 1 + content/blog/iterativecsv.md | 1 + content/blog/junit-script.md | 1 + content/blog/jupyterwithpyenv.md | 1 + content/blog/latex-footnote-no-count.md | 1 + content/blog/latexcode.md | 1 + content/blog/latexlistlabels.md | 1 + content/blog/launchappsthroughterminal.md | 1 + content/blog/leantactics.md | 1 + content/blog/librecalctips.md | 1 + content/blog/limitbandwidth.md | 1 + content/blog/linuxdesktopicons.md | 1 + content/blog/livedoc.md | 1 + content/blog/localrepoiso.md | 1 + content/blog/lxdtmpfs.md | 1 + content/blog/managepythonapps.md | 1 + content/blog/manpandoc.md | 1 + .../mastodon-webfinger-alias-using-redirects.md | 11 +++++++---- content/blog/memoization-scala.md | 1 + content/blog/memoryerrorsgo.md | 1 + content/blog/mergerfs.md | 1 + content/blog/mirrordownload.md | 1 + content/blog/mirrorhugosite.md | 1 + content/blog/mirroringwithgitea.md | 1 + content/blog/missinglibraries.md | 1 + content/blog/multicastreceivescript.md | 1 + content/blog/multicolumnbeamerslide.md | 1 + content/blog/neovimplugins.md | 1 + content/blog/netbootxyz.md | 1 + content/blog/networkdebugging.md | 1 + content/blog/networkthroughput.md | 1 + content/blog/networkx-random-sample-graph.md | 1 + content/blog/networkxtree.md | 1 + content/blog/nginx-gzip.md | 1 + content/blog/ngrok.md | 1 + content/blog/non-root-systemd-scripts.md | 1 + content/blog/notes-beamer-latex.md | 1 + content/blog/obswebcam.md | 1 + content/blog/obtaining-multiple-solutions-z3.md | 10 ++++++---- content/blog/offlinepip.md | 1 + content/blog/ohmyzsh.md | 1 + content/blog/openmpi-fedora.md | 1 + content/blog/openvpncontainer.md | 1 + content/blog/optionality-risk-aversion.md | 1 + content/blog/parallel-scp.md | 1 + ...mission-denied-writing-privileged-locations.md | 1 + content/blog/personal-simple-web-archive.md | 9 ++++++--- content/blog/personalsitepreservingurls.md | 1 + content/blog/phonegpsforward.md | 1 + content/blog/pidhcp.md | 1 + content/blog/piholedhcpdns.md | 1 + content/blog/pingdiscovery.md | 1 + content/blog/pipconf.md | 1 + content/blog/pipeditable.md | 1 + content/blog/podman-nginx-tcpv6-http2-ready.md | 1 + content/blog/pretty-rss-feeds.md | 12 +++++++----- content/blog/printdebug.md | 1 + .../program-verification-hoare-logic-dafny.md | 1 + content/blog/proofdef.md | 1 + content/blog/proving-loop-invariants.md | 1 + content/blog/pulseaudiortp.md | 1 + content/blog/pyasyncio.md | 1 + content/blog/pycacheprop.md | 1 + content/blog/pydataclass.md | 1 + content/blog/pydecorators.md | 1 + content/blog/pyenv.md | 1 + content/blog/pyenvbuildflags.md | 1 + content/blog/pyenvtox.md | 1 + content/blog/pyextradeps.md | 1 + content/blog/pyfutures.md | 1 + content/blog/pygetset.md | 1 + content/blog/pyleniterables.md | 1 + content/blog/pymemoization.md | 1 + content/blog/pysubscribepattern.md | 1 + content/blog/python-argparse.md | 1 + content/blog/python-check-submodule-load.md | 11 +++++++---- content/blog/pythonabstractclass.md | 1 + content/blog/pythonall.md | 1 + content/blog/pythoninterrupts.md | 1 + content/blog/pythonoverloads.md | 1 + content/blog/pythonpackagenamespacing.md | 1 + content/blog/pythonpathhacks.md | 1 + content/blog/pythonsetinterval.md | 1 + content/blog/pythonsetupdevelop.md | 1 + content/blog/pythonswig.md | 1 + content/blog/pythonsymmetricgroups.md | 1 + content/blog/pyunittest.md | 1 + content/blog/qtcpsocket.md | 1 + content/blog/qttimer.md | 1 + content/blog/quickbashargcount.md | 1 + content/blog/quickcgroups.md | 1 + content/blog/quickpythonhttp.md | 1 + content/blog/quickstoragesetup.md | 1 + content/blog/rclone.md | 1 + content/blog/rebuildkernelakmod.md | 1 + content/blog/recordoutputaudio.md | 1 + content/blog/recursivelisting.md | 1 + content/blog/resumingapt.md | 1 + content/blog/reverseonehotencode.md | 1 + content/blog/robustdd.md | 1 + content/blog/rootless-docker-compose-podman.md | 1 + content/blog/rsa.md | 1 + content/blog/rsynckey.md | 1 + content/blog/s3-fuse.md | 1 + content/blog/scrcpy.md | 1 + content/blog/screwuppresentations.md | 1 + content/blog/sharedpackerterraformconfig.md | 1 + content/blog/shutdownafterjob.md | 1 + content/blog/signingcommits.md | 1 + content/blog/simulators.md | 1 + content/blog/snap-flatpak-aliases.md | 1 + content/blog/snapshotswithpacker.md | 1 + content/blog/socatforward.md | 1 + content/blog/socks5proxy.md | 1 + content/blog/sphinxmathjax.md | 1 + content/blog/splittingfiles.md | 1 + content/blog/sshconfig.md | 1 + content/blog/sshconnectionsharing.md | 1 + content/blog/sshjump.md | 1 + content/blog/sshlocalportforwarding.md | 1 + content/blog/startgraphicalappsnoforwarding.md | 1 + content/blog/stow.md | 1 + content/blog/systemdstartup.md | 1 + content/blog/systemdwithpythonenvs.md | 1 + content/blog/tcopython.md | 1 + content/blog/tempresolve.md | 1 + content/blog/tempstaticip.md | 1 + content/blog/terminaloutputvim.md | 1 + content/blog/termtosvg.md | 1 + content/blog/togglingxinput.md | 1 + content/blog/tokindle.md | 1 + content/blog/tox.md | 1 + content/blog/traefiknginx.md | 3 ++- content/blog/trim-video-ffmpeg.md | 1 + content/blog/unattended-upgrades.md | 1 + content/blog/uninstallvimplugins.md | 1 + content/blog/usbredirection.md | 1 + content/blog/value-shift.md | 1 + content/blog/ventoy.md | 1 + content/blog/videosandgifs.md | 1 + content/blog/virtualdisks.md | 1 + content/blog/virtualenv.md | 1 + content/blog/virtualizingwithclonezilla.md | 1 + content/blog/virtuallivecd.md | 1 + content/blog/vncsetup.md | 1 + content/blog/website-status-checking.md | 1 + content/blog/website-visible-on-the-fediverse.md | 1 + content/blog/why-i-pesos-from-mastodon.md | 1 + content/blog/whyzeromq.md | 1 + content/blog/wildcarddomainspihole.md | 1 + content/blog/wireguardvpn.md | 1 + content/blog/wormhole.md | 1 + content/blog/writing-simple-scripts.md | 1 + content/blog/xephyr.md | 1 + content/blog/xpra.md | 1 + content/blog/xvfb.md | 1 + content/blog/youtubebackup.md | 1 + content/blog/yubikey.md | 1 + content/blog/z3constraintsolving.md | 1 + content/blog/zshandsnaps.md | 1 + scripts/syndicate_medium.py | 2 +- 276 files changed, 371 insertions(+), 80 deletions(-) diff --git a/content/blog/DebuggingAndPerformance.md b/content/blog/DebuggingAndPerformance.md index 915b9a7..f8d1bf9 100644 --- a/content/blog/DebuggingAndPerformance.md +++ b/content/blog/DebuggingAndPerformance.md @@ -3,6 +3,7 @@ title: "Debugging and Performance" date: 2019-06-15T10:59:30-04:00 draft: false tags: [ "Testing" ] +medium_enabled: true --- I've come to like the GNU Debugger (GDB) and the `perf` tool recently. This post will be a short summary of the various interesting commands you can use. diff --git a/content/blog/GPS-EXIF-data-from-photos-decimal-format.md b/content/blog/GPS-EXIF-data-from-photos-decimal-format.md index 2c3f79f..c45f926 100644 --- a/content/blog/GPS-EXIF-data-from-photos-decimal-format.md +++ b/content/blog/GPS-EXIF-data-from-photos-decimal-format.md @@ -4,6 +4,7 @@ date: 2022-06-19T19:01:35-04:00 draft: false tags: ["GPS"] math: false +medium_enabled: true --- For a new feature that I'm cooking up for my website, I need to grab the GPS information from the EXIF data stored in my images. Luckily, `imagemagick` diff --git a/content/blog/accidentally-reinforcing-model-predictions-inaturalist-seek.md b/content/blog/accidentally-reinforcing-model-predictions-inaturalist-seek.md index 4612463..363f1d4 100644 --- a/content/blog/accidentally-reinforcing-model-predictions-inaturalist-seek.md +++ b/content/blog/accidentally-reinforcing-model-predictions-inaturalist-seek.md @@ -4,6 +4,7 @@ date: 2022-10-04T11:38:03-04:00 draft: false tags: [] math: false +medium_enabled: true --- I [previously wrote](/blog/identifying-plants-with-inaturalist/) about using Seek to identify organisms and then uploading them separately to iNaturalist. Though after some thought I believe that by only uploading photos that Seek has blessed as knowing, I may be reinforcing peculiar features of the dataset and hence the model. diff --git a/content/blog/algorithmiclatex.md b/content/blog/algorithmiclatex.md index 3d6f758..e22e27e 100644 --- a/content/blog/algorithmiclatex.md +++ b/content/blog/algorithmiclatex.md @@ -3,6 +3,7 @@ title: "Algorithms in LaTex" date: 2020-05-14T21:31:28-04:00 draft: false tags: ["LaTex"] +medium_enabled: true --- There's a great package in LaTex called [`algorithm`](https://ctan.org/pkg/algorithms?lang=en) to help format psuedo-code algorithms for scientific papers. Here's a simple example of its usage: diff --git a/content/blog/antenna-basics.md b/content/blog/antenna-basics.md index b1040cf..8ab6258 100644 --- a/content/blog/antenna-basics.md +++ b/content/blog/antenna-basics.md @@ -4,6 +4,7 @@ date: 2021-07-25T10:43:11-04:00 draft: false tags: ["Amateur Radio"] math: false +medium_enabled: true --- When a radio wave hits an antenna, the electrical component of the wave induces a difference of potential in the conductor which gives rise to an electric current. This is called electromotive force. The current induced is normally small, therefore, we usually design antennas to be as efficient as possible. diff --git a/content/blog/appimage.md b/content/blog/appimage.md index 8223117..c4248a0 100644 --- a/content/blog/appimage.md +++ b/content/blog/appimage.md @@ -3,6 +3,7 @@ title: "Deploying Binaries to other Linux Distros using Appimage" date: 2020-10-19T21:53:52-04:00 draft: false tags: ["Packaging", "Linux"] +medium_enabled: true --- One way to distribute to different Linux distributions is to compile the source under each of them and distribute it separately. This can be a pain to manage if you target multiple distributions and multiple versions of those distributions. Instead, let's take a look at AppImage. This allows us to package up our binaries and shared libraries under one file which we can distribute. diff --git a/content/blog/appsusinginternet.md b/content/blog/appsusinginternet.md index f4f8e3d..9d56f98 100644 --- a/content/blog/appsusinginternet.md +++ b/content/blog/appsusinginternet.md @@ -3,6 +3,7 @@ title: "Show Applications using the Internet" date: 2020-05-09T11:30:36-04:00 draft: false tags: ["Linux", "Networking"] +medium_enabled: true --- There's a great thread on [ask ubuntu](https://askubuntu.com/questions/104739/which-applications-are-using-internet) on seeing which applications are using the Internet. I'm going to add my own spin on the answers for future reference. diff --git a/content/blog/archiving-toots.md b/content/blog/archiving-toots.md index 2924322..b508426 100644 --- a/content/blog/archiving-toots.md +++ b/content/blog/archiving-toots.md @@ -4,6 +4,7 @@ date: 2022-05-20T22:47:48-04:00 draft: false tags: ["Hugo", "Mastodon", "Archive"] math: false +medium_enabled: true --- In the spirit of [syndicating Mastodon toots](/blog/why-i-pesos-from-mastodon/) to my own site, I wrote a Python script that turns toots into Hugo markdown diff --git a/content/blog/archivingsites.md b/content/blog/archivingsites.md index e16fa49..0581560 100644 --- a/content/blog/archivingsites.md +++ b/content/blog/archivingsites.md @@ -3,6 +3,7 @@ title: "Mirroring or Archiving an Entire Website" date: 2019-08-02T22:42:16-04:00 draft: false tags: [ "Archive" ] +medium_enabled: true --- I have several old Wordpress sites lying around that I would like to archive but not maintain anymore. Since I don't intend to create any more content on these sites, we can use tools like `wget` to scrape an existing site and provide a somewhat *read-only* copy of it. I say read-only not because we can't edit it, but because it's not in the original source format of the website. diff --git a/content/blog/aspell.md b/content/blog/aspell.md index c42c281..f09c96c 100644 --- a/content/blog/aspell.md +++ b/content/blog/aspell.md @@ -3,6 +3,7 @@ title: "aspell" date: 2019-12-10T22:20:48-05:00 draft: false tags: [ "Linux" ] +medium_enabled: true --- When I was working on my honors thesis, I realized that I needed a way to spell check the file. After a quick search, I stumbled upon `aspell` which is a `curses` based tool to provide an interactive way for dealing with misspellings. Try it out when you have the chance! diff --git a/content/blog/asynccallbacks.md b/content/blog/asynccallbacks.md index fec1995..0fc7fde 100644 --- a/content/blog/asynccallbacks.md +++ b/content/blog/asynccallbacks.md @@ -3,6 +3,7 @@ title: "Quick Python: Async Callbacks" date: 2020-07-11T20:23:29-04:00 draft: false tags: ["Python"] +medium_enabled: true --- I've written a post on using [callbacks in Python](/blog/pysubscribepattern/). Though to add callbacks to `asyncio` functions, you'll have to interact with the loop object directly. Replace the emit function in the previous post with the following: diff --git a/content/blog/audioreplace.md b/content/blog/audioreplace.md index 638e33f..1dee9c8 100644 --- a/content/blog/audioreplace.md +++ b/content/blog/audioreplace.md @@ -3,6 +3,7 @@ title: "Replace Audio in Video" date: 2020-04-20T20:32:26-04:00 draft: false tags: ["Audio-Video"] +medium_enabled: true --- I recorded a video and wanted to touch up my audio in audacity. Here's how I used `ffmpeg` to extract the audio, and then replace it with a modified version. diff --git a/content/blog/auto-updating-podman-containers.md b/content/blog/auto-updating-podman-containers.md index 1425cfd..37fa24f 100644 --- a/content/blog/auto-updating-podman-containers.md +++ b/content/blog/auto-updating-podman-containers.md @@ -4,6 +4,7 @@ date: 2022-05-15T22:20:47-04:00 draft: false tags: ["Linux", "Containers"] math: false +medium_enabled: true --- Recently, I have been [transitioning to Podman](/blog/rootless-docker-compose-podman) for running my container infrastructure. In the process, I brought over Watchtower which I have previously used for auto-updating docker containers. Before doing so, I didn't check its [compatibility](https://github.com/containrrr/watchtower/issues/1060) (whoops) and found a few of my containers would every other week or so not come back up. diff --git a/content/blog/autodeploydockerapps.md b/content/blog/autodeploydockerapps.md index b5c6d4a..f598c17 100644 --- a/content/blog/autodeploydockerapps.md +++ b/content/blog/autodeploydockerapps.md @@ -3,6 +3,7 @@ title: "Auto-Deploy Docker Applications" date: 2020-05-09T10:20:34-04:00 draft: false tags: ["Containers"] +medium_enabled: true --- This post will combine that last three posts on [Packer](/blog/snapshotswithpacker/), [Terraform](/blog/autodeployterraform/), and their [configuration](/blog/sharedpackerterraformconfig/) to show an entire example of how to deploy a docker-compose application. We will specifically look at deploying a game called [`minetest`](https://www.minetest.net/) on DigitalOcean, but these principles can be adjusted to deploy your application as well. The entire setup is [documented on Github](https://github.com/Brandon-Rozek/minetest-deploy). diff --git a/content/blog/autodeployterraform.md b/content/blog/autodeployterraform.md index e803e5f..61194cb 100644 --- a/content/blog/autodeployterraform.md +++ b/content/blog/autodeployterraform.md @@ -3,6 +3,7 @@ title: "Automatic Deployments with Terraform" date: 2020-05-08T22:45:18-04:00 draft: false tags: ["Deployment"] +medium_enabled: true --- I have recently written about [Packer](/blog/snapshotswithpacker/) to create system images or snapshots. This post will go over another [HashiCorp](https://www.hashicorp.com/) project named [Terraform](https://www.terraform.io/) that we can use to deploy that image to a VPS. Like before, I am going to go over how to setup this up in DigitalOcean. Check out [this list](https://www.terraform.io/docs/providers/index.html) for documentation on your favorite cloud provider. diff --git a/content/blog/autopurgedocker.md b/content/blog/autopurgedocker.md index d98fc48..52b6975 100644 --- a/content/blog/autopurgedocker.md +++ b/content/blog/autopurgedocker.md @@ -3,6 +3,7 @@ title: "Auto Purge Old Docker Images" date: 2020-09-28T23:30:22-04:00 draft: false tags: ["Containers"] +medium_enabled: true --- I use [Watchtower](https://github.com/containrrr/watchtower) to automatically update the docker images I use. After leaving it for several months, I've realized that I have been storing over 100GB of old docker images. I needed a way to automatically purge old images and [Systemd Timers](https://opensource.com/article/20/7/systemd-timers) is the solution. diff --git a/content/blog/autostartdesktopapps.md b/content/blog/autostartdesktopapps.md index 9f3ce06..06dfc1c 100644 --- a/content/blog/autostartdesktopapps.md +++ b/content/blog/autostartdesktopapps.md @@ -3,6 +3,7 @@ title: "Autostart Desktop Applications" date: 2020-11-29T13:45:28-05:00 draft: false tags: ["Linux"] +medium_enabled: true --- The [freedesktop specification](https://specifications.freedesktop.org/autostart-spec/0.5/ar01s02.html) describes how to identify file types, launch applications, and other useful desktop functions. A useful spec I've found recently is for launching desktop applications when you log into your machine. diff --git a/content/blog/bandwidthlimitingapps.md b/content/blog/bandwidthlimitingapps.md index 8cf2a12..8101155 100644 --- a/content/blog/bandwidthlimitingapps.md +++ b/content/blog/bandwidthlimitingapps.md @@ -3,6 +3,7 @@ title: "Bandwidth Limiting Applications" date: 2020-10-22T21:51:27-04:00 draft: false tags: ["Linux", "Networking"] +medium_enabled: true --- Whether it's web scraping or testing low latency connections, we want to be able to bandwidth limit certain applications. I've written about [rate limiting network interfaces](/blog/limitbandwidth/) before. This post focuses on the application level instead. diff --git a/content/blog/bashflags.md b/content/blog/bashflags.md index d5ba0eb..17ee5f3 100644 --- a/content/blog/bashflags.md +++ b/content/blog/bashflags.md @@ -3,6 +3,7 @@ title: "Bash Flags" date: 2019-08-06T16:55:47-04:00 draft: false tags: [ "Bash" ] +medium_enabled: true --- I was creating a bash script and was looking around for a solution for parsing command line arguments. [This StackOverflow post](https://stackoverflow.com/questions/192249/how-do-i-parse-command-line-arguments-in-bash) has a variety of different solutions available. I want to describe my favorite of these posts. diff --git a/content/blog/bashpartialargparse.md b/content/blog/bashpartialargparse.md index 7d471f1..bf93395 100644 --- a/content/blog/bashpartialargparse.md +++ b/content/blog/bashpartialargparse.md @@ -3,6 +3,7 @@ title: "Partial Argument Parse and Passing in Bash" date: 2020-09-07T21:33:26-04:00 draft: false tags: ["Bash"] +medium_enabled: true --- Let's say we want to augment an existing terminal command (like for example `wget`). We then want to be able to add or edit command line options. The rest of this post provides an example that hopefully you can use in your bash script. diff --git a/content/blog/bashprocesses.md b/content/blog/bashprocesses.md index 9574e15..e2f409b 100644 --- a/content/blog/bashprocesses.md +++ b/content/blog/bashprocesses.md @@ -3,6 +3,7 @@ title: "Handling Background Processes in Bash" date: 2019-06-17T19:50:30-04:00 draft: false tags: [ "Bash" ] +medium_enabled: true --- For multi-process applications, I want to be able to start it up using the `bash` command processor and be able to stop all the processes just by hitting `CTRL-C`. diff --git a/content/blog/bashtcpudp.md b/content/blog/bashtcpudp.md index 4f29ee6..0223845 100644 --- a/content/blog/bashtcpudp.md +++ b/content/blog/bashtcpudp.md @@ -3,6 +3,7 @@ title: "TCP/UDP with Bash" date: 2020-05-25T23:10:15-04:00 draft: false tags: ["Bash", "Networking"] +medium_enabled: true --- The bash shell contains pseudo-devices to send packets with TCP/UDP. The pseudo files are formatted like the following: diff --git a/content/blog/bashvalidateip.md b/content/blog/bashvalidateip.md index 483eeb0..5086aa0 100644 --- a/content/blog/bashvalidateip.md +++ b/content/blog/bashvalidateip.md @@ -3,6 +3,7 @@ title: "Quick Bash: Validate IP Address" date: 2020-12-19T20:15:24-05:00 draft: false tags: ["Bash", "Networking"] +medium_enabled: true --- `ipcalc` is a terminal tool that lets you validate an IP address. This proves useful to me as I have scripts that automate certain remote tasks given an IP address. Instead of trusting that an argument passed is a valid IP, why not check it? diff --git a/content/blog/bat.md b/content/blog/bat.md index a26d42f..75289b1 100644 --- a/content/blog/bat.md +++ b/content/blog/bat.md @@ -3,6 +3,7 @@ title: "Bat: The user friendly cat" date: 2020-02-01T06:26:18-05:00 draft: false tags: [ "Linux" ] +medium_enabled: true --- `bat` is a more human pleasing replacement of `cat` with the following features: diff --git a/content/blog/bdaymusic.md b/content/blog/bdaymusic.md index bade9b6..fd96148 100644 --- a/content/blog/bdaymusic.md +++ b/content/blog/bdaymusic.md @@ -3,6 +3,7 @@ title: "Birthday Music" date: 2020-03-29T13:23:01-04:00 draft: false tags: ["Music"] +medium_enabled: true --- I was scrolling around in the [Free Music Archive](https://freemusicarchive.org/) and I stumbled upon the entries of their [The New Birthday Song Contest](https://www.freemusicarchive.org/music/Happy_Birthday_Song_Contest/The_New_Birthday_Song_Contest) back in 2012. One of my favorites is an entry by [Kevin Lax](http://www.kevinlax.com/) titled [Happy Birthday](https://files.freemusicarchive.org/storage-freemusicarchive-org/music/WFMU/Kevin_Lax/The_New_Birthday_Song_Contest/Kevin_Lax_-_Happy_Birthday.mp3) licensed under [Creative Commons Attributioni v3](https://creativecommons.org/licenses/by/3.0/). diff --git a/content/blog/blogroll-from-subscriptions.md b/content/blog/blogroll-from-subscriptions.md index f3221bb..7bd4848 100644 --- a/content/blog/blogroll-from-subscriptions.md +++ b/content/blog/blogroll-from-subscriptions.md @@ -1,9 +1,11 @@ --- -title: "Blogroll From Subscriptions" -date: 2022-12-18T13:05:49-05:00 +date: 2022-12-18 13:05:49-05:00 draft: false -tags: [] math: false +medium_enabled: true +medium_post_id: 913b5fa85507 +tags: [] +title: Blogroll From Subscriptions --- While I was browsing around personal websites, I found a fun little piece of code from Jake Bauer's [links page](https://www.paritybit.ca/links). @@ -54,5 +56,4 @@ HTML_EXPR="
  • \1<\/a> (feed<\/a>)<\/li>" REPLACE_EXPR="s/$XML_EXPR/$HTML_EXPR/g" grep "xmlUrl" "$1" | sed "$REPLACE_EXPR" -``` - +``` \ No newline at end of file diff --git a/content/blog/blogworkflow.md b/content/blog/blogworkflow.md index db3ca7b..4665440 100644 --- a/content/blog/blogworkflow.md +++ b/content/blog/blogworkflow.md @@ -3,6 +3,7 @@ title: "Blog Workflow" date: 2019-10-28T00:16:44-04:00 draft: false tags: ["Hugo"] +medium_enabled: true --- You may be curious on how I create content for this blog. There's pros and cons to my approach. One pro is that it's relatively easy for me to crank something out and upload it to my site. The downside is that it's not as easily customizable. diff --git a/content/blog/borgbackup.md b/content/blog/borgbackup.md index 61e7bd5..86977cd 100644 --- a/content/blog/borgbackup.md +++ b/content/blog/borgbackup.md @@ -3,6 +3,7 @@ title: "Borg Backup" date: 2019-05-21T22:35:31-04:00 draft: false tags: ["Backup"] +medium_enabled: true --- I started using [Borg Backup](https://www.borgbackup.org/) in order to efficiently and securely do my backups. I did some research before choosing this solution as I required three things: diff --git a/content/blog/capturing-quoted-string-sed.md b/content/blog/capturing-quoted-string-sed.md index 4b94370..cc8a754 100644 --- a/content/blog/capturing-quoted-string-sed.md +++ b/content/blog/capturing-quoted-string-sed.md @@ -1,9 +1,11 @@ --- -title: "Capturing Quoted Strings in Sed" -date: 2022-12-18T12:55:32-05:00 +date: 2022-12-18 12:55:32-05:00 draft: false -tags: [] math: false +medium_enabled: true +medium_post_id: 9801b2556737 +tags: [] +title: Capturing Quoted Strings in Sed --- *Disclaimer: This posts assumes some knowledge about regular expressions.* @@ -61,5 +63,4 @@ REPLACE_EXPR="s/$BEFORE_TEXT/$AFTER_TEXT/g" INPUT="\\" echo "$INPUT" | sed "$REPLACE_EXPR" -``` - +``` \ No newline at end of file diff --git a/content/blog/checkinstall.md b/content/blog/checkinstall.md index d120b58..34b8ea3 100644 --- a/content/blog/checkinstall.md +++ b/content/blog/checkinstall.md @@ -3,6 +3,7 @@ title: "Checkinstall" date: 2020-04-26T12:11:30-04:00 draft: false tags: ["Packaging", "Linux"] +medium_enabled: true --- To create a quick and dirty Debian or RPM package, check out `checkinstall`! Be forewarned though that this isn't the recommended way of creating packages. This post on [AskUbuntu](https://askubuntu.com/questions/1138384/why-is-checkinstall-no-longer-being-maintained) gives good reasons for why. Though if it is between running a `make install` or running this utility, I would consider running `checkinstall` instead. diff --git a/content/blog/chirp.md b/content/blog/chirp.md index e3ab900..6dcc3fc 100644 --- a/content/blog/chirp.md +++ b/content/blog/chirp.md @@ -3,6 +3,7 @@ title: "Chirp" date: 2019-09-27T22:46:52-04:00 draft: false tags: [ "Linux", "Amateur Radio" ] +medium_enabled: true --- In the land of Ham Radio, you can program your radio with a very popular open source software called `chirp`. For Ubuntu users to install it, it is recommended you use the PPA to keep up to date with radio software... diff --git a/content/blog/chrootvirtfilesystem.md b/content/blog/chrootvirtfilesystem.md index ca45cd9..288477f 100644 --- a/content/blog/chrootvirtfilesystem.md +++ b/content/blog/chrootvirtfilesystem.md @@ -3,6 +3,7 @@ title: "Chroot and Virtual Filesystems" date: 2020-11-29T10:52:07-05:00 draft: false tags: ["Linux"] +medium_enabled: true --- When running applications under a [`chroot`](https://en.wikipedia.org/wiki/Chroot) environment, it can be annoying when certain [virtual filesystems](https://opensource.com/article/19/3/virtual-filesystems-linux) are unavailable. Here are the commands to mount the most common ones: diff --git a/content/blog/clearingsystemdlogs.md b/content/blog/clearingsystemdlogs.md index ec8c364..140b28a 100644 --- a/content/blog/clearingsystemdlogs.md +++ b/content/blog/clearingsystemdlogs.md @@ -3,6 +3,7 @@ title: "Clearing Systemd Logs" date: 2021-02-21T16:08:51-05:00 draft: false tags: ["Linux"] +medium_enabled: true --- Short post today. I wanted to clear out some disk space usage on one of my servers and noticed that the systemd logs were taking up a decent bit. Here are two options to clear out old logs. diff --git a/content/blog/cloc.md b/content/blog/cloc.md index a7ac193..1dc181a 100644 --- a/content/blog/cloc.md +++ b/content/blog/cloc.md @@ -3,6 +3,7 @@ title: "cloc" date: 2020-01-25T10:24:16-05:00 draft: false images: [] +medium_enabled: true --- **C**ount **L**ines **o**f **C**ode is an application included in the standard Ubuntu repositories that counts the lines of code separated by programming language. diff --git a/content/blog/codeinbeamer.md b/content/blog/codeinbeamer.md index 9ceb602..79eaea0 100644 --- a/content/blog/codeinbeamer.md +++ b/content/blog/codeinbeamer.md @@ -4,6 +4,7 @@ date: 2022-01-26T23:11:37-05:00 draft: false tags: ["LaTex"] math: false +medium_enabled: true --- I commonly use the [`listings` package](/blog/latexcode/) to showcase code in my LaTex documents. I tried doing the same in my Beamer slidedecks and I ran into an issue where the LaTex source code failed to compile. After digging around, I figured out its because every slide or frame that includes code (or any verbatim environment) needs to be marked as `fragile`. A minimal example is presented below: diff --git a/content/blog/codeoutputlatex.md b/content/blog/codeoutputlatex.md index b5e22d2..ae703e6 100644 --- a/content/blog/codeoutputlatex.md +++ b/content/blog/codeoutputlatex.md @@ -4,6 +4,7 @@ date: 2022-01-27T09:15:10-05:00 draft: false tags: ["LaTex"] math: false +medium_enabled: true --- Working on a tool paper, I had the desire to share code alongside its output. With a combination of the `listings`, `caption`, and `color` packages, we can get a result that's nice looking. diff --git a/content/blog/collabpandocbeamer.md b/content/blog/collabpandocbeamer.md index 71f0067..fdd9c5a 100644 --- a/content/blog/collabpandocbeamer.md +++ b/content/blog/collabpandocbeamer.md @@ -2,6 +2,7 @@ title: "Collaborating on Beamer Pandoc Slides" date: 2019-11-22T14:49:19-05:00 draft: false +medium_enabled: true --- Recently I've been making slides using Pandoc with Beamer. However, I came across the issue where I needed to collaborate with someone using already existing slides written in Markdown. diff --git a/content/blog/colormanipulation.md b/content/blog/colormanipulation.md index 9e658ef..29571dd 100644 --- a/content/blog/colormanipulation.md +++ b/content/blog/colormanipulation.md @@ -3,6 +3,7 @@ title: "Color Manipulation with Sass" date: 2019-05-21T23:10:06-04:00 draft: false tags: ["Web", "CSS"] +medium_enabled: true --- There are many times that I need to slightly mess with a color. The easiest way I found to do it is to use one of the many color functions in the program `Sass`. [Sass](https://sass-lang.com/) is a CSS preprocessor, meaning that it has it's own syntax and it compiles down to CSS. I remember using this before CSS variables became a thing and that was one of the main driving points of Sass. diff --git a/content/blog/common-mistake-induction-proofs.md b/content/blog/common-mistake-induction-proofs.md index f9c0d56..e1f3712 100644 --- a/content/blog/common-mistake-induction-proofs.md +++ b/content/blog/common-mistake-induction-proofs.md @@ -4,6 +4,7 @@ date: 2022-05-15T22:49:34-04:00 draft: false tags: ["Math"] math: true +medium_enabled: true --- One of the most common mistakes I see in induction proofs is assuming the recursive case and working backwards towards the induction hypothesis. This may be fine for formulas that are symmetric like those involving equality, but this way of proving induction fails if not. This post will show such example. diff --git a/content/blog/comparatorlogicgate.md b/content/blog/comparatorlogicgate.md index 63864d1..8e6c8a8 100644 --- a/content/blog/comparatorlogicgate.md +++ b/content/blog/comparatorlogicgate.md @@ -4,6 +4,7 @@ date: 2021-06-18T01:09:45-04:00 draft: false tags: [] math: true +medium_enabled: true --- This post is heavily derived from the Wikipedia post on [Digital Comparators](https://en.wikipedia.org/wiki/Digital_comparator) and therefore can be distributed under the Creative Commons Attribution-ShareAlike 3.0 license. diff --git a/content/blog/composesystemd.md b/content/blog/composesystemd.md index e9a777d..194bee5 100644 --- a/content/blog/composesystemd.md +++ b/content/blog/composesystemd.md @@ -3,6 +3,7 @@ title: "Ensuring Docker Compose Startup with Systemd" date: 2019-12-16T20:57:36-05:00 draft: false tags: [ "Linux", "Containers" ] +medium_enabled: true --- I've been having trouble getting some docker containers such as `nginx` to start automatically on bootup, even with the `restart: always` flag. diff --git a/content/blog/concatenating-pdf-linux.md b/content/blog/concatenating-pdf-linux.md index 592260a..fb4ed0c 100644 --- a/content/blog/concatenating-pdf-linux.md +++ b/content/blog/concatenating-pdf-linux.md @@ -1,9 +1,11 @@ --- -title: "Concatenating PDF files in Linux" -date: 2022-12-18T18:38:44-05:00 +date: 2022-12-18 18:38:44-05:00 draft: false -tags: [] math: false +medium_enabled: true +medium_post_id: 21f4d18fcb56 +tags: [] +title: Concatenating PDF files in Linux --- Every so often I need to combine several images into a single PDF. First, to convert an image to a PDF we can use `imagemagick`. @@ -75,4 +77,4 @@ We can then use `imagemagick` to enforce a certain pixel density. The tradeoff b convert -density 300 input.pdf output.pdf ``` -If you happen to know a different way to enforce a pixel density that doesn't have a file size increase tradeoff. Please get in touch. +If you happen to know a different way to enforce a pixel density that doesn't have a file size increase tradeoff. Please get in touch. \ No newline at end of file diff --git a/content/blog/conditional-assignment-bash.md b/content/blog/conditional-assignment-bash.md index 8839070..97a1d94 100644 --- a/content/blog/conditional-assignment-bash.md +++ b/content/blog/conditional-assignment-bash.md @@ -4,6 +4,7 @@ date: 2022-06-19T18:49:47-04:00 draft: false tags: ["Bash"] math: false +medium_enabled: true --- Many programming languages include an quick way to perform a diff --git a/content/blog/convert-djvu-to-pdf.md b/content/blog/convert-djvu-to-pdf.md index 3aa33d0..552d673 100644 --- a/content/blog/convert-djvu-to-pdf.md +++ b/content/blog/convert-djvu-to-pdf.md @@ -4,6 +4,7 @@ date: 2021-08-27T22:00:00-04:00 draft: false tags: [] math: false +medium_enabled: true --- I've recently come across the DJVU file format before and needed to convert it to a PDF. The most reliable way I've found to do it is via the following command. diff --git a/content/blog/copydecorator.md b/content/blog/copydecorator.md index e3632c5..dfb5800 100644 --- a/content/blog/copydecorator.md +++ b/content/blog/copydecorator.md @@ -3,6 +3,7 @@ title: "Quick Python: Copy Decorator" date: 2020-04-08T18:49:54-04:00 draft: false tags: ["Python"] +medium_enabled: true --- If you want to guarantee that your function doesn't modify any of the references and don't mind paying a price in memory consumption, here is a decorator you can easily add to your functions. diff --git a/content/blog/copytoram.md b/content/blog/copytoram.md index cc86752..8afd456 100644 --- a/content/blog/copytoram.md +++ b/content/blog/copytoram.md @@ -3,6 +3,7 @@ title: "Copy to RAM Please" date: 2019-08-02T22:37:12-04:00 draft: false tags: [ "Linux" ] +medium_enabled: true --- I bought a 1U server recently, and I forgot to purchase a SSD to actually hold data. Since I couldn't hold my excitement to play with the server, I decided to load an operating system entirely into RAM and never turn it off for the meantime. diff --git a/content/blog/corecursion-unfold-infinite-sequences.md b/content/blog/corecursion-unfold-infinite-sequences.md index c1a94ff..52cbd4f 100644 --- a/content/blog/corecursion-unfold-infinite-sequences.md +++ b/content/blog/corecursion-unfold-infinite-sequences.md @@ -4,6 +4,7 @@ date: 2022-11-12T10:45:04-05:00 draft: false tags: ["Scala", "Functional Programming"] math: true +medium_enabled: true --- Recursion takes a large problem and breaks it down until it reaches some base cases. One popular example, is the factorial function. diff --git a/content/blog/coredns.md b/content/blog/coredns.md index 06cd5b4..3d4d504 100644 --- a/content/blog/coredns.md +++ b/content/blog/coredns.md @@ -3,6 +3,7 @@ title: "coredns" date: 2019-12-13T02:00:29-05:00 draft: false tags: [ "Linux", "Networking", "Containers" ] +medium_enabled: true --- Domain names are the easiest way for a reverse proxy to split up services in a homelab. Since I'm going full docker-compose in my homelab, I decided to use `coredns`. diff --git a/content/blog/cppoverloads.md b/content/blog/cppoverloads.md index 4ae1b37..d9a81ef 100644 --- a/content/blog/cppoverloads.md +++ b/content/blog/cppoverloads.md @@ -3,6 +3,7 @@ title: "C++ Overloads" date: 2020-03-07T13:52:05-05:00 draft: false tags: [ "C++" ] +medium_enabled: true --- One thing I like about a lot of common languages like C++ and Python is that you can overload operators. This makes it easy to create libraries for other developers that are easy to use. We are going to explain common operators you may want to overload in C++. diff --git a/content/blog/creatingqrcodesfromterminal.md b/content/blog/creatingqrcodesfromterminal.md index 9125e92..852f16d 100644 --- a/content/blog/creatingqrcodesfromterminal.md +++ b/content/blog/creatingqrcodesfromterminal.md @@ -3,6 +3,7 @@ title: "Creating QR Codes from the Terminal" date: 2020-09-26T22:13:25-04:00 draft: false tags: [] +medium_enabled: true --- With the tool `qrencode`, it is surprisingly simple to create a QR code. diff --git a/content/blog/cryptogames.md b/content/blog/cryptogames.md index 93f514e..c651961 100644 --- a/content/blog/cryptogames.md +++ b/content/blog/cryptogames.md @@ -4,6 +4,7 @@ date: 2020-01-13T21:35:09-05:00 draft: false math: true tags: ["Security"] +medium_enabled: true --- When analyzing cryptographic algorithms, we characterize the strength of the crypto-system by analyzing what happens in various crypto games. Below are a couple examples of crypto games used in literature. diff --git a/content/blog/ctf.md b/content/blog/ctf.md index a5caa3f..478f76d 100644 --- a/content/blog/ctf.md +++ b/content/blog/ctf.md @@ -3,6 +3,7 @@ title: "Capture The Flag" date: 2019-05-22T21:25:22-04:00 draft: false tags: ["Security"] +medium_enabled: true --- There is an event in Computer Security called "Capture The Flag". The purpose is to test the skills of security engineers and students through a variety of tasks in order to get a pass phrase which is called a flag. I noticed that Dr. Andrew Marshall wanted to set up this event at the University of Mary Washington for a while, so I and a few others decided to help make this a reality for him. diff --git a/content/blog/custom-system-fonts.md b/content/blog/custom-system-fonts.md index f59fdbb..501eb48 100644 --- a/content/blog/custom-system-fonts.md +++ b/content/blog/custom-system-fonts.md @@ -5,6 +5,7 @@ draft: false aliases: - /blog/adding-fonts tags: ['Ubuntu', 'Linux'] +medium_enabled: true --- **Warning: This blog post partially applies to Ubuntu-based operating systems** diff --git a/content/blog/customexec.md b/content/blog/customexec.md index b5c327d..71bbef3 100644 --- a/content/blog/customexec.md +++ b/content/blog/customexec.md @@ -3,6 +3,7 @@ title: "Custom Executables" date: 2020-02-03T20:10:34-05:00 draft: false tags: [ "Linux" ] +medium_enabled: true --- As time goes on more and more scripts start to accumulate in my scripts folder. It turns out though, that there is a standard way of having local user scripts that get automatically added to your path. I started noticing this in Ubuntu when more and more projects started utilizing the `~/.local/bin` directory. diff --git a/content/blog/customudev.md b/content/blog/customudev.md index 1a7bb11..507ec4e 100644 --- a/content/blog/customudev.md +++ b/content/blog/customudev.md @@ -3,6 +3,7 @@ title: "Custom Device Paths with UDEV rules" date: 2020-11-10T20:58:37-05:00 draft: false tags: ["Linux"] +medium_enabled: true --- I wanted to create a rule so that when I plug in my rtlsdr, a symlink to the device will appear in `/dev/rtlsdr`. diff --git a/content/blog/dafny-3-3-countermodel.md b/content/blog/dafny-3-3-countermodel.md index ce72ed6..f11ac2e 100644 --- a/content/blog/dafny-3-3-countermodel.md +++ b/content/blog/dafny-3-3-countermodel.md @@ -4,6 +4,7 @@ date: 2022-02-04T19:43:12-05:00 draft: false tags: ["Formal Methods"] math: false +medium_enabled: true --- *Warning: `extractcounterexample` is a new flag in Dafny and the command to extract it will likely change* diff --git a/content/blog/dafny-loops.md b/content/blog/dafny-loops.md index 00bc98f..69abdd7 100644 --- a/content/blog/dafny-loops.md +++ b/content/blog/dafny-loops.md @@ -4,6 +4,7 @@ date: 2022-02-05T00:22:58-05:00 draft: false tags: ["Formal Methods"] math: true +medium_enabled: true --- Dafny treats loops like a black box. It could be annoying the first time you experience this and have no clue why the code is not verifying properly. There are two properties that Dafny needs you to prove: partial correctness and termination. Together these form *total correctness*. diff --git a/content/blog/dbcli.md b/content/blog/dbcli.md index 65c074f..81e2028 100644 --- a/content/blog/dbcli.md +++ b/content/blog/dbcli.md @@ -3,6 +3,7 @@ title: "Dbcli" date: 2020-02-29T18:45:51-05:00 draft: false tags: ["Python", "DB"] +medium_enabled: true --- The [DBLCI](https://www.dbcli.com/) project creates command line database clients with auto-completion and syntax highlighting. These clients are often nicer to work with than the one a database comes with. In this post we're going to demo the [LiteCLI](https://litecli.com/) client. diff --git a/content/blog/ddforiso.md b/content/blog/ddforiso.md index 45ccf5c..62d50bd 100644 --- a/content/blog/ddforiso.md +++ b/content/blog/ddforiso.md @@ -3,6 +3,7 @@ title: "Burning ISOs with dd/pv" date: 2020-01-20T10:23:20-05:00 draft: false tags: [ "Linux" ] +medium_enabled: true --- While there are nice graphical tools like [Etcher](https://www.balena.io/etcher/), what is almost always a constant is the tool `dd`. Therefore, for future reference I'll just paste the `dd` command I use to make ISO images. diff --git a/content/blog/decentralized-currency-and-issues-with-custodians.md b/content/blog/decentralized-currency-and-issues-with-custodians.md index c1a416b..b0d81db 100644 --- a/content/blog/decentralized-currency-and-issues-with-custodians.md +++ b/content/blog/decentralized-currency-and-issues-with-custodians.md @@ -1,9 +1,11 @@ --- -title: "The Promise of Decentralized Currency and the Issues with Custodians" -date: 2022-12-04T19:54:58-05:00 -draft: false -tags: [] +date: 2022-12-04 19:54:58-05:00 +draft: false math: false +medium_enabled: true +medium_post_id: 88190b25cbc4 +tags: [] +title: The Promise of Decentralized Currency and the Issues with Custodians --- *Disclaimer: I'm not an active participant in the Bitcoin community and the comments of this post are from an outside perspective.* @@ -43,4 +45,4 @@ Often purchasing Bitcoin from an exchange passes through a *Know Your Customer* -[^1]: I understand other arguments more such as the un-sustainability of the *Proof-of-work* protocol. +[^1]: I understand other arguments more such as the un-sustainability of the *Proof-of-work* protocol. \ No newline at end of file diff --git a/content/blog/decentralized-identity-pgp-keyoxide.md b/content/blog/decentralized-identity-pgp-keyoxide.md index 34b2122..b14fac6 100644 --- a/content/blog/decentralized-identity-pgp-keyoxide.md +++ b/content/blog/decentralized-identity-pgp-keyoxide.md @@ -1,9 +1,12 @@ --- -title: "Decentralized Identities with PGP Annotations and Keyoxide" -date: 2023-01-04T09:00:14-05:00 +date: 2023-01-04 09:00:14-05:00 draft: false -tags: ["GPG/PGP"] math: false +medium_enabled: true +medium_post_id: 5703b335e3a8 +tags: +- GPG/PGP +title: Decentralized Identities with PGP Annotations and Keyoxide --- Under asymmetric encryption, for you to send me a message that only I can read you would need to encrypt the message with my public key. I then would have a corresponding private key that can decrypt the message. Public keys are then usually stored onto keyservers for others to query. When querying for a key, how do you know that the public key actually belongs to me? It turns out, you can't since anyone can upload a key pretending to be me. @@ -62,4 +65,4 @@ Notice how nowhere in the process do we reference Keyoxide or their servers. Thi My Keyoxide profile: https://keyoxide.org/wkd/brozek%40brandonrozek.com -In fact, Keyoxide is [open source](https://codeberg.org/keyoxide/) meaning that anyone can host their own instance to perform the validation checks. +In fact, Keyoxide is [open source](https://codeberg.org/keyoxide/) meaning that anyone can host their own instance to perform the validation checks. \ No newline at end of file diff --git a/content/blog/decentralized-pgp-keys-wkd.md b/content/blog/decentralized-pgp-keys-wkd.md index 17efe39..a8d3d6b 100644 --- a/content/blog/decentralized-pgp-keys-wkd.md +++ b/content/blog/decentralized-pgp-keys-wkd.md @@ -1,9 +1,12 @@ --- -title: "Decentralized PGP Keys with WKD" -date: 2023-01-04T09:06:38-05:00 -draft: false -tags: ["GPG/PGP"] +date: 2023-01-04 09:06:38-05:00 +draft: false math: false +medium_enabled: true +medium_post_id: 7b6197f860fc +tags: +- GPG/PGP +title: Decentralized PGP Keys with WKD --- After creating a PGP key, it is common to distribute it to various keyservers. However, anyone can upload to these keyservers impersonating someone else. One solution is to use a decentralized identities approach, however, if your email is on your own domain that you tell every soul about, why not have your own website host the key? This is where the Web Key Directory (WKD) protocol comes in. @@ -85,4 +88,4 @@ With WKD, we didn't have to trust anyone but the DNS provider in order to retrie - https://shibumi.dev/posts/how-to-setup-your-own-wkd-server/ - https://www.sindastra.de/p/1905/how-to-set-up-pgp-wkd-web-key-directory - https://shivering-isles.com/Lets-discover-OpenPGP-keys -- https://wiki.gnupg.org/WKD +- https://wiki.gnupg.org/WKD \ No newline at end of file diff --git a/content/blog/deep-recursion.md b/content/blog/deep-recursion.md index ed54512..962d699 100644 --- a/content/blog/deep-recursion.md +++ b/content/blog/deep-recursion.md @@ -4,6 +4,7 @@ date: 2022-11-11T14:45:17-05:00 draft: false tags: ["Scala", "Functional Programming"] math: false +medium_enabled: true --- In functional programming, we often look at a list in terms of its head (first-element) and tail (rest-of-list). This allows us to define operations on a list recursively. For example, how do we sum a list of integers such as `[1, 2, 3, 4]`? diff --git a/content/blog/deploying-hugo-website-through-gh-actions.md b/content/blog/deploying-hugo-website-through-gh-actions.md index e90e02b..83e8171 100644 --- a/content/blog/deploying-hugo-website-through-gh-actions.md +++ b/content/blog/deploying-hugo-website-through-gh-actions.md @@ -1,9 +1,12 @@ --- -title: "Deploying my Hugo Website through GitHub Actions" -date: 2022-12-04T22:02:08-05:00 -draft: false -tags: ["Hugo"] +date: 2022-12-04 22:02:08-05:00 +draft: false math: false +medium_enabled: true +medium_post_id: b08e82293bd2 +tags: +- Hugo +title: Deploying my Hugo Website through GitHub Actions --- For the longest time I've held out on deploying my website through GitHub actions. My rationale at the time was: @@ -185,5 +188,4 @@ jobs: - name: Deploy run: ./deploy.sh -``` - +``` \ No newline at end of file diff --git a/content/blog/detectpythonversion.md b/content/blog/detectpythonversion.md index 0c841a0..6e318a1 100644 --- a/content/blog/detectpythonversion.md +++ b/content/blog/detectpythonversion.md @@ -3,6 +3,7 @@ title: "Detect Python Version" date: 2021-03-15T18:09:38-04:00 draft: false tags: ["Python"] +medium_enabled: true --- I was working on a distribution recently where `python` was mapped to `python2`. It mixed me up for a bit since I was writing a script for `python3` but it ran partially under `python2`. To lower confusion in the future, I think it's a great idea to check the python version and exit if it isn't the version you expect. diff --git a/content/blog/diceware.md b/content/blog/diceware.md index 2b23ca8..6028b2e 100644 --- a/content/blog/diceware.md +++ b/content/blog/diceware.md @@ -3,6 +3,7 @@ title: "Diceware" date: 2020-05-01T00:22:31-04:00 draft: false tags: ["Security"] +medium_enabled: true --- Diceware is a passphrase generator proposed by [Arnold G. Reinhold](http://diceware.com/). Passphrases contain multiple words which are chosen according to a sequence of dice rolls. Let's look at a simplified example where we have binary dice (0 or 1) and we have a wordlist of two dice rolls. diff --git a/content/blog/different-views-of-fold.md b/content/blog/different-views-of-fold.md index 4fd3539..b7ff6cd 100644 --- a/content/blog/different-views-of-fold.md +++ b/content/blog/different-views-of-fold.md @@ -4,6 +4,7 @@ date: 2022-11-09T17:45:26-05:00 draft: false tags: ["Scala", "Functional Programming"] math: true +medium_enabled: true --- Fold is a functional programming pattern that operates over some sequence with a binary operation and a starting value. There are two variants: diff --git a/content/blog/digitalmodes.md b/content/blog/digitalmodes.md index 93cd499..b9d1351 100644 --- a/content/blog/digitalmodes.md +++ b/content/blog/digitalmodes.md @@ -5,6 +5,7 @@ draft: false aliases: - /blog/digialmodes tags: [ "Amateur Radio" ] +medium_enabled: true --- This blog post is going to describe what steps I took to be able to decode signals using digital modes. Hardware wise, you will either need a RTL-SDR receiver or a transceiver radio with a cable plugging into the computer's soundcard. diff --git a/content/blog/discgolfpymc.md b/content/blog/discgolfpymc.md index 3869b10..c172f01 100644 --- a/content/blog/discgolfpymc.md +++ b/content/blog/discgolfpymc.md @@ -4,6 +4,7 @@ date: 2020-03-28T22:08:19-04:00 draft: false tags: ["Python", "Statistics"] math: true +medium_enabled: true --- I've been following along with [Bayesian Methods for Hackers](https://github.com/CamDavidsonPilon/Probabilistic-Programming-and-Bayesian-Methods-for-Hackers/tree/master/) and I wanted to try using PyMC3 with my own small dataset. diff --git a/content/blog/discoveringhamradio.md b/content/blog/discoveringhamradio.md index 4391e88..116e8f7 100644 --- a/content/blog/discoveringhamradio.md +++ b/content/blog/discoveringhamradio.md @@ -3,6 +3,7 @@ title: "Discovering Ham Radio" date: 2019-07-01T22:06:23-04:00 draft: false tags: [ "Amateur Radio" ] +medium_enabled: true --- I feel like Ham Radio has been hiding in the background as I move through life. I knew someone that kept a Ham radio in his car, Noah talks about it frequently on his [podcast](http://www.asknoahshow.com/), and it seemed like the next step after [playing with](https://github.com/brandon-rozek/radiotuner) [software defined radio](https://www.amazon.com/RTL-SDR-Blog-RTL2832U-Software-Telescopic/dp/B011HVUEME/ref=sr_1_3). diff --git a/content/blog/displaying-a-toot-hugo.md b/content/blog/displaying-a-toot-hugo.md index 4dbf66a..b06aef7 100644 --- a/content/blog/displaying-a-toot-hugo.md +++ b/content/blog/displaying-a-toot-hugo.md @@ -4,6 +4,7 @@ date: 2022-05-20T16:57:11-04:00 draft: false tags: ["Hugo"] math: false +medium_enabled: true --- Mastodon for me is a nice friendly place and I enjoy participating in that community. With that, I want to be able to share the great toots out there in my own website as well as keep an archive of all the toots I made. This post will go over the code I wrote in Hugo to display a single toot into a blog post. diff --git a/content/blog/displaying-hikes-with-gpxstudio.md b/content/blog/displaying-hikes-with-gpxstudio.md index 35b5a86..e3e8128 100644 --- a/content/blog/displaying-hikes-with-gpxstudio.md +++ b/content/blog/displaying-hikes-with-gpxstudio.md @@ -4,6 +4,7 @@ date: 2022-05-23T16:35:01-04:00 draft: false tags: ["Hugo", "GPS"] math: false +medium_enabled: true --- As the weather gets warmer, I am starting to go on more hikes. Several people on their websites share a Strava embed which highlights a path taken during their workout. I believe as a community this has great potential for sharing our favorite hiking paths. I don't, however, want to rely on Strava to host my GPS data. Instead, we will showcase how to accomplish the same effect but with open technologies. diff --git a/content/blog/do-while-other-lang.md b/content/blog/do-while-other-lang.md index 8c49721..36de4d0 100644 --- a/content/blog/do-while-other-lang.md +++ b/content/blog/do-while-other-lang.md @@ -4,6 +4,7 @@ date: 2021-08-27T21:50:02-04:00 draft: false tags: [] math: false +medium_enabled: true --- Some languages like C, C++, and Java have a concept of a Do-While loop which normally look like the following: diff --git a/content/blog/doapi.md b/content/blog/doapi.md index 8315c34..d228a4b 100644 --- a/content/blog/doapi.md +++ b/content/blog/doapi.md @@ -3,6 +3,7 @@ title: "Digital Ocean API" date: 2020-05-06T22:45:30-04:00 draft: false tags: ["Deployment"] +medium_enabled: true --- This post is meant for the times that you want to quickly query the Digital Ocean API v2, but do not want to download their great client [`doctl`](https://github.com/digitalocean/doctl). The prerequisite for this post is that you have a [personal access token](https://www.digitalocean.com/docs/apis-clis/api/create-personal-access-token/) configured inside the `$DO_TOKEN` environmental variable. diff --git a/content/blog/docker-image-bash.md b/content/blog/docker-image-bash.md index eb217ce..4c22726 100644 --- a/content/blog/docker-image-bash.md +++ b/content/blog/docker-image-bash.md @@ -3,6 +3,7 @@ title: "Advanced Docker Image Construction with Bash" date: 2019-12-26T21:01:37-05:00 draft: false tags: [ "Linux", "Containers" ] +medium_enabled: true --- On current versions of Docker, you can't mount volumes during image construction. This poses an issue for me as I don't want to replicate gigabytes of data already existing on my disk when it won't appear on the final build. Therefore, instead of building an image with a traditional Dockerfile, we're going to use a bash script on a running base image container and export the filesystem to create the image from. diff --git a/content/blog/docker-secrets.md b/content/blog/docker-secrets.md index 107ffd6..ff8ebb3 100644 --- a/content/blog/docker-secrets.md +++ b/content/blog/docker-secrets.md @@ -4,6 +4,7 @@ date: 2022-02-04T23:59:13-05:00 draft: false tags: ["Containers"] math: false +medium_enabled: true --- I try to keep secrets such as passwords and keys out in their own separate files so that I can `.gitignore` them and commit the rest of my configuration. With `docker-compose` we can do that with the `env_file` field. Here is an example with a postgres configuration: diff --git a/content/blog/dockermacvlan.md b/content/blog/dockermacvlan.md index c54b466..b0bf085 100644 --- a/content/blog/dockermacvlan.md +++ b/content/blog/dockermacvlan.md @@ -3,6 +3,7 @@ title: "Docker Macvlan Networks" date: 2020-05-26T01:01:43-04:00 draft: false tags: ["Containers"] +medium_enabled: true --- It is useful to have some docker containers live in the same network as your host machine. We can accomplish this by creating a new MAC address for the container and using the `macvlan` driver. Here is example Docker Compose configuration diff --git a/content/blog/document-formats-and-plaintext.md b/content/blog/document-formats-and-plaintext.md index 4968f55..658ff51 100644 --- a/content/blog/document-formats-and-plaintext.md +++ b/content/blog/document-formats-and-plaintext.md @@ -4,6 +4,7 @@ date: 2022-05-19T21:24:52-04:00 draft: false tags: ["Documentation"] math: false +medium_enabled: true --- Microsoft Word, Apple Pages, Google Docs, Libreoffice Writer all provide a method of writing and formatting text. This is then normally stored in a "binary" file. I put binary in quotes as they are often stored in a zip archive of XML files. However, because it's in a zip archive, I cannot use standard plaintext tools to search within the document. diff --git a/content/blog/downloadchanges.md b/content/blog/downloadchanges.md index 6492138..716b3d7 100644 --- a/content/blog/downloadchanges.md +++ b/content/blog/downloadchanges.md @@ -3,6 +3,7 @@ title: "Download Changes" date: 2020-04-12T15:28:31-04:00 draft: false tags: [] +medium_enabled: true --- When testing daily ISO images, it is useful to only download the parts of the ISO that has changed since the previous days. That way we can preserve time and bandwidth. diff --git a/content/blog/drawing-trees-with-tikz-latex.md b/content/blog/drawing-trees-with-tikz-latex.md index e3cda33..ddefc25 100644 --- a/content/blog/drawing-trees-with-tikz-latex.md +++ b/content/blog/drawing-trees-with-tikz-latex.md @@ -1,9 +1,12 @@ --- -title: "Drawing Trees in LaTex with Tikz" -date: 2022-12-06T11:01:24-05:00 -draft: false -tags: ["LaTex"] +date: 2022-12-06 11:01:24-05:00 +draft: false math: false +medium_enabled: true +medium_post_id: f80065fbf92f +tags: +- LaTex +title: Drawing Trees in LaTex with Tikz --- For the longest time I've been avoiding Tikz because I imagined it being too difficult to learn. Usually I create a graphic using a program like [Draw.IO](https://draw.io) and import it as an image. Though this time around, I decided that I'm going to learn how to make trees in Tikz. It turns out, it's not as bad as I anticipated. @@ -88,4 +91,4 @@ To show how the child nesting works, I'll finish by giving the right child two c \end{tikzpicture} ``` -![Screenshot of a tree similar to the previous tree, but with the right child having two child nodes one with the label A and the other with the label B.](/files/images/blog/20221206112444.png) +![Screenshot of a tree similar to the previous tree, but with the right child having two child nodes one with the label A and the other with the label B.](/files/images/blog/20221206112444.png) \ No newline at end of file diff --git a/content/blog/espeak.md b/content/blog/espeak.md index 5f0d6f8..91add33 100644 --- a/content/blog/espeak.md +++ b/content/blog/espeak.md @@ -3,6 +3,7 @@ title: "Espeak" date: 2020-03-01T10:33:33-05:00 draft: false tags: [] +medium_enabled: true --- `espeak` is a command line tool that lets you type in messages and have it said back to you. diff --git a/content/blog/exportpydecorator.md b/content/blog/exportpydecorator.md index f6a2511..ffad7fd 100644 --- a/content/blog/exportpydecorator.md +++ b/content/blog/exportpydecorator.md @@ -3,6 +3,7 @@ title: "Quick Python: Export Decorator" date: 2020-06-14T22:15:38-04:00 draft: false tags: ["Python"] +medium_enabled: true --- A great [StackOverflow post](https://stackoverflow.com/a/35710527) by [Aaron Hall](https://stackoverflow.com/users/541136/aaron-hall) that shows how you can create an `export` decorator in order to not have to specify all the names you want to expose via [`__all__`](/blog/pythonall/). diff --git a/content/blog/externalmediaformats.md b/content/blog/externalmediaformats.md index 8621f76..8f6200a 100644 --- a/content/blog/externalmediaformats.md +++ b/content/blog/externalmediaformats.md @@ -3,6 +3,7 @@ title: "External Media Formats" date: 2019-05-22T22:03:38-04:00 draft: false tags: [ "Storage" ] +medium_enabled: true --- I received an external SSD recently and I decided that it would be a great place to offload some of my backups. Before I got started, I became curious as to what filesystem to put on the SSD. After some research, it seems that if I want to be able to access it using Windows I am actually quite limited. In fact only three make sense: diff --git a/content/blog/extract.md b/content/blog/extract.md index 24390b6..c5038a6 100644 --- a/content/blog/extract.md +++ b/content/blog/extract.md @@ -3,6 +3,7 @@ title: "Extract All the Things" date: 2020-06-14T22:23:37-04:00 draft: false tags: ["Linux"] +medium_enabled: true --- [Sandra Henry-Stocker](https://www.networkworld.com/author/Sandra-Henry_Stocker/) from Network World wrote a [great post](https://www.networkworld.com/article/3244007/extracting-from-compressed-files-on-linux.html) on how to standardize extracting files on Linux. It's a shell script that works so well, that I placed it in my [`~/.local/bin` directory](https://brandonrozek.com/blog/customexec/) in order to call upon it at any time. Here's part of it, check out the post for more. diff --git a/content/blog/fakewebcam.md b/content/blog/fakewebcam.md index 90a33e1..e82b1d1 100644 --- a/content/blog/fakewebcam.md +++ b/content/blog/fakewebcam.md @@ -3,6 +3,7 @@ title: "V4l2 Webcam" date: 2020-05-25T23:49:08-04:00 draft: false tags: ["Audio-Video"] +medium_enabled: true --- In Linux you can create a fake webcam by making use of the `v4l2loopback` kernel module. diff --git a/content/blog/finding-cool-people-on-mastodon.md b/content/blog/finding-cool-people-on-mastodon.md index 41b77e2..aeee36e 100644 --- a/content/blog/finding-cool-people-on-mastodon.md +++ b/content/blog/finding-cool-people-on-mastodon.md @@ -4,6 +4,7 @@ date: 2022-05-15T20:39:35-04:00 draft: false tags: ["Mastodon"] math: false +medium_enabled: true --- Mastodon is a cool federated micro-blogging platform that can serve as an alternative to Twitter. One of its primary features is that it shows what they call toots from only people you follow in reverse-chronological order. Nowadays, large tech companies employ recommendation engines to surface content from users (you don't even need to follow) in a non-chronological order driven by the number of interactions users similar to you had with the content. The lack of recommendation engine in Mastodon can be a blessing as low-quality emotional content tends to drive more interactions. However, this can also be a curse as cool new people don't naturally surface in your feed. The following are the techniques I employ to consistently seek out cool new people: diff --git a/content/blog/finding-cuda-errors.md b/content/blog/finding-cuda-errors.md index 0ad3c5e..94ae982 100644 --- a/content/blog/finding-cuda-errors.md +++ b/content/blog/finding-cuda-errors.md @@ -4,6 +4,7 @@ date: 2022-03-08T10:53:43-05:00 draft: false tags: [] math: false +medium_enabled: true --- When cuda fails, it fails silently. To combat this, I have gotten into a habit of checking for a failed status for every cuda memory allocation, kernel execution etc. The following is a C++ macro I wrote that checks if a previous cuda call has failed and then prints the current line and file of the macro. diff --git a/content/blog/firefoxprivacyconfigs.md b/content/blog/firefoxprivacyconfigs.md index c2d16c8..42ce01c 100644 --- a/content/blog/firefoxprivacyconfigs.md +++ b/content/blog/firefoxprivacyconfigs.md @@ -3,6 +3,7 @@ title: "Firefox Privacy Configuration" date: 2020-06-26T22:35:05-04:00 draft: false tags: [] +medium_enabled: true --- Firefox has a great number of configurable options when it comes to privacy. I first discovered this as I was browsing [privacytools.io](https://www.privacytools.io/browsers/) recommendations. Mozilla also has a [privacy task force](https://wiki.mozilla.org/Privacy/Privacy_Task_Force/firefox_about_config_privacy_tweeks) documenting some these options. I later learned that there is a website called [Firefox Profilemaker](https://ffprofile.com/) that takes the user step by step creating a privacy preserving profile. diff --git a/content/blog/fmdigitalmodes.md b/content/blog/fmdigitalmodes.md index 9d1c3e5..4c24d49 100644 --- a/content/blog/fmdigitalmodes.md +++ b/content/blog/fmdigitalmodes.md @@ -3,6 +3,7 @@ title: "Getting Started with FM Digital Modes" date: 2020-11-07T21:31:52-05:00 draft: false tags: ["Amateur Radio"] +medium_enabled: true --- In this post, I will describe a low cost way to get started with digital modes using FM. We will extend off my [previous post](/blog/digitalmodes). Even though some of these instructions are hardware specific, I hope that the general principles will apply to whatever hardware you're working with. diff --git a/content/blog/fold-not-only-reduces.md b/content/blog/fold-not-only-reduces.md index 495450e..f5be044 100644 --- a/content/blog/fold-not-only-reduces.md +++ b/content/blog/fold-not-only-reduces.md @@ -4,6 +4,7 @@ date: 2022-11-09T15:15:10-05:00 draft: false tags: ["Functional Programming", "Scala", "Haskell"] math: false +medium_enabled: true --- One misconception when first learning about fold is that it takes a list of elements of a certain type (`List[T]`) and "reduces" it to a single item of type `T`. diff --git a/content/blog/gevent.md b/content/blog/gevent.md index 8caa8dd..6130e4d 100644 --- a/content/blog/gevent.md +++ b/content/blog/gevent.md @@ -3,6 +3,7 @@ title: "Gevent" date: 2020-04-09T17:22:52-04:00 draft: false tags: ["Python"] +medium_enabled: true --- In my last post I spoke about [concurrency with asyncio](/blog/pyasyncio/). Now what if you don't want to concern yourself with async/await practices and just want to write synchronous code that executes I/O asynchronously? That's where the library [gevent](http://www.gevent.org/) comes in. It does this by modifying Python's standard library during runtime to call it's own asynchronous versions. diff --git a/content/blog/git-bisect-broken-builds.md b/content/blog/git-bisect-broken-builds.md index 1e4f7cf..6ea1c7d 100644 --- a/content/blog/git-bisect-broken-builds.md +++ b/content/blog/git-bisect-broken-builds.md @@ -4,6 +4,7 @@ date: 2022-05-03T01:15:55-04:00 draft: false tags: ["Git"] math: false +medium_enabled: true --- Lets imagine a scenario where in the latest merge a test diff --git a/content/blog/git-diff-by-words.md b/content/blog/git-diff-by-words.md index a578fcf..6ed2186 100644 --- a/content/blog/git-diff-by-words.md +++ b/content/blog/git-diff-by-words.md @@ -4,6 +4,7 @@ date: 2022-02-04T21:23:30-05:00 draft: false tags: ["Git"] math: false +medium_enabled: true --- When working in LaTex it is often more useful to see the changes by words as opposed to lines. Luckily, it's pretty easy to view this in the terminal. diff --git a/content/blog/git-partial-clones.md b/content/blog/git-partial-clones.md index beeba26..15a50cd 100644 --- a/content/blog/git-partial-clones.md +++ b/content/blog/git-partial-clones.md @@ -4,6 +4,7 @@ date: 2022-02-07T17:07:08-05:00 draft: false tags: ["Git"] math: false +medium_enabled: true --- I recently was introduced to [Sparse Directories in SVN](https://svnbook.red-bean.com/en/1.8/svn.advanced.sparsedirs.html). In SVN, you can initially clone a repository and have it be empty until you checkout the specific files needed. I wondered if I can do the same with `git`. For the *tl;dr* skip to the conclusion section. diff --git a/content/blog/git-pushing-multiple-remotes.md b/content/blog/git-pushing-multiple-remotes.md index f7fd6b3..9781f22 100644 --- a/content/blog/git-pushing-multiple-remotes.md +++ b/content/blog/git-pushing-multiple-remotes.md @@ -4,6 +4,7 @@ date: 2022-06-02T21:19:29-04:00 draft: false tags: ["Git"] math: false +medium_enabled: true --- Git's greatest strength is its first-class support for decentralization. diff --git a/content/blog/gitbundle.md b/content/blog/gitbundle.md index cb19275..28de2e2 100644 --- a/content/blog/gitbundle.md +++ b/content/blog/gitbundle.md @@ -3,6 +3,7 @@ title: "Git Bundle" date: 2020-03-20T16:22:01-04:00 draft: false tags: ["Git"] +medium_enabled: true --- If you have a large software repository, sometimes you only want to share part of it with a group. You can accomplish this by using `git bundle` diff --git a/content/blog/gitcredentialstore.md b/content/blog/gitcredentialstore.md index d8347a5..835d65a 100644 --- a/content/blog/gitcredentialstore.md +++ b/content/blog/gitcredentialstore.md @@ -3,6 +3,7 @@ title: "Git Credential Store" date: 2020-05-25T22:30:49-04:00 draft: false tags: ["Git"] +medium_enabled: true --- Normally it is recommended to setup a SSH key with your Git hosting tool with choice. Though if that is not practical, another way you can avoid having to put in your git username and password every time you push your code is to make use of Git's credential store. diff --git a/content/blog/gitdropcommits.md b/content/blog/gitdropcommits.md index 64bc395..441c024 100644 --- a/content/blog/gitdropcommits.md +++ b/content/blog/gitdropcommits.md @@ -3,6 +3,7 @@ title: "How to Drop Commits in Git" date: 2020-05-26T00:48:37-04:00 draft: false tags: ["Git"] +medium_enabled: true --- Even though it is not recommended to rewrite history in Git, it can be useful to drop certain commits from a pull request. The easiest way I've found to achieve this is with `git rebase`. To look back at the last 5 commits diff --git a/content/blog/gitlabcicd.md b/content/blog/gitlabcicd.md index dba7ccc..84f8118 100644 --- a/content/blog/gitlabcicd.md +++ b/content/blog/gitlabcicd.md @@ -2,6 +2,7 @@ title: "Gitlab CI/CD" date: 2019-07-01T21:36:56-04:00 draft: false +medium_enabled: true --- One of the greatest benefits I believe of integrating Gitlab's CI/CD into your workload is code linting and building. This immediately eliminates the easy mistakes that developers make and wastes less people's time. diff --git a/content/blog/gitlineendings.md b/content/blog/gitlineendings.md index 5dde8be..887e086 100644 --- a/content/blog/gitlineendings.md +++ b/content/blog/gitlineendings.md @@ -3,6 +3,7 @@ title: "Git Line Endings" date: 2020-05-09T11:01:21-04:00 draft: false tags: ["Git"] +medium_enabled: true --- if you have worked with a team that has a mix of Windows and Linux developers, you might have noticed pull requests where Git reports changes in a file that is not visible. One explanation is that the line endings might have changed. diff --git a/content/blog/gitpatch.md b/content/blog/gitpatch.md index eed9382..bfb5163 100644 --- a/content/blog/gitpatch.md +++ b/content/blog/gitpatch.md @@ -3,6 +3,7 @@ title: "Git Patch" date: 2020-03-20T16:22:57-04:00 draft: false tags: ["Git"] +medium_enabled: true --- The Linux kernel community make use of patches in git to share code changes with one another. Patches are only nicely formatted differences between your current codebase and what you compare it to. If you want to share a subsetted git tree, then [git bundle](/blog/gitbundle) would be the way to go. diff --git a/content/blog/goaccess.md b/content/blog/goaccess.md index d458dbc..276d411 100644 --- a/content/blog/goaccess.md +++ b/content/blog/goaccess.md @@ -1,9 +1,11 @@ --- -title: "Visualizing Nginx logs with GoAccess" -date: 2022-12-01T23:41:15-05:00 +date: 2022-12-01 23:41:15-05:00 draft: false -tags: [] math: false +medium_enabled: true +medium_post_id: be642b59857 +tags: [] +title: Visualizing Nginx logs with GoAccess --- I currently use [Ackee](https://ackee.electerious.com/) to collect minimal analytics on this website. That comes as an additional Javascript library which has its own set of possible issues: @@ -151,7 +153,4 @@ Here's a JSON report for the GoAccess website itself: } ``` -We can do many things with a JSON export of website traffic, but one of my favorite ideas is to have a "Most Popular Posts" section of my website. - - - +We can do many things with a JSON export of website traffic, but one of my favorite ideas is to have a "Most Popular Posts" section of my website. \ No newline at end of file diff --git a/content/blog/gpgagentasssh.md b/content/blog/gpgagentasssh.md index 2cd885a..13676a2 100644 --- a/content/blog/gpgagentasssh.md +++ b/content/blog/gpgagentasssh.md @@ -3,6 +3,7 @@ title: "GPG Agent as SSH Agent" date: 2020-06-14T22:33:01-04:00 draft: false tags: ["SSH", "GPG/PGP"] +medium_enabled: true --- GPG Agent has the ability to act as a SSH Agent. This allows the use of Authentication keys on Smartcards to be used with SSH as well. diff --git a/content/blog/gpgcard.md b/content/blog/gpgcard.md index c300a82..40c3395 100644 --- a/content/blog/gpgcard.md +++ b/content/blog/gpgcard.md @@ -3,6 +3,7 @@ title: "GPG Card" date: 2020-06-05T17:39:51-04:00 draft: false tags: ["GPG/PGP"] +medium_enabled: true --- I have a Yubikey hardware token and one of my favorite use cases is the GPG support. This gives you the use cases of signing, encrypting, and authenticating all in one module. This post will describe quickly setting it up. diff --git a/content/blog/gpgkeygen.md b/content/blog/gpgkeygen.md index 287d8ef..ca954e8 100644 --- a/content/blog/gpgkeygen.md +++ b/content/blog/gpgkeygen.md @@ -3,6 +3,7 @@ title: "GPG Keygen" date: 2020-04-11T19:35:05-04:00 draft: false tags: ["GPG/PGP"] +medium_enabled: true --- GPG keys have a variety of different uses from sending encrypted emails to verifying git commits. Here I'll show how to create a public/private key-pair. This post assumes you have the `gpg` client installed. diff --git a/content/blog/groupssimplified.md b/content/blog/groupssimplified.md index 8ca88f8..3ebd9b4 100644 --- a/content/blog/groupssimplified.md +++ b/content/blog/groupssimplified.md @@ -4,6 +4,7 @@ date: 2019-12-10T21:40:00-05:00 draft: false tags: [ "Math" ] math: true +medium_enabled: true --- This post is inspired by the book "Term Rewriting & All That" by Franz Baader and Tobias Nipkow. diff --git a/content/blog/gstreamer.md b/content/blog/gstreamer.md index c88c11a..a324b5a 100644 --- a/content/blog/gstreamer.md +++ b/content/blog/gstreamer.md @@ -3,6 +3,7 @@ title: "GStreamer" date: 2020-02-08T20:46:36-05:00 draft: false tags: [ "Audio-Video" ] +medium_enabled: true --- GStreamer is a pipeline based multimedia framework that goes from capture, processing, to a sink such as a X window or UDP sink. diff --git a/content/blog/haskellrealsequences.md b/content/blog/haskellrealsequences.md index 4c6efef..da233a9 100644 --- a/content/blog/haskellrealsequences.md +++ b/content/blog/haskellrealsequences.md @@ -1,9 +1,12 @@ --- -title: "Real Analysis Sequences in Haskell" -date: 2019-05-21T22:18:21-04:00 +date: 2019-05-21 22:18:21-04:00 draft: false math: true -tags: ["Math", "Haskell"] +medium_enabled: true +tags: +- Math +- Haskell +title: Real Analysis Sequences in Haskell --- In Real Analysis it is useful to look at terms of a sequence. One of the best ways I've found to do this is in believe it or not Haskell. This is mainly for these two reasons @@ -47,5 +50,4 @@ To look at the differences between each term: ```haskell diff x = map (\(a, b) -> a - b) $ zip (tail x) (init x) -``` - +``` \ No newline at end of file diff --git a/content/blog/hugo-hiding-section-from-listing.md b/content/blog/hugo-hiding-section-from-listing.md index 14ae7bc..092f95b 100644 --- a/content/blog/hugo-hiding-section-from-listing.md +++ b/content/blog/hugo-hiding-section-from-listing.md @@ -4,6 +4,7 @@ date: 2022-05-19T22:43:04-04:00 draft: false tags: ["Hugo"] math: false +medium_enabled: true --- In Hugo you can list all the sections using the following code diff --git a/content/blog/human-readable-sizes.md b/content/blog/human-readable-sizes.md index 6879aef..f71f072 100644 --- a/content/blog/human-readable-sizes.md +++ b/content/blog/human-readable-sizes.md @@ -4,6 +4,7 @@ date: 2021-03-15T19:11:35-04:00 draft: false tags: [] math: true +medium_enabled: true --- When playing with large and small values, it is useful to convert them to a different unit in scientific notation. Let's look at bytes. diff --git a/content/blog/identifying-plants-with-inaturalist.md b/content/blog/identifying-plants-with-inaturalist.md index 9175101..6a91f2f 100644 --- a/content/blog/identifying-plants-with-inaturalist.md +++ b/content/blog/identifying-plants-with-inaturalist.md @@ -4,6 +4,7 @@ date: 2022-09-29T20:08:30-04:00 draft: false tags: [] math: false +medium_enabled: true --- Seek by iNaturalist ([android](https://play.google.com/store/apps/details?id=org.inaturalist.seek)) ([apple](https://apps.apple.com/us/app/seek-by-inaturalist/id1353224144)) is a great app for identifying plants and animals. It uses a computer vision model to provide the hierarchical classifications. In fact they run yearly challenges with their dataset on [Kaggle](https://www.kaggle.com/c/inaturalist-2021/overview) as well as publicly host their dataset on AWS ([instructions](https://github.com/inaturalist/inaturalist-open-data)). diff --git a/content/blog/immutable-bfs-unfold.md b/content/blog/immutable-bfs-unfold.md index fcb6557..6240ace 100644 --- a/content/blog/immutable-bfs-unfold.md +++ b/content/blog/immutable-bfs-unfold.md @@ -1,9 +1,13 @@ --- -title: "Immutable Traversals with Unfold" -date: 2022-11-12T21:27:42-05:00 +date: 2022-11-12 21:27:42-05:00 draft: false -tags: ["Functional Programming", "Scala"] math: false +medium_enabled: true +medium_post_id: ddffc5b14ef9 +tags: +- Functional Programming +- Scala +title: Immutable Traversals with Unfold --- Let's consider the following binary tree: @@ -107,7 +111,4 @@ def DFS3(node: BinNode): Iterator[BinNode] = val next_s = s.init ++ crnt_node.right ++ crnt_node.left Some(crnt_node, next_s) ) -``` - - - +``` \ No newline at end of file diff --git a/content/blog/intensional-logic-extends-first-order.md b/content/blog/intensional-logic-extends-first-order.md index 4d5a46d..f0e1914 100644 --- a/content/blog/intensional-logic-extends-first-order.md +++ b/content/blog/intensional-logic-extends-first-order.md @@ -4,6 +4,7 @@ date: 2022-02-26T20:33:38-05:00 draft: false tags: [] math: true +medium_enabled: true --- The second brightest object in the sky is known as the morgensteorra (morning star) and æfensteorra (evening star). Later on this object became known as Venus. [(Wikipedia)](https://en.wikipedia.org/wiki/Venus_in_culture) diff --git a/content/blog/internalca.md b/content/blog/internalca.md index 7d4638f..a57a63f 100644 --- a/content/blog/internalca.md +++ b/content/blog/internalca.md @@ -3,6 +3,7 @@ title: "Quick CA for internal LAN" date: 2020-04-18T16:26:53-04:00 draft: false tags: ["Networking", "Security"] +medium_enabled: true --- Setting up trusted HTTPs inside a network without exposure to the Internet requires creating a Certificate Authority. The audience for this post is oriented for people setting up services in a small low threat model environment. Additional cautions should be applied when setting this up for a business, for example working off an intermediate CA. diff --git a/content/blog/introrfpoweramp.md b/content/blog/introrfpoweramp.md index ba81f05..2411c39 100644 --- a/content/blog/introrfpoweramp.md +++ b/content/blog/introrfpoweramp.md @@ -4,6 +4,7 @@ date: 2021-04-10T13:01:00-04:00 draft: false tags: ["Amateur Radio"] math: true +medium_enabled: true --- For field day I've been toying with the idea of buying a power amplifier for my HackRF. What I've come to realize is that there are a lot more to power amplifiers than just how much it amplifies by. This post outlines my current understanding (I'm by no means an expert) on the subject of RF power amplifiers. diff --git a/content/blog/ipaddressesinpython.md b/content/blog/ipaddressesinpython.md index 249de37..db350ea 100644 --- a/content/blog/ipaddressesinpython.md +++ b/content/blog/ipaddressesinpython.md @@ -3,6 +3,7 @@ title: "How to get list of IP Addresses in Python" date: 2020-09-07T20:03:24-04:00 draft: false tags: ["Python", "Networking"] +medium_enabled: true --- [Elemag](https://stackoverflow.com/users/2436840/elemag) on gave a quick solution on StackOverflow on [how to determine IP addresses with multiple NICS](https://stackoverflow.com/questions/270745/how-do-i-determine-all-of-my-ip-addresses-when-i-have-multiple-nics). diff --git a/content/blog/iterativecsv.md b/content/blog/iterativecsv.md index b4d125a..2870e3d 100644 --- a/content/blog/iterativecsv.md +++ b/content/blog/iterativecsv.md @@ -3,6 +3,7 @@ title: "Iteratively Read CSV" date: 2020-04-11T21:34:33-04:00 draft: false tags: ["Python"] +medium_enabled: true --- If you want to analyze a CSV dataset that is larger than the space available in RAM, then you can iteratively process each observation and store/calculate only what you need. There is a way to do this in standard Python as well as the popular library Pandas. diff --git a/content/blog/junit-script.md b/content/blog/junit-script.md index 12faa4b..c779527 100644 --- a/content/blog/junit-script.md +++ b/content/blog/junit-script.md @@ -4,6 +4,7 @@ date: 2022-02-26T20:02:53-05:00 draft: false tags: ["Java"] math: false +medium_enabled: true --- Running a JUnit test on the terminal is a little annoying. Here is a quick script to make it easier, make it executable and drop it in [`~/.local/bin`](/blog/customexec/) for easy use. diff --git a/content/blog/jupyterwithpyenv.md b/content/blog/jupyterwithpyenv.md index c901122..81e26f6 100644 --- a/content/blog/jupyterwithpyenv.md +++ b/content/blog/jupyterwithpyenv.md @@ -3,6 +3,7 @@ title: "Jupyter with Pyenv" date: 2020-07-21T02:44:06-04:00 draft: false tags: ["Python"] +medium_enabled: true --- I enjoy both managing my Python versions with [pyenv](/blog/pyenv/) and the literate programming environment [Jupyter lab](https://jupyter.org/). Luckily we can easily manage Python virtual environments via iPython kernels. diff --git a/content/blog/latex-footnote-no-count.md b/content/blog/latex-footnote-no-count.md index fb1d730..c945178 100644 --- a/content/blog/latex-footnote-no-count.md +++ b/content/blog/latex-footnote-no-count.md @@ -4,6 +4,7 @@ date: 2022-09-23T15:34:28-04:00 draft: false tags: ["LaTex"] math: false +medium_enabled: true --- Let's say there's a scenario where you want to have a footnote, but you don't want a counter associated with it. In order to stay consistent with the document style, the solution should use `\footnote` within its implementation. diff --git a/content/blog/latexcode.md b/content/blog/latexcode.md index 8e022f9..d7acc3d 100644 --- a/content/blog/latexcode.md +++ b/content/blog/latexcode.md @@ -3,6 +3,7 @@ title: "Code in LaTex" date: 2020-04-30T23:46:05-04:00 draft: false tags: ["LaTex"] +medium_enabled: true --- I am currently working on a paper in LaTex and wanted to include some source code in it. I didn't want to use the default `verbatim` environment since I wanted to include syntax highlighting as well. Luckily, the `listings` package is an easy and extensible way to include source code inside LaTex documents. To speak first of its extensibility, here is a subset of the arguments that it can possibly take: diff --git a/content/blog/latexlistlabels.md b/content/blog/latexlistlabels.md index 1357125..85acb62 100644 --- a/content/blog/latexlistlabels.md +++ b/content/blog/latexlistlabels.md @@ -4,6 +4,7 @@ date: 2022-01-16T23:17:51-05:00 draft: false tags: ["LaTex"] math: false +medium_enabled: true --- A quick tip that I recently learned is that the symbols in a LaTex list item is changeable. In fact, the following technique works for both the `enumerate` and `itemize` environments. diff --git a/content/blog/launchappsthroughterminal.md b/content/blog/launchappsthroughterminal.md index 5c15cb0..f98cf80 100644 --- a/content/blog/launchappsthroughterminal.md +++ b/content/blog/launchappsthroughterminal.md @@ -3,6 +3,7 @@ title: "Launch Apps through the Terminal" date: 2020-09-26T21:48:09-04:00 draft: false tags: ["Linux"] +medium_enabled: true --- Normally when you launch an application through the terminal, the standard output appears, and closing the terminal closes the application. diff --git a/content/blog/leantactics.md b/content/blog/leantactics.md index 05b988a..348b44a 100644 --- a/content/blog/leantactics.md +++ b/content/blog/leantactics.md @@ -4,6 +4,7 @@ date: 2021-10-10T23:52:41-04:00 draft: false tags: ["Formal Methods"] math: false +medium_enabled: true --- I've recently been playing with the Lean Theorem Prover. I am impressed with how some of the mathematics community decided to extend this project via [mathlib](https://leanprover-community.github.io/) and really make proving theorems in this framework easy and enjoyable. diff --git a/content/blog/librecalctips.md b/content/blog/librecalctips.md index 9fbf51b..ec58b28 100644 --- a/content/blog/librecalctips.md +++ b/content/blog/librecalctips.md @@ -3,6 +3,7 @@ title: "LibreOffice Calc Tips" date: 2021-02-20T12:37:48-05:00 draft: false tags: [] +medium_enabled: true --- I've been working with LibreOffice Calc (or Excel) spreadsheets recently and wanted to share some of the things I've learned. diff --git a/content/blog/limitbandwidth.md b/content/blog/limitbandwidth.md index 7e90786..0887097 100644 --- a/content/blog/limitbandwidth.md +++ b/content/blog/limitbandwidth.md @@ -3,6 +3,7 @@ title: "Limit Bandwidth through Terminal" date: 2020-01-15T19:51:45-05:00 draft: false tags: [ "Linux", "Networking" ] +medium_enabled: true --- Have you ever wondered how an application or a system would operate under low bandwidth environments? Luckily `wondershaper` is a tool to help with just that! diff --git a/content/blog/linuxdesktopicons.md b/content/blog/linuxdesktopicons.md index e6c8936..65ea855 100644 --- a/content/blog/linuxdesktopicons.md +++ b/content/blog/linuxdesktopicons.md @@ -3,6 +3,7 @@ title: "Linux Desktop Icons" date: 2019-06-03T21:05:37-04:00 draft: false tags: [ "Linux" ] +medium_enabled: true --- I get asked a decent number of times how to add desktop icons on Linux. Luckily it's incredibly easy. [It's a `freedesktop` standard](http://standards.freedesktop.org/desktop-entry-spec/latest/). diff --git a/content/blog/livedoc.md b/content/blog/livedoc.md index a84cdef..5e72ab8 100644 --- a/content/blog/livedoc.md +++ b/content/blog/livedoc.md @@ -3,6 +3,7 @@ title: "Live Documentation" date: 2019-09-27T23:07:19-04:00 draft: false tags: ["Documentation"] +medium_enabled: true --- This blog post is mostly for one of my teams in which I use Jupyter Notebooks for documentation. Perhaps after reading this post, you the reader can understand why it might be beneficial to use Jupyter Notebooks as a form of documentation. diff --git a/content/blog/localrepoiso.md b/content/blog/localrepoiso.md index 6a5ddeb..1a8b4ed 100644 --- a/content/blog/localrepoiso.md +++ b/content/blog/localrepoiso.md @@ -2,6 +2,7 @@ title: "Local Repo From Live Installer" date: 2019-08-30T20:26:53-04:00 draft: false +medium_enabled: true --- I'm going to share my experience setting up a local repo from a CentOS live CD. These instructions should work similarly in REHL. diff --git a/content/blog/lxdtmpfs.md b/content/blog/lxdtmpfs.md index e0e2888..d070989 100644 --- a/content/blog/lxdtmpfs.md +++ b/content/blog/lxdtmpfs.md @@ -3,6 +3,7 @@ title: "LXD on tmpfs" date: 2019-12-31T22:35:21-05:00 draft: false tags: [ "Linux", "Storage", "Containers" ] +medium_enabled: true --- Container images are designed to be as small as possible. Wouldn't it be cool if we can hold entire containers in RAM? This post outlines how to accomplish this using LXD. It turns out that it is a lot easier to setup custom storage pools on LXD than with Docker. diff --git a/content/blog/managepythonapps.md b/content/blog/managepythonapps.md index 5629c07..2841a69 100644 --- a/content/blog/managepythonapps.md +++ b/content/blog/managepythonapps.md @@ -3,6 +3,7 @@ title: "Manage Python Applications" date: 2020-10-11T19:21:10-04:00 draft: false tags: ["Python"] +medium_enabled: true --- I've recently discovered an application called [`pipx`](https://pipxproject.github.io/pipx/) which allows one to install and run Python applications in isolated environments. I think of it as a package similar to `apt`, but keeps the packages nice and isolated from one another. diff --git a/content/blog/manpandoc.md b/content/blog/manpandoc.md index d62aa54..7866119 100644 --- a/content/blog/manpandoc.md +++ b/content/blog/manpandoc.md @@ -3,6 +3,7 @@ title: "Man Pages with Pandoc" date: 2019-11-07T21:42:08-05:00 draft: false tags: ["Documentation"] +medium_enabled: true --- [Ethan Martin](https://emar10.dev) recently showed off the Pandoc tool to me. In case you don't know, Pandoc is a swiss-army knife of markup languages. It allows you to easily convert from one markup language to another. diff --git a/content/blog/mastodon-webfinger-alias-using-redirects.md b/content/blog/mastodon-webfinger-alias-using-redirects.md index a45c245..79ef037 100644 --- a/content/blog/mastodon-webfinger-alias-using-redirects.md +++ b/content/blog/mastodon-webfinger-alias-using-redirects.md @@ -1,9 +1,12 @@ --- -title: "Mastodon/Webfinger Alias using HTTP Redirects" -date: 2022-12-31T09:50:00-05:00 +date: 2022-12-31 09:50:00-05:00 draft: false -tags: ["Mastodon"] math: false +medium_enabled: true +medium_post_id: dd0c680d595e +tags: +- Mastodon +title: Mastodon/Webfinger Alias using HTTP Redirects --- Mastodon uses the Webfinger protocol to find users. For example, if you search for `@brozek@brandonrozek.com` it will access the url: @@ -65,4 +68,4 @@ location /.well-known/webfinger { } ``` -Now this isn't a perfect alias, you can't reference `@brozek@brandonrozek.com` and have me be notified. Instead, this only works in user discovery. +Now this isn't a perfect alias, you can't reference `@brozek@brandonrozek.com` and have me be notified. Instead, this only works in user discovery. \ No newline at end of file diff --git a/content/blog/memoization-scala.md b/content/blog/memoization-scala.md index f9ab422..279a337 100644 --- a/content/blog/memoization-scala.md +++ b/content/blog/memoization-scala.md @@ -4,6 +4,7 @@ date: 2022-11-12T11:49:51-05:00 draft: false tags: ["Scala"] math: false +medium_enabled: true --- In a [recent post](/blog/corecursion-unfold-infinite-sequences/), I talked about how corecursion is a great solution for removing redundant calculations. However if we're sticking to a recursive approach, one way we can reduce redundancies is to use memoization. The idea here is that we save prior computations in some data structure and refer to them if requested. diff --git a/content/blog/memoryerrorsgo.md b/content/blog/memoryerrorsgo.md index 72beb7c..352900d 100644 --- a/content/blog/memoryerrorsgo.md +++ b/content/blog/memoryerrorsgo.md @@ -2,6 +2,7 @@ title: "Memory Errors in Go" date: 2019-08-02T22:35:53-04:00 draft: false +medium_enabled: true --- I enjoy playing with Valgrind. Sometimes I view it as a game to get rid of memory errors. When I wrote a go script, I noticed that I received a lot of memory errors. I decided to double check by writing a simple hello world program in Go. diff --git a/content/blog/mergerfs.md b/content/blog/mergerfs.md index 1cc5f12..757026f 100644 --- a/content/blog/mergerfs.md +++ b/content/blog/mergerfs.md @@ -3,6 +3,7 @@ title: "MergerFS" date: 2020-01-14T23:10:17-05:00 draft: false tags: [ "Linux", "Storage" ] +medium_enabled: true --- [MergerFS](https://github.com/trapexit/mergerfs) is a great filesystem for an expandable storage system in a homelab. Mostly since it allows you to add disks one at a time without having to, for example, resilver a ZFS pool. MergerFS won't be as efficient as a filesystem that stripes your data across disks, but in the case of a disk failure the disks unaffected will still have part of the data. diff --git a/content/blog/mirrordownload.md b/content/blog/mirrordownload.md index a9d750f..2343640 100644 --- a/content/blog/mirrordownload.md +++ b/content/blog/mirrordownload.md @@ -3,6 +3,7 @@ title: "Mirror Download with wget" date: 2020-01-20T21:18:12-05:00 draft: false tags: [ "Linux", "Archive" ] +medium_enabled: true --- This post will describe downloading a `centos` repo using `wget`. Though the ideas in this blog post can apply to any mirror with packages exposed via http. diff --git a/content/blog/mirrorhugosite.md b/content/blog/mirrorhugosite.md index b357b86..09f8c48 100644 --- a/content/blog/mirrorhugosite.md +++ b/content/blog/mirrorhugosite.md @@ -3,6 +3,7 @@ title: "Mirror a Hugo Site" date: 2020-12-07T22:41:17-05:00 draft: false tags: ["Archive", "Hugo"] +medium_enabled: true --- I'm a big proponent of having offline copies of content. Especially when I'm on travel and don't have easy Internet access. Using the built in hugo webserver and a reverse proxy, I will show how we can host a local mirror of a Hugo site. diff --git a/content/blog/mirroringwithgitea.md b/content/blog/mirroringwithgitea.md index 87d0018..a5ec9cf 100644 --- a/content/blog/mirroringwithgitea.md +++ b/content/blog/mirroringwithgitea.md @@ -3,6 +3,7 @@ title: "Mirroring with Gitea" date: 2020-12-07T23:46:21-05:00 draft: false tags: ["Archive"] +medium_enabled: true --- Sites like Github, Gitlab, and BitBucket have nice UIs that make looking at commit diffs and issue tracking easier. However, this requires an internet connection. What if we can mirror the content from these sites locally? Gitea comes to the rescue! diff --git a/content/blog/missinglibraries.md b/content/blog/missinglibraries.md index 10d1f8c..5e6b6c6 100644 --- a/content/blog/missinglibraries.md +++ b/content/blog/missinglibraries.md @@ -3,6 +3,7 @@ title: "Missing Libraries" date: 2020-02-08T20:42:50-05:00 draft: false tags: [ "Linux" ] +medium_enabled: true --- The piwheels blog outlined a great [post](https://blog.piwheels.org/how-to-work-out-the-missing-dependencies-for-a-python-package/) on what to do when you are missing shared libraries in Python packages. Though the short of this tip is helpful on its own as well. If you are running any piece of software and its missing a library, try to find the `.so` file related to that package. diff --git a/content/blog/multicastreceivescript.md b/content/blog/multicastreceivescript.md index b6abb09..01bfb29 100644 --- a/content/blog/multicastreceivescript.md +++ b/content/blog/multicastreceivescript.md @@ -3,6 +3,7 @@ title: "Multicast Receive Script" date: 2020-11-18T10:09:15-05:00 draft: false tags: ["Linux", "Networking"] +medium_enabled: true --- I use `socat` to debug mutlicast traffic, though the syntax for it is complicated to learn. Here is the command that I normally use to debug multicast traffic. diff --git a/content/blog/multicolumnbeamerslide.md b/content/blog/multicolumnbeamerslide.md index d04a176..ea29b51 100644 --- a/content/blog/multicolumnbeamerslide.md +++ b/content/blog/multicolumnbeamerslide.md @@ -4,6 +4,7 @@ date: 2022-01-26T23:29:31-05:00 draft: false tags: ["LaTex"] math: false +medium_enabled: true --- When creating slides in LaTex Beamer, it can be frustrating to not have the easy ability to drag text boxes around. Luckily, creating a multi-column layout in Beamer is not difficult! Below is an example of a two column slide layout, where the left side is a bulleted list, and the right side is an image: diff --git a/content/blog/neovimplugins.md b/content/blog/neovimplugins.md index 790dbe6..d6f5ad9 100644 --- a/content/blog/neovimplugins.md +++ b/content/blog/neovimplugins.md @@ -3,6 +3,7 @@ title: "Neovim Plugins" date: 2020-03-23T22:52:19-04:00 draft: false tags: [] +medium_enabled: true --- I decided to switch to [`neovim`](https://neovim.io/) recently and that resulted in having to redo my setup. This post will describe how to setup plugins with `vim-plug`. diff --git a/content/blog/netbootxyz.md b/content/blog/netbootxyz.md index 143b6b9..16283a7 100644 --- a/content/blog/netbootxyz.md +++ b/content/blog/netbootxyz.md @@ -3,6 +3,7 @@ title: "Netboot.xyz Bootloader" date: 2021-06-18T15:43:29-04:00 draft: false tags: [] +medium_enabled: true --- Instead of manually loading ISOs onto a USB stick for [Ventoy](/blog/ventoy) to display, we can use Netboot.xyz to present us a list of options and download them during boot. This requires an internet connection in order to work. diff --git a/content/blog/networkdebugging.md b/content/blog/networkdebugging.md index 44a8415..b3dbf2c 100644 --- a/content/blog/networkdebugging.md +++ b/content/blog/networkdebugging.md @@ -4,6 +4,7 @@ date: 2022-01-02T15:17:02-05:00 draft: false tags: ["Networking"] math: false +medium_enabled: true --- Below are list of commands that I use to debug common issues in a network. There is a wonderful tool called Wireshark which you can use to sniff packets in a network and filter by a wide range of options, but we'll mainly focus on simple tools that you can use in the terminal. diff --git a/content/blog/networkthroughput.md b/content/blog/networkthroughput.md index a7a4a50..7366e23 100644 --- a/content/blog/networkthroughput.md +++ b/content/blog/networkthroughput.md @@ -3,6 +3,7 @@ title: "Network Throughput Testing" date: 2019-08-30T20:11:26-04:00 draft: false tags: [ "Linux", "Networking" ] +medium_enabled: true --- I ended up upgrading the wiring in my place to CAT7 recently and I wanted to see if there was a noticeable performance difference to my previous cabling. This blog post won't be a product comparison, but instead I'll show how you can do network throughput testing at your own location. diff --git a/content/blog/networkx-random-sample-graph.md b/content/blog/networkx-random-sample-graph.md index 5b52633..c6c869a 100644 --- a/content/blog/networkx-random-sample-graph.md +++ b/content/blog/networkx-random-sample-graph.md @@ -4,6 +4,7 @@ date: 2022-04-07T19:48:12-04:00 draft: false tags: ["Python"] math: false +medium_enabled: true --- I've been working on several algorithms in `networkx`. In order to speed up testing, especially on large graphs, I've been randomly sampling portions of the original graph. The best way I've found to do this is through the following python snippet: diff --git a/content/blog/networkxtree.md b/content/blog/networkxtree.md index 777ec75..b66c1d1 100644 --- a/content/blog/networkxtree.md +++ b/content/blog/networkxtree.md @@ -4,6 +4,7 @@ date: 2022-01-02T20:36:41-05:00 draft: false tags: ["Python"] math: false +medium_enabled: true --- A graph in D3 and NetworkX can be represented as a JSON file. diff --git a/content/blog/nginx-gzip.md b/content/blog/nginx-gzip.md index a82199b..1061835 100644 --- a/content/blog/nginx-gzip.md +++ b/content/blog/nginx-gzip.md @@ -4,6 +4,7 @@ date: 2022-02-04T20:06:50-05:00 draft: false tags: [] math: false +medium_enabled: true --- Browsers that support gzip compression send the header `Accept-Encoding: gzip` in its request and if the webserver supports gzip, then it can send the website data back compressed. Though recently I learned that this isn't setup by default in `nginx`! This post will go over the configuration you'll need to add to `/etc/nginx/nginx.conf` in order to support `gzip` compression. From my experience, enabling `gzip` compression reduced network traffic by 1/4. diff --git a/content/blog/ngrok.md b/content/blog/ngrok.md index 3f134b6..0abe650 100644 --- a/content/blog/ngrok.md +++ b/content/blog/ngrok.md @@ -3,6 +3,7 @@ title: "Ngrok" date: 2019-11-20T20:56:19-05:00 draft: false tags: ["Networking"] +medium_enabled: true --- Let's say you want to spin up a quick demo for a client and you don't want to use a VPS, and they can't access your laptop through the network. diff --git a/content/blog/non-root-systemd-scripts.md b/content/blog/non-root-systemd-scripts.md index 269e1de..332090a 100644 --- a/content/blog/non-root-systemd-scripts.md +++ b/content/blog/non-root-systemd-scripts.md @@ -4,6 +4,7 @@ date: 2022-03-15T23:55:19-04:00 draft: false tags: ["Linux"] math: false +medium_enabled: true --- I know of two ways to run systemd services not as root. They both have their pros and cons associated with them. diff --git a/content/blog/notes-beamer-latex.md b/content/blog/notes-beamer-latex.md index 876b4e8..111db3e 100644 --- a/content/blog/notes-beamer-latex.md +++ b/content/blog/notes-beamer-latex.md @@ -4,6 +4,7 @@ date: 2022-10-25T21:43:38-04:00 draft: false tags: ["LaTex"] math: false +medium_enabled: true --- I often struggle with deciding how much content to put on my slides. Personally, I feel that my slides should be self-contained so that others can review them afterwards. This was especially true when I held [recitations](/ta/spring2022/csci2600/) as a TA. diff --git a/content/blog/obswebcam.md b/content/blog/obswebcam.md index a69ed07..0119b92 100644 --- a/content/blog/obswebcam.md +++ b/content/blog/obswebcam.md @@ -3,6 +3,7 @@ title: "OBS Webcam" date: 2020-05-25T23:53:56-04:00 draft: false tags: ["Audio-Video"] +medium_enabled: true --- [Open Broadcaster Software](https://obsproject.com/) is a great piece of software for recording and live streaming different video content. It would be nice to use the same level of professional software in video calling software as well. diff --git a/content/blog/obtaining-multiple-solutions-z3.md b/content/blog/obtaining-multiple-solutions-z3.md index 4ef1b5f..1a8de7e 100644 --- a/content/blog/obtaining-multiple-solutions-z3.md +++ b/content/blog/obtaining-multiple-solutions-z3.md @@ -1,9 +1,11 @@ --- -title: "Obtaining Multiple Solutions Z3" -date: 2022-12-31T09:52:00-05:00 +date: 2022-12-31 09:52:00-05:00 draft: false -tags: [] math: true +medium_enabled: true +medium_post_id: d4f11c04d852 +tags: [] +title: Obtaining Multiple Solutions Z3 --- Playing around with Diophantine solvers, I wanted to obtain the solutions of the following equation: @@ -87,4 +89,4 @@ The solutions of a linear Diophantine equation can be easily parameterized so I - https://stackoverflow.com/questions/11867611/z3py-checking-all-solutions-for-equation/70656700#70656700 - https://stackoverflow.com/questions/11867611/z3py-checking-all-solutions-for-equation/70656700#70656700 -- https://stackoverflow.com/questions/63231398/trying-to-find-all-solutions-to-a-boolean-formula-using-z3-in-python/63232953#63232953 +- https://stackoverflow.com/questions/63231398/trying-to-find-all-solutions-to-a-boolean-formula-using-z3-in-python/63232953#63232953 \ No newline at end of file diff --git a/content/blog/offlinepip.md b/content/blog/offlinepip.md index 5abccf3..e380051 100644 --- a/content/blog/offlinepip.md +++ b/content/blog/offlinepip.md @@ -3,6 +3,7 @@ title: "Offline Pip Packages" date: 2020-01-20T23:11:05-05:00 draft: false tags: [ "Python", "Archive" ] +medium_enabled: true --- There are a few reasons I can think of to have offline pip packages: diff --git a/content/blog/ohmyzsh.md b/content/blog/ohmyzsh.md index 6ec8884..1d4dacd 100644 --- a/content/blog/ohmyzsh.md +++ b/content/blog/ohmyzsh.md @@ -3,6 +3,7 @@ title: "Oh My Zsh" date: 2019-07-21T08:45:03-04:00 draft: false tags: [ "Linux" ] +medium_enabled: true --- Zsh is an extension of the sh that contains a lot more features than the default bash shell installed on most systems. diff --git a/content/blog/openmpi-fedora.md b/content/blog/openmpi-fedora.md index 9859b7c..2b2fdbd 100644 --- a/content/blog/openmpi-fedora.md +++ b/content/blog/openmpi-fedora.md @@ -4,6 +4,7 @@ date: 2022-05-03T00:52:38-04:00 draft: false tags: ["Fedora"] math: false +medium_enabled: true --- To use use the OpenMPI compilers (mpicc, mpic++, etc.) and mpirun diff --git a/content/blog/openvpncontainer.md b/content/blog/openvpncontainer.md index 44d55ad..0f25bfb 100644 --- a/content/blog/openvpncontainer.md +++ b/content/blog/openvpncontainer.md @@ -3,6 +3,7 @@ title: "OpenVPN Container" date: 2020-04-30T23:20:49-04:00 draft: false tags: ["Containers"] +medium_enabled: true --- Instead of configuring multiple containers to use a VPN, we can setup a VPN container and route the other containers traffic through this container. This post will outline how to do that with [dperson's OpenVPN Container](https://github.com/dperson/openvpn-client). diff --git a/content/blog/optionality-risk-aversion.md b/content/blog/optionality-risk-aversion.md index 84bd4a1..7a0f0b8 100644 --- a/content/blog/optionality-risk-aversion.md +++ b/content/blog/optionality-risk-aversion.md @@ -4,6 +4,7 @@ date: 2022-10-12T01:10:42-04:00 draft: false tags: [] math: true +medium_enabled: true --- One technique for making decisions in uncertain situations is to look for *optionality*. This is one of the tips given in Russ Robert's book [Wild problems: a guide to the decisions that define us](https://www.worldcat.org/title/1321820629). Let's start off with the two definitions listed on [Wiktionary](https://en.wiktionary.org/wiki/optionality) at my time of writing. diff --git a/content/blog/parallel-scp.md b/content/blog/parallel-scp.md index 91a7729..37466a2 100644 --- a/content/blog/parallel-scp.md +++ b/content/blog/parallel-scp.md @@ -4,6 +4,7 @@ date: 2021-07-25T10:38:43-04:00 draft: false tags: [] math: false +medium_enabled: true --- Segmented file transfer allows you to split up a file into multiple chunks and download them in parallel. There is a program written for Linux called LFTP which can accomplish this task and supports FTP, HTTP, SFTP, BitTorrent, among others. The syntax is a little funky, so I wrote a wrapper I call `pget` which allows for segmented file transfers using SCP. diff --git a/content/blog/permission-denied-writing-privileged-locations.md b/content/blog/permission-denied-writing-privileged-locations.md index 125336a..8004b59 100644 --- a/content/blog/permission-denied-writing-privileged-locations.md +++ b/content/blog/permission-denied-writing-privileged-locations.md @@ -4,6 +4,7 @@ date: 2022-04-07T20:09:40-04:00 draft: false tags: [] math: false +medium_enabled: true --- Perhaps you've tried something like the following: diff --git a/content/blog/personal-simple-web-archive.md b/content/blog/personal-simple-web-archive.md index f8a92e5..5b4e847 100644 --- a/content/blog/personal-simple-web-archive.md +++ b/content/blog/personal-simple-web-archive.md @@ -1,8 +1,11 @@ --- -title: "Personal Web Archive and How I Archive Single Web pages" -date: 2022-12-24T10:01:16-04:00 +date: 2022-12-24 10:01:16-04:00 draft: false -tags: [ "Archive" ] +medium_enabled: true +medium_post_id: 9b2818a6e154 +tags: +- Archive +title: Personal Web Archive and How I Archive Single Web pages --- The [Internet Archive](https://web.archive.org/) is great for providing a centralized database of snapshots of websites throughout time. What happens though when you want to have diff --git a/content/blog/personalsitepreservingurls.md b/content/blog/personalsitepreservingurls.md index 2620c17..f4f963c 100644 --- a/content/blog/personalsitepreservingurls.md +++ b/content/blog/personalsitepreservingurls.md @@ -3,6 +3,7 @@ title: "Preserving Classic URLs on my Website" date: 2020-10-28T21:06:57-04:00 draft: false tags: [] +medium_enabled: true --- At some point in 2018 I switched my website from using Wordpress on the backend to Hugo. I used a simple script to migrate everything over and in that migration a few things broke. diff --git a/content/blog/phonegpsforward.md b/content/blog/phonegpsforward.md index 0e9f52c..551285c 100644 --- a/content/blog/phonegpsforward.md +++ b/content/blog/phonegpsforward.md @@ -3,6 +3,7 @@ title: "Forwarding Phone's GPS" date: 2020-11-08T00:58:11-05:00 draft: false tags: ["GPS"] +medium_enabled: true --- Sometimes I wish to open up [Marble](https://marble.kde.org/) which an a mapping application and see my current location on the globe. My laptop, however, doesn't have a GPS module in it. Though I realized that I carry around a device that does... My phone. diff --git a/content/blog/pidhcp.md b/content/blog/pidhcp.md index aa3b0b0..e7ef0e7 100644 --- a/content/blog/pidhcp.md +++ b/content/blog/pidhcp.md @@ -3,6 +3,7 @@ title: "DHCP for Raspberry Pi" date: 2021-02-15T22:46:21-05:00 draft: false tags: ["Networking"] +medium_enabled: true --- Recently I ran across the use case where I needed a Raspberry Pi to be connected to the Internet via a WiFI connection, while also providing DHCP leases through an Ethernet connection. I couldn't find a great way to achieve this with `dhcpcd` so instead I grabbed a tool that I'm more familiar with `dnsmasq`. diff --git a/content/blog/piholedhcpdns.md b/content/blog/piholedhcpdns.md index 01e5a32..a433e0c 100644 --- a/content/blog/piholedhcpdns.md +++ b/content/blog/piholedhcpdns.md @@ -3,6 +3,7 @@ title: "Configuring DHCP DNS in Pihole" date: 2020-05-25T23:36:51-04:00 draft: false tags: ["Networking"] +medium_enabled: true --- There are two scenarios I can imagine in where you want to configure the DNS set by PiHole diff --git a/content/blog/pingdiscovery.md b/content/blog/pingdiscovery.md index 4e62ead..d0d2433 100644 --- a/content/blog/pingdiscovery.md +++ b/content/blog/pingdiscovery.md @@ -3,6 +3,7 @@ title: "Ping Discovery" date: 2020-02-02T22:21:30-05:00 draft: false tags: [ "Linux", "Networking" ] +medium_enabled: true --- Plugging in a device into a network with DHCP will often result in you not knowing what the ip is. If you don't have easy access to the DHCP server, then one way to see what ip addresses are on the network is to do a ping scan. diff --git a/content/blog/pipconf.md b/content/blog/pipconf.md index 2ac63b3..ef6b033 100644 --- a/content/blog/pipconf.md +++ b/content/blog/pipconf.md @@ -3,6 +3,7 @@ title: "Pip Config" date: 2020-04-10T11:56:19-04:00 draft: false tags: ["Python"] +medium_enabled: true --- If you find yourself added flags to every pip command, consider adding those flag's to a pip configuration file. diff --git a/content/blog/pipeditable.md b/content/blog/pipeditable.md index 2039c0b..1458d5a 100644 --- a/content/blog/pipeditable.md +++ b/content/blog/pipeditable.md @@ -3,6 +3,7 @@ title: "Pip Editable" date: 2020-04-11T20:38:33-04:00 draft: false tags: ["Python"] +medium_enabled: true --- I've found it to be incredibly helpful to emulate having a library installed on my system rather than depending on my local directory path to pick up my file edits. To do this in a python project, we need to add the `--editable` flag to a pip install. diff --git a/content/blog/podman-nginx-tcpv6-http2-ready.md b/content/blog/podman-nginx-tcpv6-http2-ready.md index 9d845b4..291ecd1 100644 --- a/content/blog/podman-nginx-tcpv6-http2-ready.md +++ b/content/blog/podman-nginx-tcpv6-http2-ready.md @@ -4,6 +4,7 @@ date: 2022-09-28T22:43:28-04:00 draft: false tags: ["Networking", "Containers"] math: false +medium_enabled: true --- When checking the status of my website, I discovered that my website wasn't accessible over IPV6 and didn't have HTTP/2 enabled! This post will go over how I remedied that with my current setup of Nginx running within a podman container. Do note, TCPv6 will only work if you are provided a IPv6 address from your server provider. diff --git a/content/blog/pretty-rss-feeds.md b/content/blog/pretty-rss-feeds.md index 6239253..fe94cbd 100644 --- a/content/blog/pretty-rss-feeds.md +++ b/content/blog/pretty-rss-feeds.md @@ -1,9 +1,11 @@ --- -title: "Pretty RSS Feeds" -date: 2022-12-04T21:42:36-05:00 -draft: false -tags: [] +date: 2022-12-04 21:42:36-05:00 +draft: false math: false +medium_enabled: true +medium_post_id: 5eb712e808ae +tags: [] +title: Pretty RSS Feeds --- Hi, I have a RSS feed. This allows you to subscribe to my words without me even knowing. How does it work? Well you need an RSS link, here's mine: @@ -34,4 +36,4 @@ Most RSS feeds don't come styled. Therefore if you click on the RSS link you'll ``` -I hope more bloggers incorporate the style into their feed. I'm waiting for the day that the largest blogging platform Wordpress includes it by default. +I hope more bloggers incorporate the style into their feed. I'm waiting for the day that the largest blogging platform Wordpress includes it by default. \ No newline at end of file diff --git a/content/blog/printdebug.md b/content/blog/printdebug.md index 61ae7ff..7d9e776 100644 --- a/content/blog/printdebug.md +++ b/content/blog/printdebug.md @@ -3,6 +3,7 @@ title: "Print Statements with Frame Information" date: 2021-06-03T13:54:39-04:00 draft: false tags: ["Testing"] +medium_enabled: true --- I find it extremely useful to include frame information such as filename, line number, and current function in my print statements. Here's a couple ways that I've done that in the past. diff --git a/content/blog/program-verification-hoare-logic-dafny.md b/content/blog/program-verification-hoare-logic-dafny.md index 27ea6fe..91da5a5 100644 --- a/content/blog/program-verification-hoare-logic-dafny.md +++ b/content/blog/program-verification-hoare-logic-dafny.md @@ -4,6 +4,7 @@ date: 2022-02-05T00:06:42-05:00 draft: false tags: ["Formal Methods"] math: false +medium_enabled: true --- In the recitations that I'm giving for [Principles of Software](/ta/spring2022/csci2600/), we are going over reasoning through code using Hoare Logic and the program verifier Dafny. Microsoft Research designed Dafny to be similar to writing imperative code. The main difference is that you need to supply (pre/post)-conditions and the code to verify. Here's an example of how to reason about a simple statement by hand: diff --git a/content/blog/proofdef.md b/content/blog/proofdef.md index 1f10a3e..c3db36e 100644 --- a/content/blog/proofdef.md +++ b/content/blog/proofdef.md @@ -4,6 +4,7 @@ date: 2019-12-29T11:21:07-05:00 draft: false images: [] math: true +medium_enabled: true --- When I look into a new field, sometimes I get confused by the whole new set of vocab terms I need to encounter. This post will serve to keep me straight with the terms involved in theorem proving. diff --git a/content/blog/proving-loop-invariants.md b/content/blog/proving-loop-invariants.md index f34b608..cef1e50 100644 --- a/content/blog/proving-loop-invariants.md +++ b/content/blog/proving-loop-invariants.md @@ -4,6 +4,7 @@ date: 2022-02-26T19:17:21-05:00 draft: false tags: ["Formal Methods"] math: true +medium_enabled: true --- Loop invariants are one of the more complicated concepts in Hoare Logic. One might say that we can simply unroll the loop, but there are many loops where we don't know the number of iterations in advanced. Therefore, we often consider what is called the loop invariant. These are statements that are true before, during, and after the loop. A useful loop invariant in combination of the negation of the loop condition can also prove some postcondition. Lets look at a multiplication example diff --git a/content/blog/pulseaudiortp.md b/content/blog/pulseaudiortp.md index f7de82e..c9caec7 100644 --- a/content/blog/pulseaudiortp.md +++ b/content/blog/pulseaudiortp.md @@ -3,6 +3,7 @@ title: "Streaming PulseAudio over RTP" date: 2020-11-23T23:41:41-05:00 draft: false tags: ["Audio-Video"] +medium_enabled: true --- With PulseAudio, we can send a RTP stream over multicast UDP. Here is the bash commands to setup a sink where anything sent to it gets broadcasted to the multicast address 224.0.0.56 at port 46416. diff --git a/content/blog/pyasyncio.md b/content/blog/pyasyncio.md index 97e69c3..8946085 100644 --- a/content/blog/pyasyncio.md +++ b/content/blog/pyasyncio.md @@ -3,6 +3,7 @@ title: "Python asyncio" date: 2020-04-09T16:37:41-04:00 draft: false tags: ["Python"] +medium_enabled: true --- Daniel Pope wrote a [great blog post](http://mauveweb.co.uk/posts/2014/07/gevent-asynchronous-io-made-easy.html) describing the different ways of performing asynchronous I/O in Python. In this post, I want to focus on his section called "Generator-based Coroutine". Python's `asyncio` module in the standard library has a concept of "coroutines" that uses generators instead of callbacks or promises seen in other asynchronous frameworks. diff --git a/content/blog/pycacheprop.md b/content/blog/pycacheprop.md index 6fe0bd5..ddb53b9 100644 --- a/content/blog/pycacheprop.md +++ b/content/blog/pycacheprop.md @@ -3,6 +3,7 @@ title: "Quick Python: Cached Property" date: 2020-04-18T18:29:21-04:00 draft: false tags: ["Python"] +medium_enabled: true --- If you have a property in an object that only needs to be computed once, consider using `cached_property` to store the result and serve for future function calls. diff --git a/content/blog/pydataclass.md b/content/blog/pydataclass.md index 7ac9545..8e3d379 100644 --- a/content/blog/pydataclass.md +++ b/content/blog/pydataclass.md @@ -3,6 +3,7 @@ title: "Quick Python: Dataclasses" date: 2020-04-08T18:59:48-04:00 draft: false tags: ["Python"] +medium_enabled: true --- Python 3.7 and above have a feature called dataclasses. This allows us to reduce boilerplate code by removing the need to create a whole constructor and providing a sensible `__repr__` function. diff --git a/content/blog/pydecorators.md b/content/blog/pydecorators.md index e393c68..8ffbd25 100644 --- a/content/blog/pydecorators.md +++ b/content/blog/pydecorators.md @@ -3,6 +3,7 @@ title: "Quick Python: Decorators" date: 2020-03-30T18:07:14-04:00 draft: false tags: ["Python"] +medium_enabled: true --- [Geir Arne Hjelle](https://realpython.com/team/gahjelle/) at Real Python wrote a great post called [Primer on Python Decorators](https://realpython.com/primer-on-python-decorators/). I recommend reading that as this post serves mostly as a reminder to myself on how to write a decorator. diff --git a/content/blog/pyenv.md b/content/blog/pyenv.md index c072108..51595e6 100644 --- a/content/blog/pyenv.md +++ b/content/blog/pyenv.md @@ -3,6 +3,7 @@ title: "Managing Python Versions with Pyenv" date: 2020-01-20T09:55:04-05:00 draft: false tags: [ "Python" ] +medium_enabled: true --- I wrote previously about [managing python virtual environments](/blog/virtualenv/). Since then, I've discovered a software called [Pyenv](https://github.com/pyenv/pyenv) which allows you to not only manage virtual environments but python versions. As someone who likes to develop python programs in his free time, I found this incredibly useful in keeping all my virtual environments in one place and easily upgrading to a more recent version of python. diff --git a/content/blog/pyenvbuildflags.md b/content/blog/pyenvbuildflags.md index 31765b3..7fd3e59 100644 --- a/content/blog/pyenvbuildflags.md +++ b/content/blog/pyenvbuildflags.md @@ -3,6 +3,7 @@ title: "Pyenv Build Flags" date: 2020-03-24T16:58:42-04:00 draft: false tags: ["Python"] +medium_enabled: true --- I ran into an issue with PyMC3 where it was expecting a certain symbol that Python wasn't compiled with. diff --git a/content/blog/pyenvtox.md b/content/blog/pyenvtox.md index 29db90d..a5d496b 100644 --- a/content/blog/pyenvtox.md +++ b/content/blog/pyenvtox.md @@ -3,6 +3,7 @@ title: "Pyenv and Tox" date: 2020-02-21T19:06:40-05:00 draft: false tags: [ "Python", "Testing" ] +medium_enabled: true --- Pyenv is great for managing multiple python installations and tox is great for creating virtual environments for testing. What if we can combine the two? For more detailed information visit [Frank-Mich's Blog](https://blog.frank-mich.com/recipe-testing-multiple-python-versions-with-pyenv-and-tox/). diff --git a/content/blog/pyextradeps.md b/content/blog/pyextradeps.md index 462e04b..9d76cdb 100644 --- a/content/blog/pyextradeps.md +++ b/content/blog/pyextradeps.md @@ -3,6 +3,7 @@ title: "Python Packaging: Optional Dependencies" date: 2020-05-01T00:43:07-04:00 draft: false tags: ["Python"] +medium_enabled: true --- It is possible to make different package group of optional dependencies for a Python package. This is useful if you want to include an extra set of dependencies for developers/maintainers of the package. We can also define a plugin-based package similarly to how [OpenAI Gym uses it](https://github.com/openai/gym/blob/67212547ac29296839434324a0d5996e48fae840/setup.py) to denote different categories of environments you can setup. diff --git a/content/blog/pyfutures.md b/content/blog/pyfutures.md index 190ee8f..8747acb 100644 --- a/content/blog/pyfutures.md +++ b/content/blog/pyfutures.md @@ -3,6 +3,7 @@ title: "Quick Python: Concurrent Futures" date: 2020-04-11T20:40:28-04:00 draft: false tags: ["Python"] +medium_enabled: true --- Another way to perform concurrency in python is to use the `concurrent.futures` module. diff --git a/content/blog/pygetset.md b/content/blog/pygetset.md index 1bdbb57..80f542e 100644 --- a/content/blog/pygetset.md +++ b/content/blog/pygetset.md @@ -3,6 +3,7 @@ title: "Quick Python: Getters and Setters" date: 2020-04-08T18:15:21-04:00 draft: false tags: ["Python"] +medium_enabled: true --- One of the hidden gems in Python classes are seamless getters and setters. I discovered this through the book [Effective Python by Brett Slatkin](https://effectivepython.com/). Though the example I'll use is different and shorter than the one he uses in his book. diff --git a/content/blog/pyleniterables.md b/content/blog/pyleniterables.md index c2cbf78..48bc951 100644 --- a/content/blog/pyleniterables.md +++ b/content/blog/pyleniterables.md @@ -3,6 +3,7 @@ title: "Quick Python: Length of Iterables" date: 2020-03-25T18:28:09-04:00 draft: false tags: ["Python"] +medium_enabled: true --- I wanted to find the length of what I know is a finite iterable. Normally you would think of using the `len` function but it does not work in this case. [Al Hoo](https://stackoverflow.com/a/44351664) on StackOverflow shared a quick snippet to calculate this. diff --git a/content/blog/pymemoization.md b/content/blog/pymemoization.md index d6a3cfa..576d053 100644 --- a/content/blog/pymemoization.md +++ b/content/blog/pymemoization.md @@ -3,6 +3,7 @@ title: "Quick Python: Memoization" date: 2020-03-30T17:31:55-04:00 draft: false tags: ["Python"] +medium_enabled: true --- There is often a trade-off when it comes to efficiency of CPU vs memory usage. In this post, I will show how the [`lru_cache`](https://docs.python.org/3/library/functools.html#functools.lru_cache) decorator can cache results of a function call for quicker future lookup. diff --git a/content/blog/pysubscribepattern.md b/content/blog/pysubscribepattern.md index 31d7574..b5b2fad 100644 --- a/content/blog/pysubscribepattern.md +++ b/content/blog/pysubscribepattern.md @@ -3,6 +3,7 @@ title: "Python Patterns: Subscribe" date: 2020-04-14T07:53:46-04:00 draft: false tags: ["Python"] +medium_enabled: true --- It is common for larger applications to have modules that publishes and subscribes to events. This post will outline a couple ways to achieve this using [decorators](/blog/pydecorators/) and standard methods. diff --git a/content/blog/python-argparse.md b/content/blog/python-argparse.md index 1b68506..fa1cb0a 100644 --- a/content/blog/python-argparse.md +++ b/content/blog/python-argparse.md @@ -6,6 +6,7 @@ tags: ["Python"] aliases: - /blog/python-argpase/ math: false +medium_enabled: true --- *For a much better description of argument parsing in Python, please visit https://docs.python.org/3/library/argparse.html.* diff --git a/content/blog/python-check-submodule-load.md b/content/blog/python-check-submodule-load.md index 49825c2..d39215a 100644 --- a/content/blog/python-check-submodule-load.md +++ b/content/blog/python-check-submodule-load.md @@ -1,9 +1,12 @@ --- -title: "Quick Python: Check Submodule Load" -date: 2022-12-01T21:12:03-05:00 +date: 2022-12-01 21:12:03-05:00 draft: false -tags: ["Python"] math: false +medium_enabled: true +medium_post_id: 80a6f9baadf4 +tags: +- Python +title: 'Quick Python: Check Submodule Load' --- Reading other people's code is a great way to learn. Recently, I was looking at the `numpy` repository and they had a hidden gem within their `setup.py`. In large scale repositories like `numpy`, we can have different dependencies that we rely upon via *git submodules*. The following function will check to see that these dependencies are loaded and in a "clean" state. @@ -73,4 +76,4 @@ Notice the `+` behind the second submodule. According to the man page for `git s The existence of the `+` would make this check fail. However, no prefixes will make the check succeed. -By executing this function within the repositories `setup.py`, it verifies that the needed dependencies are checked out and clean before installing the python package. Checks like these make python packages feel a little more stable. +By executing this function within the repositories `setup.py`, it verifies that the needed dependencies are checked out and clean before installing the python package. Checks like these make python packages feel a little more stable. \ No newline at end of file diff --git a/content/blog/pythonabstractclass.md b/content/blog/pythonabstractclass.md index 1fbfaab..0d5a7f1 100644 --- a/content/blog/pythonabstractclass.md +++ b/content/blog/pythonabstractclass.md @@ -3,6 +3,7 @@ title: "Quick Python: Abstract Classes" date: 2020-01-26T18:40:03-05:00 draft: false tags: [ "Python" ] +medium_enabled: true --- You can create an abstract class in Python by inheriting Abstract Base Class (`ABC`) and declaring relevant methods abstract. diff --git a/content/blog/pythonall.md b/content/blog/pythonall.md index 5a451c3..d20751c 100644 --- a/content/blog/pythonall.md +++ b/content/blog/pythonall.md @@ -3,6 +3,7 @@ title: "Quick Python: __all__" date: 2020-05-01T00:53:46-04:00 draft: false tags: ["Python"] +medium_enabled: true --- Anything that is defined inside a package that is imported is also brought into that workspace. So for example, if package `A` uses `numpy` and you import `A`, then `A.numpy` will be shown in your workspace. In order to limit the variables exported, you can define the ones you want to be shown in a variable called `__all__`. diff --git a/content/blog/pythoninterrupts.md b/content/blog/pythoninterrupts.md index 58c53bd..4e9fb9a 100644 --- a/content/blog/pythoninterrupts.md +++ b/content/blog/pythoninterrupts.md @@ -3,6 +3,7 @@ title: "Quick Python: Interrupts" date: 2020-01-25T09:51:34-05:00 draft: false tags: [ "Python" ] +medium_enabled: true --- This post is part of a new series I'm starting where I quickly outline small Python snippets. diff --git a/content/blog/pythonoverloads.md b/content/blog/pythonoverloads.md index 72a58aa..6e2b9af 100644 --- a/content/blog/pythonoverloads.md +++ b/content/blog/pythonoverloads.md @@ -3,6 +3,7 @@ title: "Python Operator Overloads" date: 2020-03-13T20:49:28-04:00 draft: false tags: ["Python"] +medium_enabled: true --- I wrote a [blog post about operator overloads](/blog/cppoverloads/) in C++. Luckily for Python it is heavily document in what is called the [Python Data Model](https://docs.python.org/3/reference/datamodel.html). Though for the sake of having content, I'll share some of the ones that I heavily use in my classes. diff --git a/content/blog/pythonpackagenamespacing.md b/content/blog/pythonpackagenamespacing.md index a06e222..b6f1f73 100644 --- a/content/blog/pythonpackagenamespacing.md +++ b/content/blog/pythonpackagenamespacing.md @@ -3,6 +3,7 @@ title: "Quick Python: Package Namespacing" date: 2020-02-03T20:13:38-05:00 draft: false tags: [ "Python" ] +medium_enabled: true --- Package namespacing can help organize modules within a larger project. It can also help show that a package belongs to an organization. diff --git a/content/blog/pythonpathhacks.md b/content/blog/pythonpathhacks.md index 6fdbc45..83cf831 100644 --- a/content/blog/pythonpathhacks.md +++ b/content/blog/pythonpathhacks.md @@ -3,6 +3,7 @@ title: "Python Path Hacks" date: 2020-01-13T22:26:16-05:00 draft: false tags: [ "Python" ] +medium_enabled: true --- There are two quick ways to hack together custom imports in Python. One is by using the `PYTHONPATH` environmental variable, and the other way is by using the `sys` module in Python. diff --git a/content/blog/pythonsetinterval.md b/content/blog/pythonsetinterval.md index 9203682..9214d11 100644 --- a/content/blog/pythonsetinterval.md +++ b/content/blog/pythonsetinterval.md @@ -3,6 +3,7 @@ title: "Python: Set Interval" date: 2020-02-25T21:34:03-05:00 draft: false tags: [ "Python" ] +medium_enabled: true --- Javascript has a function called `setInterval` which given a length of time $T$ and a callback function, it will perform that function every $T$ milliseconds. For example, to print "Hello, World!" every 5 seconds: diff --git a/content/blog/pythonsetupdevelop.md b/content/blog/pythonsetupdevelop.md index 9375b0c..2d0934d 100644 --- a/content/blog/pythonsetupdevelop.md +++ b/content/blog/pythonsetupdevelop.md @@ -3,6 +3,7 @@ title: "Python setup.py develop" date: 2020-02-21T22:42:55-05:00 draft: false tags: [ "Python" ] +medium_enabled: true --- **Deprecated in favor of [pip install editable](/blog/pipeditable)** diff --git a/content/blog/pythonswig.md b/content/blog/pythonswig.md index 21a0c55..94bad63 100644 --- a/content/blog/pythonswig.md +++ b/content/blog/pythonswig.md @@ -3,6 +3,7 @@ title: "C++ within Python with SWIG" date: 2020-10-27T23:49:54-04:00 draft: false tags: ["Python", "C++"] +medium_enabled: true --- For performance reasons, it can be useful to write functions in C/C++ which can then be called within Python. This will be an introductory post, in where we will call a simple C++ function (with a dependency) within Python using [SWIG](http://swig.org/). diff --git a/content/blog/pythonsymmetricgroups.md b/content/blog/pythonsymmetricgroups.md index 67e42b6..f6950e6 100644 --- a/content/blog/pythonsymmetricgroups.md +++ b/content/blog/pythonsymmetricgroups.md @@ -4,6 +4,7 @@ date: 2019-05-22T20:02:21-04:00 draft: false tags: [ "Math", "Python" ] math: true +medium_enabled: true --- **Warning:** This post is meant for someone whose familiar with concepts of Abstract Algebra. diff --git a/content/blog/pyunittest.md b/content/blog/pyunittest.md index c47fc95..f446b9b 100644 --- a/content/blog/pyunittest.md +++ b/content/blog/pyunittest.md @@ -3,6 +3,7 @@ title: "Quick Python: Unit Testing" date: 2020-03-31T07:27:47-04:00 draft: false tags: ["Python", "Testing"] +medium_enabled: true --- Python has a great built-in [unit test](https://docs.python.org/3.7/library/unittest.html) framework. This post will give a skeleton for how to format the files in your `tests` directory. diff --git a/content/blog/qtcpsocket.md b/content/blog/qtcpsocket.md index 930cc3a..2d1caf6 100644 --- a/content/blog/qtcpsocket.md +++ b/content/blog/qtcpsocket.md @@ -3,6 +3,7 @@ title: "QTcpSocket" date: 2020-03-20T16:21:07-04:00 draft: false tags: ["C++"] +medium_enabled: true --- There are two ways that I can think of for checking if a TCP socket times out in Qt. You can either use `waitForConnected` or a `QTimer`. The Qt 5.14 documentation noted that the `waitForConnected` call may randomly fail in Windows. diff --git a/content/blog/qttimer.md b/content/blog/qttimer.md index ab13753..7038f6b 100644 --- a/content/blog/qttimer.md +++ b/content/blog/qttimer.md @@ -3,6 +3,7 @@ title: "Qt Timers" date: 2020-03-19T17:30:04-04:00 draft: false tags: ["C++"] +medium_enabled: true --- Qt has two great timers, one that repeats an action after a certain interval, and one that is meant for one-off operations. They call these `QTimer` and `QTimer::singleShot` respectively. This post is going to assume that we're working with a class named `Test` that inherits `QObject`. diff --git a/content/blog/quickbashargcount.md b/content/blog/quickbashargcount.md index 3dfdc03..2b0f88d 100644 --- a/content/blog/quickbashargcount.md +++ b/content/blog/quickbashargcount.md @@ -3,6 +3,7 @@ title: "Quick Bash: Check Argument Count" date: 2020-12-15T09:25:11-05:00 draft: false tags: ["Bash"] +medium_enabled: true --- I've been writing more bash scripts recently and I noticed that I often check for the number of arguments before validating them in my scripts. I'll share that small snippet here for my future self. diff --git a/content/blog/quickcgroups.md b/content/blog/quickcgroups.md index 69073cf..6a4d85f 100644 --- a/content/blog/quickcgroups.md +++ b/content/blog/quickcgroups.md @@ -3,6 +3,7 @@ title: "Quickly Creating CGroups to Limit CPU/Memory of Applications" date: 2020-10-22T22:32:56-04:00 draft: false tags: ["Linux"] +medium_enabled: true --- Running some data science algorithms can be CPU or memory intensive. To prevent the code from hogging system resources, we can use cgroups to set limits. This also is great for applications that you don't quite trust. diff --git a/content/blog/quickpythonhttp.md b/content/blog/quickpythonhttp.md index 041e7b3..2819be7 100644 --- a/content/blog/quickpythonhttp.md +++ b/content/blog/quickpythonhttp.md @@ -3,6 +3,7 @@ title: "Quick Python: HTTP Server" date: 2020-04-18T17:15:09-04:00 draft: false tags: ["Python"] +medium_enabled: true --- You can use Python to quickly spin up a HTTP server. A common use case for me is to quickly transfer files to mobile devices in my internal network. diff --git a/content/blog/quickstoragesetup.md b/content/blog/quickstoragesetup.md index 84a43fd..bd699f2 100644 --- a/content/blog/quickstoragesetup.md +++ b/content/blog/quickstoragesetup.md @@ -3,6 +3,7 @@ title: "Quickly Setting up a Storage Device" date: 2020-01-12T21:43:26-05:00 draft: false tags: [ "Linux", "Storage" ] +medium_enabled: true --- This post exists mostly to aid myself for when I buy new drives for my home server. It's a quick and easy way to create an ext4 filesystem over the entire drive. diff --git a/content/blog/rclone.md b/content/blog/rclone.md index 0823cc4..02ddd71 100644 --- a/content/blog/rclone.md +++ b/content/blog/rclone.md @@ -4,6 +4,7 @@ date: 2022-04-10T22:05:46-04:00 draft: false tags: ["Backup"] math: false +medium_enabled: true --- [Rclone](https://rclone.org/) is a terminal application that manages remote storage. It supports the standard remote filesystem protocols such as S3, (S)FTP, WebDAV as well as easy to use integration with cloud providers such as Amazon S2, Backblaze B2, Google Drive, and others. We can even perform regular backups using [Restic](https://restic.net/) with Rclone underneath. With all these features, it's easy to configure all remote storage within Rclone and then synchronize the configuration file across machines. diff --git a/content/blog/rebuildkernelakmod.md b/content/blog/rebuildkernelakmod.md index a83097f..8bea388 100644 --- a/content/blog/rebuildkernelakmod.md +++ b/content/blog/rebuildkernelakmod.md @@ -4,6 +4,7 @@ date: 2022-02-04T19:37:04-05:00 draft: false tags: ["Linux", "Fedora"] math: false +medium_enabled: true --- Akmods is the Fedora/Red Hat way of managing kernel modules. In Ubuntu, this is `dkms`. If you're like me and force reboot shortly after performing an update, then you might have not given akmods enough time to compile any extra kernel modules (for example: Nvidia). This meant that I had to boot into an older kernel to try to fix the problem.... diff --git a/content/blog/recordoutputaudio.md b/content/blog/recordoutputaudio.md index a239b1b..f1c6855 100644 --- a/content/blog/recordoutputaudio.md +++ b/content/blog/recordoutputaudio.md @@ -3,6 +3,7 @@ title: "Record Output Audio via Terminal" date: 2020-03-01T10:38:06-05:00 draft: false tags: [ "Linux", "Audio-Video" ] +medium_enabled: true --- This post is specific to `PulseAudio` on Linux. diff --git a/content/blog/recursivelisting.md b/content/blog/recursivelisting.md index ca29c6d..448bd9c 100644 --- a/content/blog/recursivelisting.md +++ b/content/blog/recursivelisting.md @@ -3,6 +3,7 @@ title: "Quick Python: List Files Recursively" date: 2020-02-09T17:31:44-05:00 draft: false tags: [ "Python" ] +medium_enabled: true --- In order to add website files into a Flask application using setuptools, I needed to recurse down several directories and grab HTML and CSS files. diff --git a/content/blog/resumingapt.md b/content/blog/resumingapt.md index 71e3310..d7b8751 100644 --- a/content/blog/resumingapt.md +++ b/content/blog/resumingapt.md @@ -3,6 +3,7 @@ title: "Resuming Stopped Apt Updates" date: 2020-02-29T17:58:14-05:00 draft: false tags: [ "Ubuntu", "Linux" ] +medium_enabled: true --- Especially on the Raspberry Pi, it is quite often for me to lose connection while updating. I know some people setup `screen` or `tmux` sessions so that they can easily reconnect. I'm not good at remembering to do this. [Angus and Cas](https://unix.stackexchange.com/a/46546) on StackExchange shared that to resume a stopped update... diff --git a/content/blog/reverseonehotencode.md b/content/blog/reverseonehotencode.md index c87bb1d..a432b7f 100644 --- a/content/blog/reverseonehotencode.md +++ b/content/blog/reverseonehotencode.md @@ -3,6 +3,7 @@ title: "Reverse One-Hot Encode" date: 2020-10-11T21:58:47-04:00 draft: false tags: ["Python"] +medium_enabled: true --- Let's say that you have a dataset that is one hot encoded like the following observation: diff --git a/content/blog/robustdd.md b/content/blog/robustdd.md index 703c3d0..b2a88c8 100644 --- a/content/blog/robustdd.md +++ b/content/blog/robustdd.md @@ -3,6 +3,7 @@ title: "Robustdd" date: 2019-09-27T22:45:56-04:00 draft: false tags: [ "Linux" ] +medium_enabled: true --- This blog post is going to assume that we're writing to `/dev/sdX`. Please change this to whatever disk you're actually trying to write to. I bear no responsibility if you accidentally write to your OS drives. diff --git a/content/blog/rootless-docker-compose-podman.md b/content/blog/rootless-docker-compose-podman.md index 7e40dba..e9c039d 100644 --- a/content/blog/rootless-docker-compose-podman.md +++ b/content/blog/rootless-docker-compose-podman.md @@ -4,6 +4,7 @@ date: 2022-01-29T20:21:11-05:00 draft: false tags: ["Containers"] math: false +medium_enabled: true --- One of the benefits of Podman over Docker is that it can run daemon-less and without root. However, `docker-compose` is by far my favorite way to create and maintain containers. Luckily, the Podman folks emulated the Docker CLI so that `docker-compose` works well with Podman! diff --git a/content/blog/rsa.md b/content/blog/rsa.md index f5737a4..86b4301 100644 --- a/content/blog/rsa.md +++ b/content/blog/rsa.md @@ -5,6 +5,7 @@ draft: false images: [] math: true tags: ["Security"] +medium_enabled: true --- # Introduction diff --git a/content/blog/rsynckey.md b/content/blog/rsynckey.md index 9b9127c..0107003 100644 --- a/content/blog/rsynckey.md +++ b/content/blog/rsynckey.md @@ -2,6 +2,7 @@ title: "Rsync with a Different Key" date: 2019-07-06T09:20:05-04:00 draft: false +medium_enabled: true --- To use Rsync with a different key, follow the command structure below. diff --git a/content/blog/s3-fuse.md b/content/blog/s3-fuse.md index b399b5d..eb5c57e 100644 --- a/content/blog/s3-fuse.md +++ b/content/blog/s3-fuse.md @@ -4,6 +4,7 @@ date: 2022-02-04T23:39:25-05:00 draft: false tags: ["Storage"] math: false +medium_enabled: true --- On most cloud providers, object storage is cheaper than paying for the equivalent size in block storage. Using FUSE, we can mount S3 compatible object storage with the command `s3fs`. Do note, that there are a few downsides with mounting object storage as documented on their [README](https://github.com/s3fs-fuse/s3fs-fuse/blob/master/README.md): diff --git a/content/blog/scrcpy.md b/content/blog/scrcpy.md index 1df18aa..f4b971d 100644 --- a/content/blog/scrcpy.md +++ b/content/blog/scrcpy.md @@ -3,6 +3,7 @@ title: "Scrcpy" date: 2020-01-09T21:36:30-05:00 draft: false tags: [ ] +medium_enabled: true --- With [Scrcpy](https://github.com/Genymobile/scrcpy) you can control an Android device remotely! diff --git a/content/blog/screwuppresentations.md b/content/blog/screwuppresentations.md index f2136c0..3c677b5 100644 --- a/content/blog/screwuppresentations.md +++ b/content/blog/screwuppresentations.md @@ -2,6 +2,7 @@ title: "Notes on '13 Ways Designers Screw Up Client Presentations'" date: 2019-05-21T22:20:14-04:00 draft: false +medium_enabled: true --- I watched a great talk by [Mike Monteiro](http://mikemonteiro.com/) recently called [13 Ways Designers Screw Up Client Presentations](https://www.youtube.com/watch?v=IXXKqwrEql4). You should really watch the talk but this post is just a quick summary of the points he got across in the presentation. diff --git a/content/blog/sharedpackerterraformconfig.md b/content/blog/sharedpackerterraformconfig.md index 81576b2..a61046f 100644 --- a/content/blog/sharedpackerterraformconfig.md +++ b/content/blog/sharedpackerterraformconfig.md @@ -3,6 +3,7 @@ title: "Shared Packer & Terraform Config" date: 2020-05-08T22:59:30-04:00 draft: false tags: ["Deployment"] +medium_enabled: true --- You might have noticed from my last two posts on [Packer](/blog/snapshotswithpacker/) and [Terraform](/blog/autodeployterraform/) that the configuration files are highly similar. In fact, we can trick them into sharing a configuration file! diff --git a/content/blog/shutdownafterjob.md b/content/blog/shutdownafterjob.md index c94ee8c..a2839ef 100644 --- a/content/blog/shutdownafterjob.md +++ b/content/blog/shutdownafterjob.md @@ -3,6 +3,7 @@ title: "Shutdown After Job" date: 2019-08-30T20:43:56-04:00 draft: false tags: ["Linux"] +medium_enabled: true --- I'm back to running longer jobs as part of my research. If I run a task overnight, I want to conserve energy and not keep it running after I finish. I suppose this would also apply to cloud billing, you want it to do the job and then stop. diff --git a/content/blog/signingcommits.md b/content/blog/signingcommits.md index d3ccdfe..daaa6f6 100644 --- a/content/blog/signingcommits.md +++ b/content/blog/signingcommits.md @@ -3,6 +3,7 @@ title: "Signing Commits" date: 2020-04-11T19:59:41-04:00 draft: false tags: ["Git", "GPG/PGP"] +medium_enabled: true --- Git and their various hosting platforms support commit signing as an additional step of verification. There seems to be an active debate on whether it should be used regularly, though I'll describe it on here in case you want to set it up. diff --git a/content/blog/simulators.md b/content/blog/simulators.md index a3958e6..8037891 100644 --- a/content/blog/simulators.md +++ b/content/blog/simulators.md @@ -2,6 +2,7 @@ title: "Simulators" date: 2019-07-01T22:22:29-04:00 draft: false +medium_enabled: true --- Part of my job involves integrating multiple different sensors together to make a cohesive product. One thing that I appreciate about my current team, is the rich set of tooling built around the project. I am definitely learning a lot from this project. One thing I wanted to share was the use of *simulators*. diff --git a/content/blog/snap-flatpak-aliases.md b/content/blog/snap-flatpak-aliases.md index dfd39f1..f2af064 100644 --- a/content/blog/snap-flatpak-aliases.md +++ b/content/blog/snap-flatpak-aliases.md @@ -4,6 +4,7 @@ date: 2022-02-04T20:29:04-05:00 draft: false tags: ["Linux"] math: false +medium_enabled: true --- Sometimes snap packages and flatpaks come with unmemorable names to run their commands. Luckily for snap packages, you can easily alias them. For example, to rename the .NET executable to `dotnet` run. diff --git a/content/blog/snapshotswithpacker.md b/content/blog/snapshotswithpacker.md index ae677f2..5b47ffc 100644 --- a/content/blog/snapshotswithpacker.md +++ b/content/blog/snapshotswithpacker.md @@ -3,6 +3,7 @@ title: "Snapshot Creation with Packer" date: 2020-05-08T22:31:40-04:00 draft: false tags: [] +medium_enabled: true --- [Packer](https://www.packer.io/) is a tool to create automated machine images in both local virtual machine / container environments, as well as a variety of cloud platforms. My current cloud platform of choice is [Digital Ocean](https://www.digitalocean.com/), so this post will explain how to set up Packer with it. Though you can likely find your platform of choice on their [docs](https://www.packer.io/docs/builders/) page diff --git a/content/blog/socatforward.md b/content/blog/socatforward.md index 57fce99..a790e15 100644 --- a/content/blog/socatforward.md +++ b/content/blog/socatforward.md @@ -3,6 +3,7 @@ title: "Forward Packets with Socat" date: 2021-06-18T19:38:43-04:00 draft: false tags: ["Networking"] +medium_enabled: true --- I've written about relaying TCP traffic using [SSH port forwarding](/blog/sshlocalportforwarding/). Though sometimes you don't require the authenticity and encryption of SSH or want to use another protocol such as UDP. That's where `socat` comes in. diff --git a/content/blog/socks5proxy.md b/content/blog/socks5proxy.md index af5eff0..8ef8fd6 100644 --- a/content/blog/socks5proxy.md +++ b/content/blog/socks5proxy.md @@ -4,6 +4,7 @@ date: 2022-01-03T10:41:09-05:00 draft: false tags: ["Networking", "SSH"] math: false +medium_enabled: true --- A SOCKS5 proxy allows you to have network traffic as if it was coming from the proxy server as opposed to your local client. You can easily set it up using SSH from your local machine. diff --git a/content/blog/sphinxmathjax.md b/content/blog/sphinxmathjax.md index cd5417e..c434b8a 100644 --- a/content/blog/sphinxmathjax.md +++ b/content/blog/sphinxmathjax.md @@ -3,6 +3,7 @@ title: "Sphinx & MathJax" date: 2020-03-20T18:59:40-04:00 draft: false tags: ["Documentation", "Python", "LaTex"] +medium_enabled: true --- To include mathematical notation in Python docs generated by Sphinx, it should look like the following: diff --git a/content/blog/splittingfiles.md b/content/blog/splittingfiles.md index 013bbcf..f17cf52 100644 --- a/content/blog/splittingfiles.md +++ b/content/blog/splittingfiles.md @@ -3,6 +3,7 @@ title: "Splitting Files to Circumvent Size Limits" date: 2020-09-07T20:41:25-04:00 draft: false tags: [] +medium_enabled: true --- Let's say you want to transfer file(s) over to someone and there is a limit the size you can transfer over. Maybe because of the physical medium or the online service you're using. You can make use of the terminal tool `split` in order to get the chunks over there and then use `cat ` to combine it back to one file. diff --git a/content/blog/sshconfig.md b/content/blog/sshconfig.md index c89f848..149ef10 100644 --- a/content/blog/sshconfig.md +++ b/content/blog/sshconfig.md @@ -3,6 +3,7 @@ title: "SSH Config" date: 2019-09-27T22:46:39-04:00 draft: false tags: [ "SSH" ] +medium_enabled: true --- Have you ever gone through the hassle of having multiple public/private keys for accessing your remote servers? Before recently, I used to specify the identity file in all my transactions `ssh -I ~/.ssh/private_key user@host` but no longer! I discovered you can add the following to your `~/.ssh/config` to specify which key you want to use! diff --git a/content/blog/sshconnectionsharing.md b/content/blog/sshconnectionsharing.md index a483a7f..2e9e5e1 100644 --- a/content/blog/sshconnectionsharing.md +++ b/content/blog/sshconnectionsharing.md @@ -3,6 +3,7 @@ title: "SSH Connection Sharing" date: 2020-06-05T16:39:24-04:00 draft: false tags: ["SSH"] +medium_enabled: true --- If you're like me, you open a lot of different terminal sessions throughout your day. When it comes to SSH, I want these different sessions to share a connection rather than creating a new one each time. diff --git a/content/blog/sshjump.md b/content/blog/sshjump.md index c6be2f0..09e2aec 100644 --- a/content/blog/sshjump.md +++ b/content/blog/sshjump.md @@ -3,6 +3,7 @@ title: "SSH Jump" date: 2020-02-02T22:32:13-05:00 draft: false tags: [ "SSH" ] +medium_enabled: true --- With ssh jump, we can ssh into a machine that we don't have direct access to through an intermediary. diff --git a/content/blog/sshlocalportforwarding.md b/content/blog/sshlocalportforwarding.md index 3e8bc6d..bf44004 100644 --- a/content/blog/sshlocalportforwarding.md +++ b/content/blog/sshlocalportforwarding.md @@ -3,6 +3,7 @@ title: "SSH Local Port Forwarding" date: 2019-08-06T16:50:00-04:00 draft: false tags: [ "SSH" ] +medium_enabled: true --- There are some services that I don't want to run all the time which makes me not want to open a port for it. One good example of this is [Jupyter Notebooks](https://jupyter.org/). Therefore, what I sometimes do is run it locally and forward the port so that another machine can access it. diff --git a/content/blog/startgraphicalappsnoforwarding.md b/content/blog/startgraphicalappsnoforwarding.md index c7e8afd..2513361 100644 --- a/content/blog/startgraphicalappsnoforwarding.md +++ b/content/blog/startgraphicalappsnoforwarding.md @@ -3,6 +3,7 @@ title: "Starting Graphical Applications Remotely without X-Forwarding" date: 2020-09-07T20:24:49-04:00 draft: false tags: ["Linux", "SSH"] +medium_enabled: true --- One of my favorite casual gaming setups is to use a slim laptop on my couch while streaming from my desktop using Steam Remote Play. The downside though is that unless I want to get up, Steam needs to be already running on my desktop. This post describes how I start steam remotely from my couch so that I can stream my games without having to get up and set it up on my desktop first. diff --git a/content/blog/stow.md b/content/blog/stow.md index e37d717..c342a62 100644 --- a/content/blog/stow.md +++ b/content/blog/stow.md @@ -3,6 +3,7 @@ title: "Stow Version Manager" date: 2021-02-25T10:31:34-05:00 draft: false tags: [] +medium_enabled: true --- Suppose you need a newer or specific version of a package that isn't included in your standard linux repo. The standard procedure is to do something like the following... diff --git a/content/blog/systemdstartup.md b/content/blog/systemdstartup.md index 6baa20c..38b30fd 100644 --- a/content/blog/systemdstartup.md +++ b/content/blog/systemdstartup.md @@ -3,6 +3,7 @@ title: "Analyzing Startup Times with Systemd" date: 2019-12-26T22:52:59-05:00 draft: false tags: [ "Linux" ] +medium_enabled: true --- Startup times feeling slow? Check to see if there are any uneeded services slowing you down! diff --git a/content/blog/systemdwithpythonenvs.md b/content/blog/systemdwithpythonenvs.md index 3ef4c77..d6ce00a 100644 --- a/content/blog/systemdwithpythonenvs.md +++ b/content/blog/systemdwithpythonenvs.md @@ -3,6 +3,7 @@ title: "Systemd with Python environments" date: 2019-08-25T20:04:20-04:00 draft: false tags: [ "Linux", "Python" ] +medium_enabled: true --- It took me some time to realize why I couldn't start a project during startup. I then realized that it was because I was using a python virtual environment and didn't tell systemd about it. diff --git a/content/blog/tcopython.md b/content/blog/tcopython.md index 8888529..ba0378b 100644 --- a/content/blog/tcopython.md +++ b/content/blog/tcopython.md @@ -3,6 +3,7 @@ title: "Tail Call Optimization in Python" date: 2020-10-11T20:46:54-04:00 draft: false tags: ["Python"] +medium_enabled: true --- In a standard recursive function, a new stack frame is created every time a recursive call is made. This can lead to bad memory performance and as a protective measure, some programming languages have a maximum stack frame limit. diff --git a/content/blog/tempresolve.md b/content/blog/tempresolve.md index df2d2a4..9c1e8b6 100644 --- a/content/blog/tempresolve.md +++ b/content/blog/tempresolve.md @@ -3,6 +3,7 @@ title: "Temporarily Resolving Hostnames" date: 2020-01-04T21:26:16-05:00 draft: false tags: [ "Linux", "Networking" ] +medium_enabled: true --- Let's say that we're testing a webserver where the pages served depended on a domain that you don't own. The most common way I know to test this is to modify your `/etc/hosts` file to contain the hostname and ip address you want to map it to. diff --git a/content/blog/tempstaticip.md b/content/blog/tempstaticip.md index 2903f2b..5f96a5d 100644 --- a/content/blog/tempstaticip.md +++ b/content/blog/tempstaticip.md @@ -3,6 +3,7 @@ title: "Temporary Static IP" date: 2020-01-20T21:36:37-05:00 draft: false tags: [ "Linux", "Networking" ] +medium_enabled: true --- I've learned that the fastest way to transfer files is via Ethernet. Now the easiest way to transfer via Ethernet is for both computers to be on the same local area network. However, if needed, an Ethernet cable can used between two computers. diff --git a/content/blog/terminaloutputvim.md b/content/blog/terminaloutputvim.md index dc24a21..36cdf71 100644 --- a/content/blog/terminaloutputvim.md +++ b/content/blog/terminaloutputvim.md @@ -3,6 +3,7 @@ title: "Terminal Output in Vim" date: 2021-06-18T16:22:30-04:00 draft: false tags: [] +medium_enabled: true --- In Vim you can output the result of a command below your cursor by using `:r!`. diff --git a/content/blog/termtosvg.md b/content/blog/termtosvg.md index d54b2a1..3c56460 100644 --- a/content/blog/termtosvg.md +++ b/content/blog/termtosvg.md @@ -4,6 +4,7 @@ date: 2022-01-17T10:14:22-05:00 draft: false tags: [] math: false +medium_enabled: true --- With [`termtosvg`](https://github.com/nbedos/termtosvg) made by Nicolas Bedo we can make SVG animations from terminal output in the style of [asciinema](https://asciinema.org/). To install use [pipx](/blog/managepythonapps/). diff --git a/content/blog/togglingxinput.md b/content/blog/togglingxinput.md index 7057fff..7b0da2e 100644 --- a/content/blog/togglingxinput.md +++ b/content/blog/togglingxinput.md @@ -3,6 +3,7 @@ title: "Toggling X Input" date: 2020-01-07T20:46:32-05:00 draft: false tags: [ "Linux", "X11" ] +medium_enabled: true --- On X, we can easily enable or disable input devices using the `xinput` command. This is a great use case when you're tired of accidentally hitting the red Thinkpad nub or having your palm be recognized when drawing with a pen. diff --git a/content/blog/tokindle.md b/content/blog/tokindle.md index ffde105..3ce19fe 100644 --- a/content/blog/tokindle.md +++ b/content/blog/tokindle.md @@ -3,6 +3,7 @@ title: "PDF To Kindle" date: 2020-06-14T21:54:21-04:00 draft: false tags: [] +medium_enabled: true --- This post will outline a process I take in order to get content from a website onto my Kindle. diff --git a/content/blog/tox.md b/content/blog/tox.md index 675402c..6dc147f 100644 --- a/content/blog/tox.md +++ b/content/blog/tox.md @@ -3,6 +3,7 @@ title: "Tox" date: 2020-02-21T22:34:19-05:00 draft: false tags: [ "Python", "Testing" ] +medium_enabled: true --- [Tox](https://tox.readthedocs.io/en/latest/) is a great project where you can automate your testing using virtual environments. diff --git a/content/blog/traefiknginx.md b/content/blog/traefiknginx.md index aeffab8..23f19f4 100644 --- a/content/blog/traefiknginx.md +++ b/content/blog/traefiknginx.md @@ -1,7 +1,8 @@ --- title: "Traefik & Nginx" date: 2019-12-16T19:55:47-05:00 -draft: false +draft: false +medium_enabled: true --- I've been enjoying Traefik for its auto-discovery of containers. The only problem is that for a couple containers such as Plex and HomeAssistant I have host networking enabled. This usually results in Traefik failing to forward the traffic properly. diff --git a/content/blog/trim-video-ffmpeg.md b/content/blog/trim-video-ffmpeg.md index 9a80c02..d671108 100644 --- a/content/blog/trim-video-ffmpeg.md +++ b/content/blog/trim-video-ffmpeg.md @@ -4,6 +4,7 @@ date: 2022-09-28T18:46:32-04:00 draft: false tags: ["Audio-Video"] math: false +medium_enabled: true --- Recently I came across a video that I wanted to split up into multiple files. Given my love for `ffmpeg` the video/audio swiss army knife, I knew there had to be a solution for cutting a video on the terminal. Luckily on [AskUbuntu](https://askubuntu.com/a/56044), Luis Alvarado provides a command snippet. This post will go into slightly more detail on the flags used in the command diff --git a/content/blog/unattended-upgrades.md b/content/blog/unattended-upgrades.md index 35b2194..c0d11fe 100644 --- a/content/blog/unattended-upgrades.md +++ b/content/blog/unattended-upgrades.md @@ -3,6 +3,7 @@ title: "Unattended Upgrades" date: 2019-05-26T12:52:03-04:00 draft: false tags: [ "Linux", "Ubuntu" ] +medium_enabled: true --- I'm a big believer of reducing maintenance. One of the things that I didn't bother setting up before but should've is *unattended upgrades*. The benefits of this is that you don't have to repeatedly log into your sever to upgrade your system. diff --git a/content/blog/uninstallvimplugins.md b/content/blog/uninstallvimplugins.md index 6c7fed0..7a2f3c8 100644 --- a/content/blog/uninstallvimplugins.md +++ b/content/blog/uninstallvimplugins.md @@ -3,6 +3,7 @@ title: "Uninstall Vim Plugins" date: 2020-03-23T23:00:00-04:00 draft: false tags: [] +medium_enabled: true --- Assuming you're using `vim-plug` you might come to the point where you want to uninstall a plugin. Googling around will land you at [a GitHub issue](https://github.com/junegunn/vim-plug/issues/121) where a contributor named Andrea Cedraro states a workaround instead. diff --git a/content/blog/usbredirection.md b/content/blog/usbredirection.md index 039f6d0..cb95820 100644 --- a/content/blog/usbredirection.md +++ b/content/blog/usbredirection.md @@ -3,6 +3,7 @@ title: "Wacom and USB Redirection in Virtual Machines" date: 2019-05-24T22:15:56-04:00 draft: false tags: [ "Linux", "Virtualization" ] +medium_enabled: true --- [Virt-Manager](https://virt-manager.org/) is a great tool for managing virtual machines under Linux. Today I learned of [Spice USB redirection](https://blog.wikichoon.com/2014/04/spice-usb-redirection-in-virt-manager.html). Essentially it allows you to switch USB devices from the host to the virtualized environment. This came in handy when I noticed that the graphics tablet device was not able to do pressure sensitivity on the Windows guest. diff --git a/content/blog/value-shift.md b/content/blog/value-shift.md index 0d29759..d97f503 100644 --- a/content/blog/value-shift.md +++ b/content/blog/value-shift.md @@ -4,6 +4,7 @@ date: 2022-10-11T20:19:01-04:00 draft: false tags: [] math: true +medium_enabled: true --- In the book [Wild problems : a guide to the decisions that define us](https://www.worldcat.org/title/1321820629), Russ Roberts analyzes decision making on difficult life problems. These types of problems don't have straightforward or measurable goals, and there's no set procedure for success. Examples of these problems are choosing whether to marry, have kids, or switch jobs. diff --git a/content/blog/ventoy.md b/content/blog/ventoy.md index 2305b69..6a5fdbe 100644 --- a/content/blog/ventoy.md +++ b/content/blog/ventoy.md @@ -3,6 +3,7 @@ title: "Ventoy for managing ISOs on one USB" date: 2021-06-18T15:32:38-04:00 draft: false tags: ["Virtualization"] +medium_enabled: true --- Traditionally I would hold one Linux distribution per USB drive. Though with 32 GB USB Flash drives only costing $12, why hold only one per drive? That's where Ventoy comes in. With Ventoy, we can store multiple ISOs which it then presents as a boot screen. diff --git a/content/blog/videosandgifs.md b/content/blog/videosandgifs.md index 3beddcb..31d1c3b 100644 --- a/content/blog/videosandgifs.md +++ b/content/blog/videosandgifs.md @@ -3,6 +3,7 @@ title: "Videos and GIFs" date: 2019-12-04T10:13:35-05:00 draft: false tags: ["Audio-Video"] +medium_enabled: true --- I like using GIFs in Google Slides because it doesn't require any interaction to start playing right away. Therefore, I looked at a couple resources to add a GIF from a video into my presentation. Of course this is all using one of my favorite terminal tools `ffmpeg`. diff --git a/content/blog/virtualdisks.md b/content/blog/virtualdisks.md index a57a9f9..e78bd65 100644 --- a/content/blog/virtualdisks.md +++ b/content/blog/virtualdisks.md @@ -3,6 +3,7 @@ title: "Virtual Disks" date: 2020-01-06T22:26:58-05:00 draft: false tags: [ "Linux", "Storage" ] +medium_enabled: true --- Have you wanted to [play with ZFS](https://wiki.archlinux.org/index.php/ZFS/Virtual_disks) or any other filesystem without creating a dedicated partition or device? We can do this through virtual disks! diff --git a/content/blog/virtualenv.md b/content/blog/virtualenv.md index 7a3b41f..ce53bf8 100644 --- a/content/blog/virtualenv.md +++ b/content/blog/virtualenv.md @@ -3,6 +3,7 @@ title: "Python Virtual Environments" date: 2019-05-21T23:04:54-04:00 draft: false tags: [ "Python" ] +medium_enabled: true --- Dependency management is hard. Luckily with Python there is a program called `virtualenv` that can help isolate different projects and manage dependencies. diff --git a/content/blog/virtualizingwithclonezilla.md b/content/blog/virtualizingwithclonezilla.md index 11c282e..119273e 100644 --- a/content/blog/virtualizingwithclonezilla.md +++ b/content/blog/virtualizingwithclonezilla.md @@ -3,6 +3,7 @@ title: "Virtualizing Environments with Clonezilla" date: 2019-08-25T20:09:28-04:00 draft: false tags: ["Virtualization"] +medium_enabled: true --- [Clonezilla](https://clonezilla.org/) advertises itself as a disk cloning and backup utility. I've been starting to think of it as a little more than that. Let's say that you go to a client site and they have a machine in production. Instead of messing around with their machine, you make a Clonezilla copy of it. You can then take it back and place it on a computer you're not using to play around with it. diff --git a/content/blog/virtuallivecd.md b/content/blog/virtuallivecd.md index c389e4d..4721bc8 100644 --- a/content/blog/virtuallivecd.md +++ b/content/blog/virtuallivecd.md @@ -4,6 +4,7 @@ date: 2020-01-12T22:45:06-05:00 draft: false images: [] tags: [ "Virtualization" ] +medium_enabled: true --- I was curious on how Lubuntu 19.10 looked but I didn't feel like rebooting my computer and loading into a new ISO. Luckily there is a nice easy way to play around with live CDs. diff --git a/content/blog/vncsetup.md b/content/blog/vncsetup.md index d488d43..3ffc0d8 100644 --- a/content/blog/vncsetup.md +++ b/content/blog/vncsetup.md @@ -2,6 +2,7 @@ title: "VNC Setup" date: 2019-05-24T23:21:43-04:00 draft: false +medium_enabled: true --- I mostly following this [Digital Ocean Tutorial](https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-vnc-on-ubuntu-18-04) on getting a working VNC setup on my desktop computer. There is one main difference on my end since I use KDE. I edited the `/home/$USER/.vnc/xstartup` file to appear as diff --git a/content/blog/website-status-checking.md b/content/blog/website-status-checking.md index 1f2b14a..a6d824f 100644 --- a/content/blog/website-status-checking.md +++ b/content/blog/website-status-checking.md @@ -4,6 +4,7 @@ date: 2022-09-28T16:05:23-04:00 draft: false tags: [] math: false +medium_enabled: true --- How do I know when my website goes up or down? Recently, I started using a service from [updown.io](https://updown.io) which gives me a status page and notifies me when it goes down. diff --git a/content/blog/website-visible-on-the-fediverse.md b/content/blog/website-visible-on-the-fediverse.md index 41f1756..54d03fe 100644 --- a/content/blog/website-visible-on-the-fediverse.md +++ b/content/blog/website-visible-on-the-fediverse.md @@ -4,6 +4,7 @@ date: 2022-06-12T18:35:30-04:00 draft: false tags: ["Mastodon"] math: false +medium_enabled: true --- [ActivityPub](https://www.w3.org/TR/activitypub/) is the backbone diff --git a/content/blog/why-i-pesos-from-mastodon.md b/content/blog/why-i-pesos-from-mastodon.md index e28bec2..b80de12 100644 --- a/content/blog/why-i-pesos-from-mastodon.md +++ b/content/blog/why-i-pesos-from-mastodon.md @@ -4,6 +4,7 @@ date: 2022-05-15T18:36:16-04:00 draft: false tags: ["Mastodon"] math: false +medium_enabled: true --- The [IndieWeb movement](https://indieweb.org) is focused on people controlling their own experience on the web. They accomplish this by encouraging everyone to have their own personal website. Followers can then either subscribe to the [RSS feed](https://aboutfeeds.com/) and provide [Webmentions](https://indieweb.org/Webmention) back to the post, or they can interact with the material directly on another website like [Mastodon](https://joinmastodon.org/). diff --git a/content/blog/whyzeromq.md b/content/blog/whyzeromq.md index e57087d..641d722 100644 --- a/content/blog/whyzeromq.md +++ b/content/blog/whyzeromq.md @@ -3,6 +3,7 @@ title: "Why ZeroMQ" date: 2019-06-16T19:26:50-04:00 draft: false tags: [ "Networking" ] +medium_enabled: true --- I've been playing around with ZeroMQ recently and it's been really exciting. This blog post is going to outline why I think you should be using ZeroMQ today. diff --git a/content/blog/wildcarddomainspihole.md b/content/blog/wildcarddomainspihole.md index c181fb3..f40a7ec 100644 --- a/content/blog/wildcarddomainspihole.md +++ b/content/blog/wildcarddomainspihole.md @@ -3,6 +3,7 @@ title: "Wildcard Domains in PiHole" date: 2020-05-25T23:26:00-04:00 draft: false tags: ["Networking"] +medium_enabled: true --- As of this time of writing, the current version of PiHole (5.0) supports adding custom DNS records, but not wildcard records. This makes it annoying if you run a bunch of different services within your LAN following a certain pattern. diff --git a/content/blog/wireguardvpn.md b/content/blog/wireguardvpn.md index fbeb7f3..a9be108 100644 --- a/content/blog/wireguardvpn.md +++ b/content/blog/wireguardvpn.md @@ -3,6 +3,7 @@ title: "Wireguard VPN" date: 2019-11-20T20:09:59-05:00 draft: false tags: [ "Networking" ] +medium_enabled: true --- Having some sort of VPN solution has always been a necessity for me. Whether it's back in the day where LAN games where the rage and I wanted to play it with my distant friends, or nowadays when I need to be able to access my Desktop running simulations behind my home LAN. diff --git a/content/blog/wormhole.md b/content/blog/wormhole.md index 29ec2f9..78fc495 100644 --- a/content/blog/wormhole.md +++ b/content/blog/wormhole.md @@ -3,6 +3,7 @@ title: "Wormhole" date: 2019-11-20T21:21:23-05:00 draft: false tags: [ "Linux" ] +medium_enabled: true --- A dead simple way to send files between two Linux machines not on the same network is to use a utility called [Magic Wormhole](https://github.com/warner/magic-wormhole). It is typically included in the standard repositories and is so simple the this blog post is going to end soon. diff --git a/content/blog/writing-simple-scripts.md b/content/blog/writing-simple-scripts.md index 1163ea5..92dd4c5 100644 --- a/content/blog/writing-simple-scripts.md +++ b/content/blog/writing-simple-scripts.md @@ -4,6 +4,7 @@ date: 2022-05-19T20:40:19-04:00 draft: false tags: [] math: false +medium_enabled: true --- I generally prefer a simpler solution to a problem if possible. This comes especially true with scripting. If I write a small script for something like say my website I generally have three requirements of the system: diff --git a/content/blog/xephyr.md b/content/blog/xephyr.md index 6990655..8682cf9 100644 --- a/content/blog/xephyr.md +++ b/content/blog/xephyr.md @@ -3,6 +3,7 @@ title: "Nested X Sessions with Xephyr" date: 2019-12-25T00:52:02-05:00 draft: false tags: [ "X11" ] +medium_enabled: true --- The X Window System was designed at a time when applications that ran on your computer were assumed to be trusted. Therefore there are minimal restrictions in place to prevent applications from grabbing images of whats on another applications screens. This feature as you might imagine is quite useful for screen clipper applications. diff --git a/content/blog/xpra.md b/content/blog/xpra.md index 043ae20..b802af8 100644 --- a/content/blog/xpra.md +++ b/content/blog/xpra.md @@ -3,6 +3,7 @@ title: "xpra" date: 2020-01-15T18:29:57-05:00 draft: false tags: [ "X11" ] +medium_enabled: true --- [`xpra`](http://xpra.org/) allows one to run persistent X applications on a remote host and display it on a local machine. It's a combination of [SSH X11 Forwarding](https://wiki.archlinux.org/index.php/OpenSSH#X11_forwarding) and [Screen](https://www.gnu.org/software/screen/). diff --git a/content/blog/xvfb.md b/content/blog/xvfb.md index e794d34..017b3cb 100644 --- a/content/blog/xvfb.md +++ b/content/blog/xvfb.md @@ -3,6 +3,7 @@ title: "Xvfb" date: 2020-09-07T20:49:54-04:00 draft: false tags: ["X11"] +medium_enabled: true --- X Virtual Framebuffer (Xvfb) is a great quick application to run applications that expect a `X11` server, but you don't care to see the visual output. diff --git a/content/blog/youtubebackup.md b/content/blog/youtubebackup.md index b4c7565..5155d37 100644 --- a/content/blog/youtubebackup.md +++ b/content/blog/youtubebackup.md @@ -3,6 +3,7 @@ title: "Backing Up YouTube Content" date: 2020-02-17T23:17:47-05:00 draft: false tags: [ "Archive" ] +medium_enabled: true --- There are great content on YouTube that I would be sad if it went away. Therefore, I did some digging around and found a [great discussion](https://www.reddit.com/r/DataHoarder/comments/863aid/what_is_your_method_of_viewing_youtubedl_backed/dw25vnm/) on Reddit on backing up YouTube videos. The solution is based on `youtube-dl` and I modified the script a little to fit my needs. diff --git a/content/blog/yubikey.md b/content/blog/yubikey.md index cd5e148..c7fe26f 100644 --- a/content/blog/yubikey.md +++ b/content/blog/yubikey.md @@ -3,6 +3,7 @@ title: "YubiKey" date: 2019-07-07T14:31:47-04:00 draft: false tags: ["Security"] +medium_enabled: true --- The YubiKey is a hardware authentication device manufactured by Yubico. It is a write only device that is meant to hold various authentication keys. The fact that it is write only means that people can't duplicate these keys. [Noah Chelliah](https://twitter.com/kernellinux) from Altispeed says that he uses YubiKeys at his company so that when employees moves on from his company he only needs to take their YubiKey. diff --git a/content/blog/z3constraintsolving.md b/content/blog/z3constraintsolving.md index ff0f820..be5181c 100644 --- a/content/blog/z3constraintsolving.md +++ b/content/blog/z3constraintsolving.md @@ -4,6 +4,7 @@ date: 2021-06-18T00:53:20-04:00 draft: false math: true tags: [] +medium_enabled: true --- I've been looking for an easy to use constraint solver for a while and recently I've landed on using the python bindings for the SMT solver Z3. diff --git a/content/blog/zshandsnaps.md b/content/blog/zshandsnaps.md index d1aa6b6..1b28aea 100644 --- a/content/blog/zshandsnaps.md +++ b/content/blog/zshandsnaps.md @@ -3,6 +3,7 @@ title: "Zsh and Snaps" date: 2020-01-25T09:46:23-05:00 draft: false tags: [ "Linux" ] +medium_enabled: true --- In case I forget again, by default when snaps are installed it doesn't populate in the `zsh` shell. To enable this add the following to `/etc/zsh/zprofile` diff --git a/scripts/syndicate_medium.py b/scripts/syndicate_medium.py index dcd9e98..5824231 100755 --- a/scripts/syndicate_medium.py +++ b/scripts/syndicate_medium.py @@ -102,4 +102,4 @@ if __name__ == "__main__": medium_result = syndicate_post(post) update_front_matter(post, medium_result) print(medium_result['data']['url']) - time.sleep(1) + time.sleep(60)