**This page has moved to http://jonathanchu.is. You will be redirected there shortly.
I've tried out a number of keyboards in the past year in an attempt to move away from my beloved, but aging, Microsoft Natural Ergonomic Keyboard 4000 and wanted to put my reviews of them up for anyone looking for an overview of the ones I tried. A few years back, I developed a small case of carpal tunnel and knew I had to change some of my habits before it got worse - these kind of problems don't go away on their own! At the time, I was using a second generation Apple wireless keyboard with those chiclet-style keys. I loved it and used it for a few years before the pain started up, and then I had to give it up as it wasn't the most ergonomic keyboard out there. A friend of mine recommended to try the Microsoft Natural Ergonomic Keyboard 4000 and after reading a quick review online, I purchased one. It took a few hours of getting used to it, but I quickly fell in love with it. The keyboard itself is not eye candy by any means, but it got the job done and best yet, it helped ease the pain in my wrists with the more "natural" positioning of the hands. With its split keyboard layout, cushioned wrist rests built right into it, and a nominal price tag, this easily become my main keyboard. Here's my quick breakdown of the MS Natural 4000:
Microsoft Natural Ergonomic Keyboard 4000 (*stock photo)
- Comfortable wrist rests
- Generally sane layout, number pad, and function keys - although I don't use many of them in daily use
- One of the lower priced keyboards out there
- Lack of good key switches
- Not form factor - it's a big keyboard and takes up more room than your standard keyboard with the wrist rests
The next keyboard I tried out was a Das Ultimate S and it was my first experience with a keyboard that had real switches. I got mine with MX Blue switches and they lived up to the hype - man, were they loud! You got a really satisfying feeling when hitting each key and the tactile feel really made for a good combo. In the end, I ended up parting ways with it as it was a bit too loud for my wife since we lived in a one bedroom apartment together in NYC and the clickity-clack would interrupt her shows.
Das Ultimate S (*stock photo)
- MX Blue switches, although I saw you can get in MX Brown now (a little quieter) from their website
- Hard to keep clean with glossy polished surface. I found this quite annoying actually, especially with two cats, it made the keyboard look dirty and it smudged easily.
The next keyboard on my list was the Kinesis Maxim. I've heard good things about Kinesis from other developers and decided to give them a try. I opted for the Maxim as it was one that was closest to the Microsoft 4000 I was used to using, with a split keyboard layout. I ended up not liking it for one particular reason - the alt key on the left side was smaller than a normal keyboard's, which made hitting it (Command key for you Mac guys) a bit difficult. As an Emacs user, I found this even more annoying as this led to lots of simple errors.
Kinesis Maxim (*stock photo)
- Adjustable split keyboard layout
- Comfortable wrist rests with sticker pads included - comparable to the Microsoft 4000 on comfort level
- Decent key switches
- Adjustable split gears seemed a bit wonky
- Did not like the layout for the control and alt keys
- PGUP/PGDOWN, Windows key is in a new column on left side, wtf?!
- Alt key on left side is smaller than normal, the layout for command and option key was very small compared to normal alt and Windows key
Microsoft came out with a new ergonomic keyboard recently I was pretty excited to give it a try, being how much I liked their previous ergonomic keyboard. The Microsoft Sculpt Ergonomic came out with a bit higher price tag than the MS 4000, a little more than 2x the cost to be accurate, but I still gave it a shot. It felt pretty natural to me for the split layout and they added a few other things to make it more "up-to-date".
- Split keyboard layout
- Comfortable wrist rests
- Layout very similar to 4000 with small improvements
- Magnetic battery hinge, which was a nice little touch
- Separate number pad so you can use it or not, making the keyboard more form factor
- Didn't like the chiclet-style keys
- They don't sell the keyboard separately (as of this writing), so it comes with the mouse too, and the mouse isn't that great
I used the Sculpt for quite a few months, until I started to miss real switches, thus prompted my keyboard switch yet again. This time I went back to a familiar brand, Kinesis, but tried the Advantage series at recommendation from one of my friends, Wraithan. It was definitely a unique keyboard with a hefty price tag. Unfortunately, it didn't last more than a week in my possession as I found the learning curve a bit too much to overcome. I'm not a super fast typer, but my speeds range in the 70-80 WPM range with a regular layout keyboard. Using the Advantage, I was down to 30-40 WPM with about 1-2 errors.
- Split keyboard
- All crucial and most used keys moved to thumb, your strongest finger, to reduce fatigue
- Big learning curve, the shape and slope of keys slowed me down (show typing tests?)
- I found switching back to a regular keyboard layout (like your laptop's internal keyboard) was getting difficult. As mobile worker, it's important to work anywhere and having this become an issue was a big one for me
- It's a big and heavy keyboard, even for my tastes, so this is not a good choice if you're limited on desk space
Finally, this brought me to try out the Happy Hacking Professional 2. What I liked most about this was that the control key was already mapped to the caps lock, which is something I always re-map on a keyboard I use anyway.
- Topre key switches
- Small form factor
- Control key already where I would normally map it
- Hated where the delete key is
- Also hated where the function key is, didn't seem logical if you had to press the function to use any function keys.
In the end, it's a great keyboard all around, but the delete key placement didn't jive with me and is the only reason I am not using this keyboard as my main. Overall, I think I will use this when I travel because of it's small, compact size, but not as my main keyboard. This inevitably brought me to the Realforce 104U keyboard. This is the current one I'm using today and I am loving it. The lack of a split keyboard layout is not something I'm looking for anymore as I learned to help my wrist pains over the years (stretches before day begins, once at lunchtime, and small breaks on the hour to shake out hands.)
- Variable weighted keys is the biggest win for me. 45g for inner keys, 35g on outside pic
- It is a solid keyboard - makes me feel safe if I ever have to fight off any bad guys with this keyboard (wanted-keyboard.gif)
- Traditional look - almost like an old IBM keyboard, so definitely no learing curve here
- Topre key switches, which are not as loud and tactile feeling as cherry swtiches, but somewhere in-between which I'm starting to like
- The lower weighted keys on the outside aaaaaare more prone to typpppppppppos if you're one that rests your fingers on the home row like me sometimes ;)
After trying all these keyboards, and consequently going through the return process for most of them, I can happily recommend the Realforce 104U to anyone looking for a professional keyboard with good switches. The variable weighted keys helps me not fatigue as much since the weaker fingers have 35g, stronger fingers have 45g. It's the closest keyboard to a traditional look-and-feel of an old-school IBM keyboard, with no learning curve, but a higher price tag for what you would expect a high-end keyboard. If you don't have the space for a full-sized keyboard, I would recommend a Happy Hacking Professional 2.
With Django 1.5, one of the biggest changes introduced was the ability to configure the user model. Anyone who has coded a Django app with a business requirement of adding a birthday field, an arbitrary checkbox to the user registration fields, or even making the signup process email-only with no usernames, knows the awkward feeling of implementing their own custom user and feeling a little less Django-esque when all is said and done. This configurable user model change alone was enough for me to 1) upgrade all my Django sites to 1.5 and to 2) swap out my customer user code for the way it should be done now with the configurable user model.
The Django docs are fantastic. It is one of the most comprehensive and, most important, user-friendly documentations out there for programmers of all skill levels. I highly encourage you to read through the docs first on customizing the user model, but isn't required to understand this walk-through.
If you're anything like me, you sometimes like to skim or even skip the docs altogether, and turn to Google to try and find a solid example online. I found a few, but none of them really seemed to show me a full example of configuring the user model. As a result, I decided to write my own and put it all together in an example Django project to show how I handled the custom user model. Here is the link to the repo on Github.
This is going to be a brief walk-through in running this example codebase. It is opinionated, but (hopefully!) easily understood - so this would enable you to modify this example codebase slightly to fit your business requirements.
Also, this custom user example is inspired from Dr. Russell Keith-Magee's great talk at DjangoCon US 2013 titled "Red User, Blue User, MyUser, auth.User" and should serve as a good example for how you can change the core fields of auth.User.
Please note - this walk-through will assume you have pip and virtualenv installed locally, as we'll be using that to create the environment for the example Django project.
First, clone the example custom user project and change directory into it:
$ git clone https://github.com/jonathanchu/django-custom-user-example.git $ cd django-custom-user-example
Then, create your virtual environment. We'll only be installing Django (v1.5.4):
$ mkvirtualenv customuser (customuser) $ pip install django
After Django is installed, let's run
syncdb to create our test DB and first superuser. This is configured out-of-the-box to use SQLite3 for simplicity, but feel free to change to whatever database backend you feel more comfortable with. Create your superuser now and follow the prompts:
(customuser) $ python manage.py syncdb ... ::Follow prompts to create a superuser::
Then we can run
runserver to checkout how the custom users in the admin looks:
(customuser) $ python manage.py runserver
And open up your browser to http://127.0.0.1:8000/admin and log in with the superuser you just created. Under "Accounts", you will see our custom "Users" there. Try it out, take it for a spin, create additional users from the admin, change passwords, etc. This all works nicely with our custom user model!
Hopefully this is helpful to some out there looking for a solid example on customizing the User model. Any issues with the codebase, please use the repo's issues tracker on Github. Happy hacking!
I've been a big fan of Notational Velocity for quite a few years now - and more recently, nValt which is a popular fork of Notational Velocity, but with a bit more features. Everyone has their own process when it comes to taking notes, and to each his own, but the one thing that really turned me on to Notational Velocity/nValt is the simplicity and unstructured process of taking and searching for notes. Coupled with Dropbox for seamless syncing, you have yourself a great note taking process that was easy to use and even easier to search. As for mobile, I used Simplenote to view my notes via Dropbox, and it made taking notes during programming meetups or business meetings even easier. Life is good!
However, over the past year, as I found myself coding more and more in my text editor of choice, Emacs - the more I found myself wanting something that didn't seem so disconnected from where I do most of my prose and coding. After a quick search, I found Jason Blevins' great little creation called Deft. To sum it up, Deft is an open source mode for Emacs to view, record, and search for notes in plain text, very much like Notational Velocity/nValt. I highly encourage you to check out Jason's project page for Deft. After trying out Deft, it made me want to switch 100% over to org-mode notes as I really only used org-mode for sporadic notes. Now, I have the power of org-mode with Emacs in a Notational Velocity-like buffer with Deft. The rest of the article will be outlining how I set it up in my Emacs config.
Setting up Deft
First, go grab deft.el and make sure it is available in your Emacs config (i.e. - ~/.emacs/vendor/deft.el path). You can grab it here or get it directly from my Emacs config, which is the original unmodified file.
deft.el is on your Emacs load path, you'll need to tell Emacs to use Deft. Put the following anywhere in your config (I like to keep
modes separated in it's own
modes.el file that gets loaded on initialization):
Since I use Org-Mode, I want
*.org files to be recognized by the Deft buffer, so let's set the
deft-extension to "org". I believe the default file type that Deft will look for is "txt", so omit this part or add in "txt" if you want to use plain text files.
(setq deft-extension "org")
And again, since I'm using org-mode with Deft, let's set the
deft-text-mode appropriately to use org-mode:
(setq deft-text-mode 'org-mode)
Next, we need to tell Deft where to find all of my current org-mode files. In my case, I like to keep all my org-mode files in Dropbox, so that path would be
~/Dropbox/org for me. You should change this path to wherever you keep your files.
(setq deft-directory "~/Dropbox/org")
Finally, the last bit of customization is to tell Deft to use the filename as a title. By default, Deft will use the first line of the file as the filename. In my note taking preference, I normally don't lead off a note with the title of the file (it's usually a date like "2013-08-15" if it's a meeting), so I switched on the trigger for this:
(setq deft-use-filename-as-title t)
Putting it all together, and you have this in its entirety:
;; deft (require 'deft) (setq deft-extension "org") (setq deft-directory "~/Dropbox/org") (setq deft-text-mode 'org-mode) (setq deft-use-filename-as-title t)
To enter the Deft buffer, simply do:
m-x deft ENTER
And you should see the Deft buffer like so, with all of your org-files (yes, I know - nothing is blurred out...I got nothing to hide :P ):
Start typing and you'll see the list of notes filter out the results that do not match, just like Notational Velocity. Hit ENTER to open the note in a new buffer.
And there you have it! Much appreciation and thanks goes to Jason Blevins for this awesome mode that has effectively streamlined my coding and note-taking all in Emacs!
Throughout the years, I've flipped back and forth between Org-Mode and applications such as Drafts (iOS), Evernote, Simplenote, and even plain ol' text files (with the Notational Velocity and nValt) for my most basic note-taking needs; however, I've always found myself coming back to Org-Mode in the end for another spin around the block. The one positive thing that kept me coming back to Org-Mode, and perhaps the same thing that Emacs is often criticized for, is the fact that it has a lot of functionality under the hood - almost too much. Org-Mode is a very feature-rich application. For my basic needs, I use Org-Mode primiarly for three things:
- Basic note-taking and outlines
- TODO lists
- Tracking and clocking time
Here Comes MobileOrg
When I first learned about MobileOrg, I was really stoked that I would be able to record notes, update TODO statuses, and even just view my org files on the go. Unfortunatley, I found that the basic setup instructions on their website left a few minor things out for someone new to MobileOrg, and this is my attempt to supplement that to help others with the same issues I faced with setup.
First off, it should be noted that I'm using Emacs 24 with Org-Mode already baked in. If you're using an earlier version of Emacs that doesn't have Org-Mode by default, please install it according to your own preference (which we won't get into here since there are a few different ways to install Org-Mode).
My root directory for all of my org files is kept in Dropbox in a directory called
I've found that this setup fits my workflow best since I also work off a second laptop at times and would like all my org files to be synced across all machines with as little effort as possible.
Next, install MobileOrg from the App Store. I chose the path of least resistance and decided to use Dropbox as the source for server config, so when you first open the application, click on the Dropbox option, click to link account, and allow authentication with Dropbox to proceed. It should have created a new directory for you under:
Emacs Configuration for MobileOrg
You will need a few more lines of code to get this all working with your local org files and MobileOrg. This is my basic config based on the two main directories above that will need to go in your Emacs config:
;; mobileorg settings (setq org-directory "~/Dropbox/org") (setq org-mobile-inbox-for-pull "~/Dropbox/org/inbox.org") (setq org-mobile-directory "~/Dropbox/Apps/MobileOrg") (setq org-mobile-files '("~/Dropbox/org"))
Finally, from within Emacs - edit any org file located in
~/Dropbox/org/ and save those changes. Then send these changes to MobileOrg to sync up:
With any luck, you should be able to go back to MobileOrg on your mobile device and click the refresh button to see your org file(s) all there.
Recently, I updated all of the packages I have installed via Homebrew and ran into some issues with the PostgreSQL package. I was getting this error:
The data directory was initialized by PostgreSQL version 9.0, which is not compatible with this version 9.1.4
A quick search took me to this page, however the docs left a lot to be desired to say the least. Here's a step-by-step to how I eventually fixed it using pg_upgrade.
First, change directories to your Postgres data directory.
$ cd /usr/local/var
Next, create a new directory for the new data directory.
$ mkdir postgres9
initdb to initialize the new Postgres cluster in the new data directory you created above.
$ initdb /usr/local/var/postgres9
pg_upgrade with the following arguments:
$ pg_upgrade -d /usr/local/var/postgres/ -D /usr/local/var/postgres9 -b /usr/local/Cellar/postgresql/9.0.4/bin/ -B /usr/local/Cellar/postgresql/9.1.4/bin/ -v
If all goes without error, you can switch the data directories so Postgres will point to the right source.
$ mv postgres postgres9.0.1 $ mv postgres9 postgres
You can delete the script left behind by
$ rm delete_old_cluster.sh
I actually had my old Postgres instance running, so I had to stop it before restarting the new one:
$ pg_ctl -D /usr/local/var/postgres9.0.1 stop -m fast
Then I restarted the new Postgres instance:
$ launchctl unload -w homebrew.mxcl.postgresql.plist $ launchctl load -w homebrew.mxcl.postgresql.plist
And you're done - this should fix the PostgreSQL incompatible data directory issue.