Recent Comments

Manage multiple projects (and avoid information overload) using paper

If you’re like me, you may have a lot of parallel running projects that all are constantly requesting a piece of your time. This can be quite stressful, because you are not really sure what you should be working on at a particular time. The system I use is the system that takes away this stress and gives you a feeling of control over all the projects.

There are 3 components:

First Component: Progress Calendar

This is the most important part of the system.

  • First of all, a big sheet of paper is split up into weeks (or whatever granularity works for your projects).
  • The high level tasks neccessary to be done for a particular project in a particular week are written on an orange piece of paper and stuck to the sheet.
  • When the tasks are done, the orange coloured paper is removed and replaced with a green paper.
  • The pink strip points to the current day, allowing you to guage in an instance what things from the past are still pending

Progress Calender

Progress Calender

Second Component: White sheet of paper

  • I buy a 500 stack of paper, and use a sheet every day. On this sheet is written everything I have to do on a high level. I.e, this sheet of paper has all the targetsI want to achieve, but without the actual steps neccessary to achieve them. Yes, I waste a lot of paper.
  • The items on the paper should be items that could be finished in a few minutes to a few days, so the contents of the paper does not stay the same for months.
  • When done, the items are striked out.
  • On the next day, the items are all copied to a new sheet of paper, minus the ones that are striked out. The old paper is thrown away.
White sheet of paper
White sheet of paper

Third Component: Computer based todo lists

I’ve gone through many different ones. Currently, I use a text file. I use this to manage the details of the larger projects that are on paper. This list is synchronised across multiple computers with dropbox. At the bottom of this list are the long term and bigger things I want to achieve.

Understanding Value

magrittepipe_s

Some items are valuable and some are not. For example, an antique dresser used by Churchill is valuable. An old dresser lying on some street corner is not valuable, even if it happens to be the very same dresser.

There lies the fundamental misunderstanding of value by many people - that value is intrinsic to the product, that it is something within the product itself. This is wrong - value is completely external to the item of value.

Imagine you put a team of a hundred people to work on a game, and they worked for 2 years. You spend over 10 million dollars developing this game. You release the game, and 300 buy the game, making you 4000 dollars. What is the value of the game? Is it in what you put in, or in what the market saw as its value? Obviously, the value of the game was determined only in the open market, and all the money you pumped into the game did not improve its value.

That’s the fundamental understanding that has to be gained - value is only created when an object is in a market where value can be established. As soon as a person shows that he willing to exchange certain other items of value for this particular item, this establishes the temporal value of the object at that level. This value is only valid in the exact moment where the offer is made, and can be used as a reference point for any future negotiation, but that does not mean that the value will stay at that level!

For example, if a colonel is illegally selling medals for an army, the value of those medals is determined by what all the other soldiers are willing to pay for those medals. Depending on the benefit achieved by receiving those medals, the value of the medals can go very high. The minute the army loses the war however, the value of those medals is completely wiped out. Over the entire process, the medal was just a piece of metal. But its value can fluctuate massively. This is because the value of the medal is completely external to the medal.

Value is not created by the cost required in creating the product. It’s not created by the polish of the product. It’s not created by how smooth the product feels. Those are attributes of the product that may create value when the product is placed in an appropriate market, but they are not valuable by themselves.

For example, diamonds. These stones only have value because the market wants them - they are just stones that are not very expensive to produce nowadays.

How is this understanding relevant?

1. When asked for a reason, you say “because I worked so hard on it”. Your working hard on something means nothing. Your hard work on a product that fails shows that you do not know how to convert work into value.

2. A product that has not been released into a type of market has a value of 0. No matter how polished, how well working, it has absolutely no value if it is not in a market.

3. Once a product is in a market, the value of the product is not established by the value you think it has, but by the value that the market is willing to exchange for it. You can reduce the value of your product to 0 by pricing too high. For example, if you price a leather bag at 100.000 dollar, and nobody purchases it, then you can say that “The value of the leather bag priced at 100.000 dollars, is 0 dollars”. If you reduce the price to a more sane level, for example $20, you bag gains in value because you start selling it.

4. Value is created by demand. When you are working on a product, you should not be working on a product that is a good product, but a product that offers value to other people, because they will then be willing to exchange other items of value for this product. Part of the value of a product lies in the story around a product. For example, a cube stone cut by a machine in a minute is worth $10. The same cube, carved by a soldier lost on a greek island in 1942, has more value. The value of that cube is completely dependent on the story, because the cube exchangeable with many other cubes. So, when you have similar products, you can raise your value by using a story that creates value in the mind of customers.

5. The expectance of value creates value. Most low-end flatscreen TVs come from factories in the Guangzhou province in China. They are all made with similar components, but when they arrive in Europe, they are branded with different names. The companies that have created value in the past can create a higher market value for their product by simply branding it with their name. The value of the product does not lie in the customer service or in the brand of the product, it lies in the fact that people are willing to pay a certain price for that product. And the people are willing to pay that price because they believe that the value of the product is accurately advertised by the company. They believe this because in the past they (or friends) have paid this price and they have not been disappointed. Yes, it’s the same flat screen TV, but the value is different because on model has a story, and the other does not.

6. Value is temporal. Value is not something that exists in a product, so it can disappear without anything changing about the product. For example, let’s say I made an ajax web based todo list in 2001. This would be a valuable product back then. If I left it unchanged right up to 2009, the value would be next to nothing, because the demand for that product has completely changed.

7. Value exists in tunnels, and if this tunnel is broken, the value of the product can break down very quickly. For example, TV shows lost some of their value because of the free distribution of content on the internet. A new value exchange tunnel opened up, and the customer had to exchange less to get the TV show. The less tunnels to exchange a product, the more the value can be artificially influenced.
To summarize - a painting by the best painter in the world is worthless. There is no value intrinsic to the painting. The painting only gains value when some type of demand for the painting is created.

We need more philosophy without facts

TomatoesModern intellectualism is flawed in a fundamental manner - there is too much dependence on ‘facts’ and pre-existing opinions, and too little tolerance for ideas that have not been previously researched.

And the really terrible part is that these ‘facts’ usually are not. If a researcher publishes some soft research in some area - for example, on how memories are stored, you will see people reference this research as if it were fact. It’s usually not - it’s a supposition, it’s a theory backed by statistical data, it’s just a step towards a more complete understanding, but it’s not a fact.

The university system teaches people to have ideas that are based off the published results of other people - but some ideas cannot reference pre-existing work because the work is obscure or no research has been done in that area. One would have to make an argument that has suppositions in it for which there are no references. Obviously, such an argument may be wrong, but this does not make it pointless - rather, if the argument is compelling logically, then parts of it may be correct. There is great value in reading through different theories that are not all based on the same facts - because seeing a bunch of different ideas from different people is exactly what may bring the flash of intuition that takes us all forward.

Let me get more concrete and give an example: Let’s say we are holding an argument about the fundamental structure of matter - our educational system encourages people to back up their arguments by referencing pre-existing opinions and simply quoting a bunch of people researching string theory. If a layman attempted to bring in a new idea to explain the structure, he would be asked to back it up. It cannot be backed up obviously, because he is not a researcher - but the thing is that he may be right. If the professionals would consider his argument on its merits, and simply as a philosophical excercise, they may be able to reach a better result when they combine it with their actual knowledge.

A disadvantage of too large a specialisation in a field is that one tends to lose perspective. One tends to dismiss ideas that threaten the core path you are following. It is good for people to be following different paths, and the problem with always needing to reference pre-existing works is that people will always tends to follow the orthodoxy, leading to less creativity and fewer new ideas.

I am of the opinion that people should be encouraged to follow different theories and try different methods. Most will fail, but a small number will produce new thoughts and ideas. And that’s what has brought us this far as humans - it’s not our research or analysis, it’s our ideas.

Setting up your development environment using Virtual Machines

I have to program in a very diverse set of environments:

1. Web stuff with Django using Eclipse

2. C/C++ using either Visual Studio 6, Visual Studio 2005 or GCC, with Windows being my target

3. Objective C for the iPhone (on Mac OSX)

4.  Arduino C for my Arduino board

This leads to three problems:

First of all, the systems are very hard to setup. It takes days to install all the SDKs, set the paths right, make sure that everything works with each other, avoid conflicts. Visual Studio is the biggest culprit here, as Visual Studio 6 only works with older SDKs.

Secondly, I work on a single computer, but I need at least two different operating systems - Mac OS X and Windows.

I also need my computer  to be a laptop because I travel reasonably often to meet clients - which brings the problem, that I cannot afford to lose my code should my laptop break as I am traveling.

This is the solution I’ve settled on, and it’s a pretty good one.

Hardware

I purchased a MacBook and maxed out the RAM at 4GB (buy the MacBook with minimal RAM and Hard-drive, then buy cheaper ones on Amazon if you want to save money). I bought an extra 22 inch monitor, giving me two screens to work with (as well as two different resolutions to test with). I also got a bluetooth keyboard and mouse.

Mac OS X automatically recognizes the keyboard and mouse when I place my laptop on the desk, so I don’t need a docking station.

Software

I then installed VMWare Fusion On Mac OSX, and installed 2 XP copies and 1 Vista copy. With 4GB RAM and VMWare Fusion, Windows XP runs perfectly, I don’t notice any difference from a native install.

I then installed all my development tools on XP_Dev, and setup everything to run perfectly. All SDKs are installed, everything links and compiles properly. I made a backup of this system on an external harddrive. I setup SVN on XP_Dev, and sync all the code there with my SVN server at unfuddle.com. The Vista and other XP system are newly installed systems, and immediately after installing, I made an image copy. I put the essential stuff on (like Test Video Files), WinRar and so on.This means I can always have a clean environment for testing booted up within 10 seconds. I can also perform a Vista or XP test without needing to reboot.

It also means that I never have to reconfigure my development environment, and if I switch PC, I can simply copy my development environment in without needing to reinstall all my tools again.

On Mac OS X, I installed my Arduino Development Environment as well as XCode.

Configuration

There is nothing much to configure, you just need to disable some keyboard shortcuts in Mac OS X to prevent them from interfering with the Visual Studio shortcuts.

Playing Audio with the iPhone SDK

There are several ways to play audio with using the iPhone SDK:

1. System Sound Services

2. Audio Queue Services

3. OpenAL

4. AVAudioPlayer

Before I finally settled on one, I went up a few wrong paths.  Let me give you some advice - if you want to play sounds in your none-game iPhone application, the best route to go is to use the Audio Queue Services. Yes, the documentation claims it is complicated, but the advantages outweigh the minimal extra complexity.

You should pick this technology because of the SpeakSound sample. This sample has pre-built classes that demonstrate an AudioPlayer and an AudioRecorder. You can simply copy these classes into your project, make a few small changes, and you can not only playback, you can also record. It took me only about 15 minutes to integrate this into my app.

The System Sound Services did not work for me, seemingly because it requires some special audio formats. OpenAL is complicated, and seems to be the Audio Equivalent of OpenGL, and  theAVAudioPlayer is only available in iPhone SDK 2.2.

A few things Mac OS X should change

I use a MacBook, but until recently, ran Windows on it. However, I’m writing an iPhone version of one of my apps, so I had to put on Mac OS X. The bulk of my development is still in Windows, so I bought 4 GB RAM, put up VMWare and run virtual windows most of the time.

But I generally use Mac OS X for normal everyday things like word processing, movie watching and even after a few weeks of using it, there are a few things that have continued to stay annoying. I believe that if Mac OS X is to really enter the mainstream, it will need to change these things.

  •  The fact that the taskbar does not have a clearly defined upper border. Windows seem to float.
  • One cannot see if an application is open or not by looking at the taskbar. Some apps (like Adium) show this, most don’t
  • No easy access to the desktop
  • No proper fullscreen mode. Sometimes I want to focus on just one application without distractions
  • When you have several windows open, it’s difficult to locate the one you are looking for
  • When you click the Firefox icon, a new window does not open
  • There is no date on the clock
  • External keyboards get weird
  • When you search for files, you don’t see the file size
  • The finder sorts the folders together with the files instead of separately
  • The menu bar is way at the top of the screen instead of on the window it belongs to
  • Buttons often don’t have tool tips, so you have no idea what they do
  • Clicking an application icon sometimes has no effect. It just does nothing
  • My jpeg files preview in finder
  • When you overwrite folders, it deletes all the old items
  • The indication that a folder is empty is not easy to recognize
  • Some applications like XCode and Photoshop open, but only change the menu bar at the top. It’s difficult to see that they have started
  • The installation process is really weird. That dragging file from left to right thing was difficult to grasp at the beginning. Also, different apps seem to use different installation processes for no reason I can figure out

You probably say - why should Apple change? It’s the Apple way, no? Well, Apple should change so that there is greater consistency across all operating systems. The Apple way in the aspects I’ve listed above are inferior to both Linux and Windows.

Software needs to get more consistent - it’s already complex enough. We need to not only simplify, but gravitate towards common behaviour, such that the learning curve is eliminated when one switches from one operating system to the other.

Car’s don’t behave differently in their fundamental usage, but they can vary widely in their comfort. That same type of difference in operating systems should be strived towards, not fundamental differences in behaviour.

The OS is becoming increasingly irrelevant - at the moment I switch seamlessly between Windows and Mac OS X apps, without noticing any significant difference in performance - 4 gig RAM and 2GHZ dual core make this possible. In a few years, this will be even more pronounced - the only source of irritation in choosing your OS then will become this behavioral inconsistencies.

A solution for the “send email to relatives when I die” problem

We all have a bunch of data online, and I know I have asked myself a few times - what would happen to all that when I die? Some information, I would like to be sent to my family, for example, my Bank Account details. There are a bunch of services that do this death notification thing, but most of them do it wrong.

What they do is that they send you an email every 6 months or so, and if you do not reply to this email, then they assume you are dead. This is retarded. I may have just gone on holidays, or I may be sick, or changed my email account or something - just because I don’t answer a notification does not mean I’m dead.

My solution is better, and does not involve any notifications. It goes this way:

When people sign up for the service, they enter a bunch of email addresses from different people, for example:

1. Mother

2. Father

3. Best friend from high school

4. Business Partner

Important is that the people are trustworthy people, and that they do not know each other very well. Each person receives a notification email, saying they have been added to the service, and that when I die, they will have access to the information within.

When I actually do die, any one of those people goes on the site, and pushes a button : “Mark is dead”. When this button is pushed, an email gets sent to everyone in the notification list (with a 2 week delay), and everyone is asked to confirm that I am indeed dead. If everyone confirms it, then the information is released.

This method works because your mum is never going to go into conspiracy with your business partner to gain access to your information.

Keeping Django Real Reference 1

Listing some quick info that I may forget later


  • Django Redirect a page


    from django.http import HttpResponseRedirect
    return HttpResponseRedirect(’/')

  • Django Check if user logged in

    if not request.user.is_authenticated():

  • Django Generic Views Template

    <ul>
    {% for object in object_list %}
        <li class="project">
            <h3 class="name">{{ object.name }}</h3>
        </li>
    {% endfor %}
    </ul>

  • Include another URL config file, but make the urls be appended to the base URL

    . For example, if I write a registration app and I want site.com/login and site.com/logout to exist, but want to define these urls from within the app

    (r”, include(’registration.urls’)),

    The trick is to make the first parameter an empty string

  • Serve static files only in debug mode from the internal web server

  • if settings.DEBUG:
        urlpatterns += patterns(”,
            (r’^media/(?P<path>.*)$’, ‘django.views.static.serve’, {’document_root’: ‘C:/media’}),
        )

     

  • Add a login/logout bar to your application

    A login bar should be done using a template tag, as it is the same across many pages, but changes state depending on the particular page

  • Django Login using email address

    Don’t waste your time trying to find a better solution. Use the EmailBackend from DjangoSnippets

The Gorilla-Monkey style of development

153716143_5bb1520cbf Sometimes when programming, it would be great if one did not have to do two tasks:

 

  • Research APIs or Information
  • Write short functions with clearly defined outputs and inputs

 

If one has a team, then occasionally, this gorilla-monkey style of development can lead to very fast results. How it works is this:

 

Step 1

 

306753263_7b923bce29 The gorilla coder plans and designs his program using whatever modelling tool he is comfortable with. Then all monkeys come together and sit with the gorilla at a table. He starts programming, almost like he is doing pseudo code, for example:

void init()

createListView();

createPanels();

loadSettingsFromRegistry();

After writing the functions he immediately delegates the actual writing of the function to each of the codemonkeys. They start writing, and their job is to provide the result between 10-30 minutes. If anything takes longer than that, then it should not have been delegated in the first place. If it was, then the first monkey that is finished goes to help the slow monkey.

 

Step 2

226080156_4680770c2a

  When the gorilla stops writing code, he assigns research projects to each monkey and starts designing the next enclosed unit. For example he may say:

Monkey 1 - Find out how to download a file using TCP/IP sockets
Monkey 2 - Find me a good SSL library

When the gorilla is not working, no monkey works. They are not independent programmers, they just function as extensions of the gorilla. A bit like helper threads.

The reason for music

52034839_ef6c93ef26 I’m of the opinion that if we can ever clearly state why human beings enjoy music, we will also be able to create the first artificial and fully conscious brain. I’ve been thinking about a theory that the reason we like music is related to the reason our brain has worked in a manner that has made us such a successful species.

Human evolution is like software in that each stage of complexity has made the following stage much easier, and a lot more likely to happen spontaneously.

To explain, imagine I asked you to draw a simple sketch of a car using software. If you used line art to do it, you would have a lot of work to do. However, imagine you first programmed a structured called "Box" which represents a simple box. THEN, you construct the car out of a series of Boxes.

The first step is easy to do. The second step is also easy to do. If you do not make the split into two different steps, you face quite a complex task.

Human evolution has followed a similar path - the original brains of the first multiple celled organisms could react to the simple stimuli they were exposed to. Further organisms were not evolutions from scratch, they were simple the second step of a process that had a first step already completed.

What does this have to do with music? Along our evolutionary pathway, we entered a stage where the brains available searched for patterns, and reacted to patterns. For example, let’s say you walk out on the street, and you see a pirate looking in a shop window. This would be strange, but would not trigger any behaviour. Lets say you walk 4 shops down, and you see a sailor looking in a window. Your pattern matching skill will immediately trigger and your brain will start looking to see if it can further find more items that fit that series.

A pirate and sailor are unlikely to affect you, but you are still looking to complete the series. Your brain is interested in patterns regardless of if they will affect you directly or not.

Recognizing patterns and expecting them to happen again is the key to our evolutionary success. Crocodiles will always repeat the same actions given the same stimuli. They do not learn by observing patterns. However, imagine you had the jaws and appetite of a crocodile, and you observed that every time you lunged at Steve Irwin, he would escape from your jaws, you would stop trying after a while. You have recognized a pattern and you expect the pattern to continue.

My point: We have an inbuilt system that loves pattern matching. It’s the key to our success.

Where does music come in? Music is enjoyable to us because it activates our pattern matching skill. Music has rhythm, harmony or some other repeating form. When we recognize the repetition, our pattern recognition part gets fired up, and we get a small brain reward for having recognized that pattern.

In my theory, this is why people tend to stick with a certain genre of music - they are comfortable with the patterns that come in that music, so they get the most satisfaction from that type of music.