MySQL za iPhone DIY

Objavljeno 16.07.2009. Objavio/la: Tomislav Ribaric
U sekciji iPhone aplikacije, Škola | 12 Komentara

mysqldiy

UNIX command-line (CLI – Command Line Interface) aplikacije na iPhone-u nisu novost. Od kad je uspješno “jailbreakan”, entuzijasti iz iphone-dev tima, no i ostali, uspješno su “portali” mnoštvo CLI UNIX aplikacija na iPhone. Od osnovnih sistemskih aplikacija, kao što su ljuske (sh, bash,..), osnovni shell alati (ls, ps, grep, su, sudo,…), do alata za konfiguraciju SQLITE sustava za upravljanje bazama podataka, OpenSSH-a, pa čak i command-line datotečnih upravitelja kao što je primjerice midnight commander.

CLI aplikacije zahtjevaju terminalni emulator kako bi se mogle koristiti, jer terminalni emulator omogućava korištenje jedne od UNIX ljuski (eng. shell), koje nisu ništa drugo nego linijsko komandno sučelje unutar kojega se izvršavaju CLI aplikacije. No, iPhone OS službeno ne uključuje takvu aplikaciju, niti ju je moguće downloadati s App Store-a, niti ne uključuje nijedan tip ljuske. No, jailbreakani uređaji imaju mogućnost instalacije terminalnog emulatora (Terminal.app) te najčešće korištenih ljuski (sh, bash, z-shell) preko Cydia repozitorija, što iPhone OS obogaćuje s mogućnošću korištenja CLI aplikacija – drugim riječima, pretvara ga u pravi mali UNIX stroj.

Na iPhone su, osim CLI aplikacija, portane i mnoge druge UNIX aplikacije i libraryji, pa tako i aplikacije potrebne za uspostavljanje funkcionalnog web servera; HTTP server (lighttp), PHP server-side skriptni jezik, pa čak i Ruby skriptni jezik te njegov framework za izradu web aplikacija – Rails. Svi mi koji se bavimo, na bilo koji način, web aplikacijama znamo da web aplikacija nije web aplikacija bez dobrog back-end-a za čuvanje podataka, dakle bez dobrog softwera za upravljanje bazama podataka. iPhone OS nativno koristi SQLite sustav za upravljanje podataka, što funkcionira dobro i s PHP web aplikacijama, i s Rails web aplikacijama, no danas mnoštvo aktualnih web CMS sustava (WordPress, Joomla, Drupal, TYPO3) najbolje se slažu s “kraljem” open source RDBMS-a (Relational Database Management System), MySQL RDBMS-om. Iz tog sam razloga krenuo u potragu za MySQL verzijom za iPhone OS (odnosno za ARM procesorsku arhitekturu jer iPhone koristi ARM procesor), no nisam pronašao takvu verziju. Sljedeća opcija je bila cross kompajliranje (eng. cross-compiling) MySQL sustava.

Cross kompajliranje znači kompajliranje software-a na jednoj platformi za drugu platformu; odnosno, binarne datoteke dobivene cross kompajliranjem ne mogu se izvršavati na stroju na kojemu su kompajlirane, nego na stroju za koji su kompajliranje. Cross kompajliranje zahtjeva cross kompajler, a takvih ima mnogo verzija; cross kompajler za powerpc linux, za arm linux, za arm darwin (iPhone OS), za SPARC arhitekture itd. Cross kompajlirati možemo i na linux sustavima, i na Mac OS X sustavima, u biti na svim sustavima za koje postoji cross kompajler za platformu za koju želimo kompajlirati aplikaciju.

Cross kompajliranje se može obaviti i za iPhone, i to u linux i Mac OS X sustavu koristeći iphone-dev toolchain – set alata za kompajliranje i cross kompajliranje nativnih aplikacija za iPhone OS, koji je u biti jedna alternativa za službeni iPhone SDK te pruža mogućnost izrade nativnih iPhone aplikacija i na drugim platformama, ne samo na Mac OS-u. Uz izradu novih aplikacija, toolchain omogućava i cross kompajliranje (možemo to nazvati i “portanje”) aplikacija koje rade, primjerice, na nekom od desktop UNIX sustava, za iPhone OS. Cross kompajler za iPhone podržava kompajliranje aplikacija pisanih u objektnom C-u, C-u i C++.

Alternativa toolchainu za cross kompajliranje je službeni iPhone SDK, no pomoću njega cross kompajlirati možemo samo na Mac OS-u. Ja sam cross kompajliranje MySQL-a za iPhone obavio pomoću iPhone SDK-a, i to zato jer nisam uspio kompajlirati iphone-dev toolchain cross kompajler na Leopardu za iPhone OS 3.0, a vraćanje na 2.2.1 zbog toga nije dolazilo u obzir. Zaključujete dakle da sam koristio najsvježiji SDK, 3.0, što ne znači da ne možemo koristiti i SDK za 2.0 ili 2.2 – ovisi samo o tome koji OS imamo na iPhone-u.

Tražeći po internetu smjernice za cross kompajliranje MySQL-a za iPhone, naišao sam na mnoštvo pesimističnih stavova (nije moguće, možda je moguće, moglo bi biti), al svejedno sam odlučio probati, pa da vidimo. Našao sam odličan tutorial za cross kompajliranje MySQL-a s jedne linux arhitekture na drugu (http://forge.mysql.com/wiki/LinuxCrossCompilation), tutorial za cross copajliranje OpenCV-a za iPhone (http://lambdajive.wordpress.com/2008/12/20/cross-compiling-for-iphone/), i kombinirajući informacije iz oba te dodatno prilagođavajući source MySQL-a, uspio sam cross kompajlirati MySQL verziju 5.0.41 za iPhone OS 3.0 (probam sam nekoliko verzija, ova se namanje “bunila”).

Članak sam započeo s pričom o CLI aplikacijama; razlog tome je taj što su osnovni alati za administraciju MySQL RDBMS-s CLI alati, te je za njegovo korištenje potreban terminalni emulator – nije ga dakle moguće cross kompajlirati bez da jailbreak-amo iPhone.

Slijedi kratak tutorial kako to učiniti.

ŠTO JE POTREBNO:

  • MySQL 5.0.41 source
  • ncurses headeri – najjednostavnije ih skinuti s iPhonea (naravno prije instalirati new courses preko cydie) – sadrže opis i definicije raznih terminalnih emulatora, a kako mysql sadrži CLI alate, treba ih
  • iPhone SDK 3.0 – sadrži ono najvažnije – cross compiler :) – naravno, ako se na mobu nalazi niži OS, koristi se “niži” SDK

KORACI:

1. prvo i osnovno, editirati configure skriptu iz source direktorija – kako bi se riješili izlaska iz skripte s outputom “error: cannot run test program while cross compiling” – testovi ionako ovdje nisu važni. Skripta ima nekoliko ovakvih dijelova:

if test “$cross_compiling” = yes; then

{ { echo “$as_me:$LINENO: error: cannot run test program while cross compiling

See \`config.log’ for more details.” >&5

echo “$as_me: error: cannot run test program while cross compiling

See \`config.log’ for more details.” >&2;}

{ (exit 1); exit 1; }; }

treba { (exit 1); exit 1; }; } dio zamijeniti s jednostavnom zatvorenom vitičastom zagradom, kako se skripta ne bi prekinula prilikom izvršenog danog uvijeta – to će onda izgledati ovako:

if test “$cross_compiling” = yes; then

{ { echo “$as_me:$LINENO: error: cannot run test program while cross compiling

See \`config.log’ for more details.” >&5

echo “$as_me: error: cannot run test program while cross compiling

See \`config.log’ for more details.” >&2;}

}

2. treba riješiti još jedan mali problemčić s configure skriptom; ukratko, sljedeći kod:

if test “$ac_cv_conv_longlong_to_float” != “yes”

then

{ { echo “$as_me:$LINENO: error: Your compiler cannot convert a longlong value to a float!

If you are using gcc 2.8.# you should upgrade to egcs 1.0.3 or newer and try

again” >&5

echo “$as_me: error: Your compiler cannot convert a longlong value to a float!

If you are using gcc 2.8.# you should upgrade to egcs 1.0.3 or newer and try

again” >&2;}

{ (exit 1); exit 1; }; };

postaje;

if test “$ac_cv_conv_longlong_to_float” != “yes”

then

{ { echo “$as_me:$LINENO: error: Your compiler cannot convert a longlong value to a float!

If you are using gcc 2.8.# you should upgrade to egcs 1.0.3 or newer and try

again” >&5

echo “$as_me: error: Your compiler cannot convert a longlong value to a float!

If you are using gcc 2.8.# you should upgrade to egcs 1.0.3 or newer and try

again” >&2;}

};

3. Kopirati ncurses header-e u include direktorij SDK-a – primjerice /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/include/ – ali ne u ncurses direktorij, nego direktno u include
4. Izvršiti configure skriptu – poziva se sa sljedećim, malo podužim nizom argumenata – rezultat traženja, isprobavanja, neuspjelih pokušaja itd itd :) )) :

./configure –host=”arm-apple-darwin9″ –target=arm-apple-darwin9 –prefix=/usr/local/mysql –disable-assembler –with-extra-charsets=complex –enable-thread-safe-client –with-big-tables –with-readline –with-mysqld-ldflags=-static –with-client-ldflags=-static –enable-local-infile CC=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2 CPP=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/cpp CXXCPP=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/cpp CXX=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2 AR=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/ar RANLIB=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/ranlib NM=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/nm CFLAGS=”-arch armv6 -pipe -Wno-trigraphs -fpascal-strings -fasm-blocks -O0 -Wreturn-type -Wunused-variable -fmessage-length=0 -fvisibility=hidden -miphoneos-version-min=2.0 -gdwarf-2 -mthumb -miphoneos-version-min=2.0 -I/Library/iPhone/include -isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk” LDFLAGS=”-arch armv6 -pipe -gdwarf-2 -mthumb -I/Library/iPhone/include -isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk” CXXFLAGS=”-arch armv6 -pipe -felide-constructors -fno-exceptions -fno-rtti -Wno-trigraphs -fpascal-strings -fasm-blocks -O0 -Wreturn-type -Wunused-variable -fmessage-length=0 -fvisibility=hidden -miphoneos-version-min=2.0 -gdwarf-2 -mthumb -miphoneos-version-min=2.0 -I/Library/iPhone/include -isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk”

5. iPhone SDK sys/socket.h C header datoteka ne definira konstantu TCP_NODELAY, koju MySQL source koristi, pa je moramo definirati; jednostavno u sys/socket.h datoteku iPhone SDK include direktorija dodati sljedeću liniju:

#define   TCP_NODELAY    0×200

6. Naposljetku, izvršiti make

7. Nakon kompajliranja, izvršiti make install – installer će kopirati sve datoteke u direktorij koji smo definirali u config naredbi (–prefix=/usr/local/mysql u ovom slučaju)

8. otići u /usr/local, te mysql direktorij kopirati na iPhone (putem SFTP klijenta najbolje) – ja sam ga primjerice kopirao u svoj home direktorij (/private/var/mobile), jer je on montiran na drugoj particiji od 7 i po GB, dok na prvoj nema baš mjesta (prva particija je “sistemska”, i velika oko 500MB)
9. Kako bi to radilo kako treba (s obzirom da smo ga konfigurirali da radi u /usr/local/mysql direktoriju), treba kreirati simbolički link u /usr/local direktoriju na iPhoneu, koji će pokazivati na direktorij gdje smo kopirali mysql – primjerice, kod mene: ln -s /private/var/mobile/mysql /usr/local/mysql
10. make install sve izvršne datoteke u mysql direktoriju nazove s arm-apple-darwin9 prefiksom – to može tako i ostati, no kako se ne bi trebali mjenjati nazivi u startup skripti mysql servera, najbolje je ukloniti prefiks sa svih izvršnih datoteka – preimenovati ih
11. VRLO VAŽNO! Cross kompajlirani programi NEĆE raditi na iPhoneu ako ih digitalno ne potpišemo – dakle, sve izvršne datoteke mysql-a treba digitalno potpisati, a to radimo sa sljedećom naredbom:

ldid -S naziv_programa

primjerice, jednostavnije je ući u određeni direktorij, npr. bin, i dati naredbu da se potpišu sve datoteke unutar direktorija:

ldid -S *

12. kreirati unutar mysql direktorija var direktorij

13. Zatim kreirati osnovne baze podataka sa mysql/bin/mysql_install_db

14. na kraju pokrenuti mysql server kao root korisnik: mysql/bin/mysqld_safe –user=root & (primjerice, jer ne postoji mysql korisnik na iphoneu) – to možemo učiniti ili korištenjem sudo naredbe, ili da se prebacimo na root korisnika (su root – defaultni password za root korisnika je alpine)
15. Ako nam mysqld_safe javlja da ne može naći hostname program -  jer ga traži u /bin direktoriju – hostname se na iPhone OS-u nalazi u /usr/bin direktoriju, te ga je najjednostavnije simbolički linkati u /bin direktorij

Nakon uspješne instalacije i pokretanja MySQL-a, u CLI alat za administraciju ulazimo s bin/mysql naredbom (unutar mysql direktorija).

Sljedeći korak je konfiguracija PHP-a da radi s MySQL-om, pa instalacija phpmyadmin web aplikacije za konfiguraciju MySQL sustava itd.. No o tome drugom prilikom.



Tagovi: , ,

 

Komentari:

12 komentara na “MySQL za iPhone DIY”

  1. aramic u 09:42, 17.07.2009.

    Imam dojam da mi je IQ pao na cca 78…

    Želim izraziti poštovanje svima koji se bave ovakvim … čudesima i omogućavaju nam da se koristimo ulickanim aplikacijama.

    Pozdrav od “usera” :)

    Slažem se/Ne slažem se: Thumb up 0 Thumb down 0 (0) Za ocjenjivanje komentara morate biti registrirani korisnik.
  2. ficho u 17:00, 17.07.2009.

    Samo jedno pitanje: cemu to??

    Slažem se/Ne slažem se: Thumb up 0 Thumb down 0 (0) Za ocjenjivanje komentara morate biti registrirani korisnik.
  3. šime u 19:56, 17.07.2009.

    Jebate ficho što si bahat u zadnje vrijeme. daj ohladi malo!

    Slažem se/Ne slažem se: Thumb up 0 Thumb down 0 (0) Za ocjenjivanje komentara morate biti registrirani korisnik.
  4. ficho u 21:11, 17.07.2009.

    Ne znam ja ko je tu bahat. Samo pitam cemu patnja s MySQLom na iPhoneu jer sumnjam da Tomislav nema pristup bar jednom kvalitetnom MySQL serveru.

    Slažem se/Ne slažem se: Thumb up 0 Thumb down 0 (0) Za ocjenjivanje komentara morate biti registrirani korisnik.
  5. Bezveze u 22:32, 17.07.2009.

    Zasto pas lize svoja jaja?
    Zato jer moze ;)
    Mislim da je vaznije to sto se moze nego cemu sluzi (bar konkretno mysql) al je ujedno opisao kako napraviti cross compile hrpetine drugih stvari koje ce mozda nekome biti korisne.

    Slažem se/Ne slažem se: Thumb up 0 Thumb down 0 (0) Za ocjenjivanje komentara morate biti registrirani korisnik.
  6. Toni Milovan u 22:57, 17.07.2009.
    Toni Milovan

    Pa.. ima gomila web aplikacija koje zahtjevaju MySQL. Kad vec imamo PHP i web server glupo je ne imati i mysql ako moze raditi zadovoljavajuce, ne?

    Slažem se/Ne slažem se: Thumb up 0 Thumb down 0 (0) Za ocjenjivanje komentara morate biti registrirani korisnik.
  7. ficho u 02:08, 18.07.2009.

    Da Toni, al pricamo o iPhoneu :) Ne znam, strasno mi je da se jadan mobitel koristi za takve stvari, nije kao da mu baterija traje danima :D

    Slažem se/Ne slažem se: Thumb up 0 Thumb down 0 (0) Za ocjenjivanje komentara morate biti registrirani korisnik.
  8. dijete u 14:11, 18.07.2009.

    od kad je iphona i toucha, prestao sam laptop koristit.. ne treba mi.. dakle, da mi treba MySQL, Tonijeva prezentacija bi mi bila itekako potrebna jer bi koristio preko iphonea..

    Slažem se/Ne slažem se: Thumb up 0 Thumb down 0 (0) Za ocjenjivanje komentara morate biti registrirani korisnik.
  9. ficho u 15:12, 18.07.2009.

    Dobro, predajem se :) (iako jos uvijek mislim da nema smisla vrtit server na mobitelu :P )

    Slažem se/Ne slažem se: Thumb up 0 Thumb down 0 (0) Za ocjenjivanje komentara morate biti registrirani korisnik.
  10. dijete u 15:53, 18.07.2009.

    ma puno tog nema smisla, al lijepo je prikazat da postoji mogucnost..

    Slažem se/Ne slažem se: Thumb up 0 Thumb down 0 (0) Za ocjenjivanje komentara morate biti registrirani korisnik.
  11. ficho u 16:00, 18.07.2009.

    Eto sjetio sam se jednog scenarija di bi to moglo dobro doc. Prezentiras web aplikaciju i nestane struje… :P

    Slažem se/Ne slažem se: Thumb up 0 Thumb down 0 (0) Za ocjenjivanje komentara morate biti registrirani korisnik.
  12. Tomislav Ribarić u 19:14, 20.07.2009.

    Ficho, slazem se s tobom u tome da nije bas logicno vrtiti MySQL server na iPhoneu. Ovaj je clanak pisan s ciljem da samo ukaze na tu mogucnost, i to iz dva osnovna razloga: da se citatelji upoznaju s jednom od mnostva mogucnosti iphonea, da vide kako je iPhone u biti u svojoj srzi pravo UNIX racunalo, te, najbitnije, da im priblizi pojmove cross kompajliranja te mogucnosti “portanja” mnostva desktop aplikacija na iPhone. Drugo, da pomogne onima kojima treba MySQL na iPhone-u (ili cross kompajliranje nekog drugog programa) iz raznoraznih razloga; meni je primjerice bio potreban iz cistog hobija, da vidim koliko efikasno iPhone moze vrtiti web aplikacije koje koriste MySQL, a posebice kako se na njemu ponasaju web CMS sustavi tipa TYPO3. Naravno da za razvoj web sustava/aplikacija necu koristiti iPhone za server ;)

    Slažem se/Ne slažem se: Thumb up 0 Thumb down 0 (0) Za ocjenjivanje komentara morate biti registrirani korisnik.

Ostavi komentar




Pretplati se na odgovore bez komentiranja članka:

Tagcloud:



RSS

Newsletter

Vidi top 100