Archivierung der Wordpress-Seite mit Nikola

Dieser Blog wurde von Wordpress auf Nikola umgezogen, da Wordpress regelmäßig aktualisiert werden muss und sonst eklatante Sicherheitsmängel entstehen. Nikola hingegen generiert eine statische Seite (HTML-Dateien), ist somit wartungsfrei und problemlos überall performant zu hosten.

Zudem wird diese Seite aufgrund meiner englischen Seite, karllorey.com, seit etwa 2015 nicht mehr aktualisiert, was ich hoffentlich durch die Disclaimer deutlich gemacht habe.

Sollten Seiten fehlerhaft sein, freue ich mich über ein Issue auf GitHub oder sogar einen Pull Request.

Die Karlsruher Gründerszene im Überblick - für Gründer, Startups und Entrepreneure

Du hast dich schon immer gefragt, wie man in die Karlsruher Gründerszene kommt? Du willst wissen, welche Events und Anlaufstellen es in Karlsruhe für Startups und Gründer gibt?

Zusammen mit der PionierGarage habe ich heute startup-karlsruhe.de relauncht. Ursprünglich von Andreas Dittes ins Leben gerufen und mittlerweile in die verantwortungsvollen Hände der PionierGarage übergeben, bietet Startup-Karlsruhe einen Überblick über die Karlsruher Gründer- und Startup-Szene. Angefangen von den in Karlsruhe ansässigen Startups, über einen Event-Kalender und eine Erklärung der regelmäßigen Veranstaltungen, bis hin zu einer Liste aller möglichen Anlaufstellen wird alles erklärt, was für einen guten Überblick nötig ist.

Keine Zeit alles durchzulesen? Hier die wichtigsten Details im Überblick:

Startups aus Karlsruhe

Aus der Karlsruher Gründerszene kommen jedes Jahr neue Startups. Insbesondere aus dem Umfeld des KIT entstammen viele der ortsansässigen Startups. Seien es Ausgründungen wie otego oder studentische Gründer wie die Campusjäger oder Busliniensuche. Zu den neueren Startups, übrigens beide aus dem Bereich der PionierGarage, gehören #now und store2be. Während sich #now Twitter-Trends und Hashtags verschrieben hat, bitetet store2be eine Plattform für Aktions- und Verkaufsflächen an.

Die Seite soll einen Überblick darüber geben, was sich gerade im Hinblick auf neue Startups in Karlsruhe tut. So verpasst man nicht und hat immer einen guten Überblick.

Events für Gründer in Karlsruhe

Die Veranstaltungen und Events für Karlsruher Gründer sind genauso zahlreich wie die Startups selbst. Hier ein kleiner Überblick:

  • Gründergrillen Vor dem CIE trifft treffen sich Gründer und Startups in entspannter Atmospähre, um gemeinsam zu Grillen und sich auszutauschen.
  • Meetups Diverse Meetups, vor allem zu technischen Themen, ermöglichen Gründern den Austausch mit Gleichgesinnten oder helfen dabei Techies für die eigene Idee zu begeistern.
  • Boostcamp Einen Tag lang wird intensiv mithilfe von Mentoren aus der Karlsruher Startup-Szene an der eigenen Idee gearbeitet.
  • Venture Fest Einmal im Jahr zeigt das KIT, was es an Innovation zu bieten hat. Es gibt Startup-Wettbewerbe, Vorträge und Workshops.
  • Hackathons Idee im Kopf und Lust den ersten Prototyp zu bauen? Hackathons finden immer wieder statt und ziehen Programmierer aus der ganzen Region an.
  • GROW Die PionierGarage veranstaltet jährlich den Gründungswettbewerb GROW. Hier wird in zehn Wochen die Idee in die Tat umgesetzt – wieder mithilfe erfahrener Mentoren wie Holger Kujath, dem Knuddels-Gründer

Auf der Seite findet man eine vollständige Übersicht über Startup-Veranstaltungen und Events in Karlsruhe.

Startup-Unterstützer und Hilfe für Gründer

Für Unterstützung und Hilfe für Gründer ist in Karlsruhe natürlich auch gesorgt. Für Studenten gibt es allen voran das Center for Interdisciplinary Entrepreneurship. Hier wird studentischen Gründern und Gründungsinteressierten direkt auf dem Campus eine Anlaufstelle bereitgestellt. So ist es jederzeit möglich sich zwischen den Vorlesungen beraten zu lassen. Für die Erstberatung sind keine Voraussetzungen nötig – lediglich genügend Motivation und Gründergeist sollte vorhanden sein.

Auf studentischer Seite ist zudem die PionierGarage zu nennen, deren Vorstand ich im Wintersemester 15/16 war. Sie bietet gründungsinteressierten Studenten eine Anlaufstelle um Mitgründer und anderweitig Startup-Interessierte kennenzulernen. Kern hiervon sind Dienstagstreffen, bei denen entweder ein Gründer zu Besuch kommt, in einem Workshop ein neues Thema besprochen oder in einer kreativen Session an neuen Ideen gearbeitet wird. Außerhalb dieser Dienstagstreffen betreibt die PionierGarage noch das Launchpad, den ersten studentischen Inkubator Deutschlands, der Beratung, erste Büroräume und diverse Event-Formate anbietet.

Natürlich gibt es in Karlsruhe nicht nur Hilfe und Unterstützung für Studenten, aber die ganze Übersicht muss eben noch geschrieben werden und findet sich dann auf der Seite.

Internationale Webseite von Karl Lorey

Anfang des Jahres habe ich mit den Überlegungen begonnen meine Seite wieder etwas aktiver zu betreiben. Dazu war mein Plan zunächst ein Neustart von karllorey.de. Da ich aber zunehmend keinen Vorteil mehr darin sehe auf Deutsch zu schreiben, fiel meine Wahl auf Englisch. Hieran angeknüpft war die Entscheidung damit auch die Domain zu wechseln. Das heißt: Ich, Karl Lorey, bin von nun an unter karllorey.com zu erreichen. Ich hoffe, damit versteht das auch Google. Ich würde mich über Feedback und weitere Anregungen sehr freuen.

Die deutsche Seite: karllorey.de

Die aktuelle de-Domain bleibt noch etwas erhalten, da die Zugriffszahlen nach wie vor täglich im vierstelligen Bereich liegen und damit nach wie vor relativ hoch sind. Insbesondere suchen viele Besucher nach Notfall-SMS mit Tasker und nach 3rd Party Apps für Tasker. Beliebt sind außerdem die Artikel zu komplexen Zahlen in Java sowie das Pflichtenheft in LaTeX. Die Lektüre kann ich jedem Besucher bei Interesse nur ans Herz legen.

Die internationele Seite: karllorey.com

Alle neuen und damit auch aktuellen Artikel sind (auf Englisch) im neuen Blog verfügbar. Die Themen haben sich auch etwas geändert. Während es früher um Android und Lösungen aus dem Studium ging, liegt der Fokus nun auf technischen Details, aktuellen Projekten und meinem Portfolio. Die drei letzten Artikel waren zum Beispiel:

  1. Button1: Eine Idee, die ich mit einem Team auf einem Startup-Wettbewerb umgesetzt habe.
  2. Visualisierung der Startups in Karlsruhe
  3. Ein Link auf die „Awesome Karlsruhe„-Liste mit interessanten Entwickler und Projekten aus Karlsruhe

Weitere Erreichbarkeit

Karl Lorey ist jederzeit über die Kontaktformulare, GitHub, Linkedin, Xing oder Twitter zu erreichen.

ZF2: Pflicht-Feld eines Formulars mit Stern markieren

Zend Framework 2.3 bietet bisher leider keine Funktionalität an, um Pflicht-Felder eines Formulars (Zend\Form und Zend\Form\Element) automatisch mit einem Stern zu markieren. Dieser Artikel zeigt Möglichkeiten auf, wie benötigte Formular-Felder bzw. Form-Elemente mit einem beliebigen Zeichen (z.B. einem Stern) gekennzeichnet werden können. Prinzipiell ist hierbei beides Mal ein ViewHelper zu erstellen, der den gewünschten Effekt erzielt, indem er das Label um einen Stern ergänzt.

Beispielsweise sei folgendes Formular-Element gegeben, welches mit required' => true als Pflicht-Feld deklariert wurde und anschließend automatisch als benötigtes Feld gekennzeichnet werden soll.

// Irgendwo in einem Controller
$form = new Zend\Form();

// ... konfiguration, etc.

// beliebiges benötigtes element
// muss ausgefüllt werden (required => true)
$form->add(array(
    'type' => 'Zend\Form\Element\Email',
    'required' => true,
    'name' => 'email',
    'options' => array(
        'label' => 'Email'
    ),
));

Einfach: Zend\Form\View\Helper\FormLabel erweitern

Die einfachste Möglichkeit ein benötigtes Formular-Element in Zend Framework mit einem Stern zu markieren besteht darin Zend\Form\View\Helper\FormLabel zu erweitern.

<?php

namespace Application\Form\View\Helper;

use Zend\Form\View\Helper\FormLabel as OriginalFormLabel;
use Zend\Form\ElementInterface;

class MarkRequiredWithStar extends OriginalFormLabel
{
    public function __invoke(ElementInterface $element = null,
            $labelContent = null, $position = null)
    {
        // TODO: Alle Zeilen aus __invoke in der Klasse
        // Zend\Form\View\Helper\FormLabel implementieren

        // Setze $required per Standard auf true, falls required nicht existiert
        $isRequiredElement = ($element->hasAttribute('required') ?
            $element->getAttribute('required') : true);      

        if ($isRequiredElement) {
        $labelContent = sprintf(
            // hier wird der Stern oder ein anderes Symbol eingefügt
            '<span class="required-label">(*)</span> %s',
            $labelContent
        );
        }

        return $openTag . $labelContent . $this->closeTag();
    }
}

Dieser ViewHelper ist dann wie gewohnt in der Module.php unter getViewHelperConfig zu verlinken, so dass man ihn in jedem View aufrufen kann. Wie das funktioniert ist am Ende des Artikels beschrieben.

Diese Implementierung ist zwar einfach, hat jedoch den Nachteil, dass bei künftigen Versionen des Zend Framework Änderungen am FormLabel-Helper vorgenommen werden könnten, die dann manuell in die selbst erstellte Klasse kopiert werden müssen. Dies ist umständlich und kann zu einem späteren Zeitpunkt zu Fehlern führen. Die nachfolgende Methode umgeht dieses Problem.

Elegant und sauber: Zend\Form\View\Helper\FormLabel wiederverwenden

Statt den Inhalt der Methode zu kopieren und damit duplizierten und schwer zu wartenden Code zu erzeugen, wird bei dieser Möglichkeit der Implementierung das Problem beseitigt, indem der FormLabel-Helper nicht kopiert sondern einfach wiederverwendet wird. So funktioniert der ViewHelper auch noch, wenn sich die Funktionalität des Zend Framework in kommenden Versionen ändert.

namespace Application\Form\View\Helper;

use Zend\Form\View\Helper\FormLabel as OriginalFormLabel;
use Zend\Form\ElementInterface;

/**
 * Add mark (*) for all required elements inside a form.
 */
class MarkRequiredWithStar extends OriginalFormLabel
{
     /**
     * Invokable
     *
     * @return str
     */
    public function __invoke(ElementInterface $element = null,
           $labelContent = null, $position = null)
    {
        // parent::__invoke() ruft die invoke-Methode aus FormLabel auf
        $originalformLabel = parent::__invoke($element, $labelContent, $position);

        // Setze $required per Standard auf true, falls required nicht existiert
        $isRequiredElement = $element->hasAttribute('required') ?
            $element->getAttribute('required') : true;

        if ($isRequiredElement) {
            // mit Stern markieren
            return '<span class="required-label">(*)</span>' . $originalformLabel;
        } else {
            // normales Label zurückgeben
            return  $originalformLabel;
        }
    }
}

ViewHelper in der Config des Moduls verlinken

Beide Methoden erstellen einen neuen ViewHelper, der anschließend natürlich in der Module.php des jeweiligen Moduls verlinkt werden muss, da er nur so direkt im View aufgerufen werden kann.

// ...
public function getViewHelperConfig()
{
    return array(
        'invokables' => array(
            // ...
            'formlabel' => 'Application\Form\View\Helper\MarkRequiredWithStar',
            // ...
        ),
    );
}
// ...

Benutzt man den Namen des originalen Zend Framework ViewHelper (also formLabel), so wird dieser auch von allen anderen ZF2-ViewHelpern verwendet, die Formulare mit Label anzeigen. So nutzt dann der form-ViewHelper automatisch den neu erstellten Helper zum darstellen von Feldern. Es werden also alle Pflicht-Felder in allen Fomularen mit einem Stern markiert. Bei einem anderen Namen passiert dies natürlich nicht. Der ViewHelper kann natürlich jederzeit auch explizit im View über $this->formLabel($element) oder mit dem entsprechenden Namen aufgerufen werden.

Weitere Informationen:

Bachelorarbeit, erstes Paper, Uni-Wechsel und Master - das letzte Jahr

Im letzten Jahr ist viel passiert: Ich habe meine Bachelorarbeit geschrieben, mein erstes Paper veröffentlicht, mein Informatik-Studium an der Uni Würzburg abgeschlossen und anschließend begonnen meinen Informatik Master am KIT in Karlsruhe in Angriff zu nehmen. Meine Seite habe ich in dieser Zeit leider etwas vernachlässigt. Deshalb ist dies hauptsächlich ein Artikel über das, was im letzten Jahr passiert ist.

Bachelorarbeit an der Uni Würzburg

Cover der Bachelorarbeit

Die Grundidee meiner Bachelorarbeit war die konzeptionelle Erstellung und anschließende Implementierung einer App zur Messung von Einfluss in sozialen Netzwerken. Aus diesem Grundgedanken entwickelte sich mit der Zeit die Idee Einfluss mithilfe der Nutzer zu messen und das Ganze als Spiel mit Auswertung des eigenen Einflusses umzusetzen. Hierzu beantworten die Nutzer Fragen über ihre Freunde und können sich damit Informationen über ihren Einfluss freischalten.

Für die Umsetzung der App wurde zunächst ein erweiterbares Framework erstellt, dass das grundlegende Spielprinzip abbildet. Mithilfe dieses Framworks wurde dann das Spiel erstellt und mit Fragen, Belohnungen und Auswertungen zu Einfluss versehen.

(Anmerkung und Cliffhanger: Da die Entwicklung aktuell noch in vollem Gange ist, werde ich leider erst zu einem späteren Zeitpunkt auf die App verlinken können. Screenshots sind in der unten verlinkten Präsentation zu finden, alles andere ist leider auch noch nicht öffentlich.)

Die Bachelorarbeit selbst beschäftigt sich mit dem Konzept des Frameworks und Spiels, sowie den wissenschaftlichen Grundlagen von Gamification, also der Nutzung von Spielelementen in einer eigentlich ernsten Anwendung. Es wird auf die umgesetzten Gamification-Konzepte eingegangen und wie sie dazu dienen Nutzer zur Teilnahme zu motivieren.

Das Paper: Gamification Framework for Personalized Surveys on Relationships in Online Social Networks

Aus meiner Bachelorarbeit ging auch ein Paper in Zusammenarbeit mit meinem Betreuer Michael Seufert und anderen Mitarbeitern des Lehrstuhls hervor. Das Paper hat den Titel „Gamification Framework for Personalized Surveys on Relationships in Online Social Networks“ und wurde auf dem „1st International Workshop on Crowdsourcing and Gamification in the Cloud (CGCloud), Dresden, Germany, December 2013“ vorgestellt.

Die Folien der Workshop-Präsentation sind bei Slideshare (und nachfolgend) zu finden, das Paper selbst ist bei IEEE Explore erhältlich (nicht kostenlos).

Uni-Wechsel von der Uni Würzburg ans KIT in Karlsruhe und Beginn des Master-Studiums

Nach der Abgabe der Bachelorarbeit war mein Bachelor-Studium abgeschlossen, woraufhin ich mich an diversen Universitäten für meinen Master beworben habe.

Die Gründe hierfür sind vielfältig. Ein wichtiger Punkt für mich war, dass die Fakultät für Informatik an der Uni Würzburg eher klein ist. Dadurch ist die Anzahl der verschiedenen Lehrstühle eher gering. Dies stellt im Bachelor zwar kein Problem dar, führt jedoch im Master zu begrenzten Möglichkeiten der Spezialisierung und einer begrenzten Anzahl an Forschungsthemen. Neben diesen Gründen gab es natürlich noch weitere Überlegungen, die ich vielleicht in einem eigenen Artikel ausführlicher erläutern kann. Schlussendlich entschied ich mich für meinen Favorit, das Karlsruhe Institute of Technology kurz KIT in Karlsruhe, als eine der angesehensten deutschen Universitäten im Bereich Informatik. Das KIT verfügt insbesondere über eine große Fakultät für Informatik, was im Master ein riesige Auswahl an Vorlesungen mit sich bringt und die Spezialisierung deutlich einfacher macht.

Natürlich war dies nur eine kurze Zusammenfassung eines ganzen Jahres Arbeit und ich musste, gerade was die Komplexität der Bachelorarbeit angeht, teilweise deutlich abstrahieren. Vielleicht bietet sich aber in Zukunft noch die Möglichkeit in einem gesonderten Artikel näher auf Details einzugehen. Ich werde an den entsprechenden Stellen dann auf die Artikel verlinken.

Java 8: Features und Änderungen im neuen Java

Java 8, das im September 2013 erscheinen soll, bietet zahlreiche neue Features, diverse Änderungen und kleinere Neuerungen im Detail. Dieser Artikel soll eine grobe Übersicht über die Features und Änderungen in Java 8 geben. TechEmpower hat hierzu eine detaillierte Liste aller Java 8 Features und Änderungen ausgearbeitet, die ich auf wesentliche Features gekürzt habe.

Interface-Verbesserungen

Interfaces können in Java 8 nun statische Methoden definieren. Bisher mussten Interfaces aus Libraries stets eine Utility-Klasse mit sich bringen, um eine Grundfunktionalität anbieten zu können. Diese an Interfaces gebundene Utility-Klassen sind fortan aber überflüssig, da die statischen Methoden nun direkt in den Interfaces implementiert werden können, um auf diesen zu arbeiten. Sie müssen nicht mehr in eine extra Utility-Klasse ausgelagert werden.

Weiterhin können in Interfaces nun default-Methoden implementiert werden. Dies wurde auch in vielen Klassen der Java-Standard-Packages direkt umgesetzt. Die Methoden override, equals, hashCode und toString können jedoch nicht überschrieben werden, da diese von Object bereits implementiert werden.

Funktionale Interfaces

Eine weitere grundlegende Änderung in Java 8 sind funktionale Interfaces. Funktionale Interfaces sind Interfaces, die genau eine abstrakte Methode definieren. Ein Beispiel hierfür ist java.lang.Runnable, da nur eine abstrakte Methode definiert wird:

public abstract void run();

Hierzu wurde die Annotation @FunctionalInterface eingeführt, die eine Nutzung als funktionales Interface erzwingt.

Lambdas

Weitere Neuerung in Java 8 sind Lambdas, die mittels funktionalen Interfaces deklariert werden können. Zum Beispiel kann ein Lambda folgendermaßen aussehen:

(int x, int y) -> { return x + y; }

java.util.function

Neben der Umsetzung von Lambdas in bereits existierenden funktionalen Interfaces, existieren auch neue und womöglich sehr nützliche funktionale Interfaces. Sie wurden im neuen Paket java.util.function untergebracht. Folgende Interfaces stehen also ab Java 8 in diesem Paket zur Verfügung:

  • Function – T als Eingabe, R als Rückgabe
  • Predicate – T als Eingabe, boolean als Rückgabe
  • Consumer – T als Eingabe(, Berechnung auf der Eingabe), keine Rückgabe
  • Supplier – keine Eingabe, T als Rückgabe
  • BinaryOperator – Zwei T als Eingabe, Rückgabe eines Ts

Inferenz-Verbesserungen bei generischen Typen

In manchen Fällen wusste der Java-Compiler bisher nicht, was er mit generischen Typen anfangen sollte. Dann musste ein „Typ-Zeuge“ eingesetzt werden um zu verhindern, dass der Compiler auf Object als generischen Typ zurückfällt:

// In Java 7:
foo(Utility<Type>.bar());
Utility.<Type>foo().bar();

Durch Verbesserung der generischen Typen kann der Compiler in Java 8 nun viel häufiger aus dem Context auf den generischen Typ schließen:

// In Java 8:
foo(Utility.bar());
Utility.foo().bar();

Dieses Java 8 Feature wird vielen Entwicklern den Umgang mit generischen Typen erleichtern.

java.time

Auch java.time enthält in Java 8 deutliche Neuerungen. Es werden nun für Monate und Wochentag Enums statt Integer genutzt. Weiterhin sind große Teile der API unveränderbar, was verhindern soll, dass Date-Felder versehentlich außerhalb der Klasse geändert werden können.

Weitere Java 8-Features und -Änderungen

  • Komplett neues java.util.stream-Paket
  • Collections API Erweiterungen
  • Concurrency API Erweiterungen
  • IO/NIO API Erweiterungen
  • Änderungen an Reflections und Annotation
  • Nashorn JavaScript Engine
  • Diverse Änderungen an java.lang, java.util, and java.sql

Quelle: Sehr umfangreiche Übersicht wirklich aller Java 8-Features und -Änderungen von TechEmpower.

Java: Hello World - verblüffend statt einfach

Wer statt dem doch relativ langweiligen Hello-World-Programm

System.out.println("hello world");

einmal außergewöhnlichen Java-Code nutzen will, um in Java „hello world“ auf der Konsole auszugeben, der wird sich wahrscheinlich über folgendes Hello-World-Beispiel in Java freuen:

System.out.println(randomString(-229985452) + " "
    + randomString(-147909649));

Die randomString-Methode sieht dabei folgendermaßen aus:

public static String randomString(int i)
{
    Random ran = new Random(i);
    StringBuilder sb = new StringBuilder();
    for (int n = 0; ; n++)
    {
        int k = ran.nextInt(27);
        if (k == 0)
            break;

        sb.append((char)('`' + k));
    }

    return sb.toString();
}

Das angegebene Beispiel gibt, wie der Standard-Code für Hello World in Java, genauso „hello world“ auf der Konsole aus.

Diese Ausgabe von „hello world“ wird umständlicher, jedoch auf sehr verblüffende Weise erreicht – nämlich mit Zufallszahlen (durch ein Random-Objekt -> java.util.Random).

Doch wie funktioniert es, dass trotz der Nutzung von Zufallszahlen jedes Mal „hello world“ erzeugt wird?

Warum wird so „Hello World“ ausgegeben?

Mit den zwei Methodenaufrufen randomString(-229985452) und randomString(-147909649) wird jeweils als Parameter ein Integer-Wert i zur Initialisierung der Random-Objekte übergeben. Was bewirkt eine Initialisierung von Random mit einem Integer?

Zufallszahlen sind nicht zufällig

Zur Ausgabe von „hello world“ wird die Tatsache ausgenutzt, dass Zufallszahlen in Computern nie wirklich zufällig, sondern nur pseudozufällig sind. Pseudozufällig heißt, dass diese Zufallszahlen nicht wirklich zufällig entstehen, sondern von einem Algorithmus generiert (also berechnet) werden müssen. Dieser Algorithmus wird normalerweise (ohne Übergabe eines Integers bei new Random()) mit einem möglichst zufälligen Wert, dem Seed, initialisiert. Mit diesem Seed berechnet der Zufallszahlen-Generator dann jede Zahl. Bei einer Initialisierung mit dem gleichen Seed werden so also auch gleiche „Zufallszahlen“ erzeugt. In der Praxis wird der Seed aus einer Kombination der Uhrzeit und einem Counter berechnet, so dass er relativ zufällig, schwer zu erraten und die Generierung von zwei gleichen Seeds sehr unwahrscheinlich ist.

In diesem Fall wird der Seed aber manuell übergeben und nicht möglichst zufällig berechnet. Es wird die Eigenschaft genutzt, dass durch die Initalisierung von Random mit einer festen Zahl, in diesem Fall -229985452, immer die selben Zahlen generiert werden. Bei einem Aufruf sind die Zahlen dann immer gleich:

Random r = new Random(-229985452);
int acht = r.nextInt(27);
int fuenf = r.nextInt(27);
int zwoelf = r.nextInt(27);
// usw.

So kann man also nacheinander und zwar jedes Mal und auf jedem Rechner folgende Zahlen generieren:

8
5
12
12
15
0

Und bei der Initialisierung mit -147909649 immer folgende Zahlen generieren:

23
15
18
12
4
0

Doch wie ist es möglich, dass „hello world“ aus diesen Zahlen wird?

Wie wird aus Zufallszahlen „hello world“?

Innerhalb der Schleife werden also bei beiden Aufrufen immer die oben genannten Zahlen generiert. Die Zahlen werden dann zu dem Zeichen „`“ (Nr. 96) addiert. Das Ergebnis dieser Addition ist ein Integer, der für ein Zeichen im Alphabet steht. Mit einem Casting zu char wird aus dem Integer dann schlussendlich ein Zeichen, welches an den String angehängt werden kann. So entsteht char für char erst beim ersten Aufruf der String „hello“ und beim zweiten Aufruf dann „world“:

Generierung von „hello world“

Generierte Zahl Offset Ergebnis der Addition: ‚`‘ + k Buchstabe (char)
8 96 104 h
5 96 101 e
12 96 108 l
12 96 108 l
15 96 111 o
break -> return „hello“
23 96 119 w
15 96 111 o
18 96 114 r
12 96 108 l
4 96 100 d
break -> return „world“

Die erzeugten Strings werden dann verkettet und am Schluss als „hello world“ auf der Konsole ausgegeben.

Vielleicht gelingt es einigen von euch mit diesem Hello-World-Programm in Java andere zu verblüffen…

Quelle: Stack Overflow

Lizenz: CC BY-SA 3.0. Ich würde mich über eine Verlinkung freuen!

Hallo, ich bin ein Compiler

Hallo, ich bin ein Compiler.

Ich habe gerade tausende Zeilen Quellcode überprüft, während du diesen Satz gelesen hast. Um nur eine einzige Zeile deines Codes zu optimieren, habe ich Millionen verschiedener Möglichkeiten abgewägt, die auf einer gewaltigen Menge akademischer Forschung basieren. Diese Forschung selbst zu begreifen, würde dich Jahre deines Lebens kosten.

Es ist mir nicht peinlich – kein bisschen – wenn ich ein dreizeilige Schleife in tausende Befehle umwandle, nur um sie schneller zu machen. Ich spüre keine Scham dabei, mich sehr um Optimierung zu bemühen oder die dreckigsten Tricks anzuwenden. Und wenn du das nicht willst, vielleicht für einen Tag oder zwei, dann benehme ich mich und mache es, wie du es willst. Ich kann die von mir benutzten Methoden ändern, wann immer du willst, ohne auch nur eine einzige Zeile deines Codes zu ändern. Ich kann dir sogar zeigen, wie dein Code in Assembler, auf anderen Prozessor-Architekturen, auf anderen Betriebssystemen und in anderen Assembler-Konventionen aussieht, wenn du das willst. Ja, alles in Sekunden.

Weil ich es – wie du weißt – kann

und du es – wie du weißt – nicht kannst.

PS: Ach ja, du hast die Hälfte des Codes, den du geschrieben hast, nicht genutzt. Ich habe dir einen Gefallen getan und ihn weggeworfen.

Quelle: Antwort auf die Frage, warum nicht mehr Programme in Assembler geschrieben werden (Stack Overflow).

Lizenz: CC BY-SA 3.0. Ich würde mich über eine Verlinkung freuen!

Pflichtenheft in LaTeX: Version 0.2 verfügbar

Das Pflichtenheft in LaTeX ist nun in Version 0.2 verfügbar. Das Pflichtenheft in LaTeX entstammt eigentlich meinem Softwarepraktikum. Ich habe die Version 0.2 des LaTeX-Pflichtenhefts jedoch noch einmal um einige Details erweitert, nicht zuletzt wegen der großen Nachfrage.

Neuerungen des „Pflichtenheft in Latex 0.2“

Version 0.2 des Pflichtenhefts zeichnet sich durch folgende Neuerungen aus:

  • Detailliertere Beschreibung der einzelnen Kapitel
  • Beispiele für Bilder (figure), Fußnoten (footnote) und Listen (itemize) in LaTeX
  • Abbildungsverzeichnis in LaTeX
  • Zeilenlänge auf 80 Zeichen beschränkt

Der Latex-Quelltext und weitere Informationen sind unter „Pflichtenheft in LaTeX“ verfügbar.

Geplante Eigenschaften der nächsten Version

Die aktuelle Version des Pflichtenhefts basiert auf dem „Lehrbuch der Objektmodellierung“ von Heide Balzert. Als nächstes ist eine alternative Version nach Helmut Balzerts „Lehrbuch der Softwaretechnik“ geplant. Weiterhin wäre außerdem ein Lastenheft in LaTeX denkbar.

Über Anregungen oder Vorschläge in den Kommentaren würde ich mich sehr freuen!

Google Webmaster Tools: Indexierungsstatus "Nicht ausgewählt" mit Update entfernt

Seit ein paar Tagen werden sich einige Nutzer der Google Webmaster Tools wundern, dass der Indexierungsstatus „Nicht ausgewählt“ in der Übersicht des Indexierungsstatus verschwunden und nicht mehr zu finden ist.

Wie searchengineland berichtet, wurde mit dem neusten Update der Google Webmaster Tools der Indexierungsstatus „nicht ausgewählt“ entfernt, da dieser wohl für mehr Verwirrung als Nutzen gesorgt hat. Für mehr Verwirrung als Nutzen sorgt Google jedoch auch mit undokumentierten und drastischen Änderungen, die bei den meisten Nutzern wohl für Unmut und Unverständnis sorgen dürften.

Was hat der Indexierungsstatus „Nicht ausgewählt“ bedeutet?

Die Markierung einer Seite mit „nicht ausgewählt“ konnte zuvor folgende Gründe haben:

  • Weiterleitung zu einer anderen Seite
  • Angabe von rel=“canonical“
  • Zu große Übereinstimmung mit dem Inhalt einer anderen Seite (Duplikat) und daher Ausnahme vom Index.

Wie die Beschreibung vermuten lässt, also prinzipiell die Tatsache, dass die Seite nicht für den Google Index ausgewählt wurde.

Bisherige Artikel zu diesem Thema

Ich hatte berichtet, dass bei falscher Konfiguration in den Webmaster Tools alle Seiten mit dem Indexierungsstatus „nicht ausgewählt“ versehen werden. Durch das Entfernen des Status „Nicht ausgewählt“ erübrigt sich dieses Problem in Zukunft wohl.

Weitere Probleme durch das Update

Das Update der Google Webmaster Tools sorgt wohl auch an anderer Stelle für Unmut. Viele Nutzer berichten, dass die „Links von anderen Seiten“ drastisch reduziert wurden. Bei einigen Nutzer fehlen wohl bis zu 90% der Backlinks. Zunächst wurde angenommen, dass dies die Folge des neuen Disavow-Tools ist. Es handelt sich laut Google jedoch um einen Bug, der in den kommenden Tagen gelöst wird und ausdrücklich keinen Einfluss auf das Ranking einer Seite hat.

Sie befinden sich auf einer archivierten Version von karllorey.de. Diese Seite wird seit 2015 nicht mehr aktualisiert. Blog-Artikel haben jeweils den Stand des Veröffentlichungsdatums.

Weitere Informationen finden Sie im letzten Blog-Artikel. Meine Webseite finden Sie nun unter karllorey.com.