about summary refs log tree commit diff
AgeCommit message (Collapse)AuthorFilesLines
2020-08-08 Update jwtIsValid API to return IO BoolWilliam Carroll2-6/+6
I need IO for: - Getting the current time to validate `exp` - Making an HTTP request to Google's token verifier endpoint
2020-08-08 Remove redundant deps from API.hsWilliam Carroll1-2/+0
Thank you, -Wall. You are truly an unsung hero.
2020-08-08 Begin work for supporting GoogleSignIn server-sideWilliam Carroll4-5/+92
I'm attempting to be an obedient boy and implement this and future features using TDD. TL;DR: - Defined a few tests - Defined an empty GoogleSignIn module - Defined a Fixtures module to quickly create JWTs to test
2020-08-08 Define Utils moduleWilliam Carroll1-0/+8
Dumping grounds for personal, stylistic functions intended to improve readabily and writability (in that order).
2020-08-06 Support echo server to test POST /verifyWilliam Carroll5-8/+79
TL;DR: - Add common dependencies like Servant, Aeson, Warp, Cors - Define a POST /verify endpoint for our client to hit - POST to /verify client-side onSignIn
2020-08-06 Support Google Sign-in client-sideWilliam Carroll5-1/+53
TODO: Support Google Sign-in server-side Also: - Add Haskell to project's shell.nix - Add stubbed Main.hs and Spec.hs - Add common .ghci file
2020-08-06 Re-type type using the altered keyboardWilliam Carroll5-7/+129
Remember: always read the instructions; that's the most important part.
2020-08-06 Support Transforms.optimizeWilliam Carroll2-0/+19
Partially optimize inputs and document rules for further optimizations we can make.
2020-08-05 Apply a series of transformation to a QWERTY keyboardWilliam Carroll4-32/+51
TL;DR: - Accept input from the CLI - Add a project README.md
2020-08-05 Support App.transformWilliam Carroll5-1/+57
Apply the transform to a Keyboard. Onwards to the final demonstration!
2020-08-05 Support parsing the list of transformsWilliam Carroll2-7/+65
Using Haskell's Text.ParserCombinators.ReadP library for the first time, and I enjoyed it thoroughly! It's nice avoiding a third-party library like MegaParsec.
2020-08-05 Define an instance for Show for a KeyboardWilliam Carroll1-0/+23
This will help me debug.
2020-08-05 Create a Utils moduleWilliam Carroll1-0/+8
To stylize things...
2020-08-05 Add some the scaffolding for testingWilliam Carroll2-0/+20
As I attempt to habituate TDD, I should have some examples of tests to minimize all friction preventing me from testing.
2020-08-04 Include instructions for building Tailwind CSS in README.mdWilliam Carroll1-0/+1
After consuming my Elm boilerplate, I realized that I was missing this.
2020-08-04 Create small command line program that parses argumentsWilliam Carroll3-0/+56
Before starting my take-home assignment, the instructions advised me to create a "Hello, world" program in the language of my choice. Since I'm choosing Haskell, I created this example as my starter boilerplate.
2020-07-30 Mark Dangal as watchedWilliam Carroll2-1/+1
Many Bollywood movies have excellent acting, excellent directing, excellent storytelling, but in my opinion, they spoil this with unnecessary musicals interspersed throughout the films. Dangal is a notable exception here. Overall, I'd say that this movie is appropriately rated!
2020-07-30 Mark Hitchcock's Vertigo as watchedWilliam Carroll2-1/+1
Watched the famous "Vertigo" with the timeless Jimmy Stewart. Overall I'd say that the film is overhyped, but worth watching nevertheless.
2020-07-26 Watch "Hacksaw Ridge"William Carroll2-1/+1
I don't plan on writing movie reviews in my Git commit message.
2020-07-26 Add query for the productive directorsWilliam Carroll1-0/+15
Show the movies from directors that appear more than once in the list.
2020-07-26 Create a scratch buffer for common queriesWilliam Carroll1-0/+50
Defining some commonly used criteria for selecting movies as SQL queries.
2020-07-26 Mark Andhadhun as watchedWilliam Carroll1-1/+1
What a confusing movie this was... I may need to watch it a second time to better understand what happened, but I found watching it once already so exhausting that I'm not sure I'll ever watch it again.
2020-07-26 Update schema for Movies tableWilliam Carroll2-90/+0
Added the following fields (would be cool if `git` could show this): - rating - haveWatched - director - isCartoon - requiresSubtitles
2020-07-26 Create //playbooks/sqlite3.mdWilliam Carroll1-0/+115
Write a playbook for using SQLite to capture some trivia that I often forget in between my ~infrequent uses of SQLite.
2020-07-26 Create //playbooks/shell.mdWilliam Carroll1-0/+12
Taken from the overview: > I'm making this as an offline reference for some of the commands that I use > often enough to need to remember but not often enough to *actually* remember.
2020-07-26 Add .sqliterc to //configsWilliam Carroll1-0/+2
Prefer these more human-readable defaults to SQLite.
2020-07-26 Create SQLite database from unwatched movies in imdb-top-250.orgWilliam Carroll3-2/+92
The astute observer may notice that the number of entries in db.sqlite3 is fewer than the number of unwatched movies in imdb-top-250.org. I'm at a lake in Germany with Mimi and Cullen, so we took the intersection of my unwatched movies, Mimi's unwatched movies, and Cullen's unwatched movies.
2020-07-24 Add two steps to finances playbookWilliam Carroll1-0/+2
I needed to add the first step since I dipped into my Emergency fund last month to pay for someone to prepare my US tax return. I added the other step as a reminder.
2020-07-24 Fix typo in finances playbookWilliam Carroll1-1/+1
amount -> amounts
2020-07-21 Support dictionary.mdWilliam Carroll1-0/+12
Back when I owned an iPhone -- before I switched (mistakenly and thus temporarily) to Android -- I had a note for each year's newly learned words. As I am condensing as many of my documents as possible into my briefcase, I decided it is time for including a dictionary. I can still record words on my phone, and then I can transfer them to this document.
2020-07-20 Create //todo-listsWilliam Carroll3-0/+256
In the beginning there existed only a generic //org directory... This directory was generic enough to include any .org file regardless of its purpose, but specific enough to disallow membership of other worthy files of the Markdown ilk. Then came the //playbooks directory, which robbed //org of most of its inhabitants... In the interim various .md and .org TODO lists existed scattered across the landscape of the monorepo... some existed in far-away, exotic lands like "travel-histlist"... These fractious tribes shared much in common with their distant relatives, but the superficial differences granted the simple-minded, draconian filesystem license to prevent them from mingling. Then one day the monorepo had a new visitor: //todo-lists. //todo-lists restored order to the monorepo, uniting all of the fractious documents under one roof. .md and .org files held hands and sang Kumbaya around a blazing fire for the first time in history. All was well, and all were happy.
2020-07-20 Create //playbooksWilliam Carroll8-1/+4
I'm particularly excited about this idea. As I was reading Graham's "Erase your darlings" blog post, I had an idea: I should have playbooks at the root of my monorepo. I can have playbooks for the following: - How to install NixOS - How to build GCR images from Nix expressions - A collection of miscellaneous shell commands (e.g. "how to kill a process by name") - What series of steps should I follow when I receive a paycheck I already keep README's at the root of each package, which I think is where many of these instructions belong. Other tutorials that I write for myself that do not belong to any package can go in //playbooks. I also will host my personal habits in //playbooks since habits are a bit like playbooks for life. Let's see how this idea ages as the caffeine wears off...
2020-07-20 Move monzo_ynab into //toolsWilliam Carroll16-3/+3
Optimizing is difficult: I like flat hierarchies because I don't like directory-hopping, but I also would like a cleaner root for my mono-repo. Bombs away! Well it's that time again, folks: spring cleaning! Here I am musing about a few things that bother me: - Should I use kebab-case or snake_case? - It feels ~confusing to have //tools and //utils. What a //projects? Isn't everything a project? *sigh*
2020-07-20 Add a README to haskell-fileWilliam Carroll1-0/+7
Because every library/package deserves a README.
2020-07-20 Move AOC into //scratchWilliam Carroll8-0/+0
Also rename it advent-of-code-2019 since I expect to participate this year as well. TODO: Should directories and files be name like-this or like_this?
2020-07-17 Partially complete IO chapter exercisesWilliam Carroll1-0/+35
Inconveniently, I do not have the cipher code that I wrote from a previous chapter, and I'm not eager to reimplement it. TODO - Implement encrypt - Implement decrypt - Read all characters from STDIN
2020-07-17 Remove week / 52 indicatorWilliam Carroll1-1/+1
This is taking up too much space.
2020-07-17 Update grocery listWilliam Carroll1-13/+33
- Add new entries - Change quantities of existing entries
2020-07-17 Partially complete the "Basic Libraries" chapter exercisesWilliam Carroll1-0/+60
I was instructed to benchmark these functions, but I couldn't get the benchmarking library to run using Nix -- although I'm *sure* it's possible. Unfortunately the book recommends using `stack`, which I couldn't reproduce.
2020-07-14 Complete exercises for "Non-Strictness" chapterWilliam Carroll1-0/+6
I completed most of the exercises for this enlightening chapter in ghci.
2020-07-12 Finish exercises for Monad Transformer chapterWilliam Carroll1-6/+110
I expect to look back on this code and cringe, but... it compiles!
2020-07-12 Partially complete Monad Transformer exercisesWilliam Carroll1-0/+79
Write Functor, Applicative, Monad instances for: - MaybeT - EitherT - ReaderT
2020-07-11 Partially complete some of the exercises for Composing TypesWilliam Carroll1-0/+75
I believe there are two exercises sets in the "Composing Types" chapter. Here are *some* of my answers so far... I'm having trouble implementing Foldable for Compose. I was able to implement a version of it by adding the (Functor f) constraint to the instance signature, but I think I cheated. I will revisit these problems as well as the earlier exercises later.
2020-07-06 Misc Emacs improvementsWilliam Carroll2-0/+6
I stole these bad-boys from @tazjin's config.
2020-07-06 Add ref attribute to fetchGitWilliam Carroll1-5/+7
Because revs afa9ca, dc80d7 aren't in the "default" (typically "master") branch of NixOS/nixpkgs-channels, I need to specify the ref (aka branch) in order for fetchGit to resolve the rev.
2020-07-06 Prefer telephone-line to doom-modelineWilliam Carroll3-4/+67
After growing frustrated with doom-modeline's compatibility with my EXWM setup, I decided to borrow @tazjin's setup, which I find to be much more appealing.
2020-07-02 Clear $NIX_PATHWilliam Carroll2-5/+23
Ensure that $NIX_PATH is empty using a .envrc file. nix.dev considers references to <nixpkgs>, <briefcase>, <depot>, <unstable> to be an anti-pattern because it hinders reproducibility by introducing an implicit environment. This repository is chock-full of references to <{nixpkgs,unstable,briefcase,depot}>, so right now everything is broken.
2020-07-02 Prefer builtins.pathWilliam Carroll12-15/+13
Thanks to the Nix anti-patterns documented here... https://nix.dev/anti-patterns/language.html#reproducability-referencing-top-level-directory-with ...I'm cleaning up some of my Nix expressions. Read the article for more context.
2020-07-01 Impl part 3/3 for MemoWilliam Carroll1-29/+10
Refactor the caching policy for the Memo by evicting the elements that have been the least-recently-accessed. Python's heapq module default to a min-heap. By storing our heap elements as (UnixTime, a), we can guarantee that when we call heappop, we will get the element with the lowest UnixTime value in heap (i.e. the oldest). When we call heappush, we use (time.time(), key) and these values -- by having the largest UnixTime, will propogate to the bottom of the min-heap.
2020-07-01 Support part 2/3 for the Memo problemWilliam Carroll1-4/+64
Bound the size of the memo by creating a BoundedQueue. Whenever we add elements to the BoundedQueue, we remove the oldest elements. We use the BoundedQueue to control the size of our dictionary that we're using to store our key-value pairs.