The rants and ravings of a Mac developer

I Love programming, Macs, the iPhone, iPad, Apps & iOS! In my spare time I like Programming in ExtJS, PHP, MySQL / SQLite3 and Apache - in other words a Real Geek's geek. I've tinkered around with programing for iOS in the not so distant past . During the day I work for Motorola Solutions in IT as BSA for our Export Compliance system JPMorgan's TradeSphere. At night I freelance program on the Mac & Web. I'm also a techie who likes Sci-Fi and Horror. Some of my favorite authors include Stephen King, William Gibson and Frank Herbert as well as his son Brian Herbert and Kevin Anderson.

But my real passion is for Comic Book Collecting. My current freelance project is writing a web based application using ExtJS for collecting comics books. After I get the web application completed, I will be integrating some portion of the web application into a desktop client for the Mac through the use of web services for all data exchange & transaction. Eventually, the web site & Mac client would also include a social networking component as well as an iOS component.

I started collecting comic books as a kid when my grandfather passed away and we found my father's comic book collection when we were cleaning out my grandfather's basement. There were a number of early issues in that stash, such as Fantastic Four number one, The Amazing Spider-Man number one, number 22 of the Uncanny X-Men... and others. So needless to say, I was hooked.

After high school I stopped collecting - college, drinking and woman took priority (not necessarily in that order) over visiting the local comic book shop. Now that I have 2 kids of my own, I've gotten back into collecting.

Character Sets and MySQL command line client

FYI… if connecting to a MySQL database using the MySQL command line client (tool) where the database collation / character-set is set to utf8_general_ci / UTF-8, you need to issue a

    SET NAMES 'utf8';
 

command prior to running any queries so that any special characters show up correctly.

Refer to the MySQL Reference Manual, section 9.1.4. Connection Character Sets and Collations and then search on SET NAMES.

Also if you have a bunch of MySQL statements in a file and want to execute them against a UTF-8 database you need to include the —default-characters-set option on the command line.

    mysql --default-character-set utf8 -u user1 -puser1 cb_upc_db < extract.sql
 

Character Sets and PHP Follow Up

Following up to my Feb 23, 2010 post on  difficulties with charaster sets I’ve yet run into another example of how this can mess you up.

In PHP, I was using curl to fetch a page from a remote web server and then extract some data using regex and then inserting it into a MySQL database. The issue that I encountered was that my database was in was in UTF-8 but the text being retrieved from the website was in ISO-8859-1 (aka Latin-1 according to wikipedia). So when I selected a record that had incompatible characters between UTF-8 and ISO-885901 I either saw garbage or truncated values. For example, the value ‘Atlantic Förlags’ on the web page showed up in my table just as ‘Atlantic F’.

So to investigate I used FireFox to open up the URL I was parsing in my PHP script and then right clicked on the web page and selected ‘View Page Info’ from the popup menu.

Now all I needed to do was use PHP’s string iconv(in_charset, out_charset, str) function to convert from ISO-8859-1 to UTF-8 before inserting each string value into my database. Like such:

    $trans_text = iconv("ISO-8859-1", "UTF-8", $text);
 

At least that’s how it goes in theory… your mileage may vary.

Ah, Language, isn’t it wonderful. If you’re not a programmer

Well I’ve spent a good part of the day reading the MySQL manual pages for Language support… and I’ve got to say, life would be so much simpler if everyone only wrote, spoke and used English… I know that’s not a very global attitude, but really, when you get into things like multilingual support (i.e., Unicode) in applications, programming languages, databases, web browsers its a wonder that anything works at all!

This basically comes into play, when importing, exporting or displaying data across different systems that use different character sets. For example reading data from database (stored in latin1 for example) and them manipulating it in PHP (defaults to cp1251, I believe) and then displaying in in a user’s web browser (using utf8). Not only do you have to worry is the character that I want available in the character set that my programming language uses, but now you have to make sure you translate it properly when reading and outputting it. Not only are there all these different character sets, but no two applications/databases/programing languages refer to them by the same name! Talk about impossible tasks!

Not only are there different characters in different languages, but there are differences how the characters in each language are sorted - this is referred to as a collating sequence. For instance in Spanish an ‘ñ’ (n-tilde) sorts between the ‘n’ and ‘0’ characters. And if using traditional spanish, there’s a ‘ch’ character that sorts in between ‘c’ and ‘d’, like wise with the character ‘ll’, its in between ‘l’ and ‘m’.  And it gets worse for other languages such as Swedish/Finish.

This issue also affects the comparison of characters and doing database searches… like is ‘Ano’ equal to ‘Año’ (2nd character is a n-tilde)? Other examples (not sure these will show up correctly in this post) are ‘ß’ is ‘technically’ equal to ‘ss’, but some programming languages/database may say its equal to ‘s’ (I don’t even know what ‘ß’ is for). And look at these other ones, ‘Ä’ = ‘A’, ‘Ö’ = ‘O’ and ‘Ü’ = ‘U’!

Woe is me… and here UTF was supposed to be the holy grail. Remember, “There is no silver bullet.”

Finding the original photo file in the iPhoto Library database

Using iPhoto’s SQLite3 database you can get the relative path to the original photo in the iPhoto library for any image in the sqPhotoInfo table. To do so you must join from the sqPhotoInfo table to the sqFileImage table and finally to the sqFileInfo table.

select pi.primaryKey, pi.archiveFilename, fl.relativepath
from SqPhotoInfo as pi
join SqFileImage as fi on pi.primaryKey = fi.photoKey
join sqFileInfo  as fl on fl.primaryKey = fi.sqFileInfo
where fl.relativePath like 'Originals%'
 

Date Format used in iPhotoMain.db database

Not sure how many of you know that iPhoto uses SQLite3 as its database engine. You can access the database files by right clicking on ~/username/Pictures/iPhoto Library and selecting Show Package Contents. Once you have displayed the package, the SQLite3 datbase files are:

  • iPhotoMain.db
  • iPhotoAux.db
  • face.db
  • face_blob.db

The main database file, as you might have guessed, is the iPhotoMain.db file. In Terminal, you can open the file by changing to the directory of iPhoto Library package, e.g.:

cd /Users/gskluzacek/Pictures/iPhoto\ Library
 

Then execute the following

sqlite3 iPhotoMain.db
 

One of the initial problems that I faced was when reading date fields, like the photoDate field on the sqPhotoInfo table. After some experimenting, I determined that the date is stored as a FLOAT which represents the number of days since midnight Jan 1st 2000. To convert this to a Julian Day value, you need to add the Julian Day of 1/1/2000 - then you can use the datetime() function to convert this to a more human readable format. For example:

select primaryKey, 
datetime(photoDate +  julianday('2000-01-01 00:00:00')) as photoDate,
archiveFilename from SqPhotoInfo order by archiveFilename desc;
 

Hopes this saves someone a couple of hours, I googled all over and couldn’t find this info.

IMG_0949: 

iMac Unboxing
IMG_0949:

iMac Unboxing


IMG_0950: 

iMac Unboxing
IMG_0950:

iMac Unboxing