about summary refs log tree commit diff
AgeCommit message (Collapse)AuthorFilesLines
2020-08-20 Create an assessment directoryWilliam Carroll10-0/+359
I've been doing a few take-home assessment recently, all of which I've attempted to solve using Haskell. I'm having a good time, and I'm noticing strong and weak points with my Haskell programming. I always attempt to apply any feedback a reviewer gives me, and I'm storing my first drafts, second attempts, and feedback here for now. This recently attempt was for a role at Jane Street.
2020-08-20 List directories first in dired viewWilliam Carroll1-0/+1
Ideally I'd use exa insted of ls, but I cannot seem to support that yet.
2020-08-20 Restore shell.nixWilliam Carroll1-0/+10
I believe `use_nix` looks for shell.nix and then default.nix files, so I was wrong earlier when I said that I could get rid of shell.nix files altogether. I need to learn more about `use_nix` and getting environments from default.nix files.
2020-08-20 Drop support for wpc/find-fileWilliam Carroll2-9/+1
Cleaning things up...
2020-08-20 Prefer direnv's use_nix to shell.nixWilliam Carroll2-10/+1
I find it bothersome to share the list of Haskell dependencies between my default.nix and shell.nix files. A few days ago, I created a THIRD file, shared.nix, that defined the shared code b/w default.nix and shell.nix. This DRY'd things up, but it also added a new file, which I didn't like. Today I learned that direnv integrates with Nix using a function called `use_nix`. Voila! I typically already have .envrc files per-project, so this doesn't add any unnecessary files, and it allows me to delete my shell.nix files. I would use `lorri`, except that I encountered issues using Lorri on my work computer, which I'm not interested in attempting to resolve now.
2020-08-20 Change GET /mimi to GET /helloWilliam Carroll1-4/+8
Timing myself to see how long it takes me to publish a change.
2020-08-20 Define the monoserver as a systemd serviceWilliam Carroll1-0/+10
Much better than manually running: ```shell $ cd ~/briefcase && git pull --rebase origin master $ nix-rebuild switch $ nix-build -A zoo $ pkill zoo $ ./result/zoo & $ job -l $ disown %<job-number> ```
2020-08-20 Add GET /mimi to zooWilliam Carroll1-1/+5
Proving to my girlfriend that the zoo works.
2020-08-20 Add host field for nginx JSON logsWilliam Carroll1-0/+1
I'd like to filter logs from {blog,git,zoo}.wpcarro.dev, etc.
2020-08-20 Remove logging prefix from Nginx logsWilliam Carroll1-9/+10
Problem: The JSON that Nginx outputs cannot be successfully parsed by journaldriver because Nginx prefixes it with "socrates nginx:". Adding `nohostname` to `access_log` should solve this problem. I borrow this from @tazjin's most recent definition of `commonHttpConfig`.
2020-08-20 Use journaldriver to view journald logs from SocratesWilliam Carroll1-0/+7
Attempting to use @tazjin's delightful simple logging library!
2020-08-20 Disabling the monzo-token-serverWilliam Carroll1-21/+19
I haven't used this since I wrote it... and now the .tokens attribute is missing and it's screwing up my other deployment... *sigh*
2020-08-20 Forward zoo.wpcarro.dev connections to :8000William Carroll2-0/+8
Right now the 8000 port is hard-coded into the zoo server, which isn't ideal, but "it works" (TM).
2020-08-20 Move shift-time into top-level //zooWilliam Carroll5-23/+30
I'm still unsure whether or not this is a good idea, but experimenting is a good way to find out!
2020-08-20 Support parsing and shifting timeWilliam Carroll4-20/+130
TL;DR: - Adds string-conversions library - Adds tests for remaining units and repeating requests - Adds a REPL in main
2020-08-20 Support parsing second shiftsWilliam Carroll5-0/+125
Parse inputs like -10s into 10 second shifts back in time.
2020-08-20 Support POST /create-payment-intentWilliam Carroll7-5/+118
Interact with Stripe's payment_intents API endpoint. I'm not committing the index.html that contains client-side code that interacts with the /create-payment-intent endpoint, but it contains sensitive information, so I'm omitting it for now. TL;DR: - Define POST /create-payment-intent endpoint - Include envStripeAPIKey in Context record - Define a top-level Stripe module for making API calls - Define types and instances that align with Stripes request and response types - Depend on the Req library: a higher-level library than http-client
2020-08-13 Prefer project.el to projectileWilliam Carroll2-1/+42
Today @tazjin told me about Emacs's built-in project.el library, which he recommended that I extend to support monorepo-specific tooling. It worked like a charm! Now when I press "<leader>f", it will resolve to either the nearest file named default.nix or directory name .git.
2020-08-13 Set Emacs current-project to ~/briefcaseWilliam Carroll1-1/+1
I don't rely on this often, so it's best to leave it as the top-level directory for briefcase.
2020-08-13 Document ghcExtensions argumentWilliam Carroll1-3/+3
Missed documenting this the first time...
2020-08-12 Consume buildHaskell functionsWilliam Carroll3-57/+45
Use the newly defined `buildHaskell` function for a few of my existing Haskell projects. So far, it works as intended!
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!