bwapi und StarCraft Bots

Als ich letztens an einer Universität eine Woche lang „Probe studieren“ durfte, wurde ich dem Projekt jRobots zugewiesen. Ziemlich cool, dachte ich mir und machte mich für eine bestens dokumentierte jedoch wohl recht veraltete Aufgabe bereit. (Veraltet, da die letzten offiziellen „Kämpfe“ bereits 2013 waren und sich seitdem nichts geändert hat)

Uns wurde dann überraschend erzählt, dass wir uns nicht mit jRobots beschäftigen werden, sondern der bwapi und StarCraft.
Für alle die StarCraft nicht kennen: Das ist ein Strategieaufbauspiel, bei dem es viel um Ressourcengewinnen, Kampfstrategien für Einheiten entwickeln und Basis bauen geht. Außerdem sind da ganz viel Alienzeug und andere Nerdwünsche vertreten. Anstatt sich also am ersten Tag mit Geometrie und Mathematischen Formeln den Tag zu versüßen, wurde StarCraft gespielt. Aber nun zu Tag 2 und damit weg vom unwichtigen Gelaber, sondern hin zum programmieren.

Als wir (splix & ich) uns die JavaDoc anschauten fiel uns schnell auf, dass wir uns im Kreis bewegten. Methoden wurden mit Verlinkungen zu Methoden erklärt, die wiederum eine Verlinkungen auf eine Methode war, die dann auf die Methode als Erklärung verlinkte, die die Ursprüngliche Methode war.
Allgemein war alles sehr verkorkst, da die gesamte Java bwapi ein Wrapper um die eigentliche C++ API war. Eigentlich schade, dass wir nicht in C++ entwickelt haben, Späße wie einen Pointer auf die Speicheradresse der Gegner zu legen und den Wert dann auf 0 zu setzen sind in Java schwer machbar.
Unsere Taktik war nach dem fünften Tag Schlussendlich, dass wir unsere Einheiten, die man vorher mit einem bubblesort o.ä. sortieren sollte, als Linie aufstellen und dann den Mittelpunkt Aller ausrechnen. Vom Mittelpunkt aus greifen alle gesammelt die beste Einheit an. Wir hatten nämlich nur Kampfszenarien, ohne Gebäude bauen oder großartiger Taktik.

Die bwapi stellt viele Methoden zur Verfügung, beispielsweise die (ich nenne sie mal so) on-Methoden, wie onStart, onUnitDiscover, onUnitCreate usw. Wie man schon vermuten kann, werden diese automatisch aufgerufen, wenn das Spiel startet, wenn eine Einheit entdeckt wird, wenn eine Einheit erstellt wird, … Diese Methoden waren ziemlich nützlich, teilweise aber auch verlockend um Denkfehler zu machen. Die Methode OnUnitDiscover wird beispielsweise nicht aufgerufen, wenn eine Einheit entdeckt wird, obwohl sie vorher schon entdeckt wurde. Die is-Methoden, z.B. isAttacking waren auch tricky. isAttacking war true, wenn die Einheit auf dem Weg zum attackieren war. Wo stand das? Natürlich nicht im Javadoc!
Wie sind wir drauf gekommen? Debugmethoden!
(Na gut, eigentlich sind wir verdammt spät drauf gekommen und haben ein paar Stunden lang alles verteufelt)
Ein anderes Manko, dass wir natürlich direkt mitgenommen haben waren die getTarget und getOrderTarget Methoden. Man konnte nämlich manchmal nicht via getTarget das aktuelle Ziel ausgeben lassen sondern musste es mit getOrderTarget abfragen. Der Unterschied lag darin, ob der Befehl zum attackieren des Ziels von der Api, also vom Programmierer oder von der AI des Spiels gegeben wurde. Ziemlich merkwürdige Sache. Und auch die abfrage via getType hat gehapert, das haben wir uns aber denke ich uns selbst zuzuschreiben, da wir nicht mit equals sondern mit == geprüft haben. Letztenendes haben wir es über die id geprüft, das war eigentlich gar kein schlechtes workaround (Eigenlob).

Zum Abschluss kann ich nur sagen, dass das ganze zwar sehr lustig war, es aber doch häufig viel Zufall war, ob der/die Eine oder der/die Andere im Multiplayer gewinnt, die beste Taktik war oftmals nämlich einfach stehenzubleiben, das wäre bei jRobots vielleicht nicht der Fall gewesen.
Trotzdem eine schöne Erfahrung!

Veröffentlicht unter Programmieren/Skripten | Hinterlasse einen Kommentar

Idea – Das Ideenprogramm

Vorwort: Dieses Programm ist am Abend entstanden. Ich hatte keine Ideen was ich kurzes programmieren könnte, ich wollte nur etwas, was ich nützlich finde.

IDEA – Das Ideenprogramm

Das Programm nennt sich also Idea und kann im Grunde genommen deine spontanen Ideen speichern. Man ruft das Programm auf indem man
psittacus@area51 ~ $ idea
schreibt. In diesem Fall wird man freundlich dazu aufgefordert die neue Idee zu notieren.
Diese wird dann in einem Dokument gespeichert.
Bei
psittacus@area51 ~ $ idea r
oder
psittacus@area51 ~ $ idea read
wird der Inhalt der „Ideendatei“ ausgegeben.

GitHub Link: https://github.com/psittacus/idea

Veröffentlicht unter C/C++, Programmieren/Skripten | 5 Kommentare

MalMail – An Emailaddress faking Client

Übersicht

Malicious Mail – was ist das?

Malicious Mail – Wie funktioniert es?

Was kann es?

Was kann es nicht?

Programmiertechnische Fragen


Malicious Mail – was ist das?

Malicious Mail ist ein E-Mail Client, der deine E-Mail Adresse für den ersten Augenblick verschleiert. Es wurde von mir (psittacus) und Spl1x programmiert. Der Sinn dabei ist es, dass man beim Programm die E-Mail Adresse des Absenders angeben kann, also nicht unbedingt seine Identität preisgeben muss.

Malicious Mail – wie funktioniert es?

Zuerst muss man sich den Client von GitHub clonen (MalMail-GitHub).
Der Client hat bisher folgende Möglichkeiten:
dummy@area51 ~ $ python3 malmail.py [first name, last name, sender mailaddress, subject, recipient]
oder
dummy@area51 ~ $ python3 malmail.py -h
oder
dummy@area51 ~ $ python3 malmail.py --help
oder
dummy@area51 ~ $ python3 malmail.py

Nachdem das Programm auf die folgenden Weisen aufgerufen wurde wird man nach dem Programmstart gefordert den Text einzugeben (ausgenommen es wurde ohne Parameter aufgerufen, dann müssen vorher die Werte angegeben werden)
Wenn man fertig mit Text schreiben ist schreibt man in die unterste Zeile „EOF“ und drückt Enter. Das ermöglicht es, in den anderen Zeilen die Entertaste zu benutzen um eine schöne Textformatierung zu produzieren.
Um das Programm verwenden zu können, muss man bei seinem E-Mail Server (wir benutzten hier Web.de) den smtp Zugriff erlauben.

 

Was kann es?

Was kann es nun also? Nach fertiger Einrichtung (siehe GitHub) muss man nur den Fakeabsendernamen bzw. -vornamen angeben mit der E-Mail Adresse. Diese wird dann anstatt der eigentlichen E-Mailadresse angezeigt. Es kann ein Betreff angegeben werden und es kann ein Text geschrieben werden.

 

Was kann es nicht?

Es kann die E-Mail Adresse nicht vollkommen verschleiern. Haben wir es mit einem Empfänger zu tun, der die einzelnen Metadaten abcheckt, so liest er die eigentliche E-Mail Adresse.

 

Programmiertechnische Fragen

Welche Programmiersprache?
Wir haben alles in Python 3.5.2 entwickelt.
Warum Python bzw warum Python3?
Weil Python3 mit smtplib eine schöne library hat.
Wie seid ihr auf die Idee gekommen?
Ich hatte ein ähnliches Programm für meinen raspberrypi entwickelt, wir haben dann herausgefunden, dass man mit ein bisschen Geschick die E-Mail Adresse verändern kann.
Wo habt ihr euch getroffen?
Wir haben das ganze in der k4cg programmiert.
Wie lange hat das entwickeln gedauert?
Es hat ca. 1,5 Stunden gedauert.


gez. psittacus, Spl1x

Veröffentlicht unter Programmieren/Skripten | 1 Kommentar

Von Linux Ubuntu auf Linux Mint umsteigen

Linux Ubuntu ist ja das sogenannte „Einsteigerlinux“. Kommst du von Windows? Nimm Ubuntu! Aber auch Linux Mint wird oft für ehemalige Windows-fanboys empfohlen.

Also jetzt Linux Mint, aber warum überhaupt?

Im Unterschied zu Ubuntu, dass Unity als GUI nimmt, habe ich mit meinem Linux Mint eine xfce GUI, die allemal so gut aussieht und vorallem: Besser anpassbar ist! Endlich kann ich ohne tausend Umwege einfach meine Taskleiste färben, sie unheimlich klein machen und einfach alles einstellen, was ich will. Ging bei Ubuntu bestimmt auch, war aber schwieriger.

Die Standardprogramme unterscheiden sich jedoch leicht, was bei unterschiedlichen Grafischen Oberflächen jetzt aber nicht unbedingt erstaunlich ist. Die wichtigen Programme die ich noch installieren wollte/musste waren nur noch Sublime Text 3, KeePass und vim. Momentan bin ich sehr zufrieden mit meinem Mint und habe nicht vor in naher Zukunft noch irgendetwas daran zu ändern.

Veröffentlicht unter Programmieren/Skripten | Hinterlasse einen Kommentar

Ein Blog powered by Python

Auch wenn viele eine Grafische Oberfläche auf ihrem Rechner benutzen, gibt es doch auch Leute, die nur mit der Konsole arbeiten. Ob man damit nun einen Blogbeitrag schreiben will, wage ich zu bezweifeln. Wenn man aber doch unbedingt mal einen neuen Beitrag auf seinem Blog veröffentlichen will, braucht man ein Script, dass den Blog updated und das neu geschriebene hinzufügt. Hier möchte ich mal kurz meine einfache Version preisgeben.
Vorerst habe ich mir überlegt, was ich dafür eigentlich alles brauche.

  • Einen FTP Server um die html und css datei(en) online zu haben
  • Eine Markierung im index.html file, damit das Script weiß, wo der neu geschriebene Text eingefügt werden soll
  • Fertig

Also habe ich das mal kurz programmiert:

Am Anfang importiere ich

from ftplib import FTP
import io
import requests
import string

der erste Import erklärt sich von selbst, io importiere ich, damit ich ein „bytes-like object“ zum ftp server schicke und keinen string (also string to object sozusagen). Requests benutze ich später zum auslesen des bisherigen html Codes um den ganzen Code zu spalten und den neuen Beitrag einzufügen. Zum Spalten an der richtigen Stelle benutze ich dann die split() Methode von string.

Danach ermittle ich via

titel = str(input(„Titel: „))

new_content = str(input(„Content: „))

Was der Titel und was der eigentliche Content später sein soll.
Um die alte Version der Seite zu bekommen benutze ich requests.get(). Davon dann den Content und der wiederum soll dann zu einem string werden, was ich mit decode() erreiche.

old_content = requests.get(„http://blog.psittacus.bplaced.net“).content.decode()

Als Merkmal wo ich den Code spalten muss um den neuen Beitrag genau da einzufügen musste ich mir ein relativ eindeutiges und nicht zweimal vorkommendes Merkmal setzen. Geteilt wurde der String dann mit split()

tmpcontent = old_content.split(„<!– split the shit here –>“)

Als nächstes kommt dann die mit Abstand längste Zeile, die aber auch garnicht so schwer zu verstehen ist:

final_content = tmpcontent[0] + „<!– split the shit here –><div class=\“styleMe\“><h2 id=\“titel\“>“ + titel + „</h2><br><p id=\“content\“>“ + new_content + „</p><br></div>“ + tmpcontent[1]

Der finale content wird hier aus dem oberen Teil der Seite (also alles was vor <!– split the shit here –> stand, beispielsweise Links und die Überschrift) einem div container, der einfach nur einen Schatteneffekt hat, dem Titel, dem Content, einem Zeilenumbruch und dem alten Content, der unter dem split Merkmal (Beispielsweise alte Beiträge) stand zusammen gesetzt.
Das ganze kann eigentlich schon auf den Server hochgeladen werden. Aber erst nachdem ich es in ein Bytes-Objekt „encoded“ habe. Wie? So:

final_content_in_bytes = final_content.encode(„utf-8“)
bio = io.BytesIO(final_content_in_bytes)

Mit

ftp = FTP(„dude.server.de“)
ftp.login(„username“,“password“)
ftp.storbinary(‚STOR blog/index.html‘, bio)

Verbinde ich mich mit dem Server, logge mich ein, und überschreibe die alte index.html Datei mit dem Object, dass in „bio“ lagert.
Am Ende noch ein ftp.quit() und wir sind fertig.

Das ganze hat natürlich auch Nachteile. Beispielsweise ist es kompliziert Bilder hoch zu laden oder sehr lange Texte zu schreiben. Auch wenn man keinen eigenen FTP Server hat, den man verwalten kann, ist das ganze ein bisschen blöd. Aber immerhin ein kleines schönes Tool.

Veröffentlicht unter Internet, Programmieren/Skripten, Python | 2 Kommentare

Bot vs. Bot – Wenn sich Java Bots schlägern

Jaja ich weiß. Iiihhh Java. Aber ich muss sagen, es hat wieder mal sehr viel Spaß gemacht das ganze zu programmieren. Aber jetzt mal zum wesentlichen:
Es gibt zwei Bots, die beide eine kleine Schuss Funktion haben. Alles ist in einer 2D Welt. Sie weichen beide immer Zufallsbasiert nach oben oder nach unten aus, bzw. bewegen sich nach oben/unten. Wenn ein Bot zu nah an die Kante der Map kommt wird der Zufallsgenerator so beeinflusst, dass der Bot wieder langsam in die Mitte läuft.
Es ist ganz cool dem ganzen Zuzusehen. Der Code dazu kommt morgen wahrscheinlich auf Github, wenn ich ihn noch schöner dokumentiert habe.

Veröffentlicht unter Programmieren/Skripten | 2 Kommentare

Lenovo Thinkpad x201 – meine Meinung

Hallo!
Ich habe mir einen zweiten Laptop gekauft, und zwar ein Thinkpad x201. Es ist nun schon etwas älter und ich habe mir das gebrauchtmodell gekauft, dafür hat es nur 195€ gekostet. (gekauft bei Lapstore)
Als Betriebssystem benutze ich übrigens Linux Ubuntu 16.04 LTS.
Das Notebook hat einige schöne Features, die mein HP Pavillon nicht hat. Zuerst muss man anmerken, dass das Notebook kein CD Laufwerk hat. Das macht aber nix, denn CDs verwende ich wenn dann zum booten und dafür habe ich auch einen USB Stick. Wenn ich Filme auf meinem Laptop schauen will, schau ich ihn über meinen HP (Haupt-) Laptop. Hier kurz ein Bild des Laptops von meinem Instagram-Account:

https://www.instagram.com/p/BGhStUFHoRa/?taken-by=xpsittacusx

Positive Aspekte des Thinkpads sind eindeutig seine Größe, sein Gewicht und seine Akkulaufzeit. Das Preis-Leistungs-Verhältnis ist hier wirklich grandios. Die Grafikkarte ist zwar nicht die tollste und darauf zu zocken ist denke ich nicht empfehlenswert, aber das habe ich auch gar nicht vor. Man kann den Bildschirm im 180° Winkel zur Tastatur klappen, was ich zwar nicht so oft brauchen werde, aber es ist ein nettes Feature. Die Tastatur fühlt sich nebenbei beim tippen sehr mechanisch an. Das gefällt mir. Aber nochmal zurück zum Bildschirm: Dieser ist matt. Bedeutet ich kann mich damit auch mal in die Sonne setzen und programmieren oder sehen, was der Raspberry Pi so macht. Unter dem Display gibt es noch kleine Lämpchen, die mir sagen, was gerade los ist. Also ob mein WLan, oder das Bluetooth aktiv ist, etc.

Ein kleiner Fail war, dass auf dem Laptop ein Windows 7 Aufkleber klebt, obwohl ich es ohne Betriebssystem gekauft habe.

Ansonsten lässt sich nur noch sagen, dass, wenn man sich einen Laptop kaufen will, man wirklich auf die Seite lapstore.com gehen sollte. Dort gibt es zu günstigen Preisen gute, gebrauchte Laptops.

Außerdem danke an das hackerboard, die mir zum Kauf dieses Laptops geraten haben 🙂

Veröffentlicht unter Offtopic | 2 Kommentare

Quotenmann, der Twitchbot in Python

Hallo!
Nachdem ich in der Gruppe GmHz~ aktiver Mitspieler bin und wir nun auch auf der Plattform Twitch einen Livestream betreiben, brauchten wir natürlich einen Bot. Und ganz ehrlich? Der Name Quotenmann ist echt geil 😀

Der Bot ist in Python programmiert und benutzt dabei nur die imports:

socket
string
sqlite3

Warte mal. SQLite? Warum? Weil ich das für ein Feature benötige.

Den Code könnt ihr übrigens demnächst auf GitHub herunterladen!
Warum erst demnächst?!Weil mir gesagt wurde, dass der Code momentan noch richtig hässlich ist und ich ihn erst schöner machen soll 😀

Was kann Quotenmann zurzeit?

Er schreibt ein „Willkommen, %username%“ wenn man ein „Hey“ schreibt.

Schreibt man eine Beleidigung in den Chat, wird man für 1 Minute gemuted. Vielleicht baue ich ein, dass man noch länger gemuted wird. Oder ich haus raus. Oder er wird ganz gebannt. Oder getötet. Mal sehn. 😀

„!werbung“ bewirkt, dass unser Twitteraccount angezeigt wird (@GMHZ_official)

Bei uns kann man auch Wetten. In CS:GO wird solange gespielt bis ein Team 16 Runden gewonnen hat oder beide Teams 15 Punkte erreichen. Man kann also via „!bet 16 13“ darauf wetten, dass unser Team mit 16 Punkten gewinnt und das andere Team 13 Punkte erlangt.
ABER nur wenn von einem Moderator (das wäre einer aus GmHz) den Befehl „!start bet time“ eingegeben hat. Wenn die Runde beginnt wird „!end bet time“ geschrieben und niemand kann mehr wetten. Damit wird verhindert, dass während des Matches noch Wetten eingehen.Jede Wette wird in eine SQLite Tabelle eingetragen. Momentan kann man noch öfter als einmal Wetten. Aber das wird noch gefixt. Wenn die Runde vorbei ist schreibt wieder ein Moderator beispielsweise „!findTheWinner 16 7“ rein, wenn das Match 16:7 für uns entschieden wurde. Der Name wird ausgegeben und bekommt dann einen Minipreis. Eine Kiste vielleicht. Mal sehen.

Momentan wars das auch schon, aber mehr ist schon in Planung. Updates werden kommen!

Veröffentlicht unter Bot, Python | Hinterlasse einen Kommentar

Scotty

Nachdem ich schon den Marvin Tumblr bot programmieren habe ( marvin-robot ) dachte ich mir, dass es wirklich cool wäre, wenn man ein kleines Programm im Autostart hat, das dir bestimmte Funktionen anbietet. Beispielsweise Google dies, Google das. Starte mal bitte Spotify oder starte schonmal Skype für mich. Du kannst dir wie bei Marvin zufällige Sätze ausspucken lassen. Der Code ist schon sehr weit, er sollte also bald Opensource auf Github kommen.
Wenn ich scotty fertig programmiert habe, werde ich nochmal alles genauer beschreiben

Veröffentlicht unter Programmieren/Skripten | Hinterlasse einen Kommentar

Qt Entwicklung

! Um schnell jedwege Hoffnungen auf Codebeispiele zu nichte zu machen: In diesem Beitrag wird es kein Codebeispiel geben !

Heute ist der 05.05.2016, es ist also Vatertag, ich habe keine Schule. Das bedeutet: Endlich mal wieder Zeit mich in mein C++ Buch zu vertiefen.
„Der C++ Programmierer“ in der vierten Auflage von Ulrich Breymann gleicht nunmal wirklich eher einer zu dick geratenen Nerdbibel als einem Taschenlernbuch für zwischendurch, deswegen muss ich mich oft überwinden mich in das Buch zu vertiefen. Aber das soll nun kein Review über das Buch werden, sondern Qt behandeln.

Was ist Qt?

Qt ist eine Bibliothek für C++, die es ermöglicht Grafische Benutzeroberflächen bzw. Grafische Schnittstellen zu programmieren. Qt verwendet einen Präprozessor, genannt MOC (meta object compiler), womit C++ um Fähigkeiten bereichert wird, die im Sprachstandard nicht enthalten sind (Zitat Wikipedia)

Was mache ich gerade damit?

Noch nicht viel, so viel ist klar. Ich habe bis jetzt nur aus dem Buch gescriptkiddied und ein bisschen rumprobiert. Ich bin ja erst kürzlich wieder in C++ eingestiegen, aber es macht mir zur Zeit so viel Spaß wie schon lange nicht mehr. Das letzte Projekt, dass ich nun mit Qt gemacht habe war ein simples kleines Fenster, dass du schließen konntest. Wenn du es schließen willst, wirst du gefragt, ob du Speichern willst.
(Klar, es gibt nix zum speichern, aber alleine die Möglichkeit zu haben ist immer gut!)

Es ist ein bisschen kompliziert und ich werde noch viel damit üben müssen, aber das ist für mich eindeutig das Ziel für dieses Jahr. Ich bleibe bei C++ und versuche mich an Grafischen Oberflächen.

Veröffentlicht unter Programmieren/Skripten | Hinterlasse einen Kommentar