Posts

To Over or Under Engineer?

Image
In which two groups of software engineers design and implement a fly-killing machine. Once Upon A Time... Two groups of software engineers, one favouring Java and another favouring Ruby, were asked to build a device that kills the common fly.  The product is supposed to kill this nasty creature. 1 Day Later The Ruby team announced the completion of the product. "The product has gone through extensive testing. During the tests, in which we mocked the size, movement pattern and speed of the common fly, the device performed with 80% efficiency", the lead engineer commented when asked by the press about the secret to their rapid development process. A photo of the finished product by the Ruby team "Suffice to say that we had to make some design and implementation sacrifices to cut the time to market and production costs" he commented briefly on the effectiveness of the product. 367 Days Later The Java team accomplished the design of the product. "W...

Forth Interpreter and Abstract Machine

Image
Forth interpreter and abstract machine illustrated in one image. Forth has such a strikingly well thought out simple execution model that it can fit in one small diagram:

Grab Packt With Groovy

Automatically claim Packt's free e-books with a Groovy program. Introduction Packt Publishing has launched a new programme called " free learning offer "; each day they put an e-book for free on their website to download: one only needs to login to Packt's website and click on the "claim your free book" link. Following Grab Packt with Racket, here is the Groovy version, to automatically add the e-book to your Packt account for later downloads. The Code The code is in public domain. You can get it directly from is.gd/isbviw or from my github gist . For this to work you need to replace YOUR-EMAIL-ADDRESS (line 26) and YOUR-PASSWORD (line 27) with reasonable values. If you wish to run this from shell/cron remember to add #! /usr/bin/env groovy to the top of the file. The script is completely self-contained as @Grab annotation on line 4 fetches the dependencies it requires. /** * @author Bahman Movaqar */ @Grab('org.jsoup:jsoup:1.8.2') i...

Grab Packt With Racket

Automatically claim Packt's free e-books with a Racket program. Introduction Packt Publishing has launched a new programme called " free learning offer "; each day they put an e-book for free on their website to download: one needs to login to Packt's website and click on the "claim your free book" link. A nice fellow, wrote some Javascript code (nodejs) to be able to automatically claim a book, for example by calling the code from a cron job. He named the code "grab_packt" and has made it available on github . To me it is not fair to have only a Javascript version! So I decided to give it a go with different languages. This time I'll present the version written with Racket . The Code The code is in public domain. You can get it directly from is.gd/iRF96N or from my github gist . For this to work you need to replace YOUR-EMAIL-ADDRESS (line 24) and YOUR-PASSWORD (line 25) with reasonable values. If you wish to run this from shell/cron ...

aria2: An Ultra Fast Download Manager On Linux

Image
Introducing one of the fastest download managers in the universe: aria2. Introduction aria2 is a brutally fast and very feature rich download manager available for Linux platform. It can handle almost any kind of download you can ever imagine (FTP, HTTP, BitTorrent, SFTP, ...). You can install it by simply running sudo apt-get install aria2 at the command line or by using Ubuntu Software Center (if you're on Ubuntu). How To Use First add the following line at the bottom of your .bashrc (or .bash_profile depending on your distro). alias aria2c='aria2c -c -x5 -s10 -m0' This practically replaces the original aria2c command with a pre-configured one that tries to resume the download in case of a disconnect or failure for each download establishes up to 5 simultaneous connection to the server downloads a file using 10 connections/segments retries indefinitely in case of failure to connect to the server Remember to close the terminal and open a new one, for this ch...

More Thoughts On A JVM-Based Forth

Image
Wrapping up the fundamental design challenges for a Forth implementation on JVM. Introduction This post is the continuation of the ideas discussed earlier in my previous post Thoughts On JVM-based Forth Implementation (please read it if you haven't done so yet), in which a general execution model and an overall stack design was introduced. However, three major topics were either very shallowly discussed or were left untouched. They shall be covered in this post. Level of Abstraction Forth was designed in a period when RAM was an incredibly expensive resource to equip your system with; during the absolute reign of micro-controllers and custom-made boards/systems where 64KB of RAM would have been considered a luxury. Therefore it was designed with almost no abstractions over the raw hardware to allow full utilisation of it by the systems programmer. Nowadays, however, 2GB of RAM is a normal specification for even a cheap laptop [1] . And general programming focus, thanks to high...

Responsibly Upgraded Your Lisp Machine!

Image
=== ALL USERS PLEASE NOTE ======= Compiler optimizations have been made to macro expand LET into a WITHOUT-INTERRUPTS special form so that it can PUSH things into a stack in the LET-OPTIMIZATION area, SETQ the variables and then POP them back when it's done. Don't worry about this unless you use multiprocessing. Note that LET could have been defined by: (LET ((LET '`(LET ((LET ',LET)) ,LET))) `(LET ((LET ',LET)) ,LET)) This is believed to speed up execution by as much as a factor of 1.01 or 3.50 depending on whether you believe our friendly marketing representatives. This code was written by a new programmer here (we snatched him away from Itty Bitti Machines where he was writing COUGHBOL code) so to give him confidence we trusted his vows of "it works pretty well" and installed it. From Linux fortune cookies Image source billyfung2010.blogspot.com

Syntax Intuitiveness aka IQ Test

Image
A simple and real world lesson on programming language syntax intuitiveness. Introduction As a polyglot I have coded with dozens of languages, ranging from Lisp and Forth to ML and Java and even Ruby (yes, I confess!). I have seen many programming constructs and syntaxes that hardly anything surprises me (beyond Javascript). Most of the times I can somehow understand a code that is written in a language that I do not know (like Haskell). However, to put an end to my arrogance, the gods pushed me in a direction to see something such non-intuitive and mysterious that made me search the web to just roughly understand what it does. The Puzzle I was reading a piece of C++ (the almighty!) code and stumbled upon a line like below: int main() { //... aName otherName(...); //... } I tried to make sense out of line 3; I tried hard but got nowhere. "What on earth is that? Looks like a method definition but it's not....um...um...um...what the...!?" A search for aName in...

A Tale Of King and Evil or How I Made Peace With Ubuntu!

Image
In which I tell how Ubuntu won my trust back. Once Upon A Time... I used to be a fairly happy Ubuntu user from 2008 to 2011 (shh! I was a faithful FreeBSD and KDE 3 user before that). I could concentrate on my job and my desktop didn't get in my way. I didn't spend any of my time trying to configure things the sane way. A Kingdom Without An Heir But things changed by the double blow of Gnome 3 and Unity. Introduced at almost the same time, they ruined my IT life and destroyed my productivity. Seriously. Only gods know, how many hours (instead of happily coding) I spent fiddling Gnome 3 or Unity to have a responsive desktop that behaved like a desktop is supposed to: not get in my way! I switched to Ubuntu Gnome to find myself unsatisfied, and then back to KDE 4, and despite it being really cool, found it not for my type. Then tried XFCE and quickly learned it was a mistake. The Era Of Pain And Chaos This state of distress pushed me to the point that for almost 7 months I ...

Command Line Options: How To Parse In Bash Using “getopt”

Image
Use “getopt” in a Bash script to parse long and short command line options, enforce arguments for some options and spot dubious user input. Most of the times, when you need to automate system administration tasks on your Linux machine, writing a Bash script is your best bet. And sometimes, you need to be able to control the behaviour of your script at some point which leaves you with two choices: use environment variables (set before running the script) as sort of a flag or the better and more intuitive way to use command line arguments. What is "getopt"? getopt is a program that parses command line options in shell scripts. It is the enhanced version of older getopts and uses the getopt C library to do its job. It is compatible with getopts as long as GETOPT_COMPATIBLE environment variable is set, however some of it best features are not available in compatibility mode. An overview of command options Command line input is viewed in 3 categories by getopt: short ...