Linux on the Razer Blade Stealth

Linux on the Razer Blade Stealth

Like many other developers frustrated with Apple’s declining interest in Mac, I’v decided to return to linux for my laptop. This is prompted in part by the significant cost difference between Apple laptops and other brands, and I’m just not excited by anything Apple has made recently. So the remained of this post will cover my experience switching to linux for my laptop.


My Previous Setup

When on the mac, I used many of the great builtin apps, many third party apps, and a few cloud apps.


  • Preview – this app is so good, its almost worth sticking with Apple just for it. It can really do almost anything. Preview Team: I love you.
  • Apple Mail – I know a lot of people hate it, but I think its great.
  • Safari – Yup, I’m a Safari person too. Chrome is great, but I’ve always been a bit more partial to Safari.
  • Terminal – Once you get it customized, its actually a pretty great terminal app.


3rd Party:

  • Sublime Text 3 – Combined with Package Control, this editor is awesome.
  • brew – This is where I get all my commandline apps from.
  • Illustrator – I have a love/hate relationship with Illustrator. It is so powerful, and yet the workflows for many things are so annoying.
  • Slack – I use it work for and for many social and professional groups. RIP IRC.
  • Arduino – I don’t use the IDE, just the commandline tools that are packaged inside.
  • OpenSCAD – Great 3D modeling tool if you know how to code.
  • Photoshop – Another love/hate relationship, but I use it so much less than illustrator, it ends up not being that important.
  • Saleae Logic – I wish I had more opportunities to use this fantastic logic analyzer.
  • Audacity – I don’t do too much audio editing anymore, but I still like this handy app for the rare occasion.
  • Cadsoft Eagle – Its been too long since I’ve opened it up, but I have spent many hours in this tool.



  • Google Docs – I think  spend too much time using these tools.


And of course there are many more apps that I use for one off purposes, but none of them seem critical enough to my everyday workflows to be concerned with for now.


Picking a New Laptop

My requirements:

  • 16GB RAM
  • Kaby Lake CPU
  • 512GB SSD
  • Lightweight
  • Good battery life
  • Good price
  • Type-A USB Port (at least one)
  • Headphone jack

Nice to Haves:

  • Thunderbolt
  • SD card reader (had to give this one up, but I bought a tiny micro-SD reader)
  • HDMI
  • Keyboard with backlight


I considered the Dell XPS 13 Developer Edition, the Lenovo X1 Carbon, and the Razer Blade Stealth. Looking at the reviews online, prices, and other people’s experiences running linux on them, I chose the Razer Blade Stealth. The Dell XPS seems like a very strong candidate too. And in hind site, it would have been better if I could have compared the two side by side. I think the Dell’s borderless screen may give it an edge over the razer.


Overall Impression

The Good

The razer is a really nice laptop. The build quality is great and the specs are exactly what I was looking for. After running linux on it for a little over a month, I can say that many of my workflows are actually improved. The desktop environment is customized to my exact style of working and I haven’t yet missed anything about my previous OSX setup.

Working with Arduinos, Raspberry Pis, and other embedded systems is much nicer on linux. The usb drivers are more stable and installing all the libraries I needed was a breeze. I also used this opportunity to switch to This has been an awesome experience.

Speaking of installing software. I had forgotten how awesome apt/dpkg are. Grabbing new libraries and packages is so much better than Apple’s app store and brew. I can grab anything in seconds, all from the terminal (which is where I already spend a lot of time). Don’t get me wrong, brew is great, but it does not completely handle working around Apple’s ecosystem.

Another big switch for me was the email client. I started with Thunderbird. I was not happy. Then I tried Nylas and wow, that is a nice email client. I’m super happy now. Better than Apple Mail even.

Switching to Chrome (technically Chromium) has also been fine. Everything works great, performance is great, and with Chromium I get hardware accelerated video playback!

Battery Life seems great. I chose the QHD screen and I’m getting up to 9 hours of battery life. Heavily dependent on what I’m doing with the laptop of course. I should really do some better testing here, but to be honest, it hasn’t been a concern yet. The battery life has been better than my previous mac. All the linux power management stuff worked out of the box with one exception regarding lid close/open events (see below).

Chroma even works too. Yes all that fancy RGB LED keyboard stuff even works in linux. I installed Polychromatic and the associated drivers and boom. Everything works.

The touchscreen works perfectly out of the box, pinch zoom, all that stuff. I don’t really use it very often however.

The Bad

There are some drawbacks. The biggest is that the touchpad is not as great as the mac. I’m using libinput with Xorg and have configured it to work reasonably well for me, but I still think Apple does a better job at input rejection. The razer’s touchpad also requires a little more force to click than I’d like (I don’t use tap to click because of the less than awesome input rejection in linux). So, how big of an inconvenience is it? Its mildly annoying at this point, but I’m also excited for libinput 1.7 which is supposed to add some additional sensitivity controls.

The other drawback of the razer is the huge bezel. At first I didn’t mind, and even still its only a mild annoyance. I think the biggest issue is that it makes the screen “feel” smaller than it is.

Finally, for those who care about using their laptop as a boombox, the speakers are not very loud at all. It doesn’t bother me because I’m not looking for a thumping sound system in my laptop. Just get some headphones already or bluetooth to your stereo.

Wifi with the Killer Wireless card is terrible. I could only get 2.4Ghz working and even then it sometimes looses the connection. This would be my biggest complaint, but it has a convenient and easy $30 fix. I bought the Intel 8260 m.2 card and a T5 torx. Turned off the laptop, took the bottom cover off, installed the new card and rebooted. The Intel card not only works flawlessly, but after wakeup, it connects to networks much faster than even my mac. Problem solved! Also, did you know you can get 4G m.2 cards? crazy.


Installing Debian

Note: This is not a tutorial, its really more of a brief on what you can expect if you follow this path.

I’ve been a Debian fanboy since 2001. It’s the most intuitive distro to me despite using Redhat for many more years. Debian however does not have a great out of the box experience. It takes some time and effort to get everything setup and dialed in. One of my favorite parts of Debian is that you can set it up to follow a rolling release. I installed sarge and then switched apt to point at “testing” which will continually move forward without me needing to do any major re-installs or anything. I used to run like this back in the early 2000’s and it was a beautiful thing.

There are some pain points when installing Debian. The installer does not include drivers for the wireless card or the touchpad. This can be solved by using another computer and copying them over once the installer is running (it even has a prompt for this). And luckily, the touchscreen works out of the box, so its easy enough to just use it in place of the touchpad while installing. Once the distro is installed the touchpad should work out of the box.

I also got into a weird disk setup loop when trying to setup the partitions and encrypted disk. The trick is to select everything correctly the first time and never click the back button (or just restart the installer if you get into a similar situation).

After installing the basic distro, there is a lot still to do. This is when I setup the following things:

apt install

  • Xorg (not wayland)
  • Xfce (not gnome. What happened to you gnome?)
  • gdm greeter (its still the best even 16 years later!)
  • plymouth graphical boot screen (purdy and has a nice disk password prompt. Its only on the screen for about 1sec longer because the system boots so fast)
  • InkScape (Illustrator replacement, and I can customize my workflows!)
  • Chromium
  • Synapse (awesome app launcher similar to spotlight. Bind it to the windows key. amazing!)

Require Additional apt repos

  • polychromatic (razer keyboard lights)
  • Razer chroma drivers
  • lollypop (great music player)
  • Nylas (awesome email client)

Direct Downloads

  • Chrome (to get the drm binary to copy into Chromium)
  • Slack
  • Sublime Text 3
  • Saleae Logic

Note the small number of direct downloads. Pretty amazing.

Misc Razer Issues/Workarounds

Lid Open/Close Handling

ACPI is a notoriously complex and hard to implement system. Out of the box, the razer does not properly sleep/resume when closing/opening the lid. Here is the workaround I used. With that in place, all is well!


I tried and tried and tried to get 5Ghz working with the built-in killer wireless card. I think I must have read every bug and thread on the subject. At the end of the day the best solution was to spend $30 and 10minutes of my time to replace the card. No usb dongles or adapters. Just a new Intel 8260 m.2 wireless card. The Intel card is a direct replacement for the builtin killer card and it works flawlessly. Thank you Intel!


As I already noted. The installer itself does not include drivers for the touchpad, but they are included in the base Debian distro. So it will start working after the initial install is complete. Tuning the touchpad to my preferences took a little work and there don’t seem to be great GUI tools for this. I added the following file to improve my experience:


# Match on all types of devices but tablet devices and joysticks
Section "InputClass"
 Identifier "libinput pointer catchall"
 MatchIsPointer "on"
 MatchDevicePath "/dev/input/event*"
 Driver "libinput"

Section "InputClass"
 Identifier "libinput keyboard catchall"
 MatchIsKeyboard "on"
 MatchDevicePath "/dev/input/event*"
 Driver "libinput"

Section "InputClass"
 Identifier "libinput touchpad catchall"
 MatchIsTouchpad "on"
 MatchDevicePath "/dev/input/event*"
 Driver "libinput"
 Option "Tapping" "off"
 Option "ClickMethod" "clickfinger"
 Option "NaturalScrolling" "true"
 Option "DisableWhileTyping" "true"

Section "InputClass"
 Identifier "libinput touchscreen catchall"
 MatchIsTouchscreen "on"
 MatchDevicePath "/dev/input/event*"
 Driver "libinput"

Section "InputClass"
 Identifier "libinput tablet catchall"
 MatchIsTablet "on"
 MatchDevicePath "/dev/input/event*"
 Driver "libinput"

I’m hopeful the touchpad experience will continue to improve on linux.



Seems glitchy. That said, I’ve only tried opening the cheese app. This really isn’t something I use. One day I’ll probably try it out for longer than 5 seconds.


Final Thoughts

The Razer is a great laptop. I like it ALOT. Its also much cheaper than a Mac. Getting Debain setup and working well took some serious work, but then again so did the Mac when I first switched to it 14 years ago. Overall, I would rate my experience with linux on the razer as about equivalent to the mac. Some things are better, some are worse. But did I mention the razer is much cheaper? I think if I can get the touchpad just a hair better, the razer + linux will become strictly better than my previous mac. Maybe I should start contributing to libinput and Xorg 😉

P.S. My first boot with the Razer was into windows 10. The out of the box experience there was pretty amazing. I migrated the windows install onto a 128G thumbdrive just in case.



Yakitori – 0.1


There are several different types of yakitori grills out there. Forget all the non-charcoal ones and you get a limited set of commercial products and only a few DIY ones.

My design requirements:

  • Charcoal
  • Cooking surface for 2+ portions
  • Small and storable (I only have a patio)
  • Self contained. Everything needed (except the coal) should fit nicely together
  • Aesthetic
  • Simple

Here is my 3d model of the prototype:

render1 render2



Mold Making

I made a quick mold out of wood and expanding foam. Little did I know, the expanding foam (my wife idea) was crucial to the prototype’s success. You’ll see why later.

IMG_0123 IMG_0125_2 IMG_0124_2 IMG_0126_2


I used cartable refractory cement mixed with fiber glass and cement dye for the mix. Getting the mix even and the right wetness was a little tricker than I expected. Then packing the cement was a lot harder because I didn’t assemble the mold int he right order. In fact, the process went a little sideways and I didn’t get a chance to take any photos.



IMG_0116_2 IMG_0115_2 IMG_0117_2 IMG_0118_2



And this is why the expanding foam was so important! Without the ability to cut it all out and collapse the walls of the insert, I could have never gotten the grill out of the mold without splitting it.


Cured grill



3 days later, we have a fully cured grill!!!!

IMG_0120_2 IMG_0121_2 IMG_0122_2


Time to cook. And just in time for my wife’s Birthday!

I don’t have a screen built for it yet, but my hope if that the grill when placed vertically will also double as a charcoal stack for lighting the coals.


Pro tip: spray a little olive oil on your paper for a longer burn.

With the coals hot, it was time to cook:

IMG_0112_2 IMG_0111_2 IMG_0113_2


Initial Thoughts


mmm, damn this is good! We even turned out a really nice tare sauce.


Ok, this was great. Like super great, but there is room for more. Yakitori-0.2 is already in progress!

Vision 3D Printer – First Print

So you have the printer built and the software installed, now for the leap into printing with it.

Turning It On

Before you turn on the printer, double check the wiring one more time. Make sure the colors of the cables all line up (I had an endstop with a plug that was backwards and shorting the board). Here is the RAMPS wiring diagram again.

Ok, time to turn it on. You should see lights turn on flash on the arduino and RAMPS boards. If you don’t (or they instantly turn back off), unplug the power immediately. Your wiring could still be wrong and you might have either a short or a disconnect.

Debugging Wiring Problems

Debugging these problems can be painful if your not an electronics wiz. My best advice is to use a volt meter with a conductivity function (it beeps if the two probes touch). In this mode can you touch the different pins on the board and make sure that they are connected if they are supposed to be and not if they shouldn’t. Starting from basic things like power and then moving on to the peripherals is they way I normally work through the board.

If the problem isn’t obvious from above, you can also try unplugging everything and then one by one start adding the components back until either you find the problem component or until you have everything plugged in and working (remember to turn off the power each time you add something).

Making It Move

The board may power on, but you are still a ways off from being able to print. I recommend testing out your firmware configuration by using pronterface. Open pronterface, select the usb connection, an click connect. Once you have a connection, be prepared to turn off the power. Click the auto-home button, and if the motors start moving the wrong way, kill the power quick. You’ll want to make sure you leave enough room on all 3 axis so that you have time kill the switch before the motors start driving the axis too far one way.

Some common problems you may encounter at this stage are:

  1. Axis moves the wrong way (invert the direction in the firmware’s Configuration.h)
  2. Axis doesn’t move, but motor makes noise (turn up the gain on stepper driver)
  3. Motors don’t stop after hitting the end stop (invert the endstop in the firmware’s Configuration.h)
    1. Also, it is good to test the endstops by hand. Center the axis, push the endstop switch by hand, and then tell pronterface to move the axis towards the endstop. Make sure it moves when the endstop is open and doesn’t when it is closed.

Another useful trick is to loosen the pinion gears on the stepper motors so that you can test their movement with out actually moving the axis.

First Print

Turn on the heated bed and extruder heater in pronterface. The extruder should heat up quickly, but it may take several minutes for the bed to fully warm up. Once the extruder is at temp, move the z-axis up a few cm, and extrude some plastic via pronterface. It may take several cm worth of extrusion length before anything comes out. Make sure the filament is also moving the right way 🙂

Assuming you have a model in gcode (see slic3r below), load it in pronterface and click print. If you make it through the first layer, consider yourself lucky. Also, try printing something really simple like a cube first. This will make it easier to see what is going wrong. There are many problems that you are likely to encounter at this stage:

  1. Nothing comes out of the extruder
    1. Sometimes, it just takes a little extra extruding before anything comes out (even after you just finished getting it to work). This is because extruders tend to ooze a little while they are idle. (Try adding a 1 layer skirt in slic3r.)
    2. Your temp sensor might be reporting incorrectly. (Make sure your temp sensor is correctly set in the firmware’s Configuration.h)
  2. The filament is too thick on the plate (Your z-axis 0 is too low. You can move the endstop or adjust the Z offset in slic3r)
  3. The filament instantly curls up off the plate. (Your Z-axis 0 is likely too high. Same solution as above)
  4. The filament height and thickness look right, but your part doesn’t stick, or starts to peel after a few layers. (Assuming you are using ABS, Try the ABS juice from Matt’s video. You really can’t add to much to the plate. I haven’t printed with PLA yet)
  5. The nozzle tears the tape on the printer plate. (Your z=axis 0 is too low. See above)

Got another problem? Let me know and I can add it 😉

Slicing Your Model

You can spend a lot of time tweaking slic3r settings. In fact this topic alone is too long for me to write about. Try starting off with a tutorial like this one. I’m also a firm believer in using the latest version of slic3r. Some people advise that older versions work better, but I have not seen that to be true. In fact, with every new version there are many bug fixes and enhancements. Slic3r is only getting better and better.

Python: os.walk vs linux find

AKA: Why Python needs a find module

I found myself needing to scan and modify a bunch of files (300k) for a really large project. The modifications were too complex for a perl or sed one-liner, and I thought Python would be good for quickly coding all the logic. But as I started iterating on my script, I found it to be very slow when traversing through the project’s files. I was using find on the command line to look up which files I expected to see changes in, and I noticed it was pretty fast, almost 10x faster than python, so of course I was like WTF? Long story short, find is very fast, and well, os.walk is not. Below are some performance comparisons I made of different ways of scanning the files in python vs find.

Test Setup

All my testing was done with the same directory of files, and I ran each test 4 times (discarding the first run). In other wards, all the filesystem caches were warmed and then I ran each test 3 times. I used the following script to profile the performance:

> cat timeit 
ELAPSED=`echo "$STOP - $START" | bc`
echo "Elapsed Time: $ELAPSED" >&2

And the realtime executable is simply this c program:

> gcc -o realtime realtime.c 
#include <sys/time.h>
int main(void) {
    struct timeval time_now;
    printf ("%ld.%d\n",time_now.tv_sec,time_now.tv_usec);
    return 0;

Matching Files in Python

As I noted above, scanning files is pretty slow in python. Here is a quick performance comparison of the different approaches I tried:

Using the re module:

> cat 
import os
import re
pattern = re.compile(r'.*\.png')
for root, dirs, files in os.walk(os.getcwd()):
    for f in files:
        if pattern.match(f):
            print os.path.join(root,f)

Using the builtin string functions:

 > cat 
import os
for root, dirs, files in os.walk(os.getcwd()):
    for f in files:
        if f.endswith(".png"):
            print os.path.join(root,f)

Using the slice operator:

 > cat 
import os
for root, dirs, files in os.walk(os.getcwd()):
    for f in files:
        if f[-4:] == ".png":
            print os.path.join(root,f)


 command run1 run2 run3
 timeit find ./ -name “*.png” > /dev/null  1.58 1.48 1.48
 timeit >/dev/null  21.33 22.10 21.41
 timeit >/dev/null  22.31 21.39 19.87
 timeit >/dev/null  22.15 21.24 20.87

Traversing Files

The previous results weren’t very telling other than python is slow. So this test is simply how many seconds does it take to print all the files in the project.

 command     run1  run2    run3
 timeit find ./ >/dev/null  1.61 0.80  1.26 
 timeit >/dev/null  20.69 20.79  20.85 
> cat 
import os
for root, dirs, files in os.walk(os.getcwd()):
    for f in files:
        print os.path.join(root,f)

Matching strings in Python

Lets do the same comparison, but without os.walk in the mix:

Using the re module:

> cat
import re
import files
pattern = re.compile(r'.*\.png')
for f in files.files:
    if pattern.match(f):
        print f

Using the builtin string functions:

> cat 
import files
for f in files.files:
    if f.endswith(".png"):
        print f

Using the slice operator:

> cat 
import files
for f in files.files:
    if f[-4:] == ".png":
        print f


 command  run1 run2  run3
 timeit >/dev/null  0.390 0.377 0.390
 timeit ends >/dev/null 0.276 0.271 0.277
 timeit >/dev/null  0.234 0.231 0.242

Final Thoughts

We now have a real measurable difference in python’s string matching options, but they are all pretty close. I’m not sure it matters to much which one you use. The real question I have is when are we going to get a “find” module for python. Something like the following would be great:

'''find module'''
def search(path, expression, callback=None):
    searches the given path for the regular expression passed in.
    @param path: path to search
    @param expression: regular expression to search with
    @param callback: (optional) callback to be executed every time a file is found.
    The callback should accept a filename as the only argument
    @return: iterator for all the matched files

# Usage:
import find
for f in"~/Music", ".*\.mp3"):
    print "Mp3:", f

Installing Silhouette Connect for Illustrator on OSX

I have a Silhouette SD (recently replaced by the portrait). Its a great little paper/vinyl cutter, but the software it comes with (Silhouette Studio) isn’t all the great for working on complex designs. I much prefer to work in Adobe Illustrator, and until recently I had a pretty good setup working. Then came OSX Mavericks…

Silhouette SD, Adobe Illustrator, and OSX (pre Mavericks)

While it isn’t advertised, it turns out that the Cutting Master 2 plugin (download here) for Illustrator works with the Silhouette SD. This means you can directly cut from Adobe Illustrator! After a little trial and error, I found that you just have to pretend like you own the CC300-20 cutter.

UPDATE: Oh look, and now they advertise this works. I wish they posted this 2 years ago.

Silhouette SD, Adobe Illustrator, and OSX Mavericks

After upgrading to OSX Mavericks, Cutting Master 2 stopped working. No big deal, this happened with Lion. I’ll just download the latest… Oh, and that doesn’t work either.

In the mean time, Silhouette Connect was released! Its actually a much nicer version of CM2. The interface is great, and it has the same cutting settings that Silhouette Studio offers and the layer and color settings of CM2. Woot! Well worth the money.

Silhouette Connect can’t find Illustrator

I have all my Adobe software installed into a folder called “Adobe” inside of Applications. This is not the standard location and sadly the Silhouette Connect installer can’t be pointed at it directly (lame). No problem I thought, I’ll just create a symlink from where it would normally get installed. No luck 😦

Yup, another win for Silhouette America. Why am I always hacking their products to get them working?

After much debugging, which included modifying dtruss to redirect its output to a file of my choice (wow strace is nicer (ye, yes,  dtrace is even more badass)), compiling a program that maps .vol files to their normal path, and compiling a program to create hard links, I was able to figure out and solve the problem. It turns out that the installer lists all the contents of /Applications/ looking at their filetype and symlinks are only being seems as “symlinks” instead of being resolved to their src directory. So what we really need is a hardlink.

  1. Copy and paste the hardlink code from this stack overflow answer into a file called hardlink.c
  2. Open the Terminal App and inside it run:
  3. > gcc -o hardlink /path/to/hardlink.c
  4. > ./hardlink /Applications/Adobe/Adobe\ Illustrator\ CS5 /Applications/Adobe\ Illustrator\ CS5
  5. Re-run the Silhouette Connect installer. It should find Illustrator this time!

Cracking password protected zip files on OSX


It seems silly to me that someone would give me a zip file but not the password to open it. I have all of the data, just not the ability to easily read it. So why send the file at all?

Regardless of the answer, this was a fun opportunity to learn a little about John The Ripper (JTR or just ‘john’). There are two versions of john. The normal release and the community “jumbo” release. So which do you use? It depends on what you want to do. Each has a different set of non-overlapping features, and the docs are not always clear on which does what. For the rest of this post I will specifically guide you through using john on OSX to crack a zip file.

Where Do I Begin

Zip support currently only exists in the jumbo release of john, so thats the best place to start, but right away you might notice that by default john is single threaded. Is there a mac today that isn’t multi-core? Cracking can take a long time, so we’ll want to use as much of the CPU as possible to make it faster. Luckily for me, the jumbo release supports OpenMP which can make parts of the program run in parallel.

Sadly for me, OSX Mavericks does not support OpenMP out of the box.

Why Sometimes I Hate My Mac

If only I ran linux, this would be so much easier. Of course many other things would be so much harder, but really Apple?

To build john with OpenMP, I need a modern version of gcc which Apple does not provide. In fact, I’m about to spend the next few hours setting up development environment just so I can build john.

  1. Download and Install Xcode via the AppStore (and grab a snickers, cause this is going to take some time)
  2. Once thats working, install the command line tools:
    1. open a terminal & run:
    2. > xcode-select
  3. If you are me, spend the next 1.5hours debugging why xcode-select doesn’t run (my Xcode install was totally messed up. It seems like some previous version didn’t get fully uninstalled and my environment was a mix of the two)
  4. Now download and install macports
  5. In your terminal, install gcc4.8 via macports (this will also take a long time):
    1. >  sudo port install gcc48
    2. > sudo port select –set gcc mp-gcc48
    3. > hash gcc
  6. OMG, 4 hours later, I’m finally ready to start on the actual project!

Setting Up John

UPDATE: As Mems pointed out below in the comments, you can just grab the jumbo version of john from macports as well (I’m assuming it is also built with openmp support):

> sudo ports install john-jumbo


Or you can compile it yourself and fiddle with more optimizations (which is likely unnecessary):

  1. Download and untar john (jumbo)
  2. Back in the terminal go to the john directory:
    1. > cd /path/to/john/
    2. > cd src
  3. Open the Makefile and uncomment this line:  MPFLAGS = -fopenmp -msse2
  4. Now build john:
    1. > make clean macosx-x86-64

Running John

UPDATE: If you installed john from macports, the tools below should already be in your path. See Mem’s comments below…

Before we can start cracking, we first need to setup an input file for john:

  1. > cd ../run/
  2. > ./zip2john /path/to/ > zip_hash.txt

Potentially the fastest way to crack the zip file is to use a dictionary attack. There are a lot of dictionaries/wordlists online, and john can iterate through them and through variations on the words in the list. Skull Security has a nice set to get you started. After you have downloaded one, then you can start running john:

  1. > ./john –wordlist=/path/to/wordlist.txt zip_hash.txt

If this doesn’t work, you can try brute forcing the password:

  1. ./john zip_hash.txt

Other features worth mentioning:

  • John might take several days (or even weeks) to crack the password. You can safely stop it at any time by hitting Ctrl-C. When you are ready to resume again, add the “–restore” option and restart john. It will pickup from where it left off!
  • It may not look like john is doing anything once you start it. Hit enter/return in the terminal and john will print the current status of what it is doing.
  • The activity monitor can show you how much CPU john is using. It should be more than 100% if openMP is enabled.

Viki LCD


Much like the Vision 3D printer, the Viki LCD did not come with any instructions or RAMPS firmware. The following are my notes for how I got it to work. Luckily most of the work was already done by others!

RAMPS 1.4 Connectors

See the RAMPS 1.4 image for exact placement. This RAMPS schematic was also useful to me.


  • 5V
  • GND
  • 20
  • 21

AUX-3 (SD Card):

  1. GND
  2. NC
  3. SCK/D52
  4. CS/D53
  5. MISO/D50
  6. MOSI/D51
  7. 5V
  8. CD/D49

ViKi – RAMPS Pinout

The Panucatt pdf for the Viki LCD has nice descriptions of the pins and their functions.

Mapping the Viki LCD to the RAMPS board

Viki Top plug – RAMPS 1.4:

  • 5V – 5V (I2C, +)
  • GND – GND (I2C, -)
  • SDA  – I2C 20 (I2C, 20)
  • SCL –  I2C 21 (I2C, 21)
  • ENC_B -(AUX4, D17) – requires update to pins.h
  • ENC_A – (AUX4, D16) – requires update to pins.h

Viki Bottom Plug – RAMPS 1.4:

  • CS – (AUX3, D53)
  • BTN – (AUX4, D32)  – requires update to pins.h
  • DI/MOSI – (AUX3, MOSI/D51)
  • CLK/SCK – (AUX3, SCK/D52)
  • CD – (AUX3, D49)
  • DO/MISO – (AUX3, MISO/D50)

The LCD comes will all of the cables broken out into single pins. I found it helpful to combine them into 4 new headers:

  • I2C (5V,GND,SDA, SCL)
  • AUX3 top (NC, CLK, D0, NC)
  • AUX3 bottom (NC, CS, D1, CD)
  • AUX4 (ENC_A, ENC_B)

This leave one remaining pin, BTN, which plugs into AUX4 at the end.

IMG_0131 IMG_0132


After much searching, I found Jim Morris’s comment on the Viki Kickstart page. After following his instructions, everything just worked! Here they are with a little more detail:

  1. > git clone 
  2. > git pull feature/add-vikilcd
  3. Download LiquidTWI from github
  4. Install the LiquidTWI library using these Arduino instructions
  5. Modify the Marlin/Configuration.h with the settings from your previous one. Do not copy it over. You need to edit the new one in place. It has additional configuration that is needed. Here is my new Configuration.h file.
  6. Modify pins.h to set BTN_EN1=16, BTN_EN2=17, and BTN_ENC=32. Or download my pins.h
  7. Compile and upload the new firmware and you should be good to go.

Printing Without The computer (“hostless printing”)

The RAMPS that ships with the Vision 3D printer should already have 2 key diodes installed (D1 & D2). If it doesn’t, or if you are running into issues, I found this SDRAMPS blog post very helpful.

In my case, both diodes were already installed, but still I couldn’t print without the USB cable. And after triple checking everything, I finally starting probing the RAMPS board and found a disconnect. Somehow I burnt out one of the traces (probably when I accidentally installed my end stops backwards). I soldered in a jumper over the burnt out trace and I was back in business.


Vision 3D Printer: Debugging Prints

Calibration Prints

Before printing anything real, it is useful to run some calibration prints.

Common calibration prints are cubes and lattice work:

NOTE: it may take you a few tries before you can even successfully print a full part. In my case, I didn’t first calibrate the extruder, so my prints failed with way too much plastic:



See this blog post for steps to calibrate the extruder. After fixing the STEPS_PER_MM for the extruder and Z axis, my next calibration print looked like this:

IMG_0123 IMG_0125 IMG_0126

In this case, my tolerances are fine for large parts, but the detail isn’t so great, and there is a stepping problem in the X-axis:


This looked due to the belt being too loose, so I tighten up the tensioner on it, and things are looking better, but I have yet to run another full calibration print.

Filament Keeps Jamming

My first real printer parts were large, and I wasn’t able to get through a complete print without the extruder jamming. After much digging online, my problem sounded like a tension issue with the filament. So I tightened up the hose clamp significantly, and now I’m printing jam free. So make sure you have enough tension on yours!



Low Quality Prints For Small Objects

Things have been printing well so far, but all of a sudden my quality went way down:

IMG_0128 IMG_0127


What happened? It turns out that because I was only printing two really small parts, not enough time had passed between the extruder returning to the same place twice. Basically each layer printed so quickly, the plastic didn’t have enough time to cool down before the next layer was applied. There are two solutions you can implement to solve this. You can either add a fan and setup slic3r to turn it on (I’m about to do this as it seems like the preferred way). Or as a quick workaround, you can add a pause between each layer in slicer. Check out this reprap post for details on adding a pause.

Why are desks so expensive?

We live in a small one bedroom loft which means we need to make as much as we can out of our limited space (the main room is split into a dinning room, den, office, and study). In 2006, I wanted a new desk, and as usual had a lot of trouble finding one that I liked and that fit the space and budget I had available. I also had the constraint that the desk could not have drawers. If it did I would instantly fill them with crap and they would never open again.

So when all else failed (and maybe just because) I built my own…


  • MDF 4’x8′ sheet (2)
  • Black counter top laminate (3 sheets)
  • Aluminum L brackets (We actually had these laying around. Way too expensive to buy)
  • Gorilla glue
  • Laminate adhesive (Not the eco friendly kind. That stuff does NOT work)


  • Router
  • Circular saw
  • Heavy duty straight edge
  • Clamps
  • Special laminate router bits


I iterated on the design in Google SketchUp until I was happy with it. Part of the challenge was getting the tabletop to fit into a single 4’x8′ sheet. SketchUp is a really amazing tool for this kind of stuff. Part of what makes it so great is that its easy to use and I can create design guides. Then later on when its time to make the parts, I can use the tape measure to get the dimension of any edges.



I traced out all the parts onto the sheets of MDF. To get the thickness that I wanted, I had to double each part and glue them together so this really required two sheets. I used wood glue and some good clamps to bond the MDF panels.


With the basic shapes cut out and glued, I then routed out the groves and cutouts for the aluminum brackets and bolts. The heavy aluminum stock also makes a great straight edge that I used to run the router along:


Here are the routed legs:



With everything routed, I inserted the bolts into the table top so that they were recessed and gorilla glued them into place. This holds surprisingly well.

Finally, I cut and glued the laminate sheets onto the MDF pieces and routed the edges with a special bit that keeps them from chipping.


I also painted the aluminum brackets just in case they might be visible to someone on the floor 🙂


And here is the final product:



Total cost $650. A little over budget, but still $2000 less than some of the other desks I liked. After so many years, the desk still looks like the day I finished it!

REKEA: storage + coffee table makes a better bench

After spending forever looking for the perfect sized bench/storage unit to fit the space next to our Tendo Mokko, we finally gave up and decided to just buy something “cheap” from Ikea. And as luck would have it, we actually found something we liked a lot. Here is how we hacked together some Ikea furniture to create something new that fits the space and has a little style.


Parts Needed:

  • LACK coffee table (white)
  • MALM storage unit (orange)
  • small flat washers (12)
  • 3/4″ wood screws (8)
  • plumbers tape

Tools Needed:

  • electric drill
  • ruler
  • screw driver
  • hand drill (or just a small drill bit and some tape)
  • sharpie

Almost A Perfect Match

The MALM storage unit and LACK coffee table are almost a perfect match. The MALM is 85cm wide, and the space between the legs of the LACK is 84.4cm. So close, but what to do about the 6mm difference? Its just enough that I couldn’t just wedge it in. So here is how I solved the problem…

Widening The LACK Table

I first assembled the LACK coffee table following the ikea instructions.


Then I assembled just the drawer of the MALM storage unit:


This let me measure exactly how much space I needed to create. Each unit will likely be different by some small amount.

My unit was too narrow by 6mm, which isn’t too bad given the tolerances of how the pieces join. To fix this, I took the LACK table apart and widened the mounting holes in the legs so that I could slide them to the end of the table top (normally they are inset by a couple of mm).

IMG_4037 IMG_4034

By adjusting each side just right, the legs can be widened enough so that they don’t stick out from the table top, but still leave enough room for the MALM storage unit.

Reconfiguring The MALM Storage Unit

The MALM storage unit has a lid that normally slides open, but I wanted it to be a pull out drawer, so I put the lid on the bottom and mounted the storage compartment on top. This was generally pretty easy. I mounted the slide rails to the storage lid as per the ikea instructions. And instead of mounting the rails to the top of the base, I mirrored the holes to the bottom of the cabinet.



One adjustment I had to make, was to use flat washers to space the rails off of the wood by a few mm so that the cabinet would slide on the lid.

With the lid now on the bottom, and the cabinet on the top, I had to secure the MALM to the LACK so that they would stay together. I just used some plumbers tape and wood screws to attach the two together. Note: make sure to screw into the edges of the furniture so that you grip into the particle board and not the hollow center.


With the straps in place, I covered them with felt pads so they wouldn’t scratch the floor. Then I turned the whole thing over and was done!


Next step is to make a nice cushion for the top…