Joe Monti

Friday, December 19, 2008

To be continued...

I've upgraded my site to WordPress and moved my old Blogger posts here rather than backfilling the 105 posts to WordPress. The blog here will no longer be updated.

New posts and my new site can be found here.

Thursday, October 30, 2008

MAKE: Void Your Warranty T-Shirt

This is an awesome shirt with a great message:


You can check it out / buy it here.

Friday, September 26, 2008

Avoiding Ruinous Compromises by Richard Stallman

Great piece by Stallman. Everyday challenges and desires inflict non-free software on our lives. It can't be avoided. Unfortunately, I'm not willing to give up what it takes to be completely free of non-free software, but I do try to make as few compromises as possible. What is even more challenging is the ubiquity of software in our lives beyond the PC, where free software has made minimal inroads. A primary example that is becoming much more relevant today is the mobile phone. Just about everybody has one and none of them can run on completely free software, most of them can't even run any free software, at least on standard wireless carriers in the US. Google's Android OS might be just what the free software doctor ordered, so we'll see where that goes.

read more | digg story

Thursday, September 25, 2008

SDK shoot-out: Android vs. iPhone

Apple and Google differ along familiar lines with their smartphone development kits

read more | digg story

Friday, September 19, 2008

iPhone, the cell network, and the (cr)App Store

So I finally got an iPhone. It is almost everything I could want in a phone, but there are still some things that on principle I despise. It does make some improvements, but it still falls short in my book.

My ideal phone has a lot to contend with, namely the cell phone industry and network. There are two main things that most go against my principles. First, the cell phone network is tightly guarded and heavily restricted. Because of this, the carriers exhaust their advantage and significantly over-charge for conveniences that is vastly higher than their cost. It is a place where a 10 second clip of a song to set as a ringtone costs as much or more than the full song you can use anywhere. It is also a place where it is as much as 42 times more costly to send data via SMS (max 160 characters) to your neighbor than it is to send the same amount of data to the Hubble Space Telescope. And second, in an age where software is so openly and freely available on PCs, it couldn't be more closed and costly on cell phones. The software libraries are generally very limited, crappy, and expensive (for how crappy they are). It is expensive and difficult for software developers to get their software on phones. And most of the ones I've seen are basically just advertisements packaged as games.

Based on this, I have the following requirements:
  1. I must not be wildly over-charged for conveniences (cheaper or free-if-you-own-the-song ringtones and cheaper or free-if-you-have-a-data-plan sms messages)
  2. I must be able to write and easily install my own software for free (barring hardware costs)
  3. I must be able to download and install software that came from anywhere
  4. I must be able to freely give my source code to anyone who wants it
  5. I must be able to download, modify, and install software from source code that came from anywhere, if the original developer chose to release their source code
These can be achieved by the following:
  1. Carriers and device manufacturers must practice ethical pricing
  2. There must be a freely available SDK and it must be easy and free to load software compiled by it
  3. It must be possible to load software that came from anyone or anywhere, and I am aware of the security implications
  4. There must not be restrictive licensing that restricts how source code is shared
  5. There must be a way to use source code from others and install it on my phone
If you're familiar with the iPhone you'll know that the iPhone has made little headway in this area compared to other phones. What it does have is a freely available SDK . You would think that should open up the door to everything else but Apple/AT&T have been able to plug any holes the SDK may have opened to my other requirements by doing the following:
  1. They imposed a license restriction that does not let anyone share or talk about source code. This is just wrong, for so many reasons, and is probably the thing I despise most about the iPhone since it is what prevents the iPhone from fulfilling my further software related requirements.
  2. All software that is publicly available must go through the (cr)App Store, which brings with it all the restrictions and wims Apple and AT&T impose upon it. See here and here.
  3. There is a way to get software that you haven't written and that didn't come through the (cr)App Store, but it is severly limited and does not allow publicy available software.
Also, Apple has done nothing to fulfil my requirement #1, the wildly over-charging for conveniences (re: ringontes and sms), when it could have done so much. I expect that most of this is because of forces outside of Apple, but they could have made more progress.

Apple did, however, get just about everything else right with the iPhone. It has the right hardware (camera, gps, accelerometer, etc), an amazing interface, and a lot of great software that is reasonably priced and really easy to get. While there is a lot of great software, the above restrictions leaves me with the following wish list of software:
  1. A real SIP phone, and it is ok if I have to be on wifi.
  2. Tethering software
Some may say that I can do all these things I'm talking about, but they require jailbreaking the iPhone. That is a hack, voids the warranty, and isn't available for the iPhone 3G. Hacking is not a solution to these problems, but hacking does tend to motivate vendors to give the people what they want. If that's what it takes, then, well, I know what to do, and you now do too.

(Note: I should mention there is hope for my requirements in Android and HTC Dream, but costs and contracts will prevent me from going there anytime soon. Grrr! Frustrating!)

Labels:

Thursday, May 15, 2008

Where to Simulate Behavior

In this post I am going to describe how behavior does not have to be simulated on the surface; it can be simulated beneath the surface through the interaction of lower level components to produce the desired behavior.

This is most evident in the real world. The real world is built on top of real things, which are themselves built from smaller things, which are built on even smaller things, and so on, possibly to infinity, but more likely ending with strings. For instance, you are made of organs, which are made of cells, which are made of chemicals, which are made of atoms, and so on. And each of these exhibit a behavior which can be simulated in software if its behavior is sufficiently known and software engineering techniques exist to simulate them. While it may not be the case that behavior at all levels can be perfectly simulated, lets assume for my arguments that some day it can be mastered.

Following the example of simulating you, we could attempt to write software that behaves exactly as you do. But we can also write software that behaves exactly as all your organs do, connect them exactly as they are connected in your body, and we will have created something that collectively behaves exactly as you do. We could also write software that behaves exactly as all the types of cells in your body do. Then we could put these cells together exactly as they are put together in the organs in your body. Then connect these exactly as they are connected in your body, and we will have created something that collectively behaves exactly as you do.

This is quite an interesting revelation for me with important implications on how behavior can be simulated. Instead of attacking a complex problem head on and recreate it in software at the top level, if you know details on how the subsystems work and can sufficiently recreate them in software, you can write software to simulate the behavior of lower level components and then link them as the real lower level components are linked to produce the desired top-level behavior.

This introduces a new problem for designing software when this approach is taken. The problem is how to connect and combine the lower level components. This may be more complex than writing software to simulate the top-level behavior. A prime example is in simulating the human brain. People have very good models of neurons and can create software the behaves very close to the real thing. But the wiring of neurons in the brain is so complex nobody has connected digital neurons in such a way that the human brain is simulated through simulating and connecting digital neurons.

But the brain is not a nearly random mass of neurons. While the brain is nearly completely made of neurons, it has been found that neurons form specific components that perform specific functions that are then combined to form higher-level components and so on. Based on my basic understanding, neurons form cortical columns that perform specific functions such as recognize patterns and make predictions. Then these cortical columns form levels of cortical hierarchy that generalize information information going up the hierarchy and localize information going down the hierarchy. Then these levels of cortical hierarchies form functional systems of the brain such as the vision system, auditory system, etc. And finally these are combined to form what we experience as consciousness. (note that when I have been talking about the brain, I have been focusing on the neocortex, which is the brain of our brain where real intelligence occurs).

Based on this structure of the brain, we can attempt to write software to simulate any of these components of the brain such as the cortical columns or levels of the cortical hierarchy. But again, with the brain, it is so complex and so little is known, this is very hard to do. And even when moving up to higher level components it is exceptionally difficult to be able to put these components together to form what we call the brain.

I am still hanging on to the idea that any behavior at any level can at least some day be simulated sufficiently in software, but this is not the case today. But there is another option for simulating behavior when the complexity at the highest level is beyond the capability for direct simulation. If lower-level components are sufficiently known, they can be simulated and combined to form the top level behavior. But there is a trade off, it can be just as hard, if not harder, to combine simulated components than it is to simulate at a higher level.

The real point I am trying to make is that real-world behavior is driven by a hierarchy of components, each of which exhibits behavior that when sufficiently known can some day be sufficiently simulated in software. When attempting to simulate something like the human brain, there are several layers of the hierarchy that can be simulated, not just the top-level of the brain or specific lower-level components such as neurons. There are several layers above and below the actual neurons that exhibit behavior that might be simulatable in software. And when attempting to solve a complex simulation problem like simulating the brain, don't lock yourself into the obvious paths. Look for and try to understand the hierarchy of components and find the level that make sense for the problem at hand. Some lower-level components might be unnecessary to simulate while some higher-level components might be too complex to simulate. Know that options exist and explore them.

A few final closing questions to clear up some words I've used.

What is behavior?

Behavior is observable information. It can be observed via direct human observation or measured via instrumentation. There may be more going on under the hood of the behavior, but I don't think it matters. If we are trying to simulate the intelligent behavior of the human brain, why should it matter if or how our artificial brain thinks to itself? If for all externally observable and measurable reasons it behaves like a brain, I don't think it matters what happens on the inside if our only goal is to simulate the intelligent behavior of the human brain. However if you are trying to simulate every neuron and every synapse then it does matter how it works on the inside. This could be the case if you are trying to understand the human brain and/or apply knowledge learned from the simulated brain to the actual human brain.

The point is that when only the top-level behavior is of concern, there is no need to simulate, in software, at any lower level unless a higher-level behavior is too complex or there is something to be learned by lower-level behavior. Because once you simulate, in software, at a particular level, the lower levels become irrelevant and do not exist in the simulation.

What does it mean to simulate?

I'm really using the word simulate in two ways. I have mostly used it to describe the process of creating software that is supposed to act like whatever you are trying to make it act like. In this case the software is directly simulating the desired behavior. This may or may not be the top-level behavior. It is just behavior that is being simulated in software.

The other way I use the word simulate is to describe the end simulation, regardless of whether it is being directly driven by software or whether it is being driven by the interaction of lower-level components. I have heard this called an n-order simulation, or when n > 1, emergent behavior.