Java verteilt mit Kilim schnelle Nachrichten
Gregor Ottmann | Juni 27, 2008 on 9:53 am | In Know-How, Tools | No CommentsKennt Ihr dieses komische Gefühl, das einem beim Lesen eines Papers oder Verfolgen eines Vortrags überfällt? Dieses ungeile Gefühl, dass so ungefähr jeder Softwaremuckel da draußen so viel krasser als man selbst drauf ist, dass einem davon komisch wird? Nein? Dann schaut Euch mal den Vortrag über Message Passing mit Java und der Library “Kilim” an, den MHenze mir empfohlen hat.
OK, ich kriege nicht wirklich Komplexe, weil ich immerhin in der Lage bin, sowohl das Problem als auch den Lösungsansatz zu begreifen - nur komme ich mir irgendwie minderwertig vor, weil ich noch nie ein Problem hatte, das so einen wunderbar abstrakten, abgehobenen und irgendwie erregenden Lösungsweg erfordert hätte. Es sieht so aus, als müsste ich mir dringend ein paar ausgefallene Probleme, einen abgefahrenen Akzent und einen Satz wirklich feiner Ideen besorgen, um mich selbst wieder richtig ernst nehmen zu können.
Ach ja, einen direkten Link zur Projektpage von Kilim kriegt Ihr natürlich auch noch. Ich bin ja nicht so.
Wenn die PHP-Session rumspinnt
Gregor Ottmann | April 18, 2008 on 7:20 am | In Know-How, PHP | No CommentsIch war noch nie in der Situation, eine Website bei einem kommerziellen Horster horsten lassen zu müssen, aber für die, denen keine andere Wahl bleibt, könnte ich eventuell einen guten Tipp haben. Der Maxx hat nämlich heute eine Mail rumgeschickt, die den Eindruck macht, so manche schlaflose Nacht vermeiden zu können:
Falls jemand mal das „Vergnügen“ haben sollte, eine Webanwendung auf einem Server eines der ganz großen deutschen Hoster zu betreiben und die PHP-Sessions mit ihm Lotto spielen sollten (das muss man auch erstmal merken), dann erspart Ihr Euch mit folgender Zeile in einer eigenen php.ini evtl. wertvolle Freizeit, erhaltet Eure Nerven und könnt die gewonnene Zeit für ein leckeres Bier nutzen:
session.save_path=/home/strato/www/<first-two-letters-of-domain>/<domain>/htdocs/sessions
Der Fehler ist nie wirklich reproduzierbar und die „aktive“ Session wird anscheinend mit dem ganz großen Würfel bestimmt. Meine Spekulation wäre ja, dass das /tmp Verzeichnis des Servers einfach voll ist (Anzahl Filehandles oder auch Inodes). Was aber doch verwunderlich ist, ist dass das dann keinen Fehler schmeisst, sondern scheinbar toll funktioniert… nur eben mit einer Zufalls-Session.
Uuh, klingt ungroovy, also gar nicht tofte. Vor allem würde ich das für einen dieser Fehler halten, die einen mangels Reproduzierbarkeit ganz locker in klinische Zustände treiben können, und das muss ja nicht sein.
SDL: XML für die, denen JSON nicht exotisch genug ist
Gregor Ottmann | April 14, 2008 on 11:35 am | In Know-How, Vermischtes | No CommentsDu besitzt einen Mac und weigerst Dich standhaft, in reinen Microsoft-Umgebungen auch mal einen Windows-PC zu verwenden? Du würdest Dich lieber von einer Klippe stürzen, als eine Webapplikation mit J2EE oder .Net statt mit Ruby, Python oder INTERCAL zu realisieren? XML war für Dich nie ein Thema und JSON ärgert Dich inzwischen damit, dass es nicht mehr hip und obskur genug ist? Du bezeichnest jedes Programm, dass von mehr als 2 Leuten auf dem Planeten verstanden wird, als “Mainstreamkacke”?
Du solltest Dir unbedingt mal SDL ansehen, das wird Dir gefallen.
Sharepoint und die Downloads aus dem Web Part
Gregor Ottmann | April 10, 2008 on 3:08 pm | In .Net, JavaScript, Know-How | No CommentsEigentlich ist die Anforderung ganz einfach und keineswegs unüblich: Man will auf einer Website irgendeine Datei dynamisch generieren, beispielsweise einen Excel-Report, die man dann per Klick auf einen Button zum Download anbietet. Sowas ist im Regelfall nicht schwer, außer natürlich, wenn man ein “Web Part” für Sharepoint baut. Wenn man das tut ist, wie ich inzwischen weiß, ziemlich vieles schwer, schmerzhaft und generell mehr oder weniger unbefriedigend.
An sich ist die Sache aj auch in ASP ganz easy und in vielen Blogposts beschrieben, beispielsweise bei den Dotnetslackers. Das Problem ist nur, dass bei diesem Ansatz die Datei erst nach einem Postback generiert und an den Client geschickt wird, dieser Postback aber das momentan angezeigte Formular nicht neu vom Server lädt. Problem? Wieso Problem?
Ganz einfach: Sharepoint meint es gut mit uns und sorgt per JavaScript dafür, dass Formulare nicht öfter als einmal abgeschickt werden können, beispielsweise durch amokklickende Benutzer. Das führt dazu, dass nach dem Download der Datei das Formular hinüber ist, d.h. es nicht mehr abgeschickt werden kann, weil es ja schon mal abgeschickt wurde. Sehr blöde, und die Lösungen, von denen ich gelesen habe, waren allesamt extrem kompliziert zu implementieren, weil sie irgendwelche speziellen Download-Handler vorgesehen haben. Mensch, Leute, ich habe eine Deadline und nicht beliebig viel Budget - ich brauche eine EINFACHE Lösung. Meinetwegen auch einen kleinen Hack.
Einen solchen Hack habe ich dann auch hinbekommen. Diese Resubmit-Sperre wird von Sharepoint nämlich im onsubmit-Handler des Formulars aufgerufen, so dass man nur beim Klick auf den Downloadbutton genau diesen Handler wegschießen muss:
exportButton = new Button();
exportButton.Text = “Generate some Excel stuff”;// the handler method generates the file, writes it to the response and ends the response.
exportButton.Click += onExcelExportClicked;// erase the form’s onsubmit handler when the button is clicked
exportButton.OnClientClick = “this.form.onsubmit = function() {return true;}”;
Hässlich, ja, und eventuell auch gefährlich, wenn man nicht aufpasst, aber es funktioniert. Die nächste Verbesserung wird sein, dass ich irgendwie nach dem Download den ursprünglichen onsubmit-Handler wieder herstelle oder so - aber das mache ich erst, wenn ich es brauche.
(Nur, falls irgendwer sich wundert: Das Posting mit dem identischen Codebeispiel im MSDN-Forum ist nicht geklaut, sondern auch von mir.)
Confusion by Extension: Extensionsmethodierung im Scharf-C
Gregor Ottmann | März 17, 2008 on 10:04 am | In .Net, Know-How | 1 CommentDer einfachste Weg, um schönen Code komplett unverständlich zu kriegen, ist meiner Meinung nach definitiv AOP, d.h. aspektorientierte Programmierung. Diese total hippe Möglichkeit, um Code gewissermaßen um 90° versetzt zur Klassenhierarchie zu pflegen und mehr oder weniger deklarativ an Stellen einzubringen, mit denen man nicht gerechnet hätte, kann mit Fug und Recht als “das neue GOTO” bezeichnet werden. Finde ich zumindest, und meine Meinung ist bekanntlich reichlich normativ.
Man kann sich also vorstellen, wie glücklich ich war, als ich gemerkt habe, dass Microsoft in C# mittlerweile eine spezielle Delikatesse namens “Extension Methods” anbietet. Das sind Methoden, die sich mehr oder weniger automatisch an Instanzen bestimmter Klassen hängen und so tun, als wären sie Teil der Klasse. Ja, das ist gewissermaßen AOP Deluxe: Die gesamte Verwirrung und Unverständlichkeit der AOP, nur nicht so mächtig wie AspectJ oder vergleichbare S/M-Technologien. Genial, das muss ich in Zukunft in jedem einzelnen Stück Code verwenden, von dem ich sicher weiß, dass es zukünftig nur von anderen gepflegt werden muss, nicht von mir selbst.
Ah, fast vergessen - einen Link gibt es ja auch noch: Extension Methods bei MSDN. Go and knock yourselves out.
Von Typen mit Strings und assemblierter Sicherheit
Gregor Ottmann | Februar 10, 2008 on 7:40 pm | In .Net, ASP.NET, Know-How | No CommentsPicture it: Sicily, 1922. A beautiful young girl meets an american guy who wants to make every single developer in the world throw up continuously. The girl was me and the guy was Bill Gates…
So oder ähnlich denkt man, wenn man a) zuviele Folgen der Golden Girls gesehen hat und b) gerade mit .NET arbeitet. Zumindest dann, wenn man gerade folgende Situation hatte:
- Ein WebPart enthält einen GridView mit einer ObjectDataSource, die auf ein eigenes DAL verweist
- Das Part funktioniert in ASP-Seiten
- Das Part funktioniert im Sharepoint mit voller Pulle Trustlevel
- Das Part fliegt mit einem Hinweis, dass die DAL-Klasse nicht gefunden wurde, auseinander, wenn man es im GAC installiert.
Des Rätsels Lösung war ganz einfach, wenn man nur weiß, wo man suchen muss. Wir hatten diesen Code (den ich aus einem Tutorial kopiert hatte) im Part:
ObjectDataSource ods = new ObjectDataSource();
ods.EnablePaging = true;
ods.SelectMethod = “getItems”;
ods.SelectCountMethod = “GetTotalItemCount”;
ods.SortParameterName = “sortExpression”;
ods.TypeName = typeof(AreDal).ToString();
Die letzte Zeile musste wie folgt geändert werden, damit das Mistding vernünftige Klassennamen mit Assembly-Namen und Public-Key-Dingsbums ausspuckt:
ods.TypeName = typeof(AreDal).AssemblyQualifiedName;
NA DANN! Wieso ist das ToString bei dem Mist eigentlich nicht gleich so implementiert, dass es ordentlich funktioniert? Kann mir das irgendwer verraten? Nein? Naja, auch egal, ich hab’s ja jetzt.
SQL Server 2005, ein anderer Port und das Management Studio Express
Gregor Ottmann | Januar 24, 2008 on 1:01 pm | In .Net, Datenbanken, Know-How | No CommentsWenn man einen SQL-Server hat, auf dem mehrere Instanzen laufen, kriegt jede Instanz einen eigenen Port. Wenn man nun mit dem Management Studio Express auf eine der Instanzen will, muss der SQL Browser auf dem Server laufen, damit die Kisten untereinander den Zielport auskaspern können. Blöde, dass sogar MS selbst diesen SQL Browser als Sicherheitslücke bezeichnet - was macht man also?
Ganz einfach, man gibt den Port einfach in der DB-URL an, also typischerweise so:
hostname.domain.de:4711\InstanzName
Nein, natürlich nicht. Das wäre ja die Standardnotation, und bekanntlich mag Microsoft keine fremden Standards. Den abweichenden Port muss man deshalb mit einem KOMMA trennen, nicht mit einem Doppelpunkt… Der korrekte Hostname sähe also so aus:
hostname.domain.de,4711\InstanzName
Ja, leckt mich doch… Bis ich das raus hatte, hatte ich mal wieder eine ganze Reihe neuer grauer Haare. Die Rechnung für das Haarfärbemittel schicke ich auf jeden Fall an Microsoft, Abteilung “Anwenderverwirrung”.
Wie man eine .Net-Assembly nachträglich signiert
Gregor Ottmann | Dezember 17, 2007 on 3:28 pm | In .Net, Know-How | No CommentsDa habe ich doch heute ein brauchbares Datepicker-Control gesucht und, es geschehen noch Zeichen und Flundern, tatsächlich eines gefunden. Das Datepicker-Dings von Graymatter ist nämlich klein, einfach zu nutzen und ziemlich exakt das, was man so braucht. Tofte. Also habe ich es in mein Projekt gedingst und mal eine frische Compilation angestoßen. Wuppwupp.
Nix “wuppwupp”. Mein Projekt wollte eine signierte Assembly (”strong-named”, wie wir Experten das nennen) bauen, aber leider war die DatePicker-Assembly nicht signiert. Arglgnagnabarfzgna. Da stand ich dann also und durfte mich fragen, was und warum und wie und ob ich jemals wieder Java benutzen darf.
Manche Probleme sind zum Glück nicht ganz so gravierend, wie sie zunächst aussehen. Als elitärer Google-Master bin ich nämlich auf einen Blogpost gestoßen, der eine ganz einfache, wenn auch etwas hackerige Lösung enthielt:
ildasm /tokens /out=unsignedAssembly.il unsignedAssembly.dll
ilasm /dll /key=key.snk unsignedAssembly.il /out=signedAssembly.dll
Die Assembly zu disassemblieren und dann wieder zusammenzuklatschen ist zwar irgendwie leicht gewagt - aber was kratzt mich das, solange es nur funktioniert? Nicht die Bohne, genau.
Wie man aus einem int wieder ein C#-Enum-Objekt macht
Gregor Ottmann | Dezember 14, 2007 on 9:45 am | In .Net, Know-How | No CommentsDieses schon mal vorweg: ASP.Net hinterlässt bei längerer Benutzung schwere Gehirnschäden, folglich muss bei mir mit dem Schlimmsten gerechnet werden. Falls ich demnächst nur mit einer über den Kopf gezogenen Damenunterhose bekleidet und laut “Microsoft! Microsoft!” brüllend durch die heiligen Hallen der SKYTEC AG hüpfen sollte, weiß man also, woran das liegen könnte. Soviel zur Einleitung, kommen wir zum Thema:
Ich brauchte für eine Dropdown-Liste die Werte eines enum-Typen, was ziemlich Easy ist: Man kann jedes enum-Dings einfach nach int casten, schon hat man was, was man in ein Dropdown frickeln kann. Das sieht etwa so aus:
myListBoxDings.Items.Add(FrickelEnum.Burfz.toString(), ((int)FrickelEnum.Burfz).toString());
Yep, ganz easy. Blöderweise musste ich jetzt aber den Wert aus der Liste in eine andere Methode stopfen, und die erwartet als Parameter keinen string, kein int, nein - einen enum-Wert. Gnarfzgagagagaga. Damenunterhose. “Microsoft! Microsoft!”
Was für versierte .Net-Profis (erkennbar an der Damenunterbekleidung) kein Problem ist, hat mich erstmal ziemlich genervt, bis eine kleine Google-Recherche gezeigt hat, dass das alles kein Problem ist, solange man nur weiß, wie es geht:
FrickelEnum brunf = (FrickelEnum)Enum.ToObject(typeof(FrickelEnum), Int16.Parse(myListBoxDings.SelectedValue))
Ha! Geht doch! Damit kann ich mich jetzt der eigentlichen Logik widmen und schon mal über den nächsten Artikel nachdenken, der den Titel “WCF ist Microsofts Version von WTF?!?” tragen wird. Ob dieser jemals geschrieben wird, hängt allerdings wohl davon ab, wie meine Chefs zur Frage des Beschäftigungsverhältnisses für nackte Entwickler mit Tangas auf dem Kopf stehen. Microsoft! Microsoft!
(Falls es jemand wissen will: Das Ergebnis der besagten Google-Recherche war dieser hilfreiche Artikel hier.)
ASP.Net, ein Custom Control, eine DataTable und ein GridView - Sortieren für Masochisten
Gregor Ottmann | November 23, 2007 on 1:38 pm | In .Net, ASP.NET, Know-How | No CommentsDer Tag hatte so schön angefangen: Es war mir gelungen, ein paar Web Parts zu stricken, die im Zusammenspiel ein originelles Anmeldeschema, das vom Kunden vorgegeben wurde, korrekt umsetzten. Ich hatte einen WCF-Webservice korrekt angebunden und rausgefunden, wie man alle Ausgaben elegant lokalisiert. Die sprichwörtliche Sonne war damit beschäftigt, mir aus dem ebenso sprichwörtlichen wie dicken Arsch zu scheinen.
Der Moment, an dem es mit diesem schönen Freitag massiv bergab ging war der, in dem ich ein Custom Control bauen wollte, welches in einem Web Part eingebunden werden sollte und in dem eine Tabelle mit Werten angezeigt werden sollte - ein GridView, wie wir Möchtergern-Experten es gerne nennen. Weil die Applikation ja sauber aufgebaut ist, konnte das seine Daten nicht direkt aus einer SQLDataSource holen sondern aus einer selbstgebauten DataTable. Das ging sogar, doch beim Klick auf einen der Sortierlinks in der Titelzeile flog alles auseinander. Zwei Stunden später wusste ich immer noch nicht, wieso der Kram nicht sortieren wollte und der Tag war dort, wo vorher die immer noch ziemlich sprichwörtliche Sonne herauszuscheinen beliebte.
Weitere zwei Stunden später ging die Sonne wieder auf, denn ich hatte ein sehr hilfreiches Forenposting über GridView, DataTable und die verdammte Sortierfunktion gefunden. Ein wenig kopierter Code, und schon konnte ich sortieren. Aufsteigend. Andersrum nicht, wieso auch immer.
Also tat ich, was ich gleich hätte tun sollen, und las besagtes Posting etwas weiter, nämlich bis zu dem Punkt, wo andere mein Problem hatten und der ursprüngliche Auto sich erbarmte, nochmal nachzuarbeiten - das Ergebnis dieser Nacharbeit findet man auf dieser Seite hier, allerdings rafft man es nicht, ohne das Posting gelesen zu haben. Macht nix, zur Not reicht kopieren ohne Peilung auch aus - solange das GridView nur sortiert.
Fazit 1: Du sollst das Control nicht vor dem GridView loben.
Fazit 2: DataTables lassen sich nicht ohne fremde Hilfe sortieren.
Fazit 3: Ich gehe jetzt heim, bevor ich noch auf die Idee komme, meinen Fileupload zu testen…
Entries and comments feeds.
Valid XHTML and CSS. ^Top^
:RSS2-Feed