No description
Find a file
William Carroll ea5db41722 Read Paul Graham's "Being Popular" essay
Maybe this is my recency bias writing, but "Being Popular" may be one of my
favorite Paul Graham essays that I've read.

"Being Popular" outlines Paul Graham's ideas about what an ideal programming
language would look like. This essay took me 1-2 hours to read, but it was worth
the time.

Here are some quotes that I enjoyed (not sorted in any meaningful order):

"A friend of mine rarely does anything the first time someone asks him. He knows
that people sometimes ask for things that they turn out not to want. To avoid
wasting his time, he waits till the third or fourth time he's asked to do
something; by then, whoever's asking him may be fairly annoyed, but at least
they probably really do want whatever they're asking for."

"In this particular case there is a way to finesse our way out of the
problem. If we treat data structures as if they were functions on indexes, we
could write (a x y) instead, which is even shorter than the Perl form. Similar
tricks may shorten other types of expressions."

"The latest hot language, Python, is a watered-down Lisp with infix syntax and
no macros."

"Hackers would think a lot more highly of Lisp if Common Lisp had powerful
string libraries and good OS support."

"I think language designers would do better to consider their target user to be
a genius who will need to do things they never anticipated, rather than a
bumbler who needs to be protected from himself."

Some take-aways:
- Let's refer to Python as "Diet Lisp" from now until the end of time.
- Fight to keep your user-base small for as long as you can. Only fools want
  large user bases.
- Rich Hickey definitely read this article; he took some ideas with him; he left
  some ideas behind.
- Focus language design efforts around defining rich standard libraries,
  especially for string manipulation.
- Worry little about supporting backwards compatibility; design a language that
  can and is often rewritten.
- Shift the burden of optimizing code performance to the user by designing a
  powerful runtime profiler that is tightly integrated into the language
  runtime.
- Minimize the costs users face when experimenting: ensure that your language is
  interactive; ensure users can create REPLs quickly.
- Support OS-level libraries (think about Go).
- Maximize introspection and hackability.

What a useful read!
2020-03-01 22:32:24 +00:00
advent-of-code Splice ./universe directory into ./ 2020-01-29 14:43:20 +00:00
blog Remove default values for Nix expression parameters 2020-03-01 22:32:24 +00:00
clojure Remove default values for Nix expression parameters 2020-03-01 22:32:24 +00:00
configs Converge naming of Acer laptop to "socrates" 2020-02-22 19:04:12 +00:00
deploy Rename docker -> deploy 2020-01-31 16:29:22 +00:00
emacs Remove default values for Nix expression parameters 2020-03-01 22:32:24 +00:00
fish Remove default values for Nix expression parameters 2020-03-01 22:32:24 +00:00
go Remove default values for Nix expression parameters 2020-03-01 22:32:24 +00:00
gopkgs Remove default values for Nix expression parameters 2020-03-01 22:32:24 +00:00
haskell-file Splice ./universe directory into ./ 2020-01-29 14:43:20 +00:00
java Splice ./universe directory into ./ 2020-01-29 14:43:20 +00:00
lisp Remove default values for Nix expression parameters 2020-03-01 22:32:24 +00:00
mail Remove default values for Nix expression parameters 2020-03-01 22:32:24 +00:00
monzo_ynab Remove default values for Nix expression parameters 2020-03-01 22:32:24 +00:00
nixos Nest configuration beneath socrates directory 2020-03-01 22:32:24 +00:00
org Read Paul Graham's "Being Popular" essay 2020-03-01 22:32:24 +00:00
scratch Solve InterviewCake permutation-palindrome problem 2020-03-01 22:32:24 +00:00
third_party Remove default values for Nix expression parameters 2020-03-01 22:32:24 +00:00
tools Remove default values for Nix expression parameters 2020-03-01 22:32:24 +00:00
travel_hitlist Sort items in travel_hitlist 2020-02-10 11:57:18 +00:00
.envrc Support lorri 2020-02-07 11:01:24 +00:00
.gitignore Attempt to support TypeScript for coding challenges 2020-02-11 17:11:19 +00:00
default.nix Add nixos as top-level monorepo package 2020-03-01 22:32:24 +00:00
elisp-conventions.md Massive configuration overhaul 2019-12-24 15:21:34 +00:00
keybindings.md Massive configuration overhaul 2019-12-24 15:21:34 +00:00
Makefile Rename dotfiles -> briefcase 2020-01-31 15:27:48 +00:00
README.md Rename dotfiles -> briefcase 2020-01-31 15:27:48 +00:00
shell.nix Remove default values for Nix expression parameters 2020-03-01 22:32:24 +00:00
snippets.md Massive configuration overhaul 2019-12-24 15:21:34 +00:00
utils.nix Move move .emacs.d out of configs/shared 2020-01-30 16:00:29 +00:00

briefcase

Welcome to my briefcase: my monorepo.

I'm attempting to amass a collection of packages that span a variety of languages while minimizing the costs of sharing the code. This also includes configuration for things like emacs, tmux, ssh, and other tools.

Installation (Deprecated)

The installation instructions here are deprecated. I'd like to manage packaging and installing with Nix, but that is only partially supported at the moment.

wpgtk and gvcci

$ apti python-pip3
$ gclone deviantfero/wpgtk
$ cd ..
$ gclone FabriceCastel/gvcci
  • TODO: Integrate Emacs themes into wpgtk.
  • TODO: Integrate Vim themes into wpgtk.
  • TODO: add these to the install script
$ ln -s ~/Dropbox/.password-store ~/.password-store
$ ln -s ~/Dropbox/bin ~/bin
$ import_gpg $DOTFILES/configs/shared/gpg/.gnupg/exported
  1. Clipmenu

Clipmenu is a service to store a history of copied strings.

Install it as:

$ cd ~/programming && g clone cdown/clipmenu
  • TODO: Include ~/.config/systemd/user in configs/shared.
  • TODO: Obviate installation.

Ensure that it runs on startup:

$ cd ~/programming/clipmenu
$ cp clipmenu clipmenud clipdel ~/bin # You may not need to do this step.
$ vim init/clipmenud.service
# Change the ExecStart line to point to ~/bin/clipmenud
$ cp init/clipmenud.service ~/.config/systemd/user/clipmenud.service
$ systemctl --user start clipmenud
$ systemctl --user enable clipmenud # This step may be optional.
$ reboot
$ systemctl --user status clipmenud # Verify installation worked.
  1. Install Dropbox
$ cd ~ && wget -O - "https://www.dropbox.com/download?plat=lnx.x86_64" | tar xzf -
$ crontab -e # add the following line...
@reboot ~/.dropbox-dist/dropboxd 2>&1 >/tmp/dropbox.log
$ reboot            # 1/3 verify installation
$ pgrep dropbox     # 2/3 verify installation
$ dropbox.py status # 3/3 verify installation
  1. Authorize computer to access GitHub
$ ssh-keygen -t rsa -b 4096 -C 'wpcarro@gmail.com'
$ eval $(ssh-agent -s)
$ ssh-add ~/.ssh/id_rsa
$ xclip -sel clip <~/.ssh/id_rsa.pub
$ browse github.com # paste ssh public key in settings
  1. Install Vundle, nix-env
$ ln -s ~/Dropbox/Vundle.vim ~/.config/nvim/bundle/Vundle.vim
$ cat ~/Dropbox/install_nix.sh | sh
$ for p in $(cat nix-env.txt); do
>   nix-env -i "$p"
> done
  1. Install dotfiles
  • TODO: include steps 2-4 in the make install command.

Missing the following dependencies:

  • stow
  • neovim
  • bat
  • exa
  • fasd
  • opam
  • ghcup
  • ripgrep
  • fzf
  • fd
  • hub
  • pass
$ cd ~/Dropbox/dotfiles
$ DOTFILES="$(pwd)" make install
  1. Install Node dependencies

For now, this deserves its own section since it isn't automated.

$ gclone tj/n       # clone repo
$ sudo make install # build from source
$ n stable          # install the stable version of node
  • TODO: support dependencies like terminal themes

SSHFS

TODO: add explanation about unison, rsync, etc.

SSHFS enables seamless file transfers from your local machine to a remote machine.

Usage

Assuming your remote machine is configured in your ~/.ssh/config (see above), you can mount your remote machine's home directory on your local machine like so:

$ mkdir ~/ec2
$ sshfs ec2:/home/ubuntu ~/ec2 -o reconnect,follow_symlinks

Now your remote machine's home directory can be accessed using the ~/ec2 directory. This directory can be treated as if it were an ordinary local directory. To illustrate how easy it is to use, let's install Vundle onto our remote machine.

$ git clone https://github.com/VundleVim/Vundle.vim.git ~/ec2/.vim/bundle/Vundle.vim

Voila! We now have Vundle installed on our ec2 instance without needing to manually SSH into that machine.

GnuPG

To install GPG run the following:

$ import_gpg

TODO: create a job that runs this periodically.

$ export_gpg

Reference

- sec: secret key
- pub: public key
- ssb: secret sub-key
- sub: public sub-key

Terminals and Fonts

Any terminal or font I choose should pass the following checks:

$ test_true_color
$ test_16_colors
$ test_text_formatting
$ test_unicode
$ test_emojis

Ligatures

If using a font with ligature (e.g. Hasklig) assert that your terminal also support ligatures.