ImageMagick auf Ruby 1.9.3 Win32 mit rmagick 2.15.

Heute hatte ich ein Problem. Ein alten Projekt wollte ich aktualisieren, aber ich bekam folgende Fehlermeldung:

D:\Sources\Rails\project\rails s
d:/opt/Ruby/1.9.3/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/rmagick-2.15.4/lib/rmagick_internal.rb:12:in `require': 
193: %1 ist keine zulässige Win32-Anwendung. - d:/opt/Ruby/1.9.3/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/rmagick-2.15.4/lib/RMagick2.so (LoadError)
from d:/opt/Ruby/1.9.3/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/rmagick-2.15.4/lib/rmagick_internal.rb:12:in `<top (required)>'
from d:/opt/Ruby/1.9.3/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/rmagick-2.15.4/lib/rmagick.rb:1:in `require'
from d:/opt/Ruby/1.9.3/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/rmagick-2.15.4/lib/rmagick.rb:1:in `<top (required)>'
from d:/opt/Ruby/1.9.3/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/bundler-1.3.4/lib/bundler/runtime.rb:72:in `require'
from d:/opt/Ruby/1.9.3/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/bundler-1.3.4/lib/bundler/runtime.rb:72:in `block (2 levels) in require'
from d:/opt/Ruby/1.9.3/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/bundler-1.3.4/lib/bundler/runtime.rb:70:in `each'
from d:/opt/Ruby/1.9.3/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/bundler-1.3.4/lib/bundler/runtime.rb:70:in `block in require'
from d:/opt/Ruby/1.9.3/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/bundler-1.3.4/lib/bundler/runtime.rb:59:in `each'
from d:/opt/Ruby/1.9.3/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/bundler-1.3.4/lib/bundler/runtime.rb:59:in `require'
from d:/opt/Ruby/1.9.3/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/bundler-1.3.4/lib/bundler.rb:132:in `require'
from D:/Sources/Rails/pcount-mobile/config/application.rb:13:in `<top (required)>'
from d:/opt/Ruby/1.9.3/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/railties-3.2.11/lib/rails/commands.rb:53:in `require'
from d:/opt/Ruby/1.9.3/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/railties-3.2.11/lib/rails/commands.rb:53:in `block in <top (required)>'
from d:/opt/Ruby/1.9.3/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/railties-3.2.11/lib/rails/commands.rb:50:in `tap'
from d:/opt/Ruby/1.9.3/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/railties-3.2.11/lib/rails/commands.rb:50:in `<top (required)>'
from script/rails:6:in `require'
from script/rails:6:in `<main>'

 

Leider brachte eine Suche im Internet keine Hilfe, aber es liegt Nahe, dass der Fehler mit ImageMagick zu tun hat. Daher eine kurze Bestandsaufnahme:

gem rmagick 2.15.4
ImageMagick:
d:\Sources\Rails\pcount-mobile>convert --version
 Version: ImageMagick 6.9.3-7 Q16 x64 2016-03-06 http://www.imagemagick.org
 Copyright: Copyright (C) 1999-2015 ImageMagick Studio LLC
 License: http://www.imagemagick.org/script/license.php
 Visual C++: 180040629
 Features: Cipher DPC Modules OpenMP
 Delegates (built-in): bzlib cairo freetype jng jp2 jpeg lcms lqr openexr pangocairo png ps rsvg tiff webp xml zlib

 

Das scheint eigentlich alles zu passen. Denn ImageMagick sagt mir, es ist Version 6.9.3 mit einer Farbtiefe von 16 Bit (= Q16) für eine x64 Maschine.

Erst nach einer gewissen Rumsucherei ist mir wieder eingefallen, dass es Ruby 1.9.3. ja nur für x86, also 32 Bit gibt. Somit bin ich rüber auf die ImageMagick Homepage gegangen und habe mir die neueste Version geladen, aber diesmal in der 32 Bit Version. Wichtig! Es muss die Installer Version sein, weil nur bei ihr die Header und OLE Controls mitgeliefert werden.

 

screenshot-installation-imagemagick-6.9.3 32bit 3

 

Ich habe diese Version dann in das Verzeichnis  d:\opt\ImageMagick-6.9.3-7-Q18-x86 installiert. Hier ist (angeblich) wichtig, dass der Pfad keine Leerzeichen enthält.

 

Und dann habe ich das gem erst mal deinstalliert, den Pfad gesetzt und dann das gem wieder installiert

d:\Sources\Rails\pcount-mobile>gem uninstall rmagick --version 2.15.4
 Successfully uninstalled rmagick-2.15.4

set PATH=%PATH%;d:\opt\ImageMagick-6.9.3-7-Q16-x86
 
d:\Sources\Rails\pcount-mobile>gem install --version 2.15.4 rmagick
 Temporarily enhancing PATH to include DevKit...
 Building native extensions. This could take a while...
 Successfully installed rmagick-2.15.4
 1 gem installed
 Installing ri documentation for rmagick-2.15.4...
 Installing RDoc documentation for rmagick-2.15.4...

D:\Sources\Rails\project>rails s
=> Booting WEBrick
=> Rails 3.2.11 application starting in development on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
[2016-03-30 18:44:51] INFO WEBrick 1.3.1
...

 

Und wie man sieht, funktioniert es nun.

FIWARE

In der EU gibt es derzeit politische Bedenken, dass nur amerikanische Firmen, Systeme anbieten, die für stark wachsende IT Projekte funktionieren, Stichwort “Cloud”. Um diesem entgegenzuwirken, hat die EU mit FIWARE eine Technologie geschaffen, die Firmen in Europa helfen soll, auf dem Stand der Technik zu bleiben. Dies schließt Cloud-Infrastruktur, Internet-of-Things, Streaming und 3D Web Grafiken mit ein.

Es wird versucht, mit Accelerators Startups zu überzeugen, diese Technologie einzusetzen.

Ein paar andere und ich sind mit einer Idee beim Accelerator Speed!Up Europe dabei, über den wir eine Förderung bekommen haben, über die wir ein geringes Gehalt beziehen können und Fahrtkosten bezahlt bekommen können.

Aus diesem Grund konnte ich bei der FIWARE Developer Week in Madrid (9.3. – 13.3.2015) teilnehmen und hatte dort einen ersten Kontakt mit der FIWARE Technologie.

 

Insgesamt mussten wir uns glücklicherweise nur mit der Technologie beschäftigen und wurden nicht gezwungen, diese auch sofort einzusetzen oder bestimmte Aufgaben zu erledigen. Dazu gab es Vorlesungen, die die Theorie hinter der Technologie versucht zu erklären.

Mit diesem Hintergrund, habe ich in der Woche zu jedem der Elemente von FIWARE, den “Enablern”, etwas gehört und mich praktisch mit der Cloud Infrastruktur und dem “Context Broker” auseinandergesetzt.

 

Mal vorne weg: Es wird einem einiges an Infrastruktur geboten, was normalerweise viel Geld kostet.

So bekommt man nicht nur einen Webspace sondern kann gleich ein Netzwerk von Servern einrichten. Auch werden für fast jeden Enabler ein passendes Image für die Server angeboten.

 

Aber so viel zu dem positiven, was einem geboten wird. Im Laufe der Woche stellte sich heraus, dass die “Überzeugungsarbeit”, die die Accelerators leisten aus einem Zwang zu FIWARE Technologie bestehen. Dies ist, wenn man meinem Text oben folgt, nichts schlimmes. Es hat sich aber auch heraus gestellt, dass alle Enabler eher einem Beta-Status entsprechen. Weiterhin muss jeder, der die Cloud Infrastruktur nutzen will, einen sehr aufwändigen Prozess zu Erstellung eines Servers durchgehen, obwohl man vielleicht tatsächlich nur einen Webspace und eine Datenbank braucht.

Auch braucht man natürlich eine public IP um auf seinen Server zuzugreifen. Davongibt es aber anscheinend derzeit nicht genug. Auch hat die Oberfläche zur Einrichtung der Server einige Bugs, die zu Fehlern führen, die ungeübte schnell zurecht frustrieren.

Interessant ist auch ein Enabler, der versucht die Internet-of-Things (IoT) der verschiedenen Hersteller, die alle verschiedene proprietäre Protokolle sprechen, zu abstrahieren und auf ein Protokoll zu bringen. Um das zu schaffen, muss man Adapter schreiben, die das Protokoll übersetzen. Von diesen Adaptern gibt es aber derzeit nur einen.

Der Hadoop General Enabler soll ein Image haben (oder gehabt haben), welches an sich nicht funktioniert. Der Context Broker an sich ging glücklicherweise auf anhieb. Zumindest, wenn man es geschafft hat eine public IP zu bekommen und die Bugs in der Oberfläche genug kannte um dort nicht frustriert aufzugeben.

 

Mittlerweile ist die Developer Week einen Monat her, ich bin mir sicher, viele Entwickler haben viele Bugs gefunden und hoffentlich auch gemeldet.

Das Problem mit den public IPs ist angeblich noch nicht gelöst, die Instanz, die ich während der Developer Week aufgesetzt habe ist nicht mehr erreichbar und ich weiß nicht warum. Ob es neue Versionen der Enabler gibt, weiß ich nicht.

Eine gute Neuigkeit habe ich gehört: Es soll “bald” einen kommerziellen Anbieter geben, der die Coud Infrastruktur anbietet. Über Kosten, SLA und weiter ist allerdings nichts bekannt.

 

Meiner Meinung nach, als jemand, der von organisatorischen Hürden kaum etwas mitbekommt und diese auch nicht bewerten will, ist dieses Projekt durchaus interessant. Ich denke FIWARE, in das die EU jede Menge Geld gesteckt hat, wird uns einige Jahre begleiten.

Auch das Abstrahieren der IoT Protokolle ist interessant. Es gibt sicherlich nicht nur ein Projekt, das dies probiert, aber hinter FIWARE steckt immerhin die EU und Startups, die dazu genötigt werden, diese Enabler zu benutzen 😀


Ich bin also guter Dinge, nehme die Probleme hin und nutze die Chance, mich mit einer Technologie zu beschäftigen, die mich wohl noch einige Zeit begleiten wird.

Yii

Letztens habe ich auf anraten von Robert mal das PHP Framework Yii ausprobiert. Klar, es ist ein MVC Framework, hat netterweise auch einen Generator (gii) und es gibt eine Extension für Bootstrap. Soweit, so gut.

Besonders interessant fand ich die ActiveRecord Implementierung. Wobei ich die rules und relations etwas holprig fand. Aber klar, PHP hat halt nicht so eine nette Syntax wie Ruby. Dafür ist es aber schön gelöst.

Auch fand ich es mal wieder schade, dass die Fehlermeldungen eines Formulars in den Objekten für die Formularfelder versteckt sind. Braucht man etwas mehr Freiheit bei deren Gestaltung, muss man recherchieren und teilweise auch im Code selbst nachlesen. Zugegeben, dies könnte an dem Bootstrap plugin liegen und nicht an Yii selbst.

Doch alles in allem fand ich es sehr hilfreich. In dem Projekt war ein Großteil Frontend, vor allem Javascript und Canvas. Aber ich hab mich immer gefreut, wenn ich wieder zurück zu Yii „darf“.

Gleich nach diesem Projekt ging es weiter mit einem Rails Projekt. Wenn man weiß, wie man mit Rails umgehen muss, also, dass man ihm einfach vertrauen muss, gehen viele Aufgaben sehr schnell und problemlos von der Hand.

Klar, es kann gut daran liegen, dass ich schon mehr mit Rails gearbeitet habe als mit Yii und es daher besser kenne. Trotzdem finde ich noch immer, dass Ruby on Rails das ausgewachsenste Web Framework ist.

Was ich mir bisher in Yii noch nicht angeschaut habe sind die Migrations. Da bin ich wieder in das Schema des PHP Entwicklers gefallen. Das sollte ich mir echt mal abgewöhnen. Vor allem weil mir schon gesagt wurde, dass es ziemlich aufwändig ist die nachzuziehen.

Soviel erst mal zu Yii. Das nächste Projekt damit steht schon an. Mit dem Meister (eben Robert) persönlich. Der wird mir viel beibringen, dessen bin ich mir sicher!

IFrame-wechsel in der Javascript Konsole

Immer wieder stehe ich vor dem Problem, dass ich in der Javascript Konsole der verschiedenen Browser den Kontext in ein eingebettes IFrame wechseln muss um dort eine Javascript-Funktion auszuführen. In meinem Fall, habe ich meistens eine Facebook App mit einigen js-Funktionen geschrieben und möchte diese direkt ausführen. Facebook erstellt ja ein IFrame, welches die App (oder das Tab) dann enthält.

Man kann zwar in jedem Browser mit F12 die Javascript-Konsole (oder irgendwelchen „Tools“) öffnen, aber wie man dann in das eingebettete IFrame kommt, ist unterschiedlich. Ich habe bisher noch keine einfache Übersicht gesehen, wo für jeden Browser steht, wie man das macht.

Chrome

In Chrome gibt es ganz unten eine Zeile, wo ganz rechts ein Button ist, mit dem man in die Settings kommt. In dieser Zeile steht als viertes „<top frame>“. Wenn man darauf klickt, sieht man alle IFrames der Seite und kann so in das richtige wechseln.

Firefox/Firebug

In Firefox kann man mit dem Befehl cd(); in ein anderes IFrame wechseln. Der Befehl erwartet ein frame-Objekt als Argument. An dieses kommt man, indem man zum Beispiel auf die Liste der Frames im Fenster per window.frames zugreift. Im Falle von Facebook gibt es (derzeit, 14.01.2013) nur ein IFrame. Der Komplette Aufruf heißt also cd(window.frames[0]);. Um zu schauen, wie viele es gibt, kann man natürlich window.frames.length verwenden und dann entsprechend durchprobieren. Möchte man aus dem Context wieder in die Rahmenseite springen geht das mit cd(parent);.

Internet Explorer (ab IE9)

Der Internet Explorer 9 kennt auch den Befehl cd();. Allerdings speichert dieser Browser die IFrames im Document Objekt. Der Aufruf für das Wechseln am Beispiel Facebook wäre dann also cd(document.frames[0]);. Heraus kommt man auch wieder mit cd(parent);. Dieser Befehl funktioniert ab Internet Explorer 9 richtig, selbst wenn man mit die älteren Versionen (MSIE7 und 8) simuliert. Im IE8, den ich in einer Virtuellen Maschine mit Windows 7 laufen habe, die es bei Microsoft zum Download gibt, funktioniert der cd(); Befehl eigentlich auch, allerdings leider nicht, wenn das IFrame auf eine andere Domain verweist. Also, wenn zum Beispiel das top Dokument auf Facebook ist und das IFrame auf graphity-consulting.com. Für den IE8 habe also leider keine Lösung gefunden, wie man direkt ein js-Funktion in einem IFrame ausführen kann. Auch document.frames[0].myJsFunction(); gab mir nur den Fehler „Permission denied“.

Safari

Für den Safari habe ich keine Möglichkeit gefunden, den Context zu wechseln. Man kann zwar mit window.frames[0].myJsFunction(); die eigene js-Funktion myJsFunction() im IFrame ausführen, allerdings nur, wenn beide Seiten auf der selben Domain liegen, ansonsten kommt folgender Fehler:

Unsafe JavaScript attempt to access frame with URL http://192.168.2.111/test/xpathtest.html from frame with URL http://localhost/test/iframes.html. Domains, protocols and ports must match.

 

Hier also eine kurze Übersicht:

Browser Logo Operation Einschränkung / Constraint
Chrome  chrome In unterer Zeile auf <top frame> klicken / Click on <top frame> in
Firefox  firefox cd(window.frames[0]);
Internet Explorer  Internet Explorer cd(document.frames[0]); Erst ab IE9 für unterschiedliche Domains / Only works for IE9 or newer for different domains
Safari  safari Funktioniert nicht für unterschiedliche Domains / Does not work cross domain

Entwickler Blog

Dies wird mein Blog für meine „Firma“ GraphITy Consulting Pinto. Ich habe vor, hier über meine Erkenntnisse in den Bereichen Facebook Entwicklung, Rails und PHP generell zu schreiben. Den Anfang macht allerdings eine Seite zur Facebook Entwicklung, in der ich mein Setup erkläre. Über Feedback freue ich mich sehr.