Alles hat ein Ende…

Hallo liebe Leser,

Wie der Titel schon verlauten lässt, alles hat ein Ende, auch dieser Blog. Nachdem ich dieses Semester nun hinter mich gebracht habe, wird nun auch das Projekt „Wir schreiben einen Blog“ zu ende gebracht. Ich möchte mich noch einmal bei allen Lesern bedanken, vor allem bei denjenigen die Kommentare hinterlassen haben. Ich hoffe euch hat das lesen genauso viel Spaß gemacht wie mir das verfassen der Blogs.

Alles gute für die Zukunft und vlt. haben euch ja die ein oder anderen Artikel zum nachdenken angeregt.

 

Bilineare Interpolation

Hallo Leute,

Heute gibt es wieder einen recht kurzen Artikel. Ich möchte euch kurz meine Implementation der bilinearen Interpolation vorstellen. Bei der bilinearen Interpolation werden Bilder anhand eines bestimmten Algorithmus vergrößert. Bei diesem Algorithmus wird der neue Pixel aus vier umliegenden Pixeln berechnet. Wie das genau aufgebaut ist, könnt ihr hieran erkennen.

 

 

 

 

 

 

 

 

 

 

 

 

 

Wie man sieht, werden die neuen Pixel (rot markiert) anhand der vier umliegenden Pixel berechnet. Wie das ganz in meiner Implementation gegenüber der Implementation von Photoshop aussieht,  seht ihr unten!

Solltet ihr genauere Fragen haben, Kritik oder Kommentare haben, so zögert nicht sie in den Kommentaren zu schreiben!

Sierpinski-Dreieck in Java per Rekursion

Hallo Leute,

Heute wieder ein Off-Topic Artikel, diesmal aber einer der doch wieder tatsächlich mit Programmieren zu tun hat. Heute werde ich euch zeigen wie ihr ein Sierpinski Dreieck in Java programmieren könnt.Sierpinski-Dreieck Dabei werden wir uns der Rekursion bedienen. Zuerst aber: „Was ist ein Sierpinski-Dreieck?“. Ein Sierpinski-Dreieck ist ein Fraktal das ein in sich selbst enthaltene Teilmenge ist. Wie wir das ganze nun in Java machen, zeige ich euch nun:

Der erste Schritt den wir machen müssen ist ein Fenster zu erstellen und die benötigten Images zum Zeichnen. Dabei verwenden wir ein JPanel und ein JFrame.  Wir erstellen zuerst eine neue Klasse die die JPanel Klasse erweitert, danach erstellen wir ein JFrame und fügen das JPanel dem JFrame hinzu. Danach erstellen wir ein BufferedImage, mit der Größe unseres JPanels/JFrames. Nun overriden wir die paint Methode und malen unser BufferedImage an die Stelle 0,0.  Dies sollte relativ trivial sein: Nun kommen wir zum spannenden Teil: Die Rekursion: Wir wissen das jedes Dreieck, drei weitere Dreiecke hervorruft. Wie wir anhand des Bildes erkennen sehen wir, dass die X-Coordinate jeweils um 1/4 der Breite verschoben wird, die Y-Coordinate jeweils um die hälfte der Höhe. Dabei kommen wir nun zu folgendem code:

void zeichneSierpinski(double x, double y, double w, double h) {
	zeichneDreieck(x,y,w,h);
	if((x<0.5) || (h<0.5))
			return;
	double h2 = h/2;
	double w2 = w/2;
	zeichneSierpinski(x,y,w2,h2);
	zeichneSierpinski(x+w2/2,y+h2,w2,h2);
	zeichneSierpinski(x+w2,y,w2,h2);
}

Wie wir sehen ist der Code recht simpel und  basiert auf den vorhergemachten Erkenntnissen. Der Code zum zeichnen eines Dreiecks sieht dann wie folgt aus:

drawTriangle(int x, int y,int w, int h) {
	Graphics g = (Graphics) frame.bi.getGraphics();
	g.setColor(Color.black);

	g.drawLine(x,y,x+ w,y);
	g.drawLine(x,y,x+(w/2), y+h);
	g.drawLine(x+w,y, x+(w/2), y+ h);
}

Ich hoffe euch hat die kleine Anleitung gefallen und ihr habt etwas neues gelernt! Bis zum nächsten mal und wie immer: Kommentiert fleißig!

For the lulz?

Logo der Hackergruppe LulzSec (Quelle: http://de.wikipedia.org/w/index.php?title=Datei:Lulz_Security.jpg)

Wenn man in letzter Zeit die Nachrichten gelesen hat, wird man kaum um die Nachrichten der Hackergruppe Lulz Security (kurz: lulzsec) herum gekommen sein. Die Hackergruppe hat Schlagzeilen durch das hacken von großkalibrigen Seiten gemacht, wie z.B der CIA-Internetseite, die Internetseite des amerik. Kongress, Internetseite von SONY und deren PlayStation 3 Services und noch viele mehr. Wie man sich vielleicht denken kann hat sich die Gruppe eine große Anzahl an Feinden gemacht. Anders als z.B das Hackerkollektiv Anonymous  die für die Freiheit im Internet kämpft, beschäftigt sich LulzSec nur damit allerhand Leuten zu schaden und das alles „for the lulz“ (erklärung: “ A term used to justify ridiculous, pointless and occasionally gratuitous behaviour.“).

Doch was hat das für den „Otto-Normal-Internetnutzer“ zu bedeuten? Die Regierungen der Welt sind nur so auf der Suche nach Gründen wieso sie das Internet weiter zensieren und kontrollieren können und Gruppen wie LulzSec werden mit der größte Grund sein wieso sich das Internet das wir jetzt kennen auf längerem Zeitraum ändern wird und das nicht im positiven Sinne.

Was sagt ihr dazu? Findet ihr die Sachen die LulzSec machen lustig? Wie seht ihr die Konsequenzen? Wie immer, hinterlasst Kommentare 🙂

Bis zum nächsten mal!

Kino.to Bust: Nutzer auch gefährdet?

Wie man in den letzten Tagen in den Nachrichten lesen konnte wurde das umstrittene Streaming-Portal Kino.to Kino.to Logo (Quelle: http://de.wikipedia.org/w/index.php?title=Datei:Kino.to_Logo.png)von der deutschen Polizei gebusted. Das die Betreibe jetzt in großen Schwierigkeiten sind ist unlängst bekannt, doch was der Bust für die Nutzer?   Wie man in einemArtikel  von Golem.de lesen konnte versucht die „geliebte“ GVU nun auch den Nutzer von Streamingangeboten zu belangen. Noch haben die Benutzer nichts zu befürchten, doch was die Zukunft bringt bleibt ungewiss. Theoretisch gesehen ist das Streamen von Copyright geschützten Inhalten illegal, da per Gesetz das Downloaden von Inhalten strafbar ist und das Streamen von Inhalten im Grunde auch ein einfaches Downloaden von Inhalten ist.

Genetische Algorithmen: Anwendungsgebiet

Hallo Leute,

Der Matrin hat einen netten Kommentar hinterlassen mit der Frage wofür man denn nun Genetische Algorithmen benutzt und welche Anwendungsgebiete es gibt. Ich habe mich deswegen hingesetzt und ein paar Beispiele rausgesucht, wo Genetische Algorithmen verwendet werden.

Zuerst aber einmal etwas Allgemeines: Allgemein kann man sagen das Genetische Algorithmen dann verwendet werden, wenn eine geschlossene Lösung nicht oder nicht effizient berechnet werden kann. Dadurch das der Genetische Algorithmus mit der Bruteforce-Methode vor geht (diese aber durch den genetischen Ansatz optimiert) kommen immer Lösungsansätze raus, diese aber mit unterschiedlicher Genauigkeit bzw. Optimierungsgrad.

Nachdem wir uns nun kurz den Allgemeinen Teil angeguckt haben, möchte ich euch zwei interessante Beispiele vorstellen:

Evolution Chamber: Ist ein Programm für das Aufbaustrategiespiel Starcraft2. Bei Starcraft2 baut man eine Wirtschaft auf und baut dann Kampfeinheiten um sie den gegen den Gegner zu schicken. Dabei kann man z.B Arbeiter bauen, die Mineralien sammeln, oder Produktionsgebäude in denen man Einheiten trainieren kann. Dabei ist es von entscheidender Rolle wie schnell man bestimmte Einheiten trainieren kann und wie stark die Wirtschaft ist. Es gibt sehr viele Möglichkeiten in welcher Reihenfolge man welches Gebäude baut, wann man wie viele Arbeiter produziert usw.. Dabei kann man nun Evolution Chamber nehmen, bestimmte Kriterien angeben ( wie z.B 25 Arbeiter und 10 standard Kampfeinheiten) und nun wird per Genetischer Algorithmus die schnellste und beste Baureihenfolge errechnet.

Das Problem das durch dieses Programm gelöst wird kann man auch ganz leicht auf Betriebswirtschaftliche zusammenhänge beziehen: Dabei wird einfach versucht die Produktion den Umständen entsprechend und anhand bestimmten Kriterien optimiert.

2D Auto: Wenn man sich den Link anschaut erkennt man sofort was das Programm versucht: Es versucht ein generiertes Auto für eine bestimmte Strecke zu optimieren.

Ich hoffe dieser kleine Einblick in die Anwendungsgebiete für Genetische Algorithmen hat euch gefallen, sollten noch Fragen bestehen so zögert nicht diese in den Kommentaren zu äußern.

Open your Minds! Tutorial Links

Hallo,

Heute möchte ich euch ein paar interessante Tutorials zeigen, die ich im laufe meiner Programmier-Karriere als nützlich oder unheimlich interessant angesehen habe.

Anfangen möchte ich mit einem Tutorial zum einrichten von Git. Wenn ihr wissen wollt was Git ist, so empfehle ich den Wikipedia-Link oder meinen Artikel von letzter Woche. Wenn man sich an das Programm ran wagt, merkt man erst wie kompliziert das ganze sein kann und man merkt das man recht schnell die Übersicht verliert, um das zu verhindern haben die Jungs und Mädels von GitGuys ein paar interessante, hilfreiche und simple Tutorials ins Netz gestellt die euch beim einrichten von Git unterstützen werden.

Ihr wolltet schon immer mal Python oder C++ Programmieren können, habt jedoch keine guten und kostenlosen Tutorials gefunden? So kann ich euch nur herzlichen die Google Code Tutorials empfehlen. Sie sind zwar nicht die simpelsten Tutorials die es gibt, jedoch werden viele Konzepte und Richtlinien gut erklärt und man lernt schnell sehr viele Dinge! Ich kann sie euch wirklich nur ans Herz legen, vor allem die C++ Tutorials haben mir damals sehr gut weiter geholfen!

Python und C++ sind euch zu wider? Ihr wollt lieber coole Web-Seiten programmieren? Ihr wollt Up2Date mit der neusten Web-Entwicklung sein? Dann seid ihr mit Ruby on Rails gut bedient! Dazu kann ich euch das Einsteiger Tutorial von RailsForZombies empfehlen. In diesem Tutorial, das sehr aufwendig und hochqualitativ ist, werdet ihr lernen wie ihr mit RubyOnRails einen Twitter Clone programmieren könnt! Dabei unterstützt euch die Seite und gibt euch nach jedem Kapitel ein Test wo ihr euer neu gelerntes gleich ausprobieren könnt!

Ich hoffe euch gefallen die Tutorials und Links, solltet ihr Fragen oder weitere Links haben so postet sie doch in den Kommentaren!

Git , SVN und Dropbox

Hallo liebe Leser,

Heute möchte ich euch drei Programme vorstellen die euch beim programmieren von Projekten unterstützen können. Die Funktion der Programme ist, dass sie verschiedene Versionen bzw. Dateien auf bestimmte weise speichern um zu verhindern das Code verloren geht und um verschiedene Versionen von Code-Dateien richtig zu archivieren, speichern und zu Verwalten. Dabei fange ich mit dem simpelsten Programm an.

Dropbox

Jeder der schon einmal DropBox verwendet hat weiss wie es funktioniert: Man erstellt sich einen Account, erstellt einen Ordner im DropBox Verzeichnis und schon ist dieser Ordner überall und von jeder Maschine aus zugreifbar. Das ganze funktioniert durch das einfache verteilen von Zugriffsrechten und dem Account-Prinzip. Im Grunde heißt das: Mit der Account/Passwort Kombination kann ich überall auf die Dateien im Dropbox Verzeichnis zugreifen. Dies kann man auch super für Programmier-Projekte benutzen, man erstellt einfach eine Workbench im DropBox verzeichnis und schwups, kann man von jedem Rechner aus auf sein Projekt zugreifen.

SVN und Git

SVN und Git sind komplexere Programme um verschiedenste Versionen von Code-Dateien auf eine Repository bzw. Server hochzuladen, runterzuladen, zu sortieren und zu Verwalten. Jeder der mal das Szenario hatte wo er gerade an einem Teil vom Projekt arbeitet und man sich so verzettelt das gar nichts mehr funktioniert, jedoch kein BackUp hat um eine ältere Version des Programm-codes zu laden weiss wie frustrierend so etwas sein kann und genau dort kommt SVN und Git ins Spiel. Jeder „push“ bzw. neuer Stand vom Projekt wird als eigene, vollständige Kopie gespeichert. Sollte man nun an eine Stelle kommen in der man eine ältere Version vom Code möchte, so kann man dies ganz leicht durch diese Programme bewerkstelligen.

Ich kann dazu nur die Wikipedia Einträge zu den einzelnen Programmen empfehlen! Ich hoffe auch das ich euren Horizont erweitern konnte und ihr einige Anregungen erhalten habt! Habt ihr Erfahrungen mit den Programmen, so könnt ihr gerne eure Erfahrungen in den Kommentaren kund tun!

Java II: Der Genpool wird gefüllt!

Willkommen zurück,

Heute wird es wieder ganz wild, wir werden uns heute wieder Java widmen und da weiter machen, wo wir letzte Woche aufgehört haben. Diesmal werden wir uns der GenAlgo.java Datei widmen. Dabei werden wir erst unser Klassengrundgerüst aufbauen, den Genpool erstellen, sowie unsere Decoder Tabelle einfügen.

Da wir nicht viel Blabla wollen sondern gleich ans eingemachte wollen, gehts jetzt auch schon mit Code los:

GenAlgo.java

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class GenAlgo {
	List<Chromosom> genepool;
	HashMap<String,String> chardecoder;

	public GenAlgo(int gp, int chromlenght) {
        }
}

Wie wir sehen „includen“ wir erst einmal ein paar nützliche Utilities die wir im weiteren Verlauf der Klasse benötigen werden. Darunter fallen die ArrayList, HashMap und die List. Die ArrayList und die List werden wir für unseren Genpool benutzen, die HashMap fungiert als Decoder Tabelle. Wie man sieht, erstellen wir erst eine List vom Typen Chromosom, das heißt das dort unsere Instanzen(Objekte) gespeichert und verwaltet werden. Danach erstellen wir eine HashMap die zum einen ein Key und ein Value enthällt, dabei sind bei vom Typ String. In diesem Fall ist unser Key unser Bitstring-Abschnitt und die Value das dazu passende Zeichen.(Solltet ihr vergessen haben wieso und weshalb wir eine solche Tabelle brauchen, der gucke sich diesen Artikel nochmal an). Wenn ihr weitere Informationen bezüglich HashMap oder (Array)List wollt, so empfehle ich euch zum einen die offizielle Dokumentation(HashMap // List ) und das online Buch: Java ist auch nur eine Insel. Der aufmerksame Leser wird feststellen das der Konstruktor zwei Parameter erwartet, gp steht für Genpool und erwartet die Größe des Genpools(sprich wie viele einzelne Chromosome gespeichert werden sollen), als zweites erwartet er die Chromosomlänge, also wie viele Bits der Bitstring des Chromosoms haben soll.

Das wars dann auch erstmal wieder für diese Woche, wie immer gilt: Solltet ihr fragen haben so zögert nicht diese in den Kommentaren zu stellen!


		
		

	

Die ersten Schritte im Jungel der sich Java nennt

Willkommen zurück!

Heute werden wir die ersten Schritte in Java gehen, dabei werden wir das Grundgerüst für unseren Genetischen Algorithmus aufbauen. Wir werden erst unsere App mit unserer Main-Methode erstellen, dann werden wir eine GenAlgo-Klasse erstellen, die die Chromosome verwalten wird und dann die eigentlichen Chromosome mit ihren  Bit-Strings und Methoden zum Decodieren und Fitness-Score. Ich werde den Code dabei ziemlich stark aufbröckeln, damit auch der Leser es versteht, der vielleicht noch nicht die größten Erfahrungen mit Java gesammelt hat.

Nachdem man ein Java-Projekt in seiner Lieblings-IDE erstellt hat, erstellen wir folgende Dateien:

–          App.java

–          Chromosom.java

–          GenAlgo.java

Nun wollen wir die Dateien auch mit etwas füllen:

App.java:

public class app {
	public static void main(String[] args) {
		System.out.println("Starting");
	}
}

Unsere Main-Methode die zum Start für das Programm genutzt wird. Später wird diese noch erweiteret.

Chromosom.java:

import java.util.HashMap;
import java.util.Random;

public class Chromosom {
	String bitstring;
public Chromosom(int lenght) {
		bitstring = "";
		Random rnd = new Random();

		for(int i=0; i < lenght; i++) {
			bitstring += rnd.nextInt(2);
		}
		System.out.println(bitstring);
	}
}

Zuerst, erstellen wir einen Stringt namens „bitstring“ der unseren eigentlichen Bit-String speichert (also die 0en und 1en). Danach erstellen wir einen Konstruktor der die länge unseres angepeilten BitStrings erwartet, sprich: „Wie viele 0en und 1en wollen wir speichern?“. Danach erstellen wir ein Random-Objekt. Random liefert uns „Zufallswerte“ zurück, dabei verwenden wir dies um unseren Bit-String mit Werten zu füllen. Danach füllen wir mit einer For-Schleife unser String mit 0 und 1, dabei benutzen wir rnd.nextInt(2), nextInt liefert, wie der Name schon sagt, ein Int zurück, da wir ja Ganzzahlen benötigen, unsere „Range“, also zwischen welchen Werten der Zufallswert liegen soll legen wir mit 2 fest (0-1 = zwei verschiedene Werte). Danach printen wir Testeshalber unseren generierten BitString aus um ggf. Fehler zu finden.

Nächste Woche werden wir dann GenAlgo.java mit etwas Code füllen und Chromosom- und unsere App-Klassen erweitern.

Solltet ihr Fragen haben: Schreibt sie in die Kommentare, ich werde euch gerne helfen!