Android+ Big Data

Anbei ein paar Notizen zum Umgang mit großen Dateien.

Ich wollte wissen, wie man eine App schreibt, die eine Datenbank mitbringt, ohne das sich der Benutzer eine Datei selber herunterladen muss. Mein Ansatz war eine Datenbank die eine Sternenkarte enthält. Benutzt habe ich dazu die H2- Engine. Größe der Datenbank ca. 134MB.

Erster Versuch: Die Datenbank in den Assests Folder ablegen und von da, beim Start der App, in das Dateisystem kopieren. Das hat keinen Sinn gemacht, es funktioniert zwar, aber verdammt langsam!

Zweiter Versuch: Die Datenbank als Datei in das Filesystem geschrieben (Data/Data….) und beim Start der App geladen. Dauert zwar immer noch relativ lange, aber, es passiert in einer einigermaßen vertretbarer Zeitspanne. Da ist aber noch Optimierungsbedarf! Denn, auch wenn das Gerät gedreht wird, muss wieder gewartet werden.

(Hashes)Prinzip

Notiz: Ein Hash– Funktion verwandelt X nach Y. Zurück von Y nach X geht’s nimmer.Das letztere wäre der Fall wenn wir ein symmetrisches Kryptografie- Verfahren anwenden würden.

Nehmen wir an, wir möchten eine Zugangskontrolle – für eine Datenbank, eine Webseite etc. – bauen. Das ganze soll für mehrere Nutzer, jeder hat seinen eigenen usernamen und sein eigenes Passwort, funktionieren. Beides ist in einer Datenbank abgelegt. Da es sich um Sicherheitsrelevante Daten handelt, wäre es nicht sehr schlau, wenn das dort im Klartext stehen würde. Denn, ein Hexeditor gibt Aufschluss:

Screen Shot 2016-08-13 at 9.47.03 PM
Verdächtige Strings. Welche sind wohl eine  User/ Password Kombination?

Eine Hash- Funktion hilft. Nehmen wir an die Funktion heist H(x). x Sei eine Zeichenkette und H liefert dafür den Hashwert h zurück. Wenn man einen neuen user anlegt, berechnet man aus dem Password- String x den Wert h und legt nun h in der Datenbank ab. Das war es!

Das Selbe macht man beim Login. Wenn das Password eingegeben wurde berechnet man daraus wieder h und gleicht das mit der Datenbank ab. Ist h drin, dann ist das Password richtig.

Die Hash- Funktion ist umso besser, je unzweideutiger h ist. Zum Beispiel: Wird die Stellung der Zeichen im String nicht berücksichtigt, dann würde ‚abc‘ das Selbe h ergeben wie ‚cba‘. Nehmen wir an, die Menge der möglichen Eingabe- Strings sei unendlich, dann sollten auch unendlich viele h herauskommen und kein h sollte dem anderen gleichen. Die Kunst ist es nun eine für seine Zwecke möglichst brauchbare Funktion H zu finden.

 

 

 

Java, C++, Objective C

Das Konzept der Objektorientierten Programmierung spiegelt am ehesten die Art und Weise wieder wie wir denken. Klassen sind Blaupausen für Objekte die Eigenschaften und Funktionalitäten (Code) enthalten. Von einer Klasse können theoretisch beliebig viele Instanzen (Objekte) gebildet werden. Diese Objekte interagieren dann miteinander, ähnlich wie Funktionen bei den Prozeduralen Programmiersprachen. Der scheinbare Nachteil bei diesem Konzept ist, dass der Kontrollfluss in Programmmen nicht so leicht nachvollziehbar ist, wie das bei Prozeduralen Pogrammiersprachen der Fall ist.

DNS

Domain Name System. Weist IP- Adressen im Internet oder in lokalen Netzwerken Namen zu. Also in etwa so wie ein Telefonbuch Teilnehmernahmen einer Telefonnummer zuordnet. 

Erste Erfahrungen damit habe ich zunächst einmal in meinem lokalem Netzwerk beim Aufbau eines File- Servers mit Hilfe von NFS  gemacht.

Unix, Linux und Co.

Auf Unix- Systemen und deren Verwandtschaft (Darwin, Linux) kann man die Namen der möglichen Host’s im Netzwerk in der Folgenden Datei konfigurieren:

/etc/hosts

Dazu braucht man root- Rechte. Also, beim Aufruf des Editors seiner Wahl darauf achten dass man das mit sudo … macht. Dort stehen die IP Adressen gefolgt von deren Namenszuordnung als Liste in etwa so:

127.000.000.001 localhost
xxx.xxx.xxx.100 Notebook1
xxx.xxx.xxx.101 Tablet

Hat man was neues gekauft, kann man es in der Datei mit eintragen und kann fortan damit kommunizieren indem man es beim Namen nennt.

File Server mit dem Raspberry Pi3

Es folg eine kurze Beschreibung wie man das in der Überschrift genannte schnell und ’schmutzig‘ erledigt.

Im Wesentlichen habe ich dabei die passende Schnittmenge der Schritte aus dem sehr gut gemachten Tutorial bei good to know database[1] und der Anleitung bei Instructables[2] befolgt. Ich habe mich dabei auf das Ziel konzentriert und nicht auf das Lernen der Grundlagen, letzteres werde ich nich nachholen. Im Moment reicht es mir das mein Fileserver in meinem LAN läuft.

Die offizielle Seite zu NFS findet sich da: FreeBSD.org

Systemvoraussetzungen

Benutz habe ich einen Raspberry 3 als Server. Als Client wurde mein MacBook Pro mit Mac OS X 10.9.1 eingesetzt.

Alle externen Links in diesem Artikel wurden das letzte mal am 30.5.2016 getestet und für aktiv befunden.

Auf dem Server (dem Raspberry):

Quelle [1] und [2] setzen etwas Vorwissen zum Thema Linux und dessen Konzept zur Systemaktuallisierung voraus und das hatte ich nicht. Kurz: Man sollte, bevor man mit dem Einrichten des NFS- Servers beginnt, sein (Server-) System auf den neuesten Stand bringen. Das geht so:

sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade

Der NFS- Server sollte sich jetzt so installieren lassen:

sudo apt-get install nfs-kernel-server nfs-common rpcbind

Als nächstes erzeugt man ein Verzeichnis in dem die Dateien liegen, auf die man (mit dem Client) zugreifen möchte:

mkdir /home/pi/nfsFolder

Am einfachsten – aber auch potentiell am gefährlichsten – ist es, wenn man für die Zugriffe darauf alle Rechte freischaltet.

Dieses Verzeichnis muss man nun noch in der Konfigurationsdatei  /etc/exports anmeldenden. Dazu schreibt dort die folgende Zeile hinein:

/home/pi/nfsFolder xxx.xxx.xxx.xxx(rw,sync,insecure)

Die mit xxx…. bezeichnete IP- Adresse ist die Adress des Clients dem man den Zugriff auf das Verzeichnis erlaubt. Ersetzt man die durch einen *, dann darf jeder auf das Verzeichnis zugreifen.

Wichtig – aber deutlich betreffend der Sicherheit – ist die Option insecure. Damit hat das Client- seitige mounten ohne Probleme geklappt (Von der Shell aus und im Finder – dort mit cmd- K).

Server starten:
Die unter [1] beschriebenen Schritten zum starten des Servers habe bei mir nicht zum Erfolg geführt. Geklappt hat es so:

/etc/init.d/rpcbind start
/etc/init.d/nfs-common start
/etc/init.d/nfs-kernel-server start

Auf dem Client (mit dem Server verbinden):
Prüfen ob der Server läuft:

showmount -e xxx.xxx.xxx.xxx

Das auf dem Server in der Datei exports angegebenen Verzeichnis sollte – inklusive der eingestellten Rechte – angezeigt werden.

Mounten

Im Finder führt die Tastenkombination CTRL- K zum Erfolg. In der Shell geht das so:

sudo mount_nfs xxx.xxx.xxx.xxx:/home/pi/nfsFolder /Volumes/nfs/

Trouble Shooting 

der Link war sehr hilfreich:

http://www.tldp.org/HOWTO/NFS-HOWTO/troubleshooting.html#SYMPTOM9

 

SQL

Datenbank für die Beispiele:

Item
key1
key2
name

box
key1
key2 
myname

shelf
key1
key2
name

Grundlagen

Groß-/ Kleinschreibung

SQL unterscheidet nicht zwischen Groß und Kleinschreibung. Die Schreibweise  des Befehls SELECT ist für den Interpreter das Selbe wie select. Gleiches gilt für die Bezeichnung von Tabellen- und Spalten Namen.

Primär- und Fremd- Schlüssel

Schlüssel dienen dazu Tabellenzeilen eindeutig identifizierbar zu machen. Der Primäre Schlüssel bezieht sich dabei auf die Zeile selbst. Der Fremdschlüssel stellt die Verbindung einer Tabellenzeile zum Primärschlüssel einer anderen Tabellenzeile in einer anderen Tabelle her.

Beispiel: Tabelle ‚box‘ und Tabelle ‚item‘. Jedes ‚item‘ wird über seinen Fremdschlüssel eindeutig mit der ‚box‘ in die es gehört verknüpft.

Eindeutige Schlüssel 

Eindeutige Schlüssel lassen sich mit Hilfe des Datentypen identity in eine Tabelle einfügen. Das kann man beim anlegen der Tabelle machen, oder später nachholen. Wenn man die letzte Option wählt erhält man eine Fehlermeldung, wenn die gewählte Schlüssel- Spalte Zeilen  mit doppelten Werten enthält:

alter table item alter key1 identity

Wenn man in die Tabelle nun neue Inhalte einfügt:

insert into item (key2,name) values (2,'Hallo')

Dann wird braucht man für ‚key1‘ keinen Wert übergeben, der wird automatisch generiert und zwar so, dass er in der Tabelle nur einmal vorkommt.

Für denn Fall dass man den Schlüssel wieder löschen möchte:

alter table item drop primary key

 

Tabellen- /Spaltenaliase

Tabellennamen müssen sich unterscheiden. Spaltennamen müssen das nicht. Wenn es in einer Abfrage zu Mehrdeudigeiten wegen der Übereinstimmung von Spaltennamen kommen sollen (z.B. beim Verbinden von zwei Tabellen mit join), dann lässt sich diese Mehrdeutigkeit durch die Verwendung des Punkt- Operators beseitigen. In meiner Beispieldatenbank ist ’name‘ in der Tabelle ’shelf‘ und ‚item‘ vergeben:

select i.name,byname,s.name from item .....

Externe Links

Ein gut gemachtes Tutorial findet sich hier: 1keydata.com (letzter Aufruf: 5.5.2016).

Beispiel- Code
Alle Zellen oder bestimmte Zellen einer Tabelle ausgeben:

Weiterlesen

Retro Spiele Konsole

Mit dem Raspberry Pi kann man vieles machen. Das erste was ich damit angestellt habe war, ihn in eine Retro- Spielekonsole zu verwandeln.

Das geht einfacher als man denk. Emulationen für die gängigsten Systeme  gibt es schließlich in Hülle und Fülle. Wenn man es sich ersparen möchte jedes System für sich herunterzuladen und zu installieren, dann kann man sich des RetroPi- Projektes bedienen. Die Software bietet ein Bündel der beliebtesten Systeme und läßt sich dank eines vorbereiteten Shell- Scriptes weitgehend automatisch installieren. Anleitung und Script gibt es hier.

Wenn man sein RPI mit dem Internet verbunden hat kann man alles damit, von der Shell aus erledigen. Ansonsten kann man das auch über eine SSH- Verbindung  machen. Wie man das geht, steht da im Blog.

Die Installation dauert eine Weile. wenn alles fertig ist wird man noch darauf aufmerksam gemacht, dass man für einige der Systeme noch die passenden BIOS’e benötigt (die ROMS mit dem jeweiligen Betriebssystem). Selbstverständlich sind die genauso wenig in den Paketen enthalten wie die Spiele (Copyright’s). 

Wenn das Script fertig ist, wechselt man in sein Home- Verzeichniss, das geht so:

cd ~

Dort sollte nun der Ordner RetroPi liegen. Die darunterliegende Verzeichniss Struktur ist selbsterklärend. Laut der Ordnerliste im Verzeichnis ROMS werde die Folgenden Systeme emuliert:

Emulierte Systeme:

amiga atari5200 c64 fds genesis mame-mame4all neogeo pcengine sega32x videopac
amstradcpc atari7800 coco gamegear intellivision mastersystem nes ports segacd wonderswan
apple2 atari800 dragon32 gb macintosh megadrive ngp psp sg-1000 wonderswancolor
arcade atarilynx dreamcast gba mame-advmame msx ngpc psx snes zmachine
atari2600 atarist fba gbc mame-libretro n64 pc scummvm vectrex zxspectrum