1. Oktober 2011

KLab geht an die Börse

Die Firma KLab ist in Tokio erfolgreich an die Börse gegangen. Die Aktien wurden für 1700 Yen ausgegeben. Der Handel begann dann mit 3970 und 3 Tage später stehen sie bei 3500. Also kein schlechter Start. Das ist der erste Börsengang einer Social-Network / Casual-Game Firma in Japan. Vielleicht sogar weltweit. Der Buzz sagt: "Zynga of Japan". KLab ist eine Nummer kleiner als Zynga, aber ziemlich erfolgreich mit Social Games und virtuellen Gütern.


Das tolle daran: seit einiger Zeit arbeite ich mit KLab an einem Projekt wo es um Avatare auf allen Webseiten geht. Das Projekt wird in der Investoreninformation genannt ("Cheers") als eine der 5 Umsatz- und Wachstumssäulen der Firma.

Irgendwann kam der Anruf: "Wir wollen sowas wie Weblin. Du hast das schon mal gemacht. Zeig uns wie das geht". Und das haben wir dann gemacht: eine Plattform für Social Gaming auf allen Webseiten.

Wichtiges Projekt im Börsenprospekt einer Firma mit US$ 200 Mio. Marktkapitalisierung. Coole Sache das.

_happy_trading()

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.