Es kommt häufig vor, das man für Eclipse Plug-ins die entsprechenden Extension Points suchen muss. Die können leicht an den unterschiedlichen Icons erkannt werden. Einfach auf dem Mac CMD+Shift+A (Windows Ctrl+Alt+A) aufrufen und einen bekannte Teil eingeben, dann auf die Icons am Rande achten:
Wie kann der Plug-in Spy für UI Teile oder der Menü Syp auf dem Mac (Win) von Eclipse aufgerufen werden?
Wenn man in Eclipse sehen will, welche UI Komponenten gerade selektiert bzw. aktiv sind, kann der Plug-in Spy verwendet werden. Mit dem kann auch mit nur einen klick auf den Quellcode des jeweiligen aktiven Plug-ins zugegriffen werden. Wie kann der aber auf einem Mac aufgerufen werden (Vier Tasten gleichzeitig): fn+shift+alt+F1 (auf Windows Alt+Shift+F1)
Es erscheint dann solch ein PopUp-Dialog:

und noch ein Beispiel:

Analog dazu gibt es auch einen Spy für die Menüs, der wird mit fn+shift+alt+F2 (auf Windows Alt+Shift+F2) aufgerufen und dann ein Menüpunkt auswählen, es kommt dann z.B. dieser Dialog:

Eclipse PlugIn: Wie kann Text im Konsolen Fenster ausgegeben werden?
Manchmal möchte man einfach nur Text in der Konsole ausgeben. Früher, d.h. vor Eclipse 3.0 musste man dazu eine eigene View erzeugen. Das braucht man nun nicht mehr, man kann die vorhandenen generic Log Konsole verwenden.
Aufrufen geht dann einfach so:
|
1 2 3 4 5 6 |
MessageConsole konsole = getKonsole("Konsole"); MessageConsoleStream out = konsole.newMessageStream(); out.println("Hallo sagt Thomas von der Konsole."); out.println("Wir schreiben einfach in die Konsole oder?"); out.println(); out.println("Ist das Cool?"); |
Hier die Methode, die die Konsole liefert bzw. erzeugt:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
/** * Liefert die Log Konsole. Wenn keine Konsole vorhanden ist, wird eine neu erzeugt. * * @param konsolenName * der Name der Konsole * @return MessageConsole */ private MessageConsole getKonsole(String konsolenName) { ConsolePlugin plugin = ConsolePlugin.getDefault(); IConsoleManager konsolenManager = plugin.getConsoleManager(); IConsole[] konsolen = konsolenManager.getConsoles(); for (int i = 0; i < konsolen.length; i++) { if (konsolenName.equals(konsolen[i].getName())) { return (MessageConsole) konsolen[i]; } } // keine Konsole gefunden, dann erzeugen wir eine MessageConsole konsole = new MessageConsole(konsolenName, null); konsolenManager.addConsoles(new IConsole[] { konsole }); return konsole; } |
Wir erhalten dann folgenden Ausgabe:

Um das zu erreichen, muss noch eine neue Abhängigkeit ( org.eclipse.ui.console) (Dependencies) ergänzt werden:
Eclipse PlugIn: Wie kann ein Logeintrag in der Error Log View erstellt werden?
Bei der PlugIn Programmierung unter Eclipse Luna kann leicht auf die Log-View zugegriffen werden. Hier mal ein kleines Beispiel mit den verschiedenen Loglevel:
|
1 2 3 4 5 6 7 8 9 10 11 |
IStatus status = new Status(IStatus.INFO, "TWPlugin", "Testeintrag im Log im Status Info"); StatusManager.getManager().handle(status, StatusManager.LOG); status = new Status(IStatus.ERROR, "TWPlugin", "Testeintrag im Log im Status Error"); StatusManager.getManager().handle(status, StatusManager.LOG); status = new Status(IStatus.WARNING, "TWPlugin", "Testeintrag im Log im Status Warning"); StatusManager.getManager().handle(status, StatusManager.LOG); status = new Status(IStatus.OK, "TWPlugin", "Testeintrag im Log im Status OK"); StatusManager.getManager().handle(status, StatusManager.LOG); |
OpenWrt Barrier Breaker 14.07: Wie kann Dump1090 auf einem TP-WR703N Router unter OpenWrt zum Airplanespotting installiert werden?
Hatte noch einen TP-WR703N rumliegen. Wenn dort die aktuelle Version von OpenWrt (14.07) installiert ist, geht es mit LuCI sehr schnell.
Auf die Seite System – Software gehen. Im Filter dump1090 eingeben und auf Find package klicken. Dann unten mit klick auf Install das fertige Package installieren.
„OpenWrt Barrier Breaker 14.07: Wie kann Dump1090 auf einem TP-WR703N Router unter OpenWrt zum Airplanespotting installiert werden?“ weiterlesen
Arduino: Wie können RFID Tags eingelesen und drahtlos empfangen werden?
Wie hier schon beschrieben, können mit einem Arduino und eine RFID-Reader leicht RFID-Tags eingelesen werden.
In dieser Anleitung, werden nun die eingelesenen RFID Daten drahtlos versendet und empfangen. Dazu wird ein zweiter Arduino und ein Sender und Empfänger ( < 2 Euro) verwendet.
Hier der schematische Aufbau:
„Arduino: Wie können RFID Tags eingelesen und drahtlos empfangen werden?“ weiterlesen
Arduino: Wie können RFID Tags eingelesen werden?
Wie können RFID-Tags eingelesen werden?
Das geht ganz einfach mit einem Arduino Nano und ein 125 kHz EM4100 RFID card reader module (RDM630 UART) das keine 5 Euro inkl. Versand kostet.
Die Belegung des RFID-Readers:

Die PINs:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
1.Pin Definition (WEIGAND26): 2. Pin definition (TTL interface RS232 data format): P1: P1: PIN1 DATA0 PIN1 TX PIN2 DATA1 PIN2 RX PIN3 PIN3 PIN4 GND PIN4 GND PIN5 +5V(DC) PIN5 +5V(DC) P2: P2: PIN1 ANT1 PIN1 ANT1 PIN2 ANT2 PIN2 ANT2 P3: P3: PIN1 LED PIN1 LED PIN2 +5V(DC) PIN2 +5V(DC) PIN3 GND PIN3 GND |
Spec RDM630: Baud Rate: 9600bps,N,8,1, Frequenze: 125 kHz, DC 5V (+-5%), <50 mA, Empfangsbereich: 2 bis 5 cm, Checksum card 10byte Data mit XOR
So sieht der Aufbau aus:

Es sind nur 3 Verbindungen zwischen dem Arduino und dem RDM630 nötig und zwar:
|
1 2 3 4 5 |
Arduino Nano: D6 auf PIN 1 des RDM630 (TX) +5v auf PIN 5 des RDM630 (+5 Volt) GND auf PIN 4 des RDM630 (GND) Antenne auf P2 PIN 1 und 2 des RDM630 |
Dann folgende Software RFIDReader.ino auf den Arduino laden, die den Vorteil hat, das die serielle Konsole frei bleibt.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 |
/* RFIDReader Beschreibung: Dieses Programm liesst RFID-Tags von Transponer ein und ueberprueft die Checksumme (XOR) und gibt die Nummer auf der Seriellen-Konsole aus wenn die Nummer erkannt wurde gefolgt von einem OK. Folgende Verbindungen sind noetig: Arduino Nano: D6 auf PIN 1 des RDM630 +5v auf PIN 5 des RDM630 (+5 Volt) GND auf PIN 4 des RDM630 (GND) Antenne auf P2 PIN 1 und 2 des RDM630 Serielle Konsole auf 57000 Baud stellen. Compile mit Arduino 1.5.8 IDE. Einstellung: Board Arduino Nano, Prozessor Arduino ATMega328, Programmer USBtinyISP Der Sketch verwendet 8.216 Bytes (26%) des Programmspeicherplatzes. Das Maximum sind 30.720 Bytes. Globale Variablen verwenden 378 Bytes (18%) des dynamischen Speichers, 1.670 Bytes für lokale Variablen verbleiben. Das Maximum sind 2.048 Bytes. Dieses Programm basiert auf dem Beispielprogramm von maniacbug https://maniacbug.wordpress.com/2011/10/09/125khz-rfid-module-rdm630/ Copyright (C) 2015 Thomas Wenzlaff http://www.wenzlaff.de This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see {http://www.gnu.org/licenses/}. */ #include <SoftwareSerial.h> // Pin definitions // Specifies a function to call when an external interrupt occurs. Replaces any previous function that was attached to the interrupt. // Most Arduino boards have two external interrupts: numbers 0 (on digital pin 2) and 1 (on digital pin 3). // The Arduino Mega has an additional four: numbers 2 (pin 21), 3 (pin 20), 4 (pin 19), and 5 (pin 18). const int rfid_irq = 0; // PIN 6 ist auf dem Nano der D6 oder der Pin 9 von rechts, wenn die Stecker rechts liegen const int rfid_tx_pin = 6; // RX wird nicht benoetigt const int rfid_rx_pin = 7; // Untertrueckung von Rauschen bzw. leer Ausgaben, evl. aendern const long LEER = 16843009L; // Baud Rate zum Host PC, evl. aendern const long baudRate = 57600L; // For communication with RFID module SoftwareSerial rfid(rfid_tx_pin, rfid_rx_pin); // Indicates that a reading is now ready for processing volatile bool ready = false; // Buffer to contain the reading from the module uint8_t buffer[14]; uint8_t* buffer_at; uint8_t* buffer_end = buffer + sizeof(buffer); void rfid_read(void); void setup(void) { // Oeffnet die Serielle Verbindung zum Host PC um die Ausgabe der RFID-Tags zu sehen // Geschwindigkeit kann angepasst werden Serial.begin(baudRate); Serial.println("Starte RFID-Reader V. 1.0 von wenzlaff.info"); // Open software serial connection to RFID module pinMode(rfid_tx_pin,INPUT); // muss fest fuer das Modul auf 9600 stehen rfid.begin(9600); Serial.println("OK"); // Listen for interrupt from RFID module. Fallingfor when the pin goes from high to low. attachInterrupt(rfid_irq,rfid_read,FALLING); } void loop(void) { if ( ready ) { // Convert the buffer into a 32-bit value uint32_t result = 0; // Skip the preamble ++buffer_at; // Accumulate the checksum, starting with the first value uint8_t checksum = rfid_get_next(); // We are looking for 4 more values int i = 4; while(i--) { // Grab the next value uint8_t value = rfid_get_next(); // Add it into the result result <<= 8; result |= value; // Xor it into the checksum checksum ^= value; } // Pull out the checksum from the data uint8_t data_checksum = rfid_get_next(); // evl. die Nummer anpassen, oder die if abfrage loeschen if (result != LEER){ if ( checksum == data_checksum ){ Serial.print(result); Serial.println(" OK"); } } // We're done processing, so there is no current value ready = false; } } // Convert the next two chars in the stream into a byte and // return that uint8_t rfid_get_next(void) { // sscanf needs a 2-byte space to put the result but we // only need one byte. uint16_t result; // Working space to assemble each byte static char byte_chars[3]; // Pull out one byte from this position in the stream snprintf(byte_chars,3,"%c%c",buffer_at[0],buffer_at[1]); sscanf(byte_chars,"%x",&result); buffer_at += 2; return static_cast<uint8_t>(result); } void rfid_read(void) { // Only read in values if there is not already a value waiting to be // processed if ( ! ready ) { // Read characters into the buffer until it is full buffer_at = buffer; while ( buffer_at < buffer_end ) *buffer_at++ = rfid.read(); // Reset buffer pointer so it's easy to read out buffer_at = buffer; // Signal that the buffer has data ready ready = true; } } |
Compile mit der Arduino 1.5.8 IDE.

Einstellung in der IDE:
Board Arduino Nano, Prozessor Arduino ATMega328, Programmer USBtinyISP
Serielle Konsole auf 57000 Baud stellen
und einen RFID-Tag an die Antenne halten:

Es wird eine Reichweite von ca. 4 cm erreicht. Wenn die Antenne unter der Schreibtischplatte montiert wird, kann der RFID-Tag sicher gelesen werden, wenn der Tag oben drauf liegt (Anwesendheitskennung).
Habt ihr eine Idee, wie die Reichweite vergrößert werden kann?
Oder einen guten Anwendungsfall?
Wie kann mit der neuen Java Zeit API 1.8 ein Zeitstempel (2014-01-31_15:12:00) erzeugt werden?
Java 1.8 gibt es ja nun schon einige Zeit. Warum nicht die neue Time API verwenden?
Vorteil, die meisten Time und Date Klassen sind immutable und thread-safe. Z.B die LocalDateTime, LocalDate und DateTimeFormatter.
Hier mal ein Beispiel, um einen Zeitstempel in der Form 2014-01-31_15:12:00 zu erzeugen:
|
1 2 3 4 5 |
import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; private static final DateTimeFormatter ZEITSTEMPEL_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd_HH:mm:ss"); |
|
1 2 3 4 5 6 |
private static String getZeitstempel() { // 2014-01-31_15:12:00 LocalDateTime heute = LocalDateTime.now(); String zeitstempel = ZEITSTEMPEL_FORMAT.format(heute); return zeitstempel; } |
Raspberry Pi: Einfaches steuern der Ports, Kamera, System usw. über Browser mit BerryIO V. 1.12.0
Einfaches steuern der IO Ports, Kamera, LCD, SPI, Network, Systemstatus usw. des rPi geht mit BerryIO, das in ein paar Minuten installiert ist.
Zuerst einmal ein kleiner Überblick als Mindmap:

Und nun die Installation:
|
1 2 3 4 5 6 7 8 9 10 11 |
# System aktualisieren sudo apt-get update sudo apt-get upgrade # Download der aktuellen Version wget -N https://raw.github.com/NeonHorizon/berryio/master/scripts/berryio_install.sh # Script ausführbar machen chmod +x berryio_install.sh # Installation starten sudo ./berryio_install.sh # Programm Hilfe aufrufen berryio help |
Ausabe der Hilfe:
|
1 2 3 4 |
BerryIO V1.12.0 (2014-08-02) USAGE: sudo berryio <command> [<option>] [<option>] [....] |
Es gibt auch eine Kommandozeilen API. Cool mit der Api, man kann auch alles über das Terminal abfragen und evl. scripten. Da kommt mir doch gleich eine Idee zum Fhem Server.
Aber die Gui ist auch schön.
Aufruf im Browser: http://pi-adresse dann eingabe des Users: pi und Passwort.
Schon erscheint der Dialog:

Über das Menü können leicht die anderen Reiter angezeigt werden. Hier mal eine kleine Auswahl: „Raspberry Pi: Einfaches steuern der Ports, Kamera, System usw. über Browser mit BerryIO V. 1.12.0“ weiterlesen
DUMP1090 Client TWFlug 0.1.0 für Raspberry Pi, Mac, Windows und Linux veröffentlicht
Habe soeben die 1. Version von dem DUMP1090 Client TWFlug kostenlos 
veröffentlicht.
TWFlug liest die Daten von einem DUMP1090 Server und zeigt sie (optional) in einem Tacho an oder/und schreibt die Daten in eine Logdatei für die Auswertung mit z.B. Fhem. Es kann die Logdatei auch per sFTP an einen entfernten Rechner kopieren.
Das TWFlug Programm ist ein Java Programm und läuft somit auf allen Betriebssystem. Es können mit Fhem dann solche schönen Grafiken in Echtzeit angezeigt werden:

Installation:
Download der twflug-0.1.0.zip.
Dann das Archive auspacken.
Für das Starten gibt es zwei Möglichkeiten mit oder ohne GUI.
Ohne GUI mit Eingabe in der Konsole in dem TWFlug Verzeichnis mit:
|
1 |
java -jar twflug.jar -n --ip IP-VOM-DUMP1090-Server |
also z.B. java -jar twflug.jar -n --ip 192.198.1.2
oder mit GUI
|
1 |
java -jar twflug.jar --ip IP-VOM-DUMP1090-Server |
also z.B. java -jar twflug.jar --ip 192.198.1.2
Dann startet nach einigen Sekunden, die folgenden Anzeige von TWFlug:

Weiter Infos zu den Parametern erhält man durch Eingabe von
|
1 |
java -jar twflug.jar --help |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
[main] DEBUG de.wenzlaff.twflug.TWFlug - Starte TWFlug ... usage: TWFlug -c,--copy-time <arg> copy time in Minuten (default: 60 Minuten) -d,--debug print debugging information (default: false) -dd,--ziel-datei <ziel-datei> destination file name (default: /home/pi/fhem/log/flugdaten-YYYY-MM.log) -dip,--ziel-ip <arg> ip adress for copy destination -dpsw,--ziel-passwort <arg> passwort from destination User -duser,--ziel-user <arg> destination User (default: pi -h,--help print help and exit -height,--window-height <arg> set window hight (default: 600) -i,--ip ip adress from DUMP1090 -k,--copy copy output file to destination (default: false) -max,--max-count <arg> set max count value (default: 50) -min,--min-count <arg> set min count value (default: 0) -n,--no-gui display no GUI. Only logfile output (default: false) -o,--outputfile <outputfile> use given file for DUMP output (default: flugdaten-YYYY-MM.log) -p,--port <arg> port from DUMP1090 (default: 30003) -r,--refresh-time <arg> refresh time in ms (default: 300000 ms = 5 Minuten) -v,--version print the version information and exit -width,--window-width <arg> set window with (default: 600) |
Weitere Anregungen, Bugs, Fix, Likes, Lob und Dank gerne als Kommentar hier auf der Seite.
Viel Spaß beim Planecounting.
Raspberry Pi: Wie können Flugzeugdaten in Fhem in real-time (Echtzeit) angezeigt werden?
Da bei mir ein Fhem Home-Server läuft, hatte ich die Idee, dort doch gleich die Flugdaten die von den Flugzeugtranspondern ausgesendet werden schön graphisch in Echtzeit anzuzeigen.
Also wie kann eine Grafik in Fhem erstellt werden, die die aktuelle Anzahl der gerade empfangenen Flugzeuge anzeigt.
Hier das Ergebniss, wo man deutlich sehen kann, das heute bis ca. 6 Uhr nur ca. 10 Flugzeuge flogen. Dann steigt der Flugverkehr rapide an:

Wie kann nun so eine Grafik, die sich automatisch aktualisiert erstellt werden.
Zuerst einmal die Architektur als BPMN 2.0 Diagramm:

Es werden zwei Raspberry Pi benötigt. Auf dem einen läuft der DUMP1090 Server mit der TWFlug Anwendung unter Java 1.8. Die TWFlug Anwendung läuft ohne Gui, und schreibt alle 5 Minuten die Anzahl der empfangenen Flugzeuge in eine Datei. Diese Datei wird dann jede halbe Stunde per sFTP an den anderen Raspberry Pi gesendet und von Fhem eingelesen und als Grafik ausgegeben.
TWFlug kann auch mit Gui auf einen Rechner gestartet werden und gibt dann als Tacho die Anzahl der Flugzeuge aus.

Das nötige GPlot Script:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
/* myFlug.gplot Version 1.0 vom 17.12.2014 Dieses GNU-Plot Script zeigt die Flugdaten von den empfangenen Transpondern an. Copyright (C) 2014 Thomas Wenzlaff http://www.wenzlaff.de This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see {http://www.gnu.org/licenses/}. */ # Die Logdatei sieht wie folgt aus: # 2014-12-05_07:05:58 flugdaten anzahl:29 # 2014-12-05_07:10:58 flugdaten anzahl:23 set terminal png transparent size <SIZE> crop set output '<OUT>.png' set xdata time set timefmt "%Y-%m-%d_%H:%M:%S" set xlabel " " set title 'Empfangene Flugzeuge' set ytics set y2tics set grid ytics y2tics set ylabel "Anzahl Flugzeuge" set y2label "Anzahl Flugzeuge" #FileLog 4:flugdaten anzahl:0: plot "<IN>" using 1:2 axes x1y2 title 'Anzahl Flugzeuge' ls l0 lw 2 with lines |
TWFlug schreibt die Daten in eine Logdatei mit folgenden Format, z.B.:
|
1 2 3 4 5 6 7 |
2014-12-17_17:31:08 flugdaten anzahl: 39 2014-12-17_17:36:08 flugdaten anzahl: 49 2014-12-17_17:41:08 flugdaten anzahl: 36 2014-12-17_17:46:08 flugdaten anzahl: 34 2014-12-17_17:51:08 flugdaten anzahl: 36 2014-12-17_17:56:08 flugdaten anzahl: 42 2014-12-17_18:01:08 flugdaten anzahl: 41 |
TWFlug kennt bisher die folgenden Parameter:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
usage: TWFlug -c,--copy-time <arg> copy time in Minuten (default: 60 Minuten) -d,--dest-file <ziel-datei> destination file name (default: /home/pi/fhem/log/flugdaten-YYYY-MM.log) -h,--help print help and exit -height,--window-height <arg> set window hight (default: 600) -i,--ip ip adress from DUMP1090 (default: 0.0.0.0) -ip,--ziel-ip <arg> ip adress for copy destination (default: pi-home) -k,--copy copy output file to destination (default: false) -max,--max-count <arg> set max count value (default: 50) -min,--min-count <arg> set min count value (default: 0) -n,--no-gui display no GUI. Only logfile output (default: false) -o,--outputfile <file> use given file for DUMP output (default: flugdaten-YYYY-MM.log) -p,--port <arg> port from DUMP1090 (default: 30003) -psw,--ziel-passwort <arg> passwort from destination User -r,--refresh-time <arg> refresh time in ms (default: 300000 ms = 5 Minuten) -user,--ziel-user <arg> destination User (default: pi -v,--version print the version information and exit -width,--window-width <arg> set window with (default: 600) |
Welche fehlen noch?
Hinweise zu TWFlug
und DUMP1090 können auf diesem Blog gefunden werden.
JUnit 4.12 erschienen
Nach über 2 Jahren ist nun eine neue Version von JUnit veröffentlicht worden. Die Releasenotes sind auf Github zu finden. In folgenden Bereichen gab es Ergänzungen:
- Assertions
- Command-line options
- Test Runners
- Exception Testing
- Timeout for Tests
- Parameterized Tests
- Rules
- Theories
- Categories
- Use with Maven
- Miscellaneous
Ok, dann mal gleich das aktuelle Maven Projekt TWFlug auf die neue Version 4.12 angepasst:
|
1 2 3 4 5 6 7 8 9 10 |
<properties> <junit.version>4.12</junit.version> </properties> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> |
Mehr über JUnit oder drei Gründe warum man keine JUnit-Tests schreiben sollte.
OPML Mindmap und erzeugen von OPMLs
Hier ein kleiner Überblick in Form einer Mindmap:

OPMLs können leicht mit dem OPML Builder in ein paar Sekunden erstellt werden.
Einfach z.B. die URL http://www.wenzlaff.de eingeben und auf „Get links“ klicken:

Und auf „Create OPML“ klicken, schon wird diese OPML erzeugt:

Wie kann der Terminalmultiplexer Screen auf einem Raspberry Pi installiert werden?
Screen gibt es nicht nur für den Mac, wie hier schon mal beschrieben. Es ist hilfreich um eine Sitzung von mehreren Personen zugleich zu benutzen oder um Progamme parallel zu nutzen.
Installiert ist es schnell mit:
|
1 2 3 |
sudo apt-get update sudo apt-get upgrade sudo apt-get install screen |
Folgende Abhängigkeiten werden installiert, wie diese Mindmap zeigt:
Ein
|
1 |
screen -help |
gibt die Syntax und Verwendung aus:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
Use: screen [-opts] [cmd [args]] or: screen -r [host.tty] Options: -4 Resolve hostnames only to IPv4 addresses. -6 Resolve hostnames only to IPv6 addresses. -a Force all capabilities into each window's termcap. -A -[r|R] Adapt all windows to the new display width & height. -c file Read configuration file instead of '.screenrc'. -d (-r) Detach the elsewhere running screen (and reattach here). -dmS name Start as daemon: Screen session in detached mode. -D (-r) Detach and logout remote (and reattach here). -D -RR Do whatever is needed to get a screen session. -e xy Change command characters. -f Flow control on, -fn = off, -fa = auto. -h lines Set the size of the scrollback history buffer. -i Interrupt output sooner when flow control is on. -l Login mode on (update /var/run/utmp), -ln = off. -ls [match] or -list Do nothing, just list our SockDir [on possible matches]. -L Turn on output logging. -m ignore $STY variable, do create a new screen session. -O Choose optimal output rather than exact vt100 emulation. -p window Preselect the named window if it exists. -q Quiet startup. Exits with non-zero return code if unsuccessful. -Q Commands will send the response to the stdout of the querying process. -r [session] Reattach to a detached screen process. -R Reattach if possible, otherwise start a new session. -s shell Shell to execute rather than $SHELL. -S sockname Name this session <pid>.sockname instead of <pid>.<tty>.<host>. -t title Set title. (window's name). -T term Use term as $TERM for windows, rather than "screen". -U Tell screen to use UTF-8 encoding. -v Print "Screen version 4.02.01 (GNU) 28-Apr-14". -wipe [match] Do nothing, just clean up SockDir [on possible matches]. -x Attach to a not detached screen. (Multi display mode). -X Execute <cmd> as a screen command in the specified session. |
Oder aber die Tastaturbefehle können mit ctrl+A + ? wie folgt ausgegeben werden:


Beispiel: Wir starten in einer Konsole einen Prozess der länger dauert, hier mal htop um den Speicher und CPU Verbrauch anzuzeigen.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
screen -S Beispiel htop # Tasten ctrl+a -> d # htop wird in den Hintergrund gesendet, läuft noch weiter, es kommt diese Meldung: [detached from 4605.Beispiel] # Nun ein neues Terminal Fenster öffnen und screen -ls # alle laufenden screen Prozesse anzeigen # Ausgabe: # There is a screen on: # 4605.Beispiel (01.11.2014 11:49:03) (Detached) # 1 Socket in /var/run/screen/S-pi. # Nun verbinden wir uns mit dem im Hintergrund laufenden htop Prozess mit screen -r Beispiel # Es erscheint das laufende Programm htop |
Einige weitere Beispiele für den Einsatz findet man hier.
Raspberry Pi: Neue Firmware vom 17.10.2014 (Version 3.12.30) installieren
Vor ein paar Tagen ist eine neue Firmware für den Raspberry Pi erschienen. Wie kann die installiert werden? Wie kann die installierte Version angezeigt werden?
Am einfachsten benutzt man den update Befehl sudo rpi-update mit dem Hexxeh updater. Wenn es eine neue Firmware gibt, wird die in ein paar Minuten installiert. Wenn die Firmware schon aktuell ist, wird auch eine Meldung ausgegeben.
So läuft der Updateprozess:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
sudo rpi-update *** Raspberry Pi firmware updater by Hexxeh, enhanced by AndrewS and Dom *** Performing self-update % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 7635 100 7635 0 0 26509 0 --:--:-- --:--:-- --:--:-- 27967 *** Relaunching after update *** Raspberry Pi firmware updater by Hexxeh, enhanced by AndrewS and Dom *** Downloading specific firmware revision (this will take a few minutes) % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 168 0 168 0 0 291 0 --:--:-- --:--:-- --:--:-- 298 100 22.9M 100 22.9M 0 0 295k 0 0:01:19 0:01:19 --:--:-- 1153k *** Updating firmware *** Updating kernel modules *** depmod 3.12.30+ *** Updating VideoCore libraries *** Using HardFP libraries *** Updating SDK *** Running ldconfig *** Storing current firmware revision *** Deleting downloaded files *** Syncing changes to disk *** If no errors appeared, your firmware was successfully updated to 11bfdffaca95e630b1fed0a8992fee880c17c26d *** A reboot is needed to activate the new firmware |
Wie oben steht, ist nun noch ein sudo reboot nötig und die neue Firmware ist aktualisiert.
Ist die Firmware schon aktuell, gib es folgende Meldung:
|
1 2 3 4 5 6 7 8 9 |
sudo rpi-update *** Raspberry Pi firmware updater by Hexxeh, enhanced by AndrewS and Dom *** Performing self-update % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 7635 100 7635 0 0 21159 0 --:--:-- --:--:-- --:--:-- 21876 *** Relaunching after update *** Raspberry Pi firmware updater by Hexxeh, enhanced by AndrewS and Dom *** Your firmware is already up to date |
Aber wie kann nun die aktuelle Version angezeigt werden?
Mit
|
1 |
uname -a |
Ergebnis:
|
1 |
Linux pi-entw 3.12.30+ #717 PREEMPT Fri Oct 17 18:46:31 BST 2014 armv6l GNU/Linux |
Oder auch mit mehr Details:
|
1 |
/opt/vc/bin/vcgencmd version |
Ergebnis:
|
1 2 3 |
Oct 17 2014 17:56:05 Copyright (c) 2012 Broadcom version 845092531e360acd37f2f1964157f8079c77edfb (clean) (release) |
Dabei ist der lange Sting hinter Version der Hashwert der Version.
Sollte der rpi-updater nicht vorhanden sein, kann er leicht wie auch hier beschrieben mit
|
1 |
sudo apt-get install rpi-update |
installiert werden. Er wird dann diese Abhängigkeiten, wie in dieser Mindmap verwenden:

Die aktuellste Firmware gibt es auf Github. Dort gibt es auch die Beschreibung, was es neu gibt. Zitat:“
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
kernel: Bump to 3.12.30 kernel: bcm2708: Eliminate i2s debugfs directory error Qualify the two regmap ranges uses by bcm2708-i2s ('-i2s' and '-clk') to avoid the name clash when registering debugfs entries. kernel: Improve __copy_to_user and __copy_from_user performance Provide a __copy_from_user that uses memcpy. On BCM2708, use optimised memcpy/memmove/memcmp/memset implementations. kernel: bcm2708-dmaengine: nobble peak throughput to prevend SD host lockups Artificially throttling DMA throughput to/from the SD host prevents errors seen on very high-spec UHS-1 cards.See: http://www.raspberrypi.org/forums/viewtopic.php?f=63&t=5057&start=275#p626694 firmware: dpi: Add options to alter dpi settings through dpi_output_format See: http://www.raspberrypi.org/forums/viewtopic.php?f=100&t=86658&p=628061#p628061 firmware: arm_loader: Avoid gpioman spam when POWER_LOW is not defined" |
Raspberry Pi BPMN 2.0 update Prozess Diagramm als Grafik exportieren
Dieser BPMN 2.0 Prozess wurde mit Eclipse modeliert und dann als Grafik exportiert.

Diese BPMN 2.0 Diagramme können auch leicht als Grafik exportiert werden. Dazu in dem Diagramm mit rechts klick und dann im Kontexmenü auf „Export Diagram…“.

Es öffnet sich dann der Export Dialog, dort können nun im BMP, GIF, JPG, PNG oder RLE Format die BPMN 2.0 Diagramme exportiert werden.

Raspberry Pi: Karotz liest über Fhem das Betreff eintreffende E-Mails (IMAP) vor
Es währe doch toll, wenn man bei eintreffender E-Mail benachrichtigt würde oder?
So braucht man nicht immer die 148 Mails checken, und kann die Welt retten.
In diesem Projekt, beschreibe ich wie das Betreff jeder eintreffende E-Mail per Sprachausgabe ausgegeben wird. Dazu wird der Karotz benutzt, der nicht nur für Sprachausgabe nützlich ist.
Zuerst das System aktuallisieren und die nötigen cpan Packages installieren:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
sudo apt-get update sudo apt-get upgrade sudo cpan install Mail::IMAPClient # bei Nachfrage mit ja antworten: # yes # bei der nächsten Nachfage mit return bestätigen # local::lib # ... Stunden später ... sudo cpan install IO::Socket::SSL sudo cpan install IO::Socket::INET # und optional damit Umlaute auch dargestellt werden sudo cpan install MIME::Parser # und optional GnuPG wenn nur signierte E-Mails gelesen werden sollen sudo cpan install Mail::GnuPG |
Folgende Zeile in der Datei fhem.cfg ergänzen:
|
1 |
define name mailcheck host user password |
z.B. der IMAP von Strato:
define mailcheck mailcheck imap.strato.de e-mail-von@wenzlaff.de passwort
Nach einem restart von Fhem steht die letzte Betreffzeilen der E-Mails als Reading bereit. So sieht es dann in Fhem aus:

Jetzt fehlt noch den Subject als userReadings zu setze und eine notify Funktion in der fhem.cfg die das Subject liest und an eine Funktion übergibt. Diese Funktion macht die Sprachausgabe des Karotz und wurde an anderer stelle hier im Blog beschrieben.
|
1 2 3 4 5 6 7 8 |
# Folgende events werden generiert # # 2014-10-11 19:13:02 mailcheck mailcheck Subject: Ohne Umlaute # define mailcheckAnsage notify mailcheck:Subject.* {\ my $betreff=ReadingsVal("mailcheck", "Subject", "E-Mail ohne Betreff");;\ Set_Karotz_Nachricht('karotz-token',"$betreff");;\ } |
Nach einem reread von Fhem, wird jetzt jedesmal das Betreff von Karotz angesagt.
Mögliche Fehler:
1. Wenn dieser Fehler im Log steht, wurden die obigen cpan Packages nicht oder nicht richtig installiert:
|
1 2 3 4 5 6 |
2014.10.11 15:58:46 1: reload: Error:Modul 32_mailcheck deactivated: Can't locate Mail/IMAPClient.pm in @INC (@INC contains: /etc/perl /usr/local/lib/perl/5.14.2 /usr/local/share/perl/5.14.2 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.14 /usr/share/perl/5.14 /usr/local/lib/site_perl . ./FHEM ./FHEM/lib) at ./FHEM/32_mailcheck.pm line 11, <> line 85. BEGIN failed--compilation aborted at ./FHEM/32_mailcheck.pm line 11, <> line 85. 2014.10.11 15:58:46 0: Can't locate Mail/IMAPClient.pm in @INC (@INC contains: /etc/perl /usr/local/lib/perl/5.14.2 /usr/local/share/perl/5.14.2 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.14 /usr/share/perl/5.14 /usr/local/lib/site_perl . ./FHEM ./FHEM/lib) at ./FHEM/32_mailcheck.pm line 11, <> line 85. BEGIN failed--compilation aborted at ./FHEM/32_mailcheck.pm line 11, <> line 85. |
2. Wenn der MIME::Parser nicht installiert ist, wird aus diesem Betreff:
mit üüüüääää dann
Wenn der MIME Parser aber installiert wurde, und Fhem restartet wurde, klappt es auch mit den Umlauten:
3. Fhem aktualisieren.
Habe festgestellt, das Fhem mit einem update nicht mehr die Scripte autom. aktualisiert. Mit einem update force hat es nach ein paar Fehlermeldungen wieder geklappt. Es waren an einigen Dateien nicht mehr die nötigen Userrechte gesetzt.
Raspberry Pi: Kismet ( قسمة ) installieren unter Debian (jessie)
Wie wird Kismet auf dem Raspberry Pi installiert? Zuerst mal eine Mindmap als Überblick zu Kismet:
Kismet wird wie folgt installiert, nachdem das System upgedated wurde:
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install kismet
„Raspberry Pi: Kismet ( قسمة ) installieren unter Debian (jessie)“ weiterlesen
Top 4 Mindmap zum Thema Test-Tools
Wie kann die Demo-Anwendung von OpenHab auf dem Raspberry Pi erweitert und von einem iPad bzw. iPhone aufgerufen werden?
In diesem Blog Beitrag habe ich beschrieben, wie OpenHab auf den rPi eingerichtet wird. Nun wollen wir analog zur Demo-Anwendung eine eigene Haus-Anwendung schreiben bzw. erstellen und sie nach und nach erweitern.
So sieht die Demo-Anwendung aus:

Die Demo-Anwendung wird wesentlich in zwei Dateien bearbeitet die man sich mal anschauen sollte:
1. /configuration/items/demo.items
2. /configuration/sitemap/demo.sitemap
„Wie kann die Demo-Anwendung von OpenHab auf dem Raspberry Pi erweitert und von einem iPad bzw. iPhone aufgerufen werden?“ weiterlesen
Wie kann OpenHab und eine Demo-Anwendung auf einem Raspberry Pi (Debian) installiert werden?
Wie kann OpenHab und eine Demo-Anwendung auf einem Raspberry Pi (Debian) installiert werden?
OpenHab läuft auch auf einem Raspberry Pi. Auf Wikipedia gibt es einen kurzen Überblick zu OpenHab.
Um erste Erfahrungen mit OpenHab zu machen, kann man die Demo Anwendung von OpenHab installieren. Als Basis dient die aktuelle Debian 7.6 Version, auf der schon Java installiert ist.
1. Zuerst checken ob Java installiert ist und läuft mit:
|
1 |
java -version |
Ausgabe:
|
1 2 3 |
java version "1.8.0" Java(TM) SE Runtime Environment (build 1.8.0-b132) Java HotSpot(TM) Client VM (build 25.0-b70, mixed mode) |
2.Verzeichnis anlegen
|
1 2 |
mkdir OpenHab cd OpenHab |
3. Von hier die https://openhab.ci.cloudbees.com/job/openHAB/
die aktuelle Version 1.6.0 laden und auspacken (erst die runtime und später die demo)
|
1 2 3 4 5 6 7 |
wget https://openhab.ci.cloudbees.com/job/openHAB/lastSuccessfulBuild/artifact/distribution/target/distribution-1.6.0-SNAPSHOT-runtime.zip # Archiv auspacken unzip distribution-1.6.0-SNAPSHOT-runtime.zip # Optional: Archiv löschen rm distribution-1.6.0-SNAPSHOT-runtime.zip |
4. Usermod für User pi setzen und default openhab.cfg erstellen
|
1 2 3 4 5 6 |
sudo usermod -a -G dialout pi # Konfigdatei erstellen, alle default Einstellungen cd /configurations cp openhab_default.cfg openhab.cfg cd .. |
5. Demo zip laden uns auspacken (eine Readme Datei wird evl. überschrieben)
|
1 2 3 4 5 6 7 |
wget https://openhab.ci.cloudbees.com/job/openHAB/lastSuccessfulBuild/artifact/distribution/target/distribution-1.6.0-SNAPSHOT-demo.zip # Demo Anwendung auspacken unzip distribution-1.6.0-SNAPSHOT-demo.zip # Optional: Archive löschen rm distribution-1.6.0-SNAPSHOT-demo.zip |
6. Starten von OpenHab und im Browser aufrufen (ip anpassen)
|
1 |
./start.sh |
Dann im Browser die folgende URL der Demo Anwendung aufrufen:
|
1 |
http://raspberry-ip:8080/openhab.app?sitemap=demo |
Hier nun einige Fotos, von der Demoanwendung:

Wie nutzt Ihr OpenHab?
Sicherheitsupdate für das Raspberry Pi wheezy Package APT erschienen
Mittels APT (Advanced Packaging Tool) ist es sehr einfach, Programmpakete zu suchen, zu installieren oder auch das ganze System auf den neuesten Stand zu bringen. Für dieses Tool gibt es nun ein Sicherheitspatch der installiert werden sollte.
Zitat: „It was discovered that APT, the high level package manager, does not
properly invalidate unauthenticated data (CVE-2014-0488), performs
incorrect verification of 304 replies (CVE-2014-0487), does not perform
the checksum check when the Acquire::GzipIndexes option is used
(CVE-2014-0489) and does not properly perform validation for binary
packages downloaded by the apt-get download command (CVE-2014-0490).
For the stable distribution (wheezy), these problems have been fixed in
version 0.9.7.9+deb7u3.
For the unstable distribution (sid), these problems have been fixed in
version 1.0.9.“
Bei der Gelegenheit gleich alles updaten mit: „Sicherheitsupdate für das Raspberry Pi wheezy Package APT erschienen“ weiterlesen
Wie kann Mathematica bzw. Wolfram vom Raspberry Pi Modell B+ entfernt werden, um ca. 500 MB Speicher freizugeben?
In dem guten Artikel von Michael Kofler wird in Kurzform ein schöner Überblick über das für private Nutzung kostenlose Wolfram gegeben. Das mit allen Raspberry Pi ausgelieferte Wolfram, nimmt nur sehr viel Platz auf der Karte ein, ca. 500 MB.
Kein Wunder bei diesen Abhängigkeiten:

Bevor es gelöscht wird, muss aber noch einmal schnell ein „Hallo Welt“ programmiert und ausgeführt werden. „Wie kann Mathematica bzw. Wolfram vom Raspberry Pi Modell B+ entfernt werden, um ca. 500 MB Speicher freizugeben?“ weiterlesen
IBM InfoSphere DataStage Essentials V8.7 – Mindmap – Seminar
Was habe ich letzte Woche in Hamburg gemacht?
Ein DataStage Seminar von IBM. „IBM InfoSphere DataStage Essentials V8.7 – Mindmap – Seminar“ weiterlesen
Wie kann das klassische Tool, nmap Version 6.46 zum Analysieren eines LANs (und auch WLANs) auf einem Raspberry Pi installiert werden?
Habe schon in einigen Beiträgen von nmap berichtet. Heute wird die Installation und erste Befehle für den Raspberry Pi beschrieben.
Die Aktuelle nmap Version 6.46 braucht nicht aus den Sourcen compiliert werden, da es für den rPi fertige Packages gibt (Update: 26.07.2018: aktuell 7.4. obwohl es schon eine 7.7. gibt, aber noch nicht für den PI)
Also erst das System auf den aktuellen Stand bringen und nmap installieren:
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install nmap
Nach ein paar Minuten ist nmap installiert. Erster Test, ausgabe der nmap Version:
nmap -version
So, jetzt den ersten Scann aller vorhandenen Adressen, aber nur auf eigene Netzwerke wie hier beschrieben:
nmap -sP 192.168.2.0/24
Schon werden alle 256 IP Adressen in 8 Sekunden gescannt:
Host is up.
nmap done: 256 IP addresses (15 hosts up) scanned in 8.41 seconds
Oder alle offenen Ports anzeigen mit:
nmap localhost
Oder wenn man das Ziel Betriebssystem ermitteln will, das dauert aber etwas:
nmap -O -v localhost
Manchmal braucht man eine Liste aller Hosts im Netzwerk, das geht so:
nmap -sn 192.168.2.0/24
Eine sehr ausführliche deutsche Beschreibung gibt es unter
man nmap
Welche Befehle findet ihr noch nützlich?
Wie kann Eclipse 4.4 Luna installiert werden, das soeben erschienen ist und meine TOP 7 Plugins?
Hallo,
soeben ist Eclipse 4.4 Luna erschienen.

Auf die Download-Seite gehen und installieren.
Folgende Plugins sind noch für mich nötig:
CommentTemplate
Wie in Blogeintrag installieren.
Dieses Jar den Classpath hinzufügen:


Subversion – SVN Team Provider 2.0
Grep Console 3.6
Wie hier beschrieben installieren.

Workspacemechanic
Wie hier beschrieben installieren.

Start Explorer
Wie hier beschrieben installieren.

UML Diagramme erstellen mit ObjectAid
Wie hier beschrieben installieren.

BPMN 2.0 Modeler
Wie hier beschrieben einfach die Kepler Update URL nehmen, die „geht“ auch mit Luna:
http://camunda.org/release/camunda-modeler/update-sites/kepler/latest/site/ die geht, habe es eben mit einem Diagramm validiert:


Welche Plugins sind für Euch essentiell? Bitte als Kommentar.
Java Number Uno 2014 Mindmap
Wie kann die aktuellste Node.js v0.10.29 auf einem Raspberry Pi (Version Jessie) installiert werden?
Wer die neue Node.js v0.10.29 braucht, muss sie selbst compilieren, oder etwas warten bis die binaries hier auch vorhanden sind.
Dazu erst mal das System aktualisieren.
sudo apt-get update && sudo apt-get upgrade
Dann noch die neueste Firmware installieren mit:
Ein reboot ist noch nötig:
sudo reboot
Jetzt kann es losgehen mit der Installation der nötigen Pakete (ca. 84 MB):
sudo apt-get install git-core build-essential python libssl-dev nano screen
Nun das Node.js Repo nach /opt clonen und die aktuellste Version auschecken:
cd /opt
sudo git clone https://github.com/joyent/node.git
cd node
Ergebnis:

Nun die gewünschte Version auschecken mit:
sudo git checkout v0.10.29
Ergebnis:
Nun starten wir das Tool screen mit:
screen
damit beim beenden der SSH Session, der Prozess weiter läuft.
Und nun compilieren wir wie in https://github.com/joyent/node beschrieben mit:
sudo ./configure
sudo make
sudo make install
Das dauert dann so ca. 2-4 Stunden.
Wir können das Terminal Fenster schließen und mit
screen -r
wieder jederzeit die Session aufnehmen.
Nun noch den Pfad in der ~/.profile Datei ergänzen mit:
nano ~/.profile
export PATH=$PATH:/opt/node
Checken ob node installiert wurde mit
node --version
Ergebnis:
Oder das Testportfolio mit 601 Test ausführen (Laufzeit bei mir 22 Minuten) mit:
sudo make test
Ein Fehler, das ist nicht so schlimmm 😉 Rest läuft ja.
Dann evl. noch die Dokumentation erstellen, mit
sudo make doc
nach ein paar Minuten kann z.B. mit
man doc/node.1
Oder ein kleines Hallo Welt Beispiel. Die node Konsole aufrufen mit node und console.log("Hallo Welt") eingeben:
Nun viel Spaß mit Node.js.
Grunt Mindmap
Wie kann grunt via npm und node.js auf OSX 10.9 Mavericks mit Port installiert werden?
Wer den Taskrunner Grunt installieren will, um vieles zu automatisieren, muss nur node.js und npm installieren. Also hier eine Anleitung in 3 Schritten:
Node.js
Wer eine Serverseitige Plattform zum Betrieb von Netzwerkanwendungen wie Webserver benötigt, ist bei Node.js richtig. Mit Node.js kann man mit ein paar Zeilen JavaScript einen Webserver schreiben.
Es gibt mehrere Methoden http://nodejs.org/ zu installieren. Über download oder auch über Port.
Die Installation über Port, ist in ein paar Minuten erledigt, einfach
sudo port install nodejs
auf der Konsole eingeben.
Dann …
… nach ein paar Sekunden.
Checken ob node läuft, mit Eingabe eines kleinen JavaScript Testprogramms mit node auf der Konsole:

Hier ein Überblick zu Node.js in einer Mindmap:
NPM
Dann installieren wir noch den Paketmanager npm mit
sudo port install npm
damit wir Zugriff auf derzeit 78 819 Pakete haben.
Checken ob alles richtig installiert wurde geht mit:
npm -version
bei mir wird nun die Version 1.4.14 ausgegeben.
Oder mit npm search grunt-cli nach grunt-cli suchen. Der erste Aufruf dauert etwas, da noch ein Index erstellt wird. Dann wird aber ungefähr so was ausgegeben:

Grunt
Jetzt noch Grunt installieren.
Das können wir mit dem npm wie folgt ausführen:
sudo npm install -g grunt-cli
sudo npm install -g grunt-init
sudo npm install grunt --save-dev
sudo npm install easyimage
sudo npm upgrade
Ergebnis:

Und wieder checken ob grunt läuft mit:
grunt -version
Ausgabe:
grunt-cli v0.1.13

























