.
Anmeldung | Registrieren | Hilfe

.NET-Blogs Archiv Juli 2014

Artikel: Business Apps – Patentrezept für Prozessbeschleunigung?

31.07.2014 13:23:00 | Lars Keller

Zusammen mit Peter Nowak habe ich einen Artikel über Business Apps in der Computerwoche veröffentlicht.

IT-Verantwortliche sehen Business Apps inzwischen häufig als ideale Werkzeuge für schnelle und flexible Geschäftsprozesse. Diesen Anspruch erfüllen standardisiert programmierte Anwendungen allerdings oft nicht. Für den erhofften Erfolg muss eine App spezifisch auf die Unternehmens-IT zugeschnitten sein – genauso wie auf ihre User. Wir zeigen, worauf es im Entwicklungsprozess ankommt.

Den ganzen Artikel findet Ihr hier: http://www.computerwoche.de/a/business-apps-patentrezept-fuer-prozessbeschleunigung,3064460

Viel Spaß beim Lesen!

cim–community in motion Konferenz

31.07.2014 13:16:00 | Lars Keller

Letztes Jahr war es noch die ice-lingen, dieses Jahr im neuen Gewand erwacht die cim – community in motion. Die Anmeldung ist ab heute eröffnet!

Frank Solinske und ich sind wieder dabei und werden etwas zum Thema Mobility erzählen!

Wir sehen uns dort! :-)

Oculus Rift DK2 - unboxing und erster Eindruck

30.07.2014 23:33:00 | Daniel Springwald

Glückliche Überraschung heute: Die 2. Version des Oculus Rift Development Kits war in der Post.

Beim Auspacken, dann gleich eine kleine Enttäuschung: Statt eines schönen Kunststoffkoffers - in welchem die erste Version geliefert wurde - kommt das DK2 in einem Papp-Karton.

Im Karton selbst sieht es dann wieder der ersten Entwicklerversion ähnlich:

Die Linsen wirken etwas größer als beim DK2, dafür ist aber nur eine alternative Sehstärke dabei. Beim DK1 waren es noch zwei.

Neu ist in dieser Version die Erfassung von Kopfbewegungen im Raum (die erste Version konnte nur Drehbewegungen erkennen). Die eine Hälfte meines Kinect-Oculus-Projektes vom letzten Jahr ist damit nun abgelöst worden.

Damit das gelingt, verwendet die Brille nun eine zusätzliche Infrarot-Kamera. In der Rift-Brille sind IR-LEDs versteckt eingebaut, welche von der Kamera erkannt werden. Dadurch kann die Position im Raum ermittelt werden.

Entfallen ist das Adapter-Kästchen, so dass die Kabel jetzt ohne Ballast direkt an den PC angeschlossen werden können.

Den wichtigsten Eindruck kann ich hier im Blog aber natürlich nicht zeigen: Ist das DK2 besser als die vorherige Oculus Rift?

Definitiv! Die Auflösung ist zunächst einmal deutlich besser. Dazu kommt, dass die Kopfbewegungen den Eindruck noch einmal wesentlich realistischer machen. Oculus liefert eine Demo-Szene mit, in welcher man vor einem Schreibtisch sitzt. Durch die Bewegungen kann man die Objekte auf dem Schreibtisch wirklich aus der Nähe und von der Seite betrachten.

Wenn man den Eindruck der ersten Brille schon schlecht beschreiben konnte, sondern besser zeigen musste, toppt die zweite Version die Erfahrung noch einmal deutlich.

Ist Windows Phone wirklich sooo uncool?

28.07.2014 07:51:24 | Mathias Gronau

Ist Ihnen das auch schon einmal aufgefallen? Fast jede Zeitung und Zeitschrift, die etwas auf sich hält, stellt irgendwelche Apps vor. Meist wird vermerkt, dass die Apps für iOS und Android zum Download bereitstehen. Ein Großteil der Apps ist uninteressant, aber ab und an finde ich doch auch mal eine App, die interessant wäre. Aber ohne eine App für Windows Phone kann ich damit nichts anfangen. Gibt es die interessanten Apps wirklich nicht für Windows Phone? Da musste ich einfach einmal nachsehen. Um das Ergebnis schon mal vorwegzunehmen: Die Ergebnisse meiner Versuche waren so furchtbar, dass ich schnell wieder aufgehört habe. Angefangen habe ich mit der Welt Kompakt. Drei Ausgaben hatte ich hier noch liegen, in denen jeweils eine App vorgestellt wurde. Bei allen drei Apps stand, dass sie für iOS und Android verfügbar sind. Ein Besuch im Windows Phone Store brachte schnell ans Licht, dass zwei der Apps auch für Windows Phone verfügbar sind. OK, die Redaktion der Welt Kompakt ist kein großer Freund von Windows Phone und ich bin mir nicht sicher, ob in dieser Zeitung schon einmal eine App für Windows Phone vorgestellt wurde. Im Gegenteil, nur in Ausnahmefällen wird hier überhaupt erwähnt, dass es Windows Phone gibt. Machen wir also weiter. Ich habe hier noch eine Ausgabe der Chip (08/2014) liegen. In der Ausgabe werden 16 Apps vorgestellt. Lt. der Redaktion stehen für iOS 12 Apps, für Android 13 Apps und für Windows Phone nur 5 Apps zur Verfügung. Bei 11 Apps steht ausdrücklich dabei, dass es sie für Windows Phone nicht gibt. Bei einer App (Windows Word für das iPad) würde das auch keinen Sinn machen. Eine kurze Kontrolle im Windows Phone Store ergab aber, dass vier weitere Apps auch für Windows Phone erschienen sind. Damit gibt es zumindest 9 App für das mobile Microsoft-System. So groß ist der Abstand zu iOS bei dieser Stichprobe also nicht. Aber weshalb schreibt Chip, dass es die Apps für Windows Phone nicht gibt? Wird bewusst die Unwahrheit geschrieben oder hat die Redaktion nur nicht sauber recherchiert? Ich weiß es nicht. Aber es kommt noch härter. Mehr durch Zufall war ich auf einer Pressekonferenz der Firma Beurer. Das Unternehmen stellt Gesundheitsprodukte her, die die Messwerte per Bluetooth ans Handy übertragen. So weit, so gut. Was mir aber aufgefallen ist, war die mehrfache Erwähnung, dass es Apps für iOS und Android gibt. Weder auf den PowerPoint-Folien noch mündlich wurde erwähnt, dass es auch Apps für Windows Phone gibt. Auch auf der Website und in der Gebrauchsanleitung des Brustgurtes sucht der geneigte Nutzer vergebens einen Hinweis. Nur auf der Verpackung steht ganz weit unten ein Hinweis, dass es für das Gerät eine App von Microsoft gibt. Will Beurer nicht an Windows Phone-Anwender verkaufen? Ich muss zugeben, dass ich öfter mal genervt war, wenn auf Newsblogs wie www.drwindows.de zwischen interessanten News immer wieder Apps vorgestellt werden. Irgendwie kam bei mir immer wieder die Frage auf, ob es wirklich nichts wirklich Neues gibt, so dass es erforderlich war, den Blog mit App-Vorstellungen aufzufüllen. […]

NuGet as a Package Restorer? No, Thanks ;)

28.07.2014 01:43:03 | Jürgen Gutsch

Wenn ich von NuGet spreche, tue ich das eigentlich mit großer Begeisterung. Generell finde ich es super, wie ich mit NuGet externe Bibliotheken, Werkzeuge und weitere Abhängigkeiten in mein aktuelles Projekt nehmen kann und – ganz wichtig – auch aktuell halten kann. Ich habe selber ein paar Bibliotheken die ich per NuGet verteile. Mit einem eigenen NuGet Server oder einem einfachen Netzwerk Share ist es möglich interne Bibliotheken innerhalb eines größeren Unternehmens zu verteilen.

Aber…

Jetzt kommt das einzige aber große Aber ;)

Das größte und einzige Problem an NuGet ist das automatische “Package Restore”, mit dem es möglich ist, NuGet Packages automatisch per Visual Studio oder direkt per NuGet wieder herstellen oder Updaten zu lassen.

Das übliche Scenario ist ein Build-Server, der vor dem Build alle Pakete lädt und oder aktualisiert. Dadurch ist es nicht mehr nötig Pakete in das Source-Code Repository einzuchecken, wodurch sich die Größe des Repositories erheblich reduzieren kann

Im ersten Moment scheint das ein nützliches Feature zu sein. Plattenplatz sparen UND Abhängigkeiten automatisch auflösen zu lassen. Klasse :)

Wo ist der Haken? Warum sehe ich genau das als Problem?

Wie oben angedeutet, sehe ich NuGet nur als Paket-Verteilungswerkzeug. Mehr nicht. Ich verteile Bibliotheken per NuGet oder lade benötigte Bibliotheken. Mehr nicht. Auch committe ich NuGet Packages in das Source Code Repository.

Warum?

Weil für mich der Grundsatz gilt, dass ich meine Sourcen überall und immer bauen können möchte, ohne von äußeren Einflüssen daran gehindert werden zu können.

Als vor einiger Zeit der offizielle NuGet-Server einige Stunden offline war, schrie die halbe .NET-Entwickler-Welt auf, weil unter anderem keine Packages gefunden werden konnten die wiederhergestellt werden konnten. Build-Server schlugen fehl, weil ohne die Abhängigkeiten nicht gebaut werden konnte.

Alternative NuGet Services, wie z. B. myGet, boten unnötigerweise ihre Diensten an. Ohne eine Lösung für das eigentliche Problem zu liefern.

Fazit

  • Es gibt Unternehmen, in denen ein Server nichts aus dem Internet laden darf.
  • Es gibt instabile Netzwerke, mit Unterbrechungen, etc.
  • NuGet Server die nicht erreichbar sind.
  • Fehlerhafte Packages.

Das dürfen aus meiner Sicht keine Gründe sein für einen Broken-Build. Wenn ein Build fehlschlägt, dann bitte nur wenn Menschen im Spiel sind: Wenn ein Entwickler fehlerhaften Code eincheckt oder ein automatisierter Test aufgrund einer fehlerhaften Implementation nicht durchläuft.

Was bringt mir eine Automatisierung, wenn diese ebenfalls fehlerhaft sein kann?

Aus diesem Grund ist es für mich ein MUSS, dass sowohl der Build selber, als auch alle automatisierten Tests unabhängig von äußeren Einflüssen (außer menschlichen) fehlerfrei durchlaufen kann.

.NET Memory Leaks in 7 einfachen Schritten finden

25.07.2014 08:57:29 | Andre Kraemer

Viele meiner Kunden überrascht es immer wieder wenn Ihnen auffällt, dass ihre Anwendung ein Memory Leak hat, da sie dem weit verbreiteten Irrtum unterliegen, dass es unter .NET dank des Garbage Collectors gar keine Memory Leaks mehr gibt. Auf die Überraschung folgt dann meist Ratlosigkeit, da man nicht so recht weiß, wie man die Ursache für das Speicherproblem denn nun finden soll.

Aus diesem Grund habe ich ein kurzes Video aufgezeichnet, in dem ich die sieben einfachen Schritte zeige, mit denen man ein Memory Leak in einer .NET Anwendung finden kann. Im Beispiel geht es zwar um eine Windows Forms Anwendung, die Vorgehensweise ist jedoch genauso auf eine Web Anwendung mit ASP.NET, einen Windows Service, eine WCF Anwendung oder eine WPF Anwendung übertragbar.

Viel Spaß beim Ansehen. Und natürlich freue ich mich über Kommentare Zwinkerndes Smiley

.NET Memory Leaks in 7 einfachen Schritten finden

25.07.2014 07:57:29 | Andre Kraemer

Viele meiner Kunden überrascht es immer wieder wenn Ihnen auffällt, dass ihre Anwendung ein Memory Leak hat, da sie dem weit verbreiteten Irrtum unterliegen, dass es unter .NET dank des Garbage Collectors gar keine Memory Leaks mehr gibt. Auf die Überraschung folgt dann meist Ratlosigkeit, da man nicht so recht weiß, wie man die Ursache für das Speicherproblem denn nun finden soll. Aus diesem Grund habe ich ein kurzes Video aufgezeichnet, in dem ich die sieben einfachen Schritte zeige, mit dene...

.NET Memory Leaks in 7 einfachen Schritten finden

25.07.2014 07:57:29 | Andre Kraemer

Viele meiner Kunden überrascht es immer wieder wenn Ihnen auffällt, dass ihre Anwendung ein Memory Leak hat, da sie dem weit verbreiteten Irrtum unterliegen, dass es unter .NET dank des Garbage Collectors gar keine Memory Leaks mehr gibt. Auf die Überraschung folgt dann meist Ratlosigkeit, da man nicht so recht weiß, wie man die Ursache für das Speicherproblem denn nun finden soll.

Aus diesem Grund habe ich ein kurzes Video aufgezeichnet, in dem ich die sieben einfachen Schritte zeige, mit denen man ein Memory Leak in einer .NET Anwendung finden kann. Im Beispiel geht es zwar um eine Windows Forms Anwendung, die Vorgehensweise ist jedoch genauso auf eine Web Anwendung mit ASP.NET, einen Windows Service, eine WCF Anwendung oder eine WPF Anwendung übertragbar.

Viel Spaß beim Ansehen. Und natürlich freue ich mich über Kommentare ;-)

Happy Birthday, Office

16.07.2014 16:38:32 | Mathias Gronau

Ohne Office gäbe es kein PowerPoint-Karaoke und keine Scherze über die animierte Büroklammer Clippy. Vor allem wären Arbeit und Leben vieler Menschen weniger produktiv, unübersichtlicher und um viele schöne Erinnerungen ärmer. Vor 25 Jahren – am 1. August 1989 – ging mit Word 4.0, Excel 2.2, PowerPoint 2.01 und Mail 1.37 die allererste Office-Suite, “The Microsoft Office”, auf dem Mac an den Start. Ein Vierteljahrhundert später: Office ist das meistgenutzte Softwarepaket der Welt. Mehr als eine Milliarde Nutzer schreiben in Word, kalkulieren mit Excel, präsentieren in PowerPoint oder managen ihren Alltag mit OneNote, dem digitalen Notizbuch. Zahlreiche Startups, mittelständische Unternehmen und DAX-30-Konzerne vertrauen heute auf die Microsoft Cloud, nutzen Office 365 für vernetztes Arbeiten und beweisen: Office ist bereit für die nächsten 25 Jahre. Kaum ein Wissensarbeiter ohne Office: Im Geschäftsleben stellen die Bestandteile Word, Excel, PowerPoint, Access und Outlook den Standard für die Wissensarbeit im stationären und mobilen Büro dar. Durch den Einsatz im Home Office oder im häuslichen Alltag spielt Office auch im privaten Umfeld vieler Anwender eine Rolle. “Office ist seit Jahren ein emotionaler Teil im Leben vieler Menschen. Daher möchten wir dieses Jubiläum nutzen, um mit den Anwendern auf die vergangenen Jahre zurückzuschauen und einen Blick in die Zukunft der digitalen Wissensarbeit zu werfen”, erklärt Dr. Thorsten Hübschen, Business Group Lead der Microsoft Office Division bei Microsoft Deutschland. Blick zurück: Das erste Office erscheint auf dem MacHallo Welt! Am 1. August 1989 wurde für Mac-Anwender mit Word 4.0, Excel 2.2, PowerPoint 2.01 und Mail 1.37 unter der Bezeichnung “The Microsoft Office” das allererste Paket der inzwischen in Version 15 erschienenen Bürosoftware-Suite geschnürt. Die Premiere auf Windows-Rechnern folgte kurz darauf im Jahr 1990. Das war auch die erste Version, mit der ich gearbeitet habe. Damals kam mir Office wirklich als modern vor, vor allem, weil ich vorher mit Word für DOS gearbeitet habe; heute möchte ich beim besten Willen nicht mehr dorthin zurück.Seitdem ist viel Code den Bildschirm heruntergelaufen und Office wurde umfassend weiterentwickelt. Ein paar jüngere Meilensteine: Im Jahr 2003 wurde eine der erfolgreichsten Office-Versionen aller Zeiten durch neue Anwendungen wie die populäre Notizenverwaltung OneNote ergänzt. Die Folgeversion 2007 mit der neuen Ribbon-Benutzeroberfläche stand vor allem für den Paradigmenwechsel in der Bedienung. Die parallel zu Office 2010 eingeführten WebApps (jetzt Office Online) nahmen mit der Unterstützung des Online-Speichers unter dem jetzigen Titel OneDrive erstmals Kurs Richtung Cloud. 2013 nochmals deutlich verbessert, ist Office gegenwärtig die Referenz für vernetztes Arbeiten – ohne an einen Ort, eine Uhrzeit oder eine Plattform gebunden zu sein. Statt als Datenträger-Paket erhalten Nutzer inzwischen per zeitgemäßem Cloud-Abonnent komfortabel Zugriff auf Office 365 – der aktuellsten Version des Softwarepakets. Und ich muss sagen – gottseidank gibt es keine Datenträger mehr, die ein Jahr vor der Installation zusammengestellt wurden. Nach der Installation war immer ein halber Tag weg mit dem Installieren der seit dem Erscheinen des Softwarepakets Updates. Office heute: Stetiger Begleiter für WissensarbeiterEin Vierteljahrhundert nach seiner Schöpfung erleichtert Office längst nicht mehr allein die Arbeit am Desktop-Computer im stationären Büro. Ebenfalls verfügbar für […]

Fußball, Azure und ASP.NET

15.07.2014 08:07:02 | Jürgen Gutsch

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. ;)

Artikel in der aktuellen dotnetpro

15.07.2014 07:17:00 | Jörg Neumann

In der aktuellen dotnetpro (8/2014) ist ein Artikel von mir erschienen.

Hilfe bei Kabelbruch: Fehler bei der Datenbindung visualisieren
Die Datenbindung der Windows Presentation Foundation arbeitet recht fehlertolerant. Das macht das Auffinden von Fehlern jedoch nicht einfach. dotnetpro zeigt einen pragmatischen Weg, der bei der Fehlersuche hilft.

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

12.07.2014 04:39:02 | Lars Keller

Surface Pro 3 – ein erster Kurztest

09.07.2014 12:50:11 | Mathias Gronau

Auch wenn es das neue Surface Pro 3 in den USA und Kanada bereits zu kaufen gibt, müssen wir in Deutschland noch bis Ende August warten. Ich hatte aber bereits jetzt im Rahmen einer Presseveranstaltung die Möglichkeit, das Gerät kurz zu testen. Bereits auf den ersten Blick fällt auf, dass das Surface 3 mit seinem 12″-Display 1,5 Zoll größer ist als sein Vorgänger. Damit kommt Microsoft meinen Wünschen entgegen. Das Surface 1 und 2 waren doch etwas fummelig, wenn mit der Tastatur gearbeitet wurde. Dass das Surface Pro 3 mit seinen 9,1 mm etwas dünner ist als sein Vorgänger war zu erwarten und ist genauso wenig eine Überraschung wie das geringere Gewicht von jetzt noch 798 g. Aber das Surface Pro 3 hat noch mehr zu bieten. Zunächst nahm ich das Surface in die Hand und sah mir den Kickstand an. Er ist jetzt stufenlos einstellbar und kann bis zu 150° gedreht werden. Damit liegt das Surface fast flach auf dem Tisch und ist nur recht leicht zum Betrachter geneigt. Was auf dem Tisch mit wirklich sinnvoll zu sein scheint, stärkt seinen Zweck, sobald der Benutzer sitzt und mit dem Surface auf dem Schoß Arbeiten mit der Tastatur erledigt. Diese Aufgabe, die mit den früheren Versionen des Surface nicht sinnvoll zu erledigen war, ist jetzt richtig komfortabel. Jetzt würde ich mir nur noch wünschen, dass Microsoft eine Möglichkeit anbieten würde, das Surface auch hochkant zu stellen. Beim Lesen längerer Texte würde ich das als sehr angenehm empfinden, da im Hochformat doch eher das Buchfeeling aufkommt. Sehen wir uns das Äußere des Geräts etwas näher an. Auffällig ist, dass das Windows-Symbol, das uns immer wieder auf die Startseite führt, jetzt nicht mehr unterhalb des Displays platziert ist, sondern auf der rechten Seite. Sinn dieser Platzveränderung ist eine Verbesserung der Tastatur, auf die ich weiter hinten noch eingehen werde. An Schnittstellen sind ein USB 3.0 Port, ein MicroSD-Slot sowie ein Mini-Display-Port vorhanden. Schade, dass es nur ein USB Port ist. Wenn in einem Port ein UMTS-Stick sitzt, ist nicht einmal mehr Platz für einen Speicherstick vorhanden. Aber gut, das ist bei den meisten Nutzern vermutlich nur selten der Fall. Schalten wir das Gerät einmal ein. Aufgrund der Auflösung von 2.160 x 1.440 Pixeln ist der ungeheuer scharf. Microsoft spricht davon, dass die Darstellung “pixelfree” ist. Das ist selbstverständlich Nonsens, die Pixel sind immer noch vorhanden, aber aufgrund der hohen Auflösung mit bloßem Auge halt nicht mehr zu sehen. Verzeihen wir Microsoft also das Marketingsprech. Bei der Bedienung hat mir noch ein Detail besonders gefallen. Befindet sich das Gerät im Stromsparmodus und nähert man sich mit dem Stylus mit gedrücktem Knopf dem Display, wacht das Gerät auf und zeigt eine neue Seite von OneNote, so dass es möglich ist, mal schnell Notizen zu machen, ohne dafür extra das Gerät einzuschalten und sich einzuloggen. Wie sich das Gerät verhält, wenn mehrere Benutzer eingeloggt sind und sich das Gerät im Stromsparmodus befindet, habe ich leider versäumt zu testen. Ich hoffe aber, dass Microsoft mir noch […]

Wo ist eigentlich Temp?

07.07.2014 17:07:00 | Martin Hey

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.

Re-MVPed

07.07.2014 13:04:00 | Jörg Neumann

Mein MVP-Award für den Bereich “Windows Platform Development” wurde wieder um ein Jahr verlängert. Danke Microsoft!
MVPLogoSmall

Mit dem Service Broker auf Datenänderungen reagieren

04.07.2014 15:07:00 | Martin Hey

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.

Welcome to BlogEngine.NET 3.1

03.07.2014 22:22:00 | Daniel Springwald

If you see this post it means that BlogEngine.NET is running and the hard part of creating your own blog is done. There is only a few things left to do.

Write Permissions

To be able to log in, write posts and customize blog, you need to enable write permissions on the App_Data and Custom folders. If your blog is hosted at a hosting provider, you can either log into your account’s admin page or call the support.

If you wish to use a database to store your blog data, we still encourage you to enable this write access for an images you may wish to store for your blog posts.  If you are interested in using Microsoft SQL Server, MySQL, SQL CE, or other databases, please see the BlogEngine docs to get started.

Security

When you've got write permissions set, you need to change the username and password. Find the sign-in link located either at the bottom or top of the page depending on your current theme and click it. Now enter "admin" in both the username and password fields and click the button. You will now see an admin menu appear. It has a link to the "Users" admin page. From there you can change password, create new users and set roles and permissions. Passwords are hashed by default so you better configure email in settings for password recovery to work or learn how to do it manually.

Configuration and Profile

Now that you have your blog secured, take a look through the settings and give your new blog a title.  BlogEngine.NET is set up to take full advantage of many semantic formats and technologies such as FOAF, SIOC and APML. It means that the content stored in your BlogEngine.NET installation will be fully portable and auto-discoverable.  Be sure to fill in your author profile to take better advantage of this.

Themes, Widgets & Extensions

One last thing to consider is customizing the look and behavior of your blog. We have themes, widgets and extensions available right out of the box. You can install more right from admin panel under Custom/Gallery.

On the web

You can find news about BlogEngine.NET on the official website. For tutorials, documentation, tips and tricks visit our docs site. The ongoing development of BlogEngine.NET can be followed at CodePlex where the daily builds will be published for anyone to download.

Good luck and happy writing.

The BlogEngine.NET team

Bedingte Kompilierung im Android Studio

01.07.2014 16:07:00 | Martin Hey

Wer wie ich aus der .NET-Welt kommt, der kennt das Feature der bedingten Kompilierung. Ein klassisches Beispiel dafür ist ein Codeschnipsel wie dieser hier:
var config = new Config();
#if DEBUG
    config.EndPoint = "http://localhost/testendpoint/";
#else
    config.EndPoint = "http://myapp.endpointsoftheworld/";
#endif
    new Wizard().DoSomeMagic(config);
Was passiert hier? Je nach aktueller Buildkonfiguration können Variablen definiert werden. Sind diese gesetzt kann mit Precompiler Switches auf diese Variablen zugegriffen werden und ein bestimmter Teil des Codes wird in die Kompilierung einbezogen oder auch nicht. Die wohl bekannteste dieser Precompiler Variablen ist DEBUG, welche wie der Name schon vermuten lässt im Debug-Build gesetzt ist.

Damit kann man erreichen, dass beispielsweise in Testbuilds anderer Code ausgeführt oder andere Einstellungen verwendet werden oder dass man bestimmte Module in seiner Anwendung zur Verfügung hat oder auch nicht. Als Szenario wäre hier denkbar dass man eine Free- und eine Bezahlvariante seiner Anwendung anbietet.

Genau diese Anwendungsfälle sind auch im Bereich der App-Entwicklung durchaus gängige Szenarien. Allerdings unterstützt Java und damit auch Android solche Preprozessor Direktiven nicht. 

Eine durchaus gängige Lösung ist es, mit anwendungsweiten Konstanten zu arbeiten:
public final class Debug {
  //set to false to allow compiler to identify and eliminate
  //unreachable code
  public static final boolean ON = true;
} 
var config = new Config();
if (Debug.ON) {
    config.EndPoint = "http://localhost/testendpoint/";
} else {
    config.EndPoint = "http://myapp.endpointsoftheworld/";
}
new Wizard().DoSomeMagic(config);
Der Kompiler erkennt die Konstante und im eigentlichen Code ist dann auch nur der Code enthalten, der gewünscht ist. 

Diese Lösung funktioniert zwar und ist auch recht ähnlich zu den Precompiler Switches, hat aber einen entscheidenden Nachteil: Die Konstante muss jedes mal von Hand auf den korrekten Wert gesetzt werden. Ein Automatismus wie bei .NET ist nicht vorgesehen und wie schnell können so Fehler passieren und plötzlich laufen Testcalls gegen die echte API und zerstören Daten.

In Android Studio wird Gradle als Buildssystem verwendet. Damit sind automatisierte Builds möglich. Und genau hier kann man ansetzen, um das Problem zu lösen. Denn Gradle unterstützt Sourcesets und Flavors. "Debug" und "Release" sind bereits mit dem Projektsetup enthalten. Mit diesem Wissen kann man nun einfach neben dem eigentlichen Main-Ordner auf gleicher Ebene zwei neue Ordner an und benennt diese "debug" und "release". Hier kann man nun Packages und Quellcodedateien ablegen, die je nach Buildvariante enthalten sein sollen.


In obiger Konfiguration wird nun die Klasse Configuration aus debug verwendet, wenn ich assembleDebug aufrufe und nach gleicher Logik die gleichnamige Klasse Configuration aus release beim Aufruf von assembleRelease.

Meine Empfehlung ist in Java wie auch in .NET, mit solchen Switches umsichtig umzugehen. Die Komplexität der Anwendung steigt ungemein je mehr solcher Switches verwendet werden und verringern die Wartbarkeit.

Regeln | Impressum