- Typocide (ocaml) - https://github.com/rdavison/typocide

Typocide is a CLI based typing tutor. It solves a few problems which other typing tutors failed to provide for me. In particular it uses real world text instead of fake text (such as keybr). The corpus is derived from all the quotes available on Typeracer. It also does not follow the same rules as 10fastfingers or monkeytype's default mode of displaying words in random order. To make an analogy with music, when I practice a passage in a piece of music, I don't play the measures in a random order. Rather, I practice challenging _phrases_ of music (groups of related measures).

Next, Typocide draws inspiration from leveltype (https://github.com/christoofar/leveltype) which bans the use of the backspace key. If you make a typo, Typocide will identified the typo'd word as the focus. It will then build a test which includes the surrounding words for the current test (previous and next word), and also the surrounding words from previous tests where you have typo'd the word.

The idea is that when you make a typo, the word was a part of some context, and rather than simply practicing the word, you want to practice the word in context. A lot of typos, particularly in speedtyping, happen at word boundaries. Furthermore, by having it operate on context, it also reinforces common idioms. For example, the word "example" is very likely to be preceded by the word "for" and very unlikely to be preceded by a word like "kaleidoscope". So it makes sense to practice "For example," as a unit.

Furthermore, it has some rudimentary support for identifying words which you have typed more slowly than usual. Typocide will also generate practice tests from these slow words.

Finally, this test deliberately does not compute or report a WPM. The reason is because I want people to not feel pressured to type quickly. Rather, the pressure should come from having to do too many practice tests. The measure of success is being able to type accurately and consistently.

Sometimes the tests are not perfect, so I have added a simple escape hatch: if you press TAB on a new test, it will skip the test, and if you press TAB after you have started typing a test, it will repeat the test from the beginning.

This project is half baked for two reasons:
1. The interface is very rudimentary.
2. The code is somewhat disorganized and needs to be cleaned up.

- Keyboard layout generator (ocaml) - https://github.com/rdavison/stronglytyped

This is a keyboard layout generator with support for multiple layers and punctuation optimization. This project is half baked because I can't figure out a set of weights to make it generate great layouts (it generates decent layouts, but not any layouts which are :chefskiss:). Also, at some point I would like to move the analysis away from dealing with floating point numbers and move it towards integers.

The design is quite interesting because it uses Jane Street's Incremental library to heavily cache intermediate results. As the generator is running, it tries random swaps and then re-evaluates the score. Oftentimes a swap will affect one part of the keyboard, but not the other... for instance if you swap two keys on the left hand, then it will not affect anything on the right hand. In that case, this tool will only recompute the parts that changed instead of recomputing the entire layout.

I still haven't done any benchmarking to see if this _actually_ improves performance, or whether it just makes me feel better. :)