Prosit 2010

Ich möchte allen meinen Lesern, Unterstützern und Freunden einen guten Rutsch ins neue Jahr wünschen. Möge es von Erfolg, Glück und vor allem Gesundheit geprägt sein.

Auf 2010 freue ich mich schon ganz besonders, stehen doch einige wichtige Termine/Änderungen an. So wird sich auch mein Privatleben gehörig ändern – mehr dazu aber zu gegebener Zeit.

Auch im Bereich Windows Presentation Foundation und Silverlight steht einiges auf dem Programm – auch das erfüllt mich bereits mit Vorfreude. Ein herzliches Dankeschön möchte ich auch Microsoft aussprechen. Dafür, dass ich 2009 zum zweiten Mal den Most Valuable Professional verliehen bekam. Danke sehr.

Ein weiteres Dankeschön gebührt auch Rolf und Max von Microsoft Österreich. Danke für die Möglichkeit, offen mit euch über mir wichtige Themen sprechen zu können.
Insgesamt kann ich auf ein schönes Jahr 2009 zurück blicken, auf viele nette Menschen, die ich kennen lernen durfte, erfolgreiche Projekte und vielen gesammelten Erfahrungen.

So blicke ich mit freudiger Erwartung auf das kommende Jahr und wünsche euch allen ein gutes neues Jahr.

Webcam per Silverlight verwenden

Silverlight 4 macht die Verwendung von einigen Features überhaupt erst möglich bzw. viel einfacher als bisher gewohnt. Dieses Beispiel zeit, wie einfach auf eine installierte Webcam zugegriffen werden kann.

Dazu wird eine einfache Oberfläche benötigt, die sich in diesem Fall aus einem Grid, einem Rectangle und zwei Buttons zum Aktivieren und Deaktieren der Webcam zusammen setzt:

<Grid x:Name="LayoutRoot" Background="White">
    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>

    <Rectangle x:Name="VideoVisualization" 
               Grid.Row="0" 
               Grid.Column="0"
               Grid.ColumnSpan="2"
               Margin="30">
        <Rectangle.Effect>
            <DropShadowEffect BlurRadius="15"
                              Color="Black"
                              ShadowDepth="4"/>
        </Rectangle.Effect>
    </Rectangle>

    <Button x:Name="TurnOnButton" 
            Content="Turn on Webcam" 
            Grid.Row="1"
            Grid.Column="0"
            Click="TurnOnButton_Click"
            Margin="5"/>
    <Button x:Name="TurnOffButton" 
            Content="Turn off Webcam" 
            Grid.Row="1"
            Grid.Column="1"
            Click="TurnOffButton_Click"
            Margin="5"/>
</Grid>

Um nun auf die Webcam zuzugreifen werden einige Klassen benötigt:

  • CaptureDeviceConfiguration – Stellt den Zugriff auf das Standard-Video Capturing Device zur Verfügung, als auch den Zugriff auf die Audio-Funktionalität. Ebenfalls kann darüber der Zugriff auf die Komponente angefordert werden.
  • CaptureSource – Klasse für das tatsächliche Capturing
  • VideoBrush – Zeichnet den tatsächlichen Videobereich

Mit diesen Informationen kann eine einfache Klasse zur Steuerung der Webcam entwickelt werden:

public class WebcamHandler
{
    private VideoCaptureDevice videoDevice;
    private CaptureSource source;
    private Shape visualizationElement;

    public Shape VisualizationElement
    {
        get { return visualizationElement; }
        set { visualizationElement = value; }
    }

    public void Start()
    {
        videoDevice = CaptureDeviceConfiguration.GetDefaultVideoCaptureDevice();
        if (CaptureDeviceConfiguration.RequestDeviceAccess())
        {
            if (source != null)
            {
                source.Start();
                return;
            }

            source = new CaptureSource();
            source.VideoCaptureDevice = videoDevice;

            VideoBrush videoBrush = new VideoBrush();
            videoBrush.SetSource(source);
            videoBrush.Stretch = Stretch.UniformToFill;
            source.Start();
            VisualizationElement.Fill = videoBrush;
        }
    }

    public void Stop()
    {
        source.Stop();
    }
}

Diese Klasse muss nun lediglich im Codebehind innerhalb der Button-Handler eingebunden werden:

public partial class MainPage : UserControl
{
    WebcamHandler webcam = new WebcamHandler();

    public MainPage()
    {
        InitializeComponent();
    }

    private void TurnOnButton_Click(object sender, RoutedEventArgs e)
    {
        webcam.VisualizationElement = VideoVisualization;
        webcam.Start();
    }

    private void TurnOffButton_Click(object sender, RoutedEventArgs e)
    {
        webcam.Stop();
    }
}

Und schon kann unsere Beispiel-Anwendung gestartet werden. Beim Aufruf von CaptureDeviceConfiguration.RequestDeviceAccess() erscheint ein Dialog, mit dem wir den Zugriff gewähren müssen. Wurde der Zugriff gewährt, startet das Capturing.

Die Demoanwendung gibt es natürlich auch noch als Download.

Download

SharePoint Error: Some or all identity references could not be translated

Wer VPCs mit WSS im Einsatz hat, diese dann auch kopiert und anschließend entsprechend konfiguriert, der kann mal eben schnell zu Meldung

Some or all identity references could not be translated

in der Sharepoint Central Administration gelangen. Ist dem der Fall einfach den Command

stsadm.exe -o updatefarmcredentials -userlogin -password

ausführen, dann sollte alles wieder funktionieren.

How-To’s für WPF und Silverlight

Kleine How-To’s, also kleine Artikel, die kompakt die Lösung eines Problems zeigen, können sehr hilfreich sein. .NET GUI bietet hierfür eine eigene Sektion an, die sich langsam aber sicher mit zahlreichen How-To’s füllt. Nun sind vier weitere How-To’s verfügbar:

Windows7-Taskbar mit WPF anpassen – Progress
Windows7-Taskbar mit WPF anpassen – JumpList
How-To: Silverlight hat einen Timer
How-To: Web-Services in Silverlight synchron aufrufen

Es kommen übrigens laufend neue Kurzartikel hinzu.

Making of Community-Projects – Interview mit Norbert Eder

Gregor Biswanger hat mich vor einigen Tagen zum Thema Making of Community-Projects interviewt. Dabei ist ein nettes Gespräch entstanden, welches seit gestern bei ihm zu lesen ist. Es stand die Frage im Raum, wie es denn zu Community-Projekten kommt und wie man denn diese schließlich aufbaut. Ein nettes Gespräch, wo es wohl noch massig weitere Dinge zu sagen gäbe.

Zum Interview

Der leidenschaftliche Programmierer

Nicht zufällig deckt sich die Überschrift dieses Beitrags mit dem Buch von Chad Fowler (nicht zu verwechseln mit Martin Fowler). The Passionate Programmer, also der leidenschaftliche Programmierer. Es gibt einige Bücher, die sich mit allgemeineren Entwicklerproblemen oder mit speziellen Methoden beschäftigen. Aber nicht alle sind zu empfehlen. In der letzten Zeit habe ich viele dieser Bücher gelesen, einige haben jedoch einen bleibenden Eindruck hinterlassen. So auch das Buch von Chad Fowler.

Worum geht es? Kurz und bündig geht es darum, wie sich ein Programmierer den Weg in seine Zukunft selbst ebnen kann. In den Tag hineinleben, täglich dieselbe Arbeit leisten und dabei auch noch glücklich sein, fällt wohl den meisten Programmierern schwer. Chad erzählt aus seinem und dem Leben anderer, bekannter IT/Software-Experten. Worauf kommt es an, welche Schritte kann man selbst setzen, um Leidenschaft zu entwickeln, diese zu stärken und somit ein erfüllteres Leben zu schaffen?

In kurzen Kapiteln (dafür sehr viele) werden die einzelnen Aspekte hinterfragt und Tipps gegeben. In vielen Fällen kamen mir die Situationen wohl bekannt vor, stehen doch die meisten Entwickler vor den gleichen Fragen und Problemen. Natürlich kann man keine 100%ige Lösung für sein eigenes Problem erwarten, doch tut eine andere Meinung durchaus gut, um den eigenen Weg zu reflektieren bzw. zu begradigen.

Den Abschluss eines jeden Kapitels bilden kleine Aufgabenstellungen, die es erleichtern sollen, das Gelesene zu verstehen und gleich in die Praxis umzusetzen. Ob diese wirklich ausgeführt werden bleibt natürlich jedem selbst überlassen, doch laden sie jedenfalls ein, sich weitere Gedanken zum Thema zu machen, die vielleicht noch weiter als das Buch gehen und somit neue Ideen, Möglichkeiten und Wege bilden.

Insgesamt ein sehr gelungenes Buch, das zwar – wie bereits erwähnt – nicht alle Fragen eines Entwicklers klären wird, aber mit Sicherheit hilft, den Blick auf das Wesentliche zu schärfen, nämlich Leidenschaft für seine Arbeit zu entwickeln und die eigenen Fähigkeiten zu stärken bzw. überhaupt herauszufinden, wo denn die eigenen Stärken tatsächlich liegen. Darauf kann jeder aufbauen und so seinen eigenen – für sich selbst idealen – Weg finden und sich optimal einbringen (sei es unselbständig oder selbständig).

Chad Fowler
Chad Fowler has been a software developer and manager for some of the world’s largest corporations. He recently lived and worked in India, setting up and leading an offshore software development center. He is co-founder of Ruby Central, Inc., a non-profit corporation responsible for the annual International Ruby Conference, and is a leading contributor in the Ruby community. Chad is a contributor and editor for numerous books.

Hinweis: Bei einigen meiner Unterhaltungen kam die Frage auf, ob es denn jemand ohne einschlägige Ausbildung in der Softwareentwicklung weit bringen kann (wie auch immer der Terminus "weit bringen" zu definieren ist). Chat Fowler ist hier ein wirklich gutes Beispiel, ist er doch eigentlich Musiker …

Was der Bogensport mit Softwareentwicklung zu tun hat …

Bogenschießen ist eines meiner Hobbies. Ich bin zwar weit davon entfernt ein Experte in diesem Sport zu sein, dennoch hat mich die Faszination dieses Sports erreicht. Anfangs als Ruhepol, quasi als Ausgleich, zu stressreichen Zeiten angesehen, tun sich mit Fortdauer des Trainings einige Parallelen zur Programmierung auf.

Während Experten danach trachten, mit jedem Schuss das „Gold“ zu erreichen steht für mich im Vordergrund, eine gute Grundleistung abzurufen und alle Pfeile eng beieinander ins Ziel zu bringen. Können alle Pfeile einer Schussserie im „Gold“ platziert werden, wäre dies natürlich das Optimum – die beste aller möglichen Lösungen.

Tatsächlich kann es aber auch schon als gute Leistung angesehen zu werden, alle Pfeile eng beieinander in die 8er zu senden. Alle im 8er zu versenken, jedoch verteilt über den gesamten Ring wäre hingegen keine besonders gute Leistung, sondern eher dem Glück zuzuschreiben. Warum?

Sind alle Pfeile eng beieinander muss nur eine kleine Korrektur vorgenommen werden und sie alle können im höchsten Ziel platziert werden. Bei weit verstreuten Pfeilen hilft eine einzige Korrektur nichts.

Die Quintessenz daraus ist, dass zu Beginn des Trainings nicht das Erreichen vieler Punkte ausschlaggebend ist, sondern vielmehr die enge Platzierung der Pfeile, egal wohin. Ist dieser Schritt getan, können weitere Verbesserungen vorgenommen werden. Zu dieser Fähigkeit müssen weitere entwickelt werden:

Automatisierung der Abläufe: Wer sämtliche Abläufe verinnerlicht und automatisiert, muss sich darüber keine Gedanken machen. Es geschieht einfach automatisch. Übrig bleibt, sich voll auf das eigentliche Ziel konzentrieren zu können. So verhält es sich auch in der Softwareentwicklung. Nur wer seine Werkzeuge kennt und sie verinnerlicht, hat den Kopf für die eigentliche Lösung eines Problems frei. Wer keine Feinheiten hinterfragen muss, erlangt einen Überblick über das Gesamte und kann so seine Fähigkeiten voll ausspielen.

Konzentration: Dies ist eine der wichtigsten Fähigkeiten des Bogensports. Wer sich nicht konzentrieren kann (aus welchen Gründen auch immer), wird weder den richtigen Zeitpunkt finden, den Pfeil loszulassen (zu releasen), noch einen geschmeidigen Bewegungsablauf erreichen. Das Erfassen des Zieles wird extrem schwierig, wenn nicht gar unmöglich. Die täglichen Anforderungen an einen Entwickler erfordern ebenfalls ein gehöriges Maß an Konzentrationsfähigkeit. Wir sind ständig von äußeren Einflüssen (Lärm, Anfragen, Emails, Messenger, etc.) umgeben. Diese müssen über einen notwendigen Zeitraum ausgeblendet werden können. Nur so ist es möglich, sich auf das Wesentliche zu beschränken bzw. dieses überhaupt erst ins Licht zu rücken. Wer schon einmal mit dem Bogensport (oder einer ähnlichen Sportart) in Berührung gekommen ist weiß, dass das Training eigentlich sofort abgebrochen werden kann, wenn die Konzentration nicht stimmt bzw. diese nicht geschaffen werden kann.

Genauigkeit: Schon mal versucht, ohne genau zu sein, das Gold zu treffen? Vielleicht auch getroffen? Zufall. Wer keine Genauigkeit an den Tag legt (angefangen bei der Körperhaltung, dem Bewegungsablauf, der Konzentration, etc.) wird keine beständige Leistung bringen. Allenfalls basieren Erfolge auf Glück. Darauf kann man sich nicht verlassen, möchte man eine solide Leistung über einen langen Zeitraum erbringen. In der Softwareentwicklung spielt Genauigkeit ebenfalls eine große Rolle. Im Gegensatz zum Bogensport können die meisten Softwareentwickler davon ausgehen, dass keine Menschenleben in Gefahr sind. Nichts desto trotz müssen Anforderungen korrekt umgesetzt, die Qualität hochgehalten und Termine eingehalten werden. Dies kann nur durch ein ausreichendes Maß an Genauigkeit erreicht werden.

Der Verzicht auf die notwendige Konzentration und Genauigkeit kann beim Bogensport – wie bereits erwähnt – schnell ein Menschenleben kosten. Im geringsten Fall entstehen Materialkosten. Diese sind nicht zu unterschätzen. Ein verirrter Pfeil der Mangels an Konzentration abgeschossen wurde, fällt sehr schnell Hartholz, Beton, Steinen oder anderen Hindernissen zum Opfer. Bedenkt man die verhältnismäßig hohen Kosten eines Pfeiles rentiert es sich nicht, unkonzentriert diesem Sport nachzugehen. Pro Trainingssession zwei zerstörte Pfeile á 10 Euro ergeben 20 Euro Minus pro Trainingseinheit. Unter der Annahme, dass pro Woche zweimal trainiert wird, entstehen im Jahr dadurch Kosten von über 2000 Euro. Sehr viel für ein Hobby. In der Softwareindustrie können Fehler, nicht eingehaltene Termine etc. ebenfalls ungeahnte Kosten verursachen. Angefangen von kostenlosen Fehlerbehebungen (Personalkosten, es könnte an anderen, lukrativen Projekten gearbeitet werden), Pönalezahlungen für nicht eingehaltene Termine bis hin zum Konkurs des Unternehmens – und somit der Verlust des eigenen Jobs – ist alles möglich. Ein sehr hoher Preis.

Natürlich kann man daraus nur sehr schwer Regeln für die Allgemeinheit abbilden. Für mich konnte ich mit auf den Weg nehmen, dass das Einhalten kleiner Regeln, angelehnt an mein Hobby, die Arbeitsleistung erheblich steigern kann. Jeder muss seinen eigenen Weg finden, mit bestimmten Situationen umzugehen, ein Ausgleich tut jedoch immer gut, gibt Kraft für schwere Zeiten und hilft, Probleme aus einem anderen Licht zu betrachten.

.NET Open Space Wien 2009

Die besten Gespräche hat man fernab von einer festgelegten Agenda, bei einem Kaffee und beim "du". Hier gibt es keine Rollenaufteilung in Sprecher / Zuhörer, Entwickler / Administrator, Softwareentwickler / Projektmanager usw. und die Themen finden sich vor Ort ganz von selbst. Das ist die Idee vom .NET Open Space Wien: Alle sind gleich! Auch die Organisatoren halten sich im Hintergrund und moderieren nur wenig. Themenfelder sind unter anderen: .Net, Alt.Net, und Soft Skills.

Welche Inhalte in den einzelnen Themenfeldern bearbeitet werden, bestimmst du vor Ort, denn die Veranstaltung ist Open Space! Die Teilnahme ist kostenlos. Erfahrungsaustausch ist das A und O und steht im Vordergrund. Die Sprache beim .NET Open Space Wien 2009 ist Deutsch. Mehr gibt’s nicht zu sagen. Erlebe die "Unkonferenz", die sich auf Erfahrungsaustausch konzentriert. Nimm daran teil! Abonniere jetzt einfach unseren Newsletter dazu.

Die Veranstaltung ist zweitägig und findet im Microsoft Innovation Center in Wien am 5. und 6. Dezember statt. Die Anmeldung funktioniert ganz einfach über das Wiki, welches unter wien.netopenspace.de/2009/MainPage.ashx erreichbar ist.

Wenn Du jemanden kennst, der als Sponsor auftreten will oder Du selbst etwas zum Erfolg der Veranstaltung beitragen willst, dann melde Dich bitte einfach bei Mario Meir-Huber (mario@meirhuber.de) oder Norbert Eder (csharp@gmx.at). Eine Übersicht der aktuellen Sponsoren und der Sponsor-Möglichkeiten sind auf der Sponsoren-Seite zu finden.

Commands aus ListView ausführen

Mit Hilfe einer ListView ist es einfach möglich, Daten aus einer Datenquelle darzustellen. Dazu ist lediglich die Eigenschaft View zu definieren. Durch die Angabe von GridViewColumn Elementen und dem dazugehörigen DisplayMemberBindings werden die Daten aus der zugewiesenen Datenquelle auch schon angezeigt.

<ListView ItemsSource="{Binding MyOpenTickets}" BorderThickness="0" Margin="4">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Id" 
                            DisplayMemberBinding="{Binding Id}"/>
            <GridViewColumn Header="Name"
                            DisplayMemberBinding={Binding Name}/>
            <GridViewColumn Header="Version" 
                            DisplayMemberBinding="{Binding Version.Name}"/>
            <GridViewColumn Header="Status" 
                            DisplayMemberBinding="{Binding State}"/>
        </GridView>
    </ListView.View>
</ListView>

Eine Anforderung ist nun sehr oft, dass die angezeigten Daten in einem Detailfenster geöffnet werden sollen. Dazu muss – idealerweise – ein Command untergebracht werden. Dies kann durch die Angabe eines CellTemplates bewerkstelligt werden.

<ListView ItemsSource="{Binding MyOpenTickets}" BorderThickness="0" Margin="4">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Id" 
                            DisplayMemberBinding="{Binding Id}"/>
            <GridViewColumn Header="Name" 
                            CellTemplate="{StaticResource TicketClickableButton}"/>
            <GridViewColumn Header="Version" 
                            DisplayMemberBinding="{Binding Version.Name}"/>
            <GridViewColumn Header="Status" 
                            DisplayMemberBinding="{Binding State}"/>
        </GridView>
    </ListView.View>
</ListView>

In der zweiten GridViewColumn-Definition wird das CellTemplate definiert. Zu beachten ist an dieser Stelle, dass kein DisplayMemberBinding angegeben werden darf. Hier nun das verwendete Template:

<DataTemplate x:Key="TicketClickableButton">
    <Button Command="{Binding OpenTicketCommand}" 
            Content="{Binding Name}" 
            Style="{StaticResource ProjectLinkButton}" />
</DataTemplate>

Das Template stellt eine einfache Schaltfläche dar, welche an einen Command gebunden ist. Zusätzlich wird an der Schaltfläche das Binding definiert.

Eine mögliche Umsetzung kann so aussehen:

.NET BlogBook wieder verfügbar

Wie auch mein Blog waren einige meiner Websites lange Zeit nicht online (bzw. sind es teilweise noch immer). Dies wird sich nun – durch einen Wechsel – wieder ändern.

Den Anfang macht dotnet-blogbook.com. Die Site steht ab sofort wieder zur Verfügung – jedoch noch nicht alle Downloads. Alle BlogBooks bis inklusive Version 3 können herunter geladen werden. Die weiteren Ausgaben werden in den kommenden Tagen hinzugefügt und stehen dann wie gewohnt zur Verfügung.

Gerade zum BlogBook habe ich sehr viele Anfragen bekommen. Das Projekt wird weitergeführt und es wird auch wieder aktualisierte Versionen geben.

Cookie-Einstellungen
Auf dieser Website werden Cookie verwendet. Diese werden für den Betrieb der Website benötigt oder helfen uns dabei, die Website zu verbessern.
Alle Cookies zulassen
Auswahl speichern
Individuelle Einstellungen
Individuelle Einstellungen
Dies ist eine Übersicht aller Cookies, die auf der Website verwendet werden. Sie haben die Möglichkeit, individuelle Cookie-Einstellungen vorzunehmen. Geben Sie einzelnen Cookies oder ganzen Gruppen Ihre Einwilligung. Essentielle Cookies lassen sich nicht deaktivieren.
Speichern
Abbrechen
Essenziell (1)
Essenzielle Cookies werden für die grundlegende Funktionalität der Website benötigt.
Cookies anzeigen