The "FreeBSD laptop as a Wireless Access Point for an iPhone" project
I wrote earlier about has made me some followers, mostly they have
no idea where the free internet connection comes from. But, based
on the amount of download measured on it, they are enjoying it. One
of the methods to determine how many people are on it is to use the
output of the "arp -na" command: Every MAC address you see there
is a mobile device which is associated with the wireless access-point
you created.

One thing which you can do with that data is to match it against
manufacturers. Very boring for non-networking techies... Don't read
the rest :-)

MAC addresses consist of 12 hex-digits (48 bits) which are split in
two parts: A six hex-digit (24 bits) prefix and a six hex-digit
sequence number.

The MAC (or OUI as the IEEE calls it) prefix database can be found
on the website of the IEEE at
http://standards.ieee.org/regauth/oui/oui.txt. It contains at the
moment of writing 14765 prefixes. The manuf(acturers) file from the
Wireshark project can be found at
http://anonsvn.wireshark.org/wireshark/trunk/manuf and contains
18321 prefixes plus a handful of shared prefixes.

Why is the one from the Wireshark project larger? Not really sure,
but if you look at the registration costs it (US$ 1750 for a public
registrered prefix OR US$ 1750 plus US$ 2100 per year for a private
registered prefix) must be part of it. So it could be that the list
from the Wireshark project has determined a bunch of the private
ones. And unlike IP space which you can register in advance, you
can't get a new prefix until you have certificated that you have
used 95% of the sequence numbers.

"Advanced" could be a mistake in here, since it matches Advanced
This and Advanced That. "Private" means a company who pays the US$
2100 per year. Shenzhen has the same issue as "Advanced", it is a
large bunch of companies in the Shenzhen city in China (near
Hongkong). Apple was the company I didn't expect in the Top 10,
but considering their iPhone / iPad success, it shouldn't surprise
much.

Every prefix has 2 ** 24 entries in it, or 16 777 216 (about 16
million if you are conservate, or 17 million if you are optimistic),
making there 1.4 billion Apple MAC addresses in the world. That
number is not the number of Apple devices, since you need one per
network interface: Ethernet, wireless or Bluetooth.

But the other number of Cisco is much more impressive: 8 438 939
648 MAC addresses. More than the next five in the list together.

Unfortunately the list of prefixes does not contain any assignment
dates, it would have been interested to see what happened when LANs
based on switching instead of hubs became the norm (and thus Cisco
when Cisco started to sell their switches) and when mobile devices
like the iPhone became popular, it would have boosted the allocation
rate by Apple for sure.

MAC prefix exhaustion?

Unlike other technologies, and IPv4 comes in mind here, the MAC
address prefix pool is pretty much unlimited but also only slowly
being touched: There are 2 ** 22 or 4 194 304 prefixes. The number
is 22, not 24 because two bits in the first byte of the prefix are
used to determine if the MAC address is globally unique one or a
special one. And right now, a good 35 years after the invention of
Ethernet and Tokenring there are not even 19 thousand used.

The other causes are of the more strict rules the IEEE handles: You
get a single prefix and don't get more until you have informed us
officially that you have used 95% of them, and of course that you
actually need to produce (and sell) something which uses a MAC
address.

One of the issues people have with the iPhone is that is a black
box fully controlled by Apple. For developers they control access
to the API, for end users they control access to the software. If
they don't like the software you submit to them (for various reasons,
from "It doesn't follow our user interface guidelines" to "It uses
an undocumented call in our private API" to "It duplicates features
in software we provide"), they will reject the submission and you
are stuck with software..

The same people say that Apple should open their iPod/iPhone/iPad
like they did in the past with the Apple ][ and although I agree
with them, it is not the same Apple. Just like SCO was a respected
Unix implementation before it was bought by Caldera who renamed
itself into SCO afterwards, Apple today is a harsh business company
instead of a hackers group. Same name, different attitude.

So, what can you do about it, if the creator of the hardware wants
to bake the cake, cut it and then eat it too? Leave it over to
people who are much smarter than me :-)

Jailbreaking is a term based on the way third-party software on the
iPhone runs: It runs in a jailed environment, where it can't access
anything else except the data it has provided or downloaded itself.
That keeps an iPhone safe, because if you can't access something,
you can't do any damage there. By breaking the jail, you will be
able to access the place where the iPhone installs software and
thus install more software. Software which didn't go through the
rigorious screening of Apple, software which does do things that
Apple doesn't like. Google for "apple iphone jailbreak", it is not
that difficult to find and works quiet well.

So, once you have jailbroken your iPhone, what do you get. Access
to a different version of the App Store app called Cydia sto start
with. Just like the App Store app is the way to install Apple
sanctioned software, Cydia is the way to install the free software.

For the rest I have installed so far:

Backgrounder: This was the most important reason for me to
jailbreak my iPhone. It will give you the opportunity to put a
program in the background so that the music you are streaming
keeps streaming, the IRC sessions stay active and your IM friend
don't see you logging out. Apples has a reason for not enabling
it, it will indeed reduce the charge of the battery, but it
increase in functionality is worth it!

Infiniboard: By default you can have 16 icons, 4 by 4, on a
single page. With this app you will be able to add more to them,
just scroll down.

WiFiFoFum and yFy Network Finder: Network Stumblers. See what
is happening in the air around you. Was a blip on the radar ten
years ago something to be excited about, these days you only
see blips, hundreds between my home and the station.

The iPhone can offer more than Apple is willing to show. Thanks to
the hard work of a few individuals, it can be made available.

As described earlier, I am now owner of a Apple iPhone. So far
nothing new. The thing which was new for me is the portability of
addictiveness.

The first, and until recently, last pocket computer I had was a
Palm III which was great: Two AAA batteries which lasted months,
brilliant input method, simple screen (plus a software development
kit available, which ran under Linux and FreeBSD). It lost its
attractiveness when after a cold day outside it didn't want to turn
on anymore and lost all the contents in it. Oops.

Fast forwarding to twelve years later. In the mean time I've only
had simple telephones and faster more capable computers, nothing
which stands in between or merges the capabilities of each other.

Long term addiction to computer games has so far for me been limited
to playing MUDs in the early 1990s, after that it had not touched
me much. True, I've played games like Bejeweled on Yahoo! Games for
a couple of afternoons, but the realization that I wouldn't get
anywhere near the global Top 1000, let alone the global Top 10, nor
that anybody would care me being there, that made me give up pretty
fast. The other factor of success is that my machines were not
running MS Windows nor MacOS/X and therefore successfully limiting
the amount of addictive programs capable of running on it.

But with the purchase of the iPhone that layer of protection had
gone and now I've wasted most of the train trips towards and from
work and the walking towards and from the trainstation with looking
at the little screen and wondering when the next opponent in Word
with Friends (a non-realtime multi-opponent version of the Scrabble
game) will lay their word so I can place my next set of tiles.

I couldn't remember what was happening between the moment I stepped
on the train in Townhall till I got off at Caringbah. And I could't
remember what was happening between the moment I started walking
at the station till I was home. There are two big roads to be crossed
and I couldn't remember if the light on the crossings was red or
green when I crossed. Etc.

That was my state of mind until my wife started to play the game
on my iPhone and the game wasn't fully mine anymore. Is it the being
dragged back to reality? Is it jealousy? I don't know but I'm glad
she did.

Except that she now owns my iPhone with her games of Words with
Friends from the moment I'm back from work till we go to bed. Until
the next addictive game comes up on my iPhone, then it's all mine
again.

As stated before, I am pretty new to Objective-C programming. Normal
C? Not a problem at all! But this object memory management process
in Objective-C still gives me a hard time.

The first attempt was simple: I added a lot of NSLog() messages in
my dealloc() methods and see which ones I expected to see were not
showing up. That were for example all my inherited UIViewControllers...
They were not released after they were closed. It is a hard way to
do it like this, but it gives you a feel of what you are are really
doing wrong.

Then I had a look at the "Leaks" analyze tool in Objective-C (Run
-> Analyze -> Leaks) and ran my program. At the end, after a couple
of refreshes, it consumed 5 Mb of memory. 5 Mb, is that such a deal?
Yes, it is when all the program does is retrieve an XML feed and
extracts some data. Oh, and every time it refreshed it lost another
huge chunk of memory. Yes, that is a big deal. Luckely the "Leaks"
analyze tool tells me which kind of objects it is leaking and when,
so you might be able to plug them if you go methodically through
the features of your program.... Checking the retainCounters is the
way to go.

The next step was to implement a button which terminates the program.
Apple doesn't permit you to have apps in their AppStore which have
this feature, their usability design is: "If you want to terminate
a program, you press the big round Home button at the bottom of the
screen.". This breeds lazy programmers, there is no way to properly
deallocate all the objects you have. And the excuse you read on the
forums about it is "When you terminate your program, the operating
system will take care of that.". Absolutely correct, but with
some-form-of-multitasking around the corner the current system of
"Short living apps won't be able to hog a lot of memory" is over.
Plus that it will not show the lazy programmer that he has a serious
problem in his code!

And the last tool I thought about was something like a static
analysis tool, like Clang (I didn't know this at that moment, and
have not used it yet, but it is included in XCode these days). I
found a front-end for it called the Analysis Tool at
http://www.karppinen.fi/analysistool/ and ran my code through it.
Four hundred warnings, and most of them related to objects not being
freed.

What I learned from this was: Always "autorelease" the local objects.
Assignments increase the retainCounter. Check the retainCounters
of the objects you release in your dealloc() methods. Don't trust
yourself. And wait for the day that you will be able to see at
termination of your program what you have leaked.

And so do 50 million other people on this planet. So far nothing exciting :-)

The first impression is good (just as everybody else says): Works
intinutive, apps are great. Addiction factor: High. Very high
unfortunately.

As a hardcore tinkerer, of course I'm interested in how to make
apps for it. And so the drama began: You need an iMac, and one
one with an Intel chip in it (the one we have here has a PowerPC),
so I needed to buy a Mac mini. And then I needed to buy a digital
certificate from Apple so I could store the programs on the physical
iPhone instead of on the iPhone Simulator (great piece of software
BTW!). And then I needed a book, so I got Erica Saduns 'The iPhone
Cookbook' (after taste-testing a downloaded copy). And then I had
to learn Objective-C...

Objective-C, according to Wikipedia, is "a reflective, object-oriented
programming language which adds Smalltalk-style messaging to the C
programming language.". Although never used C++, I can handle
object-oriented programming from my history with TurboPascal in a
previous life and PHP and Perl from more recent lives. Smalltalk
messaging is, as far as I use it but in reality much more, a way
to call functions in other objects.

Compared with C++, I like the style of the Smalltalk message passing
to call an other object's function: It makes the difference between
the properties of an object (foo.bar) and the functions
([foo bar]) clearer. Also the nested way of messaging makes
the code simpler ([[[[ClassFoo alloc] init] randomfunction]
release]).

The way functions in objects in Objective-C are defined and called
is a large improvement over C++ (unless I've totally missed this
feature in C++): A function definition is like
(void)displayString:(char *)text withStyle:(int)style
centered:(bool)centeredText and function calls to it are like
[displayString:"Foo" withStyle:UNDERLINED centered:FALSE].
That makes it easy to make sure you a. have all the parameters in
the right order and b. you can have multiple functions with the
same order of types (char *, int, bool) but with different names
for the arguments.

Good, now the things which don't work out so well yet... Memory
management! It is a drama in every language, although I had it
pretty much under control in OO-Pascal and C, here it goes a little
bit further with garbage collection. I don't mind garbage collection
for the things that Apple provides inside the iPhone SDK, but I like
to keep track, and the clean-up afterwards, of my own garbage: The
following initializes a string and automatically releases it when
nobody is using it anymore: NSString *s = [[[NSString alloc]
initWithString:"Foo"] autorelease]. Every object, in this case
the NSString object, has a counter which keeps track of the amount
of references to it. Once the counter is zero, the object gets
cleaned up. So the option "autorelease" used earlier, that
feature should automatically release, unless there are other
references to it, the NSString object when the function has ended
(at least that is how I see it). But does this magic really happen?
There is no way to check it, we just have to believe the system
wrks. For the simple NSString object here it is not so much of an
issue, except when I believe it should be still there and it has
been released. In pure C you would get a segfault if you do something
on invalid or NULL pointers, but in this messaging system you can
easily send messages to nil objects without things falling apart.
So the protection I had as a C programmer during the development
(when you run the program and something doesn't initialize properly,
it aborts the moment you try to do something with that piece of
data) is now gone because the place it goes wrong might only show
up in the output to the user instead of as an interruption of the
program.

So, how am I going so far? With regarding to the GUI objects that
the iPhone provides (views, input fields, scrolling), I have most
of it under control. The rest is learned when required: Thanks to
the power of the Google search engine and the various iPhone
development communities, all the questions I come up with are already
asked and answered.

Right now I have released one app called L-Space.
I use it to keep track of collection of Discworld books, to find
out which ones I already own and which ones I haven't read yet. You
can find it in the iTunes store or in the iPhone Apps program. A
bigger version will allow more book-series and maybe the option to
edit them.

The next one I'm working on is an aggregator (more an advocacy
thingie) for information about the FreeBSD Project: It shows the
YouTube videos, the Planet FreeBSD feed, the News Flash and the
location of FreeBSD Commiters in the map.

Oh, and about the addiction: I manage to keep it quite well under
control, except for the Words with Friends (a non-realtime version
of scrabble) and Bridges (Also known as Hashiwokakero), with which
I waste hours and hours on in the train.

Earlier this year Naomi got her hands on a blue iPod. It is the
first time that an iPod thing invaded our life and now that I spend
about a good two hours per day on the train, I think it is the right
time. Only, what to put on it?

Music! Everywhere I see people with the white earplugs I hear their
music, I see them chosing the next track and I wonder "Which music
can be so good that you can listen to it every day?". So music is
a no-no.

Podcasts! I have several of them and up to now I always managed to
listen to them while I was working from home. Right now I don't
have the luxery of working from home, or listening to them on the
weekend because I spend all my time entertaining the kids. So for
the last weeks these things have been piling up:

Well, except for one thing: The last step, at the the creation of
the database on the iPod the program complains:
The following has occurred: Couldn't find the iPod firewire ID.
And the result is that all the physical files are on it, but that
the iPod doesn't index them. Brilliant piece of crap! (The iPod
that is)

Google to the rescue. Use Linux they say, run lsusb(8) they say. I
didn't but it didn't give me the right string (WTF??!?!??!). Project
iPod got stalled until today. Again Google to the rescue. Use Linux
they say, run lsusb(8) they say. For FreeBSD they say, there is a tool for
this they say, since usbdevs(8) does not provide enough output they
say: http://50hz.ws/dev/getserial.c
they say.

It didn't do much, but then it's only 152 lines. That it didn't do
much was more related to this line: