about summary refs log tree commit diff
AgeCommit message (Collapse)AuthorFilesLines
2020-08-12 Support buildHaskellWilliam Carroll2-9/+41
Use Nix and Briefcase to easily create Haskell executables. I'd eventually like to support something like: briefcase.buildHaskell.project that let me define a few top-level values (e.g. ghcExtensions) and would give me a ghci environment with the proper `.ghci` settings so that my development environment mirrored my build environment... baby steps, though.
2020-08-12 Define alias for cd-ing to ~/briefcaseWilliam Carroll1-3/+13
Small but useful alias.
2020-08-12 Prefer snake-shift instead of a row-by-row shiftWilliam Carroll5-37/+57
Per the assignment's instructions, the `Shift n` operation should treat the *entire keyboard* like a cycle and shift that. I was erroneously treating *each row* like a cycle and shifting those one-by-one. This change fixes that. In addition, it also: - Updates README.md with expected inputs and outputs - Updates test suite - Adds `split` dependency to {default,shell}.nix
2020-08-12 Adds property tests to generically test keyboard transformationsWilliam Carroll1-1/+25
Tests: - HorizontalFlip - VerticalFlip - Shift n
2020-08-12 Prefer literal, not computed, examples in the unit testsWilliam Carroll1-21/+19
TL:DR: - Remove unused imports: Test.QuickCheck and Control.Exception - Remove calls to `reverse` and `Utils.rotate` with their results
2020-08-12 Provide more useful instructions for building this projectWilliam Carroll3-18/+67
TL;DR: - include a default.nix to allow users to build an named executable - emphasize in the README that the user needs Nix to build this project - pin nixpkgs to a specific commit and fetch it from GitHub
2020-08-12 Generate coords function from existing qwerty keyboardWilliam Carroll1-44/+8
Per my take-home assignment's reviewer's comments, with which for the record I agree, I should generate the character->coordinate table from my existing qwerty keyboard definition. The best part is: by doing this I found a bug: Notice how the original '0' character was mapped to the Coordinate (0,0)... thus every subsequent digit key (i.e. the first row) is off-by-one.
2020-08-10 Drop support for ServantT transformer type for serverWilliam Carroll3-16/+59
After burning a few hours wrestling with the type system, I decided to revert to the simpler `Server API` type instead of the `ServantT` transformer type. The problem is that I couldn't write a MonadError instance for `RIO Context`, which is my `AppM` (i.e. application monad). Using `throwIO` in the server handlers results in 500 errors, which is not what I wanted. I'm still pretty fuzzy about what's happening; I now know that exception handling in Haskell is pretty gnaryly. I may revisit this at a later time when my knowledge is more extensive. For now: time to fry bigger fish. An easier abstract is for me to pass `T.Context` into `server` as an argument, which after all is what a Reader does. TL;DR: - Read server, client ports from .envrc - Define a top-level Failure type (empty for now) - Define a top-level Success type - Define App as RIO Context (Either Failure Success)
2020-08-09 Prefer ServantT for server to consume App contextWilliam Carroll2-24/+33
Long story -> short: I'd like to access my App monad from within my Servant handlers. While this code type-checks, I'm not sure it's working as intended. Needing to change throwError to throwIO fails the "smell test". I expect to refactor this code, but I'm calling it a night for now.
2020-08-09 Replace Prelude with RIOWilliam Carroll7-39/+95
I believe RIO stands for: "ReaderT <something-something> IO", which is a nod to the top-level application data type: ```haskell -- This is a simplification newtype RIO env a = RIO { runRIO :: ReaderT env a () } ``` I read about RIO from an FP-Complete blog post a few months ago, and now I'm excited to try it out for a real project. Bon voyage!
2020-08-09 Move Haskell-related shell.nix code into its own shell.nixWilliam Carroll2-11/+19
I'm getting tired of: ```shell $ cd <project-root> $ nix-shell $ cd src/server $ ghci Main.hs ``` Instead: ```shell $ cd <project-root>/src/server $ ghci Main.hs ```
2020-08-09 Sketch database schemaWilliam Carroll1-0/+41
Defining a few tables in init.sql to sketch a few records that I need to persist.
2020-08-09 Initialize a default.nix for nix-buildWilliam Carroll1-0/+27
As the previous commit mentions, I'm attempting to build and deploy this project with `nix-shell` and `nix-build` instead of `cabal` and `stack`. I'm in the Hamburg airport right now, and my internet connection isn't stable enough to test this, so I'm committing it until I can more robustly test it.
2020-08-09 Add common language extensions to .ghciWilliam Carroll6-9/+5
I'd like to see if I can avoid using `cabal` and `stack` and build and deploy this application using `nix-shell` and `nix-build` only. Let's see how that goes.
2020-08-08 Consume GoogleSignIn.validateJWTWilliam Carroll4-26/+60
TL;DR: - Consume GoogleSignIn.validateJWT in the Handler for /verify - Rename validation fn to validateJWT - Prefer Text to String type
2020-08-08 Add tests for "exp" field of the JWTWilliam Carroll4-13/+61
Assert that the exp field of the JWT is "fresh".
2020-08-08 Test that the JWT's iss field meets our expectationsWilliam Carroll3-9/+42
The JWT should match "accounts.google.com" or "https://accounts.google.com". If it doesn't, we produce a validation error. TL;DR: - Group all failed stringOrURI function calls as StringOrURIParseFailure errors
2020-08-08 Test that an improperly encoded JWT returns a DecodeErrorWilliam Carroll1-0/+3
The subject of this commit message says it all.
2020-08-08 Tests valid and invalid JWTs for the "aud" fieldWilliam Carroll4-21/+87
Test that when the JWT contains the client ID for my Google app, the JWT is valid, and when it doesn't, it's invalid.
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.