Norbert Eder: JSON-Datei mit Go einlesen

Das JSON-Format wird ganz gerne verwendet, um Daten oder Einstellungen zu übertragen bzw. zu speichern. Daher stellt sich häufig die Anforderung, JSON-Dateien einzulesen. Dieser Kurzbeitrag zeigt den notwendigen Sourcecode zum Einlesen von JSON-Dateien und dem Mapping auf einen Go Typen.

The post JSON-Datei mit Go einlesen appeared first on Norbert Eder.

codefest.at [MS]: Freies eBook Building Cloud Apps with Microsoft Azure

Ganz frisch gibt es ein neues kostenfreies eBook für Developer im Microsoft Press Blog downzuladen: Building Cloud Apps with Microsoft Azure von Scott Guthrie, Mark Simms, Tom Dykstra, Rick Anderson und Mike Wasson.

Das eBook behandelt die Themen Apps mit Azure, Best practices for DevOps, data storage, high availability und vieles mehr. Dabei werden auch wichtige Bereiche von Azure wie Automation, Web Development, Continuous integration and delivery, Source Control, Caching, Queues, Monitoring und weitere Features behandelt.

9780735695658f

Hier kann das eBook in verschiedenen Formaten geladen werden:
PDF (6.35 MB), EPUB (22.7 MB), and MOBI (12.3 MB).

Der Inhalt basiert auf mehreren Sessions von Scott Guthrie auf der Norwegian Developers Conference (NDC) und von der Microsoft Tech Ed Australia im letzten Jahr. Die Beispiele wurden von weiteren Autoren angepasst, erweitert und in schriftliche Form gebracht.

Das eBook führt durch Design-Patterns und beschreibt Architektur und Code-Beispiele und zeigt wie man Real-World Cloud-Lösungen umsetzen kann. Die Zielgruppe sind vor allem Software-Entwickler, für die Cloud-Solutions neu sind und zeigt anhand von Konzepten und Beispielen wie konkrete Anforderungen in Azure entwickelt werden können.

Auch Developer, die bereits Cloud-Lösungen entwickeln finden hier vielleicht neue Ideen. Jedes Kapitel ist eigenständig und informiert über spezielle Bereiche.

Viel Spaß mit dem freien eBook!

Code-Inside Blog: NuGet Package Restore & Build Server wie z.B. AppVeyor

image_thumb.png

NuGet ist ja mittlerweile weit verbreitet, aber eine Frage stellt sich natürlich immer noch: Checkt man die NuGet Packages ein oder nicht?

In meinem kleinen Side-Projekt, welches auf GitHub liegt und ich über AppVeyor auch bauen lasse nutze ich das Package Restore Feature von NuGet, d.h. in meinem Repository befindet sich kein NuGet Package mehr, sondern es wird vor dem Bauen geprüft ob das Package da ist und wenn nicht wird es runtergeladen.

Die “eincheck”-Variante hat auch seine Vorteile, aber in meinem Setting hier ist dies unnötig, da ich ohnehin auf diverse andere Dienste vertraue. Also zur Sache:

“Enable NuGet Package Restore” & Fertig, oder?

Nein.

Diese Option die aktuell noch im NuGet Tooling drin ist braucht es nicht mehr:

image

Diese Option benötigt es nicht mehr! Mehr dazu in diesem Blogpost “The right way to restore NuGet packages”. Um es kurz zu machen: Im Visual Studio passiert dies “automatisch” – es benötigt nicht diese Magic.

Änderung seit NuGet 2.7

Diese Änderung wurde in NuGet 2.7 gemacht. In dem Blogpost ist auch beschrieben wie man seine Projekte wieder davon befreien kann.

Und was ist nun mit den Buildservern?

Auf dem Buildserver (AppVeyor in meinem Beispiel) kam immer diese Fehlermeldung:

“C:\projects\code-inside-web\CodeInside.Web\CodeInside.Web.csproj(338,5): error : The build restored NuGet packages. Build the project again to include these packages in the build. For more information, see http://go.microsoft.com/fwlink/?LinkID=317568.”

Der Link zeigt auch wieder auf den MSDN Blog.

Der Fix für das Problem auf dem Buildserver

Generell muss man aktuell noch manuell den “nuget restore” Command aufrufen. Im Falle von AppVeyor macht man dies einfach (Doku)so:

image

Damit sollte es wieder klappen.

image

Fabian Deitelhoff: Digitale Entschlackungskur

Chrome LogoHin und wieder überprüfe ich, ob ich bestimmte Anwendungen, Dienste oder Vorgehensweisen tatsächlich noch brauche. Das findet nicht zu bestimmten Anlässen geschweige denn zu festen Zeitpunkten statt. Es fängt vielmehr mit etwas Verwunderung an, ob etwas noch wirklich notwendig ist. Manchmal haben auch IT Nachrichten damit zu tun. Wenn mal wieder Sicherheitslücken ohne Ende vorhanden sind und das Komponenten betrifft, die vielleicht gar nicht so wichtig sind wie gedacht.

Dieses Mal bezog sich das auf Anwendungen, die ich einsetze, beziehungsweise auf Plugins ebendieser Programme. Da habe ich etliche Funktionen deaktiviert. Mal schauen, ob es größere Probleme gibt oder sich meine IT Welt doch einfach weiterdreht.

Der Anfang

Vor circa 1 1/2 Jahren habe ich das Java Plugin aus dem Browser geworfen. Ich finde externe Plugins, um Inhalte anzuzeigen, ziemlich nervig. Da das Java Plugin von kaum einer Webseite genutzt wird, war das auch überhaupt kein Problem. Ist mir glaube ich nur einmal aufgefallen, als ich Tickets für eine Veranstaltung buchen wollte und die Platzwahl über ein Java-Plugin geregelt wurde. Ich habe dann woanders bestellt. An Alternativen mangelt es hier definitiv nicht.

Einige Monate danach habe ich Java komplett vom System entfernt. Das war die Zeit der vielen Sicherheitslücken und ich merkte, dass ich Java eh nicht mehr viel einsetze. Zwar noch im Rahmen meines Studiums, dafür setze ich aber sowieso auf VMs, da ich für das Studium generell viel Software benötige, die dann teilweise nach einem Semester schon wieder obsolet ist. Auf meinem Desktop-System war das Fehlen von Java hingegen kein großes Problem. Ich setze keine Software ein, die Java benötigt.

Und es geht weiter

Wie ich in der Einleitung des Artikels schon geschrieben haben, ging es nun mit diversen Plugins weiter. Das hatte ich schon lange vor. Auslöser war der folgende Tweet, der den Weg in meine Timeline bei Twitter gefunden hat:

Moment setze ich Chrome ein und so war es an der Zeit, den Browser zu entschlacken. Deaktiviert habe ich alles, was nicht niet und nagelfest ist. Die folgende Liste enthält alle Plugins, die zurzeit installiert sind. Der obere Teil zeigt die aktivierten, der untere die deaktivieren Plugins.

  • Chrome PDF Viewer (aktiviert)
  • Google Update (aktiviert)
  • Adobe Flash Player
  • Chrome Remote Desktop Viewer
  • Widevine Content Decryption Module
  • Native Client
  • Microsoft Office
  • Adobe Reader
  • NVIDIA 3D
  • Java
  • Silverlight

Viel übrig geblieben ist ganz offensichtlich nicht mehr. Den Chrome PDF Viewer habe ich nicht deaktiviert, weil ich es manchmal ganz nett finde, eine PDF Datei direkt im Browser zu betrachten. Wirklich überlebenswichtig ist das auch nicht. Vielleicht fliegt das Plugin auch irgendwann raus. Abbildung 1 zeigt die Ansicht noch mal in Chrome, die über die Adresse chrome://plugins aufrufbar ist.

Abb. 1: Aktivierte und deaktivierte Plugins in Chrome.

Abb. 1: Aktivierte und deaktivierte Plugins in Chrome.

Gespannt bin ich auf den Flash Player und vielleicht auch auf Silverlight. Gerade ersteres Plugin ist leider noch häufig Standard bei Videos oder anderen, interaktiven Inhalten. Deaktiviert habe ich die Plugins seit circa zwei Wochen. Bisher habe ich 2-3 Mal den Flash Player vermisst, weil ich mir ein Video angucken wollte. Aktiviert habe ich den Player aber trotzdem nicht. Ich habe dann auf das Video verzichtet. Viel mir nicht sonderlich schwer, da der Inhalt im Nachhinein doch nicht wirklich wichtig war.

Fazit

Bisher kann ich damit sehr gut leben und vor allem Arbeiten. Viel habe ich nicht vermisst. Lediglich den Flash Player einige Male. Aktivieren möchte ich ihn trotzdem nicht mehr. Etlicher Inhalt ist auch schon auf HTML 5 umgestellt, was auch erst auffällt, wenn der Flash Player nicht mehr direkt automatisch startet. Und auf anderen Inhalt, der zwingend Flash voraussetzt, habe ich bisher dankend verzichtet.

Ob diese Vorgehensweise eine Möglichkeit zur digitalen Entschlackung ist, muss jeder für sich entscheiden. Ich finde es bisher sehr gut und es wird sicherlich nicht die letzte Aktion dieser Art gewesen sein.

Uli Armbruster: Aus der täglichen Retrospektive #2

Aufgrund von unterschiedlichen Browserversionen und Extensions oder wegen gecachten Inhalten kam es bei der Abnahme von User Stories bei uns häufig zu Problemen. Beispielsweise wurden alte Styles oder falsche Bilder geladen. Eine weitere Störquelle waren Fehler in Fremdsprachen oder in besonderen Daten-Konstellationen (sehr lange Breadcrumb, tiefe Hierarchien).

Daraus zogen wir zwei Konsequenzen:

  • Alle Tester und der PO bekamen die PortableApps.com Plattform, in welcher Firefox und Chrome mit einheitlichen Extensions und Konfigurationen installiert sind. Zwei Konfigurationen bewirken unter anderem, dass nichts gecacht wird und nach dem Schließen des Browsers alle Daten entfernt werden. Außerdem ist das NoTracking-Kennzeichen aktiviert. Per copy & paste kann ein weiterer Tester schnell “die Testumgebung” erhalten.
  • Darüber hinaus legten wir für besagte Konstellationen Lesezeichen in den Leisten an und dokumentierten den Soll-Stand. Im Unternehmenswiki ist der formale Abnahmeablauf festgehalten.

Einsortiert unter:CIO Topics, German, Projects Tagged: Retrospektive

ppedv Team Blog: Fernsteuerung mit Outlook: Windows per E-Mail herunterfahren

Die Ausgangslage kann mal auf jeden von uns Windows-Benutzern zutreffen, man will oder muss seinen PC ausschalten, vergisst dies jedoch, was dann? Ein „Herunterfahren“ via Fernsteuerung kann per E-Mail über Outlook geschehen.

Dies wird über eine zuvor erstellte Datei gesteuert.

So wird es gemacht:

1. Ausschalt-Datei erstellen

Windows-Taste betätigen, den Editor starten und folgenden Text eingeben:

shutdown –s –f

Diese Datei wird gespeichert, allerdings nicht als „.txt“ sondern als „.bat“, z.B. „ausschalten.bat“.

2. Eine Outlook-Regel erstellen

In Outlook klicken Sie unter Start auf Regeln -> Regeln und Benachrichtigungen verwalten ->
Neue Regel -> Regel ohne Vorlage erstellen: Regel auf von mir empfangene Nachrichten anwenden und Weiter.

clip_image002[1]

Um dafür zu sorgen, dass Outlook den PC ausschaltet, aktivieren Sie das Kontrollkästchen vor „die von einer Person/öffentlichen Gruppe kommt“ und „mit bestimmten Wörtern im Betreff“.

clip_image004[1]

Unter 2. Schritt klicken Sie auf den blau unterstrichenen Text „einer Person/öffentlichen Gruppe“, dort geben Sie Ihre E-Mail-Adresse ein und bestätigen mit OK. Danach klicken Sie auf „bestimmten Wörtern“, hier geben Sie z.B. ausschalten ein und klicken auf Hinzufügen, OK und Weiter.

Im nächsten Dialogfenster setzen Sie anschließend noch einen Haken neben
Anwendung starten“, klicken unten auf Anwendung und wählen die Datei aus Schritt 1 aus. Hierzu klicken Sie auf Ausführbare Dateien, Alle Dateien und doppelt auf ausschalten.

clip_image005[1]clip_image006[1]

Abschließend klicken Sie auf Fertigstellen und zweimal auf OK.

3. PC ausschalten

Nun testen Sie es, indem Sie sich selbst eine E-Mail schicken mit dem Betreff Ausschalten. Nach dem Abruf dieser E-Mail von Outlook fährt der PC herunter.

Hinweis: Vorsicht! Alle nicht gespeicherten Dateien gehen dabei verloren.

Klaus Aschenbrenner: SQLBits recap

(Be sure to checkout the FREE SQLpassion Performance Tuning Training Plan – you get a weekly email packed with all the essential knowledge you need to know about performance tuning on SQL Server.)

Wow, what an intensive last week! Last week I attended the SQLBits conference in Telford/UK – in the middle of nowhere :-) . Telford itself is around 30 minutes in the west of Birmingham (where I flew into), but there is almost no civilization – or I didn’t have found it…It was the first conference in my life where I haven’t seen anything else besides the hotel and the conference venue. This makes life very simplified.

During the conference I have presented 2 sessions. On Friday I have talked about Latches, Spinlocks, and Latch-Free Data Structures, and on Saturday I have presented my session about the Dangerous Beauty of Bookmark Lookups. Both sessions where high attended, and I had a huge fun to present them.

I have also already submitted my session materials (slides & samples) to the conference owners, so you should be able very soon to get the materials through the conference website. Besides the amazing speaker lineup, we also had a lot of fun at the Steampunk party on Friday, which was THE highlight during the conference! I can’t tell you too much about the party itself, because what happens at SQLBits stays in SQLBits ;-) .

I got pink hairs!

Thanks for reading

-Klaus

codefest.at [MS]: Cloud Service Projekte mit Visual Studio Online Teambuild

imageWer seine Cloud Service Projekte in Visual Studio Online verwaltet, hat die Möglichkeit diese mittels continuous integration automatisch bei Check-Ins bereitzustellen. Dazu ist es lediglich notwendig das Cloudservice mit dem Visual Studio Online Projekt zu verbinden.

Dazu wählt man auf der Startseite des Cloud Services im Management Portal den Link “Set up publishing with Visual Studio Online”.

image

Nachdem man die entsprechenden Berechtigungen vergeben hat kann man ein Sourcecode Repository (GIT oder imageTFSVC) wählen.

Im Normalfall (Eine Solution mit einem Cloud Projekt) läuft alles reibungslos. Allerdings gibt es auch Szenarien die etwas Konfigurationsarbeit erfordern:

Spezial Szenario 1 – Mehrere Solutions mit Cloudprojekten

Befinden sich in dem Repository mehrere Solutions mit Cloudprojekten legt Visual Studio Online trotzdem nur eine Build Definition an. Als Name wird hier scheinbar die erste gefundene Solution ausgewählt. Wer die Build-Definition allerdings öffnet und unter “Process-2.Build-Projects” hineinsieht findet kein ausgewähltes Projekt. Normalerweise können in einer Build-Definition Solutions und Projekte angegeben werden. Der Cloud Deployment Build erfordert hier allerdings immer die Bekanntgabe einer Solution! Ansonsten kommt es beim Build zu einer entsprechenden Fehlermeldung. D.h. in diesem Fall muss die gewünschte Solution ausgewählt werden.

Schwieriger gestaltet sich nachfolgendes Szenario:

Spezial Szenario 2 – Mehrere Cloud Projekte in einer Solution

In diesem Szenario möchte ich ein spezifisches Cloud Projekt auf mein Cloud Services automatisiert bereitstellen. Per Default wird wieder eine Build-Definition von Visual Studio Online angelegt die auf meine Solution verweist. Der Cloud Build/Deployment Prozess verwendet hier allerdings immer das erste gefundene Cloud Projekt für die Bereitstellung. Es gibt leider keine Möglichkeit anzugeben, welches der Cloudprojekte für die Bereitstellung ausgewählt werden soll (siehe entsprechenden Forumseintrag).

Update: Einer unserer Partner hat mich auf folgenden Artikel aufmerksam gemacht, mit dem der Build Prozess so verändert wird, dass das bereitzustellende Projekt auch explizit angegeben werden kann.

Ein möglicher Workaround ist die Erstellung einer Kopie der Solution-Datei die man auch entsprechend zusätzlich eincheckt. Aus dieser entfernt man bis auf das gewünsche Cloud Projekt alle anderen. Daraufhin gibt man diese Solution im Build-Prozess der Build-Definition an.

Auf diese Weise kann man natürlich auch mit den anderen Cloud Projekten verfahren und so die Cloud Projekte automatisiert auf unterschiedliche Cloud Services bereitstelen.

Arbeiten kann man problemlos mit der ursprünglichen Solution.

Andreas Pollak
Product Marketing Manager Visual Studio (Entwicklungs- und Testwerkzeuge)
clip_image001

Leader im Magic Quadrant für ALM

Johnny Graber: Von Zeit und Datenmengen

Bei Datenmigrationen und der Batchverarbeitung kommen 2 Bereiche zusammen bei denen viele Entwickler (mich eingeschlossen) schnell an eine mentale Grenze stossen:

  • Zeit
  • Datenmenge

Wohl ist jedem bekannt das ein Tag 24 Stunden hat und ein Terabyte aus 1024 Gigabyte besteht. Und doch kommt es immer wieder zu bösen Überraschungen.

 

Eine Optimierung am Code ist reine Zeitverschwendung, da die Arbeit in einer Sekunde erledigt ist.

 

Wer hat nicht schon solche Aussagen gehört? Das Problem von dieser einen Sekunde ist nicht die Dauer. Das Problem liegt in der impliziten Aussage über die Geschwindigkeit. Eine Sekunde ist kurz, meine Arbeit gross und daraus folgt mein Code ist schnell. Wenn es so doch nur so einfach wäre…

 

Wie lange kann es auf der Produktion schon gehen wenn es auf dem Testsystem gar nicht messbar ist?

 

Ist die wohl noch schönere Frage. Wer schon einmal versuchte eine grössere Datenmenge zu migrieren kennt die unbequeme Antwort: Lange – viel zu lange.

 

Was genau messen wir?

Wie immer wenn etwas gemessen wird kommt es auf die Relevanz an. Ob 1 Sekunde schnell oder langsam ist hängt davon ab, was darin gemacht wurde. Wie viele Datensätze wurden verarbeitet? Und in welchem Verhältnis steht diese Datenmenge zum Zielsystem?

Die einzelnen Sekunden summieren sich sehr schnell, alles was es dazu braucht ist eine unterschiedliche Menge an Daten auf dem Test- und auf dem Produktionssystem. Bei einem linearen Anstieg wächst die Verarbeitungsdauer gleichmässig mit der Datenmenge. Verdoppelt sich die Datenmenge, verdoppelt sich auch die Verarbeitungsdauer. Hat man 60x mehr Daten in der Produktion als auf dem Testsystem wird aus dieser einen Sekunde bei der Einführung eine Minute.

 

Eine Hochrechnungstabelle

Was passiert aber wenn man statt auf dem Testsystem auf dem Entwicklungssystem gemessen hat? Da ist das Verhältnis vielleicht nicht 1:60, sondern 1:1’000, 1:10’000 oder gar 1:100’000. Wie lange waren nochmal 100’000 Sekunden?

Diese kleine Hochrechnungstabelle nimmt das Rechenbeispiel auf und geht von einer Sekunde für eine bestimmte Menge von Daten aus. 10x mehr Daten ergeben den Faktor 10, der für diesen linearen Anstieg auch in einer 10x längeren Dauer resultiert:

Faktor Datenmenge Dauer
1 00:00:01
10 00:00:10
100 00:01:40
1’000 00:16:40
10’000 02:46:40
100’000 27:46:40 oder 1 Tag 03:46:40
1’000’000 277:46:40 oder 11 Tage 13:46:40

Die 100’000x mehr Daten machen aus der getesteten Sekunde bei der Einführung eine Aufgabe die sich in einem Tag nicht mehr abschliessen lässt. Aber schon bei 10’000x mehr Daten dürfte so mancher Einführungsplan in den kritischen Bereich kommen.

 

Probleme vermeiden

Diese Probleme lassen sich am einfachsten dadurch vermeiden, dass man die Performance-Messungen auf vergleichbaren Systemen mit vergleichbaren Datenmengen macht.

Ist es nicht möglich muss man die Werte entsprechend umrechnen. Dies ist viel aufwändiger und weniger genau, aber immer noch besser als sich einzureden die Arbeit sei in einer Sekunde erledigt. Dabei gilt es aber nicht nur die Datenmenge zu bedenken. SSD-Festplatten sind gerade in Kombination mit kleinen Datenmengen deutlich schneller als so manche Server-Festplatte. Von CPU, Netzwerk und Systemdiensten die auch noch laufen ganz zu schweigen.

 

Fazit

Wenn man eine Performance-Messung nur auf die Dauer reduziert führt dies zu völlig falschen Annahmen. Um lange Wartezeiten bei der produktiven Einführung zu verhindern muss daher unbedingt beachtet werden wie sich die Daten und Systeme gegenüber der Produktion unterschieden. Mehr Daten bedeutet eine längere Verarbeitungszeit. Und nur weil es auf irgendeinem System schnell ist bedeutet dies nicht automatisch das man aufs optimieren verzichten kann. Ganz abgesehen davon dass eine exponentielle Zunahme der Verarbeitungszeit alles noch viel schlimmer macht…

 


Einsortiert unter:.Net, dnugBern, webDotNet Tagged: .Net, Beschleuniger

Uli Armbruster: Checkliste für den Jobwechsel

Auf karrierebibel bin ich auf einen tollen Artikel gestoßen. Von dort stammt folgende Checkliste, ob man im aktuellen Job richtig aufgehoben ist:

[ ] Ich werde geistig gefordert.
[ ] Mir wird Autonomie bei der Arbeit zugestanden.
[ ] Ich mache wirklich das, was ich gut kann.
[ ] Meine Arbeit hat für mich und meine Werte Sinn.
[ ] Ich werde auch angemessen bezahlt.
[ ] Meine Work-Life-Balance ist ausgewogen.
[ ] Ich würde mit meinen Kollegen auch ein Feierabendbierchen trinken.

 

“Machen Sie sich keine Illusionen: Den einen Traumjob gibt es nicht. Jeder Beruf hat seine Ecken und Kanten, Sonnen- wie Schattenseiten. Wenn Sie aber rund die Hälfte der Fragen abhaken konnten, haben Sie einen Beruf gefunden, in dem Sie langfristig glücklich werden können.”

Wer mit Wechsel-Gedanken spielt, dem lege ich unser aktuelles Stellenangebot als Software Engineer ans Herz. Mehr Infos gibt es hier.


Einsortiert unter:German, Misc Tagged: Stellenausschreibung

Ralf Westphal: Zeitmanagement für Softwareentwickler

Warum kommt Clean Code oft gar nicht oder nur mit Mühe im Tagesgeschäft von Entwicklerteams an? Warum fühlen sich Entwickler oft überlastet? Abgesehen von fachlichen Problemen liegt das, so scheint mir, häufig an einer gut gemeinten, aber unsystematischen Arbeitsweise. Selbst wo man schon an Agilität geschnuppert hat, ist das persönliche Zeitmanagement weithin unterentwickelt. Deshalb hatte ich

Uli Armbruster: Aus der täglichen Retrospektive #1

Die optimale Lösung ist, wenn das komplette Scrum Team in einem Raum sitzen kann. Leider sitzen unser Kollege Freddi aus dem Marketing und unser Webentwickler Martin, beide Teil des Teams, in unterschiedlichen Gebäuden. Das steht natürlich im Impediment Backlog, lässt sich aktuell aber nicht lösen. Kürzlich kam es deshalb zu E-Mail/Telefon Ping Pong und einem enormen Zeitaufwand einer vermeintlich einfachen User Story. Weil die finale visuelle Lösung noch nicht fest in der User Story definiert werden konnte, mussten verschiedene Oberflächen-Elemente ausprobiert werden. Deshalb erläuterte Freddi Martin einen Ansatz, Martin setzte ihn um, rollte ihn auf die Preview Stage aus und Freddie schaute sich die Lösung an. Danach begann das Spielchen erneut.

Als Konsequenz zogen wir zwei Schlüsse:

  • Bei solchen User Stories setzen sich Freddi und Martin zusammen an den PC und bearbeiten die Oberfläche zusammen
  • Martin zeigt bei diesem “Pair Programming” Freddi, wie er selbst Kleinigkeiten in der UI mit einer entsprechenden Browser Extension ändern kann. Zum Beispiel Rahmendicke, Hintergrundfarbe, Schriftgröße, etc..

Einsortiert unter:CIO Topics, German Tagged: Retrospektive

codefest.at [MS]: Feststellen welche .NET Framework Version installiert ist

Manchmal entwickelt man eine App, äh, Code, auf Basis des .NET Frameworks um dann festzustellen, dass auf der Zielmaschine das entsprechende Microsoft .NET Framework nicht installiert ist. So ist es mir vor kurzem passiert, dass die Voraussetzungen für eine .NET 4.5 App am Zielrechner des Kunden nicht vorhanden waren. Dann hilft nur die App mit einer kleineren Version neu zu kompilieren oder das benötigte .NET Framework auf dem Zielrechner zu installieren.

Auch IT-Admins wissen nicht immer über den Status der Version des .NET Frameworks und über Side-by-Side Installationen und die .NET CLR 1, 2 und 4 Familien Bescheid.

Ich habe darüber auch schon vor einiger Zeit in Klarheit in .NET Versionen gebloggt, die Grafik von Scott Hanselman ist noch immer aktuell.

do-net-framework-versions

Glücklicherweise kann die installierte Version recht leicht herausgefunden werden…

Natürlich hilft zuerst mal ein Blick in C:\Windows\Microsoft.NET\Framework.

image

…bzw. für 64bit .NET Libraries in C:\Windows\Microsoft.NET\Framework64.

image

Etwas mehr Infos zu installierten .NET Frameworks findet man im MSDN:

Auch regedit aus der CommandLine kann helfen: Im Registry Editor wird in den Registry Key "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP" navigiert. Dort kann der Wert für das entsprechende .NET Framework nachgeschlagen werden.

image

Es wäre jetzt zu einfach, wenn die Werte den Versionsnummern entsprechen würden… das DWORD gibt an, welche  Version des .NET Frameworks installiert ist. Die Werte sind von hier. Gut ist, dass man auch per Code prüfen kann – nur der eigene Code muss halt am Zielsystem laufen…

Value of the Release DWORD
378389 - .NET Framework 4.5
378675 - .NET Framework 4.5.1 installed with Windows 8.1
378758 - .NET Framework 4.5.1 installed on Windows 8, Windows 7 SP1, or Windows Vista SP2
379893 - .NET Framework 4.5.2

Für .NET Framework kleiner 4 siehe hier.

Um die CLR Version zu prüfen öffnet man das Visual Studio Command Prompt und startet das CLR Version Tool clrver.

Übrigens: Die folgende Website informiert über die Vorteile des .NET Frameworks: Benefits of the Microsoft .NET Framework.

Happy checking. Zwinkerndes Smiley

Uli Armbruster: Fazit zum Open Space Süd 2014 – Mehr Nerdy Talk

Für mich unterscheidet sich der diesjährige #nossued klar von denen in den vorherigen Jahren. Es waren deutlich weniger Sessions und – rein subjektive Schätzung -  ca. 20-30% weniger Teilnehmer. Klassische Sessions wie Scrum und Deployment waren zwar vertreten, jedoch fehlten mit DDD, CQRS und Message Bus auch die ganz Großen. Da ich die Klassiker in den letzten Jahren aber ohnehin oft genug diskutiert habe, war das eher erfrischend. Besonders gelungen fand ich die “Pizza Service”-Session, die spielerisch die Materie vermittelte: Mit zwei konkurrierenden Pizza Services wurde Kanban trainiert. Tolle Sache, die ich in unserem Betrieb sicherlich ausprobieren werde.

Ausgesprochen positiv nahm ich die Zunahme der Gespräche abseits der Sessions wahr. Besonders die für mich aktuell größte Herausforderung, das Finden neuer Mitarbeiter, konnte ich mehrfach erörtern. Ich habe den Eindruck, dass speziell Firmen abseits der Großstädte Probleme haben, ohne dass es jedoch anderswo wesentlich besser wäre. In dem Kontext fand ich im Gespräch mit Vertretern von medialesson Gleichgesinnte, die ebenfalls Schüler und Studenten mit Workshops und Camps ansprechen wollen. Hierzu könnt ihr sicherlich bald mehr hören. Mit Tom Wendel konnte ich noch jemanden finden, der mit AntMe vielleicht bald einen Workshop zu der Idee beisteuert.

Zu guter Letzt will ich nächstes Jahr wieder Videos aufnehmen. Dazu wurde ich mehrfach angesprochen. Besondere Wünsche und Vorschläge könnt ihr mir gerne zuschicken.

Bis nächstes Jahr zum Open Space Süd. Noch der Hinweis auf den Developer Open Space Leipzig: Dieser findet vom 17-19 Oktober statt.


Einsortiert unter:Events, German Tagged: Community, Open Space

Uli Armbruster: Zweiter Entwicklertag für Schüler

Nach dem ersten Entwicklertag plane ich Anfang der Sommerferien (Termin folgt in den nächsten Tagen, vermutlich der 31.7.) den zweiten Entwicklertag. Das Ziel ist es den Schülern ein klares Berufsbild zu vermitteln, sodass sie nach diesem Tag klar sagen können: “Ja, der Beruf des Software Entwicklers ist etwas für mich” oder “Nein, das kann ich mir für mich nicht vorstellen”.

Ein Entwickler schreibt nicht nur Programme. Im Gegenteil: Das Gros der Arbeit besteht in der Problemanalyse, dem Entwickeln von Lösungsansätzen, dem Kommunizieren mit der Fachabteilung, dem Planen der Architektur, dem Anschauen von Technologien, uvm..

Dazu möchte ich ein vermeintlich einfaches “Projekt” nehmen und von Beginn an starten. Das könnte z.B. das Spiel 2048 sein. Alternativ ist ein Programm zum Abbilden eines betriebswissenschaftlicher Prozesses wie ein Bestellvorschlagswesen denkbar. Ich denke, dass alleine das Finden eines gemeinsamen Vokabulars und von doppeldeutigen Begriffen eine interessante Erfahrung sein wird.

Die heco wird die Räumlichkeiten wieder zur Verfügung stellen. Sowohl interessierte Schüler, als auch IT-ler, die helfen möchten, können mich über einen meiner Kanäle oder per Telefon (07232-3655-555) erreichen.


Einsortiert unter:German, Misc Tagged: Community

Uli Armbruster: Komm in unser Team

Wir suchen für unsere IT Abteilung nach neuen Software-Entwicklern. Zur Stellenausschreibung geht es hier.

Ich bin seit knapp 9 Jahren dabei und kann euch die Firma heco und die vakante Stelle wärmstens empfehlen. Wir haben ein tolles, kameradschaftliches Team. Die Aufgabengebiete sind wahnsinnig interessant und herausfordernd, sodass du am Ende des Tages auch das Gefühlt hast etwas bewegt zu haben. Die Eigenverantwortung und Entscheidungskompetenzen sind enorm hoch, was die Möglichkeit bietet alle Arten von Veränderungen anzustoßen und umzusetzen.

Wer mich aus der Community kennt, hat sicherlich schon die ein oder andere Interna gehört. Alle anderen können mich gerne direkt ansprechen und sich auf Kununu die Mitarbeiterbewertungen anschauen. Damit wurden wir zum besten Arbeitgeber 2013 im Bereich Handel/Gewerbe.


Einsortiert unter:German, Misc Tagged: Stellenausschreibung

ppedv Team Blog: WDS und SCCM oder 2x WDS parallel betreiben / Probleme mit PXE lösen

Wenn man (z.B. während der Einführungsphase vom System Center Configuration Manager) den bisherigen WDS-Server (Windows Bereitstellungsdienste / Deployment Services) weiterhin nutzen will, aber parallel die Betriebssystembereitstellung (OSD) von SCCM benötigt, dann besteht im Wesentlichen das folgende Problem:

Da PXE auf Broadcasts basiert, kann es nur einen PXE-Server geben, den der Client letztlich kontaktiert (man kann per Verzögerung dafür sorgen, dass einer immer schneller ist als der andere). Wenn man nun also PXE am SCCM aktiviert, dann ist es quasi Glückssache, ob der Client zuerst die Meldung vom WDS oder zuerst die von SCCM empfängt – in den meisten Tests war SCCM schneller. Damit bleibt also nur eine der beiden Technologien nutzbar.

Aber es gibt eine Lösung! Diese ist leider a) nicht wirklich dokumentiert und b) seitens Microsoft auch nicht unterstützt (man hört aber, dass selbst Microsoft diese Lösung intern einsetzen soll).

Die Lösung besteht darin, dem Benutzer am Client die Wahl zu lassen, welchen der gefundenen PXE-Server er nutzen will. Um dies zu erreichen, ist am WDS-Server (also derjenige, der nicht der SCCM-Server ist) ein Registry-Key zu setzen:

pxe1

Zusätzlich muss am SCCM in den Eigenschaften des Distribution-Points (Verteilungspunkt) für eine ausreichende Verzögerung gesorgt werden (würde man zuerst den PXE vom SCCM booten, dann hat der RegKey dort keine Wirkung, da dieser nur auf den WDS-eigenen PXE-Provider wirkt, nicht aber auf den vom SCCM):

pxe5

Wenn nun ein Client einen PXE-Boot versucht (und die Verzögerung ausreichend war, dass sich zuerst der Nur-WDS-PXE-Server meldet), dann bekommt der Benutzer zusätzlich zu der Möglichkeit, per F12 vom Netzwerk zu booten, eine weitere Option: F11 für eine Server-Auswahl!

pxe2

Drückt man jetzt F12, wird wie gewohnt DIESER WDS-Server genutzt und von dort mittels PXE gebootet. Drückt man jedoch F11, werden zuerst alle verfügbaren WDS-Server erkannt:

pxe3

Danach bekommt man eine Auswahl-Liste mit allen gefundenen PXE-Servern:

pxe4

Hier kann nun der jeweilige PXE-Server gewählt werden. Der WDS-Server selber steht an erster Stelle, an zweiter Stelle steht hier der SCCM mit aktiviertem PXE.

Auf diese Weise ist es möglich, WDS und SCCM oder mehrere WDS-Server parallel zu betreiben. Natürlich muss die entsprechende DHCP-Infrastruktur aufgebaut sein, damit PXE überhaupt funktionieren kann!

Sven Hubert: Rückblick: DWX 2014 in Nürnberg

Die Woche begann weltmeisterlich. Wir haben alle das Spiel um Weltmeisterschaft mit Spannung verfolgt, ebenso wie die Developer Week 2014 (DWX) in Nürnberg. Erfahren Sie mehr über unsere Highlights und laden Sie sich die Vortragsfolien herunter.

113 Minuten … so lange haben wir alle auf das erlösende wie auch entscheidende Tor im Finalspiel bei der Weltmeisterschaft in Brasilien gewartet. Götzseidank musste in den interessanten wie auch unterhaltsamen Sessions der DWX nicht so lange auf die ersten Erkenntnisse gewartet werden. Die DWX 2014 fand vom 14. bis 17. Juli 2014 auf dem Gelände der NürnbergMesse statt.

image

In den ersten drei Tagen fanden bis zu zehn Session parallel statt. Da die meisten Beiträge (blaue und rote Tracks im Programm) aufgezeichnet wurden, können nicht besuchte Sessions im Nachhinein angesehen werden. Die Aufnahmen werden bis Mitte August allen Konferenzteilnehmern kostenlos auf der Webseite der DWX zum Download bereitgestellt. Am vierten Tag konnten die Besucher in neun Workshops Praxiserfahrung mit unterschiedlichen Technologien und Tools sammeln. Ein Großteil der Referenten wurde den Besuchern am Montagmorgen vorgestellt (u. a. Thomas Rümmler 3. v. r.; Christian Schlag 4. v. r., Nico Orschel 6. v. r.).

DWX-Referenten 2014

Auch wir waren mit fünf Beiträgen im .NET-Umfeld vertreten. Begonnen hat am Montagnachmittag mein Kollege Thomas Rümmler gemeinsam mit  mir. In unserer Session haben wir den Zuhörern den aktuellen Stand der Integration von Release Management for Visual Studio (ehemals InRelease) in die Team Foundation Server-Landschaft (TFS) vorgestellt und eine Beispiel-Deployment demonstriert.

image

image

image

Zur gleichen Zeit hat Nico Orschel in seiner Session einen Überblick zur Planung, Strukturierung und Ausführung von Tests mittels Microsoft Test Manager (MTM) den Teilnehmern näher gebracht. In einem weiteren Beitrag hat er die Herausforderungen und mögliche Lösungen bei automatischen UI-Tests mittels CodedUI in Visual Studio dargestellt.

image

image

Den Dienstag eröffnete Benjamin Boost mit dem notwendigen Spagat zwischen einer Individuallösung und einem Standardprodukt, um eine flexibel konfigurierbare und erweiterbare Standardsoftware zu entwickeln. Zu regelrechtem Sitzplatzmangel führte Benjamins zweiter Beitrag. Seine aufgestellte These: “Code Reviews – Jeder kennts, keiner machts?” schien insofern nicht zu weit hergeholt und deckt sich mit unserer täglichen Erfahrung.

image

image

Insgesamt waren alle Session (nicht nur unsere) sehr gut besucht.

image

In den Pausen konnten die Besucher Informationen an verschiedenen Ständen einholen. Unseren Publikumsmagneten, den heißen Draht, hatten wir auch wieder dabei.

image

image

Zu gewinnen gab es bei uns einen Microsoft Surface 2. Wir wünschen dem Gewinner Philipp Gall von der Firma Baerlin EDV in Ludwigsburg viel Spaß damit.

image

image

image

Auch wir konnten uns an einem spontanem, AIT-internen Kickerspiel erfreuen. Leider konnten wir den Kicker nicht mitnehmen.

image

Abschließend danken wir allen Zuschauern und Besuchern der Konferenz, den Veranstaltern der Neuen Mediengesellschaft Ulm mbH, dem delikaten Catering, den fleißigen und stets lächelnden Servicekräften, sowie allen Helfern der NürnbergMesse, dem unermüdlichen Shuttlebus-Service und allen anderen fleißigen Helfern. Es war eine tolle Woche! Wir freuen uns auf die nächste DWX.

Abschließend die Folien zu unseren Vorträgen:

Für Rückfragen zu unseren Beiträgen stehen wir gern zur Verfügung.

Rückblick: DWX 2014 in Nürnberg is a post from: AIT Blog

Dirk Primbs [MS]: Running a multilingual blog…

… just doesn’t work for me.
As much as I hate to admit it: This blog would have seen already twice as many posts if not for the crazy idea to write in English as well as in German. I just don’t. Sometimes I even draft a post in one of the two languages but never find the time to translate it into the other.

So I had a long hard look at my statistics, thought about the people I try to reach and reminded myself that I also like to practice my English writing skills. The result: My posts will be from now on consistently in English. Unless an uproar in my comments suggests otherwise in which case I’ll consider to provide translated versions with delay… :-)

Picture credit: Flickr

The post Running a multilingual blog… appeared first on Dirk Primbs Online.

David Tielke: DWX 2014: Projektdateien & Folien

UnbenanntVom 14.07. bis 16.07.  findet (bzw. fand) in Nürnberg wieder die Developer Weeks in Nürnberg statt. Neben den Themen Visual Studio 2013 und Visual Studio Online durfte ich außerdem die Themen “Softwarekomponenten”, “Inversion of Control” und “Softwarearchitekturen für die Praxis” beleuchten. Neben den Folien waren aber vor allem für sehr viele Teilnehmer die erstellen Projekte von Interesse. Hier nun also die jeweilig erstellten VS-Projekte für die einzelnen Vorträge sowie die Folien für Softwarekomponenten.

An dieser Stelle an alle Teilnehmer noch einmal vielen Dank für das zahlreiche Erscheinen in den Sessions und dem wahnsinnigen Feedback danach, so machen Konferenzen wirklich Spaß.

 

Links
IoC - VS 2013 Projekt
SA für die Praxis - VS 2013 Projekt
Softwarekomponenten - VS 2013 Projekt
Softwarekomponenten - Folien

ppedv Team Blog: IIS Express und FQDN

Mein aktueller Anwendungsfall einer ASP.NET Web-Anwendung benötigt statt dem üblichen localhost eine echte Domain als Namen. Wer aus Visual Studio eine Website startet, tut dies in der Regel mit IIS Express (früher Cassini Web Develeopment Server).

Dort wird ein zufälliger Port ausgewählt und in die universelle Konfiguration des IIS Express Web Servers in applicationhost.config eingetragen.

image

Den Speicherort der Datei findet man im Screenshot  des IIS Express (Task Bar – Notification Icons- Item- Rechtsklick). Um ein zweites Mapping einzutragen, wird diese Config Datei direkt per Notepad geöffnet. In den Bindings wird eine oder mehrere Bindungen aktiviert.

   1:    <bindings>
   2:  <binding protocol="http" bindingInformation="*:5376:localhost" />
   3:   <binding protocol="http" bindingInformation="*:80:ppedv.localtest.me" />
   4:  </bindings>

Die Adresse localtest.me zeigt immer auf die lokale localhost Adresse 127.0.0.1. und ist damit ein Trick eine echte Internet-Domain zu nutzen, ohne die Hosts-Datei oder schlimmeres zu beanspruchen. Port 80 ist nicht unbedingt erforderlich.

Wenn ein lokaler IIS installiert ist, fängt dieser per Universal Binding alle Domains auf der IP 127.0.0.1 ab. Auch ein Stoppen des www-Publishingdienst löst das Problem nicht. Erst wenn man einen Hostname im IIS Manager vorgibt, ist es anderen Websites möglich ein Binding durchzuführen.

image

Stolperstein #2 ist, dass Binden abseits von localhost auf IIS Express nur möglich ist, wenn IIS Express im Administrator Context läuft. Dazu muss Visual Studio als Administrator (rechte Maustaste runas Administrator) ausgeführt werden.

Im Ergebnis lauscht nun die Web App auf beiden URI

image

Dirk Primbs [MS]: Magic and Technology

I’m on my way to the developer week where I’ll have the opportunity to give the closing session. Usually this means quite tired developers who were running from tech session to tech session the entire day. Also it means that I’ll have the job to entertain while hitting a cord.

Alright. I’m up to the challenge :-)
My topic today: “Magic & Technology”

Truth is: When I’ve seen my first computer 25 years ago (oh boy… Now I’m feeling old), it seemed almost magical that there was a machine that could operate autonomously and follow detailed instructions. But even then at a time where I was not really skilled in tech it felt as if I could quickly figure out how the machine works. In fact after 3 years owning my zx81 I was sure that I knew anything worth knowing about it. I’m sure that this was the same for most people at the time. The computer was just a piece of complicated electronics but still quite dumb when it came to it.

The fascination never left me, but the magic did return only rare occasions. Until a few years ago the first intelligent assistants started appearing and technologies such as Kinect hit the shelves. There is just sooo much potential! And it indeed felt powerful to just say a command into thin air and see the technology respond. Then companies like Google came along and created huge data centers available to the everyday developer. Smartphones in everyone’s hands gave access to the world’s knowledge and the library of Alexandria looks like a toy compared to the databases available online.

This is impressive, but not quite magic yet.
What is magic then?

I think three components need to get together to create the feeling that something magical happens:

1. Performance – things are magic if they push the limits of today’s world. To be able to see through solid surfaces, move objects with a thought or span continents in milliseconds are in the league we’re looking for. Also if it happens practically effortless without waiting time… well… we’re not quite there yet of course :-)

2. Intelligence – magic usually comes with a positive surprise. It is either something unexpectedly useful or something really missing that is provided. Also with intelligence the lines between everyday environment and technology blur since it also means that technology should not require us to adapt to it. Hence it is in the background, understands our situation and offers help just in the right moment (or even helps completely unnoticed).

3. Simplicity – no matter how complex something is. If you’ll need to earn a degree to follow, it probably doesn’t feel all that magic. More importantly it is also less useful in the everyday world. Everything truly impressive I came across so far had a very simple idea and was accessible. This does not mean that it is easy to pull it off, I’m merely talking about the experience as user. Have a look at your navigational system and you understand what I mean. It takes satellite technology to route us through the world, yet I just say “Ok Google, bring me home” to my wrist watch to set it in motion.

The essence is this: If all these factors come together then the result feels like magic.
With the blink of an eye we’re today able to look at the world from space, talk to someone thousands of miles away, navigate unknown cities, see through solid materials, have machinery weighting tons following our commands. We make the lame walk, the dumb speak and the blind see. If this is not magic then nothing is!

And this is what changed in the last 3 years or so: I’ve seen more and more examples of the above being realised. And I’ll share some of them with the audience today. Boy, will I have fun!

Picture source: Flickr

The post Magic and Technology appeared first on Dirk Primbs Online.

Fabian Deitelhoff: Raspberry Pi: Speicherplatz der SD-Karte ausnutzen

Raspberry Pi LogoZum Raspberry Pi habe ich vor kurzem einen Beitrag verfasst, der sich um die Headless WIFI Konfiguration dreht. Nun geht es um vorgefertigte Distributionen, an die das Raspberry Pi Team ebenfalls gedacht hat. Die können kostenfrei heruntergeladen und mit einem beliebigen Tool auf die SD-Karte entpackt werden. Einfaches kopieren reicht nicht aus, denn die Distributionen liegen als Image vor.

Das Problem daran: diese vorgefertigten Distributionen sind an zwei Gigabyte große SD-Karten angelehnt. Die Partitionen, die erzeugt werden, sind dementsprechend nicht größer. Ich nutze für Tests gerne acht Gigabyte große Karten. Mehr Platz brauche ich, in der Testphase, nämlich selten. Wenn die Partitionen aber zu klein sind, wird viel Platz verschwendet. Genau dieses Problem hatte ich jetzt einige Male. Die Schritte, um das zu ändern, sind nicht sonderlich schwierig oder umfangreich. Deshalb bietet dieser Beitrag eine kleine Zusammenfassung der Kommandos und deren Bedeutung, um die Partitionen der SD-Karte auf die tatsächliche Größe der Karte anzupassen.

Das hier vorgestellte Verfahren funktioniert bei der original “Raspbian” Distribution, die von der Raspberry Pi Foundation heruntergeladen werden kann. Es besteht die Möglichkeit, dass alle Daten der SD-Karte verloren gehen beziehungsweise nicht mehr lesbar sind. Dazu reicht es aus, irgendwo eine Zahl falsch einzutippen. Wichtige Daten müssen vorher gesichert sein!

Der aktuelle Stand

Listing 1 zeigt den aktuellen Stand der Partitionen und deren Größe. Diese Tabelle lässt sich durch das Kommando df- h anzeigen.

Filesystem      Size  Used Avail Use% Mounted on
rootfs          2.6G  2.1G  430M  83% /
/dev/root       2.6G  2.1G  430M  83% /
devtmpfs        215M     0  215M   0% /dev
tmpfs            44M  228K   44M   1% /run
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs            88M     0   88M   0% /run/shm
/dev/mmcblk0p1   56M  9.5M   47M  17% /boot

Die ersten beiden Einträge zeigen deutlich, dass die jeweiligen Partition nur circa 2,6 Gigabyte groß ist. Und zudem schon zu 83% belegt ist. Für kleinere Spielereien reicht das. Für mehr allerdings nicht.

Partitionen löschen und neu anlegen

Bevor irgendwelche Partitionen in der Größe angepasst werden können, müssen die vorhandenen Partitionen zunächst gelöscht und neu erzeugt werden. Das bereitgestellte Image der Raspbian Distribution erzeugt von sich aus zwei Partitionen.

  • Eine Boot-Partition mit FAT32
  • Eine Linux-Partition mit EXT4

Die erste Partition ist von Windows Systemen aus sichtbar, wenn die SD-Karte gelesen wird. Sie enthält nur ein paar Dateien. Das eigentliche Linux-Dateisystem ist versteckt. Das folgende Kommando startet das Programm fdisk zum Partitionieren der SD-Karte, die mit mmcblk0 angegeben ist.

sudo fdisk /dev/mmcblk0

Einige Distributionen benötigen noch die -uc Option. Bei Raspbian ist das nicht der Fall. Erscheint eine Fehlermeldung, eventuell einfach noch mal mit -uc ausprobieren. Wenn fdisk gestartet ist, bitte p eingeben, um eine Liste aller Partitionen zu erhalten. Bei einer frischen Raspbian Installation sieht die Ausgabe wie in Listing 2 aus.

        Device Boot      Start         End      Blocks   Id  System
/dev/mmcblk0p1            8192      122879       57344    c  W95 FAT32 (LBA)
/dev/mmcblk0p2          122880     5785599     2831360   83  Linux

In der ersten Zeile wird die Boot-Partition angezeigt. Das ist diejenige, die wir auch sehen, wenn wir die SD-Karte unter Windows öffnen. Diese Partition soll intakt bleiben. Aber Nummer zwei geht es an den Kragen. Genauer gesagt muss die Partition gelöscht werden. Dabei gehen keine Daten verloren. Vorher aber bitte den Startsektor dieser Partition notieren. In dem Beispiel aus Listing 2 ist das der Wert 122880. Hier aber auf jeden Fall den Wert aus eurer Ausgabe notieren! Anschließend können wir mit dem Kommando d für delete, gefolgt von der Nummer der Partition, in diesem Fall also 2, die Partition löschen.

Jetzt brauchen wir eine neue, zweite Partition. Das gelingt über die Kommandos n für new, p für primär und dann die Nummer 2. Damit wird eine neue, primäre Partition mit der Nummer zwei angelegt. Das Programm fdisk fragt noch den Start- und den Endsektor ab, um die neue Partition anlegen zu können. Bei Start ist zwingend der oben notierte Wert einzugeben. Auf keinen Fall den Standard übernehmen, da es ansonsten mit der korrekten Zuordnung der Partitionen vorbei ist. Passiert das, am besten gleich die SD-Karte neu bespielen :). Als Endsektor einfach den Standard übernehmen. War das erfolgreich, sieht die neue Übersicht wie das Listing 3 aus. Diese Übersicht, wir erinnern uns, wird mit dem Kommando p ausgegeben.

        Device Boot      Start         End      Blocks   Id  System
/dev/mmcblk0p1            8192      122879       57344    c  W95 FAT32 (LBA)
/dev/mmcblk0p2          122880    15407103     7642112   83  Linux

Die beiden markierten Endsektoren aus Listing 2 und Listing 3 unterscheiden sich deutlich in dem Sinne, dass letzterer wesentlich größer ist. Genau das wollten wir auch erreichen. Zu guter Letzt bitte die neue Partitionstabelle mit dem Kommando w schreiben. Dabei sollte eine Fehlermeldung erscheinen, dass die Geräte in Verwendung sind. Hier hilft nur ein Reboot über das folgende Kommando:

sudo reboot

Dateisystem anpassen

Wenn der Raspberry Pi gebootet hat, ist es an der Zeit, dass Dateisystem an die neuen Gegebenheiten anzupassen. Dazu reicht das folgende Kommando, dass diese Aufgabe übernimmt:

sudo resize2fs /dev/mmcblk0p2

Grundsätzlich kann diese Aktion etwas Zeit in Anspruch nehmen. In diesem Beispiel, bei einer acht Gigabyte großen SD-Karte, dauerte der Vorgang aber lediglich einige Sekunden. Nun folgt die Endkontrolle. Der Befehl df -h zeigt wieder die Größe der vorhandenen Partitionen an. Die Ausgabe darf in Listing 4 bewundert werden.

Filesystem      Size  Used Avail Use% Mounted on
rootfs          7.2G  2.1G  4.8G  30% /
/dev/root       7.2G  2.1G  4.8G  30% /
devtmpfs        215M     0  215M   0% /dev
tmpfs            44M  228K   44M   1% /run
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs            88M     0   88M   0% /run/shm
/dev/mmcblk0p1   56M  9.5M   47M  17% /boot

Und wie wir sehen, ist die Root-Partition nun 7,2 Gigabyte groß, was einer acht Gigabyte großen SD-Karte entspricht. War doch gar nicht so schwer :).

Und nun der einfachere Weg

Jetzt kennen wir den manuellen Weg, der immer funktioniert. Zumindest so lange, wie alle notwendigen Tools vorhanden sind. Was aber bei normalen Distributionen immer der Fall sein sollte. Das oben beschriebene Prozedere kann allerdings auch voll automatisch durchgeführt werden. Dazu nach dem Anmelden am Raspberry Pi einfach das Kommando

sudo raspi-config

eingeben. Dadurch wird eine grafische Oberfläche zur Konfiguration gestartet, die in Abbildung 1 zu sehen ist.

Abb. 1: Die Raspberry Pi Konfiguration.

Abb. 1: Die Raspberry Pi Konfiguration.

Der wichtige Eintrag ist schon markiert. Mit “Expand Filesystem” werden genau die oben beschriebenen Aktionen ausgeführt. Es dauert auch nur ein paar Sekunden, bis die Meldung erscheint, dass die Partitionen angepasst wurden und nach einem Neustart aktiv werden. Wird die Konfiguration über finish beendet, erscheint auch direkt die Nachfrage, ob ein Neustart gewünscht ist. Nach diesem sind die neuen Partitionen in der richtigen Größe vorhanden. Auch das Dateisystem ist bereits angepasst. Es geht also auch einfacher :).

Fazit

Für mich ist das mittlerweile einer der ersten Schritte bei einem neuen Raspberry Pi beziehungsweise einer neuen SD-Karte. Da die meisten Distributionen auf zwei Gigabyte ausgerichtet sind, wird einfach zu viel Platz verschwendet. Im Moment nehme ich die Änderungen automatisch durch die Raspberry Pi Konfiguration vor. Ich hatte damit aber auch schon Probleme, weswegen ich hier den manuellen Weg beschrieben habe. In der Regel sollte die automatische Konfiguration aber keine Probleme bereiten.

Viel Spaß mit dem Raspberry Pi und den größeren Partitionen :).

Sven Hubert: Ideen für die Verwendung des MSDN Azure Freikontingents: Datensicherung

Unter Windows Azure steht für die Speicherung von Daten ein sogenannter Blob-Storage zur Verfügung. In diesem können vergleichbar zum Dateisystem Daten jeglicher Art abgelegt werden. Der Blob Storage ist auf hohe Performance und extrem hohe Verfügbarkeit ausgelegt. Er bildet das Rückgrat von Windows Azure für das Hosting von virtuellen Maschinen und den stabilen Betrieb von Diensten. Verglichen mit einfachen Speicheranbietern wie OneDrive oder Dropbox ist er aufgrund der völlig anderen Ausrichtung deutlich teurer. Abgerechnet wird abhängig vom Datenvolumen. Es fallen sowohl Kosten für die Speicherung als auch den Transfer aus dem Azure Rechenzentren heraus an. Die Speicherung von 100 GB Daten wird aktuell mit 1,79 € pro Monat veranschlagt. Das Freikontingent eines MSDN Premium Abo in Höhe von 75€ ermöglicht damit ein kostenloses Backup von bis zu 4 TB an Daten. Eine lohnenswerte Verwendung des MSDN Azure Freikontingents.

Der Blob-Storage wird über das Windows Azure Management Portal eingerichtet.

Einrichtung eines Blob-Speichers

Der Name muss wie gewohnt global eindeutig vergeben werden. Als Standort wählt man das nächstgelegene Rechenzentrum oder eine zuvor definierte Affinitätsgruppe aus.

Einrichtung eines Blob-Speichers

Es werden verschiedene Optionen für die Replikation der Daten angeboten. Unter lokal redundant wird eine mehrfache Spiegelung innerhalb eines Rechenzentrums verstanden. Bei einer Auswahl von Georedundant werden Kopien auch in einem zweiten Rechenzentrum, im Falle einer Auswahl von Westeuropa als primären Standort in Nordeuropa, vorgehalten. Die Kosten einer Georedundanten Datenhaltung liegen mit 3,58 € pro 100 GB deutlich höher. Die garantierte Verfügbarkeit steigt nur geringfügig von 99,9% auf 99,95%. Für die meisten Anwendungsfälle ist lokal redundant sicherlich ausreichend.

Für den Zugriff auf den Blob-Storage steht eine Vielzahl von Werkzeugen zur Verfügung. Eine einfache Möglichkeit stellt der Azure Storage Explorer dar. Zur Einrichtung des Zugriffs werden der Speicherkontoname sowie ein Zugriffsschlüssel benötigt.

Abruf der Zugriffsschlüssel

Einrichtung der Verbindung

Nach dem Herstellen der Verbindung kann ein Container eingerichtet werden.

Anlegen eines Containers

Für die Verwendung als Backup-Speicher ist eine Auswahl von Private sinnvoll. In diesem Fall hat nur der Inhaber des Schlüssels Zugriff auf die Daten.

Hochladen einer Date

Dateien können einzeln durch einen Klick auf Upload übertragen werden.

Deutlich komfortabler gestaltet sich die Arbeit mit dem Dienst durch eine Einbindung als Windows Laufwerk. Aktuell ist hierfür noch der Zugriff auf kommerzielle Lösungen wie z.B. dem CloudBerry Explorer notwendig.

Als skriptfähige Alternative biete sich das Kommandozeilenwerkzeug CloudCopy an. Durch eine Integration eines Aufrufs in den Windows Task Scheduler lässt sich somit z.B. der Inhalt eines ganzen Verzeichnisses sichern.

CloudCopy.exe "c:\backup\*.*" "https://aitbackup01.blob.core.windows.net/backup" "DefaultEndpointsProtocol=https; YccountName=aitbackup01; AccountKey=d5Icqp2Zlb1I/VmipH4TSKF/cagQ+wHTQ+y0rEX4aZ3fxFM/bteHk74 XmLBDl2UJchoYVgrNvb5zJ33Hp+Kn4Q=="

Die Einrichtung einer Backup-Lösung unter Windows Azure gestaltet sich damit sehr einfach. Dank dem Freikontingent ist diese zudem in den meisten Fällen kostenfrei.

Ideen für die Verwendung des MSDN Azure Freikontingents: Datensicherung is a post from: AIT Blog

Jürgen Gutsch: Fußball, Azure und ASP.NET

Eine Fußballreiche Zeit liegt hinter mir und ganz Fußballfrei wird es auch nicht weitergehen. Das WM Fieber hat meinen ersten Sohn gepackt und er spielt jetzt bei den Bambini im örtlichen Fußballverein mit.

Fußballreich, nicht nur durch die Weltmeisterschaft, welche die Deutsche Nationalmannschaft am 13. Juli mit einem hart erkämpften Erfolg für sich entschieden hat, sondern auch durch den Launch der neuen Website, des 17fachen Schweizer Meisters. Den Launch der Website des FC Basel.

Das gesamte Team der YooApps, von den Konzeptlern, den HTML- und .NET-Entwicklern bis hin zur QS und Projektleitung haben es in den letzten zwei Monaten in einem fast unmöglichen Kraftakt geschafft die Website online zu stellen. Wie auch bei der Deutschen Nationalelf wurde gekämpft, geschwitzt und geschimpft. Dennoch freute man sich über jeden noch so kleiner Erfolg, in dem das Projekt ein Stück vorwärts gebracht wurde. Einfach große Klasse, was in der Zeit entstanden ist, obwohl wir noch nicht komplett durch sind. So werden in den nächsten Tagen und Wochen unter anderem, der Fanbereich und der Liveticker nachgeliefert, um die Website weiter abzurunden. Und natürlich bin ich ein kleines bisschen Stolz auf das was wir als Team geleistet haben.

Infrastruktur auf Microsoft Azure

Nicht nur wir als Team mussten einen Kraftakt leisten, auch die Website selber muss während den Saisonspielen – vor allem während eines Champions League Spiels – enorme Zugriffszahlen aushalten und stabil laufen. Besonders der Liveticker ist von großem Interesse.

Um das zu erreichen, mussten wir, wie auch Yogi Löw, taktisch vorgehen. Pros und Cons gut abwägen. Hilfsmittel und Systeme mit Bedacht auswählen.

Dennoch war schnell klar, dass wir die Website auf Microsoft Azure heben müssen um die Website selber, aber auch die Datenbanken und File Storages beliebig skalieren zu können. Wir haben uns dafür entschieden, das CMS auf einer Azure Website zu hosten um einfacher und schneller skalieren und deployen zu können, auch wenn wir dadurch weniger Kontrolle über die Plattform haben als z. B. in einer Web Role.

Continouous Integration und Deployments per Git auf eine Azure Website ist einfach genial uns schnell. So lassen wir drei Haupt-Branches (Dev, QA und Master) auf drei entsprechende Website Instanzen laufen, um uns abzusichern. Entwickelt wird ausschließlich isoliert in Feature-Branches.

Das CMS setzt eine SQL Database voraus, in die wir 10.000 News aus dem alten System migrieren mussten. Über 80.000 Bilder mussten aus dem alten System in das neue Migriert werden. Zum Glück ist das CMS “Azure-Ready” und die Anbindung an den Azure Blob Storage war ein Kinderspiel.

Auf diese Art haben wir die komplette Website auf drei verschiedene, schnelle, hochverfügbare und skalierbare Azure Services verteilt: Azure Website, SQL Database und Azure Blob Storage.

Ein schönes Feature, dass wir für das Deployment auf die Produktiv-Instanz nutzen sind die Deployment-Slots die man für eine Website einrichten kann. So wird der Master-Branch nie direkt auch die Produktiv-Instanz publiziert, sondern erst auf den freien Deployment-Slot. Bei Erfolg, können dann – ähnlich wie bei einer Web-Role – die Instanzen “geswopt” werden. Der Deployment-Slot wird unterbrechungsfrei zur Produktiv-Instanz.

Etappensieg

Der Launch letzte Woche war, im Gegensatz zum gestrigen WM-Finale, aber noch kein Endspiel, sondern ein nur ein – wenn auch ein wichtiger – Etappensieg. Ab jetzt wird nicht mehr mit Fußball verglichen, sondern eher mit der Tour de France: Die schwierigste Bergetappe haben wir hinter uns, es folgt eine weitere kurze Etappe mit Einzelsprints, um dann auf weiteren eher flachen Etappen auf die Zielgerade zu kommen. ;)

Johnny Graber: SyncToy: Ein kleiner Backup-Helfer

An Backups denkt man in der Regel erst wenn es zu spät ist. Vorher ist es immer zu aufwändig und man glaubt eh keine wichtigen Dateien zu haben die nicht noch irgendwo anders gespeichert sind. Um nicht eines besseren belehrt zu werden würde es genügen die Daten nur regelmässig auf ein externes Laufwerk zu sichern.
Mit SyncToy gibt es ein kleines Programm das genau für diesen Zweck gemacht wurde.

 

Download und Installation

SyncToy kann bei Microsoft als 32 oder 64bit Version heruntergeladen werden. Welche Version man wählt spielt keine Rolle. Bisher konnte ich keine Unterschiede feststellen die über das Installationsverzeichnis hinausgehen (Programme oder Programme (x86)).

Der Installationsdialog ist erstaunlich umfangreich und will sehr viele Bestätigungen. Wiederholtes klicken auf “Next” genügt zur Installation allerdings vollkommen.

 

Konfigurieren

Nach dem ersten Start begrüsst einem dieser einfache Dialog mit der Aufforderung ein Verzeichnispaar zu erstellen:

SyncToy

Der Dialog zum Erzeugen des Verzeichnispaares unterscheidet zwischen linkem (Left) und rechtem (Right) Ordner. Um meinen persönlichen Ordner zu sichern wähle ich diesen als linken Ordner aus und als rechten Ordner das Verzeichnis “Z:\Air\User.JGR”:

SyncToy 1. Schritt

Rechter und linker Ordner sind wenig gebräuchliche Begriffe. “Quelle” und “Ziel” dürfte einem bekannter sein. Allerdings kommt es sehr darauf an was man mit diesen beiden Ordnern machen will. Dies legt man auf dem 2. Schritt fest:

SyncToy 2. Schritt

Zur Auswahl stehen einem diese Optionen:

  • Synchronize: Neue, veränderte und gelöschte Dateien werden in beide Richtungen synchronisiert.
  • Echo: Veränderungen (hinzufügen, löschen, verändern) im linken Ordner werden auf den rechten appliziert.
  • Contribute: Nur neue und veränderte Dateien aus dem linken Ordner werden in den rechten Ordner übertragen. Im linken Ordner gelöschte Dateien bleiben im rechten Ordner erhalten.

Welche Option man auswählen soll hängt ganz vom Einsatzweck ab. Echo und Synchronize unterscheiden sich dadurch ob auch mit dem rechten Ordner gearbeitet wird. Ist dies der Fall sollte man Synchronize verwenden. Will man die Ordner nur 1:1 sichern genügt Echo.
Contribute kann einem dabei helfen auch gelöschte Dateien zurück zu holen. Da keine Dateien gelöscht werden muss man sich selber ums aufräumen kümmern.

 
Zum Abschluss benötige dieses Ordnerpaar noch einen Namen, unter dem man später die beiden Verzeichnisse identifizieren kann:

SyncToy 3. Schritt

 

Ordner synchronisieren

SyncToy lässt einem die Ordnerpaare einzeln oder gemeinsam ausführen. Letzteres ist vor eine Arbeitserleichterung da man sich nicht an alle gemachten Änderungen erinnern muss. Je nach Anzahl Änderungen, der Datenmenge oder der Geschwindigkeit des angehängten Laufwerkes muss man sich nach einem Klick auf “Run all” ein wenig gedulden:

SyncToy Resultat

 

Fazit

Mit SyncToy gibt es ein kleines Tool mit dem man einfach seine Daten sichern kann. Nach einer einmaligen Konfiguration genügt dafür ein einziger Klick. Dennoch ist es flexibel genug um auch spezielleren Wünschen bei der Synchronisierung Rechnung zu tragen.

Empfehlung: Unbedingt ausprobieren!


Einsortiert unter:dnugBern, Tools, webDotNet Tagged: .Net, Beschleuniger

Norbert Eder: Link-o-licious #6

Ich habe wieder einige interessante Links, die ich mit euch teilen möchte. Dieses Mal dreht sich sehr viel um das Thema *Go*, da ich mich aktuell vermehrt damit beschäftige und den einen oder anderen Test damit mache.

The post Link-o-licious #6 appeared first on Norbert Eder.

ppedv Team Blog: MVC 4 – Ein View für Create und Edit

Meist sind die Datenoperationen für Create und Edit gleich. Zumindest an der Oberfläche. Daher ist es naheliegend wenn man einen View für beide Operationen nutzen möchte. Das Visual Studio legt aber per Default immer zwei Views an.

Mit wenig Änderungen kann jedoch ein simpler Edit-View auch für die Datenanlage verwendet werden. Die Grundidee ist, dass es eine Eigenschaft im Datenobjekt gibt, die anzeigt, ob das Objekt neu ist, oder bereits vor dem Aufruf des Views bestand. In meinem BSP verwende ich den ID, der bei einem neuen Objekt auf –1 gesezt wird. Dafür habe ich eine “mini-Factory”-Klasse geschrieben:

    public static class DatenFactory
    {
        public static Daten GetDatenForID(int i)
        {
            Daten dat= new Daten()
            {
                ID =i,
                Name="Martin Groblschegg",
                Firma ="ppedv"
            };
            return dat;
        }

        public static Daten GetNewDaten()
        {
            Daten dat = new Daten()
            {
                ID = -1,
                Name = "",
                Firma = ""
            };
            return dat;
        }
    }

Das Datenobjekt selbst (die Klasse Daten) ist so simpel, dass ich sie hier nicht zeigen muss. Eine Klasse mit den Properties ID, Name und Firma.

DatenController

Nun zum DatenController. Dieser bekommt drei Actions: Edit, New und CreateOrEdit. CreateOrEdit ist die Action, die vom Formular aufgerufen wird.

Edit bekommt die ID des zu editierenden Objekts. Mit Hilfe der Factory wird das Objekt aus dem Store geholt und danach dem View mit dem Namen “EditOrCreate” übergeben:

        public ActionResult Edit(int id)
        {
            Daten daten = DatenFactory.GetDatenForID(id);
            return View("EditOrCreate",daten);
        }

 

Die Action New arbeitet ähnlich, jedoch wird keine ID übergeben und das Objekt neu gebildet und diese hat daher den ID –1:

        public ActionResult New()
        {
            Daten daten = DatenFactory.GetNewDaten();
            return View("EditOrCreate", daten);
        }

Die letzte Action ist die CreateOrEdit-Action, die vom Formular aufgerufen wird:

        [HttpPost]
        public ActionResult CreateOrEdit(Daten dat)
        {
            
            if(dat.ID <0)
            {
                // Neu in DB Anlegen
                DBHandling.NewDaten(dat);
            }
            else
            {
                // Update in Datenbank
                DBHandling.UpdateDaten(dat);
            }
            return RedirectToAction("Index", "Home");
        }

Create-Or-Edit-View

Als nächstes muss der View angelegt werden. Im Add View Dialog wird der ViewName auf “EditOrCreate” gesetzt. Als Template wird das “Edit” Template gewählt und die Model-Class ist die Daten-Klasse:

image

Im View ist die Zeile "@using (Html.BeginForm())” zu finden. Diese muss angepasst werden, sodass im Post die “CreateOrEdit” Action des Daten-Controllers aufgerufen wird. Die Zeile lautet also richtig:

@using (Html.BeginForm("CreateOrEdit", "Daten"))

 

Mit diesen Änderungen ist der Controller und View fertig. Um es zu testen, wird nach der Start-View angepasst, um die beiden Actions aufzurufen. New wird ohne Parameter aufgerufen und Edit erhält einen Parameter ID mit dem Wert 123.

<ul class="nav navbar-nav">
<li>@Html.ActionLink("Neu", "New", "Daten")</li>
<li>@Html.ActionLink("Edit", "Edit", "Daten", new {ID=123}, null)</li>
</ul>

 

Sourcecode

Den gesamten Code gibt es in meinem OneDrive zum Download. (Link zum Download). Die NuGet-Packs wurden entfernt und müssen neu geladen werden.

Klaus Aschenbrenner: My upcoming speaking schedule

(Be sure to checkout the FREE SQLpassion Performance Tuning Training Plan – you get a weekly email packed with all the essential knowledge you need to know about performance tuning on SQL Server.)

Over the next weeks and months I have an incredible speaking schedule around the whole world. You have plenty of opportunities to meet me in person, and discuss performance related topics in SQL Server.

My first stop is this week in Telford/UK for the SQLBits conference. I have been speaking at SQLBits for ages – I think my first conference participation was around 2009. On Friday I speak about “Latches, Spinlocks & Latch Free Data Structures” in SQL Server. If you have followed my blog postings over the last weeks, you can already see what to expect in this session. I will also show you a concrete example of Spinlock Contention in SQL Server, how you can troubleshoot, and finally solve it. On Saturday I have an additional session where I talk about “The Dangerous Beauty of Bookmark Lookups”. Bookmark Lookups are very powerful in SQL Server, but have a huge amount of side-effects. In this session we will concentrate on these side effects, and I will show you how you can overcome the various problems.

At the beginning of September I’m traveling for the first time in my life to the other hemisphere of the Earth – my trip brings me to Cape Town in South Africa, where I’m speaking at the SQLSaturday #301. On Friday, September 5 I give a whole day-long precon about “Practical SQL Server Performance Troubleshooting“, the precon that I have delivered in 2012 at the SQLPASS Summit in Seattle. In this precon we will work with a typical OLTP workload (based on the TPC-E benchmark), and work throughout the whole day to identify performance bottlenecks in SQL Server, and finally solve them – completely transparent to the workload itself. Be sure to register for my precon.

Two weeks after Cape Town, I’m flying to Dublin and delivering a precon and a regular session at the SQLSaturday #310 (September 19 – 20). My precon is about “Performance enhancements in SQL Server 2014“. Large parts are about the new cardinality estimator, and of course I will also talk about In-Memory OLTP and “Clustered” Column-Store Indexes. Dublin is always fun, and the recovery process afterwards is always very long – there is no fast recovery available ;-)

For the first time in my life I have also the honor to be a speaker at the SQL Server Days in Belgium (September 30 – October 1). I have already heard a lot of good things about this conference, so I’m really looking forward to be part of it, and delivering a session. My session will be about “Latches, Spinlocks and Latch Free Data Structures” – the same that I deliver this week in Telford/UK. If you miss SQLBits, there is still a chance to see this session once again in Europe.

The week after Belgium I will present at the SQLdays Conference in Munich/Germany (October 7 – 9), where I will deliver on Tuesday the same precon as in Cape Town – “Practical SQL Server Performance Troubleshooting“. I’m already looking forward to this conference, because I have known the owners for ages, and it’s a very nice conference in Germany.

At the beginning of November I travel to the west and flying to Seattle for the SQLPASS Summit, where I will also deliver my Latches, Spinlocks, and Latch Free Data Structures session. For me it’s the 7th participation as a speaker (I delivered my 1st session in 2006), so I’m already feeling like an old-timer. Maybe it is a coincidence that I’m losing hairs, and turning grey… ;-) The SQLPASS Summit is always an amazing experience, because it’s the largest SQL Server conference in the universe (assuming that only we on earth use SQL Server). I’m already looking forward to meeting all my friends and Twitter followers again in person.

As you can see I have an amazing and very time consuming speaking schedule over the next weeks and months. But that’s not all. In addition to my conference participations I also deliver 5 SQLpassion workshops in the autumn. I’m very proud to deliver my brand new SQL Server Query Tuning Workshop 4 times across Europe. This workshop covers the query tuning aspect of SQL Server, without going into DBA related topics. The main audience for the workshop is a SQL Server developer. I talk for 4 days about execution plans, execution plans, and execution plans. If you want to know the nasty details about SQL Server, I have my more in-depth SQL Server Performance Tuning & Troubleshooting Workshop, which covers all aspects of how to tune your complete SQL Server installation. It’s a more DBA centric course. Here are the dates and locations for my SQLpassion workshops:

  • SQL Server Query Tuning Workshops
    • October 13 – 16 in Zurich/Switzerland
    • October 20 – 23 in London/UK
    • October 27 – 30 in Vienna/Austria
    • November 17 – 20 in Utrecht/Netherlands
  • SQL Server Performance Tuning & Troubleshooting Workshop
    • November 24 – 28 in Antwerpen/Belgium

Besides that I’m using the quiet summer time for the various session preparations, and of course for preparing my new SQL Server Query Tuning Workshop. But my life doesn’t consist only of SQL Server. Besides my SQL Server business I run my Boeing 737-800 flight simulator, and I do a huge amount of DSLR photo/video shooting. I just ordered some books about Astrophotography and Time Lapsing. Imagine what you can expect when you combine both things together. Do you have ever seen stars during the day?

Stars in the Sky

And because I’m crazy I have started to run about a month ago. I already make a very good progress, and I’m hopefully able to complete my first 5k run in a few weeks!

Thanks for reading!

-Klaus

codefest.at [MS]: Visual Studio Engineering Stories

imageAgile Development ist eine Reise, und nicht etwas auf das man von einem auf den anderen Tag einfach komplett umstellt. Die Engineering Story “Scaling Agile accross the enterprise” zeigt wie die Reise der Developer Division bei Microsoft ausgesehen hat, wie unsere Kunden von den schnelleren Release Zyklen profitieren und wie man selbst in diese Richtung gehen kann, um in letzter Konsequenz effizienter und wettbewerbsfähiger zu sein.

P.S: Runterscrollen hilft Smile with tongue out 

Andreas Pollak
Product Marketing Manager Visual Studio (Entwicklungs- und Testwerkzeuge)
clip_image001

Leader im Magic Quadrant für ALM

Karsten Kempe: TFS2013 – Test WorkItem Creator

Neulich habe ich für ein internes Projekt ein Test-Set mit einer großen Anzahl von Work Items benötigt. Und da ich nicht nur einfach Product Backlog Items und ein paar Bugs anlegen wollte, sondern eine komplette Work Item Hierarchie benötigte, beschloss ich eine kleine Konsolenanwendung zu schreiben, die das für mich erledigt. Wie sonst hätte ich zweitausend Work Items innerhalb weniger Minuten anlegen sollen?

Für ein internes Projekt benötigte ich eine durchgängige Work Item Hierarchie, angefangen bei Feature Work Items bis hin zu Task Work Items. Ausserdem sollten auch Bug Work Items unterhalb eines Features auftauchen und Test Cases zu einigen Product Backlog Items verlinkt sein.

TFS Backlog ViewAbbildung 1: TFS2013 Feature to Task drill-down

Für eine kleine Menge kann man das noch gut mit der Hand erledigen, aber wenn man mehrere Hundert Work Items haben will, dann lohnt es sich ein kleines Tool zu schreiben, welches die Arbeit für einen erledigt.

Die wichtigsten Zeilen Code möchte ich hier kurz vorstellen. Das Programm könnt Ihr Euch gerne von hier runterladen und verwenden. Ebenso könnt Ihr mir gerne auch Anregungen hinterlassen, wie sich das Tool sinnvoll erweitern lässt. Wahrscheinlich kann man noch ordentlich an der Performance-Schraube drehen, aber das war mir jetzt nicht so wichtig…

Folgende References werden für die Anwendung benötigt:

  • Microsoft.TeamFoundation.WorkItemTracking.Client.dll
  • Microsoft.TeamFoundation.Client.dll

Für das Erzeugen von Work Item Titeln und Beschreibungen verwende ich eine externe Komponente, den NLipsum-Generator, die ich über NuGet in mein Projekt eingebunden habe.

Als Erstes muss eine Verbindung zur Team Project Collection aufgebaut und der Work Item Store geladen werden, bevor man das Team Projekt auslesen kann:

TfsTeamProjectCollection tfsCollection = new TfsTeamProjectCollection(
   new Uri(serverUrl));
tfsCollection.EnsureAuthenticated();
WorkItemStore store = (WorkItemStore)tfsCollection.GetService(
   typeof(WorkItemStore));
Project project = store.Projects[projectName];

Zum Anlegen eines Work Items muss zunächst der Work Item Typ ausgewählt und dann ein Work Item für diesen Typ erstellt werden.

WorkItemType wiType = project.WorkItemTypes[workItemType];
 
// Create the work item.
{
Title =  string.Join(" ", gen.GenerateWords(4)),
Description =  gen.GenerateLipsum(4, Features.Sentences"")
};

Je nachdem welches Work Item gerade erstellt worden ist, muss noch eine Verknüpfung zu anderen Work Items vorgenommen werden. Um eine Hierarchie von Feature, Product Backlog Item und Task aufzubauen, wird eine Parent-Child-Beziehung benötigt.

WorkItemLinkType hierarchyLinkType = 
   store.WorkItemLinkTypes[CoreLinkTypeReferenceNames.Hierarchy];
subItem.Links.Add(new WorkItemLink(hierarchyLinkType.ReverseEnd, parentId));
return hierarchyLinkType;

Eine Verknüpfung von einem Test Case zu einem Product Backlog Item erfolgt in der Regel über eine “Tests”-Beziehung oder von PBI zu Test Case über eine “Tested by”-Beziehung.

WorkItemLinkTypeEnd hierarchyLinkType = 
   store.WorkItemLinkTypes.LinkTypeEnds["Tests"];
workItem.Links.Add(new WorkItemLink(hierarchyLinkType, relationId));

Den Source Code gibt es hier zum Download.
Viel Spaß und happy testing!

ppedv Team Blog: Facebook-Login in ASP.NET Webforms

Die Welt bleibt nicht stehen. Das Nutzungsverhalten von Websites ändert sich. Das durchaus bewährte ASP.NET Membership Provider System wird durch ASP.NET Identity abgelöst. Wer heute mit Visual Studio 2013 ein neues Web Projekt anlegt, findet die komplette Benutzerverwaltung voreingerichtet - basierend auf Microsoft.AspNet.Identity.

Das Modul wird in der Datei IdentityConfig aus dem Verzeichnis App_Start hochgefahren. Dort kann man auch die unsäglich strikte Passwort-Policy aufweichen.

   1:     manager.PasswordValidator = New PasswordValidator() With {
   2:            .RequiredLength = 1,
   3:            .RequireNonLetterOrDigit = False,
   4:            .RequireDigit = False,
   5:            .RequireLowercase = False,
   6:            .RequireUppercase = False
   7:          }

 

Die Struktur bzw. die Eigenschaften des Benutzers werden in der Klasse ApplicationUser der Datei IdentityModels vorgegeben. Entsprechend des Code First Paradigmas des Entity Frameworks und der Einstellung aus der Web.Config wird dann die Datenbank automatisch angelegt.

   1:  <connectionStrings>
   2:      <add name="DefaultConnection" 
connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=
|DataDirectory|\aspnet-WebFormsIdentity-20140712075341.mdf;
Initial Catalog=aspnet-WebFormsIdentity-20140712075341;Integrated Security=True"
   3:        providerName="System.Data.SqlClient" />
   4:    </connectionStrings>

 

In der Datei StartUp.Auth.vb sind Methoden für Twitter, Google und Facebook vorkonfiguriert, aber auskommentiert.

   1:   app.UseFacebookAuthentication(
   2:   appId:=ConfigurationManager.AppSettings("FacebookId"),
   3:   appSecret:=ConfigurationManager.AppSettings("FacebookSecret"))

Die Authentication Methode erwartet zwei Parameter, die ID und das Secret. Anders als eine Benutzername-Passwort-Kombination ist diese sozusagen das Login einer Anwendung. Der Benutzer sieht diese Daten nicht und entsprechend macht es Sinn, diese in die Web.Config auch aus dem Code auszulagern.

Im nächsten Schritt muss der Entwickler eine App bei Facebook anlegen, um die Parameter ID und Secret zu generieren. Es wird also ein Facebook-Account benötigt. Einstiegspunkt ist das FB Developer Portal.

Nachdem die App per New App erstellt wurde, können die beiden Parameter aus dem Formular kopiert werden.

image

Wer jetzt loslegt, wird eine Fehlermeldung im Browser erhalten.

Die Anwendungseinstellungen lassen die angegebene URL nicht zu: Eine oder mehrere URLs sind in den Einstellungen der App nicht zugelassen. Sie müssen mit der Website-URL oder der Canvas-URL übereinstimmen, oder die Domain muss Subdomain einer der App-Domains sein.

Dazu muss man wissen, dass eine sogenannte 2-Legs-Authentifzierung auf Basis von OAuth2 zum Einsatz kommt. Im Kern übernimmt ein Provider – hier Facebook – die Anmeldung und reicht dann einen Zugangstoken an die aufrufende Website weiter. Dazu ist es aber nötig, Facebook die URL der aufrufenden Website mitzuteilen.

Die Einstellung wird im Developer Portal von Facebook in den Settings der App vorgenommen.

image

Die hier gewählte lokale URL ist natürlich nicht praxistauglich.

Der Login Dialog der ASP.NET Website erzeugt nun einen zusätzlichen Button für den Facebook-Login auf der rechten Seite.

image

Folgerichtig wird das Passwort in der Tabelle ASPNetUsers auch frei gelassen. Nur ein lokaler Benutzer kann auch ein Passwort besitzen, das per Hash verschlüsselt gespeichert wird.

image

Mario Noack: Große Aufzählungen im .NET Framework

Neulich wurde ich mit der Definition einer besonders umfangreichen Aufzählung konfrontiert. Da hierfür die magische 32Bit Grenze überschritten wurde, war ich skeptisch. Ein Test ergab, das diese Skepsis in der Tat berechtigt war. Folgende Deklaration:

public enum Big
{
    Small = 1 << 1,
    Medium = 1 << 8,
    Large = 1 << 40
}

erzeugt dann das Problem. Bis hier:

var enumTest = Big.Small;
Debug.Assert(enumTest == Big.Small);
enumTest = Big.Medium;
Debug.Assert(enumTest == Big.Medium);
enumTest = Big.Large;
Debug.Assert(enumTest == Big.Large);

erscheint alles in Orndung, ein Ausgabetest:

var enumTest = Big.Small;
Console.WriteLine(enumTest);
enumTest = Big.Medium;
Console.WriteLine(enumTest);
enumTest = Big.Large;
Console.WriteLine(enumTest);

zeigt aber dann das Problem. Die Definition Medium und Large sind intern identisch:

Small
Medium
Medium

Zur Lösung des Problems muss man zwei Änderungen durchführen. Einmal ist der Aufzählungstyp von long abzuleiten und die Basiszahl für die Bitverschiebung muss ebenfalls eine long-Zahl sein:

public enum Big: long
{
    Small = 1L << 1,
    Medium = 1L << 8,
    Large = 1L << 40
}

Das Ergebnis bestätigt die korrekte Ausführung. Bei der Nutzung von 64 Bit ist aber dann vorerst wirklich Schluss!

Lars Keller: Building Apps for Windows Blog Post - DEVELOPER SPEAK: Nowak and Keller help enterprises & IT Professionals become more efficient using Windows Phone 8.1

Peter und ich haben auf der //BUILD/ 2014 ein Interview zu unseren Erfahrungen bei der Windows Phone 8.1 Entwicklung mit Universal Apps gegeben.

Viel Spaß beim Lesen:

http://blogs.windows.com/windows/b/buildingapps/archive/2014/06/25/developer-speak-nowak-and-keller-help-enterprises-amp-it-professionals-become-more-efficient-using-windows-phone-8-1.aspx?utm_source=twitterfeed&utm_medium=Twitter

Holger Sirtl: Kostenlose eBooks zu diversen Microsoft Technologien (einschließlich Microsoft Azure)

Eric Ligman hat auf seinem letzten Blogpost eine umfangreiche Liste kostenlos verfügbarer eBooks zusammengestellt. Ich möchte die Gelegenheit nutzen, hier die speziell für Microsoft Azure relevanten eBooks aufzulisten. Viel Spaß beim Downloaden!!!

image Building an On-Demand Video Service with Microsoft Azure Media Services

EPUB
MOBI
PDF

image Deploy SQL Server Business Intelligence in Windows Azure Virtual Machines

PDF
Source Content
image Building Real World Cloud Apps With Windows Azure

PDF
image Cloud Design Patterns: Prescriptive Architecture Guidance for Cloud Applications

PDF
EPUB
MOBI
Code samples
Source content
image Introducing Windows Azure for IT Professionals

PDF
EPUB
MOBI
Companion Files
image Rethinking Enterprise Storage: A Hybrid Cloud Model

PDF
EPUB
MOBI
image Introducing Microsoft Azure HDInsight

PDF
EPUB
MOBI
image ASP.NET Multi-Tier Windows Azure Application Using Storage Tables, Queues, and Blobs

EPUB
MOBI
PDF
image Developing Modern Mobile Web Apps

EPUB
MOBI
PDF
image Moving Applications to the Cloud, 2nd Edition

PDF
EPUB
MOBI
image Windows Azure Service Bus Reference

PDF
EPUB
MOBI
image Autoscaling Application Block and Transient Fault Handling Application Block Reference

EPUB
MOBI
PDF
image Create Your First Application: Node.js and Windows Azure

PDF
image Developing Multi-Tenant Applications for the Cloud on Microsoft Azure – 3rd Edition

PDF
image Drupal on Windows Azure

EPUB
MOBI
PDF
image Exploring CQRS and Event Sourcing: A journey into high scalability, availability, and maintainability with Windows Azure

PDF
Sourcecode
image Migrating Data-Centric Applications to Windows Azure

EPUB
MOBI
PDF
image Moving Applications to the Cloud on Windows Azure (3rd Edition)

PDF
image Using Windows Azure Mobile Services to Cloud-Enable your iOS Apps

EPUB
MOBI
PDF
image Using Windows Azure Mobile Services to Cloud-Enable Your Windows Phone 8 Apps

EPUB
MOBI
PDF
image Using Windows Azure Mobile Services to Cloud-Enable your Windows Store Apps in C#

EPUB
MOBI
PDF
image Using Windows Azure Mobile Services to Cloud-Enable Your Windows Store Apps in JavaScript

EPUB
MOBI
PDF
image Windows Azure and SQL Database Tutorials

EPUB
MOBI
PDF
image Building Hybrid Applications in the Cloud on Windows Azure

PDF
image Building Elastic and Resilient Cloud Applications - Developer's Guide to the Enterprise Library 5.0 Integration Pack for Windows Azure

PDF
EPUB
MOBI

Weitere Informationen

ppedv Team Blog: Den zweitbesten per TSQL finden

Das passt ja fast zur Fussball-Weltmeisterschaft. Ein Teilnehmer einer ppedv Schulung schreibt mir:

“Ich habe da eine „knifflige“ Aufgabe in der Firma, wo ich mit meinem bescheidenen SQL-Wissen nach ein paar Stunden nicht mehr weiter komme. Ich kann's natürlich über Umwege lösen, glaube aber dass man das mit einem sql query oder sql query + stored procedure oder function auch zusammenbringt.”

Kurz zusammengefasst: eine SQL Abfrage im Microsoft SQL Server soll den zweiten Wert liefern. Die Frage war mir neu und mein SQL-Wissen auch ein wenig eingerostet - teilweise war es auf dem Stand von SQL 2000. Seit 2005 ist aber RowNum hinzugekommen und seit 2012 auch ein Offset-Kommando, um in Kombination mit z.B. TOP /Group By einfach einen Datensatz zu überspringen. So zunächst mein erster Gedanke.

Die Ausgangstabelle

   1:  CREATE TABLE [dbo].[KickiTest](
   2:      [ID] [int] IDENTITY(1,1) NOT NULL,
   3:      [Ergebnis] [bit] NULL,
   4:      [Datum] [datetime] NULL,
   5:      [Seriennummer] [int] NULL
   6:  ) ON [PRIMARY]

Die Daten

image

Abfrage: Für alle Geräte, deren Ergebnis positiv ist, der zweite Datensatz. Wenn dieser nicht vorhanden ist, wird der erste abgefragt. 

Die Lösung verwendet die generierte Zeilennummer in Kombination mit einem Zähler

   1:  WITH tmp  AS (SELECT ID, Ergebnis, Datum, Seriennummer,
   2:         anzahl= Count(seriennummer) OVER(PARTITION BY seriennummer) ,
   3:          ROW_NUMBER() OVER (PARTITION BY seriennummer 
ORDER BY seriennummer,datum) AS RowNum
   4:          FROM   KickiTest where ergebnis=1) 
   5:   
   6:   
   7:  SELECT ID, Ergebnis, Datum, Seriennummer,rownum,anzahl
   8:  from tmp
   9:  where (anzahl = 1) or (anzahl>1 and rownum=2) 

 

Sven Hubert: Ein früherer Zustand von Work Items auf einen Blick

Ausgangssituation

Eine Stärke des Team Foundation Servers ist, dass nahezu alle Aktivitäten an Elementen, sei es versionierter Quellcode oder Work Items, nachvollzogen werden können. Bei den Work Items gibt es dafür die History-Anzeige, die bei den Standard Process Templates in jedem Work Item verfügbar ist.

Möchte man nun den Zustand eines Work Items aus der Vergangenheit sehen, so stellt man schnell fest, dass man zwar im History Feld alle Änderungen nachvollziehen kann, diese jedoch chronologisch aufgelistet sind. Man sieht jedoch lediglich die geänderten Felder, nicht aber die unveränderten. Durch die einzelnen Historieneinträge zu navigieren kann dabei sehr unhandlich sein. Der ganzheitliche Blick auf ein Work Item in der Vergangenheit bleibt verwehrt.


Anwendungsfälle

Hin und wieder kommt es vor, dass man den früheren Zustand eines Work Items sehen möchte. Dies kann vorkommen, wenn man auf frühere Inhalte zurückgreifen möchte, das Work Item jedoch bereits mehrfach in verschiedenen Feldern verändert wurde.

Ein anderer Grund ergibt sich, wenn man zusätzliche Werkzeuge, wie z.B. das mit dem INNOVATIONSPREIS-IT 2014 ausgezeichnete Tool AIT WordToTFS einsetzt. Wenn man zu einem bestimmten Zeitpunkt ein Word-Dokument generiert, so enthält es häufig eine kleine Auswahl an Feldern eines Work Items (siehe Abbildung 1).

Abbildung 1: Work Item im Word Dokument

Abbildung 1: Work Item im Word Dokument

Wie im Screenshot zu sehen ist, handelt es sich um das Work Item mit der ID 226 in der Revision 6. Im konkreten Beispiel liegt das Work Item im TFS mittlerweile in Revision 7 vor. Um jedoch die anderen Feldwerte des Work Items in der spezifischen Revision 6 zu sehen, benötigt man eine historische Sicht auf diese frühere Revision des Work Items.

Lösung

Bei einer Online-Recherche zu dem Thema findet man viele Anleitungen und nützliche Blog-Posts, wie man die Work Item History über die TFS-API auslesen kann. Wer jedoch nicht selbst programmieren möchte und die damit verbundene Flexibilität nicht benötigt, kann auf eine alternative TFS-Webseite zugreifen. Die gesuchte historische Sicht auf eine spezifische Revision eines Work Items ist nämlich out-of-the-box vorhanden.

Im oben genannten Beispiel von AIT WordToTFS ist die Anzeige auf direktem Wege zu erreichen. Dafür wird die Revisionsnummer als Hyperlink im Word-Dokument angezeigt, über den man direkt zu dieser alternativen TFS-Webseite navigieren kann.

Der Aufruf ist natürlich auch manuell für jedes vorhandene Work Item möglich. Unter dem folgenden URL-Muster lässt sich besagte Webseite aufrufen:

https://<Server>/<TeamProjectCollection>/WorkItemTracking/workitem.aspx?artifactMoniker=<id>&Rev=<revision

Der erste Teil der URL (<Server> und <TeamProjectCollection”">) entspricht der URL der Team Project Collection. <id> muss durch die Work Item ID und <revision> durch die gewünschte Revisionsnummer des Work Items ersetzt werden.

Lässt man den letzten Parameter des Query Strings in der URL weg, so wird die aktuelle Revision des Work Items angezeigt. Mit Angabe des Rev-Parameters kann man die Revision explizit angeben.

Im nachfolgenden Beispiel ist bei einem Work Item das Feld Area Path und dabei die Revision 6 auf die Revision 7 verändert worden (siehe Abbildung 2).

Abbildung 2: Vergleich zweier Work Item Revisionen

Abbildung 2: Vergleich zweier Work Item Revisionen

In der Abbildung ist rechts die Revision 6 und links die Revision 7 zu sehen. Bei (1) ist die Änderung des Area Paths zu sehen. (2) markiert die Änderung der Revisionsnummer. Alle anderen gelb hervorgehobenen Felder sind die weiteren automatisch veränderten Felder. Alle nicht hervorgehobenen Felder sind in dem Falle unverändert geblieben. Sie werden in dieser Ansicht jedoch auch mit angezeigt. Somit zeigt diese Webseite den kompletten Zustand eines Work Items in einer beliebigen Revision an.

Einschränkungen

Diese Möglichkeit ist keineswegs neu sondern existiert auch schon in früheren TFS Versionen. Jedoch kann man diese Ansicht nicht mit Visual Studio Online benutzen. Dort sieht man folgende Fehlermeldung (siehe Abbildung 3).

Abbildung 3: Fehlermeldung in Visual Studio Online

Abbildung 3: Fehlermeldung in Visual Studio Online

Eine weitere Einschränkung ergibt sich in Bezug auf Berechtigungen. Ob ein Work Item angezeigt werden kann, wird anhand des aktuellen Zustands eines Work Items entschieden. Im oben verwendeten Beispiel aus Abbildung 2 ist der Area Path in der Revision 7 auf “\FabrikamFiber\Development\Database Team” eingestellt. Wenn ein Benutzer auf diesem Area Path keine Berechtigung zur Anzeige des Work Items hat, so kann er auch den historischen Stand der Revision 6 nicht sehen, obwohl der Area Path in der vorherigen Revision noch auf “\FabrikamFiber\Development\Devices Team” stand, wo der Benutzer berechtigt ist (siehe Abbildung 4).

Abbildung 4: Zugriff verweigert

Abbildung 4: Zugriff verweigert

Zusammenfassung

Mit der oben genannten Webseite hat man eine einfache Möglichkeit einen früheren Zustand eines Work Items auf einen Blick zu erfassen. Die Funktionalität liefert der Team Foundation Server out-of-the-box mit, so dass zunächst kein zusätzlicher Aufwand entsteht. Ist man jedoch mit der Art der Darstellung nicht zufrieden oder kann sich mit den Einschränkungen nicht arrangieren, bleibt dann doch wieder der Griff zur API.

Benötigen Sie dabei Unterstützung, sprechen Sie unsere Experten an.

Ein früherer Zustand von Work Items auf einen Blick is a post from: AIT Blog

Sven Hubert: Ideen für die Verwendung des MSDN Azure Freikontingents: Bereitstellung eines Visual Studio Online Build-Servers

Visual Studio Online (VSO) stellt bis auf wenige Ausnahmen (SharePoint Integration, Reporting, Template Anpassung, etc.) die gleichen Funktionen wie ein im lokalen Intranet installierter TFS zur Verfügung. Für MSDN Abonnenten ist dieser Dienst sogar im vollem Funktionsumfang kostenlos. Das Paket enthält neben der Quellcode- und Aufgabenverwaltung dabei unter anderem auch monatlich 60 Server-Minuten, die für Build-Prozesse genutzt werden können.

Die Freiminuten sind schnell verbraucht. Jede weiter Build-Minute wird mit 0,05 $ veranschlagt. Dies summiert sich sehr schnell. In einem kleinen Projekt mit 10 Builds pro Arbeitstagtag a 10 Minuten auf monatlich immerhin rund 60 €. Aus Continuous Integration, was quasi zu einem fortlaufenden Erstellen des Projekts auf dem Server führt, wird dann schnell ein Kostenfaktor. Visual Studio Online sieht die Erweiterbarkeit durch eigene Build -Server vor. Diese können lokal im Unternehmen oder auch unter Windows Azure gehostet werden.

Build Freiminuten

Für die meisten Build-Prozesse ist eine kleine virtuelle Maschine mit 1,7 GB RAM und einem Kern unter Windows Azure völlig ausreichend. Diese Konfiguration schlägt mit rund 50 € pro Monat im 24h-Betrieb zu buche. Theoretisch lassen sich über das Freikontingent damit pro Entwickler bis zu zwei Build-Server hosten. Endlose Build-Queues gehören damit endgültig der Vergangenheit an.

Die Einrichtung gestaltet sich dabei sehr einfach. Für die vollständige Einrichtung benötigt man in etwa eine Stunde.

Im ersten Schritt ist es sinnvoll eine Affinitätsgruppe im Windows Azure Management Portal anzulegen. Dies ermöglicht es, alle Build-Server sowie deren zugeordneten Blob-Speicher, in einem Rechenzentrum zu gruppieren. Ein Datenaustausch untereinander (z. B. beim Einsatz eines TFS-Proxies) sowie die Publizierung eines Cloud Dienstes geht durch die kurzen Wege dann schneller vonstatten.

Erstellung einer Affinitätsgruppe

Die Affinitätsgruppe wird einer Region zugeordnet. Visual Studio Online wird aktuell in Chicago (USA Mitte/Norden) gehostet. Eine Auswahl dieser Region ist in MSDN Accounts leider nicht möglich. Aus diesem Grund empfiehlt es sich die Region zu wählen in der später Cloud Dienste gehostet oder Daten abgelegt werden.

Erstellung einer Affinitätsgruppe

Im nächsten Schritt legt man ein Speicherkonto, an in dem das Image der virtuellen Maschine gespeichert wird.

Erstellung eines Speicherkontos

Dieses kann ebenfalls automatisch beim Erstellen der virtuellen Maschine erzeugt werden. Der manuelle Zwischenschritt ermöglicht die Vergabe eines sprechenden Namens. Dieser muss global eindeutig sein. Die Verwendung des Namens des Unternehmens als Präfix hat sich bewährt. Die zuvor erstellte Affinitätsgruppe wird zugewiesen. Eine lokal redundante Replikation der Daten ist für einen Build-Server völlig ausreichend und damit kostengünstig.

Erstellung eines Speicherkontos

Nun kann die eigentliche Build-Server Instanz erstellt werden.

Erstellung eines virtuellen Computers

Ein vorgefertigtes Template wird dabei aus aus einem Katalog ausgewählt.

Erstellung eines virtuellen Computers

Als Basis für einen Build-Server empfiehlt sich das Template Visual Studio Ultimate 2013 Update 2. In Abhängigkeit der zur Verfügung stehenden MSDN Lizenz entweder in der Ausprägung Professional, Premium oder Ultimate. Die entsprechende Visual Studio Version ist hier bereits vorinstalliert.

Werden für die Build-Prozesse noch ältere Visual Studio Versionen benötigt muss mit einem frischem Windows 7 oder Windows Server 2012 Template gestartet werden.

Erstellung eines virtuellen Computers

Der Name des Build-Servers muss wiederum global eindeutig sein. Der zu vergebende Nutzername und dessen Passwort werden für den späteren Aufbau einer Remote Desktop Verbindung benötigt. Da der Rechner aus dem gesamten Internet erreichbar ist, sollten hier sowohl für den Nutzernamen auch als das Passwort keine trivialen Begriffe verwendet werden.

Erstellung eines virtuellen Computers

Die erstellte Affinitätsgruppe und das Speicherkonto werden entsprechend zugewiesen.

Erstellung eines virtuellen Computers

Die Bereitstellung der virtuellen Maschine dauert in etwa 5 Minuten.

Erstellung eines virtuellen Computers

Danach kann durch einen Klick auf Verbinden eine Remote Desktop Verbindung aufgebaut werden.

Erstellung eines virtuellen Computers

Eine entsprechende RDP-Datei, die die Verbindungsinformation enthält, wird hierzu heruntergeladen und geöffnet.

Verbindung mit dem virtuellen Computer

Auf dem System ist ein Visual Studio 2013 bereits installiert. Ein Build-Server muss nun noch ergänzt werden. Hierzu ruft man auf dem Server die MSDN Subscription Seite auf und wählt am einfachsten den Visual Studio Team Foundation Server 2013 with Update 2 Web Installer aus.

Installation des Build Servers

Nach der Installation, welche in etwa 20 Minuten beansprucht, kann der Build-Server konfiguriert werden.

Installation des Build Servers

Hierzu wird im ersten Schritt die Verbindung zum Visual Studio Online Account hergestellt.

Installation des Build Servers

Ein Login mit einem dem VSO-Account zugeordneten administrativen Account ist hierfür erforderlich.

Installation des Build Servers

Entsprechend der vorhandenen Kerne im System wird eine Anzahl zu konfigurierender Build-Agents vorgeschlagen. Bei einer kleinen Windows Azure Instanz ist dies dementsprechend nur einer.

Installation des Build Servers

Das Konto mit dem der Build-Service auf das Visual Studio Online Konto später im Betrieb zugreifen wird (Account Service), wird automatisch abgerufen. Der Dienst selbst kann unter dem Lokalen System  Konto laufen.

Installation des Build Servers

Nach wenigen Sekunden ist der Build-Service eingerichtet.

Installation des Build Servers

Er steht direkt im Anschluss im Visual Studio in der Build -Definition zur Auswahl zur Verfügung.

Zuordnung des Build-Controllers

Bei Bedarf können nun auf dem Build-Server weitere benötigte Komponenten wie z.B. Style Cop oder Sandcastle installiert werden.

Weitere Build-Server lassen sich nach dem gleichen Schema ergänzen. Eine kleine Visual Studio Online Build-Farm kann damit quasi zum Nulltarif aufgebaut werden. Eine lohnenswerte Verwendung des MSDN Azure Freikontingents.

Ideen für die Verwendung des MSDN Azure Freikontingents: Bereitstellung eines Visual Studio Online Build-Servers is a post from: AIT Blog

ppedv Team Blog: Windows 8.1 Update 2 und Windows 9 – erste Gerüchte

Aktuellen Gerüchten zufolge soll im August 2014 das Update 2 für Windows 8.1 kommen. Dieses soll auch Voraussetzung für ein späteres Upgrade auf Windows 9 sein, liefert wohl aber nicht das erhoffte Startmenü wieder zurück. Dieses wird wohl erst in Windows 9 enthalten sein, welches voraussichtlich im Herbst 2015 final erscheinen soll. Vermutlich wird dann also im Herbst 2014 eine erste Vorabversion (“Preview”) erhältlich sein.

Im neuen Windows 9 kehrt das Startmenü dann wie von vielen Kunden gewünscht zurück – allerdings nur auf Geräten ohne Touchscreen. Hier wird es auch nicht möglich sein, den Startscreen von Windows 8 zu nutzen. Dafür lässt sich das neue Startmenü dann wohl auch vergrößert darstellen und die Modern Style UI Apps laufen dann in der “Desktop-Welt”. Auf Touch-Geräten wird wohl weiterhin das Menü aus Windows 8 enthalten sein.

t1-f9a18ec5da6206e5

(Abb.: So könnte das neue (“alte”) Startmenü in Windows 9 auf Nicht-Touch-Geräten aussehen)

Zeitgleich mit dem Release von Windows 9 wird wohl auch Windows 365 starten – ein neues Modell, bei dem man das Betriebssystem nicht kauft, sondern in einem Abo mietet. Gerüchten zufolge soll Windows 9 für Besitzer von Windows 8.1 kostenlos sein, für den Rest schlägt der reguläre Kauf wohl mit einem Preis von etwa 80€ zu Buche. Hier muss man sehen, was das Abo-Modell im Vergleich kosten wird.

Fabian Deitelhoff: Raspberry Pi: Headless WIFI Konfiguration

Raspberry Pi LogoIch mag den Raspberry Pi. Diese kleine Himbeere, die trotz viel Leistung klein ist und nicht viel Energie benötigt. Mir fallen immer mehr Ideen ein, was sich damit umsetzen lässt. Vor kurzem habe ich einen Artikel zu dem Thema für die Windows.Developer geschrieben.

In der Vergangenheit habe ich sehr häufig eine sogenannte Headless WIFI Konfiguration benötigt. Damit ist gemeint, dass sich der Raspberry Pi mit einem WLAN USB-Stick automatisch in ein vorgegebenes WLAN einbucht. Nicht nur für eine Internetverbindung, sondern hauptsächlich für die initiale Konfiguration. Denn ich möchte nicht immer ein Monitor, Tastatur und Maus anschließen. In diesem Beitrag fasse ich die wenigen Schritte zusammen, die dafür notwendig sind.

Konfiguration

Bei der Konfiguration habe ich es mir einfach gemacht. Ich habe direkt die Datei interfaces editiert. Die konkreten WLAN Daten sollten eher in der Datei wpa_supplicant.conf hinterlegt werden. Das hat bei mir bisher aber nicht geklappt. Ich werde das in Zukunft sicher noch mal testen und im Erfolgsfall diesen Blogpost aktualisieren.

Die hier vorgestellte Konfiguration habe ich mit der Distribution Raspbian getestet, die von der Raspberry Pi Webseite kostenfrei heruntergeladen werden kann. Beim WLAN USB-Stick handelt es sich um den hier:

  • EDIMAX EW-7811UN Wireless USB-Adapter

Die schon angesprochene Datei interfaces liegt im Verzeichnis <sd-karte>/etc/network/. Diese muss editiert werden. Ich mache das mit dem Tool Paragon ExtFS für Windows. Für den Start ist zwar eine Lizenz erforderlich, die ist aber durch eine kostenfreie Registrierung auf der Webseite erhältlich. Dieses Vorgehen finde ich zwar frech, leider habe ich bisher kein anderes Tool beziehungsweise keine anderen Treiber gefunden, mit dem ich Linux-Partitionen auch beschreiben kann. Und genau das ist hier notwendig.

Nach dem Bearbeiten sieht die Datei bei mir wie folgt aus:

auto lo
iface lo inet loopback

iface eth0 inet dhcp

auto wlan0
allow-hotplug wlan0
iface wlan0 inet dhcp
wpa-ssid "<SSID>"
wpa-psk "<Password>"

Die Platzhalter für die SSID und das Passwort müssen entsprechend ausgetauscht werden. Gegenüber der Originaldatei halten sich die Änderungen im Rahmen. Die Änderungen abschließend nur noch speichern, den WLAN USB-Stick einstecken, SD-Karte rein und den Raspberry Pi booten.

Das war es schon. Nach einem kurzem Moment blinkt der WLAN USB-Stick und die Verbindung steht. Welche IP Adresse der Raspberry Pi bekommen hat, muss entweder über den Router oder eine andere Stelle herausgefunden werden. Sind nicht viele Geräte im Netzwerk, funktioniert vielleicht auch das Kommando arp -a, um sich alle IP Adresse der Geräte anzeigen zu lassen. Da hier kein Gerätename angezeigt wird, ist die richtige Zuordnung bei vielen Geräten vermutlich schwer bis unmöglich.

Anschließend kann eine Verbindung über SSH mit dem folgenden Kommando aufgebaut werden:

ssh pi@<IP Adresse>

Das war es auch schon. Nach der Eingabe des Standardpasswortes raspberry steht die Verbindung und das fröhliche Experimentieren kann beginnen.

Fazit

Ich nutze sehr häufig die Headless WIFI Konfiguration. Deutlich häufiger als über ein LAN Kabel. Letzteres ist etwas einfacher, da für diese Verbindung keine Anpassungen notwendig sind. Sofern eine IP Adresse über DHCP vergeben wird.

Für mich überwiegt der Vorteil, mich schnell und unkompliziert über SSH verbinden zu können, ohne Peripherie wie Monitor, Tastatur und Maus anschließen zu müssen.

codefest.at [MS]: Visual Studio 14 CTP 2 verfügbar

Visual Studio “14” CTP 2 wurde gestern am Abend zu Verfügung gestellt. Übrigens (anderes Thema): Kostenlose Anmeldung für Scrum for Managers mit Mitch Lacy steht ebenfalls ab sofort zu Verfügung.

ACHTUNG: Es handelt sich hierbei um eine Preview-Version zum Testen und um Feedback zu geben. Visual Studio “14” CTP eignet sich nicht für den Einsatz in Produktivumgebungen. Am Besten in einer virtuellen Umgebung, eine anderen Maschine oder in Microsoft Azureverwenden.

Ihr könnt die Bits der Visual Studio “14” CTP auf unserer Visual Studio.com Seite herunterladen (bzw. von den MSDN Subscriber Downloads). Die einfachste Variante ist unser Visual Studio “14” CTP Azure Image. Wenn Ihr nicht wisst wie Ihr eure kostenlosen Azure Vorteile einlösen sollt, gebt Bescheid wir helfen gerne.

Zu den bestehenden Features aus der CTP 1 kommen in dieser Release weitere hinzu:

Speicherbare und anpassbare IDE Layouts. Ihr könnt mit der neuen Version benutzerdefinierte Layouts für die Tool-Windows erstellen und auch abspeichern und wieder laden.

Glühlampe – Daniel Düsentrieb lässt grüßen. Fehler im Code? Einfach über den Fehler im Code mit der Maus navigieren oder den Cursor in die entsprechende Zeile stellen und die Glühlampe mit hilfreichen Lösungsansätzen leuchtet auf.

Touch-Support – Ich will das für VS 2013 JETZT. Der neue Visual Studio Editor unterstützt nun endlich Touch! Gestik für für Scrolling, Zooming, Kontextmenü, uvm.

VC++ Eigenschaftenfenster und Verbesserungen im Editor. Mit der neuen Move-Funktionalität lässt sich der Body einer Funktionsdefinition von source zu header/in-class Definition verschieben. Die Funktion “Declaration/Definition erstellen” wurde um Peek Definition erweitert (sobald die Declaration/Definition erstellt wurde wird diese im Peek-Fenster angezeigt). Verbesserte “Find in Files” Funktion in der weitere Ergebnisse an bestehende Suchergebnisse angefügt werden können (“append mode”). Mehr dazu auf dem VC Blog.

Hier findet ihr eine komplette Liste aller neuen Features der Visual Studio “14” CTP2 .

You can find a complete list of new features in the Visual Studio “14” CTP knowledge base article.

Wir sind immer an Feedback interessiert. Bitte postet eure Vorschläge entweder über UserVoiceund meldet Fehler auf unserer Connect site.

Viel Spaß beim Probieren,…

Andreas Pollak
Product Marketing Manager Visual Studio (Entwicklungs- und Testwerkzeuge)
clip_image001

Leader im Magic Quadrant für ALM

Ralf Westphal: Erfolgreich in der Unvorhersagbarkeit, oder: Softwareglück ohne Schätzungen

Bahnfahren erinnert mich an Softwareentwicklung: Regelmäßig werden Versprechen nicht eingehalten. Der ICE von Hamburg nach Wien hat schon beim Start 6 Minuten Verspätung. Daraus werden 10 bis Würzburg. Das sind ca. 5% Verzug und hört sich nicht viel an. Nur verpasse ich dadurch meinen Anschlusszug. Ich muss 45 Minuten warten - und komme mit 60 Minuten Verspätung am Ziel an. Der Gesamtverzug der

Martin Hey: Wo ist eigentlich Temp?

Immer wieder gern verwendet ist der temporäre Ordner, um da Dateien zwischenzuspeichern die später noch gebraucht werden - sei es, um dort Dateioperationen auszuführen, die In-Memory nicht möglich sind oder um Dateien abzulegen, die dann von einem anderen Programm geöffnet werden sollen.


Aber wo ist eigentlich Temp und hab ich da immer Schreibrechte? Die kurze Antwort lautet: a) es hängt von der Umgebung ab und b) ja, dort sind Schreibrechte vorhanden.

Lokale Anwendungen
Lokale Anwendungen, die unter einem Benutzeraccount ausgeführt werden verwenden den Pfad, der in den Pfadangaben des Benutzers als TEMP angegeben ist. Also in der Regel "/AppData/Local/Temp" im Benutzerprofil.

Webseiten im IIS Express
Der IIS Express (also der Entwicklungsserver für z.B. ASP.NET Webseiten) läuft ebenfalls unter dem Benutzeraccount des aktuellen Benutzers und damit landen temporäre Dateien genau wie bei anderen lokalen Anwendungen im TEMP-Ordner des Benutzerprofils.

Webseiten im IIS
Im IIS sieht das Ganze schon etwas anders aus. Hier gibt es auch einen Temp-Ordner. Allerdings wird hier der System-Temp-Ordner verwendet - dieser sollte sich im Standard unter C:\Windows\Temp befinden.

Webseiten im Azure
Auch im Azure gibt es einen temporären Ordner auf dem man Schreibrechte hat. Dieser befindet sich unter "C:\DWASFiles\Sites\<sitename>\Temp".

Noch ein kleiner Hinweis: Der temporäre Ordner ist sehr komfortabel, aber bitte liebe Entwickler räumt dort auch wieder auf und löscht Dateien die ihr erstellt habt und nicht mehr braucht auch wieder.

Klaus Aschenbrenner: SQL Server Quickie #15 – Merge Join Operator

(Be sure to checkout the FREE SQLpassion Performance Tuning Training Plan – you get a weekly email packed with all the essential knowledge you need to know about performance tuning on SQL Server.)

Today I have uploaded the 14th SQL Server Quickie to YouTube. This time I’m talking about the Merge Join Operator in SQL Server. You can find the script used during the demonstration here as a download.

Thanks for watching!

-Klaus

Holger Schwichtenberg: Schwere erste Schritte mit Xamarin

Nur mit einigen manuellen Konfigurationsschritten lässt sich mit der aktuellen Xamarin-Version eine einfache Android-App erstellen. Ein Erfahrungsbericht.

Code-Inside Blog: Microsoft Account Login via ASP.NET Identity

image.png

Der Microsoft Account ist die zentrale Identifikationsstelle in der “Consumer-Microsoft-Welt”, allerdings ist das Einbinden eben dieser in die eigene Applikation eher schwierig. Das “Live SDK” ist nun unter dem OneDrive Dev Center zu finden und ganz professionell wurden auch alle Links zum alten Live SDK damit unbrauchbar gemacht. Beim Microsoft Account ist es auch unmöglich “localhost” als “Redirect”-URL anzugeben – alles Dinge die bei Twitter, Google und Facebook wesentlich einfacher sind. Naja – genug gelästert. Hier ein Weg wie es geht:

1. ASP.NET Anwendung (mit MVC) anlegen

Seitdem neuen Template gibt es auch ein neues Identity System, welches die Nutzung von Facebook, Twitter, Google und eben den Microsoft Account vereinfacht.

image

2. Startup.Auth.cs orten

Wenn man die Auth-Einstellung auf “Individual User Accounts” lässt sollte man unter App_Start auch die “Startup.Auth.cs” finden. Dort muss man nur die entsprechende Zeile auskommentieren und entsprechend bestücken.

image

3. Anwendung im Microsoft Account Dev Center anlegen

image

Im OneDrive Dev Center (ehemals Live Dev Center) kann man unter dem Punkt “Dashboard” seine Anwendungen pflegen. Dies ist so ziemlich dasselbe Vorgehen wie bei Twitter, Facebook und co.

Das Anlegen der Anwendung ist relativ einfach, schwierigster Punkt ist diese Seite:

image

Hier muss man als “Redirect” URL eine richtige URL eintragen – localhost geht nicht. Es gibt ein Workaround über den Dienst “localtest.me”. Hier an der Stelle kann man sich irgendeine URL überlegen und einfach eintragen und am Ende noch “signin-microsoft” eintragen. Ohne dies kommt nur eine seltsame Fehlermeldung (die nur Sichtbar in der URL ist!).

4. ClientId und ClientSecret in der Startup.Auth.cs eintragen

Unter den Basic Information findet man die ClientId und das ClientSecret welches man in der Startup.Auth.cs nachtragen muss.

5. *.localtest.me aktivieren und im Projekt hinterlegen

Für mein Beispiel habe ich “blogpostsample.localtest.me” verwendet und die Idee hinter localtest.me könnt ihr am besten hier nachlesen. Beim NuGet Gallery Projekt dasselbe Verfahren genutzt und daher habe ich auch das Powershell Script  von da genommen. Das Script registriert im IIS Express die URL und danach kann diese URL auch in dem Visual Studio Projekt hinterlegt werden. Das angepasste Powershell Script ist am Ende natürlich auch bei GitHub zu finden. Das Script muss unter einer Admin-PS Shell ausgeführt werden:

image

6. Und läuft…

Nachdem man dies gemacht hat kann man sich anmelden (ich habe in dem Falle schon mein Account mit der Anwendung verknüpft – ansonsten würde nach der Anmeldung kommen “Die Anwendung möchte dies und jenes machen…”).

image

Danach die Anmeldung…

image

Und danach ist man angemeldet – läuft…

Und nun?

Jetzt ist man angemeldet und in der Theorie kann man nun mit dem eigentlichen Live SDK noch weitere Daten abrufen – aber für die pure Authentifizierung reicht das schon mal. Der Blogpost hier in englisch hat mir bei der Redirect-URL weitergeholfen.

Hier gehts zum Source Code auf GitHub.

Martin Hey: Mit dem Service Broker auf Datenänderungen reagieren

Im SQL Server gibt es seit längerem den SQL Server Service Broker. Mit dessen Hilfe kann man live auf Datenänderungen reagieren. Beispiel gefällig?

Ich habe eine sehr einfache Bibliotheksdatenbank. Enthalten ist nur eine Tabelle (dbo.Books) mit den Spalten ID, Author und Title. Und ich habe eine WPF-Anwendung in der in der MainView per Entitiy Framework die Bücher geladen und an die Liste gebunden werden.

<Window x:Class="MyApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <ListBox ItemsSource="{Binding BookList}" >
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Title}"/>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </Grid>
</Window>

public class MainViewModel
{
    public MainViewModel()
    {
        ReloadData();
    }

    private void ReloadData()
    {
        using (var entitites = new LibraryEntities())
        {
            bookList.Clear();
            foreach (var book in entitites.Books)
            {
                bookList.Add(book);   
            }
        }
    }

    private readonly ObservableCollection bookList = new ObservableCollection();

    public ObservableCollection BookList
    {
        get
        {
            return bookList;
        }
    }
}

So weit erst einmal kein Hexenwerk. Der spannende Teil kommt jetzt.

Seit ADO.NET 2.0 gibt es die Klasse SqlDependency, mit der Änderungen an den Daten überwacht werden können. Diese kann für diesen Zweck auch hier verwendet werden.

SqlDependency verfügt über 2 statische Methoden Start und Stop und wie der Name schon vermuten lässt, kann man damit das Tracking starten und auch wieder beenden. In meinem Beispiel sind diese im Konstrukor und im Dispose des ViewModels. Der restliche Code wird in der Reload-Methode angefügt...
public class MainViewModel : IDisposable
{
    private string connectionString;

    public MainViewModel()
    {
        connectionString = new LibraryEntities().Database.Connection.ConnectionString;
        dispatcher = Dispatcher.CurrentDispatcher;
        SqlDependency.Start(connectionString);
        ReloadData();
    }

    private void ReloadData()
    {
        using (var entitites = new LibraryEntities())
        {
            bookList.Clear();
            foreach (var book in entitites.Books)
            {
                bookList.Add(book);   
            }
        }

        using (var connection = new SqlConnection(connectionString))
        {
            connection.Open();
            using (var command = new SqlCommand("SELECT Title, Author FROM dbo.Books", connection))
            {
                command.Notification = null;
                var dependency = new SqlDependency(command);
                dependency.OnChange += OnDependencyChange;
                command.ExecuteReader(CommandBehavior.CloseConnection);
            }
        }
    }

    private void OnDependencyChange(object s, SqlNotificationEventArgs e)
    {
        ((SqlDependency)s).OnChange -= OnDependencyChange;

        if (e.Type == SqlNotificationType.Change)
        {
            dispatcher.Invoke(this.ReloadData);
                
        }
    }

    private readonly ObservableCollection<Books> bookList = new ObservableCollection<Books>();

    private Dispatcher dispatcher;

    public ObservableCollection<Books> BookList
    {
        get
        {
            return bookList;
        }
    }

    public void Dispose()
    {
        SqlDependency.Stop(connectionString);
    }
}

... und hier beginnt es etwas schmutzig zu werden.

SqlDependency basiert auf den Möglichkeiten von ADO.NET 2.0. Damit wird hier eine SqlConnection benötigt und ein SqlCommand, das mit einem DataReader auch ausgeführt werden muss. Und es gibt noch ein paar weitere Punkte zu beachten:
  1. Auf der Datenbank muss der Broker aktiviert sein.
  2. Der Benutzer benötigt ausreichende Berechtigungen (SUBSCRIBE QUERY NOTIFICATIONS)
  3. Der Command bei der Initialisierung der SqlDependency muss bestimmten Voraussetzungen entsprechen (also z.B. nicht SELECT * FROM ....)

Alle diese Einschränkungen kann man ausführlich nochmal auf CodeProject nachlesen.

Während der Ausführung ist es dann wichtig zu wissen, dass der Event ein One-Shot ist - heißt er wird nur bei der ersten Änderung ausgelöst. Deshalb muss dann wenn die Daten neu geladen werden auch der Event wieder registriert werden.

Wenn man das alles berücksichtigt, dann kann man damit aber recht coole Sachen machen. Und man ist nicht auf die WPF beschränkt. Mit der Hilfe von OWIN und SignalR auch weitreichender über Datenänderungen informieren.

codefest.at [MS]: Ups ich habe meine Management Zertifikate gelöscht

imageAs ordnungsliebender Mensch räumt man auch mal die alten Zertifikate auf, die abgelaufen oder nicht mehr verwendet werden. Zumal hier maximal 100 Management Zertifikate in meiner Microsoft Azure Subscription Platz haben. Dabei kann es schon mal passieren, dass man das noch aktuelle Zertifikat weglöscht welches Visual Studio Online braucht, um bei einem queued Build auf Azure Websites zu deployen.

imageStartet man dann den Build auf Visual Studio Online mit der Build-Definition in Visual Studio, schlägt natürlich mit einer netten (403) Forbidden – Fehlermeldung beim Ausführen auf.

Beheben lässt sich die Miesere zum Glück einfach durch das Erneuern des Visual Studio Online Zertifikates unter dem Dashboard der Azure Website.

image

Dieses scheint dann auch wieder bei den Management Zertifikaten auf (Beginnt mit “Tfs-“). Ach ja und die Zertifikate laufen auch nach einem Jahr ab. Also Augen auf Smile.

 

 

 

Andreas Pollak
Product Marketing Manager Visual Studio (Entwicklungs- und Testwerkzeuge)
clip_image001

Leader im Magic Quadrant für ALM

Sven Hubert: "Früher war alles besser" – eine Reise zu längst vergessenen Tagen

Vor kurzem fielen mir meine alten Unterlagen aus Studienzeiten in die Hände. Beim genaueren Hinsehen entdeckte ich kurz hinter einem Wasserfall- und dem Spiralmodell meine Notizen zu "Kapitel 3: Anforderungs- und Projektmanagement". Mit einem amüsierten Lächeln blätterte ich diese Seiten durch und dachte: "Früher war alles einfacher". Meine anhaltende Erheiterung galt dabei der Dokumentation einem meiner ersten Softwareprojekte. Die Semesterarbeit trug den Titel "Medienverwaltung mit integriertem Leihsystem" (MVLS). Damals hatten wir zu viert tagelang die Anforderungen akribisch aufgenommen, nach Wichtigkeit und technischer Machbarkeit sortiert und schließlich unserem Professor zur Korrektur vorgelegt, bevor wir mit dem für einen angehenden Softwareentwickler angenehmeren Teil anfangen durften. Lesen Sie im Artikel, mit welchen Hürden wir vier als Studenten unser Projekt abgeschlossen haben und was wir alle daraus heute noch lernen können.

Lesen Sie hier den vollständigen Artikel zu “Früher war alles besser”.

"Früher war alles besser" – eine Reise zu längst vergessenen Tagen is a post from: AIT Blog

Sven Hubert: Strukturierung einer ASP.NET MVC-Anwendung

Irgendwann werden es zu viele – für große Webanwendungen nach dem MVC-Muster reicht die Strukturierung mittels Controllern häufig nicht aus. Das ASP.NET MVC-Framework bietet daher mit den Areas eine übergeordnete Einheit, mit der sich die Controller in Fachkomponenten gruppieren lassen.

Dieser Beitrag gibt eine kurze Einführung in das Konzept der Areas. Mit dem hier vorgestellten Setup können darüber hinaus die einzelnen Areas in separaten Visual Studio-Projekten entwickelt werden, was sich positiv auf die Quelltextorganisation und Kapselung der Komponenten auswirkt. Zudem wird gezeigt, wie gemeinsam genutzte Elemente in Basiskomponenten angesiedelt werden können.

Areas – Komponentenbildung in der Webanwendung

ASP.NET MVC-Anwendungen lassen sich mithilfe von Areas in Komponenten gliedern. Jedes Area stellt eine separate Instanz der MVC-Struktur dar, welche eigene Controller, Models und Views enthält.

Ein neues Area kann über das Kontextmenü des Webprojekts hinzugefügt werden.

AddArea

Dabei wird ein eigener Ordner für das Area angelegt, dessen Unterordner die MVC-Struktur widerspiegeln.

SolutionExplorer_Area

Zudem enthält jede Area eine Registrierungsklasse (<Name>AreaRegistration), in der Area-spezifische Routen definiert werden können.

AreaRegistration

Das Framework fügt dabei den Namen des Area den DataTokens der Route hinzu. Um auf eine MVC-Action zu verweisen – z.B. zur Generierung eines Action-Links –, wird das gewünschte Area in den Route-Werten mit dem Schlüssel area angegeben. Gehört die referenzierte Action zum aktuellen Area, kann die Angabe weggelassen werden.

ActionLinks

Beim Start der MVC-Anwendung werden die Areas in der Route Table des Frameworks registriert. Die in der Visual Studio-Vorlage verwendete Methode AreaRegistration.RegisterAllAreas() spürt zu diesem Zweck pauschal alle Area-Registrierungsklassen in den referenzierten Assemblies auf.

GlobalAsax

Zu beachten ist, dass sich hierdurch Einschränkungen bei der Definition der Routen ergeben, da die Reihenfolge der Registrierungen auf diese Weise nicht beeinflusst werden kann. Für den ASP.NET Routing-Mechanismus ist nämlich die Reihenfolge, in der die Routen registriert werden, relevant. Je nach Anforderungen an das Routing müssen die Routen daher ggf. stattdessen händisch registriert werden.

Ein Projekt pro Komponente

Nach der Strukturierung der Anwendung selbst soll nun die Visual Studio-Solution entsprechend gegliedert werden: Für jedes Area ist ein separates Projekt vorgesehen. Hierfür werden Class Library-Projekte verwendet, in denen jeweils das NuGet-Paket Microsoft.AspNet.Mvc inklusive Abhängigkeiten installiert wird.

SolutionExplorer_AreaProjects

Ein schöner Nebeneffekt dieser Organisation des Quelltextes ist, dass externe Web-Ressourcen wie jQuery oder Bootstrap nun pro einzelner Komponente per NuGet verwaltet werden können.

Die Auslagerung von Views und Web-Ressourcen aus einem Webprojekt in andere Projekte bringt allerdings generell ein Problem mit sich: es muss sichergestellt werden, dass diese Dateien am korrekten Ort auf dem Webserver ausgeliefert werden. Denn in Webprojekten wird diese Art von Ressourcen nicht in Assemblies eingebettet, sondern die Dateien werden direkt der Webanwendung beigelegt. Schließlich wird der Razor-Code der Views auch erst zur Laufzeit kompiliert.

Die zusätzlichen Dateien in den Area-Projekten werden hierfür mittels xcopy in das Webprojekt kopiert. Wie im folgenden Skript gezeigt, müssen dabei pro Area nur bestimmte Verzeichnisse ausgewählt werden:

Script

Das Skript nimmt den Area-Namen als Argument entgegen und kopiert die Views und Web-Ressourcen aus dem entsprechenden Area-Projekt in das Hauptprojekt.

Über die Projektdatei wird das Skript in den Build-Vorgang eingebunden.

ProjectFile_CopyAreaContentFiles

Lokal im Visual Studio kann die Anwendung somit bereits ausgeführt werden. Zur Auslieferung müssen die Dateien allerdings auch noch in die Content-Item Group des Webprojekts eingetragen werden. Erst damit werden sie im Rahmen des Publish-Target dem Web Deploy- bzw. Cloud Service-Paket hinzugefügt. In der Projektdatei wird eine Wildcard benutzt, um alle Dateien unterhalb des Ordners Areas zu erfassen.

ProjectFile_IncludeAreaContentFiles

Die Wildcard darf während des Build-Vorgangs erst nach dem Kopieren der Dateien ausgewertet werden. Aus diesem Grund wird die CreateItem-Task verwendet, um die Dateien der Item Group hinzuzufügen. Bei direkter Verwendung der Wildcard innerhalb eines ItemGroup-Elements würde sie bereits beim Parsen der Projektdatei ausgewertet – dies hätte schließlich zur Folge, dass die losen Dateien der Areas nicht mit in das Auslieferungspaket gepackt würden.

Keep it DRY – Basiskomponenten für gemeinsame Elemente

Bei der Aufteilung einer Webanwendung in Komponenten werden sich häufig auch gemeinsame Bausteine identifizieren lassen. Hierfür können Basis-Areas gebildet werden, in denen der entsprechende Code sowie die losen Dateien anzusiedeln sind. Im gezeigten Beispiel soll etwa für die beiden Areas FrontDesk und Portal die gleiche Layout-Datei verwendet werden. Der Solution wird hierfür ein weiteres Projekt namens Areas.Common hinzugefügt, welches die gemeinsame _Layout.cshtml enthält.

SolutionExplorer_CommonArea

In den _ViewStart.cshtml-Dateien der beiden spezialisierten Komponenten wird jeweils auf die gemeinsame Layout-Datei der Basiskomponente verwiesen.

ViewStart

Die von der Layout-Datei eingebundenen Web-Ressourcen, wie z.B. Bootstrap, werden nun ausschließlich im Common-Area benötigt. Aus den anderen Projekten können die NuGet-Pakete deinstalliert werden.

NuGet_Bootstrap_with_CommonArea

Da das Common-Area keine eigenen MVC-Actions bereitstellt, benötigt es keine Registrierungsklasse – es nimmt nicht am Routing-Mechanismus des Frameworks teil. Über die Funktion als Klassenbibliothek hinaus dient das Basis-Area lediglich zur Erzeugung einer separaten Ordnerhierarchie für die gemeinsamen Views und Web-Ressourcen.

Strukturierung einer ASP.NET MVC-Anwendung is a post from: AIT Blog

friends header

bloggers headline

links header

 
Don't contact us via this (fleischfalle@alphasierrapapa.com) email address.