December 21, 2011

[Mac] Delete backups from Time Macine

I got disk full message from Time Machine with 2TB external HDD.  I found this helpful video showing how to remove (old) backups from Time Machine disk.

December 19, 2011

Book: Programming Erlang: Software for a Concurrent World

I actually read this book a few years ago -- I was searching for a better way for concurrent programming and found Erlang.  Coincidently, Erlang was starting to get some attention little after.  I believe this was the only Erlang book  at that time.  The book clearly shows and explains how to program in Erlang.  Reading this book was like a wake-up call for me, whose background is mostly OOP and procedural languages.

Book: Clojure in Action

There are many books on Clojure, and after reading/skimming through most of them, I found this book is the best one to start with.  I enjoyed reading this book very much, and I strongly recommend to anyone who wants to know Clojure.  After this book, you might want to read Joy of Clojure, which delves into Clojure deeper.

December 2, 2011

Common Lisp, Web framework, VPS, OSX issues

Develop web apps using common lisp with a web framework in Linux environment.

Development environment is OSX 10.6 Snow leopard.  Target environment is Ubuntu 10.10 server running on OpenVZ with very small configuration, provided by VPS hosting service.

Two widely used common lisp web frameworks: (1) weblocks, (2) hunchentoot.  (Use quicklisp to install them.)  They both require multithreading support.

1. Development side:

OSX's CLISP binary doesn't support multithreading.  I don't want to spend too much time compiling it from scratch just for that.  Tried SBCL, and its binary (macport) does support multithreading.  Good.

2. Target environment side:

Ubuntu's CLISP package supports multithreading.  However, I couldn't install SBCL using apt-get, reporting there's a problem with memory (don't remember the specific message).  It turns out that SBCL requires 8GB memory for its GC.  However, the VPS has only 512MB memory, and no swap.  no SWAP?!  That's right -- openVZ does not give swap.  I could find a VPS hosting service using XEN, but this hosting service's price is very low, and XEN based VPS hosting service companies are charging almost twice of the company I'm getting service from.

So, in development environment, I have to use SBCL, but on the target machine, CLISP must be used.  (Gotta use the same environment!) Some suggested that LISPBOX has Clozure Common LISP and the binary supports multithreading on OSX, therefore use that (lispbox's clozure).  However, on the Ubuntu in my VPS, installing LISPBOX is a bit of hassle -- compiling many things. (It's because the LISPBOX binary available on the web is a bit old, and does not install on my headless Ubuntu 11.04 VPS.)  Also, I selected Ubuntu to minimize any package compilation, and this defeats the purpose.

I do not have to use common lisp and don't want to waste time on setting up environment -- already wasted good amount of time finding all this -- so decided to go with Clojure instead for frontend, and use clisp for the backend, probably.

I hope my findings help other folks and save their time -- clisp issue on OSX, SBCL on virtual machine based using OpenVZ, etc.  And try Clojure.  It's cooler than Scala, IMHO.

Apache, Glassfish and JAX-WS


Environment: Apache, Glassfish 3.1.1 (or here) on Ubuntu server 11.04, behind FW with VIP.  Here is the good tutorial on installing Glasfish on Ubuntu.

Start/Stop commands for Glassfish:

glassfish/bin/asadmin stop-domain domain1
glassfish/bin/asadmin start-domain domain1

- For virtual hosting, this page might be a good help.
- For SSL, see this page.

Apache + Glassfish

Usual Reverse Proxy configuration will work fine:

ProxyPass /
ProxyPassReverse /

JAX-WS (Web Service) "soap:address location" Issue

My apache server is behind a firewall, and has a VIP, then using apache reverse proxy to Glassfish.  May be this set up is the cause of my problem, but I was getting the IP in ProxyPass/ProxyPassReverse in the JAX-WS's WSDL page for soap-address:location:
<soap:address location=""/>

This is a problem for client to generate WS client codes using the WSDL.  I spent good amount of time Googling for the solution and found a few things:
1. it's been reported as a bug and is supposed to be fixed before 3.1.1.  May be my problem is caused by my environment: FW and VIP.
2. someone actually wrote servlet filtering to intercept the output, and regex the host name to change it to a correct one.
3. another solution was to grab the generated WSDL, save it locally, hand edit it, then upload.

#2 and #3 are all hacks and I applaud for the developers effort, but I did not like those solution because I am too lazy to do any workaround coding for some environmental issue, and do hand edit things each time WSDL is updated.  So did more digging and reading, found a simpler solution.  In the Apache config for the reverse proxy, just add one more line and it would look like this:

ProxyPreserveHost On
ProxyPass /
ProxyPassReverse /

I hope this little finding saves other developers' time.

Rooting Nook Tablet

It'd be nice if I can do some programming on the device directly (and compile too).

Nook SDK:

Nook Color vs. Nook Tablet vs. Kindle Fire:

So far, Nook Tablet looks like it is the best low-end/cost tablet.

Amazon's Kindle source code

They're available for download at:

...source codes for Kindle 2nd gen, 3rd gen, 3G, DX, 6" wifi, Touch, and the latest Kindle Fire.

September 15, 2011


Great data visualization site:

Some interesting pages from this site:
Adding my two cents here:
  • GnuPlot, Python with Scipy/Numpy, PHP -- they are all very good tools for creating charts.
  • Use Google Chart, JavaScript or Flash for charting.
  • Search for existing tools first, rather than bang your head on the ground and write from scratch.

September 7, 2011

Great free kindle ebook from O'Reilly - Big Data Now

I just started to read this book.  It's very interesting and insightful.  Big data is becoming more and more important for any business and products.  Statistical and analytical approaches to derive meaning out of the data and add values to products is the key to win over competition.

September 6, 2011


ASDF doesn't work for me -- I couldn't install it properly on OSX, and it is obsolete anyway.  I found quicklisp ( instead, and it works quite well.

For Common Lisp, check your Common Lisp version -- I believe it requires at least 2.47.  

Simple Steps
  1. wget
  2. Run lisp: $ clisp (or sbcl)
  3. (load "quicklisp.lisp")
  4. (quicklisp-quickstart:install)
  5. ; load quick lisp at start up. do only once.
  6. ; check if pkg avail
    (ql:system-apropos "<package name>")
  7. ; load -- replace <package name> with package name
    (ql:quickload "<package name>")
  • It will create and store downloaded modules under ~user/quicklisp.
  • Step#5 will modify ~/.sbclrc or ~/.clisprc
  • quicklisp doesn't resolve dependencies.
  • clbuild is another lisp package installer.
That's it.  Very simple.

September 3, 2011

Stanford opens some information technology courses to the world

Courses on artificial intelligence, machine learning, and databases will be delivered to virtual classrooms of ten of thousands of students, if not hundreds of thousands.

September 1, 2011

Book: The Passionate Programmer

I recently read The Passionate Programmer for the second time.  I wish I have read this book years ago.  If you are passionate about programming, or if you want to motivate yourself -- you should read this.  Ultimately, it is about being a great developer -- how to be one.

Get a Kindle
Very convenient and many ebooks are cheaper than printed books.

AI vs. AI. Two chatbots talking to each other

August 27, 2011

Mercurial using BitBucket and Eclipse

If the project is already created in Eclipse, but not in mercurial repository, then:

(1) Create a repository in BitBucket.
(2) Go into shell, and clone from BitBucket which is empty.

e.g. If I have created non-mercurial project in local eclipse called "hello_world":

$ mv hello_world hello_world.bak
$ cp -r hello_world.bak hello_world
$ hg clone
http authorization required
realm: HTTP
user: BBUSER
destination directory: hello_world
no changes found
updating to branch default
0 files updated, 0 files merged, 0 files removed, 0 files unresolved

(3) Then move or copy those files from the local project directory into the BitBucket cloned directory.

$ cd hello_world
$ hg add
adding ....

$ hg ci -u BBUSER
$ hg push

(4) Remove hello_world project from eclipse (make sure to have a backup) and from disk.
(5) In eclipse's menu -> New -> Other -> Mercurial -> Clone Existing Mercurial Repository, then click <next> button.
(6) In next dialog, enter URL to the BitBucket repository (get this when the repository was created, or go  to the site and find out),  username/password.
(7) Click next, next, finish.

...there should be an easier way...

August 26, 2011

12 Things A Programmer Really Needs To Know

"How do you answer the question, “what do I need to learn to be a good programmer?” I have written posts trying to answer that question, typically focusing on the languages that you should learn or the algorithms and other techniques you need to know. What about the rest of a programmer’s life? This is a less serious look at the life of a programmer. So, what does a programmer really need to know?"


August 21, 2011

Selling Yourself: Why? and How!


I know many good developers who are under the impression that they either don’t have to sell themselves, or selling themselves is wrong, but is that really true?

First let me clarify by defining what I mean by “selling yourself”. I don’t mean “selling out”, I mean marketing yourself, what you’re doing and what your skills are. Especially to your organization.

June 16, 2011

Peter's blog: It's official: developers get better with age. And...

Peter's blog: It's official: developers get better with age. And...: "As a senior developer I get asked sometimes if constant change of technology is making me, well, obsolete. Personally I don't have problem w..."

May 19, 2011

(Updated) jMonkeyEngine + Eclipse = JMonkeyPlatform

JMonkeyEngine has "jMonkeyPlatform" -- all in one IDE (using eclipse) for jMonkey.  No more hassle with installing all different components.

April 30, 2011

ACM lifetime member!

I've been a member of ACM since 1998.  I finally decided to become a lifetime member. Being an ACM member means getting great benefits, magazines, and a lot of great information in Computer Science world.

My member VCARD:
Permanent email address: keithkim-at-acm-dot-org