Heartbeat-style Failure Detector using Gossip

I recently started part-time Master’s degree at University of Illinois Urbana-Champaign. It has been on my bucket list for a long time, and I finally got the chance to do it. One of the courses I’m taking this semester is distributed systems. In my day job, I come in contact a lot with distributed systems, and this course so far has helped me tremendously in understanding a lot of the basic concepts of them.

Run Your Own Home DNS on coredns

I have been running my home DNS on a pair of RaspberryPi’s for some time now. The main reason for running my own DNS server is to utilize the excellent pihole project to block 3rd-party ads from being served to my home network. I ansiblized the config files. It has been running great for a couple of months. Recently, I have acquired an orangepi, a RaspberryPi 3 and a new desktop.

TIL - a static site for your notes

A couple of years ago I was introduced the idea of TIL (Today I Learned) and the habit of noting down things I learned that are note-worthy. Since then I’ve been looking for a perfect system that would allow me to: record what I learned quickly and efficiently version control the notes browse the notes either via vim or via browser search through them using keywords I tried a couple of ways:

QCon San Francisco Recap

The big day has finally arrived. I’m here at QCon, a conference I have been tracking for a long time almost since the beginning of my career. Now, almost 10 years after, thanks to my employer, I’m finally able to attend one in person! In this blog post, I’m going to recap these three talk-packed days and record my learnings here. Key Note - How to make a spaceship (Julian Guthrie, Dan Kreigh) The keynote is given by Julian Guthrie and Dan Kreigh who together wrote a book How to make a spaceship.

Campfire Story - The "peril" of `dev`

Through out my career, I have investigated and solved numerous bizarre issues. This one is right up there as being one of the weirdest as well as being one of the most hilarious ones when the truth came out in the end. At $DAYJOB, we are moving piece by piece our services to Kubernetes. One of such service slated for migration is the Gitlab runners. If you’re not familiar with Gitlab, it’s like Github you can self-host and it boasts a very powerful and flexible CI/CD pipeline.

Kubernetes Learning Notes - Part 5 - Horizontal Scaling and Rolling Upgrade

Some of the promises of Kubernetes are scaling and rolling upgrades. In this blog post, we’re going to try these out for our service to see how easy it is to achieve these operations which are otherwise difficult to do without a container orchestration tool. Horizontal Scaling When we wrote the manifest for overmind deployment, we specified that we want 3 replicas of pods for this deployment. We can scale up the number of replicas to handle increased traffic by using kubectl scale command:

Kubernetes Learning Notes - Part 4 - Service Bootstrapping with Init Containers

Up until now, we have deployed the overmind service to the Kubernetes cluster, deployed the backing CouchDB service and wired up the two services through service discovery. Web services usually have administerial tasks, such as bootstrapping a database. It’s usually a good practice that individual services are responsible for their own data initialization. This is where initContainers come in handy. Init Containers Init containers run inside the same pod as your main container (such as the container that runs the microservice), just like any other containers.

Kubernetes Learning Notes - Part 3 - Service Discovery

In the last two blog posts, we’ve set up our overmind service and the backend CouchDB service. How would the overmind service find out where the CouchDB service is? That’s where Service Discovery comes in. In Kubernetes there are two ways to do service discovery: environment variables and DNS records. Environment variables Every Service deployed in Kubernetes automatically gets a set of environment variables accessible to all pods. e.g., if the service name is couchdb, other pods will be getting the environment variables such as the following:

Kubernetes Learning Notes - Part 2 - Deploying Stateful Services

In the last part of this series, we learned how to do a basic deployment of a stateless service. You may ask what about our CouchDB service? How do we deploy a database which is innately stateful to a Kubernetes cluster. Kubernetes 1.5+ has introduced Stateful Set feature which makes this possible. Stateful Sets According to the docs, a stateful set provides containers with the following: stable and unique network identifiers stable persistent storage ordered, graceful deployment and scaling ordered, graceful deletion and termination For deploying CouchDB, we need to deploy a stateful set of CouchDB containers which allows us to attach a persistent storage to the container so our overmind service does not lose its data.

Kubernetes Learning Notes - Part 1 - Deployment

Welcome to the first part of my Kubernetes learning notes series. In this blog post, I’m going to record my learning experience for deploying the overmind web service to a Kubernetes cluster. The overmind web service is a simple and contrived microservice for managing zerglings. Don’t worry if you’re not a starcraft fan. The details of the web service doesn’t really matter. The web service has a couple of endpoints, some of which involve talking to a database.

Kubernetes Learning Notes - Introduction

Parts Part 1 - Basic Deployment Part 2 - Deploy Stateful Services Part 3 - Service Discovery Part 4 - Service Bootstrapping with Init Containers Part 5 - Scaling and Rolling Upgrades Goals At $DAYJOB we’re moving away from our homebrew way of deploying and “orchestrating” docker containers to the promise land of Kubernetes. To solidify my learning, I’m going to practise what I learn by coming up with a hands-on project deploying a simple dockerized microservice with a database backend onto a Kubernetes cluster.

CouchDB Indexing Benchmark

In the last post, we discussed how CouchDB’s external query server works by examining the raw protocol. In this post, we’re going to take a look at the performance of different query servers. The code used in this benchmarking is here. I listed below the method of the benchmark in detail. If you want you can jump to conclusion. The Setup The benchmarks are done on my laptop (Intel 6th-gen i7 processor, 8G RAM, SSD) with CouchDB 1.

CouchDB Query Protocol

Recently at $DAYJOB I had the opportunity to look deeper into how CouchDB indexing works and compared the performance of different indexers. Hopefully this series of articles will shed some light on how to get the most out of CouchDB’s view indexing. In this article we’ll be going over the concept of CouchDB views and find out just how CouchDB indexes documents with the help of external query servers.

Digital Ocean Published My Article!

Digital Ocean just published my article on How to setup Review Ninja on a Digital Ocean droplet using docker-machine and CoreOS. They have high standard for their articles, e.g., every step has to be crystal clear and assume the audience is blank slate. Their editors are technical. The editor I was assigned to was Brian Hogan who wrote the tmux book which I have read and loved a few years back.

Docker Security

DockerCon 2016 is here and this is the very first day with workshops on various topics. I chose to attend the Docker Security workshop as I’m interested in seeing how Docker tackles some security challenges. This blog post is my notes taken from the workshop. In order to talk about security, we first have to know how docker works on a higher level to know what to secure. The workshop addresses that question early on.

Ruby for Pythonistas

It’s been 11 years since I first encountered Python, and it’s been my favourite programming language ever since. However, I’ve always been curious about the Ruby language. On the surface, they have a lot in common: both dynamic, object-oriented, interpreted, vm-based, and optimize for developer happiness rather than machine speed. However, they have quite different data models, syntax and community culture. This post is a summary of my journey learning Ruby as a seasoned Python developer, and my thoughts comparing these two popular languages.

Docker...root...root...Docker (a.k.a. the docker group is a backdoor)

While working with docker related stuff and when I use volume mount to a subdir of my home dir, I always come across the issue of the container littering folders with root:root permission in my home folder and then I have to sudo rm ... it, for example: docker run -d $(pwd)/data:/var/lib/mysql/data mysql It always annoys me but today, it came to me like an epiphany that this is actually a pretty severe security vulnerability.

Software Engineering Podcasts Review

UPDATE: I’ve got a lot of great comments here and on reddit. Thanks everyone for the suggestions. As software developers, we need to always keep learning and keep ourselves up-to-date with what’s happening in the industry. Listening to podcasts is a great way to do so for myself since I have a 2-hour commute every day. In this blog post I’m going to review software engineering podcasts that I frequently listen to and hopefully this post will be remotely useful to anyone looking for software podcasts.

Use Python bytecode to solve puzzler

Learning Python Internals Recently I stumbled upon this wonderful set of videos on Python interpreter internals. (Thanks to Philip Guo for creating them and thanks to Michael Kennedy (@mkennedy) and his Talk Python to me show that brought this on my radar) I’ve been using Python for about ten years but I’ve never really truly been able to understand how the interpreter works, nor was I familiar with the Python virtual machine or the bytecode.

Use Python bytecode to solve puzzler

Learning Python Internals Recently I stumbled upon this wonderful set of videos on Python interpreter internals. (Thanks to Philip Guo for creating them and thanks to Michael Kennedy (@mkennedy) and his Talk Python to me show that brought this on my radar) I’ve been using Python for about ten years but I’ve never really truly been able to understand how the interpreter works, nor was I familiar with the Python virtual machine or the bytecode.

Use rabbitmq DLX to implement delayed retry

In this post, I’m going to describe the experience at $DAYJOB regarding implementing delayed retry using rabbitmq’s DLX combined with a TTL. The technique has been described at a few places but it is new to me personally and our company. I’d like to capture the experience we had both in implementing and in deploying to production. The problem At $DAYJOB we have a service that integrates with a 3rd-party API that processes credit card payments and when successful, records a payment object on our customer’s invoices, and change the invoice status.

Use rabbitmq DLX to implement delayed retry

In this post, I’m going to describe the experience at $DAYJOB regarding implementing delayed retry using rabbitmq’s DLX combined with a TTL. The technique has been described at a few places but it is new to me personally and our company. I’d like to capture the experience we had both in implementing and in deploying to production. The problem At $DAYJOB we have a service that integrates with a 3rd-party API that processes credit card payments and when successful, records a payment object on our customer’s invoices, and change the invoice status.

MySQL EXPLAIN explained

Below is my notes from watching the MySQL’s EXPLAIN demystified webinar. All credits go to Baron Schwartz for this excellent intro to MySQL’s query explain. How does MySQL execute queries? SQL => Parse Tree => Execution plan The execution plan is a data structure, not byte-code The executor makes storage engine calls Execution plan “Deep left tree” – always Explain output columns id which SELECT the row belongs to Labelled sequentially complex select: subquery: numbered according to the position in SQL text derived: executed as a temporary table union: fill a temp table, then read out with a NULL id select_type simple: there’s only one SELECT in the whole query, select_type is PRIMARY complex: subquery: numbered according to the position in SQL text derived: executed as a temporary table union: fill a temp table, then read out with a NULL id table table name or alias <DerivedN>, N correspond to id <unionM,N>, M, N correspond to id type describes how MySQL will access the rows Possible values: ALL: table scan index: full index scan range: range of an index ref: value as a reference to look into an index if rows in the index match the value eq_ref: like ref but unique (unique index or PK) const system: does not require accessing a table, e.

First dip into Golang's concurrency

I have been toying with Google’s Go language lately. The native support for concurrent programming is one of Go’s major selling point. Go has low-level primitives for concurrent programming such as mutexes and atomic, but also provides high-level language constructs for building concurrent programs via goroutines and channels. Goroutines are functions executing in the same address space as other goroutines, like threads, but unlike threads, they communicate to each other via channels, not shared variables.

Stripe Capture The Flag 2.0 - Problem 3

Level 3 Finally we get to level 3. Here’s the setup: After the fiasco back in Level 0, management has decided to fortify the Secret Safe into an unbreakable solution (kind of like Unbreakable Linux). The resulting product is Secret Vault, which is so secure that it requires human intervention to add new secrets. A beta version has launched with some interesting secrets (including the password to access Level 4) Here’s the code for the server (Python finally!

Stripe Capture The Flag 2.0 - Problem 2

Level 2 In level 2, we’re faced with a PHP app that allows you to upload a “profile picture”. The password to level 3 is contained in a “password.txt” file of the document root, as revealed in line 49. Of course, you won’t be able to click on the link and get the file. The directory is protected, and we have to somehow exploit the code. Reading through the code, it’s a clear that whatever file uploaded to the server will be under uploads/, and the file is publicly accessible through <base>/uploads/<your_file_name>, as seen on line 37.

Stripe Capture The Flag 2.0 - Problem 1

Level 1 Now we get to level 1. We are presented with a simple web form with the PHP code powering it. The PHP script checks if the input combination matches the combination in ‘secret-combination.txt’ file, and present the user with the password to the next level if the combinations match. Obviously, we’re not going to guess the combination. There are a few ‘handy’ methods in PHP that are extremely dangerous.

Stripe Capture The Flag 2.0 - Problem 0

Stripe just finished running a second “capture the flag” challenge. They ran a similar challenge this February and was more focused on system level. This time, it’s full-on web security. In the next few posts, I’m going to discuss the problems in the challenge, how I solved them and what did I learn from from each challenge. Problem 0 Here are the code for level 0: So you have a node.

Statically Yours

Migrating from wordpress to octopress I’m not an avid blogger but like everyone else, I have a blog which I casually write about life and programming. Being hosted by wordpress, it was an out-of-the-box solution and comes with a lot of bells and whistles. However, for a programming blog, it has some significant shortcomings: Conflation of content and style. A Wordpress post is written in a weird combination of HTML markups and custom wordpress macros, which means you have to rely on their WYSIWYG editor to generate the correct markups, which means you can’t use your favourite editor to write a blog post.

Use Python's sys.settrace() for fun and for profit

The itch to scratch Everyone in the software industry knows Kent Beck, the pioneers of extreme programming and test-driven development and the co-author of JUnit. One of his lesser known project was JUnitMax, which aims to reduce the time developers have to wait while tests are running. One of the ideas behind that is that when code changes, only the test cases that exercise the code need to be run, instead of running the entire suite.

Realtime notification delivery using rabbitmq

Our company has “hack-off” days once a while, where we developers get to choose whatever we would like to work on and present it to the entire company by the end of the day. I have been hearing this websocket buzz for a while now and would like to build something interesting with it. WebSocket Websocket is a persistent bi-directional connection between the browser and the server. With websocket, web browser can post message to the server, but what’s more interesting is that the server is able to push messages to the client (browser).

Writing a Simple Clojure Library

I’ve been learning/using Clojure on and off for about 2 years. The lispy syntax isn’t a deterrent for me at all, in fact, I’m quite fond of it and consider it very elegant. However, it does take some time to get used to. I don’t use Clojure or anything remotely close in my day job, but I love to find something useful to implement using Clojure. In the past few days I found such niche.

Building a Google Reader plugin using Chrome extension

OK, ok, I understand. The title is a bit misleading. Google Reader isn’t open for 3rd party plugins, and there’s no indication that Google will ever. However, with Google Chrome extension, we can build such local “plugins”. What are we going to achieve? Anyone uses Google Reader to read DZone feeds? I do. DZone is a very good tech news aggregator and you can vote and comment on stories. With Google Reader, you get DZone feeds like the following.

Spectrum.vim - My first Vim plugin

ver the past few months, I’ve been using Vim as my primary development tool at work and at home, and I have to say, I’m addicted to it! I’m thinking about writing a blog post of why I get hooked on walking without crutches, but for this post, I’m just going to introduce you to my first plugin in Vim - Spectrum. Introduction Spectrum is a vim colorscheme roulette. Ever getting tired of staring at the same colorscheme every day?

Scala Simple Build Tool -- Not so simple after all

Update: I got sbt working by building directly from the master branch from their github repo. The current version is 0.7.5. The tagged 0.9.4 version is actually an older version. Anyway, tried it and kinda loved it. This is just another late night rambling…I was trying to get a proper scala build system setup. I was using Maven scala plugin for a while, but longing for something simpler and more scalanic (is there such a word?

Write sudoku solver in Clojure

…yeah, because the world just needs another Sudoku solver. Well, I’m not trying to solve world hunger with it, but just an attempt to practice clojure, I took (read: stole) Peter Norvig’s sudoku solver algorithm (written in Python) and adapted it into Clojure. I put it up on Github under sudoku-clj. The algorithm itself isn’t that hard to understand. The porting to a lisp-y syntax made the code a little longer than its Python counterpart.

Cake - the yummy Clojure build system

About 10 minutes ago I heard about cake clojure build system, and gave it a try. And 10 minutes later, it won me over! Wow, it addresses all the pain points of leiningen. BLAZINGLY FAST!!! Sorry for using all CAPS but I’m very excited about this improvement over leiningen – OK, it may not be the fault of leiningen that JVM cold startup time is non-trivial but hey, someone came up with an idea of having a long running JVM process in the background, so subsequent clojure tasks reuse the same JVM instance.

New Year's Resolution

2011 here we come! In the spirit of continual learning, I’m going to write down the technology I’d love to learn this year. Haskell Now that I’m more interested in functional languages, I’d love to look into this “pure” functional language that inspired countless other ones of its kind. Lift Last year I scratched the surface of Scala, a hybrid JVM language. I’m very fond of it, and think it has tremendous potential.

Use Python decorator to curry functions

It’s been a while since the last time I wrote about Python. This morning, I was listening to a podcast on my way to work. They were discussing functional programming and dynamic languages…I learned Python before I went into Computer Science, and then I learned about functional programming and through learning of Scala and Clojure, my functional programming concepts have been enriched. As I was listening, it suddenly appeared to me that there isn’t a way in Python to curry a function.

My impression on Scala so far

I’ve been exploring Scala on and off for some time now. Here’s my highly subjective and very limited impression of Scala. What I like about Scala: 0) It’s statically-typed language. That’s right! I don’t care what you ninjas say. As much as I love dynamic languages, I just prefer statically typed language for big projects. The benefit of having type information is enormous for a project with a large code base.

Use function currying to reduce repetition and make code clean

Lately, I’ve been writing a parser using the Scala parser-combinator framework to parse some saves from a game. As a responsible programmer (:P), I write unit tests for each rule. However, I found myself having to write the following code over and over again: @Test def testRule1() { parserRule.apply(new CharSequence("someInput")) match { case Success(result, _) => { assertEquals("expected", result) /* other asserts if the result is a collection of something else */ } case NoSuccess(msg, _) => fail(msg) } } It’s worth noting that you cannot pass in a string value to a Parser.

Finding Happy Numbers using Scala

The problem was posted on Programming Praxis. The algorithm itself is pretty straightforward, anyone can do it with a few if/else/fors, but to coerce myself to think functionally, I decide to practice writing it in Scala. A number is a happy number if the sum of square of its digits eventually arrive at 1. For example, 7=>72=49=>42+92=97=>92+72=>130=12+32+02=10=>12+02=1, so 7 is a happy number. 17 is not a happy number because by applying the above process, it goes into a loop.

Launch Windows Explorer and goto the current working directory in shell

I like working in the command prompt - it’s fast and you can do batch processing, etc, but sometimes, I need a GUI (Windows explorer) to explore files in the current directory. I know I can type “explorer.exe” on the command line to launch Windows explorer, but can it automatically go to the directory I’m working in? The answer is yes, although hardly ever advertised Now, we need to find a way to find out the current working directory.

Google IO 2010 is here

This year’s Google IO conference is finally here! I don’t want to sound like a fanboy but I benefited a lot from last year’s IO sessions and looking at this year’s session list, I’m sure I won’t be disappointed. This year’s keynote speech is an overview of Google’s strategy to bring web to the next level. It seems HTML5 is rapidly gaining grounds. Although the specification is not finalized yet, many of the new features are already implemented in most modern browsers, such as AppCache, WebSQL, LocalStorage, Web Worker, and WebSocket.

GWT code split is awesome

For the past few days, I’ve been working on code splitting our existing GWT application. The application is fairly big with about 20k loc (excluding javadoc, comments and tests). The download size (with obfuscated mode) is about 1.5M, and with pretty mode, is a whooping 10+M. Obviously this is not acceptable. GWT2 provides developer guided code splitting feature. It sounds complicated and under the hood, it may very well be (involves a lot of graph theories to figure out dependencies and so on) but from the user’s point of view, it’s very easy.

Building a GAE+GWT application using the best practices (Part 5)

Building a GAE+GWT application using the best practices series Part 1 Part 2 Part 3 Part 4 Part 5 In the last post of the series, I’ve shown how to setup a client side GIN+MVP project. This post will discuss the actual building of the UI and GWT-RPC web service calls using GWT-Dispatch on the client side. Use cases Before we dive into the code, let’s go over again the use cases our little app has.

Building a GAE+GWT application using the best practices (Part 4)

Building a GAE+GWT application using the best practices series Part 1 Part 2 Part 3 Part 4 Part 5 In the last blog post, we went over how to write GWT-RPC handlers using GWT-dispatch and dependency injection (Guice). This section, we’re going to see how the client side is set up. Dependencies We need the following dependencies * Gin * GWT-dispatch * GWT-presenter * GWT-log They need to be on the classpath when you compile your GWT code, but not under the war directory like the server dependencies need to be.

Building a GAE+GWT application using the best practices (Part 3)

Building a GAE+GWT application using the best practices series Part 1 Part 2 Part 3 Part 4 Part 5 In this part of the series, we’re going to explore the designing of the web services for RateChecker and coding them using the command pattern from GWT-dispatch based on Ray Ryan’s presentation. The big picture To correctly implement web services using the command pattern, we first have to get the big picture.

Use delegation to write map/filter in Java

The problem In Java, imagine you have a list of User objects, each encapsulates the user’s id, first name, last name and age. Then you want to call a web service UserService.deleteUsersByIds(List<Integer> userIds) to delete the users from your data store. It doesn’t sound too hard, does it? All you need to do is to transform you List<User> to List<Integer>. So you go ahead and write the following code:

Building a GAE+GWT application using the best practices (Part 2)

Building a GAE+GWT application using the best practices series Part 1 Part 2 Part 3 Part 4 Part 5 In Part 2, we’re going to go over project setup for GAE and GWT applications, and wire the server (servlet) using Guice and GWT-Dispatch. Project setup I’m using Eclipse as my development environment. Install Google Eclipse plugin, and install the provided GWT (2.0.2) and GAE (1.3.1) with the plugin.

Building a GAE+GWT application using the best practices (Part 1)

Building a GAE+GWT application using the best practices series Part 1 Part 2 Part 3 Part 4 Part 5 This is the first installment of the series Building a GAE+GWT application using the best practices. Introduction In the next few blog posts, I’m going to present my experience building a simple (but non-trivial) web application using GWT and Google App Engine, while applying the best practices introduced by Ray Ryan in his excellent GWT best practices at Google IO last year.

GXT Widget Expander 1.0 release

This project aims to add flexibility to GXT row expander by enabling putting arbitrary widgets in the expanded row. GXT’s grid widget is great, especially with the RowExpander plugin, it allows the creation of a Google Reader style grid (a list with expandable rows). However, the current GXT’s RowExpander design only allows rendering by XTemplate. XTemplate falls short in a number of ways, especially when it comes to user interaction inside the expanded rows.

Setting up GWT2 project with gwt-maven-plugin

GWT2 offers a lot of exciting new features: OOPHM, SOYC, code splitting, declarative UI, to name a few. This evening, I experimented setting up a GWT2 project using Codehaus’s gwt-maven-plugin. I’m using Eclipse, so obviously, you need m2eclipse and Google Eclipse Plugin. First step is creating a Maven project: File->New->Project...->Maven Project In the archetype selection dialog, select org.codehaus.mojo.gwt-maven-plugin:1.1. We choose this to create an archetype but 1.1 doesn’t work with GWT2.

Solving a GWT deferred binding mystery

This morning at work, I was running our GWT application with some deferred binding logic in it, and all of a sudden I got this ridiculous message: [ERROR] Class 'mycompany.rebind.HistoryResourceGenerator' must derive from 'com.google.gwt.core.ext.Generator' [ERROR] Failure while parsing XML com.google.gwt.core.ext.UnableToCompleteException: (see previous log entries) at com.google.gwt.dev.cfg.ModuleDefSchema$ObjAttrCvt.convertToArg(ModuleDefSchema.java:729) at com.google.gwt.dev.util.xml.HandlerArgs.convertToArg(HandlerArgs.java:64) at com.google.gwt.dev.util.xml.HandlerMethod.invokeBegin(HandlerMethod.java:214) at com.google.gwt.dev.util.xml.ReflectiveParser$Impl.startElement(ReflectiveParser.java:257) at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(Abstract...) It was running fine yesterday when I left work, and now it tells me that my generator isn’t a subclass of the GWT Generator?

Setting up a Clojure Project with Maven

In this blog post I’m going to record my recent experience in setting up a Clojure project using the clojure-maven-plugin. Clojure-Maven-Plugin First you need to compile the plugin from source: git clone git://github.com/talios/clojure-maven-plugin.git cd clojure-maven-plugin mvn install Of course, you will need to have Maven2 installed already. After that, the compiled plugin jar will be in your maven local repository. Create a pom.xml file to use the plugin. I’m using the pom.

Programming Collective Intelligence in Clojure

They say the best way to learn a new programming language is by programming in it. Therefore I’m starting this project converting algorithms in the book Programming Collective Intelligence into Clojure, while learning the best practices and language idioms during the process.

I’ve created a GitHub project for this. I’m not sure how far I’m able to go but let’s see.

Explore Clojure: Building a Bifid cipher

Lately I’ve been teaching myself Clojure, a Lisp dialect on the JVM platform. I still love Erlang and still learning it, but Clojure has a special draw for me being a JVM language and its Lisp roots. I studied Scheme (another Lisp dialect) in my college years and deemed it purely academic. However, Clojure has the potential of changing this and bring the expressiveness of Lisp and the power of functional programming to the Java world.

Enable Auto-complete in a PDB session

EDIT: 2012-06-19 There are so many other much better options now that renders recipe obsolete. See pdb++ or ipdb

Pretty simple actually…Just put the following code in ~/.pdbrc and then you can use the Tab key during a PDB session to see the available attributes of the current context.

import rlcompleter
pdb.Pdb.complete=rlcompleter.Completer(locals()).complete

Fast and elegant way to sum primes in a gigantic range

The problem is taken from Project-Euler, which asks what is the sum of all prime numbers under 2 million. Traditional Approach Project-Euler has many problems like this which looks ridiculously easy in theory, but practically impossible when using the old-school brute force way to solve them. Even after applying some well-known techniques to shrink the problem space, the computation still takes a long time (too long for me to stick around and wait it to finish).

Fast and elegant way to sum primes in a gigantic range

The problem is taken from Project-Euler, which asks what is the sum of all prime numbers under 2 million. Traditional Approach Project-Euler has many problems like this which looks ridiculously easy in theory, but practically impossible when using the old-school brute force way to solve them. Even after applying some well-known techniques to shrink the problem space, the computation still takes a long time (too long for me to stick around and wait it to finish).

Integrating SmartGWT with ASP.NET JSON web service

Many web API authors are using third party libraries like JayRock to convert ASP.NET web service method return values to JSON. ASP.NET does have the ability to return JSON objects for web methods. It’s not a very well-known feature (I guess) as there are only a few places mentioning it. For example, suppose the web method we are calling is /ItemService.asmx/GetList, and it’s expecting a parameter “uid”. For JSON web service to work, we have to set the request content type to “application/json” and provide the request parameter as a JSON object and send it through HTTP POST data ({uid:'12345'}).

Hexspeak and Generator

EDIT: 2011-04-21 While browsing my old blog posts, I found the code here can be greatly improved. Here it is: def words(): with open('/usr/share/dict/words', 'r') as f: return (x.strip().upper() for x in f.readlines()) MAPPING = {'A':'A', 'B':'B', 'C':'C', 'D':'D', 'E':'E', 'F':'F', 'O':'0', 'S':'5', 'I':'1'} def main(): is_hexword = lambda word: all(ch in MAPPING for ch in word) for word in filter(is_hexword, words()): print word, "\t", ''.join(MAPPING.get(ch, ch) for ch in word) if __name__ == '__main__': main() So, it’s a relatively slow day at work, and I’ve been “stumbling upon” on Wikipedia when I found this:

Hexspeak Word List

BAFFLED            BAFF1ED
LIFE               11FE
ASSAILS            A55A115
SILLIES            51111E5
SEEDED             5EEDED
BASEBALLS          BA5EBA115
ACED               ACED
SISAL              515A1
BEFALL             BEFA11
CLEO               C1E0
BAFFLES            BAFF1E5
FALL               FA11
ACES               ACE5
DILLS              D1115
SAILED             5A11ED
BLAB               B1AB
CLEF               C1EF
CODAS              C0DA5
ABODE              AB0DE
LASS               1A55
FACIALS            FAC1A15
DALLAS             DA11A5
EASES              EA5E5
ADDLED             ADD1ED
SADDLE             5ADD1E
DODO               D0D0
EDDIE              EDD1E
EDIFIES            ED1F1E5
ALDO               A1D0
COLLOIDS           C01101D5
ACCOLADE           ACC01ADE
LASSIE             1A551E
CALFS              CA1F5
SCOFFED            5C0FFED
CASES              CA5E5
FOALS              F0A15
ADDLES             ADD1E5
COBBLES            C0BB1E5
ABBESSES           ABBE55E5
ILLS               1115
LOSS               1055
LELA               1E1A
COLLOID            C01101D
FOAL               F0A1
LABELS             1ABE15
BELLIED            BE111ED
ASSESSES           A55E55E5
ASSESS             A55E55
LADDIES            1ADD1E5
FEDS               FED5
SABLE              5AB1E
ASSESSED           A55E55ED
BELLIES            BE111E5
BODE               B0DE
EDIFICES           ED1F1CE5
LEASE              1EA5E
DECODED            DEC0DED
DIAL               D1A1
SCAFFOLDS          5CAFF01D5
LOBED              10BED
DECEASES           DECEA5E5
SOFIA              50F1A
ABLES              AB1E5
LASSA              1A55A
LOBES              10BE5
FIDO               F1D0
CEDILLAS           CED111A5
DECODES            DEC0DE5
SLICES             511CE5
BOOBED             B00BED
DECEASED           DECEA5ED
LASSO              1A550
ACCESSIBLE         ACCE551B1E
OLDIE              01D1E
CODE               C0DE
LIEFS              11EF5
CODA               C0DA
SEAS               5EA5
DACCA              DACCA
DEEDS              DEED5
FOIBLE             F01B1E
LOOSES             1005E5
CABBIES            CABB1E5
COIFS              C01F5
SOLACED            501ACED
CODS               C0D5
SEAL               5EA1
EBOLA              EB01A
BILLED             B111ED
FOLD               F01D
BAILS              BA115
DOLLS              D0115
BLOBBED            B10BBED
FOIBLES            F01B1E5
ISABELLA           15ABE11A
LIED               11ED
ISABELLE           15ABE11E
BEEFED             BEEFED
ACCEDED            ACCEDED
FEASIBLE           FEA51B1E
BESIDE             BE51DE
LIBIDO             11B1D0
OFFICIALS          0FF1C1A15
LOSE               105E
SOBS               50B5
ACIDIC             AC1D1C
ACCEDES            ACCEDE5
ALLIE              A111E
COOS               C005
FLAIL              F1A11
LOAF               10AF
FLOSSED            F1055ED
BABE               BABE
SOLI               5011
DOLES              D01E5
SOLD               501D
ELSA               E15A
ELSE               E15E
CASALS             CA5A15
DISCOED            D15C0ED
LESLIE             1E511E
FLAB               F1AB
ASSAIL             A55A11
DISCO              D15C0
SOLS               5015
COOL               C001
DECEASE            DECEA5E
SLIDE              511DE
SAID               5A1D
OODLES             00D1E5
CLASSICAL          C1A551CA1
ALOE               A10E
SIDED              51DED
SAIL               5A11
CICADAE            C1CADAE
DOODADS            D00DAD5
BLOC               B10C
BLOB               B10B
LEAFS              1EAF5
DOODLE             D00D1E
SELLS              5E115
OILFIELD           011F1E1D
ELISEO             E115E0
FEED               FEED
CODES              C0DE5
ELLIS              E1115
FACIAL             FAC1A1
ADIDAS             AD1DA5
BASSES             BA55E5
DEFIES             DEF1E5
CEASELESS          CEA5E1E55
CASED              CA5ED
ELLIE              E111E
LEOS               1E05
CODED              C0DED
LIBS               11B5
DADDIES            DADD1E5
FILLIES            F1111E5
ACID               AC1D
DEFIED             DEF1ED
DOSED              D05ED
EDSEL              ED5E1
SLEDDED            51EDDED
LOBBIES            10BB1E5
SOILED             5011ED
CECILIA            CEC111A
CACAOS             CACA05
DILLED             D111ED
DIDO               D1D0
BLESSED            B1E55ED
DAIS               DA15
CASIO              CA510
CEASE              CEA5E
DOSES              D05E5
BLESSES            B1E55E5
BOOBS              B00B5
BODIES             B0D1E5
ALOES              A10E5
FILES              F11E5
SCAB               5CAB
BLOBS              B10B5
CEASES             CEA5E5
ISOSCELES          1505CE1E5
LODES              10DE5
BASSO              BA550
ELLA               E11A
ACIDS              AC1D5
DEICED             DE1CED
BASSI              BA551
ISABEL             15ABE1
IBIS               1B15
SCABS              5CAB5
ELLS               E115
DIALS              D1A15
DEICES             DE1CE5
SOCIABLE           50C1AB1E
SOLIS              50115
AILS               A115
OSSIFIES           0551F1E5
CASELOAD           CA5E10AD
CICADAS            C1CADA5
SLID               511D
LABELED            1ABE1ED
ACCESSES           ACCE55E5
BABELS             BABE15
SOLIDS             5011D5
SCALDED            5CA1DED
LAOS               1A05
ACCESSED           ACCE55ED
BLOODLESS          B100D1E55
SEED               5EED
CALCIFIES          CA1C1F1E5
CLOD               C10D
AISLE              A151E
LOBBED             10BBED
CALLS              CA115
CODDED             C0DDED
LELIA              1E11A
SOIL               5011
COLOSSI            C010551
CEASED             CEA5ED
SALABLE            5A1AB1E
BAOBABS            BA0BAB5
LOLLS              10115
FOSSILS            F055115
SECEDES            5ECEDE5
SLICED             511CED
LOOSE              1005E
AIDED              A1DED
BLADED             B1ADED
FLOODS             F100D5
SOLO               5010
BIDES              B1DE5
SISES              515E5
ASIA               A51A
CALAIS             CA1A15
CELL               CE11
COAL               C0A1
BLOOD              B100D
AIDES              A1DE5
BALBOA             BA1B0A
BESSEL             BE55E1
BLADES             B1ADE5
ABSCISSAE          AB5C155AE
COIFED             C01FED
DOLLIE             D0111E
CLASSED            C1A55ED
SADE               5ADE
CABLE              CAB1E
DOCS               D0C5
SACCO              5ACC0
DICED              D1CED
ELIDES             E11DE5
BLESS              B1E55
CLASSES            C1A55E5
FAISALABAD         FA15A1ABAD
ABSCISSAS          AB5C155A5
BOLLED             B011ED
CODDLE             C0DD1E
FEEDS              FEED5
FILIAL             F111A1
FLEE               F1EE
FLED               F1ED
BABIED             BAB1ED
FLIES              F11E5
ACCEDE             ACCEDE
BOBSLEDDED         B0B51EDDED
COLLIDES           C0111DE5
SOCIALS            50C1A15
FILE               F11E
BAAS               BAA5
CELLOS             CE1105
SALES              5A1E5
CODICES            C0D1CE5
BASAL              BA5A1
CALI               CA11
COLLIDED           C0111DED
COIF               C01F
BAAL               BAA1
FLIED              F11ED
BABIES             BAB1E5
SOFA               50FA
DOLBIES            D01B1E5
BALDS              BA1D5
LILACS             111AC5
BIFOCALS           B1F0CA15
CALF               CA1F
EFFACE             EFFACE
BOILED             B011ED
COSIES             C051E5
BOBBLE             B0BB1E
LESS               1E55
SADDLES            5ADD1E5
BABEL              BABE1
COBBLE             C0BB1E
FOALED             F0A1ED
BOOLE              B001E
SOFAS              50FA5
LESA               1E5A
BABES              BABE5
COIL               C011
EFFIE              EFF1E
FACES              FACE5
FILL               F111
DELIA              DE11A
LILIES             1111E5
OILS               0115
SOILS              50115
DAILIES            DA111E5
BILBO              B11B0
SCAFFOLD           5CAFF01D
OFFICIAL           0FF1C1A1
ILIAD              111AD
DECODE             DEC0DE
LOBE               10BE
DELIS              DE115
DAFFODILS          DAFF0D115
SEABED             5EABED

FISCALS            F15CA15
FADE               FADE
CELLED             CE11ED
CLASSICS           C1A551C5
ODESSA             0DE55A
LADE               1ADE
COOLIE             C0011E
SOCIABLES          50C1AB1E5
BASS               BA55
FIBBED             F1BBED
EELS               EE15
DIODE              D10DE
CELLS              CE115
ALICE              A11CE
CELLI              CE111
FOIL               F011
BASE               BA5E
ELSIE              E151E
CELLO              CE110
FOILED             F011ED
BILLFOLDS          B111F01D5
SICES              51CE5
BILLS              B1115
SEEDS              5EED5
LESSEE             1E55EE
ALFALFA            A1FA1FA
COALED             C0A1ED
BIDED              B1DED
ALIBIED            A11B1ED
SABLES             5AB1E5
CECILE             CEC11E
CEDED              CEDED
DADOES             DAD0E5
LIBIDOS            11B1D05
FIEF               F1EF
DABS               DAB5
CEDES              CEDE5
LOCI               10C1
BODICES            B0D1CE5
BLEED              B1EED
COOLED             C001ED
CLIFF              C11FF
CASSIAS            CA551A5
ABSCESS            AB5CE55
BASILICA           BA5111CA
SCALE              5CA1E
BASED              BA5ED
CALICOS            CA11C05
SALAD              5A1AD
FOLLIES            F0111E5
BASEL              BA5E1
ALISSA             A1155A
BILLIES            B1111E5
COLO               C010
ABED               ABED
BASES              BA5E5
FELLS              FE115
ELIAS              E11A5
BOLES              B01E5
CABS               CAB5
ABEL               ABE1
COLE               C01E
DEED               DEED
ISOLDE             1501DE
COLA               C01A
SELFLESS           5E1F1E55
CALLAS             CA11A5
LIFELESS           11FE1E55
ALIASED            A11A5ED
DEIFIED            DE1F1ED
SILOS              51105
EASE               EA5E
SICS               51C5
BILBAO             B11BA0
BADE               BADE
SISSES             5155E5
LOBS               10B5
LOCO               10C0
COOED              C00ED
CALLAO             CA11A0
IDES               1DE5
DIABOLICAL         D1AB011CA1
FIES               F1E5
DEIFIES            DE1F1E5
ALIASES            A11A5E5
BEADS              BEAD5
LIEF               11EF
CODICIL            C0D1C11
LOAFED             10AFED
ELIDE              E11DE
SOBBED             50BBED
LOIS               1015
LIES               11E5
DISCS              D15C5
CLODDED            C10DDED
LOLLED             1011ED
SOLE               501E
AFIELD             AF1E1D
BOBS               B0B5
BILLFOLD           B111F01D
CABOOSES           CAB005E5
LEAF               1EAF
LEAD               1EAD
SADIE              5AD1E
LILLIE             11111E
BOSSED             B055ED
LEAS               1EA5
COILED             C011ED
LOSES              105E5
FLOES              F10E5
BOSSES             B055E5
SEES               5EE5
BALLADS            BA11AD5
SAAB               5AAB
BOIL               B011
OBSESS             0B5E55
DISCLOSE           D15C105E
FOLIOS             F01105
IBLIS              1B115
FACELESS           FACE1E55
SALE               5A1E
BEDSIDES           BED51DE5
DISABLED           D15AB1ED
CODDLES            C0DD1E5
AIDA               A1DA
COLDS              C01D5
IDEA               1DEA
AIDE               A1DE
FLEA               F1EA
BASEBALL           BA5EBA11
DECIDE             DEC1DE
CELIA              CE11A
BOBSLED            B0B51ED
AIDS               A1D5
LOADS              10AD5
CODDLED            C0DD1ED
DOABLE             D0AB1E
CABBED             CABBED
DEFACES            DEFACE5
SASS               5A55
COLED              C01ED
DIDDLE             D1DD1E
IDLE               1D1E
OILED              011ED
FOCI               F0C1
BALLED             BA11ED
DISABLE            D15AB1E
OFFAL              0FFA1
SLOES              510E5
BOILS              B0115
ELISE              E115E
LEIS               1E15
ELISA              E115A
SEEDLESS           5EED1E55
DISCLOSES          D15C105E5
CILIA              C111A
COED               C0ED
OSSIFIED           0551F1ED
FILLS              F1115
EDIFIED            ED1F1ED
SCADS              5CAD5
IDEALS             1DEA15
BELIE              BE11E
CICADA             C1CADA
DISCLOSED          D15C105ED
SALLIED            5A111ED
LADLED             1AD1ED
DOODLED            D00D1ED
LABEL              1ABE1
CLASSIFIABLE       C1A551F1AB1E
ACCOLADED          ACC01ADED
FALSE              FA15E
ASSAILABLE         A55A11AB1E
COBS               C0B5
DIESELS            D1E5E15
FOLDED             F01DED
DECAL              DECA1
DISEASES           D15EA5E5
SIDLED             51D1ED
BEEFS              BEEF5
SLOBS              510B5
ACCOLADES          ACC01ADE5
COBB               C0BB
LISA               115A
SLIDED             511DED
OISE               015E
ADDLE              ADD1E
LOADABLE           10ADAB1E
LASSOED            1A550ED
CADS               CAD5
BEDDED             BEDDED
BASIS              BA515
ABSCESSED          AB5CE55ED
DADA               DADA
ACACIA             ACAC1A
LABIAL             1AB1A1
LADIES             1AD1E5
LODE               10DE
BELLICOSE          BE111C05E
ABBAS              ABBA5
BASIE              BA51E
BLISS              B1155
ALASES             A1A5E5
BASIC              BA51C
ISAAC              15AAC
SLOB               510B
BOLAS              B01A5
SCABIES            5CAB1E5
BAIL               BA11
COCCIS             C0CC15
ABSCESSES          AB5CE55E5
COLLIE             C0111E
OLAF               01AF
LILAC              111AC
FIDEL              F1DE1
DIBBLE             D1BB1E
IDIOCIES           1D10C1E5
ODDBALLS           0DDBA115
CLIFFS             C11FF5
BOISE              B015E
EDDIES             EDD1E5
LADLES             1AD1E5
DIES               D1E5
COLLIES            C0111E5
CALL               CA11
LASSOS             1A5505
CALLED             CA11ED
ABASE              ABA5E
BIASED             B1A5ED
ADOBES             AD0BE5
EFFACES            EFFACE5
ADOLFO             AD01F0
SOCIAL             50C1A1
DOODAD             D00DAD
LEASED             1EA5ED
DELLS              DE115
LICE               11CE
BIDDLE             B1DD1E
EFFACED            EFFACED
ALSACE             A15ACE
BEAD               BEAD
LIBBED             11BBED
LEASES             1EA5E5
COCCI              C0CC1
FLEES              F1EE5
DELLA              DE11A
BLISSED            B1155ED
FOCAL              F0CA1
DICE               D1CE
FLOSSIE            F10551E
SOLID              5011D
DAFFODIL           DAFF0D11
ABODED             AB0DED
FIBS               F1B5
BOODLES            B00D1E5
BLOODIES           B100D1E5
FEELS              FEE15
IDOL               1D01
BESIDES            BE51DE5
LIDDED             11DDED
SALLIE             5A111E
OFFICES            0FF1CE5
ABODES             AB0DE5
EASIES             EA51E5
ISLES              151E5
FAECES             FAECE5
BASELESS           BA5E1E55
LIFEBLOOD          11FEB100D
LACE               1ACE
OBOE               0B0E
BELLE              BE11E
IBICES             1B1CE5
BELLA              BE11A
SIDLE              51D1E
LADDIE             1ADD1E
ASSES              A55E5
SOLES              501E5
FOLDS              F01D5
BESS               BE55
SODDED             50DDED
BELLS              BE115
FOOSBALL           F005BA11
FEES               FEE5
SILAS              511A5
BAOBAB             BA0BAB
CALICO             CA11C0
SOLIDIFIED         5011D1F1ED
DEBBIE             DEBB1E
IDOLS              1D015
BALLAD             BA11AD
EBBED              EBBED
ASOCIAL            A50C1A1
BIBLES             B1B1E5
EDIFICE            ED1F1CE
COCOAS             C0C0A5
CABLED             CAB1ED
OLLIE              0111E
SALSA              5A15A
SCOLDS             5C01D5
BOSS               B055
FLOOD              F100D
BASICS             BA51C5
COEDS              C0ED5
ABBESS             ABBE55
OLEO               01E0
BOSE               B05E
DEBS               DEB5
SLABS              51AB5
FALLOFFS           FA110FF5
EDIBLE             ED1B1E
FLEECE             F1EECE
ADDS               ADD5
BIFOCAL            B1F0CA1
DEBACLES           DEBAC1E5
COIFFED            C01FFED
SOLED              501ED
ADELA              ADE1A
FAILED             FA11ED
BEEBE              BEEBE
ADELE              ADE1E
CASELOADS          CA5E10AD5
CLAD               C1AD
FOOLED             F001ED
LACES              1ACE5
BAILIFFS           BA111FF5
FOOL               F001
FIFE               F1FE
BACALL             BACA11
BIBLICAL           B1B11CA1
BELL               BE11
CODIFIES           C0D1F1E5
BIDS               B1D5
BELA               BE1A
OFFS               0FF5
FIASCOS            F1A5C05
SOLOS              50105
DEFACED            DEFACED
ACADIA             ACAD1A
ALBEE              A1BEE
BOAS               B0A5
BIBS               B1B5
FELICE             FE11CE
LIDS               11D5
CODIFIED           C0D1F1ED
ODDBALL            0DDBA11
LEES               1EE5
ISSAC              155AC
FILLED             F111ED
FIELDS             F1E1D5
DIDDLED            D1DD1ED
SEABEDS            5EABED5
DOFF               D0FF
COALESCE           C0A1E5CE
CABAL              CABA1
OLDFIELD           01DF1E1D
LESSEES            1E55EE5
EBBS               EBB5
IDLES              1D1E5
IBISES             1B15E5
DECADES            DECADE5
FACED              FACED
FADS               FAD5
FLEAS              F1EA5
BLADE              B1ADE
LIAISE             11A15E
COLAS              C01A5
FOOD               F00D
CADILLAC           CAD111AC
FLAILS             F1A115
LIBELLED           11BE11ED
DOFFED             D0FFED
DIDDLES            D1DD1E5
LOBBIED            10BB1ED
BOBBI              B0BB1
SILICOSIS          5111C0515
SAILS              5A115
BOOB               B00B
DEICE              DE1CE
COLS               C015
CLOSES             C105E5
SABLED             5AB1ED
BEEF               BEEF
CALICOES           CA11C0E5
BABBLED            BABB1ED
ICES               1CE5
BEES               BEE5
FIDDLE             F1DD1E
CLOSED             C105ED
LIABLE             11AB1E
SOLIDIFIES         5011D1F1E5
FLOSSES            F1055E5
SAFES              5AFE5
LEIF               1E1F
BABBLES            BABB1E5
LASSES             1A55E5
OFFICE             0FF1CE
EASELS             EA5E15
LOOSED             1005ED
SEAFOOD            5EAF00D
EIFFEL             E1FFE1
IDEAS              1DEA5
ABIDE              AB1DE
SODAS              50DA5
DILLIES            D1111E5
IDEAL              1DEA1
BIBLE              B1B1E
DODOS              D0D05
SCOLDED            5C01DED
FLAILED            F1A11ED
LOADED             10ADED
ALIBIS             A11B15
FALLS              FA115
DISBELIEF          D15BE11EF
LOAD               10AD
CASE               CA5E
OBESE              0BE5E
DOLLIES            D0111E5
ADOBE              AD0BE
DECCA              DECCA
OFFED              0FFED
FLOODED            F100DED
SILLS              51115
BOODLE             B00D1E
DIED               D1ED
SECS               5EC5
DOES               D0E5
LEEDS              1EED5
IACCOCA            1ACC0CA
DOLED              D01ED
FLOSS              F1055
BLEEDS             B1EED5
DEFILE             DEF11E
SAFE               5AFE
BALL               BA11
BALI               BA11
SALSAS             5A15A5
CALLIE             CA111E
BALE               BA1E
BALD               BA1D
SCOLD              5C01D
FALLACIES          FA11AC1E5
FACADES            FACADE5
SCALED             5CA1ED
FIELD              F1E1D
DABBED             DABBED
FECES              FECE5
ESSIE              E551E
BOLDS              B01D5
FAIL               FA11
BESSIE             BE551E
BILLIE             B1111E
LEOLA              1E01A
LIAISES            11A15E5
BILE               B11E
COBBED             C0BBED
DECIDES            DEC1DE5
DOLLED             D011ED
CABOOSE            CAB005E
BEFALLS            BEFA115
BILL               B111
LEADS              1EAD5
SELF               5E1F
DECIDED            DEC1DED
FIASCO             F1A5C0
COLIC              C011C
SIDE               51DE
DAISES             DA15E5
BOOBIES            B00B1E5
BOLA               B01A
BELIEF             BE11EF
OLDIES             01D1E5
BELIED             BE11ED
FEEL               FEE1
OILFIELDS          011F1E1D5
ALCOA              A1C0A
SCAD               5CAD
BAILIFF            BA111FF
DOSE               D05E
BELIES             BE11E5
BASIL              BA511
DISEASED           D15EA5ED
SLICE              511CE
ASOCIALS           A50C1A15
BOLE               B01E
LEAFLESS           1EAF1E55
IDLED              1D1ED
LOLA               101A
LIBELS             11BE15
SALEABLE           5A1EAB1E
ODELL              0DE11
LEAFED             1EAFED
LOLL               1011
LEDA               1EDA
DEFOE              DEF0E
OASIS              0A515
DICES              D1CE5
SILICA             5111CA
AFFABLE            AFFAB1E
LILIA              1111A
BLOODED            B100DED
FELLED             FE11ED
LESSIE             1E551E
LIDIA              11D1A
SISSIES            51551E5
COLOSSAL           C01055A1
ODDS               0DD5
ASIDES             A51DE5
AISLED             A151ED
DECALS             DECA15
ALIAS              A11A5
DOILIES            D0111E5
SELASSIE           5E1A551E
FIFES              F1FE5
FACADE             FACADE
AISLES             A151E5
CLODS              C10D5
CABLES             CAB1E5
DAISIES            DA151E5
FISCAL             F15CA1
DADO               DAD0
OFFSIDE            0FF51DE
FOBS               F0B5
OSLO               0510
EDDIED             EDD1ED
ABASED             ABA5ED
SIDES              51DE5
ACCESS             ACCE55
FELL               FE11
SEALS              5EA15
ABASES             ABA5E5
DADS               DAD5
SALADO             5A1AD0
COILS              C0115
LACED              1ACED
LOSSES             1055E5
ASSAILED           A55A11ED
LADS               1AD5
DEAL               DEA1
DOLL               D011
FOOLS              F0015
LIBEL              11BE1
DEAF               DEAF
DOLE               D01E
FICES              F1CE5
LISLE              1151E
BOBBED             B0BBED
FAISAL             FA15A1
LABELLED           1ABE11ED
OBSESSED           0B5E55ED
FIASCOES           F1A5C0E5
DOODLES            D00D1E5
COLLIED            C0111ED
SALADS             5A1AD5
FEEBLE             FEEB1E
CLEFS              C1EF5
ADELAIDE           ADE1A1DE
FECAL              FECA1
CLASSLESS          C1A551E55
SCABBED            5CABBED
DEBASE             DEBA5E
SODS               50D5
COALESCED          C0A1E5CED
CLASSIC            C1A551C
FIELDED            F1E1DED
FOILS              F0115
LILLE              1111E
SCOFF              5C0FF
SECEDE             5ECEDE
COALESCES          C0A1E5CE5
COOLIES            C0011E5
SADDLED            5ADD1ED
SODA               50DA
SIDESADDLE         51DE5ADD1E
FALSIFIABLE        FA151F1AB1E
DIALLED            D1A11ED
SEASIDES           5EA51DE5
FELECIA            FE1EC1A
ALCIBIADES         A1C1B1ADE5
BOBBLED            B0BB1ED
BASILICAS          BA5111CA5
BOLD               B01D
DIBBLED            D1BB1ED
ALBA               A1BA
FABLE              FAB1E
ASCELLA            A5CE11A
BLABS              B1AB5
BALSA              BA15A
BOLL               B011
SLED               51ED
DIBBLES            D1BB1E5
CECELIA            CECE11A
SLABBED            51ABBED
BIAS               B1A5
BOBBLES            B0BB1E5
DIODES             D10DE5
DECIBEL            DEC1BE1
ALBS               A1B5
DIABOLIC           D1AB011C
DISSES             D155E5
LOCALED            10CA1ED
BAAED              BAAED
ICICLE             1C1C1E
CALEB              CA1EB
COLLIDE            C0111DE
ALES               A1E5
DISSED             D155ED
DEBACLE            DEBAC1E
COALS              C0A15
CABALS             CABA15
FLEECES            F1EECE5
ALISA              A115A
LOCALLED           10CA11ED
EDIBLES            ED1B1E5
LOCALES            10CA1E5
ALEC               A1EC
SOLACES            501ACE5
FLACCID            F1ACC1D
CLASSIFIED         C1A551F1ED
ADOLF              AD01F
BLOCS              B10C5
LASSIES            1A551E5
DISCOS             D15C05
BLABBED            B1ABBED
ASIDE              A51DE
LABS               1AB5
DALLIED            DA111ED
BIASSED            B1A55ED
DOFFS              D0FF5
CODICILS           C0D1C115
CASSIA             CA551A
FLEECED            F1EECED
LASSOES            1A550E5
CASSIE             CA551E
FOES               F0E5
COBBLED            C0BB1ED
ADDED              ADDED
LILA               111A
BAILED             BA11ED
BEDE               BEDE
LEADED             1EADED
BEDS               BED5
DELIBES            DE11BE5
DEBASES            DEBA5E5
ALLIED             A111ED
FALLIBLE           FA111B1E
BOBBIE             B0BB1E
FOSSIL             F05511
LADLE              1AD1E
ALOOF              A100F
BASSOS             BA5505
DIOCESES           D10CE5E5
CECIL              CEC11
BODICE             B0D1CE
SLIDES             511DE5
DECIBELS           DEC1BE15
SEASIDE            5EA51DE
CABBIE             CABB1E
SEALED             5EA1ED
DISABLES           D15AB1E5
SIDESADDLES        51DE5ADD1E5
ACIDIFIES          AC1D1F1E5
BEADLE             BEAD1E
DISEASE            D15EA5E
DEALS              DEA15
OAFS               0AF5
SACS               5AC5
BEFELL             BEFE11
DALLIES            DA111E5
LOCALS             10CA15
OFELIA             0FE11A
ACIDIFIED          AC1D1F1ED
BIDDIES            B1DD1E5
ELBE               E1BE
ABBASID            ABBA51D
ELBA               E1BA
SOLACE             501ACE
CLASSIFIES         C1A551F1E5
BOOED              B00ED
DIESEL             D1E5E1
FALLOFF            FA110FF
SCOFFS             5C0FF5
ISLE               151E
COCOA              C0C0A
BEADED             BEADED
LAID               1A1D
FILED              F11ED
SECEDED            5ECEDED
CALCIFIED          CA1C1F1ED
BIASES             B1A5E5
SCALDS             5CA1D5
DILL               D111
FIDDLES            F1DD1E5
FELICIA            FE11C1A
ELOISE             E1015E
COOLS              C0015
BABBLE             BABB1E
CABOODLE           CAB00D1E
SCALD              5CA1D
SCOLIOSIS          5C0110515
BLED               B1ED
LEILA              1E11A
ALAS               A1A5
FIDDLED            F1DD1ED
SOSA               505A
CASCADES           CA5CADE5
DOCILE             D0C11E
CLIO               C110
CELEBES            CE1EBE5
SILL               5111
BELIEFS            BE11EF5
DISS               D155
SILO               5110
DOSSES             D055E5
ISIS               1515
LOCAL              10CA1
EDDA               EDDA
BALED              BA1ED
FOODS              F00D5
SALLIES            5A111E5
SLOE               510E
DELICACIES         DE11CAC1E5
OFFSIDES           0FF51DE5
EASEL              EA5E1
CLOSE              C105E
EASED              EA5ED
DEEDED             DEEDED
BALES              BA1E5
CEDILLA            CED111A
FADES              FADE5
FAILS              FA115
FABLES             FAB1E5
BOBSLEDS           B0B51ED5
BODED              B0DED
ICICLES            1C1C1E5
BOLLS              B0115
BALSAS             BA15A5
BOBBIES            B0BB1E5
CASCADE            CA5CADE
FABLED             FAB1ED
ASSISI             A55151
FADED              FADED
AILED              A11ED
OFFLOAD            0FF10AD
SLAB               51AB
CACAO              CACA0
BODES              B0DE5
DIALED             D1A1ED
OBSESSES           0B5E55E5
DABBLE             DABB1E
CLASSIFIEDS        C1A551F1ED5
DADOS              DAD05
BLOODIED           B100D1ED
BELLED             BE11ED
SALAS              5A1A5
BOOS               B005
ABLE               AB1E
DABBLED            DABB1ED
BELLES             BE11E5
BEDSIDE            BED51DE
DABBLES            DABB1E5
FOBBED             F0BBED
BIDE               B1DE
BOCCACCIO          B0CCACC10
DIESELED           D1E5E1ED
FACILE             FAC11E
DALE               DA1E
COFFEE             C0FFEE
ABACI              ABAC1
LOAFS              10AF5
OASES              0A5E5
ALIBI              A11B1
LOCALE             10CA1E
CADDIED            CADD1ED
FLOE               F10E
ALICIA             A11C1A
DALI               DA11
LADED              1ADED
ASSAD              A55AD
BAFFLE             BAFF1E
FOLLICLE           F0111C1E
DISC               D15C
ODIS               0D15
ODES               0DE5
LADES              1ADE5
FACE               FACE
SOLOED             5010ED
COLD               C01D
CADDIES            CADD1E5
BLOODS             B100D5
CEDE               CEDE
DODOES             D0D0E5
ABIDED             AB1DED
DIOCESE            D10CE5E
DECLASSIFIED       DEC1A551F1ED
SCALES             5CA1E5
ADDIE              ADD1E
BACILLI            BAC1111
ALSO               A150
LABIALS            1AB1A15
ABIDES             AB1DE5
DEAD               DEAD
FOLIO              F0110
OBOES              0B0E5
LIAISED            11A15ED
DECLASSIFIES       DEC1A551F1E5
DEFACE             DEFACE
DEFILES            DEF11E5
ELIDED             E11DED
BALLS              BA115
BLISSES            B1155E5
LABIA              1AB1A
DELI               DE11
SIDLES             51D1E5
FALSIFIES          FA151F1E5
DELL               DE11
CASCADED           CA5CADED
OSCEOLA            05CE01A
DALES              DA1E5
FIEFS              F1EF5
CLASS              C1A55
SADES              5ADE5
DEFILED            DEF11ED
COFFEES            C0FFEE5
ALLIES             A111E5
ACACIAS            ACAC1A5
FALSIFIED          FA151F1ED
DECADE             DECADE
DEBASED            DEBA5ED
SELL               5E11
DECAF              DECAF
ABSCISSA           AB5C155A
CALLABLE           CA11AB1E
FOLLICLES          F0111C1E5
SASSED             5A55ED
LIBELED            11BE1ED
BOLDFACE           B01DFACE
BALDED             BA1DED
SASSES             5A55E5
SLEDS              51ED5
ICED               1CED

Genesis

Well, I’ve been thinking about going back into blogging for some time now…I haven’t been able to make the determination. However, now I think the era I’m going through right now is too precious to go wasted and without any trace. So, I’m going to try my best to write blog more often to record this period, although not everything is wonderful and pleasant, the memories will be there forever and will remain part of myself.

Gloomy Monday - Rant on VT shooting incident

This is a typical Monday…alarm clock goes off in the morning but you just don’t want to get up and go to work…finally when you have enough determination to go to work, the weather is as gloomy as sh*t. On top of that, it was drizzling all the way and heavy wind, which is perfect to start a week with… Barely made it to the company thanks to the roaring north wind.

About Me

Kevin Jing Qiu [resume] Born in the booming city of Shanghai, PRC in the 80s, Kevin got his first personal computer when he was 8, watching his dad tinkering with Apple II Basic late at night. Kevin fell in love with computer programming in the 90s, and pursued his dream of becoming a software engineer, which lead him to North America. Graduated with distinction from University of Toronto Computer Science program, Kevin has been working in the industry since 2008.