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.
Some statistics based on grep and cut and wc:
Number of prefixes Company 503 Cisco 122 Shenzhen 112 Motorola 109 Nokia Danmark A/S 84 Samsung Electronics 84 Apple 78 Intel Corp 59 Advanced (??) 61 Hewlett Packard 51 Private
"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:
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.
To be continued.
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:
[~/.penguintv] edwin@k7>du -skh media/ 4.2G media/ [~/.penguintv] edwin@k7>find media/ -type f | wc 250 250 9917
So, the port audio/gtkpod to the rescue!
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:
if(di.udi_vendorNo != 0x05ac) // dunno if udi_productNo changes depending on the ipod model, so vendor check should suffice return;
This is because my iPod shows up with vendor ID 0x05ac.
[~] root@k7>usbdevs -v [...] Controller /dev/usb4: addr 1: high speed, self powered, config 1, EHCI root hub(0x0000), Intel(0x0000), rev 1.00 port 1 powered port 2 powered port 3 addr 2: high speed, power 500 mA, config 1, iPod(0x1263), Apple Inc.(0x05ac), rev 0.01 port 4 powered [...]
A quick patch later and:
[~] root@k7>./getserial /dev/usb4 [4:2] Apple Inc. - iPod iSerialNumber: 000A27001D1A3886
Add it to the iPod_Control/Device/SysInfo file on your iPod:
[~] root@k7>cat /mnt/ipod/iPod_Control/Device/SysInfo ModelNumStr: xB249 FirewireGuid: 0x000A27001D1A3886
And gtkpod will work like a charm!