Commit graph

982 commits

Author SHA1 Message Date
William Carroll
6a076e8329 Expose depot and briefcase to rebuild script
At the moment, I don't think nixos-rebuild is reading $NIX_PATH, which
appropriately sets the paths for depot and briefcase. I'm going to explicitly
expose these values in the rebuild script for now.
2020-02-23 20:11:33 +00:00
William Carroll
0973ca006c Define monzo-token-server as a root systemd service
After I considered the security implications of calling
`systemctl --user cat monzo-token-server`, I realized that monzo-token-server
should be a root service instead of a user service.

This service unit now also explicitly depends on briefcase.monzo_ynab.tokens,
which is a big improvement.
2020-02-23 20:01:33 +00:00
William Carroll
a1a4689ad3 Consume updated kv module
Exposing store_path to the tokens module to support the newly updated kv
module, which requires an explicit storePath parameter.
2020-02-23 20:01:15 +00:00
William Carroll
b5d4f547d2 Prefer explicit path for kv.json
Paying off some tech debt. Instead of relying ./kv.json existing, which is
relative to the directory from which I start a program, I'm preferring that a
consumer explicitly provides this path.
2020-02-23 19:58:19 +00:00
William Carroll
3f46ac6513 Change systemd unit type: oneshot -> simple
"oneshot", according to `man systemd.service`, "will consider the unit up after
the main process exits". Since I designed token-server to run continuously, it
will not intentionally exit; therefore, systemd awaits its exit, which never
comes. "simple", on the other hand, does what I want.
2020-02-23 19:32:52 +00:00
William Carroll
f926b4d61a Expose secrets to Monzo / YNAB service
Here is my first attempt to manage secrets when I deploy onto a NixOS machine.

Background: When I develop, I use direnv, which reads an .envrc file in which I
define my secrets. My secrets are read from `pass` using a pattern like this...

```shell
secret_value="$(pass show path/to/secret)"
```

...Thus far, I've found this pattern convenient. `pass show` invokes GPG, which
asks me for a password to authenticate. This means that when I cd into a
directory with an .envrc file using this pattern, I may be prompted by GPG for a
password. When I'm not, it's because gpg-agent is still caching my
password. This works for development, but I currently do not know how to use
direnv for deployments.

Here is what I'm using until I find a more convenient solution:
- Store the secrets in /etc/secrets on socrates. Ensure that the /etc/secrets
  directory and its contents are only readable by root.
- Use systemd's Environment and NixOS's builtins.readFile to read the files in
  /etc/secrets when I can `sudo nixos-rebuild`.

Ideally I could call a function like `builtins.readFromPasswordStore` within
configuration.nix. This would allow me to skip the step where I run...

```shell
> ssh socrates
> pass show finance/monzo/client-id | sudo tee /etc/secrets/monzo-client-id
> pass show finance/monzo/client-secret | sudo tee /etc/secrets/monzo-client-secret
> # etc
```

...I don't know how to manage secrets using NixOS, but at least this is one
answer.
2020-02-23 19:32:49 +00:00
William Carroll
527b472469 Converge naming of Acer laptop to "socrates"
Prefer "socrates" to "flattop".
2020-02-22 19:04:12 +00:00
William Carroll
695de12482 Incorporate NixOS configuration
TL;DR:
- Move /etc/nixos/configuration.nix -> //nixos/configuration.nix
- Move /etc/nixos/hardware-configuration.nix -> //nixos/harware.nix
- Document installer.nix
- Create rebuild.nix wrapper around `sudo nixos-rebuild switch`

Previously I sketched ideas for the configuration.nix for socrates -- also known
as flattop -- the inexpensive Acer laptop residing in my flat and stored that
configuration.nix file in briefcase. Now, however, I have successfully installed
NixOS onto socrates. By default NixOS saves the configuration.nix and
hardware-configuration.nix files to /etc/nixos/. I'm moving both of these files
into briefcase.

Because the command `nixos-rebuild` looks for the NixOS configuration
file in /etc/nixos, I wrote rebuild.nix, which creates a program to
call `nixos-rebuild` with the new location of my configuration.nix.
2020-02-22 18:44:44 +00:00
William Carroll
b53ae61db2 Read PG's Lisp for Web-Based Applications
Read Paul Graham's notes about the benefits of building Viaweb with Lisp. I
found it interesting how his competitors (in the 90s) were using CGI scripts to
build their web applications. I wonder how much of his advice would hold true
today...
2020-02-21 19:47:54 +00:00
William Carroll
00177d2e65 Read two PG essays
- Programming Bottom-Up: Benefits of writing reusable utility functions and
  amassing a personal utility belt. Specifically how lisp makes this easier than
  most or all languages.
- This Year We Can End the Death Penalty: Voting against the death penalty is
  voting against the killing of killers *and* the killing of innocent people,
  since some estimate that 4% of people on death row are in fact innocent.
2020-02-21 12:29:28 +00:00
William Carroll
0dd3987821 Solve InterviewCake's inflight-entertainment problem
Write a predicate that tests whether two films in a list of films can exactly
fill the duration of a flight.
2020-02-21 11:30:01 +00:00
William Carroll
6895b8b1ef Track which Paul Graham essays I've read and haven't read
As I mention at the top of the org file, I cannot rely on my web browser
informing me which of these essays I've read; it only shows me which of the
links I've clicked.
2020-02-21 09:38:34 +00:00
William Carroll
1fbc80359b Support ssh/{sudo-buffer,cd-home}
- Support command to open a dired buffer with wpcarro's $HOME directory for any
  host defined in ssh/hosts.
- Support opening the current buffer with sudo privileges.
2020-02-20 23:18:59 +00:00
William Carroll
79013316a6 Support installer.nix
The command...
nix-build -A config.system.build.isoImage -I nixos-config=installer.nix nixos
...creates an .iso file in the ./result directory. You can then copy this onto a
USB and use it a custom installer...
cp ./result/iso/*-linux.iso /dev/sda

I needed an installer that used a version of the Linux kernel higher than the
one distributed on NixOS's website: 4.19.? -> 5.4.20+. My Acer laptop needed a
version of the kernel that supported its network controller: Intel 3168NGW.

TODO(wpcarro): Pin the nixpkgs git commit SHA inside of installer.nix.
2020-02-20 19:51:51 +00:00
William Carroll
01f0ebfa32 Support basic nixos/configuration.nix
I'm attempting to configure an old Acer laptop that I bought at a used
electronics store in Shepherd's Bush (~100GBP) as my server. I'd like to install
NixOS on it. The configuration.nix herein defines a starting point for the
configuration for that machine. It isn't currently working.

Troubleshooting and solutions forthcoming...
2020-02-20 19:49:15 +00:00
William Carroll
66c38f8656 Solve InterviewCake's cafe-order-checker problem
Write a predicate that tests if a given list of integers, zs, is a possible
interleaving of two other lists, xs and ys.
2020-02-20 15:20:58 +00:00
William Carroll
737bdd0a23 Solve InterviewCake's merge sorted arrays question
Write a function merging two sorted arrays into one sorted array.
2020-02-19 16:02:38 +00:00
William Carroll
00e3526d9a Support SSH config for acer machine
I'd like to setup a NixOS machine that runs in my flat to host my blog and other
projects. For now it's a slow Acer running Manjaro Linux. I'm hoping that I can
install NixOS on it remotely over SSH. But first! SSH access...

I setup port forwarding from my router to this machine for:
- HTTP
- HTTPS
- SSH
2020-02-19 15:01:42 +00:00
William Carroll
ca6bd29ed8 Solve bonus part of reverse-words
InterviewCake asks "How would you handle punctuation?". Without precise specs
about what that entails, I'm supporting sentences ending with punctuation.
2020-02-19 15:01:42 +00:00
William Carroll
acf1b8c4f0 Solve InterviewCake's reverse-words
Wrote a function to reverse the words in a list of characters. A word is a
space-delimited strings of characters.

The trick here is to first reverse the entire string and then reverse each word
individually.
2020-02-19 15:01:42 +00:00
William Carroll
9fc29831e0 Configure ssh preferences
Every Tuesday I work from Google's 6PS office instead of BEL. I work from my
laptop, which often requires that I ssh into the desktop work station in BEL. I
have settled on a locally optimal workflow that I'd like to improve. To help
seek higher ground, I'm planning on using ssh.el to configure tramp and define
utility functions to lower my cost of exploring new workflows.

- Defines a function, `ssh/desktop-cd-home` that helps me quickly open a dired
  buffer for my work station's home directory.
- Documents some variables that I set weeks ago.
- Requires ssh.el in init.el.
2020-02-18 11:18:02 +00:00
William Carroll
993f7c9389 Further configure notmuch
Until now my notmuch is usable but not almost always pleasurably so. For
example, when I reply to messages, notmuch warns that "Insert failed:"; when I
check Gmail, the reply sent... strange. After consulting with a fellow notmuch
user and Emacs disciple, tazjin@, I borrowed some of his notmuch configuration.

- notmuch is no longer warning about replies
- Replies do not include noisy email signatures
- I have an Emacs User-Agent header in my outgoing mail
- All of this and more...
2020-02-18 11:09:03 +00:00
William Carroll
6f179afd49 Define KBD for find-file-at-point (i.e. ffap)
I'm attempting to incorporate the beloved find-file-at-point function into my
workflow.
2020-02-18 11:09:03 +00:00
William Carroll
159301da50 Further specify saved searches for tags
Add tag:unread to:
- direct
- broadcast
- systems

Additionally: I added "and not tag:sent" for direct because oftentimes I send
myself mail. Without that condition, my sent mail shows up in direct.
2020-02-18 11:09:03 +00:00
William Carroll
2e63a4e2e1 Require keybindings.el after wpc-keybindings.el
keybindings.el calls (require 'evil-ex), which I introduced in this commit...
0456a1c4b4
...calling (require 'evil-ex) loads evil. When evil is loaded before
evil-want-integration is set to nil, evil-collection writes to *Warnings* when
Emacs initializes, which I find noisy. This commit ensures the
evil-want-integration is set to nil before evil is loaded, which appeases
evil-collection and thus removes the warning message.

Bonus:
If you git checkout the previous commit, and attempt to run the KBDs...
- `SPC g s`: magit-status
- `s h`: evil-window-vsplit
...from a buffer whose major-mode is dired-mode, you should notice that the
above functions won't execute.

Strangely though, if you look at this commit...
37f8ca04f2
...I fixed these issues. Well I introduced a regression when I added 0456a1c.

My current guess is that when evil-collection complains about
evil-want-integration, it is breaking the evaluation sequence of my init.el
file. wpc-dired.el is downstream from wpc-keybindings.el, which requires
evil-collection. Perhaps no modules required after wpc-keybindings.el are
evaluated after evil-collection warns about evil-want-integration. Even if that
assumption is wrong, what I do know is that this commit fixes the
evil-collection warning and restores the KBDs for dired-mode-map.

Here's to feeding two birds with one scone!
2020-02-17 22:40:41 +00:00
William Carroll
e61965cafd Drop support for compton
I'm finding myself running `pkill compton` offer. In the spirit of slimming down
my configuration, I'm dropping support for compton.
2020-02-17 21:18:03 +00:00
William Carroll
62ea675d7a Alias systemctl
Support `systemctl` and `systemctl --user`.
2020-02-16 22:09:47 +00:00
William Carroll
6051654527 Support additional notmuch saved queries
Today I setup declarative gmail filters using some Google internal tooling. I'm
now adding labels to messages from Critique, Sphinx, Ganpati, "The Daily
Insider", messages sent directly to me, and more. These labels are applied
server-side.

On the notmuch, client-side, I'm support saved queries for these newly created
gmail labels.
2020-02-16 17:16:05 +00:00
William Carroll
08c3f6dd69 Support KBDs for labelling emails
I can already tag emails with `+` and `-`. Here I'm defining KBDs for moving
messages from my inbox into: action, review, and waiting. I'm also mutually
excluding messages in action, review, and waiting from inbox and vice versa.

I'm also supporting a "muted" tag for now; I'm still learning how to use notmuch
with email threads, but I'm hoping the "muted" tag will prevent future messages
in a thread from arriving in my inbox.
2020-02-16 17:13:21 +00:00
William Carroll
1ed7f2ed73 Prefer newest-to-oldest sorting
The default sorting order of results from notmuch.el are in
oldest-to-newest. This prefers the opposite.
2020-02-14 18:01:38 +00:00
William Carroll
a726bf737a Enable lieer-google.timer
After running `systemctl --user enable lieer-google.timer`, systemctl created a
symlink pointing from timers.target.wants -> ../lieer-google.timer. I'm not sure
if tracking symlinks in a git repository is such a useful idea.

This commit reminds me that I could and should be using Nix to better manage
symlink creation and destruction.
2020-02-14 15:43:37 +00:00
William Carroll
0456a1c4b4 Define notmuch KBDs
Until I have more opinions about my workflow with notmuch, I will redefine the
KBDs from Gmail that I'm comfortable with. While not many KBDs are defined here,
evil-collection defines dozens, many of which I find reasonable; those that I
disagree with, I've unbound in this commit.

Composing emails in notmuch feels similar to writing a commit message with
magit. I want to be able to type :x or :wq, but these commands don't DWIM. For
magit, I'd like that behavior to be the same as `C-c C-c`; not surprisingly, for
notmuch, I'd like the same.

I've bound :x to do this for notmuch. I'd like to define a macro that can easily
define buffer-local evil-ex commands for particular modes. This should lower the
cost of defining evil-ex commands and hopefully convince me to support some of
this desired behavior.
2020-02-14 15:38:28 +00:00
William Carroll
8105af7b8d Configure saved searches for notmuch
Mimmicking the "action", "review", and "waiting" labels that I had in Gmail
using the equivalent labels as tags in notmuch.
2020-02-14 15:38:05 +00:00
William Carroll
fa779ab7bf Support list/xs-distinct-by?
Supporting a predicate to check that all elements in a list are distinct after
applying a transformation function to them.
2020-02-14 15:34:56 +00:00
William Carroll
3677a7a39e Begin supporting notmuch in Emacs
I'm borrowing from @tazjin's dotfiles, which are stored in Git on Borg. When you
call `nix-build ~/briefcase/mail`, result will output a systemd units, which you
should move to ~/.config/systemd/user/.

The path to `gmi`, which is Lieer's executable, exists in /nix/store, and you
can read it from the systemd unit file (i.e. lieer-google.service). Lieer
synchronizes notmuch with Gmail and Gmail with notmuch.

Here's a general sequence of commands that I ran to set everything up. Special
thank you to @tazjin for helping me with all of this. These steps are not
certified as a tutorial; I'm recalling them from memory. When I set this up
things didn't work as expected immediately and I had to troubleshoot.

```shell
> mkdir -p ~/mail/account.google
> cd ~/mail/account.google
> nix-env -iA nixpkgs.notmuch
> notmuch setup
> nix-build ~/briefcase/mail
> cp ./result/lieer-google.{service,timer} ~/.config/systemd/user
> rm ./result
> systemctl --user cat lieer-google
...copy the /nix/store path to gmi...
> notmuch new
> /nix/store/gmi init
...follow the OAuth login flow...
>
```

Unknowns?
- Do I need to call `systemctl --user start lieer-google` at startup? Or should
  I move these units to user/default.target.wants?
- Can I send email from notmuch?
- How do I use notmuch to delete email? To respond to emails? To do anything?

Todo:
- Once this configuration stabilizes, I should package everything with Nix.
2020-02-13 18:32:26 +00:00
William Carroll
9fa97eab67 Solve merging-ranges
Write a function to merge meeting times. Added an in-place solution, which the
"Bonus" section suggested attempting to solve.

- Added some simple benchmarks to test the performance differences between the
  in-place and not-in-place variants. To my surprise, the in-place solution was
  consistently slower than the not-in-place solution.
2020-02-13 14:52:20 +00:00
William Carroll
1f19080c7c Prefer alias to abbr
After working with fish for a few weeks, I've decided that I prefer aliases to
abbreviations.

Why? When I reverse search through my command history, I search for the
what I typed and not what it expanded to. Some of my aliases wrap existing
tools encoding my preference for tool A if tool B isn't available. For example I
alias vim to neovim. When nvim isn't available on $PATH, typing vim will
expand to nvim, which will in turn fail.
2020-02-12 18:08:31 +00:00
William Carroll
1a484b4b91 Disable auto pairing parens, brackets, quotes
I don't see much value in this tool for my workflow.
2020-02-12 18:07:31 +00:00
William Carroll
072be0befd Nixify simple_vim idea
I previously had an alias defined as `simple_vim`, which would start an instance
of Vim with a bare bones config. I had a to-do to Nixify it. That is
now (mostly) to-done.

When I try and install it with `nix-env -f ~/briefcase -iA tools.simple_vim`,
Nix fails and says that pkgs.stdenv is undefined. I will need to fix this one
day, but it is neither important nor urgent...
2020-02-12 18:05:32 +00:00
William Carroll
fc8283ff6e Define briefcase alias to cd into my monorepo
Defining an alias in my config.fish makes me realize that I should prune many of
my abbreviations and change the ones that remain into aliases.
2020-02-12 17:01:12 +00:00
William Carroll
fabf1c9334 Tidy up structure of briefcase
I had a spare fifteen minutes and decided that I should tidy up my
monorepo. The work of tidying up is not finished; this is a small step in the
right direction.

TL;DR
- Created a tools directory
- Created a scratch directory (see README.md for more information)
- Added README.md to third_party
- Renamed delete_dotfile_symlinks -> symlinkManager
- Packaged symlinkManager as an executable symlink-mgr using buildGo
2020-02-12 16:58:29 +00:00
William Carroll
5ec5a6da8c Complete InterviewCake reverse-string-in-place
Wrote a function in TypeScript to reverse an array of characters mutatively.
2020-02-12 15:53:21 +00:00
William Carroll
e1427dd8b1 Move matrix-traversals -> ./misc
I'd like the top-level files in deepmind/part_two to correspond 1:1 with the
TODOs in my org file tracking the work.
2020-02-11 17:11:24 +00:00
William Carroll
85cdd46f00 Attempt to support TypeScript for coding challenges
I was a bit weaker than I expected to be in my most recent interview using
TypeScript. To improve, I think I'd like to attempt solving some of the
InterviewCake.com questions using TypeScript.

If you've read the previous commits, the inspiration for `run` arose because I
need to call `npx ts-code <file>`, which is easy enough to remember, but I'd
still rather just call `run <file>`.
2020-02-11 17:11:19 +00:00
William Carroll
3afb56a5e5 Begin supporting run
I'd like to be able to just call `run file.py` and have a program DWIM. I'm
working on run as a step in this direction. Define a simple configuration that
maps file extensions to template strings where "$file" is replaced with the
argv[1].

It basically works but there are outstanding TODOs. See the README and source
code for more information.
2020-02-11 17:11:19 +00:00
William Carroll
a50153c141 Support utils.Resolve/2
Supporting a function that resolves a file name checking for the nearest
occurrence of the file from the CWD until it traverses beyond the user's home
directory, after which point it checks in backupPaths.
2020-02-11 17:11:19 +00:00
William Carroll
b3b343ebf9 Support utils.FileExists/1
Support predicate for checking if a file exists on disk.
2020-02-11 17:11:19 +00:00
William Carroll
3ae3b6f039 Support utils.HomeDir/0
Support function for returning the home directory of the current user.
2020-02-11 17:11:19 +00:00
William Carroll
825d6f2c65 Encode InterviewCake.com questions as an org-mode list
This way I can track what I've done and what I need to do.
2020-02-11 17:11:19 +00:00
William Carroll
d81f31107d Support cycling through display configurations
Today when I opened my laptop, I wasn't sure if it was powered off or on because
the display was blank. Thankfully the volume was muted and the LED indicator was
on, which informed me that the laptop was powered on. This saved me from
unnecessarily rebooting.

What happened was that last night I was working from home and using my external
monitor. Usually I enable my external display and disable my laptop display. But
when I left for work this morning, I unplugged the HDMI cable from my laptop
without disabling the external display or enabling the laptop display.

I noticed a XF86 button on my laptop entitled XF86Display. I figured that this
could be a nice place to bind a key to toggle my laptop display on or off. At
the last minute, I had the idea to just cycle through all possible display
configurations that I use; there are only three anyways. When dealing with more
than two states, I realized I should use a cycle to model the configuration
states. Now I'm thinking that I should be using cycles to model toggles as well
- instead of just using a top-level variable that I `setq` over. I haven't
refactored existing toggles to be cycles, but I am excited about this new
keybinding.

This commit additionally:
- Moves keybindings out of display.el and into keybindings.el
- Conditionally sets KBDs if using work laptop
2020-02-11 13:56:10 +00:00