17. September 2011

Im VMware Player vom ISO Image installieren

Für Noob-Admins wie mich: Debian in VMware Player vom ISO-Image installieren

Eigentlich soll man mit dem VMware Player keine Syteme installieren (können). Dafür gibt es die Workstation und die ist ihr Geld auch wert. Aber wenn man mal ein System probieren will, bevor man die Workstation kauft, kann man das mit etwas Handarbeit auch im Player machen.

Ich habe eine bootfähige CD als ISO-Image (in meinem Fall "C:\debian-6.0.2.1-i386-netinst.iso") und will von diesem Image ein neues Linux installieren:

1. Dupliziere eine bestehende VM oder lade eine VMware Appliance runter. Die VM kommt mit einer Konfigurationsdatei mit der Endung .vmx, mit einer virtuellen Platte mit der Endung .vmdk und anderen Dateien.

2. Im .vmx setze oder ändere die 4 Werte:
ide1:0.autodetect = "TRUE"
ide1:0.deviceType = "cdrom-image"
ide1:0.fileName = "C:\debian-6.0.2.1-i386-netinst.iso"
ide1:0.present = "TRUE"
3. Boote die VM durch Doppelklick auf die .vmx Datei

4. Beim Bootvorgang, bevor das Auswahlmenü erscheint und das Betriebssystem bootet, drücke F2 für BIOS-Setup SCHNELL.

5. Im BIOS-Setup die bootbaren Devices herum schieben bis die CDROM vor (über) der Festplatte steht. F10: Save and Exit

6. Jetzt sollte die VM automatisch nochmal booten und den Installer des ISO-Images anzeigen.

7. Nach der Installation ordentlich runterfahren

8. Das ISO-Image aus der .vmx Datei löschen:
ide1:0.fileName = ""
ide1:0.present = "FALSE"
happy_booting()

31. August 2011

Make Money with Virtual Goods

My session at Barcamp Hannover 2011:

28. August 2011

Galaxy Tab wiederbeleben - ein Wunder

Heute mal ein (weniger tiefschürfender, aber doch bewegender) Microblog:


Nach einem ersten ganzen Tag mit dem neuen Galaxy Tab 10.1 bleibt es plötzlich dunkel. Power-Button drücken, Power Button lange drücken, Power Button gaaanz laaange drüüücken, gut zureden, nichts hilft. Dunkelheit auf dem Schirm, trotz Stunden am Ladestrom. Schreck.

Aber keine Panik: Google hilft (Bing hätte vielleicht auch geholfen, aber hat ja keiner gefragt). In der Verzweiflung also gegoogelt: "galaxy tab remains dark" und finde ... warte ... es kommt gleich ... einen Blogbeitrag: Solution for Samsung Galaxy Tab unable to turn on problem

Da heißt es: Den Bildschirm betatschen und GLEICHZEITIG den Power Button pressen. Mit dem wertvollen Hinweis: nur Geduld, kann lange dauern, weiter pressen und beten.

Ich presse und presse und presse und nach gefühlten 2 Minuten lebt er wieder.

Ein Wunder.
Allah ist groß. Und der heilige Geist. Und Google. Und Voyager8 (der Blogger). Danke an alle Beteiligten. Hammer. Echt.

happy_pressing()

14. August 2011

Zweitgeist Kündigung aufgehoben


Das Hamburger Landgericht hat die Kündigung bei Zweitgeist aufgehoben.

Tja, die Mühlen der Justiz mahlen langsam. Es hat 2 Jahre gedauert. Aber jetzt ist offiziell klargestellt: die Kündigung war unwirksam.

Was für eine Kündigung? Februar 2009 wurde ich als Geschäftsführer bei der von Christine und mir gegründeten Firma Zweitgeist fristlos gekündigt. Die Kündigung war Teil des Versuchs einiger Investoren, Zweitgeist an den Rand des Konkurses zu führen, um die Firma dann zu übernehmen.

Was heißt hier Firma übernehmen? Einige Investoren haben ein lächerlich niedriges Angebot gemacht, um den Gründern ihre Anteile abzukaufen. Damit man auf dem Papier die Firma so niedrig bewerten konnte, musste sie sehr schlecht aussehen. Das ist nicht leicht bei 3 Millionen Usern und 400.000 neuen Usern pro Monat und wenn man anfängt wirklich Geld zu verdienen. Deshalb mussten alle Mitarbeiter entlassen werden. Eine Firma ohne Mitarbeiter sieht nämlich wirklich schlecht aus.

Jedenfalls sind bei diesem "Spielchen" 25 Arbeitsplätze verloren gegangen. Eure Arbeitsplätze, sozusagen Kollateralschaden, weil jemand eine stark wachsende Internetfirma übernehmen wollte. Aber das kümmert Investoren nicht wirklich. Da zählt nur der mögliche Gewinn beim Verkauf. Und da gab es eben einen Investor, der sich ausgerechnet hat, dass er seinen Anteil vervierfachen kann. Später mehr dazu.

Jedenfalls hat das Gericht klargestellt, dass der erste Akt, die Kündigung, ungültig war.

happy_pokering()

PS: Dass mir jetzt keiner mit Winner-Stories/Loser-Stories kommt. Natürlich haben alle nur verloren. Die anderen hoffen aber, dass nicht bekannt wird, was für einen Mist sie gebaut haben. Aber es ist das wahre Leben, mein Leben und euer Leben, eure Arbeitsplätze. Es ist wahr, deshalb gehört es geschrieben und nicht verheimlicht. Heimlich ist jetzt aus.

4. August 2011

Adwords Test gesponsort von Google

Google hat mir vor einiger Zeit einen 100 € Adwords Gutschein geschickt. Anscheinend gräbt Google inzwischen auch Registergerichte durch nach neuen Firmen. Mir solls recht sein. Besser als noch ein Büromaterial-Katalog.

Das - dachte ich mir - ist doch eine gute Gelegenheit, mal kostenlos mit Adwords zu experimentieren. Die Kampagne von Google wendet sich an alle möglichen IT-Firmen. Also - dachte ich mir - muss man nicht unbedingt SEO/Adwords Experte sein, um das Angebot zu nutzen. Adwords - dachte ich mir - wird schon so einfach sein, dass ich es auch verstehe. Schliesslich - dachte ich mir - wollen sie ja, dass die kostenlose Adwords Kampagne so gut gefällt, dass man noch etwas mehr investiert. Falsch gedacht.

Adwords ist nicht für Dummies und nicht für Handbuch-Ignorierer, wie mich. Die Kampage ist zwar einfach aufgesetzt, funktioniert aber leider nicht. Ich bekomme keine Klicks. Die Ads werden gar nicht angezeigt, weil angeblich die Keyword-Relevanz zu schlecht ist.

Am Inhalt kann es nicht liegen. Der Inhalt besteht aus Massen an selbstgeschriebenen Text zu einem bestimmten Thema. Die Seiten sind reichhaltig, fokussiert, originär: www.galactic-developments.de. Daran kann es nicht liegen. Die Keywords stammen aus dem Text und jedes Keyword linkt auf die Seite aus der es stammt. Trotzdem werden die Keywords nicht angezeigt. Selbst wenn ich wollte, könnte ich nichts investieren, um die Website zu pushen, denn Google will mein Geld nicht.

Mögliche Schwachstellen meiner Kampagne:

  • Die Website hat keine META-Keywords.
  • Die Landing Pages haben nicht das Keyword im Title.
  • Die Kampagne hat nur ein Ad. Man könnte für jeses Keyword ein Ad machen.
  • Die Keywords kommen nicht im Ad-Text vor.
  • Die Website ist nicht SEO-optimiert.
  • Ich habe nichts zu verkaufen. Adwords ist für Shops gemacht, die immer direkt auf ein Produkt linken.
_happy_advertising()

14. Juni 2011

An HTML based Chat Window with WebKit, jQuery, and tricks

Over the weekend I was working on the OVW chat window. The chat window is very similar to the avatar display and also very different. The similarities are:

  • both are display modules
  • both use WebKit
Because they are both display modules, I could take the avatar display module code and strip away the avatar part to keep only nicknames. The chat window needs only nicknames. Later there will be images and more features. But for the start we need only text. The chat module has the same structure as the avatar module. It subscribes to a small number of virtual presence model events and then turns around and paints the display in HTML.


See the ui-layout-* CSS-classes? They are used by jQuery UI Layout. There is a bit of configuration necessary, but only a bit: http://code.google.com/p/ovw/source/browse/trunk/Apollo/bin/Win32/Debug/modules/Chat/Chat.html?r=255#153

As always, styling is very simple. Need bold nicknames? Here they are:
#ChatOut .cNickname { font-weight:bold; }
On the other hand, chat window and avatar display are very different:
  • chat is a dialog where the Chat.html code is in an IFRAME
  • avatar display paints directly, has no dialog frame
Calling the avatar display I can simply call a JavaScript function in WebKit. But in case of a Dialog with IFRAME, things are a bit more complicated. The IFRAME is a HTML window inside the HTML window. The WebView module has only a handle to the outer HTML/JavaScript. There is no direct access to the JavaScript of the inner HTML. I can call a JavaScript function in WebKit, but the function is executed in the context of the dialog wrapper. This is OK, if I want to control the dialog functions. But talking to the inner HTML is more difficult.

I am sure there are way to get to an embedded IFRAME from C++. But I did not want to get too deep into enumerating WebKit objects from C++. I needed a way to call JavaScript in the embedded IFRAME from the parent frame. Luckily we are in the same security domain, so calling JavaScript across frames is no problem. My solution is to call a function in the Dialog, which calls a function in the IFRAME, which evals the code I want to execute in the IFRAME.
function ContentEval(sCode)

{
return document.getElementById('Content').contentWindow.EvalJS(sCode);
}
Not very nice. A bit dirty, but it works. Also not very fast. Anyway, there are not many messages which take this route. Just adding participants and chat lines. I am confident, that we find a better way to do this later.

_happy_wrapping()

UPDATE: a week later, I have direct access to embedded frames. I am searching the frame by it's DOM-ID, then call the function inside the frame. I do GetFrameByPath to find the frame, because the frame may be inside another frame. Frames inside frames will be identified by a "/" separated list of DOM-IDs. That's my so called frame-path: http://code.google.com/p/ovw/source/browse/trunk/Apollo/bin/Win32/Debug/modules/Chat/Chat.html?r=414#200

The GetFrameByPath function is a mess of COM auto-pointers and QueryInterface. The ugly face of C++. Thank FSM someone invented better ways.

7. Juni 2011

More OVW Progress

Another week of evenings and weekend worth of progress on the next weblin generation (OVW). I am now working on browser tracking, support for multiple tabs and the multiple views for the same scene.


1. Firefox Add-on

Unfortunately, the rather simple weblin way of tracking browsers is not sufficient anymore. We want tabs (more about tabs and windows at the OVW blog).

Reliable information about visible tabs is only available inside the browser. So I need real browser addons. I started with Firefox some time ago. The addon keeps track of all tabs, when they open/close, become visible and when they navigate. It sends all the information over a local TCP connection to the client (using a simple remote procedure call protocol). This sounds complicated and it is, because the socket implementation in Firefox has its quirks. I could tell stories. But the beauty of a TCP connection is, that if the browser crashes or disappears, then the client will notice when the TCP connection goes down. It will then leave all rooms automatically, even if the browser addon does not say goodbye.

2. Tracking Browser Coordinates

Unfortunately, I don't get a real window handle (HWND) inside the browser. I need a native component to get a HWND for the tab. Why HWND? because I want to track the coordinates of the tab: resize and move events. I could add a native DLL to the addon, but then the addon is not cross-platform. Since I have a native part anyway (the client), I rather make the platform dependent processing in the client.

I implemented a BrowserInfo-module which finds the tab's HWND in the window list and does GetWindowRect() to get coordinates. The module also arranges the window stacking order with SetWindowPos() so that the avatar display is always directly on top of it's browser. That's good old Win32 coding. While most of the code is cross-platform, this part must be adapted to other operating systems, i.e. MacOS.

3. Model View Controller

I am very happy with the Model-View-Controller architecture. The "view" is only responsible for showing avatars. It can be closed and opened and re-creates everything from the model. The view uses the WebKit and JavaScript heavily.

The virtual presence module manages entering and leaving chat rooms, participants and chat lines. This is the "model". The view gets events from the model when participants enter/leave/chat. The view can always query the model. The model has only data structures. The view creates visible avatars.

And best of all: there can be multiple views for the same model. This means, that 2 browser windows can show the same scene.

_happy_modeling()