Posts mit dem Label Informatik werden angezeigt. Alle Posts anzeigen
Posts mit dem Label Informatik werden angezeigt. Alle Posts anzeigen

Samstag, 13. August 2016

Chromecast, Powerline, Router, Ethernet

GermanEnglish
Das ProblemThe Problem
Ich betreibe ein TP-LINK Powerline, an dem mein Rechner per Ethernet angeschlossen ist und das Android Smartphone per WLAN. Nun habe ich Chromecast gekauft und mit dem Smartphone eingerichtet. Danach war er aber in der Google Cast-App nicht mehr sichtbar für das Smartphone - stattdessen aber für den Rechner, der ja per Kabel mit dem Powerline-Adapter verbunden ist. Was stimmt mit meiner Konfiguration nicht? We're having a TP-LINK Powerline, my computer has a wired ethernet connection to it whereas my Android smartphone connects wireless via WLAN. Now I setup a Chromecast with my smartphone. However, after the setup the Chromecast disappeared and could no longer be found by the Google Cast app on my smartphone - instead, Chromecast became visible to my computer which has a wired connection. What's wrong with my configuration?
Die AnalyseThe Investigation
Offenbar war das Powerline nicht im gleichen logischen Netzwerk, wie mein Router. Einer von beiden hatte die IP 192.168.0.1, der andere 192.168.1.1. Das führte auch dazu, dass ich die Web-Management-Oberfläche des Powerline nicht mehr aufrufen konnte, was ich zur Fehlerkorrektur aber tun muss. Apparently my Powerline was not sharing the same logical network with my router. One has the IP address 192.168.0.1, the other had 192.168.1.1. That also hindered me from opening the web management site of my Powerline, which I needed to access to fix things.
Die LösungThe Solution
  • Zuerst habe ich meinem Rechner eine statische IP Adresse verpasst, die zum logisch Netzwerk des Powerline passt: 192.168.1.20. Damit konnte ich dann die Web-Management-Oberfläche des Powerline wieder im Browser öffnen.
  • Dort habe ich dem Powerline eine andere IP vergeben, die sich im gleichen logischen Netzwerk befindet, wie der Router: 192.168.0.2 (Obacht: Die IP darf nicht mit der des Routers identisch sein.)
  • Dadurch war Powerline jetzt natürlich wieder in einem anderen logischen Netzwerk und somit unerreichbar für meinen Rechner, also entfernte ich die statische IP meines Rechner wieder.
  • Nun konnte ich die Web-Management-Oberfläche des Routers aufrufen. Dort musste ich konfigurieren, dass dessen DHCP Server nur IP Adressen über 192.168.0.2 vergibt, denn 1 ist der Router selbst und 2 das Powerline.
  • First I assigned my computer a static IP address which matches the logical network of my Powerline: 192.168.1.20. This enabled me to open the web management site of my Powerline in the browser again.
  • There I assigned a new IP to the Powerline that matches the logical network of my router: 192.168.0.2 (Caution: That IP shall not be identical to the routers IP)
  • This of course changed the logical network of the Powerline which became unavailable to my computer again, so I removed the static IP address of my computer returning to DHCP.
  • Finally, I opened the web management site of my router. I had to configure its DHCP server such that it only assigns IP addresses above 192.168.0.2, because 1 is the router itself and 2 is the Powerline.
Das ResultatThe Outcome
Alle Geräte finden nun meinen Chromecast, außerdem kann ich das Powerline nun endlich über seine Web-Management-Oberfläche konfigurieren, und alle Rechner im Netzwerk können sich gegenseitig erkennen, egal ob sie drahtlos oder mit Kabel angebunden sind. All devices can now see my Chromecast, plus I can finally configure my Powerline via its web management site, and all devices in my network finally find each other, no matter if they are connected in a wireless or wired way.
Dankeschön geht anCredits to
https://www.administrator.de/wissen/kopplung-2-routern-dsl-port-48713.html

Mittwoch, 12. März 2014

Collapsibles mit jQuery und knockout.js

DeutschEnglish
Wer mit jQuery UI bzw. jQuery Mobile und Collapsibles arbeitet, kann sich das Layout seiner Seite gehörig zerschießen, wenn er den Titel des Collapsibles via knockout.js bindet. Der Unterschied ist klein, aber delikat: When working with jQuery UI or jQuery Mobile and using Collapsibles, you can mess up your layout by binding the heading of the Collapsible via knockout.js. The difference between good and bad is both small and important:
Falsch/BadGut/Good
<div data-role="collapsible">
  <h3 data-bind="text: property"></h3>
  <p>...</p>
</div>
<div data-role="collapsible">
  <h3>
    <span data-bind="text: property"></span>
  </h3>
  <p>...</p>
</div>
ErklärungDetails
Mit dem text-Binding von knockout.js wird der gesamte Markup innerhalb des h3 Elements auf den gebundenen Wert gesetzt. Dabei würde der jQuery UI/Mobile Markup des Collapsibles überschrieben, sobald der gebundene Wert sich ändert.  Im span-Element richtet das Binding hingegen keinen Schaden an.The text-binding of knockout.js will set all markup code within the h3 element to the bound value. This would destroy jQuery UI/Mobile markup of the Collapsible as soon as the bound value changes. Anyway, the binding will not cause any problems inside of the nested span element.

Donnerstag, 30. Januar 2014

Mein Wunschzettel an die perfekte Programmiersprache

Ich programmiere nun schon seit langer Zeit, und immer wieder vermisse ich in Programmiersprachen Features aus anderen Programmiersprachen. Hier mein Wunschzettel an eine perfekte Programmiersprache.

Lesbare Syntax

Programmquelltext wird i.d.R. nur einmal geschrieben - danach nur noch gelesen. Deswegen ist mir Lesbarkeit wichtiger, als kurze Schreibweise. Sprich: Ich möchte keine geschweiften Klammern, wenn ich auch ein begin und end haben kann - oder wenn dies ganz entfällt.

Schön gelöst in: Ada, Pascal, Python

Typstrenge, keine Pointer-Arithmetik - aber sichere Zeiger

Je früher ein Fehler auffällt - desto besser! Das Hantieren mit Zeigern ist gefährlich und muss sicher sein. Pointer-Arithmetik? Nein, danke! Funktionszeiger? Ja, bitte! Undefinierte Variablen? Nein, danke! Non-nullable Types? Ja, bitte!

Schön gelöst in: Ada, Pascal, C#, Go, Java, tlw. Vala

Native Unterstützung für verschiedene Mengen

Arrays, Listen, Tupel, Mengen, Multimengen, Hashsets, Dictionaries, offene Mengen... ich wünsche mir für diese Datenstrukturen nativen Support durch die Programmiersprache. Auch Operationen auf Mengen gehören dazu, wie man sie z.B. mit Linq hat.

Schön gelöst in: C#, Go

Generics

Denn wer schreibt schon gerne die selben Sachen doppelt?

Schön gelöst in: C#, Java

Objektorientierung, Interfaces, implizite Interfaces

Objekthierarchien sind normalerweise relativ flach (UIs mal ausgenommen), nehmen aber letztlich viel Arbeit ab. Interfaces helfen bei der Abstraktion. Implizit implementierte Interfaces sind zur Compile-Zeit prüfbar und reduzieren Abhängigkeiten im Quelltext.

Schön gelöst in: C#, Java, Go

Threads und Tasks, Rendez-vous, Message-basierte Kommunikation

Multitasking ist wichtig - und oft irrsinnig schwer. Threads und Tasks müssen natürlicher Bestandteil der perfekten Programmiersprache sein. Vernünftig gelöste Rendez-vous-Mechanismen (Synchronisation) vermeiden schwer erkennbare Fehler. Message-basierte Kommunikation umgeht viele Probleme, die durch Zugriff auf gemeinsam genutzten Speicher entstehen.

Schön gelöst in: C# (async, await), Ada (Rendez-vous), Go (Message-basiert)

Reflection, AOP, Metamodell

Den Quelltext sauber halten mit Metaprogrammierung - besser lesbar, weniger Fehler. In vielen Programmiersprache drin - aber so richtig überzeugend hab ich es noch nicht gesehen. Stattdessen scheint das immer "im Nachhinein angepflanscht".

Schön gelöst in: (?)

Memory Management

Ich wünsche mir eine Mischung aus Garbage Collection und deterministischer Speicherverwaltung. Ein GC kümmert sich um alles, was vielleicht vergessen wurde oder nicht performance-kritisch ist. Zudem wäre aber auch eine sichere Möglichkeit schön, Speicher explizit freizugeben.

Auch immer wieder kritisch: Wem "gehört" ein Objekt? Ein elegantes Konzept für weak references tut Not -besonders im Zusammenhang mit dem Events/Listener-Pattern: Wie lästig ist es doch, sich darum kümmern zu müssen, selber alle Listener zu deregistrieren - wie schön wäre ein Konzept von "Weak Listeners" als Teil der perfekten Programmiersprache.

Schön gelöst in: (?) - Ada und Vala haben einige interessante Ansätze

Bibliotheken, Bibliotheken, Bibliotheken - aber bitte sinnig

.NET und Java bringen einen RIESIGEN Satz an Bibliotheken mit - teilweise zu grob, teilweise zu viel. C und C++ bringen viel zu wenige Bibliotheken mit - mangelhaft.
Wichtige, immer wieder benötigte Funktionen sollten in kleinen Bibliotheken mit möglichst wenig Abhängigkeiten importiert werden können:
  • XML Verarbarbeitung
  • HTTP/Web-Clients
  • Web-Services (REST, WS-HTTP, ...)
  • Cryptographie
  • Komprimierung
  • Bildverarbeitung
  • GUI
  • ...
Außerdem sollten diese Bibliotheken aus einem zentralen Repository stammen und sich leicht beziehen und verwalten lassen.

Schön gelöst in: ... naja ... Go? C#? Java?

Contracts, Preconditions, Postconditions - verfügbar und optional

Preconditions und Postconditions ersparen Tests und sorgen für Robustheit. Mehr davon bitte - aber optional.

Schön gelöst in: Eiffel, Ada 2012, Vala, Spec#


Und jetzt bist du dran! Was steht auf deinem Wunschzettel an die perfekte Programmiersprache?

Mittwoch, 23. Oktober 2013

DragDrop registration did not succeed

DeutschEnglish
Mein C# Programm hat einen Laufzeitfehler mit folgendem Text verusacht:My C# program caused an exception with the following message:
System.InvalidOperationException: DragDrop registration did not succeed. ---> System.Threading.ThreadStateException: Current thread must be set to single thread apartment (STA) mode before OLE calls can be made. Ensure that your Main function has STAThreadAttribute marked on it.
   at System.Windows.Forms.Control.SetAcceptDrops(Boolean accept)
   --- End of inner exception stack trace ---
   at System.Windows.Forms.Control.SetAcceptDrops(Boolean accept)
   at System.Windows.Forms.Control.OnHandleCreated(EventArgs e)
   at DevExpress.XtraTreeList.TreeList.OnHandleCreated(EventArgs e)
   at System.Windows.Forms.Control.WmCreate(Message& m)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at DevExpress.XtraEditors.Container.EditorContainer.WndProc(Message& m)
   at DevExpress.XtraTreeList.TreeList.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)

   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
Ich habe eine Weile gebraucht, aber schließlich die Fehlerursache gefunden:It took me some time to find the reason for this:
Das Programm hat in einem BackgroundWorker Controls instanziiert und deren Handle erzeugt. Da BackgroundWorker IMMER im MTA Modus arbeitet, kommt es zu dieser Exception.The program used a BackgroundWorker to instantiate controls. The thread of BackgroundWorker is always in MTA, leading to the exception.
Was tun?How to fix it?
BackgroundWorker muss durch einen richtigen Thread ersetzt werden, denn an diesem Thread kann man noch vor dem Ausführen via SetApartmentState auf STA umschwenken.BackgroundWorker needs to be replaced by a real Thread, you can then use SetApartmentState to switch to STA.

Freitag, 19. Juli 2013

Parent Columns and Child Columns don't have type-matching columns.

English:
Today I got an exception with the following message and stack trace when deserializing a DataSet.

Parent Columns and Child Columns don't have type-matching columns.
   at System.Data.DataRelation.CheckState()
   at System.Data.DataRelation.Create(String relationName, DataColumn[] parentColumns, DataColumn[] childColumns, Boolean createConstraints)
   at System.Data.DataRelation..ctor(String relationName, DataColumn[] parentColumns, DataColumn[] childColumns)
   at System.Data.XSDSchema.HandleKeyref(XmlSchemaKeyref keyref)
   at System.Data.XSDSchema.HandleDataSet(XmlSchemaElement node, Boolean isNewDataSet)
   at System.Data.XSDSchema.LoadSchema(XmlSchemaSet schemaSet, DataSet ds)
   at System.Data.DataSet.ReadXml(XmlReader reader, XmlReadMode mode, Boolean denyResolving)
   at System.Data.DataSet.ReadXmlSerializable(XmlReader reader)
   at System.Data.DataSet.System.Xml.Serialization.IXmlSerializable.ReadXml(XmlReader reader)
   at System.Xml.Serialization.XmlSerializationReader.ReadSerializable(IXmlSerializable serializable, Boolean wrappedAny)
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderOrionWS.Read35_ServerActionResponse()
   at Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer64.Deserialize(XmlSerializationReader reader)
   at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)

However, the columns did have the same data type. It took me ages to find out that they need to have the same DateTimeMode as well.

Deutsch:
Ich habe obige Exception und Stacktrace erhalten beim Deserialisieren eines DataSet.

Dabei hatten die Spalten den selben Datentyp. Es hat ewig gedauert herauszufinden, dass die Spalten auch den gleichen DateTimeMode haben müsen.


Donnerstag, 18. Juli 2013

Warum Microsoft, Yahoo, Google und co Interesse an Transparenz haben

Die großen Unternehmen, die im Rahmen der PRISM Affäre darum bitten, Details über die Überwachung veröffentlichen zu dürfen, haben dafür gleich mehrere gute Gründe. Sie alle heißen Image und sind das wertvollste Kapital großer IT-Unternehmen.

(A) Das US Gesetz zwingt diese Unternehmen dazu, keine Aussagen zur Überwachung zu machen oder gar zu lügen. Der Image-Schaden dafür landet aber bei den Unternehmen, nicht bei der NSA. Auch die Kosten für Pressearbeit und Promotion bleiben an den Unternehmen hängen.

(B) Die Unternehmen wollen sich nicht vorwerfen lassen, Terror oder Verbrechen zu unterstützen. Auch das schadet dem Image. Und auf die paar Leute,  die entweder selbst Verbrecher sind oder die gesteigerten Wert auf Datenschutz legen, können die Unternehmen sehr gut verzichten.

(C) Die Unternehmen wollen nicht als Datenkraken dastehen, sondern als verlässliche Partner für die Wirtschaft. Kein Unternehmen wird sich aber darauf einlassen, seine Daten in Microsofts, Amazons oder Googles Cloud zu legen (und dafür zu bezahlen), wenn die Gefahr von Diebstahl und Wirtschaftsspionage besteht. Solch ein Image-Schaden könnten die gesamte Cloud-Blase der IT Industrie platzen lassen und damit auch die erhoffte Zukunft der Branche.

Freitag, 8. März 2013

Die Reise

Als Kind habe ich oft neben meinem Bruder gesessen und ihm beim Computerspielen zugesehen, das hatte irgendwie einen hohen Reiz für mich. Nun bin ich selbst kein großer Spieler und verbringe auch kaum Zeit mit Computerspielen, ich habe auch noch nie über ein Computerspiel gebloggt. Aber irgendwie gibt es ja für alles ein "Erstes Mal". Der Anlass ist das Spiel "Journey".

Das Spiel kommt nicht daher wie die meisten anderen Spiele. Es geht nicht ums Abschießen von anderen, um Kriegführung, Strategie oder Simulation. Stattdessen führt der Spieler seinen Avatar durch eine lange, poetische Reise. Ja, das Spiel ist poetisch. Es strotzt vor Symbolen und Sinnbildlichkeit. Die Reise ist das Symbol für den Lebensweg, und alles was auf dieser Reise geschieht, lässt sich als ein spezielles Ereignis auf dem Lebensweg deuten. (z.B. das Lernen von Sprache)

Ich habe obiges Video mit Genuss betrachtet und spreche den Machern ein Kompliment aus für das vielleicht gelungenste Spiel der letzten Jahre.

Mittwoch, 23. Januar 2013

Falsche Farben bei Videos in Totem, MiniTube etc. / Wrong colors of videos in Totem, MiniTube etc.


Deutsch
English
Auf meinem Ubuntu Linux System stellen Totem, MiniTube und andere Videoabspieler (aber nicht Flash und HTML5 Videos im Browser) falsche Farben dar. Blauer Himmel wird z.B. orange, Gesichter grün.On my Ubuntu Linux system Totem, MiniTube and other video players (but not Flash and HTML5 videos in browsers) get displayed with wrong colors. For example, blue sky turns orange, faces turn green.
Das liegt an einer verstellten Einstellung zum Farbton von Videos. (Siehe Ubuntu Forum) Unter askubuntu findet man die Lösung:This is caused by a wrong setting of the hue on video playback. (see Ubuntu forum) The fix for this has been provided by askubuntu:

  1. Öffne Totem und spiele ein Video ab.
  2. Wähle "Bearbeiten > Einstellungen"
  3. Verschiebe unter "Anzeige" den "Farbton"-Regler, bis die Farben im Video stimmen. (Bei mir musste der Regler bis ganz nach links.)

  1. Run Totem and play a video.
  2. Select "Edit > Settings"
  3. Under "Display" adjust the "Hue" unless the colors of the video are correct. (I had to shift the "Hue" control to the very left.)

Ein Blick auf Vala

Vala ist eine Programmiersprache, die seit 2006 im Linux-Umfeld verfügbar ist. Ich habe mich daran gesetzt, ein kleines Projekt in Vala auszuführen und hier mein Resümee.

Compiler und Tools

Der Vala Compiler und  etwaige Bibliotheken konnte ich einfach aus den Ubuntu Paketquellen beziehen. 

IDE

Niemand lernt gerne Buildskripte oder kryptische Kommandozeilenbefehle oder tippt in einem Texteditor herum. Ernsthaftes Programmieren findet daher normalerweise in einer IDE, einer integrierten Entwicklungsumgebung statt. Für Vala sieht es da ziemlich mau aus. Ich habe MonoDevelop verwendet und das dafür verfügbare Vala-Plug-In installiert, beides aus den Ubuntu Paketquellen. Für Windows... nun, Pech gehabt.

Die Guten, die Schlechten und die Hässlichen

Die IDE funktioniert, ist aber sehr langsam. Debugging ist eine Qual. Gut, das hat nichts mit Vala zu tun, zeigt aber, dass sich da nicht unbedingt viele Gedanken gemacht wurden. Ich habe den Eindruck, dass Vala dringend eine richtige IDE benötigt.
Die Dokumentation (kontextsensitive Hilfe) ist bestenfalls als rudimentär zu bezeichnen, bei mir fiel sie zwischenzeitlich gerne auch aus. Also immer wieder lästig in der Online-Dokumentation herumsuchen, die überdies oft nicht mehr als nur die Signatur von Methoden, Signalen und Properties zu bieten hat. Zu wenig Beispiele, zu wenig Dokumentation, ... das Leben des Vala-Programmierers ist hart, denn letztendlich muss er doch immer wieder in die C-Quellen der Bibliotheken schauen. Vala fehlt, wie den meisten Open-Source-Projekten, eine vernünftige Dokumentation.
Wobei wir schon beim nächsten Punkt wären: C. Vala ist C# in vielen Dingen sehr ähnlich (es gibt Signale/Events, Properties, viele gleiche Schlüsselwörter, ...), man merkt jedoch stark, dass Vala auf Biegen und Brechen mit dem steinalten und unkomfortablen C kompatibel sein muss und dass es stark mit der Linux-Welt (besonders GNOME) verbandelt ist. Beispiele gefällig?
  • Methoden überladen - geht nicht. Methoden unterschiedlicher Signatur müssen unterschiedliche Namen haben. Das mag für einen C-Programmierer wenig ausmachen, ist aber wirklich nicht mehr Stand der Technik.
  • GObject und co. - Vala nutzt die Infrastruktur von GObjekt sehr heftig, hat sie aber nicht richtig in die Sprache integriert. Wenn faktisch jede Klasse ohnehin von GLib.Objekt ableitet muss - warum ist das nicht in die Sprache integriert und ich muss es immer wieder angeben? So fühlt sich Vala immer wieder als Wrapper für GObject und Konsorten an, seien es Signale oder das lästige Speichermanagement. Es sind die technischen Schwächen von C und GObject, wegen derer man sich in Vala mit den owned und unowned Schlüsselwörtern herumschlagen muss, wegen derer Multithreading stellenweise kompliziert ist (siehe yield), wegen derer man sich Gedanken ums Speichermanagement machen muss (das tun Ada, Java und C# selbstständig).
  • Es fehlt an plattformübergreifenden Bibliotheken. Python, Java, JavaScript, Ruby, C#, Delphi, Ada, diese Sprachen sind erfolgreich, weil sie einen umfangreichen Satz an Bibliotheken mitbringen, die immer und überall verfügbar sind. In Vala muss man sie sich erst besorgen. Das mag für einen C-Programmierer Alltag sein, als moderner Programmierer ist es aber einfach nur lästig.
Jedoch bringt Vala auch einige nette syntaktische Neuigkeiten mit, die C# noch vermissen lässt:
  • Default-Werte für Properties.
  • Das aus C# bekannte INotifyPropertyChanged Interface, mit dem man Wertänderungen eines Properties mitgeteilt bekommt, wird in Vala praktisch automatisch umgesetzt, weil GObject es kann.

Fazit

Für einen C# Programmierer (oder Java...) hat Vala wenig zu bieten, es ist vor allen Dingen sehr schlecht dokumentiert und es fehlen Beispiele, die IDE und das Tooling sind eher dürftig. Für größere oder plattformagnostische Projekte ist das einfach zu unbequem. Will man aber ein kleines Programm für Linux schreiben und kennt sich ohnehin schon in den gängigen Linux-Bibliotheken aus, so ist Vala eine sehr gute Alternative zu C, C++ und anderen Katastrophen und spart tatsächlich Zeit. So findet man in der Liste der in Vala geschriebenen Projekte denn auch fast nur kleine Progrämmchen.

Dennoch: Unter Linux wird Vala wohl längere Zeit überdauern, weil Unity und Zeitgeist (beide Teil von Ubuntu) damit entwickelt werden.

Will man größere Projekte schreiben oder plattformunabhängig sein oder mehr Dokumentation haben, so sollte man statt Vala lieber eine andere Sprache nutzen. Von denen, die Ubuntu vorschlägt, scheinen mir QML, C#, JavaScript und Python die geeigneteren Alternativen zu sein.

Mittwoch, 2. Januar 2013

Unable to connect to RDP server / Verbindung zum RDP Server fehlgeschlagen

German English
Nachdem ich von meinem Rechner mit Ubuntu 12.04 lange Zeit via RDP (z.B. mit Remmina) auf einen Windows 7 Rechner zugriff, hat dies vor kurzem plötzlich aufgehört zu funktionieren mit folgendem Fehler: I've connected to Windows 7 from my Ubuntu 12.04 for some time now via RDP (e.g. using Remmina). However, this has suddenly stopped working recently. I got the following error:
Verbindung zum RDP Server fehlgeschlagen Unable to connect to RDP server
Das Problem steckte im Cache für bekannte Hosts und ihre Fingerprints. Dadurch wird normalerweise sichergestellt, dass man mit dem richtigen Zielrechner verbunden wird. Die Lösung für das Problem findet man mal wieder bei ask ubuntu, man muss den Cache löschen. Also einfach die Kommandozeile öffnen und folgenden Befehl ausführen: The problem originated from a cache of known hosts and their finger prints. Normally, this would ensure that you connect to the right target PC. The solution for the problem can once again be found on ask ubuntu, you simply have to clear the cache. So open a terminal and type:
rm ~/.freerdp/known_hosts
(Man kann auch das ganze Verzeichnis ~/.freerdp löschen...) (You could also delete the folder ~/.freerdp....)

Mittwoch, 3. Oktober 2012

Minitube stops playing / Minitube bricht ab

Deutsch English
Das Problem: Minitube bricht beim Abspielen von Videos in Linux / Ubuntu nach wenigen Sekunden ab. Problem: Minitube stops playing video in Linux / Ubuntu after some seconds.
Lösung: Lies ein langes Protokoll auf Launchpad und tippe dann folgendes in die Konsole ein: Solution: Read a long log on Launchpad and do the following from console:
32-Bit-System:
sudo mv /usr/lib/i386-linux-gnu/gstreamer-0.10/libgstvideoparsersbad.so /usr/lib/i386-linux-gnu/gstreamer-0.10/libgstvideoparsersbad.so.bak
32-Bit-System:
sudo mv /usr/lib/i386-linux-gnu/gstreamer-0.10/libgstvideoparsersbad.so /usr/lib/i386-linux-gnu/gstreamer-0.10/libgstvideoparsersbad.so.bak
64-Bit-System:
sudo mv /usr/lib/x86_64-linux-gnu/gstreamer-0.10/libgstvideoparsersbad.so /usr/lib/x86_64-linux-gnu/gstreamer-0.10/libgstvideoparsersbad.so.ba
64-Bit-System:
sudo mv /usr/lib/x86_64-linux-gnu/gstreamer-0.10/libgstvideoparsersbad.so /usr/lib/x86_64-linux-gnu/gstreamer-0.10/libgstvideoparsersbad.so.ba
Voilà, jetzt Minitube neu starten und los geht's!Done, restart Minitube and enjoy!

Dienstag, 21. August 2012

Sharing posts from within Blogger won't work in Chrome and Chromium?

Deutsch
English
Blogger verfügt seit einiger Zeit über eine bessere Anbindung an Google+, so dass man seine Posts direkt teilen kann. Wenn man einen neuen Post veröffentlicht oder den Teilen-Link eines Posts anklickt, soll Blogger ein Fenster öffnen, in dem man den Post in seinen Kreisen weitergeben kann.Blogger has recently gotten a tighter integration with Google+, so that you can directly share your posts from within Blogger. When publishing a new post or when clicking the posts share-link, Blogger would open a window that lets you share the post with your circles.
Leider hat das bei mir bisher nicht funktioniert: Das Fenster öffnet sich in Chrome oder Chromium lediglich ganz kurz, schließt sich danach aber gleich wieder.However, this did not work for me: The window would show up in Chrome and Chromium for a second and then immediately close.
Hier die Lösung des Problems:The solution is as follows:
Das Problem entsteht, wenn man Cookies von Drittanbietern gesperrt hat. Man muss einfach nur folgende Ausnahmen hinzufügen:The problem is caused by blocking third-party cookies. Just add the following exceptions to your third-party cookies section:
[*.]google.com
[*.]blogger.com
[*.]blogspot.com
Voilà, das Fenster zum Teilen der Posts lässt sich nun öffnen!Well done, the window for sharing your posts will show up now.

Windows Communication Foundation - Monster die Zweite

Es gibt Neuigkeiten von der Front mit WCF und dem Hosten eines Services mit WsHttpBindung und NetTcpBinding im IIS.

Nachdem es mir beim letzten Mal gelungen ist, meinen Service endlich im IIS zu hosten, hatte ich noch Probleme beim Aufruf. So konnte ich problemlos mit dem WsHttpBinding arbeiten, bekam aber beim NetTcpBinding einen Timeout mit folgender Beschreibung:
"The sequence has been terminated by the remote endpoint. Due to a user abort the reliable session cannot continue. The reliable session was faulted."
Diese und ähnliche Fehlermeldungen werden von WCF erzeugt, wenn irgendwas schief geht. Leider erachtet WCF es nicht für nötig, mich darüber zu informieren, was genau das Problem war. Ist IIS falsch konfiguriert? Ist WCF falsch konfiguriert? Stimmt meine web.config oder app.config nicht? Muss eine Betriebssystem-Einstellung angepasst werden? Kann es an der Firewall liegen? Auf alle diese Fragen gibt WCF mir keine Antwort, sondern nur kryptische und völlig uninformative Meldungen.

Also musste ich mal wieder selber alles herausfinden, was - natürlich - erheblich viel Zeit in Anspruch nimmt, aber das kennen wir bei WCF ja schon.

Also prüfte ich zuerst meine Konfiguration. In meiner Not habe ich sogar alle Ratschläge aus dem IIS Blog befolgt (die Anmerkungen zu Application Pools sind erhellend!), jedoch erfolglos.

Nach ratlosem Suchen bemerkte ich eher zufällig: Es gibt eine Methode des Services, die sich via NetTcpBinding erfolgreich aufrufen lässt. Das bedeutet also, dass IIS, Betriebssystem und WCF grundsätzlich richtig eingerichtet sind.

Also analysierte ich genauer die Methoden, die sich nicht aufrufen ließen. Dazu heftete ich meinen Debugger an den Worker Process des IIS an. So konnte ich feststellen, dass die Methoden fehlerfrei ausgeführt wurden, und zwar bis zur return-Anweisung.

Nun muss man wissen, dass die Methoden DataSet-Instanzen liefern. Hat WCF etwa ein Problem bei der Serialisierung und dem Versand von DataSets? Da viele Leute genau sowas schon gemacht haben, lautet die ermunternde Antwort: Nein. Stattdessen fand ich den Ratschlag auf StackOverflow, man solle die Quotas erhöhen.

Die Quotas legen u.a. die Maximalgröße von Arrays, Nachrichtenblöcken und Paketen fest. Wenn diese Größen überschritten werden, kommt es in WCF zu Exceptions. Und diese Fehler heißen dann nicht etwa "Quota XY exceeded", was einem ja einen Hinweis auf die Fehlerursache geben könnte, sondern... hm... z.B.  "This request operation sent to XY did not receive a reply within the configured timeout", was uns natürlich in die total falsche Richtung schickt.

Nachdem ich die Quotas also entsprechend erhöht habe, lassen sich beide Bindings betreiben.

Ich möchte einen Toast aussprechen auf Microsoft und die Kunst, Probleme beim Namen zu nennen.

Freitag, 17. August 2012

Windows Communication Foundation - Monster!!!

Ich versuche seit Stunden, einen bestehenden asmx Web Service meines Arbeitgebers gleichzeitig als WCF Service im IIS hosten zu lassen. Dabei will ich zunächst ein WsHttpBinding anbieten, und später ein NetTcpBinding.
Aber dieses Problem entpuppt sich als extrem komplex, was mich verwundert, denn die Aufgabenstellung ist kinderleicht. Mittlerweile kann ich WCF einfach nicht mehr hören. Microsoft prahlt unentwegt damit, wie toll diese Technik sein soll, ich aber sage euch: BULLSHIT! Im 21. Jahrhundert komplizierte XML Konfigurationen von Hand nehmen? Dokumentation - Fehlanzeige? Fehlerdiagnose = Eventlog? Fehlermeldungen, die überhaupt keine Anhaltspunkte liefern, was man falsch macht? Keine grafische Unterstützung durch Visual Studio oder IIS? Echt zum Kotzen das alles, aber leider alternativlos.
Also, hier die Chronik meines Leidens:
  1. Der asmx Web Service und seine Methoden müssen mit WCF Attributen versehen werden, wie Kenny Wolf beschreibt - bitte ignoriert aber seine web.config.
  2. Nun fügt man dem ASP.NET Projekt mit dem asmx Web Service einen WCF Service hinzu (.svc-Datei). Das kann man mit Visual Studio machen, dann werden schon einige tolle Eintragungen in die web.config getätigt. Die svc-Datei muss man bearbeiten und als neue Code-Behind-Datei die bestehende asmx.cs-Datei eintragen. Die alte Code-Behind-Datei kann man wegwerfen.
  3. Nun muss man in der MSDN nachlesen, wie man den Service konfiguriert. Schließlich zwingt WCF uns zum Verfassen von XML Konfigurationsdaten in epischem Ausmaß. Von Hand, versteht sich.
  4. Danach geht's immernoch nicht, weil WCF bei mir noch gar nicht im IIS registriert ist. (What the f*ck...) Also ServiceModelReg aufrufen.
  5. Danach geht's immernoch nicht, weil IIS noch nicht verkraftet, dass mein WCF Service erstmal nur ein WsHttpBinding mitbringt. Also schnell bei StackOverflow nach der Lösung dafür suchen: Vorübergehend schalte ich Net.Tcp ab. Auf .NET 4 will ich nicht aktualisieren, also muss ich wieder einen Sermon in die XML Konfiguration aufnehmen, etwa so:
        <serviceHostingEnvironment>
          <baseAddressPrefixFilters>
            <add prefix="net.tcp://localhost"/>
          </baseAddressPrefixFilters>
        </serviceHostingEnvironment>
Danach kriege ich immerhin den WsHttpBinding-Teil in den IIS und irgendwie laufen die meisten einfachen Sachen sogar.
Ab das Binding für NetTCP habe ich ja noch gar nicht in die web.config geschrieben. Ich ahne, dass hier noch unangenehme Arbeit auf mich wartet. Und vor allem viel handgeschriebener XML Konfigurationscode.
Das Problem: Es ist fast unmöglich, Informationen darüber zu finden, wie das NetTcpBinding im IIS aufgesetzt werden muss.
  1. Unbedingt nachvollziehen sollte man die Schritte aus einem Schweizer MSDN Blog.
  2. Und nicht vergessen: Den Workaround aus Schritt 5 (oben) wieder entfernen, sonst geht's nämlich wieder nicht und man sucht stundenlang, weil es keine richtige Fehlermeldung gibt.
Danach habe ich mein Ziel erreicht:
Ich habe meinen bestehenden asmx Web Service als WCF Service im IIS mit zwei Endpunkten (WsHttpBinding und NetTcpBinding) veröffentlicht.

Aber an der Stelle hört das Drama leider noch nicht auf. Da mein asmx Web Service rege auf die Session-Variable zugreift (zu meiner großen Freude!), werde ich noch etliche Anpassungen vornehmen müssen, denn in WCF macht man das anders.

Mir stehen also noch spannende Ereignisse bevor...

Samstag, 21. April 2012

Adobe Flash Player Rot/Blau Red/Blue

Deutsch English
Ich habe heute auf meinem Rechner mit Ubuntu ein seltsames Verhalten bemerkt, das mich einige Zeit gekostet hat: Bei YouTube Videos und anderen Inhalten, die Adobes Flash Player abspielt, sind die Farben Rot und Blau vertauscht.

Dieses Verhalten zeigt sich auf meiner NVidia Grafikkarte und hängt mit der hardwarebeschleunigten Darstellung zusammen, die das Flash Plug-in gerne vornehmen will. Also muss die Hardwarebeschleunigung deaktiviert werden.

Rechts-Klick auf ein laufendes Video, Einstellungen wählen - der Einstellungsdialog erscheint - reagiert aber nicht auf Mausklicks und kann nicht geschlossen werden.

Die Lösung ist nicht leicht zu finden, Adobe gibt sie aber in seinem Forum: Man muss das Video im Vollbildmodus abspielen, dann die Einstellungen öffnen (diese funktionieren nun!) und kann dann die Hardwarebeschleunigung deaktivieren. Danach spielt Flash alles wieder mit richtigen Farben ab.

Auf jeden Fall habe ich heute gelernt: "Google kann nicht ALLES wissen." :)
Today I noticed the weirdest behavior of Adobes Flash Player on my Ubuntu PC which took me some time to fix: Playing content on YouTube or other sites would work, but with swapped red and blue color channels.

I'm using a NVidea graphics card and the bug seems to result from a feature called hardware acceleration which is used by the Flash Plug-in. So I needed to deactivate hardware acceleration.

Right-clicking a running video and choosing Settings would open the settings dialog. Anyway, the dialog freezes and wouldn't let me click or enter data, it appeared to hang.

The solution was not easy to find, but Adobe actually offers a workaround on its forum: You need to play a video in full screen mode, open the settings dialog (which should work then) and deactivate hardware acceleration. After reloading the site Flash will display all colors nicely.

So besides of learning how to fix this specific bug, the lesson of the day is: "Google won't find ANYTHING you're looking for." :)

Mittwoch, 18. April 2012

WUBI vs. UNetbootin

Ubuntu ist ein hervorragendes Betriebssystem für Anwender, die sich ein sicheres, robustes und aktuelles Betriebssystem wünschen, um damit z.B. im Internet zu surfen. Aber wie kommt man an eine Installation?

Für Windows-Nutzer, die auf ihrem Rechner gleichzeitig auch Ubuntu betreiben möchten, gibt es im wesentlichen zwei Alternativen:
  1. Die Installation von Ubuntu innerhalb von Windows mittels WUBI. Dadurch wird Ubuntu wie eine normale Anwendung für Windows installiert und deinstalliert, beim Neustart des Rechners kann dann aber statt Windows auch Ubuntu gestartet werden. Ubuntu läuft dann zwar nicht in Windows, legt dort aber seine Dateien ab.
  2. Die Installation von Ubuntu neben Windows in einer eigenen Partition. Dazu wird eine CD oder ein USB Stick zum Booten verwendet, von dem aus der Ubuntu Installer das Betriebssystem einrichtet.
Die Installation mit WUBI verspricht, schnell, bequem und gefahrlos für das Windows-Betriebssystem zu einer Ubuntu-Installation zu gelangen. Eine CD oder ein USB Stick wird hierfür nicht benötigt. Dennoch würde ich davon abraten, denn bei einer Installation mit WUBI erbt Ubuntu die Schwächen von Windows: Man darf den Rechner nur unter Risiko ausschalten, Fehler von Windows können Ubuntu lahmlegen, CHKDISK zerstört womöglich sogar die Dateien von Ubuntu.

Stattdessen empfiehlt es sich, mit UNetbootin einen bootfähigen USB Stick (benötigt nur 1 GB) zu erstellen und Ubuntu dann vom Live-System auf diesem Stick zu installieren. Das ist zwar etwas langwieriger und unbequemer, bietet aber mehr Sicherheit, denn der Ubuntu Installer verkleinert die Windows-Partition und richtet beide Betriebssysteme so nebeneinander ein, dass sie sich nicht gegenseitig gefährden können. Außerdem kann man am Live-System auf dem Stick bereits testen, wie gut Ubuntu mit der eigenen Hardware zurecht kommt: Wird z.B. das WLAN erkannt? (Tip: Bei Problemen mit dem WLAN kann es helfen, im NetworkManager die IPv6 Unterstützung zu kappen...)

In diesem Sinne - frohes Installieren!

Sonntag, 5. Februar 2012

Beauty lies in Code!

Ich habe mein erstes Projekt bei Google Code erstellt. Den Quelltext und haufenweise Dokumentation werde ich in den kommenden Tagen veröffentlichen.

Sei gespannt, schöne Open-Source-Welt!

Bis dahin lautet mein Motto: Quelltext ist voller Schönheit!

Mittwoch, 16. November 2011

Softwareupgrade

Gestern Abend habe ich beschlossen, mein Betriebssystem auf den neusten Stand zu bringen, also her mit Ubuntu Oneiric Ocelot. Bislang hatte ich gute Erfahrungen beim Upgrade von Ubuntu gemacht und war mir daher sicher: Es wird schon nix schiefgehen.

Mein gutes Gefühl währte bis zum abschließenden Rechnerneustart. Die grafische Oberfläche, an der man sich anmeldet, erschien nämlich nicht. Schluck! Ein modernes Betriebssystem ohne Grafik? ... Keine gute Idee!

Nun war es schon recht spät, aber ein Informatiker mit kaputtem Betriebssystem, das hat dann doch meine Berufsehre gekränkt. Daher schlug ich mir die Nacht um die Ohren. Woran lag's? Offensichtlich hat der proprietäre Nvidia-Grafiktreiber beim Upgrade seinen Dienst quittiert. Die Lösung beschränkte sich also darauf, die Datei /etc/X11/xorg.conf zu löschen und den Rechner neu zu starten. Danach konnte man den Treiber einfach wieder installieren.

Da bin ich nun, ich stolzer Mann, mit meinem neuen Betriebssystem. So ganz glücklich bin ich damit noch nicht, an die neuen Konzepte der Gnome-3-Shell muss ich mich erst gewöhnen und die Anpassungsmöglichkeiten sind sehr unbequem. Also muss man sich etwas mühsam durch diverse Anleitungen zum Fein-Tuning kämpfen, und auch so manche Kinderkrankheiten überwinden, z.B. zeigt die Gnome-Shell viele Anwendungen doppelt an.

Dennoch, es ist vollbracht:

Ubuntu Oneiric Ocelot mit Gnome-3 ist ein bisschen wie ein tolles Abendkleid: Wenn man erst mal drin steckt sieht es umwerfend aus, aber irgendwie zwickt den ganzen Abend lang irgendwo noch eine Naht.

Im Gegensatz zu Kunden von Firmen mit bunten Fenstern auf dem Logo darf ich aber die Hoffnung genießen, dass die nächsten Upgrades hier entscheidende Verbesserungen mit sich bringen.

Drückt mir dir Daumen!

Samstag, 30. Juli 2011

HP LaserJet P1102 on Ubuntu / Linux

This is a short guide on how to get HP LaserJet P1102 running on Ubuntu / Linux. I ran this successfully on Ubuntu 10.04.

Have the printer powered off and disconnected before you start.

Das ist eine kleine Anleitung, wie man HP LaserJet P1102 auf Ubuntu / Linux installiert, ich habe das unter Ubuntu 10.04 ausprobiert.

Schalte den Drucker aus und schließe ihn nicht an.

Run a console und follow the instructions on the foo2zjs website:

Öffne eine Kommandozeile und folge der Anleitung auf der foo2zjs Web-Seite:

wget -O foo2zjs.tar.gz
http://foo2zjs.rkkda.com/foo2zjs.tar.gz
tar zxf foo2zjs.tar.gz
cd foo2zjs
make
sudo make install
system-config-printer

The printer configuration dialog appears. Now connect the printer to your computer (USB) and switch the printer on. The printer is automatically recognized by the system and gets listed in the printer configuration dialog. You're ready to go!

Das Drucker-Einstellungsfenster öffnet sich. Schließe den Drucker am Rechner an (USB) und schalte ihn an. Der Drucker wird automatisch vom System erkannt und erscheint im Drucker-Einstellungsfenster. Du kannst loslegen!

Samstag, 1. Mai 2010

Die Sünden der Programmierer

Der Titel dieses Postings ist eigentlich einem Artikel auf heise.de entlehnt. Es geht darin um den Grund, warum Software so fehleranfällig und unsicher ist. Der Autor meint, das sei auf die Unart zurückzuführen, Dinge zu nutzen, ohne sie vorher zu prüfen. Beinahe, wie im echten Leben, oder?

Der Großteil aller Programme ist in der Programmiersprache C bzw. deren Erweiterung C++ geschrieben. Der Grund dafür liegt höchstwahrscheinlich darin, dass viele Entwickler gar keine andere Sprache kennen, denn dem Verstand erschließt sich dieser Sachverhalt nicht:
  • C-Programme sind nicht nachweislich "schneller" als Programme in anderen Programmiersprachen.
  • Die Sprache C ist nur sehr lückenhaft spezifiziert - Interpretationsspielraum und Verlässlichkeit sind aber Gegenspieler.
  • C ist nicht typsicher, insbesondere wegen seiner Zeigerarithmetik. Das ist, als würde man einen Verkäufer fragen: "Wo liegen die Bananen?" und er weist einen den Weg in die Spielzeugabteilung. Moderne Sprachen unterbinden das.
  • C prüft nicht. Arrays in C sind deshalb nicht sicher.  Es ist, als würde man ein Auto mit 5 Plätzen kaufen können, und 6 Leute hineinstecken. Moderne Programmiersprachen unterbinden das. In modernen Sprachen fallen viele Programmierfehler schon beim Programmieren auf - bei C entdeckt der Benutzer sie erst bei der Benutzung des Programms.
  • C ist schwer lesbar. Es ist viel schwerer, einen Fehler in einem C-Programm zu finden, weil man viel länger braucht, überhaupt erstmal den Sinn des Programms zu verstehen.
  • Programmiersprachen sind Religionen. Jeder meint, die richtige zu haben. Das macht den Blick dicht dafür, eine bessere Lösung zu erforschen.
Unglückseeligerweise sind selbst Betriebssysteme in C geschrieben. Wer lernt schon gerne eine neue, bessere Programmiersprache, man hat sich doch so schön an die alte Welt gewöhnt...

Ein nicht unwesentlicher Grund dafür, das Programme abstürzen, Bankkonten von Betrügern leer geräumt werden und private Details ausspioniert werden können, ist also darin zu finden, dass man etwas nicht mehr ändern möchte, weil es "gewachsen" ist.

Krebs ist auch oft gewachsen.