Archive for the 'General' Category

Page 2 of 12

Summer… Finally

Wow. That was a busy semester. Between the variety of interesting and not-so-interesting classes that I took and all of the work that I did with my dorm and Next Make (not to mention two extremely successful parties that a group of us dedicated multiple sleepless weeks to putting on), I haven’t had any time to blog about all the stuff I’m working on. Now that the summer’s finally here, I have some time during the evenings (I’m working at Lincoln Labs this summer as well as next summer and fall to obtain my Master’s) to work on a variety of projects and write about them. Last summer, I really didn’t get to work on any of the projects I was hoping to, but I have much more resolve to do so this summer. Here’s what will keep my busy:

Version 1.5 of LED Controller Boards

The LED controller boards I designed for the Next House Party Lighting System are generally pretty good, but they suffered from a variety of problems owing to the lack of proper design iteration. Problems included:

  • No spot for a on-board voltage regulator — we didn’t originally plan for this
  • Not nearly enough capacitors — this ultimately led to voltage spikes so high that they destroyed the LED driver chips
  • No spot for a termination resistor on the RS485 network
  • Not very space-efficient — could use a lot of layout fixes
  • Should use EEPROM to set address, not DIP switches :P
  • Really, how could have I forgotten the freaking capacitors?

I’d like to redesign and send out an order for these boards soon. I ultimately want to turn these boards into self-sufficient kits where you would be able to plug them into your computer via USB, but I’m going to hold off on the USB connectivity and use a separate communications board (that would allow you to talk to multiple LED controller boards at once).

Then, later in the summer, when I’ve proven the functionality of these boards (which I will use in a lighting system I’m designing for my room), I may add things like optional USB connectivity on them for even easier communication.

Cerebro 2.0

My 6.115 project, Cerebro, was a device that used an EEG from a toy to read electromagnetic activity at the surface of your brain and interpret it in the form of color lighting patterns for the Next House Lighting System. I made two videos demonstrating it. I built it on the 6.115 labkit, which required me to write almost 3000 lines of assembly. I’m going to rebuild it with an AVR, which will make my life much easier, and come up with some new signal processing algorithms that take better advantage of state to improve accuracy.

Also, I’ll document my original attempts on my site at some point. I have a lot of pictures.

Mixxx and Mixing

Mixxx is the digital DJ software I use. I got into DJing fairly recently; it felt very natural to do since I’ve always liked electronic music and have a pretty sizable collection. I use two turntables with Serato control vinyls, a Maya44 USB sound card, a Numark Total Control controller, and a M-Audio X-Session Pro controller.

I’d like to design more complicated mappings for my two controllers. Mixxx has a really amazing scripting language that allows you to make any MIDI controller perform a variety of complicated functions that you design. The Total Control is now my main controller — I plan to modify the mappings a bit to fit better with the vinyl control features of my turntables. Furthermore, I’m going to design the mapping so that they change based on whether you’re using vinyl control or not. I’ll then add extra features with my other controller, the X-Session Pro.

I’d also like to do some development on Mixxx. In addition to fixing some rather annoying bugs I’ve noticed, I’d like to separate the pitch control coming from the vinyl control from Mixxx’s internal pitch control state (normally, Mixxx will just set its internal pitch to the vinyl control pitch). This would allow users to control the pitch both from a MIDI controller and from their turntables and would eliminate a few glitchy effects that occur when you attempt to change the pitch from a control while using vinyl control.

Lastly, it would only seem fitting that I actually use the damn software, right? I used bleeding edge builds of Mixxx to DJ Next House’s two parties this past semester and had enormous success with that. This summer, I’d like to start recording regular mixes of various genres. There are so many electronic music styles out there and it’s often hard to find music unless you’re looking for specific things. I’d like to try mixing all sorts of things: electro, dubstep, house, techno, hardstyle, trance, etc. Hell, I’ll throw in some pop too.

Last night, I finished my setup for the summer:

DJ Setup

Door Sign

Last year, I started a project to add a LED matrix to my door for the purpose of displaying arbitrary scrolling messages across it. When I discovered that the cost of the circuit boards would be prohibitive, I got a little disgusted and gave up. I’m planning on figuring out how to reduce the cost and actually building the thing.

Putting it all Together

I picked up some old laptops that someone was throwing out, so I have some candidates for a server. The server would run everything in my room: the lights, the door sign, my fan (it has an IR sensor and a remote that adjusts the speed, direction, etc., so I’m planning on building a simple interface for that), etc. From there, it’s easy to design a user interface to control everything.


All my system configurations are out of sync again and I need a better way to synchronize them than dotman, which was just a simple experiment. I think that I will build dotman2 on top of git; it will take care of the version control for me.

And so those are my plans for the summer. Too much? Probably. But then again, I go to MIT; I know how to survive on no sleep.

Soldering things you can’t really see: building an AC’97 Pmod for Nexys2

Many boards manufactured by Digilent have a uniform type of plugin interface they call “Pmods.” They provide a bunch of IO pins as well as VCC and ground. Pmods can do pretty much everything as long as they can fit into 8 signal lines.

I’ve been looking for a good way to get audio signals into the FPGA. One way would be to use an ADC. Generally, this isn’t too hard to do, but you need to scale and bias the audio line correctly so that it takes the full width of the ADC and is located in the center part.

Another option is to use an audio codec chip. The UCB1400, for example, is an AC’97 chip; it provides a simple serial interface for both inputting and outputting audio streams. I was originally hoping that I could just buy a Pmod containing an AC’97 chip and connectors, but I wasn’t able to find anything online.

So, I then decided to try to include an AC’97 interface in the auxiliary board that I am designing for ACRIS (the board has to do many things, including routing the data from the FPGA out to the LED controllers). But fortunately, I found out that Chris Terman, a Course 6 professor here at MIT, already designed a Pmod for the Nexys2. After contacting him, he gave me the parts to build a bunch of boards and debug his design.

The fun part: the board uses surface mount components, including 0402 resistors and caps. How small are 0402s? This small:

The trickiest part is installing the UCB1400. It’s in a 48-LQFP package, so the pins are very close to one another. I found that the best way to solder the package was to tack down a corner or two, then go to an opposite side and apply a tiny bit of solder at one end. I then raked the iron back and forth across the pins (in the method known as drag soldering), but due to the nature of the pins, I had to use a good amount of solder, which meant that when I was done, all the pins were bridged together. Finally, I used a solder wick to unbridge the pins. The only major problem I had was the initial alignment of all the pins. A slight rotation or shift causes them to become mismatched to the pads.

The results, though, were pretty good:

Next, I’ll be working on controlling the board with the FPGA.

Nexys2 Board Testing

After ordering my Digilent Nexys2 eval board with a 500K-gate Xilinx Spartan-3E and a variety of I/O devices, I never got around to testing it (other than to use the factory-programmed image on the PROM). I brought it to my dorm when I moved back in a few days ago and have had some free time to play around with it.

This is just a very simple example. The board takes two bytes of input and then acts on the data. The first byte says which LEDs to modify (e.g. 11100000 would modify LEDs 0, 1, and 2). The second tells which value to set them all, as a number from 0 to 255. The data is then read into a controller that stores the new value and specifies the brightness of the LED via a PWM block.

Once I got that up and running, I just wrote a few macros that would allow me to set the LEDs. The “chase” macro simply sets an LED and then diminishes the ones behind it. The “grad” macro simply makes a gradient. Currently, I’m implementing Xilinx’s FFT core so that I can take the FFT of some serial data and control the LEDs as necessary.

My implementation can be found here (just create a new project, load this design in, with serpwm.vhd as the top level, and specify the pins: TXD, RXD, LEDS, and clk).

Installing Linux on the MSI X-Slim X340

MSI’s X-Slim laptops are slowly gaining popularity because they are affordable, lightweight, and very mobile.  I purchased an X340 from TigerDirect recently because I couldn’t pass up the great price   Mostly, I purchased this laptop for the excellent battery life — the laptop uses a high-density lithium polymer battery and has a ton of power-saving features that shut off peripherals when you don’t want them.  It’s an excellent 13″ laptop with plenty of power for my mobile computing needs (SSH and Firefox).

Installing Linux on just about any hardware nowadays is easy.  Things have changed a lot since I first started with kernel 2.4 — I remember spending countless hours trying to configure my hardware to work properly.  But now, you rarely need to get under the hood to get your hardware running flawlessly, no matter the distribution that you run.  The thing is, I like getting under the hood and fortunately, this laptop has given me a chance to do a little bit of that.

MSI is just enough of an off-brand name that some of the hardware they use is only partially supported by Linux.  The laptop is built on an Intel platform, so all the most important devices work perfectly well out of the box, but a few things: ACPI, the touchpad, and the keyboard, need a little tweaking to work effectively.

This is a short guide with scripts, configs, etc. attached that aims to get as much of the hardware on the X340 working as possible.  I’ll start by describing the really broken stuff and then later provide suggestions for improving battery performance, etc.  I’m writing from the Arch Linux point of view (BSD-style init vs. SysV-style, etc.), but everything should apply to all distributions, possibly with some minor changes.


Immediately after installing Linux, you’ll probably notice that the brightness keys don’t work.  I think what’s happening is that when your computer boots up, ACPI hands over brightness control to the operating system.  Some laptops (e.g. Dell) still have hardware support for changing brightness, so no matter what OS you’re running, you can always press the brightness up/down keys to adjust your screen.  The X340 doesn’t seem to support that, so we’ll have to create a script to adjust the brightness from within the operating system.

You can get and set the current brightness setting in /sys/class/backlight/acpi_video0/brightness.  So, I wrote a quick script that sets the brightness in different ways:

I stuck this script in /etc/brightness/  Supported functions: bup (increase brightness level by 1), bdn (decrease it), blo (set to minimum brightness), bhi (maximum brightness), bset # (set to some value #), badj # (increase or decrease by #), bget (return the current brightness).  You could source this file as root and run the functions, or you can just give them as arguments to the script.

I’ll get to configuring the brightness keys to work with this script in a minute, but if you would also like to be able to use the functions as a regular user, you can modify sudo to let you issue brightness commands without a password by doing sudo visudo and adding the following line:

yourusername ALL = NOPASSWD: /etc/brightness/

Then, you can define some aliases in your profile:

alias bup="sudo /etc/brightness/ bup"
alias bdn="sudo /etc/brightness/ bdn"
alias blo="sudo /etc/brightness/ blo"
alias bhi="sudo /etc/brightness/ bhi"
alias bset="sudo /etc/brightness/ bset"
alias badj="sudo /etc/brightness/ badj"
alias bget="sudo /etc/brightness/ bget"


The keyboard is a bit trickier — there are several things to do.  First, we need to get HAL to recognize the extra keys on the keyboard.  For example, if you press the brightness up key (Fn-Up) and then do dmesg | tail, you’ll see an error message telling you that the scancode hasn’t been mapped to a keycode.

Working off of the keymap entries for other MSI computers, I built an almost-fully-working keymap for the X340.  It might work for other X-Slim laptops too, especially for the X320, X350, and X360.  You can grab that here:

Stick that in /etc/hal/fdi/information/10-keymap-msi.fdi and restart HAL.  I was able to get all of the special keys working with a few caveats:

  1. The keys labeled with [hw] have a hardware action.  For example, the bluetooth key actually turns the bluetooth module on and off.  So, if you choose to bind something to that key, make sure that you are willing to toggle bluetooth on and off.  A good thing to bind to these keys are status indicators so that when you toggle bluetooth on, an icon or something lights up.
  2. The same thing applies to WLAN.  It toggles the RFKILL bit in hardware.
  3. Fn-F2 (video mode switch) and Fn-F11 (some other WiFi button — maybe for bringing up the connection window?) seem to be “missing” — when I press either one of them, I don’t get an error about a missing keycode, but I don’t get a keycode either.  After I look into this issue, I plan to submit a patch to HAL in order to get this keymap included.
  4. Fn-F5 (economy mode) currently maps to keycode 126, which is plusminus.  I need to remap that scancode to “battery” when I find it.

The next thing to do is to install some software to handle system-wide key bindings.  I like actkbd (AUR package) because it operates as a system service and therefore works even when you aren’t using X.  My /etc/actkbd.conf file is here:

Finally, you may want to define some user-level keybindings.  For example, I switch escape with caps-lock and I also define the \| key (which is really less than/greater than when you press the key) that’s right next to the Alt key to be Super_R because I use the Windows key a lot and I think it’s more comfortable next to the space bar.  The xmodmap configuration file I use is as follows.

remove Lock = Caps_Lock
keysym Escape = Caps_Lock
keysym Caps_Lock = Escape
add Lock = Caps_Lock

keycode 94 = Super_R

I’ve also turned the menu key into left-click, but I’ll get to that in the next section.


I have to say, the touchpad sucks.  It really sucks.  I thought it wouldn’t be as bad as the reviews said — I assumed it would be possible to fine-tune things and so forth — but I was completely wrong.  First of all, it’s not made by Synaptics, but rather by a company called Sentelic.  The touchpad’s operation is really ugly.  Unlike with the Synaptics touchpads, you cannot move your finger on the sides of the touchpad to scroll; you have to place your finger at the corners and hold it.  That wouldn’t be so bad, but it’s not accurate at all; I can’t scroll for more than a few seconds even when holding my finger perfectly still.  Also, there seems to be no control over the sensitivity of the pad, and there’s definitely no “palm check” feature.  Supposedly, you can adjust the acceleration rate, but I haven’t been able to do that yet in Linux.

What I have been able to do is get rid of tap-to-click.  I didn’t want to get rid of it because I use it a lot–it’s much easier than pressing the mouse button.  But, because the touchpad is big and very sensitive, it’s easy to accidentally start clicking when you’re typing.

To get rid of tap-to-click, issue the following command as root:

echo 'c' > /sys/devices/platform/i8042/serio1/flags

I put this in /etc/rc.local so that it runs every time I start my system up.

I also used xbindkeys and xmacroplay (AUR package) to rebind the menu key to left-click by creating the following ~/.xbindkeysrc:

Other Stuff

The brightness settings, keyboard, and touchpad are the three big things to fix on the X340.  Everything else pretty much works out of the box.  A few minor points:

  • You’ll probably want to install and configure laptop-mode-tools.  This, along with the standard cpufreq and acpi packages can provide really nice battery performance improvements.
  • I recommend taking a look at Arch Linux’s laptop article on their wiki.  There’s lots of useful information there.
  • I had to add video=1366×768 to my kernel parameters list in /boot/grub/menu.lst because sometimes, my system would boot up and stay in 640×480.  I think the actual parameter string should actually be something like video=LVDS-1:1366×768 in case you keep an external monitor attached.
  • /etc/acpi/ is a good place to add hooks based on various ACPI events.  For example, when I plug the power cord in, I run cpufreq -g performance and when I unplug it, I run cpufreq -g ondemand.  I also have the following code in the lid change state:
    if grep -q closed /proc/acpi/button/lid/LID0/state; then pm-suspend; fi
  • Unfortunately, unlike many other laptops, this one doesn’t trigger an ACPI event when you open the lid and the system is suspended.  So, you have to press the power button to wake the system up.

And that’s about it.  Everything else is just a matter of minor configuration to your preferences.  It’s not like the old days when you had to research all sorts of minor points in the kernel configuration and build your own kernels to support the hardware you needed, but for almost everyone, it’s probably best that those days are behind us.  Still, the opportunity to contribute even a few small improvements or findings to the open-source community is quite a valuable experience.

Up next: I finally start describing the plans for my FPGA-based audio visualization project.  I have them all written down in my notebook; I just need to formalize them a bit and start building.

Drive Upgrade: OCZ Vertex 2 SSD

Last week, I purchased an OCZ Vertex 2 50GB SSD drive ($174.00) and a Samsung 1TB drive ($79.99; I’m using it to keep the backups I take with DAR).  After doing some research, I decided on the Vertex 2 SSD for its impressive speed: reads peak at 285MB/s and writes peak at 275MB/s.  The reviews indicated that the manufacturer’s specifications were accurate, so I decided to give the drive a try.  As usual, NewEgg shipping was ridiculously fast; the drives shipped from New Jersey, so it took all of a day for them to get here.

Image taken from OCZ's WebsiteLike most SSDs on the market, the Vertex 2 is in a 2.5″ form-factor, but comes with a convert to secure it into a 3.5″ bay.  Unfortunately, this converter is not immediately compatible with the Antec 1200 (well, any of the Antec cases that use special screws to secure drives in the bays).  The problem is that the screws for the drive bay have a smaller diameter than the ones that come with Antec’s drive bay.

This is a problem because Antec’s screws are very long.  The drive bay has an outer and an inner wall, with a plastic piece connecting the two; the screws go through both walls and into the hard drive.  Since I could only use the screws that came with the SSD, which were obviously very short, I thought I was out of luck.

It turns out that by popping out the plastic pieces highlighted in red in the image below (the drawing itself is taken from the Antec 1200 mechanical drawings, available on the Antec website), you can access the inner wall of the drive bay directly.

Original drawing from Antec's websiteNext, you need to use a pair of tweezers to get the SSD mount screws in through the hole highlighted by the orange arrow (they won’t fit through the screw hole in the outer wall of the drive bay).  Once you have positioned the screw at the hole in the inner wall, you’re all set.  This process is a little tricky and can take some time and patience, but it will mount the drive very securely into the bay.

According to my initial testing, this drive absolutely performs up to the specifications listed on the website and the POST that my computer does on startup now is the slowest point in booting.  More importantly, I’m using this drive for everything in / besides /home, so application load times are fantastic.  My 1.2TB RAID 5 array is now entirely devoted to my home partition.  Disk read times were once the major bottleneck in my computer’s operation (as they usually are for any computer), but the addition of this SSD has improved the speed dramatically.

Lastly, I can’t help but make a small plug for Arch Linux.  I chose to reinstall all of my software on my new drive instead of copying it over with DAR.  So, I backed up my home directory, etc directory, and used Arch’s package manager, pacman, to create lists of packages I installed both from the main Arch repositories and from the AUR.  That’s literally all I needed to make a complete backup of my system.

April Screenshots

This month, I’ve switched to the Awesome Window  Manager (configs coming eventually) and rxvt-unicode.  That’s pretty much it.

Staffen SRX Fountain Pen

I was feeling old-fashioned recently, so I decided to buy a fountain pen.  After a little research, I found xFountainPens, a retail site that promises high quality pens and ink for low prices.  For a grand total of $28 for a pen and a bottle of ink, I decided to take a chance.  I purchased a Staffen SRX Galaxie pen and a bottle of black ink.  I ordered it last week and it arrived, so the shipping was fairly quick (and free); it was also packaged well.  For $20, I wasn’t expecting too much; a pack of ballpoint pens costs almost as much nowadays.  What few reviews I could find for this pen were generally positive.

I was extremely impressed.  The ink flow is extremely smooth and even and the pen is a good weight–very comfortable to write with.  I’m a lefty (the curséd breed, I know), so my writing usually involves scratching up pages (because lefties have to push the pen across the paper and not pull it), but I had no trouble writing with it.  The ink is also quite nice: it flows smoothly, dries quickly, and doesn’t bleed.  One of the older reviews that I read mentioned a few weakness with the pen, including a loose cap, but I did not find any.  It was a $28 well-spent.

I decided to keep the pictures at their original 4000×3000 resolution to show off some of the amazing macro capabilities of my camera…

None of my classes this term really require writing…  The assignments are all accomplished via computer, whether they’re labs for my courses in communications and computer architecture, problem sets for my CS theory course, or the research paper for my class in urban history.  Yet, I still take notes by hand for the most part, because I find it’s faster.  And I also have lots of scratch paper in case I need to review my work later.

The other day, I got bored and tried to see what it would be like to write like a righty.  So, I did the obvious thing and started writing backwards (right-to-left with mirrored characters) with my left hand and I picked it up very quickly.  I’m still trying to develop the spatial skills that will allow me to mirror diagrams intuitively, but my right-to-left writing speed is now very nearly as fast as my left-to-right speed.  Yes, I do get this bored sometimes.

Anyways, the tl;dr is that this pen is really fantastic and I’m quite happy with the service from xFountainPens.

Edit: I’ve been using this pen a lot recently. It turns out that the ink that I bought on xFountainPens was probably pretty poor because I recently bought some ink from Lamy and my pen never clogs now.

Photos from Memorial Dr.

Today was the first warm day in quite a while here in Cambridge, so I decided to go out (*gasp!*) and walk along Memorial Drive and shoot a few pictures with my camera.

For some pictures, I used my Tiffen Sky filter (blocks UV).  On others, I used my polarizing filter (also from Tiffen) to get bluer skies.  On some, I used both, but the vignetting was particularly bad…  I have to zoom in quite a bit (~3x) to prevent it, or I can just crop the picture later.

View the Full Set

Customizing MOC to Perfection

Every month, I take a screenshot of my desktop and post it to the Arch Linux forums.

I included a shot of my music player of choice, MOC, in the background.  But after looking at it for a few seconds, I realized that I have spent months using this music player without giving it a proper color theme (looks really ugly, doesn’t it?).  Furthermore, the default keymap for MOC isn’t very Vim-friendly.

So, after a little work, I achieved some nice results.  First of all, I remapped a bunch of keys to make things a bit more comfortable for Vim users like myself.  Then, I set to work building a nice theme that would work well with my particular terminal colors (MOC only supports the 8 terminal colors).  The result is this:

Perhaps others might find my configuration useful.  So, I’ve included the config files below.  First of all, I should note that my terminal colors do not support the “standard notion” of what they should be, primarily because I chose to get rid of “cyan” and make that color a dark bluish color.  The terminal colors are almost identical to the dante.vim Vim colorscheme, a theme I encountered a while back (I’m currently using a modified version of lucius.vim as my colorscheme, but it is very similar).  Here they are:

Color    Regular Intense
Black:   #1B1D1E #343737
Red:     #F92673 #FF5996
Green:   #86B413 #B8E354
Yellow:  #FDB436 #FEED6A
Blue:    #55C5D6 #8CEEFF
Magenta: #8952FE #9C6EFE
Teal:    #465457 #899CA1
Gray:    #CCCCC7 #FFFFFF

Foreground: #FFFFFF
Background: #000000 (semi-transparent)

Here’s a quick table showing the resulting colors:

Colorscheme and Keymap

If you have similar kinds of colors, you might be interested in the MOC theme.  Download the following file and drop it in ~/.moc/themes.  Then, you can also added into your config file as the default theme.

And, here is the Vim-like keymap:

You can just drop this file in ~/.moc and then edit your config file to use this keymap file.

Global Keyboard Shortcuts and Remote Status Display

I chose MOC over MPD because of its nice lightweight footprint and tidy environment.  MOC actually supports remote operations so you can easily bind your keyboard’s media keys so that they control the player.  I also want to be able to display the current song and progress in my Conky setup (see screenshot).  It turns out that this is also pretty easy.  I have been using the following configuration for a while now:

First, to control MOC, I bound these commands to my media keys:

Play/Pause: [[ -z $(pidof mocp) ]] || mocp -G
Stop:         [[ -z $(pidof mocp) ]] || mocp -s
Next Track: [[ -z $(pidof mocp) ]] || mocp -f
Prev Track: [[ -z $(pidof mocp) ]] || mocp -r

And to display the current song information, I used the following lines in my .conkyrc

${if_running mocp}${alignc}${execi 10 mocp -Q '%song\n%artist\n%album'}
${execbar mocp -Q '%cs/%ts*100' | bc -l}${endif}

This will display the song, artist, and album each on their own lines.  Below that, it will display a progress bar.

The Keyboard Saga

Short story: static electricity sucks.

Slightly longer story: static electricity really sucks.

Longish story: For about a month, I have noticed that the metallic rim around my Kensington keyboard is susceptible to ESD.  Furthermore, I realized that this rim is not grounded because occasionally, a shock would cause the keyboard to reset.  So, I’ve generally been careful about using it and have tried to touch something metallic before sitting down to type.

Inevitably, I forgot to do this and blew out the keyboard driver’s brains one unfortunate night.  So, I scrambled to find a new keyboard and came up with another Kensington keyboard.  I like scissor-switch keyboards (the kinds used in laptops) because of the low travel distance.  Kensington seems to be one of the few makers of scissor-switch keyboards nowadays.  This keyboard has no exposed metallic parts, so I was a little more confident about purchasing this unit.  Another option would have been to purchase the same keyboard that I had before and then connect the metallic rim to the ground port of the USB input.

Anyways, overall, I like the feel of it and I have gotten used to the significantly lower travel time, but I don’t know if my typing is quite as fast as it was on my previous keyboard yet.  The arrow keys are really small, which makes them hard to reach quickly if I’m in Insert mode in VIM and need to move quickly (so I’ve started to use ^O + movement more often).  The keys feel a bit flimsy compared to my last keyboard.

Unfortunately, the little plastic mat that is underneath all of the keys was not built to size and bulged up right underneath the CTRL key (which I consider to be extremely important).  So, I had to cut away a piece of the mat to make things work again.  Unfortunately, this now exposes the (surprisingly dirty) metal beneath it, so the keyboard is again exposed to ESD…  Hopefully this part is grounded (though I’ll probably try to add some kind of layer of insulation when I get a chance).

It’s clear that this keyboard just doesn’t have the quality of my last one.  The keys are thinner and feel much cheaper.  For comparison, I took off the CTRL keys.

However, I’m getting used to the slight differences in this keyboard and my typing speed has improved dramatically since I first got it.  The low travel distance isn’t really a problem for me; I haven’t accidentally hit any keys because of it.