Alle Jahre wieder – Datumsprobleme beim Programmieren

Es hätte so schön sein können. Da kommt man im neuen Jahr in das noch spärlich besetzte Büro und will in Frieden arbeiten. Und dann das: Ein Test crasht, weil das Osterdatum nicht richtig berechnet werden kann. Super…

Hier das Snippet nach der Korrektur:


int g = year % 19; // Golden number -1
int c = year / 100; // Century -1
int h = (c - c / 4 - (8 * c + 13) / 25 + 19 * g + 15) % 30;
int i = h - (h / 28) * (1 - (29 / (h + 1)) * ((21 - g) / 11)); // Anzahl Tage von 21.3. bis Vollmond vor Ostern
int j = (year + year / 4 + i + 2 - c + c / 4) % 7; // Wochentag des Vollmondes vor Ostern
int l = i - j; // Anzahl Tage vom 21. bis Sonntag vor/an Ostern

int month = 3 + (l + 40) / 44;
int day = l + 28 - 31 * ( month / 4 ) ;

return new DateTime(year, month, day, 0, 0, 0, 0, GregorianChronology.getInstance());

Die Formel stammt hierher:

http://www.tondering.dk/claus/cal/node3.html#SECTION003130000000000000000

Aber bloss keine Klammer verändern!

Stromanbieter wechseln – die Qual der Wahl

Wer hat noch nicht darüber nachgedacht: Es muss doch einen billigeren oder grüneren Stromanbieter geben, als meinen Standardversorger. Aber dann wirklich wechseln ist dann doch noch ein Schritt mehr. Es hat insgesamt einen ganzen Nachmittag gedauert, bis ich alle Informationen zusammen hatte, um eine Entscheidung zu treffen.

1. Schritt: Verbrauchsermittlung

Zuerst einmal sollte klar sein, wieviel Strom man abnehmen will. Am einfachsten ist es, wenn man die Daten der letzten Jahre heranziehen kann. Hat man diese Daten nicht, gibt es ein paar gut versteckte Tools, mit denen man seinen Verbrauch schätzen kann:

http://www.energieagentur.nrw.de/haushalt/energiecheck/

http://www.sw-magdeburg.de/swm_2123.php

http://www.energieverbraucher.de/index.php?itid=646&st_id=646&content_news_detail=3449&back_cont_id=646

2. Vergleichen

Nachdem man nun weiß, wieviel Strom man in etwa verbraucht, kann man sich nun auf die unzähligen Vergleichsseiten bewegen. Grundsätzlich ist die Objektivität der Seiten in Frage stellen. Wer weiß, welcher Energiekonzern wo mitmacht. Daher lieber nicht einer Seite vertrauen, sondern immer schön Vergleichsseiten vergleichen.

Stromtarife unterscheiden sich meist nach folgenden Kriterien:

– Zahlungsweise: Vorauszahlung jährlich, quartalsweise oder monatlich; Vorauszahlung oder Kaution

Der Bund der Energieverbraucher rät, keinesfalls Jahresvorauszahlungen zu leisten. Firmen, die besonders billige Tarife mit Jahresvorauszahlungen anbieten, bergen auch ein höheres Risiko: Schnell ist eine kleinere Energiefirma auf dem Markt der Großen pleite.

– Erzeugung: Atom, Öko, Fossil

Die Preise von Ökostrom sind in der letzten Zeit ziemlich günstig geworden. Mancherorts sind reine Ökotarife billiger als der Standardtarif des regionalen Versorgers.

– Nachtanteil

Offenbar für Privatkunden nicht weiter interessant. Man kann da wohl einen zweiten Zähler installieren und dann nachts (wann nachts ist, bestimmt der Erzeuger) weniger bezahlen.

– Grundgebühr vs. Kwh-Preis

Hier lohnt sich Rechnen. Einige Anbieter haben sehr billige kWh-Preise, aber hohe Grundgebühren. Je nach Verbrauch kann sich das lohnen. Meine Empfehlung: Ein selbstgebasteltes Spreadsheet bietet eine gute Hilfestellung.

– Preisgarantie

– Vertragslaufzeit und Kündigungszeitraum

Dieser letzte Punkte ist definitiv einen Blick wert. Der Kündigungszeitraum unterscheidet sich sehr stark und ist meist nur im Kleingedruckten zu finden. Will man als WG nur einmal im Jahr kündigen können?

Seiten, auf denen man die Anbieter vergleichen kann:

http://www.billiger-strom.de/

http://www.wechseln.de/stromvergleich.html

http://www.verivox.de/P/energienetz/Stromrechner.asp?ID=1

Für eine WG bietet sich ein recht flexibles Angebot an. Schnell aussteigen zu können, ist wichtig. Man weiß ja nie, wann der Kunde (= der, der die Rechnung zahlt) den Haushalt verläßt. Wenn man in festen häuslichen Verhältnissen lebt, sind kWh-Pakete am günstigsten.

Thinkpad Support rules!

Nach all der Kritik am Kundensupport, die einem schon fast gewohnheitsmäßig über die Lippen sprudelt, jetzt mal eine gute Bewertung: Der Support für mein Thinkpad T61p ist wahnsinnig gut. Mein Laufwerk war kaputt. Am Montag über die Firma weggeschickt. HEUTE (=zwei Werktage) das brandneue Ersatzlaufwerk auf dem Schreibtisch. Ich bin sprachlos. Ein Grund mehr, sich für einen Thinkpad zu entscheiden.

Klassik meets Breakcore – “My Downfall” von Venetian Snares

Passend zum Herbst hat der Breakcore-Übergott Venetian Snares ein neues Album unter dem Titel “My Downfall” veröffentlicht. Die 13 Tracks dieses Albums setzen neue Maßstäbe: Barocke Streicher fließen in 200bpm-Takttiraden, die einen nur so schütteln. Kopfhörer auf und hinein in eine neue Welt!

Discogs-Page

Hörbeispiele

23.12.08 – Alles Real Records meets guerilla-web

Am 23.12.07 geht’s mächtig rund im Kölner Stadtgarten: Alles Real Records trifft auf guerilla-web.

Live:

  • Curse mit DJ Kitsune & Kool DJ GQ
  • Reno
  • Germany
  • Stress & Trauma

Party:

  • Area One (Stadtgarten)
    • DJ Kitsune (ARR)
    • Kool DJ GQ (ARR)
    • DJ Marious (AFDC)
  • Area Two (Studio 672)

Flyer ARR meets guerilla-web

Grub bootable auf USB-Stick

Ich habe mir vor ein paar Tagen meinen Grub-Bootmanager zerschossen. Das geschah durch ein Update von “Rescue & Recovery”, einem Lenovo-Hilfstool. Offenbar bringt R&R einen eigenen Bootloader mit oder was auch immer. Auf jeden Fall zerschießt ein Update mal eben das System und nach dem Boot kommt nicht mehr der GRUB-Auswahlschirm, sondern eine Konsolenzeile in schwarz mit dem kurzen prägnanten Wort ‘GRUB’. Mehr kann passiert nicht. Keine Möglichkeit, irgendetwas einzugeben, noch irgendetwas anderes. Aber was soll man machen? Man will ja an sein System. Die übliche Googelei brachte mich zu der Erkenntnis, dass ich nicht der einzige mit durch R&R-Update zerschossenem System bin. Aber die anderen hatten einfach Linux neu installiert. Möglicherweise geht das auch, aber da auf meinem Rechner einige sehr wertvolle Daten lagen und ich zusätzlich kein CD-Rom-Laufwerk zur Hand hatte, mußte eine andere Lösung her: Das bestehende Linux auf der Platte mit einem Bootmanager auf dem USB-Stick booten und den Grub neu installieren.

Übersicht:

  1. USB-Stick mit Grub bespielen
  2. von USB booten
  3. die richtigen Partitionen auf der HD finden
  4. Grub neu installieren

Alle Beispiele beziehen sich auf meine Konfiguration: Lenovo ThinkPad T61p, Ubuntu 7.10 auf dritter Partition.

1. USB-Stick mit Grub versehen

Die Erstellung erfolgt unter Linux (z.B. von CD gestartet) folgendermaßen:

  1. USB-Stick löschen: cat /dev/zero > /dev/sda

    (Achtung! Natürlich kann man sich hier einiges kaputt machen. Es muss absolut sicher sein, dass man dass richtige Device /dev/xxx eingetragen hat. Der Vorgang kann einige Minuten in Anspruch nehmen.)

  2. Dann mit fdisk eine neue Partitionstabelle erstellen:

    fdisk /dev/sda -> o (create a new empty DOS partition table) -> n (add a new partition) -> FS-Type 83 (ext2) -> w (write to table and exit).

    Genauer:

    Command (m for help): n
    Command action
    e extended
    p primary partition (1-4)
    p
    Partition number (1-4): 1
    First cylinder (1-1009, default 1):
    Command (m for help): a
    Partition number (1-4): 1
    Command (m for help): w

  3. Rechner neu starten, damit das Linux den Stick mit der neuen Partition erkennt

  4. Dateisystem in die neue Partition schreiben: mkfs.ext2 /dev/sda1

  5. mounten:

    mkdir /media/stick
    mount /dev/sda /media/stick

  6. grub kopieren:
    linux:/media # mkdir -p /media/stick/boot/grub
    linux:/media # cp /boot/grub/*stage* /media/stick/boot/grub
    linux:/media # echo '(hd0)  /dev/sda' > /media/stick/boot/grub/device.map
    linux:/media # grub-install --root-directory=/media/stick /dev/sda
    linux:/media # umount /media/stick/
  7. mapping schreiben:

    linux:/media # echo '(hd0) /dev/sda' > /media/stick/boot/grub/device.map

    Das braucht der Grub um zu denken, der USB-Stick sei hd0,0. Warum auch immer.

So weit, so gut. All das ist nachzulesen unter [1].

2. Von USB booten

  • das BIOS auf usbboot stellen – hoffentlich vorhanden?!
  • den Rechner von USB booten. Es sollte die Grub-Console erscheinen

3. Richtige Partition finden

in der grub console folgendes eingeben:

  1. root (hd1,2)

    (hd0,0) ist der verdammte usbstick, bei mir war also auf Platte 2 in der dritten Partition das installierte Linux. Es sollte erkannt werden, dass es sich um eine ext2-Partition handelt

  2. kernel /vmlinuz root=/dev/sda3

    Die Information, was man als root= einträgt, kann man der Datei fstab entnehmen: cat /etc/fstab, bei SATA ist das /dev/sdaX

  3. initrd /initrd.img

  4. boot

  5. und die Kiste sollte starten!!! Jippie!

4. Grub neu installieren

Die Installation ist unter [2] beschrieben.

[1] Booten mit GRUB vom USB-Stick
[2] Grub neu installieren

Informative Links, die geholfen haben:

GNU GRUB – FAQ
Grub-Boot-Diskette – Gentoo Linux Wiki
grub boot root – Google-Suche
GRUB – LinuxWiki.org – Linux Wiki und Freie Software
LUG Krefeld: LinuxOhneBildschirm
Booten mit GRUB
grub broken – Google-Suche
“Kernel panic” beim booten Ubuntu->GRUB – Unixboard.de

Windows-Kontextmenü für alle Dateien erweitern

Habe soeben verzweifelt versucht über die Dateitypen-Verwaltung (Ordneroptionen -> Dateitypen) von Windows (XP) eine Aktion für alle Dateien hinzuzufügen. Mittels einer neuen Erweiterung “*” o.ä. hat es irgendwie nicht funktioniert. In der Registry ist jedoch ein Eintrag HKEY_LOCAL_MACHINE\SOFTWARE\Classes\*\ vorhanden. Dieser steht offensichtlich für alle Dateien. Dort habe ich die Aktion eingebaut:

Beispiel für GnuPG-Encrypt-Eintrag:

  1. Falls nicht vorhanden unter HKEY_LOCAL_MACHINE\SOFTWARE\Classes\*\ den Schlüssel “shell” anlegen und darin den Schlüssel “gpg“. Der Name des zweiten Schlüssels kann beliebig gewählt werden.
  2. Text des Eintrags im Kontextmenü setzen: Dazu den Wert der ersten Zeichenfolge (“(Standard)”) in HKEY_LOCAL_MACHINE\SOFTWARE\Classes\*\shell\gpg\ auf “Encrypt with GnuPG” ändern.
  3. Unter HKEY_LOCAL_MACHINE\SOFTWARE\Classes\*\shell\gpg\ den Schlüssel “command” erstellen
  4. Den Wert der Zeichenfolge “(Standard)” unter HKEY_LOCAL_MACHINE\SOFTWARE\Classes\*\shell\gpg\command\ auf “c:\programme\gnupg\gpg.exe -e “%1”” ändern.

Das Ergebnis sollte ungefähr so aussehen (Registry-Export):

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\*\shell]

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\*\shell\gpg]
@="Encrypt with GnuPG"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\*\shell\gpg\command]
@="c:\\programme\\gnupg\\gpg.exe -e \"%1\""

Schöner coden – einige Grundregeln

Im Rahmen meiner Arbeit bin ich immer wieder mit Code konfrontiert, der zwar super funktioniert, aber schöner und einfacher gestaltet werden könnte. Ich will an dieser Stelle mal einige Dinge sammeln, die hier weiterhelfen können.

Vergleiche von Strings mit Konstanten

schlecht:

if (!string.equals(KONSTANTE){..

Problem: Nullpointer-Exception bei Null-String

medium:

if (string != null && !string.equals(KONSTANTE){ ...

schöner:

if (!KONSTANTE.equals(string){ ...

In dieser Schreibweise wird die Nullprüfung unnötig. "".equals(null) gibt false zurück und verursacht keine Nullpointer-Exception.

Vergleiche mit Leerstring

schlecht:

eingabe.equals("")

Problem: siehe oben

medium:

"".equals(eingabe)

Problem: Es wird nicht beachtet, dass eingabe auch ” ” sein kann.

medium/schlecht:

"".equals(eingabe.trim())

Problem: Hier rennt man wieder in eine Nullpointer, wenn eingabe null ist.

schön:

StringUtils.isEmpty(eingabe)

StringUtils ist eine Klasse aus den apache.commons und deckt alle Anforderungen in diesem Zusammenhang ab:

isEmpty (null) == true

isEmpty("") == true

isEmpty(" ") == true

isEmpty ("something") == false

Analog ist mit Booleans zu verfahren. Hier gibt einem BooleanUtils entsprechende Hilfestellung. Aber Achtung: BooleanUtils.isFalse(null) == false und BooleanUtils.isTrue(null) == false!