Archiv nach Kategorien: Programmieren

Snippet: Alle Eigenschaften aller Elemente in einer List<T> ausgeben

Zu Debugzwecken interessieren mich hin und wieder die Elemente und deren Eigenschaften in einer generischen Liste. Dazu habe ich mir eine kleine Extension Methode geschrieben, die genau diesen Zweck erfüllt:

public static void Dump<T>(this List<T> lst)
{
    foreach (var lstitem in lst)
    {
        Console.WriteLine("-------------------------------------");
        foreach (var property in lstitem.GetType().GetProperties())
        {
            Console.WriteLine("{0}: {1}", property.Name, property.GetValue(lstitem, null));
        }
        Console.WriteLine("-------------------------------------\r\n");
    }
}

Verwendet wird die Methode dann folgendermaßen:

// Angenommen die Liste hätte Elemente der Klasse MyClass
var lst = new List<MyClass>();
lst.Dump();

Vielleicht findet ja noch jemand anderes Verwendung dafür.

IMAP2RSS

Vor einiger Zeit habe ich mir ein kleines PHP-Script geschrieben, welches ungelesene Mails meines IMAP-Accounts als RSS-Feed ausgibt. Ich wollte damit auf einen Blick sehen können, ob es sich lohnt mich über Webmail einzuloggen. Vielleicht kann ja jemand etwas damit anfangen:

<?php
 
/**********************************************************
 
	Name: 		IMAP2RSS
	Author:  		Michael Voggenreiter
	Mail:   		michi[at]michis-blog.net
	Blog:			http://www.michis-blog.net
 
	Version: 		1.0
	Last Change:	07.05.2010 17:00
 
**********************************************************/
 
$imapserver = "imap.example.com";
$username = "user@example.com";
$password = "secret";
$directory = "INBOX";
 
$mbox = imap_open("{".$imapserver.":143/imap}".$directory, $username, $password) or die(imap_last_error());
 
$mails = imap_search($mbox, "UNSEEN");
 
print("<?xml version=\"1.0\" encoding=\"UTF-8\"?>
    <rss version=\"2.0\">
        <channel>
            <title>IMAP2RSS</title>
            <description>Get your unread mails as RSS Feed</description>
            <language>de</language>
            <link>http://xml-rss.de</link>
            <lastBuildDate></lastBuildDate>");
 
foreach($mails as $mail)
{
  $currentmail = imap_header($mbox, $mail);
 
            print("<item>
                <title>".imap_utf8($currentmail->subject)."</title>
                <description />
                <author>".htmlspecialchars($currentmail->fromaddress)."</author>
                <pubDate>".imap_utf8($currentmail->date)."</pubDate>
            </item>");
}
 
print("        </channel>
    </rss>");
 
imap_close($mbox);
 
?>

Zum Schluss noch ein Sicherheitshinweis: Wenn das Script auf einem öffentlich zugänglichen Webserver läuft, kann natürlich jeder, der den Namen der Datei kennt, die ungelesenen Mails sehen. Man sollte das Script also noch entsprechend absichern.
Aus diesem Grund wird auch nur der Betreff der Mails und kein Inhalt ausgegeben.

PHP vs ASP.NET

Heute habe ich mir ein bisschen Zeit genommen um auszuprobieren, ob ich die Geschichte mit dem Relaunch der Vereinsseite nicht lieber doch in PHP realisiere. Von “lieber” kann hier keine Rede sein. Allerdings hat der Geiz dann doch gesiegt. ASP.NET-Webspace ist eben doch noch ein Stück teurer als PHP-Webspace, den man ja mittlerweile schon hinterher geschmissen bekommt. Im Großen und Ganzen kann ASP.NET zwar auch nicht Zaubern, ist aber eindeutig schöner zu Programmieren. Zwar mag es zum Beispiel praktisch sein, dass PHP Variablen wild hin und her konvertieren kann, aber schön ist was anderes. Dadurch, dass Variablen nicht erst deklariert werden müssen, bevor sie genutzt werden können, steigt meiner Meinung nach auch die Fehleranfälligkeit. Die Objektorientierung finde ich in PHP 5 auch nicht gut durchgezogen, was mich eigentlich am meisten stört. Alles in allem Geschmackssache und über Geschmack lässt sich ja bekanntlich streiten.

Variablen aus einem Script Task verändern

Manchmal ist es hilfreich in einem Script Task eine (globale) Variable zu verändern. Die sicherste und sauberste Methode dafür ist wohl, die Variablen auch gleich im Script zu locken. Im Skripttask-Editor können Variablen auch über die Eigenschaft “ReadWriteVariables” automatisch gelockt werden. Mehrere können dabei durch Kommata getrennt werden. Hier kann kan aber doch schnell mal vergessen eine benötigte Variable einzutragen, was dann später zu Fehlern führt. Wer meint auf Nummer sicher gehen zu können, in dem er die Variable sowohl automatisch durch die Eigenschaft locken lässt und anschließend nochmal im Script selbst die Variable locken möchte liegt falsch. Hierbei entsteht natürlich ein Deadlock, da versucht wird, die schon automatisch gelockte Variable nochmals zu locken. Hier ein einfaches Beispiel zum Ändern einer Variable.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Imports System
Imports System.Data
Imports System.Math
Imports Microsoft.SqlServer.Dts.Runtime
 
Public Class ScriptMain
    Public Sub Main()
 
        Dim vars As Variables
 
        ' Zu verwendende Variable locken
        Dts.VariableDispenser.LockOneForWrite("Benutzer::MyVar", vars)
 
        ' Wert der Variable ändern
        vars("Benutzer::MyVar").Value = False
 
        ' Variable unlocken
        vars.Unlock()
 
        Dts.TaskResult = Dts.Results.Success
 
    End Sub
End Class

Durch die Verwendung einer boolschen Variable ist dieses Beispiel natürlich ziemlich vereinfacht. Verwendet man andere Datentypen muss man die eventuell noch ein bisschen konvertieren.

Now playing

Gestern bin ich endlich mal dazu gekommen mein 16×2 Zeichen LCD-Display zu verlöten und an den Rechner anzuschließen. Es hängt am Parallelport und wird über LCD4linux angesteuert. Nach einigem Rumgebastel und anfänglichen Startschwierigkeiten gibt es jetzt den Titel des momentan in Amarok gespielten Stücks, dessen Länge und die aktuell gespielte Zeit aus. Dazu habe ich mir zwei Widgets gebaut, die sich die jeweiligen Werte über DCOP holen. Hier die beiden dazu nötigen Widgets:

Widget AmarokTitle {
class  'Text'
expression exec('dcop amarok player nowPlaying', 1000)
width  16
align  'M'
speed 250
update tick
}

Widget AmarokTime {
class  'Text'
expression exec('dcop amarok player currentTime', 250).'/'.exec('dcop amarok player totalTime', 250)
width  16
align  'E'
}

Diese müssen einfach in die /etc/lcd4linux.conf aufgenommen und einem Layout hinzugefügt werden.