Maschinensprache

von null und eins zum Mnemonic im Assemblierer. Ein Byte, ein Befehl! Von Neumann Architektur, Befehle und Daten teilen sich einen Gemeinsamen Speicher.

Advertisements

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

 

SSH

SSH (Secure Shell). Mit UNIX Systemen kann man damit Verbindung zur Shell eines anderem Computers herstellen der im Netzwerk (LAN) angemeldet ist und ihn damit – gewissermaßen – fernsteuern.

SSH ist mein vorsichtiger Einstieg in das ‚Netzwerken‘. Anlass war mein kürzlich erstandener Raspberry Pi 3. In Ermangelung eines Zweit- Monitors habe ich mich einfach mit der hier beschriebenen Methode in die Kommandozeile meines RPI eingeloggt. Das geht so:

Ich habe eine fritzBox und ein Mac Book. Den RPI verbindet man mit einem Patchkabel direkt mit der fritzBox. Nach ein paar Sekunden sollte die Box den RPI erkennen. Die IP- Adresse kopiert man sich und wechselt dann in die Shell seines Client- Computers (in meinem Fall also mein Mac Book). Die SSH Verbindung stell man so her:

ssh pi@ip-adresse_hierher_kopieren

Vor dem ‚@‘ steht der username und dahinter die IP- Adresse die der Router – in meinem Fall die fritzBox –  dem RPI im Netzwerk zugewiesen hat.

Wenn die Verbindung hergestellt wurde, wird das Password abgefragt. Wie auf raspberry.org beschrieben sollte das ‚raspberry‘ lauten. Nach der Eingabe findet man sich in der Shell des RPI.

Das war es!

 

H2 Datenbank

Mein Einstieg in die Datenbank Programmierung mit Java. Momentan wird gelernt. Der Text der jetzt folgt, gibt meine Erfahrungen im Lernprozess stichwortartig wieder. Ich möchte schließlich nix vergessen….

Abstrakt

Früher hat man sich eine Datenbank selbst gebastelt. Heute gilbt es fertige Lösungen. Das macht Sinn, mann muss ja schließlich nicht immer wieder das Rad neu erfinden. Eine dieser Lösungen bietet die Hypersonic 2 –  Database Engine (H2) . Dieser Artikel beschreibt meine ersten Schritte – learnin by doing – mit dieser Lösung. 

Voraussetzungen

Ich arbeite mit:

  • Mac OS X 10.7.5 bzw Android Studio 2.0 (JRE 1.6.0.65)
  • java version 1.8.0_66
  • Java(TM) SE Runtime Environment (build 1.8.0_66-b17)
  • h2- Engine Version 1.4.191 (2016-01-21), Beta
  • Version: Mars.1 Release (4.5.1). Build id: 20150924-1200

Alle externen Links wurden zuletzt aufgerufen am: 03.05.2016

Installation

H2 ist eine leichtgewichtige Engine in Java/ für Java. Man bekommt Sie Dort. Nach dem Download liegt der Ordner “h2” im gewählten Verzeichnis.

Eine ausführliche Einführung wie man H2 für eigenen Projekte nutzen kann gibt es bei javabeginners. Dort steht vieles, aber nicht wie man die Engine installiert und in den CLASSPATH (OS X) oder den BUILDPATH (Eclipse unter OS X) einbindet. Ich habe das so gemacht:

Falls man mit Eclipse arbeite:
Die jar- Datei der H2- Engine muss in den Build- Path eingetragen werden.
Ich habe die Engine geladen und in einem mir genehmen Verzeichnis abgelegt[1]. Als nächstes ein neues Projekt in Eclipse angelegt und Project -> Properties -> Java Build Path aufgerufen, AddJar’s gewählt und  den Pfad in ich den Ordner “h2” abgelegt habe eingetragen.

Das reicht dann schon um loszulegen und einen ersten Beispiel Code zu testen.

Bildschirmfoto 2016-04-19 um 12.36.16

[1] Es ist egal welches Verzeichnis man wählt, möchte man seine Java- Umgebung aber sauber halten, dann geht man am besten wie unter Falls man von der Kommandozeile aus arbeitet beschrieben vor.

Falls man von der Kommandozeile aus arbeitet:

Zusätzliche Klassen sucht java in /Library/Java/Extensions bzw. im Heim- Verzeichnis des angemeldeten Nutzers unter ~/Library/Java/Extensions. Klassen (egal in welchem „Aggregatzustand“  *.java/ *.class oder *.jar)  die jedem Java- Programm das man schreibt  zur verfügung stehen sollen, kopiert man dorthin.

Findet java die *.class Datei nicht, sucht es nach dem Quellcode – also der *.java Datei – und kompiliert die. Selbstverständlich werden auch  *.jar Archive durchsucht.

Ich habe also die  Datei h2-1.4.191.jar in das oben erwähnte Verzeichnis kopiert.

Falls man mit Android Studio arbeitet:

  • Maven
    File-> Project Structure -> App -> Dependencies wählen:

Screen Shot 2016-06-29 at 1.27.48 PM

Dort dann auf „+“ klicken und 1 Library depenency wählen:

Screen Shot 2016-06-29 at 1.30.43 PM

Im Suchfeld gibt man dann „h2“ ein und die Library wird eingefügt. Man kann nun damit arbeiten.

Anmerkung: Im Hintergrundfenster kann man sehen, dass die Library schon eingefügt worden ist.

  • Lokales *.jar
    Einfach im Projektordner in libs/ die *.jar einfügen. Das war es.

Die Maven– Variante hat nicht immer funktioniert. In meinem SimpleLitaratureDB hat der Compiler beim erstellen des Gradel einen Fehler gemeldet. Variante 2, lokales *.jar hat anstandslos geklappt.

Die Datenbank (programmatisch) benutzen

Ein erster Test
Um zu testen ob der Treiber richtig installiert wurde habe ich dann Beispiel- Code von javabeginners übernommen und  leicht abgeändert. Alles weiter ist im Code- Beispiel kommentiert:

  • Beispiel Code einfügen => H2_Test.java

Wenn der Code läuft und in der Shell „OK“ ausgegeben wird, dann ist alles richtig installiert und man hat eine leere Datenbank zum experementieren.

Struktur einer relationaler Datenbank
Ich setze voraus dass das Prinzip einer relationen – Datenbank bekannt ist. Die Beschreibung würde den Rahmen dieses Artikels sprengen. Aber, in aller Kürze: Man stellt sich solche Datenbanken einfach als eine Sammlung von Tabellenbättern  vor, bei dem jede Zelle mit einer Zelle eines anderen Tabellenbalttes in Beziehung stehen kann. Daher der Namens Zusatz relational.

SQL- Abfrage
H2 lässt sich komplett mit SQL– Statements steuern. Grundsätzlich geht das so:

  • Conection object instanzieren (=Verbindung mit der Datenbank herstellen)

    Class.forName(„org.h2.Driver“);
    Connection conn = DriverManager.

    // Open DB. If not present, create one
    // Parameters: Driver name (jdbc:h2 + Pathname + username + pwd)

    getConnection(„jdbc:h2:~/Documents/Java/0_Eclipse_Projects/H2_Test/FirstDB“, „“, „“);

    System.out.println(„OK“);

  • Über die Klasse PreparedStatement mittels SQL die Datenbank füllen, abfragen oder verändern.Instanzen der Datenbank- Klasse (in diesem Beispiel conn) übergibt man mittels der Methode prepareStatement einen String mit einem beliebigen SQL- Statement. das Rückgabe Objekt  (im Beispiel selectPreparedStatement) enthält eine vor- kompilierten Version dieses Strings. Über die Methode  executeQuery() die man auf dieses Objekt anwendet erhält man das Ergebnis der Anfrage :

    PreparedStatement selectPreparedStatement = null;
    selectPreparedStatement = conn.prepareStatement(sqlString);
    ResultSet rs = selectPreparedStatement.executeQuery();

     

  • das Ergebnis lässt sich mittels der Methode next() abfragen:

     while (rs.next()) {…}

    Methoden von ResultSet:
    z.B. rs.getInt(„Spalte“);

    Wichtig zu Wissen! Das Ergebnis von ResultSet stellt man sich am besten als Tabelle vor. Die Anzahl der Spalten hängt von der Art der Abfrage ab und muss nicht mit der Anzahl der Spalten der abgefragten Tabelle übereinstimmen. Die Anzahl der Zeilen kann beliebig sein und entspricht der Anzahl der passenden Ergebnisse der Abfrage.

    Wenn ResultSet keine Ergebnisse enthält, dann kann man das herausfinden indem man die Methode isBeforeFirst() aufruft. Normalerweise wird der Cursor in der Ergebnistabelle vor der ersten Zeile platziert. Dann ist isBeforeFirst() war (true). Wenn nicht, wenn es also kein Ergebnis gab, dann kann der Cursor auch nicht vor einer solchen Zeile stehen. Die Methode liefert dann ein nicht wahr= false.

    ResultSet rs=newResultSet();
    if(!rs.isBeforeFirst()) System.out.println(„Kein Ergebniss gefunden“);

 

 

Nützliche Links

H2 API 
Klassen und Methoden der H2- Engine im Überblick.

RazorSQL
Ein Tool zum erstellen, manipulieren und betrachten von JDBC- basierenden Datenbanken (dazu zählt natürlich auch H2).

SQL- Tutorial
SQL (Structured Query Language) sollte man ansatzweise beherrschen, damit man mit der H2– API auch umgehen kann. Hier findet man einen ersten Anlaufpunkt für weitere Recherchen.

Begriffe

API
Application Programing Interface

JDBC
Java Datebase Conectivity. Ist eine API zur Datenbank Anbindung. Das Gegenstück in der Windows- Welt ist ODBC. JDBC kann einen Treiber verwenden um damit zu kommunizieren.

 

 

 

Push Notifications….

…selber gemacht.

Aufgabenstellung:
Wir nehmen an ich lasse auf meinem Computer ein Programm ablaufen das länger dauert (ein Shell Script beispielsweise das meine gesamte Festplatte nach einer bestimmten Datei durchsuchen soll) und ich möchte, wenn die Aufgabe erledigt ist, eine Nachricht auf meinem Handy haben.

Lösungsansatz:
In Stichworten: Man kann einen Service wie z.B. PushBullet in Anspruch nehmen.

PushBullet

Eine kurze Einführung gibt es da:

athinkersblog

Ein Beispiel Projekt dort:

Hacaday
Projekt: Die Waschmaschine schickt eine Nachricht aufs Handy, wenn sie fertig ist….

Letzter Aufruf aller Links: 12.03.2016

Unix Shell

Shell Scripts sind nützlich!

Eine gute Übersicht und Einführung zum Thema findet sich da:

Ubuntu Users (Letzter Aufruf: 11.2.2016)

Header

# !/bin/bash 

Gibt an, welcher Interpreter benutz werden soll. Es ginge auch:

#!/bin/perl

Wenn das Programm perl in bin liegt.

Das Ergebnis eines Befehls an einen Befehl übergeben

Im script schreibt man die wie in der Shell. Einfach im Klartext, so werde die dann auch abgearbeitet. Interessant ist, dass Befehle selbst als String an einen Befehl übergeben werden können:

echo $(ls -l)

Die Ausgabe des Beispiels ist das aktuelle Verzeichnis als String, zusammenhängend ohne Linefeed. Letzteren erreicht man mit:

echo „$(ls -l)“

Das Beispiel ist weitgehend sinnfrei, zeigt aber grundsätzlich wie das geht. Nützlicher wäre da schon:

for out in $(ls /Volumes/NO_NAME/DCIM/100NCD90/*.JPG)

Die Schleife arbeitet jeden Verzeichniseintrag ab der dem vorgegebenen Muster entspricht und stellt das Ergebnis (den Dateinamen jeder gefundenen JPG- Datei) in der Variable out bereit. Interessant in diesem Zusammenhang ist: Warum funktioniert das ohne dass der Befehl in Anführungszeichen gesetzt wurde?

 

A Trip Down the Graphics Pipeline…

Auf der Suche nach einem brauchbarem, einfachen Algorithmus zum zeichnen eines Kreises – der selbstverständlich nur mit Ganzzahlen rechnet – bin ich auf das hier gestoßen:

http://webstaff.itn.liu.se/~stegu/circle/circlealgorithm.pdf
(letzter Aufruf: 12.7.2015)

In diesem Dokument wird auch auf das Buch verwiesen, das titelgebend für diesen Blogeintrag ist: Blinn, Jimm: A Trip Down the Graphics Pipeline

Mehr zum Buch und die Quellen wo es zu haben ist, finden sich leicht im Netz.

Happy coding.