4. November 2012

Die besten Science Fiction

...die ich gelesen habe:
Ich habe eine Schwäche für Imperien und die Föderation, Historie und Archäologie, Hard Science, große Zahlen, Ausserirdische ohne spitze Ohren oder Noppen auf der Nase, Agenten und Verschwörungstheorien, Zeitreisen ohne Paradoxe, Cyberpunk, Laser Cluster, Nano, KI und manchmal Monarchie, Ehre, Pflicht, Helden. Ich bin immer für den Jungen (die junge Frau) vom Lande, der (die) mit Hilfe von Outlaws die Prinzessin (den Prinzen) befreit und das Empire rettet.

Die Liste der 11 "Besten" bildet genau das ab.

Die Legende von Christopher Sim / A Talent For War (Jack McDevitt)
Ich mag die Kombination von Archäologie und Zukunft. Rätsel und überraschende Wendungen. Nichts ist so wie die offizielle Geschichtsschreibung (der Zukunft) behauptet. Die anderen Romane über Alex Benedict, Antiquitätenhändler im 12. Jahrtausend, sind genauso gut. Trotz ferner Zukunft nicht techniklastig. "Epilogue: He read the inscription. Jerome Courtney died 40 years _after_ the war. Tears filled his eyes, and he went down on one knee". Sehr ergreifend (wenn man es gelesen hat). Emotion in Slow Motion nach 300 kurzweiligen Seiten. 
Die Stimme des Wirbelwinds / Voice of the Whirlwind (Walter Jon Williams)
Megacorps, Aliens, KI, Kloning, orbitale Mächte. Ein Ex-Agent wacht ohne Erinnerung auf und rettet am Ende, nach viel hin und her, die Menschheit vor einer Verschwörung. Klingt platt, ist aber eine gute Story im klassischen Cyberpunk Szenario, komplett mit Daumennagel-Displays und Video T-Shirts. Walter Jon Williams versteht was von Technik, im Gegensatz zu William Gibson, der tolle visionäre Stories schreibt, aber die IT, naja.
Der verschollene Computer / The Cosmic Computer (H. Beam Piper)
Aufstieg und Fall von Zivilisationen bewegen mich immer. Auf einem Randplaneten der Föderation: Jahrzehnte nach dem Sezessionskrieg entdecken Schatzsucher ein Geheimnis, das die Föderation zu Fall bringen kann. 
Die Ehre der Königin / The Honor of the Queen (David Weber)
Harte Military SF: Nicht wirklich pazifistisch korrekt, aber so ist die "Realität" eben manchmal. Politische Intrigen, High-Tech Marines und religiöse Fanatiker. Ein friedliches Königreich sucht Verbündete gegen einen übermächtigen Gegner und die lokalen Einsatzkräfte müssen den höchsten Einsatz bringen, um einen ganzen Planeten zu retten. Action pur. Point Defense Laser Cluster, Missile Launcher und Gamma Ray Laser garantiert.
Die Sphären / Matter (Iain M. Banks)
Hier aufgeführt als Vertreter der Kultur-Romane. Das hätte auch "Bedenke Phlebas" oder "Excession" sein können. Eines der am weitesten gespannten großartigsten Zukunftsszenarien. Mit allem was in der Science Fiction gut und teuer ist: Nano, Effektoren, hyperintelligente KI mit komischen Namen ("Not Invented Here"), uralte Zivilisationen, gigantische Raumschiffe, Formenergie, Displacement, Antimaterie, Trillionen Individuen menschlicher und anderer Bevölkerung auf gewaltigen Orbitalen, Androiden, Schiffsavatare, Mind-State-Backups. Mit High-Tech neben primitiven Planeten, wo man sich eigentlich nicht einmischen darf. Manche machen es aber doch, wie z.B. der euphemistisch bezeichnete Dienst für "Besondere Umstände" der "Kontakt" Sektion der "Kultur". Die Prinzessin eines primitiven Planeten, die in der Kultur als Kontakt-Agentin ausgebildet wurde, versucht die Milliarden Bewohner ihrer (künstlichen) Heimatwelt vor einer uralten Gefahr zu retten. Vorher muss ihr Bruder sie aber erst finden. Dafür reist er weit über seine eigenen Welt hinaus durch die "Kultur". Hat Längen, aber dafür ein dramatisches Ende. Eine Pflichtlektüre, wegen des phantastischen Szenarios. Da sehen andere Far-Future Settings echt alt aus.
Transhuman Space (David Pulver et al.)
Near Future Hard Science: Die Welt am Beginn des 22. Jahrhunderts. Kein Roman, sondern ein Rollenspiel-Setting mit dichten Fakten und kurzen Story-Fragmenten. Sehr realistisch extrapolierte Geopolitik mit 8 Großmächten, Gengineering, Memetik, Rogue AI, Mars Triaden, Fusion-Drives, High-Frontier und Broken Dreams. Wenn man David Pulver etwas vorwerfen will, dann, dass er ein Jahr vor 9/11 geschrieben hat, denn sonst hätten die Negative Growth Terrorristen den Mars Elevator wohl mit einer Nuklearwaffe doch zerstört.
Das Erdenbuch von Sturmtor / The Earth Book of Stormgate (Poul Anderson)
Kurze und längere Geschichten der Polesotechnischen Liga. Die Abenteuer unabhängiger Sternenhändler wie Nicholas van Rijn. Rätsel, Abenteuer und oft überraschende Lösungen. Erzählt aus der Sicht von Hloch vom Sturmtor Clan des fliegenden Volkes der Ythri. Im "Erdenbuch" findet man auch die Vorgeschichte der Agentenromane mit Dominic Flandry, die einige hundert Jahre später zur Zeit des Imperiums spielen.
Schismatrix / Schismatrix (Bruce Sterling)
Ein paar Jahrhunderte durch die fragmentierte Zukunft der Menschheit im Sonnensystem. Unterhaltsame Story. Der interplanetare Teil der Menschheit entwickelt sich in verschiedene Richtungen, trägt Konflikte offen und verdeckt aus während die Erde eine öko(nom|log)ische Katastrophe erfährt, was den raumfahrenden Teil nicht wirklich interessiert. Ein krazzes Zukunftsbild. Sehr bunt. Alternativ: Diamond Age, weil Neal Stephenson auf jeden Fall hier erwähnt werden muss.
Der Splitter im Auge Gottes / The Mote in God's Eye (Larry Niven und Jerry Pournelle)
Ausserirdische können auch mal ganz anders. Andere Intelligenz, andere Motive, andere Zivilisation. Ein fremdartiges Sonnensystem mit dem Bruttosozialprodukt des gesamten Empires der Menschen, das selbst gerade geschwächt aus einem Bürgerkrieg kommt. Die Expeditionsflotte muss herausfinden ob sie einer Chance oder einer Bedrohung gegenübersteht. Fast trifft man die falsche Entscheidung. Wer Larry Niven sagt, muss auch Ringwelt sagen. Ringwelt selbst ist ok, aber die unzähligen Geschichten aus dem Ringwelt-Universum Franchise sind unvergleichlich. Viele sind sehr sehr gut, aber die meisten eher Kurzgeschichten, deshalb hier nicht vertreten. Wenn mal Zeit ist für 20 k Seiten, dann Ringwelt-Universum. 
Gottes Maschinen / The Engines of God (Jack McDevitt)
Wieder Archäologie und Geheimnisse. Aber es gibt leider nicht so viele Romane ohne Gewalt und Krieg. Deshalb darf Jack McDevitt hier zweimal. Atlantis untergegangen, Sodom und Gomorra durch "Gottes Zorn" ausgelöscht. Das war vor langer Zeit. Interstellare Forschungen zeigen, dass auch auf anderen Planeten die Zivilisation regelmäßig untergegangen wird. "Irgendetwas im Zentrum der Galaxie mag anscheinend keine Mauern".
Sternenkrieger / Starship Troopers (Robert A Heinlein)
Durch den Kinofilm komplett verzerrt. Eigentlich eine klassische Hero's Journey: Johnny geht aus Liebe und Dummheit zum Militärdienst. Nach der "härtesten Ausbildung" unter dem "besten Platoon Sergeant" stolpert er durch die Einsätze, unsicher, aber doch irgendwie gut und auf jeden Fall kurzweilig. Inzwischen ist nun doch offiziell Krieg gegen die Insektenvölker und man kommt nicht mehr aus dem Militärdienst raus, ups. Also weiterstolpern, verlieben, dann Offiziersanwärter und schließlich eine Schlüsselrolle bei einer entscheidenden Kommandoaktion. "Jedes Jahr gewinnen wir ein bisschen mehr". Heinlein hat die sog. Powered Battle Armor erfunden (siehe Avatar und Matrix), genial für die damalige Zeit und in der technischen Beschreibung immer noch aktuell. Vielleicht ist er auch der Erfinder des Boot-Camps als Stilmittel.
_happy_reading()

30. Oktober 2012

Webkit: Error Code -999 Surprise

Recently I was programming with WebKit. I am trying to handle all errors, log them appropriately and discovered an error, that should not happen. If WebKit navigates to a URL and the navigation is cancelled by another navigation, then WebKit throws an error. A pseudo error. Quite a normal approach.

It would be nice, if my error handler could distinguish between real errors and pseudo error  Fortunately the error handler gets an error code. The code is -999. A strange number. Could it be, that there are 1000 error cases and just by chance NAVIGATION_CANCELLED is number -999. Probably not.

Stepping a bit closer to the error source, we discover in WebFrame.cpp:

ResourceError WebFrame::cancelledError(const ResourceRequest& request)
{
    // FIXME: Need ChickenCat to include CFNetwork/CFURLError.h to get these values
    // Alternatively, we could create our own error domain/codes.
    return ResourceError(String(WebURLErrorDomain), -999, request.url().string(), String());
}

Looks like -999 is a hack. Other error condition have "real" codes:

ResourceError WebFrame::blockedError(const ResourceRequest& request)
{
    // FIXME: Need to implement the String descriptions for errors in the WebKitErrorDomain and have them localized
    return ResourceError(String(WebKitErrorDomain), WebKitErrorCannotUseRestrictedPort, request.url().string(), String());
}


Happenz. But still a surprise, because...

THIS IS THE MAJOR OPEN SOURCE BROWSER ENGINE, THAT THE WORLD USES ON A BILLION DEVICES.

WTF

_happy_cooking_with_water()

21. September 2012

Suche Java Entwickler und Database Manager

Als CTO der Deutschen Messe Interactive (DMI), einer neuen Tochter der Deutschen Messe AG in Hannover, suche ich für die IT-Abteilung mehrere Leute:

Wir bauen die IT-Abteilung der DMI weiter aus. Ein ganzes Team kommt dazu und ein Team wird ausgebaut. Wir suchen besondere, gute Leute, die mit anpacken, Produkte und Projekte umsetzen und mit dem Unternehmen wachsen wollen. Wer mich kennt weiß, dass wir aktuelle Technologien und Entwicklungsprinzipien verwenden: Agile, ScrumUnittestingClean CodeSOLIDDRYKISS, Continuous Integration und wir machen ein regelmäßiges Entwickler-Seminar.

Die Deutsche Messe stellt im B2B-Umfeld Kontakt zwischen Herstellern und Interessenten her. Dazu dienen die großen Präsenzmessen CeBITHANNOVER MESSE und viele andere. Die DMI setzt das Business der Messe im Netz fort. Die DMI führt Anbieter und Geschäftskunden über das Internet zusammen. Durch enge Verzahnung mit den Marketing- und Vertriebssystemen der Hersteller wird der Wert solcher Kontakte wirtschaftlich messbar. Kein Spam, keine New Economy, keine Handelsplattform, sondern echte Business Leads.

Bezahlung: gut
Urlaub: ziemlich gut
Arbeitsort: Hannover
Sicherheit: ja, das Startup ist solide finanziert als Tochter der Deutschen Messe (kein VC)

Schreibt mir an: heiner.wolf@messe-interactive.de
Schickt mir eine Telefonnummer und ein kurzes Profil. Ich rufe zurück.

Hier sind die technischen Themen, die mich für den Anfang mal interessieren: Entwickler Fragebogen.

20. September 2012

The Day We Invented AJAX and REST

While searching for prior art for Eolas' claims, that the U.S. Patent No. 7,599,985 covers AJAX, I just discovered this:

AJAX in June 1998

The CoBrow group at Distributed Systems Dept., Ulm University did AJAX style communication in June 1998.

In '98 we implemented a HTML only client for the CoBrow project. This means a dynamically changing HTML page, which shows updated data whenever things changed on the server. CoBrow was about meeting people on web pages. A HTML based chat was used to show a Java applet free dynamic GUI.

Today you'd say: dynamic HTML and server updates? no problem. Use jQuery, AJAX, WebSocket, maybe even XMPP and BOSH for the routing. But in 98, there was no AJAX, no XMLHttpRequest, not even iframe for all browsers (IE and Netscape 4).

So, the software engineer uses what's available in all browsers:
  • frameset with frames and 
  • a HTML form which can be 
  • loaded from a server and 
  • read by other frames.
The request-frame keeps loading a HTML page with a form from the server. The form contains named form fields. The GUI-frame read the fields and uses the data to show something. There are no cross-domain issues, because the GUI-frame and request-frame have the same domain. A simple way to request key-value pairs from the server.

Source Code

Now comes the tricky part. At that time we programmed web pages with shell/perl scripts. There was not very much else, except for PHP 2, which is not the PHP you want. So much for stateless pages. No Java server runtimes, no application servers.

If you wanted persistence, multiple concurrent clients and other fancy stuff in the server, then you implemented your own server including the HTTP parser. Therefore, the server was written in plain C with a kind of object oriented style. Just as other guys did at the same time, e.g. the apache devs Brian Behlendorf, Roy T. Fielding et al. Could have been C++, though, but wasn't.

The feature was "checked in" to the code base on June 22nd, 1998.

On Mar 29, 1999, the Cobrow Newsletter - No. 3 announced the "HTML user interface":
http://www.virtual-presence.org/external/www.cobrow.com/pages/docs/cobrow-news-3.txt

For those of you interested in software archaeology, here comes the code from CoBrow Server "cbVici", version 2.1.100:

Development of the "HTML user interface" started:

Print.c(310):
  PrintHistoryItem(conn,  style, "22.05.1998", "1.13.6", "hw", "Split off Primitives from Command, added module HtmlUI");

AJAX like function added 1 month later:

Print.c(308):
  PrintHistoryItem(conn,  style, "22.06.1998", "1.14",   "hw", "response=application/x-html-formencoded response data");

Implementation:

Response.c(363):
#define RESPONSECODER_FORM_HEAD "<HTML>\n<BODY BGCOLOR=\"#%s\">\n<FORM name=\"%s\">\n"
#define RESPONSECODER_FORM_ITEM "<INPUT name=\"%s\" type=\"hidden\" value=\"%s\">\n"
//#define RESPONSECODER_FORM_ITEM "<INPUT name=\"%s\" type=\"text\" value=\"%s\"><br>\n"
#define RESPONSECODER_FORM_TAIL "</FORM>\n</BODY>\n</HTML>\n"

Response.c(524):
int CBResponseCoder_Add(ResponseCoder *coder, char *name, char *value)
{
  int ok= false;
  if (coder == NULL) return ok;

  if (! strcasecmp(coder->codertype, QUERYARG_RESPONSE_VALUE_FORM)) {
    if (coder->cnt+ strlen(name)+ strlen(value)+ strlen(RESPONSECODER_FORM_ITEM) +1 < coder->size) {
      sprintf(&(coder->buf[coder->cnt]), RESPONSECODER_FORM_ITEM, name, value);
      coder->cnt+= strlen(&(coder->buf[coder->cnt]));
      ok= true;
    } else {
      TRACE(TR_ERR, "CBResponseCoder_Add: RESPONSECODER_MAX_ITEM_LEN exceeded");    
    }
  } else if (! strcasecmp(coder->codertype, QUERYARG_RESPONSE_VALUE_JSCOOKIE)) {
    if (coder->cnt+ 64+ strlen(name)+ strlen(value)+ strlen(RESPONSECODER_JSCOOKIE_ITEM) + strlen(gMyDomainName) + 1 < coder->size) {
      char gCookieDomainName[MAX_HOST_NAME_SIZE];
      sprintf(&(coder->buf[coder->cnt]), RESPONSECODER_JSCOOKIE_ITEM, name, value, assert2dots(gCookieDomainName, gMyDomainName));
      coder->cnt+= strlen(&(coder->buf[coder->cnt]));
      ok= true;
    } else {
      TRACE(TR_ERR, "CBResponseCoder_Add: RESPONSECODER_MAX_ITEM_LEN exceeded");    
    }
  } else if (! strcasecmp(coder->codertype, QUERYARG_RESPONSE_VALUE_KEYVALUE)) {
    if (coder->cnt+ strlen(name)+ strlen(value)+ strlen(RESPONSECODER_KEYVALUE_ITEM) + 1 < coder->size) {
      sprintf(&(coder->buf[coder->cnt]), RESPONSECODER_KEYVALUE_ITEM, name, value);
      coder->cnt+= strlen(&(coder->buf[coder->cnt]));
      ok= true;
    } else {
      TRACE(TR_ERR, "CBResponseCoder_Add: RESPONSECODER_MAX_ITEM_LEN exceeded");    
    }
  } else {
    if (coder->cnt+ strlen(value)+ 1 < coder->size) {
      sprintf(&(coder->buf[coder->cnt]), RESPONSECODER_PLAIN_ITEM, value);
      coder->cnt+= strlen(&(coder->buf[coder->cnt]));
      ok= true;
    } else {
      TRACE(TR_ERR, "CBResponseCoder_Add: coder->size exceeded");    
    }
  }

  return ok;
}

Command.c(1203):
 if (!strncasecmp(subsubsection->part, SUBSUBSECTION_PROPERTIES, strlen(SUBSUBSECTION_PROPERTIES))) {
// GET /users/<id>/properties/<propertyname>
  PropertyList *propertylist= NULL;
  //                  ListHdr cmd_params;
  //                  ResponseCoder *coder= NULL;
  //                  ClearList(&cmd_params);
  //                  StringPartArgs2List(theJob->args, &cmd_params);

  if (subsubsection->next != NULL) {
   name= subsubsection->next->part;
   TRACE(TR_CMD, "GET /%s/%s/%s/%s\n", notnullptr(section->part), notnullptr(subsection->part), notnullptr(subsubsection->part), notnullptr(name));
   if ((propertylist= CBClient_GetProperties(theClient)) != NULL) {
    value= CBProperty_FindPropertyInList(propertylist, name);
    if (value != NULL) {
     Elem *param= NULL;
     if (FindCaseNamedElemInList(CMD_PARAM_RESPONSE, (Elem**) &param, &cmd_params)) {
      coder= CBResponseCoder_New(ReadStrElem(param));
     } else {
      coder= CBResponseCoder_New("");
     }
     if (coder != NULL) {
      CBResponseCoder_Open(coder, "get_single_property_response");
      CBResponseCoder_Add(coder, name, value);
      CBResponseCoder_Close(coder);
      JobResponse(theJob, HTTP_OK, CBResponseCoder_GetType(coder), CBResponseCoder_GetData(coder), CBResponseCoder_GetLength(coder));
      CBResponseCoder_Dispose(coder);
     } else JobResponse(theJob, HTTP_INTERNALERROR, HTTP_CONTENT_HTML, "CBResponseCoder_New failed", 0);
    } else JobResponse(theJob, HTTP_NOTFOUND, HTTP_CONTENT_HTML, "no such property available", 0);
   } else JobResponse(theJob, HTTP_NOTFOUND, HTTP_CONTENT_HTML, "no properties available", 0);
...

See how the client could control the encoding by requesting a specific MIME-type: application/x-html-formencoded. HTML-formencoded response data, just great.

 I do not imply, that we invented AJAX and everyone just copied. At the time, there were other groups with similar ideas, including the IE dev team at MS. But in June 98 we definitely invented client-server requests for data independently of other groups at a very early date.

The source code was publicly available. It was announced by an email newsletter. What else can be done? That's what I call a state of the art and prior art with respect to U.S. Patent No. 7,599,985.

Thanks to contributing coders, department heads and project leads:
  • Heiner Erne
  • Axel Busch
  • Holger Boenisch
  • Lars Kaufmann
  • Dieter Finkenzeller
  • Konrad Froitzheim
  • Peter Schulthess 
_happy_ajaxing()

BTW: the REST part is in Command.c(1203): e.g. URIs like /users/<id>/properties/<propertyname>

Just as if AJAX-like client-server data requests are not enough. They also use REST-like URIs where the URI identifies data resources and not just a SOAP-like service access point.

Those were the days.

15. Juni 2012

Google Buys Meebo

News is out, that Google will buy Web Instant Messenger company Meebo for 100 M$. This is said to be an Acq-hire by which Google buys a team of engineers and possibly other talent. Most Meebo services will be shut down quickly. Another indication, that this transacton is about talent.

BUT: how in hell can this be about talent? Meebo has less than 200 employees. This makes more than US$ 500,000 for every employee, probably closer to $ 1,000,000 for each tech person and some very good business developers. That's a big number. How much does it take to hire good engineers. It's definitely not cheap. I'd count 150,000 to hire top devs, another 150 k each to forge a team. Of course, it takes 3 years to forge world class teams. During that time they cost 500 k salary. But during the forging, they deliver 3 years worth of stuff. The value creation subtraced, it costs no more than 150 k. That's a total of 300 k. But 1000 k, no way. Ok, the time factor. Acq-hire delivers quickly. But Google should have the top-engineering-team-pipe fully loaded and should be able to build enough teams.

So, either I am completely off with my price tags or there is somehing else going on. I built very good teams, which were on their way to world class, if they just had more time. I know the cost.

Maybe it's not only about the talent. Maybe Meebo has patents. What was there initial technology? Web based IM. Maybe there are Web IM patents. Who has a big chat feature on it's social network? could that be Google's biggest competitor?

I admit, that I do not know about any related patents (note: do research), but there must be more, than 100 top engineers for $ 100,000,000.

_happy_webchatting()

Update: a quick USPTO research returns several patent applications around the web chat topic.

Here are Meebo's patent applications. It looks like they started patenting late, but with force. As if someone prepared for a takeover.
  1. 20070224978 Method And System For Event Polling
  2. 20080010344 METHOD AND SYSTEM FOR EMBEDDED PERSONALIZED COMMUNICATION
  3. 20080034040 METHOD AND SYSTEM FOR EMBEDDED GROUP COMMUNICATION
  4. 20080126484 METHOD AND SYSTEM FOR DETERMINING AND SHARING A USER'S WEB PRESENCE
  5. 20090307082 SYSTEM AND METHOD FOR WEB ADVERTISEMENT
  6. 20090307089 METHOD AND SYSTEM FOR SHARING ADVERTISEMENTS IN A CHAT ENVIRONMENT
  7. 20090307325 SYSTEM AND METHOD FOR SHARING CONTENT IN AN INSTANT MESSAGING APPLICATION
  8. 20100070899 TECHNIQUES FOR SHARING CONTENT ON A WEB PAGE
  9. 20100107088 PROVISIONING INSTANT COMMUNICATIONS FOR A COMMUNITY OF USERS
  10. 20100306039 TECHNIQUES FOR CUSTOMIZED DELIVERY OF ADVERTISEMENTS
  11. 20100306066 TECHNIQUES FOR DISPLAYING AN ADVERTISEMENT ACROSS MULTIPLE PAGES
No. 1 "Method And System For Event Polling" sounds interesting. I did not read the full application, but it sounds like any HTTP polling/long-polling as used in web chats  would be affected (see Comet, BOSH). I would assume, that there is prior art, though. On the other hand, they are not stupid (remember: "world class team"). Maybe they found a twist to make that patent work.

No. 3 "...EMBEDDED GROUP COMMUNICATION" basically claims the chat on a web page.

No. 6 "...ADVERTISEMENTS IN A CHAT ENVIRONMENT" sounds interesting, if you want to monetise the chat feature (in the stupid ad'y way).

If these patents are granted, then Google may be able to extract $ 100 M from Facebook, the largest web chat with 1 billion users. That would be 10 ct. per user similar to the MPEG-LA licensing of the video.

28. Mai 2012

Hetzner Root Server with RAID does not Boot after disk swap and re-Installing Grub Bootloader

(I am writing this to pay back to the Web, because it helped me to solve a problem and my post might help someone else.)

Two weeks ago a disk of my Hetzner root server was slowly degrading. I asked for an exchange, got the go from Hetzner support, removed the disk from RAID1. Hetzner installed a new disk and booted up. I added the disk to the RAID, resync, done.

Request Rescue-System
Two weeks later the server just disappeard from the net with all services. No connection possible on any port. No idea, if the earlier disk change was related to this problem. I suppose it was.

Here is what I did to fix it:

Check if it boots into the rescue system

Log in to the Hetzner management site (https://robot.your-server.de/) and enable the rescue-system. Then request an automatic hardware reset.

Connect to the server, log in as root. This means, there is no hardware problem and no persistent routing problem.

Request Hardware-Reset
Just to be sure: request another hardware reset and let it do the normal boot. Trying to connect again fails. This eliminates a temporary routing problem or a switch problem (I once had a switch problem, where after a power outage, the switch needed an "I am here" from the server in order to send packets on the link. The only way to make the server known to the switch was a reset to force a DHCP request during boot.)

I need to know what happens on the console during boot

Asked Hetzner support to attach a LARA remote console. The  console shows the local screen output and accepts keyboard input. It is even possible to re-configure the BIOS.

Request hardware reset and watch the console. I see the memory test, scanning for devices, 2 disks found (fine), then "Booting from local disk"...

Remote console Java applet
Since the disks were found, it must be a problem on the disk. Maybe the bootloader is broken.

Check the file system and the re-install the bootloader

Request the rescue-system and then a hardware-reset. Connect to the rescue system.

Possible to mount the RAID?

# mount /dev/md1 /mnt

Yes. Do a file system check (first umount the file system):

# ummount /mnt
# fsck /dev/md1;

Shows some (many) errors. Fixed them by staying on the "y" key. Could use the auto repair option of fsck (-y).

Re-Install the bootloader

This is a Hetzner installimage-setup, so there should be a grub bootloader. Check for the /boot/grub/ folder. Again mount the RAID.

# mount /dev/md1 /mnt
# ls /mnt/boot/grub

It is there, so there is a good chance, that the bootloader is grub, not lilo. Now re-install grub on the disk. Actually on both disks, just in case one is missing.

Make a chroot environment:

# mount /dev/md1 /mnt
# mount -t none -o bind /dev /mnt/dev
# mount -t proc -o bind /proc /mnt/proc
# mount -t sysfs -o bind /sys /mnt/sys
# chroot /mnt

Grub:

# grub

Look for the file stage1 to find the boot partitions

grub> find /grub/stage1
 (hd0,1)
 (hd1,1)

Install the bootloader on both partitions. Both are regarded as hd0 from the point of view of the bootloader at boot time.

grub> device (hd0) /dev/sda
 device (hd0) /dev/sda
grub> root (hd0,1)
 root (hd0,1)
  Filesystem type is ext2fs, partition type 0xfd
grub> setup (hd0)
 setup (hd0)
  Checking if "/boot/grub/stage1" exists... yes
  Checking if "/boot/grub/stage2" exists... yes
  Checking if "/boot/grub/e2fs_stage1_5" exists... yes
  Running "embed /boot/grub/e2fs_stage1_5 (hd0)"...  17 sectors are embedded.
 succeeded
  Running "install /boot/grub/stage1 (hd0) (hd0)1+17 p (hd0,1)...
 succeeded
 Done.

The same for the other disk

grub> device (hd0) /dev/sdb
grub> root (hd1,1)
grub> setup (hd0)
grub> quit

And reboot - works.

(Maybe my mistake was not to re-install the bootloader after swapping the disk. I expected, that the RAID1 resync would make both disks identical on the sector level. Maybe this assumption is wrong. The fsck problems may also indicate, that the boot sector was affected by disk problems, who knows. These things happen, especially to part time admins.)

_happy_grubbing()

19. Februar 2012

Tech Startups brauchen CTO-Gründer

Was für ein Traum. Ein neuer Gedanke geht um in Silicon Valley. High Tech Startups brauchen einen Gründer als CTO. Aktueller Artikel auf TechCrunch: "In The Future, The Business Founder Will Not Be Ignored".

Ein paar Auszüge:

  • "A startup requires a founder with a deep technical skillset."
  • "So much, in fact, that they can often be funded without the business counterpart."
Schade, dass die deutsche Startup-Szene nicht so weit denkt. Da gilt noch "Hauptsache ein Vertriebsterrier ist dabei, der CTO findet sich schon". Oder wie Clemens von Bergmann vom High-Tech Gründerfonds (HTGF) sich ausdrückte: "Jeder ist ersetzbar". Jetzt entlassen wir erstmal den CTO und das Engineering Team. Huch, der Investor will dann nicht mehr investieren. Komisch. Vielleicht ist die Technik doch wichtig? 

_happy_founding_with_htgf()

1. Februar 2012

Stellenausschreibung Senior Java Entwickler(in)

Ihre Aufgaben:

  • Selbständige Projektarbeit in einem Scrum- Team
  • Entwicklung von webbasierten Anwendungen, Webservices und ggf. nativen Anwendungen
  • Aktive Teilnahme an modernen agilen Entwicklungsprozessen
  • Praktische Arbeit bei der Implementierung als „primus(a) inter pares“
  • Mitarbeit bei der Festlegung der IT-Strategie für die Systeminfrastruktur
  • Aktive Teilnahme an interner Weiterbildung
Ihre Qualifikationen:
  • Erfahrungen im Bereich objektorientierter Entwicklungsmethoden
  • sehr gute Programmierkenntnisse in Java/J2EE , Spring, Hibernate, JPA
  • sicherer Umgang mit CSS, JavaScript, XML, DOM/DHTML, Webservices
  • Erfahrungen in der Datenbankentwicklung (MySQL)
  • Know-How bei Tools wie Subversion, Maven, Eclipse, …
  • Kenntnisse agiler Entwicklungsmethoden wie Scrum und Unit-Testing
  • Idealerweise Erfahrung mit moderner Programmiermethodik wie TDD, SOLID, DRY, KISS
  • Abgeschlossenes Hochschulstudium der Informatik, Naturwissenschaften, Ingenieurwissenschaften oder vergleichbare Qualifikation
  • Mindestens 5 Jahre Berufserfahrung als Java Entwickler
  • 2 Jahre Teamleitung als Lead-Developer/Senior-Developer
  • Sehr gute Programmierkenntnisse und mehrjährige praktische Arbeit in wenigstens 3 aus der Top-10 der Programmiersprachen: z.B. C++, C#, Java, PHP, JavaScript (siehe  http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
  • Praktische Erfahrung mit Scrum als Entwickler, Scrum Master oder PO
  • Sehr gute Deutsch- und gute Englischkenntnisse
Die Deutsche Messe stellt im B2B-Umfeld Kontakt zwischen Herstellern und Interessenten her. Dazu dienen die großen Präsenzmessen CeBIT, HANNOVER MESSE und viele andere. Die Deutsche Messe Interactive, eine Tochter der Deutschen Messe setzt das Business der Messe im Netz fort. Die DMI führt im Auftrag der Deutsche Messe AG Aussteller und Geschäftskunden über seriöse, Internet-basierte Mehrwertdienste zusammen und hilft den Ausstellern, ihre Produkte ganzjährig zu vermarkten sowie den Interessenten, den Kontakt zu vorqualifizierten Herstellern zu finden.

Arbeitsort: Hannover
Beginn: je früher desto besser
Profile an: heiner.wolf@messe-interactive.de

Stellenausschreibung Java Softwareentwickler(in)

Ihre Aufgaben:
  • Selbständige Projektarbeit in einem Scrum- Team
  • Objektorientierte Analyse und Entwurf
  • Entwicklung von webbasierten Anwendungen und Webservices
  • Aktive Teilnahme an modernen agilen Entwicklungsprozessen
Ihre Qualifikationen:
  • Erfahrungen im Bereich objektorientierter Entwicklungsmethoden
  • sehr gute Programmierkenntnisse in Java/J2EE , Spring, Hibernate, JPA
  • sicherer Umgang mit CSS, JavaScript, XML, DOM/DHTML, Webservices
  • Erfahrungen in der Datenbankentwicklung (MySQL)
  • Know-How bei Tools wie Subversion, Maven, Eclipse, …
  • Kenntnisse agiler Entwicklungsmethoden wie Scrum und Unit-Testing
  • Idealerweise Erfahrung mit moderner Programmiermethodik wie TDD, SOLID, DRY, KISS
  • Abgeschlossenes Hochschulstudium der Informatik, Naturwissenschaften, Ingenieurwissenschaften oder vergleichbare Qualifikation
  • Mindestens einjährige Berufserfahrung
  • Sehr gute Deutsch- und gute Englischkenntnisse
Vorteilhaft:
  • Praktische Erfahrung mit Scrum
Die Deutsche Messe stellt im B2B-Umfeld Kontakt zwischen Herstellern und Interessenten her. Dazu dienen die großen Präsenzmessen CeBIT, HANNOVER MESSE und viele andere. Die Deutsche Messe Interactive, eine Tochter der Deutschen Messe setzt das Business der Messe im Netz fort. Die DMI führt im Auftrag der Deutsche Messe AG Aussteller und Geschäftskunden über seriöse, Internet-basierte Mehrwertdienste zusammen und hilft den Ausstellern, ihre Produkte ganzjährig zu vermarkten sowie den Interessenten, den Kontakt zu vorqualifizierten Herstellern zu finden.


Arbeitsort: Hannover
Beginn: je früher desto besser
Profile an: heiner.wolf@messe-interactive.de

30. Januar 2012

Wieder CTO

Ab 1. Februar bin ich CTO bei Deutsche Messe Interactive (DMI).

DMI ist einer Tochter der Deutschen Messe Hannover wo CeBIT, HANNOVER MESSE und viele andere führende Branchenmessen stattfinden.

Ich bin dann Leiter der IT-Abteilung. Die IT-Abteilung macht die IT für eCommerce Geschäftsmodelle mit zig-tausend Partnern der Messe, Media-Service für die großen Messen und B2B Lead-Generation, Shops, Content Management, CRM, Marketing Automation, Entwicklung, System Integration, usw. Tolle Sache das.

_happy_deja_vu()