.
Anmeldung | Registrieren | Hilfe

.NET-Blogs Archiv Januar 2011

Beherrsche die Maschine und gewinne eine Reise nach Las Vegas

31.01.2011 23:31:45 | Jan Welker

An alle Windows 7 Maschinisten und solche die es werden wollen. Gewinnt eine unvergessliche Reise nach Las Vegas.

Win7Maschine

Der Auftrag

Welche Funktion suchst du in Deinem System vergeblich? Die Mäusejagd, das Schneetreiben oder etwas ganz anderes? Stell Dich der Herausforderung und baue Deine eigene verrückte Wunsch-Anwendung. Dabei sollte mindestens eine der vielen neuen Windows 7 Funktionen verwendet werden. Lade Dir dein Werkzeug kostenlos herunter und zeig wie kreativ Du bist. Wie Dein Windows 7 aussehen soll, kannst Du jetzt selbst bestimmen.

Anforderungen für den Wettbewerb

  • Verwendung einer Version von Visual Studio 2010 (z.B. kostenfrei Visual Studio Express herunterladen
  • .NET Framework oder Visual C++ basierend
  • Verwendung von Windows 7 Funktionen
  • Möglichst wenig Zeilen (gibt Pluspunkte)
  • Sämtliche Bestandteile (Bibliotheken, Bilder, etc.) müssen mit eingereicht werden
  • Der Teilnehmer muss die Software selber erstellt haben und sämtliche Rechte an allen eingebundenen Bestandteilen besitzen.

Das gibt es zu gewinnen

  • 1. - 3. Preis: Großer Las Vegas Gambling-Trip mit Besuch der MIX und Helikopterflug
  • 4. Preis: 40‘‘ Sony LCD Flatscreen TV KDL-40NX715 bietet Full HD und 3D im brillianten Design, dazu bekommst du das Sony Sound System mit 3D-fähigem BluRay BDV-IZ1000W
  • 5. Preis: Xbox mit Kinect, 1x Controller sowie den 3 Spielen Kinect Adventures, Kinect Sports und Dance Central
  • 6. Preis: Windows Phone7 (LG Optimus 7)
  • 7. Preis: Paket mit Maus, Tastatur und Headset

Weitere Informationen und Teilnahmebedingungen: http://go.microsoft.com/?linkid=9760501

TFS 2010 : Tracking von Änderungen die nicht innerhalb der Branch Hierarchie erfolgt sind

31.01.2011 18:19:00 | Christian Binder

Mit TFS 2010 gibt es die Möglichkeit, Änderungen grafisch innerhalb der Branch Hierarchie nachvollziehen zu können. Grundsätzlich gehören erst mal alle Branches zu einer Hierarchie, die durch eine Parent/Child Relation verknüpft sind, was automatisch passiert, wenn von einer Branch ein zweiter Branch erstellt wird. Branches, die durch Parent/Child Relationen verknüpft sind, werden auch “First Class Branches” in diesem Kontext genannt. Zusätzlich gibt es noch eine Merge Relation zwischen Branches, die entweder durch einen Baseless Merge erzeugt wird oder indem man eine Branch durch den Befehl Re-parent aus der Hierarchie entfernt. Wie kann ich nun Änderungen Visualisieren, die von einem Branch außerhalb der Hierarchie via Merge überführt wurden?

Nehmen wir folgende einfache Hierarchie an. Dev2 hat eine Relation mit Main durch einen Baseless Merge erhalten.

image

Die Änderung Chg 206 wurde via Merge nach Main überführt und soll jetzt visualisiert werden. Hierzu muss in den FilterOptionen “ Include branches from all hierarchies” gewählt werden:

image 

Jetzt noch die Branches selektieren, die in der Visualisierung berücksichtigt werden sollen:

image

Man sieht, dass das Chg206 nach Main via Merge überführt wurde:

image

Timeline:

image

 

 

 

 

Wenn nun Chg207 via FI von Main nach Dev  durchgeführt wird, sieht das Tracking von Chg206 wie folgt aus:

image

Eine Limitation der Visualisierung ist, dass Sie nur auf Branch Objekte und deren Relationen funktioniert. Wäre zum Beispiel der Baseless Merge mit einem Unterverzeichnis von Main z.B. Main\MyFolder durchgeführt worden, wäre ein anschießender Merge nach Main\MyFolder nicht visualisierbar, da MyFolder kein Branch Objekt ist.

Hinweis:   Das Branch Modell sollte idealerweise aus First Class Branches bestehen.

Viel Spass

MSDN on Tour: 3.2. in Mülheim – Meet & Greet

31.01.2011 10:09:23 | Peter Nowak

Seit einigen Tagen tourt der MSDN Bus mit interessanten Vorträgen und Personen durch Deutschland. Am 3.2. macht der Bus halt in Mülheim (Achtung – die Veranstaltung beginnt bereits um 17 Uhr).

Aufgrund der Ortsnähe haben wir uns kurzfristig dazu entschieden ein kleines “Meet & Greet” zu veranstalten. Simon Hackfort, Patrick Getzmann und meine Wenigkeit werden somit vor Ort sein um unser aktuelles Buch zu signieren, wie auch ein paar interessante Gespräche über Windows Phone 7 zu führen.

Hier somit die Details noch in Kürze:

Wo: .net Usergroup
Ort: Mülheim an der Ruhr
PLZ: 45475
Straße: Schultenhofstr. 19-23
Zeit: 17.00 - 22.00 Uhr



This posting is provided "AS IS" with no warranties, and confers no rights.

Windows Phone Wednesday 2/16, the App Developers Conference at Mobile World Congress

31.01.2011 06:34:26 | Peter Nowak

Hier eine Information des Windows Phone 7 Teams:

Calling all developers!!!!
If you are interested in learning more about developing apps for Windows Phone 7 then do we have the event for you…

“The Why and How’s of Windows Phone 7
Presented by Microsoft

Join us on a whirlwind tour around the landscape of the Windows Phone platform. The daylong session will examine all aspects of development on the phone, including building apps and games, marketplace monetization, tips and trick for certification and an open panel discussion where you can get answers to your burning questions.

Get in on the ground floor with us and see what makes us different!”

Day long sessions includes:

Time               Session Title  Speaker
09:30-10:00 State of the Union Brandon Watson
10:00-10:30 Platform Overview Larry Lieberman
10:30-11:30 UX/Metro Design Review Bryan Agnetta
11:30-11:45 Break  
11:45-12:45 Mobile Web Platform Futures  Joe Marini
12:45-01:45 Lunch  
01:45-02:45 Panel discussion  
02:45-03:00 Break  
03:00-04:00 Business of your App  Todd Biggs
04:00-05:00 Silverlight/XNA overview Rob Cameron


The conference pass gets you into the ADC as well as into the Expo Hall at Mobile World Congress.
If you are interested please send an email to creators@microsoft.com with the following details:

  • First and last name
  • email address for the invite
  • Company name

We are limited to 200 passes so sign up early
We look forward to seeing you there!!!
This is a great opportunity for developers to get the latest and greatest info on WP7.



This posting is provided "AS IS" with no warranties, and confers no rights.

Control 12 Servos with Arduino using Serial Monitor

30.01.2011 19:32:00 | Ozgur Aytekin

Disclaimer: I have tested these instructions and this code and it works for me. However, you must use it at your own risk. I am not responsible for any damage it may do to your data or your hardware.

Using this code, you can control 12 servos with an Arduino.

For each servo, it's possible to define the position angle with Serial Monitor tool.

Syntax using Serial Monitor:
1.045 = move Servo 1 to position 45 degree
or
2.120 = move Servo 2 to position 120 degree
or
10.073 = move Servo 10 to position 73 degree

It's important prefix the position with 0 when the position angle is smaller then 100 degree!

Code:
#include <Servo.h>

// declare servo objects
Servo servo00;
Servo servo01;
Servo servo02;
Servo servo03;
Servo servo04;

Servo servo05;
Servo servo06;
Servo servo07;
Servo servo08;
Servo servo09;

Servo servo10;
Servo servo11;

// declare servo angle variables and setting initial values
int servo00Angle;
int servo01Angle;
int servo02Angle;
int servo03Angle;
int servo04Angle;

int servo05Angle;
int servo06Angle;
int servo07Angle;
int servo08Angle;
int servo09Angle;

int servo10Angle;
int servo11Angle;

// declare a char array to buffer (5 byte) the inputs from Serial Monitor window
char serialMonitorBuffer [5];

float value;
int row = 0;

// The setup() function is called when a sketch starts. 
void setup()
{
  // Sets the data rate in bits per second (baud) for serial data transmission.
  Serial.begin(9600);

  // Attach the Servo variable to a pin.
  servo00.attach(2);
  servo01.attach(3);
  servo02.attach(4);
  servo03.attach(5);
  servo04.attach(6);

  servo05.attach(7);
  servo06.attach(8);
  servo07.attach(9);
  servo08.attach(10);
  servo09.attach(11);

  servo10.attach(12);
  servo11.attach(13);
  
  setInitialPositionValues();
}

void loop()
{
  // Get the number of bytes (characters) available for reading from the serial port.
  // This is data that's already arrived and stored in the serial receive buffe
  if (Serial.available())
  {
    delay(5);

    // store serial data into buffer array (5 byte)
    int i=0;     
    while(i < 5)
    {
      serialMonitorBuffer[i] = Serial.read();
      i++;
    }

    // Flushes the buffer of incoming serial data.
    // That is, any call to Serial.read() or Serial.available() will return
    // only data received after all the most recent call to Serial.flush(). 
    Serial.flush();

    // convert numeric string to float
    value = atof(serialMonitorBuffer);

    row++;

    // Prints data to the serial port as human-readable ASCII text.
    Serial.print(row);
    Serial.print(";");
    Serial.print(value);
    Serial.print(";");

    // if 99 is given, set servos to initial position
    if(value > 99)
    {
      setInitialPositionValues();
    }
    else if(value > 11.0)
    {
      float angle = (value - 11.0) * 1000;
      servo11Angle = (int)angle;
    }
    else if(value > 10.0)
    {
      float angle = (value - 10.0) * 1000;
      servo10Angle = (int)angle;
    }
    else if(value > 9.0)
    {
      float angle = (value - 9.0) * 1000;
      servo09Angle = (int)angle;
    }
    else if(value > 8.0)
    {
      float angle = (value - 8.0) * 1000;
      servo08Angle = (int)angle;
    }
    else if(value > 7.0)
    {
      float angle = (value - 7.0) * 1000;
      servo07Angle = (int)angle;
    }
    else if(value > 6.0)
    {
      float angle = (value - 6.0) * 1000;
      servo06Angle = (int)angle;
    }
    else if(value > 5.0)
    {
      float angle = (value - 5.0) * 1000;
      servo05Angle = (int)angle;
    }
    else if(value > 4.0)
    {
      float angle = (value - 4.0) * 1000;
      servo04Angle = (int)angle;
    }
    else if(value > 3.0)
    {
      float angle = (value - 3.0) * 1000;
      servo03Angle = (int)angle;
    }
    else if(value > 2.0)
    {
      float angle = (value - 2.0) * 1000;
      servo02Angle = (int)angle;
    }
    else if(value > 1.0)
    {
      float angle = (value - 1.0) * 1000;
      servo01Angle = (int)angle;
    }
    else if(value > 0.0)
    {
      float angle = (value - 0.0) * 1000;
      servo00Angle = (int)angle;
    }
  }

  //  printOutServoAngles();
  if(value > 0.0)
  {
    printOutServoAnglesToCsv();
  }

  value = 0;

  servo00.write(servo00Angle);
  servo01.write(servo01Angle);
  servo02.write(servo02Angle);
  servo03.write(servo03Angle);
  servo04.write(servo04Angle);

  servo05.write(servo05Angle);
  servo06.write(servo06Angle);
  servo07.write(servo07Angle);
  servo08.write(servo08Angle);
  servo09.write(servo09Angle);

  servo10.write(servo10Angle);
  servo11.write(servo11Angle);

  delay(50);
}

void setInitialPositionValues()
{
  servo00Angle = 84;
  servo01Angle = 80;
  servo02Angle = 86;
  servo03Angle = 79;
  servo04Angle = 95;

  servo05Angle = 85;
  servo06Angle = 85;
  servo07Angle = 85;
  servo08Angle = 81;
  servo09Angle = 88;

  servo10Angle = 79;
  servo11Angle = 79;
}

void printOutServoAnglesToCsv()
{
  Serial.print(servo00Angle);
  Serial.print(";");
  Serial.print(servo01Angle);
  Serial.print(";"); 
  Serial.print(servo02Angle);
  Serial.print(";");
  Serial.print(servo03Angle);
  Serial.print(";"); 
  Serial.print(servo04Angle);
  Serial.print(";");
  Serial.print(servo05Angle);
  Serial.print(";"); 
  Serial.print(servo06Angle);
  Serial.print(";");
  Serial.print(servo07Angle);
  Serial.print(";");
  Serial.print(servo08Angle);
  Serial.print(";");
  Serial.print(servo09Angle);
  Serial.print(";"); 
  Serial.print(servo10Angle);
  Serial.print(";");
  Serial.println(servo11Angle);
}

Votings für Mario

30.01.2011 09:29:00 | Lars Keller

Mein  guter Freund Mario Meir-Huber hat mich gebeten für seinen Vortrag und den Vortrag von Andreas Aschauer bei der MIX 2011 zu voten. Wer Ihm ebenfalls helfen möchte, klickt diese Links:

Mario Meir-Huber- “What every Web Developer needs to know about Cloud Computing. Building your Web Applications for the Cloud”

http://live.visitmix.com/OpenCall/Vote/Session/112

Andreas Aschauer – “This thing really works - Validating software requirements at the push of a button”

http://live.visitmix.com/OpenCall/Vote/Session/8

 

Was ist die Mix 2011?

Die Microsoft MIX 11 Konferenz in Las Vegas mit 2 Sessions vom Content Board aufgenommen zu werden.
Die MIX Konferenz gehört mit über 3000 Teilnehmern zu den 3 grössten Microsoft Konferenzen (MIX,PDC,TechEd). Sie ist die weltweit grösste Konferenz für die Entwicklung auf der Microsoft Web Plattform und findet von 12-14 April im Mandalay Bay Hotel in Las Vegas,NV statt.

“MIX is a unique opportunity to engage with Microsoft and industry professionals in a two-way conversation
about the future of web - from the diversity of devices and interaction models on the front-end,
to the tools and technologies that power the user experience, to the services that make it all possible.
MIX is for professionals who design and build cutting-edge websites.”

Windows Phone 7: GPS emulator

29.01.2011 10:09:00 | Patric Schouler

In your Windows Phone device you have a built-in Assisted GPS (aGPS), which can be used to access location informations by using the System.Device.Location namespace. The GeoCoordinateWatcher class supplies location data based on latitude and longitude coordinates. This is nice, but if you want to develop such an application it is necessary to emulate the GPS sensor.

In this Windows Phone Team Blog a very good article can be found to achieve this goal.

Webcasts : Scrum mit TFS 2010 und dem MSF für Agile Prozess Template

28.01.2011 14:38:06 | Christian Binder

Das MSF für Agile Development ist eine der vorinstallierten und zur Zeit meist genutzten Prozessvorlagen im Team Foundation Server. Thomas Schissler(MVP) zeigt in drei kurzen Webcasts, wie man mit dem MSF für Agile Development Scrum abbilden kann, obwohl die Terminologie von der Standard Scrum Terminologie abweicht.

Scrum mit dem MSF für Agile Template (Teil 1) - Kurzeinführung in Scrum

Scrum mit dem MSF für Agile Template (Tel 2) - Konfiguration des Teamprojektes

Scrum mit dem MSF für Agile Template (Teil 3) - Planung und Durchführung eines Sprints

Wer Scrum mit dem TFS 2010 nutzen möchte, kann aber auch  die Microsoft Visual Studio Scrum 1.0 Prozessvorlage nutzen, welche die Standard Scrum Terminologie nutzt. Und für Alle, die ein Taskboard für beide Prozessvorlagen vermissen sollten,  ist das AIT Task Board ein Blick wert.

MSDN-Bus Halt bei der .Net Developer Group Ulm

27.01.2011 23:54:56 | Thomas Schissler

image

Wir freuen uns, dass der MSDN-Bus auch bei uns in Blaustein halt macht. Im Rahmen des nächsten Treffens der .Net Developer Group Ulm finden im MSDN-Bus 2 Vorträge zum Thema “Windows Azure” und “Schreiben von sicherem Code” statt. Die Veranstaltung ist öffentlich und alle Mitgleider der .Net Developer Group Ulm sowie Gäste sind herzlich willkommen.

StuxNet… Der neue Wurm

27.01.2011 23:22:00 | Nico Franze

Ich komme soeben von einem Vortrag zu dem Wurm StuxNet, auf dem einige interessante Details genannt wurden. Wer das Thema aufmerksam in den Medien verfolgt hat, wird hier wahrscheinlich nichts neues lesen können, aber ich wollt sowieso endlich mal wieder ein wenig bloggen. Also ist das das ideale Thema.

Stuxnet ist ein Computerwurm, der vor ca. einem Jahr bekannt wurde. Es handelt sich hierbei nicht um einen normalen Wurm, sondern um einen, der ausschließlich Siemens Steueranlagen (z.B. für Atomkraftwerke) infiziert. Und auch nicht alle, nein. nur ganz bestimmte. Nämlich eine im Iran. Aber nun zu den Details.

Hier eine kurze Zusammenfassung. Für mehr Interesse unten eine erweiterte Zusammenfassung.

Kurzzusammenfassung:

Stuxnet ist ein Computerwurm, der mit sehr sehr viel Aufwand entwickelt wurde und interessanter Weise nicht normale Computer angreift, sondern exakt nur eine ganz bestimmte Anlagensteuerung von Siemens. Die Siemens Simatik 7. Aber auch nicht alle, sondern nur die eine, wo ganz bestimmte Seriennummern vorlagen. Diese Anlage steht zufällig im Iran.

Eckdaten (Teilweise Vermutungen)

  • Entwicklungsbeginn 2002 in Israel
  • Entwicklungsende ca. 2007
  • Schadcode greift nur S7 von Siemens an
  • 7 unterschiedliche Verbreitungsmöglichkeiten, um sicherzustellen, dass auch wirklich mindestens eine greift
  • Die Fernsteuerung von Stuxnet wurde deaktiviert
  • Der Entwicklungsaufwand wird auf viele Millionen $ geschätzt
  • Allein eine solche Testumgebung aufzubauen und zu betreiben liegt zwischen 0,5 und 1 Million $
  • Verteilte Management-Infrastrukturen in Dänemark und in Malaysia (Dort standen wohl einige Verbreitungs- und Update-Server)
  • Infektionsrate im Iran, ca. 60%, in USA 0,3 %, in Deutschland noch weniger
  • Großes Gefahrenpotential für die Zukunft, schätzten Diskussionsbeteiligte

Erweiterte Zusammenfassung

Neuartigkeit an diesem Computerwurm:

  • Der Schadcode infiziert ausschließlich eine Siemens Simatik 7 Prozessanlagensteuerung
  • Anhand von technischen Vorgehensweisen und auch einigen öffentlichen Aussagen lässt sich vermuten, dass Stuxnet 2002 in Israel begonnen wurde.
  • Nicht generell alle diese Prozessanlagen werden infiziert.
  • Stuxnet prüft Seriennummern der beteiligten Komponenten
  • 7 Verbreitungsmechanismen
    • USB (Stick einstecken, schon war der Rechner infiziert) (Zero Day Exploit MS10-046)
    • Fileserver (Dateien von einem Fileserver im Explorer anzeigen, schon war der Rechner infiziert)
    • Printserver (Auf einem Printserver drucken, schon war der Rechner infiziert) (Zero Day Exploit MS10-061)
    • Windows RPC
    • Siemens Projektdateien
    • WinCC-Datenbank für S7-Steuerung (Datenbank, in der Simatik 7 Daten speichert. Auf Daten zugreifen und schon war der Rechner infiziert, sofern DB-Server infiziert war)
    • Eigenes Peer-to-Peer-Netzwerk. (Der Virus hat untereinander mit einem eigenen Protokoll kommuniziert, wie weit Infizierung vorangeschritten ist und wo noch Rechner sein könnten und welche Rechte er bisher erreichen konnte)
  • Stuxnet verfügt über Fernsteuerung. Diese wurde abgeschaltet. Entweder vor der Verbreitung, weil man wusste, dass Atomanlagen eh nicht online erreichbar sind, oder im Zuge der Entdeckung von Stuxnet
  • Nach der Infizierung des Kraftwerkes macht Stuxnet erstmal gar nichts und lernt mehrere Wochen lang die Abläufe im Kraftwerk kennen. Nach einer bestimmten Zeit fängt der Wurm an, langsam die Kontrolle zu übernehmen und dem Benutzer das erwartete Verhalten vorzugaukeln, so wie es sich stuxnet Wochen vorher angelernt hat

Aufwand

  • Es wurden insgesamt 2 Softwarezertifikate von Realtek gestohlen (so kann sich der Wurm unbemerkt als Treiber installieren, weil Windows denkt, das is ne gültige Netzwerkkarte)
  • Es musste eine Simatik 7 Testanlage aufgebaut werden, um den Wurm zu testen.
  • Die Parameter der Zielkonfiguration mussten ermittelt werden (Seriennummern der Bauteile im Iran, Arbeitsfrequenzen und Arbeitsweisen) (Hoher Spionageaufwand)
  • Abschluss der Entwicklungen vermutlich 2007
  • Verteilte Management Infrastrukturen in Dänemark und Malaysia (Server)
  • Es wurden insgesamt 4 Zero DayExploits (z.B. MS10-046 und MS10-061) benutzt. Jeder dieser Sicherheitslücken kostet auf dem Schwarzmarkt ca. 250.000 $
  • Infizierungen gab es weltweit. Das Virus wollte so viele PCs wie möglich infizieren (aber ohne Auswirkungen auf PCs), um so möglichst viele Wege in das Zielkraftwerk zu haben. Höchste Infizierungsrate im Iran (mit 60% aller Rechner)

Gefahren

  • Im Code waren wohl 984 Programmierbare Speichereinheiten hinterlegt, die ausfallen sollten, und zufällig sind im Iran 984 Programmierbare Speichereinheiten in einem Kraftwerk ausgefallen
  • Stuxnet greift an, wenn bestimmte Frequenzumrichter mindestens 800 Hz hatten (Ermittlung der Zielkonfiguration im Iran)
  • Eine Gefahr geht wohl von „Social Engineering“ aus. Das bedeutet, durch symphatisches, selbstbewusstes auftreten mit einigen sowieso öffentlich zugänglichen Vorinformationen, von anderen Mitarbeitern in sensible Bereiche eingelassen werden und dort selbstständig handeln zu können.
  • Einige Diskussionsteilnehmer sagten, einfach eines dieser Kraftwerke ausschalten, hätten die Entwickler auch sehr viel günstiger haben können, in dem sie ein paar Bomben auf das Kraftwerk geworfen hätten. Der Hohe Aufwand wurde aber betrieben, um eigentlich keine Aufmerksamkeit zu erregen.
  • Erstes Auftreten von Stuxnet im Jahre 2008 (Virenscannerhersteller bemerkten unerlaubte Zugriffe auf bestimmte Windows-Sicherheitslücken)
  • Erste klare Strukturen vom Ausmaß von Stuxnet wurden 2009 erkannt. In den Medien tauchte Stuxnet 2010 auf.

Ergebnisse der Diskussion nach dem Vortrag (Wie schützt man sich davor)

  • Dinge wie Datenschleusen einbaun
  • Integritätsprüfungen
  • Einige Teilnehmer haben keine Angst und glauben nicht, dass irgendwelche Hacker-Kiddies mal eben Stuxnet nachbaun
  • Andere Teilnehmer glauben, dass sich nun jeder Hobbyhacker auf Stuxnet stürzt, das studiert und dann jeder ein eigenes Stuxnet schreibt und bald kein einziges Kraftwerk mehr auf der Welt funktioniert
  • Mitarbeiter stark gegen social Engineering sensibilisieren
  • Am besten gar nicht erst ein Kraftwerk betreiben
  • Es wird vermutet, dass Firmen wie Microsoft und Siemens mitgeholfen haben, dies wurde aber versucht zu zerstreuen, da z.B. Informationen, wie man eine Programmierbare Speichereinheit der S7 ansteuert, größtenteils von Siemens online zur Verfügung gestellt wird
  • Weiterhin is der Iran sowieso bekloppt, weil er Hightech vom Klassenfeind kauft.
  • Die Anlage sollte auf Windows-Rechnern laufen. Früher waren das extra proprietäre Betriebssysteme, die extra für solche Anlagensteuerungen entwickelt wurden. Diese waren weniger angreifbar
  • Der Iran sagt, alles kein Problem. Angriffe vom verzweifelten Feind konnten leicht und ohne Probleme abgewehrt werden. Das Stuxnet selbst teilweise vorgaukelt, „besiegt“ bzw. entfernt zu sein, interessierte die Iraner aber nich.

Ein sehr spannender Vortrag mit noch spannender Diskussionsrunde.

Fazit:

Ja, natürlich sollte ein Fazit nicht fehlen. Ich persönlich denke, dass hiermit erstmals eine Grenze überschritten wurde. Eine neue Art der Kriegsführung. Stuxnet hat nun dafür gesorgt, dass einige Zentrifugen ausgefallen sind oder andere Systeme nicht mehr oder nicht richtig funktionierten. Allerdings hätten die Entwickler stuxnet auch so entwickeln können, dass das Atomkraftwerk in die Luft fliegt und wir hätten ein zweites Tschernobyl mit unbeschreiblichen weltweiten Folgen. Bei der Diskussion wurde auch ein Beispiel aus der Fertigung angebracht. Wir können heutzutage im µ-Meterbereich fertigen. Wenn wir da auch nur unbemerkt winzige Abweichungen aufgrund eines Computerwurms hätten, so hätten wir am Anfang der Prozesskette große Qualitätsverluste, die sich später auf alle Bereiche wie Automobile, Küchengeräte oder Computerindustrie auswirken könnten. Die Fehlerfindung, ob wir einen Computerwurm haben, der sich gut verstecken kann, oder ob ein Mitarbeiter einfach zur falschen Zeit das Fenster aufgemacht hat und der Luftstoß die Abweichungen verursacht hat, könnten wieder viele Millionen $ bzw. € kosten, die man auch viel lieber in sinnvollere Bereiche investieren könnte. 

Aktuell bezweifle ich, dass Länder wie Iran oder andere Staaten, die teilweise noch im Mittelalter leben, Viren oder Würmer solcher Art entwickeln können. Die arbeiten mit viel primitiveren Waffen. Aber es ist sicherlich auch nur eine Frage der Zeit, bis erste konkrete Anstrengungen unternommen werden, die uns hier in der westlichen Welt, abhängig von vielen Maschinen und Computern, zu schädigen versuchen. (Ich möchte an dieser Stelle aber nicht in eine politische Diskussion abdriften, sowas geschieht schneller als man denkt. :-))


Quellen:

Wie gewünscht einige Quellen des Vortrages.

Symantec W32.Stuxnet Dossier 

http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/w32_stuxnet_dossier.pdf


OECD/IFP Project on "Future Global Shocks 

http://www.oecd.org/dataoecd/3/42/46894657.pdf


Israeli Test on Worm Called Crucial in Iran Nuclear Delay, New York Times

Rezension: Video-Training “WPF 4 und Silverlight 4”

26.01.2011 11:07:00 | Gordon Breuer

Bei video2brain im Addison-Wesley Verlag ist das Video-Training “WPF 4 und Silverlight 4” von Gregor Biswanger, der einigen schon als Autor aus Fachmagzonen wie die dotnetpro oder die visualstudio1 bekannt ist, erschienen. Das Training kostet 49,80 EUR und hat eine Gesamtlaufzeit von rund 13 Stunden, welche sich in 19 Hauptkategorien aufteilen:

  1. Einstieg in WPF
  2. Einstieg in XAML
  3. Einführung zum allgemeinen Layout von WPF-Anwendungen
  4. Überblick der WPF-Steuerelemente
  5. Events, Commands und Multi-Touch
  6. Dependency Properties und Data Binding
  7. DataTemplates, Konvertierung und Validierung
  8. Styles, Trigger, Visual States und Animationen
  9. Ressourcen
  10. WPF Best Practices
  11. Einstieg in Silverlight
  12. Datenzugriffe mit Silverlight
  13. Silverlight-Navigationsanwendung
  14. Silverlight-spezifische Steuerelemente
  15. Business.Features
  16. Silverlight angepasst
  17. Media
  18. Beyound Browser-Features (Out-Of-Browser)
  19. Silverlight Performance – Best Practices

wpf4_silverlight4Die Lernkurve fängt dabei recht niedrig an so dass gerade auch Neulinge auf dem Gebiet der WPF-/Silverlight-Entwicklung das Videotraining als guten Einstieg nutzen können. Vorausgesetzt werden lediglich Kenntnisse in der Programmiersprache C#. Hat man bereits einige Erfahrungen mit WPF und/oder Silverlight gesammelt kann es sich lohnen direkt in die Kapitel zu springen, die einen besonders interessieren. Die video2brain-Oberfläche unterstützt hierbei durch eine saubere Gliederung und Beschreibung der Kapitel. Nach Auswahl eines Kapitels sieht man dann alle Videos mit entsprechender Unterteilung, welche man sowohl einzeln abspielen kann oder auch alle hintereinander. Ein zusätzlicher Punkt “Zusammenfassung” in jedem Kapitel bietet einen schriftlichen und bebilderten Abstrakt über die alle Inhalte. Diese sind als Handout zu verstehen und für einen kurzen Überblick zur Vor- und Nachbereitung durchaus sehr nützlich.

Die multimediale Aufbereitung

Die eigentlichen Videos bestehen zum Teil aus Folien mit kurzen Stichpunkten, zum anderen aus Screencasts der Entwicklungsumgebungen. Die Auflösung der Videos ist durchaus in Ordnung. Auch bei höheren Auflösungen kann man die Schrift noch gut erkennen ohne das sie durch Skalierung zu stark verschwommen wirkt. Der Ton ist durchweg klar und verständlich, Gregor Biswanger kann man während der gesammten Laufzeit gut folgen ohne das man das Gefühl hat er würde lediglich einen fertigen Text vorlesen. Hier kommen ihm sicher auch zahlreiche Vorträge bei Konferenzen und .NET-Usergroups zu Gute. Hin und wieder erinnerte mich die Vortragsweise dabei an die Sendung mit der Maus – was ja nicht unbedingt negativ ist ;-)

Ein wenig unübersichtlich bzw. überladen wirkt bei der gewählten Bildschirmauflösung das Visual Studio 2010. Einige Fenster wie die Toolbox (teilweise) oder der Projektmappen-Explorer müssten meiner Meinung nach nicht ständig geöffnet sein. Auch der Platz, der durch die eingeblendeten Tool-Leisten in Anspruch genommen wird, fehlt eventuell für die Darstellung des Entwurfs- bzw. Code-Fensters. Gerade für Präsentationen würde es sich anbieten, eine separate Darstellung zu verwenden damit der wichtige Bereich während des Videos auch sofort und in voller Größe ersichtlich ist. Hier mag ich aber auch persönlich etwas vorbelastet sein, da ich selber alle Zusatzfenster auf einen zweiten Monitor ausgelagert habe (siehe auch mein Posting “Ordnungsneurotiker oder Messi: Zeigt her eure Layouts!).

Bei der Unterteilung der Kapitel fällt positiv auf, dass man immer auf genau den Teilbereich einzeln zugreifen kann, der einen gerade interessiert. Braucht man beispielsweise noch einmal genauere Informationen zur Nutzungsweise des ProgressBar-Steuerelementes, so muss man nicht erst mühsam in einem langen Video suchen sondern kann direkt zum entsprechenden Kapitel (hier: 4. Überblick der WPF-Steuerelemente) gehen und das passende Video (hier: 4.6 Das ProgressBar-Steuerelement) auswählen. In einer kompakten Videoeinheit wird nun direkt in der Entwicklungsumgebung das entsprechende Control vorgestellt und anhand von Beispielen erläutert. Besonders nützlich an dieser Stelle ist rechts unten der “Mach Mit!-Modus”: Dieser verkleinert das gesamte Programmfenster auf etwa 1/9 der Bildschirmgröße und behält es zusätzlich im Vordergrund. So kann man parallel zum Video die Schritte selber nachverfolgen. Ebenfalls praktisch an der Stelle sind die Lesezeichen, welche einem helfen auch innerhalb der Videos bestimmte Stellen zu markieren.

Zum Inhalt

Das ich nicht auf den Inhalt der Videos im Detail eingehen kann, wird bei der Menge an Informationen schnell klar. Meine eigenen Vorkenntnisse im Bereich der WPF- und Silverlight-Entwicklung waren zu Beginn nicht sehr groß. Das Grundkonzept war mir jedoch bekannt und einige Anwendungen habe ich auch schon selbst geschrieben. Während des Video-Trainings wurde mir dabei immer wieder klar, wie umständlich ich an einigen Stellen bisher doch gearbeitet habe. Vor allem XAML bietet zahlreiche neue Möglichkeiten, die dem Windows Forms Entwickler auf Anhieb gar nicht bewusst sind. Die Möglichkeit hier während dem aktiven Lernen schnell ein Lesezeichen zu setzen und dann später explizit diese Stellen erneut durchzugehen im “Mach mit!”-Modus um sie im eigenen Projekt umzusetzen und zu testen, ist hier spannend und erleichtert das Lernen der neuen Technologie und Möglichkeiten.

Was ich persönlich etwas schade fand ist die Verfügbarkeit der Videos als reine PC-Version. Die Oberfläche von video2brain bietet zwar viele hilfreiche Möglichkeiten, aber die Verwendung von FLV-Dateien, die eine rein numerische Benennung besitzen, macht die Verwendung ohne die Oberfläche sehr mühsam. So wäre es mir gerade für einen ersten Durchgang sehr recht gewesen, die Videos auf meinem großen Fernseher zu schauen während ich parallel auf der Couch mit dem Notebook sitze und hier ggf. einzelne Schritte nachvollziehe. Doch wenn man nicht das Konvertieren in beispielsweise das MPEG- oder WMV-Format per Hand machen möchte, bleibt einem nur zu hoffen das der Fernseher oder DVD-Player Flashvideos abspielen kann. Auch muss dann eine Liste aller Kapitel / Unterkapitel verfügbar sein, um die entsprechend numerierten Videos zu finden. Das mag für viele vielleicht verschmerzbar sein da man die Trainings sowieso am PC ansieht, aber schlußendlich wäre es doch eine sinnvolle und sicher nicht besonders schwer umzusetzende Möglichkeit.

Bonus-Material

Besonders angenehm waren in diesem Zusammenhang die 15 “Zusatzkapitel”, die im 3GP- bzw. MP4-Format vorliegen und auch sauber benannt sind. Diese sind explizit als “Mobile Version” ausgezeichnet. Und auch wenn sie als “iPhone/iPod”-Videos in der “lies_mich.txt” bezeichnet werden, funktioniert die Synchronisation auch problemlos mit dem Windows Phone 7 und Zune ;-)

Auch sehr angenehm ist das beigefügte “Rohmaterial” im gleichnamigen Ordner der DVD. Hier finden sich entsprechend unterteilt in Silverlight und WPF sämtliche Beispieldaten und –projekte aus den Videos um das Nachvollziehen der Trainings am eigenen PC zu erleichtern.

Bonus-DVD: Expression Blend 4

525_expression_blend4Bei der Online-Version meines Rezensions-Exemplares war zusätzlich noch das Video-Training “Expression Blend 4 – Eine Einführung” dabei. In 1¼ Stunden wird hier registrierten Kunden des WPF 4 und Silverlight 4 Trainings dieses Bonus-Training kostenlos zur Verfügung gestellt, in dem abermals Gregor Biswanger eine leicht verständliche Einführung in die alternative Entwicklungsumgebung Expression Blend 4 gibt. Im Gegensatz zum Visual Studio 2010 liegt hier der Schwerpunkt nicht auf der Programmierung sondern auf der Oberflächengestaltung. Auch gibt es Möglichkeiten die Visual Studio nicht bzw. nur eingeschränkt bietet, wie das Prototyping und die Animationserstellung. Ein wenig überrascht war ich, dass nicht nur auf die Prototyping-Funktionalität von Expression Blend mittels SketchFlow eingegangen wird, sondern zumindest kurz auch auf Balsamiq Mockup. Mit diesem Tool habe ich selber schon viel gearbeitet und ziehe es aufgrund seiner Einfachheit oft auch SketchFlow vor.

Die abgedeckten Kapitel des Zusatz-Trainings sind:

  1. Einführung zu Expression Blend 4
  2. Prototyping
  3. Architektur und Daten für Designer
  4. Die Anwendung wird angepasst
  5. Animationen und 3D

Da hier auf einige Besonderheiten eingegangen wird, empfiehlt es sich meiner Meinung nach zunächst das WPF 4 und Silverlight 4 Training durchzugehen und erst im Anschluss die Expression Blend 4 Einführung zu machen. So hat von dem, was innerhalb der Videos technisch geschieht schon genug Verständnis, um seine Aufmerksamkeit vollständig der Art und Weise zu widmen, wie man es schließlich mit Blend 4 umsetzt. Auch ist es hilfreich, wenn man von Themen wie dem Prototyping und dem MVVM-Pattern schon mal etwas gehört hat, da die Videos diese Bereiche sicher nicht komplett abdecken sondern nur deren Umsetzung mittels Blend 4.

Auch zu dieser DVD gibt es wieder das Rohmaterial, was ein schnelles Nachbereiten und Ausprobieren ermöglicht. Auch der eigentliche video2brain Player ist identisch mit all seinen Vorteilen wie Lesezeichen und einfache Bedienung, allerdings auch dem genannten Nachteil der rein im FLV-Format vorliegenden Videos.

Preis versus Leistung

Der Preis von fast 50 Euro für das WPF 4 und Silverlight 4 Training ist noch in Ordnung für das Gebotene, allerdings auch an der Schmerzgrenze von dem was ich mir privat leisten würde. Zusammen mit der Bonus-DVD mit der Expression Blend 4 Einführung relativiert sich das jedoch, da hier ein gutes Gesamtpaket gebunden wird. Für sich alleine genommen ist der Preis für die Blend 4 Einführung mit 19,95 Euro jedoch deutlich zu hoch angesetzt. Sicherlich ist der Aufwand dahinter nicht unbedingt gering, jedoch steht der Preis mit der gebotenen Länge der Videos in keinem Verhältnis. Hier gehört für mich definitiv die “1” vorne weg um darüber ernsthaft nachzudenken.

Wertung

Es ist nicht jedermanns Sache aus Büchern zu lernen und gerade audio-visuell veranlagte Menschen ziehen sicher aus diesem umfangreichen und gut verständlichen Video-Training viele Vorteile bei der Erlernung einer so umfangreichen und gleichzeitig spannenden Technologie. Denn anders als bei einem statischen Buch kann man hier alle Funktionen direkt in Aktion sehen. Gregor Biswanger zeigt hier deutlich, dass er über das notwendige Fachwissen, aber auch die Kompetenz dieses anfängergerecht und interessant zu vermitteln, verfügt. Abzug gibt es von mir lediglich für die rein auf die PC-Nutzung ausgerichtete Präsentation, die das Abspielen auf externen Geräten wie einem Fernseher nur schwer möglich machen.

Alles in allem gibt es für das Video-Training “WPF 4 und Silverlight 4” in Kombination mit dem Bonus-Training “Expression Blend 4” eine klare Kaufempfehlung von mir!

Artikel empfehlen auf .NET-Kicks Deutschland

Windows Identity in Silverlight

26.01.2011 07:16:00 | Thorsten Hans

Um die Windows Identität eines Anwenders an Silverlight weiterzugeben, kann man sich einem recht einfachen Mechanismus bedienen, den InitParameters. Hierzu muss man lediglich in der hostenden Seite den Silverlight-Control-Host erweitern

   1:  <object data="data:application/x-silverlight-2," 
   2:     type="application/x-silverlight-2" 
   3:     width="100%" height="100%">
   4:      <param name="source" value="ClientBin/PassWindowsIdentitySample.xap"/>
   5:      <param name="onError" value="onSilverlightError" />
   6:      <param name="background" value="white" />
   7:      <param name="minRuntimeVersion" value="4.0.50826.0" />
   8:      <param name="autoUpgrade" value="true" />
   9:      <!-- Pass Windows Identity-->
  10:      <param name="Initparams" 
  11:            value="WindowsIdentity=<%=HttpContext.Current.User.Identity.Name %>" />
  12:      <!-- END Pass Windows Identity-->
  13:       <a href="http://go.microsoft.com/fwlink/?LinkID=149156&v=4.0.50826.0" 
  14:            style="text-decoration:none">
  15:         <img src="http://go.microsoft.com/fwlink/?LinkId=161376" 
  16:              alt="Get Microsoft Silverlight" style="border-style:none"/>
  17:       </a>
  18:  </object>

In der eigentlichen Silverlight Anwendung muss dann lediglich der InitParameter innerhalb des ApplicationStartUp Events abgefragt und in einer beliebigen Struktur gespeichert werden:

   1:  private void Application_Startup(object sender, StartupEventArgs e)
   2:  {
   3:      String currentUser = String.Empty;
   4:              
   5:      if(e.InitParams.TryGetValue("WindowsIdentity",out currentUser))
   6:           Settings.Instance.UserName = currentUser;
   7:   
   8:      this.RootVisual = new MainPage();
   9:  }

 

The SharePoint 2010 Way

Platziert man die Silverlight Anwendung im Kontext von SharePoint 2010 so bietet das SharePoint Client Object Model for Silverlight hierbei eine sehr nette alternative Möglichkeit um den aktuell angemeldeten Windows Benutzer in Silverlight zu identifizieren. Hierzu muss man zunächst innerhalb der Silverlight Anwendung die beiden Assemblies

  • Microsoft.SharePoint.Client.Silverlight.dll
  • Microsoft.SharePoint.Client.Silverlight.Runtime.dll

referenzieren. In der entsprechenden Klasse muss natürlich noch der Namespace des Client Object Models - Microsoft.SharePoint.Client - bekannt gemacht werden.

 

   1:  private User currentUser;
   2:  private void Application_Startup(object sender, 
   3:       StartupEventArgs e)
   4:  {
   5:      var context = ClientContext.Current;
   6:      currentUser = context.Web.CurrentUser;
   7:      context.Load(currentUser);
   8:      context.ExecuteQueryAsync(LoadSucceeded, LoadFailed);
   9:      this.RootVisual = new MainPage();
  10:  }
  11:   
  12:  private void LoadSucceeded(object sender, 
  13:       ClientRequestSucceededEventArgs e)
  14:  {
  15:      Settings.Instance.UserName = currentUser.LoginName;
  16:  }
  17:   
  18:  private void LoadFailed(object sender, 
  19:       ClientRequestFailedEventArgs e)
  20:  {
  21:      throw e.Exception;
  22:  }

Wie man sieht, bieten beide Möglichkeiten einfachen Zugriff auf den aktuell angemeldeten Benutzer. Gerade im SharePoint Umfeld ein sehr häufig benötigtes Gut.

 

Technorati-Tags: ,
DotNetKicks-DE Image

Quo vadis, Silverlight?

25.01.2011 22:45:52 | Thorsten Hans

SL_logo_v Neben vielen anderen Bloggern hat auch Golo in einem seiner letzten Posts seine Meinung über die verschiedenen UI Technologien und deren Perspektive veröffentlicht. Gerade im Silverlight Context möchte ich hier kurz meine Gedanken zusammenfassen.

Microsoft hat sich, spätestens mit dem Release von Windows Phone 7, auf sämtlichen technologischen Stacks zukunftssicher positioniert. Obwohl ich meiner Meinung nach in diesem Leserkreis die Technologien nicht aufzählen müsste, mache ich es der Vollständigkeit wegen dennoch:

  • Mobile Geräte
    • Windows Phone 7
  • PaaS
    • Windows Azure
  • SaaS
    • Office 365
  • OnPremise
    • Windows Server mit IIS 7.5
  • Desktop
    • Windows 7

Ich denke die wichtigsten Stacks sollten hiermit abgehandelt sein, falls nicht bitte ich um sachdienliche Hinweise ;)

Schaut man sich die unterschiedlichen Stacks an, so fällt früher oder später auf, dass auf sämtlichen technologischen Gegebenheiten Silverlight supported wird. Wird bei der Anwendungsentwicklung mit Silverlight auf einige Hints geachtet, so lassen sich Anwendungen auch mit geringem Aufwand von einem auf den anderen Stack portieren. So können Anwendungen zum Beispiel ohne viel Aufwand vom Standard Silverlight-Framework auf die Windows Phone Plattform portiert werden.

PaaS, SaaS und OnPremise unterscheiden sich bei Silverlight zum Beispiel gar nicht, was es ISVs ermöglicht mit nur einer Codebase unterschiedliche Märkte zu erreichen, ohne hierbei Änderungen am existierenden Quellcode machen zu müssen.

Einzig die Möglichkeit mit einer Technologie auf sämtlichen Plattformen präsent zu sein, ist meiner Meinung nach Grund genug strategisch bei der UI Entwicklung auf Silverlight zu setzen.

Die Windows Presentation Foundation ist meiner Meinung nach ein Auslaufmodell. Ich möchte die WPF nicht schlechtmachen, ganz im Gegenteil. WPF hat den Weg für XAML basierte Sprachen in der managed Welt geebnet. Lediglich das Offset an Features, welches WPF mehr bietet als Silverlight, wäre noch aufzuarbeiten. An dieser Stelle könnte ich mir eine Bibliothek analog zu den native Extensions for Silverlight vorstellen, die bei Bedarf von Silverlight Anwendungen adaptiert werden kann.

Grob ist dies meine Meinung über Silverlight. Ich würde mich über eure Meinungen freuen.

 

DotNetKicks-DE Image

TFS Baselining : Work Item Tree Copy

25.01.2011 13:33:14 | Christian Binder

Daniel Meixner hat ein Add-on zum Kopieren von Work Item Tree’s geschrieben. Das Tool kann sehr nützlich sein, um Baselines von hierarchischen Work Items
zu erstellen. Wer in seiner Organisation diese Anforderung hat, sollte sich auf jeden Fall das Tool mal anschauen. 

 

 

Download

Webcast : Visual Studio 2010 Feature Builder Power Tool

25.01.2011 13:10:12 | Christian Binder

Neuer Webcast zum Feature Builder Power Tool hier verfügbar.

Mit dem "Visual Studio Feature Builder Power Tool" steht Entwicklern ein komfortables Werkzeug zur Programmierung eigener Visual Studio Extensions zur Verfügung. Der Webcast zeigt exemplarisch die Erstellung einer Feature Extension; dabei werden unterschiedliche Ausbaustufen demonstriert, ausgehend von der reinen Guidance bis hin zur Visual Studio Automation.

Das gezeigte Beispiel, der Check-In Policy Builder, gibt’s hier zum Download.

Viel Spass

Exam 70-523: Upgrade MCPD .NET Framework 3.5 Web Developer to MCPD .NET Framework 4 Web Developer

23.01.2011 20:55:00 | Martin Hey

Letzte Woche war es so weit - ich wollte den MCPD für Web Development mit dem .NET Framework in der Version 3.5 auf den aktuellen Stand bringen. Der kürzeste Weg dafür ist ein Upgrade-Exam und es war mein erstes dieser Art. Ich hatte schon vorher von Kollegen gehört, dass Upgrade-Prüfungen etwas anders ablaufen als normale Prüfungen. Normalerweise hat man ja etwa 40 Fragen, die man beantwortet und hat man mehr als 700 von 1000 Punkten, hat man bestanden. Die Upgrade Prüfung war vom Grundsatz her ähnlich aufgebaut: Es gab 80 Fragen und mit mindestens 700 Punkten hat man bestanden. Problem dabei: Es gibt vier Blöcke zu je 20 Fragen, die einzeln bewertet werden und offenbar zählt das schlechteste Ergebnis dieser Teilbereiche als Gesamtbewertung.

Inhaltlich ging es dabei um die gleichen Themengebiete, die auch eine Rolle spielen, wenn man die zugrundeliegenden MCTS-Prüfungen absolviert - also WCF-Services, AJAX, jQuery, ASP.NET MVC 2. Für mich etwas überraschend war, dass auch ADO.NET noch eine Rolle spielte (Zugriff auf Tabellen mit SqlCommand, SqlDataReader und DataTable). Interessant fand ich, dass im WCF-Block eine MSMQ-Frage kam - hat man damit im Entwickleralltag doch eher weniger Berührungspunkte. Auch wenn man in der 3.5er MCPD-Prüfung schon einmal beweisen musste, dass man sich mit WebForms, Update-Panels, Verschlüsselung, Sicherung der Webanwendung usw. auskennt, so ist das auch hier noch mal ein Thema.

Schade fand ich, dass die MVC Fragen alle noch auf ASP.NET MVC 2 und nicht mit der Razor-Syntax waren und dass auf einige Inhalte gar nicht eingegangen wurde - ich denke hier zum Beispiel an Data Annotations.

Achso - das Ergebnis? Passed.

Die Sache mit der Enumeration

23.01.2011 09:16:02 | Rene Drescher-Hackel

Es kommt vor, dass man bestimmte Entscheidungen zu einzelnen Abläufen in der Softwareentwicklung von festen Parametern abhängig machen muss. Die Schwierigkeit besteht oft darin, welche Wertebereiche man diesen Parametern zu Grunde legen sollte. Es bietet sich an, hier einen numerischen Wert zu wählen, gleich sie schlecht lesbar sind. Wer möchte genau sagen können, was denn der folgende Methodenaufruf bedeuten mag:

MachWasInt

An dieser Stelle wird klar, dass die Lesbarkeit deutlich darunter leidet. Nun könnte wer den Einwand erheben und sagen: dann schreib doch einfach Klartext.

Nachlese zum gestrigen Treffen der .NET Usergroup Dresden

20.01.2011 13:32:00 | Martin Hey

Gestern abend fand das erste Treffen der .NET Usergroup Dresden in diesem Jahr statt und erfreulicherweise waren auch sehr viele Teilnehmer mit dabei. Und das war auch nicht verwunderlich, denn wir hatten ein paar sehr spannende Themen. Sicher waren die beiden Vorträge nur ein kurzer Einblick und es bleibt jetzt für alle die Option, sich selbst auszuprobieren. Um den Einstieg wieder zu finden, nun noch die Slides zu den Vorträgen von Daniel und mir sowie die Weblinks zu den Beispielen, die ich gezeigt hab:

Reactive Framework


Zunächst das Beispiel mit Aufruf eines WebRequests unter Zuhilfenahme der Reactive Extensions:
var webRequest = WebRequest.Create("http://localhost/mysite?output=xml");

var observableRequest = Observable.FromAsyncPattern<WebResponse>(webRequest.BeginGetResponse, webRequest.EndGetResponse);

Observable
.Timeout(observableRequest.Invoke(), TimeSpan.FromMilliseconds(20000))
.ObserveOnDispatcher()
.Subscribe
(
response =>
{
var responseStream = response.GetResponseStream();
var reader = new StreamReader(responseStream, Encoding.UTF8);
var responseText = reader.ReadToEnd();

textBox1.Text = responseText;
},
exception =>
{
textBox1.Text = exception.Message;
}
);


Die beiden anderen Beispiele waren aus dem Web (Asynchrone Funktionsaufrufe, Malen auf einem Canvas) und sind recht schnell nachgestellt.

WebMatrix und Razor


Viel Spaß beim selbst ausprobieren und ich bin gespannt auf Eure Erfahrungen.

Debugging Windows Phone 7 device traffic with Fiddler

18.01.2011 10:43:00 | Patric Schouler

Eric Law on his MSDN blog has detailed a method using Fiddler to watch your phone's data traffic over WiFi (so this won't help with that 3G issue). Primarily this is a great tool for developers to make sure their app is not using excess data in any way but it can also be useful for those who just want to know what's going on.

Debugging Windows Phone 7 device traffic with Fiddler - Fiddler Web Debugger - Site Home - MSDN Blogs

Mach dir dein eigenes Build!

17.01.2011 15:06:00 | Martin Hey

Unter der Überschrift Erstellen Sie Ihren eigenen Build ist in der aktuellen Ausgabe der dotnetpro (02/2011) ein Artikel von mir erschienen, in dem ich an zwei mit Absicht simpel gehaltenen Beispielen die Möglichkeit der Erweiterung des Build-Workflows mit Hilfe eigener Activities zeige.
Deklarative Activities können komplexe Aufgaben gruppieren und ermöglichen so, diese mehrfach zu verwenden ohne den Wartungsaufwand in die Höhe zu treiben; Codeactivities geben die Möglichkeit, den Workflow mit Funktionen auszustatten, die es im Standard nicht gibt.

Schema-Files für TFS Work Item Type Definition

17.01.2011 09:19:00 | Thomas Schissler

Allen Clark hat auf der MSDN Code Gallery Schema Files für die TFS Work Item Type Definition veröffentlicht. Damit bekommt man nun IntelliSense Support und Validierung beim Bearbeiten der XML-Dateien. War kann man über den Process Template Editor der TFS Power Tools ohne direkte XML-Bearbeitung die Work Item Type Definitions über einen grafischen Editor anpassen, jedoch gibt es eine ganze Reihe von Situationen wo das Bearbeiten im XML schneller geht oder einfach nicht zu vermeiden ist. Mit den Schema-Files wird dies nun deutlich angenehmer.

Link zur Code Gallery: http://code.msdn.microsoft.com/TFSchemas

Fehler beim Öffnen der Iteration Backlog.xlsm Datei im TFS

15.01.2011 15:59:43 | Thomas Schissler

Das MSF for Agile Template kommt mit einer vorgefertigten Excel-Datei für ein Interations- bzw. Sprint-Backlog. Diese liegt im SharePoint unter Shared Documents\Iteration 1\Iteration Backlog.xlsm.

image

Beim Öffnen der Datei kam es bei mir alledings zu Fehlern:

---------------------------
Microsoft Excel
---------------------------
TF80076: The data in the work item is not valid or you do not have permissions to modify the data. Please correct the problem and retry.
---------------------------
OK  
---------------------------

und

---------------------------
Microsoft Excel
---------------------------
TF208103: The initialization of the workbook to connect to Team Foundation Server was not successful. The workbook will close. You can try to connect again by re-opening the workbook.

If repeated attempts fail to initialize the workbook and you need to work with the data in the workbook, then you should disable the Team Foundation add-in. For new or other workbooks with lists bound to Team Foundation Server, you will need to re-enable the Team Foundation add-in.
---------------------------
OK  
---------------------------


Das Problem liegt darin, dass ich bei mir die Iterationen umbennant habe und das Dokument damit nun nicht mehr zurecht kommt. Es gibt aber einen relativ einfachen Workaround dafür:

  1. Zunächst muss man dafür sorgen, dass es wieder einer Iteration “\Iteration 1” gibt. Diese kann man entweder temporär anlegen oder eine bestehende umbenennen.
  2. Jetzt lässt sich die Datei ohne Fehler öffnen
  3. Dann wechselt man auf das Sheet “Settings”
  4. Hier wählt man im Bereich Area & Iteration eine gültige Iteration aus, z.B. \ oder eine der anderen gültigen Iterationen.
    Achtung: In der Liste werden nur Iterationen erlaubt die in dem Sheet “Iteration Backlog” in der Spalte “Iteration Path” vorkommen. Evtl. muss zuvor die Query “Team Queries\Iteration 1\Iteration Backlog” angepasst und hier die entsprechende Iteration als Filter eingestellt werden. Dann kann mit dem Refresh-Button auf dem team Tab im Excel die Liste aktualisiert werden.
    image
  5. Danach speichert man die Excel-Datei
  6. Nun kann die temporär angelegte Iteration gelöscht werden oder die Iteration wieder umbenannt werden. Das Excel-Dokument lässt sich nun ohne Fehler öffnen.

Internet Explorer 9

15.01.2011 12:36:00 | Michael Schwarz

Gestern wurde ich gefragt, was ich denn noch so alles beim Internet Explorer 9 ändern würde. Da fällt mir ein, dass ich vor 2 Jahren mal für den Internet Explorer 8 etwas aufgeschrieben hatte.

Das, was ich schon seit Jahren immer wieder wünsche, ist eine Option, die Skriptfehler nur für meine Entwicklungsseiten anzeigt. Dies könnte entweder mittels einer Liste implementiert werden, oder z.B. für localhost und/oder Intranet Seiten gelten. Alternativ könnte man es ja auch mit einem meta Tag machen.

Weiter stimmt mir bestimmt jeder zu, dass sich bei aktuellen Webseiten die URL nach bestimmten Schemata aufbauen. Eine typische Webseite hat z.B. einen Bereich für Neuigkeiten, Produkte, Kontakt und vielleicht noch ein Forum. Die URLs lauten dann oft meinedomain/produkte/sport/tennis, eine andere vielleicht meinedomain/produkte/sport/fussball. Meine Idee ist jetzt, die URL nicht als einen langen Text anzuzeigen, sondern so wie die Pfadanzeige in Windows Vista oder Windows 7.

address_bar

Die einzelnen Ebenen könnte man so schnell wechseln. Der Browser könnte z.B. die Sitemap dafür verwenden.

Ansonsten freue ich mich sehr auf die Release Version des Internet Explorer 9. Bereits die Beta läuft richtig gut, auch wenn immer noch große Webseiten wie eBay anders aussehen.

Willkommen Webmatrix! Web-Entwicklung mit ASP.NET und PHP kostenlos

14.01.2011 17:42:56 | Jan Schenk

Gestern Abend wurde auf dem amerikanischen Community Event Code Mash die finale Version von Webmatrix, dem neuen kostenlosen Webentwicklungswerkzeug von Microsoft vorgestellt.

WebMatrix_bL

Webmatrix umfasst den Webserver IIS Developer Express, das Web-Framework ASP.NET sowie die eingebettete Datenbank SQL Server Compact.

Entwickler können innerhalb von Webmatrix wählen, ob Sie Ihre Webseiten auf mitgelieferten Templates aufbauen oder aber mit Hilfe eines der populären Open-Source-Frameworks starten möchten. Mit WebMatrix lassen sich sowohl ASP.NET- als auch PHP-Anwendungen programmieren, testen und bereitstellen.

Über die bekannte Web-App-Gallery kann direkt aus Webmatrix heraus das passende ASP.NET oder PHP Framework installiert und konfiguriert werden. Dazu zählen unter anderem WordPress, Joomla! oder Drupal sowie DotNetNuke oder BlogEngine.NET auf Basis von ASP.NET.

Microsoft WebMatrix hilft auch dabei, den passenden Web-Host zu finden. In der Web-Hosting-Galerie stehen entsprechende Provider zur Auswahl. Dank integrierter FTP-, FTPS- und WebDeploy-Technologie lassen sich die erstellten Dateien dann sicher und problemlos im Internet publizieren. Hosting-Provider wie die IPX Server GmbH, Quality Hosting GmbH und Strato AG bieten zum Launch spezielle Webmatrix-Hosting-Angebote an.

Die Zeiten von ständigem Hin-und-Her Wechseln zwischen verschiedenen Applikationen zur Erstellung Ihres Webprojekts sind endlich vorbei! Mit Webmatrix erledigen Entwickler alle Aufgaben zentral: Editieren Ihrer Seiten, erstellen, bearbeiten und kontrollieren der Datenbank, optimieren der Seite für Suchmaschinen und Anpassen der Server Einstellungen.

Sollten die Anforderungen steigen, können WebMatrix-Nutzer ihre Projekte problemlos auf Visual Studio übertragen. Ebenso einfach lässt sich auch eine relationale Datenbank einbinden: Per Mausklick können die Daten von SQL Server Compact auf SQL Server migriert werden.

Die finale Version von Microsoft WebMatrix ist in deutscher Sprache verfügbar und steht hier zum kostenlosen Download bereit.

Ist dieser Kommentar SPAM? – Teil 1

14.01.2011 16:32:44 | Klaus Bock

… oder wie bestimme ich die Wahrscheinlichkeit, ob der angegebene Domänenname des Kommentator den Kriterien eines Kommentarspammers entspricht?

Für mich als Person ist es relativ einfach, einen Kommentar unter einem Blogartikel als Spammer zu erkennen. Aber wie bringe ich meine Erkenntnisse und Erfahrungen einem “Stück Software” bei?
Hier betrachte ich einfach die üblichen Verfahren, wie etwa den Vergleich mit bestehenden Listen, als gegeben und bereits erfüllt. Da auf Listen basierende Filter immer nur gegen bereits bekannte Namen und Kriterien filtern können, hinken sie immer hinterher. Genau hier will ich ansetzen.

Ein angenommener Kommentar hat diese Filter bereits passiert und wurde als unbedenklich eingestuft. Jetzt soll, als letzte Instanz vor der Freigabe, ein heuristischer Filter weiterhelfen.
Damit ist nicht die Heuristik gemeint wie sie etwa ein Virenscanner einsetzt, sondern im Sinne der Definition des Wortes:

Heuristik bezeichnet die Kunst, mit begrenztem Wissen und wenig Zeit zu guten Lösungen zu kommen.

Die Grundlage für so einen Filter kann, aus meiner Sicht, nur ein Verfahren ähnlich einer
Mustererkennung sein, welche auf den Domänennamen angewendet wird. Der Inhalt des Kommentars wird bewusst aus der Bewertung ausgenommen, da eine Einbeziehung des Inhalt des Kommentars nur eine zusätzliche Sprachbarriere bedeuten würde.
Aber wie soll das Ergebnis einer solchen Mustererkennung bewertet werden? Wie soll das Vorkommen eines oder mehrerer erkannter Muster in einem Domänennamen betrachtet werden? Die alleinige Tatsache, dass eines oder mehrere Muster erkannt wurden, stellt noch kein zuverlässiges Kriterium dar. Warum?

Durch die Verarbeitung des alleinigen Vorhandensein eines Begriffes in einem Domänennamen, ist eine sehr hohe Fehlerrate praktisch schon vorbestimmt. Hier ein kleines Beispiel.
Gegeben sind die Begriffe pay, day und loan als Spam-Begriffe. Überprüft soll eine angenommene Domäne paydayloans.org werden. Es werden alle drei Spam-Begriffe erkannt und die Domäne wird als Spam eingestuft. Soweit ist das auch richtig.
Jetzt überprüfen wir einmal eine angenommene Domäne idontlikepaydayloans.com. Diese würde ebenfalls als Spam eingestuft, da auch hier alle drei Spam-Begriffe gefunden werden. Das Ergebnis wäre in diesem Fall aber falsch, da sie mit diesem Namen mit Sicherheit keine Vergabe von Darlehen bewirbt. Nur wie soll diese Aussage bewiesen werden?

Genau solche Probleme werden in der Stochastik behandelt. Genaugenommen in deren Teilgebiet, der Wahrscheinlichkeitstheorie.
Um überhaupt die Wahrscheinlichkeit des Eintretens eines Ereignis, in diesem Fall Domäne-ist-Spammer, berechnen zu können, müssen einige Bedingungen oder Vorgaben, die Axiome, erfüllt sein. Laut den Komolgorow Axiomen wären folgende Vorgaben zu erfüllen:

  1. Für jedes Ereignis A aus dem Ereignisraum ist die Wahrscheinlichkeit P(A) eine reelle Zahl zwischen einschließlich 0 und 1.
  2. Das sichere Ereignis hat die Wahrscheinlichkeit 1.
  3. Die Wahrscheinlichkeit einer Vereinigung abzählbar vieler inkompatibler Ereignisse entspricht der Summe der Wahrscheinlichkeiten der einzelnen Ereignisse.

Als mögliche Ereignisse sind nur Domäne ist Spam oder Domäne ist kein Spam, also Ham, zu erwarten. Wobei das Ereignis Domäne ist Ham das Gegenereignis von Domäne ist Spam darstellt, denn ein Domänenname kann entweder als Spam oder Ham eingestuft werden, nicht aber als beides.

Demzufolge ergibt sich eine Ereignismenge bestehend aus Spam und Ham:

clip_image002

Es gibt nur die beiden Elementarereignisse Spam und Ham. Beide Ereignisse können mit gleicher Wahrscheinlichkeit eintreten. Die beiden Ereignisse sind inkompatibel, d.h. wenn das eine Eintritt, kann das andere nicht eintreten. Damit ist die Voraussetzung für das dritten Axiom erfüllt und es gilt:

clip_image002[10]

Als Ansatz für die Berechnung des Wahrscheinlichkeitsmaßes zur Bewertung eines Domänennamen, wähle ich die Dichte der erkannten Muster im Domänennamen.
Oder anders ausgedrückt:
Ich stelle die Anzahl an Buchstaben aus Spam-Begriffen in einem Domänennamen der Anzahl der Buchstaben des Domänennamens gegenüber.
Ich wage hier die These aufzustellen:

Die Wahrscheinlichkeit, dass ein Domänennamen das Kriterium eines Kommentarspammers entspricht, steigt mit der Anzahl der vorkommenden Spam-Begriffe im Domänennamen.

Oder als Formel dargestellt:

Spam-Formel

Da die Summe der Buchstaben aus den erkannten Spam-Begriffen nie die Anzahl der Buchstaben des Domänennamen überschreiten kann wird sichergestellt, dass der Wert der Wahrscheinlichkeit immer zwischen einschließlich 0 und 1 liegt. Somit betrachte ich auch die Vorgabe des ersten Axioms als erfüllt.

Sehen wir uns auf Basis der Spam-Formel die oben genannten Beispiele noch einmal an und setzen die entsprechenden Werte ein:
Die drei Spam-Begriffe pay, day und loan gegenüber dem Domänennamen paydayloans.

erstes Beispiel

Der Wert von 0.91, oder 91%, bestätigt die erste Aussage, diese Domäne würde wahrscheinlich richtig als Spam eingestuft.

Betrachten wir jetzt das zweite Beispiel mit idontlikepaydayloans als Domänennamen. Dieser Name suggeriert auf den ersten Blick, er habe nichts mit dem Bewerben von Anleihen zu tun.

zweites Beispiel

Wenn das bloße Vorhandensein von Spam-Begriffen gewertet würde, wäre die Domäne als Spam eingestuft worden. Dem gegenübergestellt die nur 50% Wahrscheinlichkeit aus obiger Gleichung, gibt dem ersten Eindruck Recht oder stellt zumindest die Einstufung als Spam in Frage.

Nachdem die Gleichung steht, werfen wir nun einen Blick auf die Implementierung der algorithmischen Lösung.
Diese Lösung ist nicht weiter kompliziert. Es muss lediglich der Inhalt eines Wörterbuches mit dem Domänennamen verglichen werden. Wird ein Treffer erzielt, summiert sich die Anzahl der Buchstaben des gefundenen Spam-Begriffs auf die Gesamtzahl der bereits gefundenen Begriffe auf. Zum Vermeiden von überlappenden Treffern, wird der jeweilig gefundene Begriff aus dem Domänennamen entfernt. Dieser Vorgang wird solange wiederholt, bis das Wörterbuch abgearbeitet ist.
Um von Anfang an ein günstiges Laufzeitverhalten zu gewährleisten, habe ich mich für den Aufbau eines kategorisiertes Wörterbuch entschieden. Darin werden geläufige Spam-Begriffe als Schlüsselwörter hinterlegt. Unter jedem Schlüsselwort ist eine Liste von weiteren Folgewörtern vorhanden. Diese Liste wird erst verarbeitet, wenn das übergeordnete Schlüsselwort im Domänennamen erkannt wird. Nach dem eine Liste abgearbeitet wurde, wird der Algorithmus beendet und ein Ergebnis zurückgegeben. Daraus ergibt sich im ungünstigsten Fall ein Laufzeitverhalten von: O(NKeywords + NSubwords), wie man sehr schön in folgendem Flussdiagramm erkennen kann.

Algorithmus Flussdiagramm

Ich fasse an dieser Stelle noch einmal zusammen.
Die aufgestellte These lautete:
Die Wahrscheinlichkeit, dass ein Domänennamen das Kriterium eines Kommentarspammers entspricht, steigt mit der Anzahl der vorkommenden Spam-Begriffe im Domänennamen.

Die Frage lautet demnach: Wie hoch ist die Wahrscheinlichkeit, dass es sich bei einem Domänennamen um einen Spammer handelt, wenn die Dichte der Spam-Begriffe in diesem Domänennamen hoch genug ist?

Bis jetzt ist lediglich ein Wert ermittelt, der etwas über die Dichte der Spam-Begriffe in einem angegebenem Domänennamen aussagt. Was noch fehlt ist eine Aussage, wie hoch die Wahrscheinlichkeit ist, ob es sich bei dem Domänennamen um einen Spammer handelt.
Gesucht ist also die bedingte Wahrscheinlichkeit des Eintretens Domänennamen ist Spam, wenn das Ereignis Spam-Begriffe im Domänennamen erfüllt ist.
Probleme wie diese lassen sich bestens mit dem Bayestheorem lösen. Sehen wir uns das Theorem einmal an und übertragen die Problemstellung.
Die Formel lautet:

Bayes-Formel

Hierbei bedeuten:

  • P(A|B) Die Wahrscheinlichkeit für das Ereignis A wenn B bereits erfüllt ist.
  • P(B|A) Die Wahrscheinlichkeit für ein Ereignis B unter der Bedingung, dass A bereits eingetreten ist. Dabei haben die beiden Ereignisse A und B nichts mit den vorherigen Ereignissen aus P(A|B) zu tun sondern stellen eigene Ereignisse dar.
  • P(A) Die A-priory-Wahrscheinlichkeit für das Ereignis A aus P(A|B).
  • P(B) Die A-priory-Wahrscheinlichkeit für das Ereignis B aus P(A|B)

Da P(B) unbekannt ist, kann diese Größe aus den bekannten Größen abgeleitet werden.
Der wichtigste Punkt hierbei lautet:
Wir haben nur zwei inkompatible Ereignisse. So ist ein Ereignis das Komplement des jeweils anderen. Aus diesem Punkt lässt sich P(B) wie folgt umformen:

P(B)-Umformung

Nach der Umformung von P(B) sieht die gesamte Formel folgendermaßen aus:

umgeformtes Bayestheorem

Darin steht Ac für das Komplement von A. Durch das dritte Axiom kann hier auch geschrieben werden:
Ac = 1 – A und P(B|Ac) = 1 – P(B|A)

Bevor jetzt das Theorem auf die bis jetzt bekannten Werte angewendet wird, möchte ich noch etwas zur A-priory-Wahrscheinlichkeit für das Ereignis A anmerken.
Wie schon aus dem verlinkten Artikel ersichtlich, wird mit dieser Größe die Ursprungswahrscheinlichkeit des Ereignis A, also die Domäne ist Spam, beeinflusst. Für eine unvoreingenommene Bewertung würde diese Größe mit dem Wert 1/2 also 0.5 belegt werden, da die Wahrscheinlichkeit ob Spam oder Ham eintritt ursprünglich gleich ist.
Sollte sich im Laufe der Zeit eine Aussage über die Trefferquote des Filters treffen lassen, so könnte sich diese als Wert auf die Ursprungswahrscheinlichkeit auswirken und diese höher oder niedriger werden lassen.
Es dürfen durchaus auch andere Erkenntnisse des Filters auf diesen Wert angewendet werden. Diese angewandten Erkenntnisse müssen aus dem System selbst, also hier dem Filter der auf dem Theorem basiert, gewonnen worden sein. Aber dazu später mehr.

Wenden wir jetzt das Theorem auf das erste Beispiel mit 10 Buchstaben aus Spam-Begriffen im Domänennamen an.
Die Frage war: Wie wahrscheinlich besteht der Domänenname aus Spam-Begriffen? Als Ergebnis wurde 0.91 ermittelt. Somit setzen wir den Wert in die Gleichung für P(B|A) ein.
Für P(A) setzen wir, wie vorher begründet, 0.5 ein. Nun sieht die Gleichung wie folgt aus:

Erstes Beispiel mit P(A) 0.5

Der Wahrscheinlichkeit des Eintretens des Ereignisses Domäne ist Spam ist genau so groß wie das ermittelte Verhältnis der Anzahl der Spam-Begriffe zur Anzahl der Buchstaben des Domänennamen.

Nehmen wir nun an, das Schlüsselwort der Spam-Begriffe würde schon öfter in einem Domänennamen gefunden und deshalb als erfolgreich eingestuft. Dadurch wurde die Ursprungswahrscheinlichkeit für dieses Schlüsselwort auf 0,7 erhöht. Wenden wir das Theorem nun auf den neuen Wert an:

Erstes Beispiel mit P(A) 0.7

Wie erwartet, verschiebt sich die Bewertung mehr in Richtung Einstufung als Spam. Betrachten wir jetzt einmal das zweite Beispiel mit 10 Buchstaben aus Spam-Begriffen gegenüber 20 Buchstaben des Domänennamen mit dem Ergebnis 0.5. Gegeben sei wieder die Ursprungswahrscheinlichkeit des Schlüsselwort mit 0.7:

Zweites Beispiel mit P(A) 0.7

Wie man aus dem zweiten Beispiel ersehen kann, neigt ein Filter der auf dieser Formel basiert sehr stark dazu, die Domänennamen in Richtung Spam zu bewerten. Die Unschuldsvermutung greift also erst bei Domänennamen mit einer sehr geringen Dichte an Spam-Begriffen.
Man könnte jetzt argumentieren: Die Spam-Begriffe kommen aus einem Wörterbuch welches wirklich nur mit Wörtern gefüllt ist, die überwiegend in Domänennamen auftreten welche auch tatsächlich zum spammen von Kommentaren neigen. Also kann die A-priory-Wahrscheinlichkeit auch hoch genug gewählt werden.
Dem möchte ich die oppositionellen Namen, wie etwa aus dem zweiten Beispiel, entgegen halten. Diese Namenskombinationen würden alle sehr stark in Richtung Spam bewertet werden. Eine unverhältnismäßig hohe falsch-positiv Erkennung wäre die logische Folge.

Einen Ausweg aus dem Dilemma könnte die Verwendung der Wahrscheinlichkeit Domänenname ist Spam-Begriff P(B|A) als A-priory-Wahrscheinlichkeit sein. Ich erhoffe mir dadurch eine deutliche Verschiebung der Wahrscheinlichkeit oberhalb von 0.5 in Richtung Spam und unterhalb in Richtung Ham. Die Werte mit exakt 0.5 sind nicht betroffen, da bei einer Verwendung von 0.5 als A-priory-Wahrscheinlichkeit keine Änderung der Domänenname ist Spam-Begriff Wahrscheinlichkeit P(B|A) eintritt.
Die korrigierte Formel sieht also folgendermaßen aus:

Formel mit P(BA) als P(A)

oder in gekürzter Form:

gekürzte Formel mit P(BA) als P(A)

Setzen wir jetzt den Wert 0.91 aus dem ersten Beispiel ein:

Erstes Beispiel in gekürzter Formel

Wie erwartet tritt eine starke Verschiebung in Richtung Spam auf.
Setzen wir jetzt eine angenommene Domänenname ist Spam-Begriff Wahrscheinlichkeit
P(B|A) von 0.4 in die Formel ein:

P(BA) 0.4 in gekürzter Formel

Auch hier tritt die erwartete Verschiebung, diesmal in Richtung Ham, auf.
Durch diese neue Formel neigt der verwendende Filter dazu, bewertete Ergebnisse etwas weiter in die ursprüngliche Richtung zu verschieben und ermöglicht dadurch eine deutlichere Unterscheidung der Ergebnisse.

Ich sehe in der Verwendung der Domänenname ist Spam-Begriff Wahrscheinlichkeit P(B|A) als A-priory-Wahrscheinlichkeit keinen Wiederspruch in der Definition der A-priory-Wahrscheinlichkeit. Ich betrachte diesen Weg als die Anwendung des Prinzips der maximalen Entropie. Dieses erlaubt bereits vorhandenes Wissen über ein System in der A-priory-Wahrscheinlichkeit auszudrücken. Ich betrachte die ermittelte Domänennamen ist Spam-Begriff Wahrscheinlichkeit P(B|A) als vorhandenes Wissen über den Zustand, denn dieser Wert drückt bereits eine Tendenz in eine Richtung aus und erfordert kein zusätzliches Wissen über das System.

Nun ist ein Wert ermittelt, der zwar die Wahrscheinlichkeit mit der es sich um einen Kommentar-Spammer handelt angibt, es ist jedoch noch keine gesicherte Aussage getroffen.
Diese Entscheidung wird in der Regel mit einem Schwellenwert getroffen, der die Trennung zwischen Spam und Ham vornimmt. Doch wo ist die Grenze zu ziehen, bzw. wie hoch ist dieser Wert zu setzen?
Dieses Thema werde ich in einem folgenden Artikel behandeln.

Fazit:

Da heutzutage, dank der SEO-Bemühungen der Seitenbetreiber Keyworddomains zu verwenden, meist der Name einer Webseite schon sehr viel über deren Inhalt aussagt, lässt sich auch ohne Kenntnis der eigentlichen Seite eine gute Vorhersage treffen, wie sicher es sich bei der angegebenen Webseite in einem Blog-Kommentar um einen Spammer handelt. Der eigentliche Inhalt des Kommentars kann hierbei völlig außer Acht gelassen werden.
Natürlich bleibt bei diesem Ansatz noch genügend Raum für Fehler. Ich gebe hier aber zu bedenken, dass ich schon eingangs diesen Ansatz als zusätzlichen Filter vorschlug, der als heuristischer Filter nach einem Regelwerk angesetzt werden sollte.

Technorati-Tags: | |

Beherrsche die Maschine und gewinn eine Reise nach Las Vegas

14.01.2011 11:18:07 | Christian Binder

An alle Windows 7 Maschinisten und clip_image001solche die es werden wollen. Gewinn eine unvergessliche Reise nach Las Vegas.

Dein Auftrag

Du bist der Maschinist und nur du kennst die Maschine wirklich. Welche Funktion suchst du in deinem System vergeblich? Die Mäusejagd, das Schneetreiben oder etwas ganz Anderes? Stell dich der Herausforderung und baue deine eigene verrückte Wunsch-Anwendung. Dabei sollte mindestens eine der vielen neuen Windows 7 Funktionen verwendet werden. Lade dir dein Werkzeug kostenlos herunter und zeig wie kreativ du bist. Wie dein Windows 7 aussehen soll – das kannst du jetzt selbst bestimmen.

Die Anforderungen:

  • Programmiert für Windows 7
  • Verwendung einer Version von Visual Studio 2010
  • .NET Framework oder Visual C++ basierend
  • Verwendung von Windows 7 Funktionen
  • Möglichst wenig Zeilen (gibt Pluspunkte)
  • Sämtliche Bestandteile (Bibliotheken, Bilder, etc.) müssen mit eingereicht werden
  • Der Teilnehmer muss die Software selber erstellt haben und sämtliche Rechte an allen eingebundenen Bestandteilen besitzen.

Dein Lohn

Wir wissen wie viel Sorgfalt und Herzblut in so einem kurzen Code stecken kann, deshalb möchten wir deinen Einsatz entsprechend belohnen. Den drei Gewinnern mit den kreativsten Desktop-Anwendungen schenken wir die perfekte Auszeit. Mit diesen Hauptpreisen können alle hart arbeitenden Maschinisten richtig abschalten:

Die Hauptgewinne der ersten drei Plätze sind je ein:

Großer Las Vegas Gambling-Trip mit Besuch der MIX und Helikopterflug.

Dieser Trip besteht aus:

  • Flug nach Las Vegas inkl. Flughafentransfer per Limousine
  • Besuch der MIX 2011, der Microsoft-Konferenz für Web-Entwickler
  • 6 Übernachtungen im Mandalay Bay Hotel
  • 300 US$ in Gambling Chips zum Verzocken
  • Helikopterflug zum Grand Canyon inkl. Transfer

Unsere Jury prüft alle eingehenden Applikationen ausführlich und stellt die besten Arbeiten online vor. Anschließend geben sie die Gewinner der drei Hauptpreise sowie die der anderen tollen Gewinne bekannt.

  1. Preis: Großer Las Vegas Gambling-Trip mit Besuch der MIX und Helikopterflug.
  2. Preis: Großer Las Vegas Gambling-Trip mit Besuch der MIX und Helikopterflug.
  3. Preis: Großer Las Vegas Gambling-Trip mit Besuch der MIX und Helikopterflug.
  4. Preis: 40‘‘ Sony LCD Flatscreen TV KDL-40NX715 bietet Full HD und 3D im brillianten Design, dazu bekommst du das Sony Sound System mit 3D-fähigem BluRay BDV-IZ1000W
  5. Preis: Xbox mit Kinect, 1x Controller sowie den 3 Spielen Kinect Adventures, Kinect Sports und Dance Central
  6. Preis: Windows Phone7 (LG Optimus 7)
  7. Preis: Paket mit Maus, Tastatur und Headset

Unsere Jury prüft alle eingehenden Applikationen ausführlich und stellt die besten Arbeiten online vor. Anschließend geben sie die Gewinner der drei Hauptpreise sowie die der anderen tollen Gewinne bekannt.

Deine Werkbank

Wir haben dir deine Werkbank schon eingerichtet – jetzt heißt es nur noch: downloaden, in die Hände spucken und sofort loslegen. Auf der kostenfreien Werkbank findest du das Codeplex Projekt Windows 7 To Go mit über 60 Beispielen zu Funktionen von Windows 7, Internet Explorer und Silverlight. Nutze die Sourcecodes und Bibliotheken um einzelne Funktionen direkt in deine Anwendung einzubauen. Hier findest du alle Werkzeuge, die du brauchst – ganz einfach und kostenlos zum Downloaden.

Werkbank downloaden

Visual Studio Express downloaden

Windows API Code Pack downloaden

Loslegen.

Dein Werkstück

Deine Arbeit sollte aus möglichst wenigen Zeilen Code bestehen – denn kurze Codes bekommen eine höhere Chance zu gewinnen. Darüber hinaus muss deine Desktop Anwendung folgende Merkmale aufweisen:

Programmiert für Windows 7

  • Verwendung einer Version von Visual Studio 2010
  • .NET Framework oder Visual C++ basierend
  • Verwendung von Windows 7 Funktionen
  • Möglichst wenig Zeilen (gibt Pluspunkte)
  • Sämtliche Bestandteile (Bibliotheken, Bilder, etc.) müssen mit eingereicht werden
  • Der Teilnehmer muss die Software selber erstellt haben und sämtliche Rechte an allen eingebundenen Bestandteilen besitzen.

Wir wünschen dir viel Spaß beim Bauen und freuen uns schon auf verrückte Ideen und kreative Arbeiten.

Einsendeschluss

28.02.2011

Weitere Informationen und Teilnahmebedingungen

clip_image002

http://www.windows7.de/maschine

Beherrsche die Maschine und gewinn eine Reise nach Las Vegas

14.01.2011 11:05:55 | Peter Kirchner

An alle Windows 7 Maschinisten und clip_image001solche die es werden wollen. Gewinn eine unvergessliche Reise nach Las Vegas.

Dein Auftrag

Du bist der Maschinist und nur du kennst die Maschine wirklich. Welche Funktion suchst du in deinem System vergeblich? Die Mäusejagd, das Schneetreiben oder etwas ganz Anderes? Stell dich der Herausforderung und baue deine eigene verrückte Wunsch-Anwendung. Dabei sollte mindestens eine der vielen neuen Windows 7 Funktionen verwendet werden. Lade dir dein Werkzeug kostenlos herunter und zeig wie kreativ du bist. Wie dein Windows 7 aussehen soll – das kannst du jetzt selbst bestimmen.

Die Anforderungen:

  • Programmiert für Windows 7
  • Verwendung einer Version von Visual Studio 2010
  • .NET Framework oder Visual C++ basierend
  • Verwendung von Windows 7 Funktionen
  • Möglichst wenig Zeilen (gibt Pluspunkte)
  • Sämtliche Bestandteile (Bibliotheken, Bilder, etc.) müssen mit eingereicht werden
  • Der Teilnehmer muss die Software selber erstellt haben und sämtliche Rechte an allen eingebundenen Bestandteilen besitzen.

Dein Lohn

Wir wissen wie viel Sorgfalt und Herzblut in so einem kurzen Code stecken kann, deshalb möchten wir deinen Einsatz entsprechend belohnen. Den drei Gewinnern mit den kreativsten Desktop-Anwendungen schenken wir die perfekte Auszeit. Mit diesen Hauptpreisen können alle hart arbeitenden Maschinisten richtig abschalten:

Die Hauptgewinne der ersten drei Plätze sind je ein:

Großer Las Vegas Gambling-Trip mit Besuch der MIX und Helikopterflug.

Dieser Trip besteht aus:

  • Flug nach Las Vegas inkl. Flughafentransfer per Limousine
  • Besuch der MIX 2011, der Microsoft-Konferenz für Web-Entwickler
  • 6 Übernachtungen im Mandalay Bay Hotel
  • 300 US$ in Gambling Chips zum Verzocken
  • Helikopterflug zum Grand Canyon inkl. Transfer

Unsere Jury prüft alle eingehenden Applikationen ausführlich und stellt die besten Arbeiten online vor. Anschließend geben sie die Gewinner der drei Hauptpreise sowie die der anderen tollen Gewinne bekannt.

  1. Preis: Großer Las Vegas Gambling-Trip mit Besuch der MIX und Helikopterflug.
  2. Preis: Großer Las Vegas Gambling-Trip mit Besuch der MIX und Helikopterflug.
  3. Preis: Großer Las Vegas Gambling-Trip mit Besuch der MIX und Helikopterflug.
  4. Preis: 40‘‘ Sony LCD Flatscreen TV KDL-40NX715 bietet Full HD und 3D im brillianten Design, dazu bekommst du das Sony Sound System mit 3D-fähigem BluRay BDV-IZ1000W
  5. Preis: Xbox mit Kinect, 1x Controller sowie den 3 Spielen Kinect Adventures, Kinect Sports und Dance Central
  6. Preis: Windows Phone7 (LG Optimus 7)
  7. Preis: Paket mit Maus, Tastatur und Headset

Unsere Jury prüft alle eingehenden Applikationen ausführlich und stellt die besten Arbeiten online vor. Anschließend geben sie die Gewinner der drei Hauptpreise sowie die der anderen tollen Gewinne bekannt.

Deine Werkbank

Wir haben dir deine Werkbank schon eingerichtet – jetzt heißt es nur noch: downloaden, in die Hände spucken und sofort loslegen. Auf der kostenfreien Werkbank findest du das Codeplex Projekt Windows 7 To Go mit über 60 Beispielen zu Funktionen von Windows 7, Internet Explorer und Silverlight. Nutze die Sourcecodes und Bibliotheken um einzelne Funktionen direkt in deine Anwendung einzubauen. Hier findest du alle Werkzeuge, die du brauchst – ganz einfach und kostenlos zum Downloaden.

Werkbank downloaden

Visual Studio Express downloaden

Windows API Code Pack downloaden

Loslegen.

Dein Werkstück

Deine Arbeit sollte aus möglichst wenigen Zeilen Code bestehen – denn kurze Codes bekommen eine höhere Chance zu gewinnen. Darüber hinaus muss deine Desktop Anwendung folgende Merkmale aufweisen:

Programmiert für Windows 7

  • Verwendung einer Version von Visual Studio 2010
  • .NET Framework oder Visual C++ basierend
  • Verwendung von Windows 7 Funktionen
  • Möglichst wenig Zeilen (gibt Pluspunkte)
  • Sämtliche Bestandteile (Bibliotheken, Bilder, etc.) müssen mit eingereicht werden
  • Der Teilnehmer muss die Software selber erstellt haben und sämtliche Rechte an allen eingebundenen Bestandteilen besitzen.

Wir wünschen dir viel Spaß beim Bauen und freuen uns schon auf verrückte Ideen und kreative Arbeiten.

Einsendeschluss

28.02.2011

Weitere Informationen und Teilnahmebedingungen

clip_image002

http://www.windows7.de/maschine

Einladung zum Treffen der .NET Usergroup Dresden am 19.01.2011

12.01.2011 21:57:00 | Martin Hey

Die Mitglieder werden die Einladung schon in Ihrem Postfach entdeckt haben. Aber natürlich freuen wir uns auch immer wieder über neue Gesichter. Das erste Treffen der .NET Usergroup Dresden im Jahr 2011 findet am 19.01.2011 statt und es gibt gleich wieder zwei sehr interessante Themen.

Reactive Framework (Martin Hey)
In einer kurzen Einführung zeige ich, was es damit auf sich hat, was das Grundkonzept ist und wie man einen Einsteig findet. Im Anschluss daran geht es ans coden - in ein paar Beispielen erfahren wir dann gemeinsam, ob und wie man seinen Code damit verständlicher, robuster und einfacher lesbar machen kann.

WebMatrix und die Razor-Syntax (Daniel Grund)
Gleich zwei spannende Themengebiete reißt Daniel an. Anlässlich des offiziellen Releases von WebMatrix am 13.01.2011 schauen wir uns gemeinsam an, was es damit auf sich hat. In diesem Zusammenhang gibt es auch einen kleinen Exkurs in die Razor Syntax, die Mitte 2010 das erste Mal vorgestellt wurde.

Eine Anmeldemöglichkeit und nähere Details zum Treffen findet ihr an gewohnter Stelle.

WCF Master Class mit Juval Löwy

12.01.2011 14:52:19 | Christian Binder

 

Am 31 Jan bis 2 Feb gibt Juval Löwy wieder sein WCF Master Class. Unter Anderem auch mit einem Kapitel zum Windows Azure AppFabric Service Bus:
Aus eigner Erfahrung kann ich den Workshop nur empfehlen:

Windows Azure AppFabric Service Bus
  • What is Windows Azure AppFabric
  • Why a service bus
  • The relay bindings
  • Event publishing and subscription
  • Cloud as interceptor
  • Authorisation
  • Buffers
  • Compositions and design patterns
  • Service bus authentication
  • End-to-End security
  • IDesign's service bus host, proxy and helper classes

Mehr Infos hier

Javascript brace matching in Visual Studio 2010

11.01.2011 18:58:00 | Alexander Zeitler

jQuery ist toll. Visual Studio 2010 ist toll. Noch toller ist brace matching für Javascript (und somit jQuery) in Visual Studio 2010 – leider nicht out of the box.

Aber dank dieser Erweiterung kein Problem:

Visual Studio 2010 Javascript Brace Matching

DotNetKicks-DE Image

Den Standard Editierdialog des Sharepoint Servers nutzen

11.01.2011 16:57:00 | Jan Christian Selke

Wer den Sharepoint Editierdialog anzupassen möchte hat Glück, denn dazu gibt es im Internet reichlich Quellen.
Schon etwas anders sieht es allerdings aus, möchte man den 0815-Standarddialog zur Bearbeitung von Listitems benutzen; allerdings den Popup Dialog - nicht den seitenfüllenden. Denn dazu gibt es schon nicht mehr so viel Informationen. Der Fall ist vermutlich so banal, dass er schon wieder exotisch ist...
Dennoch wollte ich vor Kurzem genau das!

Nach einigem Suchen fand ich dann doch schließlich etwas: Jomit'sBlog.

Hier wird beschrieben, was die neue Dialog Plattform ist und wie sie genutzt werden kann am - kurzer Trommelwirbel - Beispiel des Standard Editierdialogs.
Wenn man doch immer so einfach glücklich gemacht werden könnte ;-)

JQuery im Sharepoint Server 2010 für Dummies²

11.01.2011 14:07:00 | Jan Christian Selke

Um JQuery in den Sharepoint Server 2010 einzubinden, gibt es verschiedene Möglichkeiten. Beschrieben wurden diese Möglichkeiten etwa von Jan Tielens, Voyta aber auch Anderen.

Als Anfänger in diesem Thema habe ich mich also Schritt für Schritt an deren Anleitung langgehangelt. Aber letztlich wollte nach dem Deployment in den Sharepoint einfach keine jquery-1.4.1.js Datei in dem Ordner JQuery innerhalb des Layouts Verzeichnis des Sharepoint Servers erscheinen.

Nach einigen Versuchen und etwas Internetrecherche stellte ich fest, dass nur eine Kleinigkeit fehlte damit die JQuery Datei, und damit auch jede andere Javascript Datei, in das /_layouts Verzeichnis verteilt wird. Die Lösung ist ebenso so schlagend wie einfach:

Einen zugeordneten Sharepoint-Ordner “Layouts” im Visual Studio hinzufügen.

AddFolder

In diesen Ordner wird die JQuery Datei aus dem Modulordner verschoben und die elements.xml entsprechend angepasst.

LayoutsFolder

Die CustomAction bleibt unverändert und jetzt wird nach dem Deployment auch der Ordner /JQuery unterhalb des Ordners /Layouts angelegt und die Datei jquery-1.4.1.js dort abgelegt. Warum nicht gleich so?! ;-)

Das neue Projekt der "zwei" - http://www.xmlrepository.ch/

11.01.2011 09:37:00 | Peter Bucher

Golo Roden und meine Wenigkeit haben sich seit langem wieder eine Auszeit aus der stressigen Realität gegönnt.

Dabei kam die Idee auf, eine schon etwas ältere Idee neu anzupacken, zu verfeinern, sodass etwas richtig gutes, brauchbares hinten rauskommt.
Der Name bleibt gleich wie er schon bei der älteren Idee war "XmlRepository". Nur hat sich basierend auf der älteren Idee und deren Eigenheiten "schlank, einfach, praktisch" etwas viel praktischeres und brauchbareres gegeben, als es der frühere Prototyp war.

XmlRepository - das es auf http://www.xmlrepository.ch/ zum Download gibt, ist wie folgt auf der Seite selber kurz umschrieben:

XML-basiertes, threadsicheres Repository für flache .NET-Objekte, welches
        das Dateisystem und In-Memory unterstützt.


Folgend ein bisschen Beispielcode, damit jeder sich ein ungefähres Bild der Anwendung machen kann:

        XmlRepository.DefaultQueryProperty = "Id";
        XmlRepository.DataProvider = new XmlFileProvider("~/App_Data/");

        using(var repository = XmlRepository.GetInstance<Foo>) {
            var foos = repository.LoadAllBy(f => f.Id > 42);
            repository.SaveOnSubmit(new Foo { Id = 27, ... });
            repository.DeleteOnSubmit(f => f.Id == 23);
        }


XmlRepository ist aus unserer Sicht entwickelt und sehr geeignet für:
  • Schnell Prototypen mit simplen Datenstrukturen entwerfen
  • Einfache und schnelle Einbindung einer Datenquelle für Datenstrukturen von einfacher bis mittlerer Komplexität
  • Sehr für Projekte (Web / Client) geeignet, die nicht einen sehr grossen Datenbestand, sowie wenig Schreibende Zugriffe zu verzeichnen hat
  • Sehr effiziente, typsichere und bequeme Alternative für manuelle XML-Anbindung
Auch wenn bei dir, werter Leser, kein Anwendungfall zutreffen mag, kann man von jedem Code lernen. Ob es jetzt sei, wie man etwas nicht macht - oder wie man es auch noch - oder besser - machen könnte.

MHVLib - an efficiency oriented library for AVR microcontrollers

11.01.2011 06:56:00 | Ozgur Aytekin

Whats Implemented
* Digital I/O
* Timers
* Serial (both busy-waiting and asynchronous)
* External Interrupts
* Servo control
* Analogue to digital
* Hardware PWM
* Gamma correction - calculate on the fly, or lookup tables (recommended)
* Fast synchronous serial shifter
* Software H Bridge for driving naked transistors (with PWM support)
* Realtime Clock & event triggering
* Debouncing (detect button presses, as well as held buttons)
* Software PWM Matrix (for passive LED matrices)
* HT1632 based LED matrix displays such as the Sure Electronics DE-DP105 (search for 0832 led matrix on Ebay)
* HD44780 & compatible LCD character displays

http://www.makehackvoid.com/mhvlib

MSBuild und Konvertierung der Projektdateien nach VS2010

11.01.2011 03:07:01 | Jürgen Gutsch

Seit einer ganzen Weile sitze ich schon daran mit MSBuild einen einfachen und parametrisierten Build-Prozess aufzusetzen. Zeitglich wird Continous Integration mit Hudson über MSBuild gefahren.

Nun da allerdings die Projekte zu Visual Studio 2010 konvertiert worden sind, läuft MSBuild (und somit die Continous Integration) nicht mehr durch.

Was wahr passiert?

Ich habe zuerst angenommen, da weiterhin mit .NET 3.5 verwendet werden soll, dass alles wie gehabt laufen könnte. Aber dem War nicht so.

Die Projektdateien konnten nur noch mit der MSBuild 4.0 kompiliert werden. Ich nehme an, folgender Eintrag und einige weitere Änderungen an der Projektdatei sind der Grund dafür:

<Project ToolsVersion="4.0" …

Also schnell ein paar Pfade ändern und es wird MSBuild aus dem Verzeichnis C:\Windows\Microsoft.NET\Framework64\v4.0.30319\ genutzt und alles sollte durchlaufen, oder?

Denkste!

Der Build bricht ab mit folgender Meldung:

error MSB3086: Task could not find "AL.exe" using the SdkToolsPath "" or the registry key "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.0A". Make sure the SdkToolsPath is set and the tool exists in the correct processor specific location under the SdkToolsPath and that the Microsoft Windows SDK is installed [D:\Builds\jobs\Continous Integration Build CC\workspace\SVN\Common\Project\Project.vbproj]

Der Build auf der Entwicklungsmaschine läuft von vornherein, das das SDK mit dem Visual Studio 2010 mit installiert wird. Ich möchte aber auf dem Buildserver nur sehr ungern das Visual Studio haben, installiere ich das neueste SDK 7.1

Zum glück habe nicht nur ich das Problem, sondern auch viele andere:
http://stackoverflow.com/questions/2986440/msbuild-on-teamcity-server-cant-find-al-exe

So wird schnell klar, dass die Installation der SDK alleine nichts bringt, sondern erst das Ausführen folgender Schritte:

  1. Go to "Microsoft Windows SDK v7.1" from the Start menu
  2. Select "Windows SDK 7.1 Command Prompt" and enter
  3. > cd Setup
  4. > WindowsSdkVer -version:v7.1

Aber auch dass ist nicht noch nicht alles.

Der Build läuft nun bis zu folgendem Fehler:

error MSB4019: The imported project "C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" was not found. Confirm that the path in the <Import> declaration is correct, and that the file exists on disk.

Hier fehlen die nötigen Build-Targets, die im angegebenen Verzeichnis gesucht werden. Ich kopiere also die Targets von der Entwicklungsmaschine auf den Build-Server in das entsprechende Verzeichnis – welches noch erstellt werden muss - und schon rennt es :-)

Toll, oder?

Ja, schon toll, aber etwas stört mich dennoch:

  1. Wieso ist MSBuild.exe im Framework enthalten und nicht im SDK?
  2. Wieso benötigt MSBuild das SDK, wenn es im Framework enthalten ist?
  3. Wieso sind die WebApplication-Targets nicht im Framework oder im SDK enthalten, sondern nur im Visual Studio 2010?
  4. Wieso alles für eine einzige Aufgabe in drei verschiedenen, separaten Komponenten verteilt?

IMHO sollten - wenn sich die MSBuild.exe schon im Framework befindet - alle benötigten Komponenten auch dort enthalten sein.

DotNetKicks-DE Image

Schnell, einfach, genial, XmlRepository

11.01.2011 01:03:58 | Thorsten Hans

Ein jeder von uns hat es bestimmt schon mal geschrieben; Sei es zum Mocken, sei es zum Zeitvertreib oder sei es für den Produktiveinsatz; Aber Golo Roden und Peter Bucher haben es nun auch mal released. Die Rede ist vom XmlRepository.

Golo und Peter haben in diesen Tagen auf http://www.XmlRepository.ch eine kleine Bibliothek zur bequemen Datenspeicherung im Xml-Format bereitgestellt. XmlRepository bedarf keiner großen Beschreibung. Der Name der Assembly impliziert eigentlich deren Aufgabengebiet. Daher lasse ich dies einfach aus ;)

Mich persönlich hat es gereizt diese Bibliothek auszuprobieren,weil auch ich an allen Ecken und Enden immer mal wieder “ein” XmlRepository schreibe, sei es zum UnitTesting, sei es zum ablegen und laden bestimmter Daten,… Aber ich wollte nun einfach sehen ob sich unsere Ideen und Interpretationen eines XmlRepositories überschneiden und welchen Ansatz die beiden gewählt haben.

 

Lange Rede kurzer Sinn – XmlRepository mach Spaß daher möchte ich es einfach zeigen xD

Ausgehen moechte ich von einer einfachen Personenklasse, welche durch den Einsatz des XmlRepositories zugreifbar gemacht werden soll.

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public DateTime DateOfBirth { get; set; }
    public bool IsDeveloper { get; set; }
}

 

Zunächst 2 Anweisungen Infrastruktur, die dazu dienen die folgenden XmlRepositories zu konfigurieren

XmlRepository.XmlRepository.DataProvider =  
     new XmlRepository.DataProviders.XmlInMemoryProvider();
XmlRepository.XmlRepository.DefaultQueryProperty = 
     "LastName";

zum einen wird der DataProvider hier auf InMemory festgelegt – alternativ kann noch InFile angegeben werden. Im zweiten und letzten “infrastrukturellen” Schritt wird noch der “Identifier” fürs Repository festgelegt.

 

Und schon kann's auch schon losgehen

Instanz erstellen

repository = 
   XmlRepository.XmlRepository.GetInstance<Person>();

Elemente hinzufügen / aktualisieren / löschen

repository.SaveOnSubmit(person);
repository.DeleteOnSubmit((e)=> e.LastName==entity.LastName);

Ich könnte jetzt natürlich alle Methoden auflisten die der Provider bzw. das IXmlRepository<T> bereitstellt, aber die Methoden sind entweder bereits von IEnumerable<T> bekannt oder so sprechend benannt, dass man nichts mehr großartig dazu sagen muss.

Beispielprojekt

Um mir einfach mal ein Bild von XmlRepository zu machen, habe ich mehrere kleine Beispielprojekte implementiert, eines, den PersonStorage könnt ihr euch hier downloaden und den Code anschauen.

Durch den geschickten Einsatz von Generics kann man den Code rund um XmlRepository auch fließend und sprechend halten, so habe ich zum Beispiel die Klasse Create<T> implementiert, die einen Wrapper um das erstellen von Objekten darstellt; Funktional absolut 0 Nutzen halt einfach noch etwas Syntactic Sugar. #geek

class Create<T>
{
    public static T With(Func<T> with)
    {
        return with.Invoke();
    }
}

Doch warum ist XmlRepository interessant?

Nun eigentlich ist es meiner Meinung nach die spielerische Einfachheit gepaart mit wenigen aber dennoch sehr wichtige Attributen die das Repository ausmachen

  • es ist schnell
  • es ist einfach anzuprogrammieren
  • der Code bleibt lesbar
  • der XmlRepository Code ist lesbar!
  • XmlRepository ist threadsafe!
  • der XmlRepository Code ist getestet
  • XmlRepository lässt euren Code testbar!

Daher werde ich das Projekt der beiden auf jeden Fall weiterhin beobachten und nutzen. Eventuell findet sich mal in naher Zukunft ein kleines WebProjekt welches ich auf XmlRepository aufbauen kann.

 

Hints an die Erfinder

Ich weiss, die Version 1.1 wurde schnell mal so published, dennoch hier mal kurz ein paar Dinge die mir aufgefallen sind:

Namespace und KlassenName XmlRepository finde ich etwas unschön Abhilfe schafft aktuell

using XR = XmlRepository;
//...
//...
this._repository = XR.XmlRepository.GetInstance<Foo>();

 

Zwar bietet die API - dank des Expression-Tree - Parameters  für die Methode DeleteOnSubmit eine variable Schnittstelle, dennoch fände ich es gut wenn es für Delete … (und auch die anderen CRUD Methoden) direkt schon eine Überladung gäbe die direkt auf die DefaultQueryProperty geht. – Oder habe ich da etwas übersehen?

Fazit

XmlRepository ist eine Idee mit potential, vielleicht nicht im Hinsicht auf den Verwirklichungsgrad von Peter und Golo, aber sicherlich kann die Assembly als Beispiel dafür dienen wie einfach und elegant man alltägliche Szenarien lösen kann. Fehlt natürlich nur noch die nächste Evolutionsstufe das JsonRepository. Eventuell mache ich mich mal daran :) Falls Peter und Golo nicht schon dran sind???!!!

 

Technorati-Markierungen: ,,,,
DotNetKicks-DE Image

dotnet Cologne 2011 - Call for Papers

10.01.2011 23:52:13 | Roland Weigelt

Am 6. Mai 2011 findet im MediaPark Köln die dotnet Cologne 2011 statt, die große .NET Community Konferenz in Deutschland. Bereits zum dritten Mal organisieren die .NET User Groups aus Köln und Bonn einen ganzen Tag voll mit Vorträgen rund um .NET.

Damit diese Konferenz von Entwicklern für Entwickler wieder ein solcher Erfolg wie im letzten Jahr wird, suchen wir (Stefan Lange, Albert Weinert und ich) noch Sprecher mit interessanten Vorträgen – von der Einführung in neue Themen bis hin zur Level 400 “Hardcore” Session zu etablierten Technologien.

Wer Interesse hat: Alle Infos zum Call for Papers gibt es hier.

Mission Qualitätssicherung in SharePoint Projekten – Das Gewinnspiel

10.01.2011 21:21:04 | Thorsten Hans

TypeMockIn den letzten Posts:

habe ich über Typemock als MockFramework für SharePoint Projekte geschrieben. Damit auch Ihr Typemock in euren SharePoint 2010 und SharePoint 2007 Projekten nutzen könnt, möchte ich einige Lizenzen hier verlosen.

Wie viel Lizenzen von Typemock Isolator for SharePoint verlost werden, hängt dabei ganz von euch ab. Pro 20 Teilnehmer wird 1 Typemock Isolator for SharePoint Lizenz verlost.

Was müsst ihr tun

Das Gewinnspiel wird in Form einer Blogparade realisiert. Eine Blogparade ist eine einfache Verkettung von Blogartikeln unterschiedlicher Autoren. Dies bedeutet, ihr veröffentlicht einfach auf eurem Blog / eurer Homepage einen Artikel zu meiner Artikelserie “Mission Qualitätssicherung in SharePoint Projekten” und fügt dort einen Trackback – Hyperlink – auf die URL dieses Artikels ein.

Mehr ist nicht zu tun um am Gewinnspiel teilzunehmen. Das Gewinnspiel startet ab sofort und endet am 16.02.2011 um 0:00 Uhr MEZ.

 

Die Verlosung selbst wird am 16.02.2011 stattfinden!

Logischerweise ist wie bei allen Gewinnspielen der Rechtsweg ausgeschlossen. Teilnehmen kann jede natürliche Person. Bei Mehrfachteilnahme wird maximal ein Gewinn pro natürliche Person vergeben. Im Rahmen des Gewinnspiels werden an Typemock folgende Daten von euch übermittelt: Name, Vorname, Emailadresse.

Vielen Dank, an dieser Stelle noch an Typemock, die entsprechend der Beschreibung die Lizenzen zur Verfügung stellen.

Technorati-Markierungen: ,,
DotNetKicks-DE Image

Datenbankrollen eines Benutzers ermitteln

10.01.2011 16:10:00 | Martin Hey

Möchte man ermitteln, welchen Datenbankrollen ein Benutzer angehört, so ist es anfänglich gar nicht so kompliziert. Die relevante Systemsicht ist recht schnell gefunden: sys.database_role_members.
SELECT USER_NAME(role_principal_id)
FROM sys.database_role_members
WHERE member_principal_id = USER_ID('MyUser')

Hierbei gibt es aber zwei Probleme: Zunächst ist die Rolle public nicht enthalten und die Rekursion wird nicht aufgelöst, können doch Datenbankrollen andere Datenbankrollen enthalten. Eine Lösung dafür ist die Verwendung von Common Table Expressions, um die Rekursion aufzulösen. Ausformuliert sieht das in etwa wie folgt aus:
DECLARE @username sysname;
SET @username = 'MyUser';

WITH CTE_Roles (role_principal_id)
AS
(
SELECT role_principal_id
FROM sys.database_role_members
WHERE member_principal_id = USER_ID(@username)
UNION ALL
SELECT dbrm.role_principal_id
FROM sys.database_role_members dbrm
INNER JOIN CTE_Roles CR
ON dbrm.member_principal_id = CR.role_principal_id
)
SELECT USER_NAME(role_principal_id) RoleName
FROM CTE_Roles
UNION ALL
SELECT 'public'
FROM sys.sysusers
WHERE uid = USER_ID(@username)
ORDER BY RoleName;

Aufgelistet werden alle zugeordneten Datenbankrollen unter Beachtung der Schachtelungsmöglichkeit von Rollen sowie die Rolle public.

Wer braucht keine Code Samples?

10.01.2011 15:40:23 | Jens Häupel

Code-Beispiele sind für mich meist mehr wert als eine ausführliche Dokumentation. Nichts gegen Dokumentationen. Im Gegenteil. Wenn diese gut und aussagekräftig sind und natürlich Code Samples enthalten. Leider sind die kleinen Snippets oftmals viel zu kurz und aus dem Zusammenhang gerissen. Dem kann man jetzt etwas entgegen stellen. Für alle, die es noch nicht gesehen haben, Microsoft hat einen All-In-One Code Framework Sample Catalog veröffentlicht mit folgenden Inhalten:

Neuer Artikel: “Silverlight für unterwegs: Entwicklung für Windows Phone 7” + Eine neue Folge von Silverlight-Expertise

10.01.2011 15:13:21 | Gregor Biswanger

dotnet-magazin-logo

In der neuen Ausgabe vom dot.net Magazin gibt es einen neuen Artikel meinerseits:

Silverlight für unterwegs: Entwicklung für Windows Phone 7

Microsoft veröffentlichte das neue Smartphone-Betriebssystem Windows Phone 7, das mehrere Besonderheiten und ein komplett neues Konzept mit sich brachte. Eine der Neuerungen: Die Apps bauen auf Silverlight auf. Somit wird die Entwicklung für Apps um einiges einfacher als bisher. Dieser Artikel bietet eine Übersicht für die ersten Schritte der Windows-Phone-Entwicklung.

 

+

 

Einer neuen Folge von meiner Silverlight-Kolumne “Silverlight-Expertise”:

Silverlight-Expertise - Die Crème de la Crème des Monats 
Die Serie „Silverlight Expertise“ des dot.NET Magazins präsentiert monatlich zwei leckere Top-How-Tos zum Thema Silverlight von Gregor Biswanger (www.dotnet-blog.net), sodass Einsteiger und fortgeschrittene Silverlight-Experten durch geballtes Wissen gesättigt werden. Heute stehen auf der Menükarte „Die AutoCompleteBox“ und „Das Filtern von Daten“. Viel Spaß und einen guten Appetit.

 

Windows_Phone_Logo_Horizont

Neu! Mit dabei ist jeweils ein How-To zum Thema Windows Phone 7. Hier steht auf der Menükarte: “Individueller Splashscreen”.

 

dotnetmagazin-02-2011

 

Zu lesen ist der Artikel und die How-To´s beim dot.net magazin, Ausgabe 02/2011

WCF: Could not find default endpoint element that references contract ‘ICustomerService’ in the ServiceModel client configuration section.

10.01.2011 13:34:00 | Alexander Zeitler

In den WCF-Beispielen von Microsoft wird der WCF-Client meißt so erstellt, dass die Service Reference im gleichen Projekt wie der Aufruf des generierten Service Clients liegt.

Resultat der Aktion: der Client funktioniert problemlos.

Will man hingegen den ServiceClient in eine eigene Assembly auslagern und diese in einem anderen Projekt referenzieren, erhält man unter Umständen folgende Exception:

Could not find default endpoint element that references contract 'ICustomerService' in the ServiceModel client configuration section. This might be because no configuration file was found for your application, or because no endpoint element matching this contract could be found in the client element.

Der Grund hierfür liegt möglichweise in der fehlenden Namespace-Defintion des Service Clients, der standardmäßig nicht mitgeneriert wird.

Abhilfe schafft die Verwendung des namespace-Parameters beim Aufruf von svcutil.exe:

svcutil.exe http://myservices/CustomerService.svc /out:CustomerServiceClient.cs
/n:"http://myservices,MyProject.ServiceClients"

Wichtig ist, dass der WSDL/XML-Namespace (z.B. “http://myservices”) dem Namespace der ServiceContract-Definition (via Attribut) entspricht, da sonst der CLR-Namespace nicht generiert wird.

DotNetKicks-DE Image

MSDN Bus mit Vorträgen on Tour

10.01.2011 13:15:48 | Jens Häupel

Der MSDN on Tour-Bus ist vom 26.01. bis zum 05.03.2011 quer durch Deutschland unterwegs. Der Tour-Bus ist ein rollendes Präsentationsstudio, in dem ein breitgefächertes Vortragsangebot zu aktuellen Entwicklerthemen (zwei parallele oder ein gemeinsamer Vortrag) bereit steht. Der Eintritt ist frei.

Alle weiterführende Informationen: http://www.msdn-on-tour.de

MSDN Bus

System.ServiceModel.FaultException: “The message could not be processed” beim Aufruf eines WCF-Services

10.01.2011 12:45:00 | Alexander Zeitler

Erhält man die folgende Exception beim Aufruf eines WCF-Services:

The message could not be processed. This is most likely because the action 'http://myServices/CustomerService.svc/GetAll' is incorrect or because the message contains an invalid or expired security context token or because there is a mismatch between bindings. The security context token would be invalid if the service aborted the channel due to inactivity. To prevent the service from aborting idle sessions prematurely increase the Receive timeout on the service endpoint's binding.

kann dies daran liegen, dass in der EndPoint-Konfiguration des Services die bindingConfiguration nicht gesetzt ist:

<endpoint 
	address="http://myservices/CustomerService.svc" 
	binding="wsHttpBinding" 
	contract="myservices.ICustomerService" 
	name="WSHttpBinding_ICustomerService" 
	bindingConfiguration="WSHttpBinding_ICustomerService">
DotNetKicks-DE Image

Open XML Dateien aufbauen und verändern (Teil 6)

10.01.2011 12:18:00 | Jens Häupel

Zeichenketten zu bestehenden Dateien hinzufügen

Bisher haben wir uns nur mit dem Neuerzeugen von Arbeitsmappen beschäftigt. Deshalb jetzt noch ein Blick hinter die Kulissen für den Fall, dass die Datei schon existiert.

private void AddSharedStringsToExistingWorksheet(string FName, string sheetName, string cellRef, string sharedString) { using (SpreadsheetDocument xlDoc = SpreadsheetDocument.Open(FName, true)) { // Gibt es einen SharedStringTablePart? // Nein ==> erzeugen // Gibt es das Worksheet? // Nein ==> erzeugen // Gibt es die gesuchte Zeile? // Nein ==> erzeugen // Gibt es die gesuchte Zelle in der Zeile? // Nein ==> erzeugen // String einfügen // Dokument speichern } }

Gibt es einen SharedStringTablePart?

Wir könnten jetzt natürlich wieder mit Inline Strings arbeiten (und es spricht eigentlich nichts dagegen), aber wir wollen streng “by the book” vorgehen die Zeichenketten in die Shared Strings-Tabelle eintragen. Dazu muss zuerst einmal geschaut werden, ob diese überhaupt vorhanden ist. Wenn nicht, muss sie erzeugt werden. GetPartsOfType() liefert eine Sammlung aller gefundenen Parts eines bestimmten Typs. Da es nur einen geben kann, können wir mit der Extension Method FirstOrDefault() die gewünschte Referenz erhalten. First() kann hier nicht verwendet werden, da nur FirstOrDefault() bei leerer Liste null liefert. In dem Fall müssen wir den Part selbst erzeugen.

SharedStringTablePart sstPart = xlDoc.WorkbookPart.GetPartsOfType<SharedStringTablePart>().FirstOrDefault(); if (sstPart == null) sstPart = xlDoc.WorkbookPart.AddNewPart<SharedStringTablePart>();

Gibt es das Worksheet?

Zuerst müssen wir den WorkbookPart holen, da dort die Referenzen auf die Worksheets gehalten werden. Daraus läßt sich über Lambda Functions das Worksheet mit den gesuchten Namen ermitteln oder erzeugen, falls noch nicht vorhanden.

WorkbookPart wbPart = xlDoc.WorkbookPart; Workbook wb = wbPart.Workbook; Sheet sheet = wb.GetFirstChild<Sheets>().Elements<Sheet>() .Where(s => s.Name == sheetName).FirstOrDefault(); WorksheetPart wsPart; Worksheet ws = null; if (sheet == null) // nicht da ==> erzeugen { wsPart = InsertWorksheetPart(wbPart, tbWorksheetName.Text); ws = new Worksheet(new SheetData()); // worksheet.xml erzeugen }

Wenn es schon existiert, könnten wir uns eigentlich zurücklehnen, da wir weiter ober ja schon das Sheet mit den entsprechenden Namen gefunden hatten. Weit gefehlt. Oben wird eine Referenz auf ein Sheet zurückgegeben, wir brauchen aber die Referenz auf das Worksheet. Das ist ein kleiner, aber feiner Unterschied. Über die ID des Sheets können wir den WorksheetPart extrahieren (GetPartById) und von dort kommen wir an das Worksheet.

else // es existiert { string rId = sheet.Id.Value; wsPart = (WorksheetPart)xlDoc.WorkbookPart.GetPartById(rId); ws = wsPart.Worksheet; }

Aus dem Worksheet muss nun noch das Root Element der Tabelle geholt werden - da wir ja vorher nicht wissen können, ob das Worksheet existiert.

SheetData sd = ws.GetFirstChild<SheetData>();

 

Gibt es die gesuchte Zeile?

Eine Excel-Tabelle ist zeilenweise aufgebaut. Unterhalb des SheetData Elements befinden sich die Tabellen-Zeilen im Markup. Also müssen wir die mit dem vorgegebenen Zeilenindex finden oder erzeugen. Die Hilfsfunktion RemoveAllButNumbers ist eine eigene Extension Method, die aus einer Zelladresse (AB123) nur die Zeilenreferenz (123) zurück liefert.

UInt32 rowIndex = (UInt32)cellRef.RemoveAllButNumbers(); Row row = sd.Elements<Row>() .Where(r => r.RowIndex.Value == rowIndex) .FirstOrDefault(); if (row == null) row = CreateNewRow(ref sd, rowIndex);

Gibt es die gesuchte Zelle?

In etwa das Gleiche machen wir mit der Zelle innerhalb der eben gefundenen Zeile.

Cell cell = row.Elements<Cell>() .Where(c => c.CellReference == cellRef) .FirstOrDefault(); if (cell == null) cell = CreateNewCell(ref row, cellRef);

Zellwerte schreiben und speichern

Zum Abschluß wird die Zeichenkette in der Shared Strings-Tabelle gespeichert bzw. - falls dort schon vorhanden - deren Index ermittelt und dieser in die ermittelte oder erzeugte Zelle eingetragen. (Die Routine zum Eintragen des Shared Strings wurde schon in Teil 2 beschrieben.)

cell.DataType = CellValues.SharedString; cell.CellReference = cellRef; cell.CellValue = new CellValue(InsertSharedStringItem(sharedString, sstPart).ToString()); ws.Save(wsPart);

So, wie man sieht, kann man sich auf nichts verlassen ;-) und muss ständig prüfen, ob bestimmte Teile schon vorhanden sind. Es wird in der Praxis wohl weitaus häufiger vorkommen, schon existierende Dateien abfragen oder ändern zu müssen als neue zu erzeugen. Nichtsdestotrotz lohnt sich ein Blick auch hinter diese Kulissen, um die Zusammenhänge zu verstehen. So ein Dateiformat ist verdammt komplex und man wird als Einzelner wohl nie alles verstehen können, was in einer Excel- oder Word-Datei so alles vor sich geht. Das Gute an der Sache ist, das man nie alles braucht, sondern einzelne Teilbereiche relativ gut von anderen abgetrennt sind. So kommt man dann Schritt für Schritt voran.

Das Beispielprojekt kann übrigens hier heruntergeladen werden.

[Fortsetzung folgt]

CSS 3 und Webfonts

09.01.2011 21:06:00 | Martin Hey

Bisher war es immer etwas kompliziert, wollte man bestimmte Schriftarten beim Anwender anzeigen. Hier hatten WPF, Flash und Silverlight klar die Nase vor - konnte man hier doch die Schriftart in der xap-Datei mit ausliefern. In HTML-Seiten stand man vor dem Problem, dass nur die Schriftarten auch korrekt angezeigt werden, die auch auf dem Client-Rechner installiert waren. Klar gab und gibt es hier Workarounds wie Cufon, sIFR oder die Möglichkeit, Bilder zu verwenden. Aber das Gelbe vom Ei ist das nicht - besonders wenn man im öffentlichen Umfeld daran denkt, dass Screenreader damit klarkommen müssen, man mit Strg+F Inhalte auf der Seite finden möchte und so weiter und so fort.

Genau hier kommen Webfonts ins Spiel und sie sind eine spannende Sache. Und Webfonts zu verwenden ist gar nicht so schwer. Basis ist die Deklaration des Webfonts mittels @font-face und verwendet den hier vergebenen Namen dann wie gewohnt als font-family.

CSS:
@font-face {
font-family: 'MyOwnWebFont';
src: url('fonts/mywebfont.woff') format('woff');
src: url('fonts/mywebfont.otf') format('opentype');
}

h1 {
font-family: MyOwnWebFont
}


HTML:
<!DOCTYPE html>
<html>
<head>
<title>CSS 3 WebFonts Test</title>
<link href="site.css" rel="stylesheet" type="text/css">
</head>
<body>
<h1>Überschrift in Webfont</h1>
<p>lorem ipsum</p>
</body>
</html>


Hinter jeder Quelle kann man noch eine Formatinformation mit angeben. So kann der Browser die erste Datei laden, mit deren Format er umgehen kann. Nähere Infos zur @font-face-Rule findet man in der CSS-Spezifikation.

Performance Probleme bei String.IndexOf

08.01.2011 13:38:00 | Timo Rehl

Wir haben herausgefunden, dass es zwischen der Framework Version 2.0 und des FW 4.0 Veränderungen in der String.IndexOf Methode gegeben hat, die starken negativen Einfluss auf die Verarbeitungsgeschwindigkeit haben.

Folgender Codeschnipsel zeigt das Problem, das jeder selbst auch ausführen kann:
    private static void SearchPattern(string strPattern, string strSearchString)
    {
      int startIndex = 0;
      int contentIndex = strSearchString.Length - 1;

      while (startIndex < contentIndex && startIndex != -1)
      {
        startIndex = strSearchString.IndexOf(strPattern, startIndex);
        if (startIndex != -1)
          startIndex = startIndex + strPattern.Length;
      }
    }


Aufgerufen haben wir o.g. Code indem wir zunächst eine Textdatei mit ca. 400 KB in einen String gelesen hatten und nach einem bestimmten Pattern gesucht hatten.


.NET Version=2.0.0.0
.NET Version=4.0.0.0

string.IndexOf(s,i)
string.IndexOf(s,i)
#Iterationen 10
00:00:00.0950380
00:00:11.4375732
#Iterationen 100
00:00:00.9233692
00:01:58.5309650
#Iterationen 1000
00:00:09.1416552
00:20:59.8498171


Es ist deutlich zu erkennen, dass mit der FW Version 4.0 u.U. ein Faktor 14 herauskommt.

Was man per Reflector erkennen kann ist, dass die Methode IndexOf(string,int) an die Methode IndexOf(string,int,StringComparison) mit dem Wert StringComparison.CurrentCulture übergeben wird. Genau hier liegt der Performance Issue. Ruft man explizit mit StringComparison.Ordinal auf, so ergibt sich folgendes Ergebnis:
startIndex = strSearchString.IndexOf(strPattern, startIndex,StringComparison.Ordinal);



.NET Version=2.0.0.0
.NET Version=4.0.0.0

string.IndexOf(s,i,StringComparison.Ordinal)
string.IndexOf(s,i,StringComparison.Ordinal)
#Iterationen 10
00:00:00.0225000
00:00:00.0200000
#Iterationen 100
00:00:00.2380000
00:00:00.2005000
#Iterationen 1000
00:00:02.0960000
00:00:02.0290000

Hier sind also Verschlimmbesserungen in der Kategorie Mehrsprachigkeit eingeflossen.

Das Ganze haben wir bereits Microsoft gemeldet und haben auch kurzfristig einen Fix zum Ausprobieren dafür bekommen. Der Fix hat gegriffen und wird in einen der nächsten .Net FW Updates mit einfließen (wenn nicht bereits erfolgt).

Sollte hier die String.IndexOf Methode in Verarbeitungsgeschwindigkeit-Relevanten Bereichen verwendet werden, so sollte darauf geachtet werden, dass vorsichtshalber das StringComparison.Ordinal (oder ein entsprechener Optionsparameter) hinzugefügt wird.

17.01.11 Treffen der DNUG Braunschweig – SOLID.NET

08.01.2011 03:26:00 | Lars Keller

Die DNUG Braunschweig trifft sich am 17.01.2011 um 19:00 im Restaurant Zucker (Tagungsraum). Uns kommt Alexander Groß aus der DNUG Leipzig mit dem “SOLID.NET” besuchen.

Alexander Groß stellt sein aktuelles Projekt vor und lädt dabei zur Diskussion der Softwaredesignentscheidungen ein. Im Projekt kommen viele Open Source-Frameworks zum Einsatz auf die ganz nach Wunsch des Publikums näher eingegangen wird: AutoMapper, Machine.Specifications, NServiceBus, Castle Windsor, NHibernate, Spark View Engine, Rhino Mocks, Rake, MSDeploy usw.
Weitere Informationen zu SOLID.NET findet ihr: http://tinyurl.com/277j9kj

 

Wie immer ist dieses Event kostenlos und jeder .NET Interessierte ist herzlich willkommen!

Weitere Informationen zur DNUG Braunschweig findest du hier.

Einladung zum Treffen der .NET Usergroup Dresden am 19.01.2011

07.01.2011 16:46:00 | Martin Hey

Die Mitglieder werden die Einladung schon in Ihrem Postfach entdeckt haben. Aber natürlich freuen wir uns auch immer wieder über neue Gesichter. Das erste Treffen der .NET Usergroup Dresden im Jahr 2011 findet am 19.01.2011 statt und es gibt gleich wieder zwei sehr interessante Themen.

Reactive Framework (Martin Hey)
In einer kurzen Einführung zeige ich, was es damit auf sich hat, was das Grundkonzept ist und wie man einen Einsteig findet. Im Anschluss daran geht es ans coden - in ein paar Beispielen erfahren wir dann gemeinsam, ob und wie man seinen Code damit verständlicher, robuster und einfacher lebar machen kann.

Die dritte Dimension - 3D (Peggy Reuter)
3D ist gar nicht so schwer. Neben ein paar theoretischen Grundlagen zeigt uns Peggy an einen praktischen Beispiel, wie man eine kleine 3D-Welt aufbaut und diese mit Objekten, Licht, Perspektive usw. beeinflusst.

Eine Anmeldemöglichkeit und nähere Details zum Treffen findet ihr an gewohnter Stelle.

Mehr Details bei [object XMLHttpRequest] Fehlermeldungen bei jQuery Ajax-Calls erhalten

07.01.2011 11:01:00 | Alexander Zeitler

Das typische jQuery Ajax Call Beispiel sieht so aus:

$.ajax({
	type: "POST",
	url: "/Customer/Add",
	data: "companyName=" + companyName,
	dataType: "html",
	success: function (result) {
		alert("ok");
	},
	error: function (error, response) {
		alert(error);
	}
});

Allerdings erhält man dann, wenn z.B. die resultierende View nicht gefunden wird, eine wenig aussagekräftige Fehlermeldung:

 object XMLHttpRequest

Der Grund hierfür steht in der Fehlermeldung: es handelt sich um ein Objekt vom Typ XMLHttpRequest.

Eine detailiertere Fehlermeldung muss also in einer Property des Objekts stecken.

Ein Blick in die MSDN fördert die Eigenschaft “responseText” (Casing beachten) zu Tage.

Somit sieht unser Ajax-Call jetzt so aus:

$.ajax({
	type: "POST",
	url: "/Customer/Add",
	data: "companyName=" + companyName,
	dataType: "html",
	success: function (result) {
		alert("ok");
	},
	error: function (error, response) {
		alert(error.responseText); // Property statt Objekt verwenden
	}
});

Die Fehlermeldung liefert nun den kompletten HTML-Code der Fehlerseite (von z.B. ASP.NET MVC):

Detailierte Fehlermeldung

DotNetKicks-DE Image

Definition of Done Workitem Control

05.01.2011 00:52:32 | Thomas Schissler

Please click here for an updated Version of this control>

See english version below.

In Scrum ist eine zentrale Frage, wann ist eine User Story erledigt, also done? Dies wird durch die sog. “Definition of Done” festgelegt die sich das Team selbst gibt. Die Definition of Done beschreibt Aspekte die erfüllt sein müssen, damit eine Story als done gelten kann und somit im Review dem Product Owner präsentiert wird. Dies können beispielsweise Testausführung, Code-Reviews oder anderes sein. Genau festzuhalten, welche Punkte der DoD für eine User Story bereits erfüllt sind, ist Zweck des DoD Work Item Controls für den Team Foundation Server.

image

Am Ende des Posts gibt es einen Downloadlink für das Control. Im Folgenden wird kurz erklärt, wie das Control eingerichtet wird. Zuerst müssen wir ein Feld auf dem User Story Workitem Type anlegen.

<FieldDefinition refname="artiso.UserStory.DefinitionOfDoneState" name="Definition
of Done State" type="Integer" />

Danach fügen wir für das Feld ein neues Control ein. Für das Control müssen verschiedene Einstellungen im Bereich CustomControlOptions vorgenommen werden:

  • Zunächst geben wir im Attribut DoneState den Status an, auf den die User Story gesetzt werden soll wenn alle DoD Kriterienj erfüllt sind, also die User Story done ist.
  • Unter ActiveState wird ein Status angegeben auf den die User Story gesetzt wird wenn von den vollständig gesetzten DoD Kriterien wieder eines entfernt wird, also z.B. wenn doch noch Bugs gefunden werden.
  • Unter DoDCriteria werden nun die individuellen Kriterien der DoD angegeben. Jedes Kriterium braucht eine eindeutige ID. Aus den aktivierten Checkboxen wird durch eine 2er Potenz der ID eine Summe gebildet die im Integer-Feld abgelegt werden. Somit mit darauf geachtet werden, dass beim Ändern der ID die Aussage der bestehenden Work Items verändert wird. .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }
<Control FieldName="artiso.UserStory.DefinitionOfDoneState" Type="DefinitionOfDoneControl" Label="Definition
of Done:" LabelPosition="Top"> <CustomControlOptions> <DoneState value="Done" /> <ActiveState value="Implemented" /> <DoDCriteria> <Criterion Text="All
acceptance criteria of PO are fulfilled" ID="1" /> <Criterion Text="Code
Reviews are executed without findings" ID="2" /> <Criterion Text="UI
Reviews are executed without findings" ID="3" /> <Criterion Text="All
Test Cases are executed without findings" ID="4" /> <Criterion Text="Test
Cases are reviewed" ID="5" /> <Criterion Text="No
known bugs for this User Story" ID="6" /> <Criterion Text="All
Issues related to the User Story are closed" ID="7" /> </DoDCriteria> </CustomControlOptions> </Control>
.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }

Nun ist die Userstory einsatzbereit und alle im Team haben einen genauen Überblick, was noch zur Fertigstellung einer Story getan werden muss.

Das Control kann hier heruntergeladen werden.

 

English version

One of the big questions in a Scrum project is, when is a User Story “done”? This is defined by a so called “Definition of Done” which is defined by the team itself. The Definition of Done describes aspects which have to be fulfilled to declare a User Story to be done und so can be presented in the Sprint Review to the Product Owner. These aspects can be test execution, code reviews or other points. To track exactly which aspects of the DoD for a specific User Story is already fulfilled is the purpose of this Work Item Control for Team Foundation Server.

image

You’ll find a link to download the control at the end of this post. Here is described how to configure the control. First we have to define a field on the Work Item Type for the User Story to store the data.

<FieldDefinition refname="artiso.UserStory.DefinitionOfDoneState" name="Definition
of Done State" type="Integer" />

Then we add for the new field a control to the form. For the control we have to do some settings in the CustomControlOptions:

  • First we provide in the attribute DoneState the status to which the User Story will be set after fulfilling all DoD criterias (the Use Story is done)
  • With ActiveState provide a state to which the User Story will be set after for a done User Story we uncheck one of the DoD criteria e.g. when later bugs are found
  • With DoDCriteria you can provide individual criterias for your DoD. Every criteria needs a unique ID. From the checked checkboxes we create a sum with binary operations which will be stored to the integer field. So you should keep in mind that the meaning of your DoD status will be changed if you change the IDs.

<Control FieldName="artiso.UserStory.DefinitionOfDoneState" Type="DefinitionOfDoneControl" Label="Definition
of Done:" LabelPosition="Top"> <CustomControlOptions> <DoneState value="Done" /> <ActiveState value="Implemented" /> <DoDCriteria> <Criterion Text="All
acceptance criteria of PO are fulfilled" ID="1" /> <Criterion Text="Code
Reviews are executed without findings" ID="2" /> <Criterion Text="UI
Reviews are executed without findings" ID="3" /> <Criterion Text="All
Test Cases are executed without findings" ID="4" /> <Criterion Text="Test
Cases are reviewed" ID="5" /> <Criterion Text="No
known bugs for this User Story" ID="6" /> <Criterion Text="All
Issues related to the User Story are closed" ID="7" /> </DoDCriteria> </CustomControlOptions> </Control>

Now the User Story is ready to use and everyone on the team has a good overview what is left to do to finish a Story.

The control can be downloaded here.

Open XML Dateien aufbauen und verändern (Teil 5)

04.01.2011 15:03:17 | Jens Häupel

Stylesheets erzeugen und verwenden

So, ich hoffe, alle hatten ein einigermaßen geruhsames Weihnachtsfest und die Nachwirkungen des Silvesterparty sind überwunden.

Im letzten Teil haben wir bereits die Zusammenhänge aufgezeigt. Jetzt geht es weiter mit der Implementierung der Routine zum Erzeugen des Stylesheets. Wie schon mehrfach erwähnt muss das nicht immer getan werden. Verwendet werden kann auch ein Stylesheet aus einer vorhandenen Excel-Arbeitsmappe, sofern alle gewünschten Formatvorlagen dort definiert wurden.

Grob betrachtet gliedert sich die Routine in 7 Teile:

static class StylesClass { internal static Stylesheet GenerateStylesXml() { Stylesheet ssh = new Stylesheet(); #region +++ Add Number Formats +++ #region +++ Add Font Information +++ #region +++ Add Fill Styles +++ #region +++ Add Border Styles +++ #region +++ Add Cell Style Formats +++ #region +++ Add Cell Formats // Master Formatting Records +++ #region +++ Add Cell Styles +++ return ssh; } }

Zuerst müssen die Zahlenformate definiert werden, die dann in der Zellformatierung und in Formatvorlagen verwendet werden. Darin wird eine ID verwendet, die jedes einzelne Format eindeutig identifiziert. Da Excel schon eingebaute Formate besitzt, müssen wir hinter deren ID starten. Die Werte von 0 bis 164 sind m.W. für interne Formate reserviert. Neben der ID ist der Formatcode erforderlich, den wir aus Excel selbst kennen.

Mit Hilfe der Object Initializer kann der Code verkürzt werden.

#region +++ Add Number Formats +++ uint NumFmtId = 165; NumberingFormats nfs = new NumberingFormats(); NumberingFormat nf1 = new NumberingFormat() { NumberFormatId = NumFmtId++, FormatCode = "0" }; nfs.Append(nf1); NumberingFormat nf2 = new NumberingFormat() { NumberFormatId = NumFmtId++, FormatCode = "#.##0,00 €;[Red]-#.##0,00 €" }; nfs.Append(nf2); NumberingFormat nf3 = new NumberingFormat() { NumberFormatId = NumFmtId++, FormatCode = "0 \"km/h\"" }; nfs.Append(nf3); NumberingFormat nf4 = new NumberingFormat() { NumberFormatId = NumFmtId++, FormatCode = "dd.mm.yyyy" }; nfs.Append(nf4); NumberingFormat nf5 = new NumberingFormat() { NumberFormatId = NumFmtId, FormatCode = "dddd, dd. mmmm yyyy" }; nfs.Append(nf5); nfs.Count = (uint)nfs.ChildElements.Count; ssh.Append(nfs); #endregion

 

Nun folgen die Font-Informationen. Da Fonts per Index referenziert werden, ist keine ID nötig. Wenn allerdings derselbe Font zusätzlich jeweils mit dem Schnitt kursiv bzw. fett benötigt wird, so sind 3 verschiedene Font-Einträge erforderlich.

#region +++ Add Font Information +++ Fonts fts = new Fonts(); Font ft = new Font() { FontName = new FontName() { Val = "Calibri" }, FontSize = new FontSize() { Val = 11D } }; fts.Append(ft); ft = new Font() { FontName = new FontName() { Val = "Aharoni" }, FontSize = new FontSize() { Val = 18D } }; fts.Append(ft); ft = new Font() { FontName = new FontName() { Val = "Bradley Hand ITC" }, FontSize = new FontSize() { Val = 20D }, Bold = new Bold() }; fts.Append(ft); ft = new Font() { FontName = new FontName() { Val = "Bernard MT Condensed" }, FontSize = new FontSize() { Val = 16D } }; fts.Append(ft); fts.Count = (uint)fts.ChildElements.Count; ssh.Append(fts); #endregion

 

Die Füllmuster der Zelle werden hier definiert und ebenfalls über den Index referenziert:

#region +++ Add Fill Styles +++ Fills fis = new Fills(); Fill fi = new Fill() { PatternFill = new PatternFill() { PatternType = PatternValues.None } }; fis.Append(fi); fi = new Fill() { PatternFill = new PatternFill() { PatternType = PatternValues.LightGray } }; fis.Append(fi); fis.Count = (uint)fis.ChildElements.Count; ssh.Append(fis); #endregion

Die Randeinstellungen der Zelle sind hier nur gekürzt dargestellt:

#region +++ Add Border Styles +++ Borders bos = new Borders(); Border bo = new Border() { … }; bos.Append(bo); bo = new Border() { LeftBorder = new LeftBorder() { Style = BorderStyleValues.Thin }, RightBorder = new RightBorder() { Style = BorderStyleValues.Thin }, TopBorder = new TopBorder() { Style = BorderStyleValues.Thin }, BottomBorder = new BottomBorder() { Style = BorderStyleValues.Thin } }; bos.Append(bo); bos.Count = (uint)bos.ChildElements.Count; ssh.Append(bos); #endregion

Für die weiter unten mit Namen definierten eingebauten Formatvorlagen werden hier Standardeinstellungen definiert. Diese können jederzeit durch direkte Formatierung (Master Cell Records) überschrieben werden.

#region +++ Add Cell Style Formats +++ CellStyleFormats cstfs = new CellStyleFormats(); CellFormat cfmt = new CellFormat() { NumberFormatId = 0, FontId = 0, FillId = 0, BorderId = 0 }; cstfs.Append(cfmt); cstfs.Count = (uint)cstfs.ChildElements.Count; ssh.Append(cstfs); #endregion
Ein Beispiel aus einer Arbeitsmappe zeigt mögliche Definitionen:
cellStyleXfs

 

Bei den Master Cell Records laufen alle Fäden zusammen. Jeder Zelle bezieht sich auf einen Index in dieser Tabelle. Hier werden die Abweichungen vom Standardformat „Normal“ definiert. Alles, was nicht definiert wurde, wird von „Normal“ übernommen. Über die FormatId wird auf die benannten Formatvorlagen verwiesen.

#region +++ Add Cell Formats // Master Formatting Records +++ CellFormats cfx = new CellFormats(); CellFormat cf; cf = new CellFormat() { NumberFormatId = nf1.NumberFormatId, FontId = 0 , FormatId = 0 }; cfx.Append(cf); cf = new CellFormat() { NumberFormatId = nf1.NumberFormatId, FontId = 0 , FormatId = 0 }; cfx.Append(cf); cf = new CellFormat() { NumberFormatId = nf3.NumberFormatId, FontId = 1 , FormatId = 0 }; cfx.Append(cf); cf = new CellFormat() { NumberFormatId = nf5.NumberFormatId, FontId = 2, BorderId = 1, FillId = 1 , FormatId = 0 }; Alignment al = new Alignment() { Horizontal = HorizontalAlignmentValues.Center }; cf.Append(al); cfx.Append(cf); cf = new CellFormat() { NumberFormatId = nf1.NumberFormatId, FontId = 2 , FormatId = 0 }; al = new Alignment() { Horizontal = HorizontalAlignmentValues.Right }; cf.Append(al); cfx.Append(cf); cf = new CellFormat() { NumberFormatId = nf1.NumberFormatId, FontId = 3 , FormatId = 0 }; cfx.Append(cf); cf = new CellFormat() { NumberFormatId = 12, FontId = 3 , FormatId = 0 }; al = new Alignment() { Horizontal = HorizontalAlignmentValues.Center }; cf.Append(al); cfx.Append(cf); cfx.Count = (uint)cfx.ChildElements.Count; ssh.Append(cfx); #endregion

Die Definition der Namen benannter Formatvorlagen erfolgt hier. Im Anhang H der ISO/IEC 29500 Formatbeschreibung findet man eine Auflistung der vordefinierten Formate. Die BuildInID verweist darauf. Es muss zumindest die Vorlage „Normal“ definiert werden, da alle Zellen erst mal diese Formatvorlage erhalten.

#region +++ Add Cell Styles +++ CellStyles csts = new CellStyles(); CellStyle cst = new CellStyle() { Name = "Normal", FormatId = 0, BuiltinId = 0 }; csts.Append(cst); csts.Count = (uint)csts.ChildElements.Count; ssh.Append(csts); #endregion

Ein Beispiel aus einer Arbeitsmappe zeigt mögliche verwendete Formatvorlagen:

BuiltInStyles

Der in Teil 1 schon einmal rudimentär aufgezeigte Code zum Erstellen der Zellinhalte sieht ausformuliert so aus:

// worksheet.xml erzeugen: Worksheet ws = new Worksheet(); SheetData sd = new SheetData(); ws.AppendChild(sd); Row r1 = new Row(); r1.RowIndex = 1; // Create InlineString: r1.AppendChild(CreateCellWithInlineString("A1", "Der Zellwert als String", 0)); // Create Number Entry: r1.AppendChild(CreateCellWithNumber("B1", "42", 2)); // Create Formula: r1.AppendChild(CreateCellWithFormula("C1", "B1*5", 1)); // Create SharedString: r1.AppendChild(CreateCellWithSharedString("D1", "Microsoft", partSharedStrings, 4)); Row r3 = new Row(); r3.RowIndex = 3; r3.AppendChild(CreateCellWithSharedString("A3", "Jens Häupel", partSharedStrings, 4)); r3.AppendChild(CreateCellWithSharedString("B3", "Microsoft", partSharedStrings, 5)); Row r5 = new Row(); r5.RowIndex = 5; // Create Date Entry: r5.AppendChild(CreateCellWithNumber("A5", "40536", 3)); // Create Fraction: r5.AppendChild(CreateCellWithNumber("B5", "2.75", 6)); sd.AppendChild(r1); sd.AppendChild(r3); sd.AppendChild(r5); ws.Save(partWS);

Daraus ergibt sich diese Tabelle in Excel. Man sieht die verschiedenen Formatierungenin Bezug auf Zeichensatz, Schriftschnitt und –größe sowie Ausrichtung.

Result Scaled

Aber halt, das ist eigentlich nicht das korrekte Ergebnis. Das sieht nämlich so aus:

Result

Hier wird eine Limitierung deutlich: Open XML ist zwar sehr gut geeignet, Daten aus Dateien zu extrahieren oder auch Inhalte zu verändern oder erzeugen, auf eine Sache hat Open XML aber keinen Einfluss: das Rendering. Dafür werden Informationen über Drucker- und Grafikengine benötigt. Letztendlich ist es möglich, z.B. die optimale Breite einer Zelle, ausgehend von einer gegebenen Schrift (incl. Größe, Schnitt und Skalierung) zu berechnen und auch per Open XML einzustellen.

Die exakte Definition, wie die Berechnung zu erfolgen hat, findet sich in Abschnitt 18.3.1.13 der Open XML Dokumentation.

Column width

Die Spaltenbreite kann man wiederum setzen, indem einzelne Spalten definiert und der Columns Collection hinzugefügt werden:

Columns cols = new Columns( new Column() { Min = 1, Max = 1, Width = 12, CustomWidth = true }, new Column() { Min = 1, Max = 1, Width = 12, CustomWidth = true } ); ws.Append(cols);

Ganz am Ende noch ein Blick in die Shared String Tabelle. Obwohl der Begriff „Microsoft“ zweimal verwendet wurde, erscheint er richtigerweise nur einmal als Shared String:

SharedStrings

[Fortsetzung folgt]

dotnet Cologne 2011 – Call for Papers

04.01.2011 10:50:00 | Stefan Lange

Am 6. Mai findet im MediaPark Köln die dotnet Cologne 2011 statt, die größte deutsche .NET Community Konferenz für Software-Entwickler, organisiert von den .NET User Groups Köln und Bonn.

Zurzeit suchen wir noch Sprecher mit interessanten Themen aus allen Bereichen der .NET Technologien. Wer also einen Vortrag einreichen möchte, sollte nicht bis kurz vor Einreichungsschluss warten, sondern dies möglichst zeitnah tun. Wie das im Einzelnen geht, steht hier. Wir freuen uns auf Eure Vorschläge.

Für alle, die Fragen, Ideen, Anregungen oder Wünsche haben, stehen Albert, Roland und ich gerne zur Verfügung.

Windows Powershell – Aliase dauerhaft erstellen

03.01.2011 11:40:00 | Alexander Zeitler

Praktisch jede moderne Shell (Kommandozeile) verfügt über sogenannte Aliase.

Aliase ermöglichen es, häufig benutzte Befehle abzukürzen.

Ein Beispiel für einen vermutlich mehrmals täglich genutzten Alias “cd”.

“cd” ist ein Alias für das CmdLet “Set-Location”.

Eigene Aliase kann man in der Windows Powershell mit dem Befehl “SetAlias” definieren:

Set-Alias np c:\windows\notepad.exe

Damit haben wir den Alias “np” für den Windows-Editor definiert.

Will man nun einen Alias für ein Programm oder CmdLet mit Parametern erstellen, z.B. so:

Set-Alias netfx4 Set-Location C:\Windows\Microsoft.NET\Framework\v4.0.30319

erhält man folgende Fehlermeldung:

Set-Alias : A positional parameter cannot be found that accepts argument 'C:\Windows\Microsoft.NET\Framework\v4.0.30319’.

Der Trick zur Lösung des Problems liegt in der Verwendung eines CmdLets oder einer Funktion, in der der Parameter (nichts anderes ist der Pfad) verwendet werden kann:

function fnetfx4 {set-location C:\Windows\Microsoft.NET\Framework\v4.0.30319}

Danach weisen wir unserem Alias die Funktion zu:

Set-Alias netfx4 fnetfx4

Nun funktioniert der Aufruf des Aliases problemlos.

Allerdings sind der Alias und die Funktion nach dem Schließen und erneuten Öffnen der Powershell wieder weg.

Der Grund hierfür ist, dass benutzerdefinierte Aliase im Benutzerprofil gespeichert werden müssen, damit sie dauerhauft verfügbar sind.

Zunächst prüft man, ob ein Powershell-Profil existiert:

Test-Path $profile

Erhält man “True” zurück, kann man das Profil mit

notepad $profile

bearbeiten.

Erhält man “False” zurück, muss man das Profil erstellen:

New-Item -path $profile -type file –force

Danach kann man Profil bearbeiten und die beiden o.g. Zeilen einfügen:

function fnetfx4 {set-location C:\Windows\Microsoft.NET\Framework\v4.0.30319} 
Set-Alias netfx4 fnetfx4

Nun ist der Alias dauerhaft gespeichert und steht auch nach einem Neustart der Powershell noch zur Verfügung.

P.S.: Bei Pfaden, die Leerzeichen enthalten, müssen umschließende Anführungszeichen verwendet werden, z.B. “C:\Mein Pfad mit Leerzeichen”

DotNetKicks-DE Image

The Big List of JavaScript, CSS, and HTML Development Tools, Libraries, Projects, and Books

02.01.2011 17:57:00 | Ozgur Aytekin

Azure SDK 1.3: SEHException beim Lesen der Role-Konfiguration via RoleManager. GetConfigurationSetting

02.01.2011 03:37:42 | Manfred Steyer

Seit ich auf Azure SDK 1.3 umgestellt habe, habe ich beim Lesen der Role-Konfiguration mittels RoleManager.GetConfigurationSetting eine SEHException bekommen. Der Grund war, dass ich vor einiger Zeit festgelegt habe, dass mein IIS (64 Bit) auch 32 Bit-Prozesse ausführen darf. Damit kommt das SDK 1.3 beim Ausführen von Web-Applikationen in der Dev-Fabric offensichtlich nicht klar [1].

Lösung 1: 32 Bit-Unterstützung deaktivieren
Dazu ist die folgende Anweisung als Admin auf der Konsole auszuführen:
%windir%\system32\inetsrv\appcmd set config -section:applicationPools -applicationPoolDefaults.enable32BitAppOnWin64:false

Lösung 2: Die Verwendung von IIS durch die Dev-Fabric deaktivieren
Dazu ist das XML-Element Sites inkl. aller Unterelemente in der ServiceDefinition.csdef für die Arbeit mit der Dev-Fabric auszukommentieren.

[1] http://social.msdn.microsoft.com/Forums ... cb20b38c1d

Azure: Communication Object Faulted Exception was unhandled

01.01.2011 04:15:42 | Manfred Steyer

Bei der Arbeit mit Azure trat plötzlich beim Starten des Web-Projekts die Fehlermeldung CommunicationObjectFaultedException was unhandled auf. Es hat sich dann herausgestellt, dass ab Azure SDK 1.3 die web.config nicht schreibgeschützt sein darf [1, 2], was bei nicht ausgecheckten Dateien jedoch der Fall ist. Lösung: Datei auschecken und Solution starten. Mehr dazu findet sich unter [3].

[1] http://social.msdn.microsoft.com/Forums ... 52abfe2a9e

[2] http://code-inside.de/blog/2010/12/03/f ... ted-state/

[3] http://blogs.msdn.com/b/windowsazure/ar ... -core.aspx

WPF Forum | ASP.NET Forum | ASP.NET MVC Forum | Silverlight Forum | Windows Phone 7 Forum | SharePoint Forum | Dotnet Jobs | Dotnet Termine | Developer Blogs | Dotnet News

Das Team | Regeln | Impressum