Was kostet dein PC im Jahr (Strom)?

22. Januar 2008

7 Kommentare

Einfach mal nachrechnen! ;)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// Wieviel Watt braucht der PC?
$watt = 478;
 
// Wieviele Stundne läuft er am Tag?
$stunden = 8;
 
// Aktueller Strompreis pro KWh? (Beispiel: 22ct = 0.22)
$kwh_cost = 0.22;
 
$day = $watt * $stunden;
$year = $day * 365;
$kwh = $year / 1000;
 
$all_cost = $kwh * $kwh_cost;
 
echo "Kosten: {$all_cost} €\n";

Quelle der Berechnung und weitere Informationen

Ich komme auf etwa 307 €. :shock:

¬ geschrieben von Michael in Ausm Leben, PHP

Yanix im Detail: Events, Handler und SmartIRC

13. Januar 2008

4 Kommentare

Bisher gab es für Plugins so gut wie keine Möglichkeit, mit dem Bot-Kern zu arbeiten. Durch die Entwicklung der allgemeinen Events-Klasse wird sich einiges ändern. Doch erstmal ein bisschen Geschichte:

Wegen einem Fehler (oder Feature?) in SmartIRC war es bisher nicht möglich, mehr als einen Handler für eine Aktion zu registrieren, z.B. konnte nur ein Plugin auf einen Join reagieren. Deswegen wurden die YanixHandlers geschrieben, welche dies überwunden, indem sie diese Aktionen belegten und an beliebig viele Plugins weitergeben konnten. Durch einen Patch (von vielen), welche ich an SmartIRC angewandt habe, sind diese nicht mehr möglich.

Diese Klasse wurde im Laufe der Entwicklung auch für den Heartbeat verwand, welcher regelmäßige Aktionen ermöglicht. Erst durch diesen wurden Funktionen wie die Absturzsicherung möglich. Anfangs habe ich diesen als Erweiterung der YanixHandlers-Klasse genutzt, was jedoch eine ziemlich Zweckentfremdung und ziemlich unsauber war. Da das Ganze auch alles andere als flexibel war, musste eine komplett neue Lösung her. Die Events.

Die Events funktionieren wie die meisten Plugin-Systeme. Es können Callbacks registriert werden welche dann im späteren Verlauf aufgerufen werden. Prominentes Beispiel für diese Methode ist Wordpress (welches dies aber nicht objektorientiert macht). Die Klasse ist simpel und allgemein und kann daher auch für andere Projekte genutzt werden aber doch sehr praktisch.

SmartIRC ist eine sehr praktische Klasse um mit PHP eine Verbindugn zu IRC-Servern herstellen zu können. Leider ist die Klasse veraltet und schon lange nicht mehr weiterentwickelt worden. Das letzte Release ist vom 27.05.2005, der letzte Commit im CVS knapp 4 Monate her, manche Bugsmeldungen sind schon über ein Jahr offen. Ich bin schon öfters am Überlegen ob ich einen Fork der Klasse mache, vor allem wegen diesen Gründen:

Aufgrund des Umfangs der Klasse würde das Umschreiben auf eine komplett statische Klasse (was ich am sinnvollsten und praktischsten) einige Zeit kosten und ein Umschreiben von großen Teilen von Yanix bedeuten (was eh schon beim Umstieg von iBot der Fall war). Jedoch würde es viele Vorteile haben.

Vor wenigen Tagen habe ich mal die CVS-Version von SmartIRC getestet. Sie ist 4 Monate alt, also recht “neu”. Ergebnis: Ständige Abstürze durch den Aufruf von nicht-existenten Funktionen. Schade.

Ich warte erst mal auf PHP 5.3, die Namespaces könnten sehr interessant werden.

¬ geschrieben von Michael in Yanix

Helferfunktion: GetDir

13. Januar 2008

2 Kommentare

Dieses Szenario haben PHP-Entwickler sicher das eine oder andere Mal: Ein Verzeichnis auslesen. Unter PHP gibt es dafür eine Reihe von Funktionen, welche aber meist einiges an Arbeit machen. Zuerst das Verzeichnis öffnen, dann Eintrag für Eintrag auslesen und dann die virtuellen Verzeichnisse . und .. ausfiltern. Mit einer Funktion lässt sich das viel einfacher lösen. Hier ist meine GetDir():

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/**
 * Reads a dir and returns it as array
 * @author Michael Mayr (http://michfrm.net)
 * @param string $path Path to read (absolute preferred)
 * @param bool $absolute Return absolute or relative paths? (Default: false)
 * @return mixed
 */
function GetDir($path, $absolute = false)
{
    if ( substr($path, -1, 1) != '/' ) $path .= '/';
 
    $files = array();
    $dir = opendir($path);
 
    if ( $dir === false ) return false;
 
    while ( ( $file = readdir($dir) ) !== false )
    {
        if ( substr($file, 0, 1) != '.' && $file != '..' )
        {
            $files[] = ($absolute === false) ? $file : $path . $file;;
        }
    }
    return $files;
}

Die Funktion stammt aus der functions.php von Yanix und ist daher GPL v2

Im Detail: Der Paramter ist der Pfad $path, welcher ausgelesen werden soll. Wenn der 2. Parameter $absolute auf true steht, gibt die Funktion absolute Pfade zurück, ansonsten relative. Es werden keine Unterverzeichnisse untersucht!

Hier ein praktisches Beispiel:

1
2
3
4
5
6
7
8
9
10
$dir = dirname(__FILE__);
 
// Check, ob das Verzeichnis existiert
if ( is_dir($dir) )
{
    foreach ( GetDir($dir) as $file )
    {
        echo "Datei {$file} gefunden!";
    }
}

Im Beispiel von foreach sollte immer ein Check erfolgen, denn falls die Funktion false zurück gibt, falls das Öffnen der Verzeichnisses fehl schlägt (z.B. wenn es nicht existiert), wirft foreach einen Fehler.

¬ geschrieben von Michael in Helferfunktionen, PHP

Helferfunktion: SimpleBacktrace

10. Januar 2008

0 Kommentare

Nun beginne ich meine schon lang geplante Reihe: Helferfunktionen. Ich meine damit Funktionen, die nicht groß sind aber sehr bei der Entwicklung und im allgemeinen Betrieb helfen können. Angefangen mit SimpleBacktrace.

Jeder der einmal mit Exceptions gearbeitet hat kennt die Backtraces. Damit kann man bequem den Stacktrace (welche Funktion hat welche aufgerufen) nutzen und ihn auch ausgeben. Es gibt jedoch keine Funktion, damit PHP dies auch ohne Exceptions ausgeben kann. Mit debug_backtrace() erhält man zwar einen Backtrace, jedoch nur ein riesen Array. Diese Funktion formatiert diesen ähnlich wie bei Exceptions.

Der Parameter $jumpover ist dazu da, um eine bestimmte Anzahl von Einträgen zu überspringen. Standard ist 1, damit die Funktion selbst nicht im Trace auftaucht. Bei Funktionen die das PHPsche Error-Reporting ersetzen, sollte man diesen Wert auf mind. 2 setzen.

Diese Funktione funktioniert vielleicht mit PHP4, gestetet hab ich es nicht.
Code anzeigen

Als ich diesen Beitrag fast fertig hatte, kam mir eine noch bessere Idee. Nutz Exceptions!Nachteile: Überspringen von Zeilen und eigene Anpassungen sind nicht möglich.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
 * Rückgabe eines formatierten Stacktraces von jedem Ort aus.
 * @author Michael Mayr (http://michfrm.net)
 * @return	string
 */
function SimpleBacktrace()
{
	try
	{
		throw new Exception('SimpleBacktrace');
	}
	catch ( Exception $e )
	{
		return $e->getTraceAsString();
	}
}

Code extern anzeigen

¬ geschrieben von Michael in Helferfunktionen, PHP

Ein Experiment

10. Januar 2008

2 Kommentare

Gestern fragte ich mich beim Einschlafen: Was ist, wenn ich eine Objektmethode aufrufe, welches eine andere Methode aufruft, welche das Objekt zerstört? Stürzt PHP ab oder läuft es einfach weiter. Was soll es dannn tun? Das Ergebnis hat mich überrascht:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
class Helper
{
 
	public $blubb = true;
 
	public function Bye()
	{
		global $c;
		echo "Helper::Bye(): Calling Control::Kill()\n";
		$c->Kill();
		$c->End(__CLASS__);
		var_dump($this);
	}
 
}
 
class Control
{
 
	public $obj = null;
 
	public function __construct()
	{
		echo "Control::__construct(): Making object of Helper...\n";
		$this->obj = new Helper;
	}
 
	public function Kill()
	{
		echo "Control::Kill(): Good bye Helper\n";
		unset($this->obj);
		$this->obj = null;
	}
 
	public function End($caller)
	{
		echo "Control::End(): Called by {$caller}\n";
		if ( is_object($this->obj) && get_class($this->obj) == 'Helper' )
		{
			echo "Object exists\n";
		}
		else
		{
			echo "Object not exists\n";
		}
	}
 
}
 
$c = new Control;
$c->obj->Bye();
$c->End('main');

Kurz erklärt: Zuerst erstelle ich eine neue Instanz von Control, welche in seine Eigenschaft $obj eine Instanz von Helper erstellt. Dann rufe ich die Instanz von Helper auf, welche Control den Befehl gibt den Helfer zu zerstören.

Nun die Ausgabe, man beachte den fetten Teil:

michael@michfrm-home:~/Desktop$ php badstack.php
Control::__construct(): Making object of Helper…
Helper::Bye(): Calling Control::Kill()
Control::Kill(): Good bye Helper
Control::End(): Called by Helper
Object not exists
object(Helper)#2 (1) {
["blubb"]=>
bool(true)
}

Control::End(): Called by main
Object not exists

Obwohl das Objekt nicht mehr existiert, kann es sich selber auslesen. :shock:

Ich kenne mich mit der PHP-Interna nicht so aus aber denke Folgendes: PHP löscht nicht direkt das Objekt sondern erst die Referenz und zerstört dann das Objekt, wenn es wirklich nicht mehr gebraucht werden kann. Wieder was gelernt. :mrgreen:

¬ geschrieben von Michael in PHP

Lange Kabel

10. Januar 2008

1 Kommentar

SPL-C ERROR - Incomplete Session by time out

    POSITION : 0x1e948 (125256)

    SYSTEM   : src/os_hook

    LINE     : 1545

    VERSION  : SPL-C 5.24 06-28-2006

Das spuckte gerade mein Samsung CLP-300 aus, als ich eines der genialen Cheat Sheets ausdrucken wollte. Komisch, auf dem Bildschirm CSS-Hilfe und auf dem Papier Fehlermeldungen.

Dank Google kam schnell eine Lösung: Das Druckerkabel ist zu lang. :shock:

Von Samsung sei 1,5 Meter empfohlen, ich hatte 3 Meter. Kurzerhand musste mein
Tintenstrahler sein Kabel abgeben, schon druckt es sich mit den Farblaser wesentlich flotter und ohne Fehler.

¬ geschrieben von Michael in Allgemein

Ende.

7. Januar 2008

Comments Off

Es ist 14:30 Uhr. Meine Schwester und ich warten geduldig, ab und an blödel ich noch ein bisschen mit Chris herum. Wir warteten auf jemand, der uns abholen will. Es dauert nicht lang, da kamen sie angefahren. Meine Großmutter, mein Vater und seine Freundin holten uns ab. Man könnte meinen, das Ziel sei ein netter Familiesausflig gewesen, immerhin waren alle fröhlich und meine Schwester und ich hörten auf der Hinfahrt noch viel Musik. Es wird jedoch alles andere als fröhlich. Das Ziel ist das Krankenhaus in Kempten. Eine halbe Stunde dauert etwa die Fahrt. Dort angekommen und nach langer ausdauernder Wartezeit, welche durch das teils planlose Personal nötig war, standen wir im Keller. Aber nicht irgend einem Keller…
Den ganzen Beitrag lesen.

¬ geschrieben von Michael in Ausm Leben

Theme von BenediktRB • Powered by Wordpress • Abonniere den RSS Feed