.
Anmeldung | Registrieren | Hilfe

.NET-Blogs Archiv Januar 2011

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

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.”

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.

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.

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.

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.

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

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

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.

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

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.

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.

dotnet Cologne 2011 – Call for Papers

04.01.2011 11: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.

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

02.01.2011 17:57:00 | Ozgur Aytekin

Regeln | Impressum