refactor: eliminate top-level images bucket

This commit is contained in:
Harsh Shandilya 2024-04-06 12:55:44 +05:30
parent ffcf8da8d0
commit 239ab55ed4
94 changed files with 171 additions and 172 deletions

View File

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 23 KiB

View File

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

View File

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View File

@ -1,11 +1,11 @@
+++
categories = ["hugo", "webdev"]
date = 2020-02-03
summary = "Optimize social media exposure with the right metadata for your site"
categories = ["hugo", "webdev"]
slug = "adding-social-metadata-to-your-hugo-sites"
tags = ["static sites"]
title = "Adding social metadata to your Hugo sites"
socialImage = "uploads/hugo_metadata_social.webp"
tags = ["static sites"]
socialImage = "hugo_metadata_social.webp"
+++
Metadata is data (information) about data.
@ -16,9 +16,9 @@ This metadata can be used by browsers (how to display content or reload page), s
Here's how your website will look like on Twitter with and without metadata.
![No metadata](/uploads/hugo_metadata_no_meta.webp)
![No metadata](hugo_metadata_no_meta.webp)
![Correct metadata](/uploads/hugo_metadata_correct_meta.webp)
![Correct metadata](hugo_metadata_correct_meta.webp)
You be the judge of what you like better :)

View File

Before

Width:  |  Height:  |  Size: 363 KiB

After

Width:  |  Height:  |  Size: 363 KiB

View File

@ -1,11 +1,11 @@
+++
categories = ["aps"]
date = 2020-07-23
summary = "Long form release notes for the Android Password Store v1.10.1 patch release"
categories = ["aps"]
slug = "aps-1.10.1-release"
socialImage = "uploads/aps_banner.webp"
tags = ["relnotes", "oss", "android-password-store"]
title = "Android Password Store 1.10.1 patch release"
tags = ["relnotes", "oss", "android-password-store"]
socialImage = "aps_banner.webp"
+++
Hot on the heels of the [v1.10.0](https://github.com/android-password-store/Android-Password-Store/releases/tag/v1.10.0) release we have an incremental bugfix update ready to go!

Binary file not shown.

After

Width:  |  Height:  |  Size: 363 KiB

View File

@ -1,11 +1,11 @@
+++
categories = ["aps"]
date = 2020-07-30
summary = "Long form release notes for the Android Password Store v1.10.2 patch release"
categories = ["aps"]
slug = "aps-1.10.2-release"
socialImage = "uploads/aps_banner.webp"
tags = ["relnotes", "oss", "android-password-store"]
title = "Android Password Store 1.10.2 patch release"
tags = ["relnotes", "oss", "android-password-store"]
socialImage = "aps_banner.webp"
+++
Exactly one week after the [previous patch release](/posts/aps-1.10.1-release), we have another small release fixing a few bugs that were deemed too high-priority for our usual release cadence.

View File

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 363 KiB

View File

@ -1,11 +1,11 @@
+++
categories = ["aps"]
date = 2020-08-18
summary = "Long form release notes for the Android Password Store August release"
categories = ["aps"]
slug = "aps-august-release"
socialImage = "uploads/aps_banner.webp"
tags = ["relnotes", "oss", "android-password-store"]
title = "Android Password Store August release"
tags = ["relnotes", "oss", "android-password-store"]
socialImage = "aps_banner.webp"
+++
Continuing this new tradition, here are the detailed release notes for the [v1.11.0](https://github.com/android-password-store/Android-Password-Store/releases/tag/v1.11.0) build of of Android Password Store that is going out right now on the Play Store and to F-Droid in the coming days. The overall focus of this release has been to improve UX and resolve bugs. Regular feature development has already resumed for next month's release where we'll be bringing [Android Keystore](https://source.android.com/security/keystore) backed SSH key generation as well as a rewritten OpenKeychain integration for SSH connections.
@ -16,7 +16,7 @@ Continuing this new tradition, here are the detailed release notes for the [v1.1
Previously you'd have to set the URL to your repository across multiple fields like username, server, repository name and what not. Annoying! These things make sense to us as developers, but users should not have to be dealing with all that complexity when all they want to do is enter a single URL. We've received numerous bug reports over time as a result of people misunderstanding and ultimately misconfiguring things when exposed to this hellscape. Thanks to some _amazing_ work from Fabian, we now have a single URL field for users to fill into.
![Single URL field in repository information](/uploads/aps-august-release-single-url-field.webp)
![Single URL field in repository information](aps-august-release-single-url-field.webp)
## Custom branch support
@ -26,7 +26,7 @@ A long-requested feature ([from 2017](https://msfjarvis.dev/aps/issue/298)!) has
We made a number of UI improvements in this area for the last series, and for this release the original contributor [glowinthedark](https://github.com/glowinthedark) has returned to add the ability to append extra symbols and numbers to the password. Sometimes you'll see sites that require that each password have at least 1 symbol and 1 number to agree with some arbitrary logic's idea of a 'secure' password, and while it can be done manually, automatic is just better :)
![XkPasswd generator with the new symbol/number append option](/uploads/aps-august-release-xkpasswd.webp)
![XkPasswd generator with the new symbol/number append option](aps-august-release-xkpasswd.webp)
To add 1 symbol and 1 number to the end of a password, input `sd` and press generate. Each instance of `s` means one symbol, and `d` means one digit. Together these can be put together in any order and in any amount to create passwords conforming to any arbitrary snake-oil check. Remember, in passwords, length is king!
@ -34,7 +34,7 @@ To add 1 symbol and 1 number to the end of a password, input `sd` and press gene
In the last major release we added support for [per-directory keys](/posts/aps-july-release/#proper-support-for-per-directory-keys). Building upon this, we now have support for also setting the key for a subdirectory when creating it.
![Create folder dialog but key selection checkbox](/uploads/aps-august-release-subdir-key-support.webp)
![Create folder dialog but key selection checkbox](aps-august-release-subdir-key-support.webp)
When selected, you will be prompted to select a key from OpenKeychain that will then be written into `your-new-directory/.gpg-id` which makes it compatible with all `pass` compliant apps.
@ -44,7 +44,7 @@ When selected, you will be prompted to select a key from OpenKeychain that will
Many, many people reported being unable to edit/create passwords and the app abruptly crashing. This is pretty bad UX, and we've now fixed it. Users will be prompted to install OpenKeychain and once you install and return to Password Store, the app will pick up from where you left and continue the operation. Pretty neat, even if I say so myself :)
![OpenKeychain installation prompt](/uploads/aps-august-release-missing-openkeychain.webp)
![OpenKeychain installation prompt](aps-august-release-missing-openkeychain.webp)
## External storage fixes

Binary file not shown.

After

Width:  |  Height:  |  Size: 363 KiB

View File

@ -1,12 +1,12 @@
+++
categories = ["aps"]
date = 2020-07-22
summary = "Long form release notes for the Android Password Store July release"
slug = "aps-july-release"
socialImage = "uploads/aps_banner.webp"
tags = ["relnotes", "oss", "android-password-store"]
title = "Android Password Store July release"
toc = true
slug = "aps-july-release"
title = "Android Password Store July release"
date = 2020-07-22
categories = ["aps"]
tags = ["relnotes", "oss", "android-password-store"]
socialImage = "aps_banner.webp"
+++
As promised, here are detailed release notes for the [v1.10.0](https://github.com/android-password-store/Android-Password-Store/releases/tag/v1.10.0) build of Android Password Store that is going out right now on the Play Store and to F-Droid in the coming days. This is a massive one even compared to our previous v1.9.0 major release, which was our largest release when it went out. Let's dive into the changes!
@ -65,7 +65,7 @@ We've been aggressively refactoring the codebase to use modern APIs like [Activi
Right off the bat, you will notice a brand new icon for Password Store. This was created for us by [Radek Błędowski](https://twitter.com/RKBDI), go check him out!
![New icon](/uploads/aps_banner.webp)
![New icon](aps_banner.webp)
To complement the new icon, we've also updated our color scheme to better suit this new branding.

Binary file not shown.

After

Width:  |  Height:  |  Size: 363 KiB

View File

@ -1,12 +1,12 @@
+++
categories = ["aps"]
date = 2020-10-22
summary = "Long form release notes for the Android Password Store October release"
slug = "aps-october-release"
socialImage = "uploads/aps_banner.webp"
tags = ["relnotes", "oss", "android-password-store"]
title = "Android Password Store October release"
toc = true
slug = "aps-october-release"
title = "Android Password Store October release"
date = 2020-10-22
categories = ["aps"]
tags = ["relnotes", "oss", "android-password-store"]
socialImage = "aps_banner.webp"
+++
We're back with yet another release! As I shared earlier this month, this is going to our last release for a while. There's a lot of work left to be done, and we're simply not big enough a team to have these larger changes be done separately from our main development. We'll still be doing bugfix releases if and when required, so please do file bug reports as and when you encounter issues.
@ -17,7 +17,7 @@ We're back with yet another release! As I shared earlier this month, this is goi
Creating a new store from the app previously created an unusable store, because we never configured a GPG key in the `.gpg-id` file. This has now been remedied in two ways: empty `.gpg-id` files are correctly handled as invalid and included in our quickfix solution, and creating a new store will now request you to select a key and then write it into the `.gpg-id` file. Here's what the key selection screen looks like:
![GPG key selection screen from the APS October release](/uploads/aps-october-release-gpg-key-selection.webp)
![GPG key selection screen from the APS October release](aps-october-release-gpg-key-selection.webp)
### Allow configuring an HTTPS proxy
@ -32,7 +32,7 @@ Before we close the gates on our regularly scheduled releases, our focus has bee
Due to multiple bugs, this feature has been rolled back in [v1.13.1](https://github.com/android-password-store/Android-Password-Store/releases/tag/v1.13.1).
<!--![App launch screen showing the repository being synced](/uploads/aps-october-release-syncing-repository.webp)-->
<!--![App launch screen showing the repository being synced](aps-october-release-syncing-repository.webp)-->
## Fixes

Binary file not shown.

After

Width:  |  Height:  |  Size: 363 KiB

View File

@ -1,12 +1,12 @@
+++
categories = ["aps"]
date = 2020-09-21
summary = "Long form release notes for the Android Password Store September release"
slug = "aps-september-release"
socialImage = "uploads/aps_banner.webp"
tags = ["relnotes", "oss", "android-password-store"]
title = "Android Password Store September release"
toc = true
slug = "aps-september-release"
title = "Android Password Store September release"
date = 2020-09-21
categories = ["aps"]
tags = ["relnotes", "oss", "android-password-store"]
socialImage = "aps_banner.webp"
+++
Continuing with this new-ish tradition we have going, here are the detailed release notes for the [v1.12.0](https://github.com/Android-Password-Store/android-password-store/releases/tag/v1.12.0) release.

View File

Before

Width:  |  Height:  |  Size: 280 KiB

After

Width:  |  Height:  |  Size: 280 KiB

View File

@ -1,11 +1,11 @@
+++
categories = ["how-to"]
date = 2022-04-04
summary = "Putting your media into Google Photos is easy, taking it out, not as much."
categories = ["how-to"]
slug = "backing-up-your-content-from-google-photos"
socialImage = "/uploads/google-photos-backup.webp"
tags = ["backup", "google photos", "gphotos-cdp"]
title = "Backing up your content from Google Photos"
tags = ["backup", "google photos", "gphotos-cdp"]
socialImage = "google-photos-backup.webp"
+++
Google Photos has established itself as one of the most popular photo storage services, and like a typical Google service, it makes it impressively difficult to get your data back out of it :D

View File

@ -1,11 +1,11 @@
+++
categories = ["rust"]
date = 2021-10-17
summary = "Some tips on building static binaries of Rust projects targeting Linux"
categories = ["rust"]
slug = "building-static-rust-binaries-for-linux"
tags = ["rust static linking", "rust static binary", "rust build static binary"]
title = "Building static Rust binaries for Linux"
socialImage = "uploads/rust_social.webp"
tags = ["rust static linking", "rust static binary", "rust build static binary"]
socialImage = "rust_social.webp"
+++
Rust has supported producing statically linked binaries since [RFC #1721] which proposed the `target-feature=+crt-static` flag to statically link the platform C library into the final binary. This was initially only supported for Windows MSVC and the MUSL C library. While MUSL works for _most_ people, it

View File

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 21 KiB

View File

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

View File

@ -1,11 +1,11 @@
+++
categories = ["gradle"]
date = 2022-04-17
summary = "Gradle's convention plugins are a fantastic way to share common build configuration, why not take them a step further?"
categories = ["gradle"]
slug = "converting-gradle-convention-plugins-to-binary-plugins"
tags = ["convention plugins", "gradle"]
title = "Converting Gradle convention plugins to binary plugins"
socialImage = "uploads/gradle-social.webp"
tags = ["convention plugins", "gradle"]
socialImage = "gradle-social.webp"
+++
### Introduction

View File

@ -1,12 +1,12 @@
+++
categories = ["webdev", "github-actions"]
date = 2020-02-05
summary = "GitHub Actions paired with GitHub Pages provides an excellent CD platform for a status page. Here's how I used it to create mine."
devLink = "https://dev.to/msfjarvis/creating-a-continuously-deploying-static-statuspage-with-github-3ol2"
slug = "creating-a-continuously-deploying-static-statuspage-with-github"
socialImage = "uploads/statuspage_social.webp"
tags = ["github pages"]
date = 2020-02-05
socialImage = "statuspage_social.webp"
devLink = "https://dev.to/msfjarvis/creating-a-continuously-deploying-static-statuspage-with-github-3ol2"
title = "Creating a continuously deploying static statuspage with GitHub"
categories = ["webdev", "github-actions"]
tags = ["github pages"]
+++
A status page is essentially a web page that reports the health and uptime of an organization's various online services. [GitHub](https://www.githubstatus.com/) has one and so does [Cloudflare](https://www.cloudflarestatus.com/). Most of these are powered by an [Atlassian](https://www.atlassian.com/) product called [Statuspage](https://www.statuspage.io/) but it's not always the [cheapest solution](https://www.statuspage.io/pricing?tab=public).
@ -19,15 +19,15 @@ For hobbyist projects without any real budget (like this site and the couple oth
- First thing that you want to do is to setup the `CNAME` record that will let GitHub Pages service your status page to a subdomain of your website. Head to your domain registrar (Cloudflare for me) and add a CNAME record for `<your github username>.github.io`
![CNAME record for status.msfjarvis.dev at Cloudflare](/uploads/statuspage_cname_record.webp)
![CNAME record for status.msfjarvis.dev at Cloudflare](statuspage_cname_record.webp)
- Next, create a GitHub repository that will hold the Actions workflow for generating your status page as well as the actual status page itself. This repo can be private, as the generated sites are always publicly available.
![GitHub repository for our status page](/uploads/statuspage_github_repo.webp)
![GitHub repository for our status page](statuspage_github_repo.webp)
- Clone this empty repository. Now create a file with the name of `CNAME` and enter your custom domain into it. This lets GitHub Pages know where to redirect users if they ever access the site through your `.github.io` subdomain. Commit this file.
![CNAME file in repository](/uploads/statuspage_cname_file.webp)
![CNAME file in repository](statuspage_cname_file.webp)
- A quick glance at the static_status README will inform you about the `config` file that it uses to configure itself, and status_hostname_list.txt which has a list of all services it needs to check. `config` is easy to understand and modify, so I'll skip it (you can diff [mine](https://github.com/msfjarvis/status.msfjarvis.dev/blob/master/config) with upstream and use the changes to educate yourself should the need arise). This part should be very straightforward, though I did encounter a problem where using `ping` as the detection mechanism caused sites to falsely report as down. Switching to `curl` resolved the issue.

View File

Before

Width:  |  Height:  |  Size: 62 KiB

After

Width:  |  Height:  |  Size: 62 KiB

View File

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

@ -1,12 +1,12 @@
+++
categories = ["android"]
date = 2020-01-20
summary = "Dagger is universally intimidating to beginners and I want to change it."
devLink = "https://dev.to/msfjarvis/dagger-the-easy-way-part-1-3l7b"
slug = "dagger-the-easy-way--part-1"
socialImage = "uploads/dagger_made_easy_social.webp"
tags = ["dagger", "tutorial"]
date = 2020-01-20
socialImage = "dagger_made_easy_social.webp"
devLink = "https://dev.to/msfjarvis/dagger-the-easy-way-part-1-3l7b"
title = "Dagger the easy way - Part 1"
categories = ["android"]
tags = ["dagger", "tutorial"]
+++
> Updated on 22 Jan 2020 with some additional comments from [@arunkumar_9t2](https://twitter.com/arunkumar_9t2). Look out for them as block quotes similar to this one.

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

@ -1,12 +1,12 @@
+++
categories = ["android"]
date = 2020-03-06
summary = "Let's extend the \"scope\" of these tutorials :)"
devLink = "https://dev.to/msfjarvis/dagger-the-easy-way-part-2-4p4m"
slug = "dagger-the-easy-way--part-2"
socialImage = "uploads/dagger_made_easy_social.webp"
tags = ["dagger", "tutorial"]
date = 2020-03-06
socialImage = "dagger_made_easy_social.webp"
devLink = "https://dev.to/msfjarvis/dagger-the-easy-way-part-2-4p4m"
title = "Dagger the easy way - Part 2"
categories = ["android"]
tags = ["dagger", "tutorial"]
+++
Welcome back! In this post I'm taking a bit of detour from my planned schedule to write about **scoping**. We'll _definitely_ cover constructor injection in the next part :)

View File

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View File

@ -1,11 +1,11 @@
+++
categories = ["hugo", "github-actions"]
date = 2019-12-04
summary = "GitHub Actions are awesome! Learn how to use it for continuous delivery of your static sites."
categories = ["hugo", "github-actions"]
slug = "deploying-hugo-sites-with-github-actions"
socialImage = "uploads/actions_social.webp"
tags = ["static sites"]
title = "Deploying Hugo sites with GitHub Actions"
tags = ["static sites"]
socialImage = "actions_social.webp"
+++
For the longest time, I have used the [caddy-git] middleware for [caddyserver](https://caddyserver.com) to constantly deploy my [Hugo](https://gohugo.io) site from [GitHub](https://github.com/msfjarvis/msfjarvis.dev).

View File

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

View File

@ -1,11 +1,11 @@
+++
categories = ["webdev"]
date = 2020-05-08
summary = "Everybody probably understands how Cloudflare proxies A/AAAA records, but how it proxies CNAME records is also pretty interesting. Let's dive into how that happens and why it can often break other products that need you to set CNAME records."
categories = ["webdev"]
slug = "how-cloudflare-proxies-cname-records"
socialImage = "uploads/cf_proxy_social.webp"
tags = ["cloudflare"]
title = "How Cloudflare proxies CNAME records"
tags = ["cloudflare"]
socialImage = "cf_proxy_social.webp"
+++
As people who've read my previous post would know, I recently started using [Purelymail](https://purelymail.com/) for my email needs (the how and why of it can be found [here](/posts/switching-my-email-to-purelymail/)). I also mentioned there, that Cloudflare's proxy-by-default nature caused Purelymail to not detect my CNAME settings and disabling the proxy did the job. I contacted Purelymail's Scott about this and he eventually pushed a fix out that \*should\* have fixed it, but since he did not have a Cloudflare account, he couldn't verify this exact case.

View File

Before

Width:  |  Height:  |  Size: 55 KiB

After

Width:  |  Height:  |  Size: 55 KiB

View File

@ -106,7 +106,7 @@ Before GitHub had the [GitHub CLI][4], it had [hub][5]. `hub` wraps `git` and ad
[1]: https://msfjarvis.dev/g/dotfiles
[2]: https://github.com/so-fancy/diff-so-fancy
[3]: /uploads/diff-so-fancy-screenshot.webp
[3]: diff-so-fancy-screenshot.webp
[4]: https://cli.github.com/
[5]: https://hub.github.com/
[6]: https://github.com/tummychow/git-absorb

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

View File

@ -2,9 +2,9 @@
title = "Improving dependency sync speeds for your Gradle project"
date = "2024-03-30T21:43:07.031Z"
summary = "Waiting for Gradle to download dependencies is so 2023"
socialImage = "uploads/gradle-social.webp"
categories = ["gradle"]
tags = ["gradle", "kotlin-multiplatform", "perf"]
socialImage = "gradle-social.webp"
draft = false
+++
Android developers are intimately familiar with the ritual of staring at your IDE for tens of minutes while Gradle imports a new project before they can start working on it. While not fully avoidable, there are many ways to improve the situation. For small to medium projects, the time spent on this import phase can be largely dominated by dependency downloads.

View File

Before

Width:  |  Height:  |  Size: 4.5 KiB

After

Width:  |  Height:  |  Size: 4.5 KiB

View File

@ -1,12 +1,12 @@
+++
categories = ["hugo", "webdev"]
date = 2020-01-20
summary = "Adding additional comment backends to Hugo is actually rather simple!"
devLink = "https://dev.to/msfjarvis/integrating-comments-in-hugo-sites-with-commento-136f"
slug = "integrating-comments-in-hugo-sites-with-commento"
socialImage = "uploads/commento_social.webp"
tags = ["static sites", "comments", "commento.io"]
date = 2020-01-20
socialImage = "commento_social.webp"
devLink = "https://dev.to/msfjarvis/integrating-comments-in-hugo-sites-with-commento-136f"
title = "Integrating comments in Hugo sites with commento"
categories = ["hugo", "webdev"]
tags = ["static sites", "comments", "commento.io"]
+++
Disqus is unequivocally the leader when it comes to hosted comments, and it works rather swimmingly with sites of all kinds with minimal hassle. But this ease has a gnarly flipside: [annoying referral links](https://stiobhart.net/2017-02-21-disqusting/) and a [huge bundle size](https://victorzhou.com/blog/replacing-disqus/) that significantly affects page load speeds.

View File

Before

Width:  |  Height:  |  Size: 62 KiB

After

Width:  |  Height:  |  Size: 62 KiB

View File

@ -1,11 +1,11 @@
+++
categories = ["linux"]
date = 2020-07-17
summary = "Getting a USB Bluetooth dongle to function properly on Linux proved to be somewhat of a trip, which I'm documenting here."
categories = ["linux"]
slug = "making-a-bluetooth-adapter-work-on-linux"
socialImage = "uploads/bluetooth_social.webp"
tags = ["bluetooth", "bt-audio"]
title = "Making a Bluetooth adapter work on Linux"
tags = ["bluetooth", "bt-audio"]
socialImage = "bluetooth_social.webp"
+++
I made a couple of purchases yesterday, including a Bluetooth speaker and a USB Bluetooth dongle to pair it to my computer. Now here's a couple things that you need to know about said computer:

View File

@ -1,12 +1,12 @@
+++
categories = ["kotlin", "android"]
date = 2020-12-21
summary = "Moshi is a fast and powerful JSON parsing library for the JVM and Android. Today we look into manually parsing JSON to and from Java/Kotlin classes"
slug = "manually-parsing-json-with-moshi"
socialImage = "/uploads/moshi_social.webp"
tags = ["moshi", "json parsing", "moshi read json from file"]
title = "Manually parsing JSON with Moshi"
toc = true
slug = "manually-parsing-json-with-moshi"
title = "Manually parsing JSON with Moshi"
date = 2020-12-21
categories = ["kotlin", "android"]
tags = ["moshi", "json parsing", "moshi read json from file"]
socialImage = "moshi_social.webp"
+++
### What is Moshi?

View File

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

View File

Before

Width:  |  Height:  |  Size: 82 KiB

After

Width:  |  Height:  |  Size: 82 KiB

View File

Before

Width:  |  Height:  |  Size: 124 KiB

After

Width:  |  Height:  |  Size: 124 KiB

View File

@ -1,11 +1,11 @@
+++
categories = ["aps"]
date = 2021-11-06
summary = "I recently migrated Password Store to Material You, Google's latest iteration of Material Design. Here's how it went."
categories = ["aps"]
slug = "migrating-aps-to-material-you"
tags = ["android-password-store"]
title = "Migrating APS to Material You"
socialImage = "uploads/m3-social.webp"
tags = ["android-password-store"]
socialImage = "m3-social.webp"
+++
With much fanfare, Google released the next iteration of Material Design: **Material You**. It's received mixed reviews, but I found it extremely pleasant to use and the homogeneity of Google apps following the platform colors felt great. That's what prompted me to update APS to Material You and join in :)
@ -50,11 +50,11 @@ We use a third-party library by [Max Rumpf] called [ModernAndroidPreferences] fo
### Before
![Screenshot gallery of a few APS screens before the Material 3 migration](/uploads/aps_m2_gallery.webp)
![Screenshot gallery of a few APS screens before the Material 3 migration](aps_m2_gallery.webp)
### After
![Screenshot gallery of a few APS screens after the Material 3 migration](/uploads/aps_m3_gallery.webp)
![Screenshot gallery of a few APS screens after the Material 3 migration](aps_m3_gallery.webp)
## Closing notes

View File

Before

Width:  |  Height:  |  Size: 196 KiB

After

Width:  |  Height:  |  Size: 196 KiB

View File

Before

Width:  |  Height:  |  Size: 180 KiB

After

Width:  |  Height:  |  Size: 180 KiB

View File

@ -1,12 +1,12 @@
+++
categories = ["android"]
date = 2020-01-11
summary = "Dagger is not the easiest tool to get on board with but it's almost worth the effort. Here's the story of my journey to not hating Dagger."
devLink = "https://dev.to/msfjarvis/my-dagger-story-2go0"
slug = "my-dagger-story"
socialImage = "uploads/dagger_story_social.webp"
tags = ["dagger"]
date = 2020-01-11
socialImage = "dagger_story_social.webp"
devLink = "https://dev.to/msfjarvis/my-dagger-story-2go0"
title = "My Dagger Story"
categories = ["android"]
tags = ["dagger"]
+++
[Dagger](https://dagger.dev) is infamous for very good reasons. It's complicated to use, the documentation is an absolute shitshow, and simpler 'alternatives' exist. While [Koin](http://insert-koin.io/) and to a lesser extent [Kodein](https://kodein.org/di/) do the job, they're still service locators at their core and don't automatically inject dependencies like Dagger does.

View File

Before

Width:  |  Height:  |  Size: 9.8 KiB

After

Width:  |  Height:  |  Size: 9.8 KiB

View File

@ -1,12 +1,12 @@
+++
categories = ["android"]
date = 2019-11-21
summary = "GitHub recently rolled out Packages to the general public, allowing the entire develop-test-deploy pipeline to get centralized at GitHub. Learn how to use it to publish your Android library packages."
devLink = "https://dev.to/msfjarvis/publishing-an-android-library-to-github-packages-1l74"
slug = "publishing-an-android-library-to-github-packages"
socialImage = "uploads/github_packages_social.webp"
tags = ["gradle", "github", "packaging"]
date = 2019-11-21
socialImage = "github_packages_social.webp"
devLink = "https://dev.to/msfjarvis/publishing-an-android-library-to-github-packages-1l74"
title = "Publishing an Android library to GitHub Packages"
categories = ["android"]
tags = ["gradle", "github", "packaging"]
+++
> UPDATE(06/06/2020): The Android Gradle Plugin supports Gradle's inbuilt `maven-publish` plugin since version 4.0.0, so I've added the updated process for utilising it at the beginning of this guide. The previous post follows that section.
@ -275,6 +275,6 @@ That's it! Once you push to GitHub, you'll see the [action running](https://gith
The requirement to authenticate for packages is a significant problem with GitHub Packages' adoption, giving an edge to solutions like [JitPack](https://jitpack.io) which handle the entire process automagically. As mentioned earlier, I did contact GitHub support about it and got this back.
![GitHub support reply about authentication requirement for packages](/uploads/github_packages_support_response.webp)
![GitHub support reply about authentication requirement for packages](github_packages_support_response.webp)
My interpretation of this is quite simply that **it's gonna take a while**. I hope not :)

View File

Before

Width:  |  Height:  |  Size: 66 KiB

After

Width:  |  Height:  |  Size: 66 KiB

View File

Before

Width:  |  Height:  |  Size: 57 KiB

After

Width:  |  Height:  |  Size: 57 KiB

View File

@ -1,12 +1,12 @@
+++
categories = ["webdev"]
date = 2019-12-17
summary = "Analytics platforms are often overwhelming and a privacy nightmare -- here's how to bring analytics to the backend with very simple tooling"
devLink = "https://dev.to/msfjarvis/server-side-analytics-with-goaccess-pg8"
slug = "serverside-stats-with-goaccess"
socialImage = "uploads/goaccess_social.webp"
tags = ["caddyserver", "goaccess", "analytics"]
date = 2019-12-17
socialImage = "goaccess_social.webp"
devLink = "https://dev.to/msfjarvis/server-side-analytics-with-goaccess-pg8"
title = "Server-side analytics with Goaccess"
categories = ["webdev"]
tags = ["caddyserver", "goaccess", "analytics"]
+++
Analytics are a very helpful aspect of any development. They allow developers to know what parts of their apps are visited the most often and can use more attention, and for bloggers to know what content does or does not resonate with their readers.
@ -23,7 +23,7 @@ Goaccess is an **open-source**, **real-time** web log analyzer. In other words,
To create a compelling analytics experience, we'll need to use Goaccess' `--real-time-html` option, that creates an HTML report, and an accompanying `WebSocket` server that will dispatch a request to update the page data every time goaccess parses updated logs. Here's a peek at Goaccess' terminal visualizer, to get an idea about the datasets you can expect from the web version.
![Goaccess in the terminal](/uploads/goaccess_terminal.webp)
![Goaccess in the terminal](goaccess_terminal.webp)
Goaccess supports most common webserver log formats, and [some more](https://goaccess.io/man#options) with the option to provide your own format if you're using custom solutions. I'm using `VCOMMON`, as that is the default log format of my webserver of choice, [Caddy](https://caddyserver.com). Here's the command executed by the systemd unit that I use for goaccess. I'll explain every option in a bit.

View File

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

View File

@ -1,11 +1,11 @@
+++
categories = ["rust", "dev"]
date = 2020-07-05
summary = "Rust programs are pretty fast on their own, but you can slightly augment their performance with some simple tricks."
categories = ["rust", "dev"]
slug = "simple-tricks-for-faster-rust-programs"
socialImage = "uploads/cuddlyferris.webp"
tags = ["perf"]
title = "Simple tricks for faster Rust programs"
tags = ["perf"]
socialImage = "cuddlyferris.webp"
+++
Rust is _pretty_ fast. Let's get that out of the way. But sometimes, _pretty_ fast is not fast enough.

View File

@ -1,11 +1,11 @@
+++
categories = ["news"]
date = 2020-02-09
summary = "The Viscerion experiment that started more than a year ago is now coming to an end. Here's what's happening."
categories = ["news"]
slug = "sunsetting-viscerion"
socialImage = "uploads/viscerion_social.webp"
tags = ["personal"]
title = "Sunsetting Viscerion"
tags = ["personal"]
socialImage = "viscerion_social.webp"
+++
Viscerion is one of my more known and loved apps that I myself continue to enjoy working on and using. The project started back in 2018 following a short stint with WireGuard working on their own Android app, and is now being shut down.

View File

Before

Width:  |  Height:  |  Size: 6.1 KiB

After

Width:  |  Height:  |  Size: 6.1 KiB

View File

@ -1,12 +1,12 @@
+++
categories = ["teachingkotlin", "kotlin", "dev", "android"]
date = 2019-09-20
summary = "Kotlin's been great for me -- and millions others, as evident by its explosive growth. Long-time Java developers may feel hesitant to give it a shot. This series aims to smoothen this transition, letting people know what benefits they might reap from Kotlin, and what differences should they be careful about."
devLink = "https://dev.to/msfjarvis/teachingkotlin-kotlin-for-android-java-developers-1fo3"
slug = "teaching-kotlin--kotlin-for-android-java-developers"
socialImage = "uploads/teachingkotlin_social.webp"
tags = []
date = 2019-09-20
socialImage = "teachingkotlin_social.webp"
devLink = "https://dev.to/msfjarvis/teachingkotlin-kotlin-for-android-java-developers-1fo3"
title = "#TeachingKotlin - Kotlin for Android Java developers"
categories = ["teachingkotlin", "kotlin", "dev", "android"]
tags = []
+++
Anybody familiar with my work knows that I am a fan of the [Kotlin](https://kotlinlang.org/ "Kotlin") programming language, especially it's interoperability with Java with respect to Android. I'll admit, I've not been a fan since day one. The abundant lambdas worried me and everything being that much shorter to implement was confusing to a person whose first real programming task was in the Java programming language.

View File

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

@ -1,12 +1,12 @@
+++
categories = ["kotlin", "android", "teachingkotlin"]
date = 2019-09-23
summary = "Part 1 of my #TeachingKotlin, this post goes over Kotlin classes, objects and how things like finality and staticity vary between Java and Kotlin."
slug = "teaching-kotlin--classes-and-objects"
tags = []
title = "#TeachingKotlin Part 1 - Classes and Objects and everything in between"
date = 2019-09-23
socialImage = "teachingkotlin_social.webp"
devLink = "https://dev.to/msfjarvis/teachingkotlin-part-1-classes-and-objects-and-everything-in-between-5bn0"
socialImage = "uploads/teachingkotlin_social.webp"
title = "#TeachingKotlin Part 1 - Classes and Objects and everything in between"
categories = ["kotlin", "android", "teachingkotlin"]
tags = []
+++
Classes in Kotlin closely mimic their Java counterparts in implementation, with some crucial changes that I will attempt to outline here.

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

@ -1,12 +1,12 @@
+++
categories = ["kotlin", "android", "teachingkotlin"]
date = 2019-09-30
summary = "The second post in #TeachingKotlin series, this post goes over Kotlin's variables and their attributes, like visibility and getters/setters."
devLink = "https://dev.to/msfjarvis/teachingkotlin-part-2-variables-2api"
slug = "teaching-kotlin--variables"
socialImage = "uploads/teachingkotlin_social.webp"
tags = []
date = 2019-09-30
socialImage = "teachingkotlin_social.webp"
devLink = "https://dev.to/msfjarvis/teachingkotlin-part-2-variables-2api"
title = "#TeachingKotlin Part 2 - Variables"
categories = ["kotlin", "android", "teachingkotlin"]
tags = []
+++
Even the variables in Kotlin are supercharged!

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

@ -1,12 +1,12 @@
+++
categories = ["kotlin", "android", "teachingkotlin"]
date = 2019-12-16
summary = "Part 3 of #TeachingKotlin covers some subtle differences between Kotlin and Java that might affect your codebases as you start migrating to or writing new code in Kotlin."
devLink = "https://dev.to/msfjarvis/teachingkotlin-part-3-caveats-coming-from-java-2e1k"
slug = "teachingkotlin-part-3--caveats-coming-from-java"
socialImage = "uploads/teachingkotlin_social.webp"
tags = []
date = 2019-12-16
socialImage = "teachingkotlin_social.webp"
devLink = "https://dev.to/msfjarvis/teachingkotlin-part-3-caveats-coming-from-java-2e1k"
title = "#TeachingKotlin Part 3 - Caveats coming from Java"
categories = ["kotlin", "android", "teachingkotlin"]
tags = []
+++
When you start migrating your Java code to Kotlin, you will encounter multiple subtle changes that might catch you off guard. I'll document some of these gotchas that I and other people I follow have found and written about.

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View File

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

View File

@ -1,11 +1,11 @@
+++
categories = ["github-actions"]
date = 2021-01-02T00:00:00Z
date = 2021-01-02T00:00:00.000Z
summary = "GitHub Actions is a power CI/CD platform that can do a lot more than your traditional CI systems. Here's some tips to get you started with exploring its true potential."
categories = ["github-actions"]
slug = "github-actions-tips-tricks"
socialImage = "/uploads/actions_social.webp"
tags = ["tips and tricks", "schedules", "jobs", "workflows"]
title = "Tips and Tricks for GitHub Actions"
tags = ["tips and tricks", "schedules", "jobs", "workflows"]
socialImage = "actions_social.webp"
+++
GitHub Actions has grown at a rapid pace, and has become the CI platform of choice for most open source projects. The recent changes to Travis CI's pricing for open source is certainly bound to accelerate this even more.
@ -133,7 +133,7 @@ Tags are moving qualifiers, and can be [force pushed at any moment](https://juli
To get the commit hash for a specific tag, head to the Releases page of the repository, then click the short SHA1 hash below the tag name and copy the full hash from the URL.
![A tag along with its commit hash](/uploads/actions_tips_tricks_commit_hash.webp)
![A tag along with its commit hash](actions_tips_tricks_commit_hash.webp)
> {{< sub "Here, the commit hash is feb985e. Ideally, you want to click that link and copy the full hash from the URL" >}}

View File

@ -1,13 +1,12 @@
+++
categories = ["android", "kotlin"]
date = 2020-11-21T00:00:00Z
summary = "Building libraries is hard, and keeping track of your public API surface harder. Kotlin 1.4's explicit API mode tries to make the latter not be difficult anymore."
draft = true
slug = "tips-for-building-kotlin-libraries"
socialImage = "/uploads/kotlin_social.webp"
tags = ["libraries"]
title = "Tips and tricks for building libraries in Kotlin"
date = 2020-11-21T00:00:00.000Z
categories = ["android", "kotlin"]
tags = ["libraries"]
socialImage = "kotlin_social.webp"
+++
Building a library is arguably a far more involved task than building an application. You need to be _extra_ mindful of your dependencies, and ensure that you are not breaking source and/or binary compatibility unintentionally. When doing so in Kotlin, you may also need to also provide an idiomatic API surface for Java callers if you're offering JVM support.

View File

Before

Width:  |  Height:  |  Size: 6.8 KiB

After

Width:  |  Height:  |  Size: 6.8 KiB

View File

@ -1,11 +1,11 @@
+++
categories = ["rust"]
date = 2019-09-07
summary = "Rust is an amazing systems language that is on an explosive rise thanks to its memory safety guarantees and fast, iterative development. In this post, I recap some of the tooling that I use with Rust to make coding in it even more fun and intuitive"
slug = "tools-for-effective-rust-development"
date = 2019-09-07
socialImage = "rust_social.webp"
devLink = "https://dev.to/msfjarvis/tools-for-effective-rust-development-3mb4"
title = "Tools for effective Rust development"
slug = "tools-for-effective-rust-development"
socialImage = "uploads/rust_social.webp"
categories = ["rust"]
tags = ["cargo", "rls", "cargo-edit", "clippy"]
+++

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

View File

@ -1,11 +1,11 @@
+++
categories = ["tools-of-the-trade"]
date = 2020-08-04
summary = "In the first post in the new 'Tools of the trade' series, we talk about direnv."
categories = ["tools-of-the-trade"]
slug = "tools-of-the-trade-direnv"
socialImage = "uploads/tools-of-the-trade-direnv.webp"
tags = ["direnv", "cli-tools"]
title = "Tools of the trade: direnv"
tags = ["direnv", "cli-tools"]
socialImage = "tools-of-the-trade-direnv.webp"
+++
This post was supposed to be a monolith directory of all the CLI-based tooling that I use to get things done throughout my day, but it turned out to be just a bit too long so I elected to split it out into separate posts.

View File

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

View File

@ -1,11 +1,11 @@
+++
categories = ["tools-of-the-trade"]
date = 2020-08-18
summary = "Probably the final post of this series? Let's talk about fd!"
categories = ["tools-of-the-trade"]
slug = "tools-of-the-trade-fd"
socialImage = "uploads/tools-of-the-trade-fd.webp"
tags = ["fd", "cli-tools"]
title = "Tools of the trade: fd"
tags = ["fd", "cli-tools"]
socialImage = "tools-of-the-trade-fd.webp"
+++
Continuing [this series](/categories/tools-of-the-trade/), let's talk about [fd](https://github.com/sharkdp/fd).

View File

Before

Width:  |  Height:  |  Size: 4.0 KiB

After

Width:  |  Height:  |  Size: 4.0 KiB

View File

@ -1,11 +1,11 @@
+++
categories = ["tools-of-the-trade"]
date = 2020-08-10
summary = "Continuing this series, let's talk about fzf."
categories = ["tools-of-the-trade"]
slug = "tools-of-the-trade-fzf"
socialImage = "uploads/tools-of-the-trade-fzf.webp"
tags = ["fzf", "cli-tools"]
title = "Tools of the trade: fzf"
tags = ["fzf", "cli-tools"]
socialImage = "tools-of-the-trade-fzf.webp"
+++
In the second post of [this series](/categories/tools-of-the-trade/), let's talk about [fzf](https://github.com/junegunn/fzf).

View File

Before

Width:  |  Height:  |  Size: 4.0 KiB

After

Width:  |  Height:  |  Size: 4.0 KiB

View File

@ -1,11 +1,11 @@
+++
categories = ["tools-of-the-trade"]
date = 2020-09-02
summary = "Bringing this series back on popular demand, we're here to talk about SDKMAN!"
categories = ["tools-of-the-trade"]
slug = "tools-of-the-trade-sdkman"
socialImage = "uploads/tools-of-the-trade-sdkman.webp"
tags = ["sdkman", "cli-tools"]
title = "Tools of the trade: SDKMAN!"
tags = ["sdkman", "cli-tools"]
socialImage = "tools-of-the-trade-sdkman.webp"
+++
In the fourth post of [this series](/categories/tools-of-the-trade/), we're talking about [SDKMAN!](https://sdkman.io).

View File

Before

Width:  |  Height:  |  Size: 6.0 KiB

After

Width:  |  Height:  |  Size: 6.0 KiB

View File

@ -1,13 +1,13 @@
+++
categories = ["android"]
date = 2020-07-23
summary = "(Mostly) everybody agrees that Android upgrades are good, but how very crucial they are to security and privacy often gets overlooked. Let's dig into that."
devLink = "https://dev.to/msfjarvis/why-upgrade-android-557f"
slug = "why-upgrade-android"
socialImage = "uploads/why_upgrade_android_social.webp"
tags = ["updates", "security", "privacy"]
title = "Why upgrade Android?"
toc = true
slug = "why-upgrade-android"
date = 2020-07-23
socialImage = "why_upgrade_android_social.webp"
devLink = "https://dev.to/msfjarvis/why-upgrade-android-557f"
title = "Why upgrade Android?"
categories = ["android"]
tags = ["updates", "security", "privacy"]
+++
A couple days ago I came across a security conscious user who was quick to point out why a particular feature had to be added to APS, but failed to realise the fact that the problem wouldn't even exist if they were running the latest version of Android (we'll talk about the behavior change that fixed it later here).

View File

Before

Width:  |  Height:  |  Size: 6.7 KiB

After

Width:  |  Height:  |  Size: 6.7 KiB

2
go.mod
View File

@ -4,5 +4,5 @@ go 1.19
require (
github.com/adityatelange/hugo-PaperMod v0.0.0-20240316195851-dad94ab4b7c5 // indirect
github.com/msfjarvis/hugo-social-metadata v1.0.1 // indirect
github.com/msfjarvis/hugo-social-metadata v1.0.2 // indirect
)

4
go.sum
View File

@ -1,4 +1,4 @@
github.com/adityatelange/hugo-PaperMod v0.0.0-20240316195851-dad94ab4b7c5 h1:yczLu4cdgnLAiRHGQuxTP86WHfEvip4IAkcKT/2HocE=
github.com/adityatelange/hugo-PaperMod v0.0.0-20240316195851-dad94ab4b7c5/go.mod h1:HCHxNMKYdGafUYjVV3ICiAqznZK2yH0iI53jqcDFDdQ=
github.com/msfjarvis/hugo-social-metadata v1.0.1 h1:cnFLbgfEfiDGC7iFUTZ+Y6ME0Lw9rAARMjn4emfb4wQ=
github.com/msfjarvis/hugo-social-metadata v1.0.1/go.mod h1:VfkrQTa9Gvdja58swLlBZz2/7ZEoj5nk9xt0pJAhfVo=
github.com/msfjarvis/hugo-social-metadata v1.0.2 h1:EEt/ERvk8RCLyanMnkm0Q1/ECjoReM/Nx25/8AXUZ7s=
github.com/msfjarvis/hugo-social-metadata v1.0.2/go.mod h1:VfkrQTa9Gvdja58swLlBZz2/7ZEoj5nk9xt0pJAhfVo=