Sunday 11 December 2011
If you work for Gilt Tech than you WILL (sooner or later ... somehow) get involved in our Machine Learning and Recommendation efforts. Our requirements are extremely complex and challenging. We have over 5 million members (fast growing) and a product catalog which features products that are selling out between 10 secs and 3 days, means we need to make recommendations for products that have (almost) no history to members that might not be with us for a long time (yet). In that context we are constantly investing in making our personalized EMails and also the content of the WebSite more relevant to the member who is looking at it.
If you do/get this right, it is Mass-Customization (the art of cost-effectivly build instances of one (store)) at its best ...
“If I have 3 million customers on the Web, I should have 3 million stores on the Web.” – Jeff Bezos, CEO of Amazon.com
The difference between Amazon and Gilt is that Amazon got a "lot" of time to build these stores (hours, days, ...) . In our case we almost need to build these stores on the fly (seconds, minutes, ...). This requires new thinking, new approaches, new algorithms, ... it requires innovation. Got ideas? Let's talk!
Anyway ...
In that context I started to play with Apache Mahout and found this good (old) tutorial (still top of the list when you Google "Apache Mahout Tutorial") from Grant and decided to "maven-ize" it. Just install git and run ...
> git clone git://github.com/rolandtritsch/Apache-Mahout-Tutorial.git
... and then install maven and follow the instructions in the README. Enjoy!
Thursday 24 November 2011
Dublin Innovation Festival - Talking about Innovation, Gilt and Ireland ... and Evolution and Darwinism
A couple of weeks ago I had the chance to talk about three things I care about: Innovation, Gilt and Ireland. The occasion was the Dublin Chamber of Commerce Smart Series Event on Innovation (that was the day after Dundrum Shopping Center and half of Dublin got flooded). The objective was to share a couple of thoughts on what innovation is (or is not), what Gilt is doing to foster innovation and what Ireland has to offer to companies like Gilt.
To start ... Innovation is probably on all our minds. If you get it right as an individual or as a company or as a country, you create a differentiator for yourself. Everybody wants to be innovative. The main point of the talk was to point out the similarities between innovation and evolution.
There are lots of definitions available, but one way to think about innovation is in terms of the hard and the brain. The hard tells us that innovation is this wonderful thing that happens in the shower or in my case on the bike on the way up to Sally Gap, when you have this moment of brilliance for the next best, bigger business idea that will actually change the world. And then we look at individuals like Steve Jobs, who are obviously either showering a lot or who know the way up to Sally Gap like the back of their hands, because it seems they innovate everyday and we start to wonder what is wrong with us.The short answer is actually: nothing. Nothing, because in my opinion it does not work this way. Even in the case of the iPod you could argue that the real innovation was the Sony Walkman and the iPod was a refinement on the original idea.

The more rational definition behind innovation is that innovation is not a thing or an event that "happens". It is the result of a process. I am personally a big fan of evolution and Darwinism. There is only so much you can plan and/or foresee. For the rest you have to try (a lot) and see what works.
That sounds easy, but it isn't, because it is counterintuitive. You have to embrace mutation and selection. You first have to create a "creative" environment that produces a lot of (hopefully) good, new ideas and then you have to filter them and needs to happen early, because being innovative does not mean to be just creative. It means to be successful and that means it is not about creating a lot of good, new ideas, it is also about finding the ones that make a difference for your business and for your customers and if your are lucky for your industry.
Not to a small extend it is this “bi-polar” nature of innovation that makes it difficult for us to implement innovation. Just think about it: On one hand you ask people to mutate (means to come up with a lot of good, new ideas) and to be passionate about these ideas and then you need to have strong selection in place to kill most of them. If you do it wrong it will frustrate people, because they might get the impression that nobody is listening and innovation will just stop to happen.
In a lot cases we fail to get good innovation because we either mutate too much and do not select enough or the other way around. Good innovative environments show both characteristics: A lot of mutation and strong selection. Innovation is the evolution of ideas. It is Darwinism of ideas. It is the survival of the fittest idea.
To create such an environment and to maybe avoid the frustration mentioned above, you should reward people equally for coming up with an idea and also for giving up on an idea. Failure must become an option and maybe even something that you should or could celebrate.
Let's talk about Gilt. Gilt is innovative. Let me talk about two examples that will illustrate how innovation based on strong selective pressure (means a well-defined niche that you need to adapt to) and/or strong mutation (means a good idea) can look like.
The first example I want to talk about is inventory management. Normal retail business models allow you to do inventory management based on thresholds, means as soon as your inventory goes beyond a certain threshold you reorder. When you reorder has something to do with your lead times and also with the quality of your inventory management, means you actually do not care, if there is a little bit more or little bit less in stock, as long as you never run out of stock.The Gilt business model requires a totally different approach. Because in most cases we are selling excess stock, 80% of all products we have ever sold we have sold only once, means we never really can reorder and that means we are in the business of selling down to the very last unit. Always!!! And we need to do that while we maintain highest possible availability and scalability. To deliver on these business requirements we had to question conventional wisdom and build a very innovative inventory management runtime platform, based on highly available and highly scalable NoSQL databases that actually relax some of the transactional ACID properties, but still allows us to sell down to the very last unit. And we succeeded. That’s an example for innovation out of necessity to adapt to a niche.
The second example for an innovation at Gilt is the 360 degree "look-around" Jetsetter iPad app. The application allows you to take a 360 degree view of a room and explore literally every ankle of it. This is an example for a strong mutation.
Gilt is still a very young company, means we are still learning how to institutionalize innovation in the company, but so far I believe that the 3 pillars of innovation in Gilt are people, process and culture. You need people that are creative and intelligent. You need a process that is open and transparent. And you need a culture that equally celebrates success and failure.
In that context we are experimenting with "Unstructured Time" where we bring people together without an agenda. We also believe that a lot of good ideas will not come from us, but from outside the company and in that context we are currently building a public API that we will expose to partners and other interested parties, so that they can innovate independently from us. Earlier this year we did a hackathon and had the entire SW development organization on the hunt for the next better idea and also prove it (within 24 hours). Our color search feature (which allows you to take a picture of a color and search for similar products) and the public API were actually incubated in the hackthon. We are also doing a lot of A/B testing to measure the "goodness" of our ideas. This allows us to rationalize the conversation about the value of certain ideas.
But there is always more to do. Right now, we are thinking about a "follow-the-sun" hackathon were global teams will implement something over a period of three days, because we are suspicious that some good ideas, will get conceived, when people from different cultural backgrounds work together, means it is not only about creativity and intelligence, but also about heterogeneity.

Let me wrap up, by exploring that thought more. It is my believe that culturally diverse, culturally heterogeneous environments are more likely to be innovative than homogeneous environments. If you also believe in the value of heterogeneity than there is good news, because the Irish software engineering population is among the most heterogeneous and diverse in Europe, maybe even in the world, means Ireland allows you to build teams that will look at problems and possible solutions in different/unique ways. They all went to different schools and had different experiences before they came to Ireland. This creates an environment for innovation to happen.
Ireland is the only English speaking country in the Eurozone. This makes it easy for talent to relocate to Ireland and to work here. Building an innovation hub will probably to a certain extend rely on our ability to take advantage of the talent in the rest of Europe and to use the heterogeneity and diversity that comes with it as a driver to build creative, innovative teams here in Ireland.
Gilt is very excited to be in Ireland. We are looking to use our presence here to build a stronger, more scalable, even more innovative Gilt Technologie Organisation.
Sunday 26 June 2011
(Small) change to my social networking ...
First of all ... apologies!!! In the last 2 weeks my (private) tweeds (almost) completely died away. I was just madly busy with work :(.
Going forward, I will (continue to) send my "diary" updates to @rolandtritsch, but will send my more work related tweeds (e.g. Blogging about ..., Reading about ..., Looking at ...) to @innolocity. @innolocity is a public feed. Just register here to follow.
Sunday 1 May 2011
Cloud Computing - A practical guide for the common user
These days (and especially after the Amazon EC2 outage :)) everybody is talking about cloud computing. It seems you cannot be sexy, if you do not "live" in the cloud. But most of the more "common" users (and for the sake of the discussion, I am including myself in that group) probably think that cloud computing and using "the cloud" is something that enterprises use to (potentially) safe cost and also to (potentially) gain flexibility.
The first observation is that there is a fair amount of confusion about what cloud computing is. The reason is that everybody is latching on to the buzz and is using the word cloud to make the product or the service at hand look more trendy.
To bring order to the chaos you could probably say that there are three categories of cloud computing solutions:
- Data Clouds - Give access to a large amount of disk space and allow the disk space to be shared between a (potentially) large number of users (e.g. DropBox)
- Computing Clouds - Give access to large amount of computing (CPU) and hardware power in general (including main memory, disk space and in most cases a/the operating system) to run whatever application you want to run (e.g. Amazon EC2)
- Services/Application Clouds - Give access to ready-to-run/ready-to-use services/application to solve a specific problem (e.g. Google Mail (running a mail server for you), GitHub (running a source code repository for you), SalesForce.com (running a CRM for you))
So question becomes, why is this important or relevant to a/the common (means non-enterprise) user? For me personally I get two benefits out of it: I use "cloud computing" as a (you could call it) "poor-mans backup solution" and also as an "information sharing/syncing solution". Specifically I am using ...
- Google Mail/Calendar - to "host/store" all my email folders, contacts and my personal calendar
- DropBox - to store all my files (including picture and music libraries)
- GitHub - to store all my source code
Syncing the data is kind of automatic and there is always an offline version of the data available, which gives me very good protection against disk failures (but on top of that I am also running a TimeMachine backup (better safe than sorry :))), means in case of a disk failure, I can install an IMAP email client, a DropBox client and Git on a new piece of hardware and I am up and running again in no time.
The second value is information sharing. By now I have 3 devices (laptop, tablet, phone) and need to share/sync data between the devices and my wife got a laptop and a phone too and I also need to share/sync information with her (especially my source code :)). Having the data/information available in "the cloud" makes that syncing/sharing exercise straight forward (will publish a blog post on how to share/sync music using DropBox in due course).
Buttom line: "Cloud computing" is not only for enterprises :).
Tuesday 19 April 2011
Adventure 2.0 - Building the Gilt Software Development Center in Dublin
A couple of weeks ago I got a call from the Gilt Groupe in NYC and they asked, if I would be interested in joining Gilt Groupe to build a software development center in Dublin. I went to NY and met some of the brightest engineers in the industry and was totally blown away by the enthusiasm and the commitment to build and run the best e-commerce shopping experience on the web.
And here I am today sitting in a room with the Irish Finance Minister Michael Noonan announcing that Gilt is establishing its International HQ and a software development center in Dublin. And I can't tell you how exited I am about being part of that adventure.
Gilt is the number one flash sales site in the US. Within 3 years they went from 0 to more than USD 400M in revenue. Flash sales is outlet shopping over the internet and allows large designer brands to get the best possible deal on their excess stock. And it is frantic. Gilt has close to 5M members and sends 3M emails every day (within 15 mins) to notify its members about upcoming sales events. The next day at noon(est) the sale goes live and it is first-come first-served on all kinds of goods from a wide variety of designer brands. The discounts are from 20 to (sometimes) over 70 percent.
That presents a "small" technical challenge, because at noon within seconds the traffic on the website goes from decent to 5000 pages/sec. At peak time the site processes over USD 1M in revenue within 30 mins (every day). And it serves 99.7% of all pages, fully dynamic and personalized, within 100 ms at all times. And it cannot go down, meaning scalability, performance and availability are at the top of the requirements list. Fortunately Gilt employs only the brightest and the best.
Let me know, if you are interest to join us. I am hiring.
And here I am today sitting in a room with the Irish Finance Minister Michael Noonan announcing that Gilt is establishing its International HQ and a software development center in Dublin. And I can't tell you how exited I am about being part of that adventure.
Gilt is the number one flash sales site in the US. Within 3 years they went from 0 to more than USD 400M in revenue. Flash sales is outlet shopping over the internet and allows large designer brands to get the best possible deal on their excess stock. And it is frantic. Gilt has close to 5M members and sends 3M emails every day (within 15 mins) to notify its members about upcoming sales events. The next day at noon(est) the sale goes live and it is first-come first-served on all kinds of goods from a wide variety of designer brands. The discounts are from 20 to (sometimes) over 70 percent.
That presents a "small" technical challenge, because at noon within seconds the traffic on the website goes from decent to 5000 pages/sec. At peak time the site processes over USD 1M in revenue within 30 mins (every day). And it serves 99.7% of all pages, fully dynamic and personalized, within 100 ms at all times. And it cannot go down, meaning scalability, performance and availability are at the top of the requirements list. Fortunately Gilt employs only the brightest and the best.
Let me know, if you are interest to join us. I am hiring.
Sunday 19 December 2010
Maven, Flex/Air and Android - Trinity or Bermuda Triangle
Partially for professional reasons, partially out of plain, naked, old-fashioned curiosity (and also triggered by the Adobe announcement that Adobe Air now runs on Android) I am currently looking to find out how to use Maven to build a Flex/Air application for the Android phone.
... and edit the pom.xml to look like this ...
And ... it is not this easy. I am now working on this for a couple of weeks (elapse time that is - CPU time probably more 16 hours).
There is documentation available how to develop Flex/Air apps for Android using Flash Builder 4 (and other Adobe tools like Adobe Flash Professional CS5), but as soon as you want to use your own IDE (in my case AquaEmacs and Maven), things get difficult.
The components that you need to make work together and that have dependencies are ...
- The Maven release - I started with 2.2.1, but found out that I need to use flex-mojo 4.0-SNAPSHOT and this requires 3.0.1
- The flex-mojo release - I started with 3.7.1, but need to use Air 2.5, which is only packaged with Flex SDK 4.5, which requires flex-mojo 4.0-SNAPSHOT (have not tried, if it also works with 4.0-beta-3)
- The Flex SDK release - I started with 4.1, but found out that this release is not packaged to support Air 2.5, means I need to use Flex SDK 4.5
- The Air SDK release - I started with 1.5, but need to use 2.5, because this is the one that runs on Android
... means the winning configuration is ...
- Maven 3.0.1
- Flex-mojo 4.0-SNAPSHOT
- Flex SDK 4.5.0 (build 17689) (this includes Air SDK 2.5)
The only thing you need to install is Maven 3.0.1 (the rest will be downloaded as part of the build process).
Now the hard work starts and it is mainly hard work, because if you do something wrong the build process will just display a stack trace that points to a NullPointer exception, but that is maybe the price for doing leading (bleeding) edge stuff.
The next step is to get a project that works. You can get this by checking out the Maven/Flex 4.1/Air 1.5 sample from ...
svn co http://svn.sonatype.org/flexmojos/trunk/flexmojos-testing/flexmojos-test-harness/projects/concept/simple-air SimpleAir
... and edit the pom.xml to look like this ...
<?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright 2008 Marvin Herman Froeder Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language
governing permissions and limitations under the License.
-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<properties>
<flexmojos.version>4.0-SNAPSHOT</flexmojos.version>
<flex.version>4.5.0.17689</flex.version>
</properties>
<groupId>info.rvin.itest</groupId>
<artifactId>simple-air</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>air</module>
<module>swf</module>
<module>swc</module>
</modules>
<build>
<sourceDirectory>src/main/flex</sourceDirectory>
<plugins>
<plugin>
<groupId>org.sonatype.flexmojos</groupId>
<artifactId>flexmojos-maven-plugin</artifactId>
<version>${flexmojos.version}</version>
<extensions>true</extensions>
<dependencies>
<dependency>
<groupId>com.adobe.flex</groupId>
<artifactId>compiler</artifactId>
<version>${flex.version}</version>
<type>pom</type>
</dependency>
<dependency>
<groupId>com.adobe.flex.compiler</groupId>
<artifactId>adt</artifactId>
<version>${flex.version}</version>
<scope>compile</scope>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
<dependencies>
<!-- Air SDK dependencies -->
<dependency>
<groupId>com.adobe.flex.framework</groupId>
<artifactId>air-framework</artifactId>
<version>${flex.version}</version>
<type>pom</type>
</dependency>
</dependencies>
</project>
Please also edit .../air/pom.xml and replace %{flexmojos.version} with ${flexmojos.version}.
Now comes the big trick ... please edit .../air/src/main/resources/descriptor.xml and to look like this ...
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!--
Copyright 2008 Marvin Herman Froeder
-->
<!--
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
-->
<!--
http://www.apache.org/licenses/LICENSE-2.0
-->
<!--
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<application xmlns="http://ns.adobe.com/air/application/2.5">
<!-- Adobe AIR Application Descriptor File Template.
Specifies parameters for identifying, installing, and launching AIR applications.
See http://www.adobe.com/go/air_1.0_application_descriptor for complete documentation.
xmlns - The Adobe AIR namespace: http://ns.adobe.com/air/application/1.0
The last segment of the namespace specifies the version
of the AIR runtime required for this application to run.
minimumPatchLevel - The minimum patch level of the AIR runtime required to run
the application. Optional.
-->
<!-- The application identifier string, unique to this application. Required. -->
<id>main</id>
<!-- Used as the filename for the application. Required. -->
<filename>main</filename>
<!-- The name that is displayed in the AIR application installer. Optional. -->
<name>main</name>
<!-- An application version designator (such as "v1", "2.5", or "Alpha 1"). Required. -->
<!-- <version>v1</version> -->
<versionNumber>1</versionNumber>
<!-- Description, displayed in the AIR application installer. Optional. -->
<!-- <description></description> -->
<!-- Copyright information. Optional -->
<!-- <copyright></copyright> -->
<!-- Settings for the application's initial window. Required. -->
<initialWindow>
<!-- The main SWF or HTML file of the application. Required. -->
<!-- Note: In Flex Builder, the SWF reference is set automatically. -->
<content>${output}</content>
<!-- The title of the main window. Optional. -->
<!-- <title></title> -->
<!-- The type of system chrome to use (either "standard" or "none"). Optional. Default standard. -->
<!-- <systemChrome></systemChrome> -->
<!-- Whether the window is transparent. Only applicable when systemChrome is false. Optional. Default false. -->
<!-- <transparent></transparent> -->
<!-- Whether the window is initially visible. Optional. Default false. -->
<!-- <visible></visible> -->
<!-- Whether the user can minimize the window. Optional. Default true. -->
<!-- <minimizable></minimizable> -->
<!-- Whether the user can maximize the window. Optional. Default true. -->
<!-- <maximizable></maximizable> -->
<!-- Whether the user can resize the window. Optional. Default true. -->
<!-- <resizable></resizable> -->
<!-- The window's initial width. Optional. -->
<!-- <width></width> -->
<!-- The window's initial height. Optional. -->
<!-- <height></height> -->
<!-- The window's initial x position. Optional. -->
<!-- <x></x> -->
<!-- The window's initial y position. Optional. -->
<!-- <y></y> -->
<!-- The window's minimum size, specified as a width/height pair, such as "400 200". Optional. -->
<!-- <minSize></minSize> -->
<!-- The window's initial maximum size, specified as a width/height pair, such as "1600 1200". Optional. -->
<!-- <maxSize></maxSize> -->
</initialWindow>
<!-- The subpath of the standard default installation location to use. Optional. -->
<!-- <installFolder></installFolder> -->
<!-- The subpath of the Windows Start/Programs menu to use. Optional. -->
<!-- <programMenuFolder></programMenuFolder> -->
<!-- The icon the system uses for the application. For at least one resolution,
specify the path to a PNG file included in the AIR package. Optional. -->
<!-- <icon>
<image16x16></image16x16>
<image32x32></image32x32>
<image48x48></image48x48>
<image128x128></image128x128>
</icon> -->
<!-- Whether the application handles the update when a user double-clicks an update version
of the AIR file (true), or the default AIR application installer handles the update (false).
Optional. Default false. -->
<!-- <customUpdateUI></customUpdateUI> -->
<!-- Whether the application can be launched when the user clicks a link in a web browser.
Optional. Default false. -->
<!-- <allowBrowserInvocation></allowBrowserInvocation> -->
<!-- Listing of file types for which the application can register. Optional. -->
<!-- <fileTypes> -->
<!-- Defines one file type. Optional. -->
<!-- <fileType> -->
<!-- The name that the system displays for the registered file type. Required. -->
<!-- <name></name> -->
<!-- The extension to register. Required. -->
<!-- <extension></extension> -->
<!-- The description of the file type. Optional. -->
<!-- <description></description> -->
<!-- The MIME type. Optional. -->
<!-- <contentType></contentType> -->
<!-- The icon to display for the file type. Optional. -->
<!-- <icon>
<image16x16></image16x16>
<image32x32></image32x32>
<image48x48></image48x48>
<image128x128></image128x128>
</icon> -->
<!-- </fileType> -->
<!-- </fileTypes> -->
</application>
... and you are (almost) done.
Last put not least, you need to make sure Maven is correctly configured to find the right components and the right plugins. My ${HOME}/.m2/settings.xml looks like this ...
<?xml version="1.0" encoding="UTF-8"?>
<settings
xmlns="http://maven.apache.org/settings/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://maven.apache.org/SETTINGS/1.0.0
http://maven.apache.org/xsd/settings-1.0.0.xsd
"
>
<localRepository>/Downloads/maven/repository</localRepository>
<profiles>
<profile>
<id>roland</id>
<repositories>
<repository>
<id>mvndefault</id>
<name>Maven Default Repo</name>
<url>http://repo1.maven.org/maven2</url>
<layout>default</layout>
</repository>
<repository>
<id>mvnsearch</id>
<name>Maven Search Repo</name>
<url>http://www.mvnsearch.org/maven2</url>
<layout>default</layout>
</repository>
<repository>
<id>flexmojos</id>
<url>http://repository.sonatype.org/content/groups/flexgroup</url>
<layout>default</layout>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>flexmojos</id>
<url>http://repository.sonatype.org/content/groups/flexgroup</url>
<layout>default</layout>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
<activeProfiles>
<activeProfile>roland</activeProfile>
</activeProfiles>
</settings>
Finally change directory to the base directory of the checkout and run ...
> mvn clean install
After 5 mins of downloads you should be done building your first Maven, Flex 4.5, Air 2.5 app.
The next step is to build and install an Android apk package, but I am still working to make this work. Stay tuned.
Wednesday 24 November 2010
AquaEmacs and JDEE and Method Completion - Cannot find JDK's tools jar file (or equivalent). Type M-x describe-function [RET] jde-get-jdk-dir for more
Hhhmmm ... nerd alert: If you do not like AquaEmacs, JDEE and Method Completion ... don't read this :).
Otherwise ... good news: Not sure, if you have stumbled over this, but if you try to make your method completion work you might get an error message along the lines of ...
Cannot find JDK's tools jar file (or equivalent). Type M-x describe-function [RET] jde-get-jdk-dir for more info.
... when you hit C-c C-v . to complete a method name. The problem is that the beanshell cannot find tools.jar (or more specifically classes.jar (on MacOS)).
In my case my jde-get-jdk-dir returns ...
/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home
... but if you look the error message up in ...
~/Library/Application Support/Aquamacs Emacs/jdee-2.4.0.1/lisp/jde.el
... you will see that on the darwin platform (MacOS) it tries to find the classes.jar file (which contains the tools stuff on darwin) in Classes/classes.jar, but the correct location is ../Classes/classes.jar, means to make it work you have to change jde-get-tools-jar() in jde.el to ...
(defun jde-get-tools-jar ()
"Gets the correct tools.jar or equivalent. Signals an
error if it cannot find the jar."
(let ((tools
(expand-file-name
(if (eq system-type 'darwin)
"../Classes/classes.jar"
"lib/tools.jar")
(jde-get-jdk-dir))))
(if (file-exists-p tools)
tools
(error (concat "Cannot find JDK's tools jar file (or equivalent)."
"Type M-x describe-function [RET] jde-get-jdk-dir for more info.")))))
... and then byte-compile it (just go to the Emacs-Lisp menu and select "Byte-compile this File"). Last but not least, you need to restart AquaEmacs and you are done.
OK. I admit it ... this is nerdy :).
Tuesday 31 August 2010
Cinema Screening in Aid of Haiti - Watching "The Commitments" (for a good cause)
Sometimes it is possible to combine something that is fun with something that is useful.
I am happy to present such an opportunity, since my colleague Susan O'Hara is organizing a charity event in the Sugar Club on Lower Leeson Street to watch "The Commitments" on Wednesday, 15 September 2010 at 7pm.
The cost is EUR 15,- pp. The feeling to have some fun and do something good is priceless.
For all inquires, please feel free to contact Susan directly. Hope to see you there :).
Tuesday 8 June 2010
Autonomy, Mastery, Purpose - ... or ... how to unleash creativity.
This is going to be a short blog post. A Facebook post by Brian Kelly made me revisit the stuff that Dan Pink did and is doing.
The main idea behind Drive (RSA, TED) is that Autonomy, Mastery and Purpose unleash the creative power of individuals and teams, not material/monetary incentives. Opensource and Wikipedia and ... are obviously the classic/legendary examples for this FACT (and yes, it is a fact :)).
Check it out. It is an Idea Worth Spreading :).
Thursday 22 April 2010
Managing complexity with OSGi - In bundles and between bundles
Right now the Brandvis SelectPortal system is based on Microsoft .NET and we constantly improve it and add features. While we do this we also constantly refactor the system to eliminate complexity to make it easier to maintain/extend.
Triggered by this work and triggered by a talk on reuse of OSGi bundles that I attended a couple of years ago, I started to think about complexity again. The main conclusion of that thought process is that there is probably an optimal (means minimal) complexity for any given system.
To get to that optimal level of complexity you constantly refactor the system (because there is no chance in hell that you will get it right the first time around by thinking about it and then implementing it) and change the granularity/size of your reusable software artifacts (classes, bundles, services).
Getting the granularity/size (and the responsibilities) of a reusable software artifact right, is probably the holy-grail of software engineering and there is no easy answer, because if you cut it too small and build the system from a lot of very simple, small software artifacts the complexity and dependencies and relationships between the artifacts get out of hand. Going the other way you can try to reduce the complexity of the system, by building it from larger software artifacts, but then these artifacts itself will become more complex.

That means that in any case you need to build your system on a software platform that allows you to iterate on getting the granularity of the software artifacts right. I believe OSGi is such a platform.

