.NET Tipps 5: Optionale Parameter und Params sind keine gute Idee

Mal wieder ein neuer .NET Tipp!

C# hat ja so nette Funktionen wie optionale Parameter und „params„. Beide für sich sehr praktisch, mit dem ersten kann man Parametern Default-Werte mitgeben, die benutzt werden, wenn der Parameter nicht angegeben wird. Mit dem zweiten kann man einen Parameter kennzeichnen, der ein Array erwartet, statt diesem kann man dann auch einfach eine Kommata-getrennte Liste angeben.

Nur beides zusammen ist keine gute Idee: Ich hatte diese Funktion, welche eine optionale Sequenznummer erwartet, sowie eine Liste von NiboCommand-Objekten:

Weiterlesen

Ein Kartengeber aus fischertechnik

Diesmal eine kleine Vorgeschichte: Bei uns bei uniKIK gibt es immer jede Menge Flyer, und diese Flyer müssen meisten in Packen von ca. 15 an die ganzen Schulen verschickt werden. Von der Druckerei kommt aber nur ein großer Haufen, also müssen die Flyer in einer wahnsinnig spannenden Aktion abgezählt werden. Langweilige Arbeit? Das kann doch auch eine Maschine machen, dachte ich mir 😉IMGP1869

Weiterlesen

PHP: htmlentities() zerstört UTF-8

htmlentities() ist ja eine Recht nette PHP Funktion um schnell das ganzen HTML aus einem String zu bekommen, weil man den z.B. (als Code) ausgeben möchte. Aber: Die Funktion macht UTF-8 kaputt! Also muss man entweder sowas wie utf8_decode(htmlentities($str)) machen, oder man schaut sich die Argumente noch mal genau an, und stellt fest, dass man das Charset auf explizit angeben kann. Diese Variante lässt UTF-8 am Leben:


htmlentities($str, ENT_COMPAT | ENT_HTML401, "UTF-8");

Weiterlesen

Segementation Fault unter Linux/Mac debuggen

Für die Uni muss ich ja nun viel C schreiben, und da gibt es ja nun mal diese wunderbaren Pointer. Sollte man davon mal eine falsch setzen bricht das Programm ab, und es gibt eine wunderbare Fehlermeldung: Segementation Fault: 11. Jetzt heißt es also, den Fehler mit jede Menge printf() eingrenzen und nach sehr viel Suchen dann evtl. auch finden.

Nach den ich heute mal wieder einen Pointer falsch hatte, habe ich mal nachgesehen, ob es nicht auch einfacher geht… Geht es natürlich… Also eine kleine Anleitung! Ich habe extra für euch ein Programm mit Fehler gebaut: Sowas würde mir sonst natürlich nie passieren 😉

Was nun? Als ersten müssen wir dem Betriebsystem sagen, dass es einen Speicherdump (coredump) erstellen soll, wenn ein Programm abstürzt. Die Dinger werden ziemlich groß, deswegen ist das normalerweise ausgeschaltet. Um es für die akutelle Shell zu aktivieren geben wir ulimit -c unlimited ein. Damit wird bei nächsten Absturz ein core-dump erstellt. Damit kommen wir schon recht weit, doch wir können das Programm noch im Debug-Modus kompilieren, damit wir noch besser sehen, was da schief gelaufen ist. Dazu einfach gcc den Parameter -g mitgeben (ja, clang kann das auch). Danach lassen wir das Programm wieder abstürzen:Na, aufgepasst? Da steht jetzt (core dumped). Nun schauen wir mal in den Ordner /cores, dort liegt unser core dump! Und er ist (für dieses einfache Programm) >300 MB groß! Das war das, was ich oben meinte…

Weiterlesen

Mein Timetracker

An der Uni habe ich ja nun einen Hiwi-Job, und da sollte man natürlich die Stunden aufschreiben, die mal so arbeitet. Seit ich vor zwei Monaten dort angefangen habe, hatte ich vor, mir dafür ein „kleines“ PHP-Script zu schreiben, damit sich von jedem Rechner aus meine Stunden aufschreiben kann. Nun ist das ganze fertig, und ich finde, es ist gar nicht so schlecht geworden:

Das meiste sind natürlich fertige Sachen, im Hintergrund ist jede Menge jQuery, die Tabelle ist ein jQuery Plugin, Der Datumswähler und der Button unten stammt aus jQuery UI. Das ganze läuft über PHP und MySQL, und ist schön „ajaxifisiert“, sprich kein Neuladen der Seite 😉

Weiterlesen

.NET Tipps 4: Test auf mehrere Werte

Naja, so richtig ist meine „Serie“ nicht in Fahrt gekommen… Der letzte Teil ist auch schon wieder etwas her 😉

Diesmal geht es um etwas, das mich immer richtig nervt: Ab und zu muss man einen Wert auf jede Menge Möglichkeiten testen. Doch dummerweise muss man den Wert immer wieder hinschreiben:

if(meinTollerWert == "mglk1" || meinTollerWert == "mglk2" ||meinTollerWert == "mglk3")
{
MessageBox.Show("1,2 oder 3!");
}

Ziemlich nervig sowas…

Doch es geht einfacher, wie mir vor kurzem aufgefallen ist, den implizit typisierten Arrays sei Dank:

if(new[] {"mglk1", "mglk2", "mglk3" }.Contains(meinTollerWert))
{
MessageBox.Show("1,2 oder 3!");
}

Weiterlesen

Aprilscherz: Post-mortem

Ja, schon wieder ein dummer Titel, ich weiß…

Nach dem ja nun wohl jeder begriffen hat, das mein letzter Post ein Aprilscherz war, interessiert den einen oder anderen ja vielleicht auch die Technik dahinter. Die ist nämlich ziemlich interessant.

Die erste Frage war, wie komme ich an die Posts meines Blogs. Als erstes hatte ich überlegt einfach die letzten fünf fest in die Seite einzubauen, aber das fand ich dann doch langweilig. Dann erinnerte ich mich daran, das ich mal etwas über die wp-load-php gelesen hatte. Wenn man diese Datei in ein PHP-Script einbaut, wird WordPress komplett geladen, aber ohne eine Ausgabe zu erzeugen. Jetzt kann man quasi ein WordPress Theme nachbauen. Der folgende Code steckt hinter der Seite:

Weiterlesen

Dropbox-Backup ohne Client

Der offizielle Dropbox Client unter Linux hat ja ein paar kleine Speicherprobleme (und auch andere Probleme), daher hab ich mich nach einer anderen Lösung umgesehen, meine Backups in die Dropbox zu schieben. Den ersten Ansatz habe ich auf der Seite von Andrea Fabrizi gefunden: Dort gibt es ein Script, mit dem Uploads in die Dropbox auch ohne Client möglich sind.

Das Script lädt die Datei mit cURL über die offzielle Website hoch. Nicht wirklich eine saubere Lösung, funktioniert aber perfekt. Naja, fast: Über die Website sind nur Uploads bis 150MB möglich, meine Backup-Zips sind aber inzwischen schon 188MB groß (ich blogge zu viel ;)). Daher habe ich mir ein kleines Script gebastelt, das die Dateien durchgeht, und alle die größer als 100MB sind, mit Hilfe von split in Teile á 100MB schneidet. Dabei wird dann einfach ein fortlaufender Buchstabe an den Dateinamen angehängt. Dazu habe ich das Upload Script noch so modifiziert, das es Dateien, die größer als 100MB sind, gar nicht erst hoch lädt (da sie eh nicht verarbeitet werden).

Weiterlesen

Warnung vor func_instance_origin

Nur ein kleiner Tipp für alle Portal 2 Mapper, die mit Hammer (dem Editor) eigene Instances bauen wollen: Laut dem Wiki soll man ein func_instance_origin benutzen, um die Mitte der Instance anzugeben. Offensichtlich beachtet aber entweder Hammer oder VBSP (der Compiler), das Ding nicht richtig, wodurch die Instance im Spiel dann gegenüber der Anzeige in Hammer verschoben ist. Kann ziemlich nervig sein 😉

Lösung: Einfach alle so verschieben, dass der Koordinatenursprung in der Instance da ist, wo man ihn haben will…

DynamicLua

So, ich denke es ist Zeit, die Katze aus dem Sack zu lassen, und mein neues Projekt vorzustellen: DynamicLua

Kurz ein paar Worte zum Hintergrund: Mit .NET 4.0 wurde die sog. Dynamic Language Runtime (DLR) eingeführt. Die dient zum einen dazu, es Entwicklern einfacher zu machen, neue Sprache auf .NET Basis zu entwickeln (wie IronPython/IronRuby), hat aber auch ein paar tolle andere Features zu bieten. Eines davon ist das neue Schlüsselwort „dynamic“. Es funktioniert ähnlich wie „var“ kann also jeden Typ annehmen. Wenn man darin aber ein Objekt speichert, das von System.Dynamic.DynamicObject abgeleitet ist, kann man bestimmen was passiert, wenn etwas „nicht erlaubtes“ passiert, also wenn z.B. eine Methode aufgerufen wird, die es gar nicht gibt. Solche Aufrufe landen dann bei der Methode TryInvokeMember, und die kann dann entscheiden, was passieren soll.

Dieses Konzept habe ich jetzt genutzt, um einen Wrapper für das LuaInterface zu schreiben. Das Lua Interface ist eine Library für .NET, die es erlaubt, Lua in C# zu benutzen. Dabei kümmert sie sich auch darum, .NET Objekte in Lua abzubilden und vieles mehr. Diese Library ist wirklich unglaublich, man denkt wirklich, Lua hätte was mit Objekten am Hut.

Weiterlesen