Welcome to
Caches to Caches

This blog is devoted to the broad interests of Gregory J Stein, which includes topics such as Numerical Modeling, Web Design, Robotics, and a number of my individual hobby projects. If there's any article you would like to see, or something you've been wondering about, be sure to let me know on Twitter.


The original motivation for this post was the first homework prompt I encountered in graduate school at MIT, while I was taking a course on linear optics:

The course was taught by Prof. Jim Fujimoto, who pioneered optical coherence tomography.

Describe the Physics behind Maxwell's Equations.

Deceptively simple, the prompt was designed to encourage me and my peers to think more about the physical implications of the well-known Maxwell's Equations, which detail the behavior of electromagnetism, one of the fundamental forces of nature. Our responses were not supposed to be steeped in derivations or overly sophisticated equations, but were instead supposed to build intuition. I was quite proud of my response (and it earned the highest grade in the class), so I have included it here in an effort to convey my passion for these elegant, and profound, equations.

Here, I aim to delve into the fundamentals of electromagnetism, with the goal of making this post accessable to those who may not have a particularly strong mathematical background while including enough analysis so that it may be useful and interesting to those who do. More than anything, the purpose is to imbue the reader with some of the physical intuition behind electromagnetism.


On the heels of President Obama's recent pledge to increase funding for computer science education in U.S. schools, I worry about the future of education in the discipline. Without a doubt, teaching students how to program is a must for ensuring that the United States can modernize its workforce and compete on a global scale. However, the ways in which programming is taught in schools often lacks real grounding, and effort needs to be made in order distance general education in computer science from the training given to computer scientists.

The purpose of learning how to code is not to become an expert programmer (just as learning mathematics is not for the express purpose of creating mathematicians), but is to allow people to recognize when a little bit of simple programming can save a huge amount of time and effort. Many introductory and online courses in programming focus too much on abstract skills and not enough on how these skills can be practically applied.

Abstract skills, like algorithms, are assuredly important, but when was the last time any of you coded your own merge-sort.


Since I started using Ubuntu on more of my machines, I've encountered myriad issues relating to the wireless internet. Every few minutes, my wireless internet would simply dropout without warning and often without even realizing that the connection had vanished. Reconnecting was a nightmare, and was frequently most easily accomplished by simply rebooting my machine. Even when the wireless was 'working', pinging google.com (with ping google.com) would be slow and unreliable. Worst of all, this issue would often even limit my ability to get any work done for stretches of time, not to mention that it would invariably put me in a foul mood.

Admittedly, this post is mostly for my own reference, since it's decently well documented online if you know what you're looking for. However, if it can be helpful to any of you, that's motivation enough for putting this here.


Of all the packages I use to enhance my productivity in emacs, use-package is perhaps the most useful. With it, I can automatically download and install other packages from the emacs package databases when it detects they're missing. Since I'm constantly switching computers, virtual machines, and operating systems, having this functionality is essential for making sure I don't miss a beat when I'm starting from scratch; I simply clone the emacs config files from my GitHub repository and open emacs and I'm almost immediately ready to go.

This short guide shows how to ensure that use-package also automatically installs, and how to get the most out of the use-package features.


There are a number of different technologies which have gone into creating this blog. Now that it's mostly complete (though I'm constantly tweaking its look), I figure I should give a list of these different tools so that someone can use it as a starting point for their own site. Though I've created a blog, many of the steps I've gone through are useful for anyone creating a small, content-driven website of their own.

In short, this site (and my personal website) are hosted on a single Amazon T2.micro instance using Django and Apache and formatted using Bootstrap (and modified using Less). However, there's much more to it than that. I also made my mark in social media, being sure to get the pages associated with my site. See more details after the jump.


I do a lot of work using C/C++ for my research. As projects grow in size and the number of contributors increases, it becomes increasingly difficult to keep track of even the most commonly used classes and their parameters and methods. I rely on emacs to do most of my code editing, so ensuring that I have a code-completion setup within it is essential. I rely on company-mode, short for 'complete anything' for completion using additional software behind the scenes. Company is a fantastic and rather popular framework for completion within emacs. Users can create functions, known as 'company-backends', which each return a list of completion matches.

For my needs, I've become fond of using both irony, which relies on libclang, and gtags, which is a part of GNU GLOBAL. Irony is the smarter engine, capable of completing variables defined within the function and, to some extent, classes in included header files. By contrast, gtags searches the entire project directory, resulting in a cruder yet more comprehensive search. Between the two of these, I haven't needed any others.

Continue reading for more.


No, there's no typo in the title. Koding is a nice platform for building code online. Today we're going to be setting up a Koding instance, installing Django on it, and displaying its equivalent of a "Hello World" message.

Doing this on a Koding server has a couple of advantages. Not only are you using a fresh computer to do your development, something which is nice to do every once in a while, but you can develop your application collaboratively in real time, and use the Django runserver command to host web pages for short periods of time and show them off to your friends and family on the web.

Also, did I mention it's free?