September 2003 - Posts

Der .NET Framework ist doch immer eine Reise wert. Und manchmal auch eine längere. Derzeit findet in Leipzig ein 14tägiges Training auf dem .NET Framework an der Universität statt, das so genannte Summer Camp. Und ich bin fast die ganze Zeit in der Stadt anwesend und an 6 Tagen der Trainings auch mit von der Partie. Aber nicht nur die Dauer des Trainings ist ungewöhnlich, sondern auch Veranstaltungsort und Anlass.

Der Keim für die Idee eines solchen Trainings wurde auf meinem letzten TechTalk in Leipzig gelegt, als Vertreter des Fachbereichs Informatik und Wirtsschaftsinformatik mich ansprachen, ob über den TechTalk hinaus nicht irgendetwas zum Thema .NET Framework auch an der Uni gemacht werden könnte. Daraus ergab sich ein Kontakt zum Community Manager bei Microsoft Deutschland, der - begeistert von der Idee, "die Frohbotschaft" in an einer Institution der Lehre und Forschung zu verkünden - sich schnell auf die Planung eines Trainingevents speziell für Studenten einließ.

Das Ergebnis war dann ein Konzept für 2 Wochen intensiver .NET Erfahrung. Knapp 40 Studenten der beiden Fachbereiche sollten die Gelegenheit bekommen, den .NET Framework unter Anleitung bekannter Personen aus Community und .NET Expertenschaft näher kennenzulernen. Zu den Referenten gehören drei Microsoft Regional Directors (Bernd Marquardt, Christian Weyer und ich) sowie Frank Eller, Patrick Lorenz und Senaj Lelic.

Die erste Woche des Trainings soll in den .NET Framework einführen. Grundlagenthemen wie CLR, WinForms, ADO.NET, XML Web Services und ASP.NET werden in Vorlesungen am Vormittag vorgestellt und anschließen in ausgedehnten Übungen vertieft. Dazu kommen 30min "Powertalks" am Nachmittag, in denen weitere Themen angerissen werden, um das Interesse der Teilnehmer zu wecken und über den Tellerrand der Hauptthemen hinaus zu schauen. Die Powertalks sind bewusst in Inhalt und Form frei gehalten, um den Referenten Raum für eines ihrer "Lieblingsthemen" zu geben, damit ihre Begeisterung leichter auf die Studenten überspringen kann.

Die zweite Woche der Trainings dient dann der Vertiefung des Gelernten. Anhand einer großen Beispielapplikation sollen alle Teilnehmer sowohl ihre fachlichen Kenntnisse festigen, wie auch die Zusammenarbeit in einem Projekt einüben. Ihr Ziel: In 5 Tagen einen nicht triviale ASP.NET Anwendung zu bauen, die später als Kern für weitere Community Angebote dienen kann. Die Studenten werden gefordert sein, sich sowohl an Architektur und Design zu beteiligen, wie untereinander Schnittstellen auszuhandeln, Tests zu koordinieren und wiederverwendbare Komponenten unter Zeitdruck zu realisieren. Ob das klappen wird? Ich bin gespannt. Die Idee hinter dieser zweiten Woche entstammt dem Konzept der Developer LAN Party, wird aber hier über einen größeren Zeitraum implementiert. Das wirkt sich hoffentlich auf die Gründlichkeit des Designs und die abschließende Codequalität aus, die auch durch einen Review am Ende gesichert werden soll.

Bisher sind die Wünsche zur Veranstaltung in Erfüllung gegangen. Die Tage verliefen fast reibungslos (wenn man von einer fehlenden Installation der MSDN Hilfe auf den Schulungsrechnern einmal absieht) und alle Teilnehmer sind sehr motiviert. Nach meinen bisherigen Erfahrungen mit Lehrveranstaltungen vor Studenten zu Themen aus dem Microsoft Umfeld bin ich persönlich sehr positiv überrascht. Es macht viel Spaß, die Teilnehmer am Nachmittag bei der Lösung ihrer Aufgaben zu begleiten. Und es ist schön zu sehen, wie frisch die Ideen sein können oder anders: Für die Lösung einer Teilaufgabe im Frontend zu meinem Thema ADO.NET hatte ich eigentlich nur eine Realisierungsform im Kopf, weil ich dachte, Databinding sei das Mittel der Wahl und sollte dringend gelernt werden ebenso wie der Umgang mit einem DataGrid. Die Studenten jedoch spielten da nicht mit und fanden ganz andere Wege, um die Informationen zu präsentieren und ändern zu lassen. Bei allem Willen zur Offenheit musste ich also feststellen, dass auch mein Denken schon eingefahren ist.

Cool ist der Event aber nicht nur, weil er ausgedehnt Möglichkeit bietet, in den .NET Framework einzusteigen und Theorie und Praxis miteinander zu verknüpfen und am Ende auch noch im Team ein Projekt zu realisieren. Cool ist er also nicht nur wegen seiner Ideen zu Didaktik und Methodik, sondern auch, weil die Stimmung gut ist. 2 Wochen in einem kleinen Vorlesungssaal und einem Kellerraum in der Uni zusammen zu einem Thema zu verbringen, lässt einfach ein Community-Feeling aufkommen, das man auf großen Events mit hunderten Teilnehmern nur schwer erzeugen kann. Das ist eine positive Erfahrung, die ich mehr Entwicklern - besonders auch professionellen - wünsche.

Am Mittwoch fand dann noch ein netter Social Event statt: Umtrunk und Abendessen in der Moritz Bastei. Da ging es dann endlich auch mal nicht nur um coole Technologie, sondern um kühles Bier und andere Themen. Und einige fanden wohl erst gegen halb 4 Uhr morgens den Weg ins Bett. Um 9h waren dann trotzdem aber alle wieder bei der Morgenvorlesung. Das nenne ich Einsatz! :-)

Zur Illustration meiner Beschreibung hier einige Impressionen vom heutigen Tag für die armen Daheimgebliebenen:


Christian Weyer im Einsatz: Er hatte sich extra ein Flipchart als zusätzliches Tool zu Powerpoint und VS.NET ausgebeten, um seinem Wissensvermittlungsdrang Ausdrucksmöglichkeiten zu geben.

Der Vorlesungsraum in der Universität ist auch morgens um 9h in der ansonsten vorlesungsfreien Zeit gut gefüllt. Knapp 40 Studenten nehmen am Training teil.

Auch wenn "Vorlesung" eher bedeutet "einer spricht, alles schläft", so machen die Teilnehmer auch während des Vortrags einen ausnehmen motivierten und aufmerksamen Eindruck. Es macht Spaß, vor einem solchen Publikum zu sprechen.

Am Nachmittag sind die Rollen dann umgekehrt: 40 tun etwas und 2 - Christian und ich - schlendern eher durch die Gänge :-) Manche Teilnehmer scheinen sogar das Gefühl zu haben, sich für die Übungsaufgaben "warm anziehen" zu müssen.

Andere wiederum suchen die Lösung in stiller Kontemplation. Bei einem vollgepackten Tag mit 2-3 Stunden Vorlesung, 1 Std Mittag bei leckerem Mensaessen und anschließendem Neonlicht im Keller und 4-5 Stunden Programmierung ist eine Minute Ruhe auf der anderen Seite niemandem zu verdenken.

Jede gelöste Aufgabe erfreut dann die Herzen doppelt, lässt die Wangen sich röten und die Stimmung steigen. Müdigkeit und Information Overflow sind wie weggeblasen.

Andernorts ist das Equipment eines modernen Studenten zu sehen: Tischrechner und Laptop. Mit weniger gibt man sich heute kaum mehr zufrieden ;-)

Equipment allein löst allerdings noch keine Aufgabe. Trotz der guten Rechnerausstattung im Schulungsraum suchen die Teilnehmer immer wieder unsere Hilfe. Und das ist auch verständlich, weil die Zeit für die Menge an Stoff immer noch zu kurz ist. Da hat Christian heute über XML Web Services gesprochen, aber in seiner Aufgabe den Einsatz von System.Xml verlangt. Auch noch diese Technologie sich "im Vorbeigehen" anzueignen - insbesondere bei sehr unterschiedlichem Wissensstand zum Thema XML-Programmierung - war dann nicht leicht für die Studenten. Aber sie haben es alle versucht und meist auch gut hinbekommen.

Ich hoffe, die nächsten Tage werden ähnlich nett und erfolgreich wie die bisherigen. Hoffentlich mögen die Studenten die Aufgabenstellung für die nächste Woche und behalten ihren Enthusiasmus. Eine "total immersion experience" zum Thema .NET Framework werden sie ansonsten nicht so schnell wieder erleben. Aber vielleicht macht das Event-Format ja Schule?

Posted by ralfw | 1 comment(s)

Dank an Torsten Rendelmann für seinen Hinweis auf die SystemEvents im Microsoft.Win32 Namespace. Ich hab sie gleich mal ausprobiert und meine WndProc-Lösung ersetzt. (Dass es jetzt allerdings besser funktionieren soll, kann ich nicht feststellen.) Meine Anwendung sieht jetzt so aus:


Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    AddHandler Microsoft.Win32.SystemEvents.PowerModeChanged, AddressOf OnPowerModeChanged
End Sub

Private Sub OnPowerModeChanged(sender as Object, e as Microsoft.Win32.PowerModeChangedEventArgs)
    if e.Mode = Microsoft.Win32.PowerModes.Resume then
        Timer1.Enabled = False
        Timer1.Enabled = True
    End If
End Sub


Der Code ist kürzer geworden, er enthält keinen Rückfall mehr in die Win32-API-Zeit und die SystemEvents lassen sich sogar ohne ein Window verarbeiten.

Fazit: Die Klassenbibliothek des .NET Framework bietet immer wieder noch unexplorierte Bereiche :-)

Gerade bastle ich an einer kleinen Anwendung, mit der ich mir im System Tray immer die aktuell günstigsten Call-by-Call-Nummern anzeigen lassen kann. Wenn ich dann einen Anruf machen möchte, muss ich nur die Maus über das Tray Icon bewegen und sehe schon, welche Vorwahl ich wählen muss. Das finde ich einfacher, als eine Seite wie www.telefontarife.de im Browser aufzurufen oder gar ein Tarifvergleichsprogramm zu installieren.

Mein kleines Programm soll einfach im Hintergrund laufen, ein Tray Icon zeigen und periodisch seine Daten durch Zugriff auf ein Informationsangebot im Internet aktualisieren. Das ist auch alles kein Problem - solange ich meinen Laptop nicht schlafen lege. Meist fahre ich den Rechner am Tagesende (oder auch zwischendurch) nicht herunter, sondern schalte ihn nur in den Standby- oder Hibernate-Modus.

Wenn ich ihn aus einem dieser Modi wieder erwecke, läuft meine Anwendung zwar noch, aber das Timer-Control feuert nicht mehr periodisch. Das Programm aktualisiert seine Daten also nicht mehr automatisch.

Da andere Programme aber sehr wohl auf die Erweckung aus einem der Schlummerzustände reagieren (Outlook holt dann z.B. die Email ab), dachte ich mir, dass auch meine Anwendung sich über diese Systemzustandsänderung informieren lassen könnte. Wie könnte sie aber an die Ereignisse, die Windows zu diesem Zweck sicherlich wirft, herankommen? Die Antwort liegt im Windows Platform SDK unter dem Stichwort "Power Management".

Windows meldet Ereignisse des Power Management Systems mit der Windows Nachricht WM_POWERBROADCAST an alle Anwendungen:

#define WM_POWERBROADCAST               0x0218

Der wparam der Nachricht enthält dann einen der folgenden Werte:

#define PBT_APMQUERYSUSPEND             0x0000
#define PBT_APMQUERYSTANDBY             0x0001

#define PBT_APMQUERYSUSPENDFAILED       0x0002
#define PBT_APMQUERYSTANDBYFAILED       0x0003

#define PBT_APMSUSPEND                  0x0004
#define PBT_APMSTANDBY                  0x0005

#define PBT_APMRESUMECRITICAL           0x0006
#define PBT_APMRESUMESUSPEND            0x0007
#define PBT_APMRESUMESTANDBY            0x0008

#define PBTF_APMRESUMEFROMFAILURE       0x00000001

#define PBT_APMBATTERYLOW               0x0009
#define PBT_APMPOWERSTATUSCHANGE        0x000A

#define PBT_APMOEMEVENT                 0x000B
#define PBT_APMRESUMEAUTOMATIC          0x0012

Davon sind für meine Zwecke PBT_APMRESUMESUSPEND und PBT_APMRESUMESTANDBY interessant. Die erhält meine Anwendung, wenn der Rechner aufgeweckt wird.

Um auf die Power-Management-Nachricht zu reagieren, muss ich dann nur die WndProc()-Methode meines Anwendungsfensters überschreiben:

Public Class Form1
    Inherits System.Windows.Forms.Form

    ...

    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        Const WM_POWERBROADCAST As Integer = &H218
        Const PBT_APMRESUMESUSPEND As Integer = 7
        Const PBT_APMRESUMESTANDBY As Integer = 8

        If m.Msg = WM_POWERBROADCAST Then
            If m.WParam.ToInt32 = PBT_APMRESUMESTANDBY Or m.WParam.ToInt32 = PBT_APMRESUMESUSPEND Then
                Timer1.Enabled = False
                Timer1.Enabled = True
            End If
        End If
        MyBase.WndProc(m)
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        ' aktuelle Tarifdaten laden...
    End Sub
End Class


Die WndProc()-Methode schaltet dann nur meinen Timer aus und wieder an und schon läuft alles wieder automatisch - bis zur nächsten Schlafenszeit.

More Posts