Divis Blog

Just another geeks blog.

Content auf der Seite zentrieren

clock Januar 31, 2008 10:47 by author Divi

Immer wieder stand ich vor dem Problem, dass ich den Content einer Seite zentrieren musste.

Mein standardmäßiger Weg wurde deshalb ein <center>-Tag um die komplette Seite zu setzen und den Content dem entsprechend aufzubauen, dass er mit dem Tag zusammenarbeitete.

Ab und an kam mir aber immer mal wieder die Lösung unter, bei der die "margin"-Style-Eigenschaft zur Problemlösung verwendet wurde. Das Problem: Irgendwie funktionierte es manchmal - und manchmal nicht. Aber jetzt weiß wie es definitiv funktioniert:

margin:0 auto

Mit dieser Kombination sagt ihr der Seite "kümmer dich selber darum, dass die Seite links und rechts den selben Abstand hat - oben und unten brauchst du aber keinen Abstand".

Erklärung: Der erste Wert behandelt das margin-top und -bottom, während der zweite Wert -left und -right beeinflusst.

Damit aber die Seite auch wirklich zentriert wird, reicht es nicht aus diese Eigenschaft zu setzen, denn dann sagt sich der Browser: Dann nehm ich halt die ganze Breite des Bildschirms. Deshalb müsst ihr dem Content ebenfalls eine feste Breite geben:

width: Xpx (X = numerische Angabe der Breite)

Wenn ihr diese beiden Style-Eigenschaften dem umschließenden Content zugeweißt, zentriert sich dieser automatisch, egal wie breit ihr das Fenster macht.

 

AutoMargin

 

Hinweis: Wenn ihr übrigens mit dem oben genannten <center>-Tag arbeitet: Das funktioniert auch - allerdings richten sich dann alle Elemente in eurem Content entsprechend mittig aus. Das bedeutet, dass ihr Positionen anders bestimmen und ggf. allen Elementen ein text-align:left geben müsst.

Gib die erste Bewertung ab

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5


CryptographicException

clock Januar 21, 2008 18:34 by author Divi

Da ich heute bereits zum zweiten Mal auf diesen Fehler traf (das letzte Mal liegt schon einige Wochen zurück), dachte ich mir, dass ich ihn mal hier verewige:

Wenn die Fehlermeldungen "Bad Key" oder "Invalid handle" in Zusammenhang mit einer "System.Security.Cryptography.CryptographicException" bei euch fallen, solltet ihr zuerst einmal die Schreibrechte der Private-Key-Datei testen und im zweiten Schritt dann überprüfen, ob euer Zertifikat überhaupt die benötigten Werte enthält.

 

Mein Problem: Ich versuchte ein X.509-Zertifikat zu verwenden, um ein Saml-Token zu signieren. Dummerweise traten gleich an zwei verschiedenen Stellen Fehler auf, die ein unüberlegter Catch-Block (im Zusammenspiel mit einem nicht funktionierenden Logger) so verschleierte, dass eine längere Suche von Nöten war.

Beide Fehler traten übrigens beim Serialisieren des Tokens auf.

 

Zwei Probleme und ihre Lösungen:

Problem 1 - "Invalid handle": Dieser Fehler trat auf, wenn das Script nicht auf die Private-Key-Datei des Zertifikats zugreifen konnte. Der Benutzer "NETWORK SERVICE" braucht hier zumindest Leserechte.

Wie finde ich die Private-Key-Datei? Dazu gibt es von Microsoft eine schöne Sammlung namens WSE "Web Service Enhancements"... die Version, die meiner Ansicht nach am neusten ist, ist Version 3.0, wenn ihr auch bei Google zuerst auf die 2.0er Version stoßen werdet.

Diese Sammlung beinhaltet ein Tool namens "WSE X.509 Certificate Tool", mit welchem man durch einfaches Auswählen von Dropdowns und Buttons alle Details zu einem bestimmten Zertifikat erfahren kann. Hier zum Beispiel die Ansicht des Testzertifikats, welches ich mir ausgestellt habe.

image

Am unteren Ende des Tools, findet man einen Button "View Private Key File Properties", welcher einen direkt in den Eigenschaften-Dialog der entsprechenden Datei führt. Die neueren Windows-Systeme enthalten dort einen Reiter "Sicherheit", mit dem man direkt der Datei den entsprechenden Benutzer (in unserem Fall "NETWORK SERVICE") zuweisen kann. Sobald die Datei für das Script zugänglich ist, verschwindet die "invalid handle"-Fehlermeldung.

 

Problem 2 - "Bad key": Wer lesen kann ist klar im Vorteil, denn auch hier liefert das Tool eine direkte Erklärung:

image

Sobald das eine Feld links (siehe Bild 1) durch drei Felder (siehe Bild 2) ersetzt wird, erscheint rechts in der Beschreibung der Text "Wenn der Subject Key Identifier nicht vorhanden ist, werden drei Felder angezeigt". Hätte ich hier beim zweiten Anlauf richtig gelesen, hätte mir das einige Mühe erspart, denn das Zertifikat, dass ich mir habe ausstellen lassen, verfügte schlichtweg nicht über den sog. "Subject Key Identifier", welcher nötigt ist, um das Saml-Token zu authentifizieren. Sobald man ein Zertifikat mit dem oben genannten SKI besitzt, wird ganz sicher auch die Fehlermeldung verschwinden.

 

Die WSE Tools findet man auf der Microsoft-Download-Seite.

 

Einen kleinen Tipp hätte ich noch zur Hand. Wenn ihr eure Software gegen Zertifikate testen wollt, dann könnt ihr euch Zertifikate mit allen möglichen Kombinationen an Rechten mit einem Tool von EldoS namens "Crypto4™ PKI" erstellen. Dieses Tool ist kostenpflichtig, erstellt aber auch in der 30-Tage Testversion wunderschöne Zertifikate ;-).

Bewertung: 5.0 von 1 Benutzern

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5


Kane and Lynch Installer

clock Januar 20, 2008 15:00 by author Divi

Nachdem ich schon viel von "Kane and Lynch" gehört hatte und mir gerade ein wenig nach schwarzem Humor zu Mute war, dachte ich: "Hey, probier doch mal die Demo aus, die seit ein paar Tagen auf deinem Desktop liegt"... ich hab schon ganz schön Augen gemacht, als der Installer folgendermaßen aussah:

 

KaneAndLynchInstaller

 

Offensichtlich fehlt dem Installer irgendeine Lokalisierungsdatei, dachte ich mir und hab einfach versucht mich durch die altbekannte Mechanik durchzuklicken. Leider scheitere ich spätestens bei der Wahl des Pfades, denn da kommt eine Fehlermeldung, nach welcher der Wizard sich schließt. Leider kann ich auch dort nichts lesen, womit es mir leider nicht vergönnt wird das Spiel zu installieren.

Bewertung: 1.0 von 1 Benutzern

  • Currently 1/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5


Outlook-Odyssee

clock Januar 19, 2008 17:11 by author Divi

Wie bereits die Tage berichtet, habe ich mir ein Office-Paket gekauft. Voller Vorfreude, dass ich endlich nicht mehr über die Web-Oberfläche des Exchange meine Emails abholen muss, habe ich mein Outlook geöffnet und im ersten Dialog direkt "Exchange" als Mailserver-Typ ausgewählt. Offensichtlich der größte Fehler den ich machen konnte :-D.

Nachdem ich die entsprechenden Zugangsdaten unseres Exchange-Servers eingegeben hatte, beharrte mein Outlook stur darauf, dass der Exchange die Benutzerdaten nicht verifizieren konnte ... Schade ;-) ... aber das lustigste kommt noch: Unser Admin hatte einen guten Rat für mich: Leg erst ein anderes Konto an und füg dann das Exchange-Konto über manuelle Konfiguration hinzu ... gesagt - versucht - gescheitert.

Das Problem: Outlook bot mir zwei Möglichkeiten nach dem erneuten öffnen:

1.) Korrekte Zugangsdaten für den Exchange gehen (s.o.: das klappte nicht)

2.) Abbruch

Also habe ich auf "Abbruch" geklickt, um einen alternativen Mailserver als primäres Konto anzugeben... nun ja ... leider veranlasste aber der "Abbruch" Button Outlook nicht dazu im Wizzard einen Schritt zurück zu gehen, sondern sich zu schließen ... Pech gehabt. Outlook bestand felsenfest darauf, dass ich das Exchange Konto einrichtete.

 

Da dachte ich mir: Es muss doch einen Ausweg geben und fing an meine System-Registrierung nach dem Namen des Exchange-Servers zu durchsuchen. Ich wurde an zwei Stellen fündig: In der Historie meines Browsers (das war die Weboberfläche) und an einer weiteren Stelle unter:

HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\<username>\13dbb0c8aa05101a9bb000aa002fc45a

Mein erster Versuch war natürlich sofort den entsprechenden Wert einfach mal zu leeren ... funktionierte nicht. Also habe ich kurzer Hand den kompletten Schlüssel gelöscht ... Fehler :-D!

Nachdem ich Outlook erneut startete, erhielt ich diese wunderbare Nachricht:

MessagingServiceError

Hmm ... ok - Versuch fehlgeschlagen - es war spät - ich hatte natürlich kein Backup ... also: Outlook repariert... klappte nicht - Outlook deinstalliert und neu installiert - klappte auch nicht ...

Langsam wurde ich ein wenig frustriert... Letzer Versuch: Firmenlaptop auspacken und den Schlüssel dort suchen (Ich hab sicherheitshalber mal den kompletten <username>-Schlüssel gelöscht und vom Laptop übernommen) ... Und da ich schonmal dabei war, kopierte ich auch gleich den kompletten Profil-Ordner in das entsprechende Vista-Verzeichnis:

LAUFWERK:\Benutzer\<username>\AppData\Local\Microsoft\Outlook

Und voila - mein Outlook lief wieder, der Exchange war bereits konfiguriert, hatte alle Emails bereits vorhanden (bis auf die in den Shared-Folders) und ich kann endlich von zu Hause aus Emails schreiben.

Bewertung: 5.0 von 1 Benutzern

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5


Hinzufügen eines MessageInspectors

clock Januar 17, 2008 01:46 by author Divi

Nachdem mir vor einiger Zeit auf tutorials.de leider niemand helfen konnte bei dem Versuch ein- und ausgehende Nachrichten bei WCF mitzuloggen und zu untersuchen, dachte ich, dass ich hier einmal meine Erfahrung zur Verfügung stelle:

WCF bietet standardmäßig eine Konfiguration für das MessageLogging. Dieser ist Teil der sog. "Diagnostics"-Einstellungen und vollkommen ausreichend, wenn es wirklich nur um das Loggen an sich geht. Den entsprechenden Artikel dazu findet man im MSDN.

Leider lässt sich dieses Logging nicht so detailiert konfigurieren, wie ich das damals brauchte. Meine Aufgabe war es nämlich die eigentliche Message zu einem gesendeten Objekt zu speichern, um nachhalten zu können, ob der vorgeschaltete Wrapper anständig arbeitete.

Nach einiger Suche, fand ich den Ansatz der "Extensions". Und dieser funktioniert folgendermaßen.

Über die Konfiguration lässt sich einem Endpunkt ein Endpoint-Behavior zuweisen:

<endpoint address="ADDRESS" binding="basicHttpBinding" behaviorConfiguration="AttachClientInspector" contract="CONTRACT" />

Hierzu entsprechend muss natürlich auch ein Behavior namens "AttachClientInspector" vorhanden sein (den Namen könnt ihr euch natürlich selber aussuchen). Dieser sähe ungefähr so aus:

<endpointBehaviors>
  <behavior name="AttachClientInspector">
    <ClientInspector />
  </behavior>
</endpointBehaviors>

Falls ihr das Visual Studio 2005 verwendet, wundert euch nicht, dass der einzelne Tag "ClientInspector"-Tag markiert wird mit dem Text "...invalid child element". Das liegt schlichtweg daran, dass das VS2005 die eigentliche Extension nicht erkennt. Und hier kommen wir auch direkt zum nächsten Schritt, denn der Konfigurationsabschnitt "System.ServiceModel" erlaubt neben "Bindings" und "Behaviors" auch einen Abschnitt namens "Extensions". Hier könnt ihr eine sog. "BehaviorExtension" hinzufügen:

<behaviorExtensions>
  <add name="ClientInspector " type="CLASSNAME, ASSEMBLYNAME, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</behaviorExtensions>

Der CLASSNAME muss natürlich auf eine bestimmte Klasse zeigen, welche für das Untersuchen der Nachricht geeignet ist. Damit diese Klasse hier akzeptiert wird, muss sie von "System.ServiceModel.Configuration.BehaviorExtensionElement" ableiten UND "System.ServiceModel.Description.IEndpointBehavior" implementieren. Von BehaviorExtensionElement muss man ableiten, damit die Klasse als Extension an das Behavior gebunden werden kann. Sie verlangt die Bereitstellung von BehaviorType, wobei man einfach via typeof die aktuelle Klasse angeben kann und die Methode CreateBehavior, bei der man nur eine Instanz der aktuellen Klasse zurückgeben muss:

public override Type BehaviorType
{
    get { return typeof(CLASSNAME); }
}

protected override object CreateBehavior()
{
    return new CLASSNAME();
}

IEndpointBehavior hingegen stellt die Methoden zur Verfügung, die schließlich während der Laufzeit aufgerufen werden, sobald die entsprechende Extension greift. Hierbei interessiert uns nur die Methode "ApplyClientBehavior". Diese besitzt einen Parameter "clientRuntime" vom gleichnamigen Typen. Hier lässt sich unser Inspector nun wie folgt einbauen:

clientRuntime.MessageInspectors.Add(new CUSTOMINSPECTOR());

So... damit hätten wir schonmal den Grundstein gelegt, damit der Inspector aufgerufen wird, sobald der entsprechende Endpunkt verwendet wird. Jetzt fehlt nur noch die eigentliche Implementation des Inspectors. Hierzu erstellt ihr eine Klasse mit dem Namen CUSTOMINSPECTOR (die groß geschriebenen Wörter sind natürlich nur Platzhalter, um die Relationen klar zu stellen) und leitet vom Typ "System.ServiceModel.Dispatcher.IClientMessageInspector" ab. Dieses Interface setzt euch zwei Methoden vor: AfterReceiveReply und BeforeSendRequest. Letztere erwartet einen Rückgabetypen vom Typ "object"... schreibt einfach "return null;" hinein, denn der Rückgabewert interessiert uns hier nicht.

Wenn ihr jetzt versucht zu kompilieren, dürfte er nicht meckern und müsste das Projekt anständig bauen. Was natürlich noch immer fehlt, ist die eigentliche Implementation der Inspectors. Hierfür besitzen beide Methoden einen Parameter vom Typ "System.ServiceModel.Channels.Message". Darin enthalten ist die entsprechende Nachricht.

Wenn ihr aber nun das erste Mal versuchen solltet auf die Nachricht zuzugreifen, dürftet ihr nach kurzem genervt sein, denn das Nachrichten-Objekt wird ungültig, sobald ihr zum ersten Mal darauf zugreift. Schön, nicht? ;-)

Aber auch dieses Problem ist recht einfach zu meistern, denn die Message-Objekte besitzen eine Methode "CreateBufferedCopy". Mit folgendem Aufruf könnt ihr euch dann eine "buffered Copy" des aktuellen Message-Objekts erstellen:

MessageBuffer bufferedMessage = request.CreateBufferedCopy(request.ToString().Length);

(Hierbei ist das Message-Objekt "request". Bei "AfterReceiveReply" nennt sich das Objekt hingegen "reply".)

 

Aus der "Buffered Copy" könnt ihr dann, nachdem ihr eure Analyse abgeschlossen habt, wieder ein MessageObjekt erzeugen:

 

request = bufferedMessage.CreateMessage();

(Wieder entsprechend "reply" natürlich bei der Reply-Methode. Das Objekt, das hier gefüllt wird, ist das selbe, wie im Parameter übergeben wurde.)

 

Das ist eigentlich alles, was man dazu wissen muss. Um zu Analysezwecken an den Inhalt zu kommen, hat man dann verschiedene Möglichkeiten:

1.) Aus der "bufferedMessage" kann man via "CreateNavigator" einen XPathNavigator generieren, mit dem man dann die Nachricht untersuchen kann. Außerdem kann man an jedem beliebigen Punkt des XPathNavigators auf die Eigenschaft "InnerXML" zugreifen, welche den Inhalt der untergeordneten Knoten als String bereitstellt.

2.) Man kann, wie vielleicht weiter oben schon bemerkt, aber auch direkt request.ToString() machen und erhält so den Inhalt der Nachricht.

Ich wünsche euch viel Erfolg damit und hoffe ich konnte euch helfen.

Bewertung: 5.0 von 1 Benutzern

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5


Seltsame Probleme bei der BlogEngine

clock Januar 12, 2008 00:53 by author Divi

Irgendwie treten momentan seltsame Probleme bei der BlogEngine auf... Ich hatte mich ja bereits dran gewöhnt die Einträge nochmal in den Editieren-Modus zu versetzen und neu zu speichern, damit der vom Live-Writer erzeugte "Tags:"-Span wegfiel. Aber irgendwie hat der manchmal offensichtlich ein Problem mit den IDs, denn ab und an kommt es vor, dass ein Eintrag nach der Editierung auf einmal ein zweites Mal vorhanden ist ... Oder - viel schlimmer: Ich kam gerade nach Hause und der neuste Eintrag war weg.

Glücklicherweise hatte der Live-Writer noch eine gecachte Kopie davon, welche mir das erneute Schreiben erspart hat.

Ich werd das im Auge behalten ...

[UPDATE 20.01.2008] Es scheint schlichtweg am Zusammenspiel mit dem LiveWriter zu liegen, denn mittlerweile passiert es jedes Mal, dass der Eintrag doppelt auftaucht ... Einmal mit und einmal ohne dem "Tags"-Span ... Ich hab dazu einen Eintrag bei Codeplex eingestellt.

Gib die erste Bewertung ab

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5


Rechnerupdate und Feier

clock Januar 12, 2008 00:49 by author Divi

Langsam wird es was. Heute kam mein neues Office 2007, dass ich bei Amazon bestellt hatte. Auf meinem Arbeitsrechner, war ich schon lange daran gewöhnt damit zu arbeiten nur leider hatte ich es zu Hause nicht direkt zur Verfügung. Wir haben ein ziemlich cooles Konzept von variablen Arbeitsplätzen, indem jeder von uns einen Laptop besitzt, mit dem er sich dann mit Teammitgliedern zusammensetzen kann - aber auf der Arbeit haben wir Docking-Stations und richtige Peripherie, während ich zu Hause auf dem Laptop Monitor arbeiten muss ... das ist kein Problem, wenn man "mal kurz" was machen muss, aber ein richtiger Monitor ist doch viel angenehmer. Aus diesem Grund sorge ich gerade dafür, dass ich alle Arbeitsmaterialien auch auf meinem Desktop-PC zu Hause verfügbar habe.

Office2007_thumb1

Abgesehen davon, habe ich heute endlich meinen üblichen Raum für meine bald anstehende Feier gemietet gekriegt. Ich hätte zwar gerne den 23.02. bekommen, aber der war leider besetzt, weshalb ich auf den 01.03. umgesattelt habe. Ist ja auch eigentlich ganz praktisch: Kann ich zweimal feiern :-D. Also wenn Ihr schonmal auf einer der Partys dabei wart... erwartet eure Einladung.

Gib die erste Bewertung ab

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5


Ungünstig gewähltes Design

clock Januar 9, 2008 20:35 by author Divi

Nachdem wir heute eine Liste mit angegebenen Gutscheincodes exportieren sollten, stellten wir geschockt fest, dass die Liste komplett leer war. Es gab nur zwei Einträge von Usern, die offensichtlich versucht hatten einen Code anzugeben, doch von diesen waren nur die ersten beiden Ziffern gespeichert.

Wir haben bestimmt 45 Minuten mit zwei Personen nach dem Bug gesucht, da wir vermuteten, dass ein Fehler beim Speichern der übrigen Teile des Codes aufgetreten sein könnten - doch egal welche Sonderfälle wir prüften: Alles schien einwandfrei zu funktionieren.

Irgendwann schauten wir uns dann die Einbindung in die Seite an und uns wurde folgendes klar: Es lag schlichtweg am Design :-D.

Die Textboxen, in die der Gutscheincode eingegeben werden konnte, bestanden aus zwei (unbeschrifteten) Textboxen. Ungefähr so:

 

Das Problem welches sich nun auftat war folgendes: Die linke von beiden Boxen war für den Code gedacht - die rechte Box hingegen sollte eine Ortskennzahl (eine Postleitzahl oder ähnliches) beinhalten, welche aber Freitext zuließ. Da der Gutscheincode allerdings vermutlich mit Bindestrichen geschrieben worden war, oder schlichtweg, weil keine Erklärung angegeben war, was in die zweite Box sollte, teilten die potentiellen Kunden den Gutscheincode in beide Felder auf, was bei der Validierung zu einem Fehler führte. Offensichtlich haben danach die meisten Leute aufgegeben zu versuchen dort etwas einzufügen und die Felder einfach leer gelassen - - oder sie haben schlichtweg den Bestellvorgang abgebrochen.

Merke: Man sollte nicht davon ausgehen, dass die Leute, die die eigene Seite besuchen, die selben Gedankengänge haben wie jemand, der sich schon wochenlang mit einem Layout beschäftigt hat ;-)

Nachtrag: Offensichtlich hatte ich vergessen es zu erwähnen - das Design war uns vorgegeben ;-)

Gib die erste Bewertung ab

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5


Windows Live Writer Support

clock Januar 8, 2008 19:15 by author Divi

Da hab ich doch geglaubt was von "Windows Live Writer"-Unterstützung gelesen zu haben. Das musste ich doch direkt mal ausprobieren - und - siehe da: Es klappt ... :-D

Zuerst musste ich überlegen, wie man das denn nun richtig konfigurieren kann, aber es reicht wirklich aus die Adresse des Blogs anzugeben (Und die Zugangsdaten) und schon holt sich der Live-Writer alle Infos, die er braucht.

image

Ein Klick auf "Publish" bzw. "Veröffentlichen" (je nachdem an welchem Rechner ich sitze) und schon taucht der neuste Eintrag auf der Seite auf.

Sehr schön finde ich dabei, dass der Live-Writer die Bilder vor der Veröffentlichung skaliert ... Noch schöner könnte es nur werden, wenn er die bestehenden Einträge dann auch noch modifizieren könnte (Hach wie schön wärs, wenn ein MS-Männchen hier vorbeikommen und das lesen würde :-D).

Nachtrag: Sehr interessant (und ich hab es jetzt zweimal getestet): Bei der Verwendung vom Live-Writer erscheint unter der Bewertung ein Schriftzug "Tags:" ... dieser verschwindet, sobald man den Eintrag (egal ob unverändert oder nicht) erneut speichert.

Gib die erste Bewertung ab

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5


Windows-Fonts Dialog

clock Januar 8, 2008 10:29 by author Divi

Der eigentliche Grund, der mich überhaupt dazu animiert hat einen Blog anzufangen ist folgender:

 

Diese wunderhübsche Windows 3.1(?) Dialog-Box befindet sich im Windows-Fonts Ordner von (aufgepasst!) Windows-XP (Nachtrag: und Vista :-D). Da frag ich mich doch: War es zuviel Aufwand die umzusetzen? Ich hatte echt Freudentränen in den Augen, als ich das erste Mal versuchte manuell eine Schriftart über das Menü zu installieren (sonst hab ich sie, was übrigens gut klappt, einfach in den Ordner gezogen).

Bewertung: 5.0 von 1 Benutzern

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5