Howto: Windows 8 – Ruhezustand aktivieren

28. Oktober 2012


Da die Rechner mit Windows 8 schneller hochfahren als bei den Vorgängerversionen, hat sich Microsoft unverständlicherweise dazu entschlossen, den Ruhezustand aus den Standardoptionen zu entfernen. Stattdessen wird nur noch “Herunterfahren” und “Energie sparen” angeboten. Die erste Option sogt dafür, dass man bei erneutem Einschalten alle seine Programme neu starten muss und die Zweite verbraucht jede Menge Energie und führt bei Verlust der Netzspannung zum gleichen Effekt wie die erste Option.

Dieser lässt sich aber relativ einfach wieder aktivieren:

Man startet zunächst die Eingabeaufforderung als Administrator. Die geht am schnellsten mit einem Rechtsklick auf die Startkachel, welche angezeigt wird wann man die Maus in die linke untere Ecke des Bildschirms bewegt.

Start Kontextmenü der Startkachel

Da aktiviert man mit dem Kommando “powercfg -h on” den Ruhezustand

Eingabeaufforderung mit Kommando

Damit dieser auch im Menü angezeigt wird, muss man jetzt in der Systemsteuerung, bei den Energieoptionen unter dem Punkt “Auswählen was beim Drücken von Netzschaltern geschehen soll” alle Optionen mittels Klick auf “Einige Einstellungen sind momentan nicht verfügbar.” aktivieren.

Energieoptionen Netzschalteroptionen

Anschließend kann man unterhalb bei “Einstellungen für das Herunterfahren” den Haken für den Ruhezustand setzen.

Netzschalteroptionen nach Freischaltung

PHP und das Datetime Problem

21. Juli 2012

Alle modernen PHP-Frameworks setzen bei der Verarbeitung von Datums- und Uhrzeitangaben auf die Klasse Datetime welche PHP von haus aus mitbringt. Die Klasse ist praktisch kapselt sie doch alle Funktionen die man für das Arbeiten mit einem Datum braucht an einer Stelle.

Sie hat aber bei der Nutzung in Frameworks bzw. deren ORM einen entscheidenden Nachteil. Ihr fehlt die magische __toString() Methode, welche dafür sorgt das sich ein Objekt der Klasse in den Datentyp string konvertieren lässt.

Datetime in Doctrine

So ist es in Doctrine2 beispielsweise bisher nicht möglich Spalten eines Datums- oder Uhrzeittyps als Teil des Primärschlüssels zu verwenden. Dieser wird zur internen Identifizierung aus einer Verkettung der jeweiligen String-Entsprechung der beteiligten Spalten gebildet. Das funktioniert wunderbar einfach, solange alle Objekte eine __toString() Methode besitzen. Tun sie das nicht erhält man eine Exception.

Eine Lösung wäre jetzt die explizite Prüfung, ob es sich bei einer der beteiligen Spalten um einen Datetime Datentyp handelt und eine entsprechende Sonderbehandlung dieses Typs. Diesen Weg ist man gegangen, der dazugehörige Code hat es aber aus Performancegründen nie in einen produktiven Zweit des Repository geschafft.

Eine andere Lösung ist das Überschreiben der von Doctrine verwendeten Datetime Klasse für die entsprechenden SQL-Typen zu einer Datetime Klasse die eine generische __toString() Methode zur Verfügung stellt.

Klingt einfach, bringt aber ein Problem mit sich. Wenn man von der Klasse Datetime ableitet kann man zwar relativ leicht die __toString() Methode ergänzen. Man muss aber immer noch Objekte der Klasse Erzeugen können. Da Datetime schon vor PHP 5.3 existierte unterstützt die Klasse keinerlei LSB Funktionalität. D.h. die statische Methode MyDatetime::createFromFormat() wird immer ein Objekt vom Typ Datetime liefern, welches man beim Aufruf der Methode im Kontext der Klasse MyDatetime gleich wieder verwerfen kann, um daraus ein neues Objekt vom richtigen Typ zu erzeugen.

Datetime in Propel

Von dem gleichen Problem mit der fehlenden __toString() Methode ist auch Propel betroffen. Denn auch da werden zur Identifizierung einfach die jeweiligen String-Entsprechungen verkettet. Das Problem lässt sich aber bei Propel leichter umgehen indem man die Nutzung der Datetime Klasse für Datums- und Uhrzeitangaben gleich komplett verbietet.

bekanntes Problem

Das Problem mit der fehlenden __toString() Methode bzw. fehlender LSB Funktionalität ist aber nicht neu. Entsprechende Tickets finden sich schon seit geraumer Zeit im Bug-Trackerr des PHP-Projekts. Es passiert aber rein gar nichts, da jeder Entwickler immer wieder Workarounds für diese fehlende Funktionalität einbaut.

  • Ticket von Benjamin Eberlei, seines Zeichens einer der Hauptentwickler von Doctrine, wegen fehlendem LSB. (https://bugs.php.net/bug.php?id=60302) Er wollte offensichtlich von Datetime ableiten und stieß dabei auf das beschriebene Problem.
    • außer einer Reaktion vom Autor der Datetime Klasse mit einem: “Nicht so einfach wie ich zuerst dachte.” Ist nichts passiert.
  • Ticket wegen fehlender __toString() Methode und Vorschlag der Definition eines Standardformats welches von der Funktion zurück gegeben werden soll. (https://bugs.php.net/bug.php?id=41187) Das Ticket gibt es bereits seit dem Jahr 2007.
    • keinerlei Reaktion

Selbst ist der Mann

Ich dachte mir “Wozu hab ich all die Jahre C gelernt?” und habe mich dem zweiten Ticket angenommen, da es das Problem an einer Wurzel beseitigt und ersteres ja nur daraus resultiert. Für mich ein voller Erfolg. Ich bin jetzt stolzer Besitzer einer PHP Version deren Datetime Klasse eine funktionierende __toString() Methode hat. Nur der Rest der Community nicht, sofern dieser nicht dazu übergeht seinen PHP-Quellcode selbst zu patchen und zu kompilieren. Der entsprechende Pull-Request auf Github verstaubt nämlich derzeit genau so wie das Ticket im PHP Bug-Tracker selbst.

Author: Categories: Programmierung Tags: , , ,

Geforce GTX470 noch immer mit Treiberproblem

6. November 2011

Seit ich die GTX 470 habe, leide ich trotz aktueller Version 285.62 unter einem Treiberproblem der Karte. Ein Hardwareproblem scheint das nicht zu sein, denn die Karte ist bereits die Dritte und das Problem ist immer noch da. Es sind auch nicht wie Anfangs vermutet Hitzeprobleme, denn es passiert auch direkt nach dem Booten oder wenn die Karte gerade mal 50°C Temperatur hat. Aktuell z.B. bei Might and Magic: Heroes VI denn da langweilt sie sich ohne Ende und trotzdem tritt der Fehler auf das sich der Treiber mitten drin einfach selber zurück setzt und das System gleich völlig hängen hängen bleibt.

Es betrifft aber auch genau so alle anderen Spiele, wenn auch nicht in der Häufigkeit. Siehe Bild mit Crash bei Dead Island .

So sieht das Bild aus wenn sich der Rechner beim Treiberabsturz komplett aufhängt.Interessanterweise lässt sich das Auftreten das Fehlers dadurch verzögern das man kein Multimonitor Setup verwendet, also vor dem Spielstart alle anderen Desktops bis auf den Primären deaktiviert.

Ich hoffe echt das Nvidia das bald hinbekommt, denn es nervt wirklich sehr!

Author: Categories: Bugs Tags: , , , , ,

Test – Raidsonic Icy Box IB-NAS5220

17. August 2011

Installation der Platten

Platten:

  • 2 x Samsung HD501LJ (500GB)

Die Festplatten lassen sich sehr einfach in dem Gehäuse einbauen. Für den Einbau müssen lediglich Front- und Seitenblenden entfernt werden, dann lassen die Platten hineinschieben und man kann sie mit den mitgelieferten Schrauben festziehen.

Einrichtung der Platten

Das sich die Platten einfach ein- und ausbauen lassen ist bei dem Gerät auch bitter nötig. Denn beim Formatieren der Platten bleibt die Box ständig hängen. Das vom Support immer wieder empfohlene Low-Level-Formatierung der Platten kostet dabei unnötig Zeit und schafft keinerlei Abhilfe. Ein einfaches Löschen der Partitionen reicht.

Dies muss man auch ständig tun, denn von der nur halb eingerichteten Platten will die Box nicht starten. Man muss also nach jedem Fehlversuch die Platten wieder in den Rechner einbauen und die Partitionen von Hand löschen und das nur um wieder das träge und langsame Webinterface zu sehen.

Auch der Jumper um die Platte in den 1,5 Gbps Modus zu zwingen brachte keinerlei Besserung.

Den Betrieb an einer Fritz!Box kann ich bei der Form wie die Box versucht die Fortschrittsanzeige zu realisieren auch nicht empfehlen. Da alle 100ms eine “sinnlose” Anfrage gesendet wird, die wenn keine direkte Route definiert ist immer über das Standard-Gateway laufen. Das Ganze kommt einer DDOS-Attacke auf den Router gleich und die Fritz!Box startet irgendwann von selbst neu. Das ganze ist nachvollziehbar bei meiner 7270 v1, sowie bei der 7390.

Die Hardware

Die Icy Box 5220 besitzt so wenig internen Speicher, dass dieser nicht einmal ausreicht um eine 500GB Platte zu formatieren. Für diesen Zweck wird bereits eine extra Swap Partition benötigt. Einstellungen werden nicht in der Box direkt gespeichert sondern auf einer der eingebauten Platten in einer extra Systempartition. Dieses vorgehen macht zudem jegliche Konfiguration am Webinterface vorbei über SSH komplett nutzlos, da die Änderungen beim Neustart verloren gehen und keine Möglichkeit besteht diese Systempartition über die Shell auf die Platte zu bekommen.

Im Gegensatz zum Webinterface lassen sich die Platten über SSH einrichten und auch formatieren. Da die Konfiguration aber nicht gespeichert werden kann, ist das Ganze nutzlos.

Der verbaute Lüfter ist klein und laut. Trotz des hohen Geräuschfaktors ist der Lüfter trotzdem nicht in der Lage die Platten ausreichend zu kühlen. Das ganze Gehäuse wird also extrem heiß.

Fazit

Nach erfolgloser Reklamation, da ja immer noch die Hoffnung bestand, dass es sich um einen Einzelfall handelt, steht das Ding hier vorerst sinnlos rum.

Wer will es haben? Bestens geeignet für Leute die masochistisch veranlagt sind, denn mehr als Ärger hab man mit dem Teil nicht.

Author: Categories: Test Tags: , , ,

Howto: Debian 6 (Squeeze) mit nginx + FastCGI + Zend Framework

20. Februar 2011

Falls noch nicht geschehen installieren wir zuerst mal nginx und php5-cgi PHP-FPM.

aptitude install nginx php5-cgi php5-fpm

Jetzt legen wir uns eine neue Konfigurationsdatei für nginx mit folgendem Inhalt an.

server {
	server_name  example.com;
	access_log  /var/log/nginx/com.example.access.log;
	if (!-e $request_filename) {
    		rewrite ^.*$ /index.php last;
	}
	root   /var/www/vhosts/example.com/public;
	index  index.php index.html;
	location ~ \.php$ {
		include /etc/nginx/fastcgi_params;
                keepalive_timeout 0;
                fastcgi_param  APPLICATION_ENV  'development';
                fastcgi_param   SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                fastcgi_pass    127.0.0.1:9000;
	}
}

Die Rewrite Regel leitet wie beim Zend-Framework üblich alle Dateien die nicht existieren auf die index.php um.

Die Datei wird anschließend als “/etc/nginx/sites-available/example.com” gespeichert und zum aktivieren verlinkt.

ln –s “/etc/nginx/sites-available/example.com “/etc/nginx/sites-enabled/example.com

Nun muss noch nginx neu startet werden.

/etc/init.d/nginx restart

Dateien mit der Endung .php werden also an localhost auf den Port 9000 weiter gereicht. An der Stelle wartet jetzt noch kein PHP auf die Anfrage. Man könnte jetzt also einfach php-cgi starten, das hält aber nur bis nächsten Neustart.

php-cgi -b 127.0.0.1 &

Oder aber man richtet sich ein entsprechendes Init Script ein.

Howto: Debian 5 (Lenny) mit Lighttpd (Lighty) + PHP 5.3 + Zend Framework

23. November 2010

Backports einfügen

PHP Backports von dotdeb.org

deb http://php53.dotdeb.org stable all
deb-src http://php53.dotdeb.org stable all


Lighty Backports von bits and pieces

deb http://www.jonmoniaci.com/debian-ppa/ lenny main contrib non-free

Installation

aptitude install lighttpd php5-cgi
lighttpd-enable-mod fastcgi fastcgi-php

VHost einrichten

Wir legen jetzt eine neue Konfigurationsdatei für unseren VHost an.

touch /etc/lighty/available-mods/10-myvhost.conf


Die Datei bearbeiten wir jetzt mit einen beliebigen Editor

$HTTP["host"] == "myhost.example.com" {
	server.document-root = "/pfad/zur/ZF-Anwendung/public"
	url.rewrite-once = (
		".*\.(js|ico|gif|jpg|png|css)$" => "$0",
		".*\?(.*)$" => "/index.php?$1",
		"" => "/index.php"
	)
	setenv.add-environment = (
		"APPLICATION_ENV" => "development"
	)
}


Nun muss die Konfiguration noch aktiviert werden

lighttpd-enable-mod myvhost

Module hinzufügen

Jetzt müssen der Datei “/etc/lighttpd/lighttpd.conf” noch 2 Module hinzugefügt werden

server.modules = (
	#andere Module
        "mod_rewrite",
        "mod_setenv"
)

Konfiguration neu laden

/etc/init.d/lighttpd force-reload


Nachdem die Konfiguration neu geladen wurde, sollte das Ganze wie gewünscht funktionieren.

Projektidee: Android VVO Fahrplan App

11. Oktober 2010

UnbenanntDes Öfteren steh ich in Dresden in der Stadt und frage mich wie ich denn nun nach wieder nach Hause komme. Die Lösung bisher, war das aufrufen der VVO Homepage bzw. das Nutzen das SMS Infoservice. Warum also nicht eine eigene App für diesen Zweck bauen.

Features

  • komfortable Eingabemöglichkeit
  • Orte speicherbar
  • “Wo bin ich? Wie komm ich nach Hause?” (GPS Ortung der aktuellen Position)

Nice to have

  • “Wie komme ich von hier zu der Haltestelle?” (Navigation)

Update: Aktuell existiert mit Öffi schon eine recht Gute App für die Routenplanung und Abfahrtszeiten in der Nähe.

GTX470 mit Hitzeschaden

30. September 2010

Ich hatte inzwischen schon zwei mal das Vergnügen meine  Nvidia GeForce GTX470 (MSI) einzuschicken, weil sie hitzebedingte Ausfälle zeigte. Dabei sollte die Hitze nicht das Problem sein, denn der Lüfter hat noch reichlich Reserven. Bei einer Temperatur von über 80°C erreicht der Lüfter mit automatischer Steuerung gerade einmal 60% der möglichen Drehzahl. Dadurch ist der Lüfter zwar schön leise, aber was nützt mir das wenn ich dadurch bunte Artefakte auf dem Bild sehe, der Treiber sich ständig zurücksetzt oder das System gleich ganz abstürzt?

Vermutlich ist an dieser Stelle auch der Grund zu suchen warum MSI bei dem GTX465 Karten die Lüftersteuerung viel zu scharf eingestellt, sodass die Karten schon bei 50°C auf dem Desktop alles andere als leise sind.

Ich freue mich also schon auf die nächste Karte, die dann hoffentlich nicht solche Ausfallerscheinungen zeigt, bzw. werde ich da von Anfang an der Lüftersteuerung auf die Sprünge helfen.

Howto: Google Android – Kommunikation via HttpClient und JSON

21. Juni 2010

Da es für Java jede Menge unterschiedliche Implementierungen eines HTTPClient gibt, hier mal ein Beispiel für die die Variante der Apache Foundation die im Google Android SDK zum Einsatz kommt. In diesem Beispiel geht es darum sich auf einem entfernten Server einzuloggen und anschließend Daten via JSON abzufragen und wieder in getypte Java Objekte umzuwandeln. Dabei speichert der Server den Login-Status in einer Session. Die SessionID wird auf der Clientseite in einem Cookie gespeichert, und muss bei jeder Anfrage mitgesendet werden.

Funktionsweise

Verbindung herstellen

HttpGet get = new HttpGet(String.format("%s?username=%s&password=%s", loginUrlHost, user, pass));
DefaultHttpClient client = new DefaultHttpClient();
ResponseHandler<String> responseHandler = new BasicResponseHandler();
HttpResponse response = client.execute(get);

Anwort auswerten

int statusCode = response.getStatusLine().getStatusCode();
if (statusCode == 200) {
String responseText = responseHandler.handleResponse(response);
}

JSON parsen

import org.json.JSONException;
import org.json.JSONObject;

public class LoginResponse extends JSONObject {
    private boolean success;
    private String message;

    public LoginResponse(String string) throws JSONException {
        super(string);
        success = getBoolean("success");
        message = (get("message").equals(null))?"":getString("message");
    }

    public boolean isSuccess() {
        return success;
    }

    public String getMessage() {
        return message;
    }
}
LoginResponse loginResponse;
 try {
 loginResponse = new LoginResponse(responseText);
 } catch (JSONException e) {
 Log.d("LOGIN_ERROR(INVALID_RESPONSE)", e.getMessage(), e);
 errorState = INVALID_RESPONSE;
 return INVALID_RESPONSE;
 }

Cookies auslesen

List<Cookie> cookies = client.getCookieStore().getCookies();
 for (int i = 0; i < cookies.size(); i++) {
 Cookie cookie = cookies.get(i);
 Log.d("Cookie-Name:", cookie.getName());
 Log.d("Cookie-Value:", cookie.getValue());
 break;
 }

Cookies senden

DefaultHttpClient client = new DefaultHttpClient();
CookieStore cookieStore = client.getCookieStore();
cookieStore.addCookie(loginCookie);
client.setCookieStore(cookieStore);

Howto: PDF Formulare mit PHP ausfüllen

24. April 2010

Wie erzeuge ich ein Formular?

PDF Formulare kann man entweder direkt mit PHP erzeugen z.B. mit der Klasse tcpdf oder aber, wenn man Wert darauf legt das dass Ganze ansprechend aussieht, mit OpenOffice. Natürlich funktioniert das ganze auch mit den Produkten von Adobe.

Wie fülle ich das Formular aus?

Adobe stellt mit FDF ein Format zur Verfügung mit den es möglich ist PDF Formulare auszufüllen. Die FDF Datei selbst enthält dabei die Daten die in die Felder eingesetzt werden sollen und den Namen des dazu gehörenden PDF Formats.

Wenn man diese Methode benutzt erhält man schon mal ein ausgefülltes Formular. Das ist aber immer noch kein PDF und abhängig vom ursprünglichen Dokument.

Wie wird daraus wieder ein PDF?

An dieser Stelle kommt das PDF Toolkit ins Spiel. Diesem Tool, das man irgendwo auf den Server ablegt, übergibt man die PDF und FDF Datei und erhält eine neue ausgefüllte PDF Datei.

Author: Categories: Howto, Programmierung Tags: , , , , ,