Tipp: Schöner RegEx-Tester

Ja, es gibt circa 100.000 Websites, auf denen man reguläre Ausdrücke testen kann, aber eine finde ich besonders schön:

http://regex101.com/

RegEx101 heißt die Seite, und hat ein paar schöne Features:

  • Man kann die (Programmier-)Sprache einstellen, leider gibt es (noch) kein .NET, aber die PHP-Syntax ist sehr ähnlich
  • Man kann Flags setzen
  • Es gibt die übliche Kurzhilfe, aber auch eine etwas längere Version.
  • Es gibt ein relativ gutes Syntax-Highlighting
  • Ganz toll: Es werden die gefundenen Matches (also der Gruppen) angezeigt. Das habe ich lange gesucht!
  • Die Seite hat einen Code-Genrator, der auch C# kann, auch wenn man den jetzt nicht wirklich braucht…

regexEin weiteres nettes Feature ist der Debugger, der anzeigt, in welchen Schritten die Engine den Text absucht. Auf die Weise findet man schnell Fehler bei denen zu viel „gefressen“ wird. Leider ist die Seite nicht besonders schnell, vermutlich wird der RegEx per AJAX auf dem Server ausgeführt… Wer eine schnellere Alternative sucht (die ich bis jetzt benutzt habe): http://regexpal.com/ Sehr schnell (weil in JavaScript), versteht aber die .NET Eigenheiten nicht und kann auch die Matches/Gruppe nicht anzeigen. Darum habe ich eine neue Seite gebraucht…

Weiterlesen

.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

.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

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

Statusupdate 2

Mal wieder ein paar Dinge, an denen ich grade so arbeite:

Zum einen ist da YaME: Yet another Minecraft Engine. Hier ein kleines Video:

Ich wollte mal etwas in 3D mit XNA machen, und habe aus Spaß dieses Projekt angefangen. Momentan gibt es schon endlose Landschaften (zumindest bis der Speicher voll ist ;)), und die Framerate ist noch akzeptabel. Ich werde wohl zumindest noch bessere Grafiken und etwas Physik einbauen, zusammen mit einem besseren Renderer (Octrees und Occlusion Culling wäre super)

Dann bin ich grade dabei das LuaInterface um die Fähigkeiten der DLR zu erweitern. Microsoft hat mit .NET 4 eine bessere Interoperabilität mit Scriptsprachen eingebaut: Mit dem Schlüsselwort „dynamic“ kann man Objekte definieren, die z.B deren genaues „Aussehen“ erst zu Laufzeit festgelegt wird. Außerdem ist es damit möglich viele expliziete Konvertierungen wegzulassen. Das passt natürlich wunderbar zu Lua, und dem LuaInterface, mit dem man schon jetzt sehr elegant aus .NET auf Lua zugreifen kann. Kleines Code-Beispiel gefällig?

Weiterlesen

E-Münzbrett.NET

Nachdem Nico ein virtuelles Münzbrett für Mac OS geschrieben hat, habe ich leichtsinnigerweise behauptet, ich würde eine .NET Variante mit MonoDevelop unter Ubuntu machen. Was soll ich sagen schreiben? Ich bin froh, das ich mein Visual Studio habe 😉

MonoDevelop ist ansich ein tolle Software, die sogar VisualStudio 2008 kompatible Solution-Dateien schreibt. Leider wird unter Linux normalerweise das GTK# Toolkit verwendet, was sowas wie WinForms ist. Das funktioniert aber nur, wenn unter Windows die passende DLL vorhanden ist. Ich hatte mir aber vorgenommen, ein Programm zu schreiben, das unter Linux und Windows läuft, und dass ohne neu kompilieren oder zusätzliche Binaries.

Also musste ich WinForms verwenden, was in Mono auch relativ implementiert ist. Nur leider fehlt MonoDevelop der Designer dafür, sodass ich alles per Hand schreiben muss. Mit einem Designer würde man z.B. die Textboxen einfach ausrichten, ohne muss man das mit einem TableLayoutPanel machen. Und bis man das so konfiguriert hat, wie man sich das vorstellt wünscht man sich den Designer mehr als einmal zurück, glaubt mir. (Ich habe überings nicht bis jetzt daran gearbeitet, ich habe nur vergessen, darüber zu bloggen. Aber etwas mehr als die 20min hat es schon gedauert…)

Weiterlesen

.NET Tipps Teil 3

Ich hab ja schon ewig keine Tipps mehr zu .NET gegeben, da wird es ja mal wieder Zeit für eine neue „Folge“ 😉

Diesmal ist es nicht direkt ein Tipp, sondern mehr ein Hinweis:

Bei Bitmap.Clone(Rectangle, PixelFormat) ist eine OutOfMemoryException nicht, was man denkt!

Diese Tatsache wird zwar auch in der Dokumentation erwähnt, aber es hat mich jetzt schon zweimal fast zur Verzweiflung getrieben. Bitmap.Clone() verursacht eine OutOfMemoryException, wenn das Rectangle außerhalb der Bitmap liegt. Dann ist das Rectangle zwar auch „außerhalb des Speichers“, aber trotzdem ist das sehr unglücklich gewählt. Zudem zeigt das VisualStudio dann auch noch „Nicht genügend Abeitsspeicher“ an. Das ist natürlich schlichtweg falsch!

Also nicht verzweifeln, sondern das Rectangle noch mal überprüfen 😀

Weiterlesen

XNA 4.0 CTP verfügbar

Vor einigen Tagen hat Microsoft eine neue Version von XNA öffentlich gemacht: XNA 4.0! Leider nur eine CTP Version, also quasi eine Beta. Konkret bedeutet das, dass man nur die Windows Phone Features verwenden kann. (Auf allen Plattformen).

Hier mal eine kleine Liste an Änderungen, die mit XNA 4.0 kommen werden:

  1. Kein Zune Support mehr. Legt nahe, das der Zune Nachfolger mit Windows Phone 7 laufen wird (nur ohne Telefon)
  2. Nur noch zwei Profile: Reach und HiDef. Reach kann jedes XNA Gerät. und nur manche (XBox und gute PCs) könne HiDef. Macht es zwar einfacher, das Spiel auf dem PC an die Leistung des Geräts an zu passen, aber ich finde, die Einteilung in nur zwei Profile ist etwas heftig, finde ich. tKoD z.B. braucht HiDef, weil Reach keine eigenen Shader zulässt… (aber die wollte ich sowieso de aktivierbar machen) Mehr Infos gibst hier
  3. StorageContainer.TitleLocation wird mit einer OpenStram API ersetzt (?)
  4. Statt der RenderStates gibt es eine neue State Object API
  5. Vormultipliertes Alpha ist jetzt Standart
  6. SpriteBatch kann jetzt einfacher mit eigenen RenderStates uns eigene Shadern benutzt werden.
  7. SpriteBatch Text kann einfacher ein einer 3D Welt untergebracht werden.
  8. VertexBuffer sind jetzt streng typisiert.
  9. Die VertexDecalration wird jetzt aus dem VertexBuffer entnommen.
  10. VertexBuffer Größen werden jetzt nicht mehr in Bytees angegeben.
  11. GraphicsDevice.Vertices wurde mit einer neues SetVertices API ersetzt.
  12. Jedes RenderTarget hat jetzt einen eigenen DepthBuffer, kein DepthStencilBuffer Type mehr. (?)
  13. RenderTarget2D ist jetzt von Texture2D abgeleitet. (kein GetTexture mehr) (!)
  14. SetRenderTarget setzt jetzt alle RenderTarget.s (?)
  15. Effect.Begin & End wurden durch Apply ersetzt.
  16. Kein LowLevel Zugriff mehr auf die Vertex und PixelShader mehr (nur noch als Effect-Instanz).
  17. EffectPool (!) StateBlock (?), GammaRamp (?) und ClipPlane wurden entfernt.
  18. TriangleFans wurden entfernt.
  19. PointSprites wurden entfernt (!)
  20. Der ColorType speichert jetzt intern RGBA statt BGRA.

Diese Liste basiert zum Großteil auf der hier.

Weiterlesen

Mehrsprachige Anwendungen .NET?

Während der Entwicklung von SimpleScreenshot habe ich mich auch mal nach Möglichkeiten umgesehen mehrsprachige Anwendungen mit .Net zu erstellen. Glücklicherweise hat Microsoft sich da was ausgedacht: Einfach eine Eigenschaft im Designer umstellen, dann jeweils die Sprachen eintragen, und schon ist die Anwendung übersetzt. Klingt doch toll, oder? Ist es auch, aber nur wenn man Anwendungen macht, die nur in bestimmten Sprachen ausgeliefert werden.

Nur was ist, wenn man mal (wie bei SimpleScreenshot) dem Benutzer die Möglichkeit geben möchte die Anwendung zu übersetzen? Ich habe dazu ein kleines System geschrieben, dass das ermöglicht. Das hat nur einen großen Nachteil: Man kann den Designer aus dem Visual Studio nicht mehr benutzen, und wenn man die Warnungen ignoriert, wird der gesamte Text von allen Steuerelementen gelöscht, und die ganze Übersetzung aus dem Code geschmissen!

Die „richtige“ Übersetzung, hat übrigens auch mein gesamtes  Formular zerstört… Diese Lösung ist für Anwendungen, die fertig übersetzt ausgeliefert werden sollen, sicherlich gut durchdacht, aber Microsoft muss IMHO auch mal an die „kleinen“ Privatprogrammierer denken, die die Anwender übersetzen lassen wollen. Auf Linux ist das Gang und Gebe!

Simple Screenshot 0.5

Was soll ich groß schreiben? Ja, es gibt wieder eine neue Version. Das dürfte aber erstmal die letzte sein, denn ich will auch mal mit The Kingdom of Darkness weitermachen.

Hier ist der Changelog:

  • Kontexmenü am Trayicon
  • Screenshot-Taste wählbar
  • Autostart Option
  • 32Bit Farben in den Vorschaubildern
  • Neues Icon
  • Regler zum Einstellen der Vorschaubildgröße
  • Doppelklick auf ein Bild öffnet es
  • Wenn ein String nicht in der Originalsprache gefunden wird, wird Englisch verwendet(statt Deutsch)

Es gibt aber auch ein paar bekannte Bugs:

Weiterlesen