Skip to content

Archiv fuer den Monat Januar, 2014

19
Jan

[Xcode]: Hallo Welt für iOS

Heute möchte ich euch eine kleine Einführung in die iOS-Programmierung geben. In Form eines Hallo Welt zeige ich ein wenig wie man mit Xcode 5 umgeht.
Was man nun alles braucht um für physikalisches iOS Gerät zu programmieren werde ich hier nicht aufzählen. Dazu gibt es schon genügend Auskunft im Internet. Hier möchte ich einfach nur kurz und einfach ein „Hallo Welt“-Programm machen.

Projekt erstellen
Vorrausgesetzt ihr habt Xcode bereits über den Appstore heruntergeladen und die benötigten SDKs installiert, startet ihr nur noch Xcode und klickt auf „Create a new Xcode project“. Im darauf folgenden Dialog wählt ihr links unter „iOS“ „Single View Application“:

Mit einem Klick auf „Next“ geht es weiter. In das Feld „Product Name“ geben wir den Namen ein den unsere App haben soll (in unserem Fall also „Hallo Welt“). „Organization Name“ ist der Name der Organisation, welcher im App Store später angezeigt wird. „Company-Identifier“ sollte ein eindeutiger Name sein. Im Normalfall ist es eine URL in umgekehrter Reihenfolge. Bei mir also „com.chrisblog“. Zum testen ist es aber eigentlich vollkommen egal was ihr dort hinein schreibt. „Class-Prefix“ lassen wir mal frei und bei „Devices“ wählen wir „iPhone“.

Anschließend sucht ihr noch einen geeigneten Speicherplatz für euer Projekt und es kann losgehen.

Die ersten Schritte
Als erstes wählt ihr auf der linken Seite die Datei „Main.storyboard“ aus und öffnet diese mit einem einfachen Klick. Rechts solltet ihr die Utilities sehen. Ist dies nicht der Fall klickt in der rechten oberen Ecke auf „Hid or Show the Utilities“.

Sobald die Utilities sichtbar sind, müsst ihr im unteren Bereich auf den Würfel klicken, damit die Komponenten sichtbar sind. Nun gebt ihr ganz unten „Label“ ein und zieht ein Label auf den linken ViewController. Danach das gleiche mit einem Button. Mit einem Doppelklick auf den Button ändern wir den Text in „Hallo Welt!“ Das fertige „Interface“ sollte in etwa so aussehen:

Da Xcode auch schon die passenden Implementierungsdateien für uns erzeugt haben, aktivieren wir den Assistang-Editor der im rechten oberen Bereich mit dem Button der wie ein Smoking aussieht aktivieren kann. Im normalfall wird euch dann rechts neben dem Storyboard die Datei „ViewController.m“ angezeigt. Im oberen Bereich des Editors müssen wir auf die Datei „ViewController.h“ umschalten.
Nun zieht ihr mit gedrückter „ctrl“-Taste eine Verbindung vom Label in die Datei unter die Zeile „@interface ViewController : UIViewController“, ebenso macht ihr das mit dem Button.

Die beiden aufploppenden Dialoge werden wie folgt ausgefüllt:

Die Datei „ViewController.h“ sollte nun wie folgt aussehen:

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController
@property (weak, nonatomic) IBOutlet UILabel *theLabel;
- (IBAction)DoIt:(id)sender;

@end

Nun kann der Assistant-Editor wieder deaktiviert werden. Öffnet die Datei „ViewController.m“ indem ihr einmal darauf klickt.
Xcode hat durch die „Action“ netterweise gleich eine Funktion angelegt. In dieser können wir nun unseren Code schreiben:

- (IBAction)DoIt:(id)sender {
    [self.theLabel setText:@"Hallo Welt!"];
}

Die Funktion hat den Rückgabewert „IBAction“, heißt „DoIt“ und hat als Parameter einen sender. Alles was wir nun tun müssen ist dem Label den Text zuweisen.
Dazu rufen greifen wir auf die aktuelle Instanz „self“ zu und greifen dort wiederum auf „theLabel“ zu. Eine Funktion in Xcode wird so aufgerufen:

[objekt funktion:parameter];

Man öffnet eine eckige Klammer, gibt das Objekt an von welchen man eine Funktion ausführen möchten. Nach einem Leerzeichen folgt der Funktionsname, nach einem Doppelpunkt der erste Parameter danach mit Komma getrennt können weitere Parameter kommen.
Wir rufen nun also die Funktion „setLabel“ des Objekts „theLabel“ auf und weisen den Text „Hallo Welt!“ zu. Mit „cmd + R“ könnt ihr das Projekt nun kompilieren.

Sobald das Projekt kompiliert ist startet der Simulator und dieser dann die App. Sobald die App gestartet ist braucht ihr nur noch auf den Button klicken und schon steht in eurem Label „Hallo Welt!“.

18
Jan

[Vorstellung]: MedienVerwaltung(Firemonkey) – iPhone-Client

Heute stelle ich euch den iPhone-Client zu meiner MedienVerwaltung vor. Alles wichtige auf der Client-Seite habe ich ja bereits schon im vorherigen Beitrag erwähnt.

Da ich noch nicht so viel mit iOS-Programmiert habe und dies eine erste Beispiel-App werden soll, ist das Design auch hier noch nicht Perfekt.
Mit was ist die App programmiert?
Auch hier wieder wie beim Desktop-Client:
Als IDE wird der C++ Builder von Embarcadero verwendet, als Framework Firemonkey.

Holen der Daten
Sehen wir uns als erstes mal den Startbildschirm an:

Wie bei iOS so oft, haben wir also als erstes nur eine Listendarstellung. Beim ersten Start ist die Liste noch leer. Nach einem Tipp auf das Aktualisieren-Symbol rechts oben, verbindet sich das iPhone mit dem Internet und lädt die Daten aus meiner MySQL-Datenbank herunter. Diese werden dann auf dem iPhone wiederum in einer SQLite-Datenbank gecached. Wie zu erwarten werden beim ersten herunterladen sämtliche Datensätze geholt.
Bei erneutem Aktualisieren werden nur neue Datensätze (mit einer höheren ID) oder Datensätze mit dem Update-Kennzeichen heruntergeladen.
Nach erneutem start der App werden die Daten gleich angezeigt. Da diese lokal auf dem Gerät gecached sind, dauert dies auch nicht lange. Wie man auf dem Bild sehen kann ist natürlich auch eine Suche integriert.

Detailansicht
Tippt man nun auf einen Eintrag kommt man in die Detailansicht:

Wie schon auf dem Desktop-Client gibt es auch hier Bilder. Wenn die Detailansicht geladen wird, schaut die App erstmal ob es das Bild lokal bereits gibt. Ist dies der Fall, wird es geladen und angezeigt. Andernfalls wird eine Verbindung mit dem Webserver hergestellt. Ist die Datei auf diesem vorhanden, wird die Datei per FTP auf das Gerät geladen und auch wieder gecached. Von dort aus wird das Bild dann wieder geladen.

17
Jan

[Vorstellung]: MedienVerwaltung (Firemonkey) – Desktop-Client

Heute möchte ich euch ein kleines Projekt vorstellen, an dem ich momentan arbeite. Noch bin ich mir nicht sicher ob ich es auch (wenn es mal soweit ist) zum Download bereitstelle. Momentan bin ich der Meinung eher nicht. Wieso zeige ich es euch dann? Vielleicht kann sich ja der eine oder andere ein paar Anregungen holen.

In diesem Beitrag stelle ich euch den aktuellen Status des Desktop-Clients vor.

Mit was Programmiere ich? Für mein Projekt „MedienVerwaltung“ verwende ich den C++ Builder von Embarcadero. Als Framework kommt das Crossplatform-Framework Firemonkey zum Einsatz.
Das Programm ist momentan noch in der „Alpha-Phase“. Es funktioniert also erst ein Teil des späteren Gesamtpakets.

Momentan arbeite ich erstmal an den Filmen. Dies ist für mich erstmal das wichtigste.

Hauptanzeige
Wie man auf den Bildern sehen kann, wird im Grid noch so ziemlich alles angezeigt, was auch in der DB steht. Einfach um zu sehen ob alles richtig gespeichert, geupdatet, usw. wird.

Dazu gleich ein paar Infos wie die Dateien gespeichert werden. Ich verwende eine SQLite-Datenbank. Mithilfe von FireDAC greife ich auf die SQLite-Datenbank zu. Für Status, Genre und Medium gibt es jeweils eine eigene Tabelle in der beliebige Werte gespeichert werden können. Da ich keine Datensätze lösche, gibt es einfach nur ein Gelöscht-Datum. Sobald dort ein Datum steht, wird der Datensatz nicht mehr angezeigt, außer im oberen Bereich wird das „Gelöschte anzeigen“-Häckchen gesetzt (und nein, dass ist nicht die Endgültige Position, mir geht es in erster Linie um die Funktionalität, danach werde ich mich etwas näher mit dem Design beschäftigen).

Wieso lösche ich keine Datensätze? Da ich für das Programm auch eine App habe (die schon so einigermaßen funktioniert), muss ich das ganze ja synchronisieren. Momenten schicke ich also neue/geänderte Datensätze per JSON an ein PHP-Skript, welches die Daten in eine MySQL-Datenbank schreibt. Um Probleme mit den IDs zu vermeiden werden deshalb keine Datensätze gelöscht. Ich hole mir immer die letzte ID aus der MySQL-Datenbank und alle Datensätze am Client die eine höhere ID haben (oder ein Update-Kennzeichen) werden an das PHP-Skript geschickt.

Dafür sind auch die Spalten „U-Mobil“ = UpdateMobil und „U-Desktop“ = UpdateDesktop. Wie gesagt werden diese Spalten zur Zeit nur wegen dem Testen angezeigt. Ändere ich also etwas am Desktop-Client wird der Wert bei UpdateMobil auf „1“ gesetzt und wenn ich auf Synchronisieren klicke weiß mein Programm „Okay, diesen Datensatz muss ich in die Cloud schicken“.

Erfassen von neuen Filmen
Da die restlichen Spalten selbsterklärend sein sollten sehen wir uns nun den Erfassen-Dialog etwas näher an:

Wie man sehen kann, können auf dem Dialog (der zugegebenermaßen auch noch ein wenig verschönert werden kann) alle benötigten Daten erfasst werden. Dazu gehören Bezeichnung, Status, Medium, Genre, Medium, Preis, Kaufdatum. Rechts wird ein Bild des jeweiligen Filmes angezeigt.
Mit einem Klick auf übernehmen werden die Daten in der DB abgelegt und ein neuer Film kann erfasst werden. Mit Ok werden die Daten ebenfalls übernommen und der Dialog geschlossen.

Wie man rechts außerdem sehen kann gibt es ein Rechteck mit einem Pfeil darin. Zieht man dort eine Datei (.jpg) hin, wird diese in das Verzeichnis in das Programm liegt in einer Ordnerstruktur abgelegt. Diese sieht in dem Beispiel etwa so aus:
„Verzeichnis des Exe-Programms\Filme\Bilder\BluRay\2012.jpg“. Außerdem werden alle Sonderzeichen entfernt, welche im Dateinamen nicht erlaubt sind und Umlaute ersetzt (z. B. „ä“ durch „ae“) um Probleme beim FTP-Upload und -Download zu vermeiden.
Außerdem wird gleichzeitig ein Thumbnail erzeugt, welcher dann auf den Webserver geladen wird.

Neue Genres anlegen
Wie auf dem letzten Bild zu sehen ist, gibt es einen Button „Genre hinzufügen“. Sobald man diesen anklickt, erscheint folgender Dialog:

Wie mann sehen kann, können hier neue Genres hinzugefügt und alte entfernt werden. Durch einen Klick auf „Übernehmen“ wird auch die Combobox im Erfassen-Dialog gleich aktualisiert, damit man schon eingegebene Daten nicht nochmal eingeben muss. Auch die Genres kann man Synchronisieren, damit diese in der Cloud zur Verfügung stehen.

2
Jan

Mein Jahresrückblick 2013

Ich schließe mich den ganzen anderen Bloggern an und schreibe auch einen kurzen Jahresrückblick.

Urlaub
Dieses Jahr waren wir 2 mal Weg im Urlaub. Das erste mal richtig, eine Rundreise in Kappadokien in der Türkei. Obwohl ich nicht unbedingt der Türkei-Fan bin, war die Rundreise doch ganz interessant. Die Hotels reichten dabei von „Wow ziemlich cool“ bis „Wo bin ich den hier gelandet“. Das essen war auch Ok, solange man Hühnchen mag.

Der zweite Kurztripp war dann eine Cabriotour, die deutsche Alpenstraße entlang. Das war ziemlich cool. Wir haben uns das Cabrio meiner Eltern geliehen und dann ging es los. Wir hatten für die Tour drei Tage eingeplant und haben auch schon im voraus die Hotels (2 Stück) gebucht. Die Tour kann ich nur jedem empfehlen. Die Landschaft durch die man fährt ist der Wahnsinn.
Allerdings sollte man sich etwas mehr als 3 Tage Zeit nehmen. Denn mit 3 Tagen kann man sich nix ansehen. Denn der Tagesablauf ist damit ziemlich straff. Außerdem sollte man eher außerhalb der Ferienzeit fahren, denn man kommt durch viele Orte mit viel Tourismus, was auch ziemlich viel Verkehr bedeutet.

Soziale Netze
Die Facebook-Nutzung nimmt bei mir mittlerweile immer mehr ab. So wirklich interessante Sachen werden nicht mehr gepostet und überhaupt. Hauptsächlich verwende ich Facebook momentan nur noch um mit bekannten in Kontakt zu bleiben.
Dafür habe ich mich bei Twitter angemeldet, welches ich dafür umso mehr Nutze. Nachrichten aus der Technikwelt usw. sind dort einfach und kurz zu finden. Wer mich auf Twitter sucht, findet mich als . Außerdem hab ich mich kurz darauf auch bei Instagram angemeldet, wo ich mit dem selben Nickname gefunden werden kann.

Allgemein
Ansonsten war das Jahr 2013 auch ziemlich cool. Von der Arbeit aus waren wir auf einem treffen mit John Ray Thomas, dem Produktmanager von Embarcadero, welcher uns ein wenig was über die Hintergründe und die Zukunft vom C++ Builder erzählt hat, was ziemlich interessant war.
Außerdem kam dieses Jahr der Delphi-Compiler mit Android-Unterstützung und was noch viel wichtiger ist, der C++ Builder mit iOS-Unterstützung.

Ich persönlich habe mir zu Weihnachten eine Teufel Cinebar 51 THX gekauft, was dieses Jahr wohl mein „technisches“ Highlight ist. Guter Sound, toller Bass. Ich würde mir das Ding jederzeit wieder kaufen. Endlich kann man die Filme mit richtig „Bums“ anschauen 🙂

Handy
Auch im mobilen Sektor hat sich 2013 wieder ziemlich viel getan. HTC mit dem One und der Ultrapixel-Kamera. Samsung mit dem Galaxy S4 und dem Octa-Core-Prozessor (auch wenn dies nur Augenwischerei ist). Google mit dem Nexus 5, welches ich auch kurzzeitig hatte. Dazu fällt mir auf anhieb auch nur ein Wort ein „Smooth“ anders kann man das Nexus 5 nicht bezeichnen. Denn es läuft wirklich alles super flüssig darauf.
Dann kam noch Apple mit dem iPhone 5S. Der Fingerabdrucksensor wurde schon lange vor der Vorstellung des Gerätes vermutet und kam dann auch so. Die wirkliche Überraschung war eher die 64-Bit Architektur der CPU. Nach wie vor sehe ich (bisher) noch keinen Vorteil in dieser. Allerdings wollen die ersten Hersteller schon nachziehen. Wir werden sehen was dabei herauskommt.

Software
Mein Favorit für Software ist dieses Jahr eine kleine App für iPhone im Zusammenspiel mit dem Mac. ist eine kleine App, mit dem man den Mac durch klopfen des iPhones entsperren kann. Wie das funktioniert? Auf dem iPhone muss die App einmal gestartet worden sein (also zumindest im Hintergrund noch offen), außerdem muss Bluetooth aktiviert werden. Auf dem Mac müsst ihr dann noch eine entsprechende Software installieren, welcher das Passwort gegeben werden muss.
Ist die Einrichtung beendet und der Mac gesperrt, muss nur noch gewartet werden bis der Mac das iPhone „aktiviert“, also eine Bluetooth-Verbindung hergestellt wurde. Dann zweimal mit dem iPhone klopfen und schon ist der Mac entsperrt. Ziemlich coole Sache.