Zoomoringer Premiumsystem released

Am vergangenen Samstag war es soweit – Release!

Nach knapp zwei Monaten Arbeit läuft das Premium- und Benutzersystem von Zoomoringer.de auf unserem produktiven System.

Ein erster Premiumartikel zum Thema Feuerwerk ist auch bereits erhältlich und es werden weitere folgen.

Demnächst wird es für registrierte Benutzer zudem die Möglichkeit geben Artikel zu kommentieren. Außerdem sind auch weitere kostenlose Artikel in Arbeit.

Advertisements

UTF – 8 Kodierung der Paypal IPN mit Ruby on Rails

Vorgestern war es soweit. Das Premiumsystem für Zoomoringer.de ging in die Beta-Phase. Die ersten Tester durften drauf und es wurden auch schon echte Zahlungsabwicklungen mit PayPal getestet. Dabei sind wir zufällig auf ein Problem gestoßen. Mein Partner konnte seine Rechnung nicht ansehen. Diese Rechnungen werden live generiert und verwenden Daten, die uns von PayPal übermittelt werden.

Relativ schnell wurde mir klar, dass es sich um ein Kodierungsproblem handelte, denn in dem was wir von PP übermittelt bekamen waren mehrere Umlaute drin. Also ging ich der Sache auf den Grund und fand auch einen hilfreichen Blog Post. Dieser ist allerdings auf ASP.NET ausgerichtet.

Ich selbst habe zunächst die Methode in meinem Warenkorb Model angepasst, die letztlich den Button für PayPal generiert – „jetzt Zahlen“. Wichtig ist hier, dass man an PayPal charset=’utf-8′ übergibt. In Ruby sieht das wie folgt aus:

values = {
  [...]
  :invoice => id,
  :notify_url => notify_url,
  :currency_code => 'EUR',
  :charset => 'UTF-8'
}

line_items.each_with_index do |item, index|
  values.merge!({
    "amount_#{index+1}" => item.price,
    [...]
  })
end

In Zeile 6 steht die Anweisung dazu.

Als zweites muss man im PayPal Konto die Kodierung auf UTF-8 umstellt.

  1. Bei PayPal einloggen
  2. Unter „Mein Konto“ auf „Mein Profil“
  3. „Verkäufer/Händler (Kaufabwicklung, API, eBay…)“
  4. Unter „Weitere Verkaufstools“ >> „Sprachliche Kodierung von PayPal Buttons“
  5. „Weitere Optionen“ wählen
  6. Codierung auf „UTF-8“ stellen

Diese beiden Änderungen haben bei uns bereits die Lösung gebracht. Wichtig ist noch, dass auch Rails mit UTF-8 arbeiten muss. Das selbe gilt für die Datenbankverbindung.

Fotografie-Plattform Zoomoringer

Seit einigen Monaten arbeiten mein Partner und ich an einer Webplattform rund um das Thema Fotografie.

Er selbst ist ein Grafiken und Fotograf und hat unter anderem meine eigene Website jedemenge-it.de gestaltet. Schon lange hatte er die Idee interaktive Fotografie Tutorials im Netz anzubieten. Also haben wir die Ärmel hochgekrempelt und uns an die Arbeit gemacht.

Da ich diesen Blog eine lange Zeit nicht mit neuen Artikeln bestückt habe, ist das hier auch keine typische „Wir haben XYZ released!“ Meldung. Zoomoringer ist schon seit Mitte Dezember online, aber es ist nie zu spät das auch hier festzuhalten :).

Ab jetzt werd ich immer mal wieder über das Projekt und die Erfahrungen durch die Arbeit daran erzählen.

Noch eins: In ein paar Tagen wird das Premiumsystem von Zoomoringer online gehen und ab dann ist es möglich Artikel zu fortgeschritteneren Themen für kleines Geld zu kaufen.

Dialog im Hintergrund anzeigen per Thread

Nach langer Zeit fühlte ich mich wieder einmal gedrängt einen Blogeintrag zu verfassen.

Momentan entwickle ich eine Software zum steuern von Pipettierrobotern. Genauer gesagt dem BioMek 2000. Das ganze ist eine sehr spezielle Anwendung und auf die Wissenschaftler unseres Unternehmens abgestimmt.

Mein Programm erstellt aus einer Exceldatei ein Script für den Roboter und lässt dieses von einer anderen Software ausführen. Meine Anwendung soll automatisch erkennen wann der Nutzer das Programm zur Ausführung des Scripts beendet hat. Soweit sogut, das funktioniert auch wunderbar. Nun wollte ich heute noch einen schicken Dialog an den Nutzer ausgeben, damit dieser weiß was genau gerade passiert und was er tun muss. Dazu hatte ich im Vorfeld schon eine WorkDialog Klasse erstellt. Mit dieser kann ein Dialog (wie ich ihn mehrfach in meiner Software brauche) angezeigt werden.

Das Problem an der Sache? Wie den Dialog anzeigen und automatisch schließen, wenn das Programm geschlossen wird?
Dazu gibt es mehrere Ansätze. Ich habe folgenden heute ausprobiert und bin sehr zufrieden.

Ein Wort als Hinweis noch: Die Klasse WorkDialog bietet an den Dialog als unschließbar und TopMost zu instanzieren.

Die Aufrufende Methode

void Run()
{			
  Process b2k = new Process();
  b2k.StartInfo.FileName = @"C:\BIOWORKS\b2krun.exe"; 
  b2k.StartInfo.Arguments = "run(\"" + "BIOSCRIPTER" + "\") /a";
			
  Thread userNotificationThread = new Thread(this.ShowBioWorkUserNotification);
  userNotificationThread.Start();
			
  try {
    b2k.Start();
    b2k.WaitForExit();
  } catch (Exception ex) {
    throw new Exception("Unable to run B2K, check your intallation!", ex);
  } finally {
    userNotificationThread.Abort();
}

Hier wird das Programm zum Ausführen des Scripts gestartet und solange gewartet bis es beendet wurde. Um das zu erreichen braucht man nur die Methode WaitForExit() nach dem Starten aufrufen.

An dieser Stelle sieht man auch das Problem nochmal. Die Methode wartet nun, wie kann ich also trotzdem einen Dialog anzeigen? Dazu wird hier ein Thread erstellt und dort die Methode ShowBioWorkUserNotification() ausgeführt.

Die Thread-Methode

void ShowBioWorkUserNotification(object inputData)
{
  WorkDialog wd = new WorkDialog(true, true);
  wd.Caption = "";
  wd.Headline = "BioWorks is running";
  wd.Message = "Please wait until the BioMek 2000 has finished his work." + Environment.NewLine + "Then close the BioWorksRun Window to " + "come back to BioScripter.";
  wd.SetWaitingIcon();
			
  wd.ShowDialog();
}

In dieser Methode wird nur mein WorkDialog instanziert (unclosable and topmost) und konfiguriert.
Damit dieser Thread nicht einfach zu Ende geht, verwende ich ShowDialog() statt nur Show(). Dadurch wird gewartet bis der Dialog geschlossen wird. Da dieser aber nicht vom Benutzer geschlossen werden kann, bleibt der Thread (und der Dialog) aktiv.

Wurde BioWorks nun vom Benutzer beendet läuft auch meine erste Methode weiter. Dort wird dann im Finally-Block der Thread mit dem Dialog beendet. Damit schließt sich auch automatisch der Dialog.

Schnell und recht einfach kann man so eine Meldung dauerhaft neben anderen Operation anzeigen lassen.

jQuery Plugin Galleria zeigt beim laden einen schwarzen Kasten

Beim jQuery Plugin Galleria wird ein schwarzer, seitenbreiter Kasten über der Seite angezeigt. Dies scheint nur aufzufallen, wenn der Seitenaufbau, z.B. durch viele Grafiken, länger dauert. Der Kasten geht für ca. 3 Sekunden auf und verschwindet dann wieder.
Zurückzuführen ist das Problem auf folgende Zeilen in galleria.js:

var testElem = this.create('div', 'galleria-container galleria-stage');
this.moveOut(testElem);
document.body.appendChild(testElem);

Lösen kann man das auch recht leicht. Ich habe eine CSS Klasse „invisible“ mit der Eigenschaft display: none; Dann noch folgende Änderung am JS und schon ist der Kasten weg:

var testElem = this.create('div', 'galleria-container galleria-stage invisible');
//this.moveOut(testElem);
document.body.appendChild(testElem);

jQuery Plugin Galleria zeigt im Opera keine Thumbnails

Wieder einmal stieß ich wärend meiner Arbeit an einem Webprojekt auf ein Problem mit dem Browser Opera. Diesmal im Zusammenhang mit Galleria (jQuery Galerie Plugin). Diese recht schicke Galerie war perfekt für das anliegende Projekt geeignet. Leider wurden die Thumbnailgrafiken im Opera nicht angezeigt. Nach etwas Debugging fand ich das Problem. Dem Thumb div (class galleria-image) wurde eine Höhe und eine Breite von 0px zugewiesen, dem Bild demnach auch. Dies trat allerdings nur im Opera auf.
Beheben lässt sich das ganze, indem man in der CSS Datei galleria.classic.css die Attribute height und width bei .galleria-image mit !important markiert. Dann funtionierts auch im Opera.

Ob das hier erwähnte auch mit andern Styles als der classic funktioniert weiß ich nicht, da ich keinen anderen Style benutzt habe.

Opera schneidet Seiteninhalt ab

Im Opera kann es vorkommen, dass dieser Inhalte abschneidet oder gar nicht anzeigt. Dies ist mir bei ausgeschalteter „an Breite anpassen“-Funktion aufgefallen.

Versuch man über folgendes CSS einem Element eine Größe zu geben ignoriert Opera dies, bzw. kann es nicht interpretieren.

.myElement {
  position: absolute;
  top: 0;
  left: 0;
  bottom: 0;
  right: 0;
}

Hierbei wird ein Element über den gesamten Bereich des darüberliegenden Elements gespannt. Ob das Element relative oder absolute positioniert is spielt dabei keine Rolle. Opera kann mit diesen angaben nicht umgehen. Abhilfe schafft hier folgendes:

.myElement {
  position: absolute;
  top: 0;
  left: 0;
  bottom: 0;
  right: 0;
  height: 100%; /* Opera Bugfix */
}

Durch angabe einer Höhe macht auch Opera was er soll.