Planet Metax - Weblog-Einträge http://planetmetax:9009/blog/ Einträge im Weblog von Planet Metax de-de Christian Simon Planet Metax Engine '15 1 Dec 2024 19:58:10 GMT Java Webentwickler in Würzburg gesucht http://planetmetax:9009/blog/java-webentwickler-gesucht/

illucIT Software

Wir suchen bei illucIT Software nach interessierten Java-Entwicklern (m/w) mit Erfahrung in der Web-Programmierung und Spaß an der Arbeit.

Du kennst den Unterschied zwischen einem diff und einem div? Du weißt was eine Kommandozeile ist? Dann bist du bei uns genau richtig!

Wir bieten:

  • Interessante Projekte
  • Junges, engagiertes Team
  • Flache Hierarchien
  • Neue Technologien und Ausstattung
  • Lockere Atmosphäre
  • Lage mitten in der Innenstadt von Würzburg

Weitere Infos und Link zur Bewerbung findest du hier:

>> Stellenanzeige bei illucIT Software

]]>
19 May 2016 22:52:30 GMT http://planetmetax:9009/blog/java-webentwickler-gesucht/
Scala Entwicklungsumgebung aufsetzen http://planetmetax:9009/blog/scala-entwicklungsumgebung-aufsetzen/

Ich möchte in nächster Zeit hier einige über die funktionale Programmiersprache Scala schreiben. Um darin entwickeln zu können, muss aber zunächst die “Toolchain” aufgesetzt werden, inklusive JRE (Java Laufzeitumgebung), SBT (Scala Build Tool) und Integration in einer IDE (hier: Eclipse).

In diesem kurzen Tutorial möchte ich daher kurz beschreiben, wie man alle notwendige Software installiert, um mit der Scala-Programmierung loslegen zu können.

]]>
25 Jan 2016 17:00:00 GMT http://planetmetax:9009/blog/scala-entwicklungsumgebung-aufsetzen/
Reboot 2015 http://planetmetax:9009/blog/reboot-2015/ Nach einigen Jahren Pause möchte ich nun mein Blog wieder neu aufsetzen.

Es ist einiges passiert in der Zwischenzeit: Ich bin nun schon seit längerem Fertig mit dem Studium und habe vor ca 2,5 Jahren zusammen mit 2 Kollegen vom Lehrstuhl das Softwareunternehmen illucIT Software gegründet (Schaut doch mal bei uns vorbei!)

Ich beschäftige mich immer noch mit Java, aber nun auch viel stärker mit Scala und mit neueren Frontend-Technologien wie Angular.js und Socket.io.

Passend zum Neustart gibt es nun auch eine neue Blog-Software, die komplett in Scala (mit dem Play-Framework) geschrieben ist und die ich im Gegensatz zur letzten Variante direkt auf GitHub veröffentlicht habe.

Ich habe mich außerdem entschieden, Kommentare vorerst gar nicht mehr zuzulassen, da ich in den vergangenen Jahren die Erfahrung gemacht habe, dass (bis auf ganz wenige ernst gemeinten Kommentare) fast nur Spam in riesiger Menge auf mich eingeprasselt ist.
Außerdem kann ich mir dann die ganzen Sachen sparen, wie Capchas, Validierung, Cookies, EU-Datenschutzregelungen etc.

Mein Plan ist es, jetzt wieder in regelmäßigen Abständen Tutorials, HowTos und Artikel zu Java, Scala und anderen Programmierthemen zu bringen und auch ab und zu wieder auf sonstige Themen hinzuweisen, die ich wichtig finde.

Die meisten alten Artikel habe ich in den neuen Blog übernommen, sofern ich sie noch relevant finde, und sofern dies von der Technik möglich war. Code-Beispiele sind nun vor allem auf meiner GitHub-Page zu finden.

]]>
29 Dec 2015 15:32:21 GMT http://planetmetax:9009/blog/reboot-2015/
Scala-Kurs auf Coursera http://planetmetax:9009/blog/scala-kurs-auf-coursera/

Scala-Kurs auf Coursera

Ich habe kürzlich die Gelegenheit genutzt, an einem Online-Kurs für die Programmiersprache Scala auf der Plattform Coursera teilzunhemen. Der Kurs wurde gehalten von dem Computerwissenschaftler Martin Odersky, dem “Erfinder” von Scala, der außerdem eine wichtige Rolle bei der Entwicklung von Java gespielt hat.

Zunächst kurz etwas zu Coursera. Coursera ist ein Plattform für E-Learning, bei der verschiedene Universitäten der ganzen Welt frei zugängliche Online-Kurse anbieten. Die Spanne an Fachbereichen ist sehr groß; man findet interessante Kurse aus Informatik, Mathematik, Medizin, Jura, Geschichte, Biologie, Wirtschaftslehre und vielen mehr.

Die Plattform bietet die Möglichkeit, wöchentlich Lehrvideos der Dozenten zu den jeweiligen Kursen anzusehen und heruterzuladen, sowie Übungsaufgaben zu den Lehrinhalten zu bearbeiten und die Ergebnisse hochzuladen (natürlich nicht mit persönlicher, sondern maschineller Rückmeldung). Außerdem gibt es Foren, in denen die Studenten untereinander oder mit den Dozenten über die Lehrinhalte und Übungsaufgabene sprechen können. Ein so genannter “Honor Code” unter den Studenten ruft dazu auf, keine Lösungen zu Übungsaufgaben öffentlich zu machen, um andere Studenten nicht zu “spoilern”.

Insgesamt als eine sehr gelungene und angenehme Plattform für E-Learning, die ich nur empfehlen kann!

Zu Scala muss man erklären, dass es sich hierbei um eine funktionale Programmiersprachen handelt. Das heißt, die Sprache verwendet nicht das klassische imperative/objektorientierte Programmierparadigma, wie man es von Java oder C++ gewohnt ist, sondern bietet dem Programmierer die Möglichkeit, seine Ziele über andere Programmierkonzepte zu erreichen.

Das wichtigste an der funktionalen Programmierung von Scala ist das Konzept, möglichst alle Programmlogik als mathematische Funktionen aufzufassen, also:

  • Es gibt keine (kaum) globalen Variablen
  • Das Ergebnis einer Funktion hängt nur von ihren Parametern ab, nicht vom aktuellen Zustand des restlichen Programms
  • Jede Funktion ist im wesentlichen ein Ausdruck, der den Rückgabewert aus den Parametern berechnet
  • Komplexere Berechnung werden nicht durch Kontrollstrukturen (for/while) und iterative Rechenschritte durchgeführt, sondern durch Rekursion und Hilfsfunktionen
  • Alle Daten sind immutable (unveränderlich), das heißt, ein Funktionsausruf ändert die Eingabewerte nie, sondern agiert nur durch seinen Rückgabewert (was Methoden mit Rückgabetyp “void” sinnlos macht)
  • Funktionen sind Objekte. Es kann also Funktionen geben, die andere Funktionen als Parameter übergeben bekommen (sog. “Funktoren” oder Funktionen höherer Ordnung)
  • Es gibt Ausdrücke, die nicht zur Definitionszeit ausgewertet werden, sondern erst zur Zeit, wo ihr Wert abgefragt wird (um Berechnungszeit bei ungenutzten Werten zu sparen)

Dieses Konzept ist für einen Programmierer, der immer nur imperativ/objektorientiert programmiert hat, nicht leicht zu verinnerlichen, aber es bietet eine Reihe von Vorteilen:

  • Einfaches Aufteilen von Berechnungen auf mehrere Kerne/Prozessoren/Computer, da es keine globalen Stati gibt, die synchron gehalten werden müssen. Es kann also eine hohe Parallelisierungsfähigkeit erreicht werden, falls sich das Problem in parallel ausführbare Teilprobleme zerlegen lässt
  • Bei geschickter Programmieung hohe Performanz
  • Leichtes Realisieren einfacher mathematischer Probleme möglich, die bei imperativer Programmierung umständlich umzusetzen wären
  • Erlaubt Einsatz von Funktionen höherer Ordnung, was bei Sprachen wie Java nur schwer umgesetzt werden kann (siehe Event-Handler, oder Callback-Klassen)

Soviel zunächst zum funktionalen Programmierparadigma. Scala selbst hat noch einige Spezialitäten. Zum einen ist da die große Nähe zur Sprache Java: Scala-Code wird in das gleich Bytecode Format kompiliert wie Java. Daher lassen sich Scala-Programme und -Module direkt in Java einbinden und verwenden. Zudem wird es dadurch ebenso Plattformunabhängig wie es Java ist.

Es gibt außerdem ein schönes Plugin für die Eclipse-IDE, welches die Verwendung von Scala in die IDE einbindet.

Zuletzt möchte ich noch einige Wort zum Kurs von Martin Odersky verlieren. Man merkt, dass der Dozent sich große Mühe gibt, “seine” Programmiersprache gut rüberzubringen und den Studenten das Konzept der funktionalen Programmierung zu vermitteln.

Die Programmierbeispiele beginnen ganz von vorne bei “Hello World” (was sich in Scala durchaus schon deutlich von Java unterscheidet) und arbeitet sich langsam, aber stetig in die verschiedenen Konzepte von Scala ein.

Es sind wöchentliche Übungsaufgaben fällig, die als Eclipse-Projekt heruntergeladen werden können und bereits mit einem Code-Grundgerüst und verschiedenen JUnit-Testklassen ausgestattet sind. Die Stundenten müssen meist einige zentrale Funktionen des Übungsprogrammes implementieren und damit die neu gelernte Inhaltes des Kurses anwenden. Wurden die Aufgaben gelöst, können die Lösungen über ein Tool auf den Coursera-Server hochgeladen werden, wo sie automatisch korrigiert und mit bei zu 10 Punkten bewertet werden.

Die Übungsaufgaben beinhalten zwar oft nur wenige Zeilen Code, die geschrieben werden müssen, doch das funktionale Programmieren erfordert - gerade bei den fortgeschrittenen Aufgaben - ein genaues Nachdanken und bringt auch schon mal gestandene Java-Programmierer ins Schwitzen. Letztendlich sind aber alle Aufgaben mit etwas Nachdenken zu lösen und bringen oft den “Aha”-Effekt, wenn man die Lösung endlich gefunden hat.

Der Kurs ist zwar schon zuende, aber so wie ich das verstanden habe, werden die Kurse auf Coursera regelmäßig wiederholt.

Wer also Interessan funktionaler Programmierung hat, dem kann ich eine absolute Empfehlung für den Kurs aussprechen!

]]>
25 Nov 2012 12:42:21 GMT http://planetmetax:9009/blog/scala-kurs-auf-coursera/
Ein paar Podcast-Empfehlungen http://planetmetax:9009/blog/ein-paar-podcast-empfehlungen/ Seit ich ein entsprechendes Abspielgerät habe, nutze ich die Wartezeit während Zugfahrten und Ähnlichem meist für Podcasts.

Hier möchte ich eine kleine Auswahl meiner meistgehörten Sendungen vorstellen. Obwohl das bei einigen wohl nicht nötig ist, weil sie sowieso zu den meistgehörten deutschen Podcasts zählen.

Wer redet, ist nicht tot (WRINT)

WRINT ist ein weitere Podcast mit Holgi, der ja auch als Radiomoderator bei Radio Fritz arbeitet. In diesem Podcast ruft Holgi verschiedene Leute an, die sich vorher beworben haben, und macht quasi ein Radiointerview mit diesen Leuten über ein Thema mit dem sie sich besonders gut auskennen oder in dem sie Erfahrung haben.
Die meisten Themen sind schon sehr interessant und Holgi hat eigentlich immer coole Leute an der Strippe. Sehr zu empfehlen.

http://www.wrint.de

Not Safe For Work (NSFW)

NSFW ist die “völlig neuartige, reaktionäre Unterhaltungsgala” mit den feinen Herren Tim Pritlove (@timpritlove) und Holger Klein (@holgi). Man kann Tim und Holgi dabei mehrere Stunden lang dabei zuhören, wie sie über den Kunstgehalt diverser Filme streiten, verrückte Youtube-Videos anspielen, aktuellen Blödsinn im Netz und in Deutschland kommentieren, Geschenke auspacken und die beinhalteten Nahrungsmittel verkonsumieren oder sich über unanständige Themen amüsieren.

Update: Leider mittlerweile abgesetzt, es gibt nur ganz selten (ca. 1x/Jahr) noch eine Sondersendung

http://not-safe-for-work.de

Logbuch: Netzpolitik

Logbuch: Netzpolitik ist ein Podcast von Tim Pritlove und Linus Neuman, in dem es - wie der Name schon vermuten lässt - um netzpolitische Themen geht. Linus schreibt unter anderem für das bekannte deutsche Blog netzpolitik.org. Zusammen bringen die beiden immer wieder einen Überblick über aktuelle Ereignisse, Debatten und Gesetzesänderungen in diesem Bereich.

http://logbuch-netzpolitik.de

Alternativlos

Inspiriert durch das Mantra der “Alternativlosigkeit” aller Beschlüsse der Bundesregierung, ist Alternativlos ein Podcast von Fefe (blog.fefe.de) und Frank Rieger (frank.geekheim.de) vom CCC, in dem die beiden in extrem gut recherchierter Weise in unregelmäßigen Abständen politische Themen auseinandernehmen.
Ab und zu sind auch Spezialisten zum Thema eingeladen, was die Sendungen noch gehaltvoller macht. Sehr zu empfehlen!

http://alternativlos.org

]]>
18 Mar 2012 18:34:19 GMT http://planetmetax:9009/blog/ein-paar-podcast-empfehlungen/
Caches entwerfen mit Java http://planetmetax:9009/blog/caches-entwerfen-mit-java/

Ich habe bei meinen aktuellen Java Web-Applikationen oft mit der Situation zu tun, dass verschiedene Handler der Applikation auf einen gemeinsamen Pool von Daten lesend (und manchmal auch schreibend) zugreifen müssen.

Das einfache Vorgehen, dass ich auch zu meinen PHP-Zeiten gewohnt war, ist es, eine Datenverbindung (soll heißen: eine offene MySQL-Verbindung) zu errichten oder aufrechtzuerhalten, und diese an alle Handler weiterzugeben, so dass diese die benötigten Daten unmittelbar aus der Datenbank lesen und Änderungen direkt in die Datenbank zurückschreiben können.

Allgemeine Überlegungen

Dieses “Read-On-Demand”-Verfahren hat aber ein paar häßliche Nachteile, weshalb ich es heute nicht mehr gerne einsetze:

  • Die Daten aus der Datenbank müssen evtl. bei jedem Request neu eingelesen und verarbeitet werden. Das kann bei großen (oder komplizierten) Daten einiges an Verarbeitungszeit kosten
    (Beispielsweise dauert das Neueinlesen der Weblog-Daten aus diesem Blog schon ein paar Sekunden, da erst die enthaltenen Bilder nachgeprüft und verkleinert werden müssen, LaTeX-Formeln verarbeitet werden usw.)
  • Bei einer Änderung der Datenschnittstelle (z.B: Änderung des Tabellenformats in der Datenbank) müssen alle Handler angepasst werden. Dabei kann man leicht eine Abfrage vergessen, die dann zu einem Bug führt.
  • In jeden Handler muss das Lesen und Interpretieren der Daten (inklusive SQL-Abfragen) hineinprogrammiert werden, was den Aufwand zum Entwickeln eines Handlers stark erhöht. Oft ergibt sich dann doppelter Code, weil verschiedene Handler die selben Daten einlesen
  • Bei mehreren gleichzeitigen Abfragen (wobei mindestens eine davon die Daten verändert) können Datenhazards auftreten, also eine Verfälschung der Daten durch eine falsche Verarbeitungsreihenfolge. Dadurch kann auch permanenter Datenverlust auftreten

Um diese Probleme zu umgehen bin ich seit kurzem auf Caches umgestiegen. Unter einem Cache verstehe ich eine gemeinsame Instanz, die den Zugriff auf eine bestimmte Datenmenge der Applikation zur Verfügung stellt:

]]>
16 Dec 2010 12:28:27 GMT http://planetmetax:9009/blog/caches-entwerfen-mit-java/
String-Templates mit Java http://planetmetax:9009/blog/string-templates-mit-java/ Wenn man in Java mit komplexeren Strings arbeiten will, benötigt man oft Funktionen, um das Ergebnis aus einer Vorlage zu erzeugen, indem verschiedene Variablenwerte eingesetzt werden.
Vor allem, um Textdateien in einem bestimmten Format (z.B. CSV oder HTML) zu erzeugen, bei dem die Grundstruktur irgendwo entworfen und abgespeichert werden soll, macht ein Templatesystem für Strings Sinn.

Für die Web-Ausgabe gibt es JSP, um Inhalte in ein Template einzufügen und auszugeben.
Aber für lokale Anwendungen ist mir bisher kein solches System bekannt.
Einfache Sachen lassen sich ja in Java hartkodieren oder mit Suchen-und-Ersetzen-Methoden generieren, aber je komplizierter die Struktur wird, desto mehr Arbeit macht auch die Implementierung.

Um dieses Problem ein für alle Mal zu lösen, habe ich eine Template-Klasse geschrieben, die String-Templates mit folgenden Funktionen repräsentieren:

  • Ersetzen von Variablen
  • Auswählen von If-Then-Else-Verzweigungen
  • Iterieren über Collections (mit Code-Duplikation)
]]>
15 Dec 2010 20:51:38 GMT http://planetmetax:9009/blog/string-templates-mit-java/
Java und XML: Direkte Bindung mit JAXB http://planetmetax:9009/blog/java-und-xml-direkte-bindung-mit-jaxb/

Im Java-Umfeld hat sich die Datenspeicherung mit XML schon weitestgehend zum Standard durchgesetzt. Vor allem viele Konfigurationsdateien (z.B. fast alle Config-Dateien in der Java Servlet Engine „Apache Tomcat“ sind in XML gehalten) sind regelmäßig in XML notiert; aber auch viele andere Datendateien für Java-Programme werden in XML definiert, da sich für dieses Format die Validierung und das Parsing sehr einfach und generisch in Java (und anderen Tools) durchführen lässt.

Eine sehr gängige Methode für das Einlesen (und interne Verwalten) von XML-Daten liegt darin, das XML-Dokument in einen Baum zu transformieren.

Hierbei sind alle Knoten des Dokuments (Elemente, Attribute, Entitäten und CDATA) als Node-Objekt im Speicher repräsentiert, deren Eigenschaften als Membervariablen dieses Node-Objekts gelesen werden können (z.B. Tagname, Typ des Elements, Wert eines Attrubuts, …). Die einzelnen Node-Objekte sind über eine Vater-Söhne-Relation miteinander verbunden.

Das Einlesen eines XML-Dokuments in einen Baum kann mit vielen Java-Toolkits gemacht werden (z.B. mit DOM = Document Object Model)

Eine großer Nachteil bei dieser Methode ist es, dass man in seinem Java-Programm meist selbstständig den Baum durchlaufen und interpretieren muss.
Natürlich kann man mit Hilfsmitteln, wie XPath sehr gut und effektiv Anfragen auf den XML-Baum ausführen, aber den XML-Baum in seine Java-Datenstrukturen umwandeln muss man noch selbst.

Eine andere Möglichkeit, Java mit XML zu vereinen bringt JAXB (Java Architecture for XML Binding).

]]>
18 Nov 2010 13:23:31 GMT http://planetmetax:9009/blog/java-und-xml-direkte-bindung-mit-jaxb/
Shotgun: Massenvernichtung für Prozesse http://planetmetax:9009/blog/shotgun-massenvernichtung-fuer-prozesse/ Bei meiner Arbeit auf Linux-Systemen kommt es ab und zu vor, dass ich einige Prozesse/Deamonen im Hintergrund laufen habe, die entweder defunktional oder von meiner Shell abgekoppelt sind.

Nun möchte man manchmal den Urzustand wieder herstelle und bräuchte so etwas wie “reset” für die ganze Session: also alles bis auf die aktive Shell beenden.

Dabei hat sich für mich mein Script shotgun bewährt: es werden alle laufenden Prozesse des aktuellen Users mit kill -9 abgeschossen (außer der Shell und den Programmen, die shotgun braucht, selbst).

Ist eigentlich ganz simpel, man spart sich dadurch aber manchmal, über htop oder ps aux alle Prozesse des Users von Hand aufzuspüren und zu beenden.

Das Script ist vor allem auch dann nützlich, wenn man die Session beendet hat, und noch irgendwelche Prozesse auf (ansonsten freien) Mounts oder SSH-Verbindungen sitzen, die man sonst nicht schließen kann.

]]>
3 Aug 2010 17:22:28 GMT http://planetmetax:9009/blog/shotgun-massenvernichtung-fuer-prozesse/
Java Reflections: Dynamisches Erstellen von Objekten http://planetmetax:9009/blog/java-reflections-dynamisches-erstellen-von-objekten/ Ich arbeite im Moment an dem interessanten Projekt, einen Traffic-Generator zu schreiben.

Dabei sollen die Zwischenankunftszeiten und Paketgrößen nach wählbaren Verteilungsfunktionen mit frei wählbaren Parametern verteilt sein.

Ich verwende die Java-Bibliothek JSimLib (eine Eigenentwicklung des Lehrstuhls), um Zufallszahlen nach bestimmten Verteilungen zu erhalten.

Da es einige Verteilungsklassen gibt (und diese möglicherweise noch ergänzt werden), und diese Verteilungsklassen unterschiedlich viele Parameter akzeptieren, wird ein Java-Machanismus benötigt, der ein Verteilungsobjekt mit der richtigen Verteilungklasse und den richtigen Parametern aus den Argumenten der Java-Kommandozeilenargumente erstellt.

Hierzu verwende ich die Reflections-Klassen von Java, die es ermöglichen, zur Laufzeit Klassen und Objekte zu untersuchen und zu erstellen.

]]>
12 Jun 2010 09:54:44 GMT http://planetmetax:9009/blog/java-reflections-dynamisches-erstellen-von-objekten/