Archiv der Kategorie: Entwicklung

Mein Beruf und mein Hobby überlappt sich: Die Entwicklung von Software für Computer.

Algorithmen visualisieren

Zur Zeit arbeite ich mich vermehrt in Javascript ein, dort auch in die Visialisierungs-Bibliothek D3 von Mike Bostock. Der Informatiker hat lange für die New York Times aufwendige interaktive Grafiken erstellt, daraus ist diese Bibliothek entstanden. Eine tolle Funktionalität, die aber auch verstanden sein will.

Dabei bin ich über eine sehr schöne Seite gestolpert, wo Bostock an Beispielen für die Visualisierung von Algorithmen zeigt, dass die Qualität der Algorithmen dadurch in vielen Fällen gesteigert werden kann. Schon als Student habe ich ähnlich Demos programmiert, ich errinnere mich noch an einen Bubble- und Quicksort in Assembler auf einem Commodore PET 2001, der direkt auf dem Bildschirmspeicher arbeitet und so die Buchstaben sortierte. Spassig. In Perfektion macht dies allerdings Bostock:

https://bost.ocks.org/mike/algorithms/

Chrome unterstützt ES6 Module

Wer wie ich als Java-Entwickler in die Javascript-Welt eintaucht, vermisst eine vernünftige Gliederung in Module und die Definition von Abhängigkeiten dazwischen. In der alten Javascript-Welt wurden dafür viele Mechanismen geschaffen, deren Gebrauch für den Neuling verwirrend ist. 

Mit EcmaScript 6 (auch EcmaScript 2015) ist eine Definition von Modulen und imports bzw.  exports mit sauberen Sprachmitteln möglich. Ein Beispiel:

<!DOCTYPE html>
<html>
    <head>
        <title>ES6 Module</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <script type="module">
            import {getGreeting} from "./js/greeting.js";
            
            document.getElementById("content").textContent = getGreeting();
        </script>
    </head>
    <body>
        <div id="content">placeholder for content</div>
    </body>
</html>
import * as my from "./mylib.js";

export function getGreeting() {
        return my.addMy("Hello World!");
}
export function addMy(str) {
    return "My " + str;
}

Die gute Nachricht: Moderne Browser wie Chrome (ab Version 61 ohne Flags), Firefox, Safari und Edge (Edge und Firefox allerdings hinter Flags) unterstützen das bereits ohne Zusatzmittel wie Transpiler etc.:

https://medium.com/dev-channel/es6-modules-in-chrome-canary-m60-ba588dfb8ab7

https://caniuse.com/#feat=es6-module

In EcmaScript 6 (synonym ES6 und EcmaScript 2015) sind aber noch viele andere gute Features und syntaktische Erleichterungen enthalten:

http://es6-features.org

JavaScript ist damit eine richtig erwachsene Sprache und wird damit Java immer ähnlicher 😉

PostgreSQL character varying maximum length

Gerade habe ich in einem Projekt eine legacy Datenbank nach Postgres importiert, und bin dabei sie zu analysieren und umzubauen. Dabei sind die Längenangaben bei Feldern vom Typ character varying immer interessant. Hierbei kann man eine Maximallänge des Feldes in Zeichen angeben. Bei vorgegebenen Daten ist die Ausnutzung dieser Länge interessant, also die Frage, wie lang ist die maximal abgespeicherte Zeichenlänge in jedem Feld.

Eine Idee ist dies mit einer PL/pgSQL-Function zu berechnen, nach etwas Tüfteln habe ich sie hingebracht:

CREATE OR REPLACE FUNCTION public.character_varying_length()
  RETURNS TABLE(table_name varchar, column_name varchar, character_maximum_length integer, actual_maximum_length integer) AS $func$
DECLARE
   tbl information_schema.columns.table_name%TYPE;
   col information_schema.columns.column_name%TYPE;
   width information_schema.columns.character_maximum_length%TYPE;
BEGIN
   FOR tbl, col, width IN
      SELECT c.table_name, c.column_name, c.character_maximum_length
      FROM   information_schema.columns c
      WHERE  c.table_schema = 'public' and c.data_type = 'character varying'
      order by c.table_name, c.ordinal_position
   LOOP
      RETURN QUERY EXECUTE format('SELECT %L::varchar, %L::varchar, %s::integer, max(length(%I)) from %I', tbl, col, width, col, tbl);
   END LOOP;
END
$func$  LANGUAGE plpgsql;

Aufgerufen wird dies mit

select * from character_varying_length()

und liefert dann 4 Spalten für alle character varying felder im Schema public:

Screenshot Abfrage

Ergebnis der Abfrage der Funktion

Diese Funktion funktioniert in jeder Postgres-Datenbank, einfach deklarieren und aufrufen wie oben.

Everything a Java Developer Should Know about the JavaScript Landscape

Als altgedienter Java-Programmierer ist mir die schnelle Evolution im Bereich HTML5, CSS3, Single Page Anwendung und Javascript oft suspekt. Was heute noch angesagt ist, ist morgen schon old school. Mit Entwicklung in Apache Wicket, mit dem ich gerne arbeite, bin ich ja auch ein Vertreter des alten serverzentrierten Ansatzes. Trotzdem bleibe ich am Ball und schaue mir die neuen Tendenzen und Hypes an.

Geertjan Wielenga hat auf der JAX London eine gute Präsentation zum Thema gehalten. Auch wenn ich nicht alle seine Tipps sofort akzeptiere (bei Tipp 8 und 9 kriege ich Gänsehaut) oder für richtig halte, sind seine Überlegungen und Empfehlungen sehr wertvoll.

Mercurial Repositories nach Git konvertieren mit fast-export

Schon seit längerem verwalte ich meine Entwicklungsprojekte mit einer verteilten Versionsverwaltung. Habe ich früher Mercurial verwendet, weil es besser unter Windows verfügbar und integriert war, so bin ich inzwischen auf das angesagte Git umgestiegen, das ja vor allem durch die breite Verwendung von github populär ist. Zur Vereinheitlichung will ich alles mit Git verwalten und dazu natürlich die Mercurial-Repositories verlustfrei in Git-Repositories umwandeln. Dies ist gar nicht so schwer, und so will ich dem Netz dazu mal eine deutschsprachige Anleitung dazu reichen.

Diese Anleitung geht Fragen (1, 2) in stackoverflow zurück, wird also von mir hier nur neu präsentiert. Als Werkzeug wird dabei fast-import verwendet, das es unter https://github.com/frej/fast-export gibt und dort auch erklärt ist. Auf meinem Mint Linux (Ubuntu Derivat) lies es sich ganz leicht installieren mit

sudo apt-get install hg-fast-export

Dies holt auch alle nötigen Pakete wie Mercurial etc. nach. Unter Windows habe ich es nicht getestet, da dort meist kein Python vorhanden ist.

Zur Anwendung sei als Illustration ein kleines shell-Script angegeben, das im Verzeichnis über dem Projektverzeichnis mit dessen Namen als Parameter aufgerufen wird. Das alte Projektverzeichnis wird mit der Endung .bak umbenannt und steht nachher als Backup noch zu Verfügung. Nach der Anwendung steht das Verzeichnis wieder unter dem alten Namen, jedoch mit .git Respository, zur Verfügung.

#!/bin/sh
projectdir=$1
[ $# -eq 0 ] && { echo "Usage: $0 subdir_with_hg_project"; exit 1; }
bakdir=$projectdir'.bak'

mv $projectdir $bakdir
git init $projectdir
cd $projectdir
hg-fast-export -r ../$bakdir
git checkout HEAD
# undo last commit, if we had changed files in hg and did commit just for completeness
# git reset HEAD~
# remove old project directory, if not needed any more
# rm -rf ../$bakdir

Es wird dabei ein leeres Verzeichnis mit git init initialisiert und dann das Git Repository durch hg-fast-export mit sukzessiven Commits befüllt. Danach ist es dem Mercurial-Repository gleichwertig. Zu den Dateien kommt man erst mit git checkout HEAD, da diese zuerst nur im Repository hinterlegt sind.

Ist das Mercurial-Verzeichnis noch mit offenen Änderungen versehen, so muss man diese vor dem Übertragen commiten, damit sie mit übertragen werden. Der letzte, eigentlich unerwünschte Commit kann dann mit git reset HEAD~ im Git-Verzeichnis ungeschehen gemacht werden. In der IDE netbeans kann dies auch mit der hervorragenden Git-Integration unter Team > Revert/Recover > Reset mit der Option Modify Working Tree (--mixed) gemacht werden.

Dieter Tremel

6. Juni 2014

Heute habe ich die erste Lektion eines Online-Kurses abgeschlossen:

Oracle Massive Open Online Course: Develop Java Embedded Applications Using a Raspberry Pi May 2014

Der Kurs ist kostenlos und ich habe mich erstmal nur zögerlich angemeldet, weil ich nicht schon wieder eine neue Baustelle haben wollte. Doch die Materie ist recht interessant auch für konkrete Projekte, der Kurs überzeugt gleichzeitig mit hoher Qualität, und ich bin inzwischen sehr angetan bis begeistert.

Der Kurs lehrt anhand eines Beispiels die Entwicklung von Anwendungen mit der neuesten Java Micro Edition (JAVA ME EMBEDDED, JMEE) auf der populären „Volks-Hardware“, dem Raspberry Pi. Da ich auch schon mal ein Projekt in der Sprache C mit einem Atmel AVR gemacht habe, bei dem ich alles von Grund auf gelöst habe, kann ich die Erleichterungen, welche die Kombination JMEE 8 und der Raspberry Pi bietet, gut ermessen.

Weiterlesen

Perl 5.20 erschienen

Die Programmiersprache Perl ist heute in der Version 5.20 erschienen. Diese Sprache teilt die Programmierer in zwei Hälften: Die einen hassen und die anderen lieben sie. Grund ist ihre unkonventionelle Syntax, die es erlaubt, sehr mächtige Ausdrücke sehr kompakt zu notieren. So ist es ein beliebter Sport von Perl-Kennern, Problemstellungen in Foren auch mit ungeheuer ausgefuchsten Einzeilern zu lösen, die dann aber mangels Verständlichkeit nur noch der geneigte Leser versteht. Sehr schön brachte das der amerikanische Programmierveterane Keith Bostic in dem Zitat “Perl – The only language that looks the same before and after RSA encryption zum Ausdruck. Köstlich!

Diese Möglichkeit von Perl, sehr kryptisch zu Programmieren wird aber auch oft überbetont, man kann damit auch vernünftiger und durchaus lesbar arbeiten. Ich mochte Perl, vor allem für kleinere Scripts nutze ich sie auch heute noch, zum Beispiel um METAR Flugwettermeldungen von Webservern zu laden und archivieren.

Beginner’s All-purpose Symbolic Instruction Code

Die Programmiersprache BASIC feiert am 1.5.2014 ihren 50. Geburtstag.

Mit dieser Sprache habe ich, nach ersten Erfahrungen mit programmierbaren Taschenrechnern von Texas Instruments, auch das Programmieren gelernt. Das zeigt wohl, dass ich schon ein paar Jährchen in dem Metier unterwegs bin 😉 BASIC war immer eine Hassliebe:

Geliebt, weil es damals die erste preiswert verfügbare Hochsprache war, Assembler auf Lehrsystemen oder Großrechnerbenutzung war damals die Alternative. Auf Maschinen wie dem Commodore PET 2001 und dann dem C64 war BASIC einer breiteren Schicht von Anwendern, als die anderen Sprachen, verfügbar.

Commodore PET 2001

Commodore PET 2001 computer. On display at the Musée Bolo, EPFL, Lausanne. (Quelle wikipedia)

Ich konnte den PET damals in der Fachoberschule Freising, nach einem Kurs bei Achim Burgermeister, benutzen, und war auf jede Minute dieser gewährten Möglichkeit fast süchtig. Der Hauptspeicher dieser Geräte war 8 Kilobyte groß, eines als Premium-Gerät, war mit 32 KB ausgestattet, damals sehr teuer, und ich konnte mir nicht vorstellen, wie man soviel Speicher mit Daten und Programmen füllen könnte 🙂

Gehasst, weil sie doch auch sehr beschränkt und noch nicht weit entwickelt war und bei größeren Programmen sehr schnell unlesbaren Code produzierte, wenn der Entwickler nicht sehr diszipliniert war. Das waren die Entwickler damals meistens nicht, so dass oft der gefürchtet Spaghetti-Code entstand. So habe auch ich die Sprache C und die damalige Bibel dazu, den sogenannten „Kernighan Richie“ als Befreiung empfunden und gerne damit entwickelt.

Akronyme, wie BASIC (Beginner’s All-purpose Symbolic Instruction Code) sind in der Computerei verbreitet und es gibt viele schöne davon. So viele, dass die Bezeichnung PCMCIA der Personal Computer Memory Card International Association, bekannt für die damals üblich Lapttop-Erweiterungskarten, zu „People Can’t Memorize Computer Industry Acronyms“ (etwa: Niemand kann sich die Akronyme der Computer-Industrie merken) verballhornt wurde. Dieses Zitat fand seinen festen Platz im Sprachschatz von Computerspezialisten.