Showing posts from April, 2010

Sweet: Ubuntu 10.4 released

I have been running 10.4 beta for a while so I am just doing an update. Before the update I made a nice discovery: I had problems getting the Realtek wireless working in my Toshiba Satellite U505 but this morning I noticed that Realtek had new Linux drivers available that work fine for me. Best to either buy slightly older hardware for using Linux, or to develop patience. I only have two servers (usually I work with customers' servers on their projects) and I am trying to decide if I need to update those. I host my own web apps on Google AppEngine and Heroku so my servers are largely unused.

I wish the Play framework was available when I did server side Java

Before I started using Ruby about four years ago, almost all of my web development was either J2EE or plain old JSP apps (with some fun experiments with Lisp, Scheme, Prolog, etc.) Even though Rails is my "go to" platform for efficiently writing web apps, I like to keep up with Scala + Lift, Java options on AppEngine, Clojure + Compojure, Seaside, etc. I just revisited the Play framework and I must admit some real regret that something like Play was not available when I did a lot of server side Java work. Play borrows a lot from opinionated frameworks like Rails and a quick study is enough to be productive largely because of the similarities to Rails in the ease of setting up routes, database access, nice MVC separation, etc. Probably the neatest feature of Play is that Java source code is compiled on the fly using the Eclipse Java compiler so if you edit a Java controller of model file and refresh a web page you instantly see the effects of the code change. There is a Sca

My Objectify-Appengine setup

I wrote last week on using Objectify-Appengine to decrease the Google AppEngine request loading time. I did not mention my development setup so I'll do that now, hopefully saving you some time: Start by building a JAR file from the latest source: svn checkout objectify-appengine-read-only cd objectify-appengine-read-only ant You should now have a JAR file in target/objectify-508.jar (build number may be different for you). I use IntelliJ and after setting up a fresh AppEngine project, I copy in the generated Objectify JAR file and delete some of the generated JAR files so I have the following JAR files in web/WEB-INF/lib : geronimo-jpa_3.0_spec-1.1.1.jar appengine-api-labs-1.3.2.jar objectify-508.jar This is all you need. You can then follow the examples in the Objectify Wiki . You should re-think your data modeling, away from a relational database mindset. The AppEngine data store may seem limiting from a programming perspectiv

A great way to get around the long loading request times on AppEngine

I wrote yesterday about my experimental project that is currently a prototype app running on Heroku. In parallel, I wanted to experiment with doing an AppEngine deploy but I got rather frustrated this morning by the both long and unpredictable cold loading request times. Even with some clever new work to manage the load time of JRuby apps, there is still a lot of work to be done to get the cold request load times under a reasonable limit (perhaps a three or four seconds?). I think that Python AppEngine apps have the fastest cold request load times but I am not Python developer (very rusty!). I tried a Java app and the load times were very much better that JRuby, but then I ran across a great project that reduces the load time for Java apps by not using JDO and instead using the light weight objectify-appengine project. I am not sure what is the best way to accurately measure cold loading request times except for letting an app get swapped out (wait a few minutes with no r

Tutorial on using Map Reduce to analyze log and web site click data

This is a useful tutorial that walks you through the steps of analyzing log and user interaction data using Hive and Elastic MapReduce on AWS. If you need to set up a data warehousing system, this should get you started.

my new project:

We all have things that we are proud of professionally. For me this is largely being proud of process and some achievements. My process is one of focussing down on a (very) few things and getting them done efficiently and then spending time "playing" with new technologies and working on new ideas. These are two very different kinds of work and I approach them differently. I have read a lot of material on "getting stuff done" and I have used other people's productivity software. For to-do lists I like the simplicity of just using GMail's "Tasks" features. All other projects that I have tried have many features that I don't need or care about and miss some things that I need. Since I focus on just one or two things per (work) day, I want a system that helps me to manage just a few things. This will definitely be a "scratch my own itch" style project. It will take at least a month until I get a public beta ready, but I do have a placehol

Very useful book: "REWORK"

Jason Fried's and David Heinemeier Hansson's new book "REWORK" is great - a must read for web developers and entrepreneurs. Their basic message is to stay focused on what you really need to get done and eliminate as many distractions as possible. As a result of reading this book I have changed a few non-optimal habits: I made a big push to finish my current book so that I could concentrate on my current development project. For my current project of version two of my web portal, I reverted to Ruby 1.8.7 to avoid a few small ongoing Ruby 1.9.1 problems, updated to a newer version of Rails to get some bug fixes, using Heroku and not deploying it myself, removing almost as many old features as the number of new features I am adding, adding mobile phone support for easy recipe access and a shopping list manager, and more "AI" in presenting data and auto-organizing shopping lists (scratching my own itch: working on the features that I want mysel

Mobile device web apps

I used the advice on this Rails Cast to start converting one of my Rails apps to nicely support mobile devices. Working on my MacBook, I use the iPhone Simulator (since I don't own an iPhone) and my Droid phone to test on a real device. So far most of the work has been deciding what I don't want to show when web requests come from a small screen device and tweaking the mobile device CSS file.

My Clojure, MongoDB, Ring, and Compojure development setup

I wrote a few days ago about my Clojure and Compojure setup that automatically reloads modified files while I am developing. I have added support for accessing MongoDB using the congomongo library. My new project.clj file: (defproject kbsportal "0.1.0" :description "test using Compojure for" :dependencies [[compojure "0.4.0-SNAPSHOT"] [ring/ring-devel "0.2.0-RC2"] [ring/ring-httpcore-adapter "0.2.0-RC2"] [ring/ring-jetty-adapter "0.2.0-RC2"] [ring/ring-servlet "0.2.0-RC2"] [org.clojars.liebke/congomongo "1.0.0"]] :main kbsportal) My Compojure setup file kbsportal.clj: (ns kbsportal (:use compojure.core ring.adapter.jetty) (:use ring.middleware.reload) (:use ring.middleware.stacktrace) (:use somnium.congomongo) (:use mongo) (:use nlp)) ;; set up test use of congomongo + MongoDB: (mongo! :db "notes", :host ""

My Clojure, Ring, Compojure development setup

I had to search several sources (like this ) to get this setup, so I thought it would be useful to summarize my setup here. Unlike most developers, I use five different editors (emacs+slime+swank, IntelliJ IDE, GEdit, e, and Textmate) depending on which computer and OS I am on. I wanted to be able to leave a Compojure based web app running in development mode and have source files refresh regardless of which editor I am using. In the following example, I have two Clojure source files: one with Ring and Compojure code, and one a utility file, containing for this example an extremely useful function foo . Start by creating an empty Leiningen project: lein new KBSportal cd KBSportal Then edit project.clj to look like: (defproject kbsportal "0.1.0" :description "test using Compojure for" :dependencies [[compojure "0.4.0-SNAPSHOT"] [ring/ring-devel "0.2.0-RC2"] [ring/ring-httpcore-adapter "0.2.0-RC2"] [ri